diff --git a/.env.debug b/.env.debug
new file mode 100644
index 0000000000000000000000000000000000000000..946d744e9cab20b31b13c58f9c70f141d991a410
--- /dev/null
+++ b/.env.debug
@@ -0,0 +1,7 @@
+APP_DEBUG = true
+
+[APP]
+DEFAULT_TIMEZONE = Asia/Shanghai
+
+[LANG]
+default_lang = zh-cn
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..45cfa1b6a2eb4964b10032af16ba5b211da3026e
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,11 @@
+/.idea
+/.vscode
+/.gitee
+*.log
+*.env
+*.lock
+*.ini
+/runtime/*
+/public/storage/*
+/public/backup/*
+/app/crud/file/*
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000000000000000000000000000000000000..05dcd6d38a500b294d9888c5383f82b6e898655a
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,4 @@
+[submodule "app/qiye"]
+	url  = https://gitee.com/gougufree/qiye
+	path = app/qiye
+
diff --git a/DISCLAIMER.md b/DISCLAIMER.md
new file mode 100644
index 0000000000000000000000000000000000000000..9ea131b04e93aa623d291bdbca4ceee77865e268
--- /dev/null
+++ b/DISCLAIMER.md
@@ -0,0 +1,14 @@
+# 勾股OA 《免责声明》
+
+> 任何用户在使用由勾股技术开发团队（以下简称「本团队」）研发的开源OA办公系统（以下简称「勾股OA」）前，请您仔细阅读并透彻理解本声明。您可以选择不使用勾股OA ，若您一旦使用勾股OA ，您的使用行为即被视为对本声明全部内容的认可和接受。
+
+1. 勾股OA是一款基于ThinkPHP + Layui + MySql打造的实用的开源的企业办公系统，本软件及所附带的文件是作为不提供任何明确的或隐含的赔偿或担保的形式提供的。
+2. 您是出于自愿而使用勾股OA的，您必须了解使用勾股OA的风险，本团队不承诺提供任何形式的技术支持、使用担保，也不承担任何因使用本软件而产生问题的相关责任。
+3. 您承诺秉着合法、合理的原则使用勾股OA，不利用勾股OA进行任何违法、侵害他人合法利益等恶意的行为，亦不将勾股OA运用于任何违反我国法律法规的Web平台。
+4. 任何单位或个人因下载使用勾股OA而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失 (包括但不限于直接、间接、附带或衍生的损失等)，本团队不承担任何法律责任。
+5. 用户明确并同意本声明条款列举的全部内容，对使用勾股OA可能存在的风险和相关后果将完全由用户自行承担，本团队不承担任何法律责任。
+6. 任何单位或个人在阅读本免责声明后，应在《Apache License 2.0》所允许的范围内进行合法的发布、传播和使用勾股OA等行为，若违反本免责声明条款或违反法律法规所造成的法律责任(包括但不限于民事赔偿和刑事责任），由违约者自行承担。
+7. 本团队对勾股OA拥有知识产权（包括但不限于商标权、专利权、著作权、商业秘密等）。
+8. 任何单位或个人不得在未经本团队书面授权的情况下对勾股OA本身申请相关的知识产权。
+9. 如果本声明的任何部分被认为无效或不可执行，则该部分将被解释为反映本团队的初衷，其余部分仍具有完全效力。不可执行的部分声明，并不构成我们放弃执行该声明的权利。
+10. 本团队有权随时对本声明条款及附件内容进行单方面的变更，并以消息推送、网页公告等方式予以公布，公布后立即自动生效，无需另行单独通知；若您在本声明内容公告变更后继续使用的，表示您已充分阅读、理解并接受修改后的声明内容。
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..94a9ed024d3859793618152ea559a168bbcbb5e2
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c11c5f81be058047807f54fcbd96eea6e70cad2b
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,37 @@
+
+ThinkPHP遵循Apache2开源协议发布，并提供免费使用。
+版权所有Copyright © 2006-2016 by ThinkPHP (http://thinkphp.cn)
+All rights reserved。
+ThinkPHP® 商标和著作权所有者为上海顶想信息科技有限公司。
+
+Apache Licence是著名的非盈利开源组织Apache采用的协议。
+该协议和BSD类似，鼓励代码共享和尊重原作者的著作权，
+允许代码修改，再作为开源或商业软件发布。需要满足
+的条件： 
+1． 需要给代码的用户一份Apache Licence ；
+2． 如果你修改了代码，需要在被修改的文件中说明；
+3． 在延伸的代码中（修改和有源代码衍生的代码中）需要
+带有原来代码中的协议，商标，专利声明和其他原来作者规
+定需要包含的说明；
+4． 如果再发布的产品中包含一个Notice文件，则在Notice文
+件中需要带有本协议内容。你可以在Notice中增加自己的
+许可，但不可以表现为对Apache Licence构成更改。 
+具体的协议参考：http://www.apache.org/licenses/LICENSE-2.0
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+
+勾股OA遵循GPL-2.0开源协议发布，并支持免费使用。
+版权所有Copyright © 2021 by gouguCMS (https://www.gougucms.com)
+All rights reserved。
diff --git a/README.md b/README.md
index e04848ad5d081e2f6802bcff51565c8a1f8ec001..a5e9cd119d95c4c37ae349a2c4facf335561fb5f 100644
--- a/README.md
+++ b/README.md
@@ -1,93 +1,204 @@
-# Office
+## 📐 勾股OA5.0
 
+![勾股OA](https://oa.gougucms.com/storage/image/slogo.jpg)
+
+### ✅ 相关链接
+- 系统地址：https://www.gougucms.com/home/pages/detail/s/gouguoa.html
+- 文档地址：[https://blog.gougucms.com/home/book/detail/bid/3.html](https://blog.gougucms.com/home/book/detail/bid/3.html)
+- 项目会不定时进行更新，建议⭐star⭐和👁️watch👁️一份。
 
+### ⭕ 同系列开源项目
+1. [开源项目系列：勾股OA —— OA协同办公系统](https://gitee.com/gougucms/office)
+2. [开源项目系列：勾股DEV —— 项目研发管理系统](https://gitee.com/gougucms/dev)
+3. [开源项目系列：勾股CMS —— CMS内容管理系统框架](https://gitee.com/gougucms/gougucms)
+4. [开源项目系列：勾股BLOG —— 个人&工作室博客系统](https://gitee.com/gougucms/blog)
+5. [开源项目系列：勾股Admin —— 基于Layui的Web UI解决方案](https://gitee.com/gouguopen/guoguadmin)
+
+
+### 📋 系统介绍
+ **我们的愿景是：助力企业数智化。** 
+
+勾股OA是一款基于ThinkPHP8 + Layui + MySql打造的实用的开源的企业办公系统，开箱即用，使用勾股OA可以简单快速地建立企业级的办公自动化系统。
+办公自动化系统是员工及管理者使用频率最高的应用系统，可以极大提高公司的办公效率，我们立志为中小企业提供开源好用的办公自动化系统，帮助企业节省数字化、信息化办公的成本。
+
+### ✳️ 演示地址
+
+勾股OA演示地址：[https://www.gouguoa.com](https://www.gouguoa.com)
+
+沟通咨询请加微信号：hdm588
+
+PS：为了给后面的人提供良好的演示体验，体验以查看为主，如果确实需要填写数据，大家最好填些看似正常的数据，请不要乱填数据，比如：`1111`，`aaa`这些数据就不要乱填入了。
+
+体验账号及密码：
+~~~
+BOSS角色：suhaizhen     123456
+总 经 理：yiyeshu      123456
+人事总监：fengcailing      123456
+财务总监：yucixin     1234566
+市场总监：qinjiaxian     1234566
+技术总监：yexiaochai     1234566
+销售组长：fujianfenshuo      123456
+销售组长：jianzixianji      123456
+销售组长：shuloulongsu      123456
+客服经理：hongchenxue      123456
+客服人员：guxinglei      123456
+~~~
 
-## Getting started
+### ✴️ 系统特点
+- 系统各功能模块，一目了然，操作简单；通用型的后台权限管理框架，员工的操作记录全覆盖跟踪，紧随潮流、极低门槛、开箱即用。
+- 系统集成了系统设置、人事管理、行政管理、消息管理、企业公告、知识网盘、审批流程设置、办公审批、日常办公、财务管理、客户管理、合同管理、项目管理、任务管理等基础模块。
+- 系统方便二次开发，易于功能扩展，代码维护，满足专注业务深度开发的需求。
+- 开发人员可以快速基于此系统进行二次开发，免去写一次系统架构的痛苦，帮助开发者高效降低开发的成本，通过二次开发之后可以用来做CRM，ERP，项目管理等企业办公系统。
 
-To make it easy for you to get started with GitLab, here's a list of recommended next steps.
+**功能矩阵**
 
-Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)!
+系统后台集成了主流的通用功能，如：登录验证、系统配置、操作日志管理、角色权限、职位职称、数据权限、功能菜单、模块管理、关键字管理、文件上传、数据备份/还原、基础数据、审批流程、员工管理、消息通知、企业公告、知识文章、办公审批、日常办公、财务管理、客户管理、合同管理、项目管理、任务管理等。更多的个性化功能可以基于当前系统便捷做二次开发。
 
-## Add your files
+![输入图片说明](https://oa.gougucms.com/storage/image/gouguoa2.0.png)
 
-- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files
-- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command:
 
-```
-cd existing_repo
-git remote add origin https://git.zsxakj.com/oa1/office.git
-git branch -M main
-git push -uf origin main
-```
+### 📚 安装教程
+
+**一、服务器。**
+
+服务器最低配置：
+~~~
+    1核CPU (建议2核+)
+    2G内存 (建议4G+)
+    1M带宽 (建议3M+)
+~~~
+服务器运行环境要求：
+~~~
+    PHP >= 8.0
+    Mysql >= 5.7.0 (需支持innodb引擎)  
+    Apache 或 Nginx  
+    PDO PHP Extension  
+    MBstring PHP Extension  
+    CURL PHP Extension  
+    FileInfo PHP Extension
+    Composer (用于管理第三方扩展包)
+~~~
+
+**二、系统安装**
+
+**命令行安装（推荐）**
+
+推荐使用命令行安装，因为采用命令行安装的方式可以和勾股OA随时保持更新同步。使用命令行安装请提前准备好`Git`、`Composer`。
+
+**勾股OA的安装步骤，以下加粗的内容需要特别留意：**
+
+第一步：克隆(下载)勾股OA到你本地 **（如果不用git的可以在代码仓库上角打包下载代码，然后解压上传到服务器）** 
+~~~
+    git clone https://gitee.com/gougucms/office.git
+~~~
 
-## Integrate with your tools
+第二步：进入目录
+~~~
+    cd gouguoa（解压后文件所在的根目录）  
+  ~~~  
+第三步：下载PHP依赖包
+~~~
+    composer install  
+ ~~~ 
+ 
+第四步：添加虚拟主机并绑定到项目的`public`目录 ，实际部署中，确保绑定域名访问到的是`public`目录。**（这一步很重要，很多人出错）**
 
-- [ ] [Set up project integrations](https://git.zsxakj.com/oa1/office/-/settings/integrations)
+第五步：伪静态配置 **（这一步也很重要，很多人出错）**，使用的是ThinkPHP的伪静态规则，**具体看下面的伪静态配置内容**。
 
-## Collaborate with your team
+**Nginx**
+修改nginx.conf 配置文件 加入下面的语句。
+~~~
+    location / {
+        if (!-e $request_filename){
+        rewrite  ^(.*)$  /index.php?s=$1  last;   break;
+        }
+    }
+~~~
 
-- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/)
-- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html)
-- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically)
-- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/)
-- [ ] [Set auto-merge](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html)
+**Apache**
+把下面的内容保存为.htaccess文件放到应用入 public 文件的同级目录下。
+~~~
+    <IfModule mod_rewrite.c>
+    Options +FollowSymlinks -Multiviews
+    RewriteEngine On
+    RewriteCond %{REQUEST_FILENAME} !-d
+    RewriteCond %{REQUEST_FILENAME} !-f
+    RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]
+    </IfModule>
+~~~
 
-## Test and Deploy
+第六步：访问 http://www.你的域名.com/install/index 进行安装**（访问主域名，系统会自动跳转到安装连接的）**
+
+⚠️⚠️ **注意：安装过程中，系统会自动创建数据表，请确保填写的数据库用户的权限可创建数据表，请先手动创建空的数据库（比如:gouguoa），然后填写刚刚创建的数据库名称、用户名、密码完成安装。** 
+
+🔺🔺  **提醒：安装过程中，如果进度条卡住，一般都是数据库写入权限或者config无法写入，一般是安装环境配置问题，请注意检查。遇到问题请到QQ群反馈：24641076（群一满），46924914（群二名额紧张），295256660（群三额不多）** 
+
+✅✅ **PS：如需要重新安装，请删除目录里面 config/install.lock 的文件，即可重新安装。**
 
-Use the built-in continuous integration in GitLab.
 
-- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html)
-- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing (SAST)](https://docs.gitlab.com/ee/user/application_security/sast/)
-- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html)
-- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/)
-- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html)
+### ❓ 常见问题
+
+1.  如果是 Composer 安装失败，可能存在php配置文件禁止了`putenv`和`proc_open`函数。解决方法，查找`php.ini`文件位置，打开`php.ini`，搜索`disable_functions`项，看是否禁用了`putenv`和`proc_open`函数。如果在禁用列表里，移除`putenv`、`proc_open`然后退出，重启`php`即可。
+
+2.  如果安装后打开页面提示 `404`错误，请检查服务器伪静态配置，如果是宝塔面板，网站伪静态请配置使用thinkphp规则。
+
+3.  如果提示当前权限不足，无法写入配置文件`config/database.php`，请检查`config`目录是否可写，还有可能是当前安装程序无法访问父目录，请检查PHP的`open_basedir`配置，还有可能是服务器Nginx、Apache的执行者无权限的问题。
+
+4、如果`composer install`失败，可能是国际网络问题，请尝试在命令行进行切换配置到国内源镜像，命令如下：
+
+腾讯云镜像：
+```shell
+composer config -g repos.packagist composer https://mirrors.tencent.com/composer/
+```
+
+阿里云镜像：
+```shell
+composer config -g repos.packagist composer https://mirrors.aliyun.com/composer/
+```
 
-***
+5.  访问 http://www.你的域名.com/install/index 前，请注意查看伪静态请配置是否设置了伪静态规则。
 
-# Editing this README
+6.  出现访问报错一般是服务器环境配置问题
 
-When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thanks to [makeareadme.com](https://www.makeareadme.com/) for this template.
+    比如：伪静态配置，网站的访问入口是否绑定`public`目录，放配置文件的目录是否有可写权限，放缓存的目录是否有可写权限，数据库连接确认无误等。
 
-## Suggestions for a good README
+    开启`debug`的方式请查看链接：https://blog.gougucms.com/home/book/detail/bid/3/id/77.html
 
-Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information.
+    开启`debug`后，看具体的报错信息，然后沿着这些思路去一个个排查基本解决90%的问题。
 
-## Name
-Choose a self-explaining name for your project.
+7.  如果是`composer`的安装，`composer install`报错问题，这不是勾股系列系统的问题，可以百度得到具体解决方案的。
 
-## Description
-Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors.
+8.  安装过程中，如果 **进度条卡住(99%)**，一般都是数据库写入权限或者安装环境配置`config`目录无法写入问题，请注意检查权限。
 
-## Badges
-On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge.
+9.  如果安装成功后，无法显示图形验证码的，请看是否已安装（开启）了PHP的`GD`库。
 
-## Visuals
-Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method.
+10.  如果安装成功后，无法上传文件的，请看是否已安装（开启）了PHP的`fileinfo`扩展。
 
-## Installation
-Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection.
+11.  遇到解决不了的问题请到QQ群反馈：24641076（群一满），46924914（群二名额不多） 。
 
-## Usage
-Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README.
+12. **最后，如果实在安装不成功，确实需要提供安装服务的，请搜索微信号：hdm588，或者QQ号：327725426，添加好友，注意备注[安装勾股系统]。开源不易，该服务需友情赞赏💰99元。**
 
-## Support
-Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc.
+### 🖼️ 截图预览
 
-## Roadmap
-If you have ideas for releases in the future, it is a good idea to list them in the README.
+|页面截图      |    部分截图|
+| :--------: | :--------:|
+| ![功能导图](https://oa.gougucms.com/storage/image/oa4.png "功能导图")|![功能导图](https://oa.gougucms.com/storage/image/oa1.png "功能导图")|
+|![功能导图](https://oa.gougucms.com/storage/image/oa2.png "功能导图")|![功能导图](https://oa.gougucms.com/storage/image/oa3.png "功能导图")|
 
-## Contributing
-State if you are open to contributions and what your requirements are for accepting them.
+### ⭐ 开源助力
 
-For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self.
+- 开源协议：勾股OA遵循Apache License 2.0开源协议发布。
+- 版权声明：要求在软件和相关文档中保留包含原始版权声明等信息。
+- 免责声明：该软件是按现状提供的，没有任何明示或暗示的担保或保证，作者不承担任何赔偿责任。
+- 贡献参与：开源的系统少不了大家的参与，如果大家在体验的过程中发现有问题或者BUG，请到Issue里面反馈，谢谢！
+- 鼓励支持：如果觉得勾股OA不错，不要吝啬您的赞许和鼓励，请给我们⭐ STAR ⭐吧！
 
-You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser.
+### 👍 支持我们
 
-## Authors and acknowledgment
-Show your appreciation to those who have contributed to the project.
+- If the project is very helpful to you, you can buy the author a cup of coffee☕.
+- 如果这个项目对您有帮助，可以请作者喝杯咖啡哟☕
 
-## License
-For open source projects, say how it is licensed.
+|支付宝      |    微信|
+| :--------: | :--------:|
+| <img src="https://www.gougucms.com/static/home/images/zfb.png" width="300"  align=center />|<img src="https://www.gougucms.com/static/home/images/wx.png" width="300"  align=center />|
 
-## Project status
-If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers.
diff --git a/app/adm/common.php b/app/adm/common.php
new file mode 100644
index 0000000000000000000000000000000000000000..328bb5bb2b68b321accc8bfd72a2921cd93923e8
--- /dev/null
+++ b/app/adm/common.php
@@ -0,0 +1,18 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+/**
+======================
+ *模块数据获取公共文件
+======================
+ */
+use think\facade\Db;
\ No newline at end of file
diff --git a/app/adm/controller/Api.php b/app/adm/controller/Api.php
new file mode 100644
index 0000000000000000000000000000000000000000..3fc024bed589e1c89d234f7a07a82a01f5408981
--- /dev/null
+++ b/app/adm/controller/Api.php
@@ -0,0 +1,173 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+namespace app\adm\controller;
+
+use app\api\BaseController;
+use app\adm\model\Property;
+use app\adm\model\Car;
+use think\facade\Db;
+use think\facade\View;
+
+class Api extends BaseController
+{	
+	public function get_propertycate()
+	{
+        $cate = get_base_data('PropertyCate');
+        return to_assign(0, '', $cate);
+    }
+	
+    public function get_propertycate_tree()
+    {
+        $cate = get_base_data('PropertyCate');
+        $list = get_tree($cate, 0, 2);
+        $data['trees'] = $list;
+        return json($data);
+    }
+	//获取资产数据
+	public function get_property()
+    {
+		$param = get_params();
+		$where = array();
+		if (!empty($param['keywords'])) {
+			$where[] = ['p.title', 'like', '%' . $param['keywords'] . '%'];
+		}
+		$where[] = ['p.status', '=', 1];
+        $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$model = new Property();
+		$list = $model->datalist($where, $param);
+		return table_assign(0, '', $list);
+    }
+	
+	//获取车辆信息
+	public function get_car()
+    {
+		$param = get_params();
+		$where = array();
+		if (!empty($param['keywords'])) {
+			$where[] = ['title|name', 'like', '%' . $param['keywords'] . '%'];
+		}
+		$where[] = ['delete_time', '=', 0];
+        $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$model = new Car();
+		$list = $model->datalist($where, $param);
+		return table_assign(0, '', $list);
+    }
+	
+	//获取车辆维修信息
+	public function get_car_repair()
+    {
+		$param = get_params();
+		$where = array();
+		$where[] = ['cr.car_id','=',$param['car_id']];
+		$where[] = ['cr.types','=',1];
+		$where[] = ['cr.delete_time','=',0];
+		$model = new Car();
+		$list = $model->repairlist($where, $param);
+		return table_assign(0, '', $list);
+    }
+	//获取车辆保养信息
+	public function get_car_protect()
+    {
+		$param = get_params();
+		$where = array();
+		$where[] = ['cr.car_id','=',$param['car_id']];
+		$where[] = ['cr.types','=',2];
+		$where[] = ['cr.delete_time','=',0];
+		$model = new Car();
+		$list = $model->repairlist($where, $param);
+		return table_assign(0, '', $list);
+    }
+	
+	//获取车辆费用信息
+	public function get_car_fee()
+    {
+		$param = get_params();
+		$where = array();
+		$where[] = ['cf.car_id','=',$param['car_id']];
+		$where[] = ['cf.delete_time','=',0];
+		$model = new Car();
+		$list = $model->feelist($where, $param);
+		return table_assign(0, '', $list);
+    }
+	
+	//获取车辆费用信息
+	public function get_car_mileage()
+    {
+		$param = get_params();
+		$where = array();
+		$where[] = ['car_id','=',$param['car_id']];
+		$where[] = ['delete_time','=',0];
+		$model = new Car();
+		$list = $model->mileagelist($where, $param);
+		return table_assign(0, '', $list);
+    }
+	
+	//获取会议室
+    public function get_meeting_room()
+    {
+		$list = Db::name('MeetingRoom')->where('status',1)->paginate(['list_rows'=> 20]);
+        return table_assign(0, '', $list);
+    }
+	
+	//获取审核类型
+    public function get_flow_item()
+    {
+        $param = get_params();
+		$flows = Db::name('FlowItem')->where(['flow_cate'=>$param['cate'],'status'=>1])->select()->toArray();
+		return to_assign(0, '', $flows);
+	} 
+
+	//修改公章状态
+    public function set_seal_status()
+    {
+		$param = get_params();
+		$res = Db::name('Seal')->where(['id'=>$param['id']])->update(['status'=>$param['status']]);
+		if($res!==false){
+			return to_assign();
+		}
+		else{
+			return to_assign(1, '操作失败');
+		}
+	} 
+
+	//测试demo
+	public function work_flow()
+    {
+		return view('/flow/work_flow');
+	}
+	
+    public function table()
+    {
+        $param = get_params();
+		$prefix = config('database.connections.mysql.prefix');
+		//查询指定表信息
+        $table_info = Db::query('SHOW TABLE STATUS LIKE ' . "'" .$prefix.$param['name'] . "'");
+		if(empty($table_info)){
+			return view(EEEOR_REPORTING,['code'=>406,'warning'=>'找不到该数据表']);
+		}
+		$table_columns = Db::query("SHOW FULL COLUMNS FROM " .$prefix.$param['name']);
+		$columns=[];
+		foreach($table_columns as $key=>$val) {
+			if (strpos($val['Type'], 'int') !== false || strpos($val['Type'], 'decimal') !== false) {
+				$columns[]=$val;
+			}
+		}
+		//var_dump($table_info);exit;
+		//dd($table_columns);exit;
+		View::assign('id', 0);
+		View::assign('columns', $columns);
+		return view('/flow/table');
+    }
+}
diff --git a/app/adm/controller/Basic.php b/app/adm/controller/Basic.php
new file mode 100644
index 0000000000000000000000000000000000000000..f6f2116dbe9972d41f6a53afc60e71ca4f20bd7b
--- /dev/null
+++ b/app/adm/controller/Basic.php
@@ -0,0 +1,93 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\adm\controller;
+
+use app\base\BaseController;
+use app\adm\validate\BasicAdmCheck;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Basic extends BaseController
+{	
+	public function datalist()
+    {
+        if (request()->isAjax()) {
+			$param = get_params();
+			$where=[];
+			if (!empty($param['types'])) {
+                $where[] = ['types', '=', $param['types']];
+            }
+            $list = Db::name('BasicAdm')->where($where)->order('create_time asc')->select();
+            return to_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+    //新建编辑
+    public function add()
+    {
+        if (request()->isAjax()) {
+            $param = get_params();
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(BasicAdmCheck::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['update_time'] = time();
+                $res = Db::name('BasicAdm')->strict(false)->field('title,types,id,update_time')->update($param);
+                if ($res) {
+                    add_log('edit', $param['id'], $param);
+                }
+                return to_assign();
+            } else {
+                try {
+                    validate(BasicAdmCheck::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['create_time'] = time();
+                $insertId = Db::name('BasicAdm')->strict(false)->field('title,types,id,create_time')->insertGetId($param);
+                if ($insertId) {
+                    add_log('add', $insertId, $param);
+                }
+                return to_assign();
+            }
+        }
+    }
+	
+    //设置
+    public function set()
+    {
+		$param = get_params();
+        $res = Db::name('BasicAdm')->strict(false)->field('id,status')->update($param);
+		if ($res) {
+			if($param['status'] == 0){
+				add_log('disable', $param['id'], $param);
+			}
+			else if($param['status'] == 1){
+				add_log('recovery', $param['id'], $param);
+			}
+			return to_assign();
+		}
+		else{
+			return to_assign(0, '操作失败');
+		}
+    }   
+}
diff --git a/app/adm/controller/Car.php b/app/adm/controller/Car.php
new file mode 100644
index 0000000000000000000000000000000000000000..bfc4d0604aeb0731a101df0c9d67beaacb495b12
--- /dev/null
+++ b/app/adm/controller/Car.php
@@ -0,0 +1,501 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\adm\controller;
+
+use app\base\BaseController;
+use app\adm\model\Car as CarModel;
+use app\adm\validate\CarValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Car extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new CarModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			$where=[];
+			$where[]=['delete_time','=',0];
+            if (!empty($param['keywords'])) {
+                $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%'];
+            }
+            $list = $this->model->datalist($where, $param);
+            return table_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {
+			if (isset($param['insure_time'])) {
+                $param['insure_time'] = strtotime($param['insure_time']);
+            }
+			if (isset($param['review_time'])) {
+                $param['review_time'] = strtotime($param['review_time']);
+            }	
+			if (isset($param['buy_time'])) {
+                $param['buy_time'] = strtotime($param['buy_time']);
+            }			
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(CarValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(CarValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				if(!empty($detail['file_ids'])){
+					$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+					$detail['file_array'] = $file_array;
+				}
+				if($detail['driver']>0){
+					$detail['driver_name'] = Db::name('Admin')->where('id','=',$detail['driver'])->value('name');
+				}
+                View::assign('detail', $detail);
+				return view('edit');
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			if(!empty($detail['file_ids'])){
+				$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+				$detail['file_array'] = $file_array;
+			}
+			if($detail['driver']>0){
+				$detail['driver_name'] = Db::name('Admin')->where('id','=',$detail['driver'])->value('name');
+			}
+			$latestMileage = Db::name('CarMileage')->where(['car_id'=>$detail['id'],'delete_time'=>0])->max('mileage');
+			if(empty($latestMileage)){
+				$latestMileage = $detail['mileage'];
+			}
+			$detail['latestMileage'] = $latestMileage;
+			View::assign('detail', $detail);
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		$param = get_params();
+		$id = isset($param['id']) ? $param['id'] : 0;
+		if (request()->isDelete()) {
+			$this->model->delById($id);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }  
+	
+	//维修记录列表
+    public function repair_list()
+    {
+        if (request()->isAjax()) {
+			$param = get_params();
+			$where = [];
+			if (!empty($param['keywords'])) {
+                $where[] = ['c.title', 'like', '%' . $param['keywords'] . '%'];
+            }
+			if (!empty($param['diff_time'])) {
+				$diff_time =explode('~', $param['diff_time']);
+                $where[] = ['cr.repair_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1]))]];
+            }
+			$where[] = ['cr.types','=',1];
+			$where[] = ['cr.delete_time','=',0];
+            $model = new Car();
+			$list = $this->model->repairlist($where, $param);
+            return table_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+	
+    //维修记录添加&编辑
+    public function repair_add()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+			if (isset($param['repair_time'])) {
+                $param['repair_time'] = strtotime($param['repair_time']);
+            }
+            if (!empty($param['id']) && $param['id'] > 0) {
+                $param['update_time'] = time();
+				$res = Db::name('CarRepair')->strict(false)->field(true)->update($param);
+				if($res){
+					add_log('edit', $param['id'], $param);
+					return to_assign();
+				}
+            } else {
+                $param['create_time'] = time();
+                $insertId = Db::name('CarRepair')->strict(false)->field(true)->insertGetId($param);
+                if ($insertId) {
+                    add_log('add', $insertId, $param);
+                }
+                return to_assign();
+            }
+        } else {
+            $id = isset($param['id']) ? $param['id'] : 0;
+            $cid = isset($param['cid']) ? $param['cid'] : 0;
+            if ($id > 0) {
+                $detail = Db::name('CarRepair')->where(['id' => $id])->find();
+                $detail['handled_name'] = Db::name('Admin')->where('id',$detail['handled'])->value('name');
+                $detail['car'] = Db::name('Car')->where('id',$detail['car_id'])->value('title');
+				if($detail['file_ids'] !=''){
+					$fileArray = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+					$detail['fileArray'] = $fileArray;
+				}
+                View::assign('detail', $detail);
+				return view('repair_edit');
+            }
+			if($cid>0){
+				View::assign('car', $this->model->getById($cid));
+			}
+            View::assign('cid', $cid);
+            View::assign('id', $id);
+            return view();
+        }
+    }
+	
+    //维修记录查看
+    public function repair_view()
+    {
+        $param = get_params();
+        $id = isset($param['id']) ? $param['id'] : 0;
+		$detail = Db::name('CarRepair')->where(['id' => $id])->find();
+		$detail['handled_name'] = Db::name('Admin')->where('id',$detail['handled'])->value('name');
+        $detail['car'] = Db::name('Car')->where('id',$detail['car_id'])->value('title');
+		if($detail['file_ids'] !=''){
+			$fileArray = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+			$detail['fileArray'] = $fileArray;
+		}
+		View::assign('detail', $detail);
+        return view();
+    }
+	
+     //维修记录删除
+    public function repair_del()
+    {
+		$param = get_params();
+        $res = Db::name('CarRepair')->where('id',$param['id'])->update(['delete_time'=>time()]);
+		if ($res) {
+			add_log('delete', $param['id'], $param);
+			return to_assign();
+		}
+		else{
+			return to_assign(0, '操作失败');
+		}
+    }  
+	
+	
+	//保养记录列表
+    public function protect_list()
+    {
+        if (request()->isAjax()) {
+			$param = get_params();
+			$where = [];
+			if (!empty($param['keywords'])) {
+                $where[] = ['c.title', 'like', '%' . $param['keywords'] . '%'];
+            }
+			if (!empty($param['diff_time'])) {
+				$diff_time =explode('~', $param['diff_time']);
+                $where[] = ['cr.repair_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1]))]];
+            }
+			$where[] = ['cr.types','=',2];
+			$where[] = ['cr.delete_time','=',0];
+			$list = $this->model->repairlist($where, $param);
+            return table_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+	
+    //保养记录添加&编辑
+    public function protect_add()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+			if (isset($param['repair_time'])) {
+                $param['repair_time'] = strtotime($param['repair_time']);
+            }
+            if (!empty($param['id']) && $param['id'] > 0) {
+                $param['update_time'] = time();
+				$res = Db::name('CarRepair')->strict(false)->field(true)->update($param);
+				if($res){
+					add_log('edit', $param['id'], $param);
+					return to_assign();
+				}
+            } else {
+                $param['create_time'] = time();
+                $param['types'] = 2;
+                $insertId = Db::name('CarRepair')->strict(false)->field(true)->insertGetId($param);
+                if ($insertId) {
+                    add_log('add', $insertId, $param);
+                }
+                return to_assign();
+            }
+        } else {
+            $id = isset($param['id']) ? $param['id'] : 0;
+            $cid = isset($param['cid']) ? $param['cid'] : 0;
+            if ($id > 0) {
+                $detail = Db::name('CarRepair')->where(['id' => $id])->find();
+                $detail['handled_name'] = Db::name('Admin')->where('id',$detail['handled'])->value('name');
+                $detail['car'] = Db::name('Car')->where('id',$detail['car_id'])->value('title');
+				if($detail['file_ids'] !=''){
+					$fileArray = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+					$detail['fileArray'] = $fileArray;
+				}
+                View::assign('detail', $detail);
+				return view('protect_edit');
+            }
+			if($cid>0){
+				View::assign('car', $this->model->getById($cid));
+			}
+            View::assign('cid', $cid);
+            View::assign('id', $id);
+            return view();
+        }
+    }
+	
+    //保养记录查看
+    public function protect_view()
+    {
+        $param = get_params();
+        $id = isset($param['id']) ? $param['id'] : 0;
+		$detail = Db::name('CarRepair')->where(['id' => $id])->find();
+		$detail['handled_name'] = Db::name('Admin')->where('id',$detail['handled'])->value('name');
+        $detail['car'] = Db::name('Car')->where('id',$detail['car_id'])->value('title');
+		if($detail['file_ids'] !=''){
+			$fileArray = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+			$detail['fileArray'] = $fileArray;
+		}
+		View::assign('detail', $detail);
+        return view();
+    }
+	
+     //保养记录删除
+    public function protect_del()
+    {
+		$param = get_params();
+        $res = Db::name('CarRepair')->where('id',$param['id'])->update(['delete_time'=>time()]);
+		if ($res) {
+			add_log('delete', $param['id'], $param);
+			return to_assign();
+		}
+		else{
+			return to_assign(0, '操作失败');
+		}
+    }  
+	
+	//费用记录列表
+    public function fee_list()
+    {
+        if (request()->isAjax()) {
+			$param = get_params();
+			$where = [];
+			if (!empty($param['keywords'])) {
+                $where[] = ['cf.title|c.title', 'like', '%' . $param['keywords'] . '%'];
+            }
+			if (!empty($param['diff_time'])) {
+				$diff_time =explode('~', $param['diff_time']);
+                $where[] = ['cf.fee_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1]))]];
+            }
+			if (!empty($param['types'])) {
+                $where[] = ['cf.types','=',$param['types']];
+            }
+			$where[] = ['cf.delete_time','=',0];
+			$list = $this->model->feelist($where, $param);
+            return table_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+	
+    //费用记录添加&编辑
+    public function fee_add()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+			if (isset($param['fee_time'])) {
+                $param['fee_time'] = strtotime($param['fee_time']);
+            }
+            if (!empty($param['id']) && $param['id'] > 0) {
+                $param['update_time'] = time();
+				$res = Db::name('CarFee')->strict(false)->field(true)->update($param);
+				if($res){
+					add_log('edit', $param['id'], $param);
+					return to_assign();
+				}
+            } else {
+                $param['create_time'] = time();
+                $insertId = Db::name('CarFee')->strict(false)->field(true)->insertGetId($param);
+                if ($insertId) {
+                    add_log('add', $insertId, $param);
+                }
+                return to_assign();
+            }
+        } else {
+            $id = isset($param['id']) ? $param['id'] : 0;
+            $cid = isset($param['cid']) ? $param['cid'] : 0;
+            if ($id > 0) {
+                $detail = Db::name('CarFee')->where(['id' => $id])->find();
+                $detail['handled_name'] = Db::name('Admin')->where('id',$detail['handled'])->value('name');
+                $detail['car'] = Db::name('Car')->where('id',$detail['car_id'])->value('title');
+				if($detail['file_ids'] !=''){
+					$fileArray = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+					$detail['fileArray'] = $fileArray;
+				}
+                View::assign('detail', $detail);
+				return view('fee_edit');
+            }
+			if($cid>0){
+				View::assign('car', $this->model->getById($cid));
+			}
+            View::assign('cid', $cid);
+            View::assign('id', $id);
+            return view();
+        }
+    }
+	
+    //费用记录查看
+    public function fee_view()
+    {
+        $param = get_params();
+        $id = isset($param['id']) ? $param['id'] : 0;
+		$detail = Db::name('CarFee')->where(['id' => $id])->find();
+		$detail['handled_name'] = Db::name('Admin')->where('id',$detail['handled'])->value('name');
+        $detail['car'] = Db::name('Car')->where('id',$detail['car_id'])->value('title');
+        $detail['types_str'] = Db::name('basicAdm')->where('id',$detail['types'])->value('title');
+		if($detail['file_ids'] !=''){
+			$fileArray = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+			$detail['fileArray'] = $fileArray;
+		}
+		View::assign('detail', $detail);
+        return view();
+    }
+	
+    //费用记录删除
+    public function fee_del()
+    {
+		$param = get_params();
+        $res = Db::name('CarFee')->where('id',$param['id'])->update(['delete_time'=>time()]);
+		if ($res) {
+			add_log('delete', $param['id'], $param);
+			return to_assign();
+		}
+		else{
+			return to_assign(0, '操作失败');
+		}
+    }  
+	
+	//获取里程数记录
+	public function mileage_list()
+    {
+        $param = get_params();
+		$where = array();
+		$where[] = ['car_id', '=', $param['car_id']];
+		$where[] = ['delete_time', '=', 0];
+		$this->model->mileagelist($where, $param);
+        table_assign(0, '', $list);
+    }
+	
+	//增加里程数记录
+	public function mileage_add()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+			if (isset($param['mileage_time'])) {
+                $param['mileage_time'] = strtotime($param['mileage_time']);
+            }
+			$latestMileage = Db::name('CarMileage')->where([['id','<>',$param['id']],['delete_time','=',0]])->order('mileage_time', 'desc')->value('mileage');
+			$mileage = Db::name('Car')->where('id',$param['car_id'])->value('mileage');
+			if(empty($latestMileage)){
+				$latestMileage = $mileage;
+			}
+			if($param['mileage'] < $latestMileage){
+				 return to_assign(1,'新增的里程数，不能小于现有里程数');
+			}
+            if (!empty($param['id']) && $param['id'] > 0) {
+                $param['update_time'] = time();
+                $res = Db::name('CarMileage')->strict(false)->field(true)->update($param);
+                return to_assign();
+            } else {
+                $param['create_time'] = time();
+                $param['admin_id'] = $this->uid;
+                $insertId = Db::name('CarMileage')->strict(false)->field(true)->insertGetId($param);
+                return to_assign();
+            }
+        }
+    }
+	
+    //里程数记录删除
+    public function mileage_del()
+    {
+		$param = get_params();
+        $res = Db::name('CarMileage')->where('id',$param['id'])->update(['delete_time'=>time()]);
+		if ($res) {
+			return to_assign();
+		}
+		else{
+			return to_assign(1, '操作失败');
+		}
+    }  
+}
diff --git a/app/adm/controller/Flow.php b/app/adm/controller/Flow.php
new file mode 100644
index 0000000000000000000000000000000000000000..a89f66dfcf157d896dd734df528a15c3ce5097d4
--- /dev/null
+++ b/app/adm/controller/Flow.php
@@ -0,0 +1,353 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\adm\controller;
+
+use app\base\BaseController;
+use app\adm\validate\FlowCateCheck;
+use app\adm\validate\FlowCheck;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Flow extends BaseController
+{	
+
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+			$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+			$list = Db::name('Flow')
+				->field('f.*,fc.title as cate,fm.title as module')
+				->alias('f')
+                ->join('FlowCate fc', 'fc.id = f.cate_id', 'left')
+                ->join('FlowModule fm', 'fm.id = fc.module_id', 'left')
+				->order('id desc')->paginate(['list_rows'=> $rows])
+				->each(function($item, $key){
+					if(!empty($item['department_ids'])){
+						$item['departments']=get_department_name($item['department_ids']);
+					}
+					else{
+						$item['departments']='全部';
+					}
+					if(!empty($item['copy_uids'])){
+						$copy_unames=Db::name('Admin')->where([['status','=',1],['id','in',$item['copy_uids']]])->column('name');
+						$item['copy_unames']=implode(',',$copy_unames);
+					}
+					else{
+						$item['copy_unames']='-';
+					}
+					return $item;
+				});
+            return table_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+
+    //添加新增/编辑
+    public function add()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+			$param['flow_list'] = '';
+			$flow_list=[];
+			//固定审批流
+			if($param['check_type']==2){
+				$roleData = isset($param['check_role']) ? $param['check_role'] : '';
+				$positionIdData = isset($param['check_position_id']) ? $param['check_position_id'] : '';
+				$checkUidsData = isset($param['check_uids_a']) ? $param['check_uids_a'] : '';
+				$checkTypesData = isset($param['check_types']) ? $param['check_types'] : '';
+				foreach ($roleData as $key => $value) {
+					if (!$value) {
+						continue;
+					}
+					if($value==3 && $positionIdData[$key]==''){
+						return to_assign(1, '第'.($key+1).'行的指定岗位职称未选择');
+						break;
+					}
+					if($value>3 && $checkUidsData[$key]==''){
+						return to_assign(1, '第'.($key+1).'行的指定人未选择');
+						break;
+					}
+					$item = [];
+					$item['check_role'] = $value;
+					$item['check_position_id'] = $positionIdData[$key];
+					$item['check_uids'] = $checkUidsData[$key];
+					$item['check_types'] = $checkTypesData[$key];
+					$flow_list[]=$item;	
+				}
+				$param['flow_list'] = serialize($flow_list);
+			}
+			//可回退审批流
+			if($param['check_type']==3){
+				$flowNameData = isset($param['flow_name']) ? $param['flow_name'] : '';
+				$checkUidsData = isset($param['check_uids_b']) ? $param['check_uids_b'] : '';
+				foreach ($flowNameData as $key => $value) {
+					if (!$value) {
+						continue;
+					}
+					if($checkUidsData[$key]==''){
+						return to_assign(1, '第'.($key+1).'行的指定人未选择');
+						break;
+					}
+					$item = [];
+					$item['check_role'] = 5;
+					$item['flow_name'] = $value;
+					$item['check_uids'] = $checkUidsData[$key];
+					$flow_list[]=$item;	
+				}
+				if(empty($flow_list)){
+					return to_assign(1, '审批流程信息未完善');
+				}
+				$param['flow_list'] = serialize($flow_list);
+			}
+			
+            if ($param['id'] > 0) {
+                try {
+                    validate(FlowCheck::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['update_time'] = time();
+                Db::name('Flow')->strict(false)->field(true)->update($param);
+                add_log('edit', $param['id'], $param);
+            } else {
+                try {
+                    validate(FlowCheck::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['admin_id'] = $this->uid;
+                $param['create_time'] = time();
+                $mid = Db::name('Flow')->strict(false)->field(true)->insertGetId($param);
+                add_log('add', $mid, $param);
+            }
+            return to_assign();
+        } else {
+            $id = isset($param['id']) ? $param['id'] : 0;
+            $check_type = 1;
+            if($id>0){
+                $detail = Db::name('Flow')->where('id',$id)->find();
+                $flow_list = unserialize($detail['flow_list']);
+				if(!empty($flow_list)){
+					foreach ($flow_list as $key => &$val) {
+						$val['check_unames'] ='';
+						$val['check_position_title'] ='';
+						if($val['check_role']==3){
+							$val['check_position_title'] = Db::name('Position')->where('id', '=', $val['check_position_id'])->value('title');
+						}
+						if($val['check_role']>3){
+							$check_unames = Db::name('Admin')->where('id', 'in', $val['check_uids'])->column('name');
+							$val['check_unames'] = implode(',', $check_unames);
+						}
+					}
+				}
+				$detail['flow_list'] = $flow_list;
+				$detail['copy_unames'] ='';
+				if($detail['copy_uids']!=''){
+					$copy_unames = Db::name('Admin')->where('id', 'in', $detail['copy_uids'])->column('name');
+					$detail['copy_unames'] = implode(',', $copy_unames);
+				}
+				$check_type = $detail['check_type'];
+				//var_dump($flow_list);exit;
+                View::assign('detail', $detail);
+            }
+            View::assign('check_type', $check_type);
+            View::assign('id', $id);
+            return view();
+        }
+    }
+
+    //禁用/启用
+    public function check()
+    {
+        $param = get_params();
+		$param['update_time']= time();
+		$res = Db::name('Flow')->strict(false)->field('status,update_time')->update($param);
+		if($res!==false){
+			if($param['status'] == 0){
+				add_log('disable', $param['id'], $param);
+			}
+			else if($param['status'] == 1){
+				add_log('recovery', $param['id'], $param);
+			}
+			return to_assign();
+		}
+		else{
+			return to_assign(1,'操作失败');
+		}
+    }
+	//审批模块
+    public function modulelist()
+    {
+        if (request()->isAjax()) {
+			$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+			$list = Db::name('FlowModule')
+				->order('sort desc,id desc')
+				->paginate(['list_rows'=> $rows]);
+            return table_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+    //添加模块
+    public function module_add()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+            if (!empty($param['id']) && $param['id'] > 0) {
+                $param['update_time'] = time();
+                $res = Db::name('FlowModule')->strict(false)->field(true)->update($param);
+                if ($res) {
+                    add_log('edit', $param['id'], $param);
+                }
+                return to_assign();
+            } else {
+                $param['create_time'] = time();
+                $insertId = Db::name('FlowModule')->strict(false)->field(true)->insertGetId($param);
+                if ($insertId) {
+                    add_log('add', $insertId, $param);
+                }
+                return to_assign();
+            }
+        }else {
+            $id = isset($param['id']) ? $param['id'] : 0;
+            if ($id > 0) {
+                $detail = Db::name('FlowModule')->find($id);
+                View::assign('detail', $detail);
+            }
+            View::assign('id', $id);
+            return view();
+        }
+    }
+	
+    //设置
+    public function module_check()
+    {
+		$param = get_params();
+        $res = Db::name('FlowModule')->strict(false)->field('id,status')->update($param);
+		if ($res) {
+			if($param['status'] == 0){
+				add_log('disable', $param['id'], $param);
+			}
+			else if($param['status'] == 1){
+				add_log('recovery', $param['id'], $param);
+			}
+			return to_assign();
+		}
+		else{
+			return to_assign(0, '操作失败');
+		}
+    }   
+	
+	//审批类型列表
+    public function catelist()
+    {
+        if (request()->isAjax()) {
+			$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+			$list = Db::name('FlowCate')
+				->field('fc.*,fm.title as module')
+				->alias('fc')
+				->join('FlowModule fm', 'fm.id = fc.module_id', 'left')
+				->order('fc.sort desc,fc.id desc')
+				->paginate(['list_rows'=> $rows])
+				->each(function($item, $key){
+					if(!empty($item['department_ids'])){
+						$item['departments']=get_department_name($item['department_ids']);
+					}
+					else{
+						$item['departments']='全部';
+					}
+					return $item;
+				});
+            return table_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+    //添加审批类型
+    public function cate_add()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(FlowCateCheck::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['update_time'] = time();
+                $res = Db::name('FlowCate')->strict(false)->field(true)->update($param);
+                if ($res) {
+                    add_log('edit', $param['id'], $param);
+                }
+                return to_assign();
+            } else {
+                try {
+                    validate(FlowCateCheck::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['create_time'] = time();
+                $insertId = Db::name('FlowCate')->strict(false)->field(true)->insertGetId($param);
+                if ($insertId) {
+                    add_log('add', $insertId, $param);
+                }
+                return to_assign();
+            }
+        }else {
+            $id = isset($param['id']) ? $param['id'] : 0;
+            if ($id > 0) {
+                $detail = Db::name('FlowCate')->find($id);
+				if(!empty($detail['department_ids'])){
+					$detail['departments']=get_department_name($detail['department_ids']);
+				}
+				else{
+					$detail['departments']='全部';
+				}
+				if($detail['template_id']>0){
+					$detail['template_title'] = Db::name('Template')->where('id',$detail['template_id'])->value('title');
+				}
+                View::assign('detail', $detail);
+            }
+            View::assign('id', $id);
+            return view();
+        }
+    }
+	
+    //审批类型设置
+    public function item_check()
+    {
+		$param = get_params();
+        $res = Db::name('FlowCate')->strict(false)->field('id,status')->update($param);
+		if ($res) {
+			if($param['status'] == 0){
+				add_log('disable', $param['id'], $param);
+			}
+			else if($param['status'] == 1){
+				add_log('recovery', $param['id'], $param);
+			}
+			return to_assign();
+		}
+		else{
+			return to_assign(0, '操作失败');
+		}
+    }   
+}
diff --git a/app/adm/controller/Meeting.php b/app/adm/controller/Meeting.php
new file mode 100644
index 0000000000000000000000000000000000000000..c224413131e408c465a7a067eb30c7720b9757b4
--- /dev/null
+++ b/app/adm/controller/Meeting.php
@@ -0,0 +1,178 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\adm\controller;
+
+use app\base\BaseController;
+use app\adm\model\MeetingRecords as MeetingRecordsModel;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Meeting extends BaseController
+{	
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new MeetingRecordsModel();
+    }
+	//会议室
+    public function room()
+    {
+        if (request()->isAjax()) {
+			$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+			$list = Db::name('MeetingRoom')
+				->field('mr.*,u.name as keep_name')
+				->alias('mr')
+				->join('Admin u', 'u.id = mr.keep_uid', 'left')
+				->paginate(['list_rows'=> $rows]);
+            return table_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+    //会议室添加
+    public function room_add()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+            if (!empty($param['id']) && $param['id'] > 0) {
+                $param['update_time'] = time();
+                $res = Db::name('MeetingRoom')->strict(false)->field(true)->update($param);
+                if ($res) {
+                    add_log('edit', $param['id'], $param);
+                }
+                return to_assign();
+            } else {
+                $param['create_time'] = time();
+                $insertId = Db::name('MeetingRoom')->strict(false)->field(true)->insertGetId($param);
+                if ($insertId) {
+                    add_log('add', $insertId, $param);
+                }
+                return to_assign();
+            }
+		} else {
+			//keep_name
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = Db::name('MeetingRoom')->find($id);
+				if($detail['keep_uid']>0){
+					$detail['keep_name'] = Db::name('Admin')->where('id','=',$detail['keep_uid'])->value('name');
+				}
+                View::assign('detail', $detail);
+				return view('room_edit');
+			}
+			return view();
+        }
+    }
+	
+    //会议室查看
+    public function room_view()
+    {
+		$param = get_params();
+		$detail = Db::name('MeetingRoom')->find($param['id']);
+		if($detail['keep_uid']>0){
+			$detail['keep_name'] = Db::name('Admin')->where('id','=',$detail['keep_uid'])->value('name');
+		}
+		View::assign('detail', $detail);
+		return view();
+    } 
+	
+    //会议室设置
+    public function room_check()
+    {
+		$param = get_params();
+        $res = Db::name('MeetingRoom')->strict(false)->field('id,status')->update($param);
+		if ($res) {
+			if($param['status'] == 0){
+				add_log('disable', $param['id'], $param);
+			}
+			else if($param['status'] == 1){
+				add_log('recovery', $param['id'], $param);
+			}
+			return to_assign();
+		}
+		else{
+			return to_assign(0, '操作失败');
+		}
+    }  
+	
+	//会议纪要
+    public function records()
+    {
+        if (request()->isAjax()) {
+            $param = get_params();
+			$where=[];
+			$whereOr = [];
+			$uid = $this->uid;
+            if (!empty($param['keywords'])) {
+                $where[] = ['title', 'like', '%' . $param['keywords'] . '%'];
+            }
+			if (!empty($param['anchor_id'])) {
+                $where[] = ['anchor_id', '=', $param['anchor_id']];
+            }
+			if (!empty($param['diff_time'])) {
+				$diff_time =explode('~', $param['diff_time']);
+                $where[] = ['meeting_date', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]];
+            }
+            $where[] = ['delete_time', '=', 0];
+			$list = $this->model->datalist($param,$where,$whereOr);
+            return table_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+
+    //添加会议纪要
+    public function records_add()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+            $param['meeting_date'] = isset($param['meeting_date']) ? strtotime(urldecode($param['meeting_date'])) : 0;
+            if (!empty($param['id']) && $param['id'] > 0) {
+               $this->model->edit($param);
+            } else {
+                $param['admin_id'] = $this->uid;
+                $this->model->add($param);
+            }
+        } else {
+            $id = isset($param['id']) ? $param['id'] : 0;
+            if ($id > 0) {
+                View::assign('detail', $this->model->getById($id));
+				return view('records_edit');
+            }
+            return view();
+        }
+    }
+
+    //查看会议纪要
+    public function records_view($id)
+    {
+		View::assign('detail', $this->model->getById($id));
+        return view();
+    }
+
+    //删除会议纪要
+    public function records_del()
+    {
+		if (request()->isDelete()) {
+			$id = get_params("id");
+			$this->model->delById($id);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+}
diff --git a/app/adm/controller/News.php b/app/adm/controller/News.php
new file mode 100644
index 0000000000000000000000000000000000000000..b0e40dc9442fc62c6dd1832a3fdbc77faeb0baf0
--- /dev/null
+++ b/app/adm/controller/News.php
@@ -0,0 +1,135 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\adm\controller;
+
+use app\base\BaseController;
+use app\adm\model\News as NewsModel;
+use app\adm\validate\NewsValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class News extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new NewsModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			$where=[];
+			$where[]=['delete_time','=',0];
+            if (!empty($param['keywords'])) {
+                $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%'];
+            }
+            $list = $this->model->datalist($where, $param);
+            return table_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {		
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(NewsValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(NewsValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$param['admin_id']=$this->uid;
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				if($detail['file_ids'] !=''){
+					$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+					$detail['file_array'] = $file_array;
+				}
+				View::assign('detail', $detail);
+			}
+			View::assign('id', $id);
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			$detail['cate'] = Db::name('NoteCate')->where(['id' => $detail['cate_id']])->value('title');
+			$detail['admin_name'] = Db::name('Admin')->where(['id' => $detail['admin_id']])->value('name');
+			if($detail['file_ids'] !=''){
+				$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+				$detail['file_array'] = $file_array;
+			}
+			View::assign('detail', $detail);
+			if(is_mobile()){
+				return view('qiye@/index/view_news');
+			}
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		$param = get_params();
+		$id = isset($param['id']) ? $param['id'] : 0;
+		if (request()->isDelete()) {
+			$this->model->delById($id);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }   
+
+}
diff --git a/app/adm/controller/Note.php b/app/adm/controller/Note.php
new file mode 100644
index 0000000000000000000000000000000000000000..2365f5896cec925043b6ea8d4d9f3622956fa233
--- /dev/null
+++ b/app/adm/controller/Note.php
@@ -0,0 +1,134 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\adm\controller;
+
+use app\base\BaseController;
+use app\adm\model\Note as NoteModel;
+use app\adm\validate\NoteValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Note extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new NoteModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			$where=[];
+			$where[]=['a.delete_time','=',0];
+            if (!empty($param['keywords'])) {
+                $where[] = ['a.id|a.title', 'like', '%' . $param['keywords'] . '%'];
+            }
+            $list = $this->model->datalist($where, $param);
+            return table_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {		
+			$param['start_time'] = isset($param['start_time']) ? strtotime(urldecode($param['start_time'])) : 0;
+            $param['end_time'] = isset($param['end_time']) ? strtotime(urldecode($param['end_time'])) : 0;
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(NoteValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(NoteValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$param['admin_id']=$this->uid;
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				if($detail['file_ids'] !=''){
+					$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+					$detail['file_array'] = $file_array;
+				}
+				View::assign('detail', $detail);
+			}
+			View::assign('id', $id);
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			$detail['cate'] = Db::name('NoteCate')->where(['id' => $detail['cate_id']])->value('title');
+			$detail['admin_name'] = Db::name('Admin')->where(['id' => $detail['admin_id']])->value('name');
+			if($detail['file_ids'] !=''){
+				$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+				$detail['file_array'] = $file_array;
+			}
+			View::assign('detail', $detail);
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		$param = get_params();
+		$id = isset($param['id']) ? $param['id'] : 0;
+		if (request()->isDelete()) {
+			$this->model->delById($id);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }   
+
+}
diff --git a/app/adm/controller/Notecate.php b/app/adm/controller/Notecate.php
new file mode 100644
index 0000000000000000000000000000000000000000..7ad6710e3eae83137a43c0764e121d8d86a94c47
--- /dev/null
+++ b/app/adm/controller/Notecate.php
@@ -0,0 +1,141 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\adm\controller;
+
+use app\base\BaseController;
+use app\adm\model\NoteCate as NoteCateModel;
+use app\adm\validate\NotecateValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Notecate extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new NoteCateModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+            $list = $this->model->where('delete_time',0)->order('sort asc')->select();
+            return to_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {		
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(NotecateValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(NotecateValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getCateById($id);
+				View::assign('detail', $detail);
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			View::assign('detail', $detail);
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		if (request()->isDelete()) {
+			$param = get_params();
+			$id = isset($param['id']) ? $param['id'] : 0;
+			$type = isset($param['type']) ? $param['type'] : 0;
+			$this->model->delById($id,$type);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+
+    /**
+    * 设置
+    */
+    public function set()
+    {
+		if (request()->isAjax()) {
+			$param = get_params();
+			$res = $this->model->strict(false)->field('id,status')->update($param);
+			if ($res) {
+				if($param['status'] == 0){
+					add_log('disable', $param['id'], $param);
+				}
+				else if($param['status'] == 1){
+					add_log('recovery', $param['id'], $param);
+				}
+				return to_assign();
+			}
+			else{
+				return to_assign(0, '操作失败');
+			}
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+   
+
+}
diff --git a/app/adm/controller/Official.php b/app/adm/controller/Official.php
new file mode 100644
index 0000000000000000000000000000000000000000..7e6fb4f64ad02d3572bb8c86101a4bde34d525a0
--- /dev/null
+++ b/app/adm/controller/Official.php
@@ -0,0 +1,214 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\adm\controller;
+
+use app\base\BaseController;
+use app\adm\model\OfficialDocs;
+use app\adm\validate\CarValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Official extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new OfficialDocs();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			$where=[];
+			$whereOr = [];
+			$map1 = [];
+			$map2 = [];
+			$map3 = [];
+			$map4 = [];
+			$uid = $this->uid;
+			$tab = isset($param['tab']) ? $param['tab'] : 0;
+			
+			//条件1
+			$map1[] = ['admin_id','=',$uid];
+
+			//条件2
+			$map2[] = ['check_status','=',2];
+			$map2[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',send_uids)")];
+				
+			//条件3	
+			$map3[] = ['check_status','=',2];
+			$map3[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',copy_uids)")];
+			
+			//条件4
+			$map4[] = ['check_status','=',2];
+			$map4[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_uids)")];
+			
+			
+			$where[]=['delete_time','=',0];
+            if (!empty($param['keywords'])) {
+                $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%'];
+            }
+			if (!empty($param['secrets'])) {
+                $where[] = ['secrets', '=', $param['secrets']];
+            }
+			if (!empty($param['urgency'])) {
+                $where[] = ['urgency', '=', $param['urgency']];
+            }
+			if($tab == 0){
+				$whereOr = [$map1,$map2];
+			}
+			if($tab == 1){
+				$where[] = ['admin_id','=',$uid];
+			}
+			if($tab == 2){
+				$where[] = ['check_status','=',2];
+				$where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',send_uids)")];
+			}
+			if($tab == 3){
+				$where[] = ['check_status','=',2];
+				$where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',copy_uids)")];
+			}
+			if($tab == 4){
+				$where[] = ['check_status','=',2];
+				$where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_uids)")];
+			}
+            $list = $this->model->datalist($param,$where,$whereOr);
+            return table_assign(0, '', $list);
+        }
+        else{
+			View::assign('secrets', $this->model::$Secrets);
+			View::assign('urgency', $this->model::$Urgency);
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {
+			if (isset($param['draft_time'])) {
+                $param['draft_time'] = strtotime($param['draft_time']);
+            }	
+            if (!empty($param['id']) && $param['id'] > 0) {
+				$this->model->edit($param);
+            } else {
+				$param['admin_id'] = $this->uid;
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if(is_mobile()){
+				return view('qiye@/index/405',['msg' => '由于公文包含了富文本编辑，手机端不方便操作，请到PC端新增或编辑']);
+			}
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				if(!empty($detail['file_ids'])){
+					$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+					$detail['file_array'] = $file_array;
+				}
+                View::assign('detail', $detail);
+				return view('edit');
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			if(!empty($detail['file_ids'])){
+				$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+				$detail['file_array'] = $file_array;
+			}
+			View::assign('detail', $detail);
+			View::assign('auth_office', isAuth($this->uid,'office_admin','conf_1'));			
+			if(is_mobile()){
+				return view('qiye@/index/official_view');
+			}
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		$param = get_params();
+		$id = isset($param['id']) ? $param['id'] : 0;
+		if (request()->isDelete()) {
+			$this->model->delById($id);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }  
+	
+	//待审公文列表
+    public function pending()
+    {
+        if (request()->isAjax()) {
+			$param = get_params();
+			$uid = $this->uid;
+			$where=[];
+			if (!empty($param['keywords'])) {
+                $where[] = ['title', 'like', '%' . $param['keywords'] . '%'];
+            }
+			$where[] = ['check_status', '=', 1];
+			$where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
+			$list = $this->model->datalist($param,$where);
+            return table_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+	
+	//已审公文列表
+    public function reviewed()
+    {
+        if (request()->isAjax()) {
+			$param = get_params();
+			$uid = $this->uid;
+			$where=[];
+			if (!empty($param['keywords'])) {
+                $where[] = ['title', 'like', '%' . $param['keywords'] . '%'];
+            }
+			$where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
+			$list = $this->model->datalist($param,$where);
+            return table_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+}
diff --git a/app/adm/controller/Property.php b/app/adm/controller/Property.php
new file mode 100644
index 0000000000000000000000000000000000000000..01ab46e3fc44fd03ff0f2db926c3af28d7fca0ad
--- /dev/null
+++ b/app/adm/controller/Property.php
@@ -0,0 +1,282 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\adm\controller;
+
+use app\base\BaseController;
+use app\adm\model\Property as PropertyModel;
+use app\adm\validate\PropertyCheck;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Property extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new PropertyModel();
+    }
+	
+	public function datalist()
+    {
+        if (request()->isAjax()) {
+			$param = get_params();
+			$where = [];
+			if (!empty($param['keywords'])) {
+                $where[] = ['p.title', 'like', '%' . $param['keywords'] . '%'];
+            }
+			if (isset($param['status']) && $param['status']!='') {
+				$where[] = ['p.status', '=', $param['status']];
+            }
+			else{
+               $where[] = ['p.status','>=',0];
+			}
+			if (!empty($param['cate_id'])) {
+				$cate_id_array = get_cate_son('PropertyCate',$param['cate_id']);
+                $where[] = ['p.cate_id', 'in', $cate_id_array];
+            }
+			if (!empty($param['brand_id'])) {
+                $where[] = ['p.brand_id', '=', $param['brand_id']];
+            }
+			$list = $this->model->datalist($where, $param);
+            return table_assign(0, '', $list);
+        } else {
+			View::assign('status', $this->model::$property_status);
+            return view();
+        }
+    }
+    //新建编辑
+    public function add()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+			if (isset($param['buy_time'])) {
+                $param['buy_time'] = strtotime($param['buy_time']);
+            }
+			if (isset($param['quality_time'])) {
+                $param['quality_time'] = strtotime($param['quality_time']);
+            }
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(PropertyCheck::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['update_time'] = time();
+				$param['update_id'] = $this->uid;
+                $this->model->edit($param);
+            } else {
+                try {
+                    validate(PropertyCheck::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['create_time'] = time();
+                $param['admin_id'] = $this->uid;
+                $this->model->add($param);
+            }
+        } else {
+            $id = isset($param['id']) ? $param['id'] : 0;
+			View::assign('status', $this->model::$property_status);
+			View::assign('source', $this->model::$property_source);
+            if($id>0){
+                $detail = $this->model->getById($id);
+				if(!empty($detail['user_ids'])){
+					$users =  Db::name('Admin')->where('id','in',$detail['user_ids'])->column('name');
+					$detail['users_name'] = implode(',',$users);
+				}
+				if($detail['file_ids'] !=''){
+					$fileArray = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+					$detail['fileArray'] = $fileArray;
+				}
+                View::assign('detail', $detail);
+				return view('edit');
+            }
+            return view();
+        }
+    }
+	
+    //查看
+    public function view()
+    {
+        $param = get_params();
+		$id = isset($param['id']) ? $param['id'] : 0;
+		$detail = $this->model->getById($id);
+		if($detail['cate_id']>0){
+			$detail['cate'] = Db::name('PropertyCate')->where('id',$detail['cate_id'])->value('title');
+		}
+		if($detail['unit_id']>0){
+			$detail['unit'] = Db::name('PropertyUnit')->where('id',$detail['unit_id'])->value('title');
+		}
+		if($detail['brand_id']>0){
+			$detail['brand'] = Db::name('PropertyBrand')->where('id',$detail['brand_id'])->value('title');
+		}
+		if(!empty($detail['user_ids'])){
+			$users =  Db::name('Admin')->where('id','in',$detail['user_ids'])->column('name');
+			$detail['users_name'] = implode(',',$users);
+		}
+		if(!empty($detail['user_dids'])){
+			$titles =  Db::name('Department')->where('id','in',$detail['user_dids'])->column('title');
+			$detail['dids_title'] = implode(',',$titles);
+		}
+		if($detail['file_ids'] !=''){
+			$fileArray = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+			$detail['fileArray'] = $fileArray;
+		}
+		$repair = Db::name('PropertyRepair')
+				->field('pr.*,u.name as director_name')
+				->alias('pr')
+				->join('Admin u', 'u.id = pr.director_id', 'left')
+				->where(['pr.delete_time'=>0,'pr.property_id'=>$detail['id']])
+				->select()->toArray();
+		$detail['repair'] = $repair;
+		View::assign('detail', $detail);
+		return view();
+    }
+	
+    //设置
+    public function check()
+    {
+		$param = get_params();
+        $res = Db::name('Property')->strict(false)->field('id,status')->update($param);
+		if ($res) {
+			add_log('set', $param['id'], $param);
+			return to_assign();
+		}
+		else{
+			return to_assign(0, '操作失败');
+		}
+    }   
+	
+	
+	//维修记录列表
+    public function repair_list()
+    {
+        if (request()->isAjax()) {
+			$param = get_params();
+			$where = [];
+			if (!empty($param['keywords'])) {
+                $where[] = ['p.title', 'like', '%' . $param['keywords'] . '%'];
+            }
+			if (!empty($param['diff_time'])) {
+				$diff_time =explode('~', $param['diff_time']);
+                $where[] = ['pr.repair_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1]))]];
+            }
+			$where[] = ['pr.delete_time','=',0];
+			$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+            $list = Db::name('PropertyRepair')
+				->field('pr.*,pc.title as cate,pb.title as brand,p.title,p.model,u.name as director_name')
+				->alias('pr')
+				->join('Property p', 'p.id = pr.property_id', 'left')
+				->join('PropertyCate pc', 'pc.id = p.cate_id', 'left')
+				->join('PropertyBrand pb', 'pb.id = p.brand_id', 'left')
+				->join('Admin u', 'u.id = pr.director_id', 'left')
+				->where($where)
+				->order('id desc')
+				->paginate(['list_rows'=> $rows])
+				->each(function ($item, $key){
+					$item['repair_time'] = date('Y-m-d',$item['repair_time']);
+					$item['create_time'] = date('Y-m-d H:i',$item['create_time']);
+					return $item;
+				});
+            return table_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+	
+    //维修记录添加&编辑
+    public function repair_add()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+			if (isset($param['repair_time'])) {
+                $param['repair_time'] = strtotime($param['repair_time']);
+            }
+            if (!empty($param['id']) && $param['id'] > 0) {
+                $param['update_time'] = time();
+				$res = Db::name('PropertyRepair')->strict(false)->field(true)->update($param);
+				if($res){
+					add_log('edit', $param['id'], $param);
+					return to_assign();
+				}
+            } else {
+                $param['create_time'] = time();
+                $insertId = Db::name('PropertyRepair')->strict(false)->field(true)->insertGetId($param);
+                if ($insertId) {
+                    add_log('add', $insertId, $param);
+                }
+                return to_assign();
+            }
+        } else {
+            $id = isset($param['id']) ? $param['id'] : 0;
+            $pid = isset($param['pid']) ? $param['pid'] : 0;
+            if ($id > 0) {
+                $detail = Db::name('PropertyRepair')->where(['id' => $id])->find();
+                $detail['director_name'] = Db::name('Admin')->where('id',$detail['director_id'])->value('name');
+                $detail['property'] = Db::name('Property')->where('id',$detail['property_id'])->value('title');
+				if($detail['file_ids'] !=''){
+					$fileArray = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+					$detail['fileArray'] = $fileArray;
+				}
+                View::assign('detail', $detail);
+				return view('repair_edit');
+            }
+			if($pid>0){
+				View::assign('property', $this->model->getById($pid));
+			}
+            View::assign('pid', $pid);
+            View::assign('id', $id);
+            return view();
+        }
+    }
+	
+    //维修记录查看
+    public function repair_view()
+    {
+        $param = get_params();
+        $id = isset($param['id']) ? $param['id'] : 0;
+		$detail = Db::name('PropertyRepair')->where(['id' => $id])->find();
+		$detail['director_name'] = Db::name('Admin')->where('id',$detail['director_id'])->value('name');
+		$detail['property'] = Db::name('Property')->where('id',$detail['property_id'])->value('title');
+		if($detail['file_ids'] !=''){
+			$fileArray = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+			$detail['fileArray'] = $fileArray;
+		}
+		View::assign('detail', $detail);
+        return view();
+    }
+	
+     //维修记录删除
+    public function repair_del()
+    {
+		$param = get_params();
+        $res = Db::name('PropertyRepair')->where('id',$param['id'])->update(['delete_time'=>time()]);
+		if ($res) {
+			add_log('delete', $param['id'], $param);
+			return to_assign();
+		}
+		else{
+			return to_assign(0, '操作失败');
+		}
+    }  
+}
diff --git a/app/adm/controller/Propertybrand.php b/app/adm/controller/Propertybrand.php
new file mode 100644
index 0000000000000000000000000000000000000000..d15496a5bd69a6598285b2b0f83edecf9e33181f
--- /dev/null
+++ b/app/adm/controller/Propertybrand.php
@@ -0,0 +1,87 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\adm\controller;
+
+use app\base\BaseController;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Propertybrand extends BaseController
+{	
+	//资产品牌
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+            $cate = Db::name('PropertyBrand')->order('create_time asc')->select();
+            return to_assign(0, '', $cate);
+        } else {
+            return view();
+        }
+    }
+
+    //添加&编辑
+    public function add()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+            if (!empty($param['id']) && $param['id'] > 0) {
+                $param['update_time'] = time();
+				$res = Db::name('PropertyBrand')->strict(false)->field(true)->update($param);
+				if($res){
+					add_log('edit', $param['id'], $param);
+					return to_assign();
+				}
+            } else {
+                $param['create_time'] = time();
+                $insertId = Db::name('PropertyBrand')->strict(false)->field(true)->insertGetId($param);
+                if ($insertId) {
+                    add_log('add', $insertId, $param);
+                }
+                return to_assign();
+            }
+        } else {
+            $id = isset($param['id']) ? $param['id'] : 0;
+            if ($id > 0) {
+                $detail = Db::name('PropertyBrand')->where(['id' => $id])->find();
+                View::assign('detail', $detail);
+            }
+            View::assign('id', $id);
+            return view();
+        }
+    }
+
+    //禁用启用
+    public function check()
+    {
+		$param = get_params();
+        $res = Db::name('PropertyBrand')->strict(false)->field('id,status')->update($param);
+		if ($res) {
+			if($param['status'] == 0){
+				add_log('disable', $param['id'], $param);
+			}
+			else if($param['status'] == 1){
+				add_log('recovery', $param['id'], $param);
+			}
+			return to_assign();
+		}
+		else{
+			return to_assign(0, '操作失败');
+		}
+    } 
+   
+   
+}
diff --git a/app/adm/controller/Propertycate.php b/app/adm/controller/Propertycate.php
new file mode 100644
index 0000000000000000000000000000000000000000..72ae16077170776eff3f648c31f39266b89d01f9
--- /dev/null
+++ b/app/adm/controller/Propertycate.php
@@ -0,0 +1,112 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\adm\controller;
+
+use app\base\BaseController;
+use app\adm\validate\CateCheck;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Propertycate extends BaseController
+{	
+	//类别
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+            $cate = Db::name('PropertyCate')->order('create_time asc')->select();
+			$list = generateTree($cate);
+            return to_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+
+    //分类添加&编辑
+    public function add()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(CateCheck::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $note_array = get_cate_son('PropertyCate',$param['id']);
+                if (in_array($param['pid'], $note_array)) {
+                    return to_assign(1, '父级分类不能是该分类本身或其子分类');
+                } else {
+                    $param['update_time'] = time();
+                    $res = Db::name('PropertyCate')->strict(false)->field(true)->update($param);
+                    if($res){
+                        add_log('edit', $param['id'], $param);
+                        return to_assign();
+                    }
+                }
+            } else {
+                try {
+                    validate(CateCheck::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['create_time'] = time();
+                $insertId = Db::name('PropertyCate')->strict(false)->field(true)->insertGetId($param);
+                if ($insertId) {
+                    add_log('add', $insertId, $param);
+                }
+                return to_assign();
+            }
+        } else {
+            $id = isset($param['id']) ? $param['id'] : 0;
+            $pid = isset($param['pid']) ? $param['pid'] : 0;
+			$cate = Db::name('PropertyCate')->order('id desc')->select()->toArray();
+			$cates = set_recursion($cate);
+            if ($id > 0) {
+                $detail = Db::name('PropertyCate')->where(['id' => $id])->find();
+                View::assign('detail', $detail);
+            }
+            View::assign('id', $id);
+            View::assign('pid', $pid);
+            View::assign('cates', $cates);
+            return view();
+        }
+    }
+
+    //删除分类
+    public function del()
+    {
+        $id = get_params("id");
+        $cate_count = Db::name('PropertyCate')->where(["pid" => $id])->count();
+        if ($cate_count > 0) {
+            return to_assign(1, "该分类下还有子分类，无法删除");
+        }
+        $content_count = Db::name('Property')->where(["cate_id" => $id])->count();
+        if ($content_count > 0) {
+            return to_assign(1, "该分类下还有资产，无法删除");
+        }
+        if (Db::name('PropertyCate')->delete($id) !== false) {
+            add_log('delete', $id);
+            return to_assign(0, "删除分类成功");
+        } else {
+            return to_assign(1, "删除失败");
+        }
+    }
+   
+   
+}
diff --git a/app/adm/controller/Propertyunit.php b/app/adm/controller/Propertyunit.php
new file mode 100644
index 0000000000000000000000000000000000000000..1a6e92e9705edda16282b74c9e4377a44b6b28d8
--- /dev/null
+++ b/app/adm/controller/Propertyunit.php
@@ -0,0 +1,87 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\adm\controller;
+
+use app\base\BaseController;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Propertyunit extends BaseController
+{	
+	//资产单位
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+            $cate = Db::name('PropertyUnit')->order('create_time asc')->select();
+            return to_assign(0, '', $cate);
+        } else {
+            return view();
+        }
+    }
+
+    //添加&编辑
+    public function add()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+            if (!empty($param['id']) && $param['id'] > 0) {
+                $param['update_time'] = time();
+				$res = Db::name('PropertyUnit')->strict(false)->field(true)->update($param);
+				if($res){
+					add_log('edit', $param['id'], $param);
+					return to_assign();
+				}
+            } else {
+                $param['create_time'] = time();
+                $insertId = Db::name('PropertyUnit')->strict(false)->field(true)->insertGetId($param);
+                if ($insertId) {
+                    add_log('add', $insertId, $param);
+                }
+                return to_assign();
+            }
+        } else {
+            $id = isset($param['id']) ? $param['id'] : 0;
+            if ($id > 0) {
+                $detail = Db::name('PropertyUnit')->where(['id' => $id])->find();
+                View::assign('detail', $detail);
+            }
+            View::assign('id', $id);
+            return view();
+        }
+    }
+
+    //禁用启用
+    public function check()
+    {
+		$param = get_params();
+        $res = Db::name('PropertyUnit')->strict(false)->field('id,status')->update($param);
+		if ($res) {
+			if($param['status'] == 0){
+				add_log('disable', $param['id'], $param);
+			}
+			else if($param['status'] == 1){
+				add_log('recovery', $param['id'], $param);
+			}
+			return to_assign();
+		}
+		else{
+			return to_assign(0, '操作失败');
+		}
+    } 
+   
+   
+}
diff --git a/app/adm/controller/Seal.php b/app/adm/controller/Seal.php
new file mode 100644
index 0000000000000000000000000000000000000000..f063f1d9d79b13385a06958d6f2001fb90436472
--- /dev/null
+++ b/app/adm/controller/Seal.php
@@ -0,0 +1,203 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\adm\controller;
+
+use app\base\BaseController;
+use app\adm\model\Seal as SealModel;
+use app\adm\validate\CarValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Seal extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new SealModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			$tab = isset($param['tab']) ? $param['tab'] : 0;
+			$uid=$this->uid;
+            $where = array();
+            $whereOr = array();
+			$where[]=['delete_time','=',0];
+			if($tab == 0){
+				//全部
+				$whereOr[] = ['admin_id', '=', $this->uid];
+				$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
+				$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
+				$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_copy_uids)")];
+			}
+			if($tab == 1){
+				//创建的
+				$where[] = ['admin_id', '=', $this->uid];
+			}
+			if($tab == 2){
+				//待我审核的
+				$where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
+			}
+			if($tab == 3){
+				//我已审核的
+				$where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
+			}
+			if($tab == 4){
+				//抄送给我的
+				$where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_copy_uids)")];
+			}
+            if (!empty($param['seal_cate_id'])) {
+                $where[] = ['seal_cate_id', '=', $param['seal_cate_id']];
+            }
+			if (isset($param['check_status']) && $param['check_status'] != "") {
+                $where[] = ['check_status', '=', $param['check_status']];
+            }
+			if (!empty($param['keywords'])) {
+                $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%'];
+            }
+            $list = $this->model->datalist($where,$whereOr, $param);
+            return table_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {
+			if (!empty($param['use_time'])) {
+                $param['use_time'] = strtotime($param['use_time']);
+            }
+			if (!empty($param['start_time'])) {
+                $param['start_time'] = strtotime($param['start_time']);
+            }
+			else{
+				$param['start_time'] = 0;
+			}
+			if (!empty($param['end_time'])) {
+                $param['end_time'] = strtotime($param['end_time']);
+				if($param['end_time']<$param['start_time']){
+					return to_assign(1, "结束借用日期需要大于等于印章借用日期");
+				}
+            }
+			else{
+				$param['end_time'] = 0;
+			}
+            if (!empty($param['id']) && $param['id'] > 0) {
+				$this->model->edit($param);
+            } else {
+				$param['admin_id'] = $this->uid;
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				if(!empty($detail['file_ids'])){
+					$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+					$detail['file_array'] = $file_array;
+				}
+				if($detail['check_status']==0 || $detail['check_status']==4){
+					View::assign('detail', $detail);
+					if(is_mobile()){
+						return view('qiye@/approve/add_seal');
+					}
+					return view('edit');
+				}
+				return view(EEEOR_REPORTING,['code'=>403,'warning'=>'当前状态不支持编辑']);
+			}
+			if(is_mobile()){
+				return view('qiye@/approve/add_seal');
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			if(!empty($detail['file_ids'])){
+				$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+				$detail['file_array'] = $file_array;
+			}
+			View::assign('detail', $detail);
+			View::assign('create_user', get_admin($detail['admin_id']));
+			if(is_mobile()){
+				return view('qiye@/approve/view_seal');
+			}
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		$param = get_params();
+		$id = isset($param['id']) ? $param['id'] : 0;
+		if (request()->isDelete()) {
+			$this->model->delById($id);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }  
+	
+	//用章记录
+    public function record()
+    {
+        if (request()->isAjax()) {
+			$param = get_params();
+			$where = [];
+			$whereOr = [];
+			$where[]=['delete_time','=',0];
+			$where[]=['check_status','=',2];
+            if (!empty($param['seal_cate_id'])) {
+                $where[] = ['seal_cate_id', '=', $param['seal_cate_id']];
+            }
+			if (!empty($param['keywords'])) {
+                $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%'];
+            }
+			$list = $this->model->datalist($where,$whereOr, $param);
+            return table_assign(0, '', $list);
+        } else {
+			View::assign('status', ['未使用','已使用','已归还']);
+            return view();
+        }
+    }
+}
diff --git a/app/adm/controller/Sealcate.php b/app/adm/controller/Sealcate.php
new file mode 100644
index 0000000000000000000000000000000000000000..9fb6007b953063ad38708d68ef6cecca40d3e4a8
--- /dev/null
+++ b/app/adm/controller/Sealcate.php
@@ -0,0 +1,103 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\adm\controller;
+
+use app\base\BaseController;
+use app\adm\validate\SealCateCheck;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Sealcate extends BaseController
+{	
+	//印章类别
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+            $cate = Db::name('SealCate')
+				->field('a.*,u.name,d.title as department')
+				->alias('a')
+				->join('Admin u', 'u.id = a.keep_uid')
+				->join('Department d', 'd.id = u.did')
+				->order('create_time asc')->select();
+            return to_assign(0, '', $cate);
+        } else {
+            return view();
+        }
+    }
+    //添加
+    public function add()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(SealCateCheck::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['update_time'] = time();
+                $res = Db::name('SealCate')->strict(false)->field(true)->update($param);
+                if ($res) {
+                    add_log('edit', $param['id'], $param);
+                }
+                return to_assign();
+            } else {
+                try {
+                    validate(SealCateCheck::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['create_time'] = time();
+                $insertId = Db::name('SealCate')->strict(false)->field(true)->insertGetId($param);
+                if ($insertId) {
+                    add_log('add', $insertId, $param);
+                }
+                return to_assign();
+            }
+        }else {
+            $id = isset($param['id']) ? $param['id'] : 0;
+            if ($id > 0) {
+                $detail = Db::name('SealCate')->where(['id' => $id])->find();
+                $detail['keep_name'] = Db::name('Admin')->where(['id' =>  $detail['keep_uid']])->value('name');
+                View::assign('detail', $detail);
+            }
+            View::assign('id', $id);
+            return view();
+        }
+    }
+	
+    //设置
+    public function check()
+    {
+		$param = get_params();
+        $res = Db::name('SealCate')->strict(false)->field('id,status')->update($param);
+		if ($res) {
+			if($param['status'] == 0){
+				add_log('disable', $param['id'], $param);
+			}
+			else if($param['status'] == 1){
+				add_log('recovery', $param['id'], $param);
+			}
+			return to_assign();
+		}
+		else{
+			return to_assign(0, '操作失败');
+		}
+    }   
+}
diff --git a/app/adm/event.php b/app/adm/event.php
new file mode 100644
index 0000000000000000000000000000000000000000..afe59182c6aa72dfdf36da12c258d8e48725b43e
--- /dev/null
+++ b/app/adm/event.php
@@ -0,0 +1,8 @@
+<?php
+return [
+	'listen'    => [
+        //注册监听类
+        'SendMessage' => ['app\listener\SendMessage'],
+    ],
+    //'subscribe' => ['app\subscribe\Message'],
+];
diff --git a/app/adm/middleware.php b/app/adm/middleware.php
new file mode 100644
index 0000000000000000000000000000000000000000..a500c6f3c49234d4b0e811c4c004f053b8dbd03c
--- /dev/null
+++ b/app/adm/middleware.php
@@ -0,0 +1,8 @@
+<?php
+// 这是系统自动生成的middleware定义文件
+return [
+    //开启session中间件
+    //'think\middleware\SessionInit',
+    //验证勾股OA是否完成安装
+    \app\home\middleware\Install::class,
+];
diff --git a/app/adm/model/Car.php b/app/adm/model/Car.php
new file mode 100644
index 0000000000000000000000000000000000000000..4d906824724b76b0fc1a15f0ec8447329425d005
--- /dev/null
+++ b/app/adm/model/Car.php
@@ -0,0 +1,196 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\adm\model;
+use think\model;
+use think\facade\Db;
+class Car extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->order($order)
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key){
+				$item->buy_time = date('Y-m-d', $item->buy_time);
+				$item->insure_time = date('Y-m-d', $item->insure_time);
+				$item->insure_time_note = count_days($item->insure_time);
+				$item->review_time = date('Y-m-d', $item->review_time);
+				$item->review_time_note = count_days($item->review_time);
+				if($item->driver>0){
+					$item->driver_name = Db::name('Admin')->where('id','=',$item->driver)->value('name');
+				}
+				else{
+					$item->driver_name='-';
+				}
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$param['mileage_now'] = $param['mileage'];
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['aid'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign();
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+	
+	//维修(保养)记录
+    public function repairlist($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = Db::name('CarRepair')
+				->field('cr.*,c.title as car,c.name,u.name as handled_name')
+				->alias('cr')
+				->join('Car c', 'c.id = cr.car_id', 'left')
+				->join('Admin u', 'u.id = cr.handled', 'left')
+				->where($where)
+				->order($order)
+				->paginate(['list_rows'=> $rows])
+				->each(function ($item, $key){
+					$item['repair_time'] = date('Y-m-d',$item['repair_time']);
+					$item['create_time'] = date('Y-m-d H:i',$item['create_time']);
+					return $item;
+				});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+	
+	//费用记录
+    public function feelist($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = Db::name('CarFee')
+				->field('cf.*,c.title as car,c.name,u.name as handled_name,ba.title as types_str')
+				->alias('cf')
+				->join('Car c', 'c.id = cf.car_id', 'left')
+				->join('basicAdm ba', 'ba.id = cf.types', 'left')
+				->join('Admin u', 'u.id = cf.handled', 'left')
+				->where($where)
+				->order($order)
+				->paginate(['list_rows'=> $rows])
+				->each(function ($item, $key){
+					$item['fee_time'] = date('Y-m-d',$item['fee_time']);
+					$item['create_time'] = date('Y-m-d H:i',$item['create_time']);
+					return $item;
+				});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+	
+	//里程记录
+    public function mileagelist($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+			$list = Db::name('CarMileage')
+				->order('mileage_time desc')
+				->where($where)
+				->order($order)
+				->paginate($rows, false)->each(function($item, $key){
+					$item['mileage_time'] = date('Y-m', $item['mileage_time']);
+					$item['create_time'] = date('Y-m-d H:i:s', $item['create_time']);
+					$item['admin_name'] =  Db::name('Admin')->where('id',$item['admin_id'])->value('name');
+					return $item;
+				});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+}
+
diff --git a/app/adm/model/MeetingRecords.php b/app/adm/model/MeetingRecords.php
new file mode 100644
index 0000000000000000000000000000000000000000..cc95017f670cea673831ebc1f7cf93646f8101de
--- /dev/null
+++ b/app/adm/model/MeetingRecords.php
@@ -0,0 +1,131 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\adm\model;
+use think\model;
+use think\facade\Db;
+class MeetingRecords extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($param=[],$where=[],$whereOr=[])
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {			
+            $list = self::where($where)
+				->where(function ($query) use($whereOr) {
+					if (!empty($whereOr)){
+						$query->whereOr($whereOr);
+					}
+				})
+				->order($order)
+				->paginate(['list_rows'=> $rows])
+				->each(function ($item, $key){					
+					$item['anchor'] = Db::name('Admin')->where(['id' => $item['anchor_id']])->value('name');
+					$item['meeting_date'] = empty($item['meeting_date']) ? '-' : date('Y-m-d', $item['meeting_date']);
+					$item['did_name'] = Db::name('Department')->where(['id' => $item['did']])->value('title');
+					$item['recorder_name'] = Db::name('Admin')->where(['id' => $item['recorder_id']])->value('name');
+				});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['aid'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign();
+    }	
+
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		$info['recorder_name'] = Db::name('Admin')->where(['id' => $info['recorder_id']])->value('name');
+		$info['anchor_name'] = Db::name('Admin')->where(['id' => $info['anchor_id']])->value('name');
+		$info['room'] = Db::name('MeetingRoom')->where(['id' => $info['room_id']])->value('title');
+		$info['did_name'] = Db::name('Department')->where(['id' => $info['did']])->value('title');
+		$join_names = Db::name('Admin')->where([['id','in',$info['join_uids']]])->column('name');
+		$info['join_names'] =implode(',' ,$join_names);
+		$sign_names = Db::name('Admin')->where([['id','in',$info['sign_uids']]])->column('name');
+		$info['sign_names'] =implode(',' ,$sign_names);
+		$share_names = Db::name('Admin')->where([['id','in',$info['share_uids']]])->column('name');
+		$info['share_names'] =implode(',' ,$share_names);
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
diff --git a/app/adm/model/News.php b/app/adm/model/News.php
new file mode 100644
index 0000000000000000000000000000000000000000..f279c908467f95db57203287778aea6f31737733
--- /dev/null
+++ b/app/adm/model/News.php
@@ -0,0 +1,113 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\adm\model;
+use think\model;
+use think\facade\Db;
+class News extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->order($order)
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key){
+				$item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name');
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/adm/model/Note.php b/app/adm/model/Note.php
new file mode 100644
index 0000000000000000000000000000000000000000..595aeeddc012da716f436df874cb1824f07c8fa7
--- /dev/null
+++ b/app/adm/model/Note.php
@@ -0,0 +1,130 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\adm\model;
+use think\model;
+use think\facade\Db;
+class Note extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'a.end_time desc,a.sort desc,a.create_time desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->field('a.*,c.title as cate')
+            ->alias('a')
+            ->join('NoteCate c', 'a.cate_id = c.id', 'LEFT')
+			->order($order)
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key){
+				$item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name');
+				$item->start_time = empty($item->start_time) ? '-' : date('Y-m-d', $item->start_time);
+                $item->end_time = empty($item->end_time) ? '-' : date('Y-m-d', $item->end_time);
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+			$users= Db::name('Admin')->field('id as from_uid')->where(['status' => 1])->column('id');
+			$msg=[
+				'from_uid'=>$param['admin_id'],//发送人
+				'to_uids'=>$users,//接收人
+				'template_id'=>'note',//消息模板ID
+				'content'=>[ //消息内容
+					'create_time'=>date('Y-m-d H:i:s'),
+					'title' => $param['title'],
+					'action_id'=>$insertId
+				]
+			];
+			event('SendMessage',$msg);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['aid'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign();
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/adm/model/NoteCate.php b/app/adm/model/NoteCate.php
new file mode 100644
index 0000000000000000000000000000000000000000..be597d5e3f61905bbfc546ab29c7fd09d1e20d14
--- /dev/null
+++ b/app/adm/model/NoteCate.php
@@ -0,0 +1,108 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\adm\model;
+use think\model;
+use think\facade\Db;
+class NoteCate extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)->order($order)->paginate(['list_rows'=> $rows]);
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['aid'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign();
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/adm/model/OfficialDocs.php b/app/adm/model/OfficialDocs.php
new file mode 100644
index 0000000000000000000000000000000000000000..ed91cdefd76cdf4a573e22f019592e929132de55
--- /dev/null
+++ b/app/adm/model/OfficialDocs.php
@@ -0,0 +1,139 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\adm\model;
+use think\model;
+use think\facade\Db;
+class OfficialDocs extends Model
+{
+	//密级程度
+	public static $Secrets = ['','公开','秘密','机密'];
+	
+	//紧急程度
+	public static $Urgency = ['','普通','紧急','加急'];
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($param=[],$where=[],$whereOr=[])
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->where(function ($query) use($whereOr) {
+				if (!empty($whereOr)){
+					$query->whereOr($whereOr);
+				}
+			})
+			->order($order)
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key){
+				$item->secrets_str = self::$Secrets[$item->secrets];
+				$item->urgency_str = self::$Urgency[$item->urgency];
+				$item->check_status_str = check_status_name($item->check_status);
+				$item->draft_time = date('Y-m-d', $item->draft_time);
+				$item->draft_name = Db::name('Admin')->where('id','=',$item->draft_uid)->value('name');
+				$item->draft_dname = Db::name('Department')->where('id','=',$item->did)->value('title');
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['aid'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign();
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		$info['draft_name'] = Db::name('Admin')->where('id','=',$info['draft_uid'])->value('name');
+		$info['draft_dame'] = Db::name('Department')->where('id','=',$info['did'])->value('title');
+		
+		$send_names = Db::name('Admin')->where([['id','in',$info['send_uids']]])->column('name');
+		$info['send_names'] =implode(',' ,$send_names);
+		
+		$copy_names = Db::name('Admin')->where([['id','in',$info['copy_uids']]])->column('name');
+		$info['copy_names'] =implode(',' ,$copy_names);
+		
+		$share_names = Db::name('Admin')->where([['id','in',$info['share_uids']]])->column('name');
+		$info['share_names'] =implode(',' ,$share_names);
+		
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/adm/model/Property.php b/app/adm/model/Property.php
new file mode 100644
index 0000000000000000000000000000000000000000..89be230b9987ecc6f3fad7055e2dcc1ba0ccd31e
--- /dev/null
+++ b/app/adm/model/Property.php
@@ -0,0 +1,133 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\adm\model;
+use think\model;
+use think\facade\Db;
+class Property extends Model
+{
+	//资产来源
+	public static $property_source = ['','采购','赠与','自产','其他'];
+	
+	//资产状态
+	public static $property_status = ['闲置','在用','维修','报废','丢失'];
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'p.id desc' : $param['order'];
+        try {			
+            $list = self::where($where)
+				->field('p.*,pc.title as cate,pb.title as brand,pu.title as unit,u.name as create_name')
+				->alias('p')
+				->join('PropertyCate pc', 'pc.id = p.cate_id', 'left')
+				->join('PropertyBrand pb', 'pb.id = p.brand_id', 'left')
+				->join('PropertyUnit pu', 'pu.id = p.unit_id', 'left')
+				->join('Admin u', 'u.id = p.admin_id', 'left')
+				->order($order)
+				->paginate(['list_rows'=> $rows])
+				->each(function ($item, $key){
+					$item->update_time_str = '-';
+					$item->update_name = '-';
+					if(!empty($item->update_time)){
+						$item->update_time_str = $item->update_time;
+						$item->update_name = Db::name('Admin')->where('id',$item->update_id)->value('name');
+					}
+					$item->status_str = self::$property_status[$item->status];
+					$item->source_str = self::$property_source[$item->source];
+				});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['aid'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign();
+    }	
+
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		$info['status_str'] = self::$property_status[$info['status']];
+		$info['source_str'] = self::$property_source[$info['source']];
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
diff --git a/app/adm/model/Seal.php b/app/adm/model/Seal.php
new file mode 100644
index 0000000000000000000000000000000000000000..acc0a3fd51d59d3665eda8b4152a25a6655a3533
--- /dev/null
+++ b/app/adm/model/Seal.php
@@ -0,0 +1,149 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\adm\model;
+use think\model;
+use think\facade\Db;
+class Seal extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($where, $whereOr, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->where(function ($query) use($whereOr) {
+				if (!empty($whereOr)){
+					$query->whereOr($whereOr);
+				}
+			})
+			->order($order)
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key){
+				$item->check_status_str = check_status_name($item->check_status);
+				$item->use_time = date('Y-m-d', $item->use_time);
+				$item->admin_name = Db::name('Admin')->where('id','=',$item->admin_id)->value('name');
+				$item->use_dname = Db::name('Department')->where('id','=',$item->did)->value('title');
+				$item->seal_cate = Db::name('SealCate')->where('id','=',$item->seal_cate_id)->value('title');
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=> $param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		$info['admin_name'] = Db::name('Admin')->where('id','=',$info['admin_id'])->value('name');
+		$info['use_dname'] = Db::name('Department')->where('id','=',$info['did'])->value('title');
+		$info['seal_cate'] = Db::name('SealCate')->where('id','=',$info['seal_cate_id'])->value('title');
+		if($info['start_time']>0){
+			$info['start_time'] = date('Y-m-d',$info['start_time']);
+			$info['end_time'] = date('Y-m-d',$info['end_time']);
+		}
+		else{
+			$info['start_time'] = '';
+			$info['end_time'] = '';	
+		}
+		if($info['use_time']>0){
+			$info['use_time'] = date('Y-m-d',$info['use_time']);
+		}
+		else{
+			$info['use_time'] = '';
+		}
+		$status_str = '未使用';
+		if($info['status'] == 1){
+			$status_str = '已使用';
+			if($info['is_borrow']==1){
+				$status_str = '已外借';
+			}
+		}
+		if($info['status'] == 2){
+			$status_str = '已归还';
+		}
+		$info['status_str'] = $status_str;
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/adm/validate/BasicAdmCheck.php b/app/adm/validate/BasicAdmCheck.php
new file mode 100644
index 0000000000000000000000000000000000000000..5d45a3c618d067236a2deecd972645245bc10df7
--- /dev/null
+++ b/app/adm/validate/BasicAdmCheck.php
@@ -0,0 +1,34 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\adm\validate;
+
+use think\Validate;
+
+class BasicAdmCheck extends Validate
+{
+    protected $rule = [
+        'title' => 'require',
+        'id' => 'require',
+    ];
+
+    protected $message = [
+        'title.require' => '名称不能为空',
+        'id.require' => '缺少更新条件',
+    ];
+
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['id', 'title'],
+    ];
+}
diff --git a/app/adm/validate/CarValidate.php b/app/adm/validate/CarValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..44bd8a85f4818e7934aff18c66b2af45d02e2cbf
--- /dev/null
+++ b/app/adm/validate/CarValidate.php
@@ -0,0 +1,43 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\adm\validate;
+use think\Validate;
+use think\facade\Db;
+
+class CarValidate extends Validate
+{
+	// 自定义验证规则
+	protected function checkOne($value,$rule,$data=[])
+	{
+		$id = isset($data['id'])?$data['id']:0;
+		$count = Db::name('Car')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count();
+		return $count == 0 ? true : false;
+	}
+	
+    protected $rule = [
+		'title' => 'require|checkOne',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'title.require' => '名称不能为空',
+		'title.checkOne' => '同样的名称已经存在',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['title', 'id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/adm/validate/CateCheck.php b/app/adm/validate/CateCheck.php
new file mode 100644
index 0000000000000000000000000000000000000000..ca5b7f9b665b648b772b2906f8ea83ee89be0d3e
--- /dev/null
+++ b/app/adm/validate/CateCheck.php
@@ -0,0 +1,35 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\adm\validate;
+
+use think\Validate;
+
+class CateCheck extends Validate
+{
+    protected $rule = [
+        'title' => 'require|unique:property_cate',
+        'id' => 'require',
+    ];
+
+    protected $message = [
+        'title.require' => '名称不能为空',
+        'title.unique' => '同样的名称已经存在',
+        'id.require' => '缺少更新条件',
+    ];
+
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['id', 'title'],
+    ];
+}
diff --git a/app/adm/validate/FlowCateCheck.php b/app/adm/validate/FlowCateCheck.php
new file mode 100644
index 0000000000000000000000000000000000000000..da50d301547862bf13a9b70f8b073333c834384a
--- /dev/null
+++ b/app/adm/validate/FlowCateCheck.php
@@ -0,0 +1,57 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\adm\validate;
+
+use think\Validate;
+use think\facade\Db;
+
+class FlowCateCheck extends Validate
+{
+	// 自定义验证规则
+	protected function checkOne($value,$rule,$data=[])
+	{
+		$id = isset($data['id'])?$data['id']:0;
+		$table_array = ['invoice','ticket','approve'];
+		if(in_array($data['check_table'],$table_array)){
+			return true;
+		}
+		else{
+			$count = Db::name('FlowCate')->where([['check_table','=',$data['check_table']],['id','<>',$id]])->count();
+			return $count == 0 ? true : false;
+		}
+	}
+	
+    protected $rule = [
+        'title' => 'require',
+        'name' => 'require|alphaDash|unique:flow_cate',
+        'check_table' => 'require|alphaDash|checkOne',
+        'id' => 'require',
+    ];
+
+    protected $message = [
+        'title.require' => '审批类型名称不能为空',
+        'name.require' => '审批类型标识不能为空',
+        'name.unique' => '同样的审批类型标识已经存在',
+		'name.alphaDash' => '审批类型标识只能是小写字母',
+        'check_table.require' => '数据表不能为空',
+        'check_table.alphaDash' => '数据表只能是小写字母、数字下划线_',
+        'check_table.checkOne' => '同样的数据表已经存在',
+        'id.require' => '缺少更新条件',
+    ];
+
+    protected $scene = [
+        'add' => ['title','check_table'],
+        'edit' => ['id', 'title','check_table'],
+    ];
+}
diff --git a/app/adm/validate/FlowCheck.php b/app/adm/validate/FlowCheck.php
new file mode 100644
index 0000000000000000000000000000000000000000..98505da83989623fb443794f5467d372949423a7
--- /dev/null
+++ b/app/adm/validate/FlowCheck.php
@@ -0,0 +1,34 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\adm\validate;
+
+use think\Validate;
+
+class FlowCheck extends Validate
+{
+    protected $rule = [
+        'title' => 'require',
+        'id' => 'require',
+    ];
+
+    protected $message = [
+        'title.require' => '流程名称不能为空',
+        'id.require' => '缺少更新条件',
+    ];
+
+    protected $scene = [
+        'add' => ['title',],
+        'edit' => ['id','title'],
+    ];
+}
diff --git a/app/adm/validate/MeetingCateCheck.php b/app/adm/validate/MeetingCateCheck.php
new file mode 100644
index 0000000000000000000000000000000000000000..469a46b6d2940e81d277fc740f2594f8f177eec7
--- /dev/null
+++ b/app/adm/validate/MeetingCateCheck.php
@@ -0,0 +1,35 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\adm\validate;
+
+use think\Validate;
+
+class MeetingCateCheck extends Validate
+{
+    protected $rule = [
+        'title' => 'require|unique:meeting_cate',
+        'id' => 'require',
+    ];
+
+    protected $message = [
+        'title.require' => '名称不能为空',
+        'title.unique' => '同样的名称已经存在',
+        'id.require' => '缺少更新条件',
+    ];
+
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['id', 'title'],
+    ];
+}
diff --git a/app/adm/validate/NewsValidate.php b/app/adm/validate/NewsValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..66f86b7296460392a4ab708ca3fe34d6ba90555e
--- /dev/null
+++ b/app/adm/validate/NewsValidate.php
@@ -0,0 +1,43 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\adm\validate;
+use think\Validate;
+use think\facade\Db;
+
+class NewsValidate extends Validate
+{
+	// 自定义验证规则
+	protected function checkOne($value,$rule,$data=[])
+	{
+		$id = isset($data['id'])?$data['id']:0;
+		$count = Db::name('News')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count();
+		return $count == 0 ? true : false;
+	}
+	
+    protected $rule = [
+		'title' => 'require|checkOne',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'title.require' => '名称不能为空',
+		'title.checkOne' => '同样的名称已经存在',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['title', 'id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/adm/validate/NoteValidate.php b/app/adm/validate/NoteValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..b88c9c09db41a9b90e20153511ad35bd05fc358f
--- /dev/null
+++ b/app/adm/validate/NoteValidate.php
@@ -0,0 +1,43 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\adm\validate;
+use think\Validate;
+use think\facade\Db;
+
+class NoteValidate extends Validate
+{
+	// 自定义验证规则
+	protected function checkOne($value,$rule,$data=[])
+	{
+		$id = isset($data['id'])?$data['id']:0;
+		$count = Db::name('Note')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count();
+		return $count == 0 ? true : false;
+	}
+	
+    protected $rule = [
+		'title' => 'require|checkOne',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'title.require' => '名称不能为空',
+		'title.checkOne' => '同样的名称已经存在',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['title', 'id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/adm/validate/NotecateValidate.php b/app/adm/validate/NotecateValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..7c767013b6fc8e33beb245cfb25d0dc315cd9be6
--- /dev/null
+++ b/app/adm/validate/NotecateValidate.php
@@ -0,0 +1,43 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\adm\validate;
+use think\Validate;
+use think\facade\Db;
+
+class NotecateValidate extends Validate
+{
+	// 自定义验证规则
+	protected function checkOne($value,$rule,$data=[])
+	{
+		$id = isset($data['id'])?$data['id']:0;
+		$count = Db::name('NoteCate')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count();
+		return $count == 0 ? true : false;
+	}
+	
+    protected $rule = [
+		'title' => 'require|checkOne',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'title.require' => '名称不能为空',
+		'title.checkOne' => '同样的名称已经存在',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['title', 'id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/adm/validate/PropertyCheck.php b/app/adm/validate/PropertyCheck.php
new file mode 100644
index 0000000000000000000000000000000000000000..45252d2a7502f3b7093413c5daa1a1507d1d33e9
--- /dev/null
+++ b/app/adm/validate/PropertyCheck.php
@@ -0,0 +1,35 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\adm\validate;
+
+use think\Validate;
+
+class PropertyCheck extends Validate
+{
+    protected $rule = [
+        'title' => 'require|unique:property',
+        'id' => 'require',
+    ];
+
+    protected $message = [
+        'title.require' => '名称不能为空',
+        'title.unique' => '同样的名称已经存在',
+        'id.require' => '缺少更新条件',
+    ];
+
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['id', 'title'],
+    ];
+}
diff --git a/app/adm/validate/SealCateCheck.php b/app/adm/validate/SealCateCheck.php
new file mode 100644
index 0000000000000000000000000000000000000000..a1c9a57c58babd9751c6d5f210f9d1a12ff352df
--- /dev/null
+++ b/app/adm/validate/SealCateCheck.php
@@ -0,0 +1,35 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\adm\validate;
+
+use think\Validate;
+
+class SealCateCheck extends Validate
+{
+    protected $rule = [
+        'title' => 'require|unique:seal_cate',
+        'id' => 'require',
+    ];
+
+    protected $message = [
+        'title.require' => '名称不能为空',
+        'title.unique' => '同样的名称已经存在',
+        'id.require' => '缺少更新条件',
+    ];
+
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['id', 'title'],
+    ];
+}
diff --git a/app/adm/view/basic/datalist.html b/app/adm/view/basic/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..bcb63707372589c3f41d3abc6a9ce47ee36d04fd
--- /dev/null
+++ b/app/adm/view/basic/datalist.html
@@ -0,0 +1,138 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-3">
+    <div class="layui-card">
+		<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
+			<ul class="layui-tab-title" style="border-bottom:none;">
+				<li class="layui-this" data-index="1">车辆费用类型</li>
+				<li data-index="2">其他</li>
+			</ul>
+			<div class="layui-tab-content" style="padding:0">
+				<table class="layui-hide" id="test" lay-filter="test"></table>
+			</div>
+		</div> 
+	</div> 
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm add-new" type="button">+ 新增内容</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool, element = layui.element,form = layui.form;
+		var data_type=1;
+		element.on('tab(tab)', function(data){
+			data_type = data.index+1;
+			layui.pageTable.reload({where:{types:data_type},page:{curr:1}});
+			return false;
+		});
+		
+		layui.pageTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,title:'基础数据列表'
+			,url: "/adm/basic/datalist"
+			,where:{types:data_type}
+			,page: false
+			,cellMinWidth: 80
+			,cols: [[
+					{field:'id',width:80, title: 'ID号', align:'center'}
+					,{field:'title',title: '名称'}
+					,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+						var html1='<span class="green">正常</span>';
+						var html2='<span class="yellow">禁用</span>';
+						if(d.status==1){
+							return html1;
+						}
+						else{
+							return html2;
+						}
+					}}
+					,{width:100,title: '操作', align:'center',templet: function(d){
+						var html='';
+						var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
+						var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+						var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+						if(d.status==1){
+							html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+						}
+						else{
+							html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+						}
+						return html;
+					}}
+				]]
+			});
+			
+			table.on('tool(test)',function (obj) {
+				if(obj.event === 'edit'){					
+					addExpense(obj.data.id,obj.data.title);
+				}
+				if(obj.event === 'disable'){
+					layer.confirm('确定要禁用该数据吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/adm/basic/set", { id: obj.data.id,status: 0,title: obj.data.title}, callback);
+						layer.close(index);
+					});
+				}
+				if(obj.event === 'open'){
+					layer.confirm('确定要启用该数据吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/adm/basic/set", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
+						layer.close(index);
+					});
+				}
+			});
+			
+			$('body').on('click','.add-new',function(){
+				addExpense(0,'');	
+			});
+			
+			function addExpense(id,val){
+				var title = '新增内容';
+				if(id>0){
+					title = '编辑内容';
+				}
+				layer.prompt({
+					title: title,
+					value: val,
+					yes: function(index, layero) {
+						// 获取文本框输入的值
+						var value = layero.find(".layui-layer-input").val();
+						if (value) {
+							let callback = function (e) {
+								layer.msg(e.msg);
+								if (e.code == 0) {
+									layui.pageTable.reload();				
+								}
+							}
+							tool.post("/adm/basic/add", {id: id,types:data_type,title: value}, callback);
+							layer.close(index);
+						} else {
+							layer.msg('请填写内容');
+						}
+					}
+				})
+			}
+		}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/car/add.html b/app/adm/view/car/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..ee3eecd2690e114dadfa2fc754ddec17a71a2905
--- /dev/null
+++ b/app/adm/view/car/add.html
@@ -0,0 +1,120 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-1">添加车辆信息</h3>
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">车辆名称<font>*</font></td>
+			<td><input type="text" name="title" autocomplete="off" placeholder="请输入车辆名称" lay-verify="required" lay-reqText="请输入车辆名称" class="layui-input"></td>
+			<td class="layui-td-gray">车牌号码<font>*</font></td>
+			<td><input type="text" name="name" autocomplete="off" placeholder="请输入车牌号码" lay-verify="required" lay-reqText="请输入车牌号码" class="layui-input"></td>
+			<td class="layui-td-gray-2" rowspan="5">
+				车辆缩略图
+				<button type="button" class="layui-btn layui-btn-sm" id="uploadImg">+ 上传图片</button>
+			</td>
+			<td rowspan="5" style="width:252px;">
+				  <div id="demo1" style="width: 240px; height:136px; overflow: hidden;">
+					<img src="" style="max-width: 100%; height:136px;" />
+					<input type="hidden" name="thumb" value="">
+				  </div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">购买日期<font>*</font></td>
+			<td><input type="text" name="buy_time" value='' readonly placeholder="请选择" lay-verify="required" lay-reqText="请选择购买日期" class="layui-input tool-time" data-max="0"></td>
+			<td class="layui-td-gray-2">购买价格<font>*</font></td>
+			<td><input type="text" name="price" value='' placeholder="请输入购买价格" lay-verify="required|number" lay-reqText="请输入购买价格" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">车身颜色<font>*</font></td>
+			<td><input type="text" name="color" value='' placeholder="请输入车身颜色" lay-verify="required" lay-reqText="请输入车身颜色" class="layui-input"></td>
+			<td class="layui-td-gray">座位数<font>*</font></td>
+			<td><input type="text" name="seats" autocomplete="off" placeholder="请输入座位数" lay-verify="required|number" lay-reqText="请输入座位数" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">发动机号<font>*</font></td>
+			<td><input type="text" name="engine" autocomplete="off" placeholder="请输入发动机号" lay-verify="required" lay-reqText="请输入发动机号" class="layui-input"></td>
+			<td class="layui-td-gray-2">车架号<font>*</font></td>
+			<td><input type="text" name="vin" value='' placeholder="请输入车架号" lay-verify="required" lay-reqText="请输入车架号" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">车险到期日期<font>*</font></td>
+			<td><input type="text" name="insure_time" value='' readonly placeholder="请选择" lay-verify="required" lay-reqText="请选择车险到期日期" class="layui-input tool-time"></td>
+			<td class="layui-td-gray-2">车审到期日期<font>*</font></td>
+			<td><input type="text" name="review_time" value='' readonly placeholder="请选择" lay-verify="required" lay-reqText="请选择车审到期日期" class="layui-input tool-time"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">车辆油耗<font>*</font></td>
+			<td><input type="text" name="oil" autocomplete="off" placeholder="请输入油耗" lay-verify="required" lay-reqText="请输入油耗" class="layui-input"></td>
+			<td class="layui-td-gray-2">开始里程数<font>*</font></td>
+			<td><input type="text" name="mileage" value='' placeholder="请输入开始里程数" lay-verify="required|number" lay-reqText="请输入开始里程数" class="layui-input"></td>
+			<td class="layui-td-gray-2">驾驶员</td>
+			<td><input type="text" name="driver_name" value='' readonly placeholder="请选择"class="layui-input picker-admin"><input type="hidden" name="driver" value='0'></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">
+				<div class="layui-input-inline">相关附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="">
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">备注信息</td>
+			<td colspan="5">
+				<textarea name="remark" placeholder="请输入备注信息" class="layui-textarea"></textarea>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-1">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','uploadPlus','oaPicker'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,uploadPlus= layui.uploadPlus;	
+		//单图上传
+		var photoUpload = new uploadPlus({
+			'use':'single',
+			'target':'uploadImg',
+			'callback':function(res){
+				layer.msg(res.msg);
+				if (res.code == 0) {
+					//上传成功
+					$('#demo1 input').attr('value', res.data.id);
+					$('#demo1 img').attr('src', res.data.filepath);
+				}
+			}
+		});
+
+		//相关附件上传
+		var attachment = new uploadPlus();
+		//监听提交
+		form.on('submit(webform)', function(data){
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);				
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/adm/car/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/car/datalist.html b/app/adm/view/car/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..d7cfd6a706651eccc45d034615c1342ce1798842
--- /dev/null
+++ b/app/adm/view/car/datalist.html
@@ -0,0 +1,109 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:300px">
+			<input type="text" name="keywords" placeholder="车辆名称/车牌号码" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_car" lay-filter="table_car"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm tool-add" type="button" data-href="/adm/car/add">+ 添加车辆</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool;
+		
+		layui.pageTable = table.render({
+			elem: "#table_car"
+			, toolbar: "#toolbarDemo"
+			,url: "/adm/car/datalist"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 60
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',title: '车辆名称',width:120}
+				,{field:'name',title: '车牌号码',width:100, align:'center'}
+				,{field:'buy_time',title: '购买日期',width:100, align:'center'}
+				,{field:'price',title: '购买价格',width:100, align:'center'}
+				,{field:'color',title: '车身颜色',width:80, align:'center'}
+				,{field:'seats',title: '座位数',width:60, align:'center'}
+				,{field:'driver_name',title: '驾驶员',width:80, align:'center'}
+				,{field:'oil',title: '油耗',width:60, align:'center'}
+				,{field:'mileage',title: '开始里程数',width:100, align:'center'}
+				,{field:'mileage_now',title: '当前里程数',width:100, align:'center'}
+				,{field:'insure_time',title: '保险到期日期',width:110, align:'center'}
+				,{field:'insure_time_note',title: '保险到期提醒',width:110, align:'center',templet: function(d){
+					var html = '<span class="red">还剩 '+d.insure_time_note+' 天</div>';
+					if(d.insure_time_note==0){
+						html = '<span class="red">已到期</div>';
+					}
+					return html;
+				}}
+				,{field:'review_time',title: '车审到期日期',width:110, align:'center'}
+				,{field:'review_time_note',title: '车审到期提醒',width:110, align:'center',templet: function(d){
+					var html = '<span class="red">还剩 '+d.review_time_note+' 天</div>';
+					if(d.review_time_note==0){
+						html = '<span class="red">已到期</div>';
+					}
+					return html;
+				}}
+				,{field:'create_time', title: '创建时间',width:150,align:'center'}
+				,{width:120,fixed:'right',title: '操作', align:'center',templet: function(d){
+					var html='';
+					var btn1='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详细</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn3='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
+					html = '<div class="layui-btn-group">'+btn1+btn2+btn3+'</div>';
+					return html;
+				}}
+			]]
+		});
+			
+		table.on('tool(table_car)',function (obj) {
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/adm/car/view?id="+data.id);
+				return;
+			}
+			if (obj.event === 'edit') {
+				tool.side("/adm/car/add?id="+data.id);
+				return;
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要删除该内容吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/adm/car/del", { id: data.id }, callback);
+					layer.close(index);
+				});
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/car/edit.html b/app/adm/view/car/edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..aaadc46ac1657b1a270fd810102974906f963a0b
--- /dev/null
+++ b/app/adm/view/car/edit.html
@@ -0,0 +1,126 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-1">编辑车辆信息</h3>
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">车辆名称<font>*</font></td>
+			<td><input type="text" name="title" value="{$detail.title}" autocomplete="off" placeholder="请输入车辆名称" lay-verify="required" lay-reqText="请输入车辆名称" class="layui-input"></td>
+			<td class="layui-td-gray">车牌号码<font>*</font></td>
+			<td><input type="text" name="name" value="{$detail.name}" autocomplete="off" placeholder="请输入车牌号码" lay-verify="required" lay-reqText="请输入车牌号码" class="layui-input"></td>
+			<td class="layui-td-gray-2" rowspan="5">
+				车辆缩略图
+				<button type="button" class="layui-btn layui-btn-sm" id="uploadImg">+ 上传图片</button>
+			</td>
+			<td rowspan="5" style="width:252px;">
+			    <div id="demo1" style="width: 240px; height:136px; overflow: hidden;">
+					<img src="{:get_file($detail.thumb)}" style="max-width: 100%; height:136px;" />
+					<input type="hidden" name="thumb" value="{$detail.thumb}">
+			    </div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">购买日期<font>*</font></td>
+			<td><input type="text" name="buy_time" value="{$detail.buy_time|date='Y-m-d'}" readonly placeholder="请选择" lay-verify="required" lay-reqText="请选择购买日期" class="layui-input tool-time"  data-max="0"></td>
+			<td class="layui-td-gray-2">购买价格(元)<font>*</font></td>
+			<td><input type="text" name="price" value="{$detail.price}" placeholder="请输入购买价格" lay-verify="required|number" lay-reqText="请输入购买价格" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">车身颜色<font>*</font></td>
+			<td><input type="text" name="color" value="{$detail.color}" placeholder="请输入车身颜色" lay-verify="required" lay-reqText="请输入车身颜色" class="layui-input"></td>
+			<td class="layui-td-gray">座位数<font>*</font></td>
+			<td><input type="text" name="seats" value="{$detail.seats}" autocomplete="off" placeholder="请输入座位数" lay-verify="required|number" lay-reqText="请输入座位数" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">发动机号<font>*</font></td>
+			<td><input type="text" name="engine" value="{$detail.engine}" autocomplete="off" placeholder="请输入发动机号" lay-verify="required" lay-reqText="请输入发动机号" class="layui-input"></td>
+			<td class="layui-td-gray-2">车架号<font>*</font></td>
+			<td><input type="text" name="vin" value="{$detail.vin}" placeholder="请输入车架号" lay-verify="required" lay-reqText="请输入车架号" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">车险到期日期<font>*</font></td>
+			<td><input type="text" name="insure_time" value="{$detail.insure_time|date='Y-m-d'}" readonly placeholder="请选择" lay-verify="required" lay-reqText="请选择车险到期日期" class="layui-input tool-time"></td>
+			<td class="layui-td-gray-2">车审到期日期<font>*</font></td>
+			<td><input type="text" name="review_time" value="{$detail.review_time|date='Y-m-d'}" readonly placeholder="请选择" lay-verify="required" lay-reqText="请选择车审到期日期" class="layui-input tool-time"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">车辆油耗<font>*</font></td>
+			<td><input type="text" name="oil" value="{$detail.oil}" autocomplete="off" placeholder="请输入油耗" lay-verify="required" lay-reqText="请输入油耗" class="layui-input"></td>
+			<td class="layui-td-gray-2">开始里程数</td>
+			<td>{$detail.mileage}</td>
+			<td class="layui-td-gray-2">驾驶员</td>
+			<td><input type="text" name="driver_name" value="{$detail.driver_name|default=''}" readonly placeholder="请选择"class="layui-input picker-admin"><input type="hidden" name="driver" value="{$detail.driver}"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">
+				<div class="layui-input-inline">相关附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids}">
+					{notempty name="$detail.file_ids"}
+					{volist name="$detail.file_array" id="vo"}
+						<div class="layui-col-md4" id="uploadFile{$vo.id}">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">备注信息</td>
+			<td colspan="5">
+				<textarea name="remark" placeholder="请输入备注信息" class="layui-textarea">{$detail.remark|default=''}</textarea>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-1">
+		<input type="hidden" name="id" value="{$detail.id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','uploadPlus','oaPicker'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,uploadPlus= layui.uploadPlus;	
+		//单图上传
+		var photoUpload = new uploadPlus({
+			'use':'single',
+			'target':'uploadImg',
+			'callback':function(res){
+				layer.msg(res.msg);
+				if (res.code == 0) {
+					//上传成功
+					$('#demo1 input').attr('value', res.data.id);
+					$('#demo1 img').attr('src', res.data.filepath);
+				}
+			}
+		});
+
+		//相关附件上传
+		var attachment = new uploadPlus();
+		//监听提交
+		form.on('submit(webform)', function(data){
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);				
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/adm/car/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/car/fee_add.html b/app/adm/view/car/fee_add.html
new file mode 100644
index 0000000000000000000000000000000000000000..448cfc5a3fea6fc8690837060018eff16913af61
--- /dev/null
+++ b/app/adm/view/car/fee_add.html
@@ -0,0 +1,111 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-1">新增车辆收费记录</h3>
+	<table class="layui-table">
+		{eq name="$cid" value="0"}
+		<tr>
+			<td class="layui-td-gray">车辆名称<font>*</font></td>
+			<td colspan="3">
+				<input type="text" name="car_name" autocomplete="off" readonly lay-verify="required" lay-reqText="请选择车辆" placeholder="请选择" class="layui-input picker-oa" data-types="car">
+				<input type="hidden" name="car_id" value="">
+			</td>
+			<td class="layui-td-gray">费用类型<font>*</font></td>
+			<td>
+				<select name="types" lay-verify="required" lay-reqText="选择费用类型">
+				<option value="">选择费用类型</option>
+				{volist name=":get_base_data('basicAdm')" id="vo"}
+					<option value="{$vo.id}">{$vo.title}</option>
+				{/volist}
+			</select>
+			</td>
+		</tr>
+		{else/}
+		<tr>
+			<td class="layui-td-gray">车辆名称</td>
+			<td colspan="3">{$car.title}</td>
+			<td class="layui-td-gray">费用类型<font>*</font></td>
+			<td>
+				<select name="types" lay-verify="required" lay-reqText="选择费用类型">
+				<option value="">选择费用类型</option>
+				{volist name=":get_base_data('basicAdm')" id="vo"}
+					<option value="{$vo.id}">{$vo.title}</option>
+				{/volist}
+			</select>
+			</td>
+		</tr>
+		{/eq}
+		<tr>
+			<td class="layui-td-gray">费用主题<font>*</font></td>
+			<td colspan="5">
+				<input type="text" name="title" autocomplete="off" lay-verify="required" lay-reqText="请完善费用主题" placeholder="请完善费用主题" class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">收费日期<font>*</font></td>
+			<td><input type="text" name="fee_time" autocomplete="off" readonly placeholder="请选择收费日期" class="layui-input tool-time" data-max="0"></td>
+			<td class="layui-td-gray">费用金额<font>*</font></td>
+			<td><input type="text" name="amount" autocomplete="off" placeholder="请输入费用金额" lay-verify="required|number" lay-reqText="请输入费用金额" class="layui-input"></td>
+			<td class="layui-td-gray">经手人<font>*</font></td>
+			<td>
+				<input type="text" name="handled_name" autocomplete="off" readonly lay-verify="required" lay-reqText="请选择经手人" placeholder="请选择" class="layui-input picker-admin">
+				<input type="hidden" name="handled">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">
+				<div class="layui-input-inline">相关附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="">
+				</div>
+			</td>
+		</tr> 
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">收费内容</td>
+			<td colspan="5">
+				<textarea name="content" placeholder="请输入收费内容" class="layui-textarea"></textarea>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-2">
+		{gt name="$cid" value="0"}
+		<input type="hidden" name="car_id" value="{$cid}">
+		{/gt}
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool','uploadPlus','oaPicker'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool,uploadPlus = layui.uploadPlus;
+	//相关附件上传
+	var attachment = new uploadPlus();
+	
+	//监听提交
+	form.on('submit(webform)', function(data){
+		let callback = function (e) {
+			layer.msg(e.msg);
+			if (e.code == 0) {
+				tool.sideClose(1000,'feeTable');				
+			}
+		}
+		let clickbtn = $(this);
+		tool.post("/adm/car/fee_add", data.field, callback,clickbtn);
+		return false;
+	});
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/car/fee_edit.html b/app/adm/view/car/fee_edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..c90d47a1e946df5aa85862006f9087fda2f72cdc
--- /dev/null
+++ b/app/adm/view/car/fee_edit.html
@@ -0,0 +1,95 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-1">编辑车辆费用记录</h3>
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">车辆名称</td>
+			<td colspan="3">{$detail.car}</td>
+			<td class="layui-td-gray">费用类型<font>*</font></td>
+			<td>
+				<select name="types" lay-verify="required" lay-reqText="选择费用类型">
+				<option value="">选择费用类型</option>
+				{volist name=":get_base_data('basicAdm')" id="vo"}
+					<option value="{$vo.id}" {eq name="$vo.id" value="$detail.types"} selected{/eq}>{$vo.title}</option>
+				{/volist}
+			</select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">费用主题<font>*</font></td>
+			<td colspan="5">
+				<input type="text" name="title" value="{$detail.title}" autocomplete="off" lay-verify="required" lay-reqText="请完善费用主题" placeholder="请完善费用主题" class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">费用日期</td>
+			<td><input type="text" name="fee_time" readonly value="{$detail.fee_time|date='Y-m-d'}" autocomplete="off" readonly placeholder="请选择费用日期" class="layui-input tool-time"></td>
+			<td class="layui-td-gray">费用金额<font>*</font></td>
+			<td><input type="text" name="amount" value="{$detail.amount}" autocomplete="off" placeholder="请输入费用金额" lay-verify="required|number" lay-reqText="请输入费用金额" class="layui-input"></td>
+			<td class="layui-td-gray">经手人</td>
+			<td>
+				<input type="text" name="handled_name" value="{$detail.handled_name}" autocomplete="off" readonly lay-verify="required" lay-reqText="请选择经手人" class="layui-input picker-admin">
+				<input type="hidden" name="handled" value="{$detail.handled}">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">
+				<div class="layui-input-inline">相关附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids}">
+					{notempty name="$detail.fileArray"}
+					{volist name="$detail.fileArray" id="vo"}
+					<div class="layui-col-md4" id="fileItem{$vo.id}">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr> 
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">费用内容</td>
+			<td colspan="5">
+				<textarea name="content" placeholder="请输入费用内容" class="layui-textarea">{$detail.content|default=''}</textarea>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-2">
+		<input type="hidden" name="id" value="{$detail.id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool','uploadPlus','oaPicker'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool,uploadPlus = layui.uploadPlus;
+	//相关附件上传
+	var attachment = new uploadPlus();
+	
+	//监听提交
+	form.on('submit(webform)', function(data){
+		let callback = function (e) {
+			layer.msg(e.msg);
+			if (e.code == 0) {
+				tool.sideClose(1000,'feeTable');				
+			}
+		}
+		let clickbtn = $(this);
+		tool.post("/adm/car/fee_add", data.field, callback,clickbtn);
+		return false;
+	});
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/car/fee_list.html b/app/adm/view/car/fee_list.html
new file mode 100644
index 0000000000000000000000000000000000000000..15f713b542843db84e77a045e1450dcbb6e4c481
--- /dev/null
+++ b/app/adm/view/car/fee_list.html
@@ -0,0 +1,93 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page" style="height:100%; box-sizing: border-box;">
+	<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:300px;">
+			<input type="text" class="layui-input" id="diff_time" placeholder="费用日期" readonly name="diff_time">
+		</div>
+		<div class="layui-input-inline" style="width:136px;">
+			<select name="types">
+				<option value="">选择费用类型</option>
+				{volist name=":get_base_data('basicAdm')" id="vo"}
+					<option value="{$vo.id}">{$vo.title}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:300px">
+			<input type="text" name="keywords" placeholder="输入关键字" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm tool-add" type="button" data-href="/adm/car/fee_add">+ 添加收费记录</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+{block name="copyright"}{/block}
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool','tablePlus','laydatePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool,form = layui.form,laydatePlus = layui.laydatePlus;	
+		var diff_time = new laydatePlus({'target':'diff_time'});		
+		
+		layui.feeTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,title:'收费记录列表'
+			,url: "/adm/car/fee_list"
+			,is_excel: true
+			,page: true
+			,cellMinWidth: 60
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',minWidth:300,title: '费用主题'}
+				,{field:'fee_time',title: '费用日期',align: 'center',width: 100}
+				,{field:'types_str',title: '费用类型',align: 'center',width: 100}
+				,{field:'amount',width:100, title: '费用金额(元)', align:'center',style:"color:#16b777"}
+				,{field:'car',width:120,title: '车辆名称'}
+				,{field:'name',width:100, title: '车牌号码', align:'center'}
+				,{field:'handled_name',title: '跟进人',align: 'center',width: 80}
+				,{field:'create_time',title: '记录时间',align: 'center',width: 130}
+				,{width:120,fixed:'right', title: '操作', align:'center',templet: function(d){
+					var html='<div class="layui-btn-group"><a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a><a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</a><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></div>';
+					return html;
+				}}
+			]]
+		});
+		
+		table.on('tool(test)',function (obj) {
+			var that = this;
+			if(obj.event === 'edit'){					
+				tool.side("/adm/car/fee_add?id="+obj.data.id);
+			}
+			if(obj.event === 'view'){					
+				tool.side("/adm/car/fee_view?id="+obj.data.id);
+			}
+			if(obj.event === 'del'){
+				layer.confirm('确定要删除该收费记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.feeTable.reload();
+						}
+					}
+					tool.post("/adm/car/fee_del", {id: obj.data.id}, callback);
+					layer.close(index);
+				});
+				return;
+			}
+		});
+	}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/car/fee_view.html b/app/adm/view/car/fee_view.html
new file mode 100644
index 0000000000000000000000000000000000000000..52ace3389470ecd81fb119fd317706045ab7f8c0
--- /dev/null
+++ b/app/adm/view/car/fee_view.html
@@ -0,0 +1,56 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-1">车辆收费记录</h3>
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">车辆名称</td>
+			<td colspan="3">{$detail.car}</td>
+			<td class="layui-td-gray">收费地点</td>
+			<td>{$detail.types_str}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">费用主题</td>
+			<td colspan="5">{$detail.title}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">收费日期</td>
+			<td>{$detail.fee_time|date='Y-m-d'}</td>
+			<td class="layui-td-gray">收费费用</td>
+			<td>{$detail.amount}</td>
+			<td class="layui-td-gray">跟进人</td>
+			<td>{$detail.handled_name}</td>
+		</tr>
+		{notempty name="$detail.fileArray"}
+		<tr>
+			<td class="layui-td-gray">相关附件</div></td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">					
+					{volist name="$detail.fileArray" id="vo"}
+					<div class="layui-col-md4" id="fileItem{$vo.id}">{:file_card($vo,'view')}</div>
+					{/volist}					
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">费用内容</td>
+			<td colspan="5">{$detail.content|default=''}</td>
+		</tr>
+	</table>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool;
+	
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/car/protect_add.html b/app/adm/view/car/protect_add.html
new file mode 100644
index 0000000000000000000000000000000000000000..74baf2ad7c61e1dfd2cbeebc69f16d07175b6f3d
--- /dev/null
+++ b/app/adm/view/car/protect_add.html
@@ -0,0 +1,95 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-1">新增车辆保养记录</h3>
+	<table class="layui-table">
+		{eq name="$cid" value="0"}
+		<tr>
+			<td class="layui-td-gray">车辆名称<font>*</font></td>
+			<td>
+				<input type="text" name="car_name" autocomplete="off" readonly lay-verify="required" lay-reqText="请选择车辆" placeholder="请选择" class="layui-input picker-oa" data-types="car">
+				<input type="hidden" name="car_id" value="">
+			</td>
+			<td class="layui-td-gray">保养地点<font>*</font></td>
+			<td colspan="3">
+				<input type="text" name="address" autocomplete="off" lay-verify="required" lay-reqText="请完善保养地点" placeholder="请完善保养地点" class="layui-input">
+			</td>
+		</tr>
+		{else/}
+		<tr>
+			<td class="layui-td-gray">车辆名称</td>
+			<td>{$car.title}</td>
+			<td class="layui-td-gray">保养地点<font>*</font></td>
+			<td colspan="3">
+				<input type="text" name="address" autocomplete="off" lay-verify="required" lay-reqText="请完善保养地点" placeholder="请完善保养地点" class="layui-input">
+			</td>
+		</tr>
+		{/eq}
+		<tr>
+			<td class="layui-td-gray">保养日期<font>*</font></td>
+			<td><input type="text" name="repair_time" autocomplete="off" readonly placeholder="请选择保养日期" class="layui-input tool-time" data-max="0"></td>
+			<td class="layui-td-gray">保养费用<font>*</font></td>
+			<td><input type="text" name="amount" autocomplete="off" placeholder="请输入保养费用" lay-verify="required|number" lay-reqText="请输入保养费用" class="layui-input"></td>
+			<td class="layui-td-gray">经手人<font>*</font></td>
+			<td>
+				<input type="text" name="handled_name" autocomplete="off" readonly lay-verify="required" lay-reqText="请选择经手人" placeholder="请选择" class="layui-input picker-admin">
+				<input type="hidden" name="handled">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">
+				<div class="layui-input-inline">相关附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="">
+				</div>
+			</td>
+		</tr> 
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">保养内容</td>
+			<td colspan="5">
+				<textarea name="content" placeholder="请输入保养内容" class="layui-textarea"></textarea>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-2">
+		{gt name="$cid" value="0"}
+		<input type="hidden" name="car_id" value="{$cid}">
+		{/gt}
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool','uploadPlus','oaPicker'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool,uploadPlus = layui.uploadPlus;
+	//相关附件上传
+	var attachment = new uploadPlus();
+	
+	//监听提交
+	form.on('submit(webform)', function(data){
+		let callback = function (e) {
+			layer.msg(e.msg);
+			if (e.code == 0) {
+				tool.sideClose(1000,'protectTable');				
+			}
+		}
+		let clickbtn = $(this);
+		tool.post("/adm/car/protect_add", data.field, callback,clickbtn);
+		return false;
+	});
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/car/protect_edit.html b/app/adm/view/car/protect_edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..b9833f0d3f481e6bd56c89a2aed2e37dff19fd6f
--- /dev/null
+++ b/app/adm/view/car/protect_edit.html
@@ -0,0 +1,84 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-1">编辑车辆保养记录</h3>
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">车辆名称</td>
+			<td>{$detail.car}</td>
+			<td class="layui-td-gray">保养地点<font>*</font></td>
+			<td colspan="3">
+				<input type="text" name="address" autocomplete="off" value="{$detail.address}" lay-verify="required" lay-reqText="请完善保养地点" placeholder="请完善保养地点" class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">保养日期</td>
+			<td><input type="text" name="repair_time" readonly value="{$detail.repair_time|date='Y-m-d'}" autocomplete="off" readonly placeholder="请选择保养日期" class="layui-input tool-time" data-max="0"></td>
+			<td class="layui-td-gray">保养费用<font>*</font></td>
+			<td><input type="text" name="amount" value="{$detail.amount}" autocomplete="off" placeholder="请输入保养费用" lay-verify="required|number" lay-reqText="请输入保养费用" class="layui-input"></td>
+			<td class="layui-td-gray">经手人</td>
+			<td>
+				<input type="text" name="handled_name" value="{$detail.handled_name}" autocomplete="off" readonly lay-verify="required" lay-reqText="请选择经手人" class="layui-input picker-admin">
+				<input type="hidden" name="handled" value="{$detail.handled}">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">
+				<div class="layui-input-inline">相关附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids}">
+					{notempty name="$detail.fileArray"}
+					{volist name="$detail.fileArray" id="vo"}
+					<div class="layui-col-md4" id="fileItem{$vo.id}">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr> 
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">保养内容</td>
+			<td colspan="5">
+				<textarea name="content" placeholder="请输入保养内容" class="layui-textarea">{$detail.content|default=''}</textarea>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-2">
+		<input type="hidden" name="id" value="{$detail.id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool','uploadPlus','oaPicker'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool,uploadPlus = layui.uploadPlus;
+	//相关附件上传
+	var attachment = new uploadPlus();
+	
+	//监听提交
+	form.on('submit(webform)', function(data){
+		let callback = function (e) {
+			layer.msg(e.msg);
+			if (e.code == 0) {
+				tool.sideClose(1000,'protectTable');				
+			}
+		}
+		let clickbtn = $(this);
+		tool.post("/adm/car/protect_add", data.field, callback,clickbtn);
+		return false;
+	});
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/car/protect_list.html b/app/adm/view/car/protect_list.html
new file mode 100644
index 0000000000000000000000000000000000000000..4b249fe562533d3596d6355d5faff9161db92254
--- /dev/null
+++ b/app/adm/view/car/protect_list.html
@@ -0,0 +1,84 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page" style="height:100%; box-sizing: border-box;">
+	<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:300px;">
+			<input type="text" class="layui-input" id="diff_time" placeholder="保养日期" readonly name="diff_time">
+		</div>
+		<div class="layui-input-inline" style="width:300px">
+			<input type="text" name="keywords" placeholder="输入关键字" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="protectTable" lay-filter="protectTable"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm tool-add" type="button" data-href="/adm/car/protect_add">+ 添加保养记录</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+{block name="copyright"}{/block}
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool','tablePlus','laydatePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool,form = layui.form,laydatePlus = layui.laydatePlus;	
+		var diff_time = new laydatePlus({'target':'diff_time'});		
+		
+		layui.protectTable = table.render({
+			elem: '#protectTable'
+			,toolbar: '#toolbarDemo'
+			,title:'保养记录列表'
+			,url: "/adm/car/protect_list"
+			,is_excel: true
+			,page: true
+			,cellMinWidth: 60
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'repair_time',title: '保养日期',align: 'center',width: 100}
+				,{field:'amount',width:100, title: '保养费用(元)', align:'center',style:"color:#16b777"}
+				,{field:'car',width:120,title: '车辆名称'}
+				,{field:'name',width:100, title: '车牌号码', align:'center'}
+				,{field:'content',minWidth:300,title: '保养内容'}
+				,{field:'handled_name',title: '跟进人',align: 'center',width: 80}
+				,{field:'create_time',title: '记录时间',align: 'center',width: 130}
+				,{width:120,fixed:'right', title: '操作', align:'center',templet: function(d){
+					var html='<div class="layui-btn-group"><a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a><a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</a><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></div>';
+					return html;
+				}}
+			]]
+		});
+		
+		table.on('tool(protectTable)',function (obj) {
+			var that = this;
+			if(obj.event === 'edit'){					
+				tool.side("/adm/car/protect_add?id="+obj.data.id);
+			}
+			if(obj.event === 'view'){					
+				tool.side("/adm/car/protect_view?id="+obj.data.id);
+			}
+			if(obj.event === 'del'){
+				layer.confirm('确定要删除该保养记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.protectTable.reload();
+						}
+					}
+					tool.post("/adm/car/protect_del", {id: obj.data.id}, callback);
+					layer.close(index);
+				});
+				return;
+			}
+		});
+	}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/car/protect_view.html b/app/adm/view/car/protect_view.html
new file mode 100644
index 0000000000000000000000000000000000000000..0569836effc9cfe10dc92f933c4f98c9598c2b01
--- /dev/null
+++ b/app/adm/view/car/protect_view.html
@@ -0,0 +1,52 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-1">车辆保养记录</h3>
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">车辆名称</td>
+			<td>{$detail.car}</td>
+			<td class="layui-td-gray">保养地点</td>
+			<td colspan="3">{$detail.address}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">保养日期</td>
+			<td>{$detail.repair_time|date='Y-m-d'}</td>
+			<td class="layui-td-gray">保养费用</td>
+			<td>{$detail.amount}</td>
+			<td class="layui-td-gray">跟进人</td>
+			<td>{$detail.handled_name}</td>
+		</tr>
+		{notempty name="$detail.fileArray"}
+		<tr>
+			<td class="layui-td-gray">相关附件</div></td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">					
+					{volist name="$detail.fileArray" id="vo"}
+					<div class="layui-col-md4" id="fileItem{$vo.id}">{:file_card($vo,'view')}</div>
+					{/volist}					
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+		<tr>
+			<td class="layui-td-gray-2" style="vertical-align:top;">保养原因&内容</td>
+			<td colspan="5">{$detail.content|default=''}</td>
+		</tr>
+	</table>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool;
+	
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/car/repair_add.html b/app/adm/view/car/repair_add.html
new file mode 100644
index 0000000000000000000000000000000000000000..98e0237ecbe4556e93fabf87b6ea0c4e2c247c0e
--- /dev/null
+++ b/app/adm/view/car/repair_add.html
@@ -0,0 +1,95 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-1">新增车辆维修记录</h3>
+	<table class="layui-table">
+		{eq name="$cid" value="0"}
+		<tr>
+			<td class="layui-td-gray">车辆名称<font>*</font></td>
+			<td>
+				<input type="text" name="car_name" autocomplete="off" readonly lay-verify="required" lay-reqText="请选择车辆" placeholder="请选择" class="layui-input picker-oa" data-types="car">
+				<input type="hidden" name="car_id" value="">
+			</td>
+			<td class="layui-td-gray">维修地点<font>*</font></td>
+			<td colspan="3">
+				<input type="text" name="address" autocomplete="off" lay-verify="required" lay-reqText="请完善维修地点" placeholder="请完善维修地点" class="layui-input">
+			</td>
+		</tr>
+		{else/}
+		<tr>
+			<td class="layui-td-gray">车辆名称</td>
+			<td>{$car.title}</td>
+			<td class="layui-td-gray">维修地点<font>*</font></td>
+			<td colspan="3">
+				<input type="text" name="address" autocomplete="off" lay-verify="required" lay-reqText="请完善维修地点" placeholder="请完善维修地点" class="layui-input">
+			</td>
+		</tr>
+		{/eq}
+		<tr>
+			<td class="layui-td-gray">维修日期<font>*</font></td>
+			<td><input type="text" name="repair_time" autocomplete="off" readonly placeholder="请选择维修日期" class="layui-input tool-time" data-max="0"></td>
+			<td class="layui-td-gray">维修费用<font>*</font></td>
+			<td><input type="text" name="amount" autocomplete="off" placeholder="请输入维修费用" lay-verify="required|number" lay-reqText="请输入维修费用" class="layui-input"></td>
+			<td class="layui-td-gray">经手人<font>*</font></td>
+			<td>
+				<input type="text" name="handled_name" autocomplete="off" readonly lay-verify="required" lay-reqText="请选择经手人" placeholder="请选择" class="layui-input picker-admin">
+				<input type="hidden" name="handled">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">
+				<div class="layui-input-inline">相关附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="">
+				</div>
+			</td>
+		</tr> 
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">维修原因</td>
+			<td colspan="5">
+				<textarea name="content" placeholder="请输入维修原因" class="layui-textarea"></textarea>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-2">
+		{gt name="$cid" value="0"}
+		<input type="hidden" name="car_id" value="{$cid}">
+		{/gt}
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool','uploadPlus','oaPicker'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool,uploadPlus = layui.uploadPlus;
+	//相关附件上传
+	var attachment = new uploadPlus();
+	
+	//监听提交
+	form.on('submit(webform)', function(data){
+		let callback = function (e) {
+			layer.msg(e.msg);
+			if (e.code == 0) {
+				tool.sideClose(1000,'repairTable');				
+			}
+		}
+		let clickbtn = $(this);
+		tool.post("/adm/car/repair_add", data.field, callback,clickbtn);
+		return false;
+	});
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/car/repair_edit.html b/app/adm/view/car/repair_edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..59fa203bf17b52c5b3b9981034a528b09aa91f14
--- /dev/null
+++ b/app/adm/view/car/repair_edit.html
@@ -0,0 +1,84 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-1">编辑车辆维修记录</h3>
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">车辆名称</td>
+			<td>{$detail.car}</td>
+			<td class="layui-td-gray">维修地点<font>*</font></td>
+			<td colspan="3">
+				<input type="text" name="address" autocomplete="off" value="{$detail.address}" lay-verify="required" lay-reqText="请完善维修地点" placeholder="请完善维修地点" class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">维修日期</td>
+			<td><input type="text" name="repair_time" readonly value="{$detail.repair_time|date='Y-m-d'}" autocomplete="off" readonly placeholder="请选择维修日期" class="layui-input tool-time" data-max="0"></td>
+			<td class="layui-td-gray">维修费用<font>*</font></td>
+			<td><input type="text" name="amount" value="{$detail.amount}" autocomplete="off" placeholder="请输入维修费用" lay-verify="required|number" lay-reqText="请输入维修费用" class="layui-input"></td>
+			<td class="layui-td-gray">经手人</td>
+			<td>
+				<input type="text" name="handled_name" value="{$detail.handled_name}" autocomplete="off" readonly lay-verify="required" lay-reqText="请选择经手人" class="layui-input picker-admin">
+				<input type="hidden" name="handled" value="{$detail.handled}">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">
+				<div class="layui-input-inline">相关附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids}">
+					{notempty name="$detail.fileArray"}
+					{volist name="$detail.fileArray" id="vo"}
+					<div class="layui-col-md4" id="fileItem{$vo.id}">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr> 
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">维修原因</td>
+			<td colspan="5">
+				<textarea name="content" placeholder="请输入维修原因" class="layui-textarea">{$detail.content|default=''}</textarea>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-2">
+		<input type="hidden" name="id" value="{$detail.id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool','uploadPlus','oaPicker'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool,uploadPlus = layui.uploadPlus;
+	//相关附件上传
+	var attachment = new uploadPlus();
+	
+	//监听提交
+	form.on('submit(webform)', function(data){
+		let callback = function (e) {
+			layer.msg(e.msg);
+			if (e.code == 0) {
+				tool.sideClose(1000,'repairTable');				
+			}
+		}
+		let clickbtn = $(this);
+		tool.post("/adm/car/repair_add", data.field, callback,clickbtn);
+		return false;
+	});
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/car/repair_list.html b/app/adm/view/car/repair_list.html
new file mode 100644
index 0000000000000000000000000000000000000000..b67d27e09a36cad7fa479411f7c8d967f8d38eca
--- /dev/null
+++ b/app/adm/view/car/repair_list.html
@@ -0,0 +1,84 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page" style="height:100%; box-sizing: border-box;">
+	<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:300px;">
+			<input type="text" class="layui-input" id="diff_time" placeholder="维修日期" readonly name="diff_time">
+		</div>
+		<div class="layui-input-inline" style="width:300px">
+			<input type="text" name="keywords" placeholder="输入关键字" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm tool-add" type="button" data-href="/adm/car/repair_add">+ 添加维修记录</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+{block name="copyright"}{/block}
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool','tablePlus','laydatePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool,form = layui.form,laydatePlus = layui.laydatePlus;	
+		var diff_time = new laydatePlus({'target':'diff_time'});		
+		
+		layui.repairTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,title:'维修记录列表'
+			,url: "/adm/car/repair_list"
+			,is_excel: true
+			,page: true
+			,cellMinWidth: 60
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'repair_time',title: '维修日期',align: 'center',width: 100}
+				,{field:'amount',width:100, title: '维修费用(元)', align:'center',style:"color:#16b777"}
+				,{field:'car',width:120,title: '车辆名称'}
+				,{field:'name',width:100, title: '车牌号码', align:'center'}
+				,{field:'content',minWidth:300,title: '维修内容'}
+				,{field:'handled_name',title: '跟进人',align: 'center',width: 80}
+				,{field:'create_time',title: '记录时间',align: 'center',width: 130}
+				,{width:120,fixed:'right', title: '操作', align:'center',templet: function(d){
+					var html='<div class="layui-btn-group"><a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a><a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</a><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></div>';
+					return html;
+				}}
+			]]
+		});
+		
+		table.on('tool(test)',function (obj) {
+			var that = this;
+			if(obj.event === 'edit'){					
+				tool.side("/adm/car/repair_add?id="+obj.data.id);
+			}
+			if(obj.event === 'view'){					
+				tool.side("/adm/car/repair_view?id="+obj.data.id);
+			}
+			if(obj.event === 'del'){
+				layer.confirm('确定要删除该维修记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.repairTable.reload();
+						}
+					}
+					tool.post("/adm/car/repair_del", {id: obj.data.id}, callback);
+					layer.close(index);
+				});
+				return;
+			}
+		});
+	}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/car/repair_view.html b/app/adm/view/car/repair_view.html
new file mode 100644
index 0000000000000000000000000000000000000000..894ea17a42817b385af535a9f3825d2d0a6c1e48
--- /dev/null
+++ b/app/adm/view/car/repair_view.html
@@ -0,0 +1,52 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-1">车辆维修记录</h3>
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">车辆名称</td>
+			<td>{$detail.car}</td>
+			<td class="layui-td-gray">维修地点</td>
+			<td colspan="3">{$detail.address}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">维修日期</td>
+			<td>{$detail.repair_time|date='Y-m-d'}</td>
+			<td class="layui-td-gray">维修费用</td>
+			<td>{$detail.amount}</td>
+			<td class="layui-td-gray">跟进人</td>
+			<td>{$detail.handled_name}</td>
+		</tr>
+		{notempty name="$detail.fileArray"}
+		<tr>
+			<td class="layui-td-gray">相关附件</div></td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">					
+					{volist name="$detail.fileArray" id="vo"}
+					<div class="layui-col-md4" id="fileItem{$vo.id}">{:file_card($vo,'view')}</div>
+					{/volist}					
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">维修原因</td>
+			<td colspan="5">{$detail.content|default=''}</td>
+		</tr>
+	</table>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool;
+	
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/car/view.html b/app/adm/view/car/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..4bd15105af76a49512023027c41ecac7e8359015
--- /dev/null
+++ b/app/adm/view/car/view.html
@@ -0,0 +1,359 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<h3 class="pb-3">车辆信息详情</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">车辆名称</td>
+			<td>{$detail.title}</td>
+			<td class="layui-td-gray">车牌号码</td>
+			<td>{$detail.name}</td>
+			<td class="layui-td-gray-2" rowspan="5">车辆缩略图</td>
+			<td rowspan="5" style="width:252px;">
+			    <div id="demo1" style="width: 240px; height:136px; overflow: hidden;">
+					<img src="{:get_file($detail.thumb)}" style="max-width: 100%; height:136px;" />
+			    </div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">购买日期</td>
+			<td>{$detail.buy_time|date='Y-m-d'}</td>
+			<td class="layui-td-gray-2">购买价格</td>
+			<td>{$detail.price}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">车身颜色</td>
+			<td>{$detail.color}</td>
+			<td class="layui-td-gray">座位数</td>
+			<td>{$detail.seats}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">发动机号</td>
+			<td>{$detail.engine}</td>
+			<td class="layui-td-gray-2">车架号</td>
+			<td>{$detail.vin}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">车险到期日期</td>
+			<td>{$detail.insure_time|date='Y-m-d'}</td>
+			<td class="layui-td-gray-2">车审到期日期</td>
+			<td>{$detail.review_time|date='Y-m-d'}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">车辆油耗</td>
+			<td>{$detail.oil}</td>
+			<td class="layui-td-gray-2">当前里程数</td>
+			<td>{$detail.latestMileage}（开始里程数：{$detail.mileage}）</td>
+			<td class="layui-td-gray-2">驾驶员</td>
+			<td>{$detail.driver_name|default=''}</td>
+		</tr>
+		{notempty name="$detail.remark"}
+		<tr>
+			<td class="layui-td-gray">备注信息</td>
+			<td colspan="5">{$detail.remark|default=''}</td>
+		</tr>
+		{/notempty}
+		{notempty name="$detail.file_ids"}
+		<tr>
+			<td colspan="6"><strong>相关附件<strong></td>
+		</tr>
+		<tr>
+			<td colspan="6" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">					
+					{volist name="$detail.file_array" id="vo"}
+						<div class="layui-col-md4" id="uploadFile{$vo.id}">{:file_card($vo,'view')}</div>
+					{/volist}					
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+		<tr>
+			<td colspan="6"><strong>里程记录<strong> <span class="layui-btn layui-btn-xs add-mileage">+ 里程记录</span></td>
+		</tr>
+		<tr>
+			<td colspan="6"><table class="layui-hide" id="mileage" lay-filter="mileage"></table></td>
+		</tr>
+		<tr>
+			<td colspan="6"><strong>费用记录<strong> <span class="layui-btn layui-btn-xs side-a" data-href="/adm/car/fee_add?cid={$detail.id}">+ 费用记录</span></td>
+		</tr>
+		<tr>
+			<td colspan="6"><table class="layui-hide" id="fee" lay-filter="fee"></table></td>
+		</tr>
+		<tr>
+			<td colspan="6"><strong>维修记录<strong> <span class="layui-btn layui-btn-xs side-a" data-href="/adm/car/repair_add?cid={$detail.id}">+ 维修记录</span></td>
+		</tr>
+		<tr>
+			<td colspan="6"><table class="layui-hide" id="repair" lay-filter="repair"></table></td>
+		</tr>
+		<tr>
+			<td colspan="6"><strong>保养记录<strong> <span class="layui-btn layui-btn-xs side-a" data-href="/adm/car/protect_add?cid={$detail.id}">+ 保养记录</span></td>
+		</tr>
+		<tr>
+			<td colspan="6"><table class="layui-hide" id="protect" lay-filter="protect"></table></td>
+		</tr>
+	</table>
+</div>
+{/block}
+<!-- /主体 -->
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var car_id = {$detail.id};
+	var moduleInit = ['tool'];
+	function gouguInit() {
+		var tool = layui.tool,table = layui.table;
+		
+		layui.mileageTable = table.render({
+			elem: '#mileage',
+			title: '里程记录',
+			cellMinWidth: 80,
+			url: "/adm/api/get_car_mileage", //数据接口
+			where: { 'car_id': car_id },
+			page: true, //开启分页
+			limit: 10,
+			cols: [[ //表头
+				{ field: 'id', title: '序号', width: 60, align: 'center' }
+				, { field: 'mileage', title: '里程数', align: 'center', width: 120}
+				, { field: 'mileage_time', title: '里程月份', align: 'center', width: 120 }
+				, { field: 'admin_name', title: '创建人', align: 'center', width: 120 }
+				, { field: 'create_time', title: '记录时间', align: 'center', minWidth: 150,}
+				, {title: '操作',fixed:'right', align: 'center', width: 124, templet: function (d) {
+						return '<div class="layui-btn-group"><span class="layui-btn layui-btn-xs" lay-event="edit">修改</span><span class="layui-btn layui-bg-red layui-btn-xs" lay-event="del">删除</span></div>';
+					}
+				}
+			]]
+		});
+		
+		$('body').on('click','.add-mileage',function(){
+			addMileage(0,'','');	
+		});
+		
+		function addMileage(id,mileage_time,mileage){
+			var biaoti = '新增里程记录';
+			if(id>0){
+				biaoti = '编辑里程记录';
+			}				
+			layer.open({
+				type: 1
+				,title: biaoti
+				,area: '368px;'
+				,id: 'LAY_module' //设定一个id，防止重复弹出
+				,btn: ['确定', '取消']
+				,btnAlign: 'c'
+				,content: '<div style="padding-top:15px;">\
+							<div class="layui-form-item">\
+							  <label class="layui-form-label">里程月份</label>\
+							  <div class="layui-input-inline">\
+								<input type="hidden" name="id" value="'+id+'">\
+								<input type="text" name="mileage_time" autocomplete="off" value="'+mileage_time+'" placeholder="请输入里程月份" readonly class="layui-input tool-time" data-type="month">\
+							  </div>\
+							</div>\
+							<div class="layui-form-item">\
+							  <label class="layui-form-label">里程数</label>\
+							  <div class="layui-input-inline">\
+								<input type="text" name="mileage" autocomplete="off" value="'+mileage+'" placeholder="请输入里程数" class="layui-input">\
+							  </div>\
+							</div>\
+						  </div>'
+				,yes: function(index){
+					let id = $('#LAY_module').find('[name="id"]').val();
+					let mileage_time = $('#LAY_module').find('[name="mileage_time"]').val();
+					let mileage = $('#LAY_module').find('[name="mileage"]').val();
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.mileageTable.reload();	
+							layer.close(index);			
+						}
+					}
+					tool.post("/adm/car/mileage_add", {
+						id: id,
+						mileage_time: mileage_time,
+						mileage: mileage,
+						car_id:car_id
+					}, callback);						
+				}
+				,btn2: function(){
+					layer.closeAll();
+				}
+			});
+		}
+			
+			
+		//监听行工具事件
+		table.on('tool(mileage)', function(obj) {
+			var data = obj.data;			
+			if(obj.event === 'edit'){
+				addMileage(data.id,data.mileage_time,data.mileage)
+				return;
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要删除吗?', {
+					icon: 3,
+					title: '提示'
+				}, function(index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/adm/car/mileage_del", {id: data.id}, callback);
+					layer.close(index);
+				});
+			}
+		});
+		
+		layui.feeTable = table.render({
+			elem: '#fee',
+			title: '费用记录',
+			cellMinWidth: 80,
+			url: "/adm/api/get_car_fee", //数据接口
+			where: { 'car_id': car_id },
+			page: true, //开启分页
+			limit: 10,
+			cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'fee_time',title: '费用日期',align: 'center',width: 100}
+				,{field:'types_str',title: '费用类型',align: 'center',width: 100}
+				,{field:'amount',width:100, title: '费用金额(元)', align:'center',style:"color:#16b777"}
+				,{field:'title',minWidth:300,title: '费用主题'}
+				,{field:'handled_name',title: '跟进人',align: 'center',width: 80}
+				,{field:'create_time',title: '记录时间',align: 'center',width: 130}
+				,{width:120,fixed:'right', title: '操作', align:'center',templet: function(d){
+					var html='<div class="layui-btn-group"><a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a><a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</a><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></div>';
+					return html;
+				}}
+			]]
+		});
+		//监听行工具事件
+		table.on('tool(fee)', function(obj) {
+			var data = obj.data;			
+			if(obj.event === 'edit'){
+				tool.side('/adm/car/fee_add?id='+data.id);
+				return;
+			}
+			if(obj.event === 'view'){
+				tool.side('/adm/car/fee_view?id='+data.id);
+				return;
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要删除吗?', {
+					icon: 3,
+					title: '提示'
+				}, function(index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/adm/car/fee_del", {id: data.id}, callback);
+					layer.close(index);
+				});
+			}
+		});	
+
+		layui.repairTable = table.render({
+			elem: '#repair',
+			title: '维修记录',
+			cellMinWidth: 80,
+			url: "/adm/api/get_car_repair", //数据接口
+			where: { 'car_id': car_id },
+			page: true, //开启分页
+			limit: 10,
+			cols: [[ //表头
+				{ field: 'id', title: '序号', width: 60, align: 'center' }
+				, { field: 'amount', title: '维修金额', style: 'color: #91CC75;', align: 'center', width: 100 }
+				, { field: 'repair_time', title: '维修日期', align: 'center', width: 100 }
+				, { field: 'content', title: '维修内容',minWidth:240}
+				, { field: 'handled_name', title: '经手人', align: 'center', width: 80 }
+				, { field: 'create_time', title: '记录时间', align: 'center', width: 136}
+				, {title: '操作',fixed:'right', align: 'center', width: 124, templet: function (d) {
+						return '<div class="layui-btn-group"><span class="layui-btn layui-btn-xs" lay-event="edit">修改</span><span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详细</span><span class="layui-btn layui-bg-red layui-btn-xs" lay-event="del">删除</span></div>';
+					}
+				}
+			]]
+		});
+		//监听行工具事件
+		table.on('tool(repair)', function(obj) {
+			var data = obj.data;			
+			if(obj.event === 'edit'){
+				tool.side('/adm/car/repair_add?id='+data.id);
+				return;
+			}
+			if(obj.event === 'view'){
+				tool.side('/adm/car/repair_view?id='+data.id);
+				return;
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要删除吗?', {
+					icon: 3,
+					title: '提示'
+				}, function(index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/adm/car/repair_del", {id: data.id}, callback);
+					layer.close(index);
+				});
+			}
+		});
+		
+		
+		layui.protectTable = table.render({
+			elem: '#protect',
+			title: '保养记录',
+			cellMinWidth: 80,
+			url: "/adm/api/get_car_protect", //数据接口
+			where: { 'car_id': car_id },
+			page: true, //开启分页
+			limit: 10,
+			cols: [[ //表头
+				{ field: 'id', title: '序号', width: 60, align: 'center' }
+				, { field: 'amount', title: '保养金额', style: 'color: #91CC75;', align: 'center', width: 100 }
+				, { field: 'repair_time', title: '保养日期', align: 'center', width: 100 }
+				, { field: 'content', title: '保养内容',minWidth:240}
+				, { field: 'handled_name', title: '经手人', align: 'center', width: 80 }
+				, { field: 'create_time', title: '记录时间', align: 'center', width: 136}
+				, {title: '操作',fixed:'right', align: 'center', width: 124, templet: function (d) {
+						return '<div class="layui-btn-group"><span class="layui-btn layui-btn-xs" lay-event="edit">修改</span><span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详细</span><span class="layui-btn layui-bg-red layui-btn-xs" lay-event="del">删除</span></div>';
+					}
+				}
+			]]
+		});
+		//监听行工具事件
+		table.on('tool(protect)', function(obj) {
+			var data = obj.data;			
+			if(obj.event === 'edit'){
+				tool.side('/adm/car/protect_add?id='+data.id);
+				return;
+			}
+			if(obj.event === 'view'){
+				tool.side('/adm/car/protect_view?id='+data.id);
+				return;
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要删除吗?', {
+					icon: 3,
+					title: '提示'
+				}, function(index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/adm/car/protect_del", {id: data.id}, callback);
+					layer.close(index);
+				});
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/flow/add.html b/app/adm/view/flow/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..66fca9529f8a5524d2b9b112d2c2d9379c10d447
--- /dev/null
+++ b/app/adm/view/flow/add.html
@@ -0,0 +1,373 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+.layui-form-pane .layui-form-label{color:#999; width:80px; padding:8px 3px;}
+.layui-form-item .layui-inline{margin-right:1px; margin-bottom:10px;}
+.layui-form-item{margin-bottom:5px;}
+.layui-form-item .layui-btn-danger{display:none; margin-top:-8px}
+.layui-form-item:hover .layui-btn-danger{display:inline-block;}
+.select-1,.select-2{display:none;}
+
+.check-type-1 .flow-tr-2,.check-type-1 .flow-tr-3{display:none;}
+.check-type-2 .flow-tr-1,.check-type-2 .flow-tr-3{display:none;}
+.check-type-3 .flow-tr-1,.check-type-3 .flow-tr-2{display:none;}
+
+.role-1 .select-3,.role-1 .select-4{display:none;}
+.role-2 .select-3,.role-2 .select-4{display:none;}
+.role-3 .select-4{display:none;}
+.role-4 .select-3{display:none;}
+.role-5 .select-3{display:none;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-1">审批流程</h3>
+	<table id="flowTable" class="layui-table check-type-{$check_type}">
+		<tr>
+			<td class="layui-td-gray">流程名称<font>*</font></td>
+			<td><input type="text" name="title" value="{$detail.title|default=''}" autocomplete="off" placeholder="请输入审批流程名称" lay-verify="required" lay-reqText="请输入审批流程名称" class="layui-input"></td>
+			<td class="layui-td-gray">审批类型<font>*</font></td>
+			<td>
+				{eq name="$id" value="0"}
+				<select name="cate_id" lay-filter="cate" lay-verify="required" lay-reqText="请选择审批类型">
+				  <option value="">--请选择审批类型--</option>
+				  {volist name=":get_base_data('FlowCate')" id="vo"}
+				  <option value="{$vo.id}">{$vo.title}</option>
+				  {/volist}
+				</select>
+				{else/}
+				<select name="cate_id" lay-filter="cate" lay-verify="required" lay-reqText="请选择审批类型">
+				  <option value="">--请选择审批类型--</option>
+				  {volist name=":get_base_data('FlowCate')" id="vo"}
+				  <option value="{$vo.id}" {eq name="$detail.cate_id" value="$vo.id"}selected=""{/eq}>{$vo.title}</option>
+				  {/volist}
+				</select>
+				{/eq}
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">应用部门</td>
+			<td colspan="3">
+				<div class="layui-input-inline" style="width:80%;">
+					<select id="department_ids" name="department_ids" xm-selected="{$detail.department_ids|default=''}" xm-select="select1" xm-select-skin="default"></select>
+				</div>
+				<span class="red" style="font-size:12px;">（如果不选，默认是全公司）</span>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">流程说明</td>
+			<td colspan="3">
+				<textarea name="remark" placeholder="请输入流程说明" class="layui-textarea">{$detail.remark|default=''}</textarea>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">审批流类型<font>*</font></td>
+			<td colspan="3">
+				<input type="radio" name="check_type" lay-filter="checktype" value="1" title="自由审批流" {eq name="$check_type" value="1"}checked{/eq}>
+				<input type="radio" name="check_type" lay-filter="checktype" value="2" title="固定审批流" {eq name="$check_type" value="2"}checked{/eq}>
+				<input type="radio" name="check_type" lay-filter="checktype" value="3" title="可回退的审批流" {eq name="$check_type" value="3"}checked{/eq}>
+			</td>
+		</tr>
+		<tr id="flowTr1" class="flow-tr-1">
+			<td class="layui-td-gray">审批流程<font>*</font></td>
+			<td colspan="3">
+				<div style="padding:10px; font-size:12px; background-color:#fffcf0">
+					<p><strong>温馨提示</strong></p>
+					<p>无需配置审批人，审批时操作人员根据实际情况选择审批人即可，自由度最高。</p>
+				</div>
+			</td>
+		</tr>
+		<tr id="flowTr2" class="flow-tr-2">
+			<td class="layui-td-gray">审批流程<font>*</font></td>
+			<td colspan="3">
+				<div id="flowList2">
+					{eq name="$check_type" value="2"}
+						{volist name="detail.flow_list" id="vo"}
+						<div class="layui-form-item layui-form-pane role-{$vo.check_role}">
+							<div class="layui-inline">
+							  <label class="layui-form-label">第{$key+1}级</label>
+							  <div class="layui-input-inline" style="width:150px;">
+								<select name="check_role[]" lay-filter="role">
+									<option value="1" {eq name="$vo.check_role" value="1"}selected=""{/eq}>当前部门负责人</option>
+									<option value="2" {eq name="$vo.check_role" value="2"}selected=""{/eq}>上一级部门负责人</option>
+									<option value="3" {eq name="$vo.check_role" value="3"}selected=""{/eq}>指定岗位职称人</option>
+									<option value="4" {eq name="$vo.check_role" value="4"}selected=""{/eq}>指定成员</option>
+								</select>
+							  </div>
+							</div>
+							<div class="layui-inline select-3">
+								<label class="layui-form-label">岗位职称</label>
+								<div class="layui-input-inline" style="width:120px;">
+									<input type="text" name="check_position_title[]" value="{$vo.check_position_title}" autocomplete="off" readonly class="layui-input picker-oa" data-types="position">
+									<input type="hidden" name="check_position_id[]" value="{$vo.check_position_id}">
+								</div>
+							</div>
+							<div class="layui-inline select-4">
+								<label class="layui-form-label">指定人员</label>
+								<div class="layui-input-inline" style="width:320px;">
+									<input type="text" name="check_unames_a[]" value="{$vo.check_unames}" autocomplete="off" readonly class="layui-input picker-admin" data-type="2">
+									<input type="hidden" name="check_uids_a[]" value="{$vo.check_uids}">
+								</div>
+							</div>
+							<div class="layui-inline">
+							  <label class="layui-form-label" style="width:100px;">同时有多人时</label>
+							  <div class="layui-input-inline" style="width:80px;">
+								<select name="check_types[]">
+									<option value="1" {eq name="$vo.check_types" value="1"}selected=""{/eq}>会签</option>
+									<option value="2" {eq name="$vo.check_types" value="2"}selected=""{/eq}>或签</option>
+								</select>
+							  </div>
+							</div>
+							{gt name="$key" value="0"}
+							<span class="layui-btn layui-btn-danger layui-btn-sm">删除</span>
+							{/gt}
+						</div>
+						{/volist}
+					{else/}
+						<div class="layui-form-item layui-form-pane role-1">
+							<div class="layui-inline">
+							  <label class="layui-form-label">第1级</label>
+							  <div class="layui-input-inline" style="width:150px;">
+								<select name="check_role[]" lay-filter="role">
+									<option value="1">当前部门负责人</option>
+									<option value="2">上一级部门负责人</option>
+									<option value="3">指定岗位职称人</option>
+									<option value="4">指定成员</option>
+								</select>
+							  </div>
+							</div>
+							<div class="layui-inline select-3">
+								<label class="layui-form-label">岗位职称</label>
+								<div class="layui-input-inline" style="width:120px;">
+									<input type="text" name="check_position_title[]" value="" autocomplete="off" readonly class="layui-input picker-oa" data-types="position">
+									<input type="hidden" name="check_position_id[]" value="">
+								</div>
+							</div>
+							<div class="layui-inline select-4">
+								<label class="layui-form-label">指定人员</label>
+								<div class="layui-input-inline" style="width:320px;">
+									<input type="text" name="check_unames_a[]" value="" autocomplete="off" readonly class="layui-input picker-admin" data-type="2">
+									<input type="hidden" name="check_uids_a[]" value="">
+								</div>
+							</div>
+							<div class="layui-inline">
+							  <label class="layui-form-label" style="width:100px;">同时有多人时</label>
+							  <div class="layui-input-inline" style="width:80px;">
+								<select name="check_types[]">
+									<option value="1">会签</option>
+									<option value="2" selected="">或签</option>
+								</select>
+							  </div>
+							</div>
+						</div>
+					{/eq}
+				</div>
+				<span id="addFlow2" class="layui-btn layui-btn-xs layui-btn-normal">+ 添加审批层级</span>
+				<div style="padding:10px; margin-top:10px; font-size:12px; background-color:#fffcf0">
+					<p><strong>温馨提示</strong></p>
+					<p>1、当选择<strong> “当前部门负责人” </strong>审批时，有多个当前部门负责人时支持会签、或签模式。</p>
+					<p>2、当选择<strong> “上一级部门负责人” </strong>审批时，有多个上一级部门负责人时支持会签、或签模式</p>
+					<p>3、当选择<strong> “指定岗位职称” </strong>审批时，该岗位职称同时有多个人时支持会签、或签模式</p>
+					<p>4、当选择<strong> “指定成员” </strong>时，有多个人时支持会签、或签模式。</p>
+					<p>5、如果指定用户没有分配查看审批模块的功能权限，系统会通知其审批，但是他无法查看此审批数据信息。</p>
+				</div>
+			</td>
+		</tr>
+		<tr id="flowTr3" class="flow-tr-3">
+			<td class="layui-td-gray">审批流程<font>*</font></td>
+			<td colspan="3">
+				<div id="flowList3">
+					{eq name="$check_type" value="3"}
+						{volist name="detail.flow_list" id="vo"}
+						<div class="layui-form-item layui-form-pane">
+							<div class="layui-inline">
+								<label class="layui-form-label">第{$key+1}级</label>
+								<div class="layui-input-inline" style="width:240px;">
+									<input type="text" name="flow_name[]" value="{$vo.flow_name}" autocomplete="off" placeholder="请输入流程名称" class="layui-input">
+								</div>
+							</div>
+							<div class="layui-inline">
+								<label class="layui-form-label">指定人员</label>
+								<div class="layui-input-inline" style="width:120px;">
+									<input type="text" name="check_unames_b[]" value="{$vo.check_unames}" autocomplete="off" readonly class="layui-input picker-admin"  data-type="1">
+									<input type="hidden" name="check_uids_b[]" value="{$vo.check_uids}">
+								</div>
+							</div>
+							{gt name="$key" value="0"}
+							<span class="layui-btn layui-btn-danger layui-btn-sm">删除</span>
+							{/gt}
+						</div>
+						{/volist}
+					{else/}
+						<div class="layui-form-item layui-form-pane">
+							<div class="layui-inline">
+								<label class="layui-form-label">第1级</label>
+								<div class="layui-input-inline" style="width:240px;">
+									<input type="text" name="flow_name[]" value="" autocomplete="off" placeholder="请输入流程名称" class="layui-input">
+								</div>
+							</div>
+							<div class="layui-inline">
+								<label class="layui-form-label">指定人员</label>
+								<div class="layui-input-inline" style="width:120px;">
+									<input type="text" name="check_unames_b[]" value="" readonly class="layui-input picker-admin" data-type="1">
+									<input type="hidden" name="check_uids_b[]" value="">
+								</div>
+							</div>
+						</div>
+					{/eq}
+				</div>
+				<span id="addFlow3" class="layui-btn layui-btn-xs layui-btn-normal">+ 添加审批层级</span>
+				<div style="padding:10px; margin-top:10px; font-size:12px; background-color:#fffcf0">
+					<p><strong>温馨提示</strong></p>
+					<p>1、<strong>指定人员</strong>单选。后期审批的时候，审批人只能该指定人员。</p>
+					<p>2、该审批流程可<strong>回退</strong>，当拒绝审核时，会自动回退到上一位审批人节点。</p>
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">默认抄送人</td>
+			<td colspan="3">
+				<input type="text" name="copy_unames" value="{$detail.copy_unames|default=''}" placeholder="请选择" readonly class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="copy_uids" value="{$detail.copy_uids|default=''}">
+			</td>
+		</tr>
+	</table>
+	<div class="pt-2">
+		<input type="hidden" name="id" value="{$id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','formSelects','oaPicker'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,formSelects = layui.formSelects;
+		  
+		//选择应用部门
+		var selcted = $('#department_ids').attr('xm-selected');
+		formSelects.data('select1', 'server', {
+			url: '/api/index/get_department_select',
+			keyword: selcted,
+		});	
+		
+		
+		form.on('radio(checktype)', function(data){
+			$('#flowTable').attr('class','layui-table check-type-'+data.value);
+		});
+		
+		form.on('select(role)', function(data){
+			$(data.elem).parents('.layui-form-item').attr('class','layui-form-item layui-form-pane role-'+data.value);
+		});
+
+		//监听提交
+		form.on('submit(webform)', function(data){
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);					
+				}
+			}
+			tool.post("/adm/flow/add", data.field, callback);
+			return false;
+		});
+    
+		
+		$('#addFlow2').on('click',function(){
+			var len = $('#flowList2').find('.layui-form-item').length;
+			var index = len+1;
+			var timestamp=new Date().getTime();
+			var tem='<div class="layui-form-item layui-form-pane role-1">\
+						<div class="layui-inline">\
+						<label class="layui-form-label label-index">第'+index+'级</label>\
+						  <div class="layui-input-inline" style="width:150px;">\
+							<select name="check_role[]" lay-filter="role">\
+								<option value="1">当前部门负责人</option>\
+								<option value="2">上一级部门负责人</option>\
+								<option value="3">指定岗位职称人</option>\
+								<option value="4">指定成员</option>\
+							</select>\
+						  </div>\
+						</div>\
+						<div class="layui-inline select-3">\
+							<label class="layui-form-label">岗位职称</label>\
+							<div class="layui-input-inline" style="width:120px;">\
+								<input type="text" name="check_position_title[]" value="" autocomplete="off" readonly class="layui-input picker-oa" data-types="position">\
+								<input type="hidden" name="check_position_id[]" value="">\
+							</div>\
+						</div>\
+						<div class="layui-inline select-4">\
+							<label class="layui-form-label">指定人员</label>\
+							<div class="layui-input-inline" style="width:320px;">\
+								<input type="text" name="check_unames_a[]" value="" autocomplete="off" readonly class="layui-input picker-admin" data-type="2">\
+								<input type="hidden" name="check_uids_a[]" value="">\
+							</div>\
+						</div>\
+						<div class="layui-inline">\
+						  <label class="layui-form-label" style="width:100px;">同时有多人时</label>\
+						  <div class="layui-input-inline" style="width:80px;">\
+							<select name="check_types[]">\
+								<option value="1">会签</option>\
+								<option value="2" selected="">或签</option>\
+							</select>\
+						  </div>\
+						</div>\
+						<span class="layui-btn layui-btn-danger layui-btn-sm">删除</span>\
+					</div>';
+			$('#flowList2').append(tem);
+			form.render();
+		});
+		
+		$('#flowList2').on('click','.layui-btn-danger',function(){
+			$(this).parents('.layui-form-item').remove();
+			var items = $('.label-index').length;
+			if(items>0){
+				$('.label-index').each(function(index,item){
+					$(this).html('第'+(index+2)+'级');
+				})
+			}
+		});			
+		
+		//================================
+		$('#addFlow3').on('click',function(){
+			var len = $('#flowList3').find('.layui-form-item').length;
+			var index = len+1;
+			var timestamp=new Date().getTime();
+			var tem='<div class="layui-form-item layui-form-pane">\
+						<div class="layui-inline">\
+							<label class="layui-form-label label-index">第'+index+'级</label>\
+							<div class="layui-input-inline" style="width:240px;">\
+								<input type="text" name="flow_name[]" value="" autocomplete="off" placeholder="请输入流程名称" class="layui-input">\
+							</div>\
+						</div>\
+						<div class="layui-inline select-3">\
+							<label class="layui-form-label">指定人员</label>\
+							<div class="layui-input-inline" style="width:120px;">\
+								<input type="text" name="check_unames_b[]" value="" autocomplete="off" readonly class="layui-input picker-admin" data-type="1">\
+								<input type="hidden" name="check_uids_b[]" value="">\
+							</div>\
+						</div>\
+						<span class="layui-btn layui-btn-danger layui-btn-sm">删除</span>\
+					</div>';
+			$('#flowList3').append(tem);
+			form.render();
+		});
+		
+		$('#flowList3').on('click','.layui-btn-danger',function(){
+			$(this).parents('.layui-form-item').remove();
+			var items = $('.label-index').length;
+			if(items>0){
+				$('.label-index').each(function(index,item){
+					$(this).html('第'+(index+2)+'级');
+				})
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/flow/cate_add.html b/app/adm/view/flow/cate_add.html
new file mode 100644
index 0000000000000000000000000000000000000000..1540a55240b1f32d6cca41309f03280e3f15b628
--- /dev/null
+++ b/app/adm/view/flow/cate_add.html
@@ -0,0 +1,206 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-1">审批类型</h3>
+	{eq name="$id" value="0"}
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">类型名称<font>*</font></td>
+			<td><input type="text" name="title" value="" lay-verify="required" autocomplete="off" placeholder="请输入审批类型名称" lay-reqText="请输入类型名称" class="layui-input"></td>
+			<td class="layui-td-gray-2">关联审批模块<font>*</font></td>
+			<td>
+				<select name="module_id" lay-verify="required" lay-reqText="请选择要关联的审批模块">
+					<option value="">请选择</option>
+					{volist name=":get_base_data('flow_module')" id="vo"}
+						<option value="{$vo.id}">{$vo.title}</option>
+					{/volist}
+				</select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">类型标识<font>*</font></td>
+			<td colspan="3">
+				<div class="layui-input-inline" style="width:50%;">
+				<input type="text" name="name" value="" lay-verify="required" autocomplete="off" placeholder="请输入类型标识，如：official" lay-reqText="请输入类型标识，只能是小写字母" class="layui-input">
+				</div>
+				<span class="red" style="font-size:12px;">（重要：请输入类型标识注意只能是小写字母，唯一）</span></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">数据表名<font>*</font></td>
+			<td colspan="3">
+				<div class="layui-input-inline" style="width:50%;">
+				<input type="text" name="check_table" value="" lay-verify="required" autocomplete="off" placeholder="请输入关联的数据库表名称，如：official_docs" lay-reqText="请输入关联的数据库表名称" class="layui-input">
+				</div>
+				<span class="red" style="font-size:12px;">（重要：输入要关联的数据库表名称，注意不需要表前缀，输错无效）</span></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">新建审批链接<font>*</font></td>
+			<td colspan="3">
+				<div class="layui-input-inline" style="width:50%;">
+					<input type="text" name="add_url" value="" lay-verify="required" autocomplete="off" placeholder="请输入新建审批链接，如：adm/official/add" lay-reqText="请输入新建审批链接" class="layui-input">
+				</div>
+				<span class="red" style="font-size:12px;">（重要：输入新建审批链接，可在【系统管理】的【功能节点】查找，输错无效）</span></td>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">查看审批链接<font>*</font></td>
+			<td colspan="3">
+				<div class="layui-input-inline" style="width:50%;">
+					<input type="text" name="view_url" value="" lay-verify="required" autocomplete="off" placeholder="请输入查看审批链接，如：adm/official/view" lay-reqText="请输入查看审批链接" class="layui-input">
+				</div>
+				<span class="red" style="font-size:12px;">（重要：输入查看审批链接，可在【系统管理】的【功能节点】查找，输错无效）</span></td>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">应用部门</td>
+			<td colspan="3">
+				<div class="layui-input-inline" style="width:50%;">
+					<select id="department_ids" name="department_ids" xm-selected="" xm-select="select1" xm-select-skin="default"></select>
+				</div>
+				<span class="red" style="font-size:12px;">（如果不选，默认是全公司）</span>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">展示图标<font>*</font></td>
+			<td>
+				<div class="layui-input-inline" style="width:50%;">
+					<input class="layui-input" type="text" name="icon" value="" placeholder="请输入图标" lay-verify="required" lay-reqText="请输入图标" >
+				</div>			
+				<a href="/static/assets/icon/index.html" target="_blank" style="margin-left:10px; color:#007AFF">[查看图标]</a>
+			</td>
+			<td class="layui-td-gray">排序</td>
+			<td><input type="text" name="sort" value="" autocomplete="off" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">消息模板</td>
+			<td>
+				<input type="text" name="template_title" value="" readonly autocomplete="off" class="layui-input picker-oa" data-types='template' placeholder="请选择">
+				<input type="hidden" name="template_id" value="0">
+			</td>
+			<td class="layui-td-gray-2">是否列表显示</td>
+			<td>
+				<input type="radio" name="is_list" value="1" title="显示" checked>
+				<input type="radio" name="is_list" value="0" title="不显示">
+			</td>
+		</tr>
+	</table>
+	{else/}
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">类型名称<font>*</font></td>
+			<td><input type="text" name="title" value="{$detail.title}" lay-verify="required" autocomplete="off" placeholder="请输入审批类型名称" lay-reqText="请输入类型名称" class="layui-input"></td>
+			<td class="layui-td-gray-2">关联审批模块<font>*</font></td>
+			<td>
+				<select name="module_id" lay-verify="required" lay-reqText="请选择要关联的审批模块">
+					<option value="">请选择</option>
+					{volist name=":get_base_data('flow_module')" id="vo"}
+						<option value="{$vo.id}" {eq name="$vo.id" value="$detail.module_id"}selected{/eq}>{$vo.title}</option>
+					{/volist}
+				</select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">类型标识<font>*</font></td>
+			<td colspan="3">
+				<div class="layui-input-inline" style="width:50%;">
+				<input type="text" name="name" value="{$detail.name}" lay-verify="required" autocomplete="off" placeholder="请输入类型标识，如：official" lay-reqText="请输入类型标识，只能是小写字母" class="layui-input">
+				</div>
+				<span class="red" style="font-size:12px;">（重要：请输入类型标识注意只能是小写字母，唯一）</span></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">数据表名<font>*</font></td>
+			<td colspan="3">
+				<div class="layui-input-inline" style="width:50%;">
+				<input type="text" name="check_table" value="{$detail.check_table}" lay-verify="required" autocomplete="off" placeholder="请输入关联的数据库表名称，如：official_docs" lay-reqText="请输入关联的数据库表名称" class="layui-input">
+				</div>
+				<span class="red" style="font-size:12px;">（重要：输入要关联的数据库表名称，注意不需要表前缀，输错无效）</span></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">新建审批链接<font>*</font></td>
+			<td colspan="3">
+				<div class="layui-input-inline" style="width:50%;">
+					<input type="text" name="add_url" value="{$detail.add_url}" lay-verify="required" autocomplete="off" placeholder="请输入新建审批链接，如：adm/official/add" lay-reqText="请输入新建审批链接" class="layui-input">
+				</div>
+				<span class="red" style="font-size:12px;">（重要：输入新建审批链接，可在【系统管理】的【功能节点】查找，输错无效）</span></td>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">查看审批链接<font>*</font></td>
+			<td colspan="3">
+				<div class="layui-input-inline" style="width:50%;">
+					<input type="text" name="view_url" value="{$detail.view_url}" lay-verify="required" autocomplete="off" placeholder="请输入查看审批链接，如：adm/official/view" lay-reqText="请输入查看审批链接" class="layui-input">
+				</div>
+				<span class="red" style="font-size:12px;">（重要：输入查看审批链接，可在【系统管理】的【功能节点】查找，输错无效）</span></td>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">应用部门</td>
+			<td colspan="3">
+				<div class="layui-input-inline" style="width:50%;">
+					<select id="department_ids" name="department_ids" xm-selected="{$detail.department_ids}" xm-select="select1" xm-select-skin="default"></select>
+				</div>
+				<span class="red" style="font-size:12px;">（如果不选，默认是全公司）</span>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">展示图标<font>*</font></td>
+			<td>
+				<div class="layui-input-inline" style="width:50%;">
+					<input class="layui-input" type="text" name="icon" value="{$detail.icon}" placeholder="请输入图标" lay-verify="required" lay-reqText="请输入图标" >
+				</div>			
+				<a href="/static/assets/icon/index.html" target="_blank" style="margin-left:10px; color:#007AFF">[查看图标]</a>
+			</td>
+			<td class="layui-td-gray">排序</td>
+			<td><input type="text" name="sort" value="{$detail.sort}" autocomplete="off" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">消息模板</td>
+			<td>
+				<input type="text" name="template_title" value="{$detail.template_title|default=''}" readonly autocomplete="off" class="layui-input picker-oa" data-types='template' placeholder="请选择">
+				<input type="hidden" name="template_id" value="{$detail.template_id}">
+			</td>
+			<td class="layui-td-gray-2">是否列表显示</td>
+			<td>
+				<input type="radio" name="is_list" value="1" title="显示" {eq name="$detail.is_list" value="1"}checked{/eq}>
+				<input type="radio" name="is_list" value="0" title="不显示" {eq name="$detail.is_list" value="0"}checked{/eq}>
+			</td>
+		</tr>
+	</table>
+	{/eq}
+	<div class="py-2">
+		<input type="hidden" name="id" value="{$id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','formSelects','oaPicker'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,formSelects=layui.formSelects;
+		//选择应用部门
+		var selcted = $('#department_ids').attr('xm-selected');
+		formSelects.data('select1', 'server', {
+			url: '/api/index/get_department_select',
+			keyword: selcted,
+		});		
+		//监听提交
+		form.on('submit(webform)', function(data){
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);					
+				}
+			}
+			tool.post("/adm/flow/cate_add", data.field, callback);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/flow/catelist.html b/app/adm/view/flow/catelist.html
new file mode 100644
index 0000000000000000000000000000000000000000..720d45533c46738cad6295725b9b383036aa3b23
--- /dev/null
+++ b/app/adm/view/flow/catelist.html
@@ -0,0 +1,111 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+    <table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm side-a" type="button" data-href="/adm/flow/cate_add">+ 添加审批类型</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool, form = layui.form;
+		layui.pageTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,defaultToolbar: false
+			,title:'审批类型'
+			,url: "/adm/flow/catelist"
+			,limit: 100
+			,page: false
+			,cellMinWidth: 60
+			,cols: [[
+					{field:'id',width:80, title: 'ID号', align:'center'}
+					,{field:'icon',title: '审批类型名称',width: 120,templet: function(d){
+						var html='<strong class="iconfont '+d.icon+'"></strong> ' +d.title;
+						return html;
+					}}
+					,{field:'module',title: '所属审批模块',width:100, align:'center'}
+					,{field:'check_table',title: '数据表',width:100}
+					,{field:'name',title: '类型标识',width:100}
+					,{field:'departments',title: '应用部门',minWidth:200}
+					,{field:'add_url',title: '审批新增链接',minWidth:200}
+					,{field:'view_url',title: '审批查看链接',minWidth:200}
+					,{field:'is_list',title: '列表显示',width:80,align:'center',templet: function(d){
+						var html1='<span class="green">显示</span>';
+						var html2='<span class="yellow">不显示</span>';
+						if(d.is_list==1){
+							return html1;
+						}
+						else{
+							return html2;
+						}
+					}}
+					,{field:'sort',title: '排序',width:60, align:'center'}
+					,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+						var html1='<span class="green">正常</span>';
+						var html2='<span class="yellow">禁用</span>';
+						if(d.status==1){
+							return html1;
+						}
+						else{
+							return html2;
+						}
+					}}
+					,{width:90,fixed:'right',title: '操作', align:'center',templet: function(d){
+						var html='';
+						var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
+						var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+						var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+						if(d.status==1){
+							html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+						}
+						else{
+							html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+						}
+						return html;
+					}}
+				]]
+			});
+			
+			table.on('tool(test)',function (obj) {
+				if(obj.event === 'edit'){					
+					tool.side('/adm/flow/cate_add?id='+obj.data.id);
+				}
+				if(obj.event === 'disable'){
+					layer.confirm('确定要禁用该审批类型吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/adm/flow/cate_check", { id: obj.data.id,status: 0,title: obj.data.title}, callback);
+						layer.close(index);
+					});
+				}
+				if(obj.event === 'open'){
+					layer.confirm('确定要启用该审批类型吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/adm/flow/cate_check", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
+						layer.close(index);
+					});
+				}
+			});
+		}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/flow/datalist.html b/app/adm/view/flow/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..704a56d24ae4fba1f9240cce707eb945cace0a02
--- /dev/null
+++ b/app/adm/view/flow/datalist.html
@@ -0,0 +1,113 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-3">
+    <table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm addNew" type="button">+ 添加审批流程</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool, form = layui.form;
+		layui.pageTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,defaultToolbar: false
+			,title:'审批流程列表'
+			,url: "/adm/flow/datalist"
+			,page: false //开启分页
+			,limit: 20
+			,cellMinWidth: 80
+			,cols: [[
+					{field:'id',width:80, title: 'ID号', align:'center'}
+					,{field:'title',title: '流程名称',width:150}
+					,{field:'check_type',title: '审批流类型', align:'center',width:110,templet:function(d){
+						var html = '<span class="green">自由审批流</span>';
+						if(d.check_type==2){
+							html = '<span class="blue">固定审批流</span>';
+						}
+						if(d.check_type==3){
+							html = '<span class="yellow">可回退审批流</span>';
+						}
+						if(d.check_type==4){
+							html = '<span class="red">条件审批流</span>';
+						}
+						return html;
+					}}
+					,{field:'cate',title: '关联审批类型',width:110, align:'center'}
+					,{field:'module',title: '关联审批模块',width:110, align:'center'}
+					,{field:'departments',title: '应用部门',minWidth:160}
+					,{field:'copy_unames',title: '默认抄送人',minWidth:160}
+					,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+						var html1='<span class="green">正常</span>';
+						var html2='<span class="yellow">禁用</span>';
+						if(d.status==1){
+							return html1;
+						}
+						else{
+							return html2;
+						}
+					}}
+					,{width:90,title: '操作', align:'center',templet: function(d){
+						var html='';
+						var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
+						var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+						var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+						if(d.status==1){
+							html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+						}
+						else{
+							html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+						}
+						return html;
+					}}
+				]]
+			});
+			
+			table.on('tool(test)',function (obj) {
+				if(obj.event === 'edit'){		
+					tool.side('/adm/flow/add?id='+obj.data.id);
+				}
+				if(obj.event === 'disable'){
+					layer.confirm('确定要禁用该流程吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/adm/flow/check", { id: obj.data.id,status: 0 }, callback);
+						layer.close(index);						
+					});
+				}
+				if(obj.event === 'open'){
+					layer.confirm('确定要启用该流程吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/adm/flow/check", { id: obj.data.id,status: 1 }, callback);
+						layer.close(index);	
+					});
+				}
+			});
+			
+			$('body').on('click','.addNew',function(){
+				tool.side("/adm/flow/add");
+				return false;
+			});
+		}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/flow/module_add.html b/app/adm/view/flow/module_add.html
new file mode 100644
index 0000000000000000000000000000000000000000..3a5e3fa0900c230a36a52ec3ca9f9d67f94adeed
--- /dev/null
+++ b/app/adm/view/flow/module_add.html
@@ -0,0 +1,54 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-1">审批模块</h3>
+	{eq name="$id" value="0"}
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">模块名称<font>*</font></td>
+			<td><input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入模块名称" lay-reqText="请输入审批模块名称" class="layui-input"></td>
+			<td class="layui-td-gray">排序</td>
+			<td><input type="text" name="sort" autocomplete="off" class="layui-input"></td>
+		</tr>
+	</table>
+	{else/}
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">模块名称<font>*</font></td>
+			<td><input type="text" name="title" value="{$detail.title}" lay-verify="required" autocomplete="off" placeholder="请输入审批模块名称" lay-reqText="请输入模块名称" class="layui-input"></td>
+			<td class="layui-td-gray">排序</td>
+			<td><input type="text" name="sort" value="{$detail.sort}" autocomplete="off" class="layui-input"></td>
+		</tr>
+	</table>
+	{/eq}
+	<div class="pt-2">
+		<input type="hidden" name="id" value="{$id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','formSelects'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,formSelects=layui.formSelects;
+		//监听提交
+		form.on('submit(webform)', function(data){
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);					
+				}
+			}
+			tool.post("/adm/flow/module_add", data.field, callback);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/flow/modulelist.html b/app/adm/view/flow/modulelist.html
new file mode 100644
index 0000000000000000000000000000000000000000..b6e05aa3e101b742daec91bb203c35efa072af9e
--- /dev/null
+++ b/app/adm/view/flow/modulelist.html
@@ -0,0 +1,92 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+    <table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm side-a" type="button" data-href="/adm/flow/module_add">+ 添加模块</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool, form = layui.form;
+		layui.pageTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,defaultToolbar: false
+			,title:'审批模块'
+			,url: "/adm/flow/modulelist"
+			,limit: 100
+			,page: false
+			,cellMinWidth: 60
+			,cols: [[
+					{field:'id',width:80, title: 'ID号', align:'center'}
+					,{field:'title',title: '模块名称'}
+					,{field:'sort',title: '排序',width:60, align:'center'}
+					,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+						var html1='<span class="green">正常</span>';
+						var html2='<span class="yellow">禁用</span>';
+						if(d.status==1){
+							return html1;
+						}
+						else{
+							return html2;
+						}
+					}}
+					,{width:90,title: '操作', align:'center',templet: function(d){
+						var html='';
+						var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
+						var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+						var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+						if(d.status==1){
+							html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+						}
+						else{
+							html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+						}
+						return html;
+					}}
+				]]
+			});
+			
+			table.on('tool(test)',function (obj) {
+				if(obj.event === 'edit'){					
+					tool.side('/adm/flow/module_add?id='+obj.data.id);
+				}
+				if(obj.event === 'disable'){
+					layer.confirm('确定要禁用该模块吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/adm/flow/module_check", { id: obj.data.id,status: 0,title: obj.data.title}, callback);
+						layer.close(index);
+					});
+				}
+				if(obj.event === 'open'){
+					layer.confirm('确定要启用该模块吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/adm/flow/module_check", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
+						layer.close(index);
+					});
+				}
+			});
+		}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/flow/table.html b/app/adm/view/flow/table.html
new file mode 100644
index 0000000000000000000000000000000000000000..556120303214af90e5a08cc99f3c241de46fa9b4
--- /dev/null
+++ b/app/adm/view/flow/table.html
@@ -0,0 +1,513 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+.layui-form-item{margin-bottom:0}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-1">审批条件	<span id="addFlow2" class="layui-btn layui-btn-xs layui-btn-normal">+ 添加审批层级</span></h3>
+	{eq name="$id" value="0"}
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray-2">
+				第1级
+				<span id="addFlow2" class="layui-btn layui-btn-xs layui-btn-normal">+ 添加条件分支</span>
+			</td>
+			<td>
+				条件分支(优先级1)
+				<span id="addFlow2" class="layui-btn layui-btn-xs layui-btn-normal">+ 添加条件组</span>
+				<div>
+					条件组1<span id="addFlow2" class="layui-btn layui-btn-xs layui-btn-normal">+ 添加条件字段</span>
+					<div class="layui-form-item layui-form-pane">
+						<div class="layui-inline">
+						  <label class="layui-form-label" style="width:40px">当</label>
+						  <div class="layui-input-inline" style="width:132px">
+							<select name="columns[]" lay-filter="columns" lay-verify="required" lay-reqText="请选择字段">
+								<option value="">选择条件字段</option>
+								{volist name="$columns" id="vo"}
+								<option value="{$vo.Field}">{$vo.Comment|default=$vo.Field}</option>
+								{/volist}
+							</select>						
+						  </div>
+						  <div class="layui-input-inline" style="width:100px">
+								<select name="flow_cate" lay-filter="flowcate" lay-verify="required" lay-reqText="请选择审批模块">
+									<option value="1">等于</option>
+									<option value="2">小于</option>
+									<option value="3">小于等于</option>
+									<option value="4">大于</option>
+									<option value="5">大于等于</option>
+								</select>
+						  </div>
+						  <label class="layui-form-label" style="width:80px">审批人员</label>
+						  <div class="layui-input-inline" style="width:360px;">
+							<input type="text" name="unames[]" value="" autocomplete="off" placeholder="请选择审批人" readonly class="layui-input picker-admin">
+							<input type="hidden" name="uids[]" value="">
+						  </div>
+						</div>
+					</div>
+					且
+					<div class="layui-form-item layui-form-pane">
+						<div class="layui-inline">
+						  <label class="layui-form-label" style="width:40px">当</label>
+						  <div class="layui-input-inline" style="width:132px">
+							<select name="columns[]" lay-filter="columns" lay-verify="required" lay-reqText="请选择字段">
+								<option value="">选择条件字段</option>
+								{volist name="$columns" id="vo"}
+								<option value="{$vo.Field}">{$vo.Comment|default=$vo.Field}</option>
+								{/volist}
+							</select>						
+						  </div>
+						  <div class="layui-input-inline" style="width:100px">
+								<select name="flow_cate" lay-filter="flowcate" lay-verify="required" lay-reqText="请选择审批模块">
+									<option value="1">等于</option>
+									<option value="2">小于</option>
+									<option value="3">小于等于</option>
+									<option value="4">大于</option>
+									<option value="5">大于等于</option>
+								</select>
+						  </div>
+						  <label class="layui-form-label" style="width:80px">审批人员</label>
+						  <div class="layui-input-inline" style="width:360px;">
+							<input type="text" name="unames[]" value="" autocomplete="off" placeholder="请选择审批人" readonly class="layui-input picker-admin">
+							<input type="hidden" name="uids[]" value="">
+						  </div>
+						</div>
+					</div>
+				</div>
+				条件分支(优先级2)
+				<span id="addFlow2" class="layui-btn layui-btn-xs layui-btn-normal">+ 添加条件组</span>
+				<div>
+					条件组1<span id="addFlow2" class="layui-btn layui-btn-xs layui-btn-normal">+ 添加条件字段</span>
+					<div class="layui-form-item layui-form-pane">
+						<div class="layui-inline">
+						  <label class="layui-form-label" style="width:40px">当</label>
+						  <div class="layui-input-inline" style="width:132px">
+							<select name="columns[]" lay-filter="columns" lay-verify="required" lay-reqText="请选择字段">
+								<option value="">选择条件字段</option>
+								{volist name="$columns" id="vo"}
+								<option value="{$vo.Field}">{$vo.Comment|default=$vo.Field}</option>
+								{/volist}
+							</select>						
+						  </div>
+						  <div class="layui-input-inline" style="width:100px">
+								<select name="flow_cate" lay-filter="flowcate" lay-verify="required" lay-reqText="请选择审批模块">
+									<option value="1">等于</option>
+									<option value="2">小于</option>
+									<option value="3">小于等于</option>
+									<option value="4">大于</option>
+									<option value="5">大于等于</option>
+								</select>
+						  </div>
+						  <label class="layui-form-label" style="width:80px">审批人员</label>
+						  <div class="layui-input-inline" style="width:360px;">
+							<input type="text" name="unames[]" value="" autocomplete="off" placeholder="请选择审批人" readonly class="layui-input picker-admin">
+							<input type="hidden" name="uids[]" value="">
+						  </div>
+						</div>
+					</div>
+					且
+					<div class="layui-form-item layui-form-pane">
+						<div class="layui-inline">
+						  <label class="layui-form-label" style="width:40px">当</label>
+						  <div class="layui-input-inline" style="width:132px">
+							<select name="columns[]" lay-filter="columns" lay-verify="required" lay-reqText="请选择字段">
+								<option value="">选择条件字段</option>
+								{volist name="$columns" id="vo"}
+								<option value="{$vo.Field}">{$vo.Comment|default=$vo.Field}</option>
+								{/volist}
+							</select>						
+						  </div>
+						  <div class="layui-input-inline" style="width:100px">
+								<select name="flow_cate" lay-filter="flowcate" lay-verify="required" lay-reqText="请选择审批模块">
+									<option value="1">等于</option>
+									<option value="2">小于</option>
+									<option value="3">小于等于</option>
+									<option value="4">大于</option>
+									<option value="5">大于等于</option>
+								</select>
+						  </div>
+						  <label class="layui-form-label" style="width:80px">审批人员</label>
+						  <div class="layui-input-inline" style="width:360px;">
+							<input type="text" name="unames[]" value="" autocomplete="off" placeholder="请选择审批人" readonly class="layui-input picker-admin">
+							<input type="hidden" name="uids[]" value="">
+						  </div>
+						</div>
+					</div>
+				</div>				
+				默认情况分支(优先级3)
+				<div class="layui-form-item layui-form-pane" style="margin-bottom:0">
+					<div class="layui-input-inline" style="width:160px;">
+						<select name="types[]" lay-filter="flowtype">
+							<option value="1">当前部门负责人</option>
+							<option value="2">上一级部门负责人</option>
+							<option value="3">指定人员(多人或签)</option>
+							<option value="4">指定人员(多人会签)</option>
+						</select>
+					</div>
+					<label class="layui-form-label" style="width:80px">审批人员</label>
+					<div class="layui-input-inline" style="width:360px;">
+						<input type="text" name="unames[]" value="" autocomplete="off" placeholder="请选择审批人" readonly class="layui-input picker-admin">
+						<input type="hidden" name="uids[]" value="">
+					</div>
+					<span class="layui-label-inline">
+						如存在未满足其他分支条件的情况，则进入此分支
+					</span>				
+				</div>
+			</td>	
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">
+				第2级
+				<span id="addFlow2" class="layui-btn layui-btn-xs layui-btn-normal">+ 添加条件分支</span>
+			</td>
+			<td>
+				
+			</td>
+		</tr>
+	</table>
+	{else/}
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">流程名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" value="{$detail.title}" autocomplete="off" placeholder="请输入审批流程名称" lay-verify="required" lay-reqText="请输入审批流程名称" class="layui-input">
+			</td>
+			<td class="layui-td-gray">流程标识<font>*</font></td>
+			<td><input type="text" name="name" value="{$detail.name}" autocomplete="off" placeholder="请输入审批流程标识" lay-verify="required" lay-reqText="请输入审批流程标识" class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">审批模块<font>*</font></td>
+			<td>
+				<select name="flow_cate" lay-filter="flowcate" lay-verify="required" lay-reqText="请选择审批模块">
+					<option value="">请选择审批模块</option>
+					{volist name=":get_base_data('flow_cate')" id="vo"}
+						<option value="{$vo.id}" {eq name="$vo.id" value="$detail.flow_cate"}selected{/eq}>{$vo.title}</option>
+					{/volist}
+				</select>
+			</td>
+			<td class="layui-td-gray">审批类型<font>*</font></td>
+			<td>
+				<select name="flow_item" lay-filter="flowitem" lay-verify="required" lay-reqText="请选择审批类型">
+				  <option value="">--请选择--</option>
+				  {volist name="$detail.flow_item_list" id="vo"}
+				  <option value="{$vo.id}" {eq name="$detail.flow_item" value="$vo.id"}selected=""{/eq}>{$vo.title}</option>
+				  {/volist}
+				</select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">应用部门</td>
+			<td colspan="3">
+				<div class="layui-input-inline" style="width:80%;">
+					<select id="department_ids" name="department_ids" xm-selected="{$detail.department_ids}" xm-select="select1" xm-select-skin="default"></select>
+				</div>
+				<span class="red" style="font-size:12px;">（如果不选，默认是全公司）</span>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">流程说明</td>
+			<td colspan="3">
+				<textarea name="remark" placeholder="请输入流程说明" class="layui-textarea">{$detail.remark}</textarea>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">审批流类型<font>*</font></td>
+			<td colspan="3">
+				<input type="radio" name="check_type" lay-filter="checktype" value="1" title="自由审批流" {eq name="$detail.check_type" value="1"}checked{/eq}>
+				<input type="radio" name="check_type" lay-filter="checktype" value="2" title="固定审批流" {eq name="$detail.check_type" value="2"}checked{/eq}>
+				<input type="radio" name="check_type" lay-filter="checktype" value="3" title="可回退的审批流" {eq name="$detail.check_type" value="3"}checked{/eq}>
+				<input type="radio" name="check_type" lay-filter="checktype" value="4" title="条件审批流" {eq name="$detail.check_type" value="4"}checked{/eq}>
+			</td>
+		</tr>
+		<tr id="flowTr1" {neq name="$detail.check_type" value="1"}style="display:none"{/neq}>
+			<td class="layui-td-gray">审批流程<font>*</font></td>
+			<td colspan="3">
+				<div style="padding:10px; font-size:12px; background-color:#fffcf0">
+					<p><strong>温馨提示</strong></p>
+					<p>无需配置审批人，审批时，根据实际情况选择审批人即可，自由度最高。</p>
+				</div>
+			</td>
+		</tr>
+		<tr id="flowTr2" {neq name="$detail.check_type" value="2"}style="display:none"{/neq}>
+			<td class="layui-td-gray">审批流程<font>*</font></td>
+			<td colspan="3">
+				<div id="flowList2">
+					{eq name="$detail.check_type" value="2"}
+					{volist name="detail.flow_list" id="vo"}
+					<div class="layui-form-item layui-form-pane">
+						<div class="layui-inline">
+						  <label class="layui-form-label">第{$key+1}级</label>
+						  <div class="layui-input-inline">
+							<select name="flowType[]" lay-filter="flowtype">
+								<option value="1" {eq name="$vo.flow_type" value="1"}selected=""{/eq}>当前部门负责人</option>
+								<option value="2" {eq name="$vo.flow_type" value="2"}selected=""{/eq}>上一级部门负责人</option>
+								<option value="3" {eq name="$vo.flow_type" value="3"}selected=""{/eq}>指定人员(多人或签)</option>
+								<option value="4" {eq name="$vo.flow_type" value="4"}selected=""{/eq}>指定人员(多人会签)</option>
+							</select>
+						  </div>
+						</div>
+						<div class="layui-inline select-{$vo.flow_type}">
+						  <label class="layui-form-label">指定人员</label>
+						  <div class="layui-input-inline" style="width:360px;">
+							<input type="text" name="flowNamesA[]" value="{$vo.flow_unames}" autocomplete="off" readonly class="layui-input picker-more">
+							<input type="hidden" name="flowUidsA[]" value="{$vo.flow_uids}">
+						  </div>
+						</div>
+						{gt name="$key" value="0"}
+						<span class="layui-btn layui-btn-danger layui-btn-sm">删除</span>
+						{/gt}
+					</div>
+					{/volist}
+					{else/}
+					<div class="layui-form-item layui-form-pane">
+						<div class="layui-inline">
+						  <label class="layui-form-label">第1级</label>
+						  <div class="layui-input-inline">
+							<select name="flowType[]" lay-filter="flowtype">
+								<option value="1">当前部门负责人</option>
+								<option value="2">上一级部门负责人</option>
+								<option value="3">指定人员(多人或签)</option>
+								<option value="4">指定人员(多人会签)</option>
+							</select>
+						  </div>
+						</div>
+						<div class="layui-inline select-1">
+						  <label class="layui-form-label">指定人员</label>
+						  <div class="layui-input-inline" style="width:360px;">
+							<input type="text" name="flowNamesA[]" value="" autocomplete="off" readonly class="layui-input picker-more">
+							<input type="hidden" name="flowUidsA[]" value="">
+						  </div>
+						</div>
+					</div>
+					{/eq}
+				</div>
+				<span id="addFlow2" class="layui-btn layui-btn-xs layui-btn-normal">+ 添加审批层级</span>
+				<div style="padding:10px; margin-top:10px; font-size:12px; background-color:#fffcf0">
+					<p><strong>温馨提示</strong></p>
+					<p>1、当选择<strong> “当前部门负责人” </strong>审批时。系统仅会通知当前部门的负责人。</p>
+					<p>2、当选择<strong> “上一级部门负责人” </strong>审批时。系统仅会通知当前部门的上一级部门的负责人。</p>
+					<p>3、当选择<strong> “指定人员(多人或签)” </strong>时，表示指定用户中任意一人审批即可，可单选或多选。</p>
+					<p>4、当选择<strong> “指定人员(多人会签)” </strong>时，表示指定人员中所有人都需要审批，可单选或多选。</p>
+					<p>5、如果指定用户没有分配查看审批模块的功能权限，系统会通知其审批，但是他无法查看此审批数据信息。</p>
+				</div>
+			</td>
+		</tr>
+		<tr id="flowTr3" {neq name="$detail.check_type" value="3"}style="display:none"{/neq}>
+			<td class="layui-td-gray">审批流程<font>*</font></td>
+			<td colspan="3">
+				<div id="flowList3">
+					{eq name="$detail.check_type" value="3"}
+					{volist name="detail.flow_list" id="vo"}
+					<div class="layui-form-item layui-form-pane">
+						<div class="layui-inline">
+						  <label class="layui-form-label">第{$key+1}级</label>
+						  <div class="layui-input-inline">
+							<input type="text" name="flowName[]" value="{$vo.flow_name}" autocomplete="off" placeholder="请输入流程名称" class="layui-input">
+						  </div>
+						</div>
+						<div class="layui-inline select-3">
+						  <label class="layui-form-label">指定人员</label>
+						  <div class="layui-input-inline" style="width:360px;">
+							<input type="text" name="flowNamesB[]" value="{$vo.flow_unames}" autocomplete="off" readonly class="layui-input picker-one">
+							<input type="hidden" name="flowUidsB[]" value="{$vo.flow_uids}">
+						  </div>
+						</div>
+						{gt name="$key" value="0"}
+						<span class="layui-btn layui-btn-danger layui-btn-sm">删除</span>
+						{/gt}
+					</div>
+					{/volist}
+					{else/}
+					<div class="layui-form-item layui-form-pane">
+						<div class="layui-inline">
+						  <label class="layui-form-label">第1级</label>
+						  <div class="layui-input-inline">
+							<input type="text" name="flowName[]" value="" autocomplete="off" placeholder="请输入流程名称" class="layui-input">
+						  </div>
+						</div>
+						<div class="layui-inline select-3">
+						  <label class="layui-form-label">指定人员</label>
+						  <div class="layui-input-inline" style="width:360px;">
+							<input type="text" name="flowNamesB[]" value="" autocomplete="off" readonly class="layui-input picker-one">
+							<input type="hidden" name="flowUidsB[]" value="">
+						  </div>
+						</div>
+					</div>
+					{/eq}
+				</div>
+				<span id="addFlow3" class="layui-btn layui-btn-xs layui-btn-normal">+ 添加审批层级</span>
+				<div style="padding:10px; margin-top:10px; font-size:12px; background-color:#fffcf0">
+					<p><strong>温馨提示</strong></p>
+					<p>1、<strong>指定人员</strong>单选。后期审批的时候，审批人只能该指定人员。</p>
+					<p>2、该审批流程可<strong>回退</strong>，当拒绝审核时，会自动回退到上一位审批人节点。</p>
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">抄送人</td>
+			<td colspan="3">
+				<input type="text" name="copy_unames" value="{$detail.copy_unames}" autocomplete="off" readonly class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="copy_uids" value="{$detail.copy_uids}">
+			</td>
+		</tr>
+	</table>
+	{/eq}
+	<div class="py-3">
+		<input type="hidden" name="id" value="{$id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','formSelects','oaPicker'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,formSelects = layui.formSelects;		  
+		//选择应用模块
+		form.on('select(flowcate)', function(data){
+			let callback = function (e) {
+				if (e.code == 0) {
+					if(e.data.length>0){
+						let ops='<option value="">--请选择--</option>';
+						for(var i=0;i<e.data.length;i++){
+							ops+='<option value="'+e.data[i].id+'">'+e.data[i].title+'</option>';
+						}
+						$('[name="flow_item"]').html(ops);
+						form.render();
+					}
+					else{
+						$('[name="flow_item"]').html('');
+						form.render();
+					}
+				}
+			}
+			tool.get("/adm/api/get_flow_item", {cate:data.value}, callback);
+		})
+		
+		//选择应用部门
+		var selcted = $('#department_ids').attr('xm-selected');
+		formSelects.data('select1', 'server', {
+			url: '/api/index/get_department_select',
+			keyword: selcted,
+		});
+		
+		
+		form.on('radio(checktype)', function(data){
+		  if(data.value==1){
+			$('#flowTr1').show();
+			$('#flowTr2').hide();
+			$('#flowTr3').hide();
+		  }
+		  else if(data.value==2){
+			$('#flowTr1').hide();
+			$('#flowTr2').show();
+			$('#flowTr3').hide();
+		  }
+		  else{
+			$('#flowTr1').hide();
+			$('#flowTr2').hide();
+			$('#flowTr3').show();
+		  }
+		});
+		
+		form.on('select(flowtype)', function(data){
+		  $(data.elem).parents('.layui-form-item').find('.layui-inline').eq(1).attr('class','layui-inline select-'+data.value);
+		});
+
+		//监听提交
+		form.on('submit(webform)', function(data){
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);					
+				}
+			}
+			tool.post("/adm/flow/add", data.field, callback);
+			return false;
+		});
+    
+		
+		$('#addFlow2').on('click',function(){
+			var len = $('#flowList2').find('.layui-form-item').length;
+			var index = len+1;
+			var timestamp=new Date().getTime();
+			var tem='<div class="layui-form-item  layui-form-pane">\
+						<div class="layui-inline">\
+						  <label class="layui-form-label label-index">第'+index+'级</label>\
+						  <div class="layui-input-inline">\
+							<select name="flowType[]" lay-filter="flowtype">\
+								<option value="1">当前部门负责人</option>\
+								<option value="2">上一级部门负责人</option>\
+								<option value="3">指定人员(多人或签)</option>\
+								<option value="4">指定人员(多人会签)</option>\
+							</select>\
+						  </div>\
+						</div>\
+						<div class="layui-inline select-1">\
+						  <label class="layui-form-label">指定人员</label>\
+						  <div class="layui-input-inline" style="width:360px;">\
+							<input type="text" name="flowNamesA[]" value="" autocomplete="off" readonly class="layui-input picker-admin" data-type="2">\
+							<input type="hidden" name="flowUidsA[]" value="">\
+						  </div>\
+						</div>\
+						<span class="layui-btn layui-btn-danger layui-btn-sm">删除</span>\
+					</div>';
+			$('#flowList2').append(tem);
+			form.render();
+		});
+		
+		$('#flowList2').on('click','.layui-btn-danger',function(){
+			$(this).parents('.layui-form-item').remove();
+			var items = $('.label-index').length;
+			if(items>0){
+				$('.label-index').each(function(index,item){
+					$(this).html('第'+(index+2)+'级');
+				})
+			}
+		});			
+		
+		//================================
+		$('#addFlow3').on('click',function(){
+			var len = $('#flowList3').find('.layui-form-item').length;
+			var index = len+1;
+			var timestamp=new Date().getTime();
+			var tem='<div class="layui-form-item  layui-form-pane">\
+						<div class="layui-inline">\
+						  <label class="layui-form-label label-index">第'+index+'级</label>\
+						  <div class="layui-input-inline">\
+							<input type="text" name="flowName[]" value="" autocomplete="off" placeholder="请输入流程名称" class="layui-input">\
+						  </div>\
+						</div>\
+						<div class="layui-inline select-3">\
+						  <label class="layui-form-label">指定人员</label>\
+						  <div class="layui-input-inline" style="width:360px;">\
+							<input type="text" name="flowNamesB[]" value="" autocomplete="off" readonly class="layui-input picker-one">\
+							<input type="hidden" name="flowUidsB[]" value="">\
+						  </div>\
+						</div>\
+						<span class="layui-btn layui-btn-danger layui-btn-sm">删除</span>\
+					</div>';
+			$('#flowList3').append(tem);
+			form.render();
+		});
+		
+		$('#flowList3').on('click','.layui-btn-danger',function(){
+			$(this).parents('.layui-form-item').remove();
+			var items = $('.label-index').length;
+			if(items>0){
+				$('.label-index').each(function(index,item){
+					$(this).html('第'+(index+2)+'级');
+				})
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/flow/work_flow.html b/app/adm/view/flow/work_flow.html
new file mode 100644
index 0000000000000000000000000000000000000000..ef4e7ab70b7af5713ad1ba91f502d1a6c40d5750
--- /dev/null
+++ b/app/adm/view/flow/work_flow.html
@@ -0,0 +1,141 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+.flow-content{position: fixed;top: 0;left: 0;right: 0;bottom: 0;z-index: 1;overflow-x: scroll;overflow-y: auto;padding:30px 0;background: #F5F5F7;user-select: none;}
+.flow-box *{margin: 0;padding: 0;box-sizing: border-box;}
+.remove-node{position: absolute; top: 6px; right: 8px; display: none; font-style:normal}
+.condition-priority{position: absolute; top: 6px; right: 8px;}
+.select-icon{position: absolute; top: 42px; right: 3px;}
+
+.top-left-cover-line{position: absolute;height: 3px;width: 50%;background-color: #f5f5f7;top: -2px;left: -1px;}
+.bottom-left-cover-line{position: absolute;height: 3px;width: 50%;background-color: #f5f5f7;bottom: -2px;left: -1px;}
+.top-right-cover-line{position: absolute;height: 3px;width: 50%;background-color: #f5f5f7;top: -2px;right: -1px;}
+.bottom-right-cover-line{position: absolute;height: 3px;width: 50%;background-color: #f5f5f7;bottom: -2px;right: -1px;}
+
+.flow-zoom{position: fixed; padding:10px; height: 32px;right: 36px;top: 36px; z-index: 10;font-size: 16px; box-shadow: 0 3px 6px 0 rgba(0, 0, 0, .3);background: #FFFFFF;border-radius: 5px;}
+.flow-zoom span.zoom-num{padding:0 12px; display: inline-block; height: 30px; line-height:28px;}
+.flow-zoom span.zoom-ctrl{display: inline-block;width: 30px; height: 30px; line-height:30px; border-radius:50%; border:1px solid #666; font-size: 20px; text-align: center;color: #666;cursor: pointer;}
+.flow-zoom span.zoom-ctrl:hover{color:#1e9fff;border-color:#1e9fff}
+.flow-zoom .layui-btn-group{display: inline-block;vertical-align:top; margin-left:12px;}
+
+.node-wrap{display: inline-flex;flex-direction: column;align-items: center;width: 100%;padding: 0 50px;position: relative;}
+.node-wrap-box{width: 220px;display: inline-flex;align-items: center;flex-direction: column;background-color: #FFFFFF;border-radius: 5px;box-shadow: 0 2px 5px 0 rgba(0, 0, 0, .1);cursor: pointer;border: 1px solid #F5F5F5;position: relative;}
+
+.node-wrap-box:hover{box-shadow: 0 3px 6px 0 rgba(0, 0, 0, .3);transition: all .3s;}
+.node-wrap-box::before{content: "";position: absolute;top: -8px;left: 50%;-webkit-transform: translateX(-50%);transform: translateX(-50%);width: 0;height: 4px;border-style: solid;border-width: 8px 6px 4px;border-color: #cacaca transparent transparent;background: #f5f5f7;}
+.node-start::before{display:none;}
+
+.node-wrap-box:hover .remove-node{display: block;}
+.node-wrap-box .user-edit{display: inline-block;}
+.node-wrap-box:hover .user-edit{}
+.node-wrap-box .node-title{border-radius: 4px 5px 0 0 }
+.node-wrap-box>div{width: 100%;}
+.node-wrap-box>div:nth-of-type(1){padding: 6px 10px;color: white;font-size: 12px;position: relative;}
+.node-wrap-box>div:nth-of-type(2){padding: 15px 10px;display: flex;justify-content: space-between;}
+
+.node-add-btn-box{position: relative;}
+.node-add-btn-box::before{content: "";position: absolute;top: 0;left: 0;right: 0;bottom: 0;z-index: -1;margin: auto;width: 2px;height: 100%;background-color: #cacaca;}
+.add-node-btn{padding: 20px 0 24px;}
+.add-node-btn button.add-node{border-radius: 50%;background: #1e9fff;font-size: 25px;border-color: #1e9fff;width: 32px;line-height: 30px;padding: 0;margin: 0;color: #fff;display: inline-block;font-weight: 400;text-align: center;white-space: nowrap;vertical-align: middle;touch-action: manipulation;cursor: pointer;border: 1px solid transparent;}
+.add-node-btn button.add-node:hover{transform: scale(1.2);transition:all .2s }
+
+.branch-box{display: flex;border-bottom: 2px solid #cccccc;border-top: 2px solid #cccccc;position: relative;}
+.branch-box-wrap{display: inline-flex;flex-direction: column;align-items: center;width: 100%;}
+.add-branch{position: absolute;display: inline-block;left: 50%;top: -15px;z-index: 1;border-radius: 15px;color: rgb(50, 150, 250);border: none;box-shadow: 0 2px 5px 0 rgba(0, 0, 0, .1);background: #FFFFFF;padding: 5px 10px;font-size: 12px;cursor: pointer;line-height: 20px;transform: translateX(-50%);}
+
+.col-box{display: inline-flex;background: #f5f5f7;;flex-direction: column;align-items: center;position: relative;}
+.col-box::before{content: "";position: absolute;top: 0;left: 0;right: 0;bottom: 0;z-index: 0;margin: auto;width: 2px;height: 100%;background-color: #cacaca;}
+
+.condition-judge{background-color: #FFFFFF;border-radius: 5px;width: 220px;position: relative;box-shadow: 0 2px 5px 0 rgba(0, 0, 0, .1);cursor: pointer;border: 1px solid #FFFFFF;}
+.condition-judge:hover{border: 1px solid #16b777;transition:all .3s}
+.condition-judge:hover .remove-node{display: block;}
+.condition-judge:hover .condition-priority{display:none;}
+.condition-judge>div:nth-of-type(2){padding: 15px 10px;}
+
+.condition-node-box{display: inline-flex;flex-direction: column;align-items: center;position: relative;padding: 30px 30px 0 30px;}
+.condition-node-box::before{content: "";position: absolute;top: 0;left: 0;right: 0;bottom: 0;margin: auto;width: 2px;height: 100%;background-color: #cacaca;}
+.condition-input{line-height: 19px;height: 18px;display: inline-block;width:150 px;padding: 0;padding-left: 5px;font-size: 12px;border: none;}
+.condition-title{padding: 5px 0;background-color: #ffffff;border-radius: 5px 5px 0 0;color: #15bc83;font-size: 12px;position: relative;}
+
+.end-node{border-radius: 50%;font-size: 14px;color: rgba(25, 31, 37, .4);text-align: left;}
+.end-node-circle{width: 10px;height: 10px;margin: auto;border-radius: 50%;background: #dbdcdc;}.end-node-text{margin-top: 5px;text-align: center;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<div class="flow-content">
+	<div id="flowBar" class="flow-zoom" data-zoom="10">               
+		<span class="zoom-ctrl" data-type="1"><strong>－</strong></span>         
+		<span class="zoom-num">100%</span>         
+		<span class="zoom-ctrl" data-type="2">+</span>
+		<div class="layui-btn-group">
+		  <button type="button" class="layui-btn layui-btn-sm">预览</button>
+		  <button type="button" class="layui-btn layui-btn-sm layui-bg-blue">发布</button>
+		</div>
+	</div>
+		
+	<div id="flowBox" class="flow-box" style="transform: scale(1); transform-origin: 50% 0px 0px;">
+		<!-- 发起人 -->
+		<div>
+			<div class="node-wrap">
+				<div class="node-wrap-box node-start">
+					<div class="node-title" style="background: #2f363c;">
+						<span>发起人</span>
+					</div>
+					<div>
+						<span>请设置发起人</span>
+						<i class="select-icon"><?xml version="1.0" encoding="UTF-8"?><svg width="24" height="24" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M19 12L31 24L19 36" stroke="#333" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></i>
+					</div>
+				</div>
+				<!-- 箭头 -->
+				<div class="node-add-btn-box">
+					<div class="add-node-btn">
+						<button class="add-node">+</button>
+					</div>
+				</div>
+			</div>
+		</div>
+		<!-- 审核人 -->
+		<div>
+			<div class="node-wrap">
+				<div class="node-wrap-box">
+					<div class="node-title" style="background:#ffb800">
+						<span class="user-edit">审核人</span>
+						<i class="remove-node">✖</i>
+					</div>
+					<div>
+						<span>请设置审核人</span>
+						<i class="select-icon"><?xml version="1.0" encoding="UTF-8"?><svg width="24" height="24" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M19 12L31 24L19 36" stroke="#333" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></i>
+					</div>
+				</div>
+				<!-- 箭头 -->
+				<div class="node-add-btn-box">
+					<div class="add-node-btn">
+						<button class="add-node">+</button>
+					</div>
+				</div>
+			</div> 
+		</div>
+		<!-- 流程结束 -->
+		<div class="end-node">
+			<div class="end-node-circle"></div>
+			<div class="end-node-text">
+				结束流程
+			</div>
+		</div>
+	</div>
+</div>
+{/block}
+<!-- /主体 -->
+{block name="copyright"}{/block}
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','oaFlow','oaPicker'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,oaFlow = layui.oaFlow;
+		oaFlow.init();		
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/meeting/records.html b/app/adm/view/meeting/records.html
new file mode 100644
index 0000000000000000000000000000000000000000..f579fd900d72147da71f9a3e147a72cbdb59dbe4
--- /dev/null
+++ b/app/adm/view/meeting/records.html
@@ -0,0 +1,127 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<style>
+.layui-table-tool-temp{padding-right:0}
+</style>
+<div class="p-3">
+	<form class="layui-form gg-form-bar border-x border-t" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:300px;">
+			<input type="text" class="layui-input" id="diff_time" placeholder="会议日期" readonly name="diff_time">
+		</div>
+		<div class="layui-input-inline" style="width:110px;">
+			<input type="text" name="anchor"  placeholder="主持人" class="layui-input picker-admin" readonly />
+			<input type="text" name="anchor_id" value="" style="display:none" />	
+		</div>
+		<div class="layui-input-inline" style="width:220px;">
+			<input type="text" name="keywords" placeholder="会议主题" class="layui-input"/>
+		</div>	
+		<div class="layui-input-inline" style="width:150px;">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form> 
+	<table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+    <span class="layui-btn layui-btn-sm tool-add" data-href="/adm/meeting/records_add">+ 会议纪要</span>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','oaPicker','laydatePlus','tablePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool ,form = layui.form, laydatePlus = layui.laydatePlus;	
+		//日期范围
+		var diff_time = new laydatePlus({'target':'diff_time'});
+		
+		layui.pageTable = table.render({
+			elem: '#test',
+			title: '会议纪要列表',
+			toolbar: '#toolbarDemo',
+			defaultToolbar: false,
+			page: true, //开启分页
+			limit: 20,
+			url: "/adm/meeting/records", //数据接口		
+			cols: [
+				[
+					{type:'checkbox',fixed:'left'},
+					{
+						field: 'id',
+						title: '序号',
+						align: 'center',
+						width: 80
+					}, {
+						field: 'meeting_date',
+						title: '会议日期',
+						align: 'center',
+						width: 100
+					},{
+						field: 'title',
+						title: '会议主题',
+						minWidth:240
+					},{
+						field: 'did_name',
+						title: '主办部门',
+						align: 'center',
+						width: 90
+					},{
+						field: 'anchor',
+						title: '主持人',
+						align: 'center',
+						width: 90
+					},{
+						field: 'recorder_name',
+						title: '记录人',
+						align: 'center',
+						width: 90
+					},{
+						field: 'right',
+						title: '操作',
+						width: 124,
+						align: 'center',
+						templet: function(d){
+							var btn='<div class="layui-btn-group"><span class="layui-btn layui-btn-xs layui-bg-blue" lay-event="view">查看</span><span class="layui-btn layui-btn-xs" lay-event="edit">编辑</span><span class="layui-btn layui-btn-xs layui-bg-red" lay-event="del">删除</span></div>';
+							return btn;
+						}
+					}
+				]
+			]
+		});
+
+		//监听行工具事件
+		table.on('tool(test)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/adm/meeting/records_view?id="+data.id);
+				return;
+			}
+			if (obj.event === 'edit') {
+				tool.side("/adm/meeting/records_add?id="+data.id);
+				return;
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定删除该会议纪要吗？', {
+					icon: 3,
+					title: '提示'
+				}, function(index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/adm/meeting/records_del", {id: data.id}, callback);
+					layer.close(index);
+				});
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
diff --git a/app/adm/view/meeting/records_add.html b/app/adm/view/meeting/records_add.html
new file mode 100644
index 0000000000000000000000000000000000000000..05f80a6188805e0be2d7a7a634c8aadf85935687
--- /dev/null
+++ b/app/adm/view/meeting/records_add.html
@@ -0,0 +1,106 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">新增会议纪要</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">会议时间<font>*</font></td>
+			<td><input type="text" name="meeting_date" lay-verify="required" readonly lay-reqText="请选择会议时间" placeholder="请选择会议时间" class="layui-input tool-time" data-type="datetime" data-format ="yyyy-MM-dd HH:mm"></td>
+			<td class="layui-td-gray">主持人<font>*</font></td>
+			<td>
+				<input type="text" name="anchor" lay-verify="required" readonly lay-reqText="请选择主持人" placeholder="请选择主持人" class="layui-input picker-admin">
+				<input type="hidden" name="anchor_id">
+			</td>
+			<td class="layui-td-gray">记录人<font>*</font></td>
+			<td>
+				<input type="text" name="recorder" lay-verify="required" readonly lay-reqText="请选择记录人" placeholder="请选择记录人" class="layui-input picker-admin">
+				<input type="hidden" name="recorder_id">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">会 议 室<font>*</font></td>
+			<td colspan="3">
+				<input type="text" name="room_name" autocomplete="off" readonly placeholder="请选择" lay-verify="required" readonly lay-reqText="请选择会议室" class="layui-input picker-oa" data-types="room">
+				<input type="hidden" name="room_id">
+			</td>
+			<td class="layui-td-gray">主办部门<font>*</font></td>
+			<td>
+				<input type="text" name="did_name" autocomplete="off" readonly placeholder="请选择" lay-verify="required" readonly lay-reqText="请选择主办部门" class="layui-input picker-oa" data-types="department">
+				<input type="hidden" name="did">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">参会人员<font>*</font></td>
+			<td colspan="5">
+				<input type="text" name="join" lay-verify="required" readonly lay-reqText="请选择参会人员" placeholder="请选择参会人员" class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="join_uids">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">会议主题<font>*</font></td>
+			<td colspan="5"><input type="text" name="title" lay-verify="required" lay-reqText="请输入会议主题" placeholder="请输入会议主题" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">会议内容<font>*</font></td>
+			<td colspan="5">
+				<textarea name="content" placeholder="请输入内容" class="layui-textarea" lay-verify="required" lay-reqText="请输入会议内容"></textarea>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2" style="vertical-align:top;">下一步<br>工作计划<font>*</font></td>
+			<td colspan="5">
+				<textarea name="plans" placeholder="请输入内容" class="layui-textarea" lay-verify="required" lay-reqText="请输入下一步工作计划"></textarea>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">参会人员签字<font>*</font></td>
+			<td colspan="5">
+				<input type="text" name="sign" lay-verify="required" readonly lay-reqText="请选择" placeholder="请选择" class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="sign_uids">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">共享给谁<font>*</font></td>
+			<td colspan="5">
+				<input type="text" name="share" lay-verify="required" readonly lay-reqText="请选择" placeholder="请选择" class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="share_uids">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">备注信息</td>
+			<td colspan="5">
+				<textarea name="remarks" placeholder="请输入内容" class="layui-textarea"></textarea>
+			</td>
+		</tr>
+	</table>
+	<div class="py-3">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','oaPicker'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool;		
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/adm/meeting/records_add", data.field, callback,clickbtn);
+			return false;
+		});
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/meeting/records_edit.html b/app/adm/view/meeting/records_edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..b79ae2efcf1889cc85fce77a01ca67e0b9ca7587
--- /dev/null
+++ b/app/adm/view/meeting/records_edit.html
@@ -0,0 +1,107 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">新增会议纪要</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">会议时间<font>*</font></td>
+			<td><input type="text" name="meeting_date" value="{$detail.meeting_date|date='Y-m-d H:i:s'}" lay-verify="required" readonly lay-reqText="请选择会议时间" placeholder="请选择会议时间" class="layui-input tool-time" data-type="datetime" data-format ="yyyy-MM-dd HH:mm"></td>
+			<td class="layui-td-gray">主持人<font>*</font></td>
+			<td>
+				<input type="text" name="anchor" value="{$detail.anchor_name}" lay-verify="required" readonly lay-reqText="请选择主持人" placeholder="请选择主持人" class="layui-input picker-admin">
+				<input type="hidden" name="anchor_id" value="{$detail.anchor_id}">
+			</td>
+			<td class="layui-td-gray">记录人<font>*</font></td>
+			<td>
+				<input type="text" name="recorder" value="{$detail.recorder_name}" lay-verify="required" readonly lay-reqText="请选择记录人" placeholder="请选择记录人" class="layui-input picker-admin">
+				<input type="hidden" name="recorder_id" value="{$detail.recorder_id}">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">会 议 室<font>*</font></td>
+			<td colspan="3">
+				<input type="text" name="room_name" value="{$detail.room}" autocomplete="off" readonly placeholder="请选择" lay-verify="required" readonly lay-reqText="请选择会议室" class="layui-input picker-oa" data-types="room">
+				<input type="hidden" name="room_id" value="{$detail.room_id}">
+			</td>
+			<td class="layui-td-gray">主办部门<font>*</font></td>
+			<td>
+				<input type="text" name="did_name" value="{$detail.did_name|default=''}" autocomplete="off" readonly placeholder="请选择"  lay-verify="required" readonly lay-reqText="请选择主办部门" class="layui-input picker-oa" data-types="department">
+				<input type="hidden" name="did" value="{$detail.did}">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">参会人员<font>*</font></td>
+			<td colspan="5">
+				<input type="text" name="join" value="{$detail.join_names}" lay-verify="required" readonly lay-reqText="请选择参会人员" placeholder="请选择参会人员" class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="join_uids" value="{$detail.join_uids}">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">会议主题<font>*</font></td>
+			<td colspan="5"><input type="text" name="title" value="{$detail.title}" lay-verify="required" lay-reqText="请输入会议主题" placeholder="请输入会议主题" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">会议内容<font>*</font></td>
+			<td colspan="5">
+				<textarea name="content" placeholder="请输入内容" class="layui-textarea" lay-verify="required" lay-reqText="请输入会议内容">{$detail.content}</textarea>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2" style="vertical-align:top;">下一步<br>工作计划<font>*</font></td>
+			<td colspan="5">
+				<textarea name="plans" placeholder="请输入内容" class="layui-textarea" lay-verify="required" lay-reqText="请输入下一步工作计划">{$detail.plans}</textarea>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">参会人员签字<font>*</font></td>
+			<td colspan="5">
+				<input type="text" name="sign" value="{$detail.sign_names}" lay-verify="required" readonly lay-reqText="请选择" placeholder="请选择" class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="sign_uids" value="{$detail.sign_uids}">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">共享给谁<font>*</font></td>
+			<td colspan="5">
+				<input type="text" name="share" value="{$detail.share_names}" lay-verify="required" readonly lay-reqText="请选择" placeholder="请选择" class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="share_uids" value="{$detail.share_uids}">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">备注信息</td>
+			<td colspan="5">
+				<textarea name="remarks" placeholder="请输入内容" class="layui-textarea">{$detail.remarks|default=''}</textarea>
+			</td>
+		</tr>
+	</table>
+	<div class="py-3">
+		<input type="hidden" name="id" value="{$detail.id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','oaPicker'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool;		
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/adm/meeting/records_add", data.field, callback,clickbtn);
+			return false;
+		});
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/meeting/records_view.html b/app/adm/view/meeting/records_view.html
new file mode 100644
index 0000000000000000000000000000000000000000..48966287c9e0955fcef43771c3bc25958d2a531f
--- /dev/null
+++ b/app/adm/view/meeting/records_view.html
@@ -0,0 +1,64 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">会议纪要</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">会议时间</td>
+			<td>{$detail.meeting_date|date='Y-m-d H:i:s'}</td>
+			<td class="layui-td-gray">主持人</td>
+			<td>{$detail.anchor_name}</td>
+			<td class="layui-td-gray">记录人</td>
+			<td>{$detail.recorder_name}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">会 议 室</td>
+			<td colspan="3">{$detail.room}</td>
+			<td class="layui-td-gray">主办部门</td>
+			<td>{$detail.did_name|default=""}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">参会人员</td>
+			<td colspan="5">{$detail.join_names}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">会议主题</td>
+			<td colspan="5">{$detail.title}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">会议内容</td>
+			<td colspan="5">{$detail.content}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2" style="vertical-align:top;">下一步<br>工作计划</td>
+			<td colspan="5">{$detail.plans}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">参会人员签字</td>
+			<td colspan="5">{$detail.sign_names}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">共享给谁</td>
+			<td colspan="5">{$detail.share_names}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">备注信息</td>
+			<td colspan="5">{$detail.remarks|default=''}</td>
+		</tr>
+	</table>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool;		
+
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/meeting/room.html b/app/adm/view/meeting/room.html
new file mode 100644
index 0000000000000000000000000000000000000000..b44a2254837dcda963110120c5e65df649aa3efb
--- /dev/null
+++ b/app/adm/view/meeting/room.html
@@ -0,0 +1,110 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page" style="height:100%; box-sizing: border-box;">
+	<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:300px">
+			<input type="text" name="keywords" placeholder="输入关键字" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="roomTable" lay-filter="roomTable"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm tool-add" data-href="/adm/meeting/room_add">+ 会议室</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+{block name="copyright"}{/block}
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool','tablePlus','laydatePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool,form = layui.form,laydatePlus = layui.laydatePlus;	
+		var diff_time = new laydatePlus({'target':'diff_time'});		
+		
+		layui.pageTable = table.render({
+			elem: '#roomTable'
+			,toolbar: '#toolbarDemo'
+			,title:'会议室列表'
+			,url: "/adm/meeting/room"
+			,is_excel: true
+			,page: true
+			,cellMinWidth: 60
+			,cols: [[
+					{field:'id',width:80, title: 'ID号', align:'center'}
+					,{field:'title',title: '会议室名称',width:150}
+					,{field:'num',title: '可容纳人数',width:100, align:'center'}
+					,{field:'keep_name',title: '管理员',width:80, align:'center'}
+					,{field:'address',title: '会议室地址',width:300, align:'center'}
+					,{field:'device',title: '会议室设备',minWidth:240,}
+					,{field:'status', title: '状态',width:60,align:'center',templet: function(d){
+						var html1='<span class="green">正常</span>';
+						var html2='<span class="yellow">禁用</span>';
+						if(d.status==1){
+							return html1;
+						}
+						else{
+							return html2;
+						}
+					}}
+					,{width:124,title: '操作', align:'center',templet: function(d){
+						var html='';
+						var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">查看</a>';
+						var btn1='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
+						var btn2='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+						var btn3='<a class="layui-btn layui-btn-xs layui-bg-purple" lay-event="open">启用</a>';
+						if(d.status==1){
+							html = '<div class="layui-btn-group">'+btn+btn1+btn2+'</div>';
+						}
+						else{
+							html = '<div class="layui-btn-group">'+btn+btn1+btn3+'</div>';
+						}
+						return html;
+					}}
+				]]
+		});
+		
+		table.on('tool(roomTable)',function (obj) {
+			var that = this;
+			if(obj.event === 'edit'){					
+				tool.side("/adm/meeting/room_add?id="+obj.data.id);
+			}
+			if(obj.event === 'view'){					
+				tool.side("/adm/meeting/room_view?id="+obj.data.id);
+			}
+			if(obj.event === 'disable'){
+				layer.confirm('确定要禁用该会议室吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/adm/meeting/room_check", { id: obj.data.id,status: 0,title: obj.data.title}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'open'){
+				layer.confirm('确定要启用该会议室吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/adm/meeting/room_check", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
+					layer.close(index);
+				});
+			}
+		});
+	}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/meeting/room_add.html b/app/adm/view/meeting/room_add.html
new file mode 100644
index 0000000000000000000000000000000000000000..565523453aa94b57636dda0a14ef412fcb0dff68
--- /dev/null
+++ b/app/adm/view/meeting/room_add.html
@@ -0,0 +1,71 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-1">新增会议室</h3>
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray-2">会议室名称<font>*</font></td>
+			<td colspan="3">
+				<input type="text" name="title" autocomplete="off" lay-verify="required" lay-reqText="请完善会议室名称" placeholder="请完善会议室名称" class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">地址(楼层)<font>*</font></td>
+			<td colspan="3">
+				<input type="text" name="address" autocomplete="off" lay-verify="required" lay-reqText="请完善会议室地址(楼层)" placeholder="请输入会议室地址(楼层)" class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">管 理 员<font>*</font></td>
+			<td>
+				<input type="text" name="keep_name" autocomplete="off" readonly lay-verify="required" lay-reqText="请选择会议室管理员" placeholder="请选择" class="layui-input picker-admin">
+				<input type="hidden" name="keep_uid">
+			</td>
+			<td class="layui-td-gray-2">可容纳人数<font>*</font></td>
+			<td><input type="text" name="num" autocomplete="off" placeholder="请输入可容纳人数" lay-verify="required|number" lay-reqText="请输入可容纳人数" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">内置设备<font>*</font></td>
+			<td colspan="3">
+				<input type="text" name="device" autocomplete="off" lay-verify="required" lay-reqText="请完善会议室内置设备" placeholder="请输入会议室内置设备" class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">相关描述</td>
+			<td colspan="3">
+				<textarea name="remark" placeholder="请输入会议室相关描述" class="layui-textarea"></textarea>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-2">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool','oaPicker'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool;
+	
+	//监听提交
+	form.on('submit(webform)', function(data){
+		let callback = function (e) {
+			layer.msg(e.msg);
+			if (e.code == 0) {
+				tool.sideClose(1000);				
+			}
+		}
+		let clickbtn = $(this);
+		tool.post("/adm/meeting/room_add", data.field, callback,clickbtn);
+		return false;
+	});
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/meeting/room_edit.html b/app/adm/view/meeting/room_edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..f084ff934b6c7c53f9fc4c4473fb181027cc75f5
--- /dev/null
+++ b/app/adm/view/meeting/room_edit.html
@@ -0,0 +1,72 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-1">编辑会议室</h3>
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray-2">会议室名称<font>*</font></td>
+			<td colspan="3">
+				<input type="text" name="title" value="{$detail.title}" autocomplete="off" lay-verify="required" lay-reqText="请完善会议室名称" placeholder="请完善会议室名称" class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">地址(楼层)<font>*</font></td>
+			<td colspan="3">
+				<input type="text" name="address" value="{$detail.address}" autocomplete="off" lay-verify="required" lay-reqText="请完善会议室地址(楼层)" placeholder="请输入会议室地址(楼层)" class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">管 理 员<font>*</font></td>
+			<td>
+				<input type="text" name="keep_name" value="{$detail.keep_name}" autocomplete="off" readonly lay-verify="required" lay-reqText="请选择会议室管理员" placeholder="请选择" class="layui-input picker-admin">
+				<input type="hidden" name="keep_uid" value="{$detail.keep_uid}">
+			</td>
+			<td class="layui-td-gray-2">可容纳人数<font>*</font></td>
+			<td><input type="text" name="num" autocomplete="off" value="{$detail.num}" placeholder="请输入费用金额" lay-verify="required|number" lay-reqText="请输入费用金额" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">内置设备<font>*</font></td>
+			<td colspan="3">
+				<input type="text" name="device" value="{$detail.device}" autocomplete="off" lay-verify="required" lay-reqText="请完善会议室内置设备" placeholder="请输入会议室内置设备" class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">相关描述</td>
+			<td colspan="3">
+				<textarea name="remark" placeholder="请输入会议室相关描述" class="layui-textarea">{$detail.remark|default=''}</textarea>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-2">
+		<input type="hidden" name="id" value="{$detail.id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool','oaPicker'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool;
+	
+	//监听提交
+	form.on('submit(webform)', function(data){
+		let callback = function (e) {
+			layer.msg(e.msg);
+			if (e.code == 0) {
+				tool.sideClose(1000);				
+			}
+		}
+		let clickbtn = $(this);
+		tool.post("/adm/meeting/room_add", data.field, callback,clickbtn);
+		return false;
+	});
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/meeting/room_view.html b/app/adm/view/meeting/room_view.html
new file mode 100644
index 0000000000000000000000000000000000000000..16c3132e67075078e559df8f28788606f604969b
--- /dev/null
+++ b/app/adm/view/meeting/room_view.html
@@ -0,0 +1,44 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-1">会议室信息</h3>
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray-2">会议室名称</td>
+			<td colspan="3">{$detail.title}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">地址(楼层)</td>
+			<td colspan="3">{$detail.address}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">管 理 员</td>
+			<td>{$detail.keep_name}</td>
+			<td class="layui-td-gray-2">可容纳人数</td>
+			<td>{$detail.num}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">内置设备</td>
+			<td colspan="3">{$detail.device}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">相关描述</td>
+			<td colspan="3">{$detail.remark|default=''}</td>
+		</tr>
+	</table>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool;
+
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/news/add.html b/app/adm/view/news/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..acbe679dbd6a33794d269b7afc231b66feaf830d
--- /dev/null
+++ b/app/adm/view/news/add.html
@@ -0,0 +1,94 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	{eq name="$id" value="0"}
+	<h3 class="pb-3">新增公司新闻</h3>
+	{else/}
+	<h3 class="pb-3">编辑公司新闻</h3>
+	{/eq}
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">新闻标题<font>*</font></td>
+			<td colspan="3">
+				<input type="text" name="title" lay-verify="required" lay-reqText="请输入新闻标题" placeholder="请输入新闻标题" class="layui-input" value="{$detail.title|default=''}">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">关联链接</td>
+			<td><input type="text" name="src" placeholder="请输入链接" class="layui-input" value="{$detail.src|default=''}"></td>
+			<td class="layui-td-gray">排序</td>
+			<td><input type="text" name="sort" placeholder="请输入排序，数字" class="layui-input" value="{$detail.sort|default=0}"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">
+				<div class="layui-input-inline">相关附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids|default=''}">
+					{notempty name="$detail.file_ids"}
+					{volist name="$detail.file_array" id="vo"}
+						<div class="layui-col-md4" id="uploadFile{$vo.id}">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">新闻内容<font>*</font></td>
+			<td colspan="3">
+				<textarea name="content" placeholder="请输入内容" class="layui-textarea" id="container" style="border:0;padding:0">{$detail.content|default=''}</textarea>
+			</td>
+		</tr>
+	</table>
+
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$id}" />
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','uploadPlus','tinymce'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,uploadPlus = layui.uploadPlus;
+		//相关附件上传
+		var attachment = new uploadPlus();
+		//编辑器初始化
+		var editor = layui.tinymce;
+		var edit = editor.render({
+			selector: "#container",
+			images_upload_url: '/api/index/upload/sourse/tinymce',//图片上传接口
+			height: 500
+		});
+		
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			data.field.content = tinyMCE.editors['container'].getContent();
+			if (data.field.content == '') {
+				layer.msg('请先完善新闻内容');
+				return false;
+			}
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/adm/news/add", data.field, callback,clickbtn);
+			return false;
+		});
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/news/datalist.html b/app/adm/view/news/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..3baa822c11c4dca604b410e0253a8cc1e7f116c5
--- /dev/null
+++ b/app/adm/view/news/datalist.html
@@ -0,0 +1,85 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:300px">
+			<input type="text" name="keywords" placeholder="关键字" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_news" lay-filter="table_news"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm tool-add" type="button" data-href="/adm/news/add">+ 添加公司新闻</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool;
+		
+		layui.pageTable = table.render({
+			elem: "#table_news"
+			, toolbar: "#toolbarDemo"
+			,url: "/adm/news/datalist"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 80
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',title: '名称'}
+				,{field:'admin_name',title: '创建人',width:90,align:'center'}
+				,{field:'create_time', title: '创建时间',width:150,align:'center'}
+				,{width:120,fixed:'right',title: '操作', align:'center',ignoreExport:true,templet: function(d){
+					var html='';
+					var btn1='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详细</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn3='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
+					html = '<div class="layui-btn-group">'+btn1+btn2+btn3+'</div>';
+					return html;
+				}}
+			]]
+		});
+			
+		table.on('tool(table_news)',function (obj) {
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/adm/news/view?id="+data.id);
+				return;
+			}
+			if (obj.event === 'edit') {
+				tool.side("/adm/news/add?id="+data.id);
+				return;
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要删除该内容吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/adm/news/del", { id: data.id }, callback);
+					layer.close(index);
+				});
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/news/view.html b/app/adm/view/news/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..c6f9098eccadab1448f11f03d8ef760e019e5991
--- /dev/null
+++ b/app/adm/view/news/view.html
@@ -0,0 +1,63 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<link rel="stylesheet" href="{__GOUGU__}/third_party/prism/prism.css"/>
+<style>
+.text-detial-ops{line-height: 30px; color:#999; font-size: 12px; padding: 12px 0;}
+.text-detial-ops span{margin-right: 20px;}
+.text-detial-ops a{margin-right:10px;}
+.text-detial-content{padding: 8px 0; color:#333; word-break: break-all; border-top:1px solid #e8e8e8;font-size: 16px!important; line-height: 1.72!important;}
+.text-detial-content p{padding: 8px 0;}
+.text-detial-content img{max-width:98%!important; margin:0 auto; display:block; border: 1px solid #e6e6e6; -webkit-box-shadow: 0 2px 6px rgba(26,26,26,.08); box-shadow: 0 2px 6px rgba(26,26,26,.08); border-radius: 4px;}
+.text-detial-content h1,.text-detial-content h2,.text-detial-content h3,.text-detial-content h4,.text-detial-content h5{margin-top:10px;}
+.text-detial-content a{color:#186AF2; font-style:italic;}
+.text-detial-content a:hover{text-decoration:underline;}
+
+.text-detial-content p code,.blog-detial-content pre{margin:0 3px;font-size: 14px; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; background: #f6f6f6; padding: 10px; border-radius: 2px;}
+.text-detial-content p code{border: 1px solid #eee;padding: 2px 4px;}
+.text-detial-content table {border-collapse: collapse; border-spacing: 0; display: block; width: 100%; overflow: auto;  word-break: normal;word-break: keep-all; margin-top: 0;margin-bottom: 16px;}
+.text-detial-content table tr {background-color: #fff;border-top: 1px solid #ccc;}
+.text-detial-content table tr:nth-child(2n) {background-color: #f8f8f8;}
+.text-detial-content table td, .blog-detial-content table th { padding: 6px 12px;border: 1px solid #ddd; font-size:14px; }
+.text-detial-content table th {font-weight: 800;}
+.text-detial-content li {list-style: initial;margin-left: 20px;}
+:not(pre)>code[class*=language-], pre[class*=language-]{background:#fff!important;border:1px solid #e8e8e8!important; border-radius:3px;}
+.upload-file{padding:12px; background-color:#fff; border:1px solid #eee; margin-bottom:12px;}
+.upload-file h3{margin-bottom:12px;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h1>{$detail.title}</h1>
+	<div class="text-detial-ops">
+		<span>{$detail.admin_name}发表于：{$detail.create_time | date='Y-m-d H:i:s'}</span>
+	</div>
+	<div class="text-detial-content">
+	{$detail.content|raw}
+	</div>
+	{notempty name="$detail.src"}
+	<div class="py-3" style="font-size:16px;">
+		关联链接：<a class="blue" href="{$detail.src}" target="_blank">{$detail.src}</a>
+	</div>
+	{/notempty}
+	{notempty name="$detail.file_ids"}
+	<div class="upload-file layui-row">
+		<h3>相关附件</h3>
+		{volist name="$detail.file_array" id="vo"}
+			<div class="layui-col-md4" id="uploadFile{$vo.id}">{:file_card($vo,'view')}</div>
+		{/volist}
+	</div>
+	{/notempty}	
+</div>
+{/block}
+<!-- 脚本 -->
+{block name="script"}
+<script src="{__GOUGU__}/third_party/prism/prism.js"></script>
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool;	
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/note/add.html b/app/adm/view/note/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..1619f25302cf61eeaeae3cc9e1165e6b49ad6193
--- /dev/null
+++ b/app/adm/view/note/add.html
@@ -0,0 +1,146 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	{eq name="$id" value="0"}
+	<h3 class="pb-3">新增公告</h3>
+	{else/}
+	<h3 class="pb-3">编辑公告</h3>
+	{/eq}
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">公告标题<font>*</font></td>
+			<td>
+				<input type="text" name="title" lay-verify="required" lay-reqText="请输入公告标题" placeholder="请输入公告标题" class="layui-input" value="{$detail.title|default=''}">
+			</td>
+			<td class="layui-td-gray">公告分类<font>*</font></td>
+			<td>
+				<select name="cate_id" lay-verify="required" lay-reqText="请选择分类">
+					<option value="">请选择分类</option>
+					{if condition="$id eq 0"}
+						{volist name=":get_base_data('note_cate')" id="v"}
+						<option value="{$v.id}">{$v.title}</option>
+						{/volist}
+					{else/}
+						{volist name=":get_base_data('note_cate')" id="v"}
+						<option value="{$v.id}" {eq name="$detail.cate_id" value="$v.id" }selected{/eq}>{$v.title}</option>
+						{/volist}
+					{/if}
+				</select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">展示期间<font>*</font></td>
+			<td id="date">
+				{if condition="$id eq 0"}
+				<div class="layui-input-inline" style="width:48%">
+					<input type="text" id="start_time" name="start_time" readonly lay-verify="required" lay-reqText="请选择公告展示开始时间" placeholder="请选择时间" class="layui-input" value="">
+				</div>
+				-
+				<div class="layui-input-inline" style="width:48%">
+					<input type="text" id="end_time" name="end_time" readonly lay-verify="required" lay-reqText="请选择公告展示结束时间" placeholder="请选择时间" class="layui-input" value="">
+				</div>
+				{else/}
+				<div class="layui-input-inline" style="width:48%">
+					<input type="text" id="start_time" name="start_time" readonly lay-verify="required" lay-reqText="请选择公告展示开始时间" placeholder="请选择时间" class="layui-input"value="{$detail.start_time|date='Y-m-d'}">
+				</div>
+				-
+				<div class="layui-input-inline" style="width:48%">
+					<input type="text" id="end_time" name="end_time" readonly lay-verify="required" lay-reqText="请选择公告展示结束时间" placeholder="请选择时间" class="layui-input" value="{$detail.end_time|date='Y-m-d'}">
+				</div>
+				{/if}
+			</td>
+			<td class="layui-td-gray">状态<font>*</font></td>
+			<td>
+				{if condition="$id eq 0"}
+				<input type="radio" name="status" value="1" title="正常" checked>
+				<input type="radio" name="status" value="0" title="禁用">
+				{else/}
+				<input type="radio" name="status" value="1" title="正常" {eq name="$detail.status" value="1" }checked{/eq}>
+				<input type="radio" name="status" value="0" title="禁用" {eq name="$detail.status" value="0" }checked{/eq}>
+				{/if}
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">关联链接</td>
+			<td><input type="text" name="src" placeholder="请输入链接" class="layui-input" value="{$detail.src|default=''}"></td>
+			<td class="layui-td-gray">排序</td>
+			<td><input type="text" name="sort" placeholder="请输入排序，数字" class="layui-input" value="{$detail.sort|default=0}"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">
+				<div class="layui-input-inline">相关附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids|default=''}">
+					{notempty name="$detail.file_ids"}
+					{volist name="$detail.file_array" id="vo"}
+						<div class="layui-col-md4" id="uploadFile{$vo.id}">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">公告内容<font>*</font></td>
+			<td colspan="3">
+				<textarea name="content" placeholder="请输入内容" class="layui-textarea" id="container" style="border:0;padding:0">{$detail.content|default=''}</textarea>
+			</td>
+		</tr>
+	</table>
+
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$id}" />
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','uploadPlus','tinymce'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,laydate = layui.laydate,uploadPlus = layui.uploadPlus;
+		//日期范围
+		laydate.render({
+			elem: '#date',
+			range: ['#start_time', '#end_time']
+		});
+		//相关附件上传
+		var attachment = new uploadPlus();
+		//编辑器初始化
+		var editor = layui.tinymce;
+		var edit = editor.render({
+			selector: "#container",
+			images_upload_url: '/api/index/upload/sourse/tinymce',//图片上传接口
+			height: 500
+		});
+		
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			data.field.content = tinyMCE.editors['container'].getContent();
+			if (data.field.content == '') {
+				layer.msg('请先完善公告内容');
+				return false;
+			}
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/adm/note/add", data.field, callback,clickbtn);
+			return false;
+		});
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/note/datalist.html b/app/adm/view/note/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..a4dd43c55b4b853179a9b767118d2adab7a3bbd1
--- /dev/null
+++ b/app/adm/view/note/datalist.html
@@ -0,0 +1,92 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:300px">
+			<input type="text" name="keywords" placeholder="关键字" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_note" lay-filter="table_note"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm tool-add" type="button" data-href="/adm/note/add">+ 添加公告通知</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool;
+		
+		layui.pageTable = table.render({
+			elem: "#table_note"
+			, toolbar: "#toolbarDemo"
+			,url: "/adm/note/datalist"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 80
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',title: '公告主题'}
+				,{field:'cate',title: '所属分类',width:120,align:'center'}
+				,{field: 'time',title: '公告展示期间',align: 'center',width: 180,
+					templet: function (d) {
+						var html = d.start_time + ' ~ ' + d.end_time;
+						return html;
+					}
+				}
+				,{field:'admin_name',title: '创建人',width:90,align:'center'}
+				,{field:'create_time', title: '创建时间',width:150,align:'center'}
+				,{width:120,fixed:'right',title: '操作', align:'center',ignoreExport:true,templet: function(d){
+					var html='';
+					var btn1='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详细</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn3='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
+					html = '<div class="layui-btn-group">'+btn1+btn2+btn3+'</div>';
+					return html;
+				}}
+			]]
+		});
+			
+		table.on('tool(table_note)',function (obj) {
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/adm/note/view?id="+data.id);
+				return;
+			}
+			if (obj.event === 'edit') {
+				tool.side("/adm/note/add?id="+data.id);
+				return;
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要删除该内容吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/adm/note/del", { id: data.id }, callback);
+					layer.close(index);
+				});
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/note/view.html b/app/adm/view/note/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..b21d5ac0f167fcf4f5a908a04b269525e54cddc1
--- /dev/null
+++ b/app/adm/view/note/view.html
@@ -0,0 +1,64 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<link rel="stylesheet" href="{__GOUGU__}/third_party/prism/prism.css"/>
+<style>
+.text-detial-ops{line-height: 30px; color:#999; font-size: 12px; padding: 12px 0;}
+.text-detial-ops span{margin-right: 20px;}
+.text-detial-ops a{margin-right:10px;}
+.text-detial-content{padding: 8px 0; color:#333; word-break: break-all; border-top:1px solid #e8e8e8;font-size: 16px!important; line-height: 1.72!important;}
+.text-detial-content p{padding: 8px 0;}
+.text-detial-content img{max-width:98%!important; margin:0 auto; display:block; border: 1px solid #e6e6e6; -webkit-box-shadow: 0 2px 6px rgba(26,26,26,.08); box-shadow: 0 2px 6px rgba(26,26,26,.08); border-radius: 4px;}
+.text-detial-content h1,.text-detial-content h2,.text-detial-content h3,.text-detial-content h4,.text-detial-content h5{margin-top:10px;}
+.text-detial-content a{color:#186AF2; font-style:italic;}
+.text-detial-content a:hover{text-decoration:underline;}
+
+.text-detial-content p code,.blog-detial-content pre{margin:0 3px;font-size: 14px; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; background: #f6f6f6; padding: 10px; border-radius: 2px;}
+.text-detial-content p code{border: 1px solid #eee;padding: 2px 4px;}
+.text-detial-content table {border-collapse: collapse; border-spacing: 0; display: block; width: 100%; overflow: auto;  word-break: normal;word-break: keep-all; margin-top: 0;margin-bottom: 16px;}
+.text-detial-content table tr {background-color: #fff;border-top: 1px solid #ccc;}
+.text-detial-content table tr:nth-child(2n) {background-color: #f8f8f8;}
+.text-detial-content table td, .blog-detial-content table th { padding: 6px 12px;border: 1px solid #ddd; font-size:14px; }
+.text-detial-content table th {font-weight: 800;}
+.text-detial-content li {list-style: initial;margin-left: 20px;}
+:not(pre)>code[class*=language-], pre[class*=language-]{background:#fff!important;border:1px solid #e8e8e8!important; border-radius:3px;}
+.upload-file{padding:12px; background-color:#fff; border:1px solid #eee; margin-bottom:12px;}
+.upload-file h3{margin-bottom:12px;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-5">
+	<h1>{$detail.title}</h1>
+	<div class="text-detial-ops">
+		<span>{$detail.admin_name}发表于：{$detail.create_time | date='Y-m-d H:i:s'}</span><span>公告分类：{$detail.cate}</span>
+		<span>展示期间：{$detail.start_time | date='Y-m-d'} - {$detail.end_time | date='Y-m-d'}</span>
+	</div>
+	<div class="text-detial-content">
+	{$detail.content|raw}
+	</div>
+	{notempty name="$detail.src"}
+	<div class="py-3" style="font-size:16px;">
+		关联链接：<a class="blue" href="{$detail.src}" target="_blank">{$detail.src}</a>
+	</div>
+	{/notempty}
+	{notempty name="$detail.file_ids"}
+	<div class="upload-file layui-row">
+		<h3>相关附件</h3>
+		{volist name="$detail.file_array" id="vo"}
+			<div class="layui-col-md4" id="uploadFile{$vo.id}">{:file_card($vo,'view')}</div>
+		{/volist}
+	</div>
+	{/notempty}	
+</div>
+{/block}
+<!-- 脚本 -->
+{block name="script"}
+<script src="{__GOUGU__}/third_party/prism/prism.js"></script>
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool;	
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/notecate/add.html b/app/adm/view/notecate/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..4645e371a3995df77bd245b56539945603ac6919
--- /dev/null
+++ b/app/adm/view/notecate/add.html
@@ -0,0 +1,49 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">公告类别</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">公告类别名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入公告类别名称" lay-reqText="请输入公告类别名称"class="layui-input" value="{$detail.title|default=''}">
+			</td>
+			<td class="layui-td-gray">排序</td>
+			<td>
+				<input type="text" name="sort" placeholder="请输入排序，数字" autocomplete="off" class="layui-input" value="{$detail.sort|default=''}">
+			</td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$detail.id|default=0}"/>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool'];
+
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/adm/notecate/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/notecate/datalist.html b/app/adm/view/notecate/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..e4f8afe2f41a1d48106e674d83e43aae8f9b4910
--- /dev/null
+++ b/app/adm/view/notecate/datalist.html
@@ -0,0 +1,124 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<table class="layui-hide" id="table_note_cate" lay-filter="table_note_cate"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm add-new" type="button">+ 添加公告类别</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool;
+		
+		layui.pageTable = table.render({
+			elem: "#table_note_cate"
+			,toolbar: '#toolbarDemo'
+			,url: "/adm/notecate/datalist"
+			,page: false
+			,limit: 999
+			,cellMinWidth: 80
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',title: '类型名称'}
+				,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+					var html1='<span class="green">正常</span>';
+					var html2='<span class="yellow">禁用</span>';
+					if(d.status==1){
+						return html1;
+					}
+					else{
+						return html2;
+					}
+				}}
+				,{width:100,title: '操作', align:'center',ignoreExport:true,templet: function(d){
+					var html='';
+					var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+					if(d.status==1){
+						html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+					}
+					else{
+						html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+					}
+					return html;
+				}}
+			]]
+		});
+			
+		table.on('tool(table_note_cate)',function (obj) {
+			if(obj.event === 'edit'){					
+				add_cate(obj.data.id,obj.data.title);
+			}
+			if(obj.event === 'disable'){
+				layer.confirm('确定要禁用该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/adm/notecate/set", {id:obj.data.id,status: 0}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'open'){
+				layer.confirm('确定要启用该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/adm/notecate/set", {id:obj.data.id,status:1}, callback);
+					layer.close(index);
+				});
+			}
+		});
+		
+		$('body').on('click','.add-new',function(){
+			add_cate(0,'');	
+		});
+		
+		function add_cate(id,val){
+			var title = '新增类型';
+			if(id>0){
+				title = '编辑类型';
+			}
+			layer.prompt({
+				title: title,
+				value: val,
+				yes: function(index, layero) {
+					// 获取文本框输入的值
+					var value = layero.find(".layui-layer-input").val();
+					if (value) {
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();				
+							}
+						}
+						tool.post("/adm/notecate/add", {id: id,title: value}, callback);
+						layer.close(index);
+					} else {
+						layer.msg('请填写类型名称');
+					}
+				}
+			})
+		}
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/notecate/view.html b/app/adm/view/notecate/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..f80d77de08026bcee1635bcecbcb1de9bde3286f
--- /dev/null
+++ b/app/adm/view/notecate/view.html
@@ -0,0 +1,16 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<h3 class="pb-3">公告类别详情</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">公告类别名称</td>
+			<td>{$detail.title|default=''}"></td>
+			<td class="layui-td-gray">排序</td>
+			<td>{$detail.sort|default=0}</td>
+		</tr>
+	</table>
+</div>
+{/block}
+<!-- /主体 -->
\ No newline at end of file
diff --git a/app/adm/view/official/add.html b/app/adm/view/official/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..84f0f041ca24141977462585935af3aa37216be8
--- /dev/null
+++ b/app/adm/view/official/add.html
@@ -0,0 +1,130 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-1">添加公文</h3>
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">公文名称<font>*</font></td>
+			<td colspan="3"><input type="text" name="title" autocomplete="off" placeholder="请输入公文名称" lay-verify="required" lay-reqText="请输入公文名称" class="layui-input"></td>
+			<td class="layui-td-gray">公文文号<font>*</font></td>
+			<td><input type="text" name="code" autocomplete="off" placeholder="请输入公文文号" lay-verify="required" lay-reqText="请输入公文文号" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">拟稿人<font>*</font></td>
+			<td>
+				<input type="text" name="draft_name" value='' readonly placeholder="请选择" lay-verify="required" lay-reqText="请选择拟稿人" class="layui-input picker-admin">
+				<input type="hidden" name="draft_uid" value=''>
+			</td>
+			<td class="layui-td-gray">拟稿部门<font>*</font></td>
+			<td>
+				<input type="text" name="draft_dame" value='' readonly placeholder="请选择" lay-verify="required" lay-reqText="请选择拟稿部门" class="layui-input picker-oa" data-types="department">
+				<input type="hidden" name="did" value=''>
+			</td>
+			<td class="layui-td-gray">拟稿日期<font>*</font></td>
+			<td><input type="text" name="draft_time" value='' readonly placeholder="请选择" lay-verify="required" lay-reqText="请选择拟稿日期" class="layui-input tool-time"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">主送人员<font>*</font></td>
+			<td colspan="3">
+				<input type="text" name="send_names" value='' readonly placeholder="请选择" lay-verify="required" lay-reqText="请选择主送人员" class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="send_uids" value=''>
+			</td>
+			<td class="layui-td-gray">抄送人员</td>
+			<td>
+				<input type="text" name="copy_names" value='' readonly placeholder="请选择" class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="copy_uids" value=''>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">共享可查阅人</td>
+			<td>
+				<input type="text" name="share_names" value='' readonly placeholder="请选择" class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="share_uids" value=''>
+			</td>
+			<td class="layui-td-gray">密级程度<font>*</font></td>
+			<td>
+				<input type="radio" name="secrets" value="1" title="公开">
+				<input type="radio" name="secrets" value="2" title="秘密">
+				<input type="radio" name="secrets" value="3" title="机密">
+			</td>
+			<td class="layui-td-gray">紧急程度<font>*</font></td>
+			<td>
+				<input type="radio" name="urgency" value="1" title="普通">
+				<input type="radio" name="urgency" value="2" title="紧急">
+				<input type="radio" name="urgency" value="3" title="加急">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">
+				<div class="layui-input-inline">相关附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="">
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">公文内容<font>*</font></td>
+			<td colspan="5">
+				<textarea name="content" placeholder="请输入内容" class="layui-textarea" id="container" style="border:0;padding:0"></textarea>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-1">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','uploadPlus','oaPicker','tinymce'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,uploadPlus= layui.uploadPlus,tinymce= layui.tinymce;	
+		//编辑器初始化
+		var editor = layui.tinymce;
+		var edit = editor.render({
+			selector: "#container",
+			images_upload_url: '/api/index/upload/sourse/tinymce',//图片上传接口
+			height: 500
+		});
+
+		//相关附件上传
+		var attachment = new uploadPlus();
+		//监听提交
+		form.on('submit(webform)', function(data){
+			data.field.content = tinyMCE.editors['container'].getContent();
+			if (data.field.content == '') {
+				layer.msg('请先完善公文内容');
+				return false;
+			}
+			if (!data.field.secrets || data.field.secrets == '') {
+				layer.msg('请选择密级程度');
+				return false;
+			}
+			if (!data.field.urgency || data.field.urgency == '') {
+				layer.msg('请选择紧急程度');
+				return false;
+			}
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);				
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/adm/official/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/official/datalist.html b/app/adm/view/official/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..4fd65d95fd7102fb5e9ab38f8e1b68e98f1ac3ad
--- /dev/null
+++ b/app/adm/view/official/datalist.html
@@ -0,0 +1,147 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<div class="layui-card border-x border-t" style="margin-bottom:0; box-shadow:0 0 0 0 rgb(5 32 96 / 0%)">
+		<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
+			<ul class="layui-tab-title">
+				<li class="layui-this">全部公文</li>
+				<li>我发的公文</li>
+				<li>我收到的公文</li>
+				<li>抄送给我的公文</li>
+				<li>共享查阅的公文</li>
+			</ul>
+		</div>
+	</div>
+	<form class="layui-form gg-form-bar border-x" id="barsearchform">
+		<div class="layui-input-inline" style="width:128px">
+			<select name="secrets">
+				<option value="">选择秘密程度</option>
+				{volist name="$secrets" id="vo"}
+				{gt name="$key" value="0"}
+				<option value="{$key}">{$vo}</option>
+				{/gt}
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:128px">
+			<select name="urgency">
+				<option value="">选择重要程度</option>
+				{volist name="$urgency" id="vo"}
+				{gt name="$key" value="0"}
+				<option value="{$key}">{$vo}</option>
+				{/gt}
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:300px">
+			<input type="text" name="keywords" placeholder="关键字" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<input type="hidden" name="tab" value="0" />
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_official" lay-filter="table_official"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm tool-add" type="button" data-href="/adm/official/add">+ 添加公文</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool, element = layui.element;
+		//tab切换
+		element.on('tab(tab)', function(data){
+			$('[name="tab"]').val(data.index);
+			$("#barsearchform")[0].reset();
+			layui.pageTable.reload({where:{tab:data.index},page:{curr:1}});
+			return false;
+		});
+		
+		layui.pageTable = table.render({
+			elem: "#table_official"
+			, toolbar: "#toolbarDemo"
+			,url: "/adm/official/datalist"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 60
+			,height: 'full-152'
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'check_status',title: '审核状态',width:110, align:'center',templet: function(d){
+					var html = '<span class="check-status-color-'+d.check_status+'">『'+d.check_status_str+'』</span>';
+					return html;
+				}}
+				,{field:'title',title: '公文主题',minWidth:240}
+				,{field:'code',title: '公文编号',width:160}
+				,{field:'secrets_str',title: '密级程度',width:80, align:'center'}
+				,{field:'urgency_str',title: '紧急程度',width:80, align:'center'}
+				,{field:'draft_name',title: '拟稿人',width:80, align:'center'}
+				,{field:'draft_time',title: '拟稿日期',width:100, align:'center'}
+				,{field:'draft_dname',title: '拟稿部门',width:100, align:'center'}
+				,{field:'create_time', title: '创建时间',width:150,align:'center'}
+				,{width:120,fixed:'right',title: '操作', align:'center',templet: function(d){
+					var html='';
+					var btn1='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详细</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn3='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
+					if((d.check_status==0 || d.check_status==4)&& d.admin_id == login_admin){
+						html = '<div class="layui-btn-group">'+btn1+btn2+btn3+'</div>';
+					}
+					else{
+						html = '<div class="layui-btn-group">'+btn1+'</div>';
+					}
+					return html;
+				}}
+			]]
+		});
+		
+		//表头工具栏事件
+		table.on('toolbar(table_official)', function(obj){
+			if (obj.event === 'add') {
+				tool.side("/adm/official/add");
+				return;
+			}
+		});	
+			
+		table.on('tool(table_official)',function (obj) {
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/adm/official/view?id="+data.id);
+				return;
+			}
+			if (obj.event === 'edit') {
+				tool.side("/adm/official/add?id="+data.id);
+				return;
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要删除该内容吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/adm/official/del", { id: data.id }, callback);
+					layer.close(index);
+				});
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/official/edit.html b/app/adm/view/official/edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..0aa3faf04856c097e4ee7b846c9fac5b857f7077
--- /dev/null
+++ b/app/adm/view/official/edit.html
@@ -0,0 +1,128 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-1">编辑公文</h3>
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">公文名称<font>*</font></td>
+			<td colspan="3"><input type="text" name="title" value="{$detail.title}" autocomplete="off" placeholder="请输入公文名称" lay-verify="required" lay-reqText="请输入公文名称" class="layui-input"></td>
+			<td class="layui-td-gray">公文文号<font>*</font></td>
+			<td><input type="text" name="code" value="{$detail.code}" autocomplete="off" placeholder="请输入公文文号" lay-verify="required" lay-reqText="请输入公文文号" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">拟稿人<font>*</font></td>
+			<td>
+				<input type="text" name="draft_name" value='{$detail.draft_name}' readonly placeholder="请选择" lay-verify="required" lay-reqText="请选择拟稿人" class="layui-input picker-admin">
+				<input type="hidden" name="draft_uid" value='{$detail.draft_uid}'>
+			</td>
+			<td class="layui-td-gray">拟稿部门<font>*</font></td>
+			<td>
+				<input type="text" name="draft_dame" value='{$detail.draft_dame}' readonly placeholder="请选择" lay-verify="required" lay-reqText="请选择拟稿部门" class="layui-input picker-oa" data-types="department">
+				<input type="hidden" name="did" value='{$detail.did}'>
+			</td>
+			<td class="layui-td-gray">拟稿日期<font>*</font></td>
+			<td><input type="text" name="draft_time" value='{$detail.draft_time|date="Y-m-d"}' readonly placeholder="请选择" lay-verify="required" lay-reqText="请选择拟稿日期" class="layui-input tool-time"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">主送人员<font>*</font></td>
+			<td colspan="3">
+				<input type="text" name="send_names" value='{$detail.send_names}' readonly placeholder="请选择" lay-verify="required" lay-reqText="请选择主送人员" class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="send_uids" value='{$detail.send_uids}'>
+			</td>
+			<td class="layui-td-gray">抄送人员</td>
+			<td>
+				<input type="text" name="copy_names" value='{$detail.copy_names}' readonly placeholder="请选择" class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="copy_uids" value='{$detail.copy_uids}'>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">共享可查阅人<font>*</font></td>
+			<td>
+				<input type="text" name="share_names" value='{$detail.share_names}' readonly placeholder="请选择" class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="share_uids" value='{$detail.share_uids}'>
+			</td>
+			<td class="layui-td-gray">密级程度<font>*</font></td>
+			<td>
+				<input type="radio" name="secrets" value="1" title="公开" {eq name="$detail.secrets" value="1"} checked{/eq}>
+				<input type="radio" name="secrets" value="2" title="秘密" {eq name="$detail.secrets" value="2"} checked{/eq}>
+				<input type="radio" name="secrets" value="3" title="机密" {eq name="$detail.secrets" value="3"} checked{/eq}>
+			</td>
+			<td class="layui-td-gray">紧急程度<font>*</font></td>
+			<td>
+				<input type="radio" name="urgency" value="1" title="普通" {eq name="$detail.urgency" value="1"} checked{/eq}>
+				<input type="radio" name="urgency" value="2" title="紧急" {eq name="$detail.urgency" value="2"} checked{/eq}>
+				<input type="radio" name="urgency" value="3" title="加急" {eq name="$detail.urgency" value="3"} checked{/eq}>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">
+				<div class="layui-input-inline">相关附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids}">
+					{notempty name="$detail.file_array"}
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="fileItem{$vo.id}">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">公文内容<font>*</font></td>
+			<td colspan="5">
+				<textarea name="content" placeholder="请输入内容" class="layui-textarea" id="container" style="border:0;padding:0">{$detail.content}</textarea>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-1">
+		<input type="hidden" name="id" value="{$detail.id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','uploadPlus','oaPicker','tinymce'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,uploadPlus= layui.uploadPlus,tinymce= layui.tinymce;	
+		//编辑器初始化
+		var editor = layui.tinymce;
+		var edit = editor.render({
+			selector: "#container",
+			images_upload_url: '/api/index/upload/sourse/tinymce',//图片上传接口
+			height: 500
+		});
+
+		//相关附件上传
+		var attachment = new uploadPlus();
+		//监听提交
+		form.on('submit(webform)', function(data){
+			data.field.content = tinyMCE.editors['container'].getContent();
+			if (data.field.content == '') {
+				layer.msg('请先完善公文内容');
+				return false;
+			}
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);				
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/adm/official/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/official/pending.html b/app/adm/view/official/pending.html
new file mode 100644
index 0000000000000000000000000000000000000000..6ad28b49875370bd71fac1ab24a7c4f8b4833b96
--- /dev/null
+++ b/app/adm/view/official/pending.html
@@ -0,0 +1,64 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:300px">
+			<input type="text" name="keywords" placeholder="关键字" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_official" lay-filter="table_official"></table>
+</div>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool;
+		
+		layui.pageTable = table.render({
+			elem: "#table_official"
+			,toolbar: false
+			,url: "/adm/official/pending"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 60
+			,height: 'full-112'
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',title: '公文主题',minWidth:240}
+				,{field:'code',title: '公文编号',width:160}
+				,{field:'secrets_str',title: '密级程度',width:80, align:'center'}
+				,{field:'urgency_str',title: '紧急程度',width:80, align:'center'}
+				,{field:'draft_name',title: '拟稿人',width:80, align:'center'}
+				,{field:'draft_time',title: '拟稿日期',width:100, align:'center'}
+				,{field:'draft_dname',title: '拟稿部门',width:100, align:'center'}
+				,{field:'create_time', title: '创建时间',width:150,align:'center'}
+				,{width:80,fixed:'right',title: '操作', align:'center',templet: function(d){
+					var btn1='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详细</a>';
+					return btn1;
+				}}
+			]]
+		});
+			
+		table.on('tool(table_official)',function (obj) {
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/adm/official/view?id="+data.id);
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/official/reviewed.html b/app/adm/view/official/reviewed.html
new file mode 100644
index 0000000000000000000000000000000000000000..baf378dd184ba357e27f5ecb35d02975de64997c
--- /dev/null
+++ b/app/adm/view/official/reviewed.html
@@ -0,0 +1,64 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:300px">
+			<input type="text" name="keywords" placeholder="关键字" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_official" lay-filter="table_official"></table>
+</div>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool;
+		
+		layui.pageTable = table.render({
+			elem: "#table_official"
+			,toolbar: false
+			,url: "/adm/official/reviewed"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 60
+			,height: 'full-112'
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',title: '公文主题',minWidth:240}
+				,{field:'code',title: '公文编号',width:160}
+				,{field:'secrets_str',title: '密级程度',width:80, align:'center'}
+				,{field:'urgency_str',title: '紧急程度',width:80, align:'center'}
+				,{field:'draft_name',title: '拟稿人',width:80, align:'center'}
+				,{field:'draft_time',title: '拟稿日期',width:100, align:'center'}
+				,{field:'draft_dname',title: '拟稿部门',width:100, align:'center'}
+				,{field:'create_time', title: '创建时间',width:150,align:'center'}
+				,{width:80,fixed:'right',title: '操作', align:'center',templet: function(d){
+					var btn1='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详细</a>';
+					return btn1;
+				}}
+			]]
+		});
+			
+		table.on('tool(table_official)',function (obj) {
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/adm/official/view?id="+data.id);
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/official/view.html b/app/adm/view/official/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..ab55d292ed99f070e5327ae72718bd84ee532b1d
--- /dev/null
+++ b/app/adm/view/official/view.html
@@ -0,0 +1,110 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<h3 class="pb-1">公文详情</h3>
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">公文名称</td>
+			<td colspan="3">{$detail.title}</td>
+			<td class="layui-td-gray">公文文号</td>
+			<td>{$detail.code}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">拟稿人</td>
+			<td>{$detail.draft_name}</td>
+			<td class="layui-td-gray">拟稿部门</td>
+			<td>{$detail.draft_dame}</td>
+			<td class="layui-td-gray">拟稿日期</td>
+			<td>{$detail.draft_time|date="Y-m-d"}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">主送人员</td>
+			<td colspan="3">{$detail.send_names}</td>
+			<td class="layui-td-gray">抄送人员</td>
+			<td>{$detail.copy_names|default='-'}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">共享可查阅人</td>
+			<td>{$detail.share_names|default='-'}
+				{eq name="$auth_office" value="1"}
+				<span id="shares" data-ids="{$detail.share_uids}" data-names="{$detail.share_names}" class="layui-btn layui-btn-xs layui-btn-normal ml-1">更改</span>
+				{/eq}
+			</td>
+			<td class="layui-td-gray">密级程度</td>
+			<td>
+				{eq name="$detail.secrets" value="1"}公开{/eq}
+				{eq name="$detail.secrets" value="2"}秘密{/eq}
+				{eq name="$detail.secrets" value="3"}机密{/eq}
+			</td>
+			<td class="layui-td-gray">紧急程度</td>
+			<td>
+				{eq name="$detail.urgency" value="1"}普通{/eq}
+				{eq name="$detail.urgency" value="2"}紧急{/eq}
+				{eq name="$detail.urgency" value="3"}加急{/eq}
+			</td>
+		</tr>
+		{notempty name="$detail.file_ids"}
+		<tr>
+			<td class="layui-td-gray-2">相关附件</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="fileItem{$vo.id}">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">公文内容</td>
+			<td colspan="5">{$detail.content|raw}</td>
+		</tr>
+	</table>
+	
+	<div id="checkBox" data-status="{$detail.check_status}" data-id="{$detail.id}" data-checkflowid="{$detail.check_flow_id}"></div>
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var detail_id = {$detail.id};
+	const moduleInit = ['tool','oaCheck','oaPicker'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,oaCheck=layui.oaCheck,oaPicker=layui.oaPicker;	
+		oaCheck.init({
+			check_name:'official_docs',
+			check_copy:0
+		});
+		
+		let eventCallback = function (e) {
+			layer.msg(e.msg);
+			parent.layui.pageTable.reload();
+			setTimeout(function(){
+				location.reload();
+			},1200)					
+		}
+		//选择共享成员弹窗	
+		$('body').on('click','#shares',function () {
+			let that = $(this);
+			let ids=$(this).data('ids')+'',names = $(this).data('names')+'';
+			oaPicker.employeeInit({
+				ids:ids,
+				names:names,
+				type:2,//1是单选，2是多选
+				callback:function(data){
+					let select_id=[],select_name=[];
+					for(var a=0; a<data.length;a++){
+						select_id.push(data[a].id);
+						select_name.push(data[a].name);
+					}
+					tool.post("/adm/official/add", {'id':detail_id,'share_uids':select_id.join(','),'scene':'change'}, eventCallback);
+				}
+			});
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/property/add.html b/app/adm/view/property/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..b8cc3e9d836f5fd08e0af512314bbe5fca6c05f9
--- /dev/null
+++ b/app/adm/view/property/add.html
@@ -0,0 +1,184 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-1">新增资产</h3>
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">资产名称<font>*</font></td>
+			<td colspan="3">
+				<input type="text" name="title"  placeholder="请输入资产名称" lay-verify="required" lay-reqText="请输入资产名称" class="layui-input">
+			</td>
+			<td class="layui-td-gray-2" rowspan="5">
+			资产缩略图
+			<button type="button" class="layui-btn layui-btn-sm" id="uploadImg">+ 上传图片</button>
+			</td>
+			<td rowspan="5" style="width:252px;">
+				  <div id="demo1" style="width: 240px; height:136px; overflow: hidden;">
+					<img src="" style="max-width: 100%; height:136px;" />
+					<input type="hidden" name="thumb" value="">
+				  </div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">资产编码<font>*</font></td>
+			<td>
+				<input type="text" name="code"  value="{:get_codeno('ZC')}" class="layui-input" lay-verify="required">
+			</td>
+			<td class="layui-td-gray">资产型号<font>*</font></td>
+			<td><input type="text" name="model"  value="" class="layui-input" lay-verify="required"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">资产分类<font>*</font></td>
+			<td>
+			  <select name="cate_id" lay-verify="required" lay-reqText="请选择资产分类">
+				<option value="">请选择大分类</option>
+				{volist name=":set_recursion(get_base_data('PropertyCate'))" id="v"}
+				<option value="{$v.id}">{$v.title}</option>
+				{/volist}
+			  </select>
+			</td>
+			<td class="layui-td-gray">资产品牌<font>*</font></td>
+			<td>
+				<select name="brand_id" lay-verify="required" lay-reqText="请选择品牌">
+				<option value="">请选择品牌</option>
+				{volist name=":get_base_data('PropertyBrand')" id="v"}
+				<option value="{$v.id}">{$v.title}</option>
+				{/volist}
+			  </select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">质保到期日<font>*</font></td>
+			<td><input type="text" name="quality_time"  readonly placeholder="请选择质保到期日" class="layui-input tool-time" lay-verify="required" lay-reqText="请完善质保到期日"></td>
+			<td class="layui-td-gray">资产单位<font>*</font></td>
+			<td>
+				<select name="unit_id" lay-verify="required" lay-reqText="请选择资产单位">
+				<option value="">请选择单位</option>
+				{volist name=":get_base_data('PropertyUnit')" id="v"}
+				<option value="{$v.id}">{$v.title}</option>
+				{/volist}
+			  </select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">使用人员</td>
+			<td>
+				<input type="text" name="users_name"  readonly placeholder="请选择使用人员" class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="user_ids" value="">
+			</td>
+			<td class="layui-td-gray">使用部门</td>
+			<td><select id="user_dids" name="user_dids" xm-selected="" xm-select="select1" xm-select-skin="default"></select></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">购买价格<font>*</font></td>
+			<td><input type="text" name="price"  placeholder="请输入购买价格" lay-verify="required|number" lay-reqText="请输入购买价格" class="layui-input"></td>
+			<td class="layui-td-gray">购买日期<font>*</font></td>
+			<td><input type="text" name="buy_time"  readonly placeholder="请选择购买日期" lay-verify="required" lay-reqText="请选择购买日期" class="layui-input tool-time"></td>
+			<td class="layui-td-gray">年折旧率(%)<font>*</font></td>
+			<td><input type="text" name="rate"  placeholder="请输入年折旧率，不需要输入%" lay-verify="required|number" lay-reqText="请输入年折旧率，不需要%" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">资产状态<font>*</font></td>
+			<td colspan="5">
+				{volist name="$status" id="vo"}
+				<input type="radio" name="status" value="{$key}" title="{$vo}">
+				{/volist}
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">资产来源<font>*</font></td>
+			<td colspan="5">
+				{volist name="$source" id="vo"}
+				{gt name="$key" value="0"}
+				<input type="radio" name="source" value="{$key}" title="{$vo}">
+				{/gt}
+				{/volist}
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">放置地址</td>
+			<td colspan="5"><input type="text" name="address"  placeholder="请输入放置地址" class="layui-input"></td>
+		</tr> 
+		<tr>
+			<td class="layui-td-gray-2">
+				<div class="layui-input-inline">相关附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="">
+				</div>
+			</td>
+		</tr> 
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">资产描述</td>
+			<td colspan="5">
+				<textarea name="content" placeholder="请输入内容" class="layui-textarea" id="container"></textarea>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-2">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool','formSelects','uploadPlus','oaPicker'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool,uploadPlus = layui.uploadPlus, formSelects = layui.formSelects;
+	
+	//选择部门
+	var selected = $('#department_ids').attr('xm-selected');
+	formSelects.data('select1', 'server', {
+		url: '/api/index/get_department_select',
+		keyword: selected
+	});
+    //单图上传
+	var photoUpload = new uploadPlus({
+		'use':'single',
+		'target':'uploadImg',
+		'callback':function(res){
+			layer.msg(res.msg);
+			if (res.code == 0) {
+				//上传成功
+				$('#demo1 input').attr('value', res.data.id);
+				$('#demo1 img').attr('src', res.data.filepath);
+			}
+		}
+	});
+
+	//相关附件上传
+	var attachment = new uploadPlus();
+	
+	//监听提交
+	form.on('submit(webform)', function(data){
+		let callback = function (e) {
+			layer.msg(e.msg);
+			if (e.code == 0) {
+				tool.sideClose(1000);				
+			}
+		}
+		if(!data.field.status){
+			layer.msg('请选择资产状态');
+			return false;
+		}
+		if(!data.field.source){
+			layer.msg('请选择资产来源');
+			return false;
+		}
+		let clickbtn = $(this);
+		tool.post("/adm/property/add", data.field, callback,clickbtn);
+		return false;
+	});
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/property/datalist.html b/app/adm/view/property/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..e0bed39790e742597004f0841f30ee411cf33f85
--- /dev/null
+++ b/app/adm/view/property/datalist.html
@@ -0,0 +1,158 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+  <style>
+	.tree-left{width:220px; float:left; height:calc(100% - 40px); overflow: scroll; border:1px solid #eeeeee; background-color:#fff; padding:12px 12px 12px 5px;}
+	.tree-left h3{font-size:16px; height:30px; padding-left:10px; font-weight:800}
+  </style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page" style="height:100%; box-sizing: border-box;">
+	<div class="tree-left">
+		<h3>资产分类</h3>
+		<div id="cate"></div>
+	</div>
+	<div class="body-table" style="margin-left:248px; overflow:hidden;">
+		<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
+			<div class="layui-input-inline" style="width:120px">
+				<select name="brand_id">
+					<option value="">资产品牌</option>
+					{volist name=":get_base_data('PropertyBrand')" id="v"}
+					<option value="{$v.id}">{$v.title}</option>
+					{/volist}
+				</select>
+			</div>
+			<div class="layui-input-inline" style="width:100px">
+				<select name="status">
+					<option value="">资产状态</option>
+					{volist name="$status" id="vo"}
+					<option value="{$key}">{$vo}</option>
+					{/volist}
+				</select>
+			</div>
+			<div class="layui-input-inline" style="width:300px">
+				<input type="text" name="keywords" placeholder="输入关键字" class="layui-input" autocomplete="off" />
+			</div>
+			<div class="layui-input-inline" style="width:150px">
+				<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+				<button type="reset" class="layui-btn layui-btn-reset" lay-filter="reset">清空</button>
+			</div>
+		</form>
+		<table class="layui-hide" id="test" lay-filter="test"></table>
+	</div>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm tool-add" type="button" data-href="/adm/property/add">+ 添加资产</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+{block name="copyright"}{/block}
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const status_types = [{"id":0,"title":"闲置"},{"id":1,"title":"在用"},{"id":2,"title":"维修"},{"id":3,"title":"报废"},{"id":4,"title":"丢失"}];
+	const moduleInit = ['tool','tablePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool,tree = layui.tree,form = layui.form,dropdown = layui.dropdown;			
+		$.ajax({
+			url: "/adm/api/get_propertycate_tree",
+			type:'get',
+			success:function(res){					
+				//仅节点左侧图标控制收缩
+				tree.render({
+					elem: '#cate',
+					data: res.trees,
+					onlyIconControl: true,  //是否仅允许节点左侧图标控制展开收缩
+					click: function(obj){
+						//layer.msg(JSON.stringify(obj.data));
+						layui.pageTable.reload({
+						   where: {cate_id: obj.data.id},
+						   page:{curr:1}
+						});
+						$('[name="keywords"]').val('');
+						$('[name="brand_id"]').val('');
+						$('[name="status"]').val('');
+						form.render();
+					}
+				});	
+			}
+		})
+		
+		
+		layui.pageTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,title:'资产列表'
+			,url: "/adm/property/datalist"
+			,is_excel: true
+			,page: true
+			,cellMinWidth: 60
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'code',width:160, title: '资产编码', align:'center'}
+				,{field:'cate',width:120, title: '资产分类', align:'center'}
+				,{field:'title',minWidth:240,title: '资产名称'}
+				,{field:'brand',title: '品牌',align: 'center',width: 100}
+				,{field:'model',title: '型号',align: 'center',width: 100}
+				,{field:'unit',title: '单位',align: 'center',width: 60}
+				,{field:'price',width:100, title: '价格(元)', align:'center',style:"color:#16b777"}
+				,{field:'status_str', title: '状态',width:60,align:'center'}
+				,{field:'create_name',title: '创建人',align: 'center',width: 80}
+				,{field:'create_time',title: '创建时间',align: 'center',width: 145}
+				,{field:'update_name',title: '最后修改人',align: 'center',width: 100}
+				,{field:'update_time_str',title: '最后修改时间',align: 'center',width: 145}
+				,{width:200,fixed:'right', title: '操作', align:'center',templet: function(d){
+					var html='';
+					var btn='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a><a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</a>';
+					var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="set">设置状态 <i class="layui-icon layui-icon-down layui-font-12"></i></a>';
+					var btn2='<a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="repair">维修</a>';
+						html = '<div class="layui-btn-group">'+btn+btn1+btn2+'</div>';
+					return html;
+				}}
+			]]
+		});
+		
+		table.on('tool(test)',function (obj) {
+			var that = this;
+			if(obj.event === 'edit'){					
+				tool.side("/adm/property/add?id="+obj.data.id);
+			}
+			if(obj.event === 'view'){					
+				tool.side("/adm/property/view?id="+obj.data.id);
+			}
+			if(obj.event === 'repair'){					
+				tool.side("/adm/property/repair_add?pid="+obj.data.id);
+			}
+			if(obj.event === 'set'){
+				dropdown.render({
+					elem: that,
+					show: true, // 外部事件触发即显示
+					data: status_types,
+					click: function(item){
+						layer.confirm('确定要修改该资产状态为【'+item.title+'】吗?', {icon: 3, title:'提示'}, function(index){
+							let callback = function (e) {
+								layer.msg(e.msg);
+								if (e.code == 0) {
+									layui.pageTable.reload();
+								}
+							}
+							tool.post("/adm/property/check", { id: obj.data.id,status: item.id}, callback);
+							layer.close(index);
+						});
+					}
+				});
+				return;
+			}
+		});
+		
+		//监听搜索提交
+		form.on('submit(webform)', function(data){
+			layui.pageTable.reload({where:data.field,page:{curr:1}});
+			return false;
+		});
+	}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/property/edit.html b/app/adm/view/property/edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..f711cf949c6b578a768aa4895c7e34c4e0e283ed
--- /dev/null
+++ b/app/adm/view/property/edit.html
@@ -0,0 +1,190 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-1">编辑资产</h3>
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">资产名称<font>*</font></td>
+			<td colspan="3">
+				<input type="text" name="title" value="{$detail.title}"  placeholder="请输入资产名称" lay-verify="required" lay-reqText="请输入资产名称" class="layui-input">
+			</td>
+			<td class="layui-td-gray-2" rowspan="5">
+			缩略图
+			<button type="button" class="layui-btn layui-btn-xs" id="uploadImg">+ 上传缩略图</button>
+			</td>
+			<td rowspan="5" style="width:252px;">
+				<div class="layui-upload-list" id="demo1" style="width: 240px; height:136px; overflow: hidden;">
+					<img src="{:get_file($detail.thumb)}" style="max-width: 100%; height:136px;" />
+					<input type="hidden" name="thumb" value="{$detail.thumb}">
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">资产编码<font>*</font></td>
+			<td>
+				<input type="text" name="code" value="{$detail.code}" class="layui-input" lay-verify="required">
+			</td>
+			<td class="layui-td-gray">资产型号<font>*</font></td>
+			<td><input type="text" name="model"  value="{$detail.model}"  class="layui-input" lay-verify="required"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">资产分类<font>*</font></td>
+			<td>
+			  <select name="cate_id" lay-verify="required" lay-reqText="请选择分类">
+				<option value="">请选择分类</option>
+				{volist name=":set_recursion(get_base_data('PropertyCate'))" id="v"}
+				<option value="{$v.id}" {eq name="$v.id" value="$detail.cate_id"} selected{/eq}>{$v.title}</option>
+				{/volist}
+			  </select>
+			</td>
+			<td class="layui-td-gray">资产品牌<font>*</font></td>
+			<td>
+				<select name="brand_id" lay-verify="required" lay-reqText="请选择品牌">
+				<option value="">请选择品牌</option>
+				{volist name=":get_base_data('PropertyBrand')" id="v"}
+				<option value="{$v.id}" {eq name="v.id" value="$detail.brand_id"} selected{/eq}>{$v.title}</option>
+				{/volist}
+			  </select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">质保到期日<font>*</font></td>
+			<td><input type="text" name="quality_time" value="{$detail.quality_time|date='Y-m-d'}" readonly placeholder="请选择质保到期日" class="layui-input tool-time" lay-verify="required" lay-reqText="请完善质保到期日"></td>
+			<td class="layui-td-gray">单位<font>*</font></td>
+			<td>
+				<select name="unit_id" lay-verify="required" lay-reqText="请选择单位">
+				<option value="">请选择单位</option>
+				{volist name=":get_base_data('PropertyUnit')" id="v"}
+				<option value="{$v.id}" {eq name="v.id" value="$detail.unit_id"} selected{/eq}>{$v.title}</option>
+				{/volist}
+			  </select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">使用人员</td>
+			<td>
+				<input type="text" name="users_name" value="{$detail.users_name|default=''}"  readonly placeholder="请选择使用人员" class="layui-input picker-admin">
+				<input type="hidden" name="users" value="{$detail.user_ids}">
+			</td>
+			<td class="layui-td-gray">使用部门</td>
+			<td><select id="user_dids" name="user_dids" xm-selected="{$detail.user_dids}" xm-select="select1" xm-select-skin="default"></select></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">购买价格<font>*</font></td>
+			<td><input type="text" name="price" value="{$detail.price}"  placeholder="请输入购买价格" lay-verify="required|number" lay-reqText="请输入购买价格" class="layui-input"></td>
+			<td class="layui-td-gray">购买日期<font>*</font></td>
+			<td><input type="text" name="buy_time" value="{$detail.buy_time|date='Y-m-d'}"  readonly placeholder="请选择购买日期" lay-verify="required" lay-reqText="请选择购买日期" class="layui-input tool-time"></td>
+			<td class="layui-td-gray">年折旧率(%)<font>*</font></td>
+			<td><input type="text" name="rate" value="{$detail.rate}"  placeholder="请输入年折旧率，不需要输入%" lay-verify="required|number" lay-reqText="请输入年折旧率，不需要%" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">资产状态<font>*</font></td>
+			<td colspan="5">
+				{volist name="$status" id="vo"}
+				<input type="radio" name="status" value="{$key}" title="{$vo}" {eq name="$key" value="$detail.status"} checked{/eq}>
+				{/volist}
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">资产来源<font>*</font></td>
+			<td colspan="5">
+				{volist name="$source" id="vo"}
+				{gt name="$key" value="0"}
+				<input type="radio" name="source" value="{$key}" title="{$vo}" {eq name="$key" value="$detail.source"} checked{/eq}>
+				{/gt}
+				{/volist}
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">放置地址</td>
+			<td colspan="5"><input type="text" name="address" value="{$detail.address}"  placeholder="请输入放置地址" class="layui-input"></td>
+		</tr> 
+		<tr>
+			<td class="layui-td-gray-2">
+				<div class="layui-input-inline">资产附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids}">
+					{notempty name="$detail.fileArray"}
+					{volist name="$detail.fileArray" id="vo"}
+					<div class="layui-col-md4">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>			
+			</td>
+		</tr> 
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">资产描述</td>
+			<td colspan="5">
+				<textarea name="content" placeholder="请输入内容" class="layui-textarea" id="container">{$detail.content}</textarea>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-2">
+		<input type="hidden" name="id" value="{$detail.id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool','formSelects','uploadPlus','oaPicker'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool,uploadPlus = layui.uploadPlus, formSelects = layui.formSelects;
+	
+	//选择部门
+	var selected = $('#user_dids').attr('xm-selected');
+	formSelects.data('select1', 'server', {
+		url: '/api/index/get_department_select',
+		keyword: selected
+	});
+    //单图上传
+	var photoUpload = new uploadPlus({
+		'use':'single',
+		'target':'uploadImg',
+		'callback':function(res){
+			layer.msg(res.msg);
+			if (res.code == 0) {
+				//上传成功
+				$('#demo1 input').attr('value', res.data.id);
+				$('#demo1 img').attr('src', res.data.filepath);
+			}
+		}
+	});
+
+	//相关附件上传
+	var attachment = new uploadPlus();
+	
+	//监听提交
+	form.on('submit(webform)', function(data){
+		let callback = function (e) {
+			layer.msg(e.msg);
+			if (e.code == 0) {
+				tool.sideClose(1000);				
+			}
+		}
+		if(!data.field.status){
+			layer.msg('请选择资产状态');
+			return false;
+		}
+		if(!data.field.source){
+			layer.msg('请选择资产来源');
+			return false;
+		}
+		let clickbtn = $(this);
+		tool.post("/adm/property/add", data.field, callback,clickbtn);
+		return false;
+	});
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/property/repair_add.html b/app/adm/view/property/repair_add.html
new file mode 100644
index 0000000000000000000000000000000000000000..8041fea00bf96c407f165c39e733fbbfa28232b3
--- /dev/null
+++ b/app/adm/view/property/repair_add.html
@@ -0,0 +1,87 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-1">新增资产维修记录</h3>
+	<table class="layui-table">
+		{eq name="$pid" value="0"}
+		<tr>
+			<td class="layui-td-gray">资产名称<font>*</font></td>
+			<td colspan="5">
+				<input type="text" name="property_name" autocomplete="off" readonly lay-verify="required" lay-reqText="请选择资产" placeholder="请选择" class="layui-input picker-oa" data-types="property">
+				<input type="hidden" name="property_id" value="">
+			</td>
+		</tr>
+		{else/}
+		<tr>
+			<td class="layui-td-gray">资产名称</td>
+			<td colspan="5">{$property.title}</td>
+		</tr>
+		{/eq}
+		<tr>
+			<td class="layui-td-gray">维修日期<font>*</font></td>
+			<td><input type="text" name="repair_time" autocomplete="off" readonly placeholder="请选择维修日期" class="layui-input tool-time"></td>
+			<td class="layui-td-gray">维修费用<font>*</font></td>
+			<td><input type="text" name="cost" autocomplete="off" placeholder="请输入维修费用" lay-verify="required|number" lay-reqText="请输入维修费用" class="layui-input"></td>
+			<td class="layui-td-gray">跟进人<font>*</font></td>
+			<td>
+				<input type="text" name="director_name" autocomplete="off" readonly lay-verify="required" lay-reqText="请选择负责人" placeholder="请选择" class="layui-input picker-admin">
+				<input type="hidden" name="director_id">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">
+				<div class="layui-input-inline">相关附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="">
+				</div>
+			</td>
+		</tr> 
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">维修原因</td>
+			<td colspan="5">
+				<textarea name="content" placeholder="请输入内容" class="layui-textarea"></textarea>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-2">
+		{gt name="$pid" value="0"}
+		<input type="hidden" name="property_id" value="{$pid}">
+		{/gt}
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool','uploadPlus','oaPicker'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool,uploadPlus = layui.uploadPlus;
+	//相关附件上传
+	var attachment = new uploadPlus();
+	
+	//监听提交
+	form.on('submit(webform)', function(data){
+		let callback = function (e) {
+			layer.msg(e.msg);
+			if (e.code == 0) {
+				tool.sideClose(1000);				
+			}
+		}
+		let clickbtn = $(this);
+		tool.post("/adm/property/repair_add", data.field, callback,clickbtn);
+		return false;
+	});
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/property/repair_edit.html b/app/adm/view/property/repair_edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..e6fbe6ae4e342fac599d3f3ec3014bb9b2fc2bc1
--- /dev/null
+++ b/app/adm/view/property/repair_edit.html
@@ -0,0 +1,80 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-1">编辑资产维修记录</h3>
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">资产名称</td>
+			<td colspan="5">{$detail.property}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">维修日期</td>
+			<td><input type="text" name="repair_time" value="{$detail.repair_time|date='Y-m-d'}" autocomplete="off" readonly placeholder="请选择维修日期" class="layui-input picker"></td>
+			<td class="layui-td-gray">维修费用<font>*</font></td>
+			<td><input type="text" name="cost" value="{$detail.cost}" autocomplete="off" placeholder="请输入维修费用" lay-verify="required|number" lay-reqText="请输入维修费用" class="layui-input"></td>
+			<td class="layui-td-gray">跟进人</td>
+			<td>
+				<input type="text" name="director_name" value="{$detail.director_name}" autocomplete="off" readonly lay-verify="required" lay-reqText="请选择负责人" class="layui-input picker-admin">
+				<input type="hidden" name="director_id" value="{$detail.director_id}">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">
+				<div class="layui-input-inline">相关附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids}">
+					{notempty name="$detail.fileArray"}
+					{volist name="$detail.fileArray" id="vo"}
+					<div class="layui-col-md4" id="fileItem{$vo.id}">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr> 
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">维修原因</td>
+			<td colspan="5">
+				<textarea name="content" placeholder="请输入内容" class="layui-textarea">{$detail.content|default=''}</textarea>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-2">
+		<input type="hidden" name="id" value="{$detail.id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool','uploadPlus','oaPicker'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool,uploadPlus = layui.uploadPlus;
+	//相关附件上传
+	var attachment = new uploadPlus();
+	
+	//监听提交
+	form.on('submit(webform)', function(data){
+		let callback = function (e) {
+			layer.msg(e.msg);
+			if (e.code == 0) {
+				tool.sideClose(1000);				
+			}
+		}
+		let clickbtn = $(this);
+		tool.post("/adm/property/repair_add", data.field, callback,clickbtn);
+		return false;
+	});
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/property/repair_list.html b/app/adm/view/property/repair_list.html
new file mode 100644
index 0000000000000000000000000000000000000000..1d83b3fa572410ce178a40ae854e0ec29049756d
--- /dev/null
+++ b/app/adm/view/property/repair_list.html
@@ -0,0 +1,91 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page" style="height:100%; box-sizing: border-box;">
+	<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:300px;">
+			<input type="text" class="layui-input" id="diff_time" placeholder="维修日期" readonly name="diff_time">
+		</div>
+		<div class="layui-input-inline" style="width:300px">
+			<input type="text" name="keywords" placeholder="输入关键字" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm tool-add" type="button" data-href="/adm/property/repair_add">+ 添加维修记录</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+{block name="copyright"}{/block}
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool','tablePlus','laydatePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool,form = layui.form,laydatePlus = layui.laydatePlus;	
+		var diff_time = new laydatePlus({'target':'diff_time'});		
+		
+		layui.pageTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,title:'维修记录列表'
+			,url: "/adm/property/repair_list"
+			,is_excel: true
+			,page: true
+			,cellMinWidth: 60
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'repair_time',title: '维修日期',align: 'center',width: 100}
+				,{field:'cost',width:100, title: '维修费用(元)', align:'center',style:"color:#16b777"}
+				,{field:'title',minWidth:240,title: '资产名称'}
+				,{field:'cate',width:120, title: '资产分类', align:'center'}
+				,{field:'brand',title: '资产品牌',align: 'center',width: 100}
+				,{field:'model',title: '资产型号',align: 'center',width: 100}
+				,{field:'director_name',title: '跟进人',align: 'center',width: 80}
+				,{field:'create_time',title: '记录时间',align: 'center',width: 130}
+				,{width:120,fixed:'right', title: '操作', align:'center',templet: function(d){
+					var html='<div class="layui-btn-group"><a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a><a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</a><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></div>';
+					return html;
+				}}
+			]]
+		});
+		
+		table.on('tool(test)',function (obj) {
+			var that = this;
+			if(obj.event === 'edit'){					
+				tool.side("/adm/property/repair_add?id="+obj.data.id);
+			}
+			if(obj.event === 'view'){					
+				tool.side("/adm/property/repair_view?id="+obj.data.id);
+			}
+			if(obj.event === 'del'){
+				layer.confirm('确定要删除该维修记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/adm/property/repair_del", {id: obj.data.id}, callback);
+					layer.close(index);
+				});
+				return;
+			}
+		});
+		
+		//监听搜索提交
+		form.on('submit(webform)', function(data){
+			layui.pageTable.reload({where:data.field,page:{curr:1}});
+			return false;
+		});
+	}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/property/repair_view.html b/app/adm/view/property/repair_view.html
new file mode 100644
index 0000000000000000000000000000000000000000..08ba1e3a4b33f2324bb66e153f2f573678284cee
--- /dev/null
+++ b/app/adm/view/property/repair_view.html
@@ -0,0 +1,50 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-1">资产维修记录</h3>
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">资产名称</td>
+			<td colspan="5">{$detail.property}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">维修日期</td>
+			<td>{$detail.repair_time|date='Y-m-d'}</td>
+			<td class="layui-td-gray">维修费用</td>
+			<td>{$detail.cost}</td>
+			<td class="layui-td-gray">跟进人</td>
+			<td>{$detail.director_name}</td>
+		</tr>
+		{notempty name="$detail.fileArray"}
+		<tr>
+			<td class="layui-td-gray">相关附件</div></td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">					
+					{volist name="$detail.fileArray" id="vo"}
+					<div class="layui-col-md4" id="fileItem{$vo.id}">{:file_card($vo,'view')}</div>
+					{/volist}					
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">维修原因</td>
+			<td colspan="5">{$detail.content|default=''}</td>
+		</tr>
+	</table>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool;
+	
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/property/view.html b/app/adm/view/property/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..8aad0ab774c034561130852ce3a6c6450bf8ffce
--- /dev/null
+++ b/app/adm/view/property/view.html
@@ -0,0 +1,141 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+.layui-table-min th{text-align:center; background-color:#f8f8f8;}
+.layui-table-min td{padding:6px;text-align:center;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<h3 class="pb-1">资产详情</h3>
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">资产名称</td>
+			<td colspan="3">{$detail.title}</td>
+			<td class="layui-td-gray">资产编码</td>
+			<td>{$detail.code}</td>		
+			<td class="layui-td-gray" rowspan="5">缩略图</td>
+			<td rowspan="5" style="width:180px;">
+				<div class="layui-upload-list" style="width: 180px; height:160px; overflow: hidden;">
+					<img src="{:get_file($detail.thumb)}" style="max-width: 100%; height:160px;" />
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">资产分类</td>
+			<td>{$detail.cate|default=""}</td>
+			<td class="layui-td-gray">资产品牌</td>
+			<td>{$detail.brand|default=""}</td>	
+			<td class="layui-td-gray">资产型号</td>
+			<td>{$detail.model|default=""}</td>
+		</tr>
+		<tr>		
+			<td class="layui-td-gray">购买价格</td>
+			<td>{$detail.price} 元</td>
+			<td class="layui-td-gray">购买日期</td>
+			<td>{$detail.buy_time|date='Y-m-d'}</td>
+			<td class="layui-td-gray">年折旧率</td>
+			<td>{$detail.rate}%</td>
+		</tr>
+		<tr>		
+			<td class="layui-td-gray">质保日期</td>
+			<td>{$detail.quality_time|date='Y-m-d'}</td>
+			<td class="layui-td-gray">使用人员</td>
+			<td>{$detail.users_name|default="-"}</td>
+			<td class="layui-td-gray">使用部门</td>
+			<td>{$detail.dids_title|default="-"}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">放置地址</td>
+			<td colspan="3">{$detail.address}</td>
+			<td class="layui-td-gray">单位</td>
+			<td>{$detail.unit|default=""}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">资产来源</td>
+			<td colspan="3">{$detail.source_str}</td>
+			<td class="layui-td-gray">当前状态</td>
+			<td colspan="3">{$detail.status_str}</td>
+		</tr> 
+		{notempty name="$detail.file_ids"}
+		<tr>
+			<td class="layui-td-gray" colspan="8" style="text-align:left; color:#666"><strong>资产附件</strong></td>
+		</tr>
+		<tr>
+			<td colspan="8" style="line-height:inherit">
+				{volist name="$detail.fileArray" id="vo"}
+					<div class="layui-col-md4" id="fileItem{$vo.id}">{:file_card($vo,'view')}</div>
+				{/volist}
+			</td>
+		</tr>
+		{/notempty}
+		<tr>
+			<td class="layui-td-gray" colspan="8" style="text-align:left; color:#666"><strong>资产描述</strong></td>
+		</tr>
+		<tr>
+			<td colspan="8">{:nl2br($detail.content)}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" colspan="8" style="text-align:left; color:#666"><strong>维修记录</strong></td>
+		</tr>
+		<tr>
+			<td colspan="8">
+				<table id="repair" class="layui-table layui-table-min" style="margin:0">
+					<tr>
+						<th width="90">维修日期</th>
+						<th width="100">维修费用(元)</th>
+						<th width="80">跟进人</th>
+						<th>原因说明</th>
+						<th width="120">记录时间</th>
+						<th width="120">操作</th>
+					</tr>
+					{empty name="$detail.repair"}
+					<tr class="tr-none">
+						<td colspan="6">暂无维修记录</td>
+					</tr>
+					{else/}
+					{volist name="$detail.repair" id="vo"}
+					<tr>
+						<td>{$vo.repair_time|date="Y-m-d"}</td>
+						<td>{$vo.cost}</td>
+						<td>{$vo.director_name}</td>
+						<td style="text-align:left;">{$vo.content|default="-"}</td>
+						<td>{$vo.create_time|date="Y-m-d H:i"}</td>
+						<td><div class="layui-btn-group"><a class="layui-btn layui-btn-xs side-a" data-href="/adm/property/repair_add?id={$vo.id}">编辑</a><a class="layui-btn layui-btn-normal layui-btn-xs side-a" data-href="/adm/property/repair_view?id={$vo.id}">详情</a><a class="layui-btn layui-btn-danger layui-btn-xs del" data-id="{$vo.id}">删除</a></div></td>
+					</tr>
+					{/volist}
+					{/empty}
+				</table>
+			</td>
+		</tr>
+	</table>
+
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var tool = layui.tool;
+		$('#repair').on('click','.del',function(){
+			let id=$(this).data('id');
+			layer.confirm('确定要删除该维修记录吗?', {icon: 3, title:'提示'}, function(index){
+				let callback = function (e) {
+					layer.msg(e.msg);
+					if (e.code == 0) {
+						tool.reload(1000);
+					}
+				}
+				tool.post("/adm/property/repair_del", {id: id}, callback);
+				layer.close(index);
+			});
+			return;
+		})
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/propertybrand/add.html b/app/adm/view/propertybrand/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..24b7c9929fc7d3ee27ad4adf97d209efdba404fa
--- /dev/null
+++ b/app/adm/view/propertybrand/add.html
@@ -0,0 +1,71 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-1">资产品牌</h3>
+	{eq name="$id" value="0"}
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">品牌名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入资产品牌名称" lay-reqText="请输入资产品牌名称" class="layui-input">
+			</td>
+			<td class="layui-td-gray">排序</td>
+			<td>
+				<input type="text" name="sort" placeholder="请输入排序，数字" value="0" autocomplete="off" class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">描述</td>
+			<td colspan="3"><textarea name="desc" placeholder="请输入描述，可空" class="layui-textarea"></textarea></td>
+		</tr>
+	</table>
+	{else/}
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">品牌名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" value="{$detail.title}" lay-verify="required" autocomplete="off" placeholder="请输入资产品牌名称" lay-reqText="请输入资产品牌名称" class="layui-input">
+			</td>
+			<td class="layui-td-gray">排序</td>
+			<td>
+				<input type="text" name="sort" value="{$detail.sort}" placeholder="请输入排序，数字" value="0" autocomplete="off" class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">描述</td>
+			<td colspan="3"><textarea name="desc" placeholder="请输入描述，可空" class="layui-textarea">{$detail.desc}</textarea></td>
+		</tr>
+	</table>
+	{/eq}
+	<div class="py-3">
+		<input type="hidden" name="id" value="{$id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool;		  
+		//监听提交
+		form.on('submit(webform)', function(data){
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);				
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/adm/propertybrand/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/propertybrand/datalist.html b/app/adm/view/propertybrand/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..b881b52fc6aae886e8219d5a49cf0b19a94a2356
--- /dev/null
+++ b/app/adm/view/propertybrand/datalist.html
@@ -0,0 +1,95 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-3">
+    <table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm add-new" type="button">+ 添加资产品牌</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool, form = layui.form;
+		layui.pageTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,title:'资产品牌列表'
+			,url: "/adm/propertybrand/datalist"
+			,page: true
+			,cellMinWidth: 80
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',title: '名称',width:150}
+				,{field:'desc',title: '描述'}
+				,{field:'sort',width:100,title: '排序', align:'center'}
+				,{field:'status', title: '状态',width:100,align:'center',templet: function(d){
+					var html1='<span class="green">正常</span>';
+					var html2='<span class="yellow">禁用</span>';
+					if(d.status==1){
+						return html1;
+					}
+					else{
+						return html2;
+					}
+				}}
+				,{width:132,fixed:'right', title: '操作', align:'center',templet: function(d){
+					var html='';
+					var btn='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+					var btn2='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="open">启用</a>';
+					if(d.status==1){
+						html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+					}
+					else{
+						html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+					}
+					return html;
+				}}
+			]]
+		});
+		
+		table.on('tool(test)',function (obj) {
+			if(obj.event === 'edit'){					
+				tool.side("/adm/propertybrand/add?id="+obj.data.id);
+			}
+			if(obj.event === 'disable'){
+				layer.confirm('确定要禁用该资产品牌吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/adm/propertybrand/check", { id: obj.data.id,status: 0,title: obj.data.title}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'open'){
+				layer.confirm('确定要启用该资产品牌吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/adm/propertybrand/check", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
+					layer.close(index);
+				});
+			}
+		});
+		
+		$('body').on('click','.add-new',function(){
+			tool.side("/adm/propertybrand/add");	
+		});
+	}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/propertycate/add.html b/app/adm/view/propertycate/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..82731ba965aae6babf37d10a59f7c0e2a165d3d6
--- /dev/null
+++ b/app/adm/view/propertycate/add.html
@@ -0,0 +1,91 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-1">资产分类</h3>
+	{eq name="$id" value="0"}
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">父级分类<font>*</font></td>
+			<td>
+				<select name="pid" lay-verify="required" lay-reqText="请选择父级分类">
+				  <option value="0">作为顶级分类</option>
+				  {volist name="$cates" id="v"}
+				  <option value="{$v.id}" {eq name="$pid" value="$v.id"}selected=""{/eq}>{$v.title}</option>
+				  {/volist}
+				</select>
+			</td>
+			<td class="layui-td-gray">分类名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入分类名称" lay-reqText="请输入分类名称" class="layui-input">
+			</td>
+			<td class="layui-td-gray">排序</td>
+			<td>
+				<input type="text" name="sort" placeholder="请输入排序，数字" value="0" autocomplete="off" class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">描述</td>
+			<td colspan="5"><textarea name="desc" placeholder="请输入描述，可空" class="layui-textarea"></textarea></td>
+		</tr>
+	</table>
+	{else/}
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">父级分类<font>*</font></td>
+			<td>
+				<select name="pid" lay-verify="required" lay-reqText="请选择父级分类">
+				  <option value="0">作为顶级分类</option>
+				  {volist name="$cates" id="v"}
+				  <option value="{$v.id}" {eq name="$detail.pid" value="$v.id"}selected=""{/eq}>{$v.title}</option>
+				  {/volist}
+				</select>
+			</td>
+			<td class="layui-td-gray">分类名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" value="{$detail.title}" lay-verify="required" autocomplete="off" placeholder="请输入分类名称" lay-reqText="请输入分类名称" class="layui-input">
+			</td>
+			<td class="layui-td-gray">排序</td>
+			<td>
+				<input type="text" name="sort" value="{$detail.sort}" placeholder="请输入排序，数字" value="0" autocomplete="off" class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">描述</td>
+			<td colspan="5"><textarea name="desc" placeholder="请输入描述，可空" class="layui-textarea">{$detail.desc}</textarea></td>
+		</tr>
+	</table>
+	{/eq}
+	<div class="pt-3">
+		<input type="hidden" name="id" value="{$id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool;		  
+		//监听提交
+		form.on('submit(webform)', function(data){
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					setTimeout(function () {
+						parent.location.reload();
+					}, 1000);					
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/adm/propertycate/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/propertycate/datalist.html b/app/adm/view/propertycate/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..8dd848edc393690b816264872433995e91b7f116
--- /dev/null
+++ b/app/adm/view/propertycate/datalist.html
@@ -0,0 +1,86 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-3">
+	<div class="gg-form-bar border-t border-x" style="padding-bottom:10px;">
+		<button class="layui-btn layui-btn-sm add-menu">+ 添加资产分类</button>
+    </div>
+    <div>
+      <table class="layui-hide" id="treeTable" lay-filter="treeTable"></table>
+    </div> 
+</div>
+<script type="text/html" id="switchStatus">
+	<input type="checkbox" name="status" value="{{d.id}}" lay-skin="switch" lay-text="是|否" lay-filter="status" {{ d.status == 1 ? 'checked' : '' }}>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var treeTable = layui.treeTable, tool = layui.tool;
+		
+		layui.pageTable = treeTable.render({
+			elem: '#treeTable'
+			,url: "/adm/propertycate/datalist"
+			,tree: { // treeTable 特定属性集
+				customName: {name:'title'},
+				data: {},
+				view: {
+					showIcon:false,
+					expandAllDefault:true
+				},
+				async: {},
+				callback: {}
+			}
+				,cols: [[
+					{field:'id',width:80, title: 'ID号', align:'center'}
+					,{field: 'sort', title: '排序',align:'center', width:80}
+					,{field:'title', width:240, title: '分类名称'}
+					,{field:'pid', title: '父级ID', width:80, align:'center'}
+					,{field:'desc', title: '描述', }
+					,{width:160,title: '操作', align:'center',templet: function(d){
+						var html = '<span class="layui-btn-group"><button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="add">添加子分类</button><button class="layui-btn layui-btn-xs" lay-event="edit">编辑</button><button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button></span>';
+					return html;
+					  }
+					}
+				]]
+				,page:false
+				//,skin:'line'
+			});
+			
+			//表头工具栏事件
+			$('.add-menu').on('click', function(){
+				tool.side('/adm/propertycate/add');
+				return;
+			});
+			
+			//操作按钮
+			treeTable.on('tool(treeTable)', function (obj) {
+				if (obj.event === 'add') {
+					tool.side('/adm/propertycate/add?pid='+obj.data.id);
+					return;
+				}
+				if (obj.event === 'edit') {
+					tool.side('/adm/propertycate/add?id='+obj.data.id);
+					return;
+				}
+				if (obj.event === 'del') {
+					layer.confirm('确定要删除吗?', { icon: 3, title: '提示' }, function (index) {
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								obj.del();
+							}
+						}
+						tool.delete('/adm/propertycate/del', { id: obj.data.id }, callback);
+						layer.close(index);
+					});
+				}
+			});
+		}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/propertyunit/add.html b/app/adm/view/propertyunit/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..6b72f86f3be4689324405e54cda7bcac4fa6a807
--- /dev/null
+++ b/app/adm/view/propertyunit/add.html
@@ -0,0 +1,71 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-1">资产单位</h3>
+	{eq name="$id" value="0"}
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">单位名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入单位名称" lay-reqText="请输入单位名称" class="layui-input">
+			</td>
+			<td class="layui-td-gray">排序</td>
+			<td>
+				<input type="text" name="sort" placeholder="请输入排序，数字" value="0" autocomplete="off" class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">描述</td>
+			<td colspan="3"><textarea name="desc" placeholder="请输入描述，可空" class="layui-textarea"></textarea></td>
+		</tr>
+	</table>
+	{else/}
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">单位名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" value="{$detail.title}" lay-verify="required" autocomplete="off" placeholder="请输入单位名称" lay-reqText="请输入单位名称" class="layui-input">
+			</td>
+			<td class="layui-td-gray">排序</td>
+			<td>
+				<input type="text" name="sort" value="{$detail.sort}" placeholder="请输入排序，数字" value="0" autocomplete="off" class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">描述</td>
+			<td colspan="3"><textarea name="desc" placeholder="请输入描述，可空" class="layui-textarea">{$detail.desc}</textarea></td>
+		</tr>
+	</table>
+	{/eq}
+	<div class="pt-3">
+		<input type="hidden" name="id" value="{$id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool;		  
+		//监听提交
+		form.on('submit(webform)', function(data){
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);				
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/adm/propertyunit/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/propertyunit/datalist.html b/app/adm/view/propertyunit/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..9f24455454e3af1805e7bd68f1801e4f7eb3df32
--- /dev/null
+++ b/app/adm/view/propertyunit/datalist.html
@@ -0,0 +1,95 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-3">
+    <table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm addNew" type="button">+ 添加资产单位</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool, form = layui.form;
+		layui.pageTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,title:'资产单位列表'
+			,url: "/adm/propertyunit/datalist"
+			,page: true
+			,cellMinWidth: 80
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',title: '名称',width:150}
+				,{field:'desc',title: '描述'}
+				,{field:'sort',width:100,title: '排序', align:'center'}
+				,{field:'status', title: '状态',width:100,align:'center',templet: function(d){
+					var html1='<span class="green">正常</span>';
+					var html2='<span class="yellow">禁用</span>';
+					if(d.status==1){
+						return html1;
+					}
+					else{
+						return html2;
+					}
+				}}
+				,{width:132,fixed:'right', title: '操作', align:'center',templet: function(d){
+					var html='';
+					var btn='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+					var btn2='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="open">启用</a>';
+					if(d.status==1){
+						html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+					}
+					else{
+						html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+					}
+					return html;
+				}}
+			]]
+		});
+		
+		table.on('tool(test)',function (obj) {
+			if(obj.event === 'edit'){					
+				tool.side("/adm/propertyunit/add?id="+obj.data.id);
+			}
+			if(obj.event === 'disable'){
+				layer.confirm('确定要禁用该资产单位吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/adm/propertyunit/check", { id: obj.data.id,status: 0,title: obj.data.title}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'open'){
+				layer.confirm('确定要启用该资产单位吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/adm/propertyunit/check", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
+					layer.close(index);
+				});
+			}
+		});
+		
+		$('body').on('click','.addNew',function(){
+			tool.side("/adm/propertyunit/add");	
+		});
+	}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/seal/add.html b/app/adm/view/seal/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..2685dc458527fcfb2ebeba80450f364f0716df45
--- /dev/null
+++ b/app/adm/view/seal/add.html
@@ -0,0 +1,122 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-1">添加用章申请</h3>
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">申请主题<font>*</font></td>
+			<td colspan="3"><input type="text" name="title" autocomplete="off" placeholder="请输入用章申请主题" lay-verify="required" lay-reqText="请输入用申请主题" class="layui-input"></td>
+			<td class="layui-td-gray">印章类型<font>*</font></td>
+			<td>
+				<select name="seal_cate_id" lay-verify="required" lay-reqText="请输入印章类型">
+					<option value="">选择印章类型</option>
+					{volist name=":get_base_data('seal_cate')" id="vo"}
+					<option value="{$vo.id}">{$vo.title}</option>
+					{/volist}
+				</select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">盖章次数<font>*</font></td>
+			<td>
+				<input type="text" name="num" value='' placeholder="请输入盖章次数" lay-verify="required|number" lay-reqText="请输入盖章次数" class="layui-input">
+			</td>
+			<td class="layui-td-gray">用印部门<font>*</font></td>
+			<td><select id="did" name="did" xm-selected="" xm-select="select1" xm-select-skin="default" xm-select-radio="true" lay-verify="required" lay-reqText="请完善用印部门"></select></td>
+			<td class="layui-td-gray-2">预期用印日期<font>*</font></td>
+			<td><input type="text" name="use_time" value='' readonly placeholder="请选择" lay-verify="required" lay-reqText="请选择预期用印日期" class="layui-input tool-time"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">印章是否外借<font>*</font></td>
+			<td>
+				<input type="radio" name="is_borrow" value="0" title="否" checked>
+				<input type="radio" name="is_borrow" value="1" title="是">
+			</td>
+			<td class="layui-td-gray-2">印章借用日期</td>
+			<td><input type="text" name="start_time" value='' readonly placeholder="请选择" class="layui-input tool-time"></td>
+			<td class="layui-td-gray">结束借用日期</td>
+			<td><input type="text" name="end_time" value='' readonly placeholder="请选择" class="layui-input tool-time"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">盖章内容<font>*</font></td>
+			<td colspan="5">
+				<textarea name="content" placeholder="请输入内容" class="layui-textarea" lay-verify="required" lay-reqText="请完善盖章内容"></textarea>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">
+				<div class="layui-input-inline">相关附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="">
+				</div>
+			</td>
+		</tr>
+	</table>
+	
+	<div id="checkBox" data-status="0" data-id="0" data-checkflowid="0"></div>
+	
+	<div class="pt-3">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','uploadPlus','oaPicker','formSelects','oaCheck'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,uploadPlus= layui.uploadPlus,formSelects= layui.formSelects,oaCheck=layui.oaCheck;	
+		oaCheck.init({
+			check_name:'seal',
+			check_btn:0
+		});	
+		//选择用印部门
+		var selected_a = $('#did').attr('xm-selected');
+		formSelects.data('select1', 'server', {
+			url: '/api/index/get_department_select',
+			keyword: selected_a
+		});
+
+		//相关附件上传
+		var attachment = new uploadPlus();
+		//监听提交
+		form.on('submit(webform)', function(data){
+			if (data.field.is_borrow==1 && data.field.start_time == '') {
+				layer.msg('请完善印章借用日期');
+				return false;
+			}
+			if (data.field.is_borrow==1 && data.field.end_time == '') {
+				layer.msg('请完善结束借用日期');
+				return false;
+			}
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					let checkCallback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							tool.sideClose(1000);				
+						}
+					}
+					data.field.check_name = 'seal';
+					data.field.action_id = e.data.return_id;
+					oaCheck.submit(data.field,checkCallback);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/adm/seal/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/seal/datalist.html b/app/adm/view/seal/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..df2278ae2276c8aa6ae347bd7b47905bdacc7acc
--- /dev/null
+++ b/app/adm/view/seal/datalist.html
@@ -0,0 +1,148 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<div class="layui-card border-x border-t" style="margin-bottom:0; box-shadow:0 0 0 0 rgb(5 32 96 / 0%)">
+		<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
+			<ul class="layui-tab-title">
+				<li class="layui-this">全部</li>
+				<li>我申请的</li>
+				<li>待我审批</li>
+				<li>我已审批</li>
+				<li>抄送我的</li>
+			</ul>
+		</div>
+	</div>
+	<form class="layui-form gg-form-bar border-x" id="barsearchform">
+		<div class="layui-input-inline" style="width:128px">
+			<select name="check_status">
+				<option value="">选择审批状态</option>
+				{volist name=":get_check_status()" id="vo"}
+				<option value="{$key}">{$vo}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:128px">
+			<select name="seal_cate_id">
+				<option value="">选择印章类型</option>
+				{volist name=":get_base_data('seal_cate')" id="vo"}
+				<option value="{$vo.id}">{$vo.title}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:300px">
+			<input type="text" name="keywords" placeholder="关键字" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<input type="hidden" name="tab" value="0" />
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_seal" lay-filter="table_seal"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm tool-add" type="button" data-href="/adm/seal/add">+ 用章申请</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool, element = layui.element;
+		//tab切换
+		element.on('tab(tab)', function(data){
+			$('[name="tab"]').val(data.index);
+			$("#barsearchform")[0].reset();
+			layui.pageTable.reload({where:{tab:data.index},page:{curr:1}});
+			return false;
+		});
+		
+		layui.pageTable = table.render({
+			elem: "#table_seal"
+			, toolbar: "#toolbarDemo"
+			,url: "/adm/seal/datalist"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 60
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'check_status',title: '审批状态',width:112, align:'center',templet: function(d){
+					var html = '<span class="check-status-color-'+d.check_status+'">『'+d.check_status_str+'』</span>';
+					return html;
+				}}
+				,{field:'title',title: '用章申请主题',minWidth:240}
+				,{field:'seal_cate',title: '用章类型',width:100, align:'center'}
+				,{field:'is_borrow',title: '是否外借',width:80, align:'center',templet: function(d){
+					if(d.is_borrow==1){
+						return '<div class="red">是</div>';
+					}
+					else{
+						return '<div class="green">否</div>';
+					}
+				}}
+				,{field:'use_dname',title: '用印部门',width:100, align:'center'}
+				,{field:'num',title: '盖章次数',width:80, align:'center'}
+				,{field:'admin_name',title: '申请人',width:90, align:'center'}
+				,{field:'create_time', title: '创建时间',width:150,align:'center'}
+				,{width:120,fixed:'right',title: '操作', align:'center',templet: function(d){
+					var html='';
+					var btn1='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详细</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn3='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
+					html = '<div class="layui-btn-group">'+btn1+btn2+btn3+'</div>';
+					if((d.check_status==0||d.check_status==4) && d.admin_id == login_admin){
+						return '<div class="layui-btn-group">'+btn1+btn2+btn3+'</div>';
+					}
+					else{
+						return '<div class="layui-btn-group">'+btn1+'</div>';
+					}
+				}}
+			]]
+		});
+		
+		//表头工具栏事件
+		table.on('toolbar(table_seal)', function(obj){
+			if (obj.event === 'add') {
+				tool.side("/adm/seal/add");
+				return;
+			}
+		});	
+			
+		table.on('tool(table_seal)',function (obj) {
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/adm/seal/view?id="+data.id);
+				return;
+			}
+			if (obj.event === 'edit') {
+				tool.side("/adm/seal/add?id="+data.id);
+				return;
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要删除该内容吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/adm/seal/del", { id: data.id }, callback);
+					layer.close(index);
+				});
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/seal/edit.html b/app/adm/view/seal/edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..7590ae9075f32c06925e77cb78a528dec3e21d2b
--- /dev/null
+++ b/app/adm/view/seal/edit.html
@@ -0,0 +1,126 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-1">添加用章申请</h3>
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">申请主题<font>*</font></td>
+			<td colspan="3"><input type="text" name="title" value="{$detail.title}" autocomplete="off" placeholder="请输入用章申请主题" lay-verify="required" lay-reqText="请输入用申请主题" class="layui-input"></td>
+			<td class="layui-td-gray">印章类型<font>*</font></td>
+			<td>
+				<select name="seal_cate_id" lay-verify="required" lay-reqText="请输入印章类型">
+					<option value="">选择印章类型</option>
+					{volist name=":get_base_data('seal_cate')" id="vo"}
+					<option value="{$vo.id}" {eq name="$vo.id" value="$detail.seal_cate_id"}selected{/eq}>{$vo.title}</option>
+					{/volist}
+				</select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">盖章次数<font>*</font></td>
+			<td>
+				<input type="text" name="num" value='{$detail.num}' placeholder="请输入盖章次数" lay-verify="required|number" lay-reqText="请输入盖章次数" class="layui-input">
+			</td>
+			<td class="layui-td-gray">用印部门<font>*</font></td>
+			<td><select id="did" name="did" xm-selected="{$detail.did}" xm-select="select1" xm-select-skin="default" xm-select-radio="true" lay-verify="required" lay-reqText="请完善用印部门"></select></td>
+			<td class="layui-td-gray-2">预期用印日期<font>*</font></td>
+			<td><input type="text" name="use_time" value="{$detail.use_time|date='Y-m-d'}" readonly placeholder="请选择" lay-verify="required" lay-reqText="请选择预期用印日期" class="layui-input tool-time"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">印章是否外借<font>*</font></td>
+			<td>
+				<input type="radio" name="is_borrow" value="0" title="否" {eq name="$detail.is_borrow" value="0"}checked{/eq}>
+				<input type="radio" name="is_borrow" value="1" title="是" {eq name="$detail.is_borrow" value="1"}checked{/eq}>
+			</td>
+			<td class="layui-td-gray-2">印章借用日期</td>
+			<td><input type="text" name="start_time" value="{$detail.start_time}" readonly placeholder="请选择" class="layui-input tool-time"></td>
+			<td class="layui-td-gray">结束借用日期</td>
+			<td><input type="text" name="end_time" value="{$detail.end_time}" readonly placeholder="请选择" class="layui-input tool-time"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">盖章内容<font>*</font></td>
+			<td colspan="5">
+				<textarea name="content" placeholder="请输入内容" class="layui-textarea">{$detail.content}</textarea>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">
+				<div class="layui-input-inline">相关附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids}">
+					{notempty name="$detail.file_array"}
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="fileItem{$vo.id}">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr>
+	</table>
+	<div id="checkBox" data-status="{$detail.check_status}" data-id="{$detail.id}" data-checkflowid="{$detail.check_flow_id}"></div>
+	<div class="pt-3">
+		<input type="hidden" name="id" value="{$detail.id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','uploadPlus','oaPicker','formSelects','oaCheck'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,uploadPlus= layui.uploadPlus,formSelects= layui.formSelects,oaCheck=layui.oaCheck;	
+		oaCheck.init({
+			check_name:'seal',
+			check_btn:0
+		});	
+		//选择用印部门
+		var selected_a = $('#did').attr('xm-selected');
+		formSelects.data('select1', 'server', {
+			url: '/api/index/get_department_select',
+			keyword: selected_a
+		});
+
+		//相关附件上传
+		var attachment = new uploadPlus();
+		//监听提交
+		form.on('submit(webform)', function(data){
+			if (data.field.is_borrow==1 && data.field.start_time == '') {
+				layer.msg('请完善印章借用日期');
+				return false;
+			}
+			if (data.field.is_borrow==1 && data.field.end_time == '') {
+				layer.msg('请完善结束借用日期');
+				return false;
+			}
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					let checkCallback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							tool.sideClose(1000);				
+						}
+					}
+					data.field.check_name = 'seal';
+					data.field.action_id = e.data.return_id;
+					oaCheck.submit(data.field,checkCallback);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/adm/seal/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/seal/record.html b/app/adm/view/seal/record.html
new file mode 100644
index 0000000000000000000000000000000000000000..164cc212c92179e80094080b4e0b87dc3c10748f
--- /dev/null
+++ b/app/adm/view/seal/record.html
@@ -0,0 +1,154 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:128px">
+			<select name="check_status">
+				<option value="">选择用章状态</option>
+				{volist name="status" id="vo"}
+				<option value="{$key}">{$vo}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:128px">
+			<select name="seal_cate_id">
+				<option value="">选择印章类型</option>
+				{volist name=":get_base_data('seal_cate')" id="vo"}
+				<option value="{$vo.id}">{$vo.title}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:300px">
+			<input type="text" name="keywords" placeholder="关键字" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_seal" lay-filter="table_seal"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div>
+  	<h3>用章记录</h3>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool;
+		
+		layui.pageTable = table.render({
+			elem: "#table_seal"
+			, toolbar: "#toolbarDemo"
+			,url: "/adm/seal/record"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 60
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'check_status',title: '用章状态',width:90, align:'center',templet: function(d){
+					let status_str = '未使用';
+					if(d.status == 1){
+						status_str = '已使用';
+						if(d.is_borrow==1){
+							status_str = '已外借';
+						}
+					}
+					if(d.status == 2){
+						status_str = '已归还';
+					}
+					return html = '<span class="check-status-color-'+d.status+'">『'+status_str+'』</span>';
+				}}
+				,{field:'title',title: '用章申请主题',minWidth:240}
+				,{field:'seal_cate',title: '用章类型',width:100, align:'center'}
+				,{field:'is_borrow',title: '是否外借',width:80, align:'center',templet: function(d){
+					if(d.is_borrow==1){
+						return '<div class="red">是</div>';
+					}
+					else{
+						return '<div class="green">否</div>';
+					}
+				}}
+				,{field:'is_borrow',title: '用印部门',width:100, align:'center'}
+				,{field:'num',title: '盖章次数',width:80, align:'center'}
+				,{field:'admin_name',title: '申请人',width:90, align:'center'}
+				,{field:'create_time', title: '创建时间',width:150,align:'center'}
+				,{width:168,fixed:'right',title: '操作', align:'center',templet: function(d){
+					var html='';
+					var btn1='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详细</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="use">使用登记</a>';
+					var btn3='<a class="layui-btn layui-btn-xs" lay-event="use">出借登记</a>';
+					var btn4='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="back">归还登记</a>';
+					
+					if(d.status == 0){
+						if(d.is_borrow==1){
+							html = '<div class="layui-btn-group">'+btn1+btn3+'</div>';
+						}
+						else{
+							html = '<div class="layui-btn-group">'+btn1+btn2+'</div>';
+						}
+					}
+					
+					if(d.status == 1){
+						if(d.is_borrow==1){
+							html = '<div class="layui-btn-group">'+btn1+btn4+'</div>';
+						}
+						else{
+							html = '<div class="layui-btn-group">'+btn1+'</div>';
+						}
+					}
+					if(d.status == 2){
+							html = '<div class="layui-btn-group">'+btn1+'</div>';
+					}					
+					return html;
+				}}
+			]]
+		});
+			
+		table.on('tool(table_seal)',function (obj) {
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/adm/seal/view?id="+data.id);
+				return;
+			}
+			if (obj.event === 'use') {
+				layer.confirm('确定要修改用章状态吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/adm/api/set_seal_status", { id: obj.data.id,status: 1 }, callback);
+					layer.close(index);	
+				});
+				return;
+			}
+			if (obj.event === 'back') {
+				layer.confirm('确定要修改用章状态吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/adm/api/set_seal_status", { id: obj.data.id,status: 2 }, callback);
+					layer.close(index);	
+				});
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/seal/view.html b/app/adm/view/seal/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..0521f77f1ae9052c38a24266b2cb393a6bed502d
--- /dev/null
+++ b/app/adm/view/seal/view.html
@@ -0,0 +1,75 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-1">添加用章审批</h3>
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">审批主题</td>
+			<td colspan="3">{$detail.title}</td>
+			<td class="layui-td-gray">印章类型</td>
+			<td>{$detail.seal_cate}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">盖章次数</td>
+			<td>{$detail.num}</td>
+			<td class="layui-td-gray">用印部门</td>
+			<td>{$detail.use_dname|default='-'}</td>
+			<td class="layui-td-gray-2">预期用印日期</td>
+			<td>{$detail.use_time|date='Y-m-d'}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">印章是否外借</td>
+			<td>
+				{eq name="$detail.is_borrow" value="0"}否{/eq}
+				{eq name="$detail.is_borrow" value="1"}是{/eq}
+			</td>
+			<td class="layui-td-gray-2">印章借用日期</td>
+			<td>{$detail.start_time|default='-'}</td>
+			<td class="layui-td-gray">结束借用日期</td>
+			<td>{$detail.end_time|default='-'}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">盖章内容</td>
+			<td colspan="5">{:nl2br($detail.content)}</td>
+		</tr>
+		{eq name="detail.check_status" value="2"}
+		<tr>
+			<td class="layui-td-gray">用章状态</td>
+			<td colspan="5"><span class="check-status-color-{$detail.status}">『{$detail.status_str}』</span></td>
+		</tr>
+		{/eq}		
+		{notempty name="$detail.file_array"}
+		<tr>
+			<td class="layui-td-gray-2">
+				<div class="layui-input-inline">相关附件</div>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids}">
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="fileItem{$vo.id}">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+	</table>
+	<div id="checkBox" data-status="{$detail.check_status}" data-id="{$detail.id}" data-checkflowid="{$detail.check_flow_id}"></div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','oaCheck'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,oaCheck=layui.oaCheck;	
+		oaCheck.init({
+			check_name:'seal'
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/sealcate/add.html b/app/adm/view/sealcate/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..34337137e8b653e7237f51932fc11a20b20c6a01
--- /dev/null
+++ b/app/adm/view/sealcate/add.html
@@ -0,0 +1,73 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-1">印章管理</h3>
+	{eq name="$id" value="0"}
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">印章名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入印章名称" lay-reqText="请输入印章名称" class="layui-input">
+			</td>
+			<td class="layui-td-gray">保管人<font>*</font></td>
+			<td>
+				<input type="text" name="keep_name" placeholder="请选择" value="" readonly lay-verify="required" lay-reqText="请选择保管人" class="layui-input picker-admin">
+				<input type="hidden" name="keep_uid">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">用途简述</td>
+			<td colspan="3"><textarea name="remark" placeholder="请输入用途简述，可空" class="layui-textarea"></textarea></td>
+		</tr>
+	</table>
+	{else/}
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">印章名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" value="{$detail.title}" lay-verify="required" autocomplete="off" placeholder="请输入印章名称" lay-reqText="请输入印章名称" class="layui-input">
+			</td>
+			<td class="layui-td-gray">保管人<font>*</font></td>
+			<td>
+				<input type="text" name="keep_name" placeholder="请选择" value="{$detail.keep_name}" autocomplete="off" class="layui-input picker-admin">
+				<input type="hidden" name="keep_uid" value="{$detail.keep_uid}">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">用途简述</td>
+			<td colspan="3"><textarea name="remark" placeholder="请输入用途简述，可空" class="layui-textarea">{$detail.remark|default=''}</textarea></td>
+		</tr>
+	</table>
+	{/eq}
+	<div class="py-3">
+		<input type="hidden" name="id" value="{$id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','oaPicker'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool;		  
+		//监听提交
+		form.on('submit(webform)', function(data){
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);					
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/adm/sealcate/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/adm/view/sealcate/datalist.html b/app/adm/view/sealcate/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..d1bd9a188e594758c116bc7a11a2b1b5b7d6abe6
--- /dev/null
+++ b/app/adm/view/sealcate/datalist.html
@@ -0,0 +1,96 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+    <table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm addNew" type="button">+ 添加印章</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool, form = layui.form;
+		layui.pageTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,defaultToolbar: false
+			,title:'印章列表'
+			,url: "/adm/sealcate/datalist"
+			,page: false
+			,cellMinWidth: 80
+			,cols: [[
+					{field:'id',width:80, title: 'ID号', align:'center'}
+					,{field:'title',title: '印章名称'}
+					,{field:'name',title: '保管人',width:100, align:'center'}
+					,{field:'department',title: '保管部门',width:120}
+					,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+						var html1='<span class="green">正常</span>';
+						var html2='<span class="yellow">禁用</span>';
+						if(d.status==1){
+							return html1;
+						}
+						else{
+							return html2;
+						}
+					}}
+					,{width:90,title: '操作', align:'center',templet: function(d){
+						var html='';
+						var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
+						var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+						var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+						if(d.status==1){
+							html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+						}
+						else{
+							html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+						}
+						return html;
+					}}
+				]]
+			});
+			
+			table.on('tool(test)',function (obj) {
+				if(obj.event === 'edit'){					
+					tool.side('/adm/sealcate/add?id='+obj.data.id);
+				}
+				if(obj.event === 'disable'){
+					layer.confirm('确定要禁用该印章吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/adm/sealcate/check", { id: obj.data.id,status: 0,title: obj.data.title}, callback);
+						layer.close(index);
+					});
+				}
+				if(obj.event === 'open'){
+					layer.confirm('确定要启用该印章吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/adm/sealcate/check", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
+						layer.close(index);
+					});
+				}
+			});
+			
+			$('body').on('click','.addNew',function(){					
+				tool.side('/adm/sealcate/add');
+			});
+		}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/api/BaseController.php b/app/api/BaseController.php
new file mode 100644
index 0000000000000000000000000000000000000000..c7f4d06e4c02b3a62f723db1396221594a1075ab
--- /dev/null
+++ b/app/api/BaseController.php
@@ -0,0 +1,159 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\api;
+
+use think\exception\HttpResponseException;
+use think\facade\Request;
+use think\facade\Session;
+use think\facade\View;
+use think\facade\Db;
+use think\Response;
+
+/**
+ * 控制器基础类
+ */
+abstract class BaseController
+{
+    /**
+     * 是否批量验证
+     * @var bool
+     */
+    protected $batchValidate = false;
+
+    /**
+     * 控制器中间件
+     * @var array
+     */
+    protected $middleware = [];
+
+    /**
+     * 分页数量
+     * @var string
+     */
+    protected $pageSize = 20;
+
+    /**
+     * jwt配置
+     * @var string
+     */
+    protected $jwt_conf = [
+        'secrect' => 'gouguoa',
+        'iss' => 'www.gougucms.com', //签发者 可选
+        'aud' => 'gouguoa', //接收该JWT的一方，可选
+        'exptime' => 7200, //过期时间,这里设置2个小时
+    ];
+    protected $module;
+    protected $controller;
+    protected $action;
+    protected $uid;
+    protected $did;
+    protected $pid;
+    /**
+     * 构造方法
+     * @access public
+     * @param  App $app 应用对象
+     */
+    public function __construct()
+    {
+        $this->module = strtolower(app('http')->getName());
+        $this->controller = strtolower(Request::controller());
+        $this->action = strtolower(Request::action());
+        $this->uid = 0;
+        $this->did = 0;
+		$this->pid = 0;
+        $this->jwt_conf = get_system_config('token');
+        // 控制器初始化
+        $this->initialize();
+    }
+
+    // 初始化
+    protected function initialize()
+    {
+        // 检测权限
+        $this->checkLogin();
+        //每页显示数据量
+        $this->pageSize = Request::param('limit', \think\facade\Config::get('app.page_size'));
+    }
+
+    /**
+     *验证用户登录
+     */
+    protected function checkLogin()
+    {
+        $session_admin = get_config('app.session_admin');
+        if (!Session::has($session_admin)) {
+            $this->apiError('请先登录');
+        }
+		else{
+            $this->uid = Session::get($session_admin);
+			$login_admin = get_admin($this->uid);
+			$this->did = $login_admin['did'];
+			$this->pid = $login_admin['pid'];
+			View::assign('login_admin', $login_admin);
+		}
+    }
+    /**
+     * Api处理成功结果返回方法
+     * @param      $message
+     * @param null $redirect
+     * @param null $extra
+     * @return mixed
+     * @throws ReturnException
+     */
+    protected function apiSuccess($msg = 'success', $data = [])
+    {
+        return $this->apiReturn($data, 0, $msg);
+    }
+
+    /**
+     * Api处理结果失败返回方法
+     * @param      $error_code
+     * @param      $message
+     * @param null $redirect
+     * @param null $extra
+     * @return mixed
+     * @throws ReturnException
+     */
+    protected function apiError($msg = 'fail', $data = [], $code = 1)
+    {
+        return $this->apiReturn($data, $code, $msg);
+    }
+
+    /**
+     * 返回封装后的API数据到客户端
+     * @param  mixed   $data 要返回的数据
+     * @param  integer $code 返回的code
+     * @param  mixed   $msg 提示信息
+     * @param  string  $type 返回数据格式
+     * @param  array   $header 发送的Header信息
+     * @return Response
+     */
+    protected function apiReturn($data, int $code = 0, $msg = '', string $type = '', array $header = []): Response
+    {
+        $result = [
+            'code' => $code,
+            'msg' => $msg,
+            'time' => time(),
+            'data' => $data,
+        ];
+
+        $type = $type ?: 'json';
+        $response = Response::create($result, $type)->header($header);
+
+        throw new HttpResponseException($response);
+    }
+
+}
diff --git a/app/api/common.php b/app/api/common.php
new file mode 100644
index 0000000000000000000000000000000000000000..fd0694d4cf489f0c2a4638aa5b23183b6f085f98
--- /dev/null
+++ b/app/api/common.php
@@ -0,0 +1,67 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+/**
+ * 根据IP获取地址
+ */
+function get_address($ip)
+{
+    $res = file_get_contents("http://ip.360.cn/IPQuery/ipquery?ip=" . $ip);
+    $res = json_decode($res, 1);
+    if ($res && $res['errno'] == 0) {
+        return explode("\t", $res['data'])[0];
+    } else {
+        return '';
+    }
+}
+
+/**
+ * 导出数据为excel表格
+ * @param $data    一个二维数组,结构如同从数据库查出来的数组
+ * @param $title   excel的第一行标题,一个数组,如果为空则没有标题
+ * @param $filename 下载的文件名
+ * @param exportexcel($arr,array('id','账户','密码','昵称'),'文件名!');
+ */
+function export_excel($data = array(), $title = array(), $filename = 'report')
+{
+    header("Content-type:application/octet-stream");
+    header("Accept-Ranges:bytes");
+    header("Content-type:application/vnd.ms-excel");
+    header("Content-Disposition:attachment;filename=" . $filename . ".xls");
+    header("Pragma: no-cache");
+    header("Expires: 0");
+    //导出xls 开始
+    if (!empty($title)) {
+        foreach ($title as $k => $v) {
+            $title[$k] = iconv("UTF-8", "GB2312", $v);
+        }
+        $title = implode("\t", $title);
+        echo "$title\n";
+    }
+    if (!empty($data)) {
+        foreach ($data as $key => $val) {
+            foreach ($val as $ck => $cv) {
+                $data[$key][$ck] = iconv("UTF-8", "GB2312", $cv);
+            }
+            $data[$key] = implode("\t", $data[$key]);
+        }
+        echo implode("\n", $data);
+    }
+} 
+ 
+//读取文章分类列表
+function get_article_cate()
+{
+    $cate = \think\facade\Db::name('ArticleCate')->order('create_time asc')->select()->toArray();
+    return $cate;
+}
\ No newline at end of file
diff --git a/app/api/controller/Check.php b/app/api/controller/Check.php
new file mode 100644
index 0000000000000000000000000000000000000000..5501a5b8c01cbf7ce251b06177507624c8e5489e
--- /dev/null
+++ b/app/api/controller/Check.php
@@ -0,0 +1,608 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+namespace app\api\controller;
+
+use app\api\BaseController;
+use think\facade\Db;
+
+class Check extends BaseController
+{	
+	//获取审核流程
+    public function get_flows($check_name='')
+    {
+		$cate_id = Db::name('FlowCate')->where(['name' => $check_name,'status'=>1])->value('id');
+        $flow = Db::name('Flow')->where(['cate_id' => $cate_id,'status'=>1,'delete_time'=>0])->select()->toArray();
+        return to_assign(0, '', $flow);
+    }
+	//获取审核步骤人员
+    public function get_flow_users($id=0)
+    {
+        $flow = Db::name('Flow')->where(['id' => $id])->find();
+        $flow_data = unserialize($flow['flow_list']);
+		if(!empty($flow_data)){
+			foreach ($flow_data as $key => &$val) {
+				$val['check_position'] = '';
+				if($val['check_role'] == 1){
+					$val['check_uids'] = get_department_leader($this->uid);
+				}
+				if($val['check_role'] == 2){
+					$val['check_uids'] = get_department_leader($this->uid,1);
+				}
+				if($val['check_role'] == 3){
+					$val['check_position'] = Db::name('Position')->where('id',$val['check_position_id'])->value('title');
+					$check_uids = Db::name('Admin')->where(['position_id'=>$val['check_position_id'],'status'=>1])->column('id');
+					$val['check_uids'] = implode(',',$check_uids);
+				}
+				$val['check_uids_info'] = Db::name('Admin')->field('id,name,thumb')->where('id','in',$val['check_uids'])->select()->toArray();
+			}
+		}
+		else{
+			$flow_data = [];
+		}
+		
+		$data['copy_uids'] = $flow['copy_uids'];
+		$data['copy_unames'] ='';
+		if(!empty($flow['copy_uids'])){
+			$copy_unames = Db::name('Admin')->where('id', 'in', $flow['copy_uids'])->column('name');
+			$data['copy_unames'] = implode(',', $copy_unames);
+		}
+		$data['flow_data'] = $flow_data;
+        return to_assign(0, '', $data);
+    }
+	
+	//提交审批申请
+    public function submit_check()
+    {
+		$param = get_params();
+		$flow_cate = Db::name('FlowCate')->where(['name' => $param['check_name']])->find();
+		$flow_list = Db::name('Flow')->where('id',$param['flow_id'])->value('flow_list');
+		$flow = unserialize($flow_list);
+		$subject = $flow_cate['title'];
+		$check_table = $flow_cate['check_table'];
+		//var_dump($flow);exit;
+		//删除原来的审核流程和审核记录
+		Db::name('FlowStep')->where(['action_id'=>$param['action_id'],'flow_id'=>$param['flow_id'],'delete_time'=>0])->update(['delete_time'=>time()]);
+		Db::name('FlowRecord')->where(['action_id'=>$param['action_id'],'check_table'=>$check_table,'delete_time'=>0])->update(['delete_time'=>time()]);		
+		$recordData=array(
+			'action_id' => $param['action_id'],
+			'check_table' => $check_table,
+			'step_id' => 0,
+			'check_uid' => $this->uid,
+			'flow_id' => $param['flow_id'],
+			'check_time' => time(),
+			'check_status' => 0,
+			'content' => '提交申请',
+			'create_time' => time()
+		);	
+		if (!isset($param['check_uids'])) {
+			//非自由审批模式
+			$step=[];
+			$sort=0;
+			foreach ($flow as $key => &$value){
+				if($value['check_role'] == 1){
+					$value['check_uids'] = get_department_leader($this->uid);
+					$value['flow_name'] = '当前部门负责人';
+					$value['check_position_id']=0;
+				}
+				if($value['check_role'] == 2){
+					$value['check_uids'] = get_department_leader($this->uid,1);
+					$value['flow_name'] = '上级部门负责人';
+					$value['check_position_id']=0;
+				}
+				if($value['check_role'] == 3){
+					$check_position = Db::name('Position')->where('id',$value['check_position_id'])->value('title');
+					$check_uids = Db::name('Admin')->where(['position_id'=>$value['check_position_id'],'status'=>1])->column('id');
+					$value['check_uids'] = implode(',',$check_uids);
+					$value['flow_name'] = $check_position;
+				}
+				if($value['check_role'] == 4){
+					$value['flow_name'] = '指定人员';
+					$value['check_position_id']=0;
+				}
+				if($value['check_role'] == 5){
+					$value['flow_name'] = '指定人员';
+					$value['check_position_id']=0;
+					$value['check_types']=1;
+				}
+				if(!empty($value['check_uids'])){
+					$step[]=[
+						'action_id' => $param['action_id'],
+						'flow_id' => $param['flow_id'],
+						'flow_name' => $value['flow_name'],
+						'check_position_id' => $value['check_position_id'],
+						'check_role' => $value['check_role'],
+						'check_types' => $value['check_types'],
+						'check_uids' => $value['check_uids'],
+						'create_time' => time(),
+						'sort'=>$sort					
+					];
+					$sort++;
+				}
+			}
+			if(empty($step)){
+				return to_assign(1,'审批流程设置有问题，无法提交审批申请，请联系HR或者管理员重新设置审批流程');
+			}
+			$res = Db::name('FlowStep')->strict(false)->field(true)->insertAll($step);
+			if($res!=false){
+				Db::name('FlowRecord')->strict(false)->field(true)->insertGetId($recordData);
+				Db::name($check_table)->strict(false)->field(true)->update([
+					'id'=>$param['action_id'],
+					'check_flow_id'=>$param['flow_id'],
+					'check_status'=>1,
+					'check_step_sort'=>0,
+					'check_uids'=>$step[0]['check_uids'],
+					'check_copy_uids'=>isset($param['check_copy_uids'])?$param['check_copy_uids']:''
+				]);
+				//发送消息通知
+				if($flow_cate['template_id']>0){
+					$msg=[
+						'from_uid'=>$this->uid,//发送人
+						'to_uids'=>$step[0]['check_uids'],//接收人
+						'template_id'=>$flow_cate['template_id'],//消息模板ID
+						'template_field'=>'0',//消息模板字段
+						'content'=>[ //消息内容
+							'create_time'=>date('Y-m-d H:i:s'),
+							'action_id'=>$param['action_id'],
+							'title' => $subject
+						]
+					];
+					event('SendMessage',$msg);
+				}
+				return to_assign();
+			}
+			else{
+				return to_assign(1,'操作失败');
+			}
+		}
+		else{
+			//自由审批模式
+			$flow_step = array(
+				'action_id' => $param['action_id'],
+				'flow_id' => $param['flow_id'],
+				'flow_name' => '自由审批',
+				'check_uids' => $param['check_uids'],
+				'create_time' => time()
+			);
+			$res = Db::name('FlowStep')->strict(false)->field(true)->insertGetId($flow_step);
+			if($res!=false){
+				Db::name('FlowRecord')->strict(false)->field(true)->insertGetId($recordData);
+				Db::name($check_table)->strict(false)->field(true)->update([
+					  'id'=>$param['action_id'],
+					  'check_flow_id'=>$param['flow_id'],
+					  'check_status'=>1,
+					  'check_step_sort'=>0,
+					  'check_uids'=>$param['check_uids'],
+					  'check_copy_uids'=>isset($param['check_copy_uids'])?$param['check_copy_uids']:''
+				]);
+				//发送消息通知
+				if($flow_cate['template_id']>0){
+					$msg=[
+						'from_uid'=>$this->uid,//发送人
+						'to_uids'=>$param['check_uids'],//接收人
+						'template_id'=>$flow_cate['template_id'],//消息模板ID
+						'template_field'=>'0',//消息模板字段
+						'content'=>[ //消息内容
+							'create_time'=>date('Y-m-d H:i:s'),
+							'action_id'=>$param['action_id'],
+							'title' => $subject
+						]
+					];
+					event('SendMessage',$msg);
+				}
+				return to_assign();
+			}
+			else{
+				return to_assign(1,'操作失败');
+			}
+		}
+	}
+	
+	//获取审核流程节点
+    public function get_flow_nodes($check_name='',$action_id=0,$flow_id=0)
+    {		
+		$flow_cate = Db::name('FlowCate')->where(['name' => $check_name])->find();
+		if($action_id==0){
+			$did = $this->did;
+			$map = [];
+			$map[] = ['cate_id','=',$flow_cate['id']];
+			$map[] = ['status','=',1];
+			$map[] = ['delete_time','=',0];		
+			$map1=[
+				['department_ids','=','']
+			];
+			$map2=[
+				['', 'exp', Db::raw("FIND_IN_SET('{$did}',department_ids)")]
+			];
+			$whereOr =[$map1,$map2];
+			$flow = Db::name('Flow')
+				->where($map)
+				->where(function ($query) use($whereOr) {
+					if (!empty($whereOr)){
+						$query->whereOr($whereOr);
+					}
+				})
+				->select()->toArray();
+			return to_assign(0, '', $flow);
+		}
+		$check_table = $flow_cate['check_table'];
+		$detail = Db::name($check_table)->where('id',$action_id)->field('id,admin_id,check_status,check_flow_id,check_step_sort,check_uids,check_copy_uids')->find();
+		//创建人
+		$is_creater=0;
+		if($detail['admin_id'] == $this->uid){
+			$is_creater=1;
+		}
+		$detail['is_creater'] = $is_creater;
+		$detail['admin_name'] = Db::name('Admin')->where('id',$detail['admin_id'])->value('name');
+		//当前审批人
+		$is_checker=0;
+		if(in_array($this->uid,explode(',',$detail['check_uids']))){
+			$is_checker=1;
+		}
+		$detail['is_checker'] = $is_checker;
+		//审批记录
+		$check_record = Db::name('FlowRecord')
+						->field('f.*,a.name')
+						->alias('f')
+						->join('Admin a', 'a.id = f.check_uid', 'left')
+						->where(['f.action_id' => $action_id,'f.check_table'=>$check_table])->select()->toArray();				
+		foreach ($check_record as $kk => &$vv) {		
+			$vv['check_time_str'] = date('Y-m-d H:i', $vv['check_time']);
+			$vv['status_str'] = '提交';
+			if($vv['check_status'] == 1){
+				$vv['status_str'] = '审核通过';
+			}
+			else if($vv['check_status'] == 2){
+				$vv['status_str'] = '审核拒绝';
+			}
+			if($vv['check_status'] == 3){
+				$vv['status_str'] = '撤销';
+			}
+			if($vv['check_status'] == 4){
+				$vv['status_str'] = '反确认';
+			}
+		}
+		$detail['check_record'] = $check_record;
+		if($detail['check_status']==0 || $detail['check_status']==4){
+			$flow = Db::name('Flow')->where(['cate_id' => $flow_cate['id'],'status'=>1,'delete_time'=>0])->select()->toArray();
+			$detail['flow'] = $flow;
+		}
+		else{				
+			//当前审批人
+			$detail['check_unames']='-';
+			if(!empty($detail['check_uids'])){
+				$check_unames = Db::name('Admin')->where('id','in',$detail['check_uids'])->column('name');
+				$detail['check_unames'] = implode(',',$check_unames);
+			}
+			//抄送人
+			$detail['copy_unames']='-';
+			if(!empty($detail['check_copy_uids'])){
+				$copy_uids = Db::name('Admin')->where('id','in',$detail['check_copy_uids'])->column('name');
+				$detail['copy_unames'] = implode(',',$copy_uids);
+			}
+			
+			//审批节点步骤
+			$nodes = Db::name('FlowStep')->where(['action_id'=>$action_id,'flow_id'=>$flow_id,'delete_time'=>0])->order('sort asc')->select()->toArray();
+			foreach ($nodes as $key => &$val) {
+				$check_uids_info = Db::name('Admin')->field('id,name,thumb')->where('id','in',$val['check_uids'])->select()->toArray();						
+				foreach ($check_uids_info as $k => &$v) {
+					$v['check_time'] = 0;
+					$v['content'] = '';
+					$v['check_status'] = 0;			
+					$check_array = Db::name('FlowRecord')->where(['check_uid' => $v['id'],'step_id' => $val['id']])->order('check_time desc')->select()->toArray();
+					if(!empty($check_array)){
+						$checked = $check_array[0];
+						$v['check_time'] = date('Y-m-d H:i', $checked['check_time']);
+						$v['content'] = $checked['content'];
+						$v['check_status'] = $checked['check_status'];	
+					}
+				}
+				$val['check_uids_info'] = $check_uids_info;
+				
+				if(!empty($val['check_position_id'])){
+					$val['check_position'] = Db::name('Position')->where('id',$val['check_position_id'])->value('title');
+				}
+				else{
+					$val['check_position'] = '';
+				}
+
+				$check_list = [];
+				foreach ($check_record as $kkk => $vvv) {
+					if($vvv['step_id'] == $val['id'])
+					$check_list[] = $vvv;
+				}
+				$val['check_list'] = $check_list;
+			}
+			$detail['nodes'] = $nodes;
+			
+			//当前审核节点
+			$step = Db::name('FlowStep')->where(['action_id'=>$action_id,'flow_id'=>$flow_id,'sort'=>$detail['check_step_sort'],'delete_time'=>0])->find();
+			$detail['step'] = $step;
+		}
+        return to_assign(0, '', $detail);
+    }
+	
+    //流程审核
+    public function flow_check()
+    {
+        $param = get_params();
+		$flow_cate = Db::name('FlowCate')->where(['name' => $param['check_name']])->find();
+		$subject = $flow_cate['title'];
+		$action_id = $param['action_id'];
+		$check_table = $flow_cate['check_table'];
+		//审核内容详情
+		$detail = Db::name($check_table)->where(['id' => $action_id])->find();
+		if (empty($detail)){		
+			return to_assign(1,'审批数据错误');
+		}
+		//当前审核节点详情
+		$step = Db::name('FlowStep')->where(['action_id'=>$action_id,'flow_id'=>$detail['check_flow_id'],'sort'=>$detail['check_step_sort'],'delete_time'=>0])->find();
+		//审核通过时
+		if($param['check'] == 1){
+			$check_uids = explode(",",strval($detail['check_uids']));
+			if (!in_array($this->uid, $check_uids)){		
+				return to_assign(1,'您没权限审核该审批');
+			}
+			//审批通过
+			if($step['check_role'] == 0){
+				//自由人审批
+				if($param['check_node'] == 2){
+					$next_step = $detail['check_step_sort']+1;
+					$flow_step = array(
+						'action_id' => $action_id,
+						'sort' => $next_step,
+						'flow_id' => $detail['check_flow_id'],
+						'check_uids' => $param['check_uids'],
+						'create_time' => time()
+					);
+					$fid = Db::name('FlowStep')->strict(false)->field(true)->insertGetId($flow_step);
+					//下一步审核步骤
+					$param['check_step_sort'] = $next_step;
+					$param['check_status'] = 1;
+				}
+				else{
+					//不存在下一步审核，审核结束
+					$param['check_status'] = 2;
+					$param['check_uids'] ='';
+				}
+			}
+			else{
+				//查询当前步骤审批记录数
+				$check_count = Db::name('FlowRecord')->where(['action_id'=>$action_id,'flow_id'=>$detail['check_flow_id'],'step_id'=>$step['id']])->count();
+				//当前当前步骤审批应有记录数
+				$flow_count = explode(',', $step['check_uids']);
+				$param['check_status'] = 1;
+				$uids_array = explode(',',$detail['check_uids']);
+				$new_uids= array_diff($uids_array, [$this->uid]);
+				$param['check_uids'] = implode(',',$new_uids);
+				if((($check_count+1) >= count($flow_count) && $step['check_types']==1) || $step['check_types']==2){
+					//会签
+					$next_step = Db::name('FlowStep')->where(['action_id'=>$action_id,'flow_id'=>$detail['check_flow_id'],'sort'=>($detail['check_step_sort']+1),'delete_time'=>0])->find();
+					if($next_step){
+						//存在下一步审核
+						if($next_step['check_role'] == 1){
+							$param['check_uids'] = get_department_leader($detail['admin_id']);
+						}
+						else if($next_step['check_role'] == 2){
+							$param['check_uids'] = get_department_leader($detail['admin_id'],1);
+						}
+						else if($next_step['check_role'] == 3){						
+							$uids = Db::name('Admin')->where(['position_id'=>$next_step['check_position_id'],'status'=>1])->column('id');
+							$param['check_uids'] = implode(',' ,$uids);
+						}
+						else{
+							$param['check_uids'] = $next_step['check_uids'];
+						}
+						$param['check_step_sort'] = $detail['check_step_sort']+1;
+						$param['check_status'] = 1;
+					}
+					else{
+						//不存在下一步审核，审核结束
+						$param['check_status'] = 2;
+						$param['check_uids'] ='';
+					}
+				}
+			}
+			if($param['check_status'] == 1 && empty($param['check_uids'])){
+				return to_assign(1,'找不到下一步的审批人，该审批流程设置有问题，请联系HR或者管理员');
+			}			
+			//添加历史审核人
+			if(empty($detail['check_history_uids'])){
+				$param['check_history_uids'] = $this->uid;
+			}
+			else{
+				$param['check_history_uids'] = $detail['check_history_uids'].','.$this->uid;
+			}			
+			$res = Db::name($check_table)->strict(false)->field('check_step_sort,check_status,check_history_uids,check_uids')->where(['id' => $action_id])->update($param);
+			
+			if($res!==false){
+				$checkData=array(
+					'action_id' => $action_id,
+					'check_table' => $check_table,
+					'step_id' => $step['id'],
+					'check_uid' => $this->uid,
+					'flow_id' => $detail['check_flow_id'],
+					'check_time' => time(),
+					'check_status' => $param['check'],
+					'content' => $param['content'],
+					'create_time' => time()
+				);	
+				$aid = Db::name('FlowRecord')->strict(false)->field(true)->insertGetId($checkData);
+				add_log('check', $action_id, $param,$subject);
+				//发送消息通知
+				if($param['check_status'] == 1){
+					if($flow_cate['template_id']>0){
+						$msg=[
+							'from_uid'=>$detail['admin_id'],//发送人
+							'to_uids'=>$param['check_uids'],//接收人
+							'template_id'=>$flow_cate['template_id'],//消息模板ID
+							'template_field'=>'0',//消息模板字段
+							'content'=>[ //消息内容
+								'create_time'=>date('Y-m-d H:i:s',$detail['create_time']),
+								'action_id'=>$action_id,
+								'title' => $subject
+							]
+						];
+						event('SendMessage',$msg);
+					}
+				}
+				if($param['check_status'] == 2){
+					if($flow_cate['template_id']>0){
+						$msg=[
+							'from_uid'=>$this->uid,//发送人
+							'to_uids'=>$detail['admin_id'],//接收人
+							'template_id'=>$flow_cate['template_id'],//消息模板ID
+							'template_field'=>'1',//消息模板字段
+							'content'=>[ //消息内容
+								'create_time'=>date('Y-m-d H:i:s',$detail['create_time']),
+								'action_id'=>$action_id,
+								'title' => $subject
+							]
+						];
+						event('SendMessage',$msg);
+					}
+				}
+				return to_assign();
+			}
+			else{
+				return to_assign(1,'操作失败');
+			}
+		}
+		else if($param['check'] == 2){
+			$check_uids = explode(",",strval($detail['check_uids']));
+			if (!in_array($this->uid, $check_uids)){		
+				return to_assign(1,'您没权限审核该审批');
+			}
+			//拒绝审核，数据操作
+			$param['check_status'] = 3;
+			//添加历史审核人
+			if(empty($detail['check_history_uids'])){
+				$param['check_history_uids'] = $this->uid;
+			}
+			else{
+				$param['check_history_uids'] = $detail['check_history_uids'].','.$this->uid;
+			}
+			$param['check_uids'] ='';
+			if($step['check_role'] == 5){
+				//获取上一步的审核信息
+				$prev_step = Db::name('FlowStep')->where(['action_id'=>$action_id,'flow_id'=>$detail['check_flow_id'],'sort'=>($detail['check_step_sort']-1),'delete_time'=>0])->find();
+				if($prev_step){
+					//存在上一步审核
+					$param['check_step_sort'] = $prev_step['sort'];
+					$param['check_uids'] = $prev_step['check_uids'];
+					$param['check_status'] = 1;
+				}
+				else{
+					//不存在上一步审核，审核初始化步骤
+					$param['check_step_sort'] = 0;
+					$param['check_uids'] = '';					
+					$param['check_status'] = 0;
+				}
+			}
+			
+			$res = Db::name($check_table)->strict(false)->field('check_step_sort,check_status,check_history_uids,check_uids')->where(['id' => $action_id])->update($param);
+			if($res!==false){
+				$checkData=array(
+					'action_id' => $action_id,
+					'check_table' => $check_table,
+					'step_id' => $step['id'],
+					'check_uid' => $this->uid,
+					'flow_id' => $detail['check_flow_id'],
+					'check_time' => time(),
+					'check_status' => $param['check'],
+					'content' => $param['content'],
+					'create_time' => time()
+				);	
+				$aid = Db::name('FlowRecord')->strict(false)->field(true)->insertGetId($checkData);
+				add_log('refue', $action_id, $param,$subject);
+				//发送消息通知
+				if($flow_cate['template_id']>0){
+					$msg=[
+						'from_uid'=>$this->uid,//发送人
+						'to_uids'=>$detail['admin_id'],//接收人
+						'template_id'=>$flow_cate['template_id'],//消息模板ID
+						'template_field'=>'2',//消息模板字段
+						'content'=>[ //消息内容
+							'create_time'=>date('Y-m-d H:i:s',$detail['create_time']),
+							'action_id'=>$detail['id'],
+							'title' => $subject
+						]
+					];
+					event('SendMessage',$msg);
+				}
+				return to_assign();
+			}
+			else{
+				return to_assign(1,'操作失败');
+			}			
+		}		
+		else if($param['check'] == 3){
+			//审批撤回
+			if($detail['admin_id'] != $this->uid){
+				return to_assign(1,'你没权限操作');
+			}
+			//撤销审核，数据操作
+			$param['check_status'] = 4;
+			$param['check_uids'] ='';
+			$param['check_step_sort'] =0;
+			
+			$res = Db::name($check_table)->strict(false)->field('check_step_sort,check_status,check_uids')->where(['id' => $action_id])->update($param);
+			if($res!==false){
+				$checkData=array(
+					'action_id' => $action_id,
+					'check_table' => $check_table,
+					'step_id' => $step['id'],
+					'check_uid' => $this->uid,
+					'flow_id' => $detail['check_flow_id'],
+					'check_time' => time(),
+					'check_status' => $param['check'],
+					'content' => $param['content'],
+					'create_time' => time()
+				);
+				$aid = Db::name('FlowRecord')->strict(false)->field(true)->insertGetId($checkData);
+				add_log('back', $action_id, $param,$subject);
+				return to_assign();
+			}else{
+				return to_assign(1,'操作失败');
+			}
+		}
+		else if($param['check'] == 4){
+			//审批反确认
+			//反确认审核，数据回到待提交审批
+			$param['check_status'] = 0;
+			$param['check_uids'] ='';
+			$param['check_step_sort'] =0;
+			
+			$res = Db::name($check_table)->strict(false)->field('check_step_sort,check_status,check_uids')->where(['id' => $action_id])->update($param);
+			if($res!==false){
+				$checkData=array(
+					'action_id' => $action_id,
+					'check_table' => $check_table,
+					'step_id' => $step['id'],
+					'check_uid' => $this->uid,
+					'flow_id' => $detail['check_flow_id'],
+					'check_time' => time(),
+					'check_status' => $param['check'],
+					'content' => $param['content'],
+					'create_time' => time()
+				);
+				$aid = Db::name('FlowRecord')->strict(false)->field(true)->insertGetId($checkData);
+				add_log('back', $action_id, $param,$subject);
+				return to_assign();
+			}else{
+				return to_assign(1,'操作失败');
+			}
+		}
+    }
+}
diff --git a/app/api/controller/Comment.php b/app/api/controller/Comment.php
new file mode 100644
index 0000000000000000000000000000000000000000..11a717d6a818c8c472fb740ebfbea70b7224a3ef
--- /dev/null
+++ b/app/api/controller/Comment.php
@@ -0,0 +1,105 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+declare (strict_types = 1);
+namespace app\api\controller;
+
+use app\api\BaseController;
+use think\facade\Db;
+use app\api\model\Comment as CommentModel;
+class Comment extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new CommentModel();
+    }
+	
+	//获取评论列表
+    public function datalist()
+    {
+		$param = get_params();
+		$where=[];
+		if (!empty($param['module'])) {
+			$where[] = ['module', '=', $param['module']];
+		}
+		if (!empty($param['topic_id'])) {
+			$where['topic_id'] = $param['topic_id'];
+		}			
+		$where[] = ['delete_time', '=', 0];
+		$param['admin_id'] = $this->uid;
+		$list = $this->model->datalist($param,$where);
+		return table_assign(0, '', $list);
+    }
+	
+    //添加修改评论内容
+    public function add()
+    {
+		$param = get_params();	
+		if (!empty($param['id']) && $param['id'] > 0) {
+			$param['update_time'] = time();
+			unset($param['pid']);
+			unset($param['padmin_id']);
+            $res = CommentModel::where(['admin_id' => $this->uid,'id'=>$param['id']])->strict(false)->field(true)->update($param);
+			if ($res!==false) {
+				add_log('edit', $param['id'], $param,'评论');
+				return to_assign();
+			}
+        } else {
+            $param['create_time'] = time();
+            $param['admin_id'] = $this->uid;
+            $insertId = CommentModel::strict(false)->field(true)->insertGetId($param);
+			if ($insertId) {
+				add_log('add', $insertId, $param,'评论');
+				return to_assign();
+			}			
+		}
+    }
+	
+	//设为已读评论内容
+    public function view()
+    {
+		if (request()->isPost()) {
+			$id = get_params("id");
+			$res = Db::name('CommentRead')->strict(false)->field(true)->insertGetId(['comment_id'=>$id,'admin_id'=>$this->uid,'create_time'=>time()]);
+			if ($res!==false) {
+				add_log('view', $id,[],'评论');
+				return to_assign(0, "操作成功");
+			} else {
+				return to_assign(1, "操作失败");
+			}
+		}else{
+			return to_assign(1, "错误的请求");
+		}
+    }
+	
+	//删除评论内容
+    public function del()
+    {
+		if (request()->isDelete()) {
+			$id = get_params("id");
+			$res = CommentModel::where('id',$id)->strict(false)->field(true)->update(['delete_time'=>time()]);
+			if ($res) {
+				add_log('delete', $id,[],'评论');
+				return to_assign(0, "删除成功");
+			} else {
+				return to_assign(1, "删除失败");
+			}
+		}else{
+			return to_assign(1, "错误的请求");
+		}
+    }
+}
diff --git a/app/api/controller/Demo.php b/app/api/controller/Demo.php
new file mode 100644
index 0000000000000000000000000000000000000000..62ee044c8d6abdbce33e65a4616076f8f99833d6
--- /dev/null
+++ b/app/api/controller/Demo.php
@@ -0,0 +1,138 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+namespace app\api\controller;
+
+use app\api\BaseController;
+use app\api\middleware\Auth;
+use Firebase\JWT\JWT;
+use Firebase\JWT\Key;
+use think\facade\Db;
+use think\facade\Request;
+
+class Demo extends BaseController
+{
+    /**
+     * 控制器中间件 [登录、注册 不需要鉴权]
+     * @var array
+     */
+	protected $middleware = [
+    	Auth::class => ['except' 	=> ['index','login'] ]
+    ];
+
+    /**
+     * @param $user_id
+     * @return string
+     */
+    public function getToken($user_id){
+        $time = time(); //当前时间
+		$conf = $this->jwt_conf;
+        $token = [
+            'iss' => $conf['iss'], //签发者 可选
+            'aud' => $conf['aud'], //接收该JWT的一方，可选
+            'iat' => $time, //签发时间
+            'nbf' => $time-1 , //(Not Before)：某个时间点后才能访问，比如设置time+30，表示当前时间30秒后才能使用
+            'exp' => $time+$conf['exptime'], //过期时间,这里设置2个小时
+            'data' => [
+                //自定义信息，不要定义敏感信息
+                'userid' =>$user_id,
+            ]
+        ];
+        return JWT::encode($token, $conf['secrect'], 'HS256'); //输出Token  默认'HS256'
+    }
+
+    /**
+     * @param $token
+     */
+    public static function checkToken($token){
+        try {
+            JWT::$leeway = 60;//当前时间减去60，把时间留点余地
+            $decoded = JWT::decode($token, self::$config['secrect'], ['HS256']); //HS256方式，这里要和签发的时候对应
+            return (array)$decoded;
+        } catch(\Firebase\JWT\SignatureInvalidException $e) {  //签名不正确
+            return json(['code'=>403,'msg'=>'签名错误']);
+        }catch(\Firebase\JWT\BeforeValidException $e) {  // 签名在某个时间点之后才能用
+            return json(['code'=>401,'msg'=>'token失效']);
+        }catch(\Firebase\JWT\ExpiredException $e) {  // token过期
+            return json(['code'=>401,'msg'=>'token已过期']);
+        }catch(Exception $e) {  //其他错误
+            return json(['code'=>404,'msg'=>'非法请求']);
+        }catch(\UnexpectedValueException $e) {  //其他错误
+            return json(['code'=>404,'msg'=>'非法请求']);
+        } catch(\DomainException $e) {  //其他错误
+            return json(['code'=>404,'msg'=>'非法请求']);
+        }
+
+    }	
+	
+    /**
+     * @api {post} /demo/login 会员登录
+     * @apiDescription 系统登录接口，返回 token 用于操作需验证身份的接口
+
+     * @apiParam (请求参数：) {string}             username 登录用户名
+     * @apiParam (请求参数：) {string}             password 登录密码
+
+     * @apiParam (响应字段：) {string}             token    Token
+
+     * @apiSuccessExample {json} 成功示例
+     * {"code":0,"msg":"登录成功","time":1627374739,"data":{"token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhcGkuZ291Z3VjbXMuY29tIiwiYXVkIjoiZ291Z3VjbXMiLCJpYXQiOjE2MjczNzQ3MzksImV4cCI6MTYyNzM3ODMzOSwidWlkIjoxfQ.gjYMtCIwKKY7AalFTlwB2ZVWULxiQpsGvrz5I5t2qTs"}}
+     * @apiErrorExample {json} 失败示例
+     * {"code":1,"msg":"帐号或密码错误","time":1627374820,"data":[]}
+     */
+	
+    public function login()
+    {
+        $param = get_params();
+        if (empty($param['username']) || empty($param['password'])) {
+            $this->apiError('参数错误');
+        }
+        // 校验用户名密码
+        $user = Db::name('Admin')->where(['username' => $param['username']])->find();
+        if (empty($user)) {
+            $this->apiError('帐号或密码错误');
+        }
+        $param['pwd'] = set_password($param['password'], $user['salt']);
+        if ($param['pwd'] !== $user['pwd']) {
+            $this->apiError('帐号或密码错误');
+        }
+        if ($user['status'] == -1) {
+            $this->apiError('该用户禁止登录,请于平台联系');
+        }
+        $data = [
+            'last_login_time' => time(),
+            'last_login_ip' => request()->ip(),
+            'login_num' => $user['login_num'] + 1,
+        ];
+        $res = Db::name('Admin')->where(['id' => $user['id']])->update($data);
+        if ($res) {
+            $token = self::getToken($user['id']);
+            $this->apiSuccess('登录成功', ['token' => $token]);
+        }
+    }
+    /**
+     * @api {post} /index/demo 测试页面
+     * @apiDescription  返回文章列表信息
+
+     * @apiParam (请求参数：) {string}  token Token
+
+     * @apiSuccessExample {json} 响应数据样例
+     * {"code":1,"msg":"","time":1563517637,"data":{"id":13,"email":"test110@qq.com","password":"e10adc3949ba59abbe56e057f20f883e","sex":1,"last_login_time":1563517503,"last_login_ip":"127.0.0.1","qq":"123455","mobile":"","mobile_validated":0,"email_validated":0,"type_id":1,"status":1,"create_ip":"127.0.0.1","update_time":1563507130,"create_time":1563503991,"type_name":"注册会员"}}
+     */
+    public function test(Request $request)
+    {
+		$uid = JWT_UID;
+        $userInfo = Db::name('Admin')->where(['id' => $uid])->find();
+        $this->apiSuccess('请求成功', ['user' => $userInfo]);
+    }
+}
diff --git a/app/api/controller/Import.php b/app/api/controller/Import.php
new file mode 100644
index 0000000000000000000000000000000000000000..7bf076497578883e6bd110f815850f42141e9a0a
--- /dev/null
+++ b/app/api/controller/Import.php
@@ -0,0 +1,379 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+namespace app\api\controller;
+
+use app\api\BaseController;
+use think\facade\Db;
+use app\user\model\Admin;
+use app\customer\model\Customer;
+use avatars\MDAvatars;
+use Overtrue\Pinyin\Pinyin;
+use PhpOffice\PhpSpreadsheet\IOFactory;
+use PhpOffice\PhpSpreadsheet\Shared\Date as Shared;
+use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
+
+
+class Import extends BaseController
+{
+    //生成头像
+    public function to_avatars($char)
+    {
+        $defaultData = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
+            'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'S', 'Y', 'Z',
+            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+            '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖', '拾',
+            '一', '二', '三', '四', '五', '六', '七', '八', '九', '十');
+        if (isset($char)) {
+            $Char = $char;
+        } else {
+            $Char = $defaultData[mt_rand(0, count($defaultData) - 1)];
+        }
+        $OutputSize = min(512, empty($_GET['size']) ? 36 : intval($_GET['size']));
+
+        $Avatar = new MDAvatars($Char, 256, 1);
+        $avatar_name = '/avatars/avatar_256_' . set_salt(10) . time() . '.png';
+        $path = get_config('filesystem.disks.public.url') . $avatar_name;
+        $res = $Avatar->Save('.' . $path, 256);
+        $Avatar->Free();
+        return $path;
+    }
+	
+    //登录名校验
+    public function check_name($name,$arr)
+    {
+        if(in_array($name,$arr)){
+			$name = $this->check_name($name.'1',$arr);
+		}
+		return $name;       
+    }
+	
+	//导入员工
+	public function import_admin(){
+        // 获取表单上传文件
+        $file[]= request()->file('file');
+		if($this->uid>1){
+			return to_assign(1,'该操作只能是超级管理员有权限操作');
+		}
+        try {
+            // 验证文件大小，名称等是否正确
+            validate(['file' => 'filesize:51200|fileExt:xls,xlsx'])->check($file);
+			// 日期前綴
+			 $dataPath = date('Ym');
+			 $md5 = $file[0]->hash('md5');
+			 $savename = \think\facade\Filesystem::disk('public')->putFile($dataPath, $file[0], function () use ($md5) {
+				 return $md5;
+			 });
+            $fileExtendName = substr(strrchr($savename, '.'), 1);
+            // 有Xls和Xlsx格式两种
+            if ($fileExtendName == 'xlsx') {
+                $objReader = IOFactory::createReader('Xlsx');
+            } else {
+                $objReader = IOFactory::createReader('Xls');
+            }
+            $objReader->setReadDataOnly(TRUE);
+			$path = get_config('filesystem.disks.public.url');
+            // 读取文件，tp6默认上传的文件，在runtime的相应目录下，可根据实际情况自己更改
+            $objPHPExcel = $objReader->load('.'.$path . '/' .$savename);
+            $sheet = $objPHPExcel->getSheet(0);   //excel中的第一张sheet
+            $highestRow = $sheet->getHighestRow();       // 取得总行数
+            $highestColumn = $sheet->getHighestColumn();   // 取得总列数
+            Coordinate::columnIndexFromString($highestColumn);
+            $lines = $highestRow - 1;
+            if ($lines <= 0) {
+				return to_assign(1, '数据不能为空');
+                exit();
+            }
+			$sex_array=['未知','男','女'];
+			$type_array=['未知','正式','试用','实习'];
+			$mobile_array = Db::name('Admin')->where([['status','>=',0]])->column('mobile');
+			$email_array = Db::name('Admin')->where([['status','>=',0]])->column('email');
+			$username_array = Db::name('Admin')->where([['status','>=',0]])->column('username');
+			$department_array = Db::name('Department')->where(['status' => 1])->column('title', 'id');
+			$position_array = Db::name('Position')->where(['status' => 1])->column('title', 'id');
+            //循环读取excel表格，整合成数组。如果是不指定key的二维，就用$data[i][j]表示。
+            for ($j = 3; $j <= $highestRow; $j++) {
+				$salt = set_salt(20);
+				$reg_pwd  = '123456';
+				$name = $objPHPExcel->getActiveSheet()->getCell("A" . $j)->getValue();
+				if(empty($name)){
+					continue;
+				}
+				$char = mb_substr($name, 0, 1, 'utf-8');
+				$sex = array_search_plus($sex_array,$objPHPExcel->getActiveSheet()->getCell("D" . $j)->getValue());
+				$department = array_search_plus($department_array,$objPHPExcel->getActiveSheet()->getCell("E" . $j)->getValue());
+				$position = array_search_plus($position_array,$objPHPExcel->getActiveSheet()->getCell("f" . $j)->getValue());
+				$type = array_search_plus($type_array,$objPHPExcel->getActiveSheet()->getCell("G" . $j)->getValue());
+				$username = Pinyin::name($name,'none')->join('');
+				//$username = implode('-', $pinyinname);
+				$mobile = $objPHPExcel->getActiveSheet()->getCell("B" . $j)->getValue();
+				$email = $objPHPExcel->getActiveSheet()->getCell("C" . $j)->getValue();
+				$file_check['mobile'] = $mobile;
+				$file_check['email'] = $email;
+				$validate_mobile = \think\facade\Validate::rule([
+					'mobile' => 'require|mobile',
+				]);
+				$validate_email = \think\facade\Validate::rule([
+					'email' => 'email',
+				]);
+				if (!$validate_mobile->check($file_check)) {
+					return to_assign(1, '第'.($j - 2).'行的手机号码的格式错误');
+				}
+				else{
+					if(in_array($mobile,$mobile_array)){
+						return to_assign(1, '第'.($j - 2).'行的手机号码已存在或者重复');
+					}
+					else{
+						array_push($mobile_array,$mobile);
+					}
+				}
+				if(!empty($email)){
+					if (!$validate_email->check($file_check)) {
+						return to_assign(1, '第'.($j - 2).'行的电子邮箱的格式错误');
+					}
+					else{
+						if(in_array($email,$email_array)){
+							return to_assign(1, '第'.($j - 2).'行的电子邮箱已存在或者重复');
+						}
+						else{
+							array_push($email_array,$email);
+						}
+					}
+				}
+				else{
+					$email='';
+				}
+				if(empty($department)){
+					return to_assign(1, '第'.($j - 2).'行的所在部门错误');
+				}
+				if(empty($position)){
+					return to_assign(1, '第'.($j - 2).'行的所属职位错误');
+				}
+				
+				$newusername = $this->check_name($username,$username_array);
+				array_push($username_array,$newusername);				
+                $data[$j - 3] = [		
+                    'name' => $name,
+                    'nickname' => $name,
+                    'mobile' => $mobile,
+                    'email' => $email,
+                    'sex' => $sex,
+                    'did' => $department,
+                    'position_id' => $position,
+                    'type' => $type,
+					'entry_time' => Shared::excelToTimestamp($objPHPExcel->getActiveSheet()->getCell("H" . $j)->getValue(),'Asia/Shanghai'),
+					'username' => $newusername,
+                    'salt' => $salt,
+					'pwd' => set_password($reg_pwd, $salt),
+                    'reg_pwd' => $reg_pwd,
+                    'thumb' => $this->to_avatars($char)
+                ];
+            }
+           //dd($data);exit;
+			$count=0;
+			foreach ($data as $a => $aa) {	
+				$aid = Admin::strict(false)->field(true)->insertGetId($aa);
+				if($aid>0){
+					//Db::name('DepartmentAdmin')->insert(['admin_id'=>$aid,'department_id'=>$aa['did'],'create_time' => time()]);
+					$count++;
+				}
+			}
+            return to_assign(0, '共成功导入了'.$count.'条员工数据');
+        } catch (\think\exception\ValidateException $e) {
+			return to_assign(1, $e->getMessage());
+        }
+    }
+	
+	//导入客户
+	public function import_customer(){
+        // 获取表单上传文件
+        $file[]= request()->file('file');
+		
+		$param = get_params();
+		$type = 'sea';
+		if(isset($param['type'])){
+			$type = $param['type'];
+		}
+        try {
+            // 验证文件大小，名称等是否正确
+            validate(['file' => 'filesize:51200|fileExt:xls,xlsx'])->check($file);
+			// 日期前綴
+			 $dataPath = date('Ym');
+			 $md5 = $file[0]->hash('md5');
+			 $savename = \think\facade\Filesystem::disk('public')->putFile($dataPath, $file[0], function () use ($md5) {
+				 return $md5;
+			 });
+            $fileExtendName = substr(strrchr($savename, '.'), 1);
+            // 有Xls和Xlsx格式两种
+            if ($fileExtendName == 'xlsx') {
+                $objReader = IOFactory::createReader('Xlsx');
+            } else {
+                $objReader = IOFactory::createReader('Xls');
+            }
+            $objReader->setReadDataOnly(TRUE);
+			$path = get_config('filesystem.disks.public.url');
+            // 读取文件，tp6默认上传的文件，在runtime的相应目录下，可根据实际情况自己更改
+            $objPHPExcel = $objReader->load('.'.$path . '/' .$savename);
+            //$objPHPExcel = $objReader->load('./storage/202209/d11544d20b3ca1c1a5f8ce799c3b2433.xlsx');
+            $sheet = $objPHPExcel->getSheet(0);   //excel中的第一张sheet
+            $highestRow = $sheet->getHighestRow();       // 取得总行数
+            $highestColumn = $sheet->getHighestColumn();   // 取得总列数
+            Coordinate::columnIndexFromString($highestColumn);
+            $lines = $highestRow - 1;
+            if ($lines <= 0) {
+				return to_assign(1, '数据不能为空');
+                exit();
+            }
+			$name_array = []; 
+			$source_array = Db::name('CustomerSource')->where(['status' => 1])->column('title', 'id');
+			$grade_array = Db::name('CustomerGrade')->where(['status' => 1])->column('title', 'id');
+			$industry_array = Db::name('Industry')->where(['status' => 1])->column('title', 'id');
+					
+            //循环读取excel表格，整合成数组。如果是不指定key的二维，就用$data[i][j]表示。
+            for ($j = 3; $j <= $highestRow; $j++) {
+				$file_check = [];
+				$name = $objPHPExcel->getActiveSheet()->getCell("A" . $j)->getValue();
+				if(empty($name)){
+					continue;
+				}
+				$count_name = Db::name('Customer')->where('name',$name)->count();
+				if($count_name>0){
+					return to_assign(1, '第'.($j - 2).'行的客户名称已经存在');
+				}
+				if(in_array($name,$name_array)){
+					return to_assign(1, '上传的文件存在相同的客户名称，请删除再操作');
+				}
+				array_push($name_array,$name);
+				$source_id = array_search_plus($source_array,$objPHPExcel->getActiveSheet()->getCell("B" . $j)->getValue());
+				$grade_id = array_search_plus($grade_array,$objPHPExcel->getActiveSheet()->getCell("C" . $j)->getValue());
+				$industry_id = array_search_plus($industry_array,$objPHPExcel->getActiveSheet()->getCell("D" . $j)->getValue());	
+				
+				$c_name = $objPHPExcel->getActiveSheet()->getCell("E" . $j)->getValue();
+				$c_mobile = $objPHPExcel->getActiveSheet()->getCell("F" . $j)->getValue();
+				$file_check['c_mobile'] = $c_mobile;
+				$tax_num = $objPHPExcel->getActiveSheet()->getCell("G" . $j)->getValue();
+				$bank = $objPHPExcel->getActiveSheet()->getCell("H" . $j)->getValue();
+				$bank_sn = $objPHPExcel->getActiveSheet()->getCell("I" . $j)->getValue();
+				$file_check['bank_sn'] = $bank_sn;
+				$bank_no = $objPHPExcel->getActiveSheet()->getCell("K" . $j)->getValue();				
+				$cperson_mobile = $objPHPExcel->getActiveSheet()->getCell("K" . $j)->getValue();				
+				$address = $objPHPExcel->getActiveSheet()->getCell("L" . $j)->getValue();
+				$content = $objPHPExcel->getActiveSheet()->getCell("M" . $j)->getValue();
+				$market = $objPHPExcel->getActiveSheet()->getCell("N" . $j)->getValue();
+				if(empty($c_name)){
+					return to_assign(1, '第'.($j - 2).'行的客户联系人姓名没完善');
+				}
+				if(empty($c_mobile)){
+					return to_assign(1, '第'.($j - 2).'行的客户联系人手机号码没完善');
+				}
+				$validate_mobile = \think\facade\Validate::rule([
+					'c_mobile' => 'mobile',
+				]);
+				if (!$validate_mobile->check($file_check)) {
+					return to_assign(1, '第'.($j - 2).'行的客户联系人手机号码格式错误');
+				}
+				if(empty($source_id)){
+					return to_assign(1, '第'.($j - 2).'行的客户来源错误');
+				}
+				if(empty($grade_id)){
+					return to_assign(1, '第'.($j - 2).'行的客户等级错误');
+				}
+				if(empty($industry_id)){
+					return to_assign(1, '第'.($j - 2).'行的所属行业错误');
+				}
+				if(empty($tax_num)){
+					$tax_num='';
+				}
+				if(empty($bank)){
+					$bank='';
+				}
+				$validate_bank = \think\facade\Validate::rule([
+					'bank_sn' => 'number',
+				]);
+				if(!empty($bank_sn)){
+					if (!$validate_bank->check($file_check)) {
+						return to_assign(1, '第'.($j - 2).'行的银行卡账号格式错误');
+					}
+				}
+				else{
+					$bank_sn='';
+				}
+				if(empty($bank_no)){
+					$bank_no='';
+				}
+				if(empty($cperson_mobile)){
+					$cperson_mobile='';
+				}
+				if(empty($address)){
+					$address='';
+				}
+				if(empty($content)){
+					$content='';
+				}
+				if(empty($market)){
+					$market='';
+				}
+				$belong_uid = 0;
+				$belong_did = 0;
+				if($type != 'sea'){
+					$belong_uid = $this->uid;
+					$belong_did = $this->did;
+				}
+                $data[$j - 3] = [		
+                    'name' => $name,
+                    'source_id' => $source_id,
+                    'grade_id' => $grade_id,
+                    'industry_id' => $industry_id,
+                    'tax_num' => $tax_num,
+                    'bank' => $bank,
+                    'bank_sn' => $bank_sn,
+                    'bank_no' => $bank_no,
+					'cperson_mobile' => $cperson_mobile,
+					'address' => $address,
+                    'content' => $content,
+					'market' => $market,
+                    'admin_id' => $this->uid,
+                    'belong_uid' => $belong_uid,
+                    'belong_did' => $belong_did,
+                    'c_mobile' => $c_mobile,
+                    'c_name' => $c_name,
+                    'create_time' => time(),
+                    'update_time' => time()
+                ];
+            }
+            //dd($data);exit;
+            // 批量添加数据
+			$count=0;
+			foreach ($data as $a => $aa) {	
+				$cid = Customer::strict(false)->field(true)->insertGetId($aa);
+				if($cid>0){
+					$contact = [
+						'name' => $aa['c_name'],
+						'mobile' => $aa['c_mobile'],
+						'sex' => 1,
+						'cid' => $cid,
+						'is_default' => 1,
+						'create_time' => time(),
+						'admin_id' => $this->uid
+					];
+					Db::name('CustomerContact')->strict(false)->field(true)->insert($contact);
+					$count++;
+				}
+			}
+            return to_assign(0, '共成功导入了'.$count.'条客户数据');
+        } catch (\think\exception\ValidateException $e) {
+			return to_assign(1, $e->getMessage());
+        }
+    }
+}
diff --git a/app/api/controller/Index.php b/app/api/controller/Index.php
new file mode 100644
index 0000000000000000000000000000000000000000..4f7451cb01f3113cbadd53fcf9f0fe0a5f9b4ab2
--- /dev/null
+++ b/app/api/controller/Index.php
@@ -0,0 +1,607 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+namespace app\api\controller;
+
+use app\api\BaseController;
+use app\api\model\EditLog;
+use think\facade\Db;
+
+class Index extends BaseController
+{
+	//上传文件
+	public function upload()
+	{
+		if (request()->isPost()) {
+			$param = get_params();
+			$sourse = 'file';
+			if(isset($param['sourse'])){
+				$sourse = $param['sourse'];
+			}
+			if($sourse == 'file' || $sourse == 'tinymce'){
+				if(request()->file('file')){
+					$file = request()->file('file');
+				}
+				else{
+					return to_assign(1, '没有选择上传文件');
+				}
+			}
+			else{
+				if (request()->file('editormd-image-file')) {
+					$file = request()->file('editormd-image-file');
+				} else {
+					return to_assign(1, '没有选择上传文件');
+				}
+			}
+			// 获取上传文件的hash散列值
+			$sha1 = $file->hash('sha1');
+			$md5 = $file->hash('md5');
+			$rule = [
+				'image' => 'jpg,png,jpeg,gif',
+				'doc' => 'txt,doc,docx,ppt,pptx,xls,xlsx,pdf',
+				'file' => 'zip,gz,7z,rar,tar',
+				'video' => 'mpg,mp4,mpeg,avi,wmv,mov,flv,m4v',
+				'audio' => 'mp3,wav,wma,flac,midi',
+			];
+			$fileExt = $rule['image'] . ',' . $rule['doc'] . ',' . $rule['file'] . ',' . $rule['video'] . ',' . $rule['audio'];
+			//1M=1024*1024=1048576字节
+			$file_size = get_system_config('system','upload_max_filesize');
+			if(!isset($file_size)){
+				$file_size=50;
+			}
+			$fileSize = $file_size * 1024 * 1024;
+			if (isset($param['type']) && $param['type']) {
+				$fileExt = $rule[$param['type']];
+			}
+			if (isset($param['size']) && $param['size']) {
+				$fileSize = $param['size'];
+			}
+			$validate = \think\facade\Validate::rule([
+				'image' => 'require|fileSize:' . $fileSize . '|fileExt:' . $fileExt,
+			]);
+			$file_check['image'] = $file;
+			if (!$validate->check($file_check)) {
+				return to_assign(1, $validate->getError());
+			}
+			// 日期前綴
+			$dataPath = date('Ym');
+			$use = 'thumb';
+			$filename = \think\facade\Filesystem::disk('public')->putFile($dataPath, $file, function () use ($md5) {
+				return set_salt(5).'_'.$md5;
+			});
+			if ($filename) {
+				//写入到附件表
+				$data = [];
+				$path = get_config('filesystem.disks.public.url');
+				$data['filepath'] = $path . '/' . $filename;
+				$data['name'] = $file->getOriginalName();
+				$data['mimetype'] = $file->getOriginalMime();
+				$data['fileext'] = $file->extension();
+				$data['filesize'] = $file->getSize();
+				$data['filename'] = $filename;
+				$data['sha1'] = $sha1;
+				$data['md5'] = $md5;
+				$data['module'] = \think\facade\App::initialize()->http->getName();
+				$data['action'] = app('request')->action();
+				$data['uploadip'] = app('request')->ip();
+				$data['create_time'] = time();
+				$data['user_id'] = $this->uid;
+				if ($data['module'] = 'admin') {
+					//通过后台上传的文件直接审核通过
+					$data['status'] = 1;
+					$data['admin_id'] = $data['user_id'];
+					$data['audit_time'] = time();
+				}
+				$data['use'] = request()->has('use') ? request()->param('use') : $use; //附件用处
+				$res['id'] = Db::name('file')->insertGetId($data);
+				$res['filepath'] = $data['filepath'];
+				$res['name'] = $data['name'];
+				$res['uid'] = $this->uid;
+				$res['filename'] = $data['filename'];
+				$res['filesize'] = $data['filesize'];
+				$res['fileext'] = $data['fileext'];
+				add_log('upload', $data['user_id'], $data,'文件');
+				if($sourse == 'editormd'){
+					//editormd编辑器上传返回
+					return json(['success'=>1,'message'=>'上传成功','url'=>$data['filepath']]);
+				}
+				else if($sourse == 'tinymce'){
+					//tinymce编辑器上传返回
+					return json(['success'=>1,'message'=>'上传成功','location'=>$data['filepath']]);
+				}
+				else{
+					//普通上传返回
+					return to_assign(0, '上传成功', $res);
+				}            
+			 }
+			 else {
+				return to_assign(1, '上传失败，请重试');
+			 }
+		}
+		else{
+			return to_assign(1, '非法请求');
+		} 
+	}
+	
+	//执行分块上传的控制器方法
+	public function chunkUpload() {
+		if ($this->request->isPost()) {
+			//执行分块上传流程
+			$data = $this->request->post();
+			//判断是否是分块上传
+			if ($data['type'] === 'chunk') {
+				$file = request()->file('file');
+				
+				$rule = [
+					'image' => 'jpg,png,jpeg,gif',
+					'doc' => 'txt,doc,docx,ppt,pptx,xls,xlsx,pdf',
+					'file' => 'zip,gz,7z,rar,tar',
+					'video' => 'mpg,mp4,mpeg,avi,wmv,mov,flv,m4v',
+					'audio' => 'mp3,wav,wma,flac,midi',
+				];
+				$fileExt = $rule['image'] . ',' . $rule['doc'] . ',' . $rule['file'] . ',' . $rule['video'] . ',' . $rule['audio'];
+				//1M=1024*1024=1048576字节
+				$file_size = get_system_config('system','upload_max_filesize');
+				if(!isset($file_size)){
+					$file_size=50;
+				}
+				$fileSize = $file_size * 1024 * 1024;
+				$validate = \think\facade\Validate::rule([
+					'image' => 'require|fileSize:' . $fileSize . '|fileExt:' . $fileExt,
+				]);
+				$file_check['image'] = $file;
+				if (!$validate->check($file_check)) {
+					return to_assign(1, $validate->getError());
+				}
+				
+				//获取对应的上传配置
+				$fs = \think\facade\Filesystem::disk('public');
+				$ext = $file->extension();
+				$chunkPath = $data['file_id'].'/'.$file->md5().($ext ? '.'.$ext : '');
+				//存储分片文件到指定路径
+				$savename = $fs->putFileAs( 'chunk', $file,$chunkPath);
+				if (!$savename) {
+					return json([
+						'code' => 1,
+						'msg' => '上传失败',
+						'data' => [],
+					]);
+				}
+				if (!$data['is_end']) {
+					$filepath = '';
+				} else {
+					//合并块文件
+					$fileUrl = '';
+					$chunkSaveDir = \think\facade\Filesystem::getDiskConfig('public');
+					$smallChunkDir = $chunkSaveDir['root'].'/chunk/'.$data['file_id'];
+					//获取已存储的属于源文件的所有分块文件 进行合并
+					if ($handle = opendir($smallChunkDir)) {
+						$chunkList = [];
+						$modifyTime = [];
+						while (false !== ($file = readdir($handle))) {
+							if ($file != "." && $file != "..") {
+								$temp['path'] = $smallChunkDir.'/'.$file;
+								$temp['modify'] = filemtime($smallChunkDir.'/'.$file);
+								$chunkList[] = $temp;
+								$modifyTime[] = $temp['modify'];
+							}
+						}
+						//对分块文件进行排序
+						array_multisort($modifyTime,SORT_ASC,$chunkList);
+						$saveDir = \think\facade\Filesystem::getDiskConfig('public');
+						$saveName = md5($data['file_id'].$data['file_name']).'.'.$data['file_extension'];
+						$newPath = $saveDir['root'].'/'.date('Ym').'/'.$saveName;
+						if (!file_exists($saveDir['root'].'/'.date('Ym'))) {
+							mkdir($saveDir['root'].'/'.date('Ym'),0777,true);
+						}
+						$newFileHandle = fopen($newPath,'a+b');
+						foreach ($chunkList as $item) {
+							fwrite($newFileHandle,file_get_contents($item['path']));
+							unlink($item['path']);
+						}
+						rmdir($smallChunkDir);
+						//将合并后的文件存储到指定路径
+						$fileUrl = $saveDir['url'].'/'.date('Ym').'/'.$saveName;
+						fclose($newFileHandle);
+						closedir($handle);
+					} else {
+						return json([
+							'code' => 1,
+							'msg' => '目录：'.$chunkSaveDir['root'].'/chunk/'.$data['file_id'].'不存在',
+							'data' => [],
+						]);
+					}
+					$filepath = $fileUrl;
+				}
+				$res=[];
+				//合并流程结束
+				if ($filepath!='') {
+					$fileinfo = [];
+					$fileinfo['filepath'] = $filepath;
+					$fileinfo['name'] = $data['file_name'];
+					$fileinfo['fileext'] = $data['file_extension'];
+					$fileinfo['filesize'] = $data['file_size'];
+					$fileinfo['filename'] = date('Ym').'/'.$saveName;
+					$fileinfo['sha1'] = $data['file_id'];
+					$fileinfo['md5'] = $data['file_id'];
+					$fileinfo['module'] = \think\facade\App::initialize()->http->getName();
+					$fileinfo['action'] = app('request')->action();
+					$fileinfo['uploadip'] = app('request')->ip();
+					$fileinfo['create_time'] = time();
+					$fileinfo['user_id'] = get_login_admin('id') ? get_login_admin('id') : 0;
+					if ($fileinfo['module'] = 'admin') {
+						//通过后台上传的文件直接审核通过
+						$fileinfo['status'] = 1;
+						$fileinfo['admin_id'] = $fileinfo['user_id'];
+						$fileinfo['audit_time'] = time();
+					}
+					$fileinfo['use'] = 'big';
+					$res['id'] = Db::name('file')->insertGetId($fileinfo);
+					$res['filepath'] = $fileinfo['filepath'];
+					$res['name'] = $fileinfo['name'];
+					$res['filename'] = $fileinfo['filename'];
+					$res['filesize'] = $fileinfo['filesize'];
+					$res['fileext'] = $fileinfo['fileext'];
+					add_log('upload', $fileinfo['user_id'], $fileinfo);
+				} 
+				return to_assign(0, '上传成功', $res);
+			}
+		}
+		else{
+			return to_assign(1, '非法请求', $res);
+		}
+	}
+
+	//取消上传，删除临时文件
+	public function clearChunk() {
+		if ($this->request->isPost()) {
+			$param = get_params();
+			$saveDir = \think\facade\Filesystem::getDiskConfig('public');
+			$smallChunkDir = $saveDir['root'].'/chunk/'.$param['file_id'];
+			if(!is_dir($smallChunkDir)){
+				return to_assign(0, '上传的临时文件已删除');
+			}
+			//获取已存储的属于源文件的所有分块文件
+			if ($handle = opendir($smallChunkDir)) {
+				while (false !== ($file = readdir($handle))) {
+					if ($file != "." && $file != "..") {
+						$temp['path'] = $smallChunkDir.'/'.$file;
+						unlink($temp['path']);
+					}
+				}
+				rmdir($smallChunkDir);
+				closedir($handle);
+				return to_assign(0, '已取消上传');
+			}
+		}
+	}
+ 
+    //附件重命名
+    public function file_edit()
+    {
+        $param = get_params();
+		if (Db::name('File')->where('id',$param['id'])->update(['name'=>$param['title']]) !== false) {
+			add_log('edit', $param['id'], $param,'文件名称');
+			return to_assign(0, "操作成功");
+		} else {
+			return to_assign(1, "操作失败");
+		}
+    }
+
+    //获取编辑记录
+    public function load_log()
+    {
+        $param = get_params();
+		$log = new EditLog();
+		$list = $log->datalist($param);
+        return to_assign(0, '', $list);
+    }
+
+
+    //清空缓存
+    public function cache_clear()
+    {
+        \think\facade\Cache::clear();
+        return to_assign(0, '系统缓存已清空');
+    }
+
+    // 测试邮件发送
+    public function email_test()
+    {
+        $sender = get_params('email');
+        //检查是否邮箱格式
+        if (!is_email($sender)) {
+            return to_assign(1, '测试邮箱码格式有误');
+        }
+        $email_config = \think\facade\Db::name('config')->where('name', 'email')->find();
+        $config = unserialize($email_config['content']);
+        $content = $config['template'];
+        //所有项目必须填写
+        if (empty($config['smtp']) || empty($config['smtp_port']) || empty($config['smtp_user']) || empty($config['smtp_pwd'])) {
+            return to_assign(1, '请完善邮件配置信息');
+        }
+
+        $send = send_email($sender, '测试邮件', $content);
+        if ($send) {
+            return to_assign(0, '邮件发送成功');
+        } else {
+            return to_assign(1, '邮件发送失败');
+        }
+    }
+	
+	//获取未读消息
+	public function get_msg()
+	{
+		$msg_map[] = ['to_uid', '=', $this->uid];
+		$msg_map[] = ['read_time', '=', 0];
+		$msg_map[] = ['delete_time', '=', 0];
+		$msg_count = Db::name('Msg')->where($msg_map)->count();
+		return to_assign(0, 'ok', $msg_count);
+	}
+
+    //获取部门
+    public function get_department()
+    {
+        $department = get_department();
+        return to_assign(0, '', $department);
+    }
+
+    //获取部门树形节点列表，用于tree前端组件
+    public function get_department_tree()
+    {
+        $department = get_department();
+        $list = get_tree($department);
+        $data['trees'] = $list;
+        return json($data);
+    }
+	
+    //获取下属部门树形节点列表，用于tree前端组件
+    public function get_department_tree_sub()
+    {
+		if($this->uid==1){
+			$department = get_department();
+		}
+		else{
+			$dids = get_leader_departments($this->uid);
+			$department = Db::name('Department')->order('sort desc,id asc')->where([['status','=',1],['id','in',$dids]])->select()->toArray();
+		}
+        $list = get_tree($department,$department[0]['pid']);
+        $data['trees'] = $list;
+        return json($data);
+    }
+	
+    //获取部门树形节点列表，用于X-select前端组件
+    public function get_department_select()
+    {
+		$keyword = get_params('keyword');
+		$selected = [];
+		if(!empty($keyword)){
+			$selected = explode(",",$keyword);
+		}		
+        $department = get_department();
+        $list = get_select_tree($department, 0,0,$selected);
+		return to_assign(0, '',$list);
+    }
+
+    //获取所有员工，did>0时时获取部门员工,用于picker签单组件
+    public function get_employee($did = 0)
+    {
+		$where=[];
+		$whereOr=[];
+		if (!empty($did)) {
+			$admin_array = Db::name('DepartmentAdmin')->where('department_id',$did)->column('admin_id');
+			$map1=[
+				['a.id','in',$admin_array],
+			];
+			$map2=[
+				['a.did', '=', $did],
+			];
+			$whereOr =[$map1,$map2];
+		}		
+		$where[] = ['a.id', '>', 1];
+		$where[] = ['a.status', '=', 1];
+		$employee = Db::name('admin')
+			->field('a.id,a.did,a.position_id,a.mobile,a.name,a.nickname,a.sex,a.status,a.thumb,a.username,d.title as department')
+            ->alias('a')
+			->join('Position p', 'p.id = a.position_id','left')
+			->join('Department d', 'a.did = d.id','left')
+			->where($where)
+			->where(function ($query) use($whereOr) {
+				if (!empty($whereOr)){
+					$query->whereOr($whereOr);
+				}
+			})
+			->group('a.id')
+			->order('a.id desc')
+			->select();
+        return to_assign(0, '', $employee);
+    }
+	
+   //获取所有下属员工，did>0时时获取部门员工,用于picker签单组件
+    public function get_employee_sub($did = 0)
+    {
+		$where=[];
+		$whereOr=[];
+		if (!empty($did)) {
+			$admin_array = Db::name('DepartmentAdmin')->where('department_id',$did)->column('admin_id');
+			$map1=[
+				['a.id','in',$admin_array],
+			];
+			$map2=[
+				['a.did', '=', $did],
+			];
+			$whereOr =[$map1,$map2];
+		}
+		else{
+			if($this->uid>1){
+				$dids = get_leader_departments($this->uid);
+				$where[] = ['a.did', 'in', $dids];
+			}
+		}
+		$where[] = ['a.id', '>', 1];
+		$where[] = ['a.status', '=', 1];
+		$employee = Db::name('admin')
+			->field('a.id,a.did,a.position_id,a.mobile,a.name,a.nickname,a.sex,a.status,a.thumb,a.username,d.title as department')
+            ->alias('a')
+			->join('Position p', 'p.id = a.position_id','left')
+			->join('Department d', 'a.did = d.id','left')
+			->where($where)
+			->where(function ($query) use($whereOr) {
+				if (!empty($whereOr)){
+					$query->whereOr($whereOr);
+				}
+			})
+			->group('a.id')
+			->order('a.id desc')
+			->select();
+        return to_assign(0, '', $employee);
+    }
+	
+    //获取所有员工
+    public function get_personnel()
+    {       
+		$param = get_params();
+		$where[] = ['a.status', '=', 1];
+		$where[] = ['a.id', '>', 1];
+		if (!empty($param['keywords'])) {
+			$where[] = ['a.name', 'like', '%' . $param['keywords'] . '%'];
+		}
+		if(!empty($param['ids'])){
+			//排除某些员工
+			$where[] = ['a.id', 'notin', $param['ids']];
+		}
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+        $list = Db::name('admin')
+            ->field('a.id,a.did,a.position_id,a.mobile,a.name,a.nickname,a.sex,a.status,a.thumb,a.username,d.title as department')
+            ->alias('a')
+            ->join('Department d', 'a.did = d.id')
+            ->where($where)
+			->order('a.id desc')
+			->paginate(['list_rows'=> $rows]);
+		return table_assign(0, '', $list);
+    }	
+	
+    //获取所有员工，用于X-select前端组件,did>0时时获取部门员工
+    public function get_employee_select($did=0)
+    {
+		$keyword = get_params('keyword');
+		$selected = [];
+		if(!empty($keyword)){
+			$selected = explode(",",$keyword);
+		}
+		if($did == 0){
+			$employee = Db::name('admin')->field('id as value,name')->where(['status' => 1])->select()->toArray();		
+		}
+		else{
+			$employee = get_department_employee($did);
+		}
+		$list=[];
+		foreach($employee as $k => $v){
+			$select = '';
+			if(in_array($v['id'],$selected)){
+				$select = 'selected';
+			}
+			$list[]=[
+				'value'=>$v['id'],
+				'name'=>$v['name'],
+				'selected'=>$select
+			];
+		}
+        return to_assign(0, '', $list);
+    }	
+
+
+    //获取某部门的负责人
+    public function get_department_leader($uid=0,$pid=0)
+    {
+        $leaders = get_department_leader($uid,$pid);
+        return to_assign(0, '', $leaders);
+    }
+
+    //获取职位
+    public function get_position()
+    {
+        $position = Db::name('Position')->field('id,title')->where([['status', '=', 1], ['id', '>', 1]])->select();
+        return to_assign(0, '', $position);
+    }
+	
+	//获取消息模板
+    public function get_template()
+    {
+		$param = get_params();
+		if (!empty($param['keywords'])) {
+			$where[] = ['title', 'like', '%' . $param['keywords'] . '%'];
+		}
+		$where[] = ['status', '=', 1];
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];		
+        $list = Db::name('Template')->field('id,title')->where($where)->paginate(['list_rows'=> $rows]);;
+		return table_assign(0, '', $list);
+    }
+	
+	//读取报销类型
+	function get_expense_cate()
+	{
+		$cate = get_base_data('ExpenseCate');
+		return to_assign(0, '', $cate);
+	}
+
+	//读取费用类型
+	function get_cost_cate()
+	{
+		$cate = get_base_data('CostCate');
+		return to_assign(0, '', $cate);
+	}
+
+	//读取印章类型
+	function get_seal_cate()
+	{
+		$cate = get_base_data('SealCate');
+		return to_assign(0, '', $cate);
+	}
+
+	//读取车辆类型
+	function get_car_cate()
+	{
+		$cate = get_base_data('CarCate');
+		return to_assign(0, '', $cate);
+	}
+
+	//读取企业主体
+	function get_subject()
+	{
+		$subject = get_base_data('Subject');
+		return to_assign(0, '', $subject);
+	}
+
+	//读取行业类型
+	function get_industry()
+	{
+		$industry = get_base_data('Industry');
+		return to_assign(0, '', $industry);
+	}
+
+	//读取服务类型
+	function get_services()
+	{
+		$services = get_base_data('Services');
+		return to_assign(0, '', $services);
+	}
+	
+	//获取工作类型列表
+    public function get_work_cate()
+    {
+        $cate = get_base_data('WorkCate');
+        return to_assign(0, '', $cate);
+    }
+}
diff --git a/app/api/controller/Office.php b/app/api/controller/Office.php
new file mode 100644
index 0000000000000000000000000000000000000000..2758b1cf84376c77555bfb6178cf8bc45be54a86
--- /dev/null
+++ b/app/api/controller/Office.php
@@ -0,0 +1,93 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+declare (strict_types = 1);
+namespace app\api\controller;
+
+use app\api\BaseController;
+use think\facade\Db;
+use Firebase\JWT\JWT;
+
+
+class Office extends BaseController
+{	
+    public function view($id=0,$mode='edit')
+    {
+		$file = Db::name('File')->where('id',$id)->find();
+		if(empty($file)){
+			return view('../../base/view/common/filetemplate');
+		}
+		$path = $file['filepath'];
+		$title = $file['name'];		
+		$extension = pathinfo($path, PATHINFO_EXTENSION);
+		$filename = pathinfo($path, PATHINFO_FILENAME);
+		$office_config = get_system_config('other');
+		//$directory = substr($path, 0, 16);
+		//$key = set_salt(10).str_replace("/", "T", $directory).$filename.'.'.$extension;
+		$key = "key".$file['audit_time']."T".$id;
+		$domain = $_SERVER['HTTP_HOST'];
+		$url = "http://".$domain.$path;
+		$callbackUrl = "http://".$domain."/office.php";
+		$admin = Db::name('Admin')->where('id',$this->uid)->find();		
+		$config = [
+			"document" => [
+				"url" => $url,
+				"key" => $key,
+				"permissions" => [
+					"chat"=> true,
+					"comment"=> true,
+					"copy"=> true,
+					"deleteCommentAuthorOnly"=> false,
+					"download"=> true,
+					"edit"=> true,
+					"editCommentAuthorOnly"=> false,
+					"fillForms"=> true,
+					"modifyContentControl"=> true,
+					"modifyFilter"=> true,
+					"print"=>true,
+					"protect"=> true,
+					"review"=> true
+				]
+			],
+			"editorConfig"=>[
+				"mode" => $mode,//view,edit
+				"forcesave"=>true,
+				"lang"=>"zh-CN",
+				"createUrl" => '',
+				"customization"=>[
+					"autosave"=>true,//是否自动保存
+					"comments"=>false,
+					"help"=>false
+				],
+				"user" => [ 
+					"id" => $admin['id'],
+					"name" => $admin['name']
+				],
+				"callbackUrl"=>$callbackUrl
+			]
+		];
+		$token = JWT::encode($config, $office_config['token'], 'HS256'); //输出Token  默认'HS256'
+		return View('',['token'=>$token,'key'=>$key,'office'=>$office_config,'mode'=>$mode,'domain'=>$domain,'url'=>$url,'title'=>$title,'callbackUrl'=>$callbackUrl,'admin'=>$admin]);    
+    }
+	
+    public function officeapps($id=0,$mode='edit')
+    {
+        $file = Db::name('File')->where('id',$id)->find();
+		if(empty($file)){
+			return view('../../base/view/common/filetemplate');
+		}
+		$path = $file['filepath'];
+		$domain = $_SERVER['HTTP_HOST'];
+		$url = "//".$domain.$path;
+        return View('',['url'=>$url]); 
+    }
+}
diff --git a/app/api/event.php b/app/api/event.php
new file mode 100644
index 0000000000000000000000000000000000000000..afe59182c6aa72dfdf36da12c258d8e48725b43e
--- /dev/null
+++ b/app/api/event.php
@@ -0,0 +1,8 @@
+<?php
+return [
+	'listen'    => [
+        //注册监听类
+        'SendMessage' => ['app\listener\SendMessage'],
+    ],
+    //'subscribe' => ['app\subscribe\Message'],
+];
diff --git a/app/api/middleware.php b/app/api/middleware.php
new file mode 100644
index 0000000000000000000000000000000000000000..dce057fb1d7e29f2958f887832d5155ce4cf70b5
--- /dev/null
+++ b/app/api/middleware.php
@@ -0,0 +1,8 @@
+<?php
+// 这是系统自动生成的middleware定义文件
+return [
+	//开启session中间件
+	//'think\middleware\SessionInit',
+	//验证勾股cms是否完成安装
+	\app\home\middleware\Install::class,
+];
\ No newline at end of file
diff --git a/app/api/middleware/Auth.php b/app/api/middleware/Auth.php
new file mode 100644
index 0000000000000000000000000000000000000000..5b89c20b85bd269b295ae2ababe16840f62dca59
--- /dev/null
+++ b/app/api/middleware/Auth.php
@@ -0,0 +1,61 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\api\middleware;
+
+use Firebase\JWT\JWT;
+use Firebase\JWT\Key;
+use think\facade\Request;
+use think\Response;
+
+class Auth
+{
+    public function handle($request, \Closure $next)
+    {
+        $token = Request::header('Token');
+        if ($token) {
+            if (count(explode('.', $token)) != 3) {
+                return json(['code'=>404,'msg'=>'非法请求']);
+            }
+			$config = get_system_config('token');
+			//var_dump($config);exit;
+            try {
+				JWT::$leeway = 60;//当前时间减去60，把时间留点余地
+					$decoded = JWT::decode($token, new Key($config['secrect'], 'HS256')); //HS256方式，这里要和签发的时候对应
+					//return (array)$decoded;
+					$decoded_array = json_decode(json_encode($decoded),TRUE);
+					$jwt_data = $decoded_array['data'];
+					//$request->uid = $jwt_data['userid'];
+					define('JWT_UID', $jwt_data['userid']);
+					$response = $next($request);
+					return $response;
+					//return $next($request);
+				} catch(\Firebase\JWT\SignatureInvalidException $e) {  //签名不正确
+					return json(['code'=>403,'msg'=>'签名错误']);
+				}catch(\Firebase\JWT\BeforeValidException $e) {  // 签名在某个时间点之后才能用
+					return json(['code'=>401,'msg'=>'token失效']);
+				}catch(\Firebase\JWT\ExpiredException $e) {  // token过期
+					return json(['code'=>401,'msg'=>'token已过期']);
+				}catch(Exception $e) {  //其他错误
+					return json(['code'=>404,'msg'=>'非法请求']);
+				}catch(\UnexpectedValueException $e) {  //其他错误
+					return json(['code'=>404,'msg'=>'非法请求']);
+				} catch(\DomainException $e) {  //其他错误
+					return json(['code'=>404,'msg'=>'非法请求']);
+				}
+        } else {
+            return json(['code'=>404,'msg'=>'token不能为空']);
+        }
+        return $next($request);
+    }
+}
diff --git a/app/api/model/Comment.php b/app/api/model/Comment.php
new file mode 100644
index 0000000000000000000000000000000000000000..3846969a87e7bbf35ff1e498814903272286604e
--- /dev/null
+++ b/app/api/model/Comment.php
@@ -0,0 +1,69 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+namespace app\api\model;
+use think\facade\Db;
+use think\Model;
+
+class Comment extends Model
+{
+    //列表
+    function datalist($param=[],$where=[]) {
+        $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->order($order)
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key) use($param){
+				$item['create_times'] = time_trans($item['create_time']);
+				if($item['update_time']>0){
+					$item['update_times'] = '，最后编辑时间：'.time_trans($item['update_time']);
+				}
+				else{
+					$item['update_times'] = '';
+				}
+				$item['thumb'] = Db::name('Admin')->where(['id' => $item['admin_id']])->value('thumb');
+				$item['name'] = Db::name('Admin')->where(['id' => $item['admin_id']])->value('name');
+				$to_names = Db::name('Admin')->where([['id', 'in', $item['to_uids']]])->column('name');
+				if (empty($to_names)) {
+                    $item['to_names'] = '-';
+                } else {
+                    $item['to_names'] = implode(',', $to_names);
+                }
+			    $item['read'] = 0;
+				if($item['admin_id'] == $param['admin_id']){
+					$item['read'] = 2;
+				}
+				else{
+					$count = Db::name('CommentRead')->where(['comment_id' => $item['id'],'admin_id' => $param['admin_id']])->count();
+					if($count>0){
+						$item['read'] = 1;
+					}
+				}
+				if($item['pid']>0){
+					$pcomment = Db::name('Comment')->where('id','=',$item['pid'])->find();
+					$padmin_id =$pcomment['admin_id'];
+					$item['padmin'] =Db::name('Admin')->where('id','=',$padmin_id)->value('name');
+					$item['ptimes'] =time_trans($pcomment['create_time']);
+					$item['pcontent'] = $pcomment['content'];
+				}
+				return $item;
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+}
diff --git a/app/api/model/EditLog.php b/app/api/model/EditLog.php
new file mode 100644
index 0000000000000000000000000000000000000000..c421fd16344f2b37b975c5f73390a5d404c0783f
--- /dev/null
+++ b/app/api/model/EditLog.php
@@ -0,0 +1,279 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\api\model;
+use think\model;
+use think\facade\Db;
+class EditLog extends Model
+{
+	 public static $COMPILE = [
+		//'title'=>'字段名称','action'=>'操作行为','table'=>'关联数据表','table_field'=>'关联数据表字段','table_more'=>'0单选数据，1多选数据','enumerate'=>[枚举数据],'time'=>'时间格式','suffix'=>'后缀'
+		'Customer'=>[
+			  'name'=>['title'=>'客户名称','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'source_id'=>['title'=>'客户来源','action'=>'','table'=>'CustomerSource','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'grade_id'=>['title'=>'客户等级','action'=>'','table'=>'CustomerGrade','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'industry_id'=>['title'=>'所属行业','action'=>'','table'=>'CustomerIndustry','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'services_id'=>['title'=>'客户意向','action'=>'','table'=>'CustomerServices','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'address'=>['title'=>'客户地址','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'customer_status'=>['title'=>'客户状态','action'=>'','table'=>'BasicCustomer','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'intent_status'=>['title'=>'意向状态','action'=>'','table'=>'BasicCustomer','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'belong_uid'=>['title'=>'所属人','action'=>'','table'=>'Admin','table_field'=>'name','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'belong_did'=>['title'=>'所属部门','action'=>'','table'=>'Department','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'share_ids'=>['title'=>'共享人员','action'=>'','table'=>'Admin','table_field'=>'name','table_more'=>'1','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'content'=>['title'=>'客户描述','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'market'=>['title'=>'主要经营业务','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'remark'=>['title'=>'备注信息','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'tax_bank'=>['title'=>'开户银行','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'tax_banksn'=>['title'=>'银行帐号','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'tax_num'=>['title'=>'纳税人识别号','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'tax_mobile'=>['title'=>'开票电话','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'tax_address'=>['title'=>'开票地址','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'is_lock'=>['title'=>'锁定状态','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>['未锁','已锁'],'time'=>'','suffix'=>'']
+		],
+		'Contract'=>[
+			  'pid'=>['title'=>'母协议','action'=>'','table'=>'Contract','table_field'=>'name','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'name'=>['title'=>'合同名称','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'code'=>['title'=>'合同编号','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'cate_id'=>['title'=>'合同类别','action'=>'','table'=>'ContractCate','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'subject_id'=>['title'=>'签约主体','action'=>'','table'=>'Enterprise','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'customer_id'=>['title'=>'签约客户','action'=>'','table'=>'Customer','table_field'=>'name','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'contact_name'=>['title'=>'客户代表','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'contact_mobile'=>['title'=>'客户电话','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'contact_address'=>['title'=>'客户地址','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'prepared_uid'=>['title'=>'合同制定人','action'=>'','table'=>'Admin','table_field'=>'name','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'sign_uid'=>['title'=>'合同签订人','action'=>'','table'=>'Admin','table_field'=>'name','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'keeper_uid'=>['title'=>'合同保管人','action'=>'','table'=>'Admin','table_field'=>'name','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'share_ids'=>['title'=>'共享人员','action'=>'','table'=>'Admin','table_field'=>'name','table_more'=>'1','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'did'=>['title'=>'合同所属部门','action'=>'','table'=>'Department','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			 // 'content'=>['title'=>'合同内容','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'remark'=>['title'=>'备注信息','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'types'=>['title'=>'合同性质','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>['未设置','普通合同','商品合同','服务合同'],'time'=>'','suffix'=>''],
+			  'start_time'=>['title'=>'合同生效时间','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'Y-m-d','suffix'=>''],
+			  'end_time'=>['title'=>'合同失效时间','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'Y-m-d','suffix'=>''],
+			  'sign_time'=>['title'=>'合同签订时间','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'Y-m-d','suffix'=>''],
+			  'cost'=>['title'=>'合同金额','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'tax'=>['title'=>'税点','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'is_tax'=>['title'=>'是否含税','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>['未含税','含税'],'time'=>'','suffix'=>'']
+		],
+		'Purchase'=>[
+			  'pid'=>['title'=>'母协议','action'=>'','table'=>'Contract','table_field'=>'name','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'name'=>['title'=>'合同名称','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'code'=>['title'=>'合同编号','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'cate_id'=>['title'=>'合同类别','action'=>'','table'=>'ContractCate','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'subject_id'=>['title'=>'签约主体','action'=>'','table'=>'Enterprise','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'supplier_id'=>['title'=>'签约供应商','action'=>'','table'=>'Supplier','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'contact_name'=>['title'=>'供应商代表','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'contact_mobile'=>['title'=>'供应商电话','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'contact_address'=>['title'=>'供应商地址','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'prepared_uid'=>['title'=>'合同制定人','action'=>'','table'=>'Admin','table_field'=>'name','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'sign_uid'=>['title'=>'合同签订人','action'=>'','table'=>'Admin','table_field'=>'name','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'keeper_uid'=>['title'=>'合同保管人','action'=>'','table'=>'Admin','table_field'=>'name','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'share_ids'=>['title'=>'共享人员','action'=>'','table'=>'Admin','table_field'=>'name','table_more'=>'1','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'did'=>['title'=>'合同所属部门','action'=>'','table'=>'Department','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  //'content'=>['title'=>'合同内容','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'remark'=>['title'=>'备注信息','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'types'=>['title'=>'合同性质','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>['未设置','普通采购','物品合同','服务采购'],'time'=>'','suffix'=>''],
+			  'start_time'=>['title'=>'合同生效时间','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'Y-m-d','suffix'=>''],
+			  'end_time'=>['title'=>'合同失效时间','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'Y-m-d','suffix'=>''],
+			  'sign_time'=>['title'=>'合同签订时间','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'Y-m-d','suffix'=>''],
+			  'cost'=>['title'=>'合同金额','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'tax'=>['title'=>'税点','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'is_tax'=>['title'=>'是否含税','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>['未含税','含税'],'time'=>'','suffix'=>'']
+		],
+		'Project'=>[
+			  'name'=>['title'=>'项目名称','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'code'=>['title'=>'项目编号','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'cate_id'=>['title'=>'项目类别','action'=>'','table'=>'ProjectCate','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'customer_id'=>['title'=>'关联客户','action'=>'','table'=>'Customer','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'contract_id'=>['title'=>'关联合同','action'=>'','table'=>'Contract','table_field'=>'name','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'director_uid'=>['title'=>'项目经理','action'=>'','table'=>'Admin','table_field'=>'name','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'did'=>['title'=>'项目所属部门','action'=>'','table'=>'Department','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'content'=>['title'=>'项目描述','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'start_time'=>['title'=>'项目开始时间','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'Y-m-d','suffix'=>''],
+			  'end_time'=>['title'=>'项目结束时间','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'Y-m-d','suffix'=>''],
+			  'amount'=>['title'=>'项目金额','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'status'=>['title'=>'项目状态','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>['未设置','未开始','进行中','已完成','已关闭'],'time'=>'','suffix'=>'']
+		],
+		'Task'=>[
+			  'title'=>['title'=>'任务主题','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'pid'=>['title'=>'父级任务','action'=>'','table'=>'ProjectTask','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'before_task'=>['title'=>'前置任务','action'=>'','table'=>'ProjectTask','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'project_id'=>['title'=>'关联项目','action'=>'','table'=>'Project','table_field'=>'name','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'work_id'=>['title'=>'工作类型','action'=>'','table'=>'WorkCate','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'step_id'=>['title'=>'项目阶段','action'=>'','table'=>'ProjectStep','table_field'=>'name','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'director_uid'=>['title'=>'负责人','action'=>'','table'=>'Admin','table_field'=>'name','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'did'=>['title'=>'任务所属部门','action'=>'','table'=>'Department','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'assist_admin_ids'=>['title'=>'协助人员','action'=>'','table'=>'Admin','table_field'=>'name','table_more'=>'1','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'start_time'=>['title'=>'项目开始时间','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'Y-m-d','suffix'=>''],
+			  'end_time'=>['title'=>'预计结束时间','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'Y-m-d','suffix'=>''],
+			  'over_time'=>['title'=>'实际结束时间','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'Y-m-d','suffix'=>''],
+			  'plan_hours'=>['title'=>'预估工时','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''],
+			  'done_ratio'=>['title'=>'完成进度','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>'%'],
+			  'priority'=>['title'=>'优先级','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>['未设置','低','中','高','紧急'],'time'=>'','suffix'=>''],
+			  'status'=>['title'=>'任务状态','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>['未设置','待办的','进行中','已完成','已拒绝','已关闭'],'time'=>'','suffix'=>'']
+		]
+	 ];
+
+	 
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($param=[])
+    {
+        $page = empty($param['page']) ?1 : intval($param['page']);;
+        $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$name=$param['name'];
+		$action_id=$param['action_id'];
+        try {
+            $list = self::field('a.*, u.name as admin_name,u.thumb')
+			->where(['a.name'=>$name,'a.action_id'=>$action_id])
+			->alias('a')
+			->join('Admin u','u.id = a.admin_id')
+			->order('a.create_time desc')
+			->page($page, $rows)
+            ->select()->toArray();
+			
+			$field = self::$COMPILE[$name];
+			foreach ($list as $k => &$v) {
+				$v['action'] = '修改';
+				$v['times'] = time_trans(strtotime($v['create_time']));
+				if($v['field'] == 'new'){
+					continue;
+				}
+				$item = $field[$v['field']];
+				if(isset($item)){
+					$v['field_name'] = $item['title'];
+					if(!empty($item['action'])){
+						$v['action'] = $item['action'];
+					}
+					if(!empty($item['table']) && !empty($item['table_field'])){
+						if(!empty($item['table_more'])){
+							$v['old_content'] = Db::name($item['table'])->where('id',$v['old_content'])->value($item['table_field']);
+							$v['new_content'] = Db::name($item['table'])->where('id',$v['new_content'])->value($item['table_field']);
+						}else{
+							$old_content = Db::name($item['table'])->where('id','in',$v['old_content'])->column($item['table_field']);
+							$new_content = Db::name($item['table'])->where('id','in',$v['new_content'])->column($item['table_field']);
+							if(!empty($old_content)){
+								$v['old_content'] = implode(',',$old_content);
+							}
+							if(!empty($new_content)){
+								$v['new_content'] = implode(',',$new_content);
+							}
+						}						
+					}
+					if(!empty($item['enumerate'])){
+						$v['old_content'] = $item['enumerate'][$v['old_content']];
+						$v['new_content'] = $item['enumerate'][$v['new_content']];
+					}
+					if(!empty($item['time'])){
+						$v['old_content'] = to_date($v['old_content'],$item['time']);
+						$v['new_content'] = to_date($v['new_content'],$item['time']);
+					}
+					if ($v['old_content'] == '' || $v['old_content'] == 0 || $v['old_content'] == null) {
+						$v['old_content'] = '未设置';
+					}
+					else{
+						$v['old_content'] = $v['old_content'].$item['suffix'];
+					}
+					if ($v['new_content'] == '' || $v['new_content'] == 0 || $v['new_content'] == null) {
+						$v['new_content'] = '未设置';
+					}
+					else{
+						$v['new_content'] = $v['new_content'].$item['suffix'];
+					}
+				}
+			}
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 插入创建日志
+    */
+	public function add($name,$action_id)
+	{
+		try {
+			$session_admin = get_config('app.session_admin');
+			$uid = \think\facade\Session::get($session_admin);
+			$log_data = [
+				'name' => $name,
+				'admin_id' => $uid,
+				'field' => 'new',
+				'action_id' => $action_id,
+				'create_time' => time()
+			];
+			self::strict(false)->field(true)->insert($log_data);
+		} catch(\Exception $e) {
+			return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+		}
+	}
+    /**
+    * 插入编辑日志
+    */
+    public function edit($name,$action_id,$new,$old)
+    {
+		$log_data = [];
+		$array = self::$COMPILE[$name];
+		$key_array = array_keys($array);;
+		if(!empty($key_array)){
+			try {
+				$session_admin = get_config('app.session_admin');
+				$uid = \think\facade\Session::get($session_admin);
+				foreach ($new as $key => $value) {
+					if (in_array($key, $key_array)) {
+						if(isset($old[$key]) && ($old[$key]!=$value)){
+							$log_data[] = array(
+								'name' => $name,
+								'admin_id' => $uid,
+								'field' => $key,
+								'action_id' => $new['id'],
+								'old_content' => $old[$key],
+								'new_content' => $value,
+								'create_time' => time(),
+							);
+						}
+					}
+				}
+				self::strict(false)->field(true)->insertAll($log_data);
+			} catch(\Exception $e) {
+				return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+			}
+		}
+    }
+	
+    /**
+    * 插入删除日志
+    */
+	public function del($name,$action_id)
+	{
+		try {
+			$session_admin = get_config('app.session_admin');
+			$uid = \think\facade\Session::get($session_admin);
+			$log_data = [
+				'name' => $name,
+				'admin_id' => $uid,
+				'field' => 'delete',
+				'action_id' => $action_id,
+				'create_time' => time()
+			];
+			self::strict(false)->field(true)->insert($log_data);
+		} catch(\Exception $e) {
+			return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+		}
+	}
+}
+
diff --git a/app/api/view/office/officeapps.html b/app/api/view/office/officeapps.html
new file mode 100644
index 0000000000000000000000000000000000000000..3f8db87bbdfe02b6e30252b8c1a93c89537b9f8b
--- /dev/null
+++ b/app/api/view/office/officeapps.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+	<meta name="renderer" content="webkit">
+	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+	<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=0">
+	<link rel="mobile-prefetch" href=""/>
+	<title>文档信息</title>
+</head>
+<body style="width:100%;height:100vh; margin:0; padding:0">
+<iframe src="//view.officeapps.live.com/op/view.aspx?src={$url}" frameborder="0" align="left" width="100%" height="100%" scrolling="yes"></iframe>
+</body>
+</html>
\ No newline at end of file
diff --git a/app/api/view/office/view.html b/app/api/view/office/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..91ad1ab8be510e6222ba855e097514931d4157e8
--- /dev/null
+++ b/app/api/view/office/view.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+	<meta name="renderer" content="webkit">
+	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+	<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=0">
+	<link rel="mobile-prefetch" href=""/>
+	<title>文档信息</title>
+	<script type="text/javascript" src="{$office.onlyoffice}/web-apps/apps/api/documents/api.js"></script>
+</head>
+<body style="width:100%;height:100vh; margin:0; padding:0">
+<div id="placeholder"></div>
+<script type="text/javascript">
+const url = "{$url}";
+const word = ['djvu','doc','docm','docx','docxf','dot','dotm','dotx','epub','fb2','fodt','htm','html','mht','mhtml','odt','oform','ott','oxps','pdf','rtf','stw','sxw','txt','wps','wpt','xml','xps'];
+const cell = ['csv','et','ett','fods','ods','ots','sxc','xls','xlsb','xlsm','xlsx','xlt','xltm','xltx','xml'];
+const slide = ['dps','dpt','fodp','odp','otp','pot','potm','potx','pps','ppsm','ppsx','ppt','pptm','pptx','sxi'];
+
+let suffix = url.split('.').pop();
+let documentType = "word";
+if (cell.indexOf(suffix) !== -1) {
+	documentType = "cell";
+}
+if (slide.indexOf(suffix) !== -1) {
+	documentType = "slide";
+}
+new DocsAPI.DocEditor("placeholder", {
+	"type" : "desktop",
+	"documentType" : documentType,//word,cell,side
+	"document" : {
+		"title" : "{$title}",
+		"url" : url,
+		"key" : "{$key}",
+		//"fileType" : "doc",
+		"permissions" : {
+			"chat": true,
+			"comment": true,
+			"copy": true,
+			"deleteCommentAuthorOnly": false,
+			"download": true,
+			"edit": true,
+			"editCommentAuthorOnly": false,
+			"fillForms": true,
+			"modifyContentControl": true,
+			"modifyFilter": true,
+			"print": true,
+			"protect": true,
+			"review": true
+		}		
+	},
+	"editorConfig":{
+		"lang":"zh-CN",
+		"mode" : "{$mode}",//view,edit
+		"forcesave":true,
+		"createUrl" : "",
+		"customization": {
+			"autosave": true,//是否自动保存
+			"comments": false,
+			"help": false
+		},
+		"user" : { 
+			"id" : "{$admin.id}",
+			"name" :"{$admin.name}"
+		},
+		"callbackUrl":"{$callbackUrl}"
+	},
+	"token": "{$token}"
+});
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/app/base/BaseController.php b/app/base/BaseController.php
new file mode 100644
index 0000000000000000000000000000000000000000..b6d04a0ebcc851aafc193da5e873baf39e5d81b4
--- /dev/null
+++ b/app/base/BaseController.php
@@ -0,0 +1,158 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\base;
+
+use think\facade\Cache;
+use think\facade\Db;
+use think\facade\Request;
+use think\facade\Session;
+use think\facade\View;
+use systematic\Systematic;
+
+/**
+ * 控制器基础类
+ */
+abstract class BaseController
+{
+    /**
+     * 是否批量验证
+     * @var bool
+     */
+    protected $batchValidate = false;
+	
+    /**
+     * 分页数量
+     * @var string
+     */
+    protected $pageSize = 20;
+    /**
+     * 控制器中间件
+     * @var array
+     */
+    protected $middleware = [];
+    protected $module;
+    protected $controller;
+    protected $action;
+    protected $uid;
+    protected $did;
+    protected $pid;
+    /**
+     * 构造方法
+     * @access public
+     * @param  App  $app  应用对象
+     */
+	protected $model;
+    public function __construct()
+    {
+        $this->module = strtolower(app('http')->getName());
+        $this->controller = strtolower(Request::controller());
+        $this->action = strtolower(Request::action());
+        $this->uid = 0;
+        $this->did = 0;
+        $this->pid = 0;
+        // 控制器初始化
+        $this->initialize();
+    }
+    // 初始化
+    protected function initialize()
+    {
+        // 检测权限
+        $this->checkLogin();
+		//每页显示数据量
+        $this->pageSize = Request::param('limit', \think\facade\Config::get('app.page_size'));
+    }
+
+    /**
+     *验证用户登录
+     */
+    protected function checkLogin()
+    {
+        if ($this->controller !== 'login' && $this->controller !== 'captcha') {
+            $session_admin = get_config('app.session_admin');
+            if (!Session::has($session_admin)) {
+                if (request()->isAjax()) {
+                    return to_assign(404, '请先登录');
+                } else {
+                    redirect('/home/login/index.html')->send();
+                    exit;
+                }
+            } else {
+                $this->uid = Session::get($session_admin);
+				$login_admin = get_admin($this->uid);
+				$this->did = $login_admin['did'];
+				$this->pid = $login_admin['pid'];			
+				$is_lock = $login_admin['is_lock'];
+				$last_login_time = Db::name('Admin')->where(['id' => $this->uid])->value('last_login_time');
+				$timeDiff = time() - $last_login_time;
+				// 如果超过10小时（36000秒），则用户需要重新登录
+				if ($timeDiff > 36000) {
+					Session::delete($session_admin);
+					redirect('/home/login/index.html')->send();
+                    exit;
+				}
+				Db::name('Admin')->where(['id' => $this->uid])->update(['last_login_time' => time()]);
+				if($is_lock==1){
+					redirect('/home/login/lock.html')->send();
+					exit;
+				}
+	            View::assign('login_admin', $login_admin);
+				$not_check=['index','leaves','outs','overtimes','trips','message'];
+                // 验证用户访问权限
+                if ($this->module == 'home' && in_array($this->controller, $not_check)) {
+					return true;
+				}
+				else{
+					$regPwd = $login_admin['reg_pwd'];
+					if($regPwd!==''){
+						redirect('/home/index/edit_password.html')->send();
+						exit;
+					}
+                    if (!$this->checkAuth()) {
+                        if (request()->isAjax()) {
+                            return to_assign(405, '你没有权限,请联系管理员或者人事部');
+                        } else {
+							redirect('/home/index/role')->send();
+							exit;
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 验证用户访问权限
+     * @DateTime 2020-12-21
+     * @param    string $controller 当前访问控制器
+     * @param    string $action 当前访问方法
+     * @return   [type]
+     */
+    protected function checkAuth()
+    {
+        //Cache::delete('RulesSrc' . $uid);
+		$uid = $this->uid;
+		$GOUGU = new Systematic();
+        $GOUGU->auth($uid);
+		$auth_list_all = Cache::get('RulesSrc0');
+        $auth_list = Cache::get('RulesSrc' . $uid);
+        $pathUrl = $this->module . '/' . $this->controller . '/' . $this->action;
+        if (!in_array($pathUrl, $auth_list)) {
+            return false;
+        } else {
+            return true;
+        }
+    }
+}
diff --git a/app/base/view/common/base.html b/app/base/view/common/base.html
new file mode 100644
index 0000000000000000000000000000000000000000..f9ba8e8504884e9918e85b2d7663590b54afab68
--- /dev/null
+++ b/app/base/view/common/base.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html lang="zh">
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+	<meta name="renderer" content="webkit"/>
+	<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
+	<meta name="viewport" content="width=device-width, initial-scale=1">
+{block name="meta"}
+	<link rel="mobile-prefetch" href=""/>
+{/block}
+{block name="title"}
+	<title>{:get_system_config('web','admin_title')}</title>		
+{/block}
+{block name="keywords"}
+	<meta name="keywords" content="{:get_system_config('web','keywords')}"/>
+	<meta name="description" content="{:get_system_config('web','desc')}"/>
+{/block}
+{block name="css"}
+	<link rel="stylesheet" href="{__GOUGU__}/gougu/css/gougu.css?v={:get_system_config('system','version')}" media="all">
+{/block}
+{block name="style"}{/block}
+<script>
+	const login_admin={$login_admin.id};
+</script>
+{block name="js"}{/block}
+</head>
+<body class="main-body">
+	<!-- 主体 -->
+	{block name="body"}{/block}
+	<!-- /主体 -->
+
+	<!-- 底部 -->
+	{block name="footer"}{/block}
+	<!-- /底部 -->
+	
+	<!-- 脚本 -->
+	{block name="script"}{/block}
+	<!-- /脚本 -->
+	<script src="{__GOUGU__}/layui/layui.js"></script>
+	<script src="{__GOUGU__}/gougu/gouguInit.js?v={:get_system_config('system','version')}"></script>
+	
+	<!-- 版权标识 -->
+	<!-- 
+	+------------------------------------------------------------------------------------------
+	勾股OA系统开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
+	+------------------------------------------------------------------------------------------
+	如需去除版权标识使用的，请微信(hdm588)联系作者去除，开源不易，请多支持！
+	+------------------------------------------------------------------------------------------
+	勾股工作室 <hdm58@qq.com>
+	+------------------------------------------------------------------------------------------
+	-->
+	{block name="copyright"}
+		<div class="copyright">Copyright © 2022-2024 勾股OA - {:CMS_VERSION}  ，Powered by GouguOPEN<a href="https://www.gougucms.com" target="_blank">官网</a><a href="https://blog.gougucms.com" target="_blank">社区</a><a href="https://blog.gougucms.com/home/book/detail/bid/3/id/7.html" target="_blank">文档</a></div></div>
+	{/block}
+	<!-- /版权标识 -->
+</body>
+</html>
\ No newline at end of file
diff --git a/app/base/view/common/errortemplate.html b/app/base/view/common/errortemplate.html
new file mode 100644
index 0000000000000000000000000000000000000000..d85ff306329769e5c3f7fd5d17fb166a39e0f149
--- /dev/null
+++ b/app/base/view/common/errortemplate.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+	<meta name="renderer" content="webkit" />
+	<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
+	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+	<title>找不到模板文件</title>	
+	<style type="text/css">
+		html,body {width: 100%;height: 100%;background: #f7f7f7;margin: 0;padding: 0;border: 0;}
+		div,p {margin: 0;padding: 0;border: 0;}
+		.container {width: 100%;height: 100%;position: fixed;top: 0;left: 0;z-index: 999;overflow: hidden;}
+		.info {width: 360px;height: 360px;position: absolute;top: 50%;left: 50%;margin-top: -200px;margin-left: -180px;text-align:center;}
+		.info-status{width: 360px; display:none;justify-content: space-between;align-items: center;flex-wrap: nowrap;}
+		.info-status div{width:180px; height:180px; line-height:180px; font-size:160px; font-weight:200; color:#F35F37}
+		.info-status div.face{font-size:60px; border:9px solid #F35F37; width:120px; height:120px; line-height:118px; background-color:#fff; border-radius:50%;}
+		.info-tips{font-size:20px;color:#F35F37; padding-top:32px; font-weight:600; line-height:1.8}
+		.info-text{padding-top:20px; line-height:1.6; text-align:left; font-size:14px; color:#646464}
+		.footer {position: absolute;font-size: 12px;bottom: 28px;text-align: center;width: 100%;color: #969696;}
+		.info-status{display: -webkit-flex;display: flex;flex-direction: row;}
+	</style>
+</head>
+
+<body>
+	<div class="container">
+		<div class="info">
+			<div class="info-status">
+				<div>4</div><div class="face">😔</div><div>6</div>
+			</div>
+			<div class="info-tips">哎呀！找不到模板文件</div>
+			<div class="info-text">{$file | default=""}模板不存在，请检查对应的目录文件，注意区分大小写！</div>
+		</div>
+		<div class="footer">
+			Copyright © 2022-2024 勾股OA ，Powered by GouguOPEN
+		</div>
+	</div>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/app/base/view/common/filetemplate.html b/app/base/view/common/filetemplate.html
new file mode 100644
index 0000000000000000000000000000000000000000..5f8a3439ccd64e6d9e23210aff0e0406cd0e21e6
--- /dev/null
+++ b/app/base/view/common/filetemplate.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+	<meta name="renderer" content="webkit" />
+	<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
+	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+	<title>找不到文件</title>	
+	<style type="text/css">
+		html,body {width: 100%;height: 100%;background: #f7f7f7;margin: 0;padding: 0;border: 0;}
+		div,p {margin: 0;padding: 0;border: 0;}
+		.container {width: 100%;height: 100%;position: fixed;top: 0;left: 0;z-index: 999;overflow: hidden;}
+		.info {width: 480px;position: absolute;top: 50%;left: 50%;margin-top: -200px;margin-left: -240px;text-align:center;}
+		.info-status{width: 480px; display: -webkit-flex;display: flex;flex-direction: row;justify-content: space-between;align-items: center;flex-wrap: nowrap;}
+		.info-status div{width:180px; height:180px; line-height:180px; font-size:180px; font-weight:200; color:#F35F37}
+		.info-status div.face{font-size:60px; border:9px solid #F35F37; width:120px; height:120px; line-height:118px; background-color:#fff; border-radius:50%;}
+		.info-tips{font-size:24px;color:#F35F37; padding-top:32px; font-weight:600;}
+		.info-text{padding-top:20px; line-height:1.6; text-align:left; font-size:14px; color:#646464}
+		.footer {position: absolute;font-size: 12px;bottom: 28px;text-align: center;width: 100%;color: #969696;}
+	</style>
+</head>
+
+<body>
+	<div class="container">
+		<div class="info">
+			<div class="info-status">
+				<div>4</div><div class="face">😔</div><div>4</div>
+			</div>
+			<div class="info-tips">哎呀！找不到文件！</div>
+		</div>
+		<div class="footer">
+			© 2022 gougucms.com GPL-3.0 license，Powered by 勾股OA
+		</div>
+	</div>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/app/base/view/common/roletemplate.html b/app/base/view/common/roletemplate.html
new file mode 100644
index 0000000000000000000000000000000000000000..375d0bd320432f9fe88829f89af8980a634742fe
--- /dev/null
+++ b/app/base/view/common/roletemplate.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+	<meta name="renderer" content="webkit" />
+	<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
+	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+	<title>您没有权限</title>	
+	<style type="text/css">
+		html,body {width: 100%;height: 100%;background: #f7f7f7;margin: 0;padding: 0;border: 0;}
+		div,p {margin: 0;padding: 0;border: 0;}
+		.container {width: 100%;height: 100%;position: fixed;top: 0;left: 0;z-index: 999;overflow: hidden;}
+		.info {width: 360px;height: 360px;position: absolute;top: 50%;left: 50%;margin-top: -200px;margin-left: -180px;text-align:center;}
+		.info-status{width: 360px; display:none;justify-content: space-between;align-items: center;flex-wrap: nowrap;}
+		.info-status div{width:180px; height:180px; line-height:180px; font-size:160px; font-weight:200; color:#F35F37}
+		.info-status div.face{font-size:60px; border:9px solid #F35F37; width:120px; height:120px; line-height:118px; background-color:#fff; border-radius:50%;}
+		.info-tips{font-size:20px;color:#F35F37; padding-top:32px; font-weight:600; line-height:1.8}
+		.footer {position: absolute;font-size: 12px;bottom: 28px;text-align: center;width: 100%;color: #969696;}
+		.info-status{display: -webkit-flex;display: flex;flex-direction: row;}
+	</style>
+</head>
+
+<body>
+	<div class="container">
+		<div class="info">
+			<div class="info-status">
+				<div>4</div><div class="face">😔</div><div>5</div>
+			</div>
+			<div class="info-tips">哎呀！您没有权限，请联系『管理员』或者『人事部』</div>
+		</div>
+		<div class="footer">
+			Copyright © 2022-2024 勾股OA ，Powered by GouguOPEN
+		</div>
+	</div>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/app/common.php b/app/common.php
new file mode 100644
index 0000000000000000000000000000000000000000..a18746cf17aaad113d6dcbd4398d41b7173c3446
--- /dev/null
+++ b/app/common.php
@@ -0,0 +1,1667 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+// 应用公共文件,内置主要的数据处理方法
+use think\facade\Config;
+use think\facade\Request;
+use think\facade\Cache;
+use think\facade\Db;
+
+/***************************************************系统相关*****************************************************/
+//设置缓存
+function set_cache($key='', $value='', $date = 86400)
+{
+    Cache::set($key, $value, $date);
+}
+
+//读取缓存
+function get_cache($key)
+{
+    return Cache::get($key);
+}
+
+//清空缓存
+function clear_cache($key)
+{
+    Cache::clear($key);
+}
+
+//读取文件配置
+function get_config($key)
+{
+    return Config::get($key);
+}
+
+//读取系统配置
+function get_system_config($name='', $key = '')
+{
+    $config = [];
+    if (get_cache('system_config' . $name)) {
+        $config = get_cache('system_config' . $name);
+    } else {
+        $conf = Db::name('config')->where('name', $name)->find();
+        if (isset($conf['content'])) {
+            $config = unserialize($conf['content']);
+        }
+        set_cache('system_config' . $name, $config);
+    }
+    if ($key == '') {
+        return $config;
+    } else {
+        if (isset($config[$key])) {
+            return $config[$key];
+        }
+		else{
+			return '';
+		}
+    }
+}
+
+//设置系统配置
+function set_system_config($name='', $key='', $value='')
+{
+    $config = [];
+	$conf = Db::name('config')->where('name', $name)->find();
+	if ($conf['content']) {
+		$config = unserialize($conf['content']);
+	}
+	$config[$key] = $value;
+	set_cache('system_config' . $name, $config);
+	$content = serialize($config);
+	Db::name('config')->where('name', $name)->update(['content'=>$content]);
+}
+
+
+//判断系统是否已安装
+function is_installed()
+{
+    static $isInstalled;
+    if (empty($isInstalled)) {
+        $isInstalled = file_exists(CMS_ROOT . 'config/install.lock');
+    }
+    return $isInstalled;
+}
+
+//判断系统是否存在模板
+function isTemplate($url='')
+{
+    static $isTemplate;
+    if (empty($isTemplate)) {
+        $isTemplate = file_exists(CMS_ROOT . 'app/'.$url);
+    }
+    return $isTemplate;
+}
+
+//判断模块是否禁用
+function isModule($name)
+{
+	$map = [];
+	$map[] = ['name', '=', $name];
+	$map[] = ['status', '=', 1];
+    $count = Db::name('AdminModule')->where($map)->count();
+    return $count;
+}
+
+//获取某模块的某数据配置
+function valueAuth($name,$conf)
+{
+	$map = [];
+	$map[] = ['name', '=', $name];
+    $val = Db::name('DataAuth')->where($map)->value($conf);
+    return $val;
+}
+
+//是否是某模块的数据权限,>1即有权限,$uid,要鉴别的用户，$name模块名称，$conf权限类型(字段),
+function isAuth($uid,$name,$conf)
+{
+	if($uid == 1){
+		return 1;
+	}
+	$map = [];
+	$map[] = ['name', '=', $name];
+	$map[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',$conf)")];
+    $count = Db::name('DataAuth')->where($map)->count();
+    return $count;
+}
+
+//判断是否是部门负责人,
+function isLeader($uid = 0,$did='')
+{
+	if($uid == 1){
+		return 1;
+	}
+	$map = [];
+	$map[] = ['status','=',1];
+	if(!empty($did)){
+		$map[] = ['id','in',$did];
+	}
+	$map[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',leader_ids)")];
+	$count = Db::name('Department')->where($map)->count();
+	return $count;
+}
+
+//获取url参数,$key为空时返回所有参数数组
+function get_params($key = "")
+{
+    return Request::instance()->param($key);
+}
+
+/**
+ * 菜单节点权限判断
+ * @rule String
+ * @uid Int
+ * @return bool
+ */
+function check_auth($rule, $uid)
+{
+    $auth_list = Cache::get('RulesSrc' . $uid);
+    if (!in_array($rule, $auth_list)) {
+        return false;
+    } else {
+        return true;
+    }
+}
+
+/**
+ * 返回json数据，用于接口
+ * @param    integer    $code
+ * @param    string     $msg
+ * @param    array      $data
+ * @param    string     $url
+ * @param    integer    $httpCode
+ * @param    array      $header
+ * @param    array      $options
+ * @return   json
+ */
+function to_assign($code = 0, $msg = "操作成功", $data = [], $action = '', $url = '', $httpCode = 200, $header = [], $options = [])
+{
+    $res = ['code' => $code];
+    $res['msg'] = $msg;
+    $res['action'] = $action;
+    $res['url'] = $url;
+    if (is_object($data)) {
+        $data = $data->toArray();
+    }
+    $res['data'] = $data;
+    $response = \think\Response::create($res, "json", $httpCode, $header, $options);
+    throw new \think\exception\HttpResponseException($response);
+}
+
+/**
+ * 适配layui table数据列表的返回数据方法，用于接口
+ * @param    integer    $code
+ * @param    string     $msg
+ * @param    array      $data
+ * @param    integer    $httpCode
+ * @param    array      $header
+ * @param    array      $options
+ * @return   json
+ */
+function table_assign($code = 0, $msg = '请求成功', $data = [],$totalRow = [], $httpCode = 200, $header = [], $options = [])
+{
+    $res['code'] = $code;
+    $res['msg'] = $msg;
+    $res['totalRow'] = $totalRow;
+    if (is_object($data)) {
+        $data = $data->toArray();
+    }
+    if (!empty($data['total'])) {
+        $res['count'] = $data['total'];
+    } else {
+        $res['count'] = 0;
+    }
+    $res['data'] = $data['data'];
+    $response = \think\Response::create($res, "json", $httpCode, $header, $options);
+    throw new \think\exception\HttpResponseException($response);
+}
+
+//写入操作日主
+function add_log($type, $param_id = 0, $param = [] ,$subject='')
+{
+	try {
+		// 可能会抛出异常的代码
+		$title = '操作';
+		$session_admin = get_config('app.session_admin');
+		$uid = \think\facade\Session::get($session_admin);
+		$type_action = get_config('log.type_action');
+		if($type_action[$type]){
+			$title = $type_action[$type];
+		}
+		$data = [
+			'uid' => $uid,
+			'type' => $type,
+			'action' => $title,
+			'param_id' => $param_id,
+			'param' => json_encode($param),
+			'module' => strtolower(app('http')->getName()),
+			'controller' => strtolower(app('request')->controller()),
+			'function' => strtolower(app('request')->action()),
+			'ip' => app('request')->ip(),
+			'create_time' => time(),
+			'subject' => 'OA系统'
+		];
+		if($subject!=''){
+			$data['subject'] =$subject;
+		}
+		else{
+			$rule = $data['module'] . '/' . $data['controller'] . '/' . $data['function'];
+			$rule_menu = Db::name('AdminRule')->where(array('src' => $rule))->find();
+			if($rule_menu){
+				$data['subject'] = $rule_menu['name'];
+			}
+		}
+		Db::name('AdminLog')->strict(false)->field(true)->insert($data);
+	} catch (\Exception $e) {
+	// 处理异常，记录日志或者其他逻辑
+	// 但不要抛出异常，以免中断主程序流程
+	}
+}
+
+//消息链接信息转换
+function get_message_link($template_id,$action_id){
+	$content='';
+	$template = Db::name('Template')->where('id',$template_id)->find();
+	$link = $template['msg_link'];
+	if(!empty($link)){
+		$content = str_replace('{action_id}', $action_id, $link);
+	}
+	return '<a class="side-a" data-href="'.$content.'">查看详情</a>';
+}
+
+function get_message_mobile($template_id,$action_id){
+	$content='';
+	$template = Db::name('Template')->where('id',$template_id)->find();
+	$link = $template['msg_link'];
+	if(!empty($link)){
+		$content = str_replace('{action_id}', $action_id, $link);
+	}
+	return '<a class="side-a" href="'.$content.'">查看详情</a>';
+}
+
+/**
+ * 邮件发送
+ * @param $to    接收人
+ * @param string $subject 邮件标题
+ * @param string $content 邮件内容(html模板渲染后的内容)
+ * @throws Exception
+ * @throws phpmailerException
+ */
+function send_email($to, $subject = '', $content = '')
+{
+    $mail = new PHPMailer\PHPMailer\PHPMailer();
+    $email_config = Db::name('config')->where('name', 'email')->find();
+    $config = unserialize($email_config['content']);
+
+    $mail->CharSet = 'UTF-8'; //设定邮件编码，默认ISO-8859-1，如果发中文此项必须设置，否则乱码
+    $mail->isSMTP();
+    $mail->SMTPDebug = 0;
+
+    //调试输出格式
+    //$mail->Debugoutput = 'html';
+    //smtp服务器
+    $mail->Host = $config['smtp'];
+    //端口 - likely to be 25, 465 or 587
+    $mail->Port = $config['smtp_port'];
+    if ($mail->Port == '465') {
+        $mail->SMTPSecure = 'ssl'; // 使用安全协议
+    }
+    //Whether to use SMTP authentication
+    $mail->SMTPAuth = true;
+    //发送邮箱
+    $mail->Username = $config['smtp_user'];
+    //密码
+    $mail->Password = $config['smtp_pwd'];
+    //Set who the message is to be sent from
+    $mail->setFrom($config['email'], $config['from']);
+    //回复地址
+    //$mail->addReplyTo('replyto@example.com', 'First Last');
+    //接收邮件方
+    if (is_array($to)) {
+        foreach ($to as $v) {
+            $mail->addAddress($v);
+        }
+    } else {
+        $mail->addAddress($to);
+    }
+
+    $mail->isHTML(true); // send as HTML
+    //标题
+    $mail->Subject = $subject;
+    //HTML内容转换
+    $mail->msgHTML($content);
+    $status = $mail->send();
+    if ($status) {
+        return true;
+    } else {
+        //  echo "Mailer Error: ".$mail->ErrorInfo;// 输出错误信息
+        //  die;
+        return false;
+    }
+}
+
+/***************************************************员工相关*****************************************************/
+//获取指定用户的信息
+function get_admin($uid)
+{
+    $admin = Db::name('Admin')
+    ->alias('a')
+    ->field('a.*,d.title as department,p.title as position')
+    ->leftJoin ('Department d ','d.id= a.did')
+    ->leftJoin ('Position p ','p.id= a.position_id')
+    ->where(['a.id' => $uid])
+    ->find();
+    return $admin;
+}
+
+//获取指定部门所有的员工信息(包含主部门、次要部门，如果son=1，则包含当前子部门)
+function get_department_employee($did=0,$son=0)
+{
+	$admin_array = [];
+	$department_array = [];
+	$department_array[] = $did;
+	if($son==1){
+		$department_array = get_department_son($did);
+		$admin_array = Db::name('DepartmentAdmin')->whereIn('department_id',$department_array)->column('admin_id');
+	}
+	else{
+		$admin_array = Db::name('DepartmentAdmin')->where('department_id',$did)->column('admin_id');
+	}
+	
+	$map1=[
+		['id','in',$admin_array],
+	];
+	$map2=[
+		['did','in',$department_array],
+	];
+	$where=[['id','>',1],['status','=',1]];
+	$whereOr =[$map1,$map2];
+	$admin = Db::name('Admin')
+		->where(function ($query) use($whereOr) {
+			if (!empty($whereOr)){
+				$query->whereOr($whereOr);
+			}
+		})
+		->where($where)->select()->toArray();
+    return $admin;
+}
+
+/***************************************************部门相关*****************************************************/
+//读取部门列表
+function get_department()
+{
+    $department = Db::name('Department')->order('sort desc,id asc')->where(['status' => 1])->select()->toArray();
+    return $department;
+}
+
+//读取部门名称
+function get_department_name($dids)
+{
+	$departments = Db::name('Department')->where([['id','in',$dids],['status','=',1]])->column('title');
+	if(!empty($departments)){
+		return implode(',',$departments);
+	}else{
+		return '';
+	}
+}
+
+//获取某部门的子部门id，$is_self是否包含自己
+//输出部门数组，如:['1,2,3']
+function get_department_son($did = 0, $is_self = 1)
+{
+    $department = get_department();
+    $department_list = get_data_node($department, $did);
+    $department_array = array_column($department_list, 'id');
+    if ($is_self == 1) {
+        //包括自己部门在内
+        $department_array[] = $did;
+    }
+    return $department_array;
+}
+
+//读取某员工所在主部门的负责人（pid=1，上一级部门负责人）
+//输出负责人数组，如:1,2,3
+function get_department_leader($uid=0,$pid=0)
+{
+	$did = get_admin($uid)['did'];
+	if($pid==1){
+		$did = Db::name('Department')->where('id',$did)->value('pid');
+	}
+	$leader_ids = Db::name('Department')->where('id',$did)->value('leader_ids');
+    return $leader_ids;
+}
+
+//获取某员工所在部门的顶级部门（如果默认顶级部门当做是分公司的，即是获取某员工所属分公司）
+function get_department_top($did=0,$uid=0)
+{
+	if($uid>0){
+		$did = get_admin($uid)['did'];
+	}
+	$top_id = $did;
+	if($did>0){
+		$pid = Db::name('Department')->where('id',$did)->value('pid');
+		if($pid>0){
+			$top_id = get_department_top($pid,0);
+		}
+	}
+    return $top_id;
+}
+
+
+//获取某负责人所负责的部门的数据集(ids)
+function get_leader_departments($uid = 0)
+{
+	$dids = Db::name('Admin')->where('id',$uid)->value('son_dids');
+	if(empty($dids)){
+		return [];
+	}
+	else{
+		return explode(',',$dids);
+	}
+}
+
+//获取某员工所能看的部门数据(dids)
+function get_role_departments($uid = 0)
+{
+	$dids = Db::name('Admin')->where('id',$uid)->value('auth_dids');
+	if(empty($dids)){
+		return [];
+	}
+	else{
+		return explode(',',$dids);
+	}
+}
+
+/***************************************************审批相关*****************************************************/
+
+//获取全部审批状态
+function get_check_status()
+{
+	$check_status_array = ['待提交审批','审批中','审批通过','审批不通过','已撤回'];
+	return $check_status_array;
+}
+
+//根据审批状态读取审批状态名称
+function check_status_name($check_status=0)
+{
+	$check_status_array = get_check_status();
+	return $check_status_array[$check_status];
+}
+
+//根据流程类型读取某部门某模块的审核流程
+function get_cate_department_flows($cate=1,$department=0)
+{
+	$map1 = [];
+	$map2 = [];
+	$map1[] = ['status', '=', 1];
+	$map1[] = ['flow_cate', '=', $cate];
+	$map1[] = ['department_ids', '=', ''];
+
+	$map2[] = ['status', '=', 1];
+	$map2[] = ['flow_cate', '=', $cate];
+	$map2[] = ['', 'exp', Db::raw("FIND_IN_SET('{$department}',department_ids)")];
+
+    $list = Db::name('Flow')->field('id,name,check_type')->whereOr([$map1,$map2])->order('id desc')->select()->toArray();
+    return $list;
+}
+
+//根据流程所属模块读取某部门某模块的审核流程
+function get_type_department_flows($type=6,$department=0)
+{
+	$map1 = [];
+	$map2 = [];
+	$map1[] = ['status', '=', 1];
+	$map1[] = ['type', '=', $type];
+	$map1[] = ['department_ids', '=', ''];
+
+	$map2[] = ['status', '=', 1];
+	$map2[] = ['type', '=', $type];
+	$map2[] = ['', 'exp', Db::raw("FIND_IN_SET('{$department}',department_ids)")];
+
+    $list = Db::name('Flow')->field('id,name,check_type')->whereOr([$map1,$map2])->order('id desc')->select()->toArray();
+    return $list;
+}
+
+/**
+ * 初始化审批流程数据
+ * @param  $flow_id 审批流程id
+ * @param  $check_admin_ids 传入当前审批人ids，用于设置当前审批步骤的审批人
+ * @param  $uid 传入当前登录用户id，用于查找其所在部门的负责人或者上一部门负责人
+ * @return
+ */
+function set_flow($flow_id,$check_admin_ids,$uid)
+{
+    $flow_detail = Db::name('Flow')->where('id',$flow_id)->find();
+    $check_type = $flow_detail['check_type'];
+    $flow = unserialize($flow_detail['flow_list']);
+    if ($check_type == 1) {
+        if($flow[0]['flow_type'] == 1){
+            //部门负责人
+            $leader = get_department_leader($uid);
+            if($leader == 0){
+                return to_assign(1,'审批流程设置有问题：当前部门负责人还未设置，请联系HR或者管理员');
+            }
+            else{
+                $check_admin_ids = $leader;
+            }                        
+        }
+        else if($flow[0]['flow_type'] == 2){
+            //上级部门负责人
+            $leader = get_department_leader($uid,1);
+            if($leader == 0){
+                return to_assign(1,'审批流程设置有问题：上级部门负责人还未设置，请联系HR或者管理员');
+            }
+            else{
+                $check_admin_ids = $leader;
+            }
+        }
+        else{
+            $check_admin_ids = $flow[0]['flow_uids'];
+        }
+    }
+    else if ($check_type == 3) {
+        $check_admin_ids = $flow[0]['flow_uids'];
+    }
+    $flow_data = array(
+        'check_type' => $check_type,
+        'flow' => $flow,
+        'check_admin_ids' => $check_admin_ids
+    );
+    return $flow_data;
+}
+
+/**
+ * 获取审批流程数据
+ * @param  $uid 当前登录用户
+ * @param  $flows 当前步骤内容
+ * @return
+ */
+function get_flow($uid,$flows)
+{
+    $check_user = '';
+    $check_user_ids = [];
+    if($flows['flow_type']==1){
+        $check_user = '部门负责人-';                
+        $check_user_ids[]=get_department_leader($uid);
+    }
+    else if($flows['flow_type']==2){
+        $check_user = '上级部门负责人-';
+        $check_user_ids[]=get_department_leader($uid,1);
+    }
+    else{
+        $check_user_ids = explode(',',$flows['flow_uids']);        
+    }
+    $check_user_array = Db::name('Admin')->where('id','in',$check_user_ids)->column('name');
+    $res = array(
+        'check_user' => $check_user.implode(',',$check_user_array),
+        'check_user_ids' => $check_user_ids
+    );
+    return $res;
+}
+
+/**
+ * 获取审批记录数据
+ * @param  $check_table 关联内容表
+ * @param  $action_id 关联内容记录id
+ * @return
+ */
+function get_check_record($check_table,$action_id)
+{
+	$check_record = Db::name('FlowRecord')
+					->field('f.*,a.name')
+					->alias('f')->join('Admin a', 'a.id = f.check_uid', 'left')
+					->where([['f.check_table','=',$check_table],['f.action_id','=',$action_id],['f.delete_time','=',0]])
+					->select()->toArray();				
+	foreach ($check_record as $kk => &$vv) {		
+		$vv['check_time_str'] = date('Y-m-d H:i', $vv['check_time']);
+		$vv['status_str'] = '提交申请';
+		if($vv['check_status'] == 1){
+			$vv['status_str'] = '审核通过';
+		}
+		else if($vv['check_status'] == 2){
+			$vv['status_str'] = '审核拒绝';
+		}
+		if($vv['check_status'] == 3){
+			$vv['status_str'] = '撤销申请';
+		}
+		if($vv['check_status'] == 4){
+			$vv['status_str'] = '反确认';
+		}
+	}
+	return $check_record;
+}
+
+/***************************************************常规数据获取*****************************************************/
+//读取基础数据
+function get_base_data($table)
+{
+    $data = Db::name($table)->where(['status' => 1])->select()->toArray();
+    return $data;
+}
+
+//读取模块基础数据
+function get_base_type_data($table,$type)
+{
+    $data = Db::name($table)->where(['status' => 1,'types' => $type])->select()->toArray();
+    return $data;
+}
+
+//读取所属地区
+function get_region_name($id){
+    $region = Db::name('city')->where(['id'=>$id])->find();
+	if(empty($region)){
+		return '';
+	}
+	else{
+		return $region['name'];
+	}
+}
+
+//读取分类子分类ids,返回id数组
+function get_cate_son($table='',$id=0,$is_self = 1)
+{
+    $cate = Db::name($table)->order('id desc')->select()->toArray();
+    $cate_list = get_data_node($cate, $id);
+    $ids_array = array_column($cate_list, 'id');
+    if ($is_self == 1) {
+        //包括自己在内
+        $ids_array[] = $id;
+    }
+    return $ids_array;
+}
+
+/**
+ * 根据附件表的id返回url地址
+ * @param  [type] $id [description]
+ */
+function get_file($id)
+{
+    if ($id) {
+        $geturl = Db::name("file")->where(['id' => $id])->find();
+        if ($geturl['status'] == 1) {
+            //审核通过
+            //获取签名的URL
+            $url = $geturl['filepath'];
+            return $url;
+        } elseif ($geturl['status'] == 0) {
+            //待审核
+            return '/static/home/images/none_pic.jpg';
+        } else {
+            //不通过
+            return '/static/home/images/none_pic.jpg';
+        }
+    }
+    return false;
+}
+
+/***************************************************工具函数相关*****************************************************/
+
+//生成一个不会重复的字符串
+function make_token()
+{
+    $str = md5(uniqid(md5(microtime(true)), true));
+    $str = sha1($str); //加密
+    return $str;
+}
+
+//随机字符串，默认长度10
+function set_salt($num = 10)
+{
+    $str = 'qwertyuiopasdfghjklzxcvbnm1234567890';
+    $salt = substr(str_shuffle($str), 10, $num);
+    return $salt;
+}
+//密码加密
+function set_password($pwd, $salt)
+{
+    return md5(md5($pwd . $salt) . $salt);
+}
+
+/**
+ * 生成时间编号
+ * $prefix前缀
+ */
+function get_codeno($prefix=1){
+    $no = $prefix . date('YmdHis') . rand(1,9);
+    return $no;
+}
+
+/**
+ * 去除空格
+ * @param string $str 字符串
+ * @return string     字符串
+ */
+function trim_space($str=''){
+	$str = mb_ereg_replace('^(　| )+', '', $str);
+	$str = mb_ereg_replace('(　| )+$', '', $str);
+	return mb_ereg_replace('　　', "\n　　", $str);
+}
+
+/**
+ * 隐藏电话号码中间4位和邮箱
+ */
+function hidetel($phone)
+{
+	//隐藏邮箱
+	if (strpos($phone, '@')) {
+		$email_array = explode("@", $phone);
+		$prevfix = (strlen($email_array[0]) < 4) ? "" : substr($phone, 0, 3); //邮箱前缀
+		$count = 0;
+		$str = preg_replace('/([\d\w+_-]{0,100})@/', '***@', $phone, -1, $count);
+		$rs = $prevfix . $str;
+		return $rs;
+	} else {
+		//隐藏联系方式中间4位
+		$Istelephone = preg_match('/(0[0-9]{2,3}[\-]?[2-9][0-9]{6,7}[\-]?[0-9]?)/i', $phone); //固定电话
+		if ($Istelephone) {
+			return preg_replace('/(0[0-9]{2,3}[\-]?[2-9])[0-9]{3,4}([0-9]{3}[\-]?[0-9]?)/i', '$1****$2', $phone);
+		} else {
+			return preg_replace('/(1[0-9]{1}[0-9])[0-9]{4}([0-9]{4})/i', '$1****$2', $phone);
+		}
+	}
+}
+
+/**
+ * 间隔时间段格式化
+ * @param int $time 时间戳
+ * @param string $format 格式 【d：显示到天 i显示到分钟 s显示到秒】
+ * @return string
+ */
+function time_trans($time, $format = 'd')
+{
+	$now = time();
+	if (!is_numeric($time)) {
+		$time = strtotime($time);
+	}
+	$diff = $now - $time;
+	if ($diff < 60) {
+		return '1分钟前';
+	} else if ($diff < 3600) {
+		return floor($diff / 60) . '分钟前';
+	} else if ($diff < 86400) {
+		return floor($diff / 3600) . '小时前';
+	}
+	$yes_start_time = strtotime(date('Y-m-d 00:00:00', strtotime('-1 days'))); //昨天开始时间
+	$yes_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-1 days'))); //昨天结束时间
+	$two_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-2 days'))); //2天前结束时间
+	$three_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-3 days'))); //3天前结束时间
+	$four_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-4 days'))); //4天前结束时间
+	$five_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-5 days'))); //5天前结束时间
+	$six_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-6 days'))); //6天前结束时间
+	$seven_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-7 days'))); //7天前结束时间
+
+	if ($time > $yes_start_time && $time < $yes_end_time) {
+		return '昨天';
+	}
+
+	if ($time > $yes_start_time && $time < $two_end_time) {
+		return '1天前';
+	}
+
+	if ($time > $yes_start_time && $time < $three_end_time) {
+		return '2天前';
+	}
+
+	if ($time > $yes_start_time && $time < $four_end_time) {
+		return '3天前';
+	}
+
+	if ($time > $yes_start_time && $time < $five_end_time) {
+		return '4天前';
+	}
+
+	if ($time > $yes_start_time && $time < $six_end_time) {
+		return '5天前';
+	}
+
+	if ($time > $yes_start_time && $time < $seven_end_time) {
+		return '6天前';
+	}
+
+	switch ($format) {
+		case 'd':
+			$show_time = date('Y-m-d', $time);
+			break;
+		case 'i':
+			$show_time = date('Y-m-d H:i', $time);
+			break;
+		case 's':
+			$show_time = date('Y-m-d H:i:s', $time);
+			break;
+	}
+	return $show_time;
+}
+
+/**
+ * 时间戳格式化
+ * @param int    $time
+ * @param string $format 默认'Y-m-d H:i:s'
+ * @return string 完整的时间显示
+ */
+function to_date($time = NULL, $format = 'Y-m-d H:i:s')
+{
+	if(empty($time)){
+		return '';
+	}
+	else{
+		if (is_numeric($time)) {
+		return date($format, intval($time));
+		}
+		else{
+			return $time;
+		}
+	}
+}
+
+/**
+ * 计算按相差天数
+ */
+function count_days($a=0, $b = 0)
+{
+	if ($b == 0) {
+		$b = date("Y-m-d");
+	}
+	$date_1 = $a;
+	$date_2 = $b;
+	$d1 = strtotime($date_1);
+	$d2 = strtotime($date_2);
+	$days = round(($d2 - $d1) / 3600 / 24);
+	if ($days > 0) {
+		return $days;
+	} else {
+		return 0;
+	}
+}
+
+/**
+ * @Method: 文件大小格式化
+ * @param[type] $file_size [文件大小]
+ */
+function to_size($file_size){
+	$file_size = $file_size-1;
+	if ($file_size >= 1099511627776){
+		$show_filesize = number_format(($file_size / 1099511627776),2) . " TB";
+	}
+	elseif ($file_size >= 1073741824) {
+		$show_filesize = number_format(($file_size / 1073741824),2) . " GB";
+	}
+	elseif ($file_size >= 1048576) {
+		$show_filesize = number_format(($file_size / 1048576),2) . " MB";
+	}
+	elseif ($file_size >= 1024) {
+		$show_filesize = number_format(($file_size / 1024),2) . " KB";
+	}
+	elseif ($file_size > 0) {
+		$show_filesize = $file_size . " b";
+	}
+	elseif ($file_size == 0 || $file_size == -1) {
+		$show_filesize = "0 b";
+	}
+	return $show_filesize;
+}
+
+//格式化附件展示
+function file_card($file,$view=''){
+	if(empty($file['file_id'])){
+		$file['file_id'] = $file['id'];
+	}
+	$image=['jpg','jpeg','png','gif'];
+	$office=['doc','docx','xls','xlsx','ppt','pptx'];
+	$type_icon = 'icon-xiangmuguanli';
+	$type = 0;//0下载+重命名+删除，1下载+查看+重命名+删除，2下载+查看+编辑+重命名+删除
+	$ext = 'zip';
+	$view_btn = '<a class="blue" href="'.$file['filepath'].'" download="'.$file['name'].'" target="_blank" title="下载"><i class="iconfont icon-xiazai"></i></a>';
+	
+	if($file['fileext'] == 'pdf'){
+		$type_icon = 'icon-kejian';
+		$ext = 'pdf';
+		$type = 1;
+	}
+	if(in_array($file['fileext'], $image)){
+		$type_icon = 'icon-sucaiguanli';
+		$ext = 'image';
+		$type = 1;
+	}
+	if(in_array($file['fileext'], $office)){
+		$type_icon = 'icon-shenbao';
+		$ext = 'office';
+		$type = 2;
+	}	
+	
+	if(empty($view)){
+		$view_btn = '<span class="file-ctrl blue" data-ctrl="edit" data-type="'.$type.'" data-fileid="'.$file['file_id'].'" data-ext="'.$ext.'" data-filename="'.$file['name'].'" data-href="'.$file['filepath'].'" data-id="'.$file['id'].'" data-uid="'.$file['admin_id'].'" title="附件操作"><i class="iconfont icon-gengduo1"></i></span><span class="name-edit green" style="display:none;" data-id="'.$file['id'].'" data-fileid="'.$file['file_id'].'" id="fileEdit'.$file['file_id'].'" data-name="'.$file['name'].'" data-fileext="'.$file['fileext'].'" title="重命名"></span><span class="file-delete red" style="display:none;" data-uid="'.$file['admin_id'].'" data-id="'.$file['id'].'" data-fileid="'.$file['file_id'].'" id="fileDel'.$file['file_id'].'" title="删除"></span>';
+	}
+	else{
+		$view_btn = '<span class="file-ctrl blue" data-ctrl="view" data-type="'.$type.'" data-fileid="'.$file['file_id'].'" data-ext="'.$ext.'" data-filename="'.$file['name'].'" data-href="'.$file['filepath'].'" title="附件操作"><i class="iconfont icon-gengduo1"></i></span>';
+	}
+	
+	$file_del='';
+	if(!empty($file['delete_time'])){
+		$file_del = 'file-hasdelete';
+	}
+	$item = '<div class="file-card '.$file_del.'" id="fileItem'.$file['file_id'].'">
+		<i class="file-icon iconfont '.$type_icon.'"></i>
+		<div class="file-info">
+			<div class="file-title" title="'.$file['name'].'">'.$file['name'].'</div>
+			<div class="file-ops">'.to_size($file['filesize']).'，'.date('Y-m-d H:i',$file['create_time']).'</div>
+		</div>
+		<div class="file-tool">'.$view_btn.'</div>
+	</div>';
+	return $item;
+}
+
+//格式化附件展示
+function file_item($file,$view=''){
+	$image=['jpg','jpeg','png','gif'];
+    $fileshow='<div class="mbui-file-icon"><i class="iconfont icon-weizhigeshi"></i></div>';
+	if($file['fileext'] == 'pdf'){
+
+	}
+	if(in_array($file['fileext'], $image)){
+		$fileshow='<div class="mbui-file-icon file-img"><img src="'.$file['filepath'].'" alt="'.$file['name'].'"></div>';
+	}
+	$file_del='';
+	if(empty($view)){
+		$file_del = '<div class="mbui-file-del"><i class="iconfont icon-cuowukongxin"></i></div>';
+	}
+	$filesize = to_size($file['filesize']);
+	$filedate = date('Y-m-d H:i',$file['create_time']);
+	$item = '<div class="mbui-file-div"data-id="'.$file['id'].'">
+				'.$fileshow.'
+				<div class="mbui-file-info">
+					<div class="mbui-file-name line-limit-1">'.$file['name'].'</div>
+					<div class="mbui-file-size">'.$filesize.'，'.$filedate.'</div>
+				</div>
+				'.$file_del.'
+			</div>';
+	return $item;
+}
+
+/**
+ * fullcalendar日历控件方法1
+ */
+function parseDateTime($string, $timeZone=null) {
+  $date = new DateTime(
+	$string,
+	$timeZone ? $timeZone : new DateTimeZone('UTC')
+  );
+  if ($timeZone) {
+	$date->setTimezone($timeZone);
+  }
+  return $date;
+}
+
+/**
+ * fullcalendar日历控件方法2
+ */
+function stripTime($datetime) {
+  return new DateTime($datetime->format('Y-m-d'));
+}
+/**
+ * 截取文章摘要
+ *  @return bool
+ */
+function get_desc_content($content, $count)
+{
+    $content = preg_replace("@<script(.*?)</script>@is", "", $content);
+    $content = preg_replace("@<iframe(.*?)</iframe>@is", "", $content);
+    $content = preg_replace("@<style(.*?)</style>@is", "", $content);
+    $content = preg_replace("@<(.*?)>@is", "", $content);
+    $content = str_replace(PHP_EOL, '', $content);
+    $space = array(" ", "　", "  ", " ", " ");
+    $go_away = array("", "", "", "", "");
+    $content = str_replace($space, $go_away, $content);
+    $res = mb_substr($content, 0, $count, 'UTF-8');
+    if (mb_strlen($content, 'UTF-8') > $count) {
+        $res = $res . "...";
+    }
+    return $res;
+}
+
+/**
+ * 二维数组排序
+ * @param $array 要进行排序的select结果集
+ * @param $field  排序的字段
+ * @param $order 排序方式1降序2升序
+ */
+function sort_array($array = [], $field='', $order = 1)
+{
+    $count = count($select);
+    if ($order == 1) {
+        for ($i = 0; $i < $count; $i++) {
+            $k = $i;
+            for ($j = $i; $j < $count; $j++) {
+                if ($select[$k][$field] < $select[$j][$field]) {
+                    $k = $j;
+                }
+            }
+            $temp = $select[$i];
+            $select[$i] = $select[$k];
+            $select[$k] = $temp;
+        }
+        return $select;
+    } else {
+        for ($i = 0; $i < $count; $i++) {
+            $k = $i;
+            for ($j = $i; $j < $count; $j++) {
+                if ($select[$k][$field] > $select[$j][$field]) {
+                    $k = $j;
+                }
+            }
+            $temp = $select[$i];
+            $select[$i] = $select[$k];
+            $select[$k] = $temp;
+        }
+        return $select;
+    }
+}
+
+//查找数组索引,支持一维数组，二维数组查找
+function array_search_plus($array, $searchFor) {
+    foreach($array as $key => $value) {
+		if(is_array($value)){
+			foreach($value as $key1 => $value1) {
+				if($value1 == $searchFor) {
+					return array("index" => $key, "key" => $key1);
+				}
+			}
+		}
+		else{
+			if($value == $searchFor) {
+				return $key;
+			}
+		}
+    } 
+    return false;
+}
+
+//根据数据库查询出来二维数组获取某个字段拼接字符串
+function split_array_field($array = [], $field = '',$separator=',')
+{
+	$str='';
+    if (is_array($array)) {
+		if($field){
+			$ary = array();
+			foreach ($array as $value) {
+				$ary[] = $value[$field];
+			}
+		}
+		else{
+			$ary = $array;
+		}
+        $str = implode($separator, $ary);
+    }
+	return $str;
+}
+
+//数组转换字符串
+function array_to_string($array=[],$separator=',')
+{
+    if (!is_array($array)) {
+        $data_arr[] = $array;
+    } else {
+        $data_arr = $array;
+    }
+    $data_arr = array_filter($data_arr); //数组去空
+    $data_arr = array_unique($data_arr); //数组去重
+    $data_arr = array_merge($data_arr);
+    $string = $data_arr ? ',' . implode($separator, $data_arr) . ',' : '';
+    return $string ?: '';
+}
+
+//字符串转换数组
+function string_to_array($string='',$separator=',')
+{
+    if (is_array($string)) {
+        $data_arr = array_unique(array_filter($string));
+    } else {
+        $data_arr = $string ? array_unique(array_filter(explode($separator, $string))) : [];
+    }
+    $data_arr = $data_arr ? array_merge($data_arr) : [];
+    return $data_arr ?: [];
+}
+
+/**
+ * 格式化字节大小
+ * @param number $size      字节数
+ * @param string $delimiter 数字和单位分隔符
+ * @return string            格式化后的带单位的大小
+ */
+function format_bytes($size, $delimiter = '')
+{
+    $units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB');
+    for ($i = 0; $size >= 1024 && $i < 5; $i++) {
+        $size /= 1024;
+    }
+    return round($size, 2) . $delimiter . $units[$i];
+}
+
+/**
+ * 截取字符串
+ * @param $start 开始截取位置
+ * @param $length 截取长度
+ * @return
+ */
+function msubstr($str='', $start = 0, $length=1, $charset = "utf-8", $suffix = true)
+{
+    if (function_exists("mb_substr")) {
+        $slice = mb_substr($str, $start, $length, $charset);
+    } elseif (function_exists('iconv_substr')) {
+        $slice = iconv_substr($str, $start, $length, $charset);
+        if (false === $slice) {
+            $slice = '';
+        }
+    } else {
+        $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
+        $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
+        $re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
+        $re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
+        preg_match_all($re[$charset], $str, $match);
+        $slice = join("", array_slice($match[0], $start, $length));
+    }
+    if (utf8_strlen($str) < $length) $suffix = false;
+    return $suffix ? $slice . '...' : $slice;
+}
+
+//计算字符串长度
+function utf8_strlen($string = null)
+{
+    preg_match_all("/./us", $string, $match);
+    return count($match[0]);
+}
+
+/**
+ * 截取文字长度
+ * @return string
+ */
+function sub_str($str,$len=20){
+    $strlen=strlen($str)/3;#在编码utf8下计算字符串的长度，并把它交给变量$strlen
+    if($strlen<$len){
+        return $str;
+    }else{
+        return mb_substr($str,0,$len,"utf-8")."...";
+    }
+}
+
+/*
+* 下划线转驼峰
+* 思路:
+* step1.原字符串转小写,原字符串中的分隔符用空格替换,在字符串开头加上分隔符
+* step2.将字符串中每个单词的首字母转换为大写,再去空格,去字符串首部附加的分隔符.
+*/
+function camelize($uncamelized_words,$separator='_')
+{
+	$uncamelized_words = $separator. str_replace($separator, " ", strtolower($uncamelized_words));
+	return ltrim(str_replace(" ", "", ucwords($uncamelized_words)), $separator );
+}
+
+/**
+* 驼峰命名转下划线命名
+* 思路:
+* 小写和大写紧挨一起的地方,加上分隔符,然后全部转小写
+*/
+function uncamelize($camelCaps,$separator='_')
+{
+	return strtolower(preg_replace('/([a-z])([A-Z])/', "$1" . $separator . "$2", $camelCaps));
+}
+
+/**
+ *数据处理成树形格式1
+ * @return array
+ */
+function list_to_tree($list, $pk = 'id', $pid = 'pid', $child = 'list', $root = 0)
+{
+    // 创建Tree
+    $tree = array();
+    if (is_array($list)) {
+        // 创建基于主键的数组引用
+        $refer = array();
+        foreach ($list as $key => $data) {
+            $refer[$data[$pk]] = &$list[$key];
+        }
+        foreach ($list as $key => $data) {
+            // 判断是否存在parent
+            $parentId = $data[$pid];
+            if ($root == $parentId) {
+                $tree[$data[$pk]] = &$list[$key];
+            } else {
+                if (isset($refer[$parentId])) {
+                    $parent = &$refer[$parentId];
+                    $parent[$child][$data[$pk]] = &$list[$key];
+                }
+            }
+        }
+    }
+    return $tree;
+}
+
+/**
+ *数据处理成树形格式2
+ * @return array
+ */
+function create_tree_list($pid, $arr, $group, &$tree = [])
+{
+    foreach ($arr as $key => $vo) {
+        if ($key == 0) {
+            $vo['spread'] = true;
+        }
+        if (!empty($group) and in_array($vo['id'], $group)) {
+            $vo['checked'] = true;
+        } else {
+            $vo['checked'] = false;
+        }
+        if ($vo['pid'] == $pid) {
+            $child = create_tree_list($vo['id'], $arr, $group);
+            if ($child) {
+                $vo['children'] = $child;
+                $vo['len'] = count($child);
+            }
+			else{
+				$vo['len'] = 0;
+			}
+            $tree[] = $vo;
+        }
+    }
+    return $tree;
+}
+
+
+//递归排序，用于分类选择
+function set_recursion($result, $pid = 0, $level=-1)
+{
+    /*记录排序后的类别数组*/
+    static $list = array();
+    static $space = ['','├─','§§├─','§§§§├─','§§§§§§├─'];
+	$level++;
+    foreach ($result as $k => $v) {
+        if ($v['pid'] == $pid) {
+            if ($pid != 0) {
+                $v['title'] = $space[$level] . $v['title'];
+                $v['level'] = $level+1;
+            }
+            /*将该类别的数据放入list中*/
+            $list[] = $v;
+            set_recursion($result, $v['id'],$level);
+        }
+    }
+    return $list;
+}
+
+
+//递归返回树形菜单数据
+function get_tree($data, $pid = 0, $level = 1, $open = 1, $first = 0) {
+    $tree = array();
+    foreach ($data as $item) {
+		$item['checkArr']=array('type'=>0, 'isChecked'=>0);
+		$item['spread']=false;
+		if($level<=$open){
+			$item['spread']=true;
+		}
+		$item['level']=$level;
+        if ($item['pid'] == $pid) {
+            $children = get_tree($data, $item['id'],$level+1,$open);
+            if ($children) {
+                $item['children'] = $children;
+            }
+            $tree[] = $item;
+        }
+    }
+	if($first==1&&!empty($tree)){
+		$tree[0]['spread']=true;
+	}
+    return $tree;
+}
+
+//递归返回树形菜单数据
+function get_select_tree($data, $pid ,$deep=0, $selected=[])
+{
+	$tree = [];		
+	foreach($data as $k => $v)
+	{	
+		$vv=[];
+		$vv['name']=$v['title'];	
+		$vv['value']=$v['id'];
+		$vv['selected']='';
+		if(in_array($v['id'],$selected)){
+			$vv['selected'] = 'selected';
+		}
+		if($v['pid'] == $pid){ 
+		//父亲找到儿子
+		$deep++;
+		$vv['children'] = get_select_tree($data, $v['id'],$deep,$selected);
+		$tree[] = $vv;
+	   }
+	}
+	return array_values($tree);
+}
+
+/**
+ * 根据id递归返回子数据
+ * @param  $data 数据
+ * @param  $pid 父节点id
+ */
+function get_data_node($data=[],$pid=0){
+	$dep = [];		
+	foreach($data as $k => $v){			
+		if($v['pid'] == $pid){
+			$node=get_data_node($data, $v['id']);
+			array_push($dep,$v);
+			if(!empty($node)){					
+				$dep=array_merge($dep,$node);
+			}
+		}   	
+	}
+	return array_values($dep);
+}
+
+
+function generateTree($flatArray, $parentId = 0) {
+  $tree = [];
+  foreach ($flatArray as $item) {
+    if ($item['pid'] === $parentId) {
+      $node = $item;
+	  $node['children'] = generateTree($flatArray, $item['id']);
+      $tree[] = $node;
+    }
+  }
+  return $tree;
+}
+
+//访问按小时归档统计
+function hour_document($arrData)
+{
+    $documents = array();
+    $hour = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23];
+    foreach ($hour as $val) {
+        $documents[$val] = 0;
+    }
+    foreach ($arrData as $index => $value) {
+        $archivesTime = intval(date("H", $value['create_time']));
+        $documents[$archivesTime] += 1;
+    }
+    return $documents;
+}
+
+//访问按日期归档统计
+function date_document($arrData)
+{
+    $documents = array();
+    foreach ($arrData as $index => $value) {
+        $archivesTime = date("Y-m-d", $value['create_time']);
+        if (empty($documents[$archivesTime])) {
+            $documents[$archivesTime] = 1;
+        } else {
+            $documents[$archivesTime] += 1;
+        }
+    }
+    return $documents;
+}
+
+/**
+ * 人民币转大写
+ * @param
+ */
+function cny($amount){
+	$capitalNumbers = [
+        '零',
+        '壹',
+        '贰',
+        '叁',
+        '肆',
+        '伍',
+        '陆',
+        '柒',
+        '捌',
+        '玖',
+    ];
+
+    $integerUnits = ['', '拾', '佰', '仟',];
+    $placeUnits = ['', '万', '亿', '兆',];
+    $decimalUnits = ['角', '分', '厘', '毫',];
+    $result = [];
+    $arr = explode('.', (string)$amount);
+    $integer = trim($arr[0] ?? '', '-');
+    $decimal = $arr[1] ?? '';
+    if (!((int)$decimal)) {
+        $decimal = '';
+    }
+    // 转换整数部分,从个位开始
+    $integerNumbers = $integer ? array_reverse(str_split($integer)) : [];
+    $last = null;
+    foreach (array_chunk($integerNumbers, 4) as $chunkKey => $chunk) {
+        if (!((int)implode('', $chunk))) {
+            // 全是 0 则直接跳过
+            continue;
+        }
+        array_unshift($result, $placeUnits[$chunkKey]);
+        foreach ($chunk as $key => $number) {
+            // 去除重复 零，以及第一位的 零，类似：1002、110
+            if (!$number && (!$last || $key === 0)) {
+                $last = $number;
+                continue;
+            }
+            $last = $number;
+            // 类似 1022，中间的 0 是不需要 佰 的
+            if ($number) {
+                array_unshift($result, $integerUnits[$key]);
+            }
+            array_unshift($result, $capitalNumbers[$number]);
+        }
+    }
+    if (!$result) {
+        $result[] = $capitalNumbers[0];
+    }
+    $result[] = '圆';
+    if (!$decimal) {
+        $result[] = '整';
+    }
+    // 转换小数位
+    $decimalNumbers = $decimal ? str_split($decimal) : [];
+    foreach ($decimalNumbers as $key => $number) {
+        $result[] = $capitalNumbers[$number];
+        $result[] = $decimalUnits[$key];
+    }
+    if (strpos((string)$amount, '-') === 0) {
+        array_unshift($result, '负');
+    }
+    return implode('', $result);
+}
+
+
+/**
+ * 金额展示规则,超过1万时以万为单位，低于1万时以千为单位，低于1千时以元为单位
+ * @param string $money 金额
+ * @return string
+ */
+function format_money($money)
+{
+    $data = '0元';
+    if (($money / 10000) > 1) {
+        $data = is_int($money / 10000) ? ($money / 10000) . '万' : round(($money / 10000), 2) . '万';
+    } elseif (($money / 1000) > 1) {
+        $data = is_int($money / 1000) ? ($money / 1000) . '千' : round(($money / 1000), 2) . '千';
+    } else {
+        $data = $money . '元';
+    }
+    return $data;
+}
+
+/***************************************************校验相关*****************************************************/
+/**
+ * 判断是否是手机浏览器
+ *  @return bool
+ */
+function is_mobile()
+{ 
+    if (isset($_SERVER['HTTP_VIA']) && stristr($_SERVER['HTTP_VIA'], "wap")) {
+        return true;
+    } elseif (isset($_SERVER['HTTP_ACCEPT']) && strpos(strtoupper($_SERVER['HTTP_ACCEPT']), "VND.WAP.WML")) {
+        return true;
+    } elseif (isset($_SERVER['HTTP_X_WAP_PROFILE']) || isset($_SERVER['HTTP_PROFILE'])) {
+        return true;
+    } elseif (isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/(blackberry|configuration\/cldc|hp |hp-|htc |htc_|htc-|iemobile|kindle|midp|mmp|motorola|mobile|nokia|opera mini|opera |Googlebot-Mobile|YahooSeeker\/M1A1-R2D2|android|iphone|ipod|mobi|palm|palmos|pocket|portalmmm|ppc;|smartphone|sonyericsson|sqh|spv|symbian|treo|up.browser|up.link|vodafone|windows ce|xda |xda_)/i', $_SERVER['HTTP_USER_AGENT'])) {
+        return true;
+    }elseif (strpos($_SERVER['HTTP_USER_AGENT'] , 'wxwork') !== false ) {
+		return true;
+	}else {
+		return false;
+	}
+}
+
+/**
+ * 判断是否是微信浏览器
+ *  @return bool
+ */
+function is_wechat(){
+	if ( strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false ) {
+		return true;
+	} else {
+		return false;
+	}
+}
+
+/**
+ * 判断是否是企业微信浏览器
+ *  @return bool
+ */
+function is_wxwork()
+{ 
+	if (strpos($_SERVER['HTTP_USER_AGENT'] , 'wxwork') !== false ) {
+		return true;
+	} else {
+		return false;
+	}
+}
+
+/**
+ * 验证输入的邮件地址是否合法
+ * @param $user_email 邮箱
+ * @return bool
+ */
+function is_email($user_email)
+{
+    $chars = "/^([a-z0-9+_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,6}\$/i";
+    if (strpos($user_email, '@') !== false && strpos($user_email, '.') !== false) {
+        if (preg_match($chars, $user_email)) {
+            return true;
+        } else {
+            return false;
+        }
+    } else {
+        return false;
+    }
+}
+
+
+/**
+ * 获取客户浏览器类型
+ */
+function get_browser_name()
+{
+    $Browser = $_SERVER['HTTP_USER_AGENT'];
+    if (preg_match('/MSIE/i', $Browser)) {
+        $Browser = 'MSIE';
+    } elseif (preg_match('/Firefox/i', $Browser)) {
+        $Browser = 'Firefox';
+    } elseif (preg_match('/Chrome/i', $Browser)) {
+        $Browser = 'Chrome';
+    } elseif (preg_match('/Safari/i', $Browser)) {
+        $Browser = 'Safari';
+    } elseif (preg_match('/Opera/i', $Browser)) {
+        $Browser = 'Opera';
+    } else {
+        $Browser = 'Other';
+    }
+    return $Browser;
+}
+
+/**
+ * 获取客户端系统
+ */
+function get_os_name()
+{
+    $agent = $_SERVER['HTTP_USER_AGENT'];
+    if (preg_match('/win/i', $agent)) {
+        if (preg_match('/nt 6.1/i', $agent)) {
+            $OS = 'Windows 7';
+        } else if (preg_match('/nt 6.2/i', $agent)) {
+            $OS = 'Windows 8';
+        } else if (preg_match('/nt 10.0/i', $agent)) {
+            $OS = 'Windows 10';
+        } else {
+            $OS = 'Windows';
+        }
+    } elseif (preg_match('/mac/i', $agent)) {
+        $OS = 'MAC';
+    } elseif (preg_match('/linux/i', $agent)) {
+        $OS = 'Linux';
+    } elseif (preg_match('/unix/i', $agent)) {
+        $OS = 'Unix';
+    } elseif (preg_match('/bsd/i', $agent)) {
+        $OS = 'BSD';
+    } else {
+        $OS = 'Other';
+    }
+    return $OS;
+}
+
+/**
+ * curl 模拟GET请求
+ * @author lee
+ ***/
+function curl_get($url)
+{
+    //初始化
+    $ch = curl_init();
+    //设置抓取的url
+    curl_setopt($ch, CURLOPT_URL, $url);
+    //设置获取的信息以文件流的形式返回，而不是直接输出。
+    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // https请求 不验证证书
+    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // https请求 不验证hosts
+	curl_setopt($ch, CURLINFO_HEADER_OUT, TRUE);//添加这个获取请求头信息
+    //执行命令
+    $output = curl_exec($ch);
+	$meta = curl_getinfo($ch,CURLINFO_HEADER_OUT);
+	$accept = substr($meta,0,strpos($meta, 'Accept:'));
+	$host = substr($accept,strpos($accept, 'Host:')+5);
+    curl_close($ch); //释放curl句柄
+    return $output;
+}
+
+/**
+ * 模拟post进行url请求
+ * @param string $url
+ * @param string $param
+ */
+function curl_post($url = '', $post = array())
+{
+	//$post['host'] = $_SERVER['HTTP_HOST'];
+    $curl = curl_init(); // 启动一个CURL会话
+    curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
+    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
+    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); // 从证书中检查SSL加密算法是否存在
+    curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器
+    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
+    curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
+    curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
+    curl_setopt($curl, CURLOPT_POSTFIELDS, $post); // Post提交的数据包
+    curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
+    curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
+    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
+    $res = curl_exec($curl); // 执行操作
+    if (curl_errno($curl)) {
+        echo 'Errno' . curl_error($curl);//捕抓异常
+    }
+    curl_close($curl); // 关闭CURL会话
+    return $res; // 返回数据，json格式
+}
\ No newline at end of file
diff --git a/app/contract/common.php b/app/contract/common.php
new file mode 100644
index 0000000000000000000000000000000000000000..46902b89d35341d907d8ca658be7b1e1731be0f5
--- /dev/null
+++ b/app/contract/common.php
@@ -0,0 +1,50 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+use think\facade\Db;
+
+//销售合同性质
+function get_contract_types($check_status=0)
+{
+	$contract_types_array = [
+		["id"=>1,"title"=>"普通合同"],
+		["id"=>2,"title"=>"产品合同"],
+		["id"=>3,"title"=>"服务合同"]
+	];
+	return $contract_types_array;
+}
+
+//根据销售合同性质读取销售合同性质名称
+function contract_types_name($types=1)
+{
+	$contract_types_array = get_contract_types();
+	return $contract_types_array[$types-1];
+}
+
+//采购合同性质
+function get_purchase_types($check_status=0)
+{
+	$purchase_types_array = [
+		["id"=>1,"title"=>"普通采购"],
+		["id"=>2,"title"=>"物品采购"],
+		["id"=>3,"title"=>"服务采购"]
+	];
+	return $purchase_types_array;
+}
+
+//根据采购合同性质读取采购合同性质名称
+function purchase_types_name($types=1)
+{
+	$purchase_types_array = get_purchase_types();
+	return $purchase_types_array[$types-1];
+}
\ No newline at end of file
diff --git a/app/contract/controller/Api.php b/app/contract/controller/Api.php
new file mode 100644
index 0000000000000000000000000000000000000000..f5082126de99aeaa7432d82e4df8a499d0655703
--- /dev/null
+++ b/app/contract/controller/Api.php
@@ -0,0 +1,344 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+declare (strict_types = 1);
+namespace app\contract\controller;
+
+use app\api\BaseController;
+use app\contract\model\Contract;
+use app\contract\model\Purchase;
+use app\contract\model\SupplierContact;
+use think\facade\Db;
+use think\facade\View;
+
+class Api extends BaseController
+{
+	//获取销售合同协议
+	public function get_contract()
+    {
+        $param = get_params();
+		$uid = $this->uid;
+		$where = array();
+		$whereOr = array();
+		if (!empty($param['keywords'])) {
+			$where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%'];
+		}
+		$where[] = ['delete_time', '=', 0];
+		$where[] = ['check_status', '=', 2];		
+		//是否是合同管理员
+		$auth = isAuth($uid,'contract_admin','conf_1');
+		if($auth == 0){
+			$whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
+			$dids_a = get_leader_departments($uid);
+			$dids_b = get_role_departments($uid);
+			$dids = array_merge($dids_a, $dids_b);
+			if(!empty($dids)){
+				$whereOr[] = ['did','in',$dids];
+			}
+		}
+		$model = new Contract();
+        $list = $model->datalist($param,$where,$whereOr);
+        return table_assign(0, '', $list);
+    }
+
+	//销售合同归档操作
+    public function contract_archive()
+    {
+        if (request()->isPost()) {
+			$param = get_params();
+			$tips='操作成功，合同已转入到归档合同列表';
+			if($param['archive_status'] == 1){
+				$param['archive_uid'] = $this->uid;
+				$param['archive_time'] = time();
+			}
+			else{
+				$param['archive_uid'] = 0;
+				$param['archive_time'] = 0;
+				$tips='操作成功，合同已从归档合同列表转出';
+			}
+			if (Db::name('Contract')->strict(false)->update($param) !== false) {
+				return to_assign(0, $tips);
+			} else {
+				return to_assign(1, "操作失败");
+			}
+        } else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+	
+	//销售合同中止等操作
+    public function contract_stop()
+    {
+        if (request()->isPost()) {
+			$param = get_params();
+			$tips='操作成功，合同已转入到中止合同列表';
+			if($param['stop_status'] == 1){
+				$param['stop_uid'] = $this->uid;
+				$param['stop_time'] = time();
+			}
+			else{
+				$param['stop_uid'] = 0;
+				$param['stop_time'] = 0;
+				$tips='操作成功，合同已从中止合同列表转出';
+			}
+			if (Db::name('Contract')->strict(false)->update($param) !== false) {
+				return to_assign(0, $tips);
+			} else {
+				return to_assign(1, "操作失败");
+			}
+        } else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+	//销售合同作废等操作
+    public function contract_tovoid()
+    {
+        if (request()->isPost()) {
+			$param = get_params();
+			$tips='操作成功，合同已转入到作废合同列表';
+			if($param['void_status'] == 1){
+				$param['void_uid'] = $this->uid;
+				$param['void_time'] = time();
+			}
+			else{
+				$param['void_uid'] = 0;
+				$param['void_time'] = 0;
+				$tips='操作成功，合同已从作废合同列表转出';
+			}
+			if (Db::name('Contract')->strict(false)->update($param) !== false) {
+				return to_assign(0, $tips);
+			} else {
+				return to_assign(1, "操作失败");
+			}
+        } else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+	
+	//获取产品分类数据
+    public function get_productcate_tree()
+    {
+        $cate = get_base_data('ProductCate');
+        $list = get_tree($cate, 0, 2);
+        $data['trees'] = $list;
+        return json($data);
+    }
+	
+	//获取销售产品列表
+	public function get_product()
+    {
+        $param = get_params();
+		$where = array();
+		if (!empty($param['keywords'])) {
+			$where[] = ['id|title', 'like', '%' . $param['keywords'] . '%'];
+		}
+		$where[] = ['delete_time', '=', 0];
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+        $list = Db::name('Product')->field('id,title,sale_price,purchase_price,base_price,unit,specs')->order('id asc')->where($where)->paginate(['list_rows'=> $rows]);
+        table_assign(0, '', $list);
+    }
+	
+	/*
+	-------------------------------------------------分割线---------------------------------------------------------
+	*/
+	//获取采购合同协议
+	public function get_purchase()
+    {
+        $param = get_params();
+		$uid = $this->uid;
+		$where = array();
+		$whereOr = array();
+		if (!empty($param['keywords'])) {
+			$where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%'];
+		}
+		$where[] = ['delete_time', '=', 0];
+		$where[] = ['check_status', '=', 2];
+		$auth = isAuth($uid,'contract_admin','conf_1');
+		if($auth == 0){
+			$whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
+			$dids_a = get_leader_departments($uid);
+			$dids_b = get_role_departments($uid);
+			$dids = array_merge($dids_a, $dids_b);
+			if(!empty($dids)){
+				$whereOr[] = ['did','in',$dids];
+			}
+		}
+		$model = new Purchase();
+        $list = $model->datalist($param,$where,$whereOr);
+        return table_assign(0, '', $list);
+    }
+
+	//采购合同归档操作
+    public function purchase_archive()
+    {
+        if (request()->isPost()) {
+			$param = get_params();
+			$tips='操作成功，合同已转入到归档合同列表';
+			if($param['archive_status'] == 1){
+				$param['archive_uid'] = $this->uid;
+				$param['archive_time'] = time();
+			}
+			else{
+				$param['archive_uid'] = 0;
+				$param['archive_time'] = 0;
+				$tips='操作成功，合同已从归档合同列表转出';
+			}
+			if (Db::name('Purchase')->strict(false)->update($param) !== false) {
+				return to_assign(0, $tips);
+			} else {
+				return to_assign(1, "操作失败");
+			}
+        } else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+	
+	//采购合同中止等操作
+    public function purchase_stop()
+    {
+        if (request()->isPost()) {
+			$param = get_params();
+			$tips='操作成功，合同已转入到中止合同列表';
+			if($param['stop_status'] == 1){
+				$param['stop_uid'] = $this->uid;
+				$param['stop_time'] = time();
+			}
+			else{
+				$param['stop_uid'] = 0;
+				$param['stop_time'] = 0;
+				$tips='操作成功，合同已从中止合同列表转出';
+			}
+			if (Db::name('Purchase')->strict(false)->update($param) !== false) {
+				return to_assign(0, $tips);
+			} else {
+				return to_assign(1, "操作失败");
+			}
+        } else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+	//采购合同作废等操作
+    public function purchase_tovoid()
+    {
+        if (request()->isPost()) {
+			$param = get_params();
+			$tips='操作成功，合同已转入到作废合同列表';
+			if($param['void_status'] == 1){
+				$param['void_uid'] = $this->uid;
+				$param['void_time'] = time();
+			}
+			else{
+				$param['void_uid'] = 0;
+				$param['void_time'] = 0;
+				$tips='操作成功，合同已从作废合同列表转出';
+			}
+			if (Db::name('Purchase')->strict(false)->update($param) !== false) {
+				return to_assign(0, $tips);
+			} else {
+				return to_assign(1, "操作失败");
+			}
+        } else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+	
+	//获取采购品分类数据
+    public function get_purchasedcate_tree()
+    {
+        $cate = get_base_data('PurchasedCate');
+        $list = get_tree($cate, 0, 2);
+        $data['trees'] = $list;
+        return json($data);
+    }
+	
+	//获取供应商列表
+	public function get_supplier()
+    {
+        $param = get_params();
+		$where = array();
+		if (!empty($param['keywords'])) {
+			$where[] = ['id|title', 'like', '%' . $param['keywords'] . '%'];
+		}
+		$where[] = ['delete_time', '=', 0];
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+        $list = Db::name('Supplier')->field('id,title,address')->order('id asc')->where($where)->paginate(['list_rows'=> $rows])->each(function($item, $key){
+			$contact = Db::name('SupplierContact')->where(['sid'=>$item['id'],'is_default'=>1])->find();
+			if(!empty($contact)){
+				$item['contact_name'] = $contact['name'];
+				$item['contact_mobile'] = $contact['mobile'];
+			}
+			else{
+				$item['contact_name'] = '';
+				$item['contact_mobile'] = '';
+			}
+			return $item;
+		});
+        table_assign(0, '', $list);
+    }
+	
+	//获取采购物品列表
+	public function get_purchased()
+    {
+        $param = get_params();
+		$where = array();
+		if (!empty($param['keywords'])) {
+			$where[] = ['id|title', 'like', '%' . $param['keywords'] . '%'];
+		}
+		$where[] = ['delete_time', '=', 0];
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+        $list = Db::name('Purchased')->field('id,title,purchase_price,sale_price,unit,specs')->order('id asc')->where($where)->paginate(['list_rows'=> $rows]);
+        table_assign(0, '', $list);
+    }	
+	
+	//获取供应商联系人数据
+	public function get_supplier_contact()
+    {
+		$param = get_params();
+		$where = array();
+		$where[] = ['delete_time', '=', 0];
+		$where[] = ['sid', '=', $param['supplier_id']];
+        $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$content = SupplierContact::where($where)
+			->order('create_time desc')
+            ->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key) {					
+				$item->admin_name = Db::name('Admin')->where(['id' => $item->admin_id])->value('name');
+				$item->create_time = date('Y-m-d H:i:s', (int) $item->create_time);
+			});
+		return table_assign(0, '', $content);
+    }
+	
+	//设置供应商联系人
+	public function set_supplier_contact()
+    {
+        if (request()->isAjax()) {
+			$param = get_params();
+			$detail= SupplierContact::where(['id' => $param['id']])->find();
+			SupplierContact::where(['sid' => $detail['sid']])->strict(false)->field(true)->update(['is_default'=>0]);
+			$res = SupplierContact::where(['id' => $param['id']])->update(['is_default'=>1]);
+			if ($res) {
+				add_log('edit', $param['id'], $param,'供应商联系人');
+				return to_assign();
+			} else {
+				return to_assign(1, '操作失败');
+			}
+        } else {
+           return to_assign(1, '参数错误');
+        }
+    }
+}
diff --git a/app/contract/controller/Cate.php b/app/contract/controller/Cate.php
new file mode 100644
index 0000000000000000000000000000000000000000..24708264834a5e40726cdc1001c007a338a7cbe1
--- /dev/null
+++ b/app/contract/controller/Cate.php
@@ -0,0 +1,141 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\contract\controller;
+
+use app\base\BaseController;
+use app\contract\model\ContractCate as ContractCateModel;
+use app\contract\validate\CateValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Cate extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new ContractCateModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+            $list = $this->model->where('delete_time',0)->select();
+            return to_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {		
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(CateValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(CateValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getCateById($id);
+				View::assign('detail', $detail);
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			View::assign('detail', $detail);
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		if (request()->isDelete()) {
+			$param = get_params();
+			$id = isset($param['id']) ? $param['id'] : 0;
+			$type = isset($param['type']) ? $param['type'] : 0;
+			$this->model->delById($id,$type);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+
+    /**
+    * 设置
+    */
+    public function set()
+    {
+		if (request()->isAjax()) {
+			$param = get_params();
+			$res = $this->model->strict(false)->field('id,status')->update($param);
+			if ($res) {
+				if($param['status'] == 0){
+					add_log('disable', $param['id'], $param);
+				}
+				else if($param['status'] == 1){
+					add_log('recovery', $param['id'], $param);
+				}
+				return to_assign();
+			}
+			else{
+				return to_assign(0, '操作失败');
+			}
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+   
+
+}
diff --git a/app/contract/controller/Contract.php b/app/contract/controller/Contract.php
new file mode 100644
index 0000000000000000000000000000000000000000..6ec5de4601c8b3f1251178d74859bd60a62381bd
--- /dev/null
+++ b/app/contract/controller/Contract.php
@@ -0,0 +1,459 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\contract\controller;
+
+use app\base\BaseController;
+use app\contract\model\Contract as ContractModel;
+use app\contract\validate\ContractValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Contract extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model; 
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new ContractModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			$tab = isset($param['tab']) ? $param['tab'] : 0;
+			$uid = $this->uid;
+            $where = [];
+            $whereOr = [];
+			$where[]=['delete_time','=',0];
+			$where[]=['archive_time','=',0];
+			$where[]=['stop_time','=',0];
+			$where[]=['void_time','=',0];
+            if (!empty($param['keywords'])) {
+                $where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%'];
+            }
+			if (!empty($param['types'])) {
+                $where[] = ['types', '=',$param['types']];
+            }
+			if (!empty($param['cate_id'])) {
+                $where[] = ['cate_id', '=',$param['cate_id']];
+            }
+			if (isset($param['check_status']) && $param['check_status']!='') {
+                $where[] = ['check_status', '=',$param['check_status']];
+            }
+			if (!empty($param['sign_time'])) {
+				$sign_time =explode('~', $param['sign_time']);
+				$where[] = ['sign_time', 'between',[strtotime(urldecode($sign_time[0])),strtotime(urldecode($sign_time[1].' 23:59:59'))]];
+            }
+			if (!empty($param['end_time'])) {
+				$end_time =explode('~', $param['end_time']);
+				$where[] = ['end_time', 'between',[strtotime(urldecode($end_time[0])),strtotime(urldecode($end_time[1].' 23:59:59'))]];
+            }
+			if($tab == 0){
+				if (!empty($param['uid'])) {
+					$where[] = ['sign_uid', '=', $param['uid']];
+				}
+				else{
+					//是否是客户管理员
+					$auth = isAuth($uid,'customer_admin','conf_1');
+					if($auth == 0){
+						$whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid];
+						$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
+						$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
+						$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
+						$dids_a = get_leader_departments($uid);
+						$dids_b = get_role_departments($uid);
+						$dids = array_merge($dids_a, $dids_b);
+						if(!empty($dids)){
+							$whereOr[] = ['did','in',$dids];
+						}
+					}
+				}
+			}
+			if($tab == 1){
+				$where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
+			}
+			if($tab == 2){
+				$where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
+			}
+            $list = $this->model->datalist($param,$where,$whereOr);
+            return table_assign(0, '', $list);
+        }
+        else{
+			View::assign('is_leader', isLeader($this->uid));
+			View::assign('is_auth', isAuth($this->uid,'contract_admin','conf_1'));
+			View::assign('delay_num', valueAuth('contract_admin','conf_10'));
+            return view();
+        }
+    }
+	
+	public function archivelist()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			$uid = $this->uid;
+            $where = [];
+            $whereOr = [];
+			$where[]=['delete_time','=',0];
+			$where[]=['archive_time','>',0];
+            if (!empty($param['keywords'])) {
+                $where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%'];
+            }
+			if (!empty($param['types'])) {
+                $where[] = ['types', '=',$param['types']];
+            }
+			if (!empty($param['cate_id'])) {
+                $where[] = ['cate_id', '=',$param['cate_id']];
+            }
+			if (!empty($param['sign_time'])) {
+				$sign_time =explode('~', $param['sign_time']);
+				$where[] = ['sign_time', 'between',[strtotime(urldecode($sign_time[0])),strtotime(urldecode($sign_time[1].' 23:59:59'))]];
+            }
+			if (!empty($param['end_time'])) {
+				$end_time =explode('~', $param['end_time']);
+				$where[] = ['end_time', 'between',[strtotime(urldecode($end_time[0])),strtotime(urldecode($end_time[1].' 23:59:59'))]];
+            }
+			$whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
+			
+			$dids_a = get_leader_departments($uid);
+			//是否是合同管理员
+			$auth = isAuth($uid,'contract_admin','conf_1');
+			if($auth == 1){
+				$dids_b = get_role_departments($uid);
+				$dids = array_merge($dids_a, $dids_b);
+				if(!empty($dids)){
+					$whereOr[] = ['did','in',$dids];
+				}
+			}
+			else{
+				if(!empty($dids_a)){
+					$whereOr[] = ['did','in',$dids_a];
+				}
+			}
+            $list = $this->model->datalist($param,$where,$whereOr);
+            return table_assign(0, '', $list);
+        }
+        else{
+			View::assign('delay_num', valueAuth('contract_admin','conf_10'));
+            return view();
+        }
+    }
+	
+	public function stoplist()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			$uid = $this->uid;
+            $where = [];
+            $whereOr = [];
+			$where[]=['delete_time','=',0];
+			$where[]=['stop_time','>',0];
+            if (!empty($param['keywords'])) {
+                $where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%'];
+            }
+			if (!empty($param['types'])) {
+                $where[] = ['types', '=',$param['types']];
+            }
+			if (!empty($param['cate_id'])) {
+                $where[] = ['cate_id', '=',$param['cate_id']];
+            }
+			if (!empty($param['sign_time'])) {
+				$sign_time =explode('~', $param['sign_time']);
+				$where[] = ['sign_time', 'between',[strtotime(urldecode($sign_time[0])),strtotime(urldecode($sign_time[1].' 23:59:59'))]];
+            }
+			if (!empty($param['end_time'])) {
+				$end_time =explode('~', $param['end_time']);
+				$where[] = ['end_time', 'between',[strtotime(urldecode($end_time[0])),strtotime(urldecode($end_time[1].' 23:59:59'))]];
+            }
+            $whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
+			
+			$dids_a = get_leader_departments($uid);
+			//是否是合同管理员
+			$auth = isAuth($uid,'contract_admin','conf_1');
+			if($auth == 1){
+				$dids_b = get_role_departments($uid);
+				$dids = array_merge($dids_a, $dids_b);
+				if(!empty($dids)){
+					$whereOr[] = ['did','in',$dids];
+				}
+			}
+			else{
+				if(!empty($dids_a)){
+					$whereOr[] = ['did','in',$dids_a];
+				}
+			}
+            $list = $this->model->datalist($param,$where,$whereOr);
+            return table_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+	public function voidlist()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			$uid = $this->uid;
+            $where = [];
+            $whereOr = [];
+			$where[]=['delete_time','=',0];
+			$where[]=['void_time','>',0];
+            if (!empty($param['keywords'])) {
+                $where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%'];
+            }
+			if (!empty($param['types'])) {
+                $where[] = ['types', '=',$param['types']];
+            }
+			if (!empty($param['cate_id'])) {
+                $where[] = ['cate_id', '=',$param['cate_id']];
+            }
+			if (!empty($param['sign_time'])) {
+				$sign_time =explode('~', $param['sign_time']);
+				$where[] = ['sign_time', 'between',[strtotime(urldecode($sign_time[0])),strtotime(urldecode($sign_time[1].' 23:59:59'))]];
+            }
+			if (!empty($param['end_time'])) {
+				$end_time =explode('~', $param['end_time']);
+				$where[] = ['end_time', 'between',[strtotime(urldecode($end_time[0])),strtotime(urldecode($end_time[1].' 23:59:59'))]];
+            }
+            $whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
+			
+			$dids_a = get_leader_departments($uid);
+			//是否是合同管理员
+			$auth = isAuth($uid,'contract_admin','conf_1');
+			if($auth == 1){
+				$dids_b = get_role_departments($uid);
+				$dids = array_merge($dids_a, $dids_b);
+				if(!empty($dids)){
+					$whereOr[] = ['did','in',$dids];
+				}
+			}
+			else{
+				if(!empty($dids_a)){
+					$whereOr[] = ['did','in',$dids_a];
+				}
+			}
+            $list = $this->model->datalist($param,$where,$whereOr);
+            return table_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {
+			if (isset($param['sign_time'])) {
+                $param['sign_time'] = strtotime($param['sign_time']);
+            }
+			if (isset($param['start_time'])) {
+                $param['start_time'] = strtotime($param['start_time']);
+            }
+            if (isset($param['end_time'])) {
+                $param['end_time'] = strtotime($param['end_time']);
+				if ($param['end_time'] <= $param['start_time']) {
+					return to_assign(1, "结束时间需要大于开始时间");
+				}
+            }
+			if($param['scene'] == 'add' || $param['scene'] == 'edit'){
+				$param['content'] = serialize([]);
+				if($param['types']==2){			
+					$product_title_data = isset($param['product_title']) ? $param['product_title'] : '';
+					$product_id_data = isset($param['product_id']) ? $param['product_id'] : 0;
+					$product_unit_data = isset($param['product_unit']) ? $param['product_unit'] : '';
+					$product_specs_data = isset($param['product_specs']) ? $param['product_specs'] : '';
+					$product_price_data = isset($param['product_price']) ? $param['product_price'] : '0.00';
+					$product_num_data = isset($param['product_num']) ? $param['product_num'] : 1;
+					$product_subtotal_data = isset($param['product_subtotal']) ? $param['product_subtotal'] : '0.00';
+					$product_remark_data = isset($param['product_remark']) ? $param['product_remark'] : '';				
+					$product = [];
+					if(!empty($product_title_data)){
+						foreach ($product_title_data as $key => $value) {
+							if (!$value) {
+								continue;
+							}
+							$data = [];
+							$data['product_title'] = $product_title_data[$key];
+							$data['product_id'] = $product_id_data[$key];
+							$data['product_unit'] = $product_unit_data[$key];
+							$data['product_specs'] = $product_specs_data[$key];
+							$data['product_price'] = $product_price_data[$key];
+							$data['product_num'] = $product_num_data[$key];
+							$data['product_subtotal'] = $product_subtotal_data[$key];
+							$data['product_remark'] = $product_remark_data[$key];
+							$product[]=$data;
+						}
+					}
+					$param['content'] = serialize($product);
+				}	
+				if($param['types']==3){			
+					$service_title_data = isset($param['service_title']) ? $param['service_title'] : '';
+					$service_id_data = isset($param['service_id']) ? $param['service_id'] : 0;
+					$service_date_data = isset($param['service_date']) ? $param['service_date'] : '';
+					$service_price_data = isset($param['service_price']) ? $param['service_price'] : '0.00';
+					$service_num_data = isset($param['service_num']) ? $param['service_num'] : 1;
+					$service_subtotal_data = isset($param['service_subtotal']) ? $param['service_subtotal'] : '0.00';
+					$service_remark_data = isset($param['service_remark']) ? $param['service_remark'] : '';				
+					$service = [];
+					if(!empty($service_title_data)){
+						foreach ($service_title_data as $key => $value) {
+							if (!$value) {
+								continue;
+							}
+							$data = [];
+							$data['service_title'] = $service_title_data[$key];
+							$data['service_id'] = $service_id_data[$key];
+							$data['service_date'] = $service_date_data[$key];
+							$data['service_price'] = $service_price_data[$key];
+							$data['service_num'] = $service_num_data[$key];
+							$data['service_subtotal'] = $service_subtotal_data[$key];
+							$data['service_remark'] = $service_remark_data[$key];
+							$service[]=$data;
+						}
+					}
+					$param['content'] = serialize($service);
+				}
+			}				
+			
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(ContractValidate::class)->scene($param['scene'])->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(ContractValidate::class)->scene($param['scene'])->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$param['admin_id'] = $this->uid;
+                $this->model->add($param);
+            }	 
+        }else{
+			if(is_mobile()){
+				return view('qiye@/index/405',['msg' => '由于合同太多字段，手机端不方便操作，请到PC端新增合同']);
+			}
+			$id = isset($param['id']) ? $param['id'] : 0;
+			$types = isset($param['types']) ? $param['types'] : 0;
+			$is_customer = Db::name('DataAuth')->where('name','contract_admin')->value('conf_3');
+			$is_codeno = Db::name('DataAuth')->where('name','contract_admin')->value('conf_2');
+			$is_product = Db::name('DataAuth')->where('name','contract_admin')->value('conf_4');
+			$is_service = Db::name('DataAuth')->where('name','contract_admin')->value('conf_5');
+            View::assign('is_customer', $is_customer);
+            View::assign('is_codeno', $is_codeno);
+			View::assign('is_product', $is_product);
+			View::assign('is_service', $is_service);
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				if($detail['check_status'] == 1 || $detail['check_status'] == 2 || $detail['check_status'] == 3){
+					return view(EEEOR_REPORTING,['code'=>403,'warning'=>'当前状态不支持编辑']);
+				}
+				$detail['content'] = unserialize($detail['content']);
+				View::assign('detail', $detail);
+				return view('edit');
+			}
+			$codeno='';
+			if($is_codeno==1){
+				$codeno = get_codeno(1);
+			}
+            View::assign('codeno', $codeno);
+            View::assign('id', $id);
+            View::assign('types', $types);
+			if($types == 0){
+				return view('add_types');
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			if($detail['types'] > 1){
+				$detail['content'] = unserialize($detail['content']);
+			}
+			$detail['status_name'] = check_status_name($detail['check_status']);
+			$detail['cate_title'] = Db::name('ContractCate')->where(['id' => $detail['cate_id']])->value('title');
+			$detail['subject_title'] = Db::name('Enterprise')->where(['id' => $detail['subject_id']])->value('title');
+			//归档信息
+			if($detail['archive_uid'] > 0){
+				$detail['archive_name'] = Db::name('Admin')->where(['id' => $detail['archive_uid']])->value('name');
+			}
+			//中止信息
+			if($detail['stop_uid'] > 0){
+				$detail['stop_name'] = Db::name('Admin')->where(['id' => $detail['stop_uid']])->value('name');
+			}
+			//作废信息
+			if($detail['void_uid'] > 0){
+				$detail['void_name'] = Db::name('Admin')->where(['id' => $detail['void_uid']])->value('name');
+			}
+			$auth = isAuth($this->uid,'contract_admin','conf_1');
+			View::assign('detail', $detail);
+			View::assign('auth', $auth);
+			if(is_mobile()){
+				return view('qiye@/contract/contract_view');
+			}
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		$param = get_params();
+		$id = isset($param['id']) ? $param['id'] : 0;
+		if (request()->isDelete()) {
+			$this->model->delById($id);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }   
+
+}
diff --git a/app/contract/controller/Product.php b/app/contract/controller/Product.php
new file mode 100644
index 0000000000000000000000000000000000000000..dee6e4db92be0f7b182ef54a614d1d5539e43491
--- /dev/null
+++ b/app/contract/controller/Product.php
@@ -0,0 +1,150 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\contract\controller;
+
+use app\base\BaseController;
+use app\contract\model\Product as ProductModel;
+use app\contract\validate\ProductValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Product extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new ProductModel();
+    }
+	
+	public function datalist()
+    {
+        if (request()->isAjax()) {
+			$param = get_params();
+			$where = [];
+			if (!empty($param['keywords'])) {
+                $where[] = ['p.title', 'like', '%' . $param['keywords'] . '%'];
+            }
+			if (isset($param['status']) && $param['status']!='') {
+				$where[] = ['p.status', '=', $param['status']];
+            }
+			if (!empty($param['cate_id'])) {
+				$cate_id_array = get_cate_son('ProductCate',$param['cate_id']);
+                $where[] = ['p.cate_id', 'in', $cate_id_array];
+            }
+			$where[] = ['p.delete_time', '=', 0];
+			$list = $this->model->datalist($where, $param);
+            return table_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+    //新建编辑
+    public function add()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+			if (isset($param['buy_time'])) {
+                $param['buy_time'] = strtotime($param['buy_time']);
+            }
+			if (isset($param['quality_time'])) {
+                $param['quality_time'] = strtotime($param['quality_time']);
+            }
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(ProductValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['update_time'] = time();
+				$param['update_id'] = $this->uid;
+                $this->model->edit($param);
+            } else {
+                try {
+                    validate(ProductValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['create_time'] = time();
+                $param['contractin_id'] = $this->uid;
+                $this->model->add($param);
+            }
+        } else {
+            $id = isset($param['id']) ? $param['id'] : 0;
+            if($id>0){
+                $detail = $this->model->getById($id);
+				if($detail['file_ids'] !=''){
+					$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+					$detail['file_array'] = $file_array;
+				}
+                View::assign('detail', $detail);
+				return view('edit');
+            }
+            return view();
+        }
+    }
+	
+    //查看
+    public function view()
+    {
+        $param = get_params();
+		$id = isset($param['id']) ? $param['id'] : 0;
+		$detail = $this->model->getById($id);
+		if($detail['cate_id']>0){
+			$detail['cate'] = Db::name('ProductCate')->where('id',$detail['cate_id'])->value('title');
+		}
+		if($detail['file_ids'] !=''){
+			$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+			$detail['file_array'] = $file_array;
+		}
+		View::assign('detail', $detail);
+		return view();
+    }
+	
+    //设置
+    public function set()
+    {
+		$param = get_params();
+        $res = $this->model->strict(false)->field('id,status')->update($param);
+		if ($res) {
+			add_log('set', $param['id'], $param);
+			return to_assign();
+		}
+		else{
+			return to_assign(0, '操作失败');
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		$param = get_params();
+		$id = isset($param['id']) ? $param['id'] : 0;
+		if (request()->isDelete()) {
+			$this->model->delById($id);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+}
diff --git a/app/contract/controller/Productcate.php b/app/contract/controller/Productcate.php
new file mode 100644
index 0000000000000000000000000000000000000000..3f52a27955980b3454e6eedce85c4bacde718851
--- /dev/null
+++ b/app/contract/controller/Productcate.php
@@ -0,0 +1,112 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\contract\controller;
+
+use app\base\BaseController;
+use app\contract\validate\ProductCateValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Productcate extends BaseController
+{	
+	//类别
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+            $cate = Db::name('ProductCate')->order('create_time asc')->select();
+			$list = generateTree($cate);
+            return to_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+
+    //分类添加&编辑
+    public function add()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(ProductCateValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $note_array = get_cate_son('ProductCate',$param['id']);
+                if (in_array($param['pid'], $note_array)) {
+                    return to_assign(1, '父级分类不能是该分类本身或其子分类');
+                } else {
+                    $param['update_time'] = time();
+                    $res = Db::name('ProductCate')->strict(false)->field(true)->update($param);
+                    if($res){
+                        add_log('edit', $param['id'], $param);
+                        return to_assign();
+                    }
+                }
+            } else {
+                try {
+                    validate(ProductCateValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['create_time'] = time();
+                $insertId = Db::name('ProductCate')->strict(false)->field(true)->insertGetId($param);
+                if ($insertId) {
+                    add_log('add', $insertId, $param);
+                }
+                return to_assign();
+            }
+        } else {
+            $id = isset($param['id']) ? $param['id'] : 0;
+            $pid = isset($param['pid']) ? $param['pid'] : 0;
+			$cate = Db::name('ProductCate')->order('id desc')->select()->toArray();
+			$cates = set_recursion($cate);
+            if ($id > 0) {
+                $detail = Db::name('ProductCate')->where(['id' => $id])->find();
+                View::assign('detail', $detail);
+            }
+            View::assign('id', $id);
+            View::assign('pid', $pid);
+            View::assign('cates', $cates);
+            return view();
+        }
+    }
+
+    //删除分类
+    public function del()
+    {
+        $id = get_params("id");
+        $cate_count = Db::name('ProductCate')->where(["pid" => $id])->count();
+        if ($cate_count > 0) {
+            return to_assign(1, "该分类下还有子分类，无法删除");
+        }
+        $product_count = Db::name('Product')->where(["cate_id" => $id,'delete_time'=>0])->count();
+        if ($product_count > 0) {
+            return to_assign(1, "该分类下还有产品，无法删除");
+        }
+        if (Db::name('ProductCate')->delete($id) !== false) {
+            add_log('delete', $id);
+            return to_assign(0, "删除分类成功");
+        } else {
+            return to_assign(1, "删除失败");
+        }
+    }
+   
+   
+}
diff --git a/app/contract/controller/Purchase.php b/app/contract/controller/Purchase.php
new file mode 100644
index 0000000000000000000000000000000000000000..1731556386e8d53b67c60e0364ff34d3ab697b33
--- /dev/null
+++ b/app/contract/controller/Purchase.php
@@ -0,0 +1,454 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\contract\controller;
+
+use app\base\BaseController;
+use app\contract\model\Purchase as PurchaseModel;
+use app\contract\validate\PurchaseValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Purchase extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new PurchaseModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			$tab = isset($param['tab']) ? $param['tab'] : 0;
+			$uid = $this->uid;
+            $where = [];
+            $whereOr = [];
+			$where[]=['delete_time','=',0];
+			$where[]=['archive_time','=',0];
+			$where[]=['stop_time','=',0];
+			$where[]=['void_time','=',0];
+            if (!empty($param['keywords'])) {
+                $where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%'];
+            }
+			if (!empty($param['types'])) {
+                $where[] = ['types', '=',$param['types']];
+            }
+			if (!empty($param['cate_id'])) {
+                $where[] = ['cate_id', '=',$param['cate_id']];
+            }
+			if (isset($param['check_status']) && $param['check_status']!='') {
+                $where[] = ['check_status', '=',$param['check_status']];
+            }
+			if (!empty($param['sign_time'])) {
+				$sign_time =explode('~', $param['sign_time']);
+				$where[] = ['sign_time', 'between',[strtotime(urldecode($sign_time[0])),strtotime(urldecode($sign_time[1].' 23:59:59'))]];
+            }
+			if (!empty($param['end_time'])) {
+				$end_time =explode('~', $param['end_time']);
+				$where[] = ['end_time', 'between',[strtotime(urldecode($end_time[0])),strtotime(urldecode($end_time[1].' 23:59:59'))]];
+            }
+			if($tab == 0){
+				if (!empty($param['uid'])) {
+					$where[] = ['sign_uid', '=', $param['uid']];
+				}
+				else{
+					//是否是客户管理员
+					$auth = isAuth($uid,'customer_admin','conf_1');
+					if($auth == 0){
+						$whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid];
+						$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
+						$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
+						$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
+						$dids_a = get_leader_departments($uid);
+						$dids_b = get_role_departments($uid);
+						$dids = array_merge($dids_a, $dids_b);
+						if(!empty($dids)){
+							$whereOr[] = ['did','in',$dids];
+						}
+					}
+				}
+			}
+			if($tab == 1){
+				$where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
+			}
+			if($tab == 2){
+				$where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
+			}
+            $list = $this->model->datalist($param,$where,$whereOr);
+            return table_assign(0, '', $list);
+        }
+        else{
+			View::assign('is_leader', isLeader($this->uid));
+			View::assign('is_auth', isAuth($this->uid,'contract_admin','conf_1'));
+			View::assign('delay_num', valueAuth('contract_admin','conf_10'));
+            return view();
+        }
+    }
+	
+	public function archivelist()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			$uid = $this->uid;
+            $where = [];
+            $whereOr = [];
+			$where[]=['delete_time','=',0];
+			$where[]=['archive_time','>',0];
+            if (!empty($param['keywords'])) {
+                $where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%'];
+            }
+			if (!empty($param['types'])) {
+                $where[] = ['types', '=',$param['types']];
+            }
+			if (!empty($param['cate_id'])) {
+                $where[] = ['cate_id', '=',$param['cate_id']];
+            }
+			if (!empty($param['sign_time'])) {
+				$sign_time =explode('~', $param['sign_time']);
+				$where[] = ['sign_time', 'between',[strtotime(urldecode($sign_time[0])),strtotime(urldecode($sign_time[1].' 23:59:59'))]];
+            }
+			if (!empty($param['end_time'])) {
+				$end_time =explode('~', $param['end_time']);
+				$where[] = ['end_time', 'between',[strtotime(urldecode($end_time[0])),strtotime(urldecode($end_time[1].' 23:59:59'))]];
+            }
+            $whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
+			
+			$dids_a = get_leader_departments($uid);
+			//是否是合同管理员
+			$auth = isAuth($uid,'contract_admin','conf_1');
+			if($auth == 1){
+				$dids_b = get_role_departments($uid);
+				$dids = array_merge($dids_a, $dids_b);
+				if(!empty($dids)){
+					$whereOr[] = ['did','in',$dids];
+				}
+			}
+			else{
+				if(!empty($dids_a)){
+					$whereOr[] = ['did','in',$dids_a];
+				}
+			}
+            $list = $this->model->datalist($param,$where,$whereOr);
+            return table_assign(0, '', $list);
+        }
+        else{
+			View::assign('delay_num', valueAuth('contract_admin','conf_10'));
+            return view();
+        }
+    }
+	
+	public function stoplist()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			$uid = $this->uid;
+            $where = [];
+            $whereOr = [];
+			$where[]=['delete_time','=',0];
+			$where[]=['stop_time','>',0];
+            if (!empty($param['keywords'])) {
+                $where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%'];
+            }
+			if (!empty($param['types'])) {
+                $where[] = ['types', '=',$param['types']];
+            }
+			if (!empty($param['cate_id'])) {
+                $where[] = ['cate_id', '=',$param['cate_id']];
+            }
+			if (!empty($param['sign_time'])) {
+				$sign_time =explode('~', $param['sign_time']);
+				$where[] = ['sign_time', 'between',[strtotime(urldecode($sign_time[0])),strtotime(urldecode($sign_time[1].' 23:59:59'))]];
+            }
+			if (!empty($param['end_time'])) {
+				$end_time =explode('~', $param['end_time']);
+				$where[] = ['end_time', 'between',[strtotime(urldecode($end_time[0])),strtotime(urldecode($end_time[1].' 23:59:59'))]];
+            }
+            $whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
+			
+			$dids_a = get_leader_departments($uid);
+			//是否是合同管理员
+			$auth = isAuth($uid,'contract_admin','conf_1');
+			if($auth == 1){
+				$dids_b = get_role_departments($uid);
+				$dids = array_merge($dids_a, $dids_b);
+				if(!empty($dids)){
+					$whereOr[] = ['did','in',$dids];
+				}
+			}
+			else{
+				if(!empty($dids_a)){
+					$whereOr[] = ['did','in',$dids_a];
+				}
+			}
+            $list = $this->model->datalist($param,$where,$whereOr);
+            return table_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+	public function voidlist()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			$uid = $this->uid;
+            $where = [];
+            $whereOr = [];
+			$where[]=['delete_time','=',0];
+			$where[]=['void_time','>',0];
+            if (!empty($param['keywords'])) {
+                $where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%'];
+            }
+			if (!empty($param['types'])) {
+                $where[] = ['types', '=',$param['types']];
+            }
+			if (!empty($param['cate_id'])) {
+                $where[] = ['cate_id', '=',$param['cate_id']];
+            }
+			if (!empty($param['sign_time'])) {
+				$sign_time =explode('~', $param['sign_time']);
+				$where[] = ['sign_time', 'between',[strtotime(urldecode($sign_time[0])),strtotime(urldecode($sign_time[1].' 23:59:59'))]];
+            }
+			if (!empty($param['end_time'])) {
+				$end_time =explode('~', $param['end_time']);
+				$where[] = ['end_time', 'between',[strtotime(urldecode($end_time[0])),strtotime(urldecode($end_time[1].' 23:59:59'))]];
+            }
+            $whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
+			
+			$dids_a = get_leader_departments($uid);
+			//是否是合同管理员
+			$auth = isAuth($uid,'contract_admin','conf_1');
+			if($auth == 1){
+				$dids_b = get_role_departments($uid);
+				$dids = array_merge($dids_a, $dids_b);
+				if(!empty($dids)){
+					$whereOr[] = ['did','in',$dids];
+				}
+			}
+			else{
+				if(!empty($dids_a)){
+					$whereOr[] = ['did','in',$dids_a];
+				}
+			}
+            $list = $this->model->datalist($param,$where,$whereOr);
+            return table_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {
+			if (isset($param['sign_time'])) {
+                $param['sign_time'] = strtotime($param['sign_time']);
+            }
+			if (isset($param['start_time'])) {
+                $param['start_time'] = strtotime($param['start_time']);
+            }
+            if (isset($param['end_time'])) {
+                $param['end_time'] = strtotime($param['end_time']);
+				if ($param['end_time'] <= $param['start_time']) {
+					return to_assign(1, "结束时间需要大于开始时间");
+				}
+            }
+			if($param['scene'] == 'add' || $param['scene'] == 'edit'){
+				$param['content'] = serialize([]);
+				if($param['types']==2){			
+					$purchased_title_data = isset($param['purchased_title']) ? $param['purchased_title'] : '';
+					$purchased_id_data = isset($param['purchased_id']) ? $param['purchased_id'] : 0;
+					$purchased_unit_data = isset($param['purchased_unit']) ? $param['purchased_unit'] : '';
+					$purchased_specs_data = isset($param['purchased_specs']) ? $param['purchased_specs'] : '';
+					$purchased_price_data = isset($param['purchased_price']) ? $param['purchased_price'] : '0.00';
+					$purchased_num_data = isset($param['purchased_num']) ? $param['purchased_num'] : 1;
+					$purchased_subtotal_data = isset($param['purchased_subtotal']) ? $param['purchased_subtotal'] : '0.00';
+					$purchased_remark_data = isset($param['purchased_remark']) ? $param['purchased_remark'] : '';				
+					$purchased = [];
+					if(!empty($purchased_title_data)){
+						foreach ($purchased_title_data as $key => $value) {
+							if (!$value) {
+								continue;
+							}
+							$data = [];
+							$data['purchased_title'] = $purchased_title_data[$key];
+							$data['purchased_id'] = $purchased_id_data[$key];
+							$data['purchased_unit'] = $purchased_unit_data[$key];
+							$data['purchased_specs'] = $purchased_specs_data[$key];
+							$data['purchased_price'] = $purchased_price_data[$key];
+							$data['purchased_num'] = $purchased_num_data[$key];
+							$data['purchased_subtotal'] = $purchased_subtotal_data[$key];
+							$data['purchased_remark'] = $purchased_remark_data[$key];
+							$purchased[]=$data;
+						}
+					}
+					$param['content'] = serialize($purchased);
+				}	
+				if($param['types']==3){			
+					$service_title_data = isset($param['service_title']) ? $param['service_title'] : '';
+					$service_date_data = isset($param['service_date']) ? $param['service_date'] : '';
+					$service_price_data = isset($param['service_price']) ? $param['service_price'] : '0.00';
+					$service_num_data = isset($param['service_num']) ? $param['service_num'] : 1;
+					$service_subtotal_data = isset($param['service_subtotal']) ? $param['service_subtotal'] : '0.00';
+					$service_remark_data = isset($param['service_remark']) ? $param['service_remark'] : '';				
+					$service = [];
+					if(!empty($service_title_data)){
+						foreach ($service_title_data as $key => $value) {
+							if (!$value) {
+								continue;
+							}
+							$data = [];
+							$data['service_title'] = $service_title_data[$key];
+							$data['service_date'] = $service_date_data[$key];
+							$data['service_price'] = $service_price_data[$key];
+							$data['service_num'] = $service_num_data[$key];
+							$data['service_subtotal'] = $service_subtotal_data[$key];
+							$data['service_remark'] = $service_remark_data[$key];
+							$service[]=$data;
+						}
+					}
+					$param['content'] = serialize($service);
+				}
+			}
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(PurchaseValidate::class)->scene($param['scene'])->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(PurchaseValidate::class)->scene($param['scene'])->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$param['admin_id'] = $this->uid;
+                $this->model->add($param);
+            }	 
+        }else{
+			if(is_mobile()){
+				return view('qiye@/index/405',['msg' => '由于合同太多字段，手机端不方便操作，请到PC端新增合同']);
+			}
+			$id = isset($param['id']) ? $param['id'] : 0;
+			$types = isset($param['types']) ? $param['types'] : 0;
+			$is_supplier = Db::name('DataAuth')->where('name','contract_admin')->value('conf_6');
+			$is_codeno = Db::name('DataAuth')->where('name','contract_admin')->value('conf_2');
+			$is_purchased = Db::name('DataAuth')->where('name','contract_admin')->value('conf_7');
+            View::assign('is_supplier', $is_supplier);
+            View::assign('is_codeno', $is_codeno);
+            View::assign('is_purchased', $is_purchased);
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				if($detail['check_status'] == 1 || $detail['check_status'] == 2 || $detail['check_status'] == 3){
+					return view(EEEOR_REPORTING,['code'=>403,'warning'=>'当前状态不支持编辑']);
+				}
+				$detail['content'] = unserialize($detail['content']);
+				View::assign('detail', $detail);
+				return view('edit');
+			}
+			$codeno='';
+			if($is_codeno==1){
+				$codeno = get_codeno(2);
+			}
+            View::assign('codeno', $codeno);
+            View::assign('id', $id);
+            View::assign('types', $types);
+			if($types == 0){
+				return view('add_types');
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			if($detail['types'] > 1){
+				$detail['content'] = unserialize($detail['content']);
+			}
+			$detail['status_name'] = check_status_name($detail['check_status']);
+			$detail['cate_title'] = Db::name('ContractCate')->where(['id' => $detail['cate_id']])->value('title');
+			$detail['subject_title'] = Db::name('Enterprise')->where(['id' => $detail['subject_id']])->value('title');
+			//归档信息
+			if($detail['archive_uid'] > 0){
+				$detail['archive_name'] = Db::name('Admin')->where(['id' => $detail['archive_uid']])->value('name');
+			}
+			//中止信息
+			if($detail['stop_uid'] > 0){
+				$detail['stop_name'] = Db::name('Admin')->where(['id' => $detail['stop_uid']])->value('name');
+			}
+			//作废信息
+			if($detail['void_uid'] > 0){
+				$detail['void_name'] = Db::name('Admin')->where(['id' => $detail['void_uid']])->value('name');
+			}
+			$auth = isAuth($this->uid,'contract_admin','conf_1');
+			View::assign('detail', $detail);
+			View::assign('auth', $auth);
+			if(is_mobile()){
+				return view('qiye@/contract/purchase_view');
+			}
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		$param = get_params();
+		$id = isset($param['id']) ? $param['id'] : 0;
+		if (request()->isDelete()) {
+			$this->model->delById($id);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }   
+
+}
diff --git a/app/contract/controller/Purchased.php b/app/contract/controller/Purchased.php
new file mode 100644
index 0000000000000000000000000000000000000000..144a5d2190d1fae018d5c4e050564d1433266ad5
--- /dev/null
+++ b/app/contract/controller/Purchased.php
@@ -0,0 +1,150 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\contract\controller;
+
+use app\base\BaseController;
+use app\contract\model\Purchased as PurchasedModel;
+use app\contract\validate\PurchasedValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Purchased extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new PurchasedModel();
+    }
+	
+	public function datalist()
+    {
+        if (request()->isAjax()) {
+			$param = get_params();
+			$where = [];
+			if (!empty($param['keywords'])) {
+                $where[] = ['p.title', 'like', '%' . $param['keywords'] . '%'];
+            }
+			if (isset($param['status']) && $param['status']!='') {
+				$where[] = ['p.status', '=', $param['status']];
+            }
+			if (!empty($param['cate_id'])) {
+				$cate_id_array = get_cate_son('PurchasedCate',$param['cate_id']);
+                $where[] = ['p.cate_id', 'in', $cate_id_array];
+            }
+			$where[] = ['p.delete_time', '=', 0];
+			$list = $this->model->datalist($where, $param);
+            return table_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+    //新建编辑
+    public function add()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+			if (isset($param['buy_time'])) {
+                $param['buy_time'] = strtotime($param['buy_time']);
+            }
+			if (isset($param['quality_time'])) {
+                $param['quality_time'] = strtotime($param['quality_time']);
+            }
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(PurchasedValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['update_time'] = time();
+				$param['update_id'] = $this->uid;
+                $this->model->edit($param);
+            } else {
+                try {
+                    validate(PurchasedValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['create_time'] = time();
+                $param['contractin_id'] = $this->uid;
+                $this->model->add($param);
+            }
+        } else {
+            $id = isset($param['id']) ? $param['id'] : 0;
+            if($id>0){
+                $detail = $this->model->getById($id);
+				if($detail['file_ids'] !=''){
+					$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+					$detail['file_array'] = $file_array;
+				}
+                View::assign('detail', $detail);
+				return view('edit');
+            }
+            return view();
+        }
+    }
+	
+    //查看
+    public function view()
+    {
+        $param = get_params();
+		$id = isset($param['id']) ? $param['id'] : 0;
+		$detail = $this->model->getById($id);
+		if($detail['cate_id']>0){
+			$detail['cate'] = Db::name('PurchasedCate')->where('id',$detail['cate_id'])->value('title');
+		}
+		if($detail['file_ids'] !=''){
+			$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+			$detail['file_array'] = $file_array;
+		}
+		View::assign('detail', $detail);
+		return view();
+    }
+	
+    //设置
+    public function set()
+    {
+		$param = get_params();
+        $res = $this->model->strict(false)->field('id,status')->update($param);
+		if ($res) {
+			add_log('set', $param['id'], $param);
+			return to_assign();
+		}
+		else{
+			return to_assign(0, '操作失败');
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		$param = get_params();
+		$id = isset($param['id']) ? $param['id'] : 0;
+		if (request()->isDelete()) {
+			$this->model->delById($id);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+}
diff --git a/app/contract/controller/Purchasedcate.php b/app/contract/controller/Purchasedcate.php
new file mode 100644
index 0000000000000000000000000000000000000000..680c2a51f62594b82ea8a55a134c14831a6524cf
--- /dev/null
+++ b/app/contract/controller/Purchasedcate.php
@@ -0,0 +1,112 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\contract\controller;
+
+use app\base\BaseController;
+use app\contract\validate\PurchasedCateValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Purchasedcate extends BaseController
+{	
+	//类别
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+            $cate = Db::name('PurchasedCate')->order('create_time asc')->select();
+			$list = generateTree($cate);
+            return to_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+
+    //分类添加&编辑
+    public function add()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(PurchasedCateValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $note_array = get_cate_son('PurchasedCate',$param['id']);
+                if (in_array($param['pid'], $note_array)) {
+                    return to_assign(1, '父级分类不能是该分类本身或其子分类');
+                } else {
+                    $param['update_time'] = time();
+                    $res = Db::name('PurchasedCate')->strict(false)->field(true)->update($param);
+                    if($res){
+                        add_log('edit', $param['id'], $param);
+                        return to_assign();
+                    }
+                }
+            } else {
+                try {
+                    validate(PurchasedCateValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['create_time'] = time();
+                $insertId = Db::name('PurchasedCate')->strict(false)->field(true)->insertGetId($param);
+                if ($insertId) {
+                    add_log('add', $insertId, $param);
+                }
+                return to_assign();
+            }
+        } else {
+            $id = isset($param['id']) ? $param['id'] : 0;
+            $pid = isset($param['pid']) ? $param['pid'] : 0;
+			$cate = Db::name('PurchasedCate')->order('id desc')->select()->toArray();
+			$cates = set_recursion($cate);
+            if ($id > 0) {
+                $detail = Db::name('PurchasedCate')->where(['id' => $id])->find();
+                View::assign('detail', $detail);
+            }
+            View::assign('id', $id);
+            View::assign('pid', $pid);
+            View::assign('cates', $cates);
+            return view();
+        }
+    }
+
+    //删除分类
+    public function del()
+    {
+        $id = get_params("id");
+        $cate_count = Db::name('PurchasedCate')->where(["pid" => $id])->count();
+        if ($cate_count > 0) {
+            return to_assign(1, "该分类下还有子分类，无法删除");
+        }
+        $product_count = Db::name('Product')->where(["cate_id" => $id,'delete_time'=>0])->count();
+        if ($product_count > 0) {
+            return to_assign(1, "该分类下还有产品，无法删除");
+        }
+        if (Db::name('PurchasedCate')->delete($id) !== false) {
+            add_log('delete', $id);
+            return to_assign(0, "删除分类成功");
+        } else {
+            return to_assign(1, "删除失败");
+        }
+    }
+   
+   
+}
diff --git a/app/contract/controller/Services.php b/app/contract/controller/Services.php
new file mode 100644
index 0000000000000000000000000000000000000000..fd1365fc62a4dbce2a4f9d58df200c858ed8b100
--- /dev/null
+++ b/app/contract/controller/Services.php
@@ -0,0 +1,141 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\contract\controller;
+
+use app\base\BaseController;
+use app\contract\model\Services as ServicesModel;
+use app\contract\validate\ServicesValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Services extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new ServicesModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+            $list = $this->model->where('delete_time',0)->order('sort asc')->select();
+            return to_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {		
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(ServicesValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(ServicesValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				View::assign('detail', $detail);
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			View::assign('detail', $detail);
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		if (request()->isDelete()) {
+			$param = get_params();
+			$id = isset($param['id']) ? $param['id'] : 0;
+			$type = isset($param['type']) ? $param['type'] : 0;
+			$this->model->delById($id,$type);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+
+    /**
+    * 设置
+    */
+    public function set()
+    {
+		if (request()->isAjax()) {
+			$param = get_params();
+			$res = $this->model->strict(false)->field('id,status')->update($param);
+			if ($res) {
+				if($param['status'] == 0){
+					add_log('disable', $param['id'], $param);
+				}
+				else if($param['status'] == 1){
+					add_log('recovery', $param['id'], $param);
+				}
+				return to_assign();
+			}
+			else{
+				return to_assign(0, '操作失败');
+			}
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+   
+
+}
diff --git a/app/contract/controller/Supplier.php b/app/contract/controller/Supplier.php
new file mode 100644
index 0000000000000000000000000000000000000000..64828ec14e94d07b99cf136f04934db8c7c33992
--- /dev/null
+++ b/app/contract/controller/Supplier.php
@@ -0,0 +1,242 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\contract\controller;
+
+use app\base\BaseController;
+use app\contract\model\Supplier as SupplierModel;
+use app\contract\model\SupplierContact;
+use app\contract\validate\SupplierValidate;
+use app\contract\validate\SupplierContactValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Supplier extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new SupplierModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+            $where = [];
+			$where[]=['delete_time','=',0];
+            if (!empty($param['keywords'])) {
+                $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%'];
+            }
+            $list = $this->model->datalist($param,$where);
+            return table_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+    //新建编辑
+    public function add()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(SupplierValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['update_time'] = time();
+                $res = Db::name('Supplier')->strict(false)->update($param);
+                if ($res) {
+                    add_log('edit', $param['id'], $param);
+                }
+                return to_assign();
+            } else {
+                try {
+                    validate(SupplierValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['create_time'] = time();
+                $insertId = Db::name('Supplier')->strict(false)->insertGetId($param);
+                if ($insertId) {
+					if(!empty($param['c_name'])){
+						$contact = [
+							'name' => $param['c_name'],
+							'mobile' => $param['c_mobile'],
+							'sex' => $param['c_sex'],
+							'sid' => $insertId,
+							'is_default' => 1,
+							'create_time' => time(),
+							'admin_id' => $this->uid
+						];
+						Db::name('SupplierContact')->strict(false)->field(true)->insert($contact);
+					}
+                    add_log('add', $insertId, $param);
+                }
+                return to_assign();
+            }
+        } else {
+            $id = isset($param['id']) ? $param['id'] : 0;
+            if($id>0){
+                $detail = Db::name('Supplier')->where('id',$id)->find();
+				$detail['file_array'] = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+                View::assign('detail', $detail);
+				return view('edit');
+            }
+            return view();
+        }
+    }
+	
+    //查看
+    public function view()
+    {
+        $param = get_params();
+		$detail = Db::name('Supplier')->where('id',$param['id'])->find();
+		$detail['file_array'] = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+		View::assign('detail', $detail);
+		return view();
+    }
+	
+    //设置
+    public function set()
+    {
+		$param = get_params();
+        $res = Db::name('Supplier')->strict(false)->field('id,status')->update($param);
+		if ($res) {
+			if($param['status'] == 0){
+				add_log('disable', $param['id'], $param);
+			}
+			else if($param['status'] == 1){
+				add_log('recovery', $param['id'], $param);
+			}
+			return to_assign();
+		}
+		else{
+			return to_assign(0, '操作失败');
+		}
+    }  
+	
+	//删除
+    public function del()
+    {
+		if (request()->isDelete()) {
+			$params = get_params();
+			$count = Db::name('Purchase')->where(['supplier_id' => $params['id'],'delete_time'=>0])->count();
+			if($count>0){
+				return to_assign(1, "该供应商有采购合同存在，不准删除");
+			}
+			$data['id'] = $params['id'];
+			$data['delete_time'] = time();
+			if (Db::name('Supplier')->update($data) !== false) {
+				//删除客户联系人
+				Db::name('SupplierContact')->where(['sid' => $params['id']])->update(['delete_time'=>time()]);
+				return to_assign();
+			} else {
+				return to_assign(1, "操作失败");
+			}
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+	
+	
+    //添加供应商联系人
+    public function contact_add()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(SupplierContactValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['update_time'] = time();
+                $res = SupplierContact::strict(false)->field(true)->update($param);
+                if ($res) {
+                    add_log('edit', $param['id'], $param);
+                }
+                return to_assign();
+            } else {
+                try {
+                    validate(SupplierContactValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$count= SupplierContact::where(['sid' => $param['sid'],'delete_time' => 0])->count();
+				if($count == 0){
+					$param['is_default'] = 1;	
+				}
+                $param['admin_id'] = $this->uid;
+                $param['create_time'] = time();
+                $insertId = SupplierContact::strict(false)->field(true)->insertGetId($param);
+                if ($insertId) {
+                    add_log('add', $insertId, $param);
+                }
+                return to_assign();
+            }
+        } else {
+            $supplier_id = isset($param['sid']) ? $param['sid'] : 0;
+            $id = isset($param['id']) ? $param['id'] : 0;
+			if ($id > 0) {
+				View::assign('detail', (new SupplierContact())->detail($id));
+				return view('contact_edit');
+			}
+			$supplier_name = Db::name('Supplier')->where('id',$supplier_id)->value('title');
+            View::assign('supplier_id', $supplier_id);
+            View::assign('supplier_name', $supplier_name);
+            return view();
+        }
+	}
+	
+    //删除供应商联系人
+    public function contact_del()
+    {
+		if (request()->isDelete()) {
+			$param = get_params();
+			$contact = SupplierContact::where(['id' => $param['id']])->find();
+			if($contact['is_default'] == 1){
+				return to_assign(1, '供应商的首要联系人不能删除');
+			}
+			if($contact['admin_id'] != $this->uid){
+				return to_assign(1, '你不是该联系人的创建人，无权限删除');
+			}
+            $param['delete_time'] = time();
+			$res = SupplierContact::strict(false)->field(true)->update($param);
+			if ($res) {
+				add_log('edit', $param['id'], $param);
+				return to_assign();
+			} else {
+				return to_assign(1, '操作失败');
+			}
+        } else {
+           return to_assign(1, '参数错误');
+        }
+    }  
+}
diff --git a/app/contract/controller/Suppliercontact.php b/app/contract/controller/Suppliercontact.php
new file mode 100644
index 0000000000000000000000000000000000000000..a1da2c617d0ad82f46c927dfddf620b111050427
--- /dev/null
+++ b/app/contract/controller/Suppliercontact.php
@@ -0,0 +1,128 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\supplier\controller;
+
+use app\base\BaseController;
+use app\supplier\model\SupplierContact;
+use app\supplier\validate\SupplierContactCheck;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Contact extends BaseController
+{	
+    public function index()
+    {
+        if (request()->isAjax()) {
+            $param = get_params();
+            $where = array();
+            if (!empty($param['keywords'])) {
+                $where[] = ['a.id|a.name|a.mobile|s.title', 'like', '%' . $param['keywords'] . '%'];
+            }
+            $where[] = ['a.delete_time', '=', 0];
+            $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+            $content = SupplierContact::where($where)
+                ->field('a.*,s.title as supplier')
+                ->alias('a')
+                ->join('Supplier s', 'a.sid = s.id')
+                ->order('a.create_time desc')
+                ->paginate($rows, false, ['query' => $param])
+				->each(function ($item, $key) {
+                    $item->create_time = date('Y-m-d H:i:s', (int) $item->create_time);
+				});
+            return table_assign(0, '', $content);
+        } else {
+            return view();
+        }
+    }
+    //添加
+    public function add()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(SupplierContactCheck::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['update_time'] = time();
+                $res = Db::name('SupplierContact')->strict(false)->field(true)->update($param);
+                if ($res) {
+                    add_log('edit', $param['id'], $param);
+                }
+                return to_assign();
+            } else {
+                try {
+                    validate(SupplierContactCheck::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$count= Db::name('SupplierContact')->where(['sid' => $param['sid'],'delete_time' => 0])->count();
+				if($count == 0){
+					$param['is_default'] = 1;	
+				}
+                $param['admin_id'] = $this->uid;
+                $param['create_time'] = time();
+                $insertId = Db::name('SupplierContact')->strict(false)->field(true)->insertGetId($param);
+                if ($insertId) {
+                    add_log('add', $insertId, $param);
+                }
+                return to_assign();
+            }
+        } else {
+            $supplier_id = isset($param['sid']) ? $param['sid'] : 0;
+            $id = isset($param['id']) ? $param['id'] : 0;
+			if ($id > 0) {
+				View::assign('detail', (new SupplierContact())->detail($id));
+				return view('edit');
+			}
+			$supplier_name = Db::name('Supplier')->where('id',$supplier_id)->value('title');
+            View::assign('supplier_id', $supplier_id);
+            View::assign('supplier_name', $supplier_name);
+            return view();
+        }
+	}
+	
+    //设置
+    public function del()
+    {
+		if (request()->isDelete()) {
+			$param = get_params();
+			$contact = Db::name('SupplierContact')->where(['id' => $param['id']])->find();
+			if($contact['is_default'] == 1){
+				return to_assign(1, '供应商的首要联系人不能删除');
+			}
+			if($contact['admin_id'] != $this->uid){
+				return to_assign(1, '你不是该联系人的创建人，无权限删除');
+			}
+            $param['delete_time'] = time();
+			$res = SupplierContact::strict(false)->field(true)->update($param);
+			if ($res) {
+				add_log('edit', $param['id'], $param);
+				return to_assign();
+			} else {
+				return to_assign(1, '操作失败');
+			}
+        } else {
+           return to_assign(1, '参数错误');
+        }
+    }  
+   
+   
+}
diff --git a/app/contract/event.php b/app/contract/event.php
new file mode 100644
index 0000000000000000000000000000000000000000..4eff8908bd643cd6072b9fde6ee38ca4ad6f04ad
--- /dev/null
+++ b/app/contract/event.php
@@ -0,0 +1,5 @@
+<?php
+// 这是系统自动生成的event定义文件
+return [
+
+];
diff --git a/app/contract/middleware.php b/app/contract/middleware.php
new file mode 100644
index 0000000000000000000000000000000000000000..a500c6f3c49234d4b0e811c4c004f053b8dbd03c
--- /dev/null
+++ b/app/contract/middleware.php
@@ -0,0 +1,8 @@
+<?php
+// 这是系统自动生成的middleware定义文件
+return [
+    //开启session中间件
+    //'think\middleware\SessionInit',
+    //验证勾股OA是否完成安装
+    \app\home\middleware\Install::class,
+];
diff --git a/app/contract/model/Contract.php b/app/contract/model/Contract.php
new file mode 100644
index 0000000000000000000000000000000000000000..3b7a215cece4b192a78acc3a1de9052a2efea426
--- /dev/null
+++ b/app/contract/model/Contract.php
@@ -0,0 +1,196 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\contract\model;
+use think\model;
+use think\facade\Db;
+use app\api\model\EditLog;
+class Contract extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($param=[], $where=[], $whereOr=[])
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->where(function ($query) use($whereOr) {
+				if (!empty($whereOr)){
+					$query->whereOr($whereOr);
+				}
+			})
+			->order($order)
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key){
+				$types_title=contract_types_name($item->types);
+				$item->types_name = $types_title['title'];
+				$item->status_name = check_status_name($item->check_status);
+				$item->cate_title = Db::name('ContractCate')->where(['id' => $item->cate_id])->value('title');
+				$item->sign_name = Db::name('Admin')->where(['id' => $item->sign_uid])->value('name');
+				$item->sign_time = date('Y-m-d', $item->sign_time);
+				$item->interval_time = date('Y-m-d', $item->start_time) . ' 至 ' . date('Y-m-d', $item->end_time);
+                $item->delay = count_days(date("Y-m-d"),date('Y-m-d', $item->end_time));
+				if($item->keeper_uid>0){
+					$item->keeper_name = Db::name('Admin')->where(['id' => $item->keeper_uid])->value('name');
+				}
+				else{
+					$item->keeper_name='-';
+				}
+				if($item->archive_uid>0){
+					$item->archive_name = Db::name('Admin')->where(['id' => $item->archive_uid])->value('name');
+					$item->archive_time = date('Y-m-d', $item->archive_time);
+				}
+				else{
+					$item->archive_name='-';
+					$item->archive_time='-';
+				}
+				if($item->stop_uid>0){
+					$item->stop_name = Db::name('Admin')->where(['id' => $item->stop_uid])->value('name');
+					$item->stop_time = date('Y-m-d', $item->stop_time);
+				}
+				else{
+					$item->stop_name='-';
+					$item->stop_time='-';
+				}
+				if($item->void_uid>0){
+					$item->void_name = Db::name('Admin')->where(['id' => $item->void_uid])->value('name');
+					$item->void_time = date('Y-m-d', $item->void_time);
+				}
+				else{
+					$item->void_name='-';
+					$item->void_time='-';
+				}
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+			$log=new EditLog();
+			$log->add('Contract',$insertId);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+			$old = self::find($param['id']);
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+			$log=new EditLog();
+			$log->edit('Contract',$param['id'],$param,$old);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		$types_title=contract_types_name($info['types']);
+		$info['types_name'] = $types_title['title'];
+		$info['sign_time'] = date('Y-m-d', $info['sign_time']);
+		$info['start_time'] = date('Y-m-d', $info['start_time']);
+		$info['end_time'] = date('Y-m-d', $info['end_time']);
+		$info['sign_department'] = Db::name('Department')->where(['id' => $info['did']])->value('title');
+		$info['sign_name'] = Db::name('Admin')->where(['id' => $info['sign_uid']])->value('name');
+		$info['admin_name'] = Db::name('Admin')->where(['id' => $info['admin_id']])->value('name');
+		if($info['prepared_uid']>0){
+			$info['prepared_name'] = Db::name('Admin')->where(['id' => $info['prepared_uid']])->value('name');
+		}
+		else{
+			$info['prepared_name']='';
+		}
+		if($info['keeper_uid']>0){
+			$info['keeper_name'] = Db::name('Admin')->where(['id' => $info['keeper_uid']])->value('name');
+		}
+		else{
+			$info['keeper_name']='';
+		}
+		if($info['share_ids'] !=''){
+			$share_names = Db::name('Admin')->where([['id','in',$info['share_ids']]])->column('name');
+			$info['share_names'] = implode(',',$share_names);
+		}
+		else{
+			$info['share_names'] = '';
+		}
+		if($info['file_ids'] !=''){
+			$file_array = Db::name('File')->where('id','in',$info['file_ids'])->select()->toArray();
+			$info['file_array'] = $file_array;
+		}
+		else{
+			$info['file_array'] = [];
+		}
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/contract/model/ContractCate.php b/app/contract/model/ContractCate.php
new file mode 100644
index 0000000000000000000000000000000000000000..142396870100dbec43b6c173be2e6bc7cc1d2b72
--- /dev/null
+++ b/app/contract/model/ContractCate.php
@@ -0,0 +1,108 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\contract\model;
+use think\model;
+use think\facade\Db;
+class ContractCate extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)->order($order)->paginate(['list_rows'=> $rows]);
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/contract/model/Product.php b/app/contract/model/Product.php
new file mode 100644
index 0000000000000000000000000000000000000000..e670592c2b568339d22b9ff1bac900f5304d4348
--- /dev/null
+++ b/app/contract/model/Product.php
@@ -0,0 +1,115 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\contract\model;
+use think\model;
+use think\facade\Db;
+class Product extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'p.id desc' : $param['order'];
+        try {			
+            $list = self::where($where)
+				->field('p.*,pc.title as cate')
+				->alias('p')
+				->join('ProductCate pc', 'pc.id = p.cate_id', 'left')
+				->order($order)
+				->paginate(['list_rows'=> $rows])
+				->each(function ($item, $key){
+					$item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name');
+				});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['aid'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign();
+    }	
+
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
diff --git a/app/contract/model/Purchase.php b/app/contract/model/Purchase.php
new file mode 100644
index 0000000000000000000000000000000000000000..63179ea4625795a6c17888c733a202ce1ee70439
--- /dev/null
+++ b/app/contract/model/Purchase.php
@@ -0,0 +1,195 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\contract\model;
+use think\model;
+use think\facade\Db;
+use app\api\model\EditLog;
+class Purchase extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($param=[], $where=[], $whereOr=[])
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->where(function ($query) use($whereOr) {
+				if (!empty($whereOr)){
+					$query->whereOr($whereOr);
+				}
+			})
+			->order($order)
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key){
+				$item->status_name = check_status_name($item->check_status);
+				$types_title=purchase_types_name($item->types);
+				$item->types_name = $types_title['title'];
+				$item->cate_title = Db::name('ContractCate')->where(['id' => $item->cate_id])->value('title');
+				$item->sign_name = Db::name('Admin')->where(['id' => $item->sign_uid])->value('name');
+				$item->sign_time = date('Y-m-d', $item->sign_time);
+				$item->interval_time = date('Y-m-d', $item->start_time) . ' 至 ' . date('Y-m-d', $item->end_time);
+                $item->delay = count_days(date("Y-m-d"),date('Y-m-d', $item->end_time));
+				if($item->keeper_uid>0){
+					$item->keeper_name = Db::name('Admin')->where(['id' => $item->keeper_uid])->value('name');
+				}
+				else{
+					$item->keeper_name='-';
+				}
+				if($item->archive_uid>0){
+					$item->archive_name = Db::name('Admin')->where(['id' => $item->archive_uid])->value('name');
+					$item->archive_time = date('Y-m-d', $item->archive_time);
+				}
+				else{
+					$item->archive_name='-';
+					$item->archive_time='-';
+				}
+				if($item->stop_uid>0){
+					$item->stop_name = Db::name('Admin')->where(['id' => $item->stop_uid])->value('name');
+					$item->stop_time = date('Y-m-d', $item->stop_time);
+				}
+				else{
+					$item->stop_name='-';
+					$item->stop_time='-';
+				}
+				if($item->void_uid>0){
+					$item->void_name = Db::name('Admin')->where(['id' => $item->void_uid])->value('name');
+					$item->void_time = date('Y-m-d', $item->void_time);
+				}
+				else{
+					$item->void_name='-';
+					$item->void_time='-';
+				}
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+			$log=new EditLog();
+			$log->add('Purchase',$insertId);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+			$old = self::find($param['id']);
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+			$log=new EditLog();
+			$log->edit('Purchase',$param['id'],$param,$old);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		$types_title=purchase_types_name($info['types']);
+		$info['types_name'] = $types_title['title'];
+		$info['sign_time'] = date('Y-m-d', $info['sign_time']);
+		$info['start_time'] = date('Y-m-d', $info['start_time']);
+		$info['end_time'] = date('Y-m-d', $info['end_time']);
+		$info['sign_department'] = Db::name('Department')->where(['id' => $info['did']])->value('title');
+		$info['sign_name'] = Db::name('Admin')->where(['id' => $info['sign_uid']])->value('name');
+		$info['admin_name'] = Db::name('Admin')->where(['id' => $info['admin_id']])->value('name');
+		if($info['prepared_uid']>0){
+			$info['prepared_name'] = Db::name('Admin')->where(['id' => $info['prepared_uid']])->value('name');
+		}
+		else{
+			$info['prepared_name']='';
+		}
+		if($info['keeper_uid']>0){
+			$info['keeper_name'] = Db::name('Admin')->where(['id' => $info['keeper_uid']])->value('name');
+		}
+		else{
+			$info['keeper_name']='';
+		}
+		if($info['share_ids'] !=''){
+			$share_names = Db::name('Admin')->where([['id','in',$info['share_ids']]])->column('name');
+			$info['share_names'] = implode(',',$share_names);
+		}
+		else{
+			$info['share_names'] = '';
+		}
+		if($info['file_ids'] !=''){
+			$file_array = Db::name('File')->where('id','in',$info['file_ids'])->select()->toArray();
+			$info['file_array'] = $file_array;
+		}
+		else{
+			$info['file_array'] = [];
+		}
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/contract/model/Purchased.php b/app/contract/model/Purchased.php
new file mode 100644
index 0000000000000000000000000000000000000000..7cd8a06b42763156a9feb72da589a98b4ca67e56
--- /dev/null
+++ b/app/contract/model/Purchased.php
@@ -0,0 +1,115 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\contract\model;
+use think\model;
+use think\facade\Db;
+class Purchased extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'p.id desc' : $param['order'];
+        try {			
+            $list = self::where($where)
+				->field('p.*,pc.title as cate')
+				->alias('p')
+				->join('PurchasedCate pc', 'pc.id = p.cate_id', 'left')
+				->order($order)
+				->paginate(['list_rows'=> $rows])
+				->each(function ($item, $key){
+					$item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name');
+				});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['aid'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign();
+    }	
+
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
diff --git a/app/contract/model/Services.php b/app/contract/model/Services.php
new file mode 100644
index 0000000000000000000000000000000000000000..1d285672ba4cd983611050bb88f4040e27a633ac
--- /dev/null
+++ b/app/contract/model/Services.php
@@ -0,0 +1,108 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\contract\model;
+use think\model;
+use think\facade\Db;
+class Services extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)->order($order)->paginate(['list_rows'=> $rows]);
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/contract/model/Supplier.php b/app/contract/model/Supplier.php
new file mode 100644
index 0000000000000000000000000000000000000000..6f1154db54b287b0379f07842c7be2756b0235ba
--- /dev/null
+++ b/app/contract/model/Supplier.php
@@ -0,0 +1,116 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\contract\model;
+use think\model;
+use think\facade\Db;
+class Supplier extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($param=[], $where=[])
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->order($order)
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key){
+				$contact = Db::name('SupplierContact')->where(['is_default'=>1,'sid' => $item->id])->find();
+				if(!empty($contact)){
+					$item->user = $contact['name'];
+					$item->mobile = $contact['mobile'];
+				}
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
diff --git a/app/contract/model/SupplierContact.php b/app/contract/model/SupplierContact.php
new file mode 100644
index 0000000000000000000000000000000000000000..37ad3c02b2c5be06b665aa57547a9b0bae5f64b6
--- /dev/null
+++ b/app/contract/model/SupplierContact.php
@@ -0,0 +1,31 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\contract\model;
+
+use think\facade\Db;
+use think\Model;
+
+class SupplierContact extends Model
+{
+	// 获取详情
+    public function detail($id)
+    {
+        $detail = Db::name('SupplierContact')->where(['id' => $id])->find();
+        if (!empty($detail)) {
+            $detail['create_time'] = date('Y-m-d H:i:s', $detail['create_time']);
+			$detail['supplier'] = Db::name('Supplier')->where(['id' => $detail['sid']])->value('title');
+        }
+        return $detail;
+    }
+}
diff --git a/app/contract/validate/CateValidate.php b/app/contract/validate/CateValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..8275028af2c9532f12f6d0ab0aca4888f4dbbf32
--- /dev/null
+++ b/app/contract/validate/CateValidate.php
@@ -0,0 +1,43 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\contract\validate;
+use think\Validate;
+use think\facade\Db;
+
+class CateValidate extends Validate
+{
+	// 自定义验证规则
+	protected function checkOne($value,$rule,$data=[])
+	{
+		$id = isset($data['id'])?$data['id']:0;
+		$count = Db::name('ContractCate')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count();
+		return $count == 0 ? true : false;
+	}
+	
+    protected $rule = [
+		'title' => 'require|checkOne',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'title.require' => '名称不能为空',
+		'title.checkOne' => '同样的名称已经存在',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['title', 'id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/contract/validate/ContractValidate.php b/app/contract/validate/ContractValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..6cac9c9b5a879f954e8ac6457472fdc6d5529ca9
--- /dev/null
+++ b/app/contract/validate/ContractValidate.php
@@ -0,0 +1,54 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\contract\validate;
+use think\Validate;
+use think\facade\Db;
+
+class ContractValidate extends Validate
+{
+	// 自定义验证规则
+	protected function checkOne($value,$rule,$data=[])
+	{
+		$id = isset($data['id'])?$data['id']:0;
+		$count = Db::name('Contract')->where([['code','=',$data['code']],['id','<>',$id],['delete_time','=',0]])->count();
+		return $count == 0 ? true : false;
+	}
+	
+	protected function checkNumer($value,$rule,$data=[])
+	{
+		return is_numeric($value);
+	}
+	
+    protected $rule = [
+		'code' => 'require|checkOne',
+		'name' => 'require',
+        'cost'   => 'require|checkNumer',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'name.require' => '合同名称不能为空',
+		'code.require' => '合同编码不能为空',
+		'code.checkOne' => '同样的合同编码已经存在',
+        'cost.require' => '合同金额不能为空',
+        'cost.checkNumer' => '合同金额只能是数字',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['name','code','cost'],
+        'edit' => ['name','code','cost','id'],
+		'change' => ['id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/contract/validate/ProductCateValidate.php b/app/contract/validate/ProductCateValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..e1389c79d62e601dc8070cec6bd56b2841b474b2
--- /dev/null
+++ b/app/contract/validate/ProductCateValidate.php
@@ -0,0 +1,35 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\contract\validate;
+
+use think\Validate;
+
+class ProductCateValidate extends Validate
+{
+    protected $rule = [
+        'title' => 'require|unique:product_cate',
+        'id' => 'require',
+    ];
+
+    protected $message = [
+        'title.require' => '名称不能为空',
+        'title.unique' => '同样的名称已经存在',
+        'id.require' => '缺少更新条件',
+    ];
+
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['id', 'title'],
+    ];
+}
diff --git a/app/contract/validate/ProductValidate.php b/app/contract/validate/ProductValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..40a9110735824ea2d4cabc6cd283b04c868ec893
--- /dev/null
+++ b/app/contract/validate/ProductValidate.php
@@ -0,0 +1,35 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\contract\validate;
+
+use think\Validate;
+
+class ProductValidate extends Validate
+{
+    protected $rule = [
+        'title' => 'require|unique:product',
+        'id' => 'require',
+    ];
+
+    protected $message = [
+        'title.require' => '名称不能为空',
+        'title.unique' => '同样的名称已经存在',
+        'id.require' => '缺少更新条件',
+    ];
+
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['id', 'title'],
+    ];
+}
diff --git a/app/contract/validate/PurchaseValidate.php b/app/contract/validate/PurchaseValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..d9c0a136c08add52e1bd67ed7346ee25b88572b3
--- /dev/null
+++ b/app/contract/validate/PurchaseValidate.php
@@ -0,0 +1,54 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\contract\validate;
+use think\Validate;
+use think\facade\Db;
+
+class PurchaseValidate extends Validate
+{
+	// 自定义验证规则
+	protected function checkOne($value,$rule,$data=[])
+	{
+		$id = isset($data['id'])?$data['id']:0;
+		$count = Db::name('Purchase')->where([['code','=',$data['code']],['id','<>',$id],['delete_time','=',0]])->count();
+		return $count == 0 ? true : false;
+	}
+	
+	protected function checkNumer($value,$rule,$data=[])
+	{
+		return is_numeric($value);
+	}
+	
+    protected $rule = [
+		'code' => 'require|checkOne',
+		'name' => 'require',
+        'cost'   => 'require|checkNumer',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'name.require' => '合同名称不能为空',
+		'code.require' => '合同编码不能为空',
+		'code.checkOne' => '同样的合同编码已经存在',
+        'cost.require' => '合同金额不能为空',
+        'cost.checkNumer' => '合同金额只能是数字',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['name','code','cost'],
+        'edit' => ['name','code','cost','id'],
+		'change' => ['id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/contract/validate/PurchasedCateValidate.php b/app/contract/validate/PurchasedCateValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..c4e5061f9d2bd4a485592823c7589242d02587be
--- /dev/null
+++ b/app/contract/validate/PurchasedCateValidate.php
@@ -0,0 +1,35 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\contract\validate;
+
+use think\Validate;
+
+class PurchasedCateValidate extends Validate
+{
+    protected $rule = [
+        'title' => 'require|unique:purchased_cate',
+        'id' => 'require',
+    ];
+
+    protected $message = [
+        'title.require' => '名称不能为空',
+        'title.unique' => '同样的名称已经存在',
+        'id.require' => '缺少更新条件',
+    ];
+
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['id', 'title'],
+    ];
+}
diff --git a/app/contract/validate/PurchasedValidate.php b/app/contract/validate/PurchasedValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..633269464d041861548d8501def9900ef010481d
--- /dev/null
+++ b/app/contract/validate/PurchasedValidate.php
@@ -0,0 +1,35 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\contract\validate;
+
+use think\Validate;
+
+class PurchasedValidate extends Validate
+{
+    protected $rule = [
+        'title' => 'require|unique:purchased',
+        'id' => 'require',
+    ];
+
+    protected $message = [
+        'title.require' => '名称不能为空',
+        'title.unique' => '同样的名称已经存在',
+        'id.require' => '缺少更新条件',
+    ];
+
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['id', 'title'],
+    ];
+}
diff --git a/app/contract/validate/ServicesValidate.php b/app/contract/validate/ServicesValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..a185b11ec96d1cfd29e2f4c748a36ad08ea3abe7
--- /dev/null
+++ b/app/contract/validate/ServicesValidate.php
@@ -0,0 +1,43 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\contract\validate;
+use think\Validate;
+use think\facade\Db;
+
+class ServicesValidate extends Validate
+{
+	// 自定义验证规则
+	protected function checkOne($value,$rule,$data=[])
+	{
+		$id = isset($data['id'])?$data['id']:0;
+		$count = Db::name('Services')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count();
+		return $count == 0 ? true : false;
+	}
+	
+    protected $rule = [
+		'title' => 'require|checkOne',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'title.require' => '名称不能为空',
+		'title.checkOne' => '同样的名称已经存在',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['title', 'id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/contract/validate/SupplierContactValidate.php b/app/contract/validate/SupplierContactValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..20850c949808949259b32538c9b996985fe1f9f0
--- /dev/null
+++ b/app/contract/validate/SupplierContactValidate.php
@@ -0,0 +1,36 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\contract\validate;
+
+use think\Validate;
+
+class SupplierContactValidate extends Validate
+{
+    protected $rule = [
+        'name' => 'require',
+        'mobile' => 'require',
+        'id' => 'require',
+    ];
+
+    protected $message = [
+        'name.require' => '联系人姓名不能为空',
+        'mobile' => '手机号码不能为空',
+        'id.require' => '缺少更新条件',
+    ];
+
+    protected $scene = [
+        'add' => ['name','mobile'],
+        'edit' => ['id', 'name','mobile'],
+    ];
+}
diff --git a/app/contract/validate/SupplierValidate.php b/app/contract/validate/SupplierValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..f7b32fcc34c0b28f0eb2d75128f46b9686f6086a
--- /dev/null
+++ b/app/contract/validate/SupplierValidate.php
@@ -0,0 +1,35 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\contract\validate;
+
+use think\Validate;
+
+class SupplierValidate extends Validate
+{
+    protected $rule = [
+        'title' => 'require|unique:supplier',
+        'id' => 'require',
+    ];
+
+    protected $message = [
+        'title.require' => '名称不能为空',
+        'title.unique' => '同样的名称已经存在',
+        'id.require' => '缺少更新条件',
+    ];
+
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['id', 'title'],
+    ];
+}
diff --git a/app/contract/view/cate/add.html b/app/contract/view/cate/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..23e973f82c8278007f088f14ce48703e3867f3c8
--- /dev/null
+++ b/app/contract/view/cate/add.html
@@ -0,0 +1,49 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">合同分类</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">合同分类名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入合同分类名称" lay-reqText="请输入合同分类名称"class="layui-input" value="{$detail.title|default=''}">
+			</td>
+			<td class="layui-td-gray">排序</td>
+			<td>
+				<input type="text" name="sort" placeholder="请输入排序，数字" autocomplete="off" class="layui-input" value="{$detail.sort|default=''}">
+			</td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$detail.id|default=0}"/>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool'];
+
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/contract/cate/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/cate/datalist.html b/app/contract/view/cate/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..ccf0a372d63fe21e21dac17647c662133b0323c7
--- /dev/null
+++ b/app/contract/view/cate/datalist.html
@@ -0,0 +1,124 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<table class="layui-hide" id="table_contract_cate" lay-filter="table_contract_cate"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm add-new" type="button">+ 添加合同分类</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool;
+		
+		layui.pageTable = table.render({
+			elem: "#table_contract_cate"
+			,toolbar: '#toolbarDemo'
+			,url: "/contract/cate/datalist"
+			,page: false
+			,limit: 999
+			,cellMinWidth: 80
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',title: '类型名称'}
+				,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+					var html1='<span class="green">正常</span>';
+					var html2='<span class="yellow">禁用</span>';
+					if(d.status==1){
+						return html1;
+					}
+					else{
+						return html2;
+					}
+				}}
+				,{width:100,title: '操作', align:'center',ignoreExport:true,templet: function(d){
+					var html='';
+					var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+					if(d.status==1){
+						html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+					}
+					else{
+						html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+					}
+					return html;
+				}}
+			]]
+		});
+			
+		table.on('tool(table_contract_cate)',function (obj) {
+			if(obj.event === 'edit'){					
+				add_cate(obj.data.id,obj.data.title);
+			}
+			if(obj.event === 'disable'){
+				layer.confirm('确定要禁用该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/contract/cate/set", {id:obj.data.id,status: 0}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'open'){
+				layer.confirm('确定要启用该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/contract/cate/set", {id:obj.data.id,status:1}, callback);
+					layer.close(index);
+				});
+			}
+		});
+		
+		$('body').on('click','.add-new',function(){
+			add_cate(0,'');	
+		});
+		
+		function add_cate(id,val){
+			var title = '新增类型';
+			if(id>0){
+				title = '编辑类型';
+			}
+			layer.prompt({
+				title: title,
+				value: val,
+				yes: function(index, layero) {
+					// 获取文本框输入的值
+					var value = layero.find(".layui-layer-input").val();
+					if (value) {
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();				
+							}
+						}
+						tool.post("/contract/cate/add", {id: id,title: value}, callback);
+						layer.close(index);
+					} else {
+						layer.msg('请填写类型名称');
+					}
+				}
+			})
+		}
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/cate/view.html b/app/contract/view/cate/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..989b5c049ba532e134a8f81a73c60918d9cc30b1
--- /dev/null
+++ b/app/contract/view/cate/view.html
@@ -0,0 +1,16 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<h3 class="pb-3">合同分类详情</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">合同分类名称</td>
+			<td>{$detail.title|default=''}"></td>
+			<td class="layui-td-gray">排序</td>
+			<td>{$detail.sort|default=0}</td>
+		</tr>
+	</table>
+</div>
+{/block}
+<!-- /主体 -->
\ No newline at end of file
diff --git a/app/contract/view/contract/add.html b/app/contract/view/contract/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..8391512c1df0eddf2c1b828e0e387c83bde10e38
--- /dev/null
+++ b/app/contract/view/contract/add.html
@@ -0,0 +1,227 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">新增合同</h3>
+    <table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">合同名称<font>*</font></td>
+			<td colspan="3"><input type="text" name="name" value="" lay-verify="required" lay-reqText="请输入合同名称" autocomplete="off" placeholder="请输入合同名称" class="layui-input"></td>
+			<td class="layui-td-gray">合同性质</td>
+			<td>
+				<input type="hidden" name="types" value="{$types}">
+				{eq name="$types" value="1" }普通合同{/eq}
+				{eq name="$types" value="2" }产品合同{/eq}
+				{eq name="$types" value="3" }服务合同{/eq}
+			</td>
+		</tr>
+        <tr>
+			<td class="layui-td-gray">签约主体<span style="font-size:12px;">(乙方)</span><font>*</font></td>
+			<td colspan="3">
+				<select name="subject_id" lay-verify="required" lay-reqText="请选择签约主体公司">
+					<option value="">请选择签约主体公司</option>
+					{volist name=":get_base_data('Enterprise')" id="v"}
+					<option value="{$v.id}">{$v.title}</option>
+					{/volist}
+				</select>
+			</td>
+			<td class="layui-td-gray-2">合同始止日期<font>*</font></td>
+			<td id="barDate" style="width:320px;">
+				<div class="layui-input-inline" style="width:150px;">
+					<input type="text" class="layui-input" id="start_time" value="" placeholder="选择时间区间" readonly name="start_time" lay-verify="required" lay-reqText="请选择合同开始时间">
+				</div>
+				~
+				<div class="layui-input-inline" style="width:150px;">
+					<input type="text" class="layui-input" id="end_time" value="" placeholder="选择时间区间" readonly name="end_time" lay-verify="required" lay-reqText="请选择合同结束时间">
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">客户名称<span style="font-size:12px;">(甲方)</span><font>*</font></td>
+			<td colspan="3">			
+				{eq name="$is_customer" value="1"}
+				<input type="text" name="customer" autocomplete="off" value="" readonly lay-verify="required" lay-reqText="请输入客户名称" placeholder="请输入客户名称" class="layui-input customer-picker">				
+				{else/}
+				<input type="text" name="customer" autocomplete="off" value="" lay-verify="required" lay-reqText="请输入客户名称" placeholder="请输入客户名称" class="layui-input">				
+				{/eq}
+				<input type="hidden" name="customer_id" value="0">			
+			</td>
+			<td class="layui-td-gray">签约客户代表<font>*</font></td>
+			<td><input type="text" name="contact_name" value="" autocomplete="off" lay-verify="required" lay-reqText="请输入客户代表姓名" placeholder="请输入客户代表姓名" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">客户联系地址</td>
+			<td colspan="3"><input type="text" name="contact_address" value="" autocomplete="off" placeholder="请输入客户联系地址" class="layui-input"></td>
+			<td class="layui-td-gray">客户联系电话</td>
+			<td><input type="text" name="contact_mobile" value="" autocomplete="off" placeholder="请输入客户联系电话" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">合同金额<font>*</font></td>
+			<td>
+				{eq name="$types" value="1"}
+				<input type="text" name="cost" value="" lay-verify="required|number" lay-reqText="请输入合同金额，数字" placeholder="请输入合同金额，数字" autocomplete="off" class="layui-input">
+				{/eq}
+				{eq name="$types" value="2"}
+				<input type="text" name="cost" value="" lay-verify="required|number" lay-reqText="请完善产品信息" placeholder="完善产品信息，合同金额自动计算" readonly class="layui-input layui-input-readonly">
+				{/eq}
+				{eq name="$types" value="3"}
+				<input type="text" name="cost" value="" lay-verify="required|number" lay-reqText="请完善服务信息" placeholder="完善服务信息，合同金额自动计算" readonly class="layui-input layui-input-readonly">
+				{/eq}
+			</td>
+			<td class="layui-td-gray">合同类别<font>*</font></td>
+			<td>
+				<select name="cate_id" lay-verify="required" lay-reqText="请选择合同类别">
+					<option value="">请选择合同类别</option>
+					{volist name=":get_base_data('ContractCate');" id="vo"}
+					<option value="{$vo.id}">{$vo.title}</option>
+					{/volist}
+				</select>
+			</td>
+			<td class="layui-td-gray">合同编号<font>*</font></td>
+			<td><input type="text" name="code" value="{$codeno}" autocomplete="off" {eq name="$is_codeno" value="1"}readonly{/eq} lay-verify="required" lay-reqText="请输入合同编号" placeholder="请输入合同编号" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td colspan="6"><strong>签订信息</strong></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">合同签订人<font>*</font></td>
+			<td>
+				 <input type="text" name="sign_name" value="" autocomplete="off" readonly lay-verify="required" lay-reqText="请选择合同签订人" placeholder="请选择合同签订人" class="layui-input picker-diy">
+				 <input type="hidden" name="sign_uid" value="0">
+			</td>
+			<td class="layui-td-gray-2">合同所属部门<font>*</font></td>
+			<td>
+				<input type="text" name="sign_department" value="" autocomplete="off" readonly lay-verify="required" lay-reqText="请选择合同所属部门"  placeholder="请选择合同所属部门" class="layui-input picker-oa" data-types="department">
+			  	<input type="hidden" name="did" value="0">
+			</td>
+			<td class="layui-td-gray-2">合同签订日期<font>*</font></td>
+			<td><input type="text" name="sign_time" value="" readonly lay-verify="required" lay-reqText="请选择合同签订日期" placeholder="请选择合同签订日期" class="layui-input tool-time"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">合同制定人</td>
+			<td>
+				<input type="text" name="prepared_name" value="" readonly placeholder="请选择合同制定人" class="layui-input picker-admin">
+				<input type="hidden" name="prepared_uid" value="0">
+			</td>
+			<td class="layui-td-gray-2">合同保管人</td>
+			<td>
+				<input type="text" name="keeper_name"  value="" readonly placeholder="请选择合同保管人" class="layui-input picker-admin">
+				<input type="hidden" name="keeper_uid" value="0">
+			</td>
+			<td class="layui-td-gray">合同共享人员</td>
+			<td colspan="3">
+				<input type="text" name="share_names" value="" readonly placeholder="请选择共享人员" class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="share_ids" value="">
+			</td>
+		</tr>
+		{eq name="$types" value="2"}{include file="/contract/add_product"}{/eq}		
+		{eq name="$types" value="3"}{include file="/contract/add_service"}{/eq}	
+		<tr>
+			<td colspan="6"><strong>相关附件</strong></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">
+				<button type="button" class="layui-btn layui-btn-sm" id="uploadBtn"><i class="layui-icon"></i>附件上传</button>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" id="fileBoxInput" data-type="file" name="file_ids" value="">
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td colspan="6"><strong>备注信息</strong></td>
+		</tr>
+		<tr>
+			<td colspan="6"><textarea name="remark" placeholder="请输入备注信息" class="layui-textarea"></textarea></td>
+		</tr>
+    </table>
+	<div class="pt-4">
+		<input type="hidden" name="scene" value="add">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','oaPicker','uploadPlus'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,laydate = layui.laydate, oaPicker = layui.oaPicker,uploadPlus = layui.uploadPlus;
+		if(typeof product_fun==='function'){
+			product_fun(layui);
+		}
+		if(typeof service_fun==='function'){
+			service_fun(layui);
+		}
+		//日期范围
+		laydate.render({
+			elem: '#barDate',
+			range: ['#start_time', '#end_time']
+		});
+		//附件上传
+		var attachment = new uploadPlus({
+			"target":'uploadBtn',
+			"targetBox":'uploadBox'
+		});
+		
+		//选择员工弹窗        
+		$('body').on('click','.picker-diy',function () {
+			let that = $(this);
+			let ids=that.next().val()+'',names = that.val()+'';
+			oaPicker.employeeInit({
+				ids:ids,
+				names:names,
+				type:1,//1是单选，2是多选
+				callback:function(data){
+					//这里是选择后的回调方法，可以根据具体需求自定义写哦
+					let select_id=[],select_name=[];
+					for(var a=0; a<data.length;a++){
+						select_id.push(data[a].id);
+						select_name.push(data[a].name);
+					}
+					that.val(select_name.join(','));
+					that.next().val(select_id.join(','));
+				}
+			});
+		});
+		
+		//选择客户弹窗        
+		$('body').on('click','.customer-picker',function () {
+			let that = $(this),ids = [],titles=[],contact_name=[],contact_mobile=[],address=[],map = {},types = 'customer',type = 1;
+			let callback = function(data){
+				for ( var i = 0; i <data.length; i++){
+					ids.push(data[i].id);
+					titles.push(data[i].name);
+					contact_name.push(data[i].contact_name);
+					contact_mobile.push(data[i].contact_mobile);
+					address.push(data[i].address);
+				}
+				that.val(titles.join(','));
+				that.next().val(ids.join(','));
+				$('[name="contact_name"]').val(contact_name.join(','));
+				$('[name="contact_mobile"]').val(contact_mobile.join(','));
+				$('[name="contact_address"]').val(address.join(','));
+			}
+			oaPicker.picker(types,type,callback,map);
+		});
+		
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/contract/contract/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/contract/add_product.html b/app/contract/view/contract/add_product.html
new file mode 100644
index 0000000000000000000000000000000000000000..48fe9b7e5471c5d46c8692133a4237bca4ce9225
--- /dev/null
+++ b/app/contract/view/contract/add_product.html
@@ -0,0 +1,116 @@
+<tr>
+	<td colspan="6"><strong>产品信息</strong> <span class="layui-btn layui-btn-sm" type="button" id="productAdd">+ 添加产品</span></td>
+</tr>
+<tr>
+	<td colspan="6">				
+		<table id="productTable" class="layui-table layui-table-min" style="margin:0">
+			<tr>
+				<th width="200">产品名称</th>
+				<th width="100">单位</th>
+				<th width="100">规格</th>
+				<th width="100">销售单价</th>
+				<th width="100">数量</th>
+				<th width="100">小计</th>
+				<th>备注信息</th>
+				<th width="60">操作</th>
+			</tr>
+			<tr class="product-tr">
+				{eq name="is_product" value="1"}
+				<td><input type="text" name="product_title[]" value="" class="layui-input product-picker" readonly lay-verify="required" lay-reqText="请完善产品名称"><input type="hidden" name="product_id[]" value="0"></td>
+				{else/}
+				<td><input type="text" name="product_title[]" value="" class="layui-input" lay-verify="required" lay-reqText="请完善产品名称"><input type="hidden" name="product_id[]" value="0"></td>
+				{/eq}
+				<td><input type="text" name="product_unit[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入单位"></td>
+				<td><input type="text" name="product_specs[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入产品规格"></td>
+				<td><input type="text" name="product_price[]" value="0.00" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入销售单价"></td>
+				<td><input type="text" name="product_num[]" value="1" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入产品数量"></td>
+				<td><input type="text" name="product_subtotal[]" value="0.00" class="layui-input layui-input-readonly" readonly></td>
+				<td><input type="text" name="product_remark[]" value="" class="layui-input"></td>
+				<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>
+			</tr>
+		</table>
+	</td>
+</tr>
+<script>
+const is_product={$is_product};
+function product_fun(layui){
+	let form = layui.form,oaPicker = layui.oaPicker;
+	
+	//选择物品弹窗        
+	$('body').on('click','.product-picker',function () {
+		let that = $(this),ids = [],titles=[],sale_price=[],unit=[],specs=[],map = {},types = 'product',type = 1;
+		let callback = function(data){
+			for ( var i = 0; i <data.length; i++){
+				ids.push(data[i].id);
+				titles.push(data[i].title);
+				unit.push(data[i].unit);
+				specs.push(data[i].specs);
+				sale_price.push(data[i].sale_price);
+			}
+			that.val(titles.join(','));
+			that.next().val(ids.join(','));
+			that.parents('.product-tr').find('input').eq(2).val(unit.join(','));
+			that.parents('.product-tr').find('input').eq(3).val(specs.join(','));
+			that.parents('.product-tr').find('input').eq(4).val(sale_price.join(','));
+			that.parents('.product-tr').find('input').eq(6).val(sale_price.join(','));
+			count_cost();
+		}
+		oaPicker.picker(types,type,callback,map);
+	});
+	
+	//添加产品信息表格
+	$('#productAdd').on('click',function(){
+		var html = '',product_title=' class="layui-input"';
+		if(is_product==1){
+			product_title=' class="layui-input product-picker" readonly';
+		}
+		html += '<tr class="product-tr">\
+					<td><input type="text" name="product_title[]" value="" '+product_title+' lay-verify="required" lay-reqText="请完善产品名称"><input type="hidden" name="product_id[]" value="0"></td>\
+					<td><input type="text" name="product_unit[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入单位"></td>\
+					<td><input type="text" name="product_specs[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入产品规格"></td>\
+					<td><input type="text" name="product_price[]" value="0.00" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入销售单价"></td>\
+					<td><input type="text" name="product_num[]" value="1" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入产品数量"></td>\
+					<td><input type="text" name="product_subtotal[]" value="0.00" class="layui-input layui-input-readonly" readonly></td>\
+					<td><input type="text" name="product_remark[]" value="" class="layui-input"></td>\
+					<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>\
+				</tr>';
+		$('#productTable').append(html).find('.tr-none').remove();
+		form.render();
+	});	
+
+	$('#productTable').on('click', '[lay-event="del"]', function() {
+		if($('.product-tr').length<2){
+			layer.msg('至少保留一个产品选项');
+			return false;
+		}
+		$(this).parents('.product-tr').remove();
+		count_cost();
+	});	
+	
+	//计算价格
+	$('#productTable').on('input', '.input-num', function() {
+		var inputs = $(this).parents('.product-tr').find("input");
+		var product_price = inputs.eq(4).val();
+		var product_num = inputs.eq(5).val();
+		var product_amount = (product_price*product_num).toFixed(2);			  
+		if(isNaN(product_amount)){ 
+			product_amount = 0.00;
+		}
+		inputs.eq(6).val(product_amount);
+		count_cost();
+	});
+	 
+	//计算总价
+	function count_cost(){
+		var product_subtotal = $('#productTable').find('[name="product_subtotal[]"]');
+		var total = 0;
+		for (var m = 0; m < product_subtotal.length; m++) {
+			total+=$(product_subtotal[m]).val()*1000;
+		}
+		if(isNaN(total)){ 
+			total = 0;
+		}
+		$('[name="cost"]').val((total/1000).toFixed(2));
+	}
+}
+</script>
diff --git a/app/contract/view/contract/add_service.html b/app/contract/view/contract/add_service.html
new file mode 100644
index 0000000000000000000000000000000000000000..a3329591f27ce548af8b26c6f6913c2368ef3d62
--- /dev/null
+++ b/app/contract/view/contract/add_service.html
@@ -0,0 +1,109 @@
+<tr>
+	<td class="layui-td-gray" colspan="6" style="text-align:left; color:#666"><strong>服务信息</strong> <span class="layui-btn layui-btn-sm" type="button" id="serviceAdd">+ 添加服务</span></td>
+</tr>
+<tr>
+	<td colspan="6">				
+		<table id="serviceTable" class="layui-table layui-table-min" style="margin:0">
+			<tr>
+				<th width="200">服务名称</th>
+				<th width="200">服务周期</th>
+				<th width="100">服务单价</th>
+				<th width="100">服务次数</th>
+				<th width="100">小计</th>
+				<th>备注信息</th>
+				<th width="60">操作</th>
+			</tr>
+			<tr class="service-tr">
+				{eq name="is_service" value="1"}
+				<td><input type="text" name="service_title[]" value="" class="layui-input service-picker" readonly lay-verify="required" lay-reqText="请完善服务名称"><input type="hidden" name="service_id[]" value="0"></td>
+				{else/}
+				<td><input type="text" name="service_title[]" value="" class="layui-input" lay-verify="required" lay-reqText="请完善服务名称"><input type="hidden" name="service_id[]" value="0"></td>
+				{/eq}
+				<td><input type="text" name="service_date[]" value="" class="layui-input layui-input-readonly tool-time" data-range="到" lay-verify="required" lay-reqText="请选择服务周期" readonly></td>
+				<td><input type="text" name="service_price[]" value="0.00" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务单价"></td>
+				<td><input type="text" name="service_num[]" value="1" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务次数"></td>
+				<td><input type="text" name="service_subtotal[]" value="0.00" class="layui-input layui-input-readonly" readonly></td>
+				<td><input type="text" name="service_remark[]" value="" class="layui-input"></td>
+				<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>
+			</tr>
+		</table>
+	</td>
+</tr>
+<script>
+const is_service={$is_service};
+function product_fun(layui){
+	let form = layui.form,oaPicker = layui.oaPicker;
+	
+	//选择物品弹窗        
+	$('body').on('click','.service-picker',function () {
+		let that = $(this),ids = [],titles=[],price=[],map = {},types = 'services',type = 1;
+		let callback = function(data){
+			for ( var i = 0; i <data.length; i++){
+				ids.push(data[i].id);
+				titles.push(data[i].title);
+				price.push(data[i].price);
+			}
+			that.val(titles.join(','));
+			that.next().val(ids.join(','));
+			that.parents('.service-tr').find('input').eq(3).val(price.join(','));
+			that.parents('.service-tr').find('input').eq(5).val(price.join(','));
+			count_cost();
+		}
+		oaPicker.picker(types,type,callback,map);
+	});
+	
+	//添加服务信息表格
+	$('#serviceAdd').on('click',function(){
+		var html = '',service_title=' class="layui-input"';
+		if(is_service==1){
+			service_title=' class="layui-input service-picker" readonly';
+		}
+		html += '<tr class="service-tr">\
+					<td><input type="text" name="service_title[]" value="" '+service_title+' lay-verify="required" lay-reqText="请完善服务名称"><input type="hidden" name="service_id[]" value="0"></td>\
+					<td><input type="text" name="service_date[]" value="" class="layui-input layui-input-readonly tool-time" data-range="到" lay-verify="required" lay-reqText="请选择服务周期" readonly></td>\
+					<td><input type="text" name="service_price[]" value="0.00" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务单价"></td>\
+					<td><input type="text" name="service_num[]" value="1" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务次数"></td>\
+					<td><input type="text" name="service_subtotal[]" value="0.00" class="layui-input layui-input-readonly" readonly></td>\
+					<td><input type="text" name="service_remark[]" value="" class="layui-input"></td>\
+					<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>\
+				</tr>';
+		$('#serviceTable').append(html).find('.tr-none').remove();
+		form.render();
+	});
+
+	$('#serviceTable').on('click', '[lay-event="del"]', function() {
+		if($('.service-tr').length<2){
+			layer.msg('至少保留一个服务选项');
+			return false;
+		}
+		$(this).parents('.service-tr').remove();
+		count_cost();
+	});	
+	
+	//计算价格
+	$('#serviceTable').on('input', '.input-num', function() {
+		var inputs = $(this).parents('.service-tr').find("input");
+		var service_price = inputs.eq(3).val();
+		var service_num = inputs.eq(4).val();
+		var service_amount = (service_price*service_num).toFixed(2);			  
+		if(isNaN(service_amount)){ 
+			service_amount = 0.00;
+		}
+		inputs.eq(5).val(service_amount);
+		count_cost();
+	});
+	 
+	//计算总价
+	function count_cost(){
+		var service_subtotal = $('#serviceTable').find('[name="service_subtotal[]"]');
+		var total = 0;
+		for (var m = 0; m < service_subtotal.length; m++) {
+			total+=$(service_subtotal[m]).val()*1000;
+		}
+		if(isNaN(total)){ 
+			total = 0;
+		}
+		$('[name="cost"]').val((total/1000).toFixed(2));
+	}
+}
+</script>
diff --git a/app/contract/view/contract/add_types.html b/app/contract/view/contract/add_types.html
new file mode 100644
index 0000000000000000000000000000000000000000..1ea93dfa40deb99d5fc674e97cec53d17b058fbb
--- /dev/null
+++ b/app/contract/view/contract/add_types.html
@@ -0,0 +1,31 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">新增合同</h3>
+    <table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray-2">选择合同性质</td>
+			<td>
+				<div class="layui-btn-group">
+				  <a href="/contract/contract/add?types=1" class="layui-btn">普通合同</a>
+				  <a href="/contract/contract/add?types=2" class="layui-btn">产品合同</a>
+				  <a href="/contract/contract/add?types=3" class="layui-btn">服务合同</a>
+				</div>
+			</td>
+		</tr>
+    </table>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/contract/archivelist.html b/app/contract/view/contract/archivelist.html
new file mode 100644
index 0000000000000000000000000000000000000000..8d7d2e42cd6379c72cb6ffc7611caee004874d41
--- /dev/null
+++ b/app/contract/view/contract/archivelist.html
@@ -0,0 +1,178 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<div class="layui-card border-x border-t" style="margin-bottom:0; box-shadow:0 0 0 0 rgb(5 32 96 / 0%)">
+		<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
+			<ul class="layui-tab-title">
+				<li class="layui-this"><a href="/contract/contract/archivelist">销售合同</a></li>
+				<li><a href="/contract/purchase/archivelist">采购合同</a></li>
+			</ul>
+		</div> 
+	</div> 
+	<form class="layui-form gg-form-bar border-x">
+		<div class="layui-input-inline" style="width:128px;">
+			<select name="types">
+				<option value="">选择合同性质</option>
+				<option value="1">普通合同</option>
+				<option value="2">产品合同</option>
+				<option value="3">服务合同</option>
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:128px;">
+			<select name="cate_id">
+				<option value="">选择合同类别</option>
+				{volist name=":get_base_data('ContractCate');" id="vo"}
+				<option value="{$vo.id}">{$vo.title}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:175px;">
+			<input type="text" class="layui-input" id="sign_time" placeholder="选择合同签订日期" readonly name="sign_time">
+		</div>
+		<div class="layui-input-inline" style="width:175px;">
+			<input type="text" class="layui-input" id="end_time" placeholder="选择合同到期日期" readonly name="end_time">
+		</div>
+		<div class="layui-input-inline" style="width:220px;">
+			<input type="text" name="keywords" placeholder="输入关键字，合同编号/合同名称" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<input type="hidden" name="tab" value="0" />
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_contract" lay-filter="table_contract"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+	<h3>归档合同</h3>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const delay_num = {$delay_num|default=30};
+	const moduleInit = ['tool','tablePlus','laydatePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus,dropdown = layui.dropdown, tool = layui.tool,laydatePlus = layui.laydatePlus;
+		//日期范围
+		var sign_time = new laydatePlus({'target':'sign_time'});
+		var end_time = new laydatePlus({'target':'end_time'});
+		layui.pageTable = table.render({
+			elem: "#table_contract"
+			, toolbar: "#toolbarDemo"
+			,url: "/contract/contract/archivelist"
+			,is_excel: true
+			,page: true
+			,limit: 20
+			,cellMinWidth: 60
+			,height: 'full-152'
+			,cols: [[ //表头
+				{
+					field: 'id',
+					title: 'ID号',
+					align: 'center',
+					width: 80
+				},{
+					field: 'code',
+					title: '合同编号',
+					align: 'center',
+					width: 150
+				},{
+					field: 'name',
+					title: '合同名称',
+					minWidth:240,
+					templet: '<div><a data-href="/contract/contract/view/id/{{d.id}}.html" class="side-a">{{d.name}}</a></div>'
+				},{
+					field: 'cate_title',
+					title: '合同类别',
+					align: 'center',
+					width: 100
+				},{
+					field: 'types_name',
+					title: '合同性质',
+					align: 'center',
+					width: 80,
+					templet: function (d) {
+						var html = '<span class="layui-color-' + d.types + '">' + d.types_name + '</span>';
+						return html;
+					}
+				},{
+					field: 'interval_time',
+					title: '合同有效时间',
+					align: 'center',
+					width: 248,
+					templet: function (d) {
+						var html = d.interval_time;
+						if (d.delay > 0 && d.delay < delay_num) {
+							html += '<span class="red ml-1" style="font-size:12px;">' + d.delay + '天后到期</span>';
+						}
+						if (d.delay == 0) {
+							html += '<span class="red ml-1" style="font-size:12px;">已过期</span>';
+						}
+						return html;
+					}
+				},{
+					field: 'cost',
+					title: '合同金额(元)',
+					align: 'right',
+					width: 100
+				},{
+					field: 'archive_name',
+					title: '归档人',
+					align: 'center',
+					width: 80
+				},{
+					field: 'archive_time',
+					title: '归档日期',
+					align: 'center',
+					width: 90
+				},{
+					field: 'sign_name',
+					title: '签定人',
+					align: 'center',
+					width: 80
+				},{
+					field: 'sign_time',
+					title: '签订日期',
+					align: 'center',
+					width: 90
+				},{
+					field: 'keeper_name',
+					title: '保管人',
+					align: 'center',
+					width: 80
+				},{
+					field: 'right',
+					fixed:'right',
+					title: '操作',
+					width: 60,
+					align: 'center',
+					ignoreExport:true,
+					templet: function (d) {
+						var btn0='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</span>';
+						return btn0;
+					}						
+				}
+			]]
+		});
+			
+		table.on('tool(table_contract)',function (obj) {
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/contract/contract/view?id="+data.id);
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/contract/datalist.html b/app/contract/view/contract/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..98d80c888fd1fca68281d99b8802166c950edd5f
--- /dev/null
+++ b/app/contract/view/contract/datalist.html
@@ -0,0 +1,251 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<div class="layui-card border-x border-t" style="margin-bottom:0; box-shadow:0 0 0 0 rgb(5 32 96 / 0%)">
+		<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
+			<ul class="layui-tab-title">
+				<li class="layui-this">全部</li>
+				<li>待我审批</li>
+				<li>我已审批</li>
+			</ul>
+		</div> 
+	</div> 
+	<form class="layui-form gg-form-bar border-x" id="barsearchform">
+		{gt name="$is_auth" value="0"}
+		<div class="layui-input-inline user-name" style="width:90px;">
+			<input type="text" name="username" placeholder="选择签定人" class="layui-input picker-admin" readonly />
+			<input type="text" name="uid" value="" style="display:none" />	
+		</div>
+		{else/}
+		{gt name="$is_leader" value="0"}
+		<div class="layui-input-inline user-name" style="width:90px;">
+			<input type="text" name="username" placeholder="选择签定人" class="layui-input picker-sub" readonly />
+			<input type="text" name="uid" value="" style="display:none" />	
+		</div>
+		{/gt}
+		{/gt}
+		<div class="layui-input-inline" style="width:122px;">
+			<select name="types">
+				<option value="">选择合同性质</option>
+				<option value="1">普通合同</option>
+				<option value="2">产品合同</option>
+				<option value="3">服务合同</option>
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:122px;">
+			<select name="cate_id">
+				<option value="">选择合同类别</option>
+				{volist name=":get_base_data('ContractCate');" id="vo"}
+				<option value="{$vo.id}">{$vo.title}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:122px;">
+			<select name="check_status">
+				<option value="">选择审批状态</option>
+				{volist name=":get_check_status()" id="vo"}
+				<option value="{$key}">{$vo}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:175px;">
+			<input type="text" class="layui-input" id="sign_time" placeholder="选择合同签订日期" readonly name="sign_time">
+		</div>
+		<div class="layui-input-inline" style="width:175px;">
+			<input type="text" class="layui-input" id="end_time" placeholder="选择合同到期日期" readonly name="end_time">
+		</div>
+		<div class="layui-input-inline" style="width:220px;">
+			<input type="text" name="keywords" placeholder="输入关键字，合同编号/合同名称" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<input type="hidden" name="tab" value="0" />
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_contract" lay-filter="table_contract"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+	<button class="layui-btn layui-btn-sm" lay-event="add">
+		<span>+ 添加合同</span>
+		<i class="layui-icon layui-icon-down layui-font-12"></i>
+	</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const delay_num = {$delay_num|default=30};
+	const contract_types = [{"id":1,"title":"普通合同"},{"id":2,"title":"产品合同"},{"id":3,"title":"服务合同"}];
+	const moduleInit = ['tool','tablePlus','laydatePlus','oaPicker'];
+	function gouguInit() {
+		var table = layui.tablePlus,dropdown = layui.dropdown,element = layui.element, tool = layui.tool,laydatePlus = layui.laydatePlus;
+		
+		//tab切换
+		element.on('tab(tab)', function(data){
+			$('[name="tab"]').val(data.index);
+			$("#barsearchform")[0].reset();
+			layui.pageTable.reload({where:{tab:data.index},page:{curr:1}});
+			return false;
+		});
+		
+		//日期范围
+		var sign_time = new laydatePlus({'target':'sign_time'});
+		var end_time = new laydatePlus({'target':'end_time'});
+		
+		layui.pageTable = table.render({
+			elem: "#table_contract"
+			,title: "销售合同列表"
+			,toolbar: "#toolbarDemo"
+			,url: "/contract/contract/datalist"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 80
+			,height: 'full-152'
+			,cols: [[ //表头
+				{
+					field: 'id',
+					title: 'ID号',
+					align: 'center',
+					width: 80
+				},{ field: 'check_status', title: '审批状态', align: 'center', width: 110, templet: function (d) {
+					var html = '<span class="check-status-color-' + d.check_status + '">『' + d.status_name + '』</span>';
+					return html;
+					}
+				},{
+					field: 'code',
+					title: '合同编号',
+					align: 'center',
+					width: 150
+				},{
+					field: 'name',
+					title: '合同名称',
+					minWidth:240,
+					templet: '<div><a data-href="/contract/contract/view/id/{{d.id}}.html" class="side-a">{{d.name}}</a></div>'
+				},{
+					field: 'cate_title',
+					title: '合同类别',
+					align: 'center',
+					width: 100
+				},{
+					field: 'types_name',
+					title: '合同性质',
+					align: 'center',
+					width: 80,
+					templet: function (d) {
+						var html = '<span class="layui-color-' + d.types + '">' + d.types_name + '</span>';
+						return html;
+					}
+				},{
+					field: 'interval_time',
+					title: '合同有效时间',
+					align: 'center',
+					width: 248,
+					templet: function (d) {
+						var html = d.interval_time;
+						if (d.delay > 0 && d.delay < delay_num) {
+							html += '<span class="red ml-1" style="font-size:12px;">' + d.delay + '天后到期</span>';
+						}
+						if (d.delay == 0) {
+							html += '<span class="red ml-1" style="font-size:12px;">已过期</span>';
+						}
+						return html;
+					}
+				},{
+					field: 'cost',
+					title: '合同金额(元)',
+					align: 'right',
+					width: 100
+				},{
+					field: 'sign_name',
+					title: '签定人',
+					align: 'center',
+					width: 80
+				},{
+					field: 'keeper_name',
+					title: '保管人',
+					align: 'center',
+					width: 80
+				},{
+					field: 'sign_time',
+					title: '签订日期',
+					align: 'center',
+					width: 100
+				},{
+					field: 'right',
+					fixed:'right',
+					title: '操作',
+					width: 120,
+					align: 'center',
+					ignoreExport:true,
+					templet: function (d) {
+						var html = '<div class="layui-btn-group">';
+						var btn0='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</span>';
+						var btn1='<span class="layui-btn layui-btn-xs" lay-event="edit">编辑</span>';
+						var btn2='<span class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</span>';
+						if(d.check_status==0 || d.check_status==4){
+							return html+btn0+btn1+btn2+'</div>';
+						}
+						else{
+							return btn0;
+						}
+					}						
+				}
+			]]
+		});
+		
+		//表头工具栏事件
+		table.on('toolbar(table_contract)', function(obj){
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = checkStatus.data;
+			var that = this;
+			if (obj.event === 'add'){
+				  dropdown.render({
+					elem: that,
+					show: true, // 外部事件触发即显示
+					data: contract_types,
+					click: function(obj){
+						tool.side("/contract/contract/add?types="+obj.id);
+					}
+				  });
+				return;
+			}
+		});	
+			
+		table.on('tool(table_contract)',function (obj) {
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/contract/contract/view?id="+data.id);
+				return;
+			}
+			if (obj.event === 'edit') {
+				tool.side("/contract/contract/add?id="+data.id);
+				return;
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要删除该合同吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/contract/contract/del", { id: data.id }, callback);
+					layer.close(index);
+				});
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/contract/edit.html b/app/contract/view/contract/edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..91a847dee8744b513ae24961d61021dbf9d5ada3
--- /dev/null
+++ b/app/contract/view/contract/edit.html
@@ -0,0 +1,228 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">编辑合同</h3>
+    <table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">合同名称<font>*</font></td>
+			<td colspan="3"><input type="text" name="name" value="{$detail.name}" lay-verify="required" lay-reqText="请输入合同名称" autocomplete="off" placeholder="请输入合同名称" class="layui-input"></td>
+			<td class="layui-td-gray">合同性质</td>
+			<td>{$detail.types_name}</td>
+		</tr>
+        <tr>
+			<td class="layui-td-gray">签约主体<span style="font-size:12px;">(乙方)</span><font>*</font></td>
+			<td colspan="3">
+				<select name="subject_id" lay-verify="required" lay-reqText="请选择签约主体公司">
+					<option value="">请选择签约主体公司</option>
+					{volist name=":get_base_data('Enterprise')" id="v"}
+					<option value="{$v.id}" {eq name="$v.id" value="$detail.subject_id" } selected{/eq}>{$v.title}</option>
+					{/volist}
+				</select>
+			</td>
+			<td class="layui-td-gray-2">合同始止日期<font>*</font></td>
+			<td id="barDate" style="width:320px;">
+				<div class="layui-input-inline" style="width:150px;">
+					<input type="text" class="layui-input" id="start_time" value="{$detail.start_time}" placeholder="选择时间区间" readonly name="start_time" lay-verify="required" lay-reqText="请选择合同开始时间">
+				</div>
+				~
+				<div class="layui-input-inline" style="width:150px;">
+					<input type="text" class="layui-input" id="end_time" value="{$detail.end_time}" placeholder="选择时间区间" readonly name="end_time" lay-verify="required" lay-reqText="请选择合同结束时间">
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">客户名称<span style="font-size:12px;">(甲方)</span><font>*</font></td>
+			<td colspan="3">			
+				{eq name="$is_customer" value="1"}
+				<input type="text" name="customer" autocomplete="off" value="{$detail.customer}" readonly lay-verify="required" lay-reqText="请输入客户名称" placeholder="请输入客户名称" class="layui-input customer-picker">				
+				{else/}
+				<input type="text" name="customer" autocomplete="off" value="{$detail.customer}" lay-verify="required" lay-reqText="请输入客户名称" placeholder="请输入客户名称" class="layui-input">				
+				{/eq}
+				<input type="hidden" name="customer_id" value="{$detail.customer_id}">			
+			</td>
+			<td class="layui-td-gray">签约客户代表<font>*</font></td>
+			<td><input type="text" name="contact_name" value="{$detail.contact_name}" autocomplete="off" lay-verify="required" lay-reqText="请输入客户代表姓名" placeholder="请输入客户代表姓名" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">客户联系地址</td>
+			<td colspan="3"><input type="text" name="contact_address" value="{$detail.contact_address}" autocomplete="off" placeholder="请输入客户联系地址" class="layui-input"></td>
+			<td class="layui-td-gray">客户联系电话</td>
+			<td><input type="text" name="contact_mobile" value="{$detail.contact_mobile}" autocomplete="off" placeholder="请输入客户联系电话" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">合同金额<font>*</font></td>
+			<td>
+				{eq name="$detail.types" value="1"}
+				<input type="text" name="cost" value="{$detail.cost}" lay-verify="required|number" lay-reqText="请输入合同金额，数字" placeholder="请输入合同金额，数字" autocomplete="off" class="layui-input">
+				{/eq}
+				{eq name="$detail.types" value="2"}
+				<input type="text" name="cost" value="{$detail.cost}" lay-verify="required|number" lay-reqText="请完善产品信息" placeholder="完善产品信息，合同金额自动计算" readonly class="layui-input layui-input-readonly">
+				{/eq}
+				{eq name="$detail.types" value="3"}
+				<input type="text" name="cost" value="{$detail.cost}" lay-verify="required|number" lay-reqText="请完善服务信息" placeholder="完善服务信息，合同金额自动计算" readonly class="layui-input layui-input-readonly">
+				{/eq}
+			</td>
+			<td class="layui-td-gray">合同类别<font>*</font></td>
+			<td>
+				<select name="cate_id" lay-verify="required" lay-reqText="请选择合同类别">
+					<option value="">请选择合同类别</option>
+					{volist name=":get_base_data('ContractCate');" id="vo"}
+					<option value="{$vo.id}" {eq name="$vo.id" value="$detail.cate_id"} selected{/eq}>{$vo.title}</option>
+					{/volist}
+				</select>
+			</td>
+			<td class="layui-td-gray">合同编号<font>*</font></td>
+			<td><input type="text" name="code" value="{$detail.code}" autocomplete="off" {eq name="$is_codeno" value="1"}readonly{/eq} lay-verify="required" lay-reqText="请输入合同编号" placeholder="请输入合同编号" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td colspan="6"><strong>签订信息</strong></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">合同签订人<font>*</font></td>
+			<td>
+				 <input type="text" name="sign_name" value="{$detail.sign_name}" autocomplete="off" readonly lay-verify="required" lay-reqText="请选择合同签订人" placeholder="请选择合同签订人" class="layui-input picker-diy">
+				 <input type="hidden" name="sign_uid" value="{$detail.sign_uid}">
+			</td>
+			<td class="layui-td-gray-2">合同所属部门<font>*</font></td>
+			<td>
+				<input type="text" name="sign_department" value="{$detail.sign_department}" autocomplete="off" readonly lay-verify="required" lay-reqText="请选择合同所属部门"  placeholder="请选择合同所属部门" class="layui-input picker-oa" data-types="department">
+			  	<input type="hidden" name="did" value="{$detail.did}">
+			</td>
+			<td class="layui-td-gray-2">合同签订日期<font>*</font></td>
+			<td><input type="text" name="sign_time" value="{$detail.sign_time}" readonly lay-verify="required" lay-reqText="请选择合同签订日期" placeholder="请选择合同签订日期" class="layui-input tool-time"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">合同制定人</td>
+			<td>
+				<input type="text" name="prepared_name" value="{$detail.prepared_name}" autocomplete="off" readonly placeholder="请选择合同制定人" class="layui-input picker-admin">
+				<input type="hidden" name="prepared_uid" value="{$detail.prepared_uid}">
+			</td>
+			<td class="layui-td-gray-2">合同保管人</td>
+			<td>
+				<input type="text" name="keeper_name" value="{$detail.keeper_name}" autocomplete="off" readonly placeholder="请选择合同保管人" class="layui-input picker-admin">
+				<input type="hidden" name="keeper_uid" value="{$detail.keeper_uid}">
+			</td>
+			<td class="layui-td-gray">合同共享人员</td>
+			<td colspan="3">
+				<input type="text" name="share_names" value="{$detail.share_names}" autocomplete="off" readonly placeholder="请选择共享人员" class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="share_ids" value="{$detail.share_ids}">
+			</td>
+		</tr>
+		{eq name="$detail.types" value="2"}{include file="/contract/edit_product"}{/eq}		
+		{eq name="$detail.types" value="3"}{include file="/contract/edit_service"}{/eq}	
+		<tr>
+			<td colspan="6"><strong>相关附件</strong></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">
+				<button type="button" class="layui-btn layui-btn-sm" id="uploadBtn"><i class="layui-icon"></i>附件上传</button>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids}">
+					{notempty name="$detail.file_ids"}
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td colspan="6"><strong>备注信息</strong></td>
+		</tr>
+		<tr>
+			<td colspan="6"><textarea name="remark" placeholder="请输入备注信息" class="layui-textarea">{$detail.remark|default=''}</textarea></td>
+		</tr>
+    </table>
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$detail.id}">
+		<input type="hidden" name="types" value="{$detail.types}">
+		<input type="hidden" name="scene" value="edit">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','oaPicker','uploadPlus'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,laydate = layui.laydate, oaPicker = layui.oaPicker,uploadPlus = layui.uploadPlus;
+		if(typeof product_fun==='function'){
+			product_fun(layui);
+		}
+		if(typeof service_fun==='function'){
+			service_fun(layui);
+		}
+		//日期范围
+		laydate.render({
+			elem: '#barDate',
+			range: ['#start_time', '#end_time']
+		});
+		//附件上传
+		var attachment = new uploadPlus({
+			"target":'uploadBtn',
+			"targetBox":'uploadBox'
+		});
+		//选择员工弹窗        
+		$('body').on('click','.picker-diy',function () {
+			let that = $(this);
+			let ids=that.next().val()+'',names = that.val()+'';
+			oaPicker.employeeInit({
+				ids:ids,
+				names:names,
+				type:1,//1是单选，2是多选
+				callback:function(data){
+					//这里是选择后的回调方法，可以根据具体需求自定义写哦
+					let select_id=[],select_name=[];
+					for(var a=0; a<data.length;a++){
+						select_id.push(data[a].id);
+						select_name.push(data[a].name);
+					}
+					that.val(select_name.join(','));
+					that.next().val(select_id.join(','));
+				}
+			});
+		});
+		
+		//选择客户弹窗        
+		$('body').on('click','.customer-picker',function () {
+			let that = $(this),ids = [],titles=[],contact_name=[],contact_mobile=[],address=[],map = {},types = 'customer',type = 1;
+			let callback = function(data){
+				for ( var i = 0; i <data.length; i++){
+					ids.push(data[i].id);
+					titles.push(data[i].title);
+					contact_name.push(data[i].contact_name);
+					contact_mobile.push(data[i].contact_mobile);
+					address.push(data[i].address);
+				}
+				that.val(titles.join(','));
+				that.next().val(ids.join(','));
+				$('[name="contact_name"]').val(contact_name.join(','));
+				$('[name="contact_mobile"]').val(contact_mobile.join(','));
+				$('[name="contact_address"]').val(address.join(','));
+			}
+			oaPicker.picker(types,type,callback,map);
+		});
+		
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/contract/contract/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/contract/edit_product.html b/app/contract/view/contract/edit_product.html
new file mode 100644
index 0000000000000000000000000000000000000000..d4fce7ab7dd3c77b428eecee3d8eab4244ce2786
--- /dev/null
+++ b/app/contract/view/contract/edit_product.html
@@ -0,0 +1,135 @@
+<tr>
+	<td colspan="6"><strong>产品信息</strong> <span class="layui-btn layui-btn-sm" type="button" id="productAdd">+ 添加产品</span></td>
+</tr>
+<tr>
+	<td colspan="6">				
+		<table id="productTable" class="layui-table layui-table-min" style="margin:0">
+			<tr>
+				<th width="200">产品名称</th>
+				<th width="100">单位</th>
+				<th width="100">规格</th>
+				<th width="100">销售单价</th>
+				<th width="100">数量</th>
+				<th width="100">小计</th>
+				<th>备注信息</th>
+				<th width="60">操作</th>
+			</tr>
+			{empty name="$detail.content"}
+			<tr class="product-tr">
+				{eq name="is_product" value="1"}
+				<td><input type="text" name="product_title[]" value="" class="layui-input product-picker" readonly lay-verify="required" lay-reqText="请完善产品名称"><input type="hidden" name="product_id[]" value="0"></td>
+				{else/}
+				<td><input type="text" name="product_title[]" value="" class="layui-input" lay-verify="required" lay-reqText="请完善产品名称"><input type="hidden" name="product_id[]" value="0"></td>
+				{/eq}
+				<td><input type="text" name="product_unit[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入单位"></td>
+				<td><input type="text" name="product_specs[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入产品规格"></td>
+				<td><input type="text" name="product_price[]" value="0.00" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入销售单价"></td>
+				<td><input type="text" name="product_num[]" value="1" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入产品数量"></td>
+				<td><input type="text" name="product_subtotal[]" value="0.00" class="layui-input layui-input-readonly" readonly></td>
+				<td><input type="text" name="product_remark[]" value="" class="layui-input"></td>
+				<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>
+			</tr>
+			{else/}
+			{volist name="$detail.content" id="vo"}
+			<tr class="product-tr">
+				{eq name="is_product" value="1"}
+				<td><input type="text" name="product_title[]" value="{$vo.product_title|default=''}" class="layui-input product-picker" readonly lay-verify="required" lay-reqText="请完善产品名称"><input type="hidden" name="product_id[]" value="{$vo.product_id|default=0}"></td>
+				{else/}
+				<td><input type="text" name="product_title[]" value="{$vo.product_title|default=''}" class="layui-input" lay-verify="required" lay-reqText="请完善产品名称"><input type="hidden" name="product_id[]" value="{$vo.product_id|default=0}"></td>
+				{/eq}
+				<td><input type="text" name="product_unit[]" value="{$vo.product_unit|default=''}" class="layui-input" lay-verify="required" lay-reqText="请输入单位"></td>
+				<td><input type="text" name="product_specs[]" value="{$vo.product_specs|default=''}" class="layui-input" lay-verify="required" lay-reqText="请输入产品规格"></td>
+				<td><input type="text" name="product_price[]" value="{$vo.product_price|default='0.00'}" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入销售单价"></td>
+				<td><input type="text" name="product_num[]" value="{$vo.product_num|default=0}" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入产品数量"></td>
+				<td><input type="text" name="product_subtotal[]" value="{$vo.product_subtotal|default='0.00'}" class="layui-input layui-input-readonly" readonly></td>
+				<td><input type="text" name="product_remark[]" value="{$vo.product_remark|default=''}" class="layui-input"></td>
+				<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>
+			</tr>
+			{/volist}
+			{/empty}
+		</table>
+	</td>
+</tr>
+<script>
+const is_product={$is_product};
+function product_fun(layui){
+	let form = layui.form,oaPicker = layui.oaPicker;
+	
+	//选择物品弹窗        
+	$('body').on('click','.product-picker',function () {
+		let that = $(this),ids = [],titles=[],sale_price=[],unit=[],specs=[],map = {},types = 'product',type = 1;
+		let callback = function(data){
+			for ( var i = 0; i <data.length; i++){
+				ids.push(data[i].id);
+				titles.push(data[i].title);
+				unit.push(data[i].unit);
+				specs.push(data[i].specs);
+				sale_price.push(data[i].sale_price);
+			}
+			that.val(titles.join(','));
+			that.next().val(ids.join(','));
+			that.parents('.product-tr').find('input').eq(2).val(unit.join(','));
+			that.parents('.product-tr').find('input').eq(3).val(specs.join(','));
+			that.parents('.product-tr').find('input').eq(4).val(sale_price.join(','));
+			that.parents('.product-tr').find('input').eq(6).val(sale_price.join(','));
+			count_cost();
+		}
+		oaPicker.picker(types,type,callback,map);
+	});
+	
+	//添加产品信息表格
+	$('#productAdd').on('click',function(){
+		var html = '',product_title=' class="layui-input"';
+		if(is_product==1){
+			product_title=' class="layui-input product-picker" readonly';
+		}
+		html += '<tr class="product-tr">\
+					<td><input type="text" name="product_title[]" value="" '+product_title+' lay-verify="required" lay-reqText="请完善产品名称"><input type="hidden" name="product_id[]" value="0"></td>\
+					<td><input type="text" name="product_unit[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入单位"></td>\
+					<td><input type="text" name="product_specs[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入产品规格"></td>\
+					<td><input type="text" name="product_price[]" value="0.00" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入销售单价"></td>\
+					<td><input type="text" name="product_num[]" value="1" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入产品数量"></td>\
+					<td><input type="text" name="product_subtotal[]" value="0.00" class="layui-input layui-input-readonly" readonly></td>\
+					<td><input type="text" name="product_remark[]" value="" class="layui-input"></td>\
+					<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>\
+				</tr>';
+		$('#productTable').append(html).find('.tr-none').remove();
+		form.render();
+	});	
+
+	$('#productTable').on('click', '[lay-event="del"]', function() {
+		if($('.product-tr').length<2){
+			layer.msg('至少保留一个产品选项');
+			return false;
+		}
+		$(this).parents('.product-tr').remove();
+		count_cost();
+	});	
+	
+	//计算价格
+	$('#productTable').on('input', '.input-num', function() {
+		var inputs = $(this).parents('.product-tr').find("input");
+		var product_price = inputs.eq(4).val();
+		var product_num = inputs.eq(5).val();
+		var product_amount = (product_price*product_num).toFixed(2);			  
+		if(isNaN(product_amount)){ 
+			product_amount = 0.00;
+		}
+		inputs.eq(6).val(product_amount);
+		count_cost();
+	});
+	 
+	//计算总价
+	function count_cost(){
+		var product_subtotal = $('#productTable').find('[name="product_subtotal[]"]');
+		var total = 0;
+		for (var m = 0; m < product_subtotal.length; m++) {
+			total+=$(product_subtotal[m]).val()*1000;
+		}
+		if(isNaN(total)){ 
+			total = 0;
+		}
+		$('[name="cost"]').val((total/1000).toFixed(2));
+	}
+}
+</script>
\ No newline at end of file
diff --git a/app/contract/view/contract/edit_service.html b/app/contract/view/contract/edit_service.html
new file mode 100644
index 0000000000000000000000000000000000000000..a36e2097a7a76bf963a2eafc796f8e4aedee4963
--- /dev/null
+++ b/app/contract/view/contract/edit_service.html
@@ -0,0 +1,127 @@
+<tr>
+	<td class="layui-td-gray" colspan="6" style="text-align:left; color:#666"><strong>服务信息</strong> <span class="layui-btn layui-btn-sm" type="button" id="serviceAdd">+ 添加服务</span></td>
+</tr>
+<tr>
+	<td colspan="6">				
+		<table id="serviceTable" class="layui-table layui-table-min" style="margin:0">
+			<tr>
+				<th width="200">服务名称</th>
+				<th width="200">服务周期</th>
+				<th width="100">服务单价</th>
+				<th width="100">服务次数</th>
+				<th width="100">小计</th>
+				<th>备注信息</th>
+				<th width="60">操作</th>
+			</tr>
+			{empty name="$detail.content"}
+			<tr class="service-tr">
+				{eq name="is_service" value="1"}
+				<td><input type="text" name="service_title[]" value="" class="layui-input service-picker" readonly lay-verify="required" lay-reqText="请完善服务名称"><input type="hidden" name="service_id[]" value="0"></td>
+				{else/}
+				<td><input type="text" name="service_title[]" value="" class="layui-input" lay-verify="required" lay-reqText="请完善服务名称"><input type="hidden" name="service_id[]" value="0"></td>
+				{/eq}
+				<td><input type="text" name="service_date[]" value="" class="layui-input layui-input-readonly tool-time" data-range="到" lay-verify="required" lay-reqText="请选择服务周期" readonly></td>
+				<td><input type="text" name="service_price[]" value="0.00" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务单价"></td>
+				<td><input type="text" name="service_num[]" value="1" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务次数"></td>
+				<td><input type="text" name="service_subtotal[]" value="0.00" class="layui-input layui-input-readonly" readonly></td>
+				<td><input type="text" name="service_remark[]" value="" class="layui-input"></td>
+				<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>
+			</tr>
+			{else/}
+			{volist name="$detail.content" id="vo"}
+			<tr class="service-tr">
+				{eq name="is_service" value="1"}
+				<td><input type="text" name="service_title[]" value="{$vo.service_title|default=''}" class="layui-input service-picker" readonly lay-verify="required" lay-reqText="请完善服务名称"><input type="hidden" name="service_id[]" value="{$vo.service_id|default='0'}"></td>
+				{else/}
+				<td><input type="text" name="service_title[]" value="{$vo.service_title|default=''}" class="layui-input" lay-verify="required" lay-reqText="请完善服务名称"><input type="hidden" name="service_id[]" value="{$vo.service_id|default='0'}"></td>
+				{/eq}
+				<td><input type="text" name="service_date[]" value="{$vo.service_date|default=''}" class="layui-input layui-input-readonly tool-time" data-range="到" lay-verify="required" lay-reqText="请选择服务周期" readonly></td>
+				<td><input type="text" name="service_price[]" value="{$vo.service_price|default='0.00'}" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务单价"></td>
+				<td><input type="text" name="service_num[]" value="{$vo.service_num|default=0}" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务次数"></td>
+				<td><input type="text" name="service_subtotal[]" value="{$vo.service_subtotal|default='0.00'}" class="layui-input layui-input-readonly" readonly></td>
+				<td><input type="text" name="service_remark[]" value="{$vo.service_remark|default=''}" class="layui-input"></td>
+				<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>
+			</tr>
+			{/volist}
+			{/empty}
+		</table>
+	</td>
+</tr>
+<script>
+const is_service={$is_service};
+function product_fun(layui){
+	let form = layui.form,oaPicker = layui.oaPicker;
+	
+	//选择物品弹窗        
+	$('body').on('click','.service-picker',function () {
+		let that = $(this),ids = [],titles=[],price=[],map = {},types = 'services',type = 1;
+		let callback = function(data){
+			for ( var i = 0; i <data.length; i++){
+				ids.push(data[i].id);
+				titles.push(data[i].title);
+				price.push(data[i].price);
+			}
+			that.val(titles.join(','));
+			that.next().val(ids.join(','));
+			that.parents('.service-tr').find('input').eq(3).val(price.join(','));
+			that.parents('.service-tr').find('input').eq(5).val(price.join(','));
+			count_cost();
+		}
+		oaPicker.picker(types,type,callback,map);
+	});
+	
+	//添加服务信息表格
+	$('#serviceAdd').on('click',function(){
+		var html = '',service_title=' class="layui-input"';
+		if(is_service==1){
+			service_title=' class="layui-input service-picker" readonly';
+		}
+		html += '<tr class="service-tr">\
+					<td><input type="text" name="service_title[]" value="" '+service_title+' lay-verify="required" lay-reqText="请完善服务名称"><input type="hidden" name="service_id[]" value="0"></td>\
+					<td><input type="text" name="service_date[]" value="" class="layui-input layui-input-readonly tool-time" data-range="到" lay-verify="required" lay-reqText="请选择服务周期" readonly></td>\
+					<td><input type="text" name="service_price[]" value="0.00" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务单价"></td>\
+					<td><input type="text" name="service_num[]" value="1" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务次数"></td>\
+					<td><input type="text" name="service_subtotal[]" value="0.00" class="layui-input layui-input-readonly" readonly></td>\
+					<td><input type="text" name="service_remark[]" value="" class="layui-input"></td>\
+					<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>\
+				</tr>';
+		$('#serviceTable').append(html).find('.tr-none').remove();
+		form.render();
+	});
+
+	$('#serviceTable').on('click', '[lay-event="del"]', function() {
+		if($('.service-tr').length<2){
+			layer.msg('至少保留一个服务选项');
+			return false;
+		}
+		$(this).parents('.service-tr').remove();
+		count_cost();
+	});	
+	
+	//计算价格
+	$('#serviceTable').on('input', '.input-num', function() {
+		var inputs = $(this).parents('.service-tr').find("input");
+		var service_price = inputs.eq(3).val();
+		var service_num = inputs.eq(4).val();
+		var service_amount = (service_price*service_num).toFixed(2);			  
+		if(isNaN(service_amount)){ 
+			service_amount = 0.00;
+		}
+		inputs.eq(5).val(service_amount);
+		count_cost();
+	});
+	 
+	//计算总价
+	function count_cost(){
+		var service_subtotal = $('#serviceTable').find('[name="service_subtotal[]"]');
+		var total = 0;
+		for (var m = 0; m < service_subtotal.length; m++) {
+			total+=$(service_subtotal[m]).val()*1000;
+		}
+		if(isNaN(total)){ 
+			total = 0;
+		}
+		$('[name="cost"]').val((total/1000).toFixed(2));
+	}
+}
+</script>
diff --git a/app/contract/view/contract/stoplist.html b/app/contract/view/contract/stoplist.html
new file mode 100644
index 0000000000000000000000000000000000000000..28e4c8b32a9ccbde5b451a7ddc4f6c88c695288e
--- /dev/null
+++ b/app/contract/view/contract/stoplist.html
@@ -0,0 +1,177 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<div class="layui-card border-x border-t" style="margin-bottom:0; box-shadow:0 0 0 0 rgb(5 32 96 / 0%)">
+		<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
+			<ul class="layui-tab-title">
+				<li class="layui-this"><a href="/contract/contract/stoplist">销售合同</a></li>
+				<li><a href="/contract/purchase/stoplist">采购合同</a></li>
+			</ul>
+		</div> 
+	</div> 
+	<form class="layui-form gg-form-bar border-x">
+		<div class="layui-input-inline" style="width:128px;">
+			<select name="types">
+				<option value="">选择合同性质</option>
+				<option value="1">普通合同</option>
+				<option value="2">产品合同</option>
+				<option value="3">服务合同</option>
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:128px;">
+			<select name="cate_id">
+				<option value="">选择合同类别</option>
+				{volist name=":get_base_data('ContractCate');" id="vo"}
+				<option value="{$vo.id}">{$vo.title}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:175px;">
+			<input type="text" class="layui-input" id="sign_time" placeholder="选择合同签订日期" readonly name="sign_time">
+		</div>
+		<div class="layui-input-inline" style="width:175px;">
+			<input type="text" class="layui-input" id="end_time" placeholder="选择合同到期日期" readonly name="end_time">
+		</div>
+		<div class="layui-input-inline" style="width:220px;">
+			<input type="text" name="keywords" placeholder="输入关键字，合同编号/合同名称" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<input type="hidden" name="tab" value="0" />
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_contract" lay-filter="table_contract"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+	<h3>中止合同</h3>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus','laydatePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus,dropdown = layui.dropdown, tool = layui.tool,laydatePlus = layui.laydatePlus;
+		//日期范围
+		var sign_time = new laydatePlus({'target':'sign_time'});
+		var end_time = new laydatePlus({'target':'end_time'});
+		layui.pageTable = table.render({
+			elem: "#table_contract"
+			, toolbar: "#toolbarDemo"
+			,url: "/contract/contract/stoplist"
+			,is_excel: true
+			,page: true
+			,limit: 20
+			,cellMinWidth: 60
+			,height: 'full-152'
+			,cols: [[ //表头
+				{
+					field: 'id',
+					title: 'ID号',
+					align: 'center',
+					width: 80
+				},{
+					field: 'code',
+					title: '合同编号',
+					align: 'center',
+					width: 150
+				},{
+					field: 'name',
+					title: '合同名称',
+					minWidth:240,
+					templet: '<div><a data-href="/contract/contract/view/id/{{d.id}}.html" class="side-a">{{d.name}}</a></div>'
+				},{
+					field: 'cate_title',
+					title: '合同类别',
+					align: 'center',
+					width: 100
+				},{
+					field: 'types_name',
+					title: '合同性质',
+					align: 'center',
+					width: 80,
+					templet: function (d) {
+						var html = '<span class="layui-color-' + d.types + '">' + d.types_name + '</span>';
+						return html;
+					}
+				},{
+					field: 'interval_time',
+					title: '合同有效时间',
+					align: 'center',
+					width: 248,
+					templet: function (d) {
+						var html = d.interval_time;
+						if (d.delay > 0 && d.delay < 30) {
+							html += '<span class="red ml-1" style="font-size:12px;">' + d.delay + '天后到期</span>';
+						}
+						if (d.delay == 0) {
+							html += '<span class="red ml-1" style="font-size:12px;">已过期</span>';
+						}
+						return html;
+					}
+				},{
+					field: 'cost',
+					title: '合同金额(元)',
+					align: 'right',
+					width: 100
+				},{
+					field: 'stop_name',
+					title: '中止人',
+					align: 'center',
+					width: 80
+				},{
+					field: 'stop_time',
+					title: '中止日期',
+					align: 'center',
+					width: 90
+				},{
+					field: 'sign_name',
+					title: '签定人',
+					align: 'center',
+					width: 80
+				},{
+					field: 'sign_time',
+					title: '签订日期',
+					align: 'center',
+					width: 90
+				},{
+					field: 'keeper_name',
+					title: '保管人',
+					align: 'center',
+					width: 80
+				},{
+					field: 'right',
+					fixed:'right',
+					title: '操作',
+					width: 60,
+					align: 'center',
+					ignoreExport:true,
+					templet: function (d) {
+						var btn0='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</span>';
+						return btn0;
+					}						
+				}
+			]]
+		});
+			
+		table.on('tool(table_contract)',function (obj) {
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/contract/contract/view?id="+data.id);
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/contract/view.html b/app/contract/view/contract/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..9bcf7b0fc8032d797a6a1bcf7c61b10c0d4524fd
--- /dev/null
+++ b/app/contract/view/contract/view.html
@@ -0,0 +1,308 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+.layui-tab-title .layui-this{background-color:#fff;}
+.layui-tab-card,.layui-card{box-shadow:0 0 0 0 rgb(0 0 0 / 10%); border-radius:0; border-top:none;}
+#checkBox .pb-2{display:none;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<h3 class="pb-3">合同详情</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">合同名称</td>
+			<td colspan="3">{$detail.name}</td>
+			<td class="layui-td-gray">合同编号</td>
+			<td>{$detail.code}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">签约主体<span style="font-size:12px;">(乙方)</span></td>
+			<td colspan="3">{$detail.subject_title}</td>
+			<td class="layui-td-gray-2">合同始止日期</td>
+			<td>{$detail.start_time} 至 {$detail.end_time}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">客户名称<span style="font-size:12px;">(甲方)</span></td>
+			<td colspan="3">{$detail.customer}</td>
+			<td class="layui-td-gray">签约客户代表</td>
+			<td>{$detail.contact_name}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">客户联系地址</td>
+			<td colspan="3">{$detail.contact_address|default='-'}</td>
+			<td class="layui-td-gray">客户联系电话</td>
+			<td>{$detail.contact_mobile|default='-'}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">合同金额</td>
+			<td>{$detail.cost}</td>
+			<td class="layui-td-gray">合同性质</td>
+			<td>{$detail.types_name}</td>
+			<td class="layui-td-gray">合同类别</td>
+			<td>{$detail.cate_title}</td>
+		</tr>
+		<tr>
+			<td colspan="6"><strong>签订信息</strong></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">合同签订人</td>
+			<td>{$detail.sign_name}</td>
+			<td class="layui-td-gray-2">合同所属部门</td>
+			<td>{$detail.sign_department}</td>
+			<td class="layui-td-gray-2">合同签订日期</td>
+			<td>{$detail.sign_time}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">合同制定人</td>
+			<td>{$detail.prepared_name|default='-'}</td>
+			<td class="layui-td-gray-2">合同保管人</td>
+			<td>{$detail.keeper_name|default='-'} <span id="keeper" data-ids="{$detail.keeper_uid}" data-names="{$detail.keeper_name}" class="layui-btn layui-btn-xs layui-btn-normal ml-1">更改</span></td>
+			<td class="layui-td-gray">合同共享人员</td>
+			<td colspan="3">{$detail.share_names|default='-'} <span id="shares" data-ids="{$detail.share_ids}" data-names="{$detail.share_names}" class="layui-btn layui-btn-xs layui-btn-normal ml-1">更改</span></td>
+		</tr>
+		{eq name="$detail.types" value="2"}{include file="/contract/view_product"}{/eq}		
+		{eq name="$detail.types" value="3"}{include file="/contract/view_service"}{/eq}	
+		{notempty name="$detail.file_ids"}
+		<tr>
+			<td colspan="6"><strong>相关附件</strong></td>
+		</tr>
+		<tr>
+			<td colspan="6" style="line-height:inherit">
+				<div class="layui-row">
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+		{notempty name="$detail.remark"}
+		<tr>
+			<td colspan="6"><strong>备注信息</strong></td>
+		</tr>
+		<tr>
+			<td colspan="6">{$detail.remark}</td>
+		</tr>
+		{/notempty}
+		
+		<tr>
+			<td colspan="6"><strong>合同情况</strong></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">录入人</td>
+			<td>{$detail.admin_name} </td>
+			<td class="layui-td-gray">录入时间</td>
+			<td colspan="3">{$detail.create_time}</td>
+		</tr>
+		{gt name="$detail.archive_time" value="0"}
+		<tr>
+			<td class="layui-td-gray">归档状态</td>
+			<td>
+				<span class="red">已归档</span>
+				{if ($auth == 1) }
+				<span class="layui-btn layui-btn-danger layui-btn-xs ml-4" data-event="archive" data-status="0">反确认归档</span>
+				{/if}
+			</td>
+			<td class="layui-td-gray">归档人</td>
+			<td>{$detail.archive_name} </td>
+			<td class="layui-td-gray">归档时间</td>
+			<td>{$detail.archive_time|date='Y-m-d H:i:s'}</td>
+		{else/}
+			<td class="layui-td-gray">归档状态</td>
+			<td colspan="5">
+				<span class="green">未归档</span>
+				{if ($auth == 1) AND ($detail.check_status == 2) }
+				<span class="layui-btn layui-btn-xs ml-4" data-event="archive" data-status="1">确认归档</span>
+				{/if}
+			</td>
+		</tr>
+		{/gt}
+			
+		{gt name="$detail.stop_time" value="0"}
+		<tr>
+			<td class="layui-td-gray">中止人</td>
+			<td>{$detail.stop_name}</td>
+			<td class="layui-td-gray">中止时间</td>
+			<td>{$detail.stop_time|date='Y-m-d H:i:s'}</td>
+			<td colspan="2"><span class="layui-btn layui-btn-danger layui-btn-xs" data-event="stop" data-status="0">反中止合同</span></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">中止备注</td>
+			<td colspan="5">{$detail.stop_remark|default='-'}</td>
+		</tr>
+		{/gt}
+			
+		{gt name="$detail.void_time" value="0"}
+		<tr>
+			<td class="layui-td-gray">作废人</td>
+			<td>{$detail.void_name}</td>
+			<td class="layui-td-gray">作废时间</td>
+			<td>{$detail.void_time|date='Y-m-d H:i:s'}</td>
+			<td colspan="2"><span class="layui-btn layui-btn-danger layui-btn-xs" data-event="void" data-status="0">反作废合同</span></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">作废备注</td>
+			<td colspan="5">{$detail.void_remark|default='-'}</td>
+		</tr>
+		{/gt}
+	</table>
+				
+	<div class="layui-tab layui-tab-card" style="margin:0; background-color:#fff;" lay-filter="contract" id="contractTab">
+		<ul class="layui-tab-title">
+			<li class="layui-this" data-load="true">审批信息</li>
+			<li>操作记录</li>
+		</ul>
+		<div class="layui-tab-content" style="padding:0;">
+			<div class="layui-tab-item layui-show" style="padding-top:12px; background-color:#fff;">	
+				{if ($detail.stop_time == 0) AND ($detail.void_time == 0) }
+				<div id="checkBox" data-status="{$detail.check_status}" data-id="{$detail.id}" data-checkflowid="{$detail.check_flow_id}" class="px-3 pb-3"></div>
+				{/if}	
+			</div>
+			<div class="layui-tab-item">
+				{include file="/contract/view_log" /}
+			</div>
+		</div>
+	</div>
+</div>
+{/block}
+<!-- /主体 -->
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var contract_id = {$detail.id};
+	var auth = {$auth};
+	var archive = {$detail.archive_time};
+	var moduleInit = ['tool','oaCheck','oaPicker','oaEdit'];
+	let checking_btn='<span class="layui-btn layui-btn-warm" data-event="stop" data-status="1">中止合同</span><span class="layui-btn layui-btn-danger" data-event="void" data-status="1">作废合同</span>';
+	function gouguInit() {
+		var tool = layui.tool,element = layui.element,oaCheck=layui.oaCheck,oaPicker=layui.oaPicker;	
+		
+		element.on('tab(contract)', function(data){
+			let index = data.index;
+			if(index == 1){
+				log();	
+			}
+		});
+		
+		oaCheck.init({
+			check_name:'contract',
+			check_copy:0,
+			check_back:archive==0?auth:0,
+			checking_btn:checking_btn
+		});
+
+		let eventCallback = function (e) {
+			layer.msg(e.msg);
+			parent.layui.pageTable.reload();
+			setTimeout(function(){
+				location.reload();
+			},1200)					
+		}
+		
+		//选择合同保管人弹窗	
+		$('body').on('click','#keeper',function () {
+			let that = $(this);
+			let ids=$(this).data('ids')+'',names = $(this).data('names')+'';
+			oaPicker.employeeInit({
+				ids:ids,
+				names:names,
+				type:1,//1是单选，2是多选
+				callback:function(data){
+					let select_id=[],select_name=[];
+					for(var a=0; a<data.length;a++){
+						select_id.push(data[a].id);
+						select_name.push(data[a].name);
+					}
+					tool.post("/contract/contract/add", {'id':contract_id,'keeper_uid':select_id.join(','),'scene':'change'}, eventCallback);
+				}
+			});
+		});
+	
+		//选择共享成员弹窗	
+		$('body').on('click','#shares',function () {
+			let that = $(this);
+			let ids=$(this).data('ids')+'',names = $(this).data('names')+'';
+			oaPicker.employeeInit({
+				ids:ids,
+				names:names,
+				type:2,//1是单选，2是多选
+				callback:function(data){
+					let select_id=[],select_name=[];
+					for(var a=0; a<data.length;a++){
+						select_id.push(data[a].id);
+						select_name.push(data[a].name);
+					}
+					tool.post("/contract/contract/add", {'id':contract_id,'share_ids':select_id.join(','),'scene':'change'}, eventCallback);
+				}
+			});
+		});
+		
+		//归档操作
+		$('body').on('click','[data-event="archive"]',function(){
+			let status = $(this).data('status');
+			let tips = '合同归档后将不能进行任何数据操作，确定要提交归档?';
+			if(status==0){
+				tips = '确定要反归档操作?';
+			}
+			layer.confirm(tips, {
+				icon: 3,
+				title: '提示'
+			}, function(index) {
+				tool.post("/contract/api/contract_archive", {id: contract_id,archive_status:status}, eventCallback);
+				layer.close(index);
+			});
+		})
+
+		//中止操作
+		$('body').on('click','[data-event="stop"]',function(){
+			let status = $(this).data('status');
+			if(status==1){
+				layer.prompt({
+					formType: 2,
+					title: '请输入中止的理由',
+					area: ['480px', '120px']
+				}, function(value, index, elem){
+					tool.post("/contract/api/contract_stop", {id: contract_id,stop_status:status,stop_remark:value}, eventCallback);
+					layer.close(index);
+				});
+			}
+			else{
+				layer.confirm('确定要反中止该合同?', {
+					icon: 3,
+					title: '提示'
+				}, function(index) {
+					tool.post("/contract/api/contract_stop", {id: contract_id,stop_status:status}, eventCallback);
+					layer.close(index);
+				});
+			}
+		})
+		
+		//作废操作
+		$('body').on('click','[data-event="void"]',function(){
+			let status = $(this).data('status');
+			if(status==1){
+				layer.prompt({
+					formType: 2,
+					title: '请输入作废的理由',
+					area: ['480px', '120px']
+				}, function(value, index, elem){
+					tool.post("/contract/api/contract_tovoid", {id: contract_id,void_status:status,void_remark:value}, eventCallback);
+					layer.close(index);
+				});
+			}
+			else{
+				layer.confirm('确定要反作废该合同?', {
+					icon: 3,
+					title: '提示'
+				}, function(index) {
+					tool.post("/contract/api/contract_tovoid", {id: contract_id,void_status:status}, eventCallback);
+					layer.close(index);
+				});
+			}
+		})		
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/contract/view_log.html b/app/contract/view/contract/view_log.html
new file mode 100644
index 0000000000000000000000000000000000000000..33ed7b6bce4ad5444d12a6e7ed7c0054ac0aac27
--- /dev/null
+++ b/app/contract/view/contract/view_log.html
@@ -0,0 +1,9 @@
+<div>
+	<div id="logList" class="log-timeline p-3"></div>
+</div>
+<script>	
+function log(){
+	let oaEdit = layui.oaEdit;	
+	oaEdit.log('logList','Contract',contract_id);
+}
+</script>	
\ No newline at end of file
diff --git a/app/contract/view/contract/view_product.html b/app/contract/view/contract/view_product.html
new file mode 100644
index 0000000000000000000000000000000000000000..0ce68404dc5b9d43a0cd8c6cdc677da4fbd23932
--- /dev/null
+++ b/app/contract/view/contract/view_product.html
@@ -0,0 +1,36 @@
+<tr>
+	<td colspan="6"><strong>产品信息</strong></td>
+</tr>
+<tr>
+	<td colspan="6">				
+		<table class="layui-table layui-table-min" style="margin:0">
+			<tr>
+				<th width="200">产品名称</th>
+				<th width="100">单位</th>
+				<th width="100">规格</th>
+				<th width="100">销售单价</th>
+				<th width="100">数量</th>
+				<th width="100">小计</th>
+				<th>备注信息</th>
+			</tr>
+			{empty name="$detail.content"}
+			<tr class="sale-tr">
+				<td colspan="7" style="padding:12px; text-align:center; color:#999">暂无产品信息</td>
+			</tr>
+			{else/}
+			{volist name="$detail.content" id="vo"}
+			<tr class="sale-tr">
+				<td style="text-align:left;">{$vo.product_title|default=''}</td>
+				<td>{$vo.product_unit|default=''}</td>
+				<td>{$vo.product_specs|default=''}</td>
+				<td>{$vo.product_price|default='0.00'}</td>
+				<td>{$vo.product_num|default='1'}</td>
+				<td>{$vo.product_subtotal|default='0.00'}</td>
+				<td style="text-align:left;">{$vo.product_remark|default=''}</td>
+			</tr>
+			{/volist}
+			{/empty}
+		</table>
+	</td>
+</tr>
+
diff --git a/app/contract/view/contract/view_service.html b/app/contract/view/contract/view_service.html
new file mode 100644
index 0000000000000000000000000000000000000000..58ab62002baabba2a2e57ac15d9ab926d6ffffd8
--- /dev/null
+++ b/app/contract/view/contract/view_service.html
@@ -0,0 +1,34 @@
+<tr>
+	<td class="layui-td-gray" colspan="6" style="text-align:left; color:#666"><strong>服务信息</strong></td>
+</tr>
+<tr>
+	<td colspan="6">				
+		<table class="layui-table layui-table-min" style="margin:0">
+			<tr>
+				<th width="200">服务名称</th>
+				<th width="200">服务周期</th>
+				<th width="100">服务单价</th>
+				<th width="100">服务次数</th>
+				<th width="100">小计</th>
+				<th>备注信息</th>
+			</tr>
+			{empty name="$detail.content"}
+			<tr class="sale-tr">
+				<td colspan="6" style="padding:12px text-align:center; color:#999">暂无服务信息</td>
+			</tr>
+			{else/}
+			{volist name="$detail.content" id="vo"}
+			<tr class="sale-tr">
+				<td style="text-align:left;">{$vo.service_title|default=''}</td>
+				<td>{$vo.service_date|default=''}</td>
+				<td>{$vo.service_price|default='0.00'}</td>
+				<td>{$vo.service_num|default='1'}</td>
+				<td>{$vo.service_subtotal|default='0.00'}</td>
+				<td style="text-align:left;">{$vo.service_remark|default=''}</td>
+			</tr>
+			{/volist}
+			{/empty}
+		</table>
+	</td>
+</tr>
+
diff --git a/app/contract/view/contract/voidlist.html b/app/contract/view/contract/voidlist.html
new file mode 100644
index 0000000000000000000000000000000000000000..ca4a1cd198179c9e91e5767e28e8a940701ef8d0
--- /dev/null
+++ b/app/contract/view/contract/voidlist.html
@@ -0,0 +1,177 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<div class="layui-card border-x border-t" style="margin-bottom:0; box-shadow:0 0 0 0 rgb(5 32 96 / 0%)">
+		<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
+			<ul class="layui-tab-title">
+				<li class="layui-this"><a href="/contract/contract/voidlist">销售合同</a></li>
+				<li><a href="/contract/purchase/voidlist">采购合同</a></li>
+			</ul>
+		</div> 
+	</div> 
+	<form class="layui-form gg-form-bar border-x">
+		<div class="layui-input-inline" style="width:128px;">
+			<select name="types">
+				<option value="">选择合同性质</option>
+				<option value="1">普通合同</option>
+				<option value="2">产品合同</option>
+				<option value="3">服务合同</option>
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:128px;">
+			<select name="cate_id">
+				<option value="">选择合同类别</option>
+				{volist name=":get_base_data('ContractCate');" id="vo"}
+				<option value="{$vo.id}">{$vo.title}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:175px;">
+			<input type="text" class="layui-input" id="sign_time" placeholder="选择合同签订日期" readonly name="sign_time">
+		</div>
+		<div class="layui-input-inline" style="width:175px;">
+			<input type="text" class="layui-input" id="end_time" placeholder="选择合同到期日期" readonly name="end_time">
+		</div>
+		<div class="layui-input-inline" style="width:220px;">
+			<input type="text" name="keywords" placeholder="输入关键字，合同编号/合同名称" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<input type="hidden" name="tab" value="0" />
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_contract" lay-filter="table_contract"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+	<h3>作废合同</h3>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus','laydatePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus,dropdown = layui.dropdown, tool = layui.tool,laydatePlus = layui.laydatePlus;
+		//日期范围
+		var sign_time = new laydatePlus({'target':'sign_time'});
+		var end_time = new laydatePlus({'target':'end_time'});
+		layui.pageTable = table.render({
+			elem: "#table_contract"
+			, toolbar: "#toolbarDemo"
+			,url: "/contract/contract/voidlist"
+			,is_excel: true
+			,page: true
+			,limit: 20
+			,cellMinWidth: 60
+			,height: 'full-152'
+			,cols: [[ //表头
+				{
+					field: 'id',
+					title: 'ID号',
+					align: 'center',
+					width: 80
+				},{
+					field: 'code',
+					title: '合同编号',
+					align: 'center',
+					width: 150
+				},{
+					field: 'name',
+					title: '合同名称',
+					minWidth:240,
+					templet: '<div><a data-href="/contract/contract/view/id/{{d.id}}.html" class="side-a">{{d.name}}</a></div>'
+				},{
+					field: 'cate_title',
+					title: '合同类别',
+					align: 'center',
+					width: 100
+				},{
+					field: 'types_name',
+					title: '合同性质',
+					align: 'center',
+					width: 80,
+					templet: function (d) {
+						var html = '<span class="layui-color-' + d.types + '">' + d.types_name + '</span>';
+						return html;
+					}
+				},{
+					field: 'interval_time',
+					title: '合同有效时间',
+					align: 'center',
+					width: 248,
+					templet: function (d) {
+						var html = d.interval_time;
+						if (d.delay > 0 && d.delay < 30) {
+							html += '<span class="red ml-1" style="font-size:12px;">' + d.delay + '天后到期</span>';
+						}
+						if (d.delay == 0) {
+							html += '<span class="red ml-1" style="font-size:12px;">已过期</span>';
+						}
+						return html;
+					}
+				},{
+					field: 'cost',
+					title: '合同金额(元)',
+					align: 'right',
+					width: 100
+				},{
+					field: 'void_name',
+					title: '作废人',
+					align: 'center',
+					width: 80
+				},{
+					field: 'void_time',
+					title: '作废日期',
+					align: 'center',
+					width: 90
+				},{
+					field: 'sign_name',
+					title: '签定人',
+					align: 'center',
+					width: 80
+				},{
+					field: 'sign_time',
+					title: '签订日期',
+					align: 'center',
+					width: 90
+				},{
+					field: 'keeper_name',
+					title: '保管人',
+					align: 'center',
+					width: 80
+				},{
+					field: 'right',
+					fixed:'right',
+					title: '操作',
+					width: 60,
+					align: 'center',
+					ignoreExport:true,
+					templet: function (d) {
+						var btn0='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</span>';
+						return btn0;
+					}						
+				}
+			]]
+		});
+			
+		table.on('tool(table_contract)',function (obj) {
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/contract/contract/view?id="+data.id);
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/product/add.html b/app/contract/view/product/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..1094090f69e900c66dfbe410f24487c6bf0152be
--- /dev/null
+++ b/app/contract/view/product/add.html
@@ -0,0 +1,136 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-1">新增产品</h3>
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">产品名称<font>*</font></td>
+			<td colspan="3"><input type="text" name="title" autocomplete="off" placeholder="请输入产品名称" lay-verify="required" lay-reqText="请输入产品名称" class="layui-input"></td>
+			<td class="layui-td-gray">产品分类<font>*</font></td>
+			<td>
+				<select name="cate_id" lay-verify="required" lay-reqText="请选择分类">
+					<option value="">请选择分类</option>
+					{volist name=":set_recursion(get_base_data('ProductCate'))" id="v"}
+					<option value="{$v.id}">{$v.title}</option>
+					{/volist}
+				</select>
+			</td>
+			<td class="layui-td-gray" rowspan="4">缩略图</td>
+			<td rowspan="4" style="width: 150px; vertical-align:top:">
+				<div class="layui-upload">
+					<button type="button" class="layui-btn layui-btn-normal layui-btn-sm" id="test1">缩略图(尺寸：240x136)</button>
+					<div class="layui-upload-list" id="demo1" style="width: 150px; height:80px; overflow: hidden;">
+						<img src="" style="max-width: 100%; height:80px;" />
+						<input type="hidden" name="thumb" value="">
+					</div>
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">产品编码<font>*</font></td>
+			<td><input type="text" name="code" autocomplete="off" value="{:get_codeno('PR')}" readonly class="layui-input" lay-verify="required" lay-reqText="请输入产品编码"></td>
+			<td class="layui-td-gray">产品单位<font>*</font></td>
+			<td><input type="text" name="unit" autocomplete="off" value="" class="layui-input" lay-verify="required" lay-reqText="请输入产品单位"></td>
+			<td class="layui-td-gray">产品规格</td>
+			<td><input type="text" name="specs" autocomplete="off" placeholder="请输入产品规格" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">销售价(元)<font>*</font></td>
+			<td><input type="text" name="sale_price" autocomplete="off" placeholder="请输入产品销售价" lay-verify="required|number" lay-reqText="请输入产品销售价" class="layui-input"></td>
+			<td class="layui-td-gray">成本价(元)</td>
+			<td><input type="text" name="base_price" autocomplete="off" placeholder="请输入产品成本价" class="layui-input" lay-verify="number"></td>
+			<td class="layui-td-gray">采购价(元)</td>
+			<td><input type="text" name="purchase_price" autocomplete="off" placeholder="请输入产品采购价" class="layui-input" lay-verify="number"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">是否实物<font>*</font></td>
+			<td colspan="7">
+				<input type="radio" name="is_object" value="1" title="是" checked>
+				<input type="radio" name="is_object" value="2" title="否" >
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">
+				<div class="layui-input-inline">产品附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="7" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" id="fileBoxInput" data-type="file" name="file_ids" value="">
+				</div>
+			</td>
+		</tr> 
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">产品描述<font>*</font></td>
+			<td colspan="7">
+				<textarea name="content" placeholder="请输入内容" class="layui-textarea" id="container" style="border:0;padding:0"></textarea>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-1">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool','tinymce','uploadPlus'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool,upload = layui.upload,uploadPlus = layui.uploadPlus;
+	
+    //封面上传
+    var uploadInst = upload.render({
+		elem: '#test1'
+		, url: "/api/index/upload"
+		, done: function (res) {
+			layer.msg(res.msg);
+			if (res.code == 0) {
+				//上传成功
+				$('#demo1 input').attr('value', res.data.id);
+				$('#demo1 img').attr('src', res.data.filepath);
+			}
+		}
+    });
+	
+    //编辑器初始化
+	var editor = layui.tinymce;
+	var edit = editor.render({
+		selector: "#container",
+		images_upload_url: '/api/index/upload/sourse/tinymce',//图片上传接口
+		height: 500
+	});	
+	
+	//附件上传
+	var attachment = new uploadPlus({
+		"target":'uploadBtn',
+		"targetBox":'uploadBox'
+	});
+	
+	//监听提交
+	form.on('submit(webform)', function(data){
+		data.field.content = tinyMCE.editors['container'].getContent();
+		if (data.field.content == '') {
+			layer.msg('请先完善产品的描述内容');
+			return false;
+		}
+		let callback = function (e) {
+			layer.msg(e.msg);
+			if (e.code == 0) {
+				tool.sideClose(1000);				
+			}
+		}
+		let clickbtn = $(this);
+		tool.post("/contract/product/add", data.field, callback,clickbtn);
+		return false;
+	});
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/product/datalist.html b/app/contract/view/product/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..ecf3265dd926ba84acc9628a56262629b0317a6f
--- /dev/null
+++ b/app/contract/view/product/datalist.html
@@ -0,0 +1,173 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+  <style>
+	.tree-left{width:220px; float:left; height:100%; overflow: scroll; border:1px solid #eeeeee; background-color:#fff; padding:12px 12px 12px 5px;}
+	.tree-left h3{font-size:16px; height:30px; padding-left:10px; font-weight:800}
+  </style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page" style="height:calc(100% - 36px); box-sizing: border-box;">
+	<div class="tree-left">
+		<h3>产品分类</h3>
+		<div id="cate"></div>
+	</div>
+	<div class="body-table" style="margin-left:248px; overflow:hidden;">
+		<form class="layui-form gg-form-bar border-x border-t">
+			<div class="layui-input-inline" style="width:100px;">
+				<select name="status">
+					<option value="">选择状态</option>
+					<option value="1">正常</option>
+					<option value="0">禁用</option>
+				</select>
+			</div>
+			<div class="layui-input-inline" style="width:300px;">
+				<input type="text" name="keywords" placeholder="关键字，产品名称/产品编码" class="layui-input" autocomplete="off" />
+			</div>
+			<div class="layui-input-inline" style="width:150px;">
+				<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+				<button type="reset" class="layui-btn layui-btn-reset" lay-filter="reset">清空</button>
+			</div>
+		</form>
+		<table class="layui-hide" id="test" lay-filter="test"></table>
+	</div>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm addNew" type="button">+ 添加产品</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool','tablePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool,tree = layui.tree,form = layui.form;
+		$.ajax({
+			url: "/contract/api/get_productcate_tree",
+			type:'get',
+			success:function(res){					
+				//仅节点左侧图标控制收缩
+				tree.render({
+					elem: '#cate',
+					data: res.trees,
+					onlyIconControl: true,  //是否仅允许节点左侧图标控制展开收缩
+					click: function(obj){
+						//layer.msg(JSON.stringify(obj.data));
+						layui.pageTable.reload({
+						   where: {cate_id: obj.data.id},
+						   page:{curr:1}
+						});
+						$('[name="keywords"]').val('');
+						$('[name="status"]').val('');
+						form.render();
+					}
+				});	
+			}
+		})
+		layui.pageTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,title:'产品列表'
+			,url: "/contract/product/datalist"
+			,is_excel: true
+			,cellMinWidth: 60
+			,height: 'full-112'
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'code',width:150, title: '产品编码', align:'center'}
+				,{field:'cate',width:150, title: '产品分类', align:'center'}
+				,{field:'title',title: '产品名称',minWidth:240}
+				,{field:'sale_price',width:100, title: '销售价(元)', align:'center','style':'color:#16b777'}
+				,{field:'purchase_price',width:100, title: '采购价(元)', align:'center','style':'color:#1e9fff'}
+				,{field:'base_price',width:100, title: '成本价(元)', align:'center','style':'color:#a233c6'}
+				,{field:'unit',width:60, title: '单位', align:'center'}
+				,{field:'specs',width:60, title: '规格', align:'center'}
+				,{field:'status', title: '状态',width:60,align:'center',templet: function(d){
+					var html1='<span class="green">正常</span>';
+					var html2='<span class="yellow">禁用</span>';
+					if(d.status==1){
+						return html1;
+					}
+					else{
+						return html2;
+					}
+				}}
+				,{width:150,fixed:'right', title: '操作', align:'center',templet: function(d){
+					var html='';
+					var btn='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a><a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</a>';
+					var btn1='<a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="disable">禁用</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+					var btn3='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
+					if(d.status==1){
+						html = '<div class="layui-btn-group">'+btn+btn1+btn3+'</div>';
+					}
+					else{
+						html = '<div class="layui-btn-group">'+btn+btn2+btn3+'</div>';
+					}
+					return html;
+				}}
+			]]
+		});
+		
+		table.on('tool(test)',function (obj) {
+			if(obj.event === 'edit'){					
+				tool.side("/contract/product/add?id="+obj.data.id);
+			}
+			if(obj.event === 'view'){					
+				tool.side("/contract/product/view?id="+obj.data.id);
+			}
+			if(obj.event === 'disable'){
+				layer.confirm('确定要禁用该产品吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/contract/product/set", { id: obj.data.id,status: 0,title: obj.data.title}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'open'){
+				layer.confirm('确定要启用该产品吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/contract/product/set", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'del'){
+				layer.confirm('确定要删除该产品吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.delete("/contract/product/del", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
+					layer.close(index);
+				});
+			}
+		});
+		
+		$('body').on('click','.addNew',function(){
+			tool.side("/contract/product/add");	
+		});
+		
+		//监听搜索提交
+		form.on('submit(webform)', function(data){
+			layui.pageTable.reload({where:data.field,page:{curr:1}});
+			return false;
+		});
+	}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/product/edit.html b/app/contract/view/product/edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..b8411ff11a62d658a496a144470dd5d584ca59a4
--- /dev/null
+++ b/app/contract/view/product/edit.html
@@ -0,0 +1,142 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">编辑产品</h3>
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">产品名称<font>*</font></td>
+			<td colspan="3"><input type="text" name="title" value="{$detail.title}" autocomplete="off" placeholder="请输入产品名称" lay-verify="required" lay-reqText="请输入产品名称" class="layui-input"></td>
+			<td class="layui-td-gray">产品分类<font>*</font></td>
+			<td>
+				 <select name="cate_id" lay-verify="required" lay-reqText="请选择分类">
+					<option value="">请选择分类</option>
+					{volist name=":set_recursion(get_base_data('ProductCate'))" id="v"}
+					<option value="{$v.id}" {eq name="$v.id" value="$detail.cate_id"} selected{/eq}>{$v.title}</option>
+					{/volist}
+				 </select>
+			</td>
+			<td class="layui-td-gray" rowspan="4">缩略图</td>
+			<td rowspan="4" style="width: 150px; vertical-align:top:">
+				<div class="layui-upload">
+					<button type="button" class="layui-btn layui-btn-normal layui-btn-sm" id="test1">缩略图(尺寸：240x136)</button>
+					<div class="layui-upload-list" id="demo1" style="width: 120px; height:66px; overflow: hidden;">
+						<img src="{:get_file($detail.thumb)}" style="max-width: 100%; height:66px;" />
+						<input type="hidden" name="thumb" value="{$detail.thumb}">
+					</div>
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">产品编码<font>*</font></td>
+			<td><input type="text" name="code" value="{$detail.code}" readonly class="layui-input" lay-verify="required"></td>
+			<td class="layui-td-gray">产品单位<font>*</font></td>
+			<td><input type="text" name="unit" autocomplete="off" value="{$detail.unit}" class="layui-input" lay-verify="required" lay-reqText="请输入产品单位"></td>
+			<td class="layui-td-gray">产品规格</td>
+			<td><input type="text" name="specs" autocomplete="off" value="{$detail.specs}" placeholder="请输入产品规格" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">销售价(元)<font>*</font></td>
+			<td><input type="text" name="sale_price" value="{$detail.sale_price}" autocomplete="off" placeholder="请输入产品销售价" lay-verify="required|number" lay-reqText="请输入产品销售价" class="layui-input"></td>
+			<td class="layui-td-gray">成本价(元)</td>
+			<td><input type="text" name="base_price" value="{$detail.base_price}" lay-verify="number" autocomplete="off" placeholder="请输入产品成本价" class="layui-input"></td>
+			<td class="layui-td-gray">采购价(元)</td>
+			<td><input type="text" name="purchase_price" value="{$detail.purchase_price}" lay-verify="number" autocomplete="off" placeholder="请输入产品采购价" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">是否实物<font>*</font></td>
+			<td colspan="7">
+				<input type="radio" name="is_object" value="1" title="是" {eq name="$detail.is_object" value="1"} checked {/eq}>
+				<input type="radio" name="is_object" value="2" title="否" {eq name="$detail.is_object" value="2"} checked {/eq}>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">
+				<div class="layui-input-inline">产品附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="7" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids}">
+					{notempty name="$detail.file_ids"}
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr> 
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">产品描述<font>*</font></td>
+			<td colspan="7">
+				<textarea name="content" placeholder="请输入内容" class="layui-textarea" id="container" style="border:0;padding:0">{$detail.content}</textarea>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-1">
+		<input type="hidden" name="id" value="{$detail.id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool','tinymce','uploadPlus'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool,upload = layui.upload,uploadPlus = layui.uploadPlus;
+	
+    //封面上传
+    var uploadInst = upload.render({
+		elem: '#test1'
+		, url: "/api/index/upload"
+		, done: function (res) {
+			layer.msg(res.msg);
+			if (res.code == 0) {
+				//上传成功
+				$('#demo1 input').attr('value', res.data.id);
+				$('#demo1 img').attr('src', res.data.filepath);
+			}
+		}
+    });
+	
+    //编辑器初始化
+	var editor = layui.tinymce;
+	var edit = editor.render({
+		selector: "#container",
+		images_upload_url: '/api/index/upload/sourse/tinymce',//图片上传接口
+		height: 500
+	});	
+	
+	//附件上传
+	var attachment = new uploadPlus({
+		"target":'uploadBtn',
+		"targetBox":'uploadBox'
+	});
+	
+	//监听提交
+	form.on('submit(webform)', function(data){
+		data.field.content = tinyMCE.editors['container'].getContent();
+		if (data.field.content == '') {
+			layer.msg('请先完善产品的描述内容');
+			return false;
+		}
+		let callback = function (e) {
+			layer.msg(e.msg);
+			if (e.code == 0) {
+				tool.sideClose(1000);				
+			}
+		}
+		let clickbtn = $(this);
+		tool.post("/contract/product/add", data.field, callback,clickbtn);
+		return false;
+	});
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/product/view.html b/app/contract/view/product/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..11bc7f57662aa79eea4786641b18b942e899f0b5
--- /dev/null
+++ b/app/contract/view/product/view.html
@@ -0,0 +1,77 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-4">
+	<h3 class="pb-1">产品详情</h3>
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">产品名称</td>
+			<td colspan="3">{$detail.title}</td>
+			<td class="layui-td-gray">产品分类</td>
+			<td>{$detail.cate}</td>
+			<td class="layui-td-gray" rowspan="4">缩略图</td>
+			<td rowspan="4" style="width:150px;">
+				<div class="layui-upload-list" id="demo1" style="width: 150px; height:80px; overflow: hidden;">
+					<img src="{:get_file($detail.thumb)}" style="max-width: 100%; height:66px;" />
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">产品编码</td>
+			<td>{$detail.code}</td>
+			<td class="layui-td-gray">产品单位</td>
+			<td>{$detail.unit}</td>
+			<td class="layui-td-gray">产品规格</td>
+			<td>{$detail.specs}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">销售价(元)</td>
+			<td>{$detail.sale_price}</td>
+			<td class="layui-td-gray">成本价(元)</td>
+			<td>{$detail.base_price}</td>
+			<td class="layui-td-gray">采购价(元)</td>
+			<td>{$detail.purchase_price}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">是否实物</td>
+			<td colspan="7">
+				{eq name="$detail.is_object" value="1"}是{/eq}
+				{eq name="$detail.is_object" value="2"}否{/eq}
+			</td>
+		</tr>
+		{notempty name="$detail.file_ids"}
+		<tr>
+			<td class="layui-td-gray">相关附件</td>
+			<td colspan="7" style="line-height:inherit">
+				<div class="layui-row">
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+		<tr>
+			<td class="layui-td-gray" colspan="8" style="text-align:left; color:#666"><strong>产品描述</strong></td>
+		</tr>
+		<tr>
+			<td colspan="8">
+				{$detail.content|raw}
+			</td>
+		</tr>
+	</table>
+
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/productcate/add.html b/app/contract/view/productcate/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..65e02217b258683b22d4985a9f52bc15845711d2
--- /dev/null
+++ b/app/contract/view/productcate/add.html
@@ -0,0 +1,91 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-1">产品分类</h3>
+	{eq name="$id" value="0"}
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">父级分类<font>*</font></td>
+			<td>
+				<select name="pid" lay-verify="required" lay-reqText="请选择父级分类">
+				  <option value="0">作为顶级分类</option>
+				  {volist name="$cates" id="v"}
+				  <option value="{$v.id}" {eq name="$pid" value="$v.id"}selected=""{/eq}>{$v.title}</option>
+				  {/volist}
+				</select>
+			</td>
+			<td class="layui-td-gray">分类名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入分类名称" lay-reqText="请输入分类名称" class="layui-input">
+			</td>
+			<td class="layui-td-gray">排序</td>
+			<td>
+				<input type="text" name="sort" placeholder="请输入排序，数字" value="0" autocomplete="off" class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">描述</td>
+			<td colspan="5"><textarea name="desc" placeholder="请输入描述，可空" class="layui-textarea"></textarea></td>
+		</tr>
+	</table>
+	{else/}
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">父级分类<font>*</font></td>
+			<td>
+				<select name="pid" lay-verify="required" lay-reqText="请选择父级分类">
+				  <option value="0">作为顶级分类</option>
+				  {volist name="$cates" id="v"}
+				  <option value="{$v.id}" {eq name="$detail.pid" value="$v.id"}selected=""{/eq}>{$v.title}</option>
+				  {/volist}
+				</select>
+			</td>
+			<td class="layui-td-gray">分类名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" value="{$detail.title}" lay-verify="required" placeholder="请输入分类名称" lay-reqText="请输入分类名称" class="layui-input">
+			</td>
+			<td class="layui-td-gray">排序</td>
+			<td>
+				<input type="text" name="sort" value="{$detail.sort}" placeholder="请输入排序，数字" value="0" class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">描述</td>
+			<td colspan="5"><textarea name="desc" placeholder="请输入描述，可空" class="layui-textarea">{$detail.desc}</textarea></td>
+		</tr>
+	</table>
+	{/eq}
+	<div class="pt-3">
+		<input type="hidden" name="id" value="{$id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool;		  
+		//监听提交
+		form.on('submit(webform)', function(data){
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					setTimeout(function () {
+						parent.location.reload();
+					}, 1000);					
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/contract/productcate/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/productcate/datalist.html b/app/contract/view/productcate/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..a6d7e501ddc24792b047dd8c9aee1b5dc83e731f
--- /dev/null
+++ b/app/contract/view/productcate/datalist.html
@@ -0,0 +1,86 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-3">
+	<div class="gg-form-bar border-t border-x" style="padding-bottom:10px;">
+		<button class="layui-btn layui-btn-sm add-menu">+ 添加产品分类</button>
+    </div>
+    <div>
+      <table class="layui-hide" id="treeTable" lay-filter="treeTable"></table>
+    </div> 
+</div>
+<script type="text/html" id="switchStatus">
+	<input type="checkbox" name="status" value="{{d.id}}" lay-skin="switch" lay-text="是|否" lay-filter="status" {{ d.status == 1 ? 'checked' : '' }}>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var treeTable = layui.treeTable, tool = layui.tool;
+		
+		layui.pageTable = treeTable.render({
+			elem: '#treeTable'
+			,url: "/contract/productcate/datalist"
+			,tree: { // treeTable 特定属性集
+				customName: {name:'title'},
+				data: {},
+				view: {
+					showIcon:false,
+					expandAllDefault:true
+				},
+				async: {},
+					callback: {}
+				}
+				,cols: [[
+					{field:'id',width:80, title: 'ID号', align:'center'}
+					,{field: 'sort', title: '排序',align:'center', width:80}
+					,{field:'title', width:240, title: '分类名称'}
+					,{field:'pid', title: '父级ID', width:80, align:'center'}
+					,{field:'desc', title: '描述', }
+					,{width:160,title: '操作', align:'center',templet: function(d){
+						var html = '<span class="layui-btn-group"><button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="add">添加子分类</button><button class="layui-btn layui-btn-xs" lay-event="edit">编辑</button><button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button></span>';
+					return html;
+					  }
+					}
+				]]
+				,page:false
+				//,skin:'line'
+			});
+			
+			//表头工具栏事件
+			$('.add-menu').on('click', function(){
+				tool.side('/contract/productcate/add');
+				return;
+			});
+			
+			//操作按钮
+			treeTable.on('tool(treeTable)', function (obj) {
+				if (obj.event === 'add') {
+					tool.side('/contract/productcate/add?pid='+obj.data.id);
+					return;
+				}
+				if (obj.event === 'edit') {
+					tool.side('/contract/productcate/add?id='+obj.data.id);
+					return;
+				}
+				if (obj.event === 'del') {
+					layer.confirm('确定要删除吗?', { icon: 3, title: '提示' }, function (index) {
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								obj.del();
+							}
+						}
+						tool.delete('/contract/productcate/del', { id: obj.data.id }, callback);
+						layer.close(index);
+					});
+				}
+			});
+		}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/purchase/add.html b/app/contract/view/purchase/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..b74d5514960a29f0a0efd831ae7a24f3d541ab05
--- /dev/null
+++ b/app/contract/view/purchase/add.html
@@ -0,0 +1,227 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">新增采购合同</h3>
+    <table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">合同名称<font>*</font></td>
+			<td colspan="3"><input type="text" name="name" value="" lay-verify="required" lay-reqText="请输入合同名称" autocomplete="off" placeholder="请输入合同名称" class="layui-input"></td>
+			<td class="layui-td-gray">合同性质</td>
+			<td>
+				<input type="hidden" name="types" value="{$types}">
+				{eq name="$types" value="1" }普通采购{/eq}
+				{eq name="$types" value="2" }物品采购{/eq}
+				{eq name="$types" value="3" }服务采购{/eq}
+			</td>
+		</tr>
+        <tr>
+			<td class="layui-td-gray">签约主体<span style="font-size:12px;">(甲方)</span><font>*</font></td>
+			<td colspan="3">
+				<select name="subject_id" lay-verify="required" lay-reqText="请选择签约主体公司">
+					<option value="">请选择签约主体公司</option>
+					{volist name=":get_base_data('Enterprise')" id="v"}
+					<option value="{$v.id}">{$v.title}</option>
+					{/volist}
+				</select>
+			</td>
+			<td class="layui-td-gray-2">合同始止日期<font>*</font></td>
+			<td id="barDate" style="width:320px;">
+				<div class="layui-input-inline" style="width:150px;">
+					<input type="text" class="layui-input" id="start_time" value="" placeholder="选择时间区间" readonly name="start_time" lay-verify="required" lay-reqText="请选择合同开始时间">
+				</div>
+				~
+				<div class="layui-input-inline" style="width:150px;">
+					<input type="text" class="layui-input" id="end_time" value="" placeholder="选择时间区间" readonly name="end_time" lay-verify="required" lay-reqText="请选择合同结束时间">
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">供应商名称<span style="font-size:12px;">(乙方)</span><font>*</font></td>
+			<td colspan="3">			
+				{eq name="$is_supplier" value="1"}
+				<input type="text" name="supplier" autocomplete="off" value="" readonly lay-verify="required" lay-reqText="请输入供应商名称" placeholder="请输入供应商名称" class="layui-input supplier-picker">				
+				{else/}
+				<input type="text" name="supplier" autocomplete="off" value="" lay-verify="required" lay-reqText="请输入供应商名称" placeholder="请输入供应商名称" class="layui-input">				
+				{/eq}
+				<input type="hidden" name="supplier_id" value="0">			
+			</td>
+			<td class="layui-td-gray">签约供应商代表<font>*</font></td>
+			<td><input type="text" name="contact_name" value="" autocomplete="off" lay-verify="required" lay-reqText="请输入供应商代表姓名" placeholder="请输入供应商代表姓名" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-3">供应商联系地址</td>
+			<td colspan="3"><input type="text" name="contact_address" value="" autocomplete="off" placeholder="请输入供应商联系地址" class="layui-input"></td>
+			<td class="layui-td-gray-3">供应商联系电话</td>
+			<td><input type="text" name="contact_mobile" value="" autocomplete="off" placeholder="请输入供应商联系电话" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">合同金额<font>*</font></td>
+			<td>
+				{eq name="$types" value="1"}
+				<input type="text" name="cost" value="" lay-verify="required|number" lay-reqText="请输入合同金额，数字" placeholder="请输入合同金额，数字" autocomplete="off" class="layui-input">
+				{/eq}
+				{eq name="$types" value="2"}
+				<input type="text" name="cost" value="" lay-verify="required|number" lay-reqText="请完善物品信息" placeholder="完善物品信息，合同金额自动计算" readonly class="layui-input layui-input-readonly">
+				{/eq}
+				{eq name="$types" value="3"}
+				<input type="text" name="cost" value="" lay-verify="required|number" lay-reqText="请完善服务信息" placeholder="完善服务信息，合同金额自动计算" readonly class="layui-input layui-input-readonly">
+				{/eq}
+			</td>
+			<td class="layui-td-gray">合同类别<font>*</font></td>
+			<td>
+				<select name="cate_id" lay-verify="required" lay-reqText="请选择合同类别">
+					<option value="">请选择合同类别</option>
+					{volist name=":get_base_data('ContractCate');" id="vo"}
+					<option value="{$vo.id}">{$vo.title}</option>
+					{/volist}
+				</select>
+			</td>
+			<td class="layui-td-gray">合同编号<font>*</font></td>
+			<td><input type="text" name="code" value="{$codeno}" autocomplete="off" {eq name="$is_codeno" value="1"}readonly{/eq} lay-verify="required" lay-reqText="请输入合同编号" placeholder="请输入合同编号" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td colspan="6"><strong>签订信息</strong></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">合同签订人<font>*</font></td>
+			<td>
+				 <input type="text" name="sign_name" value="" autocomplete="off" readonly lay-verify="required" lay-reqText="请选择合同签订人" placeholder="请选择合同签订人" class="layui-input picker-diy">
+				 <input type="hidden" name="sign_uid" value="0">
+			</td>
+			<td class="layui-td-gray-2">合同所属部门<font>*</font></td>
+			<td>
+				<input type="text" name="sign_department" value="" autocomplete="off" readonly lay-verify="required" lay-reqText="请选择合同所属部门"  placeholder="请选择合同所属部门" class="layui-input picker-oa" data-types="department">
+			  	<input type="hidden" name="did" value="0">
+			</td>
+			<td class="layui-td-gray-2">合同签订日期<font>*</font></td>
+			<td><input type="text" name="sign_time" value="" readonly lay-verify="required" lay-reqText="请选择合同签订日期" placeholder="请选择合同签订日期" class="layui-input tool-time"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">合同制定人</td>
+			<td>
+				<input type="text" name="prepared_name" value="" readonly placeholder="请选择合同制定人" class="layui-input picker-admin">
+				<input type="hidden" name="prepared_uid" value="0">
+			</td>
+			<td class="layui-td-gray-2">合同保管人</td>
+			<td>
+				<input type="text" name="keeper_name"  value="" readonly placeholder="请选择合同保管人" class="layui-input picker-admin">
+				<input type="hidden" name="keeper_uid" value="0">
+			</td>
+			<td class="layui-td-gray">合同共享人员</td>
+			<td colspan="3">
+				<input type="text" name="share_names" value="" readonly placeholder="请选择共享人员" class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="share_ids" value="">
+			</td>
+		</tr>
+		{eq name="$types" value="2"}{include file="/purchase/add_purchased"}{/eq}		
+		{eq name="$types" value="3"}{include file="/purchase/add_service"}{/eq}	
+		<tr>
+			<td colspan="6"><strong>相关附件</strong></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">
+				<button type="button" class="layui-btn layui-btn-sm" id="uploadBtn"><i class="layui-icon"></i>附件上传</button>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" id="fileBoxInput" data-type="file" name="file_ids" value="">
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td colspan="6"><strong>备注信息</strong></td>
+		</tr>
+		<tr>
+			<td colspan="6"><textarea name="remark" placeholder="请输入备注信息" class="layui-textarea"></textarea></td>
+		</tr>
+    </table>
+	<div class="pt-4">
+		<input type="hidden" name="scene" value="add">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','oaPicker','uploadPlus'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,laydate = layui.laydate, oaPicker = layui.oaPicker,uploadPlus = layui.uploadPlus;
+		if(typeof purchased_fun==='function'){
+			purchased_fun(layui);
+		}
+		if(typeof service_fun==='function'){
+			service_fun(layui);
+		}
+		//日期范围
+		laydate.render({
+			elem: '#barDate',
+			range: ['#start_time', '#end_time']
+		});
+		//附件上传
+		var attachment = new uploadPlus({
+			"target":'uploadBtn',
+			"targetBox":'uploadBox'
+		});
+		
+		//选择员工弹窗        
+		$('body').on('click','.picker-diy',function () {
+			let that = $(this);
+			let ids=that.next().val()+'',names = that.val()+'';
+			oaPicker.employeeInit({
+				ids:ids,
+				names:names,
+				type:1,//1是单选，2是多选
+				callback:function(data){
+					//这里是选择后的回调方法，可以根据具体需求自定义写哦
+					let select_id=[],select_name=[];
+					for(var a=0; a<data.length;a++){
+						select_id.push(data[a].id);
+						select_name.push(data[a].name);
+					}
+					that.val(select_name.join(','));
+					that.next().val(select_id.join(','));
+				}
+			});
+		});
+		
+		//选择供应商弹窗        
+		$('body').on('click','.supplier-picker',function () {
+			let that = $(this),ids = [],titles=[],contact_name=[],contact_mobile=[],address=[],map = {},types = 'supplier',type = 1;
+			let callback = function(data){
+				for ( var i = 0; i <data.length; i++){
+					ids.push(data[i].id);
+					titles.push(data[i].title);
+					contact_name.push(data[i].contact_name);
+					contact_mobile.push(data[i].contact_mobile);
+					address.push(data[i].address);
+				}
+				that.val(titles.join(','));
+				that.next().val(ids.join(','));
+				$('[name="contact_name"]').val(contact_name.join(','));
+				$('[name="contact_mobile"]').val(contact_mobile.join(','));
+				$('[name="contact_address"]').val(address.join(','));
+			}
+			oaPicker.picker(types,type,callback,map);
+		});
+		
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/contract/purchase/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/purchase/add_purchased.html b/app/contract/view/purchase/add_purchased.html
new file mode 100644
index 0000000000000000000000000000000000000000..dde875b94bfff0d7a3701670055651fb7c228d16
--- /dev/null
+++ b/app/contract/view/purchase/add_purchased.html
@@ -0,0 +1,116 @@
+<tr>
+	<td colspan="6"><strong>物品信息</strong> <span class="layui-btn layui-btn-sm" type="button" id="purchasedAdd">+ 添加物品</span></td>
+</tr>
+<tr>
+	<td colspan="6">				
+		<table id="purchasedTable" class="layui-table layui-table-min" style="margin:0">
+			<tr>
+				<th width="200">物品名称</th>
+				<th width="100">单位</th>
+				<th width="100">规格</th>
+				<th width="100">采购单价</th>
+				<th width="100">数量</th>
+				<th width="100">小计</th>
+				<th>备注信息</th>
+				<th width="60">操作</th>
+			</tr>
+			<tr class="purchased-tr">
+				{eq name="is_purchased" value="1"}
+				<td><input type="text" name="purchased_title[]" value="" class="layui-input purchased-picker" readonly lay-verify="required" lay-reqText="请输入物品名称"><input type="hidden" name="purchased_id[]" value="0"></td>
+				{else/}
+				<td><input type="text" name="purchased_title[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入物品名称"><input type="hidden" name="purchased_id[]" value="0"></td>
+				{/eq}
+				<td><input type="text" name="purchased_unit[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入单位"></td>
+				<td><input type="text" name="purchased_specs[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入物品规格"></td>
+				<td><input type="text" name="purchased_price[]" value="0.00" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入采购单价"></td>
+				<td><input type="text" name="purchased_num[]" value="1" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入物品数量"></td>
+				<td><input type="text" name="purchased_subtotal[]" value="0.00" class="layui-input layui-input-readonly" readonly></td>
+				<td><input type="text" name="purchased_remark[]" value="" class="layui-input"></td>
+				<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>
+			</tr>
+		</table>
+	</td>
+</tr>
+<script>
+const is_purchased={$is_purchased};
+function purchased_fun(layui){
+	let form = layui.form,oaPicker = layui.oaPicker;
+	
+	//选择物品弹窗        
+	$('body').on('click','.purchased-picker',function () {
+		let that = $(this),ids = [],titles=[],purchase_price=[],unit=[],specs=[],map = {},types = 'purchased',type = 1;
+		let callback = function(data){
+			for ( var i = 0; i <data.length; i++){
+				ids.push(data[i].id);
+				titles.push(data[i].title);
+				unit.push(data[i].unit);
+				specs.push(data[i].specs);
+				purchase_price.push(data[i].purchase_price);
+			}
+			that.val(titles.join(','));
+			that.next().val(ids.join(','));
+			that.parents('.purchased-tr').find('input').eq(2).val(unit.join(','));
+			that.parents('.purchased-tr').find('input').eq(3).val(specs.join(','));
+			that.parents('.purchased-tr').find('input').eq(4).val(purchase_price.join(','));
+			that.parents('.purchased-tr').find('input').eq(6).val(purchase_price.join(','));
+			count_cost();
+		}
+		oaPicker.picker(types,type,callback,map);
+	});
+	
+	//添加物品信息表格
+	$('#purchasedAdd').on('click',function(){
+		var html = '',purchased_title=' class="layui-input"';
+		if(is_purchased==1){
+			purchased_title=' class="layui-input purchased-picker" readonly';
+		}
+		html += '<tr class="purchased-tr">\
+					<td><input type="text" name="purchased_title[]" value="" '+purchased_title+' lay-verify="required" lay-reqText="请输入物品名称"><input type="hidden" name="purchased_id[]" value="0"></td>\
+					<td><input type="text" name="purchased_unit[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入单位"></td>\
+					<td><input type="text" name="purchased_specs[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入物品规格"></td>\
+					<td><input type="text" name="purchased_price[]" value="0.00" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入采购单价"></td>\
+					<td><input type="text" name="purchased_num[]" value="1" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入物品数量"></td>\
+					<td><input type="text" name="purchased_subtotal[]" value="0.00" class="layui-input layui-input-readonly" readonly></td>\
+					<td><input type="text" name="purchased_remark[]" value="" class="layui-input"></td>\
+					<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>\
+				</tr>';
+		$('#purchasedTable').append(html).find('.tr-none').remove();
+		form.render();
+	});	
+
+	$('#purchasedTable').on('click', '[lay-event="del"]', function() {
+		if($('.purchased-tr').length<2){
+			layer.msg('至少保留一个物品选项');
+			return false;
+		}
+		$(this).parents('.purchased-tr').remove();
+		count_cost();
+	});	
+	
+	//计算价格
+	$('#purchasedTable').on('input', '.input-num', function() {
+		var inputs = $(this).parents('.purchased-tr').find("input");
+		var purchased_price = inputs.eq(4).val();
+		var purchased_num = inputs.eq(5).val();
+		var purchased_amount = (purchased_price*purchased_num).toFixed(2);			  
+		if(isNaN(purchased_amount)){ 
+			purchased_amount = 0.00;
+		}
+		inputs.eq(6).val(purchased_amount);
+		count_cost();
+	});
+	 
+	//计算总价
+	function count_cost(){
+		var purchased_subtotal = $('#purchasedTable').find('[name="purchased_subtotal[]"]');
+		var total = 0;
+		for (var m = 0; m < purchased_subtotal.length; m++) {
+			total+=$(purchased_subtotal[m]).val()*1000;
+		}
+		if(isNaN(total)){ 
+			total = 0;
+		}
+		$('[name="cost"]').val((total/1000).toFixed(2));
+	}
+}
+</script>
diff --git a/app/contract/view/purchase/add_service.html b/app/contract/view/purchase/add_service.html
new file mode 100644
index 0000000000000000000000000000000000000000..9a55d19c617ca4cea275f8386a7dad9734d00401
--- /dev/null
+++ b/app/contract/view/purchase/add_service.html
@@ -0,0 +1,82 @@
+<tr>
+	<td class="layui-td-gray" colspan="6" style="text-align:left; color:#666"><strong>服务信息</strong> <span class="layui-btn layui-btn-sm" type="button" id="serviceAdd">+ 添加服务</span></td>
+</tr>
+<tr>
+	<td colspan="6">				
+		<table id="serviceTable" class="layui-table layui-table-min" style="margin:0">
+			<tr>
+				<th width="200">服务名称</th>
+				<th width="200">服务周期</th>
+				<th width="100">服务单价</th>
+				<th width="100">服务次数</th>
+				<th width="100">小计</th>
+				<th>备注信息</th>
+				<th width="60">操作</th>
+			</tr>
+			<tr class="service-tr">
+				<td><input type="text" name="service_title[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入服务名称"></td>
+				<td><input type="text" name="service_date[]" value="" class="layui-input layui-input-readonly tool-time" data-range="到" lay-verify="required" lay-reqText="请选择服务周期" readonly></td>
+				<td><input type="text" name="service_price[]" value="0.00" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务单价"></td>
+				<td><input type="text" name="service_num[]" value="1" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务次数"></td>
+				<td><input type="text" name="service_subtotal[]" value="0.00" class="layui-input layui-input-readonly" readonly></td>
+				<td><input type="text" name="service_remark[]" value="" class="layui-input"></td>
+				<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>
+			</tr>
+		</table>
+	</td>
+</tr>
+<script>
+function service_fun(layui){
+	let form = layui.form;
+	//添加服务信息表格
+	$('#serviceAdd').on('click',function(){
+		var html = '';
+		html += '<tr class="service-tr">\
+					<td><input type="text" name="service_title[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入服务名称"></td>\
+					<td><input type="text" name="service_date[]" value="" class="layui-input layui-input-readonly tool-time" data-range="到" lay-verify="required" lay-reqText="请选择服务周期" readonly></td>\
+					<td><input type="text" name="service_price[]" value="0.00" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务单价"></td>\
+					<td><input type="text" name="service_num[]" value="1" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务次数"></td>\
+					<td><input type="text" name="service_subtotal[]" value="0.00" class="layui-input layui-input-readonly" readonly></td>\
+					<td><input type="text" name="service_remark[]" value="" class="layui-input"></td>\
+					<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>\
+				</tr>';
+		$('#serviceTable').append(html).find('.tr-none').remove();
+		form.render();
+	});
+
+	$('#serviceTable').on('click', '[lay-event="del"]', function() {
+		if($('.service-tr').length<2){
+			layer.msg('至少保留一个服务选项');
+			return false;
+		}
+		$(this).parents('.service-tr').remove();
+		count_cost();
+	});	
+	
+	//计算价格
+	$('#serviceTable').on('input', '.input-num', function() {
+		var inputs = $(this).parents('.service-tr').find("input");
+		var service_price = inputs.eq(2).val();
+		var service_num = inputs.eq(3).val();
+		var service_amount = (service_price*service_num).toFixed(2);			  
+		if(isNaN(service_amount)){ 
+			service_amount = 0.00;
+		}
+		inputs.eq(4).val(service_amount);
+		count_cost();
+	});
+	 
+	//计算总价
+	function count_cost(){
+		var service_subtotal = $('#serviceTable').find('[name="service_subtotal[]"]');
+		var total = 0;
+		for (var m = 0; m < service_subtotal.length; m++) {
+			total+=$(service_subtotal[m]).val()*1000;
+		}
+		if(isNaN(total)){ 
+			total = 0;
+		}
+		$('[name="cost"]').val((total/1000).toFixed(2));
+	}
+}
+</script>
diff --git a/app/contract/view/purchase/add_types.html b/app/contract/view/purchase/add_types.html
new file mode 100644
index 0000000000000000000000000000000000000000..789bd6060786251ebde001c6a3e8828b2b03bfed
--- /dev/null
+++ b/app/contract/view/purchase/add_types.html
@@ -0,0 +1,31 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">新增合同</h3>
+    <table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray-2">选择合同性质</td>
+			<td>
+				<div class="layui-btn-group">
+				  <a href="/contract/purchase/add?types=1" class="layui-btn">普通采购</a>
+				  <a href="/contract/purchase/add?types=2" class="layui-btn">物品采购</a>
+				  <a href="/contract/purchase/add?types=3" class="layui-btn">服务采购</a>
+				</div>
+			</td>
+		</tr>
+    </table>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/purchase/archivelist.html b/app/contract/view/purchase/archivelist.html
new file mode 100644
index 0000000000000000000000000000000000000000..5d2ae4dd8ed9fe023cfa3c2bb46789929015508b
--- /dev/null
+++ b/app/contract/view/purchase/archivelist.html
@@ -0,0 +1,178 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<div class="layui-card border-x border-t" style="margin-bottom:0; box-shadow:0 0 0 0 rgb(5 32 96 / 0%)">
+		<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
+			<ul class="layui-tab-title">
+				<li><a href="/contract/contract/archivelist">销售合同</a></li>
+				<li class="layui-this"><a href="/contract/purchase/archivelist">采购合同</a></li>
+			</ul>
+		</div> 
+	</div> 
+	<form class="layui-form gg-form-bar border-x">
+		<div class="layui-input-inline" style="width:122px;">
+			<select name="types">
+				<option value="">选择合同性质</option>
+				<option value="1">普通采购</option>
+				<option value="2">物品采购</option>
+				<option value="3">服务采购</option>
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:122px;">
+			<select name="cate_id">
+				<option value="">选择合同类别</option>
+				{volist name=":get_base_data('ContractCate');" id="vo"}
+				<option value="{$vo.id}">{$vo.title}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:175px;">
+			<input type="text" class="layui-input" id="sign_time" placeholder="选择合同签订日期" readonly name="sign_time">
+		</div>
+		<div class="layui-input-inline" style="width:175px;">
+			<input type="text" class="layui-input" id="end_time" placeholder="选择合同到期日期" readonly name="end_time">
+		</div>
+		<div class="layui-input-inline" style="width:220px;">
+			<input type="text" name="keywords" placeholder="输入关键字，合同编号/合同名称" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<input type="hidden" name="tab" value="0" />
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_contract" lay-filter="table_contract"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+	<h3>归档合同</h3>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const delay_num = {$delay_num|default=30};
+	const moduleInit = ['tool','tablePlus','laydatePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus,dropdown = layui.dropdown, tool = layui.tool,laydatePlus = layui.laydatePlus;
+		//日期范围
+		var sign_time = new laydatePlus({'target':'sign_time'});
+		var end_time = new laydatePlus({'target':'end_time'});
+		layui.pageTable = table.render({
+			elem: "#table_contract"
+			, toolbar: "#toolbarDemo"
+			,url: "/contract/purchase/archivelist"
+			,is_excel: true
+			,page: true
+			,limit: 20
+			,cellMinWidth: 60
+			,height: 'full-152'
+			,cols: [[ //表头
+				{
+					field: 'id',
+					title: 'ID号',
+					align: 'center',
+					width: 80
+				},{
+					field: 'code',
+					title: '合同编号',
+					align: 'center',
+					width: 150
+				},{
+					field: 'name',
+					title: '合同名称',
+					minWidth:240,
+					templet: '<div><a data-href="/contract/purchase/view/id/{{d.id}}.html" class="side-a">{{d.name}}</a></div>'
+				},{
+					field: 'cate_title',
+					title: '合同类别',
+					align: 'center',
+					width: 100
+				},{
+					field: 'type_name',
+					title: '合同性质',
+					align: 'center',
+					width: 80,
+					templet: function (d) {
+						var html = '<span class="layui-color-' + d.type_a + '">' + d.type_name + '</span>';
+						return html;
+					}
+				},{
+					field: 'interval_time',
+					title: '合同有效时间',
+					align: 'center',
+					width: 248,
+					templet: function (d) {
+						var html = d.interval_time;
+						if (d.delay > 0 && d.delay < delay_num) {
+							html += '<span class="red ml-1" style="font-size:12px;">' + d.delay + '天后到期</span>';
+						}
+						if (d.delay == 0) {
+							html += '<span class="red ml-1" style="font-size:12px;">已过期</span>';
+						}
+						return html;
+					}
+				},{
+					field: 'cost',
+					title: '合同金额(元)',
+					align: 'right',
+					width: 100
+				},{
+					field: 'archive_name',
+					title: '归档人',
+					align: 'center',
+					width: 80
+				},{
+					field: 'archive_time',
+					title: '归档日期',
+					align: 'center',
+					width: 90
+				},{
+					field: 'sign_name',
+					title: '签定人',
+					align: 'center',
+					width: 80
+				},{
+					field: 'sign_time',
+					title: '签订日期',
+					align: 'center',
+					width: 90
+				},{
+					field: 'keeper_name',
+					title: '保管人',
+					align: 'center',
+					width: 80
+				},{
+					field: 'right',
+					fixed:'right',
+					title: '操作',
+					width: 60,
+					align: 'center',
+					ignoreExport:true,
+					templet: function (d) {
+						var btn0='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</span>';
+						return btn0;
+					}						
+				}
+			]]
+		});
+			
+		table.on('tool(table_contract)',function (obj) {
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/contract/purchase/view?id="+data.id);
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/purchase/datalist.html b/app/contract/view/purchase/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..981eb48d8c43b3e4ccfb154a533bf8d8429f17ef
--- /dev/null
+++ b/app/contract/view/purchase/datalist.html
@@ -0,0 +1,249 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<div class="layui-card border-x border-t" style="margin-bottom:0; box-shadow:0 0 0 0 rgb(5 32 96 / 0%)">
+		<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
+			<ul class="layui-tab-title">
+				<li class="layui-this">全部</li>
+				<li>待我审批</li>
+				<li>我已审批</li>
+			</ul>
+		</div> 
+	</div>
+	<form class="layui-form gg-form-bar border-x" id="barsearchform">
+		{gt name="$is_auth" value="0"}
+		<div class="layui-input-inline user-name" style="width:90px;">
+			<input type="text" name="username" placeholder="选择签定人" class="layui-input picker-admin" readonly />
+			<input type="text" name="uid" value="" style="display:none" />	
+		</div>
+		{else/}
+		{gt name="$is_leader" value="0"}
+		<div class="layui-input-inline user-name" style="width:90px;">
+			<input type="text" name="username" placeholder="选择签定人" class="layui-input picker-sub" readonly />
+			<input type="text" name="uid" value="" style="display:none" />	
+		</div>
+		{/gt}
+		{/gt}
+		<div class="layui-input-inline" style="width:122px;">
+			<select name="types">
+				<option value="">选择合同性质</option>
+				<option value="1">普通采购</option>
+				<option value="2">物品采购</option>
+				<option value="3">服务采购</option>
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:122px;">
+			<select name="cate_id">
+				<option value="">选择合同类别</option>
+				{volist name=":get_base_data('ContractCate');" id="vo"}
+				<option value="{$vo.id}">{$vo.title}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:122px;">
+			<select name="check_status">
+				<option value="">选择审批状态</option>
+				{volist name=":get_check_status()" id="vo"}
+				<option value="{$key}">{$vo}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:175px;">
+			<input type="text" class="layui-input" id="sign_time" placeholder="选择合同签订日期" readonly name="sign_time">
+		</div>
+		<div class="layui-input-inline" style="width:175px;">
+			<input type="text" class="layui-input" id="end_time" placeholder="选择合同到期日期" readonly name="end_time">
+		</div>
+		<div class="layui-input-inline" style="width:220px;">
+			<input type="text" name="keywords" placeholder="输入关键字，合同编号/合同名称" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<input type="hidden" name="tab" value="0" />
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_contract" lay-filter="table_contract"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+	<button class="layui-btn layui-btn-sm" lay-event="add">
+		<span>+ 添加合同</span>
+		<i class="layui-icon layui-icon-down layui-font-12"></i>
+	</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const delay_num = {$delay_num|default=30};
+	const contract_types = [{"id":1,"title":"普通采购"},{"id":2,"title":"物品采购"},{"id":3,"title":"服务采购"}];
+	const moduleInit = ['tool','tablePlus','oaPicker','laydatePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus,dropdown = layui.dropdown,element = layui.element, tool = layui.tool,laydatePlus = layui.laydatePlus;
+		
+		//tab切换
+		element.on('tab(tab)', function(data){
+			$('[name="tab"]').val(data.index);
+			$("#barsearchform")[0].reset();
+			layui.pageTable.reload({where:{tab:data.index},page:{curr:1}});
+			return false;
+		});
+		
+		//日期范围
+		var sign_time = new laydatePlus({'target':'sign_time'});
+		var end_time = new laydatePlus({'target':'end_time'});
+		
+		layui.pageTable = table.render({
+			elem: "#table_contract"
+			,title: "采购合同列表"
+			,toolbar: "#toolbarDemo"
+			,url: "/contract/purchase/datalist"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 80
+			,height: 'full-152'
+			,cols: [[ //表头
+				{
+					field: 'id',
+					title: 'ID号',
+					align: 'center',
+					width: 80
+				},{ field: 'check_status', title: '审批状态', align: 'center', width: 110, templet: function (d) {
+					var html = '<span class="check-status-color-' + d.check_status + '">『' + d.status_name + '』</span>';
+					return html;
+					}
+				},{
+					field: 'code',
+					title: '合同编号',
+					align: 'center',
+					width: 150
+				},{
+					field: 'name',
+					title: '合同名称',
+					minWidth:240,
+					templet: '<div><a data-href="/contract/purchase/view/id/{{d.id}}.html" class="side-a">{{d.name}}</a></div>'
+				},{
+					field: 'types_name',
+					title: '合同性质',
+					align: 'center',
+					width: 80,
+					templet: function (d) {
+						var html = '<span class="layui-color-' + d.types + '">' + d.types_name + '</span>';
+						return html;
+					}
+				},{
+					field: 'cate_title',
+					title: '合同类别',
+					align: 'center',
+					width: 100
+				},{
+					field: 'interval_time',
+					title: '合同有效时间',
+					align: 'center',
+					width: 248,
+					templet: function (d) {
+						var html = d.interval_time;
+						if (d.delay > 0 && d.delay < delay_num) {
+							html += '<span class="red ml-1" style="font-size:12px;">' + d.delay + '天后到期</span>';
+						}
+						if (d.delay == 0) {
+							html += '<span class="red ml-1" style="font-size:12px;">已过期</span>';
+						}
+						return html;
+					}
+				},{
+					field: 'cost',
+					title: '合同金额(元)',
+					align: 'right',
+					width: 100
+				},{
+					field: 'sign_name',
+					title: '签定人',
+					align: 'center',
+					width: 80
+				},{
+					field: 'keeper_name',
+					title: '保管人',
+					align: 'center',
+					width: 80
+				},{
+					field: 'sign_time',
+					title: '签订日期',
+					align: 'center',
+					width: 100
+				},{
+					field: 'right',
+					fixed:'right',
+					title: '操作',
+					width: 120,
+					align: 'center',
+					ignoreExport:true,
+					templet: function (d) {
+						var html = '<div class="layui-btn-group">';
+						var btn0='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</span>';
+						var btn1='<span class="layui-btn layui-btn-xs" lay-event="edit">编辑</span>';
+						var btn2='<span class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</span>';
+						if(d.check_status==0 || d.check_status==4){
+							return html+btn0+btn1+btn2+'</div>';
+						}
+						else{
+							return btn0;
+						}
+					}						
+				}
+			]]
+		});
+		
+		//表头工具栏事件
+		table.on('toolbar(table_contract)', function(obj){
+			var that = this;
+			if (obj.event === 'add'){
+				dropdown.render({
+					elem: that,
+					show: true, // 外部事件触发即显示
+					data: contract_types,
+					click: function(obj){
+						tool.side("/contract/purchase/add?types="+obj.id);
+					}
+				});
+				return;
+			}
+		});	
+			
+		table.on('tool(table_contract)',function (obj) {
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/contract/purchase/view?id="+data.id);
+				return;
+			}
+			if (obj.event === 'edit') {
+				tool.side("/contract/purchase/add?id="+data.id);
+				return;
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要删除该合同吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/contract/purchase/del", { id: data.id }, callback);
+					layer.close(index);
+				});
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/purchase/edit.html b/app/contract/view/purchase/edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..1b01bad7c96ada7b77153c9ca353a9189fbdc0ae
--- /dev/null
+++ b/app/contract/view/purchase/edit.html
@@ -0,0 +1,228 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">编辑采购合同</h3>
+    <table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">合同名称<font>*</font></td>
+			<td colspan="3"><input type="text" name="name" value="{$detail.name}" lay-verify="required" lay-reqText="请输入合同名称" autocomplete="off" placeholder="请输入合同名称" class="layui-input"></td>
+			<td class="layui-td-gray">合同性质</td>
+			<td>{$detail.types_name}</td>
+		</tr>
+        <tr>
+			<td class="layui-td-gray-3">签约主体(甲方)<font>*</font></td>
+			<td colspan="3">
+				<select name="subject_id" lay-verify="required" lay-reqText="请选择签约主体公司">
+					<option value="">请选择签约主体公司</option>
+					{volist name=":get_base_data('Enterprise')" id="v"}
+					<option value="{$v.id}" {eq name="$v.id" value="$detail.subject_id" } selected{/eq}>{$v.title}</option>
+					{/volist}
+				</select>
+			</td>
+			<td class="layui-td-gray-2">合同始止日期<font>*</font></td>
+			<td id="barDate" style="width:320px;">
+				<div class="layui-input-inline" style="width:150px;">
+					<input type="text" class="layui-input" id="start_time" value="{$detail.start_time}" placeholder="选择时间区间" readonly name="start_time" lay-verify="required" lay-reqText="请选择合同开始时间">
+				</div>
+				~
+				<div class="layui-input-inline" style="width:150px;">
+					<input type="text" class="layui-input" id="end_time" value="{$detail.end_time}" placeholder="选择时间区间" readonly name="end_time" lay-verify="required" lay-reqText="请选择合同结束时间">
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-3">供应商名称(乙方)<font>*</font></td>
+			<td colspan="3">			
+				{eq name="$is_supplier" value="1"}
+				<input type="text" name="supplier" autocomplete="off" value="{$detail.supplier}" readonly lay-verify="required" lay-reqText="请输入供应商名称" placeholder="请输入供应商名称" class="layui-input supplier-picker">				
+				{else/}
+				<input type="text" name="supplier" autocomplete="off" value="{$detail.supplier}" lay-verify="required" lay-reqText="请输入供应商名称" placeholder="请输入供应商名称" class="layui-input">				
+				{/eq}
+				<input type="hidden" name="supplier_id" value="{$detail.supplier_id}">			
+			</td>
+			<td class="layui-td-gray-3">签约供应商代表<font>*</font></td>
+			<td><input type="text" name="contact_name" value="{$detail.contact_name}" autocomplete="off" lay-verify="required" lay-reqText="请输入供应商代表姓名" placeholder="请输入供应商代表姓名" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-3">供应商联系地址</td>
+			<td colspan="3"><input type="text" name="contact_address" value="{$detail.contact_address}" autocomplete="off" placeholder="请输入供应商联系地址" class="layui-input"></td>
+			<td class="layui-td-gray-3">供应商联系电话</td>
+			<td><input type="text" name="contact_mobile" value="{$detail.contact_mobile}" autocomplete="off" placeholder="请输入供应商联系电话" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">合同金额<font>*</font></td>
+			<td>
+				{eq name="$detail.types" value="1"}
+				<input type="text" name="cost" value="{$detail.cost}" lay-verify="required|number" lay-reqText="请输入合同金额，数字" placeholder="请输入合同金额，数字" autocomplete="off" class="layui-input">
+				{/eq}
+				{eq name="$detail.types" value="2"}
+				<input type="text" name="cost" value="{$detail.cost}" lay-verify="required|number" lay-reqText="请完善产品信息" placeholder="完善产品信息，合同金额自动计算" readonly class="layui-input layui-input-readonly">
+				{/eq}
+				{eq name="$detail.types" value="3"}
+				<input type="text" name="cost" value="{$detail.cost}" lay-verify="required|number" lay-reqText="请完善服务信息" placeholder="完善服务信息，合同金额自动计算" readonly class="layui-input layui-input-readonly">
+				{/eq}
+			</td>
+			<td class="layui-td-gray">合同类别<font>*</font></td>
+			<td>
+				<select name="cate_id" lay-verify="required" lay-reqText="请选择合同类别">
+					<option value="">请选择合同类别</option>
+					{volist name=":get_base_data('ContractCate');" id="vo"}
+					<option value="{$vo.id}" {eq name="$vo.id" value="$detail.cate_id"} selected{/eq}>{$vo.title}</option>
+					{/volist}
+				</select>
+			</td>
+			<td class="layui-td-gray">合同编号<font>*</font></td>
+			<td><input type="text" name="code" value="{$detail.code}" autocomplete="off" {eq name="$is_codeno" value="1"}readonly{/eq} lay-verify="required" lay-reqText="请输入合同编号" placeholder="请输入合同编号" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td colspan="6"><strong>签订信息</strong></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">合同签订人<font>*</font></td>
+			<td>
+				 <input type="text" name="sign_name" value="{$detail.sign_name}" autocomplete="off" readonly lay-verify="required" lay-reqText="请选择合同签订人" placeholder="请选择合同签订人" class="layui-input picker-diy">
+				 <input type="hidden" name="sign_uid" value="{$detail.sign_uid}">
+			</td>
+			<td class="layui-td-gray-2">合同所属部门<font>*</font></td>
+			<td>
+				<input type="text" name="sign_department" value="{$detail.sign_department}" autocomplete="off" readonly lay-verify="required" lay-reqText="请选择合同所属部门"  placeholder="请选择合同所属部门" class="layui-input picker-oa" data-types="department">
+			  	<input type="hidden" name="did" value="{$detail.did}">
+			</td>
+			<td class="layui-td-gray-2">合同签订日期<font>*</font></td>
+			<td><input type="text" name="sign_time" value="{$detail.sign_time}" readonly lay-verify="required" lay-reqText="请选择合同签订日期" placeholder="请选择合同签订日期" class="layui-input tool-time"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">合同制定人</td>
+			<td>
+				<input type="text" name="prepared_name" value="{$detail.prepared_name}" autocomplete="off" readonly placeholder="请选择合同制定人" class="layui-input picker-admin">
+				<input type="hidden" name="prepared_uid" value="{$detail.prepared_uid}">
+			</td>
+			<td class="layui-td-gray-2">合同保管人</td>
+			<td>
+				<input type="text" name="keeper_name" value="{$detail.keeper_name}" autocomplete="off" readonly placeholder="请选择合同保管人" class="layui-input picker-admin">
+				<input type="hidden" name="keeper_uid" value="{$detail.keeper_uid}">
+			</td>
+			<td class="layui-td-gray">合同共享人员</td>
+			<td colspan="3">
+				<input type="text" name="share_names" value="{$detail.share_names}" autocomplete="off" readonly placeholder="请选择共享人员" class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="share_ids" value="{$detail.share_ids}">
+			</td>
+		</tr>
+		{eq name="$detail.types" value="2"}{include file="/purchase/edit_purchased"}{/eq}		
+		{eq name="$detail.types" value="3"}{include file="/purchase/edit_service"}{/eq}	
+		<tr>
+			<td colspan="6"><strong>相关附件</strong></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">
+				<button type="button" class="layui-btn layui-btn-sm" id="uploadBtn"><i class="layui-icon"></i>附件上传</button>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids}">
+					{notempty name="$detail.file_ids"}
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td colspan="6"><strong>备注信息</strong></td>
+		</tr>
+		<tr>
+			<td colspan="6"><textarea name="remark" placeholder="请输入备注信息" class="layui-textarea">{$detail.remark|default=''}</textarea></td>
+		</tr>
+    </table>
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$detail.id}">
+		<input type="hidden" name="types" value="{$detail.types}">
+		<input type="hidden" name="scene" value="edit">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','oaPicker','uploadPlus'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,laydate = layui.laydate, oaPicker = layui.oaPicker,uploadPlus = layui.uploadPlus;
+		if(typeof purchased_fun==='function'){
+			purchased_fun(layui);
+		}
+		if(typeof service_fun==='function'){
+			service_fun(layui);
+		}
+		//日期范围
+		laydate.render({
+			elem: '#barDate',
+			range: ['#start_time', '#end_time']
+		});
+		//附件上传
+		var attachment = new uploadPlus({
+			"target":'uploadBtn',
+			"targetBox":'uploadBox'
+		});
+		//选择员工弹窗        
+		$('body').on('click','.picker-diy',function () {
+			let that = $(this);
+			let ids=that.next().val()+'',names = that.val()+'';
+			oaPicker.employeeInit({
+				ids:ids,
+				names:names,
+				type:1,//1是单选，2是多选
+				callback:function(data){
+					//这里是选择后的回调方法，可以根据具体需求自定义写哦
+					let select_id=[],select_name=[];
+					for(var a=0; a<data.length;a++){
+						select_id.push(data[a].id);
+						select_name.push(data[a].name);
+					}
+					that.val(select_name.join(','));
+					that.next().val(select_id.join(','));
+				}
+			});
+		});
+		
+		//选择供应商弹窗        
+		$('body').on('click','.supplier-picker',function () {
+			let that = $(this),ids = [],titles=[],contact_name=[],contact_mobile=[],address=[],map = {},types = 'supplier',type = 1;
+			let callback = function(data){
+				for ( var i = 0; i <data.length; i++){
+					ids.push(data[i].id);
+					titles.push(data[i].title);
+					contact_name.push(data[i].contact_name);
+					contact_mobile.push(data[i].contact_mobile);
+					address.push(data[i].address);
+				}
+				that.val(titles.join(','));
+				that.next().val(ids.join(','));
+				$('[name="contact_name"]').val(contact_name.join(','));
+				$('[name="contact_mobile"]').val(contact_mobile.join(','));
+				$('[name="contact_address"]').val(address.join(','));
+			}
+			oaPicker.picker(types,type,callback,map);
+		});
+		
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/contract/purchase/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/purchase/edit_purchased.html b/app/contract/view/purchase/edit_purchased.html
new file mode 100644
index 0000000000000000000000000000000000000000..c428783535e3d6600c321921330101ba9729bc16
--- /dev/null
+++ b/app/contract/view/purchase/edit_purchased.html
@@ -0,0 +1,135 @@
+<tr>
+	<td colspan="6"><strong>物品信息</strong> <span class="layui-btn layui-btn-sm" type="button" id="purchasedAdd">+ 添加物品</span></td>
+</tr>
+<tr>
+	<td colspan="6">				
+		<table id="purchasedTable" class="layui-table layui-table-min" style="margin:0">
+			<tr>
+				<th width="200">物品名称</th>
+				<th width="100">单位</th>
+				<th width="100">规格</th>
+				<th width="100">采购单价</th>
+				<th width="100">数量</th>
+				<th width="100">小计</th>
+				<th>备注信息</th>
+				<th width="60">操作</th>
+			</tr>
+			{empty name="$detail.content"}
+			<tr class="purchased-tr">
+				{eq name="is_purchased" value="1"}
+				<td><input type="text" name="purchased_title[]" value="" class="layui-input purchased-picker" readonly lay-verify="required" lay-reqText="请输入物品名称"><input type="hidden" name="purchased_id[]" value="0"></td>
+				{else/}
+				<td><input type="text" name="purchased_title[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入物品名称"><input type="hidden" name="purchased_id[]" value="0"></td>
+				{/eq}
+				<td><input type="text" name="purchased_unit[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入单位"></td>
+				<td><input type="text" name="purchased_specs[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入物品规格"></td>
+				<td><input type="text" name="purchased_price[]" value="0.00" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入采购单价"></td>
+				<td><input type="text" name="purchased_num[]" value="1" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入物品数量"></td>
+				<td><input type="text" name="purchased_subtotal[]" value="0.00" class="layui-input layui-input-readonly" readonly></td>
+				<td><input type="text" name="purchased_remark[]" value="" class="layui-input"></td>
+				<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>
+			</tr>
+			{else/}
+			{volist name="$detail.content" id="vo"}
+			<tr class="purchased-tr">
+				{eq name="is_purchased" value="1"}
+				<td><input type="text" name="purchased_title[]" value="{$vo.purchased_title|default=''}" class="layui-input purchased-picker" readonly lay-verify="required" lay-reqText="请输入物品名称"><input type="hidden" name="purchased_id[]" value="{$vo.purchased_id|default=0}"></td>
+				{else/}
+				<td><input type="text" name="purchased_title[]" value="{$vo.purchased_title|default=''}" class="layui-input" lay-verify="required" lay-reqText="请输入物品名称"><input type="hidden" name="purchased_id[]" value="{$vo.purchased_id|default=0}"></td>
+				{/eq}
+				<td><input type="text" name="purchased_unit[]" value="{$vo.purchased_unit|default=''}" class="layui-input" lay-verify="required" lay-reqText="请输入单位"></td>
+				<td><input type="text" name="purchased_specs[]" value="{$vo.purchased_specs|default=''}" class="layui-input" lay-verify="required" lay-reqText="请输入物品规格"></td>
+				<td><input type="text" name="purchased_price[]" value="{$vo.purchased_price|default='0.00'}" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入采购单价"></td>
+				<td><input type="text" name="purchased_num[]" value="{$vo.purchased_num|default=0}" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入物品数量"></td>
+				<td><input type="text" name="purchased_subtotal[]" value="{$vo.purchased_subtotal|default='0.00'}" class="layui-input layui-input-readonly" readonly></td>
+				<td><input type="text" name="purchased_remark[]" value="{$vo.purchased_remark|default=''}" class="layui-input"></td>
+				<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>
+			</tr>
+			{/volist}
+			{/empty}
+		</table>
+	</td>
+</tr>
+<script>
+const is_purchased={$is_purchased};
+function purchased_fun(layui){
+	let form = layui.form,oaPicker = layui.oaPicker;
+	
+	//选择物品弹窗        
+	$('body').on('click','.purchased-picker',function () {
+		let that = $(this),ids = [],titles=[],purchase_price=[],unit=[],specs=[],map = {},types = 'purchased',type = 1;
+		let callback = function(data){
+			for ( var i = 0; i <data.length; i++){
+				ids.push(data[i].id);
+				titles.push(data[i].title);
+				unit.push(data[i].unit);
+				specs.push(data[i].specs);
+				purchase_price.push(data[i].purchase_price);
+			}
+			that.val(titles.join(','));
+			that.next().val(ids.join(','));
+			that.parents('.purchased-tr').find('input').eq(2).val(unit.join(','));
+			that.parents('.purchased-tr').find('input').eq(3).val(specs.join(','));
+			that.parents('.purchased-tr').find('input').eq(4).val(purchase_price.join(','));
+			that.parents('.purchased-tr').find('input').eq(6).val(purchase_price.join(','));
+			count_cost();
+		}
+		oaPicker.picker(types,type,callback,map);
+	});
+	
+	//添加物品信息表格
+	$('#purchasedAdd').on('click',function(){
+		var html = '',purchased_title=' class="layui-input"';
+		if(is_purchased==1){
+			purchased_title=' class="layui-input purchased-picker" readonly';
+		}
+		html += '<tr class="purchased-tr">\
+					<td><input type="text" name="purchased_title[]" value="" '+purchased_title+' lay-verify="required" lay-reqText="请输入物品名称"><input type="hidden" name="purchased_id[]" value="0"></td>\
+					<td><input type="text" name="purchased_unit[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入单位"></td>\
+					<td><input type="text" name="purchased_specs[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入物品规格"></td>\
+					<td><input type="text" name="purchased_price[]" value="0.00" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入采购单价"></td>\
+					<td><input type="text" name="purchased_num[]" value="1" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入物品数量"></td>\
+					<td><input type="text" name="purchased_subtotal[]" value="0.00" class="layui-input layui-input-readonly" readonly></td>\
+					<td><input type="text" name="purchased_remark[]" value="" class="layui-input"></td>\
+					<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>\
+				</tr>';
+		$('#purchasedTable').append(html).find('.tr-none').remove();
+		form.render();
+	});	
+
+	$('#purchasedTable').on('click', '[lay-event="del"]', function() {
+		if($('.purchased-tr').length<2){
+			layer.msg('至少保留一个物品选项');
+			return false;
+		}
+		$(this).parents('.purchased-tr').remove();
+		count_cost();
+	});	
+	
+	//计算价格
+	$('#purchasedTable').on('input', '.input-num', function() {
+		var inputs = $(this).parents('.purchased-tr').find("input");
+		var purchased_price = inputs.eq(4).val();
+		var purchased_num = inputs.eq(5).val();
+		var purchased_amount = (purchased_price*purchased_num).toFixed(2);			  
+		if(isNaN(purchased_amount)){ 
+			purchased_amount = 0.00;
+		}
+		inputs.eq(6).val(purchased_amount);
+		count_cost();
+	});
+	 
+	//计算总价
+	function count_cost(){
+		var purchased_subtotal = $('#purchasedTable').find('[name="purchased_subtotal[]"]');
+		var total = 0;
+		for (var m = 0; m < purchased_subtotal.length; m++) {
+			total+=$(purchased_subtotal[m]).val()*1000;
+		}
+		if(isNaN(total)){ 
+			total = 0;
+		}
+		$('[name="cost"]').val((total/1000).toFixed(2));
+	}
+}
+</script>
diff --git a/app/contract/view/purchase/edit_service.html b/app/contract/view/purchase/edit_service.html
new file mode 100644
index 0000000000000000000000000000000000000000..5b420a6712770f5910125b724a1cb2d1bdbe3298
--- /dev/null
+++ b/app/contract/view/purchase/edit_service.html
@@ -0,0 +1,96 @@
+<tr>
+	<td class="layui-td-gray" colspan="6" style="text-align:left; color:#666"><strong>服务信息</strong> <span class="layui-btn layui-btn-sm" type="button" id="serviceAdd">+ 添加服务</span></td>
+</tr>
+<tr>
+	<td colspan="6">				
+		<table id="serviceTable" class="layui-table layui-table-min" style="margin:0">
+			<tr>
+				<th width="200">服务名称</th>
+				<th width="200">服务周期</th>
+				<th width="100">服务单价</th>
+				<th width="100">服务次数</th>
+				<th width="100">小计</th>
+				<th>备注信息</th>
+				<th width="60">操作</th>
+			</tr>
+			{empty name="$detail.content"}
+			<tr class="service-tr">
+				<td><input type="text" name="service_title[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入服务名称"></td>
+				<td><input type="text" name="service_date[]" value="" class="layui-input layui-input-readonly tool-time" data-range="到" lay-verify="required" lay-reqText="请选择服务周期" readonly></td>
+				<td><input type="text" name="service_price[]" value="0.00" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务单价"></td>
+				<td><input type="text" name="service_num[]" value="1" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务次数"></td>
+				<td><input type="text" name="service_subtotal[]" value="0.00" class="layui-input layui-input-readonly" readonly></td>
+				<td><input type="text" name="service_remark[]" value="" class="layui-input"></td>
+				<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>
+			</tr>
+			{else/}
+			{volist name="$detail.content" id="vo"}
+			<tr class="service-tr">
+				<td><input type="text" name="service_title[]" value="{$vo.service_title|default=''}" class="layui-input" lay-verify="required" lay-reqText="请输入服务名称"></td>
+				<td><input type="text" name="service_date[]" value="{$vo.service_date|default=''}" class="layui-input layui-input-readonly tool-time" data-range="到" lay-verify="required" lay-reqText="请选择服务周期" readonly></td>
+				<td><input type="text" name="service_price[]" value="{$vo.service_price|default='0.00'}" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务单价"></td>
+				<td><input type="text" name="service_num[]" value="{$vo.service_num|default=0}" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务次数"></td>
+				<td><input type="text" name="service_subtotal[]" value="{$vo.service_subtotal|default='0.00'}" class="layui-input layui-input-readonly" readonly></td>
+				<td><input type="text" name="service_remark[]" value="{$vo.service_remark|default=''}" class="layui-input"></td>
+				<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>
+			</tr>
+			{/volist}
+			{/empty}
+		</table>
+	</td>
+</tr>
+<script>
+function service_fun(layui){
+	let form = layui.form;
+	//添加服务信息表格
+	$('#serviceAdd').on('click',function(){
+		var html = '';
+		html += '<tr class="service-tr">\
+					<td><input type="text" name="service_title[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入服务名称"></td>\
+					<td><input type="text" name="service_date[]" value="" class="layui-input layui-input-readonly tool-time" data-range="到" lay-verify="required" lay-reqText="请选择服务周期" readonly></td>\
+					<td><input type="text" name="service_price[]" value="0.00" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务单价"></td>\
+					<td><input type="text" name="service_num[]" value="1" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务次数"></td>\
+					<td><input type="text" name="service_subtotal[]" value="0.00" class="layui-input layui-input-readonly" readonly></td>\
+					<td><input type="text" name="service_remark[]" value="" class="layui-input"></td>\
+					<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>\
+				</tr>';
+		$('#serviceTable').append(html).find('.tr-none').remove();
+		form.render();
+	});
+
+	$('#serviceTable').on('click', '[lay-event="del"]', function() {
+		if($('.service-tr').length<2){
+			layer.msg('至少保留一个服务选项');
+			return false;
+		}
+		$(this).parents('.service-tr').remove();
+		count_cost();
+	});	
+	
+	//计算价格
+	$('#serviceTable').on('input', '.input-num', function() {
+		var inputs = $(this).parents('.service-tr').find("input");
+		var service_price = inputs.eq(2).val();
+		var service_num = inputs.eq(3).val();
+		var service_amount = (service_price*service_num).toFixed(2);			  
+		if(isNaN(service_amount)){ 
+			service_amount = 0.00;
+		}
+		inputs.eq(4).val(service_amount);
+		count_cost();
+	});
+	 
+	//计算总价
+	function count_cost(){
+		var service_subtotal = $('#serviceTable').find('[name="service_subtotal[]"]');
+		var total = 0;
+		for (var m = 0; m < service_subtotal.length; m++) {
+			total+=$(service_subtotal[m]).val()*1000;
+		}
+		if(isNaN(total)){ 
+			total = 0;
+		}
+		$('[name="cost"]').val((total/1000).toFixed(2));
+	}
+}
+</script>
diff --git a/app/contract/view/purchase/stoplist.html b/app/contract/view/purchase/stoplist.html
new file mode 100644
index 0000000000000000000000000000000000000000..123aef2adeeb762e6d89e609504cb461082795b8
--- /dev/null
+++ b/app/contract/view/purchase/stoplist.html
@@ -0,0 +1,177 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<div class="layui-card border-x border-t" style="margin-bottom:0; box-shadow:0 0 0 0 rgb(5 32 96 / 0%)">
+		<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
+			<ul class="layui-tab-title">
+				<li><a href="/contract/contract/stoplist">销售合同</a></li>
+				<li class="layui-this"><a href="/contract/purchase/stoplist">采购合同</a></li>
+			</ul>
+		</div> 
+	</div> 
+	<form class="layui-form gg-form-bar border-x">
+		<div class="layui-input-inline" style="width:122px;">
+			<select name="types">
+				<option value="">选择合同性质</option>
+				<option value="1">普通采购</option>
+				<option value="2">物品采购</option>
+				<option value="3">服务采购</option>
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:122px;">
+			<select name="cate_id">
+				<option value="">选择合同类别</option>
+				{volist name=":get_base_data('ContractCate');" id="vo"}
+				<option value="{$vo.id}">{$vo.title}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:175px;">
+			<input type="text" class="layui-input" id="sign_time" placeholder="选择合同签订日期" readonly name="sign_time">
+		</div>
+		<div class="layui-input-inline" style="width:175px;">
+			<input type="text" class="layui-input" id="end_time" placeholder="选择合同到期日期" readonly name="end_time">
+		</div>
+		<div class="layui-input-inline" style="width:220px;">
+			<input type="text" name="keywords" placeholder="输入关键字，合同编号/合同名称" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<input type="hidden" name="tab" value="0" />
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_contract" lay-filter="table_contract"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+	<h3>中止合同</h3>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus','laydatePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus,dropdown = layui.dropdown, tool = layui.tool,laydatePlus = layui.laydatePlus;
+		//日期范围
+		var sign_time = new laydatePlus({'target':'sign_time'});
+		var end_time = new laydatePlus({'target':'end_time'});
+		layui.pageTable = table.render({
+			elem: "#table_contract"
+			, toolbar: "#toolbarDemo"
+			,url: "/contract/purchase/stoplist"
+			,is_excel: true
+			,page: true
+			,limit: 20
+			,cellMinWidth: 60
+			,height: 'full-152'
+			,cols: [[ //表头
+				{
+					field: 'id',
+					title: 'ID号',
+					align: 'center',
+					width: 80
+				},{
+					field: 'code',
+					title: '合同编号',
+					align: 'center',
+					width: 150
+				},{
+					field: 'name',
+					title: '合同名称',
+					minWidth:240,
+					templet: '<div><a data-href="/contract/purchase/view/id/{{d.id}}.html" class="side-a">{{d.name}}</a></div>'
+				},{
+					field: 'cate_title',
+					title: '合同类别',
+					align: 'center',
+					width: 100
+				},{
+					field: 'type_name',
+					title: '合同性质',
+					align: 'center',
+					width: 80,
+					templet: function (d) {
+						var html = '<span class="layui-color-' + d.type_a + '">' + d.type_name + '</span>';
+						return html;
+					}
+				},{
+					field: 'interval_time',
+					title: '合同有效时间',
+					align: 'center',
+					width: 248,
+					templet: function (d) {
+						var html = d.interval_time;
+						if (d.delay > 0 && d.delay < 30) {
+							html += '<span class="red ml-1" style="font-size:12px;">' + d.delay + '天后到期</span>';
+						}
+						if (d.delay == 0) {
+							html += '<span class="red ml-1" style="font-size:12px;">已过期</span>';
+						}
+						return html;
+					}
+				},{
+					field: 'cost',
+					title: '合同金额(元)',
+					align: 'right',
+					width: 100
+				},{
+					field: 'stop_name',
+					title: '中止人',
+					align: 'center',
+					width: 80
+				},{
+					field: 'stop_time',
+					title: '中止日期',
+					align: 'center',
+					width: 90
+				},{
+					field: 'sign_name',
+					title: '签定人',
+					align: 'center',
+					width: 80
+				},{
+					field: 'sign_time',
+					title: '签订日期',
+					align: 'center',
+					width: 90
+				},{
+					field: 'keeper_name',
+					title: '保管人',
+					align: 'center',
+					width: 80
+				},{
+					field: 'right',
+					fixed:'right',
+					title: '操作',
+					width: 60,
+					align: 'center',
+					ignoreExport:true,
+					templet: function (d) {
+						var btn0='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</span>';
+						return btn0;
+					}						
+				}
+			]]
+		});
+			
+		table.on('tool(table_contract)',function (obj) {
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/contract/purchase/view?id="+data.id);
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/purchase/view.html b/app/contract/view/purchase/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..e10d0f87340047fa1a8bebc30c74f7550189ab90
--- /dev/null
+++ b/app/contract/view/purchase/view.html
@@ -0,0 +1,307 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+.layui-tab-title .layui-this{background-color:#fff;}
+.layui-tab-card,.layui-card{box-shadow:0 0 0 0 rgb(0 0 0 / 10%); border-radius:0; border-top:none;}
+#checkBox .pb-2{display:none;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<h3 class="pb-3">采购合同详情</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">合同名称</td>
+			<td colspan="3">{$detail.name}</td>
+			<td class="layui-td-gray">合同编号</td>
+			<td>{$detail.code}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-3">签约主体(甲方)</td>
+			<td colspan="3">{$detail.subject_title}</td>
+			<td class="layui-td-gray-2">合同始止日期</td>
+			<td>{$detail.start_time} 至 {$detail.end_time}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-3">供应商名称(乙方)</td>
+			<td colspan="3">{$detail.supplier}</td>
+			<td class="layui-td-gray-3">签约供应商代表</td>
+			<td>{$detail.contact_name}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-3">供应商联系地址</td>
+			<td colspan="3">{$detail.contact_address|default='-'}</td>
+			<td class="layui-td-gray">供应商联系电话</td>
+			<td>{$detail.contact_mobile|default='-'}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">合同金额</td>
+			<td>{$detail.cost}</td>
+			<td class="layui-td-gray">合同性质</td>
+			<td>{$detail.types_name}</td>
+			<td class="layui-td-gray">合同类别</td>
+			<td>{$detail.cate_title}</td>
+		</tr>
+		<tr>
+			<td colspan="6"><strong>签订信息</strong></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">合同签订人</td>
+			<td>{$detail.sign_name}</td>
+			<td class="layui-td-gray-2">合同所属部门</td>
+			<td>{$detail.sign_department}</td>
+			<td class="layui-td-gray-2">合同签订日期</td>
+			<td>{$detail.sign_time}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">合同制定人</td>
+			<td>{$detail.prepared_name|default='-'}</td>
+			<td class="layui-td-gray-2">合同保管人</td>
+			<td>{$detail.keeper_name|default='-'} <span id="keeper" data-ids="{$detail.keeper_uid}" data-names="{$detail.keeper_name}" class="layui-btn layui-btn-xs layui-btn-normal ml-1">更改</span></td>
+			<td class="layui-td-gray">合同共享人员</td>
+			<td colspan="3">{$detail.share_names|default='-'} <span id="shares" data-ids="{$detail.share_ids}" data-names="{$detail.share_names}" class="layui-btn layui-btn-xs layui-btn-normal ml-1">更改</span></td>
+		</tr>
+		{eq name="$detail.types" value="2"}{include file="/purchase/view_purchased"}{/eq}		
+		{eq name="$detail.types" value="3"}{include file="/purchase/view_service"}{/eq}	
+		{notempty name="$detail.file_ids"}
+		<tr>
+			<td colspan="6"><strong>相关附件</strong></td>
+		</tr>
+		<tr>
+			<td colspan="6" style="line-height:inherit">
+				<div class="layui-row">
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+		{notempty name="$detail.remark"}
+		<tr>
+			<td colspan="6"><strong>备注信息</strong></td>
+		</tr>
+		<tr>
+			<td colspan="6">{$detail.remark}</td>
+		</tr>
+		{/notempty}
+		
+		<tr>
+			<td colspan="6"><strong>合同情况</strong></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">录入人</td>
+			<td>{$detail.admin_name} </td>
+			<td class="layui-td-gray">录入时间</td>
+			<td colspan="3">{$detail.create_time}</td>
+		</tr>
+		{gt name="$detail.archive_time" value="0"}
+		<tr>
+			<td class="layui-td-gray">归档状态</td>
+			<td>
+				<span class="red">已归档</span>
+				{if ($auth == 1) }
+				<span class="layui-btn layui-btn-danger layui-btn-xs ml-4" data-event="archive" data-status="0">反确认归档</span>
+				{/if}
+			</td>
+			<td class="layui-td-gray">归档人</td>
+			<td>{$detail.archive_name} </td>
+			<td class="layui-td-gray">归档时间</td>
+			<td>{$detail.archive_time|date='Y-m-d H:i:s'}</td>
+		{else/}
+			<td class="layui-td-gray">归档状态</td>
+			<td colspan="5">
+				<span class="green">未归档</span>
+				{if ($auth == 1) AND ($detail.check_status == 2) }
+				<span class="layui-btn layui-btn-xs ml-4" data-event="archive" data-status="1">确认归档</span>
+				{/if}
+			</td>
+		</tr>
+		{/gt}
+			
+		{gt name="$detail.stop_time" value="0"}
+		<tr>
+			<td class="layui-td-gray">中止人</td>
+			<td>{$detail.stop_name}</td>
+			<td class="layui-td-gray">中止时间</td>
+			<td>{$detail.stop_time|date='Y-m-d H:i:s'}</td>
+			<td colspan="2"><span class="layui-btn layui-btn-danger layui-btn-xs" data-event="stop" data-status="0">反中止合同</span></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">中止备注</td>
+			<td colspan="5">{$detail.stop_remark|default='-'}</td>
+		</tr>
+		{/gt}
+			
+		{gt name="$detail.void_time" value="0"}
+		<tr>
+			<td class="layui-td-gray">作废人</td>
+			<td>{$detail.void_name}</td>
+			<td class="layui-td-gray">作废时间</td>
+			<td>{$detail.void_time|date='Y-m-d H:i:s'}</td>
+			<td colspan="2"><span class="layui-btn layui-btn-danger layui-btn-xs" data-event="void" data-status="0">反作废合同</span></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">作废备注</td>
+			<td colspan="5">{$detail.void_remark|default='-'}</td>
+		</tr>
+		{/gt}
+	</table>
+	<div class="layui-tab layui-tab-card" style="margin:0; background-color:#fff;" lay-filter="purchase" id="purchaseTab">
+		<ul class="layui-tab-title">
+			<li class="layui-this" data-load="true">审批信息</li>
+			<li>操作记录</li>
+		</ul>
+		<div class="layui-tab-content" style="padding:0;">
+			<div class="layui-tab-item layui-show" style="padding-top:12px; background-color:#fff;">	
+				{if ($detail.stop_time == 0) AND ($detail.void_time == 0) }
+				<div id="checkBox" data-status="{$detail.check_status}" data-id="{$detail.id}" data-checkflowid="{$detail.check_flow_id}" class="px-3 pb-3"></div>
+				{/if}	
+			</div>
+			<div class="layui-tab-item">
+				{include file="/purchase/view_log" /}
+			</div>
+		</div>
+	</div>
+</div>
+{/block}
+<!-- /主体 -->
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var purchase_id = {$detail.id};
+	var auth = {$auth};
+	var archive = {$detail.archive_time};
+	var moduleInit = ['tool','oaCheck','oaPicker','oaEdit'];
+	let checking_btn='<span class="layui-btn layui-btn-warm" data-event="stop" data-status="1">中止合同</span><span class="layui-btn layui-btn-danger" data-event="void" data-status="1">作废合同</span>';
+	function gouguInit() {
+		var tool = layui.tool,element = layui.element,oaCheck=layui.oaCheck,oaPicker=layui.oaPicker;	
+		
+		element.on('tab(purchase)', function(data){
+			let index = data.index;
+			if(index == 1){
+				log();	
+			}
+		});
+		
+		oaCheck.init({
+			check_name:'purchase',
+			check_copy:0,
+			check_back:archive==0?auth:0,
+			checking_btn:checking_btn
+		});
+
+		let eventCallback = function (e) {
+			layer.msg(e.msg);
+			parent.layui.pageTable.reload();
+			setTimeout(function(){
+				location.reload();
+			},1200)					
+		}
+		
+		//选择合同保管人弹窗	
+		$('body').on('click','#keeper',function () {
+			let that = $(this);
+			let ids=$(this).data('ids')+'',names = $(this).data('names')+'';
+			oaPicker.employeeInit({
+				ids:ids,
+				names:names,
+				type:1,//1是单选，2是多选
+				callback:function(data){
+					let select_id=[],select_name=[];
+					for(var a=0; a<data.length;a++){
+						select_id.push(data[a].id);
+						select_name.push(data[a].name);
+					}
+					tool.post("/contract/purchase/add", {'id':purchase_id,'keeper_uid':select_id.join(','),'scene':'change'}, eventCallback);
+				}
+			});
+		});
+	
+		//选择共享成员弹窗	
+		$('body').on('click','#shares',function () {
+			let that = $(this);
+			let ids=$(this).data('ids')+'',names = $(this).data('names')+'';
+			oaPicker.employeeInit({
+				ids:ids,
+				names:names,
+				type:2,//1是单选，2是多选
+				callback:function(data){
+					let select_id=[],select_name=[];
+					for(var a=0; a<data.length;a++){
+						select_id.push(data[a].id);
+						select_name.push(data[a].name);
+					}
+					tool.post("/contract/purchase/add", {'id':purchase_id,'share_ids':select_id.join(','),'scene':'change'}, eventCallback);
+				}
+			});
+		});
+		
+		//归档操作
+		$('body').on('click','[data-event="archive"]',function(){
+			let status = $(this).data('status');
+			let tips = '合同归档后将不能进行任何数据操作，确定要提交归档?';
+			if(status==0){
+				tips = '确定要反归档操作?';
+			}
+			layer.confirm(tips, {
+				icon: 3,
+				title: '提示'
+			}, function(index) {
+				tool.post("/contract/api/purchase_archive", {id: purchase_id,archive_status:status}, eventCallback);
+				layer.close(index);
+			});
+		})
+
+		//中止操作
+		$('body').on('click','[data-event="stop"]',function(){
+			let status = $(this).data('status');
+			if(status==1){
+				layer.prompt({
+					formType: 2,
+					title: '请输入中止的理由',
+					area: ['480px', '120px']
+				}, function(value, index, elem){
+					tool.post("/contract/api/purchase_stop", {id: purchase_id,stop_status:status,stop_remark:value}, eventCallback);
+					layer.close(index);
+				});
+			}
+			else{
+				layer.confirm('确定要反中止该合同?', {
+					icon: 3,
+					title: '提示'
+				}, function(index) {
+					tool.post("/contract/api/purchase_stop", {id: purchase_id,stop_status:status}, eventCallback);
+					layer.close(index);
+				});
+			}
+		})
+		
+		//作废操作
+		$('body').on('click','[data-event="void"]',function(){
+			let status = $(this).data('status');
+			if(status==1){
+				layer.prompt({
+					formType: 2,
+					title: '请输入作废的理由',
+					area: ['480px', '120px']
+				}, function(value, index, elem){
+					tool.post("/contract/api/purchase_tovoid", {id: purchase_id,void_status:status,void_remark:value}, eventCallback);
+					layer.close(index);
+				});
+			}
+			else{
+				layer.confirm('确定要反作废该合同?', {
+					icon: 3,
+					title: '提示'
+				}, function(index) {
+					tool.post("/contract/api/purchase_tovoid", {id: purchase_id,void_status:status}, eventCallback);
+					layer.close(index);
+				});
+			}
+		})		
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/purchase/view_log.html b/app/contract/view/purchase/view_log.html
new file mode 100644
index 0000000000000000000000000000000000000000..baeb54cdbcb8b0d2271e3dd50cc7bd121bdf5317
--- /dev/null
+++ b/app/contract/view/purchase/view_log.html
@@ -0,0 +1,9 @@
+<div>
+	<div id="logList" class="log-timeline p-3"></div>
+</div>
+<script>	
+function log(){
+	let oaEdit = layui.oaEdit;	
+	oaEdit.log('logList','Purchase',purchase_id);
+}
+</script>	
\ No newline at end of file
diff --git a/app/contract/view/purchase/view_purchased.html b/app/contract/view/purchase/view_purchased.html
new file mode 100644
index 0000000000000000000000000000000000000000..b85a155c6f625ff401d8fa3f06f72f2b0fcbdbac
--- /dev/null
+++ b/app/contract/view/purchase/view_purchased.html
@@ -0,0 +1,36 @@
+<tr>
+	<td colspan="6"><strong>物品信息</strong></td>
+</tr>
+<tr>
+	<td colspan="6">				
+		<table class="layui-table layui-table-min" style="margin:0">
+			<tr>
+				<th width="200">物品名称</th>
+				<th width="100">单位</th>
+				<th width="100">规格</th>
+				<th width="100">采购单价</th>
+				<th width="100">数量</th>
+				<th width="100">小计</th>
+				<th>备注信息</th>
+			</tr>
+			{empty name="$detail.content"}
+			<tr class="sale-tr">
+				<td colspan="7" style="padding:12px; text-align:center; color:#999">暂无物品信息</td>
+			</tr>
+			{else/}
+			{volist name="$detail.content" id="vo"}
+			<tr class="sale-tr">
+				<td style="text-align:left;">{$vo.purchased_title|default=''}</td>
+				<td>{$vo.purchased_unit|default=''}</td>
+				<td>{$vo.purchased_specs|default=''}</td>
+				<td>{$vo.purchased_price|default='0.00'}</td>
+				<td>{$vo.purchased_num|default='1'}</td>
+				<td>{$vo.purchased_subtotal|default='0.00'}</td>
+				<td style="text-align:left;">{$vo.purchased_remark|default=''}</td>
+			</tr>
+			{/volist}
+			{/empty}
+		</table>
+	</td>
+</tr>
+
diff --git a/app/contract/view/purchase/view_service.html b/app/contract/view/purchase/view_service.html
new file mode 100644
index 0000000000000000000000000000000000000000..58ab62002baabba2a2e57ac15d9ab926d6ffffd8
--- /dev/null
+++ b/app/contract/view/purchase/view_service.html
@@ -0,0 +1,34 @@
+<tr>
+	<td class="layui-td-gray" colspan="6" style="text-align:left; color:#666"><strong>服务信息</strong></td>
+</tr>
+<tr>
+	<td colspan="6">				
+		<table class="layui-table layui-table-min" style="margin:0">
+			<tr>
+				<th width="200">服务名称</th>
+				<th width="200">服务周期</th>
+				<th width="100">服务单价</th>
+				<th width="100">服务次数</th>
+				<th width="100">小计</th>
+				<th>备注信息</th>
+			</tr>
+			{empty name="$detail.content"}
+			<tr class="sale-tr">
+				<td colspan="6" style="padding:12px text-align:center; color:#999">暂无服务信息</td>
+			</tr>
+			{else/}
+			{volist name="$detail.content" id="vo"}
+			<tr class="sale-tr">
+				<td style="text-align:left;">{$vo.service_title|default=''}</td>
+				<td>{$vo.service_date|default=''}</td>
+				<td>{$vo.service_price|default='0.00'}</td>
+				<td>{$vo.service_num|default='1'}</td>
+				<td>{$vo.service_subtotal|default='0.00'}</td>
+				<td style="text-align:left;">{$vo.service_remark|default=''}</td>
+			</tr>
+			{/volist}
+			{/empty}
+		</table>
+	</td>
+</tr>
+
diff --git a/app/contract/view/purchase/voidlist.html b/app/contract/view/purchase/voidlist.html
new file mode 100644
index 0000000000000000000000000000000000000000..ad1e315fce21a41df774558cc4ff630b7e936405
--- /dev/null
+++ b/app/contract/view/purchase/voidlist.html
@@ -0,0 +1,177 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<div class="layui-card border-x border-t" style="margin-bottom:0; box-shadow:0 0 0 0 rgb(5 32 96 / 0%)">
+		<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
+			<ul class="layui-tab-title">
+				<li><a href="/contract/contract/voidlist">销售合同</a></li>
+				<li class="layui-this"><a href="/contract/purchase/voidlist">采购合同</a></li>
+			</ul>
+		</div> 
+	</div> 
+	<form class="layui-form gg-form-bar border-x">
+		<div class="layui-input-inline" style="width:122px;">
+			<select name="types">
+				<option value="">选择合同性质</option>
+				<option value="1">普通采购</option>
+				<option value="2">物品采购</option>
+				<option value="3">服务采购</option>
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:122px;">
+			<select name="cate_id">
+				<option value="">选择合同类别</option>
+				{volist name=":get_base_data('ContractCate');" id="vo"}
+				<option value="{$vo.id}">{$vo.title}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:175px;">
+			<input type="text" class="layui-input" id="sign_time" placeholder="选择合同签订日期" readonly name="sign_time">
+		</div>
+		<div class="layui-input-inline" style="width:175px;">
+			<input type="text" class="layui-input" id="end_time" placeholder="选择合同到期日期" readonly name="end_time">
+		</div>
+		<div class="layui-input-inline" style="width:220px;">
+			<input type="text" name="keywords" placeholder="输入关键字，合同编号/合同名称" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<input type="hidden" name="tab" value="0" />
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_contract" lay-filter="table_contract"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+	<h3>作废合同</h3>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus','laydatePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus,dropdown = layui.dropdown, tool = layui.tool,laydatePlus = layui.laydatePlus;
+		//日期范围
+		var sign_time = new laydatePlus({'target':'sign_time'});
+		var end_time = new laydatePlus({'target':'end_time'});
+		layui.pageTable = table.render({
+			elem: "#table_contract"
+			, toolbar: "#toolbarDemo"
+			,url: "/contract/purchase/voidlist"
+			,is_excel: true
+			,page: true
+			,limit: 20
+			,cellMinWidth: 60
+			,height: 'full-152'
+			,cols: [[ //表头
+				{
+					field: 'id',
+					title: 'ID号',
+					align: 'center',
+					width: 80
+				},{
+					field: 'code',
+					title: '合同编号',
+					align: 'center',
+					width: 150
+				},{
+					field: 'name',
+					title: '合同名称',
+					minWidth:240,
+					templet: '<div><a data-href="/contract/purchase/view/id/{{d.id}}.html" class="side-a">{{d.name}}</a></div>'
+				},{
+					field: 'cate_title',
+					title: '合同类别',
+					align: 'center',
+					width: 100
+				},{
+					field: 'type_name',
+					title: '合同性质',
+					align: 'center',
+					width: 80,
+					templet: function (d) {
+						var html = '<span class="layui-color-' + d.type_a + '">' + d.type_name + '</span>';
+						return html;
+					}
+				},{
+					field: 'interval_time',
+					title: '合同有效时间',
+					align: 'center',
+					width: 248,
+					templet: function (d) {
+						var html = d.interval_time;
+						if (d.delay > 0 && d.delay < 30) {
+							html += '<span class="red ml-1" style="font-size:12px;">' + d.delay + '天后到期</span>';
+						}
+						if (d.delay == 0) {
+							html += '<span class="red ml-1" style="font-size:12px;">已过期</span>';
+						}
+						return html;
+					}
+				},{
+					field: 'cost',
+					title: '合同金额(元)',
+					align: 'right',
+					width: 100
+				},{
+					field: 'void_name',
+					title: '作废人',
+					align: 'center',
+					width: 80
+				},{
+					field: 'void_time',
+					title: '作废日期',
+					align: 'center',
+					width: 90
+				},{
+					field: 'sign_name',
+					title: '签定人',
+					align: 'center',
+					width: 80
+				},{
+					field: 'sign_time',
+					title: '签订日期',
+					align: 'center',
+					width: 90
+				},{
+					field: 'keeper_name',
+					title: '保管人',
+					align: 'center',
+					width: 80
+				},{
+					field: 'right',
+					fixed:'right',
+					title: '操作',
+					width: 60,
+					align: 'center',
+					ignoreExport:true,
+					templet: function (d) {
+						var btn0='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</span>';
+						return btn0;
+					}						
+				}
+			]]
+		});
+			
+		table.on('tool(table_contract)',function (obj) {
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/contract/purchase/view?id="+data.id);
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/purchased/add.html b/app/contract/view/purchased/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..2f200a6bbc9dce1759e6a556c43d19b9a3168770
--- /dev/null
+++ b/app/contract/view/purchased/add.html
@@ -0,0 +1,130 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-1">新增采购品</h3>
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray-2">采购品名称<font>*</font></td>
+			<td colspan="3"><input type="text" name="title" autocomplete="off" placeholder="请输入采购品名称" lay-verify="required" lay-reqText="请输入采购品名称" class="layui-input"></td>
+			<td class="layui-td-gray-2">采购品分类<font>*</font></td>
+			<td>
+				<select name="cate_id" lay-verify="required" lay-reqText="请选择分类">
+					<option value="">请选择分类</option>
+					{volist name=":set_recursion(get_base_data('PurchasedCate'))" id="v"}
+					<option value="{$v.id}">{$v.title}</option>
+					{/volist}
+				</select>
+			</td>
+			<td class="layui-td-gray" rowspan="3">缩略图</td>
+			<td rowspan="3" style="width: 150px; vertical-align:top:">
+				<div class="layui-upload">
+					<button type="button" class="layui-btn layui-btn-normal layui-btn-sm" id="test1">缩略图(尺寸：240x136)</button>
+					<div class="layui-upload-list" id="demo1" style="width: 150px; height:90px; overflow: hidden;">
+						<img src="" style="max-width: 100%; height:90px;" />
+						<input type="hidden" name="thumb" value="">
+					</div>
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">采购品编码<font>*</font></td>
+			<td><input type="text" name="code" autocomplete="off" value="{:get_codeno('PR')}" readonly class="layui-input" lay-verify="required" lay-reqText="请输入采购品编码"></td>
+			<td class="layui-td-gray">单位<font>*</font></td>
+			<td><input type="text" name="unit" autocomplete="off" value="" class="layui-input" lay-verify="required" lay-reqText="请输入采购品单位"></td>
+			<td class="layui-td-gray">规格</td>
+			<td><input type="text" name="specs" autocomplete="off" placeholder="请输入采购品规格" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">采购价(元)<font>*</font></td>
+			<td><input type="text" name="purchase_price" autocomplete="off" placeholder="请输入采购品采购价" class="layui-input" lay-verify="required|number" lay-reqText="请输入采购价"></td>
+			<td class="layui-td-gray">是否实物<font>*</font></td>
+			<td colspan="3">
+				<input type="radio" name="is_object" value="1" title="是" checked>
+				<input type="radio" name="is_object" value="2" title="否" >
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">
+				<div class="layui-input-inline">采购品附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="7" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" id="fileBoxInput" data-type="file" name="file_ids" value="">
+				</div>
+			</td>
+		</tr> 
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">采购品描述<font>*</font></td>
+			<td colspan="7">
+				<textarea name="content" placeholder="请输入内容" class="layui-textarea" id="container" style="border:0;padding:0"></textarea>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-1">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool','tinymce','uploadPlus'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool,upload = layui.upload,uploadPlus = layui.uploadPlus;
+	
+    //封面上传
+    var uploadInst = upload.render({
+		elem: '#test1'
+		, url: "/api/index/upload"
+		, done: function (res) {
+			layer.msg(res.msg);
+			if (res.code == 0) {
+				//上传成功
+				$('#demo1 input').attr('value', res.data.id);
+				$('#demo1 img').attr('src', res.data.filepath);
+			}
+		}
+    });
+	
+    //编辑器初始化
+	var editor = layui.tinymce;
+	var edit = editor.render({
+		selector: "#container",
+		images_upload_url: '/api/index/upload/sourse/tinymce',//图片上传接口
+		height: 480
+	});	
+	
+	//附件上传
+	var attachment = new uploadPlus({
+		"target":'uploadBtn',
+		"targetBox":'uploadBox'
+	});
+	
+	//监听提交
+	form.on('submit(webform)', function(data){
+		data.field.content = tinyMCE.editors['container'].getContent();
+		if (data.field.content == '') {
+			layer.msg('请先完善采购品的描述内容');
+			return false;
+		}
+		let callback = function (e) {
+			layer.msg(e.msg);
+			if (e.code == 0) {
+				tool.sideClose(1000);				
+			}
+		}
+		let clickbtn = $(this);
+		tool.post("/contract/purchased/add", data.field, callback,clickbtn);
+		return false;
+	});
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/purchased/datalist.html b/app/contract/view/purchased/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..f2c8b7a735659dd50c0459014bf5d7641deb525d
--- /dev/null
+++ b/app/contract/view/purchased/datalist.html
@@ -0,0 +1,171 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+  <style>
+	.tree-left{width:220px; float:left; height:100%; overflow: scroll; border:1px solid #eeeeee; background-color:#fff; padding:12px 12px 12px 5px;}
+	.tree-left h3{font-size:16px; height:30px; padding-left:10px; font-weight:800}
+  </style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page" style="height:calc(100% - 36px); box-sizing: border-box;">
+	<div class="tree-left">
+		<h3>采购品分类</h3>
+		<div id="cate"></div>
+	</div>
+	<div class="body-table" style="margin-left:248px; overflow:hidden;">
+		<form class="layui-form gg-form-bar border-x border-t">
+			<div class="layui-input-inline" style="width:100px;">
+				<select name="status">
+					<option value="">选择状态</option>
+					<option value="1">正常</option>
+					<option value="0">禁用</option>
+				</select>
+			</div>
+			<div class="layui-input-inline" style="width:300px;">
+				<input type="text" name="keywords" placeholder="关键字，采购品名称/采购品编码" class="layui-input" autocomplete="off" />
+			</div>
+			<div class="layui-input-inline" style="width:150px;">
+				<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+				<button type="reset" class="layui-btn layui-btn-reset" lay-filter="reset">清空</button>
+			</div>
+		</form>
+		<table class="layui-hide" id="test" lay-filter="test"></table>
+	</div>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm addNew" type="button">+ 添加采购品</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool','tablePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool,tree = layui.tree,form = layui.form;
+		$.ajax({
+			url: "/contract/api/get_purchasedcate_tree",
+			type:'get',
+			success:function(res){					
+				//仅节点左侧图标控制收缩
+				tree.render({
+					elem: '#cate',
+					data: res.trees,
+					onlyIconControl: true,  //是否仅允许节点左侧图标控制展开收缩
+					click: function(obj){
+						//layer.msg(JSON.stringify(obj.data));
+						layui.pageTable.reload({
+						   where: {cate_id: obj.data.id},
+						   page:{curr:1}
+						});
+						$('[name="keywords"]').val('');
+						$('[name="status"]').val('');
+						form.render();
+					}
+				});	
+			}
+		})
+		layui.pageTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,title:'采购品列表'
+			,url: "/contract/purchased/datalist"
+			,is_excel: true
+			,cellMinWidth: 60
+			,height: 'full-112'
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'code',width:150, title: '采购品编码', align:'center'}
+				,{field:'cate',width:150, title: '采购品分类', align:'center'}
+				,{field:'title',title: '采购品名称',minWidth:240}
+				,{field:'purchase_price',width:100, title: '采购价(元)', align:'center','style':'color:#1e9fff'}
+				,{field:'unit',width:60, title: '单位', align:'center'}
+				,{field:'specs',width:60, title: '规格', align:'center'}
+				,{field:'status', title: '状态',width:60,align:'center',templet: function(d){
+					var html1='<span class="green">正常</span>';
+					var html2='<span class="yellow">禁用</span>';
+					if(d.status==1){
+						return html1;
+					}
+					else{
+						return html2;
+					}
+				}}
+				,{width:150,fixed:'right', title: '操作', align:'center',templet: function(d){
+					var html='';
+					var btn='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a><a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</a>';
+					var btn1='<a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="disable">禁用</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+					var btn3='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
+					if(d.status==1){
+						html = '<div class="layui-btn-group">'+btn+btn1+btn3+'</div>';
+					}
+					else{
+						html = '<div class="layui-btn-group">'+btn+btn2+btn3+'</div>';
+					}
+					return html;
+				}}
+			]]
+		});
+		
+		table.on('tool(test)',function (obj) {
+			if(obj.event === 'edit'){					
+				tool.side("/contract/purchased/add?id="+obj.data.id);
+			}
+			if(obj.event === 'view'){					
+				tool.side("/contract/purchased/view?id="+obj.data.id);
+			}
+			if(obj.event === 'disable'){
+				layer.confirm('确定要禁用该采购品吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/contract/purchased/set", { id: obj.data.id,status: 0,title: obj.data.title}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'open'){
+				layer.confirm('确定要启用该采购品吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/contract/purchased/set", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'del'){
+				layer.confirm('确定要删除该采购品吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.delete("/contract/purchased/del", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
+					layer.close(index);
+				});
+			}
+		});
+		
+		$('body').on('click','.addNew',function(){
+			tool.side("/contract/purchased/add");	
+		});
+		
+		//监听搜索提交
+		form.on('submit(webform)', function(data){
+			layui.pageTable.reload({where:data.field,page:{curr:1}});
+			return false;
+		});
+	}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/purchased/edit.html b/app/contract/view/purchased/edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..26b18207c4deed970e6399b91212ea7bdc5e6491
--- /dev/null
+++ b/app/contract/view/purchased/edit.html
@@ -0,0 +1,136 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">编辑采购品</h3>
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray-2">采购品名称<font>*</font></td>
+			<td colspan="3"><input type="text" name="title" value="{$detail.title}" autocomplete="off" placeholder="请输入采购品名称" lay-verify="required" lay-reqText="请输入采购品名称" class="layui-input"></td>
+			<td class="layui-td-gray-2">采购品分类<font>*</font></td>
+			<td>
+				 <select name="cate_id" lay-verify="required" lay-reqText="请选择分类">
+					<option value="">请选择分类</option>
+					{volist name=":set_recursion(get_base_data('PurchasedCate'))" id="v"}
+					<option value="{$v.id}" {eq name="$v.id" value="$detail.cate_id"} selected{/eq}>{$v.title}</option>
+					{/volist}
+				 </select>
+			</td>
+			<td class="layui-td-gray" rowspan="3">缩略图</td>
+			<td rowspan="3" style="width: 150px; vertical-align:top:">
+				<div class="layui-upload">
+					<button type="button" class="layui-btn layui-btn-normal layui-btn-sm" id="test1">缩略图(尺寸：240x136)</button>
+					<div class="layui-upload-list" id="demo1" style="width: 150px; height:90px; overflow: hidden;">
+						<img src="{:get_file($detail.thumb)}" style="max-width: 100%; height:90px;" />
+						<input type="hidden" name="thumb" value="{$detail.thumb}">
+					</div>
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">采购品编码<font>*</font></td>
+			<td><input type="text" name="code" value="{$detail.code}" readonly class="layui-input" lay-verify="required"></td>
+			<td class="layui-td-gray">单位<font>*</font></td>
+			<td><input type="text" name="unit" autocomplete="off" value="{$detail.unit}" class="layui-input" lay-verify="required" lay-reqText="请输入采购品单位"></td>
+			<td class="layui-td-gray">规格</td>
+			<td><input type="text" name="specs" autocomplete="off" value="{$detail.specs}" placeholder="请输入采购品规格" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">采购价(元)</td>
+			<td><input type="text" name="purchase_price" value="{$detail.purchase_price}" lay-verify="required|number" lay-reqText="请输入采购品采购价" autocomplete="off" placeholder="请输入采购品采购价" class="layui-input"></td>
+			<td class="layui-td-gray">是否实物<font>*</font></td>
+			<td colspan="3">
+				<input type="radio" name="is_object" value="1" title="是" {eq name="$detail.is_object" value="1"} checked {/eq}>
+				<input type="radio" name="is_object" value="2" title="否" {eq name="$detail.is_object" value="2"} checked {/eq}>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">
+				<div class="layui-input-inline">采购品附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="7" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids}">
+					{notempty name="$detail.file_ids"}
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr> 
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">采购品描述<font>*</font></td>
+			<td colspan="7">
+				<textarea name="content" placeholder="请输入内容" class="layui-textarea" id="container" style="border:0;padding:0">{$detail.content}</textarea>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-1">
+		<input type="hidden" name="id" value="{$detail.id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool','tinymce','uploadPlus'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool,upload = layui.upload,uploadPlus = layui.uploadPlus;
+	
+    //封面上传
+    var uploadInst = upload.render({
+		elem: '#test1'
+		, url: "/api/index/upload"
+		, done: function (res) {
+			layer.msg(res.msg);
+			if (res.code == 0) {
+				//上传成功
+				$('#demo1 input').attr('value', res.data.id);
+				$('#demo1 img').attr('src', res.data.filepath);
+			}
+		}
+    });
+	
+    //编辑器初始化
+	var editor = layui.tinymce;
+	var edit = editor.render({
+		selector: "#container",
+		images_upload_url: '/api/index/upload/sourse/tinymce',//图片上传接口
+		height: 480
+	});	
+	
+	//附件上传
+	var attachment = new uploadPlus({
+		"target":'uploadBtn',
+		"targetBox":'uploadBox'
+	});
+	
+	//监听提交
+	form.on('submit(webform)', function(data){
+		data.field.content = tinyMCE.editors['container'].getContent();
+		if (data.field.content == '') {
+			layer.msg('请先完善采购品的描述内容');
+			return false;
+		}
+		let callback = function (e) {
+			layer.msg(e.msg);
+			if (e.code == 0) {
+				tool.sideClose(1000);				
+			}
+		}
+		let clickbtn = $(this);
+		tool.post("/contract/purchased/add", data.field, callback,clickbtn);
+		return false;
+	});
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/purchased/view.html b/app/contract/view/purchased/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..819b631350c56c887d527bc62c15733e55fe4bff
--- /dev/null
+++ b/app/contract/view/purchased/view.html
@@ -0,0 +1,71 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-4">
+	<h3 class="pb-1">采购品详情</h3>
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray-2">采购品名称</td>
+			<td colspan="3">{$detail.title}</td>
+			<td class="layui-td-gray-2">采购品分类</td>
+			<td>{$detail.cate}</td>
+			<td class="layui-td-gray" rowspan="3">缩略图</td>
+			<td rowspan="3" style="width:150px;">
+				<div class="layui-upload-list" id="demo1" style="width: 150px; height:90px; overflow: hidden;">
+					<img src="{:get_file($detail.thumb)}" style="max-width: 100%; height:90px;" />
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">采购品编码</td>
+			<td>{$detail.code}</td>
+			<td class="layui-td-gray">单位</td>
+			<td>{$detail.unit}</td>
+			<td class="layui-td-gray">规格</td>
+			<td>{$detail.specs}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">采购价(元)</td>
+			<td>{$detail.purchase_price}</td>
+			<td class="layui-td-gray">是否实物</td>
+			<td colspan="3">
+				{eq name="$detail.is_object" value="1"}是{/eq}
+				{eq name="$detail.is_object" value="2"}否{/eq}
+			</td>
+		</tr>
+		{notempty name="$detail.file_ids"}
+		<tr>
+			<td class="layui-td-gray">相关附件</td>
+			<td colspan="7" style="line-height:inherit">
+				<div class="layui-row">
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+		<tr>
+			<td class="layui-td-gray" colspan="8" style="text-align:left; color:#666"><strong>采购品描述</strong></td>
+		</tr>
+		<tr>
+			<td colspan="8">
+				{$detail.content|raw}
+			</td>
+		</tr>
+	</table>
+
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/purchasedcate/add.html b/app/contract/view/purchasedcate/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..279ce2dd3b9433c6b1b2121bc1812242fe4309ab
--- /dev/null
+++ b/app/contract/view/purchasedcate/add.html
@@ -0,0 +1,91 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-1">采购品分类</h3>
+	{eq name="$id" value="0"}
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">父级分类<font>*</font></td>
+			<td>
+				<select name="pid" lay-verify="required" lay-reqText="请选择父级分类">
+				  <option value="0">作为顶级分类</option>
+				  {volist name="$cates" id="v"}
+				  <option value="{$v.id}" {eq name="$pid" value="$v.id"}selected=""{/eq}>{$v.title}</option>
+				  {/volist}
+				</select>
+			</td>
+			<td class="layui-td-gray">分类名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入分类名称" lay-reqText="请输入分类名称" class="layui-input">
+			</td>
+			<td class="layui-td-gray">排序</td>
+			<td>
+				<input type="text" name="sort" placeholder="请输入排序，数字" value="0" autocomplete="off" class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">描述</td>
+			<td colspan="5"><textarea name="desc" placeholder="请输入描述，可空" class="layui-textarea"></textarea></td>
+		</tr>
+	</table>
+	{else/}
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">父级分类<font>*</font></td>
+			<td>
+				<select name="pid" lay-verify="required" lay-reqText="请选择父级分类">
+				  <option value="0">作为顶级分类</option>
+				  {volist name="$cates" id="v"}
+				  <option value="{$v.id}" {eq name="$detail.pid" value="$v.id"}selected=""{/eq}>{$v.title}</option>
+				  {/volist}
+				</select>
+			</td>
+			<td class="layui-td-gray">分类名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" value="{$detail.title}" lay-verify="required" autocomplete="off" placeholder="请输入分类名称" lay-reqText="请输入分类名称" class="layui-input">
+			</td>
+			<td class="layui-td-gray">排序</td>
+			<td>
+				<input type="text" name="sort" value="{$detail.sort}" placeholder="请输入排序，数字" value="0" autocomplete="off" class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">描述</td>
+			<td colspan="5"><textarea name="desc" placeholder="请输入描述，可空" class="layui-textarea">{$detail.desc}</textarea></td>
+		</tr>
+	</table>
+	{/eq}
+	<div class="pt-3">
+		<input type="hidden" name="id" value="{$id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool;		  
+		//监听提交
+		form.on('submit(webform)', function(data){
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					setTimeout(function () {
+						parent.location.reload();
+					}, 1000);					
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/contract/purchasedcate/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/purchasedcate/datalist.html b/app/contract/view/purchasedcate/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..4c30a11a6d299569230eac0ea3d806ea80483f27
--- /dev/null
+++ b/app/contract/view/purchasedcate/datalist.html
@@ -0,0 +1,86 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-3">
+	<div class="gg-form-bar border-t border-x" style="padding-bottom:10px;">
+		<button class="layui-btn layui-btn-sm add-menu">+ 添加采购品分类</button>
+    </div>
+    <div>
+      <table class="layui-hide" id="treeTable" lay-filter="treeTable"></table>
+    </div> 
+</div>
+<script type="text/html" id="switchStatus">
+	<input type="checkbox" name="status" value="{{d.id}}" lay-skin="switch" lay-text="是|否" lay-filter="status" {{ d.status == 1 ? 'checked' : '' }}>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var treeTable = layui.treeTable, tool = layui.tool;
+		
+		layui.pageTable = treeTable.render({
+			elem: '#treeTable'
+			,url: "/contract/purchasedcate/datalist"
+			,tree: { // treeTable 特定属性集
+				customName: {name:'title'},
+				data: {},
+				view: {
+					showIcon:false,
+					expandAllDefault:true
+				},
+				async: {},
+					callback: {}
+				}
+				,cols: [[
+					{field:'id',width:80, title: 'ID号', align:'center'}
+					,{field: 'sort', title: '排序',align:'center', width:80}
+					,{field:'title', width:240, title: '分类名称'}
+					,{field:'pid', title: '父级ID', width:80, align:'center'}
+					,{field:'desc', title: '描述', }
+					,{width:160,title: '操作', align:'center',templet: function(d){
+						var html = '<span class="layui-btn-group"><button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="add">添加子分类</button><button class="layui-btn layui-btn-xs" lay-event="edit">编辑</button><button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button></span>';
+					return html;
+					  }
+					}
+				]]
+				,page:false
+				//,skin:'line'
+			});
+			
+			//表头工具栏事件
+			$('.add-menu').on('click', function(){
+				tool.side('/contract/purchasedcate/add');
+				return;
+			});
+			
+			//操作按钮
+			treeTable.on('tool(treeTable)', function (obj) {
+				if (obj.event === 'add') {
+					tool.side('/contract/purchasedcate/add?pid='+obj.data.id);
+					return;
+				}
+				if (obj.event === 'edit') {
+					tool.side('/contract/purchasedcate/add?id='+obj.data.id);
+					return;
+				}
+				if (obj.event === 'del') {
+					layer.confirm('确定要删除吗?', { icon: 3, title: '提示' }, function (index) {
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								obj.del();
+							}
+						}
+						tool.delete('/contract/purchasedcate/del', { id: obj.data.id }, callback);
+						layer.close(index);
+					});
+				}
+			});
+		}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/services/add.html b/app/contract/view/services/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..1becf97e3158fae12d0589ee9bbb81f73cc30fb8
--- /dev/null
+++ b/app/contract/view/services/add.html
@@ -0,0 +1,49 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">服务内容</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">服务内容<font>*</font></td>
+			<td colspan="3"><input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入服务内容" lay-reqText="请输入服务内容" class="layui-input" value="{$detail.title|default=''}"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">费用(元)<font>*</font></td>
+			<td><input type="text" name="price" lay-verify="required" autocomplete="off" placeholder="请输入费用" lay-reqText="请输入费用" class="layui-input" value="{$detail.price|default=''}"></td>
+			<td class="layui-td-gray">排序</td>
+			<td><input type="text" name="sort" placeholder="请输入排序，数字" autocomplete="off" class="layui-input" value="{$detail.sort|default=''}"></td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$detail.id|default=0}"/>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool'];
+
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/contract/services/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/services/datalist.html b/app/contract/view/services/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..f5d8fd08aa22fa9a0afebf487195c551701f2d2a
--- /dev/null
+++ b/app/contract/view/services/datalist.html
@@ -0,0 +1,98 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<table class="layui-hide" id="table_services" lay-filter="table_services"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm add-new" type="button">+ 添加服务内容</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool;
+		
+		layui.pageTable = table.render({
+			elem: "#table_services"
+			,toolbar: '#toolbarDemo'
+			,url: "/contract/services/datalist"
+			,page: false
+			,limit: 999
+			,cellMinWidth: 80
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',title: '服务内容'}
+				,{field:'price',title: '费用(元)',width:100, align:'right'}
+				,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+					var html1='<span class="green">正常</span>';
+					var html2='<span class="yellow">禁用</span>';
+					if(d.status==1){
+						return html1;
+					}
+					else{
+						return html2;
+					}
+				}}
+				,{width:100,title: '操作', align:'center',ignoreExport:true,templet: function(d){
+					var html='';
+					var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+					if(d.status==1){
+						html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+					}
+					else{
+						html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+					}
+					return html;
+				}}
+			]]
+		});
+			
+		table.on('tool(table_services)',function (obj) {
+			if(obj.event === 'edit'){
+				tool.side("/contract/services/add?id="+obj.data.id);
+			}
+			if(obj.event === 'disable'){
+				layer.confirm('确定要禁用该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/contract/services/set", {id:obj.data.id,status: 0}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'open'){
+				layer.confirm('确定要启用该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/contract/services/set", {id:obj.data.id,status:1}, callback);
+					layer.close(index);
+				});
+			}
+		});
+		
+		$('body').on('click','.add-new',function(){
+			tool.side("/contract/services/add");
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/supplier/add.html b/app/contract/view/supplier/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..899250cf7acc96a73fced014f8dab328d0801225
--- /dev/null
+++ b/app/contract/view/supplier/add.html
@@ -0,0 +1,92 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">新增供应商</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray-2">供应商名称<font>*</font></td>
+			<td colspan="3"><input type="text" name="title" placeholder="请输入供应商名称" lay-verify="required" lay-reqText="请输入供应商名称" class="layui-input"></td>
+			<td class="layui-td-gray-2">供应商电话</td>
+			<td><input type="text" name="phone" autocomplete="off" placeholder="请输入供应商电话" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">供应商地址</td>
+			<td colspan="3"><input type="text" name="address" placeholder="请输入供应商地址" class="layui-input"></td>
+			<td class="layui-td-gray-2">供应商邮箱</td>
+			<td><input type="text" name="email" autocomplete="off" placeholder="请输入供应商邮箱" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">供应商简介</td>
+			<td colspan="5"><textarea name="content" placeholder="请输入内容" class="layui-textarea"></textarea></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">
+				<div class="layui-input-inline">相关附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="">
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td colspan="6"><strong>首要联系人信息</strong></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">联 系 人</td>
+			<td><input type="text" name="c_name" autocomplete="off" placeholder="请输入联系人姓名" class="layui-input"></td>
+			<td class="layui-td-gray">联系电话</td>
+			<td><input type="text" name="c_mobile" autocomplete="off" placeholder="请输入联系人电话" class="layui-input"></td>
+			<td class="layui-td-gray">性别</td>
+			<td>
+				<input type="radio" name="c_sex" value="1" title="男">
+				<input type="radio" name="c_sex" value="2" title="女" >
+			</td>
+		</tr>
+	</table>
+	<div class="pt-3">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool','uploadPlus'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool,uploadPlus=layui.uploadPlus;
+
+	//附件上传
+	var attachment = new uploadPlus({
+		"target":'uploadBtn',
+		"targetBox":'uploadBox'
+	});
+	//监听提交
+	form.on('submit(webform)', function(data){
+		if(data.field.c_name!=='' || data.field.c_mobile!==''){
+			if(!data.field.c_sex){
+				layer.msg('请选择首要联系的性别');
+				return false;
+			}
+		}
+		let callback = function (e) {
+			layer.msg(e.msg);
+			if (e.code == 0) {
+				tool.sideClose(1000);				
+			}
+		}
+		let clickbtn = $(this);
+		tool.post("/contract/supplier/add", data.field, callback,clickbtn);
+		return false;
+	});
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/supplier/contact_add.html b/app/contract/view/supplier/contact_add.html
new file mode 100644
index 0000000000000000000000000000000000000000..ae307bf24e83b8a5a6426db821ddd96c149ad9be
--- /dev/null
+++ b/app/contract/view/supplier/contact_add.html
@@ -0,0 +1,74 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">新增联系人</h3>
+    <table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray-2">供应商名称</td>
+			<td colspan="5">{$supplier_name}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">联系人姓名<font>*</font></td>
+			<td><input type="text" name="name" autocomplete="off" lay-verify="required" lay-reqText="请输入联系人姓名" placeholder="请输入联系人姓名" class="layui-input"></td>
+			<td class="layui-td-gray">联系电话<font>*</font></td>
+			<td><input type="text" name="mobile" autocomplete="off" lay-verify="required" lay-reqText="请输入联系人电话" placeholder="请输入联系人电话" class="layui-input"></td>
+			<td class="layui-td-gray">性别<font>*</font></td>
+			<td>
+				<input type="radio" name="sex" value="1" title="男">
+				<input type="radio" name="sex" value="2" title="女">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">微 信 号</td>
+			<td><input type="text" name="wechat" autocomplete="off" placeholder="请输入联系人微信号" class="layui-input"></td>
+			<td class="layui-td-gray">QQ号码</td>
+			<td><input type="text" name="qq" autocomplete="off" placeholder="请输入联系人QQ号码" class="layui-input"></td>
+			<td class="layui-td-gray">电子邮箱</td>
+			<td><input type="text" name="email" autocomplete="off" placeholder="请输入联系人电子邮箱" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">称谓</td>
+			<td><input type="text" name="nickname" autocomplete="off" placeholder="请输入联系人的称谓" class="layui-input"></td>
+			<td class="layui-td-gray">部门</td>
+			<td><input type="text" name="department" autocomplete="off" placeholder="请输入联系人所在部门" class="layui-input"></td>
+			<td class="layui-td-gray">职务</td>
+			<td><input type="text" name="position" autocomplete="off" placeholder="请输入联系人担任的职务" class="layui-input"></td>
+		</tr>
+    </table>
+    <div class="pt-3">
+		<input type="hidden" name="sid" value="{$supplier_id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			if(!data.field.sex){
+				layer.msg('请选择性别');
+				return false;
+			}
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/contract/supplier/contact_add", data.field, callback,clickbtn);
+			return false;
+		});
+
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/supplier/contact_edit.html b/app/contract/view/supplier/contact_edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..82bedeb56f4c55a532e95c3c897b1643022cc41a
--- /dev/null
+++ b/app/contract/view/supplier/contact_edit.html
@@ -0,0 +1,74 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">编辑联系人</h3>
+    <table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray-2">供应商名称</td>
+			<td colspan="5">{$detail.supplier}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">联系人姓名<font>*</font></td>
+			<td><input type="text" name="name" value="{$detail.name}" autocomplete="off" lay-verify="required" lay-reqText="请输入联系人姓名" placeholder="请输入联系人姓名" class="layui-input"></td>
+			<td class="layui-td-gray">联系电话<font>*</font></td>
+			<td><input type="text" name="mobile" value="{$detail.mobile}" autocomplete="off" lay-verify="required" lay-reqText="请输入联系人电话" placeholder="请输入联系人电话" class="layui-input"></td>
+			<td class="layui-td-gray">性别<font>*</font></td>
+			<td>
+				<input type="radio" name="sex" value="1" title="男" {eq name="$detail.sex" value="1"} checked{/eq}>
+				<input type="radio" name="sex" value="2" title="女" {eq name="$detail.sex" value="2"} checked{/eq}>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">微 信 号</td>
+			<td><input type="text" name="wechat" value="{$detail.wechat}" autocomplete="off" placeholder="请输入联系人微信号" class="layui-input"></td>
+			<td class="layui-td-gray">QQ号码</td>
+			<td><input type="text" name="qq" value="{$detail.qq}" autocomplete="off" placeholder="请输入联系人QQ号码" class="layui-input"></td>
+			<td class="layui-td-gray">电子邮箱</td>
+			<td><input type="text" name="email" value="{$detail.email}" autocomplete="off" placeholder="请输入联系人电子邮箱" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">称谓</td>
+			<td><input type="text" name="nickname" value="{$detail.nickname}" autocomplete="off" placeholder="请输入联系人的称谓" class="layui-input"></td>
+			<td class="layui-td-gray">部门</td>
+			<td><input type="text" name="department" value="{$detail.department}" autocomplete="off" placeholder="请输入联系人所在部门" class="layui-input"></td>
+			<td class="layui-td-gray">职务</td>
+			<td><input type="text" name="position" value="{$detail.position}" autocomplete="off" placeholder="请输入联系人担任的职务" class="layui-input"></td>
+		</tr>
+    </table>
+    <div class="pt-3">
+		<input type="hidden" name="id" value="{$detail.id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			if(!data.field.sex){
+				layer.msg('请选择性别');
+				return false;
+			}
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/contract/supplier/contact_add", data.field, callback,clickbtn);
+			return false;
+		});
+
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/supplier/datalist.html b/app/contract/view/supplier/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..12299af94aa9aa9bb0550607fbf395aea48c7c0f
--- /dev/null
+++ b/app/contract/view/supplier/datalist.html
@@ -0,0 +1,121 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-x border-t" id="barsearchform">
+		<div class="layui-input-inline" style="width:240px;">
+			<input type="text" name="keywords" placeholder="供应商名称/联系人名称" class="layui-input" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+    <table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm add-new" type="button">+ 添加供应商</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool','tablePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool, form = layui.form;
+		layui.pageTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,title:'供应商列表'
+			,url: "/contract/supplier/datalist"
+			,page: true
+			,cellMinWidth: 80
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',title: '供应商名称',minWidth:300}
+				,{field:'address',width:280, title: '供应商地址'}
+				,{field:'phone',width:150, title: '供应商电话', align:'center'}
+				,{field:'email',width:150, title: '供应商邮箱', align:'center'}
+				,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+					var html1='<span class="green">正常</span>';
+					var html2='<span class="yellow">禁用</span>';
+					if(d.status==1){
+						return html1;
+					}
+					else{
+						return html2;
+					}
+				}}
+				,{width:150,fixed:'right', title: '操作',ignoreExport:true, align:'center',templet: function(d){
+					var html='';
+					var btn='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a><a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</a>';
+					var btn1='<a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="disable">禁用</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+					var btn3='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
+					if(d.status==1){
+						html = '<div class="layui-btn-group">'+btn+btn1+btn3+'</div>';
+					}
+					else{
+						html = '<div class="layui-btn-group">'+btn+btn2+btn3+'</div>';
+					}
+					return html;
+				}}
+			]]
+		});
+			
+		table.on('tool(test)',function (obj) {
+			if(obj.event === 'edit'){					
+				tool.side("/contract/supplier/add?id="+obj.data.id);
+			}
+			if(obj.event === 'view'){					
+				tool.side("/contract/supplier/view?id="+obj.data.id);
+			}
+			if(obj.event === 'disable'){
+				layer.confirm('确定要禁用该供应商吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/contract/supplier/set", { id: obj.data.id,status: 0,title: obj.data.title}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'open'){
+				layer.confirm('确定要启用该供应商吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/contract/supplier/set", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'del'){
+				layer.confirm('确定要删除该供应商吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.delete("/contract/supplier/del", { id: obj.data.id}, callback);
+					layer.close(index);
+				});
+			}
+		});
+			
+		$('body').on('click','.add-new',function(){
+			tool.side("/contract/supplier/add");
+		});
+	}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/supplier/edit.html b/app/contract/view/supplier/edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..b3884c8c5bf5cb891dfe46f932dee55bb826de43
--- /dev/null
+++ b/app/contract/view/supplier/edit.html
@@ -0,0 +1,76 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">编辑供应商</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray-2">供应商名称<font>*</font></td>
+			<td colspan="3"><input type="text" name="title" value="{$detail.title}" autocomplete="off" placeholder="请输入供应商名称" lay-verify="required" lay-reqText="请输入供应商名称" class="layui-input"></td>
+			<td class="layui-td-gray-2">供应商电话</td>
+			<td><input type="text" name="phone" value="{$detail.phone}" autocomplete="off" placeholder="请输入供应商电话" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">供应商地址</td>
+			<td colspan="3"><input type="text" name="address" value="{$detail.address}" autocomplete="off" placeholder="请输入供应商地址" class="layui-input"></td>
+			<td class="layui-td-gray-2">供应商邮箱</td>
+			<td><input type="text" name="email" value="{$detail.email}" autocomplete="off" placeholder="请输入供应商邮箱" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">供应商简介</td>
+			<td colspan="5"><textarea name="content" placeholder="请输入内容" class="layui-textarea">{$detail.content}</textarea></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">
+				<div class="layui-input-inline">相关附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids}">
+					{volist name="$detail.file_array" id="vo"}
+						<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo)}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-3">
+		<input type="hidden" name="id" value="{$detail.id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool','uploadPlus'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool,uploadPlus=layui.uploadPlus;
+
+	//附件上传
+	var attachment = new uploadPlus({
+		"target":'uploadBtn',
+		"targetBox":'uploadBox'
+	});
+	//监听提交
+	form.on('submit(webform)', function(data){
+		let callback = function (e) {
+			layer.msg(e.msg);
+			if (e.code == 0) {
+				tool.sideClose(1000);				
+			}
+		}
+		let clickbtn = $(this);
+		tool.post("/contract/supplier/add", data.field, callback,clickbtn);
+		return false;
+	});
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/supplier/view.html b/app/contract/view/supplier/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..43350090b2fdcdaf9cefdb77f60eba331d2d9b86
--- /dev/null
+++ b/app/contract/view/supplier/view.html
@@ -0,0 +1,142 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">供应商详情</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray-2">供应商名称</td>
+			<td>{$detail.title}</td>
+			<td class="layui-td-gray-2">供应商电话</td>
+			<td>{$detail.phone}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">供应商地址</td>
+			<td>{$detail.address}</td>
+			<td class="layui-td-gray-2">供应商邮箱</td>
+			<td>{$detail.email}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">供应商简介</td>
+			<td colspan="3">{$detail.content}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">
+				<div class="layui-input-inline">相关附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="3" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					{volist name="$detail.file_array" id="vo"}
+						<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td colspan="6"><strong>联系人信息</strong><span class="layui-btn layui-btn-xs add-contact ml-3">+ 新增联系人</span></td>
+		</tr>
+		<tr>
+			<td colspan="6"><table class="layui-hide" id="contact" lay-filter="contact"></table></td>
+		</tr>
+	</table>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const supplier_id = '{$detail.id}';
+const moduleInit = ['tool'];
+function gouguInit() {
+	let tool = layui.tool, table = layui.table;
+
+	layui.pageTable = table.render({
+		elem: '#contact',
+		title: '联系人列表',
+		cellMinWidth:80,
+		url: '/contract/api/get_supplier_contact',
+		where:{'supplier_id':supplier_id},
+		page: true, //开启分页
+		limit: 20,
+		cols: [[
+			{field:'id',width:80, title: 'ID号', align:'center'}
+			,{field:'name',width:100,title: '联系人姓名', align:'center'}
+			,{field:'status', title: '性别',width:80,align:'center',templet: function(d){
+				var html='未知';
+				var html1='<span class="green">男</span>';
+				var html2='<span class="blue">女</span>';
+				if(d.sex==1){
+					return html1;
+				}
+				if(d.sex==2){
+					return html2;
+				}
+				else{
+					return html;
+				}
+			}}
+			,{field:'mobile',width:100,title: '手机号码', align:'center'}
+			,{field:'qq',width:100,title: 'QQ号码', align:'center'}
+			,{field:'wechat',width:100,title: '微信号码', align:'center'}
+			,{field:'email',title: '电子邮箱', align:'center'}
+			,{field:'position',width:120,title: '担任职位', align:'center'}
+			,{field:'department',width:120,title: '部门', align:'center'}
+			,{fixed:'right',width:190,title: '操作', align:'center',templet: function(d){
+				var html = '<div class="layui-btn-group">';
+				var btn='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
+				var btn1='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="set">设为首要联系人</a>';
+				var btn2='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
+				if(d.is_default==1){
+					return '<span class="red" style="margin-right:10px;">首要联系人</span>'+btn;
+				}
+				else{
+					return html+btn+btn1+btn2+'</div>';
+				}				
+			}}
+		]]
+	});
+	$('.add-contact').on('click',function(){
+		tool.side('/contract/supplier/contact_add?sid='+supplier_id);
+	});
+	
+	table.on('tool(contact)', function(obj){
+		var data = obj.data; //获得当前行数据
+		var layEvent = obj.event;		 
+		if(layEvent === 'edit'){ //编辑
+			let url = '/contract/supplier/contact_add?id='+data.id;
+			tool.side(url);
+		}
+		if(layEvent === 'set'){ //查看
+			layer.confirm('确定要设置该联系人为首要联系人吗?', {icon: 3, title:'提示'}, function(index){
+				let callback = function (e) {
+					layer.msg(e.msg);
+					if (e.code == 0) {
+						layui.pageTable.reload();
+					}
+				}
+				tool.delete("/contract/api/set_supplier_contact",{"id":data.id},callback);
+				layer.close(index);
+			});
+		}
+		if(layEvent === 'del'){ //删除
+			layer.confirm('确定要删除该联系人吗?', {icon: 3, title:'提示'}, function(index){
+				let callback = function (e) {
+					layer.msg(e.msg);
+					if (e.code == 0) {
+						layui.pageTable.reload();
+					}
+				}
+				tool.delete('/contract/supplier/contact_del',{"id":data.id},callback);
+				layer.close(index);
+			});
+		}
+		return false;
+	})
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/suppliercontact/add.html b/app/contract/view/suppliercontact/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..ce9442480d79ff32557ff8b8e1a446d59b99eccb
--- /dev/null
+++ b/app/contract/view/suppliercontact/add.html
@@ -0,0 +1,90 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">新增联系人</h3>
+    <table class="layui-table layui-table-form">
+      <tr>
+        <td class="layui-td-gray-2">供应商名称</td>
+        <td colspan="5">{$supplier_name}</td>
+      </tr>
+      <tr>
+        <td class="layui-td-gray">姓名<font>*</font></td>
+        <td>
+          <input type="text" name="name" autocomplete="off" lay-verify="required" lay-reqText="请输入联系人姓名" placeholder="请输入联系人姓名" class="layui-input">
+        </td>
+		<td class="layui-td-gray">联系电话<font>*</font></td>
+        <td>
+			<input type="text" name="mobile" autocomplete="off" lay-verify="required" lay-reqText="请输入联系人电话" placeholder="请输入联系人电话" class="layui-input">
+        </td>
+		<td class="layui-td-gray">性别<font>*</font></td>
+        <td>
+			<input type="radio" name="sex" value="1" title="男">
+			<input type="radio" name="sex" value="2" title="女">
+        </td>
+	  </tr>
+	  <tr>
+		<td class="layui-td-gray">微 信 号</td>
+        <td>
+			<input type="text" name="wechat" autocomplete="off" placeholder="请输入联系人微信号" class="layui-input">
+        </td>
+		<td class="layui-td-gray">QQ号码</td>
+        <td>
+			<input type="text" name="qq" autocomplete="off" placeholder="请输入联系人QQ号码" class="layui-input">
+        </td>
+		<td class="layui-td-gray">电子邮箱</td>
+        <td>
+			<input type="text" name="email" autocomplete="off" placeholder="请输入联系人电子邮箱" class="layui-input">
+        </td>
+      </tr>
+	  <tr>
+		<td class="layui-td-gray">称谓</td>
+        <td>
+			<input type="text" name="nickname" autocomplete="off" placeholder="请输入联系人的称谓" class="layui-input">
+        </td>
+		<td class="layui-td-gray">部门</td>
+        <td>
+			<input type="text" name="department" autocomplete="off" placeholder="请输入联系人所在部门" class="layui-input">
+        </td>
+		<td class="layui-td-gray">职务</td>
+        <td>
+			<input type="text" name="position" autocomplete="off" placeholder="请输入联系人担任的职务" class="layui-input">
+        </td>
+      </tr>
+    </table>
+    <div class="py-3">
+	   <input type="hidden" name="sid" value="{$supplier_id}">
+      <button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+      <button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			if(!data.field.sex){
+				layer.msg('请选择性别');
+				return false;
+			}
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/supplier/contact/add", data.field, callback,clickbtn);
+			return false;
+		});
+
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/contract/view/suppliercontact/edit.html b/app/contract/view/suppliercontact/edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..e839731d74b6386e49ad28f73b348df723559ed9
--- /dev/null
+++ b/app/contract/view/suppliercontact/edit.html
@@ -0,0 +1,90 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">编辑联系人</h3>
+    <table class="layui-table layui-table-form">
+      <tr>
+        <td class="layui-td-gray-2">供应商名称</td>
+        <td colspan="5">{$detail.supplier}</td>
+      </tr>
+      <tr>
+        <td class="layui-td-gray">姓名<font>*</font></td>
+        <td>
+          <input type="text" name="name" value="{$detail.name}" autocomplete="off" lay-verify="required" lay-reqText="请输入联系人姓名" placeholder="请输入联系人姓名" class="layui-input">
+        </td>
+		<td class="layui-td-gray">联系电话<font>*</font></td>
+        <td>
+			<input type="text" name="mobile" value="{$detail.mobile}" autocomplete="off" lay-verify="required" lay-reqText="请输入联系人电话" placeholder="请输入联系人电话" class="layui-input">
+        </td>
+		<td class="layui-td-gray">性别<font>*</font></td>
+        <td>
+			<input type="radio" name="sex" value="1" title="男" {eq name="$detail.sex" value="1"} checked{/eq}>
+			<input type="radio" name="sex" value="2" title="女" {eq name="$detail.sex" value="2"} checked{/eq}>
+        </td>
+	  </tr>
+	  <tr>
+		<td class="layui-td-gray">微 信 号</td>
+        <td>
+			<input type="text" name="wechat" value="{$detail.wechat}" autocomplete="off" placeholder="请输入联系人微信号" class="layui-input">
+        </td>
+		<td class="layui-td-gray">QQ号码</td>
+        <td>
+			<input type="text" name="qq" value="{$detail.qq}" autocomplete="off" placeholder="请输入联系人QQ号码" class="layui-input">
+        </td>
+		<td class="layui-td-gray">电子邮箱</td>
+        <td>
+			<input type="text" name="email" value="{$detail.email}" autocomplete="off" placeholder="请输入联系人电子邮箱" class="layui-input">
+        </td>
+      </tr>
+	  <tr>
+		<td class="layui-td-gray">称谓</td>
+        <td>
+			<input type="text" name="nickname" value="{$detail.nickname}" autocomplete="off" placeholder="请输入联系人的称谓" class="layui-input">
+        </td>
+		<td class="layui-td-gray">部门</td>
+        <td>
+			<input type="text" name="department" value="{$detail.department}" autocomplete="off" placeholder="请输入联系人所在部门" class="layui-input">
+        </td>
+		<td class="layui-td-gray">职务</td>
+        <td>
+			<input type="text" name="position" value="{$detail.position}" autocomplete="off" placeholder="请输入联系人担任的职务" class="layui-input">
+        </td>
+      </tr>
+    </table>
+    <div class="py-3">
+	   <input type="hidden" name="id" value="{$detail.id}">
+      <button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+      <button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			if(!data.field.sex){
+				layer.msg('请选择性别');
+				return false;
+			}
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/supplier/contact/add", data.field, callback,clickbtn);
+			return false;
+		});
+
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/crud/command/Crud.php b/app/crud/command/Crud.php
new file mode 100644
index 0000000000000000000000000000000000000000..5df5735a425ed9425071f1ebfc54ac484ee2c95f
--- /dev/null
+++ b/app/crud/command/Crud.php
@@ -0,0 +1,112 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\crud\command;
+
+use think\console\Command;
+use think\console\Input;
+use think\console\input\Option;
+use think\console\Output;
+
+class Crud extends Command
+{
+    protected function configure()
+    {
+        $this->setName('auto crud')
+            ->addOption('name', 'a', Option::VALUE_OPTIONAL, 'the name', null)
+            ->addOption('module', 'm', Option::VALUE_OPTIONAL, 'the module name', null)
+            ->addOption('table', 't', Option::VALUE_OPTIONAL, 'the table name', null)
+            ->addOption('controller', 'c', Option::VALUE_OPTIONAL, 'the controller name', null)
+            ->addOption('types', 'y', Option::VALUE_OPTIONAL, 'the types name', null)
+        ->setDescription('auto make crud file');
+    }
+
+    protected function execute(Input $input, Output $output)
+    {
+        $name = $input->getOption('name');
+        if (!$name) {
+            $output->error("请输入 -na 名称");
+            exit;
+        }
+		
+        $module = $input->getOption('module');
+        if (!$module) {
+            $output->error("请输入 -m 模块名");
+            exit;
+        }
+
+		$table = $input->getOption('table');
+        if (!$table) {
+            $output->error("请输入 -t 表名");
+            exit;
+        }
+		
+        $controller = $input->getOption('controller');
+        if (!$controller) {
+            $output->error("请输入 -c 控制器名");
+            exit;
+        }
+		
+		$types = $input->getOption('types');
+        if (!$types) {
+            $types = 1;
+        }
+
+		$this->make($name,$module,$table,$controller,$types);
+	
+        $output->info($name . "crud make success");
+    }
+	
+	public function make($name,$module,$model,$controller,$types)
+    {
+		!defined('DS') && define('DS', DIRECTORY_SEPARATOR);
+		$crud_dir = CMS_ROOT . '\crud\\';
+		if (!is_dir($crud_dir  . 'view')) {
+            mkdir($crud_dir  . 'view', 0755, true);
+        }		
+		if (!is_dir($crud_dir  . 'controller')) {
+            mkdir($crud_dir . 'controller', 0755, true);
+        }		
+		if (!is_dir($crud_dir  . 'model')) {
+            mkdir($crud_dir  . 'model', 0755, true);
+        }		
+		if (!is_dir($crud_dir  . 'validate')) {
+            mkdir($crud_dir  . 'validate', 0755, true);
+        }		
+		$Bmodel = ucfirst(camelize($model));
+		$Bcontroller = ucfirst(camelize($controller));
+		$crud = [
+			['name'=>'add','path'=>'view/'. DS  .$controller,'filename'=>'add.html'],
+			['name'=>'list','path'=>'view'. DS  .$controller,'filename'=>'datalist.html'],
+			['name'=>'view','path'=>'view'. DS  .$controller,'filename'=>'view.html'],
+			['name'=>'controller','path'=>'controller','filename'=>$Bcontroller.'.php'],
+			['name'=>'model','path'=>'model','filename'=>$Bmodel.'.php'],
+			['name'=>'validate','path'=>'validate','filename'=>$Bcontroller.'Validate.php'],
+		];
+		foreach($crud as $k => $v){	
+			$tpl = dirname(__DIR__) . '/tpl/'.$types.'/'.$v['name'].'.tpl';
+			
+			$tplContent = file_get_contents($tpl);			
+			$tplContent = str_replace('<module>', $module, $tplContent);
+			$tplContent = str_replace('<controller>', $controller, $tplContent);
+			$tplContent = str_replace('<Bcontroller>', $Bcontroller, $tplContent);
+			$tplContent = str_replace('<model>', $model, $tplContent);
+			$tplContent = str_replace('<Bmodel>', $Bmodel, $tplContent);
+			$tplContent = str_replace('<name>', $name, $tplContent);
+			if (!is_dir($crud_dir.$v["path"])) {
+				mkdir($crud_dir.$v["path"], 0755, true);
+			}
+			file_put_contents($crud_dir.$v["path"].'\\'.$v["filename"], $tplContent);
+		}
+    }
+}
\ No newline at end of file
diff --git a/app/crud/controller/Crud.php b/app/crud/controller/Crud.php
new file mode 100644
index 0000000000000000000000000000000000000000..818dbe2868b944da31048a9a457e75889a5609ef
--- /dev/null
+++ b/app/crud/controller/Crud.php
@@ -0,0 +1,51 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\crud\controller;
+
+use app\api\BaseController;
+use think\facade\Console;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Crud extends BaseController
+{
+    public function index()
+    {
+        return view();
+    }
+
+	//一键crud
+	public function crud()
+    {
+		$uid = $this->uid;
+		if($uid!=1){
+			return to_assign(1,'只有系统超级管理员才有权限使用一键crud功能！');
+		}
+		$param = get_params();
+		$a = '-a'.$param['name'];
+		$m = '-m'.$param['module'];
+		$t = '-t'.$param['table'];
+		$c = '-c'.$param['controller'];
+		$y = '-y'.$param['types'];
+		try {
+			$output = Console::call('crud', [$a,$m,$t,$c,$y]);
+			//return $output->fetch();
+        } catch(\Exception $e) {
+			return to_assign(1, $e->getMessage());
+        }
+    }
+}
diff --git a/app/crud/tpl/1/add.tpl b/app/crud/tpl/1/add.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..b7dace55f439022f7b6991e20dde96cde48d21e9
--- /dev/null
+++ b/app/crud/tpl/1/add.tpl
@@ -0,0 +1,69 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3"><name></h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray"><name>名称<font>*</font></td>
+			<td><input type="text" name="title" placeholder="请输入<name>名称" lay-verify="required" lay-reqText="请输入<name>名称" class="layui-input" value="{$detail.title|default=''}"></td>
+			<td class="layui-td-gray">父级分类<font>*</font></td>
+			<td>
+				{empty name="$detail"}
+				<select name="pid" lay-verify="required" lay-reqText="请选择父级分类">
+					<option value="0">作为顶级分类</option>
+					{volist name=":set_recursion(get_base_data('<model>'))" id="v"}
+					<option value="{$v.id}">{$v.title}</option>
+					{/volist}
+				</select>
+				{else/}
+				<select name="pid" lay-verify="required" lay-reqText="请选择父级分类">
+					<option value="0">作为顶级分类</option>
+					{volist name=":set_recursion(get_base_data('<model>'))" id="v"}
+					<option value="{$v.id}" {eq name="$detail.pid" value="$v.id" }selected="" {/eq}>{$v.title}</option>
+					{/volist}
+				</select>
+				{/empty}
+			</td>
+			<td class="layui-td-gray">排序</td>
+			<td><input type="text" name="sort" placeholder="请输入排序，数字" class="layui-input" value="{$detail.sort|default=''}"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray"><name>描述</td>
+			<td colspan="5"><textarea name="desc" placeholder="请输入<name>描述，可空" class="layui-textarea">{$detail.desc|default=''}</textarea></td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$detail.id|default=0}"/>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool'];
+
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					setTimeout(function () {
+						parent.location.reload();
+					}, 1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/<module>/<controller>/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/crud/tpl/1/controller.tpl b/app/crud/tpl/1/controller.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..7cd2f4d00e820402a0dc6242103bed39943718a6
--- /dev/null
+++ b/app/crud/tpl/1/controller.tpl
@@ -0,0 +1,175 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\<module>\controller;
+
+use app\base\BaseController;
+use app\<module>\model\<Bmodel> as <Bmodel>Model;
+use app\<module>\validate\<Bcontroller>Validate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class <Bcontroller> extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new <Bmodel>Model();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+            $list = $this->model->where('delete_time',0)->order('sort asc')->select();
+            return to_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+
+    /**
+    * 子分类
+	* $id
+	* $is_self=1包含自己
+    */
+	public function sonlist($id = 0, $is_self = 1)
+	{
+		$cates = $this->model->where('delete_time',0)->order('sort asc')->select()->toArray();
+		$cates_list = get_data_node($cates, $id);
+		$cates_array = array_column($cates_list, 'id');
+		if ($is_self == 1) {
+			//包括自己在内
+			$cates_array[] = $id;
+		}
+		return $cates_array;
+	}
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {		
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(<Bcontroller>Validate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $cate_array = $this->sonlist($param['id']);
+				if (in_array($param['pid'], $cate_array)) {
+					return to_assign(1, '上级分类不能是该分类本身或其子分类');
+				}
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(<Bcontroller>Validate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			$pid = isset($param['pid']) ? $param['pid'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				View::assign('detail', $detail);
+			}
+			View::assign('pid', $pid);
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			View::assign('detail', $detail);
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		if (request()->isDelete()) {
+			$param = get_params();
+			$id = isset($param['id']) ? $param['id'] : 0;
+			$type = isset($param['type']) ? $param['type'] : 0;
+			$count_cate = $this->model->where(["pid"=>$id,"delete_time"=>0])->count();
+			if ($count_cate > 0) {
+				return to_assign(1, "该分类下还有子分类，无法删除");
+			}
+			$count_list = 0;
+			if ($count_list > 0) {
+				return to_assign(1, "该分类下还有内容，无法删除");
+			}
+			$this->model->delById($id,$type);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+
+    /**
+    * 设置
+    */
+    public function set()
+    {
+		if (request()->isAjax()) {
+			$param = get_params();
+			if($param['status'] == 0){
+				$count_cate = $this->model->where(["pid"=>$param['id'],"delete_time"=>0])->count();
+				if ($count_cate > 0) {
+					return to_assign(1, "该分类下还有子分类，无法禁用");
+				}
+				$count_list = 0;
+				if ($count_list > 0) {
+					return to_assign(1, "该分类下还有内容，无法禁用");
+				}
+				$this->model->strict(false)->field('id,status')->update($param);
+				add_log('disable', $param['id'], $param);
+			}
+			else if($param['status'] == 1){
+				$res = $this->model->strict(false)->field('id,status')->update($param);
+				add_log('recovery', $param['id'], $param);
+			}
+			return to_assign();
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }   
+
+}
diff --git a/app/crud/tpl/1/list.tpl b/app/crud/tpl/1/list.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..4e02bce459216fe599ee73d1b4ca80dac2d9fab7
--- /dev/null
+++ b/app/crud/tpl/1/list.tpl
@@ -0,0 +1,121 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<div class="gg-form-bar border-t border-x" style="padding-bottom:12px">
+		<button class="layui-btn layui-btn-sm tool-add" type="button" data-href="/<module>/<controller>/add">+ 添加<name></button>
+    </div>
+	<table class="layui-hide" id="table_<model>" lay-filter="table_<model>"></table>
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var treeTable = layui.treeTable, tool = layui.tool;
+		
+		layui.pageTable = treeTable.render({
+			elem: "#table_<model>"
+			,title: '<name>列表'
+			,url: "/<module>/<controller>/datalist"
+			,tree: {
+				customName: {name:'title'},
+				view: {showIcon:false},
+				data: {},
+				async: {},
+				callback: {}
+			}
+			,done:function(){
+				treeTable.expandAll('table_<model>', true); // 打开全部节点
+			}
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field: 'sort', title: '排序',align:'center', width:80}
+				,{field:'title', width:240, title: '分类名称'}
+				,{field:'pid', title: '父级ID', width:80, align:'center'}
+				,{field:'desc', title: '描述', }
+				,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+					var html1='<span class="green">正常</span>';
+					var html2='<span class="yellow">禁用</span>';
+					if(d.status==1){
+						return html1;
+					}
+					else{
+						return html2;
+					}
+				}}
+				,{width:192,title: '操作', align:'center',ignoreExport:true,templet: function(d){
+						var html='';
+						var btn='<button class="layui-btn layui-btn-xs" lay-event="add">添加子分类</button>';
+						var btn1='<button class="layui-btn layui-bg-blue layui-btn-xs" lay-event="edit">编辑</button>';
+						var btn2='<a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="disable">禁用</a>';
+						var btn3='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+						var btn4='<button class="layui-btn layui-bg-red layui-btn-xs" lay-event="del">删除</button>';
+						if(d.status==1){
+							html = '<div class="layui-btn-group">'+btn+btn1+btn2+btn4+'</div>';
+						}
+						else{
+							html = '<div class="layui-btn-group">'+btn+btn1+btn3+btn4+'</div>';
+						}
+						return html;
+					}
+				}
+			]]
+			,page:false
+		});
+		
+		//操作按钮
+		treeTable.on('tool(table_<model>)', function (obj) {
+			if (obj.event === 'add') {
+				tool.side("/<module>/<controller>/add?pid="+obj.data.id);
+				return;
+			}
+			if (obj.event === 'edit') {
+				tool.side("/<module>/<controller>/add?id="+obj.data.id);
+				return;
+			}
+			if(obj.event === 'disable'){
+				layer.confirm('确定要禁用该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/<module>/<controller>/set", {id:obj.data.id,status: 0}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'open'){
+				layer.confirm('确定要启用该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/<module>/<controller>/set", {id:obj.data.id,status:1}, callback);
+					layer.close(index);
+				});
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要删除吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/<module>/<controller>/del", { id: obj.data.id }, callback);
+					layer.close(index);
+				});
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/crud/tpl/1/model.tpl b/app/crud/tpl/1/model.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..17518badc0588630a35f2a50c4a08fb813a16674
--- /dev/null
+++ b/app/crud/tpl/1/model.tpl
@@ -0,0 +1,115 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\<module>\model;
+use think\model;
+use think\facade\Db;
+class <Bmodel> extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($param=[],$where=[],$whereOr=[])
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->where(function ($query) use($whereOr) {
+				if (!empty($whereOr)){
+					$query->whereOr($whereOr);
+				}
+			})
+            ->order($order)->paginate(['list_rows'=> $rows]);
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/crud/tpl/1/validate.tpl b/app/crud/tpl/1/validate.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..d3893f998343651b4ee5e64dd6d8f978ee355247
--- /dev/null
+++ b/app/crud/tpl/1/validate.tpl
@@ -0,0 +1,43 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\<module>\validate;
+use think\Validate;
+use think\facade\Db;
+
+class <Bcontroller>Validate extends Validate
+{
+	// 自定义验证规则
+	protected function checkOne($value,$rule,$data=[])
+	{
+		$id = isset($data['id'])?$data['id']:0;
+		$count = Db::name('<Bmodel>')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count();
+		return $count == 0 ? true : false;
+	}
+	
+    protected $rule = [
+		'title' => 'require|checkOne',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'title.require' => '名称不能为空',
+		'title.checkOne' => '同样的名称已经存在',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['title', 'id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/crud/tpl/1/view.tpl b/app/crud/tpl/1/view.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..4d016f6f97b19c3087d2e816f719e032032d0ef2
--- /dev/null
+++ b/app/crud/tpl/1/view.tpl
@@ -0,0 +1,26 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<h3 class="pb-3"><name>详情</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray"><name>名称</td>
+			<td>{$detail.title|default=''}"></td>
+			<td class="layui-td-gray">父级分类</td>
+			<td>
+				{volist name=":set_recursion(get_<model>())" id="v"}
+					{eq name="$detail.pid" value="$v.id" }{$v.title}{/eq}
+				{/volist}
+			</td>
+			<td class="layui-td-gray">排序</td>
+			<td>{$detail.sort|default=0}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray"><name>描述</td>
+			<td colspan="5">{$detail.desc|default=''}</td>
+		</tr>
+	</table>
+</div>
+{/block}
+<!-- /主体 -->
\ No newline at end of file
diff --git a/app/crud/tpl/2/add.tpl b/app/crud/tpl/2/add.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..a7b999de8d10cf05b59ba085f83a4e15d7b04bbc
--- /dev/null
+++ b/app/crud/tpl/2/add.tpl
@@ -0,0 +1,45 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3"><name></h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray"><name>名称<font>*</font></td>
+			<td><input type="text" class="layui-input" name="title" placeholder="请输入<name>名称" lay-verify="required" lay-reqText="请输入<name>名称" value="{$detail.title|default=''}"></td>
+			<td class="layui-td-gray">排序</td>
+			<td><input type="text" name="sort" placeholder="请输入排序，数字" class="layui-input" value="{$detail.sort|default=''}"></td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$detail.id|default=0}"/>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool'];
+
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/<module>/<controller>/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/crud/tpl/2/controller.tpl b/app/crud/tpl/2/controller.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..f07cf75e0c33a168bbdc76633d793dc735187486
--- /dev/null
+++ b/app/crud/tpl/2/controller.tpl
@@ -0,0 +1,141 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\<module>\controller;
+
+use app\base\BaseController;
+use app\<module>\model\<Bmodel> as <Bmodel>Model;
+use app\<module>\validate\<Bcontroller>Validate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class <Bcontroller> extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new <Bmodel>Model();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+            $list = $this->model->where('delete_time',0)->order('sort asc')->select();
+            return to_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {		
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(<Bcontroller>Validate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(<Bcontroller>Validate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				View::assign('detail', $detail);
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			View::assign('detail', $detail);
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		if (request()->isDelete()) {
+			$param = get_params();
+			$id = isset($param['id']) ? $param['id'] : 0;
+			$type = isset($param['type']) ? $param['type'] : 0;
+			$this->model->delById($id,$type);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+
+    /**
+    * 设置
+    */
+    public function set()
+    {
+		if (request()->isAjax()) {
+			$param = get_params();
+			$res = $this->model->strict(false)->field('id,status')->update($param);
+			if ($res) {
+				if($param['status'] == 0){
+					add_log('disable', $param['id'], $param);
+				}
+				else if($param['status'] == 1){
+					add_log('recovery', $param['id'], $param);
+				}
+				return to_assign();
+			}
+			else{
+				return to_assign(0, '操作失败');
+			}
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+   
+
+}
diff --git a/app/crud/tpl/2/list.tpl b/app/crud/tpl/2/list.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..9243b5850ef37dd5f21f41fb80f6ed63fd6636d7
--- /dev/null
+++ b/app/crud/tpl/2/list.tpl
@@ -0,0 +1,125 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<table class="layui-hide" id="table_<model>" lay-filter="table_<model>"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-group">
+  	<button class="layui-btn layui-btn-sm add-new" type="button">+ 添加<name></button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool;
+		
+		layui.pageTable = table.render({
+			elem: "#table_<model>"
+			,title: '<name>列表'
+			,toolbar: '#toolbarDemo'
+			,url: "/<module>/<controller>/datalist"
+			,page: false
+			,limit: 999
+			,cellMinWidth: 80
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',title: '类型名称'}
+				,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+					var html1='<span class="green">正常</span>';
+					var html2='<span class="yellow">禁用</span>';
+					if(d.status==1){
+						return html1;
+					}
+					else{
+						return html2;
+					}
+				}}
+				,{width:100,title: '操作', align:'center',ignoreExport:true,templet: function(d){
+					var html='';
+					var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+					if(d.status==1){
+						html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+					}
+					else{
+						html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+					}
+					return html;
+				}}
+			]]
+		});
+			
+		table.on('tool(table_<model>)',function (obj) {
+			if(obj.event === 'edit'){					
+				add_cate(obj.data.id,obj.data.title);
+			}
+			if(obj.event === 'disable'){
+				layer.confirm('确定要禁用该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/<module>/<controller>/set", {id:obj.data.id,status: 0}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'open'){
+				layer.confirm('确定要启用该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/<module>/<controller>/set", {id:obj.data.id,status:1}, callback);
+					layer.close(index);
+				});
+			}
+		});
+		
+		$('body').on('click','.add-new',function(){
+			add_cate(0,'');	
+		});
+		
+		function add_cate(id,val){
+			var title = '新增类型';
+			if(id>0){
+				title = '编辑类型';
+			}
+			layer.prompt({
+				title: title,
+				value: val,
+				yes: function(index, layero) {
+					// 获取文本框输入的值
+					var value = layero.find(".layui-layer-input").val();
+					if (value) {
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();				
+							}
+						}
+						tool.post("/<module>/<controller>/add", {id: id,title: value}, callback);
+						layer.close(index);
+					} else {
+						layer.msg('请填写类型名称');
+					}
+				}
+			})
+		}
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/crud/tpl/2/model.tpl b/app/crud/tpl/2/model.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..be7945d9c6ee98fc699589cb04c2a03657f4152c
--- /dev/null
+++ b/app/crud/tpl/2/model.tpl
@@ -0,0 +1,114 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\<module>\model;
+use think\model;
+use think\facade\Db;
+class <Bmodel> extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($param=[],$where=[],$whereOr=[])
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->where(function ($query) use($whereOr) {
+				if (!empty($whereOr)){
+					$query->whereOr($whereOr);
+				}
+			})->order($order)->paginate(['list_rows'=> $rows]);
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/crud/tpl/2/validate.tpl b/app/crud/tpl/2/validate.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..d3893f998343651b4ee5e64dd6d8f978ee355247
--- /dev/null
+++ b/app/crud/tpl/2/validate.tpl
@@ -0,0 +1,43 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\<module>\validate;
+use think\Validate;
+use think\facade\Db;
+
+class <Bcontroller>Validate extends Validate
+{
+	// 自定义验证规则
+	protected function checkOne($value,$rule,$data=[])
+	{
+		$id = isset($data['id'])?$data['id']:0;
+		$count = Db::name('<Bmodel>')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count();
+		return $count == 0 ? true : false;
+	}
+	
+    protected $rule = [
+		'title' => 'require|checkOne',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'title.require' => '名称不能为空',
+		'title.checkOne' => '同样的名称已经存在',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['title', 'id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/crud/tpl/2/view.tpl b/app/crud/tpl/2/view.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..f13c9c880eb3de75cef04f2490ea252924964dbd
--- /dev/null
+++ b/app/crud/tpl/2/view.tpl
@@ -0,0 +1,16 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<h3 class="pb-3"><name>详情</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray"><name>名称</td>
+			<td>{$detail.title|default=''}"></td>
+			<td class="layui-td-gray">排序</td>
+			<td>{$detail.sort|default=0}</td>
+		</tr>
+	</table>
+</div>
+{/block}
+<!-- /主体 -->
\ No newline at end of file
diff --git a/app/crud/tpl/3/add.tpl b/app/crud/tpl/3/add.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..705c2b1e429a45417510277a220337678b041dbf
--- /dev/null
+++ b/app/crud/tpl/3/add.tpl
@@ -0,0 +1,49 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3"><name></h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray"><name>名称<font>*</font></td>
+			<td><input type="text" name="title" class="layui-input" placeholder="请输入<name>名称" lay-verify="required" lay-reqText="请输入<name>名称" value="{$detail.title|default=''}"></td>
+			<td class="layui-td-gray">排序</td>
+			<td><input type="text" name="sort" placeholder="请输入排序，数字" class="layui-input" value="{$detail.sort|default=''}"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray"><name>描述</td>
+			<td colspan="3"><textarea name="desc" placeholder="请输入<name>描述，可空" class="layui-textarea">{$detail.desc|default=''}</textarea></td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$detail.id|default=0}"/>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool'];
+
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/<module>/<controller>/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/crud/tpl/3/controller.tpl b/app/crud/tpl/3/controller.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..f2e5fb667d90813051a259a798278f8978643c10
--- /dev/null
+++ b/app/crud/tpl/3/controller.tpl
@@ -0,0 +1,122 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\<module>\controller;
+
+use app\base\BaseController;
+use app\<module>\model\<Bmodel> as <Bmodel>Model;
+use app\<module>\validate\<Bcontroller>Validate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class <Bcontroller> extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new <Bmodel>Model();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			$where=[];
+			$whereOr=[];
+			$where[]=['delete_time','=',0];
+            if (!empty($param['keywords'])) {
+                $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%'];
+            }
+            $list = $this->model->datalist($param,$where,$whereOr);
+            return table_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {		
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(<Bcontroller>Validate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(<Bcontroller>Validate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$param['admin_id'] = $this->uid;
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				View::assign('detail', $detail);
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			View::assign('detail', $detail);
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		if (request()->isDelete()) {
+			$param = get_params();
+			$id = isset($param['id']) ? $param['id'] : 0;
+			$this->model->delById($id);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }   
+
+}
diff --git a/app/crud/tpl/3/list.tpl b/app/crud/tpl/3/list.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..d9c5fd819ab8bd3cd6172ed71d3678934d0cdaed
--- /dev/null
+++ b/app/crud/tpl/3/list.tpl
@@ -0,0 +1,87 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:300px">
+			<input type="text" name="keywords" placeholder="关键字" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_<model>" lay-filter="table_<model>"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-group">
+  	<button class="layui-btn layui-btn-sm tool-add" type="button" data-href="/<module>/<controller>/add">+ 添加<name></button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool;
+		
+		layui.pageTable = table.render({
+			elem: "#table_<model>"
+			,title: '<name>列表'
+			,toolbar: "#toolbarDemo"
+			,url: "/<module>/<controller>/datalist"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 80
+			,height: 'full-112'
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',title: '名称'}
+				,{field:'admin_name',title: '创建人',width:90,align:'center'}
+				,{field:'create_time', title: '创建时间',width:150,align:'center'}
+				,{width:120,fixed:'right',title: '操作', align:'center',ignoreExport:true,templet: function(d){
+					var html='';
+					var btn1='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详细</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn3='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
+					html = '<div class="layui-btn-group">'+btn1+btn2+btn3+'</div>';
+					return html;
+				}}
+			]]
+		});
+			
+		table.on('tool(table_<model>)',function (obj) {
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/<module>/<controller>/view?id="+data.id);
+				return;
+			}
+			if (obj.event === 'edit') {
+				tool.side("/<module>/<controller>/add?id="+data.id);
+				return;
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要删除该内容吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/<module>/<controller>/del", { id: data.id }, callback);
+					layer.close(index);
+				});
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/crud/tpl/3/model.tpl b/app/crud/tpl/3/model.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..3c21512d40b456c9101cd953aa53ced9b3c71b27
--- /dev/null
+++ b/app/crud/tpl/3/model.tpl
@@ -0,0 +1,119 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\<module>\model;
+use think\model;
+use think\facade\Db;
+class <Bmodel> extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($param=[],$where=[],$whereOr=[])
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->where(function ($query) use($whereOr) {
+				if (!empty($whereOr)){
+					$query->whereOr($whereOr);
+				}
+			})
+			->order($order)
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key){
+				//$item['admin_name'] = Db::name('Admin')->where('id',$item['admin_id'])->value('name');
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/crud/tpl/3/validate.tpl b/app/crud/tpl/3/validate.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..d3893f998343651b4ee5e64dd6d8f978ee355247
--- /dev/null
+++ b/app/crud/tpl/3/validate.tpl
@@ -0,0 +1,43 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\<module>\validate;
+use think\Validate;
+use think\facade\Db;
+
+class <Bcontroller>Validate extends Validate
+{
+	// 自定义验证规则
+	protected function checkOne($value,$rule,$data=[])
+	{
+		$id = isset($data['id'])?$data['id']:0;
+		$count = Db::name('<Bmodel>')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count();
+		return $count == 0 ? true : false;
+	}
+	
+    protected $rule = [
+		'title' => 'require|checkOne',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'title.require' => '名称不能为空',
+		'title.checkOne' => '同样的名称已经存在',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['title', 'id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/crud/tpl/3/view.tpl b/app/crud/tpl/3/view.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..f7862cd209ffb20fd38cd69d821ce54ad6cf769c
--- /dev/null
+++ b/app/crud/tpl/3/view.tpl
@@ -0,0 +1,32 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<h3 class="pb-3"><name>详情</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray"><name>名称</td>
+			<td>{$detail.title|default=''}</td>
+			<td class="layui-td-gray">排序</td>
+			<td>{$detail.sort|default=0}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray"><name>描述</td>
+			<td colspan="3">{$detail.desc|default=''}</td>
+		</tr>
+	</table>
+</div>
+{/block}
+<!-- /主体 -->
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool'];
+
+	function gouguInit() {
+		var tool = layui.tool;
+		
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/crud/view/crud/index.html b/app/crud/view/crud/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..01d6b42462cd36b11049bc23fab4901ffc4dc0f1
--- /dev/null
+++ b/app/crud/view/crud/index.html
@@ -0,0 +1,66 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">一键CRUD信息</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray" style="background-color:#FEF7ED">使用说明</td>
+			<td colspan="5" style="background-color:#FEF7ED">勾股OA系统自带的一键CRUD功能没教程，这个功能是我们内部为了提高日常开发效率开发的简单工具，本来不打算放出来的，但是想想也没啥秘密，就干脆不屏蔽了的。
+				<br>有开发能力的人就用起来，没开发能力的当着该功能不存在就行，不影响系统的使用的。如果需要教学的，请加微信号【hdm588】付费咨询或教学。</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">中文名称</td>
+			<td><input type="text" name="name" lay-verify="required" autocomplete="off" placeholder="请输入中文名称" lay-reqText="请输入中文名称"class="layui-input" value=""></td>
+			<td class="layui-td-gray">模板类型</td>
+			<td colspan="3">
+				<input type="radio" name="types" value="1" title="常规分类" checked>
+				<input type="radio" name="types" value="2" title="简单分类" >
+				<input type="radio" name="types" value="3" title="常规模块" >
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">模块名称</td>
+			<td><input type="text" name="module" lay-verify="required" autocomplete="off" placeholder="请输入模块名称，小写" lay-reqText="请输入模块名称"class="layui-input" value=""></td>
+			<td class="layui-td-gray-2">控制器名称</td>
+			<td><input type="text" name="controller" lay-verify="required" autocomplete="off" placeholder="请输入控制器名称，小写" lay-reqText="请输入控制器名称"class="layui-input" value=""></td>
+			<td class="layui-td-gray-2">数据表名称</td>
+			<td><input type="text" name="table" lay-verify="required" autocomplete="off" placeholder="请输入数据表名称，小写，可_隔开" lay-reqText="请输入数据表名称"class="layui-input" value=""></td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">一键CRUD生成代码</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool;
+
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				console.log(e);
+				if (e == '') {
+					layer.msg('crud生成成功');
+				}
+				else{
+					if(e.code==1){
+						layer.msg(e.msg);
+					}
+					else{
+						layer.msg('代码已生成，如需重新生成，请删除后再重试');
+					}					
+				}
+			}
+			tool.post("/crud/crud/crud", data.field, callback);
+			return false;
+		});
+	}
+
+</script>
+{/block}
\ No newline at end of file
diff --git a/app/customer/common.php b/app/customer/common.php
new file mode 100644
index 0000000000000000000000000000000000000000..143ed4a9c39634a771ee57fceb1bca2107d8e81b
--- /dev/null
+++ b/app/customer/common.php
@@ -0,0 +1,71 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+/**
+======================
+ *模块数据获取公共文件
+======================
+ */
+use think\facade\Db;
+
+//客户查看编辑数据权限判断
+function customer_auth($uid,$customer_id)
+{
+	$customer =  Db::name('Customer')->where(['id' => $customer_id])->find();
+	if($customer['belong_uid']==0){
+		return $customer;
+	}
+	//是否是客户管理员
+    $auth = isAuth($uid,'customer_admin','conf_1');
+	$role= 0;
+	if($auth==1){
+		//可见部门数据
+		$dids = get_role_departments($uid);
+		if(in_array($customer['belong_did'],$dids)){
+			$role= 1;
+		}
+	}
+	else if($auth==0){
+		$auth_array=[];
+		if(!empty($customer['share_ids'])){
+			$share_ids = explode(",",$customer['share_ids']);
+			$auth_array = array_merge($auth_array,$share_ids);
+		}	
+		array_push($auth_array,$customer['belong_uid']);
+		//部门负责人
+		$dids = get_leader_departments($uid);
+		if(in_array($uid,$auth_array) || in_array($customer['belong_did'],$dids)){
+			$role= 1;
+		}
+	}
+	if($role == 0){
+		throw new \think\exception\HttpException(405, '无权限访问');
+	}
+	else{
+		return $customer;
+	}
+}
+
+//读取联系人
+function customer_contact($cid)
+{
+    $contact = Db::name('CustomerContact')->where(['delete_time' => 0,'cid'=>$cid])->select()->toArray();
+    return $contact;
+}
+
+//读取销售机会
+function customer_chance($cid)
+{
+    $chance = Db::name('CustomerChance')->where(['delete_time' => 0,'cid'=>$cid])->select()->toArray();
+    return $chance;
+}
\ No newline at end of file
diff --git a/app/customer/controller/Api.php b/app/customer/controller/Api.php
new file mode 100644
index 0000000000000000000000000000000000000000..19feeca7ad6aa394626ef95228118623da2d3a76
--- /dev/null
+++ b/app/customer/controller/Api.php
@@ -0,0 +1,248 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+declare (strict_types = 1);
+namespace app\customer\controller;
+
+use app\api\BaseController;
+use app\customer\model\Customer;
+use app\customer\model\CustomerTrace;
+use app\customer\model\CustomerContact;
+use app\customer\model\CustomerChance;
+use think\facade\Db;
+use think\facade\View;
+
+class Api extends BaseController
+{
+	//获取客户列表
+	public function get_customer()
+    {
+        $param = get_params();
+		$uid = $this->uid;
+		$where = array();
+		$whereOr = array();
+		if (!empty($param['keywords'])) {
+			$where[] = ['id|name', 'like', '%' . $param['keywords'] . '%'];
+		}
+		$where[]=['delete_time','=',0];
+		$where[]=['discard_time','=',0];
+		
+		if (!empty($param['uid'])) {
+			$where[] = ['belong_uid', '=', $param['uid']];
+		}
+		else{
+			//是否是客户管理员
+			$auth = isAuth($uid,'customer_admin','conf_1');
+			if($auth == 0){
+				$whereOr[] = ['belong_uid','=',$uid];
+				$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
+				$dids_a = get_leader_departments($uid);
+				$dids_b = get_role_departments($uid);
+				$dids = array_merge($dids_a, $dids_b);
+				if(!empty($dids)){
+					$whereOr[] = ['belong_did','in',$dids];
+				}
+			}
+		}
+		
+		$model = new Customer();
+		$list = $model->datalist($param,$where,$whereOr);
+        table_assign(0, '', $list);
+    }
+	//分配客户
+	public function distribute()
+    {
+		if (request()->isAjax()) {
+			$params = get_params();
+			//是否是客户管理员
+			$auth = isAuth($this->uid,'customer_admin','conf_1');
+			if($auth==0){
+				return to_assign(1, "只有客户管理员才有权限操作");
+			}
+			$data['id'] = $params['id'];
+			$data['belong_uid'] = $params['uid'];
+			$data['belong_did'] = $params['did'];
+			$data['distribute_time'] = time();
+			if (Db::name('Customer')->update($data) !== false) {
+				add_log('allot', $data['id'],[],'客户');
+				return to_assign(0, "操作成功");
+			} else {
+				return to_assign(1, "操作失败");
+			}
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+	}
+	
+	//锁住、解锁客户
+	public function customer_lock()
+    {
+		if (request()->isAjax()) {
+			$params = get_params();
+			//是否是客户管理员
+			$auth = isAuth($this->uid,'customer_admin','conf_1');
+			if($auth==0){
+				return to_assign(1, "只有客户管理员才有权限操作");
+			}
+			$data['id'] = $params['id'];
+			$data['is_lock'] = $params['is_lock'];
+			if (Db::name('Customer')->update($data) !== false) {
+				if($data['is_lock']==1){
+					add_log('lock', $data['id'],[],'客户');
+				}
+				else{
+					add_log('unlock', $data['id'],[],'客户');
+				}
+				return to_assign(0, "操作成功");
+			} else {
+				return to_assign(1, "操作失败");
+			}
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+	}
+	
+	
+	//彻底删除客户
+    public function delete()
+    {
+		if (request()->isDelete()) {
+			$params = get_params();
+			//是否是客户管理员
+			$auth = isAuth($this->uid,'customer_admin','conf_1');
+			if($auth==0){
+				return to_assign(1, "只有客户管理员才有权限操作");
+			}			
+			$data['id'] = $params['id'];
+			$data['delete_time'] = -1;
+			if (Db::name('Customer')->update($data) !== false) {
+				//删除客户联系人
+				Db::name('CustomerContact')->where(['cid' => $params['id']])->update(['delete_time'=>time()]);
+				//删除客户机会
+				Db::name('CustomerChance')->where(['cid' => $params['id']])->update(['delete_time'=>time()]);
+				add_log('delete', $params['id']);
+				return to_assign();
+			} else {
+				return to_assign(1, "操作失败");
+			}
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+	
+	//跟进记录列表
+	public function get_trace()
+    {
+		$param = get_params();
+		$where = array();
+		$where[] = ['delete_time', '=', 0];
+		$where[] = ['cid', '=', $param['cid']];
+		$model = new CustomerTrace();
+		$list = $model->datalist($param,$where);
+		return table_assign(0, '', $list);
+    }	
+	
+	//销售机会列表
+	public function get_chance()
+    {
+		$param = get_params();
+		$where = array();
+		$where[] = ['delete_time', '=', 0];
+		$where[] = ['cid', '=', $param['cid']];
+		$model = new CustomerChance();
+		$list = $model->datalist($param,$where);
+		return table_assign(0, '', $list);
+    }
+	
+	//获取联系人数据
+	public function get_contact()
+    {
+		$param = get_params();
+		$where = array();
+		$where[] = ['delete_time', '=', 0];
+		$where[] = ['cid', '=', $param['cid']];
+		$model = new CustomerContact();
+		$list = $model->datalist($param,$where);
+		return table_assign(0, '', $list);
+    }
+	
+	//设置联系人
+	public function set_contact()
+    {
+        if (request()->isAjax()) {
+			$param = get_params();
+			$detail= Db::name('CustomerContact')->where(['id' => $param['id']])->find();
+			CustomerContact::where(['cid' => $detail['cid']])->update(['is_default'=>0]);
+			$res = CustomerContact::where(['id' => $param['id']])->update(['is_default'=>1]);
+			if ($res) {
+				add_log('edit', $param['id'], $param,'客户联系人');
+				return to_assign();
+			} else {
+				return to_assign(1, '操作失败');
+			}
+        } else {
+           return to_assign(1, '参数错误');
+        }
+    }
+	
+
+    //添加附件
+    public function add_file()
+    {
+        $param = get_params();
+        $param['create_time'] = time();
+        $param['admin_id'] = $this->uid;
+        $fid = Db::name('CustomerFile')->strict(false)->field(true)->insertGetId($param);
+        if ($fid) {
+            return to_assign(0, '上传成功', $fid);
+        }
+    }
+    
+    //删除附件
+    public function delete_file()
+    {
+        if (request()->isDelete()) {
+			$id = get_params("id");
+			$data['id'] = $id;
+			$data['delete_time'] = time();
+			if (Db::name('CustomerFile')->update($data) !== false) {
+				$detail = Db::name('CustomerFile')->where('id', $id)->find();
+				$file_name = Db::name('File')->where('id', $detail['file_id'])->value('name');
+				return to_assign(0, "删除成功");
+			} else {
+				return to_assign(1, "删除失败");
+			}
+        } else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+	
+	//获取客户等级
+	public function get_customer_grade()
+    {
+		$list = get_base_data('customer_grade');
+		return to_assign(0, '', $list);
+    }
+	//获取客户状态
+	public function get_customer_status()
+    {
+		$list = get_base_type_data('basic_customer',1);
+		return to_assign(0, '', $list);
+    }
+	//获取客户意向
+	public function get_intent_status()
+    {
+		$list = get_base_type_data('basic_customer',2);
+		return to_assign(0, '', $list);
+    }
+
+}
diff --git a/app/customer/controller/Basic.php b/app/customer/controller/Basic.php
new file mode 100644
index 0000000000000000000000000000000000000000..a4304c48ea91efd3c6ccb7210d6b1993f17db3f4
--- /dev/null
+++ b/app/customer/controller/Basic.php
@@ -0,0 +1,93 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\customer\controller;
+
+use app\base\BaseController;
+use app\customer\validate\BasicCustomerCheck;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Basic extends BaseController
+{	
+	public function datalist()
+    {
+        if (request()->isAjax()) {
+			$param = get_params();
+			$where=[];
+			if (!empty($param['types'])) {
+                $where[] = ['types', '=', $param['types']];
+            }
+            $list = Db::name('BasicCustomer')->where($where)->order('create_time asc')->select();
+            return to_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+    //新建编辑
+    public function add()
+    {
+        if (request()->isAjax()) {
+            $param = get_params();
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(BasicCustomerCheck::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['update_time'] = time();
+                $res = Db::name('BasicCustomer')->strict(false)->field('title,types,id,update_time')->update($param);
+                if ($res) {
+                    add_log('edit', $param['id'], $param);
+                }
+                return to_assign();
+            } else {
+                try {
+                    validate(BasicCustomerCheck::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['create_time'] = time();
+                $insertId = Db::name('BasicCustomer')->strict(false)->field('title,types,id,create_time')->insertGetId($param);
+                if ($insertId) {
+                    add_log('add', $insertId, $param);
+                }
+                return to_assign();
+            }
+        }
+    }
+	
+    //设置
+    public function set()
+    {
+		$param = get_params();
+        $res = Db::name('BasicCustomer')->strict(false)->field('id,status')->update($param);
+		if ($res) {
+			if($param['status'] == 0){
+				add_log('disable', $param['id'], $param);
+			}
+			else if($param['status'] == 1){
+				add_log('recovery', $param['id'], $param);
+			}
+			return to_assign();
+		}
+		else{
+			return to_assign(0, '操作失败');
+		}
+    }   
+}
diff --git a/app/customer/controller/Chance.php b/app/customer/controller/Chance.php
new file mode 100644
index 0000000000000000000000000000000000000000..b9d9354997e2bbaad735c0677e48aa3856d69669
--- /dev/null
+++ b/app/customer/controller/Chance.php
@@ -0,0 +1,170 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\customer\controller;
+
+use app\base\BaseController;
+use app\customer\model\CustomerChance as CustomerChanceModel;
+use think\facade\Db;
+use think\facade\View;
+
+class Chance extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new CustomerChanceModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+		$param = get_params();
+		$uid=$this->uid;
+        if (request()->isAjax()) {
+			$where=[];
+			$whereOr=[];
+			$where[]=['delete_time','=',0];
+            if (!empty($param['keywords'])) {
+                $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%'];
+            }
+			if (!empty($param['stage'])) {
+                $where[] = ['stage','=',$param['stage']];
+            }
+			if (!empty($param['uid'])) {
+                $where[] = ['belong_uid','=',$param['uid']];
+            }
+			
+			$map=[];
+			$mapOr=[];
+			$map[]=['delete_time','=',0];
+			$map[]=['discard_time','=',0];
+			
+			$mapOr[] = ['belong_uid','=',$uid];
+			$mapOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
+			$dids_a = get_leader_departments($uid);
+			//是否是客户管理员
+			$auth = isAuth($uid,'customer_admin','conf_1');
+			if($auth == 1){
+				$dids_b = get_role_departments($uid);
+				$dids = array_merge($dids_a, $dids_b);
+				if(!empty($dids)){
+					$mapOr[] = ['belong_did','in',$dids];
+				}
+			}
+			else{
+				if(!empty($dids_a)){
+					$mapOr[] = ['belong_did','in',$dids_a];
+				}
+			}
+			
+			$cids = Db::name('Customer')
+				->where($map)
+				->where(function ($query) use($mapOr) {
+					if (!empty($mapOr)){
+						$query->whereOr($mapOr);
+					}
+				})->column('id');
+				
+			$where[] = ['cid', 'in',$cids];
+            $list = $this->model->datalist($param,$where);
+            return table_assign(0, '', $list);
+        }
+        else{
+			View::assign('is_auth', isAuth($uid,'customer_admin','conf_1'));
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()){
+			if(isset($param['discovery_time'])){
+				$param['discovery_time'] = strtotime($param['discovery_time']);
+			}
+			if(isset($param['expected_time'])){
+				$param['expected_time'] = strtotime($param['expected_time']);
+			}
+			$param['update_time'] = time();
+            if (!empty($param['id']) && $param['id'] > 0) {
+				$this->model->edit($param);
+            } else {
+				$param['create_time'] = time();
+                $param['admin_id'] = $this->uid;
+                $this->model->add($param);
+            }	 
+        }else{
+            $id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				View::assign('detail', $detail);
+				return view('edit');
+			}
+            $customer_id = isset($param['cid']) ? $param['cid'] : 0;
+			$customer_name = Db::name('Customer')->where('id',$customer_id)->value('name');
+            View::assign('customer_id', $customer_id);
+            View::assign('customer_name', $customer_name);
+			if(is_mobile()){
+				return view('qiye@/customer/chance_add');
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			$detail['contact'] = Db::name('CustomerContact')->where('id',$detail['contact_id'])->value('name');
+			$detail['stage_name'] =Db::name('BasicCustomer')->where('id',$detail['stage'])->value('title');
+			View::assign('detail', $detail);
+			if(is_mobile()){
+				return view('qiye@/customer/chance_view');
+			}
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		$param = get_params();
+		$id = isset($param['id']) ? $param['id'] : 0;
+		if (request()->isDelete()) {
+			$this->model->delById($id);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }   
+
+}
diff --git a/app/customer/controller/Contact.php b/app/customer/controller/Contact.php
new file mode 100644
index 0000000000000000000000000000000000000000..d5dc973a52af5f84cc08355fbd033ddd1bc72ca5
--- /dev/null
+++ b/app/customer/controller/Contact.php
@@ -0,0 +1,186 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\customer\controller;
+
+use app\base\BaseController;
+use app\customer\model\CustomerContact as CustomerContactModel;
+use app\customer\validate\ContactValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Contact extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new CustomerContactModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			$uid=$this->uid;
+			$where=[];
+			$where[]=['delete_time','=',0];
+            if (!empty($param['keywords'])) {
+                $where[] = ['id|name|mobile|email', 'like', '%' . $param['keywords'] . '%'];
+            }
+			$map=[];
+			$mapOr=[];
+			$map[]=['delete_time','=',0];
+			$map[]=['discard_time','=',0];
+			
+			$mapOr[] = ['belong_uid','=',$uid];
+			$mapOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
+			$dids_a = get_leader_departments($uid);
+			//是否是客户管理员
+			$auth = isAuth($uid,'customer_admin','conf_1');
+			if($auth == 1){
+				$dids_b = get_role_departments($uid);
+				$dids = array_merge($dids_a, $dids_b);
+				if(!empty($dids)){
+					$mapOr[] = ['belong_did','in',$dids];
+				}
+			}
+			else{
+				if(!empty($dids_a)){
+					$mapOr[] = ['belong_did','in',$dids_a];
+				}
+			}
+			
+			$cids = Db::name('Customer')
+				->where($map)
+				->where(function ($query) use($mapOr) {
+					if (!empty($mapOr)){
+						$query->whereOr($mapOr);
+					}
+				})->column('id');
+			$where[] = ['cid', 'in',$cids];
+            $list = $this->model->datalist($param,$where);
+            return table_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {
+			if (isset($param['birthday'])) {
+                $param['birthday'] = strtotime($param['birthday']);
+            }
+			$family=[];
+			$family_name_data = isset($param['family_name']) ? $param['family_name'] : '';
+			$family_relations_data = isset($param['family_relations']) ? $param['family_relations'] : '';
+			$family_remarks_data = isset($param['family_remarks']) ? $param['family_remarks'] : '';			
+			if(!empty($family_name_data)){
+				foreach ($family_name_data as $key => $value) {
+					if (!$value) {
+						continue;
+					}
+					$data = [];
+					$data['family_name'] = $family_name_data[$key];
+					$data['family_relations'] = $family_relations_data[$key];
+					$data['family_remarks'] = $family_remarks_data[$key];
+					$family[]=$data;
+				}
+			}
+			$param['family'] = serialize($family);		
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(ContactValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(ContactValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$param['admin_id'] = $this->uid;
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			$cid = isset($param['cid']) ? $param['cid'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				View::assign('detail', $detail);
+				return view('edit');
+			}
+			if($cid>0){
+				View::assign('customer_name', Db::name('Customer')->where('id',$cid)->value('name'));
+			}
+			View::assign('customer_id', $cid);
+			View::assign('customer_id', $cid);
+			if(is_mobile()){
+				return view('qiye@/customer/contact_add');
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			View::assign('detail', $detail);
+			if(is_mobile()){
+				return view('qiye@/customer/contact_view');
+			}
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		$param = get_params();
+		$id = isset($param['id']) ? $param['id'] : 0;
+		if (request()->isDelete()) {
+			$this->model->delById($id);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }   
+
+}
diff --git a/app/customer/controller/Customer.php b/app/customer/controller/Customer.php
new file mode 100644
index 0000000000000000000000000000000000000000..ae8044c6229e473faf82cea1905ef2d8b665e7d3
--- /dev/null
+++ b/app/customer/controller/Customer.php
@@ -0,0 +1,220 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\customer\controller;
+
+use app\base\BaseController;
+use app\customer\model\Customer as CustomerModel;
+use app\customer\validate\CustomerValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Customer extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new CustomerModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			$where=[];
+			$whereOr = [];
+			$uid = $this->uid;
+			$tab = isset($param['tab']) ? $param['tab'] : 0;
+            if (!empty($param['keywords'])) {
+                $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%'];
+            }
+			if (!empty($param['customer_status'])) {
+                $where[] = ['customer_status', '=', $param['customer_status']];
+            }
+			if (!empty($param['industry_id'])) {
+                $where[] = ['industry_id', '=', $param['industry_id']];
+            }
+			if (!empty($param['source_id'])) {
+                $where[] = ['source_id', '=', $param['source_id']];
+            }
+			if (!empty($param['grade_id'])) {
+                $where[] = ['grade_id', '=', $param['grade_id']];
+            }
+			if (!empty($param['intent_status'])) {
+                $where[] = ['intent_status', '=', $param['intent_status']];
+            }
+			if (!empty($param['follow_time'])) {
+				$follow_time =explode('~', $param['follow_time']);
+				$where[] = ['follow_time', 'between',[strtotime(urldecode($follow_time[0])),strtotime(urldecode($follow_time[1].' 23:59:59'))]];
+            }
+			if (!empty($param['next_time'])) {
+                $next_time =explode('~', $param['next_time']);
+				$where[] = ['next_time', 'between',[strtotime(urldecode($next_time[0])),strtotime(urldecode($next_time[1].' 23:59:59'))]];
+            }
+			$where[]=['delete_time','=',0];
+			$where[]=['discard_time','=',0];
+			
+			if($tab == 0){
+				if (!empty($param['uid'])) {
+					$where[] = ['belong_uid', '=', $param['uid']];
+				}
+				else{
+					//是否是客户管理员
+					$auth = isAuth($uid,'customer_admin','conf_1');
+					if($auth == 0){
+						$whereOr[] = ['belong_uid','=',$uid];
+						$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
+						$dids_a = get_leader_departments($uid);
+						$dids_b = get_role_departments($uid);
+						$dids = array_merge($dids_a, $dids_b);
+						if(!empty($dids)){
+							$whereOr[] = ['belong_did','in',$dids];
+						}
+					}
+				}
+			}
+			//我的客户
+			if($tab == 1){
+				$where[] = ['belong_uid','=',$uid];
+			}
+			//下属客户
+			if($tab == 2){
+				$where[] = ['belong_uid','<>',$uid];
+				$dids_a = get_leader_departments($uid);
+				if(!empty($dids_a)){
+					$where[] = ['belong_did','in',$dids_a];
+				}				
+			}
+			//分享客户
+			if($tab == 3){
+				$where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
+			}
+            $list = $this->model->datalist($param,$where,$whereOr);
+            return table_assign(0, '', $list);
+        }
+        else{
+			View::assign('is_leader', isLeader($this->uid));
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {	
+			try {
+				validate(CustomerValidate::class)->scene($param['scene'])->check($param);
+			} catch (ValidateException $e) {
+				// 验证失败 输出错误信息
+				return to_assign(1, $e->getError());
+			}		
+            if (!empty($param['id']) && $param['id'] > 0) {
+				$param['edit_id'] = $this->uid;
+				$this->model->edit($param);
+            } else {
+				$param['admin_id'] = $this->uid;
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			$sea = isset($param['sea']) ? $param['sea'] : 0;
+			View::assign('sea', $sea);
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				View::assign('detail', $detail);
+				return view('edit');
+			}
+			if($this->uid>1){
+				View::assign('userinfo', get_admin($this->uid));
+			}
+			if(is_mobile()){
+				return view('qiye@/customer/add');
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		$detail['admin_name'] = Db::name('Admin')->where(['id' => $detail['admin_id']])->value('name');
+		if($detail['customer_status']>0){
+			$detail['customer_status_name'] = Db::name('BasicCustomer')->where(['id' => $detail['customer_status']])->value('title');
+		}
+		else{
+			$detail['customer_status_name']='-';
+		}
+		if($detail['intent_status']>0){
+			$detail['intent_status_name'] = Db::name('BasicCustomer')->where(['id' => $detail['intent_status']])->value('title');
+		}
+		else{
+			$detail['intent_status_name']='-';
+		}
+		
+		$detail['industry'] = Db::name('Industry')->where(['id' => $detail['industry_id']])->value('title');
+		$detail['source'] = Db::name('CustomerSource')->where(['id' => $detail['source_id']])->value('title');
+		$detail['grade'] = Db::name('CustomerGrade')->where(['id' => $detail['grade_id']])->value('title');
+		
+		//附件
+		$file_array = Db::name('CustomerFile')
+			->field('cf.id,f.filepath,f.name,f.filesize,f.fileext,f.create_time,f.admin_id')
+			->alias('cf')
+			->join('File f', 'f.id = cf.file_id', 'LEFT')
+			->order('cf.create_time asc')
+			->where(array('cf.customer_id' => $id, 'cf.delete_time' => 0))
+			->select()->toArray();
+		$detail['file_array'] = $file_array;
+		
+		$role=0;
+		if($detail['belong_uid'] == $this->uid && $detail['is_lock'] == 0){
+			$role=1;
+		}
+		View::assign('detail', $detail);
+		View::assign('role', $role);
+		if(is_mobile()){
+			return view('qiye@/customer/view');
+		}
+		return view();
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		$param = get_params();
+		$id = isset($param['id']) ? $param['id'] : 0;
+		if (request()->isDelete()) {
+			$this->model->delById($id);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }   
+
+}
diff --git a/app/customer/controller/Grade.php b/app/customer/controller/Grade.php
new file mode 100644
index 0000000000000000000000000000000000000000..236fbf56f1b047f88b2ad88920a2526e3219c12c
--- /dev/null
+++ b/app/customer/controller/Grade.php
@@ -0,0 +1,141 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\customer\controller;
+
+use app\base\BaseController;
+use app\customer\model\CustomerGrade as CustomerGradeModel;
+use app\customer\validate\GradeValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Grade extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new CustomerGradeModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+            $list = $this->model->where('delete_time',0)->order('sort asc')->select();
+            return to_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {		
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(GradeValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(GradeValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getCateById($id);
+				View::assign('detail', $detail);
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			View::assign('detail', $detail);
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		if (request()->isDelete()) {
+			$param = get_params();
+			$id = isset($param['id']) ? $param['id'] : 0;
+			$type = isset($param['type']) ? $param['type'] : 0;
+			$this->model->delById($id,$type);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+
+    /**
+    * 设置
+    */
+    public function set()
+    {
+		if (request()->isAjax()) {
+			$param = get_params();
+			$res = $this->model->strict(false)->field('id,status')->update($param);
+			if ($res) {
+				if($param['status'] == 0){
+					add_log('disable', $param['id'], $param);
+				}
+				else if($param['status'] == 1){
+					add_log('recovery', $param['id'], $param);
+				}
+				return to_assign();
+			}
+			else{
+				return to_assign(0, '操作失败');
+			}
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+   
+
+}
diff --git a/app/customer/controller/Index.php b/app/customer/controller/Index.php
new file mode 100644
index 0000000000000000000000000000000000000000..b5e2dce5b898cac5315b84e6d16d513735882537
--- /dev/null
+++ b/app/customer/controller/Index.php
@@ -0,0 +1,199 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\customer\controller;
+
+use app\base\BaseController;
+use app\customer\model\Customer as CustomerModel;
+use think\facade\Db;
+use think\facade\View;
+
+class Index extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new CustomerModel();
+    }
+	//抢客宝
+    public function rush()
+    {
+        if (request()->isAjax()) {
+            $param = get_params();
+			$param['order'] = 'rand()';
+            $where = array();
+            $where[] = ['delete_time', '=', 0];
+            $where[] = ['discard_time', '=', 0];
+            $where[] = ['belong_uid', '=', 0];
+            $list = $this->model->datalist($param,$where);
+            return table_assign(0, '', $list);
+        } else {
+			$time = strtotime(date('Y-m-d')." 00:00:00");
+			$max_num = Db::name('DataAuth')->where('name','customer_admin')->value('conf_3');
+			$count = Db::name('Customer')->where([['belong_time','>',$time],['belong_uid','=',$this->uid]])->count();
+			View::assign('max_num', $max_num);
+			View::assign('count', $count);
+            return view();
+        }
+    }
+	
+	//公海客户
+    public function sea()
+    {
+        if (request()->isAjax()) {
+            $param = get_params();
+            $where = array();
+            if (!empty($param['keywords'])) {
+                $where[] = ['id|name', 'like', '%' . $param['keywords'] . '%'];
+            }
+			if (!empty($param['industry_id'])) {
+                $where[] = ['industry_id', '=', $param['industry_id']];
+            }
+			if (!empty($param['source_id'])) {
+                $where[] = ['source_id', '=', $param['source_id']];
+            }
+			if (!empty($param['grade_id'])) {
+                $where[] = ['grade_id', '=', $param['grade_id']];
+            }
+			if (!empty($param['follow_time'])) {
+				$follow_time =explode('~', $param['follow_time']);
+				$where[] = ['follow_time', 'between',[strtotime(urldecode($follow_time[0])),strtotime(urldecode($follow_time[1].' 23:59:59'))]];
+            }
+            $where[] = ['delete_time', '=', 0];
+            $where[] = ['discard_time', '=', 0];
+            $where[] = ['belong_uid', '=', 0];
+			
+            $list = $this->model->datalist($param,$where);
+            return table_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+	
+	//废池客户
+    public function trash()
+    {
+        if (request()->isAjax()) {
+            $param = get_params();
+            $where = array();
+            if (!empty($param['keywords'])) {
+                $where[] = ['id|name', 'like', '%' . $param['keywords'] . '%'];
+            }
+			if (!empty($param['industry_id'])) {
+                $where[] = ['industry_id', '=', $param['industry_id']];
+            }
+			if (!empty($param['source_id'])) {
+                $where[] = ['source_id', '=', $param['source_id']];
+            }
+			if (!empty($param['grade_id'])) {
+                $where[] = ['grade_id', '=', $param['grade_id']];
+            }
+            $where[] = ['delete_time', '>', 0];
+            $where[] = ['discard_time', '=', 0];
+            $where[] = ['belong_uid', '=', 0];
+            $list = $this->model->datalist($param,$where);
+            return table_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+	
+	//移入公海
+	public function to_sea()
+    {
+		if (request()->isAjax()) {
+			$id = get_params("id");
+			$data['id'] = $id;
+			$data['belong_uid'] = 0;
+			$data['belong_did'] = 0;
+			$data['belong_time'] = 0;
+			if (Db::name('Customer')->update($data) !== false) {
+				add_log('tosea', $id);
+				return to_assign(0, "操作成功");
+			} else {
+				return to_assign(1, "操作失败");
+			}
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+	}
+	
+	//获取客户
+	public function to_get()
+    {
+		if (request()->isAjax()) {
+			$id = get_params("id");
+			$time = strtotime(date('Y-m-d')." 00:00:00");
+			$max_num = Db::name('DataAuth')->where('name','customer_admin')->value('conf_2');
+			$count = Db::name('Customer')->where([['belong_time','>',$time],['belong_uid','=',$this->uid]])->count();
+			if($count>=$max_num){
+				return to_assign(1, "今日领取客户数已到达上限，请明天再来领取");
+			}
+			$data['id'] = $id;
+			$data['belong_uid'] = $this->uid;
+			$data['belong_did'] = $this->did;
+			$data['belong_time'] = time();
+			if (Db::name('Customer')->update($data) !== false) {
+				add_log('tosea', $id);
+				return to_assign(0, "操作成功");
+			} else {
+				return to_assign(1, "操作失败");
+			}
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+	}	
+	
+	//客户移入废弃池
+    public function to_trash()
+    {
+		if (request()->isAjax()) {
+			$params = get_params();			
+			$data['id'] = $params['id'];
+			$data['delete_time'] = time();
+			$log_data['action'] = 'totrash';
+			if (Db::name('Customer')->update($data) !== false) {
+				add_log('totrash', $params['id']);
+				return to_assign();
+			} else {
+				return to_assign(1, "操作失败");
+			}
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+	
+	//还原客户
+    public function to_revert()
+    {
+		if (request()->isAjax()) {
+			$params = get_params();		
+			$data['id'] = $params['id'];
+			$data['delete_time'] = 0;
+			if (Db::name('Customer')->update($data) !== false) {
+				add_log('recovery', $params['id']);
+				return to_assign();
+			} else {
+				return to_assign(1, "操作失败");
+			}
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+}
diff --git a/app/customer/controller/Industry.php b/app/customer/controller/Industry.php
new file mode 100644
index 0000000000000000000000000000000000000000..6c2319f41bfce630731b63879dc3897726523321
--- /dev/null
+++ b/app/customer/controller/Industry.php
@@ -0,0 +1,141 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\customer\controller;
+
+use app\base\BaseController;
+use app\customer\model\Industry as IndustryModel;
+use app\customer\validate\IndustryValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Industry extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new IndustryModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+            $list = $this->model->select();
+            return to_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {		
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(IndustryValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(IndustryValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				View::assign('detail', $detail);
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			View::assign('detail', $detail);
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		if (request()->isDelete()) {
+			$param = get_params();
+			$id = isset($param['id']) ? $param['id'] : 0;
+			$type = isset($param['type']) ? $param['type'] : 0;
+			$this->model->delById($id,$type);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+
+    /**
+    * 设置
+    */
+    public function set()
+    {
+		if (request()->isAjax()) {
+			$param = get_params();
+			$res = $this->model->strict(false)->field('id,status')->update($param);
+			if ($res) {
+				if($param['status'] == 0){
+					add_log('disable', $param['id'], $param);
+				}
+				else if($param['status'] == 1){
+					add_log('recovery', $param['id'], $param);
+				}
+				return to_assign();
+			}
+			else{
+				return to_assign(0, '操作失败');
+			}
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+   
+
+}
diff --git a/app/customer/controller/Source.php b/app/customer/controller/Source.php
new file mode 100644
index 0000000000000000000000000000000000000000..f9481fb7a58da14ee0323cd4e9f35168a062588e
--- /dev/null
+++ b/app/customer/controller/Source.php
@@ -0,0 +1,141 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\customer\controller;
+
+use app\base\BaseController;
+use app\customer\model\CustomerSource as CustomerSourceModel;
+use app\customer\validate\SourceValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Source extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new CustomerSourceModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+            $list = $this->model->where('delete_time',0)->order('sort asc')->select();
+            return to_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {		
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(SourceValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(SourceValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getCateById($id);
+				View::assign('detail', $detail);
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			View::assign('detail', $detail);
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		if (request()->isDelete()) {
+			$param = get_params();
+			$id = isset($param['id']) ? $param['id'] : 0;
+			$type = isset($param['type']) ? $param['type'] : 0;
+			$this->model->delById($id,$type);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+
+    /**
+    * 设置
+    */
+    public function set()
+    {
+		if (request()->isAjax()) {
+			$param = get_params();
+			$res = $this->model->strict(false)->field('id,status')->update($param);
+			if ($res) {
+				if($param['status'] == 0){
+					add_log('disable', $param['id'], $param);
+				}
+				else if($param['status'] == 1){
+					add_log('recovery', $param['id'], $param);
+				}
+				return to_assign();
+			}
+			else{
+				return to_assign(0, '操作失败');
+			}
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+   
+
+}
diff --git a/app/customer/controller/Trace.php b/app/customer/controller/Trace.php
new file mode 100644
index 0000000000000000000000000000000000000000..24539b50c5a500a8d36437d851753d26bafe0b41
--- /dev/null
+++ b/app/customer/controller/Trace.php
@@ -0,0 +1,175 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\customer\controller;
+
+use app\base\BaseController;
+use app\customer\model\CustomerTrace as CustomerTraceModel;
+use think\facade\Db;
+use think\facade\View;
+
+class Trace extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new CustomerTraceModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+		$param = get_params();
+		$uid=$this->uid;
+        if (request()->isAjax()) {
+			$where=[];
+			$where[]=['delete_time','=',0];
+            if (!empty($param['keywords'])) {
+                $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%'];
+            }
+			if (!empty($param['follow_time'])) {
+				$follow_time =explode('~', $param['follow_time']);
+				$where[] = ['follow_time', 'between',[strtotime(urldecode($follow_time[0])),strtotime(urldecode($follow_time[1].' 23:59:59'))]];
+            }
+			if (!empty($param['uid'])) {
+                $where[] = ['admin_id','=',$param['uid']];
+            }
+			$map=[];
+			$mapOr=[];
+			$map[]=['delete_time','=',0];
+			$map[]=['discard_time','=',0];
+			
+			$mapOr[] = ['belong_uid','=',$uid];
+			$mapOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
+			$dids_a = get_leader_departments($uid);
+			//是否是客户管理员
+			$auth = isAuth($uid,'customer_admin','conf_1');
+			if($auth == 1){
+				$dids_b = get_role_departments($uid);
+				$dids = array_merge($dids_a, $dids_b);
+				if(!empty($dids)){
+					$mapOr[] = ['belong_did','in',$dids];
+				}
+			}
+			else{
+				if(!empty($dids_a)){
+					$mapOr[] = ['belong_did','in',$dids_a];
+				}
+			}
+			
+			$cids = Db::name('Customer')
+				->where($map)
+				->where(function ($query) use($mapOr) {
+					if (!empty($mapOr)){
+						$query->whereOr($mapOr);
+					}
+				})->column('id');
+				
+			$where[] = ['cid', 'in',$cids];
+            $list = $this->model->datalist($param,$where);
+            return table_assign(0, '', $list);
+        }
+        else{
+			View::assign('is_auth', isAuth($uid,'customer_admin','conf_1'));
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {
+			if(isset($param['follow_time'])){
+				$param['follow_time'] = strtotime($param['follow_time']);
+			}
+			if(isset($param['next_time'])){
+				$param['next_time'] = strtotime($param['next_time']);
+			}
+			$param['update_time'] = time();
+            if (!empty($param['id']) && $param['id'] > 0) {
+				$this->model->edit($param);
+            } else {
+				$param['create_time'] = time();
+                $param['admin_id'] = $this->uid;
+                $this->model->add($param);
+            }	 
+        }else{
+            $id = isset($param['id']) ? $param['id'] : 0;
+			if ($id > 0) {
+				View::assign('detail', $this->model->getById($id));
+				return view('edit');
+			}
+            $customer_id = isset($param['cid']) ? $param['cid'] : 0;
+			$customer_name = Db::name('Customer')->where('id',$customer_id)->value('name');
+            View::assign('customer_id', $customer_id);
+            View::assign('customer_name', $customer_name);
+			if(is_mobile()){
+				return view('qiye@/customer/trace_add');
+			}
+            return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			$detail['contact'] = Db::name('CustomerContact')->where('id',$detail['contact_id'])->value('name');
+			$detail['types_name'] = Db::name('BasicCustomer')->where('id',$detail['types'])->value('title');
+			$detail['stage_name'] = Db::name('BasicCustomer')->where('id',$detail['stage'])->value('title');
+			if($detail['chance_id']>0){
+				$detail['chance'] = Db::name('CustomerChance')->where(['id' => $detail['chance_id']])->value('title');
+			}
+			else{
+				$detail['chance']='-';
+			}
+			View::assign('detail', $detail);
+			if(is_mobile()){
+				return view('qiye@/customer/trace_view');
+			}
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		$param = get_params();
+		$id = isset($param['id']) ? $param['id'] : 0;
+		if (request()->isDelete()) {
+			$this->model->delById($id);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }   
+
+}
diff --git a/app/customer/event.php b/app/customer/event.php
new file mode 100644
index 0000000000000000000000000000000000000000..4eff8908bd643cd6072b9fde6ee38ca4ad6f04ad
--- /dev/null
+++ b/app/customer/event.php
@@ -0,0 +1,5 @@
+<?php
+// 这是系统自动生成的event定义文件
+return [
+
+];
diff --git a/app/customer/middleware.php b/app/customer/middleware.php
new file mode 100644
index 0000000000000000000000000000000000000000..c482cdc94129fdc23d6b57facd94e78af56a3c34
--- /dev/null
+++ b/app/customer/middleware.php
@@ -0,0 +1,9 @@
+<?php
+
+// 这是系统自动生成的middleware定义文件
+return [
+    //开启session中间件
+    //'think\middleware\SessionInit',
+    //验证勾股OA是否完成安装
+    \app\home\middleware\Install::class,
+];
diff --git a/app/customer/model/Customer.php b/app/customer/model/Customer.php
new file mode 100644
index 0000000000000000000000000000000000000000..61aba2148fa77c395568d18ccd1ffedf0b85e557
--- /dev/null
+++ b/app/customer/model/Customer.php
@@ -0,0 +1,203 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\customer\model;
+use think\model;
+use think\facade\Db;
+use app\api\model\EditLog;
+class Customer extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($param=[],$where=[],$whereOr=[])
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->where(function ($query) use($whereOr) {
+				if (!empty($whereOr)){
+					$query->whereOr($whereOr);
+				}
+			})
+			->orderRaw($order)
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key){
+				if($item->belong_uid>0){
+					$item->belong_name = Db::name('Admin')->where('id',$item->belong_uid)->value('name');
+					$item->belong_department = Db::name('Department')->where(['id' => $item->belong_did])->value('title');
+				}
+				else{
+					$item->belong_name='-';
+					$item->belong_department='-';
+				}
+				if($item->industry_id>0){
+					$item->industry = Db::name('Industry')->where(['id' => $item->industry_id])->value('title');
+				}
+				else{
+					$item->industry='-';
+				}
+				if($item->grade_id>0){
+					$item->grade = Db::name('CustomerGrade')->where(['id' => $item->grade_id])->value('title');
+				}
+				else{
+					$item->grade='-';
+				}
+				if($item->source_id>0){
+					$item->source = Db::name('CustomerSource')->where(['id' => $item->source_id])->value('title');
+				}
+				else{
+					$item->source='-';
+				}
+				if($item->customer_status>0){
+					$item->customer_status_name = Db::name('BasicCustomer')->where(['id' => $item->customer_status])->value('title');
+				}
+				else{
+					$item->customer_status_name='-';
+				}
+				if($item->intent_status>0){
+					$item->intent_status_name = Db::name('BasicCustomer')->where(['id' => $item->intent_status])->value('title');
+				}
+				else{
+					$item->intent_status_name='-';
+				}
+				if($item->follow_time==0){
+					$item->follow_time='-';
+				}
+				else{
+					$item->follow_time = date('Y-m-d',$item->follow_time);
+				}
+				if($item->next_time==0){
+					$item->next_time='-';
+				}
+				else{
+					$item->next_time = date('Y-m-d',$item->next_time);
+				}
+				$contact = Db::name('CustomerContact')->where(['is_default'=>1,'cid' => $item->id])->find();
+				if(!empty($contact)){
+					$item->contact_name = $contact['name'];
+					$item->contact_mobile = $contact['mobile'];
+					$item->contact_email = $contact['email'];
+				}
+				else{
+					$item->contact_name = '';
+					$item->contact_mobile = '';
+					$item->contact_email = '';
+				}
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$param['update_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			$contact = [
+				'name' => $param['c_name'],
+				'mobile' => $param['c_mobile'],
+				'sex' => $param['c_sex'],
+				'qq' => $param['c_qq'],
+				'wechat' => $param['c_wechat'],
+				'email' => $param['c_email'],
+				'cid' => $insertId,
+				'is_default' => 1,
+				'create_time' => time(),
+				'admin_id' => $param['admin_id']
+			];
+			Db::name('CustomerContact')->strict(false)->field(true)->insert($contact);
+			add_log('add', $insertId, $param);
+			$log=new EditLog();
+			$log->add('Customer',$insertId);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+			$old = self::find($param['id']);
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+			$log=new EditLog();
+			$log->edit('Customer',$param['id'],$param,$old);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		$info['belong_department'] = Db::name('Department')->where(['id' => $info['belong_did']])->value('title');
+		$info['belong_name'] = Db::name('Admin')->where(['id' => $info['belong_uid']])->value('name');
+		if(!empty($info['share_ids'])){
+			$share_names = Db::name('Admin')->where([['id','in',$info['share_ids']]])->column('name');
+			$info['share_names'] = implode(',',$share_names);
+		}
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				self::where('id', $id)->update(['discard_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/customer/model/CustomerChance.php b/app/customer/model/CustomerChance.php
new file mode 100644
index 0000000000000000000000000000000000000000..19c9f1874330650a547390bda0e0af723c83d687
--- /dev/null
+++ b/app/customer/model/CustomerChance.php
@@ -0,0 +1,121 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\customer\model;
+use think\model;
+use think\facade\Db;
+class CustomerChance extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($param=[],$where=[])
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->order($order)
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key){
+				$item->customer = Db::name('Customer')->where(['id' => $item->cid])->value('name');
+				$item->belong_name = Db::name('Admin')->where('id',$item->belong_uid)->value('name');
+				$item->stage_name = Db::name('BasicCustomer')->where(['id' => $item->stage])->value('title');
+				$item->expected_time = date('Y-m-d', $item->expected_time);
+				$item->discovery_time = date('Y-m-d', $item->discovery_time);
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		$info['customer'] = Db::name('Customer')->where(['id' => $info['cid']])->value('name');	
+		$info['belong_name'] = Db::name('Admin')->where(['id' => $info['belong_uid']])->value('name');			
+		$assist_names = Db::name('Admin')->where([['id','in',$info['assist_ids']]])->column('name');
+		$info['assist_names'] = implode(',',$assist_names);
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/customer/model/CustomerContact.php b/app/customer/model/CustomerContact.php
new file mode 100644
index 0000000000000000000000000000000000000000..012f7e4981ad6ac417728f33a9c39013b8671efe
--- /dev/null
+++ b/app/customer/model/CustomerContact.php
@@ -0,0 +1,128 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\customer\model;
+use think\model;
+use think\facade\Db;
+class CustomerContact extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($param,$where)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->order($order)
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key){
+				$item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name');
+				$item->customer = Db::name('Customer')->where(['id' => $item->cid])->value('name');
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		if(!empty($info['family'])){
+			$info['family'] = unserialize($info['family']);
+		}
+		if(!empty($info['birthday'])){
+			$info['birthday'] = date('Y-m-d',$info['birthday']);
+		}
+		else{
+			$info['birthday'] = '';
+		}
+		$info['customer'] = Db::name('Customer')->where(['id' => $info['cid']])->value('name');
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		$detail=self::find($id);
+		if($detail['is_default'] == 1){
+			return to_assign(1, '首要联系人，不能删除');
+		}
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/customer/model/CustomerGrade.php b/app/customer/model/CustomerGrade.php
new file mode 100644
index 0000000000000000000000000000000000000000..55ec80866b4ad62a9f58a92defef1317ac28d4e2
--- /dev/null
+++ b/app/customer/model/CustomerGrade.php
@@ -0,0 +1,108 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\customer\model;
+use think\model;
+use think\facade\Db;
+class CustomerGrade extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)->order($order)->paginate(['list_rows'=> $rows]);
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/customer/model/CustomerSource.php b/app/customer/model/CustomerSource.php
new file mode 100644
index 0000000000000000000000000000000000000000..454a0c1b887509d9aa4ad42aaa34cf826e5f5b83
--- /dev/null
+++ b/app/customer/model/CustomerSource.php
@@ -0,0 +1,108 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\customer\model;
+use think\model;
+use think\facade\Db;
+class CustomerSource extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)->order($order)->paginate(['list_rows'=> $rows]);
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/customer/model/CustomerTrace.php b/app/customer/model/CustomerTrace.php
new file mode 100644
index 0000000000000000000000000000000000000000..836c3f9effa2338dda606e2b2afc500d6a4a27f2
--- /dev/null
+++ b/app/customer/model/CustomerTrace.php
@@ -0,0 +1,139 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\customer\model;
+use think\model;
+use think\facade\Db;
+class CustomerTrace extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($param,$where)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->order($order)
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key){
+				$item->follow_time = date('Y-m-d H:i',$item->follow_time);
+				$item->next_time = date('Y-m-d H:i',$item->next_time);
+				$item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name');
+				$item->type_name = Db::name('BasicCustomer')->where(['id' => $item->types])->value('title');
+				$item->stage_name = Db::name('BasicCustomer')->where(['id' => $item->stage])->value('title');
+				if($item->chance_id>0){
+					$item->chance = Db::name('CustomerChance')->where(['id' => $item->chance_id])->value('title');
+				}
+				else{
+					$item->chance='-';
+				}
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			$follow_time = self::order('follow_time', 'desc')->where(['delete_time'=>0,'cid'=>$param['cid']])->value('follow_time');
+			$next_time = self::order('next_time', 'desc')->where(['delete_time'=>0,'cid'=>$param['cid']])->value('next_time');
+			Db::name('Customer')->strict(false)->field(true)->update(['id'=>$param['cid'],'follow_time'=>$follow_time,'next_time'=>$next_time]);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			$follow_time = self::order('follow_time', 'desc')->where(['delete_time'=>0,'cid'=>$param['cid']])->value('follow_time');
+			$next_time = self::order('next_time', 'desc')->where(['delete_time'=>0,'cid'=>$param['cid']])->value('next_time');
+			Db::name('Customer')->strict(false)->field(true)->update(['id'=>$param['cid'],'follow_time'=>$follow_time,'next_time'=>$next_time]);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		$info['customer'] = Db::name('Customer')->where(['id' => $info['cid']])->value('name');
+		$file_array=[];
+		if(!empty($info['file_ids'])){
+			$file_array = Db::name('File')->where('id','in',$info['file_ids'])->select()->toArray();
+		}
+		$info['file_array'] = $file_array;
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		$cid = self::where('id', $id)->value('cid');
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		$follow_time = self::order('follow_time', 'desc')->where(['delete_time'=>0,'cid'=>$cid])->value('follow_time');
+		$next_time = self::order('next_time', 'desc')->where(['delete_time'=>0,'cid'=>$cid])->value('next_time');
+		Db::name('Customer')->strict(false)->field(true)->update(['id'=>$cid,'follow_time'=>$follow_time,'next_time'=>$next_time]);
+		return to_assign();
+    }
+}
+
diff --git a/app/customer/model/Industry.php b/app/customer/model/Industry.php
new file mode 100644
index 0000000000000000000000000000000000000000..f9df375e632a7f23c6dcb5d3478595d4cefbd5f1
--- /dev/null
+++ b/app/customer/model/Industry.php
@@ -0,0 +1,79 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\customer\model;
+use think\model;
+use think\facade\Db;
+class Industry extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)->order($order)->paginate(['list_rows'=> $rows]);
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		return $info;
+    }
+}
+
diff --git a/app/customer/validate/BasicCustomerCheck.php b/app/customer/validate/BasicCustomerCheck.php
new file mode 100644
index 0000000000000000000000000000000000000000..e34f5f8b70a0091fedf96e459a6fec6b5f0de90e
--- /dev/null
+++ b/app/customer/validate/BasicCustomerCheck.php
@@ -0,0 +1,34 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\customer\validate;
+
+use think\Validate;
+
+class BasicCustomerCheck extends Validate
+{
+    protected $rule = [
+        'title' => 'require',
+        'id' => 'require',
+    ];
+
+    protected $message = [
+        'title.require' => '名称不能为空',
+        'id.require' => '缺少更新条件',
+    ];
+
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['id', 'title'],
+    ];
+}
diff --git a/app/customer/validate/ChanceValidate.php b/app/customer/validate/ChanceValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..a97ae87e0f3a2ec64b658432dc5b38196c678860
--- /dev/null
+++ b/app/customer/validate/ChanceValidate.php
@@ -0,0 +1,43 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\customer\validate;
+use think\Validate;
+use think\facade\Db;
+
+class ChanceValidate extends Validate
+{
+	// 自定义验证规则
+	protected function checkOne($value,$rule,$data=[])
+	{
+		$id = isset($data['id'])?$data['id']:0;
+		$count = Db::name('CustomerChance')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count();
+		return $count == 0 ? true : false;
+	}
+	
+    protected $rule = [
+		'title' => 'require|checkOne',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'title.require' => '名称不能为空',
+		'title.checkOne' => '同样的名称已经存在',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['title', 'id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/customer/validate/ContactValidate.php b/app/customer/validate/ContactValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..c197674568019670e1640929825dd9ea4777e1e3
--- /dev/null
+++ b/app/customer/validate/ContactValidate.php
@@ -0,0 +1,34 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\customer\validate;
+use think\Validate;
+use think\facade\Db;
+
+class ContactValidate extends Validate
+{	
+    protected $rule = [
+		'name' => 'require',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'title.require' => '名称不能为空',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['title', 'id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/customer/validate/CustomerValidate.php b/app/customer/validate/CustomerValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..e039300fba8ad250f98351ab0301b2ffe396b3aa
--- /dev/null
+++ b/app/customer/validate/CustomerValidate.php
@@ -0,0 +1,44 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\customer\validate;
+use think\Validate;
+use think\facade\Db;
+
+class CustomerValidate extends Validate
+{
+	// 自定义验证规则
+	protected function checkOne($value,$rule,$data=[])
+	{
+		$id = isset($data['id'])?$data['id']:0;
+		$count = Db::name('Customer')->where([['name','=',$data['name']],['id','<>',$id],['delete_time','=',0]])->count();
+		return $count == 0 ? true : false;
+	}
+	
+    protected $rule = [
+		'name' => 'require|checkOne',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'name.require' => '名称不能为空',
+		'name.checkOne' => '同样的名称已经存在',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['name'],
+        'edit' => ['name','id'],
+        'oaedit' => ['id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/customer/validate/GradeValidate.php b/app/customer/validate/GradeValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..1b735b9174074b21d180a229245b207bfc582f0e
--- /dev/null
+++ b/app/customer/validate/GradeValidate.php
@@ -0,0 +1,43 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\customer\validate;
+use think\Validate;
+use think\facade\Db;
+
+class GradeValidate extends Validate
+{
+	// 自定义验证规则
+	protected function checkOne($value,$rule,$data=[])
+	{
+		$id = isset($data['id'])?$data['id']:0;
+		$count = Db::name('CustomerGrade')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count();
+		return $count == 0 ? true : false;
+	}
+	
+    protected $rule = [
+		'title' => 'require|checkOne',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'title.require' => '名称不能为空',
+		'title.checkOne' => '同样的名称已经存在',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['title', 'id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/customer/validate/IndustryValidate.php b/app/customer/validate/IndustryValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..efe34f3b8ce3ed8bde1554cfe7a2954dd37c872a
--- /dev/null
+++ b/app/customer/validate/IndustryValidate.php
@@ -0,0 +1,43 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\customer\validate;
+use think\Validate;
+use think\facade\Db;
+
+class IndustryValidate extends Validate
+{
+	// 自定义验证规则
+	protected function checkOne($value,$rule,$data=[])
+	{
+		$id = isset($data['id'])?$data['id']:0;
+		$count = Db::name('Industry')->where([['title','=',$data['title']],['id','<>',$id]])->count();
+		return $count == 0 ? true : false;
+	}
+	
+    protected $rule = [
+		'title' => 'require|checkOne',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'title.require' => '名称不能为空',
+		'title.checkOne' => '同样的名称已经存在',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['title', 'id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/customer/validate/SourceValidate.php b/app/customer/validate/SourceValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..308314bb39f82b8b7f3c168424f57117dd74f114
--- /dev/null
+++ b/app/customer/validate/SourceValidate.php
@@ -0,0 +1,43 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\customer\validate;
+use think\Validate;
+use think\facade\Db;
+
+class SourceValidate extends Validate
+{
+	// 自定义验证规则
+	protected function checkOne($value,$rule,$data=[])
+	{
+		$id = isset($data['id'])?$data['id']:0;
+		$count = Db::name('CustomerSource')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count();
+		return $count == 0 ? true : false;
+	}
+	
+    protected $rule = [
+		'title' => 'require|checkOne',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'title.require' => '名称不能为空',
+		'title.checkOne' => '同样的名称已经存在',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['title', 'id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/customer/view/basic/datalist.html b/app/customer/view/basic/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..a27622ae728f17a90713957eed35240f23e9eff3
--- /dev/null
+++ b/app/customer/view/basic/datalist.html
@@ -0,0 +1,140 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-3">
+    <div class="layui-card">
+		<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
+			<ul class="layui-tab-title" style="border-bottom:none;">
+				<li class="layui-this" data-index="1">客户状态</li>
+				<li data-index="2">客户意向</li>
+				<li data-index="3">跟进方式</li>
+				<li data-index="4">销售阶段</li>
+			</ul>
+			<div class="layui-tab-content" style="padding:0">
+				<table class="layui-hide" id="test" lay-filter="test"></table>
+			</div>
+		</div> 
+	</div> 
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm add-new" type="button">+ 新增内容</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool, element = layui.element,form = layui.form;
+		var data_type=1;
+		element.on('tab(tab)', function(data){
+			data_type = data.index+1;
+			layui.pageTable.reload({where:{types:data_type},page:{curr:1}});
+			return false;
+		});
+		
+		layui.pageTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,title:'基础数据列表'
+			,url: "/customer/basic/datalist"
+			,where:{types:data_type}
+			,page: false
+			,cellMinWidth: 80
+			,cols: [[
+					{field:'id',width:80, title: 'ID号', align:'center'}
+					,{field:'title',title: '名称'}
+					,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+						var html1='<span class="green">正常</span>';
+						var html2='<span class="yellow">禁用</span>';
+						if(d.status==1){
+							return html1;
+						}
+						else{
+							return html2;
+						}
+					}}
+					,{width:100,title: '操作', align:'center',templet: function(d){
+						var html='';
+						var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
+						var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+						var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+						if(d.status==1){
+							html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+						}
+						else{
+							html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+						}
+						return html;
+					}}
+				]]
+			});
+			
+			table.on('tool(test)',function (obj) {
+				if(obj.event === 'edit'){					
+					addExpense(obj.data.id,obj.data.title);
+				}
+				if(obj.event === 'disable'){
+					layer.confirm('确定要禁用该数据吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/customer/basic/set", { id: obj.data.id,status: 0,title: obj.data.title}, callback);
+						layer.close(index);
+					});
+				}
+				if(obj.event === 'open'){
+					layer.confirm('确定要启用该数据吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/customer/basic/set", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
+						layer.close(index);
+					});
+				}
+			});
+			
+			$('body').on('click','.add-new',function(){
+				addExpense(0,'');	
+			});
+			
+			function addExpense(id,val){
+				var title = '新增内容';
+				if(id>0){
+					title = '编辑内容';
+				}
+				layer.prompt({
+					title: title,
+					value: val,
+					yes: function(index, layero) {
+						// 获取文本框输入的值
+						var value = layero.find(".layui-layer-input").val();
+						if (value) {
+							let callback = function (e) {
+								layer.msg(e.msg);
+								if (e.code == 0) {
+									layui.pageTable.reload();				
+								}
+							}
+							tool.post("/customer/basic/add", {id: id,types:data_type,title: value}, callback);
+							layer.close(index);
+						} else {
+							layer.msg('请填写内容');
+						}
+					}
+				})
+			}
+		}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/customer/view/chance/add.html b/app/customer/view/chance/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..c6dcee713d91ca20ce59c34a44b426d7e1284778
--- /dev/null
+++ b/app/customer/view/chance/add.html
@@ -0,0 +1,89 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">新增销售机会</h3>
+    <table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">客户名称</td>
+			<td colspan="3">{$customer_name}</td>
+			<td class="layui-td-gray-2">客户联系人<font>*</font></td>
+			<td>
+			  <select name="contact_id" lay-verify="required" lay-reqText="请选择联系人">
+				<option value="">请选择</option>
+				{volist name=":customer_contact($customer_id)" id="v"}
+				<option value="{$v.id}">{$v.name}</option>
+				{/volist}
+			  </select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">机会标题<font>*</font></td>
+			<td colspan="3"><input type="text" name="title" autocomplete="off" lay-verify="required" lay-reqText="请输入机会标题" placeholder="请输入机会标题" class="layui-input"></td>
+			<td class="layui-td-gray">发现时间<font>*</font></td>
+			<td><input type="text" name="discovery_time" readonly lay-verify="required" lay-reqText="请选择发现时间" placeholder="请选择发现时间" class="layui-input tool-time"></td>
+		 </tr>
+		<tr>
+			<td class="layui-td-gray">销售阶段<font>*</font></td>
+			<td>
+				<select name="stage" lay-verify="required" lay-reqText="请选择">
+					<option value="">请选择</option>
+					{volist name=":get_base_type_data('basic_customer',4)" id="v"}
+					<option value="{$v.id}">{$v.title}</option>
+					{/volist}
+				</select>
+			</td>
+			<td class="layui-td-gray">预计金额<font>*</font></td>
+			<td><input type="text" name="expected_amount" autocomplete="off" lay-verify="required|number" lay-reqText="请输入预计金额" placeholder="请输入预计金额" class="layui-input"></td>
+			<td class="layui-td-gray-2">预计签单时间<font>*</font></td>
+			<td><input type="text" name="expected_time" readonly lay-verify="required" lay-reqText="请选择预计签单时间" placeholder="请选择预计签单时间" class="layui-input tool-time"></td>
+        </tr>
+	    <tr>
+			<td class="layui-td-gray" style="vertical-align:top">需求描述<font>*</font></td>
+			<td colspan="5"><textarea name="content" placeholder="请输入需求描述" lay-verify="required" lay-reqText="请输入需求描述" class="layui-textarea"></textarea></td>
+		</tr>
+		<tr>        
+			<td class="layui-td-gray">归属人员<font>*</font></td>
+			<td>
+				<input type="text" name="belong_name" readonly placeholder="请选择归属人员" class="layui-input picker-admin">
+				<input type="hidden" name="belong_uid" lay-verify="required" lay-reqText="请选择归属人员">
+			</td>
+			<td class="layui-td-gray">协助人员</td>
+			<td colspan="3">
+				<input type="text" name="assist_names" placeholder="请选择协助人员" class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="assist_ids">
+			</td>
+		</tr>
+    </table>
+    <div class="pt-4">
+		<input type="hidden" name="cid" value="{$customer_id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','oaPicker'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,oaPicker = layui.oaPicker;		
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000,'chanceTable');
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/customer/chance/add", data.field, callback,clickbtn);
+			return false;
+		});
+
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/customer/view/chance/datalist.html b/app/customer/view/chance/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..bab78220f8b78ddb7b5491a2e76374de208cfaa0
--- /dev/null
+++ b/app/customer/view/chance/datalist.html
@@ -0,0 +1,115 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-x border-t" lay-filter="barsearchform">
+		{gt name="$is_auth" value="0"}
+		<div class="layui-input-inline user-name" style="width:100px;">
+			<input type="text" name="username" placeholder="选择归属人" class="layui-input picker-admin" readonly />
+			<input type="text" name="uid" value="" style="display:none" />	
+		</div>
+		{/gt}
+		<div class="layui-input-inline" style="width:120px;">
+			<select name="stage">
+				<option value="">销售阶段</option>
+				{volist name=":get_base_type_data('basic_customer',4)" id="v"}
+				<option value="{$v.id}">{$v.title}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:200px;">
+			<input type="text" name="keywords" placeholder="输入关键字" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px;">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+    <table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div>
+  	<h3>线索机会</h3>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool','oaPicker','tablePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool, form = layui.form;
+		layui.chanceTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,title:'线索机会列表'
+			,url: "/customer/chance/datalist"
+			,cellMinWidth: 80
+			,page: true //开启分页
+			,is_excel: true
+			,height: 'full-112'
+			,limit: 20
+			,cols:  [[
+					{field: 'id', title: '编号', width: 80, align: 'center'}
+					,{field:'belong_name',title: '归属人',align:'center',width: 80}
+					,{field:'title',title: '机会主题'}
+					,{field:'customer',title: '关联客户',width: 300}
+					,{field:'discovery_time',title: '发现时间',align:'center',width: 100}
+					,{ field: 'expected_time', title: '预计签单时间', width: 110, align: 'center'}
+					,{ field: 'expected_amount', title: '预计签单金额', width: 110, align: 'center'}
+					,{field:'stage_name',title: '当前阶段',width: 80, align: 'center'}
+					,{fixed:'right',width:130,title: '操作', align:'center',templet: function(d){
+						var html = '<div class="layui-btn-group">';
+						var btn1='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
+						var btn2='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</a>';
+						var btn3='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
+						if(d.admin_id == login_admin){
+							return '<div class="layui-btn-group">'+btn1+btn2+btn3+'</div>';
+						}
+						else{
+							return '<div class="layui-btn-group">'+btn2+'</div>';
+						}
+					}}			
+				]]
+			});
+			
+			table.on('tool(test)', function(obj){
+				var data = obj.data; //获得当前行数据
+				var layEvent = obj.event;		 
+				if(layEvent === 'edit'){ //编辑
+					let url = '/customer/chance/add/id/'+data.id;
+					tool.side(url);
+				}
+				if(layEvent === 'view'){ //查看
+					let url = '/customer/chance/view/id/'+data.id;
+					tool.side(url);
+				}
+				if(layEvent === 'del'){ //删除
+					layer.confirm('确定要删除该销售机会吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.delete('/customer/chance/chance_del',{'id':data.id},callback);
+						layer.close(index);
+					});
+				}
+				return false;
+			})
+			
+			//监听搜索提交
+			form.on('submit(webform)', function(data) {
+				layui.pageTable.reload({
+					where: data.field,
+					page: {curr: 1}
+				});
+				return false;
+			});
+		}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/customer/view/chance/edit.html b/app/customer/view/chance/edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..d6875eb2f17062c4aae2b7e351f495549e2e3bfc
--- /dev/null
+++ b/app/customer/view/chance/edit.html
@@ -0,0 +1,90 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">编辑销售机会</h3>
+    <table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">客户名称</td>
+			<td colspan="3">{$detail.customer}</td>
+			<td class="layui-td-gray-2">客户联系人<font>*</font></td>
+			<td>
+			  <select name="contact_id" lay-verify="required" lay-reqText="请选择联系人">
+				<option value="">请选择</option>
+				{volist name=":customer_contact($detail.cid)" id="v"}
+				<option value="{$v.id}" {eq name="$v.id" value="$detail.contact_id"} selected{/eq}>{$v.name}</option>
+				{/volist}
+			  </select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">机会标题<font>*</font></td>
+			<td colspan="3"><input type="text" name="title" value="{$detail.title}" autocomplete="off" lay-verify="required" lay-reqText="请输入机会标题" placeholder="请输入机会标题" class="layui-input"></td>
+			<td class="layui-td-gray">发现时间<font>*</font></td>
+			<td>
+			  <input type="text" name="discovery_time" value="{$detail.discovery_time|date='Y-m-d'}" readonly lay-verify="required" lay-reqText="请选择发现时间" placeholder="请选择发现时间" class="layui-input tool-time">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">销售阶段<font>*</font></td>
+			<td>
+			  <select name="stage" lay-verify="required" lay-reqText="请选择">
+				<option value="">请选择</option>
+				{volist name=":get_base_type_data('basic_customer',4)" id="v"}
+					<option value="{$v.id}" {eq name="$v.id" value="$detail.stage"} selected{/eq}>{$v.title}</option>
+				{/volist}
+			</td>
+			<td class="layui-td-gray">预计金额<font>*</font></td>
+			<td> <input type="text" name="expected_amount" autocomplete="off" value="{$detail.expected_amount}" lay-verify="required|number" lay-reqText="请输入预计金额" placeholder="请输入预计金额" class="layui-input"></td>
+			<td class="layui-td-gray-2">预计签单时间<font>*</font></td>
+			<td><input type="text" name="expected_time" value="{$detail.expected_time|date='Y-m-d'}" readonly lay-verify="required" lay-reqText="请选择预计签单时间" placeholder="请选择预计签单时间" class="layui-input tool-time"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top">需求描述<font>*</font></td>
+			<td colspan="5"><textarea name="content" placeholder="请输入需求描述" lay-verify="required" lay-reqText="请输入需求描述" class="layui-textarea">{$detail.content}</textarea></td>
+		</tr>
+		<tr>        
+			<td class="layui-td-gray">归属人员<font>*</font></td>
+        <td>
+			<input type="text" name="belong_name" value="{$detail.belong_name}" readonly placeholder="请选择归属人员" class="layui-input picker-admin">
+			<input type="hidden" name="belong_uid" value="{$detail.belong_uid}" lay-verify="required" lay-reqText="请选择归属人员">
+        </td>
+		<td class="layui-td-gray">协助人员</td>
+			<td colspan="3">
+				<input type="text" name="assist_names" value="{$detail.assist_names}" placeholder="请选择协助人员" class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="assist_ids" value="{$detail.assist_ids}">
+			</td>
+		</tr>
+    </table>
+    <div class="pt-4">
+		<input type="hidden" name="id" value="{$detail.id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','oaPicker'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,oaPicker = layui.oaPicker;		
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code==0){
+					tool.sideClose(1000,'chanceTable');
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/customer/chance/add", data.field, callback,clickbtn);
+			return false;
+		});
+
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/customer/view/chance/view.html b/app/customer/view/chance/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..98ebcc8c48ed8527980ac0aa50af208e3caf82bb
--- /dev/null
+++ b/app/customer/view/chance/view.html
@@ -0,0 +1,48 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">销售机会</h3>
+    <table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">客户名称</td>
+			<td colspan="3">{$detail.customer}</td>
+			<td class="layui-td-gray-2">客户联系人</td>
+			<td>{$detail.contact}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">机会标题</td>
+			<td colspan="3">{$detail.title}</td>
+			<td class="layui-td-gray">发现时间</td>
+			<td>{$detail.discovery_time|date="Y-m-d"}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">销售阶段</td>
+			<td>{$detail.stage_name}</td>
+			<td class="layui-td-gray">预计金额</td>
+			<td>{$detail.expected_amount}</td>
+			<td class="layui-td-gray-2">预计签单时间</td>
+			<td>{$detail.expected_time|date="Y-m-d"}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top">需求描述</td>
+			<td colspan="5">{$detail.content}</td>
+		</tr>
+		<tr>        
+			<td class="layui-td-gray">归属人员</td>
+			<td>{$detail.belong_name}</td>
+			<td class="layui-td-gray">协助人员</td>
+			<td colspan="3">{$detail.assist_names}</td>
+		</tr>
+    </table>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/customer/view/contact/add.html b/app/customer/view/contact/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..51ea34440ecdbaf06ae201b7ff3e493fdc1fb306
--- /dev/null
+++ b/app/customer/view/contact/add.html
@@ -0,0 +1,136 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">新增联系人</h3>
+    <table class="layui-table layui-table-form">
+      <tr>
+        <td class="layui-td-gray">客户名称</td>
+        <td colspan="5">{$customer_name|default=''}</td>
+      </tr>
+      <tr>
+        <td class="layui-td-gray">姓名<font>*</font></td>
+        <td>
+          <input type="text" name="name" autocomplete="off" lay-verify="required" lay-reqText="请输入联系人姓名" placeholder="请输入联系人姓名" class="layui-input">
+        </td>
+		<td class="layui-td-gray">联系电话<font>*</font></td>
+        <td>
+			<input type="text" name="mobile" autocomplete="off" lay-verify="required" lay-reqText="请输入联系人电话" placeholder="请输入联系人电话" class="layui-input">
+        </td>
+		<td class="layui-td-gray">性别<font>*</font></td>
+        <td>
+			<input type="radio" name="sex" value="1" title="男">
+			<input type="radio" name="sex" value="2" title="女">
+        </td>
+	  </tr>
+	  <tr>
+		<td class="layui-td-gray">微 信 号</td>
+        <td>
+			<input type="text" name="wechat" autocomplete="off" placeholder="请输入联系人微信号" class="layui-input">
+        </td>
+		<td class="layui-td-gray">QQ号码</td>
+        <td>
+			<input type="text" name="qq" autocomplete="off" placeholder="请输入联系人QQ号码" class="layui-input">
+        </td>
+		<td class="layui-td-gray">电子邮箱</td>
+        <td>
+			<input type="text" name="email" autocomplete="off" placeholder="请输入联系人电子邮箱" class="layui-input">
+        </td>
+      </tr>
+	  <tr>
+		<td class="layui-td-gray">称谓</td>
+        <td>
+			<input type="text" name="nickname" autocomplete="off" placeholder="请输入联系人的称谓" class="layui-input">
+        </td>
+		<td class="layui-td-gray">部门</td>
+        <td>
+			<input type="text" name="department" autocomplete="off" placeholder="请输入联系人所在部门" class="layui-input">
+        </td>
+		<td class="layui-td-gray">职务</td>
+        <td>
+			<input type="text" name="position" autocomplete="off" placeholder="请输入联系人担任的职务" class="layui-input">
+        </td>
+      </tr>
+	  <tr>
+		<td class="layui-td-gray">生日</td>
+        <td><input type="text" name="birthday" readonly placeholder="请选择" class="layui-input tool-time"></td>
+		<td class="layui-td-gray">家庭住址</td>
+        <td colspan="3"><input type="text" name="address" placeholder="请输入联系人家庭住址" class="layui-input"></td>
+      </tr>
+	  <tr>
+		<td class="layui-td-gray">家庭成员</td>
+        <td colspan="5">
+				<table id="interfix" class="layui-table layui-table-min" style="margin:0;">
+					<tr>
+						<th width="150">成员姓名</th>
+						<th width="150">成员关系</th>
+						<th>备注信息</th>
+						<th width="60">操作</th>
+					</tr>
+					<tr class="tr-none">
+						<td colspan="4" style="padding:12px 0; text-align:center;">暂无数据</td>
+					</tr>
+				</table>
+				<div class="pt-2">
+					<button class="layui-btn layui-btn-sm" type="button" id="addInterfix">+ 家庭成员</button>
+				</div>
+		</td>
+      </tr>
+    </table>
+    <div class="pt-4">
+	   <input type="hidden" name="cid" value="{$customer_id}">
+      <button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+      <button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool;
+		
+		//添加家庭成员表格
+		$('#addInterfix').on('click',function(){
+			var html = '';
+			html += '<tr class="more_interfix">\
+						<td><input type="text" name="family_name[]" value="" placeholder="请输入" class="layui-input" lay-verify="required" lay-reqText="请完善成员姓名"></td>\
+						<td><input type="text" name="family_relations[]" value=""  placeholder="请输入，如:父子" class="layui-input" lay-verify="required" lay-reqText="请完善成员关系"></td>\
+						<td><input type="text" name="family_remarks[]" class="layui-input" value=""></td>\
+						<td><a class="layui-btn layui-btn-danger layui-btn-xs" data-id="0" lay-event="del">删除</a></td>\
+					</tr>';
+			$("#interfix").append(html).find('.tr-none').remove();
+			form.render();
+		});
+
+		$('#interfix').on('click', '[lay-event="del"]', function() {
+			$(this).parents(".more_interfix").remove();
+			if($('.more_interfix').length<1){
+				$("#interfix").append('<tr class="tr-none"><td colspan="4" style="padding:12px 0; text-align:center;">暂无数据</td></tr>')
+			}
+		});
+		
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			if(!data.field.sex){
+				layer.msg('请选择性别');
+				return false;
+			}
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000,'contactTable');
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/customer/contact/add", data.field, callback,clickbtn);
+			return false;
+		});
+
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/customer/view/contact/datalist.html b/app/customer/view/contact/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..7feae363e2024241b621dffc3829b49b08ecb797
--- /dev/null
+++ b/app/customer/view/contact/datalist.html
@@ -0,0 +1,103 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:300px">
+			<input type="text" name="keywords" placeholder="输入关键字，姓名/手机/邮箱" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_customer_contact" lay-filter="table_customer_contact"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div>
+  	<h3>客户联系人</h3>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus','oaPicker'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool;
+		
+		layui.contactTable = table.render({
+			elem: "#table_customer_contact"
+			,toolbar: "#toolbarDemo"
+			,url: "/customer/contact/datalist"
+			,page: true
+			,limit: 20
+			,is_excel: true
+			,cellMinWidth: 80
+			,height: 'full-112'
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'name',title: '姓名',align:'center',width:80}
+				,{field:'mobile',title: '手机号码', align:'center',width:100}
+				,{field:'email',title: '电子邮箱',width:200,templet: function(d){
+					return d.email==''?'-':d.email;
+				}}
+				,{field:'qq',title: 'QQ号码', align:'center',width:100,templet: function(d){
+					return d.qq==''?'-':d.qq;
+				}}
+				,{field:'wechat',title: '微信号', align:'center',width:100,templet: function(d){
+					return d.wechat==''?'-':d.wechat;
+				}}
+				,{field:'customer',title: '关联客户'}
+				,{field:'admin_name',title: '创建人',width:90,align:'center'}
+				,{field:'create_time', title: '创建时间',width:150,align:'center'}
+				,{width:120,fixed:'right',title: '操作', align:'center',ignoreExport:true,templet: function(d){
+					var html='';
+					var btn0='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">查看</a>';
+					var btn1='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn2='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
+					html = '<div class="layui-btn-group">'+btn0+btn1+btn2+'</div>';
+					if(d.admin_id == login_admin){
+						return html;
+					}
+					else{
+						return btn0;
+					}
+				}}
+			]]
+		});
+			
+		table.on('tool(table_customer_contact)',function (obj) {
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/customer/contact/view?id="+data.id);
+				return;
+			}
+			if (obj.event === 'edit') {
+				tool.side("/customer/contact/add?id="+data.id);
+				return;
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要删除该联系人吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/customer/contact/del", { id: data.id }, callback);
+					layer.close(index);
+				});
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/customer/view/contact/edit.html b/app/customer/view/contact/edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..e16eedbc5fc50b4b3132265e57c17f489e393fcc
--- /dev/null
+++ b/app/customer/view/contact/edit.html
@@ -0,0 +1,147 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">编辑联系人</h3>
+    <table class="layui-table layui-table-form">
+      <tr>
+        <td class="layui-td-gray">客户名称</td>
+        <td colspan="5">{$detail.customer}</td>
+      </tr>
+      <tr>
+        <td class="layui-td-gray">姓名<font>*</font></td>
+        <td>
+          <input type="text" name="name" value="{$detail.name}" autocomplete="off" lay-verify="required" lay-reqText="请输入联系人姓名" placeholder="请输入联系人姓名" class="layui-input">
+        </td>
+		<td class="layui-td-gray">联系电话<font>*</font></td>
+        <td>
+			<input type="text" name="mobile" value="{$detail.mobile}" autocomplete="off" lay-verify="required" lay-reqText="请输入联系人电话" placeholder="请输入联系人电话" class="layui-input">
+        </td>
+		<td class="layui-td-gray">性别<font>*</font></td>
+        <td>
+			<input type="radio" name="sex" value="1" title="男" {eq name="$detail.sex" value="1"} checked{/eq}>
+			<input type="radio" name="sex" value="2" title="女" {eq name="$detail.sex" value="2"} checked{/eq}>
+        </td>
+	  </tr>
+	  <tr>
+		<td class="layui-td-gray">微 信 号</td>
+        <td>
+			<input type="text" name="wechat" value="{$detail.wechat}" autocomplete="off" placeholder="请输入联系人微信号" class="layui-input">
+        </td>
+		<td class="layui-td-gray">QQ号码</td>
+        <td>
+			<input type="text" name="qq" value="{$detail.qq}" autocomplete="off" placeholder="请输入联系人QQ号码" class="layui-input">
+        </td>
+		<td class="layui-td-gray">电子邮箱</td>
+        <td>
+			<input type="text" name="email" value="{$detail.email}" autocomplete="off" placeholder="请输入联系人电子邮箱" class="layui-input">
+        </td>
+      </tr>
+	  <tr>
+		<td class="layui-td-gray">称谓</td>
+        <td>
+			<input type="text" name="nickname" value="{$detail.nickname}" autocomplete="off" placeholder="请输入联系人的称谓" class="layui-input">
+        </td>
+		<td class="layui-td-gray">部门</td>
+        <td>
+			<input type="text" name="department" value="{$detail.department}" autocomplete="off" placeholder="请输入联系人所在部门" class="layui-input">
+        </td>
+		<td class="layui-td-gray">职务</td>
+        <td>
+			<input type="text" name="position" value="{$detail.position}" autocomplete="off" placeholder="请输入联系人担任的职务" class="layui-input">
+        </td>
+      </tr>
+	  <tr>
+		<td class="layui-td-gray">生日</td>
+        <td><input type="text" name="birthday" value="{$detail.birthday}" readonly placeholder="请选择" class="layui-input tool-time"></td>
+		<td class="layui-td-gray">家庭住址</td>
+        <td colspan="3"><input type="text" value="{$detail.address}" name="address" placeholder="请输入联系人家庭住址" class="layui-input"></td>
+      </tr>
+	  <tr>
+		<td class="layui-td-gray">家庭成员</td>
+        <td colspan="5">
+			<table id="interfix" class="layui-table layui-table-min" style="margin:0;">
+				<tr>
+					<th width="150">成员姓名</th>
+					<th width="150">成员关系</th>
+					<th>备注信息</th>
+					<th width="60">操作</th>
+				</tr>
+				{notempty name="$detail.family" }
+				{volist name="$detail.family" id="vo"}
+				<tr class="more_interfix">
+					<td><input type="text" name="family_name[]" value="{$vo.family_name}" placeholder="请输入" class="layui-input" lay-verify="required" lay-reqText="请完善成员姓名"></td>
+					<td><input type="text" name="family_relations[]" value="{$vo.family_relations}"  placeholder="请输入，如:父子" class="layui-input" lay-verify="required" lay-reqText="请完善成员关系"></td>
+					<td><input type="text" name="family_remarks[]" class="layui-input" value="{$vo.family_remarks}"></td>
+					<td><a class="layui-btn layui-btn-danger layui-btn-xs" data-id="0" lay-event="del">删除</a></td>
+				</tr>
+				{/volist}
+				{else/}
+				<tr class="tr-none">
+					<td colspan="4" style="padding:12px 0; text-align:center;">暂无数据</td>
+				</tr>
+				{/notempty}
+			</table>
+			<div class="pt-2">
+				<button class="layui-btn layui-btn-sm" type="button" id="addInterfix">+ 家庭成员</button>
+			</div>
+		</td>
+      </tr>
+    </table>
+    <div class="pt-4">
+	   <input type="hidden" name="id" value="{$detail.id}">
+	   <input type="hidden" name="scene" value="edit">
+      <button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+      <button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool;
+		
+		//添加家庭成员表格
+		$('#addInterfix').on('click',function(){
+			var html = '';
+			html += '<tr class="more_interfix">\
+						<td><input type="text" name="family_name[]" value="" placeholder="请输入" class="layui-input" lay-verify="required" lay-reqText="请完善成员姓名"></td>\
+						<td><input type="text" name="family_relations[]" value=""  placeholder="请输入，如:父子" class="layui-input" lay-verify="required" lay-reqText="请完善成员关系"></td>\
+						<td><input type="text" name="family_remarks[]" class="layui-input" value=""></td>\
+						<td><a class="layui-btn layui-btn-danger layui-btn-xs" data-id="0" lay-event="del">删除</a></td>\
+					</tr>';
+			$("#interfix").append(html).find('.tr-none').remove();
+			form.render();
+		});
+
+		$('#interfix').on('click', '[lay-event="del"]', function() {
+			$(this).parents(".more_interfix").remove();
+			if($('.more_interfix').length<1){
+				$("#interfix").append('<tr class="tr-none"><td colspan="4" style="padding:12px 0; text-align:center;">暂无数据</td></tr>')
+			}
+		});
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			if(!data.field.sex){
+				layer.msg('请选择性别');
+				return false;
+			}
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000,'contactTable');
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/customer/contact/add", data.field, callback,clickbtn);
+			return false;
+		});
+
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/customer/view/contact/view.html b/app/customer/view/contact/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..0ed36e8dc49761464df0b4c2eb5884f7d030907e
--- /dev/null
+++ b/app/customer/view/contact/view.html
@@ -0,0 +1,84 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">联系人信息</h3>
+    <table class="layui-table layui-table-form">
+      <tr>
+        <td class="layui-td-gray">客户名称</td>
+        <td colspan="5">{$detail.customer}</td>
+      </tr>
+      <tr>
+        <td class="layui-td-gray">姓名</td>
+        <td>{$detail.name} </td>
+		<td class="layui-td-gray">联系电话</td>
+        <td>{$detail.mobile}</td>
+		<td class="layui-td-gray">性别</td>
+        <td>
+			{eq name="$detail.sex" value="1"}男{/eq}
+			{eq name="$detail.sex" value="2"}女{/eq}
+        </td>
+	  </tr>
+	  <tr>
+		<td class="layui-td-gray">微 信 号</td>
+        <td>{$detail.wechat}</td>
+		<td class="layui-td-gray">QQ号码</td>
+        <td>{$detail.qq}</td>
+		<td class="layui-td-gray">电子邮箱</td>
+        <td>{$detail.email}</td>
+      </tr>
+	  <tr>
+		<td class="layui-td-gray">称谓</td>
+        <td>{$detail.nickname}</td>
+		<td class="layui-td-gray">部门</td>
+        <td>{$detail.department}</td>
+		<td class="layui-td-gray">职务</td>
+        <td>{$detail.position}</td>
+      </tr>
+	  <tr>
+		<td class="layui-td-gray">生日</td>
+        <td>{$detail.birthday}</td>
+		<td class="layui-td-gray">家庭住址</td>
+        <td colspan="3">{$detail.address}</td>
+      </tr>
+	  <tr>
+		<td class="layui-td-gray">家庭成员</td>
+        <td colspan="5">
+			<table id="interfix" class="layui-table layui-table-min" style="margin:0;">
+				<tr>
+					<th width="150">成员姓名</th>
+					<th width="150">成员关系</th>
+					<th>备注信息</th>
+				</tr>
+				{notempty name="$detail.family" }
+				{volist name="$detail.family" id="vo"}
+				<tr class="more_interfix">
+					<td>{$vo.family_name}</td>
+					<td>{$vo.family_relations}</td>
+					<td>{$vo.family_remarks}</td>
+				</tr>
+				{/volist}
+				{else/}
+				<tr class="tr-none">
+					<td colspan="3" style="padding:12px 0; text-align:center;">暂无数据</td>
+				</tr>
+				{/notempty}
+			</table>
+		</td>
+      </tr>
+    </table>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+
+
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/customer/view/customer/add.html b/app/customer/view/customer/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..a59dab6140dce80fa3bb43804007a6451e8ecba8
--- /dev/null
+++ b/app/customer/view/customer/add.html
@@ -0,0 +1,151 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">新增客户信息</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">客户名称<font>*</font></td>
+			<td colspan="3"><input type="text" name="name" lay-verify="required" lay-reqText="请输入客户名称" autocomplete="off" placeholder="请输入客户名称" class="layui-input"></td>
+			<td class="layui-td-gray">客户来源<font>*</font></td>
+			<td>
+				<select name="source_id" lay-verify="required" lay-reqText="请选择客户来源">
+				<option value="">请选择客户来源</option>
+				{volist name=":get_base_data('customer_source')" id="v"}
+				<option value="{$v.id}">{$v.title}</option>
+				{/volist}
+			  </select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">联系地址<font>*</font></td>
+			<td><input type="text" name="address" autocomplete="off" lay-verify="required" lay-reqText="请输入客户联系地址" placeholder="请输入客户联系地址" class="layui-input"></td>
+			<td class="layui-td-gray">所属行业<font>*</font></td>
+			<td>
+			  <select name="industry_id" lay-verify="required" lay-reqText="请选择所属行业">
+				<option value="">请选择所属行业</option>
+				{volist name=":get_base_data('Industry')" id="v"}
+				<option value="{$v.id}">{$v.title}</option>
+				{/volist}
+			  </select>
+			</td>
+			<td class="layui-td-gray">客户等级<font>*</font></td>
+			<td>
+			  <select name="grade_id" lay-verify="required" lay-reqText="请选择客户等级">
+				<option value="">请选择客户等级</option>
+				{volist name=":get_base_data('customer_grade')" id="v"}
+				<option value="{$v.id}">{$v.title}</option>
+				{/volist}
+			  </select>
+			</td>
+		</tr>
+		{eq name="$sea" value="0"}
+		<tr>
+			<td class="layui-td-gray">归属员工</td>
+			<td>
+				<input type="text" name="belong_name" value="{$userinfo.name|default=''}" autocomplete="off" readonly placeholder="请选择客户归属人" class="layui-input">
+				<input type="hidden" name="belong_uid" value="{$userinfo.id|default=0}">
+				<input type="hidden" name="belong_did" value="{$userinfo.did|default=0}">
+			</td>
+			<td class="layui-td-gray">归属部门</td>
+			<td><input type="text" name="belong_department" value="{$userinfo.department|default=''}" autocomplete="off" readonly class="layui-input"></td>
+			<td class="layui-td-gray">共享员工</td>
+			<td>
+				<input type="text" name="share_names" autocomplete="off" readonly placeholder="请选择共享人员" class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="share_ids">
+			</td>
+		</tr>
+		{/eq}
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top">客户介绍<font>*</font></td>
+			<td colspan="5"><textarea name="content" placeholder="请输入客户介绍信息" lay-verify="required" lay-reqText="请输入客户介绍信息" class="layui-textarea"></textarea></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top">经营业务</td>
+			<td colspan="5"><textarea name="market" placeholder="请输入客户主要经营业务" class="layui-textarea"></textarea></td>
+		</tr>
+		<tr>
+			<td colspan="6"><strong>首要联系人</strong></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">联 系 人<font>*</font></td>
+			<td><input type="text" name="c_name" autocomplete="off" lay-verify="required" lay-reqText="请输入联系人姓名" placeholder="请输入联系人姓名" class="layui-input"></td>
+			<td class="layui-td-gray">联系电话<font>*</font></td>
+			<td><input type="text" name="c_mobile" autocomplete="off" lay-verify="required|phone" lay-reqText="请输入联系人电话" placeholder="请输入联系人电话" class="layui-input"></td>
+			<td class="layui-td-gray">性别<font>*</font></td>
+			<td>
+				<input type="radio" name="c_sex" value="1" title="男">
+				<input type="radio" name="c_sex" value="2" title="女" >
+			</td>
+	   </tr>
+	   <tr>
+			<td class="layui-td-gray">电子邮箱</td>
+			<td><input type="text" name="c_email" autocomplete="off" placeholder="请输入联系人电子邮箱" class="layui-input"></td>
+			<td class="layui-td-gray">微 信 号</td>
+			<td><input type="text" name="c_wechat" autocomplete="off" placeholder="请输入联系人微信号" class="layui-input"></td>
+			<td class="layui-td-gray">QQ号码</td>
+			<td><input type="text" name="c_qq" autocomplete="off" placeholder="请输入联系人QQ号码" class="layui-input"></td>
+		</tr>
+		<tr><td colspan="6"><strong>备注信息</strong></td></tr>
+		<tr>
+			<td colspan="6"><textarea name="remark" placeholder="请输入备注信息" class="layui-textarea"></textarea></td>
+		</tr>
+    </table>
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$detail.id|default=0}"/>
+		<input type="hidden" name="scene" value="add"/>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','oaPicker'];
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool,oaPicker = layui.oaPicker;
+		//选择归属人人弹窗
+		$('body').on('click','[name="belong_name"]',function () {
+			var ids=$('[name="belong_uid"]').val(),names=$('[name="belong_name"]').val();
+			oaPicker.employeeInit({
+				ids:ids,
+				names:names,
+				type:1,
+				callback:function(data){
+					let select_id=[],select_name=[],select_did=[],select_dname=[];
+					for(var a=0; a<data.length;a++){
+						select_id.push(data[a].id);
+						select_name.push(data[a].name);
+						select_did.push(data[a].did);
+						select_dname.push(data[a].department);
+					}
+					$('[name="belong_uid"]').val(select_id.join(','));
+					$('[name="belong_name"]').val(select_name.join(','));
+					$('[name="belong_did"]').val(select_did.join(','));
+					$('[name="belong_department"]').val(select_dname.join(','));
+				}
+			});
+		});	
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			if(!data.field.c_sex){
+				layer.msg('请完善首要联系人性别');
+				return false;
+			}
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/customer/customer/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/customer/view/customer/datalist.html b/app/customer/view/customer/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..ce8cedc4f824d37b547b02060b3ba73f4920bd45
--- /dev/null
+++ b/app/customer/view/customer/datalist.html
@@ -0,0 +1,243 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+.tab-1 .user-name,.tab-2 .user-name{display:none;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<div class="layui-card border-x border-t" style="margin-bottom:0; box-shadow:0 0 0 0 rgb(5 32 96 / 0%)">
+		<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
+			<ul class="layui-tab-title">
+				<li class="layui-this">全部客户</li>
+				<li>我的客户</li>
+				{gt name="$is_leader" value="0"}
+				<li>下属客户</li>
+				{/gt}
+				<li>共享客户</li>
+			</ul>
+		</div>
+	</div>
+	<form class="layui-form gg-form-bar border-x tab-0" id="barsearchform" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:172px;">
+			<input type="text" class="layui-input" data-range="~" placeholder="最近跟进日期" readonly name="follow_time" id="follow_time">
+		</div>
+		<div class="layui-input-inline" style="width:172px;">
+			<input type="text" class="layui-input" data-range="~" placeholder="下次跟进日期" readonly name="next_time" id="next_time">
+		</div>
+		<div class="layui-input-inline" style="width:100px;">
+			<select name="industry_id">
+				<option value="">所属行业</option>
+				{volist name=":get_base_data('Industry')" id="v"}
+				<option value="{$v.id}">{$v.title}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:100px;">
+			<select name="grade_id">
+				<option value="">客户等级</option>
+				{volist name=":get_base_data('customer_grade')" id="v"}
+				<option value="{$v.id}">{$v.title}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:100px;">
+			<select name="source_id">
+				<option value="">渠道来源</option>
+				{volist name=":get_base_data('customer_source')" id="v"}
+				<option value="{$v.id}">{$v.title}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:100px;">
+			<select name="customer_status">
+				<option value="">客户状态</option>
+				{volist name=":get_base_type_data('basic_customer',1)" id="v"}
+				<option value="{$v.id}">{$v.title}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:100px;">
+			<select name="intent_status">
+				<option value="">客户意向</option>
+				{volist name=":get_base_type_data('basic_customer',2)" id="v"}
+				<option value="{$v.id}">{$v.title}</option>
+				{/volist}
+			</select>
+		</div>
+		{gt name="$is_leader" value="0"}
+		<div class="layui-input-inline user-name" style="width:100px;">
+			<input type="text" name="username" placeholder="下属员工" class="layui-input picker-sub" readonly />
+			<input type="text" name="uid" value="" style="display:none" />	
+		</div>
+		{/gt}
+		<div class="layui-input-inline" style="width:188px;">
+			<input type="text" name="keywords" placeholder="输入关键字,客户名称" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:148px">
+			<input type="hidden" name="tab" value="0" />
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_customer" lay-filter="table_customer"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm tool-add" type="button" data-href="/customer/customer/add">+ 添加客户</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const is_leader = '{$is_leader}';
+	const moduleInit = ['tool','tablePlus','oaPicker','laydatePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool ,form = layui.form, element = layui.element,laydatePlus=layui.laydatePlus;
+		var follow_time = new laydatePlus({'target':'follow_time'});
+		var next_time = new laydatePlus({'target':'next_time'});
+		//tab切换
+		element.on('tab(tab)', function(data){
+			$('[name="tab"]').val(data.index);
+			$("#barsearchform")[0].reset();
+			$("#barsearchform").attr('class','layui-form gg-form-bar border-x tab-'+data.index);
+			layui.pageTable.reload({where:{tab:data.index},page:{curr:1}});
+			return false;
+		});
+		layui.pageTable = table.render({
+			elem: "#table_customer"
+			,title: '公海客户列表'
+			,toolbar: "#toolbarDemo"
+			,url: "/customer/customer/datalist"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 80
+			,height: 'full-152'
+			,cols:[
+				[ //表头
+					{
+						field: 'id',title: 'ID号',align: 'center',width: 80
+					},{
+						field: 'name',
+						title: '客户名称',
+						minWidth:300,
+						templet: function (d) {
+							return '<span class="layui-color-' + d.grade_id + '">『' + d.grade + '』</span>'+d.name
+						}
+					},
+					{
+						field: 'customer_status_name', 
+						title: '客户状态', 
+						align: 'center',
+						width: 100
+					},{
+						field: 'intent_status_name',
+						title: '客户意向',
+						align: 'center',
+						width: 100
+					},{
+						field: 'contact_name',
+						title: '联系人',
+						align: 'center',
+						width: 80
+					},{
+						field: 'contact_mobile',
+						title: '手机号码',
+						align: 'center',
+						width: 100
+					},{
+						field: 'follow_time',
+						title: '最近跟进时间',
+						align: 'center',
+						sort: true,
+						width: 120
+					},{
+						field: 'next_time',
+						title: '下次跟进时间',
+						align: 'center',
+						sort: true,
+						width: 120
+					},{
+						field: 'source',
+						title: '来源渠道',
+						align: 'center',
+						width: 100
+					}, {
+						field: 'industry',
+						title: '客户所属行业',
+						align: 'center',
+						width: 120
+					},{
+						field: 'belong_name',
+						title: '所属员工',
+						align: 'center',
+						width: 80
+					},{
+						field: 'belong_department',
+						title: '所属部门',
+						align: 'center',
+						width: 90
+					},{
+						field: 'create_time',
+						title: '创建时间',
+						align: 'center',
+						width: 150
+					},{
+						field: 'right',
+						fixed:'right',
+						title: '操作',
+						width: 142,
+						align: 'center',
+						templet: function (d) {
+							var html = '<div class="layui-btn-group">';
+							var btn0='<span class="layui-btn layui-btn-xs layui-bg-blue" lay-event="view">查看</span>';
+							var btn1='<span class="layui-btn layui-btn-xs" lay-event="edit">编辑</span>';
+							var btn2='<span class="layui-btn layui-btn-danger layui-btn-xs" lay-event="remove">移入公海</span>';
+							if(d.belong_uid == login_admin && d.is_lock==0){
+								return html+btn0+btn1+btn2+'</div>';
+							}
+							else{
+								return html+btn0+'</div>';
+							}
+						}						
+					}
+				]
+			]
+		});
+			
+		table.on('tool(table_customer)',function (obj) {
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/customer/customer/view?id="+data.id);
+				return;
+			}
+			if (obj.event === 'edit') {
+				tool.side("/customer/customer/add?id="+data.id);
+				return;
+			}
+			if (obj.event === 'remove') {
+				layer.confirm('确定把该客户移入公海吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/customer/index/to_sea", { id: data.id }, callback);
+					layer.close(index);
+				});
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/customer/view/customer/edit.html b/app/customer/view/customer/edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..bcfb7c3f1479bbea03ea24791c4dddca33eef12f
--- /dev/null
+++ b/app/customer/view/customer/edit.html
@@ -0,0 +1,145 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">编辑客户信息</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">客户名称<font>*</font></td>
+			<td colspan="3"><input type="text" name="name" lay-verify="required" value="{$detail.name}" lay-reqText="请输入客户名称" autocomplete="off" placeholder="请输入客户名称" class="layui-input"></td>
+			<td class="layui-td-gray">客户来源<font>*</font></td>
+			<td>
+				<select name="source_id" lay-verify="required" lay-reqText="请选择客户来源">
+				<option value="">请选择客户来源</option>
+				{volist name=":get_base_data('customer_source')" id="v"}
+				<option value="{$v.id}" {eq name="$v.id" value="$detail.source_id"} selected{/eq}>{$v.title}</option>
+				{/volist}
+			  </select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">联系地址<font>*</font></td>
+			<td colspan="3"><input type="text" name="address" value="{$detail.address}" autocomplete="off" lay-verify="required" lay-reqText="请输入客户联系地址" placeholder="请输入客户联系地址" class="layui-input"></td>
+			<td class="layui-td-gray">所属行业<font>*</font></td>
+			<td>
+			  <select name="industry_id" lay-verify="required" lay-reqText="请选择所属行业">
+				<option value="">请选择所属行业</option>
+				{volist name=":get_base_data('Industry')" id="v"}
+				<option value="{$v.id}" {eq name="$v.id" value="$detail.industry_id"} selected{/eq}>{$v.title}</option>
+				{/volist}
+			  </select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">客户等级<font>*</font></td>
+			<td>
+			  <select name="grade_id" lay-verify="required" lay-reqText="请选择客户等级">
+				<option value="">请选择客户等级</option>
+				{volist name=":get_base_data('customer_grade')" id="v"}
+				<option value="{$v.id}" {eq name="$v.id" value="$detail.grade_id"} selected{/eq}>{$v.title}</option>
+				{/volist}
+			  </select>
+			</td>
+			<td class="layui-td-gray">客户状态<font>*</font></td>
+			<td>
+			  <select name="customer_status" lay-verify="required" lay-reqText="请选择客户状态">
+				<option value="">请选择客户当前状态</option>
+				{volist name=":get_base_type_data('basic_customer',1)" id="v"}
+				<option value="{$v.id}" {eq name="$v.id" value="$detail.customer_status"} selected{/eq}>{$v.title}</option>
+				{/volist}
+			  </select>
+			</td>
+			<td class="layui-td-gray">客户意向<font>*</font></td>
+			<td>
+			  <select name="intent_status" lay-verify="required" lay-reqText="请选择客户意向">
+				<option value="">请选择客户意向</option>
+				{volist name=":get_base_type_data('basic_customer',2)" id="v"}
+				<option value="{$v.id}" {eq name="$v.id" value="$detail.intent_status"} selected{/eq}>{$v.title}</option>
+				{/volist}
+			  </select>
+			</td>
+		  </tr>
+		  {eq name="$sea" value="0"}
+		  <tr>
+				<td class="layui-td-gray">归属员工</td>
+				<td>
+					<input type="text" name="belong_name" value="{$detail.belong_name|default=''}" autocomplete="off" readonly placeholder="请选择客户归属人" class="layui-input">
+					<input type="hidden" name="belong_uid" value="{$detail.belong_uid|default=0}">
+					<input type="hidden" name="belong_did" value="{$detail.belong_did|default=0}">
+				</td>
+				<td class="layui-td-gray">归属部门</td>
+				<td><input type="text" name="belong_department" value="{$detail.belong_department|default=''}" autocomplete="off" readonly class="layui-input"></td>
+				<td class="layui-td-gray">共享员工</td>
+				 <td colspan="3">
+					<input type="text" name="share_names" value="{$detail.share_names|default=''}" autocomplete="off" readonly placeholder="请选择共享人员" class="layui-input picker-admin" data-type="2">
+					<input type="hidden" name="share_ids" value="{$detail.share_ids}">
+				</td>
+		  </tr>
+		  {/eq}
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top">客户介绍<font>*</font></td>
+			<td colspan="5"><textarea name="content" placeholder="请输入客户介绍信息" lay-verify="required" lay-reqText="请输入客户介绍信息" class="layui-textarea">{$detail.content|default=""}</textarea></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top">经营业务</td>
+			<td colspan="5"><textarea name="market" placeholder="请输入客户主要经营业务" class="layui-textarea">{$detail.market|default=""}</textarea></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top">备注信息</td>
+			<td colspan="5"><textarea name="remark" placeholder="请输入备注信息" class="layui-textarea">{$detail.remark|default=""}</textarea></td>
+		</tr>
+    </table>
+    <div class="pt-4">
+	   <input type="hidden" name="id" value="{$detail.id}">
+	   <input type="hidden" name="scene" value="edit"/>
+      <button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+      <button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+{block name="copyright"}{/block}
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool','oaPicker'];
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool,oaPicker = layui.oaPicker;
+		//选择归属人人弹窗
+		$('body').on('click','[name="belong_name"]',function () {
+			var ids=$('[name="belong_uid"]').val(),names=$('[name="belong_name"]').val();
+			oaPicker.employeeInit({
+				ids:ids,
+				names:names,
+				type:1,
+				callback:function(data){
+					let select_id=[],select_name=[],select_did=[],select_dname=[];
+					for(var a=0; a<data.length;a++){
+						select_id.push(data[a].id);
+						select_name.push(data[a].name);
+						select_did.push(data[a].did);
+						select_dname.push(data[a].department);
+					}
+					$('[name="belong_uid"]').val(select_id.join(','));
+					$('[name="belong_name"]').val(select_name.join(','));
+					$('[name="belong_did"]').val(select_did.join(','));
+					$('[name="belong_department"]').val(select_dname.join(','));
+				}
+			});
+		});	
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/customer/customer/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/customer/view/customer/view.html b/app/customer/view/customer/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..e96efbdc1979a5c62583c6f2633acb9eef17dd8a
--- /dev/null
+++ b/app/customer/view/customer/view.html
@@ -0,0 +1,202 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+.layui-tab-card1{border:0}
+.layui-tab-title .layui-this{background-color:#fff;}
+.layui-tab-card,.layui-card{box-shadow:0 0 0 0 rgb(0 0 0 / 10%); border-radius:0; border-top:none;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<div class="layui-form p-page">
+	<h3 class="pb-3">
+	客户详情	
+	{eq name="$detail.is_lock" value="1"}
+		<div class="layui-input-inline"><button type="button" class="layui-btn layui-btn-warm layui-btn-xs" id="lock" title="去解锁" data-lock="0"><i class="iconfont icon-suozhu"></i></button></div>
+	{else/}
+		<div class="layui-input-inline"><button type="button" class="layui-btn layui-btn-xs" id="lock" title="去锁定" data-lock="1"><i class="iconfont icon-jiesuo"></i></button></div>
+	{/eq}
+	</h3>
+	<table class="layui-table layui-table-form">
+	  <tr>
+		<td class="layui-td-gray">客户名称</td>
+		<td colspan="3">{$detail.name}</td>
+		<td class="layui-td-gray">录入人</td>
+		<td>{$detail.admin_name}</td>
+	  </tr>
+	  <tr>
+		<td class="layui-td-gray">联系地址</td>
+		<td colspan="3">{$detail.address}</td>
+		<td class="layui-td-gray">录入时间</td>
+		<td>{$detail.create_time}</td>
+	  </tr>
+	  {gt name="$detail.belong_uid" value="0"}
+	  <tr>
+		<td class="layui-td-gray">归属员工</td>
+		<td>{$detail.belong_name}</td>
+		<td class="layui-td-gray">归属部门</td>
+		<td>{$detail.belong_department}</td>
+		<td class="layui-td-gray">共享员工</td>
+		<td>{$detail.share_names|default="-"}</td>
+	  </tr>
+	  {/gt}
+	  <tr>
+		<td class="layui-td-gray">客户等级</td>
+		<td>{$detail.grade}</td>
+		<td class="layui-td-gray">所属行业</td>
+		<td>{$detail.industry}</td>
+		<td class="layui-td-gray-2">最后更新时间</td>
+		<td>{$detail.update_time}</td>
+	  </tr>
+	  <tr>
+		<td class="layui-td-gray">客户来源</td>
+		<td>{$detail.source}</td>
+		<td class="layui-td-gray">客户状态</td>
+		<td>{$detail.customer_status_name}</td>
+		<td class="layui-td-gray">客户意向</td>
+		<td>{$detail.intent_status_name}</td>
+	  </tr>
+	  <tr>
+		<td class="layui-td-gray">
+			<div>相关附件</div>
+			<div><button type="button" class="layui-btn layui-btn-xs" id="uploadBtn">附件上传</button></div>
+		</td>
+		<td colspan="5" style="line-height:inherit">
+			<div class="row" id="uploadBox">
+			{volist name="$detail.file_array" id="vo"}
+			<div class="layui-col-md4" id="file_{$vo.id}">{:file_card($vo)}</div>
+			{/volist}
+			</div>
+		</td>
+	   </tr>
+	  <tr>
+		<td colspan="6" style="background-color:#FAFAFA;"><strong>客户介绍</strong></td>
+	  </tr>
+	  <tr>
+		<td colspan="6">{$detail.content|default=""}</td>
+	  </tr>
+	  {notempty name="$detail.market"}
+	  <tr>
+		<td colspan="6" style="background-color:#FAFAFA;"><strong>经营业务</strong></td>
+	  </tr>
+	  <tr>
+		<td colspan="6">{$detail.market}</td>
+	  </tr>
+	  {/notempty}
+	  {notempty name="$detail.remark"}
+	  <tr>
+		<td colspan="6" style="background-color:#FAFAFA;"><strong>备注信息</strong></td>
+	  </tr>
+	  <tr>
+		<td colspan="6">{$detail.remark}</td>
+	  </tr>
+	  {/notempty}
+	</table>
+	<div class="layui-tab layui-tab-card" style="margin:0; background-color:#fff;" lay-filter="customer" id="customerTab">
+		<ul class="layui-tab-title">
+			<li class="layui-this" data-load="true">跟进记录</li>
+			<li>线索机会</li>
+			<li>联 系 人</li>
+			<li>操作记录</li>
+		</ul>
+		<div class="layui-tab-content" style="padding:0;">
+			<div class="layui-tab-item layui-show">
+				{include file="/customer/view_trace" /}
+			</div>
+			<div class="layui-tab-item">
+				{include file="/customer/view_chance" /}
+			</div>
+			<div class="layui-tab-item">
+				{include file="/customer/view_contact" /}
+			</div>
+			<div class="layui-tab-item">
+				{include file="/customer/view_log" /}
+			</div>
+		</div>
+	</div>
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const customer_id = '{$detail.id}';
+const moduleInit = ['tool','oaPicker','uploadPlus','oaEdit'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool, upload = layui.upload,element = layui.element,uploadPlus = layui.uploadPlus;	
+		trace();
+		element.on('tab(customer)', function(data){
+			let index = data.index;
+			if(index == 1){
+				chance();	
+			}
+			if(index == 2){
+				contact();	
+			}
+			if(index == 3){
+				log();	
+			}
+		});
+		//客户加锁
+		$('#lock').on('click',function () {
+			let is_lock=$(this).data('lock');
+			let tips = '确定要锁住该客户信息吗？锁住后该客户的基本信息不能编辑。';
+			if(is_lock==0){
+				tips = '确定要解锁该客户信息吗？';
+			}
+			layer.confirm(tips, {
+				icon: 3,
+				title: '提示'
+			}, function(index) {
+				let callback = function (e) {
+					layer.msg(e.msg);
+					if (e.code == 0) {	
+						parent.layui.pageTable.reload();
+						setTimeout(function(){
+							location.reload();
+						},1000);						
+					}
+				}
+				tool.post("/customer/api/customer_lock", {id: customer_id,is_lock:is_lock}, callback);
+				layer.close(index);
+			});
+		})
+		var attachment = new uploadPlus({
+			"attachment":{
+				"type":1,//0ajax多文件模式，1ajax单文件单记录模式
+				"uidDelete":true,//是否开启只有上传人自己才能删除自己的附件
+				"ajaxSave":function(res){
+					$.ajax({
+						url: "/customer/api/add_file",
+						type:'post',
+						data:{
+							'customer_id':customer_id,
+							'file_id':res.data.id,
+							'file_name':res.data.name
+						},
+						success: function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								setTimeout(function(){
+									location.reload();
+								},1000)							
+							}
+						}
+					})
+				},
+				"ajaxDelete":function(file_id){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {						
+							$('#file_' + file_id).remove();
+						}
+					}
+					tool.delete("/customer/api/delete_file", {id: file_id}, callback);
+				}
+			}
+		})		
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/customer/view/customer/view_chance.html b/app/customer/view/customer/view_chance.html
new file mode 100644
index 0000000000000000000000000000000000000000..a8b9e69c8deb9f493c744d9bc707a7b028655ca4
--- /dev/null
+++ b/app/customer/view/customer/view_chance.html
@@ -0,0 +1,70 @@
+<div class="p-3">
+	<button class="layui-btn layui-btn-sm add-chance">+ 新建线索机会</button>
+</div>
+<div>
+	<table class="layui-hide" id="chance" lay-filter="chance"></table>
+</div>
+<script>
+function chance(){
+	if($('#customerTab').find('li').eq(4).data('load') =='true'){
+		return false;
+	}
+	$('#customerTab').find('li').eq(4).data('load','true');
+	let tool = layui.tool, table = layui.table;
+	//项目任务
+	layui.chanceTable = table.render({
+		elem: '#chance',
+		title: '线索机会列表',
+		cellMinWidth:80,
+		url: "/customer/api/get_chance",
+		where:{'cid':customer_id},
+		page: true, //开启分页
+		limit: 20,
+		cols:  [[
+			{field: 'id', title: '序号', width: 80, align: 'center'}
+			,{field:'belong_name',title: '归属人',align:'center',width: 80}
+			,{field:'title',title: '机会主题'}
+			,{field:'stage_name',title: '当前阶段',width: 90, align: 'center'}
+			,{field:'discovery_time',title: '发现时间',align:'center',width: 90}
+			,{ field: 'expected_time', title: '预计签单时间', width: 100, align: 'center'}
+			,{ field: 'expected_amount', title: '预计签单金额', width: 100, align: 'center'}
+			,{fixed:'right',width:132,title: '操作', align:'center',templet: function(d){
+					var html = '<div class="layui-btn-group">';
+					var btn0='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</a>';
+					var btn1='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn2='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
+					return html+btn0+btn1+btn2+'</div>';
+			}}			
+		]]
+	});
+	$('body').on('click','.add-chance',function(){
+		tool.side('/customer/chance/add?cid='+customer_id);
+	});
+	
+	table.on('tool(chance)', function(obj){
+		var data = obj.data; //获得当前行数据
+		var layEvent = obj.event;		 
+		if(layEvent === 'edit'){ //编辑
+			let url = '/customer/chance/add/id/'+data.id;
+			tool.side(url);
+		}
+		if(layEvent === 'view'){ //查看
+			let url = '/customer/chance/view/id/'+data.id;
+			tool.side(url);
+		}
+		if(layEvent === 'del'){ //删除
+			layer.confirm('确定要删除该线索机会吗?', {icon: 3, title:'提示'}, function(index){
+				let callback = function (e) {
+					layer.msg(e.msg);
+					if (e.code == 0) {
+						layui.chanceTable.reload();
+					}
+				}
+				tool.delete("/customer/chance/del",{"id":data.id},callback);
+				layer.close(index);
+			});
+		}
+		return false;
+	})
+}
+</script>
\ No newline at end of file
diff --git a/app/customer/view/customer/view_contact.html b/app/customer/view/customer/view_contact.html
new file mode 100644
index 0000000000000000000000000000000000000000..d01a4ee45b15ed0aff48fd823319dc7320f9fc4b
--- /dev/null
+++ b/app/customer/view/customer/view_contact.html
@@ -0,0 +1,102 @@
+<div class="p-3">
+	<button class="layui-btn layui-btn-sm add-contact">+ 新增联系人</button>
+</div>
+<div>
+	<table class="layui-hide" id="contact" lay-filter="contact"></table>
+</div>
+<script>
+function contact(){
+	if($('#customerTab').find('li').eq(2).data('load') =='true'){
+		return false;
+	}
+	$('#customerTab').find('li').eq(2).data('load','true');
+	let tool = layui.tool, table = layui.table;
+	//项目任务
+	layui.contactTable = table.render({
+		elem: '#contact',
+		title: '联系人列表',
+		cellMinWidth:80,
+		url: "/customer/api/get_contact",
+		where:{'cid':customer_id},
+		page: true, //开启分页
+		limit: 20,
+		cols: [[
+			{field:'id',width:80, title: 'ID号', align:'center'}
+			,{field:'name',width:100,title: '联系人姓名', align:'center'}
+			,{field:'status', title: '性别',width:80,align:'center',templet: function(d){
+				var html='未知';
+				var html1='<span class="green">男</span>';
+				var html2='<span class="blue">女</span>';
+				if(d.sex==1){
+					return html1;
+				}
+				if(d.sex==2){
+					return html2;
+				}
+				else{
+					return html;
+				}
+			}}
+			,{field:'mobile',width:100,title: '手机号码', align:'center'}
+			,{field:'email',title: '电子邮箱'}
+			,{field:'wechat',width:100,title: '微信号码', align:'center'}
+			,{field:'qq',width:100,title: 'QQ号码', align:'center'}
+			,{field:'position',width:120,title: '担任职位', align:'center'}
+			,{field:'is_default',width:90,title: '首要联系人', align:'center',templet: function(d){
+				if(d.is_default==1){
+					return '<span class="green layui-icon layui-icon-success"></span>';
+				}
+				else{
+					return '<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="set" title="设为首要联系人">设置</a>';
+				}				
+			}}
+			,{fixed:'right',width:120,title: '操作', align:'center',templet: function(d){
+				var html = '<div class="layui-btn-group">';
+				var btn='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
+				var btn1='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">查看</a>';
+				var btn2='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
+				return html+btn+btn1+btn2+'</div>';			
+			}}
+		]]
+	});
+	$('body').on('click','.add-contact',function(){
+		tool.side('/customer/contact/add?cid='+customer_id);
+	});
+	
+	table.on('tool(contact)', function(obj){
+		var data = obj.data; //获得当前行数据
+		var layEvent = obj.event;		 
+		if(layEvent === 'edit'){ //编辑
+			tool.side('/customer/contact/add/id/'+data.id);
+		}
+		if(layEvent === 'view'){ //编辑
+			tool.side('/customer/contact/view/id/'+data.id);
+		}
+		if(layEvent === 'set'){ //查看
+			layer.confirm('确定要设置该联系人为首要联系人吗?', {icon: 3, title:'提示'}, function(index){
+				let callback = function (e) {
+					layer.msg(e.msg);
+					if (e.code == 0) {
+						layui.contactTable.reload();
+					}
+				}
+				tool.delete("/customer/api/set_contact",{"id":data.id},callback);
+				layer.close(index);
+			});
+		}
+		if(layEvent === 'del'){ //删除
+			layer.confirm('确定要删除该联系人吗?', {icon: 3, title:'提示'}, function(index){
+				let callback = function (e) {
+					layer.msg(e.msg);
+					if (e.code == 0) {
+						layui.contactTable.reload();
+					}
+				}
+				tool.delete("/customer/contact/del",{"id":data.id},callback);
+				layer.close(index);
+			});
+		}
+		return false;
+	})
+}
+</script>
\ No newline at end of file
diff --git a/app/customer/view/customer/view_log.html b/app/customer/view/customer/view_log.html
new file mode 100644
index 0000000000000000000000000000000000000000..6573445198dc84fd6d5aa4a8ca329b9117ed5851
--- /dev/null
+++ b/app/customer/view/customer/view_log.html
@@ -0,0 +1,9 @@
+<div>
+	<div id="logList" class="log-timeline p-3"></div>
+</div>
+<script>	
+function log(){
+	let oaEdit = layui.oaEdit;	
+	oaEdit.log('logList','Customer',customer_id);
+}
+</script>	
\ No newline at end of file
diff --git a/app/customer/view/customer/view_trace.html b/app/customer/view/customer/view_trace.html
new file mode 100644
index 0000000000000000000000000000000000000000..7464eb1bea7f423900f3ed9a062a7c86064851dd
--- /dev/null
+++ b/app/customer/view/customer/view_trace.html
@@ -0,0 +1,72 @@
+<div class="p-3">
+   <span class="layui-btn layui-btn-sm add-trace">+ 新建跟进记录</span>
+</div>
+<div>
+	<table class="layui-hide" id="trace" lay-filter="trace"></table>
+</div>
+<script>
+function trace(){
+	if($('#customerTab').find('li').eq(0).data('load') =='true'){
+		return false;
+	}
+	$('#customerTab').find('li').eq(0).data('load','true');
+	let tool = layui.tool, table = layui.table;
+	layui.traceTable = table.render({
+		elem: '#trace',
+		title: '跟进记录列表',
+		cellMinWidth:80,
+		url: "/customer/api/get_trace",
+		where:{'cid':customer_id},
+		page: true, //开启分页
+		limit: 20,
+		cols:  [[
+			{field: 'id', title: 'ID号', width: 80, align: 'center'}
+			,{field:'admin_name',title: '跟进人',align:'center',width: 80}
+			,{field:'follow_time',title: '跟进时间',align:'center',width: 130}
+			, { field: 'stage_name', title: '当前阶段', width: 80, align: 'center'}
+			,{field:'type_name',title: '跟进方式',width: 80, align: 'center'}
+			,{field:'chance',title: '销售机会',minWidth:200}
+			,{field:'content',title: '沟通内容'}
+			,{field:'next_time',title: '下次跟进时间', align:'center',width: 130}	
+			,{fixed:'right',width:120,title: '操作', align:'center',templet: function(d){
+					var html = '<div class="layui-btn-group">';
+					var btn0='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</a>';
+					var btn1='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn2='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
+					return html+btn0+btn1+btn2+'</div>';
+			}}			
+		]]
+	});
+	
+	$('body').on('click','.add-trace',function(){
+		tool.side('/customer/trace/add?cid='+customer_id);
+	});
+	
+	table.on('tool(trace)', function(obj){
+		var data = obj.data; //获得当前行数据
+		var layEvent = obj.event;		 
+		if(layEvent === 'edit'){ //编辑
+			let url = '/customer/trace/add/id/'+data.id;
+			tool.side(url);
+		}
+		if(layEvent === 'view'){ //查看
+			let url = '/customer/trace/view/id/'+data.id;
+			tool.side(url);
+		}
+		if(layEvent === 'del'){ //删除
+			layer.confirm('确定要删除该跟进记录吗?', {icon: 3, title:'提示'}, function(index){
+				let callback = function (e) {
+					layer.msg(e.msg);
+					if (e.code == 0) {
+						layui.traceTable.reload();
+					}
+				}
+				tool.delete("/customer/trace/del",{"id":data.id},callback);
+				layer.close(index);
+				
+			});
+		}
+		return false;
+	})
+}
+</script>
\ No newline at end of file
diff --git a/app/customer/view/grade/add.html b/app/customer/view/grade/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..ff53f455faa05fd2476897fed6362988579ca8bb
--- /dev/null
+++ b/app/customer/view/grade/add.html
@@ -0,0 +1,49 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">客户等级</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">客户等级名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入客户等级名称" lay-reqText="请输入客户等级名称"class="layui-input" value="{$detail.title|default=''}">
+			</td>
+			<td class="layui-td-gray">排序</td>
+			<td>
+				<input type="text" name="sort" placeholder="请输入排序，数字" autocomplete="off" class="layui-input" value="{$detail.sort|default=''}">
+			</td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$detail.id|default=0}"/>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool'];
+
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/customer/grade/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/customer/view/grade/datalist.html b/app/customer/view/grade/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..0264dba43668a805c929b972e37eccbd6732e6b6
--- /dev/null
+++ b/app/customer/view/grade/datalist.html
@@ -0,0 +1,124 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<table class="layui-hide" id="table_customer_grade" lay-filter="table_customer_grade"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm add-new" type="button">+ 添加客户等级</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool;
+		
+		layui.pageTable = table.render({
+			elem: "#table_customer_grade"
+			,toolbar: '#toolbarDemo'
+			,url: "/customer/grade/datalist"
+			,page: false
+			,limit: 999
+			,cellMinWidth: 80
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',title: '类型名称'}
+				,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+					var html1='<span class="green">正常</span>';
+					var html2='<span class="yellow">禁用</span>';
+					if(d.status==1){
+						return html1;
+					}
+					else{
+						return html2;
+					}
+				}}
+				,{width:100,title: '操作', align:'center',ignoreExport:true,templet: function(d){
+					var html='';
+					var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+					if(d.status==1){
+						html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+					}
+					else{
+						html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+					}
+					return html;
+				}}
+			]]
+		});
+			
+		table.on('tool(table_customer_grade)',function (obj) {
+			if(obj.event === 'edit'){					
+				add_cate(obj.data.id,obj.data.title);
+			}
+			if(obj.event === 'disable'){
+				layer.confirm('确定要禁用该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/customer/grade/set", {id:obj.data.id,status: 0}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'open'){
+				layer.confirm('确定要启用该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/customer/grade/set", {id:obj.data.id,status:1}, callback);
+					layer.close(index);
+				});
+			}
+		});
+		
+		$('body').on('click','.add-new',function(){
+			add_cate(0,'');	
+		});
+		
+		function add_cate(id,val){
+			var title = '新增类型';
+			if(id>0){
+				title = '编辑类型';
+			}
+			layer.prompt({
+				title: title,
+				value: val,
+				yes: function(index, layero) {
+					// 获取文本框输入的值
+					var value = layero.find(".layui-layer-input").val();
+					if (value) {
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();				
+							}
+						}
+						tool.post("/customer/grade/add", {id: id,title: value}, callback);
+						layer.close(index);
+					} else {
+						layer.msg('请填写类型名称');
+					}
+				}
+			})
+		}
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/customer/view/grade/index.html b/app/customer/view/grade/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..9c654baaa3f0e21fa721323de985e93226b9cf93
--- /dev/null
+++ b/app/customer/view/grade/index.html
@@ -0,0 +1,121 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+    <table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-normal layui-btn-sm addNew" type="button">+ 添加客户等级</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool, form = layui.form;
+		layui.pageTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,defaultToolbar: false
+			,title:'客户等级列表'
+			,url: "/customer/grade/index"
+			,page: false
+			,cellMinWidth: 80
+			,cols: [[
+					{field:'id',width:80, title: 'ID号', align:'center'}
+					,{field:'title',title: '等级名称'}
+					,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+						var html1='<span class="green">正常</span>';
+						var html2='<span class="yellow">禁用</span>';
+						if(d.status==1){
+							return html1;
+						}
+						else{
+							return html2;
+						}
+					}}
+					,{width:100,title: '操作', align:'center',templet: function(d){
+						var html='';
+						var btn='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
+						var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+						var btn2='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="open">启用</a>';
+						if(d.status==1){
+							html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+						}
+						else{
+							html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+						}
+						return html;
+					}}
+				]]
+			});
+			
+			table.on('tool(test)',function (obj) {
+				if(obj.event === 'edit'){					
+					addExpense(obj.data.id,obj.data.title);
+				}
+				if(obj.event === 'disable'){
+					layer.confirm('确定要禁用该等级吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/customer/grade/grade_check", { id: obj.data.id,status: 0,title: obj.data.title}, callback);
+						layer.close(index);
+					});
+				}
+				if(obj.event === 'open'){
+					layer.confirm('确定要启用该等级吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/customer/grade/grade_check", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
+						layer.close(index);
+					});
+				}
+			});
+			
+			$('body').on('click','.addNew',function(){
+				addExpense(0,'');	
+			});
+			
+			function addExpense(id,val){
+				var title = '新增等级';
+				if(id>0){
+					title = '编辑等级';
+				}
+				layer.prompt({
+					title: title,
+					value: val,
+					yes: function(index, layero) {
+						// 获取文本框输入的值
+						var value = layero.find(".layui-layer-input").val();
+						if (value) {
+							let callback = function (e) {
+								layer.msg(e.msg);
+								if (e.code == 0) {
+									layui.pageTable.reload();				
+								}
+							}
+							tool.post("/customer/grade/grade_add", {id: id,title: value}, callback);
+							layer.close(index);
+						} else {
+							layer.msg('请填写等级名称');
+						}
+					}
+				})
+			}
+		}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/customer/view/grade/view.html b/app/customer/view/grade/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..eb8c7ff4d7bd1415b49d1d03f216e7bd3d412dd9
--- /dev/null
+++ b/app/customer/view/grade/view.html
@@ -0,0 +1,16 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<h3 class="pb-3">客户等级详情</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">客户等级名称</td>
+			<td>{$detail.title|default=''}"></td>
+			<td class="layui-td-gray">排序</td>
+			<td>{$detail.sort|default=0}</td>
+		</tr>
+	</table>
+</div>
+{/block}
+<!-- /主体 -->
\ No newline at end of file
diff --git a/app/customer/view/index/rush.html b/app/customer/view/index/rush.html
new file mode 100644
index 0000000000000000000000000000000000000000..f3c9f271b64130070b3f175bffe8bd1c42800fc6
--- /dev/null
+++ b/app/customer/view/index/rush.html
@@ -0,0 +1,127 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<div class="layui-row gg-form-bar border-x border-t">
+		<div class="layui-input-inline"><button class="layui-btn layui-btn-sm" lay-submit="" lay-filter="webform">换一批客户</button></div>
+		<div class="layui-input-inline red">每点击一次随机获取20个公海客户的信息，每天最多可抢<strong class="mx-1">{$max_num|default="0"}</strong>个客户，你今天已抢了<strong class="mx-1" id="count">{$count}</strong>个客户</div>
+    </div>
+	<table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool ,form = layui.form;
+		layui.pageTable = table.render({
+			elem: '#test',
+			title: '抢客宝列表',
+			toolbar: false,
+			defaultToolbar: false,
+			url: "/customer/index/rush", //数据接口
+			cellMinWidth: 80,
+			page: false, //开启分页
+			limit: 20,
+			height: 'full-112',
+			cols: [
+				[ //表头
+					{
+						field: 'id',title: 'ID号',align: 'center',width: 80
+					},{
+						field: 'name',
+						title: '客户名称',
+						minWidth:240,
+						templet: '<div><a data-href="/customer/customer/view/id/{{d.id}}.html" class="side-a">{{d.name}}</a></div>'
+					},{
+						field: 'contact_name',
+						title: '联系人',
+						align: 'center',
+						width: 80
+					},{
+						field: 'contact_mobile',
+						title: '手机号码',
+						align: 'center',
+						width: 100
+					},{
+						field: 'contact_email',
+						title: '电子邮箱',
+						width: 200
+					},{
+						field: 'grade',
+						title: '客户等级',
+						align: 'center',
+						width: 100
+					},{
+						field: 'source',
+						title: '来源渠道',
+						align: 'center',
+						width: 100
+					},{
+						field: 'industry',
+						title: '所属行业',
+						align: 'center',
+						width: 120
+					},{
+						field: 'create_time',
+						title: '创建时间',
+						align: 'center',
+						width: 150
+					},{
+						field: 'update_time',
+						title: '最后编辑时间',
+						align: 'center',
+						width: 150
+					},{
+						field: 'right',
+						fixed:'right',
+						title: '操作',
+						width: 80,
+						align: 'center',
+						templet: function (d) {
+							if(login_admin==1){
+								return '-';
+							}
+							else{
+								return '<span class="layui-btn layui-btn-xs" lay-event="get">领取客户</span>';
+							}
+						}						
+					}
+				]
+			]
+		});
+		
+		//监听行工具事件
+		table.on('tool(test)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'get') {
+				layer.confirm('确定要获取该客户?', {
+					icon: 3,
+					title: '提示'
+				}, function(index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+							let count =$('#count').text();
+							$('#count').html(++count);
+						}
+					}
+					tool.post("/customer/index/to_get", {id: data.id}, callback);
+					layer.close(index);
+				});
+			}
+		});
+
+		//监听搜索提交
+		form.on('submit(webform)', function(data) {
+			layui.pageTable.reload();
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
diff --git a/app/customer/view/index/sea.html b/app/customer/view/index/sea.html
new file mode 100644
index 0000000000000000000000000000000000000000..4fd061d6ac8b8430d897b38fab159197e1f11f48
--- /dev/null
+++ b/app/customer/view/index/sea.html
@@ -0,0 +1,238 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+  <style>	
+	.gougu-upload-files{background-color: #ffffff; border:1px solid #e4e7ed;color: #c0c4cc;cursor: not-allowed; padding:0 12px; width:180px; box-sizing: border-box; display: inline-block; font-size: inherit; height: 38px; line-height: 35px; margin-right:8px; border-radius:2px;}
+	.gougu-upload-tips{color:#969696}
+	.layui-form-item{margin-bottom:8px;}
+	.layui-input-block{min-height:24px;}
+  </style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-x border-t" id="barsearchform" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:120px;">
+			<select name="source_id">
+				<option value="">渠道来源</option>
+				{volist name=":get_base_data('customer_source')" id="v"}
+				<option value="{$v.id}">{$v.title}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:120px;">
+			<select name="industry_id">
+				<option value="">所属行业</option>
+				{volist name=":get_base_data('Industry')" id="v"}
+				<option value="{$v.id}">{$v.title}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:120px;">
+			<select name="grade_id">
+				<option value="">客户等级</option>
+				{volist name=":get_base_data('customer_grade')" id="v"}
+				<option value="{$v.id}">{$v.title}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:172px;">
+			<input type="text" class="layui-input" data-range="~" placeholder="最近跟进日期" readonly name="follow_time" id="follow_time">
+		</div>
+		<div class="layui-input-inline" style="width:240px;">
+			<input type="text" name="keywords" placeholder="输入关键字" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px;">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+<div class="layui-btn-group">
+   <button class="layui-btn layui-btn-sm" title="添加公海客户" lay-event="add">+ 添加公海客户</button>
+   <button class="layui-btn layui-btn-normal layui-btn-sm" lay-event="import"><i class="layui-icon">&#xe66f;</i>批量导入</button>
+</div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus','oaPicker','uploadPlus','laydatePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool ,form = layui.form, oaPicker = layui.oaPicker,uploadPlus=layui.uploadPlus,laydatePlus=layui.laydatePlus;
+		var follow_time = new laydatePlus({'target':'follow_time'});
+		layui.pageTable = table.render({
+			elem: '#test',
+			title: '公海客户列表',
+			defaultToolbar: false,
+			toolbar: '#toolbarDemo',
+			url: "/customer/index/sea", //数据接口
+			cellMinWidth: 80,
+			page: true, //开启分页
+			limit: 20,
+			height: 'full-112',
+			cols: [
+				[ //表头
+					{
+						field: 'id',title: '编号',align: 'center',width: 80
+					},{
+						field: 'name',
+						title: '客户名称',
+						minWidth:240,
+						templet: '<div><a data-href="/customer/customer/view/id/{{d.id}}.html" class="side-a">{{d.name}}</a></div>'
+					},{
+						field: 'contact_name',
+						title: '联系人',
+						align: 'center',
+						width: 80
+					},{
+						field: 'contact_mobile',
+						title: '手机号码',
+						align: 'center',
+						width: 100
+					},{
+						field: 'contact_email',
+						title: '电子邮箱',
+						width: 200
+					},{
+						field: 'grade',
+						title: '客户等级',
+						align: 'center',
+						width: 100
+					},{
+						field: 'source',
+						title: '来源渠道',
+						align: 'center',
+						width: 100
+					},{
+						field: 'industry',
+						title: '所属行业',
+						align: 'center',
+						width: 120
+					},{
+						field: 'create_time',
+						title: '创建时间',
+						align: 'center',
+						width: 150
+					},{
+						field: 'update_time',
+						title: '最后编辑时间',
+						align: 'center',
+						width: 150
+					},{
+						field: 'right',
+						fixed:'right',
+						title: '操作',
+						width: 190,
+						align: 'center',
+						templet: function (d) {
+							var html = '<div class="layui-btn-group">';
+							var btn='<span class="layui-btn layui-btn-xs" lay-event="edit">编辑</span>';
+							var btn0='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="distribute">分配</span>';
+							var btn1='<span class="layui-btn layui-btn-xs" lay-event="get">领取</span>';
+							var btn2='<span class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">转入废弃池</span>';
+							return html+btn+btn0+btn1+btn2+'</div>';
+						}						
+					}
+				]
+			]
+		});
+		
+		//表头工具栏事件
+		table.on('toolbar(test)', function(obj){
+			if (obj.event === 'add') {
+				tool.side("/customer/customer/add?sea=1");
+				return;
+			}
+			if (obj.event === 'import') {
+				let importUpload = new uploadPlus({
+					"title":'批量导入公海客户',
+					"use":'import',
+					"url":'/api/import/import_customer',
+					"import":{
+						"template":'/static/home/file/勾股OA客户导入模板.xlsx',
+						"tips":'如果导入失败，请根据提示注意检查表格数据，客户来源、所属行业、需要是系统中存在的数据，如果不存在的话可能会导入失败。'
+					},
+					callback:function(res){
+						layui.pageTable.reload();
+					}
+				});	
+				return;				
+			}
+		});
+		
+		//监听行工具事件
+		table.on('tool(test)', function(obj) {
+			var data = obj.data;
+			if(obj.event === 'view'){
+				tool.side('/customer/customer/view?id='+data.id);
+			}
+			if(obj.event === 'edit'){
+				tool.side('/customer/customer/add?sea=1&id='+data.id);
+			}
+			if (obj.event === 'distribute') {
+				oaPicker.employeeInit({
+					callback:function(selected){
+						//这里是选择后的回调方法，可以根据具体需求自定义写哦
+						let select_id=[],select_name=[],select_did=[];
+						for(var a=0; a<selected.length;a++){
+							select_id.push(selected[a].id);
+							select_name.push(selected[a].name);
+							select_did.push(selected[a].did);
+						}
+						layer.confirm('确定要把该客户分配给'+select_name.join(',')+'?', {
+							icon: 3,
+							title: '提示'
+						}, function(index) {
+							let callback1 = function (e) {
+								layer.msg(e.msg);
+								if (e.code == 0) {
+									layui.pageTable.reload();
+								}
+							}
+							tool.post("/customer/api/distribute", {id: data.id,uid:select_id.join(','),did:select_did.join(',')}, callback1);
+							layer.close(index);
+						});
+					}
+				});
+			}
+			if (obj.event === 'get') {
+				layer.confirm('确定要领取该客户?', {
+					icon: 3,
+					title: '提示'
+				}, function(index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/customer/index/to_get", {id: data.id}, callback);
+					layer.close(index);
+				});
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要把客户转入废弃池吗?', {
+					icon: 3,
+					title: '提示'
+				}, function(index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.delete("/customer/index/to_trash", {id: data.id,type:1}, callback);
+					layer.close(index);
+				});
+			}
+			return;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
diff --git a/app/customer/view/index/trash.html b/app/customer/view/index/trash.html
new file mode 100644
index 0000000000000000000000000000000000000000..70f3754588191913af51a711b1babf3765dad158
--- /dev/null
+++ b/app/customer/view/index/trash.html
@@ -0,0 +1,170 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-x border-t" id="barsearchform" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:120px;">
+			<select name="source_id">
+				<option value="">渠道来源</option>
+				{volist name=":get_base_data('customer_source')" id="v"}
+				<option value="{$v.id}">{$v.title}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:120px;">
+			<select name="industry_id">
+				<option value="">所属行业</option>
+				{volist name=":get_base_data('Industry')" id="v"}
+				<option value="{$v.id}">{$v.title}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:120px;">
+			<select name="grade_id">
+				<option value="">客户等级</option>
+				{volist name=":get_base_data('customer_grade')" id="v"}
+				<option value="{$v.id}">{$v.title}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:240px;">
+			<input type="text" name="keywords" placeholder="输入关键字" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px;">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+<h3>废弃客户</h3>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool ,form = layui.form;
+		layui.pageTable = table.render({
+			elem: '#test',
+			title: '废弃客户列表',
+			toolbar: '#toolbarDemo',
+			defaultToolbar: false,
+			url: "/customer/index/trash", //数据接口
+			cellMinWidth: 80,
+			page: true, //开启分页
+			limit: 20,
+			height: 'full-112',
+			cols: [
+				[ //表头
+					{
+						field: 'id',title: '编号',align: 'center',width: 80,templet: function (d) {
+							return'C' + d.id;
+						}
+					},{
+						field: 'name',
+						title: '客户名称',
+						minWidth:240,
+						templet: '<div><a data-href="/customer/customer/view/id/{{d.id}}.html" class="side-a">{{d.name}}</a></div>'
+					},{
+						field: 'contact_name',
+						title: '联系人',
+						align: 'center',
+						width: 80
+					},{
+						field: 'contact_mobile',
+						title: '手机号码',
+						align: 'center',
+						width: 100
+					},{
+						field: 'contact_email',
+						title: '电子邮箱',
+						width: 200
+					},{
+						field: 'grade',
+						title: '客户等级',
+						align: 'center',
+						width: 100
+					},{
+						field: 'source',
+						title: '来源渠道',
+						align: 'center',
+						width: 100
+					},{
+						field: 'industry',
+						title: '所属行业',
+						align: 'center',
+						width: 120
+					},{
+						field: 'create_time',
+						title: '创建时间',
+						align: 'center',
+						width: 150
+					},{
+						field: 'update_time',
+						title: '最后编辑时间',
+						align: 'center',
+						width: 150
+					},{
+						field: 'right',
+						fixed:'right',
+						title: '操作',
+						width: 150,
+						align: 'center',
+						templet: function (d) {
+							var html = '<div class="layui-btn-group">';
+							var btn1='<span class="layui-btn layui-btn-xs" lay-event="back">拉回公海</span>';
+							var btn2='<span class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">彻底删除</span>';
+							return html+btn1+btn2+'</div>';
+						}						
+					}
+				]
+			]
+		});
+		
+		//监听行工具事件
+		table.on('tool(test)', function(obj) {
+			var data = obj.data;
+			if(obj.event === 'view'){
+				tool.side('/customer/index/view?id='+data.id);
+			}
+			if (obj.event === 'back') {
+				layer.confirm('确定要把该客户拉回公海吗?', {
+					icon: 3,
+					title: '提示'
+				}, function(index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/customer/index/to_revert", {id: data.id}, callback);
+					layer.close(index);
+				});
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要彻底删除该客户吗?', {
+					icon: 3,
+					title: '提示'
+				}, function(index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.delete("/customer/customer/del", {id: data.id}, callback);
+					layer.close(index);
+				});
+			}
+			return;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
diff --git a/app/customer/view/industry/add.html b/app/customer/view/industry/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..1d67afc890328822b16ce3e0a441f72f0c411c8a
--- /dev/null
+++ b/app/customer/view/industry/add.html
@@ -0,0 +1,45 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">行业类型</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">行业类型名称<font>*</font></td>
+			<td><input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入行业类型名称" lay-reqText="请输入行业类型名称"class="layui-input" value="{$detail.title|default=''}"></td>
+			<td class="layui-td-gray">排序</td>
+			<td><input type="text" name="sort" placeholder="请输入排序，数字" autocomplete="off" class="layui-input" value="{$detail.sort|default=''}"></td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$detail.id|default=0}"/>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool'];
+
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/customer/industry/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/customer/view/industry/datalist.html b/app/customer/view/industry/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..5c597f05927cd19c736cbde6bccce485db06f62b
--- /dev/null
+++ b/app/customer/view/industry/datalist.html
@@ -0,0 +1,124 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<table class="layui-hide" id="table_industry" lay-filter="table_industry"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-group">
+  	<button class="layui-btn layui-btn-sm add-new" type="button">+ 添加行业类型</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool;
+		
+		layui.pageTable = table.render({
+			elem: "#table_industry"
+			,toolbar: '#toolbarDemo'
+			,url: "/customer/industry/datalist"
+			,page: false
+			,limit: 999
+			,cellMinWidth: 80
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',title: '类型名称'}
+				,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+					var html1='<span class="green">正常</span>';
+					var html2='<span class="yellow">禁用</span>';
+					if(d.status==1){
+						return html1;
+					}
+					else{
+						return html2;
+					}
+				}}
+				,{width:100,title: '操作', align:'center',ignoreExport:true,templet: function(d){
+					var html='';
+					var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+					if(d.status==1){
+						html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+					}
+					else{
+						html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+					}
+					return html;
+				}}
+			]]
+		});
+			
+		table.on('tool(table_industry)',function (obj) {
+			if(obj.event === 'edit'){					
+				add_cate(obj.data.id,obj.data.title);
+			}
+			if(obj.event === 'disable'){
+				layer.confirm('确定要禁用该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/customer/industry/set", {id:obj.data.id,status: 0}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'open'){
+				layer.confirm('确定要启用该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/customer/industry/set", {id:obj.data.id,status:1}, callback);
+					layer.close(index);
+				});
+			}
+		});
+		
+		$('body').on('click','.add-new',function(){
+			add_cate(0,'');	
+		});
+		
+		function add_cate(id,val){
+			var title = '新增类型';
+			if(id>0){
+				title = '编辑类型';
+			}
+			layer.prompt({
+				title: title,
+				value: val,
+				yes: function(index, layero) {
+					// 获取文本框输入的值
+					var value = layero.find(".layui-layer-input").val();
+					if (value) {
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();				
+							}
+						}
+						tool.post("/customer/industry/add", {id: id,title: value}, callback);
+						layer.close(index);
+					} else {
+						layer.msg('请填写类型名称');
+					}
+				}
+			})
+		}
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/customer/view/industry/view.html b/app/customer/view/industry/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..073f5803c91763d5fe2f7e401225e6793e33d6b0
--- /dev/null
+++ b/app/customer/view/industry/view.html
@@ -0,0 +1,16 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<h3 class="pb-3">行业类型详情</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">行业类型名称</td>
+			<td>{$detail.title|default=''}"></td>
+			<td class="layui-td-gray">排序</td>
+			<td>{$detail.sort|default=0}</td>
+		</tr>
+	</table>
+</div>
+{/block}
+<!-- /主体 -->
\ No newline at end of file
diff --git a/app/customer/view/source/add.html b/app/customer/view/source/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..7d69f5057680c5a9ff3d872a99b50e840b32e780
--- /dev/null
+++ b/app/customer/view/source/add.html
@@ -0,0 +1,49 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">客户来源</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">客户来源名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入客户来源名称" lay-reqText="请输入客户来源名称"class="layui-input" value="{$detail.title|default=''}">
+			</td>
+			<td class="layui-td-gray">排序</td>
+			<td>
+				<input type="text" name="sort" placeholder="请输入排序，数字" autocomplete="off" class="layui-input" value="{$detail.sort|default=''}">
+			</td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$detail.id|default=0}"/>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool'];
+
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/customer/source/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/customer/view/source/datalist.html b/app/customer/view/source/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..2038c0c0996ecb8ac60a89f0205959fa7251ca49
--- /dev/null
+++ b/app/customer/view/source/datalist.html
@@ -0,0 +1,124 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<table class="layui-hide" id="table_customer_source" lay-filter="table_customer_source"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm add-new" type="button">+ 添加客户来源</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool;
+		
+		layui.pageTable = table.render({
+			elem: "#table_customer_source"
+			,toolbar: '#toolbarDemo'
+			,url: "/customer/source/datalist"
+			,page: false
+			,limit: 999
+			,cellMinWidth: 80
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',title: '类型名称'}
+				,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+					var html1='<span class="green">正常</span>';
+					var html2='<span class="yellow">禁用</span>';
+					if(d.status==1){
+						return html1;
+					}
+					else{
+						return html2;
+					}
+				}}
+				,{width:100,title: '操作', align:'center',ignoreExport:true,templet: function(d){
+					var html='';
+					var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+					if(d.status==1){
+						html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+					}
+					else{
+						html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+					}
+					return html;
+				}}
+			]]
+		});
+			
+		table.on('tool(table_customer_source)',function (obj) {
+			if(obj.event === 'edit'){					
+				add_cate(obj.data.id,obj.data.title);
+			}
+			if(obj.event === 'disable'){
+				layer.confirm('确定要禁用该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/customer/source/set", {id:obj.data.id,status: 0}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'open'){
+				layer.confirm('确定要启用该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/customer/source/set", {id:obj.data.id,status:1}, callback);
+					layer.close(index);
+				});
+			}
+		});
+		
+		$('body').on('click','.add-new',function(){
+			add_cate(0,'');	
+		});
+		
+		function add_cate(id,val){
+			var title = '新增类型';
+			if(id>0){
+				title = '编辑类型';
+			}
+			layer.prompt({
+				title: title,
+				value: val,
+				yes: function(index, layero) {
+					// 获取文本框输入的值
+					var value = layero.find(".layui-layer-input").val();
+					if (value) {
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();				
+							}
+						}
+						tool.post("/customer/source/add", {id: id,title: value}, callback);
+						layer.close(index);
+					} else {
+						layer.msg('请填写类型名称');
+					}
+				}
+			})
+		}
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/customer/view/source/index.html b/app/customer/view/source/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..c622b707e07531207c8054ad3f55bdad5945e4ce
--- /dev/null
+++ b/app/customer/view/source/index.html
@@ -0,0 +1,121 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+    <table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-normal layui-btn-sm addNew" type="button">+ 添加客户渠道</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool, form = layui.form;
+		layui.pageTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,defaultToolbar: false
+			,title:'客户渠道列表'
+			,url: "/customer/source/index"
+			,page: false
+			,cellMinWidth: 80
+			,cols: [[
+					{field:'id',width:80, title: 'ID号', align:'center'}
+					,{field:'title',title: '渠道名称'}
+					,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+						var html1='<span class="green">正常</span>';
+						var html2='<span class="yellow">禁用</span>';
+						if(d.status==1){
+							return html1;
+						}
+						else{
+							return html2;
+						}
+					}}
+					,{width:100,title: '操作', align:'center',templet: function(d){
+						var html='';
+						var btn='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
+						var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+						var btn2='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="open">启用</a>';
+						if(d.status==1){
+							html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+						}
+						else{
+							html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+						}
+						return html;
+					}}
+				]]
+			});
+			
+			table.on('tool(test)',function (obj) {
+				if(obj.event === 'edit'){					
+					addExpense(obj.data.id,obj.data.title);
+				}
+				if(obj.event === 'disable'){
+					layer.confirm('确定要禁用该渠道吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/customer/source/source_check", { id: obj.data.id,status: 0,title: obj.data.title}, callback);
+						layer.close(index);
+					});
+				}
+				if(obj.event === 'open'){
+					layer.confirm('确定要启用该渠道吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/customer/source/source_check", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
+						layer.close(index);
+					});
+				}
+			});
+			
+			$('body').on('click','.addNew',function(){
+				addExpense(0,'');	
+			});
+			
+			function addExpense(id,val){
+				var title = '新增渠道';
+				if(id>0){
+					title = '编辑渠道';
+				}
+				layer.prompt({
+					title: title,
+					value: val,
+					yes: function(index, layero) {
+						// 获取文本框输入的值
+						var value = layero.find(".layui-layer-input").val();
+						if (value) {
+							let callback = function (e) {
+								layer.msg(e.msg);
+								if (e.code == 0) {
+									layui.pageTable.reload();				
+								}
+							}
+							tool.post("/customer/source/source_add", {id: id,title: value}, callback);
+							layer.close(index);
+						} else {
+							layer.msg('请填写渠道名称');
+						}
+					}
+				})
+			}
+		}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/customer/view/source/view.html b/app/customer/view/source/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..6c88d570519411bcf8ca935240ecf9c4d441e89c
--- /dev/null
+++ b/app/customer/view/source/view.html
@@ -0,0 +1,16 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<h3 class="pb-3">客户来源详情</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">客户来源名称</td>
+			<td>{$detail.title|default=''}"></td>
+			<td class="layui-td-gray">排序</td>
+			<td>{$detail.sort|default=0}</td>
+		</tr>
+	</table>
+</div>
+{/block}
+<!-- /主体 -->
\ No newline at end of file
diff --git a/app/customer/view/trace/add.html b/app/customer/view/trace/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..823121703a243679a1cc18c4fdeb0a5ebede2051
--- /dev/null
+++ b/app/customer/view/trace/add.html
@@ -0,0 +1,107 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="p-page layui-form">
+	<h3 class="pb-3">新增跟进记录</h3>
+    <table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">客户名称</td>
+			<td colspan="5">{$customer_name}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">联 系 人<font>*</font></td>
+			<td>
+			  <select name="contact_id" lay-verify="required" lay-reqText="请选择联系人">
+				<option value="">请选择</option>
+				{volist name=":customer_contact($customer_id)" id="v"}
+				<option value="{$v.id}">{$v.name}</option>
+				{/volist}
+			  </select>
+			</td>
+			<td class="layui-td-gray">跟进方式<font>*</font></td>
+			<td>
+			  <select name="types" lay-verify="required" lay-reqText="请选择跟进方式">
+				<option value="">请选择</option>
+				{volist name=":get_base_type_data('basic_customer',3)" id="v"}
+				<option value="{$v.id}">{$v.title}</option>
+				{/volist}
+			  </select>
+			</td>
+			<td class="layui-td-gray">跟进时间<font>*</font></td>
+			<td><input type="text" name="follow_time" readonly lay-verify="required" lay-reqText="请选择跟进时间" placeholder="请选择跟进时间" class="layui-input tool-time" data-type="datetime"  data-format="yyyy-MM-dd HH:mm"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top">沟通内容<font>*</font></td>
+			<td colspan="5"><textarea name="content" placeholder="请输入沟通内容" lay-verify="required" lay-reqText="请输入沟通内容" class="layui-textarea"></textarea></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">当前阶段<font>*</font></td>
+			<td>
+			  <select name="stage" lay-verify="required" lay-reqText="请选择">
+				<option value="">请选择</option>
+				{volist name=":get_base_type_data('basic_customer',4)" id="v"}
+				<option value="{$v.id}">{$v.title}</option>
+				{/volist}
+			  </select>
+			</td>
+			<td class="layui-td-gray">销售机会</td>
+			<td>
+			  <select name="grade_id">
+				<option value="">请选择</option>
+				{volist name=":customer_chance($customer_id)" id="v"}
+				<option value="{$v.id}">{$v.title}</option>
+				{/volist}
+			  </select>
+			</td>
+			<td class="layui-td-gray-2">下次沟通时间<font>*</font></td>
+			<td><input type="text" name="next_time" readonly lay-verify="required" lay-reqText="请选择下次沟通时间" placeholder="请选择下次沟通时间" class="layui-input tool-time" data-type="datetime"  data-format="yyyy-MM-dd HH:mm"></td>
+		</tr>
+        <tr>
+            <td class="layui-td-gray">
+				<div>相关附件</div>
+				<div><button type="button" class="layui-btn layui-btn-xs" id="uploadBtn">附件上传</button></div>
+            </td>
+            <td colspan="5" style="line-height:inherit">
+                <div class="layui-row" id="uploadBox">
+                    <input type="hidden" data-type="file" name="file_ids" value="">
+                </div>
+            </td>
+        </tr>
+    </table>
+    <div class="pt-4">
+		<input type="hidden" name="cid" value="{$customer_id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','uploadPlus'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,uploadPlus=layui.uploadPlus;
+		var attachment = new uploadPlus({
+			"title":'上传文件',
+			"target":'uploadBtn',
+			"targetBox":'uploadBox'
+		});
+
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000,'traceTable');
+				}
+			}
+			tool.post("/customer/trace/add", data.field, callback);
+			return false;
+		});
+
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/customer/view/trace/datalist.html b/app/customer/view/trace/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..2a48039626d6fb42d51702067b49ec3649279ab7
--- /dev/null
+++ b/app/customer/view/trace/datalist.html
@@ -0,0 +1,103 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
+		{gt name="$is_auth" value="0"}
+		<div class="layui-input-inline user-name" style="width:100px;">
+			<input type="text" name="username" placeholder="选择跟进人" class="layui-input picker-admin" readonly />
+			<input type="text" name="uid" value="" style="display:none" />	
+		</div>
+		{/gt}
+		<div class="layui-input-inline" style="width:175px;">
+			<input type="text" class="layui-input" id="follow_time" placeholder="下次跟进日期" readonly name="follow_time">
+		</div>
+		<div class="layui-input-inline" style="width:300px">
+			<input type="text" name="keywords" placeholder="关键字" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_customer_trace" lay-filter="table_customer_trace"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div>
+  	<h3>跟进记录</h3>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','oaPicker','laydatePlus','tablePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool, form = layui.form,laydatePlus=layui.laydatePlus;
+		var follow_time = new laydatePlus({'target':'follow_time'});
+		layui.traceTable = table.render({
+			elem: "#table_customer_trace"
+			, toolbar: "#toolbarDemo"
+			,url: "/customer/trace/datalist"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 80
+			,is_excel: true
+			,height: 'full-112'
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'stage_name',title: '当前阶段',width:100,align:'center'}
+				,{field:'content',title: '沟通内容',minWidth:300}
+				,{field:'chance',title: '销售机会',width:200}
+				,{field:'type_name',title: '跟进方式',width:80,align:'center'}
+				,{field:'admin_name',title: '跟进人',width:80,align:'center'}
+				,{field:'follow_time', title: '跟进日期',width:130,align:'center'}
+				,{field:'next_time', title: '下次跟进日期',width:130,align:'center',style:'color:#16b777'}
+				,{width:120,fixed:'right',title: '操作', align:'center',ignoreExport:true,templet: function(d){
+					var html='';
+					var btn1='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详细</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn3='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
+					if(d.admin_id == login_admin){
+						return '<div class="layui-btn-group">'+btn1+btn2+btn3+'</div>';
+					}
+					else{
+						return '<div class="layui-btn-group">'+btn1+'</div>';
+					}
+				}}
+			]]
+		});
+			
+		table.on('tool(table_customer_trace)',function (obj) {
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/customer/trace/view?id="+data.id);
+				return;
+			}
+			if (obj.event === 'edit') {
+				tool.side("/customer/trace/add?id="+data.id);
+				return;
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要删除该线索机会吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/customer/trace/del", { id: data.id }, callback);
+					layer.close(index);
+				});
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/customer/view/trace/edit.html b/app/customer/view/trace/edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..6c2729dc50c213d8872f35d506198e3c07076f4f
--- /dev/null
+++ b/app/customer/view/trace/edit.html
@@ -0,0 +1,113 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="p-page layui-form">
+	<h3 class="pb-3">编辑跟进记录</h3>
+    <table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">客户名称</td>
+			<td colspan="5">{$detail.customer}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">联 系 人<font>*</font></td>
+			<td>
+			  <select name="contact_id" lay-verify="required" lay-reqText="请选择联系人">
+				<option value="">请选择</option>
+				{volist name=":customer_contact($detail.cid)" id="v"}
+				<option value="{$v.id}" {eq name="$v.id" value="$detail.contact_id"} selected{/eq}>{$v.name}</option>
+				{/volist}
+			  </select>
+			</td>
+			<td class="layui-td-gray">跟进方式<font>*</font></td>
+			<td>
+			  <select name="type" lay-verify="required" lay-reqText="请选择跟进方式">
+				<option value="">请选择</option>
+				{volist name=":get_base_type_data('basic_customer',3)" id="v"}
+				<option value="{$v.id}" {eq name="v.id" value="$detail.types"} selected{/eq}>{$v.title}</option>
+				{/volist}
+			  </select>
+			</td>
+			<td class="layui-td-gray">跟进时间<font>*</font></td>
+			<td><input type="text" name="follow_time" value="{$detail.follow_time|date='Y-m-d H:i'}" readonly lay-verify="required" lay-reqText="请选择跟进时间" placeholder="请选择跟进时间" class="layui-input tool-time" data-type="datetime" data-format="yyyy-MM-dd HH:mm"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top">沟通内容<font>*</font></td>
+			<td colspan="5"><textarea name="content" placeholder="请输入沟通内容" lay-verify="required" lay-reqText="请输入沟通内容" class="layui-textarea">{$detail.content}</textarea></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">当前阶段<font>*</font></td>
+			<td>
+			  <select name="stage" lay-verify="required" lay-reqText="请选择">
+				<option value="">请选择</option>
+				{volist name=":get_base_type_data('basic_customer',4)" id="v"}
+				<option value="{$v.id}" {eq name="v.id" value="$detail.stage"} selected{/eq}>{$v.title}</option>
+				{/volist}
+			  </select>
+			</td>
+			<td class="layui-td-gray">销售机会</td>
+			<td>
+			  <select name="chance_id">
+				<option value="">请选择</option>
+				{volist name=":customer_chance($detail.cid)" id="v"}
+				<option value="{$v.id}" {eq name="$v.id" value="$detail.chance_id"} selected{/eq}>{$v.title}</option>
+				{/volist}
+			  </select>
+			</td>
+			<td class="layui-td-gray-2">下次沟通时间<font>*</font></td>
+			<td><input type="text" name="next_time" value="{$detail.next_time|date='Y-m-d H:i'}" readonly lay-verify="required" lay-reqText="请选择下次沟通时间" placeholder="请选择下次沟通时间" class="layui-input tool-time" data-type="datetime" data-format="yyyy-MM-dd HH:mm"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">
+				<div>相关附件</div>
+				<div><button type="button" class="layui-btn layui-btn-xs" id="uploadBtn">附件上传</button></div>
+            </td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids}">
+					{notempty name="$detail.file_ids"}
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr>
+    </table>
+    <div class="pt-4">
+		<input type="hidden" name="id" value="{$detail.id}">
+		<input type="hidden" name="cid" value="{$detail.cid}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','uploadPlus'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,uploadPlus=layui.uploadPlus;
+		var attachment = new uploadPlus({
+			"title":'上传文件',
+			"target":'uploadBtn',
+			"targetBox":'uploadBox'
+		});
+
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000,'traceTable');
+				}
+			}
+			tool.post("/customer/trace/add", data.field, callback);
+			return false;
+		});
+
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/customer/view/trace/view.html b/app/customer/view/trace/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..76e4cff3d1ad807da718578f693c30eaad8aa979
--- /dev/null
+++ b/app/customer/view/trace/view.html
@@ -0,0 +1,57 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<h3 class="pb-3">跟进记录详细</h3>
+    <table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">客户名称</td>
+			<td colspan="5">{$detail.customer}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">联 系 人</td>
+			<td>{$detail.contact}</td>
+			<td class="layui-td-gray">跟进方式</td>
+			<td>{$detail.types_name}</td>
+			<td class="layui-td-gray">跟进时间</td>
+			<td>{$detail.follow_time|date='Y-m-d H:i'}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top">沟通内容</td>
+			<td colspan="5">{$detail.content}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">当前阶段</td>
+			<td>{$detail.stage_name}</td>
+			<td class="layui-td-gray">销售机会</td>
+			<td>{$detail.chance}</td>
+			<td class="layui-td-gray-2">下次沟通时间</td>
+			<td>{$detail.next_time|date='Y-m-d H:i'}</td>
+		 </tr>
+		 {notempty name="$detail.file_ids"}
+		 <tr>
+			<td class="layui-td-gray">相关附件</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">					
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		 </tr>
+		 {/notempty}
+    </table>
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/disk/common.php b/app/disk/common.php
new file mode 100644
index 0000000000000000000000000000000000000000..c859f0ae6e5176020a0fe6b1dea211404aa05771
--- /dev/null
+++ b/app/disk/common.php
@@ -0,0 +1,30 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+use think\facade\Db;
+
+function get_pfolder($id)
+{
+	$folder = Db::name('Disk')->where('id',$id)->find();
+	if($folder && $folder['pid'] > 0){
+		$pfolders = get_pfolder($folder['pid']);
+		$pfolders[] = $folder;
+		return $pfolders;
+	}
+	else{
+		if(empty($folder)){
+			return [];
+		}
+		return [$folder];
+	}	
+}
\ No newline at end of file
diff --git a/app/disk/controller/Index.php b/app/disk/controller/Index.php
new file mode 100644
index 0000000000000000000000000000000000000000..72b066d7c65245c56cf660e99d542087a6deba88
--- /dev/null
+++ b/app/disk/controller/Index.php
@@ -0,0 +1,511 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\disk\controller;
+
+use app\base\BaseController;
+use app\disk\model\Disk as DiskModel;
+use app\disk\validate\IndexValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Index extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new DiskModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			$pid = isset($param['pid']) ? $param['pid'] : 0;
+			$where=[];
+			$where[]=['pid','=',$pid];
+			$where[]=['admin_id','=',$this->uid];
+			$where[]=['delete_time','=',0];
+            if (!empty($param['keywords'])) {
+                $where[] = ['name', 'like', '%' . $param['keywords'] . '%'];
+            }
+			if (!empty($param['ext'])) {
+                $where[] = ['file_ext', 'in',$param['ext']];
+            }
+			if (!empty($param['is_share'])) {
+                $where[]=['is_share','=',1];
+            }
+			if (!empty($param['is_star'])) {
+                $where[]=['is_star','=',1];
+            }
+            $list = $this->model->datalist($where, $param);
+			$folder = get_pfolder($param['pid']);
+            return table_assign(0, '', $list,$folder);
+        }
+        else{
+            return view();
+        }
+    }
+
+    /**
+    * 分享列表
+    */
+    public function sharelist()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			$pid = isset($param['pid']) ? $param['pid'] : 0;
+			$where=[];
+			if($pid>0){
+				$where[]=['pid','=',$pid];
+			}
+			else{
+				$where[]=['is_share','=',1];
+			}
+			if (!empty($param['ext'])) {
+                $where[] = ['file_ext', 'in',$param['ext']];
+            }
+			$where[]=['delete_time','=',0];
+            if (!empty($param['keywords'])) {
+                $where[] = ['name', 'like', '%' . $param['keywords'] . '%'];
+            }
+            $list = $this->model->datalist($where, $param);
+			$folder = get_pfolder($param['pid']);
+            return table_assign(0, '', $list,$folder);
+        }
+        else{
+            return view();
+        }
+    }
+    /**
+    * 回收站列表
+    */
+    public function clearlist()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			$pid = isset($param['pid']) ? $param['pid'] : 0;
+			$where=[];
+			$where[]=['admin_id','=',$this->uid];
+			$where[]=['clear_time','=',0];
+			if($pid>0){
+				$where[]=['pid','=',$pid];
+			}
+			else{
+				$where[]=['delete_time','>',0];
+			}
+			if (!empty($param['ext'])) {
+                $where[] = ['file_ext', 'in',$param['ext']];
+            }
+            if (!empty($param['keywords'])) {
+                $where[] = ['name', 'like', '%' . $param['keywords'] . '%'];
+            }
+            $list = $this->model->datalist($where, $param);
+			$folder = get_pfolder($param['pid']);
+            return table_assign(0, '', $list,$folder);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 新增上传文件
+    */
+    public function add_upload()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {
+			try {
+				validate(IndexValidate::class)->scene('add')->check($param);
+			} catch (ValidateException $e) {
+				// 验证失败 输出错误信息
+				return to_assign(1, $e->getError());
+			}
+			$param['admin_id'] = $this->uid;
+			$this->model->add($param);
+		}
+    }
+	
+	/**
+    * 新增文件夹
+    */
+    public function add_folder()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {		
+			try {
+				validate(IndexValidate::class)->scene('add')->check($param);
+			} catch (ValidateException $e) {
+				// 验证失败 输出错误信息
+				return to_assign(1, $e->getError());
+			}
+			$param['types'] = 2;
+			$param['admin_id'] = $this->uid;
+			$this->model->add($param);	 
+        }
+    }
+
+	public function add_article()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {		
+            if (!empty($param['id']) && $param['id'] > 0) {
+				$param['update_time'] = time();
+                $res = Db::name('Article')->strict(false)->field(true)->update($param);
+				if ($res !== false) {
+					add_log('edit', $param['id'], $param);
+					$disk['id'] = $param['disk_id'];
+					$disk['name'] = $param['name'];
+					$disk['update_time'] = $param['update_time'];
+					$this->model->edit($disk);					
+				} else {
+					 return to_assign(1, "操作失败");
+				}
+				
+            } else {
+				$param['admin_id'] = $this->uid;
+				$param['create_time'] = time();
+                $aid = Db::name('Article')->strict(false)->field(true)->insertGetId($param);
+				if ($aid !== false) {
+					add_log('add', $aid, $param);
+					$param['action_id'] = $aid;
+					$param['types'] = 1;
+					$param['ext'] = 'article';
+					$this->model->add($param);
+				} else {
+					 return to_assign(1, "操作失败");
+				}
+            } 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			$pid = isset($param['pid']) ? $param['pid'] : 0;
+			if ($id>0) {
+				$file = $this->model->getById($id);
+				$detail = Db::name('Article')->find($file['action_id']);
+				if($detail['file_ids'] !=''){
+					$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+					$detail['file_array'] = $file_array;
+				}
+				$detail['disk_id'] = $id;
+				View::assign('detail', $detail);
+				return view('edit_article');
+			}
+			View::assign('pid', $pid);
+			return view();
+		}
+    }
+	//查看在线文档
+	public function view_article()
+    {
+		$param = get_params();	
+		$id = isset($param['id']) ? $param['id'] : 0;
+		if ($id>0) {
+			$file = $this->model->getById($id);
+			$detail = Db::name('Article')->find($file['action_id']);
+			$detail['admin_name'] = Db::name('Admin')->where('id',$detail['admin_id'])->value('name');
+			if($detail['file_ids'] !=''){
+				$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+				$detail['file_array'] = $file_array;
+			}
+			View::assign('detail', $detail);
+		}
+		return view();
+    }
+	
+	/**
+    * 新增文件夹
+    */
+    public function rename()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {		
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(IndexValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } 
+        }
+    }
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			View::assign('detail', $detail);
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		$param = get_params();
+        if (request()->isDelete()) {
+            $ids = $param["ids"];
+			$idArray = explode(',', strval($ids));
+			$list = [];
+			foreach ($idArray as $key => $val) {
+				$file = Db::name('Disk')->find($val);
+				if($file['admin_id'] != $this->uid){
+					return to_assign(1, "删除失败,【".$file['name']."】不是你上传的文件");
+					break;
+				}
+				$count = Db::name('Disk')->where(['pid'=>$val,'delete_time'=>0])->count();
+				if($count>0){
+					return to_assign(1, "删除失败,请先清空【".$file['name']."】里面的文件");
+					break;
+				}
+				$list[] = [
+					'id' => $val,
+					'delete_time' => time()
+				];
+			}
+			$res = $this->model->saveAll($list);
+            if ($res!== false) {
+                return to_assign(0, "删除成功");
+            } else {
+                return to_assign(1, "删除失败");
+            }
+        } else {
+            return to_assign(1, "错误的请求");
+        }
+    } 
+   /**
+    * 恢复
+    */
+    public function back($ids)
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+            $ids = $param["ids"];
+			$idArray = explode(',', strval($ids));
+			$list = [];
+			foreach ($idArray as $key => $val) {
+				$list[] = [
+					'id' => $val,
+					'delete_time' => 0
+				];
+			}
+			$res = $this->model->saveAll($list);
+            if ($res!== false) {
+                return to_assign(0, "恢复成功");
+            } else {
+                return to_assign(1, "恢复失败");
+            }
+        } else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+
+   /**
+    * 清除
+    */
+    public function clear($ids)
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+            $ids = $param["ids"];
+			$idArray = explode(',', strval($ids));
+			$list = [];
+			foreach ($idArray as $key => $val) {
+				$list[] = [
+					'id' => $val,
+					'clear_time' => time()
+				];
+			}
+			$res = $this->model->saveAll($list);
+            if ($res!== false) {
+                return to_assign(0, "清除成功");
+            } else {
+                return to_assign(1, "清除失败");
+            }
+        } else {
+            return to_assign(1, "错误的请求");
+        }
+    } 
+   /**
+    * 移动
+    */
+    public function move()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+            $ids = $param["ids"];
+            $pid = $param["pid"];
+			$idArray = explode(',', strval($ids));
+			$list = [];
+			foreach ($idArray as $key => $val) {
+				$file = Db::name('Disk')->find($val);
+				if($pid == $val){
+					return to_assign(1, "移动失败,【".$file['name']."】不能移动到文件夹本身");
+					break;
+				}
+				$list[] = [
+					'id' => $val,
+					'pid' => $pid,
+					'update_time' => time()
+				];
+			}
+			$model = new DiskModel();
+			$res = $model->saveAll($list);
+            if ($res!== false) {
+                return to_assign(0, "转移成功");
+            } else {
+                return to_assign(1, "转移失败");
+            }
+        }else{
+			$pid = isset($param['pid']) ? $param['pid']: 0 ;
+			$path = get_pfolder($pid);
+			$folder = Db::name('Disk')->where(['pid'=>$pid,'types'=>2,'delete_time'=>0])->order('id desc')->select()->toArray();
+			$pfolder = '全部文件';
+			if($pid>0){
+				$pfolder = Db::name('Disk')->where(['id'=>$pid])->value('name');
+			}
+			View::assign('pid', $pid);
+			View::assign('pfolder', $pfolder);
+			View::assign('path', $path);
+			View::assign('folder', $folder);
+			return view();
+		}
+	}
+	
+	/**
+    * 分享
+    */
+    public function share()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+            $ids = $param["ids"];
+			$idArray = explode(',', strval($ids));
+			$list = [];
+			foreach ($idArray as $key => $val) {
+				$list[] = [
+					'id' => $val,
+					'is_share' => 1,
+					'update_time' => time()
+				];
+			}
+			$model = new DiskModel();
+			$res = $model->saveAll($list);
+            if ($res!== false) {
+                return to_assign(0, "分享成功");
+            } else {
+                return to_assign(1, "分享失败");
+            }
+        }
+	}
+	
+	/**
+    * 取消分享
+    */
+    public function unshare()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+            $ids = $param["ids"];
+			$idArray = explode(',', strval($ids));
+			$list = [];
+			foreach ($idArray as $key => $val) {
+				$list[] = [
+					'id' => $val,
+					'is_share' => 0,
+					'update_time' => time()
+				];
+			}
+			$model = new DiskModel();
+			$res = $model->saveAll($list);
+            if ($res!== false) {
+                return to_assign(0, "取消成功");
+            } else {
+                return to_assign(1, "取消失败");
+            }
+        }
+	}
+	
+	/**
+    * 标星
+    */
+    public function star()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+            $ids = $param["ids"];
+			$idArray = explode(',', strval($ids));
+			$list = [];
+			foreach ($idArray as $key => $val) {
+				$list[] = [
+					'id' => $val,
+					'is_star' => 1,
+					'update_time' => time()
+				];
+			}
+			$model = new DiskModel();
+			$res = $model->saveAll($list);
+            if ($res!== false) {
+                return to_assign(0, "标星成功");
+            } else {
+                return to_assign(1, "标星失败");
+            }
+        }
+	}
+	
+	/**
+    * 取消标星
+    */
+    public function unstar()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+            $ids = $param["ids"];
+			$idArray = explode(',', strval($ids));
+			$list = [];
+			foreach ($idArray as $key => $val) {
+				$list[] = [
+					'id' => $val,
+					'is_star' => 0,
+					'update_time' => time()
+				];
+			}
+			$model = new DiskModel();
+			$res = $model->saveAll($list);
+            if ($res!== false) {
+                return to_assign(0, "操作成功");
+            } else {
+                return to_assign(1, "操作失败");
+            }
+        }
+	}
+}
diff --git a/app/disk/event.php b/app/disk/event.php
new file mode 100644
index 0000000000000000000000000000000000000000..4eff8908bd643cd6072b9fde6ee38ca4ad6f04ad
--- /dev/null
+++ b/app/disk/event.php
@@ -0,0 +1,5 @@
+<?php
+// 这是系统自动生成的event定义文件
+return [
+
+];
diff --git a/app/disk/middleware.php b/app/disk/middleware.php
new file mode 100644
index 0000000000000000000000000000000000000000..c482cdc94129fdc23d6b57facd94e78af56a3c34
--- /dev/null
+++ b/app/disk/middleware.php
@@ -0,0 +1,9 @@
+<?php
+
+// 这是系统自动生成的middleware定义文件
+return [
+    //开启session中间件
+    //'think\middleware\SessionInit',
+    //验证勾股OA是否完成安装
+    \app\home\middleware\Install::class,
+];
diff --git a/app/disk/model/Disk.php b/app/disk/model/Disk.php
new file mode 100644
index 0000000000000000000000000000000000000000..359e0c49d4320626d49867e787ec58e3d9b279b5
--- /dev/null
+++ b/app/disk/model/Disk.php
@@ -0,0 +1,126 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\disk\model;
+use think\model;
+use think\facade\Db;
+class Disk extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+        try {
+            $list = self::where($where)
+			->orderRaw("case when types = 2 then 1 else 2 end, id desc")
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key){
+				$item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name');
+				if($item->types == 0){
+					$item->filepath = Db::name('File')->where('id',$item->action_id)->value('filepath');
+				}
+				else{
+					$item->filepath='';
+				}
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			$info = self::find($param['id']);
+			if($info['types'] == 0){
+				Db::name('File')->where('id',$info['action_id'])->update(['name'=>$param['name']]);
+			}
+			if($info['types'] == 1){
+				Db::name('Article')->where('id',$info['action_id'])->update(['name'=>$param['name'],'update_time'=>time()]);
+			}
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/disk/validate/IndexValidate.php b/app/disk/validate/IndexValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..394ab1532de48e6630e85d29752e9f5c7295e1a0
--- /dev/null
+++ b/app/disk/validate/IndexValidate.php
@@ -0,0 +1,34 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\disk\validate;
+use think\Validate;
+use think\facade\Db;
+
+class IndexValidate extends Validate
+{	
+    protected $rule = [
+		'name' => 'require',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'name.require' => '名称不能为空',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['title', 'id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/disk/view/index/add_article.html b/app/disk/view/index/add_article.html
new file mode 100644
index 0000000000000000000000000000000000000000..728057b7845dbb27f944da30764e482db91e7ca3
--- /dev/null
+++ b/app/disk/view/index/add_article.html
@@ -0,0 +1,75 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">新增文档</h3>
+    <table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">文档标题<font>*</font></td>
+			<td><input type="text" name="name" lay-verify="required" lay-reqText="请输入文档标题" autocomplete="off" placeholder="请输入文档标题" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">
+				<div class="layui-input-inline">关联附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="">
+				</div>
+			</td>
+		</tr> 
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">文档内容<font>*</font></td>
+			<td><textarea name="content" placeholder="请输入内容" class="layui-textarea" id="container" style="border:0;padding:0"></textarea></td>
+		</tr>
+    </table>
+    <div class="pt-3">
+		<input type="hidden" name="pid" value="{$pid}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool','uploadPlus','tinymce'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool,uploadPlus = layui.uploadPlus;	
+    //编辑器初始化
+	var editor = layui.tinymce;
+	var edit = editor.render({
+		selector: "#container",
+		menubar:false,
+		images_upload_url: '/api/index/upload/sourse/tinymce',//图片上传接口
+		height: 555
+	});
+
+	//相关附件上传
+	var attachment = new uploadPlus();
+
+    //监听提交
+    form.on('submit(webform)', function (data) {
+		data.field.content = tinyMCE.editors['container'].getContent();
+		if (data.field.content == '') {
+			layer.msg('请先完善文档的内容');
+			return false;
+		}	
+		let callback = function (e) {
+			layer.msg(e.msg);
+			if (e.code == 0) {
+				tool.sideClose(1000);
+			}
+		}
+		tool.post("/disk/index/add_article", data.field, callback);
+		return false;
+    });
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/disk/view/index/clearlist.html b/app/disk/view/index/clearlist.html
new file mode 100644
index 0000000000000000000000000000000000000000..33e666637e0c4559c844937eb0288ec695746201
--- /dev/null
+++ b/app/disk/view/index/clearlist.html
@@ -0,0 +1,323 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+    ::-webkit-scrollbar { display: none; width: 6px; height: 6px; }
+    ::-webkit-scrollbar-thumb { border-radius: 10px; background-color: #e1e1e1;}
+	.disk-left{width:120px; float:left; height:calc(100vh - 83px); overflow-y: auto; border:1px solid #eeeeee; background-color:#fbfbfb; padding:15px;}
+	.disk-left::-webkit-scrollbar {width: 0;}
+	.disk-left h3{font-size:18px; height:30px; padding-left:10px; font-weight:800}
+	.disk-types{padding:12px 0;}
+	.disk-types li{padding:8px; border-radius:3px; cursor:pointer;}
+	.disk-types li strong{margin-right:12px; font-size:18px;}
+	.disk-types li:hover{background-color:#F3F4F5;}
+	.disk-types li.on-this{background-color:#F2FAFF; color:#1E9FFF}
+	.disk-line{border-bottom:1px solid #eee; margin:6px 0;}
+	
+	.disk-table{margin-left:120px; overflow:hidden; height:calc(100vh - 53px);border:1px solid #eeeeee; border-left:0; background-color:#fff;}
+	.layui-btn.tool-add{padding:0 12px;}
+	
+	.disk-path{height:43px;padding:0 4px 0 12px;}
+	.disk-breadcrumb{float:left; padding:11px 0}
+	.disk-breadcrumb span{color:#666; margin:0 8px; font-size:10px;}
+	.layui-tab{margin:0;}
+    .file-item {height:calc(100vh - 120px); overflow-y: auto;}
+	.disk-path .layui-form-checkbox[lay-skin=primary]>div{padding-right:4px}
+	
+    /** 文件 **/
+    .file-item .file-subject { flex: 1; overflow: hidden; overflow-y: auto; margin: 10px; box-sizing: border-box; }
+    .file-item .file-subject:hover::-webkit-scrollbar { display: block; }
+    .file-item .file-subject ul { display: flex; flex-wrap: wrap; }
+    .file-item .file-subject ul li {position: relative; height: 124px; margin: 8px; padding: 6px; border: 1px solid rgba(0, 0, 0, 0.05); border-radius: 3px; transition: all 0.2s ease-in-out; }
+    .file-item .file-subject ul li:hover {border: 1px solid #eee; background-color:#f8f8f8;}
+    .file-item .file-subject ul li.on {border: 1px solid #ff5722; }
+    .file-item .file-subject ul li img { width: 66px; height: 66px; padding:16px;}
+    .file-item .file-subject ul li img.file-image { width: 98px; height: 98px; padding:0; border-radius: 2px; }
+    .file-item .file-subject ul li video { width: 60px; height: 60px; border-radius: 3px; }
+    .file-item .file-subject ul li p {overflow: hidden; margin: 5px 0 0; width: 98px; font-size: 13px; text-align: center; text-overflow: ellipsis; white-space: nowrap; }
+    .file-item .file-subject ul li .file-check{position: absolute; width:20px; height:20px; left: 0; top: 0; display: none; font-size: 14px; border-radius:2px 0 4px 0; text-align: center; line-height: 20px; color: #ffffff; background-color:#fff; border-right:1px solid #eee; border-bottom:1px solid #eee; cursor:pointer;}	
+	.file-item .file-subject ul li:hover .file-check{display: block;}
+    .file-item .file-subject ul li.on .file-check{ display: block; background: #ff5722; border-color:#ff5722}
+	.file-item .file-subject ul li .layui-btn-ctrl{position:absolute; top:0; right:0; display:none;}
+	.file-item .file-subject ul li:hover .layui-btn-ctrl{display:block}
+	.file-folder,.file-image,.file-pdf,.file-video,.file-audio{cursor:pointer;}
+    .file-item .file-subject ul li .has-share{position: absolute; width:20px; height:20px; right: 2px; top: 72px; border-radius:50%; text-align: center; line-height: 20px; color: #ffffff; background-color:#1E9FFF; border:1px solid #fff; padding:2px;}	
+	
+    .file-footer { display: flex; align-items: center; padding: 5px 15px 0; height: 45px; border-top: 1px solid #f2f2f2; text-align: center; background: #ffffff; }
+
+    /** 无数据 **/
+    .file-item .empty { display: flex; flex: 1; align-items: center; flex-direction: column; justify-content: center; overflow: hidden; text-align: center; color: #cccccc; }
+    .file-item .empty i { font-size: 180px; }
+    .file-item .empty p { width: 180px; text-align: center; }
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<div class="disk-left">
+		<h3>回收站文件</h3>
+		<div id="diskTypes" class="disk-types">
+			<ul>
+				<li class="on-this" data-tab=""><strong class="iconfont icon-kaohezhibiao"></strong>全部</li>
+				<li data-tab="image"><strong class="iconfont icon-sucaiguanli"></strong>图片</li>
+				<li data-tab="video"><strong class="iconfont icon-wodekecheng"></strong>视频</li>
+				<li data-tab="audio"><strong class="iconfont icon-tuiguang"></strong>音频</li>
+				<li data-tab="office"><strong class="iconfont icon-chengjiliebiao"></strong>Office文件</li>
+				<li data-tab="pdf"><strong class="iconfont icon-lunwenguanli"></strong>在线文档</li>
+				<li data-tab="zip"><strong class="iconfont icon-xiaoshoupin"></strong>压缩文件</li>
+			</ul>
+		</div>
+	</div>
+	<div class="disk-table">
+		<form class="layui-form gg-form-bar border-b" lay-filter="barsearchform">
+			<div class="layui-input-inline" style="width:300px">
+				<input type="text" name="keywords" placeholder="输入关键字，文件名称/目录名称" class="layui-input" autocomplete="off" />
+			</div>
+			<div class="layui-input-inline" style="width:150px">
+				<input type="hidden" name="pid" value="0" />
+				<input type="hidden" name="ext" value="" />
+				<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+				<button type="reset" class="layui-btn layui-btn-reset">清空</button>
+			</div>
+		</form>
+		<div class="disk-path layui-form border-b">
+			<div class="disk-breadcrumb" id="diskPath"><i class="layui-icon layui-icon-component"></i> <a href="javascript:void(0);" data-id="0">共享文件</a></div>
+		</div>
+		<!-- 主体 -->
+		<div class="file-item">
+			<div class="file-subject">
+				<ul id="filesBox"></ul>
+			</div>
+		</div>
+		<!-- 页脚 -->
+		<div class="file-footer">
+			<div id="laypage"></div>
+		</div>
+    </div>
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const fileExt={
+		image:['jpg','jpeg','png','gif'],
+		office:['doc','docx','xls','xlsx','ppt','pptx'],
+		pdf:['txt','pdf','article'],
+		zip:['zip','rar','7z','gz','tar'],
+		video:['mpg','mp4','mpeg','avi','wmv','mov','flv','m4v'],
+		audio:['mp3','wav','wma','flac','midi']
+	};
+	const moduleInit = ['tool','uploadPlus'];
+	function gouguInit() {
+		var tool = layui.tool,uploadPlus = layui.uploadPlus,form = layui.form,laypage = layui.laypage;
+		
+		let ctrl_callback = function (e) {
+			if(e.code == 0){
+				layer.closeAll();
+				layer.msg(e.msg);
+				$('[lay-filter="webform"]').click();
+			}
+			else{
+				layer.msg(e.msg);
+			}
+		}
+		
+		//左侧操作
+		$('#diskTypes').on('click','li',function(){
+			$(this).addClass('on-this').siblings().removeClass('on-this');
+			let tab = $(this).data('tab');
+			$('[name="pid"]').val(0);
+			$('[name="keywords"]').val('');
+			if(tab==''){
+				$('[name="ext"]').val('');
+			}
+			else{
+				$('[name="ext"]').val(fileExt[tab]);
+			}
+			let data = form.val('barsearchform');
+			get_files(data);
+		})
+		
+		//顶部目录操作
+		$('#diskPath').on('click','a',function(){
+			let id=$(this).data('id');
+			$('[name="pid"]').val(id);
+			let data = form.val('barsearchform');
+			get_files(data);
+		})
+		
+		//查看文件
+		$('#filesBox').on('click','.file-item',function(){
+			let id = $(this).parent().data('id');
+			let href = $(this).data('href');
+			let ext = $(this).data('ext');
+			if(ext == 'video'){
+				tool.videoView(href);
+			}
+			else if(ext == 'audio'){
+				tool.audioView(href);
+			}
+			else if(ext == 'image'){
+				tool.photoView(href);
+			}
+			else if(ext == 'pdf'){
+				tool.pdfView(href);
+			}
+			else if(ext == 'article'){
+				tool.articleView(id);
+			}
+			else if(ext == 'folder'){
+				$('[name="pid"]').val(id);
+				let data = form.val('barsearchform');
+				get_files(data);
+			}
+			else{
+				return false;
+			}
+		})
+		
+		//单文件还原
+		$('#filesBox').on('click','.file-back',function(){
+			let id = $(this).parent().parent().data('id');
+			layer.confirm('确定要还原该文件吗？', { icon: 3, title: '提示' }, function (index) {
+				tool.delete("/disk/index/back", {ids:id}, ctrl_callback);
+			});
+		})
+		
+		//单文件清除
+		$('#filesBox').on('click','.file-clear',function(){
+			let id = $(this).parent().parent().data('id');
+			layer.confirm('确定要清除该文件吗？清除后将不可恢复', { icon: 3, title: '提示' }, function (index) {
+				tool.post("/disk/index/clear", {ids:id}, ctrl_callback);
+			});
+		})
+		
+		//加载数据
+		var data = form.val('barsearchform');
+		get_files(data);
+		form.on('submit(webform)', function (data) {
+			get_files(data.field);
+			return false;
+		});
+		$('.layui-btn-reset').click(function(){
+			setTimeout(function(){
+				$('[lay-filter="webform"]').click();
+			},200)
+		})
+		
+		function get_files(param){
+			var loadIndex = layer.load(0);
+			$.ajax({
+				url:"/disk/index/clearlist",
+				data:param,
+				complete:function(){
+					setTimeout(function(){
+						layer.close(loadIndex)
+					}, 200);
+				},
+				success:function(res){
+					$('[name="select_all"]').prop('checked', false);
+					form.render('checkbox');
+					if(res.code==0){
+						laypage.render({
+							elem: 'laypage',
+							limit:param['limit'],
+							curr:param['page'],
+							count: res.count, // 数据总数
+							jump: function(obj, first){
+								//console.log(obj.curr); // 得到当前页，以便向服务端请求对应页的数据。
+								//console.log(obj.limit); // 得到每页显示的条数
+								// 首次不执行
+								if(!first){
+									var data = form.val('barsearchform');
+									data['page'] = obj.curr;
+									get_files(data);
+								}
+							}
+						});
+
+						let folder = res.totalRow;
+						let folderHtml='<i class="layui-icon layui-icon-windows"></i> <a href="javascript:void(0);" data-id="0">共享文件</a>';
+						if(folder.length>0){
+							for(var f=0;f<folder.length;f++){
+								folderHtml+='<span> 〉</span><a href="javascript:void(0);" data-id="'+folder[f].id+'">'+folder[f].name+'</a>';
+							}
+						}
+						$('#diskPath').html(folderHtml);
+					
+						var item=res.data,li='';
+						if(item.length>0){
+							for(var a=0;a<item.length;a++){								
+								let type = '',ext="zip";
+								// 判断元素是否在数组中
+								let path='/static/home/images/icon/file.png';
+								if (fileExt.image.includes(item[a].file_ext)) {
+									path=item[a].filepath;
+									type = '0,1,10,11';
+									ext="image";
+								}
+								if (fileExt.office.includes(item[a].file_ext)) {
+									type = '0,1,10,11';
+									ext="office";
+									path='/static/home/images/icon/'+item[a].file_ext+'.png';
+								}
+								if (item[a].file_ext == 'pdf' || item[a].file_ext == 'txt') {
+									type = '0,1,10,11';
+									ext="pdf";
+									path='/static/home/images/icon/'+item[a].file_ext+'.png';
+								}								
+								if (fileExt.video.includes(item[a].file_ext)) {
+									type = '0,1,10,11';
+									ext="video";
+									path='/static/home/images/icon/video.png';
+								}
+								if (fileExt.audio.includes(item[a].file_ext)) {
+									type = '0,10,11';
+									ext="audio";
+									path='/static/home/images/icon/audio.png';
+								}
+								if (fileExt.zip.includes(item[a].file_ext)) {
+									type = '0,10,11';
+									ext="zip";
+									path='/static/home/images/icon/rar.png';
+								}
+								if(item[a].types==1){
+									type = '1,10,11';
+									ext="article";
+									path='/static/home/images/icon/article.png';
+								}
+								ctrl = '<span class="layui-btn layui-btn-xs layui-btn-normal file-ctrl" data-ctrl="disk" data-fileid="'+item[a].id+'" data-actionid="'+item[a].action_id+'" data-href="'+item[a].filepath+'" data-filename="'+item[a].name+'" data-ext="'+ext+'" data-type="'+type+'">操作</span>';
+								
+								if(item[a].types==2){
+									ext="folder";
+									path='/static/home/images/icon/folder.png';
+									ctrl='';
+								}								
+								let is_share='';
+								if(item[a].is_share==1){
+									is_share='<div class="has-share" title="已分享"><i class="iconfont icon-fenxiang"></i></div>';
+								}
+								
+								li+='<li data-id="'+item[a].id+'" data-title="'+item[a].name+'" data-ext="'+item[a].file_ext+'" data-types="'+item[a].types+'"><img src="'+path+'" alt="'+item[a].name+'" style="object-fit: contain;" class="file-item file-'+ext+'" data-href="'+item[a].filepath+'" data-ext="'+ext+'"><p title="'+item[a].name+'">'+item[a].name+'</p>\
+									<div class="layui-btn-ctrl">'+ctrl+'\
+									<span class="file-back" style="display:none;" id="fileBack'+item[a].id+'" title="还原"></span>\
+									<span class="file-clear" style="display:none;" id="fileClear'+item[a].id+'" title="清除"></span>\
+									</div>\
+									<div class="file-check">✔</div>'+is_share+'</li>';
+							}
+							$('#filesBox').html(li);
+							$('#laypage').show();
+						}
+						else{
+							$('#filesBox').html('<div class="empty"><i class="layui-icon layui-icon-upload"></i><p>无文件文件，赶紧去上传吧!</p></div>');
+							$('#laypage').hide();
+						}
+					}	
+				}				
+			});
+		}
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/disk/view/index/datalist.html b/app/disk/view/index/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..b219868628873669a7f59dbf4d14bd9704de48b8
--- /dev/null
+++ b/app/disk/view/index/datalist.html
@@ -0,0 +1,575 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+    ::-webkit-scrollbar { display: none; width: 6px; height: 6px; }
+    ::-webkit-scrollbar-thumb { border-radius: 10px; background-color: #e1e1e1;}
+	.disk-left{width:120px; float:left; height:calc(100vh - 83px); overflow-y: auto; border:1px solid #eeeeee; background-color:#fbfbfb; padding:15px;}
+	.disk-left::-webkit-scrollbar {width: 0;}
+	.disk-left h3{font-size:18px; height:30px; padding-left:10px; font-weight:800}
+	.disk-types{padding:12px 0;}
+	.disk-types li{padding:8px; border-radius:3px; cursor:pointer;}
+	.disk-types li strong{margin-right:12px; font-size:18px;}
+	.disk-types li:hover{background-color:#F3F4F5;}
+	.disk-types li.on-this{background-color:#F2FAFF; color:#1E9FFF}
+	.disk-line{border-bottom:1px solid #eee; margin:6px 0;}
+	
+	.disk-table{margin-left:120px; overflow:hidden; height:calc(100vh - 53px);border:1px solid #eeeeee; border-left:0; background-color:#fff;}
+	.layui-btn.tool-add{padding:0 12px;}
+	
+	.disk-path{height:43px;padding:0 4px 0 12px;}
+	.disk-breadcrumb{float:left; padding:11px 0}
+	.disk-breadcrumb span{color:#666; margin:0 8px; font-size:10px;}
+	.layui-tab{margin:0;}
+    .file-item {height:calc(100vh - 120px); overflow-y: auto;}
+	.disk-path .layui-form-checkbox[lay-skin=primary]>div{padding-right:4px}
+	
+    /** 文件 **/
+    .file-item .file-subject { flex: 1; overflow: hidden; overflow-y: auto; margin: 10px; box-sizing: border-box; }
+    .file-item .file-subject:hover::-webkit-scrollbar { display: block; }
+    .file-item .file-subject ul { display: flex; flex-wrap: wrap; }
+    .file-item .file-subject ul li {position: relative; height: 124px; margin: 8px; padding: 6px; border: 1px solid rgba(0, 0, 0, 0.05); border-radius: 3px; transition: all 0.2s ease-in-out; }
+    .file-item .file-subject ul li:hover {border: 1px solid #eee; background-color:#f8f8f8;}
+    .file-item .file-subject ul li.on {border: 1px solid #ff5722; }
+    .file-item .file-subject ul li img { width: 66px; height: 66px; padding:16px;}
+    .file-item .file-subject ul li img.file-image { width: 98px; height: 98px; padding:0; border-radius: 2px; }
+    .file-item .file-subject ul li video { width: 60px; height: 60px; border-radius: 3px; }
+    .file-item .file-subject ul li p {overflow: hidden; margin: 5px 0 0; width: 98px; font-size: 13px; text-align: center; text-overflow: ellipsis; white-space: nowrap; }
+    .file-item .file-subject ul li .file-check{position: absolute; width:20px; height:20px; left: 0; top: 0; display: none; font-size: 14px; border-radius:2px 0 4px 0; text-align: center; line-height: 20px; color: #ffffff; background-color:#fff; border-right:1px solid #eee; border-bottom:1px solid #eee; cursor:pointer;}	
+	.file-item .file-subject ul li:hover .file-check{display: block;}
+    .file-item .file-subject ul li.on .file-check{ display: block; background: #ff5722; border-color:#ff5722}
+	.file-item .file-subject ul li .layui-btn-ctrl{position:absolute; top:0; right:0; display:none;}
+	.file-item .file-subject ul li:hover .layui-btn-ctrl{display:block}
+	.file-folder,.file-image,.file-pdf,.file-video,.file-audio{cursor:pointer;}
+    .file-item .file-subject ul li .has-share{position: absolute; width:20px; height:20px; right: 2px; top: 72px; border-radius:50%; text-align: center; line-height: 20px; color: #ffffff; background-color:#1E9FFF; border:1px solid #fff; padding:2px;}	
+	.file-item .file-subject ul li .has-star{position: absolute; width:20px; height:20px; right: 32px; top: 72px; border-radius:50%; text-align: center; line-height: 20px; color: #ffffff; background-color:#ffb800; border:1px solid #fff; padding:2px;}	
+	
+    .file-footer { display: flex; align-items: center; padding: 5px 15px 0; height: 45px; border-top: 1px solid #f2f2f2; text-align: center; background: #ffffff; }
+
+    /** 无数据 **/
+    .file-item .empty { display: flex; flex: 1; align-items: center; flex-direction: column; justify-content: center; overflow: hidden; text-align: center; color: #cccccc; }
+    .file-item .empty i { font-size: 180px; }
+    .file-item .empty p { width: 180px; text-align: center; }
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<div class="disk-left">
+		<h3>我的文件</h3>
+		<div id="diskTypes" class="disk-types">
+			<ul>
+				<li class="on-this" data-tab=""><strong class="iconfont icon-dingdanguanli"></strong>全部</li>
+				<li data-tab="image"><strong class="iconfont icon-sucaiguanli"></strong>图片</li>
+				<li data-tab="video"><strong class="iconfont icon-wodekecheng"></strong>视频</li>
+				<li data-tab="audio"><strong class="iconfont icon-tuiguang"></strong>音频</li>
+				<li data-tab="office"><strong class="iconfont icon-chengjiliebiao"></strong>Office文件</li>
+				<li data-tab="pdf"><strong class="iconfont icon-lunwenguanli"></strong>在线文档</li>
+				<li data-tab="zip"><strong class="iconfont icon-xiaoshoupin"></strong>压缩文件</li>
+			</ul>
+			<p class="disk-line"></p>
+			<ul>
+				<li data-tab="share"><strong class="iconfont icon-fenxiang" style="color:#1E9FFF"></strong>我的分享</li>
+				<li data-tab="star"><strong class="iconfont icon-pingfen" style="color:#FFB800"></strong>标星文件</li>
+			</ul>
+		</div>
+	</div>
+	<div class="disk-table">
+		<form class="layui-form gg-form-bar border-b" lay-filter="barsearchform">
+			<div class="layui-input-inline" style="width:312px">
+				<div class="layui-btn-group">
+					<span class="layui-btn tool-add" id="uploadBtn"><strong class="iconfont icon-shangchuan"></strong> 上传文件</span>
+					<span class="layui-btn layui-btn-normal tool-add" id="addArticle"><strong class="iconfont icon-lunwenguanli"></strong> 新建文档</span>
+					<span class="layui-btn layui-btn-warm tool-add" id="addFolder"><strong class="iconfont icon-xiangmuguanli"></strong> 新建目录</span>
+				 </div>
+			</div>
+			<div class="layui-input-inline" style="width:300px">
+				<input type="text" name="keywords" placeholder="输入关键字，文件名称/目录名称" class="layui-input" autocomplete="off" />
+			</div>
+			<div class="layui-input-inline" style="width:150px">
+				<input type="hidden" name="pid" value="0" />
+				<input type="hidden" name="ext" value="" />
+				<input type="hidden" name="is_share" value="" />
+				<input type="hidden" name="is_star" value="" />
+				<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+				<button type="reset" class="layui-btn layui-btn-reset">清空</button>
+			</div>
+		</form>
+		<div class="disk-path layui-form border-b">
+			<div class="disk-breadcrumb" id="diskPath"><i class="layui-icon layui-icon-component"></i> <a href="javascript:void(0);" data-id="0">我的文件</a></div>
+			<div class="layui-input-inline" style="width:272px; float:right; padding-top:6px;">
+				<div class="layui-btn-group">
+					<span class="layui-btn layui-btn-sm layui-btn-primary"><input type="checkbox" name="select_all" lay-filter="all" title="全选"></span>
+					<span class="layui-btn layui-btn-sm layui-btn-primary" id="fileDelete">删除</span>
+					<span class="layui-btn layui-btn-sm layui-btn-primary" id="fileMove">移动</span>
+					<span class="layui-btn layui-btn-sm layui-btn-primary" id="fileShare">分享</span>
+					<span class="layui-btn layui-btn-sm layui-btn-primary" id="fileShareno">取消分享</span>
+				</div>
+			</div>
+		</div>
+		<!-- 主体 -->
+		<div class="file-item">
+			<div class="file-subject">
+				<ul id="filesBox"></ul>
+			</div>
+		</div>
+		<!-- 页脚 -->
+		<div class="file-footer">
+			<div id="laypage"></div>
+		</div>
+    </div>
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>	
+	const fileExt={
+		image:['jpg','jpeg','png','gif'],
+		office:['doc','docx','xls','xlsx','ppt','pptx'],
+		pdf:['txt','pdf','article'],
+		zip:['zip','rar','7z','gz','tar'],
+		video:['mpg','mp4','mpeg','avi','wmv','mov','flv','m4v'],
+		audio:['mp3','wav','wma','flac','midi']
+	};
+	
+	const moduleInit = ['tool','uploadPlus'];
+	function gouguInit() {
+		var tool = layui.tool,uploadPlus = layui.uploadPlus,form = layui.form,laypage = layui.laypage;
+		//上传文件
+        var attachment = new uploadPlus({
+            "title":'上传文件',
+            "target":'uploadBtn',
+            "attachment":{
+                "type":1,//0ajax多文件模式，1ajax单文件单记录模式
+                "ajaxSave":function(res){
+                    $.ajax({
+                        url: "/disk/index/add_upload",
+                        type:'post',
+                        data:{
+							'pid':$('[name="pid"]').val(),
+                            'action_id':res.data.id,
+                            'name':res.data.name,
+                            'file_size':res.data.filesize,
+                            'file_ext':res.data.fileext
+                        },
+                        success: function (e) {
+                            layer.msg(e.msg);
+                            if (e.code == 0) {
+                                $('[lay-filter="webform"]').click();                            
+                            }
+                        }
+                    })
+                }
+            }
+        })
+		
+		let ctrl_callback = function (e) {
+			if(e.code == 0){
+				layer.closeAll();
+				layer.msg(e.msg);
+				$('[lay-filter="webform"]').click();
+			}
+			else{
+				layer.msg(e.msg);
+			}
+		}
+		
+		//左侧操作
+		$('#diskTypes').on('click','li',function(){
+			$('#diskTypes').find('li').removeClass('on-this');
+			$(this).addClass('on-this');
+			let tab = $(this).data('tab');
+			$('[name="pid"]').val(0);
+			$('[name="keywords"]').val('');
+			$('[name="ext"]').val('');
+			$('[name="is_share"]').val('');
+			$('[name="is_star"]').val('');
+			if(tab==''){
+				$('[name="ext"]').val('');
+			}
+			else{
+				if(tab == 'share'){
+					$('[name="is_share"]').val('1');
+				}
+				else if(tab == 'star'){
+					$('[name="is_star"]').val('1');
+				}
+				else{
+					$('[name="ext"]').val(fileExt[tab]);
+				}
+			}
+			let data = form.val('barsearchform');
+			get_files(data);
+		})
+		
+		//顶部目录操作
+		$('#diskPath').on('click','a',function(){
+			let id=$(this).data('id');
+			$('[name="pid"]').val(id);
+			let data = form.val('barsearchform');
+			get_files(data);
+		})
+		
+		//单文件选择操作
+		$('#filesBox').on('click','.file-check',function(){
+			$(this).parent().toggleClass("on");
+		})
+		
+		//全选操作
+		form.on('checkbox(all)', function (data) {
+		　　let val = data.value;
+			if(data.elem.checked){
+				//判断当前多选框是选中还是取消选中
+				$('#filesBox li').addClass('on');
+			}
+			else{
+				$('#filesBox li').removeClass('on');
+			}
+		});
+		
+		//批量删除操作
+		$('#fileDelete').on('click',function(){
+			let select_array = [];
+			$('#filesBox').find('li.on').each(function(index,item){
+				select_array.push($(item).data('id'));			
+			})
+			if(select_array.length<1){
+				layer.msg('请先选择文件');
+				return false;
+			}
+			layer.confirm('确定要删除这些文件吗？请慎重', { icon: 3, title: '提示' }, function (index) {
+				tool.delete("/disk/index/del", {ids:select_array.join(',')}, ctrl_callback);
+			});
+		});
+		
+		//批量分享操作
+		$('#fileShare').on('click',function(){
+			let select_array = [];
+			$('#filesBox').find('li.on').each(function(index,item){
+				select_array.push($(item).data('id'));			
+			})
+			if(select_array.length<1){
+				layer.msg('请先选择文件');
+				return false;
+			}
+			layer.confirm('如果是文件夹，内部的文件也会被分享，确定要分享这些文件吗？', { icon: 3, title: '提示' }, function (index) {
+				tool.delete("/disk/index/share", {ids:select_array.join(',')}, ctrl_callback);
+			});
+		});
+		
+		//批量取消分享操作
+		$('#fileShareno').on('click',function(){
+			let select_array = [];
+			$('#filesBox').find('li.on').each(function(index,item){
+				select_array.push($(item).data('id'));			
+			})
+			if(select_array.length<1){
+				layer.msg('请先选择文件');
+				return false;
+			}
+			layer.confirm('如果是文件夹，内部的文件也会取消分享，确定要取消分享这些文件吗？', { icon: 3, title: '提示' }, function (index) {
+				tool.delete("/disk/index/unshare", {ids:select_array.join(',')}, ctrl_callback);
+			});
+		});
+		
+		//批量移动操作
+		$('#fileMove').on('click',function(){
+			let select_array = [];
+			$('#filesBox').find('li.on').each(function(index,item){
+				select_array.push($(item).data('id'));			
+			})
+			if(select_array.length<1){
+				layer.msg('请先选择文件');
+				return false;
+			}
+			layer.open({
+				type: 2,
+				title: '移动到',
+				area: ['720px', '480px'],
+				content: '/disk/index/move',
+				maxmin: true,
+				btn: ['移动到此', '取消'],
+				btnAlign: 'c',
+				yes: function(index, layero){
+					// 获取 iframe 的窗口对象
+					let iframeWin =  window[layero.find('iframe')[0]['name']];
+					let folder = iframeWin.$('#folder'); // 获得 iframe 中某个输入框元素
+					let val = folder.val();
+					tool.post("/disk/index/move", {ids:select_array.join(','),pid:val}, ctrl_callback);
+				}
+			});
+		})
+		
+		//新增在线文档
+		$('#addArticle').on('click',function(){
+			tool.side('/disk/index/add_article?pid='+$('[name="pid"]').val());
+		})
+		
+		//新增目录
+		$('#addFolder').on('click',function(){
+			layer.prompt({title: '请输入目录名称'}, function(value, index, elem){
+				if(value === '') return elem.focus();
+				$.ajax({
+					url: "/disk/index/add_folder",
+					type:'post',
+					data:{
+						'pid':$('[name="pid"]').val(),
+						'name':value
+					},
+					success: ctrl_callback
+				})
+			});
+		})
+		
+		//查看文件
+		$('#filesBox').on('click','.file-item',function(){
+			let id = $(this).parent().data('id');
+			let href = $(this).data('href');
+			let ext = $(this).data('ext');
+			if(ext == 'video'){
+				tool.videoView(href);
+			}
+			else if(ext == 'audio'){
+				tool.audioView(href);
+			}
+			else if(ext == 'image'){
+				tool.photoView(href);
+			}
+			else if(ext == 'pdf'){
+				tool.pdfView(href);
+			}
+			else if(ext == 'article'){
+				tool.articleView(id);
+			}
+			else if(ext == 'folder'){
+				$('[name="pid"]').val(id);
+				let data = form.val('barsearchform');
+				get_files(data);
+			}
+			else{
+				return false;
+			}
+		})
+		
+		//重命名文件
+		$('#filesBox').on('click','.name-edit',function(){
+			let id = $(this).parent().parent().data('id');
+			let title = $(this).parent().parent().data('title');
+			let ext = $(this).parent().parent().data('ext');
+			let types = $(this).parent().parent().data('types');
+			title = title.toString().replace(/\.[^.]+$/, "")
+			layer.prompt({title: '重命名',value:title}, function(val, index, elem){
+				if(val === '') return elem.focus();
+				if(types == 0){
+					val =  val+'.'+ext;
+				}
+				tool.post("/disk/index/rename", {id:id,name:val}, ctrl_callback);
+			});
+		})		
+		
+		//单文件删除
+		$('#filesBox').on('click','.file-delete',function(){
+			let id = $(this).parent().parent().data('id');
+			layer.confirm('确定要删除该文件吗？请慎重', { icon: 3, title: '提示' }, function (index) {
+				tool.delete("/disk/index/del", {ids:id}, ctrl_callback);
+			});
+		})
+		
+		//单文件分享
+		$('#filesBox').on('click','.file-share',function(){
+			let id = $(this).parent().parent().data('id');
+			layer.confirm('如果是文件夹，内部的文件也会被分享，确定要分享这些文件吗？', { icon: 3, title: '提示' }, function (index) {
+				tool.post("/disk/index/share", {ids:id}, ctrl_callback);
+			});
+		})
+		
+		//单文件取消分享
+		$('#filesBox').on('click','.file-shareno',function(){
+			let id = $(this).parent().parent().data('id');			
+			layer.confirm('如果是文件夹，内部的文件也会被取消分享，确定要取消分享这些文件吗？', { icon: 3, title: '提示' }, function (index) {
+				tool.post("/disk/index/unshare", {ids:id}, ctrl_callback);
+			});
+		})
+		
+		//单文件标星
+		$('#filesBox').on('click','.file-star',function(){
+			let id = $(this).parent().parent().data('id');
+			layer.confirm('确定要标新该文件吗？', { icon: 3, title: '提示' }, function (index) {
+				tool.post("/disk/index/star", {ids:id}, ctrl_callback);
+			});
+		})
+		
+		//单文件取消标星
+		$('#filesBox').on('click','.file-starno',function(){
+			let id = $(this).parent().parent().data('id');			
+			layer.confirm('确定要取消标新该文件吗？', { icon: 3, title: '提示' }, function (index) {
+				tool.post("/disk/index/unstar", {ids:id}, ctrl_callback);
+			});
+		})
+		
+		//单文件移动
+		$('#filesBox').on('click','.file-move',function(){
+			let ids = $(this).parent().parent().data('id');
+			layer.open({
+				type: 2,
+				title: '移动到',
+				area: ['720px', '480px'],
+				content: '/disk/index/move',
+				maxmin: true,
+				btn: ['移动到此', '取消'],
+				btnAlign: 'c',
+				yes: function(index, layero){
+					// 获取 iframe 的窗口对象
+					let iframeWin =  window[layero.find('iframe')[0]['name']];
+					let folder = iframeWin.$('#folder'); // 获得 iframe 中某个输入框元素
+					let val = folder.val();
+					tool.post("/disk/index/move", {ids:ids,pid:val}, ctrl_callback);
+				}
+			});
+		})
+		
+		//加载数据
+		var data = form.val('barsearchform');
+		get_files(data);
+		form.on('submit(webform)', function (data) {
+			get_files(data.field);
+			return false;
+		});
+		$('.layui-btn-reset').click(function(){
+			setTimeout(function(){
+				$('[lay-filter="webform"]').click();
+			},200)
+		})
+		
+		function get_files(param){
+			var loadIndex = layer.load(0);
+			$.ajax({
+				url:"/disk/index/datalist",
+				data:param,
+				complete:function(){
+					setTimeout(function(){
+						layer.close(loadIndex)
+					}, 200);
+				},
+				success:function(res){
+					$('[name="select_all"]').prop('checked', false);
+					form.render('checkbox');
+					if(res.code==0){
+						laypage.render({
+							elem: 'laypage',
+							limit:param['limit'],
+							curr:param['page'],
+							count: res.count, // 数据总数
+							jump: function(obj, first){
+								//console.log(obj.curr); // 得到当前页，以便向服务端请求对应页的数据。
+								//console.log(obj.limit); // 得到每页显示的条数
+								// 首次不执行
+								if(!first){
+									var data = form.val('barsearchform');
+									data['page'] = obj.curr;
+									get_files(data);
+								}
+							}
+						});
+
+						let folder = res.totalRow;
+						let folderHtml='<i class="layui-icon layui-icon-windows"></i> <a href="javascript:void(0);" data-id="0">我的文件</a>';
+						if(folder.length>0){
+							for(var f=0;f<folder.length;f++){
+								folderHtml+='<span> 〉</span><a href="javascript:void(0);" data-id="'+folder[f].id+'">'+folder[f].name+'</a>';
+							}
+						}
+						$('#diskPath').html(folderHtml);
+					
+						var item=res.data,li='';
+						if(item.length>0){
+							for(var a=0;a<item.length;a++){								
+								let type = '',ext="zip";
+								// 判断元素是否在数组中
+								let path='/static/home/images/icon/file.png';
+								if (fileExt.image.includes(item[a].file_ext)) {
+									path=item[a].filepath;
+									type = '0,1,3,4,5';
+									ext="image";
+								}
+								if (fileExt.office.includes(item[a].file_ext)) {
+									type = '0,1,3,4,5';
+									ext="office";
+									path='/static/home/images/icon/'+item[a].file_ext+'.png';
+								}
+								if (item[a].file_ext == 'pdf' || item[a].file_ext == 'txt') {
+									type = '0,1,3,4,5';
+									ext="pdf";
+									path='/static/home/images/icon/'+item[a].file_ext+'.png';
+								}								
+								if (fileExt.video.includes(item[a].file_ext)) {
+									type = '0,1,3,4,5';
+									ext="video";
+									path='/static/home/images/icon/video.png';
+								}
+								if (fileExt.audio.includes(item[a].file_ext)) {
+									type = '0,1,3,4,5';
+									ext="audio";
+									path='/static/home/images/icon/audio.png';
+								}
+								if (fileExt.zip.includes(item[a].file_ext)) {
+									type = '0,1,3,4,5';
+									ext="zip";
+									path='/static/home/images/icon/rar.png';
+								}
+								if(item[a].types==1){
+									type = '0,1,2,3,4,5';
+									ext="article";
+									path='/static/home/images/icon/article.png';
+								}
+								if(item[a].types==2){
+									type = '3,4,5';
+									ext="folder";
+									path='/static/home/images/icon/folder.png';
+								}
+								let is_share='';
+								if(item[a].is_share==1){
+									type+=',7';
+									is_share='<div class="has-share" title="已分享"><i class="iconfont icon-fenxiang"></i></div>';
+								}
+								else{
+									type+=',6';
+								}
+								let is_star='';
+								if(item[a].is_star==1){
+									type+=',9';
+									is_star='<div class="has-star" title="已标星"><i class="iconfont icon-pingfen"></i></div>';
+								}
+								else{
+									type+=',8';
+								}
+								ctrl = '<span class="layui-btn layui-btn-xs layui-btn-normal file-ctrl" data-ctrl="disk" data-fileid="'+item[a].id+'" data-actionid="'+item[a].action_id+'" data-href="'+item[a].filepath+'" data-filename="'+item[a].name+'" data-ext="'+ext+'" data-type="'+type+'">操作</span>';
+								
+								li+='<li data-id="'+item[a].id+'" data-title="'+item[a].name+'" data-ext="'+item[a].file_ext+'" data-types="'+item[a].types+'"><img src="'+path+'" alt="'+item[a].name+'" style="object-fit: contain;" class="file-item file-'+ext+'" data-href="'+item[a].filepath+'" data-ext="'+ext+'"><p title="'+item[a].name+'">'+item[a].name+'</p>\
+									<div class="layui-btn-ctrl">'+ctrl+'\
+									<span class="name-edit" style="display:none;" id="fileEdit'+item[a].id+'" title="重命名"></span>\
+									<span class="file-delete" style="display:none;" id="fileDel'+item[a].id+'" title="删除"></span>\
+									<span class="file-move" style="display:none;" id="fileMove'+item[a].id+'" title="移动"></span>\
+									<span class="file-share" style="display:none;" id="fileShare'+item[a].id+'" title="分享"></span>\
+									<span class="file-shareno" style="display:none;" id="fileShareno'+item[a].id+'" title="取消分享"></span>\
+									<span class="file-star" style="display:none;" id="fileStar'+item[a].id+'" title="标星"></span>\
+									<span class="file-starno" style="display:none;" id="fileStarno'+item[a].id+'" title="取消标星"></span>\
+									</div>\
+									<div class="file-check">✔</div>'+is_star+is_share+'</li>';
+							}
+							$('#filesBox').html(li);
+							$('#laypage').show();
+						}
+						else{
+							$('#filesBox').html('<div class="empty"><i class="layui-icon layui-icon-upload"></i><p>无文件文件，赶紧去上传吧!</p></div>');
+							$('#laypage').hide();
+						}
+					}	
+				}				
+			});
+		}
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/disk/view/index/edit_article.html b/app/disk/view/index/edit_article.html
new file mode 100644
index 0000000000000000000000000000000000000000..712a20f60f3cc687ce67dfdc7afac3d5522f6cd7
--- /dev/null
+++ b/app/disk/view/index/edit_article.html
@@ -0,0 +1,81 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">新增文档</h3>
+    <table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">文档标题<font>*</font></td>
+			<td><input type="text" name="name" value="{$detail.name}" lay-verify="required" lay-reqText="请输入文档标题" autocomplete="off" placeholder="请输入文档标题" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">
+				<div class="layui-input-inline">关联附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids}">
+					{notempty name="$detail.file_ids"}
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr> 
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">文档内容<font>*</font></td>
+			<td><textarea name="content" placeholder="请输入内容" class="layui-textarea" id="container" style="border:0;padding:0">{$detail.content}</textarea></td>
+		</tr>
+    </table>
+    <div class="pt-3">
+		<input type="hidden" name="id" value="{$detail.id}">
+		<input type="hidden" name="disk_id" value="{$detail.disk_id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool','uploadPlus','tinymce'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool,uploadPlus = layui.uploadPlus;	
+    //编辑器初始化
+	var editor = layui.tinymce;
+	var edit = editor.render({
+		selector: "#container",
+		menubar:false,
+		images_upload_url: '/api/index/upload/sourse/tinymce',//图片上传接口
+		height: 555
+	});
+
+	//相关附件上传
+	var attachment = new uploadPlus();
+
+    //监听提交
+    form.on('submit(webform)', function (data) {
+		data.field.content = tinyMCE.editors['container'].getContent();
+		if (data.field.content == '') {
+			layer.msg('请先完善文档的内容');
+			return false;
+		}	
+		let callback = function (e) {
+			layer.msg(e.msg);
+			if (e.code == 0) {
+				tool.sideClose(1000);
+			}
+		}
+		tool.post("/disk/index/add_article", data.field, callback);
+		return false;
+    });
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/disk/view/index/move.html b/app/disk/view/index/move.html
new file mode 100644
index 0000000000000000000000000000000000000000..4b2cbc88b1b386a85d678dc11a411d489db5095a
--- /dev/null
+++ b/app/disk/view/index/move.html
@@ -0,0 +1,60 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>	
+	.disk-table{overflow:hidden;height:372px; background-color:#fff;}
+	.layui-btn.tool-add{padding:0 12px;}
+	
+	.disk-path{height:43px;padding:0 4px 0 12px;}
+	.disk-breadcrumb{float:left; padding:11px 0}
+	.disk-breadcrumb span{color:#666; margin:0 8px; font-size:10px;}
+	.layui-tab{margin:0;}
+    .file-item {height:calc(100vh - 120px); overflow-y: auto;}
+
+    /** 文件 **/
+    .disk-folder {height:372px; overflow: hidden; overflow-y: auto; box-sizing: border-box; padding-bottom:44px;}
+    .disk-folder ul li { display: flex; position: relative; padding: 12px 16px; border-bottom: 1px solid rgba(0, 0, 0, 0.05);display: flex; flex-wrap: wrap; line-height:24px;}
+    .disk-folder ul li:hover {background-color:#f8f8f8;}
+	.disk-folder ul li img{margin-right:12px;}
+
+    /** 无数据 **/
+    .disk-folder .empty {text-align: center; color: #999; padding:48px 0}
+    .disk-folder .empty p{padding:12px 0}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<div class="disk-table">
+	<div class="disk-path layui-form border-b">
+		<div class="disk-breadcrumb" id="diskPath">
+		<i class="layui-icon layui-icon-windows"></i> <a href="/disk/index/move?pid=0">全部文件</a>
+		{volist name="$path" id="vo"}
+		<span> 〉</span><a href="/disk/index/move?pid={$vo.id}">{$vo.name}</a>
+		{/volist}
+		</div>
+	</div>
+	<div class="disk-folder">
+		{empty name="$folder"}
+			<div class="empty"><img src="/static/home/images/icon/folder.png" width="100" height="100" /><p>移动到 【{$pfolder}】 文件夹</p></div>
+		{/empty}
+		<ul>
+			{volist name="$folder" id="vo"}
+			<li><a href="/disk/index/move?pid={$vo.id}"><img src="/static/home/images/icon/folder.png" width="24" height="24" /> {$vo.name}</a></li>
+			{/volist}
+		</ul>
+	</div>
+	<input type="hidden" name="folder" id="folder" value="{$pid}">
+</div>
+{/block}
+<!-- /主体 -->
+{block name="copyright"}{/block}
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var tool = layui.tool;
+		
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/disk/view/index/sharelist.html b/app/disk/view/index/sharelist.html
new file mode 100644
index 0000000000000000000000000000000000000000..3a680cd13a0c5ab0543c09197d9252166a8aea5c
--- /dev/null
+++ b/app/disk/view/index/sharelist.html
@@ -0,0 +1,305 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+    ::-webkit-scrollbar { display: none; width: 6px; height: 6px; }
+    ::-webkit-scrollbar-thumb { border-radius: 10px; background-color: #e1e1e1;}
+	.disk-left{width:120px; float:left; height:calc(100vh - 83px); overflow-y: auto; border:1px solid #eeeeee; background-color:#fbfbfb; padding:15px;}
+	.disk-left::-webkit-scrollbar {width: 0;}
+	.disk-left h3{font-size:18px; height:30px; padding-left:10px; font-weight:800}
+	.disk-types{padding:12px 0;}
+	.disk-types li{padding:8px; border-radius:3px; cursor:pointer;}
+	.disk-types li strong{margin-right:12px; font-size:18px;}
+	.disk-types li:hover{background-color:#F3F4F5;}
+	.disk-types li.on-this{background-color:#F2FAFF; color:#1E9FFF}
+	.disk-line{border-bottom:1px solid #eee; margin:6px 0;}
+	
+	.disk-table{margin-left:120px; overflow:hidden; height:calc(100vh - 53px);border:1px solid #eeeeee; border-left:0; background-color:#fff;}
+	.layui-btn.tool-add{padding:0 12px;}
+	
+	.disk-path{height:43px;padding:0 4px 0 12px;}
+	.disk-breadcrumb{float:left; padding:11px 0}
+	.disk-breadcrumb span{color:#666; margin:0 8px; font-size:10px;}
+	.layui-tab{margin:0;}
+    .file-item {height:calc(100vh - 120px); overflow-y: auto;}
+	.disk-path .layui-form-checkbox[lay-skin=primary]>div{padding-right:4px}
+	
+    /** 文件 **/
+    .file-item .file-subject { flex: 1; overflow: hidden; overflow-y: auto; margin: 10px; box-sizing: border-box; }
+    .file-item .file-subject:hover::-webkit-scrollbar { display: block; }
+    .file-item .file-subject ul { display: flex; flex-wrap: wrap; }
+    .file-item .file-subject ul li {position: relative; height: 124px; margin: 8px; padding: 6px; border: 1px solid rgba(0, 0, 0, 0.05); border-radius: 3px; transition: all 0.2s ease-in-out; }
+    .file-item .file-subject ul li:hover {border: 1px solid #eee; background-color:#f8f8f8;}
+    .file-item .file-subject ul li.on {border: 1px solid #ff5722; }
+    .file-item .file-subject ul li img { width: 66px; height: 66px; padding:16px;}
+    .file-item .file-subject ul li img.file-image { width: 98px; height: 98px; padding:0; border-radius: 2px; }
+    .file-item .file-subject ul li video { width: 60px; height: 60px; border-radius: 3px; }
+    .file-item .file-subject ul li p {overflow: hidden; margin: 5px 0 0; width: 98px; font-size: 13px; text-align: center; text-overflow: ellipsis; white-space: nowrap; }
+    .file-item .file-subject ul li .file-check{position: absolute; width:20px; height:20px; left: 0; top: 0; display: none; font-size: 14px; border-radius:2px 0 4px 0; text-align: center; line-height: 20px; color: #ffffff; background-color:#fff; border-right:1px solid #eee; border-bottom:1px solid #eee; cursor:pointer;}	
+	.file-item .file-subject ul li:hover .file-check{display: block;}
+    .file-item .file-subject ul li.on .file-check{ display: block; background: #ff5722; border-color:#ff5722}
+	.file-item .file-subject ul li .layui-btn-ctrl{position:absolute; top:0; right:0; display:none;}
+	.file-item .file-subject ul li:hover .layui-btn-ctrl{display:block}
+	.file-folder,.file-image,.file-pdf,.file-video,.file-audio{cursor:pointer;}
+    .file-item .file-subject ul li .has-share{position: absolute; width:20px; height:20px; right: 2px; top: 72px; border-radius:50%; text-align: center; line-height: 20px; color: #ffffff; background-color:#1E9FFF; border:1px solid #fff; padding:2px;}	
+	
+    .file-footer { display: flex; align-items: center; padding: 5px 15px 0; height: 45px; border-top: 1px solid #f2f2f2; text-align: center; background: #ffffff; }
+
+    /** 无数据 **/
+    .file-item .empty { display: flex; flex: 1; align-items: center; flex-direction: column; justify-content: center; overflow: hidden; text-align: center; color: #cccccc; }
+    .file-item .empty i { font-size: 180px; }
+    .file-item .empty p { width: 180px; text-align: center; }
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<div class="disk-left">
+		<h3>共享文件</h3>
+		<div id="diskTypes" class="disk-types">
+			<ul>
+				<li class="on-this" data-tab=""><strong class="iconfont icon-dingdanguanli"></strong>全部</li>
+				<li data-tab="image"><strong class="iconfont icon-sucaiguanli"></strong>图片</li>
+				<li data-tab="video"><strong class="iconfont icon-wodekecheng"></strong>视频</li>
+				<li data-tab="audio"><strong class="iconfont icon-tuiguang"></strong>音频</li>
+				<li data-tab="office"><strong class="iconfont icon-chengjiliebiao"></strong>Office文件</li>
+				<li data-tab="pdf"><strong class="iconfont icon-lunwenguanli"></strong>在线文档</li>
+				<li data-tab="zip"><strong class="iconfont icon-xiaoshoupin"></strong>压缩文件</li>
+			</ul>
+		</div>
+	</div>
+	<div class="disk-table">
+		<form class="layui-form gg-form-bar border-b" lay-filter="barsearchform">
+			<div class="layui-input-inline" style="width:300px">
+				<input type="text" name="keywords" placeholder="输入关键字，文件名称/目录名称" class="layui-input" autocomplete="off" />
+			</div>
+			<div class="layui-input-inline" style="width:150px">
+				<input type="hidden" name="pid" value="0" />
+				<input type="hidden" name="ext" value="" />
+				<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+				<button type="reset" class="layui-btn layui-btn-reset">清空</button>
+			</div>
+		</form>
+		<div class="disk-path layui-form border-b">
+			<div class="disk-breadcrumb" id="diskPath"><i class="layui-icon layui-icon-component"></i> <a href="javascript:void(0);" data-id="0">共享文件</a></div>
+		</div>
+		<!-- 主体 -->
+		<div class="file-item">
+			<div class="file-subject">
+				<ul id="filesBox"></ul>
+			</div>
+		</div>
+		<!-- 页脚 -->
+		<div class="file-footer">
+			<div id="laypage"></div>
+		</div>
+    </div>
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const fileExt={
+		image:['jpg','jpeg','png','gif'],
+		office:['doc','docx','xls','xlsx','ppt','pptx'],
+		pdf:['txt','pdf','article'],
+		zip:['zip','rar','7z','gz','tar'],
+		video:['mpg','mp4','mpeg','avi','wmv','mov','flv','m4v'],
+		audio:['mp3','wav','wma','flac','midi']
+	};
+	const moduleInit = ['tool','uploadPlus'];
+	function gouguInit() {
+		var tool = layui.tool,uploadPlus = layui.uploadPlus,form = layui.form,laypage = layui.laypage;
+		
+		let ctrl_callback = function (e) {
+			if(e.code == 0){
+				layer.closeAll();
+				layer.msg(e.msg);
+				$('[lay-filter="webform"]').click();
+			}
+			else{
+				layer.msg(e.msg);
+			}
+		}
+		
+		//左侧操作
+		$('#diskTypes').on('click','li',function(){
+			$(this).addClass('on-this').siblings().removeClass('on-this');
+			let tab = $(this).data('tab');
+			$('[name="pid"]').val(0);
+			$('[name="keywords"]').val('');
+			if(tab==''){
+				$('[name="ext"]').val('');
+			}
+			else{
+				$('[name="ext"]').val(fileExt[tab]);
+			}
+			let data = form.val('barsearchform');
+			get_files(data);
+		})
+		
+		//顶部目录操作
+		$('#diskPath').on('click','a',function(){
+			let id=$(this).data('id');
+			$('[name="pid"]').val(id);
+			let data = form.val('barsearchform');
+			get_files(data);
+		})
+		
+		//查看文件
+		$('#filesBox').on('click','.file-item',function(){
+			let id = $(this).parent().data('id');
+			let href = $(this).data('href');
+			let ext = $(this).data('ext');
+			if(ext == 'video'){
+				tool.videoView(href);
+			}
+			else if(ext == 'audio'){
+				tool.audioView(href);
+			}
+			else if(ext == 'image'){
+				tool.photoView(href);
+			}
+			else if(ext == 'pdf'){
+				tool.pdfView(href);
+			}
+			else if(ext == 'article'){
+				tool.articleView(id);
+			}
+			else if(ext == 'folder'){
+				$('[name="pid"]').val(id);
+				let data = form.val('barsearchform');
+				get_files(data);
+			}
+			else{
+				return false;
+			}
+		})
+		
+		//加载数据
+		var data = form.val('barsearchform');
+		get_files(data);
+		form.on('submit(webform)', function (data) {
+			get_files(data.field);
+			return false;
+		});
+		$('.layui-btn-reset').click(function(){
+			setTimeout(function(){
+				$('[lay-filter="webform"]').click();
+			},200)
+		})
+		
+		function get_files(param){
+			var loadIndex = layer.load(0);
+			$.ajax({
+				url:"/disk/index/sharelist",
+				data:param,
+				complete:function(){
+					setTimeout(function(){
+						layer.close(loadIndex)
+					}, 200);
+				},
+				success:function(res){
+					$('[name="select_all"]').prop('checked', false);
+					form.render('checkbox');
+					if(res.code==0){
+						laypage.render({
+							elem: 'laypage',
+							limit:param['limit'],
+							curr:param['page'],
+							count: res.count, // 数据总数
+							jump: function(obj, first){
+								//console.log(obj.curr); // 得到当前页，以便向服务端请求对应页的数据。
+								//console.log(obj.limit); // 得到每页显示的条数
+								// 首次不执行
+								if(!first){
+									var data = form.val('barsearchform');
+									data['page'] = obj.curr;
+									get_files(data);
+								}
+							}
+						});
+
+						let folder = res.totalRow;
+						let folderHtml='<i class="layui-icon layui-icon-windows"></i> <a href="javascript:void(0);" data-id="0">共享文件</a>';
+						if(folder.length>0){
+							for(var f=0;f<folder.length;f++){
+								folderHtml+='<span> 〉</span><a href="javascript:void(0);" data-id="'+folder[f].id+'">'+folder[f].name+'</a>';
+							}
+						}
+						$('#diskPath').html(folderHtml);
+					
+						var item=res.data,li='';
+						if(item.length>0){
+							for(var a=0;a<item.length;a++){								
+								let type = '',ext="zip";
+								// 判断元素是否在数组中
+								let path='/static/home/images/icon/file.png';
+								if (fileExt.image.includes(item[a].file_ext)) {
+									path=item[a].filepath;
+									type = '0,1';
+									ext="image";
+								}
+								if (fileExt.office.includes(item[a].file_ext)) {
+									type = '0,1';
+									ext="office";
+									path='/static/home/images/icon/'+item[a].file_ext+'.png';
+								}
+								if (item[a].file_ext == 'pdf' || item[a].file_ext == 'txt') {
+									type = '0,1';
+									ext="pdf";
+									path='/static/home/images/icon/'+item[a].file_ext+'.png';
+								}								
+								if (fileExt.video.includes(item[a].file_ext)) {
+									type = '0,1';
+									ext="video";
+									path='/static/home/images/icon/video.png';
+								}
+								if (fileExt.audio.includes(item[a].file_ext)) {
+									type = '0,1';
+									ext="audio";
+									path='/static/home/images/icon/audio.png';
+								}
+								if (fileExt.zip.includes(item[a].file_ext)) {
+									type = '0';
+									ext="zip";
+									path='/static/home/images/icon/rar.png';
+								}
+								if(item[a].types==1){
+									type = '1';
+									ext="article";
+									path='/static/home/images/icon/article.png';
+								}
+								ctrl = '<span class="layui-btn layui-btn-xs layui-btn-normal file-ctrl" data-ctrl="disk" data-fileid="'+item[a].id+'" data-actionid="'+item[a].action_id+'" data-href="'+item[a].filepath+'" data-filename="'+item[a].name+'" data-ext="'+ext+'" data-type="'+type+'">操作</span>';
+								
+								if(item[a].types==2){
+									ext="folder";
+									path='/static/home/images/icon/folder.png';
+									ctrl='';
+								}								
+								let is_share='';
+								if(item[a].is_share==1){
+									is_share='<div class="has-share" title="已分享"><i class="iconfont icon-fenxiang"></i></div>';
+								}
+								
+								li+='<li data-id="'+item[a].id+'" data-title="'+item[a].name+'" data-ext="'+item[a].file_ext+'" data-types="'+item[a].types+'"><img src="'+path+'" alt="'+item[a].name+'" style="object-fit: contain;" class="file-item file-'+ext+'" data-href="'+item[a].filepath+'" data-ext="'+ext+'"><p title="'+item[a].name+'">'+item[a].name+'</p>\
+									<div class="layui-btn-ctrl">'+ctrl+'\
+									</div>\
+									<div class="file-check">✔</div>'+is_share+'</li>';
+							}
+							$('#filesBox').html(li);
+							$('#laypage').show();
+						}
+						else{
+							$('#filesBox').html('<div class="empty"><i class="layui-icon layui-icon-upload"></i><p>无文件文件，赶紧去上传吧!</p></div>');
+							$('#laypage').hide();
+						}
+					}	
+				}				
+			});
+		}
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/disk/view/index/view_article.html b/app/disk/view/index/view_article.html
new file mode 100644
index 0000000000000000000000000000000000000000..9ade36c1439d753b41287967f7d0e9e6a43a06e5
--- /dev/null
+++ b/app/disk/view/index/view_article.html
@@ -0,0 +1,59 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<link rel="stylesheet" href="{__GOUGU__}/third_party/prism/prism.css"/>
+<style>
+.text-detial-ops{line-height: 22px; color:#999; padding: 12px 0;}
+.text-detial-ops span{margin-right: 20px;}
+.text-detial-ops a{margin-right:10px;}
+.text-detial-content{padding: 8px 0; color:#333; word-break: break-all; border-top:1px solid #e8e8e8;font-size: 16px!important; line-height: 1.72!important;}
+.text-detial-content p{padding: 8px 0;}
+.text-detial-content img{max-width:98%!important; margin:0 auto; display:block; border: 1px solid #e6e6e6; -webkit-box-shadow: 0 2px 6px rgba(26,26,26,.08); box-shadow: 0 2px 6px rgba(26,26,26,.08); border-radius: 4px;}
+.text-detial-content h1,.text-detial-content h2,.text-detial-content h3,.text-detial-content h4,.text-detial-content h5{margin-top:10px;}
+.text-detial-content a{color:#186AF2; font-style:italic;}
+.text-detial-content a:hover{text-decoration:underline;}
+
+.text-detial-content p code,.blog-detial-content pre{margin:0 3px;font-size: 14px; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; background: #f6f6f6; padding: 10px; border-radius: 2px;}
+.text-detial-content p code{border: 1px solid #eee;padding: 2px 4px;}
+.text-detial-content table {border-collapse: collapse; border-spacing: 0; display: block; width: 100%; overflow: auto;  word-break: normal;word-break: keep-all; margin-top: 0;margin-bottom: 16px;}
+.text-detial-content table tr {background-color: #fff;border-top: 1px solid #ccc;}
+.text-detial-content table tr:nth-child(2n) {background-color: #f8f8f8;}
+.text-detial-content table td, .blog-detial-content table th { padding: 6px 12px;border: 1px solid #ddd; font-size:14px; }
+.text-detial-content table th {font-weight: 800;}
+.text-detial-content li {list-style: initial;margin-left: 20px;}
+:not(pre)>code[class*=language-], pre[class*=language-]{background:#fff!important;border:1px solid #e8e8e8!important; border-radius:3px;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-5">
+	<h1 style="font-size:20px">{$detail.name}</h1>
+	<div class="text-detial-ops">
+		<span>发表于：{$detail.create_time | date='Y-m-d H:i:s'}</span>
+		<span>发布人：{$detail.admin_name}</span>
+	</div>
+	<div class="text-detial-content">
+	{$detail.content|raw}
+	</div>
+	{notempty name="$detail.file_ids"}
+	<h3 class="py-3">相关附件</h3>
+	<div class="layui-row">
+		{volist name="$detail.file_array" id="vo"}
+		<div class="layui-col-md4">{:file_card($vo,'view')}</div>
+		{/volist}
+	</div>
+	{/notempty}
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script src="{__GOUGU__}/third_party/prism/prism.js"></script>
+<script>
+const moduleInit = ['tool'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool;	
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/exception/Http.php b/app/exception/Http.php
new file mode 100644
index 0000000000000000000000000000000000000000..25f49894a68ef89e3e319cb666f8c4c2cc8d33d8
--- /dev/null
+++ b/app/exception/Http.php
@@ -0,0 +1,29 @@
+<?php
+namespace app\exception;
+
+use think\exception\Handle;
+use think\exception\HttpException;
+use think\exception\ValidateException;
+use think\Response;
+use Throwable;
+
+class Http extends Handle
+{
+	public function render($request, Throwable $e): Response
+    {
+        // 参数验证错误
+        if ($e instanceof ValidateException) {
+            //return json($e->getError(), 422);
+			to_assign(1, $e->getError(), [], '', 422);
+        }
+
+        // 请求异常
+        if ($e instanceof HttpException && $request->isAjax()) {
+            //return response($e->getMessage(), $e->getStatusCode());
+			to_assign(1, $e->getMessage(), [], '', $e->getStatusCode());
+        }
+
+        // 其他错误交给系统处理
+        return parent::render($request, $e);
+    }
+}
\ No newline at end of file
diff --git a/app/finance/common.php b/app/finance/common.php
new file mode 100644
index 0000000000000000000000000000000000000000..75c583f2e988a391c8015e3f2b3f9b80b3c54476
--- /dev/null
+++ b/app/finance/common.php
@@ -0,0 +1,66 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+use think\facade\Db;
+
+//是否是报销打款管理员,count>1即有权限
+function isAuthExpense($uid)
+{
+	if($uid == 1){
+		return 1;
+	}
+	$map = [];
+	$map[] = ['name', '=', 'finance_admin'];
+	$map[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',conf_1)")];
+    $count = Db::name('DataAuth')->where($map)->count();
+    return $count;
+}
+
+//是否是发票管理员,count>1即有权限
+function isAuthInvoice($uid)
+{
+	if($uid == 1){
+		return 1;
+	}
+	$map = [];
+	$map[] = ['name', '=', 'finance_admin'];
+	$map[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',conf_2)")];
+    $count = Db::name('DataAuth')->where($map)->count();
+    return $count;
+}
+
+//是否是到账管理员,count>1即有权限
+function isAuthIncome($uid)
+{
+	if($uid == 1){
+		return 1;
+	}
+	$map = [];
+	$map[] = ['name', '=', 'finance_admin'];
+	$map[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',conf_3)")];
+    $count = Db::name('DataAuth')->where($map)->count();
+    return $count;
+}
+
+//是否是付款管理员,count>1即有权限
+function isAuthPayment($uid)
+{
+	if($uid == 1){
+		return 1;
+	}
+	$map = [];
+	$map[] = ['name', '=', 'finance_admin'];
+	$map[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',conf_4)")];
+    $count = Db::name('DataAuth')->where($map)->count();
+    return $count;
+}
\ No newline at end of file
diff --git a/app/finance/controller/Api.php b/app/finance/controller/Api.php
new file mode 100644
index 0000000000000000000000000000000000000000..e7b1c5e21af44e8b54d90a90a9f771eb9c01eded
--- /dev/null
+++ b/app/finance/controller/Api.php
@@ -0,0 +1,241 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+declare (strict_types = 1);
+namespace app\finance\controller;
+
+use app\api\BaseController;
+use app\finance\model\Expense;
+use app\finance\model\Invoice;
+use app\finance\model\InvoiceIncome;
+use app\finance\model\Ticket;
+use app\finance\model\TicketPayment;
+use think\facade\Db;
+use think\facade\View;
+
+class Api extends BaseController
+{
+    //删除报销项
+    public function del_expense_interfix()
+    {
+        $id = get_params("id");
+        $admin_id = Db::name('ExpenseInterfix')->where('id', $id)->value('admin_id');
+        if ($admin_id == $this->uid) {
+            if (Db::name('ExpenseInterfix')->where('id', $id)->delete() !== false) {
+                return to_assign(0, "删除成功");
+            } else {
+                return to_assign(1, "删除失败");
+            }
+        } else {
+            return to_assign(1, "您不是申请人，没权限删除该报销数据");
+        }
+    }
+	
+	//报销设置为已打款
+    public function topay()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+			$auth = isAuthExpense($this->uid);
+			if($auth == 0){
+				return to_assign(1, "你没有打款权限，请联系管理员或者HR");
+			}
+			//打款，数据操作
+            $param['pay_status'] = 1;
+            $param['pay_admin_id'] = $this->uid;
+            $param['pay_time'] = time();
+            $res = Expense::where('id', $param['id'])->strict(false)->field(true)->update($param);
+            if ($res !== false) {
+				add_log('topay', $param['id'],$param,'报销');
+				//发送消息通知
+				$detail = Expense::where(['id' => $param['id']])->find();
+				$msg=[
+					'from_uid'=>$this->uid,//发送人
+					'to_uids'=>$detail['admin_id'],//接收人
+					'template_id'=>'expense_pay',//消息模板标识
+					'content'=>[ //消息内容
+						'create_time'=>date('Y-m-d H:i:s'),
+						'action_id'=>$detail['id'],
+						'title' => '报销'
+					]
+				];
+				event('SendMessage',$msg);
+                return to_assign();
+            } else {
+                return to_assign(1, "操作失败");
+            }
+        }
+    }
+	
+    //开具发票
+    public function open()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+			$auth = isAuthInvoice($this->uid);
+			if($auth == 0){
+				return to_assign(1, "你没有开票权限，请联系管理员或者HR");
+			}
+			$status = Invoice::where(['id' => $param['id']])->value('check_status');
+            if ($status == 2) {
+                $param['open_status'] = 1;
+                $param['open_admin_id'] = $this->uid;
+            }
+			if(isset($param['open_time'])){
+				$param['open_time'] = strtotime(urldecode($param['open_time']));
+			}
+            $res = Invoice::where('id', $param['id'])->strict(false)->field('code,open_status,open_time,open_admin_id,delivery')->update($param);
+            if ($res !== false) {
+				add_log('open', $param['id'],$param,'发票');
+                return to_assign();
+            } else {
+                return to_assign(1, "操作失败");
+            }
+        }
+    }
+	
+    //作废发票
+    public function tovoid()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+			$auth = isAuthInvoice($this->uid);
+			if($auth == 0){
+				return to_assign(1, "你没有作废发票权限，请联系管理员或者HR");
+			}
+			$count = InvoiceIncome::where(['invoice_id'=>$param['id'],'status'=>1])->count();
+			if($count>0){
+				return to_assign(1, "发票已经新增有回款记录，请先反回款后再作废发票");
+			}
+			else{
+				$param['update_time'] = time();
+				$param['open_status'] = 2;
+			}
+            $res = Invoice::where('id', $param['id'])->strict(false)->field('update_time,open_status')->update($param);
+            if ($res !== false) {
+                return to_assign();
+                add_log('tovoid', $param['id'],$param,'发票');
+            } else {
+                return to_assign(1, "操作失败");
+            }
+        }
+    }
+
+    //反作废发票
+    public function novoid()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+			$auth = isAuthInvoice($this->uid);
+			if($auth == 0){
+				return to_assign(1, "你没有反作废发票权限，请联系管理员或者HR");
+			}
+			$param['open_status'] = 1;
+			$param['update_time'] = time();
+            $res = Invoice::where('id', $param['id'])->strict(false)->field('update_time,open_status')->update($param);
+            if ($res !== false) {
+                return to_assign();
+				add_log('novoid', $param['id'],$param,'发票');
+            } else {
+                return to_assign(1, "操作失败");
+            }
+        }
+    }
+	
+    //上传电子发票
+    public function upload_invoice()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+			$auth = isAuthInvoice($this->uid);
+			if($auth == 0){
+				return to_assign(1, "你没有开票权限，请联系管理员或者HR");
+			}
+			$param['update_time'] = time();
+            $res = Invoice::where('id', $param['id'])->strict(false)->field('update_time,other_file_ids')->update($param);
+            if ($res !== false) {
+                return to_assign();
+            } else {
+                return to_assign(1, "操作失败");
+            }
+        }
+    }
+	
+	
+    //作废收票
+    public function tovoid_ticket()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+			$auth = isAuthInvoice($this->uid);
+			if($auth == 0){
+				return to_assign(1, "你没有作废发票权限，请联系管理员或者HR");
+			}
+			$count = TicketPayment::where(['ticket_id'=>$param['id'],'status'=>1])->count();
+			if($count>0){
+				return to_assign(1, "发票已经新增有付款记录，请先反付款后再作废发票");
+			}
+			else{
+				$param['update_time'] = time();
+				$param['open_status'] = 2;
+			}
+            $res = Ticket::where('id', $param['id'])->strict(false)->field('update_time,open_status')->update($param);
+            if ($res !== false) {
+                return to_assign();
+                add_log('tovoid', $param['id'],$param,'发票');
+            } else {
+                return to_assign(1, "操作失败");
+            }
+        }
+    }
+
+    //反作废收票
+    public function novoid_ticket()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+			$auth = isAuthInvoice($this->uid);
+			if($auth == 0){
+				return to_assign(1, "你没有反作废发票权限，请联系管理员或者HR");
+			}
+			$param['open_status'] = 1;
+			$param['update_time'] = time();
+            $res = Ticket::where('id', $param['id'])->strict(false)->field('update_time,open_status')->update($param);
+            if ($res !== false) {
+                return to_assign();
+				add_log('novoid', $param['id'],$param,'发票');
+            } else {
+                return to_assign(1, "操作失败");
+            }
+        }
+    }
+	
+    //上传
+    public function upload_ticket()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+			$auth = isAuthInvoice($this->uid);
+			if($auth == 0){
+				return to_assign(1, "你没有发票权限，请联系管理员或者HR");
+			}
+			$param['update_time'] = time();
+            $res = Ticket::where('id', $param['id'])->strict(false)->field('update_time,other_file_ids')->update($param);
+            if ($res !== false) {
+                return to_assign();
+            } else {
+                return to_assign(1, "操作失败");
+            }
+        }
+    }
+
+}
diff --git a/app/finance/controller/Costcate.php b/app/finance/controller/Costcate.php
new file mode 100644
index 0000000000000000000000000000000000000000..07d16a70d2a2728d56d565c7c9f940be44340dde
--- /dev/null
+++ b/app/finance/controller/Costcate.php
@@ -0,0 +1,141 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\finance\controller;
+
+use app\base\BaseController;
+use app\finance\model\CostCate as CostCateModel;
+use app\finance\validate\CostcateValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Costcate extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new CostCateModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+            $list = $this->model->where('delete_time',0)->select();
+            return to_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {		
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(CostcateValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(CostcateValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getCateById($id);
+				View::assign('detail', $detail);
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			View::assign('detail', $detail);
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		if (request()->isDelete()) {
+			$param = get_params();
+			$id = isset($param['id']) ? $param['id'] : 0;
+			$type = isset($param['type']) ? $param['type'] : 0;
+			$this->model->delById($id,$type);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+
+    /**
+    * 设置
+    */
+    public function set()
+    {
+		if (request()->isAjax()) {
+			$param = get_params();
+			$res = $this->model->strict(false)->field('id,status')->update($param);
+			if ($res) {
+				if($param['status'] == 0){
+					add_log('disable', $param['id'], $param);
+				}
+				else if($param['status'] == 1){
+					add_log('recovery', $param['id'], $param);
+				}
+				return to_assign();
+			}
+			else{
+				return to_assign(0, '操作失败');
+			}
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+   
+
+}
diff --git a/app/finance/controller/Expense.php b/app/finance/controller/Expense.php
new file mode 100644
index 0000000000000000000000000000000000000000..b25eed495ba1fe29cfcec970ca7d1b0b56c89132
--- /dev/null
+++ b/app/finance/controller/Expense.php
@@ -0,0 +1,251 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\finance\controller;
+
+use app\base\BaseController;
+use app\finance\model\Expense as ExpenseModel;
+use app\finance\validate\ExpenseValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Expense extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new ExpenseModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			$tab = isset($param['tab']) ? $param['tab'] : 0;
+			$uid = $this->uid;
+            $where = array();
+            $whereOr = array();
+			$where[]=['delete_time','=',0];
+			if($tab == 0){
+				//全部
+				$whereOr[] = ['admin_id', '=', $this->uid];
+				$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
+				$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
+				$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_copy_uids)")];
+				$auth = isAuthExpense($uid);
+				if($auth == 0){
+					$dids_a = get_leader_departments($uid);	
+					$dids_b = get_role_departments($uid);
+					$dids = array_merge($dids_a, $dids_b);
+					if(!empty($dids)){
+						$whereOr[] = ['did','in',$dids];
+					}
+				}
+			}
+			if($tab == 1){
+				//我创建的
+				$where[] = ['admin_id', '=', $this->uid];
+			}
+			if($tab == 2){
+				//待我审核的
+				$where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
+			}
+			if($tab == 3){
+				//我已审核的
+				$where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
+			}
+			if($tab == 4){
+				//抄送给我的
+				$where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_copy_uids)")];
+			}
+			if($tab == 5){
+				//已打款的
+				$where[] = ['pay_status', '=', 1];
+				$auth = isAuthExpense($uid);
+				if($auth == 0){
+					$dids_a = get_leader_departments($uid);	
+					$dids_b = get_role_departments($uid);
+					$dids = array_merge($dids_a, $dids_b);
+					if(!empty($dids)){
+						$whereOr[] = ['did','in',$dids];
+					}
+				}
+			}
+			//按时间检索
+			if (!empty($param['diff_time'])) {
+				$diff_time =explode('~', $param['diff_time']);
+				$where[] = ['income_month', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]];
+			}
+            if (isset($param['pay_status']) && $param['pay_status'] != "") {
+                $where[] = ['pay_status', '=', $param['pay_status']];
+            }
+			if (isset($param['check_status']) && $param['check_status'] != "") {
+                $where[] = ['check_status', '=', $param['check_status']];
+            }
+            $list = $this->model->datalist($param,$where,$whereOr);
+            return table_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {
+			$param['income_month'] = isset($param['income_month']) ? strtotime(urldecode($param['income_month'])) : 0;
+            $param['expense_time'] = isset($param['expense_time']) ? strtotime(urldecode($param['expense_time'])) : 0;
+			$amountData = isset($param['amount']) ? $param['amount'] : '0';
+			$cost = 0;
+			if ($amountData == 0) {
+				return to_assign(1,'报销金额不完善');
+			}
+			else{
+				foreach ($amountData as $key => $value) {
+					if ($value == 0) {
+						return to_assign(1,'第' . ($key + 1) . '条报销选项的金额不能为零');
+					}
+					else{
+						$cost+=$value;
+					}
+				}
+			}
+			if($cost==0){
+				return to_assign(1,'报销金额不能为零');
+			}
+			$param['admin_id'] = $this->uid;
+			$param['did'] = $this->did;
+			$param['cost'] = $cost;
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(ExpenseValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(ExpenseValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			$is_codeno = Db::name('DataAuth')->where('name','finance_admin')->value('conf_10');
+			View::assign('is_codeno', $is_codeno);
+            View::assign('expense_cate', Db::name('ExpenseCate')->where(['status' => 1])->select()->toArray());
+			View::assign('user', get_admin($this->uid));
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				View::assign('detail', $detail);
+				if(is_mobile()){
+					return view('qiye@/finance/add_expense');
+				}
+				return view('edit');
+			}
+			$codeno='';
+			if($is_codeno==1){
+				$codeno = get_codeno(3);
+			}
+            View::assign('codeno', $codeno);
+			if(is_mobile()){
+				return view('qiye@/finance/add_expense');
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+			$detail['file_array'] = $file_array;
+			View::assign('detail', $detail);
+			View::assign('create_user', get_admin($detail['admin_id']));
+			if(is_mobile()){
+				return view('qiye@/finance/view_expense');
+			}
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		$param = get_params();
+		$id = isset($param['id']) ? $param['id'] : 0;
+		if (request()->isDelete()) {
+			$this->model->delById($id);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }   
+	
+	//报销记录
+    public function record()
+    {
+        if (request()->isAjax()) {
+			$param = get_params();
+			$where = [];
+			$where[]=['delete_time','=',0];
+			$where[]=['check_status','=',2];
+			if(isAuthExpense($this->uid)==0){
+				$where[] = ['admin_id', '=', $this->uid];
+			}
+			//按时间检索
+			if (!empty($param['diff_time'])) {
+				$diff_time =explode('~', $param['diff_time']);
+				$where[] = ['expense_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]];
+			}
+            if (isset($param['pay_status']) && $param['pay_status'] != "") {
+                $where[] = ['pay_status', '=', $param['pay_status']];
+            }
+			$list = $this->model->datalist($param,$where);
+			
+			$cost = $this->model::where($where)->sum('cost');					
+			$totalRow['cost'] = sprintf("%.2f",$cost);
+            return table_assign(0, '', $list);
+        } else {
+			View::assign('authExpense',isAuthExpense($this->uid));
+            return view();
+        }
+    }
+
+}
diff --git a/app/finance/controller/Expensecate.php b/app/finance/controller/Expensecate.php
new file mode 100644
index 0000000000000000000000000000000000000000..25693cbbb37148c8f276d339fbb083a3f409e5a6
--- /dev/null
+++ b/app/finance/controller/Expensecate.php
@@ -0,0 +1,141 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\finance\controller;
+
+use app\base\BaseController;
+use app\finance\model\ExpenseCate as ExpenseCateModel;
+use app\finance\validate\ExpensecateValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Expensecate extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new ExpenseCateModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+            $list = $this->model->where('delete_time',0)->select();
+            return to_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {		
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(ExpensecateValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(ExpensecateValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getCateById($id);
+				View::assign('detail', $detail);
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			View::assign('detail', $detail);
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		if (request()->isDelete()) {
+			$param = get_params();
+			$id = isset($param['id']) ? $param['id'] : 0;
+			$type = isset($param['type']) ? $param['type'] : 0;
+			$this->model->delById($id,$type);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+
+    /**
+    * 设置
+    */
+    public function set()
+    {
+		if (request()->isAjax()) {
+			$param = get_params();
+			$res = $this->model->strict(false)->field('id,status')->update($param);
+			if ($res) {
+				if($param['status'] == 0){
+					add_log('disable', $param['id'], $param);
+				}
+				else if($param['status'] == 1){
+					add_log('recovery', $param['id'], $param);
+				}
+				return to_assign();
+			}
+			else{
+				return to_assign(0, '操作失败');
+			}
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+   
+
+}
diff --git a/app/finance/controller/Income.php b/app/finance/controller/Income.php
new file mode 100644
index 0000000000000000000000000000000000000000..3b8cf3f40b31f1fa0f9ae10eb81388975312d665
--- /dev/null
+++ b/app/finance/controller/Income.php
@@ -0,0 +1,288 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\finance\controller;
+
+use app\base\BaseController;
+use app\finance\model\Invoice as InvoiceModel;
+use app\finance\model\InvoiceIncome;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Income extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new InvoiceModel();
+    }
+	
+    public function datalist()
+    {
+		$uid = $this->uid;
+		$auth = isAuthIncome($uid);
+        if (request()->isAjax()) {
+            $param = get_params();
+            $where = array();
+            $whereOr = array();
+            $where[] = ['delete_time', '=', 0];
+            $where[] = ['check_status', '=', 2];
+            $where[] = ['open_status', '=', 1];
+			$where[] = ['invoice_type','>',0];
+			if($auth == 0){
+				$whereOr[] = ['admin_id','=',$this->uid];
+				$dids_a = get_leader_departments($uid);	
+				$dids_b = get_role_departments($uid);
+				$dids = array_merge($dids_a, $dids_b);
+				if(!empty($dids)){
+					$whereOr[] = ['did','in',$dids];
+				}
+			}
+			//按时间检索
+			if (!empty($param['diff_time'])) {
+				$diff_time =explode('~', $param['diff_time']);
+				$where[] = ['enter_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]];
+			}
+            if (isset($param['enter_status']) && $param['enter_status']!='') {
+                $where[] = ['enter_status', '=', $param['enter_status']];
+            }
+			$list = $this->model->datalist($param,$where,$whereOr);
+            return table_assign(0, '', $list);
+        } else {
+			View::assign('auth', $auth);
+            return view();
+        }
+    }
+
+    //查看
+    public function add()
+    {
+        $param = get_params();
+		$auth = isAuthIncome($this->uid);
+        if (request()->isAjax()) {   
+			if($auth == 0){
+				return to_assign(1, "你没有到账管理权限，请联系管理员或者HR");
+			}
+            $invoice_id = $param['invoice_id'];   
+            $admin_id = $this->uid;
+            //计算已到账的金额
+            $hasIncome = InvoiceIncome::where(['invoice_id'=>$invoice_id,'status'=>1])->sum('amount');
+            //查询发票金额
+            $invoiceAmount = $this->model->where(['id'=>$invoice_id])->value('amount');
+            if($param['enter_type']==1){ //单个到账记录
+                //相关内容多个数组
+                $enterPriceData=isset($param['amount'])? $param['amount'] : '';
+                $enterTimeData=isset($param['enter_time'])? $param['enter_time'] : '';
+                $remarksData=isset($param['remarks'])? $param['remarks'] : '';
+
+                //把合同协议关联的单个内容的发票入账明细重新添加
+                if($enterPriceData){
+                    $enter_price = 0;
+                    $insert = [];
+		            $time = time();
+                    foreach ($enterPriceData as $key => $value) {
+                        if (!$value ) continue;
+                        $insert[] = [
+                            'invoice_id' => $invoice_id,
+						    'amount' 	=> $value,
+						    'enter_time' => $enterTimeData[$key]? strtotime($enterTimeData[$key]) : 0,
+						    'remarks' 	    => $remarksData[$key],
+						    'admin_id' 	    => $admin_id,
+						    'create_time'		=> $time
+						];
+                        $enter_price += $value*100;
+                    }
+                    if(($enter_price + $hasIncome*100)> $invoiceAmount*100){
+                        return to_assign(1,'到账金额大于发票金额，不允许保存');
+                    }
+                    else{
+                        $res = InvoiceIncome::strict(false)->field(true)->insertAll($insert);
+                        if($res!==false){
+                            if(($enter_price + $hasIncome*100) == $invoiceAmount*100){
+                                //发票全部到账
+                                $this->model->where(['id'=>$invoice_id])->update(['enter_status'=>2,'enter_amount'=>$invoiceAmount,'enter_time'=>time()]);
+                            }
+                            else if(($enter_price + $hasIncome*100) < $invoiceAmount*100){
+                                $incomeTotal=($enter_price + $hasIncome*100)/100;
+                                //发票部分到账
+                                $this->model->where(['id'=>$invoice_id])->update(['enter_status'=>1,'enter_amount'=>$incomeTotal,'enter_time'=>time()]);
+                            }
+                            add_log('add',$invoice_id,$param);
+                            return to_assign();
+                        }
+                        else{
+                            return to_assign(1,'保存失败');
+                        }
+                    }
+                }
+                else{
+                    return to_assign(1,'提交的到账数据异常，请核对再提交');
+                }         
+            }
+            else if($param['enter_type']==2){ //全部到账记录
+                $enter_price = ($invoiceAmount*100-$hasIncome*100)/100;
+                $data = [
+                    'invoice_id' => $invoice_id,
+                    'amount' => $enter_price,
+                    'enter_time' => isset($param['enter_time'])? strtotime($param['enter_time']) : 0,
+                    'remarks' => '一次性全部到账',
+                    'admin_id' => $admin_id,
+                    'create_time' => time()
+                ];
+                $res = InvoiceIncome::strict(false)->field(true)->insertGetId($data);
+                if($res!==false){
+                    //设置发票全部到账
+                    $this->model->where(['id'=>$invoice_id])->update(['enter_status'=>2,'enter_amount'=>$invoiceAmount,'enter_time'=>time()]);
+                    add_log('add',$invoice_id,$param);
+                    return to_assign();
+                }
+            }
+            else if ($param['enter_type']==3) {//全部反账记录
+                //作废初始化发票到账数据
+                $res = InvoiceIncome::where(['invoice_id'=>$invoice_id])->update(['status'=>'6','update_time'=>time()]);
+                if($res!==false){
+                    //设置发票全部没到账
+                    $this->model->where(['id'=>$invoice_id])->update(['enter_status'=>0,'enter_amount'=>0,'enter_time'=>0]);
+                    add_log('tovoid',$invoice_id,$param);
+                    return to_assign();
+                }                
+            }
+        }
+        else{
+			if($auth == 0){
+				return view(EEEOR_REPORTING,['code'=>405,'warning'=>'无权限访问']);
+			}
+            $id = isset($param['id']) ? $param['id']: 0 ;
+            $detail = $this->model->getById($id);
+			if(empty($detail)){
+				return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到记录']);
+			}
+			$detail['subject'] = Db::name('Enterprise')->where(['id' =>$detail['invoice_subject']])->value('title');
+			$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+			$detail['file_array'] = $file_array;
+			$other_file_array = Db::name('File')->where('id','in',$detail['other_file_ids'])->select();
+			$detail['other_file_array'] = $other_file_array;
+			if($detail['open_status']>0){
+				$detail['open_admin_name'] = Db::name('Admin')->where('id','=',$detail['open_admin_id'])->value('name');
+			}
+			$not_income =  ($detail['amount']*100 - $detail['enter_amount']*100)/100;
+			$detail['not_income'] = sprintf("%.2f",$not_income);
+			//已到账的记录
+			$detail['income'] = InvoiceIncome::field('i.*,a.name as admin')
+				->alias('i')
+				->join('Admin a', 'a.id = i.admin_id', 'LEFT')
+				->where(['i.invoice_id'=>$id,'i.status'=>1])
+				->order('i.enter_time desc')
+				->select();
+            View::assign('uid', $this->uid);
+            View::assign('id', $id);
+            View::assign('detail', $detail);
+			if($detail['invoice_type'] == 0){
+				return view('add_a');
+			}
+            return view();
+        }
+    }
+    //查看
+    public function view()
+    {
+        $id = empty(get_params('id')) ? 0 : get_params('id');
+        $detail = $this->model->getById($id);
+		if(empty($detail)){
+			throw new \think\exception\HttpException(406, '找不到记录');
+		}
+		$detail['not_income'] =  ($detail['amount']*100 - $detail['enter_amount']*100)/100;
+		//已到账的记录
+		$detail['income'] = InvoiceIncome::field('i.*,a.name as admin')
+			->alias('i')
+			->join('Admin a', 'a.id = i.admin_id', 'LEFT')
+			->where(['i.invoice_id'=>$id,'i.status'=>1])
+			->order('i.enter_time desc')
+			->select();
+			
+		$detail['subject'] = Db::name('Enterprise')->where(['id' =>$detail['invoice_subject']])->value('title');
+		$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+		$detail['file_array'] = $file_array;
+		$other_file_array = Db::name('File')->where('id','in',$detail['other_file_ids'])->select();
+		$detail['other_file_array'] = $other_file_array;
+		if($detail['open_status']>0){
+			$detail['open_admin_name'] = Db::name('Admin')->where('id','=',$detail['open_admin_id'])->value('name');
+		}
+        View::assign('uid', $this->uid);
+        View::assign('detail', $detail);
+		if(is_mobile()){
+			return view('qiye@/finance/view_income');
+		}
+        return view();
+    }
+
+    //删除到账记录
+    public function delete()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+            $income =InvoiceIncome::where(['id'=>$param['id']])->find();
+            $invoice = $this->model->where(['id'=>$income['invoice_id']])->find();
+            if($income){
+                $res = InvoiceIncome::where(['id'=>$param['id']])->update(['status'=>'6','update_time'=>time()]);
+                if($res!==false){
+                    if($income['amount']*100 == $invoice['amount']*100){
+                        //发票全部反到账
+                        $this->model->where(['id'=>$income['invoice_id']])->update(['enter_status'=>0,'enter_amount'=>0,'enter_time'=>0]);
+                    }
+                    else if($income['amount']*100 < $invoice['amount']*100){
+                        $incomeTotal=InvoiceIncome::where(['invoice_id'=>$income['invoice_id'],'status'=>1])->sum('amount');
+                        //发票部分到账
+                        $this->model->where(['id'=>$income['invoice_id']])->update(['enter_status'=>1,'enter_amount'=>$incomeTotal,'enter_time'=>time()]);
+                    }
+                    add_log('enter',$income['invoice_id'],$invoice);
+                    return to_assign();
+                }
+                else{
+                    return to_assign(1,'操作失败');
+                }
+            }
+        }
+    }
+	
+	
+	//回款记录
+    public function record()
+    {
+        if (request()->isAjax()) {
+			$param = get_params();
+			$where = [];
+			$where[]=['status','=',1];
+			//按时间检索
+			if (!empty($param['diff_time'])) {
+				$diff_time =explode('~', $param['diff_time']);
+				$where[] = ['enter_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]];
+			}
+			$model = new InvoiceIncome();
+			$list = $model->datalist($param,$where);
+			
+			$amount = $model::where($where)->sum('amount');					
+			$totalRow['amount'] = sprintf("%.2f",$amount);
+            return table_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+}
diff --git a/app/finance/controller/Invoice.php b/app/finance/controller/Invoice.php
new file mode 100644
index 0000000000000000000000000000000000000000..aa982924266c3167b608389f11fdcbd5462654b2
--- /dev/null
+++ b/app/finance/controller/Invoice.php
@@ -0,0 +1,382 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\finance\controller;
+
+use app\base\BaseController;
+use app\finance\model\Invoice as InvoiceModel;
+use app\finance\validate\InvoiceValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Invoice extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new InvoiceModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			$tab = isset($param['tab']) ? $param['tab'] : 0;
+			$uid=$this->uid;
+            $where = array();
+            $whereOr = array();
+			$where[]=['delete_time','=',0];
+			$where[]=['invoice_type','>',0];
+			if($tab == 0){
+				//全部
+				$whereOr[] = ['admin_id', '=', $this->uid];
+				$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
+				$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
+				$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_copy_uids)")];
+				$auth = isAuthInvoice($uid);
+				if($auth == 0){
+					$dids_a = get_leader_departments($uid);	
+					$dids_b = get_role_departments($uid);
+					$dids = array_merge($dids_a, $dids_b);
+					if(!empty($dids)){
+						$whereOr[] = ['did','in',$dids];
+					}
+				}
+			}
+			if($tab == 1){
+				//我创建的
+				$where[] = ['admin_id', '=', $this->uid];
+			}
+			if($tab == 2){
+				//待我审核的
+				$where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
+			}
+			if($tab == 3){
+				//我已审核的
+				$where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
+			}
+			if($tab == 4){
+				//抄送给我的
+				$where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_copy_uids)")];
+			}
+			if($tab == 5){
+				//已开具的
+				$where[] = ['open_status', '=', 1];
+			}
+			if($tab == 6){
+				//已作废的
+				$where[] = ['open_status', '=', 2];
+			}
+			//按时间检索
+			if (!empty($param['diff_time'])) {
+				$diff_time =explode('~', $param['diff_time']);
+				$where[] = ['open_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]];
+			}
+            if (isset($param['open_status']) && $param['open_status'] != "") {
+                $where[] = ['open_status', '=', $param['open_status']];
+            }
+            if (isset($param['enter_status']) && $param['enter_status'] != "") {
+                $where[] = ['enter_status', '=', $param['enter_status']];
+            }
+			if (isset($param['check_status']) && $param['check_status'] != "") {
+                $where[] = ['check_status', '=', $param['check_status']];
+            }
+            $list = $this->model->datalist($param,$where,$whereOr);
+            return table_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {
+            if ($param['types'] == 1) {
+                if (!$param['invoice_bank']) {
+                    return to_assign(1, '开户银行不能为空');
+                }
+                if (!$param['invoice_account']) {
+                    return to_assign(1, '银行账号不能为空');
+                }
+            }
+			$param['admin_id'] = $this->uid;
+			$param['did'] = $this->did;
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(InvoiceValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(InvoiceValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				View::assign('detail', $detail);
+				if(is_mobile()){
+					return view('qiye@/finance/add_invoice');
+				}
+				return view('edit');
+			}
+			if(is_mobile()){
+				return view('qiye@/finance/add_invoice');
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			$detail['subject'] = Db::name('Enterprise')->where(['id' =>$detail['invoice_subject']])->value('title');
+			$other_file_array = Db::name('File')->where('id','in',$detail['other_file_ids'])->select();
+			$detail['other_file_array'] = $other_file_array;
+			if($detail['open_status']>0){
+				$detail['open_admin_name'] = Db::name('Admin')->where('id','=',$detail['open_admin_id'])->value('name');
+			}
+			View::assign('detail', $detail);
+			View::assign('create_user', get_admin($detail['admin_id']));
+			if(is_mobile()){
+				return view('qiye@/finance/view_invoice');
+			}
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		$param = get_params();
+		$id = isset($param['id']) ? $param['id'] : 0;
+		if (request()->isDelete()) {
+			$this->model->delById($id);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }  
+	
+	//开票记录
+    public function record()
+    {
+		$uid = $this->uid;
+		$auth = isAuthInvoice($uid);
+        if (request()->isAjax()) {
+			$param = get_params();
+			$tab = isset($param['tab']) ? $param['tab'] : 0;
+			$where = [];
+			$whereOr = [];
+			$where[]=['delete_time','=',0];
+			$where[]=['check_status','=',2];
+			$where[]=['invoice_type','>',0];
+			if($auth == 0){
+				$dids_a = get_leader_departments($uid);	
+				$dids_b = get_role_departments($uid);
+				$dids = array_merge($dids_a, $dids_b);
+				if(!empty($dids)){
+					$whereOr[] = ['did','in',$dids];
+				}
+			}
+			if($tab == 0){
+				//正常的
+				$where[] = ['open_status', '<', 2];
+			}
+			if($tab == 1){
+				//已作废的
+				$where[] = ['open_status', '=', 2];
+			}
+			//按时间检索
+			if (!empty($param['diff_time'])) {
+				$diff_time =explode('~', $param['diff_time']);
+				$where[] = ['open_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]];
+			}
+            if (isset($param['open_status']) && $param['open_status'] != "") {
+                $where[] = ['open_status', '=', $param['open_status']];
+            }
+			$list = $this->model->datalist($param,$where,$whereOr);
+			
+			$amount = $this->model::where($where)->where(function ($query) use($whereOr) {
+				if (!empty($whereOr)){
+					$query->whereOr($whereOr);
+				}
+			})->sum('amount');					
+			$totalRow['amount'] = sprintf("%.2f",$amount);
+            return table_assign(0, '', $list);
+        } else {
+			
+			View::assign('authInvoice', $auth);
+            return view();
+        }
+    }
+	
+	
+   /**
+    * 无发票回款列表
+    */
+    public function datalist_a()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			$uid=$this->uid;
+            $where = array();
+            $whereOr = array();
+			$where[]=['delete_time','=',0];
+			$where[]=['invoice_type','=',0];
+			
+			$whereOr[] = ['admin_id', '=', $this->uid];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_copy_uids)")];
+			$auth = isAuthInvoice($uid);
+			if($auth == 0){
+				$dids_a = get_leader_departments($uid);	
+				$dids_b = get_role_departments($uid);
+				$dids = array_merge($dids_a, $dids_b);
+				if(!empty($dids)){
+					$whereOr[] = ['did','in',$dids];
+				}
+			}
+			//按时间检索
+			if (!empty($param['diff_time'])) {
+				$diff_time =explode('~', $param['diff_time']);
+				$where[] = ['enter_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]];
+			}
+            if (isset($param['enter_status']) && $param['enter_status'] != "") {
+                $where[] = ['enter_status', '=', $param['enter_status']];
+            }
+			if (isset($param['check_status']) && $param['check_status'] != "") {
+                $where[] = ['check_status', '=', $param['check_status']];
+            }
+            $list = $this->model->datalist($param,$where,$whereOr);
+            return table_assign(0, '', $list);
+        }
+        else{
+			View::assign('auth', isAuthIncome($this->uid));
+            return view();
+        }
+    }
+	
+    /**
+    * 无发票添加/编辑
+    */
+    public function add_a()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {
+			$param['admin_id'] = $this->uid;
+			$param['did'] = $this->did;
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(InvoiceValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(InvoiceValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				View::assign('detail', $detail);
+				if(is_mobile()){
+					return view('qiye@/finance/add_invoice_a');
+				}
+				return view('edit_a');
+			}
+			if(is_mobile()){
+				return view('qiye@/finance/add_invoice_a');
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 无发票查看
+    */
+    public function view_a($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			$detail['subject'] = Db::name('Enterprise')->where(['id' =>$detail['invoice_subject']])->value('title');
+			$other_file_array = Db::name('File')->where('id','in',$detail['other_file_ids'])->select();
+			$detail['other_file_array'] = $other_file_array;
+			if($detail['open_status']>0){
+				$detail['open_admin_name'] = Db::name('Admin')->where('id','=',$detail['open_admin_id'])->value('name');
+			}
+			View::assign('detail', $detail);
+			View::assign('create_user', get_admin($detail['admin_id']));
+			if(is_mobile()){
+				return view('qiye@/finance/view_invoice_a');
+			}
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del_a($id)
+    {
+		if (request()->isDelete()) {
+			$this->model->delById($id);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+
+}
diff --git a/app/finance/controller/Payment.php b/app/finance/controller/Payment.php
new file mode 100644
index 0000000000000000000000000000000000000000..f5e30ab56748337c0af9f699bf5da0ca6fd3f3ff
--- /dev/null
+++ b/app/finance/controller/Payment.php
@@ -0,0 +1,281 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\finance\controller;
+
+use app\base\BaseController;
+use app\finance\model\Ticket as TicketModel;
+use app\finance\model\TicketPayment;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Payment extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new TicketModel();
+    }
+	
+    public function datalist()
+    {
+		$auth = isAuthPayment($this->uid);
+        if (request()->isAjax()) {
+            $param = get_params();
+            $where = array();
+            $whereOr = array();
+            $where[] = ['delete_time', '=', 0];
+            $where[] = ['check_status', '=', 2];
+            $where[] = ['open_status', '=', 1];
+			$where[] = ['invoice_type','>',0];
+			//按时间检索
+			if (!empty($param['diff_time'])) {
+				$diff_time =explode('~', $param['diff_time']);
+				$where[] = ['pay_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]];
+			}
+            if (isset($param['pay_status']) && $param['pay_status']!='') {
+                $where[] = ['pay_status', '=', $param['pay_status']];
+            }
+			if($auth == 0){
+				$where[] = ['admin_id','=',$this->uid];
+			}
+			$list = $this->model->datalist($param,$where,$whereOr);
+            return table_assign(0, '', $list);
+        } else {
+			View::assign('auth', $auth);
+            return view();
+        }
+    }
+
+    //查看
+    public function add()
+    {
+        $param = get_params();
+		$auth = isAuthPayment($this->uid);
+        if (request()->isAjax()) {   
+			if($auth == 0){
+				return to_assign(1, "你没有付款管理权限，请联系管理员或者HR");
+			}
+            $ticket_id = $param['ticket_id'];   
+            $admin_id = $this->uid;
+            //计算已付款的金额
+            $hasPay = TicketPayment::where(['ticket_id'=>$ticket_id,'status'=>1])->sum('amount');
+            //查询发票金额
+            $ticketAmount = $this->model->where(['id'=>$ticket_id])->value('amount');
+            if($param['pay_type']==1){ //单个付款记录
+                //相关内容多个数组
+                $payPriceData=isset($param['amount'])? $param['amount'] : '';
+                $payTimeData=isset($param['pay_time'])? $param['pay_time'] : '';
+                $remarksData=isset($param['remarks'])? $param['remarks'] : '';
+
+                //把合同协议关联的单个内容的发票入账明细重新添加
+                if($payPriceData){
+                    $pay_price = 0;
+                    $insert = [];
+		            $time = time();
+                    foreach ($payPriceData as $key => $value) {
+                        if (!$value ) continue;
+                        $insert[] = [
+                            'ticket_id' => $ticket_id,
+						    'amount' 	=> $value,
+						    'pay_time' => $payTimeData[$key]? strtotime($payTimeData[$key]) : 0,
+						    'remarks' 	    => $remarksData[$key],
+						    'admin_id' 	    => $admin_id,
+						    'create_time'		=> $time
+						];
+                        $pay_price += $value*100;
+                    }
+                    if(($pay_price + $hasPay*100)> $ticketAmount*100){
+                        return to_assign(1,'付款金额大于发票金额，不允许保存');
+                    }
+                    else{
+                        $res = TicketPayment::strict(false)->field(true)->insertAll($insert);
+                        if($res!==false){
+                            if(($pay_price + $hasPay*100) == $ticketAmount*100){
+                                //发票全部付款
+                                $this->model->where(['id'=>$ticket_id])->update(['pay_status'=>2,'pay_amount'=>$ticketAmount,'pay_time'=>time()]);
+                            }
+                            else if(($pay_price + $hasPay*100) < $ticketAmount*100){
+                                $payTotal=($pay_price + $hasPay*100)/100;
+                                //发票部分付款
+                                $this->model->where(['id'=>$ticket_id])->update(['pay_status'=>1,'pay_amount'=>$payTotal,'pay_time'=>time()]);
+                            }
+                            add_log('add',$ticket_id,$param);
+                            return to_assign();
+                        }
+                        else{
+                            return to_assign(1,'保存失败');
+                        }
+                    }
+                }
+                else{
+                    return to_assign(1,'提交的付款数据异常，请核对再提交');
+                }         
+            }
+            else if($param['pay_type']==2){ //全部付款记录
+                $pay_price = ($ticketAmount*100-$hasPay*100)/100;
+                $data = [
+                    'ticket_id' => $ticket_id,
+                    'amount' => $pay_price,
+                    'pay_time' => isset($param['pay_time'])? strtotime($param['pay_time']) : 0,
+                    'remarks' => '一次性全部付款',
+                    'admin_id' => $admin_id,
+                    'create_time' => time()
+                ];
+                $res = TicketPayment::strict(false)->field(true)->insertGetId($data);
+                if($res!==false){
+                    //设置发票全部付款
+                    $this->model->where(['id'=>$ticket_id])->update(['pay_status'=>2,'pay_amount'=>$ticketAmount,'pay_time'=>time()]);
+                    add_log('add',$ticket_id,$param);
+                    return to_assign();
+                }
+            }
+            else if ($param['pay_type']==3) {//全部反账记录
+                //作废初始化发票付款数据
+                $res = TicketPayment::where(['ticket_id'=>$ticket_id])->update(['status'=>'6','update_time'=>time()]);
+                if($res!==false){
+                    //设置发票全部没付款
+                    $this->model->where(['id'=>$ticket_id])->update(['pay_status'=>0,'pay_amount'=>0,'pay_time'=>0]);
+                    add_log('tovoid',$ticket_id,$param);
+                    return to_assign();
+                }                
+            }
+        }
+        else{
+			if($auth == 0){
+				return view(EEEOR_REPORTING,['code'=>405,'warning'=>'无权限访问']);
+			}
+            $id = isset($param['id']) ? $param['id']: 0 ;
+            $detail = $this->model->getById($id);
+			if(empty($detail)){
+				return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到记录']);
+			}
+			$detail['subject'] = Db::name('Enterprise')->where(['id' =>$detail['invoice_subject']])->value('title');
+			$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+			$detail['file_array'] = $file_array;
+			$other_file_array = Db::name('File')->where('id','in',$detail['other_file_ids'])->select();
+			$detail['other_file_array'] = $other_file_array;
+			if($detail['open_status']>0){
+				$detail['open_admin_name'] = Db::name('Admin')->where('id','=',$detail['open_admin_id'])->value('name');
+			}
+			$not_pay =  ($detail['amount']*100 - $detail['pay_amount']*100)/100;
+			$detail['not_pay'] = sprintf("%.2f",$not_pay);
+			//已付款的记录
+			$detail['payment'] = TicketPayment::field('i.*,a.name as admin')
+				->alias('i')
+				->join('Admin a', 'a.id = i.admin_id', 'LEFT')
+				->where(['i.ticket_id'=>$id,'i.status'=>1])
+				->order('i.pay_time desc')
+				->select();
+            View::assign('uid', $this->uid);
+            View::assign('id', $id);
+            View::assign('detail', $detail);
+			if($detail['invoice_type'] == 0){
+				return view('add_a');
+			}
+            return view();
+        }
+    }
+    //查看
+    public function view()
+    {
+        $id = empty(get_params('id')) ? 0 : get_params('id');
+        $detail = $this->model->getById($id);
+		if(empty($detail)){
+			throw new \think\exception\HttpException(406, '找不到记录');
+		}
+		$detail['not_pay'] =  ($detail['amount']*100 - $detail['pay_amount']*100)/100;
+		//已付款的记录
+		$detail['payment'] = TicketPayment::field('i.*,a.name as admin')
+			->alias('i')
+			->join('Admin a', 'a.id = i.admin_id', 'LEFT')
+			->where(['i.ticket_id'=>$id,'i.status'=>1])
+			->order('i.pay_time desc')
+			->select();
+			
+		$detail['subject'] = Db::name('Enterprise')->where(['id' =>$detail['invoice_subject']])->value('title');
+		$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+		$detail['file_array'] = $file_array;
+		$other_file_array = Db::name('File')->where('id','in',$detail['other_file_ids'])->select();
+		$detail['other_file_array'] = $other_file_array;
+		if($detail['open_status']>0){
+			$detail['open_admin_name'] = Db::name('Admin')->where('id','=',$detail['open_admin_id'])->value('name');
+		}
+        View::assign('uid', $this->uid);
+        View::assign('detail', $detail);
+		if(is_mobile()){
+			return view('qiye@/finance/view_payment');
+		}
+        return view();
+    }
+
+    //删除付款记录
+    public function del()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+            $payment =TicketPayment::where(['id'=>$param['id']])->find();
+            $ticket = $this->model->where(['id'=>$payment['ticket_id']])->find();
+            if($payment){
+                $res = TicketPayment::where(['id'=>$param['id']])->update(['status'=>'6','update_time'=>time()]);
+                if($res!==false){
+                    if($payment['amount']*100 == $ticket['amount']*100){
+                        //发票全部反付款
+                        $this->model->where(['id'=>$payment['ticket_id']])->update(['pay_status'=>0,'pay_amount'=>0,'pay_time'=>0]);
+                    }
+                    else if($payment['amount']*100 < $ticket['amount']*100){
+                        $payTotal=TicketPayment::where(['ticket_id'=>$payment['ticket_id'],'status'=>1])->sum('amount');
+                        //发票部分付款
+                        $this->model->where(['id'=>$payment['ticket_id']])->update(['pay_status'=>1,'pay_amount'=>$payTotal,'pay_time'=>time()]);
+                    }
+                    add_log('pay',$payment['ticket_id'],$ticket);
+                    return to_assign();
+                }
+                else{
+                    return to_assign(1,'操作失败');
+                }
+            }
+        }
+    }
+	
+	
+	//回款记录
+    public function record()
+    {
+        if (request()->isAjax()) {
+			$param = get_params();
+			$where = [];
+			$where[]=['status','=',1];
+			//按时间检索
+			if (!empty($param['diff_time'])) {
+				$diff_time =explode('~', $param['diff_time']);
+				$where[] = ['pay_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]];
+			}
+			$model = new TicketPayment();
+			$list = $model->datalist($param,$where);
+			
+			$amount = $model::where($where)->sum('amount');					
+			$totalRow['amount'] = sprintf("%.2f",$amount);
+            return table_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+}
diff --git a/app/finance/controller/Ticket.php b/app/finance/controller/Ticket.php
new file mode 100644
index 0000000000000000000000000000000000000000..4842f18346ba70e8aa08be069eef756893a08ef1
--- /dev/null
+++ b/app/finance/controller/Ticket.php
@@ -0,0 +1,349 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\finance\controller;
+
+use app\base\BaseController;
+use app\finance\model\Ticket as TicketModel;
+use app\finance\validate\TicketValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Ticket extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new TicketModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			$tab = isset($param['tab']) ? $param['tab'] : 0;
+			$uid=$this->uid;
+            $where = array();
+            $whereOr = array();
+			$where[]=['delete_time','=',0];
+			$where[]=['invoice_type','>',0];
+			if($tab == 0){
+				//全部
+				$whereOr[] = ['admin_id', '=', $this->uid];
+				$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
+				$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
+				$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_copy_uids)")];
+				$auth = isAuthInvoice($uid);
+				if($auth == 0){
+					$dids_a = get_leader_departments($uid);	
+					$dids_b = get_role_departments($uid);
+					$dids = array_merge($dids_a, $dids_b);
+					if(!empty($dids)){
+						$whereOr[] = ['did','in',$dids];
+					}
+				}
+			}
+			if($tab == 1){
+				//我创建的
+				$where[] = ['admin_id', '=', $this->uid];
+			}
+			if($tab == 2){
+				//待我审核的
+				$where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
+			}
+			if($tab == 3){
+				//我已审核的
+				$where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
+			}
+			if($tab == 4){
+				//抄送给我的
+				$where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_copy_uids)")];
+			}
+			//按时间检索
+			if (!empty($param['diff_time'])) {
+				$diff_time =explode('~', $param['diff_time']);
+				$where[] = ['open_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]];
+			}
+            if (isset($param['open_status']) && $param['open_status'] != "") {
+                $where[] = ['open_status', '=', $param['open_status']];
+            }
+            if (isset($param['pay_status']) && $param['pay_status'] != "") {
+                $where[] = ['pay_status', '=', $param['pay_status']];
+            }
+			if (isset($param['check_status']) && $param['check_status'] != "") {
+                $where[] = ['check_status', '=', $param['check_status']];
+            }
+            $list = $this->model->datalist($param,$where,$whereOr);
+            return table_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {
+			$param['admin_id'] = $this->uid;
+			$param['did'] = $this->did;
+			if (!empty($param['open_time'])) {
+				$param['open_time'] = strtotime(urldecode($param['open_time']));
+			}
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(TicketValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(TicketValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				View::assign('detail', $detail);
+				if(is_mobile()){
+					return view('qiye@/finance/add_ticket');
+				}
+				return view('edit');
+			}
+			if(is_mobile()){
+				return view('qiye@/finance/add_ticket');
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			$detail['subject'] = Db::name('Enterprise')->where(['id' =>$detail['invoice_subject']])->value('title');
+			$other_file_array = Db::name('File')->where('id','in',$detail['other_file_ids'])->select();
+			$detail['other_file_array'] = $other_file_array;
+			View::assign('detail', $detail);
+			View::assign('create_user', get_admin($detail['admin_id']));
+			if(is_mobile()){
+				return view('qiye@/finance/view_ticket');
+			}
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		$param = get_params();
+		$id = isset($param['id']) ? $param['id'] : 0;
+		if (request()->isDelete()) {
+			$this->model->delById($id);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }  
+	
+	//收票记录
+    public function record()
+    {
+		$uid = $this->uid;
+		$auth = isAuthInvoice($uid);
+        if (request()->isAjax()) {
+			$param = get_params();
+			$tab = isset($param['tab']) ? $param['tab'] : 0;
+			$where = [];
+			$where[]=['delete_time','=',0];
+			$where[]=['check_status','=',2];
+			$where[]=['invoice_type','>',0];
+			if($auth == 0){
+				$dids_a = get_leader_departments($uid);	
+				$dids_b = get_role_departments($uid);
+				$dids = array_merge($dids_a, $dids_b);
+				if(!empty($dids)){
+					$whereOr[] = ['did','in',$dids];
+				}
+			}
+			if($tab == 0){
+				//正常的
+				$where[] = ['open_status', '<', 2];
+			}
+			if($tab == 1){
+				//已作废的
+				$where[] = ['open_status', '=', 2];
+			}
+			//按时间检索
+			if (!empty($param['diff_time'])) {
+				$diff_time =explode('~', $param['diff_time']);
+				$where[] = ['open_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]];
+			}
+            if (isset($param['open_status']) && $param['open_status'] != "") {
+                $where[] = ['open_status', '=', $param['open_status']];
+            }
+			$list = $this->model->datalist($param,$where);
+			
+			$amount = $this->model::where($where)->sum('amount');					
+			$totalRow['amount'] = sprintf("%.2f",$amount);
+            return table_assign(0, '', $list);
+        } else {
+			View::assign('authInvoice',$auth);
+            return view();
+        }
+    }
+	
+    /**
+    * 无发票付款列表
+    */
+    public function datalist_a()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			$uid=$this->uid;
+            $where = array();
+            $whereOr = array();
+			$where[]=['delete_time','=',0];
+			$where[]=['invoice_type','=',0];
+			$whereOr[] = ['admin_id', '=', $this->uid];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_copy_uids)")];
+			//按时间检索
+			if (!empty($param['diff_time'])) {
+				$diff_time =explode('~', $param['diff_time']);
+				$where[] = ['pay_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]];
+			}
+            if (isset($param['pay_status']) && $param['pay_status'] != "") {
+                $where[] = ['pay_status', '=', $param['pay_status']];
+            }
+			if (isset($param['check_status']) && $param['check_status'] != "") {
+                $where[] = ['check_status', '=', $param['check_status']];
+            }
+            $list = $this->model->datalist($param,$where,$whereOr);
+            return table_assign(0, '', $list);
+        }
+        else{
+			View::assign('auth', isAuthPayment($this->uid));
+            return view();
+        }
+    }
+	
+    /**
+    * 无发票付款添加/编辑
+    */
+    public function add_a()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {
+			$param['admin_id'] = $this->uid;
+			$param['did'] = $this->did;
+			if (!empty($param['open_time'])) {
+				$param['open_time'] = strtotime(urldecode($param['open_time']));
+			}
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(TicketValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(TicketValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				View::assign('detail', $detail);
+				if(is_mobile()){
+					return view('qiye@/finance/add_ticket_a');
+				}
+				return view('edit_a');
+			}
+			if(is_mobile()){
+				return view('qiye@/finance/add_ticket_a');
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 无发票付款查看
+    */
+    public function view_a($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			$detail['subject'] = Db::name('Enterprise')->where(['id' =>$detail['invoice_subject']])->value('title');
+			$other_file_array = Db::name('File')->where('id','in',$detail['other_file_ids'])->select();
+			$detail['other_file_array'] = $other_file_array;
+			View::assign('detail', $detail);
+			View::assign('create_user', get_admin($detail['admin_id']));
+			if(is_mobile()){
+				return view('qiye@/finance/view_ticket_a');
+			}
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 无发票付款删除
+    */
+    public function del_a($id)
+    {
+		if (request()->isDelete()) {
+			$this->model->delById($id);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }  
+
+}
diff --git a/app/finance/event.php b/app/finance/event.php
new file mode 100644
index 0000000000000000000000000000000000000000..afe59182c6aa72dfdf36da12c258d8e48725b43e
--- /dev/null
+++ b/app/finance/event.php
@@ -0,0 +1,8 @@
+<?php
+return [
+	'listen'    => [
+        //注册监听类
+        'SendMessage' => ['app\listener\SendMessage'],
+    ],
+    //'subscribe' => ['app\subscribe\Message'],
+];
diff --git a/app/finance/middleware.php b/app/finance/middleware.php
new file mode 100644
index 0000000000000000000000000000000000000000..c482cdc94129fdc23d6b57facd94e78af56a3c34
--- /dev/null
+++ b/app/finance/middleware.php
@@ -0,0 +1,9 @@
+<?php
+
+// 这是系统自动生成的middleware定义文件
+return [
+    //开启session中间件
+    //'think\middleware\SessionInit',
+    //验证勾股OA是否完成安装
+    \app\home\middleware\Install::class,
+];
diff --git a/app/finance/model/CostCate.php b/app/finance/model/CostCate.php
new file mode 100644
index 0000000000000000000000000000000000000000..3228d2c5c3a36090317e56c4817448776309fd92
--- /dev/null
+++ b/app/finance/model/CostCate.php
@@ -0,0 +1,108 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\finance\model;
+use think\model;
+use think\facade\Db;
+class CostCate extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)->order($order)->paginate(['list_rows'=> $rows]);
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/finance/model/Expense.php b/app/finance/model/Expense.php
new file mode 100644
index 0000000000000000000000000000000000000000..37162f80c9962b2326d7fb09bd0cddcd7f81e68f
--- /dev/null
+++ b/app/finance/model/Expense.php
@@ -0,0 +1,216 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\finance\model;
+use think\model;
+use think\facade\Db;
+class Expense extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($param=[],$where=[],$whereOr=[])
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->where(function ($query) use($whereOr) {
+				if (!empty($whereOr)){
+					$query->whereOr($whereOr);
+				}
+			})
+			->order($order)
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key){
+				$item->check_status_str = check_status_name($item->check_status);
+				$item->income_month = empty($item->income_month) ? '-' : date('Y-m', $item->income_month);
+				$item->expense_time = empty($item->expense_time) ? '-' : date('Y-m-d', $item->expense_time);
+				$item->admin_name = Db::name('Admin')->where(['id' => $item->admin_id])->value('name');
+				$item->department = Db::name('Department')->where(['id' => $item->did])->value('title');
+				$item['check_user'] = '-';
+				if($item['check_status']==1 && !empty($item['check_uids'])){
+					$check_user = Db::name('Admin')->where('id','in',$item['check_uids'])->column('name');
+					$item['check_user'] = implode(',',$check_user);
+				}
+				if($item->pay_admin_id>0){
+					$item->pay_name = Db::name('Admin')->where(['id' => $item->pay_admin_id])->value('name');
+					$item->pay_time = date('Y-m-d H:i', $item->pay_time);
+				}
+				else{
+					$item->pay_name='-';
+					$item->pay_time='-';
+				}
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			//相报销选项多个数组;
+			$amountData = isset($param['amount']) ? $param['amount'] : '';
+			$remarksData = isset($param['remarks']) ? $param['remarks'] : '';
+			$cateData = isset($param['cate_id']) ? $param['cate_id'] : '';
+			$idData = isset($param['expense_id']) ? $param['expense_id'] : 0;
+			if ($amountData) {
+				foreach ($amountData as $key => $value) {
+					if (!$value) {
+						continue;
+					}    
+					$data = [];
+					$data['id'] = $idData[$key];
+					$data['exid'] = $insertId;
+					$data['admin_id'] = $param['admin_id'];
+					$data['amount'] = $amountData[$key];
+					$data['cate_id'] = $cateData[$key];
+					$data['remarks'] = $remarksData[$key];
+					if ($data['id'] > 0) {
+						$data['update_time'] = time();
+						$resa = Db::name('ExpenseInterfix')->strict(false)->field(true)->update($data);
+					} else {
+						$data['create_time'] = time();
+						$eid = Db::name('ExpenseInterfix')->strict(false)->field(true)->insertGetId($data);
+					}
+				}
+			}
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			//相报销选项多个数组;
+			$amountData = isset($param['amount']) ? $param['amount'] : '';
+			$remarksData = isset($param['remarks']) ? $param['remarks'] : '';
+			$cateData = isset($param['cate_id']) ? $param['cate_id'] : '';
+			$idData = isset($param['expense_id']) ? $param['expense_id'] : 0;
+			if ($amountData) {
+				foreach ($amountData as $key => $value) {
+					if (!$value) {
+						continue;
+					}    
+					$data = [];
+					$data['id'] = $idData[$key];
+					$data['exid'] = $param['id'];
+					$data['admin_id'] = $param['admin_id'];
+					$data['amount'] = $amountData[$key];
+					$data['cate_id'] = $cateData[$key];
+					$data['remarks'] = $remarksData[$key];
+					if ($data['id'] > 0) {
+						$data['update_time'] = time();
+						$resa = Db::name('ExpenseInterfix')->strict(false)->field(true)->update($data);
+					} else {
+						$data['create_time'] = time();
+						$eid = Db::name('ExpenseInterfix')->strict(false)->field(true)->insertGetId($data);
+					}
+				}
+			}
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		$info['income_month'] = empty($info['income_month']) ? '-' : date('Y-m', $info['income_month']);
+		$info['expense_time'] = empty($info['expense_time']) ? '-' : date('Y-m-d', $info['expense_time']);
+		$info['admin_name'] = Db::name('Admin')->where(['id' => $info['admin_id']])->value('name');
+		$info['department'] = Db::name('Department')->where(['id' => $info['did']])->value('title');
+		if ($info['pay_time'] > 0) {
+			$info['pay_time'] = date('Y-m-d H:i:s', $info['pay_time']);
+			$info['pay_admin'] = Db::name('Admin')->where(['id' => $info['pay_admin_id']])->value('name');
+		}
+		else{
+			$info['pay_time'] = '-';
+		}
+		if ($info['project_id'] > 0) {
+			$info['ptname'] = Db::name('Project')->where(['id' => $info['project_id']])->value('name');
+		}
+		else{
+			$info['ptname'] = '';
+		}
+		if ($info['subject_id'] > 0) {
+			$info['subject_name'] = Db::name('Enterprise')->where(['id' => $info['subject_id']])->value('title');
+		}
+		$info['list'] = Db::name('ExpenseInterfix')
+			->field('a.*,c.title as cate_title')
+			->alias('a')
+			->join('ExpenseCate c', 'a.cate_id = c.id','LEFT')
+			->where(['a.exid' => $info['id']])
+			->select();
+		$file_array = Db::name('File')->where('id','in',$info['file_ids'])->select();
+		$info['file_array'] = $file_array;	
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+	
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/finance/model/ExpenseCate.php b/app/finance/model/ExpenseCate.php
new file mode 100644
index 0000000000000000000000000000000000000000..48653bd03f7554d1c7507116d3c7de3b890a7796
--- /dev/null
+++ b/app/finance/model/ExpenseCate.php
@@ -0,0 +1,108 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\finance\model;
+use think\model;
+use think\facade\Db;
+class ExpenseCate extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)->order($order)->paginate(['list_rows'=> $rows]);
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/finance/model/Invoice.php b/app/finance/model/Invoice.php
new file mode 100644
index 0000000000000000000000000000000000000000..def6e3804f0cbe42ba8544c6987263865db9a9be
--- /dev/null
+++ b/app/finance/model/Invoice.php
@@ -0,0 +1,148 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\finance\model;
+use think\model;
+use think\facade\Db;
+class Invoice extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($param=[],$where=[],$whereOr=[])
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->where(function ($query) use($whereOr) {
+				if (!empty($whereOr)){
+					$query->whereOr($whereOr);
+				}
+			})
+			->order($order)
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key){
+				$item->check_status_str = check_status_name($item->check_status);
+				$item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name');
+				$item->department = Db::name('Department')->where(['id' => $item->did])->value('title');
+				$item['check_user'] = '-';
+				if($item['check_status']==1 && !empty($item['check_uids'])){
+					$check_user = Db::name('Admin')->where('id','in',$item['check_uids'])->column('name');
+					$item['check_user'] = implode(',',$check_user);
+				}
+				if($item->open_admin_id>0){
+					$item->open_name = Db::name('Admin')->where(['id' => $item->open_admin_id])->value('name');
+					$item->open_time = date('Y-m-d', $item->open_time);
+				}
+				else{
+					$item->open_name='-';
+					$item->open_time='';
+					$item->code='';
+				}
+				if($item->enter_time>0){
+					$item->enter_time = date('Y-m-d', $item->enter_time);
+				}
+				else{
+					$item->enter_time='-';
+				}
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		if($info['contract_id']>0){
+			$info['contract_name'] = Db::name('Contract')->where('id',$info['contract_id'])->value('name');
+		}
+		if($info['project_id']>0){
+			$info['project_name'] = Db::name('Project')->where('id',$info['project_id'])->value('name');
+		}
+		$file_array = Db::name('File')->where('id','in',$info['file_ids'])->select();
+		$info['file_array'] = $file_array;
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/finance/model/InvoiceIncome.php b/app/finance/model/InvoiceIncome.php
new file mode 100644
index 0000000000000000000000000000000000000000..6b123c8a00092c68665fccd3324d2862ea621506
--- /dev/null
+++ b/app/finance/model/InvoiceIncome.php
@@ -0,0 +1,37 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\finance\model;
+use think\Model;
+use think\facade\Db;
+class InvoiceIncome extends Model
+{	
+	public function datalist($param,$where)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->order($order)
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key){
+				$item['admin_name'] = Db::name('Admin')->where('id',$item['admin_id'])->value('name');
+				$item['enter_time'] = date('Y-m-d',$item['enter_time']);
+				$item['code'] = Db::name('Invoice')->where('id',$item['invoice_id'])->value('code');
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/finance/model/Ticket.php b/app/finance/model/Ticket.php
new file mode 100644
index 0000000000000000000000000000000000000000..24b890c5bd8a03a51113adb3c3beaa8a5326d6e9
--- /dev/null
+++ b/app/finance/model/Ticket.php
@@ -0,0 +1,148 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\finance\model;
+use think\model;
+use think\facade\Db;
+class Ticket extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($param=[],$where=[],$whereOr=[])
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->where(function ($query) use($whereOr) {
+				if (!empty($whereOr)){
+					$query->whereOr($whereOr);
+				}
+			})
+			->order($order)
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key){
+				$item->check_status_str = check_status_name($item->check_status);
+				$item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name');
+				$item->department = Db::name('Department')->where(['id' => $item->did])->value('title');
+				$item->supplier_name = Db::name('Supplier')->where(['id' => $item->supplier_id])->value('title');
+				$item['check_user'] = '-';
+				if($item['check_status']==1 && !empty($item['check_uids'])){
+					$check_user = Db::name('Admin')->where('id','in',$item['check_uids'])->column('name');
+					$item['check_user'] = implode(',',$check_user);
+				}
+				$item->open_time = date('Y-m-d', $item->open_time);
+				if($item->pay_time>0){
+					$item->pay_time = date('Y-m-d', $item->pay_time);
+				}
+				else{
+					$item->pay_time='-';
+				}
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		$info['supplier_name'] = Db::name('Supplier')->where(['id' => $info['supplier_id']])->value('title');
+		if($info['purchase_id']>0){
+			$info['purchase_name'] = Db::name('Purchase')->where('id',$info['purchase_id'])->value('name');
+		}
+		if($info['project_id']>0){
+			$info['project_name'] = Db::name('Project')->where('id',$info['project_id'])->value('name');
+		}
+		if($info['open_time']>0){
+			$info['open_time'] = date('Y-m-d',$info['open_time']);
+		}
+		else{
+			$info['open_time']='';
+		}
+		$file_array = Db::name('File')->where('id','in',$info['file_ids'])->select();
+		$info['file_array'] = $file_array;
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/finance/model/TicketPayment.php b/app/finance/model/TicketPayment.php
new file mode 100644
index 0000000000000000000000000000000000000000..06d33a8551d9ed807f46c6c73423ea744f904c63
--- /dev/null
+++ b/app/finance/model/TicketPayment.php
@@ -0,0 +1,37 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\finance\model;
+use think\Model;
+use think\facade\Db;
+class TicketPayment extends Model
+{	
+	public function datalist($param,$where)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->order($order)
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key){
+				$item['admin_name'] = Db::name('Admin')->where('id',$item['admin_id'])->value('name');
+				$item['pay_time'] = date('Y-m-d',$item['pay_time']);
+				$item['code'] = Db::name('Ticket')->where('id',$item['ticket_id'])->value('code');
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/finance/validate/CostcateValidate.php b/app/finance/validate/CostcateValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..75cc4af0740a49a4cf9ece53a71470acdb0e15cd
--- /dev/null
+++ b/app/finance/validate/CostcateValidate.php
@@ -0,0 +1,43 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\finance\validate;
+use think\Validate;
+use think\facade\Db;
+
+class CostcateValidate extends Validate
+{
+	// 自定义验证规则
+	protected function checkOne($value,$rule,$data=[])
+	{
+		$id = isset($data['id'])?$data['id']:0;
+		$count = Db::name('CostCate')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count();
+		return $count == 0 ? true : false;
+	}
+	
+    protected $rule = [
+		'title' => 'require|checkOne',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'title.require' => '名称不能为空',
+		'title.checkOne' => '同样的名称已经存在',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['title', 'id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/finance/validate/ExpenseValidate.php b/app/finance/validate/ExpenseValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..b5ff85852ad627fb85a479c0f84e0ccf0dfb01c3
--- /dev/null
+++ b/app/finance/validate/ExpenseValidate.php
@@ -0,0 +1,43 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\finance\validate;
+use think\Validate;
+use think\facade\Db;
+
+class ExpenseValidate extends Validate
+{
+	// 自定义验证规则
+	protected function checkOne($value,$rule,$data=[])
+	{
+		$id = isset($data['id'])?$data['id']:0;
+		$count = Db::name('Expense')->where([['code','=',$data['code']],['id','<>',$id],['delete_time','=',0]])->count();
+		return $count == 0 ? true : false;
+	}
+	
+    protected $rule = [
+		'code' => 'require|checkOne',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'code.require' => '报销凭证编号不能为空',
+		'code.checkOne' => '同样的报销凭证编号已经存在',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['code'],
+        'edit' => ['code', 'id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/finance/validate/ExpensecateValidate.php b/app/finance/validate/ExpensecateValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..d659a468a1d670aa3189423203425dc7f773dd97
--- /dev/null
+++ b/app/finance/validate/ExpensecateValidate.php
@@ -0,0 +1,43 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\finance\validate;
+use think\Validate;
+use think\facade\Db;
+
+class ExpensecateValidate extends Validate
+{
+	// 自定义验证规则
+	protected function checkOne($value,$rule,$data=[])
+	{
+		$id = isset($data['id'])?$data['id']:0;
+		$count = Db::name('ExpenseCate')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count();
+		return $count == 0 ? true : false;
+	}
+	
+    protected $rule = [
+		'title' => 'require|checkOne',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'title.require' => '名称不能为空',
+		'title.checkOne' => '同样的名称已经存在',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['title', 'id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/finance/validate/InvoiceValidate.php b/app/finance/validate/InvoiceValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..7be19c78716ef2414e06126145e8ce371c45d13f
--- /dev/null
+++ b/app/finance/validate/InvoiceValidate.php
@@ -0,0 +1,39 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\finance\validate;
+use think\Validate;
+use think\facade\Db;
+
+class InvoiceValidate extends Validate
+{
+    protected $rule = [
+        'amount'           => 'require|float',
+        'invoice_type'     => 'require',
+        'invoice_subject'  => 'require',
+        'id'               => 'require'
+    ];
+
+    protected $message = [
+        'amount.require'          => '开票金额不能为空',
+        'amount.number'           => '开票金额只能为数字',
+        'id.require'              => '缺少更新条件',
+        'invoice_type.require'    => '请选择开票类型',
+        'invoice_subject.require' => '请选择开票主体',
+    ];
+
+    protected $scene = [
+        'add'       => ['amount','invoice_subject'],
+        'edit'      => ['id', 'amount','invoice_subject']
+    ];
+}
\ No newline at end of file
diff --git a/app/finance/validate/TicketValidate.php b/app/finance/validate/TicketValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..9b463d00b506a6a2b4459dc763846eca8c359a21
--- /dev/null
+++ b/app/finance/validate/TicketValidate.php
@@ -0,0 +1,36 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\finance\validate;
+use think\Validate;
+use think\facade\Db;
+
+class TicketValidate extends Validate
+{
+    protected $rule = [
+        'amount'           => 'require',
+        'invoice_subject'  => 'require',
+        'id'               => 'require'
+    ];
+
+    protected $message = [
+        'amount.require'          => '发票金额不能为空',
+        'id.require'              => '缺少更新条件',
+        'invoice_subject.require' => '请选择发票主体',
+    ];
+
+    protected $scene = [
+        'add'       => ['amount','invoice_subject'],
+        'edit'      => ['id', 'amount','invoice_subject']
+    ];
+}
\ No newline at end of file
diff --git a/app/finance/view/costcate/add.html b/app/finance/view/costcate/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..96ef995bbc42f58f6214448b0156cfceba1ff256
--- /dev/null
+++ b/app/finance/view/costcate/add.html
@@ -0,0 +1,49 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">费用类型</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">费用类型名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入费用类型名称" lay-reqText="请输入费用类型名称"class="layui-input" value="{$detail.title|default=''}">
+			</td>
+			<td class="layui-td-gray">排序</td>
+			<td>
+				<input type="text" name="sort" placeholder="请输入排序，数字" autocomplete="off" class="layui-input" value="{$detail.sort|default=''}">
+			</td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$detail.id|default=0}"/>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool'];
+
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/finance/costcate/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/finance/view/costcate/datalist.html b/app/finance/view/costcate/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..2b1394b7cc6297b89522dab41741eaff28fdd5e4
--- /dev/null
+++ b/app/finance/view/costcate/datalist.html
@@ -0,0 +1,124 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<table class="layui-hide" id="table_cost_cate" lay-filter="table_cost_cate"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm add-new" type="button">+ 添加费用类型</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool;
+		
+		layui.pageTable = table.render({
+			elem: "#table_cost_cate"
+			,toolbar: '#toolbarDemo'
+			,url: "/finance/costcate/datalist"
+			,page: false
+			,limit: 999
+			,cellMinWidth: 80
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',title: '类型名称'}
+				,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+					var html1='<span class="green">正常</span>';
+					var html2='<span class="yellow">禁用</span>';
+					if(d.status==1){
+						return html1;
+					}
+					else{
+						return html2;
+					}
+				}}
+				,{width:100,title: '操作', align:'center',ignoreExport:true,templet: function(d){
+					var html='';
+					var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+					if(d.status==1){
+						html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+					}
+					else{
+						html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+					}
+					return html;
+				}}
+			]]
+		});
+			
+		table.on('tool(table_cost_cate)',function (obj) {
+			if(obj.event === 'edit'){					
+				add_cate(obj.data.id,obj.data.title);
+			}
+			if(obj.event === 'disable'){
+				layer.confirm('确定要禁用该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/finance/costcate/set", {id:obj.data.id,status: 0}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'open'){
+				layer.confirm('确定要启用该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/finance/costcate/set", {id:obj.data.id,status:1}, callback);
+					layer.close(index);
+				});
+			}
+		});
+		
+		$('body').on('click','.add-new',function(){
+			add_cate(0,'');	
+		});
+		
+		function add_cate(id,val){
+			var title = '新增类型';
+			if(id>0){
+				title = '编辑类型';
+			}
+			layer.prompt({
+				title: title,
+				value: val,
+				yes: function(index, layero) {
+					// 获取文本框输入的值
+					var value = layero.find(".layui-layer-input").val();
+					if (value) {
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();				
+							}
+						}
+						tool.post("/finance/costcate/add", {id: id,title: value}, callback);
+						layer.close(index);
+					} else {
+						layer.msg('请填写类型名称');
+					}
+				}
+			})
+		}
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/finance/view/costcate/view.html b/app/finance/view/costcate/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..2bc9ed0fa3ee3f5b86ad2fc3e8e47d4bf4d273e0
--- /dev/null
+++ b/app/finance/view/costcate/view.html
@@ -0,0 +1,16 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<h3 class="pb-3">费用类型详情</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">费用类型名称</td>
+			<td>{$detail.title|default=''}"></td>
+			<td class="layui-td-gray">排序</td>
+			<td>{$detail.sort|default=0}</td>
+		</tr>
+	</table>
+</div>
+{/block}
+<!-- /主体 -->
\ No newline at end of file
diff --git a/app/finance/view/expense/add.html b/app/finance/view/expense/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..c6cec90b8bcaddec298e0da4e8d818b4d927a635
--- /dev/null
+++ b/app/finance/view/expense/add.html
@@ -0,0 +1,161 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">添加报销申请</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">报销员工</td>
+			<td>{$user.name}</td>
+			<td class="layui-td-gray">报销部门</td>
+			<td>{$user.department}</td>
+			<td class="layui-td-gray">报销主体</td>
+			<td>
+				<select name="subject_id" lay-verify="required" lay-reqText="请选择报销主体">
+					<option value="">请选择报销主体</option>
+					{volist name=":get_base_data('enterprise')" id="vo"}
+					<option value="{$vo.id}">{$vo.title}</option>
+					{/volist}
+				</select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">凭证编号<font>*</font></td>
+			<td><input type="text" name="code" value="{$codeno}" {eq name="$is_codeno" value="1"}readonly{/eq} lay-verify="required" placeholder="请输入报销凭证编号" lay-reqText="请填写报销凭证编号" class="layui-input" value=""></td>
+			<td class="layui-td-gray">单据日期<font>*</font></td>
+			<td><input type="text" class="layui-input tool-time" name="expense_time" lay-verify="required" placeholder="请选择原始单据日期" lay-reqText="请选择原始单据日期" readonly value="">	
+			</td>
+			<td class="layui-td-gray">入账月份<font>*</font></td>
+			<td><input type="text" class="layui-input tool-time" data-type="month" name="income_month" lay-verify="required" placeholder="请选择入账月份" lay-reqText="请选择入账月份" readonly value=""></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">关联项目</td>
+			<td colspan="5">
+				<input type="text" class="layui-input picker-oa" data-types="project" name="ptname" placeholder="请选择需要关联的项目" readonly value="">		
+				<input type="hidden" class="layui-input" name="project_id" value="0">		
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">报销选项<font>*</font></td>
+			<td colspan="5">				
+				<table id="interfix" class="layui-table layui-table-min" style="margin:0;">
+					<tr>
+						<th width="100">报销金额</th>
+						<th width="120">报销项目</th>
+						<th>备注信息</th>
+						<th width="60">操作</th>
+					</tr>
+					<tr class="more_interfix">
+						<td><input type="text" name="amount[]" value="" class="layui-input" lay-verify="required|number" lay-reqText="请完善报销金额"></td>
+						<td style="text-align:left">
+							<select name="cate_id[]" lay-verify="required" lay-reqText="请选择报销项目">
+								<option value="">请选择</option>
+								{volist name="$expense_cate" id="vo"}
+								  <option value="{$vo.id}">{$vo.title}</option>
+								{/volist}
+							</select>
+						</td>
+						<td><input type="text" name="remarks[]" class="layui-input" value=""><input type="hidden" name="expense_id[]" class="layui-input" value="0"></td>
+						<td><a class="layui-btn layui-btn-danger layui-btn-xs" data-id="0" lay-event="del">删除</a></td>
+					</tr>
+				</table>
+				<div class="pt-2">
+					<button class="layui-btn layui-btn-sm" type="button" id="addInterfix">+ 报销选项</button>
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">
+				<div class="layui-input-inline">附件</div>
+				<div class="layui-input-inline"><button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button></div>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="">
+				</div>
+			</td>
+		</tr>
+	</table>
+	<div id="checkBox" data-status="0" data-id="0" data-checkflowid="0" class="pt-3"></div>
+	<div class="pt-4">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">保存并提交审核</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+<div id="selectTem" style="display:none;">
+	<select name="cate_id[]" lay-verify="required" lay-reqText="请选择报销项目">
+		<option value="">请选择</option>
+		{volist name="$expense_cate" id="vo"}
+		  <option value="{$vo.id}">{$vo.title}</option>
+		{/volist}
+	</select>
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','oaPicker','uploadPlus','oaCheck'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,table=layui.table,uploadPlus = layui.uploadPlus,oaCheck = layui.oaCheck;
+		//相关附件上传
+		var attachment = new uploadPlus();
+		//审批相关
+		oaCheck.init({
+			check_name:'expense',
+			check_btn:0
+		});
+		//添加报销信息表格
+		$('#addInterfix').on('click',function(){
+			var html = '';
+			var selectTem=$('#selectTem').html();
+			html += '<tr class="more_interfix">\
+							<td><input type="text" name="amount[]" class="layui-input" lay-verify="required|number" lay-reqText="请完善报销金额"></td>\
+							<td style="text-align:left">'+selectTem+'</td>\
+							<td><input type="text" name="remarks[]" class="layui-input"><input type="hidden" name="expense_id[]" class="layui-input" value="0"></td>\
+							<td><a class="layui-btn layui-btn-danger layui-btn-xs" data-id="0" lay-event="del">删除</a></td>\
+						</tr>';
+			$("#interfix").append(html).find('.tr-none').remove();
+			form.render();
+		});
+
+		$('#interfix').on('click', '[lay-event="del"]', function() {
+			if($('.more_interfix').length<2){
+				layer.msg('至少保留一个报销选项');
+				return false;
+			}
+			$(this).parents(".more_interfix").remove();
+		});
+
+		//监听提交
+		form.on('submit(webform)', function(data){
+		  	var interfix = $('.more_interfix');
+			if(interfix.length <1 ){ 
+				layer.msg('至少要保留一个报销选项');
+				return false;
+			}
+			tool.ask('审核期间不能编辑修改，确定报销数据无误？', function(index) {
+				let callback = function (e) {
+					layer.msg(e.msg);
+					if (e.code == 0) {
+						let checkCallback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								tool.sideClose(1000);				
+							}
+						}
+						data.field.check_name = 'expense';
+						data.field.action_id = e.data.return_id;
+						oaCheck.submit(data.field,checkCallback);
+					}
+				}
+				tool.post("/finance/expense/add", data.field, callback);
+				layer.close(index);
+			});
+			return false;
+		});
+	}		
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/finance/view/expense/datalist.html b/app/finance/view/expense/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..e2b0332ae2d5980ba0473af7e740814a8f56313e
--- /dev/null
+++ b/app/finance/view/expense/datalist.html
@@ -0,0 +1,214 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+.tab-5 .search-item{display:none;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<div class="layui-card border-x border-t" style="margin-bottom:0; box-shadow:0 0 0 0 rgb(5 32 96 / 0%)">
+		<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
+			<ul class="layui-tab-title">
+				<li class="layui-this">全部</li>
+				<li>我申请的</li>
+				<li>待我审批</li>
+				<li>我已审批</li>
+				<li>抄送我的</li>
+				<li>已打款</li>
+			</ul>
+		</div>
+	</div>
+	<form class="layui-form gg-form-bar border-x tab-0" id="barsearchform">
+		<div class="layui-input-inline" style="width:175px;">
+			<input type="text" class="layui-input" id="diff_time" placeholder="选择时间区间" readonly name="diff_time">
+		</div>
+		<div class="layui-input-inline search-item" style="width:120px;">
+			<select name="check_status">
+				<option value="">选择审批状态</option>
+				{volist name=":get_check_status()" id="vo"}
+				<option value="{$key}">{$vo}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline search-item" style="width:120px;">
+			<select name="pay_status">
+				<option value="">打款状态</option>
+				<option value="0">未打款</option>
+				<option value="1">已打款</option>
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<input type="hidden" name="tab" value="0"/>
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_expense" lay-filter="table_expense"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm tool-add" type="button" data-href="/finance/expense/add">+ 添加报销申请</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus','laydatePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool, laydatePlus = layui.laydatePlus, element = layui.element;
+		//tab切换
+		element.on('tab(tab)', function(data){
+			$('[name="tab"]').val(data.index);
+			$("#barsearchform")[0].reset();
+			$("#barsearchform").attr('class','layui-form gg-form-bar border-x tab-'+data.index);
+			layui.pageTable.reload({where:{tab:data.index},page:{curr:1}});
+			return false;
+		});
+		
+		//日期范围
+		var diff_time = new laydatePlus({'target':'diff_time'});
+		layui.pageTable = table.render({
+			elem: "#table_expense"
+			,toolbar: "#toolbarDemo"
+			,title: '报销列表'
+			,url: "/finance/expense/datalist"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 80
+			,height: 'full-152'
+			,cols: [[
+				{
+						field: 'id',
+						title: 'ID号',
+						align: 'center',
+						width: 80
+					}, {
+						field: 'cost',
+						title: '报销总金额(元)',
+						align: 'right',
+						width: 110,
+					},{
+						field:'check_status',title: '审批状态',width:110, align:'center',templet: function(d){
+							var html = '<span class="check-status-color-'+d.check_status+'">『'+d.check_status_str+'』</span>';
+							return html;
+						}
+					},
+					{
+						field: 'admin_name',
+						title: '报销员工',
+						align: 'center',
+						width: 90
+					},{
+						field: 'department',
+						title: '报销部门',
+						align: 'center',
+						width: 120
+					},{
+						field: 'code',
+						title: '报销凭证编号',
+						width: 150,
+					},{
+						field: 'expense_time',
+						title: '原始单据日期',
+						align: 'center',
+						width: 110
+					},{
+						field: 'income_month',
+						title: '入账月份',
+						align: 'center',
+						width: 80
+					},{
+						field: 'create_time',
+						title: '录入时间',
+						align: 'center',
+						width: 150
+					},{
+						field: 'check_user',
+						title: '当前审核人'
+					},{
+						field: 'pay_status',
+						title: '打款状态',
+						align: 'center',
+						width: 90,
+						templet:function(d){
+							var html='';
+							if(d.check_status==2){
+								html = '<span class="red">『未打款』</span>';
+								if(d.pay_status==1){
+									html = '<span class="green">『已打款』</span>';
+								}
+							}
+							else{
+								html='-';
+							}
+							return html;
+						}
+					},{
+						field: 'pay_name',
+						title: '打款人',
+						align: 'center',
+						width: 80
+					},{
+						field: 'pay_time',
+						title: '打款时间',
+						align: 'center',
+						width: 150
+					}, {
+						field: 'right',
+						fixed: 'right',
+						title: '操作',
+						width: 130,
+						align: 'center',
+						templet:function(d){
+							var html='<div class="layui-btn-group">';
+							var btn1='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</span>';
+							var btn2='<span class="layui-btn layui-btn-xs" lay-event="edit">编辑</span>';
+							var btn3='<span class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</span>';
+							html+=btn1;
+							if((d.check_status==0 || d.check_status==4) && d.admin_id==login_admin){
+								html+=btn2+btn3;
+							}
+							html+='</div>';
+							return html;
+						}
+					}
+				]
+			]
+		});
+			
+		table.on('tool(table_expense)',function (obj) {
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/finance/expense/view?id="+data.id);
+				return;
+			}
+			if (obj.event === 'edit') {
+				tool.side("/finance/expense/add?id="+data.id);
+				return;
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要删除该内容吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/finance/expense/del", { id: data.id }, callback);
+					layer.close(index);
+				});
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/finance/view/expense/edit.html b/app/finance/view/expense/edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..b25c62c2a62960239fcc58d3779297a3b454f955
--- /dev/null
+++ b/app/finance/view/expense/edit.html
@@ -0,0 +1,191 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">编辑报销申请</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">报销员工</td>
+			<td>{$detail.admin_name}</td>
+			<td class="layui-td-gray">报销部门</td>
+			<td>{$detail.department|default=''}</td>
+			<td class="layui-td-gray">报销主体</td>
+			<td>
+				<select name="subject_id" lay-verify="required" lay-reqText="请选择报销主体">
+					<option value="">请选择报销主体</option>
+					{volist name=":get_base_data('enterprise')" id="vo"}
+					<option value="{$vo.id}" {eq name="$detail.subject_id" value="$vo.id"} selected{/eq}>{$vo.title}</option>
+					{/volist}
+				</select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">凭证编号<font>*</font></td>
+			<td><input type="text" name="code" autocomplete="off" lay-verify="required" placeholder="报销凭证编号" lay-reqText="请填写报销凭证编号" class="layui-input" value="{$detail.code}"></td>
+			<td class="layui-td-gray-2">原始单据日期<font>*</font></td>
+			<td><input type="text" class="layui-input" id="expense_time" name="expense_time" lay-verify="required" placeholder="请选择原始单据日期" lay-reqText="请选择原始单据日期" readonly value="{$detail.expense_time}"></td>
+			<td class="layui-td-gray">入账月份<font>*</font></td>
+			<td><input type="text" class="layui-input tool-time" data-type="month" name="income_month" lay-verify="required" placeholder="请选择入账月份" lay-reqText="请选择入账月份" readonly value="{$detail.income_month}"></td>
+		</tr>
+		<tr>
+		<td class="layui-td-gray">关联项目</td>
+			<td colspan="5">
+				<input type="text" class="layui-input picker-project" name="ptname" placeholder="请选择需要关联的项目" readonly value="{$detail.ptname|default=""}">		
+				<input type="hidden" class="layui-input" name="project_id" value="{$detail.project_id}">		
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">报销选项<font>*</font></td>
+			<td colspan="5">	
+				<table id="interfix" class="layui-table layui-table-min" style="margin:0;">
+					<tr>
+						<th width="100">报销金额</th>
+						<th width="120">报销类别</th>
+						<th>备注信息</th>
+						<th width="60">操作</th>
+					</tr>
+					{volist name="$detail.list" id="val"}
+					<tr class="more_interfix">
+						<td><input type="text" name="amount[]" value="{$val.amount}" class="layui-input" lay-verify="required|number" lay-reqText="请完善报销金额"></td>
+						<td style="text-align:left">
+							<select name="cate_id[]" lay-verify="required" lay-reqText="请选择报销项目">
+								<option value="">请选择</option>
+								{volist name="$expense_cate" id="vo"}
+								  <option value="{$vo.id}" {eq name="$vo.id" value="$val.cate_id"} selected{/eq}>{$vo.title}</option>
+								{/volist}
+							</select>
+						</td>
+						<td><input type="text" name="remarks[]" class="layui-input" value="{$val.remarks}"><input type="hidden" name="expense_id[]" class="layui-input" value="{$val.id}"></td>
+						<td><a class="layui-btn layui-btn-danger layui-btn-xs" data-id="{$val.id}" lay-event="del">删除</a></td>
+					</tr>
+					{/volist}
+				</table>
+				<div class="pt-2">
+					<button class="layui-btn layui-btn-sm" type="button" id="addInterfix">+ 报销选项</button>
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">
+				<div class="layui-input-inline">附件</div>
+				<div class="layui-input-inline"><button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button></div>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" name="file_ids" data-type="file" value="{$detail.file_ids}">
+					{notempty name="$detail.file_ids"}
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr>
+	</table>
+	<div id="checkBox" data-status="{$detail.check_status}" data-id="{$detail.id}" data-checkflowid="{$detail.check_flow_id}"></div>
+	<div class="pt-4">
+		<input name="id" id="id" type="hidden" value="{$detail.id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">保存并提交审核</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+<div id="selectTem" style="display:none;">
+	<select name="cate_id[]" lay-verify="required" lay-reqText="请选择报销项目">
+		<option value="">请选择</option>
+		{volist name="$expense_cate" id="vo"}
+		  <option value="{$vo.id}">{$vo.title}</option>
+		{/volist}
+	</select>
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','oaPicker','uploadPlus','oaCheck'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,table=layui.table,uploadPlus = layui.uploadPlus,oaCheck = layui.oaCheck;	
+		//相关附件上传
+		var attachment = new uploadPlus();
+		//审批相关
+		oaCheck.init({
+			check_name:'expense',
+			check_btn:0
+		});
+		//添加报销信息表格
+		$('#addInterfix').on('click',function(){
+			var html = '';
+			var selectTem=$('#selectTem').html();
+			html += '<tr class="more_interfix">\
+							<td><input type="text" name="amount[]" class="layui-input" lay-verify="required|number" lay-reqText="请完善报销金额"></td>\
+							<td style="text-align:left">'+selectTem+'</td>\
+							<td><input type="text" name="remarks[]" class="layui-input"><input type="hidden" name="expense_id[]" class="layui-input" value="0"></td>\
+							<td><a class="layui-btn layui-btn-danger layui-btn-xs" data-id="0" lay-event="del">删除</a></td>\
+						</tr>';
+			$("#interfix").append(html).find('.tr-none').remove();
+			form.render();
+		});
+
+		$('#interfix').on('click', '[lay-event="del"]', function() {
+			if($('.more_interfix').length<2){
+				layer.msg('至少保留一个报销选项');
+				return false;
+			}
+			var that=$(this);
+			var _id = that.data('id');
+			if(_id>0){
+				layer.confirm('确定删除该报销数据项？', {
+					icon: 3,
+					title: '提示'
+				}, function(index) {
+					$.ajax({
+						url: "/finance/api/del_expense_interfix",
+						type:'post',
+						data: {id: _id},
+						success: function(res) {
+							layer.msg(res.msg);
+							if (res.code == 0) {
+								that.parents(".more_interfix").remove();
+							}
+						}
+					})
+					layer.close(index);
+				});
+			}
+			else{
+				that.parents(".more_interfix").remove();
+			}
+		});
+
+		//监听提交
+		form.on('submit(webform)', function(data){
+		  	var interfix = $('.more_interfix');
+			if(interfix.length <1 ){ 
+				layer.msg('至少要保留一个报销选项');
+				return false;
+			}
+			tool.ask('审核期间不能编辑修改，确定报销数据无误？', function(index) {
+				let callback = function (e) {
+					layer.msg(e.msg);
+					if (e.code == 0) {
+						let checkCallback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								tool.sideClose(1000);				
+							}
+						}
+						data.field.check_name = 'expense';
+						data.field.action_id = e.data.return_id;
+						oaCheck.submit(data.field,checkCallback);
+					}
+				}
+				tool.post("/finance/expense/add", data.field, callback);
+				layer.close(index);
+			});
+			return false;
+		});
+	}		
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/finance/view/expense/record.html b/app/finance/view/expense/record.html
new file mode 100644
index 0000000000000000000000000000000000000000..424ba4c9e8f27ee9332f33e0f618a5963cade38d
--- /dev/null
+++ b/app/finance/view/expense/record.html
@@ -0,0 +1,168 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-t border-x" id="barsearchform">
+		<div class="layui-input-inline" style="width:100px;">
+			<input type="text" class="layui-input picker-admin" placeholder="选择报销人员" readonly name="uname" value="">
+			<input type="hidden" name="uid" value="0">
+		</div>
+		<div class="layui-input-inline" style="width:175px;">
+			<input type="text" class="layui-input" id="diff_time" placeholder="选择入账月份区间" readonly name="diff_time">
+		</div>
+		<div class="layui-input-inline" style="width:120px;">
+			<select name="pay_status">
+				<option value="">打款状态</option>
+				<option value="0">未打款</option>
+				<option value="1">已打款</option>
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+<div class="layui-btn-container">
+    <h3 class="h3-title" style="height:32px;">报销记录</h3>
+</div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const auth = {$authExpense};
+	const moduleInit = ['tool','tablePlus','laydatePlus','oaPicker'];
+	function gouguInit() {
+		var form = layui.form,table = layui.tablePlus,tool=layui.tool, laydatePlus = layui.laydatePlus;
+		//日期范围
+		var diff_time = new laydatePlus({'target':'diff_time'});
+
+		layui.pageTable = table.render({
+			elem: '#test',
+			title: '报销记录列表',
+			toolbar: '#toolbarDemo',
+			url: "/finance/expense/record", //数据接口	
+			cellMinWidth: 80,			
+			page: true, //开启分页
+			limit: 20,
+			height: 'full-112',
+			totalRow: true,
+			cols: [
+				[
+					{
+						field: 'id',
+						title: 'ID号',
+						align: 'center',
+						width: 80,
+						totalRowText: '<div style="text-align:right">合计</div>'
+					}, {
+						field: 'cost',
+						title: '报销总金额(元)',
+						align: 'right',
+						width: 120,
+						totalRow: function (d) {return d.TOTAL_ROW.cost}
+					},{
+						field: 'pay_status',
+						title: '打款状态',
+						align: 'center',
+						width: 90,
+						templet:function(d){
+							var html='<span class="red">『未打款』</span>';
+							if(d.pay_status==1){
+								html='<span class="yellow">『已打款』</span>';
+							}
+							return html;
+						}
+					},{
+						field: 'admin_name',
+						title: '报销人员',
+						align: 'center',
+						width: 90
+					},{
+						field: 'department',
+						title: '报销部门',
+						align: 'center',
+						width: 120
+					},{
+						field: 'code',
+						title: '报销凭证编号',
+						minWidth: 130,
+					},{
+						field: 'expense_time',
+						title: '原始单据日期',
+						align: 'center',
+						width: 110
+					},{
+						field: 'income_month',
+						title: '入账月份',
+						align: 'center',
+						width: 80
+					},{
+						field: 'create_time',
+						title: '录入时间',
+						align: 'center',
+						width: 150
+					},{
+						field: 'pay_name',
+						title: '打款人',
+						align: 'center',
+						width: 90
+					},{
+						field: 'pay_time',
+						title: '打款确认时间',
+						align: 'center',
+						width: 150
+					}, {
+						field: 'right',
+						fixed: 'right',
+						title: '操作',
+						width: 136,
+						align: 'center',
+						templet:function(d){
+							var html='<div class="layui-btn-group">';
+							var btn1='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</span>';
+							var btn2='<span class="layui-btn layui-btn-warm layui-btn-xs" lay-event="open">标记为已打款</span>';
+							html+=btn1;
+							if(d.pay_status==0 && auth==1){
+								html+=btn2;
+							}
+							html+='</div>';
+							return html;
+						}
+					}
+				]
+			]
+		});
+
+		//监听行工具事件
+		table.on('tool(test)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/finance/expense/view?id="+data.id);
+				return;
+			}
+			if(obj.event === 'open'){
+				layer.confirm('确定标记为已打款？', {
+					icon: 3,
+					title: '提示'
+				}, function(index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/finance/api/topay", {id: data.id}, callback);
+					layer.close(index);
+				});
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
diff --git a/app/finance/view/expense/view.html b/app/finance/view/expense/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..f90b6d5b45d1d7ff005d58efbb0189d4c3272e54
--- /dev/null
+++ b/app/finance/view/expense/view.html
@@ -0,0 +1,112 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="layui-form p-page">
+	<h3 class="pb-3">报销详情</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">凭证编号</td>
+			<td>{$detail.code}</td>
+			<td class="layui-td-gray">入账月份</td>
+			<td>{$detail.income_month}</td>
+			<td class="layui-td-gray-2">原始单据日期</td>
+			<td>{$detail.expense_time}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">报销主体</td>
+			<td colspan="5">{$detail.subject_name|default='-'}</td>
+		</tr>
+		{if condition="$detail.project_id > 0"}
+		<tr>
+			<td class="layui-td-gray">关联项目</td>
+			<td colspan="5">{$detail.ptname}</td>
+		</tr>
+		{/if}
+		<tr>
+			<td class="layui-td-gray">报销员工</td>
+			<td>{$detail.admin_name}</td>
+			<td class="layui-td-gray">报销部门</td>
+			<td>{$detail.department}</td>
+			<td class="layui-td-gray">报销总费用(元)</td>
+			<td><span style="color:#1E9FFF">{$detail.cost}</span></td>
+		</tr>
+		{if condition="$detail.pay_admin_id > 0"}
+		<tr>
+			<td class="layui-td-gray">打款人</td>
+			<td>{$detail.pay_admin}</td>
+			<td class="layui-td-gray">打款时间</td>
+			<td colspan="3">{$detail.pay_time}</td>
+		</tr>
+		{/if}
+		<tr>
+			<td class="layui-td-gray">报销选项</td>
+			<td colspan="5">	
+				<table class="layui-table layui-table-min" style="margin:0">
+					<tr>
+						<th width="100">报销金额(元)</th>
+						<th width="150">报销类别</th>
+						<th>备注信息</th>
+					</tr>
+					{volist name="$detail.list" id="vo"}
+					<tr>
+						<td>{$vo.amount}</td>
+						<td>{$vo.cate_title}</td>
+						<td style="text-align:left">{$vo.remarks}</td>
+					</tr>
+					{/volist}
+				</table>
+			</td>
+		</tr>
+		{notempty name="$detail.file_ids"}
+		<tr>
+			<td class="layui-td-gray">相关附件</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row">
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+		{if ( $detail.check_status eq 2)}
+			{if ( $detail.pay_status eq 1)}
+				<tr>
+					<td class="layui-td-gray">打款状态</td>
+					<td><span class="yellow">已打款</span></td>
+					<td class="layui-td-gray">打款人</td>
+					<td>{$detail.pay_admin}</td>
+					<td class="layui-td-gray">打款时间</td>
+					<td>{$detail.pay_time}</td>
+				</tr>
+			{else/}
+				<tr>
+					<td class="layui-td-gray">打款状态</td>
+					<td><span class="red">未打款</span></td>
+					<td class="layui-td-gray">打款人</td>
+					<td>-</td>
+					<td class="layui-td-gray">打款时间</td>
+					<td>-</td>
+				</tr>
+			{/if}
+		{/if}
+	</table>	
+
+	<div id="checkBox" class="pt-3" data-status="{$detail.check_status}" data-id="{$detail.id}" data-checkflowid="{$detail.check_flow_id}"></div>
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool','oaCheck'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool, oaCheck=layui.oaCheck;	
+	oaCheck.init({
+		check_name:'expense'
+	});
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/finance/view/expensecate/add.html b/app/finance/view/expensecate/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..975da2fade6d5af187165aa64d15437eb5286332
--- /dev/null
+++ b/app/finance/view/expensecate/add.html
@@ -0,0 +1,49 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">报销类型</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">报销类型名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入报销类型名称" lay-reqText="请输入报销类型名称"class="layui-input" value="{$detail.title|default=''}">
+			</td>
+			<td class="layui-td-gray">排序</td>
+			<td>
+				<input type="text" name="sort" placeholder="请输入排序，数字" autocomplete="off" class="layui-input" value="{$detail.sort|default=''}">
+			</td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$detail.id|default=0}"/>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool'];
+
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/finance/expensecate/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/finance/view/expensecate/datalist.html b/app/finance/view/expensecate/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..f4d8d6071b84405faf73d24775789b8a37086bb7
--- /dev/null
+++ b/app/finance/view/expensecate/datalist.html
@@ -0,0 +1,124 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<table class="layui-hide" id="table_expense_cate" lay-filter="table_expense_cate"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm add-new" type="button">+ 添加报销类型</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool;
+		
+		layui.pageTable = table.render({
+			elem: "#table_expense_cate"
+			,toolbar: '#toolbarDemo'
+			,url: "/finance/expensecate/datalist"
+			,page: false
+			,limit: 999
+			,cellMinWidth: 80
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',title: '类型名称'}
+				,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+					var html1='<span class="green">正常</span>';
+					var html2='<span class="yellow">禁用</span>';
+					if(d.status==1){
+						return html1;
+					}
+					else{
+						return html2;
+					}
+				}}
+				,{width:100,title: '操作', align:'center',ignoreExport:true,templet: function(d){
+					var html='';
+					var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+					if(d.status==1){
+						html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+					}
+					else{
+						html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+					}
+					return html;
+				}}
+			]]
+		});
+			
+		table.on('tool(table_expense_cate)',function (obj) {
+			if(obj.event === 'edit'){					
+				add_cate(obj.data.id,obj.data.title);
+			}
+			if(obj.event === 'disable'){
+				layer.confirm('确定要禁用该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/finance/expensecate/set", {id:obj.data.id,status: 0}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'open'){
+				layer.confirm('确定要启用该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/finance/expensecate/set", {id:obj.data.id,status:1}, callback);
+					layer.close(index);
+				});
+			}
+		});
+		
+		$('body').on('click','.add-new',function(){
+			add_cate(0,'');	
+		});
+		
+		function add_cate(id,val){
+			var title = '新增类型';
+			if(id>0){
+				title = '编辑类型';
+			}
+			layer.prompt({
+				title: title,
+				value: val,
+				yes: function(index, layero) {
+					// 获取文本框输入的值
+					var value = layero.find(".layui-layer-input").val();
+					if (value) {
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();				
+							}
+						}
+						tool.post("/finance/expensecate/add", {id: id,title: value}, callback);
+						layer.close(index);
+					} else {
+						layer.msg('请填写类型名称');
+					}
+				}
+			})
+		}
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/finance/view/expensecate/view.html b/app/finance/view/expensecate/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..ed6edd2b7d297cd257019a09c027afea818634fe
--- /dev/null
+++ b/app/finance/view/expensecate/view.html
@@ -0,0 +1,16 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<h3 class="pb-3">报销类型详情</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">报销类型名称</td>
+			<td>{$detail.title|default=''}"></td>
+			<td class="layui-td-gray">排序</td>
+			<td>{$detail.sort|default=0}</td>
+		</tr>
+	</table>
+</div>
+{/block}
+<!-- /主体 -->
\ No newline at end of file
diff --git a/app/finance/view/income/add.html b/app/finance/view/income/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..7ded12a78a95ad40e7567f0999f9c15673f1ff0a
--- /dev/null
+++ b/app/finance/view/income/add.html
@@ -0,0 +1,299 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+.layui-table-min th{font-size:13px; text-align:center; background-color:#f8f8f8;}
+.layui-table-min td{font-size:13px; padding:6px;text-align:center;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<div class="layui-form p-page">
+	<h3 class="pb-3">发票信息</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">发票金额(元)</td>
+			<td class="blue">{$detail.amount}</td>
+			<td class="layui-td-gray">发票类型</td>
+			<td>
+			{eq name="$detail.invoice_type" value="1"}增值税专用发票{/eq}
+			{eq name="$detail.invoice_type" value="2"}普通发票{/eq}
+			{eq name="$detail.invoice_type" value="3"}专业发票{/eq}
+			</td>
+			<td class="layui-td-gray">发票主体</td>
+			<td>{$detail.subject}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">抬头类型</td>
+			<td>
+				{eq name="$detail.types" value="1"}企业{/eq}
+				{eq name="$detail.types" value="2"}个人{/eq}
+			</td>
+			<td class="layui-td-gray">发票抬头</td>
+			<td>{$detail.invoice_title}</td>
+			<td class="layui-td-gray">电话号码</td>
+			<td>{$detail.invoice_phone}</td>
+		</tr>
+		<tr class="invoice-type" {eq name="$detail.type" value="2"}style="display:none"{/eq}>
+			<td class="layui-td-gray-2">纳税人识别号</td>
+			<td>{$detail.invoice_tax}</td>
+			<td class="layui-td-gray">开户行</td>
+			<td>{$detail.invoice_bank}</td>
+			<td class="layui-td-gray">银行账号</td>
+			<td>{$detail.invoice_account}</td>
+		</tr>
+		<tr class="invoice-type" {eq name="$detail.type" value="2"}style="display:none"{/eq}>
+			<td class="layui-td-gray-2">银行营业网点</td>
+			<td>{$detail.invoice_banking}</td>
+			<td class="layui-td-gray">地址</td>
+			<td colspan="3">{$detail.invoice_address}</td>
+		</tr>
+		{notempty name="$detail.remark"}
+		<tr>
+			<td class="layui-td-gray">备注信息</td>
+			<td colspan="5">{$detail.remark}</td>
+		</tr>
+		{/notempty}
+		{notempty name="$detail.file_ids"}
+		<tr>
+			<td class="layui-td-gray">关联附件</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row">
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+		{if condition="$detail.open_admin_id > 0"}
+		<tr>
+			<td class="layui-td-gray">发票号码</td>
+			<td>{$detail.code}</td>
+			<td class="layui-td-gray">开票人</td>
+			<td>{$detail.open_admin_name}</td>
+			<td class="layui-td-gray">开票时间</td>
+			<td>{$detail.open_time}</td>
+		</tr>
+		{/if}
+		{notempty name="$detail.other_file_ids"}
+		<tr>
+			<td class="layui-td-gray">发票附件</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row">
+					{volist name="$detail.other_file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+	</table>
+	
+	<h3 class="py-3">回款信息</h3>
+	<form class="layui-form">
+		<table class="layui-table layui-table-form">
+			<tr>
+				<td class="layui-td-gray">回款状态</td>
+				<td>
+					{if condition="($detail.enter_status == 0)"}
+						<span class="red">未回款</span>
+					{elseif condition="($detail.enter_status == 1)"}
+						<span class="blue">部分回款</span>
+					{elseif condition="($detail.enter_status == 2)"}
+						<span  class="green">全部回款</span>
+					{/if}
+				</td>
+				<td class="layui-td-gray-2">未回款金额(元)</td>
+				<td style="color:#FF5722">{$detail.not_income}</td>
+				<td class="layui-td-gray-2">已回款金额(元)</td>
+				<td style="color:#1E9FFF">{$detail.enter_amount}</td>
+			</tr>
+			<tr>
+				<td class="layui-td-gray">回款记录</td>
+				<td colspan="5">
+					<table id="interfix" class="layui-table layui-table-min" style="margin:0">
+						<tr>
+							<th style="width:200px;">回款日期</th>
+							<th style="width:200px;">到帐金额(元)</th>
+							<th>备注</th>
+							<th style="width:100px;">操作</th>
+						</tr>
+						{empty name="$detail.income"}
+						<tr class="none_interfix">
+							<td colspan="4" style="text-align: center;">暂无回款记录</td>
+						</tr>
+						{else/}
+						{volist name="$detail.income" id="vo"}
+						<tr class="more_interfix">
+							<td>{$vo.enter_time | date='Y-m-d'}</td>
+							<td>{$vo.amount}</td>
+							<td style="text-align:left;">{$vo.remarks}</td>
+							<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="remove" data-id="{$vo.id}" data-inid="{$id}">删除</a></td>
+						</tr>
+						{/volist}
+						{/empty}
+					</table>
+					{if condition="($detail.enter_status lt 2)"}
+					<div class="pt-3"><button class="layui-btn layui-btn-sm" type="button" id="addInterfix">+ 添加回款记录</button></div>
+					{/if}
+				</td>
+			</tr>
+		</table>
+		<div class="pt-3">
+			<input name="invoice_id" id="invoice_id" type="hidden" value="{$id}">
+			<input name="enter_type" id="enter_type" type="hidden" value="1">
+			{if condition="($detail.enter_status lt 2)"}
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">保存回款记录</button>
+			<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+			{/if}
+			{if condition="($detail.enter_status eq 0)"}
+			<span class="layui-btn layui-btn-danger" lay-event="all">全部回款</span>
+			{/if}
+			{if condition="($detail.enter_status eq 1)"}
+			<span class="layui-btn layui-btn-danger" lay-event="all">剩余部分全部回款</span>
+			{/if}
+			{if condition="($detail.enter_status gt 0)"}
+			<span class="layui-btn layui-btn-warm" lay-event="refue">全部反回款</span>
+			{/if}
+		</div>
+	</form>
+	<input type="hidden" name="id" value="{$detail.id}">
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool,laydate = layui.laydate;
+	//添加表格行
+	$('#addInterfix').on('click',function(){
+		var html = '';
+		html += '<tr class="more_interfix">';
+		html += '<td><input type="text" class="layui-input tool-time" name="enter_time[]" readonly lay-verify="required" lay-reqText="请选择回款日期">';
+		html += '<td><input type="text" class="layui-input" name="amount[]" lay-verify="required|number" lay-reqText="请输入回款金额,数字"></td>';
+		html += '<td><input type="text" class="layui-input" name="remarks[]"></td>';
+		html += '<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>';
+		html += '</tr>';
+		$("#interfix").find('.none_interfix').remove();
+		$("#interfix").append(html);
+		form.render();
+	});
+	//删除表格
+	$('#interfix').on('click', '[lay-event="del"]', function() {
+		$(this).parents(".more_interfix").remove();
+		if($("#interfix").find('.more_interfix').length<1){
+			$("#interfix").append('<tr class="none_interfix"><td colspan="4" style="text-align: center;">暂无回款记录</td></tr>');				
+		}
+	});
+
+	//删除回款记录
+	$('#interfix').on('click', '[lay-event="remove"]', function() {
+		var that=$(this);
+		var id=that.data('id');
+		var invoice_id=that.data('inid');
+		layer.confirm('确定要删除该回款记录?', {icon: 3, title:'提示'}, function(index){
+			$.ajax({
+				url: "/finance/income/del",
+				type:'post',
+				data:{id:id,invoice_id:invoice_id},
+				success:function(res){
+					layer.msg(res.msg);
+					if(res.code==0){
+						parent.layui.pageTable.reload();
+						window.setTimeout(function(){
+							location.reload();
+						},1200)	
+					}
+				}
+			})
+		})
+	});
+
+	//监听提交
+	form.on('submit(webform)', function(data){
+		console.log(data.field);
+		if($("#interfix").find('.tool-time').length<1){
+			layer.msg('请添加回款记录');
+			return false;
+		}
+		$.ajax({
+			url: "/finance/income/add",
+			type:'post',
+			data:data.field,
+			success:function(res){
+				layer.msg(res.msg);
+				if(res.code==0){
+					parent.layui.pageTable.reload();
+					window.setTimeout(function(){
+						location.reload();
+					},1200)	
+				}
+			}
+		})
+		return false;
+	});
+	
+	$('.layui-form').on('click', '[lay-event="refue"]', function () {
+		var invoice_id=$('#invoice_id').val();
+		layer.confirm('确定要全部反回款?', {icon: 3, title:'提示'}, function(index){
+			$.ajax({
+				url: "/finance/income/add",
+				type:'post',
+				data:{invoice_id:invoice_id,enter_type:3},
+				success:function(res){
+					layer.msg(res.msg);
+					if(res.code==0){
+						parent.layui.pageTable.reload();
+						window.setTimeout(function(){
+							location.reload();
+						},1200)	
+					}
+				}
+			})
+		})
+		return false;
+	})
+	$('.layui-form').on('click', '[lay-event="all"]', function () {
+		var invoice_id=$('#invoice_id').val();
+		layer.confirm('确定已经全部回款?', {icon: 3, title:'提示'}, function(idx){
+			layer.prompt({title: '选择回款日期', formType: 3,value :'',success: function(layero, index){
+				$('.layui-layer-input').attr('readonly',true);
+				lay('.layui-layer-input').each(function () {
+					laydate.render({
+						elem: this,
+						trigger: 'click',
+						showBottom:false
+					});
+				});
+				layer.close(idx);
+			}
+		}, function(enter_time, index){
+				if(enter_time ==''){
+					layer.msg('选择回款日期');
+					return false;
+				}
+				$.ajax({
+					url: "/finance/income/add",
+					type:'post',
+					data:{invoice_id:invoice_id,enter_type:2,enter_time:enter_time},
+					success:function(res){
+						layer.msg(res.msg);
+						if(res.code==0){
+							parent.layui.pageTable.reload();
+							window.setTimeout(function(){
+								location.reload();
+							},1200)	
+						}
+					}
+				})
+			})
+		})
+		return false;
+	})
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/finance/view/income/add_a.html b/app/finance/view/income/add_a.html
new file mode 100644
index 0000000000000000000000000000000000000000..92e4d1d38f6b163d66cce4b66482a07c3f83e70c
--- /dev/null
+++ b/app/finance/view/income/add_a.html
@@ -0,0 +1,271 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+.layui-table-min th{font-size:13px; text-align:center; background-color:#f8f8f8;}
+.layui-table-min td{font-size:13px; padding:6px;text-align:center;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<div class="layui-form p-page">
+	<h3 class="pb-3">无发票回款信息</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">预回款金额(元)</td>
+			<td class="blue">{$detail.amount}</td>
+			<td class="layui-td-gray">收款主体</td>
+			<td colspan="3">{$detail.subject}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">付款主体</td>
+			<td>
+				{eq name="$detail.types" value="1"}企业{/eq}
+				{eq name="$detail.types" value="2"}个人{/eq}
+			</td>
+			<td class="layui-td-gray-2">付款方名称</td>
+			<td>{$detail.invoice_title}</td>
+			<td class="layui-td-gray">电话号码</td>
+			<td>{$detail.invoice_phone}</td>
+		</tr>
+		<tr class="invoice-type" {eq name="$detail.type" value="2"}style="display:none"{/eq}>
+			<td class="layui-td-gray-2">纳税人识别号</td>
+			<td>{$detail.invoice_tax}</td>
+			<td class="layui-td-gray">开户行</td>
+			<td>{$detail.invoice_bank}</td>
+			<td class="layui-td-gray">银行账号</td>
+			<td>{$detail.invoice_account}</td>
+		</tr>
+		<tr class="invoice-type" {eq name="$detail.type" value="2"}style="display:none"{/eq}>
+			<td class="layui-td-gray-2">银行营业网点</td>
+			<td>{$detail.invoice_banking}</td>
+			<td class="layui-td-gray">地址</td>
+			<td colspan="3">{$detail.invoice_address}</td>
+		</tr>
+		{notempty name="$detail.remark"}
+		<tr>
+			<td class="layui-td-gray">备注信息</td>
+			<td colspan="5">{$detail.remark}</td>
+		</tr>
+		{/notempty}
+		{notempty name="$detail.file_ids"}
+		<tr>
+			<td class="layui-td-gray">关联附件</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row">
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+	</table>
+	
+	<h3 class="py-3">回款信息</h3>
+	<form class="layui-form">
+		<table class="layui-table layui-table-form">
+			<tr>
+				<td class="layui-td-gray">回款状态</td>
+				<td>
+					{if condition="($detail.enter_status == 0)"}
+						<span class="red">未回款</span>
+					{elseif condition="($detail.enter_status == 1)"}
+						<span class="blue">部分回款</span>
+					{elseif condition="($detail.enter_status == 2)"}
+						<span  class="green">全部回款</span>
+					{/if}
+				</td>
+				<td class="layui-td-gray-2">未回款金额(元)</td>
+				<td style="color:#FF5722">{$detail.not_income}</td>
+				<td class="layui-td-gray-2">已回款金额(元)</td>
+				<td style="color:#1E9FFF">{$detail.enter_amount}</td>
+			</tr>
+			<tr>
+				<td class="layui-td-gray">回款记录</td>
+				<td colspan="5">
+					<table id="interfix" class="layui-table layui-table-min" style="margin:0">
+						<tr>
+							<th style="width:200px;">回款日期</th>
+							<th style="width:200px;">到帐金额(元)</th>
+							<th>备注</th>
+							<th style="width:100px;">操作</th>
+						</tr>
+						{empty name="$detail.income"}
+						<tr class="none_interfix">
+							<td colspan="4" style="text-align: center;">暂无回款记录</td>
+						</tr>
+						{else/}
+						{volist name="$detail.income" id="vo"}
+						<tr class="more_interfix">
+							<td>{$vo.enter_time | date='Y-m-d'}</td>
+							<td>{$vo.amount}</td>
+							<td style="text-align:left;">{$vo.remarks}</td>
+							<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="remove" data-id="{$vo.id}" data-inid="{$id}">删除</a></td>
+						</tr>
+						{/volist}
+						{/empty}
+					</table>
+					{if condition="($detail.enter_status lt 2)"}
+					<div class="pt-3"><button class="layui-btn layui-btn-sm" type="button" id="addInterfix">+ 添加回款记录</button></div>
+					{/if}
+				</td>
+			</tr>
+		</table>
+		<div class="pt-3">
+			<input name="invoice_id" id="invoice_id" type="hidden" value="{$id}">
+			<input name="enter_type" id="enter_type" type="hidden" value="1">
+			{if condition="($detail.enter_status lt 2)"}
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">保存回款记录</button>
+			<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+			{/if}
+			{if condition="($detail.enter_status eq 0)"}
+			<span class="layui-btn layui-btn-danger" lay-event="all">全部回款</span>
+			{/if}
+			{if condition="($detail.enter_status eq 1)"}
+			<span class="layui-btn layui-btn-danger" lay-event="all">剩余部分全部回款</span>
+			{/if}
+			{if condition="($detail.enter_status gt 0)"}
+			<span class="layui-btn layui-btn-warm" lay-event="refue">全部反回款</span>
+			{/if}
+		</div>
+	</form>
+	<input type="hidden" name="id" value="{$detail.id}">
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool,laydate = layui.laydate;
+	//添加表格行
+	$('#addInterfix').on('click',function(){
+		var html = '';
+		html += '<tr class="more_interfix">';
+		html += '<td><input type="text" class="layui-input tool-time" name="enter_time[]" readonly lay-verify="required" lay-reqText="请选择回款日期">';
+		html += '<td><input type="text" class="layui-input" name="amount[]" lay-verify="required|number" lay-reqText="请输入回款金额,数字"></td>';
+		html += '<td><input type="text" class="layui-input" name="remarks[]"></td>';
+		html += '<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>';
+		html += '</tr>';
+		$("#interfix").find('.none_interfix').remove();
+		$("#interfix").append(html);
+		form.render();
+	});
+	//删除表格
+	$('#interfix').on('click', '[lay-event="del"]', function() {
+		$(this).parents(".more_interfix").remove();
+		if($("#interfix").find('.more_interfix').length<1){
+			$("#interfix").append('<tr class="none_interfix"><td colspan="4" style="text-align: center;">暂无回款记录</td></tr>');				
+		}
+	});
+
+	//删除回款记录
+	$('#interfix').on('click', '[lay-event="remove"]', function() {
+		var that=$(this);
+		var id=that.data('id');
+		var invoice_id=that.data('inid');
+		layer.confirm('确定要删除该回款记录?', {icon: 3, title:'提示'}, function(index){
+			$.ajax({
+				url: "/finance/income/del",
+				type:'post',
+				data:{id:id,invoice_id:invoice_id},
+				success:function(res){
+					layer.msg(res.msg);
+					if(res.code==0){
+						parent.layui.pageTable.reload();
+						window.setTimeout(function(){
+							location.reload();
+						},1200)	
+					}
+				}
+			})
+		})
+	});
+
+	//监听提交
+	form.on('submit(webform)', function(data){
+		console.log(data.field);
+		if($("#interfix").find('.tool-time').length<1){
+			layer.msg('请添加回款记录');
+			return false;
+		}
+		$.ajax({
+			url: "/finance/income/add",
+			type:'post',
+			data:data.field,
+			success:function(res){
+				layer.msg(res.msg);
+				if(res.code==0){
+					parent.layui.pageTable.reload();
+					window.setTimeout(function(){
+						location.reload();
+					},1200)	
+				}
+			}
+		})
+		return false;
+	});
+	
+	$('.layui-form').on('click', '[lay-event="refue"]', function () {
+		var invoice_id=$('#invoice_id').val();
+		layer.confirm('确定要全部反回款?', {icon: 3, title:'提示'}, function(index){
+			$.ajax({
+				url: "/finance/income/add",
+				type:'post',
+				data:{invoice_id:invoice_id,enter_type:3},
+				success:function(res){
+					layer.msg(res.msg);
+					if(res.code==0){
+						parent.layui.pageTable.reload();
+						window.setTimeout(function(){
+							location.reload();
+						},1200)	
+					}
+				}
+			})
+		})
+		return false;
+	})
+	$('.layui-form').on('click', '[lay-event="all"]', function () {
+		var invoice_id=$('#invoice_id').val();
+		layer.confirm('确定已经全部回款?', {icon: 3, title:'提示'}, function(idx){
+			layer.prompt({title: '选择回款日期', formType: 3,value :'',success: function(layero, index){
+				$('.layui-layer-input').attr('readonly',true);
+				lay('.layui-layer-input').each(function () {
+					laydate.render({
+						elem: this,
+						trigger: 'click',
+						showBottom:false
+					});
+				});
+				layer.close(idx);
+			}
+		}, function(enter_time, index){
+				if(enter_time ==''){
+					layer.msg('选择回款日期');
+					return false;
+				}
+				$.ajax({
+					url: "/finance/income/add",
+					type:'post',
+					data:{invoice_id:invoice_id,enter_type:2,enter_time:enter_time},
+					success:function(res){
+						layer.msg(res.msg);
+						if(res.code==0){
+							parent.layui.pageTable.reload();
+							window.setTimeout(function(){
+								location.reload();
+							},1200)	
+						}
+					}
+				})
+			})
+		})
+		return false;
+	})
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/finance/view/income/datalist.html b/app/finance/view/income/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..1bdba4079119c1cbdd9065665f6aac39c99b67fa
--- /dev/null
+++ b/app/finance/view/income/datalist.html
@@ -0,0 +1,199 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<div class="layui-card border-x border-t" style="margin-bottom:0; box-shadow:0 0 0 0 rgb(5 32 96 / 0%)">
+		<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
+			<ul class="layui-tab-title">
+				<li class="layui-this"><a href="/finance/income/datalist">有发票回款</a></li>
+				<li><a href="/finance/invoice/datalist_a">无发票回款</a></li>
+			</ul>
+		</div>
+	</div>
+	<form class="layui-form gg-form-bar border-x" id="barsearchform">
+		<div class="layui-input-inline" style="width:175px;">
+			<input type="text" class="layui-input" id="diff_time" placeholder="选择回款时间区间" readonly name="diff_time">
+		</div>
+		<div class="layui-input-inline" style="width:120px;">
+			<select name="enter_status">
+				<option value="">请选择状态</option>
+				<option value="0">未回款</option>
+				<option value="1">部分回款</option>
+				<option value="2">全部回款</option>
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<input type="hidden" name="tab" value="0"/>
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+<div class="layui-btn-container">
+    <h3 class="h3-title" style="height:32px;">回款列表</h3>
+</div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const auth = "{$auth}";
+	const moduleInit = ['tool','tablePlus','laydatePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool, laydatePlus = layui.laydatePlus, element = layui.element;
+		//tab切换
+		element.on('tab(tab)', function(data){
+			$('[name="tab"]').val(data.index);
+			$("#barsearchform")[0].reset();
+			layui.pageTable.reload({where:{tab:data.index},page:{curr:1}});
+			return false;
+		});
+		
+		//日期范围
+		var diff_time = new laydatePlus({'target':'diff_time'});
+		layui.pageTable = table.render({
+			elem: "#test"
+			,toolbar: "#toolbarDemo"
+			,url: "/finance/income/datalist"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 80
+			,height: 'full-152'
+			,cellMinWidth: 80		
+			,page: true //开启分页
+			,limit: 20
+			,cols: [
+				[
+					{
+						field: 'id',
+						title: 'ID号',
+						align: 'center',
+						width: 80
+					},{
+						field: 'enter_status',
+						title: '回款状态',
+						align: 'center',
+						width: 100,
+						templet:function(d){
+							var html='<span class="red">『未回款』</span>';
+							if(d.enter_status==1){
+								html='<span class="blue">『部分回款』</span>';
+							}
+							else if(d.enter_status==2){
+								html='<span class="green">『全部回款』</span>';
+							}
+							return html;
+						}
+					},{
+						field: 'enter_amount',
+						title: '回款金额(元)',
+						align: 'right',
+						width: 100,
+					},{
+						field: 'enter_time',
+						title: '最新回款时间',
+						align: 'center',
+						width: 136
+					}, {
+						field: 'invoice_title',
+						minWidth: 240,		
+						title: '发票抬头',
+						templet:function(d){
+							var html='<span class="layui-badge layui-bg-blue">企业</span> '+d.invoice_title;
+							if(d.types==2){
+								html='<span class="layui-badge layui-bg-green">个人</span> '+d.invoice_title;
+							}
+							return html;
+						}
+					},{
+						field: 'amount',
+						title: '发票金额(元)',
+						align: 'right',
+						width: 100,
+					},{
+						field: 'invoice_type',
+						title: '开票类型',
+						align: 'center',
+						width: 120,
+						templet:function(d){
+							var html='-';
+							if(d.invoice_type==1){
+								html='<span style="color:#1E9FFF">增值税专用发票</span>';
+							}
+							else if(d.invoice_type==2){
+								html='<span style="color:#5FB878">普通发票</span>';
+							}
+							else if(d.invoice_type==3){
+								html='<span style="color:#FFB800">专用发票</span>';
+							}
+							else{
+								html='<span style="color:#666666">无需开票</span>';
+							}
+							return html;
+						}
+					},{
+						field: 'admin_name',
+						title: '申请开票人',
+						align: 'center',
+						width: 90
+					},{
+						field: 'department',
+						title: '所属部门',
+						align: 'center',
+						width: 120
+					},{
+						field: 'create_time',
+						title: '申请时间',
+						align: 'center',
+						width: 150
+					},{
+						field: 'code',
+						title: '发票号码',
+						align: 'center',
+						width: 150
+					},{
+						field: 'open_time',
+						title: '开票日期',
+						align: 'center',
+						width: 90
+					}, {
+						field: 'right',
+						fixed: 'right',
+						title: '操作',
+						width: 136,
+						align: 'center',
+						templet:function(d){
+							var html='<div class="layui-btn-group">';
+							var btn1='<span class="layui-btn layui-btn-xs" lay-event="add">回款管理</span>';
+							var btn2='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">回款详情</span>';
+							if(auth == 1){
+								return html+btn1+btn2+'</div>';
+							}
+							else{
+								return html+btn2+'</div>';
+							}
+						}
+					}
+				]
+			]
+		});
+		//监听行工具事件
+		table.on('tool(test)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'add') {
+				tool.side("/finance/income/add?id="+data.id);
+				return;
+			}
+			if (obj.event === 'view') {
+				tool.side("/finance/income/view?id="+data.id);
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
diff --git a/app/finance/view/income/record.html b/app/finance/view/income/record.html
new file mode 100644
index 0000000000000000000000000000000000000000..c0aac7d7d75b675b14faa1df70bfb7f429dcd3c4
--- /dev/null
+++ b/app/finance/view/income/record.html
@@ -0,0 +1,117 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-x border-t" id="barsearchform">
+		<div class="layui-input-inline" style="width:175px;">
+			<input type="text" class="layui-input" id="diff_time" placeholder="选择回款时间区间" readonly name="diff_time">
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<input type="hidden" name="tab" value="0"/>
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+<div class="layui-btn-container">
+    <h3 class="h3-title" style="height:32px;">回款列表</h3>
+</div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus','laydatePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool, laydatePlus = layui.laydatePlus, element = layui.element;
+		//tab切换
+		element.on('tab(tab)', function(data){
+			$('[name="tab"]').val(data.index);
+			$("#barsearchform")[0].reset();
+			layui.pageTable.reload({where:{tab:data.index},page:{curr:1}});
+			return false;
+		});
+		
+		//日期范围
+		var diff_time = new laydatePlus({'target':'diff_time'});
+		layui.pageTable = table.render({
+			elem: "#test"
+			,toolbar: "#toolbarDemo"
+			,url: "/finance/income/record"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 80
+			,height: 'full-112'
+			,cellMinWidth: 80		
+			,page: true //开启分页
+			,limit: 20
+			,totalRow: true
+			,cols: [
+				[
+					{
+						field: 'id',
+						title: 'ID号',
+						align: 'center',
+						width: 80,
+						totalRowText: '<div style="text-align:right">合计</div>'
+					},{
+						field: 'amount',
+						title: '回款金额(元)',
+						style: 'color:#16b777',
+						align: 'right',
+						width: 120,
+						totalRow: function (d) {return d.TOTAL_ROW.amount}
+					},{
+						field: 'enter_time',
+						title: '回款时间',
+						align: 'center',
+						width: 110
+					},{
+						field: 'remarks',
+						title: '回款备注'
+					},{
+						field: 'admin_name',
+						title: '登记人',
+						align: 'center',
+						width: 90
+					},{
+						field: 'create_time',
+						title: '登记时间',
+						align: 'center',
+						width: 150
+					},{
+						field: 'code',
+						title: '关联发票号',
+						align: 'center',
+						width: 150
+					},{
+						field: 'right',
+						fixed: 'right',
+						title: '操作',
+						width: 90,
+						align: 'center',
+						templet:function(d){
+							var html='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">回款详情</span>';
+							return html;
+						}
+					}
+				]
+			]
+		});
+
+		//监听行工具事件
+		table.on('tool(test)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/finance/income/view?id="+data.invoice_id);
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
diff --git a/app/finance/view/income/view.html b/app/finance/view/income/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..6f75b92c05e7e3b35e28f6c4f40e482b1f718441
--- /dev/null
+++ b/app/finance/view/income/view.html
@@ -0,0 +1,247 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="layui-form p-page">
+	{eq name="$detail.invoice_type" value="0"}
+	<h3 class="pb-3">无发票回款信息</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">预回款金额(元)</td>
+			<td class="blue">{$detail.amount}</td>
+			<td class="layui-td-gray">收款主体</td>
+			<td colspan="3">{$detail.subject}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">付款主体</td>
+			<td>
+				{eq name="$detail.types" value="1"}企业{/eq}
+				{eq name="$detail.types" value="2"}个人{/eq}
+			</td>
+			<td class="layui-td-gray-2">付款方名称</td>
+			<td>{$detail.invoice_title}</td>
+			<td class="layui-td-gray">电话号码</td>
+			<td>{$detail.invoice_phone}</td>
+		</tr>
+		<tr class="invoice-type" {eq name="$detail.type" value="2"}style="display:none"{/eq}>
+			<td class="layui-td-gray-2">纳税人识别号</td>
+			<td>{$detail.invoice_tax}</td>
+			<td class="layui-td-gray">开户行</td>
+			<td>{$detail.invoice_bank}</td>
+			<td class="layui-td-gray">银行账号</td>
+			<td>{$detail.invoice_account}</td>
+		</tr>
+		<tr class="invoice-type" {eq name="$detail.type" value="2"}style="display:none"{/eq}>
+			<td class="layui-td-gray-2">银行营业网点</td>
+			<td>{$detail.invoice_banking}</td>
+			<td class="layui-td-gray">地址</td>
+			<td colspan="3">{$detail.invoice_address}</td>
+		</tr>
+		{notempty name="$detail.remark"}
+		<tr>
+			<td class="layui-td-gray">备注信息</td>
+			<td colspan="5">{$detail.remark}</td>
+		</tr>
+		{/notempty}
+		{notempty name="$detail.file_ids"}
+		<tr>
+			<td class="layui-td-gray">关联附件</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row">
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+		{notempty name="$detail.other_file_ids"}
+		<tr>
+			<td class="layui-td-gray">发票附件</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row">
+					{volist name="$detail.other_file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+	</table>
+	{else/}
+	<h3 class="pb-3">发票信息</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">发票金额(元)</td>
+			<td class="blue">{$detail.amount}</td>
+			<td class="layui-td-gray">发票类型</td>
+			<td>
+			{eq name="$detail.invoice_type" value="1"}增值税专用发票{/eq}
+			{eq name="$detail.invoice_type" value="2"}普通发票{/eq}
+			{eq name="$detail.invoice_type" value="3"}专业发票{/eq}
+			</td>
+			<td class="layui-td-gray">发票主体</td>
+			<td>{$detail.subject}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">抬头类型</td>
+			<td>
+				{eq name="$detail.types" value="1"}企业{/eq}
+				{eq name="$detail.types" value="2"}个人{/eq}
+			</td>
+			<td class="layui-td-gray">发票抬头</td>
+			<td>{$detail.invoice_title}</td>
+			<td class="layui-td-gray">电话号码</td>
+			<td>{$detail.invoice_phone}</td>
+		</tr>
+		<tr class="invoice-type" {eq name="$detail.type" value="2"}style="display:none"{/eq}>
+			<td class="layui-td-gray-2">纳税人识别号</td>
+			<td>{$detail.invoice_tax}</td>
+			<td class="layui-td-gray">开户行</td>
+			<td>{$detail.invoice_bank}</td>
+			<td class="layui-td-gray">银行账号</td>
+			<td>{$detail.invoice_account}</td>
+		</tr>
+		<tr class="invoice-type" {eq name="$detail.type" value="2"}style="display:none"{/eq}>
+			<td class="layui-td-gray-2">银行营业网点</td>
+			<td>{$detail.invoice_banking}</td>
+			<td class="layui-td-gray">地址</td>
+			<td colspan="3">{$detail.invoice_address}</td>
+		</tr>
+		{notempty name="$detail.remark"}
+		<tr>
+			<td class="layui-td-gray">备注信息</td>
+			<td colspan="5">{$detail.remark}</td>
+		</tr>
+		{/notempty}
+		{notempty name="$detail.file_ids"}
+		<tr>
+			<td class="layui-td-gray">关联附件</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row">
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+		{if condition="$detail.open_admin_id > 0"}
+		<tr>
+			<td class="layui-td-gray">发票号码</td>
+			<td>{$detail.code}</td>
+			<td class="layui-td-gray">开票人</td>
+			<td>{$detail.open_admin_name}</td>
+			<td class="layui-td-gray">开票时间</td>
+			<td>{$detail.open_time|date='Y-m-d'}</td>
+		</tr>
+		{/if}
+		{notempty name="$detail.other_file_ids"}
+		<tr>
+			<td class="layui-td-gray">发票附件</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row">
+					{volist name="$detail.other_file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+	</table>
+	{/eq}
+	<h3 class="py-3">回款信息</h3>
+	<form class="layui-form">
+		<table class="layui-table layui-table-form">
+			<tr>
+				<td class="layui-td-gray">回款状态</td>
+				<td>
+					{if condition="($detail.enter_status == 0)"}
+						<span class="red">未回款</span>
+					{elseif condition="($detail.enter_status == 1)"}
+						<span class="blue">部分回款</span>
+					{elseif condition="($detail.enter_status == 2)"}
+						<span  class="green">全部回款</span>
+					{/if}
+				</td>
+				<td class="layui-td-gray-2">未回款金额(元)</td>
+				<td class="red">{$detail.not_income}</td>
+				<td class="layui-td-gray-2">已回款金额(元)</td>
+				<td class="green">{$detail.enter_amount}</td>
+			</tr>
+			<tr>
+				<td class="layui-td-gray">回款记录</td>
+				<td colspan="5">
+					<table class="layui-table layui-table-min" style="margin:0">
+						<tr>
+							<th style="width:150px;">回款日期</th>
+							<th style="width:150px;">回款金额(元)</th>
+							<th>备注</th>
+							<th style="width:100px;">登记人</th>
+							<th style="width:150px;">登记时间</th>
+						</tr>
+						{empty name="$detail.income"}
+						<tr class="none_interfix">
+							<td colspan="5" style="text-align: center;">暂无回款记录</td>
+						</tr>
+						{else/}
+						{volist name="$detail.income" id="vo"}
+						<tr class="more_interfix">
+							<td>{$vo.enter_time | date='Y-m-d'}</td>
+							<td>{$vo.amount}</td>
+							<td style="text-align:left;">{$vo.remarks}</td>
+							<td>{$vo.admin}</td>
+							<td>{$vo.create_time | date='Y-m-d H:i:s'}</td>
+						</tr>
+						{/volist}
+						{/empty}
+					</table>
+				</td>
+			</tr>
+		</table>
+	</form>
+	<input type="hidden" name="id" value="{$detail.id}">
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool','oaTool'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool, oaTool = layui.oaTool;
+
+	oaTool.addFile({
+		isSave:true,
+		uidDelete:true,
+		ajaxSave:function(val){
+			$.ajax({
+				url: "/finance/api/upload",
+				type:'post',
+				data:{
+					id:$('[name="id"]').val(),
+					other_file_ids:val
+				},
+				success: function (e) {
+					location.reload();
+				}
+			})
+		},
+		ajaxDelete:function(val){
+			$.ajax({
+				url: "/finance/api/upload",
+				type:'post',
+				data:{
+					id:$('[name="id"]').val(),
+					other_file_ids:val
+				},
+				success: function (e) {
+					location.reload();
+				}
+			})
+		}
+	})
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/finance/view/invoice/add.html b/app/finance/view/invoice/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..bfe77c94a50323bfbee9e4ba7bd22c62af5cba03
--- /dev/null
+++ b/app/finance/view/invoice/add.html
@@ -0,0 +1,168 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">新增开票申请</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">开票金额<font>*</font></td>
+			<td>
+				<input type="text" class="layui-input" name="amount" lay-verify="required|number" placeholder="请输入开票金额" lay-reqText="请输入开票金额" value="">	
+			</td>
+			<td class="layui-td-gray">开票类型<font>*</font></td>
+			<td>
+			<select name="invoice_type" lay-verify="required" lay-reqText="请选择开票类型">
+				<option value="">请选择开票类型</option>
+				<option value="1">增值税专用发票</option>
+				<option value="2">普通发票</option>
+				<option value="3">专业发票</option>
+			  </select>
+			</td>
+			<td class="layui-td-gray">开票主体<font>*</font></td>
+			<td>
+				<select name="invoice_subject" lay-verify="required" lay-reqText="请选择开票主体">
+					<option value="">请选择开票主体</option>
+					{volist name=":get_base_data('enterprise')" id="vo"}
+					<option value="{$vo.id}">{$vo.title}</option>
+					{/volist}
+				</select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">抬头类型<font>*</font></td>
+			<td>
+				<input type="radio" name="types" lay-filter="type" value="1" title="企业" checked>
+				<input type="radio" name="types" lay-filter="type" value="2" title="个人">
+			</td>
+			<td class="layui-td-gray-2">开票抬头<span class="layui-btn layui-btn-xs invoice-qiye customer-picker">选择</span></td>
+			<td><input type="text" name="invoice_title" class="layui-input" value="" placeholder="请输入开票抬头" lay-verify="required"  lay-reqText="请输入开票抬头"></td>
+			<td class="layui-td-gray-2">纳税人识别号<font>*</font></td>
+			<td><input type="text" name="invoice_tax" class="layui-input" value=""  placeholder="请输入纳税人识别号，个人输入身份证号码"lay-verify="required"  lay-reqText="请输入纳税人识别号，个人输入身份证号码"></td>
+		</tr>
+		<tr class="invoice-qiye">
+			<td class="layui-td-gray">开户行<font>*</font></td>
+			<td><input type="text" name="invoice_bank" class="layui-input" value=""></td>
+			<td class="layui-td-gray">银行账号<font>*</font></td>
+			<td><input type="text" name="invoice_account" class="layui-input" value=""></td>
+			<td class="layui-td-gray-2">银行营业网点</td>
+			<td><input type="text" name="invoice_banking" class="layui-input" value=""></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">电话号码</td>
+			<td><input type="text" name="invoice_phone" class="layui-input" value=""></td>
+			<td class="layui-td-gray">地址</td>
+			<td colspan="3"><input type="text" name="invoice_address" class="layui-input" value=""></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">关联合同</td>
+			<td colspan="5">
+				<input type="text" class="layui-input picker-oa" data-types="contract" name="contract_name" placeholder="请选择需要关联的合同" readonly value="">		
+				<input type="hidden" class="layui-input" name="contract_id" value="0">		
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">关联项目</td>
+			<td colspan="5">
+				<input type="text" class="layui-input picker-oa" data-types="project" name="project_name" placeholder="请选择需要关联的项目" readonly value="">		
+				<input type="hidden" class="layui-input" name="project_id" value="0">		
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">
+				<div class="layui-input-inline">附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="">
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">备注信息</td>
+			<td colspan="5"><textarea name="remark" placeholder="请输入备注信息" class="layui-textarea"></textarea></td>
+		</tr>
+	</table>
+	<div id="checkBox" data-status="0" data-id="0" data-checkflowid="0" class="pt-3"></div>
+	<div class="pt-4">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool','oaPicker','oaCheck','uploadPlus'];
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool, oaPicker = layui.oaPicker,oaCheck = layui.oaCheck,uploadPlus = layui.uploadPlus;
+		//选择抬头类型
+		form.on('radio(type)', function (data) {
+			if(data.value==2){
+				$('.invoice-qiye').hide();
+			}
+			else{
+				$('.invoice-qiye').show();
+			}
+		});
+		
+		//相关附件上传
+		var attachment = new uploadPlus();
+		
+		//审批相关
+		oaCheck.init({
+			check_name:'invoice',
+			check_btn:0
+		});
+		
+		$('.customer-picker').on('click',function(){
+			let that = $(this),ids = [],titles=[],tax_num=[],tax_bank=[],tax_banksn=[],tax_mobile=[],tax_address=[];
+			let callback = function(data){
+				for ( var i = 0; i <data.length; i++){
+					ids.push(data[i].id);
+					titles.push(data[i].name);
+					tax_num.push(data[i].tax_num);
+					tax_bank.push(data[i].tax_bank);
+					tax_banksn.push(data[i].tax_banksn);
+					tax_mobile.push(data[i].tax_mobile);
+					tax_address.push(data[i].tax_address);
+				}
+				//that.val(titles.join(','));
+				//that.next().val(ids.join(','));
+				$('[name="invoice_title"]').val(titles.join(','));
+				$('[name="invoice_tax"]').val(tax_num.join(','));
+				$('[name="invoice_bank"]').val(tax_bank.join(','));
+				$('[name="invoice_account"]').val(tax_banksn.join(','));
+				$('[name="invoice_phone"]').val(tax_mobile.join(','));
+				$('[name="invoice_address"]').val(tax_address.join(','));
+			}
+			oaPicker.picker('customer',1,callback,{});
+		});
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					let checkCallback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							tool.sideClose(1000);				
+						}
+					}
+					data.field.check_name = 'invoice';
+					data.field.action_id = e.data.return_id;
+					oaCheck.submit(data.field,checkCallback);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/finance/invoice/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/finance/view/invoice/add_a.html b/app/finance/view/invoice/add_a.html
new file mode 100644
index 0000000000000000000000000000000000000000..7e848e32cb1840ee7375507d71f48f678eb1c238
--- /dev/null
+++ b/app/finance/view/invoice/add_a.html
@@ -0,0 +1,157 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">新增无发票回款申请</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray-3">预回款金额(元)<font>*</font></td>
+			<td><input type="text" class="layui-input" name="amount" lay-verify="required|number" placeholder="请输入预回款金额" lay-reqText="请输入预回款金额" value=""></td>
+			<td class="layui-td-gray">收款主体<font>*</font></td>
+			<td colspan="3">
+				<select name="invoice_subject" lay-verify="required" lay-reqText="请选择收款主体">
+					<option value="">请选择收款主体</option>
+					{volist name=":get_base_data('enterprise')" id="vo"}
+					<option value="{$vo.id}">{$vo.title}</option>
+					{/volist}
+				</select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">付款主体<font>*</font></td>
+			<td>
+				<input type="radio" name="types" lay-filter="type" value="1" title="企业" checked>
+				<input type="radio" name="types" lay-filter="type" value="2" title="个人">
+			</td>
+			<td class="layui-td-gray-2">付款方名称<span class="layui-btn layui-btn-xs invoice-qiye customer-picker">选择</span></td>
+			<td><input type="text" name="invoice_title" class="layui-input" value="" placeholder="请输入付款方名称" lay-verify="required"  lay-reqText="请输入付款方名称"></td>
+			<td class="layui-td-gray-2">纳税人识别号<font>*</font></td>
+			<td><input type="text" name="invoice_tax" class="layui-input" value=""  placeholder="请输入纳税人识别号，个人输入身份证号码"lay-verify="required"  lay-reqText="请输入纳税人识别号，个人输入身份证号码"></td>
+		</tr>
+		<tr class="invoice-qiye">
+			<td class="layui-td-gray">开户行</td>
+			<td><input type="text" name="invoice_bank" class="layui-input" value="" placeholder="请输入付款方开户行"></td>
+			<td class="layui-td-gray">银行账号</td>
+			<td><input type="text" name="invoice_account" class="layui-input" value="" placeholder="请输入付款方银行账号"></td>
+			<td class="layui-td-gray-2">银行营业网点</td>
+			<td><input type="text" name="invoice_banking" class="layui-input" value="" placeholder="请输入付款方银行营业网点"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">电话号码</td>
+			<td><input type="text" name="invoice_phone" class="layui-input" value="" placeholder="请输入付款方电话号码"></td>
+			<td class="layui-td-gray">地址</td>
+			<td colspan="3"><input type="text" name="invoice_address" class="layui-input" value="" placeholder="请输入付款方地址"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">关联合同</td>
+			<td colspan="5">
+				<input type="text" class="layui-input picker-oa" data-types="contract" name="contract_name" placeholder="请选择需要关联的合同" readonly value="">		
+				<input type="hidden" class="layui-input" name="contract_id" value="0">		
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">关联项目</td>
+			<td colspan="5">
+				<input type="text" class="layui-input picker-oa" data-types="project" name="project_name" placeholder="请选择需要关联的项目" readonly value="">		
+				<input type="hidden" class="layui-input" name="project_id" value="0">		
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">
+				<div class="layui-input-inline">附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="">
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">备注信息</td>
+			<td colspan="5"><textarea name="remark" placeholder="请输入备注信息" class="layui-textarea"></textarea></td>
+		</tr>
+	</table>
+	<div id="checkBox" data-status="0" data-id="0" data-checkflowid="0" class="pt-3"></div>
+	<div class="pt-4">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool','oaPicker','oaCheck','uploadPlus'];
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool, oaPicker = layui.oaPicker,oaCheck = layui.oaCheck,uploadPlus = layui.uploadPlus;
+		//选择抬头类型
+		form.on('radio(type)', function (data) {
+			if(data.value==2){
+				$('.invoice-qiye').hide();
+			}
+			else{
+				$('.invoice-qiye').show();
+			}
+		});
+		
+		//相关附件上传
+		var attachment = new uploadPlus();
+		
+		//审批相关
+		oaCheck.init({
+			check_name:'invoicea',
+			check_btn:0
+		});
+		
+		$('.customer-picker').on('click',function(){
+			let that = $(this),ids = [],titles=[],tax_num=[],tax_bank=[],tax_banksn=[],tax_mobile=[],tax_address=[];
+			let callback = function(data){
+				for ( var i = 0; i <data.length; i++){
+					ids.push(data[i].id);
+					titles.push(data[i].name);
+					tax_num.push(data[i].tax_num);
+					tax_bank.push(data[i].tax_bank);
+					tax_banksn.push(data[i].tax_banksn);
+					tax_mobile.push(data[i].tax_mobile);
+					tax_address.push(data[i].tax_address);
+				}
+				//that.val(titles.join(','));
+				//that.next().val(ids.join(','));
+				$('[name="invoice_title"]').val(titles.join(','));
+				$('[name="invoice_tax"]').val(tax_num.join(','));
+				$('[name="invoice_bank"]').val(tax_bank.join(','));
+				$('[name="invoice_account"]').val(tax_banksn.join(','));
+				$('[name="invoice_phone"]').val(tax_mobile.join(','));
+				$('[name="invoice_address"]').val(tax_address.join(','));
+			}
+			oaPicker.picker('customer',1,callback,{});
+		});
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					let checkCallback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							tool.sideClose(1000);				
+						}
+					}
+					data.field.check_name = 'invoicea';
+					data.field.action_id = e.data.return_id;
+					oaCheck.submit(data.field,checkCallback);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/finance/invoice/add_a", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/finance/view/invoice/datalist.html b/app/finance/view/invoice/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..75cc58e2bc9515a1f9e5bf818ffdd0aa402ec158
--- /dev/null
+++ b/app/finance/view/invoice/datalist.html
@@ -0,0 +1,237 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+.tab-5 .search-item,.tab-6 .search-item{display:none;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<div class="layui-card border-x border-t" style="margin-bottom:0; box-shadow:0 0 0 0 rgb(5 32 96 / 0%)">
+		<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
+			<ul class="layui-tab-title">
+				<li class="layui-this">全部</li>
+				<li>我申请的</li>
+				<li>待我审批</li>
+				<li>我已审批</li>
+				<li>抄送我的</li>
+				<li>已开具</li>
+				<li>已作废</li>
+			</ul>
+		</div>
+	</div>
+	<form class="layui-form gg-form-bar border-x tab-0" id="barsearchform">
+		<div class="layui-input-inline" style="width:175px;">
+			<input type="text" class="layui-input" id="diff_time" placeholder="选择开票时间区间" readonly name="diff_time">
+		</div>
+		<div class="layui-input-inline  search-item" style="width:120px;">
+			<select name="check_status">
+				<option value="">选择审批状态</option>
+				{volist name=":get_check_status()" id="vo"}
+				<option value="{$key}">{$vo}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline  search-item" style="width:120px;">
+			<select name="open_status">
+				<option value="">开票状态</option>
+				<option value="0">未开票</option>
+				<option value="1">已开票</option>
+				<option value="2">已作废</option>
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<input type="hidden" name="tab" value="0"/>
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_invoice" lay-filter="table_invoice"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm tool-add" type="button" data-href="/finance/invoice/add">+ 添加开票申请</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus','laydatePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool, laydatePlus = layui.laydatePlus, element = layui.element;
+		//tab切换
+		element.on('tab(tab)', function(data){
+			$('[name="tab"]').val(data.index);
+			$("#barsearchform")[0].reset();
+			$("#barsearchform").attr('class','layui-form gg-form-bar border-x tab-'+data.index);
+			layui.pageTable.reload({where:{tab:data.index},page:{curr:1}});
+			return false;
+		});
+		
+		//日期范围
+		var diff_time = new laydatePlus({'target':'diff_time'});
+		
+		layui.pageTable = table.render({
+			elem: "#table_invoice"
+			,toolbar: "#toolbarDemo"
+			,title: '发票列表'
+			,url: "/finance/invoice/datalist"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 80
+			,height: 'full-152'
+			,cols: [[
+				{
+						field: 'id',
+						title: 'ID号',
+						align: 'center',
+						width: 80
+					},{
+						field: 'invoice_title',
+						title: '开票抬头',
+						minWidth: 240,	
+						templet:function(d){
+							var html='<span class="layui-badge layui-bg-blue">企业</span> '+d.invoice_title;
+							if(d.types==2){
+								html='<span class="layui-badge layui-bg-green">个人</span> '+d.invoice_title;
+							}
+							return html;
+						}
+					}, {
+						field: 'amount',
+						title: '发票金额(元)',
+						align: 'right',
+						width: 100,
+					},{
+						field: 'invoice_type',
+						title: '开票类型',
+						align: 'center',
+						width: 120,
+						templet:function(d){
+							var html='-';
+							if(d.invoice_type==1){
+								html='<span class="green">增值税专用发票</span>';
+							}
+							else if(d.invoice_type==2){
+								html='<span class="blue">普通发票</span>';
+							}
+							else if(d.invoice_type==3){
+								html='<span class="red">专业发票</span>';
+							}
+							return html;
+						}
+					},{
+						field:'check_status',title: '审批状态',width:100, align:'center',templet: function(d){
+							var html = '<span class="check-status-color-'+d.check_status+'">『'+d.check_status_str+'』</span>';
+							return html;
+						}
+					},
+					{
+						field: 'admin_name',
+						title: '发票申请员工',
+						align: 'center',
+						width: 100
+					},{
+						field: 'department',
+						title: '发票申请部门',
+						align: 'center',
+						width: 120
+					},{
+						field: 'create_time',
+						title: '申请时间',
+						align: 'center',
+						width: 150
+					},{
+						field: 'check_user',
+						title: '当前审核人'
+					},{
+						field: 'open_status',
+						title: '开票状态',
+						align: 'center',
+						width: 90,
+						templet:function(d){
+							var html='';
+							if(d.check_status==2){
+								html = '<span class="red">『未开票』</span>';
+								if(d.open_status==1){
+									html = '<span class="green">『已开票』</span>';
+								}
+							}
+							else{
+								html='-';
+							}
+							return html;
+						}
+					},{
+						field: 'open_name',
+						title: '开票人',
+						align: 'center',
+						width: 90
+					},{
+						field: 'open_time',
+						title: '开票日期',
+						align: 'center',
+						width: 100
+					},{
+						field: 'code',
+						title: '发票号码',
+						align: 'center',
+						width: 120
+					},{
+						field: 'right',
+						fixed: 'right',
+						title: '操作',
+						width: 130,
+						align: 'center',
+						templet:function(d){
+							var html='<div class="layui-btn-group">';
+							var btn1='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</span>';
+							var btn2='<span class="layui-btn layui-btn-xs" lay-event="edit">编辑</span>';
+							var btn3='<span class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</span>';
+							html+=btn1;
+							if((d.check_status==0 ||d.check_status==4) && d.admin_id==login_admin){
+								html+=btn2+btn3;
+							}
+							html+='</div>';
+							return html;
+						}
+					}
+				]
+			]
+		});
+			
+		table.on('tool(table_invoice)',function (obj) {
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/finance/invoice/view?id="+data.id);
+				return;
+			}
+			if (obj.event === 'edit') {
+				tool.side("/finance/invoice/add?id="+data.id);
+				return;
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要删除该内容吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/finance/invoice/del", { id: data.id }, callback);
+					layer.close(index);
+				});
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/finance/view/invoice/datalist_a.html b/app/finance/view/invoice/datalist_a.html
new file mode 100644
index 0000000000000000000000000000000000000000..64f817e31f67b08731d11418f8f5e08ad9bea586
--- /dev/null
+++ b/app/finance/view/invoice/datalist_a.html
@@ -0,0 +1,270 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<div class="layui-card border-x border-t" style="margin-bottom:0; box-shadow:0 0 0 0 rgb(5 32 96 / 0%)">
+		<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
+			<ul class="layui-tab-title">
+				<li><a href="/finance/income/datalist">有发票回款</a></li>
+				<li class="layui-this"><a href="/finance/invoice/datalist_a">无发票回款</a></li>
+			</ul>
+		</div>
+	</div>
+	<form class="layui-form gg-form-bar border-x" id="barsearchform">
+		<div class="layui-input-inline" style="width:175px;">
+			<input type="text" class="layui-input" id="diff_time" placeholder="选择回款时间区间" readonly name="diff_time">
+		</div>
+		<div class="layui-input-inline" style="width:120px;">
+			<select name="enter_status">
+				<option value="">请选择状态</option>
+				<option value="0">未回款</option>
+				<option value="1">部分回款</option>
+				<option value="2">全部回款</option>
+			</select>
+		</div>
+		<div class="layui-input-inline  search-item" style="width:120px;">
+			<select name="check_status">
+				<option value="">选择审批状态</option>
+				{volist name=":get_check_status()" id="vo"}
+				<option value="{$key}">{$vo}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm tool-add" type="button" data-href="/finance/invoice/add_a">+ 添加无发票回款申请</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const auth = "{$auth}";
+	const moduleInit = ['tool','tablePlus','laydatePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool, laydatePlus = layui.laydatePlus, element = layui.element;
+		
+		//日期范围
+		var diff_time = new laydatePlus({'target':'diff_time'});
+		layui.pageTable = table.render({
+			elem: "#test"
+			,toolbar: "#toolbarDemo"
+			,url: "/finance/invoice/datalist_a"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 80
+			,height: 'full-152'
+			,cellMinWidth: 80		
+			,page: true //开启分页
+			,limit: 20
+			,cols: [
+				[
+					{
+						field: 'id',
+						title: 'ID号',
+						align: 'center',
+						width: 80
+					},{
+						field: 'enter_status',
+						title: '回款状态',
+						align: 'center',
+						width: 100,
+						templet:function(d){
+							var html='<span class="red">『未回款』</span>';
+							if(d.enter_status==1){
+								html='<span class="blue">『部分回款』</span>';
+							}
+							else if(d.enter_status==2){
+								html='<span class="green">『全部回款』</span>';
+							}
+							return html;
+						}
+					},{
+						field: 'enter_amount',
+						title: '回款金额(元)',
+						align: 'right',
+						width: 100,
+					},{
+						field: 'enter_time',
+						title: '最新回款时间',
+						align: 'center',
+						width: 136
+					},{
+						field: 'invoice_title',
+						minWidth: 240,		
+						title: '回款方名称',
+						templet:function(d){
+							var html='<span class="layui-badge layui-bg-blue">企业</span> '+d.invoice_title;
+							if(d.types==2){
+								html='<span class="layui-badge layui-bg-green">个人</span> '+d.invoice_title;
+							}
+							return html;
+						}
+					},{field:'check_status',title: '审批状态',width:110, align:'center',templet: function(d){
+							let html='';
+							if(d.open_status==2){
+								html = '<span class="check-status-color-3">『已作废』</span>';
+							}
+							else{
+								html = '<span class="check-status-color-'+d.check_status+'">『'+d.check_status_str+'』</span>';
+							}							
+							return html;
+						}
+					},{
+						field: 'amount',
+						title: '申请回款金额(元)',
+						align: 'right',
+						width: 120,
+					},{
+						field: 'admin_name',
+						title: '申请回款人',
+						align: 'center',
+						width: 90
+					},{
+						field: 'department',
+						title: '所属部门',
+						align: 'center',
+						width: 120
+					},{
+						field: 'create_time',
+						title: '申请时间',
+						align: 'center',
+						width: 150
+					},{
+						field: 'check_user',
+						title: '当前审核人'
+					},{
+						field: 'right',
+						fixed: 'right',
+						title: '操作',
+						width: 180,
+						align: 'center',
+						templet:function(d){
+							var html='<div class="layui-btn-group">';
+							var btn1='<span class="layui-btn layui-btn-xs" lay-event="add">回款管理</span>';
+							var btn2='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">回款详情</span>';
+							var btn3='<span class="layui-btn layui-btn-danger layui-btn-xs" lay-event="tovoid">作废</span>';
+							var btn4='<span class="layui-btn layui-btn-danger layui-btn-xs" lay-event="novoid">反作废</span>';
+							
+							var btna1='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view_a">详情</span>';
+							var btna2='<span class="layui-btn layui-btn-xs" lay-event="edit_a">编辑</span>';
+							var btna3='<span class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del_a">删除</span>';
+							if(d.check_status==2){
+								if(auth == 1){
+									if(d.enter_status==0){
+										if(d.open_status==2){
+											html+=btn4+'</div>';
+										}
+										else{
+											html+=btn1+btn2+btn3+'</div>';
+										}
+									}
+									else{
+										html+=btn1+btn2+'</div>';
+									}
+								}
+								else{
+									html+=btn2+'</div>';
+								}
+							}
+							else{
+								html+=btna1;
+								if((d.check_status==0 ||d.check_status==4) && d.admin_id==login_admin){
+									html+=btna2+btna3;
+								}
+								html+='</div>';
+							}
+							return html;
+						}
+					}
+				]
+			]
+		});
+		//监听行工具事件
+		table.on('tool(test)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'add') {
+				tool.side("/finance/income/add?id="+data.id);
+				return;
+			}
+			if (obj.event === 'view') {
+				tool.side("/finance/income/view?id="+data.id);
+				return;
+			}
+			if (obj.event === 'tovoid') {
+				layer.confirm('确定作废该无发票回款吗？', {
+					icon: 3,
+					title: '提示'
+				}, function(index) {
+					$.ajax({
+						url: "/finance/api/tovoid",
+						type:'post',
+						data: {
+							id: data.id
+						},
+						success: function(res) {
+							layer.msg(res.msg);
+							if (res.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+					})
+					layer.close(index);
+				});
+			}
+			if (obj.event === 'novoid') {
+				layer.confirm('确定反作废该无发票回款吗？', {
+					icon: 3,
+					title: '提示'
+				}, function(index) {
+					$.ajax({
+						url: "/finance/api/novoid",
+						type:'post',
+						data: {
+							id: data.id
+						},
+						success: function(res) {
+							layer.msg(res.msg);
+							if (res.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+					})
+					layer.close(index);
+				});
+			}
+			if (obj.event === 'view_a') {
+				tool.side("/finance/invoice/view_a?id="+data.id);
+				return;
+			}
+			if (obj.event === 'edit_a') {
+				tool.side("/finance/invoice/add_a?id="+data.id);
+				return;
+			}
+			if (obj.event === 'del_a') {
+				layer.confirm('确定要删除该内容吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/finance/invoice/del_a", { id: data.id }, callback);
+					layer.close(index);
+				});
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
diff --git a/app/finance/view/invoice/edit.html b/app/finance/view/invoice/edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..2803f3722a676ccb43b17c7019a610131279f83d
--- /dev/null
+++ b/app/finance/view/invoice/edit.html
@@ -0,0 +1,174 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">编辑开票申请</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">开票金额<font>*</font></td>
+			<td>
+				<input type="text" class="layui-input" name="amount" lay-verify="required|number" placeholder="请输入开票金额" lay-reqText="请输入开票金额" value="{$detail.amount}">	
+			</td>
+			<td class="layui-td-gray">开票类型<font>*</font></td>
+			<td>
+			<select name="invoice_type" lay-verify="required" lay-reqText="请选择开票类型">
+				<option value="">请选择开票类型</option>
+				<option value="1" {eq name="$detail.invoice_type" value="1"}selected{/eq}>增值税专用发票</option>
+				<option value="2" {eq name="$detail.invoice_type" value="2"}selected{/eq}>普通发票</option>
+				<option value="3" {eq name="$detail.invoice_type" value="3"}selected{/eq}>专业发票</option>
+			  </select>
+			</td>
+			<td class="layui-td-gray">开票主体<font>*</font></td>
+			<td>
+				<select name="invoice_subject" lay-verify="required" lay-reqText="请选择开票主体">
+					<option value="">请选择开票主体</option>
+					{volist name=":get_base_data('enterprise')" id="vo"}
+					<option value="{$vo.id}" {eq name="$vo.id" value="$detail.invoice_subject"}selected{/eq}>{$vo.title}</option>
+					{/volist}
+				</select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">抬头类型<font>*</font></td>
+			<td>
+				<input type="radio" name="types" lay-filter="type" value="1" title="企业" {eq name="$detail.types" value="1"}checked{/eq}>
+				<input type="radio" name="types" lay-filter="type" value="2" title="个人" {eq name="$detail.types" value="2"}checked{/eq}>
+			</td>
+			<td class="layui-td-gray-2">开票抬头<span class="layui-btn layui-btn-xs invoice-qiye customer-picker">选择</span></td>
+			<td><input type="text" name="invoice_title" class="layui-input" placeholder="请输入开票抬头" lay-verify="required"  lay-reqText="请输入开票抬头" value="{$detail.invoice_title}"></td>
+			<td class="layui-td-gray-2">纳税人识别号<font>*</font></td>
+			<td><input type="text" name="invoice_tax" class="layui-input" placeholder="请输入纳税人识别号，个人输入身份证号码"lay-verify="required"  lay-reqText="请输入纳税人识别号，个人输入身份证号码" value="{$detail.invoice_tax}"></td>
+		</tr>
+		<tr class="invoice-qiye">
+			<td class="layui-td-gray">开户行<font>*</font></td>
+			<td><input type="text" name="invoice_bank" class="layui-input" value="{$detail.invoice_bank}"></td>
+			<td class="layui-td-gray">银行账号<font>*</font></td>
+			<td><input type="text" name="invoice_account" class="layui-input" value="{$detail.invoice_account}"></td>
+			<td class="layui-td-gray-2">银行营业网点</td>
+			<td><input type="text" name="invoice_banking" class="layui-input" value="{$detail.invoice_banking}"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">电话号码</td>
+			<td><input type="text" name="invoice_phone" class="layui-input" value="{$detail.invoice_phone}"></td>
+			<td class="layui-td-gray">地址</td>
+			<td colspan="3"><input type="text" name="invoice_address" class="layui-input" value="{$detail.invoice_address}"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">关联合同</td>
+			<td colspan="5">
+				<input type="text" class="layui-input picker-oa" data-types="contract" name="contract_name" placeholder="请选择需要关联的合同" readonly value="{$detail.contract_name|default=''}">		
+				<input type="hidden" class="layui-input" name="contract_id" value="{$detail.contract_id}">		
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">关联项目</td>
+			<td colspan="5">
+				<input type="text" class="layui-input picker-oa" data-types="project" name="project_name" placeholder="请选择需要关联的项目" readonly value="{$detail.project_name|default=''}">		
+				<input type="hidden" class="layui-input" name="project_id" value="{$detail.project_id}">		
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">
+				<div class="layui-input-inline">附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids}">
+					{notempty name="$detail.file_ids"}
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">备注信息</td>
+			<td colspan="5"><textarea name="remark" placeholder="请输入备注信息" class="layui-textarea">{$detail.remark|default=''}</textarea></td>
+		</tr>
+	</table>	
+	<div id="checkBox" class="pt-3" data-status="{$detail.check_status}" data-id="{$detail.id}" data-checkflowid="{$detail.check_flow_id}"></div>
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$detail.id}"/>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool','oaPicker','oaCheck','uploadPlus'];
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool, oaPicker = layui.oaPicker,oaCheck = layui.oaCheck,uploadPlus = layui.uploadPlus;
+		//选择抬头类型
+		form.on('radio(type)', function (data) {
+			if(data.value==2){
+				$('.invoice-qiye').hide();
+			}
+			else{
+				$('.invoice-qiye').show();
+			}
+		});
+		
+		//相关附件上传
+		var attachment = new uploadPlus();
+		
+		//审批相关
+		oaCheck.init({
+			check_name:'invoice',
+			check_btn:0
+		});
+		
+		$('.customer-picker').on('click',function(){
+			let that = $(this),ids = [],titles=[];
+			let callback = function(data){
+				for ( var i = 0; i <data.length; i++){
+					ids.push(data[i].id);
+					titles.push(data[i].name);
+					tax_num.push(data[i].tax_num);
+					tax_bank.push(data[i].tax_bank);
+					tax_banksn.push(data[i].tax_banksn);
+					tax_mobile.push(data[i].tax_mobile);
+					tax_address.push(data[i].tax_address);
+				}
+				//that.val(titles.join(','));
+				//that.next().val(ids.join(','));
+				$('[name="invoice_title"]').val(titles.join(','));
+				$('[name="invoice_tax"]').val(tax_num.join(','));
+				$('[name="invoice_bank"]').val(tax_bank.join(','));
+				$('[name="invoice_account"]').val(tax_banksn.join(','));
+				$('[name="invoice_phone"]').val(tax_mobile.join(','));
+				$('[name="invoice_address"]').val(tax_address.join(','));
+			}
+			oaPicker.picker('customer',1,callback,{});
+		});
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					let checkCallback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							tool.sideClose(1000);				
+						}
+					}
+					data.field.check_name = 'invoice';
+					data.field.action_id = e.data.return_id;
+					oaCheck.submit(data.field,checkCallback);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/finance/invoice/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/finance/view/invoice/edit_a.html b/app/finance/view/invoice/edit_a.html
new file mode 100644
index 0000000000000000000000000000000000000000..cccb71de28cfec20b6730b154a7e2dbeda4a1592
--- /dev/null
+++ b/app/finance/view/invoice/edit_a.html
@@ -0,0 +1,165 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">编辑无发票回款申请</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray-3">预回款金额(元)<font>*</font></td>
+			<td>
+				<input type="text" class="layui-input" name="amount" lay-verify="required|number" placeholder="请输入预回款金额" lay-reqText="请输入预回款金额" value="{$detail.amount}">	
+			</td>
+			<td class="layui-td-gray">收款主体<font>*</font></td>
+			<td colspan="3">
+				<select name="invoice_subject" lay-verify="required" lay-reqText="请选择收款主体">
+					<option value="">请选择收款主体</option>
+					{volist name=":get_base_data('enterprise')" id="vo"}
+					<option value="{$vo.id}" {eq name="$vo.id" value="$detail.invoice_subject"}selected{/eq}>{$vo.title}</option>
+					{/volist}
+				</select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">付款主体<font>*</font></td>
+			<td>
+				<input type="radio" name="types" lay-filter="type" value="1" title="企业" {eq name="$detail.types" value="1"}checked{/eq}>
+				<input type="radio" name="types" lay-filter="type" value="2" title="个人" {eq name="$detail.types" value="2"}checked{/eq}>
+			</td>
+			<td class="layui-td-gray-2">付款方名称<span class="layui-btn layui-btn-xs invoice-qiye customer-picker">选择</span></td>
+			<td><input type="text" name="invoice_title" class="layui-input" placeholder="请输入付款方名称" lay-verify="required"  lay-reqText="请输入付款方名称" value="{$detail.invoice_title}"></td>
+			<td class="layui-td-gray-2">纳税人识别号<font>*</font></td>
+			<td><input type="text" name="invoice_tax" class="layui-input" placeholder="请输入纳税人识别号，个人输入身份证号码"lay-verify="required"  lay-reqText="请输入纳税人识别号，个人输入身份证号码" value="{$detail.invoice_tax}"></td>
+		</tr>
+		<tr class="invoice-qiye">
+			<td class="layui-td-gray">开户行<font>*</font></td>
+			<td><input type="text" name="invoice_bank" class="layui-input" value="{$detail.invoice_bank}"></td>
+			<td class="layui-td-gray">银行账号<font>*</font></td>
+			<td><input type="text" name="invoice_account" class="layui-input" value="{$detail.invoice_account}"></td>
+			<td class="layui-td-gray-2">银行营业网点</td>
+			<td><input type="text" name="invoice_banking" class="layui-input" value="{$detail.invoice_banking}"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">电话号码</td>
+			<td><input type="text" name="invoice_phone" class="layui-input" value="{$detail.invoice_phone}"></td>
+			<td class="layui-td-gray">地址</td>
+			<td colspan="3"><input type="text" name="invoice_address" class="layui-input" value="{$detail.invoice_address}"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">关联合同</td>
+			<td colspan="5">
+				<input type="text" class="layui-input picker-oa" data-types="contract" name="contract_name" placeholder="请选择需要关联的合同" readonly value="{$detail.contract_name|default=''}">		
+				<input type="hidden" class="layui-input" name="contract_id" value="{$detail.contract_id}">		
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">关联项目</td>
+			<td colspan="5">
+				<input type="text" class="layui-input picker-oa" data-types="project" name="project_name" placeholder="请选择需要关联的项目" readonly value="{$detail.project_name|default=''}">		
+				<input type="hidden" class="layui-input" name="project_id" value="{$detail.project_id}">		
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">
+				<div class="layui-input-inline">附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids}">
+					{notempty name="$detail.file_ids"}
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">备注信息</td>
+			<td colspan="5"><textarea name="remark" placeholder="请输入备注信息" class="layui-textarea">{$detail.remark|default=''}</textarea></td>
+		</tr>
+	</table>	
+	<div id="checkBox" class="pt-3" data-status="{$detail.check_status}" data-id="{$detail.id}" data-checkflowid="{$detail.check_flow_id}"></div>
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$detail.id}"/>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool','oaPicker','oaCheck','uploadPlus'];
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool, oaPicker = layui.oaPicker,oaCheck = layui.oaCheck,uploadPlus = layui.uploadPlus;
+		//选择抬头类型
+		form.on('radio(type)', function (data) {
+			if(data.value==2){
+				$('.invoice-qiye').hide();
+			}
+			else{
+				$('.invoice-qiye').show();
+			}
+		});
+		
+		//相关附件上传
+		var attachment = new uploadPlus();
+		
+		//审批相关
+		oaCheck.init({
+			check_name:'invoice',
+			check_btn:0
+		});
+		
+		$('.customer-picker').on('click',function(){
+			let that = $(this),ids = [],titles=[];
+			let callback = function(data){
+				for ( var i = 0; i <data.length; i++){
+					ids.push(data[i].id);
+					titles.push(data[i].name);
+					tax_num.push(data[i].tax_num);
+					tax_bank.push(data[i].tax_bank);
+					tax_banksn.push(data[i].tax_banksn);
+					tax_mobile.push(data[i].tax_mobile);
+					tax_address.push(data[i].tax_address);
+				}
+				//that.val(titles.join(','));
+				//that.next().val(ids.join(','));
+				$('[name="invoice_title"]').val(titles.join(','));
+				$('[name="invoice_tax"]').val(tax_num.join(','));
+				$('[name="invoice_bank"]').val(tax_bank.join(','));
+				$('[name="invoice_account"]').val(tax_banksn.join(','));
+				$('[name="invoice_phone"]').val(tax_mobile.join(','));
+				$('[name="invoice_address"]').val(tax_address.join(','));
+			}
+			oaPicker.picker('customer',1,callback,{});
+		});
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					let checkCallback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							tool.sideClose(1000);				
+						}
+					}
+					data.field.check_name = 'invoice';
+					data.field.action_id = e.data.return_id;
+					oaCheck.submit(data.field,checkCallback);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/finance/invoice/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/finance/view/invoice/record.html b/app/finance/view/invoice/record.html
new file mode 100644
index 0000000000000000000000000000000000000000..d5f21b47c6c49222e4fbabd41a9c841b44f2f164
--- /dev/null
+++ b/app/finance/view/invoice/record.html
@@ -0,0 +1,319 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+.tab-1 .search-item{display:none;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<div class="layui-card border-x border-t" style="margin-bottom:0; box-shadow:0 0 0 0 rgb(5 32 96 / 0%)">
+		<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
+			<ul class="layui-tab-title">
+				<li class="layui-this">正常</li>
+				<li>已作废</li>
+			</ul>
+		</div>
+	</div>
+	<form class="layui-form gg-form-bar border-x tab-0" id="barsearchform">
+		<div class="layui-input-inline" style="width:175px;">
+			<input type="text" class="layui-input" id="diff_time" placeholder="选择时间区间" readonly name="diff_time">
+		</div>
+		<div class="layui-input-inline search-item">
+			<select name="open_status">
+				<option value="">请选择状态</option>
+				<option value="0">待开具</option>
+				<option value="1">已开具</option>
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<input type="hidden" name="tab" value="0"/>
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+<div class="layui-btn-container">
+    <h3 class="h3-title" style="height:32px;">发票列表</h3>
+</div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const auth = {$authInvoice};
+	const moduleInit = ['tool','tablePlus','laydatePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool, laydatePlus = layui.laydatePlus, element = layui.element;
+		//tab切换
+		element.on('tab(tab)', function(data){
+			$('[name="tab"]').val(data.index);
+			$("#barsearchform")[0].reset();
+			$("#barsearchform").attr('class','layui-form gg-form-bar border-x tab-'+data.index);
+			layui.pageTable.reload({where:{tab:data.index},page:{curr:1}});
+			return false;
+		});
+		
+		//日期范围
+		var diff_time = new laydatePlus({'target':'diff_time'});
+
+		layui.pageTable = table.render({
+			elem: '#test',
+			title: '开票记录列表',
+			toolbar: '#toolbarDemo',
+			url: "/finance/invoice/record", //数据接口	
+			cellMinWidth: 80,			
+			page: true, //开启分页
+			limit: 20,
+			height: 'full-152',
+			totalRow: true,
+			cols: [[
+				{
+						field: 'id',
+						title: 'ID号',
+						align: 'center',
+						width: 80
+					},{
+						field: 'invoice_title',
+						title: '开票抬头',
+						minWidth: 240,	
+						templet:function(d){
+							var html='<span class="layui-badge layui-bg-blue">企业</span> '+d.invoice_title;
+							if(d.types==2){
+								html='<span class="layui-badge layui-bg-green">个人</span> '+d.invoice_title;
+							}
+							return html;
+						},
+						totalRowText: '<div style="text-align:right">合计</div>'
+					}, {
+						field: 'amount',
+						title: '发票金额(元)',
+						align: 'right',
+						width: 120,
+						totalRow: function (d) {return d.TOTAL_ROW.amount}
+					},{
+						field: 'invoice_type',
+						title: '开票类型',
+						align: 'center',
+						width: 120,
+						templet:function(d){
+							var html='-';
+							if(d.invoice_type==1){
+								html='<span class="green">增值税专用发票</span>';
+							}
+							else if(d.invoice_type==2){
+								html='<span class="blue">普通发票</span>';
+							}
+							else if(d.invoice_type==3){
+								html='<span class="red">专业发票</span>';
+							}
+							return html;
+						}
+					},{
+						field: 'open_status',
+						title: '开票状态',
+						align: 'center',
+						width: 90,
+						templet:function(d){
+							var html='<span class="red">『未开具』</span>';
+							if(d.open_status==1){
+								html='<span class="green">『已开具』</span>';
+							}
+							else if(d.open_status==2){
+								html='<span class="yellow">『已作废』</span>';
+							}
+							return html;
+						}
+					},{
+						field: 'admin_name',
+						title: '发票申请员工',
+						align: 'center',
+						width: 100
+					},{
+						field: 'department',
+						title: '发票申请部门',
+						align: 'center',
+						width: 120
+					},{
+						field: 'create_time',
+						title: '申请时间',
+						align: 'center',
+						width: 150
+					},{
+						field: 'check_user',
+						title: '当前审核人'
+					},{
+						field: 'open_name',
+						title: '开票人',
+						align: 'center',
+						width: 90
+					},{
+						field: 'open_time',
+						title: '开票日期',
+						align: 'center',
+						width: 100
+					},{
+						field: 'code',
+						title: '发票号码',
+						align: 'center',
+						width: 120
+					}, {
+						field: 'right',
+						fixed: 'right',
+						title: '操作',
+						width: 170,
+						align: 'center',
+						templet:function(d){
+							var html='<div class="layui-btn-group">';
+							var btn1='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</span>';
+							var btn2='<span class="layui-btn layui-btn-warm layui-btn-xs" lay-event="open">标记为开票</span>';
+							var btn3='<span class="layui-btn layui-btn-xs" lay-event="open">修改开票信息</span>';
+							var btn4='<span class="layui-btn layui-btn-danger layui-btn-xs" lay-event="tovoid">作废</span>';
+							var btn5='<span class="layui-btn layui-btn-danger layui-btn-xs" lay-event="novoid">反作废</span>';
+							html+=btn1;
+							if(auth==1){
+								if(d.open_status==0){
+									html+=btn2;
+								}
+								if(d.open_status==1){
+									html+=btn3+btn4;
+								}
+								if(d.open_status==2){
+									html+=btn5;
+								}
+							}
+							html+='</div>';
+							return html;
+						}
+					}
+				]
+			]
+		});
+
+		//监听行工具事件
+		table.on('tool(test)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/finance/invoice/view?id="+data.id);
+				return;
+			}
+			if(obj.event === 'open'){
+				layer.open({
+					type: 1
+					,title: '标记为已开票'
+					,area: '368px;'
+					,id: 'LAY_module' //设定一个id，防止重复弹出
+					,btn: ['确定', '取消']
+					,btnAlign: 'c'
+					,content: '<div style="padding-top:15px;">\
+								<div class="layui-form-item">\
+								  <label class="layui-form-label">发票号码</label>\
+								  <div class="layui-input-inline">\
+									<input type="text" name="code" autocomplete="off" value="'+data.code+'" placeholder="请输入发票号码" class="layui-input">\
+								  </div>\
+								</div>\
+								<div class="layui-form-item">\
+								  <label class="layui-form-label">开票日期</label>\
+								  <div class="layui-input-inline">\
+									<input type="text" id="open_time" name="open_time" autocomplete="off" value="'+data.open_time+'" placeholder="请选择实际开票日期" class="layui-input">\
+								  </div>\
+								</div>\
+								<div class="layui-form-item">\
+								  <label class="layui-form-label">物流单号</label>\
+								  <div class="layui-input-inline">\
+									<input type="text" name="delivery" autocomplete="off" value="'+data.delivery+'" placeholder="请输入物流快递单号" class="layui-input">\
+								  </div>\
+								</div>\
+							  </div>'
+					,success:function(){
+						layui.laydate.render({
+							elem: '#open_time',
+							showBottom:false
+						});
+					}
+					,yes: function(index){
+						let code = $('#LAY_module').find('[name="code"]').val();
+						let open_time = $('#LAY_module').find('[name="open_time"]').val();
+						let delivery = $('#LAY_module').find('[name="delivery"]').val();
+						if(code == ''){
+							layer.msg('请输入发票号码');
+							return false;
+						}
+						if(open_time == ''){
+							layer.msg('请选择开票时间');
+							return false;
+						}
+						$.ajax({
+							url: "/finance/api/open",
+							type: 'post',
+							data: {
+								id: data.id,
+								code: code,
+								open_time: open_time,
+								delivery: delivery
+							},
+							success: function(e) {
+								layer.msg(e.msg);
+								if (e.code == 0) {
+									layer.close(index);
+									layui.pageTable.reload();
+								}
+							}
+						})
+					}
+					,btn2: function(){
+						layer.closeAll();
+					}
+				});			
+			}
+			if (obj.event === 'tovoid') {
+				layer.confirm('确定作废该发票吗？', {
+					icon: 3,
+					title: '提示'
+				}, function(index) {
+					$.ajax({
+						url: "/finance/api/tovoid",
+						type:'post',
+						data: {
+							id: data.id
+						},
+						success: function(res) {
+							layer.msg(res.msg);
+							if (res.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+					})
+					layer.close(index);
+				});
+			}
+			if (obj.event === 'novoid') {
+				layer.confirm('确定反作废该发票吗？', {
+					icon: 3,
+					title: '提示'
+				}, function(index) {
+					$.ajax({
+						url: "/finance/api/novoid",
+						type:'post',
+						data: {
+							id: data.id
+						},
+						success: function(res) {
+							layer.msg(res.msg);
+							if (res.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+					})
+					layer.close(index);
+				});
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
diff --git a/app/finance/view/invoice/view.html b/app/finance/view/invoice/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..85ec27f52e4fa73c56d6498b867e1d3ec68ae20a
--- /dev/null
+++ b/app/finance/view/invoice/view.html
@@ -0,0 +1,157 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="layui-form p-page">
+	<h3 class="pb-3">发票详情</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">开票金额(元)</td>
+			<td class="blue">{$detail.amount}</td>
+			<td class="layui-td-gray">开票类型</td>
+			<td>
+				{eq name="$detail.invoice_type" value="1"}增值税专用发票{/eq}
+				{eq name="$detail.invoice_type" value="2"}普通发票{/eq}
+				{eq name="$detail.invoice_type" value="3"}专业发票{/eq}
+			</td>
+			<td class="layui-td-gray">开票主体</td>
+			<td>{$detail.subject}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">抬头类型</td>
+			<td>
+				{eq name="$detail.types" value="1"}企业{/eq}
+				{eq name="$detail.types" value="2"}个人{/eq}
+			</td>
+			<td class="layui-td-gray">开票抬头</td>
+			<td>{$detail.invoice_title}</td>
+			<td class="layui-td-gray">电话号码</td>
+			<td>{$detail.invoice_phone}</td>
+		</tr>
+		<tr class="invoice-type" {eq name="$detail.types" value="2"}style="display:none"{/eq}>
+			<td class="layui-td-gray-2">纳税人识别号</td>
+			<td>{$detail.invoice_tax}</td>
+			<td class="layui-td-gray">开户行</td>
+			<td>{$detail.invoice_bank}</td>
+			<td class="layui-td-gray">银行账号</td>
+			<td>{$detail.invoice_account}</td>
+		</tr>
+		<tr class="invoice-type" {eq name="$detail.types" value="2"}style="display:none"{/eq}>
+			<td class="layui-td-gray-2">银行营业网点</td>
+			<td>{$detail.invoice_banking}</td>
+			<td class="layui-td-gray">地址</td>
+			<td colspan="3">{$detail.invoice_address}</td>
+		</tr>
+		{if condition="$detail.contract_id > 0"}
+		<tr>
+		<td class="layui-td-gray">关联的合同</td>
+			<td colspan="5">{$detail.contract_name|default=''}</td>
+		</tr>
+		{/if}
+		{if condition="$detail.project_id > 0"}
+		<tr>
+		<td class="layui-td-gray">关联的项目</td>
+			<td colspan="5">{$detail.project_name|default=''}</td>
+		</tr>
+		{/if}
+		{notempty name="$detail.remark"}
+		<tr>
+			<td class="layui-td-gray">备注信息</td>
+			<td colspan="5">{$detail.remark}</td>
+		</tr>
+		{/notempty}
+		{notempty name="$detail.file_ids"}
+		<tr>
+			<td class="layui-td-gray">关联附件</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row">
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+		{if ( $detail.open_status gt 0)}
+		<tr>
+			<td class="layui-td-gray">发票号码</td>
+			<td>{$detail.code}{eq name="$detail.open_status" value="2"}<span class="yellow">『已作废』</span>{/eq}</td>
+			<td class="layui-td-gray">开票人</td>
+			<td>{$detail.open_admin_name}</td>
+			<td class="layui-td-gray">开票日期</td>
+			<td colspan="3">{$detail.open_time|date='Y-m-d'}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">物流单号</td>
+			<td colspan="5">{$detail.delivery}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">			
+				<div class="layui-input-inline">发票附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="other_file_ids" value="{$detail.other_file_ids}">
+					{notempty name="$detail.other_file_ids"}
+					{volist name="$detail.other_file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr>
+		{/if}
+	</table>
+	<div id="checkBox" class="pt-3" data-status="{$detail.check_status}" data-id="{$detail.id}" data-checkflowid="{$detail.check_flow_id}"></div>
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const invoice_id = {$detail.id};
+const moduleInit = ['tool','oaCheck','uploadPlus'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool, oaCheck=layui.oaCheck,uploadPlus = layui.uploadPlus;	
+	oaCheck.init({
+		check_name:'invoice'
+	});
+	//相关附件上传
+	var attachment = new uploadPlus({
+		"attachment":{
+			uidDelete:true,
+			ajaxSave:function(val){
+				$.ajax({
+					url: "/finance/api/upload_invoice",
+					type:'post',
+					data:{
+						id:invoice_id,
+						other_file_ids:val
+					},
+					success: function (e) {
+						location.reload();
+					}
+				})
+			},
+			ajaxDelete:function(val){
+				$.ajax({
+					url: "/finance/api/upload_invoice",
+					type:'post',
+					data:{
+						id:invoice_id,
+						other_file_ids:val
+					},
+					success: function (e) {
+						location.reload();
+					}
+				})
+			}
+		}
+	})
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/finance/view/invoice/view_a.html b/app/finance/view/invoice/view_a.html
new file mode 100644
index 0000000000000000000000000000000000000000..20890f73a1ec1b1ec7226c6a32a3adcebbcf63f1
--- /dev/null
+++ b/app/finance/view/invoice/view_a.html
@@ -0,0 +1,151 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="layui-form p-page">
+	<h3 class="pb-3">无发票回款详情</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">预回款金额(元)</td>
+			<td class="blue">{$detail.amount}</td>
+			<td class="layui-td-gray">收款主体</td>
+			<td colspan="3">{$detail.subject}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">付款主体</td>
+			<td>
+				{eq name="$detail.types" value="1"}企业{/eq}
+				{eq name="$detail.types" value="2"}个人{/eq}
+			</td>
+			<td class="layui-td-gray-2">付款方名称</td>
+			<td>{$detail.invoice_title}</td>
+			<td class="layui-td-gray">电话号码</td>
+			<td>{$detail.invoice_phone}</td>
+		</tr>
+		<tr class="invoice-type" {eq name="$detail.types" value="1"}style="display:none"{/eq}>
+			<td class="layui-td-gray-2">纳税人识别号</td>
+			<td>{$detail.invoice_tax}</td>
+			<td class="layui-td-gray">开户行</td>
+			<td>{$detail.invoice_bank}</td>
+			<td class="layui-td-gray">银行账号</td>
+			<td>{$detail.invoice_account}</td>
+		</tr>
+		<tr class="invoice-type" {eq name="$detail.types" value="1"}style="display:none"{/eq}>
+			<td class="layui-td-gray-2">银行营业网点</td>
+			<td>{$detail.invoice_banking}</td>
+			<td class="layui-td-gray">地址</td>
+			<td colspan="3">{$detail.invoice_address}</td>
+		</tr>
+		{if condition="$detail.contract_id > 0"}
+		<tr>
+		<td class="layui-td-gray">关联的合同</td>
+			<td colspan="5">{$detail.contract_name|default=''}</td>
+		</tr>
+		{/if}
+		{if condition="$detail.project_id > 0"}
+		<tr>
+		<td class="layui-td-gray">关联的项目</td>
+			<td colspan="5">{$detail.project_name|default=''}</td>
+		</tr>
+		{/if}
+		{notempty name="$detail.remark"}
+		<tr>
+			<td class="layui-td-gray">备注信息</td>
+			<td colspan="5">{$detail.remark}</td>
+		</tr>
+		{/notempty}
+		{notempty name="$detail.file_ids"}
+		<tr>
+			<td class="layui-td-gray">关联附件</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row">
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+		{if ( $detail.open_status gt 0)}
+		<tr>
+			<td class="layui-td-gray">发票号码</td>
+			<td>{$detail.code}{eq name="$detail.open_status" value="2"}<span class="yellow">『已作废』</span>{/eq}</td>
+			<td class="layui-td-gray">开票人</td>
+			<td>{$detail.open_admin_name}</td>
+			<td class="layui-td-gray">开票日期</td>
+			<td colspan="3">{$detail.open_time|date='Y-m-d'}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">物流单号</td>
+			<td colspan="5">{$detail.delivery}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">			
+				<div class="layui-input-inline">发票附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="other_file_ids" value="{$detail.other_file_ids}">
+					{notempty name="$detail.other_file_ids"}
+					{volist name="$detail.other_file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr>
+		{/if}
+	</table>
+	<div id="checkBox" class="pt-3" data-status="{$detail.check_status}" data-id="{$detail.id}" data-checkflowid="{$detail.check_flow_id}"></div>
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const invoice_id = {$detail.id};
+const moduleInit = ['tool','oaCheck','uploadPlus'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool, oaCheck=layui.oaCheck,uploadPlus = layui.uploadPlus;	
+	oaCheck.init({
+		check_name:'invoicea'
+	});
+	//相关附件上传
+	var attachment = new uploadPlus({
+		"attachment":{
+			uidDelete:true,
+			ajaxSave:function(val){
+				$.ajax({
+					url: "/finance/api/upload_invoice",
+					type:'post',
+					data:{
+						id:invoice_id,
+						other_file_ids:val
+					},
+					success: function (e) {
+						location.reload();
+					}
+				})
+			},
+			ajaxDelete:function(val){
+				$.ajax({
+					url: "/finance/api/upload_invoice",
+					type:'post',
+					data:{
+						id:invoice_id,
+						other_file_ids:val
+					},
+					success: function (e) {
+						location.reload();
+					}
+				})
+			}
+		}
+	})
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/finance/view/payment/add.html b/app/finance/view/payment/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..d948b201e04c35e5cafcdd47cb606121a22db6e7
--- /dev/null
+++ b/app/finance/view/payment/add.html
@@ -0,0 +1,276 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+.layui-table-min th{font-size:13px; text-align:center; background-color:#f8f8f8;}
+.layui-table-min td{font-size:13px; padding:6px;text-align:center;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<div class="layui-form p-page">
+	<h3 class="pb-3">发票信息</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray-2">发票金额(元)</td>
+			<td class="blue">{$detail.amount}</td>
+			<td class="layui-td-gray">发票类型</td>
+			<td>
+			{eq name="$detail.invoice_type" value="1"}增值税专用发票{/eq}
+			{eq name="$detail.invoice_type" value="2"}普通发票{/eq}
+			{eq name="$detail.invoice_type" value="3"}专业发票{/eq}
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">发票抬头</td>
+			<td>{$detail.subject}</td>
+			<td class="layui-td-gray-3">开票主体(供应商)</td>
+			<td>{$detail.supplier_name}</td>
+		</tr>
+		{notempty name="$detail.remark"}
+		<tr>
+			<td class="layui-td-gray">备注信息</td>
+			<td colspan="5">{$detail.remark}</td>
+		</tr>
+		{/notempty}
+		{notempty name="$detail.file_ids"}
+		<tr>
+			<td class="layui-td-gray">关联附件</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row">
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+		{if condition="$detail.open_admin_id > 0"}
+		<tr>
+			<td class="layui-td-gray">发票号码</td>
+			<td>{$detail.code}</td>
+			<td class="layui-td-gray">开票时间</td>
+			<td>{$detail.open_time}</td>
+		</tr>
+		{/if}
+		{notempty name="$detail.other_file_ids"}
+		<tr>
+			<td class="layui-td-gray">发票附件</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row">
+					{volist name="$detail.other_file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+	</table>
+	
+	<h3 class="py-3">付款信息</h3>
+	<form class="layui-form">
+		<table class="layui-table layui-table-form">
+			<tr>
+				<td class="layui-td-gray">付款状态</td>
+				<td>
+					{if condition="($detail.pay_status == 0)"}
+						<span class="red">未付款</span>
+					{elseif condition="($detail.pay_status == 1)"}
+						<span class="blue">部分付款</span>
+					{elseif condition="($detail.pay_status == 2)"}
+						<span  class="green">全部付款</span>
+					{/if}
+				</td>
+				<td class="layui-td-gray-2">未付款金额(元)</td>
+				<td style="color:#FF5722">{$detail.not_pay}</td>
+				<td class="layui-td-gray-2">已付款金额(元)</td>
+				<td style="color:#1E9FFF">{$detail.pay_amount}</td>
+			</tr>
+			<tr>
+				<td class="layui-td-gray">付款记录</td>
+				<td colspan="5">
+					<table id="interfix" class="layui-table layui-table-min" style="margin:0">
+						<tr>
+							<th style="width:200px;">付款日期</th>
+							<th style="width:200px;">付款金额(元)</th>
+							<th>备注</th>
+							<th style="width:100px;">操作</th>
+						</tr>
+						{empty name="$detail.payment"}
+						<tr class="none_interfix">
+							<td colspan="4" style="text-align: center;">暂无付款记录</td>
+						</tr>
+						{else/}
+						{volist name="$detail.payment" id="vo"}
+						<tr class="more_interfix">
+							<td>{$vo.pay_time | date='Y-m-d'}</td>
+							<td>{$vo.amount}</td>
+							<td style="text-align:left;">{$vo.remarks}</td>
+							<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="remove" data-id="{$vo.id}" data-tiid="{$id}">删除</a></td>
+						</tr>
+						{/volist}
+						{/empty}
+					</table>
+					{if condition="($detail.pay_status lt 2)"}
+					<div class="pt-3"><button class="layui-btn layui-btn-sm" type="button" id="addInterfix">+ 添加付款记录</button></div>
+					{/if}
+				</td>
+			</tr>
+		</table>
+		<div class="pt-3">
+			<input name="ticket_id" id="ticket_id" type="hidden" value="{$id}">
+			<input name="pay_type" id="pay_type" type="hidden" value="1">
+			{if condition="($detail.pay_status lt 2)"}
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">保存付款记录</button>
+			<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+			{/if}
+			{if condition="($detail.pay_status eq 0)"}
+			<span class="layui-btn layui-btn-danger" lay-event="all">全部付款</span>
+			{/if}
+			{if condition="($detail.pay_status eq 1)"}
+			<span class="layui-btn layui-btn-danger" lay-event="all">剩余部分全部付款</span>
+			{/if}
+			{if condition="($detail.pay_status gt 0)"}
+			<span class="layui-btn layui-btn-warm" lay-event="refue">全部反付款</span>
+			{/if}
+		</div>
+	</form>
+	<input type="hidden" name="id" value="{$detail.id}">
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool,laydate = layui.laydate;
+	//添加表格行
+	$('#addInterfix').on('click',function(){
+		var html = '';
+		html += '<tr class="more_interfix">';
+		html += '<td><input type="text" class="layui-input tool-time" name="pay_time[]" readonly lay-verify="required" lay-reqText="请选择付款日期">';
+		html += '<td><input type="text" class="layui-input" name="amount[]" lay-verify="required|number" lay-reqText="请输入付款金额,数字"></td>';
+		html += '<td><input type="text" class="layui-input" name="remarks[]"></td>';
+		html += '<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>';
+		html += '</tr>';
+		$("#interfix").find('.none_interfix').remove();
+		$("#interfix").append(html);
+		form.render();
+	});
+	//删除表格
+	$('#interfix').on('click', '[lay-event="del"]', function() {
+		$(this).parents(".more_interfix").remove();
+		if($("#interfix").find('.more_interfix').length<1){
+			$("#interfix").append('<tr class="none_interfix"><td colspan="4" style="text-align: center;">暂无付款记录</td></tr>');				
+		}
+	});
+
+	//删除付款记录
+	$('#interfix').on('click', '[lay-event="remove"]', function() {
+		var that=$(this);
+		var id=that.data('id');
+		var ticket_id=that.data('tiid');
+		layer.confirm('确定要删除该付款记录?', {icon: 3, title:'提示'}, function(index){
+			$.ajax({
+				url: "/finance/payment/del",
+				type:'post',
+				data:{id:id,ticket_id:ticket_id},
+				success:function(res){
+					layer.msg(res.msg);
+					if(res.code==0){
+						parent.layui.pageTable.reload();
+						window.setTimeout(function(){
+							location.reload();
+						},1200)	
+					}
+				}
+			})
+		})
+	});
+
+	//监听提交
+	form.on('submit(webform)', function(data){
+		console.log(data.field);
+		if($("#interfix").find('.tool-time').length<1){
+			layer.msg('请添加付款记录');
+			return false;
+		}
+		$.ajax({
+			url: "/finance/payment/add",
+			type:'post',
+			data:data.field,
+			success:function(res){
+				layer.msg(res.msg);
+				if(res.code==0){
+					parent.layui.pageTable.reload();
+					window.setTimeout(function(){
+						location.reload();
+					},1200)	
+				}
+			}
+		})
+		return false;
+	});
+	
+	$('.layui-form').on('click', '[lay-event="refue"]', function () {
+		var ticket_id=$('#ticket_id').val();
+		layer.confirm('确定要全部反付款?', {icon: 3, title:'提示'}, function(index){
+			$.ajax({
+				url: "/finance/payment/add",
+				type:'post',
+				data:{ticket_id:ticket_id,pay_type:3},
+				success:function(res){
+					layer.msg(res.msg);
+					if(res.code==0){
+						parent.layui.pageTable.reload();
+						window.setTimeout(function(){
+							location.reload();
+						},1200)	
+					}
+				}
+			})
+		})
+		return false;
+	})
+	$('.layui-form').on('click', '[lay-event="all"]', function () {
+		var ticket_id=$('#ticket_id').val();
+		layer.confirm('确定已经全部付款?', {icon: 3, title:'提示'}, function(idx){
+			layer.prompt({title: '选择付款日期', formType: 3,value :'',success: function(layero, index){
+				$('.layui-layer-input').attr('readonly',true);
+				lay('.layui-layer-input').each(function () {
+					laydate.render({
+						elem: this,
+						trigger: 'click',
+						showBottom:false
+					});
+				});
+				layer.close(idx);
+			}
+		}, function(pay_time, index){
+				if(pay_time ==''){
+					layer.msg('选择付款日期');
+					return false;
+				}
+				$.ajax({
+					url: "/finance/payment/add",
+					type:'post',
+					data:{ticket_id:ticket_id,pay_type:2,pay_time:pay_time},
+					success:function(res){
+						layer.msg(res.msg);
+						if(res.code==0){
+							parent.layui.pageTable.reload();
+							window.setTimeout(function(){
+								location.reload();
+							},1200)	
+						}
+					}
+				})
+			})
+		})
+		return false;
+	})
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/finance/view/payment/add_a.html b/app/finance/view/payment/add_a.html
new file mode 100644
index 0000000000000000000000000000000000000000..2db81237ac4be021a796bcd15e411d4f433988d8
--- /dev/null
+++ b/app/finance/view/payment/add_a.html
@@ -0,0 +1,250 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+.layui-table-min th{font-size:13px; text-align:center; background-color:#f8f8f8;}
+.layui-table-min td{font-size:13px; padding:6px;text-align:center;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<div class="layui-form p-page">
+	<h3 class="pb-3">无发票付款详情</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray-2">预付款金额(元)</td>
+			<td class="blue">{$detail.amount}</td>
+			<td class="layui-td-gray">付款方</td>
+			<td>{$detail.subject}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-3">收款方(供应商)</td>
+			<td colspan="3">{$detail.supplier_name}</td>
+		</tr>
+		{notempty name="$detail.remark"}
+		<tr>
+			<td class="layui-td-gray">备注信息</td>
+			<td colspan="5">{$detail.remark}</td>
+		</tr>
+		{/notempty}
+		{notempty name="$detail.file_ids"}
+		<tr>
+			<td class="layui-td-gray">关联附件</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row">
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+	</table>
+	
+	<h3 class="py-3">付款信息</h3>
+	<form class="layui-form">
+		<table class="layui-table layui-table-form">
+			<tr>
+				<td class="layui-td-gray">付款状态</td>
+				<td>
+					{if condition="($detail.pay_status == 0)"}
+						<span class="red">未付款</span>
+					{elseif condition="($detail.pay_status == 1)"}
+						<span class="blue">部分付款</span>
+					{elseif condition="($detail.pay_status == 2)"}
+						<span  class="green">全部付款</span>
+					{/if}
+				</td>
+				<td class="layui-td-gray-2">未付款金额(元)</td>
+				<td style="color:#FF5722">{$detail.not_pay}</td>
+				<td class="layui-td-gray-2">已付款金额(元)</td>
+				<td style="color:#1E9FFF">{$detail.pay_amount}</td>
+			</tr>
+			<tr>
+				<td class="layui-td-gray">付款记录</td>
+				<td colspan="5">
+					<table id="interfix" class="layui-table layui-table-min" style="margin:0">
+						<tr>
+							<th style="width:200px;">付款日期</th>
+							<th style="width:200px;">付款金额(元)</th>
+							<th>备注</th>
+							<th style="width:100px;">操作</th>
+						</tr>
+						{empty name="$detail.payment"}
+						<tr class="none_interfix">
+							<td colspan="4" style="text-align: center;">暂无付款记录</td>
+						</tr>
+						{else/}
+						{volist name="$detail.payment" id="vo"}
+						<tr class="more_interfix">
+							<td>{$vo.pay_time | date='Y-m-d'}</td>
+							<td>{$vo.amount}</td>
+							<td style="text-align:left;">{$vo.remarks}</td>
+							<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="remove" data-id="{$vo.id}" data-tiid="{$id}">删除</a></td>
+						</tr>
+						{/volist}
+						{/empty}
+					</table>
+					{if condition="($detail.pay_status lt 2)"}
+					<div class="pt-3"><button class="layui-btn layui-btn-sm" type="button" id="addInterfix">+ 添加付款记录</button></div>
+					{/if}
+				</td>
+			</tr>
+		</table>
+		<div class="pt-3">
+			<input name="ticket_id" id="ticket_id" type="hidden" value="{$id}">
+			<input name="pay_type" id="pay_type" type="hidden" value="1">
+			{if condition="($detail.pay_status lt 2)"}
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">保存付款记录</button>
+			<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+			{/if}
+			{if condition="($detail.pay_status eq 0)"}
+			<span class="layui-btn layui-btn-danger" lay-event="all">全部付款</span>
+			{/if}
+			{if condition="($detail.pay_status eq 1)"}
+			<span class="layui-btn layui-btn-danger" lay-event="all">剩余部分全部付款</span>
+			{/if}
+			{if condition="($detail.pay_status gt 0)"}
+			<span class="layui-btn layui-btn-warm" lay-event="refue">全部反付款</span>
+			{/if}
+		</div>
+	</form>
+	<input type="hidden" name="id" value="{$detail.id}">
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool,laydate = layui.laydate;
+	//添加表格行
+	$('#addInterfix').on('click',function(){
+		var html = '';
+		html += '<tr class="more_interfix">';
+		html += '<td><input type="text" class="layui-input tool-time" name="pay_time[]" readonly lay-verify="required" lay-reqText="请选择付款日期">';
+		html += '<td><input type="text" class="layui-input" name="amount[]" lay-verify="required|number" lay-reqText="请输入付款金额,数字"></td>';
+		html += '<td><input type="text" class="layui-input" name="remarks[]"></td>';
+		html += '<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>';
+		html += '</tr>';
+		$("#interfix").find('.none_interfix').remove();
+		$("#interfix").append(html);
+		form.render();
+	});
+	//删除表格
+	$('#interfix').on('click', '[lay-event="del"]', function() {
+		$(this).parents(".more_interfix").remove();
+		if($("#interfix").find('.more_interfix').length<1){
+			$("#interfix").append('<tr class="none_interfix"><td colspan="4" style="text-align: center;">暂无付款记录</td></tr>');				
+		}
+	});
+
+	//删除付款记录
+	$('#interfix').on('click', '[lay-event="remove"]', function() {
+		var that=$(this);
+		var id=that.data('id');
+		var ticket_id=that.data('tiid');
+		layer.confirm('确定要删除该付款记录?', {icon: 3, title:'提示'}, function(index){
+			$.ajax({
+				url: "/finance/payment/del",
+				type:'post',
+				data:{id:id,ticket_id:ticket_id},
+				success:function(res){
+					layer.msg(res.msg);
+					if(res.code==0){
+						parent.layui.pageTable.reload();
+						window.setTimeout(function(){
+							location.reload();
+						},1200)	
+					}
+				}
+			})
+		})
+	});
+
+	//监听提交
+	form.on('submit(webform)', function(data){
+		console.log(data.field);
+		if($("#interfix").find('.tool-time').length<1){
+			layer.msg('请添加付款记录');
+			return false;
+		}
+		$.ajax({
+			url: "/finance/payment/add",
+			type:'post',
+			data:data.field,
+			success:function(res){
+				layer.msg(res.msg);
+				if(res.code==0){
+					parent.layui.pageTable.reload();
+					window.setTimeout(function(){
+						location.reload();
+					},1200)	
+				}
+			}
+		})
+		return false;
+	});
+	
+	$('.layui-form').on('click', '[lay-event="refue"]', function () {
+		var ticket_id=$('#ticket_id').val();
+		layer.confirm('确定要全部反付款?', {icon: 3, title:'提示'}, function(index){
+			$.ajax({
+				url: "/finance/payment/add",
+				type:'post',
+				data:{ticket_id:ticket_id,pay_type:3},
+				success:function(res){
+					layer.msg(res.msg);
+					if(res.code==0){
+						parent.layui.pageTable.reload();
+						window.setTimeout(function(){
+							location.reload();
+						},1200)	
+					}
+				}
+			})
+		})
+		return false;
+	})
+	$('.layui-form').on('click', '[lay-event="all"]', function () {
+		var ticket_id=$('#ticket_id').val();
+		layer.confirm('确定已经全部付款?', {icon: 3, title:'提示'}, function(idx){
+			layer.prompt({title: '选择付款日期', formType: 3,value :'',success: function(layero, index){
+				$('.layui-layer-input').attr('readonly',true);
+				lay('.layui-layer-input').each(function () {
+					laydate.render({
+						elem: this,
+						trigger: 'click',
+						showBottom:false
+					});
+				});
+				layer.close(idx);
+			}
+		}, function(pay_time, index){
+				if(pay_time ==''){
+					layer.msg('选择付款日期');
+					return false;
+				}
+				$.ajax({
+					url: "/finance/payment/add",
+					type:'post',
+					data:{ticket_id:ticket_id,pay_type:2,pay_time:pay_time},
+					success:function(res){
+						layer.msg(res.msg);
+						if(res.code==0){
+							parent.layui.pageTable.reload();
+							window.setTimeout(function(){
+								location.reload();
+							},1200)	
+						}
+					}
+				})
+			})
+		})
+		return false;
+	})
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/finance/view/payment/datalist.html b/app/finance/view/payment/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..af1d287fe6054b39810698c3846f0dc586d0d131
--- /dev/null
+++ b/app/finance/view/payment/datalist.html
@@ -0,0 +1,192 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<div class="layui-card border-x border-t" style="margin-bottom:0; box-shadow:0 0 0 0 rgb(5 32 96 / 0%)">
+		<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
+			<ul class="layui-tab-title">
+				<li class="layui-this"><a href="/finance/payment/datalist">有发票付款</a></li>
+				<li><a href="/finance/ticket/datalist_a">无发票付款</a></li>
+			</ul>
+		</div>
+	</div>
+	<form class="layui-form gg-form-bar border-x" id="barsearchform">
+		<div class="layui-input-inline" style="width:175px;">
+			<input type="text" class="layui-input" id="diff_time" placeholder="选择付款时间区间" readonly name="diff_time">
+		</div>
+		<div class="layui-input-inline" style="width:120px;">
+			<select name="pay_status">
+				<option value="">请选择状态</option>
+				<option value="0">未付款</option>
+				<option value="1">部分付款</option>
+				<option value="2">全部付款</option>
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<input type="hidden" name="tab" value="0"/>
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+<div class="layui-btn-container">
+    <h3 class="h3-title" style="height:32px;">有发票付款</h3>
+</div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const auth = "{$auth}";
+	const moduleInit = ['tool','tablePlus','laydatePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool, laydatePlus = layui.laydatePlus, element = layui.element;
+		//tab切换
+		element.on('tab(tab)', function(data){
+			$('[name="tab"]').val(data.index);
+			$("#barsearchform")[0].reset();
+			layui.pageTable.reload({where:{tab:data.index},page:{curr:1}});
+			return false;
+		});
+		
+		//日期范围
+		var diff_time = new laydatePlus({'target':'diff_time'});
+		layui.pageTable = table.render({
+			elem: "#test"
+			,toolbar: "#toolbarDemo"
+			,url: "/finance/payment/datalist"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 80
+			,height: 'full-152'
+			,cellMinWidth: 80		
+			,page: true //开启分页
+			,limit: 20
+			,cols: [
+				[
+					{
+						field: 'id',
+						title: 'ID号',
+						align: 'center',
+						width: 80
+					},{
+						field: 'pay_status',
+						title: '付款状态',
+						align: 'center',
+						width: 100,
+						templet:function(d){
+							var html='<span class="red">『未付款』</span>';
+							if(d.pay_status==1){
+								html='<span class="blue">『部分付款』</span>';
+							}
+							else if(d.pay_status==2){
+								html='<span class="green">『全部付款』</span>';
+							}
+							return html;
+						}
+					},{
+						field: 'pay_amount',
+						title: '付款金额(元)',
+						align: 'right',
+						width: 100,
+					},{
+						field: 'pay_time',
+						title: '最新付款时间',
+						align: 'center',
+						width: 136
+					},{
+						field: 'supplier_name',
+						title: '供应商[发票主体]',
+						minWidth: 240
+					},{
+						field: 'amount',
+						title: '发票金额(元)',
+						align: 'right',
+						width: 100,
+					},{
+						field: 'invoice_type',
+						title: '开票类型',
+						align: 'center',
+						width: 120,
+						templet:function(d){
+							var html='-';
+							if(d.invoice_type==1){
+								html='<span style="color:#1E9FFF">增值税专用发票</span>';
+							}
+							else if(d.invoice_type==2){
+								html='<span style="color:#5FB878">普通发票</span>';
+							}
+							else if(d.invoice_type==3){
+								html='<span style="color:#FFB800">专用发票</span>';
+							}
+							else{
+								html='<span style="color:#666666">无需开票</span>';
+							}
+							return html;
+						}
+					},{
+						field: 'admin_name',
+						title: '收票人',
+						align: 'center',
+						width: 90
+					},{
+						field: 'department',
+						title: '所属部门',
+						align: 'center',
+						width: 120
+					},{
+						field: 'create_time',
+						title: '创建时间',
+						align: 'center',
+						width: 150
+					},{
+						field: 'code',
+						title: '发票号码',
+						align: 'center',
+						width: 150
+					},{
+						field: 'open_time',
+						title: '发票日期',
+						align: 'center',
+						width: 90
+					}, {
+						field: 'right',
+						fixed: 'right',
+						title: '操作',
+						width: 136,
+						align: 'center',
+						templet:function(d){
+							var html='<div class="layui-btn-group">';
+							var btn1='<span class="layui-btn layui-btn-xs" lay-event="add">付款管理</span>';
+							var btn2='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">付款详情</span>';
+							if(auth == 1){
+								return html+btn1+btn2+'</div>';
+							}
+							else{
+								return html+btn2+'</div>';
+							}
+						}
+					}
+				]
+			]
+		});
+		//监听行工具事件
+		table.on('tool(test)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'add') {
+				tool.side("/finance/payment/add?id="+data.id);
+				return;
+			}
+			if (obj.event === 'view') {
+				tool.side("/finance/payment/view?id="+data.id);
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
diff --git a/app/finance/view/payment/record.html b/app/finance/view/payment/record.html
new file mode 100644
index 0000000000000000000000000000000000000000..b061a6ceb47a7eeb38986a58973b6960a3f296b3
--- /dev/null
+++ b/app/finance/view/payment/record.html
@@ -0,0 +1,117 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-x border-t" id="barsearchform">
+		<div class="layui-input-inline" style="width:175px;">
+			<input type="text" class="layui-input" id="diff_time" placeholder="选择付款时间区间" readonly name="diff_time">
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<input type="hidden" name="tab" value="0"/>
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+<div class="layui-btn-container">
+    <h3 class="h3-title" style="height:32px;">付款列表</h3>
+</div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus','laydatePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool, laydatePlus = layui.laydatePlus, element = layui.element;
+		//tab切换
+		element.on('tab(tab)', function(data){
+			$('[name="tab"]').val(data.index);
+			$("#barsearchform")[0].reset();
+			layui.pageTable.reload({where:{tab:data.index},page:{curr:1}});
+			return false;
+		});
+		
+		//日期范围
+		var diff_time = new laydatePlus({'target':'diff_time'});
+		layui.pageTable = table.render({
+			elem: "#test"
+			,toolbar: "#toolbarDemo"
+			,url: "/finance/payment/record"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 80
+			,height: 'full-112'
+			,cellMinWidth: 80		
+			,page: true //开启分页
+			,limit: 20
+			,totalRow: true
+			,cols: [
+				[
+					{
+						field: 'id',
+						title: 'ID号',
+						align: 'center',
+						width: 80,
+						totalRowText: '<div style="text-align:right">合计</div>'
+					},{
+						field: 'amount',
+						title: '付款金额(元)',
+						style: 'color:#16b777',
+						align: 'right',
+						width: 120,
+						totalRow: function (d) {return d.TOTAL_ROW.amount}
+					},{
+						field: 'pay_time',
+						title: '付款时间',
+						align: 'center',
+						width: 110
+					},{
+						field: 'remarks',
+						title: '付款备注'
+					},{
+						field: 'admin_name',
+						title: '登记人',
+						align: 'center',
+						width: 90
+					},{
+						field: 'create_time',
+						title: '登记时间',
+						align: 'center',
+						width: 150
+					},{
+						field: 'code',
+						title: '关联发票号',
+						align: 'center',
+						width: 150
+					},{
+						field: 'right',
+						fixed: 'right',
+						title: '操作',
+						width: 90,
+						align: 'center',
+						templet:function(d){
+							var html='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">付款详情</span>';
+							return html;
+						}
+					}
+				]
+			]
+		});
+
+		//监听行工具事件
+		table.on('tool(test)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/finance/payment/view?id="+data.ticket_id);
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
diff --git a/app/finance/view/payment/view.html b/app/finance/view/payment/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..686f9d0c432fd9ea7df9cfb15cfd2e32e3d55f3d
--- /dev/null
+++ b/app/finance/view/payment/view.html
@@ -0,0 +1,190 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="layui-form p-page">
+	{eq name="$detail.invoice_type" value="0"}
+	<h3 class="pb-3">无发票付款详情</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray-2">预付款金额(元)</td>
+			<td class="blue">{$detail.amount}</td>
+			<td class="layui-td-gray">付款方</td>
+			<td>{$detail.subject}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-3">收款方(供应商)</td>
+			<td colspan="3">{$detail.supplier_name}</td>
+		</tr>
+		{notempty name="$detail.remark"}
+		<tr>
+			<td class="layui-td-gray">备注信息</td>
+			<td colspan="3">{$detail.remark}</td>
+		</tr>
+		{/notempty}
+		{notempty name="$detail.file_ids"}
+		<tr>
+			<td class="layui-td-gray">关联附件</td>
+			<td colspan="3" style="line-height:inherit">
+				<div class="layui-row">
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+	</table>
+	{else/}
+	<h3 class="pb-3">发票信息</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray-2">发票金额(元)</td>
+			<td class="blue">{$detail.amount}</td>
+			<td class="layui-td-gray">发票类型</td>
+			<td>
+			{eq name="$detail.invoice_type" value="1"}增值税专用发票{/eq}
+			{eq name="$detail.invoice_type" value="2"}普通发票{/eq}
+			{eq name="$detail.invoice_type" value="3"}专业发票{/eq}
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">发票抬头</td>
+			<td>{$detail.subject}</td>
+			<td class="layui-td-gray-3">开票主体(供应商)</td>
+			<td>{$detail.supplier_name}</td>
+		</tr>
+		{notempty name="$detail.remark"}
+		<tr>
+			<td class="layui-td-gray">备注信息</td>
+			<td colspan="3">{$detail.remark}</td>
+		</tr>
+		{/notempty}
+		{notempty name="$detail.file_ids"}
+		<tr>
+			<td class="layui-td-gray">关联附件</td>
+			<td colspan="3" style="line-height:inherit">
+				<div class="layui-row">
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+		<tr>
+			<td class="layui-td-gray">发票号码</td>
+			<td>{$detail.code}</td>
+			<td class="layui-td-gray">开票时间</td>
+			<td>{$detail.open_time|date='Y-m-d'}</td>
+		</tr>
+		{notempty name="$detail.other_file_ids"}
+		<tr>
+			<td class="layui-td-gray">发票附件</td>
+			<td colspan="3" style="line-height:inherit">
+				<div class="layui-row">
+					{volist name="$detail.other_file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+	</table>
+	{/eq}
+	
+	<h3 class="py-3">付款信息</h3>
+	<form class="layui-form">
+		<table class="layui-table layui-table-form">
+			<tr>
+				<td class="layui-td-gray">付款状态</td>
+				<td>
+					{if condition="($detail.pay_status == 0)"}
+						<span class="red">未付款</span>
+					{elseif condition="($detail.pay_status == 1)"}
+						<span class="blue">部分付款</span>
+					{elseif condition="($detail.pay_status == 2)"}
+						<span  class="green">全部付款</span>
+					{/if}
+				</td>
+				<td class="layui-td-gray-2">未付款金额(元)</td>
+				<td class="red">{$detail.not_pay}</td>
+				<td class="layui-td-gray-2">已付款金额(元)</td>
+				<td class="green">{$detail.pay_amount}</td>
+			</tr>
+			<tr>
+				<td class="layui-td-gray">付款记录</td>
+				<td colspan="5">
+					<table class="layui-table layui-table-min" style="margin:0">
+						<tr>
+							<th style="width:150px;">付款日期</th>
+							<th style="width:150px;">付款金额(元)</th>
+							<th>备注</th>
+							<th style="width:100px;">登记人</th>
+							<th style="width:150px;">登记时间</th>
+						</tr>
+						{empty name="$detail.payment"}
+						<tr class="none_interfix">
+							<td colspan="5" style="text-align: center;">暂无付款记录</td>
+						</tr>
+						{else/}
+						{volist name="$detail.payment" id="vo"}
+						<tr class="more_interfix">
+							<td>{$vo.pay_time | date='Y-m-d'}</td>
+							<td>{$vo.amount}</td>
+							<td style="text-align:left;">{$vo.remarks}</td>
+							<td>{$vo.admin}</td>
+							<td>{$vo.create_time | date='Y-m-d H:i:s'}</td>
+						</tr>
+						{/volist}
+						{/empty}
+					</table>
+				</td>
+			</tr>
+		</table>
+	</form>
+	<input type="hidden" name="id" value="{$detail.id}">
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool','oaTool'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool, oaTool = layui.oaTool;
+
+	oaTool.addFile({
+		isSave:true,
+		uidDelete:true,
+		ajaxSave:function(val){
+			$.ajax({
+				url: "/finance/api/upload_ticket",
+				type:'post',
+				data:{
+					id:$('[name="id"]').val(),
+					other_file_ids:val
+				},
+				success: function (e) {
+					location.reload();
+				}
+			})
+		},
+		ajaxDelete:function(val){
+			$.ajax({
+				url: "/finance/api/upload_ticket",
+				type:'post',
+				data:{
+					id:$('[name="id"]').val(),
+					other_file_ids:val
+				},
+				success: function (e) {
+					location.reload();
+				}
+			})
+		}
+	})
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/finance/view/ticket/add.html b/app/finance/view/ticket/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..904f756d9fc32b73ae43b21029b0c6cfd874352a
--- /dev/null
+++ b/app/finance/view/ticket/add.html
@@ -0,0 +1,121 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">新增收票信息</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">发票金额<font>*</font></td>
+			<td><input type="text" class="layui-input" name="amount" lay-verify="required|number" placeholder="请输入发票金额" lay-reqText="请输入发票金额" value=""></td>
+			<td class="layui-td-gray">发票号码<font>*</font></td>
+			<td><input type="text" class="layui-input" name="code" lay-verify="required" placeholder="请输入发票号码" lay-reqText="请输入发票号码" value=""></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">发票类型<font>*</font></td>
+			<td>
+			<select name="invoice_type" lay-verify="required" lay-reqText="请选择发票类型">
+				<option value="">请选择发票类型</option>
+				<option value="1">增值税专用发票</option>
+				<option value="2">普通发票</option>
+				<option value="3">专业发票</option>
+			  </select>
+			</td>
+			<td class="layui-td-gray">发票日期<font>*</font></td>
+			<td><input type="text" class="layui-input tool-time" name="open_time" lay-verify="required" readonly placeholder="请选择" lay-reqText="请完善发票日期" value=""></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">发票抬头<font>*</font></td>
+			<td>
+				<select name="invoice_subject" lay-verify="required" lay-reqText="请选择发票抬头">
+					<option value="">请选择发票抬头</option>
+					{volist name=":get_base_data('enterprise')" id="vo"}
+					<option value="{$vo.id}">{$vo.title}</option>
+					{/volist}
+				</select>
+			</td>
+			<td class="layui-td-gray-3">开票主体(供应商)<font>*</font></td>
+			<td>
+				<input type="text" name="supplier_name" class="layui-input picker-oa" data-types="supplier" value="" placeholder="请选择" readonly lay-verify="required" lay-reqText="开票主体(供应商)">
+				<input type="hidden" name="supplier_id" value=0>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">关联采购合同</td>
+			<td colspan="3">
+				<input type="text" class="layui-input picker-oa" data-types="purchase" name="purchase_name" placeholder="请选择" readonly value="">		
+				<input type="hidden" class="layui-input" name="purchase_id" value="0">		
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">关联项目</td>
+			<td colspan="3">
+				<input type="text" class="layui-input picker-oa" data-types="project" name="project_name" placeholder="请选择" readonly value="">		
+				<input type="hidden" class="layui-input" name="project_id" value="0">		
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">
+				<div class="layui-input-inline">附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="3" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="">
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">备注信息</td>
+			<td colspan="3"><textarea name="remark" placeholder="请输入备注信息" class="layui-textarea"></textarea></td>
+		</tr>
+	</table>
+	<div id="checkBox" data-status="0" data-id="0" data-checkflowid="0" class="pt-3"></div>
+	<div class="pt-4">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool','oaPicker','oaCheck','uploadPlus'];
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool, oaPicker = layui.oaPicker,oaCheck = layui.oaCheck,uploadPlus = layui.uploadPlus;		
+		//相关附件上传
+		var attachment = new uploadPlus();
+		
+		//审批相关
+		oaCheck.init({
+			check_name:'ticket',
+			check_btn:0
+		});
+		
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					let checkCallback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							tool.sideClose(1000);				
+						}
+					}
+					data.field.check_name = 'ticket';
+					data.field.action_id = e.data.return_id;
+					oaCheck.submit(data.field,checkCallback);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/finance/ticket/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/finance/view/ticket/add_a.html b/app/finance/view/ticket/add_a.html
new file mode 100644
index 0000000000000000000000000000000000000000..84d1d8a4e1dd0c63ca37c3060e3d51a219901bb5
--- /dev/null
+++ b/app/finance/view/ticket/add_a.html
@@ -0,0 +1,106 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">新增无发票付款申请</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray-3">预付款金额(元)<font>*</font></td>
+			<td><input type="text" class="layui-input" name="amount" lay-verify="required|number" placeholder="请输入预付款金额" lay-reqText="请输入预付款金额" value=""></td>
+			<td class="layui-td-gray">付款方<font>*</font></td>
+			<td>
+				<select name="invoice_subject" lay-verify="required" lay-reqText="请选择付款方">
+					<option value="">请选择付款方</option>
+					{volist name=":get_base_data('enterprise')" id="vo"}
+					<option value="{$vo.id}">{$vo.title}</option>
+					{/volist}
+				</select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-3">收款方(供应商)<font>*</font></td>
+			<td colspan="3">
+				<input type="text" name="supplier_name" class="layui-input picker-oa" data-types="supplier" value="" placeholder="请选择" readonly lay-verify="required" lay-reqText="请完善收款方(供应商)">
+				<input type="hidden" name="supplier_id" value="0">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">关联采购合同</td>
+			<td colspan="3">
+				<input type="text" class="layui-input picker-oa" data-types="purchase" name="purchase_name" placeholder="请选择" readonly value="">		
+				<input type="hidden" class="layui-input" name="purchase_id" value="0">		
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">关联项目</td>
+			<td colspan="3">
+				<input type="text" class="layui-input picker-oa" data-types="project" name="project_name" placeholder="请选择" readonly value="">		
+				<input type="hidden" class="layui-input" name="project_id" value="0">		
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">
+				<div class="layui-input-inline">附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="3" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="">
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">备注信息</td>
+			<td colspan="3"><textarea name="remark" placeholder="请输入备注信息" class="layui-textarea"></textarea></td>
+		</tr>
+	</table>
+	<div id="checkBox" data-status="0" data-id="0" data-checkflowid="0" class="pt-3"></div>
+	<div class="pt-4">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool','oaPicker','oaCheck','uploadPlus'];
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool, oaPicker = layui.oaPicker,oaCheck = layui.oaCheck,uploadPlus = layui.uploadPlus;		
+		//相关附件上传
+		var attachment = new uploadPlus();
+		
+		//审批相关
+		oaCheck.init({
+			check_name:'ticketa',
+			check_btn:0
+		});
+		
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					let checkCallback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							tool.sideClose(1000);				
+						}
+					}
+					data.field.check_name = 'ticketa';
+					data.field.action_id = e.data.return_id;
+					oaCheck.submit(data.field,checkCallback);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/finance/ticket/add_a", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/finance/view/ticket/datalist.html b/app/finance/view/ticket/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..ccaea4855a2e617d93aff16004c64bfd001db4f5
--- /dev/null
+++ b/app/finance/view/ticket/datalist.html
@@ -0,0 +1,210 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<div class="layui-card border-x border-t" style="margin-bottom:0; box-shadow:0 0 0 0 rgb(5 32 96 / 0%)">
+		<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
+			<ul class="layui-tab-title">
+				<li class="layui-this">全部</li>
+				<li>我申请的</li>
+				<li>待我审批</li>
+				<li>我已审批</li>
+				<li>抄送我的</li>
+			</ul>
+		</div>
+	</div>
+	<form class="layui-form gg-form-bar border-x tab-0" id="barsearchform">
+		<div class="layui-input-inline" style="width:175px;">
+			<input type="text" class="layui-input" id="diff_time" placeholder="选择发票时间区间" readonly name="diff_time">
+		</div>
+		<div class="layui-input-inline  search-item" style="width:120px;">
+			<select name="check_status">
+				<option value="">选择审批状态</option>
+				{volist name=":get_check_status()" id="vo"}
+				<option value="{$key}">{$vo}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline  search-item" style="width:120px;">
+			<select name="open_status">
+				<option value="">发票状态</option>
+				<option value="1">正常</option>
+				<option value="2">作废</option>
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<input type="hidden" name="tab" value="0"/>
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_ticket" lay-filter="table_ticket"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm tool-add" type="button" data-href="/finance/ticket/add">+ 添加收票信息</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus','laydatePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool, laydatePlus = layui.laydatePlus, element = layui.element;
+		//tab切换
+		element.on('tab(tab)', function(data){
+			$('[name="tab"]').val(data.index);
+			$("#barsearchform")[0].reset();
+			layui.pageTable.reload({where:{tab:data.index},page:{curr:1}});
+			return false;
+		});
+		
+		//日期范围
+		var diff_time = new laydatePlus({'target':'diff_time'});
+		layui.pageTable = table.render({
+			elem: "#table_ticket"
+			,toolbar: "#toolbarDemo"
+			,title: '发票列表'
+			,url: "/finance/ticket/datalist"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 80
+			,height: 'full-152'
+			,cols: [[
+				{
+						field: 'id',
+						title: 'ID号',
+						align: 'center',
+						width: 80
+					},{
+						field: 'supplier_name',
+						title: '供应商[发票主体]',
+						minWidth: 240
+					},{
+						field: 'amount',
+						title: '发票金额(元)',
+						align: 'right',
+						width: 100,
+					},{
+						field: 'code',
+						title: '发票号码',
+						align: 'center',
+						width: 160
+					},{
+						field: 'invoice_type',
+						title: '开票类型',
+						align: 'center',
+						width: 120,
+						templet:function(d){
+							var html='-';
+							if(d.invoice_type==1){
+								html='<span class="green">增值税专用发票</span>';
+							}
+							else if(d.invoice_type==2){
+								html='<span class="blue">普通发票</span>';
+							}
+							else if(d.invoice_type==3){
+								html='<span class="red">专业发票</span>';
+							}
+							return html;
+						}
+					},{
+						field:'check_status',title: '审批状态',width:110, align:'center',templet: function(d){
+							var html = '<span class="check-status-color-'+d.check_status+'">『'+d.check_status_str+'』</span>';
+							return html;
+						}
+					},
+					{
+						field: 'admin_name',
+						title: '收票员工',
+						align: 'center',
+						width: 100
+					},{
+						field: 'department',
+						title: '收票部门',
+						align: 'center',
+						width: 120
+					},{
+						field: 'create_time',
+						title: '收取时间',
+						align: 'center',
+						width: 150
+					},{
+						field: 'check_user',
+						title: '当前审核人'
+					},{
+						field: 'open_status',
+						title: '发票状态',
+						align: 'center',
+						width: 90,
+						templet:function(d){
+							var html='';
+							if(d.check_status==2){
+								html = '<span class="green">『正常』</span>';
+								if(d.open_status==2){
+									html = '<span class="red">『已作废』</span>';
+								}
+							}
+							else{
+								html='-';
+							}
+							return html;
+						}
+					},{
+						field: 'right',
+						fixed: 'right',
+						title: '操作',
+						width: 130,
+						align: 'center',
+						templet:function(d){
+							var html='<div class="layui-btn-group">';
+							var btn1='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</span>';
+							var btn2='<span class="layui-btn layui-btn-xs" lay-event="edit">编辑</span>';
+							var btn3='<span class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</span>';
+							html+=btn1;
+							if((d.check_status==0 ||d.check_status==4) && d.admin_id==login_admin){
+								html+=btn2+btn3;
+							}
+							html+='</div>';
+							return html;
+						}
+					}
+				]
+			]
+		});
+			
+		table.on('tool(table_ticket)',function (obj) {
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/finance/ticket/view?id="+data.id);
+				return;
+			}
+			if (obj.event === 'edit') {
+				tool.side("/finance/ticket/add?id="+data.id);
+				return;
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要删除该记录吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/finance/ticket/del", { id: data.id }, callback);
+					layer.close(index);
+				});
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/finance/view/ticket/datalist_a.html b/app/finance/view/ticket/datalist_a.html
new file mode 100644
index 0000000000000000000000000000000000000000..45525745598b92a80b29f9551e9b55aedc3d77dc
--- /dev/null
+++ b/app/finance/view/ticket/datalist_a.html
@@ -0,0 +1,264 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<div class="layui-card border-x border-t" style="margin-bottom:0; box-shadow:0 0 0 0 rgb(5 32 96 / 0%)">
+		<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
+			<ul class="layui-tab-title">
+				<li><a href="/finance/payment/datalist">有发票付款</a></li>
+				<li class="layui-this"><a href="/finance/ticket/datalist_a">无发票付款</a></li>
+			</ul>
+		</div>
+	</div>
+	<form class="layui-form gg-form-bar border-x" id="barsearchform">
+		<div class="layui-input-inline" style="width:175px;">
+			<input type="text" class="layui-input" id="diff_time" placeholder="选择付款时间区间" readonly name="diff_time">
+		</div>
+		<div class="layui-input-inline" style="width:120px;">
+			<select name="pay_status">
+				<option value="">请选择状态</option>
+				<option value="0">未付款</option>
+				<option value="1">部分付款</option>
+				<option value="2">全部付款</option>
+			</select>
+		</div>
+		<div class="layui-input-inline  search-item" style="width:120px;">
+			<select name="check_status">
+				<option value="">选择审批状态</option>
+				{volist name=":get_check_status()" id="vo"}
+				<option value="{$key}">{$vo}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm tool-add" type="button" data-href="/finance/ticket/add_a">+ 添加无发票付款申请</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const auth = "{$auth}";
+	const moduleInit = ['tool','tablePlus','laydatePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool, laydatePlus = layui.laydatePlus, element = layui.element;
+		
+		//日期范围
+		var diff_time = new laydatePlus({'target':'diff_time'});
+		layui.pageTable = table.render({
+			elem: "#test"
+			,toolbar: "#toolbarDemo"
+			,url: "/finance/ticket/datalist_a"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 80
+			,height: 'full-152'
+			,cellMinWidth: 80		
+			,page: true //开启分页
+			,limit: 20
+			,cols: [
+				[
+					{
+						field: 'id',
+						title: 'ID号',
+						align: 'center',
+						width: 80
+					},{
+						field: 'pay_status',
+						title: '付款状态',
+						align: 'center',
+						width: 100,
+						templet:function(d){
+							var html='<span class="red">『未付款』</span>';
+							if(d.pay_status==1){
+								html='<span class="blue">『部分付款』</span>';
+							}
+							else if(d.pay_status==2){
+								html='<span class="green">『全部付款』</span>';
+							}
+							return html;
+						}
+					},{
+						field: 'pay_amount',
+						title: '付款金额(元)',
+						align: 'right',
+						width: 100,
+					},{
+						field: 'pay_time',
+						title: '最新付款时间',
+						align: 'center',
+						width: 136
+					},{
+						field: 'supplier_name',
+						title: '供应商[发票主体]',
+						minWidth: 240
+					},{field:'check_status',title: '审批状态',width:110, align:'center',templet: function(d){
+							let html='';
+							if(d.open_status==2){
+								html = '<span class="check-status-color-3">『已作废』</span>';
+							}
+							else{
+								html = '<span class="check-status-color-'+d.check_status+'">『'+d.check_status_str+'』</span>';
+							}							
+							return html;
+						}
+					},{
+						field: 'amount',
+						title: '预付款金额(元)',
+						align: 'right',
+						width: 120,
+					},{
+						field: 'admin_name',
+						title: '申请人',
+						align: 'center',
+						width: 90
+					},{
+						field: 'department',
+						title: '所属部门',
+						align: 'center',
+						width: 120
+					},{
+						field: 'create_time',
+						title: '申请时间',
+						align: 'center',
+						width: 150
+					},{
+						field: 'check_user',
+						title: '当前审核人'
+					},{
+						field: 'right',
+						fixed: 'right',
+						title: '操作',
+						width: 180,
+						align: 'center',
+						templet:function(d){
+							var html='<div class="layui-btn-group">';
+							var btn1='<span class="layui-btn layui-btn-xs" lay-event="add">付款管理</span>';
+							var btn2='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">付款详情</span>';
+							var btn3='<span class="layui-btn layui-btn-danger layui-btn-xs" lay-event="tovoid">作废</span>';
+							var btn4='<span class="layui-btn layui-btn-danger layui-btn-xs" lay-event="novoid">反作废</span>';
+							
+							var btna1='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view_a">详情</span>';
+							var btna2='<span class="layui-btn layui-btn-xs" lay-event="edit_a">编辑</span>';
+							var btna3='<span class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del_a">删除</span>';
+							if(d.check_status==2){
+								if(auth == 1){
+									if(d.pay_status==0){
+										if(d.open_status==2){
+											html+=btn4+'</div>';
+										}
+										else{
+											html+=btn1+btn2+btn3+'</div>';
+										}
+									}
+									else{
+										html+=btn1+btn2+'</div>';
+									}
+								}
+								else{
+									html+=btn2+'</div>';
+								}
+							}
+							else{
+								html+=btna1;
+								if((d.check_status==0 ||d.check_status==4) && d.admin_id==login_admin){
+									html+=btna2+btna3;
+								}
+								html+='</div>';
+							}
+							return html;
+						}
+					}
+				]
+			]
+		});
+		
+		//监听行工具事件
+		table.on('tool(test)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'add') {
+				tool.side("/finance/payment/add?id="+data.id);
+				return;
+			}
+			if (obj.event === 'view') {
+				tool.side("/finance/payment/view?id="+data.id);
+				return;
+			}
+			if (obj.event === 'tovoid') {
+				layer.confirm('确定作废该无发票付款申请吗？', {
+					icon: 3,
+					title: '提示'
+				}, function(index) {
+					$.ajax({
+						url: "/finance/api/tovoid_ticket",
+						type:'post',
+						data: {
+							id: data.id
+						},
+						success: function(res) {
+							layer.msg(res.msg);
+							if (res.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+					})
+					layer.close(index);
+				});
+			}
+			if (obj.event === 'novoid') {
+				layer.confirm('确定反作废该无发票付款申请吗？', {
+					icon: 3,
+					title: '提示'
+				}, function(index) {
+					$.ajax({
+						url: "/finance/api/novoid_ticket",
+						type:'post',
+						data: {
+							id: data.id
+						},
+						success: function(res) {
+							layer.msg(res.msg);
+							if (res.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+					})
+					layer.close(index);
+				});
+			}
+			if (obj.event === 'view_a') {
+				tool.side("/finance/ticket/view_a?id="+data.id);
+				return;
+			}
+			if (obj.event === 'edit_a') {
+				tool.side("/finance/ticket/add_a?id="+data.id);
+				return;
+			}
+			if (obj.event === 'del_a') {
+				layer.confirm('确定要删除该内容吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/finance/ticket/del_a", { id: data.id }, callback);
+					layer.close(index);
+				});
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
diff --git a/app/finance/view/ticket/edit.html b/app/finance/view/ticket/edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..ab8c1eac60d9433fdf4e5e4e659ba91ab0e7e89a
--- /dev/null
+++ b/app/finance/view/ticket/edit.html
@@ -0,0 +1,154 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">编辑开票申请</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">发票金额<font>*</font></td>
+			<td><input type="text" class="layui-input" name="amount" lay-verify="required|number" placeholder="请输入发票金额" lay-reqText="请输入发票金额" value="{$detail.amount}"></td>
+			<td class="layui-td-gray">发票号码<font>*</font></td>
+			<td><input type="text" class="layui-input" name="code" lay-verify="required" placeholder="请输入发票号码" lay-reqText="请输入发票号码" value="{$detail.code}"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">发票类型<font>*</font></td>
+			<td>
+			<select name="invoice_type" lay-verify="required" lay-reqText="请选择发票类型">
+				<option value="">请选择发票类型</option>
+				<option value="1" {eq name="$detail.invoice_type" value="1"}selected{/eq}>增值税专用发票</option>
+				<option value="2" {eq name="$detail.invoice_type" value="2"}selected{/eq}>普通发票</option>
+				<option value="3" {eq name="$detail.invoice_type" value="3"}selected{/eq}>专业发票</option>
+			  </select>
+			</td>
+			<td class="layui-td-gray">发票日期<font>*</font></td>
+			<td><input type="text" class="layui-input tool-time" name="open_time" lay-verify="required" readonly placeholder="请选择" lay-reqText="请完善发票日期" value="{$detail.open_time|date='Y-m-d'}"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">发票抬头<font>*</font></td>
+			<td>
+				<select name="invoice_subject" lay-verify="required" lay-reqText="请选择发票抬头">
+					<option value="">请选择发票抬头</option>
+					{volist name=":get_base_data('enterprise')" id="vo"}
+					<option value="{$vo.id}" {eq name="$vo.id" value="$detail.invoice_subject"}selected{/eq}>{$vo.title}</option>
+					{/volist}
+				</select>
+			</td>
+			<td class="layui-td-gray-3">开票主体(供应商)<font>*</font></td>
+			<td>
+				<input type="text" name="supplier_name" class="layui-input picker-oa" data-types="supplier" value="{$detail.supplier_name}" placeholder="请选择" readonly lay-verify="required" lay-reqText="开票主体(供应商)">
+				<input type="hidden" name="supplier_id" value="{$detail.supplier_id}">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">关联采购合同</td>
+			<td colspan="3">
+				<input type="text" class="layui-input picker-oa" data-types="purchase" name="purchase_name" placeholder="请选择" readonly value="{$detail.purchase_name|default=''}">		
+				<input type="hidden" class="layui-input" name="purchase_id" value="{$detail.purchase_id}">		
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">关联项目</td>
+			<td colspan="5">
+				<input type="text" class="layui-input picker-oa" data-types="project" name="project_name" placeholder="请选择需要关联的项目" readonly value="{$detail.project_name|default=''}">		
+				<input type="hidden" class="layui-input" name="project_id" value="{$detail.project_id}">		
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">
+				<div class="layui-input-inline">附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids}">
+					{notempty name="$detail.file_ids"}
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">备注信息</td>
+			<td colspan="5"><textarea name="remark" placeholder="请输入备注信息" class="layui-textarea">{$detail.remark|default=''}</textarea></td>
+		</tr>
+	</table>	
+	<div id="checkBox" class="pt-3" data-status="{$detail.check_status}" data-id="{$detail.id}" data-checkflowid="{$detail.check_flow_id}"></div>
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$detail.id}"/>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool','oaPicker','oaCheck','uploadPlus'];
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool, oaPicker = layui.oaPicker,oaCheck = layui.oaCheck,uploadPlus = layui.uploadPlus;
+		//选择抬头类型
+		form.on('radio(type)', function (data) {
+			if(data.value==2){
+				$('.invoice-qiye').hide();
+			}
+			else{
+				$('.invoice-qiye').show();
+			}
+		});
+		
+		//相关附件上传
+		var attachment = new uploadPlus();
+		
+		//审批相关
+		oaCheck.init({
+			check_name:'ticket',
+			check_btn:0
+		});
+		
+		$('.customer-picker').on('click',function(){
+			let that = $(this),ids = [],titles=[];
+			let callback = function(data){
+				for ( var i = 0; i <data.length; i++){
+					ids.push(data[i].id);
+					titles.push(data[i].title);
+				}
+				that.val(titles.join(','));
+				that.next().val(ids.join(','));
+				$('[name="invoice_tax"]').val(tax_num.join(','));
+				$('[name="invoice_bank"]').val(bank.join(','));
+				$('[name="invoice_account"]').val(bank_sn.join(','));
+				$('[name="invoice_phone"]').val(cperson_mobile.join(','));
+				$('[name="invoice_address"]').val(cperson_address.join(','));
+			}
+			oaPicker.picker('customer',1,callback,{});
+		});
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					let checkCallback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							tool.sideClose(1000);				
+						}
+					}
+					data.field.check_name = 'ticket';
+					data.field.action_id = e.data.return_id;
+					oaCheck.submit(data.field,checkCallback);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/finance/ticket/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/finance/view/ticket/edit_a.html b/app/finance/view/ticket/edit_a.html
new file mode 100644
index 0000000000000000000000000000000000000000..1b38d2fb55e6468e0a24278ada7eae33f0dfdb74
--- /dev/null
+++ b/app/finance/view/ticket/edit_a.html
@@ -0,0 +1,111 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">编辑无发票付款申请</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray-3">预付款金额(元)<font>*</font></td>
+			<td><input type="text" class="layui-input" name="amount" lay-verify="required|number" placeholder="请输入预付款金额" lay-reqText="请输入预付款金额" value="{$detail.amount}"></td>
+			<td class="layui-td-gray">付款方<font>*</font></td>
+			<td>
+				<select name="invoice_subject" lay-verify="required" lay-reqText="请选择付款方">
+					<option value="">请选择付款方</option>
+					{volist name=":get_base_data('enterprise')" id="vo"}
+					<option value="{$vo.id}" {eq name="$vo.id" value="$detail.invoice_subject"}selected{/eq}>{$vo.title}</option>
+					{/volist}
+				</select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-3">收款方(供应商)<font>*</font></td>
+			<td colspan="3">
+				<input type="text" name="supplier_name" class="layui-input picker-oa" data-types="supplier" value="{$detail.supplier_name|default=''}" placeholder="请选择" readonly lay-verify="required" lay-reqText="请完善收款方(供应商)">
+				<input type="hidden" name="supplier_id" value="{$detail.supplier_id}">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">关联采购合同</td>
+			<td colspan="3">
+				<input type="text" class="layui-input picker-oa" data-types="purchase" name="purchase_name" placeholder="请选择需要关联的合同" readonly value="{$detail.purchase_name|default=''}">		
+				<input type="hidden" class="layui-input" name="purchase_id" value="{$detail.purchase_id}">		
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">关联项目</td>
+			<td colspan="3">
+				<input type="text" class="layui-input picker-oa" data-types="project" name="project_name" placeholder="请选择需要关联的项目" readonly value="{$detail.project_name|default=''}">		
+				<input type="hidden" class="layui-input" name="project_id" value="{$detail.project_id}">		
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">
+				<div class="layui-input-inline">附件</div>
+				<div class="layui-input-inline">
+					<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
+				</div>
+			</td>
+			<td colspan="3" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids}">
+					{notempty name="$detail.file_ids"}
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">备注信息</td>
+			<td colspan="3"><textarea name="remark" placeholder="请输入备注信息" class="layui-textarea">{$detail.remark|default=''}</textarea></td>
+		</tr>
+	</table>	
+	<div id="checkBox" class="pt-3" data-status="{$detail.check_status}" data-id="{$detail.id}" data-checkflowid="{$detail.check_flow_id}"></div>
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$detail.id}"/>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool','oaPicker','oaCheck','uploadPlus'];
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool, oaPicker = layui.oaPicker,oaCheck = layui.oaCheck,uploadPlus = layui.uploadPlus;		
+		//相关附件上传
+		var attachment = new uploadPlus();
+		
+		//审批相关
+		oaCheck.init({
+			check_name:'ticketa',
+			check_btn:0
+		});
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					let checkCallback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							tool.sideClose(1000);				
+						}
+					}
+					data.field.check_name = 'ticketa';
+					data.field.action_id = e.data.return_id;
+					oaCheck.submit(data.field,checkCallback);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/finance/ticket/add_a", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/finance/view/ticket/record.html b/app/finance/view/ticket/record.html
new file mode 100644
index 0000000000000000000000000000000000000000..005b67ce6bcd04f899805ceef1026e811fe361d4
--- /dev/null
+++ b/app/finance/view/ticket/record.html
@@ -0,0 +1,220 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<div class="layui-card border-x border-t" style="margin-bottom:0; box-shadow:0 0 0 0 rgb(5 32 96 / 0%)">
+		<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
+			<ul class="layui-tab-title">
+				<li class="layui-this">正常</li>
+				<li>已作废</li>
+			</ul>
+		</div>
+	</div>
+	<form class="layui-form gg-form-bar border-x" id="barsearchform">
+		<div class="layui-input-inline" style="width:175px;">
+			<input type="text" class="layui-input" id="diff_time" placeholder="选择时间区间" readonly name="diff_time">
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<input type="hidden" name="tab" value="0"/>
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+<div class="layui-btn-container">
+    <h3 class="h3-title" style="height:32px;">收票列表</h3>
+</div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const auth = {$authInvoice};
+	const moduleInit = ['tool','tablePlus','laydatePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool, laydatePlus = layui.laydatePlus, element = layui.element;
+		//tab切换
+		element.on('tab(tab)', function(data){
+			$('[name="tab"]').val(data.index);
+			$("#barsearchform")[0].reset();
+			layui.pageTable.reload({where:{tab:data.index},page:{curr:1}});
+			return false;
+		});
+		
+		//日期范围
+		var diff_time = new laydatePlus({'target':'diff_time'});
+
+		layui.pageTable = table.render({
+			elem: '#test',
+			title: '收票列表',
+			toolbar: '#toolbarDemo',
+			url: "/finance/ticket/record", //数据接口	
+			cellMinWidth: 80,			
+			page: true, //开启分页
+			limit: 20,
+			height: 'full-112',
+			totalRow: true,
+			cols: [[
+				{
+						field: 'id',
+						title: 'ID号',
+						align: 'center',
+						width: 80
+					},{
+						field: 'open_status',
+						title: '发票状态',
+						align: 'center',
+						width: 90,
+						templet:function(d){
+							var html='';
+							if(d.check_status==2){
+								html = '<span class="green">『正常』</span>';
+								if(d.open_status==2){
+									html = '<span class="red">『已作废』</span>';
+								}
+							}
+							else{
+								html='-';
+							}
+							return html;
+						},
+						totalRowText: '<div style="text-align:right">合计</div>'
+					},{
+						field: 'amount',
+						title: '发票金额(元)',
+						align: 'right',
+						width: 120,
+						totalRow: function (d) {return d.TOTAL_ROW.amount}
+					},{
+						field: 'supplier_name',
+						title: '供应商[发票主体]',
+						minWidth: 240
+					},{
+						field: 'open_time',
+						title: '发票日期',
+						align: 'center',
+						width: 100
+					},{
+						field: 'code',
+						title: '发票号码',
+						align: 'center',
+						width: 160
+					},{
+						field: 'invoice_type',
+						title: '开票类型',
+						align: 'center',
+						width: 120,
+						templet:function(d){
+							var html='-';
+							if(d.invoice_type==1){
+								html='<span class="green">增值税专用发票</span>';
+							}
+							else if(d.invoice_type==2){
+								html='<span class="blue">普通发票</span>';
+							}
+							else if(d.invoice_type==3){
+								html='<span class="red">专业发票</span>';
+							}
+							return html;
+						}
+					},{
+						field: 'admin_name',
+						title: '收票员工',
+						align: 'center',
+						width: 100
+					},{
+						field: 'department',
+						title: '收票部门',
+						align: 'center',
+						width: 120
+					},{
+						field: 'create_time',
+						title: '创建时间',
+						align: 'center',
+						width: 150
+					},{
+						field: 'right',
+						fixed: 'right',
+						title: '操作',
+						width: 100,
+						align: 'center',
+						templet:function(d){
+							var html='<div class="layui-btn-group">';
+							var btn1='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</span>';
+							var btn2='<span class="layui-btn layui-btn-warm layui-btn-xs" lay-event="tovoid">作废</span>';
+							var btn3='<span class="layui-btn layui-btn-danger layui-btn-xs" lay-event="novoid">反作废</span>';
+							html+=btn1;
+							if(auth==1){
+								if(d.open_status==1){
+									html+=btn2;
+								}
+								if(d.open_status==2){
+									html+=btn3;
+								}
+							}
+							html+='</div>';
+							return html;
+						}
+					}
+				]
+			]
+		});
+
+		//监听行工具事件
+		table.on('tool(test)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/finance/ticket/view?id="+data.id);
+				return;
+			}
+			if (obj.event === 'tovoid') {
+				layer.confirm('确定作废该发票吗？', {
+					icon: 3,
+					title: '提示'
+				}, function(index) {
+					$.ajax({
+						url: "/finance/api/tovoid_ticket",
+						type:'post',
+						data: {
+							id: data.id
+						},
+						success: function(res) {
+							layer.msg(res.msg);
+							if (res.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+					})
+					layer.close(index);
+				});
+			}
+			if (obj.event === 'novoid') {
+				layer.confirm('确定反作废该发票吗？', {
+					icon: 3,
+					title: '提示'
+				}, function(index) {
+					$.ajax({
+						url: "/finance/api/novoid_ticket",
+						type:'post',
+						data: {
+							id: data.id
+						},
+						success: function(res) {
+							layer.msg(res.msg);
+							if (res.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+					})
+					layer.close(index);
+				});
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
diff --git a/app/finance/view/ticket/view.html b/app/finance/view/ticket/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..120585c9924f4dc05e7c5f58d9f07582b55327b7
--- /dev/null
+++ b/app/finance/view/ticket/view.html
@@ -0,0 +1,80 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="layui-form p-page">
+	<h3 class="pb-3">收票详情</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray-2">发票金额(元)</td>
+			<td class="blue">{$detail.amount}</td>
+			<td class="layui-td-gray">发票类型</td>
+			<td>
+				{eq name="$detail.invoice_type" value="1"}增值税专用发票{/eq}
+				{eq name="$detail.invoice_type" value="2"}普通发票{/eq}
+				{eq name="$detail.invoice_type" value="3"}专业发票{/eq}
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">发票抬头</td>
+			<td>{$detail.subject}</td>
+			<td class="layui-td-gray-3">开票主体(供应商)</td>
+			<td>{$detail.supplier_name}</td>
+		</tr>
+		{if condition="$detail.purchase_id > 0"}
+		<tr>
+		<td class="layui-td-gray">关联采购合同</td>
+			<td colspan="3">{$detail.purchase_name|default=''}</td>
+		</tr>
+		{/if}
+		{if condition="$detail.project_id > 0"}
+		<tr>
+		<td class="layui-td-gray">关联的项目</td>
+			<td colspan="3">{$detail.project_name|default=''}</td>
+		</tr>
+		{/if}
+		{if ( $detail.open_status gt 0)}
+		<tr>
+			<td class="layui-td-gray">发票号码</td>
+			<td>{$detail.code}{eq name="$detail.open_status" value="2"}<span class="yellow">『已作废』</span>{/eq}</td>
+			<td class="layui-td-gray">发票日期</td>
+			<td>{$detail.open_time}</td>
+		</tr>
+		{/if}
+		{notempty name="$detail.remark"}
+		<tr>
+			<td class="layui-td-gray">备注信息</td>
+			<td colspan="3">{$detail.remark}</td>
+		</tr>
+		{/notempty}
+		{notempty name="$detail.file_ids"}
+		<tr>
+			<td class="layui-td-gray">关联附件</td>
+			<td colspan="3" style="line-height:inherit">
+				<div class="layui-row">
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+	</table>
+	<div id="checkBox" class="pt-3" data-status="{$detail.check_status}" data-id="{$detail.id}" data-checkflowid="{$detail.check_flow_id}"></div>
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const ticket_id = {$detail.id};
+const moduleInit = ['tool','oaCheck','uploadPlus'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool, oaCheck=layui.oaCheck,uploadPlus = layui.uploadPlus;	
+	oaCheck.init({
+		check_name:'ticket'
+	});
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/finance/view/ticket/view_a.html b/app/finance/view/ticket/view_a.html
new file mode 100644
index 0000000000000000000000000000000000000000..71cc12b053e982252b518bf47d6560bac97236a8
--- /dev/null
+++ b/app/finance/view/ticket/view_a.html
@@ -0,0 +1,98 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="layui-form p-page">
+	<h3 class="pb-3">无发票付款详情</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray-2">预付款金额(元)</td>
+			<td class="blue">{$detail.amount}</td>
+			<td class="layui-td-gray">付款方</td>
+			<td>{$detail.subject}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-3">收款方(供应商)</td>
+			<td colspan="3">{$detail.supplier_name}</td>
+		</tr>
+		{if condition="$detail.purchase_id > 0"}
+		<tr>
+		<td class="layui-td-gray">关联采购合同</td>
+			<td colspan="3">{$detail.purchase_name|default=''}</td>
+		</tr>
+		{/if}
+		{if condition="$detail.project_id > 0"}
+		<tr>
+		<td class="layui-td-gray">关联的项目</td>
+			<td colspan="3">{$detail.project_name|default=''}</td>
+		</tr>
+		{/if}
+		{notempty name="$detail.remark"}
+		<tr>
+			<td class="layui-td-gray">备注信息</td>
+			<td colspan="3">{$detail.remark}</td>
+		</tr>
+		{/notempty}
+		{notempty name="$detail.file_ids"}
+		<tr>
+			<td class="layui-td-gray">关联附件</td>
+			<td colspan="3" style="line-height:inherit">
+				<div class="layui-row">
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+	</table>
+	<div id="checkBox" class="pt-3" data-status="{$detail.check_status}" data-id="{$detail.id}" data-checkflowid="{$detail.check_flow_id}"></div>
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const ticket_id = {$detail.id};
+const moduleInit = ['tool','oaCheck','uploadPlus'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool, oaCheck=layui.oaCheck,uploadPlus = layui.uploadPlus;	
+	oaCheck.init({
+		check_name:'ticket'
+	});
+	//相关附件上传
+	var attachment = new uploadPlus({
+		"attachment":{
+			uidDelete:true,
+			ajaxSave:function(val){
+				$.ajax({
+					url: "/finance/api/upload_ticket",
+					type:'post',
+					data:{
+						id:ticket_id,
+						other_file_ids:val
+					},
+					success: function (e) {
+						location.reload();
+					}
+				})
+			},
+			ajaxDelete:function(val){
+				$.ajax({
+					url: "/finance/api/upload_ticket",
+					type:'post',
+					data:{
+						id:ticket_id,
+						other_file_ids:val
+					},
+					success: function (e) {
+						location.reload();
+					}
+				})
+			}
+		}
+	})
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/common.php b/app/home/common.php
new file mode 100644
index 0000000000000000000000000000000000000000..58004c90d600ac0925e51ab0ffa23caa78ed58ec
--- /dev/null
+++ b/app/home/common.php
@@ -0,0 +1,94 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+use think\facade\Db;
+
+//获取服务器信息
+function get_system_info($key)
+{
+    $system = [
+        'os' => PHP_OS,
+        'php' => PHP_VERSION,
+        'upload_max_filesize' => get_cfg_var("upload_max_filesize") ? get_cfg_var("upload_max_filesize") : "不允许上传附件",
+        'max_execution_time' => get_cfg_var("max_execution_time") . "秒 ",
+    ];
+    if (empty($key)) {
+        return $system;
+    } else {
+        return $system[$key];
+    }
+}
+
+//假期类型
+function get_leaves_types($id=0)
+{
+	$types_array = ['未设置','事假','年假','调休假','病假','婚假','丧假','产假','陪产假','其他'];
+	if($id==0){
+		return $types_array;
+	}
+	else{
+		$news_array=[];
+		foreach($types_array as $key => $value){
+			if($key>0){
+				$news_array[]=array(
+					'id'=>$key,
+					'title'=>$value,
+				);
+			}
+		}
+		return $news_array;
+	}
+}
+
+//根据假期类型读取名称
+function leaves_types_name($types=0)
+{
+	$types_array = get_leaves_types();
+	return $types_array[$types];
+}
+
+//读取后台菜单列表
+function admin_menu()
+{
+    $menu = Db::name('AdminRule')->where(['menu' => 1,'status'=>1])->order('sort asc,id asc')->select()->toArray();
+    return $menu;
+}
+
+//读取权限节点列表
+function admin_rule()
+{
+    $rule = Db::name('AdminRule')->where(['status'=>1])->order('sort asc,id asc')->select()->toArray();
+    return $rule;
+}
+
+//读取权限分组列表
+function admin_group()
+{
+    $group = Db::name('AdminGroup')->order('id desc')->select()->toArray();
+    return $group;
+}
+
+//读取指定权限分组菜单详情
+function admin_group_info($id)
+{
+    $rule = Db::name('AdminGroup')->where(['id' => $id])->value('rules');
+	$rules = explode(',', $rule);
+    return $rules;
+}
+
+//读取模块列表
+function admin_module()
+{
+    $group = Db::name('AdminModule')->order('id asc')->select()->toArray();
+    return $group;
+}
diff --git a/app/home/controller/Api.php b/app/home/controller/Api.php
new file mode 100644
index 0000000000000000000000000000000000000000..528966be44e7fee41ad7c6a75b0c66b328a6e873
--- /dev/null
+++ b/app/home/controller/Api.php
@@ -0,0 +1,129 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+declare (strict_types = 1);
+namespace app\home\controller;
+
+use app\api\BaseController;
+use think\facade\Db;
+
+class api extends BaseController
+{
+    //首页公告
+    public function get_note_list()
+    {
+        $list = Db::name('Note')
+            ->field('a.id,a.title,a.create_time,c.title as cate_title')
+            ->alias('a')
+            ->join('note_cate c', 'a.cate_id = c.id')
+            ->where(['a.status' => 1,'a.delete_time' => 0])
+            ->order('a.end_time desc,a.sort desc,a.create_time desc')
+            ->limit(8)
+            ->select()->toArray();
+        foreach ($list as $key => $val) {
+            $list[$key]['create_time'] = date('Y-m-d H:i', $val['create_time']);
+        }
+        $res['data'] = $list;
+        return table_assign(0, '', $res);
+    }
+	
+	//首页知识列表
+    public function get_article_list()
+    {
+		$prefix = get_config('database.connections.mysql.prefix');//判断是否安装了文章模块
+		$exist = Db::query('show tables like "'.$prefix.'article"');
+		$res['data'] = [];
+		if($exist){
+			$list = Db::name('Article')
+				->field('a.id,a.title,a.create_time,a.read,c.title as cate_title')
+				->alias('a')
+				->join('article_cate c', 'a.cate_id = c.id')
+				->where(['a.delete_time' => 0])
+				->order('a.id desc')
+				->limit(8)
+				->select()->toArray();
+			foreach ($list as $key => $val) {
+				$list[$key]['create_time'] = date('Y-m-d H:i', $val['create_time']);
+			}
+			$res['data'] = $list;			
+		}
+		return table_assign(0, '', $res);
+	}
+	
+    //获取访问记录
+    public function get_view_data()
+    {
+        $param = get_params();
+        $first_time = time();
+        $second_time = $first_time - 86400;
+        $three_time = $first_time - 86400 * 365;
+        $begin_first = strtotime(date('Y-m-d', $first_time) . " 00:00:00");
+        $end_first = strtotime(date('Y-m-d', $first_time) . " 23:59:59");
+        $begin_second = strtotime(date('Y-m-d', $second_time) . " 00:00:00");
+        $end_second = strtotime(date('Y-m-d', $second_time) . " 23:59:59");
+        $begin_three = strtotime(date('Y-m-d', $three_time) . " 00:00:00");
+        $data_first = Db::name('AdminLog')->field('create_time')->whereBetween('create_time', "$begin_first,$end_first")->select();
+        $data_second = Db::name('AdminLog')->field('create_time')->whereBetween('create_time', "$begin_second,$end_second")->select();
+        $data_three = Db::name('AdminLog')->field('create_time')->whereBetween('create_time', "$begin_three,$end_first")->select();
+        return to_assign(0, '', ['data_first' => hour_document($data_first), 'data_second' => hour_document($data_second), 'data_three' => $data_three]);
+    }
+	
+	//获取员工活跃数据
+    public function get_view_log()
+    {		
+        $times = strtotime("-30 day");
+        $where = [];
+        $where[] = ['uid','<>',1];
+        $where[] = ['create_time', '>', $times];
+        $list = Db::name('AdminLog')->field("id,uid")->where($where)->select();
+        $logs = array();
+        foreach ($list as $key => $value) {
+            $uid = $value['uid'];
+            if (empty($logs[$uid])) {
+                $logs[$uid]['count'] = 1;
+                $logs[$uid]['name'] = Db::name('Admin')->where('id',$uid)->value('name');
+            } else {
+                $logs[$uid]['count'] += 1;
+            }
+        }
+        $counts = array_column($logs, 'count');
+        array_multisort($counts, SORT_DESC, $logs);
+        //攫取前10
+        $data_logs = array_slice($logs, 0, 10);
+        return to_assign(0, '', ['data_logs' => $data_logs]);
+    }
+	
+	public function areaJson($type)
+    {
+		if($type=='province'){
+			$data = Db::name('Area')->where(['level'=>1,'status'=>1])->column('name', 'id');
+		}
+		if($type=='city'){
+			$data = Db::name('Area')->where(['level'=>2,'status'=>1])->column('name', 'id');
+		}
+		if($type=='district'){
+			$data = Db::name('Area')->where(['level'=>3,'status'=>1])->column('name', 'id');
+		}
+        // 导出为 JSON 格式
+        $json = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
+		return $json;
+		/*
+		输出Json文件
+        // 设置响应头
+        header('Content-Type: application/json');
+        header('Content-Disposition: attachment; filename="oa_area.json"');
+        // 输出 JSON 数据
+        echo $json;
+		*/
+    }
+
+}
diff --git a/app/home/controller/Approve.php b/app/home/controller/Approve.php
new file mode 100644
index 0000000000000000000000000000000000000000..fe5cbec2a53f1098cde7a6379f21a791609a6c88
--- /dev/null
+++ b/app/home/controller/Approve.php
@@ -0,0 +1,261 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\home\controller;
+
+use app\api\BaseController;
+use think\facade\Db;
+use think\facade\View;
+
+class Approve extends BaseController
+{
+	public function index()
+    {
+		$department = $this->did;
+		$module = Db::name('FlowModule')->where(['status'=>1])->select()->toArray();
+		$whereOr = [];
+		if($this->uid>1){				
+			$map1=[
+				['department_ids', '=', '']
+			];
+			$map2=[
+				['', 'exp', Db::raw("FIND_IN_SET('{$department}',department_ids)")]
+			];
+			$whereOr =[$map1,$map2];
+		}
+		
+		foreach ($module as &$row) {
+			// 处理每一行数据
+			$row['list'] = Db::name('FlowCate')
+				->where([['module_id','=',$row['id']],['status','=',1],['is_list','=',1]])
+				->where(function ($query) use($whereOr) {
+					if (!empty($whereOr)){
+						$query->whereOr($whereOr);
+					}
+				})
+				->select()->toArray();
+		}
+		View::assign('module', $module);
+		return view();
+	}
+	
+	public function get_list($where,$param)
+    {
+			$tables = Db::name('FlowCate')->field('name,check_table')->where('status',1)->select()->toArray();
+			$prefix = get_config('database.connections.mysql.prefix');
+			$sqlParts = [];
+			$sqlCounts = [];
+			$fortable =[];
+			foreach ($tables as $table) {
+				$dbname = $table['check_table'];
+				if(in_array($dbname,$fortable)){
+					continue;
+				}
+				$check_name = $table['name'];
+				$tableName = $prefix.$dbname;
+				$sqlPart = "SELECT id,admin_id,did,create_time,check_status,check_flow_id,check_step_sort,check_uids,check_last_uid,check_history_uids,check_copy_uids,check_time,'{$dbname}' as table_name,'{$check_name}' as check_name,'{$check_name}' as invoice_type,'{$check_name}' as types FROM {$tableName} WHERE {$where}";
+				if($dbname=='invoice' || $dbname=='ticket'){
+					$sqlPart = "SELECT id,admin_id,did,create_time,check_status,check_flow_id,check_step_sort,check_uids,check_last_uid,check_history_uids,check_copy_uids,check_time,'{$dbname}' as table_name,'{$check_name}' as check_name,invoice_type,'{$check_name}' as types FROM {$tableName} WHERE {$where}";
+				}
+				if($dbname=='approve'){
+					$sqlPart = "SELECT id,admin_id,did,create_time,check_status,check_flow_id,check_step_sort,check_uids,check_last_uid,check_history_uids,check_copy_uids,check_time,'{$dbname}' as table_name,'{$check_name}' as check_name,'{$check_name}' as invoice_type,types FROM {$tableName} WHERE {$where}";
+				}
+				$sqlCount = "SELECT COUNT(*) AS count FROM {$tableName} WHERE {$where}";
+				// 查询数据库中是否存在该数据表
+				$is_table = Db::query("SHOW TABLES LIKE '{$tableName}'");
+				// 判断查询结果
+				if (!empty($is_table)) {
+					$sqlParts[] = $sqlPart;
+					$sqlCounts[] = $sqlCount;
+					$fortable[] = $table['check_table'];
+				}
+			}
+
+			// 使用implode将各个部分用UNION ALL连接起来
+			$unionSql = implode(" UNION ALL ", $sqlParts);
+			
+			$totalCount = 0;
+			foreach ($sqlCounts as $sql) {
+				$count = Db::query($sql)[0]['count']; // 假设每个查询都返回了一个包含'count'键的数组
+				$totalCount += $count;
+			}
+			// 添加排序和分页逻辑
+			$page = isset($param['page']) ? $param['page'] : 1;
+			$pageSize = $param['limit'];
+			$offset = ($page - 1) * $pageSize;
+
+			// 注意：不同的数据库分页语法可能有所不同，这里以MySQL为例
+			$finalSql = $unionSql . " ORDER BY create_time DESC LIMIT {$offset}, {$pageSize}";
+
+			// 执行查询
+			$result = Db::query($finalSql);
+			// 处理结果
+			foreach ($result as &$row) {
+				// 处理每一行数据
+				$row['create_time'] = date('Y-m-d H:i:s',$row['create_time']);
+				$row['admin_name'] = Db::name('Admin')->where('id',$row['admin_id'])->value('name');
+				$row['department'] = Db::name('Department')->where('id',$row['did'])->value('title');
+				$row['check_status_str'] = check_status_name($row['check_status']);
+				if($row['check_status']==1 && !empty($row['check_uids'])){
+					$check_users = Db::name('Admin')->where('id','in',$row['check_uids'])->column('name');
+					$row['check_users'] = implode(',',$check_users);
+				}
+				else{
+					$row['check_users']='-';
+				}
+				if(!empty($row['check_copy_uids'])){
+					$check_copy_users = Db::name('Admin')->where('id','in',$row['check_copy_uids'])->column('name');
+					$row['check_copy_users'] = implode(',',$check_copy_users);
+				}
+				else{
+					$row['check_copy_users']='-';
+				}
+				
+				$check_name=$row['check_name'];
+				if($row['table_name'] == 'invoice' || $row['table_name']=='ticket'){
+					if($row['invoice_type']==0){
+						$check_name=$row['table_name'].'a';
+					}
+					else{
+						$check_name=$row['table_name'];
+					}
+				}
+				if($row['table_name'] == 'approve'){
+					$check_name='approve_'.$row['types'];
+				}
+				$flow_cate = Db::name('FlowCate')->where('name',$check_name)->find();
+				$row['types_name'] = $flow_cate['title'];
+				$row['view_url'] = $flow_cate['view_url'];
+				$row['add_url'] = $flow_cate['add_url'];
+			}
+			$list=array(
+				'data'=>$result,
+				'total'=>$totalCount
+			);
+			return $list;
+	}
+	
+	
+	//我申请的
+    public function mylist()
+    {
+        if (request()->isAjax()) {
+			$param = get_params();
+			$status = isset($param['status']) ? $param['status'] : 0;
+			$uid = $this->uid;
+			$where = "delete_time = 0";
+			if($status == 1){
+				$where.= " AND check_status < 2";
+			}
+			if($status == 2){
+				$where.= " AND check_status = 2";
+			}
+			if($status == 3){
+				$where.= " AND check_status > 2";
+			}
+			$where.= ' AND admin_id = '.$uid;
+			//关联抄送人
+			//$where.= " AND FIND_IN_SET('{$uid}',check_copy_uids)";
+			//关联审核人
+			//$where.= " AND (FIND_IN_SET('{$uid}',check_uids) or FIND_IN_SET('{$uid}',check_history_uids))";			
+			$list = $this->get_list($where,$param);
+            return table_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+	
+    public function checklist()
+    {
+         if (request()->isAjax()) {
+			$param = get_params();
+			$uid = $this->uid;
+			$status = isset($param['status']) ? $param['status'] : 0;
+			$where = "delete_time = 0";
+			if($status == 0){
+				$where.= " AND (FIND_IN_SET('{$uid}',check_uids) or FIND_IN_SET('{$uid}',check_history_uids))";	
+			}
+			if($status == 1){
+				$where.= " AND FIND_IN_SET('{$uid}',check_uids)";	
+			}
+			if($status == 2){
+				$where.= " AND FIND_IN_SET('{$uid}',check_history_uids)";	
+			}		
+			$list = $this->get_list($where,$param);
+            return table_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+
+	public function copylist()
+    {
+        if (request()->isAjax()) {
+			$param = get_params();
+			$status = isset($param['status']) ? $param['status'] : 0;
+			$uid = $this->uid;
+			$where = "delete_time = 0";
+			if($status == 1){
+				$where.= " AND check_status < 2";
+			}
+			if($status == 2){
+				$where.= " AND check_status = 2";
+			}
+			if($status == 3){
+				$where.= " AND check_status > 2";
+			}
+			//关联抄送人
+			$where.= " AND FIND_IN_SET('{$uid}', check_copy_uids) > 0";
+			$list = $this->get_list($where,$param);
+            return table_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+	
+	//全部审批
+    public function all()
+    {
+		$auth_approve = isAuth($this->uid,'office_admin','conf_1');
+        if (request()->isAjax()) {
+			if($auth_approve==0){
+				return to_assign(1, '无权限访问');
+			}
+			$param = get_params();
+			$status = isset($param['status']) ? $param['status'] : 0;
+			$uid = $this->uid;
+			$where = "delete_time = 0";
+			if($status == 1){
+				$where.= " AND check_status < 2";
+			}
+			if($status == 2){
+				$where.= " AND check_status = 2";
+			}
+			if($status == 3){
+				$where.= " AND check_status > 2";
+			}
+			if(!empty($param['uid'])){
+				$where.= ' AND admin_id = '.$param['uid'];
+			}
+			$list = $this->get_list($where,$param);
+            return table_assign(0, '', $list);
+        } else {
+			if($auth_approve==0){
+				throw new \think\exception\HttpException(405, '无权限访问');
+			}
+            return view();
+        }
+    }
+}
diff --git a/app/home/controller/Area.php b/app/home/controller/Area.php
new file mode 100644
index 0000000000000000000000000000000000000000..19434198ed5f0061455d0f89850a4496ba2ba69e
--- /dev/null
+++ b/app/home/controller/Area.php
@@ -0,0 +1,117 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\home\controller;
+
+use app\base\BaseController;
+use backup\Backup;
+use think\facade\Db;
+use think\facade\View;
+
+class Area extends BaseController
+{
+    //数据表列表
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+            $area = Db::name('Area')->select();
+			$list = generateTree($area);
+            return to_assign(0, '', $list);
+        }
+		else{
+			$db = new Backup();
+			$is_area = $db->check_table('area');
+			View::assign('is_area', $is_area);
+			return view();
+		}
+    }
+
+    //新增/编辑
+    public function add()
+    {
+		$param = get_params();
+		$id = isset($param['id']) ? $param['id'] : 0;
+		$pid = isset($param['pid']) ? $param['pid'] : 0;
+        if (request()->isAjax()) {
+			$param['level'] = 1;
+			if($pid > 0){
+				$level = Db::name('Area')->where('id', $pid)->value('level');
+				$param['level'] = $level+1;
+			}
+            if ($param['id'] > 0) {
+                Db::name('Area')->strict(false)->field(true)->update($param);
+                add_log('edit', $param['id'], $param);
+            } else {
+                $param['create_time'] = time();
+                $rid = Db::name('Area')->strict(false)->field(true)->insertGetId($param);
+            }
+            return to_assign();
+        } else {
+            if ($id > 0) {
+                $detail = Db::name('Area')->where('id', $id)->find();
+                $detail['pname'] = Db::name('Area')->where('id', $detail['pid'])->value('name');
+                View::assign('detail', $detail);
+            }
+			$pname='';
+			if($pid>0){
+				$pname = Db::name('Area')->where('id', $pid)->value('name');
+			}
+            View::assign('id', $id);
+            View::assign('pid', $pid);
+            View::assign('pname', $pname);
+            return view();
+        }
+    }
+
+    //设置
+    public function set()
+    {
+		if (request()->isPost()) {
+            $db = new Backup();
+			$is_area = $db->check_table('area');
+			if($is_area==0){
+				$oa_area = file_get_contents(CMS_ROOT . '/public/static/home/file/oa_area.sql');
+				$res = $db->run_sql($oa_area);
+				if($res){
+					add_log('import', 0, []);
+					return to_assign();
+				}
+				else{
+					return to_assign(1, '数据写入失败，请联系官方！');
+				}	
+			}
+        }
+        else if (request()->isDelete()) {
+            $params = get_params();
+			$log_type = 'recovery';
+			if($params['status']==0){
+				$count = Db::name('Area')->where(["pid" => $params['id']])->count();
+				if ($count > 0) {
+					return to_assign(1, "该记录下还有子记录，无法禁用");
+				}
+				$log_type = 'disable';
+			}
+			if (Db::name('Area')->where(["id" => $params['id']])->update(['status'=>$params['status']]) !== false) {
+				add_log($log_type, $params['id'], []);
+				return to_assign();
+			} else {
+				return to_assign(1, "操作失败");
+			}
+        } else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+
+}
diff --git a/app/home/controller/Cate.php b/app/home/controller/Cate.php
new file mode 100644
index 0000000000000000000000000000000000000000..3e1c76566296a0037df866e121425d9b9c458d68
--- /dev/null
+++ b/app/home/controller/Cate.php
@@ -0,0 +1,100 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\home\controller;
+
+use app\base\BaseController;
+use app\home\validate\EnterpriseCheck;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Cate extends BaseController
+{
+	
+    //企业主体
+	public function enterprise()
+    {
+        if (request()->isAjax()) {
+            $enterprise = Db::name('Enterprise')->order('create_time asc')->select();
+            return to_assign(0, '', $enterprise);
+        } else {
+            return view();
+        }
+    }
+    //企业主体新建编辑
+    public function enterprise_add()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(EnterpriseCheck::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['update_time'] = time();
+                $res = Db::name('Enterprise')->strict(false)->update($param);
+                if ($res) {
+                    add_log('edit', $param['id'], $param);
+                }
+                return to_assign();
+            } else {
+                try {
+                    validate(EnterpriseCheck::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['create_time'] = time();
+                $insertId = Db::name('Enterprise')->strict(false)->insertGetId($param);
+                if ($insertId) {
+                    add_log('add', $insertId, $param);
+                }
+                return to_assign();
+            }
+        }
+		else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+            if ($id > 0) {
+                $detail = Db::name('Enterprise')->where(['id' => $id])->find();
+                View::assign('detail', $detail);
+            }
+            View::assign('id', $id);
+			return view();
+		}
+    }
+	
+    //企业主体设置
+    public function enterprise_check()
+    {
+		$param = get_params();
+        $res = Db::name('Enterprise')->strict(false)->field('id,status')->update($param);
+		if ($res) {
+			if($param['status'] == 0){
+				add_log('disable', $param['id'], $param);
+			}
+			else if($param['status'] == 1){
+				add_log('recovery', $param['id'], $param);
+			}
+			return to_assign();
+		}
+		else{
+			return to_assign(0, '操作失败');
+		}
+    }	  
+   
+}
diff --git a/app/home/controller/Conf.php b/app/home/controller/Conf.php
new file mode 100644
index 0000000000000000000000000000000000000000..085f5e19da9ca10395f939f97fa2f15e47d3a9cd
--- /dev/null
+++ b/app/home/controller/Conf.php
@@ -0,0 +1,126 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\home\controller;
+
+use app\base\BaseController;
+use app\home\validate\ConfCheck;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Conf extends BaseController
+{
+    public function index()
+    {
+        if (request()->isAjax()) {
+            $param = get_params();
+            $where = array();
+            $where[] = ['status', '>=', 0];
+			$list = Db::name('Config')->where($where)->select();
+            return to_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+
+    //添加/编辑配置项
+    public function add()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+            try {
+                validate(ConfCheck::class)->check($param);
+            } catch (ValidateException $e) {
+                // 验证失败 输出错误信息
+                return to_assign(1, $e->getError());
+            }
+            if (!empty($param['id']) && $param['id'] > 0) {
+                $param['update_time'] = time();
+                $res = Db::name('config')->strict(false)->field(true)->update($param);
+                if ($res) {
+                    add_log('edit', $param['id'], $param);
+                }
+                return to_assign();
+            } else {
+                $param['create_time'] = time();
+                $insertId = Db::name('Config')->strict(false)->field(true)->insertGetId($param);
+                if ($insertId) {
+                    add_log('add', $insertId, $param);
+                }
+                return to_assign();
+            }
+        } else {
+            $id = isset($param['id']) ? $param['id'] : 0;
+            if ($id > 0) {
+                $config = Db::name('Config')->where(['id' => $id])->find();
+                View::assign('config', $config);
+            }
+            View::assign('id', $id);
+            return view();
+        }
+    }
+
+    //删除配置项
+    public function delete()
+    {
+        $id = get_params("id");
+        $data['status'] = '-1';
+        $data['id'] = $id;
+        $data['update_time'] = time();
+        if (Db::name('Config')->update($data) !== false) {
+            add_log('delete', $id, $data);
+            return to_assign(0, "删除成功");
+        } else {
+            return to_assign(1, "删除失败");
+        }
+    }
+
+    //编辑配置信息
+    public function edit()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+            $data['content'] = serialize($param);
+            $data['update_time'] = time();
+            $data['id'] = $param['id'];
+            $res = Db::name('Config')->strict(false)->field(true)->update($data);
+            $conf = Db::name('Config')->where('id', $param['id'])->find();
+            clear_cache('system_config' . $conf['name']);
+            if ($res) {
+                add_log('edit', $param['id'], $param);
+            }
+            return to_assign();
+        } else {
+            $id = isset($param['id']) ? $param['id'] : 0;
+            $conf = Db::name('Config')->where('id', $id)->find();
+            $module = strtolower(app('http')->getName());
+            $class = strtolower(app('request')->controller());
+            $action = strtolower(app('request')->action());
+            $template = $module . '/view/' . $class . '/' . $conf['name'] . '.html';
+            $config = [];
+            if ($conf['content']) {
+                $config = unserialize($conf['content']);
+            }
+            View::assign('id', $id);
+            View::assign('config', $config);
+            if (isTemplate($template)) {
+                return view($conf['name']);
+            } else {
+                return view('../../base/view/common/errortemplate', ['file' => $template]);
+            }
+        }
+    }
+}
diff --git a/app/home/controller/Dataauth.php b/app/home/controller/Dataauth.php
new file mode 100644
index 0000000000000000000000000000000000000000..c12670dd1cfea1f165332a2ebd4c67eaed55a699
--- /dev/null
+++ b/app/home/controller/Dataauth.php
@@ -0,0 +1,94 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\home\controller;
+
+use app\base\BaseController;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class dataauth extends BaseController
+{
+    public function index()
+    {
+        if (request()->isAjax()) {
+			$list = Db::name('DataAuth')->select();
+            return to_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+
+    //编辑配置信息
+    public function edit()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+            $param['update_time'] = time();
+            $res = Db::name('DataAuth')->strict(false)->field(true)->update($param);
+            if ($res) {
+                add_log('edit', $param['id'], $param);
+            }
+            return to_assign();
+        } else {
+            $id = isset($param['id']) ? $param['id'] : 0;
+            $detail = $this->auth_detail($id);
+            $module = strtolower(app('http')->getName());
+            $class = strtolower(app('request')->controller());
+            $action = strtolower(app('request')->action());
+            $template = $module . '/view/' . $class . '/' . $detail['name'] . '.html';
+            View::assign('detail', $detail);
+            if (isTemplate($template)) {
+                return view($detail['name']);
+            } else {
+                return view('../../base/view/common/errortemplate', ['file' => $template]);
+            }
+        }
+    }
+	
+	public function auth_detail($id)
+    {
+        $detail = Db::name('DataAuth')->where('id',$id)->find();
+		//	日常办公
+		if($detail['name'] =='office_admin'){			
+			$conf_1_str = Db::name('Admin')->where('id', 'in', $detail['conf_1'])->column('name');
+			$detail['conf_1_str'] = implode(',', $conf_1_str);
+		}
+		if($detail['name'] =='finance_admin'){
+			$conf_1_str = Db::name('Admin')->where('id', 'in', $detail['conf_1'])->column('name');
+            $detail['conf_1_str'] = implode(',', $conf_1_str);
+			$conf_2_str = Db::name('Admin')->where('id', 'in', $detail['conf_2'])->column('name');
+            $detail['conf_2_str'] = implode(',', $conf_2_str);
+			$conf_3_str = Db::name('Admin')->where('id', 'in', $detail['conf_3'])->column('name');
+            $detail['conf_3_str'] = implode(',', $conf_3_str);
+			$conf_4_str = Db::name('Admin')->where('id', 'in', $detail['conf_4'])->column('name');
+            $detail['conf_4_str'] = implode(',', $conf_4_str);
+		}
+		if($detail['name'] =='customer_admin'){
+			$conf_1_str = Db::name('Admin')->where('id', 'in', $detail['conf_1'])->column('name');
+            $detail['conf_1_str'] = implode(',', $conf_1_str);
+		}
+		if($detail['name'] =='contract_admin'){
+			$conf_1_str = Db::name('Admin')->where('id', 'in', $detail['conf_1'])->column('name');
+            $detail['conf_1_str'] = implode(',', $conf_1_str);
+		}
+		if($detail['name'] =='project_admin'){
+			$conf_1_str = Db::name('Admin')->where('id', 'in', $detail['conf_1'])->column('name');
+            $detail['conf_1_str'] = implode(',', $conf_1_str);
+		}
+		return $detail;
+    }
+}
diff --git a/app/home/controller/Database.php b/app/home/controller/Database.php
new file mode 100644
index 0000000000000000000000000000000000000000..cb0ccab4cf6b0c196700fd5b8d5db411cb4f5d0d
--- /dev/null
+++ b/app/home/controller/Database.php
@@ -0,0 +1,227 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\home\controller;
+
+use app\base\BaseController;
+use backup\Backup;
+use think\facade\Session;
+use think\facade\View;
+
+class Database extends BaseController
+{
+    //数据表列表
+    public function database()
+    {
+        if (request()->isAjax()) {
+            // 数据信息
+            $db = new Backup();
+            $list = $db->dataList();
+            // 计算总大小
+            $total = 0;
+            foreach ($list as $k => $v) {
+                $total += $v['data_length'];
+                $list[$k]['data_size'] = $v['data_length'];
+                $list[$k]['data_length'] = format_bytes($v['data_length']);
+            }
+            // 提示信息
+            $dataTips = '数据库中共有<strong> ' . count($list) . '</strong> 张表，共计 <strong>' . format_bytes($total) . '</strong>大小。';
+            $data['data'] = $list;
+            return table_assign(0, $dataTips, $data);
+        }
+        return view();
+    }
+
+    //备份数据
+    public function backup()
+    {
+        $db = new Backup();
+        if (request()->isPost()) {
+            $tables = get_params('tables');
+            $fileinfo = $db->getFile();
+            //检查是否有正在执行的任务
+            $lock = "{$fileinfo['filepath']}backup.lock";
+            if (is_file($lock)) {
+                return to_assign(2, '检测到有一个备份任务未完成');
+            } else {
+                //创建锁文件
+                file_put_contents($lock, time());
+            }
+            // 检查备份目录是否可写
+            if (!is_writeable($fileinfo['filepath'])) {
+                return to_assign(1, '备份目录不存在或不可写，请检查后重试');
+            }
+
+            //缓存锁文件
+            Session::set('lock', $lock);
+            //缓存备份文件信息
+            Session::set('backup_file', $fileinfo['file']);
+            //缓存要备份的表
+            Session::set('backup_tables', $tables);
+            //创建备份文件
+            if (false !== $db->Backup_Init()) {
+                return to_assign(0, '初始化成功，开始备份...', ['tab' => ['id' => 0, 'start' => 0, 'table' => $tables[0]]]);
+            } else {
+                return to_assign(1, '初始化失败，备份文件创建失败');
+            }
+        } else if (request()->isGet()) {
+            $tables = Session::get('backup_tables');
+            $file = Session::get('backup_file');
+            $id = get_params('id');
+            $start = get_params('start');
+            $start = $db->setFile($file)->backup($tables[$id], $start);
+            if (false === $start) {
+                return to_assign(1, '备份出错');
+            } else if (0 === $start) {
+                if (isset($tables[++$id])) {
+                    return to_assign(0, '备份完成', ['tab' => ['id' => $id, 'start' => 0, 'table' => $tables[$id - 1]]]);
+                } else { //备份完成，清空缓存
+                    unlink(Session::get('lock'));
+                    Session::delete('backup_tables');
+                    Session::delete('backup_file');
+                    add_log('bak');
+                    return to_assign(0, '备份完成', ['tab' => ['start' => 'ok', 'table' => $tables[$id - 1]]]);
+                }
+            }
+        } else {
+            return to_assign(1, '参数错误！');
+        }
+    }
+
+    //优化表
+    public function optimize($tables = null)
+    {
+        $db = new Backup();
+        //return to_assign(0, $db->optimize($tables));
+        if ($db->optimize($tables)) {
+            add_log('optimize');
+            return to_assign(0, '数据表优化完成');
+        } else {
+            return to_assign(1, '数据表优化出错请重试');
+        }
+    }
+
+    //修复表
+    public function repair($tables = null)
+    {
+        $db = new Backup();
+        //return to_assign(0, $db->repair($tables));
+        if ($db->repair($tables)) {
+            add_log('repair');
+            return to_assign(0, '数据表修复完成');
+        } else {
+            return to_assign(1, '数据表修复出错请重试');
+        }
+    }
+
+    //备份文件列表
+    public function backuplist()
+    {
+        $db = new Backup();
+        $list = $db->fileList();
+        $fileinfo = $db->getFile();
+        $lock = "{$fileinfo['filepath']}backup.lock";
+        $lock_time = 0;
+        if (is_file($lock)) {
+            $lock_time = file_get_contents($lock);
+        }
+        $listNew = [];
+        $indx = 0;
+        foreach ($list as $k => $v) {
+            $listNew[$indx]['time'] = $k;
+            $listNew[$indx]['timespan'] = $v['time'];
+            $listNew[$indx]['data'] = $v;
+            $indx++;
+        }
+        $list = $listNew;
+        array_multisort(array_column($list, 'time'), SORT_DESC, $list);
+        return view('', ['list' => $list, 'lock_time' => $lock_time]);
+    }
+
+    //数据还原
+    public function import($time = 0, $part = null, $start = null)
+    {
+        $db = new Backup();
+        $time = (int) $time;
+        if (is_numeric($time) && is_null($part) && is_null($start)) {
+            $list = $db->getFile('timeverif', $time);
+            if (is_array($list)) {
+                Session::set('backup_list', $list);
+                return to_assign(0, '初始化完成，开始还原...', array('part' => 1, 'start' => 0, 'time' => $time));
+            } else {
+                return to_assign(1, '备份文件可能已经损坏,请检查');
+            }
+        } else if (is_numeric($part) && is_numeric($start)) {
+            $list = Session::get('backup_list');
+            $part = (int) $part;
+            $start = (int) $start;
+            $start = $db->setFile($list)->import($start, $time, $part);
+            if (false === $start) {
+                return to_assign(1, '还原数据出错,请重试');
+            } elseif (0 === $start) {
+                if (isset($list[++$part])) {
+                    $data = array('part' => $part, 'start' => 0, 'time' => $time);
+                    return to_assign(0, "正在还原...卷{$part}，请勿关闭当前页面", $data);
+                } else {
+                    Session::delete('backup_list');
+                    return to_assign(0, '还原数据成功');
+                }
+            } else {
+                $data = array('part' => $part, 'start' => $start[0], 'time' => $time);
+                if ($start[1]) {
+                    $rate = floor(100 * ($start[0] / $start[1]));
+                    return to_assign(0, "正在还原...卷{$part} ({$rate}%)，请勿关闭当前页面", $data);
+                } else {
+                    $data['gz'] = 1;
+                    return to_assign(0, "正在还原...卷{$part}，请勿关闭当前页面", $data);
+                }
+                return to_assign(0, "正在还原...卷{$part}，请勿关闭当前页面");
+            }
+        } else {
+            return to_assign(1, "参数错误");
+        }
+    }
+    /**
+     * 删除备份文件
+     */
+    public function del($time = 0, $lock = 0)
+    {
+        $db = new Backup();
+        if ($lock == 1) {
+            $fileinfo = $db->getFile();
+            $lock = "{$fileinfo['filepath']}backup.lock";
+            if (is_file($lock)) {
+                $time = file_get_contents($lock);
+                unlink($lock);
+            }
+        }
+        if ($db->delFile((int) $time)) {
+            add_log('delete');
+            return to_assign(0, '删除成功');
+        } else {
+            return to_assign(0, '删除失败，请检查权限');
+        }
+    }
+    /**
+     * 下载备份文件
+     */
+    public function downfile($time = 0, $part = 0)
+    {
+        $db = new Backup();
+        add_log('down');
+        $db->downloadFile((int) $time, $part - 1);
+    }
+
+}
diff --git a/app/home/controller/Files.php b/app/home/controller/Files.php
new file mode 100644
index 0000000000000000000000000000000000000000..2e812d4d3b4764db63a9ebb3dea4960aa8b360f2
--- /dev/null
+++ b/app/home/controller/Files.php
@@ -0,0 +1,183 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\home\controller;
+
+use app\base\BaseController;
+use app\home\model\File;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Files extends BaseController
+{
+    public function index()
+    {
+        if (request()->isAjax()) {
+            $param = get_params();
+            $where = array();
+			$fileext = ['','jpg,jpeg,png,gif','mp4','doc,docx,xls,xlsx,ppt,pptx,txt,pdf','zip,rar,7z'];
+            if (!empty($param['keywords'])) {
+                $where[] = ['f.name|g.title', 'like', '%' . $param['keywords'] . '%'];
+            }
+            if (isset($param['group_id']) && $param['group_id']!='') {
+                $where[] = ['f.group_id','=',$param['group_id']];
+            }
+			if (!empty($param['tab'])) {
+                $where[] = ['f.fileext','in',$fileext[$param['tab']]];
+            }
+			$where[] = ['f.delete_time','=',0];
+            $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+            $list = DB::name('File')
+                ->field("f.*,a.name as admin_name,g.title as group_title")
+				->alias('f')
+				->join('Admin a', 'f.admin_id = a.id','left')
+				->join('FileGroup g', 'f.group_id = g.id','left')
+                ->order('f.create_time desc')
+                ->where($where)
+                ->paginate(['list_rows'=> $rows])
+				->each(function($item, $key){
+					$item['create_time'] = date('Y-m-d H:i:s', $item['create_time']);
+					return $item;
+				});
+            return table_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+	//编辑
+    public function edit()
+    {
+        if (request()->isAjax()) {
+            $param = get_params();
+            if (Db::name('File')->where('id',$param['id'])->update(['name'=>$param['title']]) !== false) {
+                add_log('edit', $param['id'], []);
+                return to_assign(0, "操作成功");
+            } else {
+                return to_assign(1, "操作失败");
+            }
+        }
+    }
+	
+	//移动
+    public function move()
+    {
+        if (request()->isAjax()) {
+            $group_id = get_params("group_id");
+            $ids = get_params("ids");
+			$idArray = explode(',', strval($ids));
+			$list = [];
+			foreach ($idArray as $key => $val) {
+				$list[] = [
+					'id' => $val,
+					'group_id' => $group_id,
+					'update_time' => time()
+				];
+			}
+			$res = (new File())->saveAll($list);
+            if ($res!== false) {
+                return to_assign(0, "操作成功");
+            } else {
+                return to_assign(1, "操作失败");
+            }
+        }
+    }
+    //删除
+    public function delete()
+    {
+        if (request()->isDelete()) {
+            $ids = get_params("ids");
+			$idArray = explode(',', strval($ids));
+			$list = [];
+			foreach ($idArray as $key => $val) {
+				$list[] = [
+					'id' => $val,
+					'delete_time' => time()
+				];
+			}
+			$res = (new File())->saveAll($list);
+            if ($res!== false) {
+                return to_assign(0, "删除成功");
+            } else {
+                return to_assign(1, "删除失败");
+            }
+        } else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+
+    //获取分组
+    public function get_group()
+    {
+		$list = Db::name('FileGroup')->where([['delete_time','=',0]])->select()->toArray();
+		return to_assign(0, '',$list);
+	}
+    //添加&编辑
+    public function add_group()
+    {
+        if (request()->isAjax()) {
+			$param = get_params();
+			if($param['title'] == '全部' || $param['title']=='未分组'){
+				return to_assign(1, '该分组名称已经存在');
+			}
+            if (!empty($param['id']) && $param['id'] > 0) {
+                $count = Db::name('FileGroup')->where([['id','<>',$param['id']],['delete_time','=',0],['title','=',$param['title']]])->count();
+                if ($count > 0) {
+                    return to_assign(1, '该分组名称已经存在');
+                }
+                $res = Db::name('FileGroup')->where(['id' => $param['id']])->strict(false)->field(true)->update($param);
+				if($res!=false){
+					add_log('edit', $param['id'], $param);
+					return to_assign(0,'编辑成功',$param['id']);
+				}else{
+					return to_assign(1,'操作失败');
+				}
+            } else {
+                $count = Db::name('FileGroup')->where([['delete_time','=',0],['title','=',$param['title']]])->count();
+                if ($count > 0) {
+                    return to_assign(1, '该分组名称已经存在');
+                }
+                $gid = Db::name('FileGroup')->strict(false)->field(true)->insertGetId($param);
+				if($gid!=false){
+					add_log('add', $gid, $param);
+					return to_assign(0,'添加成功',$gid);
+				}else{
+					return to_assign(1,'操作失败');
+				}                
+            }
+        }
+    }
+
+    //删除
+    public function del_group()
+    {
+        if (request()->isDelete()) {
+			$param = get_params();
+            $id = get_params("ids");
+            $count = Db::name('File')->where(["group_id" => $id])->count();
+            if ($count > 0) {
+                return to_assign(1, "该分组还存在文件，请去除文件或者转移文件后再删除");
+            }
+            if (Db::name('FileGroup')->delete($id) !== false) {
+                add_log('delete', $id, []);
+                return to_assign(0, "删除成功");
+            } else {
+                return to_assign(1, "删除失败");
+            }
+        } else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+}
diff --git a/app/home/controller/Index.php b/app/home/controller/Index.php
new file mode 100644
index 0000000000000000000000000000000000000000..1d0eed0d2a601184fed21c5276de8a88238b829b
--- /dev/null
+++ b/app/home/controller/Index.php
@@ -0,0 +1,456 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\home\controller;
+
+use app\base\BaseController;
+use app\home\model\AdminLog;
+use app\user\validate\AdminCheck;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Index extends BaseController
+{	
+    public function index()
+    {
+		$mobile = is_mobile();
+		if($mobile){
+			return redirect('/qiye/index/index');
+		}
+		$admin = Db::name('Admin')->where('id',$this->uid)->find();
+		if (get_cache('menu' . $this->uid)) {
+			$list = get_cache('menu' . $this->uid);
+		} else {
+			$adminGroup = Db::name('PositionGroup')->where(['pid' => $admin['position_id']])->column('group_id');
+			$adminMenu = Db::name('AdminGroup')->where('id', 'in', $adminGroup)->column('rules');
+			$adminMenus = [];
+			foreach ($adminMenu as $k => $v) {
+				$v = explode(',', $v);
+				$adminMenus = array_merge($adminMenus, $v);
+			}
+			$menu = Db::name('AdminRule')->where(['menu' => 1, 'status' => 1])->where('id', 'in', $adminMenus)->order('sort asc,id asc')->select()->toArray();
+			$list = list_to_tree($menu);
+			\think\facade\Cache::tag('adminMenu')->set('menu' . $this->uid, $list);
+		}
+		View::assign('menu', $list);
+		View::assign('admin',$admin);
+		View::assign('system',get_system_config('system'));
+		View::assign('web',get_system_config('web'));
+		return View();
+    }
+
+    public function main()
+    {
+        $install = false;
+        if (file_exists(CMS_ROOT . 'app/install')) {
+            $install = true;
+        }
+		$uid = $this->uid;
+		$dids = get_role_departments($uid);
+        $total = [];
+		
+		$whereFinance= array();
+		$whereFinanceOr = array();
+		$whereFinance[] = ['delete_time', '=', 0];
+		$whereFinance[] = ['check_status', '=', 2];
+		$whereFinancerOr[] =['admin_id', '=', $uid];	
+		if(!empty($dids)){
+			$whereFinancerOr[] =['did', 'in', $dids];
+		}	
+		
+        $total[] = array(
+            'name' => '报销总数',
+            'num' => Db::name('Expense')->where($whereFinance)
+				->where(function ($query) use($whereFinancerOr) {
+						$query->whereOr($whereFinancerOr);
+					})
+				->count()
+        );
+        $total[] = array(
+            'name' => '开票总数',
+            'num' => Db::name('Invoice')->where($whereFinance)
+				->where(function ($query) use($whereFinancerOr) {
+						$query->whereOr($whereFinancerOr);
+					})
+				->count()
+        );
+        $total[] = array(
+            'name' => '收票总数',
+            'num' => Db::name('Ticket')->where($whereFinance)
+				->where(function ($query) use($whereFinancerOr) {
+						$query->whereOr($whereFinancerOr);
+					})
+				->count()
+        );
+		
+		$whereHandle = [];
+		$whereHandle[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
+		$whereHandle[] = ['delete_time', '=', 0];
+		$handle=[];
+		
+        $handle[] = array(
+            'name' => '待审公文',
+            'num' =>  Db::name('OfficialDocs')->where($whereHandle)->count(),
+            'id' => 169,
+            'url' => '/adm/official/datalist',
+        );
+        $handle[] = array(
+            'name' => '待审用章',
+            'num' => Db::name('Seal')->where($whereHandle)->count(),
+            'id' => 176,
+            'url' => '/adm/seal/datalist',
+        );
+        $handle[] = array(
+            'name' => '待审销售合同',
+            'num' => Db::name('Contract')->where($whereHandle)->count(),
+            'id' => 319,
+            'url' => '/contract/contract/datalist',
+        );
+		$handle[] = array(
+            'name' => '待审采购合同',
+            'num' => Db::name('Purchase')->where($whereHandle)->count(),
+            'id' => 323,
+            'url' => '/contract/purchase/datalist',
+        );
+		$handle[] = array(
+            'name' => '待审报销',
+            'num' => Db::name('Expense')->where($whereHandle)->count(),
+            'id' => 218,
+            'url' => '/finance/expense/datalist',
+        );
+		$handle[] = array(
+            'name' => '待审发票',
+            'num' => Db::name('Invoice')->where($whereHandle)->where([['invoice_type','>',0]])->count(),
+            'id' => 222,
+            'url' => '/finance/invoice/datalist',
+        );
+		$handle[] = array(
+            'name' => '待审收票',
+            'num' => Db::name('ticket')->where($whereHandle)->where([['invoice_type','>',0]])->count(),
+            'id' => 226,
+            'url' => '/finance/ticket/datalist',
+        );
+		$handle[] = array(
+            'name' => '待完成任务',
+            'num' => Db::name('ProjectTask')->where([['director_uid', '=', $uid],['status', '<', 3],['delete_time', '=', 0]])->count(),
+            'id' => 348,
+            'url' => '/project/task/datalist',
+        );
+				
+		$whereCustomer = array();
+		$whereCustomerOr = array();
+		$whereCustomer[] = ['delete_time', '=', 0];
+		$whereCustomerOr[] =['belong_uid', '=', $uid];	
+		if(!empty($dids)){
+			$whereCustomerOr[] =['belong_did', 'in', $dids];
+		}			
+		$whereCustomerOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
+		
+		$customerCount = Db::name('Customer')->where($whereCustomer)
+		->where(function ($query) use($whereCustomerOr) {
+				$query->whereOr($whereCustomerOr);
+			})
+		->count();
+		$total[] = array(
+			'name' => '客户总数',
+			'num' => $customerCount,
+		);
+		
+		$whereContract = array();
+		$whereContractOr = array();		
+		$whereContract[] = ['delete_time', '=', 0];
+		$whereContractOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid];
+		$whereContractOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
+		$whereContractOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
+		$whereContractOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
+		if(!empty($dids)){
+			$whereContractOr[] =['did', 'in', $dids];
+		}
+		
+		$contractCount = Db::name('Contract')->where($whereContract)
+		->where(function ($query) use($whereContractOr) {
+				$query->whereOr($whereContractOr);
+			})
+		->count();
+		$total[] = array(
+			'name' => '销售合同',
+			'num' => $contractCount,
+		);
+		
+		$purchaseCount = Db::name('Purchase')->where($whereContract)
+		->where(function ($query) use($whereContractOr) {
+				$query->whereOr($whereContractOr);
+			})
+		->count();
+		$total[] = array(
+			'name' => '采购合同',
+			'num' => $purchaseCount,
+		);
+		
+		$project_ids = Db::name('ProjectUser')->where(['uid' => $uid, 'delete_time' => 0])->column('project_id');
+		$whereProject = [];
+		$whereProject[] = ['delete_time', '=', 0];
+		$whereProject[] = ['id', 'in', $project_ids];			
+		$projectCount = Db::name('Project')->where($whereProject)->count();
+		
+		$whereOr = array();
+		$map1 = [];
+		$map2 = [];
+		$map3 = [];
+		$map4 = [];
+		$map1[] = ['admin_id', '=', $uid];
+		$map2[] = ['director_uid', '=', $uid];
+		$map3[] = ['', 'exp', Db::raw("FIND_IN_SET({$uid},assist_admin_ids)")];
+		$map4[] = ['project_id', 'in', $project_ids];
+		
+		$whereOr =[$map1,$map2,$map3,$map4];
+		$taskCount = Db::name('ProjectTask')
+			->where(function ($query) use ($whereOr) {
+				if (!empty($whereOr))
+					$query->whereOr($whereOr);
+				})
+			->where([['delete_time', '=', 0]])->count();
+		
+		$total[] = array(
+			'name' => '项目总数',
+			'num' => $projectCount,
+		);
+		$total[] = array(
+			'name' => '任务总数',
+			'num' => $taskCount,
+		);
+		
+		$todue=[];
+		$delay_day = valueAuth('contract_admin','conf_10');
+		if(empty($delay_day)){
+			$delay_day = 30;
+		}
+		$delay_time = time()+$delay_day*60*60*24;
+		$mapContract = array();
+		$mapContractOr = array();		
+		$mapContract[] = ['delete_time', '=', 0];
+		$mapContract[] = ['check_status', '=', 2];
+		$mapContract[] = ['end_time','<',$delay_time];
+		$mapContractOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid];
+		$mapContractOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
+		if(!empty($dids)){
+			$mapContractOr[] =['did', 'in', $dids];
+		}
+		
+        $todue[] = array(
+            'name' => '快到期的销售合同',
+            'num' =>  Db::name('Contract')->where($mapContract)
+						->where(function ($query) use($mapContractOr) {
+							$query->whereOr($mapContractOr);
+						})->count(),
+            'id' => 319,
+            'url' => '/contract/contract/datalist',
+        );
+        $todue[] = array(
+            'name' => '快到期的采购合同',
+            'num' =>  Db::name('Purchase')->where($mapContract)
+						->where(function ($query) use($mapContractOr) {
+							$query->whereOr($mapContractOr);
+						})->count(),
+            'id' => 323,
+            'url' => '/contract/purchase/datalist',
+        );
+		$delay_day_b = valueAuth('project_admin','conf_10');
+		if(empty($delay_day_b)){
+			$delay_day_b = 3;
+		}
+		$delay_day_b_time = time()+$delay_day_b*60*60*24;
+		$todue[] = array(
+            'name' => '快到期的项目',
+            'num' =>  Db::name('Project')->where($whereProject)->where([['status','<',3],['end_time','<',$delay_day_b_time]])->count(),
+            'id' => 343,
+            'url' => '/project/index/datalist',
+        );
+        $todue[] = array(
+            'name' => '快到期的任务',
+            'num' =>  Db::name('ProjectTask')
+			->where(function ($query) use ($whereOr) {
+				if (!empty($whereOr))
+					$query->whereOr($whereOr);
+				})
+			->where([['delete_time', '=', 0],['status','<',3],['end_time','<',$delay_day_b_time]])->count(),
+            'id' => 348,
+            'url' => '/project/task/datalist',
+        );
+		
+		$position_id = Db::name('Admin')->where('id',$uid)->value('position_id');
+		$adminGroup = Db::name('PositionGroup')->where(['pid' => $position_id])->column('group_id');
+		$adminLayout = Db::name('AdminGroup')->where('id', 'in', $adminGroup)->column('layouts');
+		$adminLayouts = [];
+		foreach ($adminLayout as $k => $v) {
+			$v = explode(',', $v);
+			$adminLayouts = array_merge($adminLayouts, $v);
+		}
+		$layouts = get_config('layout');
+		$layout_selected = [];
+		foreach ($layouts as $key =>$vo) {
+			if (!empty($adminLayouts) and in_array($vo['id'], $adminLayouts)) {
+				$layout_selected[] = $vo;
+			}
+		}
+		View::assign('layout_selected',$layout_selected);
+        View::assign('total', $total);
+        View::assign('handle', $handle);
+        View::assign('todue', $todue);
+        View::assign('install', $install);
+        View::assign('TP_VERSION', \think\facade\App::version());
+        return View();
+    }
+	
+	//权限不足
+	public function role()
+    {
+		return View('../../base/view/common/roletemplate');
+	}
+	//通讯录
+	public function contacts_book()
+    {
+        if (request()->isAjax()) {
+            $param = get_params();
+            $where = array();
+            $whereOr = array();
+            if (!empty($param['keywords'])) {
+                $where[] = ['a.id|a.username|a.name|a.nickname|a.mobile|a.desc', 'like', '%' . $param['keywords'] . '%'];
+            }
+            if (!empty($param['did'])) {
+				$admin_array = Db::name('DepartmentAdmin')->where('department_id',$param['did'])->column('admin_id');
+				$map1=[
+					['a.id','in',$admin_array],
+				];
+				$map2=[
+					['a.did', '=', $param['did']],
+				];
+				$whereOr =[$map1,$map2];
+            }
+            $where[] = ['a.status', '=', 1];
+            $where[] = ['a.id', '>', 1];
+			$admin = \app\user\model\Admin::alias('a')
+				->with('departments')
+				->field('a.*,p.title as position,d.title as department')
+				->join('Department d', 'd.id = a.did','left')
+				->join('Position p', 'p.id = a.position_id','left')
+				->where($where)
+				->where(function ($query) use($whereOr) {
+					if (!empty($whereOr)){
+						$query->whereOr($whereOr);
+					}
+				})
+				->paginate(intval($this->pageSize))
+				->order('a.id desc')
+                ->each(function ($item, $key) {
+					//遍历次要部门数据
+					$departments = $item->departments->toArray();
+					if(empty($departments)){
+						$item->departments = '-';
+					}
+					else{
+						$item->departments = split_array_field($departments,'title');
+					}
+					if($item->is_hide ==1){
+						$item->mobile = hidetel($item->mobile);
+						$item->email = hidetel($item->email);
+					}
+                    $item->entry_time = empty($item->entry_time) ? '-' : date('Y-m-d', $item->entry_time);
+                });
+            return table_assign(0, '', $admin);
+        } else {
+            return view();
+        }
+    }
+	
+
+    //修改个人信息
+    public function edit_personal()
+    {
+		if (request()->isAjax()) {
+            $param = get_params();
+            $uid = $this->uid;
+            Db::name('Admin')->where(['id' => $uid])->strict(false)->field(true)->update($param);
+            return to_assign();
+        }
+		else{
+			View::assign('admin',get_admin($this->uid));
+			return view();
+		}
+    }
+
+    //修改密码
+    public function edit_password()
+    {
+		if (request()->isAjax()) {			
+			$param = get_params();			
+            try {
+                validate(AdminCheck::class)->scene('editPwd')->check($param);
+            } catch (ValidateException $e) {
+                // 验证失败 输出错误信息
+                return to_assign(1, $e->getError());
+            }
+            $uid = $this->uid;
+			
+			$admin = Db::name('Admin')->where(['id' => $uid])->find();
+			$old_psw = set_password($param['old_pwd'], $admin['salt']);
+			if ($admin['pwd'] != $old_psw) {
+				return to_assign(1, '旧密码错误');
+			}
+
+			$salt = set_salt(20);
+			$new_pwd = set_password($param['pwd'], $salt);
+			$data = [
+				'reg_pwd' => '',
+				'salt' => $salt,
+				'pwd' => $new_pwd,
+				'update_time' => time(),
+			];
+            Db::name('Admin')->where(['id' => $uid])->strict(false)->field(true)->update($data);
+            return to_assign();
+        }
+		else{
+			View::assign('admin',get_admin($this->uid));
+			return view();
+		}
+    }
+	
+    //系统操作日志
+    public function log_list()
+    {
+		if (request()->isAjax()) {
+			$param = get_params();
+			$log = new AdminLog();
+			$content = $log->get_log_list($param);
+			return table_assign(0, '', $content);
+		}else{
+			return view();
+		}
+    }
+	
+	//设置theme
+	public function set_theme()
+    {
+        if (request()->isAjax()) {
+            $param = get_params();
+			Db::name('Admin')->where('id',$this->uid)->update(['theme'=>$param['theme']]);
+            return to_assign();
+        }
+		else{
+			return to_assign(1,'操作错误');
+		}
+    }
+}
diff --git a/app/home/controller/Leaves.php b/app/home/controller/Leaves.php
new file mode 100644
index 0000000000000000000000000000000000000000..27321cb5bb0538e456ce11d0f7c792af1324712c
--- /dev/null
+++ b/app/home/controller/Leaves.php
@@ -0,0 +1,128 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\home\controller;
+
+use app\base\BaseController;
+use app\home\model\Leaves as LeavesModel;
+use app\home\validate\LeavesValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Leaves extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new LeavesModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			$where=[];
+			$where[]=['delete_time','=',0];
+            if (!empty($param['keywords'])) {
+                $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%'];
+            }
+            $list = $this->model->datalist($where, $param);
+            return table_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			if(!empty($param['start_date'])){
+				$param['start_date'] = strtotime($param['start_date']);
+			}
+			if(!empty($param['end_date'])){
+				$param['end_date'] = strtotime($param['end_date']);
+				if($param['end_date']<$param['start_date']){
+					return to_assign(1, '结束时间不能小于开始时间');
+				}
+			}
+            if (!empty($param['id']) && $param['id'] > 0) {
+				$this->model->edit($param);
+            }
+			else {
+				$param['admin_id'] = $this->uid;
+				$param['did'] = $this->did;
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				View::assign('detail', $detail);
+			}
+			if(is_mobile()){
+				return view('qiye@/approve/add_qingjia');
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			$detail['types_name'] = leaves_types_name($detail['types']);
+			View::assign('create_user', get_admin($detail['admin_id']));
+			View::assign('detail', $detail);
+			if(is_mobile()){
+				return view('qiye@/approve/view_qingjia');
+			}
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		$param = get_params();
+		$id = $param['id'];
+		if (request()->isDelete()) {
+			$this->model->delById($id);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }   
+
+}
diff --git a/app/home/controller/Log.php b/app/home/controller/Log.php
new file mode 100644
index 0000000000000000000000000000000000000000..51112f97b51be379a8b3dbe732b411799448628a
--- /dev/null
+++ b/app/home/controller/Log.php
@@ -0,0 +1,70 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\home\controller;
+
+use app\base\BaseController;
+use think\facade\Db;
+use think\facade\View;
+
+class Log extends BaseController
+{
+    //管理员操作日志
+    public function index()
+    {
+        if (request()->isAjax()) {
+            $param = get_params();
+            $where = array();
+            if (!empty($param['keywords'])) {
+                $where[] = ['u.name|a.param_id|a.uid', 'like', '%' . $param['keywords'] . '%'];
+            }
+            if (!empty($param['action'])) {
+                $where[] = ['a.action','=',$param['action']];
+            }
+            $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+            $list = DB::name('AdminLog')
+                ->field("a.*,u.name")
+				->alias('a')
+				->join('Admin u', 'a.uid = u.id')
+                ->order('a.create_time desc')
+                ->where($where)
+                ->paginate(['list_rows'=> $rows])
+				->each(function($item, $key){
+					$item['content'] = $item['name']. $item['action'] . '了' . $item['subject'];
+					$item['create_time'] = date('Y-m-d H:i:s', $item['create_time']);
+					$param_array = json_decode($item['param'], true);
+					if(is_array($param_array)){
+						$param_value = [];
+						foreach ($param_array as $key => $value) {
+							if (is_array($value)) {
+								$value = implode(',', $value);
+							}
+							$param_value[] = $key . ':' . $value;
+						}
+						$item['param'] = implode(' & ',$param_value);
+					}
+					else{
+						$item['param'] = $param_array;
+					}
+					return $item;
+				});
+            return table_assign(0, '', $list);
+        } else {
+			$type_action = get_config('log.type_action');
+			View::assign('type_action', $type_action);
+            return view();
+        }
+    }
+}
diff --git a/app/home/controller/Login.php b/app/home/controller/Login.php
new file mode 100644
index 0000000000000000000000000000000000000000..460c4a17ef72568884c6314eb040559c338872d4
--- /dev/null
+++ b/app/home/controller/Login.php
@@ -0,0 +1,123 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\home\controller;
+
+use app\home\validate\UserCheck;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\Session;
+
+class Login
+{
+    //登录
+    public function index()
+    {
+		$wxwork = is_wxwork();
+		$mobile = is_mobile();
+		if($wxwork){
+			return redirect('/qiye/login/login');
+		}
+		if($mobile){
+			return redirect('/qiye/login/index');
+		}
+        return View();
+    }
+    //提交登录
+    public function login_submit()
+    {
+        $param = get_params();
+        try {
+            validate(UserCheck::class)->check($param);
+        } catch (ValidateException $e) {
+            // 验证失败 输出错误信息
+            return to_assign(1, $e->getError());
+        }
+
+        $admin = Db::name('Admin')->where(['username' => $param['username']])->find();
+        if (empty($admin)) {
+            $admin = Db::name('Admin')->where(['mobile' => $param['username']])->find();
+            if (empty($admin)) {
+                return to_assign(1, '用户名或手机号码错误');
+            }
+        }
+        $param['pwd'] = set_password($param['password'], $admin['salt']);
+        if ($admin['pwd'] !== $param['pwd']) {
+            return to_assign(1, '用户或密码错误');
+        }
+        if ($admin['status'] != 1) {
+            return to_assign(1, '该用户禁止登录,请与管理者联系');
+        }
+        $data = [
+			'is_lock' => 0,
+            'last_login_time' => time(),
+            'last_login_ip' => request()->ip(),
+            'login_num' => $admin['login_num'] + 1,
+        ];
+        Db::name('admin')->where(['id' => $admin['id']])->update($data);
+        $session_admin = get_config('app.session_admin');
+        Session::set($session_admin, $admin['id']);
+        $token = make_token();
+        set_cache($token, $admin, 7200);
+        $admin['token'] = $token;
+		$logdata = [
+			'uid' => $admin['id'],
+            'type' => 'login',
+            'action' => '登录',
+            'subject' => '系统',
+			'param_id'=>$admin['id'],
+			'param'=>'[]',
+            'ip' => request()->ip(),
+			'create_time' => time()
+        ];
+		Db::name('AdminLog')->strict(false)->field(true)->insert($logdata);
+        return to_assign(0, '登录成功', ['uid' => $admin['id']]);
+    }
+
+    //退出登录
+    public function login_out()
+    {
+        $session_admin = get_config('app.session_admin');
+        Session::delete($session_admin);
+        return to_assign(0, "退出成功");
+    }
+
+	//锁屏
+    public function lock()
+    {
+		$session_admin = get_config('app.session_admin');
+		$admin_id= Session::get($session_admin);
+		$admin = Db::name('admin')->where(['id' => $admin_id])->find();
+		if (request()->isAjax()) {
+			$param = get_params();
+			if($param['lock_password'] == ''){
+				return to_assign(1, '请输入登录密码解锁');
+			}			
+			if(empty($admin)){
+				return to_assign(2, '登录超时，请重新登录');
+			}
+			$pwd = set_password($param['lock_password'], $admin['salt']);
+			if ($admin['pwd'] !== $pwd) {
+				return to_assign(1, '密码错误');
+			}
+			else{
+				Db::name('admin')->where('id',$admin['id'])->update(['is_lock'=>0]);
+				return to_assign(0, '解锁成功', ['uid' => $admin['id']]);
+			}
+        }
+		Db::name('admin')->where('id',$admin['id'])->update(['is_lock'=>1]);
+        return View();
+    }
+}
diff --git a/app/home/controller/Message.php b/app/home/controller/Message.php
new file mode 100644
index 0000000000000000000000000000000000000000..0295f1fa1496c519a04b56c2316d1ef17df8222f
--- /dev/null
+++ b/app/home/controller/Message.php
@@ -0,0 +1,552 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\home\controller;
+
+use app\base\BaseController;
+use app\home\model\Message as MessageList;
+use app\home\model\Msg as MsgList;
+use think\facade\Db;
+use think\facade\View;
+
+class Message extends BaseController
+{	
+	/**
+     * 构造函数
+     */
+	protected $model;
+	protected $model2;
+	public function __construct() {
+        parent::__construct(); // 调用父类构造函数
+        $this->model = new MessageList();
+        $this->model2 = new MsgList();
+    }
+    //收件箱
+    public function inbox()
+    {
+        if (request()->isAjax()) {
+            $param = get_params();
+            $where = [];
+			$where[] = ['to_uid', '=', $this->uid];
+			$where[] = ['delete_time', '=', 0];
+            if (!empty($param['keywords'])) {
+                $where[] = ['title', 'like', '%' . $param['keywords'] . '%'];
+            }
+            if (!empty($param['read'])) {
+				if($param['read']==1){
+					$where[] = ['read_time', '=', 0];
+				}else{
+					$where[] = ['read_time', '>', 0];
+				}                
+            }
+			if (!empty($param['types'])) {
+				if($param['types']==1){
+					$where[] = ['from_uid', '=', 0];
+				}else{
+					$where[] = ['from_uid', '>', 0];
+				}                
+            }
+            //按发送时间检索
+			if (!empty($param['range_time'])) {
+				$range_time =explode('~', $param['range_time']);
+				$where[] = ['send_time', 'between',[strtotime(urldecode($range_time[0])),strtotime(urldecode($range_time[1]))]];
+			}			
+            $list = $this->model2->datalist($where,$param);
+            return table_assign(0, '', $list);
+        } else {
+			$a = MessageList::where([['from_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
+			$b = MsgList::where([['to_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
+			$count = [
+				'sendbox' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 1],['delete_time', '=', 0]])->count(),
+				'inbox'   => MsgList::where([['to_uid', '=', $this->uid],['delete_time', '=', 0]])->count(),
+				'star'   => MsgList::where([['to_uid', '=', $this->uid],['is_star','=',1],['delete_time', '=', 0]])->count(),
+				'draft'   => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 2],['delete_time', '=', 0]])->count(),
+				'rubbish' => $a+$b
+			];
+			View::assign('count', $count);
+			View::assign('action', $this->action);
+            return view();
+        }
+    }
+	
+    //星标信息
+    public function star()
+    {
+        if (request()->isAjax()) {
+            $param = get_params();
+            $where = [];
+			$where[] = ['to_uid', '=', $this->uid];
+			$where[] = ['delete_time', '=', 0];
+			$where[] = ['is_star', '=', 1];
+            if (!empty($param['keywords'])) {
+                $where[] = ['title', 'like', '%' . $param['keywords'] . '%'];
+            }
+            if (!empty($param['read'])) {
+				if($param['read']==1){
+					$where[] = ['read_time', '=', 0];
+				}else{
+					$where[] = ['read_time', '>', 0];
+				}                
+            }
+			if (!empty($param['types'])) {
+				if($param['types']==1){
+					$where[] = ['from_uid', '=', 0];
+				}else{
+					$where[] = ['from_uid', '>', 0];
+				}                
+            }
+            //按发送时间检索
+			if (!empty($param['range_time'])) {
+				$range_time =explode('~', $param['range_time']);
+				$where[] = ['send_time', 'between',[strtotime(urldecode($range_time[0])),strtotime(urldecode($range_time[1]))]];
+			}			
+            $list = $this->model2->datalist($where,$param);
+            return table_assign(0, '', $list);
+        } else {
+			$a = MessageList::where([['from_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
+			$b = MsgList::where([['to_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
+			$count = [
+				'sendbox' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 1],['delete_time', '=', 0]])->count(),
+				'inbox'   => MsgList::where([['to_uid', '=', $this->uid],['delete_time', '=', 0]])->count(),
+				'star'   => MsgList::where([['to_uid', '=', $this->uid],['is_star','=',1],['delete_time', '=', 0]])->count(),
+				'draft'   => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 2],['delete_time', '=', 0]])->count(),
+				'rubbish' => $a+$b
+			];
+			View::assign('count', $count);
+			View::assign('action', $this->action);
+            return view();
+        }
+    }
+	
+    //发件箱
+    public function sendbox()
+    {
+        if (request()->isAjax()) {
+            $param = get_params();
+            $where = [];
+            if (!empty($param['keywords'])) {
+                $map[] = ['title', 'like', '%' . $param['keywords'] . '%'];
+            }
+            $where[] = ['from_uid', '=', $this->uid];
+            $where[] = ['is_draft', '=', 1];
+            $where[] = ['delete_time', '=', 0];
+            //按发送时间检索
+			if (!empty($param['range_time'])) {
+				$range_time =explode('~', $param['range_time']);
+				$where[] = ['send_time', 'between',[strtotime(urldecode($range_time[0])),strtotime(urldecode($range_time[1]))]];
+			}			
+            $list = $this->model->datalist($where,$param);
+            return table_assign(0, '', $list);
+        } else {
+			$a = MessageList::where([['from_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
+			$b = MsgList::where([['to_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
+			$count = [
+				'sendbox' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 1],['delete_time', '=', 0]])->count(),
+				'inbox'   => MsgList::where([['to_uid', '=', $this->uid],['delete_time', '=', 0]])->count(),
+				'star'   => MsgList::where([['to_uid', '=', $this->uid],['is_star','=',1],['delete_time', '=', 0]])->count(),
+				'draft'   => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 2],['delete_time', '=', 0]])->count(),
+				'rubbish' => $a+$b
+			];
+			View::assign('count', $count);
+			View::assign('action', $this->action);
+            return view();
+        }
+    }
+
+    //草稿箱
+    public function draft()
+    {
+        if (request()->isAjax()) {
+            $param = get_params();
+            $where = [];
+            if (!empty($param['keywords'])) {
+                $map[] = ['title', 'like', '%' . $param['keywords'] . '%'];
+            }
+            $where[] = ['from_uid', '=', $this->uid];
+            $where[] = ['is_draft', '=', 2];
+            $where[] = ['delete_time', '=', 0];
+            //按发送时间检索
+			if (!empty($param['range_time'])) {
+				$range_time =explode('~', $param['range_time']);
+				$where[] = ['send_time', 'between',[strtotime(urldecode($range_time[0])),strtotime(urldecode($range_time[1]))]];
+			}			
+            $list = $this->model->datalist($where,$param);
+            return table_assign(0, '', $list);
+        } else {
+			$a = MessageList::where([['from_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
+			$b = MsgList::where([['to_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
+			$count = [
+				'sendbox' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 1],['delete_time', '=', 0]])->count(),
+				'inbox'   => MsgList::where([['to_uid', '=', $this->uid],['delete_time', '=', 0]])->count(),
+				'star'   => MsgList::where([['to_uid', '=', $this->uid],['is_star','=',1],['delete_time', '=', 0]])->count(),
+				'draft'   => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 2],['delete_time', '=', 0]])->count(),
+				'rubbish' => $a+$b
+			];
+			View::assign('count', $count);
+			View::assign('action', $this->action);
+            return view();
+        }
+    }
+
+    //垃圾箱
+    public function rubbish()
+    {
+        if (request()->isAjax()) {
+			$param = get_params();
+			$uid = $this->uid;
+			$where = "delete_time > 0";
+			$where.= " AND clear_time = 0";
+            if (!empty($param['keywords'])) {
+				$where.= " AND title like '%" . $param['keywords'] . "%'";
+            }
+			$sqlParts = [];
+			$sqlCounts = [];
+			$tables=['message','msg'];
+			$prefix = get_config('database.connections.mysql.prefix');
+			foreach ($tables as $table) {
+				$tableName = $prefix.$table;
+				if($table=='message'){
+					$wherea= $where.' AND from_uid = '.$uid;
+					// 假设每个表都有相同的列结构，这里只是简单示例
+					$sqlPart = "SELECT id,title,from_uid,send_time,'{$table}' as table_name FROM {$tableName} WHERE {$wherea}";
+					$sqlCount = "SELECT COUNT(*) AS count FROM {$tableName} WHERE {$wherea}";
+				}
+				else{
+					$whereb= $where.' AND to_uid = '.$uid;
+					$sqlPart = "SELECT id,title,from_uid,create_time as send_time,'{$table}' as table_name FROM {$tableName} WHERE {$whereb}";
+					$sqlCount = "SELECT COUNT(*) AS count FROM {$tableName} WHERE {$whereb}";
+				}			
+				
+				// 查询数据库中是否存在该数据表
+				$is_table = Db::query("SHOW TABLES LIKE '{$tableName}'");
+				// 判断查询结果
+				if (!empty($is_table)) {
+					$sqlParts[] = $sqlPart;
+					$sqlCounts[] = $sqlCount;
+				}
+			}
+			// 使用implode将各个部分用UNION ALL连接起来
+			$unionSql = implode(" UNION ALL ", $sqlParts);
+			
+			$totalCount = 0;
+			foreach ($sqlCounts as $sql) {
+				$count = Db::query($sql)[0]['count']; // 假设每个查询都返回了一个包含'count'键的数组
+				$totalCount += $count;
+			}
+			// 添加排序和分页逻辑
+			// 假设每页显示10条记录，当前页码为$page（需要预先定义或获取）
+			$pageSize = $param['limit'];
+			$page = 1; // 示例页码
+			$offset = ($page - 1) * $pageSize;
+
+			// 注意：不同的数据库分页语法可能有所不同，这里以MySQL为例
+			$finalSql = $unionSql . " ORDER BY send_time DESC LIMIT {$offset}, {$pageSize}";
+
+			// 执行查询
+			$result = Db::query($finalSql);
+			// 处理结果
+			foreach ($result as &$row) {
+				// 处理每一行数据
+				$row['types'] = 0;
+				$row['sourse'] = '发件箱';
+				if($row['send_time'] == 0){
+					$row['sourse'] = '草稿箱';
+					$row['types'] = 1;
+					$row['send_time'] = '-';
+				}
+				else{
+					if($row['table_name'] == 'msg'){
+						$row['sourse'] = '收件箱';
+						$row['types'] = 2;
+					}
+					$row['send_time'] = date('Y-m-d H:i:s',$row['send_time']);
+				}
+				if(!empty($row['from_uid'])){
+					$row['from_name'] = Db::name('Admin')->where('id','=',$row['from_uid'])->value('name');
+				}
+				else{
+					$row['from_name']='-';
+				}
+			}
+			$list=array(
+				'data'=>$result,
+				'total'=>$totalCount
+			);
+            return table_assign(0, '', $list);
+        } else {
+			$a = MessageList::where([['from_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
+			$b = MsgList::where([['to_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count();
+			$count = [
+				'sendbox' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 1],['delete_time', '=', 0]])->count(),
+				'inbox'   => MsgList::where([['to_uid', '=', $this->uid],['delete_time', '=', 0]])->count(),
+				'star'   => MsgList::where([['to_uid', '=', $this->uid],['is_star','=',1],['delete_time', '=', 0]])->count(),
+				'draft'   => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 2],['delete_time', '=', 0]])->count(),
+				'rubbish' => $a+$b
+			];
+			View::assign('count', $count);
+			View::assign('action', $this->action);
+			return view();
+        }
+    }
+
+    //新增&编辑信息
+    public function add()
+    {
+        $param = get_params();
+		$id = isset($param['id']) ? $param['id'] : 0;
+		$msg_id = 0;
+        if ($id > 0) {
+			$detail = $this->model->detail($id);
+            if (empty($detail)) {
+				throw new \think\exception\HttpException(404, '找不到记录');
+            }
+			if ($detail['from_uid'] != $this->uid) {
+				throw new \think\exception\HttpException(406, '无权限编辑');
+			}
+			if($detail['msg_id']>0){
+				 $msg_id = $detail['msg_id'];
+			}
+            View::assign('detail', $detail);
+        }
+        View::assign('id', $id);
+        View::assign('msg_id', $msg_id);
+        return view();
+    }
+	
+    //查看发件箱、草稿箱消息
+    public function view($id)
+    {
+		$detail = $this->model->detail($id);
+		if (empty($detail)) {
+			throw new \think\exception\HttpException(404, '找不到记录');
+		}
+		if ($detail['from_uid'] != $this->uid) {
+			throw new \think\exception\HttpException(406, '无权限查看');
+		}
+		//已读回执
+		if($detail['send_time']>0){	
+			$read_user_ids= msgList::where([['message_id','=',$id],['read_time','>',0]])->column('to_uid');
+			$read_users = Db::name('Admin')->where('status', 1)->where('id', 'in', $read_user_ids)->column('name');
+			$detail['read_user_names'] = implode(',',$read_users);
+		}
+		View::assign('detail', $detail);
+        return view();
+    }
+	
+	//删除发件、草稿
+    public function del()
+    {
+        $param = get_params();
+        $ids = empty($param['ids']) ? 0 : $param['ids'];
+        $idArray = explode(',', $ids);
+        foreach ($idArray as $key => $val) {
+			MessageList::update(['id' => $val,'delete_time' => time()]);
+			add_log('delete', $val,[],'消息');
+        }
+        return to_assign(0, '操作成功');
+    }
+
+    //保存消息
+    public function save()
+    {
+        $param = get_params();
+        $id = empty($param['id']) ? 0 : $param['id'];
+        //接受人类型判断
+        if ($param['types'] == 1 && empty($param['uids'])) {
+			return to_assign(1, '收件人员不能为空');
+        }
+		if ($param['types'] == 2 && empty($param['dids'])) {
+			return to_assign(1, '收件部门不能为空'); 
+        }
+		if ($param['types'] == 3 && empty($param['pids'])) {
+           return to_assign(1, '收件岗位不能为空');
+        }
+		if ($param['types'] == 4) {
+			$param['uids'] = '';
+			$param['dids'] = '';
+			$param['pids'] = '';
+			$param['copy_uids'] = '';
+        }
+		$res = false;
+        if ($id > 0) {
+            //编辑信息的情况
+            $param['update_time'] = time();
+            $res = MessageList::strict(false)->field(true)->update($param);
+        } else {
+            //新增信息的情况
+            $param['create_time'] = time();
+			$param['update_time'] = time();
+            $param['from_uid'] = $this->uid;
+            $res = MessageList::strict(false)->field(true)->insertGetId($param);
+        }
+        if ($res !== false) {
+            if ($id > 0) {
+                $mid = $id;
+            } else {
+                $mid = $res;
+            }
+            add_log('save',$mid,$param,'消息');
+			if($param['is_draft'] == 1){
+				$res = $this->model->send($mid);
+				if ($res!==false) {
+					return to_assign(0, '发送成功');
+				} else {
+					return to_assign(1, '发送失败');
+				}
+			}
+			else{
+				return to_assign(0, '保存成功', $mid);
+			}
+        } else {
+            return to_assign(1, '操作失败');
+        }
+    }
+	
+    //发送消息
+    public function send_message($id)
+    {
+        //查询要发的消息
+        $msg = MessageList::where(['id' => $id])->find();
+        if (!empty($msg)) {
+            $res = $this->model->send($id);
+            if ($res!==false) {
+                return to_assign(0, '发送成功');
+            } else {
+                return to_assign(1, '发送失败');
+            }
+        } else {
+            return to_assign(1, '发送失败，找不到要发送的内容');
+        }
+    }
+	
+
+    //查看收件箱消息
+    public function read($id )
+    {
+        $detail = $this->model2->detail($id);
+        if (empty($detail)) {
+            throw new \think\exception\HttpException(406, '找不到记录');
+        }
+        if ($detail['to_uid'] != $this->uid) {
+            throw new \think\exception\HttpException(406, '找不到记录');
+        }
+        MsgList::where(['id' => $id])->update(['read_time' => time()]);
+		if($detail['message_id']>0){
+			 View::assign('message', $this->model->detail($detail['message_id']));
+		}
+		$detail['from_uname'] = Db::name('Admin')->where('id', $detail['from_uid'])->value('name');
+        View::assign('detail', $detail);
+        return view();
+    }
+	
+	
+    //回复信息
+    public function reply()
+    {
+        $param = get_params();
+		$msg_id = isset($param['msg_id']) ? $param['msg_id'] : 0;
+		$detail = $this->model2->detail($msg_id);
+		if (empty($detail)) {
+			throw new \think\exception\HttpException(404, '找不到记录');
+		}
+		if ($detail['to_uid'] != $this->uid) {
+			throw new \think\exception\HttpException(406, '无权限回复');
+		}
+        $detail['from_name'] =  Db::name('Admin')->where('id', $detail['from_uid'])->value('name');
+		View::assign('detail', $detail);
+        return view();
+    }
+	
+    //转发信息
+    public function resend()
+    {
+        $param = get_params();
+		$msg_id = isset($param['msg_id']) ? $param['msg_id'] : 0;
+		$detail = $this->model2->detail($msg_id);
+		if (empty($detail)) {
+			throw new \think\exception\HttpException(404, '找不到记录');
+		}
+		if ($detail['to_uid'] != $this->uid) {
+			throw new \think\exception\HttpException(406, '无权限回复');
+		}
+        $detail['from_name'] =  Db::name('Admin')->where('id', $detail['from_uid'])->value('name');
+		View::assign('detail', $detail);
+        return view();
+    }
+
+    //状态修改
+    public function check()
+    {
+        $param = get_params();
+        $type = empty($param['type']) ? 0 : $param['type'];
+        $ids = empty($param['ids']) ? 0 : $param['ids'];
+        $idArray = explode(',', $ids);
+        foreach ($idArray as $key => $val) {
+            if ($type==1) { //设置信息为已读
+				MsgList::update(['id' => $val,'read_time' => time()]);
+				add_log('view', $val,[],'消息');
+            }
+            else if ($type==2) {  //信息进入垃圾箱
+				MsgList::update(['id' => $val,'delete_time' => time()]);
+				add_log('delete', $val,[],'消息');
+            }
+            else if ($type==3) {  //信息从垃圾箱恢复
+				MsgList::update(['id' => $val,'delete_time' => 0]);
+				add_log('recovery', $val,[],'消息');
+            }
+            else if ($type==4) {  //信息彻底删除
+				MsgList::update(['id' => $val,'clear_time' => time()]);
+				add_log('clear', $val,[],'消息');
+            }
+			else if ($type==5) {  //星标信息
+				MsgList::update(['id' => $val,'is_star' => 1]);
+				add_log('star', $val,[],'消息');
+            }
+			else if ($type==6) {  //取消星标信息
+				MsgList::update(['id' => $val,'is_star' => 0]);
+				add_log('unstar', $val,[],'消息');
+            }
+        }
+        return to_assign(0, '操作成功');
+    }
+	
+    //还原消息
+    public function recovery()
+    {
+        $param = get_params();
+        $table = empty($param['table']) ? '' : $param['table'];
+        $ids = empty($param['ids']) ? 0 : $param['ids'];
+        $idArray = explode(',', $ids);
+        foreach ($idArray as $key => $val) {
+			Db::name($table)->update(['id' => $val,'delete_time' => 0]);
+			add_log('recovery', $val,[],'消息');
+        }
+        return to_assign(0, '操作成功');
+    }
+	//清除消息
+    public function clear()
+    {
+        $param = get_params();
+        $table = empty($param['table']) ? '' : $param['table'];
+        $ids = empty($param['ids']) ? 0 : $param['ids'];
+        $idArray = explode(',', $ids);
+        foreach ($idArray as $key => $val) {
+			Db::name($table)->update(['id' => $val,'clear_time' => time()]);
+			add_log('clear', $val,[],'消息');
+        }
+        return to_assign(0, '操作成功');
+    }
+
+}
diff --git a/app/home/controller/Module.php b/app/home/controller/Module.php
new file mode 100644
index 0000000000000000000000000000000000000000..f047e64b1c77802a7d59c089675b8f1caf548779
--- /dev/null
+++ b/app/home/controller/Module.php
@@ -0,0 +1,276 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\home\controller;
+
+use app\base\BaseController;
+use app\home\validate\ModuleCheck;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Module extends BaseController
+{
+    public function index()
+    {
+        if (request()->isAjax()) {
+            $module = Db::name('AdminModule')->select();
+            return to_assign(0, '', $module);
+        } else {
+			$sys_module = Db::name('AdminModule')->select()->toArray();
+			View::assign('sys_module', $sys_module);
+            return view();
+        }
+    }
+	
+	//新增/编辑模块
+    public function add()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			if($this->uid!=1){
+				return to_assign(1,'只有系统超级管理员才有权限新增或编辑模块！');
+			}
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(ModuleCheck::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                Db::name('AdminModule')->where(['id' => $param['id']])->strict(false)->field(true)->update($param);
+                add_log('edit', $param['id'], $param);
+            } else {
+                try {
+                    validate(ModuleCheck::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $mid = Db::name('AdminModule')->strict(false)->field(true)->insertGetId($param);
+                add_log('add', $mid, $param);
+            }
+			return to_assign();
+        } else {
+			$id = isset($param['id']) ? $param['id'] : 0;
+			$module=[];
+			if ($id > 0) {
+                $module = Db::name('AdminModule')->where(['id' => $id])->find();
+            }
+			View::assign('id', $id);
+			View::assign('module', $module);
+            return view();
+        }
+    }
+	
+	//安装模块
+    public function install()
+    {
+		if($this->uid!=1){
+			return to_assign(1,'只有系统超级管理员才有权限安装模块！');
+		}
+        $param = get_params();
+		$name = $param['name'];
+		$data = curl_post('https://www.gougucms.com/home/get_module/module',['name'=>$name]);
+		$json_data = json_decode($data, true);
+		if($json_data['code'] == 1){
+			return to_assign(1,$json_data['msg']);
+		}
+		$detail = $json_data['data'];
+		$rule = unserialize($detail['rule']);
+		if(empty($rule)){
+			return to_assign(1,'找不到该模块的信息');
+		}
+		$prefix = get_config('database.connections.mysql.prefix');
+		
+		$insert = [];
+		$insert['title'] = $detail['title'];
+		$insert['name'] = $detail['name'];
+		$insert['type'] = $detail['type'];
+		$insert['sourse'] = $detail['sourse'];
+		$insert['create_time'] = time();
+		try {
+			validate(ModuleCheck::class)->scene('add')->check($insert);
+		} catch (ValidateException $e) {
+			// 验证失败 输出错误信息
+			return to_assign(1, $e->getError());
+		}
+		//sql语句
+		$sql_file = CMS_ROOT . '/app/'.$name.'/config/install.sql';
+		$sql_array = [];
+		if(file_exists($sql_file)){
+			$sql = file_get_contents($sql_file);
+			$sql_array = preg_split("/;[\r\n]+/", str_replace("oa_", $prefix, $sql));
+		}	
+		//var_dump($sql_array);exit;
+		Db::startTrans();
+        try {			
+			// 导入sql数据并创建表
+			if(!empty($sql_array)){
+				foreach ($sql_array as $k => $v) {
+					if (!empty($v)) {
+						Db::execute($v);
+					}
+				}
+			}			
+			//如果安装过该模块，删除原来的菜单信息
+			Db::name('AdminRule')->where('module',$name)->delete();
+			$sort = Db::name('AdminRule')->where('pid',0)->max('sort');
+			$this->add_rule($rule,0,$sort+1);			
+			$mid = Db::name('AdminModule')->strict(false)->field(true)->insertGetId($insert);
+			
+			Db::commit();
+		}
+		catch (\Exception $e) {
+			//回滚事务
+			Db::rollback();
+			return to_assign(1,'捕获到异常'.$e->getMessage());
+		}
+		
+		//更新超级管理员的权限节点
+		$rules = Db::name('AdminRule')->column('id');
+		$admin_rules = implode(',',$rules);
+		$res = Db::name('AdminGroup')->strict(false)->where('id',1)->update(['rules'=>$admin_rules,'update_time'=>time()]);		
+		if($res!==false){
+			// 删除后台节点缓存
+            clear_cache('adminRules');
+			add_log('install', $mid, $insert);
+			return to_assign();
+		}
+		else{
+			return to_assign(1,'操作失败');
+		}
+    }
+	
+	//递归插入菜单数据
+	protected function add_rule($data, $pid=0,$sort=0)
+	{
+		foreach($data as $k => $v)
+		{
+			$rule=[
+				'title'  => $v['title'],
+				'name'   => $v['name'],
+				'src'    => $v['src'],
+				'module' => $v['module'],
+				'menu'   => $v['menu'],
+				'icon'   => $v['icon'],
+				'pid'    => $pid,
+				'sort'   => $sort,
+				'create_time' => time()
+			];
+			$new_id = Db::name('AdminRule')->strict(false)->field(true)->insertGetId($rule);
+			if(!empty($v['son'] && $new_id)){
+				$this->add_rule($v['son'],$new_id);			
+			}
+		}
+	}
+
+    //删除
+    public function del()
+    {
+		if($this->uid!=1){
+			return to_assign(1,'只有系统超级管理员才有权限删除模块！');
+		}
+        $param = get_params();
+		$module = Db::name('AdminModule')->where('id',$param['id'])->find();
+		if($module['type'] == 1){
+			return to_assign(1,'系统模块不能删除');
+		}
+		$param['update_time']= time();
+		$res = Db::name('AdminModule')->where('id',$param['id'])->delete();
+		if($res!==false){
+			add_log('delete', $module['id'], $param);
+			return to_assign();
+		}
+		else{
+			return to_assign(1,'操作失败');
+		}
+    }
+
+    //卸载
+    public function uninstall()
+    {
+		if($this->uid!=1){
+			return to_assign(1,'只有系统超级管理员才有权限卸载模块！');
+		}
+        $param = get_params();
+		$module = Db::name('AdminModule')->where('name',$param['name'])->find();
+		if($module['type'] == 1){
+			return to_assign(1,'系统模块不能卸载');
+		}
+		$param['update_time']= time();
+		$res = Db::name('AdminModule')->where('name',$param['name'])->update(['status'=>0]);
+		if($res!==false){
+			Db::name('AdminRule')->strict(false)->where('module',$module['name'])->update(['status'=>0]);
+			// 删除后台节点缓存
+            clear_cache('adminRules');
+			add_log('uninstall', $module['id'], $param);
+			return to_assign();
+		}
+		else{
+			return to_assign(1,'操作失败');
+		}
+    }
+	
+	//恢复
+    public function recovery()
+    {
+		if($this->uid!=1){
+			return to_assign(1,'只有系统超级管理员才有权限恢复模块！');
+		}
+        $param = get_params();
+		$module = Db::name('AdminModule')->where('name',$param['name'])->find();
+		$param['update_time']= time();
+		$res = Db::name('AdminModule')->where('name',$param['name'])->update(['status'=>1]);
+		if($res!==false){
+			Db::name('AdminRule')->strict(false)->where('module',$module['name'])->update(['status'=>1]);
+			// 删除后台节点缓存
+            clear_cache('adminRules');
+			add_log('recovery', $module['id'], $param);
+			return to_assign();
+		}
+		else{
+			return to_assign(1,'操作失败');
+		}
+    }
+	
+	
+	//数据权限列表
+    public function data_auth()
+    {
+        if (request()->isAjax()) {
+            $auth = Db::name('DataAuth')->select();
+            return to_assign(0, '', $auth);
+        } else {
+            return view();
+        }
+    }
+	
+	//数据权限详情
+    public function data_auth_detail()
+    {
+		$param = get_params();
+        if (request()->isPost()) {
+			$param['update_time'] = time();
+            $res = Db::name('DataAuth')->strict(false)->field(true)->update($param);
+            return to_assign();
+        } else {
+			$detail = Db::name('DataAuth')->where('name',$param['name'])->find();
+			View::assign('detail', $detail);
+            return view();
+        }
+    }
+	
+}
diff --git a/app/home/controller/Outs.php b/app/home/controller/Outs.php
new file mode 100644
index 0000000000000000000000000000000000000000..4fea73dc21d2efed711c15f817c284794cf2732e
--- /dev/null
+++ b/app/home/controller/Outs.php
@@ -0,0 +1,126 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\home\controller;
+
+use app\base\BaseController;
+use app\home\model\Outs as OutsModel;
+use app\home\validate\OutsValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Outs extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new OutsModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			$where=[];
+			$where[]=['delete_time','=',0];
+            if (!empty($param['keywords'])) {
+                $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%'];
+            }
+            $list = $this->model->datalist($where, $param);
+            return table_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			if(!empty($param['start_date'])){
+				$param['start_date'] = strtotime($param['start_date']);
+			}
+			if(!empty($param['end_date'])){
+				$param['end_date'] = strtotime($param['end_date']);
+				if($param['end_date']<$param['start_date']){
+					return to_assign(1, '结束时间不能小于开始时间');
+				}
+			}
+            if (!empty($param['id']) && $param['id'] > 0) {
+				$this->model->edit($param);
+            } else {
+				$param['admin_id'] = $this->uid;
+				$param['did'] = $this->did;
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				View::assign('detail', $detail);
+			}
+			if(is_mobile()){
+				return view('qiye@/approve/add_waichu');
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			View::assign('create_user', get_admin($detail['admin_id']));
+			View::assign('detail', $detail);
+			if(is_mobile()){
+				return view('qiye@/approve/view_waichu');
+			}
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		$param = get_params();
+		$id = isset($param['id']) ? $param['id'] : 0;
+		if (request()->isDelete()) {
+			$this->model->delById($id);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }   
+
+}
diff --git a/app/home/controller/Overtimes.php b/app/home/controller/Overtimes.php
new file mode 100644
index 0000000000000000000000000000000000000000..1949400e88d95daaeb60f88b25d19ce7f6776696
--- /dev/null
+++ b/app/home/controller/Overtimes.php
@@ -0,0 +1,126 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\home\controller;
+
+use app\base\BaseController;
+use app\home\model\Overtimes as OvertimesModel;
+use app\home\validate\OvertimesValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Overtimes extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new OvertimesModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			$where=[];
+			$where[]=['delete_time','=',0];
+            if (!empty($param['keywords'])) {
+                $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%'];
+            }
+            $list = $this->model->datalist($where, $param);
+            return table_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			if(!empty($param['start_date'])){
+				$param['start_date'] = strtotime($param['start_date']);
+			}
+			if(!empty($param['end_date'])){
+				$param['end_date'] = strtotime($param['end_date']);
+				if($param['end_date']<$param['start_date']){
+					return to_assign(1, '结束时间不能小于开始时间');
+				}
+			}
+            if (!empty($param['id']) && $param['id'] > 0) {
+				$this->model->edit($param);
+            } else {
+				$param['admin_id'] = $this->uid;
+				$param['did'] = $this->did;
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				View::assign('detail', $detail);
+			}
+			if(is_mobile()){
+				return view('qiye@/approve/add_jiaban');
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			View::assign('create_user', get_admin($detail['admin_id']));
+			View::assign('detail', $detail);
+			if(is_mobile()){
+				return view('qiye@/approve/view_jiaban');
+			}
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		$param = get_params();
+		$id = isset($param['id']) ? $param['id'] : 0;
+		if (request()->isDelete()) {
+			$this->model->delById($id);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }   
+
+}
diff --git a/app/home/controller/Role.php b/app/home/controller/Role.php
new file mode 100644
index 0000000000000000000000000000000000000000..950f0c0398a2146187dc522f8cc78e123db27ac5
--- /dev/null
+++ b/app/home/controller/Role.php
@@ -0,0 +1,182 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\home\controller;
+
+use app\base\BaseController;
+use app\home\model\AdminGroup;
+use app\home\validate\GroupCheck;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Role extends BaseController
+{
+    public function index()
+    {
+        if (request()->isAjax()) {
+            $param = get_params();
+            $where = array();
+            if (!empty($param['keywords'])) {
+                $where[] = ['id|title|desc', 'like', '%' . $param['keywords'] . '%'];
+            }
+			$list = Db::name('AdminGroup')->where($where)->order('create_time asc')->select();
+            return to_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+
+    //添加&编辑
+    public function add()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+            $ruleData = isset($param['rule']) ? $param['rule'] : 0;
+            $layoutData = isset($param['layout']) ? $param['layout'] : 0;
+            $menuData = isset($param['mobile_menu']) ? $param['mobile_menu'] : 0;
+            $barData = isset($param['mobile_bar']) ? $param['mobile_bar'] : 0;
+			if($ruleData==0){
+				return to_assign(1, '权限节点至少选择一个');
+			}
+			if($layoutData==0){
+				return to_assign(1, '首页展示模块至少选择一个');
+			}
+            $param['rules'] = implode(',', $ruleData);
+            $param['layouts'] = implode(',', $layoutData);
+            $param['mobile_menu'] = implode(',', $menuData);
+            $param['mobile_bar'] = implode(',', $barData);
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(GroupCheck::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                //为了系统安全id为1的系统所有者管理组不允许修改
+                if ($param['id'] == 1) {
+                    return to_assign(1, '为了系统安全,该管理组不允许修改');
+                }
+                Db::name('AdminGroup')->where(['id' => $param['id']])->strict(false)->field(true)->update($param);
+                add_log('edit', $param['id'], $param);
+            } else {
+                try {
+                    validate(GroupCheck::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $gid = Db::name('AdminGroup')->strict(false)->field(true)->insertGetId($param);
+                add_log('add', $gid, $param);
+            }
+            //清除菜单\权限缓存
+            clear_cache('adminMenu');
+            clear_cache('MobileRules');
+            return to_assign();
+        } else {
+            $id = isset($param['id']) ? $param['id'] : 0;
+            $rule = admin_rule();
+			$layouts = get_config('layout');
+			$mobile_bar = Db::name('MobileBar')->where([['status','=',1]])->field('id,url,title,icon')->select()->toArray();
+			$mobile_menu = Db::name('MobileTypes')->where(['status'=>1])->select()->toArray();		
+
+			
+            if ($id > 0) {
+                $rules = admin_group_info($id);
+                $role_rule = create_tree_list(0, $rule, $rules);
+                $role = Db::name('AdminGroup')->where(['id' => $id])->find();				
+                View::assign('role', $role);
+				
+				$layout_selected = explode(',', $role['layouts']);
+				foreach ($layouts as $key =>&$vo) {
+					if (!empty($layout_selected) and in_array($vo['id'], $layout_selected)) {
+						$vo['checked'] = true;
+					} else {
+						$vo['checked'] = false;
+					}
+				}
+				
+				$mobile_bar_selected = explode(',', $role['mobile_bar']);
+				foreach ($mobile_bar as $key =>&$vo) {
+					if (!empty($mobile_bar_selected) and in_array($vo['id'], $mobile_bar_selected)) {
+						$vo['checked'] = true;
+					} else {
+						$vo['checked'] = false;
+					}
+				}
+				
+				$mobile_menu_selected = explode(',', $role['mobile_menu']);
+				foreach ($mobile_menu as &$row) {
+					$list = Db::name('MobileMenu')->where([['types','=',$row['id']],['status','=',1]])->select()->toArray();
+					foreach ($list as $key =>&$vo) {
+						if (!empty($mobile_menu_selected) and in_array($vo['id'], $mobile_menu_selected)) {
+							$vo['checked'] = true;
+						} else {
+							$vo['checked'] = false;
+						}
+					}	
+					$row['list'] = $list;
+				}
+
+            } else {
+                $role_rule = create_tree_list(0, $rule, []);
+				foreach ($layouts as $key =>&$vo) {
+					$vo['checked'] = false;
+				}
+				
+				foreach ($mobile_bar as $key =>&$vo) {
+					$vo['checked'] = false;
+				}
+				
+				foreach ($mobile_menu as &$row) {
+					$list = Db::name('MobileMenu')->where([['types','=',$row['id']],['status','=',1]])->select()->toArray();
+					foreach ($list as $key =>&$vo) {
+						$vo['checked'] = false;
+					}	
+					$row['list'] = $list;
+				}
+            }	
+            View::assign('role_rule', $role_rule);			
+            View::assign('layout', $layouts);
+            View::assign('mobile_bar', $mobile_bar);
+            View::assign('mobile_menu', $mobile_menu);
+            View::assign('id', $id);
+            return view();
+        }
+    }
+
+    //删除
+    public function delete()
+    {
+        if (request()->isDelete()) {
+            $id = get_params("id");
+            if ($id == 1) {
+                return to_assign(1, "该组是系统所有者，无法删除");
+            }
+            $count = Db::name('PositionGroup')->where(["group_id" => $id])->count();
+            if ($count > 0) {
+                return to_assign(1, "该权限组还在使用，请去除使用者关联再删除");
+            }
+            if (Db::name('AdminGroup')->delete($id) !== false) {
+                add_log('delete', $id, []);
+                return to_assign(0, "删除权限组成功");
+            } else {
+                return to_assign(1, "删除失败");
+            }
+        } else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+}
diff --git a/app/home/controller/Rule.php b/app/home/controller/Rule.php
new file mode 100644
index 0000000000000000000000000000000000000000..6705dd39d0562706b947360d8a8b991e075c7726
--- /dev/null
+++ b/app/home/controller/Rule.php
@@ -0,0 +1,110 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\home\controller;
+
+use app\base\BaseController;
+use app\home\validate\RuleCheck;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Rule extends BaseController
+{
+    public function index()
+    {
+        if (request()->isAjax()) {
+            $rule = Db::name('adminRule')
+                ->field('a.*,m.title as module_title')
+                ->alias('a')
+                ->leftJoin('adminModule m', 'a.module = m.name')
+                ->order('a.sort asc,a.id asc')
+                ->select();
+			$list = generateTree($rule);
+            return to_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+
+    //添加
+    public function add()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+            $param['src'] = preg_replace('# #', '', $param['src']);
+            if ($param['id'] > 0) {
+                try {
+                    validate(RuleCheck::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                Db::name('AdminRule')->strict(false)->field(true)->update($param);
+                add_log('edit', $param['id'], $param);
+            } else {
+                try {
+                    validate(RuleCheck::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['create_time'] = time();
+                $rid = Db::name('AdminRule')->strict(false)->field(true)->insertGetId($param);
+                //自动为系统超级管理员角色组分配新增的节点
+                $group = Db::name('AdminGroup')->find(1);
+                if (!empty($group)) {
+                    $newGroup['id'] = 1;
+                    $newGroup['rules'] = $group['rules'] . ',' . $rid;
+                    Db::name('AdminGroup')->strict(false)->field(true)->update($newGroup);
+                    add_log('add', $rid, $param);
+                }
+            }
+            // 删除后台节点缓存
+            clear_cache('adminRules');
+            return to_assign();
+        } else {
+            $id = isset($param['id']) ? $param['id'] : 0;
+            $pid = isset($param['pid']) ? $param['pid'] : 0;
+            if ($id > 0) {
+                $detail = Db::name('AdminRule')->where('id', $id)->find();
+                View::assign('detail', $detail);
+            }
+            View::assign('id', $id);
+            View::assign('pid', $pid);
+            return view();
+        }
+    }
+    //删除
+    public function delete()
+    {
+        if (request()->isDelete()) {
+            $id = get_params("id");
+            $count = Db::name('AdminRule')->where(["pid" => $id])->count();
+            if ($count > 0) {
+                return to_assign(1, "该节点下还有子节点，无法删除");
+            }
+            if (Db::name('AdminRule')->delete($id) !== false) {
+                clear_cache('adminRules');
+                add_log('delete', $id, []);
+                return to_assign(0, "删除节点成功");
+            } else {
+                return to_assign(1, "删除失败");
+            }
+        } else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+}
diff --git a/app/home/controller/Task.php b/app/home/controller/Task.php
new file mode 100644
index 0000000000000000000000000000000000000000..2d8cae31ad740b5b80c057524a1b2ecc54054aaa
--- /dev/null
+++ b/app/home/controller/Task.php
@@ -0,0 +1,80 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\home\controller;
+
+use app\base\BaseController;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Task extends BaseController
+{
+    public function index()
+    {
+        if (request()->isAjax()) {
+            $module = Db::name('TimingTask')->where(['delete_time' => 0])->select();
+            return to_assign(0, '', $module);
+        } else {
+            return view();
+        }
+    }
+	
+	//新增/编辑模块
+    public function add()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			if($this->uid!=1){
+				return to_assign(1,'只有系统超级管理员才有权限新增或编辑定时任务！');
+			}
+            if (!empty($param['id']) && $param['id'] > 0) {
+                Db::name('TimingTask')->where(['id' => $param['id']])->strict(false)->field(true)->update($param);
+                add_log('edit', $param['id'], $param);
+            } else {
+                $tid = Db::name('TimingTask')->strict(false)->field(true)->insertGetId($param);
+                add_log('add', $tid, $param);
+            }
+			return to_assign();
+        } else {
+			$id = isset($param['id']) ? $param['id'] : 0;
+			$task=[];
+			if ($id > 0) {
+                $task = Db::name('TimingTask')->where(['id' => $id])->find();
+            }
+			View::assign('id', $id);
+			View::assign('task', $task);
+            return view();
+        }
+    }
+	
+    //删除
+    public function delete()
+    {
+		if($this->uid!=1){
+			return to_assign(1,'只有超级管理员才有权限删除定时任务！');
+		}
+        $param = get_params();
+		$res = Db::name('TimingTask')->where('id',$param['id'])->update(['delete_time'=>time()]);
+		if($res!==false){
+			add_log('delete', $param['id'], $param);
+			return to_assign();
+		}
+		else{
+			return to_assign(1,'操作失败');
+		}
+    }
+	
+}
diff --git a/app/home/controller/Template.php b/app/home/controller/Template.php
new file mode 100644
index 0000000000000000000000000000000000000000..eeff9d4fcdaf97fdae9def1c4d128b92f3d74c58
--- /dev/null
+++ b/app/home/controller/Template.php
@@ -0,0 +1,139 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\home\controller;
+
+use app\base\BaseController;
+use app\home\model\Template as TemplateModel;
+use app\home\validate\TemplateValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Template extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new TemplateModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			$where=[];
+			$where[]=['delete_time','=',0];
+            if (!empty($param['keywords'])) {
+                $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%'];
+            }
+            $list = $this->model->datalist($where, $param);
+            return table_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {		
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(TemplateValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(TemplateValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$param['admin_id'] = $this->uid;
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				View::assign('detail', $detail);
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			View::assign('detail', $detail);
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		$param = get_params();
+		$id = isset($param['id']) ? $param['id'] : 0;
+		if (request()->isDelete()) {
+			$this->model->delById($id);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }   
+
+	//设置
+    public function set()
+    {
+		$param = get_params();
+        $res = $this->model::field('id,status')->update($param);
+		if ($res) {
+			if($param['status'] == 0){
+				add_log('disable', $param['id'], $param);
+			}
+			else if($param['status'] == 1){
+				add_log('recovery', $param['id'], $param);
+			}
+			return to_assign();
+		}
+		else{
+			return to_assign(0, '操作失败');
+		}
+    }
+}
diff --git a/app/home/controller/Trips.php b/app/home/controller/Trips.php
new file mode 100644
index 0000000000000000000000000000000000000000..462d710e6abe9076a353fb005670ce7e4ed769fd
--- /dev/null
+++ b/app/home/controller/Trips.php
@@ -0,0 +1,126 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\home\controller;
+
+use app\base\BaseController;
+use app\home\model\Trips as TripsModel;
+use app\home\validate\tripsValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Trips extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new TripsModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			$where=[];
+			$where[]=['delete_time','=',0];
+            if (!empty($param['keywords'])) {
+                $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%'];
+            }
+            $list = $this->model->datalist($where, $param);
+            return table_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			if(!empty($param['start_date'])){
+				$param['start_date'] = strtotime($param['start_date']);
+			}
+			if(!empty($param['end_date'])){
+				$param['end_date'] = strtotime($param['end_date']);
+				if($param['end_date']<$param['start_date']){
+					return to_assign(1, '结束时间不能小于开始时间');
+				}
+			}
+            if (!empty($param['id']) && $param['id'] > 0) {
+				$this->model->edit($param);
+            } else {
+				$param['admin_id'] = $this->uid;
+				$param['did'] = $this->did;
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				View::assign('detail', $detail);
+			}
+			if(is_mobile()){
+				return view('qiye@/approve/add_chuchai');
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			View::assign('create_user', get_admin($detail['admin_id']));
+			View::assign('detail', $detail);
+			if(is_mobile()){
+				return view('qiye@/approve/view_chuchai');
+			}			
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		$param = get_params();
+		$id = isset($param['id']) ? $param['id'] : 0;
+		if (request()->isDelete()) {
+			$this->model->delById($id);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }   
+
+}
diff --git a/app/home/event.php b/app/home/event.php
new file mode 100644
index 0000000000000000000000000000000000000000..afe59182c6aa72dfdf36da12c258d8e48725b43e
--- /dev/null
+++ b/app/home/event.php
@@ -0,0 +1,8 @@
+<?php
+return [
+	'listen'    => [
+        //注册监听类
+        'SendMessage' => ['app\listener\SendMessage'],
+    ],
+    //'subscribe' => ['app\subscribe\Message'],
+];
diff --git a/app/home/middleware.php b/app/home/middleware.php
new file mode 100644
index 0000000000000000000000000000000000000000..c482cdc94129fdc23d6b57facd94e78af56a3c34
--- /dev/null
+++ b/app/home/middleware.php
@@ -0,0 +1,9 @@
+<?php
+
+// 这是系统自动生成的middleware定义文件
+return [
+    //开启session中间件
+    //'think\middleware\SessionInit',
+    //验证勾股OA是否完成安装
+    \app\home\middleware\Install::class,
+];
diff --git a/app/home/middleware/Install.php b/app/home/middleware/Install.php
new file mode 100644
index 0000000000000000000000000000000000000000..a49a622f41145af5b4682375e7ee28254ba52034
--- /dev/null
+++ b/app/home/middleware/Install.php
@@ -0,0 +1,141 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\home\middleware;
+use systematic\Systematic;
+use think\facade\Db;
+use think\facade\Session;
+
+class Install
+{
+	protected $module = '';
+	protected $controller = '';
+	protected $action = '';
+    public function handle($request, \Closure $next)
+    {
+        if (!is_installed()) {
+            return $request->isAjax() ? to_assign(1, '请先完成系统安装引导') : redirect((string) url('/install/index'));
+        }
+		$module = strtolower(app('http')->getName());
+		$this->module = $module;
+		$param = $request->param();
+		$logtype = isset($param['logtype'])?$param['logtype']:'';
+		$module_son = isset($param['module_son'])?$param['module_son']:'';
+		$module_old = [];	
+		if($module_son!='' && ($logtype != 'add' || $logtype != 'delete')){
+			$module_old = Db::name($module_son)->where('id',$param['id'])->find();
+		}
+        //return $next($request);
+        //获取响应,获取响应之前的代码为前置中间件，
+		//do songthing
+		//----------以上部分为前置中间件--------------
+		
+        $response=$next($request);
+		
+        //----------以下部分为后置中间件--------------
+        //获取响应之后的为后置中间件的执行内容
+		
+		$this->controller = strtolower($request->controller());
+		$this->action = strtolower($request->action());
+		//获取返回的HTTPCode
+		//$code = $response->getCode();
+		$responseData = $response->getData();
+		if(isset($responseData['code']) && $responseData['code'] == 0){
+			if(isset($responseData['datas'])){
+				$logData = $responseData['datas'];
+			}
+			else{
+				$logData = $responseData['data'];
+			}
+			$log_conf = get_config('log');
+			$type_action = $log_conf['type_action'];
+			if(isset($logData['logtype']) && isset($logData['id']) && isset($type_action[$logData['logtype']])){
+				$logData['type_title'] = $type_action[$logData['logtype']];
+				$moduleLogData = [];
+				if($module_son!='' && isset($log_conf[$this->module])){
+					$log_conf_module = $log_conf[$this->module];
+					$module_field_key = $log_conf_module[$module_son];
+					$module_new = Db::name($module_son)->where('id',$logData['id'])->find();
+					$param_id = $module_new['id'];
+					$param_son_id = 0;
+					if($module_son!=$this->module){
+						$param_id = $module_new[$this->module.'_id'];
+						$param_son_id = $module_new['id'];						
+					}
+					else{
+						$module_son = '';
+					}
+					if(isset($module_field_key)){
+						$moduleLogData = [
+							'param_id'=>$param_id,
+							'module_son'=>$module_son,
+							'param_son_id'=>$param_son_id,
+							'old'=>$module_old,
+							'new'=>$module_new,
+							'key'=>$module_field_key
+						];
+					}
+				}			
+				$this->addLog($logData,$moduleLogData);
+			}
+		}
+
+        //这里回调本身返回response对象
+        return $response;
+    }
+	/*
+	public function end(\think\Response $response){
+		
+			dump($response->getData());
+			exit;			
+	
+		//dump($response->header());
+    }
+	*/
+	
+	protected function addLog($logData = [],$moduleLogData=[])
+	{		
+		$session_admin = get_config('app.session_admin');
+        $uid = Session::get($session_admin);
+		$data = [
+			'uid' => $uid,
+			'type' => $logData['logtype'],
+			'action' => $logData['type_title'],
+			'param_id' => $logData['id'],
+			'param' => json_encode($logData),
+			'module' => $this->module,
+			'controller' => $this->controller,
+			'function' => $this->action,
+			'ip' => app('request')->ip(),
+			'create_time' => time(),
+			'subject' => '系统'
+		];
+		if(isset($logData['subject']) && $logData['subject'] != ''){
+			$data['subject'] = $logData['subject'];
+		}
+		else{
+			$rule = $data['module'] . '/' . $data['controller'] . '/' . $data['function'];
+			$rule_menu = Db::name('AdminRule')->where(array('src' => $rule))->find();
+			if($rule_menu){
+				$data['subject'] = $rule_menu['name'];
+			}
+		}
+		Db::name('AdminLog')->strict(false)->field(true)->insert($data);
+		if(!empty($moduleLogData)){
+			$GOUGU = new Systematic();
+			$GOUGU->moduleLog($uid,$logData['logtype'],$this->module,$moduleLogData);
+		}
+	}
+}
diff --git a/app/home/model/AdminGroup.php b/app/home/model/AdminGroup.php
new file mode 100644
index 0000000000000000000000000000000000000000..fb8815f322459d125e955e88ac21a55f21accfa2
--- /dev/null
+++ b/app/home/model/AdminGroup.php
@@ -0,0 +1,21 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\home\model;
+
+use think\Model;
+
+class AdminGroup extends Model
+{
+
+}
diff --git a/app/home/model/AdminLog.php b/app/home/model/AdminLog.php
new file mode 100644
index 0000000000000000000000000000000000000000..24ff8c33baa4b35723a7ae272c6acc82edca6742
--- /dev/null
+++ b/app/home/model/AdminLog.php
@@ -0,0 +1,39 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+namespace app\home\model;
+
+use think\Model;
+use think\facade\Db;
+use dateset\Dateset;
+
+class AdminLog extends Model
+{
+    public function get_log_list($param = [])
+    {
+        $rows = empty($param['limit']) ? get_config('app.pages') : $param['limit'];
+        $list = Db::name('AdminLog')
+            ->field("a.id,a.uid,a.type,a.subject,a.action,a.create_time,u.name")
+			->alias('a')
+			->join('Admin u', 'a.uid = u.id')
+            ->order('a.create_time desc')
+            ->paginate(['list_rows'=> $rows])
+			->each(function($item, $key){
+				$item['content'] = $item['name']. $item['action'] . '了' . $item['subject'];
+				$item['times'] = (new Dateset())->time_trans($item['create_time']);
+				return $item;
+			});
+        return $list;
+    }
+}
diff --git a/app/home/model/File.php b/app/home/model/File.php
new file mode 100644
index 0000000000000000000000000000000000000000..b35017c14267c52d7edf7ab49abfbb49bac5f589
--- /dev/null
+++ b/app/home/model/File.php
@@ -0,0 +1,22 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\home\model;
+
+use think\Model;
+
+// 关键字模型
+class File extends Model
+{
+
+}
diff --git a/app/home/model/Leaves.php b/app/home/model/Leaves.php
new file mode 100644
index 0000000000000000000000000000000000000000..6bbb9844b89dd9f8a6529935eb9dbc36ccce69d1
--- /dev/null
+++ b/app/home/model/Leaves.php
@@ -0,0 +1,119 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\home\model;
+use think\model;
+use think\facade\Db;
+class Leaves extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->order($order)
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key){
+				//$item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name');
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param,'请假申请');
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param,'请假申请');
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		$info['start_date'] = date('Y-m-d H:i',$info['start_date']);
+		$info['end_date'] = date('Y-m-d H:i',$info['end_date']);
+		if(!empty($info['file_ids'])){
+			$file_array = Db::name('File')->where('id','in',$info['file_ids'])->select();
+			$info['file_array'] = $file_array;
+		}
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/home/model/Message.php b/app/home/model/Message.php
new file mode 100644
index 0000000000000000000000000000000000000000..834100a05ecdc599fd4d3ee8696387e4bd83048c
--- /dev/null
+++ b/app/home/model/Message.php
@@ -0,0 +1,152 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\home\model;
+
+use think\Model;
+use think\facade\Db;
+
+class Message extends Model
+{	
+    /**
+    * 获取发件箱分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->order($order)
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key){
+				$item->send_time_str = empty($item->send_time) ? '草稿' : date('Y-m-d H:i:s', $item->send_time);
+				if(empty($item->uids)){
+					$item->to_name = '-';
+				}
+				else{
+					$to_name = Db::name('Admin')->where([['id','in',$item->uids]])->column('name');
+					$item->to_name = implode(',',$to_name);
+				}
+				if(empty($item->dids)){
+					$item->to_department = '-';
+				}
+				else{
+					$to_department = Db::name('Department')->where([['id','in',$item->dids]])->column('title');
+					$item->to_department = implode(',',$to_department);
+				}
+				if(empty($item->pids)){
+					$item->to_position = '-';
+				}
+				else{
+					$to_position = Db::name('Position')->where([['id','in',$item->pids]])->column('title');
+					$item->to_position = implode(',',$to_position);
+				}
+				if(empty($item->copy_uids)){
+					$item->copy_names = '-';
+				}
+				else{
+					$copy_name = Db::name('Admin')->where([['id','in',$item->copy_uids]])->column('name');
+					$item->copy_names = implode(',',$copy_name);
+				}
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+	
+    //发件箱消息详情
+    public function detail($id)
+    {
+        $detail = self::find($id);
+		if(!empty($detail)){
+            if ($detail['types'] == 1) { //人员
+                $users = Db::name('Admin')->where('status', 1)->where('id', 'in', $detail['uids'])->column('name');
+                $detail['unames'] = implode(',',$users);
+            } elseif ($detail['types'] == 2) { //部门
+                $departments = Db::name('Department')->where('id', 'in', $detail['dids'])->column('title');
+                $detail['dnames'] = implode(',',$departments);
+            } elseif ($detail['types'] == 3) { //角色
+                $positions = Db::name('Position')->where('id', 'in', $detail['pids'])->column('title');
+               $detail['pnames'] = implode(',',$positions);
+            }
+			$copy_users = Db::name('Admin')->where('status', 1)->where('id', 'in', $detail['copy_uids'])->column('name');
+            $detail['copy_names'] = implode(',',$copy_users);
+			//消息附件
+			$file_array = Db::name('File')->order('create_time desc')->where([['id','in',$detail['file_ids']]])->select()->toArray();
+			$detail['file_array'] = $file_array;
+			//引用消息附件
+			if($detail['msg_id']>0){
+				$from_msg =  Db::name('Msg')->field('content,file_ids,template,action_id')->where(['id' => $detail['msg_id']])->find();
+				$detail['from_template'] = $from_msg['template'];
+				$detail['from_action_id'] = $from_msg['action_id'];
+				$detail['from_content'] = $from_msg['content'];
+				$detail['from_file_ids'] = $from_msg['file_ids'];				
+				$detail['from_file_array'] = Db::name('File')->order('create_time desc')->where([['id','in',$detail['from_file_ids']]])->select()->toArray();
+			}
+		}
+        return $detail;
+    }
+	
+    //发送消息
+    public function send($id)
+    {
+        //查询要发的消息
+        $msg = self::find($id);
+        $users = [];
+		//查询全部收件人
+		if ($msg['types'] == 1) { //人员
+			$users = Db::name('Admin')->where('status', 1)->where('id', 'in', $msg['uids'])->column('id');
+		} elseif ($msg['types'] == 2) { //部门
+			$users = Db::name('Admin')->where('status', 1)->where('did', 'in', $msg['dids'])->column('id');
+		} elseif ($msg['types'] == 3) { //角色
+			$users = Db::name('Admin')->where('status', 1)->where('position_id', 'in', $msg['pids'])->column('id');
+		} elseif ($msg['types'] == 4) { //全部
+			$users = Db::name('Admin')->where('status', 1)->column('id');
+		}
+		if(!empty($msg['copy_uids'])){
+			$copy_uids = explode(',',$msg['copy_uids']);
+			$users_tem = array_merge($users,$copy_uids);
+			$users = array_unique($users_tem);
+		}
+		//组合要发的消息
+		$send_data = [];
+		foreach ($users as $key => $value) {
+			if ($value == $msg['from_uid']) {
+				continue;
+			}
+			$send_data[] = array(
+				'message_id' => $msg['id'],//来源发件箱关联id
+				'to_uid' => $value,//接收人
+				'msg_id' => $msg['msg_id'],//转发或回复消息关联id
+				'title' => $msg['title'],
+				'content' => $msg['content'],
+				'file_ids' => $msg['file_ids'],
+				'from_uid' => $msg['from_uid'],//发送人
+				'create_time' => time()
+			);
+		}
+		$res = Db::name('Msg')->strict(false)->field(true)->insertAll($send_data);
+		if ($res!==false) {
+			//草稿消息变成已发消息
+			self::where(['id' => $msg['id']])->update(['is_draft' => '1', 'send_time' => time(), 'update_time' => time()]);
+			add_log('send',$msg['id'],[],'消息');
+			return true;
+		} else {
+			return false;
+		}
+    }
+}
diff --git a/app/home/model/Msg.php b/app/home/model/Msg.php
new file mode 100644
index 0000000000000000000000000000000000000000..3a4c73741cc253fcac556af333284a3600d14c2a
--- /dev/null
+++ b/app/home/model/Msg.php
@@ -0,0 +1,78 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\home\model;
+
+use think\Model;
+use think\facade\Db;
+
+class Msg extends Model
+{	
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->order($order)
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key){
+				$item->from_name = '系统';
+				$item->thumb = '/static/home/images/icon.png';
+				
+				if($item->from_uid>0){
+					$from_name = Db::name('Admin')->where('id',$item->from_uid)->find();
+					$item->from_name = $from_name['name'];
+					$item->thumb = $from_name['thumb'];
+				}
+				if(!empty($item->uids)){
+					$to_name = Db::name('Admin')->where(['id','in',$item->uids])->column('name');
+					$item->to_name = implode(',',$to_name);
+				}
+				else{
+					$item->to_name = '-';
+				}
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+	
+    //消息详情
+    public function detail($id)
+    {
+        $detail = self::find($id);
+		if(!empty($detail)){
+			//消息附件
+			$file_array = Db::name('File')->order('create_time desc')->where([['id','in',$detail['file_ids']]])->select()->toArray();
+			$detail['file_array'] = $file_array;
+			//引用消息附件
+			if($detail['msg_id']>0){
+				$from_msg = self::field('content,file_ids,template,action_id')->where(['id' => $detail['msg_id']])->find();
+				$detail['from_template'] = $from_msg['template'];
+				$detail['from_action_id'] = $from_msg['action_id'];
+				$detail['from_content'] = $from_msg['content'];
+				$detail['from_file_ids'] = $from_msg['file_ids'];				
+				$from_file_array = Db::name('File')->order('create_time desc')->where([['id','in',$detail['from_file_ids']]])->select()->toArray();
+				$detail['from_file_array'] = $from_file_array;
+			}
+		}
+        return $detail;
+    }
+}
diff --git a/app/home/model/Outs.php b/app/home/model/Outs.php
new file mode 100644
index 0000000000000000000000000000000000000000..a5b7569bd6d94ed3ef319df41edf26c336ec4e56
--- /dev/null
+++ b/app/home/model/Outs.php
@@ -0,0 +1,119 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\home\model;
+use think\model;
+use think\facade\Db;
+class Outs extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->order($order)
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key){
+				//$item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name');
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param,'外出申请');
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param,'外出申请');
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		$info['start_date'] = date('Y-m-d H:i',$info['start_date']);
+		$info['end_date'] = date('Y-m-d H:i',$info['end_date']);
+		if(!empty($info['file_ids'])){
+			$file_array = Db::name('File')->where('id','in',$info['file_ids'])->select();
+			$info['file_array'] = $file_array;
+		}
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/home/model/Overtimes.php b/app/home/model/Overtimes.php
new file mode 100644
index 0000000000000000000000000000000000000000..75138ee7b8fe445762e375d22a4829a6721249b0
--- /dev/null
+++ b/app/home/model/Overtimes.php
@@ -0,0 +1,119 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\home\model;
+use think\model;
+use think\facade\Db;
+class Overtimes extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->order($order)
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key){
+				//$item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name');
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param,'加班申请');
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param,'加班申请');
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		$info['start_date'] = date('Y-m-d H:i',$info['start_date']);
+		$info['end_date'] = date('Y-m-d H:i',$info['end_date']);
+		if(!empty($info['file_ids'])){
+			$file_array = Db::name('File')->where('id','in',$info['file_ids'])->select();
+			$info['file_array'] = $file_array;
+		}
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/home/model/Template.php b/app/home/model/Template.php
new file mode 100644
index 0000000000000000000000000000000000000000..d15a2c19bfa1a172206e6211b7a90cce2d581280
--- /dev/null
+++ b/app/home/model/Template.php
@@ -0,0 +1,113 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\home\model;
+use think\model;
+use think\facade\Db;
+class Template extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->order($order)
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key){
+				$item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name');
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/home/model/Trips.php b/app/home/model/Trips.php
new file mode 100644
index 0000000000000000000000000000000000000000..9a3af26e450e79e5641f31dd1eee1100a2b929a4
--- /dev/null
+++ b/app/home/model/Trips.php
@@ -0,0 +1,120 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\home\model;
+use think\model;
+use think\facade\Db;
+class Trips extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->order($order)
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key){
+				//$item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name');
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param,'出差申请');
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param,'出差申请');
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		$info['start_date'] = date('Y-m-d H:i',$info['start_date']);
+		$info['end_date'] = date('Y-m-d H:i',$info['end_date']);
+		if(!empty($info['file_ids'])){
+			$file_array = Db::name('File')->where('id','in',$info['file_ids'])->select();
+			$info['file_array'] = $file_array;
+		}
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/home/validate/ConfCheck.php b/app/home/validate/ConfCheck.php
new file mode 100644
index 0000000000000000000000000000000000000000..f9c1442053a5af95f3d39040f585ad241e6fbf42
--- /dev/null
+++ b/app/home/validate/ConfCheck.php
@@ -0,0 +1,31 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\home\validate;
+
+use think\Validate;
+
+class ConfCheck extends Validate
+{
+    protected $rule = [
+        'title' => 'require|unique:config',
+        'name' => 'require|unique:config',
+    ];
+
+    protected $message = [
+        'title.require' => '配置名称不能为空',
+        'title.unique' => '同样的配置名称已经存在',
+        'name.require' => '配置标识不能为空',
+        'name.unique' => '同样的配置标识已经存在',
+    ];
+}
diff --git a/app/home/validate/EnterpriseCheck.php b/app/home/validate/EnterpriseCheck.php
new file mode 100644
index 0000000000000000000000000000000000000000..87a5e2f0ff2e8dcb07852371ee73dd0ad60e801b
--- /dev/null
+++ b/app/home/validate/EnterpriseCheck.php
@@ -0,0 +1,35 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\home\validate;
+
+use think\Validate;
+
+class EnterpriseCheck extends Validate
+{
+    protected $rule = [
+        'title' => 'require|unique:enterprise',
+        'id' => 'require',
+    ];
+
+    protected $message = [
+        'title.require' => '名称不能为空',
+        'title.unique' => '同样的名称已经存在',
+        'id.require' => '缺少更新条件',
+    ];
+
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['id', 'title'],
+    ];
+}
diff --git a/app/home/validate/GroupCheck.php b/app/home/validate/GroupCheck.php
new file mode 100644
index 0000000000000000000000000000000000000000..d15783ba431a111a73d5c39f64dc232710b4df59
--- /dev/null
+++ b/app/home/validate/GroupCheck.php
@@ -0,0 +1,47 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\home\validate;
+
+use think\Validate;
+
+class GroupCheck extends Validate
+{
+    protected $rule = [
+        'title' => 'require|unique:admin_group',
+        'id' => 'require',
+        'status' => 'require|checkStatus:-1,1',
+    ];
+
+    protected $message = [
+        'title.require' => '名称不能为空',
+        'title.unique' => '同样的记录已经存在',
+        'id.require' => '缺少更新条件',
+        'status.require' => '状态为必选',
+        'status.checkStatus' => '系统所有者组不能被禁用',
+    ];
+
+    protected $scene = [
+        'add' => ['title', 'status'],
+        'edit' => ['id', 'title', 'status'],
+    ];
+
+    // 自定义验证规则
+    protected function checkStatus($value, $rule, $data)
+    {
+        if ($value == -1 and $data['id'] == 1) {
+            return $rule == false;
+        }
+        return $rule == true;
+    }
+}
diff --git a/app/home/validate/ModuleCheck.php b/app/home/validate/ModuleCheck.php
new file mode 100644
index 0000000000000000000000000000000000000000..fb4ff7267364f297338ae796373be1b4414f17b0
--- /dev/null
+++ b/app/home/validate/ModuleCheck.php
@@ -0,0 +1,40 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\home\validate;
+
+use think\Validate;
+
+class ModuleCheck extends Validate
+{
+    protected $rule = [
+        'title' => 'require|unique:admin_module',
+        'name' => 'require|lower|min:2|unique:admin_module',
+        'id' => 'require',
+    ];
+
+    protected $message = [
+        'title.require' => '模块名称不能为空',
+        'title.unique' => '同样的模块名称已经存在',
+        'name.require' => '模块标识不能为空',
+        'name.lower' => '模块目录只能是小写字母',
+        'name.min' => '模块目录至少需要2个小写字母',
+        'name.unique' => '同样的模块目录已经存在',
+        'id.require' => '缺少更新条件',
+    ];
+
+    protected $scene = [
+        'add' => ['title','name'],
+        'edit' => ['id','title','name'],
+    ];
+}
diff --git a/app/home/validate/RuleCheck.php b/app/home/validate/RuleCheck.php
new file mode 100644
index 0000000000000000000000000000000000000000..a30022b7a04453397b0021931396bb840d6072b6
--- /dev/null
+++ b/app/home/validate/RuleCheck.php
@@ -0,0 +1,40 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\home\validate;
+
+use think\Validate;
+
+class RuleCheck extends Validate
+{
+    protected $rule = [
+        'title' => 'require',
+        'name' => 'require',
+        'menu' => 'require',
+        'src' => 'unique:admin_rule',
+        'id' => 'require',
+    ];
+
+    protected $message = [
+        'title.require' => '菜单节点名称不能为空',
+        'src.unique' => '同样的菜单节点URL已经存在',
+        'menu.require' => '是否是左侧菜单需要选择',
+        'name.require' => '节点日志操作名称不能为空',
+        'id.require' => '缺少更新条件'
+    ];
+
+    protected $scene = [
+        'add' => ['title','src','name','menu'],
+        'edit' => ['id', 'title','src','name','menu']
+    ];
+}
diff --git a/app/home/validate/TemplateValidate.php b/app/home/validate/TemplateValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..612a812ef622feb2ec16302fb0de79081c52afd3
--- /dev/null
+++ b/app/home/validate/TemplateValidate.php
@@ -0,0 +1,52 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\home\validate;
+use think\Validate;
+use think\facade\Db;
+
+class TemplateValidate extends Validate
+{
+	// 自定义验证规则
+	protected function checkOne($value,$rule,$data=[])
+	{
+		$id = isset($data['id'])?$data['id']:0;
+		$count = Db::name('Template')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count();
+		return $count == 0 ? true : false;
+	}
+	protected function checkOneName($value,$rule,$data=[])
+	{
+		$id = isset($data['id'])?$data['id']:0;
+		$count = Db::name('Template')->where([['name','=',$data['name']],['id','<>',$id],['delete_time','=',0]])->count();
+		return $count == 0 ? true : false;
+	}
+	
+    protected $rule = [
+		'title' => 'require|checkOne',
+		'name' => 'require|alphaDash|checkOneName',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'title.require' => '名称不能为空',
+		'title.checkOne' => '同样的名称已经存在',
+		'name.checkOne' => '同样的标识已经存在',
+		'name.alphaDash' => '标识只能是小写字母',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['title','name'],
+        'edit' => ['title','name', 'id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/home/validate/UserCheck.php b/app/home/validate/UserCheck.php
new file mode 100644
index 0000000000000000000000000000000000000000..5a4cc308fb8a31e148449602cf1799d09a83f84e
--- /dev/null
+++ b/app/home/validate/UserCheck.php
@@ -0,0 +1,32 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\home\validate;
+
+use think\Validate;
+
+class UserCheck extends Validate
+{
+    protected $rule = [
+        'username' => 'require',
+        'password' => 'require',
+        'captcha' => 'require|captcha',
+    ];
+
+    protected $message = [
+        'username.require' => '用户名不能为空',
+        'password.require' => '密码不能为空',
+        'captcha.require' => '验证码不能为空',
+        'captcha.captcha' => '验证码不正确',
+    ];
+}
diff --git a/app/home/view/approve/all.html b/app/home/view/approve/all.html
new file mode 100644
index 0000000000000000000000000000000000000000..d2329670dc6f23c2ac4c8c45506ea58cb523d8ac
--- /dev/null
+++ b/app/home/view/approve/all.html
@@ -0,0 +1,75 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<div class="body-table layui-tab layui-tab-brief border" lay-filter="tab" style="background-color:#fff; margin:0; border-bottom:0">
+		<ul class="layui-tab-title" style="border:none;">
+			<li class="layui-this">全部</li>
+			<li>待审批</li>
+			<li>审批通过</li>
+			<li>审批拒绝</li>
+		</ul>				
+	</div>
+	<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:200px">
+			<input type="text" name="uname" value="" placeholder="请选择员工" readonly class="layui-input picker-admin" autocomplete="off" />
+			<input type="text" name="uid" value="0" style="display:none" />
+			<input type="hidden" name="status" value="0" />
+		</div>
+		<div class="layui-input-inline" style="width:150px;">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+<h3 class="h3-title" style="height:28px;">我申请的审批</h3>
+</script>						
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool','oaPicker','tablePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool ,element=layui.element;
+			
+		element.on('tab(tab)', function(data){
+			$('[name="status"]').val(data.index);
+			$('[lay-filter="table-search"]').click();
+			return false;
+		});
+			
+		layui.pageTable = table.render({
+			elem: '#test'
+			,toolbar: false
+			,defaultToolbar: false
+			,title:'全部审批列表'
+			,url: "/home/approve/all"
+			,page: true //开启分页
+			,limit: 20
+			,cellMinWidth: 80
+			,height: 'full-152'
+			,cols: [[
+					{field:'types_name',title: '审批类型',width:100, align:'center'}
+					,{field:'check_status',title: '审核状态',width:110, align:'center',templet: function(d){
+						var html = '<span class="check-status-color-'+d.check_status+'">『'+d.check_status_str+'』</span>';
+						return html;
+					}}
+					,{field:'admin_name',title: '申请人',width:90,align:'center'}
+					,{field:'create_time',title: '申请时间',width:150,align:'center'}
+					,{field:'department',title: '所属部门',width:120,align:'center'}
+					,{field:'check_users',title: '当前审批人'}
+					,{field:'check_copy_users',title: '抄送人员',width:150}
+					,{width:60,title: '操作', align:'center',templet: function(d){
+						var btn='<a class="layui-btn layui-btn-xs layui-btn-normal side-a" data-href="'+d.view_url+'?id='+d.id+'">详情</a>';
+						return btn;
+					}}
+				]]
+			});
+		}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/approve/checklist.html b/app/home/view/approve/checklist.html
new file mode 100644
index 0000000000000000000000000000000000000000..166a40ff98ab867fcab0f1e8c2f6d792f95a96b9
--- /dev/null
+++ b/app/home/view/approve/checklist.html
@@ -0,0 +1,62 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<div class="body-table layui-tab layui-tab-brief border" lay-filter="tab" style="background-color:#fff; margin:0; border-bottom:0">
+		<ul class="layui-tab-title" style="border:none;">
+			<li class="layui-this">全部</li>
+			<li>待我审批</li>
+			<li>我已审批</li>
+		</ul>				
+	</div>
+	<table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+<h3 class="h3-title" style="height:28px;">我处理的审批</h3>
+</script>						
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool ,element=layui.element;
+			
+		element.on('tab(tab)', function(data){
+			layui.pageTable.reload({where:{status:data.index},page:{curr:1}});
+			return false;
+		});			
+			
+		layui.pageTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,defaultToolbar: false
+			,title:'审批列表'
+			,url: "/home/approve/checklist"
+			,page: true //开启分页
+			,limit: 20
+			,cellMinWidth: 80
+			,height: 'full-92'
+			,cols: [[
+					{field:'types_name',title: '审批类型',width:100, align:'center'}
+					,{field:'check_status',title: '审核状态',width:110, align:'center',templet: function(d){
+						var html = '<span class="check-status-color-'+d.check_status+'">『'+d.check_status_str+'』</span>';
+						return html;
+					}}
+					,{field:'admin_name',title: '申请人',width:90,align:'center'}
+					,{field:'create_time',title: '申请时间',width:150,align:'center'}
+					,{field:'department',title: '所属部门',width:120,align:'center'}
+					,{field:'check_users',title: '当前审批人'}
+					,{field:'check_copy_users',title: '抄送人员',width:150}
+					,{width:60,title: '操作', align:'center',templet: function(d){
+						var btn='<a class="layui-btn layui-btn-xs layui-btn-normal side-a" data-href="'+d.view_url+'?id='+d.id+'">详情</a>';
+						return btn;
+					}}
+				]]
+			});
+		}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/approve/copylist.html b/app/home/view/approve/copylist.html
new file mode 100644
index 0000000000000000000000000000000000000000..2f3b672b0054374e17e3b4ed2539bf1caa1e4b58
--- /dev/null
+++ b/app/home/view/approve/copylist.html
@@ -0,0 +1,63 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<div class="body-table layui-tab layui-tab-brief border" lay-filter="tab" style="background-color:#fff; margin:0; border-bottom:0">
+		<ul class="layui-tab-title" style="border:none;">
+			<li class="layui-this">全部</li>
+			<li>待审批</li>
+			<li>审批通过</li>
+			<li>审批拒绝</li>
+		</ul>				
+	</div>
+	<table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+<h3 class="h3-title" style="height:28px;">抄送给我的审批</h3>
+</script>						
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool ,element=layui.element;
+			
+		element.on('tab(tab)', function(data){
+			layui.pageTable.reload({where:{status:data.index},page:{curr:1}});
+			return false;
+		});			
+			
+		layui.pageTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,defaultToolbar: false
+			,title:'审批列表'
+			,url: "/home/approve/copylist"
+			,page: true //开启分页
+			,limit: 20
+			,cellMinWidth: 80
+			,height: 'full-92'
+			,cols: [[
+					{field:'types_name',title: '审批类型',width:100, align:'center'}
+					,{field:'check_status',title: '审核状态',width:110, align:'center',templet: function(d){
+						var html = '<span class="check-status-color-'+d.check_status+'">『'+d.check_status_str+'』</span>';
+						return html;
+					}}
+					,{field:'admin_name',title: '申请人',width:90,align:'center'}
+					,{field:'create_time',title: '申请时间',width:150,align:'center'}
+					,{field:'department',title: '所属部门',width:120,align:'center'}
+					,{field:'check_users',title: '当前审批人'}
+					,{field:'check_copy_users',title: '抄送人员',width:150}
+					,{width:60,title: '操作', align:'center',templet: function(d){
+						var btn='<a class="layui-btn layui-btn-xs layui-btn-normal side-a" data-href="'+d.view_url+'?id='+d.id+'">详情</a>';
+						return btn;
+					}}
+				]]
+			});
+		}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/approve/index.html b/app/home/view/approve/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..d94ca545078d5dfb1e028a6883274ca4a09afb2d
--- /dev/null
+++ b/app/home/view/approve/index.html
@@ -0,0 +1,89 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+.body-card{background-color:#fff; border:1px solid #eee;}
+.card-header{height:44px; line-height:44px; text-indent:12px}
+.square .layui-col-md2{border: 1px solid #f5f5f5; border-left:0; cursor:pointer;}
+.square .layui-col-md2 div{padding:12px 0; height:50px; text-align:center; background-color:#fff; color:#666}
+.square .layui-col-md2 i{font-size:28px; font-weight:800; display:block; padding-bottom:3px; color:#4285f4}
+.square .layui-col-md2:nth-child(6n){border-right:0;}
+.square .layui-col-md2:nth-child(n+7){margin-top: -1px;}
+.square .layui-col-md2 div:hover{color:#4285f4; background-color:#fafafa}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<div class="body-card">
+		<div class="card-header" style="border-bottom:1px solid #eee;"><h3 class="h3-title">审批新申请</h3></div>
+		{volist name="module" id="v" offset="0"}
+		{notempty name="$v.list"}
+		<div class="card-header"><strong>{$v.title}</strong></div>
+		<div class="square">
+			<div class="layui-row">
+				{volist name="$v.list" id="vo"}
+					<div class="layui-col-md2 side-a" data-href="{$vo.add_url}" title="{$vo.title}"><div><i class="iconfont {$vo.icon}"></i>{$vo.title}</div></div>	
+				{/volist}
+			</div>
+		</div>
+		{/notempty}
+		{/volist}
+		<div style="padding:16px 0; text-align:center; color:#ffb800">
+			如果是【日常办公数据管理员】，可查看全体员工的审批申请记录，去查<a href="javascript:;" data-href="/home/approve/all" class="side-a">『全部审批』</a>
+		</div>
+	</div>
+</div>
+<script type="text/html" id="toolbarDemo">
+<h3 class="h3-title" style="height:28px;">审批列表</h3>
+</script>						
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool ,element=layui.element;
+			
+		element.on('tab(tab)', function(data){
+			layui.pageTable.reload({where:{status:data.index},page:{curr:1}});
+			return false;
+		});			
+			
+		layui.pageTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,defaultToolbar: false
+			,title:'审批列表'
+			,url: "/oa/approve/index"
+			,page: true //开启分页
+			,limit: 20
+			,cellMinWidth: 80
+			,cols: [[
+					{field:'id',width:80, title: 'ID号', align:'center'}
+					,{field:'types_name',title: '审批类型',width:100, align:'center'}
+					,{field:'check_status',title: '审核状态',width:110, align:'center',templet: function(d){
+						var html = '<span class="check-status-color-'+d.check_status+'">『'+d.check_status_str+'』</span>';
+						return html;
+					}}
+					,{field:'admin_name',title: '申请人',width:90,align:'center'}
+					,{field:'create_time',title: '申请时间',width:150,align:'center'}
+					,{field:'department',title: '所属部门',width:120,align:'center'}
+					,{field:'check_users',title: '当前审批人'}
+					,{width:60,title: '操作', align:'center',templet: function(d){
+						var btn='<a class="layui-btn layui-btn-xs" lay-event="view">详情</a>';
+						return btn;
+					}}
+				]]
+			});
+			
+			table.on('tool(test)',function (obj) {
+				if(obj.event === 'view'){		
+					tool.side('/adm/'+obj.data.table_name+'/view?id='+obj.data.id);
+				}
+			});
+		}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/approve/mylist.html b/app/home/view/approve/mylist.html
new file mode 100644
index 0000000000000000000000000000000000000000..66fc3d1b25fc7e0985a552f2cef0cfd7d57e0f06
--- /dev/null
+++ b/app/home/view/approve/mylist.html
@@ -0,0 +1,71 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<div class="body-table layui-tab layui-tab-brief border" lay-filter="tab" style="background-color:#fff; margin:0; border-bottom:0">
+		<ul class="layui-tab-title" style="border:none;">
+			<li class="layui-this">全部</li>
+			<li>待审批</li>
+			<li>审批通过</li>
+			<li>审批拒绝</li>
+		</ul>				
+	</div>
+	<table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+<h3 class="h3-title" style="height:28px;">我申请的审批</h3>
+</script>						
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool ,element=layui.element;
+			
+		element.on('tab(tab)', function(data){
+			layui.pageTable.reload({where:{status:data.index},page:{curr:1}});
+			return false;
+		});			
+			
+		layui.pageTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,defaultToolbar: false
+			,title:'审批列表'
+			,url: "/home/approve/mylist"
+			,page: true //开启分页
+			,limit: 20
+			,cellMinWidth: 80
+			,height: 'full-92'
+			,cols: [[
+					{field:'types_name',title: '审批类型',width:100, align:'center'}
+					,{field:'check_status',title: '审核状态',width:110, align:'center',templet: function(d){
+						var html = '<span class="check-status-color-'+d.check_status+'">『'+d.check_status_str+'』</span>';
+						return html;
+					}}
+					,{field:'admin_name',title: '申请人',width:90,align:'center'}
+					,{field:'create_time',title: '申请时间',width:150,align:'center'}
+					,{field:'department',title: '所属部门',width:120,align:'center'}
+					,{field:'check_users',title: '当前审批人'}
+					,{field:'check_copy_users',title: '抄送人员',width:150}
+					,{width:90,title: '操作', align:'center',templet: function(d){
+						var btn0='<a class="layui-btn layui-btn-xs layui-btn-normal side-a" data-href="'+d.view_url+'?id='+d.id+'">详情</a>';
+						var btn1='<a class="layui-btn layui-btn-xs side-a" data-href="'+d.add_url+'?id='+d.id+'">编辑</a>';
+						var html='';
+						if(d.check_status==0 ||d.check_status ==4){
+							html='<div class="layui-btn-group">'+btn0+btn1+'</div>';
+						}
+						else{
+							html=btn0;
+						}
+						return html;
+					}}
+				]]
+			});
+		}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/area/add.html b/app/home/view/area/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..4c239fa2f3d32b3cfb1d9860b4c4cd1e7cd26110
--- /dev/null
+++ b/app/home/view/area/add.html
@@ -0,0 +1,86 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">省市区</h3>
+	{if condition="$id eq 0"}
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray-2">父级省市区<font>*</font></td>
+			<td>{$pname|default='顶级城市'}</td>
+			<td class="layui-td-gray-2">省市区名称<font>*</font></td>
+			<td><input type="text" name="name" lay-verify="required" autocomplete="off" placeholder="请输入省市区名称" lay-reqText="请输入省市区名称" class="layui-input"></td>
+			<td class="layui-td-gray-2">省市区简称<font>*</font></td>
+			<td><input type="text" name="shortname" lay-verify="required" placeholder="请输入省市区简称" lay-reqText="请输入省市区简称" autocomplete="off" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">经度<font>*</font></td>
+			<td>
+				<input type="text" name="longitude" placeholder="请输入经度" lay-verify="required" lay-reqText="请输入经度" autocomplete="off" class="layui-input">
+			</td>
+			<td class="layui-td-gray">纬度<font>*</font></td>
+			<td>
+				<input type="text" name="latitude" placeholder="请输入纬度" lay-verify="required" lay-reqText="请输入纬度" autocomplete="off" class="layui-input">
+			</td>
+			<td class="layui-td-gray">排序</td>
+			<td><input type="text" name="sort" value="0" placeholder="请输入数字，越大越靠前" autocomplete="off" class="layui-input"></td>
+		</tr>
+	</table>
+	{else/}
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray-2">父级菜单/节点<font>*</font></td>
+			<td>{$detail.pname|default='顶级城市'}</td>
+			<td class="layui-td-gray-2">省市区名称<font>*</font></td>
+			<td><input type="text" name="name" value="{$detail.name}" lay-verify="required" autocomplete="off" placeholder="请输入省市区名称" lay-reqText="请输入省市区名称" class="layui-input"></td>
+			<td class="layui-td-gray-2">省市区简称<font>*</font></td>
+			<td><input type="text" name="shortname" value="{$detail.shortname}" lay-verify="required" placeholder="请输入省市区简称" lay-reqText="请输入省市区简称" autocomplete="off" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">经度<font>*</font></td>
+			<td>
+				<input type="text" name="longitude" value="{$detail.longitude}" placeholder="请输入经度" lay-verify="required" lay-reqText="请输入经度" autocomplete="off" class="layui-input">
+			</td>
+			<td class="layui-td-gray">纬度<font>*</font></td>
+			<td>
+				<input type="text" name="latitude" value="{$detail.latitude}" placeholder="请输入纬度" lay-verify="required" lay-reqText="请输入纬度" autocomplete="off" class="layui-input">
+			</td>
+			<td class="layui-td-gray">排序</td>
+			<td><input type="text" name="sort" value="{$detail.sort}" placeholder="请输入数字，越大越靠前" autocomplete="off" class="layui-input">
+			</td>
+		</tr>
+	</table>
+	{/if}
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$id}">
+		<input type="hidden" name="pid" value="{$pid}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					setTimeout(function(){
+						parent.location.reload();
+					},1000);									
+				}
+			}
+			tool.post("/home/area/add", data.field, callback);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/area/datalist.html b/app/home/view/area/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..6f81e3f06167bb63b2f8a284f4bfbbd3e8accc9b
--- /dev/null
+++ b/app/home/view/area/datalist.html
@@ -0,0 +1,157 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	{eq name="is_area" value="0"}
+	<div class="gg-form-bar border" style="padding-bottom:12px;">
+		<span class="red">全国城市数据还未导入，请点击按钮导入</span> <button class="layui-btn layui-btn-sm import-area">导入省市区数据</button>
+	</div>
+	{else/}
+	<div class="gg-form-bar border-t border-x" style="padding-bottom:0;">
+		<div class="layui-input-inline" style="width: 120px;"><h3>全国省市区</h3></div>		
+		<div class="layui-input-inline" style="width: 260px;">
+			<div class="layui-btn-group" >
+				<a href="/home/api/areaJson?type=province" class="layui-btn layui-bg-blue" target="_blank">导出省</a>
+				<a href="/home/api/areaJson?type=city" class="layui-btn layui-bg-blue" target="_blank">导出市</a>
+				<a href="/home/api/areaJson?type=district" class="layui-btn layui-bg-blue" target="_blank">导出区</a>
+			</div>
+		</div>
+		<div class="layui-input-inline layui-form" id="areaSelect" style="margin:0">
+			<div class="layui-input-inline" style="width: 200px;">
+				<select name="province" class="province-select" data-value="440000" lay-filter="province-1">
+					<option value="">请选择省</option>
+				</select>
+			</div>
+			<div class="layui-input-inline" style="width: 200px;">
+				<select name="city" class="city-select" data-value="440100" lay-filter="city-1">
+					<option value="">请选择市</option>
+				</select>
+			</div>
+			<div class="layui-input-inline" style="width: 200px;">
+				<select name="district" class="district-select" data-value="440106" lay-filter="county-1">
+					<option value="">请选择区</option>
+				</select>
+			</div>
+		</div>
+	</div>
+	<div>
+		<table class="layui-hide" id="treeTable" lay-filter="treeTable"></table>
+	</div>
+	{/eq}
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','areaSelect'];
+	function gouguInit() {
+		var treeTable = layui.treeTable, tool = layui.tool,areaSelect = layui.areaSelect;
+		areaSelect.render({
+			elem: '#areaSelect',
+			change: function (res) {
+				//选择结果
+				console.log(res);
+			}
+		});
+		
+		layui.trees = treeTable.render({
+			elem: '#treeTable'
+			,url: "/home/area/datalist"
+			,tree: { // treeTable 特定属性集
+				customName: {name:'name'},
+				data: {},
+				view: {showIcon:false},
+				async: {},
+				callback: {}
+			}
+			, cellMinWidth: 80
+			, cols: [[
+				{ field: 'id', width: 80, title: 'ID号', align: 'center' }
+				, { field: 'sort', width: 60, title: '排序', align: 'center' }
+				, { field: 'name', width: 200, title: '名称' }
+				, { field: 'pid', title: '父ID', width: 80, align: 'center' }
+				, { field: 'shortname', width: 100, title: '简称' }
+				, { field: 'longitude', title: '经度' }
+				, { field: 'latitude', title: '纬度' }
+				, { field: 'level', title: '级别', width: 80, align: 'center'}
+				, {
+					field: 'status', width: 100, title: '是否开启', align: 'center', templet: function (d) {
+						var html = '<span style="color:#fbbc05">禁用</span>';
+						if (d.status == '1') {
+							html = '<span style="color:#12bb37">开启</span>';
+						}
+						return html;
+					}
+				}
+				, {
+					width: 188, title: '操作', align: 'center'
+					, templet: function (d) {
+						var html = '<span class="layui-btn-group"><button class="layui-btn layui-btn-xs" lay-event="add">添加子城市</button><button class="layui-btn layui-btn-normal  layui-btn-xs" lay-event="edit">编辑</button><button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</button>';
+						if(d.status==0){
+							html = '<span class="layui-btn-group"><button class="layui-btn layui-btn-xs" lay-event="add">添加子城市</button><button class="layui-btn layui-btn-normal  layui-btn-xs" lay-event="edit">编辑</button><button class="layui-btn layui-btn-xs" lay-event="recovery">启用</button>';
+						}
+						return html;
+					}
+				}
+			]]
+			, page: false
+		});
+		//表头工具栏事件
+		$('.add-area').on('click', function () {
+			tool.side("/home/area/add");
+			return;
+		});
+
+		//操作按钮
+		treeTable.on('tool(treeTable)', function (obj) {
+			console.log(obj);
+			if (obj.event === 'add') {
+				tool.side('/home/area/add?pid=' + obj.data.id);
+				return;
+			}
+			if (obj.event === 'edit') {
+				tool.side('/home/area/add?id=' + obj.data.id);
+				return;
+			}
+			if (obj.event === 'disable') {
+				layer.confirm('确定要禁用吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							location.reload();
+						}
+					}
+					tool.delete("/home/area/set", { id: obj.data.id,status:0}, callback);
+					layer.close(index);
+				});
+			}
+			if (obj.event === 'recovery') {
+				layer.confirm('确定要禁用吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							location.reload();
+						}
+					}
+					tool.delete("/home/area/set", { id: obj.data.id,status:1}, callback);
+					layer.close(index);
+				});
+			}
+		});
+		
+		$('.import-area').on('click', function () {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					//location.reload();
+				}
+			}
+			tool.post("/home/area/set", {id:0}, callback);
+			return;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/cate/car_cate.html b/app/home/view/cate/car_cate.html
new file mode 100644
index 0000000000000000000000000000000000000000..a17901ba6013e5e01797b115d19ea3b252f16fb7
--- /dev/null
+++ b/app/home/view/cate/car_cate.html
@@ -0,0 +1,146 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+    <table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm addNew" type="button">+ 添加车辆类型</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool, form = layui.form;
+		layui.pageTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,defaultToolbar: false
+			,title:'车辆类型列表'
+			,url: "/home/cate/car_cate"
+			,page: false
+			,cellMinWidth: 80
+			,cols: [[
+					{field:'id',width:80, title: 'ID号', align:'center'}
+					,{field:'title',title: '车辆名称'}
+					,{field:'name',title: '车牌号码'}
+					,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+						var html1='<span class="green">正常</span>';
+						var html2='<span class="yellow">禁用</span>';
+						if(d.status==1){
+							return html1;
+						}
+						else{
+							return html2;
+						}
+					}}
+					,{width:100,title: '操作', align:'center',templet: function(d){
+						var html='';
+						var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
+						var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+						var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+						if(d.status==1){
+							html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+						}
+						else{
+							html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+						}
+						return html;
+					}}
+				]]
+			});
+			
+			table.on('tool(test)',function (obj) {
+				if(obj.event === 'edit'){					
+					addExpense(obj.data.id,obj.data.title,obj.data.name);
+				}
+				if(obj.event === 'disable'){
+					layer.confirm('确定要禁用该车辆吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/home/cate/car_cate_check", { id: obj.data.id,status: 0}, callback);
+						layer.close(index);
+					});
+				}
+				if(obj.event === 'open'){
+					layer.confirm('确定要启用该车辆吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/home/cate/car_cate_check", { id: obj.data.id,status: 1}, callback);
+						layer.close(index);
+					});
+				}
+			});
+			
+			$('body').on('click','.addNew',function(){
+				addExpense(0,'','');	
+			});
+			
+			function addExpense(id,title,name){
+				var biaoti = '新增车辆';
+				if(id>0){
+					biaoti = '编辑车辆';
+				}			
+				
+				layer.open({
+					type: 1
+					,title: biaoti
+					,area: '368px;'
+					,id: 'LAY_module' //设定一个id，防止重复弹出
+					,btn: ['确定', '取消']
+					,btnAlign: 'c'
+					,content: '<div style="padding-top:15px;">\
+								<div class="layui-form-item">\
+								  <label class="layui-form-label">车辆名称</label>\
+								  <div class="layui-input-inline">\
+									<input type="hidden" name="id" value="'+id+'">\
+									<input type="text" name="title" autocomplete="off" value="'+title+'" placeholder="请输入车辆名称" class="layui-input">\
+								  </div>\
+								</div>\
+								<div class="layui-form-item">\
+								  <label class="layui-form-label">车牌号码</label>\
+								  <div class="layui-input-inline">\
+									<input type="text" name="name" autocomplete="off" value="'+name+'" placeholder="请输入车牌号码" class="layui-input">\
+								  </div>\
+								</div>\
+							  </div>'
+					,yes: function(index){
+						let id = $('#LAY_module').find('[name="id"]').val();
+						let title = $('#LAY_module').find('[name="title"]').val();
+						let name = $('#LAY_module').find('[name="name"]').val();
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();	
+								layer.close(index);			
+							}
+						}
+						tool.post("/home/cate/car_cate_add", {
+							id: id,
+							title: title,
+							name: name
+						}, callback);						
+					}
+					,btn2: function(){
+						layer.closeAll();
+					}
+				});
+			}
+		}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/cate/cost_cate.html b/app/home/view/cate/cost_cate.html
new file mode 100644
index 0000000000000000000000000000000000000000..1fdbd4fbea62306e6389f47680a7292ac916a5fc
--- /dev/null
+++ b/app/home/view/cate/cost_cate.html
@@ -0,0 +1,121 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+    <table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm addNew" type="button">+ 添加费用类型</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool, form = layui.form;
+		layui.pageTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,defaultToolbar: false
+			,title:'费用类型列表'
+			,url: "/home/cate/cost_cate"
+			,page: false
+			,cellMinWidth: 80
+			,cols: [[
+					{field:'id',width:80, title: 'ID号', align:'center'}
+					,{field:'title',title: '类别名称'}
+					,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+						var html1='<span class="green">正常</span>';
+						var html2='<span class="yellow">禁用</span>';
+						if(d.status==1){
+							return html1;
+						}
+						else{
+							return html2;
+						}
+					}}
+					,{width:100,title: '操作', align:'center',templet: function(d){
+						var html='';
+						var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
+						var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+						var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+						if(d.status==1){
+							html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+						}
+						else{
+							html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+						}
+						return html;
+					}}
+				]]
+			});
+			
+			table.on('tool(test)',function (obj) {
+				if(obj.event === 'edit'){					
+					addExpense(obj.data.id,obj.data.title);
+				}
+				if(obj.event === 'disable'){
+					layer.confirm('确定要禁用该类别吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/home/cate/cost_cate_check", { id: obj.data.id,status: 0,title: obj.data.title}, callback);
+						layer.close(index);
+					});
+				}
+				if(obj.event === 'open'){
+					layer.confirm('确定要启用该类别吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/home/cate/cost_cate_check", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
+						layer.close(index);
+					});
+				}
+			});
+			
+			$('body').on('click','.addNew',function(){
+				addExpense(0,'');	
+			});
+			
+			function addExpense(id,val){
+				var title = '新增类别';
+				if(id>0){
+					title = '编辑类别';
+				}
+				layer.prompt({
+					title: title,
+					value: val,
+					yes: function(index, layero) {
+						// 获取文本框输入的值
+						var value = layero.find(".layui-layer-input").val();
+						if (value) {
+							let callback = function (e) {
+								layer.msg(e.msg);
+								if (e.code == 0) {
+									layui.pageTable.reload();				
+								}
+							}
+							tool.post("/home/cate/cost_cate_add", {id: id,title: value}, callback);
+							layer.close(index);
+						} else {
+							layer.msg('请填写类别标题');
+						}
+					}
+				})
+			}
+		}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/cate/enterprise.html b/app/home/view/cate/enterprise.html
new file mode 100644
index 0000000000000000000000000000000000000000..f39c461380aed03f2ce44e1a0d21355810dee5b1
--- /dev/null
+++ b/app/home/view/cate/enterprise.html
@@ -0,0 +1,96 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+    <table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm add-new" type="button">+ 添加企业主体</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool, form = layui.form;
+		layui.pageTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,defaultToolbar: false
+			,title:'企业主体列表'
+			,url: "/home/cate/enterprise"
+			,page: false
+			,cellMinWidth: 80
+			,cols: [[
+					{field:'id',width:80, title: 'ID号', align:'center'}
+					,{field:'title',title: '企业主体名称',width:300}
+					,{field:'city',title: '所在城市',width:150, align:'center'}
+					,{field:'address',title: '详细地址'}
+					,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+						var html1='<span class="green">正常</span>';
+						var html2='<span class="yellow">禁用</span>';
+						if(d.status==1){
+							return html1;
+						}
+						else{
+							return html2;
+						}
+					}}
+					,{width:100,title: '操作', align:'center',templet: function(d){
+						var html='';
+						var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
+						var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+						var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+						if(d.status==1){
+							html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+						}
+						else{
+							html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+						}
+						return html;
+					}}
+				]]
+			});
+			
+			table.on('tool(test)',function (obj) {
+				if(obj.event === 'edit'){					
+					tool.side('/home/cate/enterprise_add/id/'+obj.data.id);
+				}
+				if(obj.event === 'disable'){
+					layer.confirm('确定要禁用该企业主体吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/home/cate/enterprise_check", { id: obj.data.id,status: 0}, callback);
+						layer.close(index);
+					});
+				}
+				if(obj.event === 'open'){
+					layer.confirm('确定要启用该企业主体吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/home/cate/enterprise_check", { id: obj.data.id,status: 1}, callback);
+						layer.close(index);
+					});
+				}
+			});
+			
+			$('body').on('click','.add-new',function(){
+				tool.side('/home/cate/enterprise_add');
+			});
+		}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/cate/enterprise_add.html b/app/home/view/cate/enterprise_add.html
new file mode 100644
index 0000000000000000000000000000000000000000..ca0907fa60251ab2784047863d7dccbf791e9301
--- /dev/null
+++ b/app/home/view/cate/enterprise_add.html
@@ -0,0 +1,108 @@
+{extend name="../../base/view/common/base" /}
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">企业主体</h3>
+	{if condition="$id eq 0"}
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">企业名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" value="" lay-verify="required" lay-reqText="请完善企业名称" placeholder="请完善企业名称" class="layui-input">
+			</td>
+			<td class="layui-td-gray">所在城市<font>*</font></td>
+			<td>
+				<input type="text" name="city" value="" lay-verify="required" lay-reqText="请完善所在城市" placeholder="请完善所在城市" class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">详细地址<font>*</font></td>
+			<td>
+				<input type="text" name="address" value="" lay-verify="required" lay-reqText="请完善详细地址" placeholder="请完善详细地址" class="layui-input">
+			</td>
+			<td class="layui-td-gray-2">纳税人识别号</td>
+			<td><input type="text" name="tax_num" value="" lay-verify="required" lay-reqText="请完善纳税人识别号" placeholder="请完善纳税人识别号" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">开户银行</td>
+			<td>
+				<input type="text" name="bank" value="" placeholder="请完善开户银行" class="layui-input">
+			</td>
+			<td class="layui-td-gray">银行帐号</td>
+			<td><input type="text" name="bank_sn" value="" placeholder="请完善银行帐号" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">备注信息</td>
+			<td colspan="3">
+				<textarea name="remark" placeholder="请输入描述" class="layui-textarea" style="height: 120px;"></textarea>
+			</td>
+		</tr>
+	</table>
+	{else/}
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">企业名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" value="{$detail.title}" lay-verify="required" lay-reqText="请完善企业名称" placeholder="请完善企业名称" class="layui-input">
+			</td>
+			<td class="layui-td-gray">所在城市<font>*</font></td>
+			<td>
+				<input type="text" name="city" value="{$detail.city}" lay-verify="required" lay-reqText="请完善所在城市" placeholder="请完善所在城市" class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">详细地址<font>*</font></td>
+			<td>
+				<input type="text" name="address" value="{$detail.address}" lay-verify="required" lay-reqText="请完善详细地址" placeholder="请完善详细地址" class="layui-input">
+			</td>
+			<td class="layui-td-gray-2">纳税人识别号</td>
+			<td><input type="text" name="tax_num" value="{$detail.tax_num}" lay-verify="required" lay-reqText="请完善纳税人识别号" placeholder="请完善纳税人识别号" class="layui-input"></td>
+		</tr>	
+		<tr>
+			<td class="layui-td-gray">开户银行</td>
+			<td>
+				<input type="text" name="bank" value="{$detail.bank}" placeholder="请完善开户银行" class="layui-input">
+			</td>
+			<td class="layui-td-gray">银行帐号</td>
+			<td><input type="text" name="bank_sn" value="{$detail.bank_sn}" placeholder="请完善银行帐号" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">备注信息</td>
+			<td colspan="3">
+				<textarea name="remark" placeholder="请输入描述" class="layui-textarea" style="height: 120px;">{$detail.remark}</textarea>
+			</td>
+		</tr>
+	</table>
+	{/if}
+	<div class="pt-4">
+		<input type="hidden" value="{$id}" name="id">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">提交保存</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool;
+		//监听发送
+		form.on('submit(webform)', function(data){
+			$.ajax({
+				url: "/home/cate/enterprise_add",
+				type:'post',
+				data:data.field,
+				success:function(e){
+					layer.msg(e.msg);
+					if (e.code == 0) {						
+						tool.sideClose(1000);
+					}
+				}
+			})
+			return false;
+		});
+	}		
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/cate/expense_cate.html b/app/home/view/cate/expense_cate.html
new file mode 100644
index 0000000000000000000000000000000000000000..48a67d09b2f1d027ab477c286685ed631a624788
--- /dev/null
+++ b/app/home/view/cate/expense_cate.html
@@ -0,0 +1,121 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+    <table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm addNew" type="button">+ 添加报销类别</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool, form = layui.form;
+		layui.pageTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,defaultToolbar: false
+			,title:'报销类别列表'
+			,url: "/home/cate/expense_cate"
+			,page: false
+			,cellMinWidth: 80
+			,cols: [[
+					{field:'id',width:80, title: 'ID号', align:'center'}
+					,{field:'title',title: '类别名称'}
+					,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+						var html1='<span class="green">正常</span>';
+						var html2='<span class="yellow">禁用</span>';
+						if(d.status==1){
+							return html1;
+						}
+						else{
+							return html2;
+						}
+					}}
+					,{width:100,title: '操作', align:'center',templet: function(d){
+						var html='';
+						var btn='<a class="layui-btn  layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
+						var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+						var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+						if(d.status==1){
+							html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+						}
+						else{
+							html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+						}
+						return html;
+					}}
+				]]
+			});
+			
+			table.on('tool(test)',function (obj) {
+				if(obj.event === 'edit'){					
+					addExpense(obj.data.id,obj.data.title);
+				}
+				if(obj.event === 'disable'){
+					layer.confirm('确定要禁用该类别吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/home/cate/expense_cate_check", { id: obj.data.id,status: 0,title: obj.data.title}, callback);
+						layer.close(index);
+					});
+				}
+				if(obj.event === 'open'){
+					layer.confirm('确定要启用该类别吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/home/cate/expense_cate_check", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
+						layer.close(index);
+					});
+				}
+			});
+			
+			$('body').on('click','.addNew',function(){
+				addExpense(0,'');	
+			});
+			
+			function addExpense(id,val){
+				var title = '新增类别';
+				if(id>0){
+					title = '编辑类别';
+				}
+				layer.prompt({
+					title: title,
+					value: val,
+					yes: function(index, layero) {
+						// 获取文本框输入的值
+						var value = layero.find(".layui-layer-input").val();
+						if (value) {
+							let callback = function (e) {
+								layer.msg(e.msg);
+								if (e.code == 0) {
+									layui.pageTable.reload();				
+								}
+							}
+							tool.post("/home/cate/expense_cate_add", {id: id,title: value}, callback);
+							layer.close(index);
+						} else {
+							layer.msg('请填写类别标题');
+						}
+					}
+				})
+			}
+		}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/cate/flow_type.html b/app/home/view/cate/flow_type.html
new file mode 100644
index 0000000000000000000000000000000000000000..6b32c84afcfe36ad73de5ed6013c804839317423
--- /dev/null
+++ b/app/home/view/cate/flow_type.html
@@ -0,0 +1,102 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+    <table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm addNew" type="button">+ 添加审批类型</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool;
+		layui.pageTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,defaultToolbar: false
+			,title:'审批模块列表'
+			,url: "/home/cate/flow_type"
+			,page: false
+			,cellMinWidth: 80
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',title: '名称',width:120}
+				,{field:'department',title: '应用部门'}
+				,{field:'name',title: '标识',width:150}
+				,{field:'icon',title: '图标',width:220,templet: function(d){
+					var html='<strong class="iconfont '+d.icon+'"></strong> '+d.icon;
+					return html;
+				}}
+				,{field:'type_name', title: '所属分类',width:90,align:'center'}
+				,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+					var html1='<span class="green">正常</span>';
+					var html2='<span class="yellow">禁用</span>';
+					if(d.status==1){
+						return html1;
+					}
+					else{
+						return html2;
+					}
+				}}
+				,{width:100,title: '操作', align:'center',templet: function(d){
+					var html='';
+					var btn='<a class="layui-btn layui-btn-normal  layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+					if(d.status==1){
+						html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+					}
+					else{
+						html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+					}
+					return html;
+				}}
+			]]
+		});
+			
+		table.on('tool(test)',function (obj) {
+			if(obj.event === 'edit'){
+				tool.side("/home/cate/flow_type_add?id="+obj.data.id);
+			}
+			if(obj.event === 'disable'){
+				layer.confirm('确定要禁用该模块吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/home/cate/flow_type_check", { id: obj.data.id,status: 0}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'open'){
+				layer.confirm('确定要启用该模块吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/home/cate/flow_type_check", { id: obj.data.id,status: 1}, callback);
+					layer.close(index);
+				});
+			}
+		});
+		
+		$('body').on('click','.addNew',function(){
+			tool.side("/home/cate/flow_type_add");
+			return false;
+		});		
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/cate/flow_type_add.html b/app/home/view/cate/flow_type_add.html
new file mode 100644
index 0000000000000000000000000000000000000000..977c395bdd8e651d8c3351a8a6d073e4366e16a5
--- /dev/null
+++ b/app/home/view/cate/flow_type_add.html
@@ -0,0 +1,123 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">审批类型</h3>
+	{eq name="$id" value="0"}
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">所属分类<font>*</font></td>
+			<td>
+				<select name="type" lay-verify="required" lay-reqText="请选择所属分类">
+				  <option value="">--请选择--</option>
+				  {volist name="$type" id="vo"}
+				  <option value="{$vo.id}">{$vo.title}</option>
+				  {/volist}
+				</select>
+			</td>
+			<td class="layui-td-gray">名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" autocomplete="off" placeholder="请输入审批类型名称" lay-verify="required" lay-reqText="请输入审批类型名称" class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">标识<font>*</font></td>
+			<td>
+				<input type="text" name="name" placeholder="请输入审批类型标识" value="" autocomplete="off" lay-verify="required" lay-reqText="请输入审批类型标识" class="layui-input">
+			</td>
+			<td class="layui-td-gray">图标<font>*</font></td>
+			<td>
+				<input style="width:200px; display:inline" class="layui-input" type="text" name="icon" value="" placeholder="请输入审批类型图标" lay-verify="required" lay-reqText="请输入审批类型图标" >			
+				如：icon-jichupeizhi<a href="{__GOUGU__}/icon/index.html" target="_blank" style="margin-left:10px; color:#007AFF">[查看图标]</a>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">应用部门</td>
+			<td colspan="3">
+				<div class="layui-input-inline" style="width:360px;">
+					<select id="department_ids" name="department_ids" xm-selected="" xm-select="select1" xm-select-skin="default"></select>
+				</div>
+				<span style="color: red; font-size: 12px;">（如果不选，默认是全公司）</span>
+			</td>
+		</tr>
+		<tr>
+			<td colspan="4">
+				<span style="color: red; font-size: 12px;">注意：新增审批类型以后，需要对应新增模板文件，模板文件名称需与标识名称一致，建议复制现有的审批类型模板文件，然后根据需求修改对应的表单即可。</span>
+			</td>
+		</tr>
+	</table>
+	{else/}
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">所属分类<font>*</font></td>
+			<td>
+				<select name="type" lay-verify="required" lay-reqText="请选择所属分类">
+				  <option value="">--请选择--</option>
+				  {volist name="$type" id="vo"}
+				  <option value="{$vo.id}" {eq name="$detail.type" value="$vo.id"}selected=""{/eq}>{$vo.title}</option>
+				  {/volist}
+				</select>
+			</td>
+			<td class="layui-td-gray">名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" value="{$detail.title}" placeholder="请输入审批类型名称" lay-verify="required" lay-reqText="请输入审批类型名称" class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">标识<font>*</font></td>
+			<td>
+				<input type="text" name="name" placeholder="请输入审批类型标识" value="{$detail.name}" autocomplete="off" lay-verify="required" lay-reqText="请输入审批类型标识" class="layui-input">
+			</td>
+			<td class="layui-td-gray">图标<font>*</font></td>
+			<td>
+				<input style="width:200px; display:inline" class="layui-input" type="text" name="icon" value="{$detail.icon}" placeholder="请输入审批类型图标" lay-verify="required" lay-reqText="请输入审批类型图标" >			
+				<strong class="iconfont {$detail.icon}"></strong><a href="{__GOUGU__}/icon/index.html" target="_blank" style="margin-left:10px; color:#007AFF">[查看图标]</a>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">应用部门</td>
+			<td colspan="3">
+				<div class="layui-input-inline" style="width:360px;">
+					<select id="department_ids" name="department_ids" xm-selected="{$detail.department_ids}" xm-select="select1" xm-select-skin="default"></select>
+				</div>
+				<span style="color: red; font-size: 12px;">（如果不选，默认是全公司）</span>
+			</td>
+		</tr>
+	</table>
+	{/eq}
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+    </div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','formSelects'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,formSelects=layui.formSelects;
+		//选择应用部门
+		var selcted = $('#department_ids').attr('xm-selected');
+		formSelects.data('select1', 'server', {
+			url: '/api/index/get_department_select',
+			keyword: selcted,
+		});		
+		//监听提交
+		form.on('submit(webform)', function(data){
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);				
+				}
+			}
+			tool.post("/home/cate/flow_type_add", data.field, callback);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/cate/industry_cate.html b/app/home/view/cate/industry_cate.html
new file mode 100644
index 0000000000000000000000000000000000000000..55e02b954be715189d958f0fd3f0e71e43ec18ac
--- /dev/null
+++ b/app/home/view/cate/industry_cate.html
@@ -0,0 +1,121 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+    <table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm addNew" type="button">+ 添加行业类型</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool, form = layui.form;
+		layui.pageTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,defaultToolbar: false
+			,title:'工作类型列表'
+			,url: "/home/cate/industry_cate"
+			,page: false
+			,cellMinWidth: 80
+			,cols: [[
+					{field:'id',width:80, title: 'ID号', align:'center'}
+					,{field:'title',title: '类型名称'}
+					,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+						var html1='<span class="green">正常</span>';
+						var html2='<span class="yellow">禁用</span>';
+						if(d.status==1){
+							return html1;
+						}
+						else{
+							return html2;
+						}
+					}}
+					,{width:100,title: '操作', align:'center',templet: function(d){
+						var html='';
+						var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
+						var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+						var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+						if(d.status==1){
+							html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+						}
+						else{
+							html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+						}
+						return html;
+					}}
+				]]
+			});
+			
+			table.on('tool(test)',function (obj) {
+				if(obj.event === 'edit'){					
+					addExpense(obj.data.id,obj.data.title);
+				}
+				if(obj.event === 'disable'){
+					layer.confirm('确定要禁用该类型吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/home/cate/industry_cate_check", { id: obj.data.id,status: 0,title: obj.data.title}, callback);
+						layer.close(index);
+					});
+				}
+				if(obj.event === 'open'){
+					layer.confirm('确定要启用该类型吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/home/cate/industry_cate_check", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
+						layer.close(index);
+					});
+				}
+			});
+			
+			$('body').on('click','.addNew',function(){
+				addExpense(0,'');	
+			});
+			
+			function addExpense(id,val){
+				var title = '新增类型';
+				if(id>0){
+					title = '编辑类型';
+				}
+				layer.prompt({
+					title: title,
+					value: val,
+					yes: function(index, layero) {
+						// 获取文本框输入的值
+						var value = layero.find(".layui-layer-input").val();
+						if (value) {
+							let callback = function (e) {
+								layer.msg(e.msg);
+								if (e.code == 0) {
+									layui.pageTable.reload();				
+								}
+							}
+							tool.post("/home/cate/industry_cate_add", {id: id,title: value}, callback);
+							layer.close(index);
+						} else {
+							layer.msg('请填写类型标题');
+						}
+					}
+				})
+			}
+		}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/cate/seal_cate.html b/app/home/view/cate/seal_cate.html
new file mode 100644
index 0000000000000000000000000000000000000000..b49f4e306a192ea0a0b049ba9b181bd9a79331a7
--- /dev/null
+++ b/app/home/view/cate/seal_cate.html
@@ -0,0 +1,121 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+    <table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm addNew" type="button">+ 添加印章类型</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool, form = layui.form;
+		layui.pageTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,defaultToolbar: false
+			,title:'印章类型列表'
+			,url: "/home/cate/seal_cate"
+			,page: false
+			,cellMinWidth: 80
+			,cols: [[
+					{field:'id',width:80, title: 'ID号', align:'center'}
+					,{field:'title',title: '类别名称'}
+					,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+						var html1='<span class="green">正常</span>';
+						var html2='<span class="yellow">禁用</span>';
+						if(d.status==1){
+							return html1;
+						}
+						else{
+							return html2;
+						}
+					}}
+					,{width:100,title: '操作', align:'center',templet: function(d){
+						var html='';
+						var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
+						var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+						var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+						if(d.status==1){
+							html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+						}
+						else{
+							html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+						}
+						return html;
+					}}
+				]]
+			});
+			
+			table.on('tool(test)',function (obj) {
+				if(obj.event === 'edit'){					
+					addExpense(obj.data.id,obj.data.title);
+				}
+				if(obj.event === 'disable'){
+					layer.confirm('确定要禁用该类别吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/home/cate/seal_cate_check", { id: obj.data.id,status: 0,title: obj.data.title}, callback);
+						layer.close(index);
+					});
+				}
+				if(obj.event === 'open'){
+					layer.confirm('确定要启用该类别吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/home/cate/seal_cate_check", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
+						layer.close(index);
+					});
+				}
+			});
+			
+			$('body').on('click','.addNew',function(){
+				addExpense(0,'');	
+			});
+			
+			function addExpense(id,val){
+				var title = '新增类别';
+				if(id>0){
+					title = '编辑类别';
+				}
+				layer.prompt({
+					title: title,
+					value: val,
+					yes: function(index, layero) {
+						// 获取文本框输入的值
+						var value = layero.find(".layui-layer-input").val();
+						if (value) {
+							let callback = function (e) {
+								layer.msg(e.msg);
+								if (e.code == 0) {
+									layui.pageTable.reload();				
+								}
+							}
+							tool.post("/home/cate/seal_cate_add", {id: id,title: value}, callback);
+							layer.close(index);
+						} else {
+							layer.msg('请填写类别标题');
+						}
+					}
+				})
+			}
+		}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/cate/services_cate.html b/app/home/view/cate/services_cate.html
new file mode 100644
index 0000000000000000000000000000000000000000..8d1bf01ae9ff66b7d048120c0b49ba3504231f1d
--- /dev/null
+++ b/app/home/view/cate/services_cate.html
@@ -0,0 +1,121 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+    <table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm addNew" type="button">+ 添加服务类型</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool, form = layui.form;
+		layui.pageTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,defaultToolbar: false
+			,title:'工作类型列表'
+			,url: "/home/cate/services_cate"
+			,page: false
+			,cellMinWidth: 80
+			,cols: [[
+					{field:'id',width:80, title: 'ID号', align:'center'}
+					,{field:'title',title: '类型名称'}
+					,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+						var html1='<span class="green">正常</span>';
+						var html2='<span class="yellow">禁用</span>';
+						if(d.status==1){
+							return html1;
+						}
+						else{
+							return html2;
+						}
+					}}
+					,{width:100,title: '操作', align:'center',templet: function(d){
+						var html='';
+						var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
+						var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+						var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+						if(d.status==1){
+							html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+						}
+						else{
+							html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+						}
+						return html;
+					}}
+				]]
+			});
+			
+			table.on('tool(test)',function (obj) {
+				if(obj.event === 'edit'){					
+					addExpense(obj.data.id,obj.data.title);
+				}
+				if(obj.event === 'disable'){
+					layer.confirm('确定要禁用该类型吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/home/cate/services_cate_check", { id: obj.data.id,status: 0,title: obj.data.title}, callback);
+						layer.close(index);
+					});
+				}
+				if(obj.event === 'open'){
+					layer.confirm('确定要启用该类型吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/home/cate/services_cate_check", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
+						layer.close(index);
+					});
+				}
+			});
+			
+			$('body').on('click','.addNew',function(){
+				addExpense(0,'');	
+			});
+			
+			function addExpense(id,val){
+				var title = '新增类型';
+				if(id>0){
+					title = '编辑类型';
+				}
+				layer.prompt({
+					title: title,
+					value: val,
+					yes: function(index, layero) {
+						// 获取文本框输入的值
+						var value = layero.find(".layui-layer-input").val();
+						if (value) {
+							let callback = function (e) {
+								layer.msg(e.msg);
+								if (e.code == 0) {
+									layui.pageTable.reload();				
+								}
+							}
+							tool.post("/home/cate/services_cate_add", {id: id,title: value}, callback);
+							layer.close(index);
+						} else {
+							layer.msg('请填写类型标题');
+						}
+					}
+				})
+			}
+		}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/cate/work_cate.html b/app/home/view/cate/work_cate.html
new file mode 100644
index 0000000000000000000000000000000000000000..f6432e7a57cfa6247bfc204659c4a8f2217d13d1
--- /dev/null
+++ b/app/home/view/cate/work_cate.html
@@ -0,0 +1,121 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+    <table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm addNew" type="button">+ 添加工作类型</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool, form = layui.form;
+		layui.pageTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,defaultToolbar: false
+			,title:'工作类型列表'
+			,url: "/home/cate/work_cate"
+			,page: false
+			,cellMinWidth: 80
+			,cols: [[
+					{field:'id',width:80, title: 'ID号', align:'center'}
+					,{field:'title',title: '类别名称'}
+					,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+						var html1='<span class="green">正常</span>';
+						var html2='<span class="yellow">禁用</span>';
+						if(d.status==1){
+							return html1;
+						}
+						else{
+							return html2;
+						}
+					}}
+					,{width:100,title: '操作', align:'center',templet: function(d){
+						var html='';
+						var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
+						var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+						var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+						if(d.status==1){
+							html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+						}
+						else{
+							html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+						}
+						return html;
+					}}
+				]]
+			});
+			
+			table.on('tool(test)',function (obj) {
+				if(obj.event === 'edit'){					
+					addExpense(obj.data.id,obj.data.title);
+				}
+				if(obj.event === 'disable'){
+					layer.confirm('确定要禁用该类别吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/home/cate/work_cate_check", { id: obj.data.id,status: 0,title: obj.data.title}, callback);
+						layer.close(index);
+					});
+				}
+				if(obj.event === 'open'){
+					layer.confirm('确定要启用该类别吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/home/cate/work_cate_check", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
+						layer.close(index);
+					});
+				}
+			});
+			
+			$('body').on('click','.addNew',function(){
+				addExpense(0,'');	
+			});
+			
+			function addExpense(id,val){
+				var title = '新增类别';
+				if(id>0){
+					title = '编辑类别';
+				}
+				layer.prompt({
+					title: title,
+					value: val,
+					yes: function(index, layero) {
+						// 获取文本框输入的值
+						var value = layero.find(".layui-layer-input").val();
+						if (value) {
+							let callback = function (e) {
+								layer.msg(e.msg);
+								if (e.code == 0) {
+									layui.pageTable.reload();				
+								}
+							}
+							tool.post("/home/cate/work_cate_add", {id: id,title: value}, callback);
+							layer.close(index);
+						} else {
+							layer.msg('请填写类别标题');
+						}
+					}
+				})
+			}
+		}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/conf/add.html b/app/home/view/conf/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..9632572b3f29853f33d4064ae716095a237be213
--- /dev/null
+++ b/app/home/view/conf/add.html
@@ -0,0 +1,68 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">配置项</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">配置名称<font>*</font>
+			</td>
+			<td>
+				<input type="hidden" name="id" value="{$id}" />
+				<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入配置名称" lay-reqText="请输入配置名称" class="layui-input" value="{$config.title|default=''}">
+			</td>
+			<td class="layui-td-gray">状态<font>*</font>
+			</td>
+			<td>{if condition="$id eq 0"}
+				<input type="radio" name="status" value="1" title="正常" checked>
+				<input type="radio" name="status" value="0" title="禁用">
+				{else/}
+				<input type="radio" name="status" value="1" title="正常" {eq name="$config.status" value="1"} checked{/eq}>
+				<input type="radio" name="status" value="0" title="禁用" {eq name="$config.status" value="0"} checked{/eq}>
+				{/if}
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">
+				配置标识<font>*</font>
+			</td>
+			<td colspan="3">
+				<input type="text" name="name" lay-verify="required" placeholder="请输入配置标识" lay-reqText="请输入配置标识"
+					autocomplete="off" class="layui-input" value="{$config.name|default=''}">
+			</td>
+		</tr>
+		<tr>
+			<td colspan="4">
+				<span class="red">注意：新增配置项以后，需要对应新增模板文件，模板文件名称需与标识名称一致，建议复制现有的配置模板文件，然后根据需求修改对应的表单即可。</span>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			tool.post("/home/conf/add", data.field, callback);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/conf/email.html b/app/home/view/conf/email.html
new file mode 100644
index 0000000000000000000000000000000000000000..439987b82a6ec6d1e4cfdbc0b02ec7d0df465d2d
--- /dev/null
+++ b/app/home/view/conf/email.html
@@ -0,0 +1,118 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">邮箱配置</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray-2">SMTP地址<font>*</font></td>
+			<td>
+				<input type="hidden" name="id" value="{$id}">
+				<input type="text" name="smtp" lay-verify="required" autocomplete="off" placeholder="请输入SMTP服务器地址" lay-reqText="请输入SMTP服务器地址" class="layui-input" value="{$config.smtp|default=''}" style="width:240px;display: inline-block;">
+				<span style="color:#999; font-size:12px; margin-left:5px">如：QQ邮箱的SMTP服务器地址是smtp.qq.com，163邮箱的SMTP服务器地址是smtp.163.com</span>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">协议端口号<font>*</font></td>
+			<td>
+				<input type="text" name="smtp_port" lay-verify="required" autocomplete="off" placeholder="请输入端口" lay-reqText="请输入端口" class="layui-input" value="{$config.smtp_port|default=''}"  style="width:240px;display: inline-block;"><span style="color:#999; font-size:12px; margin-left:5px">如：QQ邮箱的ssl协议方式端口号是465/587，163邮箱的ssl协议方式端口号是465/994</span>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">邮箱账户<font>*</font></td>
+			<td><input type="text" name="smtp_user" autocomplete="off" lay-verify="required" placeholder="请输入邮箱用户名" lay-reqText="请输入邮箱用户名" class="layui-input" value="{$config.smtp_user|default=''}"style="width:240px;display: inline-block;"><span style="color:#999; font-size:12px; margin-left:5px">如：gougucms@qq.com</span>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">邮箱密码<font>*</font></td>
+			<td><input type="password" name="smtp_pwd" lay-verify="required" autocomplete="off" placeholder="请输入邮箱密码" class="layui-input" value="{$config.smtp_pwd|default=''}" style="width:240px;display: inline-block;"><span style="color:#999; font-size:12px; margin-left:5px">不一定是登录密码，如QQ邮箱的是第三方授权登录码，要自己去开启，在邮箱的设置->账户->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务</span>
+			</td>
+		</tr>
+
+		<tr>
+			<td class="layui-td-gray">发送人<font>*</font></td>
+			<td>
+				<input type="text" name="from" autocomplete="off" lay-verify="required" placeholder="请输入要显示的发送者" lay-reqText="请输入要显示的发送者" class="layui-input" value="{$config.from|default=''}" style="width:240px; display: inline-block;">
+				<span style="color:#999; font-size:12px; margin-left:5px">用于展示给发送方，如：勾股CMS系统管理员</span>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">显示的邮箱<font>*</font></td>
+			<td>
+				<input type="text" name="email" lay-verify="required" autocomplete="off" placeholder="请输入要显示的发送者邮箱" lay-reqText="请输入要显示的发送者邮箱" class="layui-input" value="{$config.email|default=''}" style="width:240px;display: inline-block;">
+				<span style="color:#999; font-size:12px; margin-left:5px">可以不同于上面的账户，用于展示给发送方的邮箱，如：admin@gougucms.com</span>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">邮件模板</td>
+			<td><textarea name="template" placeholder="" class="layui-textarea" id="container">{$config.template|default=''}</textarea>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button lay-event="email" class="layui-btn">发送测试</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool', 'tinymce'];
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool, tinymce = layui.tinymce;
+
+		var edit = tinymce.render({
+			selector: "#container",
+			height: 320
+		});
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			data.field.template = tinyMCE.editors['container'].getContent();
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			tool.post("/home/conf/edit", data.field, callback);
+			return false;
+		});
+
+		$('body').on('click', '[lay-event="email"]', function () {
+			layer.prompt({
+				formType: 0,
+				value: '',
+				title: '输入接收测试邮件的邮箱',
+				id: 'email_to'
+			}, function (value, index, elem) {
+				var isEmail = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
+				if (value.length < 6 || !(isEmail.test(value))) {
+					layer.tips('请正确输入邮箱', elem);
+					return false;
+				}
+				$.ajax({
+					url: "/api/index/email_test",
+					data: { email: value },
+					type: "post",
+					beforeSend: function () {
+						// 禁用按钮防止重复提交
+						$("#email_to input").val('');
+					},
+					success: function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layer.close(index);
+						}
+					}
+				})
+			});
+			return false;
+		})
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/conf/index.html b/app/home/view/conf/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..a1a9b94bd2243fbed277627838800c665623c4d1
--- /dev/null
+++ b/app/home/view/conf/index.html
@@ -0,0 +1,107 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<table class="layui-hide" id="conf" lay-filter="conf"></table>
+</div>
+
+<script type="text/html" id="status">
+	<i class="layui-icon {{#  if(d.status == 1){ }}green layui-icon-ok{{#  } else { }}red layui-icon-close{{#  } }}"></i>
+</script>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+	<button class="layui-btn layui-btn-sm" lay-event="add">+ 添加配置项</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool, form = layui.form;
+		layui.pageTable = table.render({
+			elem: '#conf',
+			title: '配置列表',
+			toolbar: '#toolbarDemo',
+			defaultToolbar: false,
+			url: "/home/conf/index",
+			cellMinWidth: 80,
+			page: false, //开启分页				
+			limit: 20,
+			cols: [
+				[{
+					field: 'id',
+					width: 80,
+					title: 'ID编号',
+					align: 'center'
+				}, {
+					field: 'title',
+					width: 200,
+					title: '配置名称'
+				}, {
+					field: 'name',
+					title: '配置标识<span class="red">（新增的模板文件名称需与标识名称一致）</span>'
+				}, {
+					field: 'status',
+					width: 80,
+					title: '状态',
+					templet: '#status',
+					align: 'center'
+				}, {
+					width: 160,
+					title: '操作',
+					align: 'center',
+					templet: function (d) {
+						var html = '<div class="layui-btn-group"><button class="layui-btn layui-btn-xs" lay-event="add">修改</button><button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit" >编辑配置</button><button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button></div>';
+						return html;
+					}
+				}]
+			]
+		});
+
+		//表头工具栏事件
+		table.on('toolbar(conf)', function (obj) {
+			if (obj.event === 'add') {
+				tool.side("/home/conf/add");
+				return;
+			}
+		});
+
+		//监听行工具事件
+		table.on('tool(conf)', function (obj) {
+			var data = obj.data;
+			if (obj.event === 'add') {
+				tool.side('/home/conf/add?id=' + data.id);
+				return;
+			}
+			if (obj.event === 'edit') {
+				tool.side('/home/conf/edit?id=' + data.id);
+				return;
+			}
+			if (obj.event === 'del') {
+				if(obj.data.id == 1){
+					layer.msg('系统配置不支持删除');
+					return false;
+				}
+				layer.confirm('确定要删除吗?', {
+					icon: 3,
+					title: '提示'
+				}, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+							layer.close(index);
+						}
+					}
+					tool.delete("/home/conf/delete", { id: obj.data.id }, callback);
+				});
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/conf/other.html b/app/home/view/conf/other.html
new file mode 100644
index 0000000000000000000000000000000000000000..bc8e7e2579f64599057f584865844be75cbce435
--- /dev/null
+++ b/app/home/view/conf/other.html
@@ -0,0 +1,46 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">其他配置</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">开发者</td>
+			<td>
+				<input type="hidden" value="{$id}" name="id">
+				<input type="text" name="author" autocomplete="off" placeholder="请输入开发者" lay-reqText="请输入开发者" class="layui-input" value="{$config.author|default=''}">
+			</td>
+			<td class="layui-td-gray-2">开发版本号</td>
+			<td><input type="text" name="version" autocomplete="off" placeholder="请输入版本号" lay-reqText="请输入版本号" class="layui-input" value="{$config.version|default=''}"></td>
+		</tr>
+	</table>
+
+	<div class="pt-4">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			tool.post("/home/conf/edit", data.field, callback);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/conf/system.html b/app/home/view/conf/system.html
new file mode 100644
index 0000000000000000000000000000000000000000..2616f38224a5e5ed32a717d93da11c31af087f0c
--- /dev/null
+++ b/app/home/view/conf/system.html
@@ -0,0 +1,127 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">系统配置</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray-2">左侧菜单模式</td>
+			<td>
+				{empty name="$config.menu_mode"}
+					<input type="radio" name="menu_mode" value="classical" title="经典模式" checked>
+					<input type="radio" name="menu_mode" value="expand" title="展开模式" >
+				{else/}
+					<input type="radio" name="menu_mode" value="classical" title="经典模式" {eq name="$config.menu_mode" value="classical"}checked{/eq}>
+					<input type="radio" name="menu_mode" value="expand" title="展开模式" {eq name="$config.menu_mode" value="expand"}checked{/eq}>
+				{/empty}				
+			</td>
+			<td class="layui-td-gray-2">上传附件限制(MB)<font>*</font></td>
+			<td>
+				<input type="text" lay-verify="required|number" name="upload_max_filesize" autocomplete="off" placeholder="请输入上传附件限制" lay-reqText="请输入上传附件限制" class="layui-input" value="{$config.upload_max_filesize|default='50'}">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-3">开启新消息声音提醒</td>
+			<td>
+				{empty name="$config.msg_sound"}
+					<input type="radio" name="msg_sound" value="1" title="开启" checked>
+					<input type="radio" name="msg_sound" value="2" title="不开启">
+				{else/}
+					<input type="radio" name="msg_sound" value="1" title="开启" {eq name="$config.msg_sound" value="1"}checked{/eq}>
+					<input type="radio" name="msg_sound" value="2" title="不开启" {eq name="$config.msg_sound" value="2"}checked{/eq}>
+				{/empty}				
+			</td>
+			<td class="layui-td-gray-3">开启系统页面水印</td>
+			<td>
+				{empty name="$config.watermark"}
+					<input type="radio" name="watermark" value="1" title="开启" checked>
+					<input type="radio" name="watermark" value="2" title="不开启">
+				{else/}
+					<input type="radio" name="watermark" value="1" title="开启" {eq name="$config.watermark" value="1"}checked{/eq}>
+					<input type="radio" name="watermark" value="2" title="不开启" {eq name="$config.watermark" value="2"}checked{/eq}>
+				{/empty}				
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">隐藏工作台广告<font>*</font></td>
+			<td colspan="3">
+				{empty name="$config.qrcode"}
+					<input type="radio" name="qrcode" value="1" title="隐藏">
+					<input type="radio" name="qrcode" value="2" title="不隐藏" checked>
+				{else/}
+					<input type="radio" name="qrcode" value="1" title="隐藏" {eq name="$config.qrcode" value="1"}checked{/eq}>
+					<input type="radio" name="qrcode" value="2" title="不隐藏" {eq name="$config.qrcode" value="2"}checked{/eq}>
+				{/empty}
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">代码版本号<font>*</font></td>
+			<td>
+				<input type="text" lay-verify="required" name="version" autocomplete="off" placeholder="请输入版本号" lay-reqText="请输入版本号" class="layui-input" value="{$config.version|default='1.0.0'}">
+			</td>
+			<td class="layui-td-gray">版权信息</td>
+			<td>
+				<input type="text" name="copyright" autocomplete="off" placeholder="请输入版权信息" lay-reqText="请输入版权信息" readonly class="layui-input" value="{$config.copyright|default='勾股OA'}">
+			</td>
+		</tr>
+	</table>
+
+	<div class="pt-3">
+		<input type="hidden" name="id" value="{$id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool, upload = layui.upload;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					setTimeout(function(){
+						parent.parent.location.reload();
+					},1000)
+				}
+			}
+			tool.post("/home/conf/edit", data.field, callback);
+			return false;
+		});
+
+		//logo上传
+		var uploadInst = upload.render({
+			elem: '#uploadBtn',
+			url: "/api/index/upload",
+			done: function (res) {
+				layer.msg(res.msg);
+				if (res.code == 0) {
+					//上传成功
+					$('#logo input').attr('value', res.data.filepath);
+					$('#logo img').attr('src', res.data.filepath);
+				}
+			}
+		});
+		
+		var uploadInst2 = upload.render({
+			elem: '#uploadBtn2',
+			url: "/api/index/upload",
+			done: function (res) {
+				layer.msg(res.msg);
+				if (res.code == 0) {
+					//上传成功
+					$('#smalllogo input').attr('value', res.data.filepath);
+					$('#smalllogo img').attr('src', res.data.filepath);
+				}
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/conf/token.html b/app/home/view/conf/token.html
new file mode 100644
index 0000000000000000000000000000000000000000..c2f16ed36bfbfdbbb09f1c67030f360ea77981d2
--- /dev/null
+++ b/app/home/view/conf/token.html
@@ -0,0 +1,127 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">TOKEN配置</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray-2">Token签发组织</td>
+			<td>
+				<input type="hidden" value="{$id}" name="id">
+				<input type="text" name="iss" autocomplete="off" placeholder="请输入签发组织" lay-reqText="请输入签发组织" class="layui-input" value="{$config.iss|default=''}">
+			</td>
+			<td class="layui-td-gray-2">Token签发作者</td>
+			<td>
+				<input type="text" name="aud" autocomplete="off" placeholder="请输入签发作者" lay-reqText="请输入签发作者" class="layui-input" value="{$config.aud|default=''}">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">Token Secrect</td>
+			<td>
+				<input type="text" name="secrect" autocomplete="off" placeholder="请输入secrect" lay-reqText="请输入secrect" class="layui-input" value="{$config.secrect|default=''}">
+			</td>
+			<td class="layui-td-gray">Token过期时间</td>
+			<td>
+				<input type="text" name="exptime" autocomplete="off" placeholder="请输入过期时间" lay-reqText="请输入过期时间" class="layui-input" value="{$config.exptime|default=''}">
+			</td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+
+	<div style="padding:30px 0;">
+		<span class="layui-btn layui-btn-sm" onclick="testLogin();">Api测试登录</span>
+		<span class="layui-btn layui-btn-sm" onclick="testToken();">Token测试</span>
+	</div>
+	<div style="padding:12px 0;word-wrap:break-word">
+		<p class="red">先点击登录，在点击测试，会有好的结果哦！</p>
+		测试结果：
+		<div id="res"></div>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			tool.post("/home/conf/edit", data.field, callback);
+			return false;
+		});
+	}
+
+	var token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhcGkuZ291Z3VjbXMuY29tIiwiYXVkIjoiZ291Z3VjbXMiLCJpYXQiOjE2MjczMTY1MTgsImV4cCI6MTYyNzMyMDExOCwidWlkIjoxfQ.3soLDbwrEqn4EZtpD4h05FmvmMtJEh1LtE1vZ_ANcnI';
+	function testToken() {
+		$.ajax({
+			headers: {
+				Token: token
+			},
+			url: "/api/demo/test",
+			type: "get",
+			success: function (res) {
+				$('#res').html(JSON.stringify(res));
+				if (res.code == 111) {
+					layer.msg(res.msg);
+				}
+			}
+		});
+	}
+
+	function testLogin() {
+		var content = '<form class="layui-form" style="width:400px"><div style="padding:10px 15px">\
+							<p style="padding:10px 0">用户名：</p>\
+							<p><input name="username" type="text" class="layui-input" value="admin"/></p>\
+							<p style="padding:10px 0">密 码：</p>\
+							<p><input name="password" type="password" class="layui-input" value="123456"/></p>\
+							</div>\
+						</form>';
+		layer.open({
+			type: 1,
+			title: 'API测试用户登录',
+			area: ['432px', '300px'],
+			content: content,
+			btnAlign: 'c',
+			btn: ['登录'],
+			yes: function (idx) {
+				var username = $('[name="username"]').val();
+				var password = $('[name="password"]').val();
+				if (username == '') {
+					layer.msg('请填写用户名');
+					return;
+				}
+				if (password == '') {
+					layer.msg('请填写密码');
+					return;
+				}
+				$.ajax({
+					url: "/api/demo/login",
+					type: 'post',
+					data: { username: username, password: password },
+					success: function (res) {
+						$('#res').html(JSON.stringify(res));
+						layer.msg(res.msg);
+						if (res.code == 0) {
+							token = res.data.token;
+							layer.close(idx);
+						}
+					}
+				})
+			}
+		})
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/conf/web.html b/app/home/view/conf/web.html
new file mode 100644
index 0000000000000000000000000000000000000000..19673b0a81086e5ff65dd1e1f8adf48bf1aa05ac
--- /dev/null
+++ b/app/home/view/conf/web.html
@@ -0,0 +1,122 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">信息配置</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">系统名称<font>*</font></td>
+			<td>
+				<input type="hidden" name="id" value="{$id}">
+				<input type="text" name="admin_title" lay-verify="required" autocomplete="off" placeholder="请输入系统名称" lay-reqText="请输入系统名称" class="layui-input" value="{$config.admin_title|default=''}">
+			</td>
+			<td class="layui-td-gray">系统域名<font>*</font></td>
+			<td colspan="3">
+				<input type="text" name="domain" lay-verify="required" autocomplete="off" class="layui-input" placeholder="请输入系统域名" lay-reqText="请输入系统域名" value="{$config.domain|default=''}">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">ICP备案号</td>
+			<td>
+				<input type="text" name="icp" autocomplete="off" placeholder="请输入ICP备案号" class="layui-input" value="{$config.icp|default=''}">
+			</td>
+			<td class="layui-td-gray" rowspan="3">系统大LOGO</td>
+			<td rowspan="3" style="width: 200px;">
+				<div class="layui-upload" style="width: 200px;">
+					<div class="layui-upload-list" id="logo" style="width: 100%; height:64px; overflow: hidden;">
+						<img src="{$config.logo|default='/static/home/images/syslogo.png'}" style="max-width: 100%; height: 64px;" />
+						<input type="hidden" name="logo" value="{$config.logo|default='/static/home/images/syslogo.png'}">
+					</div>
+					<button type="button" class="layui-btn" style="width: 100%;" id="uploadBtn">上传LOGO</button>
+				</div>
+			</td>
+			<td class="layui-td-gray" rowspan="3">系统小LOGO</td>
+			<td rowspan="3" style="width: 180px;">
+				<div class="layui-upload" style="width: 180px;">
+					<div class="layui-upload-list" id="smalllogo" style="width: 100%; height:64px; overflow: hidden; text-align:center;">
+						<img src="{$config.small_logo|default='/static/home/images/syslogo_small.png'}" style="max-width: 100%; height: 64px;" />
+						<input type="hidden" name="small_logo" value="{$config.small_logo|default='/static/home/images/syslogo_small.png'}">
+					</div>
+					<button type="button" class="layui-btn" style="width: 100%;" id="uploadBtn2">上传LOGO</button>
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">公安备案号</td>
+			<td>
+				<input type="text" name="beian" autocomplete="off" placeholder="请输入公安备案号" class="layui-input" value="{$config.beian|default=''}">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">系统关键词<font>*</font></td>
+			<td>
+				<input type="text" name="keywords" lay-verify="required" autocomplete="off" placeholder="多个关键词用“,”隔开" lay-reqText="请输入系统关键字" class="layui-input" value="{$config.keywords|default=''}">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">系统描述<font>*</font>
+			</td>
+			<td colspan="5">
+				<textarea name="desc" lay-verify="required" placeholder="请输入系统描述" lay-reqText="请输入系统描述" class="layui-textarea">{$config.desc|default=''}</textarea>
+			</td>
+		</tr>
+	</table>
+
+	<div class="pt-3">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool, upload = layui.upload;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					setTimeout(function(){
+						parent.parent.location.reload();
+					},1000)
+				}
+			}
+			tool.post("/home/conf/edit", data.field, callback);
+			return false;
+		});
+
+		//logo上传
+		var uploadInst = upload.render({
+			elem: '#uploadBtn',
+			url: "/api/index/upload",
+			done: function (res) {
+				layer.msg(res.msg);
+				if (res.code == 0) {
+					//上传成功
+					$('#logo input').attr('value', res.data.filepath);
+					$('#logo img').attr('src', res.data.filepath);
+				}
+			}
+		});
+		
+		var uploadInst2 = upload.render({
+			elem: '#uploadBtn2',
+			url: "/api/index/upload",
+			done: function (res) {
+				layer.msg(res.msg);
+				if (res.code == 0) {
+					//上传成功
+					$('#smalllogo input').attr('value', res.data.filepath);
+					$('#smalllogo img').attr('src', res.data.filepath);
+				}
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/dataauth/contract_admin.html b/app/home/view/dataauth/contract_admin.html
new file mode 100644
index 0000000000000000000000000000000000000000..f4b22edbbdd68d7f26941ae9e896c0344a701604
--- /dev/null
+++ b/app/home/view/dataauth/contract_admin.html
@@ -0,0 +1,120 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">模块配置及数据权限配置</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td colspan="8" class="red" style="line-height:1.8">
+				<p><strong>合同模块使用说明：</strong></p>
+				<p>{$detail.desc}</p>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">权限名称</td>
+			<td>
+				<input type="hidden" name="id" value="{$detail.id}" />
+				{$detail.title}
+			</td>
+			<td class="layui-td-gray">权限标识</td>
+			<td>{$detail.name}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-3">合同管理员</td>
+			<td>
+				<input type="text" name="conf_1_str" value="{$detail.conf_1_str|default=''}" readonly placeholder="请选择权限人员" autocomplete="off" class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="conf_1" value="{$detail.conf_1}">
+			</td>
+			<td class="layui-td-gray">权限标识</td>
+			<td style="width:100px;">conf_1</td>
+		</tr>		
+		<tr>		
+			<td class="layui-td-gray-3">合同编号自动生成</td>
+			<td>
+				<input type="radio" name="conf_2" value="1" title="开启" {eq name="$detail.conf_2" value="1"}checked{/eq}>
+				<input type="radio" name="conf_2" value="0" title="不开启" {eq name="$detail.conf_2" value="0"}checked{/eq}>
+			</td>
+			<td class="layui-td-gray">权限标识</td>
+			<td style="width:100px;">conf_2</td>
+		</tr>
+		<tr>			
+			<td class="layui-td-gray-2">是否开启关联客户<br>[销售合同]</td>
+			<td>
+				<input type="radio" name="conf_3" value="1" title="关联" {eq name="$detail.conf_3" value="1"}checked{/eq}>
+				<input type="radio" name="conf_3" value="0" title="不关联" {eq name="$detail.conf_3" value="0"}checked{/eq}>
+			</td>
+			<td class="layui-td-gray">权限标识</td>
+			<td style="width:100px;">conf_3</td>
+		</tr>
+		<tr>			
+			<td class="layui-td-gray-2">是否开启关联产品<br>[销售合同]</td>
+			<td>
+				<input type="radio" name="conf_4" value="1" title="关联" {eq name="$detail.conf_4" value="1"}checked{/eq}>
+				<input type="radio" name="conf_4" value="0" title="不关联" {eq name="$detail.conf_4" value="0"}checked{/eq}>
+			</td>
+			<td class="layui-td-gray">权限标识</td>
+			<td style="width:100px;">conf_4</td>
+		</tr>
+		<tr>			
+			<td class="layui-td-gray-2">是否开启关联服务<br>[销售合同]</td>
+			<td>
+				<input type="radio" name="conf_5" value="1" title="关联" {eq name="$detail.conf_5" value="1"}checked{/eq}>
+				<input type="radio" name="conf_5" value="0" title="不关联" {eq name="$detail.conf_5" value="0"}checked{/eq}>
+			</td>
+			<td class="layui-td-gray">权限标识</td>
+			<td style="width:100px;">conf_5</td>
+		</tr>
+		<tr>			
+			<td class="layui-td-gray-2">是否开启关联供应商<br>[采购合同]</td>
+			<td>
+				<input type="radio" name="conf_6" value="1" title="关联" {eq name="$detail.conf_6" value="1"}checked{/eq}>
+				<input type="radio" name="conf_6" value="0" title="不关联" {eq name="$detail.conf_6" value="0"}checked{/eq}>
+			</td>
+			<td class="layui-td-gray">权限标识</td>
+			<td style="width:100px;">conf_6</td>
+		</tr>
+		<tr>			
+			<td class="layui-td-gray-2">是否开启关联采购品<br>[采购合同]</td>
+			<td>
+				<input type="radio" name="conf_7" value="1" title="关联" {eq name="$detail.conf_7" value="1"}checked{/eq}>
+				<input type="radio" name="conf_7" value="0" title="不关联" {eq name="$detail.conf_7" value="0"}checked{/eq}>
+			</td>
+			<td class="layui-td-gray">权限标识</td>
+			<td style="width:100px;">conf_7</td>
+		</tr>
+		<tr>			
+			<td class="layui-td-gray-2">合同到期前N天提醒</td>
+			<td><input type="text" name="conf_10" value="{$detail.conf_10|default='30'}" lay-verify="required|number" lay-reqText="请输入合同到期前N天提醒" class="layui-input"></td>
+			<td class="layui-td-gray">权限标识</td>
+			<td style="width:100px;">conf_10</td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','oaPicker'];
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;		
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if(e.code==0){
+					tool.sideClose(1000);
+				}
+			}
+			tool.post("/home/dataauth/edit", data.field, callback);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/dataauth/customer_admin.html b/app/home/view/dataauth/customer_admin.html
new file mode 100644
index 0000000000000000000000000000000000000000..f570a2d3d050497958997bbdcc9b6904554020e5
--- /dev/null
+++ b/app/home/view/dataauth/customer_admin.html
@@ -0,0 +1,82 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">模块配置及数据权限配置</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td colspan="8" class="red" style="line-height:1.8">
+				<p><strong>合同模块使用说明：</strong></p>
+				<p>{$detail.desc}</p>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">权限名称</td>
+			<td>
+				<input type="hidden" name="id" value="{$detail.id}" />
+				{$detail.title}
+			</td>
+			<td class="layui-td-gray">权限标识</td>
+			<td>{$detail.name}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-3">客户管理员</td>
+			<td>
+				<input type="text" name="conf_1_str" value="{$detail.conf_1_str|default=''}" readonly placeholder="请选择权限人员" autocomplete="off" class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="conf_1" value="{$detail.conf_1}">
+			</td>
+			<td class="layui-td-gray">权限标识</td>
+			<td style="width:100px;">conf_1</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-3">每天可获取公客数</td>
+			<td><input name="conf_2" value="{$detail.conf_2}" lay-verify="required|number" lay-reqText="请输入每天获取最大公客数" placeholder="输入每天每人可获取最大公客数" autocomplete="off" class="layui-input">
+			</td>
+			<td class="layui-td-gray">权限标识</td>
+			<td style="width:100px;">conf_2</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-3">说明</td>
+			<td colspan="3" class="red">如：10，当日超过该数量，该员工就不能在抢客宝里面抢客或者从公海里领取客户，等到第二天自动恢复。</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-3">员工客户数量限制</td>
+			<td><input name="conf_3" value="{$detail.conf_3}" lay-verify="required|number" lay-reqText="请输入员工客户数量限制" placeholder="请输入员工客户数量限制" autocomplete="off" class="layui-input">
+			</td>
+			<td class="layui-td-gray">权限标识</td>
+			<td style="width:100px;">conf_3</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-3">说明</td>
+			<td colspan="3" class="red">如：100，超过该数量，该员工就不能录入或者不能从公海领取客户，必须把自已的客户移到公海里，不超过该数量才能新增。</td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','oaPicker'];
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;		
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if(e.code==0){
+					tool.sideClose(1000);
+				}
+			}
+			tool.post("/home/dataauth/edit", data.field, callback);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/dataauth/finance_admin.html b/app/home/view/dataauth/finance_admin.html
new file mode 100644
index 0000000000000000000000000000000000000000..5de4c0784b17cd704a79209dcf840df2ddca8a2e
--- /dev/null
+++ b/app/home/view/dataauth/finance_admin.html
@@ -0,0 +1,97 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">模块配置及数据权限配置</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td colspan="4" class="red" style="line-height:1.8">
+				<p><strong>项目模块使用说明：</strong></p>
+				<p>{$detail.desc}</p>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">权限名称</td>
+			<td>
+				<input type="hidden" name="id" value="{$detail.id}" />
+				{$detail.title}
+			</td>
+			<td class="layui-td-gray">权限标识</td>
+			<td>{$detail.name}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">报销管理员</td>
+			<td>
+				<input type="text" name="conf_1_str" value="{$detail.conf_1_str|default=''}" readonly placeholder="请选择报销管理员" autocomplete="off" class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="conf_1" value="{$detail.conf_1}">
+			</td>
+			<td class="layui-td-gray">权限标识</td>
+			<td style="width:100px;">conf_1</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">发票管理员</td>
+			<td>
+				<input type="text" name="conf_2_str" value="{$detail.conf_2_str|default=''}" readonly placeholder="请选择发票管理员" autocomplete="off" class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="conf_2" value="{$detail.conf_2}">
+			</td>
+			<td class="layui-td-gray">权限标识</td>
+			<td style="width:100px;">conf_2</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">回款管理员</td>
+			<td>
+				<input type="text" name="conf_3_str" value="{$detail.conf_3_str|default=''}" readonly placeholder="请选择到回款理员" autocomplete="off" class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="conf_3" value="{$detail.conf_3}">
+			</td>
+			<td class="layui-td-gray">权限标识</td>
+			<td style="width:100px;">conf_3</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">付款管理员</td>
+			<td>
+				<input type="text" name="conf_4_str" value="{$detail.conf_4_str|default=''}" readonly placeholder="请选择付款管理员" autocomplete="off" class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="conf_4" value="{$detail.conf_4}">
+			</td>
+			<td class="layui-td-gray">权限标识</td>
+			<td style="width:100px;">conf_4</td>
+		</tr>
+		<tr>		
+			<td class="layui-td-gray-3">报销编号自动生成</td>
+			<td>
+				<input type="radio" name="conf_10" value="1" title="开启" {eq name="$detail.conf_10" value="1"}checked{/eq}>
+				<input type="radio" name="conf_10" value="0" title="不开启" {eq name="$detail.conf_10" value="0"}checked{/eq}>
+			</td>
+			<td class="layui-td-gray">权限标识</td>
+			<td style="width:100px;">conf_10</td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','oaPicker'];
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;
+		
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if(e.code==0){
+					tool.sideClose(1000);
+				}
+			}
+			tool.post("/home/dataauth/edit", data.field, callback);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/dataauth/index.html b/app/home/view/dataauth/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..4f1973e1729b826f95aac6b8fcd4c18be4ac32fd
--- /dev/null
+++ b/app/home/view/dataauth/index.html
@@ -0,0 +1,72 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<table class="layui-hide" id="conf" lay-filter="conf"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+	<h3>模块配置及数据权限配置</h3>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool, form = layui.form;
+		layui.pageTable = table.render({
+			elem: '#conf',
+			title: '配置列表',
+			toolbar: '#toolbarDemo',
+			defaultToolbar: false,
+			url: "/home/dataauth/index",
+			cellMinWidth: 80,
+			page: false, //开启分页				
+			limit: 20,
+			cols: [
+				[{
+					field: 'id',
+					width: 80,
+					title: 'ID编号',
+					align: 'center'
+				}, {
+					field: 'title',
+					width: 200,
+					title: '权限名称'
+				}, {
+					field: 'name',
+					width: 200,
+					title: '权限标识'
+				}, {
+					field: 'desc',
+					minWidth: 300,
+					title: '描述'
+				}, {
+					width: 100,
+					title: '操作',
+					align: 'center',
+					templet: function (d) {
+						var html = '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit" >编辑配置</button>';
+						return html;
+					}
+				}]
+			]
+		});
+
+		//监听行工具事件
+		table.on('tool(conf)', function (obj) {
+			var data = obj.data;
+			if (obj.event === 'edit') {
+				tool.side('/home/dataauth/edit?id=' + data.id);
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/dataauth/office_admin.html b/app/home/view/dataauth/office_admin.html
new file mode 100644
index 0000000000000000000000000000000000000000..a51b6047a3f1a68f4868599f57686100861e15f2
--- /dev/null
+++ b/app/home/view/dataauth/office_admin.html
@@ -0,0 +1,71 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">模块配置及数据权限配置</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td colspan="8" class="red" style="line-height:1.8">
+				<p><strong>合同模块使用说明：</strong></p>
+				<p>{$detail.desc}</p>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">权限名称</td>
+			<td>
+				<input type="hidden" name="id" value="{$detail.id}" />
+				{$detail.title}
+			</td>
+			<td class="layui-td-gray">权限标识</td>
+			<td>{$detail.name}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-3">日常办公数据管理员</td>
+			<td>
+				<input type="text" name="conf_1_str" value="{$detail.conf_1_str|default=''}" readonly placeholder="请选择权限人员" autocomplete="off" class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="conf_1" value="{$detail.conf_1}">
+			</td>
+			<td class="layui-td-gray">权限标识</td>
+			<td style="width:100px;">conf_1</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-3">工作记录工时调整<br>权限设置</td>
+			<td>
+				<input type="radio" name="conf_2" value="1" title="不开放调整" {eq name="$detail.conf_2" value="1"} checked{/eq}>
+				<input type="radio" name="conf_2" value="2" title="员工自己可调整" {eq name="$detail.conf_2" value="2"} checked{/eq}>
+				<input type="radio" name="conf_2" value="3" title="部门负责人可调整" {eq name="$detail.conf_2" value="3"} checked{/eq}>
+				<input type="radio" name="conf_2" value="4" title="日常办公数据管理员可调整" {eq name="$detail.conf_2" value="4"} checked{/eq}>
+			</td>
+			<td class="layui-td-gray">权限标识</td>
+			<td style="width:100px;">conf_2</td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','oaPicker'];
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;		
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if(e.code==0){
+					tool.sideClose(1000);
+				}
+			}
+			tool.post("/home/dataauth/edit", data.field, callback);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/dataauth/project_admin.html b/app/home/view/dataauth/project_admin.html
new file mode 100644
index 0000000000000000000000000000000000000000..5a3ba0d3e72dce361934f5f641f0237c9dc2edb9
--- /dev/null
+++ b/app/home/view/dataauth/project_admin.html
@@ -0,0 +1,66 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">模块配置及数据权限配置</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td colspan="4" class="red" style="line-height:1.8">
+				<p><strong>项目模块使用说明：</strong></p>
+				<p>{$detail.desc}</p>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">权限名称</td>
+			<td>
+				<input type="hidden" name="id" value="{$detail.id}" />
+				{$detail.title}
+			</td>
+			<td class="layui-td-gray">权限标识</td>
+			<td>{$detail.name}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-3">项目管理员</td>
+			<td>
+				<input type="text" name="conf_1_str" value="{$detail.conf_1_str|default=''}" readonly placeholder="请选择权限人员" autocomplete="off" class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="conf_1" value="{$detail.conf_1}">
+			</td>
+			<td class="layui-td-gray">权限标识</td>
+			<td style="width:100px;">conf_1</td>
+		</tr>
+		<tr>			
+			<td class="layui-td-gray-2">项目任务到期<br>前N天提醒</td>
+			<td><input type="text" name="conf_10" value="{$detail.conf_10|default='3'}" lay-verify="required|number" lay-reqText="请输入合同到期前N天提醒" class="layui-input"></td>
+			<td class="layui-td-gray">权限标识</td>
+			<td style="width:100px;">conf_10</td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','oaPicker'];
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;		
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if(e.code==0){
+					tool.sideClose(1000);
+				}
+			}
+			tool.post("/home/dataauth/edit", data.field, callback);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/database/backuplist.html b/app/home/view/database/backuplist.html
new file mode 100644
index 0000000000000000000000000000000000000000..59641d039c95ea13089bf3cdcc89a778040e5965
--- /dev/null
+++ b/app/home/view/database/backuplist.html
@@ -0,0 +1,152 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<div class="gg-form-bar border-t border-x">
+		<h3 class="pb-3">数据还原</h3>
+	</div>
+	<table cellspacing="0" cellpadding="0" border="0" class="layui-table layui-table-form">
+		<tr style="background-color:#FAFAFA">
+			<th style=" text-align: center; font-weight: 800;"><span>文件名称</span></th>
+			<th style=" text-align: center; font-weight: 800;"><span>文件格式</span></th>
+			<th style=" text-align: center; font-weight: 800;"><span>分隔符</span></th>
+			<th style=" text-align: center; font-weight: 800;"><span>文件总大小</span></th>
+			<th style=" text-align: center; font-weight: 800;"><span>分卷总数</span></th>
+			<th style=" text-align: center; font-weight: 800; width:222px"><span>操作</span></th>
+		</tr>
+		{empty name="list"}
+		<tr>
+			<td colspan="6" align="center" style="padding:20px 0; color:#999">暂无备份数据</td>
+		</tr>
+		{/empty}
+		{volist name="list" id="vo" key="k"}
+		<tr style="background-color: #fafafa;">
+			<td><strong>备份时间：{$vo.time}</strong>{if $vo.timespan == $lock_time}<span style="color:red; margin-left:20px;">该备份不是完整备份，请删除重新备份</span>{/if}</td>
+			<td align="center"><span>.sql</span></td>
+			<td align="center"><span>{$vo.data.compress}</span></td>
+			<td align="center"><span>{:format_bytes($vo.data.size)}</span></td>
+			<td align="center"><span>{$vo.data.part}</span></td>
+			<td align="center">
+				<div class="layui-btn-group" data-time='{$vo.timespan}'>
+					{if $vo.timespan == $lock_time}
+					<a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="reset">清除不完整的备份</a>
+					{else/}
+					<a class="layui-btn layui-btn-xs layui-btn-normal" lay-event="import">数据还原</a>
+					<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除备份</a>
+					{/if}
+				</div>
+			</td>
+		</tr>
+		{for start="0" end="$vo.data.part" step="1"}
+		<tr>
+			<td colspan="5">
+				{:date("Ymd",$vo.timespan)}{$vo.data.compress}{:date("His",$vo.timespan)}{$vo.data.compress}{$i+1}.sql
+			</td>
+			<td align="center">
+				<a class="layui-btn layui-btn-xs" href='/home/database/downfile?time={$vo.data.time}&part={$i+1}'>下载备份(分卷{$i+1})</a>
+			</td>
+		</tr>
+		{/for}
+		{/volist}
+	</table>
+</div>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	function gouguInit() {
+		function importData(data) {
+			if (data.code == 0) {
+				console.log(data.msg);
+				layer.closeAll();
+				layer.msg(data.msg, { time: 200000 });
+				if ($.isPlainObject(data.data)) {
+					$.ajax({
+						url: "/home/database/import",
+						type: 'get',
+						data: { "part": data.data.part, "start": data.data.start, time: data.data.time },
+						success: function (res) {
+							importData(res);
+						}
+					})
+				} else {
+					layer.msg(data.msg);
+					window.onbeforeunload = function () { return null; }
+				}
+			} else {
+				layer.msg(data.msg);
+			}
+		}
+		//监听行工具事件
+		$('[lay-event="import"]').on('click', function () {
+			var time = $(this).parent().data('time');
+			layer.confirm('确认要还原该备份吗?', {
+				icon: 3,
+				title: '提示'
+			}, function (index) {
+				layer.msg("数据还原中...", { time: 200000 });
+				$.ajax({
+					url: "/home/database/import?time=" + time,
+					type: 'post',
+					success: function (res) {
+						importData(res);
+					}
+				})
+				window.onbeforeunload = function () { return "正在还原数据库，请不要关闭！" }
+				layer.close(index);
+			});
+			return false;
+		})
+
+		$('[lay-event="del"]').on('click', function () {
+			var time = $(this).parent().data('time');
+			layer.confirm('确认要删除该备份吗?', {
+				icon: 3,
+				title: '提示'
+			}, function (index) {
+				$.ajax({
+					url: "/home/database/del",
+					data: { 'time': time },
+					success: function (res) {
+						layer.msg(res.msg);
+						if (res.code == 0) {
+							setTimeout(function () {
+								location.reload();
+							}, 2000)
+						}
+					}
+				})
+				layer.close(index);
+			});
+			return false;
+		})
+
+		$('[lay-event="reset"]').on('click', function () {
+			var time = $(this).parent().data('time');
+			layer.confirm('确认要清除该备份吗?', {
+				icon: 3,
+				title: '提示'
+			}, function (index) {
+				$.ajax({
+					url: "/home/database/del",
+					data: { 'time': time, 'lock': 1 },
+					success: function (res) {
+						layer.msg(res.msg);
+						if (res.code == 0) {
+							setTimeout(function () {
+								location.reload();
+							}, 2000)
+						}
+					}
+				})
+				layer.close(index);
+			});
+			return false;
+		})
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/database/database.html b/app/home/view/database/database.html
new file mode 100644
index 0000000000000000000000000000000000000000..fdbb6896004af9676821b2f1882b860b2426a25b
--- /dev/null
+++ b/app/home/view/database/database.html
@@ -0,0 +1,201 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<table class="layui-hide" id="backup" lay-filter="backup"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+	<div class="layui-btn-group">
+		<span class="layui-btn layui-btn-sm layui-btn-normal" lay-event="backup">数据备份</span><span class="layui-btn layui-btn-sm" lay-event="optimize">数据表优化</span><span class="layui-btn layui-btn-danger layui-btn-sm" lay-event="repair">数据表修复</span>
+  	</div>
+	<span id="dataTips" style="font-size:12px; margin-left:10px"></span>  
+</script>
+{/block}
+<!-- /主体 -->
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	function gouguInit() {
+		var table = layui.table, form = layui.form;
+		var tableIns = table.render({
+			elem: '#backup',
+			title: '数据备份',
+			toolbar: '#toolbarDemo',
+			defaultToolbar: false,
+			url: "/home/database/database", //数据接口
+			page: false,
+			cols: [
+				[ //表头
+					{ type: 'checkbox' },
+					{
+						field: 'name',
+						title: '数据表',
+						width: 200
+					},
+					{
+						field: 'status',
+						title: '状态',
+						width: 100,
+						templet: function (d) {
+							return '<span id="table_' + d.name + '">-</span>';
+						}
+					},
+					{
+						field: 'engine',
+						title: '存储引擎',
+						align: 'center',
+						width: 80
+					}, {
+						field: 'row_format',
+						title: '行格式',
+						align: 'center',
+						width: 80
+					}, {
+						field: 'rows',
+						title: '行数',
+						align: 'center',
+						width: 60,
+					}, {
+						field: 'data_size',
+						title: '字节数',
+						align: 'center',
+						width: 80
+					}, {
+						field: 'data_length',
+						title: '数据大小',
+						align: 'center',
+						width: 80
+					}, {
+						field: 'comment',
+						title: '数据表注释'
+					}, {
+						field: 'create_time',
+						title: '创建时间',
+						width: 160,
+						align: 'center'
+					}
+				]
+			],
+			done: function (res, curr, count) {
+				$('#dataTips').html(res.msg);
+			}
+		});
+
+		//递归备份表
+		function backup(tab, status, table) {
+			layer.closeAll();
+			layer.msg("备份中...，请勿关闭本页面", { time: 200000 });
+			$.get("/home/database/backup", tab, function (data) {
+				if (data.code == 0) {
+					showmsg(data.data.tab.table, data.msg);
+					if (data.data.tab.start == 'ok') {
+						layer.msg('备份完成');
+						window.onbeforeunload = function () { return null }
+						return;
+					}
+					backup(data.data.tab, tab.id != data.data.tab.id);
+				} else {
+					layer.msg('立即备份');
+				}
+			}, "json");
+		}
+
+		//修改备份状态
+		function showmsg(table, msg) {
+			console.log(table);
+			$("#table_" + table).addClass('span-color-2').html(msg);
+		}
+		//监听行工具事件
+		table.on('toolbar(backup)', function (obj) {
+			var checkData = table.checkStatus(obj.config.id).data;
+			var len = checkData.length;
+			var tables = [];
+			if (len == 0) {
+				layer.msg('请先选择表');
+				return false;
+			}
+			for (var i = 0; i < len; i++) {
+				tables.push(checkData[i].name);
+			}
+			if (obj.event === 'backup') {
+				layer.confirm('确认要备份选中的' + len + '个数据表吗?', {
+					icon: 3,
+					title: '提示'
+				}, function (index) {
+					$.ajax({
+						url: "/home/database/backup",
+						type: 'post',
+						data: { 'tables': tables },
+						success: function (res) {
+							if (res.code == 0) {
+								layer.msg("开始备份，请不要关闭本页面！");
+								window.onbeforeunload = function () { return "正在备份数据库，请不要关闭！" }
+								backup(res.data.tab);
+							}
+							if (res.code == 2) {
+								layer.confirm('检测到有一个备份任务未完成，请先清除未完成的备份', {
+									icon: 3,
+									title: '提示'
+								}, function (index) {
+									$.ajax({
+										url: "/home/database/del",
+										data: { 'lock': 1 },
+										success: function (res) {
+											layer.msg(res.msg);
+										}
+									})
+								})
+							}
+							else {
+								layer.msg(res.msg);
+							}
+						}
+					})
+					layer.close(index);
+				});
+			} else if (obj.event === 'optimize') {
+				layer.confirm('确认要优化选中的' + len + '个数据表吗?', {
+					icon: 3,
+					title: '提示'
+				}, function (index) {
+					$.ajax({
+						url: "/home/database/optimize",
+						type: 'post',
+						data: { 'tables': tables },
+						success: function (res) {
+							layer.msg(res.msg);
+							if (res.code == 0) {
+								setTimeout(function () {
+									location.reload();
+								}, 2000)
+							}
+						}
+					})
+					layer.close(index);
+				});
+			} else if (obj.event === 'repair') {
+				layer.confirm('确认要修复选中的' + len + '个数据表吗?', {
+					icon: 3,
+					title: '提示'
+				}, function (index) {
+					$.ajax({
+						url: "/home/database/repair",
+						type: 'post',
+						data: { 'tables': tables },
+						success: function (res) {
+							layer.msg(res.msg);
+							if (res.code == 0) {
+								setTimeout(function () {
+									location.reload();
+								}, 2000)
+							}
+						}
+					})
+					layer.close(index);
+				});
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/files/index.html b/app/home/view/files/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..235b8a5dc5a32f1ff7a51f749afcc4f9b0eca57f
--- /dev/null
+++ b/app/home/view/files/index.html
@@ -0,0 +1,450 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+    body { display: flex; overflow: hidden; height: 100vh; }
+    ::-webkit-scrollbar { display: none; width: 6px; height: 6px; }
+    ::-webkit-scrollbar-thumb { border-radius: 10px; background-color: #e1e1e1; }
+	.layui-tab{margin:0;}
+	.container { display: flex; flex: 1; flex-direction: column; overflow: hidden; padding:12px;}
+    .file-container { display: flex; flex: 1; flex-direction: column; overflow: hidden; border-radius: 2px; background: #ffffff; box-shadow: rgba(0, 0, 0, 0.05) 0 1px 2px 0; }
+    .file-item {display: flex; flex: 1; justify-content: space-between; overflow: hidden; }
+    .file-header {padding-top: 4px; }
+
+    /** 分组 **/
+    .file-item .group { position: relative; display: flex; flex-direction: column; padding-top: 8px; width: 200px; border-right: 1px solid #f6f6f6; }
+    .file-item .group ul::-webkit-scrollbar { display: block; }
+    .file-item .group ul { flex: 1; overflow: hidden; overflow-y: auto; }
+    .file-item .group ul li {display: flex; align-items: center; justify-content: space-between; cursor:pointer; padding: 0 12px; height: 38px; font-size: 13px; color: #666666; }
+    .file-item .group ul li i.iconfont{ margin-right:8px; font-size:24px; color:#E1AF1A; font-weight:800;}
+    .file-item .group ul li > span { display: flex; flex: 1; overflow: hidden; margin-right: 0.5rem; text-overflow: ellipsis; white-space: nowrap; }
+    .file-item .group ul li.active { background: #edefff; }
+    .file-item .group ul li:hover { background: #f5f7fa; }
+    .file-item .group ul li .dropdown:hover dl { display: block; }
+    .file-item .group ul li .dropdown dl { position: absolute; top: 36px; right: -15px; z-index: 10000; display: none; padding: 5px 0; width: 88px; border-radius: 2px; text-align: center; background-color: #ffffff; box-shadow: #cccccc 0 0 10px; }
+    .file-item .group ul li .dropdown dl dd { height: 32px; line-height: 32px; }
+    .file-item .group ul li .dropdown dl dd:hover { color: #4a5dff; background-color: #edefff; }
+    .file-item .group ul li .dropdown dl::before { position: absolute; top: -16px; left: 44px; z-index: 12; display: block; padding: 0; width: 0; height: 0; border-top: 8px solid transparent; border-right: 8px solid transparent; border-bottom: 8px solid #ffffff; border-left: 8px solid transparent; content: ""; box-sizing: content-box; }
+    .file-item .group .footer { display: flex; align-items: center; justify-content: center; width: 100%; height: 50px; border-top: 1px solid #f2f2f2; border-right: 1px solid #f2f2f2; }
+
+    /** 菜单 **/
+    .file-item .attach #move:hover { position: relative; opacity: 1; }
+    .file-item .attach #move:hover .dropdown { display: block; background-color: #ffffff; }
+    .file-item .attach .dropdown { position: absolute; top: 38px; z-index: 100000; display: none; padding: 5px 0; width: 150px; border: 1px solid #dddddd; text-align: left; background-color: #ffffff; line-height: 1.6; }
+    .file-item .attach .dropdown em { font-size: 13px; font-weight: 400; color: #333333; font-style: normal; }
+    .file-item .attach .dropdown em { display: block; clear: both; padding: 6px 20px; white-space: nowrap; }
+    .file-item .attach .dropdown em:hover { background: #eeeeee; }
+    .file-item .attach .dropdown em:first-child { font-size: 12px; color: #999999; }
+    .file-item .attach .dropdown::before { position: absolute; top: -16px; left: 21px; z-index: 12; display: block; padding: 0; width: 0; height: 0; border-top: 8px solid transparent; border-right: 8px solid transparent; border-bottom: 8px solid #ffffff; border-left: 8px solid transparent; content: ""; box-sizing: content-box; }
+    .file-item .attach .dropdown::after { position: absolute; top: -18px; left: 20px; z-index: 10; display: block; padding: 0; width: 0; height: 0; border-top: 9px solid transparent; border-right: 9px solid transparent; border-bottom: 9px solid #cccccc; border-left: 9px solid transparent; content: ""; box-sizing: content-box; }
+
+    /** 文件 **/
+    .file-item .attach { position: relative; display: flex; flex: 1; flex-direction: column; }
+    .file-item .attach .header { display: flex; align-items: center; justify-content: space-between; padding:12px 15px; margin:0;}
+    .file-item .attach .header .search{ display: flex; }
+    .file-item .attach .header .search input { height: 30px; border-color: #eeeeee; border-top-right-radius: 0; border-bottom-right-radius: 0; }
+    .file-item .attach .header .search button { border-color: #eeeeee; background: #f5f7fa; border-top-left-radius: 0; border-bottom-left-radius: 0; }
+    .file-item .attach .header .search button:hover { background-color: #eeeeef; }
+    .file-item .attach .subject { flex: 1; overflow: hidden; overflow-y: auto; margin: 10px; box-sizing: border-box; }
+    .file-item .attach .subject:hover::-webkit-scrollbar { display: block; }
+    .file-item .attach .subject ul { display: flex; flex-wrap: wrap; }
+    .file-item .attach .subject ul li { position: relative; height: 120px; margin: 8px; padding: 8px; border: 1px solid rgba(0, 0, 0, 0.05); border-radius: 3px; transition: all 0.2s ease-in-out; }
+    .file-item .attach .subject ul li:hover {border: 1px solid #dddddd; background-color:#f5f5f5;}
+    .file-item .attach .subject ul li.on {border: 1px solid #ff5722; }
+    .file-item .attach .subject ul li img { width: 50px; height: 50px; padding:25px;}
+    .file-item .attach .subject ul li img.file-image { width: 100px; height: 100px; padding:0; border-radius: 2px; }
+    .file-item .attach .subject ul li video { width: 100px; height: 100px; border-radius: 3px; }
+    .file-item .attach .subject ul li p {overflow: hidden; margin: 5px 0 0; width: 98px; font-size: 13px; text-align: center; text-overflow: ellipsis; white-space: nowrap; }
+    .file-item .attach .subject ul li .file-check{position: absolute; width:20px; height:20px; left: 0; top: 0; display: none; font-size: 14px; border-radius:2px 0 4px 0; text-align: center; line-height: 20px; color: #ffffff; background-color:#fff; border-right:1px solid #dddddd; border-bottom:1px solid #dddddd; cursor:pointer;}	
+	.file-item .attach .subject ul li:hover .file-check{display: block;}
+    .file-item .attach .subject ul li.on .file-check{ display: block; background: #ff5722; border-color:#ff5722}
+	.file-item .attach .subject ul li .layui-btn-ctrl{position:absolute; top:0; right:0; display:none;}
+	.file-item .attach .subject ul li:hover .layui-btn-ctrl{display:block}
+	
+    .file-item .attach .footer { display: flex; align-items: center; justify-content: end; padding: 5px 15px 0; height: 45px; border-top: 1px solid #f2f2f2; text-align: center; background: #ffffff; }
+
+    /** 无数据 **/
+    .file-item .empty { display: flex; flex: 1; align-items: center; flex-direction: column; justify-content: center; overflow: hidden; text-align: center; color: #cccccc; }
+    .file-item .empty i { font-size: 180px; }
+    .file-item .empty p { width: 180px; text-align: center; }
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<div class="container">
+	<div class="file-container">
+		<div class="file-header">
+			<div class="layui-tab layui-tab-brief" lay-filter="tab">
+				<ul class="layui-tab-title">
+					<li class="layui-this" data-tab="0">全部</li>
+					<li data-tab="1">图片</li>
+					<li data-tab="2">视频</li>
+					<li data-tab="3">文档</li>
+					<li data-tab="4">压缩包</li>
+				</ul>
+			</div>
+		</div>
+		<div class="file-item">
+			<!-- 分组 -->
+			<div class="group">
+				<ul id="group" class="groups">					
+					<li data-id="" class="active"><i class="iconfont icon-xiangmuguanli"></i><span>全部</span></li>
+					<li data-id="0"><i class="iconfont icon-xiangmuguanli"></i><span>未分组</span></li>					
+				</ul>
+				<div class="footer">
+					<span class="layui-btn layui-btn-primary layui-btn-sm add-new">添加分组</span>
+				</div>
+			</div>
+			<!-- 文件 -->
+			<div class="attach">
+				<!-- 工具 -->
+				<form class="layui-form" lay-filter="barsearchform" style="display:block; margin:0;padding:0;">
+					<div class="header">
+						<div class="layui-btn-group">
+							<span class="layui-btn layui-btn-sm layui-btn-normal" id="fileUpload">上传文件</span>
+							<span class="layui-btn layui-btn-sm layui-btn-danger" id="fileDelete">批量删除</span>
+							<span class="layui-btn layui-btn-sm layui-btn-warm" id="fileMove">移动至 <i class="layui-icon layui-icon-triangle-d"></i></span>
+							<span style="margin-left:36px;"><input type="checkbox" name="select_all" lay-filter="all" title="全选"></span>
+						</div>
+
+						<div class="search">
+							<input type="hidden" name="limit" value="44" />
+							<input type="hidden" name="page" value="1" />
+							<input type="hidden" name="tab" value="0" />
+							<input type="hidden" name="group_id" value="" />
+							<label><input type="text" name="keywords" placeholder="请输入名称" autocomplete="off" class="layui-input"></label>
+							<button type="button" class="layui-btn layui-btn-sm layui-btn-primary" lay-submit="" lay-filter="webform"><i class="layui-icon layui-icon-search"></i></button>
+						</div>
+					</div>
+				</form>
+				<!-- 主体 -->
+				<div class="subject">
+					<ul id="filesBox"></ul>
+				</div>
+				<!-- 页脚 -->
+				<div class="footer">
+					<div id="laypage"></div>
+				</div>
+			</div>
+		</div>
+    </div>
+</div>
+<script type="text/html" id="toolbarDemo">
+<h3 class="h3-title" style="height:28px;">审批列表</h3>
+</script>						
+{/block}
+<!-- /主体 -->
+{block name="copyright"}{/block}
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool ,form = layui.form,laypage = layui.laypage,upload = layui.upload, element=layui.element, dropdown=layui.dropdown;
+		let fileGroup = [{id:0,title:'未分组'}];
+		element.on('tab(tab)', function(data){
+			$('[name="tab"]').val(data.index);
+			$('[lay-filter="webform"]').click();
+			return false;
+		});	
+		
+		//监听多选框点击事件  通过 lay-filter="menu"来监听
+		form.on('checkbox(all)', function (data) {
+		　　let val = data.value;
+			if(data.elem.checked){
+				//判断当前多选框是选中还是取消选中
+				$('#filesBox li').addClass('on');
+			}
+			else{
+				$('#filesBox li').removeClass('on');
+			}
+		});
+
+		var uploadInst = upload.render({
+			elem: '#fileUpload'
+			,url: "/api/index/upload"
+			, accept: 'file' //普通文件
+			, exts: 'jpeg|jpg|png|gif|doc|docx|ppt|pptx|xls|xlsx|pdf|zip|rar|7z|txt|mp4|psd|svg' //只允许上传文件
+			, before: function (obj) {
+				layer.msg('上传中...', { time: 3600000 });
+			}
+			,done: function (res) {
+				layer.msg(res.msg);
+				$('[lay-filter="webform"]').click();
+			}, error: function (index, upload) {
+				layer.msg('上传失败');
+			}
+		});
+		
+		$('body').on('click','.add-new',function(){
+			add_group(0,'');	
+		});
+		
+		$('#group').on('click','li',function(){
+			let id=$(this).data('id');
+			$(this).siblings().removeClass('active');
+			$(this).addClass('active');
+			$('[name="group_id"]').val(id);
+			$('[lay-filter="webform"]').click();
+		});
+			
+		$('#fileDelete').on('click',function(){
+			let select_array = [];
+			$('#filesBox').find('li.on').each(function(index,item){
+				select_array.push($(item).data('id'));			
+			})
+			if(select_array.length<1){
+				layer.msg('请先选择文件');
+			}
+			else{
+				layer.confirm('确定要删除这些文件吗？请慎重', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.closeAll();
+						layer.msg(e.msg);
+						$('[lay-filter="webform"]').click();
+					}
+					tool.delete("/home/files/delete", {ids:select_array.join(',')}, callback);
+				});
+			}
+		});
+		
+		function add_group(id,val){
+			var title = '新增分组';
+			if(id>0){
+				title = '编辑分组';
+			}
+			layer.prompt({
+				title: title,
+				value: val,
+				yes: function(index, layero) {
+					// 获取文本框输入的值
+					var value = layero.find(".layui-layer-input").val();
+					if (value!='') {
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if(e.code==0){
+								location.reload();
+							}
+						}
+						tool.post("/home/files/add_group", {id: id,title: value}, callback);
+						layer.close(index);
+					} else {
+						layer.msg('请填写分组名称');
+					}
+				}
+			})
+		}
+			
+		var data = form.val('barsearchform');
+		get_files(data);
+		get_group();
+		
+		function get_group(param){
+			$.ajax({
+				url:"/home/files/get_group",
+				success:function(res){
+					if(res.code==0){
+						var group=res.data,item='';
+						if(group.length>0){
+							for(var a=0;a<group.length;a++){
+								item+='<li data-id="'+group[a].id+'" data-title="'+group[a].title+'"><i class="iconfont icon-xiangmuguanli"></i><span>'+group[a].title+'</span><i class="layui-icon layui-icon-more-vertical dropdown-on"></i></li>';
+							}
+							$('#group').append(item);
+							fileGroup = fileGroup.concat(group);
+							// 自定义事件
+							dropdown.render({
+								elem: '.dropdown-on',
+								trigger: 'hover',
+								align: 'right',
+								data: [{
+								  title: '重命名分组',
+								  id: 100
+								},{
+								  title: '删除该分组',
+								  id: 101
+								}],
+								click: function(data, othis){
+									let id = $(this.elem).parent().data('id');
+									let title = $(this.elem).parent().data('title');
+									if(data.id==100){
+										add_group(id,title);
+									}else{
+										del_group(id);
+									}							
+								}
+							});
+						}
+							
+						group.push({id:0,title:'未分组'});
+						dropdown.render({
+							elem: '#fileMove',
+							data: group,
+							click: function(obj){
+								let select_array = [];
+								$('#filesBox').find('li.on').each(function(index,item){
+									select_array.push($(item).data('id'));			
+								})
+								if(select_array.length<1){
+									layer.msg('请先选择文件');
+								}
+								else{				
+									layer.confirm('确定要把选中的文件移动到『'+obj.title+'』分组吗？', { icon: 3, title: '提示' }, function (index) {
+										let callback = function (e) {
+											layer.closeAll();
+											layer.msg(e.msg);
+											$('[lay-filter="webform"]').click();
+										}
+										tool.delete("/home/files/move", {group_id:obj.id,ids:select_array.join(',')}, callback);
+									});
+								}
+							}
+						});
+					}
+				}
+			});
+		}
+		
+		function del_group(id) {
+			layer.confirm('确定要删除该分组吗？请慎重', { icon: 3, title: '提示' }, function (index) {
+				let callback = function (e) {
+					layer.closeAll();
+					layer.msg(e.msg);
+					if(e.code==0){
+						location.reload();
+					}
+				}
+				tool.delete("/home/files/del_group", {ids:id}, callback);
+			});
+		}
+		
+		
+		function get_files(param){
+			var loadIndex = layer.load(0);
+			$.ajax({
+				url:"/home/files/index",
+				data:param,
+				complete:function(){
+					setTimeout(function(){
+						layer.close(loadIndex)
+					}, 200);
+				},
+				success:function(res){
+					$('[name="select_all"]').prop('checked', false);
+					form.render('checkbox');
+					if(res.code==0){
+						laypage.render({
+							elem: 'laypage',
+							limit:param['limit'],
+							curr:param['page'],
+							count: res.count, // 数据总数
+							jump: function(obj, first){
+								console.log(obj.curr); // 得到当前页，以便向服务端请求对应页的数据。
+								console.log(obj.limit); // 得到每页显示的条数
+								// 首次不执行
+								if(!first){
+									var data = form.val('barsearchform');
+									data['page'] = obj.curr;
+									get_files(data);
+								}
+							}
+						});				
+					
+						var item=res.data,li='';
+						if(item.length>0){
+							for(var a=0;a<item.length;a++){
+								let image = ['jpg','jpeg','png','gif'];
+								let office = ['doc','docx','xls','xlsx','ppt','pptx'];
+								let doc = ['doc','docx','xls','xlsx','ppt','pptx','txt','pdf','zip','rar','7z'];
+								
+								let type = 0,ext="zip";
+								// 判断元素是否在数组中
+								let path='/static/home/images/icon/file.png';
+								if (image.includes(item[a].fileext)) {
+									path=item[a].filepath;
+									type = 1;
+									ext="image";
+								}
+								if (item[a].fileext == 'pdf'||item[a].fileext == 'txt') {
+									type = 1;
+									ext="pdf";
+								}
+								if (office.includes(item[a].fileext)) {
+									type = 1;
+									ext="office";
+								}
+								
+								if (doc.includes(item[a].fileext)){
+									path='/static/home/images/icon/'+item[a].fileext+'.png';
+								}
+								
+								ctrl = '<span class="layui-btn layui-btn-xs layui-btn-normal file-ctrl" data-ctrl="edit" data-id="'+item[a].id+'" data-fileid="'+item[a].id+'" data-href="'+item[a].filepath+'" data-filename="'+item[a].name+'" data-ext="'+ext+'" data-type="'+type+'">操作</span>';
+								
+								li+='<li data-id="'+item[a].id+'" data-title="'+item[a].name+'" data-ext="'+item[a].fileext+'"><img src="'+path+'" alt="'+item[a].name+'" style="object-fit: contain;" class="file-items file-'+ext+'"><p title="'+item[a].name+'">'+item[a].name+'</p><div class="layui-btn-ctrl">'+ctrl+'<span class="name-edit green" style="display:none;" data-id="'+item[a].id+'" data-fileid="'+item[a].id+'" id="fileEdit'+item[a].id+'" title="重命名"></span><span class="file-delete red" style="display:none;" data-id="'+item[a].id+'" data-fileid="'+item[a].id+'" id="fileDel'+item[a].id+'" title="删除"></span></div><div class="file-check">✔</div></li>';
+							}
+							$('#filesBox').html(li);
+							$('#laypage').show();
+						}
+						else{
+							$('#filesBox').html('<div class="empty"><i class="layui-icon layui-icon-upload"></i><p>无文件文件，赶紧去上传吧!</p></div>');
+							$('#laypage').hide();
+						}
+					}	
+				}				
+			});
+		}
+		
+		$('#filesBox').on('click','.file-check',function(){
+			$(this).parent().toggleClass("on");
+		})
+		
+		$('#filesBox').on('click','.file-delete',function(){
+			let id = $(this).parent().parent().data('id');
+			layer.confirm('确定要删除该文件吗？请慎重', { icon: 3, title: '提示' }, function (index) {
+				let callback = function (e) {
+					layer.closeAll();
+					layer.msg(e.msg);
+					$('[lay-filter="webform"]').click();
+				}
+				tool.delete("/home/files/delete", {ids:id}, callback);
+			});
+		})
+		
+		$('#filesBox').on('click','.name-edit',function(){
+			let id = $(this).parent().parent().data('id');
+			let title = $(this).parent().parent().data('title');
+			let ext = $(this).parent().parent().data('ext');
+			layer.prompt({
+				title: '重命名',
+				value: title.replace(/\.[^.]+$/, ""),
+				yes: function(index, layero) {
+					// 获取文本框输入的值
+					var value = layero.find(".layui-layer-input").val();
+					if (value!='') {
+						let callback = function (e) {
+							layer.msg(e.msg);
+							$('[lay-filter="webform"]').click();
+						}
+						tool.post("/home/files/edit", {id: id,title: value+'.'+ext}, callback);
+						layer.close(index);
+					} else {
+						layer.msg('请填写文件名称');
+					}
+				}
+			})
+		})
+		
+		//查看文件
+		$('#filesBox').on('click','.file-image',function(){
+			let href = $(this).attr('src');
+			tool.photoView(href);
+		})
+		
+		//监听搜索提交
+		form.on('submit(webform)', function(data) {
+			get_files(data.field);
+			return false;
+		});
+
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/index/contacts_book.html b/app/home/view/index/contacts_book.html
new file mode 100644
index 0000000000000000000000000000000000000000..f3181f38403e5c21044372bfe02b6ad619d0c12a
--- /dev/null
+++ b/app/home/view/index/contacts_book.html
@@ -0,0 +1,131 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+  <style>
+	.tree-left{width:200px; float:left; height:calc(100vh - 79px); overflow-y: auto; border:1px solid #eeeeee; border-right:0; background-color:#fbfbfb; padding:12px 12px 12px 5px;}
+	.tree-left::-webkit-scrollbar {width: 0;}
+	.tree-left h3{font-size:16px; height:30px; padding-left:10px; font-weight:800}
+  </style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<div class="tree-left">
+		<h3>企业通讯录</h3>
+		<div id="depament"></div>
+	</div>
+	<div class="body-table" style="margin-left:200px; overflow:hidden;">
+		<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
+			<div class="layui-input-inline" style="width:360px">
+				<input type="text" name="keywords" placeholder="关键字，如：ID号/姓名/登录账号/手机号码/电子邮箱" class="layui-input" autocomplete="off" />
+			</div>
+			<div class="layui-input-inline" style="width:150px;">
+				<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+				<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+			</div>
+		</form>
+		<table class="layui-hide" id="test" lay-filter="test"></table>
+	</div>
+</div>
+
+<script type="text/html" id="thumb">
+	<img src="{{d.thumb}}" width="30" height="30" />
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool,tree = layui.tree,form = layui.form;			
+		$.ajax({
+			url: "/api/index/get_department_tree",
+			type:'get',
+			success:function(res){					
+				//仅节点左侧图标控制收缩
+				tree.render({
+					elem: '#depament',
+					data: res.trees,
+					onlyIconControl: true,  //是否仅允许节点左侧图标控制展开收缩
+					click: function(obj){
+						//layer.msg(JSON.stringify(obj.data));
+						$('#depament').find('.layui-tree-main').removeClass('on');
+						$(obj.elem).find('.layui-tree-main').eq(0).addClass('on');
+						layui.pageTable.reload({
+						   where: {did: obj.data.id}
+						   ,page:{curr:1}
+						});
+						$('[name="keywords"]').val('');
+						layui.form.render('select');
+					}
+				});	
+			}
+		})		
+		
+		layui.pageTable = table.render({
+			elem: '#test',
+			title: '通讯录',
+			url: "/home/index/contacts_book", //数据接口				
+			height: 'full-112',
+			cols: [
+				[{
+						field: 'thumb',
+						title: '头像',
+						toolbar: '#thumb',
+						align: 'center',
+						width: 60
+					}, {
+						field: 'name',
+						title: '用户姓名',
+						align: 'center',
+						width: 80
+					},{
+						field: 'mobile',
+						title: '手机号码',
+						align: 'center',
+						width: 120
+					},{
+						field: 'email',
+						title: '电子邮箱'
+					},{
+						field: 'sex',
+						title: '性别',
+						align: 'center',
+						width: 60,
+						templet: function (d) {
+							var html = '未知';
+							if(d.sex == 1){
+								html = '男'
+							}
+							else if(d.sex == 2){
+								html = '女'
+							}
+							return html;
+						}
+					},{
+						field: 'department',
+						title: '所在部门',
+						width: 120
+					},{
+						field: 'departments',
+						title: '次要部门',
+						width: 200
+					}, {
+						field: 'position',
+						title: '岗位职称',
+						align: 'center',
+						width: 100
+					}, {
+						field: 'entry_time',
+						title: '入职日期',
+						align: 'center',
+						width: 100
+					}
+				]
+			]
+		});
+	}	
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/index/edit_password.html b/app/home/view/index/edit_password.html
new file mode 100644
index 0000000000000000000000000000000000000000..a6af350477e4c125fc7701ec291e83eb19c9456e
--- /dev/null
+++ b/app/home/view/index/edit_password.html
@@ -0,0 +1,74 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	{notempty name="$admin.reg_pwd"}
+	<div style="text-align:center; padding:20px 0; font-size:18px; color:#FF5722">初始化密码才能正常使用系统</div>
+	{/notempty}
+	<h3 class="pb-3">重置密码</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+		  <td class="layui-td-gray">旧密码<font>*</font></td>
+		  <td>
+			<input type="password" lay-verify="required" name="old_pwd" placeholder="请输入旧密码" lay-reqText="请输入旧密码" autocomplete="off" class="layui-input">
+		  </td>
+		  <td class="layui-td-gray">用户名</td>
+		  <td>{$admin.username}</td>
+		</tr>
+		<tr>
+		  <td class="layui-td-gray">新密码<font>*</font></td>
+		  <td>
+			<input type="password" lay-verify="required" name="pwd" placeholder="请输入新密码" lay-reqText="请输入新密码"  autocomplete="off" class="layui-input">
+		  </td>
+		  <td class="layui-td-gray-2">确认新密码<font>*</font></td>
+		  <td>
+			<input type="password" lay-verify="required" name="pwd_confirm" placeholder="请再次输入新密码"  lay-reqText="请再次输入新密码" autocomplete="off" class="layui-input">
+		  </td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var form = layui.form;
+    //监听提交
+    form.on('submit(webform)', function (data) {
+      $.ajax({
+        url: "/home/index/edit_password",
+        type: 'post',
+        data: data.field,
+        success: function (e) {
+          if (e.code == 0) {
+            layer.msg('修改密码成功,使用新密码登录');
+			//注销
+			$.ajax({
+				url: "/home/login/login_out.html",
+				success: function (e) {
+					if (e.code == 0) {
+						setTimeout(function () {
+							parent.location.href = "/home/login/index.html"
+						}, 2000)
+					}
+				}
+			})
+          } else {
+            layer.msg(e.msg);
+          }
+        }
+      })
+      return false;
+    });
+  }
+
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/index/edit_personal.html b/app/home/view/index/edit_personal.html
new file mode 100644
index 0000000000000000000000000000000000000000..9dbce6cc59110626ae081379204d77a65b9b5930
--- /dev/null
+++ b/app/home/view/index/edit_personal.html
@@ -0,0 +1,108 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">修改个人信息</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">用户名</td>
+			<td>{$admin.username}</td>
+			<td class="layui-td-gray">姓名</td>
+			<td>{$admin.name}</td>
+			<td class="layui-td-gray" rowspan="4">头像</td>
+			<td rowspan="4">
+				<div class="layui-upload">
+					<button type="button" class="layui-btn layui-btn-normal" id="test1">上传头像</button>
+					<div class="layui-upload-list" id="demo1">
+						<img src="{$admin.thumb}" width="100" />
+						<input type="hidden" name="thumb" value="{$admin.thumb}">
+					</div>
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">手机号码</td>
+			<td>{$admin.mobile}</td>
+			<td class="layui-td-gray">性别</td>
+			<td>
+				<input type="radio" name="sex" value="1" title="男" {eq name="$admin.sex" value="1"} checked{/eq}>
+				<input type="radio" name="sex" value="2" title="女" {eq name="$admin.sex" value="2"} checked{/eq}>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">所在部门</td>
+			<td>{$admin.department}</td>
+			<td class="layui-td-gray">岗位职称</td>
+			<td>{$admin.position}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">员工类型</td>
+			<td>
+				{eq name="$admin.type" value="3"}<span style="color:#5FB878">实 习 生</span>{/eq}
+				{eq name="$admin.type" value="2"}<span style="color:#01AAED">试用员工</span>{/eq}
+				{eq name="$admin.type" value="1"}<span style="color:#393D49">正式员工</span>{/eq}
+			</td>
+			<td class="layui-td-gray">入职日期</td>
+			<td>
+				{$admin.entry_time | date='Y-m-d'}
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">个人简介</td>
+			<td colspan="5">
+				<textarea name="desc" placeholder="请输入个人简介" class="layui-textarea">{$admin.desc|default=''}</textarea>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,upload = layui.upload;
+		//头像上传
+		var uploadInst = upload.render({
+			elem: '#test1',
+			url: "/api/index/upload",
+			done: function (res) {
+				layer.msg(res.msg);
+				if (res.code == 0) {
+					//上传成功
+					$('#demo1 input').attr('value', res.data.filepath);
+					$('#demo1 img').attr('src', res.data.filepath);
+				}
+			}
+		});
+
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			$.ajax({
+				url: "/home/index/edit_personal",
+				type: 'post',
+				data: data.field,
+				success: function (e) {
+					if (e.code == 0) {
+						layer.confirm('保存成功,关闭本页面吗?', { icon: 3, title: '提示' }, function (index) {
+							parent.layui.tool.tabClose();
+							layer.close(index);
+						});
+					} else {
+						layer.msg(e.msg);
+					}
+				}
+			})
+			return false;
+		});
+	}
+
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/index/index.html b/app/home/view/index/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..d5f6ef57380ed455011e0a2aba2f7ba8ef81e288
--- /dev/null
+++ b/app/home/view/index/index.html
@@ -0,0 +1,267 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<link rel="stylesheet" href="{__GOUGU__}/gougu/css/layout.css" media="all">
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<div class="layui-layout-body">
+    <div id="GouguApp">
+        <div class="layui-layout gg-layout layout-menu-{$system.menu_mode|default='classical'}">
+            <div class="layui-header">
+                <!-- 头部区域 -->
+                <div class="layui-layout-left">
+                    <span class="gg-head-item">
+                        <a href="javascript:;" gg-event="shrink" title="侧边伸缩"><i class="layui-icon layui-icon-shrink-right"></i></a>
+                    </span>
+                    <span class="gg-head-item gg-head-cache">
+                        <a href="javascript:;" gg-event="cache" data-href="/api/index/cache_clear" title="清空缓存"><i class="layui-icon layui-icon-fonts-clear"></i></a>
+                    </span>
+                    <span class="gg-head-item gg-head-home">
+                        <a href="https://www.gougucms.com/home/pages/detail/s/gouguoa.html" target="_blank" title="前台首页"><i class="layui-icon layui-icon-website"></i></a>
+                    </span>
+					<span class="gg-head-item gg-head-home">
+                        <a class="tab-a" data-href="/crud/crud/index" data-title="简单CRUD" title="简单CRUD"><i class="layui-icon layui-icon-template"></i></a>
+                    </span>
+                </div>
+
+                <div class="layui-layout-right">
+                    <span class="gg-head-item gg-head-refresh">
+                        <a href="javascript:;" class="refreshThis" gg-event="refresh" title="刷新页面">
+                            <i class="layui-icon layui-icon-refresh"></i>
+                        </a>
+                    </span>
+                    <span class="gg-head-item gg-head-screen" title="切换全屏">
+                        <a href="javascript:;" gg-event="screen" data-screen="full">
+                            <i class="fullScreen layui-icon layui-icon-screen-full"></i>
+                        </a>
+                    </span>
+					<span class="gg-head-item gg-head-set">
+                        <a href="javascript:;" id="theme" title="切换主题">
+                            <i class="layui-icon layui-icon-set"></i>
+                        </a>
+                    </span>
+					<span class="gg-head-item gg-head-set">
+                        <a href="/home/login/lock.html" title="锁屏">
+                            <i class="iconfont icon-suozhu" style="font-size:21px; font-weight:800"></i>
+                        </a>
+                    </span>
+                    <span class="gg-head-item gg-head-message">
+                        <a href="javascript:;" data-href="/home/message/inbox" data-id="1000" data-title="消息中心" class="tab-a" title="消息中心">
+                            <i class="layui-icon layui-icon-notice"></i>
+                            <!-- 如果有新消息，则显示 -->
+                            <div class="gg-message-num" id="msgNum" style="display: none;"><span>0</span></div>
+                        </a>
+                    </span>
+                    <span class="gg-head-item gg-head-avatar">
+                        <ul class="layui-nav">
+                            <li class="layui-nav-item">
+                                <a href="javascript:;">
+									<img src="{$login_admin.thumb}" onerror="javascript:this.src='{__IMG__}/nonepic360x360.jpg';this.onerror=null;">
+                                    <cite>{$login_admin.nickname}</cite>
+                                </a>
+                                <dl class="layui-nav-child" style="text-align: center; cursor: pointer;">
+                                    <dd><a data-href="/home/index/edit_personal" data-id="1001" data-title="基本资料" class="tab-a">基本资料</a></dd>
+                                    <dd><a data-href="/home/index/edit_password" data-id="1002" data-title="修改密码" class="tab-a">修改密码</a></dd>
+                                    <hr>
+                                    <dd gg-event="logout"><a>退出</a></dd>
+                                </dl>
+                            </li>
+                        </ul>
+                    </span>
+                </div>
+            </div>
+
+            <!-- 侧边菜单 -->
+			{empty name="$system.menu_mode"}
+				{include file="/index/menu_classical" /}
+			{else/}
+				{if ($system.menu_mode == 'expand') }
+					{include file="/index/menu_expand" /}
+				{else/}
+					{include file="/index/menu_classical" /}
+				{/if}
+			{/empty}
+            <!-- 页面标签 -->
+            <div id="pageTabs" class="page-tabs">
+                <div class="layui-icon gg-tabs-control layui-icon-prev" gg-event="tabRollLeft"></div>
+                <div class="layui-icon gg-tabs-control layui-icon-next" gg-event="tabRollRight"></div>
+                <div class="layui-icon gg-tabs-control layui-icon-down">
+                    <ul class="layui-nav gg-tabs-select">
+                        <li class="layui-nav-item">
+                            <a href="javascript:;"></a>
+                            <dl class="layui-nav-child layui-anim-fadein">
+                                <dd gg-event="closeThisTabs"><a href="javascript:;">关闭当前</a></dd>
+                                <dd gg-event="closeOtherTabs"><a href="javascript:;">关闭其它</a></dd>
+                                <dd gg-event="closeAllTabs"><a href="javascript:;">关闭全部</a></dd>
+                            </dl>
+                        </li>
+                    </ul>
+                </div>
+                <div class="layui-tab gg-admin-tab" lay-unauto lay-allowClose="true" lay-filter="gg-admin-tab">
+                    <ul class="layui-tab-title" id="pageTabUl">
+                        <li lay-id="0" lay-attr="view/home/index.html" class="layui-this"><i class="iconfont icon-xueshuguanli"></i></li>
+                    </ul>
+                </div>
+            </div>
+
+            <!-- 主体内容 -->
+            <div class="layui-body" id="GouguAppBody">
+                <div class="gg-tab-page layui-show" id="tabItem0" data-id="0">
+                    <iframe id="0" data-frameid="0" title="勾股OA" name="myiframe" src="{:url('/home/index/main')}" frameborder="0" data-timestamp="0" align="left" width="100%" height="100%" scrolling="yes"></iframe>
+                </div>
+            </div>
+            <!-- 辅助元素，用于移动设备下遮罩 -->
+            <div class="gg-body-shade" gg-event="shade"></div>
+			<!-- 新消息通知 -->
+            <div class="notification" style="display:none;">
+				<audio id="msgSound"><source src="{__STATIC__}/home/file/msg.mp3" type="audio/mpeg"></audio>
+			</div>
+        </div>
+    </div>
+</div>
+<!-- /主体 -->
+{/block}
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const msg_sound = {$system.msg_sound|default=1};
+	const watermark = {$system.watermark|default=1};
+	const watermarkTxt = '{$admin.name|default="勾股OA"} {:substr($admin.mobile, -4)}';
+	const moduleInit = ['tool','admin'];
+	function gouguInit() {
+		let admin = layui.admin;
+		let tabs = admin.getCookie('gougutab');
+		if(tabs && tabs!=''){
+			let tab_parse = JSON.parse(tabs);
+			let tab_id = tab_parse.tab_id,tab_array = tab_parse.tab_array;
+			if(tab_array.length>0){
+				for(let a=0; a<tab_array.length;a++){
+					admin.tabTem(tab_array[a].id, tab_array[a].url,tab_array[a].title);
+				}
+				if(tab_id>0){
+					admin.tabChange(tab_id);
+				}
+			}
+		}
+		admin.loading();
+		menuInit();
+		if(watermark==1){
+			createWatermark();
+		}
+		$('#GouguApp').on("click",'[gg-event="logout"]',function () {
+			layer.confirm('确认注销登录吗?', { icon: 7, title: '警告' }, function (index) {
+				//注销
+				$.ajax({
+					url: "/home/login/login_out",
+					success: function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							setTimeout(function () {
+								location.href = "{:url('home/login/index')}"
+							}, 1000)
+						}
+					}
+				})
+				layer.close(index);
+			});
+		});
+		layui.dropdown.render({
+			elem: '#theme',
+			trigger: 'mousedown',
+			align: 'center',
+			data: [{
+				title: '经典黑',
+				theme: 'black'
+			},{
+				title: '简约白',
+				theme: 'white'
+			},{
+				title: '海军蓝',
+				theme: 'blue'
+			}],
+			click: function(data, othis){
+				$.ajax({
+					url: "/home/index/set_theme",
+					data:{'theme':data.theme},
+					success: function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							setTimeout(function () {
+								parent.location.reload();
+							}, 1000)
+						}
+					}
+				})
+			}
+		});
+		//轮循获取消息
+		let msg_num = 0,msg_bool=false;
+		const msgSound = document.getElementById("msgSound");
+		$(document).ready(function(){
+			$(document).one('click',function(){
+				msg_bool = true;
+				//console.log("页面被点击了");
+			});
+		});
+		
+		$("#GouguAppBody").find('.gg-tab-page.layui-show iframe').on("load", function() {
+			var iframeDocument = $(this).contents();
+			iframeDocument.one('click',function(){
+				msg_bool = true;
+				//console.log("子页面被点击了");
+			});
+		});	
+		
+		var getStatus = setInterval(function () {
+			$.ajax({
+				url: "/api/index/get_msg",
+				type:'post',
+				success:function(e){
+					if(e.code==0 && e.data!==''){
+						if(e.data>0){
+							$('#msgNum').show().find('span').html(e.data);
+							if(e.data!=msg_num && msg_bool == true && msg_sound==1){
+								msgSound.play();
+								msg_num = e.data;
+							}
+						}
+						else{
+							$('#msgNum').hide().find('span').html(0);
+						}
+					}else{
+						layer.closeAll();
+					}
+				}
+			})
+		}, 10000);
+	}
+
+	function createWatermark(){
+		var canvas = document.createElement('canvas');
+		canvas.width = 300;
+		canvas.height = 200;
+		var ctx = canvas.getContext('2d');
+		ctx.font = '14px Arial';
+		ctx.fillStyle = '#dddddd';
+		ctx.textAlign = 'left';
+		ctx.textBaseline = 'top';
+		ctx.rotate(15 * Math.PI / 180);
+		ctx.fillText(watermarkTxt, 20, 50);
+		ctx.fillText(watermarkTxt, 180, 120);
+		var dataURL = canvas.toDataURL('image/png');
+		let node = document.createElement("div");
+		node.style.pointerEvents = "none";
+		node.style.position = "fixed";
+		node.style.width = "100%";
+		node.style.height = "100%";
+		node.style.top = "0";
+		node.style.left = "0";
+		node.style.opacity = "0.36";
+		node.style.zIndex = "998";
+		node.style.background = 'url("' + dataURL + '")  0 0 repeat';
+		// 将创建的元素插入body中，作为body的子元素
+		document.body.appendChild(node);
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/index/layout_action.html b/app/home/view/index/layout_action.html
new file mode 100644
index 0000000000000000000000000000000000000000..3ed3ae846c78b015dd97e4cfb8380441fc97f0fe
--- /dev/null
+++ b/app/home/view/index/layout_action.html
@@ -0,0 +1,37 @@
+<div class="layui-row layui-col-space16">
+	<div class="layui-col-md12">
+		<div class="layui-card">
+			<div class="layui-card-header"><h3>员工动态</h3><a data-title="员工动态" data-href="/home/index/log_list" class="pull-right tab-a">更多</a></div>
+			<div class="layui-card-body">
+				<ul class="layui-timeline" id="logs"></ul>
+			</div>
+		</div>
+	</div>
+</div>
+<script>
+//动态
+function layoutAction() {
+	$.ajax({
+		url: "/home/index/log_list",
+		type: 'get',
+		data: {
+			page: 1,
+			limit: 20
+		},
+		success: function (e) {
+			if (e.code == 0) {
+				var html = '';
+				$.each(e.data, function (key, value) {
+					html += '<li class="layui-timeline-item">\
+									<i class="layui-icon layui-timeline-axis"></i>\
+									<div class="layui-timeline-content layui-text">\
+									  <div class="layui-timeline-title"><span title="'+ value.id + '">' + value.times + '</span>，' + value.content + '</div>\
+									</div>\
+								  </li>';
+				});
+				$('#logs').html(html);
+			}
+		}
+	})
+}
+</script>
\ No newline at end of file
diff --git a/app/home/view/index/layout_approve.html b/app/home/view/index/layout_approve.html
new file mode 100644
index 0000000000000000000000000000000000000000..566b488e7e40dd780b7f0f5df70ae56abea2ea9d
--- /dev/null
+++ b/app/home/view/index/layout_approve.html
@@ -0,0 +1,35 @@
+<div class="layui-row layui-col-space16">
+	<div class="layui-col-md12">
+		<div class="layui-card">
+			<div class="layui-card-header"><h3>办公审批</h3><a href="javascript:;" data-href="/home/approve/index" class="side-a pull-right">去申请</a></div>
+			<div class="layui-card-body layui-short-menu p-3">
+				<ul class="layui-row layui-col-space12">
+					<li class="layui-col-xs3">
+						<a href="javascript:;" data-href="/home/approve/index" class="side-a">
+							<i class="iconfont icon-kechengziyuanguanli"></i>
+							<cite>审批申请</cite>
+						</a>
+					</li>
+					<li class="layui-col-xs3">
+						<a href="javascript:;" data-href="/home/approve/mylist" class="side-a">
+							<i class="iconfont icon-jiaoshiguanli"></i>
+							<cite>我申请的</cite>
+						</a>
+					</li>
+					<li class="layui-col-xs3">
+						<a href="javascript:;" data-href="/home/approve/checklist" class="side-a">
+							<i class="iconfont icon-tuiguangguanli"></i>
+							<cite>我处理的</cite>
+						</a>
+					</li>
+					<li class="layui-col-xs3">
+						<a href="javascript:;" data-href="/home/approve/copylist" class="side-a">
+							<i class="iconfont icon-xueshengchengji"></i>
+							<cite>抄送给我的</cite>
+						</a>
+					</li>
+				</ul>
+			</div>
+		</div>
+	</div>
+</div>				
\ No newline at end of file
diff --git a/app/home/view/index/layout_chartview.html b/app/home/view/index/layout_chartview.html
new file mode 100644
index 0000000000000000000000000000000000000000..dbed63cb558b7490960acf1507936f7ad1f90dfe
--- /dev/null
+++ b/app/home/view/index/layout_chartview.html
@@ -0,0 +1,122 @@
+<div class="layui-row layui-col-space16">
+	<div class="layui-col-md12">
+		<div class="layui-card">
+			<div id="chartView" style="width: 100%;height:300px;"></div>
+		</div>
+	</div>
+</div>
+<script>
+var chartView;
+function layoutChartView() {
+	chartView = echarts.init(document.getElementById('chartView'));
+	$.ajax({
+		url: "/home/api/get_view_data",
+		type: 'get',
+		data: {},
+		success: function (e) {
+			if (e.code == 0) {
+				var data_first = e.data.data_first;
+				var data_second = e.data.data_second;
+				var myDate = new Date();
+				var nowHour = myDate.getHours(); //获取当前小时数(0-23)
+				var xData = [];
+				var yData1 = [];
+				var yData2 = [];
+				$.each(data_first, function (key, value) {
+					if (key <= nowHour) {
+						yData1.push(value);
+					}
+				});
+				$.each(data_second, function (key, value) {
+					xData.push(setHour(key));
+					yData2.push(value);
+				});
+				var ops = {
+					title: {
+						top: '12px',
+						text: '今日与昨日员工活跃度',
+						left: '6px',
+						textStyle: {
+							fontSize: '18',
+							color: '#333',
+						}
+					},
+					color: ["#1AAD19", "#1890FF"],
+					grid: {
+						left: '16px',
+						right: '30px',
+						bottom: '12px',
+						top: '60px',
+						containLabel: true
+					},
+					tooltip: {
+						trigger: 'axis',
+						axisPointer: {
+							type: 'cross',
+							crossStyle: {
+								color: '#999'
+							}
+						}
+					},
+					toolbox: {
+						show: true,
+					},
+					legend: {
+						data: ["今日", "昨日"],
+						top: '16px',
+					},
+					xAxis: [{
+						type: "category",
+						boundaryGap: !1,
+						data: xData,
+						axisLine: {
+							lineStyle: {
+								color: '#999999',
+								width: 1,
+							}
+						},
+					}],
+					yAxis: [{
+						type: "value",
+						axisLine: {
+							show: true,
+							lineStyle: {
+								color: '#999999',
+								width: 1,
+							}
+						},
+					}],
+					series: [{
+						name: "今日",
+						type: "line",
+						smooth: !0,
+						itemStyle: {
+							normal: {
+								areaStyle: {
+									type: "default",
+									opacity: 0.2
+								}
+							}
+						},
+						data: yData1
+					}, {
+						name: "昨日",
+						type: "line",
+						smooth: !0,
+						itemStyle: {
+							normal: {
+								areaStyle: {
+									type: "default",
+									opacity: 0.2
+								}
+							}
+						},
+						data: yData2
+					}]
+				}
+				chartView.setOption(ops);
+			}
+		}
+	})
+}
+</script>
\ No newline at end of file
diff --git a/app/home/view/index/layout_chartyear.html b/app/home/view/index/layout_chartyear.html
new file mode 100644
index 0000000000000000000000000000000000000000..a118d650383d235e69d707724bb1a1c8b7ba3d5d
--- /dev/null
+++ b/app/home/view/index/layout_chartyear.html
@@ -0,0 +1,97 @@
+<div class="layui-row layui-col-space16">
+	<div class="layui-col-md12">
+		<div class="layui-card">
+			<div id="chartYear" style="width: 100%;height:240px;"></div>
+		</div>
+	</div>
+</div>
+<script>
+var myChart;
+function layoutChartYear() {
+    myChart = echarts.init(document.getElementById('chartYear'));
+	$.ajax({
+		url: "/home/api/get_view_data",
+		type: 'get',
+		data: {},
+		success: function (e) {
+			if (e.code == 0) {			
+				let data= e.data.data_three;
+				let archiveCalendar = {};
+				data.forEach(item => {
+					// 将时间戳转换为日期对象
+					const timestamp = parseInt(item.create_time, 10);
+					const date = new Date(timestamp * 1000); // 转换为 JavaScript Date 对象
+					const dateString = date.toISOString().substring(0, 10); // 获取 YYYY-MM-DD 格式的日期
+
+					if (archiveCalendar[dateString]) {
+						archiveCalendar[dateString] += 1; // 如果日期已经存在，则增加计数
+					} else {
+						archiveCalendar[dateString] = 1; // 否则，初始化计数为1
+					}
+				});
+				let option = {
+					title: {
+						top: '12px',
+						text: '近一年员工活跃度',
+						left: '8px',
+						textStyle: {
+							fontSize: '18',
+							color: '#333',
+						}
+					},
+					tooltip: {
+						padding: 6,
+						formatter: function (obj) {
+							var value = obj.value;
+							return '<div style="font-size: 12px;">' + value[0] + '员工活跃度：' + value[1] + '</div>';
+						}
+					},
+					visualMap: {
+						min: 0,
+						max: 300,
+						show: false,
+						inRange: {
+							color: ['#fafafa', '#1AAD19']
+						}
+					},
+					calendar: {
+						top: 75,
+						left: 52,
+						right: 20,
+						range: getRange(),
+						cellSize: ['auto', 21],
+						splitLine: {
+							lineStyle: {
+								color: '#aaa',
+								type: 'dashed'
+							}
+						},
+						itemStyle: {
+							borderWidth: 0.5
+						},
+						yearLabel: { show: false },
+						monthLabel: {
+							nameMap: 'cn',
+							fontSize: 12
+						},
+						dayLabel: {
+							show: true,
+							formatter: '{start}  1st',
+							fontWeight: 'lighter',
+							nameMap: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
+							fontSize: 12
+						}
+					},
+					series: [{
+						type: 'heatmap',
+						coordinateSystem: 'calendar',
+						calendarIndex: 0,
+						data: getDay(archiveCalendar)
+					}]
+				};
+				myChart.setOption(option);
+			}
+		}
+	})
+}
+</script>
\ No newline at end of file
diff --git a/app/home/view/index/layout_count.html b/app/home/view/index/layout_count.html
new file mode 100644
index 0000000000000000000000000000000000000000..3bfe90b45b327589ec41a531104755d1ebc4e162
--- /dev/null
+++ b/app/home/view/index/layout_count.html
@@ -0,0 +1,16 @@
+<div class="layui-row layui-col-space16">
+	<div class="layui-col-md12">
+		<div class="layui-card panel-num">
+			<table>
+				<tr>
+				{volist name="$total" id="vo"}
+				  <td>
+					<div class="num-title">{$vo.name}</div>
+					<div class="blue">{$vo.num}</div>
+				  </td>
+				{/volist}
+				</tr>
+			</table>
+		</div>
+	</div>
+</div>
\ No newline at end of file
diff --git a/app/home/view/index/layout_event.html b/app/home/view/index/layout_event.html
new file mode 100644
index 0000000000000000000000000000000000000000..eabdb5d627c7803d568e5be8ffc428a04f228a1e
--- /dev/null
+++ b/app/home/view/index/layout_event.html
@@ -0,0 +1,39 @@
+<div class="layui-row layui-col-space16">
+	<div class="layui-col-md12">
+		<div class="layui-card">
+			<div class="layui-card-header"><h3>待办事项</h3></div>
+			<div class="layui-card-body layui-matter-item p-3">
+				<ul class="layui-row layui-col-space12">
+					{volist name="$handle" id="vo"}
+						<li class="layui-col-xs3">
+							<a href="javascript:;" data-href="{$vo.url}" data-id="{$vo.id}" class="tab-a" data-title="{$vo.name}" style="background-color:#F8FAFF">
+								<p>{$vo.name}</p>
+								<p class="pt-3"><cite class="blue">{$vo.num}</cite></p>
+							</a>
+						</li>
+					{/volist}
+				</ul>
+			</div>
+		</div>
+	</div>
+</div>			
+
+<div class="layui-row layui-col-space16">
+	<div class="layui-col-md12">
+		<div class="layui-card">
+			<div class="layui-card-header"><h3>紧急事项</h3></div>
+			<div class="layui-card-body layui-matter-item p-3">
+				<ul class="layui-row layui-col-space12">
+					{volist name="$todue" id="vo"}
+						<li class="layui-col-xs3">
+							<a href="javascript:;" data-href="{$vo.url}" data-id="{$vo.id}" class="tab-a" data-title="{$vo.name}" style="background-color:#FFF9F8">
+								<p>{$vo.name}</p>
+								<p class="pt-3"><cite class="red">{$vo.num}</cite></p>
+							</a>
+						</li>
+					{/volist}
+				</ul>
+			</div>
+		</div>
+	</div>
+</div>	
\ No newline at end of file
diff --git a/app/home/view/index/layout_fastentry.html b/app/home/view/index/layout_fastentry.html
new file mode 100644
index 0000000000000000000000000000000000000000..17e40ba215f83f8f81913f1480b9c36d39b0ccbc
--- /dev/null
+++ b/app/home/view/index/layout_fastentry.html
@@ -0,0 +1,70 @@
+<div class="layui-card layui-right-bar">
+	<div class="layui-row pt-3 px-3 py-2">
+		<ul class="layui-col-space12">
+			<li class="layui-col-xs3">
+				<a href="javascript:;" data-href="/home/index/contacts_book" data-id="2000" class="tab-a" data-title="通讯录">
+					<i class="iconfont icon-huamingce"></i>
+					<cite>通讯录</cite>
+				</a>
+			</li>
+			<li class="layui-col-xs3">
+				<a href="javascript:;" data-href="/oa/plan/calendar" data-id="100" class="tab-a" data-title="日程安排">
+					<i class="iconfont icon-kaoshijihua"></i>
+					<cite>日程安排</cite>
+				</a>
+			</li>
+			<li class="layui-col-xs3">
+				<a href="javascript:;" class="report-add">
+					<i class="iconfont icon-rizhiguanli"></i>
+					<cite>+工作汇报</cite>
+				</a>
+			</li>
+			<li class="layui-col-xs3">
+				<a href="javascript:;" class="work-add">
+					<i class="iconfont icon-renwujincheng"></i>
+					<cite>+工作记录</cite>
+				</a>
+			</li>
+		</ul>
+	</div>
+</div>
+<script>
+function layoutFastentry(tool,work,table){
+	$('.work-add').on('click',function(){
+		work.add(0,{'id':0});
+	})
+	$('.report-add').on('click',function(){
+		var type=[{'id':1,'title':'日报'},{'id':2,'title':'周报'},{'id':3,'title':'月报'}];
+		var tablereport;
+		layer.open({
+			title:'选择汇报类型',
+			type:1,
+			area:['360px','300px'],
+			content:'<div style="width:325px; padding:15px 15px 0"><div id="selectType"></div></div>',
+			success:function(){
+				tablereport=table.render({
+					elem: '#selectType',
+					cols: [[ //标题栏
+						{type:'radio',title: '选择'},
+						{field: 'title', title: '汇报类型'}
+					]],
+					data: type
+				  });			
+			},
+			btn:['确定'],
+			yes: function(idx){
+				var checkStatus = table.checkStatus(tablereport.config.id);
+				var data = checkStatus.data;
+				if(data.length>0){
+					tool.side('/oa/work/add?types='+data[0].id);
+					layer.close(idx);
+				}
+				else{
+					layer.msg('请选择汇报类型');
+					return false;
+				}
+			}
+		})
+	});
+}
+</script>
\ No newline at end of file
diff --git a/app/home/view/index/layout_note.html b/app/home/view/index/layout_note.html
new file mode 100644
index 0000000000000000000000000000000000000000..eced9c02bed46b75a59a3637a79197e1e4ea8427
--- /dev/null
+++ b/app/home/view/index/layout_note.html
@@ -0,0 +1,25 @@
+<div class="layui-row layui-col-space16">
+	<div class="layui-col-md12">
+		<div class="layui-card">
+			<div class="layui-card-title">公告列表</div>
+			<div style="padding: 12px;">
+				<table id="Note" lay-filter="Note" class="layui-hide" style="margin-top:0"></table>
+			</div>
+		</div>
+	</div>
+</div>
+<script>
+//公告
+function layoutNote(table){
+	table.render({
+		elem: '#Note'
+		, url: "/home/api/get_note_list" //数据接口
+		, page: false //开启分页
+		, cols: [[ //表头
+			{ field: 'cate_title', title: '公告分类', align: 'center','width': 90},
+			{ field: 'title', title: '公告标题',templet: '<div><a data-href="/oa/note/view/id/{{d.id}}.html" class="side-a">{{d.title}}</a></div>'},
+			{ field: 'create_time', title: '发布时间', align: 'center','width': 150}
+		]]
+	});
+}
+</script>
\ No newline at end of file
diff --git a/app/home/view/index/layout_project.html b/app/home/view/index/layout_project.html
new file mode 100644
index 0000000000000000000000000000000000000000..b3b61333ab881a5bf09b4c6a6ed1f86a984159f9
--- /dev/null
+++ b/app/home/view/index/layout_project.html
@@ -0,0 +1,33 @@
+<div class="layui-row layui-col-space16">
+	<div class="layui-col-md12">
+		<div class="layui-card">
+			<div class="layui-card-title">项目列表</div>
+			<div style="padding: 12px;">
+				<table id="Project" lay-filter="Project" class="layui-hide" style="margin-top:0"></table>
+			</div>
+		</div>
+	</div>
+</div>
+<script>
+//项目
+function layoutProject(table){
+	table.render({
+		elem: '#Project'
+		, url: "/project/api/get_project?limit=10" //数据接口
+		, page: false //开启分页
+		, cols: [[ //表头
+			{field: 'id', title: '项目编号', align: 'center','width': 90, templet: function (d) {
+				return 'P' + d.id;
+			}}
+			,{ field: 'status', title: '项目状态', align: 'center', width: 90, templet: function (d) {
+				var html = '<span class="check-status-color-' + d.status + '">『' + d.status_name + '』</span>';
+				return html;
+				}
+			}
+			,{field: 'name', title: '项目名称',minWidth:240,templet: '<div><a data-href="/project/index/view/id/{{d.id}}.html" class="side-a">{{d.name}}</a></div>'}
+			,{field:'director_name',title: '负责人',width:80,align:'center'}
+			,{ field:'range_time', title: '项目计划周期', align: 'center', width: 180}
+		]]
+	});
+}
+</script>
\ No newline at end of file
diff --git a/app/home/view/index/layout_ranking.html b/app/home/view/index/layout_ranking.html
new file mode 100644
index 0000000000000000000000000000000000000000..a9ffb94120f5f99f79fcd8645c148b063b0f3817
--- /dev/null
+++ b/app/home/view/index/layout_ranking.html
@@ -0,0 +1,62 @@
+<div class="layui-row layui-col-space16">
+	<div class="layui-col-md12">
+		<div class="layui-card">
+			<div class="layui-card-header"><h3>最活跃员工<span style="color:#999; font-size:14px; font-weight:400; margin-left:5px">最近30天前十的活跃度</span></h3></div>
+			<div class="layui-card-body">
+				<div id="logChart" style="width: 100%; height:268px;"></div>
+			</div>
+		</div>
+	</div>
+</div>
+<script>
+//动态
+var logChart;
+function layoutRaking() {
+	logChart = echarts.init(document.getElementById('logChart'));
+	$.ajax({
+		url: "/home/api/get_view_log",
+		type: 'get',
+		data: {},
+		success: function (e) {
+			if (e.code == 0) {
+				var data_logs = e.data.data_logs;
+				var logItem = [];
+				$.each(data_logs, function (key, value) {
+					let item = {
+						value: value.count,
+						name: value.name
+					};
+					logItem.push(item);
+				});
+				let optC = {
+					tooltip: {
+						trigger: 'item',
+						formatter: '{a} <br/>{b} :{d}%'
+					},
+					legend: {
+						top: '1%',
+						left: 'center'
+					},
+					series: [
+						{
+							name: '活跃度',
+							type: 'pie',
+							radius: '50%',
+							center: ['50%', '60%'],
+							data: logItem,
+							emphasis: {
+								itemStyle: {
+									shadowBlur: 10,
+									shadowOffsetX: 0,
+									shadowColor: 'rgba(0, 0, 0, 0.5)'
+								}
+							}
+						}
+					]
+				};
+				logChart.setOption(optC);
+			}
+		}
+	})
+}
+</script>
\ No newline at end of file
diff --git a/app/home/view/index/layout_system.html b/app/home/view/index/layout_system.html
new file mode 100644
index 0000000000000000000000000000000000000000..f8c0663bc0467457b8cdf7e50b5af1974c572e34
--- /dev/null
+++ b/app/home/view/index/layout_system.html
@@ -0,0 +1,68 @@
+<div class="layui-row layui-col-space16">
+	<div class="layui-col-md12">
+		<div class="layui-card">
+			<div class="layui-card-title">系统信息</div>
+			<div class="layui-card-body">
+				<table class="layui-table" lay-skin="" lay-size="sm">
+					{if condition="($install == true)"}
+					<tr>
+						<td colspan="4" style="color: #E94335; background-color:#f8f8f8">提醒：发现app目录下的install文件夹没删除，为了系统的安全,请手动去删除。</td>
+					</tr>
+					{/if}
+					<tr>
+						<td class="info-td">服务器系统</td>
+						<td>{:get_system_info('os')}</td>
+						<td class="info-td">PHP版本</td>
+						<td>{:get_system_info('php')}</td>
+					</tr>
+					<tr>
+						<td class="info-td">上传附件限制</td>
+						<td>{:get_system_config('system','upload_max_filesize')}M / {:get_system_info('upload_max_filesize')}</td>
+						<td class="info-td">执行时间限制</td>
+						<td>{:get_system_info('max_execution_time')}</td>
+					</tr>
+					{eq name=":get_system_config('system','qrcode')" value="2"}
+					<tr>
+						<td class="info-td">勾股OA</td>
+						<td colspan="3">{:CMS_VERSION}<a class="layui-badge layui-bg-blue" style="margin-left:8px"
+							href="https://blog.gougucms.com/home/book/detail/bid/3.html" target="_blank">勾股OA文档</a></td>
+					</tr>
+					<tr>
+						<td class="info-td">ThinkPHP版本</td>
+						<td colspan="3">{$TP_VERSION}<a class="layui-badge layui-bg-blue" style="margin-left:8px" href="https://doc.thinkphp.cn/v8_0/preface.html" target="_blank">TP8文档</a></td>
+					</tr>
+					<tr>
+						<td class="info-td">Layui版本</td>
+						<td colspan="3">{:LAYUI_VERSION}<a class="layui-badge layui-bg-blue" style="margin-left:8px" href="https://layui.dev/docs/2/" target="_blank">Layui文档</a></td>
+					</tr>
+					<tr>
+						<td class="info-td">合作联系</td>
+						<td colspan="3"><i class="iconfont icon-weixin green"></i>微信号：hdm588，业务合作、功能定制请备注</td>
+					</tr>
+					<tr>
+						<td class="info-td">QQ交流群</td>
+						<td colspan="3">搜Q群：24641076(满)，46924914(满)，295256660<br>或点击 <a href="http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=vb-Jdu0e-7iAAxbqGczDg1xFjxbdBsip&authKey=lwlNHAZiUOK2Rua5B14KhfwoYcvpQtHnlWMAJAbQRhfg3YQOUVIFEmfxpbhcCQw%2F&noverify=0&group_code=295256660" target="_blank" rel="nofollow"><img border="0" src="//pub.idqqimg.com/wpa/images/group.png" alt="gougucms交流群" title="点击链接加入群聊【勾股开源交流群】" style="vertical-align:middle"></a></td>
+					</tr>
+					<tr>
+						<td class="info-td">同系列开源软件</td>
+						<td colspan="3"><a class="layui-badge layui-bg-blue" style="margin-right:8px" href="https://gitee.com/gouguopen/gougucms" target="_blank">勾股CMS</a><a class="layui-badge layui-bg-blue" style="margin-right:8px" href="https://gitee.com/gouguopen/blog" target="_blank">勾股BLOG</a><a class="layui-badge layui-bg-blue" href="https://gitee.com/gouguopen/dev" target="_blank" style="margin-right:8px">勾股DEV</a><a class="layui-badge layui-bg-blue" href="https://gitee.com/gouguopen/guoguadmin" target="_blank">勾股ADMIN</a></td>
+					</tr>
+					<tr>
+						<td colspan="4" style="color:#E94335; font-size:14px"><strong>腾讯云服务器，通过我们的代理购买低至 1 折，点击图片了解详情</strong></td>
+					</tr>
+					<tr>
+						<td colspan="4">
+							<a href="https://curl.qcloud.com/h3ibq5lX" target="_blank"><img src="https://blog.gougucms.com/storage/image/480x300.jpg" style="width:100%; max-width:100%; border-radius:6px; cursor:pointer;" align=center /></a>
+						</td>
+					</tr>
+					{/eq}
+				</table>
+			</div>
+		</div>
+	</div>
+</div>
+<script>
+function layoutSystem(){
+
+}
+</script>
\ No newline at end of file
diff --git a/app/home/view/index/layout_task.html b/app/home/view/index/layout_task.html
new file mode 100644
index 0000000000000000000000000000000000000000..51b55d75912ae81d42ec1a7e669312a172b0acea
--- /dev/null
+++ b/app/home/view/index/layout_task.html
@@ -0,0 +1,42 @@
+<div class="layui-row layui-col-space16">
+	<div class="layui-col-md12">
+		<div class="layui-card">
+			<div class="layui-card-title">任务列表</div>
+			<div style="padding: 12px;">
+				<table id="Task" lay-filter="Task" class="layui-hide" style="margin-top:0"></table>
+			</div>
+		</div>
+	</div>
+</div>
+<script>
+//任务
+function layoutTask(table){
+	table.render({
+		elem: '#Task'
+		, url: "/project/api/get_task?limit=10" //数据接口
+		, page: false //开启分页
+		, cols: [[ //表头
+			{field: 'id', title: '任务编号', width: 80, align: 'center', fixed: 'left', templet: function (d) {
+					return 'T' + d.id;
+				}}
+				,{ field: 'status', title: '任务状态', align: 'center', width: 90, templet: function (d) {
+						var html = '<span class="check-status-color-' + d.status + '">『' + d.status_name + '』</span>';
+						return html;
+						}
+					}
+				,{field:'title',title: '任务主题', minWidth: 300,templet:function(d){
+					var html = '<span class="layui-badge layui-bg-'+d.priority+'">'+d.priority_name+'</span> <a data-href="/project/task/view/id/'+d.id+'.html" class="side-a">'+d.title+'</a>';
+					return html;
+				}}
+				,{field:'director_name',title: '负责人', align:'center',width: 80}		
+				,{field:'end_time',title: '预计结束日期', width: 150,templet:function(d){
+					var html = d.end_time;	
+					if(d.delay>0){
+						html+= '<span class="red ml-1" style="font-size:12px;">逾期'+d.delay+'天</span>';	
+					}			
+					return html;
+				}}
+		]]
+	});
+}
+</script>
\ No newline at end of file
diff --git a/app/home/view/index/log_list.html b/app/home/view/index/log_list.html
new file mode 100644
index 0000000000000000000000000000000000000000..e469fa9439bc1ea153b6ee59db45fac85fbab27b
--- /dev/null
+++ b/app/home/view/index/log_list.html
@@ -0,0 +1,88 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style type="text/css">
+	.layui-card-body .layui-timeline-title {
+		padding-bottom: 0;
+		font-size: 14px;
+	}
+
+	.layui-card-body .layui-timeline-item {
+		padding-bottom: 5px;
+		color:#323232;
+	}
+
+	.layui-timeline-title span {
+		color: #999
+	}
+
+	.panel-more {
+		width: 100%;
+		height: 48px;
+		line-height: 48px;
+		text-align: center;
+		position: absolute;
+		bottom: 0;
+		left: 0;
+	}
+
+	.panel-more a {
+		color: #0088FF
+	}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<div class="layui-card">
+		<div class="layui-card-header"><h3>员工动态</h3></div>
+		<div class="layui-card-body">
+			<ul class="layui-timeline" id="logs"></ul>
+			<div class="panel-more"><a href="javascript:;">查看更多员工动态</a></div>
+		</div>
+	</div>
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var page=1,limit=20;
+	function getLogs() {
+		$.ajax({
+			url: "/home/index/log_list",
+			type: 'post',
+			data: {
+				page:page,
+				limit: limit
+			},
+			success: function(e) {
+				if (e.code == 0) {
+					var html = '';
+					if(e.data.length>0){
+						page++;
+						$.each(e.data, function(key, value) {
+							html += '<li class="layui-timeline-item">\
+										<i class="layui-icon layui-timeline-axis"></i>\
+										<div class="layui-timeline-content layui-text">\
+										  <div class="layui-timeline-title"><span title="'+value.id+'">'+value.times+'</span>，'+value.content+'</div>\
+										</div>\
+									  </li>';
+						});
+						$('#logs').append(html);
+					}else{
+						$('.panel-more').remove();
+					}
+				}
+			}
+		})
+	}
+	function gouguInit() {
+		getLogs();
+		$('.panel-more').on('click',function(){
+			getLogs();
+		})
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/index/main.html b/app/home/view/index/main.html
new file mode 100644
index 0000000000000000000000000000000000000000..70bef5e9621d951ba40ef8530b2a244eed366240
--- /dev/null
+++ b/app/home/view/index/main.html
@@ -0,0 +1,215 @@
+{extend name="../../base/view/common/base" /}
+
+{block name="style"}
+<style type="text/css">
+    .panel-num table {width: 100%;}
+    .panel-num td {text-align: center; padding: 16px 0; border-left: 1px solid #f1f1f1; position: relative;}
+    .panel-num td:nth-child(1) { border-left: none}
+    .panel-num .num-title { padding-bottom: 16px; color: #999;}
+    .panel-num .blue {font-size: 20px; font-weight: 300;}
+    .panel-num td .badge {position: absolute;top: 0; right: 0;}
+    .panel-num td .badge span { padding: 2px 4px; font-size: 12px; border-radius: 0 0 0 4px;}
+    .dashboard-total td {border-top: 1px solid #f1f1f1}
+    .dashboard-logs .layui-timeline-item {padding-bottom: 1px;}
+    .info-td { width: 90px; text-align: right;background-color: #fafafa; color: #999; padding: 5px 3px;}
+    .info-td {width: 90px; text-align: right;background-color: #fafafa; color: #999; padding: 5px 3px;}
+	.layui-card-body .layui-timeline-title {padding-bottom: 0;font-size: 14px; margin-bottom:4px; color:#323232}
+	.layui-card-body .layui-timeline-item {padding-bottom: 5px;}
+	.layui-short-menu li { text-align: center;}
+	.layui-short-menu li .iconfont {display: inline-block; font-weight:600; width: 100%; height: 58px; line-height: 58px; margin-bottom:5px; text-align: center;border-radius: 3px; font-size: 28px; background-color: #F8F8F8; color: #969696; transition: all .3s; -webkit-transition: all .3s;}
+	.layui-short-menu li cite {color: #646464;}
+	.layui-short-menu li:hover .iconfont{color: #1A75FF; background-color:#F2F8FF;}
+	.layui-short-menu li:hover cite {color: #1A75FF;}
+	.layui-matter-item li a{display: block; padding: 12px; background-color: #f8f8f8; color: #999; border-radius: 3px; transition: all .3s;-webkit-transition: all .3s;}
+	.layui-matter-item li a:hover{background-color:#F2F8FF;}
+	.layui-matter-item li cite {font-size: 24px;font-weight: 300;}
+	
+	.layui-right-bar a{display: inline-block; width: 100%; height: 64px; text-align: center;border-radius: 3px; background-color: #F8F8F8; color: #969696; transition: all .3s; -webkit-transition: all .3s;}
+	.layui-right-bar a .iconfont{display: inline-block; font-weight:600; width: 100%; height: 37px; line-height: 39px; text-align: center;font-size: 24px;}
+	.layui-right-bar a:hover{color: #1A75FF; background-color:#F2F8FF;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+<div class="layui-row layui-col-space16">
+	<div class="layui-col-md8">
+		{volist name="$layout_selected" id="layout"}
+		
+			{if ( $layout.row == 1) AND ( $layout.name == 'count') }
+				{include file="/index/layout_count" /}	
+			{/if}
+			
+			{if ( $layout.row == 1) AND ( $layout.name == 'event') }
+				{include file="/index/layout_event" /}	
+			{/if}
+			
+			{if ( $layout.row == 1) AND ( $layout.name == 'note') }
+				{include file="/index/layout_note" /}	
+			{/if}
+			
+			{if ( $layout.row == 1) AND ( $layout.name == 'project') }
+				{include file="/index/layout_project" /}	
+			{/if}
+			
+			{if ( $layout.row == 1) AND ( $layout.name == 'task') }
+				{include file="/index/layout_task" /}	
+			{/if}
+			
+			
+			{if ( $layout.row == 1) AND ( $layout.name == 'chartview') }
+				{include file="/index/layout_chartview" /}	
+			{/if}
+			
+			{if ( $layout.row == 1) AND ( $layout.name == 'chartyear') }
+				{include file="/index/layout_chartyear" /}	
+			{/if}
+			
+		{/volist}
+	</div>
+	<div class="layui-col-md4">
+		{volist name="$layout_selected" id="layout"}	
+		
+			{if ( $layout.row == 2) AND ( $layout.name == 'fastentry') }
+				{include file="/index/layout_fastentry" /}	
+			{/if}
+			
+			{if ( $layout.row == 2) AND ( $layout.name == 'approve') }
+				{include file="/index/layout_approve" /}	
+			{/if}
+			
+			{if ( $layout.row == 2) AND ( $layout.name == 'system') }
+				{include file="/index/layout_system" /}	
+			{/if}
+			
+			{if ( $layout.row == 2) AND ( $layout.name == 'ranking') }
+				{include file="/index/layout_ranking" /}	
+			{/if}
+			
+			{if ( $layout.row == 2) AND ( $layout.name == 'action') }
+				{include file="/index/layout_action" /}	
+			{/if}
+			
+		{/volist}
+	</div>
+</div>
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script src="{__GOUGU__}/third_party/echart/echarts.min.js"></script>
+<script>
+	function getRange() {
+		let today = new Date();
+		let tYear = today.getFullYear();
+		let tMonth = today.getMonth() + 1;
+		let tDate = today.getDate();
+		let dateFirst = tYear + "-" + tMonth + "-" + tDate;
+		let datelast = (tYear - 1) + "-" + tMonth + "-" + tDate;
+		let dataRange = [];
+		dataRange.push(dateFirst);
+		dataRange.push(datelast);
+		return dataRange;
+	}
+
+	function getDay(archiveCalendar) {
+		var today = new Date();
+		var dayArray = [];
+		for (var i = 0; i < 366; i++) {
+			var targetday_milliseconds = today.getTime() - 1000 * 60 * 60 * 24 * i;
+			var date = new Date(targetday_milliseconds);
+			dayArray.push(retunDay(date,archiveCalendar));
+		}
+		return dayArray;
+	}
+
+	function retunDay(day,archiveCalendar) {
+		var tYear = day.getFullYear();
+		var tMonth = day.getMonth();
+		var tDate = day.getDate();
+		tMonth = tMonth + 1;
+		if (tMonth.toString().length == 1) {
+			tMonth = "0" + tMonth;
+		}
+		if (tDate.toString().length == 1) {
+			tDate = "0" + tDate;
+		}
+		var dateStr = tYear + "-" + tMonth + "-" + tDate;
+		var dateArray = [];
+		dateArray.push(dateStr);
+		if (archiveCalendar[dateStr]) {
+			dateArray.push(archiveCalendar[dateStr]);
+		}
+		else {
+			dateArray.push(0);
+		}
+		return dateArray;
+	}
+	
+	function setHour(num) {
+		var str = num + ':00';
+		if (num < 10) {
+			str = '0' + num + ':00';
+		}
+		return str;
+	}
+
+	const moduleInit = ['tool','oaSchedule'];
+	function gouguInit() {
+		var tool = layui.tool,table = layui.table,work = layui.oaSchedule;
+		
+		if(typeof layoutNote ==='function'){
+			layoutNote(table);
+		}
+		
+		if(typeof layoutProject ==='function'){
+			layoutProject(table);
+		}
+		
+		if(typeof layoutTask ==='function'){
+			layoutTask(table);
+		}
+		
+		if(typeof layoutChartView ==='function'){
+			layoutChartView();
+		}
+		
+		if(typeof layoutChartYear ==='function'){
+			layoutChartYear();
+		}
+		
+		if(typeof layoutFastentry ==='function'){
+			layoutFastentry(tool,work,table)
+		}
+		
+		if(typeof layoutSystem ==='function'){
+			layoutSystem()
+		}
+		
+		if(typeof layoutRaking ==='function'){
+			layoutRaking()
+		}
+		
+		if(typeof layoutAction ==='function'){
+			layoutAction()
+		}	
+	}
+	
+setTimeout(function () {
+	window.onresize = function () {
+		if(logChart){
+			chartView.resize();
+		}
+		if(myChart){
+			myChart.resize();
+		}
+		if(logChart){
+			logChart.resize();
+		}
+	}
+})
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/index/menu_classical.html b/app/home/view/index/menu_classical.html
new file mode 100644
index 0000000000000000000000000000000000000000..4fb74e48d6a4a8d757d10842494a3776891904e2
--- /dev/null
+++ b/app/home/view/index/menu_classical.html
@@ -0,0 +1,47 @@
+<div class="layui-side layui-side-menu layui-side-{$admin.theme}">
+	<div class="layui-logo" gg-event="closeAllTabs">
+		<img src="{$web.logo|default=''}" onerror="javascript:this.src='{__IMG__}/syslogo.png';this.onerror=null;" style="height: 40px;" class="syslogo">
+		<img src="{$web.small_logo|default=''}" onerror="javascript:this.src='{__IMG__}/syslogo_small.png';this.onerror=null;" style="height: 40px;" class="logo">
+	</div>
+
+	<ul id="menuList" class="layui-nav layui-nav-tree layui-inline" lay-shrink="all">
+		<li class="layui-nav-item menu-li">
+			<a href="javascript:;" class="side-menu-item layui-this" data-href="/home/index/main.html" data-id="0" style="padding-top:0; padding-bottom:0;"><i class="iconfont icon-xueshuguanli"></i> 工 作 台</a>
+		</li>
+	{foreach name="menu" item="a"}
+		<li class="layui-nav-item menu-li">
+			<a href="javascript:;" lay-tips="{$a.title}" lay-direction="2" data-id="{$a.id}" data-title="{$a.title}" data-href="/{$a.src}"><i class="iconfont {$a.icon}"></i> {$a.title}</a>
+			{notempty name="$a.list"}
+				<dl class="layui-nav-child">
+				{foreach name="$a.list" item="b"}
+					<dd>
+					<a href="javascript:;" class="side-menu-item" data-id="{$b.id}" data-title="{$b.title}" data-href="/{$b.src}">{$b.title}</a>
+					{notempty name="$b.list"}
+						<dl class="layui-nav-child">
+						{foreach name="$b.list" item="c"}
+							<dd>
+							<a href="javascript:;" class="side-menu-item" data-id="{$c.id}" data-title="{$c.title}" data-href="/{$c.src}">{$c.title}</a>
+							{notempty name="$c.list"}
+								<dl class="layui-nav-child">
+								{foreach name="$c.list" item="d"}
+									<dd><a href="javascript:;" class="side-menu-item" data-id="{$d.id}" data-title="{$d.title}" data-href="/{$d.src}">{$d.title}</a></dd>
+								{/foreach}
+								</dl>
+							{/notempty}
+							</dd>
+						{/foreach}
+						</dl>
+					{/notempty}
+					</dd>
+				{/foreach}
+				</dl>
+			{/notempty}
+		</li>			
+	{/foreach}
+	</ul>
+</div>
+<script>
+function menuInit() {
+
+}		
+</script>
\ No newline at end of file
diff --git a/app/home/view/index/menu_expand.html b/app/home/view/index/menu_expand.html
new file mode 100644
index 0000000000000000000000000000000000000000..3079cfaf94a08ad3bdd50948cd821ade73062a30
--- /dev/null
+++ b/app/home/view/index/menu_expand.html
@@ -0,0 +1,70 @@
+<div class="layui-side layui-side-expand layui-side-{$admin.theme}">
+	<div class="layui-logo" gg-event="closeAllTabs">
+		<img src="{$web.logo|default=''}" onerror="javascript:this.src='{__IMG__}/syslogo.png';this.onerror=null;" style="height: 38px;" class="syslogo">
+		<img src="{$web.small_logo|default=''}" onerror="javascript:this.src='{__IMG__}/syslogo_small.png';this.onerror=null;" style="height: 38px;" class="logo">
+	</div>
+	<ul id="menuList">
+		<li class="layui-nav-item menu-li">
+			<a href="javascript:;" class="side-menu-item layui-this" data-href="/home/index/main.html" data-id="0" style="padding-top:0; padding-bottom:0;"><i class="iconfont icon-xueshuguanli"></i> 工 作 台</a>
+		</li>
+		{foreach name="menu" item="a"}
+			{empty name="$a.list"}
+			<li class="menu-li">
+				<a href="javascript:;" lay-tips="{$a.title}" lay-direction="2" data-id="{$a.id}" data-title="{$a.title}" data-href="/{$a.src}"><i class="iconfont {$a.icon}"></i> <cite>{$a.title}</cite></a>
+			</li>
+			{else/}
+			<li class="layui-nav-item menu-li">
+				<a href="javascript:">
+					<i class="iconfont {$a.icon}"></i> <cite>{$a.title}</cite>
+				</a>
+				<dl class="gg-second-menu">
+					<dt><strong>{$a.title}</strong></dt>
+					{foreach name="$a.list" item="b"}
+						{empty name="$b.list"}
+							<dd><a href="javascript:;" class="side-menu-item" data-id="{$b.id}" data-title="{$b.title}" data-href="/{$b.src}">{$b.title}</a></dd>
+						{else/}
+							<dd>
+								<dl class="gg-three-menu">
+									<dt><strong>{$b.title}</strong><i class="layui-icon layui-icon-up"></i><i class="layui-icon layui-icon-down"></i></dt>
+									{foreach name="$b.list" id="c"}
+										<dd><a href="javascript:;" class="side-menu-item" data-id="{$c.id}" data-title="{$c.title}" data-href="/{$c.src}">{$c.title}</a></dd>
+									{/foreach}
+								</dl>
+							</dd>
+						{/empty}	
+					{/foreach}
+				</dl>
+			</li>
+			{/empty}						
+		{/foreach}
+	</ul>
+</div>
+<script>
+function menuInit() {
+    let $menuListNode = $('#menuList'); // 侧边菜单节点
+	let $AppBodyNode    = $('#GouguAppBody');// 主体页面节点	
+		
+    //主菜单
+    $menuListNode.on('click', '.menu-li',  function () {
+        if (!$(this).children('a').hasClass('layui-this')) {
+            $(this).siblings().find('a').removeClass('layui-this');
+            $(this).children('a').addClass('layui-this');
+            // 子菜单
+            $(this).siblings().find('.gg-second-menu').removeClass('current');
+            if ($(this).children('.gg-second-menu').length) {
+                let subNode = $(this).children('.gg-second-menu').find('a');
+                $(this).children('.gg-second-menu').addClass('current');
+				subNode.eq(0).children('i').length ? subNode.eq(1).click() : subNode.eq(0).click();
+                $AppBodyNode.addClass('sub-menu');
+            } else {
+                $AppBodyNode.removeClass('sub-menu');
+            }
+        }
+    });
+
+    //子菜单
+    $menuListNode.on('click', '.gg-three-menu dt', function () {
+		$(this).parent().toggleClass('show-up');
+    });
+}
+</script>
\ No newline at end of file
diff --git a/app/home/view/leaves/add.html b/app/home/view/leaves/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..42d631a7f55f84da944018cee93ad77ef95208b1
--- /dev/null
+++ b/app/home/view/leaves/add.html
@@ -0,0 +1,93 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page" lay-filter="form-leaves">
+	<h3 class="pb-3">请假</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">开始时间<font>*</font></td>
+			<td><input name="start_date" class="layui-input tool-time" value="{$detail.start_date|default=''}" readonly lay-verify="required" placeholder="请选择开始时间" lay-reqText="请选择开始时间" data-type="datetime"></td>
+			<td class="layui-td-gray">结束时间<font>*</font></td>
+			<td><input name="end_date" class="layui-input tool-time" value="{$detail.end_date|default=''}" readonly lay-verify="required" placeholder="请选择结束时间" lay-reqText="请选择结束时间" data-type="datetime"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">请假天数<font>*</font></td>
+			<td><input name="duration" class="layui-input" value="{$detail.duration|default=''}" lay-verify="required|number" placeholder="请输入请假天数" lay-reqText="请输入请假天数"></td>
+			<td class="layui-td-gray">请假类型<font>*</font></td>
+			<td>
+				<select name="types" lay-verify="required" lay-reqText="请选择请假类型">
+				  <option value="">--请选择--</option>
+				  {volist name=":get_leaves_types(1)" id="vo"}
+					{empty name="$detail"}
+						<option value="{$vo.id}">{$vo.title}</option>
+					{else/}
+						<option value="{$vo.id}" {eq name="$detail.types" value="$vo.id"} selected{/eq}>{$vo.title}</option>
+					{/empty}
+				  {/volist}
+				</select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">请假事由<font>*</font></td>
+			<td colspan="3"><textarea name="reason" placeholder="请输入请假事由" class="layui-textarea" lay-verify="required" lay-reqText="请输入请假事由">{$detail.reason|default=''}</textarea></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">附件 <button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button></td>
+			<td colspan="3" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input data-type="file" type="hidden" name="file_ids" value="{$detail.file_ids|default=''}">
+					{notempty name="$detail.file_ids"}
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr>
+	</table>
+	<div id="checkBox" data-status="{$detail.check_status|default=0}" data-id="{$detail.id|default=0}" data-checkflowid="{$detail.check_flow_id|default=0}" class="pt-3"></div>
+	<div class="pt-3">
+		<input type="hidden" name="id" value="{$detail.id|default=0}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','uploadPlus','oaCheck'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,uploadPlus=layui.uploadPlus,oaCheck=layui.oaCheck;
+		oaCheck.init({
+			check_name:'leaves',
+			check_btn:0
+		});	
+		var fileUp = new uploadPlus();
+	
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					let checkCallback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							tool.sideClose(1000);				
+						}
+					}
+					data.field.check_name = 'leaves';
+					data.field.action_id = e.data.return_id;
+					oaCheck.submit(data.field,checkCallback);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/home/leaves/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/leaves/datalist.html b/app/home/view/leaves/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..f02a7cd2fd3af46e595a28e8997c5e014b283747
--- /dev/null
+++ b/app/home/view/leaves/datalist.html
@@ -0,0 +1,86 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:300px">
+			<input type="text" name="keywords" placeholder="关键字" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_leaves" lay-filter="table_leaves"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-group">
+  	<button class="layui-btn layui-btn-sm tool-add" type="button" data-href="/home/leaves/add">+ 添加请假</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool;
+		
+		layui.pageTable = table.render({
+			elem: "#table_leaves"
+			, toolbar: "#toolbarDemo"
+			,url: "/home/leaves/datalist"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 80
+			,height: 'full-112'
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',title: '名称'}
+				,{field:'admin_name',title: '创建人',width:90,align:'center'}
+				,{field:'create_time', title: '创建时间',width:150,align:'center'}
+				,{width:120,fixed:'right',title: '操作', align:'center',ignoreExport:true,templet: function(d){
+					var html='';
+					var btn1='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详细</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn3='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
+					html = '<div class="layui-btn-group">'+btn1+btn2+btn3+'</div>';
+					return html;
+				}}
+			]]
+		});
+			
+		table.on('tool(table_leaves)',function (obj) {
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/home/leaves/view?id="+data.id);
+				return;
+			}
+			if (obj.event === 'edit') {
+				tool.side("/home/leaves/add?id="+data.id);
+				return;
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要删除该内容吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/home/leaves/del", { id: data.id }, callback);
+					layer.close(index);
+				});
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/leaves/view.html b/app/home/view/leaves/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..5508d3c3f33196508c3074336f648b5b57b85647
--- /dev/null
+++ b/app/home/view/leaves/view.html
@@ -0,0 +1,54 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<h3 class="pb-3">请假详情</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">开始时间</td>
+			<td>{$detail.start_date} {$detail.start_span_name}</td>
+			<td class="layui-td-gray">结束时间</td>
+			<td>{$detail.end_date} {$detail.end_span_name}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">请假类型</td>
+			<td>{$detail.types_name}</td>
+			<td class="layui-td-gray">请假天数</td>
+			<td id="days">共{$detail.duration|default=0}天</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">请假事由</td>
+			<td colspan="3">{$detail.reason|default=''}</td>
+		</tr>
+		{notempty name="$detail.file_ids"}
+		<tr>
+			<td class="layui-td-gray">相关附件</td>
+			<td colspan="3" style="line-height:inherit">
+				<div class="layui-row">
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+	</table>
+	<div id="checkBox" data-status="{$detail.check_status}" data-id="{$detail.id}" data-checkflowid="{$detail.check_flow_id}" class="pt-3"></div>
+</div>
+{/block}
+<!-- /主体 -->
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool','oaCheck'];
+
+	function gouguInit() {
+		var tool = layui.tool,oaCheck = layui.oaCheck;
+		//审批相关
+        oaCheck.init({
+            check_name:'leaves',
+        });
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/log/index.html b/app/home/view/log/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..8e578ba3d64e9754289bd230f5c065ce0546fce0
--- /dev/null
+++ b/app/home/view/log/index.html
@@ -0,0 +1,92 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-t border-x">
+		<div class="layui-input-inline" style="width:120px;">
+			<select name="action">
+				<option value="">请选择类型</option>
+				{volist name="$type_action" id="vo"}
+				<option value="{$vo}">{$vo}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:300px;">
+			<input type="text" name="keywords" placeholder="昵称/操作数据id" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px;">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="log" lay-filter="log"></table>
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, form = layui.form;
+		var tableIns = table.render({
+			elem: '#log',
+			title: '操作日志列表',
+			url: "/home/log/index", //数据接口	
+			page: true, //开启分页
+			limit: 20,
+			cols: [
+				[ //表头
+					{
+						field: 'id',
+						title: 'ID号',
+						align: 'center',
+						width: 90
+					}, {
+						field: 'action',
+						title: '操作',
+						align: 'center',
+						width: 80
+					}, {
+						field: 'content',
+						title: '操作描述',
+						width: 200
+					}, {
+						field: 'param_id',
+						title: '操作数据ID',
+						align: 'center',
+						width: 100
+					},{
+						field: 'param',
+						title: '操作详细数据信息',
+					}, {
+						field: 'ip',
+						title: 'IP地址',
+						align: 'center',
+						width: 130
+					}, {
+						field: 'create_time',
+						title: '操作时间',
+						fixed: 'right',
+						align: 'center',
+						width: 160
+					}
+				]
+			]
+		});
+
+		//监听搜索提交
+		form.on('submit(webform)', function (data) {
+			tableIns.reload({
+				where: data.field,
+				page: {
+					curr: 1
+				}
+			});
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/login/index.html b/app/home/view/login/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..19c9a76eec8c349e64be3e7db167457d597f6a9c
--- /dev/null
+++ b/app/home/view/login/index.html
@@ -0,0 +1,115 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+		<meta name="renderer" content="webkit" />
+		<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
+		<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+		<title>{:get_system_config('web','admin_title')}</title>
+		<link rel="stylesheet" href="{__GOUGU__}/layui/css/layui.css?v={:get_system_config('system','version')}" media="all">
+		<style type="text/css">
+			html,body {width: 100%;height: 100%;background: #EAF3FF;}
+			canvas{display:block;width:100%;height:100%; position: fixed; top: 0;left: 0;}
+			input:-webkit-autofill {
+				-webkit-box-shadow: 0 0 0px 1000px white inset;
+			}
+			#container {width: 100%;height: 100%;position: fixed;top: 0;left: 0;z-index: 99;background: url({__IMG__}/bg.png);background-size: cover;}
+			.login-wrap {position: relative;overflow: hidden; background-color:#fff; width:800px; height: 448px; position: absolute;top: 50%;left: 50%;margin-top: -240px;margin-left: -400px; border-radius: 12px; display: flex;box-shadow: 0 0 16px rgba(31, 84, 167, 0.2);}
+
+			.login-side {width:400px; height:440px; padding:4px}
+			.login-side .side-img{border-radius: 8px; width:100%; height:100%; background: url({__IMG__}/login.jpg);background-size: cover;}
+			
+			.login-box{width: 392px;height: 404px;}
+			.login-box .top {width: 392px; padding:36px 0; text-align:center; border-bottom:1px solid #eee;}
+			.login-box .bottom {padding:32px;}
+			
+			.layui-input,.layui-textarea {height: 44px;border: 1px solid #ddd;}
+			.captcha_img img{width:150px; height:44px; cursor:pointer;}
+			.layui-btn {height: 45px;font-size: 16px;margin-top: 6px;background-color: #FF6347!important}
+			.foot {position: absolute; font-size: 12px; bottom: 24px;text-align: center;width: 100%;color: #458BF3;}
+		</style>
+	</head>
+	<body>
+		<div id="container">
+			<canvas id="canvas"></canvas>
+			<div class="login-wrap">
+				<div class="login-side"><div class="side-img"></div></div>
+				<div class="login-box">
+					<div class="top">
+						<img src="{:get_system_config('web','logo')}" onerror="javascript:this.src='{__IMG__}/syslogo.png';this.onerror=null;" style="height: 66px;">
+					</div>
+					<div class="bottom">
+						<form class="layui-form" id="gougu-login">
+							<div class="layui-form-item">
+								<input type="text" name="username" lay-verify="required" value="" placeholder="请输入账户或手机号码" lay-reqText="请输入账户或手机号码" autocomplete="off" class="layui-input">
+							</div>
+							<div class="layui-form-item">
+								<input type="password" name="password" lay-verify="required" value="" placeholder="请输入密码" lay-reqText="请输入密码" autocomplete="off" class="layui-input">
+							</div>
+							<div class="layui-form-item">
+								<div class="layui-input-inline" style="width:168px;">
+									<input type="text" name="captcha" lay-verify="required" placeholder="验证码" lay-reqText="请输入验证码" autocomplete="off" class="layui-input">
+								</div>
+								<div class="layui-input-inline captcha_img" style="width:142px; height:44px; margin-right:0">
+									{:captcha_img()}
+									<input type="hidden" value="{:make_token()}"/>
+								</div>
+							</div>
+							
+							<button id="login-submit" class="layui-btn layui-btn-fluid layui-bg-cyan" lay-submit lay-filter="login-submit">登入系统</button>
+						</form>
+					</div>
+				</div>
+			</div>
+			<div class="foot">
+				<!-- 版权标识 -->
+				<!-- 
+				+------------------------------------------------------------------------------------------
+				勾股OA系统开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
+				+------------------------------------------------------------------------------------------
+				如需去除版权标识使用的，请微信(hdm588)联系作者去除，开源不易，请多支持！
+				+------------------------------------------------------------------------------------------
+				勾股工作室 <hdm58@qq.com>
+				+------------------------------------------------------------------------------------------
+				-->
+				Copyright © 2022-2024 勾股OA - {:CMS_VERSION}  ，Powered by GouguOPEN，<a href="https://beian.miit.gov.cn/" target="_blank" rel="nofollow" style="color:#458BF3">{:get_system_config('web','icp')}</a><a target="_blank" rel="nofollow" style="margin-left: 15px;color:#458BF3" href="http://www.beian.gov.cn/portal/registerSystemInfo"> {:get_system_config('web','beian')}</a>
+				<!-- /版权标识 -->
+			</div>
+		</div>
+		<script src="{__GOUGU__}/layui/layui.js?v={:get_system_config('system','version')}"></script>
+		<script type="text/javascript">
+			var canvas=document.querySelector("#canvas"),ctx=canvas.getContext("2d");canvas.width=window.innerWidth,canvas.height=window.innerHeight,ctx.lineWidth=.3,ctx.strokeStyle=new Color(150).style;var movePos={x:30*canvas.width/100,y:30*canvas.height/100},dots={nb:250,distance:100,d_radius:150,array:[]};function colorValue(t){return Math.floor(255*Math.random()+t)}function createColorStyle(t,o,i){return"rgba("+t+","+o+","+i+", 0.618)"}function mixComponents(t,o,i,a){return(t*o+i*a)/(o+a)}function averageColorStyles(t,o){var i=t.color,a=o.color,s=mixComponents(i.r,t.radius,a.r,o.radius),n=mixComponents(i.g,t.radius,a.g,o.radius),e=mixComponents(i.b,t.radius,a.b,o.radius);return createColorStyle(Math.floor(s),Math.floor(n),Math.floor(e))}function Color(t){t=t||0,this.r=colorValue(t),this.g=colorValue(t),this.b=colorValue(t),this.style=createColorStyle(this.r,this.g,this.b)}function Dot(){this.x=Math.random()*canvas.width,this.y=Math.random()*canvas.height,this.vx=-.5+Math.random(),this.vy=-.5+Math.random(),this.radius=3*Math.random(),this.color=new Color}function createDots(){for(i=0;i<dots.nb;i++)dots.array.push(new Dot)}function moveDots(){for(i=0;i<dots.nb;i++){var t=dots.array[i];t.y<0||t.y>canvas.height?(t.vx=t.vx,t.vy=-t.vy):(t.x<0||t.x>canvas.width)&&(t.vx=-t.vx,t.vy=t.vy),t.x+=t.vx,t.y+=t.vy}}function connectDots(){for(i=0;i<dots.nb;i++)for(j=0;j<dots.nb;j++)i_dot=dots.array[i],j_dot=dots.array[j],i_dot.x-j_dot.x<dots.distance&&i_dot.y-j_dot.y<dots.distance&&i_dot.x-j_dot.x>-dots.distance&&i_dot.y-j_dot.y>-dots.distance&&i_dot.x-movePos.x<dots.d_radius&&i_dot.y-movePos.y<dots.d_radius&&i_dot.x-movePos.x>-dots.d_radius&&i_dot.y-movePos.y>-dots.d_radius&&(ctx.beginPath(),ctx.strokeStyle=averageColorStyles(i_dot,j_dot),ctx.moveTo(i_dot.x,i_dot.y),ctx.lineTo(j_dot.x,j_dot.y),ctx.stroke(),ctx.closePath())}function drawDots(){for(i=0;i<dots.nb;i++){dots.array[i].draw()}}function runDots(){ctx.clearRect(0,0,canvas.width,canvas.height),moveDots(),connectDots(),drawDots(),requestAnimationFrame(runDots)}Dot.prototype={draw:function(){ctx.beginPath(),ctx.fillStyle=this.color.style,ctx.arc(this.x,this.y,this.radius,0,3*Math.PI,!1),ctx.fill()}};var can=document.querySelector("#canvas");can.addEventListener("mousemove",function(t){movePos.x=t.pageX,movePos.y=t.pageY}),can.addEventListener("mouseleave",function(t){movePos.x=canvas.width/2,movePos.y=canvas.height/2}),createDots(),requestAnimationFrame(runDots);
+			
+			layui.use(['form'], function() {
+				var form = layui.form,
+					$ = layui.$,
+					layer = layui.layer;
+				// 登录过期的时候，跳出ifram框架
+				if (top.location != self.location) top.location = self.location;
+				form.on('submit(login-submit)', function(data) {
+					$.ajax({
+						url: "/home/login/login_submit",
+						data: $('#gougu-login').serialize(),
+						type: 'post',
+						async: false,
+						success: function(res) {
+							layer.tips(res.msg, '#login-submit');
+							if (res.code === 0) {
+								var date = new Date();
+								date.setTime(date.getTime() + (-1 * 24 * 60 * 60 * 1000));
+								var expires = "; expires=" + date.toGMTString();
+								document.cookie = "gougutab=''" + expires + "; path=/";
+								setTimeout(function() {
+									parent.document.location.href="/";
+								}, 1200);
+							} else {
+								$('[alt="captcha"]').click();
+							}
+						}
+					})
+					return false;
+				});
+			});
+		</script>
+	</body>
+</html>
diff --git a/app/home/view/login/lock.html b/app/home/view/login/lock.html
new file mode 100644
index 0000000000000000000000000000000000000000..7684691b1770ae753f08f07fb8994e8386b9c3c6
--- /dev/null
+++ b/app/home/view/login/lock.html
@@ -0,0 +1,99 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+		<meta name="renderer" content="webkit" />
+		<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
+		<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+		<title>{:get_system_config('web','admin_title')}</title>
+		<link rel="stylesheet" href="{__GOUGU__}/layui/css/layui.css?v={:get_system_config('system','version')}" media="all">
+		<style type="text/css">
+			html,body {width: 100%;height: 100%;background: #EAF3FF;}
+			canvas{display:block;width:100%;height:100%; position: fixed; top: 0;left: 0;}
+			input:-webkit-autofill {
+				-webkit-box-shadow: 0 0 0px 1000px white inset;
+			}
+			#container {width: 100%;height: 100%;position: fixed;top: 0;left: 0;z-index: 99;
+				background: url({__IMG__}/bg.png);
+				background-size: cover;
+			}
+			#container .lock{width: 100%;height: 100%; position:absolute; top:0; left:0;
+				background:#000 url({__IMG__}/lock_bg.svg);
+				background-size: cover;
+				opacity:0.72
+			}
+			.login {width: 398px; text-align: center; position: absolute; top: 50%; left: 50%; margin-top: -240px; margin-left: -199px; border-radius: 12px; box-shadow: 0 2px 6px rgba(92, 110, 136, .32);}
+			.login .top {width: 398px;height: 117px; background-color:#7EC54B; border-radius: 12px 12px 0 0; line-height: 117px; text-align: center; overflow: hidden;
+				-webkit-transform: rotate(0deg);
+				-moz-transform: rotate(0deg);
+				-ms-transform: rotate(0deg);
+				-o-transform: rotate(0deg);
+				transform: rotate(0deg);
+			}
+			.login .top .bg1 {display: inline-block;width: 72px;height: 72px;background: #fff;opacity: .1;border-radius: 0 72px 0 0;position: absolute;left: 0;top: 42px;}
+			.login .top .bg2 {display: inline-block;width: 92px;height: 92px;background: #fff;opacity: .1;border-radius: 50%;position: absolute;right: -16px;top: -16px;}
+			.login .bottom {background-color: #fff;padding:26px 24px;border-radius: 0 0 12px 12px;}			
+			.layui-input,.layui-textarea {height: 44px;border: 1px solid #ddd;}
+			.captcha_img img{width:142px; height:44px; cursor:pointer;}
+			.layui-btn {height: 45px;font-size: 16px;margin-top: 6px;background-color: #FF6347!important}
+		</style>
+	</head>
+	<body>
+		<div id="container">
+			<div class="lock"></div>
+			<canvas id="canvas"></canvas>
+			<div class="login">
+				<div class="top">
+					<img src="{:get_system_config('web','logo')}" onerror="javascript:this.src='{__IMG__}/syslogo.png';this.onerror=null;" style="height: 66px;">
+					<span class="bg1"></span>
+					<span class="bg2"></span>
+				</div>
+				<div class="bottom">
+					<form class="layui-form" id="gougu-lock">
+						<div class="layui-form-item" style="font-size:32px; color:#FF6347; padding:16px 0">
+							当前是锁屏状态
+						</div>
+						<div class="layui-form-item">
+							<input type="password" name="lock_password" lay-verify="required" value="" placeholder="请输入登录密码解锁" lay-reqText="请输入登录密码" autocomplete="off" class="layui-input">
+						</div>						
+						<button id="lock-submit" class="layui-btn layui-btn-fluid layui-bg-cyan" lay-submit lay-filter="lock-submit">解锁进入系统</button>
+					</form>
+				</div>
+			</div>
+		</div>
+		<script src="{__GOUGU__}/layui/layui.js?v={:get_system_config('system','version')}"></script>
+		<script type="text/javascript">
+			var canvas=document.querySelector("#canvas"),ctx=canvas.getContext("2d");canvas.width=window.innerWidth,canvas.height=window.innerHeight,ctx.lineWidth=.3,ctx.strokeStyle=new Color(150).style;var movePos={x:30*canvas.width/100,y:30*canvas.height/100},dots={nb:250,distance:100,d_radius:150,array:[]};function colorValue(t){return Math.floor(255*Math.random()+t)}function createColorStyle(t,o,i){return"rgba("+t+","+o+","+i+", 0.618)"}function mixComponents(t,o,i,a){return(t*o+i*a)/(o+a)}function averageColorStyles(t,o){var i=t.color,a=o.color,s=mixComponents(i.r,t.radius,a.r,o.radius),n=mixComponents(i.g,t.radius,a.g,o.radius),e=mixComponents(i.b,t.radius,a.b,o.radius);return createColorStyle(Math.floor(s),Math.floor(n),Math.floor(e))}function Color(t){t=t||0,this.r=colorValue(t),this.g=colorValue(t),this.b=colorValue(t),this.style=createColorStyle(this.r,this.g,this.b)}function Dot(){this.x=Math.random()*canvas.width,this.y=Math.random()*canvas.height,this.vx=-.5+Math.random(),this.vy=-.5+Math.random(),this.radius=3*Math.random(),this.color=new Color}function createDots(){for(i=0;i<dots.nb;i++)dots.array.push(new Dot)}function moveDots(){for(i=0;i<dots.nb;i++){var t=dots.array[i];t.y<0||t.y>canvas.height?(t.vx=t.vx,t.vy=-t.vy):(t.x<0||t.x>canvas.width)&&(t.vx=-t.vx,t.vy=t.vy),t.x+=t.vx,t.y+=t.vy}}function connectDots(){for(i=0;i<dots.nb;i++)for(j=0;j<dots.nb;j++)i_dot=dots.array[i],j_dot=dots.array[j],i_dot.x-j_dot.x<dots.distance&&i_dot.y-j_dot.y<dots.distance&&i_dot.x-j_dot.x>-dots.distance&&i_dot.y-j_dot.y>-dots.distance&&i_dot.x-movePos.x<dots.d_radius&&i_dot.y-movePos.y<dots.d_radius&&i_dot.x-movePos.x>-dots.d_radius&&i_dot.y-movePos.y>-dots.d_radius&&(ctx.beginPath(),ctx.strokeStyle=averageColorStyles(i_dot,j_dot),ctx.moveTo(i_dot.x,i_dot.y),ctx.lineTo(j_dot.x,j_dot.y),ctx.stroke(),ctx.closePath())}function drawDots(){for(i=0;i<dots.nb;i++){dots.array[i].draw()}}function runDots(){ctx.clearRect(0,0,canvas.width,canvas.height),moveDots(),connectDots(),drawDots(),requestAnimationFrame(runDots)}Dot.prototype={draw:function(){ctx.beginPath(),ctx.fillStyle=this.color.style,ctx.arc(this.x,this.y,this.radius,0,3*Math.PI,!1),ctx.fill()}};var can=document.querySelector("#canvas");can.addEventListener("mousemove",function(t){movePos.x=t.pageX,movePos.y=t.pageY}),can.addEventListener("mouseleave",function(t){movePos.x=canvas.width/2,movePos.y=canvas.height/2}),createDots(),requestAnimationFrame(runDots);
+			
+			layui.use(['form'], function() {
+				var form = layui.form,
+					$ = layui.$,
+					layer = layui.layer;
+				// 登录过期的时候，跳出ifram框架
+				if (top.location != self.location) top.location = self.location;
+				form.on('submit(lock-submit)', function(data) {
+					$.ajax({
+						url: "/home/login/lock",
+						data: $('#gougu-lock').serialize(),
+						type: 'post',
+						async: false,
+						success: function(res) {
+							layer.tips(res.msg, '#lock-submit');
+							if (res.code === 0) {
+								setTimeout(function() {
+									parent.document.location.href="/";
+								}, 1200);
+							}
+							else if (res.code === 2) {
+								setTimeout(function() {
+									parent.document.location.href="/home/login/index.html";
+								}, 1200);
+							}
+						}
+					})
+					return false;
+				});
+			});
+		</script>
+	</body>
+</html>
diff --git a/app/home/view/login/mbui.html b/app/home/view/login/mbui.html
new file mode 100644
index 0000000000000000000000000000000000000000..e60be6cd48ed1ca95ee815370b8ecbbb9e48cd6e
--- /dev/null
+++ b/app/home/view/login/mbui.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+		<meta name="renderer" content="webkit" />
+		<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
+		<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+		<title>{:get_system_config('web','admin_title')}</title>
+		<link rel="stylesheet" href="{__GOUGU__}/layui/css/layui.css?v={:get_system_config('web','version')}" media="all">
+		<style type="text/css">
+			html,body {width: 100%;height: 100%;background: #EAF3FF;}
+			canvas{display:block;width:100%;height:100%; position: fixed; top: 0;left: 0;}
+			input:-webkit-autofill {
+				-webkit-box-shadow: 0 0 0px 1000px white inset;
+			}
+			#container {width: 100%;height: 100%;position: fixed;top: 0;left: 0;z-index: 99;
+				background: url({__IMG__}/bg.png);
+				background-size: cover;
+			}
+			#container .lock{width: 100%;height: 100%; position:absolute; top:0; left:0;
+				background:#000 url({__IMG__}/lock_bg.svg);
+				background-size: cover;
+				opacity:0.72
+			}
+			.login {width: 360px; text-align: center; position: absolute; top: 50%; left: 50%; margin-top: -240px; margin-left: -180px; border-radius: 12px; box-shadow: 0 2px 6px rgba(92, 110, 136, .32);}
+			.login .top {width: 360px;height: 117px; background-color: #fbbc05; border-radius: 12px 12px 0 0; line-height: 117px; text-align: center; overflow: hidden;
+				-webkit-transform: rotate(0deg);
+				-moz-transform: rotate(0deg);
+				-ms-transform: rotate(0deg);
+				-o-transform: rotate(0deg);
+				transform: rotate(0deg);
+			}
+			.login .top .bg1 {display: inline-block;width: 72px;height: 72px;background: #fff;opacity: .1;border-radius: 0 72px 0 0;position: absolute;left: 0;top: 42px;}
+			.login .top .bg2 {display: inline-block;width: 92px;height: 92px;background: #fff;opacity: .1;border-radius: 50%;position: absolute;right: -16px;top: -16px;}
+			.login .bottom {background-color: #fff;padding:26px 24px;border-radius: 0 0 12px 12px;}
+			
+			.layui-input,.layui-textarea {height: 44px;border: 1px solid #ddd;}
+			.captcha_img img{width:142px; height:44px; cursor:pointer;}
+			.layui-btn {height: 45px;font-size: 16px;margin-top: 6px;background-color: #FF6347!important}
+		</style>
+	</head>
+	<body>
+		<div id="container">
+			<div class="lock"></div>
+			<canvas id="canvas"></canvas>
+			<div class="login">
+				<div class="top">
+					<img src="{__IMG__}/login_logo.png" height="60" width="200">
+					<span class="bg1"></span>
+					<span class="bg2"></span>
+				</div>
+				<div class="bottom">
+					<form class="layui-form" id="gougu-lock">
+						<div class="layui-form-item" style="font-size:32px; color:#FF6347; padding:16px 0">
+							当前是锁屏状态
+						</div>
+						<div class="layui-form-item">
+							<input type="password" name="lock_password" lay-verify="required" value="" placeholder="请输入登录密码解锁" lay-reqText="请输入登录密码" autocomplete="off" class="layui-input">
+						</div>						
+						<button id="lock-submit" class="layui-btn layui-btn-fluid layui-bg-cyan" lay-submit lay-filter="lock-submit">解锁进入系统</button>
+					</form>
+				</div>
+			</div>
+		</div>
+		<script type="text/javascript">			
+			const moduleInit = [];
+			function mbuiInit() {
+				let tool = mbui.tool;
+				let a = tool.ucfirst('avf');
+				tool.log(a);
+			}
+		</script>
+		<script src="{__STATIC__}/jquery.min.js"></script>
+		<script src="{__GOUGU__}/mbui/mbui.js?v={:get_system_config('web','version')}"></script>
+	</body>
+</html>
diff --git a/app/home/view/message/add.html b/app/home/view/message/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..936cf836c2731705b19a1eb9bd415a3877a762e5
--- /dev/null
+++ b/app/home/view/message/add.html
@@ -0,0 +1,207 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+.layui-table-1 .tr-2,.layui-table-1 .tr-3{display:none;}
+.layui-table-2 .tr-1,.layui-table-2 .tr-3{display:none;}
+.layui-table-3 .tr-1,.layui-table-3 .tr-2{display:none;}
+.layui-table-4 .tr-1,.layui-table-4 .tr-2,.layui-table-4 .tr-3,.layui-table-4 .tr-4{display:none;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	{if condition="$id eq 0"}
+	<h3 class="pb-3">新建消息</h3>
+	<table id="messageTable" class="layui-table layui-table-form layui-table-1">
+		<tr>
+			<td class="layui-td-gray-2">接收人类型</td>
+			<td>
+				<input type="radio" name="types" lay-filter="types" value="1" title="同事" checked>
+				<input type="radio" name="types" lay-filter="types" value="2" title="部门">
+				<input type="radio" name="types" lay-filter="types" value="3" title="岗位">
+				<input type="radio" name="types" lay-filter="types" value="4" title="全部">
+			</td>
+		</tr>
+		<tr class="tr-1">
+			<td class="layui-td-gray">收件人<font>*</font></td>
+			<td>
+				<input type="text" name="unames" value="" placeholder="请选择收件人" readonly class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="uids" value="">
+			</td>
+		</tr>
+		<tr class="tr-2">
+			<td class="layui-td-gray">收件部门<font>*</font></td>
+			<td>
+				<input type="text" name="dnames" value="" placeholder="请选择收件部门" readonly class="layui-input picker-oa" data-types="department" data-type="2">
+				<input type="hidden" name="dids" value="">
+			</td>
+		</tr>
+		<tr class="tr-3">
+			<td class="layui-td-gray">收件岗位<font>*</font></td>
+			<td>
+				<input type="text" name="pnames" value="" placeholder="请选择收件岗位" readonly class="layui-input picker-oa" data-types="position" data-type="2"">
+				<input type="hidden" name="pids" value="">
+			</td>
+		</tr>
+		<tr class="tr-4">
+			<td class="layui-td-gray">抄送人</td>
+			<td>
+				<input type="text" name="copy_names" value="" placeholder="请选择抄送人" readonly class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="copy_uids" value="">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">消息主题<font>*</font></td>
+			<td><input type="text" name="title" value="" lay-verify="required" lay-reqText="请输入消息主题" placeholder="请输入消息主题" class="layui-input" lay-verify="required"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">消息内容<font>*</font></td>
+			<td><textarea name="content" placeholder="请输入消息内容" class="layui-textarea" style="height: 200px;" lay-verify="required" lay-reqText="请输入消息内容"></textarea></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray"><div class="layui-input-inline">附件</div> <div class="layui-input-inline"><button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button></div></td>
+			<td>
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="">
+				</div>
+			</td>
+		</tr>
+	</table>
+	{else/}
+	<h3 class="pb-3">编辑消息</h3>
+	<table id="messageTable" class="layui-table layui-table-form layui-table-{$detail.types}">
+		<tr>
+			<td class="layui-td-gray-2">接收人类型</td>
+			<td>
+				<input type="radio" name="types"  lay-filter="types" value="1" title="同事" {eq name="$detail.types" value="1"}checked{/eq}>
+				<input type="radio" name="types"  lay-filter="types" value="2" title="部门" {eq name="$detail.types" value="2"}checked{/eq}>
+				<input type="radio" name="types"  lay-filter="types" value="3" title="岗位" {eq name="$detail.types" value="3"}checked{/eq}>
+				<input type="radio" name="types"  lay-filter="types" value="4" title="全部" {eq name="$detail.types" value="4"}checked{/eq}>
+			</td>
+		</tr>
+		<tr class="tr-1">
+			<td class="layui-td-gray">收件人<font>*</font></td>
+			<td>
+				<input type="text" name="unames" value="{$detail.unames|default=''}" placeholder="请选择收件人" readonly class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="uids" value="{$detail.uids|default=''}">
+			</td>
+		</tr>
+		<tr class="tr-2">
+			<td class="layui-td-gray">收件部门<font>*</font></td>
+			<td>
+				<input type="text" name="dnames" value="{$detail.dnames|default=''}" placeholder="请选择收件部门" readonly class="layui-input picker-oa" data-types="department" data-type="2">
+				<input type="hidden" name="dids" value="{$detail.dids|default=''}">
+			</td>
+		</tr>
+		<tr class="tr-3">
+			<td class="layui-td-gray">收件岗位<font>*</font></td>
+			<td>
+				<input type="text" name="pnames" value="{$detail.pnames|default=''}" placeholder="请选择收件岗位" readonly class="layui-input picker-oa" data-types="position" data-type="2"">
+				<input type="hidden" name="pids" value="{$detail.pids|default=''}">
+			</td>
+		</tr>
+		<tr class="tr-4">
+			<td class="layui-td-gray">抄送人</td>
+			<td>
+				<input type="text" name="copy_names" value="{$detail.copy_names|default=''}" placeholder="请选择抄送人" readonly class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="copy_uids" value="{$detail.copy_uids|default=''}">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">消息主题<font>*</font></td>
+			<td><input type="text" name="title" value="{$detail.title|default=''}" lay-verify="required" lay-reqText="请输入消息主题" placeholder="请输入消息主题" class="layui-input" lay-verify="required"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">消息内容<font>*</font></td>
+			<td>
+				<textarea name="content" placeholder="请输入消息内容" class="layui-textarea" style="height: 200px;" lay-verify="required" lay-reqText="请输入消息内容">{$detail.content|default=''}</textarea>
+				{if condition="($detail.msg_id > 0)"}		
+				<table class="layui-table" style="margin-top:10px">
+				<tr>
+					<td class="layui-td-gray-2">引用消息内容</td>
+					<td>{$detail.from_content}</td>
+				</tr>
+				{notempty name="$detail.from_file_array"}
+				<tr>
+					<td class="layui-td-gray" style="vertical-align:top">引用消息附件</td>
+					<td style="line-height:inherit">
+						<div class="layui-row">
+							{volist name="$detail.from_file_array" id="vo"}
+							<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo,'view')}</div>
+							{/volist}
+						</div>
+					</td>
+				</tr>
+				{/notempty}
+				</table>
+				{/if}
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray"><div class="layui-input-inline">附件</div> <div class="layui-input-inline"><button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button></div></td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" name="file_ids" data-type="file" value="{$detail.file_ids}">
+					{notempty name="$detail.file_ids"}
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr>
+	</table>
+	{/if}
+	<div class="pt-4">
+		<input type="hidden" value="{$id}" name="id">
+		<input type="hidden" value="{$msg_id}" name="msg_id">
+		<button class="layui-btn" lay-submit="" lay-filter="draftform">存为草稿</button>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即发送</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','oaPicker','uploadPlus'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,uploadPlus=layui.uploadPlus;
+		let uploada = new uploadPlus();
+		//监听保存到草稿并发送
+		form.on('submit(webform)', function(data){
+			data.field.is_draft=1;
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/home/message/save", data.field, callback,clickbtn);
+			return false;
+		});
+		  
+		//监听保存到草稿
+		form.on('submit(draftform)', function(data){
+			data.field.is_draft=2;
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/home/message/save", data.field, callback),clickbtn;
+			return false;
+		});
+
+		//选择收件人类型
+		form.on('radio(types)', function (data) {
+			$('#messageTable').attr('class','layui-table layui-table-form layui-table-'+data.value);
+		});		
+	}		
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/message/draft.html b/app/home/view/message/draft.html
new file mode 100644
index 0000000000000000000000000000000000000000..76df9567c49434201286c44d06f33f4dfdebd5ca
--- /dev/null
+++ b/app/home/view/message/draft.html
@@ -0,0 +1,162 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	{include file="message/msgmenu" /}
+	<div style="margin-left:172px;">
+		<form class="layui-form gg-form-bar border-t border-x">
+			<div class="layui-input-inline" style="width:200px">
+				<input type="text" autocomplete="off" name="range_time" readonly class="layui-input tool-time" data-range="~" placeholder="发送日期">
+			</div>
+			<div class="layui-input-inline" style="width:300px">
+				<input type="text" name="keywords" placeholder="关键字" class="layui-input" autocomplete="off"/>
+			</div>
+			<div class="layui-input-inline" style="width:150px;">
+				<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+				<button type="reset" class="layui-btn layui-btn-reset" lay-filter="reset">清空</button>
+			</div>
+		</form> 
+		<table class="layui-hide" id="test" lay-filter="test"></table>
+	</div>
+</div>
+<script type="text/html" id="toolbarDemo">
+	<div class="layui-btn-container">
+		<div class="layui-btn-group">
+			<button class="layui-btn layui-btn-normal layui-btn-sm" lay-event="add"><i class="layui-icon">&#xe61f;</i>新建消息</button>
+			<button class="layui-btn layui-btn-danger layui-btn-sm" lay-event="del"><i class="layui-icon">&#xe640;</i>批量删除</button>
+		</div>
+	</div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool ,form = layui.form;
+
+		layui.pageTable = table.render({
+			elem: '#test',
+			toolbar: '#toolbarDemo',
+			defaultToolbar:false,
+			title:'草稿箱',
+			url: "/home/message/draft", //数据接口
+			page: true ,//开启分页
+			limit: 20,
+			cellMinWidth: 80,
+			height: 'full-112',
+			cols: [[ //表头
+			  {type:'checkbox',fixed:'left'},
+			  {field: 'title', title: '消息主题',minWidth:240},
+			  {field: 'types', title: '接收人类型',width:100,align:'center',templet: function (d) {
+					var html = '<span class="layui-color-' + d.types + '">『同事』</span>';
+					if(d.types==2){
+						html = '<span class="layui-color-' + d.types + '">『部门』</span>';
+					}
+					if(d.types==3){
+						html = '<span class="layui-color-' + d.types + '">『职位』</span>';
+					}
+					if(d.types==4){
+						html = '<span class="layui-color-' + d.types + '">『全部』</span>';
+					}
+					return html;
+				}			  
+			  },
+			  {field: 'to_name', title: '接收人',width:200,templet: function (d) {
+					var html = d.to_name;
+					if(d.types==2){
+						html = d.to_department;
+					}
+					if(d.types==3){
+						html = d.to_position;
+					}
+					if(d.types==4){
+						html = '全部员工';
+					}
+					return html;
+				}			  
+			  },
+			  {field: 'copy_names', title: '抄送人',width:160},
+			  {field: 'update_time', title: '最近保存时间', align:'center',width:160},
+			  {field: 'right', title: '操作',fixed:'right', width:120, align:'center',templet: function (d) {
+					let html='<div class="layui-btn-group">';
+					let btn1='<span class="layui-btn layui-btn-xs" lay-event="edit">编辑</span>';
+					let btn2='<span class="layui-btn layui-btn-xs layui-btn-normal" lay-event="view">查看</span>';
+					let btn3='<button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button></div>';
+					return html+btn1+btn2+btn3+'</div>'
+				}
+			  }
+			]]
+		});
+
+		//监听行工具事件
+		table.on('tool(test)', function(obj){
+			let data = obj.data;
+			if(obj.event === 'del'){
+				layer.confirm('确定该信息要放入垃圾箱吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if(e.code==0){
+							layui.pageTable.reload();
+						}
+					}
+					tool.delete("/home/message/del", {ids: data.id}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'edit'){
+				tool.side('/home/message/add?id='+data.id);
+			}
+			if(obj.event === 'view'){
+				tool.side('/home/message/view?id='+data.id);
+			}
+			return false;
+		});
+		//表头工具栏事件
+		table.on('toolbar(test)', function(obj){
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = checkStatus.data; 
+			if (obj.event === 'add') {
+				tool.side("/home/message/add");
+				return;
+			}
+			if(data.length==0){
+				layer.msg('请选择要操作的消息');
+				return false;
+			}
+			var idArray=[],msg='是否执行该操作？';
+			for(var i=0;i<data.length;i++){
+				idArray.push(data[i].id);
+			}
+			switch(obj.event){
+				case 'del':
+					msg = '确定把选中的信息要放入垃圾箱吗?';
+				break;
+			};
+			
+			layer.confirm(msg, {
+				icon: 3,
+				title: '提示'
+			}, function (index) {
+				let callback = function (e) {
+					layer.msg(e.msg);
+					if(e.code==0){
+						layui.pageTable.reload();
+					}
+				}
+				tool.delete("/home/message/del", {ids: idArray.join(',')}, callback);
+				layer.close(index);
+			});
+		});
+		  
+		//监听搜索提交
+		form.on('submit(webform)', function(data){
+			layui.pageTable.reload({where:data.field,page:{curr:1}});
+			return false;
+		});
+	}		
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/message/inbox.html b/app/home/view/message/inbox.html
new file mode 100644
index 0000000000000000000000000000000000000000..1761bcf161257dd2c2797eb1209017c349fc706d
--- /dev/null
+++ b/app/home/view/message/inbox.html
@@ -0,0 +1,226 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	{include file="message/msgmenu" /}
+	<div style="margin-left:172px;">
+		<form class="layui-form gg-form-bar border-t border-x">
+			<div class="layui-input-inline" style="width:200px">
+				<input type="text" autocomplete="off" name="range_time" readonly class="layui-input tool-time" data-range="~" placeholder="接收日期">
+			</div>
+			<div class="layui-input-inline" style="width:128px">
+				<select name="read">
+					<option value="">选择消息状态</option>
+					<option value="1">未读消息</option>
+					<option value="2">已读消息</option>
+				</select>
+			</div>
+			<div class="layui-input-inline" style="width:128px">
+				<select name="types">
+					<option value="">选择消息类型</option>
+					<option value="1">系统消息</option>
+					<option value="2">个人消息</option>
+				</select>
+			</div>
+			<div class="layui-input-inline" style="width:300px">
+				<input type="text" name="keywords" placeholder="关键字" class="layui-input" autocomplete="off"/>
+			</div>
+			<div class="layui-input-inline" style="width:150px;">
+				<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+				<button type="reset" class="layui-btn layui-btn-reset" lay-filter="reset">清空</button>
+			</div>
+		</form> 
+		<table class="layui-hide" id="test" lay-filter="test"></table>
+	</div>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+	<div class="layui-btn-container">
+		<div class="layui-btn-group">
+			<button class="layui-btn layui-btn-sm" lay-event="add"><i class="layui-icon">&#xe61f;</i>新建消息</button>
+			<button class="layui-btn layui-btn-normal layui-btn-sm" lay-event="star"><i class="layui-icon">&#xe67b;</i>设为星标</button>
+			<button class="layui-btn layui-btn-warm layui-btn-sm" lay-event="read"><i class="layui-icon">&#xe605;</i>设为已读</button>
+			<button class="layui-btn layui-btn-danger layui-btn-sm" lay-event="del"><i class="layui-icon">&#xe640;</i>批量删除</button>
+		</div>
+	</div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool ,form = layui.form;		
+		layui.pageTable = table.render({
+			elem: '#test',
+			toolbar: '#toolbarDemo',
+			defaultToolbar:false,
+			title:'收件箱',
+			url: "/home/message/inbox", //数据接口
+			page: true ,//开启分页
+			limit: 20,
+			cellMinWidth: 80,
+			height: 'full-112',
+			cols: [[ //表头
+			  {type:'checkbox',fixed:'left'},
+			  {field: 'msg_type', title: '消息类型',width:90,align:'center',templet: function (d) {
+					var html = '<span class="yellow">系统消息</span>';
+					if(d.from_uid > 0){
+						html = '<span class="blue">个人消息</span>';
+					}
+					return html;
+				}			  
+			  },
+			  {field: 'from_name', title: '发件人', width:100,align:'center'},
+			  {field: 'title', title: '消息主题',minWidth:240},
+			  {field: 'create_time', title: '发件时间', align:'center',width:160},
+			  {field: 'read_time', title: '是否已读',align:'center', width:80,templet:function(d){
+					var html='<span style="color:#5FB878">已读</span>';
+					if(d.read_time==0){
+						html='<span style="color:#FF5722">未读</span>';
+					}
+					return html;
+				}},
+			  {field: 'is_star', title: '是否星标',align:'center', width:80,templet:function(d){
+					var html='<span class="layui-icon layui-icon-rate" style="color:#5FB878; font-size:20px; cursor:pointer" lay-event="star"> </span>';
+					if(d.is_star==1){
+						html='<span class="layui-icon layui-icon-rate-solid" style="color:#ffb800; font-size:20px; cursor:pointer" lay-event="unstar"> </span>';
+					}
+					return html;
+				}},
+			  {field: 'right', title: '操作',fixed:'right', width:160, align:'center',templet: function (d) {
+					let html='<div class="layui-btn-group">';
+					let btn1='<span class="layui-btn layui-btn-xs layui-btn-normal" lay-event="view">查看</span>';
+					let btn2='<span class="layui-btn layui-btn-xs" lay-event="reply">回复</span>';
+					let btn3='<span class="layui-btn layui-btn-xs layui-btn-normal" lay-event="resend">转发</span>';
+					let btn4='<button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button></div>';
+					if(d.from_uid == 0){
+						return html+btn1+btn4+'</div>'
+					}
+					else{
+						return html+btn1+btn2+btn3+btn4+'</div>'
+					}					
+				}
+			  }
+			]]
+		});
+
+		//监听行工具事件
+		table.on('tool(test)', function(obj){
+			var data = obj.data;
+			if(obj.event === 'star'){
+				layer.confirm('确定该信息设为星标吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if(e.code==0){
+							layui.pageTable.reload();
+						}
+					}
+					tool.delete("/home/message/check", {
+						ids: data.id,type:5,
+					}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'unstar'){
+				layer.confirm('确定该信息取消星标吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if(e.code==0){
+							layui.pageTable.reload();
+						}
+					}
+					tool.delete("/home/message/check", {
+						ids: data.id,type:6,
+					}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'del'){
+				layer.confirm('确定该信息要放入垃圾箱吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if(e.code==0){
+							layui.pageTable.reload();
+						}
+					}
+					tool.delete("/home/message/check", {
+						ids: data.id,type:2,
+					}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'view'){
+				tool.side('/home/message/read?id='+data.id);
+				return;
+			}
+			if(obj.event === 'reply'){
+				tool.side('/home/message/reply?msg_id='+data.id);
+				return;
+			}
+			if(obj.event === 'resend'){
+				tool.side('/home/message/resend?msg_id='+data.id);
+				return;
+			}
+		});
+		
+		//表头工具栏事件
+		table.on('toolbar(test)', function(obj){
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = checkStatus.data; 
+			if (obj.event === 'add') {
+				tool.side("/home/message/add");
+				return;
+			}
+			if(data.length==0){
+				layer.msg('请选择要操作的消息');
+				return false;
+			}
+			var idArray=[],msg='是否执行该操作？',type=0;
+			for(var i=0;i<data.length;i++){
+				idArray.push(data[i].id);
+			}
+			switch(obj.event){
+				case 'read':
+					msg = '确定把选中的信息设为已读吗?';
+					type = 1;
+				break;
+				case 'del':
+					msg = '确定把选中的信息要放入垃圾箱吗?';
+					type = 2;
+				break;
+				case 'star':
+					msg = '确定把选中的信息设为星标吗?';
+					type = 5;
+				break;
+			};
+			
+			layer.confirm(msg, {
+				icon: 3,
+				title: '提示'
+			}, function (index) {
+				let callback = function (e) {
+					layer.msg(e.msg);
+					if(e.code==0){
+						layui.pageTable.reload();
+					}
+				}
+				tool.delete("/home/message/check", {
+					ids: idArray.join(','),
+					type:type,
+				}, callback);
+				layer.close(index);
+			});
+		});
+		 
+		//监听搜索提交
+		form.on('submit(webform)', function(data){
+			layui.pageTable.reload({where:data.field,page:{curr:1}});
+			return false;
+		});
+	}		
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/message/msgmenu.html b/app/home/view/message/msgmenu.html
new file mode 100644
index 0000000000000000000000000000000000000000..c182206781309a69b6a7108810945bb9ebf4ce68
--- /dev/null
+++ b/app/home/view/message/msgmenu.html
@@ -0,0 +1,11 @@
+<div class="sub-menu" style="padding:15px 12px; width:160px; height: calc(100% - 14px);">
+	<div class="border" style="width:100%;height:100%; background-color:#fbfbfb;">
+		<ul>
+			<li class="sub-menu-li {eq name='$action' value='inbox'} active{/eq}"><a href="/home/message/inbox"><i class="iconfont icon-yiyichuli"></i><span class="text">收件箱</span><span class="num">({$count.inbox})<span></a></li>
+			<li class="sub-menu-li {eq name='$action' value='star'} active{/eq}"><a href="/home/message/star"><i class="iconfont icon-pingfen"></i><span class="text">星标信息</span><span class="num">({$count.star})<span></a></li>
+			<li class="sub-menu-li {eq name='$action' value='sendbox'} active{/eq}"><a href="/home/message/sendbox"><i class="iconfont icon-tuiguangshezhi"></i><span class="text">发件箱</span><span class="num">({$count.sendbox})<span></a></li>
+			<li class="sub-menu-li {eq name='$action' value='draft'} active{/eq}"><a href="/home/message/draft"><i class="iconfont icon-lunwenguanli"></i><span class="text">草稿箱</span><span class="num">({$count.draft})<span></a></li>
+			<li class="sub-menu-li {eq name='$action' value='rubbish'} active{/eq}"><a href="/home/message/rubbish"><i class="iconfont icon-tiku"></i><span class="text">垃圾箱</span><span class="num">({$count.rubbish})<span></a></li>
+		</ul>
+	</div>
+</div>
\ No newline at end of file
diff --git a/app/home/view/message/read.html b/app/home/view/message/read.html
new file mode 100644
index 0000000000000000000000000000000000000000..e61e2847c3dbbbb37ea9e7f201b1acf7ddbe242d
--- /dev/null
+++ b/app/home/view/message/read.html
@@ -0,0 +1,105 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">消息详情</h3>
+	<table id="messageTable" class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">消息主题</td>
+			<td colspan="3">{$detail.title|default=''}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">消息类型</td>
+			{eq name="$detail.message_id" value="0"}
+			<td class="yellow">系统消息</td>
+			{else/}
+			<td class="blue">个人消息</td>
+			{/eq}
+			<td class="layui-td-gray">发送时间</td>
+			<td>{$detail.create_time|default=''}</td>
+		</tr>
+		{gt name="$detail.message_id" value="0"}
+		<tr>
+			<td class="layui-td-gray">发件人</td>
+			<td>{$detail.from_uname|default=''}</td>
+			<td class="layui-td-gray">收件人</td>
+			<td>
+				{eq name="$message.types" value="1"}
+				<span class="layui-color-1">『同事』</span>{$message.unames|default=''}
+				{/eq}
+				{eq name="$message.types" value="2"}
+				<span class="layui-color-2">『部门』</span>{$message.dnames|default=''}
+				{/eq}
+				{eq name="$message.types" value="3"}
+				<span class="layui-color-3">『岗位』</span>{$message.pnames|default=''}
+				{/eq}
+			</td>
+		</tr>
+		{notempty name="$message.copy_names"}
+		<tr>
+			<td class="layui-td-gray">抄送人</td>
+			<td colspan="3">{$message.copy_names|default=''}</td>
+		</tr>
+		{/notempty}
+		{/gt}
+		<tr>
+			<td class="layui-td-gray">消息内容</td>
+			<td colspan="3">
+				<pre style="font-family:inherit">{$detail.content|default=''}</pre>
+				{gt name="$detail.template" value="0"}
+					{:get_message_link($detail.template,$detail.action_id)}
+				{/gt}
+			{if condition="($detail.msg_id > 0)"}		
+				<table class="layui-table" style="margin-top:10px">
+				<tr>
+					<td class="layui-td-gray-2">引用消息内容</td>
+					<td>
+						<pre style="font-family:inherit">{$detail.from_content}</pre>
+						{gt name="$detail.from_template" value="0"}
+						{:get_message_link($detail.from_template,$detail.from_action_id)}
+						{/gt}
+					</td>
+				</tr>
+				{notempty name="$detail.from_file_array"}
+				<tr>
+					<td class="layui-td-gray" style="vertical-align:top">引用消息附件</td>
+					<td style="line-height:inherit">
+						<div class="layui-row">
+							{volist name="$detail.from_file_array" id="vo"}
+							<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo,'view')}</div>
+							{/volist}
+						</div>
+					</td>
+				</tr>
+				{/notempty}
+				</table>
+			{/if}
+			</td>
+		</tr>
+		{notempty name="$detail.file_ids"}
+		<tr>
+			<td class="layui-td-gray">消息附件</td>
+			<td colspan="3" style="line-height:inherit">
+				<div class="layui-row">
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+	</table>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		parent.layui.pageTable.reload();
+	}		
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/message/reply.html b/app/home/view/message/reply.html
new file mode 100644
index 0000000000000000000000000000000000000000..1e835dfe9ff48e578b24ee5b7e04bfeb58ed34f3
--- /dev/null
+++ b/app/home/view/message/reply.html
@@ -0,0 +1,138 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+.layui-table-1 .tr-2,.layui-table-1 .tr-3{display:none;}
+.layui-table-2 .tr-1,.layui-table-2 .tr-3{display:none;}
+.layui-table-3 .tr-1,.layui-table-3 .tr-2{display:none;}
+.layui-table-4 .tr-1,.layui-table-4 .tr-2,.layui-table-4 .tr-3,.layui-table-4 .tr-4{display:none;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">回复消息</h3>
+	<table id="messageTable" class="layui-table layui-table-form layui-table-1">
+		<tr>
+			<td class="layui-td-gray-2">接收人类型</td>
+			<td>
+				<input type="radio" name="types"  lay-filter="types" value="1" title="同事"checked>
+				<input type="radio" name="types"  lay-filter="types" value="2" title="部门">
+				<input type="radio" name="types"  lay-filter="types" value="3" title="岗位">
+				<input type="radio" name="types"  lay-filter="types" value="4" title="全部">
+			</td>
+		</tr>
+		<tr class="tr-1">
+			<td class="layui-td-gray">收件人<font>*</font></td>
+			<td>
+				<input type="text" name="unames" value="{$detail.from_name|default=''}" placeholder="请选择收件人" readonly class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="uids" value="{$detail.from_uid|default=''}">
+			</td>
+		</tr>
+		<tr class="tr-2">
+			<td class="layui-td-gray">收件部门<font>*</font></td>
+			<td>
+				<input type="text" name="dnames" value="{$detail.dnames|default=''}" placeholder="请选择收件部门" readonly class="layui-input picker-oa" data-types="department" data-type="2">
+				<input type="hidden" name="dids" value="{$detail.dids|default=''}">
+			</td>
+		</tr>
+		<tr class="tr-3">
+			<td class="layui-td-gray">收件岗位<font>*</font></td>
+			<td>
+				<input type="text" name="pnames" value="{$detail.pnames|default=''}" placeholder="请选择收件岗位" readonly class="layui-input picker-oa" data-types="position" data-type="2"">
+				<input type="hidden" name="pids" value="{$detail.pids|default=''}">
+			</td>
+		</tr>
+		<tr class="tr-4">
+			<td class="layui-td-gray">抄送人</td>
+			<td>
+				<input type="text" name="copy_names" value="{$detail.copy_names|default=''}" placeholder="请选择抄送人" readonly class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="copy_uids" value="{$detail.copy_uids|default=''}">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">消息主题<font>*</font></td>
+			<td><input type="text" name="title" value="回复：{$detail.title|default=''}" lay-verify="required" lay-reqText="请输入消息主题" placeholder="请输入消息主题" class="layui-input" lay-verify="required"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">消息内容<font>*</font></td>
+			<td>
+				<textarea name="content" placeholder="请输入消息内容" class="layui-textarea" style="height: 200px;" lay-verify="required" lay-reqText="请输入消息内容"></textarea>
+				<table class="layui-table" style="margin-top:10px">
+				<tr>
+					<td class="layui-td-gray-2">回复消息内容</td>
+					<td><pre style="font-family:inherit">{$detail.content|default=''}</pre></td>
+				</tr>
+				{notempty name="$detail.file_array"}
+				<tr>
+					<td class="layui-td-gray" style="vertical-align:top">回复消息附件</td>
+					<td style="line-height:inherit">
+						<div class="layui-row">
+							{volist name="$detail.file_array" id="vo"}
+							<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo,'view')}</div>
+							{/volist}
+						</div>
+					</td>
+				</tr>
+				{/notempty}
+				</table>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray"><div class="layui-input-inline">附件</div> <div class="layui-input-inline"><button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button></div></td>
+			<td>
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="">
+				</div>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<input type="hidden" value="0" name="id">
+		<input type="hidden" value="{$detail.id}" name="msg_id">
+		<button class="layui-btn" lay-submit="" lay-filter="draftform">存为草稿</button>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即发送</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','oaPicker','uploadPlus'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,uploadPlus=layui.uploadPlus;
+		let uploada = new uploadPlus();
+		//监听保存到草稿并发送
+		form.on('submit(webform)', function(data){
+			data.field.is_draft=1;
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			tool.post("/home/message/save", data.field, callback);
+		});
+		  
+		//监听保存到草稿
+		form.on('submit(draftform)', function(data){
+			data.field.is_draft=2;
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			tool.post("/home/message/save", data.field, callback);
+			return false;
+		});
+
+		//选择收件人类型
+		form.on('radio(types)', function (data) {
+			$('#messageTable').attr('class','layui-table layui-table-form layui-table-'+data.value);
+		});		
+	}		
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/message/resend.html b/app/home/view/message/resend.html
new file mode 100644
index 0000000000000000000000000000000000000000..437d81b586744df24c92f05202b5bbb4f13594bc
--- /dev/null
+++ b/app/home/view/message/resend.html
@@ -0,0 +1,138 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+.layui-table-1 .tr-2,.layui-table-1 .tr-3{display:none;}
+.layui-table-2 .tr-1,.layui-table-2 .tr-3{display:none;}
+.layui-table-3 .tr-1,.layui-table-3 .tr-2{display:none;}
+.layui-table-4 .tr-1,.layui-table-4 .tr-2,.layui-table-4 .tr-3,.layui-table-4 .tr-4{display:none;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">转发消息</h3>
+	<table id="messageTable" class="layui-table layui-table-form layui-table-1">
+		<tr>
+			<td class="layui-td-gray-2">接收人类型</td>
+			<td>
+				<input type="radio" name="types"  lay-filter="types" value="1" title="同事"checked>
+				<input type="radio" name="types"  lay-filter="types" value="2" title="部门">
+				<input type="radio" name="types"  lay-filter="types" value="3" title="岗位">
+				<input type="radio" name="types"  lay-filter="types" value="4" title="全部">
+			</td>
+		</tr>
+		<tr class="tr-1">
+			<td class="layui-td-gray">收件人<font>*</font></td>
+			<td>
+				<input type="text" name="unames" value="{$detail.from_name|default=''}" placeholder="请选择收件人" readonly class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="uids" value="{$detail.from_uid|default=''}">
+			</td>
+		</tr>
+		<tr class="tr-2">
+			<td class="layui-td-gray">收件部门<font>*</font></td>
+			<td>
+				<input type="text" name="dnames" value="{$detail.dnames|default=''}" placeholder="请选择收件部门" readonly class="layui-input picker-oa" data-types="department" data-type="2">
+				<input type="hidden" name="dids" value="{$detail.dids|default=''}">
+			</td>
+		</tr>
+		<tr class="tr-3">
+			<td class="layui-td-gray">收件岗位<font>*</font></td>
+			<td>
+				<input type="text" name="pnames" value="{$detail.pnames|default=''}" placeholder="请选择收件岗位" readonly class="layui-input picker-oa" data-types="position" data-type="2"">
+				<input type="hidden" name="pids" value="{$detail.pids|default=''}">
+			</td>
+		</tr>
+		<tr class="tr-4">
+			<td class="layui-td-gray">抄送人</td>
+			<td>
+				<input type="text" name="copy_names" value="{$detail.copy_names|default=''}" placeholder="请选择抄送人" readonly class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="copy_uids" value="{$detail.copy_uids|default=''}">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">消息主题<font>*</font></td>
+			<td><input type="text" name="title" value="转发：{$detail.title|default=''}" lay-verify="required" lay-reqText="请输入消息主题" placeholder="请输入消息主题" class="layui-input" lay-verify="required"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">消息内容<font>*</font></td>
+			<td>
+				<textarea name="content" placeholder="请输入消息内容" class="layui-textarea" style="height: 200px;" lay-verify="required" lay-reqText="请输入消息内容"></textarea>
+				<table class="layui-table" style="margin-top:10px">
+				<tr>
+					<td class="layui-td-gray-2">转发消息内容</td>
+					<td>{$detail.content|default=''}</td>
+				</tr>
+				{notempty name="$detail.file_array"}
+				<tr>
+					<td class="layui-td-gray" style="vertical-align:top">转发消息附件</td>
+					<td style="line-height:inherit">
+						<div class="layui-row">
+							{volist name="$detail.file_array" id="vo"}
+							<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo,'view')}</div>
+							{/volist}
+						</div>
+					</td>
+				</tr>
+				{/notempty}
+				</table>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray"><div class="layui-input-inline">附件</div> <div class="layui-input-inline"><button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button></div></td>
+			<td>
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="">
+				</div>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<input type="hidden" value="0" name="id">
+		<input type="hidden" value="{$detail.id}" name="msg_id">
+		<button class="layui-btn" lay-submit="" lay-filter="draftform">存为草稿</button>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即发送</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','oaPicker','uploadPlus'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,uploadPlus=layui.uploadPlus;
+		let uploada = new uploadPlus();
+		//监听保存到草稿并发送
+		form.on('submit(webform)', function(data){
+			data.field.is_draft=1;
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			tool.post("/home/message/save", data.field, callback);
+		});
+		  
+		//监听保存到草稿
+		form.on('submit(draftform)', function(data){
+			data.field.is_draft=2;
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			tool.post("/home/message/save", data.field, callback);
+			return false;
+		});
+
+		//选择收件人类型
+		form.on('radio(types)', function (data) {
+			$('#messageTable').attr('class','layui-table layui-table-form layui-table-'+data.value);
+		});		
+	}		
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/message/rubbish.html b/app/home/view/message/rubbish.html
new file mode 100644
index 0000000000000000000000000000000000000000..bc788b2825f256e90c812e2e1c3aee3b3825fdf3
--- /dev/null
+++ b/app/home/view/message/rubbish.html
@@ -0,0 +1,109 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	{include file="message/msgmenu" /}
+	<div style="margin-left:172px;">
+		<form class="layui-form gg-form-bar border-t border-x">
+			<div class="layui-input-inline" style="width:300px">
+				<input type="text" name="keywords" placeholder="关键字" class="layui-input" autocomplete="off"/>
+			</div>
+			<div class="layui-input-inline" style="width:150px;">
+				<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+				<button type="reset" class="layui-btn layui-btn-reset" lay-filter="reset">清空</button>
+			</div>
+		</form> 
+		<table class="layui-hide" id="test" lay-filter="test"></table>
+	</div>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+	<h3>垃圾箱信息</h3>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool ,form = layui.form;
+		  layui.pageTable = table.render({
+			elem: '#test',
+			toolbar: '#toolbarDemo',
+			defaultToolbar:false,
+			title:'垃圾箱',
+			url: "/home/message/rubbish", //数据接口
+			page: true ,//开启分页
+			limit: 20,
+			cellMinWidth: 80,
+			height: 'full-112',
+			cols: [[ //表头
+			  {type:'checkbox',fixed:'left'},
+			  {field: 'sourse', title: '来源',width:90,align:'center',templet: function (d) {
+					return '<span class="layui-color-' + d.types + '">『'+d.sourse+'』</span>';
+				}
+				},
+			  {field: 'from_name', title: '发送人',width:100,align:'center'},
+			  {field: 'title', title: '消息主题',minWidth:240},
+			  {field: 'send_time', title: '发件时间', align:'center',width:160},
+			  {field: 'right', title: '操作',fixed:'right', width:120, align:'center',templet: function (d) {
+					let html='<div class="layui-btn-group">';
+					let btn1='<span class="layui-btn layui-btn-xs" lay-event="recovery">还原</span>';
+					let btn2='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">查看</span>';
+					let btn3='<button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="clear">清除</button></div>';
+					return html+btn1+btn2+btn3+'</div>'
+				}
+			  }
+			]]
+		  });
+
+		 //监听行工具事件
+		  table.on('tool(test)', function(obj){
+			var data = obj.data;
+			if(obj.event === 'clear'){
+				layer.confirm('确定清除该信息吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if(e.code==0){
+							layui.pageTable.reload();
+						}
+					}
+					tool.delete("/home/message/clear", {ids: data.id,'table':data.table_name}, callback);
+					layer.close(index);
+				})
+			}
+			if(obj.event === 'recovery'){
+				layer.confirm('确定还原该信息吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if(e.code==0){
+							layui.pageTable.reload();
+						}
+					}
+					tool.delete("/home/message/recovery", {ids: data.id,'table':data.table_name}, callback);
+					layer.close(index);
+				})
+			}
+			if(obj.event === 'view'){
+				if(data.table_name=='msg'){
+					tool.side('/home/message/read?id='+data.id);
+				}
+				else{
+					tool.side('/home/message/view?id='+data.id);
+				}
+				return;
+			}
+		  });
+		  
+		//监听搜索提交
+		form.on('submit(webform)', function(data){
+			layui.pageTable.reload({where:data.field,page:{curr:1}});
+			return false;
+		});
+	}
+		
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/message/sendbox.html b/app/home/view/message/sendbox.html
new file mode 100644
index 0000000000000000000000000000000000000000..43dfb8f6a6db4fe5eaf63bd6904f698452079708
--- /dev/null
+++ b/app/home/view/message/sendbox.html
@@ -0,0 +1,159 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	{include file="message/msgmenu" /}
+	<div style="margin-left:172px;">
+		<form class="layui-form gg-form-bar border-t border-x">
+			<div class="layui-input-inline" style="width:200px">
+				<input type="text" autocomplete="off" name="range_time" readonly class="layui-input tool-time" data-range="~" placeholder="发送日期">
+			</div>
+			<div class="layui-input-inline" style="width:300px">
+				<input type="text" name="keywords" placeholder="关键字" class="layui-input" autocomplete="off"/>
+			</div>
+			<div class="layui-input-inline" style="width:150px;">
+				<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+				<button type="reset" class="layui-btn layui-btn-reset" lay-filter="reset">清空</button>
+			</div>
+		</form> 
+		<table class="layui-hide" id="test" lay-filter="test"></table>
+	</div>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+	<div class="layui-btn-container">
+		<div class="layui-btn-group">
+			<button class="layui-btn layui-btn-normal layui-btn-sm" lay-event="add"><i class="layui-icon">&#xe61f;</i>新建消息</button>
+			<button class="layui-btn layui-btn-danger layui-btn-sm" lay-event="del"><i class="layui-icon">&#xe640;</i>批量删除</button>
+		</div>
+	</div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool ,form = layui.form;
+		  layui.pageTable = table.render({
+			elem: '#test',
+			toolbar: '#toolbarDemo',
+			defaultToolbar:false,
+			title:'发件箱',
+			url: "/home/message/sendbox", //数据接口
+			page: true ,//开启分页
+			limit: 20,
+			cellMinWidth: 80,
+			height: 'full-112',
+			cols: [[ //表头
+			  {type:'checkbox',fixed:'left'},
+			  {field: 'title', title: '消息主题',minWidth:240},
+			  {field: 'types', title: '接收人类型',width:100,align:'center',templet: function (d) {
+					var html = '<span class="layui-color-' + d.types + '">『同事』</span>';
+					if(d.types==2){
+						html = '<span class="layui-color-' + d.types + '">『部门』</span>';
+					}
+					if(d.types==3){
+						html = '<span class="layui-color-' + d.types + '">『职位』</span>';
+					}
+					if(d.types==4){
+						html = '<span class="layui-color-' + d.types + '">『全部』</span>';
+					}
+					return html;
+				}			  
+			  },
+			  {field: 'to_name', title: '接收人',width:200,templet: function (d) {
+					var html = d.to_name;
+					if(d.types==2){
+						html = d.to_department;
+					}
+					if(d.types==3){
+						html = d.to_position;
+					}
+					if(d.types==4){
+						html = '全部员工';
+					}
+					return html;
+				}			  
+			  },
+			  {field: 'copy_names', title: '抄送人', width:160},
+			  {field: 'send_time_str', title: '发件时间', align:'center',width:160},
+			  {field: 'right', title: '操作',fixed:'right', width:90, align:'center',templet: function (d) {
+					let html='<div class="layui-btn-group">';
+					let btn1='<span class="layui-btn layui-btn-xs" lay-event="view">查看</span>';
+					let btn2='<button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button></div>';
+					return html+btn1+btn2+'</div>'
+				}
+			  }
+			]]
+		  });
+
+		 //监听行工具事件
+		  table.on('tool(test)', function(obj){
+			var data = obj.data;
+			if(obj.event === 'del'){
+				layer.confirm('确定该信息要放入垃圾箱吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if(e.code==0){
+							layui.pageTable.reload();
+						}
+					}
+					tool.delete("/home/message/del", {ids: data.id}, callback);
+					layer.close(index);
+				})
+			}
+			if(obj.event === 'view'){
+				tool.side('/home/message/view?id='+data.id);
+				return;
+			}
+		  });
+		//表头工具栏事件
+		table.on('toolbar(test)', function(obj){
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = checkStatus.data; 
+			if (obj.event === 'add') {
+				tool.side("/home/message/add");
+				return;
+			}
+			if(data.length==0){
+				layer.msg('请选择要操作的消息');
+				return false;
+			}
+			var idArray=[],msg='是否执行该操作？';
+			for(var i=0;i<data.length;i++){
+				idArray.push(data[i].id);
+			}
+			switch(obj.event){
+				case 'del':
+					msg = '确定把选中的信息要放入垃圾箱吗?';
+				break;
+			};
+			
+			layer.confirm(msg, {
+				icon: 3,
+				title: '提示'
+			}, function (index) {
+				let callback = function (e) {
+					layer.msg(e.msg);
+					if(e.code==0){
+						layui.pageTable.reload();
+					}
+				}
+				tool.delete("/home/message/del", {ids: idArray.join(',')}, callback);
+				layer.close(index);
+			});
+		});
+		  
+		//监听搜索提交
+		form.on('submit(webform)', function(data){
+			layui.pageTable.reload({where:data.field,page:{curr:1}});
+			return false;
+		});
+	}
+		
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/message/star.html b/app/home/view/message/star.html
new file mode 100644
index 0000000000000000000000000000000000000000..dbf1813e4a240ceb9f9a0e1b4b9d7e5e185d2fa3
--- /dev/null
+++ b/app/home/view/message/star.html
@@ -0,0 +1,183 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	{include file="message/msgmenu" /}
+	<div style="margin-left:172px;">
+		<form class="layui-form gg-form-bar border-t border-x">
+			<div class="layui-input-inline" style="width:200px">
+				<input type="text" autocomplete="off" name="range_time" readonly class="layui-input tool-time" data-range="~" placeholder="接收日期">
+			</div>
+			<div class="layui-input-inline" style="width:128px">
+				<select name="types">
+					<option value="">选择消息类型</option>
+					<option value="1">系统消息</option>
+					<option value="2">个人消息</option>
+				</select>
+			</div>
+			<div class="layui-input-inline" style="width:300px">
+				<input type="text" name="keywords" placeholder="关键字" class="layui-input" autocomplete="off"/>
+			</div>
+			<div class="layui-input-inline" style="width:150px;">
+				<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+				<button type="reset" class="layui-btn layui-btn-reset" lay-filter="reset">清空</button>
+			</div>
+		</form> 
+		<table class="layui-hide" id="test" lay-filter="test"></table>
+	</div>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+	<div class="layui-btn-container">
+		<div class="layui-btn-group">
+			<button class="layui-btn layui-btn-sm" lay-event="add"><i class="layui-icon">&#xe61f;</i>新建消息</button>
+			<button class="layui-btn layui-btn-normal layui-btn-sm" lay-event="unstar"><i class="layui-icon">&#xe67b;</i>取消星标</button>
+			<button class="layui-btn layui-btn-warm layui-btn-sm" lay-event="read"><i class="layui-icon">&#xe605;</i>设为已读</button>
+			<button class="layui-btn layui-btn-danger layui-btn-sm" lay-event="del"><i class="layui-icon">&#xe640;</i>批量删除</button>
+		</div>
+	</div>
+</script>
+{/block}
+<!-- /主体 -->
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool ,form = layui.form;		
+		layui.pageTable = table.render({
+			elem: '#test',
+			toolbar: '#toolbarDemo',
+			defaultToolbar:false,
+			title:'标星信息',
+			url: "/home/message/star", //数据接口
+			page: true ,//开启分页
+			limit: 20,
+			cellMinWidth: 80,
+			height: 'full-112',
+			cols: [[ //表头
+			  {type:'checkbox',fixed:'left'},
+			  {field: 'msg_type', title: '消息类型',width:90,align:'center',templet: function (d) {
+					var html = '<span class="yellow">系统消息</span>';
+					if(d.from_uid > 0){
+						html = '<span class="blue">个人消息</span>';
+					}
+					return html;
+				}			  
+			  },
+			  {field: 'from_name', title: '发件人', width:100,align:'center'},
+			  {field: 'title', title: '消息主题',minWidth:240},
+			  {field: 'create_time', title: '发件时间', align:'center',width:160},
+			  {field: 'read_time', title: '是否已读',align:'center', width:90,templet:function(d){
+					var html='<span style="color:#5FB878">已读</span>';
+					if(d.read_time==0){
+						html='<span style="color:#FF5722">未读</span>';
+					}
+					return html;
+			  }},
+			  {field: 'right', title: '操作',fixed:'right', width:160, align:'center',templet: function (d) {
+					let html='<div class="layui-btn-group">';
+					let btn1='<span class="layui-btn layui-btn-xs layui-btn-normal" lay-event="view">查看</span>';
+					let btn2='<span class="layui-btn layui-btn-xs" lay-event="reply">回复</span>';
+					let btn3='<span class="layui-btn layui-btn-xs layui-btn-normal" lay-event="resend">转发</span>';
+					let btn4='<button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button></div>';
+					if(d.from_uid == 0){
+						return html+btn1+btn4+'</div>'
+					}
+					else{
+						return html+btn1+btn2+btn3+btn4+'</div>'
+					}					
+				}
+			  }
+			]]
+		});
+
+		//监听行工具事件
+		table.on('tool(test)', function(obj){
+			var data = obj.data;
+			if(obj.event === 'del'){
+				layer.confirm('确定该信息要放入垃圾箱吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if(e.code==0){
+							layui.pageTable.reload();
+						}
+					}
+					tool.delete("/home/message/check", {
+						ids: data.id,type:2,
+					}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'view'){
+				tool.side('/home/message/read?id='+data.id);
+				return;
+			}
+			if(obj.event === 'reply'){
+				tool.side('/home/message/reply?msg_id='+data.id);
+				return;
+			}
+			if(obj.event === 'resend'){
+				tool.side('/home/message/resend?msg_id='+data.id);
+				return;
+			}
+		});
+		
+		//表头工具栏事件
+		table.on('toolbar(test)', function(obj){
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = checkStatus.data; 
+			if (obj.event === 'add') {
+				tool.side("/home/message/add");
+				return;
+			}
+			if(data.length==0){
+				layer.msg('请选择要操作的消息');
+				return false;
+			}
+			var idArray=[],msg='是否执行该操作？',type=0;
+			for(var i=0;i<data.length;i++){
+				idArray.push(data[i].id);
+			}
+			switch(obj.event){
+				case 'read':
+					msg = '确定把选中的信息设为已读吗?';
+					type = 1;
+				break;
+				case 'del':
+					msg = '确定把选中的信息要放入垃圾箱吗?';
+					type = 2;
+				break;
+				case 'unstar':
+					msg = '确定把选中的信息取消星标吗?';
+					type = 6;
+				break;
+			};
+			
+			layer.confirm(msg, {
+				icon: 3,
+				title: '提示'
+			}, function (index) {
+				let callback = function (e) {
+					layer.msg(e.msg);
+					if(e.code==0){
+						layui.pageTable.reload();
+					}
+				}
+				tool.delete("/home/message/check", {
+					ids: idArray.join(','),
+					type:type,
+				}, callback);
+				layer.close(index);
+			});
+		});
+		 
+		//监听搜索提交
+		form.on('submit(webform)', function(data){
+			layui.pageTable.reload({where:data.field,page:{curr:1}});
+			return false;
+		});
+	}		
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/message/view.html b/app/home/view/message/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..173c37dd2d5767980acfb001889b44576ed95391
--- /dev/null
+++ b/app/home/view/message/view.html
@@ -0,0 +1,121 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">消息详情</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">消息主题</td>
+			<td colspan="3">{$detail.title|default=''}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">收件人</td>
+			<td>
+				{eq name="$detail.types" value="1"}
+				<span class="layui-color-1">『同事』</span>{$detail.unames|default=''}
+				{/eq}
+				{eq name="$detail.types" value="2"}
+				<span class="layui-color-2">『部门』</span>{$detail.dnames|default=''}
+				{/eq}
+				{eq name="$detail.types" value="3"}
+				<span class="layui-color-3">『岗位』</span>{$detail.pnames|default=''}
+				{/eq}
+			</td>
+			{eq name="$detail.send_time" value="0"}
+			<td class="layui-td-gray">发送状态</td>
+			<td class="red">草稿，未发送</td>
+			{else/}
+			<td class="layui-td-gray">发送时间</td>
+			<td>{$detail.send_time|date='Y-m-d H:i:s'}</td>
+			{/eq}
+		</tr>
+		{notempty name="$detail.copy_names"}
+		<tr>
+			<td class="layui-td-gray">抄送人</td>
+			<td colspan="3">{$detail.copy_names|default=''}</td>
+		</tr>
+		{/notempty}
+		<tr>
+			<td class="layui-td-gray">消息内容</td>
+			<td colspan="3">
+				<pre style="font-family:inherit">{$detail.content|default=''}</pre>
+				{gt name="$detail.template" value="0"}
+					{:get_message_link($detail.template,$detail.action_id)}
+				{/gt}
+				{if condition="($detail.msg_id > 0)"}		
+				<table class="layui-table" style="margin-top:10px">
+				<tr>
+					<td class="layui-td-gray-2">引用消息内容</td>
+					<td>
+						<pre style="font-family:inherit">{$detail.from_content}</pre>
+						{gt name="$detail.from_template" value="0"}
+							{:get_message_link($detail.from_template,$detail.from_action_id)}
+						{/gt}
+					</td>
+				</tr>
+				{notempty name="$detail.from_file_array"}
+				<tr>
+					<td class="layui-td-gray" style="vertical-align:top">引用消息附件</td>
+					<td style="line-height:inherit">
+						<div class="layui-row">
+							{volist name="$detail.from_file_array" id="vo"}
+							<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo,'view')}</div>
+							{/volist}
+						</div>
+					</td>
+				</tr>
+				{/notempty}
+				</table>
+				{/if}
+			</td>
+		</tr>
+		{notempty name="$detail.file_ids"}
+		<tr>
+			<td class="layui-td-gray">消息附件</td>
+			<td colspan="3" style="line-height:inherit">
+				<div class="layui-row">
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+		{notempty name="$detail.read_user_names"}
+		<tr>
+			<td class="layui-td-gray">已读回执</td>
+			<td colspan="3">{$detail.read_user_names}</td>
+		</tr>
+		{/notempty}
+	</table>
+	{eq name="$detail.send_time" value="0"}
+	<div class="pt-4">
+		<input type="hidden" value="{$detail.id}" name="id">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即发送</button>
+	</div>
+	{/eq}
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var tool = layui.tool,form = layui.form;
+		//监听发送
+		form.on('submit(webform)', function(data){
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			tool.post("/home/message/send_message", data.field, callback);
+			return false;
+		});
+	}		
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/module/add.html b/app/home/view/module/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..4514c681dc068a1f3e66fe100c0453cb2321d3ea
--- /dev/null
+++ b/app/home/view/module/add.html
@@ -0,0 +1,60 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">自定义模块</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td colspan="4"><strong class="red">注意：自定义模块目录不能和已有的模块目录相同，尽量使用个性化的目录，防止后期可能与官网新推出模块的目录相同，引起升级不必要的麻烦。</strong></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">模块名称<font>*</font></td>
+			<td>
+				<input type="hidden" name="id" value="{$id}" />
+				<input type="hidden" name="type" value="3" />
+				<input type="hidden" name="sourse" value="2" />
+				<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入模块名称" lay-reqText="请输入模块名称" class="layui-input" value="{$module.title|default=''}">
+			</td>
+			<td class="layui-td-gray-2">模块所在目录<font>*</font></td>
+			<td>
+				<input type="text" name="name" lay-verify="required" autocomplete="off" placeholder="请输入模块所在目录" lay-reqText="请输入模块所在目录" class="layui-input" value="{$module.name|default=''}">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">模块描述</td>
+			<td colspan="3">
+				<textarea name="desc" placeholder="请输入模块描述，不能超过200个字" class="layui-textarea">{$module.desc|default=''}</textarea>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					setTimeout(function(){
+						parent.location.reload();
+					},1000)
+				}
+			}
+			tool.post("/home/module/add", data.field, callback);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/module/index.html b/app/home/view/module/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..53f02469966b0a042f7b3062e1edef9d30837cdf
--- /dev/null
+++ b/app/home/view/module/index.html
@@ -0,0 +1,153 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<div class="gg-form-bar border-t border-x">
+		<div class="pb-3"><button type="button" class="layui-btn layui-btn-sm side-a" data-href="/home/module/add">新增自定义模块</button>{empty name="$oa_module"}<span class="ml-3 red">温馨提示：可能是网络或其他原因未能请求到官网的模块数据，但不影响系统的正常使用。</span>{/empty}</div>
+	</div>
+	<table cellspacing="0" cellpadding="0" border="0" class="layui-table layui-table-form">
+		<tr>
+			<th style="text-align: center; background-color:#FAFAFA">模块名称</th>
+			<th style="text-align: center; background-color:#FAFAFA">模块所在目录</th>
+			<th style="text-align: center; background-color:#FAFAFA">功能描述</th>
+			<th style="text-align: center; background-color:#FAFAFA">类型</th>
+			<th style="text-align: center; background-color:#FAFAFA">开发者</th>
+			<th style="text-align: center; background-color:#FAFAFA">状态</th>
+			<th style="text-align: center; background-color:#FAFAFA; width:90px">操作</th>
+		</tr>
+		{empty name="sys_module"}
+		<tr>
+			<td colspan="7" align="center">暂无数据</td>
+		</tr>
+		{/empty}
+		{volist name="sys_module" id="vo" key="k"}
+		<tr>
+			<td align="center">{$vo.title}</td>
+			<td>app/{$vo.name}</td>
+			<td>{$vo.desc}</td>
+			<td align="center">
+				{eq name="$vo.type" value="1"}<span class="red">系统模块</span>{/eq}
+				{eq name="$vo.type" value="2"}<span class="blue">普通模块</span>{/eq}
+				{eq name="$vo.type" value="3"}<span class="green">自定义模块</span>{/eq}
+			</td>
+			<td align="center">
+				{eq name="$vo.sourse" value="1"}勾股OA{/eq}
+				{eq name="$vo.sourse" value="2"}第三方{/eq}
+			</td>
+			{eq name="$vo.status" value="-1"}
+			<td align="center">
+				<span class="red">未安装</span>
+			</td>
+			<td align="center">
+				<div class="layui-btn-group">
+					{eq name = "$vo.is_file" value="0"}
+					<a class="layui-btn layui-btn-xs down" href="https://www.gougucms.com/home/pages/detail/s/gouguoa.html" target="_blank">下载</a>
+					{/eq}
+					{eq name = "$vo.is_file" value="1"}
+					<a class="layui-btn layui-btn-xs install" data-name="{$vo.name}">安装</a>
+					{/eq}
+					<a class="layui-btn layui-btn-normal layui-btn-xs view" href="https://www.gougucms.com/home/pages/detail/s/gouguoa.html" target="_blank">演示</a>
+				</div>
+			</td>
+			{/eq}
+			{eq name="$vo.status" value="0"}
+			<td align="center">
+				<span class="yellow">已卸载</span>
+			</td>
+			<td align="center">
+				<div class="layui-btn-group">
+					{eq name="$vo.sourse" value="2"}<a class="layui-btn layui-bg-blue layui-btn-xs side-a" data-href="/home/module/add/id/{$vo.id}">编辑</a>{/eq}
+					<a class="layui-btn layui-btn-xs add" data-name="{$vo.name}" data-type="{$vo.type}">恢复</a>
+				</div>
+			</td>
+			{/eq}
+			{eq name="$vo.status" value="1"}
+			<td align="center">
+				<span class="green">正常</span>
+			</td>
+			<td align="center">
+				{eq name="$vo.type" value="3"}
+				<div class="layui-btn-group">
+					<a class="layui-btn layui-bg-blue layui-btn-xs side-a" data-href="/home/module/add/id/{$vo.id}">编辑</a>
+					<a class="layui-btn layui-btn-danger layui-btn-xs delete" data-name="{$vo.name}" data-id="{$vo.id}" data-type="{$vo.type}">删除</a>
+				</div>
+				{else/}
+				-
+				{/eq}
+			</td>
+			{/eq}
+		</tr>
+		{/volist}
+	</table>
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var tool = layui.tool;
+
+		$('body').on('click', '.install', function () {
+			let name = $(this).data('name');
+			layer.confirm('确定要安装该模块吗?', { icon: 3, title: '提示' }, function (index) {
+				//layer.msg('该功能内测中...');
+				//return false;
+				let callback = function (e) {
+					layer.msg(e.msg);
+					if (e.code == 0) {
+						layer.close(index);
+						location.reload();
+					}
+				}
+				tool.post("/home/module/install", {name: name}, callback);
+				layer.close(index);
+			});
+		});
+		$('body').on('click', '.delete', function () {
+			let id = $(this).data('id');
+			let name = $(this).data('name');
+			let type = $(this).data('type');
+			if(type==1){
+				layer.msg('系统模块，不支持卸载');
+				return false;
+			}
+			layer.confirm('确定要删除该模块吗?', { icon: 3, title: '提示' }, function (index) {
+				let callback = function (e) {
+					layer.msg(e.msg);
+					if (e.code == 0) {
+						layer.close(index);
+						setTimeout(function(){
+							parent.location.reload();
+						},1000)
+					}
+				}
+				tool.post("/home/module/del",{id: id}, callback);
+				layer.close(index);
+			});
+		});
+		
+		$('body').on('click', '.add', function () {
+			let name = $(this).data('name');
+			let type = $(this).data('type');
+			layer.confirm('确定要恢复使用该模块吗?', { icon: 3, title: '提示' }, function (index) {
+				let callback = function (e) {
+					layer.msg(e.msg);
+					if (e.code == 0) {
+						layer.close(index);
+						setTimeout(function(){
+							parent.location.reload();
+						},1000)				
+					}
+				}
+				tool.post("/home/module/recovery",{name: name}, callback);
+				layer.close(index);
+			});
+		});
+
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/outs/add.html b/app/home/view/outs/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..e8d5b92e9ee083b99ed806f1960e013875130a2b
--- /dev/null
+++ b/app/home/view/outs/add.html
@@ -0,0 +1,144 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page" lay-filter="form-outs">
+	<h3 class="pb-3">外出</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">开始时间<font>*</font></td>
+			<td><input name="start_date" class="layui-input tool-time" value="{$detail.start_date|default=''}" readonly lay-verify="required" placeholder="请选择开始时间" lay-reqText="请选择开始时间" data-type="datetime"></td>
+			<td class="layui-td-gray">结束时间<font>*</font></td>
+			<td><input name="end_date" class="layui-input tool-time" value="{$detail.end_date|default=''}" readonly lay-verify="required" placeholder="请选择结束时间" lay-reqText="请选择结束时间" data-type="datetime"></td>
+			<td class="layui-td-gray">外出天数<font>*</font></td>
+			<td><input name="duration" class="layui-input" value="{$detail.duration|default=''}" lay-verify="required|number" placeholder="请输入外出天数" lay-reqText="请输入外出天数"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">外出事由<font>*</font></td>
+			<td colspan="5">
+				<textarea name="reason" placeholder="请输入外出事由" class="layui-textarea" lay-verify="required" lay-reqText="请输入外出事由">{$detail.reason|default=''}</textarea>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">附件 <button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button></td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input data-type="file" type="hidden" name="file_ids" value="{$detail.file_ids|default=''}">
+					{notempty name="$detail.file_ids"}
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr>
+	</table>
+	<div id="checkBox" data-status="{$detail.check_status|default=0}" data-id="{$detail.id|default=0}" data-checkflowid="{$detail.check_flow_id|default=0}" class="pt-3"></div>
+	<div class="pt-3">
+		<input type="hidden" name="id" value="{$detail.id|default=0}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+/*
+ * 时长计算
+  */
+function daysBetweenDates(date1, date2) {
+	if(date1=='' || date2==''){
+		return -1;
+	}
+    var startDate = new Date(date1);
+    var endDate = new Date(date2);
+    var millisecondsPerDay = 24 * 60 * 60 * 1000;
+    var differenceInMilliseconds = endDate - startDate;
+    var differenceInDays = differenceInMilliseconds / millisecondsPerDay;
+    return Math.round(differenceInDays);
+}
+
+const moduleInit = ['tool','uploadPlus','oaCheck'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,uploadPlus=layui.uploadPlus,laydate = layui.laydate,oaCheck=layui.oaCheck;
+		oaCheck.init({
+			check_name:'outs',
+			check_btn:0
+		});	
+		var fileUp = new uploadPlus();
+	
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			if(data.field.duration==0){
+				layer.msg('外出时间选择有误');
+				return false;
+			}
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					let checkCallback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							tool.sideClose(1000);				
+						}
+					}
+					data.field.check_name = 'outs';
+					data.field.action_id = e.data.return_id;
+					oaCheck.submit(data.field,checkCallback);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/home/outs/add", data.field, callback,clickbtn);
+			return false;
+		});
+		
+		function countDuration(){
+			var date1 = $('#start_date').val();
+			var date2 = $('#end_date').val();
+			let days = daysBetweenDates(date1,date2);
+			if(days < 0){
+				$('#duration').val(0);
+				$('#days').html('-');
+			}
+			else{
+				let formData = form.val('form-outs');
+				console.log(formData);
+				if(formData.start_span==1){
+					days=days+1;
+				}
+				if(formData.start_span==2){
+					days=days+0.5;
+				}
+				if(formData.end_span==1){
+					days=days-0.5;
+				}
+				if(days<0){
+					days=0;
+				}
+				$('#duration').val(days);
+				$('#days').html(days);
+			}
+		}		
+		
+		//日期时间范围
+		lay('.select-time').each(function () {
+			laydate.render({
+				elem: this,
+				trigger: 'click',
+				done:function(){
+					countDuration();
+				}
+			});
+		});		
+		form.on('radio(start-span)',function(data){
+			countDuration();
+		});
+		form.on('radio(end-span)',function(data){
+			countDuration();
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/outs/datalist.html b/app/home/view/outs/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..f02a7cd2fd3af46e595a28e8997c5e014b283747
--- /dev/null
+++ b/app/home/view/outs/datalist.html
@@ -0,0 +1,86 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:300px">
+			<input type="text" name="keywords" placeholder="关键字" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_leaves" lay-filter="table_leaves"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-group">
+  	<button class="layui-btn layui-btn-sm tool-add" type="button" data-href="/home/leaves/add">+ 添加请假</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool;
+		
+		layui.pageTable = table.render({
+			elem: "#table_leaves"
+			, toolbar: "#toolbarDemo"
+			,url: "/home/leaves/datalist"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 80
+			,height: 'full-112'
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',title: '名称'}
+				,{field:'admin_name',title: '创建人',width:90,align:'center'}
+				,{field:'create_time', title: '创建时间',width:150,align:'center'}
+				,{width:120,fixed:'right',title: '操作', align:'center',ignoreExport:true,templet: function(d){
+					var html='';
+					var btn1='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详细</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn3='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
+					html = '<div class="layui-btn-group">'+btn1+btn2+btn3+'</div>';
+					return html;
+				}}
+			]]
+		});
+			
+		table.on('tool(table_leaves)',function (obj) {
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/home/leaves/view?id="+data.id);
+				return;
+			}
+			if (obj.event === 'edit') {
+				tool.side("/home/leaves/add?id="+data.id);
+				return;
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要删除该内容吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/home/leaves/del", { id: data.id }, callback);
+					layer.close(index);
+				});
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/outs/view.html b/app/home/view/outs/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..4b625ef897287747d14f1a010478a2364a98a472
--- /dev/null
+++ b/app/home/view/outs/view.html
@@ -0,0 +1,50 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<h3 class="pb-3">外出详情</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">开始时间</td>
+			<td>{$detail.start_date}</td>
+			<td class="layui-td-gray">结束时间</td>
+			<td>{$detail.end_date}</td>
+			<td class="layui-td-gray">外出天数</td>
+			<td>共{$detail.duration|default=0}天</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">外出事由</td>
+			<td colspan="5">{$detail.reason|default=''}</td>
+		</tr>
+		{notempty name="$detail.file_ids"}
+		<tr>
+			<td class="layui-td-gray">相关附件</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row">
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+	</table>
+	<div id="checkBox" data-status="{$detail.check_status}" data-id="{$detail.id}" data-checkflowid="{$detail.check_flow_id}" class="pt-3"></div>
+</div>
+{/block}
+<!-- /主体 -->
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool','oaCheck'];
+
+	function gouguInit() {
+		var tool = layui.tool,oaCheck = layui.oaCheck;
+		//审批相关
+        oaCheck.init({
+            check_name:'outs',
+        });
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/overtimes/add.html b/app/home/view/overtimes/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..f32a26d7692f633e3aabeb8db5557f045a2d388e
--- /dev/null
+++ b/app/home/view/overtimes/add.html
@@ -0,0 +1,80 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page" lay-filter="form-overtimes">
+	<h3 class="pb-3">加班</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">开始时间<font>*</font></td>
+			<td><input name="start_date" class="layui-input tool-time" value="{$detail.start_date|default=''}" readonly lay-verify="required" placeholder="请选择开始时间" lay-reqText="请选择开始时间" data-type="datetime"></td>
+			<td class="layui-td-gray">结束时间<font>*</font></td>
+			<td><input name="end_date" class="layui-input tool-time" value="{$detail.end_date|default=''}" readonly lay-verify="required" placeholder="请选择结束时间" lay-reqText="请选择结束时间" data-type="datetime"></td>
+			<td class="layui-td-gray">加班时长<font>*</font></td>
+			<td><input name="duration" class="layui-input" value="{$detail.duration|default=''}" lay-verify="required|number" placeholder="请输入加班时长(小时)" lay-reqText="请输入加班时长(小时)"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">加班事由<font>*</font></td>
+			<td colspan="5">
+				<textarea name="reason" placeholder="请输入加班事由" class="layui-textarea" lay-verify="required" lay-reqText="请输入加班事由">{$detail.reason|default=''}</textarea>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">附件 <button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input data-type="file" type="hidden" name="file_ids" value="{$detail.file_ids|default=''}">
+					{notempty name="$detail.file_ids"}
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr>
+	</table>
+	<div id="checkBox" data-status="{$detail.check_status|default=0}" data-id="{$detail.id|default=0}" data-checkflowid="{$detail.check_flow_id|default=0}" class="pt-3"></div>
+	<div class="pt-3">
+		<input type="hidden" name="id" value="{$detail.id|default=0}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool','uploadPlus','oaCheck'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,uploadPlus=layui.uploadPlus,laydate = layui.laydate,oaCheck=layui.oaCheck;
+		oaCheck.init({
+			check_name:'overtimes',
+			check_btn:0
+		});	
+		var fileUp = new uploadPlus();
+	
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					let checkCallback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							tool.sideClose(1000);				
+						}
+					}
+					data.field.check_name = 'overtimes';
+					data.field.action_id = e.data.return_id;
+					oaCheck.submit(data.field,checkCallback);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/home/overtimes/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/overtimes/datalist.html b/app/home/view/overtimes/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..f02a7cd2fd3af46e595a28e8997c5e014b283747
--- /dev/null
+++ b/app/home/view/overtimes/datalist.html
@@ -0,0 +1,86 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:300px">
+			<input type="text" name="keywords" placeholder="关键字" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_leaves" lay-filter="table_leaves"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-group">
+  	<button class="layui-btn layui-btn-sm tool-add" type="button" data-href="/home/leaves/add">+ 添加请假</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool;
+		
+		layui.pageTable = table.render({
+			elem: "#table_leaves"
+			, toolbar: "#toolbarDemo"
+			,url: "/home/leaves/datalist"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 80
+			,height: 'full-112'
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',title: '名称'}
+				,{field:'admin_name',title: '创建人',width:90,align:'center'}
+				,{field:'create_time', title: '创建时间',width:150,align:'center'}
+				,{width:120,fixed:'right',title: '操作', align:'center',ignoreExport:true,templet: function(d){
+					var html='';
+					var btn1='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详细</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn3='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
+					html = '<div class="layui-btn-group">'+btn1+btn2+btn3+'</div>';
+					return html;
+				}}
+			]]
+		});
+			
+		table.on('tool(table_leaves)',function (obj) {
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/home/leaves/view?id="+data.id);
+				return;
+			}
+			if (obj.event === 'edit') {
+				tool.side("/home/leaves/add?id="+data.id);
+				return;
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要删除该内容吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/home/leaves/del", { id: data.id }, callback);
+					layer.close(index);
+				});
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/overtimes/view.html b/app/home/view/overtimes/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..b9ad45e31487356cfb731e0eecb2271ffd6c123a
--- /dev/null
+++ b/app/home/view/overtimes/view.html
@@ -0,0 +1,50 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<h3 class="pb-3">加班详情</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">开始时间</td>
+			<td>{$detail.start_date}</td>
+			<td class="layui-td-gray">结束时间</td>
+			<td>{$detail.end_date}</td>
+			<td class="layui-td-gray">加班时长</td>
+			<td id="days">共{$detail.duration|default=0}小时</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">加班事由</td>
+			<td colspan="5">{$detail.reason|default=''}</td>
+		</tr>
+		{notempty name="$detail.file_ids"}
+		<tr>
+			<td class="layui-td-gray">相关附件</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row">
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+	</table>
+	<div id="checkBox" data-status="{$detail.check_status}" data-id="{$detail.id}" data-checkflowid="{$detail.check_flow_id}" class="pt-3"></div>
+</div>
+{/block}
+<!-- /主体 -->
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool','oaCheck'];
+
+	function gouguInit() {
+		var tool = layui.tool,oaCheck = layui.oaCheck;
+		//审批相关
+        oaCheck.init({
+            check_name:'overtimes',
+        });
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/role/add.html b/app/home/view/role/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..9ce7b3503a9e9c0dd30e1e0b6754516b58d2718a
--- /dev/null
+++ b/app/home/view/role/add.html
@@ -0,0 +1,178 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+.layui-form-checkbox[lay-skin=primary]{padding-left:20px;}
+.left-note{font-weight:800; vertical-align:top; padding-top:28px!important; text-align:center}
+.right-note .layui-checkbox-disabled span {color: #666666!important;}
+.note-0 {display: inline-block;vertical-align: middle;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+
+<form class="layui-form p-4">
+	<h3 class="pb-3">权限组</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray-2">权限组名称<font>*</font>
+			</td>
+			<td>
+				<input type="hidden" name="id" value="{$id}" />
+				<input class="layui-input" type="text" name="title" lay-verify="required" lay-reqText="请输入权限组名称" {notempty name="$role.title"
+				}value="{$role.title}" {/notempty} placeholder="请输入权限组名称" autocomplete="off" />
+			</td>
+			<td class="layui-td-gray">状态<font>*</font>
+			</td>
+			<td>
+			{if condition="$id eq 0"}
+			<input type="radio" name="status" value="1" title="正常" checked>
+			<input type="radio" name="status" value="-1" title="禁用">
+			{else/}
+			<input type="radio" name="status" value="1" title="正常" {eq name="$role.status" value="1" }checked{/eq}>
+			<input type="radio" name="status" value="-1" title="禁用" {eq name="$role.status" value="-1" }checked{/eq}>
+			{/if}
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">权限配置说明<font>*</font></td>
+			<td colspan="3"><strong class="red">注意：如果右侧子级权限有节点被勾选了，左侧的顶级权限就必须勾选，否则无法查看右侧的子级菜单。</strong></td>
+		</tr>
+		<tr>
+			<td colspan="4">	
+				<table style="width:100%" id="rule">
+					<tr>
+						<td style="text-align:center; background-color:#f8f8f8; width:160px;"><font style="color:red">选择可操作的顶级权限 ↓</font></td>
+						<td style="text-align:left; background-color:#f8f8f8;"><font style="color:red">选择可操作的子级权限 ↓</font></td>
+					</tr>
+					{volist name="role_rule" id="vo"}
+					<tr>
+						<td class="left-note">
+						  <input type="checkbox" name="rule[]" value="{$vo.id}" title="{$vo.title}" {eq name="$vo.checked" value="true" }checked{/eq}>
+						</td>
+						{gt name="vo.len" value="0"}
+							<td class="right-note">
+								<div style="padding:0 0 0 10px;">
+								{volist name="vo.children" key="k" id="voo"}
+									<div class="note-{$voo.len}" style="padding:10px 0;">
+										<input type="checkbox" lay-filter="rule" data-pid="{$vo.id}" value="{$voo.id}" name="rule[]" lay-skin="primary" title="{$voo.title}" {eq name="$voo.checked" value="true" }checked{/eq}>
+									</div>
+									{gt name="voo.len" value="0"}
+										<div style="padding:0 0 3px 22px; {if condition='$k != count($vo.children)'}margin-bottom:3px; padding-bottom:16px; border-bottom:1px solid #eee;{/if}">
+										{volist name="voo.children" id="vooo"}
+											<div class="note-{$vooo.len}" style="margin-right:10px;">
+												<input type="checkbox" data-rule="{$voo.id}" name="rule[]" value="{$vooo.id}" lay-skin="primary" title="{$vooo.title}" {eq name="$vooo.checked" value="true" }checked{/eq}>
+											</div>
+											{gt name="vooo.len" value="0"}
+												<div style="padding:6px 0 15px 22px; {if condition='$k != count($vo.children)'}margin-bottom:3px; padding-bottom:10px; margin-bottom:10px; border-bottom:1px solid #eee;{/if}">
+												{volist name="vooo.children" id="voooo"}
+													<div class="note-{$voooo.len}" style="margin-right:10px;">
+														<input type="checkbox" data-rule="{$voo.id}" name="rule[]" value="{$voooo.id}" lay-skin="primary" title="{$voooo.title}" {eq name="$voooo.checked" value="true" }checked{/eq}>
+													</div>
+												{/volist}
+												</div>
+											{/gt}
+										{/volist}
+										</div>
+									{/gt}
+								{/volist}
+								</div>
+							</td>
+						{/gt}
+					</tr>
+					{/volist}
+				</table>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-3" style="vertical-align: top;">PC工作台展示模块</td>
+			<td colspan="3">
+				{volist name="layout" id="vo"}
+					<div class="layui-input-inline" style="margin-right:10px;">
+						<input type="checkbox" data-rule="{$vo.id}" name="layout[]" value="{$vo.id}" lay-skin="primary" title="{$vo.title}" {eq name="$vo.checked" value="true" }checked{/eq}>
+					</div>
+				{/volist}
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-3" style="vertical-align: top;">手机工作台展示模块</td>
+			<td colspan="3">
+				{volist name="mobile_menu" id="v"}
+					<dl>
+						<dt style="padding:12px 0 6px; font-weight:600">{$v.title}</dt>
+						<dd>
+						{volist name="v.list" id="vo"}
+						<div class="layui-input-inline" style="margin-right:10px;">
+							<input type="checkbox" data-rule="{$vo.id}" name="mobile_menu[]" value="{$vo.id}" lay-skin="primary" title="{$vo.title}" {eq name="$vo.checked" value="true" }checked{/eq}>
+						</div>
+						{/volist}
+						<dd>
+				    </dl>
+				{/volist}
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-3" style="vertical-align: top;">手机底部Bar菜单</td>
+			<td colspan="3">
+				<p style="color:red; padding-bottom:5px;">建议勾选5个，页面效果展示效果最佳</p>
+				{volist name="mobile_bar" id="vo"}
+					<div class="layui-input-inline" style="margin-right:10px;">
+						<input type="checkbox" data-rule="{$vo.id}" name="mobile_bar[]" value="{$vo.id}" lay-skin="primary" title="{$vo.title}" {eq name="$vo.checked" value="true" }checked{/eq}>
+					</div>
+				{/volist}
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align: top;">备注内容</td>
+			<td colspan="3">
+				<textarea name="desc" placeholder="请输入备注" class="layui-textarea">{notempty name="$role.desc" }{$role.desc}{/notempty}</textarea>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool, tree = layui.tree;
+		//监听提交
+		form.on('submit(webform)', function (obj) {
+			$.ajax({
+				url: "/home/role/add",
+				data: obj.field,
+				type: 'post',
+				success: function (e) {
+					layer.msg(e.msg);
+					if (e.code == 0) {
+						tool.sideClose(1000);
+					}
+				}
+			});
+			return false;
+		});
+		
+		//监听多选框点击事件  通过 lay-filter="rule"来监听
+		form.on('checkbox(rule)', function (data) {
+		　　let val = data.value;
+			let pid =$(this).data('pid');
+			if(data.elem.checked){
+				//判断当前多选框是选中还是取消选中
+				$("input[data-rule='"+val+"']").prop("checked", true);//true:选中 false:不选中
+				$("input[value='"+pid+"']").prop("checked", true);//true:选中 false:不选中
+			}
+			else{
+				$("input[data-rule='"+val+"']").prop("checked", false);
+			}
+			form.render();//实时渲染选中和不选中的样式
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/role/index.html b/app/home/view/role/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..87b12bdccf591f614ac33cec530d3403051fdd62
--- /dev/null
+++ b/app/home/view/role/index.html
@@ -0,0 +1,77 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<table class="layui-hide" id="role" lay-filter="role"></table>
+</div>
+
+<script type="text/html" id="status">
+  <i class="layui-icon {{#  if(d.status == 1){ }}green layui-icon-ok{{#  } else { }}red layui-icon-close{{#  } }}"></i>
+</script>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+    <button class="layui-btn layui-btn-sm" lay-event="add">+ 添加权限组</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool, form = layui.form;
+		layui.pageTable = table.render({
+			elem: '#role',
+			toolbar: '#toolbarDemo',
+			defaultToolbar: false,
+			url: "/home/role/index", //数据接口
+			page: false, //开启分页
+			limit: 20,
+			cols: [[ //表头
+				{ field: 'id', title: 'ID号', align: 'center', width: 80 }
+				, { field: 'title', title: '权限组名称', width: 200 }
+				, { field: 'desc', title: '备注' }
+				, { field: 'status', title: '状态', toolbar: '#status', align: 'center', width: 80 }
+				, {	width: 100,title: '操作',align: 'center',templet: function (d) {
+						var html = '<div class="layui-btn-group"><button class="layui-btn  layui-btn-normal layui-btn-xs" lay-event="edit">编辑</button><button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button></div>';
+						return html;
+					}
+				}
+			]]
+		});
+		
+		//表头工具栏事件
+		table.on('toolbar(role)', function(obj){
+			if (obj.event === 'add') {
+				tool.side("/home/role/add");
+				return;
+			}
+		});
+		//监听行工具事件
+		table.on('tool(role)', function (obj) {
+			var data = obj.data;
+			if (obj.event === 'edit') {
+				tool.side('/home/role/add?id='+obj.data.id);
+				return;
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要删除该权限组吗？', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layer.msg(res.msg);
+							obj.del();
+						}
+					}
+					tool.delete("/home/role/delete", { id: obj.data.id }, callback);
+					layer.close(index);
+				});
+			}
+		});
+	}
+
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/rule/add.html b/app/home/view/rule/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..a6481e8a056ae8e0c3bb7c1e0aa284c76d0c7e04
--- /dev/null
+++ b/app/home/view/rule/add.html
@@ -0,0 +1,204 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">功能菜单/节点</h3>
+	{if condition="$id eq 0"}
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray-2">父级菜单/节点<font>*</font>
+			</td>
+			<td>
+				<select name="pid" lay-verify="required" lay-filter="pid" lay-reqText="请选择父级菜单/节点">
+					<option value="0" title="0">作为顶级菜单/节点</option>
+					{volist name=":set_recursion(admin_rule())" id="v"}
+					<option value="{$v.id}" title="{$v.level|default='1'}" {eq name="pid" value="$v.id" }selected="" {/eq}>{$v.title} ({$v.level|default='1'}级)</option>
+					{/volist}
+				</select>
+			</td>
+			<td class="layui-td-gray-2">所属功能模块<font>*</font></td>
+			<td>
+				<select name="module" lay-verify="required" lay-reqText="请选择所属功能模块">
+					<option value="">请选择</option>
+					{volist name=":admin_module()" id="v"}
+					<option value="{$v.name}">{$v.title} </option>
+					{/volist}
+				</select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">菜单/节点名称<font>*</font>
+			</td>
+			<td>
+				<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入菜单/节点名称"
+					lay-reqText="请输入菜单/节点名称" class="layui-input">
+			</td>
+			<td class="layui-td-gray">操作日志名称<font>*</font>
+			</td>
+			<td>
+				<input type="text" name="name" lay-verify="required" placeholder="请输入操作日志名称" lay-reqText="请输入操作日志名称"
+					autocomplete="off" class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">菜单/节点URL</td>
+			<td>
+				<input type="text" name="src" placeholder="请输入菜单/节点URL，可空" autocomplete="off" class="layui-input">
+			</td>
+			<td class="layui-td-gray">菜单排序</td>
+			<td>
+				<input type="text" name="sort" value="0" placeholder="请输入数字，越小越靠前" autocomplete="off"
+					class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">左侧菜单显示<font>*</font></td>
+			<td>
+				<input type="radio" name="menu" value="1" title="是">
+				<input type="radio" name="menu" value="2" title="不是">
+			</td>
+			<td class="layui-td-gray">菜单图标</td>
+			<td colspan="3">
+				<input type="text" name="icon" style="width:150px; display:inline" placeholder="请输入图标，可空"
+					autocomplete="off" class="layui-input">
+				如：icon-jichupeizhi<a href="{__GOUGU__}/icon/index.html" target="_blank" style="margin-left:10px; color:#007AFF">[查看图标]</a>
+			</td>
+		</tr>
+		<tr>
+			<td colspan="4" class="red" style="line-height:1.8">
+				<strong>注意：</strong>
+				<p><strong>1、作为菜单显示类型时最多展示三级菜单，所以父级菜单/节点选项最大只能选择到2级，非菜单显示类型无限制；一级菜单需要填写菜单图标。</strong></p>
+				<p><strong>2、节点URL的具体规则：“模块/控制器/方法”，模块只能是小写字母，控制器只能是小写字母，方法可以是小写字母，中间可以有"_"，示例如下：</strong></p>
+				<p class="green">『正确』user/rewardscate/datalist</p>
+				<p class="green">『正确』user/rewardscate/data_list</p>
+				<p class="red">『错误』user_a/rewardscate/datalist</p>
+				<p class="red">『错误』user/rewards_cate/datalist</p>
+			</td>
+		</tr>
+	</table>
+	{else/}
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray-2">父级菜单/节点<font>*</font>
+			</td>
+			<td>
+				<select name="pid" lay-verify="required"  lay-filter="pid" lay-reqText="请选择父级菜单/节点">
+					<option value="0" title="0">作为顶级节点</option>
+					{volist name=":set_recursion(admin_rule())" id="v"}
+					<option value="{$v.id}" title="{$v.level|default='1'}" {eq name="$detail.pid" value="$v.id" }selected="" {/eq}>{$v.title}  ({$v.level|default='1'}级)</option>
+					{/volist}
+				</select>
+			</td>
+			<td class="layui-td-gray-2">所属功能模块<font>*</font></td>
+			<td>
+				<select name="module" lay-verify="required" lay-reqText="请选择所属功能模块">
+					<option value="">请选择</option>
+					{volist name=":admin_module()" id="v"}
+					<option value="{$v.name}" {eq name="$detail.module" value="$v.name" }selected="" {/eq}>{$v.title} </option>
+					{/volist}
+				</select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">菜单/节点名称<font>*</font>
+			</td>
+			<td>
+				<input type="text" name="title" value="{$detail.title}" lay-verify="required" autocomplete="off"
+					placeholder="请输入菜单/节点名称" lay-reqText="请输入菜单/节点名称" class="layui-input">
+			</td>
+			<td class="layui-td-gray">操作日志名称<font>*</font>
+			</td>
+			<td>
+				<input type="text" name="name" value="{$detail.name}" lay-verify="required" placeholder="请输入操作日志名称"
+					lay-reqText="请输入操作日志名称" autocomplete="off" class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">菜单/节点URL</td>
+			<td>
+				<input type="text" name="src" value="{$detail.src}" placeholder="请输入菜单/节点URL，可空" autocomplete="off"
+					class="layui-input">
+			</td>
+			<td class="layui-td-gray">菜单排序</td>
+			<td>
+				<input type="text" name="sort" value="{$detail.sort}" placeholder="请输入数字，越小越靠前" autocomplete="off"
+					class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">左侧菜单显示<font>*</font></td>
+			<td>
+				<input type="radio" name="menu" value="1" title="是" {eq name="$detail.menu" value="1" } checked{/eq}>
+				<input type="radio" name="menu" value="2" title="不是" {eq name="$detail.menu" value="2" } checked{/eq}>
+			</td>
+			<td class="layui-td-gray">菜单图标</td>
+			<td colspan="3">
+				<input style="width:150px; display:inline" type="text" name="icon" value="{$detail.icon}" placeholder="请输入图标，可空" autocomplete="off" class="layui-input">
+				<strong class="iconfont {$detail.icon}"></strong><a href="{__GOUGU__}/icon/index.html" target="_blank" style="margin-left:10px; color:#007AFF">[查看图标]</a>
+			</td>
+		</tr>
+		<tr>
+			<td colspan="4" class="red" style="line-height:1.8">
+				<strong>注意：</strong>
+				<p><strong>1、作为菜单显示类型时最多展示三级菜单，所以父级菜单/节点选项最大只能选择到2级，非菜单显示类型无限制；一级菜单需要填写菜单图标。</strong></p>
+				<p><strong>2、节点URL的具体格式及规则：“模块/控制器/方法”，模块只能是小写字母，控制器只能是小写字母，方法可以是小写字母，中间可以有"_"，示例如下：</strong></p>
+				<p class="green">『正确』user/rewardscate/datalist</p>
+				<p class="green">『正确』user/rewardscate/data_list</p>
+				<p class="red">『错误』user_a/rewardscate/datalist</p>
+				<p class="red">『错误』user/rewards_cate/datalist</p>
+			</td>
+		</tr>
+	</table>
+	{/if}
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,level=0;
+		level = $('[name="pid"]').find('[selected=""]').attr('title');
+		if(level === undefined){
+			level=0;
+		}
+		console.log(level);
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			form.on('select(pid)', function(data){
+				level = data.elem[data.elem.selectedIndex].title;
+			})
+			if (!data.field.menu || data.field.menu == '') {
+				layer.msg('请选择是否在左侧菜单显示');
+				return false;
+			}
+			if (data.field.pid==0 && data.field.menu == 1 && data.field.icon == '') {
+				layer.msg('请完善菜单图标');
+				return false;
+			}
+			if (data.field.menu == 1 && level > 2) {
+				layer.msg('左侧显示菜单最多只能添加三级');
+				return false;
+			}
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					setTimeout(function(){
+						parent.parent.location.reload();
+					},1000);									
+				}
+			}
+			tool.post("/home/rule/add", data.field, callback);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/rule/index.html b/app/home/view/rule/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..a7069a463354d76899d3a5ffd536b1b4f5765241
--- /dev/null
+++ b/app/home/view/rule/index.html
@@ -0,0 +1,96 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<div class="gg-form-bar border-t border-x" style="padding-bottom:12px;">
+		<button class="layui-btn layui-btn-sm add-menu">+ 添加菜单/节点</button>
+	</div>
+	<div>
+		<table class="layui-hide" id="treeTable" lay-filter="treeTable"></table>
+	</div>
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var treeTable = layui.treeTable, tool = layui.tool;
+		
+		layui.trees = treeTable.render({
+			elem: '#treeTable'
+			,url: "/home/rule/index"
+			,tree: { // treeTable 特定属性集
+				customName: {name:'title'},
+				data: {},
+				view: {showIcon:false},
+				async: {},
+				callback: {}
+			}
+			, cellMinWidth: 80
+			, cols: [[
+				{ field: 'id', width: 80, title: 'ID号', align: 'center' }
+				, { field: 'sort', width: 60, title: '排序', align: 'center' }
+				,{field:'icon',title: '菜单图标',width: 80, align: 'center' ,templet: function(d){
+					var html='<strong class="iconfont '+d.icon+'"></strong>';
+					return html;
+				}}
+				, { field: 'title', width: 200, title: '菜单/节点名称' }
+				, { field: 'pid', title: '父ID', width: 80, align: 'center' }
+				, { field: 'src', title: 'URL链接' }
+				, {
+					field: 'menu', width: 100, title: '是否是菜单', align: 'center', templet: function (d) {
+						var html = '<span style="color:#fbbc05">否</span>';
+						if (d.menu == '1') {
+							html = '<span style="color:#12bb37">是</span>';
+						}
+						return html;
+					}
+				}
+				, { field: 'name', width: 110, title: '操作日志名称', align: 'center' }
+				, {
+					width: 188, title: '操作', align: 'center'
+					, templet: function (d) {
+						var html = '<span class="layui-btn-group"><button class="layui-btn layui-btn-xs" lay-event="add">添加子菜单/节点</button><button class="layui-btn layui-btn-normal  layui-btn-xs" lay-event="edit">编辑</button><button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button>';
+						return html;
+					}
+				}
+			]]
+			, page: false
+		});
+		//表头工具栏事件
+		$('.add-menu').on('click', function () {
+			tool.side("/home/rule/add");
+			return;
+		});
+
+		//操作按钮
+		treeTable.on('tool(treeTable)', function (obj) {
+			console.log(obj);
+			if (obj.event === 'add') {
+				tool.side('/home/rule/add?pid=' + obj.data.id);
+				return;
+			}
+			if (obj.event === 'edit') {
+				tool.side('/home/rule/add?id=' + obj.data.id);
+				return;
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要删除吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/home/rule/delete", { id: obj.data.id }, callback);
+					layer.close(index);
+				});
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/task/add.html b/app/home/view/task/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..cfe88f22073414b40fbc475e2a609668e6b84598
--- /dev/null
+++ b/app/home/view/task/add.html
@@ -0,0 +1,58 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">定时任务</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td colspan="4"><strong class="red">注意：定时任务目前只是记录，具体需要技术人员自行在系统服务器添加定时任务计划。</strong></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">任务名称<font>*</font></td>
+			<td>
+				<input type="hidden" name="id" value="{$id}" />
+				<input type="hidden" name="type" value="3" />
+				<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入任务名称" lay-reqText="请输入任务名称" class="layui-input" value="{$task.title|default=''}">
+			</td>
+			<td class="layui-td-gray-2">任务访问链接<font>*</font></td>
+			<td>
+				<input type="text" name="link" lay-verify="required" autocomplete="off" placeholder="请输入任务访问链接" lay-reqText="请输入任务访问链接" class="layui-input" value="{$task.link|default=''}">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">任务描述</td>
+			<td colspan="3">
+				<textarea name="desc" placeholder="请输入任务描述，不能超过200个字" class="layui-textarea">{$task.desc|default=''}</textarea>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/home/task/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/task/index.html b/app/home/view/task/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..68d2f43fe0a58f86cfbd443bc3c80cd6c594e35d
--- /dev/null
+++ b/app/home/view/task/index.html
@@ -0,0 +1,110 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<table class="layui-hide" id="task" lay-filter="task"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+	<button class="layui-btn layui-btn-sm" lay-event="add">+ 新增定时任务</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool, form = layui.form;
+		layui.pageTable = table.render({
+			elem: '#task',
+			title: '定时任务列表',
+			toolbar: '#toolbarDemo',
+			defaultToolbar: false,
+			url: "/home/task/index",
+			cellMinWidth: 80,
+			page: false, //开启分页				
+			limit: 20,
+			cols: [
+				[{
+					field: 'id',
+					width: 80,
+					title: 'ID编号',
+					align: 'center'
+				}, {
+					field: 'types',
+					width: 90,
+					title: '类型',
+					align: 'center',
+					templet: function (d) {
+						var html = '<span class="green">自定义任务</span>';
+						if(d.types==1){
+							html = '<span class="red">系统任务</span>';
+						}
+						else if(d.types==2){
+							html = '<span class="blue">普通任务</span>';
+						}
+						return html;
+					}
+				},  {
+					field: 'title',
+					width: 200,
+					title: '任务名称'
+				}, {
+					field: 'link',
+					width: 300,
+					title: '任务链接'
+				},{
+					field: 'desc',
+					title: '任务描述'
+				},{
+					width: 100,
+					title: '操作',
+					align: 'center',
+					templet: function (d) {
+						var html = '<div class="layui-btn-group"><button class="layui-btn layui-btn-xs" lay-event="add">编辑</button><button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button></div>';
+						return html;
+					}
+				}]
+			]
+		});
+
+		//表头工具栏事件
+		table.on('toolbar(task)', function (obj) {
+			if (obj.event === 'add') {
+				tool.side("/home/task/add");
+				return;
+			}
+		});
+
+		//监听行工具事件
+		table.on('tool(task)', function (obj) {
+			var data = obj.data;
+			if (obj.event === 'add') {
+				tool.side('/home/task/add?id=' + data.id);
+				return;
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要删除吗?', {
+					icon: 3,
+					title: '提示'
+				}, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+							layer.close(index);
+						}
+					}
+					tool.delete("/home/task/delete", { id: obj.data.id }, callback);
+				});
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/template/add.html b/app/home/view/template/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..cfb8fb581bc597aa0c88ba0b5dc34b9202d7374a
--- /dev/null
+++ b/app/home/view/template/add.html
@@ -0,0 +1,119 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+.layui-table-1 .tr_2{display:none}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">消息模板</h3>
+	<table class="layui-table layui-table-form layui-table-{$detail.types|default=2}">
+		<tr>
+			<td class="layui-td-gray-2">模板名称<font>*</font></td>
+			<td><input type="text" name="title" lay-verify="required" placeholder="请输入消息模板名称" lay-reqText="请输入消息模板名称" class="layui-input" value="{$detail.title|default=''}"></td>
+			<td class="layui-td-gray">模板标识<font>*</font></td>
+			<td><input type="text" name="name" placeholder="请输入模板标识" lay-reqText="请输入模板标识，只能是字母+数字" class="layui-input" value="{$detail.name|default=''}"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">消息类型<font>*</font></td>
+			<td>
+				{empty name="$detail"}
+				<select name="types" lay-filter="types">
+					<option value="">选择消息类型</option>
+					<option value="1">普通消息</option>
+					<option value="2" selected>审批消息</option>
+				</select>
+				{else/}
+				<select name="types" lay-filter="types">
+					<option value="">选择消息类型</option>
+					<option value="1" {eq name="$detail.types" value="1"} selected{/eq}>普通消息</option>
+					<option value="2" {eq name="$detail.types" value="2"} selected{/eq}>审批消息</option>
+				</select>
+				{/empty}
+			</td>
+			<td class="layui-td-gray">消息链接<font>*</font></td>
+			<td><input type="text" name="msg_link" placeholder="请输入消息链接" lay-reqText="请输入消息链接，只能是字母+数字" class="layui-input" value="{$detail.msg_link|default=''}"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray"><span class="tr_2">审批中的<br></span>消息模板标题<font>*</font></td>
+			<td colspan="3"><input type="text" name="msg_title_0" lay-verify="required" placeholder="请输入消息模板标题" lay-reqText="请输入消息模板标题" class="layui-input" value="{$detail.msg_title_0|default=''}"></td>			
+		</tr>
+		<tr>
+			<td class="layui-td-gray"><span class="tr_2"审批中的<br></span>消息模板内容<font>*</font></td>
+			<td colspan="3"><textarea name="msg_content_0" class="layui-textarea" lay-verify="required" placeholder="请输入消息模板内容" lay-reqText="请输入消息模板内容">{$detail.msg_content_0|default=''}</textarea></td>
+		</tr>
+		<tr class="tr_2">
+			<td class="layui-td-gray">审批通过的<br>消息模板标题<font>*</font></td>
+			<td colspan="3"><input type="text" name="msg_title_1" placeholder="请输入审批通过的消息模板标题" class="layui-input" value="{$detail.msg_title_1|default=''}"></td>			
+		</tr>
+		<tr class="tr_2">
+			<td class="layui-td-gray">审批通过的<br>消息模板内容<font>*</font></td>
+			<td colspan="3"><textarea name="msg_content_1" placeholder="请输入审批通过的消息模板内容" class="layui-textarea">{$detail.msg_content_1|default=''}</textarea></td>
+		</tr>
+		<tr class="tr_2">
+			<td class="layui-td-gray">审批拒绝的<br>消息模板标题<font>*</font></td>
+			<td colspan="3"><input type="text" name="msg_title_2" placeholder="请输入审批拒绝的消息模板标题" class="layui-input" value="{$detail.msg_title_2|default=''}"></td>			
+		</tr>
+		<tr class="tr_2">
+			<td class="layui-td-gray">审批拒绝的<br>消息模板内容<font>*</font></td>
+			<td colspan="3"><textarea name="msg_content_2" placeholder="请输入审批拒绝的消息模板内容" class="layui-textarea">{$detail.msg_content_2|default=''}</textarea></td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$detail.id|default=0}"/>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool'];
+
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;
+		form.on('select(types)', function(data){
+			if(data.value==1){
+				$('.layui-table-form').addClass('layui-table-1').removeClass('layui-table-2');
+			}
+			if(data.value==2){
+				$('.layui-table-form').addClass('layui-table-2').removeClass('layui-table-1');
+			}
+		});
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			if(data.field.types==2){
+				if(data.field.msg_title_1==''){
+					layer.msg('请输入审批通过的消息模板标题');
+					return false;
+				}
+				if(data.field.msg_content_1==''){
+					layer.msg('请输入审批通过的消息模板内容');
+					return false;
+				}
+				if(data.field.msg_title_2==''){
+					layer.msg('请输入审批拒绝的消息模板标题');
+					return false;
+				}
+				if(data.field.msg_content_1==''){
+					layer.msg('请输入审批拒绝的消息模板内容');
+					return false;
+				}
+			}
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			tool.post("/home/template/add", data.field, callback);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/template/datalist.html b/app/home/view/template/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..f1e9663efae9ba5f3bdbe1e0dba6046149e580f2
--- /dev/null
+++ b/app/home/view/template/datalist.html
@@ -0,0 +1,115 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:300px">
+			<input type="text" name="keywords" placeholder="关键字" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_template" lay-filter="table_template"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-group">
+  	<button class="layui-btn layui-btn-sm tool-add" type="button" data-href="/home/template/add">+ 添加消息模板</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool;
+		
+		layui.pageTable = table.render({
+			elem: "#table_template"
+			, toolbar: "#toolbarDemo"
+			,title:'消息模板列表'
+			,url: "/home/template/datalist"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 80
+			,height: 'full-112'
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'name',title: '模板标识',width:150}
+				,{field:'title',title: '模板名称'}
+				,{field:'admin_name',title: '创建人',width:90,align:'center'}
+				,{field:'create_time', title: '创建时间',width:150,align:'center'}
+				,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+					var html1='<span class="green">正常</span>';
+					var html2='<span class="yellow">禁用</span>';
+					if(d.status==1){
+						return html1;
+					}
+					else{
+						return html2;
+					}
+				}}
+				,{width:120,title: '操作', align:'center',templet: function(d){
+					var html='';
+					var btn='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn1='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">查看</a>';
+					var btn2='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+					var btn3='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+					if(d.status==1){
+						html = '<div class="layui-btn-group">'+btn+btn1+btn2+'</div>';
+					}
+					else{
+						html = '<div class="layui-btn-group">'+btn+btn1+btn3+'</div>';
+					}
+					return html;
+				}}
+			]]
+		});
+			
+		table.on('tool(table_template)',function (obj) {
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = obj.data;
+			if(obj.event === 'disable'){
+				layer.confirm('确定要禁用该类型吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/home/template/set", { id: obj.data.id,status: 0}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'open'){
+				layer.confirm('确定要启用该类型吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/home/template/set", { id: obj.data.id,status: 1}, callback);
+					layer.close(index);
+				});
+			}
+			if (obj.event === 'edit') {
+				tool.side("/home/template/add?id="+data.id);
+				return;
+			}
+			if (obj.event === 'view') {
+				tool.side("/home/template/view?id="+data.id);
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/template/view.html b/app/home/view/template/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..9155ddc2db098622848219677de207197f8d9393
--- /dev/null
+++ b/app/home/view/template/view.html
@@ -0,0 +1,39 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">消息模板详情</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">模板名称</td>
+			<td>{$detail.title|default=''}</td>
+			<td class="layui-td-gray">模板标识</td>
+			<td>{$detail.name|default=''}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">消息标题</td>
+			<td>{$detail.msg_title|default=''}</td>
+			<td class="layui-td-gray">消息链接</td>
+			<td>{$detail.msg_link|default=''}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">消息模板内容</td>
+			<td colspan="3">{$detail.msg_content|default=''}</td>
+		</tr>
+	</table>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool'];
+
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;
+
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/trips/add.html b/app/home/view/trips/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..aeaec25f4666b00a7cfd1245f267f402584aab30
--- /dev/null
+++ b/app/home/view/trips/add.html
@@ -0,0 +1,79 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page" lay-filter="form-trips">
+	<h3 class="pb-3">出差</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">开始时间<font>*</font></td>
+			<td><input name="start_date" class="layui-input tool-time" value="{$detail.start_date|default=''}" readonly lay-verify="required" placeholder="请选择开始时间" lay-reqText="请选择开始时间" data-type="datetime"></td>
+			<td class="layui-td-gray">结束时间<font>*</font></td>
+			<td><input name="end_date" class="layui-input tool-time" value="{$detail.end_date|default=''}" readonly lay-verify="required" placeholder="请选择结束时间" lay-reqText="请选择结束时间" data-type="datetime"></td>
+			<td class="layui-td-gray">出差天数<font>*</font></td>
+			<td><input name="duration" class="layui-input" value="{$detail.duration|default=''}" lay-verify="required|number" placeholder="请输入出差天数" lay-reqText="请输入出差天数"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">出差事由<font>*</font></td>
+			<td colspan="5">
+				<textarea name="reason" placeholder="请输入出差事由" class="layui-textarea" lay-verify="required" lay-reqText="请输入出差事由">{$detail.reason|default=''}</textarea>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">附件 <button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button></td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input data-type="file" type="hidden" name="file_ids" value="{$detail.file_ids|default=''}">
+					{notempty name="$detail.file_ids"}
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr>
+	</table>
+	<div id="checkBox" data-status="{$detail.check_status|default=0}" data-id="{$detail.id|default=0}" data-checkflowid="{$detail.check_flow_id|default=0}" class="pt-3"></div>
+	<div class="pt-3">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool','uploadPlus','oaCheck'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,uploadPlus=layui.uploadPlus,laydate = layui.laydate,oaCheck=layui.oaCheck;
+		oaCheck.init({
+			check_name:'trips',
+			check_btn:0
+		});	
+		var fileUp = new uploadPlus();
+	
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					let checkCallback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							tool.sideClose(1000);				
+						}
+					}
+					data.field.check_name = 'trips';
+					data.field.action_id = e.data.return_id;
+					oaCheck.submit(data.field,checkCallback);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/home/trips/add", data.field, callback,clickbtn);
+			return false;
+		});	
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/trips/datalist.html b/app/home/view/trips/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..f02a7cd2fd3af46e595a28e8997c5e014b283747
--- /dev/null
+++ b/app/home/view/trips/datalist.html
@@ -0,0 +1,86 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:300px">
+			<input type="text" name="keywords" placeholder="关键字" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_leaves" lay-filter="table_leaves"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-group">
+  	<button class="layui-btn layui-btn-sm tool-add" type="button" data-href="/home/leaves/add">+ 添加请假</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool;
+		
+		layui.pageTable = table.render({
+			elem: "#table_leaves"
+			, toolbar: "#toolbarDemo"
+			,url: "/home/leaves/datalist"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 80
+			,height: 'full-112'
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',title: '名称'}
+				,{field:'admin_name',title: '创建人',width:90,align:'center'}
+				,{field:'create_time', title: '创建时间',width:150,align:'center'}
+				,{width:120,fixed:'right',title: '操作', align:'center',ignoreExport:true,templet: function(d){
+					var html='';
+					var btn1='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详细</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn3='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
+					html = '<div class="layui-btn-group">'+btn1+btn2+btn3+'</div>';
+					return html;
+				}}
+			]]
+		});
+			
+		table.on('tool(table_leaves)',function (obj) {
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/home/leaves/view?id="+data.id);
+				return;
+			}
+			if (obj.event === 'edit') {
+				tool.side("/home/leaves/add?id="+data.id);
+				return;
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要删除该内容吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/home/leaves/del", { id: data.id }, callback);
+					layer.close(index);
+				});
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/home/view/trips/view.html b/app/home/view/trips/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..f1f45097503ba9bef25858a1d34c8d3ec671c194
--- /dev/null
+++ b/app/home/view/trips/view.html
@@ -0,0 +1,50 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<h3 class="pb-3">出差详情</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">开始时间</td>
+			<td>{$detail.start_date}</td>
+			<td class="layui-td-gray">结束时间</td>
+			<td>{$detail.end_date}</td>
+			<td class="layui-td-gray">出差天数</td>
+			<td>共{$detail.duration|default=0}天</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">出差事由</td>
+			<td colspan="5">{$detail.reason|default=''}</td>
+		</tr>
+		{notempty name="$detail.file_ids"}
+		<tr>
+			<td class="layui-td-gray"><div class="layui-input-inline">附件</div></td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row">
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+	</table>
+	<div id="checkBox" data-status="{$detail.check_status}" data-id="{$detail.id}" data-checkflowid="{$detail.check_flow_id}" class="pt-3"></div>
+</div>
+{/block}
+<!-- /主体 -->
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool','oaCheck'];
+
+	function gouguInit() {
+		var tool = layui.tool,oaCheck = layui.oaCheck;
+		//审批相关
+        oaCheck.init({
+            check_name:'trips'
+        });
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/install/controller/Index.php b/app/install/controller/Index.php
new file mode 100644
index 0000000000000000000000000000000000000000..2a0d3762321db5161083c54681e56768c729def2
--- /dev/null
+++ b/app/install/controller/Index.php
@@ -0,0 +1,234 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+namespace app\install\controller;
+
+use app\install\validate\InstallCheck;
+use mysqli;
+use think\exception\ValidateException;
+use think\facade\View;
+
+class Index
+{
+    public function __construct()
+    {
+        // 检测是否安装过
+        if (is_installed()) {
+			if(Request()->action()!='step4'){
+				echo '你已经安装过勾股OA系统！如需重新安装，请删除“config/install.lock”文件';
+				die();
+			}
+        }
+    }
+
+    public function index()
+    {
+		View::assign('TP_VERSION',\think\facade\App::version());
+        return view('step1');
+    }
+
+    public function step2()
+    {
+        if (class_exists('pdo')) {
+            $data['pdo'] = 1;
+        } else {
+            $data['pdo'] = 0;
+        }
+
+        if (extension_loaded('pdo_mysql')) {
+            $data['pdo_mysql'] = 1;
+        } else {
+            $data['pdo_mysql'] = 0;
+        }
+
+        if (extension_loaded('curl')) {
+            $data['curl'] = 1;
+        } else {
+            $data['curl'] = 0;
+        }
+
+        if (ini_get('file_uploads')) {
+            $data['upload_size'] = ini_get('upload_max_filesize');
+        } else {
+            $data['upload_size'] = 0;
+        }
+
+        if (function_exists('session_start')) {
+            $data['session'] = 1;
+        } else {
+            $data['session'] = 0;
+        }
+        return view('', ['data' => $data]);
+    }
+
+    public function step3()
+    {
+        return view();
+    }
+
+    public function step4()
+    {
+		\think\facade\Cache::clear();
+		$domain = get_system_config('web','domain');
+        return view('', ['domain' => $domain]);
+    }	
+		
+    public function install()
+    {
+        $data = get_params();
+        try {
+            validate(InstallCheck::class)->check($data);
+        } catch (ValidateException $e) {
+            // 验证失败 输出错误信息
+            return to_assign(1, $e->getError());
+        }
+        $dbName = $data['DB_NAME'];		
+		//验证表是否存在		
+		try {
+			// 连接数据库
+			$link = @new mysqli("{$data['DB_HOST']}:{$data['DB_PORT']}", $data['DB_USER'], $data['DB_PWD']);
+		} catch (\Exception $e) {
+			// 这是进行异常捕获,创建数据库
+			$error = $e->getMessage();
+			return to_assign(1, '数据库链接失败:' . $error);die;
+		}
+
+        // 获取错误信息
+        $error = $link->connect_error;
+        if (!is_null($error)) {
+            // 转义防止和alert中的引号冲突
+            $error = addslashes($error);
+            return to_assign(1, '数据库链接失败:' . $error);die;
+        }
+        // 设置字符集
+        $link->query("SET NAMES 'utf8mb4'");
+		//验证表是否存在		
+		try {
+			// 这里是主体代码
+			$isDB=$link->query('SHOW TABLES LIKE '."'".$dbName."'");
+			if(!$isDB){
+				//创建数据库并选中
+				$sql    = "CREATE DATABASE IF NOT EXISTS `{$dbName}` DEFAULT CHARACTER SET utf8mb4";
+				$link->query($sql);
+			}
+		} catch (\Exception $e) {
+			// 这是进行异常捕获,创建数据库并选中
+			$error = $e->getMessage();
+			$sql    = "CREATE DATABASE IF NOT EXISTS `{$dbName}` DEFAULT CHARACTER SET utf8mb4";
+            $link->query($sql);
+		}
+		
+        $link->select_db($dbName);
+        // 导入sql数据并创建表
+        $oa_sql = file_get_contents(CMS_ROOT . '/app/install/data/gouguoa.sql');
+        $sql_array = preg_split("/;[\r\n]+/", str_replace("oa_", $data['DB_PREFIX'], $oa_sql));
+        foreach ($sql_array as $k => $v) {
+            if (!empty($v)) {				
+				try {
+					//var_dump($v);
+					$link->query($v);
+				} catch (\Exception $e) {
+					return to_assign(1, '数据写入失败，请联系官方！');
+					break;
+				}
+            }
+        }
+        $isTable = $link->query('SHOW TABLES LIKE "'.$data['DB_PREFIX'] . 'admin"');
+        if(!$isTable){
+            return to_assign(1, '创建数据库表失败，请检查是否有创建权限！');
+        }
+
+        //插入管理员信息
+        $username = get_params('username');
+        $password = get_params('password');
+        $nickname = '超级员工';
+        $name = '超级员工';
+        $thumb = '/static/home/images/icon.png';
+        $salt = set_salt(20);
+        $password = set_password($password, $salt);
+        $now_time = time();
+
+        $create_admin_sql = "INSERT INTO " . $data['DB_PREFIX'] . "admin" .
+            "(username,salt,pwd,name,nickname,did,position_id,sex,mobile,email,type,thumb,entry_time,create_time,update_time,auth_did)"
+            . "VALUES "
+            . "('$username','$salt','$password','$name','$nickname',1,1,1,'13800138000','gouguoa@gougucms.com',1,'$thumb','$now_time','$now_time','$now_time',10)";
+        if (!$link->query($create_admin_sql)) {
+            return to_assign(1, '创建管理员信息失败');
+        }
+        $link->close();
+        $db_str = "<?php
+return [
+    // 默认使用的数据库连接配置
+    'default'         => 'mysql',
+    // 自定义时间查询规则
+    'time_query_rule' => [],
+    // 自动写入时间戳字段
+    // true为自动识别类型 false关闭
+    // 字符串则明确指定时间字段类型 支持 int timestamp datetime date
+    'auto_timestamp'  => true,
+    // 时间字段取出后的默认时间格式
+    'datetime_format' => 'Y-m-d H:i:s',
+    // 数据库连接配置信息
+    'connections'     => [
+        'mysql' => [
+            // 数据库类型
+            'type'               =>  'mysql',
+            // 服务器地址
+            'hostname'           =>  '{$data['DB_HOST']}',
+            // 数据库名
+            'database'           =>  '{$data['DB_NAME']}',
+            // 用户名
+            'username'           =>  '{$data['DB_USER']}',
+            // 密码
+            'password'           =>  '{$data['DB_PWD']}',
+            // 端口
+            'hostport'           =>  '{$data['DB_PORT']}',
+            // 数据库表前缀
+            'prefix'             =>  '{$data['DB_PREFIX']}',
+            // 数据库连接参数
+            'params'          => [],
+            // 数据库编码默认采用utf8mb4
+            'charset'         => 'utf8mb4',
+            // 数据库调试模式
+            'debug'           => false,
+            // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
+            'deploy'          => 0,
+            // 数据库读写是否分离 主从式有效
+            'rw_separate'     => false,
+            // 读写分离后 主服务器数量
+            'master_num'      => 1,
+            // 指定从服务器序号
+            'slave_no'        => '',
+            // 是否严格检查字段是否存在
+            'fields_strict'   => true,
+            // 是否需要断线重连
+            'break_reconnect' => false,
+            // 监听SQL
+            'trigger_sql'     => true,
+            // 开启字段缓存
+            'fields_cache'    => false,
+        ],
+    ],
+];";
+
+        // 创建数据库配置文件
+        if (false == file_put_contents(CMS_ROOT . "config/database.php", $db_str)) {
+            return to_assign(1, '创建数据库配置文件失败，请检查目录权限');
+        }
+        if (false == file_put_contents(CMS_ROOT . "config/install.lock", '勾股OA安装鉴定文件，请勿删除！！！！！此次安装时间为：' . date('Y-m-d H:i:s', time()))) {
+            return to_assign(1, '创建安装鉴定文件失败，请检查目录权限');
+        }
+        return to_assign(0,'安装完成');
+    }
+}
diff --git a/app/install/data/gouguoa.sql b/app/install/data/gouguoa.sql
new file mode 100644
index 0000000000000000000000000000000000000000..3734bdc90d510fe3eec704d6ff64cee565a4bf3b
--- /dev/null
+++ b/app/install/data/gouguoa.sql
@@ -0,0 +1,3288 @@
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for oa_admin
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_admin`;
+CREATE TABLE `oa_admin`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `userid` varchar(100) NOT NULL DEFAULT '' COMMENT '企业微信userid',
+  `username` varchar(100) NOT NULL DEFAULT '' COMMENT '登录用户名',
+  `pwd` varchar(100) NOT NULL DEFAULT '' COMMENT '登录密码',
+  `salt` varchar(100) NOT NULL DEFAULT '' COMMENT '密码盐',
+  `reg_pwd` varchar(100) NOT NULL DEFAULT '' COMMENT '初始密码',
+  `name` varchar(100) NOT NULL DEFAULT '' COMMENT '员工姓名',
+  `email` varchar(100) NOT NULL DEFAULT '' COMMENT '电子邮箱',
+  `mobile` bigint(11) NOT NULL DEFAULT 0 COMMENT '手机号码',
+  `sex` int(1) NOT NULL DEFAULT 0 COMMENT '性别:1男,2女',
+  `nickname` varchar(100) NOT NULL DEFAULT '' COMMENT '别名',
+  `thumb` varchar(255) NOT NULL COMMENT '头像',
+  `theme` varchar(50) NOT NULL DEFAULT 'white' COMMENT '系统主题',
+  `did` int(11) NOT NULL DEFAULT 0 COMMENT '主部门id',
+  `pid` int(11) NOT NULL DEFAULT 0 COMMENT '上级主管id',
+  `position_id` int(11) NOT NULL DEFAULT 0 COMMENT '职位id',
+  `position_name` int(11) NOT NULL DEFAULT 0 COMMENT '职务',
+  `position_rank` int(11) NOT NULL DEFAULT 0 COMMENT '职级',
+  `type` int(1) NOT NULL DEFAULT 0 COMMENT '员工类型:0未设置,1正式,2试用,3实习',
+  `is_staff` int(1) NOT NULL DEFAULT 1 COMMENT '身份类型:1企业员工,2劳务派遣,3兼职员工',
+  `job_number` varchar(255) NOT NULL DEFAULT '' COMMENT '工号',
+  `birthday` int(11) NOT NULL DEFAULT 0 COMMENT '生日',
+  `age` int(11) NOT NULL DEFAULT 0 COMMENT '年龄',
+  `work_date` int(11) NOT NULL DEFAULT 0 COMMENT '开始工作时间',
+  `work_location` int(11) NOT NULL DEFAULT 0 COMMENT '工作地点',
+  `native_place` varchar(255) NOT NULL DEFAULT '' COMMENT '籍贯',
+  `nation` varchar(255) NOT NULL DEFAULT '' COMMENT '民族',
+  `home_address` varchar(255) NOT NULL DEFAULT '' COMMENT '家庭地址',
+  `current_address` varchar(255) NOT NULL DEFAULT '' COMMENT '现居地址',
+  `contact` varchar(255) NOT NULL DEFAULT '' COMMENT '紧急联系人',
+  `contact_mobile` varchar(255) NOT NULL DEFAULT '' COMMENT '紧急联系人电话',
+  `resident_type` int(1) NOT NULL DEFAULT 0 COMMENT '户口性质:1农村户口,2城镇户口',
+  `resident_place` varchar(255) NOT NULL DEFAULT '' COMMENT '户口所在地',
+  `graduate_school` varchar(255) NOT NULL DEFAULT '' COMMENT '毕业学校',
+  `graduate_day` int(11) NOT NULL DEFAULT 0 COMMENT '毕业日期',
+  `political` int(1) NOT NULL DEFAULT 1 COMMENT '政治面貌:1中共党员,2团员',
+  `marital_status` int(1) NOT NULL DEFAULT 1 COMMENT '婚姻状况:1未婚,2已婚,3离异',
+  `idcard` varchar(255) NOT NULL DEFAULT '' COMMENT '身份证',  
+  `education` varchar(255) NOT NULL DEFAULT '' COMMENT '学位',
+  `speciality` varchar(255) NOT NULL DEFAULT '' COMMENT '专业',
+  `social_account` varchar(255) NOT NULL DEFAULT '' COMMENT '社保账号',
+  `medical_account` varchar(255) NOT NULL DEFAULT '' COMMENT '医保账号',
+  `provident_account` varchar(255) NOT NULL DEFAULT '' COMMENT '公积金账号',
+  `bank_account` varchar(255) NOT NULL DEFAULT '' COMMENT '银行卡号',
+  `bank_info` varchar(255) NOT NULL DEFAULT '' COMMENT '开户行',
+  `file_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '档案附件',
+  `desc` mediumtext  NULL COMMENT '员工个人简介',
+  `is_hide` int(1) NOT NULL DEFAULT 0 COMMENT '是否隐藏联系方式:0否,1是',
+  `entry_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '员工入职日期',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '注册时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新信息时间',
+  `last_login_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '最后登录时间',
+  `login_num` int(11) NOT NULL DEFAULT 0 COMMENT '登录次数',
+  `last_login_ip` varchar(64) NOT NULL DEFAULT '' COMMENT '最后登录IP',
+  `is_lock` int(1) NOT NULL DEFAULT 0 COMMENT '是否锁屏:1是0否',
+  `auth_did` int(2) NOT NULL DEFAULT 0 COMMENT '数据权限类型:0仅自己关联的数据,1所属主部门的数据,2所属次部门的数据,3所属主次部门的数据,4所属主部门及其子部门数据,5所属次部门及其子部门数据,6所属主次部门及其子部门数据,7所属主部门所在顶级部门及其子部门数据,8所属次部门所在顶级部门及其子部门数据,9所属主次部门所在顶级部门及其子部门数据,10所有部门数据',
+  `auth_dids` varchar(500) NOT NULL DEFAULT '' COMMENT '可见部门数据',
+  `son_dids` varchar(500) NOT NULL DEFAULT '' COMMENT '可见子部门数据',
+  `status` int(1) NOT NULL DEFAULT 1 COMMENT '状态：-1待入职,0禁止登录,1正常,2离职',
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `id`(`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '员工表';
+
+-- ----------------------------
+-- Table structure for oa_admin_profiles
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_admin_profiles`;
+CREATE TABLE `oa_admin_profiles`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `admin_id` int(11) NOT NULL DEFAULT 0 COMMENT '员工ID',
+  `types` int(1) NOT NULL DEFAULT 0 COMMENT '类型:1教育经历/2工作经历/3相关证书/4计算机技能/5语言能力',
+  `title` varchar(255) NOT NULL DEFAULT '' COMMENT '院校/培训机构/公司名称/证书名称/技能名称/语言名称/',
+  `start_time` varchar(255) NOT NULL DEFAULT '' COMMENT '开始时间',
+  `end_time` varchar(255) NOT NULL DEFAULT '' COMMENT '结束时间',
+  `speciality` varchar(50) NOT NULL DEFAULT '' COMMENT '所学专业',
+  `education` varchar(50) NOT NULL DEFAULT '' COMMENT '所获学历',
+  `authority` varchar(50) NOT NULL DEFAULT '' COMMENT '颁发机构',
+  `position` varchar(50) NOT NULL DEFAULT '' COMMENT '职位',
+  `know` int(11) NOT NULL DEFAULT 0 COMMENT '熟悉程度',
+  `remark` mediumtext  NULL COMMENT '备注说明',
+  `sort` int(5) NOT NULL DEFAULT 0 COMMENT '排序',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '添加时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '修改时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '员工档案表';
+
+-- ----------------------------
+-- Table structure for oa_labor_contract
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_labor_contract`;
+CREATE TABLE `oa_labor_contract`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `renewal_pid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '续签母合同',
+  `change_pid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '变更母合同',
+  `uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '员工ID',
+  `cate` int(1) NOT NULL DEFAULT 1 COMMENT '合同类别:1劳动合同,2劳务合同,3保密协议',
+  `types` int(1) NOT NULL DEFAULT 1 COMMENT '合同类型:1新签合同,2续签合同,2变更合同',
+  `enterprise_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联企业主体ID',
+  `properties` int(1) NOT NULL DEFAULT 1 COMMENT '合同属性:1初级职称,2中级职称,3高级职称',
+  `code` varchar(255) NOT NULL DEFAULT '' COMMENT '合同编号',
+  `title` varchar(255) NOT NULL DEFAULT '' COMMENT '合同名称',
+  `sign_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '签订时间',
+  `start_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '生效时间',
+  `end_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '失效时间',
+  `secure_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '解除时间',
+  `trial_months` int(5) NOT NULL DEFAULT 0 COMMENT '试用月数',
+  `trial_end_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '试用结束时间',
+  `trial_salary` decimal(15, 2) NOT NULL DEFAULT 0.00 COMMENT '试用工资',
+  `worker_salary` decimal(15, 2) NOT NULL DEFAULT 0.00 COMMENT '转正工资',
+  `status` int(1) NOT NULL DEFAULT 1 COMMENT '合同状态:1正常,2已到期,3已解除',
+  `file_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '附件',
+  `remark` mediumtext  NULL COMMENT '备注说明',
+  `admin_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人ID',
+  `create_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '添加时间',
+  `update_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '修改时间',
+  `delete_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '员工合同表';
+
+-- ----------------------------
+-- Table structure for oa_admin_log
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_admin_log`;
+CREATE TABLE `oa_admin_log`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
+  `uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '用户ID',
+  `type` varchar(80) NOT NULL DEFAULT '' COMMENT '操作类型',
+  `action` varchar(80) NOT NULL DEFAULT '' COMMENT '操作动作',
+  `subject` varchar(80) NOT NULL DEFAULT '' COMMENT '操作主体',
+  `module` varchar(32) NOT NULL DEFAULT '' COMMENT '模块',
+  `controller` varchar(32) NOT NULL DEFAULT '' COMMENT '控制器',
+  `function` varchar(32) NOT NULL DEFAULT '' COMMENT '方法',
+  `ip` varchar(64) NOT NULL DEFAULT '' COMMENT '登录ip',
+  `param_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '操作数据id',
+  `param` mediumtext  NULL COMMENT '参数json格式',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '员工操作日志表';
+
+-- ----------------------------
+-- Table structure for oa_admin_module
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_admin_module`;
+CREATE TABLE `oa_admin_module`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(255) NOT NULL DEFAULT '' COMMENT '模块名称',
+  `name` varchar(255) NOT NULL DEFAULT '' COMMENT '模块目录，唯一，字母',
+  `desc` varchar(500) NOT NULL DEFAULT '' COMMENT '模块功能描述',
+  `type` int(2) NOT NULL DEFAULT 1 COMMENT '状态:1系统模块,2普通模块,3自定义模块',
+  `sourse` int(2) NOT NULL DEFAULT 1 COMMENT '来源:1官方,2第三方',
+  `status` int(1) NOT NULL DEFAULT 1 COMMENT '状态:0禁用,1正常',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '功能模块表';
+
+-- ----------------------------
+-- Records of oa_admin_module
+-- ----------------------------
+INSERT INTO `oa_admin_module` VALUES (1, '系统模块', 'home','', 1, 1,1, 1639562910, 0);
+INSERT INTO `oa_admin_module` VALUES (2, '人事模块', 'user','', 1, 1,1, 1639562910, 0);
+INSERT INTO `oa_admin_module` VALUES (3, '行政模块', 'adm','', 1, 1,1, 1639562910, 0);
+INSERT INTO `oa_admin_module` VALUES (4, '办公模块', 'office','', 1, 1,1, 1639562910, 0);
+INSERT INTO `oa_admin_module` VALUES (5, '财务模块', 'finance','', 1, 1,1, 1639562910, 0);
+INSERT INTO `oa_admin_module` VALUES (6, '客户模块', 'customer','', 2, 1,1, 1639562910, 0);
+INSERT INTO `oa_admin_module` VALUES (7, '合同模块', 'contract','', 2, 1,1, 1656142368, 0);
+INSERT INTO `oa_admin_module` VALUES (8, '项目模块', 'project','', 2, 1,1, 1656142368, 0);
+INSERT INTO `oa_admin_module` VALUES (9, '网盘模块', 'disk','', 2, 1,1, 1656143065, 0);
+
+-- ----------------------------
+-- Table structure for oa_admin_rule
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_admin_rule`;
+CREATE TABLE `oa_admin_rule`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `pid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '父id',
+  `src` varchar(255) NOT NULL DEFAULT '' COMMENT 'url链接',
+  `title` varchar(255) NOT NULL DEFAULT '' COMMENT '名称',
+  `name` varchar(255) NOT NULL DEFAULT '' COMMENT '日志操作名称',
+  `module` varchar(255) NOT NULL DEFAULT '' COMMENT '所属模块',
+  `icon` varchar(255) NOT NULL DEFAULT '' COMMENT '图标',
+  `menu` int(1) NOT NULL DEFAULT 0 COMMENT '是否是菜单,1是,2不是',
+  `sort` int(11) NOT NULL DEFAULT 1 COMMENT '越小越靠前',
+  `status` int(1) NOT NULL DEFAULT 1 COMMENT '状态,0禁用,1正常',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '菜单及权限表';
+
+-- ----------------------------
+-- Records of oa_admin_rule
+-- ----------------------------
+INSERT INTO `oa_admin_rule` VALUES (1, 0, '', '系统管理', '系统管理', 'home', 'icon-jichupeizhi', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (2, 0, '', '基础数据', '基础数据', 'base', 'icon-hetongshezhi', 1, 2, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (3, 0, '', '人事管理', '人事管理', 'user', 'icon-renshishezhi', 1, 3, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (4, 0, '', '行政办公', '行政办公', 'adm', 'icon-banjiguanli', 1, 4, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (5, 0, '', '个人办公', '个人办公', 'office', 'icon-kaoshijihua', 1, 5, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (6, 0, '', '财务管理', '财务管理', 'finance', 'icon-yuangongtidian', 1, 6, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (7, 0, '', '客户管理', '客户管理', 'customer', 'icon-kehuguanli', 1, 7, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (8, 0, '', '合同管理', '合同管理', 'contract', 'icon-hetongyidong', 1, 8, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (9, 0, '', '项目管理', '项目管理', 'project', 'icon-xiangmuguanli', 1, 9, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (10, 0, '', '知识网盘', '知识网盘', 'disk', 'icon-tikuguanli', 1, 10, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (11, 1, 'home/conf/index', '系统配置', '系统配置', 'home', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (12, 11, 'home/conf/add', '新建/编辑', '配置项', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (13, 11, 'home/conf/delete', '删除', '配置项', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (14, 11, 'home/conf/edit', '编辑', '配置详情', 'home', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (15, 1, 'home/module/index', '功能模块', '功能模块', 'home', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (16, 15, 'home/module/add', '新建/编辑', '功能模块', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (17, 15, 'home/module/del', '删除', '功能模块', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (18, 15, 'home/module/recovery', '恢复', '功能模块', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (19, 15, 'home/module/install', '安装', '功能模块', 'home', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (20, 1, 'home/dataauth/index', '模块配置', '模块配置', 'home', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (21, 20, 'home/dataauth/edit', '编辑', '模块配置', 'home', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (22, 1, 'home/rule/index', '功能节点', '功能节点', 'home', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (23, 22, 'home/rule/add', '新建/编辑', '功能节点', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (24, 22, 'home/rule/delete', '删除', '功能节点', 'home', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (25, 1, 'mobile/bar/datalist', '移动端配置', '移动端配置', 'home', '', 1, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (26, 25, 'mobile/bar/datalist', 'BAR菜单', 'BAR菜单', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (27, 26, 'mobile/bar/add', '新建/编辑', 'BAR菜单', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (28, 26, 'mobile/bar/set', '设置', 'BAR菜单', 'home', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (29, 25, 'mobile/types/datalist', '工作台菜单类型', '工作台菜单类型', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (30, 29, 'mobile/types/add', '新建/编辑', '工作台菜单类型', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (31, 29, 'mobile/types/del', '删除', '工作台菜单类型', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (32, 29, 'mobile/types/set', '设置', '工作台菜单类型', 'home', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (33, 25, 'mobile/menu/datalist', '工作台菜单', '工作台菜单', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (34, 33, 'mobile/menu/add', '新建/编辑', '工作台菜单', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (35, 33, 'mobile/menu/del', '删除', '工作台菜单', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (36, 33, 'mobile/menu/set', '设置', '工作台菜单', 'home', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (37, 1, 'home/role/index', '角色权限', '角色权限', 'home', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (38, 37, 'home/role/add', '新建/编辑', '角色权限', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (39, 37, 'home/role/delete', '删除', '角色权限', 'home', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (40, 1, 'home/log/index', '操作日志', '操作日志', 'home', '', 1, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (41, 1, 'home/files/index', '附件管理','附件管理', 'home', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (42, 41, 'home/files/edit', '编辑附件','附件', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (43, 41, 'home/files/move', '移动附件','附件', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (44, 41, 'home/files/delete', '删除附件','附件', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (45, 41, 'home/files/get_group', '附件分组','附件分组', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (46, 41, 'home/files/add_group', '新建/编辑','附件分组', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (47, 41, 'home/files/del_group', '删除附件分组','附件分组', 'home', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (48, 1, 'home/database/database', '备份数据', '数据备份', 'home', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (49, 48, 'home/database/backup', '备份数据表', '数据', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (50, 48, 'home/database/optimize', '优化数据表', '数据表', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (51, 48, 'home/database/repair', '修复数据表', '数据表', 'home', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (52, 1, 'home/database/backuplist', '还原数据', '数据还原', 'home', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (53, 52, 'home/database/import', '还原数据表', '数据', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (54, 52, 'home/database/downfile', '下载备份数据', '备份数据', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (55, 52, 'home/database/del', '删除备份数据', '备份数据', 'home', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (56, 1, 'home/task/index', '定时任务', '定时任务', 'home', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (57, 56, 'home/task/add', '新建/编辑', '定时任务', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (58, 56, 'home/task/delete', '删除', '定时任务', 'home', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (59, 2, '', '公共模块', '公共模块', 'home', '', 1, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (60, 59, 'home/template/datalist', '消息模板', '消息模板', 'home', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (61, 60, 'home/template/add', '新建/编辑', '消息模板', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (62, 60, 'home/template/set', '设置', '消息模板', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (63, 60, 'home/template/view', '查看', '消息模板', 'home', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (64, 59, 'adm/flow/modulelist', '审批模块', '审批模块', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (65, 64, 'adm/flow/module_add', '新建/编辑', '审批模块', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (66, 64, 'adm/flow/module_check', '设置', '审批模块', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (67, 59, 'adm/flow/catelist', '审批类型', '审批类型', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (68, 67, 'adm/flow/cate_add', '新建/编辑', '审批类型', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (69, 67, 'adm/flow/cate_check', '设置', '审批类型', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (70, 59, 'adm/flow/datalist', '审批流程', '审批流程', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (71, 70, 'adm/flow/add', '新建/编辑', '审批流程', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (72, 70, 'adm/flow/del', '删除', '审批流程', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (73, 70, 'adm/flow/check', '设置', '审批流程', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (74, 59, 'home/cate/enterprise', '企业主体', '企业主体', 'home', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (75, 74, 'home/cate/enterprise_add', '新建/编辑', '企业主体', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (76, 74, 'home/cate/enterprise_set', '设置', '企业主体', 'home', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (77, 59, 'home/area/datalist', '全国省市', '全国省市', 'home', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (78, 77, 'home/area/add', '新建/编辑', '全国省市', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (79, 77, 'home/area/set', '设置', '全国省市', 'home', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (80, 2, '', '人事模块', '人事模块', 'user', '', 1, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (81, 80, 'user/rewardscate/datalist', '奖罚项目', '奖罚项目', 'user', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (82, 81, 'user/rewardscate/add', '新建/编辑', '奖罚项目', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (83, 81, 'user/rewardscate/set', '设置', '奖罚项目', 'user', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (84, 80, 'user/carecate/datalist', '关怀项目', '关怀项目', 'user', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (85, 84, 'user/carecate/add', '新建/编辑', '关怀项目', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (86, 84, 'user/carecate/set', '设置', '关怀项目', 'user', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (87, 80, 'user/basic/datalist', '常规数据', '常规数据', 'user', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (88, 87, 'user/basic/add', '新建/编辑', '常规数据', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (89, 87, 'user/basic/set', '设置', '常规数据', 'user', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (90, 3, 'user/department/index', '部门架构', '部门', 'user', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (91, 90, 'user/department/add', '新建/编辑', '部门', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (92, 90, 'user/department/delete', '删除', '部门', 'user', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (93, 3, 'user/position/index', '岗位职称', '岗位职称', 'user', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (94, 93, 'user/position/add', '新建/编辑', '岗位职称', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (95, 93, 'user/position/delete', '删除', '岗位职称', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (96, 93, 'user/position/view', '查看', '岗位职称', 'user', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (97, 3, 'user/user/index', '企业员工', '员工', 'user', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (98, 97, 'user/user/add', '新建/编辑', '员工', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (99, 97, 'user/user/view', '查看', '员工信息', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (100, 97, 'user/user/set', '设置', '员工状态', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (101, 97, 'user/user/reset_psw', '重设密码', '员工密码', 'user', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (102, 3, 'user/files/datalist', '员工档案', '员工档案', 'user', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (103, 102, 'user/files/add', '编辑', '员工档案', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (104, 102, 'user/files/view', '查看', '员工档案', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (105, 102, 'user/files/set', '设置', '员工档案', 'user', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (106, 3, 'user/personal/change', '人事调动', '人事调动', 'user', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (107, 106, 'user/personal/change_add', '新建/编辑', '人事调动', 'user', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (108, 3, 'user/personal/leave', '离职档案', '离职档案', 'user', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (109, 108, 'user/personal/leave_add', '新建/编辑', '离职档案', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (110, 108, 'user/personal/leave_delete', '删除', '离职档案', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (111, 108, 'user/personal/leave_check', '资料交接', '离职资料', 'user', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (112, 3, 'user/rewards/datalist', '奖罚管理', '奖罚管理', 'user', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (113, 112, 'user/rewards/add', '新建/编辑', '奖罚管理', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (114, 112, 'user/rewards/view', '查看', '奖罚管理', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (115, 112, 'user/rewards/del', '删除', '奖罚管理', 'user', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (116, 3, 'user/care/datalist', '员工关怀', '员工关怀', 'user', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (117, 116, 'user/care/add', '新建/编辑', '员工关怀', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (118, 116, 'user/care/view', '查看', '员工关怀', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (119, 116, 'user/care/del', '删除', '员工关怀', 'user', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (120, 3, 'user/laborcontract/datalist', '员工合同', '员工合同', 'user', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (121, 120, 'user/laborcontract/add', '新建/编辑', '员工合同', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (122, 120, 'user/laborcontract/add_renewal', '续签', '员工合同', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (123, 120, 'user/laborcontract/add_change', '变更', '员工合同', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (124, 120, 'user/laborcontract/view', '查看', '员工合同', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (125, 120, 'user/laborcontract/del', '删除', '员工合同', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (126, 120, 'user/laborcontract/set', '设置', '员工合同', 'user', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (127, 2, '', '行政模块', '行政模块', 'adm', '', 1, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (128, 127, 'adm/propertycate/datalist', '资产分类', '资产分类', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (129, 128, 'adm/propertycate/add', '新建/编辑', '资产分类', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (130, 128, 'adm/propertycate/del', '删除', '资产分类', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (131, 127, 'adm/propertybrand/datalist', '资产品牌', '资产品牌', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (132, 131, 'adm/propertybrand/add', '新建/编辑', '资产品牌', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (133, 131, 'adm/propertybrand/check', '设置', '资产品牌', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (134, 127, 'adm/propertyunit/datalist', '资产单位', '资产单位', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (135, 134, 'adm/propertyunit/add', '新建/编辑', '资产单位', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (136, 134, 'adm/propertyunit/check', '设置', '资产单位', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (137, 127, 'adm/sealcate/datalist', '印章管理', '印章', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (138, 137, 'adm/sealcate/add', '新建/编辑', '印章', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (139, 137, 'adm/sealcate/check', '设置', '印章', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (140, 127, 'adm/basic/datalist', '常规数据', '常规数据', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (141, 140, 'adm/basic/add', '新建/编辑', '常规数据', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (142, 140, 'adm/basic/set', '设置', '常规数据', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (143, 4, '', '固定资产', '固定资产', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (144, 143, 'adm/property/datalist', '资产信息', '固定资产', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (145, 144, 'adm/property/add', '新建/编辑', '固定资产', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (146, 144, 'adm/property/check', '设置', '固定资产', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (147, 144, 'adm/property/view', '查看', '固定资产', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (148, 143, 'adm/property/repair_list', '报修记录', '资产报修记录', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (149, 148, 'adm/property/repair_add', '新建/编辑', '资产报修记录', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (150, 148, 'adm/property/repair_view', '查看', '资产报修记录', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (151, 148, 'adm/property/repair_del', '删除', '资产报修记录', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (152, 4, '', '车辆管理', '车辆', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (153, 152, 'adm/car/datalist', '车辆信息', '车辆', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (154, 153, 'adm/car/add', '新建/编辑', '车辆', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (155, 153, 'adm/car/check', '设置', '车辆', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (156, 153, 'adm/car/view', '查看', '车辆', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (157, 152, 'adm/car/repair_list', '车辆维修', '车辆维修记录', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (158, 157, 'adm/car/repair_add', '新建/编辑', '车辆维修记录', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (159, 157, 'adm/car/repair_view', '查看', '车辆维修记录', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (160, 157, 'adm/car/repair_del', '删除', '车辆维修记录', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (161, 152, 'adm/car/protect_list', '车辆保养', '车辆保养记录', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (162, 161, 'adm/car/protect_add', '新建/编辑', '车辆保养记录', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (163, 161, 'adm/car/protect_view', '查看', '车辆保养记录', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (164, 161, 'adm/car/protect_del', '删除', '车辆保养记录', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (165, 152, 'adm/car/mileage_list', '车辆里程', '车辆里程记录', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (166, 165, 'adm/car/mileage_add', '新建/编辑', '车辆里程记录', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (167, 165, 'adm/car/mileage_del', '删除', '车辆里程记录', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (168, 152, 'adm/car/fee_list', '车辆费用', '车辆费用记录', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (169, 168, 'adm/car/fee_add', '新建/编辑', '车辆费用记录', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (170, 168, 'adm/car/fee_view', '查看', '车辆费用记录', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (171, 168, 'adm/car/fee_del', '删除', '车辆费用记录', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (172, 4, '', '会议管理', '会议管理', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (173, 172, 'adm/meeting/room', '会议室管理', '会议室', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (174, 173, 'adm/meeting/room_add', '新建/编辑', '会议室', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (175, 173, 'adm/meeting/room_view', '查看', '会议纪要', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (176, 173, 'adm/meeting/room_check', '设置', '会议室', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (177, 172, 'adm/meeting/records', '会议记录', '会议记录', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (178, 177, 'adm/meeting/records_add', '新建/编辑', '会议记录', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (179, 177, 'adm/meeting/records_view', '查看', '会议纪要', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (180, 177, 'adm/meeting/records_del', '删除', '会议纪要', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (181, 4, '', '公文管理', '公文管理', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (182, 181, 'adm/official/datalist', '公文列表', '公文管理', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (183, 182, 'adm/official/add', '新建/编辑', '公文管理', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (184, 182, 'adm/official/view', '查看', '公文管理', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (185, 182, 'adm/official/del', '删除', '公文管理', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (186, 181, 'adm/official/pending', '待审公文', '公文管理', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (187, 181, 'adm/official/reviewed', '已审公文', '公文管理', 'adm', '', 1, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (188, 4, '', '用章管理', '用章管理', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (189, 188, 'adm/seal/datalist', '用章申请', '用章申请', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (190, 189, 'adm/seal/add', '新建/编辑', '用章申请', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (191, 189, 'adm/seal/view', '查看', '用章申请', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (192, 189, 'adm/seal/del', '删除', '用章申请', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (193, 188, 'adm/seal/record', '用章记录', '用章记录', 'adm', '', 1, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (194, 127, 'adm/notecate/datalist', '公告类型', '公告类型', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (195, 194, 'adm/notecate/add', '新建/编辑', '公告类型', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (196, 194, 'adm/notecate/set', '设置', '公告类型', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (197, 4, 'adm/note/datalist', '公告列表', '公告', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (198, 197, 'adm/note/add', '新建/编辑', '公告', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (199, 197, 'adm/note/del', '删除', '公告', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (200, 197, 'adm/note/view', '查看', '公告', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (201, 4, 'adm/news/datalist', '公司新闻', '公司新闻', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (202, 201, 'adm/news/add', '新建/编辑', '公司新闻', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (203, 201, 'adm/news/del', '删除', '公司新闻', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (204, 201, 'adm/news/view', '查看', '公司新闻', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (205, 5, 'oa/plan/datalist', '日程安排', '日程安排', 'oa', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (206, 205, 'oa/plan/add', '新建/编辑', '日程安排', 'oa', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (207, 205, 'oa/plan/view', '查看', '日程安排', 'oa', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (208, 205, 'oa/plan/del', '删除', '日程安排', 'oa', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (209, 5, 'oa/plan/calendar', '日程日历', '日程安排', 'oa', '', 1, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (210, 5, 'oa/schedule/datalist', '工作记录', '工作记录', 'oa', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (211, 210, 'oa/schedule/add', '新建/编辑', '工作记录', 'oa', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (212, 210, 'oa/schedule/view', '查看', '工作记录', 'oa', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (213, 210, 'oa/schedule/del', '删除', '工作记录', 'oa', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (214, 5, 'oa/schedule/calendar', '工作日历', '工作日历', 'oa', '', 1, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (215, 5, 'oa/work/datalist', '工作汇报', '工作汇报', 'oa', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (216, 215, 'oa/work/add', '新建/编辑', '工作汇报', 'oa', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (217, 215, 'oa/work/send', '发送', '工作汇报', 'oa', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (218, 215, 'oa/work/view', '查看', '工作汇报', 'oa', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (219, 215, 'oa/work/del', '删除', '工作汇报', 'oa', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (220, 5, 'oa/note/datalist', '公告通知', '公告通知', 'oa', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (221, 220, 'oa/note/view', '查看', '公告通知', 'oa', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (222, 5, 'oa/news/datalist', '公司新闻', '公司新闻', 'oa', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (223, 222, 'oa/news/view', '查看', '公司新闻', 'oa', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (224, 5, 'oa/meeting/datalist', '会议纪要', '会议纪要', 'oa', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (225, 224, 'oa/meeting/view', '查看', '会议纪要', 'oa', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (226, 2, '', '财务模块', '财务模块', 'finance', '', 1, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (227, 226, 'finance/expensecate/datalist', '报销类型', '报销类型', 'finance', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (228, 227, 'finance/expensecate/add', '新建/编辑', '报销类型', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (229, 227, 'finance/expensecate/set', '设置', '报销类型', 'finance', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (230, 226, 'finance/costcate/datalist', '费用类型', '费用类型', 'finance', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (231, 230, 'finance/costcate/add', '新建/编辑', '费用类型', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (233, 230, 'finance/costcate/set', '设置', '费用类型', 'finance', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (234, 6, 'finance/expense/datalist', '报销管理', '报销', 'finance', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (235, 234, 'finance/expense/add', '新建/编辑', '报销', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (236, 234, 'finance/expense/del', '删除', '报销', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (237, 234, 'finance/expense/view', '查看', '报销', 'finance', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (238, 6, 'finance/invoice/datalist', '开票管理', '发票', 'finance', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (239, 238, 'finance/invoice/add', '新建/编辑', '发票', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (240, 238, 'finance/invoice/del', '删除', '发票', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (241, 238, 'finance/invoice/view', '查看', '发票', 'finance', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (242, 6, 'finance/ticket/datalist', '收票管理', '发票', 'finance', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (243, 242, 'finance/ticket/add', '新建/编辑', '发票', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (244, 242, 'finance/ticket/delete', '删除', '发票', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (245, 242, 'finance/ticket/view', '查看', '发票', 'finance', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (246, 6, 'finance/income/datalist', '回款管理', '回款记录', 'finance', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (247, 246, 'finance/income/add', '新建/编辑', '回款记录', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (248, 246, 'finance/income/view', '查看', '回款记录', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (249, 246, 'finance/income/del', '删除', '回款记录', 'finance', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (250, 6, 'finance/invoice/datalist_a', '无发票回款', '无发票回款', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (251, 250, 'finance/invoice/add_a', '新建/编辑', '无发票回款', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (252, 250, 'finance/invoice/del_a', '删除', '无发票回款', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (253, 250, 'finance/invoice/view_a', '查看', '无发票回款', 'finance', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (254, 6, 'finance/payment/datalist', '付款管理', '付款记录', 'finance', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (255, 254, 'finance/payment/add', '新建/编辑', '付款记录', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (256, 254, 'finance/payment/view', '查看', '付款记录', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (257, 254, 'finance/payment/del', '删除', '付款记录', 'finance', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (258, 6, 'finance/ticket/datalist_a', '无发票付款', '无发票付款', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (259, 258, 'finance/ticket/add_a', '新建/编辑', '无发票付款', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (260, 258, 'finance/ticket/del_a', '删除', '无发票付款', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (261, 258, 'finance/ticket/view_a', '查看', '无发票付款', 'finance', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (262, 6, '', '财务统计', '财务统计', 'finance', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (263, 262, 'finance/expense/record', '报销记录', '报销记录', 'finance', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (264, 262, 'finance/invoice/record', '开票记录', '开票记录', 'finance', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (265, 262, 'finance/ticket/record', '收票记录', '收票记录', 'finance', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (266, 262, 'finance/income/record', '回款记录', '回款记录', 'finance', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (267, 262, 'finance/payment/record', '付款记录', '付款记录', 'finance', '', 1, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (268, 2, '', '客户模块', '客户模块', 'customer', '', 1, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (269, 268, 'customer/industry/datalist', '行业类型', '行业类型', 'home', '', 1, 0, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (270, 269, 'customer/industry/add', '新建/编辑', '行业类型', 'home', '', 2, 0, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (271, 269, 'customer/industry/set', '设置', '行业类型', 'home', '', 2, 0, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (272, 268, 'customer/grade/datalist', '客户等级', '客户等级', 'customer', '', 1, 0, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (273, 272, 'customer/grade/add', '新建/编辑', '客户等级', 'customer', '', 2, 0, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (274, 272, 'customer/grade/set', '设置', '客户等级', 'customer', '', 2,0, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (275, 268, 'customer/source/datalist', '客户渠道', '客户渠道', 'customer', '', 1, 0, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (276, 275, 'customer/source/add', '新建/编辑', '客户渠道', 'customer', '', 2, 0, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (277, 275, 'customer/source/set', '设置', '客户渠道', 'customer', '', 2,0, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (278, 268, 'customer/basic/datalist', '常规数据', '常规数据', 'user', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (279, 278, 'customer/basic/add', '新建/编辑', '常规数据', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (280, 278, 'customer/basic/set', '设置', '常规数据', 'user', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (281, 7, 'customer/customer/datalist', '客户列表', '客户列表', 'customer', '', 1, 0, 1, 1556143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (282, 281, 'customer/customer/add', '新建/编辑', '客户', 'customer', '', 2, 0, 1, 1556143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (283, 281, 'customer/customer/view', '查看', '客户', 'customer', '', 2, 0, 1, 1556143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (284, 281, 'customer/customer/del', '删除', '客户', 'customer', '', 2, 0, 1, 1556143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (285, 7, 'customer/index/rush', '抢 客 宝', '抢客宝', 'customer', '', 1, 0, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (286, 7, 'customer/index/sea', '公海客户', '客户', 'customer', '', 1, 0, 1, 1556143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (287, 286, 'customer/index/to_get', '获取', '客户', 'customer', '', 2, 0, 1, 1556143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (288, 286, 'customer/index/to_divide', '分配客户', '客户', 'customer', '', 2, 0, 1, 1556143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (289, 286, 'customer/index/to_sea', '转入公海', '客户', 'customer', '', 2, 0, 1, 1556143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (290, 286, 'customer/index/to_trash', '转入废弃池', '客户', 'customer', '', 2, 0, 1, 1556143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (291, 286, 'customer/index/to_revert', '恢复客户', '客户', 'customer', '', 2, 0, 1, 1556143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (292, 7, 'customer/index/trash', '废弃客户', '客户', 'customer', '', 1, 0, 1, 1556143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (293, 7, 'customer/contact/datalist', '客户联系人', '联系人', 'customer', '', 1, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (294, 286, 'customer/contact/add', '新建/编辑', '联系人', 'customer', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (295, 286, 'customer/contact/del', '删除', '联系人', 'customer', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (296, 286, 'customer/contact/view', '查看', '客户联系人', 'customer', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (297, 7, 'customer/chance/datalist', '机会线索', '机会线索', 'customer', '', 1, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (298, 297, 'customer/chance/add', '新建/编辑', '机会线索', 'customer', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (299, 297, 'customer/chance/view', '查看', '机会线索', 'customer', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (300, 297, 'customer/chance/del', '删除', '机会线索', 'customer', '', 2, 0, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (301, 7, 'customer/trace/datalist', '跟进记录', '跟进记录', 'customer', '', 1, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (302, 301, 'customer/trace/add', '新建/编辑', '跟进记录', 'customer', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (303, 301, 'customer/trace/view', '查看', '跟进记录', 'customer', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (304, 301, 'customer/trace/del', '删除', '跟进记录', 'customer', '', 2, 0, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (305, 2, '', '合同模块', '合同模块', 'contract', '', 1, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (306, 305, 'contract/cate/datalist', '合同分类', '合同分类', 'contract', '', 1, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (307, 306, 'contract/cate/add', '新建/编辑', '合同分类', 'contract', '', 2, 1, 1, 0, 1656143065);
+INSERT INTO `oa_admin_rule` VALUES (308, 306, 'contract/cate/set', '设置', '合同分类', 'contract', '', 2, 1, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (309, 305, 'contract/productcate/datalist', '产品分类', '产品分类', 'contract', '', 1, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (310, 309, 'contract/productcate/add', '新建/编辑', '产品分类', 'contract', '', 2, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (311, 309, 'contract/productcate/del', '删除', '产品分类', 'contract', '', 2, 1, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (312, 305, 'contract/product/datalist', '产品列表', '产品', 'contract', '', 1, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (313, 312, 'contract/product/add', '新建/编辑', '产品', 'contract', '', 2, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (314, 312, 'contract/product/view', '查看', '产品', 'contract', '', 2, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (315, 312, 'contract/product/del', '删除', '产品', 'contract', '', 2, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (316, 312, 'contract/product/set', '设置', '产品', 'contract', '', 2, 1, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (317, 305, 'contract/services/datalist', '服务内容', '服务内容', 'contract', '', 1, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (318, 317, 'contract/services/add', '新建/编辑', '服务内容', 'contract', '', 2, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (319, 317, 'contract/services/set', '设置', '服务内容', 'contract', '', 2, 1, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (320, 305, 'contract/supplier/datalist', '供应商列表', '供应商', 'contract', '', 1, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (321, 320, 'contract/supplier/add', '新建/编辑', '供应商', 'contract', '', 2, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (322, 320, 'contract/supplier/set', '设置', '供应商', 'contract', '', 2, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (323, 320, 'contract/supplier/view', '查看', '供应商', 'contract', '', 2, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (324, 320, 'contract/supplier/del', '删除', '供应商', 'contract', '', 2, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (325, 320, 'contract/supplier/contact_add', '新建/编辑', '供应商联系人', 'contract', '', 2, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (326, 320, 'contract/supplier/contact_del', '删除', '供应商联系人', 'contract', '', 2, 1, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (327, 305, 'contract/purchasedcate/datalist', '采购品分类', '采购品分类', 'contract', '', 1, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (328, 327, 'contract/purchasedcate/add', '新建/编辑', '采购品分类', 'contract', '', 2, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (329, 327, 'contract/purchasedcate/del', '删除', '采购品分类', 'contract', '', 2, 1, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (330, 305, 'contract/purchased/datalist', '采购品列表', '采购品', 'contract', '', 1, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (331, 330, 'contract/purchased/add', '新建/编辑', '采购品', 'contract', '', 2, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (332, 330, 'contract/purchased/view', '查看', '采购品', 'contract', '', 2, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (333, 330, 'contract/purchased/del', '删除', '采购品', 'contract', '', 2, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (334, 330, 'contract/purchased/set', '设置', '采购品', 'contract', '', 2, 1, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (335, 8, 'contract/contract/datalist', '销售合同', '销售合同', 'contract', '', 1, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (336, 335, 'contract/contract/add', '新建/编辑', '合同', 'contract', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (337, 335, 'contract/contract/view', '查看', '合同', 'contract', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (338, 335, 'contract/contract/del', '删除', '合同', 'contract', '', 2, 0, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (339, 8, 'contract/purchase/datalist', '采购合同', '采购合同', 'contract', '', 1, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (340, 339, 'contract/purchase/add', '新建/编辑', '合同', 'contract', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (341, 339, 'contract/purchase/view', '查看', '合同', 'contract', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (342, 339, 'contract/purchase/del', '删除', '合同', 'contract', '', 2, 0, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (343, 8, 'contract/contract/archivelist', '合同归档', '合同归档', 'contract', '', 1, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (344, 343, 'contract/purchase/archivelist', '采购合同归档', '采购合同归档', 'contract', '', 2, 0, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (345, 8, 'contract/contract/stoplist', '中止合同', '中止合同', 'contract', '', 1, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (346, 345, 'contract/purchase/stoplist', '中止采购合同', '中止采购合同', 'contract', '', 2, 0, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (347, 8, 'contract/contract/voidlist', '作废合同', '作废合同', 'contract', '', 1, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (348, 347, 'contract/purchase/voidlist', '作废合同归档', '作废采购合同', 'contract', '', 2, 0, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (349, 2, '', '项目模块', '项目模块', 'project', '', 1, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (350, 349, 'project/step/datalist', '项目阶段', '项目阶段', 'project', '', 1, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (351, 350, 'project/step/add', '新建/编辑', '项目阶段', 'project', '', 2, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (352, 350, 'project/step/set', '设置', '项目阶段', 'project', '', 2, 1, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (353, 349, 'project/cate/datalist', '项目分类', '项目分类', 'project', '', 1, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (354, 353, 'project/cate/add', '新建/编辑', '项目分类', 'project', '', 2, 1, 1, 0, 1656143065);
+INSERT INTO `oa_admin_rule` VALUES (355, 353, 'project/cate/set', '设置', '项目分类', 'project', '', 2, 1, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (356, 349, 'project/work/datalist', '工作类别', '工作类别', 'project', '', 1, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (357, 356, 'project/work/add', '新建/编辑', '工作类别', 'project', '', 2, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (358, 356, 'project/work/set', '设置', '工作类别', 'project', '', 2, 1, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (359, 9, 'project/index/datalist', '项目列表', '项目', 'project', '', 1, 0, 1, 1656142368, 0);
+INSERT INTO `oa_admin_rule` VALUES (360, 359, 'project/index/add', '新建', '项目', 'project', '', 2, 0, 1, 1656142368, 0);
+INSERT INTO `oa_admin_rule` VALUES (361, 359, 'project/index/edit', '编辑', '项目', 'project', '', 2, 0, 1, 1656142368, 0);
+INSERT INTO `oa_admin_rule` VALUES (362, 359, 'project/index/view', '查看', '项目', 'project', '', 2, 0, 1, 1656142368, 0);
+INSERT INTO `oa_admin_rule` VALUES (363, 359, 'project/index/del', '删除', '项目', 'project', '', 2, 0, 1, 1656142368, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (364, 9, 'project/task/datalist', '任务列表', '任务', 'project', '', 1, 0, 1, 1656142368, 0);
+INSERT INTO `oa_admin_rule` VALUES (365, 364, 'project/task/add', '新建', '任务', 'project', '', 2, 0, 1, 1656142368, 0);
+INSERT INTO `oa_admin_rule` VALUES (366, 364, 'project/task/edit', '编辑', '任务', 'project', '', 2, 0, 1, 1656142368, 0);
+INSERT INTO `oa_admin_rule` VALUES (367, 364, 'project/task/view', '查看', '任务', 'project', '', 2, 0, 1, 1656142368, 0);
+INSERT INTO `oa_admin_rule` VALUES (368, 364, 'project/task/del', '删除', '任务', 'project', '', 2, 0, 1, 1656142368, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (369, 9, 'project/task/hour', '任务工时', '工时', 'project', '', 1, 0, 1, 1656142368, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (370, 9, 'project/document/datalist', '文档列表', '文档', 'project', '', 1, 0, 1, 1656142368, 0);
+INSERT INTO `oa_admin_rule` VALUES (371, 370, 'project/document/add', '新建/编辑', '文档', 'project', '', 2, 0, 1, 1656142368, 0);
+INSERT INTO `oa_admin_rule` VALUES (372, 370, 'project/document/view', '查看', '文档', 'project', '', 2, 0, 1, 1656142368, 0);
+INSERT INTO `oa_admin_rule` VALUES (373, 370, 'project/document/delete', '删除', '文档', 'project', '', 2, 0, 1, 1656142368, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (374, 10, 'disk/index/datalist', '个人文件', '个人文件', 'disk', '', 1, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (375, 374, 'disk/index/add_upload', '新增', '文件', 'disk', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (376, 374, 'disk/index/add_folder', '新增', '文件夹', 'disk', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (377, 374, 'disk/index/add_article', '新增/编辑', '在线文档', 'disk', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (378, 374, 'disk/index/view_article', '查看', '在线文档', 'disk', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (379, 374, 'disk/index/del', '删除', '文件/文件夹/在线文档', 'disk', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (380, 374, 'disk/index/rename', '重命名', '文件', 'disk', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (381, 374, 'disk/index/move', '移动', '文件', 'disk', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (382, 374, 'disk/index/share', '分享', '文件', 'disk', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (383, 374, 'disk/index/unshare', '取消分享', '文件', 'disk', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (384, 374, 'disk/index/star', '标星', '文件', 'disk', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (385, 374, 'disk/index/unstar', '取消标星', '文件', 'disk', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (386, 374, 'disk/index/back', '还原', '文件', 'disk', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (387, 374, 'disk/index/clear', '清除', '文件', 'disk', '', 2, 0, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (388, 10, 'disk/index/sharelist', '共享文件', '共享文件', 'disk', '', 1, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (389, 10, 'disk/index/clearlist', '回 收 站', '回收站文件', 'disk', '', 1, 0, 1, 1656143065, 0);
+
+
+-- ----------------------------
+-- Table structure for oa_admin_group
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_admin_group`;
+CREATE TABLE `oa_admin_group`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(255) NOT NULL DEFAULT '',
+  `status` int(1) NOT NULL DEFAULT 1,
+  `rules` mediumtext  NULL COMMENT '用户组拥有的规则id',
+  `layouts` mediumtext  NULL COMMENT '首页展示模块',
+  `mobile_bar` mediumtext  NULL COMMENT '手机端Bar',
+  `mobile_menu` mediumtext  NULL COMMENT '手机端工作台',
+  `desc` mediumtext  NULL COMMENT '备注',
+  `create_time` bigint(11) NOT NULL DEFAULT 0,
+  `update_time` bigint(11) NOT NULL DEFAULT 0,
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `id`(`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '员工权限分组表';
+
+-- ----------------------------
+-- Records of oa_admin_group
+-- ----------------------------
+INSERT INTO `oa_admin_group` VALUES (1, '超级权限角色', 1, '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389', '1,2,3,4,5,6,7,8,9,10,11,12','1,2,3,4,5','1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16','超级权限角色，拥有系统的最高权限，主要用于系统初始化数据而设，不可修改，不可删除。', 0, 0);
+INSERT INTO `oa_admin_group` VALUES (2, '管理岗角色', 1, '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389','1,2,3,4,5,6,7,8,9,10,11,12','1,2,3,4,5','1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16', '管理岗角色权限，可根据公司的具体需求调整。', 0, 0);
+INSERT INTO `oa_admin_group` VALUES (3, '业务岗角色', 1, '4,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,197,198,199,200,201,202,203,204,5,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,6,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,7,281,282,283,284,285,286,287,288,289,290,291,294,295,296,292,293,297,298,299,300,301,302,303,304,8,335,336,337,338,339,340,341,342,343,344,345,346,347,348,9,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,10,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389','1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16','1,2,3,4,5','1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16', '业务岗角色权限，可根据公司的具体需求调整。', 0, 0);
+
+-- ----------------------------
+-- Table structure for oa_data_auth
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_data_auth`;
+CREATE TABLE `oa_data_auth`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(255) NOT NULL DEFAULT '' COMMENT '权限名称',
+  `name` varchar(255) NOT NULL DEFAULT '' COMMENT '权限标识唯一，字母',
+  `desc` mediumtext  NULL COMMENT '备注描述',
+  `module` varchar(255) NOT NULL DEFAULT '' COMMENT '所属模块，唯一，字母',
+  `uids` mediumtext  NULL COMMENT '权限用户，1,2,3',
+  `conf_1` mediumtext  NULL COMMENT '配置字段1，可作为预配置内容',
+  `conf_2` mediumtext  NULL COMMENT '配置字段2，可作为预配置内容',
+  `conf_3` mediumtext  NULL COMMENT '配置字段3，可作为预配置内容',
+  `conf_4` mediumtext  NULL COMMENT '配置字段4，可作为预配置内容',
+  `conf_5` mediumtext  NULL COMMENT '配置字段5，可作为预配置内容',
+  `conf_6` mediumtext  NULL COMMENT '配置字段6，可作为预配置内容',
+  `conf_7` mediumtext  NULL COMMENT '配置字段7，可作为预配置内容',
+  `conf_8` mediumtext  NULL COMMENT '配置字段8，可作为预配置内容',
+  `conf_9` mediumtext  NULL COMMENT '配置字段9，可作为预配置内容',
+  `conf_10` mediumtext  NULL COMMENT '配置字段9，可作为预配置内容',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '数据权限表';
+
+-- ----------------------------
+-- Records of  oa_data_auth
+-- ----------------------------
+INSERT INTO `oa_data_auth` VALUES (1, '日常办公', 'office_admin', '日常办公相关数据权限配置。', 'office', '', '', '3', '', '', '', '', '', '', '', '', 1656143065, 1724830718);
+INSERT INTO `oa_data_auth` VALUES (2, '财务模块', 'finance_admin', '财务到账相关数据权限配置。', 'finance', '', '', '', '', '', '', '', '', '', '', '', 1656143065, 0);
+INSERT INTO `oa_data_auth` VALUES (3, '客户模块', 'customer_admin', '客户模块相关数据权限配置。', 'customer', '', '', '10', '100', '', '', '', '', '', '', '', 1656143065, 1724830738);
+INSERT INTO `oa_data_auth` VALUES (4, '合同模块', 'contract_admin', '合同模块相关数据权限配置。', 'contract', '', '', '1', '1', '1', '1', '1', '1', '', '', '30', 1656143065, 1724830772);
+INSERT INTO `oa_data_auth` VALUES (5, '项目模块', 'project_admin', '项目模块相关数据权限配置。', 'project', '', '', '', '', '', '', '', '', '', '', '3', 1656143065, 0);
+
+-- ----------------------------
+-- Table structure for oa_config
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_config`;
+CREATE TABLE `oa_config`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(255) NOT NULL DEFAULT '' COMMENT '配置名称',
+  `name` varchar(255) NOT NULL DEFAULT '' COMMENT '配置标识',
+  `content` mediumtext  NULL COMMENT '配置内容',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '系统配置表';
+
+-- ----------------------------
+-- Records of oa_config
+-- ----------------------------
+INSERT INTO `oa_config`VALUES (1, '信息配置', 'web', 'a:10:{s:2:\"id\";s:1:\"1\";s:11:\"admin_title\";s:8:\"勾股OA\";s:6:\"domain\";s:24:\"https://www.gougucms.com\";s:3:\"icp\";s:21:\"粤ICP备xxxxxxx号-1\";s:4:\"logo\";s:31:\"/static/home/images/syslogo.png\";s:4:\"file\";s:0:\"\";s:10:\"small_logo\";s:37:\"/static/home/images/syslogo_small.png\";s:5:\"beian\";s:27:\"粤公网安备xxxxxxx号-1\";s:8:\"keywords\";s:8:\"勾股OA\";s:4:\"desc\";s:565:\"勾股办公是一款基于ThinkPHP6 + Layui + MySql打造的，简单实用的开源免费的企业办公系统框架。系统集成了系统设置、基础数据、人事管理、消息管理、审批管理、行政办公、个人办公、客户管理、合同管理、项目管理、财务管理、知识网盘等模块。系统简约，易于功能扩展，方便二次开发，让开发者更专注于业务深度需求的开发，帮助开发者简单高效降低二次开发成本，通过二次开发之后可以用来做CRM，ERP，业务管理等系统。\";}', 1, 1612514630, 1724823769);
+INSERT INTO `oa_config`VALUES (2, '系统配置', 'system', 'a:8:{s:9:\"menu_mode\";s:9:\"classical\";s:19:\"upload_max_filesize\";s:2:\"50\";s:9:\"msg_sound\";s:1:\"1\";s:9:\"watermark\";s:1:\"1\";s:6:\"qrcode\";s:1:\"2\";s:7:\"version\";s:5:\"5.0.2\";s:9:\"copyright\";s:24:\"© 2021-2024 gouguoa.com\";s:2:\"id\";s:1:\"2\";}', 1, 1612514630, 1724824879);
+INSERT INTO `oa_config`VALUES (3, '邮箱配置', 'email', 'a:8:{s:2:\"id\";s:1:\"2\";s:4:\"smtp\";s:11:\"smtp.qq.com\";s:9:\"smtp_port\";s:3:\"465\";s:9:\"smtp_user\";s:15:\"gougucms@qq.com\";s:8:\"smtp_pwd\";s:6:\"123456\";s:4:\"from\";s:24:\"勾股CMS系统管理员\";s:5:\"email\";s:18:\"admin@gougucms.com\";s:8:\"template\";s:485:\"<p>勾股办公是一款基于ThinkPHP6 + Layui + MySql打造的，简单实用的开源免费的企业办公系统框架。系统集成了系统设置、人事管理模块、消息管理模块、日常办公、财务管理等基础模块。系统简约，易于功能扩展，方便二次开发，让开发者更专注于业务深度需求的开发，帮助开发者简单高效降低二次开发成本，通过二次开发之后可以用来做CRM，ERP，业务管理等系统。</p>\";}', 1, 1612521657, 1637075205);
+INSERT INTO `oa_config`VALUES (4, 'Api Token配置', 'token', 'a:5:{s:2:\"id\";s:1:\"3\";s:3:\"iss\";s:15:\"oa.gougucms.com\";s:3:\"aud\";s:7:\"gouguoa\";s:7:\"secrect\";s:7:\"GOUGUOA\";s:7:\"exptime\";s:4:\"3600\";}', 1, 1627313142, 1638010233);
+INSERT INTO `oa_config`VALUES (5, '其他配置', 'other', 'a:3:{s:2:\"id\";s:1:\"5\";s:6:\"author\";s:15:\"勾股工作室\";s:7:\"version\";s:13:\"v1.2024.08.28\";}', 1, 1613725791, 1724824410);
+
+-- ----------------------------
+-- Table structure for oa_timing_task
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_timing_task`;
+CREATE TABLE `oa_timing_task`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(255) NOT NULL DEFAULT '' COMMENT '任务名称',
+  `name` varchar(255) NOT NULL DEFAULT '' COMMENT '任务标识，唯一',
+  `link` varchar(255) NOT NULL DEFAULT '' COMMENT '执行链接',
+  `types` int(2) NOT NULL DEFAULT 3 COMMENT '状态:1系统任务,2普通任务,3自定义任务',
+  `desc` varchar(500) NOT NULL DEFAULT '' COMMENT '任务描述',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '定时任务表';
+
+-- ----------------------------
+-- Table structure for oa_department
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_department`;
+CREATE TABLE `oa_department`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '部门名称',
+  `pid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '上级部门id',
+  `leader_ids` varchar(500) NULL DEFAULT '' COMMENT '部门负责人ids',
+  `phone` varchar(60) NOT NULL DEFAULT '' COMMENT '部门联系电话',
+  `sort` int(11) NOT NULL DEFAULT 0 COMMENT '排序：越大越靠前',
+  `remark` varchar(1000) NULL DEFAULT '' COMMENT '备注',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '部门组织';
+
+-- ----------------------------
+-- Records of oa_department
+-- ----------------------------
+INSERT INTO `oa_department`(`id`, `title`, `pid`) VALUES (1, '董事会', 0);
+INSERT INTO `oa_department`(`id`, `title`, `pid`) VALUES (2, '人事部', 1);
+INSERT INTO `oa_department`(`id`, `title`, `pid`) VALUES (3, '财务部', 1);
+INSERT INTO `oa_department`(`id`, `title`, `pid`) VALUES (4, '市场部', 1);
+INSERT INTO `oa_department`(`id`, `title`, `pid`) VALUES (5, '销售部', 1);
+INSERT INTO `oa_department`(`id`, `title`, `pid`) VALUES (6, '技术部', 1);
+INSERT INTO `oa_department`(`id`, `title`, `pid`) VALUES (7, '客服部', 1);
+INSERT INTO `oa_department`(`id`, `title`, `pid`) VALUES (8, '销售一部', 5);
+INSERT INTO `oa_department`(`id`, `title`, `pid`) VALUES (9, '销售二部', 5);
+INSERT INTO `oa_department`(`id`, `title`, `pid`) VALUES (10, '销售三部', 5);
+INSERT INTO `oa_department`(`id`, `title`, `pid`) VALUES (11, '产品部', 6);
+INSERT INTO `oa_department`(`id`, `title`, `pid`) VALUES (12, '设计部', 6);
+INSERT INTO `oa_department`(`id`, `title`, `pid`) VALUES (13, '研发部', 6);
+INSERT INTO `oa_department`(`id`, `title`, `pid`) VALUES (14, '客服一部', 7);
+INSERT INTO `oa_department`(`id`, `title`, `pid`) VALUES (15, '客服二部', 7);
+
+-- ----------------------------
+-- Table structure for oa_department_admin
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_department_admin`;
+CREATE TABLE `oa_department_admin`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `admin_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '员工ID',
+  `department_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '部门ID',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '次要部门人员关联表';
+
+-- ----------------------------
+-- Table structure for oa_department_change
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_department_change`;
+CREATE TABLE `oa_department_change`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '员工ID',
+  `from_did` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '原部门id',
+  `to_did` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '调到部门id',
+  `remark` varchar(1000) NULL DEFAULT '' COMMENT '备注',
+  `admin_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `move_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '调动时间',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '人事调动部门记录表';
+
+-- ----------------------------
+-- Table structure for oa_personal_quit
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_personal_quit`;
+CREATE TABLE `oa_personal_quit`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '用户ID',
+  `remark` varchar(1000) NULL DEFAULT '' COMMENT '备注',
+  `admin_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人',
+  `lead_admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '部门负责人',
+  `connect_id` int(11) NOT NULL DEFAULT 0 COMMENT '资料交接人',
+  `connect_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '资料交接时间',
+  `connect_uids` varchar(100) NOT NULL DEFAULT '' COMMENT '参与交接人,可多个',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `quit_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '离职时间',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '人事离职记录表';
+
+-- ----------------------------
+-- Table structure for oa_file_group
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_file_group`;
+CREATE TABLE `oa_file_group`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(255) NOT NULL DEFAULT '' COMMENT '分组名',
+  `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '文件分组表';
+
+-- ----------------------------
+-- Table structure for oa_file
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_file`;
+CREATE TABLE `oa_file`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `module` varchar(15) NOT NULL DEFAULT '' COMMENT '所属模块',
+  `sha1` varchar(60) NOT NULL COMMENT 'sha1',
+  `md5` varchar(60) NOT NULL COMMENT 'md5',
+  `name` varchar(255) NOT NULL DEFAULT '' COMMENT '原始文件名',
+  `filename` varchar(255) NOT NULL DEFAULT '' COMMENT '文件名',
+  `filepath` varchar(255) NOT NULL DEFAULT '' COMMENT '文件路径+文件名',
+  `filesize` int(10) NOT NULL DEFAULT 0 COMMENT '文件大小',
+  `fileext` varchar(10) NOT NULL DEFAULT '' COMMENT '文件后缀',
+  `mimetype` varchar(100) NOT NULL DEFAULT '' COMMENT '文件类型',
+  `group_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '文件分组ID',
+  `user_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '上传会员ID',
+  `uploadip` varchar(15) NOT NULL DEFAULT '' COMMENT '上传IP',
+  `status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '0未审核1已审核-1不通过',
+  `create_time` bigint(11) NOT NULL DEFAULT 0,
+  `admin_id` int(11) NOT NULL COMMENT '审核者id',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  `audit_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '审核时间',
+  `action` varchar(50) NOT NULL DEFAULT '' COMMENT '来源模块功能',
+  `use` varchar(255) NULL DEFAULT NULL COMMENT '用处',
+  `download` int(11) NOT NULL DEFAULT 0 COMMENT '下载量',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '文件表';
+
+-- ----------------------------
+-- Records of oa_file
+-- ----------------------------
+INSERT INTO `oa_file` VALUES (1, 'admin', '5125347886f07f48f7003825660117039eb8784f', '563e5e8f48e607ed54461796b0cb4844', 'f95982689eb222b84e999122a50b3780.jpg.jpg', 'f95982689eb222b84e999122a50b3780.jpg', 'https://blog.gougucms.com/storage/202202/f95982689eb222b84e999122a50b3780.jpg', 62609, 'jpg', 'image/jpeg', 0, 1, '127.0.0.1', 1, 1645057433, 1, 0, 1645057433, 'upload', 'thumb', 0);
+INSERT INTO `oa_file` VALUES (2, 'admin', '5125347886f07f48f7003825660117039eb8784f', '563e5e8f48e607ed54461796b0cb4844', 'e729477de18e3be7e7eb4ec7fe2f821e.jpg', 'e729477de18e3be7e7eb4ec7fe2f821e.jpg', 'https://blog.gougucms.com/storage/202202/e729477de18e3be7e7eb4ec7fe2f821e.jpg', 62609, 'jpg', 'image/jpeg', 0, 1, '127.0.0.1', 1, 1645057433, 1, 0, 1645057433, 'upload', 'thumb', 0);
+INSERT INTO `oa_file` VALUES (3, 'admin', '5125347886f07f48f7003825660117039eb8784f', '563e5e8f48e607ed54461796b0cb4844', '1193f7a1585b9f6e8a97ae17718018b3.jpg', 'images/1193f7a1585b9f6e8a97ae17718018b3.jpg', 'https://blog.gougucms.com/storage/202204/1193f7a1585b9f6e8a97ae17718018b3.jpg', 62609, 'jpg', 'image/jpeg', 0, 1, '127.0.0.1', 1, 1645057433, 1, 0, 1645057433, 'upload', 'thumb', 0);
+INSERT INTO `oa_file` VALUES (4, 'admin', '5125347886f07f48f7003825660117039eb8784f', '563e5e8f48e607ed54461796b0cb4844', '0f22a5ba4797b2fa22049ea73e6f779c.jpg', 'images/0f22a5ba4797b2fa22049ea73e6f779c.jpg', 'https://blog.gougucms.com/storage/202202/0f22a5ba4797b2fa22049ea73e6f779c.jpg', 62609, 'jpg', 'image/jpeg', 0, 1, '127.0.0.1', 1, 1645057433, 1, 0, 1645057433, 'upload', 'thumb', 0);
+
+-- ----------------------------
+-- Table structure for oa_enterprise
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_enterprise`;
+CREATE TABLE `oa_enterprise`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '企业名称',
+  `city` varchar(60) NOT NULL DEFAULT '' COMMENT '所在城市',
+  `bank` varchar(60) NOT NULL DEFAULT '' COMMENT '开户银行',
+  `bank_sn` varchar(60) NOT NULL DEFAULT '' COMMENT '银行帐号',
+  `tax_num` varchar(100) NOT NULL DEFAULT '' COMMENT '纳税人识别号',
+  `phone` varchar(20) NOT NULL DEFAULT '' COMMENT '开票电话',
+  `address` varchar(200) NOT NULL DEFAULT '' COMMENT '开票地址',
+  `remark` varchar(500) NOT NULL DEFAULT '' COMMENT '备注说明',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '企业主体';
+
+-- ----------------------------
+-- Records of oa_enterprise
+-- ----------------------------
+INSERT INTO `oa_enterprise` VALUES (1, '勾股信息科技有限公司','广州','','','','','','', 1, 1638006751, 0);
+
+-- ----------------------------
+-- Table structure for oa_template
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_template`;
+CREATE TABLE `oa_template`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(255) NOT NULL DEFAULT '' COMMENT '消息模板名称',
+  `name` varchar(255) NOT NULL DEFAULT '' COMMENT '权限标识唯一，字母',
+  `types` tinyint(1) NOT NULL DEFAULT 1 COMMENT '类型:1普通消息,2审批消息',
+  `check_types` int(11) NOT NULL DEFAULT 0 COMMENT '审批类型:0',
+  `remark` varchar(500) NOT NULL DEFAULT '' COMMENT '备注描述，使用场景等',
+  `msg_link` varchar(255) NOT NULL DEFAULT '' COMMENT '消息模板链接(审批申请)',
+  `msg_title_0` varchar(255) NOT NULL DEFAULT '' COMMENT '消息模板标题(审批申请)',
+  `msg_content_0` varchar(500) NOT NULL DEFAULT '' COMMENT '消息模板内容(审批申请)',
+  `msg_title_1` varchar(255) NOT NULL DEFAULT '' COMMENT '消息模板标题(审批通过)',
+  `msg_content_1` varchar(500) NOT NULL DEFAULT '' COMMENT '消息模板内容(审批通过)',
+  `msg_title_2` varchar(255) NOT NULL DEFAULT '' COMMENT '消息模板标题(审批拒绝)',
+  `msg_content_2` varchar(500) NOT NULL DEFAULT '' COMMENT '消息模板内容(审批拒绝)',
+  `email_link` varchar(255) NOT NULL DEFAULT '' COMMENT '邮箱消息模板链接',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `admin_id` int(11) NOT NULL DEFAULT 0 COMMENT  '创建人',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '消息模板表';
+
+-- ----------------------------
+-- Records of oa_template
+-- ----------------------------
+INSERT INTO `oa_template` VALUES (1, '公告通知', 'note', 1, 0, '', '/adm/note/view/id/{action_id}', '{from_user}发了一个新『公告』，请及时查看', '您有一个新公告：{title}。', '', '', '', '', '', 1, 1, 1733312491, 1733314809, 0);
+INSERT INTO `oa_template` VALUES (2, '请假审批', 'leaves', 2, 0, '', '/home/leaves/view/id/{action_id}', '{from_user}提交了一个『请假申请』，请及时审批', '您有一个新的『请假申请』需要处理。', '您提交的『请假申请』已被审批通过。', '您在{create_time}提交的『请假申请』已于{date}被审批通过。', '您提交的『请假申请』已被驳回拒绝。', '您在{create_time}提交的『请假申请』已于{date}被驳回拒绝。', '', 1, 1, 1733312616, 1733314814, 0);
+INSERT INTO `oa_template` VALUES (3, '出差审批', 'trips', 2, 0, '', '/home/trips/view/id/{action_id}', '{from_user}提交了一个『出差申请』，请及时审批', '您有一个新的『出差申请』需要处理。', '您提交的『出差申请』已被审批通过。', '您在{create_time}提交的『出差申请』已于{date}被审批通过。', '您提交的『出差申请』已被驳回拒绝。', '您在{create_time}提交的『出差申请』已于{date}被驳回拒绝。', '', 1, 1, 1733312725, 1733314819, 0);
+INSERT INTO `oa_template` VALUES (4, '外出审批', 'outs', 2, 0, '', '/home/outs/view/id/{action_id}', '{from_user}提交了一个『外出申请』，请及时审批', '您有一个新的『外出申请』需要处理。', '您提交的『外出申请』已被审批通过。', '您在{create_time}提交的『外出申请』已于{date}被审批通过。', '您提交的『外出申请』已被驳回拒绝。', '您在{create_time}提交的『外出申请』已于{date}被驳回拒绝。', '', 1, 1, 1733312801, 1733314824, 0);
+INSERT INTO `oa_template` VALUES (5, '加班审批', 'overtimes', 2, 0, '', '/home/overtimes/view/id/{action_id}', '{from_user}提交了一个『加班申请』，请及时审批', '您有一个新的『加班申请』需要处理。', '您提交的『加班申请』已被审批通过。', '您在{create_time}提交的『加班申请』已于{date}被审批通过。', '您提交的『加班申请』已被驳回拒绝。', '您在{create_time}提交的『加班申请』已于{date}被驳回拒绝。', '', 1, 1, 1733312801, 1733314828, 0);
+INSERT INTO `oa_template` VALUES (6, '用章审批', 'seal', 2, 0, '', '/adm/seal/view/id/{action_id}', '{from_user}提交了一个『用章申请』，请及时审批', '您有一个新的『用章申请』需要处理。', '您提交的『公文申请』已被审批通过。', '您在{create_time}提交的『公文申请』已于{date}被审批通过。', '您提交的『用章申请』已被驳回拒绝。', '您在{create_time}提交的『用章申请』已于{date}被驳回拒绝。', '', 1, 1, 1733313018, 1733314834, 0);
+INSERT INTO `oa_template` VALUES (7, '公文审批', 'official', 2, 0, '', '/adm/official/view/id/{action_id}', '{from_user}提交了一个『公文申请』，请及时审批', '您有一个新的『公文申请』需要处理。', '您提交的『公文申请』已被审批通过', '您在{create_time}提交的『公文申请』已于{date}被审批通过。', '您提交的『公文申请』已被驳回拒绝', '您在{create_time}提交的『公文申请』已于{date}被驳回拒绝。', '', 1, 1, 1733313078, 1733313262, 0);
+INSERT INTO `oa_template` VALUES (8, '报销审批', 'expense', 2, 0, '', '/finance/expense/view/id/{action_id}', '{from_user}提交了一个『报销申请』，请及时审批', '您有一个新的『报销申请』需要处理。', '您提交的『报销申请』已被审批通过', '您在{create_time}提交的『报销申请』已于{date}被审批通过。', '您提交的『报销申请』已被驳回拒绝', '您在{create_time}提交的『报销申请』已于{date}被驳回拒绝。', '', 1, 1, 1733313169, 1733313253, 0);
+INSERT INTO `oa_template` VALUES (9, '发票审批', 'invoice', 2, 0, '', '/finance/invoice/view/id/{action_id}', '{from_user}提交了一个『发票申请』，请及时审批', '您有一个新的『发票申请』需要处理。', '您提交的『发票申请』已被审批通过', '您在{create_time}提交的『发票申请』已于{date}被审批通过。', '您提交的『发票申请』已被驳回拒绝', '您在{create_time}提交的『发票申请』已于{date}被驳回拒绝。', '', 1, 1, 1733313245, 0, 0);
+INSERT INTO `oa_template` VALUES (10, '收票审批', 'ticket', 2, 0, '', '/finance/ticket/view/id/{action_id}', '{from_user}提交了一个『收票申请』，请及时审批', '您有一个新的『收票申请』需要处理。', '您提交的『收票申请』已被审批通过', '您在{create_time}提交的『收票申请』已于{date}被审批通过。', '您提交的『收票申请』已被驳回拒绝', '您在{create_time}提交的『收票申请』已于{date}被驳回拒绝。', '', 1, 1, 1733313341, 0, 0);
+INSERT INTO `oa_template` VALUES (11, '无发票回款审批', 'invoicea', 2, 0, '', '/finance/invoice/view_a/id/{action_id}', '{from_user}提交了一个『无发票回款申请』，请及时审批', '您有一个新的『无发票回款申请』需要处理。', '您提交的『无发票回款申请』已被审批通过', '您在{create_time}提交的『无发票回款申请』已于{date}被审批通过。', '您提交的『无发票回款申请』已被驳回拒绝', '您在{create_time}提交的『无发票回款申请』已于{date}被驳回拒绝。', '', 1, 1, 1733314549, 0, 0);
+INSERT INTO `oa_template` VALUES (12, '无发票付款审批', 'ticketa', 2, 0, '', '/finance/ticket/view_a/id/{action_id}', '{from_user}提交了一个『无发票付款申请』，请及时审批', '您有一个新的『无发票付款申请』需要处理。', '您提交的『无发票付款申请』已被审批通过', '您在{create_time}提交的『无发票付款申请』已于{date}被审批通过。', '您提交的『无发票付款申请』已被驳回拒绝', '您在{create_time}提交的『无发票付款申请』已于{date}被驳回拒绝。', '', 1, 1, 1733314607, 0, 0);
+INSERT INTO `oa_template` VALUES (13, '销售合同审批', 'contract', 2, 0, '', '/contract/contract/view/id/{action_id}', '{from_user}提交了一个『销售合同审批』，请及时审批', '您有一个新的『销售合同审批』需要处理。', '您提交的『销售合同审批』已被审批通过', '您在{create_time}提交的『销售合同审批』已于{date}被审批通过。', '您提交的『销售合同审批』已被驳回拒绝', '您在{create_time}提交的『销售合同审批』已于{date}被驳回拒绝。', '', 1, 1, 1733314701, 0, 0);
+INSERT INTO `oa_template` VALUES (14, '采购合同审批', 'purchase', 2, 0, '', '/contract/purchase/view/id/{action_id}', '{from_user}提交了一个『采购合同审批』，请及时审批', '您有一个新的『采购合同审批』需要处理。', '您提交的『采购合同审批』已被审批通过', '您在{create_time}提交的『采购合同审批』已于{date}被审批通过。', '您提交的『采购合同审批』已被驳回拒绝', '您在{create_time}提交的『采购合同审批』已于{date}被驳回拒绝。', '', 1, 1, 1733314789, 0, 0);
+
+-- ----------------------------
+-- Table structure for oa_industry
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_industry`;
+CREATE TABLE `oa_industry`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '行业名称',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '行业';
+
+-- ----------------------------
+-- Records of oa_industry
+-- ----------------------------
+INSERT INTO `oa_industry` VALUES (1, '工业品企业', 1, 1637987189, 0);
+INSERT INTO `oa_industry` VALUES (2, '互联网企业', 1, 1637987199, 0);
+INSERT INTO `oa_industry` VALUES (3, '服务行业', 1, 1637987199, 0);
+INSERT INTO `oa_industry` VALUES (4, '消费品企业', 1, 1637987199, 0);
+INSERT INTO `oa_industry` VALUES (5, '原材料企业', 1, 1637987199, 0);
+INSERT INTO `oa_industry` VALUES (6, '农业企业', 1, 1637987199, 0);
+INSERT INTO `oa_industry` VALUES (7, '科技企业', 1, 1637987199, 0);
+INSERT INTO `oa_industry` VALUES (8, '其他行业', 1, 1637987199, 0);
+
+-- ----------------------------
+-- Table structure for oa_rewards_cate
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_rewards_cate`;
+CREATE TABLE `oa_rewards_cate`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '奖罚项目名称',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `create_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '奖罚项目';
+
+-- ----------------------------
+-- Records of oa_rewards_cate
+-- ----------------------------
+INSERT INTO `oa_rewards_cate` VALUES (1, '生日福利', 1, 1637987189, 0);
+INSERT INTO `oa_rewards_cate` VALUES (2, '节日福利', 1, 1637987199, 0);
+INSERT INTO `oa_rewards_cate` VALUES (3, '迟到扣款', 1, 1638088518, 0);
+INSERT INTO `oa_rewards_cate` VALUES (4, '全勤奖励', 1, 1637987199, 0);
+INSERT INTO `oa_rewards_cate` VALUES (5, '表现优秀', 1, 1637987199, 0);
+INSERT INTO `oa_rewards_cate` VALUES (6, '违规操作', 1, 1637987199, 0);
+
+-- ----------------------------
+-- Table structure for oa_rewards
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_rewards`;
+CREATE TABLE `oa_rewards`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `uid` int(11) NOT NULL DEFAULT 0 COMMENT '员工ID',
+  `types` int(1) NOT NULL DEFAULT 0 COMMENT '奖罚类型:1奖励2惩罚',
+  `rewards_cate` int(11) NOT NULL DEFAULT 0 COMMENT '奖罚项目',
+  `rewards_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '奖罚日期',
+  `cost` decimal(15, 2) NOT NULL DEFAULT 0.00 COMMENT '金额',
+  `thing` varchar(255) NOT NULL DEFAULT '' COMMENT '物品',
+  `status` int(1) NOT NULL DEFAULT 1 COMMENT '状态:1未执行2已执行',
+  `file_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '附件',
+  `remark` mediumtext  NULL COMMENT '备注说明',
+  `admin_id` int(11) NOT NULL DEFAULT 0 COMMENT  '创建人',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '添加时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '修改时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '员工奖罚表';
+
+-- ----------------------------
+-- Table structure for oa_basic_user
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_basic_user`;
+CREATE TABLE `oa_basic_user`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `types` varchar(100) NOT NULL DEFAULT '' COMMENT '数据类型:1职务,2职级,3看后期增加',
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '名称',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '人事模块常规数据';
+
+-- ----------------------------
+-- Records of oa_basic_user
+-- ----------------------------
+INSERT INTO `oa_basic_user` VALUES (1, '2', '初级', 1, 1733384661, 0);
+INSERT INTO `oa_basic_user` VALUES (2, '2', '中级', 1, 1733384671, 0);
+INSERT INTO `oa_basic_user` VALUES (3, '2', '高级', 1, 1733384675, 0);
+INSERT INTO `oa_basic_user` VALUES (4, '1', '总经理', 1, 1733384651, 0);
+INSERT INTO `oa_basic_user` VALUES (5, '1', '工程师', 1, 1733384651, 0);
+
+-- ----------------------------
+-- Table structure for oa_care_cate
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_care_cate`;
+CREATE TABLE `oa_care_cate`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '关怀项目名称',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `create_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '关怀项目';
+
+-- ----------------------------
+-- Records of oa_care_cate
+-- ----------------------------
+INSERT INTO `oa_care_cate` VALUES (1, '礼品', 1, 1637987189, 0);
+INSERT INTO `oa_care_cate` VALUES (2, '节日', 1, 1637987199, 0);
+INSERT INTO `oa_care_cate` VALUES (3, '生日', 1, 1638088518, 0);
+INSERT INTO `oa_care_cate` VALUES (4, '其他', 1, 1637987199, 0);
+
+-- ----------------------------
+-- Table structure for oa_care
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_care`;
+CREATE TABLE `oa_care`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `uid` int(11) NOT NULL DEFAULT 0 COMMENT '员工ID',
+  `care_cate` int(11) NOT NULL DEFAULT 0 COMMENT '关怀项目',
+  `care_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '关怀日期',
+  `vacation` int(11) NOT NULL DEFAULT 0 COMMENT '休假天数',
+  `cost` decimal(15, 2) NOT NULL DEFAULT 0.00 COMMENT '金额',
+  `thing` varchar(255) NOT NULL DEFAULT '' COMMENT '物品',
+  `status` int(1) NOT NULL DEFAULT 1 COMMENT '状态:1未执行2已执行',
+  `file_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '附件',
+  `remark` mediumtext  NULL COMMENT '备注说明',
+  `admin_id` int(11) NOT NULL DEFAULT 0 COMMENT  '创建人',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '添加时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '修改时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '员工关怀表';
+
+-- ----------------------------
+-- Table structure for oa_flow_module
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_flow_module`;
+CREATE TABLE `oa_flow_module`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '审批模块名称',
+  `icon` varchar(255) NOT NULL DEFAULT '' COMMENT '预设字段，图标',
+  `sort` int(11) NOT NULL DEFAULT 0 COMMENT '排序：越大越靠前',
+  `department_ids` varchar(255) NOT NULL DEFAULT '' COMMENT '应用部门ID（空为全部）1,2,3',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `create_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '审批模块';
+
+-- ----------------------------
+-- Records of oa_flow_module
+-- ----------------------------
+INSERT INTO `oa_flow_module` VALUES (1, '假勤', '', 0, '', 1, 1723277295, 0);
+INSERT INTO `oa_flow_module` VALUES (2, '行政', '', 0, '', 1, 1723277311, 0);
+INSERT INTO `oa_flow_module` VALUES (3, '业务', '', 0, '', 1, 1723277351, 0);
+INSERT INTO `oa_flow_module` VALUES (4, '财务', '', 0, '', 1, 1723277356, 0);
+INSERT INTO `oa_flow_module` VALUES (5, '人事', '', 0, '', 1, 1723277368, 0);
+INSERT INTO `oa_flow_module` VALUES (6, '其他', '', 0, '', 1, 1723277374, 0);
+
+-- ----------------------------
+-- Table structure for oa_flow_cate
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_flow_cate`;
+CREATE TABLE `oa_flow_cate`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '审批类型名称',
+  `name` varchar(100) NOT NULL COMMENT '审批类型标识,唯一',
+  `module_id` int(11) NOT NULL DEFAULT 0 COMMENT '关联审批模块id',
+  `check_table` varchar(100) NOT NULL DEFAULT '' COMMENT '关联数据库表名',
+  `icon` varchar(255) NOT NULL DEFAULT '' COMMENT '图标',
+  `department_ids` varchar(255) NOT NULL DEFAULT '' COMMENT '应用部门ID（空为全部）1,2,3',
+  `sort` int(11) NOT NULL DEFAULT 0 COMMENT '排序：越大越靠前',
+  `form` tinyint(1) NOT NULL DEFAULT 1 COMMENT '预设字段，表单模式：1固定表单,2自定义表单',
+  `add_url` varchar(255) NOT NULL DEFAULT '' COMMENT '新建链接：固定表单模式必填',
+  `view_url` varchar(255) NOT NULL DEFAULT '' COMMENT '查看链接：固定表单模式必填',
+  `form_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '表单id：自定义表单模式必填',
+  `is_list` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否列表页显示：0不显示 1显示',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `template_id` int(11) NOT NULL DEFAULT 0 COMMENT '审批消息模板id',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '审批类型';
+
+-- ----------------------------
+-- Records of oa_flow_cate
+-- ----------------------------
+INSERT INTO `oa_flow_cate` VALUES (1, '请假', 'leaves', 1, 'leaves', 'icon-kechengziyuanguanli', '', 0, 1, '/home/leaves/add', '/home/leaves/view', 0, 1, 1, 2, 1723604674, 0);
+INSERT INTO `oa_flow_cate` VALUES (2, '出差', 'trips', 1, 'trips', 'icon-jiaoshiguanli', '', 0, 1, '/home/trips/add', '/home/trips/view', 0, 1, 1, 3, 1723799422, 1724138037);
+INSERT INTO `oa_flow_cate` VALUES (3, '外出', 'outs', 1, 'outs', 'icon-tuiguangguanli', '', 0, 1, '/home/outs/add', '/home/outs/view', 0, 1, 1, 4,1723800336, 1724138021);
+INSERT INTO `oa_flow_cate` VALUES (4, '加班', 'overtimes', 1, 'overtimes', 'icon-xueshengchengji', '', 0, 1, '/home/overtimes/add', '/home/overtimes/view', 0, 1, 1, 5, 1723800393, 1724138004);
+INSERT INTO `oa_flow_cate` VALUES (5, '用章', 'seal', 2, 'seal', 'icon-shenpishezhi', '', 0, 1, '/adm/seal/add', '/adm/seal/view', 0, 1, 1, 6, 1723469451, 1724138203);
+INSERT INTO `oa_flow_cate` VALUES (6, '公文', 'official_docs', 2, 'official_docs', 'icon-lunwenguanli', '', 0, 1, '/adm/official/add', '/adm/official/view', 0, 1, 1, 7, 1723469614, 1724138182);
+INSERT INTO `oa_flow_cate` VALUES (7, '报销', 'expense', 4, 'expense', 'icon-jizhang', '', 0, 1, '/finance/expense/add', '/finance/expense/view', 0, 1, 1, 8, 1723469732, 1724138154);
+INSERT INTO `oa_flow_cate` VALUES (8, '发票', 'invoice', 4, 'invoice', 'icon-duizhangdan', '', 0, 1, '/finance/invoice/add', '/finance/invoice/view', 0, 1, 1, 9,1723469814, 1724138127);
+INSERT INTO `oa_flow_cate` VALUES (9, '收票', 'ticket', 4, 'ticket', 'icon-yingjiaoqingdan', '', 0, 1, '/finance/ticket/add', '/finance/ticket/view', 0, 1, 1, 10, 1724749856, 1724828690);
+INSERT INTO `oa_flow_cate` VALUES (10, '无发票回款', 'invoicea', 4, 'invoice', 'icon-shoufeipeizhi', '', 0, 1, '/finance/invoice/add_a', '/finance/invoice/view_a', 0, 1, 1, 11,1725856435, 1725935194);
+INSERT INTO `oa_flow_cate` VALUES (11, '无发票付款', 'ticketa', 4, 'ticket', 'icon-bulujiesuan', '', 0, 1, '/finance/ticket/add_a', '/finance/ticket/view_a', 0, 1, 1, 12,1725856613, 1725935703);
+INSERT INTO `oa_flow_cate` VALUES (12, '销售合同', 'contract', 3, 'contract', 'icon-hetongguanli', '', 0, 1, '/contract/contract/add', '/contract/contract/view', 0, 0, 1, 13,1723469917, 1724828537);
+INSERT INTO `oa_flow_cate` VALUES (13, '采购合同', 'purchase', 3, 'purchase', 'icon-dianshang', '', 0, 1, '/contract/purchase/add', '/contract/purchase/view', 0, 0, 1, 14,1723470017, 1724828575);
+
+-- ----------------------------
+-- Table structure for oa_flow
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_flow`;
+CREATE TABLE `oa_flow`  (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `title` varchar(50) NOT NULL DEFAULT '' COMMENT '审批流程名称',
+  `cate_id` tinyint(11) NOT NULL DEFAULT 0 COMMENT '关联审批类型id',
+  `check_type` tinyint(4) NOT NULL COMMENT '1自由审批流,2固定审批流,3固定可回退的审批流,4固定条件审批流',
+  `department_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '应用部门ID（0为全部）1,2,3',
+  `copy_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '抄送人ID',
+  `flow_list` varchar(1000) NULL DEFAULT '' COMMENT '流程数据序列化',
+  `status` tinyint(4) NOT NULL DEFAULT 1 COMMENT '状态 1启用，0禁用',
+  `remark` varchar(500) NOT NULL DEFAULT '' COMMENT '流程说明',
+  `admin_id` int(11) NOT NULL COMMENT '创建人ID',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '审批流程表';
+
+-- ----------------------------
+-- Records of oa_flow_cate
+-- ----------------------------
+INSERT INTO `oa_flow` VALUES (1, '请假审批', 1, 1, '', '', '', 1, '', 1, 1723791655, 0, 0);
+INSERT INTO `oa_flow` VALUES (2, '出差审批', 2, 1, '', '', '', 1, '', 1, 1723799665, 0, 0);
+INSERT INTO `oa_flow` VALUES (3, '外出审批', 3, 1, '', '', '', 1, '', 1, 1723800434, 0, 0);
+INSERT INTO `oa_flow` VALUES (4, '加班审批', 4, 1, '', '', '', 1, '', 1, 1723800446, 0, 0);
+INSERT INTO `oa_flow` VALUES (5, '用章审批', 5, 1, '', '', '', 1, '', 1, 1723470400, 0, 0);
+INSERT INTO `oa_flow` VALUES (6, '公文审批', 6, 1, '', '', '', 1, '', 1, 1723470419, 0, 0);
+INSERT INTO `oa_flow` VALUES (7, '报销审批', 7, 1, '', '', '', 1, '', 1, 1723470468, 0, 0);
+INSERT INTO `oa_flow` VALUES (8, '发票审批', 8, 1, '', '', '', 1, '', 1, 1723470482, 0, 0);
+INSERT INTO `oa_flow` VALUES (9, '收票审批', 9, 1, '', '', '', 1, '', 1, 1723470482, 0, 0);
+INSERT INTO `oa_flow` VALUES (10, '无发票回款', 10, 1, '', '', '', 1, '', 1, 1725935073, 0, 0);
+INSERT INTO `oa_flow` VALUES (11, '无发票付款', 11, 1, '', '', '', 1, '', 1, 1725935159, 1725935232, 0);
+INSERT INTO `oa_flow` VALUES (12, '销售合同审批', 12, 1, '', '', '', 1, '', 1, 1723470490, 0, 0);
+INSERT INTO `oa_flow` VALUES (13, '采购合同审批', 13, 1, '', '', '', 1, '', 1, 1723470501, 0, 0);
+
+-- ----------------------------
+-- Table structure for oa_flow_step
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_flow_step`;
+CREATE TABLE `oa_flow_step`  (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `flow_name` varchar(255) NOT NULL DEFAULT '' COMMENT '流程步骤名称',
+  `action_id` int(11) NOT NULL COMMENT '审批内容ID',
+  `flow_id` int(11) NOT NULL COMMENT '审批流程id',
+  `check_role` tinyint(4) NOT NULL DEFAULT 0 COMMENT '审批角色:0自由指定,1当前部门负责人,2上一级部门负责人,3指定职位,4指定用户,5可回退审批',
+  `check_position_id` int(11) NOT NULL DEFAULT 0 COMMENT '审批角色id',
+  `check_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '审批人ids(1,2,3)',
+  `check_types` tinyint(4) NOT NULL DEFAULT 1 COMMENT '审批方式:1会签2或签',
+  `sort` tinyint(4) NOT NULL DEFAULT 0 COMMENT '排序ID',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '审批步骤表';
+
+-- ----------------------------
+-- Table structure for oa_flow_record
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_flow_record`;
+CREATE TABLE `oa_flow_record`  (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `action_id` int(11) NOT NULL DEFAULT 0 COMMENT '审批内容ID',
+  `check_table` varchar(255) NOT NULL DEFAULT '审批数据表',
+  `flow_id` int(11) NOT NULL COMMENT '审批模版流程id',
+  `step_id` int(11) NOT NULL DEFAULT 0 COMMENT '审批步骤ID',
+  `check_uid` int(11) NOT NULL DEFAULT 0 COMMENT '审批人ID',
+  `check_time` bigint(11) NOT NULL COMMENT '审批时间',
+  `check_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '审批状态:0发起,1通过,2拒绝,3撤销',
+  `content` varchar(500) NOT NULL DEFAULT '' COMMENT '审批意见',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '审批记录表';
+
+-- ----------------------------
+-- Table structure for oa_cost_cate
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_cost_cate`;
+CREATE TABLE `oa_cost_cate`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '费用类型名称',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '费用类型';
+
+-- ----------------------------
+-- Records of oa_cost_cate
+-- ----------------------------
+INSERT INTO `oa_cost_cate` VALUES (1, '差旅费', 1, 1639898199, 0,0);
+INSERT INTO `oa_cost_cate` VALUES (2, '办公费', 1, 1639898434, 0,0);
+INSERT INTO `oa_cost_cate` VALUES (3, '招待费', 1, 1639898564, 0,0);
+INSERT INTO `oa_cost_cate` VALUES (4, '交通费', 1, 1639898564, 0,0);
+INSERT INTO `oa_cost_cate` VALUES (5, '通讯费', 1, 1639898564, 0,0);
+INSERT INTO `oa_cost_cate` VALUES (6, '其他', 1, 1639898564, 0,0);
+
+-- ----------------------------
+-- Table structure for oa_seal_cate
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_seal_cate`;
+CREATE TABLE `oa_seal_cate`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '印章名称',
+  `keep_uid` int(11) NOT NULL DEFAULT 0 COMMENT '保管人',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `remark` varchar(1000) NULL DEFAULT '' COMMENT '用途简述',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '印章类型';
+
+INSERT INTO `oa_seal_cate` VALUES (1, '合同章', 2, 1, '', 1733385406, 0);
+
+-- ----------------------------
+-- Table structure for oa_meeting_room
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_meeting_room`;
+CREATE TABLE `oa_meeting_room`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '会议室名称',
+  `keep_uid` int(11) NOT NULL DEFAULT 0 COMMENT '会议室管理员',
+  `address` varchar(100) NOT NULL DEFAULT '' COMMENT '地址楼层',
+  `device` varchar(255) NOT NULL DEFAULT '' COMMENT '会议室设备',
+  `num` int(10) NOT NULL DEFAULT 10 COMMENT '可容纳人数',
+  `remark` varchar(1000) NULL DEFAULT '' COMMENT '会议室描述',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '会议室';
+
+-- ----------------------------
+-- Table structure for oa_meeting_records
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_meeting_records`;
+CREATE TABLE `oa_meeting_records`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(225) NULL DEFAULT NULL COMMENT '会议主题',
+  `meeting_date` int(11) NOT NULL DEFAULT 0 COMMENT '会议时间',
+  `room_id` int(11) NOT NULL DEFAULT 0 COMMENT '会议室',
+  `did` int(11) NOT NULL DEFAULT 0 COMMENT '主办部门',
+  `content` text NOT NULL COMMENT '会议内容',
+  `plans` text NOT NULL COMMENT '下一步实施计划',
+  `file_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '相关附件',
+  `join_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '与会人员',
+  `sign_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '签到人员',
+  `share_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '共享给谁',
+  `anchor_id` int(11) NOT NULL DEFAULT 0 COMMENT '主持人id',
+  `recorder_id` int(11) NOT NULL DEFAULT 0 COMMENT '记录人id',
+  `remarks` text NOT NULL COMMENT '备注内容',
+  `admin_id` int(11) NOT NULL DEFAULT 0 COMMENT '发布人id',
+  `create_time` bigint(11) NOT NULL DEFAULT 0,
+  `update_time` bigint(11) NOT NULL DEFAULT 0,
+  `delete_time` bigint(11) NOT NULL DEFAULT 0,
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '会议纪要';
+
+-- ----------------------------
+-- Table structure for oa_car
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_car`;
+CREATE TABLE `oa_car`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '车辆名称',
+  `name` varchar(100) NOT NULL DEFAULT '' COMMENT '车辆牌号',
+  `oil` varchar(100) NOT NULL DEFAULT '' COMMENT '油耗',
+  `mileage` decimal(15, 2) NULL DEFAULT 0.00 COMMENT '开始里程数',
+  `seats` int(11) NOT NULL DEFAULT 5 COMMENT '座位数',
+  `color` varchar(100) NOT NULL DEFAULT '' COMMENT '车身颜色',
+  `vin` varchar(100) NOT NULL DEFAULT '' COMMENT '车架号',
+  `engine` varchar(100) NOT NULL DEFAULT '' COMMENT '发动机号',
+  `buy_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '购买日期',
+  `price` decimal(15, 2) NULL DEFAULT 0.00 COMMENT '购买价格',
+  `thumb` int(11) NOT NULL DEFAULT 5 COMMENT '车辆照片',
+  `types` int(11) NOT NULL DEFAULT 5 COMMENT '车辆类型:1轿车,2面包车,3越野车,4吉普车,5巴士,6工具车,7卡车,8其他',
+  `driver` int(11) NOT NULL DEFAULT 0 COMMENT '驾驶员',
+  `insure_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '保险到期时间',
+  `review_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '年审到期时间',
+  `file_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '附件ID，如:1,2,3',
+  `remark` varchar(1000) NULL DEFAULT '' COMMENT '备注',
+  `status` int(11) NOT NULL DEFAULT 1 COMMENT '当前状态:1可用,停用,维修,报废',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '车辆管理';
+
+-- ----------------------------
+-- Table structure for oa_car_repair
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_car_repair`;
+CREATE TABLE `oa_car_repair`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `types` int(1) NOT NULL DEFAULT 1 COMMENT '类型:1维修,2保养',
+  `car_id` int(11) NOT NULL DEFAULT 0 COMMENT '车id',
+  `address` varchar(255) NOT NULL DEFAULT '' COMMENT '维修(保养)地点',
+  `content` varchar(1000) NULL DEFAULT '' COMMENT '维修(保养)原因&内容',
+  `amount` decimal(15, 2) NULL DEFAULT 0.00 COMMENT '维修(保养)金额',
+  `handled` int(11) NOT NULL DEFAULT 0 COMMENT '经手人',
+  `repair_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '维修(保养)时间',
+  `file_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '附件ID，如:1,2,3',
+  `remark` varchar(1000) NULL DEFAULT '' COMMENT '备注信息',
+  `admin_id` int(11) NOT NULL DEFAULT 0 COMMENT '创建人',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '车辆维修(保养)记录';
+
+-- ----------------------------
+-- Table structure for oa_car_mileage
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_car_mileage`;
+CREATE TABLE `oa_car_mileage`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `car_id` int(11) NOT NULL DEFAULT 0 COMMENT '车id',
+  `mileage` decimal(15, 2) NULL DEFAULT 0.00 COMMENT '里程数',
+  `handled` int(11) NOT NULL DEFAULT 0 COMMENT '经手人',
+  `mileage_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '里程月份',
+  `remark` varchar(1000) NULL DEFAULT '' COMMENT '备注信息',
+  `admin_id` int(11) NOT NULL DEFAULT 0 COMMENT '创建人',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '车辆里程明细';
+
+-- ----------------------------
+-- Table structure for oa_car_fee
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_car_fee`;
+CREATE TABLE `oa_car_fee`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '费用主题',
+  `types` int(1) NOT NULL DEFAULT 1 COMMENT '费用类型id',
+  `car_id` int(11) NOT NULL DEFAULT 0 COMMENT '车id',
+  `amount` decimal(15, 2) NULL DEFAULT 0.00 COMMENT '金额',
+  `fee_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '费用日期',
+  `handled` int(11) NOT NULL DEFAULT 0 COMMENT '经手人',
+  `file_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '附件ID，如:1,2,3',
+  `content` varchar(1000) NULL DEFAULT '' COMMENT '费用内容',
+  `admin_id` int(11) NOT NULL DEFAULT 0 COMMENT '创建人',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '车辆费用明细';
+
+-- ----------------------------
+-- Table structure for oa_expense_cate
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_expense_cate`;
+CREATE TABLE `oa_expense_cate`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '报销类型名称',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `create_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '报销类型';
+
+-- ----------------------------
+-- Records of oa_expense_cate
+-- ----------------------------
+INSERT INTO `oa_expense_cate` VALUES (1, '交通费', 1, 1637987189, 0,0);
+INSERT INTO `oa_expense_cate` VALUES (2, '住宿费', 1, 1637987199, 0,0);
+INSERT INTO `oa_expense_cate` VALUES (3, '餐补费', 1, 1638088518, 0,0);
+INSERT INTO `oa_expense_cate` VALUES (4, '招待费', 1, 1637987199, 0,0);
+INSERT INTO `oa_expense_cate` VALUES (5, '汽油费', 1, 1637987199, 0,0);
+INSERT INTO `oa_expense_cate` VALUES (6, '其他费', 1, 1637987199, 0,0);
+
+-- ----------------------------
+-- Table structure for oa_expense
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_expense`;
+CREATE TABLE `oa_expense`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `subject_id` int(11)  NOT NULL DEFAULT 0 COMMENT '报销企业主体',
+  `code` varchar(100) NOT NULL DEFAULT '' COMMENT '报销编码',
+  `cost` decimal(15, 2) NULL DEFAULT 0.00 COMMENT '报销总金额',
+  `income_month` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '入账月份',
+  `expense_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '原始单据日期',
+  `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '报销人',
+  `did` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '报销部门ID',
+  `project_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '预定字段:关联项目ID',
+  `file_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '附件ID，如:1,2,3',
+  `pay_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '打款状态 0待打款,1已打款',
+  `pay_admin_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '打款人ID',
+  `pay_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '最后打款时间',
+  `remark` varchar(1000) NULL DEFAULT '' COMMENT '备注',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  `check_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '审核状态:0待审核,1审核中,2审核通过,3审核不通过,4撤销审核',
+  `check_flow_id` int(11) NOT NULL DEFAULT 0 COMMENT '审核流程id',
+  `check_step_sort` int(11) NOT NULL DEFAULT 0 COMMENT '当前审批步骤',
+  `check_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '当前审批人ID，如:1,2,3',
+  `check_last_uid` varchar(500) NOT NULL DEFAULT '' COMMENT '上一审批人',
+  `check_history_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '历史审批人ID，如:1,2,3',
+  `check_copy_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '抄送人ID，如:1,2,3',
+  `check_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '审核通过时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '报销表';
+
+-- ----------------------------
+-- Table structure for oa_expense_interfix
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_expense_interfix`;
+CREATE TABLE `oa_expense_interfix`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `exid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '报销ID',
+  `amount` decimal(15, 2) NULL DEFAULT 0.00 COMMENT '金额',
+  `cate_id` tinyint(1) UNSIGNED NULL DEFAULT 1 COMMENT '报销类型ID',
+  `remarks` mediumtext  NULL COMMENT '备注',
+  `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '登记人',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '报销关联数据表';
+
+-- ----------------------------
+-- Table structure for oa_invoice
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_invoice`;
+CREATE TABLE `oa_invoice`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `code` varchar(100) NOT NULL DEFAULT '' COMMENT '发票号码',
+  `customer_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联客户ID',
+  `contract_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联合同协议ID',
+  `project_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联项目ID',
+  `amount` decimal(15, 2) NULL DEFAULT 0.00 COMMENT '发票金额',
+  `did` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '发票申请部门',
+  `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '发票申请人',
+  `open_status` tinyint(1) UNSIGNED NULL DEFAULT 0 COMMENT '开票状态：0未开票 1已开票 2已作废',
+  `open_admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '发票开具人',
+  `open_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '发票开具时间',
+  `delivery` varchar(100) NOT NULL DEFAULT '' COMMENT '快递单号',
+  `types` tinyint(1) UNSIGNED NULL DEFAULT 0 COMMENT '抬头类型：1企业2个人',
+  `invoice_type` tinyint(1) UNSIGNED NULL DEFAULT 0 COMMENT '发票类型：1增值税专用发票,2普通发票,3专用发票',
+  `invoice_subject` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联发票主体ID',
+  `invoice_title` varchar(100) NOT NULL DEFAULT '' COMMENT '开票抬头',
+  `invoice_tax` varchar(100) NOT NULL DEFAULT '' COMMENT '纳税人识别号',
+  `invoice_phone` varchar(100) NOT NULL DEFAULT '' COMMENT '电话号码',
+  `invoice_address` varchar(100) NOT NULL DEFAULT '' COMMENT '地址',
+  `invoice_bank` varchar(100) NOT NULL DEFAULT '' COMMENT '开户银行',
+  `invoice_account` varchar(100) NOT NULL DEFAULT '' COMMENT '银行账号',
+  `invoice_banking` varchar(100) NOT NULL DEFAULT '' COMMENT '银行营业网点',
+  `file_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '附件ID，如:1,2,3',
+  `other_file_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '其他附件ID，如:1,2,3',
+  `remark` mediumtext  NULL COMMENT '备注',
+  `enter_amount` decimal(15, 2) NULL DEFAULT 0.00 COMMENT '已到账金额',
+  `enter_status` tinyint(1) UNSIGNED NULL DEFAULT 0 COMMENT '回款状态：0未回款 1部分回款 2全部回款',
+  `enter_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '最新回款时间',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  `check_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '审核状态:0待审核,1审核中,2审核通过,3审核不通过,4撤销审核',
+  `check_flow_id` int(11) NOT NULL DEFAULT 0 COMMENT '审核流程id',
+  `check_step_sort` int(11) NOT NULL DEFAULT 0 COMMENT '当前审批步骤',
+  `check_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '当前审批人ID，如:1,2,3',
+  `check_last_uid` varchar(500) NOT NULL DEFAULT '' COMMENT '上一审批人',
+  `check_history_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '历史审批人ID，如:1,2,3',
+  `check_copy_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '抄送人ID，如:1,2,3',
+  `check_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '审核通过时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '发票表';
+
+-- ----------------------------
+-- Table structure for oa_invoice_income
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_invoice_income`;
+CREATE TABLE `oa_invoice_income`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `invoice_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '发票ID',
+  `amount` decimal(15, 2) NULL DEFAULT 0.00 COMMENT '到账金额',
+  `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '到账登记人',
+  `enter_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '到账时间',
+  `remarks` mediumtext  NULL COMMENT '备注',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1正常 6作废',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '发票到账记录表';
+
+-- ----------------------------
+-- Table structure for oa_ticket
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_ticket`;
+CREATE TABLE `oa_ticket`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `code` varchar(100) NOT NULL DEFAULT '' COMMENT '发票号码',
+  `supplier_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联供应商ID',
+  `purchase_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联采购合同协议ID',
+  `customer_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联客户ID',
+  `project_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联项目ID',
+  `amount` decimal(15, 2) NULL DEFAULT 0.00 COMMENT '发票金额',
+  `did` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '发票接受部门',
+  `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '发票接受人',
+  `open_status` tinyint(1) UNSIGNED NULL DEFAULT 1 COMMENT '开票状态：1正常 2已作废',
+  `open_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '发票开具时间',
+  `invoice_type` tinyint(1) UNSIGNED NULL DEFAULT 0 COMMENT '发票类型：1增值税专用发票,2普通发票,3专用发票',
+  `invoice_subject` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联发票主体ID',
+  `invoice_title` varchar(100) NOT NULL DEFAULT '' COMMENT '开票抬头',
+  `invoice_tax` varchar(100) NOT NULL DEFAULT '' COMMENT '纳税人识别号',
+  `invoice_phone` varchar(100) NOT NULL DEFAULT '' COMMENT '电话号码',
+  `invoice_address` varchar(100) NOT NULL DEFAULT '' COMMENT '地址',
+  `invoice_bank` varchar(100) NOT NULL DEFAULT '' COMMENT '开户银行',
+  `invoice_account` varchar(100) NOT NULL DEFAULT '' COMMENT '银行账号',
+  `invoice_banking` varchar(100) NOT NULL DEFAULT '' COMMENT '银行营业网点',
+  `file_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '附件ID，如:1,2,3',
+  `other_file_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '其他附件ID，如:1,2,3',
+  `remark` mediumtext  NULL COMMENT '备注',
+  `pay_amount` decimal(15, 2) NULL DEFAULT 0.00 COMMENT '已付款金额',
+  `cash_type` int(11) UNSIGNED NULL DEFAULT 1 COMMENT '付款类型：1银行,2现金,3支付宝,4微信,5汇票,6支票,7托收,8其他',
+  `pay_status` tinyint(1) UNSIGNED NULL DEFAULT 0 COMMENT '付款状态：0未付款 1部分付款 2全部付款',
+  `pay_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '最新回款时间',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  `check_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '审核状态:0待审核,1审核中,2审核通过,3审核不通过,4撤销审核',
+  `check_flow_id` int(11) NOT NULL DEFAULT 0 COMMENT '审核流程id',
+  `check_step_sort` int(11) NOT NULL DEFAULT 0 COMMENT '当前审批步骤',
+  `check_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '当前审批人ID，如:1,2,3',
+  `check_last_uid` varchar(500) NOT NULL DEFAULT '' COMMENT '上一审批人',
+  `check_history_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '历史审批人ID，如:1,2,3',
+  `check_copy_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '抄送人ID，如:1,2,3',
+  `check_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '审核通过时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '收票表';
+
+-- ----------------------------
+-- Table structure for oa_ticket_payment
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_ticket_payment`;
+CREATE TABLE `oa_ticket_payment`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `ticket_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '发票ID',
+  `amount` decimal(15, 2) NULL DEFAULT 0.00 COMMENT '付款金额',
+  `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '付款登记人',
+  `pay_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '到账时间',
+  `remarks` mediumtext  NULL COMMENT '备注',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1正常 6作废',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '收票付款记录表';
+
+-- ----------------------------
+-- Table structure for oa_third_message
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_third_message`;
+CREATE TABLE `oa_third_message`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `msgtype` varchar(100) NOT NULL DEFAULT '' COMMENT '消息类型,email,weixin,mobile',
+  `types` tinyint(1) UNSIGNED NULL DEFAULT 0 COMMENT '接收人类型：1人员,2部门,3岗位,4全部',
+  `uids` varchar(500) NOT NULL DEFAULT '' COMMENT '人员ids',
+  `dids` varchar(500) NOT NULL DEFAULT '' COMMENT '部门ids',
+  `pids` varchar(500) NOT NULL DEFAULT '' COMMENT '岗位ids',
+  `content` mediumtext NULL COMMENT '消息内容',
+  `send_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '发送日期',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '第三方发消息表';
+
+-- ----------------------------
+-- Table structure for oa_message
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_message`;
+CREATE TABLE `oa_message`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '消息主题',
+  `template` varchar(100) NOT NULL DEFAULT '' COMMENT '消息模板,默认是空私人消息,其他则在配置文件查看消息模板',
+  `content` mediumtext  NULL COMMENT '消息内容',
+  `file_ids` mediumtext  NULL COMMENT '消息附件',
+  `from_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '发送人id，0为系统消息',
+  `types` tinyint(1) UNSIGNED NULL DEFAULT 0 COMMENT '接收人类型：1人员,2部门,3岗位,4全部',
+  `uids` varchar(500) NOT NULL DEFAULT '' COMMENT '人员ids',
+  `dids` varchar(500) NOT NULL DEFAULT '' COMMENT '部门ids',
+  `pids` varchar(500) NOT NULL DEFAULT '' COMMENT '岗位ids',
+  `copy_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '操送人员ids',
+  `msg_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '转发、回复关联消息id',
+  `is_draft` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否是草稿：1正常消息 2草稿消息',
+  `send_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '发送日期',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  `clear_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '清除时间',
+  `action_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '操作模块数据的id（针对系统消息）',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '发消息表';
+
+-- ----------------------------
+-- Table structure for oa_msg
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_msg`;
+CREATE TABLE `oa_msg`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '消息主题',
+  `template` varchar(100) NOT NULL DEFAULT '' COMMENT '消息模板,默认是私人文本消息,其他则在配置文件查看消息模板',
+  `content` mediumtext  NULL COMMENT '消息内容',
+  `file_ids` mediumtext  NULL COMMENT '消息附件',
+  `from_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '发送人id，0为系统消息',
+  `to_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '接收人id',
+  `message_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '来源发件消息id,0为系统消息',
+  `msg_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '转发、回复关联消息id',
+  `is_star` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否星标信息：1是 0不是',
+  `read_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '阅读时间',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  `clear_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '清除时间',
+  `action_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '操作模块数据的id（针对系统消息）',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '消息表';
+
+-- ----------------------------
+-- Table structure for oa_note_cate
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_note_cate`;
+CREATE TABLE `oa_note_cate`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `pid` int(11) NOT NULL DEFAULT 0 COMMENT '父类ID',
+  `sort` int(5) NOT NULL DEFAULT 0 COMMENT '排序',
+  `title` varchar(50) NOT NULL DEFAULT '' COMMENT '标题',
+  `status` int(1) NOT NULL DEFAULT 1 COMMENT '1可用-1禁用',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '添加时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '修改时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '公告分类';
+
+-- ----------------------------
+-- Records of oa_note_cate
+-- ----------------------------
+INSERT INTO `oa_note_cate` VALUES (1, 0, 1, '普通公告',1, 1637984265, 1637984299,0);
+INSERT INTO `oa_note_cate` VALUES (2, 0, 2, '紧急公告',1, 1637984283, 1637984310,0);
+
+-- ----------------------------
+-- Table structure for oa_note
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_note`;
+CREATE TABLE `oa_note`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `cate_id` int(11) NOT NULL DEFAULT 0 COMMENT '公告分类ID',
+  `title` varchar(225) NULL DEFAULT NULL COMMENT '标题',
+  `content` text NOT NULL COMMENT '公告内容',
+  `src` varchar(100) NULL DEFAULT NULL COMMENT '关联链接',
+  `status` int(1) NOT NULL DEFAULT 1 COMMENT '1可用-1禁用',
+  `sort` int(11) NOT NULL DEFAULT 0 COMMENT '排序',
+  `file_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '相关附件',
+  `role_type` tinyint(1) NOT NULL DEFAULT 0 COMMENT '查看权限，0所有人,1部门,2人员',
+  `role_dids` varchar(500) NOT NULL DEFAULT '' COMMENT '可查看部门',
+  `role_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '可查看用户',
+  `start_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '展示开始时间',
+  `end_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '展示结束时间',
+  `admin_id` int(11) NOT NULL DEFAULT 0 COMMENT '发布人id',
+  `create_time` bigint(11) NOT NULL DEFAULT 0,
+  `update_time` bigint(11) NOT NULL DEFAULT 0,
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '公告表';
+
+-- ----------------------------
+-- Records of oa_note
+-- ----------------------------
+INSERT INTO `oa_note` VALUES (1, 1, '欢迎使用勾股OA办公系统', '<p>欢迎使用勾股OA办公系统，勾股办公是一款简单实用的开源免费的企业办公系统。系统集成了系统设置、人事管理、行政管理、消息管理、日常办公、财务管理、客户管理、项目管理、合同管理、知识管理等基础模块。系统简约，易于功能扩展，方便二次开发，让开发者更专注于业务深度需求的开发，帮助开发者简单高效降低二次开发成本，通过二次开发之后可以用来做CRM，ERP，业务管理等系统。</p>', 'https://oa.gougucms.com', 1, 2,'',1,'','', 1635696000, 1924876800,1, 1637984962, 1637984975,0);
+INSERT INTO `oa_note` VALUES (2, 1, '勾股OA支持定制开发', '<p>欢迎使用勾股OA办公系统，勾股办公是一款简单实用的开源免费的企业办公系统。系统集成了系统设置、人事管理、行政管理、消息管理、日常办公、财务管理、客户管理、项目管理、合同管理、知识管理等基础模块。</p><p>勾股OA开源发布，同时我们也支持功能定制开发，价格优惠，定制开发系统功能更贴近自身需求，欢迎够沟通合作。</p><p>合作联系微信号“hdm588”，业务合作、功能定制加微信时请备注。</p>', 'https://oa.gougucms.com', 1, 2,'',1,'','', 1635696000, 1924876800,1, 1637984962, 1637984975,0);
+INSERT INTO `oa_note` VALUES (3, 1, '勾股DEV——研发管理与团队协作的工具', '<p>勾股DEV是一款专为IT行业研发团队打造的智能化项目管理与团队协作的工具软件，可以在线管理团队的工作、项目和任务，覆盖从需求提出到研发完成上线整个过程的项目协作。</p><p>项目体验地址：https://www.gougucms.com/home/pages/detail/s/gougudev.html</p><p>项目开源地址：https://gitee.com/gouguopen/dev</p><p>勾股DEV开源发布，同时我们也支持功能定制开发，价格优惠，定制开发系统功能更贴近自身需求，欢迎够沟通合作。</p><p>合作联系微信号“hdm588”，业务合作、功能定制加微信时请备注。</p>', 'https://dev.gougucms.com', 1, 2,'',1,'','', 1635696000, 1924876800,1, 1637984962, 1637984975,0);
+
+-- ----------------------------
+-- Table structure for oa_position
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_position`;
+CREATE TABLE `oa_position`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '岗位名称',
+  `work_price` int(10) NOT NULL DEFAULT 0 COMMENT '工时单价',
+  `remark` varchar(1000) NULL DEFAULT '' COMMENT '备注',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '岗位职称';
+
+-- ----------------------------
+-- Records of oa_position
+-- ----------------------------
+INSERT INTO `oa_position` VALUES (1, '超级岗位', 1000, '超级岗位，不能轻易修改权限', 1, 0, 0);
+INSERT INTO `oa_position` VALUES (2, '人事总监', 1000, '人事部的最大领导', 1, 0, 0);
+INSERT INTO `oa_position` VALUES (3, '普通员工', 500, '普通员工', 1, 0, 0);
+
+-- ----------------------------
+-- Table structure for oa_position_group
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_position_group`;
+CREATE TABLE `oa_position_group`  (
+  `pid` int(11) UNSIGNED NULL DEFAULT NULL COMMENT '岗位id',
+  `group_id` int(11) NULL DEFAULT NULL COMMENT '权限id',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  UNIQUE INDEX `pid_group_id`(`pid`, `group_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COMMENT = '权限分组和岗位的关联表';
+
+-- ----------------------------
+-- Records of oa_position_group
+-- ----------------------------
+INSERT INTO `oa_position_group` VALUES (1, 1, 1635755739, 0);
+INSERT INTO `oa_position_group` VALUES (2, 2, 1638007427, 0);
+INSERT INTO `oa_position_group` VALUES (3, 3, 1638007427, 0);
+
+-- ----------------------------
+-- Table structure for oa_plan
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_plan`;
+CREATE TABLE `oa_plan`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(255) NOT NULL DEFAULT '' COMMENT '工作安排主题',
+  `type` varchar(100) NOT NULL DEFAULT '' COMMENT '日程优先级',
+  `cid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '预设字段:关联工作内容类型ID',
+  `cmid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '预设字段:关联客户ID',
+  `ptid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '预设字段:关联项目ID',
+  `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联创建员工ID',
+  `did` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '所属部门',
+  `start_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '开始时间',
+  `end_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '结束时间',
+  `remind_type` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '提醒类型',
+  `remind_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '提醒时间',
+  `remark` text NOT NULL COMMENT '描述',
+  `file_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '相关附件',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '日程安排';
+
+-- ----------------------------
+-- Table structure for oa_schedule
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_schedule`;
+CREATE TABLE `oa_schedule`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(255) NOT NULL DEFAULT '' COMMENT '工作记录主题',
+  `cid` int(11) UNSIGNED NOT NULL DEFAULT 1 COMMENT '预设字段:关联工作内容类型ID',
+  `cmid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '预设字段:关联客户ID',
+  `ptid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '预设字段:关联项目ID',
+  `tid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '预设字段:关联任务ID',
+  `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联创建员工ID',
+  `did` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '所属部门',
+  `start_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '开始时间',
+  `end_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '结束时间',
+  `labor_time` decimal(15, 2) NOT NULL DEFAULT 0.00 COMMENT '工时',
+  `labor_type` int(1) NOT NULL DEFAULT 0 COMMENT '工作类型:1案头2外勤',
+  `remark` text NOT NULL COMMENT '描述',
+  `file_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '相关附件',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '工作记录';
+
+-- ----------------------------
+-- Table structure for oa_approve
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_approve`;
+CREATE TABLE `oa_approve`  (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `name` varchar(255) NOT NULL DEFAULT '' COMMENT '审批标识',
+  `content` text NOT NULL COMMENT '内容/说明/理由',
+  `types` varchar(255) NOT NULL DEFAULT '' COMMENT '审批类型',  
+  `str_1` varchar(255) NOT NULL DEFAULT '' COMMENT '字符串1',
+  `str_2` varchar(255) NOT NULL DEFAULT '' COMMENT '字符串2',
+  `str_3` varchar(255) NOT NULL DEFAULT '' COMMENT '字符串3',
+  `str_4` varchar(255) NOT NULL DEFAULT '' COMMENT '字符串4',
+  `str_5` varchar(255) NOT NULL DEFAULT '' COMMENT '字符串5',
+  `str_6` varchar(255) NOT NULL DEFAULT '' COMMENT '字符串6',
+  `str_7` varchar(255) NOT NULL DEFAULT '' COMMENT '字符串7',
+  `str_8` varchar(255) NOT NULL DEFAULT '' COMMENT '字符串8',
+  `str_9` varchar(255) NOT NULL DEFAULT '' COMMENT '字符串9',
+  `str_10` varchar(255) NOT NULL DEFAULT '' COMMENT '字符串10',
+  `str_11` varchar(255) NOT NULL DEFAULT '' COMMENT '字符串11',
+  `str_12` varchar(255) NOT NULL DEFAULT '' COMMENT '字符串12',
+  `str_13` varchar(255) NOT NULL DEFAULT '' COMMENT '字符串13',
+  `str_14` varchar(255) NOT NULL DEFAULT '' COMMENT '字符串14',
+  `str_15` varchar(255) NOT NULL DEFAULT '' COMMENT '字符串15',
+  `str_16` varchar(255) NOT NULL DEFAULT '' COMMENT '字符串16',
+  `int_1` int(11) NOT NULL DEFAULT 0 COMMENT '整数1',
+  `int_2` int(11) NOT NULL DEFAULT 0 COMMENT '整数2',
+  `int_3` int(11) NOT NULL DEFAULT 0 COMMENT '整数3',
+  `int_4` int(11) NOT NULL DEFAULT 0 COMMENT '整数4',
+  `int_5` int(11) NOT NULL DEFAULT 0 COMMENT '整数5',
+  `int_6` int(11) NOT NULL DEFAULT 0 COMMENT '整数6',
+  `int_7` int(11) NOT NULL DEFAULT 0 COMMENT '整数7',
+  `int_8` int(11) NOT NULL DEFAULT 0 COMMENT '整数8',
+  `int_9` int(11) NOT NULL DEFAULT 0 COMMENT '整数9',
+  `int_10` int(11) NOT NULL DEFAULT 0 COMMENT '整数10',
+  `float_1` decimal(10, 2) NOT NULL DEFAULT 0.00 COMMENT '浮点数1(2位小数)',
+  `float_2` decimal(10, 2) NOT NULL DEFAULT 0.00 COMMENT '浮点数2(2位小数)',
+  `float_3` decimal(10, 2) NOT NULL DEFAULT 0.00 COMMENT '浮点数3(2位小数)',
+  `float_4` decimal(10, 2) NOT NULL DEFAULT 0.00 COMMENT '浮点数4(2位小数)',
+  `float_5` decimal(10, 2) NOT NULL DEFAULT 0.00 COMMENT '浮点数5(2位小数)',
+  `float_6` decimal(10, 2) NOT NULL DEFAULT 0.00 COMMENT '浮点数6(2位小数)',
+  `float_7` decimal(10, 2) NOT NULL DEFAULT 0.00 COMMENT '浮点数7(2位小数)',
+  `float_8` decimal(10, 2) NOT NULL DEFAULT 0.00 COMMENT '浮点数8(2位小数)',
+  `float_9` decimal(10, 2) NOT NULL DEFAULT 0.00 COMMENT '浮点数9(2位小数)',
+  `float_10` decimal(10, 2) NOT NULL DEFAULT 0.00 COMMENT '浮点数10(2位小数)',  
+  `time_1` bigint(11) NOT NULL DEFAULT 0 COMMENT '时间1',
+  `time_2` bigint(11) NOT NULL DEFAULT 0 COMMENT '时间2',
+  `time_3` bigint(11) NOT NULL DEFAULT 0 COMMENT '时间3',
+  `time_4` bigint(11) NOT NULL DEFAULT 0 COMMENT '时间4',
+  `time_5` bigint(11) NOT NULL DEFAULT 0 COMMENT '时间5',
+  `time_6` bigint(11) NOT NULL DEFAULT 0 COMMENT '时间6',
+  `time_7` bigint(11) NOT NULL DEFAULT 0 COMMENT '时间7',
+  `time_8` bigint(11) NOT NULL DEFAULT 0 COMMENT '时间8',
+  `time_9` bigint(11) NOT NULL DEFAULT 0 COMMENT '时间9',
+  `time_10` bigint(11) NOT NULL DEFAULT 0 COMMENT '时间10',
+  `file_1` varchar(500) NOT NULL DEFAULT '' COMMENT '附件1，如:1,2,3',
+  `file_2` varchar(500) NOT NULL DEFAULT '' COMMENT '附件2，如:1,2,3',
+  `file_3` varchar(500) NOT NULL DEFAULT '' COMMENT '附件3，如:1,2,3',
+  `file_4` varchar(500) NOT NULL DEFAULT '' COMMENT '附件4，如:1,2,3',
+  `file_5` varchar(500) NOT NULL DEFAULT '' COMMENT '附件5，如:1,2,3',
+  `file_6` varchar(500) NOT NULL DEFAULT '' COMMENT '附件6，如:1,2,3',
+  `text_1` text NOT NULL COMMENT '文本1',
+  `text_2` text NOT NULL COMMENT '文本2',
+  `text_3` text NOT NULL COMMENT '文本3',
+  `text_4` text NOT NULL COMMENT '文本4',
+  `text_5` text NOT NULL COMMENT '文本5',
+  `text_6` text NOT NULL COMMENT '文本6',  
+  `check_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '审核状态:0待审核,1审核中,2审核通过,3审核不通过,4撤销审核',
+  `check_flow_id` int(11) NOT NULL DEFAULT 0 COMMENT '审核流程id',
+  `check_step_sort` int(11) NOT NULL DEFAULT 0 COMMENT '当前审批步骤',
+  `check_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '当前审批人ID，如:1,2,3',
+  `check_last_uid` varchar(500) NOT NULL DEFAULT '' COMMENT '上一审批人',
+  `check_history_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '历史审批人ID，如:1,2,3',
+  `check_copy_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '抄送人ID，如:1,2,3',
+  `check_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '审核通过时间',
+  `admin_id` int(11) NOT NULL DEFAULT '0' COMMENT '创建人ID',
+  `did` int(11) NOT NULL DEFAULT '0' COMMENT '创建人部门ID',
+  `create_time` bigint(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT '0' COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '日常审批表';
+
+-- ----------------------------
+-- Table structure for oa_attendance
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_attendance`;
+CREATE TABLE `oa_attendance`  (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `admin_id` int(11) NOT NULL COMMENT '员工ID',
+  `did` int(11) NOT NULL COMMENT '创建人部门ID',
+  `day_time` bigint(11) NOT NULL DEFAULT '0' COMMENT '考勤日期',
+  `time_in_1` bigint(11) NOT NULL DEFAULT '0' COMMENT '第一次打卡上班时间',
+  `time_in_2` bigint(11) NOT NULL DEFAULT '0' COMMENT '第二次打卡上班时间',
+  `time_out_1` bigint(11) NOT NULL DEFAULT '0' COMMENT '第一次打卡下班时间',
+  `time_out_2` bigint(11) NOT NULL DEFAULT '0' COMMENT '第二次打卡下班时间',
+  `late_min` int(10) NOT NULL DEFAULT '0' COMMENT '迟到分钟数',
+  `leave_min` int(10) NOT NULL DEFAULT '0' COMMENT '早退分钟数',
+  `create_time` bigint(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT '0' COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '日常考勤表';
+
+-- ----------------------------
+-- Table structure for oa_leaves
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_leaves`;
+CREATE TABLE `oa_leaves`  (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `types` int(2) NOT NULL DEFAULT '0' COMMENT '请假类型:1事假,2年假,3调休假,4病假,5婚假,6丧假,7产假,8陪产假,9其他',
+  `start_date` bigint(11) NOT NULL DEFAULT '0' COMMENT '开始日期',
+  `end_date` bigint(11) NOT NULL DEFAULT '0' COMMENT '结束日期',
+  `start_span` int(10) NOT NULL DEFAULT '0' COMMENT '时间段:1上午,2下午',
+  `end_span` int(10) NOT NULL DEFAULT '0' COMMENT '时间段:1上午,2下午',
+  `duration` decimal(10, 1) NOT NULL DEFAULT 0.0 COMMENT '时长(工作日)',
+  `reason` text NOT NULL COMMENT '请假原因',
+  `file_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '附件，如:1,2,3',
+  `check_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '审核状态:0待审核,1审核中,2审核通过,3审核不通过,4撤销审核',
+  `check_flow_id` int(11) NOT NULL DEFAULT 0 COMMENT '审核流程id',
+  `check_step_sort` int(11) NOT NULL DEFAULT 0 COMMENT '当前审批步骤',
+  `check_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '当前审批人ID，如:1,2,3',
+  `check_last_uid` varchar(500) NOT NULL DEFAULT '' COMMENT '上一审批人',
+  `check_history_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '历史审批人ID，如:1,2,3',
+  `check_copy_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '抄送人ID，如:1,2,3',
+  `check_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '审核通过时间',
+  `admin_id` int(11) NOT NULL COMMENT '创建人ID',
+  `did` int(11) NOT NULL COMMENT '创建人部门ID',
+  `create_time` bigint(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT '0' COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '请假表';
+
+-- ----------------------------
+-- Table structure for oa_trips
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_trips`;
+CREATE TABLE `oa_trips`  (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `start_date` bigint(11) NOT NULL DEFAULT '0' COMMENT '开始日期',
+  `end_date` bigint(11) NOT NULL DEFAULT '0' COMMENT '结束日期',
+  `start_span` int(10) NOT NULL DEFAULT '0' COMMENT '时间段:1上午,2下午',
+  `end_span` int(10) NOT NULL DEFAULT '0' COMMENT '时间段:1上午,2下午',
+  `duration` decimal(10, 1) NOT NULL DEFAULT 0.0 COMMENT '时长(工作日)',
+  `reason` text NOT NULL COMMENT '出差原因',
+  `file_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '附件，如:1,2,3',
+  `check_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '审核状态:0待审核,1审核中,2审核通过,3审核不通过,4撤销审核',
+  `check_flow_id` int(11) NOT NULL DEFAULT 0 COMMENT '审核流程id',
+  `check_step_sort` int(11) NOT NULL DEFAULT 0 COMMENT '当前审批步骤',
+  `check_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '当前审批人ID，如:1,2,3',
+  `check_last_uid` varchar(500) NOT NULL DEFAULT '' COMMENT '上一审批人',
+  `check_history_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '历史审批人ID，如:1,2,3',
+  `check_copy_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '抄送人ID，如:1,2,3',
+  `check_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '审核通过时间',
+  `admin_id` int(11) NOT NULL COMMENT '创建人ID',
+  `did` int(11) NOT NULL COMMENT '创建人部门ID',
+  `create_time` bigint(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT '0' COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '出差表';
+
+-- ----------------------------
+-- Table structure for oa_outs
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_outs`;
+CREATE TABLE `oa_outs`  (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `start_date` bigint(11) NOT NULL DEFAULT '0' COMMENT '开始日期',
+  `end_date` bigint(11) NOT NULL DEFAULT '0' COMMENT '结束日期',
+  `start_span` int(10) NOT NULL DEFAULT '0' COMMENT '时间段:1上午,2下午',
+  `end_span` int(10) NOT NULL DEFAULT '0' COMMENT '时间段:1上午,2下午',
+  `duration` decimal(10, 1) NOT NULL DEFAULT 0.0 COMMENT '时长(工作日)',
+  `reason` text NOT NULL COMMENT '出差原因',
+  `file_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '附件，如:1,2,3',
+  `check_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '审核状态:0待审核,1审核中,2审核通过,3审核不通过,4撤销审核',
+  `check_flow_id` int(11) NOT NULL DEFAULT 0 COMMENT '审核流程id',
+  `check_step_sort` int(11) NOT NULL DEFAULT 0 COMMENT '当前审批步骤',
+  `check_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '当前审批人ID，如:1,2,3',
+  `check_last_uid` varchar(500) NOT NULL DEFAULT '' COMMENT '上一审批人',
+  `check_history_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '历史审批人ID，如:1,2,3',
+  `check_copy_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '抄送人ID，如:1,2,3',
+  `check_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '审核通过时间',
+  `admin_id` int(11) NOT NULL COMMENT '创建人ID',
+  `did` int(11) NOT NULL COMMENT '创建人部门ID',
+  `create_time` bigint(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT '0' COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '外出表';
+
+-- ----------------------------
+-- Table structure for oa_overtimes
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_overtimes`;
+CREATE TABLE `oa_overtimes`  (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `start_date` bigint(11) NOT NULL DEFAULT '0' COMMENT '开始日期',
+  `end_date` bigint(11) NOT NULL DEFAULT '0' COMMENT '结束日期',
+  `start_span` int(10) NOT NULL DEFAULT '0' COMMENT '时间段:1上午,2下午',
+  `end_span` int(10) NOT NULL DEFAULT '0' COMMENT '时间段:1上午,2下午',
+  `duration` decimal(10, 1) NOT NULL DEFAULT 0.0 COMMENT '时长(工作日)',
+  `reason` text NOT NULL COMMENT '出差原因',
+  `file_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '附件，如:1,2,3',
+  `check_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '审核状态:0待审核,1审核中,2审核通过,3审核不通过,4撤销审核',
+  `check_flow_id` int(11) NOT NULL DEFAULT 0 COMMENT '审核流程id',
+  `check_step_sort` int(11) NOT NULL DEFAULT 0 COMMENT '当前审批步骤',
+  `check_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '当前审批人ID，如:1,2,3',
+  `check_last_uid` varchar(500) NOT NULL DEFAULT '' COMMENT '上一审批人',
+  `check_history_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '历史审批人ID，如:1,2,3',
+  `check_copy_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '抄送人ID，如:1,2,3',
+  `check_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '审核通过时间',
+  `admin_id` int(11) NOT NULL COMMENT '创建人ID',
+  `did` int(11) NOT NULL COMMENT '创建人部门ID',
+  `create_time` bigint(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT '0' COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '加班表';
+
+-- ----------------------------
+-- Table structure for oa_work
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_work`;
+CREATE TABLE `oa_work`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `types` tinyint(1) UNSIGNED NULL DEFAULT 0 COMMENT '类型：1 日报 2周报 3月报',
+  `start_date` bigint(11) NOT NULL DEFAULT '0' COMMENT '开始日期',
+  `end_date` bigint(11) NOT NULL DEFAULT '0' COMMENT '结束日期',
+  `to_uids` mediumtext  NULL COMMENT '接受人员ID',
+  `works` mediumtext  NULL COMMENT '汇报工作内容',
+  `plans` mediumtext  NULL COMMENT '计划工作内容',
+  `remark` mediumtext  NULL COMMENT '其他事项',
+  `file_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '附件，如:1,2,3',
+  `send_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '发送时间',
+  `admin_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人id',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT '0' COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '汇报工作表';
+
+-- ----------------------------
+-- Table structure for oa_work_record
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_work_record`;
+CREATE TABLE `oa_work_record`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `work_id` int(11) UNSIGNED NOT NULL COMMENT '汇报工作id',
+  `from_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '发送人id',
+  `to_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '接收人id',
+  `send_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '发送日期',
+  `read_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '阅读时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT '0' COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '汇报工作发送记录表';
+
+-- ----------------------------
+-- Table structure for oa_customer_grade
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_customer_grade`;
+CREATE TABLE `oa_customer_grade`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '客户等级名称',
+  `sort` int(01) NOT NULL DEFAULT 0 COMMENT '排序，越大越靠前',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态: 0禁用 1启用',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '客户等级';
+
+-- ----------------------------
+-- Records of oa_customer_grade
+-- ----------------------------
+INSERT INTO `oa_customer_grade` VALUES (1, '普通客户',0, 1, 1637987189, 0, 0);
+INSERT INTO `oa_customer_grade` VALUES (2, 'VIP客户',0, 1, 1637987199, 0, 0);
+
+-- ----------------------------
+-- Table structure for oa_customer_source
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_customer_source`;
+CREATE TABLE `oa_customer_source`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '客户渠道名称',
+  `sort` int(01) NOT NULL DEFAULT 0 COMMENT '排序，越大越靠前',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：0禁用 1启用',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '客户来源';
+
+-- ----------------------------
+-- Records of oa_customer_source
+-- ----------------------------
+INSERT INTO `oa_customer_source` VALUES (1, '独立开发',0, 1, 1637987189, 0, 0);
+INSERT INTO `oa_customer_source` VALUES (2, '微信公众号',0, 1, 1637987199, 0, 0);
+INSERT INTO `oa_customer_source` VALUES (3, '今日头条',0, 1, 1637987199, 0, 0);
+INSERT INTO `oa_customer_source` VALUES (4, '百度搜索',0, 1, 1637987199, 0, 0);
+INSERT INTO `oa_customer_source` VALUES (5, '销售活动',0, 1, 1637987199, 0, 0);
+INSERT INTO `oa_customer_source` VALUES (6, '电话来访',0, 1, 1637987199, 0, 0);
+INSERT INTO `oa_customer_source` VALUES (7, '客户介绍',0, 1, 1637987199, 0, 0);
+INSERT INTO `oa_customer_source` VALUES (8, '其他来源',0, 1, 1637987199, 0, 0);
+
+-- ----------------------------
+-- Table structure for oa_basic_customer
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_basic_customer`;
+CREATE TABLE `oa_basic_customer`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `types` varchar(100) NOT NULL DEFAULT '' COMMENT '数据类型:1客户状态,2客户意向,3跟进方式,4销售阶段，5看后期增加',
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '名称',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '客户常规数据';
+
+-- ----------------------------
+-- Records of oa_basic_customer
+-- ----------------------------
+INSERT INTO `oa_basic_customer` VALUES (1, '1', '新进客户', 1, 1732606239, 0);
+INSERT INTO `oa_basic_customer` VALUES (2, '1', '跟进客户', 1, 1732606269, 0);
+INSERT INTO `oa_basic_customer` VALUES (3, '1', '正式客户', 1, 1732606279, 0);
+INSERT INTO `oa_basic_customer` VALUES (4, '1', '流失客户', 1, 1732606303, 0);
+INSERT INTO `oa_basic_customer` VALUES (5, '1', '成交客户', 1, 1732606311, 0);
+INSERT INTO `oa_basic_customer` VALUES (6, '2', '意向不明', 1, 1732606331, 0);
+INSERT INTO `oa_basic_customer` VALUES (7, '2', '意向一般', 1, 1732606346, 0);
+INSERT INTO `oa_basic_customer` VALUES (8, '2', '意向强烈', 1, 1732606354, 0);
+INSERT INTO `oa_basic_customer` VALUES (9, '3', '电话', 1, 1732606405, 0);
+INSERT INTO `oa_basic_customer` VALUES (10, '3', '微信', 1, 1732606409, 0);
+INSERT INTO `oa_basic_customer` VALUES (11, '3', '上门', 1, 1732606413, 0);
+INSERT INTO `oa_basic_customer` VALUES (12, '3', '其他', 1, 1732606418, 0);
+INSERT INTO `oa_basic_customer` VALUES (13, '4', '立项评估', 1, 1732606467, 0);
+INSERT INTO `oa_basic_customer` VALUES (14, '4', '初期沟通', 1, 1732606475, 0);
+INSERT INTO `oa_basic_customer` VALUES (15, '4', '需求分析', 1, 1732606483, 0);
+INSERT INTO `oa_basic_customer` VALUES (16, '4', '商务谈判', 1, 1732606490, 0);
+INSERT INTO `oa_basic_customer` VALUES (17, '4', '方案制定', 1, 1732606499, 0);
+INSERT INTO `oa_basic_customer` VALUES (18, '4', '合同签订', 1, 1732606506, 0);
+INSERT INTO `oa_basic_customer` VALUES (19, '4', '丢单失单', 1, 1732607018, 0);
+
+-- ----------------------------
+-- Table structure for oa_customer
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_customer`;
+CREATE TABLE `oa_customer`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `name` varchar(255) NOT NULL DEFAULT '' COMMENT '客户名称',
+  `source_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '客户来源id',
+  `grade_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '客户等级id',
+  `industry_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '所属行业id',
+  `services_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '客户意向id',
+  `provinceid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '省份id',
+  `cityid` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '城市id',
+  `distid` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '区县id',
+  `townid` bigint(20) NOT NULL DEFAULT 0 COMMENT '城镇id',
+  `address` varchar(255) NOT NULL DEFAULT '' COMMENT '客户联系地址',
+  `customer_status` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '客户状态：0未设置',
+  `intent_status` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '意向状态：0未设置',
+  `contact_first` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '第一联系人id',
+  `admin_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '录入人',
+  `belong_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '所属人',
+  `belong_did` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '所属部门',
+  `belong_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '获取时间',
+  `distribute_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '最新分配时间',
+  `follow_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '最新跟进时间',
+  `next_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '下次跟进时间',
+  `discard_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '废弃时间',
+  `share_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '共享人员，如:1,2,3',
+  `content` mediumtext  NULL COMMENT '客户描述',
+  `market` mediumtext  NULL COMMENT '主要经营业务',
+  `remark` mediumtext  NULL COMMENT '备注信息',
+  `tax_bank` varchar(100) NOT NULL DEFAULT '' COMMENT '开户银行',
+  `tax_banksn` varchar(100) NOT NULL DEFAULT '' COMMENT '银行帐号',
+  `tax_num` varchar(100) NOT NULL DEFAULT '' COMMENT '纳税人识别号',
+  `tax_mobile` varchar(20) NOT NULL DEFAULT '' COMMENT '开票电话',
+  `tax_address` varchar(200) NOT NULL DEFAULT '' COMMENT '开票地址',
+  `is_lock` tinyint(1) NOT NULL DEFAULT 0 COMMENT '锁定状态：0未锁,1已锁',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '添加时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '修改时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '客户表';
+
+-- ----------------------------
+-- Table structure for oa_customer_trace
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_customer_trace`;
+CREATE TABLE `oa_customer_trace`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `cid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '客户ID',
+  `contact_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '联系人id',
+  `chance_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '销售机会id',
+  `types` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '跟进方式',
+  `stage` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '当前阶段',
+  `content` mediumtext NULL COMMENT '跟进内容',
+  `follow_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '跟进时间',
+  `next_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '下次跟进时间',
+  `file_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '共享人员，如:1,2,3',
+  `admin_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '客户跟进记录表';
+
+-- ----------------------------
+-- Table structure for oa_customer_contact
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_customer_contact`;
+CREATE TABLE `oa_customer_contact`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `cid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '客户ID',
+  `is_default` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否是第一联系人',
+  `name` varchar(100) NOT NULL DEFAULT '' COMMENT '姓名',
+  `sex` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '用户性别:0未知,1男,2女',
+  `mobile` char(20) NOT NULL DEFAULT '' COMMENT '手机号码',
+  `qq` char(20) NOT NULL DEFAULT '' COMMENT 'QQ号',
+  `wechat` char(20) NOT NULL DEFAULT '' COMMENT '微信号',
+  `email` char(100) NOT NULL DEFAULT '' COMMENT '邮件地址',
+  `nickname` varchar(50) NOT NULL DEFAULT '' COMMENT '称谓',
+  `department` varchar(50) NOT NULL DEFAULT '' COMMENT '部门',
+  `position` varchar(50) NOT NULL DEFAULT '' COMMENT '职位',
+  `birthday` varchar(50) NOT NULL DEFAULT '' COMMENT '生日',
+  `address` varchar(255) NOT NULL DEFAULT '' COMMENT '家庭住址',
+  `family` mediumtext NULL COMMENT '家庭成员',
+  `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '客户联系人表';
+
+-- ----------------------------
+-- Table structure for oa_customer_chance
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_customer_chance`;
+CREATE TABLE `oa_customer_chance`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(255) NOT NULL DEFAULT '' COMMENT '销售机会主题',
+  `cid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '客户ID',
+  `contact_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '联系人id',
+  `services_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '需求服务id',
+  `stage` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '当前阶段',
+  `content` mediumtext  NULL COMMENT '需求描述',
+  `discovery_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '发现时间',
+  `expected_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '预计签单时间',
+  `expected_amount` decimal(15, 2) NULL DEFAULT 0.00 COMMENT '预计签单金额',
+  `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人',
+  `belong_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '所属人',
+  `assist_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '协助人员，如:1,2,3',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '客户线索机会表';
+
+-- ----------------------------
+-- Table structure for oa_customer_file
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_customer_file`;
+CREATE TABLE `oa_customer_file`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `customer_id` int(11) UNSIGNED NOT NULL COMMENT '关联客户id',
+  `file_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '相关联附件id',
+  `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '修改时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '客户附件关联表';
+
+-- ----------------------------
+-- Table structure for oa_property_cate
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_property_cate`;
+CREATE TABLE `oa_property_cate`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '分类名称',
+  `pid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '分类id',
+  `sort` int(11) NOT NULL DEFAULT 0 COMMENT '排序：越大越靠前',
+  `desc` varchar(1000) NULL DEFAULT '' COMMENT '分类说明',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `admin_id` int(11) NOT NULL DEFAULT 0 COMMENT '创建人',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '资产分类';
+
+-- ----------------------------
+-- Records of oa_property_cate
+-- ----------------------------
+INSERT INTO `oa_property_cate` VALUES (1, '计算机', 0, 0, '', 1, 0, 1733384708, 1733385234);
+INSERT INTO `oa_property_cate` VALUES (2, '网络设备', 0, 0, '', 1, 0, 1733385274, 0);
+
+-- ----------------------------
+-- Table structure for oa_property_unit
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_property_unit`;
+CREATE TABLE `oa_property_unit`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '单位名称',
+  `sort` int(11) NOT NULL DEFAULT 0 COMMENT '排序：越大越靠前',
+  `desc` varchar(1000) NULL DEFAULT '' COMMENT '描述',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '资产单位';
+
+-- ----------------------------
+-- Records of oa_property_unit
+-- ----------------------------
+INSERT INTO `oa_property_unit` VALUES (1, '台', 0, '', 1, 1733385300, 0);
+INSERT INTO `oa_property_unit` VALUES (2, '只', 0, '', 1, 1733385307, 0);
+INSERT INTO `oa_property_unit` VALUES (3, '个', 0, '', 1, 1733385313, 0);
+INSERT INTO `oa_property_unit` VALUES (4, '瓶', 0, '', 1, 1733385321, 0);
+INSERT INTO `oa_property_unit` VALUES (5, '盒', 0, '', 1, 1733385328, 0);
+INSERT INTO `oa_property_unit` VALUES (6, '箱', 0, '', 1, 1733385333, 0);
+
+-- ----------------------------
+-- Table structure for oa_property_brand
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_property_brand`;
+CREATE TABLE `oa_property_brand`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '品牌名称',
+  `sort` int(11) NOT NULL DEFAULT 0 COMMENT '排序：越大越靠前',
+  `desc` varchar(1000) NULL DEFAULT '' COMMENT '描述',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '资产品牌';
+-- ----------------------------
+-- Records of oa_property_brand
+-- ----------------------------
+INSERT INTO `oa_property_brand` VALUES (1, '品牌一', 0, '', 1, 1733385289, 0);
+INSERT INTO `oa_property_brand` VALUES (2, '品牌二', 0, '', 1, 1733385289, 0);
+
+-- ----------------------------
+-- Table structure for oa_property
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_property`;
+CREATE TABLE `oa_property`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '名称',
+  `code` varchar(100) NOT NULL DEFAULT '' COMMENT '编号',
+  `thumb` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '缩略图',
+  `cate_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '资产分类id',
+  `brand_id`int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '品牌名称',
+  `unit_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '单位',
+  `quality_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '质保到期日期',
+  `buy_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '购进日期',
+  `price` decimal(15, 2) NULL DEFAULT 0.00 COMMENT '价格',
+  `rate` decimal(15, 2) NULL DEFAULT 0.00 COMMENT '年折旧率',
+  `model` varchar(255) NOT NULL DEFAULT '' COMMENT '规格型号',
+  `address` varchar(255) NOT NULL DEFAULT '' COMMENT '所放位置',
+  `user_dids` varchar(255) NOT NULL DEFAULT '' COMMENT '使用部门',
+  `user_ids`  varchar(255) NOT NULL DEFAULT '' COMMENT '使用人员',
+  `content` mediumtext  NULL COMMENT '资产描述',
+  `file_ids` varchar(255) NOT NULL DEFAULT '' COMMENT '资产附件ids,如:1,2,3',
+  `source` tinyint(1) NOT NULL DEFAULT 1 COMMENT '来源：1采购,2赠与,3自产,4其他',
+  `purchase_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '采购单ID',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0闲置,1在用,2维修,3报废,4丢失',
+  `admin_id` int(11) NOT NULL DEFAULT 0 COMMENT '创建人',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_id` int(11) NOT NULL DEFAULT 0 COMMENT '编辑人',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '资产表';
+
+-- ----------------------------
+-- Table structure for oa_property_repair
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_property_repair`;
+CREATE TABLE `oa_property_repair`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `property_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '资产id',
+  `repair_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '维修日期',
+  `cost` decimal(15, 2) NULL DEFAULT 0.00 COMMENT '维修费用',
+  `content` mediumtext  NULL COMMENT '维修原因',
+  `file_ids` varchar(255) NOT NULL DEFAULT '' COMMENT '附件ids,如:1,2,3',
+  `director_id` int(11) NOT NULL DEFAULT 0 COMMENT '跟进人',
+  `admin_id` int(11) NOT NULL DEFAULT 0 COMMENT '创建人',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '资产维修记录表';
+
+-- ----------------------------
+-- Table structure for oa_basic_adm
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_basic_adm`;
+CREATE TABLE `oa_basic_adm`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `types` varchar(100) NOT NULL DEFAULT '' COMMENT '数据类型:1车辆费用类型,2',
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '名称',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `create_time` int(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` int(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '行政模块常规数据';
+
+-- ----------------------------
+-- Records of oa_cost_cate
+-- ----------------------------
+INSERT INTO `oa_basic_adm` VALUES (1, '1', '燃油费', 1, 1706840194, 0);
+INSERT INTO `oa_basic_adm` VALUES (2, '1', '停车费', 1, 1706840194, 0);
+INSERT INTO `oa_basic_adm` VALUES (3, '1', '洗车费', 1, 1706840194, 0);
+INSERT INTO `oa_basic_adm` VALUES (4, '1', '保养费', 1, 1706840194, 0);
+INSERT INTO `oa_basic_adm` VALUES (5, '1', '维修费', 1, 1706840194, 0);
+INSERT INTO `oa_basic_adm` VALUES (6, '1', '过路费', 1, 1706840194, 0);
+INSERT INTO `oa_basic_adm` VALUES (7, '1', '过桥费', 1, 1706840194, 0);
+INSERT INTO `oa_basic_adm` VALUES (8, '1', '养路费', 1, 1706840194, 0);
+INSERT INTO `oa_basic_adm` VALUES (9, '1', '保险费', 1, 1706840194, 0);
+INSERT INTO `oa_basic_adm` VALUES (10, '1', '年检费', 1, 1706840194, 0);
+INSERT INTO `oa_basic_adm` VALUES (11, '1', '违章费', 1, 1706840194, 0);
+INSERT INTO `oa_basic_adm` VALUES (12, '1', '其他费', 1, 1706840194, 0);
+
+-- ----------------------------
+-- Table structure for oa_official_docs
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_official_docs`;
+CREATE TABLE `oa_official_docs`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(255) NOT NULL DEFAULT '' COMMENT '公文主题',
+  `code` varchar(100) NOT NULL DEFAULT '' COMMENT '公文编号',
+  `secrets` int(2) NOT NULL DEFAULT 1 COMMENT '密级程度:1公开,2秘密,3机密',
+  `urgency` int(2) NOT NULL DEFAULT 1 COMMENT '紧急程度:1普通,2紧急,3加急',
+  `send_uids` varchar(255) NOT NULL DEFAULT '' COMMENT '主送uid',
+  `copy_uids` varchar(255) NOT NULL DEFAULT '' COMMENT '抄送uid',
+  `share_uids` varchar(255) NOT NULL DEFAULT '' COMMENT '分享查阅uid',
+  `content` mediumtext NULL COMMENT '公文内容',
+  `file_ids` varchar(255) NOT NULL DEFAULT '' COMMENT '附件ids,如:1,2,3',
+  `draft_uid` int(11) NOT NULL DEFAULT 0 COMMENT '拟稿人',
+  `did` int(11) NOT NULL DEFAULT 0 COMMENT '拟稿部门',
+  `draft_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '拟稿日期',
+  `admin_id` int(11) NOT NULL DEFAULT 0 COMMENT '创建人',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  `check_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '审核状态:0待审核,1审核中,2审核通过,3审核不通过,4撤销审核',
+  `check_flow_id` int(11) NOT NULL DEFAULT 0 COMMENT '审核流程id',
+  `check_step_sort` int(11) NOT NULL DEFAULT 0 COMMENT '当前审批步骤',
+  `check_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '当前审批人ID，如:1,2,3',
+  `check_last_uid` varchar(500) NOT NULL DEFAULT '' COMMENT '上一审批人',
+  `check_history_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '历史审批人ID，如:1,2,3',
+  `check_copy_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '抄送人ID，如:1,2,3',
+  `check_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '审核通过时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '公文表';
+
+-- ----------------------------
+-- Table structure for oa_seal
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_seal`;
+CREATE TABLE `oa_seal`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(255) NOT NULL DEFAULT '' COMMENT '用章申请主题',
+  `seal_cate_id` int(11) NOT NULL DEFAULT 0 COMMENT '印章类型', 
+  `content` mediumtext NULL COMMENT '盖章内容',
+  `file_ids` varchar(255) NOT NULL DEFAULT '' COMMENT '附件ids,如:1,2,3',
+  `did` int(11) NOT NULL DEFAULT 0 COMMENT '用印部门',
+  `num` int(11) NOT NULL DEFAULT 0 COMMENT '盖章次数',
+  `use_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '预期用印日期',
+  `is_borrow` int(1) NOT NULL DEFAULT 0 COMMENT '印章是否外借:0,1',
+  `start_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '印章借用日期',
+  `end_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '结束借用日期',
+  `status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '状态:0待使用,1已使用(已外借),2已结束归还',
+  `admin_id` int(11) NOT NULL DEFAULT 0 COMMENT '创建人',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  `check_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '审核状态:0待审核,1审核中,2审核通过,3审核不通过,4撤销审核',
+  `check_flow_id` int(11) NOT NULL DEFAULT 0 COMMENT '审核流程id',
+  `check_step_sort` int(11) NOT NULL DEFAULT 0 COMMENT '当前审批步骤',
+  `check_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '当前审批人ID，如:1,2,3',
+  `check_last_uid` varchar(500) NOT NULL DEFAULT '' COMMENT '上一审批人',
+  `check_history_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '历史审批人ID，如:1,2,3',
+  `check_copy_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '抄送人ID，如:1,2,3',
+  `check_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '审核通过时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '用章申请表';
+
+-- ----------------------------
+-- Table structure for oa_news
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_news`;
+CREATE TABLE `oa_news`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(225) NULL DEFAULT NULL COMMENT '标题',
+  `content` text NOT NULL COMMENT '新闻内容',
+  `src` varchar(100) NULL DEFAULT NULL COMMENT '关联链接',
+  `sort` int(11) NOT NULL DEFAULT 0 COMMENT '排序',
+  `file_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '相关附件',
+  `admin_id` int(11) NOT NULL DEFAULT 0 COMMENT '发布人id',
+  `create_time` bigint(11) NOT NULL DEFAULT 0,
+  `update_time` bigint(11) NOT NULL DEFAULT 0,
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '公司新闻表';
+
+
+-- ----------------------------
+-- Table structure for oa_product_cate
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_product_cate`;
+CREATE TABLE `oa_product_cate`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '分类名称',
+  `pid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '分类id',
+  `sort` int(11) NOT NULL DEFAULT 0 COMMENT '排序：越大越靠前',
+  `desc` varchar(1000) NULL DEFAULT '' COMMENT '分类说明',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `admin_id` int(11) NOT NULL DEFAULT 0 COMMENT '创建人',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '产品分类';
+
+-- ----------------------------
+-- Records of oa_product_cate
+-- ----------------------------
+INSERT INTO `oa_product_cate` VALUES (1, '产品分类一', 0, 0, '', 1, 0, 1733385454, 0);
+INSERT INTO `oa_product_cate` VALUES (2, '产品分类二', 0, 0, '', 1, 0, 1733385467, 0);
+
+-- ----------------------------
+-- Table structure for oa_product
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_product`;
+CREATE TABLE `oa_product`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '产品名称',
+  `cate_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '产品分类id',
+  `thumb` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '缩略图id',
+  `code` varchar(255) NOT NULL DEFAULT '' COMMENT '产品编码',
+  `barcode` varchar(255) NOT NULL DEFAULT '' COMMENT '条形码',
+  `unit` varchar(100) NOT NULL DEFAULT '' COMMENT '单位',
+  `specs` varchar(100) NOT NULL DEFAULT '' COMMENT '规格',
+  `brand` varchar(100) NOT NULL DEFAULT '' COMMENT '品牌',
+  `producer` varchar(100) NOT NULL DEFAULT '' COMMENT '生产商',
+  `base_price` decimal(15, 2) NULL DEFAULT 0.00 COMMENT '成本价',
+  `purchase_price` decimal(15, 2) NULL DEFAULT 0.00 COMMENT '采购价',
+  `sale_price` decimal(15, 2) NULL DEFAULT 0.00 COMMENT '销售价',
+  `content` text NULL COMMENT '产品描述',
+  `album_ids` varchar(255) NOT NULL DEFAULT '' COMMENT '产品相册ids,如:1,2,3',
+  `file_ids` varchar(255) NOT NULL DEFAULT '' COMMENT '产品附件ids,如:1,2,3',
+  `stock` int(11) NOT NULL DEFAULT 0 COMMENT '库存',
+  `is_object` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否是实物,1是2不是',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：0禁用 1启用',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '产品表';
+
+-- ----------------------------
+-- Table structure for oa_services
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_services`;
+CREATE TABLE `oa_services`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '服务名称',
+  `cate_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '服务分类id',
+  `price` decimal(15, 2) NULL DEFAULT 0.00 COMMENT '服务费用',
+  `content` text NULL COMMENT '服务描述',
+  `sort` int(10) NOT NULL DEFAULT 0 COMMENT '排序',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：0禁用 1启用',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '服务表';
+
+-- ----------------------------
+-- Records of oa_services
+-- ----------------------------
+INSERT INTO `oa_services` VALUES (1, '定制服务', 0, 999.00, NULL, 0, 1, 1733385487, 1733385493, 0);
+INSERT INTO `oa_services` VALUES (2, '咨询服务', 0, 99.00, NULL, 0, 1, 1733385500, 0, 0);
+
+-- ----------------------------
+-- Table structure for oa_supplier
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_supplier`;
+CREATE TABLE `oa_supplier`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(255) NOT NULL DEFAULT '' COMMENT '供应商名称',
+  `code` varchar(255) NOT NULL DEFAULT '' COMMENT '供应商编号',
+  `phone` varchar(255) NOT NULL DEFAULT '' COMMENT '供应商电话',
+  `email` varchar(255) NOT NULL DEFAULT '' COMMENT '供应商邮箱',
+  `address` varchar(255) NOT NULL DEFAULT '' COMMENT '供应商联系地址',
+  `file_ids` varchar(255) NOT NULL DEFAULT '' COMMENT '附件ids,如:1,2,3',
+  `products` varchar(500) NOT NULL DEFAULT '' COMMENT '供应商商品',
+  `content` text NULL COMMENT '供应商描述',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '供应商状态：0禁用,1启用',
+  `tax_num` varchar(100) NOT NULL DEFAULT '' COMMENT '纳税人识别号',
+  `tax_mobile` varchar(20) NOT NULL DEFAULT '' COMMENT '开票电话',
+  `tax_address` varchar(200) NOT NULL DEFAULT '' COMMENT '开票地址',
+  `tax_bank` varchar(60) NOT NULL DEFAULT '' COMMENT '开户银行',
+  `tax_banksn` varchar(60) NOT NULL DEFAULT '' COMMENT '银行帐号',
+  `file_license_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '营业执照附件，如:1,2,3',
+  `file_idcard_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '身份证附件，如:1,2,3',
+  `file_bankcard_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '银行卡附件，如:1,2,3',
+  `file_openbank_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '开户行附件，如:1,2,3',
+  `tax_rate` decimal(15, 2) NULL DEFAULT 0.00 COMMENT '税率',
+  `admin_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '录入人',
+  `sort` int(0) UNSIGNED NOT NULL DEFAULT 0 COMMENT '排序',
+  `create_time` int(11) NOT NULL DEFAULT 0 COMMENT '添加时间',
+  `update_time` int(11) NOT NULL DEFAULT 0 COMMENT '修改时间',
+  `delete_time` int(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '供应商表';
+
+-- ----------------------------
+-- Table structure for oa_supplier_contact
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_supplier_contact`;
+CREATE TABLE `oa_supplier_contact`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `sid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '供应商ID',
+  `is_default` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否是第一联系人',
+  `name` varchar(100) NOT NULL DEFAULT '' COMMENT '姓名',
+  `sex` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '用户性别:0未知,1男,2女',
+  `mobile` varchar(20) NOT NULL DEFAULT '' COMMENT '手机号码',
+  `qq` varchar(20) NOT NULL DEFAULT '' COMMENT 'QQ号',
+  `wechat` varchar(100) NOT NULL DEFAULT '' COMMENT '微信号',
+  `email` varchar(100) NOT NULL DEFAULT '' COMMENT '邮件地址',
+  `nickname` varchar(50) NOT NULL DEFAULT '' COMMENT '称谓',
+  `department` varchar(50) NOT NULL DEFAULT '' COMMENT '部门',
+  `position` varchar(50) NOT NULL DEFAULT '' COMMENT '职务',
+  `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人',
+  `create_time` int(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` int(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` int(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '供应商联系人表';
+
+-- ----------------------------
+-- Table structure for oa_purchased_cate
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_purchased_cate`;
+CREATE TABLE `oa_purchased_cate`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '分类名称',
+  `pid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '分类id',
+  `sort` int(11) NOT NULL DEFAULT 0 COMMENT '排序：越大越靠前',
+  `desc` varchar(1000) NULL DEFAULT '' COMMENT '分类说明',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `admin_id` int(11) NOT NULL DEFAULT 0 COMMENT '创建人',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '采购品分类';
+
+-- ----------------------------
+-- Records of oa_purchased_cate
+-- ----------------------------
+INSERT INTO `oa_purchased_cate` VALUES (1, '采购品分类一', 0, 0, '', 1, 0, 1733385535, 0);
+INSERT INTO `oa_purchased_cate` VALUES (2, '采购品分类二', 0, 0, '', 1, 0, 1733385542, 0);
+
+-- ----------------------------
+-- Table structure for oa_purchased
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_purchased`;
+CREATE TABLE `oa_purchased`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '采购品名称',
+  `cate_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '采购分类id',
+  `thumb` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '缩略图id',
+  `code` varchar(255) NOT NULL DEFAULT '' COMMENT '产品编码',
+  `barcode` varchar(255) NOT NULL DEFAULT '' COMMENT '条形码',
+  `unit` varchar(100) NOT NULL DEFAULT '' COMMENT '单位',
+  `specs` varchar(100) NOT NULL DEFAULT '' COMMENT '规格',
+  `brand` varchar(100) NOT NULL DEFAULT '' COMMENT '品牌',
+  `producer` varchar(100) NOT NULL DEFAULT '' COMMENT '生产商',
+  `purchase_price` decimal(15, 2) NULL DEFAULT 0.00 COMMENT '采购价',
+  `sale_price` decimal(15, 2) NULL DEFAULT 0.00 COMMENT '销售价',
+  `content` text NULL COMMENT '商品描述',
+  `album_ids` varchar(255) NOT NULL DEFAULT '' COMMENT '采购品相册ids,如:1,2,3',
+  `file_ids` varchar(255) NOT NULL DEFAULT '' COMMENT '采购品附件ids,如:1,2,3',
+  `stock` int(11) NOT NULL DEFAULT 0 COMMENT '库存',
+  `is_object` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否是实物,1是2不是',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：0禁用 1启用',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '采购品表';
+
+
+-- ----------------------------
+-- Table structure for oa_contract_cate
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_contract_cate`;
+CREATE TABLE `oa_contract_cate`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '合同类别名称',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '合同类别';
+
+-- ----------------------------
+-- Records of oa_contract_cate
+-- ----------------------------
+INSERT INTO `oa_contract_cate` VALUES (1, '合同分类一', 1, 1637987189, 0,0);
+INSERT INTO `oa_contract_cate` VALUES (2, '合同分类二', 1, 1637987199, 0,0);
+
+-- ----------------------------
+-- Table structure for oa_contract
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_contract`;
+CREATE TABLE `oa_contract`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `pid` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '父协议id',
+  `code` varchar(255) NOT NULL DEFAULT '' COMMENT '合同编号',
+  `name` varchar(255) NOT NULL DEFAULT '' COMMENT '合同名称',
+  `cate_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '分类id',
+  `types` tinyint(1) NOT NULL DEFAULT 1 COMMENT '合同性质:1普通合同2商品合同3服务合同',
+  `subject_id` varchar(255) NOT NULL DEFAULT '' COMMENT '签约主体',
+  `customer_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联客户ID,预设数据',
+  `customer` varchar(255) NOT NULL DEFAULT '' COMMENT '客户名称',
+  `contact_name` varchar(255) NOT NULL DEFAULT '' COMMENT '客户代表',
+  `contact_mobile` varchar(255) NOT NULL DEFAULT '' COMMENT '客户电话',
+  `contact_address` varchar(255) NOT NULL DEFAULT '' COMMENT '客户地址',
+  `start_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '合同开始时间',
+  `end_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '合同结束时间',
+  `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人',
+  `prepared_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '合同制定人',
+  `sign_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '合同签订人',
+  `keeper_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '合同保管人', 
+  `share_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '共享人员，如:1,2,3',
+  `file_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '相关附件，如:1,2,3',
+  `sign_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '合同签订时间',
+  `did` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '合同所属部门',
+  `cost` decimal(15, 2) NOT NULL DEFAULT 0.00 COMMENT '合同金额',
+  `content` mediumtext  NULL COMMENT '合同内容',
+  `is_tax` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否含税：0未含税,1含税',
+  `tax` decimal(15, 2) NOT NULL DEFAULT 0.00 COMMENT '税点',
+  `stop_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '中止人',
+  `stop_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '中止时间',
+  `stop_remark` mediumtext  NULL COMMENT '中止备注信息',
+  `void_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '作废人',
+  `void_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '作废时间',
+  `void_remark` mediumtext  NULL COMMENT '作废备注信息',
+  `archive_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '归档人',
+  `archive_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '归档时间',
+  `remark` mediumtext  NULL COMMENT '备注信息',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '添加时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '修改时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  `check_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '审核状态:0待审核,1审核中,2审核通过,3审核不通过,4撤销审核',
+  `check_flow_id` int(11) NOT NULL DEFAULT 0 COMMENT '审核流程id',
+  `check_step_sort` int(11) NOT NULL DEFAULT 0 COMMENT '当前审批步骤',
+  `check_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '当前审批人ID，如:1,2,3',
+  `check_last_uid` varchar(500) NOT NULL DEFAULT '' COMMENT '上一审批人',
+  `check_history_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '历史审批人ID，如:1,2,3',
+  `check_copy_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '抄送人ID，如:1,2,3',
+  `check_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '审核通过时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '销售合同表';
+
+-- ----------------------------
+-- Table structure for oa_purchase
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_purchase`;
+CREATE TABLE `oa_purchase`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `pid` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '父协议id',
+  `code` varchar(255) NOT NULL DEFAULT '' COMMENT '合同编号',
+  `name` varchar(255) NOT NULL DEFAULT '' COMMENT '合同名称',
+  `cate_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '分类id',
+  `types` tinyint(1) NOT NULL DEFAULT 1 COMMENT '合同性质:1普通采购2物品采购3服务采购',
+  `subject_id` varchar(255) NOT NULL DEFAULT '' COMMENT '签约主体',
+  `supplier_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联供应商ID',
+  `supplier` varchar(255) NOT NULL DEFAULT '' COMMENT '供应商名称',
+  `contact_name` varchar(255) NOT NULL DEFAULT '' COMMENT '供应商代表',
+  `contact_mobile` varchar(255) NOT NULL DEFAULT '' COMMENT '供应商电话',
+  `contact_address` varchar(255) NOT NULL DEFAULT '' COMMENT '供应商地址',
+  `start_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '合同开始时间',
+  `end_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '合同结束时间',
+  `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人',
+  `prepared_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '合同制定人',
+  `sign_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '合同签订人',
+  `keeper_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '合同保管人', 
+  `share_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '共享人员，如:1,2,3',
+  `file_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '相关附件，如:1,2,3',
+  `sign_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '合同签订时间',
+  `did` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '合同所属部门',
+  `cost` decimal(15, 2) NOT NULL DEFAULT 0.00 COMMENT '合同金额',
+  `content` mediumtext  NULL COMMENT '合同内容',
+  `stop_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '中止人',
+  `stop_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '中止时间',
+  `stop_remark` mediumtext  NULL COMMENT '中止备注信息',
+  `void_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '作废人',
+  `void_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '作废时间',
+  `void_remark` mediumtext  NULL COMMENT '作废备注信息',
+  `archive_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '归档人',
+  `archive_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '归档时间',
+  `remark` mediumtext  NULL COMMENT '备注信息',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '添加时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '修改时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  `check_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '审核状态:0待审核,1审核中,2审核通过,3审核不通过,4撤销审核',
+  `check_flow_id` int(11) NOT NULL DEFAULT 0 COMMENT '审核流程id',
+  `check_step_sort` int(11) NOT NULL DEFAULT 0 COMMENT '当前审批步骤',
+  `check_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '当前审批人ID，如:1,2,3',
+  `check_last_uid` varchar(500) NOT NULL DEFAULT '' COMMENT '上一审批人',
+  `check_history_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '历史审批人ID，如:1,2,3',
+  `check_copy_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '抄送人ID，如:1,2,3',
+  `check_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '审核通过时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '采购合同表';
+
+-- ----------------------------
+-- Table structure for oa_step
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_step`;
+CREATE TABLE `oa_step`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '步骤名称',
+  `sort` int(10) NOT NULL DEFAULT 0 COMMENT '排序',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '步骤表';
+
+-- ----------------------------
+-- Records of oa_step
+-- ----------------------------
+INSERT INTO `oa_step` VALUES (1, '立项阶段', 0,1, 1637987189, 0,0);
+INSERT INTO `oa_step` VALUES (2, '规划阶段', 0,1, 1637987189, 0,0);
+INSERT INTO `oa_step` VALUES (3, '执行阶段', 0,1, 1637987189, 0,0);
+INSERT INTO `oa_step` VALUES (4, '监控与控制阶段', 0,1, 1637987189, 0,0);
+INSERT INTO `oa_step` VALUES (5, '收尾阶段', 0,1, 1637987189, 0,0);
+
+-- ----------------------------
+-- Table structure for oa_work_cate
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_work_cate`;
+CREATE TABLE `oa_work_cate`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '工作类型名称',
+  `sort` int(10) NOT NULL DEFAULT 0 COMMENT '排序',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '工作类型';
+
+-- ----------------------------
+-- Records of oa_work_cate
+-- ----------------------------
+INSERT INTO `oa_work_cate` VALUES (1, '其他', 0,1, 1637987189, 0);
+INSERT INTO `oa_work_cate` VALUES (2, '方案策划',0, 1, 1637987199, 0);
+INSERT INTO `oa_work_cate` VALUES (3, '撰写文档',0, 1, 1637987199, 0);
+INSERT INTO `oa_work_cate` VALUES (4, '需求调研',0, 1, 1637987199, 0);
+INSERT INTO `oa_work_cate` VALUES (5, '需求沟通',0, 1, 1637987199, 0);
+INSERT INTO `oa_work_cate` VALUES (6, '参加会议',0, 1, 1637987199, 0);
+INSERT INTO `oa_work_cate` VALUES (7, '拜访客户',0, 1, 1637987199, 0);
+INSERT INTO `oa_work_cate` VALUES (8, '接待客户',0, 1, 1637987199, 0);
+
+-- ----------------------------
+-- Table structure for oa_project_cate
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_project_cate`;
+CREATE TABLE `oa_project_cate`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '项目类别名称',
+  `sort` int(10) NOT NULL DEFAULT 0 COMMENT '排序',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '项目类别';
+
+-- ----------------------------
+-- Records of oa_work_cate
+-- ----------------------------
+INSERT INTO `oa_project_cate` VALUES (1, '项目分类一', 0, 1, 1733385561, 0, 0);
+INSERT INTO `oa_project_cate` VALUES (2, '项目分类二', 0, 1, 1733385567, 0, 0);
+
+-- ----------------------------
+-- Table structure for oa_project
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_project`;
+CREATE TABLE `oa_project`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `name` varchar(255) NOT NULL DEFAULT '' COMMENT '项目名称',
+  `code` varchar(255) NOT NULL DEFAULT '' COMMENT '项目编号',
+  `amount` decimal(15, 2) NULL DEFAULT 0.00 COMMENT '项目金额',
+  `cate_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '分类ID',
+  `customer_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联客户ID',
+  `contract_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联合同协议ID',
+  `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人',
+  `director_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '项目负责人',
+  `did` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '项目所属部门',
+  `start_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '项目开始时间',
+  `end_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '项目结束时间',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：0未设置,1未开始,2进行中,3已完成,4已关闭',
+  `content` mediumtext  NULL COMMENT '项目描述',
+  `create_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '添加时间',
+  `update_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '修改时间',
+  `delete_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '项目表';
+
+-- ----------------------------
+-- Table structure for oa_project_step
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_project_step`;
+CREATE TABLE `oa_project_step`  (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `project_id` int(11) NOT NULL COMMENT '关联ID',
+  `title` varchar(255) NOT NULL DEFAULT '' COMMENT '阶段名称',
+  `director_uid` int(11) NOT NULL DEFAULT 0 COMMENT '阶段负责人ID',
+  `uids` varchar(500) NOT NULL DEFAULT '' COMMENT '阶段成员ID (使用逗号隔开) 1,2,3',
+  `sort` tinyint(4) NOT NULL DEFAULT 0 COMMENT '排序ID',
+  `is_current` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否是当前阶段',
+  `start_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '开始时间',
+  `end_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '结束时间',
+  `remark` varchar(500) NOT NULL DEFAULT '' COMMENT '阶段说明',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '修改时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '项目阶段步骤表';
+
+-- ----------------------------
+-- Table structure for oa_project_step_record
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_project_step_record`;
+CREATE TABLE `oa_project_step_record`  (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `project_id` int(11) NOT NULL DEFAULT 0 COMMENT '关联项目ID',
+  `step_id` int(11) NOT NULL DEFAULT 0 COMMENT '阶段步骤ID',
+  `check_uid` int(11) NOT NULL DEFAULT 0 COMMENT '确认人ID',
+  `check_time` bigint(11) NOT NULL COMMENT '确认时间',
+  `status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '1审核通过2审核拒绝3撤销',
+  `content` varchar(500) NOT NULL DEFAULT '' COMMENT '操作意见',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '项目阶段步骤记录表';
+
+-- ----------------------------
+-- Table structure for oa_project_user
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_project_user`;
+CREATE TABLE `oa_project_user`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `uid` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '项目成员id',
+  `project_id` int(11) UNSIGNED NOT NULL COMMENT '关联项目id',
+  `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人',
+  `create_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `delete_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '移除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '项目成员表';
+
+-- ----------------------------
+-- Table structure for oa_project_task
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_project_task`;
+CREATE TABLE `oa_project_task`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(255) NOT NULL DEFAULT '' COMMENT '主题',
+  `pid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '父级任务id',
+  `before_task` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '前置任务id',
+  `project_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联项目id',
+  `work_id` int(1) NOT NULL DEFAULT 0 COMMENT '关联工作类型',
+  `step_id` int(1) NOT NULL DEFAULT 0 COMMENT '关联项目阶段',
+  `plan_hours` decimal(10, 1) NOT NULL DEFAULT 0.00 COMMENT '预估工时',
+  `end_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '预计结束时间',
+  `over_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '实际结束时间',
+  `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人',
+  `director_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '指派给(负责人)',
+  `did` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '所属部门',
+  `assist_admin_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '协助人员，如:1,2,3',
+  `priority` tinyint(1) NOT NULL DEFAULT 1 COMMENT '优先级:1低,2中,3高,4紧急',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '任务状态：1待办的,2进行中,3已完成,4已拒绝,5已关闭',
+  `done_ratio` int(2) NOT NULL DEFAULT 0 COMMENT '完成进度：0,20,40,50,60,80',
+  `content` mediumtext  NULL COMMENT '任务描述',
+  `create_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '添加时间',
+  `update_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '修改时间',
+  `delete_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '项目任务表';
+
+-- ----------------------------
+-- Table structure for oa_project_document
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_project_document`;
+CREATE TABLE `oa_project_document`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `project_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联项目id',
+  `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人',
+  `title` varchar(255) NOT NULL DEFAULT '' COMMENT '标题',
+  `did` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '所属部门',
+  `file_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '附件ids',
+  `content` mediumtext  NULL COMMENT '文档内容',
+  `md_content` mediumtext  NULL COMMENT 'markdown文档内容',
+  `create_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '添加时间',
+  `update_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '修改时间',
+  `delete_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '项目文档表';
+
+-- ----------------------------
+-- Table structure for oa_project_file
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_project_file`;
+CREATE TABLE `oa_project_file`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `module` varchar(100) NOT NULL DEFAULT '' COMMENT '模块',
+  `topic_id` int(11) UNSIGNED NOT NULL COMMENT '关联主题id',
+  `file_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '相关联附件id',
+  `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人',
+  `create_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '修改时间',
+  `delete_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '项目附件关联表';
+
+-- ----------------------------
+-- Table structure for oa_disk
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_disk`;
+CREATE TABLE `oa_disk`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `pid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '所在文件夹目录ID',
+  `types` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '类型:0文件,1在线文档,2文件夹',
+  `action_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '相关联id',
+  `name` varchar(200) NOT NULL DEFAULT '' COMMENT '文件名称',
+  `file_ext` varchar(200) NOT NULL DEFAULT '' COMMENT '文件后缀名称',
+  `file_size` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '文件大小',
+  `is_star` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '重要与否',
+  `is_share` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '共享与否',
+  `share_dids` varchar(200) NOT NULL DEFAULT '' COMMENT '共享部门',
+  `share_ids` varchar(200) NOT NULL DEFAULT '' COMMENT '共享人',
+  `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人',
+  `create_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '修改时间',
+  `delete_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '删除时间',
+  `clear_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '清除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '网盘表';
+
+-- ----------------------------
+-- Table structure for oa_article
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_article`;
+CREATE TABLE `oa_article`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `name` varchar(255) NOT NULL DEFAULT '' COMMENT '文档标题',
+  `origin_url` varchar(255) NOT NULL DEFAULT '' COMMENT '来源地址',
+  `file_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '相关附件',
+  `content` text NOT NULL COMMENT '文章内容',
+  `admin_id` int(11) NOT NULL DEFAULT 0 COMMENT '作者',
+  `create_time` bigint(11) NOT NULL DEFAULT 0,
+  `update_time` bigint(11) NOT NULL DEFAULT 0,
+  `delete_time` bigint(11) NOT NULL DEFAULT 0,
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '文档表';
+
+-- ----------------------------
+-- Table structure for oa_edit_log
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_edit_log`;
+CREATE TABLE `oa_edit_log`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `name` varchar(100) NOT NULL DEFAULT '' COMMENT '标识',
+  `field` varchar(100) NOT NULL DEFAULT '' COMMENT '字段',
+  `action_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联id',
+  `second_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '第二关联id',
+  `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '操作人',
+  `old_content` mediumtext  NULL COMMENT '修改前的内容',
+  `new_content` mediumtext  NULL COMMENT '修改后的内容',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '修改记录表';
+
+-- ----------------------------
+-- Table structure for oa_comment
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_comment`;
+CREATE TABLE `oa_comment`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `module` varchar(100) NOT NULL DEFAULT '' COMMENT '模块',
+  `topic_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联主题id',
+  `pid` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '回复内容id',
+  `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人',
+  `to_uids` varchar(100) NOT NULL DEFAULT '' COMMENT '@用户id',
+  `content` mediumtext  NULL COMMENT '评论内容',
+  `md_content` mediumtext  NULL COMMENT 'markdown评论内容',
+  `create_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '添加时间',
+  `update_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '修改时间',
+  `delete_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '评论表';
+
+-- ----------------------------
+-- Table structure for oa_comment_read
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_comment_read`;
+CREATE TABLE `oa_comment_read`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `comment_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联评论id',
+  `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '已读人',
+  `create_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '添加时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '评论已读回执表';
+
+
+-- ----------------------------
+-- Table structure for oa_mobile_bar
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_mobile_bar`;
+CREATE TABLE `oa_mobile_bar`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '名称',
+  `icon` varchar(255) NOT NULL DEFAULT '' COMMENT '图标',
+  `url` varchar(255) NOT NULL DEFAULT '' COMMENT '链接',
+  `sort` int(11) NOT NULL DEFAULT 0 COMMENT '排序：越大越靠前',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `create_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '手机端Bar表';
+
+-- ----------------------------
+-- Records of oa_mobile_bar
+-- ----------------------------
+INSERT INTO `oa_mobile_bar` VALUES (1, '工作台', 'icon-gongzuotai1', '/qiye/index/index', 0, 1, 1723277311, 1733147213);
+INSERT INTO `oa_mobile_bar` VALUES (2, '客户', 'icon-kehu', '/qiye/customer/index', 0, 1, 1723277311, 1733147238);
+INSERT INTO `oa_mobile_bar` VALUES (3, '合同', 'icon-hetong2', '/qiye/contract/index', 0, 1, 1723277351, 1733147266);
+INSERT INTO `oa_mobile_bar` VALUES (4, '项目', 'icon-xiangmu1', '/qiye/project/index', 0, 1, 1723277356, 1733147298);
+INSERT INTO `oa_mobile_bar` VALUES (5, '消息', 'icon-xiaoxi1', '/qiye/msg/index', 0, 1, 1723277368, 1733147331);
+
+-- ----------------------------
+-- Table structure for oa_mobile_types
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_mobile_types`;
+CREATE TABLE `oa_mobile_types`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '名称',
+  `icon` varchar(255) NOT NULL DEFAULT '' COMMENT '图标',
+  `bgcolor` varchar(255) NOT NULL DEFAULT '' COMMENT '背景颜色',
+  `sort` int(11) NOT NULL DEFAULT 0 COMMENT '排序：越大越靠前',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `create_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '手机端工作台菜单类型表';
+
+-- ----------------------------
+-- Records of oa_mobile_types
+-- ----------------------------
+INSERT INTO `oa_mobile_types` VALUES (1, '办公审批', '', 'blue', 0, 1, 1723277311, 0);
+INSERT INTO `oa_mobile_types` VALUES (2, '效率工具', '', 'green', 0, 1, 1723277311, 0);
+INSERT INTO `oa_mobile_types` VALUES (3, '内部管理', '', 'yellow', 0, 1, 1723277351, 0);
+INSERT INTO `oa_mobile_types` VALUES (4, '财务管理', '', 'purple', 0, 1, 1723277356, 0);
+
+-- ----------------------------
+-- Table structure for oa_mobile_menu
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_mobile_menu`;
+CREATE TABLE `oa_mobile_menu`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '名称',
+  `icon` varchar(255) NOT NULL DEFAULT '' COMMENT '图标',
+  `bgcolor` varchar(255) NOT NULL DEFAULT '' COMMENT '背景颜色',
+  `url` varchar(255) NOT NULL DEFAULT '' COMMENT '链接',
+  `types` int(11) NOT NULL DEFAULT 0 COMMENT '关联菜单类型',
+  `sort` int(11) NOT NULL DEFAULT 0 COMMENT '排序：越大越靠前',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `create_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '手机端菜单表';
+
+-- ----------------------------
+-- Records of oa_mobile_menu
+-- ----------------------------
+INSERT INTO `oa_mobile_menu` VALUES (1, '审批申请', 'icon-shenpi','blue', '/qiye/approve/apply', 1, 0, 1, 1733146294, 1733152760, 0);
+INSERT INTO `oa_mobile_menu` VALUES (2, '我申请的', 'icon-wodeshenpi1','blue', '/qiye/approve/mylist', 1, 0, 1, 1733152749, 0, 0);
+INSERT INTO `oa_mobile_menu` VALUES (3, '我处理的', 'icon-chulishenpi','blue', '/qiye/approve/checklist', 1, 0, 1, 1733152798, 0, 0);
+INSERT INTO `oa_mobile_menu` VALUES (4, '抄送给我', 'icon-chaosong','blue', '/qiye/approve/copylist', 1, 0, 1, 1733152823, 0, 0);
+INSERT INTO `oa_mobile_menu` VALUES (5, '日程安排', 'icon-richeng','green', '/qiye/index/calendar', 2, 0, 1, 1733152855, 0, 0);
+INSERT INTO `oa_mobile_menu` VALUES (6, '工作记录', 'icon-jilu','green', '/qiye/index/schedule', 2, 0, 1, 1733152878, 0, 0);
+INSERT INTO `oa_mobile_menu` VALUES (7, '工作汇报', 'icon-huibao','green', '/qiye/index/work', 2, 0, 1, 1733152906, 0, 0);
+INSERT INTO `oa_mobile_menu` VALUES (8, '公告通知', 'icon-gonggaotongzhi','yellow', '/qiye/index/note', 3, 0, 1, 1733152965, 0, 0);
+INSERT INTO `oa_mobile_menu` VALUES (9, '公司新闻', 'icon-gongsixinwen','yellow', '/qiye/index/news', 3, 0, 1, 1733152993, 0, 0);
+INSERT INTO `oa_mobile_menu` VALUES (10, '会议纪要', 'icon-huiyijiyao','yellow', '/qiye/index/meeting', 3, 0, 1, 1733152993, 0, 0);
+INSERT INTO `oa_mobile_menu` VALUES (11, '报销管理', 'icon-a-baoxiao3','purple', '/qiye/finance/expense', 4, 0, 1, 1733153019, 0, 0);
+INSERT INTO `oa_mobile_menu` VALUES (12, '开票管理', 'icon-kaipiao','purple', '/qiye/finance/invoice', 4, 0, 1, 1733153047, 0, 0);
+INSERT INTO `oa_mobile_menu` VALUES (13, '收票管理', 'icon-shoupiao','purple', '/qiye/finance/ticket', 4, 0, 1, 1733153077, 0, 0);
+INSERT INTO `oa_mobile_menu` VALUES (14, '回款管理', 'icon-huikuan','purple', '/qiye/finance/income', 4, 0, 1, 1733153106, 0, 0);
+INSERT INTO `oa_mobile_menu` VALUES (15, '付款管理', 'icon-fukuan','purple', '/qiye/finance/payment', 4, 0, 1, 1733153131, 0, 0);
diff --git a/app/install/data/oa_city.sql b/app/install/data/oa_city.sql
new file mode 100644
index 0000000000000000000000000000000000000000..7ce9d144c15eaae2037ea3652f601ca6a15b7264
--- /dev/null
+++ b/app/install/data/oa_city.sql
@@ -0,0 +1,3293 @@
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for oa_city
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_city`;
+CREATE TABLE `oa_city`  (
+  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '地区编码',
+  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '地区名称',
+  `level` tinyint(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT '地区级别',
+  `pid` mediumint(8) UNSIGNED NOT NULL DEFAULT 0 COMMENT '地区父编码id',
+  `region_path` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '地区编码路径',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '中国省市区数据表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of oa_city
+-- ----------------------------
+INSERT INTO `oa_city` VALUES (110000, '北京市', 1, 0, ',110000,');
+INSERT INTO `oa_city` VALUES (110101, '东城区', 2, 110000, ',110000,110101,');
+INSERT INTO `oa_city` VALUES (110102, '西城区', 2, 110000, ',110000,110102,');
+INSERT INTO `oa_city` VALUES (110103, '崇文区', 2, 110000, ',110000,110103,');
+INSERT INTO `oa_city` VALUES (110104, '宣武区', 2, 110000, ',110000,110104,');
+INSERT INTO `oa_city` VALUES (110105, '朝阳区', 2, 110000, ',110000,110105,');
+INSERT INTO `oa_city` VALUES (110106, '丰台区', 2, 110000, ',110000,110106,');
+INSERT INTO `oa_city` VALUES (110107, '石景山区', 2, 110000, ',110000,110107,');
+INSERT INTO `oa_city` VALUES (110108, '海淀区', 2, 110000, ',110000,110108,');
+INSERT INTO `oa_city` VALUES (110109, '门头沟区', 2, 110000, ',110000,110109,');
+INSERT INTO `oa_city` VALUES (110111, '房山区', 2, 110000, ',110000,110111,');
+INSERT INTO `oa_city` VALUES (110112, '通州区', 2, 110000, ',110000,110112,');
+INSERT INTO `oa_city` VALUES (110113, '顺义区', 2, 110000, ',110000,110113,');
+INSERT INTO `oa_city` VALUES (110114, '昌平区', 2, 110000, ',110000,110114,');
+INSERT INTO `oa_city` VALUES (110115, '大兴区', 2, 110000, ',110000,110115,');
+INSERT INTO `oa_city` VALUES (110116, '怀柔区', 2, 110000, ',110000,110116,');
+INSERT INTO `oa_city` VALUES (110117, '平谷区', 2, 110000, ',110000,110117,');
+INSERT INTO `oa_city` VALUES (110228, '密云县', 2, 110000, ',110000,110228,');
+INSERT INTO `oa_city` VALUES (110229, '延庆县', 2, 110000, ',110000,110229,');
+INSERT INTO `oa_city` VALUES (120000, '天津市', 1, 0, ',120000,');
+INSERT INTO `oa_city` VALUES (120101, '和平区', 2, 120000, ',120000,120101,');
+INSERT INTO `oa_city` VALUES (120102, '河东区', 2, 120000, ',120000,120102,');
+INSERT INTO `oa_city` VALUES (120103, '河西区', 2, 120000, ',120000,120103,');
+INSERT INTO `oa_city` VALUES (120104, '南开区', 2, 120000, ',120000,120104,');
+INSERT INTO `oa_city` VALUES (120105, '河北区', 2, 120000, ',120000,120105,');
+INSERT INTO `oa_city` VALUES (120106, '红桥区', 2, 120000, ',120000,120106,');
+INSERT INTO `oa_city` VALUES (120107, '塘沽区', 2, 120000, ',120000,120107,');
+INSERT INTO `oa_city` VALUES (120108, '汉沽区', 2, 120000, ',120000,120108,');
+INSERT INTO `oa_city` VALUES (120109, '大港区', 2, 120000, ',120000,120109,');
+INSERT INTO `oa_city` VALUES (120110, '东丽区', 2, 120000, ',120000,120110,');
+INSERT INTO `oa_city` VALUES (120111, '西青区', 2, 120000, ',120000,120111,');
+INSERT INTO `oa_city` VALUES (120112, '津南区', 2, 120000, ',120000,120112,');
+INSERT INTO `oa_city` VALUES (120113, '北辰区', 2, 120000, ',120000,120113,');
+INSERT INTO `oa_city` VALUES (120114, '武清区', 2, 120000, ',120000,120114,');
+INSERT INTO `oa_city` VALUES (120115, '宝坻区', 2, 120000, ',120000,120115,');
+INSERT INTO `oa_city` VALUES (120116, '滨海新区', 2, 120000, ',120000,120116,');
+INSERT INTO `oa_city` VALUES (120221, '宁河县', 3, 120000, ',120000,120221,');
+INSERT INTO `oa_city` VALUES (120223, '静海县', 3, 120000, ',120000,120223,');
+INSERT INTO `oa_city` VALUES (120225, '蓟　县', 3, 120000, ',120000,120225,');
+INSERT INTO `oa_city` VALUES (130000, '河北省', 1, 0, ',130000,');
+INSERT INTO `oa_city` VALUES (130100, '石家庄市', 2, 130000, ',130000,130100,');
+INSERT INTO `oa_city` VALUES (130102, '长安区', 3, 130100, ',130000,130100,130102,');
+INSERT INTO `oa_city` VALUES (130103, '桥东区', 3, 130100, ',130000,130100,130103,');
+INSERT INTO `oa_city` VALUES (130104, '桥西区', 3, 130100, ',130000,130100,130104,');
+INSERT INTO `oa_city` VALUES (130105, '新华区', 3, 130100, ',130000,130100,130105,');
+INSERT INTO `oa_city` VALUES (130107, '井陉矿区', 3, 130100, ',130000,130100,130107,');
+INSERT INTO `oa_city` VALUES (130108, '裕华区', 3, 130100, ',130000,130100,130108,');
+INSERT INTO `oa_city` VALUES (130121, '井陉县', 3, 130100, ',130000,130100,130121,');
+INSERT INTO `oa_city` VALUES (130123, '正定县', 3, 130100, ',130000,130100,130123,');
+INSERT INTO `oa_city` VALUES (130124, '栾城县', 3, 130100, ',130000,130100,130124,');
+INSERT INTO `oa_city` VALUES (130125, '行唐县', 3, 130100, ',130000,130100,130125,');
+INSERT INTO `oa_city` VALUES (130126, '灵寿县', 3, 130100, ',130000,130100,130126,');
+INSERT INTO `oa_city` VALUES (130127, '高邑县', 3, 130100, ',130000,130100,130127,');
+INSERT INTO `oa_city` VALUES (130128, '深泽县', 3, 130100, ',130000,130100,130128,');
+INSERT INTO `oa_city` VALUES (130129, '赞皇县', 3, 130100, ',130000,130100,130129,');
+INSERT INTO `oa_city` VALUES (130130, '无极县', 3, 130100, ',130000,130100,130130,');
+INSERT INTO `oa_city` VALUES (130131, '平山县', 3, 130100, ',130000,130100,130131,');
+INSERT INTO `oa_city` VALUES (130132, '元氏县', 3, 130100, ',130000,130100,130132,');
+INSERT INTO `oa_city` VALUES (130133, '赵　县', 3, 130100, ',130000,130100,130133,');
+INSERT INTO `oa_city` VALUES (130181, '辛集市', 3, 130100, ',130000,130100,130181,');
+INSERT INTO `oa_city` VALUES (130182, '藁城市', 3, 130100, ',130000,130100,130182,');
+INSERT INTO `oa_city` VALUES (130183, '晋州市', 3, 130100, ',130000,130100,130183,');
+INSERT INTO `oa_city` VALUES (130184, '新乐市', 3, 130100, ',130000,130100,130184,');
+INSERT INTO `oa_city` VALUES (130185, '鹿泉市', 3, 130100, ',130000,130100,130185,');
+INSERT INTO `oa_city` VALUES (130200, '唐山市', 2, 130000, ',130000,130200,');
+INSERT INTO `oa_city` VALUES (130202, '路南区', 3, 130200, ',130000,130200,130202,');
+INSERT INTO `oa_city` VALUES (130203, '路北区', 3, 130200, ',130000,130200,130203,');
+INSERT INTO `oa_city` VALUES (130204, '古冶区', 3, 130200, ',130000,130200,130204,');
+INSERT INTO `oa_city` VALUES (130205, '开平区', 3, 130200, ',130000,130200,130205,');
+INSERT INTO `oa_city` VALUES (130207, '丰南区', 3, 130200, ',130000,130200,130207,');
+INSERT INTO `oa_city` VALUES (130208, '丰润区', 3, 130200, ',130000,130200,130208,');
+INSERT INTO `oa_city` VALUES (130223, '滦　县', 3, 130200, ',130000,130200,130223,');
+INSERT INTO `oa_city` VALUES (130224, '滦南县', 3, 130200, ',130000,130200,130224,');
+INSERT INTO `oa_city` VALUES (130225, '乐亭县', 3, 130200, ',130000,130200,130225,');
+INSERT INTO `oa_city` VALUES (130227, '迁西县', 3, 130200, ',130000,130200,130227,');
+INSERT INTO `oa_city` VALUES (130229, '玉田县', 3, 130200, ',130000,130200,130229,');
+INSERT INTO `oa_city` VALUES (130230, '唐海县', 3, 130200, ',130000,130200,130230,');
+INSERT INTO `oa_city` VALUES (130281, '遵化市', 3, 130200, ',130000,130200,130281,');
+INSERT INTO `oa_city` VALUES (130283, '迁安市', 3, 130200, ',130000,130200,130283,');
+INSERT INTO `oa_city` VALUES (130300, '秦皇岛市', 2, 130000, ',130000,130300,');
+INSERT INTO `oa_city` VALUES (130302, '海港区', 3, 130300, ',130000,130300,130302,');
+INSERT INTO `oa_city` VALUES (130303, '山海关区', 3, 130300, ',130000,130300,130303,');
+INSERT INTO `oa_city` VALUES (130304, '北戴河区', 3, 130300, ',130000,130300,130304,');
+INSERT INTO `oa_city` VALUES (130321, '青龙满族自治县', 3, 130300, ',130000,130300,130321,');
+INSERT INTO `oa_city` VALUES (130322, '昌黎县', 3, 130300, ',130000,130300,130322,');
+INSERT INTO `oa_city` VALUES (130323, '抚宁县', 3, 130300, ',130000,130300,130323,');
+INSERT INTO `oa_city` VALUES (130324, '卢龙县', 3, 130300, ',130000,130300,130324,');
+INSERT INTO `oa_city` VALUES (130400, '邯郸市', 2, 130000, ',130000,130400,');
+INSERT INTO `oa_city` VALUES (130402, '邯山区', 3, 130400, ',130000,130400,130402,');
+INSERT INTO `oa_city` VALUES (130403, '丛台区', 3, 130400, ',130000,130400,130403,');
+INSERT INTO `oa_city` VALUES (130404, '复兴区', 3, 130400, ',130000,130400,130404,');
+INSERT INTO `oa_city` VALUES (130406, '峰峰矿区', 3, 130400, ',130000,130400,130406,');
+INSERT INTO `oa_city` VALUES (130421, '邯郸县', 3, 130400, ',130000,130400,130421,');
+INSERT INTO `oa_city` VALUES (130423, '临漳县', 3, 130400, ',130000,130400,130423,');
+INSERT INTO `oa_city` VALUES (130424, '成安县', 3, 130400, ',130000,130400,130424,');
+INSERT INTO `oa_city` VALUES (130425, '大名县', 3, 130400, ',130000,130400,130425,');
+INSERT INTO `oa_city` VALUES (130426, '涉　县', 3, 130400, ',130000,130400,130426,');
+INSERT INTO `oa_city` VALUES (130427, '磁　县', 3, 130400, ',130000,130400,130427,');
+INSERT INTO `oa_city` VALUES (130428, '肥乡县', 3, 130400, ',130000,130400,130428,');
+INSERT INTO `oa_city` VALUES (130429, '永年县', 3, 130400, ',130000,130400,130429,');
+INSERT INTO `oa_city` VALUES (130430, '邱　县', 3, 130400, ',130000,130400,130430,');
+INSERT INTO `oa_city` VALUES (130431, '鸡泽县', 3, 130400, ',130000,130400,130431,');
+INSERT INTO `oa_city` VALUES (130432, '广平县', 3, 130400, ',130000,130400,130432,');
+INSERT INTO `oa_city` VALUES (130433, '馆陶县', 3, 130400, ',130000,130400,130433,');
+INSERT INTO `oa_city` VALUES (130434, '魏　县', 3, 130400, ',130000,130400,130434,');
+INSERT INTO `oa_city` VALUES (130435, '曲周县', 3, 130400, ',130000,130400,130435,');
+INSERT INTO `oa_city` VALUES (130481, '武安市', 3, 130400, ',130000,130400,130481,');
+INSERT INTO `oa_city` VALUES (130500, '邢台市', 2, 130000, ',130000,130500,');
+INSERT INTO `oa_city` VALUES (130502, '桥东区', 3, 130500, ',130000,130500,130502,');
+INSERT INTO `oa_city` VALUES (130503, '桥西区', 3, 130500, ',130000,130500,130503,');
+INSERT INTO `oa_city` VALUES (130521, '邢台县', 3, 130500, ',130000,130500,130521,');
+INSERT INTO `oa_city` VALUES (130522, '临城县', 3, 130500, ',130000,130500,130522,');
+INSERT INTO `oa_city` VALUES (130523, '内丘县', 3, 130500, ',130000,130500,130523,');
+INSERT INTO `oa_city` VALUES (130524, '柏乡县', 3, 130500, ',130000,130500,130524,');
+INSERT INTO `oa_city` VALUES (130525, '隆尧县', 3, 130500, ',130000,130500,130525,');
+INSERT INTO `oa_city` VALUES (130526, '任　县', 3, 130500, ',130000,130500,130526,');
+INSERT INTO `oa_city` VALUES (130527, '南和县', 3, 130500, ',130000,130500,130527,');
+INSERT INTO `oa_city` VALUES (130528, '宁晋县', 3, 130500, ',130000,130500,130528,');
+INSERT INTO `oa_city` VALUES (130529, '巨鹿县', 3, 130500, ',130000,130500,130529,');
+INSERT INTO `oa_city` VALUES (130530, '新河县', 3, 130500, ',130000,130500,130530,');
+INSERT INTO `oa_city` VALUES (130531, '广宗县', 3, 130500, ',130000,130500,130531,');
+INSERT INTO `oa_city` VALUES (130532, '平乡县', 3, 130500, ',130000,130500,130532,');
+INSERT INTO `oa_city` VALUES (130533, '威　县', 3, 130500, ',130000,130500,130533,');
+INSERT INTO `oa_city` VALUES (130534, '清河县', 3, 130500, ',130000,130500,130534,');
+INSERT INTO `oa_city` VALUES (130535, '临西县', 3, 130500, ',130000,130500,130535,');
+INSERT INTO `oa_city` VALUES (130581, '南宫市', 3, 130500, ',130000,130500,130581,');
+INSERT INTO `oa_city` VALUES (130582, '沙河市', 3, 130500, ',130000,130500,130582,');
+INSERT INTO `oa_city` VALUES (130600, '保定市', 2, 130000, ',130000,130600,');
+INSERT INTO `oa_city` VALUES (130602, '新市区', 3, 130600, ',130000,130600,130602,');
+INSERT INTO `oa_city` VALUES (130603, '北市区', 3, 130600, ',130000,130600,130603,');
+INSERT INTO `oa_city` VALUES (130604, '南市区', 3, 130600, ',130000,130600,130604,');
+INSERT INTO `oa_city` VALUES (130621, '满城县', 3, 130600, ',130000,130600,130621,');
+INSERT INTO `oa_city` VALUES (130622, '清苑县', 3, 130600, ',130000,130600,130622,');
+INSERT INTO `oa_city` VALUES (130623, '涞水县', 3, 130600, ',130000,130600,130623,');
+INSERT INTO `oa_city` VALUES (130624, '阜平县', 3, 130600, ',130000,130600,130624,');
+INSERT INTO `oa_city` VALUES (130625, '徐水县', 3, 130600, ',130000,130600,130625,');
+INSERT INTO `oa_city` VALUES (130626, '定兴县', 3, 130600, ',130000,130600,130626,');
+INSERT INTO `oa_city` VALUES (130627, '唐　县', 3, 130600, ',130000,130600,130627,');
+INSERT INTO `oa_city` VALUES (130628, '高阳县', 3, 130600, ',130000,130600,130628,');
+INSERT INTO `oa_city` VALUES (130629, '容城县', 3, 130600, ',130000,130600,130629,');
+INSERT INTO `oa_city` VALUES (130630, '涞源县', 3, 130600, ',130000,130600,130630,');
+INSERT INTO `oa_city` VALUES (130631, '望都县', 3, 130600, ',130000,130600,130631,');
+INSERT INTO `oa_city` VALUES (130632, '安新县', 3, 130600, ',130000,130600,130632,');
+INSERT INTO `oa_city` VALUES (130633, '易　县', 3, 130600, ',130000,130600,130633,');
+INSERT INTO `oa_city` VALUES (130634, '曲阳县', 3, 130600, ',130000,130600,130634,');
+INSERT INTO `oa_city` VALUES (130635, '蠡　县', 3, 130600, ',130000,130600,130635,');
+INSERT INTO `oa_city` VALUES (130636, '顺平县', 3, 130600, ',130000,130600,130636,');
+INSERT INTO `oa_city` VALUES (130637, '博野县', 3, 130600, ',130000,130600,130637,');
+INSERT INTO `oa_city` VALUES (130638, '雄　县', 3, 130600, ',130000,130600,130638,');
+INSERT INTO `oa_city` VALUES (130681, '涿州市', 3, 130600, ',130000,130600,130681,');
+INSERT INTO `oa_city` VALUES (130682, '定州市', 3, 130600, ',130000,130600,130682,');
+INSERT INTO `oa_city` VALUES (130683, '安国市', 3, 130600, ',130000,130600,130683,');
+INSERT INTO `oa_city` VALUES (130684, '高碑店市', 3, 130600, ',130000,130600,130684,');
+INSERT INTO `oa_city` VALUES (130700, '张家口市', 2, 130000, ',130000,130700,');
+INSERT INTO `oa_city` VALUES (130702, '桥东区', 3, 130700, ',130000,130700,130702,');
+INSERT INTO `oa_city` VALUES (130703, '桥西区', 3, 130700, ',130000,130700,130703,');
+INSERT INTO `oa_city` VALUES (130705, '宣化区', 3, 130700, ',130000,130700,130705,');
+INSERT INTO `oa_city` VALUES (130706, '下花园区', 3, 130700, ',130000,130700,130706,');
+INSERT INTO `oa_city` VALUES (130721, '宣化县', 3, 130700, ',130000,130700,130721,');
+INSERT INTO `oa_city` VALUES (130722, '张北县', 3, 130700, ',130000,130700,130722,');
+INSERT INTO `oa_city` VALUES (130723, '康保县', 3, 130700, ',130000,130700,130723,');
+INSERT INTO `oa_city` VALUES (130724, '沽源县', 3, 130700, ',130000,130700,130724,');
+INSERT INTO `oa_city` VALUES (130725, '尚义县', 3, 130700, ',130000,130700,130725,');
+INSERT INTO `oa_city` VALUES (130726, '蔚　县', 3, 130700, ',130000,130700,130726,');
+INSERT INTO `oa_city` VALUES (130727, '阳原县', 3, 130700, ',130000,130700,130727,');
+INSERT INTO `oa_city` VALUES (130728, '怀安县', 3, 130700, ',130000,130700,130728,');
+INSERT INTO `oa_city` VALUES (130729, '万全县', 3, 130700, ',130000,130700,130729,');
+INSERT INTO `oa_city` VALUES (130730, '怀来县', 3, 130700, ',130000,130700,130730,');
+INSERT INTO `oa_city` VALUES (130731, '涿鹿县', 3, 130700, ',130000,130700,130731,');
+INSERT INTO `oa_city` VALUES (130732, '赤城县', 3, 130700, ',130000,130700,130732,');
+INSERT INTO `oa_city` VALUES (130733, '崇礼县', 3, 130700, ',130000,130700,130733,');
+INSERT INTO `oa_city` VALUES (130800, '承德市', 2, 130000, ',130000,130800,');
+INSERT INTO `oa_city` VALUES (130802, '双桥区', 3, 130800, ',130000,130800,130802,');
+INSERT INTO `oa_city` VALUES (130803, '双滦区', 3, 130800, ',130000,130800,130803,');
+INSERT INTO `oa_city` VALUES (130804, '鹰手营子矿区', 3, 130800, ',130000,130800,130804,');
+INSERT INTO `oa_city` VALUES (130821, '承德县', 3, 130800, ',130000,130800,130821,');
+INSERT INTO `oa_city` VALUES (130822, '兴隆县', 3, 130800, ',130000,130800,130822,');
+INSERT INTO `oa_city` VALUES (130823, '平泉县', 3, 130800, ',130000,130800,130823,');
+INSERT INTO `oa_city` VALUES (130824, '滦平县', 3, 130800, ',130000,130800,130824,');
+INSERT INTO `oa_city` VALUES (130825, '隆化县', 3, 130800, ',130000,130800,130825,');
+INSERT INTO `oa_city` VALUES (130826, '丰宁满族自治县', 3, 130800, ',130000,130800,130826,');
+INSERT INTO `oa_city` VALUES (130827, '宽城满族自治县', 3, 130800, ',130000,130800,130827,');
+INSERT INTO `oa_city` VALUES (130828, '围场满族蒙古族自治县', 3, 130800, ',130000,130800,130828,');
+INSERT INTO `oa_city` VALUES (130900, '沧州市', 2, 130000, ',130000,130900,');
+INSERT INTO `oa_city` VALUES (130902, '新华区', 3, 130900, ',130000,130900,130902,');
+INSERT INTO `oa_city` VALUES (130903, '运河区', 3, 130900, ',130000,130900,130903,');
+INSERT INTO `oa_city` VALUES (130921, '沧　县', 3, 130900, ',130000,130900,130921,');
+INSERT INTO `oa_city` VALUES (130922, '青　县', 3, 130900, ',130000,130900,130922,');
+INSERT INTO `oa_city` VALUES (130923, '东光县', 3, 130900, ',130000,130900,130923,');
+INSERT INTO `oa_city` VALUES (130924, '海兴县', 3, 130900, ',130000,130900,130924,');
+INSERT INTO `oa_city` VALUES (130925, '盐山县', 3, 130900, ',130000,130900,130925,');
+INSERT INTO `oa_city` VALUES (130926, '肃宁县', 3, 130900, ',130000,130900,130926,');
+INSERT INTO `oa_city` VALUES (130927, '南皮县', 3, 130900, ',130000,130900,130927,');
+INSERT INTO `oa_city` VALUES (130928, '吴桥县', 3, 130900, ',130000,130900,130928,');
+INSERT INTO `oa_city` VALUES (130929, '献　县', 3, 130900, ',130000,130900,130929,');
+INSERT INTO `oa_city` VALUES (130930, '孟村回族自治县', 3, 130900, ',130000,130900,130930,');
+INSERT INTO `oa_city` VALUES (130981, '泊头市', 3, 130900, ',130000,130900,130981,');
+INSERT INTO `oa_city` VALUES (130982, '任丘市', 3, 130900, ',130000,130900,130982,');
+INSERT INTO `oa_city` VALUES (130983, '黄骅市', 3, 130900, ',130000,130900,130983,');
+INSERT INTO `oa_city` VALUES (130984, '河间市', 3, 130900, ',130000,130900,130984,');
+INSERT INTO `oa_city` VALUES (131000, '廊坊市', 2, 130000, ',130000,131000,');
+INSERT INTO `oa_city` VALUES (131002, '安次区', 3, 131000, ',130000,131000,131002,');
+INSERT INTO `oa_city` VALUES (131003, '广阳区', 3, 131000, ',130000,131000,131003,');
+INSERT INTO `oa_city` VALUES (131022, '固安县', 3, 131000, ',130000,131000,131022,');
+INSERT INTO `oa_city` VALUES (131023, '永清县', 3, 131000, ',130000,131000,131023,');
+INSERT INTO `oa_city` VALUES (131024, '香河县', 3, 131000, ',130000,131000,131024,');
+INSERT INTO `oa_city` VALUES (131025, '大城县', 3, 131000, ',130000,131000,131025,');
+INSERT INTO `oa_city` VALUES (131026, '文安县', 3, 131000, ',130000,131000,131026,');
+INSERT INTO `oa_city` VALUES (131028, '大厂回族自治县', 3, 131000, ',130000,131000,131028,');
+INSERT INTO `oa_city` VALUES (131081, '霸州市', 3, 131000, ',130000,131000,131081,');
+INSERT INTO `oa_city` VALUES (131082, '三河市', 3, 131000, ',130000,131000,131082,');
+INSERT INTO `oa_city` VALUES (131100, '衡水市', 2, 130000, ',130000,131100,');
+INSERT INTO `oa_city` VALUES (131102, '桃城区', 3, 131100, ',130000,131100,131102,');
+INSERT INTO `oa_city` VALUES (131121, '枣强县', 3, 131100, ',130000,131100,131121,');
+INSERT INTO `oa_city` VALUES (131122, '武邑县', 3, 131100, ',130000,131100,131122,');
+INSERT INTO `oa_city` VALUES (131123, '武强县', 3, 131100, ',130000,131100,131123,');
+INSERT INTO `oa_city` VALUES (131124, '饶阳县', 3, 131100, ',130000,131100,131124,');
+INSERT INTO `oa_city` VALUES (131125, '安平县', 3, 131100, ',130000,131100,131125,');
+INSERT INTO `oa_city` VALUES (131126, '故城县', 3, 131100, ',130000,131100,131126,');
+INSERT INTO `oa_city` VALUES (131127, '景　县', 3, 131100, ',130000,131100,131127,');
+INSERT INTO `oa_city` VALUES (131128, '阜城县', 3, 131100, ',130000,131100,131128,');
+INSERT INTO `oa_city` VALUES (131181, '冀州市', 3, 131100, ',130000,131100,131181,');
+INSERT INTO `oa_city` VALUES (131182, '深州市', 3, 131100, ',130000,131100,131182,');
+INSERT INTO `oa_city` VALUES (140000, '山西省', 1, 0, ',140000,');
+INSERT INTO `oa_city` VALUES (140100, '太原市', 2, 140000, ',140000,140100,');
+INSERT INTO `oa_city` VALUES (140105, '小店区', 3, 140100, ',140000,140100,140105,');
+INSERT INTO `oa_city` VALUES (140106, '迎泽区', 3, 140100, ',140000,140100,140106,');
+INSERT INTO `oa_city` VALUES (140107, '杏花岭区', 3, 140100, ',140000,140100,140107,');
+INSERT INTO `oa_city` VALUES (140108, '尖草坪区', 3, 140100, ',140000,140100,140108,');
+INSERT INTO `oa_city` VALUES (140109, '万柏林区', 3, 140100, ',140000,140100,140109,');
+INSERT INTO `oa_city` VALUES (140110, '晋源区', 3, 140100, ',140000,140100,140110,');
+INSERT INTO `oa_city` VALUES (140121, '清徐县', 3, 140100, ',140000,140100,140121,');
+INSERT INTO `oa_city` VALUES (140122, '阳曲县', 3, 140100, ',140000,140100,140122,');
+INSERT INTO `oa_city` VALUES (140123, '娄烦县', 3, 140100, ',140000,140100,140123,');
+INSERT INTO `oa_city` VALUES (140181, '古交市', 3, 140100, ',140000,140100,140181,');
+INSERT INTO `oa_city` VALUES (140200, '大同市', 2, 140000, ',140000,140200,');
+INSERT INTO `oa_city` VALUES (140202, '城　区', 3, 140200, ',140000,140200,140202,');
+INSERT INTO `oa_city` VALUES (140203, '矿　区', 3, 140200, ',140000,140200,140203,');
+INSERT INTO `oa_city` VALUES (140211, '南郊区', 3, 140200, ',140000,140200,140211,');
+INSERT INTO `oa_city` VALUES (140212, '新荣区', 3, 140200, ',140000,140200,140212,');
+INSERT INTO `oa_city` VALUES (140221, '阳高县', 3, 140200, ',140000,140200,140221,');
+INSERT INTO `oa_city` VALUES (140222, '天镇县', 3, 140200, ',140000,140200,140222,');
+INSERT INTO `oa_city` VALUES (140223, '广灵县', 3, 140200, ',140000,140200,140223,');
+INSERT INTO `oa_city` VALUES (140224, '灵丘县', 3, 140200, ',140000,140200,140224,');
+INSERT INTO `oa_city` VALUES (140225, '浑源县', 3, 140200, ',140000,140200,140225,');
+INSERT INTO `oa_city` VALUES (140226, '左云县', 3, 140200, ',140000,140200,140226,');
+INSERT INTO `oa_city` VALUES (140227, '大同县', 3, 140200, ',140000,140200,140227,');
+INSERT INTO `oa_city` VALUES (140300, '阳泉市', 2, 140000, ',140000,140300,');
+INSERT INTO `oa_city` VALUES (140302, '城　区', 3, 140300, ',140000,140300,140302,');
+INSERT INTO `oa_city` VALUES (140303, '矿　区', 3, 140300, ',140000,140300,140303,');
+INSERT INTO `oa_city` VALUES (140311, '郊　区', 3, 140300, ',140000,140300,140311,');
+INSERT INTO `oa_city` VALUES (140321, '平定县', 3, 140300, ',140000,140300,140321,');
+INSERT INTO `oa_city` VALUES (140322, '盂　县', 3, 140300, ',140000,140300,140322,');
+INSERT INTO `oa_city` VALUES (140400, '长治市', 2, 140000, ',140000,140400,');
+INSERT INTO `oa_city` VALUES (140402, '城　区', 3, 140400, ',140000,140400,140402,');
+INSERT INTO `oa_city` VALUES (140411, '郊　区', 3, 140400, ',140000,140400,140411,');
+INSERT INTO `oa_city` VALUES (140421, '长治县', 3, 140400, ',140000,140400,140421,');
+INSERT INTO `oa_city` VALUES (140423, '襄垣县', 3, 140400, ',140000,140400,140423,');
+INSERT INTO `oa_city` VALUES (140424, '屯留县', 3, 140400, ',140000,140400,140424,');
+INSERT INTO `oa_city` VALUES (140425, '平顺县', 3, 140400, ',140000,140400,140425,');
+INSERT INTO `oa_city` VALUES (140426, '黎城县', 3, 140400, ',140000,140400,140426,');
+INSERT INTO `oa_city` VALUES (140427, '壶关县', 3, 140400, ',140000,140400,140427,');
+INSERT INTO `oa_city` VALUES (140428, '长子县', 3, 140400, ',140000,140400,140428,');
+INSERT INTO `oa_city` VALUES (140429, '武乡县', 3, 140400, ',140000,140400,140429,');
+INSERT INTO `oa_city` VALUES (140430, '沁　县', 3, 140400, ',140000,140400,140430,');
+INSERT INTO `oa_city` VALUES (140431, '沁源县', 3, 140400, ',140000,140400,140431,');
+INSERT INTO `oa_city` VALUES (140481, '潞城市', 3, 140400, ',140000,140400,140481,');
+INSERT INTO `oa_city` VALUES (140500, '晋城市', 2, 140000, ',140000,140500,');
+INSERT INTO `oa_city` VALUES (140502, '城　区', 3, 140500, ',140000,140500,140502,');
+INSERT INTO `oa_city` VALUES (140521, '沁水县', 3, 140500, ',140000,140500,140521,');
+INSERT INTO `oa_city` VALUES (140522, '阳城县', 3, 140500, ',140000,140500,140522,');
+INSERT INTO `oa_city` VALUES (140524, '陵川县', 3, 140500, ',140000,140500,140524,');
+INSERT INTO `oa_city` VALUES (140525, '泽州县', 3, 140500, ',140000,140500,140525,');
+INSERT INTO `oa_city` VALUES (140581, '高平市', 3, 140500, ',140000,140500,140581,');
+INSERT INTO `oa_city` VALUES (140600, '朔州市', 2, 140000, ',140000,140600,');
+INSERT INTO `oa_city` VALUES (140602, '朔城区', 3, 140600, ',140000,140600,140602,');
+INSERT INTO `oa_city` VALUES (140603, '平鲁区', 3, 140600, ',140000,140600,140603,');
+INSERT INTO `oa_city` VALUES (140621, '山阴县', 3, 140600, ',140000,140600,140621,');
+INSERT INTO `oa_city` VALUES (140622, '应　县', 3, 140600, ',140000,140600,140622,');
+INSERT INTO `oa_city` VALUES (140623, '右玉县', 3, 140600, ',140000,140600,140623,');
+INSERT INTO `oa_city` VALUES (140624, '怀仁县', 3, 140600, ',140000,140600,140624,');
+INSERT INTO `oa_city` VALUES (140700, '晋中市', 2, 140000, ',140000,140700,');
+INSERT INTO `oa_city` VALUES (140702, '榆次区', 3, 140700, ',140000,140700,140702,');
+INSERT INTO `oa_city` VALUES (140721, '榆社县', 3, 140700, ',140000,140700,140721,');
+INSERT INTO `oa_city` VALUES (140722, '左权县', 3, 140700, ',140000,140700,140722,');
+INSERT INTO `oa_city` VALUES (140723, '和顺县', 3, 140700, ',140000,140700,140723,');
+INSERT INTO `oa_city` VALUES (140724, '昔阳县', 3, 140700, ',140000,140700,140724,');
+INSERT INTO `oa_city` VALUES (140725, '寿阳县', 3, 140700, ',140000,140700,140725,');
+INSERT INTO `oa_city` VALUES (140726, '太谷县', 3, 140700, ',140000,140700,140726,');
+INSERT INTO `oa_city` VALUES (140727, '祁　县', 3, 140700, ',140000,140700,140727,');
+INSERT INTO `oa_city` VALUES (140728, '平遥县', 3, 140700, ',140000,140700,140728,');
+INSERT INTO `oa_city` VALUES (140729, '灵石县', 3, 140700, ',140000,140700,140729,');
+INSERT INTO `oa_city` VALUES (140781, '介休市', 3, 140700, ',140000,140700,140781,');
+INSERT INTO `oa_city` VALUES (140800, '运城市', 2, 140000, ',140000,140800,');
+INSERT INTO `oa_city` VALUES (140802, '盐湖区', 3, 140800, ',140000,140800,140802,');
+INSERT INTO `oa_city` VALUES (140821, '临猗县', 3, 140800, ',140000,140800,140821,');
+INSERT INTO `oa_city` VALUES (140822, '万荣县', 3, 140800, ',140000,140800,140822,');
+INSERT INTO `oa_city` VALUES (140823, '闻喜县', 3, 140800, ',140000,140800,140823,');
+INSERT INTO `oa_city` VALUES (140824, '稷山县', 3, 140800, ',140000,140800,140824,');
+INSERT INTO `oa_city` VALUES (140825, '新绛县', 3, 140800, ',140000,140800,140825,');
+INSERT INTO `oa_city` VALUES (140826, '绛　县', 3, 140800, ',140000,140800,140826,');
+INSERT INTO `oa_city` VALUES (140827, '垣曲县', 3, 140800, ',140000,140800,140827,');
+INSERT INTO `oa_city` VALUES (140828, '夏　县', 3, 140800, ',140000,140800,140828,');
+INSERT INTO `oa_city` VALUES (140829, '平陆县', 3, 140800, ',140000,140800,140829,');
+INSERT INTO `oa_city` VALUES (140830, '芮城县', 3, 140800, ',140000,140800,140830,');
+INSERT INTO `oa_city` VALUES (140881, '永济市', 3, 140800, ',140000,140800,140881,');
+INSERT INTO `oa_city` VALUES (140882, '河津市', 3, 140800, ',140000,140800,140882,');
+INSERT INTO `oa_city` VALUES (140900, '忻州市', 2, 140000, ',140000,140900,');
+INSERT INTO `oa_city` VALUES (140902, '忻府区', 3, 140900, ',140000,140900,140902,');
+INSERT INTO `oa_city` VALUES (140921, '定襄县', 3, 140900, ',140000,140900,140921,');
+INSERT INTO `oa_city` VALUES (140922, '五台县', 3, 140900, ',140000,140900,140922,');
+INSERT INTO `oa_city` VALUES (140923, '代　县', 3, 140900, ',140000,140900,140923,');
+INSERT INTO `oa_city` VALUES (140924, '繁峙县', 3, 140900, ',140000,140900,140924,');
+INSERT INTO `oa_city` VALUES (140925, '宁武县', 3, 140900, ',140000,140900,140925,');
+INSERT INTO `oa_city` VALUES (140926, '静乐县', 3, 140900, ',140000,140900,140926,');
+INSERT INTO `oa_city` VALUES (140927, '神池县', 3, 140900, ',140000,140900,140927,');
+INSERT INTO `oa_city` VALUES (140928, '五寨县', 3, 140900, ',140000,140900,140928,');
+INSERT INTO `oa_city` VALUES (140929, '岢岚县', 3, 140900, ',140000,140900,140929,');
+INSERT INTO `oa_city` VALUES (140930, '河曲县', 3, 140900, ',140000,140900,140930,');
+INSERT INTO `oa_city` VALUES (140931, '保德县', 3, 140900, ',140000,140900,140931,');
+INSERT INTO `oa_city` VALUES (140932, '偏关县', 3, 140900, ',140000,140900,140932,');
+INSERT INTO `oa_city` VALUES (140981, '原平市', 3, 140900, ',140000,140900,140981,');
+INSERT INTO `oa_city` VALUES (141000, '临汾市', 2, 140000, ',140000,141000,');
+INSERT INTO `oa_city` VALUES (141002, '尧都区', 3, 141000, ',140000,141000,141002,');
+INSERT INTO `oa_city` VALUES (141021, '曲沃县', 3, 141000, ',140000,141000,141021,');
+INSERT INTO `oa_city` VALUES (141022, '翼城县', 3, 141000, ',140000,141000,141022,');
+INSERT INTO `oa_city` VALUES (141023, '襄汾县', 3, 141000, ',140000,141000,141023,');
+INSERT INTO `oa_city` VALUES (141024, '洪洞县', 3, 141000, ',140000,141000,141024,');
+INSERT INTO `oa_city` VALUES (141025, '古　县', 3, 141000, ',140000,141000,141025,');
+INSERT INTO `oa_city` VALUES (141026, '安泽县', 3, 141000, ',140000,141000,141026,');
+INSERT INTO `oa_city` VALUES (141027, '浮山县', 3, 141000, ',140000,141000,141027,');
+INSERT INTO `oa_city` VALUES (141028, '吉　县', 3, 141000, ',140000,141000,141028,');
+INSERT INTO `oa_city` VALUES (141029, '乡宁县', 3, 141000, ',140000,141000,141029,');
+INSERT INTO `oa_city` VALUES (141030, '大宁县', 3, 141000, ',140000,141000,141030,');
+INSERT INTO `oa_city` VALUES (141031, '隰　县', 3, 141000, ',140000,141000,141031,');
+INSERT INTO `oa_city` VALUES (141032, '永和县', 3, 141000, ',140000,141000,141032,');
+INSERT INTO `oa_city` VALUES (141033, '蒲　县', 3, 141000, ',140000,141000,141033,');
+INSERT INTO `oa_city` VALUES (141034, '汾西县', 3, 141000, ',140000,141000,141034,');
+INSERT INTO `oa_city` VALUES (141081, '侯马市', 3, 141000, ',140000,141000,141081,');
+INSERT INTO `oa_city` VALUES (141082, '霍州市', 3, 141000, ',140000,141000,141082,');
+INSERT INTO `oa_city` VALUES (141100, '吕梁市', 2, 140000, ',140000,141100,');
+INSERT INTO `oa_city` VALUES (141102, '离石区', 3, 141100, ',140000,141100,141102,');
+INSERT INTO `oa_city` VALUES (141121, '文水县', 3, 141100, ',140000,141100,141121,');
+INSERT INTO `oa_city` VALUES (141122, '交城县', 3, 141100, ',140000,141100,141122,');
+INSERT INTO `oa_city` VALUES (141123, '兴　县', 3, 141100, ',140000,141100,141123,');
+INSERT INTO `oa_city` VALUES (141124, '临　县', 3, 141100, ',140000,141100,141124,');
+INSERT INTO `oa_city` VALUES (141125, '柳林县', 3, 141100, ',140000,141100,141125,');
+INSERT INTO `oa_city` VALUES (141126, '石楼县', 3, 141100, ',140000,141100,141126,');
+INSERT INTO `oa_city` VALUES (141127, '岚　县', 3, 141100, ',140000,141100,141127,');
+INSERT INTO `oa_city` VALUES (141128, '方山县', 3, 141100, ',140000,141100,141128,');
+INSERT INTO `oa_city` VALUES (141129, '中阳县', 3, 141100, ',140000,141100,141129,');
+INSERT INTO `oa_city` VALUES (141130, '交口县', 3, 141100, ',140000,141100,141130,');
+INSERT INTO `oa_city` VALUES (141181, '孝义市', 3, 141100, ',140000,141100,141181,');
+INSERT INTO `oa_city` VALUES (141182, '汾阳市', 3, 141100, ',140000,141100,141182,');
+INSERT INTO `oa_city` VALUES (150000, '内蒙古', 1, 0, ',150000,');
+INSERT INTO `oa_city` VALUES (150100, '呼和浩特市', 2, 150000, ',150000,150100,');
+INSERT INTO `oa_city` VALUES (150102, '新城区', 3, 150100, ',150000,150100,150102,');
+INSERT INTO `oa_city` VALUES (150103, '回民区', 3, 150100, ',150000,150100,150103,');
+INSERT INTO `oa_city` VALUES (150104, '玉泉区', 3, 150100, ',150000,150100,150104,');
+INSERT INTO `oa_city` VALUES (150105, '赛罕区', 3, 150100, ',150000,150100,150105,');
+INSERT INTO `oa_city` VALUES (150121, '土默特左旗', 3, 150100, ',150000,150100,150121,');
+INSERT INTO `oa_city` VALUES (150122, '托克托县', 3, 150100, ',150000,150100,150122,');
+INSERT INTO `oa_city` VALUES (150123, '和林格尔县', 3, 150100, ',150000,150100,150123,');
+INSERT INTO `oa_city` VALUES (150124, '清水河县', 3, 150100, ',150000,150100,150124,');
+INSERT INTO `oa_city` VALUES (150125, '武川县', 3, 150100, ',150000,150100,150125,');
+INSERT INTO `oa_city` VALUES (150200, '包头市', 2, 150000, ',150000,150200,');
+INSERT INTO `oa_city` VALUES (150202, '东河区', 3, 150200, ',150000,150200,150202,');
+INSERT INTO `oa_city` VALUES (150203, '昆都仑区', 3, 150200, ',150000,150200,150203,');
+INSERT INTO `oa_city` VALUES (150204, '青山区', 3, 150200, ',150000,150200,150204,');
+INSERT INTO `oa_city` VALUES (150205, '石拐区', 3, 150200, ',150000,150200,150205,');
+INSERT INTO `oa_city` VALUES (150206, '白云矿区', 3, 150200, ',150000,150200,150206,');
+INSERT INTO `oa_city` VALUES (150207, '九原区', 3, 150200, ',150000,150200,150207,');
+INSERT INTO `oa_city` VALUES (150221, '土默特右旗', 3, 150200, ',150000,150200,150221,');
+INSERT INTO `oa_city` VALUES (150222, '固阳县', 3, 150200, ',150000,150200,150222,');
+INSERT INTO `oa_city` VALUES (150223, '达尔罕茂明安联合旗', 3, 150200, ',150000,150200,150223,');
+INSERT INTO `oa_city` VALUES (150300, '乌海市', 2, 150000, ',150000,150300,');
+INSERT INTO `oa_city` VALUES (150302, '海勃湾区', 3, 150300, ',150000,150300,150302,');
+INSERT INTO `oa_city` VALUES (150303, '海南区', 3, 150300, ',150000,150300,150303,');
+INSERT INTO `oa_city` VALUES (150304, '乌达区', 3, 150300, ',150000,150300,150304,');
+INSERT INTO `oa_city` VALUES (150400, '赤峰市', 2, 150000, ',150000,150400,');
+INSERT INTO `oa_city` VALUES (150402, '红山区', 3, 150400, ',150000,150400,150402,');
+INSERT INTO `oa_city` VALUES (150403, '元宝山区', 3, 150400, ',150000,150400,150403,');
+INSERT INTO `oa_city` VALUES (150404, '松山区', 3, 150400, ',150000,150400,150404,');
+INSERT INTO `oa_city` VALUES (150421, '阿鲁科尔沁旗', 3, 150400, ',150000,150400,150421,');
+INSERT INTO `oa_city` VALUES (150422, '巴林左旗', 3, 150400, ',150000,150400,150422,');
+INSERT INTO `oa_city` VALUES (150423, '巴林右旗', 3, 150400, ',150000,150400,150423,');
+INSERT INTO `oa_city` VALUES (150424, '林西县', 3, 150400, ',150000,150400,150424,');
+INSERT INTO `oa_city` VALUES (150425, '克什克腾旗', 3, 150400, ',150000,150400,150425,');
+INSERT INTO `oa_city` VALUES (150426, '翁牛特旗', 3, 150400, ',150000,150400,150426,');
+INSERT INTO `oa_city` VALUES (150428, '喀喇沁旗', 3, 150400, ',150000,150400,150428,');
+INSERT INTO `oa_city` VALUES (150429, '宁城县', 3, 150400, ',150000,150400,150429,');
+INSERT INTO `oa_city` VALUES (150430, '敖汉旗', 3, 150400, ',150000,150400,150430,');
+INSERT INTO `oa_city` VALUES (150500, '通辽市', 2, 150000, ',150000,150500,');
+INSERT INTO `oa_city` VALUES (150502, '科尔沁区', 3, 150500, ',150000,150500,150502,');
+INSERT INTO `oa_city` VALUES (150521, '科尔沁左翼中旗', 3, 150500, ',150000,150500,150521,');
+INSERT INTO `oa_city` VALUES (150522, '科尔沁左翼后旗', 3, 150500, ',150000,150500,150522,');
+INSERT INTO `oa_city` VALUES (150523, '开鲁县', 3, 150500, ',150000,150500,150523,');
+INSERT INTO `oa_city` VALUES (150524, '库伦旗', 3, 150500, ',150000,150500,150524,');
+INSERT INTO `oa_city` VALUES (150525, '奈曼旗', 3, 150500, ',150000,150500,150525,');
+INSERT INTO `oa_city` VALUES (150526, '扎鲁特旗', 3, 150500, ',150000,150500,150526,');
+INSERT INTO `oa_city` VALUES (150581, '霍林郭勒市', 3, 150500, ',150000,150500,150581,');
+INSERT INTO `oa_city` VALUES (150600, '鄂尔多斯市', 2, 150000, ',150000,150600,');
+INSERT INTO `oa_city` VALUES (150602, '东胜区', 3, 150600, ',150000,150600,150602,');
+INSERT INTO `oa_city` VALUES (150621, '达拉特旗', 3, 150600, ',150000,150600,150621,');
+INSERT INTO `oa_city` VALUES (150622, '准格尔旗', 3, 150600, ',150000,150600,150622,');
+INSERT INTO `oa_city` VALUES (150623, '鄂托克前旗', 3, 150600, ',150000,150600,150623,');
+INSERT INTO `oa_city` VALUES (150624, '鄂托克旗', 3, 150600, ',150000,150600,150624,');
+INSERT INTO `oa_city` VALUES (150625, '杭锦旗', 3, 150600, ',150000,150600,150625,');
+INSERT INTO `oa_city` VALUES (150626, '乌审旗', 3, 150600, ',150000,150600,150626,');
+INSERT INTO `oa_city` VALUES (150627, '伊金霍洛旗', 3, 150600, ',150000,150600,150627,');
+INSERT INTO `oa_city` VALUES (150700, '呼伦贝尔市', 2, 150000, ',150000,150700,');
+INSERT INTO `oa_city` VALUES (150702, '海拉尔区', 3, 150700, ',150000,150700,150702,');
+INSERT INTO `oa_city` VALUES (150721, '阿荣旗', 3, 150700, ',150000,150700,150721,');
+INSERT INTO `oa_city` VALUES (150722, '莫力达瓦达斡尔族自治旗', 3, 150700, ',150000,150700,150722,');
+INSERT INTO `oa_city` VALUES (150723, '鄂伦春自治旗', 3, 150700, ',150000,150700,150723,');
+INSERT INTO `oa_city` VALUES (150724, '鄂温克族自治旗', 3, 150700, ',150000,150700,150724,');
+INSERT INTO `oa_city` VALUES (150725, '陈巴尔虎旗', 3, 150700, ',150000,150700,150725,');
+INSERT INTO `oa_city` VALUES (150726, '新巴尔虎左旗', 3, 150700, ',150000,150700,150726,');
+INSERT INTO `oa_city` VALUES (150727, '新巴尔虎右旗', 3, 150700, ',150000,150700,150727,');
+INSERT INTO `oa_city` VALUES (150781, '满洲里市', 3, 150700, ',150000,150700,150781,');
+INSERT INTO `oa_city` VALUES (150782, '牙克石市', 3, 150700, ',150000,150700,150782,');
+INSERT INTO `oa_city` VALUES (150783, '扎兰屯市', 3, 150700, ',150000,150700,150783,');
+INSERT INTO `oa_city` VALUES (150784, '额尔古纳市', 3, 150700, ',150000,150700,150784,');
+INSERT INTO `oa_city` VALUES (150785, '根河市', 3, 150700, ',150000,150700,150785,');
+INSERT INTO `oa_city` VALUES (150800, '巴彦淖尔市', 2, 150000, ',150000,150800,');
+INSERT INTO `oa_city` VALUES (150802, '临河区', 3, 150800, ',150000,150800,150802,');
+INSERT INTO `oa_city` VALUES (150821, '五原县', 3, 150800, ',150000,150800,150821,');
+INSERT INTO `oa_city` VALUES (150822, '磴口县', 3, 150800, ',150000,150800,150822,');
+INSERT INTO `oa_city` VALUES (150823, '乌拉特前旗', 3, 150800, ',150000,150800,150823,');
+INSERT INTO `oa_city` VALUES (150824, '乌拉特中旗', 3, 150800, ',150000,150800,150824,');
+INSERT INTO `oa_city` VALUES (150825, '乌拉特后旗', 3, 150800, ',150000,150800,150825,');
+INSERT INTO `oa_city` VALUES (150826, '杭锦后旗', 3, 150800, ',150000,150800,150826,');
+INSERT INTO `oa_city` VALUES (150900, '乌兰察布市', 2, 150000, ',150000,150900,');
+INSERT INTO `oa_city` VALUES (150902, '集宁区', 3, 150900, ',150000,150900,150902,');
+INSERT INTO `oa_city` VALUES (150921, '卓资县', 3, 150900, ',150000,150900,150921,');
+INSERT INTO `oa_city` VALUES (150922, '化德县', 3, 150900, ',150000,150900,150922,');
+INSERT INTO `oa_city` VALUES (150923, '商都县', 3, 150900, ',150000,150900,150923,');
+INSERT INTO `oa_city` VALUES (150924, '兴和县', 3, 150900, ',150000,150900,150924,');
+INSERT INTO `oa_city` VALUES (150925, '凉城县', 3, 150900, ',150000,150900,150925,');
+INSERT INTO `oa_city` VALUES (150926, '察哈尔右翼前旗', 3, 150900, ',150000,150900,150926,');
+INSERT INTO `oa_city` VALUES (150927, '察哈尔右翼中旗', 3, 150900, ',150000,150900,150927,');
+INSERT INTO `oa_city` VALUES (150928, '察哈尔右翼后旗', 3, 150900, ',150000,150900,150928,');
+INSERT INTO `oa_city` VALUES (150929, '四子王旗', 3, 150900, ',150000,150900,150929,');
+INSERT INTO `oa_city` VALUES (150981, '丰镇市', 3, 150900, ',150000,150900,150981,');
+INSERT INTO `oa_city` VALUES (152200, '兴安盟', 2, 150000, ',150000,152200,');
+INSERT INTO `oa_city` VALUES (152201, '乌兰浩特市', 3, 152200, ',150000,152200,152201,');
+INSERT INTO `oa_city` VALUES (152202, '阿尔山市', 3, 152200, ',150000,152200,152202,');
+INSERT INTO `oa_city` VALUES (152221, '科尔沁右翼前旗', 3, 152200, ',150000,152200,152221,');
+INSERT INTO `oa_city` VALUES (152222, '科尔沁右翼中旗', 3, 152200, ',150000,152200,152222,');
+INSERT INTO `oa_city` VALUES (152223, '扎赉特旗', 3, 152200, ',150000,152200,152223,');
+INSERT INTO `oa_city` VALUES (152224, '突泉县', 3, 152200, ',150000,152200,152224,');
+INSERT INTO `oa_city` VALUES (152500, '锡林郭勒盟', 2, 150000, ',150000,152500,');
+INSERT INTO `oa_city` VALUES (152501, '二连浩特市', 3, 152500, ',150000,152500,152501,');
+INSERT INTO `oa_city` VALUES (152502, '锡林浩特市', 3, 152500, ',150000,152500,152502,');
+INSERT INTO `oa_city` VALUES (152522, '阿巴嘎旗', 3, 152500, ',150000,152500,152522,');
+INSERT INTO `oa_city` VALUES (152523, '苏尼特左旗', 3, 152500, ',150000,152500,152523,');
+INSERT INTO `oa_city` VALUES (152524, '苏尼特右旗', 3, 152500, ',150000,152500,152524,');
+INSERT INTO `oa_city` VALUES (152525, '东乌珠穆沁旗', 3, 152500, ',150000,152500,152525,');
+INSERT INTO `oa_city` VALUES (152526, '西乌珠穆沁旗', 3, 152500, ',150000,152500,152526,');
+INSERT INTO `oa_city` VALUES (152527, '太仆寺旗', 3, 152500, ',150000,152500,152527,');
+INSERT INTO `oa_city` VALUES (152528, '镶黄旗', 3, 152500, ',150000,152500,152528,');
+INSERT INTO `oa_city` VALUES (152529, '正镶白旗', 3, 152500, ',150000,152500,152529,');
+INSERT INTO `oa_city` VALUES (152530, '正蓝旗', 3, 152500, ',150000,152500,152530,');
+INSERT INTO `oa_city` VALUES (152531, '多伦县', 3, 152500, ',150000,152500,152531,');
+INSERT INTO `oa_city` VALUES (152900, '阿拉善盟', 2, 150000, ',150000,152900,');
+INSERT INTO `oa_city` VALUES (152921, '阿拉善左旗', 3, 152900, ',150000,152900,152921,');
+INSERT INTO `oa_city` VALUES (152922, '阿拉善右旗', 3, 152900, ',150000,152900,152922,');
+INSERT INTO `oa_city` VALUES (152923, '额济纳旗', 3, 152900, ',150000,152900,152923,');
+INSERT INTO `oa_city` VALUES (210000, '辽宁省', 1, 0, ',210000,');
+INSERT INTO `oa_city` VALUES (210100, '沈阳市', 2, 210000, ',210000,210100,');
+INSERT INTO `oa_city` VALUES (210102, '和平区', 3, 210100, ',210000,210100,210102,');
+INSERT INTO `oa_city` VALUES (210103, '沈河区', 3, 210100, ',210000,210100,210103,');
+INSERT INTO `oa_city` VALUES (210104, '大东区', 3, 210100, ',210000,210100,210104,');
+INSERT INTO `oa_city` VALUES (210105, '皇姑区', 3, 210100, ',210000,210100,210105,');
+INSERT INTO `oa_city` VALUES (210106, '铁西区', 3, 210100, ',210000,210100,210106,');
+INSERT INTO `oa_city` VALUES (210111, '苏家屯区', 3, 210100, ',210000,210100,210111,');
+INSERT INTO `oa_city` VALUES (210112, '东陵区', 3, 210100, ',210000,210100,210112,');
+INSERT INTO `oa_city` VALUES (210113, '新城子区', 3, 210100, ',210000,210100,210113,');
+INSERT INTO `oa_city` VALUES (210114, '于洪区', 3, 210100, ',210000,210100,210114,');
+INSERT INTO `oa_city` VALUES (210122, '辽中县', 3, 210100, ',210000,210100,210122,');
+INSERT INTO `oa_city` VALUES (210123, '康平县', 3, 210100, ',210000,210100,210123,');
+INSERT INTO `oa_city` VALUES (210124, '法库县', 3, 210100, ',210000,210100,210124,');
+INSERT INTO `oa_city` VALUES (210181, '新民市', 3, 210100, ',210000,210100,210181,');
+INSERT INTO `oa_city` VALUES (210200, '大连市', 2, 210000, ',210000,210200,');
+INSERT INTO `oa_city` VALUES (210202, '中山区', 3, 210200, ',210000,210200,210202,');
+INSERT INTO `oa_city` VALUES (210203, '西岗区', 3, 210200, ',210000,210200,210203,');
+INSERT INTO `oa_city` VALUES (210204, '沙河口区', 3, 210200, ',210000,210200,210204,');
+INSERT INTO `oa_city` VALUES (210211, '甘井子区', 3, 210200, ',210000,210200,210211,');
+INSERT INTO `oa_city` VALUES (210212, '旅顺口区', 3, 210200, ',210000,210200,210212,');
+INSERT INTO `oa_city` VALUES (210213, '金州区', 3, 210200, ',210000,210200,210213,');
+INSERT INTO `oa_city` VALUES (210224, '长海县', 3, 210200, ',210000,210200,210224,');
+INSERT INTO `oa_city` VALUES (210281, '瓦房店市', 3, 210200, ',210000,210200,210281,');
+INSERT INTO `oa_city` VALUES (210282, '普兰店市', 3, 210200, ',210000,210200,210282,');
+INSERT INTO `oa_city` VALUES (210283, '庄河市', 3, 210200, ',210000,210200,210283,');
+INSERT INTO `oa_city` VALUES (210300, '鞍山市', 2, 210000, ',210000,210300,');
+INSERT INTO `oa_city` VALUES (210302, '铁东区', 3, 210300, ',210000,210300,210302,');
+INSERT INTO `oa_city` VALUES (210303, '铁西区', 3, 210300, ',210000,210300,210303,');
+INSERT INTO `oa_city` VALUES (210304, '立山区', 3, 210300, ',210000,210300,210304,');
+INSERT INTO `oa_city` VALUES (210311, '千山区', 3, 210300, ',210000,210300,210311,');
+INSERT INTO `oa_city` VALUES (210321, '台安县', 3, 210300, ',210000,210300,210321,');
+INSERT INTO `oa_city` VALUES (210323, '岫岩满族自治县', 3, 210300, ',210000,210300,210323,');
+INSERT INTO `oa_city` VALUES (210381, '海城市', 3, 210300, ',210000,210300,210381,');
+INSERT INTO `oa_city` VALUES (210400, '抚顺市', 2, 210000, ',210000,210400,');
+INSERT INTO `oa_city` VALUES (210402, '新抚区', 3, 210400, ',210000,210400,210402,');
+INSERT INTO `oa_city` VALUES (210403, '东洲区', 3, 210400, ',210000,210400,210403,');
+INSERT INTO `oa_city` VALUES (210404, '望花区', 3, 210400, ',210000,210400,210404,');
+INSERT INTO `oa_city` VALUES (210411, '顺城区', 3, 210400, ',210000,210400,210411,');
+INSERT INTO `oa_city` VALUES (210421, '抚顺县', 3, 210400, ',210000,210400,210421,');
+INSERT INTO `oa_city` VALUES (210422, '新宾满族自治县', 3, 210400, ',210000,210400,210422,');
+INSERT INTO `oa_city` VALUES (210423, '清原满族自治县', 3, 210400, ',210000,210400,210423,');
+INSERT INTO `oa_city` VALUES (210500, '本溪市', 2, 210000, ',210000,210500,');
+INSERT INTO `oa_city` VALUES (210502, '平山区', 3, 210500, ',210000,210500,210502,');
+INSERT INTO `oa_city` VALUES (210503, '溪湖区', 3, 210500, ',210000,210500,210503,');
+INSERT INTO `oa_city` VALUES (210504, '明山区', 3, 210500, ',210000,210500,210504,');
+INSERT INTO `oa_city` VALUES (210505, '南芬区', 3, 210500, ',210000,210500,210505,');
+INSERT INTO `oa_city` VALUES (210521, '本溪满族自治县', 3, 210500, ',210000,210500,210521,');
+INSERT INTO `oa_city` VALUES (210522, '桓仁满族自治县', 3, 210500, ',210000,210500,210522,');
+INSERT INTO `oa_city` VALUES (210600, '丹东市', 2, 210000, ',210000,210600,');
+INSERT INTO `oa_city` VALUES (210602, '元宝区', 3, 210600, ',210000,210600,210602,');
+INSERT INTO `oa_city` VALUES (210603, '振兴区', 3, 210600, ',210000,210600,210603,');
+INSERT INTO `oa_city` VALUES (210604, '振安区', 3, 210600, ',210000,210600,210604,');
+INSERT INTO `oa_city` VALUES (210624, '宽甸满族自治县', 3, 210600, ',210000,210600,210624,');
+INSERT INTO `oa_city` VALUES (210681, '东港市', 3, 210600, ',210000,210600,210681,');
+INSERT INTO `oa_city` VALUES (210682, '凤城市', 3, 210600, ',210000,210600,210682,');
+INSERT INTO `oa_city` VALUES (210700, '锦州市', 2, 210000, ',210000,210700,');
+INSERT INTO `oa_city` VALUES (210702, '古塔区', 3, 210700, ',210000,210700,210702,');
+INSERT INTO `oa_city` VALUES (210703, '凌河区', 3, 210700, ',210000,210700,210703,');
+INSERT INTO `oa_city` VALUES (210711, '太和区', 3, 210700, ',210000,210700,210711,');
+INSERT INTO `oa_city` VALUES (210726, '黑山县', 3, 210700, ',210000,210700,210726,');
+INSERT INTO `oa_city` VALUES (210727, '义　县', 3, 210700, ',210000,210700,210727,');
+INSERT INTO `oa_city` VALUES (210781, '凌海市', 3, 210700, ',210000,210700,210781,');
+INSERT INTO `oa_city` VALUES (210782, '北宁市', 3, 210700, ',210000,210700,210782,');
+INSERT INTO `oa_city` VALUES (210800, '营口市', 2, 210000, ',210000,210800,');
+INSERT INTO `oa_city` VALUES (210802, '站前区', 3, 210800, ',210000,210800,210802,');
+INSERT INTO `oa_city` VALUES (210803, '西市区', 3, 210800, ',210000,210800,210803,');
+INSERT INTO `oa_city` VALUES (210804, '鲅鱼圈区', 3, 210800, ',210000,210800,210804,');
+INSERT INTO `oa_city` VALUES (210811, '老边区', 3, 210800, ',210000,210800,210811,');
+INSERT INTO `oa_city` VALUES (210881, '盖州市', 3, 210800, ',210000,210800,210881,');
+INSERT INTO `oa_city` VALUES (210882, '大石桥市', 3, 210800, ',210000,210800,210882,');
+INSERT INTO `oa_city` VALUES (210900, '阜新市', 2, 210000, ',210000,210900,');
+INSERT INTO `oa_city` VALUES (210902, '海州区', 3, 210900, ',210000,210900,210902,');
+INSERT INTO `oa_city` VALUES (210903, '新邱区', 3, 210900, ',210000,210900,210903,');
+INSERT INTO `oa_city` VALUES (210904, '太平区', 3, 210900, ',210000,210900,210904,');
+INSERT INTO `oa_city` VALUES (210905, '清河门区', 3, 210900, ',210000,210900,210905,');
+INSERT INTO `oa_city` VALUES (210911, '细河区', 3, 210900, ',210000,210900,210911,');
+INSERT INTO `oa_city` VALUES (210921, '阜新蒙古族自治县', 3, 210900, ',210000,210900,210921,');
+INSERT INTO `oa_city` VALUES (210922, '彰武县', 3, 210900, ',210000,210900,210922,');
+INSERT INTO `oa_city` VALUES (211000, '辽阳市', 2, 210000, ',210000,211000,');
+INSERT INTO `oa_city` VALUES (211002, '白塔区', 3, 211000, ',210000,211000,211002,');
+INSERT INTO `oa_city` VALUES (211003, '文圣区', 3, 211000, ',210000,211000,211003,');
+INSERT INTO `oa_city` VALUES (211004, '宏伟区', 3, 211000, ',210000,211000,211004,');
+INSERT INTO `oa_city` VALUES (211005, '弓长岭区', 3, 211000, ',210000,211000,211005,');
+INSERT INTO `oa_city` VALUES (211011, '太子河区', 3, 211000, ',210000,211000,211011,');
+INSERT INTO `oa_city` VALUES (211021, '辽阳县', 3, 211000, ',210000,211000,211021,');
+INSERT INTO `oa_city` VALUES (211081, '灯塔市', 3, 211000, ',210000,211000,211081,');
+INSERT INTO `oa_city` VALUES (211100, '盘锦市', 2, 210000, ',210000,211100,');
+INSERT INTO `oa_city` VALUES (211102, '双台子区', 3, 211100, ',210000,211100,211102,');
+INSERT INTO `oa_city` VALUES (211103, '兴隆台区', 3, 211100, ',210000,211100,211103,');
+INSERT INTO `oa_city` VALUES (211121, '大洼县', 3, 211100, ',210000,211100,211121,');
+INSERT INTO `oa_city` VALUES (211122, '盘山县', 3, 211100, ',210000,211100,211122,');
+INSERT INTO `oa_city` VALUES (211200, '铁岭市', 2, 210000, ',210000,211200,');
+INSERT INTO `oa_city` VALUES (211202, '银州区', 3, 211200, ',210000,211200,211202,');
+INSERT INTO `oa_city` VALUES (211204, '清河区', 3, 211200, ',210000,211200,211204,');
+INSERT INTO `oa_city` VALUES (211221, '铁岭县', 3, 211200, ',210000,211200,211221,');
+INSERT INTO `oa_city` VALUES (211223, '西丰县', 3, 211200, ',210000,211200,211223,');
+INSERT INTO `oa_city` VALUES (211224, '昌图县', 3, 211200, ',210000,211200,211224,');
+INSERT INTO `oa_city` VALUES (211281, '调兵山市', 3, 211200, ',210000,211200,211281,');
+INSERT INTO `oa_city` VALUES (211282, '开原市', 3, 211200, ',210000,211200,211282,');
+INSERT INTO `oa_city` VALUES (211300, '朝阳市', 2, 210000, ',210000,211300,');
+INSERT INTO `oa_city` VALUES (211302, '双塔区', 3, 211300, ',210000,211300,211302,');
+INSERT INTO `oa_city` VALUES (211303, '龙城区', 3, 211300, ',210000,211300,211303,');
+INSERT INTO `oa_city` VALUES (211321, '朝阳县', 3, 211300, ',210000,211300,211321,');
+INSERT INTO `oa_city` VALUES (211322, '建平县', 3, 211300, ',210000,211300,211322,');
+INSERT INTO `oa_city` VALUES (211324, '喀喇沁左翼蒙古族自治县', 3, 211300, ',210000,211300,211324,');
+INSERT INTO `oa_city` VALUES (211381, '北票市', 3, 211300, ',210000,211300,211381,');
+INSERT INTO `oa_city` VALUES (211382, '凌源市', 3, 211300, ',210000,211300,211382,');
+INSERT INTO `oa_city` VALUES (211400, '葫芦岛市', 2, 210000, ',210000,211400,');
+INSERT INTO `oa_city` VALUES (211402, '连山区', 3, 211400, ',210000,211400,211402,');
+INSERT INTO `oa_city` VALUES (211403, '龙港区', 3, 211400, ',210000,211400,211403,');
+INSERT INTO `oa_city` VALUES (211404, '南票区', 3, 211400, ',210000,211400,211404,');
+INSERT INTO `oa_city` VALUES (211421, '绥中县', 3, 211400, ',210000,211400,211421,');
+INSERT INTO `oa_city` VALUES (211422, '建昌县', 3, 211400, ',210000,211400,211422,');
+INSERT INTO `oa_city` VALUES (211481, '兴城市', 3, 211400, ',210000,211400,211481,');
+INSERT INTO `oa_city` VALUES (220000, '吉林省', 1, 0, ',220000,');
+INSERT INTO `oa_city` VALUES (220100, '长春市', 2, 220000, ',220000,220100,');
+INSERT INTO `oa_city` VALUES (220102, '南关区', 3, 220100, ',220000,220100,220102,');
+INSERT INTO `oa_city` VALUES (220103, '宽城区', 3, 220100, ',220000,220100,220103,');
+INSERT INTO `oa_city` VALUES (220104, '朝阳区', 3, 220100, ',220000,220100,220104,');
+INSERT INTO `oa_city` VALUES (220105, '二道区', 3, 220100, ',220000,220100,220105,');
+INSERT INTO `oa_city` VALUES (220106, '绿园区', 3, 220100, ',220000,220100,220106,');
+INSERT INTO `oa_city` VALUES (220112, '双阳区', 3, 220100, ',220000,220100,220112,');
+INSERT INTO `oa_city` VALUES (220122, '农安县', 3, 220100, ',220000,220100,220122,');
+INSERT INTO `oa_city` VALUES (220181, '九台市', 3, 220100, ',220000,220100,220181,');
+INSERT INTO `oa_city` VALUES (220182, '榆树市', 3, 220100, ',220000,220100,220182,');
+INSERT INTO `oa_city` VALUES (220183, '德惠市', 3, 220100, ',220000,220100,220183,');
+INSERT INTO `oa_city` VALUES (220200, '吉林市', 2, 220000, ',220000,220200,');
+INSERT INTO `oa_city` VALUES (220202, '昌邑区', 3, 220200, ',220000,220200,220202,');
+INSERT INTO `oa_city` VALUES (220203, '龙潭区', 3, 220200, ',220000,220200,220203,');
+INSERT INTO `oa_city` VALUES (220204, '船营区', 3, 220200, ',220000,220200,220204,');
+INSERT INTO `oa_city` VALUES (220211, '丰满区', 3, 220200, ',220000,220200,220211,');
+INSERT INTO `oa_city` VALUES (220221, '永吉县', 3, 220200, ',220000,220200,220221,');
+INSERT INTO `oa_city` VALUES (220281, '蛟河市', 3, 220200, ',220000,220200,220281,');
+INSERT INTO `oa_city` VALUES (220282, '桦甸市', 3, 220200, ',220000,220200,220282,');
+INSERT INTO `oa_city` VALUES (220283, '舒兰市', 3, 220200, ',220000,220200,220283,');
+INSERT INTO `oa_city` VALUES (220284, '磐石市', 3, 220200, ',220000,220200,220284,');
+INSERT INTO `oa_city` VALUES (220300, '四平市', 2, 220000, ',220000,220300,');
+INSERT INTO `oa_city` VALUES (220302, '铁西区', 3, 220300, ',220000,220300,220302,');
+INSERT INTO `oa_city` VALUES (220303, '铁东区', 3, 220300, ',220000,220300,220303,');
+INSERT INTO `oa_city` VALUES (220322, '梨树县', 3, 220300, ',220000,220300,220322,');
+INSERT INTO `oa_city` VALUES (220323, '伊通满族自治县', 3, 220300, ',220000,220300,220323,');
+INSERT INTO `oa_city` VALUES (220381, '公主岭市', 3, 220300, ',220000,220300,220381,');
+INSERT INTO `oa_city` VALUES (220382, '双辽市', 3, 220300, ',220000,220300,220382,');
+INSERT INTO `oa_city` VALUES (220400, '辽源市', 2, 220000, ',220000,220400,');
+INSERT INTO `oa_city` VALUES (220402, '龙山区', 3, 220400, ',220000,220400,220402,');
+INSERT INTO `oa_city` VALUES (220403, '西安区', 3, 220400, ',220000,220400,220403,');
+INSERT INTO `oa_city` VALUES (220421, '东丰县', 3, 220400, ',220000,220400,220421,');
+INSERT INTO `oa_city` VALUES (220422, '东辽县', 3, 220400, ',220000,220400,220422,');
+INSERT INTO `oa_city` VALUES (220500, '通化市', 2, 220000, ',220000,220500,');
+INSERT INTO `oa_city` VALUES (220502, '东昌区', 3, 220500, ',220000,220500,220502,');
+INSERT INTO `oa_city` VALUES (220503, '二道江区', 3, 220500, ',220000,220500,220503,');
+INSERT INTO `oa_city` VALUES (220521, '通化县', 3, 220500, ',220000,220500,220521,');
+INSERT INTO `oa_city` VALUES (220523, '辉南县', 3, 220500, ',220000,220500,220523,');
+INSERT INTO `oa_city` VALUES (220524, '柳河县', 3, 220500, ',220000,220500,220524,');
+INSERT INTO `oa_city` VALUES (220581, '梅河口市', 3, 220500, ',220000,220500,220581,');
+INSERT INTO `oa_city` VALUES (220582, '集安市', 3, 220500, ',220000,220500,220582,');
+INSERT INTO `oa_city` VALUES (220600, '白山市', 2, 220000, ',220000,220600,');
+INSERT INTO `oa_city` VALUES (220602, '八道江区', 3, 220600, ',220000,220600,220602,');
+INSERT INTO `oa_city` VALUES (220621, '抚松县', 3, 220600, ',220000,220600,220621,');
+INSERT INTO `oa_city` VALUES (220622, '靖宇县', 3, 220600, ',220000,220600,220622,');
+INSERT INTO `oa_city` VALUES (220623, '长白朝鲜族自治县', 3, 220600, ',220000,220600,220623,');
+INSERT INTO `oa_city` VALUES (220625, '江源县', 3, 220600, ',220000,220600,220625,');
+INSERT INTO `oa_city` VALUES (220681, '临江市', 3, 220600, ',220000,220600,220681,');
+INSERT INTO `oa_city` VALUES (220700, '松原市', 2, 220000, ',220000,220700,');
+INSERT INTO `oa_city` VALUES (220702, '宁江区', 3, 220700, ',220000,220700,220702,');
+INSERT INTO `oa_city` VALUES (220721, '前郭尔罗斯蒙古族自治县', 3, 220700, ',220000,220700,220721,');
+INSERT INTO `oa_city` VALUES (220722, '长岭县', 3, 220700, ',220000,220700,220722,');
+INSERT INTO `oa_city` VALUES (220723, '乾安县', 3, 220700, ',220000,220700,220723,');
+INSERT INTO `oa_city` VALUES (220724, '扶余县', 3, 220700, ',220000,220700,220724,');
+INSERT INTO `oa_city` VALUES (220800, '白城市', 2, 220000, ',220000,220800,');
+INSERT INTO `oa_city` VALUES (220802, '洮北区', 3, 220800, ',220000,220800,220802,');
+INSERT INTO `oa_city` VALUES (220821, '镇赉县', 3, 220800, ',220000,220800,220821,');
+INSERT INTO `oa_city` VALUES (220822, '通榆县', 3, 220800, ',220000,220800,220822,');
+INSERT INTO `oa_city` VALUES (220881, '洮南市', 3, 220800, ',220000,220800,220881,');
+INSERT INTO `oa_city` VALUES (220882, '大安市', 3, 220800, ',220000,220800,220882,');
+INSERT INTO `oa_city` VALUES (222400, '延边朝鲜族自治州', 2, 220000, ',220000,222400,');
+INSERT INTO `oa_city` VALUES (222401, '延吉市', 3, 222400, ',220000,222400,222401,');
+INSERT INTO `oa_city` VALUES (222402, '图们市', 3, 222400, ',220000,222400,222402,');
+INSERT INTO `oa_city` VALUES (222403, '敦化市', 3, 222400, ',220000,222400,222403,');
+INSERT INTO `oa_city` VALUES (222404, '珲春市', 3, 222400, ',220000,222400,222404,');
+INSERT INTO `oa_city` VALUES (222405, '龙井市', 3, 222400, ',220000,222400,222405,');
+INSERT INTO `oa_city` VALUES (222406, '和龙市', 3, 222400, ',220000,222400,222406,');
+INSERT INTO `oa_city` VALUES (222424, '汪清县', 3, 222400, ',220000,222400,222424,');
+INSERT INTO `oa_city` VALUES (222426, '安图县', 3, 222400, ',220000,222400,222426,');
+INSERT INTO `oa_city` VALUES (230000, '黑龙江', 1, 0, ',230000,');
+INSERT INTO `oa_city` VALUES (230100, '哈尔滨市', 2, 230000, ',230000,230100,');
+INSERT INTO `oa_city` VALUES (230102, '道里区', 3, 230100, ',230000,230100,230102,');
+INSERT INTO `oa_city` VALUES (230103, '南岗区', 3, 230100, ',230000,230100,230103,');
+INSERT INTO `oa_city` VALUES (230104, '道外区', 3, 230100, ',230000,230100,230104,');
+INSERT INTO `oa_city` VALUES (230106, '香坊区', 3, 230100, ',230000,230100,230106,');
+INSERT INTO `oa_city` VALUES (230107, '动力区', 3, 230100, ',230000,230100,230107,');
+INSERT INTO `oa_city` VALUES (230108, '平房区', 3, 230100, ',230000,230100,230108,');
+INSERT INTO `oa_city` VALUES (230109, '松北区', 3, 230100, ',230000,230100,230109,');
+INSERT INTO `oa_city` VALUES (230111, '呼兰区', 3, 230100, ',230000,230100,230111,');
+INSERT INTO `oa_city` VALUES (230123, '依兰县', 3, 230100, ',230000,230100,230123,');
+INSERT INTO `oa_city` VALUES (230124, '方正县', 3, 230100, ',230000,230100,230124,');
+INSERT INTO `oa_city` VALUES (230125, '宾　县', 3, 230100, ',230000,230100,230125,');
+INSERT INTO `oa_city` VALUES (230126, '巴彦县', 3, 230100, ',230000,230100,230126,');
+INSERT INTO `oa_city` VALUES (230127, '木兰县', 3, 230100, ',230000,230100,230127,');
+INSERT INTO `oa_city` VALUES (230128, '通河县', 3, 230100, ',230000,230100,230128,');
+INSERT INTO `oa_city` VALUES (230129, '延寿县', 3, 230100, ',230000,230100,230129,');
+INSERT INTO `oa_city` VALUES (230181, '阿城市', 3, 230100, ',230000,230100,230181,');
+INSERT INTO `oa_city` VALUES (230182, '双城市', 3, 230100, ',230000,230100,230182,');
+INSERT INTO `oa_city` VALUES (230183, '尚志市', 3, 230100, ',230000,230100,230183,');
+INSERT INTO `oa_city` VALUES (230184, '五常市', 3, 230100, ',230000,230100,230184,');
+INSERT INTO `oa_city` VALUES (230200, '齐齐哈尔市', 2, 230000, ',230000,230200,');
+INSERT INTO `oa_city` VALUES (230202, '龙沙区', 3, 230200, ',230000,230200,230202,');
+INSERT INTO `oa_city` VALUES (230203, '建华区', 3, 230200, ',230000,230200,230203,');
+INSERT INTO `oa_city` VALUES (230204, '铁锋区', 3, 230200, ',230000,230200,230204,');
+INSERT INTO `oa_city` VALUES (230205, '昂昂溪区', 3, 230200, ',230000,230200,230205,');
+INSERT INTO `oa_city` VALUES (230206, '富拉尔基区', 3, 230200, ',230000,230200,230206,');
+INSERT INTO `oa_city` VALUES (230207, '碾子山区', 3, 230200, ',230000,230200,230207,');
+INSERT INTO `oa_city` VALUES (230208, '梅里斯达斡尔族区', 3, 230200, ',230000,230200,230208,');
+INSERT INTO `oa_city` VALUES (230221, '龙江县', 3, 230200, ',230000,230200,230221,');
+INSERT INTO `oa_city` VALUES (230223, '依安县', 3, 230200, ',230000,230200,230223,');
+INSERT INTO `oa_city` VALUES (230224, '泰来县', 3, 230200, ',230000,230200,230224,');
+INSERT INTO `oa_city` VALUES (230225, '甘南县', 3, 230200, ',230000,230200,230225,');
+INSERT INTO `oa_city` VALUES (230227, '富裕县', 3, 230200, ',230000,230200,230227,');
+INSERT INTO `oa_city` VALUES (230229, '克山县', 3, 230200, ',230000,230200,230229,');
+INSERT INTO `oa_city` VALUES (230230, '克东县', 3, 230200, ',230000,230200,230230,');
+INSERT INTO `oa_city` VALUES (230231, '拜泉县', 3, 230200, ',230000,230200,230231,');
+INSERT INTO `oa_city` VALUES (230281, '讷河市', 3, 230200, ',230000,230200,230281,');
+INSERT INTO `oa_city` VALUES (230300, '鸡西市', 2, 230000, ',230000,230300,');
+INSERT INTO `oa_city` VALUES (230302, '鸡冠区', 3, 230300, ',230000,230300,230302,');
+INSERT INTO `oa_city` VALUES (230303, '恒山区', 3, 230300, ',230000,230300,230303,');
+INSERT INTO `oa_city` VALUES (230304, '滴道区', 3, 230300, ',230000,230300,230304,');
+INSERT INTO `oa_city` VALUES (230305, '梨树区', 3, 230300, ',230000,230300,230305,');
+INSERT INTO `oa_city` VALUES (230306, '城子河区', 3, 230300, ',230000,230300,230306,');
+INSERT INTO `oa_city` VALUES (230307, '麻山区', 3, 230300, ',230000,230300,230307,');
+INSERT INTO `oa_city` VALUES (230321, '鸡东县', 3, 230300, ',230000,230300,230321,');
+INSERT INTO `oa_city` VALUES (230381, '虎林市', 3, 230300, ',230000,230300,230381,');
+INSERT INTO `oa_city` VALUES (230382, '密山市', 3, 230300, ',230000,230300,230382,');
+INSERT INTO `oa_city` VALUES (230400, '鹤岗市', 2, 230000, ',230000,230400,');
+INSERT INTO `oa_city` VALUES (230402, '向阳区', 3, 230400, ',230000,230400,230402,');
+INSERT INTO `oa_city` VALUES (230403, '工农区', 3, 230400, ',230000,230400,230403,');
+INSERT INTO `oa_city` VALUES (230404, '南山区', 3, 230400, ',230000,230400,230404,');
+INSERT INTO `oa_city` VALUES (230405, '兴安区', 3, 230400, ',230000,230400,230405,');
+INSERT INTO `oa_city` VALUES (230406, '东山区', 3, 230400, ',230000,230400,230406,');
+INSERT INTO `oa_city` VALUES (230407, '兴山区', 3, 230400, ',230000,230400,230407,');
+INSERT INTO `oa_city` VALUES (230421, '萝北县', 3, 230400, ',230000,230400,230421,');
+INSERT INTO `oa_city` VALUES (230422, '绥滨县', 3, 230400, ',230000,230400,230422,');
+INSERT INTO `oa_city` VALUES (230500, '双鸭山市', 2, 230000, ',230000,230500,');
+INSERT INTO `oa_city` VALUES (230502, '尖山区', 3, 230500, ',230000,230500,230502,');
+INSERT INTO `oa_city` VALUES (230503, '岭东区', 3, 230500, ',230000,230500,230503,');
+INSERT INTO `oa_city` VALUES (230505, '四方台区', 3, 230500, ',230000,230500,230505,');
+INSERT INTO `oa_city` VALUES (230506, '宝山区', 3, 230500, ',230000,230500,230506,');
+INSERT INTO `oa_city` VALUES (230521, '集贤县', 3, 230500, ',230000,230500,230521,');
+INSERT INTO `oa_city` VALUES (230522, '友谊县', 3, 230500, ',230000,230500,230522,');
+INSERT INTO `oa_city` VALUES (230523, '宝清县', 3, 230500, ',230000,230500,230523,');
+INSERT INTO `oa_city` VALUES (230524, '饶河县', 3, 230500, ',230000,230500,230524,');
+INSERT INTO `oa_city` VALUES (230600, '大庆市', 2, 230000, ',230000,230600,');
+INSERT INTO `oa_city` VALUES (230602, '萨尔图区', 3, 230600, ',230000,230600,230602,');
+INSERT INTO `oa_city` VALUES (230603, '龙凤区', 3, 230600, ',230000,230600,230603,');
+INSERT INTO `oa_city` VALUES (230604, '让胡路区', 3, 230600, ',230000,230600,230604,');
+INSERT INTO `oa_city` VALUES (230605, '红岗区', 3, 230600, ',230000,230600,230605,');
+INSERT INTO `oa_city` VALUES (230606, '大同区', 3, 230600, ',230000,230600,230606,');
+INSERT INTO `oa_city` VALUES (230621, '肇州县', 3, 230600, ',230000,230600,230621,');
+INSERT INTO `oa_city` VALUES (230622, '肇源县', 3, 230600, ',230000,230600,230622,');
+INSERT INTO `oa_city` VALUES (230623, '林甸县', 3, 230600, ',230000,230600,230623,');
+INSERT INTO `oa_city` VALUES (230624, '杜尔伯特蒙古族自治县', 3, 230600, ',230000,230600,230624,');
+INSERT INTO `oa_city` VALUES (230700, '伊春市', 2, 230000, ',230000,230700,');
+INSERT INTO `oa_city` VALUES (230702, '伊春区', 3, 230700, ',230000,230700,230702,');
+INSERT INTO `oa_city` VALUES (230703, '南岔区', 3, 230700, ',230000,230700,230703,');
+INSERT INTO `oa_city` VALUES (230704, '友好区', 3, 230700, ',230000,230700,230704,');
+INSERT INTO `oa_city` VALUES (230705, '西林区', 3, 230700, ',230000,230700,230705,');
+INSERT INTO `oa_city` VALUES (230706, '翠峦区', 3, 230700, ',230000,230700,230706,');
+INSERT INTO `oa_city` VALUES (230707, '新青区', 3, 230700, ',230000,230700,230707,');
+INSERT INTO `oa_city` VALUES (230708, '美溪区', 3, 230700, ',230000,230700,230708,');
+INSERT INTO `oa_city` VALUES (230709, '金山屯区', 3, 230700, ',230000,230700,230709,');
+INSERT INTO `oa_city` VALUES (230710, '五营区', 3, 230700, ',230000,230700,230710,');
+INSERT INTO `oa_city` VALUES (230711, '乌马河区', 3, 230700, ',230000,230700,230711,');
+INSERT INTO `oa_city` VALUES (230712, '汤旺河区', 3, 230700, ',230000,230700,230712,');
+INSERT INTO `oa_city` VALUES (230713, '带岭区', 3, 230700, ',230000,230700,230713,');
+INSERT INTO `oa_city` VALUES (230714, '乌伊岭区', 3, 230700, ',230000,230700,230714,');
+INSERT INTO `oa_city` VALUES (230715, '红星区', 3, 230700, ',230000,230700,230715,');
+INSERT INTO `oa_city` VALUES (230716, '上甘岭区', 3, 230700, ',230000,230700,230716,');
+INSERT INTO `oa_city` VALUES (230722, '嘉荫县', 3, 230700, ',230000,230700,230722,');
+INSERT INTO `oa_city` VALUES (230781, '铁力市', 3, 230700, ',230000,230700,230781,');
+INSERT INTO `oa_city` VALUES (230800, '佳木斯市', 2, 230000, ',230000,230800,');
+INSERT INTO `oa_city` VALUES (230802, '永红区', 3, 230800, ',230000,230800,230802,');
+INSERT INTO `oa_city` VALUES (230803, '向阳区', 3, 230800, ',230000,230800,230803,');
+INSERT INTO `oa_city` VALUES (230804, '前进区', 3, 230800, ',230000,230800,230804,');
+INSERT INTO `oa_city` VALUES (230805, '东风区', 3, 230800, ',230000,230800,230805,');
+INSERT INTO `oa_city` VALUES (230811, '郊　区', 3, 230800, ',230000,230800,230811,');
+INSERT INTO `oa_city` VALUES (230822, '桦南县', 3, 230800, ',230000,230800,230822,');
+INSERT INTO `oa_city` VALUES (230826, '桦川县', 3, 230800, ',230000,230800,230826,');
+INSERT INTO `oa_city` VALUES (230828, '汤原县', 3, 230800, ',230000,230800,230828,');
+INSERT INTO `oa_city` VALUES (230833, '抚远县', 3, 230800, ',230000,230800,230833,');
+INSERT INTO `oa_city` VALUES (230881, '同江市', 3, 230800, ',230000,230800,230881,');
+INSERT INTO `oa_city` VALUES (230882, '富锦市', 3, 230800, ',230000,230800,230882,');
+INSERT INTO `oa_city` VALUES (230900, '七台河市', 2, 230000, ',230000,230900,');
+INSERT INTO `oa_city` VALUES (230902, '新兴区', 3, 230900, ',230000,230900,230902,');
+INSERT INTO `oa_city` VALUES (230903, '桃山区', 3, 230900, ',230000,230900,230903,');
+INSERT INTO `oa_city` VALUES (230904, '茄子河区', 3, 230900, ',230000,230900,230904,');
+INSERT INTO `oa_city` VALUES (230921, '勃利县', 3, 230900, ',230000,230900,230921,');
+INSERT INTO `oa_city` VALUES (231000, '牡丹江市', 2, 230000, ',230000,231000,');
+INSERT INTO `oa_city` VALUES (231002, '东安区', 3, 231000, ',230000,231000,231002,');
+INSERT INTO `oa_city` VALUES (231003, '阳明区', 3, 231000, ',230000,231000,231003,');
+INSERT INTO `oa_city` VALUES (231004, '爱民区', 3, 231000, ',230000,231000,231004,');
+INSERT INTO `oa_city` VALUES (231005, '西安区', 3, 231000, ',230000,231000,231005,');
+INSERT INTO `oa_city` VALUES (231024, '东宁县', 3, 231000, ',230000,231000,231024,');
+INSERT INTO `oa_city` VALUES (231025, '林口县', 3, 231000, ',230000,231000,231025,');
+INSERT INTO `oa_city` VALUES (231081, '绥芬河市', 3, 231000, ',230000,231000,231081,');
+INSERT INTO `oa_city` VALUES (231083, '海林市', 3, 231000, ',230000,231000,231083,');
+INSERT INTO `oa_city` VALUES (231084, '宁安市', 3, 231000, ',230000,231000,231084,');
+INSERT INTO `oa_city` VALUES (231085, '穆棱市', 3, 231000, ',230000,231000,231085,');
+INSERT INTO `oa_city` VALUES (231100, '黑河市', 2, 230000, ',230000,231100,');
+INSERT INTO `oa_city` VALUES (231102, '爱辉区', 3, 231100, ',230000,231100,231102,');
+INSERT INTO `oa_city` VALUES (231121, '嫩江县', 3, 231100, ',230000,231100,231121,');
+INSERT INTO `oa_city` VALUES (231123, '逊克县', 3, 231100, ',230000,231100,231123,');
+INSERT INTO `oa_city` VALUES (231124, '孙吴县', 3, 231100, ',230000,231100,231124,');
+INSERT INTO `oa_city` VALUES (231181, '北安市', 3, 231100, ',230000,231100,231181,');
+INSERT INTO `oa_city` VALUES (231182, '五大连池市', 3, 231100, ',230000,231100,231182,');
+INSERT INTO `oa_city` VALUES (231200, '绥化市', 2, 230000, ',230000,231200,');
+INSERT INTO `oa_city` VALUES (231202, '北林区', 3, 231200, ',230000,231200,231202,');
+INSERT INTO `oa_city` VALUES (231221, '望奎县', 3, 231200, ',230000,231200,231221,');
+INSERT INTO `oa_city` VALUES (231222, '兰西县', 3, 231200, ',230000,231200,231222,');
+INSERT INTO `oa_city` VALUES (231223, '青冈县', 3, 231200, ',230000,231200,231223,');
+INSERT INTO `oa_city` VALUES (231224, '庆安县', 3, 231200, ',230000,231200,231224,');
+INSERT INTO `oa_city` VALUES (231225, '明水县', 3, 231200, ',230000,231200,231225,');
+INSERT INTO `oa_city` VALUES (231226, '绥棱县', 3, 231200, ',230000,231200,231226,');
+INSERT INTO `oa_city` VALUES (231281, '安达市', 3, 231200, ',230000,231200,231281,');
+INSERT INTO `oa_city` VALUES (231282, '肇东市', 3, 231200, ',230000,231200,231282,');
+INSERT INTO `oa_city` VALUES (231283, '海伦市', 3, 231200, ',230000,231200,231283,');
+INSERT INTO `oa_city` VALUES (232700, '大兴安岭地区', 2, 230000, ',230000,232700,');
+INSERT INTO `oa_city` VALUES (232721, '呼玛县', 3, 232700, ',230000,232700,232721,');
+INSERT INTO `oa_city` VALUES (232722, '塔河县', 3, 232700, ',230000,232700,232722,');
+INSERT INTO `oa_city` VALUES (232723, '漠河县', 3, 232700, ',230000,232700,232723,');
+INSERT INTO `oa_city` VALUES (310000, '上海市', 1, 0, ',310000,');
+INSERT INTO `oa_city` VALUES (310101, '黄浦区', 2, 310000, ',310000,310101,');
+INSERT INTO `oa_city` VALUES (310103, '卢湾区', 2, 310000, ',310000,310103,');
+INSERT INTO `oa_city` VALUES (310104, '徐汇区', 2, 310000, ',310000,310104,');
+INSERT INTO `oa_city` VALUES (310105, '长宁区', 2, 310000, ',310000,310105,');
+INSERT INTO `oa_city` VALUES (310106, '静安区', 2, 310000, ',310000,310106,');
+INSERT INTO `oa_city` VALUES (310107, '普陀区', 2, 310000, ',310000,310107,');
+INSERT INTO `oa_city` VALUES (310108, '闸北区', 2, 310000, ',310000,310108,');
+INSERT INTO `oa_city` VALUES (310109, '虹口区', 2, 310000, ',310000,310109,');
+INSERT INTO `oa_city` VALUES (310110, '杨浦区', 2, 310000, ',310000,310110,');
+INSERT INTO `oa_city` VALUES (310112, '闵行区', 2, 310000, ',310000,310112,');
+INSERT INTO `oa_city` VALUES (310113, '宝山区', 2, 310000, ',310000,310113,');
+INSERT INTO `oa_city` VALUES (310114, '嘉定区', 2, 310000, ',310000,310114,');
+INSERT INTO `oa_city` VALUES (310115, '浦东新区', 2, 310000, ',310000,310115,');
+INSERT INTO `oa_city` VALUES (310116, '金山区', 2, 310000, ',310000,310116,');
+INSERT INTO `oa_city` VALUES (310117, '松江区', 2, 310000, ',310000,310117,');
+INSERT INTO `oa_city` VALUES (310118, '青浦区', 2, 310000, ',310000,310118,');
+INSERT INTO `oa_city` VALUES (310120, '奉贤区', 2, 310000, ',310000,310120,');
+INSERT INTO `oa_city` VALUES (310230, '崇明县', 3, 310000, ',310000,310230,');
+INSERT INTO `oa_city` VALUES (320000, '江苏省', 1, 0, ',320000,');
+INSERT INTO `oa_city` VALUES (320100, '南京市', 2, 320000, ',320000,320100,');
+INSERT INTO `oa_city` VALUES (320102, '玄武区', 3, 320100, ',320000,320100,320102,');
+INSERT INTO `oa_city` VALUES (320103, '白下区', 3, 320100, ',320000,320100,320103,');
+INSERT INTO `oa_city` VALUES (320104, '秦淮区', 3, 320100, ',320000,320100,320104,');
+INSERT INTO `oa_city` VALUES (320105, '建邺区', 3, 320100, ',320000,320100,320105,');
+INSERT INTO `oa_city` VALUES (320106, '鼓楼区', 3, 320100, ',320000,320100,320106,');
+INSERT INTO `oa_city` VALUES (320107, '下关区', 3, 320100, ',320000,320100,320107,');
+INSERT INTO `oa_city` VALUES (320111, '浦口区', 3, 320100, ',320000,320100,320111,');
+INSERT INTO `oa_city` VALUES (320113, '栖霞区', 3, 320100, ',320000,320100,320113,');
+INSERT INTO `oa_city` VALUES (320114, '雨花台区', 3, 320100, ',320000,320100,320114,');
+INSERT INTO `oa_city` VALUES (320115, '江宁区', 3, 320100, ',320000,320100,320115,');
+INSERT INTO `oa_city` VALUES (320116, '六合区', 3, 320100, ',320000,320100,320116,');
+INSERT INTO `oa_city` VALUES (320124, '溧水县', 3, 320100, ',320000,320100,320124,');
+INSERT INTO `oa_city` VALUES (320125, '高淳县', 3, 320100, ',320000,320100,320125,');
+INSERT INTO `oa_city` VALUES (320200, '无锡市', 2, 320000, ',320000,320200,');
+INSERT INTO `oa_city` VALUES (320202, '崇安区', 3, 320200, ',320000,320200,320202,');
+INSERT INTO `oa_city` VALUES (320203, '南长区', 3, 320200, ',320000,320200,320203,');
+INSERT INTO `oa_city` VALUES (320204, '北塘区', 3, 320200, ',320000,320200,320204,');
+INSERT INTO `oa_city` VALUES (320205, '锡山区', 3, 320200, ',320000,320200,320205,');
+INSERT INTO `oa_city` VALUES (320206, '惠山区', 3, 320200, ',320000,320200,320206,');
+INSERT INTO `oa_city` VALUES (320211, '滨湖区', 3, 320200, ',320000,320200,320211,');
+INSERT INTO `oa_city` VALUES (320281, '江阴市', 3, 320200, ',320000,320200,320281,');
+INSERT INTO `oa_city` VALUES (320282, '宜兴市', 3, 320200, ',320000,320200,320282,');
+INSERT INTO `oa_city` VALUES (320300, '徐州市', 2, 320000, ',320000,320300,');
+INSERT INTO `oa_city` VALUES (320302, '鼓楼区', 3, 320300, ',320000,320300,320302,');
+INSERT INTO `oa_city` VALUES (320303, '云龙区', 3, 320300, ',320000,320300,320303,');
+INSERT INTO `oa_city` VALUES (320304, '九里区', 3, 320300, ',320000,320300,320304,');
+INSERT INTO `oa_city` VALUES (320305, '贾汪区', 3, 320300, ',320000,320300,320305,');
+INSERT INTO `oa_city` VALUES (320311, '泉山区', 3, 320300, ',320000,320300,320311,');
+INSERT INTO `oa_city` VALUES (320321, '丰　县', 3, 320300, ',320000,320300,320321,');
+INSERT INTO `oa_city` VALUES (320322, '沛　县', 3, 320300, ',320000,320300,320322,');
+INSERT INTO `oa_city` VALUES (320323, '铜山县', 3, 320300, ',320000,320300,320323,');
+INSERT INTO `oa_city` VALUES (320324, '睢宁县', 3, 320300, ',320000,320300,320324,');
+INSERT INTO `oa_city` VALUES (320381, '新沂市', 3, 320300, ',320000,320300,320381,');
+INSERT INTO `oa_city` VALUES (320382, '邳州市', 3, 320300, ',320000,320300,320382,');
+INSERT INTO `oa_city` VALUES (320400, '常州市', 2, 320000, ',320000,320400,');
+INSERT INTO `oa_city` VALUES (320402, '天宁区', 3, 320400, ',320000,320400,320402,');
+INSERT INTO `oa_city` VALUES (320404, '钟楼区', 3, 320400, ',320000,320400,320404,');
+INSERT INTO `oa_city` VALUES (320405, '戚墅堰区', 3, 320400, ',320000,320400,320405,');
+INSERT INTO `oa_city` VALUES (320411, '新北区', 3, 320400, ',320000,320400,320411,');
+INSERT INTO `oa_city` VALUES (320412, '武进区', 3, 320400, ',320000,320400,320412,');
+INSERT INTO `oa_city` VALUES (320481, '溧阳市', 3, 320400, ',320000,320400,320481,');
+INSERT INTO `oa_city` VALUES (320482, '金坛市', 3, 320400, ',320000,320400,320482,');
+INSERT INTO `oa_city` VALUES (320500, '苏州市', 2, 320000, ',320000,320500,');
+INSERT INTO `oa_city` VALUES (320502, '沧浪区', 3, 320500, ',320000,320500,320502,');
+INSERT INTO `oa_city` VALUES (320503, '平江区', 3, 320500, ',320000,320500,320503,');
+INSERT INTO `oa_city` VALUES (320504, '金阊区', 3, 320500, ',320000,320500,320504,');
+INSERT INTO `oa_city` VALUES (320505, '虎丘区', 3, 320500, ',320000,320500,320505,');
+INSERT INTO `oa_city` VALUES (320506, '吴中区', 3, 320500, ',320000,320500,320506,');
+INSERT INTO `oa_city` VALUES (320507, '相城区', 3, 320500, ',320000,320500,320507,');
+INSERT INTO `oa_city` VALUES (320581, '常熟市', 3, 320500, ',320000,320500,320581,');
+INSERT INTO `oa_city` VALUES (320582, '张家港市', 3, 320500, ',320000,320500,320582,');
+INSERT INTO `oa_city` VALUES (320583, '昆山市', 3, 320500, ',320000,320500,320583,');
+INSERT INTO `oa_city` VALUES (320584, '吴江市', 3, 320500, ',320000,320500,320584,');
+INSERT INTO `oa_city` VALUES (320585, '太仓市', 3, 320500, ',320000,320500,320585,');
+INSERT INTO `oa_city` VALUES (320600, '南通市', 2, 320000, ',320000,320600,');
+INSERT INTO `oa_city` VALUES (320602, '崇川区', 3, 320600, ',320000,320600,320602,');
+INSERT INTO `oa_city` VALUES (320611, '港闸区', 3, 320600, ',320000,320600,320611,');
+INSERT INTO `oa_city` VALUES (320621, '海安县', 3, 320600, ',320000,320600,320621,');
+INSERT INTO `oa_city` VALUES (320623, '如东县', 3, 320600, ',320000,320600,320623,');
+INSERT INTO `oa_city` VALUES (320681, '启东市', 3, 320600, ',320000,320600,320681,');
+INSERT INTO `oa_city` VALUES (320682, '如皋市', 3, 320600, ',320000,320600,320682,');
+INSERT INTO `oa_city` VALUES (320683, '通州市', 3, 320600, ',320000,320600,320683,');
+INSERT INTO `oa_city` VALUES (320684, '海门市', 3, 320600, ',320000,320600,320684,');
+INSERT INTO `oa_city` VALUES (320700, '连云港市', 2, 320000, ',320000,320700,');
+INSERT INTO `oa_city` VALUES (320703, '连云区', 3, 320700, ',320000,320700,320703,');
+INSERT INTO `oa_city` VALUES (320705, '新浦区', 3, 320700, ',320000,320700,320705,');
+INSERT INTO `oa_city` VALUES (320706, '海州区', 3, 320700, ',320000,320700,320706,');
+INSERT INTO `oa_city` VALUES (320721, '赣榆县', 3, 320700, ',320000,320700,320721,');
+INSERT INTO `oa_city` VALUES (320722, '东海县', 3, 320700, ',320000,320700,320722,');
+INSERT INTO `oa_city` VALUES (320723, '灌云县', 3, 320700, ',320000,320700,320723,');
+INSERT INTO `oa_city` VALUES (320724, '灌南县', 3, 320700, ',320000,320700,320724,');
+INSERT INTO `oa_city` VALUES (320800, '淮安市', 2, 320000, ',320000,320800,');
+INSERT INTO `oa_city` VALUES (320802, '清河区', 3, 320800, ',320000,320800,320802,');
+INSERT INTO `oa_city` VALUES (320803, '楚州区', 3, 320800, ',320000,320800,320803,');
+INSERT INTO `oa_city` VALUES (320804, '淮阴区', 3, 320800, ',320000,320800,320804,');
+INSERT INTO `oa_city` VALUES (320811, '清浦区', 3, 320800, ',320000,320800,320811,');
+INSERT INTO `oa_city` VALUES (320826, '涟水县', 3, 320800, ',320000,320800,320826,');
+INSERT INTO `oa_city` VALUES (320829, '洪泽县', 3, 320800, ',320000,320800,320829,');
+INSERT INTO `oa_city` VALUES (320830, '盱眙县', 3, 320800, ',320000,320800,320830,');
+INSERT INTO `oa_city` VALUES (320831, '金湖县', 3, 320800, ',320000,320800,320831,');
+INSERT INTO `oa_city` VALUES (320900, '盐城市', 2, 320000, ',320000,320900,');
+INSERT INTO `oa_city` VALUES (320902, '亭湖区', 3, 320900, ',320000,320900,320902,');
+INSERT INTO `oa_city` VALUES (320903, '盐都区', 3, 320900, ',320000,320900,320903,');
+INSERT INTO `oa_city` VALUES (320921, '响水县', 3, 320900, ',320000,320900,320921,');
+INSERT INTO `oa_city` VALUES (320922, '滨海县', 3, 320900, ',320000,320900,320922,');
+INSERT INTO `oa_city` VALUES (320923, '阜宁县', 3, 320900, ',320000,320900,320923,');
+INSERT INTO `oa_city` VALUES (320924, '射阳县', 3, 320900, ',320000,320900,320924,');
+INSERT INTO `oa_city` VALUES (320925, '建湖县', 3, 320900, ',320000,320900,320925,');
+INSERT INTO `oa_city` VALUES (320981, '东台市', 3, 320900, ',320000,320900,320981,');
+INSERT INTO `oa_city` VALUES (320982, '大丰市', 3, 320900, ',320000,320900,320982,');
+INSERT INTO `oa_city` VALUES (321000, '扬州市', 2, 320000, ',320000,321000,');
+INSERT INTO `oa_city` VALUES (321002, '广陵区', 3, 321000, ',320000,321000,321002,');
+INSERT INTO `oa_city` VALUES (321003, '邗江区', 3, 321000, ',320000,321000,321003,');
+INSERT INTO `oa_city` VALUES (321011, '郊　区', 3, 321000, ',320000,321000,321011,');
+INSERT INTO `oa_city` VALUES (321023, '宝应县', 3, 321000, ',320000,321000,321023,');
+INSERT INTO `oa_city` VALUES (321081, '仪征市', 3, 321000, ',320000,321000,321081,');
+INSERT INTO `oa_city` VALUES (321084, '高邮市', 3, 321000, ',320000,321000,321084,');
+INSERT INTO `oa_city` VALUES (321088, '江都市', 3, 321000, ',320000,321000,321088,');
+INSERT INTO `oa_city` VALUES (321100, '镇江市', 2, 320000, ',320000,321100,');
+INSERT INTO `oa_city` VALUES (321102, '京口区', 3, 321100, ',320000,321100,321102,');
+INSERT INTO `oa_city` VALUES (321111, '润州区', 3, 321100, ',320000,321100,321111,');
+INSERT INTO `oa_city` VALUES (321112, '丹徒区', 3, 321100, ',320000,321100,321112,');
+INSERT INTO `oa_city` VALUES (321181, '丹阳市', 3, 321100, ',320000,321100,321181,');
+INSERT INTO `oa_city` VALUES (321182, '扬中市', 3, 321100, ',320000,321100,321182,');
+INSERT INTO `oa_city` VALUES (321183, '句容市', 3, 321100, ',320000,321100,321183,');
+INSERT INTO `oa_city` VALUES (321200, '泰州市', 2, 320000, ',320000,321200,');
+INSERT INTO `oa_city` VALUES (321202, '海陵区', 3, 321200, ',320000,321200,321202,');
+INSERT INTO `oa_city` VALUES (321203, '高港区', 3, 321200, ',320000,321200,321203,');
+INSERT INTO `oa_city` VALUES (321281, '兴化市', 3, 321200, ',320000,321200,321281,');
+INSERT INTO `oa_city` VALUES (321282, '靖江市', 3, 321200, ',320000,321200,321282,');
+INSERT INTO `oa_city` VALUES (321283, '泰兴市', 3, 321200, ',320000,321200,321283,');
+INSERT INTO `oa_city` VALUES (321284, '姜堰市', 3, 321200, ',320000,321200,321284,');
+INSERT INTO `oa_city` VALUES (321300, '宿迁市', 2, 320000, ',320000,321300,');
+INSERT INTO `oa_city` VALUES (321302, '宿城区', 3, 321300, ',320000,321300,321302,');
+INSERT INTO `oa_city` VALUES (321311, '宿豫区', 3, 321300, ',320000,321300,321311,');
+INSERT INTO `oa_city` VALUES (321322, '沭阳县', 3, 321300, ',320000,321300,321322,');
+INSERT INTO `oa_city` VALUES (321323, '泗阳县', 3, 321300, ',320000,321300,321323,');
+INSERT INTO `oa_city` VALUES (321324, '泗洪县', 3, 321300, ',320000,321300,321324,');
+INSERT INTO `oa_city` VALUES (330000, '浙江省', 1, 0, ',330000,');
+INSERT INTO `oa_city` VALUES (330100, '杭州市', 2, 330000, ',330000,330100,');
+INSERT INTO `oa_city` VALUES (330102, '上城区', 3, 330100, ',330000,330100,330102,');
+INSERT INTO `oa_city` VALUES (330103, '下城区', 3, 330100, ',330000,330100,330103,');
+INSERT INTO `oa_city` VALUES (330104, '江干区', 3, 330100, ',330000,330100,330104,');
+INSERT INTO `oa_city` VALUES (330105, '拱墅区', 3, 330100, ',330000,330100,330105,');
+INSERT INTO `oa_city` VALUES (330106, '西湖区', 3, 330100, ',330000,330100,330106,');
+INSERT INTO `oa_city` VALUES (330108, '滨江区', 3, 330100, ',330000,330100,330108,');
+INSERT INTO `oa_city` VALUES (330109, '萧山区', 3, 330100, ',330000,330100,330109,');
+INSERT INTO `oa_city` VALUES (330110, '余杭区', 3, 330100, ',330000,330100,330110,');
+INSERT INTO `oa_city` VALUES (330122, '桐庐县', 3, 330100, ',330000,330100,330122,');
+INSERT INTO `oa_city` VALUES (330127, '淳安县', 3, 330100, ',330000,330100,330127,');
+INSERT INTO `oa_city` VALUES (330182, '建德市', 3, 330100, ',330000,330100,330182,');
+INSERT INTO `oa_city` VALUES (330183, '富阳市', 3, 330100, ',330000,330100,330183,');
+INSERT INTO `oa_city` VALUES (330185, '临安市', 3, 330100, ',330000,330100,330185,');
+INSERT INTO `oa_city` VALUES (330200, '宁波市', 2, 330000, ',330000,330200,');
+INSERT INTO `oa_city` VALUES (330203, '海曙区', 3, 330200, ',330000,330200,330203,');
+INSERT INTO `oa_city` VALUES (330204, '江东区', 3, 330200, ',330000,330200,330204,');
+INSERT INTO `oa_city` VALUES (330205, '江北区', 3, 330200, ',330000,330200,330205,');
+INSERT INTO `oa_city` VALUES (330206, '北仑区', 3, 330200, ',330000,330200,330206,');
+INSERT INTO `oa_city` VALUES (330211, '镇海区', 3, 330200, ',330000,330200,330211,');
+INSERT INTO `oa_city` VALUES (330212, '鄞州区', 3, 330200, ',330000,330200,330212,');
+INSERT INTO `oa_city` VALUES (330225, '象山县', 3, 330200, ',330000,330200,330225,');
+INSERT INTO `oa_city` VALUES (330226, '宁海县', 3, 330200, ',330000,330200,330226,');
+INSERT INTO `oa_city` VALUES (330281, '余姚市', 3, 330200, ',330000,330200,330281,');
+INSERT INTO `oa_city` VALUES (330282, '慈溪市', 3, 330200, ',330000,330200,330282,');
+INSERT INTO `oa_city` VALUES (330283, '奉化市', 3, 330200, ',330000,330200,330283,');
+INSERT INTO `oa_city` VALUES (330300, '温州市', 2, 330000, ',330000,330300,');
+INSERT INTO `oa_city` VALUES (330302, '鹿城区', 3, 330300, ',330000,330300,330302,');
+INSERT INTO `oa_city` VALUES (330303, '龙湾区', 3, 330300, ',330000,330300,330303,');
+INSERT INTO `oa_city` VALUES (330304, '瓯海区', 3, 330300, ',330000,330300,330304,');
+INSERT INTO `oa_city` VALUES (330322, '洞头县', 3, 330300, ',330000,330300,330322,');
+INSERT INTO `oa_city` VALUES (330324, '永嘉县', 3, 330300, ',330000,330300,330324,');
+INSERT INTO `oa_city` VALUES (330326, '平阳县', 3, 330300, ',330000,330300,330326,');
+INSERT INTO `oa_city` VALUES (330327, '苍南县', 3, 330300, ',330000,330300,330327,');
+INSERT INTO `oa_city` VALUES (330328, '文成县', 3, 330300, ',330000,330300,330328,');
+INSERT INTO `oa_city` VALUES (330329, '泰顺县', 3, 330300, ',330000,330300,330329,');
+INSERT INTO `oa_city` VALUES (330381, '瑞安市', 3, 330300, ',330000,330300,330381,');
+INSERT INTO `oa_city` VALUES (330382, '乐清市', 3, 330300, ',330000,330300,330382,');
+INSERT INTO `oa_city` VALUES (330400, '嘉兴市', 2, 330000, ',330000,330400,');
+INSERT INTO `oa_city` VALUES (330402, '秀城区', 3, 330400, ',330000,330400,330402,');
+INSERT INTO `oa_city` VALUES (330411, '秀洲区', 3, 330400, ',330000,330400,330411,');
+INSERT INTO `oa_city` VALUES (330421, '嘉善县', 3, 330400, ',330000,330400,330421,');
+INSERT INTO `oa_city` VALUES (330424, '海盐县', 3, 330400, ',330000,330400,330424,');
+INSERT INTO `oa_city` VALUES (330481, '海宁市', 3, 330400, ',330000,330400,330481,');
+INSERT INTO `oa_city` VALUES (330482, '平湖市', 3, 330400, ',330000,330400,330482,');
+INSERT INTO `oa_city` VALUES (330483, '桐乡市', 3, 330400, ',330000,330400,330483,');
+INSERT INTO `oa_city` VALUES (330500, '湖州市', 2, 330000, ',330000,330500,');
+INSERT INTO `oa_city` VALUES (330502, '吴兴区', 3, 330500, ',330000,330500,330502,');
+INSERT INTO `oa_city` VALUES (330503, '南浔区', 3, 330500, ',330000,330500,330503,');
+INSERT INTO `oa_city` VALUES (330521, '德清县', 3, 330500, ',330000,330500,330521,');
+INSERT INTO `oa_city` VALUES (330522, '长兴县', 3, 330500, ',330000,330500,330522,');
+INSERT INTO `oa_city` VALUES (330523, '安吉县', 3, 330500, ',330000,330500,330523,');
+INSERT INTO `oa_city` VALUES (330600, '绍兴市', 2, 330000, ',330000,330600,');
+INSERT INTO `oa_city` VALUES (330602, '越城区', 3, 330600, ',330000,330600,330602,');
+INSERT INTO `oa_city` VALUES (330621, '绍兴县', 3, 330600, ',330000,330600,330621,');
+INSERT INTO `oa_city` VALUES (330624, '新昌县', 3, 330600, ',330000,330600,330624,');
+INSERT INTO `oa_city` VALUES (330681, '诸暨市', 3, 330600, ',330000,330600,330681,');
+INSERT INTO `oa_city` VALUES (330682, '上虞市', 3, 330600, ',330000,330600,330682,');
+INSERT INTO `oa_city` VALUES (330683, '嵊州市', 3, 330600, ',330000,330600,330683,');
+INSERT INTO `oa_city` VALUES (330700, '金华市', 2, 330000, ',330000,330700,');
+INSERT INTO `oa_city` VALUES (330702, '婺城区', 3, 330700, ',330000,330700,330702,');
+INSERT INTO `oa_city` VALUES (330703, '金东区', 3, 330700, ',330000,330700,330703,');
+INSERT INTO `oa_city` VALUES (330723, '武义县', 3, 330700, ',330000,330700,330723,');
+INSERT INTO `oa_city` VALUES (330726, '浦江县', 3, 330700, ',330000,330700,330726,');
+INSERT INTO `oa_city` VALUES (330727, '磐安县', 3, 330700, ',330000,330700,330727,');
+INSERT INTO `oa_city` VALUES (330781, '兰溪市', 3, 330700, ',330000,330700,330781,');
+INSERT INTO `oa_city` VALUES (330782, '义乌市', 3, 330700, ',330000,330700,330782,');
+INSERT INTO `oa_city` VALUES (330783, '东阳市', 3, 330700, ',330000,330700,330783,');
+INSERT INTO `oa_city` VALUES (330784, '永康市', 3, 330700, ',330000,330700,330784,');
+INSERT INTO `oa_city` VALUES (330800, '衢州市', 2, 330000, ',330000,330800,');
+INSERT INTO `oa_city` VALUES (330802, '柯城区', 3, 330800, ',330000,330800,330802,');
+INSERT INTO `oa_city` VALUES (330803, '衢江区', 3, 330800, ',330000,330800,330803,');
+INSERT INTO `oa_city` VALUES (330822, '常山县', 3, 330800, ',330000,330800,330822,');
+INSERT INTO `oa_city` VALUES (330824, '开化县', 3, 330800, ',330000,330800,330824,');
+INSERT INTO `oa_city` VALUES (330825, '龙游县', 3, 330800, ',330000,330800,330825,');
+INSERT INTO `oa_city` VALUES (330881, '江山市', 3, 330800, ',330000,330800,330881,');
+INSERT INTO `oa_city` VALUES (330900, '舟山市', 2, 330000, ',330000,330900,');
+INSERT INTO `oa_city` VALUES (330902, '定海区', 3, 330900, ',330000,330900,330902,');
+INSERT INTO `oa_city` VALUES (330903, '普陀区', 3, 330900, ',330000,330900,330903,');
+INSERT INTO `oa_city` VALUES (330921, '岱山县', 3, 330900, ',330000,330900,330921,');
+INSERT INTO `oa_city` VALUES (330922, '嵊泗县', 3, 330900, ',330000,330900,330922,');
+INSERT INTO `oa_city` VALUES (331000, '台州市', 2, 330000, ',330000,331000,');
+INSERT INTO `oa_city` VALUES (331002, '椒江区', 3, 331000, ',330000,331000,331002,');
+INSERT INTO `oa_city` VALUES (331003, '黄岩区', 3, 331000, ',330000,331000,331003,');
+INSERT INTO `oa_city` VALUES (331004, '路桥区', 3, 331000, ',330000,331000,331004,');
+INSERT INTO `oa_city` VALUES (331021, '玉环县', 3, 331000, ',330000,331000,331021,');
+INSERT INTO `oa_city` VALUES (331022, '三门县', 3, 331000, ',330000,331000,331022,');
+INSERT INTO `oa_city` VALUES (331023, '天台县', 3, 331000, ',330000,331000,331023,');
+INSERT INTO `oa_city` VALUES (331024, '仙居县', 3, 331000, ',330000,331000,331024,');
+INSERT INTO `oa_city` VALUES (331081, '温岭市', 3, 331000, ',330000,331000,331081,');
+INSERT INTO `oa_city` VALUES (331082, '临海市', 3, 331000, ',330000,331000,331082,');
+INSERT INTO `oa_city` VALUES (331100, '丽水市', 2, 330000, ',330000,331100,');
+INSERT INTO `oa_city` VALUES (331102, '莲都区', 3, 331100, ',330000,331100,331102,');
+INSERT INTO `oa_city` VALUES (331121, '青田县', 3, 331100, ',330000,331100,331121,');
+INSERT INTO `oa_city` VALUES (331122, '缙云县', 3, 331100, ',330000,331100,331122,');
+INSERT INTO `oa_city` VALUES (331123, '遂昌县', 3, 331100, ',330000,331100,331123,');
+INSERT INTO `oa_city` VALUES (331124, '松阳县', 3, 331100, ',330000,331100,331124,');
+INSERT INTO `oa_city` VALUES (331125, '云和县', 3, 331100, ',330000,331100,331125,');
+INSERT INTO `oa_city` VALUES (331126, '庆元县', 3, 331100, ',330000,331100,331126,');
+INSERT INTO `oa_city` VALUES (331127, '景宁畲族自治县', 3, 331100, ',330000,331100,331127,');
+INSERT INTO `oa_city` VALUES (331181, '龙泉市', 3, 331100, ',330000,331100,331181,');
+INSERT INTO `oa_city` VALUES (340000, '安徽省', 1, 0, ',340000,');
+INSERT INTO `oa_city` VALUES (340100, '合肥市', 2, 340000, ',340000,340100,');
+INSERT INTO `oa_city` VALUES (340102, '瑶海区', 3, 340100, ',340000,340100,340102,');
+INSERT INTO `oa_city` VALUES (340103, '庐阳区', 3, 340100, ',340000,340100,340103,');
+INSERT INTO `oa_city` VALUES (340104, '蜀山区', 3, 340100, ',340000,340100,340104,');
+INSERT INTO `oa_city` VALUES (340111, '包河区', 3, 340100, ',340000,340100,340111,');
+INSERT INTO `oa_city` VALUES (340121, '长丰县', 3, 340100, ',340000,340100,340121,');
+INSERT INTO `oa_city` VALUES (340122, '肥东县', 3, 340100, ',340000,340100,340122,');
+INSERT INTO `oa_city` VALUES (340123, '肥西县', 3, 340100, ',340000,340100,340123,');
+INSERT INTO `oa_city` VALUES (340200, '芜湖市', 2, 340000, ',340000,340200,');
+INSERT INTO `oa_city` VALUES (340202, '镜湖区', 3, 340200, ',340000,340200,340202,');
+INSERT INTO `oa_city` VALUES (340203, '马塘区', 3, 340200, ',340000,340200,340203,');
+INSERT INTO `oa_city` VALUES (340204, '新芜区', 3, 340200, ',340000,340200,340204,');
+INSERT INTO `oa_city` VALUES (340207, '鸠江区', 3, 340200, ',340000,340200,340207,');
+INSERT INTO `oa_city` VALUES (340221, '芜湖县', 3, 340200, ',340000,340200,340221,');
+INSERT INTO `oa_city` VALUES (340222, '繁昌县', 3, 340200, ',340000,340200,340222,');
+INSERT INTO `oa_city` VALUES (340223, '南陵县', 3, 340200, ',340000,340200,340223,');
+INSERT INTO `oa_city` VALUES (340300, '蚌埠市', 2, 340000, ',340000,340300,');
+INSERT INTO `oa_city` VALUES (340302, '龙子湖区', 3, 340300, ',340000,340300,340302,');
+INSERT INTO `oa_city` VALUES (340303, '蚌山区', 3, 340300, ',340000,340300,340303,');
+INSERT INTO `oa_city` VALUES (340304, '禹会区', 3, 340300, ',340000,340300,340304,');
+INSERT INTO `oa_city` VALUES (340311, '淮上区', 3, 340300, ',340000,340300,340311,');
+INSERT INTO `oa_city` VALUES (340321, '怀远县', 3, 340300, ',340000,340300,340321,');
+INSERT INTO `oa_city` VALUES (340322, '五河县', 3, 340300, ',340000,340300,340322,');
+INSERT INTO `oa_city` VALUES (340323, '固镇县', 3, 340300, ',340000,340300,340323,');
+INSERT INTO `oa_city` VALUES (340400, '淮南市', 2, 340000, ',340000,340400,');
+INSERT INTO `oa_city` VALUES (340402, '大通区', 3, 340400, ',340000,340400,340402,');
+INSERT INTO `oa_city` VALUES (340403, '田家庵区', 3, 340400, ',340000,340400,340403,');
+INSERT INTO `oa_city` VALUES (340404, '谢家集区', 3, 340400, ',340000,340400,340404,');
+INSERT INTO `oa_city` VALUES (340405, '八公山区', 3, 340400, ',340000,340400,340405,');
+INSERT INTO `oa_city` VALUES (340406, '潘集区', 3, 340400, ',340000,340400,340406,');
+INSERT INTO `oa_city` VALUES (340421, '凤台县', 3, 340400, ',340000,340400,340421,');
+INSERT INTO `oa_city` VALUES (340500, '马鞍山市', 2, 340000, ',340000,340500,');
+INSERT INTO `oa_city` VALUES (340502, '金家庄区', 3, 340500, ',340000,340500,340502,');
+INSERT INTO `oa_city` VALUES (340503, '花山区', 3, 340500, ',340000,340500,340503,');
+INSERT INTO `oa_city` VALUES (340504, '雨山区', 3, 340500, ',340000,340500,340504,');
+INSERT INTO `oa_city` VALUES (340521, '当涂县', 3, 340500, ',340000,340500,340521,');
+INSERT INTO `oa_city` VALUES (340600, '淮北市', 2, 340000, ',340000,340600,');
+INSERT INTO `oa_city` VALUES (340602, '杜集区', 3, 340600, ',340000,340600,340602,');
+INSERT INTO `oa_city` VALUES (340603, '相山区', 3, 340600, ',340000,340600,340603,');
+INSERT INTO `oa_city` VALUES (340604, '烈山区', 3, 340600, ',340000,340600,340604,');
+INSERT INTO `oa_city` VALUES (340621, '濉溪县', 3, 340600, ',340000,340600,340621,');
+INSERT INTO `oa_city` VALUES (340700, '铜陵市', 2, 340000, ',340000,340700,');
+INSERT INTO `oa_city` VALUES (340702, '铜官山区', 3, 340700, ',340000,340700,340702,');
+INSERT INTO `oa_city` VALUES (340703, '狮子山区', 3, 340700, ',340000,340700,340703,');
+INSERT INTO `oa_city` VALUES (340711, '郊　区', 3, 340700, ',340000,340700,340711,');
+INSERT INTO `oa_city` VALUES (340721, '铜陵县', 3, 340700, ',340000,340700,340721,');
+INSERT INTO `oa_city` VALUES (340800, '安庆市', 2, 340000, ',340000,340800,');
+INSERT INTO `oa_city` VALUES (340802, '迎江区', 3, 340800, ',340000,340800,340802,');
+INSERT INTO `oa_city` VALUES (340803, '大观区', 3, 340800, ',340000,340800,340803,');
+INSERT INTO `oa_city` VALUES (340811, '郊　区', 3, 340800, ',340000,340800,340811,');
+INSERT INTO `oa_city` VALUES (340822, '怀宁县', 3, 340800, ',340000,340800,340822,');
+INSERT INTO `oa_city` VALUES (340823, '枞阳县', 3, 340800, ',340000,340800,340823,');
+INSERT INTO `oa_city` VALUES (340824, '潜山县', 3, 340800, ',340000,340800,340824,');
+INSERT INTO `oa_city` VALUES (340825, '太湖县', 3, 340800, ',340000,340800,340825,');
+INSERT INTO `oa_city` VALUES (340826, '宿松县', 3, 340800, ',340000,340800,340826,');
+INSERT INTO `oa_city` VALUES (340827, '望江县', 3, 340800, ',340000,340800,340827,');
+INSERT INTO `oa_city` VALUES (340828, '岳西县', 3, 340800, ',340000,340800,340828,');
+INSERT INTO `oa_city` VALUES (340881, '桐城市', 3, 340800, ',340000,340800,340881,');
+INSERT INTO `oa_city` VALUES (341000, '黄山市', 2, 340000, ',340000,341000,');
+INSERT INTO `oa_city` VALUES (341002, '屯溪区', 3, 341000, ',340000,341000,341002,');
+INSERT INTO `oa_city` VALUES (341003, '黄山区', 3, 341000, ',340000,341000,341003,');
+INSERT INTO `oa_city` VALUES (341004, '徽州区', 3, 341000, ',340000,341000,341004,');
+INSERT INTO `oa_city` VALUES (341021, '歙　县', 3, 341000, ',340000,341000,341021,');
+INSERT INTO `oa_city` VALUES (341022, '休宁县', 3, 341000, ',340000,341000,341022,');
+INSERT INTO `oa_city` VALUES (341023, '黟　县', 3, 341000, ',340000,341000,341023,');
+INSERT INTO `oa_city` VALUES (341024, '祁门县', 3, 341000, ',340000,341000,341024,');
+INSERT INTO `oa_city` VALUES (341100, '滁州市', 2, 340000, ',340000,341100,');
+INSERT INTO `oa_city` VALUES (341102, '琅琊区', 3, 341100, ',340000,341100,341102,');
+INSERT INTO `oa_city` VALUES (341103, '南谯区', 3, 341100, ',340000,341100,341103,');
+INSERT INTO `oa_city` VALUES (341122, '来安县', 3, 341100, ',340000,341100,341122,');
+INSERT INTO `oa_city` VALUES (341124, '全椒县', 3, 341100, ',340000,341100,341124,');
+INSERT INTO `oa_city` VALUES (341125, '定远县', 3, 341100, ',340000,341100,341125,');
+INSERT INTO `oa_city` VALUES (341126, '凤阳县', 3, 341100, ',340000,341100,341126,');
+INSERT INTO `oa_city` VALUES (341181, '天长市', 3, 341100, ',340000,341100,341181,');
+INSERT INTO `oa_city` VALUES (341182, '明光市', 3, 341100, ',340000,341100,341182,');
+INSERT INTO `oa_city` VALUES (341200, '阜阳市', 2, 340000, ',340000,341200,');
+INSERT INTO `oa_city` VALUES (341202, '颍州区', 3, 341200, ',340000,341200,341202,');
+INSERT INTO `oa_city` VALUES (341203, '颍东区', 3, 341200, ',340000,341200,341203,');
+INSERT INTO `oa_city` VALUES (341204, '颍泉区', 3, 341200, ',340000,341200,341204,');
+INSERT INTO `oa_city` VALUES (341221, '临泉县', 3, 341200, ',340000,341200,341221,');
+INSERT INTO `oa_city` VALUES (341222, '太和县', 3, 341200, ',340000,341200,341222,');
+INSERT INTO `oa_city` VALUES (341225, '阜南县', 3, 341200, ',340000,341200,341225,');
+INSERT INTO `oa_city` VALUES (341226, '颍上县', 3, 341200, ',340000,341200,341226,');
+INSERT INTO `oa_city` VALUES (341282, '界首市', 3, 341200, ',340000,341200,341282,');
+INSERT INTO `oa_city` VALUES (341300, '宿州市', 2, 340000, ',340000,341300,');
+INSERT INTO `oa_city` VALUES (341302, '墉桥区', 3, 341300, ',340000,341300,341302,');
+INSERT INTO `oa_city` VALUES (341321, '砀山县', 3, 341300, ',340000,341300,341321,');
+INSERT INTO `oa_city` VALUES (341322, '萧　县', 3, 341300, ',340000,341300,341322,');
+INSERT INTO `oa_city` VALUES (341323, '灵璧县', 3, 341300, ',340000,341300,341323,');
+INSERT INTO `oa_city` VALUES (341324, '泗　县', 3, 341300, ',340000,341300,341324,');
+INSERT INTO `oa_city` VALUES (341400, '巢湖市', 2, 340000, ',340000,341400,');
+INSERT INTO `oa_city` VALUES (341401, '庐江县', 3, 340100, ',340000,340100,341401,');
+INSERT INTO `oa_city` VALUES (341402, '巢湖市', 3, 340100, ',340000,340100,341402,');
+INSERT INTO `oa_city` VALUES (341421, '庐江县', 3, 341400, ',340000,341400,341421,');
+INSERT INTO `oa_city` VALUES (341422, '无为县', 3, 340200, ',340000,340200,341422,');
+INSERT INTO `oa_city` VALUES (341423, '含山县', 3, 340500, ',340000,340500,341423,');
+INSERT INTO `oa_city` VALUES (341424, '和　县', 3, 340500, ',340000,340500,341424,');
+INSERT INTO `oa_city` VALUES (341500, '六安市', 2, 340000, ',340000,341500,');
+INSERT INTO `oa_city` VALUES (341502, '金安区', 3, 341500, ',340000,341500,341502,');
+INSERT INTO `oa_city` VALUES (341503, '裕安区', 3, 341500, ',340000,341500,341503,');
+INSERT INTO `oa_city` VALUES (341521, '寿　县', 3, 341500, ',340000,341500,341521,');
+INSERT INTO `oa_city` VALUES (341522, '霍邱县', 3, 341500, ',340000,341500,341522,');
+INSERT INTO `oa_city` VALUES (341523, '舒城县', 3, 341500, ',340000,341500,341523,');
+INSERT INTO `oa_city` VALUES (341524, '金寨县', 3, 341500, ',340000,341500,341524,');
+INSERT INTO `oa_city` VALUES (341525, '霍山县', 3, 341500, ',340000,341500,341525,');
+INSERT INTO `oa_city` VALUES (341600, '亳州市', 2, 340000, ',340000,341600,');
+INSERT INTO `oa_city` VALUES (341602, '谯城区', 3, 341600, ',340000,341600,341602,');
+INSERT INTO `oa_city` VALUES (341621, '涡阳县', 3, 341600, ',340000,341600,341621,');
+INSERT INTO `oa_city` VALUES (341622, '蒙城县', 3, 341600, ',340000,341600,341622,');
+INSERT INTO `oa_city` VALUES (341623, '利辛县', 3, 341600, ',340000,341600,341623,');
+INSERT INTO `oa_city` VALUES (341700, '池州市', 2, 340000, ',340000,341700,');
+INSERT INTO `oa_city` VALUES (341702, '贵池区', 3, 341700, ',340000,341700,341702,');
+INSERT INTO `oa_city` VALUES (341721, '东至县', 3, 341700, ',340000,341700,341721,');
+INSERT INTO `oa_city` VALUES (341722, '石台县', 3, 341700, ',340000,341700,341722,');
+INSERT INTO `oa_city` VALUES (341723, '青阳县', 3, 341700, ',340000,341700,341723,');
+INSERT INTO `oa_city` VALUES (341800, '宣城市', 2, 340000, ',340000,341800,');
+INSERT INTO `oa_city` VALUES (341802, '宣州区', 3, 341800, ',340000,341800,341802,');
+INSERT INTO `oa_city` VALUES (341821, '郎溪县', 3, 341800, ',340000,341800,341821,');
+INSERT INTO `oa_city` VALUES (341822, '广德县', 3, 341800, ',340000,341800,341822,');
+INSERT INTO `oa_city` VALUES (341823, '泾　县', 3, 341800, ',340000,341800,341823,');
+INSERT INTO `oa_city` VALUES (341824, '绩溪县', 3, 341800, ',340000,341800,341824,');
+INSERT INTO `oa_city` VALUES (341825, '旌德县', 3, 341800, ',340000,341800,341825,');
+INSERT INTO `oa_city` VALUES (341881, '宁国市', 3, 341800, ',340000,341800,341881,');
+INSERT INTO `oa_city` VALUES (350000, '福建省', 1, 0, ',350000,');
+INSERT INTO `oa_city` VALUES (350100, '福州市', 2, 350000, ',350000,350100,');
+INSERT INTO `oa_city` VALUES (350102, '鼓楼区', 3, 350100, ',350000,350100,350102,');
+INSERT INTO `oa_city` VALUES (350103, '台江区', 3, 350100, ',350000,350100,350103,');
+INSERT INTO `oa_city` VALUES (350104, '仓山区', 3, 350100, ',350000,350100,350104,');
+INSERT INTO `oa_city` VALUES (350105, '马尾区', 3, 350100, ',350000,350100,350105,');
+INSERT INTO `oa_city` VALUES (350111, '晋安区', 3, 350100, ',350000,350100,350111,');
+INSERT INTO `oa_city` VALUES (350121, '闽侯县', 3, 350100, ',350000,350100,350121,');
+INSERT INTO `oa_city` VALUES (350122, '连江县', 3, 350100, ',350000,350100,350122,');
+INSERT INTO `oa_city` VALUES (350123, '罗源县', 3, 350100, ',350000,350100,350123,');
+INSERT INTO `oa_city` VALUES (350124, '闽清县', 3, 350100, ',350000,350100,350124,');
+INSERT INTO `oa_city` VALUES (350125, '永泰县', 3, 350100, ',350000,350100,350125,');
+INSERT INTO `oa_city` VALUES (350128, '平潭县', 3, 350100, ',350000,350100,350128,');
+INSERT INTO `oa_city` VALUES (350181, '福清市', 3, 350100, ',350000,350100,350181,');
+INSERT INTO `oa_city` VALUES (350182, '长乐市', 3, 350100, ',350000,350100,350182,');
+INSERT INTO `oa_city` VALUES (350200, '厦门市', 2, 350000, ',350000,350200,');
+INSERT INTO `oa_city` VALUES (350203, '思明区', 3, 350200, ',350000,350200,350203,');
+INSERT INTO `oa_city` VALUES (350205, '海沧区', 3, 350200, ',350000,350200,350205,');
+INSERT INTO `oa_city` VALUES (350206, '湖里区', 3, 350200, ',350000,350200,350206,');
+INSERT INTO `oa_city` VALUES (350211, '集美区', 3, 350200, ',350000,350200,350211,');
+INSERT INTO `oa_city` VALUES (350212, '同安区', 3, 350200, ',350000,350200,350212,');
+INSERT INTO `oa_city` VALUES (350213, '翔安区', 3, 350200, ',350000,350200,350213,');
+INSERT INTO `oa_city` VALUES (350300, '莆田市', 2, 350000, ',350000,350300,');
+INSERT INTO `oa_city` VALUES (350302, '城厢区', 3, 350300, ',350000,350300,350302,');
+INSERT INTO `oa_city` VALUES (350303, '涵江区', 3, 350300, ',350000,350300,350303,');
+INSERT INTO `oa_city` VALUES (350304, '荔城区', 3, 350300, ',350000,350300,350304,');
+INSERT INTO `oa_city` VALUES (350305, '秀屿区', 3, 350300, ',350000,350300,350305,');
+INSERT INTO `oa_city` VALUES (350322, '仙游县', 3, 350300, ',350000,350300,350322,');
+INSERT INTO `oa_city` VALUES (350400, '三明市', 2, 350000, ',350000,350400,');
+INSERT INTO `oa_city` VALUES (350402, '梅列区', 3, 350400, ',350000,350400,350402,');
+INSERT INTO `oa_city` VALUES (350403, '三元区', 3, 350400, ',350000,350400,350403,');
+INSERT INTO `oa_city` VALUES (350421, '明溪县', 3, 350400, ',350000,350400,350421,');
+INSERT INTO `oa_city` VALUES (350423, '清流县', 3, 350400, ',350000,350400,350423,');
+INSERT INTO `oa_city` VALUES (350424, '宁化县', 3, 350400, ',350000,350400,350424,');
+INSERT INTO `oa_city` VALUES (350425, '大田县', 3, 350400, ',350000,350400,350425,');
+INSERT INTO `oa_city` VALUES (350426, '尤溪县', 3, 350400, ',350000,350400,350426,');
+INSERT INTO `oa_city` VALUES (350427, '沙　县', 3, 350400, ',350000,350400,350427,');
+INSERT INTO `oa_city` VALUES (350428, '将乐县', 3, 350400, ',350000,350400,350428,');
+INSERT INTO `oa_city` VALUES (350429, '泰宁县', 3, 350400, ',350000,350400,350429,');
+INSERT INTO `oa_city` VALUES (350430, '建宁县', 3, 350400, ',350000,350400,350430,');
+INSERT INTO `oa_city` VALUES (350481, '永安市', 3, 350400, ',350000,350400,350481,');
+INSERT INTO `oa_city` VALUES (350500, '泉州市', 2, 350000, ',350000,350500,');
+INSERT INTO `oa_city` VALUES (350502, '鲤城区', 3, 350500, ',350000,350500,350502,');
+INSERT INTO `oa_city` VALUES (350503, '丰泽区', 3, 350500, ',350000,350500,350503,');
+INSERT INTO `oa_city` VALUES (350504, '洛江区', 3, 350500, ',350000,350500,350504,');
+INSERT INTO `oa_city` VALUES (350505, '泉港区', 3, 350500, ',350000,350500,350505,');
+INSERT INTO `oa_city` VALUES (350521, '惠安县', 3, 350500, ',350000,350500,350521,');
+INSERT INTO `oa_city` VALUES (350524, '安溪县', 3, 350500, ',350000,350500,350524,');
+INSERT INTO `oa_city` VALUES (350525, '永春县', 3, 350500, ',350000,350500,350525,');
+INSERT INTO `oa_city` VALUES (350526, '德化县', 3, 350500, ',350000,350500,350526,');
+INSERT INTO `oa_city` VALUES (350527, '金门县', 3, 350500, ',350000,350500,350527,');
+INSERT INTO `oa_city` VALUES (350581, '石狮市', 3, 350500, ',350000,350500,350581,');
+INSERT INTO `oa_city` VALUES (350582, '晋江市', 3, 350500, ',350000,350500,350582,');
+INSERT INTO `oa_city` VALUES (350583, '南安市', 3, 350500, ',350000,350500,350583,');
+INSERT INTO `oa_city` VALUES (350600, '漳州市', 2, 350000, ',350000,350600,');
+INSERT INTO `oa_city` VALUES (350602, '芗城区', 3, 350600, ',350000,350600,350602,');
+INSERT INTO `oa_city` VALUES (350603, '龙文区', 3, 350600, ',350000,350600,350603,');
+INSERT INTO `oa_city` VALUES (350622, '云霄县', 3, 350600, ',350000,350600,350622,');
+INSERT INTO `oa_city` VALUES (350623, '漳浦县', 3, 350600, ',350000,350600,350623,');
+INSERT INTO `oa_city` VALUES (350624, '诏安县', 3, 350600, ',350000,350600,350624,');
+INSERT INTO `oa_city` VALUES (350625, '长泰县', 3, 350600, ',350000,350600,350625,');
+INSERT INTO `oa_city` VALUES (350626, '东山县', 3, 350600, ',350000,350600,350626,');
+INSERT INTO `oa_city` VALUES (350627, '南靖县', 3, 350600, ',350000,350600,350627,');
+INSERT INTO `oa_city` VALUES (350628, '平和县', 3, 350600, ',350000,350600,350628,');
+INSERT INTO `oa_city` VALUES (350629, '华安县', 3, 350600, ',350000,350600,350629,');
+INSERT INTO `oa_city` VALUES (350681, '龙海市', 3, 350600, ',350000,350600,350681,');
+INSERT INTO `oa_city` VALUES (350700, '南平市', 2, 350000, ',350000,350700,');
+INSERT INTO `oa_city` VALUES (350702, '延平区', 3, 350700, ',350000,350700,350702,');
+INSERT INTO `oa_city` VALUES (350721, '顺昌县', 3, 350700, ',350000,350700,350721,');
+INSERT INTO `oa_city` VALUES (350722, '浦城县', 3, 350700, ',350000,350700,350722,');
+INSERT INTO `oa_city` VALUES (350723, '光泽县', 3, 350700, ',350000,350700,350723,');
+INSERT INTO `oa_city` VALUES (350724, '松溪县', 3, 350700, ',350000,350700,350724,');
+INSERT INTO `oa_city` VALUES (350725, '政和县', 3, 350700, ',350000,350700,350725,');
+INSERT INTO `oa_city` VALUES (350781, '邵武市', 3, 350700, ',350000,350700,350781,');
+INSERT INTO `oa_city` VALUES (350782, '武夷山市', 3, 350700, ',350000,350700,350782,');
+INSERT INTO `oa_city` VALUES (350783, '建瓯市', 3, 350700, ',350000,350700,350783,');
+INSERT INTO `oa_city` VALUES (350784, '建阳市', 3, 350700, ',350000,350700,350784,');
+INSERT INTO `oa_city` VALUES (350800, '龙岩市', 2, 350000, ',350000,350800,');
+INSERT INTO `oa_city` VALUES (350802, '新罗区', 3, 350800, ',350000,350800,350802,');
+INSERT INTO `oa_city` VALUES (350821, '长汀县', 3, 350800, ',350000,350800,350821,');
+INSERT INTO `oa_city` VALUES (350822, '永定县', 3, 350800, ',350000,350800,350822,');
+INSERT INTO `oa_city` VALUES (350823, '上杭县', 3, 350800, ',350000,350800,350823,');
+INSERT INTO `oa_city` VALUES (350824, '武平县', 3, 350800, ',350000,350800,350824,');
+INSERT INTO `oa_city` VALUES (350825, '连城县', 3, 350800, ',350000,350800,350825,');
+INSERT INTO `oa_city` VALUES (350881, '漳平市', 3, 350800, ',350000,350800,350881,');
+INSERT INTO `oa_city` VALUES (350900, '宁德市', 2, 350000, ',350000,350900,');
+INSERT INTO `oa_city` VALUES (350902, '蕉城区', 3, 350900, ',350000,350900,350902,');
+INSERT INTO `oa_city` VALUES (350921, '霞浦县', 3, 350900, ',350000,350900,350921,');
+INSERT INTO `oa_city` VALUES (350922, '古田县', 3, 350900, ',350000,350900,350922,');
+INSERT INTO `oa_city` VALUES (350923, '屏南县', 3, 350900, ',350000,350900,350923,');
+INSERT INTO `oa_city` VALUES (350924, '寿宁县', 3, 350900, ',350000,350900,350924,');
+INSERT INTO `oa_city` VALUES (350925, '周宁县', 3, 350900, ',350000,350900,350925,');
+INSERT INTO `oa_city` VALUES (350926, '柘荣县', 3, 350900, ',350000,350900,350926,');
+INSERT INTO `oa_city` VALUES (350981, '福安市', 3, 350900, ',350000,350900,350981,');
+INSERT INTO `oa_city` VALUES (350982, '福鼎市', 3, 350900, ',350000,350900,350982,');
+INSERT INTO `oa_city` VALUES (360000, '江西省', 1, 0, ',360000,');
+INSERT INTO `oa_city` VALUES (360100, '南昌市', 2, 360000, ',360000,360100,');
+INSERT INTO `oa_city` VALUES (360102, '东湖区', 3, 360100, ',360000,360100,360102,');
+INSERT INTO `oa_city` VALUES (360103, '西湖区', 3, 360100, ',360000,360100,360103,');
+INSERT INTO `oa_city` VALUES (360104, '青云谱区', 3, 360100, ',360000,360100,360104,');
+INSERT INTO `oa_city` VALUES (360105, '湾里区', 3, 360100, ',360000,360100,360105,');
+INSERT INTO `oa_city` VALUES (360111, '青山湖区', 3, 360100, ',360000,360100,360111,');
+INSERT INTO `oa_city` VALUES (360121, '南昌县', 3, 360100, ',360000,360100,360121,');
+INSERT INTO `oa_city` VALUES (360122, '新建县', 3, 360100, ',360000,360100,360122,');
+INSERT INTO `oa_city` VALUES (360123, '安义县', 3, 360100, ',360000,360100,360123,');
+INSERT INTO `oa_city` VALUES (360124, '进贤县', 3, 360100, ',360000,360100,360124,');
+INSERT INTO `oa_city` VALUES (360200, '景德镇市', 2, 360000, ',360000,360200,');
+INSERT INTO `oa_city` VALUES (360202, '昌江区', 3, 360200, ',360000,360200,360202,');
+INSERT INTO `oa_city` VALUES (360203, '珠山区', 3, 360200, ',360000,360200,360203,');
+INSERT INTO `oa_city` VALUES (360222, '浮梁县', 3, 360200, ',360000,360200,360222,');
+INSERT INTO `oa_city` VALUES (360281, '乐平市', 3, 360200, ',360000,360200,360281,');
+INSERT INTO `oa_city` VALUES (360300, '萍乡市', 2, 360000, ',360000,360300,');
+INSERT INTO `oa_city` VALUES (360302, '安源区', 3, 360300, ',360000,360300,360302,');
+INSERT INTO `oa_city` VALUES (360313, '湘东区', 3, 360300, ',360000,360300,360313,');
+INSERT INTO `oa_city` VALUES (360321, '莲花县', 3, 360300, ',360000,360300,360321,');
+INSERT INTO `oa_city` VALUES (360322, '上栗县', 3, 360300, ',360000,360300,360322,');
+INSERT INTO `oa_city` VALUES (360323, '芦溪县', 3, 360300, ',360000,360300,360323,');
+INSERT INTO `oa_city` VALUES (360400, '九江市', 2, 360000, ',360000,360400,');
+INSERT INTO `oa_city` VALUES (360402, '庐山区', 3, 360400, ',360000,360400,360402,');
+INSERT INTO `oa_city` VALUES (360403, '浔阳区', 3, 360400, ',360000,360400,360403,');
+INSERT INTO `oa_city` VALUES (360421, '九江县', 3, 360400, ',360000,360400,360421,');
+INSERT INTO `oa_city` VALUES (360423, '武宁县', 3, 360400, ',360000,360400,360423,');
+INSERT INTO `oa_city` VALUES (360424, '修水县', 3, 360400, ',360000,360400,360424,');
+INSERT INTO `oa_city` VALUES (360425, '永修县', 3, 360400, ',360000,360400,360425,');
+INSERT INTO `oa_city` VALUES (360426, '德安县', 3, 360400, ',360000,360400,360426,');
+INSERT INTO `oa_city` VALUES (360427, '星子县', 3, 360400, ',360000,360400,360427,');
+INSERT INTO `oa_city` VALUES (360428, '都昌县', 3, 360400, ',360000,360400,360428,');
+INSERT INTO `oa_city` VALUES (360429, '湖口县', 3, 360400, ',360000,360400,360429,');
+INSERT INTO `oa_city` VALUES (360430, '彭泽县', 3, 360400, ',360000,360400,360430,');
+INSERT INTO `oa_city` VALUES (360481, '瑞昌市', 3, 360400, ',360000,360400,360481,');
+INSERT INTO `oa_city` VALUES (360500, '新余市', 2, 360000, ',360000,360500,');
+INSERT INTO `oa_city` VALUES (360502, '渝水区', 3, 360500, ',360000,360500,360502,');
+INSERT INTO `oa_city` VALUES (360521, '分宜县', 3, 360500, ',360000,360500,360521,');
+INSERT INTO `oa_city` VALUES (360600, '鹰潭市', 2, 360000, ',360000,360600,');
+INSERT INTO `oa_city` VALUES (360602, '月湖区', 3, 360600, ',360000,360600,360602,');
+INSERT INTO `oa_city` VALUES (360622, '余江县', 3, 360600, ',360000,360600,360622,');
+INSERT INTO `oa_city` VALUES (360681, '贵溪市', 3, 360600, ',360000,360600,360681,');
+INSERT INTO `oa_city` VALUES (360700, '赣州市', 2, 360000, ',360000,360700,');
+INSERT INTO `oa_city` VALUES (360702, '章贡区', 3, 360700, ',360000,360700,360702,');
+INSERT INTO `oa_city` VALUES (360721, '赣　县', 3, 360700, ',360000,360700,360721,');
+INSERT INTO `oa_city` VALUES (360722, '信丰县', 3, 360700, ',360000,360700,360722,');
+INSERT INTO `oa_city` VALUES (360723, '大余县', 3, 360700, ',360000,360700,360723,');
+INSERT INTO `oa_city` VALUES (360724, '上犹县', 3, 360700, ',360000,360700,360724,');
+INSERT INTO `oa_city` VALUES (360725, '崇义县', 3, 360700, ',360000,360700,360725,');
+INSERT INTO `oa_city` VALUES (360726, '安远县', 3, 360700, ',360000,360700,360726,');
+INSERT INTO `oa_city` VALUES (360727, '龙南县', 3, 360700, ',360000,360700,360727,');
+INSERT INTO `oa_city` VALUES (360728, '定南县', 3, 360700, ',360000,360700,360728,');
+INSERT INTO `oa_city` VALUES (360729, '全南县', 3, 360700, ',360000,360700,360729,');
+INSERT INTO `oa_city` VALUES (360730, '宁都县', 3, 360700, ',360000,360700,360730,');
+INSERT INTO `oa_city` VALUES (360731, '于都县', 3, 360700, ',360000,360700,360731,');
+INSERT INTO `oa_city` VALUES (360732, '兴国县', 3, 360700, ',360000,360700,360732,');
+INSERT INTO `oa_city` VALUES (360733, '会昌县', 3, 360700, ',360000,360700,360733,');
+INSERT INTO `oa_city` VALUES (360734, '寻乌县', 3, 360700, ',360000,360700,360734,');
+INSERT INTO `oa_city` VALUES (360735, '石城县', 3, 360700, ',360000,360700,360735,');
+INSERT INTO `oa_city` VALUES (360781, '瑞金市', 3, 360700, ',360000,360700,360781,');
+INSERT INTO `oa_city` VALUES (360782, '南康市', 3, 360700, ',360000,360700,360782,');
+INSERT INTO `oa_city` VALUES (360800, '吉安市', 2, 360000, ',360000,360800,');
+INSERT INTO `oa_city` VALUES (360802, '吉州区', 3, 360800, ',360000,360800,360802,');
+INSERT INTO `oa_city` VALUES (360803, '青原区', 3, 360800, ',360000,360800,360803,');
+INSERT INTO `oa_city` VALUES (360821, '吉安县', 3, 360800, ',360000,360800,360821,');
+INSERT INTO `oa_city` VALUES (360822, '吉水县', 3, 360800, ',360000,360800,360822,');
+INSERT INTO `oa_city` VALUES (360823, '峡江县', 3, 360800, ',360000,360800,360823,');
+INSERT INTO `oa_city` VALUES (360824, '新干县', 3, 360800, ',360000,360800,360824,');
+INSERT INTO `oa_city` VALUES (360825, '永丰县', 3, 360800, ',360000,360800,360825,');
+INSERT INTO `oa_city` VALUES (360826, '泰和县', 3, 360800, ',360000,360800,360826,');
+INSERT INTO `oa_city` VALUES (360827, '遂川县', 3, 360800, ',360000,360800,360827,');
+INSERT INTO `oa_city` VALUES (360828, '万安县', 3, 360800, ',360000,360800,360828,');
+INSERT INTO `oa_city` VALUES (360829, '安福县', 3, 360800, ',360000,360800,360829,');
+INSERT INTO `oa_city` VALUES (360830, '永新县', 3, 360800, ',360000,360800,360830,');
+INSERT INTO `oa_city` VALUES (360881, '井冈山市', 3, 360800, ',360000,360800,360881,');
+INSERT INTO `oa_city` VALUES (360900, '宜春市', 2, 360000, ',360000,360900,');
+INSERT INTO `oa_city` VALUES (360902, '袁州区', 3, 360900, ',360000,360900,360902,');
+INSERT INTO `oa_city` VALUES (360921, '奉新县', 3, 360900, ',360000,360900,360921,');
+INSERT INTO `oa_city` VALUES (360922, '万载县', 3, 360900, ',360000,360900,360922,');
+INSERT INTO `oa_city` VALUES (360923, '上高县', 3, 360900, ',360000,360900,360923,');
+INSERT INTO `oa_city` VALUES (360924, '宜丰县', 3, 360900, ',360000,360900,360924,');
+INSERT INTO `oa_city` VALUES (360925, '靖安县', 3, 360900, ',360000,360900,360925,');
+INSERT INTO `oa_city` VALUES (360926, '铜鼓县', 3, 360900, ',360000,360900,360926,');
+INSERT INTO `oa_city` VALUES (360981, '丰城市', 3, 360900, ',360000,360900,360981,');
+INSERT INTO `oa_city` VALUES (360982, '樟树市', 3, 360900, ',360000,360900,360982,');
+INSERT INTO `oa_city` VALUES (360983, '高安市', 3, 360900, ',360000,360900,360983,');
+INSERT INTO `oa_city` VALUES (361000, '抚州市', 2, 360000, ',360000,361000,');
+INSERT INTO `oa_city` VALUES (361002, '临川区', 3, 361000, ',360000,361000,361002,');
+INSERT INTO `oa_city` VALUES (361021, '南城县', 3, 361000, ',360000,361000,361021,');
+INSERT INTO `oa_city` VALUES (361022, '黎川县', 3, 361000, ',360000,361000,361022,');
+INSERT INTO `oa_city` VALUES (361023, '南丰县', 3, 361000, ',360000,361000,361023,');
+INSERT INTO `oa_city` VALUES (361024, '崇仁县', 3, 361000, ',360000,361000,361024,');
+INSERT INTO `oa_city` VALUES (361025, '乐安县', 3, 361000, ',360000,361000,361025,');
+INSERT INTO `oa_city` VALUES (361026, '宜黄县', 3, 361000, ',360000,361000,361026,');
+INSERT INTO `oa_city` VALUES (361027, '金溪县', 3, 361000, ',360000,361000,361027,');
+INSERT INTO `oa_city` VALUES (361028, '资溪县', 3, 361000, ',360000,361000,361028,');
+INSERT INTO `oa_city` VALUES (361029, '东乡县', 3, 361000, ',360000,361000,361029,');
+INSERT INTO `oa_city` VALUES (361030, '广昌县', 3, 361000, ',360000,361000,361030,');
+INSERT INTO `oa_city` VALUES (361100, '上饶市', 2, 360000, ',360000,361100,');
+INSERT INTO `oa_city` VALUES (361102, '信州区', 3, 361100, ',360000,361100,361102,');
+INSERT INTO `oa_city` VALUES (361121, '上饶县', 3, 361100, ',360000,361100,361121,');
+INSERT INTO `oa_city` VALUES (361122, '广丰县', 3, 361100, ',360000,361100,361122,');
+INSERT INTO `oa_city` VALUES (361123, '玉山县', 3, 361100, ',360000,361100,361123,');
+INSERT INTO `oa_city` VALUES (361124, '铅山县', 3, 361100, ',360000,361100,361124,');
+INSERT INTO `oa_city` VALUES (361125, '横峰县', 3, 361100, ',360000,361100,361125,');
+INSERT INTO `oa_city` VALUES (361126, '弋阳县', 3, 361100, ',360000,361100,361126,');
+INSERT INTO `oa_city` VALUES (361127, '余干县', 3, 361100, ',360000,361100,361127,');
+INSERT INTO `oa_city` VALUES (361128, '鄱阳县', 3, 361100, ',360000,361100,361128,');
+INSERT INTO `oa_city` VALUES (361129, '万年县', 3, 361100, ',360000,361100,361129,');
+INSERT INTO `oa_city` VALUES (361130, '婺源县', 3, 361100, ',360000,361100,361130,');
+INSERT INTO `oa_city` VALUES (361181, '德兴市', 3, 361100, ',360000,361100,361181,');
+INSERT INTO `oa_city` VALUES (370000, '山东省', 1, 0, ',370000,');
+INSERT INTO `oa_city` VALUES (370100, '济南市', 2, 370000, ',370000,370100,');
+INSERT INTO `oa_city` VALUES (370102, '历下区', 3, 370100, ',370000,370100,370102,');
+INSERT INTO `oa_city` VALUES (370103, '市中区', 3, 370100, ',370000,370100,370103,');
+INSERT INTO `oa_city` VALUES (370104, '槐荫区', 3, 370100, ',370000,370100,370104,');
+INSERT INTO `oa_city` VALUES (370105, '天桥区', 3, 370100, ',370000,370100,370105,');
+INSERT INTO `oa_city` VALUES (370112, '历城区', 3, 370100, ',370000,370100,370112,');
+INSERT INTO `oa_city` VALUES (370113, '长清区', 3, 370100, ',370000,370100,370113,');
+INSERT INTO `oa_city` VALUES (370124, '平阴县', 3, 370100, ',370000,370100,370124,');
+INSERT INTO `oa_city` VALUES (370125, '济阳县', 3, 370100, ',370000,370100,370125,');
+INSERT INTO `oa_city` VALUES (370126, '商河县', 3, 370100, ',370000,370100,370126,');
+INSERT INTO `oa_city` VALUES (370181, '章丘市', 3, 370100, ',370000,370100,370181,');
+INSERT INTO `oa_city` VALUES (370200, '青岛市', 2, 370000, ',370000,370200,');
+INSERT INTO `oa_city` VALUES (370202, '市南区', 3, 370200, ',370000,370200,370202,');
+INSERT INTO `oa_city` VALUES (370203, '市北区', 3, 370200, ',370000,370200,370203,');
+INSERT INTO `oa_city` VALUES (370205, '四方区', 3, 370200, ',370000,370200,370205,');
+INSERT INTO `oa_city` VALUES (370211, '黄岛区', 3, 370200, ',370000,370200,370211,');
+INSERT INTO `oa_city` VALUES (370212, '崂山区', 3, 370200, ',370000,370200,370212,');
+INSERT INTO `oa_city` VALUES (370213, '李沧区', 3, 370200, ',370000,370200,370213,');
+INSERT INTO `oa_city` VALUES (370214, '城阳区', 3, 370200, ',370000,370200,370214,');
+INSERT INTO `oa_city` VALUES (370281, '胶州市', 3, 370200, ',370000,370200,370281,');
+INSERT INTO `oa_city` VALUES (370282, '即墨市', 3, 370200, ',370000,370200,370282,');
+INSERT INTO `oa_city` VALUES (370283, '平度市', 3, 370200, ',370000,370200,370283,');
+INSERT INTO `oa_city` VALUES (370284, '胶南市', 3, 370200, ',370000,370200,370284,');
+INSERT INTO `oa_city` VALUES (370285, '莱西市', 3, 370200, ',370000,370200,370285,');
+INSERT INTO `oa_city` VALUES (370300, '淄博市', 2, 370000, ',370000,370300,');
+INSERT INTO `oa_city` VALUES (370302, '淄川区', 3, 370300, ',370000,370300,370302,');
+INSERT INTO `oa_city` VALUES (370303, '张店区', 3, 370300, ',370000,370300,370303,');
+INSERT INTO `oa_city` VALUES (370304, '博山区', 3, 370300, ',370000,370300,370304,');
+INSERT INTO `oa_city` VALUES (370305, '临淄区', 3, 370300, ',370000,370300,370305,');
+INSERT INTO `oa_city` VALUES (370306, '周村区', 3, 370300, ',370000,370300,370306,');
+INSERT INTO `oa_city` VALUES (370321, '桓台县', 3, 370300, ',370000,370300,370321,');
+INSERT INTO `oa_city` VALUES (370322, '高青县', 3, 370300, ',370000,370300,370322,');
+INSERT INTO `oa_city` VALUES (370323, '沂源县', 3, 370300, ',370000,370300,370323,');
+INSERT INTO `oa_city` VALUES (370400, '枣庄市', 2, 370000, ',370000,370400,');
+INSERT INTO `oa_city` VALUES (370402, '市中区', 3, 370400, ',370000,370400,370402,');
+INSERT INTO `oa_city` VALUES (370403, '薛城区', 3, 370400, ',370000,370400,370403,');
+INSERT INTO `oa_city` VALUES (370404, '峄城区', 3, 370400, ',370000,370400,370404,');
+INSERT INTO `oa_city` VALUES (370405, '台儿庄区', 3, 370400, ',370000,370400,370405,');
+INSERT INTO `oa_city` VALUES (370406, '山亭区', 3, 370400, ',370000,370400,370406,');
+INSERT INTO `oa_city` VALUES (370481, '滕州市', 3, 370400, ',370000,370400,370481,');
+INSERT INTO `oa_city` VALUES (370500, '东营市', 2, 370000, ',370000,370500,');
+INSERT INTO `oa_city` VALUES (370502, '东营区', 3, 370500, ',370000,370500,370502,');
+INSERT INTO `oa_city` VALUES (370503, '河口区', 3, 370500, ',370000,370500,370503,');
+INSERT INTO `oa_city` VALUES (370521, '垦利县', 3, 370500, ',370000,370500,370521,');
+INSERT INTO `oa_city` VALUES (370522, '利津县', 3, 370500, ',370000,370500,370522,');
+INSERT INTO `oa_city` VALUES (370523, '广饶县', 3, 370500, ',370000,370500,370523,');
+INSERT INTO `oa_city` VALUES (370600, '烟台市', 2, 370000, ',370000,370600,');
+INSERT INTO `oa_city` VALUES (370602, '芝罘区', 3, 370600, ',370000,370600,370602,');
+INSERT INTO `oa_city` VALUES (370611, '福山区', 3, 370600, ',370000,370600,370611,');
+INSERT INTO `oa_city` VALUES (370612, '牟平区', 3, 370600, ',370000,370600,370612,');
+INSERT INTO `oa_city` VALUES (370613, '莱山区', 3, 370600, ',370000,370600,370613,');
+INSERT INTO `oa_city` VALUES (370634, '长岛县', 3, 370600, ',370000,370600,370634,');
+INSERT INTO `oa_city` VALUES (370681, '龙口市', 3, 370600, ',370000,370600,370681,');
+INSERT INTO `oa_city` VALUES (370682, '莱阳市', 3, 370600, ',370000,370600,370682,');
+INSERT INTO `oa_city` VALUES (370683, '莱州市', 3, 370600, ',370000,370600,370683,');
+INSERT INTO `oa_city` VALUES (370684, '蓬莱市', 3, 370600, ',370000,370600,370684,');
+INSERT INTO `oa_city` VALUES (370685, '招远市', 3, 370600, ',370000,370600,370685,');
+INSERT INTO `oa_city` VALUES (370686, '栖霞市', 3, 370600, ',370000,370600,370686,');
+INSERT INTO `oa_city` VALUES (370687, '海阳市', 3, 370600, ',370000,370600,370687,');
+INSERT INTO `oa_city` VALUES (370700, '潍坊市', 2, 370000, ',370000,370700,');
+INSERT INTO `oa_city` VALUES (370702, '潍城区', 3, 370700, ',370000,370700,370702,');
+INSERT INTO `oa_city` VALUES (370703, '寒亭区', 3, 370700, ',370000,370700,370703,');
+INSERT INTO `oa_city` VALUES (370704, '坊子区', 3, 370700, ',370000,370700,370704,');
+INSERT INTO `oa_city` VALUES (370705, '奎文区', 3, 370700, ',370000,370700,370705,');
+INSERT INTO `oa_city` VALUES (370724, '临朐县', 3, 370700, ',370000,370700,370724,');
+INSERT INTO `oa_city` VALUES (370725, '昌乐县', 3, 370700, ',370000,370700,370725,');
+INSERT INTO `oa_city` VALUES (370781, '青州市', 3, 370700, ',370000,370700,370781,');
+INSERT INTO `oa_city` VALUES (370782, '诸城市', 3, 370700, ',370000,370700,370782,');
+INSERT INTO `oa_city` VALUES (370783, '寿光市', 3, 370700, ',370000,370700,370783,');
+INSERT INTO `oa_city` VALUES (370784, '安丘市', 3, 370700, ',370000,370700,370784,');
+INSERT INTO `oa_city` VALUES (370785, '高密市', 3, 370700, ',370000,370700,370785,');
+INSERT INTO `oa_city` VALUES (370786, '昌邑市', 3, 370700, ',370000,370700,370786,');
+INSERT INTO `oa_city` VALUES (370800, '济宁市', 2, 370000, ',370000,370800,');
+INSERT INTO `oa_city` VALUES (370802, '市中区', 3, 370800, ',370000,370800,370802,');
+INSERT INTO `oa_city` VALUES (370811, '任城区', 3, 370800, ',370000,370800,370811,');
+INSERT INTO `oa_city` VALUES (370826, '微山县', 3, 370800, ',370000,370800,370826,');
+INSERT INTO `oa_city` VALUES (370827, '鱼台县', 3, 370800, ',370000,370800,370827,');
+INSERT INTO `oa_city` VALUES (370828, '金乡县', 3, 370800, ',370000,370800,370828,');
+INSERT INTO `oa_city` VALUES (370829, '嘉祥县', 3, 370800, ',370000,370800,370829,');
+INSERT INTO `oa_city` VALUES (370830, '汶上县', 3, 370800, ',370000,370800,370830,');
+INSERT INTO `oa_city` VALUES (370831, '泗水县', 3, 370800, ',370000,370800,370831,');
+INSERT INTO `oa_city` VALUES (370832, '梁山县', 3, 370800, ',370000,370800,370832,');
+INSERT INTO `oa_city` VALUES (370881, '曲阜市', 3, 370800, ',370000,370800,370881,');
+INSERT INTO `oa_city` VALUES (370882, '兖州市', 3, 370800, ',370000,370800,370882,');
+INSERT INTO `oa_city` VALUES (370883, '邹城市', 3, 370800, ',370000,370800,370883,');
+INSERT INTO `oa_city` VALUES (370900, '泰安市', 2, 370000, ',370000,370900,');
+INSERT INTO `oa_city` VALUES (370902, '泰山区', 3, 370900, ',370000,370900,370902,');
+INSERT INTO `oa_city` VALUES (370903, '岱岳区', 3, 370900, ',370000,370900,370903,');
+INSERT INTO `oa_city` VALUES (370921, '宁阳县', 3, 370900, ',370000,370900,370921,');
+INSERT INTO `oa_city` VALUES (370923, '东平县', 3, 370900, ',370000,370900,370923,');
+INSERT INTO `oa_city` VALUES (370982, '新泰市', 3, 370900, ',370000,370900,370982,');
+INSERT INTO `oa_city` VALUES (370983, '肥城市', 3, 370900, ',370000,370900,370983,');
+INSERT INTO `oa_city` VALUES (371000, '威海市', 2, 370000, ',370000,371000,');
+INSERT INTO `oa_city` VALUES (371002, '环翠区', 3, 371000, ',370000,371000,371002,');
+INSERT INTO `oa_city` VALUES (371081, '文登市', 3, 371000, ',370000,371000,371081,');
+INSERT INTO `oa_city` VALUES (371082, '荣成市', 3, 371000, ',370000,371000,371082,');
+INSERT INTO `oa_city` VALUES (371083, '乳山市', 3, 371000, ',370000,371000,371083,');
+INSERT INTO `oa_city` VALUES (371100, '日照市', 2, 370000, ',370000,371100,');
+INSERT INTO `oa_city` VALUES (371102, '东港区', 3, 371100, ',370000,371100,371102,');
+INSERT INTO `oa_city` VALUES (371103, '岚山区', 3, 371100, ',370000,371100,371103,');
+INSERT INTO `oa_city` VALUES (371121, '五莲县', 3, 371100, ',370000,371100,371121,');
+INSERT INTO `oa_city` VALUES (371122, '莒　县', 3, 371100, ',370000,371100,371122,');
+INSERT INTO `oa_city` VALUES (371200, '莱芜市', 2, 370000, ',370000,371200,');
+INSERT INTO `oa_city` VALUES (371202, '莱城区', 3, 371200, ',370000,371200,371202,');
+INSERT INTO `oa_city` VALUES (371203, '钢城区', 3, 371200, ',370000,371200,371203,');
+INSERT INTO `oa_city` VALUES (371300, '临沂市', 2, 370000, ',370000,371300,');
+INSERT INTO `oa_city` VALUES (371302, '兰山区', 3, 371300, ',370000,371300,371302,');
+INSERT INTO `oa_city` VALUES (371311, '罗庄区', 3, 371300, ',370000,371300,371311,');
+INSERT INTO `oa_city` VALUES (371312, '河东区', 3, 371300, ',370000,371300,371312,');
+INSERT INTO `oa_city` VALUES (371321, '沂南县', 3, 371300, ',370000,371300,371321,');
+INSERT INTO `oa_city` VALUES (371322, '郯城县', 3, 371300, ',370000,371300,371322,');
+INSERT INTO `oa_city` VALUES (371323, '沂水县', 3, 371300, ',370000,371300,371323,');
+INSERT INTO `oa_city` VALUES (371324, '苍山县', 3, 371300, ',370000,371300,371324,');
+INSERT INTO `oa_city` VALUES (371325, '费　县', 3, 371300, ',370000,371300,371325,');
+INSERT INTO `oa_city` VALUES (371326, '平邑县', 3, 371300, ',370000,371300,371326,');
+INSERT INTO `oa_city` VALUES (371327, '莒南县', 3, 371300, ',370000,371300,371327,');
+INSERT INTO `oa_city` VALUES (371328, '蒙阴县', 3, 371300, ',370000,371300,371328,');
+INSERT INTO `oa_city` VALUES (371329, '临沭县', 3, 371300, ',370000,371300,371329,');
+INSERT INTO `oa_city` VALUES (371400, '德州市', 2, 370000, ',370000,371400,');
+INSERT INTO `oa_city` VALUES (371402, '德城区', 3, 371400, ',370000,371400,371402,');
+INSERT INTO `oa_city` VALUES (371421, '陵　县', 3, 371400, ',370000,371400,371421,');
+INSERT INTO `oa_city` VALUES (371422, '宁津县', 3, 371400, ',370000,371400,371422,');
+INSERT INTO `oa_city` VALUES (371423, '庆云县', 3, 371400, ',370000,371400,371423,');
+INSERT INTO `oa_city` VALUES (371424, '临邑县', 3, 371400, ',370000,371400,371424,');
+INSERT INTO `oa_city` VALUES (371425, '齐河县', 3, 371400, ',370000,371400,371425,');
+INSERT INTO `oa_city` VALUES (371426, '平原县', 3, 371400, ',370000,371400,371426,');
+INSERT INTO `oa_city` VALUES (371427, '夏津县', 3, 371400, ',370000,371400,371427,');
+INSERT INTO `oa_city` VALUES (371428, '武城县', 3, 371400, ',370000,371400,371428,');
+INSERT INTO `oa_city` VALUES (371481, '乐陵市', 3, 371400, ',370000,371400,371481,');
+INSERT INTO `oa_city` VALUES (371482, '禹城市', 3, 371400, ',370000,371400,371482,');
+INSERT INTO `oa_city` VALUES (371500, '聊城市', 2, 370000, ',370000,371500,');
+INSERT INTO `oa_city` VALUES (371502, '东昌府区', 3, 371500, ',370000,371500,371502,');
+INSERT INTO `oa_city` VALUES (371521, '阳谷县', 3, 371500, ',370000,371500,371521,');
+INSERT INTO `oa_city` VALUES (371522, '莘　县', 3, 371500, ',370000,371500,371522,');
+INSERT INTO `oa_city` VALUES (371523, '茌平县', 3, 371500, ',370000,371500,371523,');
+INSERT INTO `oa_city` VALUES (371524, '东阿县', 3, 371500, ',370000,371500,371524,');
+INSERT INTO `oa_city` VALUES (371525, '冠　县', 3, 371500, ',370000,371500,371525,');
+INSERT INTO `oa_city` VALUES (371526, '高唐县', 3, 371500, ',370000,371500,371526,');
+INSERT INTO `oa_city` VALUES (371581, '临清市', 3, 371500, ',370000,371500,371581,');
+INSERT INTO `oa_city` VALUES (371600, '滨州市', 2, 370000, ',370000,371600,');
+INSERT INTO `oa_city` VALUES (371602, '滨城区', 3, 371600, ',370000,371600,371602,');
+INSERT INTO `oa_city` VALUES (371621, '惠民县', 3, 371600, ',370000,371600,371621,');
+INSERT INTO `oa_city` VALUES (371622, '阳信县', 3, 371600, ',370000,371600,371622,');
+INSERT INTO `oa_city` VALUES (371623, '无棣县', 3, 371600, ',370000,371600,371623,');
+INSERT INTO `oa_city` VALUES (371624, '沾化县', 3, 371600, ',370000,371600,371624,');
+INSERT INTO `oa_city` VALUES (371625, '博兴县', 3, 371600, ',370000,371600,371625,');
+INSERT INTO `oa_city` VALUES (371626, '邹平县', 3, 371600, ',370000,371600,371626,');
+INSERT INTO `oa_city` VALUES (371700, '菏泽市', 2, 370000, ',370000,371700,');
+INSERT INTO `oa_city` VALUES (371702, '牡丹区', 3, 371700, ',370000,371700,371702,');
+INSERT INTO `oa_city` VALUES (371721, '曹　县', 3, 371700, ',370000,371700,371721,');
+INSERT INTO `oa_city` VALUES (371722, '单　县', 3, 371700, ',370000,371700,371722,');
+INSERT INTO `oa_city` VALUES (371723, '成武县', 3, 371700, ',370000,371700,371723,');
+INSERT INTO `oa_city` VALUES (371724, '巨野县', 3, 371700, ',370000,371700,371724,');
+INSERT INTO `oa_city` VALUES (371725, '郓城县', 3, 371700, ',370000,371700,371725,');
+INSERT INTO `oa_city` VALUES (371726, '鄄城县', 3, 371700, ',370000,371700,371726,');
+INSERT INTO `oa_city` VALUES (371727, '定陶县', 3, 371700, ',370000,371700,371727,');
+INSERT INTO `oa_city` VALUES (371728, '东明县', 3, 371700, ',370000,371700,371728,');
+INSERT INTO `oa_city` VALUES (410000, '河南省', 1, 0, ',410000,');
+INSERT INTO `oa_city` VALUES (410100, '郑州市', 2, 410000, ',410000,410100,');
+INSERT INTO `oa_city` VALUES (410102, '中原区', 3, 410100, ',410000,410100,410102,');
+INSERT INTO `oa_city` VALUES (410103, '二七区', 3, 410100, ',410000,410100,410103,');
+INSERT INTO `oa_city` VALUES (410104, '管城回族区', 3, 410100, ',410000,410100,410104,');
+INSERT INTO `oa_city` VALUES (410105, '金水区', 3, 410100, ',410000,410100,410105,');
+INSERT INTO `oa_city` VALUES (410106, '上街区', 3, 410100, ',410000,410100,410106,');
+INSERT INTO `oa_city` VALUES (410108, '邙山区', 3, 410100, ',410000,410100,410108,');
+INSERT INTO `oa_city` VALUES (410122, '中牟县', 3, 410100, ',410000,410100,410122,');
+INSERT INTO `oa_city` VALUES (410181, '巩义市', 3, 410100, ',410000,410100,410181,');
+INSERT INTO `oa_city` VALUES (410182, '荥阳市', 3, 410100, ',410000,410100,410182,');
+INSERT INTO `oa_city` VALUES (410183, '新密市', 3, 410100, ',410000,410100,410183,');
+INSERT INTO `oa_city` VALUES (410184, '新郑市', 3, 410100, ',410000,410100,410184,');
+INSERT INTO `oa_city` VALUES (410185, '登封市', 3, 410100, ',410000,410100,410185,');
+INSERT INTO `oa_city` VALUES (410200, '开封市', 2, 410000, ',410000,410200,');
+INSERT INTO `oa_city` VALUES (410202, '龙亭区', 3, 410200, ',410000,410200,410202,');
+INSERT INTO `oa_city` VALUES (410203, '顺河回族区', 3, 410200, ',410000,410200,410203,');
+INSERT INTO `oa_city` VALUES (410204, '鼓楼区', 3, 410200, ',410000,410200,410204,');
+INSERT INTO `oa_city` VALUES (410205, '南关区', 3, 410200, ',410000,410200,410205,');
+INSERT INTO `oa_city` VALUES (410211, '郊　区', 3, 410200, ',410000,410200,410211,');
+INSERT INTO `oa_city` VALUES (410221, '杞　县', 3, 410200, ',410000,410200,410221,');
+INSERT INTO `oa_city` VALUES (410222, '通许县', 3, 410200, ',410000,410200,410222,');
+INSERT INTO `oa_city` VALUES (410223, '尉氏县', 3, 410200, ',410000,410200,410223,');
+INSERT INTO `oa_city` VALUES (410224, '开封县', 3, 410200, ',410000,410200,410224,');
+INSERT INTO `oa_city` VALUES (410225, '兰考县', 3, 410200, ',410000,410200,410225,');
+INSERT INTO `oa_city` VALUES (410300, '洛阳市', 2, 410000, ',410000,410300,');
+INSERT INTO `oa_city` VALUES (410302, '老城区', 3, 410300, ',410000,410300,410302,');
+INSERT INTO `oa_city` VALUES (410303, '西工区', 3, 410300, ',410000,410300,410303,');
+INSERT INTO `oa_city` VALUES (410304, '廛河回族区', 3, 410300, ',410000,410300,410304,');
+INSERT INTO `oa_city` VALUES (410305, '涧西区', 3, 410300, ',410000,410300,410305,');
+INSERT INTO `oa_city` VALUES (410306, '吉利区', 3, 410300, ',410000,410300,410306,');
+INSERT INTO `oa_city` VALUES (410307, '洛龙区', 3, 410300, ',410000,410300,410307,');
+INSERT INTO `oa_city` VALUES (410322, '孟津县', 3, 410300, ',410000,410300,410322,');
+INSERT INTO `oa_city` VALUES (410323, '新安县', 3, 410300, ',410000,410300,410323,');
+INSERT INTO `oa_city` VALUES (410324, '栾川县', 3, 410300, ',410000,410300,410324,');
+INSERT INTO `oa_city` VALUES (410325, '嵩　县', 3, 410300, ',410000,410300,410325,');
+INSERT INTO `oa_city` VALUES (410326, '汝阳县', 3, 410300, ',410000,410300,410326,');
+INSERT INTO `oa_city` VALUES (410327, '宜阳县', 3, 410300, ',410000,410300,410327,');
+INSERT INTO `oa_city` VALUES (410328, '洛宁县', 3, 410300, ',410000,410300,410328,');
+INSERT INTO `oa_city` VALUES (410329, '伊川县', 3, 410300, ',410000,410300,410329,');
+INSERT INTO `oa_city` VALUES (410381, '偃师市', 3, 410300, ',410000,410300,410381,');
+INSERT INTO `oa_city` VALUES (410400, '平顶山市', 2, 410000, ',410000,410400,');
+INSERT INTO `oa_city` VALUES (410402, '新华区', 3, 410400, ',410000,410400,410402,');
+INSERT INTO `oa_city` VALUES (410403, '卫东区', 3, 410400, ',410000,410400,410403,');
+INSERT INTO `oa_city` VALUES (410404, '石龙区', 3, 410400, ',410000,410400,410404,');
+INSERT INTO `oa_city` VALUES (410411, '湛河区', 3, 410400, ',410000,410400,410411,');
+INSERT INTO `oa_city` VALUES (410421, '宝丰县', 3, 410400, ',410000,410400,410421,');
+INSERT INTO `oa_city` VALUES (410422, '叶　县', 3, 410400, ',410000,410400,410422,');
+INSERT INTO `oa_city` VALUES (410423, '鲁山县', 3, 410400, ',410000,410400,410423,');
+INSERT INTO `oa_city` VALUES (410425, '郏　县', 3, 410400, ',410000,410400,410425,');
+INSERT INTO `oa_city` VALUES (410481, '舞钢市', 3, 410400, ',410000,410400,410481,');
+INSERT INTO `oa_city` VALUES (410482, '汝州市', 3, 410400, ',410000,410400,410482,');
+INSERT INTO `oa_city` VALUES (410500, '安阳市', 2, 410000, ',410000,410500,');
+INSERT INTO `oa_city` VALUES (410502, '文峰区', 3, 410500, ',410000,410500,410502,');
+INSERT INTO `oa_city` VALUES (410503, '北关区', 3, 410500, ',410000,410500,410503,');
+INSERT INTO `oa_city` VALUES (410505, '殷都区', 3, 410500, ',410000,410500,410505,');
+INSERT INTO `oa_city` VALUES (410506, '龙安区', 3, 410500, ',410000,410500,410506,');
+INSERT INTO `oa_city` VALUES (410522, '安阳县', 3, 410500, ',410000,410500,410522,');
+INSERT INTO `oa_city` VALUES (410523, '汤阴县', 3, 410500, ',410000,410500,410523,');
+INSERT INTO `oa_city` VALUES (410526, '滑　县', 3, 410500, ',410000,410500,410526,');
+INSERT INTO `oa_city` VALUES (410527, '内黄县', 3, 410500, ',410000,410500,410527,');
+INSERT INTO `oa_city` VALUES (410581, '林州市', 3, 410500, ',410000,410500,410581,');
+INSERT INTO `oa_city` VALUES (410600, '鹤壁市', 2, 410000, ',410000,410600,');
+INSERT INTO `oa_city` VALUES (410602, '鹤山区', 3, 410600, ',410000,410600,410602,');
+INSERT INTO `oa_city` VALUES (410603, '山城区', 3, 410600, ',410000,410600,410603,');
+INSERT INTO `oa_city` VALUES (410611, '淇滨区', 3, 410600, ',410000,410600,410611,');
+INSERT INTO `oa_city` VALUES (410621, '浚　县', 3, 410600, ',410000,410600,410621,');
+INSERT INTO `oa_city` VALUES (410622, '淇　县', 3, 410600, ',410000,410600,410622,');
+INSERT INTO `oa_city` VALUES (410700, '新乡市', 2, 410000, ',410000,410700,');
+INSERT INTO `oa_city` VALUES (410702, '红旗区', 3, 410700, ',410000,410700,410702,');
+INSERT INTO `oa_city` VALUES (410703, '卫滨区', 3, 410700, ',410000,410700,410703,');
+INSERT INTO `oa_city` VALUES (410704, '凤泉区', 3, 410700, ',410000,410700,410704,');
+INSERT INTO `oa_city` VALUES (410711, '牧野区', 3, 410700, ',410000,410700,410711,');
+INSERT INTO `oa_city` VALUES (410721, '新乡县', 3, 410700, ',410000,410700,410721,');
+INSERT INTO `oa_city` VALUES (410724, '获嘉县', 3, 410700, ',410000,410700,410724,');
+INSERT INTO `oa_city` VALUES (410725, '原阳县', 3, 410700, ',410000,410700,410725,');
+INSERT INTO `oa_city` VALUES (410726, '延津县', 3, 410700, ',410000,410700,410726,');
+INSERT INTO `oa_city` VALUES (410727, '封丘县', 3, 410700, ',410000,410700,410727,');
+INSERT INTO `oa_city` VALUES (410728, '长垣县', 3, 410700, ',410000,410700,410728,');
+INSERT INTO `oa_city` VALUES (410781, '卫辉市', 3, 410700, ',410000,410700,410781,');
+INSERT INTO `oa_city` VALUES (410782, '辉县市', 3, 410700, ',410000,410700,410782,');
+INSERT INTO `oa_city` VALUES (410800, '焦作市', 2, 410000, ',410000,410800,');
+INSERT INTO `oa_city` VALUES (410802, '解放区', 3, 410800, ',410000,410800,410802,');
+INSERT INTO `oa_city` VALUES (410803, '中站区', 3, 410800, ',410000,410800,410803,');
+INSERT INTO `oa_city` VALUES (410804, '马村区', 3, 410800, ',410000,410800,410804,');
+INSERT INTO `oa_city` VALUES (410811, '山阳区', 3, 410800, ',410000,410800,410811,');
+INSERT INTO `oa_city` VALUES (410821, '修武县', 3, 410800, ',410000,410800,410821,');
+INSERT INTO `oa_city` VALUES (410822, '博爱县', 3, 410800, ',410000,410800,410822,');
+INSERT INTO `oa_city` VALUES (410823, '武陟县', 3, 410800, ',410000,410800,410823,');
+INSERT INTO `oa_city` VALUES (410825, '温　县', 3, 410800, ',410000,410800,410825,');
+INSERT INTO `oa_city` VALUES (410881, '济源市', 3, 410800, ',410000,410800,410881,');
+INSERT INTO `oa_city` VALUES (410882, '沁阳市', 3, 410800, ',410000,410800,410882,');
+INSERT INTO `oa_city` VALUES (410883, '孟州市', 3, 410800, ',410000,410800,410883,');
+INSERT INTO `oa_city` VALUES (410900, '濮阳市', 2, 410000, ',410000,410900,');
+INSERT INTO `oa_city` VALUES (410902, '华龙区', 3, 410900, ',410000,410900,410902,');
+INSERT INTO `oa_city` VALUES (410922, '清丰县', 3, 410900, ',410000,410900,410922,');
+INSERT INTO `oa_city` VALUES (410923, '南乐县', 3, 410900, ',410000,410900,410923,');
+INSERT INTO `oa_city` VALUES (410926, '范　县', 3, 410900, ',410000,410900,410926,');
+INSERT INTO `oa_city` VALUES (410927, '台前县', 3, 410900, ',410000,410900,410927,');
+INSERT INTO `oa_city` VALUES (410928, '濮阳县', 3, 410900, ',410000,410900,410928,');
+INSERT INTO `oa_city` VALUES (411000, '许昌市', 2, 410000, ',410000,411000,');
+INSERT INTO `oa_city` VALUES (411002, '魏都区', 3, 411000, ',410000,411000,411002,');
+INSERT INTO `oa_city` VALUES (411023, '许昌县', 3, 411000, ',410000,411000,411023,');
+INSERT INTO `oa_city` VALUES (411024, '鄢陵县', 3, 411000, ',410000,411000,411024,');
+INSERT INTO `oa_city` VALUES (411025, '襄城县', 3, 411000, ',410000,411000,411025,');
+INSERT INTO `oa_city` VALUES (411081, '禹州市', 3, 411000, ',410000,411000,411081,');
+INSERT INTO `oa_city` VALUES (411082, '长葛市', 3, 411000, ',410000,411000,411082,');
+INSERT INTO `oa_city` VALUES (411100, '漯河市', 2, 410000, ',410000,411100,');
+INSERT INTO `oa_city` VALUES (411102, '源汇区', 3, 411100, ',410000,411100,411102,');
+INSERT INTO `oa_city` VALUES (411103, '郾城区', 3, 411100, ',410000,411100,411103,');
+INSERT INTO `oa_city` VALUES (411104, '召陵区', 3, 411100, ',410000,411100,411104,');
+INSERT INTO `oa_city` VALUES (411121, '舞阳县', 3, 411100, ',410000,411100,411121,');
+INSERT INTO `oa_city` VALUES (411122, '临颍县', 3, 411100, ',410000,411100,411122,');
+INSERT INTO `oa_city` VALUES (411200, '三门峡市', 2, 410000, ',410000,411200,');
+INSERT INTO `oa_city` VALUES (411202, '湖滨区', 3, 411200, ',410000,411200,411202,');
+INSERT INTO `oa_city` VALUES (411221, '渑池县', 3, 411200, ',410000,411200,411221,');
+INSERT INTO `oa_city` VALUES (411222, '陕　县', 3, 411200, ',410000,411200,411222,');
+INSERT INTO `oa_city` VALUES (411224, '卢氏县', 3, 411200, ',410000,411200,411224,');
+INSERT INTO `oa_city` VALUES (411281, '义马市', 3, 411200, ',410000,411200,411281,');
+INSERT INTO `oa_city` VALUES (411282, '灵宝市', 3, 411200, ',410000,411200,411282,');
+INSERT INTO `oa_city` VALUES (411300, '南阳市', 2, 410000, ',410000,411300,');
+INSERT INTO `oa_city` VALUES (411302, '宛城区', 3, 411300, ',410000,411300,411302,');
+INSERT INTO `oa_city` VALUES (411303, '卧龙区', 3, 411300, ',410000,411300,411303,');
+INSERT INTO `oa_city` VALUES (411321, '南召县', 3, 411300, ',410000,411300,411321,');
+INSERT INTO `oa_city` VALUES (411322, '方城县', 3, 411300, ',410000,411300,411322,');
+INSERT INTO `oa_city` VALUES (411323, '西峡县', 3, 411300, ',410000,411300,411323,');
+INSERT INTO `oa_city` VALUES (411324, '镇平县', 3, 411300, ',410000,411300,411324,');
+INSERT INTO `oa_city` VALUES (411325, '内乡县', 3, 411300, ',410000,411300,411325,');
+INSERT INTO `oa_city` VALUES (411326, '淅川县', 3, 411300, ',410000,411300,411326,');
+INSERT INTO `oa_city` VALUES (411327, '社旗县', 3, 411300, ',410000,411300,411327,');
+INSERT INTO `oa_city` VALUES (411328, '唐河县', 3, 411300, ',410000,411300,411328,');
+INSERT INTO `oa_city` VALUES (411329, '新野县', 3, 411300, ',410000,411300,411329,');
+INSERT INTO `oa_city` VALUES (411330, '桐柏县', 3, 411300, ',410000,411300,411330,');
+INSERT INTO `oa_city` VALUES (411381, '邓州市', 3, 411300, ',410000,411300,411381,');
+INSERT INTO `oa_city` VALUES (411400, '商丘市', 2, 410000, ',410000,411400,');
+INSERT INTO `oa_city` VALUES (411402, '梁园区', 3, 411400, ',410000,411400,411402,');
+INSERT INTO `oa_city` VALUES (411403, '睢阳区', 3, 411400, ',410000,411400,411403,');
+INSERT INTO `oa_city` VALUES (411421, '民权县', 3, 411400, ',410000,411400,411421,');
+INSERT INTO `oa_city` VALUES (411422, '睢　县', 3, 411400, ',410000,411400,411422,');
+INSERT INTO `oa_city` VALUES (411423, '宁陵县', 3, 411400, ',410000,411400,411423,');
+INSERT INTO `oa_city` VALUES (411424, '柘城县', 3, 411400, ',410000,411400,411424,');
+INSERT INTO `oa_city` VALUES (411425, '虞城县', 3, 411400, ',410000,411400,411425,');
+INSERT INTO `oa_city` VALUES (411426, '夏邑县', 3, 411400, ',410000,411400,411426,');
+INSERT INTO `oa_city` VALUES (411481, '永城市', 3, 411400, ',410000,411400,411481,');
+INSERT INTO `oa_city` VALUES (411500, '信阳市', 2, 410000, ',410000,411500,');
+INSERT INTO `oa_city` VALUES (411502, '师河区', 3, 411500, ',410000,411500,411502,');
+INSERT INTO `oa_city` VALUES (411503, '平桥区', 3, 411500, ',410000,411500,411503,');
+INSERT INTO `oa_city` VALUES (411521, '罗山县', 3, 411500, ',410000,411500,411521,');
+INSERT INTO `oa_city` VALUES (411522, '光山县', 3, 411500, ',410000,411500,411522,');
+INSERT INTO `oa_city` VALUES (411523, '新　县', 3, 411500, ',410000,411500,411523,');
+INSERT INTO `oa_city` VALUES (411524, '商城县', 3, 411500, ',410000,411500,411524,');
+INSERT INTO `oa_city` VALUES (411525, '固始县', 3, 411500, ',410000,411500,411525,');
+INSERT INTO `oa_city` VALUES (411526, '潢川县', 3, 411500, ',410000,411500,411526,');
+INSERT INTO `oa_city` VALUES (411527, '淮滨县', 3, 411500, ',410000,411500,411527,');
+INSERT INTO `oa_city` VALUES (411528, '息　县', 3, 411500, ',410000,411500,411528,');
+INSERT INTO `oa_city` VALUES (411600, '周口市', 2, 410000, ',410000,411600,');
+INSERT INTO `oa_city` VALUES (411602, '川汇区', 3, 411600, ',410000,411600,411602,');
+INSERT INTO `oa_city` VALUES (411621, '扶沟县', 3, 411600, ',410000,411600,411621,');
+INSERT INTO `oa_city` VALUES (411622, '西华县', 3, 411600, ',410000,411600,411622,');
+INSERT INTO `oa_city` VALUES (411623, '商水县', 3, 411600, ',410000,411600,411623,');
+INSERT INTO `oa_city` VALUES (411624, '沈丘县', 3, 411600, ',410000,411600,411624,');
+INSERT INTO `oa_city` VALUES (411625, '郸城县', 3, 411600, ',410000,411600,411625,');
+INSERT INTO `oa_city` VALUES (411626, '淮阳县', 3, 411600, ',410000,411600,411626,');
+INSERT INTO `oa_city` VALUES (411627, '太康县', 3, 411600, ',410000,411600,411627,');
+INSERT INTO `oa_city` VALUES (411628, '鹿邑县', 3, 411600, ',410000,411600,411628,');
+INSERT INTO `oa_city` VALUES (411681, '项城市', 3, 411600, ',410000,411600,411681,');
+INSERT INTO `oa_city` VALUES (411700, '驻马店市', 2, 410000, ',410000,411700,');
+INSERT INTO `oa_city` VALUES (411702, '驿城区', 3, 411700, ',410000,411700,411702,');
+INSERT INTO `oa_city` VALUES (411721, '西平县', 3, 411700, ',410000,411700,411721,');
+INSERT INTO `oa_city` VALUES (411722, '上蔡县', 3, 411700, ',410000,411700,411722,');
+INSERT INTO `oa_city` VALUES (411723, '平舆县', 3, 411700, ',410000,411700,411723,');
+INSERT INTO `oa_city` VALUES (411724, '正阳县', 3, 411700, ',410000,411700,411724,');
+INSERT INTO `oa_city` VALUES (411725, '确山县', 3, 411700, ',410000,411700,411725,');
+INSERT INTO `oa_city` VALUES (411726, '泌阳县', 3, 411700, ',410000,411700,411726,');
+INSERT INTO `oa_city` VALUES (411727, '汝南县', 3, 411700, ',410000,411700,411727,');
+INSERT INTO `oa_city` VALUES (411728, '遂平县', 3, 411700, ',410000,411700,411728,');
+INSERT INTO `oa_city` VALUES (411729, '新蔡县', 3, 411700, ',410000,411700,411729,');
+INSERT INTO `oa_city` VALUES (420000, '湖北省', 1, 0, ',420000,');
+INSERT INTO `oa_city` VALUES (420100, '武汉市', 2, 420000, ',420000,420100,');
+INSERT INTO `oa_city` VALUES (420102, '江岸区', 3, 420100, ',420000,420100,420102,');
+INSERT INTO `oa_city` VALUES (420103, '江汉区', 3, 420100, ',420000,420100,420103,');
+INSERT INTO `oa_city` VALUES (420104, '乔口区', 3, 420100, ',420000,420100,420104,');
+INSERT INTO `oa_city` VALUES (420105, '汉阳区', 3, 420100, ',420000,420100,420105,');
+INSERT INTO `oa_city` VALUES (420106, '武昌区', 3, 420100, ',420000,420100,420106,');
+INSERT INTO `oa_city` VALUES (420107, '青山区', 3, 420100, ',420000,420100,420107,');
+INSERT INTO `oa_city` VALUES (420111, '洪山区', 3, 420100, ',420000,420100,420111,');
+INSERT INTO `oa_city` VALUES (420112, '东西湖区', 3, 420100, ',420000,420100,420112,');
+INSERT INTO `oa_city` VALUES (420113, '汉南区', 3, 420100, ',420000,420100,420113,');
+INSERT INTO `oa_city` VALUES (420114, '蔡甸区', 3, 420100, ',420000,420100,420114,');
+INSERT INTO `oa_city` VALUES (420115, '江夏区', 3, 420100, ',420000,420100,420115,');
+INSERT INTO `oa_city` VALUES (420116, '黄陂区', 3, 420100, ',420000,420100,420116,');
+INSERT INTO `oa_city` VALUES (420117, '新洲区', 3, 420100, ',420000,420100,420117,');
+INSERT INTO `oa_city` VALUES (420200, '黄石市', 2, 420000, ',420000,420200,');
+INSERT INTO `oa_city` VALUES (420202, '黄石港区', 3, 420200, ',420000,420200,420202,');
+INSERT INTO `oa_city` VALUES (420203, '西塞山区', 3, 420200, ',420000,420200,420203,');
+INSERT INTO `oa_city` VALUES (420204, '下陆区', 3, 420200, ',420000,420200,420204,');
+INSERT INTO `oa_city` VALUES (420205, '铁山区', 3, 420200, ',420000,420200,420205,');
+INSERT INTO `oa_city` VALUES (420222, '阳新县', 3, 420200, ',420000,420200,420222,');
+INSERT INTO `oa_city` VALUES (420281, '大冶市', 3, 420200, ',420000,420200,420281,');
+INSERT INTO `oa_city` VALUES (420300, '十堰市', 2, 420000, ',420000,420300,');
+INSERT INTO `oa_city` VALUES (420302, '茅箭区', 3, 420300, ',420000,420300,420302,');
+INSERT INTO `oa_city` VALUES (420303, '张湾区', 3, 420300, ',420000,420300,420303,');
+INSERT INTO `oa_city` VALUES (420321, '郧　县', 3, 420300, ',420000,420300,420321,');
+INSERT INTO `oa_city` VALUES (420322, '郧西县', 3, 420300, ',420000,420300,420322,');
+INSERT INTO `oa_city` VALUES (420323, '竹山县', 3, 420300, ',420000,420300,420323,');
+INSERT INTO `oa_city` VALUES (420324, '竹溪县', 3, 420300, ',420000,420300,420324,');
+INSERT INTO `oa_city` VALUES (420325, '房　县', 3, 420300, ',420000,420300,420325,');
+INSERT INTO `oa_city` VALUES (420381, '丹江口市', 3, 420300, ',420000,420300,420381,');
+INSERT INTO `oa_city` VALUES (420500, '宜昌市', 2, 420000, ',420000,420500,');
+INSERT INTO `oa_city` VALUES (420502, '西陵区', 3, 420500, ',420000,420500,420502,');
+INSERT INTO `oa_city` VALUES (420503, '伍家岗区', 3, 420500, ',420000,420500,420503,');
+INSERT INTO `oa_city` VALUES (420504, '点军区', 3, 420500, ',420000,420500,420504,');
+INSERT INTO `oa_city` VALUES (420505, '猇亭区', 3, 420500, ',420000,420500,420505,');
+INSERT INTO `oa_city` VALUES (420506, '夷陵区', 3, 420500, ',420000,420500,420506,');
+INSERT INTO `oa_city` VALUES (420525, '远安县', 3, 420500, ',420000,420500,420525,');
+INSERT INTO `oa_city` VALUES (420526, '兴山县', 3, 420500, ',420000,420500,420526,');
+INSERT INTO `oa_city` VALUES (420527, '秭归县', 3, 420500, ',420000,420500,420527,');
+INSERT INTO `oa_city` VALUES (420528, '长阳土家族自治县', 3, 420500, ',420000,420500,420528,');
+INSERT INTO `oa_city` VALUES (420529, '五峰土家族自治县', 3, 420500, ',420000,420500,420529,');
+INSERT INTO `oa_city` VALUES (420581, '宜都市', 3, 420500, ',420000,420500,420581,');
+INSERT INTO `oa_city` VALUES (420582, '当阳市', 3, 420500, ',420000,420500,420582,');
+INSERT INTO `oa_city` VALUES (420583, '枝江市', 3, 420500, ',420000,420500,420583,');
+INSERT INTO `oa_city` VALUES (420600, '襄樊市', 2, 420000, ',420000,420600,');
+INSERT INTO `oa_city` VALUES (420602, '襄城区', 3, 420600, ',420000,420600,420602,');
+INSERT INTO `oa_city` VALUES (420606, '樊城区', 3, 420600, ',420000,420600,420606,');
+INSERT INTO `oa_city` VALUES (420607, '襄阳区', 3, 420600, ',420000,420600,420607,');
+INSERT INTO `oa_city` VALUES (420624, '南漳县', 3, 420600, ',420000,420600,420624,');
+INSERT INTO `oa_city` VALUES (420625, '谷城县', 3, 420600, ',420000,420600,420625,');
+INSERT INTO `oa_city` VALUES (420626, '保康县', 3, 420600, ',420000,420600,420626,');
+INSERT INTO `oa_city` VALUES (420682, '老河口市', 3, 420600, ',420000,420600,420682,');
+INSERT INTO `oa_city` VALUES (420683, '枣阳市', 3, 420600, ',420000,420600,420683,');
+INSERT INTO `oa_city` VALUES (420684, '宜城市', 3, 420600, ',420000,420600,420684,');
+INSERT INTO `oa_city` VALUES (420700, '鄂州市', 2, 420000, ',420000,420700,');
+INSERT INTO `oa_city` VALUES (420702, '梁子湖区', 3, 420700, ',420000,420700,420702,');
+INSERT INTO `oa_city` VALUES (420703, '华容区', 3, 420700, ',420000,420700,420703,');
+INSERT INTO `oa_city` VALUES (420704, '鄂城区', 3, 420700, ',420000,420700,420704,');
+INSERT INTO `oa_city` VALUES (420800, '荆门市', 2, 420000, ',420000,420800,');
+INSERT INTO `oa_city` VALUES (420802, '东宝区', 3, 420800, ',420000,420800,420802,');
+INSERT INTO `oa_city` VALUES (420804, '掇刀区', 3, 420800, ',420000,420800,420804,');
+INSERT INTO `oa_city` VALUES (420821, '京山县', 3, 420800, ',420000,420800,420821,');
+INSERT INTO `oa_city` VALUES (420822, '沙洋县', 3, 420800, ',420000,420800,420822,');
+INSERT INTO `oa_city` VALUES (420881, '钟祥市', 3, 420800, ',420000,420800,420881,');
+INSERT INTO `oa_city` VALUES (420900, '孝感市', 2, 420000, ',420000,420900,');
+INSERT INTO `oa_city` VALUES (420902, '孝南区', 3, 420900, ',420000,420900,420902,');
+INSERT INTO `oa_city` VALUES (420921, '孝昌县', 3, 420900, ',420000,420900,420921,');
+INSERT INTO `oa_city` VALUES (420922, '大悟县', 3, 420900, ',420000,420900,420922,');
+INSERT INTO `oa_city` VALUES (420923, '云梦县', 3, 420900, ',420000,420900,420923,');
+INSERT INTO `oa_city` VALUES (420981, '应城市', 3, 420900, ',420000,420900,420981,');
+INSERT INTO `oa_city` VALUES (420982, '安陆市', 3, 420900, ',420000,420900,420982,');
+INSERT INTO `oa_city` VALUES (420984, '汉川市', 3, 420900, ',420000,420900,420984,');
+INSERT INTO `oa_city` VALUES (421000, '荆州市', 2, 420000, ',420000,421000,');
+INSERT INTO `oa_city` VALUES (421002, '沙市区', 3, 421000, ',420000,421000,421002,');
+INSERT INTO `oa_city` VALUES (421003, '荆州区', 3, 421000, ',420000,421000,421003,');
+INSERT INTO `oa_city` VALUES (421022, '公安县', 3, 421000, ',420000,421000,421022,');
+INSERT INTO `oa_city` VALUES (421023, '监利县', 3, 421000, ',420000,421000,421023,');
+INSERT INTO `oa_city` VALUES (421024, '江陵县', 3, 421000, ',420000,421000,421024,');
+INSERT INTO `oa_city` VALUES (421081, '石首市', 3, 421000, ',420000,421000,421081,');
+INSERT INTO `oa_city` VALUES (421083, '洪湖市', 3, 421000, ',420000,421000,421083,');
+INSERT INTO `oa_city` VALUES (421087, '松滋市', 3, 421000, ',420000,421000,421087,');
+INSERT INTO `oa_city` VALUES (421100, '黄冈市', 2, 420000, ',420000,421100,');
+INSERT INTO `oa_city` VALUES (421102, '黄州区', 3, 421100, ',420000,421100,421102,');
+INSERT INTO `oa_city` VALUES (421121, '团风县', 3, 421100, ',420000,421100,421121,');
+INSERT INTO `oa_city` VALUES (421122, '红安县', 3, 421100, ',420000,421100,421122,');
+INSERT INTO `oa_city` VALUES (421123, '罗田县', 3, 421100, ',420000,421100,421123,');
+INSERT INTO `oa_city` VALUES (421124, '英山县', 3, 421100, ',420000,421100,421124,');
+INSERT INTO `oa_city` VALUES (421125, '浠水县', 3, 421100, ',420000,421100,421125,');
+INSERT INTO `oa_city` VALUES (421126, '蕲春县', 3, 421100, ',420000,421100,421126,');
+INSERT INTO `oa_city` VALUES (421127, '黄梅县', 3, 421100, ',420000,421100,421127,');
+INSERT INTO `oa_city` VALUES (421181, '麻城市', 3, 421100, ',420000,421100,421181,');
+INSERT INTO `oa_city` VALUES (421182, '武穴市', 3, 421100, ',420000,421100,421182,');
+INSERT INTO `oa_city` VALUES (421200, '咸宁市', 2, 420000, ',420000,421200,');
+INSERT INTO `oa_city` VALUES (421202, '咸安区', 3, 421200, ',420000,421200,421202,');
+INSERT INTO `oa_city` VALUES (421221, '嘉鱼县', 3, 421200, ',420000,421200,421221,');
+INSERT INTO `oa_city` VALUES (421222, '通城县', 3, 421200, ',420000,421200,421222,');
+INSERT INTO `oa_city` VALUES (421223, '崇阳县', 3, 421200, ',420000,421200,421223,');
+INSERT INTO `oa_city` VALUES (421224, '通山县', 3, 421200, ',420000,421200,421224,');
+INSERT INTO `oa_city` VALUES (421281, '赤壁市', 3, 421200, ',420000,421200,421281,');
+INSERT INTO `oa_city` VALUES (421300, '随州市', 2, 420000, ',420000,421300,');
+INSERT INTO `oa_city` VALUES (421302, '曾都区', 3, 421300, ',420000,421300,421302,');
+INSERT INTO `oa_city` VALUES (421381, '广水市', 3, 421300, ',420000,421300,421381,');
+INSERT INTO `oa_city` VALUES (422800, '恩施土家族苗族自治州', 2, 420000, ',420000,422800,');
+INSERT INTO `oa_city` VALUES (422801, '恩施市', 3, 422800, ',420000,422800,422801,');
+INSERT INTO `oa_city` VALUES (422802, '利川市', 3, 422800, ',420000,422800,422802,');
+INSERT INTO `oa_city` VALUES (422822, '建始县', 3, 422800, ',420000,422800,422822,');
+INSERT INTO `oa_city` VALUES (422823, '巴东县', 3, 422800, ',420000,422800,422823,');
+INSERT INTO `oa_city` VALUES (422825, '宣恩县', 3, 422800, ',420000,422800,422825,');
+INSERT INTO `oa_city` VALUES (422826, '咸丰县', 3, 422800, ',420000,422800,422826,');
+INSERT INTO `oa_city` VALUES (422827, '来凤县', 3, 422800, ',420000,422800,422827,');
+INSERT INTO `oa_city` VALUES (422828, '鹤峰县', 3, 422800, ',420000,422800,422828,');
+INSERT INTO `oa_city` VALUES (429004, '仙桃市', 2, 420000, ',420000,429004,');
+INSERT INTO `oa_city` VALUES (429005, '潜江市', 2, 420000, ',420000,429005,');
+INSERT INTO `oa_city` VALUES (429006, '天门市', 2, 420000, ',420000,429006,');
+INSERT INTO `oa_city` VALUES (429021, '神农架林区', 2, 420000, ',420000,429021,');
+INSERT INTO `oa_city` VALUES (430000, '湖南省', 1, 0, ',430000,');
+INSERT INTO `oa_city` VALUES (430100, '长沙市', 2, 430000, ',430000,430100,');
+INSERT INTO `oa_city` VALUES (430102, '芙蓉区', 3, 430100, ',430000,430100,430102,');
+INSERT INTO `oa_city` VALUES (430103, '天心区', 3, 430100, ',430000,430100,430103,');
+INSERT INTO `oa_city` VALUES (430104, '岳麓区', 3, 430100, ',430000,430100,430104,');
+INSERT INTO `oa_city` VALUES (430105, '开福区', 3, 430100, ',430000,430100,430105,');
+INSERT INTO `oa_city` VALUES (430111, '雨花区', 3, 430100, ',430000,430100,430111,');
+INSERT INTO `oa_city` VALUES (430121, '长沙县', 3, 430100, ',430000,430100,430121,');
+INSERT INTO `oa_city` VALUES (430122, '望城县', 3, 430100, ',430000,430100,430122,');
+INSERT INTO `oa_city` VALUES (430124, '宁乡县', 3, 430100, ',430000,430100,430124,');
+INSERT INTO `oa_city` VALUES (430181, '浏阳市', 3, 430100, ',430000,430100,430181,');
+INSERT INTO `oa_city` VALUES (430200, '株洲市', 2, 430000, ',430000,430200,');
+INSERT INTO `oa_city` VALUES (430202, '荷塘区', 3, 430200, ',430000,430200,430202,');
+INSERT INTO `oa_city` VALUES (430203, '芦淞区', 3, 430200, ',430000,430200,430203,');
+INSERT INTO `oa_city` VALUES (430204, '石峰区', 3, 430200, ',430000,430200,430204,');
+INSERT INTO `oa_city` VALUES (430211, '天元区', 3, 430200, ',430000,430200,430211,');
+INSERT INTO `oa_city` VALUES (430221, '株洲县', 3, 430200, ',430000,430200,430221,');
+INSERT INTO `oa_city` VALUES (430223, '攸　县', 3, 430200, ',430000,430200,430223,');
+INSERT INTO `oa_city` VALUES (430224, '茶陵县', 3, 430200, ',430000,430200,430224,');
+INSERT INTO `oa_city` VALUES (430225, '炎陵县', 3, 430200, ',430000,430200,430225,');
+INSERT INTO `oa_city` VALUES (430281, '醴陵市', 3, 430200, ',430000,430200,430281,');
+INSERT INTO `oa_city` VALUES (430300, '湘潭市', 2, 430000, ',430000,430300,');
+INSERT INTO `oa_city` VALUES (430302, '雨湖区', 3, 430300, ',430000,430300,430302,');
+INSERT INTO `oa_city` VALUES (430304, '岳塘区', 3, 430300, ',430000,430300,430304,');
+INSERT INTO `oa_city` VALUES (430321, '湘潭县', 3, 430300, ',430000,430300,430321,');
+INSERT INTO `oa_city` VALUES (430381, '湘乡市', 3, 430300, ',430000,430300,430381,');
+INSERT INTO `oa_city` VALUES (430382, '韶山市', 3, 430300, ',430000,430300,430382,');
+INSERT INTO `oa_city` VALUES (430400, '衡阳市', 2, 430000, ',430000,430400,');
+INSERT INTO `oa_city` VALUES (430405, '珠晖区', 3, 430400, ',430000,430400,430405,');
+INSERT INTO `oa_city` VALUES (430406, '雁峰区', 3, 430400, ',430000,430400,430406,');
+INSERT INTO `oa_city` VALUES (430407, '石鼓区', 3, 430400, ',430000,430400,430407,');
+INSERT INTO `oa_city` VALUES (430408, '蒸湘区', 3, 430400, ',430000,430400,430408,');
+INSERT INTO `oa_city` VALUES (430412, '南岳区', 3, 430400, ',430000,430400,430412,');
+INSERT INTO `oa_city` VALUES (430421, '衡阳县', 3, 430400, ',430000,430400,430421,');
+INSERT INTO `oa_city` VALUES (430422, '衡南县', 3, 430400, ',430000,430400,430422,');
+INSERT INTO `oa_city` VALUES (430423, '衡山县', 3, 430400, ',430000,430400,430423,');
+INSERT INTO `oa_city` VALUES (430424, '衡东县', 3, 430400, ',430000,430400,430424,');
+INSERT INTO `oa_city` VALUES (430426, '祁东县', 3, 430400, ',430000,430400,430426,');
+INSERT INTO `oa_city` VALUES (430481, '耒阳市', 3, 430400, ',430000,430400,430481,');
+INSERT INTO `oa_city` VALUES (430482, '常宁市', 3, 430400, ',430000,430400,430482,');
+INSERT INTO `oa_city` VALUES (430500, '邵阳市', 2, 430000, ',430000,430500,');
+INSERT INTO `oa_city` VALUES (430502, '双清区', 3, 430500, ',430000,430500,430502,');
+INSERT INTO `oa_city` VALUES (430503, '大祥区', 3, 430500, ',430000,430500,430503,');
+INSERT INTO `oa_city` VALUES (430511, '北塔区', 3, 430500, ',430000,430500,430511,');
+INSERT INTO `oa_city` VALUES (430521, '邵东县', 3, 430500, ',430000,430500,430521,');
+INSERT INTO `oa_city` VALUES (430522, '新邵县', 3, 430500, ',430000,430500,430522,');
+INSERT INTO `oa_city` VALUES (430523, '邵阳县', 3, 430500, ',430000,430500,430523,');
+INSERT INTO `oa_city` VALUES (430524, '隆回县', 3, 430500, ',430000,430500,430524,');
+INSERT INTO `oa_city` VALUES (430525, '洞口县', 3, 430500, ',430000,430500,430525,');
+INSERT INTO `oa_city` VALUES (430527, '绥宁县', 3, 430500, ',430000,430500,430527,');
+INSERT INTO `oa_city` VALUES (430528, '新宁县', 3, 430500, ',430000,430500,430528,');
+INSERT INTO `oa_city` VALUES (430529, '城步苗族自治县', 3, 430500, ',430000,430500,430529,');
+INSERT INTO `oa_city` VALUES (430581, '武冈市', 3, 430500, ',430000,430500,430581,');
+INSERT INTO `oa_city` VALUES (430600, '岳阳市', 2, 430000, ',430000,430600,');
+INSERT INTO `oa_city` VALUES (430602, '岳阳楼区', 3, 430600, ',430000,430600,430602,');
+INSERT INTO `oa_city` VALUES (430603, '云溪区', 3, 430600, ',430000,430600,430603,');
+INSERT INTO `oa_city` VALUES (430611, '君山区', 3, 430600, ',430000,430600,430611,');
+INSERT INTO `oa_city` VALUES (430621, '岳阳县', 3, 430600, ',430000,430600,430621,');
+INSERT INTO `oa_city` VALUES (430623, '华容县', 3, 430600, ',430000,430600,430623,');
+INSERT INTO `oa_city` VALUES (430624, '湘阴县', 3, 430600, ',430000,430600,430624,');
+INSERT INTO `oa_city` VALUES (430626, '平江县', 3, 430600, ',430000,430600,430626,');
+INSERT INTO `oa_city` VALUES (430681, '汨罗市', 3, 430600, ',430000,430600,430681,');
+INSERT INTO `oa_city` VALUES (430682, '临湘市', 3, 430600, ',430000,430600,430682,');
+INSERT INTO `oa_city` VALUES (430700, '常德市', 2, 430000, ',430000,430700,');
+INSERT INTO `oa_city` VALUES (430702, '武陵区', 3, 430700, ',430000,430700,430702,');
+INSERT INTO `oa_city` VALUES (430703, '鼎城区', 3, 430700, ',430000,430700,430703,');
+INSERT INTO `oa_city` VALUES (430721, '安乡县', 3, 430700, ',430000,430700,430721,');
+INSERT INTO `oa_city` VALUES (430722, '汉寿县', 3, 430700, ',430000,430700,430722,');
+INSERT INTO `oa_city` VALUES (430723, '澧　县', 3, 430700, ',430000,430700,430723,');
+INSERT INTO `oa_city` VALUES (430724, '临澧县', 3, 430700, ',430000,430700,430724,');
+INSERT INTO `oa_city` VALUES (430725, '桃源县', 3, 430700, ',430000,430700,430725,');
+INSERT INTO `oa_city` VALUES (430726, '石门县', 3, 430700, ',430000,430700,430726,');
+INSERT INTO `oa_city` VALUES (430781, '津市市', 3, 430700, ',430000,430700,430781,');
+INSERT INTO `oa_city` VALUES (430800, '张家界市', 2, 430000, ',430000,430800,');
+INSERT INTO `oa_city` VALUES (430802, '永定区', 3, 430800, ',430000,430800,430802,');
+INSERT INTO `oa_city` VALUES (430811, '武陵源区', 3, 430800, ',430000,430800,430811,');
+INSERT INTO `oa_city` VALUES (430821, '慈利县', 3, 430800, ',430000,430800,430821,');
+INSERT INTO `oa_city` VALUES (430822, '桑植县', 3, 430800, ',430000,430800,430822,');
+INSERT INTO `oa_city` VALUES (430900, '益阳市', 2, 430000, ',430000,430900,');
+INSERT INTO `oa_city` VALUES (430902, '资阳区', 3, 430900, ',430000,430900,430902,');
+INSERT INTO `oa_city` VALUES (430903, '赫山区', 3, 430900, ',430000,430900,430903,');
+INSERT INTO `oa_city` VALUES (430921, '南　县', 3, 430900, ',430000,430900,430921,');
+INSERT INTO `oa_city` VALUES (430922, '桃江县', 3, 430900, ',430000,430900,430922,');
+INSERT INTO `oa_city` VALUES (430923, '安化县', 3, 430900, ',430000,430900,430923,');
+INSERT INTO `oa_city` VALUES (430981, '沅江市', 3, 430900, ',430000,430900,430981,');
+INSERT INTO `oa_city` VALUES (431000, '郴州市', 2, 430000, ',430000,431000,');
+INSERT INTO `oa_city` VALUES (431002, '北湖区', 3, 431000, ',430000,431000,431002,');
+INSERT INTO `oa_city` VALUES (431003, '苏仙区', 3, 431000, ',430000,431000,431003,');
+INSERT INTO `oa_city` VALUES (431021, '桂阳县', 3, 431000, ',430000,431000,431021,');
+INSERT INTO `oa_city` VALUES (431022, '宜章县', 3, 431000, ',430000,431000,431022,');
+INSERT INTO `oa_city` VALUES (431023, '永兴县', 3, 431000, ',430000,431000,431023,');
+INSERT INTO `oa_city` VALUES (431024, '嘉禾县', 3, 431000, ',430000,431000,431024,');
+INSERT INTO `oa_city` VALUES (431025, '临武县', 3, 431000, ',430000,431000,431025,');
+INSERT INTO `oa_city` VALUES (431026, '汝城县', 3, 431000, ',430000,431000,431026,');
+INSERT INTO `oa_city` VALUES (431027, '桂东县', 3, 431000, ',430000,431000,431027,');
+INSERT INTO `oa_city` VALUES (431028, '安仁县', 3, 431000, ',430000,431000,431028,');
+INSERT INTO `oa_city` VALUES (431081, '资兴市', 3, 431000, ',430000,431000,431081,');
+INSERT INTO `oa_city` VALUES (431100, '永州市', 2, 430000, ',430000,431100,');
+INSERT INTO `oa_city` VALUES (431102, '芝山区', 3, 431100, ',430000,431100,431102,');
+INSERT INTO `oa_city` VALUES (431103, '冷水滩区', 3, 431100, ',430000,431100,431103,');
+INSERT INTO `oa_city` VALUES (431121, '祁阳县', 3, 431100, ',430000,431100,431121,');
+INSERT INTO `oa_city` VALUES (431122, '东安县', 3, 431100, ',430000,431100,431122,');
+INSERT INTO `oa_city` VALUES (431123, '双牌县', 3, 431100, ',430000,431100,431123,');
+INSERT INTO `oa_city` VALUES (431124, '道　县', 3, 431100, ',430000,431100,431124,');
+INSERT INTO `oa_city` VALUES (431125, '江永县', 3, 431100, ',430000,431100,431125,');
+INSERT INTO `oa_city` VALUES (431126, '宁远县', 3, 431100, ',430000,431100,431126,');
+INSERT INTO `oa_city` VALUES (431127, '蓝山县', 3, 431100, ',430000,431100,431127,');
+INSERT INTO `oa_city` VALUES (431128, '新田县', 3, 431100, ',430000,431100,431128,');
+INSERT INTO `oa_city` VALUES (431129, '江华瑶族自治县', 3, 431100, ',430000,431100,431129,');
+INSERT INTO `oa_city` VALUES (431200, '怀化市', 2, 430000, ',430000,431200,');
+INSERT INTO `oa_city` VALUES (431202, '鹤城区', 3, 431200, ',430000,431200,431202,');
+INSERT INTO `oa_city` VALUES (431221, '中方县', 3, 431200, ',430000,431200,431221,');
+INSERT INTO `oa_city` VALUES (431222, '沅陵县', 3, 431200, ',430000,431200,431222,');
+INSERT INTO `oa_city` VALUES (431223, '辰溪县', 3, 431200, ',430000,431200,431223,');
+INSERT INTO `oa_city` VALUES (431224, '溆浦县', 3, 431200, ',430000,431200,431224,');
+INSERT INTO `oa_city` VALUES (431225, '会同县', 3, 431200, ',430000,431200,431225,');
+INSERT INTO `oa_city` VALUES (431226, '麻阳苗族自治县', 3, 431200, ',430000,431200,431226,');
+INSERT INTO `oa_city` VALUES (431227, '新晃侗族自治县', 3, 431200, ',430000,431200,431227,');
+INSERT INTO `oa_city` VALUES (431228, '芷江侗族自治县', 3, 431200, ',430000,431200,431228,');
+INSERT INTO `oa_city` VALUES (431229, '靖州苗族侗族自治县', 3, 431200, ',430000,431200,431229,');
+INSERT INTO `oa_city` VALUES (431230, '通道侗族自治县', 3, 431200, ',430000,431200,431230,');
+INSERT INTO `oa_city` VALUES (431281, '洪江市', 3, 431200, ',430000,431200,431281,');
+INSERT INTO `oa_city` VALUES (431300, '娄底市', 2, 430000, ',430000,431300,');
+INSERT INTO `oa_city` VALUES (431302, '娄星区', 3, 431300, ',430000,431300,431302,');
+INSERT INTO `oa_city` VALUES (431321, '双峰县', 3, 431300, ',430000,431300,431321,');
+INSERT INTO `oa_city` VALUES (431322, '新化县', 3, 431300, ',430000,431300,431322,');
+INSERT INTO `oa_city` VALUES (431381, '冷水江市', 3, 431300, ',430000,431300,431381,');
+INSERT INTO `oa_city` VALUES (431382, '涟源市', 3, 431300, ',430000,431300,431382,');
+INSERT INTO `oa_city` VALUES (433100, '湘西土家族苗族自治州', 2, 430000, ',430000,433100,');
+INSERT INTO `oa_city` VALUES (433101, '吉首市', 3, 433100, ',430000,433100,433101,');
+INSERT INTO `oa_city` VALUES (433122, '泸溪县', 3, 433100, ',430000,433100,433122,');
+INSERT INTO `oa_city` VALUES (433123, '凤凰县', 3, 433100, ',430000,433100,433123,');
+INSERT INTO `oa_city` VALUES (433124, '花垣县', 3, 433100, ',430000,433100,433124,');
+INSERT INTO `oa_city` VALUES (433125, '保靖县', 3, 433100, ',430000,433100,433125,');
+INSERT INTO `oa_city` VALUES (433126, '古丈县', 3, 433100, ',430000,433100,433126,');
+INSERT INTO `oa_city` VALUES (433127, '永顺县', 3, 433100, ',430000,433100,433127,');
+INSERT INTO `oa_city` VALUES (433130, '龙山县', 3, 433100, ',430000,433100,433130,');
+INSERT INTO `oa_city` VALUES (440000, '广东省', 1, 0, ',440000,');
+INSERT INTO `oa_city` VALUES (440100, '广州市', 2, 440000, ',440000,440100,');
+INSERT INTO `oa_city` VALUES (440103, '荔湾区', 3, 440100, ',440000,440100,440103,');
+INSERT INTO `oa_city` VALUES (440104, '越秀区', 3, 440100, ',440000,440100,440104,');
+INSERT INTO `oa_city` VALUES (440105, '海珠区', 3, 440100, ',440000,440100,440105,');
+INSERT INTO `oa_city` VALUES (440106, '天河区', 3, 440100, ',440000,440100,440106,');
+INSERT INTO `oa_city` VALUES (440111, '白云区', 3, 440100, ',440000,440100,440111,');
+INSERT INTO `oa_city` VALUES (440112, '黄埔区', 3, 440100, ',440000,440100,440112,');
+INSERT INTO `oa_city` VALUES (440113, '番禺区', 3, 440100, ',440000,440100,440113,');
+INSERT INTO `oa_city` VALUES (440114, '花都区', 3, 440100, ',440000,440100,440114,');
+INSERT INTO `oa_city` VALUES (440115, '南沙区', 3, 440100, ',440000,440100,440115,');
+INSERT INTO `oa_city` VALUES (440183, '增城区', 3, 440100, ',440000,440100,440183,');
+INSERT INTO `oa_city` VALUES (440184, '从化区', 3, 440100, ',440000,440100,440184,');
+INSERT INTO `oa_city` VALUES (440200, '韶关市', 2, 440000, ',440000,440200,');
+INSERT INTO `oa_city` VALUES (440203, '武江区', 3, 440200, ',440000,440200,440203,');
+INSERT INTO `oa_city` VALUES (440204, '浈江区', 3, 440200, ',440000,440200,440204,');
+INSERT INTO `oa_city` VALUES (440205, '曲江区', 3, 440200, ',440000,440200,440205,');
+INSERT INTO `oa_city` VALUES (440222, '始兴县', 3, 440200, ',440000,440200,440222,');
+INSERT INTO `oa_city` VALUES (440224, '仁化县', 3, 440200, ',440000,440200,440224,');
+INSERT INTO `oa_city` VALUES (440229, '翁源县', 3, 440200, ',440000,440200,440229,');
+INSERT INTO `oa_city` VALUES (440232, '乳源瑶族自治县', 3, 440200, ',440000,440200,440232,');
+INSERT INTO `oa_city` VALUES (440233, '新丰县', 3, 440200, ',440000,440200,440233,');
+INSERT INTO `oa_city` VALUES (440281, '乐昌市', 3, 440200, ',440000,440200,440281,');
+INSERT INTO `oa_city` VALUES (440282, '南雄市', 3, 440200, ',440000,440200,440282,');
+INSERT INTO `oa_city` VALUES (440300, '深圳市', 2, 440000, ',440000,440300,');
+INSERT INTO `oa_city` VALUES (440303, '罗湖区', 3, 440300, ',440000,440300,440303,');
+INSERT INTO `oa_city` VALUES (440304, '福田区', 3, 440300, ',440000,440300,440304,');
+INSERT INTO `oa_city` VALUES (440305, '南山区', 3, 440300, ',440000,440300,440305,');
+INSERT INTO `oa_city` VALUES (440306, '宝安区', 3, 440300, ',440000,440300,440306,');
+INSERT INTO `oa_city` VALUES (440307, '龙岗区', 3, 440300, ',440000,440300,440307,');
+INSERT INTO `oa_city` VALUES (440308, '盐田区', 3, 440300, ',440000,440300,440308,');
+INSERT INTO `oa_city` VALUES (440400, '珠海市', 2, 440000, ',440000,440400,');
+INSERT INTO `oa_city` VALUES (440402, '香洲区', 3, 440400, ',440000,440400,440402,');
+INSERT INTO `oa_city` VALUES (440403, '斗门区', 3, 440400, ',440000,440400,440403,');
+INSERT INTO `oa_city` VALUES (440404, '金湾区', 3, 440400, ',440000,440400,440404,');
+INSERT INTO `oa_city` VALUES (440500, '汕头市', 2, 440000, ',440000,440500,');
+INSERT INTO `oa_city` VALUES (440507, '龙湖区', 3, 440500, ',440000,440500,440507,');
+INSERT INTO `oa_city` VALUES (440511, '金平区', 3, 440500, ',440000,440500,440511,');
+INSERT INTO `oa_city` VALUES (440512, '濠江区', 3, 440500, ',440000,440500,440512,');
+INSERT INTO `oa_city` VALUES (440513, '潮阳区', 3, 440500, ',440000,440500,440513,');
+INSERT INTO `oa_city` VALUES (440514, '潮南区', 3, 440500, ',440000,440500,440514,');
+INSERT INTO `oa_city` VALUES (440515, '澄海区', 3, 440500, ',440000,440500,440515,');
+INSERT INTO `oa_city` VALUES (440523, '南澳县', 3, 440500, ',440000,440500,440523,');
+INSERT INTO `oa_city` VALUES (440524, '直属局', 3, 440500, ',440000,440500,440524,');
+INSERT INTO `oa_city` VALUES (440525, '保税区', 3, 440500, ',440000,440500,440525,');
+INSERT INTO `oa_city` VALUES (440600, '佛山市', 2, 440000, ',440000,440600,');
+INSERT INTO `oa_city` VALUES (440604, '禅城区', 3, 440600, ',440000,440600,440604,');
+INSERT INTO `oa_city` VALUES (440605, '南海区', 3, 440600, ',440000,440600,440605,');
+INSERT INTO `oa_city` VALUES (440606, '顺德区', 3, 440600, ',440000,440600,440606,');
+INSERT INTO `oa_city` VALUES (440607, '三水区', 3, 440600, ',440000,440600,440607,');
+INSERT INTO `oa_city` VALUES (440608, '高明区', 3, 440600, ',440000,440600,440608,');
+INSERT INTO `oa_city` VALUES (440700, '江门市', 2, 440000, ',440000,440700,');
+INSERT INTO `oa_city` VALUES (440703, '蓬江区', 3, 440700, ',440000,440700,440703,');
+INSERT INTO `oa_city` VALUES (440704, '江海区', 3, 440700, ',440000,440700,440704,');
+INSERT INTO `oa_city` VALUES (440705, '新会区', 3, 440700, ',440000,440700,440705,');
+INSERT INTO `oa_city` VALUES (440781, '台山市', 3, 440700, ',440000,440700,440781,');
+INSERT INTO `oa_city` VALUES (440783, '开平市', 3, 440700, ',440000,440700,440783,');
+INSERT INTO `oa_city` VALUES (440784, '鹤山市', 3, 440700, ',440000,440700,440784,');
+INSERT INTO `oa_city` VALUES (440785, '恩平市', 3, 440700, ',440000,440700,440785,');
+INSERT INTO `oa_city` VALUES (440800, '湛江市', 2, 440000, ',440000,440800,');
+INSERT INTO `oa_city` VALUES (440802, '赤坎区', 3, 440800, ',440000,440800,440802,');
+INSERT INTO `oa_city` VALUES (440803, '霞山区', 3, 440800, ',440000,440800,440803,');
+INSERT INTO `oa_city` VALUES (440804, '坡头区', 3, 440800, ',440000,440800,440804,');
+INSERT INTO `oa_city` VALUES (440811, '麻章区', 3, 440800, ',440000,440800,440811,');
+INSERT INTO `oa_city` VALUES (440823, '遂溪县', 3, 440800, ',440000,440800,440823,');
+INSERT INTO `oa_city` VALUES (440825, '徐闻县', 3, 440800, ',440000,440800,440825,');
+INSERT INTO `oa_city` VALUES (440881, '廉江市', 3, 440800, ',440000,440800,440881,');
+INSERT INTO `oa_city` VALUES (440882, '雷州市', 3, 440800, ',440000,440800,440882,');
+INSERT INTO `oa_city` VALUES (440883, '吴川市', 3, 440800, ',440000,440800,440883,');
+INSERT INTO `oa_city` VALUES (440900, '茂名市', 2, 440000, ',440000,440900,');
+INSERT INTO `oa_city` VALUES (440902, '茂南区', 3, 440900, ',440000,440900,440902,');
+INSERT INTO `oa_city` VALUES (440903, '茂港区', 3, 440900, ',440000,440900,440903,');
+INSERT INTO `oa_city` VALUES (440923, '电白县', 3, 440900, ',440000,440900,440923,');
+INSERT INTO `oa_city` VALUES (440981, '高州市', 3, 440900, ',440000,440900,440981,');
+INSERT INTO `oa_city` VALUES (440982, '化州市', 3, 440900, ',440000,440900,440982,');
+INSERT INTO `oa_city` VALUES (440983, '信宜市', 3, 440900, ',440000,440900,440983,');
+INSERT INTO `oa_city` VALUES (441200, '肇庆市', 2, 440000, ',440000,441200,');
+INSERT INTO `oa_city` VALUES (441202, '端州区', 3, 441200, ',440000,441200,441202,');
+INSERT INTO `oa_city` VALUES (441203, '鼎湖区', 3, 441200, ',440000,441200,441203,');
+INSERT INTO `oa_city` VALUES (441223, '广宁县', 3, 441200, ',440000,441200,441223,');
+INSERT INTO `oa_city` VALUES (441224, '怀集县', 3, 441200, ',440000,441200,441224,');
+INSERT INTO `oa_city` VALUES (441225, '封开县', 3, 441200, ',440000,441200,441225,');
+INSERT INTO `oa_city` VALUES (441226, '德庆县', 3, 441200, ',440000,441200,441226,');
+INSERT INTO `oa_city` VALUES (441283, '高要区', 3, 441200, ',440000,441200,441283,');
+INSERT INTO `oa_city` VALUES (441284, '四会市', 3, 441200, ',440000,441200,441284,');
+INSERT INTO `oa_city` VALUES (441300, '惠州市', 2, 440000, ',440000,441300,');
+INSERT INTO `oa_city` VALUES (441302, '惠城区', 3, 441300, ',440000,441300,441302,');
+INSERT INTO `oa_city` VALUES (441303, '惠阳区', 3, 441300, ',440000,441300,441303,');
+INSERT INTO `oa_city` VALUES (441322, '博罗县', 3, 441300, ',440000,441300,441322,');
+INSERT INTO `oa_city` VALUES (441323, '惠东县', 3, 441300, ',440000,441300,441323,');
+INSERT INTO `oa_city` VALUES (441324, '龙门县', 3, 441300, ',440000,441300,441324,');
+INSERT INTO `oa_city` VALUES (441400, '梅州市', 2, 440000, ',440000,441400,');
+INSERT INTO `oa_city` VALUES (441402, '梅江区', 3, 441400, ',440000,441400,441402,');
+INSERT INTO `oa_city` VALUES (441421, '梅　县', 3, 441400, ',440000,441400,441421,');
+INSERT INTO `oa_city` VALUES (441422, '大埔县', 3, 441400, ',440000,441400,441422,');
+INSERT INTO `oa_city` VALUES (441423, '丰顺县', 3, 441400, ',440000,441400,441423,');
+INSERT INTO `oa_city` VALUES (441424, '五华县', 3, 441400, ',440000,441400,441424,');
+INSERT INTO `oa_city` VALUES (441426, '平远县', 3, 441400, ',440000,441400,441426,');
+INSERT INTO `oa_city` VALUES (441427, '蕉岭县', 3, 441400, ',440000,441400,441427,');
+INSERT INTO `oa_city` VALUES (441481, '兴宁市', 3, 441400, ',440000,441400,441481,');
+INSERT INTO `oa_city` VALUES (441500, '汕尾市', 2, 440000, ',440000,441500,');
+INSERT INTO `oa_city` VALUES (441502, '城　区', 3, 441500, ',440000,441500,441502,');
+INSERT INTO `oa_city` VALUES (441521, '海丰县', 3, 441500, ',440000,441500,441521,');
+INSERT INTO `oa_city` VALUES (441523, '陆河县', 3, 441500, ',440000,441500,441523,');
+INSERT INTO `oa_city` VALUES (441581, '陆丰市', 3, 441500, ',440000,441500,441581,');
+INSERT INTO `oa_city` VALUES (441600, '河源市', 2, 440000, ',440000,441600,');
+INSERT INTO `oa_city` VALUES (441602, '源城区', 3, 441600, ',440000,441600,441602,');
+INSERT INTO `oa_city` VALUES (441621, '紫金县', 3, 441600, ',440000,441600,441621,');
+INSERT INTO `oa_city` VALUES (441622, '龙川县', 3, 441600, ',440000,441600,441622,');
+INSERT INTO `oa_city` VALUES (441623, '连平县', 3, 441600, ',440000,441600,441623,');
+INSERT INTO `oa_city` VALUES (441624, '和平县', 3, 441600, ',440000,441600,441624,');
+INSERT INTO `oa_city` VALUES (441625, '东源县', 3, 441600, ',440000,441600,441625,');
+INSERT INTO `oa_city` VALUES (441700, '阳江市', 2, 440000, ',440000,441700,');
+INSERT INTO `oa_city` VALUES (441702, '江城区', 3, 441700, ',440000,441700,441702,');
+INSERT INTO `oa_city` VALUES (441721, '阳西县', 3, 441700, ',440000,441700,441721,');
+INSERT INTO `oa_city` VALUES (441723, '阳东县', 3, 441700, ',440000,441700,441723,');
+INSERT INTO `oa_city` VALUES (441781, '阳春市', 3, 441700, ',440000,441700,441781,');
+INSERT INTO `oa_city` VALUES (441800, '清远市', 2, 440000, ',440000,441800,');
+INSERT INTO `oa_city` VALUES (441802, '清城区', 3, 441800, ',440000,441800,441802,');
+INSERT INTO `oa_city` VALUES (441821, '佛冈县', 3, 441800, ',440000,441800,441821,');
+INSERT INTO `oa_city` VALUES (441823, '阳山县', 3, 441800, ',440000,441800,441823,');
+INSERT INTO `oa_city` VALUES (441825, '连山壮族瑶族自治县', 3, 441800, ',440000,441800,441825,');
+INSERT INTO `oa_city` VALUES (441826, '连南瑶族自治县', 3, 441800, ',440000,441800,441826,');
+INSERT INTO `oa_city` VALUES (441827, '清新县', 3, 441800, ',440000,441800,441827,');
+INSERT INTO `oa_city` VALUES (441881, '英德市', 3, 441800, ',440000,441800,441881,');
+INSERT INTO `oa_city` VALUES (441882, '连州市', 3, 441800, ',440000,441800,441882,');
+INSERT INTO `oa_city` VALUES (441900, '东莞市', 2, 440000, ',440000,441900,');
+INSERT INTO `oa_city` VALUES (442000, '中山市', 2, 440000, ',440000,442000,');
+INSERT INTO `oa_city` VALUES (445100, '潮州市', 2, 440000, ',440000,445100,');
+INSERT INTO `oa_city` VALUES (445102, '湘桥区', 3, 445100, ',440000,445100,445102,');
+INSERT INTO `oa_city` VALUES (445121, '潮安县', 3, 445100, ',440000,445100,445121,');
+INSERT INTO `oa_city` VALUES (445122, '饶平县', 3, 445100, ',440000,445100,445122,');
+INSERT INTO `oa_city` VALUES (445200, '揭阳市', 2, 440000, ',440000,445200,');
+INSERT INTO `oa_city` VALUES (445202, '榕城区', 3, 445200, ',440000,445200,445202,');
+INSERT INTO `oa_city` VALUES (445221, '揭东县', 3, 445200, ',440000,445200,445221,');
+INSERT INTO `oa_city` VALUES (445222, '揭西县', 3, 445200, ',440000,445200,445222,');
+INSERT INTO `oa_city` VALUES (445224, '惠来县', 3, 445200, ',440000,445200,445224,');
+INSERT INTO `oa_city` VALUES (445281, '普宁市', 3, 445200, ',440000,445200,445281,');
+INSERT INTO `oa_city` VALUES (445300, '云浮市', 2, 440000, ',440000,445300,');
+INSERT INTO `oa_city` VALUES (445302, '云城区', 3, 445300, ',440000,445300,445302,');
+INSERT INTO `oa_city` VALUES (445321, '新兴县', 3, 445300, ',440000,445300,445321,');
+INSERT INTO `oa_city` VALUES (445322, '郁南县', 3, 445300, ',440000,445300,445322,');
+INSERT INTO `oa_city` VALUES (445323, '云安县', 3, 445300, ',440000,445300,445323,');
+INSERT INTO `oa_city` VALUES (445381, '罗定市', 3, 445300, ',440000,445300,445381,');
+INSERT INTO `oa_city` VALUES (450000, '广西省', 1, 0, ',450000,');
+INSERT INTO `oa_city` VALUES (450100, '南宁市', 2, 450000, ',450000,450100,');
+INSERT INTO `oa_city` VALUES (450102, '兴宁区', 3, 450100, ',450000,450100,450102,');
+INSERT INTO `oa_city` VALUES (450103, '青秀区', 3, 450100, ',450000,450100,450103,');
+INSERT INTO `oa_city` VALUES (450105, '江南区', 3, 450100, ',450000,450100,450105,');
+INSERT INTO `oa_city` VALUES (450107, '西乡塘区', 3, 450100, ',450000,450100,450107,');
+INSERT INTO `oa_city` VALUES (450108, '良庆区', 3, 450100, ',450000,450100,450108,');
+INSERT INTO `oa_city` VALUES (450109, '邕宁区', 3, 450100, ',450000,450100,450109,');
+INSERT INTO `oa_city` VALUES (450122, '武鸣县', 3, 450100, ',450000,450100,450122,');
+INSERT INTO `oa_city` VALUES (450123, '隆安县', 3, 450100, ',450000,450100,450123,');
+INSERT INTO `oa_city` VALUES (450124, '马山县', 3, 450100, ',450000,450100,450124,');
+INSERT INTO `oa_city` VALUES (450125, '上林县', 3, 450100, ',450000,450100,450125,');
+INSERT INTO `oa_city` VALUES (450126, '宾阳县', 3, 450100, ',450000,450100,450126,');
+INSERT INTO `oa_city` VALUES (450127, '横　县', 3, 450100, ',450000,450100,450127,');
+INSERT INTO `oa_city` VALUES (450200, '柳州市', 2, 450000, ',450000,450200,');
+INSERT INTO `oa_city` VALUES (450202, '城中区', 3, 450200, ',450000,450200,450202,');
+INSERT INTO `oa_city` VALUES (450203, '鱼峰区', 3, 450200, ',450000,450200,450203,');
+INSERT INTO `oa_city` VALUES (450204, '柳南区', 3, 450200, ',450000,450200,450204,');
+INSERT INTO `oa_city` VALUES (450205, '柳北区', 3, 450200, ',450000,450200,450205,');
+INSERT INTO `oa_city` VALUES (450221, '柳江县', 3, 450200, ',450000,450200,450221,');
+INSERT INTO `oa_city` VALUES (450222, '柳城县', 3, 450200, ',450000,450200,450222,');
+INSERT INTO `oa_city` VALUES (450223, '鹿寨县', 3, 450200, ',450000,450200,450223,');
+INSERT INTO `oa_city` VALUES (450224, '融安县', 3, 450200, ',450000,450200,450224,');
+INSERT INTO `oa_city` VALUES (450225, '融水苗族自治县', 3, 450200, ',450000,450200,450225,');
+INSERT INTO `oa_city` VALUES (450226, '三江侗族自治县', 3, 450200, ',450000,450200,450226,');
+INSERT INTO `oa_city` VALUES (450300, '桂林市', 2, 450000, ',450000,450300,');
+INSERT INTO `oa_city` VALUES (450302, '秀峰区', 3, 450300, ',450000,450300,450302,');
+INSERT INTO `oa_city` VALUES (450303, '叠彩区', 3, 450300, ',450000,450300,450303,');
+INSERT INTO `oa_city` VALUES (450304, '象山区', 3, 450300, ',450000,450300,450304,');
+INSERT INTO `oa_city` VALUES (450305, '七星区', 3, 450300, ',450000,450300,450305,');
+INSERT INTO `oa_city` VALUES (450311, '雁山区', 3, 450300, ',450000,450300,450311,');
+INSERT INTO `oa_city` VALUES (450321, '阳朔县', 3, 450300, ',450000,450300,450321,');
+INSERT INTO `oa_city` VALUES (450322, '临桂县', 3, 450300, ',450000,450300,450322,');
+INSERT INTO `oa_city` VALUES (450323, '灵川县', 3, 450300, ',450000,450300,450323,');
+INSERT INTO `oa_city` VALUES (450324, '全州县', 3, 450300, ',450000,450300,450324,');
+INSERT INTO `oa_city` VALUES (450325, '兴安县', 3, 450300, ',450000,450300,450325,');
+INSERT INTO `oa_city` VALUES (450326, '永福县', 3, 450300, ',450000,450300,450326,');
+INSERT INTO `oa_city` VALUES (450327, '灌阳县', 3, 450300, ',450000,450300,450327,');
+INSERT INTO `oa_city` VALUES (450328, '龙胜各族自治县', 3, 450300, ',450000,450300,450328,');
+INSERT INTO `oa_city` VALUES (450329, '资源县', 3, 450300, ',450000,450300,450329,');
+INSERT INTO `oa_city` VALUES (450330, '平乐县', 3, 450300, ',450000,450300,450330,');
+INSERT INTO `oa_city` VALUES (450331, '荔蒲县', 3, 450300, ',450000,450300,450331,');
+INSERT INTO `oa_city` VALUES (450332, '恭城瑶族自治县', 3, 450300, ',450000,450300,450332,');
+INSERT INTO `oa_city` VALUES (450400, '梧州市', 2, 450000, ',450000,450400,');
+INSERT INTO `oa_city` VALUES (450403, '万秀区', 3, 450400, ',450000,450400,450403,');
+INSERT INTO `oa_city` VALUES (450404, '蝶山区', 3, 450400, ',450000,450400,450404,');
+INSERT INTO `oa_city` VALUES (450405, '长洲区', 3, 450400, ',450000,450400,450405,');
+INSERT INTO `oa_city` VALUES (450421, '苍梧县', 3, 450400, ',450000,450400,450421,');
+INSERT INTO `oa_city` VALUES (450422, '藤　县', 3, 450400, ',450000,450400,450422,');
+INSERT INTO `oa_city` VALUES (450423, '蒙山县', 3, 450400, ',450000,450400,450423,');
+INSERT INTO `oa_city` VALUES (450481, '岑溪市', 3, 450400, ',450000,450400,450481,');
+INSERT INTO `oa_city` VALUES (450500, '北海市', 2, 450000, ',450000,450500,');
+INSERT INTO `oa_city` VALUES (450502, '海城区', 3, 450500, ',450000,450500,450502,');
+INSERT INTO `oa_city` VALUES (450503, '银海区', 3, 450500, ',450000,450500,450503,');
+INSERT INTO `oa_city` VALUES (450512, '铁山港区', 3, 450500, ',450000,450500,450512,');
+INSERT INTO `oa_city` VALUES (450521, '合浦县', 3, 450500, ',450000,450500,450521,');
+INSERT INTO `oa_city` VALUES (450600, '防城港市', 2, 450000, ',450000,450600,');
+INSERT INTO `oa_city` VALUES (450602, '港口区', 3, 450600, ',450000,450600,450602,');
+INSERT INTO `oa_city` VALUES (450603, '防城区', 3, 450600, ',450000,450600,450603,');
+INSERT INTO `oa_city` VALUES (450621, '上思县', 3, 450600, ',450000,450600,450621,');
+INSERT INTO `oa_city` VALUES (450681, '东兴市', 3, 450600, ',450000,450600,450681,');
+INSERT INTO `oa_city` VALUES (450700, '钦州市', 2, 450000, ',450000,450700,');
+INSERT INTO `oa_city` VALUES (450702, '钦南区', 3, 450700, ',450000,450700,450702,');
+INSERT INTO `oa_city` VALUES (450703, '钦北区', 3, 450700, ',450000,450700,450703,');
+INSERT INTO `oa_city` VALUES (450721, '灵山县', 3, 450700, ',450000,450700,450721,');
+INSERT INTO `oa_city` VALUES (450722, '浦北县', 3, 450700, ',450000,450700,450722,');
+INSERT INTO `oa_city` VALUES (450800, '贵港市', 2, 450000, ',450000,450800,');
+INSERT INTO `oa_city` VALUES (450802, '港北区', 3, 450800, ',450000,450800,450802,');
+INSERT INTO `oa_city` VALUES (450803, '港南区', 3, 450800, ',450000,450800,450803,');
+INSERT INTO `oa_city` VALUES (450804, '覃塘区', 3, 450800, ',450000,450800,450804,');
+INSERT INTO `oa_city` VALUES (450821, '平南县', 3, 450800, ',450000,450800,450821,');
+INSERT INTO `oa_city` VALUES (450881, '桂平市', 3, 450800, ',450000,450800,450881,');
+INSERT INTO `oa_city` VALUES (450900, '玉林市', 2, 450000, ',450000,450900,');
+INSERT INTO `oa_city` VALUES (450902, '玉州区', 3, 450900, ',450000,450900,450902,');
+INSERT INTO `oa_city` VALUES (450921, '容　县', 3, 450900, ',450000,450900,450921,');
+INSERT INTO `oa_city` VALUES (450922, '陆川县', 3, 450900, ',450000,450900,450922,');
+INSERT INTO `oa_city` VALUES (450923, '博白县', 3, 450900, ',450000,450900,450923,');
+INSERT INTO `oa_city` VALUES (450924, '兴业县', 3, 450900, ',450000,450900,450924,');
+INSERT INTO `oa_city` VALUES (450981, '北流市', 3, 450900, ',450000,450900,450981,');
+INSERT INTO `oa_city` VALUES (451000, '百色市', 2, 450000, ',450000,451000,');
+INSERT INTO `oa_city` VALUES (451002, '右江区', 3, 451000, ',450000,451000,451002,');
+INSERT INTO `oa_city` VALUES (451021, '田阳县', 3, 451000, ',450000,451000,451021,');
+INSERT INTO `oa_city` VALUES (451022, '田东县', 3, 451000, ',450000,451000,451022,');
+INSERT INTO `oa_city` VALUES (451023, '平果县', 3, 451000, ',450000,451000,451023,');
+INSERT INTO `oa_city` VALUES (451024, '德保县', 3, 451000, ',450000,451000,451024,');
+INSERT INTO `oa_city` VALUES (451025, '靖西县', 3, 451000, ',450000,451000,451025,');
+INSERT INTO `oa_city` VALUES (451026, '那坡县', 3, 451000, ',450000,451000,451026,');
+INSERT INTO `oa_city` VALUES (451027, '凌云县', 3, 451000, ',450000,451000,451027,');
+INSERT INTO `oa_city` VALUES (451028, '乐业县', 3, 451000, ',450000,451000,451028,');
+INSERT INTO `oa_city` VALUES (451029, '田林县', 3, 451000, ',450000,451000,451029,');
+INSERT INTO `oa_city` VALUES (451030, '西林县', 3, 451000, ',450000,451000,451030,');
+INSERT INTO `oa_city` VALUES (451031, '隆林各族自治县', 3, 451000, ',450000,451000,451031,');
+INSERT INTO `oa_city` VALUES (451100, '贺州市', 2, 450000, ',450000,451100,');
+INSERT INTO `oa_city` VALUES (451102, '八步区', 3, 451100, ',450000,451100,451102,');
+INSERT INTO `oa_city` VALUES (451121, '昭平县', 3, 451100, ',450000,451100,451121,');
+INSERT INTO `oa_city` VALUES (451122, '钟山县', 3, 451100, ',450000,451100,451122,');
+INSERT INTO `oa_city` VALUES (451123, '富川瑶族自治县', 3, 451100, ',450000,451100,451123,');
+INSERT INTO `oa_city` VALUES (451200, '河池市', 2, 450000, ',450000,451200,');
+INSERT INTO `oa_city` VALUES (451202, '金城江区', 3, 451200, ',450000,451200,451202,');
+INSERT INTO `oa_city` VALUES (451221, '南丹县', 3, 451200, ',450000,451200,451221,');
+INSERT INTO `oa_city` VALUES (451222, '天峨县', 3, 451200, ',450000,451200,451222,');
+INSERT INTO `oa_city` VALUES (451223, '凤山县', 3, 451200, ',450000,451200,451223,');
+INSERT INTO `oa_city` VALUES (451224, '东兰县', 3, 451200, ',450000,451200,451224,');
+INSERT INTO `oa_city` VALUES (451225, '罗城仫佬族自治县', 3, 451200, ',450000,451200,451225,');
+INSERT INTO `oa_city` VALUES (451226, '环江毛南族自治县', 3, 451200, ',450000,451200,451226,');
+INSERT INTO `oa_city` VALUES (451227, '巴马瑶族自治县', 3, 451200, ',450000,451200,451227,');
+INSERT INTO `oa_city` VALUES (451228, '都安瑶族自治县', 3, 451200, ',450000,451200,451228,');
+INSERT INTO `oa_city` VALUES (451229, '大化瑶族自治县', 3, 451200, ',450000,451200,451229,');
+INSERT INTO `oa_city` VALUES (451281, '宜州市', 3, 451200, ',450000,451200,451281,');
+INSERT INTO `oa_city` VALUES (451300, '来宾市', 2, 450000, ',450000,451300,');
+INSERT INTO `oa_city` VALUES (451302, '兴宾区', 3, 451300, ',450000,451300,451302,');
+INSERT INTO `oa_city` VALUES (451321, '忻城县', 3, 451300, ',450000,451300,451321,');
+INSERT INTO `oa_city` VALUES (451322, '象州县', 3, 451300, ',450000,451300,451322,');
+INSERT INTO `oa_city` VALUES (451323, '武宣县', 3, 451300, ',450000,451300,451323,');
+INSERT INTO `oa_city` VALUES (451324, '金秀瑶族自治县', 3, 451300, ',450000,451300,451324,');
+INSERT INTO `oa_city` VALUES (451381, '合山市', 3, 451300, ',450000,451300,451381,');
+INSERT INTO `oa_city` VALUES (451400, '崇左市', 2, 450000, ',450000,451400,');
+INSERT INTO `oa_city` VALUES (451402, '江洲区', 3, 451400, ',450000,451400,451402,');
+INSERT INTO `oa_city` VALUES (451421, '扶绥县', 3, 451400, ',450000,451400,451421,');
+INSERT INTO `oa_city` VALUES (451422, '宁明县', 3, 451400, ',450000,451400,451422,');
+INSERT INTO `oa_city` VALUES (451423, '龙州县', 3, 451400, ',450000,451400,451423,');
+INSERT INTO `oa_city` VALUES (451424, '大新县', 3, 451400, ',450000,451400,451424,');
+INSERT INTO `oa_city` VALUES (451425, '天等县', 3, 451400, ',450000,451400,451425,');
+INSERT INTO `oa_city` VALUES (451481, '凭祥市', 3, 451400, ',450000,451400,451481,');
+INSERT INTO `oa_city` VALUES (460000, '海南省', 1, 0, ',460000,');
+INSERT INTO `oa_city` VALUES (460100, '海口市', 2, 460000, ',460000,460100,');
+INSERT INTO `oa_city` VALUES (460105, '秀英区', 3, 460100, ',460000,460100,460105,');
+INSERT INTO `oa_city` VALUES (460106, '龙华区', 3, 460100, ',460000,460100,460106,');
+INSERT INTO `oa_city` VALUES (460107, '琼山区', 3, 460100, ',460000,460100,460107,');
+INSERT INTO `oa_city` VALUES (460108, '美兰区', 3, 460100, ',460000,460100,460108,');
+INSERT INTO `oa_city` VALUES (460200, '三亚市', 2, 460000, ',460000,460200,');
+INSERT INTO `oa_city` VALUES (460300, '三沙市', 2, 460000, ',460000,460300,');
+INSERT INTO `oa_city` VALUES (469001, '五指山市', 2, 460000, ',460000,469001,');
+INSERT INTO `oa_city` VALUES (469002, '琼海市', 2, 460000, ',460000,469002,');
+INSERT INTO `oa_city` VALUES (469003, '儋州市', 2, 460000, ',460000,469003,');
+INSERT INTO `oa_city` VALUES (469005, '文昌市', 2, 460000, ',460000,469005,');
+INSERT INTO `oa_city` VALUES (469006, '万宁市', 2, 460000, ',460000,469006,');
+INSERT INTO `oa_city` VALUES (469007, '东方市', 2, 460000, ',460000,469007,');
+INSERT INTO `oa_city` VALUES (469025, '定安县', 2, 460000, ',460000,469025,');
+INSERT INTO `oa_city` VALUES (469026, '屯昌县', 2, 460000, ',460000,469026,');
+INSERT INTO `oa_city` VALUES (469027, '澄迈县', 2, 460000, ',460000,469027,');
+INSERT INTO `oa_city` VALUES (469028, '临高县', 2, 460000, ',460000,469028,');
+INSERT INTO `oa_city` VALUES (469030, '白沙黎族自治县', 2, 460000, ',460000,469030,');
+INSERT INTO `oa_city` VALUES (469031, '昌江黎族自治县', 2, 460000, ',460000,469031,');
+INSERT INTO `oa_city` VALUES (469033, '乐东黎族自治县', 2, 460000, ',460000,469033,');
+INSERT INTO `oa_city` VALUES (469034, '陵水黎族自治县', 2, 460000, ',460000,469034,');
+INSERT INTO `oa_city` VALUES (469035, '保亭黎族苗族自治县', 2, 460000, ',460000,469035,');
+INSERT INTO `oa_city` VALUES (469036, '琼中黎族苗族自治县', 2, 460000, ',460000,469036,');
+INSERT INTO `oa_city` VALUES (469037, '西沙群岛', 2, 460000, ',460000,469037,');
+INSERT INTO `oa_city` VALUES (469038, '南沙群岛', 2, 460000, ',460000,469038,');
+INSERT INTO `oa_city` VALUES (469039, '中沙群岛的岛礁及其海域', 2, 460000, ',460000,469039,');
+INSERT INTO `oa_city` VALUES (500000, '重庆市', 1, 0, ',500000,');
+INSERT INTO `oa_city` VALUES (500101, '万州区', 2, 500000, ',500000,500101,');
+INSERT INTO `oa_city` VALUES (500102, '涪陵区', 2, 500000, ',500000,500102,');
+INSERT INTO `oa_city` VALUES (500103, '渝中区', 2, 500000, ',500000,500103,');
+INSERT INTO `oa_city` VALUES (500104, '大渡口区', 2, 500000, ',500000,500104,');
+INSERT INTO `oa_city` VALUES (500105, '江北区', 2, 500000, ',500000,500105,');
+INSERT INTO `oa_city` VALUES (500106, '沙坪坝区', 2, 500000, ',500000,500106,');
+INSERT INTO `oa_city` VALUES (500107, '九龙坡区', 2, 500000, ',500000,500107,');
+INSERT INTO `oa_city` VALUES (500108, '南岸区', 2, 500000, ',500000,500108,');
+INSERT INTO `oa_city` VALUES (500109, '北碚区', 2, 500000, ',500000,500109,');
+INSERT INTO `oa_city` VALUES (500110, '万盛区', 2, 500000, ',500000,500110,');
+INSERT INTO `oa_city` VALUES (500111, '双桥区', 2, 500000, ',500000,500111,');
+INSERT INTO `oa_city` VALUES (500112, '渝北区', 2, 500000, ',500000,500112,');
+INSERT INTO `oa_city` VALUES (500113, '巴南区', 2, 500000, ',500000,500113,');
+INSERT INTO `oa_city` VALUES (500114, '黔江区', 2, 500000, ',500000,500114,');
+INSERT INTO `oa_city` VALUES (500115, '长寿区', 2, 500000, ',500000,500115,');
+INSERT INTO `oa_city` VALUES (500222, '綦江县', 2, 500000, ',500000,500222,');
+INSERT INTO `oa_city` VALUES (500223, '潼南县', 2, 500000, ',500000,500223,');
+INSERT INTO `oa_city` VALUES (500224, '铜梁县', 2, 500000, ',500000,500224,');
+INSERT INTO `oa_city` VALUES (500225, '大足县', 2, 500000, ',500000,500225,');
+INSERT INTO `oa_city` VALUES (500226, '荣昌县', 2, 500000, ',500000,500226,');
+INSERT INTO `oa_city` VALUES (500227, '璧山县', 2, 500000, ',500000,500227,');
+INSERT INTO `oa_city` VALUES (500228, '梁平县', 2, 500000, ',500000,500228,');
+INSERT INTO `oa_city` VALUES (500229, '城口县', 2, 500000, ',500000,500229,');
+INSERT INTO `oa_city` VALUES (500230, '丰都县', 2, 500000, ',500000,500230,');
+INSERT INTO `oa_city` VALUES (500231, '垫江县', 2, 500000, ',500000,500231,');
+INSERT INTO `oa_city` VALUES (500232, '武隆县', 2, 500000, ',500000,500232,');
+INSERT INTO `oa_city` VALUES (500233, '忠　县', 2, 500000, ',500000,500233,');
+INSERT INTO `oa_city` VALUES (500234, '开　县', 2, 500000, ',500000,500234,');
+INSERT INTO `oa_city` VALUES (500235, '云阳县', 2, 500000, ',500000,500235,');
+INSERT INTO `oa_city` VALUES (500236, '奉节县', 2, 500000, ',500000,500236,');
+INSERT INTO `oa_city` VALUES (500237, '巫山县', 2, 500000, ',500000,500237,');
+INSERT INTO `oa_city` VALUES (500238, '巫溪县', 2, 500000, ',500000,500238,');
+INSERT INTO `oa_city` VALUES (500240, '石柱土家族自治县', 2, 500000, ',500000,500240,');
+INSERT INTO `oa_city` VALUES (500241, '秀山土家族苗族自治县', 2, 500000, ',500000,500241,');
+INSERT INTO `oa_city` VALUES (500242, '酉阳土家族苗族自治县', 2, 500000, ',500000,500242,');
+INSERT INTO `oa_city` VALUES (500243, '彭水苗族土家族自治县', 2, 500000, ',500000,500243,');
+INSERT INTO `oa_city` VALUES (500381, '江津市', 2, 500000, ',500000,500381,');
+INSERT INTO `oa_city` VALUES (500382, '合川市', 2, 500000, ',500000,500382,');
+INSERT INTO `oa_city` VALUES (500383, '永川市', 2, 500000, ',500000,500383,');
+INSERT INTO `oa_city` VALUES (500384, '南川市', 2, 500000, ',500000,500384,');
+INSERT INTO `oa_city` VALUES (510000, '四川省', 1, 0, ',510000,');
+INSERT INTO `oa_city` VALUES (510100, '成都市', 2, 510000, ',510000,510100,');
+INSERT INTO `oa_city` VALUES (510104, '锦江区', 3, 510100, ',510000,510100,510104,');
+INSERT INTO `oa_city` VALUES (510105, '青羊区', 3, 510100, ',510000,510100,510105,');
+INSERT INTO `oa_city` VALUES (510106, '金牛区', 3, 510100, ',510000,510100,510106,');
+INSERT INTO `oa_city` VALUES (510107, '武侯区', 3, 510100, ',510000,510100,510107,');
+INSERT INTO `oa_city` VALUES (510108, '成华区', 3, 510100, ',510000,510100,510108,');
+INSERT INTO `oa_city` VALUES (510112, '龙泉驿区', 3, 510100, ',510000,510100,510112,');
+INSERT INTO `oa_city` VALUES (510113, '青白江区', 3, 510100, ',510000,510100,510113,');
+INSERT INTO `oa_city` VALUES (510114, '新都区', 3, 510100, ',510000,510100,510114,');
+INSERT INTO `oa_city` VALUES (510115, '温江区', 3, 510100, ',510000,510100,510115,');
+INSERT INTO `oa_city` VALUES (510121, '金堂县', 3, 510100, ',510000,510100,510121,');
+INSERT INTO `oa_city` VALUES (510122, '双流县', 3, 510100, ',510000,510100,510122,');
+INSERT INTO `oa_city` VALUES (510124, '郫　县', 3, 510100, ',510000,510100,510124,');
+INSERT INTO `oa_city` VALUES (510129, '大邑县', 3, 510100, ',510000,510100,510129,');
+INSERT INTO `oa_city` VALUES (510131, '蒲江县', 3, 510100, ',510000,510100,510131,');
+INSERT INTO `oa_city` VALUES (510132, '新津县', 3, 510100, ',510000,510100,510132,');
+INSERT INTO `oa_city` VALUES (510181, '都江堰市', 3, 510100, ',510000,510100,510181,');
+INSERT INTO `oa_city` VALUES (510182, '彭州市', 3, 510100, ',510000,510100,510182,');
+INSERT INTO `oa_city` VALUES (510183, '邛崃市', 3, 510100, ',510000,510100,510183,');
+INSERT INTO `oa_city` VALUES (510184, '崇州市', 3, 510100, ',510000,510100,510184,');
+INSERT INTO `oa_city` VALUES (510300, '自贡市', 2, 510000, ',510000,510300,');
+INSERT INTO `oa_city` VALUES (510302, '自流井区', 3, 510300, ',510000,510300,510302,');
+INSERT INTO `oa_city` VALUES (510303, '贡井区', 3, 510300, ',510000,510300,510303,');
+INSERT INTO `oa_city` VALUES (510304, '大安区', 3, 510300, ',510000,510300,510304,');
+INSERT INTO `oa_city` VALUES (510311, '沿滩区', 3, 510300, ',510000,510300,510311,');
+INSERT INTO `oa_city` VALUES (510321, '荣　县', 3, 510300, ',510000,510300,510321,');
+INSERT INTO `oa_city` VALUES (510322, '富顺县', 3, 510300, ',510000,510300,510322,');
+INSERT INTO `oa_city` VALUES (510400, '攀枝花市', 2, 510000, ',510000,510400,');
+INSERT INTO `oa_city` VALUES (510402, '东　区', 3, 510400, ',510000,510400,510402,');
+INSERT INTO `oa_city` VALUES (510403, '西　区', 3, 510400, ',510000,510400,510403,');
+INSERT INTO `oa_city` VALUES (510411, '仁和区', 3, 510400, ',510000,510400,510411,');
+INSERT INTO `oa_city` VALUES (510421, '米易县', 3, 510400, ',510000,510400,510421,');
+INSERT INTO `oa_city` VALUES (510422, '盐边县', 3, 510400, ',510000,510400,510422,');
+INSERT INTO `oa_city` VALUES (510500, '泸州市', 2, 510000, ',510000,510500,');
+INSERT INTO `oa_city` VALUES (510502, '江阳区', 3, 510500, ',510000,510500,510502,');
+INSERT INTO `oa_city` VALUES (510503, '纳溪区', 3, 510500, ',510000,510500,510503,');
+INSERT INTO `oa_city` VALUES (510504, '龙马潭区', 3, 510500, ',510000,510500,510504,');
+INSERT INTO `oa_city` VALUES (510521, '泸　县', 3, 510500, ',510000,510500,510521,');
+INSERT INTO `oa_city` VALUES (510522, '合江县', 3, 510500, ',510000,510500,510522,');
+INSERT INTO `oa_city` VALUES (510524, '叙永县', 3, 510500, ',510000,510500,510524,');
+INSERT INTO `oa_city` VALUES (510525, '古蔺县', 3, 510500, ',510000,510500,510525,');
+INSERT INTO `oa_city` VALUES (510600, '德阳市', 2, 510000, ',510000,510600,');
+INSERT INTO `oa_city` VALUES (510603, '旌阳区', 3, 510600, ',510000,510600,510603,');
+INSERT INTO `oa_city` VALUES (510623, '中江县', 3, 510600, ',510000,510600,510623,');
+INSERT INTO `oa_city` VALUES (510626, '罗江县', 3, 510600, ',510000,510600,510626,');
+INSERT INTO `oa_city` VALUES (510681, '广汉市', 3, 510600, ',510000,510600,510681,');
+INSERT INTO `oa_city` VALUES (510682, '什邡市', 3, 510600, ',510000,510600,510682,');
+INSERT INTO `oa_city` VALUES (510683, '绵竹市', 3, 510600, ',510000,510600,510683,');
+INSERT INTO `oa_city` VALUES (510700, '绵阳市', 2, 510000, ',510000,510700,');
+INSERT INTO `oa_city` VALUES (510703, '涪城区', 3, 510700, ',510000,510700,510703,');
+INSERT INTO `oa_city` VALUES (510704, '游仙区', 3, 510700, ',510000,510700,510704,');
+INSERT INTO `oa_city` VALUES (510722, '三台县', 3, 510700, ',510000,510700,510722,');
+INSERT INTO `oa_city` VALUES (510723, '盐亭县', 3, 510700, ',510000,510700,510723,');
+INSERT INTO `oa_city` VALUES (510724, '安　县', 3, 510700, ',510000,510700,510724,');
+INSERT INTO `oa_city` VALUES (510725, '梓潼县', 3, 510700, ',510000,510700,510725,');
+INSERT INTO `oa_city` VALUES (510726, '北川羌族自治县', 3, 510700, ',510000,510700,510726,');
+INSERT INTO `oa_city` VALUES (510727, '平武县', 3, 510700, ',510000,510700,510727,');
+INSERT INTO `oa_city` VALUES (510781, '江油市', 3, 510700, ',510000,510700,510781,');
+INSERT INTO `oa_city` VALUES (510800, '广元市', 2, 510000, ',510000,510800,');
+INSERT INTO `oa_city` VALUES (510802, '市中区', 3, 510800, ',510000,510800,510802,');
+INSERT INTO `oa_city` VALUES (510811, '元坝区', 3, 510800, ',510000,510800,510811,');
+INSERT INTO `oa_city` VALUES (510812, '朝天区', 3, 510800, ',510000,510800,510812,');
+INSERT INTO `oa_city` VALUES (510821, '旺苍县', 3, 510800, ',510000,510800,510821,');
+INSERT INTO `oa_city` VALUES (510822, '青川县', 3, 510800, ',510000,510800,510822,');
+INSERT INTO `oa_city` VALUES (510823, '剑阁县', 3, 510800, ',510000,510800,510823,');
+INSERT INTO `oa_city` VALUES (510824, '苍溪县', 3, 510800, ',510000,510800,510824,');
+INSERT INTO `oa_city` VALUES (510900, '遂宁市', 2, 510000, ',510000,510900,');
+INSERT INTO `oa_city` VALUES (510903, '船山区', 3, 510900, ',510000,510900,510903,');
+INSERT INTO `oa_city` VALUES (510904, '安居区', 3, 510900, ',510000,510900,510904,');
+INSERT INTO `oa_city` VALUES (510921, '蓬溪县', 3, 510900, ',510000,510900,510921,');
+INSERT INTO `oa_city` VALUES (510922, '射洪县', 3, 510900, ',510000,510900,510922,');
+INSERT INTO `oa_city` VALUES (510923, '大英县', 3, 510900, ',510000,510900,510923,');
+INSERT INTO `oa_city` VALUES (511000, '内江市', 2, 510000, ',510000,511000,');
+INSERT INTO `oa_city` VALUES (511002, '市中区', 3, 511000, ',510000,511000,511002,');
+INSERT INTO `oa_city` VALUES (511011, '东兴区', 3, 511000, ',510000,511000,511011,');
+INSERT INTO `oa_city` VALUES (511024, '威远县', 3, 511000, ',510000,511000,511024,');
+INSERT INTO `oa_city` VALUES (511025, '资中县', 3, 511000, ',510000,511000,511025,');
+INSERT INTO `oa_city` VALUES (511028, '隆昌县', 3, 511000, ',510000,511000,511028,');
+INSERT INTO `oa_city` VALUES (511100, '乐山市', 2, 510000, ',510000,511100,');
+INSERT INTO `oa_city` VALUES (511102, '市中区', 3, 511100, ',510000,511100,511102,');
+INSERT INTO `oa_city` VALUES (511111, '沙湾区', 3, 511100, ',510000,511100,511111,');
+INSERT INTO `oa_city` VALUES (511112, '五通桥区', 3, 511100, ',510000,511100,511112,');
+INSERT INTO `oa_city` VALUES (511113, '金口河区', 3, 511100, ',510000,511100,511113,');
+INSERT INTO `oa_city` VALUES (511123, '犍为县', 3, 511100, ',510000,511100,511123,');
+INSERT INTO `oa_city` VALUES (511124, '井研县', 3, 511100, ',510000,511100,511124,');
+INSERT INTO `oa_city` VALUES (511126, '夹江县', 3, 511100, ',510000,511100,511126,');
+INSERT INTO `oa_city` VALUES (511129, '沐川县', 3, 511100, ',510000,511100,511129,');
+INSERT INTO `oa_city` VALUES (511132, '峨边彝族自治县', 3, 511100, ',510000,511100,511132,');
+INSERT INTO `oa_city` VALUES (511133, '马边彝族自治县', 3, 511100, ',510000,511100,511133,');
+INSERT INTO `oa_city` VALUES (511181, '峨眉山市', 3, 511100, ',510000,511100,511181,');
+INSERT INTO `oa_city` VALUES (511300, '南充市', 2, 510000, ',510000,511300,');
+INSERT INTO `oa_city` VALUES (511302, '顺庆区', 3, 511300, ',510000,511300,511302,');
+INSERT INTO `oa_city` VALUES (511303, '高坪区', 3, 511300, ',510000,511300,511303,');
+INSERT INTO `oa_city` VALUES (511304, '嘉陵区', 3, 511300, ',510000,511300,511304,');
+INSERT INTO `oa_city` VALUES (511321, '南部县', 3, 511300, ',510000,511300,511321,');
+INSERT INTO `oa_city` VALUES (511322, '营山县', 3, 511300, ',510000,511300,511322,');
+INSERT INTO `oa_city` VALUES (511323, '蓬安县', 3, 511300, ',510000,511300,511323,');
+INSERT INTO `oa_city` VALUES (511324, '仪陇县', 3, 511300, ',510000,511300,511324,');
+INSERT INTO `oa_city` VALUES (511325, '西充县', 3, 511300, ',510000,511300,511325,');
+INSERT INTO `oa_city` VALUES (511381, '阆中市', 3, 511300, ',510000,511300,511381,');
+INSERT INTO `oa_city` VALUES (511400, '眉山市', 2, 510000, ',510000,511400,');
+INSERT INTO `oa_city` VALUES (511402, '东坡区', 3, 511400, ',510000,511400,511402,');
+INSERT INTO `oa_city` VALUES (511421, '仁寿县', 3, 511400, ',510000,511400,511421,');
+INSERT INTO `oa_city` VALUES (511422, '彭山县', 3, 511400, ',510000,511400,511422,');
+INSERT INTO `oa_city` VALUES (511423, '洪雅县', 3, 511400, ',510000,511400,511423,');
+INSERT INTO `oa_city` VALUES (511424, '丹棱县', 3, 511400, ',510000,511400,511424,');
+INSERT INTO `oa_city` VALUES (511425, '青神县', 3, 511400, ',510000,511400,511425,');
+INSERT INTO `oa_city` VALUES (511500, '宜宾市', 2, 510000, ',510000,511500,');
+INSERT INTO `oa_city` VALUES (511502, '翠屏区', 3, 511500, ',510000,511500,511502,');
+INSERT INTO `oa_city` VALUES (511521, '宜宾县', 3, 511500, ',510000,511500,511521,');
+INSERT INTO `oa_city` VALUES (511522, '南溪县', 3, 511500, ',510000,511500,511522,');
+INSERT INTO `oa_city` VALUES (511523, '江安县', 3, 511500, ',510000,511500,511523,');
+INSERT INTO `oa_city` VALUES (511524, '长宁县', 3, 511500, ',510000,511500,511524,');
+INSERT INTO `oa_city` VALUES (511525, '高　县', 3, 511500, ',510000,511500,511525,');
+INSERT INTO `oa_city` VALUES (511526, '珙　县', 3, 511500, ',510000,511500,511526,');
+INSERT INTO `oa_city` VALUES (511527, '筠连县', 3, 511500, ',510000,511500,511527,');
+INSERT INTO `oa_city` VALUES (511528, '兴文县', 3, 511500, ',510000,511500,511528,');
+INSERT INTO `oa_city` VALUES (511529, '屏山县', 3, 511500, ',510000,511500,511529,');
+INSERT INTO `oa_city` VALUES (511600, '广安市', 2, 510000, ',510000,511600,');
+INSERT INTO `oa_city` VALUES (511602, '广安区', 3, 511600, ',510000,511600,511602,');
+INSERT INTO `oa_city` VALUES (511621, '岳池县', 3, 511600, ',510000,511600,511621,');
+INSERT INTO `oa_city` VALUES (511622, '武胜县', 3, 511600, ',510000,511600,511622,');
+INSERT INTO `oa_city` VALUES (511623, '邻水县', 3, 511600, ',510000,511600,511623,');
+INSERT INTO `oa_city` VALUES (511681, '华莹市', 3, 511600, ',510000,511600,511681,');
+INSERT INTO `oa_city` VALUES (511682, '前锋县', 3, 511700, ',510000,511600,511682,');
+INSERT INTO `oa_city` VALUES (511683, '枣山区', 3, 511700, ',510000,511600,511683,');
+INSERT INTO `oa_city` VALUES (511684, '经开区', 3, 511700, ',510000,511600,511684,');
+INSERT INTO `oa_city` VALUES (511700, '达州市', 2, 510000, ',510000,511700,');
+INSERT INTO `oa_city` VALUES (511702, '通川区', 3, 511700, ',510000,511700,511702,');
+INSERT INTO `oa_city` VALUES (511721, '达川区', 3, 511700, ',510000,511700,511721,');
+INSERT INTO `oa_city` VALUES (511722, '宣汉县', 3, 511700, ',510000,511700,511722,');
+INSERT INTO `oa_city` VALUES (511723, '开江县', 3, 511700, ',510000,511700,511723,');
+INSERT INTO `oa_city` VALUES (511724, '大竹县', 3, 511700, ',510000,511700,511724,');
+INSERT INTO `oa_city` VALUES (511725, '渠　县', 3, 511700, ',510000,511700,511725,');
+INSERT INTO `oa_city` VALUES (511781, '万源市', 3, 511700, ',510000,511700,511781,');
+INSERT INTO `oa_city` VALUES (511782, '高新区', 3, 511700, ',510000,511700,511782,');
+INSERT INTO `oa_city` VALUES (511783, '东部经开区', 3, 511700, ',510000,511700,511783,');
+INSERT INTO `oa_city` VALUES (511800, '雅安市', 2, 510000, ',510000,511800,');
+INSERT INTO `oa_city` VALUES (511802, '雨城区', 3, 511800, ',510000,511800,511802,');
+INSERT INTO `oa_city` VALUES (511821, '名山县', 3, 511800, ',510000,511800,511821,');
+INSERT INTO `oa_city` VALUES (511822, '荥经县', 3, 511800, ',510000,511800,511822,');
+INSERT INTO `oa_city` VALUES (511823, '汉源县', 3, 511800, ',510000,511800,511823,');
+INSERT INTO `oa_city` VALUES (511824, '石棉县', 3, 511800, ',510000,511800,511824,');
+INSERT INTO `oa_city` VALUES (511825, '天全县', 3, 511800, ',510000,511800,511825,');
+INSERT INTO `oa_city` VALUES (511826, '芦山县', 3, 511800, ',510000,511800,511826,');
+INSERT INTO `oa_city` VALUES (511827, '宝兴县', 3, 511800, ',510000,511800,511827,');
+INSERT INTO `oa_city` VALUES (511900, '巴中市', 2, 510000, ',510000,511900,');
+INSERT INTO `oa_city` VALUES (511902, '巴州区', 3, 511900, ',510000,511900,511902,');
+INSERT INTO `oa_city` VALUES (511921, '通江县', 3, 511900, ',510000,511900,511921,');
+INSERT INTO `oa_city` VALUES (511922, '南江县', 3, 511900, ',510000,511900,511922,');
+INSERT INTO `oa_city` VALUES (511923, '平昌县', 3, 511900, ',510000,511900,511923,');
+INSERT INTO `oa_city` VALUES (512000, '资阳市', 2, 510000, ',510000,512000,');
+INSERT INTO `oa_city` VALUES (512002, '雁江区', 3, 512000, ',510000,512000,512002,');
+INSERT INTO `oa_city` VALUES (512021, '安岳县', 3, 512000, ',510000,512000,512021,');
+INSERT INTO `oa_city` VALUES (512022, '乐至县', 3, 512000, ',510000,512000,512022,');
+INSERT INTO `oa_city` VALUES (512081, '简阳市', 3, 512000, ',510000,512000,512081,');
+INSERT INTO `oa_city` VALUES (513200, '阿坝藏族羌族自治州', 2, 510000, ',510000,513200,');
+INSERT INTO `oa_city` VALUES (513221, '汶川县', 3, 513200, ',510000,513200,513221,');
+INSERT INTO `oa_city` VALUES (513222, '理　县', 3, 513200, ',510000,513200,513222,');
+INSERT INTO `oa_city` VALUES (513223, '茂　县', 3, 513200, ',510000,513200,513223,');
+INSERT INTO `oa_city` VALUES (513224, '松潘县', 3, 513200, ',510000,513200,513224,');
+INSERT INTO `oa_city` VALUES (513225, '九寨沟县', 3, 513200, ',510000,513200,513225,');
+INSERT INTO `oa_city` VALUES (513226, '金川县', 3, 513200, ',510000,513200,513226,');
+INSERT INTO `oa_city` VALUES (513227, '小金县', 3, 513200, ',510000,513200,513227,');
+INSERT INTO `oa_city` VALUES (513228, '黑水县', 3, 513200, ',510000,513200,513228,');
+INSERT INTO `oa_city` VALUES (513229, '马尔康县', 3, 513200, ',510000,513200,513229,');
+INSERT INTO `oa_city` VALUES (513230, '壤塘县', 3, 513200, ',510000,513200,513230,');
+INSERT INTO `oa_city` VALUES (513231, '阿坝县', 3, 513200, ',510000,513200,513231,');
+INSERT INTO `oa_city` VALUES (513232, '若尔盖县', 3, 513200, ',510000,513200,513232,');
+INSERT INTO `oa_city` VALUES (513233, '红原县', 3, 513200, ',510000,513200,513233,');
+INSERT INTO `oa_city` VALUES (513300, '甘孜藏族自治州', 2, 510000, ',510000,513300,');
+INSERT INTO `oa_city` VALUES (513321, '康定县', 3, 513300, ',510000,513300,513321,');
+INSERT INTO `oa_city` VALUES (513322, '泸定县', 3, 513300, ',510000,513300,513322,');
+INSERT INTO `oa_city` VALUES (513323, '丹巴县', 3, 513300, ',510000,513300,513323,');
+INSERT INTO `oa_city` VALUES (513324, '九龙县', 3, 513300, ',510000,513300,513324,');
+INSERT INTO `oa_city` VALUES (513325, '雅江县', 3, 513300, ',510000,513300,513325,');
+INSERT INTO `oa_city` VALUES (513326, '道孚县', 3, 513300, ',510000,513300,513326,');
+INSERT INTO `oa_city` VALUES (513327, '炉霍县', 3, 513300, ',510000,513300,513327,');
+INSERT INTO `oa_city` VALUES (513328, '甘孜县', 3, 513300, ',510000,513300,513328,');
+INSERT INTO `oa_city` VALUES (513329, '新龙县', 3, 513300, ',510000,513300,513329,');
+INSERT INTO `oa_city` VALUES (513330, '德格县', 3, 513300, ',510000,513300,513330,');
+INSERT INTO `oa_city` VALUES (513331, '白玉县', 3, 513300, ',510000,513300,513331,');
+INSERT INTO `oa_city` VALUES (513332, '石渠县', 3, 513300, ',510000,513300,513332,');
+INSERT INTO `oa_city` VALUES (513333, '色达县', 3, 513300, ',510000,513300,513333,');
+INSERT INTO `oa_city` VALUES (513334, '理塘县', 3, 513300, ',510000,513300,513334,');
+INSERT INTO `oa_city` VALUES (513335, '巴塘县', 3, 513300, ',510000,513300,513335,');
+INSERT INTO `oa_city` VALUES (513336, '乡城县', 3, 513300, ',510000,513300,513336,');
+INSERT INTO `oa_city` VALUES (513337, '稻城县', 3, 513300, ',510000,513300,513337,');
+INSERT INTO `oa_city` VALUES (513338, '得荣县', 3, 513300, ',510000,513300,513338,');
+INSERT INTO `oa_city` VALUES (513400, '凉山彝族自治州', 2, 510000, ',510000,513400,');
+INSERT INTO `oa_city` VALUES (513401, '西昌市', 3, 513400, ',510000,513400,513401,');
+INSERT INTO `oa_city` VALUES (513422, '木里藏族自治县', 3, 513400, ',510000,513400,513422,');
+INSERT INTO `oa_city` VALUES (513423, '盐源县', 3, 513400, ',510000,513400,513423,');
+INSERT INTO `oa_city` VALUES (513424, '德昌县', 3, 513400, ',510000,513400,513424,');
+INSERT INTO `oa_city` VALUES (513425, '会理县', 3, 513400, ',510000,513400,513425,');
+INSERT INTO `oa_city` VALUES (513426, '会东县', 3, 513400, ',510000,513400,513426,');
+INSERT INTO `oa_city` VALUES (513427, '宁南县', 3, 513400, ',510000,513400,513427,');
+INSERT INTO `oa_city` VALUES (513428, '普格县', 3, 513400, ',510000,513400,513428,');
+INSERT INTO `oa_city` VALUES (513429, '布拖县', 3, 513400, ',510000,513400,513429,');
+INSERT INTO `oa_city` VALUES (513430, '金阳县', 3, 513400, ',510000,513400,513430,');
+INSERT INTO `oa_city` VALUES (513431, '昭觉县', 3, 513400, ',510000,513400,513431,');
+INSERT INTO `oa_city` VALUES (513432, '喜德县', 3, 513400, ',510000,513400,513432,');
+INSERT INTO `oa_city` VALUES (513433, '冕宁县', 3, 513400, ',510000,513400,513433,');
+INSERT INTO `oa_city` VALUES (513434, '越西县', 3, 513400, ',510000,513400,513434,');
+INSERT INTO `oa_city` VALUES (513435, '甘洛县', 3, 513400, ',510000,513400,513435,');
+INSERT INTO `oa_city` VALUES (513436, '美姑县', 3, 513400, ',510000,513400,513436,');
+INSERT INTO `oa_city` VALUES (513437, '雷波县', 3, 513400, ',510000,513400,513437,');
+INSERT INTO `oa_city` VALUES (520000, '贵州省', 1, 0, ',520000,');
+INSERT INTO `oa_city` VALUES (520100, '贵阳市', 2, 520000, ',520000,520100,');
+INSERT INTO `oa_city` VALUES (520102, '南明区', 3, 520100, ',520000,520100,520102,');
+INSERT INTO `oa_city` VALUES (520103, '云岩区', 3, 520100, ',520000,520100,520103,');
+INSERT INTO `oa_city` VALUES (520111, '花溪区', 3, 520100, ',520000,520100,520111,');
+INSERT INTO `oa_city` VALUES (520112, '乌当区', 3, 520100, ',520000,520100,520112,');
+INSERT INTO `oa_city` VALUES (520113, '白云区', 3, 520100, ',520000,520100,520113,');
+INSERT INTO `oa_city` VALUES (520114, '小河区', 3, 520100, ',520000,520100,520114,');
+INSERT INTO `oa_city` VALUES (520115, '观山湖区', 3, 520100, ',520000,520100,520115,');
+INSERT INTO `oa_city` VALUES (520121, '开阳县', 3, 520100, ',520000,520100,520121,');
+INSERT INTO `oa_city` VALUES (520122, '息烽县', 3, 520100, ',520000,520100,520122,');
+INSERT INTO `oa_city` VALUES (520123, '修文县', 3, 520100, ',520000,520100,520123,');
+INSERT INTO `oa_city` VALUES (520181, '清镇市', 3, 520100, ',520000,520100,520181,');
+INSERT INTO `oa_city` VALUES (520200, '六盘水市', 2, 520000, ',520000,520200,');
+INSERT INTO `oa_city` VALUES (520201, '钟山区', 3, 520200, ',520000,520200,520201,');
+INSERT INTO `oa_city` VALUES (520203, '六枝特区', 3, 520200, ',520000,520200,520203,');
+INSERT INTO `oa_city` VALUES (520221, '水城县', 3, 520200, ',520000,520200,520221,');
+INSERT INTO `oa_city` VALUES (520222, '盘　县', 3, 520200, ',520000,520200,520222,');
+INSERT INTO `oa_city` VALUES (520300, '遵义市', 2, 520000, ',520000,520300,');
+INSERT INTO `oa_city` VALUES (520302, '红花岗区', 3, 520300, ',520000,520300,520302,');
+INSERT INTO `oa_city` VALUES (520303, '汇川区', 3, 520300, ',520000,520300,520303,');
+INSERT INTO `oa_city` VALUES (520321, '遵义县', 3, 520300, ',520000,520300,520321,');
+INSERT INTO `oa_city` VALUES (520322, '桐梓县', 3, 520300, ',520000,520300,520322,');
+INSERT INTO `oa_city` VALUES (520323, '绥阳县', 3, 520300, ',520000,520300,520323,');
+INSERT INTO `oa_city` VALUES (520324, '正安县', 3, 520300, ',520000,520300,520324,');
+INSERT INTO `oa_city` VALUES (520325, '道真仡佬族苗族自治县', 3, 520300, ',520000,520300,520325,');
+INSERT INTO `oa_city` VALUES (520326, '务川仡佬族苗族自治县', 3, 520300, ',520000,520300,520326,');
+INSERT INTO `oa_city` VALUES (520327, '凤冈县', 3, 520300, ',520000,520300,520327,');
+INSERT INTO `oa_city` VALUES (520328, '湄潭县', 3, 520300, ',520000,520300,520328,');
+INSERT INTO `oa_city` VALUES (520329, '余庆县', 3, 520300, ',520000,520300,520329,');
+INSERT INTO `oa_city` VALUES (520330, '习水县', 3, 520300, ',520000,520300,520330,');
+INSERT INTO `oa_city` VALUES (520381, '赤水市', 3, 520300, ',520000,520300,520381,');
+INSERT INTO `oa_city` VALUES (520382, '仁怀市', 3, 520300, ',520000,520300,520382,');
+INSERT INTO `oa_city` VALUES (520400, '安顺市', 2, 520000, ',520000,520400,');
+INSERT INTO `oa_city` VALUES (520402, '西秀区', 3, 520400, ',520000,520400,520402,');
+INSERT INTO `oa_city` VALUES (520421, '平坝县', 3, 520400, ',520000,520400,520421,');
+INSERT INTO `oa_city` VALUES (520422, '普定县', 3, 520400, ',520000,520400,520422,');
+INSERT INTO `oa_city` VALUES (520423, '镇宁布依族苗族自治县', 3, 520400, ',520000,520400,520423,');
+INSERT INTO `oa_city` VALUES (520424, '关岭布依族苗族自治县', 3, 520400, ',520000,520400,520424,');
+INSERT INTO `oa_city` VALUES (520425, '紫云苗族布依族自治县', 3, 520400, ',520000,520400,520425,');
+INSERT INTO `oa_city` VALUES (522200, '铜仁地区', 2, 520000, ',520000,522200,');
+INSERT INTO `oa_city` VALUES (522201, '铜仁市', 3, 522200, ',520000,522200,522201,');
+INSERT INTO `oa_city` VALUES (522222, '江口县', 3, 522200, ',520000,522200,522222,');
+INSERT INTO `oa_city` VALUES (522223, '玉屏侗族自治县', 3, 522200, ',520000,522200,522223,');
+INSERT INTO `oa_city` VALUES (522224, '石阡县', 3, 522200, ',520000,522200,522224,');
+INSERT INTO `oa_city` VALUES (522225, '思南县', 3, 522200, ',520000,522200,522225,');
+INSERT INTO `oa_city` VALUES (522226, '印江土家族苗族自治县', 3, 522200, ',520000,522200,522226,');
+INSERT INTO `oa_city` VALUES (522227, '德江县', 3, 522200, ',520000,522200,522227,');
+INSERT INTO `oa_city` VALUES (522228, '沿河土家族自治县', 3, 522200, ',520000,522200,522228,');
+INSERT INTO `oa_city` VALUES (522229, '松桃苗族自治县', 3, 522200, ',520000,522200,522229,');
+INSERT INTO `oa_city` VALUES (522230, '万山特区', 3, 522200, ',520000,522200,522230,');
+INSERT INTO `oa_city` VALUES (522300, '黔西南布依族苗族自治州', 2, 520000, ',520000,522300,');
+INSERT INTO `oa_city` VALUES (522301, '兴义市', 3, 522300, ',520000,522300,522301,');
+INSERT INTO `oa_city` VALUES (522322, '兴仁县', 3, 522300, ',520000,522300,522322,');
+INSERT INTO `oa_city` VALUES (522323, '普安县', 3, 522300, ',520000,522300,522323,');
+INSERT INTO `oa_city` VALUES (522324, '晴隆县', 3, 522300, ',520000,522300,522324,');
+INSERT INTO `oa_city` VALUES (522325, '贞丰县', 3, 522300, ',520000,522300,522325,');
+INSERT INTO `oa_city` VALUES (522326, '望谟县', 3, 522300, ',520000,522300,522326,');
+INSERT INTO `oa_city` VALUES (522327, '册亨县', 3, 522300, ',520000,522300,522327,');
+INSERT INTO `oa_city` VALUES (522328, '安龙县', 3, 522300, ',520000,522300,522328,');
+INSERT INTO `oa_city` VALUES (522400, '毕节地区', 2, 520000, ',520000,522400,');
+INSERT INTO `oa_city` VALUES (522401, '毕节市', 3, 522400, ',520000,522400,522401,');
+INSERT INTO `oa_city` VALUES (522422, '大方县', 3, 522400, ',520000,522400,522422,');
+INSERT INTO `oa_city` VALUES (522423, '黔西县', 3, 522400, ',520000,522400,522423,');
+INSERT INTO `oa_city` VALUES (522424, '金沙县', 3, 522400, ',520000,522400,522424,');
+INSERT INTO `oa_city` VALUES (522425, '织金县', 3, 522400, ',520000,522400,522425,');
+INSERT INTO `oa_city` VALUES (522426, '纳雍县', 3, 522400, ',520000,522400,522426,');
+INSERT INTO `oa_city` VALUES (522427, '威宁彝族回族苗族自治县', 3, 522400, ',520000,522400,522427,');
+INSERT INTO `oa_city` VALUES (522428, '赫章县', 3, 522400, ',520000,522400,522428,');
+INSERT INTO `oa_city` VALUES (522600, '黔东南苗族侗族自治州', 2, 520000, ',520000,522600,');
+INSERT INTO `oa_city` VALUES (522601, '凯里市', 3, 522600, ',520000,522600,522601,');
+INSERT INTO `oa_city` VALUES (522622, '黄平县', 3, 522600, ',520000,522600,522622,');
+INSERT INTO `oa_city` VALUES (522623, '施秉县', 3, 522600, ',520000,522600,522623,');
+INSERT INTO `oa_city` VALUES (522624, '三穗县', 3, 522600, ',520000,522600,522624,');
+INSERT INTO `oa_city` VALUES (522625, '镇远县', 3, 522600, ',520000,522600,522625,');
+INSERT INTO `oa_city` VALUES (522626, '岑巩县', 3, 522600, ',520000,522600,522626,');
+INSERT INTO `oa_city` VALUES (522627, '天柱县', 3, 522600, ',520000,522600,522627,');
+INSERT INTO `oa_city` VALUES (522628, '锦屏县', 3, 522600, ',520000,522600,522628,');
+INSERT INTO `oa_city` VALUES (522629, '剑河县', 3, 522600, ',520000,522600,522629,');
+INSERT INTO `oa_city` VALUES (522630, '台江县', 3, 522600, ',520000,522600,522630,');
+INSERT INTO `oa_city` VALUES (522631, '黎平县', 3, 522600, ',520000,522600,522631,');
+INSERT INTO `oa_city` VALUES (522632, '榕江县', 3, 522600, ',520000,522600,522632,');
+INSERT INTO `oa_city` VALUES (522633, '从江县', 3, 522600, ',520000,522600,522633,');
+INSERT INTO `oa_city` VALUES (522634, '雷山县', 3, 522600, ',520000,522600,522634,');
+INSERT INTO `oa_city` VALUES (522635, '麻江县', 3, 522600, ',520000,522600,522635,');
+INSERT INTO `oa_city` VALUES (522636, '丹寨县', 3, 522600, ',520000,522600,522636,');
+INSERT INTO `oa_city` VALUES (522700, '黔南布依族苗族自治州', 2, 520000, ',520000,522700,');
+INSERT INTO `oa_city` VALUES (522701, '都匀市', 3, 522700, ',520000,522700,522701,');
+INSERT INTO `oa_city` VALUES (522702, '福泉市', 3, 522700, ',520000,522700,522702,');
+INSERT INTO `oa_city` VALUES (522722, '荔波县', 3, 522700, ',520000,522700,522722,');
+INSERT INTO `oa_city` VALUES (522723, '贵定县', 3, 522700, ',520000,522700,522723,');
+INSERT INTO `oa_city` VALUES (522725, '瓮安县', 3, 522700, ',520000,522700,522725,');
+INSERT INTO `oa_city` VALUES (522726, '独山县', 3, 522700, ',520000,522700,522726,');
+INSERT INTO `oa_city` VALUES (522727, '平塘县', 3, 522700, ',520000,522700,522727,');
+INSERT INTO `oa_city` VALUES (522728, '罗甸县', 3, 522700, ',520000,522700,522728,');
+INSERT INTO `oa_city` VALUES (522729, '长顺县', 3, 522700, ',520000,522700,522729,');
+INSERT INTO `oa_city` VALUES (522730, '龙里县', 3, 522700, ',520000,522700,522730,');
+INSERT INTO `oa_city` VALUES (522731, '惠水县', 3, 522700, ',520000,522700,522731,');
+INSERT INTO `oa_city` VALUES (522732, '三都水族自治县', 3, 522700, ',520000,522700,522732,');
+INSERT INTO `oa_city` VALUES (530000, '云南省', 1, 0, ',530000,');
+INSERT INTO `oa_city` VALUES (530100, '昆明市', 2, 530000, ',530000,530100,');
+INSERT INTO `oa_city` VALUES (530102, '五华区', 3, 530100, ',530000,530100,530102,');
+INSERT INTO `oa_city` VALUES (530103, '盘龙区', 3, 530100, ',530000,530100,530103,');
+INSERT INTO `oa_city` VALUES (530111, '官渡区', 3, 530100, ',530000,530100,530111,');
+INSERT INTO `oa_city` VALUES (530112, '西山区', 3, 530100, ',530000,530100,530112,');
+INSERT INTO `oa_city` VALUES (530113, '东川区', 3, 530100, ',530000,530100,530113,');
+INSERT INTO `oa_city` VALUES (530121, '呈贡县', 3, 530100, ',530000,530100,530121,');
+INSERT INTO `oa_city` VALUES (530122, '晋宁县', 3, 530100, ',530000,530100,530122,');
+INSERT INTO `oa_city` VALUES (530124, '富民县', 3, 530100, ',530000,530100,530124,');
+INSERT INTO `oa_city` VALUES (530125, '宜良县', 3, 530100, ',530000,530100,530125,');
+INSERT INTO `oa_city` VALUES (530126, '石林彝族自治县', 3, 530100, ',530000,530100,530126,');
+INSERT INTO `oa_city` VALUES (530127, '嵩明县', 3, 530100, ',530000,530100,530127,');
+INSERT INTO `oa_city` VALUES (530128, '禄劝彝族苗族自治县', 3, 530100, ',530000,530100,530128,');
+INSERT INTO `oa_city` VALUES (530129, '寻甸回族彝族自治县', 3, 530100, ',530000,530100,530129,');
+INSERT INTO `oa_city` VALUES (530181, '安宁市', 3, 530100, ',530000,530100,530181,');
+INSERT INTO `oa_city` VALUES (530300, '曲靖市', 2, 530000, ',530000,530300,');
+INSERT INTO `oa_city` VALUES (530302, '麒麟区', 3, 530300, ',530000,530300,530302,');
+INSERT INTO `oa_city` VALUES (530321, '马龙县', 3, 530300, ',530000,530300,530321,');
+INSERT INTO `oa_city` VALUES (530322, '陆良县', 3, 530300, ',530000,530300,530322,');
+INSERT INTO `oa_city` VALUES (530323, '师宗县', 3, 530300, ',530000,530300,530323,');
+INSERT INTO `oa_city` VALUES (530324, '罗平县', 3, 530300, ',530000,530300,530324,');
+INSERT INTO `oa_city` VALUES (530325, '富源县', 3, 530300, ',530000,530300,530325,');
+INSERT INTO `oa_city` VALUES (530326, '会泽县', 3, 530300, ',530000,530300,530326,');
+INSERT INTO `oa_city` VALUES (530328, '沾益县', 3, 530300, ',530000,530300,530328,');
+INSERT INTO `oa_city` VALUES (530381, '宣威市', 3, 530300, ',530000,530300,530381,');
+INSERT INTO `oa_city` VALUES (530400, '玉溪市', 2, 530000, ',530000,530400,');
+INSERT INTO `oa_city` VALUES (530402, '红塔区', 3, 530400, ',530000,530400,530402,');
+INSERT INTO `oa_city` VALUES (530421, '江川县', 3, 530400, ',530000,530400,530421,');
+INSERT INTO `oa_city` VALUES (530422, '澄江县', 3, 530400, ',530000,530400,530422,');
+INSERT INTO `oa_city` VALUES (530423, '通海县', 3, 530400, ',530000,530400,530423,');
+INSERT INTO `oa_city` VALUES (530424, '华宁县', 3, 530400, ',530000,530400,530424,');
+INSERT INTO `oa_city` VALUES (530425, '易门县', 3, 530400, ',530000,530400,530425,');
+INSERT INTO `oa_city` VALUES (530426, '峨山彝族自治县', 3, 530400, ',530000,530400,530426,');
+INSERT INTO `oa_city` VALUES (530427, '新平彝族傣族自治县', 3, 530400, ',530000,530400,530427,');
+INSERT INTO `oa_city` VALUES (530428, '元江哈尼族彝族傣族自治县', 3, 530400, ',530000,530400,530428,');
+INSERT INTO `oa_city` VALUES (530500, '保山市', 2, 530000, ',530000,530500,');
+INSERT INTO `oa_city` VALUES (530502, '隆阳区', 3, 530500, ',530000,530500,530502,');
+INSERT INTO `oa_city` VALUES (530521, '施甸县', 3, 530500, ',530000,530500,530521,');
+INSERT INTO `oa_city` VALUES (530522, '腾冲县', 3, 530500, ',530000,530500,530522,');
+INSERT INTO `oa_city` VALUES (530523, '龙陵县', 3, 530500, ',530000,530500,530523,');
+INSERT INTO `oa_city` VALUES (530524, '昌宁县', 3, 530500, ',530000,530500,530524,');
+INSERT INTO `oa_city` VALUES (530600, '昭通市', 2, 530000, ',530000,530600,');
+INSERT INTO `oa_city` VALUES (530602, '昭阳区', 3, 530600, ',530000,530600,530602,');
+INSERT INTO `oa_city` VALUES (530621, '鲁甸县', 3, 530600, ',530000,530600,530621,');
+INSERT INTO `oa_city` VALUES (530622, '巧家县', 3, 530600, ',530000,530600,530622,');
+INSERT INTO `oa_city` VALUES (530623, '盐津县', 3, 530600, ',530000,530600,530623,');
+INSERT INTO `oa_city` VALUES (530624, '大关县', 3, 530600, ',530000,530600,530624,');
+INSERT INTO `oa_city` VALUES (530625, '永善县', 3, 530600, ',530000,530600,530625,');
+INSERT INTO `oa_city` VALUES (530626, '绥江县', 3, 530600, ',530000,530600,530626,');
+INSERT INTO `oa_city` VALUES (530627, '镇雄县', 3, 530600, ',530000,530600,530627,');
+INSERT INTO `oa_city` VALUES (530628, '彝良县', 3, 530600, ',530000,530600,530628,');
+INSERT INTO `oa_city` VALUES (530629, '威信县', 3, 530600, ',530000,530600,530629,');
+INSERT INTO `oa_city` VALUES (530630, '水富县', 3, 530600, ',530000,530600,530630,');
+INSERT INTO `oa_city` VALUES (530700, '丽江市', 2, 530000, ',530000,530700,');
+INSERT INTO `oa_city` VALUES (530702, '古城区', 3, 530700, ',530000,530700,530702,');
+INSERT INTO `oa_city` VALUES (530721, '玉龙纳西族自治县', 3, 530700, ',530000,530700,530721,');
+INSERT INTO `oa_city` VALUES (530722, '永胜县', 3, 530700, ',530000,530700,530722,');
+INSERT INTO `oa_city` VALUES (530723, '华坪县', 3, 530700, ',530000,530700,530723,');
+INSERT INTO `oa_city` VALUES (530724, '宁蒗彝族自治县', 3, 530700, ',530000,530700,530724,');
+INSERT INTO `oa_city` VALUES (530800, '思茅市', 2, 530000, ',530000,530800,');
+INSERT INTO `oa_city` VALUES (530802, '翠云区', 3, 530800, ',530000,530800,530802,');
+INSERT INTO `oa_city` VALUES (530821, '普洱哈尼族彝族自治县', 3, 530800, ',530000,530800,530821,');
+INSERT INTO `oa_city` VALUES (530822, '墨江哈尼族自治县', 3, 530800, ',530000,530800,530822,');
+INSERT INTO `oa_city` VALUES (530823, '景东彝族自治县', 3, 530800, ',530000,530800,530823,');
+INSERT INTO `oa_city` VALUES (530824, '景谷傣族彝族自治县', 3, 530800, ',530000,530800,530824,');
+INSERT INTO `oa_city` VALUES (530825, '镇沅彝族哈尼族拉祜族自治县', 3, 530800, ',530000,530800,530825,');
+INSERT INTO `oa_city` VALUES (530826, '江城哈尼族彝族自治县', 3, 530800, ',530000,530800,530826,');
+INSERT INTO `oa_city` VALUES (530827, '孟连傣族拉祜族佤族自治县', 3, 530800, ',530000,530800,530827,');
+INSERT INTO `oa_city` VALUES (530828, '澜沧拉祜族自治县', 3, 530800, ',530000,530800,530828,');
+INSERT INTO `oa_city` VALUES (530829, '西盟佤族自治县', 3, 530800, ',530000,530800,530829,');
+INSERT INTO `oa_city` VALUES (530900, '临沧市', 2, 530000, ',530000,530900,');
+INSERT INTO `oa_city` VALUES (530902, '临翔区', 3, 530900, ',530000,530900,530902,');
+INSERT INTO `oa_city` VALUES (530921, '凤庆县', 3, 530900, ',530000,530900,530921,');
+INSERT INTO `oa_city` VALUES (530922, '云　县', 3, 530900, ',530000,530900,530922,');
+INSERT INTO `oa_city` VALUES (530923, '永德县', 3, 530900, ',530000,530900,530923,');
+INSERT INTO `oa_city` VALUES (530924, '镇康县', 3, 530900, ',530000,530900,530924,');
+INSERT INTO `oa_city` VALUES (530925, '双江拉祜族佤族布朗族傣族自治县', 3, 530900, ',530000,530900,530925,');
+INSERT INTO `oa_city` VALUES (530926, '耿马傣族佤族自治县', 3, 530900, ',530000,530900,530926,');
+INSERT INTO `oa_city` VALUES (530927, '沧源佤族自治县', 3, 530900, ',530000,530900,530927,');
+INSERT INTO `oa_city` VALUES (532300, '楚雄彝族自治州', 2, 530000, ',530000,532300,');
+INSERT INTO `oa_city` VALUES (532301, '楚雄市', 3, 532300, ',530000,532300,532301,');
+INSERT INTO `oa_city` VALUES (532322, '双柏县', 3, 532300, ',530000,532300,532322,');
+INSERT INTO `oa_city` VALUES (532323, '牟定县', 3, 532300, ',530000,532300,532323,');
+INSERT INTO `oa_city` VALUES (532324, '南华县', 3, 532300, ',530000,532300,532324,');
+INSERT INTO `oa_city` VALUES (532325, '姚安县', 3, 532300, ',530000,532300,532325,');
+INSERT INTO `oa_city` VALUES (532326, '大姚县', 3, 532300, ',530000,532300,532326,');
+INSERT INTO `oa_city` VALUES (532327, '永仁县', 3, 532300, ',530000,532300,532327,');
+INSERT INTO `oa_city` VALUES (532328, '元谋县', 3, 532300, ',530000,532300,532328,');
+INSERT INTO `oa_city` VALUES (532329, '武定县', 3, 532300, ',530000,532300,532329,');
+INSERT INTO `oa_city` VALUES (532331, '禄丰县', 3, 532300, ',530000,532300,532331,');
+INSERT INTO `oa_city` VALUES (532500, '红河哈尼族彝族自治州', 2, 530000, ',530000,532500,');
+INSERT INTO `oa_city` VALUES (532501, '个旧市', 3, 532500, ',530000,532500,532501,');
+INSERT INTO `oa_city` VALUES (532502, '开远市', 3, 532500, ',530000,532500,532502,');
+INSERT INTO `oa_city` VALUES (532522, '蒙自县', 3, 532500, ',530000,532500,532522,');
+INSERT INTO `oa_city` VALUES (532523, '屏边苗族自治县', 3, 532500, ',530000,532500,532523,');
+INSERT INTO `oa_city` VALUES (532524, '建水县', 3, 532500, ',530000,532500,532524,');
+INSERT INTO `oa_city` VALUES (532525, '石屏县', 3, 532500, ',530000,532500,532525,');
+INSERT INTO `oa_city` VALUES (532526, '弥勒县', 3, 532500, ',530000,532500,532526,');
+INSERT INTO `oa_city` VALUES (532527, '泸西县', 3, 532500, ',530000,532500,532527,');
+INSERT INTO `oa_city` VALUES (532528, '元阳县', 3, 532500, ',530000,532500,532528,');
+INSERT INTO `oa_city` VALUES (532529, '红河县', 3, 532500, ',530000,532500,532529,');
+INSERT INTO `oa_city` VALUES (532530, '金平苗族瑶族傣族自治县', 3, 532500, ',530000,532500,532530,');
+INSERT INTO `oa_city` VALUES (532531, '绿春县', 3, 532500, ',530000,532500,532531,');
+INSERT INTO `oa_city` VALUES (532532, '河口瑶族自治县', 3, 532500, ',530000,532500,532532,');
+INSERT INTO `oa_city` VALUES (532600, '文山壮族苗族自治州', 2, 530000, ',530000,532600,');
+INSERT INTO `oa_city` VALUES (532621, '文山县', 3, 532600, ',530000,532600,532621,');
+INSERT INTO `oa_city` VALUES (532622, '砚山县', 3, 532600, ',530000,532600,532622,');
+INSERT INTO `oa_city` VALUES (532623, '西畴县', 3, 532600, ',530000,532600,532623,');
+INSERT INTO `oa_city` VALUES (532624, '麻栗坡县', 3, 532600, ',530000,532600,532624,');
+INSERT INTO `oa_city` VALUES (532625, '马关县', 3, 532600, ',530000,532600,532625,');
+INSERT INTO `oa_city` VALUES (532626, '丘北县', 3, 532600, ',530000,532600,532626,');
+INSERT INTO `oa_city` VALUES (532627, '广南县', 3, 532600, ',530000,532600,532627,');
+INSERT INTO `oa_city` VALUES (532628, '富宁县', 3, 532600, ',530000,532600,532628,');
+INSERT INTO `oa_city` VALUES (532800, '西双版纳傣族自治州', 2, 530000, ',530000,532800,');
+INSERT INTO `oa_city` VALUES (532801, '景洪市', 3, 532800, ',530000,532800,532801,');
+INSERT INTO `oa_city` VALUES (532822, '勐海县', 3, 532800, ',530000,532800,532822,');
+INSERT INTO `oa_city` VALUES (532823, '勐腊县', 3, 532800, ',530000,532800,532823,');
+INSERT INTO `oa_city` VALUES (532900, '大理白族自治州', 2, 530000, ',530000,532900,');
+INSERT INTO `oa_city` VALUES (532901, '大理市', 3, 532900, ',530000,532900,532901,');
+INSERT INTO `oa_city` VALUES (532922, '漾濞彝族自治县', 3, 532900, ',530000,532900,532922,');
+INSERT INTO `oa_city` VALUES (532923, '祥云县', 3, 532900, ',530000,532900,532923,');
+INSERT INTO `oa_city` VALUES (532924, '宾川县', 3, 532900, ',530000,532900,532924,');
+INSERT INTO `oa_city` VALUES (532925, '弥渡县', 3, 532900, ',530000,532900,532925,');
+INSERT INTO `oa_city` VALUES (532926, '南涧彝族自治县', 3, 532900, ',530000,532900,532926,');
+INSERT INTO `oa_city` VALUES (532927, '巍山彝族回族自治县', 3, 532900, ',530000,532900,532927,');
+INSERT INTO `oa_city` VALUES (532928, '永平县', 3, 532900, ',530000,532900,532928,');
+INSERT INTO `oa_city` VALUES (532929, '云龙县', 3, 532900, ',530000,532900,532929,');
+INSERT INTO `oa_city` VALUES (532930, '洱源县', 3, 532900, ',530000,532900,532930,');
+INSERT INTO `oa_city` VALUES (532931, '剑川县', 3, 532900, ',530000,532900,532931,');
+INSERT INTO `oa_city` VALUES (532932, '鹤庆县', 3, 532900, ',530000,532900,532932,');
+INSERT INTO `oa_city` VALUES (533100, '德宏傣族景颇族自治州', 2, 530000, ',530000,533100,');
+INSERT INTO `oa_city` VALUES (533102, '瑞丽市', 3, 533100, ',530000,533100,533102,');
+INSERT INTO `oa_city` VALUES (533103, '潞西市', 3, 533100, ',530000,533100,533103,');
+INSERT INTO `oa_city` VALUES (533122, '梁河县', 3, 533100, ',530000,533100,533122,');
+INSERT INTO `oa_city` VALUES (533123, '盈江县', 3, 533100, ',530000,533100,533123,');
+INSERT INTO `oa_city` VALUES (533124, '陇川县', 3, 533100, ',530000,533100,533124,');
+INSERT INTO `oa_city` VALUES (533300, '怒江傈僳族自治州', 2, 530000, ',530000,533300,');
+INSERT INTO `oa_city` VALUES (533321, '泸水县', 3, 533300, ',530000,533300,533321,');
+INSERT INTO `oa_city` VALUES (533323, '福贡县', 3, 533300, ',530000,533300,533323,');
+INSERT INTO `oa_city` VALUES (533324, '贡山独龙族怒族自治县', 3, 533300, ',530000,533300,533324,');
+INSERT INTO `oa_city` VALUES (533325, '兰坪白族普米族自治县', 3, 533300, ',530000,533300,533325,');
+INSERT INTO `oa_city` VALUES (533400, '迪庆藏族自治州', 2, 530000, ',530000,533400,');
+INSERT INTO `oa_city` VALUES (533421, '香格里拉县', 3, 533400, ',530000,533400,533421,');
+INSERT INTO `oa_city` VALUES (533422, '德钦县', 3, 533400, ',530000,533400,533422,');
+INSERT INTO `oa_city` VALUES (533423, '维西傈僳族自治县', 3, 533400, ',530000,533400,533423,');
+INSERT INTO `oa_city` VALUES (540000, '西　藏', 1, 0, ',540000,');
+INSERT INTO `oa_city` VALUES (540100, '拉萨市', 2, 540000, ',540000,540100,');
+INSERT INTO `oa_city` VALUES (540102, '城关区', 3, 540100, ',540000,540100,540102,');
+INSERT INTO `oa_city` VALUES (540121, '林周县', 3, 540100, ',540000,540100,540121,');
+INSERT INTO `oa_city` VALUES (540122, '当雄县', 3, 540100, ',540000,540100,540122,');
+INSERT INTO `oa_city` VALUES (540123, '尼木县', 3, 540100, ',540000,540100,540123,');
+INSERT INTO `oa_city` VALUES (540124, '曲水县', 3, 540100, ',540000,540100,540124,');
+INSERT INTO `oa_city` VALUES (540125, '堆龙德庆县', 3, 540100, ',540000,540100,540125,');
+INSERT INTO `oa_city` VALUES (540126, '达孜县', 3, 540100, ',540000,540100,540126,');
+INSERT INTO `oa_city` VALUES (540127, '墨竹工卡县', 3, 540100, ',540000,540100,540127,');
+INSERT INTO `oa_city` VALUES (542100, '昌都地区', 2, 540000, ',540000,542100,');
+INSERT INTO `oa_city` VALUES (542121, '昌都县', 3, 542100, ',540000,542100,542121,');
+INSERT INTO `oa_city` VALUES (542122, '江达县', 3, 542100, ',540000,542100,542122,');
+INSERT INTO `oa_city` VALUES (542123, '贡觉县', 3, 542100, ',540000,542100,542123,');
+INSERT INTO `oa_city` VALUES (542124, '类乌齐县', 3, 542100, ',540000,542100,542124,');
+INSERT INTO `oa_city` VALUES (542125, '丁青县', 3, 542100, ',540000,542100,542125,');
+INSERT INTO `oa_city` VALUES (542126, '察雅县', 3, 542100, ',540000,542100,542126,');
+INSERT INTO `oa_city` VALUES (542127, '八宿县', 3, 542100, ',540000,542100,542127,');
+INSERT INTO `oa_city` VALUES (542128, '左贡县', 3, 542100, ',540000,542100,542128,');
+INSERT INTO `oa_city` VALUES (542129, '芒康县', 3, 542100, ',540000,542100,542129,');
+INSERT INTO `oa_city` VALUES (542132, '洛隆县', 3, 542100, ',540000,542100,542132,');
+INSERT INTO `oa_city` VALUES (542133, '边坝县', 3, 542100, ',540000,542100,542133,');
+INSERT INTO `oa_city` VALUES (542200, '山南地区', 2, 540000, ',540000,542200,');
+INSERT INTO `oa_city` VALUES (542221, '乃东县', 3, 542200, ',540000,542200,542221,');
+INSERT INTO `oa_city` VALUES (542222, '扎囊县', 3, 542200, ',540000,542200,542222,');
+INSERT INTO `oa_city` VALUES (542223, '贡嘎县', 3, 542200, ',540000,542200,542223,');
+INSERT INTO `oa_city` VALUES (542224, '桑日县', 3, 542200, ',540000,542200,542224,');
+INSERT INTO `oa_city` VALUES (542225, '琼结县', 3, 542200, ',540000,542200,542225,');
+INSERT INTO `oa_city` VALUES (542226, '曲松县', 3, 542200, ',540000,542200,542226,');
+INSERT INTO `oa_city` VALUES (542227, '措美县', 3, 542200, ',540000,542200,542227,');
+INSERT INTO `oa_city` VALUES (542228, '洛扎县', 3, 542200, ',540000,542200,542228,');
+INSERT INTO `oa_city` VALUES (542229, '加查县', 3, 542200, ',540000,542200,542229,');
+INSERT INTO `oa_city` VALUES (542231, '隆子县', 3, 542200, ',540000,542200,542231,');
+INSERT INTO `oa_city` VALUES (542232, '错那县', 3, 542200, ',540000,542200,542232,');
+INSERT INTO `oa_city` VALUES (542233, '浪卡子县', 3, 542200, ',540000,542200,542233,');
+INSERT INTO `oa_city` VALUES (542300, '日喀则地区', 2, 540000, ',540000,542300,');
+INSERT INTO `oa_city` VALUES (542301, '日喀则市', 3, 542300, ',540000,542300,542301,');
+INSERT INTO `oa_city` VALUES (542322, '南木林县', 3, 542300, ',540000,542300,542322,');
+INSERT INTO `oa_city` VALUES (542323, '江孜县', 3, 542300, ',540000,542300,542323,');
+INSERT INTO `oa_city` VALUES (542324, '定日县', 3, 542300, ',540000,542300,542324,');
+INSERT INTO `oa_city` VALUES (542325, '萨迦县', 3, 542300, ',540000,542300,542325,');
+INSERT INTO `oa_city` VALUES (542326, '拉孜县', 3, 542300, ',540000,542300,542326,');
+INSERT INTO `oa_city` VALUES (542327, '昂仁县', 3, 542300, ',540000,542300,542327,');
+INSERT INTO `oa_city` VALUES (542328, '谢通门县', 3, 542300, ',540000,542300,542328,');
+INSERT INTO `oa_city` VALUES (542329, '白朗县', 3, 542300, ',540000,542300,542329,');
+INSERT INTO `oa_city` VALUES (542330, '仁布县', 3, 542300, ',540000,542300,542330,');
+INSERT INTO `oa_city` VALUES (542331, '康马县', 3, 542300, ',540000,542300,542331,');
+INSERT INTO `oa_city` VALUES (542332, '定结县', 3, 542300, ',540000,542300,542332,');
+INSERT INTO `oa_city` VALUES (542333, '仲巴县', 3, 542300, ',540000,542300,542333,');
+INSERT INTO `oa_city` VALUES (542334, '亚东县', 3, 542300, ',540000,542300,542334,');
+INSERT INTO `oa_city` VALUES (542335, '吉隆县', 3, 542300, ',540000,542300,542335,');
+INSERT INTO `oa_city` VALUES (542336, '聂拉木县', 3, 542300, ',540000,542300,542336,');
+INSERT INTO `oa_city` VALUES (542337, '萨嘎县', 3, 542300, ',540000,542300,542337,');
+INSERT INTO `oa_city` VALUES (542338, '岗巴县', 3, 542300, ',540000,542300,542338,');
+INSERT INTO `oa_city` VALUES (542400, '那曲地区', 2, 540000, ',540000,542400,');
+INSERT INTO `oa_city` VALUES (542421, '那曲县', 3, 542400, ',540000,542400,542421,');
+INSERT INTO `oa_city` VALUES (542422, '嘉黎县', 3, 542400, ',540000,542400,542422,');
+INSERT INTO `oa_city` VALUES (542423, '比如县', 3, 542400, ',540000,542400,542423,');
+INSERT INTO `oa_city` VALUES (542424, '聂荣县', 3, 542400, ',540000,542400,542424,');
+INSERT INTO `oa_city` VALUES (542425, '安多县', 3, 542400, ',540000,542400,542425,');
+INSERT INTO `oa_city` VALUES (542426, '申扎县', 3, 542400, ',540000,542400,542426,');
+INSERT INTO `oa_city` VALUES (542427, '索　县', 3, 542400, ',540000,542400,542427,');
+INSERT INTO `oa_city` VALUES (542428, '班戈县', 3, 542400, ',540000,542400,542428,');
+INSERT INTO `oa_city` VALUES (542429, '巴青县', 3, 542400, ',540000,542400,542429,');
+INSERT INTO `oa_city` VALUES (542430, '尼玛县', 3, 542400, ',540000,542400,542430,');
+INSERT INTO `oa_city` VALUES (542500, '阿里地区', 2, 540000, ',540000,542500,');
+INSERT INTO `oa_city` VALUES (542521, '普兰县', 3, 542500, ',540000,542500,542521,');
+INSERT INTO `oa_city` VALUES (542522, '札达县', 3, 542500, ',540000,542500,542522,');
+INSERT INTO `oa_city` VALUES (542523, '噶尔县', 3, 542500, ',540000,542500,542523,');
+INSERT INTO `oa_city` VALUES (542524, '日土县', 3, 542500, ',540000,542500,542524,');
+INSERT INTO `oa_city` VALUES (542525, '革吉县', 3, 542500, ',540000,542500,542525,');
+INSERT INTO `oa_city` VALUES (542526, '改则县', 3, 542500, ',540000,542500,542526,');
+INSERT INTO `oa_city` VALUES (542527, '措勤县', 3, 542500, ',540000,542500,542527,');
+INSERT INTO `oa_city` VALUES (542600, '林芝地区', 2, 540000, ',540000,542600,');
+INSERT INTO `oa_city` VALUES (542621, '林芝县', 3, 542600, ',540000,542600,542621,');
+INSERT INTO `oa_city` VALUES (542622, '工布江达县', 3, 542600, ',540000,542600,542622,');
+INSERT INTO `oa_city` VALUES (542623, '米林县', 3, 542600, ',540000,542600,542623,');
+INSERT INTO `oa_city` VALUES (542624, '墨脱县', 3, 542600, ',540000,542600,542624,');
+INSERT INTO `oa_city` VALUES (542625, '波密县', 3, 542600, ',540000,542600,542625,');
+INSERT INTO `oa_city` VALUES (542626, '察隅县', 3, 542600, ',540000,542600,542626,');
+INSERT INTO `oa_city` VALUES (542627, '朗　县', 3, 542600, ',540000,542600,542627,');
+INSERT INTO `oa_city` VALUES (610000, '陕西省', 1, 0, ',610000,');
+INSERT INTO `oa_city` VALUES (610100, '西安市', 2, 610000, ',610000,610100,');
+INSERT INTO `oa_city` VALUES (610102, '新城区', 3, 610100, ',610000,610100,610102,');
+INSERT INTO `oa_city` VALUES (610103, '碑林区', 3, 610100, ',610000,610100,610103,');
+INSERT INTO `oa_city` VALUES (610104, '莲湖区', 3, 610100, ',610000,610100,610104,');
+INSERT INTO `oa_city` VALUES (610111, '灞桥区', 3, 610100, ',610000,610100,610111,');
+INSERT INTO `oa_city` VALUES (610112, '未央区', 3, 610100, ',610000,610100,610112,');
+INSERT INTO `oa_city` VALUES (610113, '雁塔区', 3, 610100, ',610000,610100,610113,');
+INSERT INTO `oa_city` VALUES (610114, '阎良区', 3, 610100, ',610000,610100,610114,');
+INSERT INTO `oa_city` VALUES (610115, '临潼区', 3, 610100, ',610000,610100,610115,');
+INSERT INTO `oa_city` VALUES (610116, '长安区', 3, 610100, ',610000,610100,610116,');
+INSERT INTO `oa_city` VALUES (610122, '蓝田县', 3, 610100, ',610000,610100,610122,');
+INSERT INTO `oa_city` VALUES (610124, '周至县', 3, 610100, ',610000,610100,610124,');
+INSERT INTO `oa_city` VALUES (610125, '户　县', 3, 610100, ',610000,610100,610125,');
+INSERT INTO `oa_city` VALUES (610126, '高陵县', 3, 610100, ',610000,610100,610126,');
+INSERT INTO `oa_city` VALUES (610200, '铜川市', 2, 610000, ',610000,610200,');
+INSERT INTO `oa_city` VALUES (610202, '王益区', 3, 610200, ',610000,610200,610202,');
+INSERT INTO `oa_city` VALUES (610203, '印台区', 3, 610200, ',610000,610200,610203,');
+INSERT INTO `oa_city` VALUES (610204, '耀州区', 3, 610200, ',610000,610200,610204,');
+INSERT INTO `oa_city` VALUES (610222, '宜君县', 3, 610200, ',610000,610200,610222,');
+INSERT INTO `oa_city` VALUES (610300, '宝鸡市', 2, 610000, ',610000,610300,');
+INSERT INTO `oa_city` VALUES (610302, '渭滨区', 3, 610300, ',610000,610300,610302,');
+INSERT INTO `oa_city` VALUES (610303, '金台区', 3, 610300, ',610000,610300,610303,');
+INSERT INTO `oa_city` VALUES (610304, '陈仓区', 3, 610300, ',610000,610300,610304,');
+INSERT INTO `oa_city` VALUES (610322, '凤翔县', 3, 610300, ',610000,610300,610322,');
+INSERT INTO `oa_city` VALUES (610323, '岐山县', 3, 610300, ',610000,610300,610323,');
+INSERT INTO `oa_city` VALUES (610324, '扶风县', 3, 610300, ',610000,610300,610324,');
+INSERT INTO `oa_city` VALUES (610326, '眉　县', 3, 610300, ',610000,610300,610326,');
+INSERT INTO `oa_city` VALUES (610327, '陇　县', 3, 610300, ',610000,610300,610327,');
+INSERT INTO `oa_city` VALUES (610328, '千阳县', 3, 610300, ',610000,610300,610328,');
+INSERT INTO `oa_city` VALUES (610329, '麟游县', 3, 610300, ',610000,610300,610329,');
+INSERT INTO `oa_city` VALUES (610330, '凤　县', 3, 610300, ',610000,610300,610330,');
+INSERT INTO `oa_city` VALUES (610331, '太白县', 3, 610300, ',610000,610300,610331,');
+INSERT INTO `oa_city` VALUES (610400, '咸阳市', 2, 610000, ',610000,610400,');
+INSERT INTO `oa_city` VALUES (610402, '秦都区', 3, 610400, ',610000,610400,610402,');
+INSERT INTO `oa_city` VALUES (610403, '杨凌区', 3, 610400, ',610000,610400,610403,');
+INSERT INTO `oa_city` VALUES (610404, '渭城区', 3, 610400, ',610000,610400,610404,');
+INSERT INTO `oa_city` VALUES (610422, '三原县', 3, 610400, ',610000,610400,610422,');
+INSERT INTO `oa_city` VALUES (610423, '泾阳县', 3, 610400, ',610000,610400,610423,');
+INSERT INTO `oa_city` VALUES (610424, '乾　县', 3, 610400, ',610000,610400,610424,');
+INSERT INTO `oa_city` VALUES (610425, '礼泉县', 3, 610400, ',610000,610400,610425,');
+INSERT INTO `oa_city` VALUES (610426, '永寿县', 3, 610400, ',610000,610400,610426,');
+INSERT INTO `oa_city` VALUES (610427, '彬　县', 3, 610400, ',610000,610400,610427,');
+INSERT INTO `oa_city` VALUES (610428, '长武县', 3, 610400, ',610000,610400,610428,');
+INSERT INTO `oa_city` VALUES (610429, '旬邑县', 3, 610400, ',610000,610400,610429,');
+INSERT INTO `oa_city` VALUES (610430, '淳化县', 3, 610400, ',610000,610400,610430,');
+INSERT INTO `oa_city` VALUES (610431, '武功县', 3, 610400, ',610000,610400,610431,');
+INSERT INTO `oa_city` VALUES (610481, '兴平市', 3, 610400, ',610000,610400,610481,');
+INSERT INTO `oa_city` VALUES (610500, '渭南市', 2, 610000, ',610000,610500,');
+INSERT INTO `oa_city` VALUES (610502, '临渭区', 3, 610500, ',610000,610500,610502,');
+INSERT INTO `oa_city` VALUES (610521, '华　县', 3, 610500, ',610000,610500,610521,');
+INSERT INTO `oa_city` VALUES (610522, '潼关县', 3, 610500, ',610000,610500,610522,');
+INSERT INTO `oa_city` VALUES (610523, '大荔县', 3, 610500, ',610000,610500,610523,');
+INSERT INTO `oa_city` VALUES (610524, '合阳县', 3, 610500, ',610000,610500,610524,');
+INSERT INTO `oa_city` VALUES (610525, '澄城县', 3, 610500, ',610000,610500,610525,');
+INSERT INTO `oa_city` VALUES (610526, '蒲城县', 3, 610500, ',610000,610500,610526,');
+INSERT INTO `oa_city` VALUES (610527, '白水县', 3, 610500, ',610000,610500,610527,');
+INSERT INTO `oa_city` VALUES (610528, '富平县', 3, 610500, ',610000,610500,610528,');
+INSERT INTO `oa_city` VALUES (610581, '韩城市', 3, 610500, ',610000,610500,610581,');
+INSERT INTO `oa_city` VALUES (610582, '华阴市', 3, 610500, ',610000,610500,610582,');
+INSERT INTO `oa_city` VALUES (610600, '延安市', 2, 610000, ',610000,610600,');
+INSERT INTO `oa_city` VALUES (610602, '宝塔区', 3, 610600, ',610000,610600,610602,');
+INSERT INTO `oa_city` VALUES (610621, '延长县', 3, 610600, ',610000,610600,610621,');
+INSERT INTO `oa_city` VALUES (610622, '延川县', 3, 610600, ',610000,610600,610622,');
+INSERT INTO `oa_city` VALUES (610623, '子长县', 3, 610600, ',610000,610600,610623,');
+INSERT INTO `oa_city` VALUES (610624, '安塞县', 3, 610600, ',610000,610600,610624,');
+INSERT INTO `oa_city` VALUES (610625, '志丹县', 3, 610600, ',610000,610600,610625,');
+INSERT INTO `oa_city` VALUES (610626, '吴旗县', 3, 610600, ',610000,610600,610626,');
+INSERT INTO `oa_city` VALUES (610627, '甘泉县', 3, 610600, ',610000,610600,610627,');
+INSERT INTO `oa_city` VALUES (610628, '富　县', 3, 610600, ',610000,610600,610628,');
+INSERT INTO `oa_city` VALUES (610629, '洛川县', 3, 610600, ',610000,610600,610629,');
+INSERT INTO `oa_city` VALUES (610630, '宜川县', 3, 610600, ',610000,610600,610630,');
+INSERT INTO `oa_city` VALUES (610631, '黄龙县', 3, 610600, ',610000,610600,610631,');
+INSERT INTO `oa_city` VALUES (610632, '黄陵县', 3, 610600, ',610000,610600,610632,');
+INSERT INTO `oa_city` VALUES (610700, '汉中市', 2, 610000, ',610000,610700,');
+INSERT INTO `oa_city` VALUES (610702, '汉台区', 3, 610700, ',610000,610700,610702,');
+INSERT INTO `oa_city` VALUES (610721, '南郑县', 3, 610700, ',610000,610700,610721,');
+INSERT INTO `oa_city` VALUES (610722, '城固县', 3, 610700, ',610000,610700,610722,');
+INSERT INTO `oa_city` VALUES (610723, '洋　县', 3, 610700, ',610000,610700,610723,');
+INSERT INTO `oa_city` VALUES (610724, '西乡县', 3, 610700, ',610000,610700,610724,');
+INSERT INTO `oa_city` VALUES (610725, '勉　县', 3, 610700, ',610000,610700,610725,');
+INSERT INTO `oa_city` VALUES (610726, '宁强县', 3, 610700, ',610000,610700,610726,');
+INSERT INTO `oa_city` VALUES (610727, '略阳县', 3, 610700, ',610000,610700,610727,');
+INSERT INTO `oa_city` VALUES (610728, '镇巴县', 3, 610700, ',610000,610700,610728,');
+INSERT INTO `oa_city` VALUES (610729, '留坝县', 3, 610700, ',610000,610700,610729,');
+INSERT INTO `oa_city` VALUES (610730, '佛坪县', 3, 610700, ',610000,610700,610730,');
+INSERT INTO `oa_city` VALUES (610800, '榆林市', 2, 610000, ',610000,610800,');
+INSERT INTO `oa_city` VALUES (610802, '榆阳区', 3, 610800, ',610000,610800,610802,');
+INSERT INTO `oa_city` VALUES (610821, '神木县', 3, 610800, ',610000,610800,610821,');
+INSERT INTO `oa_city` VALUES (610822, '府谷县', 3, 610800, ',610000,610800,610822,');
+INSERT INTO `oa_city` VALUES (610823, '横山县', 3, 610800, ',610000,610800,610823,');
+INSERT INTO `oa_city` VALUES (610824, '靖边县', 3, 610800, ',610000,610800,610824,');
+INSERT INTO `oa_city` VALUES (610825, '定边县', 3, 610800, ',610000,610800,610825,');
+INSERT INTO `oa_city` VALUES (610826, '绥德县', 3, 610800, ',610000,610800,610826,');
+INSERT INTO `oa_city` VALUES (610827, '米脂县', 3, 610800, ',610000,610800,610827,');
+INSERT INTO `oa_city` VALUES (610828, '佳　县', 3, 610800, ',610000,610800,610828,');
+INSERT INTO `oa_city` VALUES (610829, '吴堡县', 3, 610800, ',610000,610800,610829,');
+INSERT INTO `oa_city` VALUES (610830, '清涧县', 3, 610800, ',610000,610800,610830,');
+INSERT INTO `oa_city` VALUES (610831, '子洲县', 3, 610800, ',610000,610800,610831,');
+INSERT INTO `oa_city` VALUES (610900, '安康市', 2, 610000, ',610000,610900,');
+INSERT INTO `oa_city` VALUES (610902, '汉滨区', 3, 610900, ',610000,610900,610902,');
+INSERT INTO `oa_city` VALUES (610921, '汉阴县', 3, 610900, ',610000,610900,610921,');
+INSERT INTO `oa_city` VALUES (610922, '石泉县', 3, 610900, ',610000,610900,610922,');
+INSERT INTO `oa_city` VALUES (610923, '宁陕县', 3, 610900, ',610000,610900,610923,');
+INSERT INTO `oa_city` VALUES (610924, '紫阳县', 3, 610900, ',610000,610900,610924,');
+INSERT INTO `oa_city` VALUES (610925, '岚皋县', 3, 610900, ',610000,610900,610925,');
+INSERT INTO `oa_city` VALUES (610926, '平利县', 3, 610900, ',610000,610900,610926,');
+INSERT INTO `oa_city` VALUES (610927, '镇坪县', 3, 610900, ',610000,610900,610927,');
+INSERT INTO `oa_city` VALUES (610928, '旬阳县', 3, 610900, ',610000,610900,610928,');
+INSERT INTO `oa_city` VALUES (610929, '白河县', 3, 610900, ',610000,610900,610929,');
+INSERT INTO `oa_city` VALUES (611000, '商洛市', 2, 610000, ',610000,611000,');
+INSERT INTO `oa_city` VALUES (611002, '商州区', 3, 611000, ',610000,611000,611002,');
+INSERT INTO `oa_city` VALUES (611021, '洛南县', 3, 611000, ',610000,611000,611021,');
+INSERT INTO `oa_city` VALUES (611022, '丹凤县', 3, 611000, ',610000,611000,611022,');
+INSERT INTO `oa_city` VALUES (611023, '商南县', 3, 611000, ',610000,611000,611023,');
+INSERT INTO `oa_city` VALUES (611024, '山阳县', 3, 611000, ',610000,611000,611024,');
+INSERT INTO `oa_city` VALUES (611025, '镇安县', 3, 611000, ',610000,611000,611025,');
+INSERT INTO `oa_city` VALUES (611026, '柞水县', 3, 611000, ',610000,611000,611026,');
+INSERT INTO `oa_city` VALUES (620000, '甘肃省', 1, 0, ',620000,');
+INSERT INTO `oa_city` VALUES (620100, '兰州市', 2, 620000, ',620000,620100,');
+INSERT INTO `oa_city` VALUES (620102, '城关区', 3, 620100, ',620000,620100,620102,');
+INSERT INTO `oa_city` VALUES (620103, '七里河区', 3, 620100, ',620000,620100,620103,');
+INSERT INTO `oa_city` VALUES (620104, '西固区', 3, 620100, ',620000,620100,620104,');
+INSERT INTO `oa_city` VALUES (620105, '安宁区', 3, 620100, ',620000,620100,620105,');
+INSERT INTO `oa_city` VALUES (620111, '红古区', 3, 620100, ',620000,620100,620111,');
+INSERT INTO `oa_city` VALUES (620121, '永登县', 3, 620100, ',620000,620100,620121,');
+INSERT INTO `oa_city` VALUES (620122, '皋兰县', 3, 620100, ',620000,620100,620122,');
+INSERT INTO `oa_city` VALUES (620123, '榆中县', 3, 620100, ',620000,620100,620123,');
+INSERT INTO `oa_city` VALUES (620200, '嘉峪关市', 2, 620000, ',620000,620200,');
+INSERT INTO `oa_city` VALUES (620300, '金昌市', 2, 620000, ',620000,620300,');
+INSERT INTO `oa_city` VALUES (620302, '金川区', 3, 620300, ',620000,620300,620302,');
+INSERT INTO `oa_city` VALUES (620321, '永昌县', 3, 620300, ',620000,620300,620321,');
+INSERT INTO `oa_city` VALUES (620400, '白银市', 2, 620000, ',620000,620400,');
+INSERT INTO `oa_city` VALUES (620402, '白银区', 3, 620400, ',620000,620400,620402,');
+INSERT INTO `oa_city` VALUES (620403, '平川区', 3, 620400, ',620000,620400,620403,');
+INSERT INTO `oa_city` VALUES (620421, '靖远县', 3, 620400, ',620000,620400,620421,');
+INSERT INTO `oa_city` VALUES (620422, '会宁县', 3, 620400, ',620000,620400,620422,');
+INSERT INTO `oa_city` VALUES (620423, '景泰县', 3, 620400, ',620000,620400,620423,');
+INSERT INTO `oa_city` VALUES (620500, '天水市', 2, 620000, ',620000,620500,');
+INSERT INTO `oa_city` VALUES (620502, '秦城区', 3, 620500, ',620000,620500,620502,');
+INSERT INTO `oa_city` VALUES (620503, '北道区', 3, 620500, ',620000,620500,620503,');
+INSERT INTO `oa_city` VALUES (620521, '清水县', 3, 620500, ',620000,620500,620521,');
+INSERT INTO `oa_city` VALUES (620522, '秦安县', 3, 620500, ',620000,620500,620522,');
+INSERT INTO `oa_city` VALUES (620523, '甘谷县', 3, 620500, ',620000,620500,620523,');
+INSERT INTO `oa_city` VALUES (620524, '武山县', 3, 620500, ',620000,620500,620524,');
+INSERT INTO `oa_city` VALUES (620525, '张家川回族自治县', 3, 620500, ',620000,620500,620525,');
+INSERT INTO `oa_city` VALUES (620600, '武威市', 2, 620000, ',620000,620600,');
+INSERT INTO `oa_city` VALUES (620602, '凉州区', 3, 620600, ',620000,620600,620602,');
+INSERT INTO `oa_city` VALUES (620621, '民勤县', 3, 620600, ',620000,620600,620621,');
+INSERT INTO `oa_city` VALUES (620622, '古浪县', 3, 620600, ',620000,620600,620622,');
+INSERT INTO `oa_city` VALUES (620623, '天祝藏族自治县', 3, 620600, ',620000,620600,620623,');
+INSERT INTO `oa_city` VALUES (620700, '张掖市', 2, 620000, ',620000,620700,');
+INSERT INTO `oa_city` VALUES (620702, '甘州区', 3, 620700, ',620000,620700,620702,');
+INSERT INTO `oa_city` VALUES (620721, '肃南裕固族自治县', 3, 620700, ',620000,620700,620721,');
+INSERT INTO `oa_city` VALUES (620722, '民乐县', 3, 620700, ',620000,620700,620722,');
+INSERT INTO `oa_city` VALUES (620723, '临泽县', 3, 620700, ',620000,620700,620723,');
+INSERT INTO `oa_city` VALUES (620724, '高台县', 3, 620700, ',620000,620700,620724,');
+INSERT INTO `oa_city` VALUES (620725, '山丹县', 3, 620700, ',620000,620700,620725,');
+INSERT INTO `oa_city` VALUES (620800, '平凉市', 2, 620000, ',620000,620800,');
+INSERT INTO `oa_city` VALUES (620802, '崆峒区', 3, 620800, ',620000,620800,620802,');
+INSERT INTO `oa_city` VALUES (620821, '泾川县', 3, 620800, ',620000,620800,620821,');
+INSERT INTO `oa_city` VALUES (620822, '灵台县', 3, 620800, ',620000,620800,620822,');
+INSERT INTO `oa_city` VALUES (620823, '崇信县', 3, 620800, ',620000,620800,620823,');
+INSERT INTO `oa_city` VALUES (620824, '华亭县', 3, 620800, ',620000,620800,620824,');
+INSERT INTO `oa_city` VALUES (620825, '庄浪县', 3, 620800, ',620000,620800,620825,');
+INSERT INTO `oa_city` VALUES (620826, '静宁县', 3, 620800, ',620000,620800,620826,');
+INSERT INTO `oa_city` VALUES (620900, '酒泉市', 2, 620000, ',620000,620900,');
+INSERT INTO `oa_city` VALUES (620902, '肃州区', 3, 620900, ',620000,620900,620902,');
+INSERT INTO `oa_city` VALUES (620921, '金塔县', 3, 620900, ',620000,620900,620921,');
+INSERT INTO `oa_city` VALUES (620922, '安西县', 3, 620900, ',620000,620900,620922,');
+INSERT INTO `oa_city` VALUES (620923, '肃北蒙古族自治县', 3, 620900, ',620000,620900,620923,');
+INSERT INTO `oa_city` VALUES (620924, '阿克塞哈萨克族自治县', 3, 620900, ',620000,620900,620924,');
+INSERT INTO `oa_city` VALUES (620981, '玉门市', 3, 620900, ',620000,620900,620981,');
+INSERT INTO `oa_city` VALUES (620982, '敦煌市', 3, 620900, ',620000,620900,620982,');
+INSERT INTO `oa_city` VALUES (621000, '庆阳市', 2, 620000, ',620000,621000,');
+INSERT INTO `oa_city` VALUES (621002, '西峰区', 3, 621000, ',620000,621000,621002,');
+INSERT INTO `oa_city` VALUES (621021, '庆城县', 3, 621000, ',620000,621000,621021,');
+INSERT INTO `oa_city` VALUES (621022, '环　县', 3, 621000, ',620000,621000,621022,');
+INSERT INTO `oa_city` VALUES (621023, '华池县', 3, 621000, ',620000,621000,621023,');
+INSERT INTO `oa_city` VALUES (621024, '合水县', 3, 621000, ',620000,621000,621024,');
+INSERT INTO `oa_city` VALUES (621025, '正宁县', 3, 621000, ',620000,621000,621025,');
+INSERT INTO `oa_city` VALUES (621026, '宁　县', 3, 621000, ',620000,621000,621026,');
+INSERT INTO `oa_city` VALUES (621027, '镇原县', 3, 621000, ',620000,621000,621027,');
+INSERT INTO `oa_city` VALUES (621100, '定西市', 2, 620000, ',620000,621100,');
+INSERT INTO `oa_city` VALUES (621102, '安定区', 3, 621100, ',620000,621100,621102,');
+INSERT INTO `oa_city` VALUES (621121, '通渭县', 3, 621100, ',620000,621100,621121,');
+INSERT INTO `oa_city` VALUES (621122, '陇西县', 3, 621100, ',620000,621100,621122,');
+INSERT INTO `oa_city` VALUES (621123, '渭源县', 3, 621100, ',620000,621100,621123,');
+INSERT INTO `oa_city` VALUES (621124, '临洮县', 3, 621100, ',620000,621100,621124,');
+INSERT INTO `oa_city` VALUES (621125, '漳　县', 3, 621100, ',620000,621100,621125,');
+INSERT INTO `oa_city` VALUES (621126, '岷　县', 3, 621100, ',620000,621100,621126,');
+INSERT INTO `oa_city` VALUES (621200, '陇南市', 2, 620000, ',620000,621200,');
+INSERT INTO `oa_city` VALUES (621202, '武都区', 3, 621200, ',620000,621200,621202,');
+INSERT INTO `oa_city` VALUES (621221, '成　县', 3, 621200, ',620000,621200,621221,');
+INSERT INTO `oa_city` VALUES (621222, '文　县', 3, 621200, ',620000,621200,621222,');
+INSERT INTO `oa_city` VALUES (621223, '宕昌县', 3, 621200, ',620000,621200,621223,');
+INSERT INTO `oa_city` VALUES (621224, '康　县', 3, 621200, ',620000,621200,621224,');
+INSERT INTO `oa_city` VALUES (621225, '西和县', 3, 621200, ',620000,621200,621225,');
+INSERT INTO `oa_city` VALUES (621226, '礼　县', 3, 621200, ',620000,621200,621226,');
+INSERT INTO `oa_city` VALUES (621227, '徽　县', 3, 621200, ',620000,621200,621227,');
+INSERT INTO `oa_city` VALUES (621228, '两当县', 3, 621200, ',620000,621200,621228,');
+INSERT INTO `oa_city` VALUES (622900, '临夏回族自治州', 2, 620000, ',620000,622900,');
+INSERT INTO `oa_city` VALUES (622901, '临夏市', 3, 622900, ',620000,622900,622901,');
+INSERT INTO `oa_city` VALUES (622921, '临夏县', 3, 622900, ',620000,622900,622921,');
+INSERT INTO `oa_city` VALUES (622922, '康乐县', 3, 622900, ',620000,622900,622922,');
+INSERT INTO `oa_city` VALUES (622923, '永靖县', 3, 622900, ',620000,622900,622923,');
+INSERT INTO `oa_city` VALUES (622924, '广河县', 3, 622900, ',620000,622900,622924,');
+INSERT INTO `oa_city` VALUES (622925, '和政县', 3, 622900, ',620000,622900,622925,');
+INSERT INTO `oa_city` VALUES (622926, '东乡族自治县', 3, 622900, ',620000,622900,622926,');
+INSERT INTO `oa_city` VALUES (622927, '积石山保安族东乡族撒拉族自治县', 3, 622900, ',620000,622900,622927,');
+INSERT INTO `oa_city` VALUES (623000, '甘南藏族自治州', 2, 620000, ',620000,623000,');
+INSERT INTO `oa_city` VALUES (623001, '合作市', 3, 623000, ',620000,623000,623001,');
+INSERT INTO `oa_city` VALUES (623021, '临潭县', 3, 623000, ',620000,623000,623021,');
+INSERT INTO `oa_city` VALUES (623022, '卓尼县', 3, 623000, ',620000,623000,623022,');
+INSERT INTO `oa_city` VALUES (623023, '舟曲县', 3, 623000, ',620000,623000,623023,');
+INSERT INTO `oa_city` VALUES (623024, '迭部县', 3, 623000, ',620000,623000,623024,');
+INSERT INTO `oa_city` VALUES (623025, '玛曲县', 3, 623000, ',620000,623000,623025,');
+INSERT INTO `oa_city` VALUES (623026, '碌曲县', 3, 623000, ',620000,623000,623026,');
+INSERT INTO `oa_city` VALUES (623027, '夏河县', 3, 623000, ',620000,623000,623027,');
+INSERT INTO `oa_city` VALUES (630000, '青海省', 1, 0, ',630000,');
+INSERT INTO `oa_city` VALUES (630100, '西宁市', 2, 630000, ',630000,630100,');
+INSERT INTO `oa_city` VALUES (630102, '城东区', 3, 630100, ',630000,630100,630102,');
+INSERT INTO `oa_city` VALUES (630103, '城中区', 3, 630100, ',630000,630100,630103,');
+INSERT INTO `oa_city` VALUES (630104, '城西区', 3, 630100, ',630000,630100,630104,');
+INSERT INTO `oa_city` VALUES (630105, '城北区', 3, 630100, ',630000,630100,630105,');
+INSERT INTO `oa_city` VALUES (630121, '大通回族土族自治县', 3, 630100, ',630000,630100,630121,');
+INSERT INTO `oa_city` VALUES (630122, '湟中县', 3, 630100, ',630000,630100,630122,');
+INSERT INTO `oa_city` VALUES (630123, '湟源县', 3, 630100, ',630000,630100,630123,');
+INSERT INTO `oa_city` VALUES (632100, '海东地区', 2, 630000, ',630000,632100,');
+INSERT INTO `oa_city` VALUES (632121, '平安县', 3, 632100, ',630000,632100,632121,');
+INSERT INTO `oa_city` VALUES (632122, '民和回族土族自治县', 3, 632100, ',630000,632100,632122,');
+INSERT INTO `oa_city` VALUES (632123, '乐都县', 3, 632100, ',630000,632100,632123,');
+INSERT INTO `oa_city` VALUES (632126, '互助土族自治县', 3, 632100, ',630000,632100,632126,');
+INSERT INTO `oa_city` VALUES (632127, '化隆回族自治县', 3, 632100, ',630000,632100,632127,');
+INSERT INTO `oa_city` VALUES (632128, '循化撒拉族自治县', 3, 632100, ',630000,632100,632128,');
+INSERT INTO `oa_city` VALUES (632200, '海北藏族自治州', 2, 630000, ',630000,632200,');
+INSERT INTO `oa_city` VALUES (632221, '门源回族自治县', 3, 632200, ',630000,632200,632221,');
+INSERT INTO `oa_city` VALUES (632222, '祁连县', 3, 632200, ',630000,632200,632222,');
+INSERT INTO `oa_city` VALUES (632223, '海晏县', 3, 632200, ',630000,632200,632223,');
+INSERT INTO `oa_city` VALUES (632224, '刚察县', 3, 632200, ',630000,632200,632224,');
+INSERT INTO `oa_city` VALUES (632300, '黄南藏族自治州', 2, 630000, ',630000,632300,');
+INSERT INTO `oa_city` VALUES (632321, '同仁县', 3, 632300, ',630000,632300,632321,');
+INSERT INTO `oa_city` VALUES (632322, '尖扎县', 3, 632300, ',630000,632300,632322,');
+INSERT INTO `oa_city` VALUES (632323, '泽库县', 3, 632300, ',630000,632300,632323,');
+INSERT INTO `oa_city` VALUES (632324, '河南蒙古族自治县', 3, 632300, ',630000,632300,632324,');
+INSERT INTO `oa_city` VALUES (632500, '海南藏族自治州', 2, 630000, ',630000,632500,');
+INSERT INTO `oa_city` VALUES (632521, '共和县', 3, 632500, ',630000,632500,632521,');
+INSERT INTO `oa_city` VALUES (632522, '同德县', 3, 632500, ',630000,632500,632522,');
+INSERT INTO `oa_city` VALUES (632523, '贵德县', 3, 632500, ',630000,632500,632523,');
+INSERT INTO `oa_city` VALUES (632524, '兴海县', 3, 632500, ',630000,632500,632524,');
+INSERT INTO `oa_city` VALUES (632525, '贵南县', 3, 632500, ',630000,632500,632525,');
+INSERT INTO `oa_city` VALUES (632600, '果洛藏族自治州', 2, 630000, ',630000,632600,');
+INSERT INTO `oa_city` VALUES (632621, '玛沁县', 3, 632600, ',630000,632600,632621,');
+INSERT INTO `oa_city` VALUES (632622, '班玛县', 3, 632600, ',630000,632600,632622,');
+INSERT INTO `oa_city` VALUES (632623, '甘德县', 3, 632600, ',630000,632600,632623,');
+INSERT INTO `oa_city` VALUES (632624, '达日县', 3, 632600, ',630000,632600,632624,');
+INSERT INTO `oa_city` VALUES (632625, '久治县', 3, 632600, ',630000,632600,632625,');
+INSERT INTO `oa_city` VALUES (632626, '玛多县', 3, 632600, ',630000,632600,632626,');
+INSERT INTO `oa_city` VALUES (632700, '玉树藏族自治州', 2, 630000, ',630000,632700,');
+INSERT INTO `oa_city` VALUES (632721, '玉树县', 3, 632700, ',630000,632700,632721,');
+INSERT INTO `oa_city` VALUES (632722, '杂多县', 3, 632700, ',630000,632700,632722,');
+INSERT INTO `oa_city` VALUES (632723, '称多县', 3, 632700, ',630000,632700,632723,');
+INSERT INTO `oa_city` VALUES (632724, '治多县', 3, 632700, ',630000,632700,632724,');
+INSERT INTO `oa_city` VALUES (632725, '囊谦县', 3, 632700, ',630000,632700,632725,');
+INSERT INTO `oa_city` VALUES (632726, '曲麻莱县', 3, 632700, ',630000,632700,632726,');
+INSERT INTO `oa_city` VALUES (632800, '海西蒙古族藏族自治州', 2, 630000, ',630000,632800,');
+INSERT INTO `oa_city` VALUES (632801, '格尔木市', 3, 632800, ',630000,632800,632801,');
+INSERT INTO `oa_city` VALUES (632802, '德令哈市', 3, 632800, ',630000,632800,632802,');
+INSERT INTO `oa_city` VALUES (632821, '乌兰县', 3, 632800, ',630000,632800,632821,');
+INSERT INTO `oa_city` VALUES (632822, '都兰县', 3, 632800, ',630000,632800,632822,');
+INSERT INTO `oa_city` VALUES (632823, '天峻县', 3, 632800, ',630000,632800,632823,');
+INSERT INTO `oa_city` VALUES (640000, '宁　夏', 1, 0, ',640000,');
+INSERT INTO `oa_city` VALUES (640100, '银川市', 2, 640000, ',640000,640100,');
+INSERT INTO `oa_city` VALUES (640104, '兴庆区', 3, 640100, ',640000,640100,640104,');
+INSERT INTO `oa_city` VALUES (640105, '西夏区', 3, 640100, ',640000,640100,640105,');
+INSERT INTO `oa_city` VALUES (640106, '金凤区', 3, 640100, ',640000,640100,640106,');
+INSERT INTO `oa_city` VALUES (640121, '永宁县', 3, 640100, ',640000,640100,640121,');
+INSERT INTO `oa_city` VALUES (640122, '贺兰县', 3, 640100, ',640000,640100,640122,');
+INSERT INTO `oa_city` VALUES (640181, '灵武市', 3, 640100, ',640000,640100,640181,');
+INSERT INTO `oa_city` VALUES (640200, '石嘴山市', 2, 640000, ',640000,640200,');
+INSERT INTO `oa_city` VALUES (640202, '大武口区', 3, 640200, ',640000,640200,640202,');
+INSERT INTO `oa_city` VALUES (640205, '惠农区', 3, 640200, ',640000,640200,640205,');
+INSERT INTO `oa_city` VALUES (640221, '平罗县', 3, 640200, ',640000,640200,640221,');
+INSERT INTO `oa_city` VALUES (640300, '吴忠市', 2, 640000, ',640000,640300,');
+INSERT INTO `oa_city` VALUES (640302, '利通区', 3, 640300, ',640000,640300,640302,');
+INSERT INTO `oa_city` VALUES (640323, '盐池县', 3, 640300, ',640000,640300,640323,');
+INSERT INTO `oa_city` VALUES (640324, '同心县', 3, 640300, ',640000,640300,640324,');
+INSERT INTO `oa_city` VALUES (640381, '青铜峡市', 3, 640300, ',640000,640300,640381,');
+INSERT INTO `oa_city` VALUES (640400, '固原市', 2, 640000, ',640000,640400,');
+INSERT INTO `oa_city` VALUES (640402, '原州区', 3, 640400, ',640000,640400,640402,');
+INSERT INTO `oa_city` VALUES (640422, '西吉县', 3, 640400, ',640000,640400,640422,');
+INSERT INTO `oa_city` VALUES (640423, '隆德县', 3, 640400, ',640000,640400,640423,');
+INSERT INTO `oa_city` VALUES (640424, '泾源县', 3, 640400, ',640000,640400,640424,');
+INSERT INTO `oa_city` VALUES (640425, '彭阳县', 3, 640400, ',640000,640400,640425,');
+INSERT INTO `oa_city` VALUES (640500, '中卫市', 2, 640000, ',640000,640500,');
+INSERT INTO `oa_city` VALUES (640502, '沙坡头区', 3, 640500, ',640000,640500,640502,');
+INSERT INTO `oa_city` VALUES (640521, '中宁县', 3, 640500, ',640000,640500,640521,');
+INSERT INTO `oa_city` VALUES (640522, '海原县', 3, 640500, ',640000,640500,640522,');
+INSERT INTO `oa_city` VALUES (650000, '新　疆', 1, 0, ',650000,');
+INSERT INTO `oa_city` VALUES (650100, '乌鲁木齐市', 2, 650000, ',650000,650100,');
+INSERT INTO `oa_city` VALUES (650102, '天山区', 3, 650100, ',650000,650100,650102,');
+INSERT INTO `oa_city` VALUES (650103, '沙依巴克区', 3, 650100, ',650000,650100,650103,');
+INSERT INTO `oa_city` VALUES (650104, '新市区', 3, 650100, ',650000,650100,650104,');
+INSERT INTO `oa_city` VALUES (650105, '水磨沟区', 3, 650100, ',650000,650100,650105,');
+INSERT INTO `oa_city` VALUES (650106, '头屯河区', 3, 650100, ',650000,650100,650106,');
+INSERT INTO `oa_city` VALUES (650107, '达坂城区', 3, 650100, ',650000,650100,650107,');
+INSERT INTO `oa_city` VALUES (650108, '东山区', 3, 650100, ',650000,650100,650108,');
+INSERT INTO `oa_city` VALUES (650121, '乌鲁木齐县', 3, 650100, ',650000,650100,650121,');
+INSERT INTO `oa_city` VALUES (650200, '克拉玛依市', 2, 650000, ',650000,650200,');
+INSERT INTO `oa_city` VALUES (650202, '独山子区', 3, 650200, ',650000,650200,650202,');
+INSERT INTO `oa_city` VALUES (650203, '克拉玛依区', 3, 650200, ',650000,650200,650203,');
+INSERT INTO `oa_city` VALUES (650204, '白碱滩区', 3, 650200, ',650000,650200,650204,');
+INSERT INTO `oa_city` VALUES (650205, '乌尔禾区', 3, 650200, ',650000,650200,650205,');
+INSERT INTO `oa_city` VALUES (652100, '吐鲁番地区', 2, 650000, ',650000,652100,');
+INSERT INTO `oa_city` VALUES (652101, '吐鲁番市', 3, 652100, ',650000,652100,652101,');
+INSERT INTO `oa_city` VALUES (652122, '鄯善县', 3, 652100, ',650000,652100,652122,');
+INSERT INTO `oa_city` VALUES (652123, '托克逊县', 3, 652100, ',650000,652100,652123,');
+INSERT INTO `oa_city` VALUES (652200, '哈密地区', 2, 650000, ',650000,652200,');
+INSERT INTO `oa_city` VALUES (652201, '哈密市', 3, 652200, ',650000,652200,652201,');
+INSERT INTO `oa_city` VALUES (652222, '巴里坤哈萨克自治县', 3, 652200, ',650000,652200,652222,');
+INSERT INTO `oa_city` VALUES (652223, '伊吾县', 3, 652200, ',650000,652200,652223,');
+INSERT INTO `oa_city` VALUES (652300, '昌吉回族自治州', 2, 650000, ',650000,652300,');
+INSERT INTO `oa_city` VALUES (652301, '昌吉市', 3, 652300, ',650000,652300,652301,');
+INSERT INTO `oa_city` VALUES (652302, '阜康市', 3, 652300, ',650000,652300,652302,');
+INSERT INTO `oa_city` VALUES (652303, '米泉市', 3, 652300, ',650000,652300,652303,');
+INSERT INTO `oa_city` VALUES (652323, '呼图壁县', 3, 652300, ',650000,652300,652323,');
+INSERT INTO `oa_city` VALUES (652324, '玛纳斯县', 3, 652300, ',650000,652300,652324,');
+INSERT INTO `oa_city` VALUES (652325, '奇台县', 3, 652300, ',650000,652300,652325,');
+INSERT INTO `oa_city` VALUES (652327, '吉木萨尔县', 3, 652300, ',650000,652300,652327,');
+INSERT INTO `oa_city` VALUES (652328, '木垒哈萨克自治县', 3, 652300, ',650000,652300,652328,');
+INSERT INTO `oa_city` VALUES (652700, '博尔塔拉蒙古自治州', 2, 650000, ',650000,652700,');
+INSERT INTO `oa_city` VALUES (652701, '博乐市', 3, 652700, ',650000,652700,652701,');
+INSERT INTO `oa_city` VALUES (652722, '精河县', 3, 652700, ',650000,652700,652722,');
+INSERT INTO `oa_city` VALUES (652723, '温泉县', 3, 652700, ',650000,652700,652723,');
+INSERT INTO `oa_city` VALUES (652800, '巴音郭楞蒙古自治州', 2, 650000, ',650000,652800,');
+INSERT INTO `oa_city` VALUES (652801, '库尔勒市', 3, 652800, ',650000,652800,652801,');
+INSERT INTO `oa_city` VALUES (652822, '轮台县', 3, 652800, ',650000,652800,652822,');
+INSERT INTO `oa_city` VALUES (652823, '尉犁县', 3, 652800, ',650000,652800,652823,');
+INSERT INTO `oa_city` VALUES (652824, '若羌县', 3, 652800, ',650000,652800,652824,');
+INSERT INTO `oa_city` VALUES (652825, '且末县', 3, 652800, ',650000,652800,652825,');
+INSERT INTO `oa_city` VALUES (652826, '焉耆回族自治县', 3, 652800, ',650000,652800,652826,');
+INSERT INTO `oa_city` VALUES (652827, '和静县', 3, 652800, ',650000,652800,652827,');
+INSERT INTO `oa_city` VALUES (652828, '和硕县', 3, 652800, ',650000,652800,652828,');
+INSERT INTO `oa_city` VALUES (652829, '博湖县', 3, 652800, ',650000,652800,652829,');
+INSERT INTO `oa_city` VALUES (652900, '阿克苏地区', 2, 650000, ',650000,652900,');
+INSERT INTO `oa_city` VALUES (652901, '阿克苏市', 3, 652900, ',650000,652900,652901,');
+INSERT INTO `oa_city` VALUES (652922, '温宿县', 3, 652900, ',650000,652900,652922,');
+INSERT INTO `oa_city` VALUES (652923, '库车县', 3, 652900, ',650000,652900,652923,');
+INSERT INTO `oa_city` VALUES (652924, '沙雅县', 3, 652900, ',650000,652900,652924,');
+INSERT INTO `oa_city` VALUES (652925, '新和县', 3, 652900, ',650000,652900,652925,');
+INSERT INTO `oa_city` VALUES (652926, '拜城县', 3, 652900, ',650000,652900,652926,');
+INSERT INTO `oa_city` VALUES (652927, '乌什县', 3, 652900, ',650000,652900,652927,');
+INSERT INTO `oa_city` VALUES (652928, '阿瓦提县', 3, 652900, ',650000,652900,652928,');
+INSERT INTO `oa_city` VALUES (652929, '柯坪县', 3, 652900, ',650000,652900,652929,');
+INSERT INTO `oa_city` VALUES (653000, '克孜勒苏柯尔克孜自治州', 2, 650000, ',650000,653000,');
+INSERT INTO `oa_city` VALUES (653001, '阿图什市', 3, 653000, ',650000,653000,653001,');
+INSERT INTO `oa_city` VALUES (653022, '阿克陶县', 3, 653000, ',650000,653000,653022,');
+INSERT INTO `oa_city` VALUES (653023, '阿合奇县', 3, 653000, ',650000,653000,653023,');
+INSERT INTO `oa_city` VALUES (653024, '乌恰县', 3, 653000, ',650000,653000,653024,');
+INSERT INTO `oa_city` VALUES (653100, '喀什地区', 2, 650000, ',650000,653100,');
+INSERT INTO `oa_city` VALUES (653101, '喀什市', 3, 653100, ',650000,653100,653101,');
+INSERT INTO `oa_city` VALUES (653121, '疏附县', 3, 653100, ',650000,653100,653121,');
+INSERT INTO `oa_city` VALUES (653122, '疏勒县', 3, 653100, ',650000,653100,653122,');
+INSERT INTO `oa_city` VALUES (653123, '英吉沙县', 3, 653100, ',650000,653100,653123,');
+INSERT INTO `oa_city` VALUES (653124, '泽普县', 3, 653100, ',650000,653100,653124,');
+INSERT INTO `oa_city` VALUES (653125, '莎车县', 3, 653100, ',650000,653100,653125,');
+INSERT INTO `oa_city` VALUES (653126, '叶城县', 3, 653100, ',650000,653100,653126,');
+INSERT INTO `oa_city` VALUES (653127, '麦盖提县', 3, 653100, ',650000,653100,653127,');
+INSERT INTO `oa_city` VALUES (653128, '岳普湖县', 3, 653100, ',650000,653100,653128,');
+INSERT INTO `oa_city` VALUES (653129, '伽师县', 3, 653100, ',650000,653100,653129,');
+INSERT INTO `oa_city` VALUES (653130, '巴楚县', 3, 653100, ',650000,653100,653130,');
+INSERT INTO `oa_city` VALUES (653131, '塔什库尔干塔吉克自治县', 3, 653100, ',650000,653100,653131,');
+INSERT INTO `oa_city` VALUES (653200, '和田地区', 2, 650000, ',650000,653200,');
+INSERT INTO `oa_city` VALUES (653201, '和田市', 3, 653200, ',650000,653200,653201,');
+INSERT INTO `oa_city` VALUES (653221, '和田县', 3, 653200, ',650000,653200,653221,');
+INSERT INTO `oa_city` VALUES (653222, '墨玉县', 3, 653200, ',650000,653200,653222,');
+INSERT INTO `oa_city` VALUES (653223, '皮山县', 3, 653200, ',650000,653200,653223,');
+INSERT INTO `oa_city` VALUES (653224, '洛浦县', 3, 653200, ',650000,653200,653224,');
+INSERT INTO `oa_city` VALUES (653225, '策勒县', 3, 653200, ',650000,653200,653225,');
+INSERT INTO `oa_city` VALUES (653226, '于田县', 3, 653200, ',650000,653200,653226,');
+INSERT INTO `oa_city` VALUES (653227, '民丰县', 3, 653200, ',650000,653200,653227,');
+INSERT INTO `oa_city` VALUES (654000, '伊犁哈萨克自治州', 2, 650000, ',650000,654000,');
+INSERT INTO `oa_city` VALUES (654002, '伊宁市', 3, 654000, ',650000,654000,654002,');
+INSERT INTO `oa_city` VALUES (654003, '奎屯市', 3, 654000, ',650000,654000,654003,');
+INSERT INTO `oa_city` VALUES (654021, '伊宁县', 3, 654000, ',650000,654000,654021,');
+INSERT INTO `oa_city` VALUES (654022, '察布查尔锡伯自治县', 3, 654000, ',650000,654000,654022,');
+INSERT INTO `oa_city` VALUES (654023, '霍城县', 3, 654000, ',650000,654000,654023,');
+INSERT INTO `oa_city` VALUES (654024, '巩留县', 3, 654000, ',650000,654000,654024,');
+INSERT INTO `oa_city` VALUES (654025, '新源县', 3, 654000, ',650000,654000,654025,');
+INSERT INTO `oa_city` VALUES (654026, '昭苏县', 3, 654000, ',650000,654000,654026,');
+INSERT INTO `oa_city` VALUES (654027, '特克斯县', 3, 654000, ',650000,654000,654027,');
+INSERT INTO `oa_city` VALUES (654028, '尼勒克县', 3, 654000, ',650000,654000,654028,');
+INSERT INTO `oa_city` VALUES (654200, '塔城地区', 2, 650000, ',650000,654200,');
+INSERT INTO `oa_city` VALUES (654201, '塔城市', 3, 654200, ',650000,654200,654201,');
+INSERT INTO `oa_city` VALUES (654202, '乌苏市', 3, 654200, ',650000,654200,654202,');
+INSERT INTO `oa_city` VALUES (654221, '额敏县', 3, 654200, ',650000,654200,654221,');
+INSERT INTO `oa_city` VALUES (654223, '沙湾县', 3, 654200, ',650000,654200,654223,');
+INSERT INTO `oa_city` VALUES (654224, '托里县', 3, 654200, ',650000,654200,654224,');
+INSERT INTO `oa_city` VALUES (654225, '裕民县', 3, 654200, ',650000,654200,654225,');
+INSERT INTO `oa_city` VALUES (654226, '和布克赛尔蒙古自治县', 3, 654200, ',650000,654200,654226,');
+INSERT INTO `oa_city` VALUES (654300, '阿勒泰地区', 2, 650000, ',650000,654300,');
+INSERT INTO `oa_city` VALUES (654301, '阿勒泰市', 3, 654300, ',650000,654300,654301,');
+INSERT INTO `oa_city` VALUES (654321, '布尔津县', 3, 654300, ',650000,654300,654321,');
+INSERT INTO `oa_city` VALUES (654322, '富蕴县', 3, 654300, ',650000,654300,654322,');
+INSERT INTO `oa_city` VALUES (654323, '福海县', 3, 654300, ',650000,654300,654323,');
+INSERT INTO `oa_city` VALUES (654324, '哈巴河县', 3, 654300, ',650000,654300,654324,');
+INSERT INTO `oa_city` VALUES (654325, '青河县', 3, 654300, ',650000,654300,654325,');
+INSERT INTO `oa_city` VALUES (654326, '吉木乃县', 3, 654300, ',650000,654300,654326,');
+INSERT INTO `oa_city` VALUES (659001, '石河子市', 2, 650000, ',650000,659001,');
+INSERT INTO `oa_city` VALUES (659002, '阿拉尔市', 2, 650000, ',650000,659002,');
+INSERT INTO `oa_city` VALUES (659003, '图木舒克市', 2, 650000, ',650000,659003,');
+INSERT INTO `oa_city` VALUES (659004, '五家渠市', 2, 650000, ',650000,659004,');
+INSERT INTO `oa_city` VALUES (710000, '台湾省', 1, 0, ',710000,');
+INSERT INTO `oa_city` VALUES (810000, '香　港', 1, 0, ',810000,');
+INSERT INTO `oa_city` VALUES (820000, '澳　门', 1, 0, ',820000,');
+INSERT INTO `oa_city` VALUES (440113007000, '市桥街道', 4, 440113, ',440000,440100,440113,440113007000');
+INSERT INTO `oa_city` VALUES (440113008000, '沙头街道', 4, 440113, ',440000,440100,440113,440113008000');
+INSERT INTO `oa_city` VALUES (440113009000, '东环街道', 4, 440113, ',440000,440100,440113,440113009000');
+INSERT INTO `oa_city` VALUES (440113010000, '桥南街道', 4, 440113, ',440000,440100,440113,440113010000');
+INSERT INTO `oa_city` VALUES (440113011000, '小谷围街道', 4, 440113, ',440000,440100,440113,440113011000');
+INSERT INTO `oa_city` VALUES (440113012000, '大石街道', 4, 440113, ',440000,440100,440113,440113012000');
+INSERT INTO `oa_city` VALUES (440113013000, '洛浦街道', 4, 440113, ',440000,440100,440113,440113013000');
+INSERT INTO `oa_city` VALUES (440113014000, '石壁街道', 4, 440113, ',440000,440100,440113,440113014000');
+INSERT INTO `oa_city` VALUES (440113015000, '钟村街道', 4, 440113, ',440000,440100,440113,440113015000');
+INSERT INTO `oa_city` VALUES (440113016000, '大龙街道', 4, 440113, ',440000,440100,440113,440113016000');
+INSERT INTO `oa_city` VALUES (440113102000, '南村镇', 4, 440113, ',440000,440100,440113,440113102000');
+INSERT INTO `oa_city` VALUES (440113103000, '新造镇', 4, 440113, ',440000,440100,440113,440113103000');
+INSERT INTO `oa_city` VALUES (440113104000, '化龙镇', 4, 440113, ',440000,440100,440113,440113104000');
+INSERT INTO `oa_city` VALUES (440113105000, '石楼镇', 4, 440113, ',440000,440100,440113,440113105000');
+INSERT INTO `oa_city` VALUES (440113118000, '沙湾镇', 4, 440113, ',440000,440100,440113,440113118000');
+INSERT INTO `oa_city` VALUES (440113120000, '石碁镇', 4, 440113, ',440000,440100,440113,440113120000');
+INSERT INTO `oa_city` VALUES (440114001000, '新华街道', 4, 440114, ',440000,440100,440114,440114001000');
+INSERT INTO `oa_city` VALUES (440114002000, '花城街道', 4, 440114, ',440000,440100,440114,440114002000');
+INSERT INTO `oa_city` VALUES (440114003000, '秀全街道', 4, 440114, ',440000,440100,440114,440114003000');
+INSERT INTO `oa_city` VALUES (440114004000, '新雅街道', 4, 440114, ',440000,440100,440114,440114004000');
+INSERT INTO `oa_city` VALUES (440114103000, '梯面镇', 4, 440114, ',440000,440100,440114,440114103000');
+INSERT INTO `oa_city` VALUES (440114104000, '花山镇', 4, 440114, ',440000,440100,440114,440114104000');
+INSERT INTO `oa_city` VALUES (440114105000, '花东镇', 4, 440114, ',440000,440100,440114,440114105000');
+INSERT INTO `oa_city` VALUES (440114107000, '炭步镇', 4, 440114, ',440000,440100,440114,440114107000');
+INSERT INTO `oa_city` VALUES (440114108000, '赤坭镇', 4, 440114, ',440000,440100,440114,440114108000');
+INSERT INTO `oa_city` VALUES (440114109000, '狮岭镇', 4, 440114, ',440000,440100,440114,440114109000');
+INSERT INTO `oa_city` VALUES (440607001000, '西南街道', 4, 440607, ',440000,440600,440607,440607001000');
+INSERT INTO `oa_city` VALUES (440607004000, '云东海街道', 4, 440607, ',440000,440600,440607,440607004000');
+INSERT INTO `oa_city` VALUES (440607101000, '大塘镇', 4, 440607, ',440000,440600,440607,440607101000');
+INSERT INTO `oa_city` VALUES (440607103000, '乐平镇', 4, 440607, ',440000,440600,440607,440607103000');
+INSERT INTO `oa_city` VALUES (440607104000, '白坭镇', 4, 440607, ',440000,440600,440607,440607104000');
+INSERT INTO `oa_city` VALUES (440607105000, '芦苞镇', 4, 440607, ',440000,440600,440607,440607105000');
+INSERT INTO `oa_city` VALUES (440607106000, '南山镇', 4, 440607, ',440000,440600,440607,440607106000');
diff --git a/app/install/data/oa_user.sql b/app/install/data/oa_user.sql
new file mode 100644
index 0000000000000000000000000000000000000000..467d11768e0f6bb9370142ab0489a8be99521d15
--- /dev/null
+++ b/app/install/data/oa_user.sql
@@ -0,0 +1,103 @@
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (2, 'suhaizhen', '1ff888712e6d85e8b8dd85f4643da8fc', 'z5dm9r7kl3gjpf6ay1h8', '', '素还真', 13800000001, 1, '素还真', '/storage/202202/24d88ad4299744c8e83a7b17cfe9077f.jpg', 1, 1, 1, '合伙人A', 1637510400, 0, 1654605659, 1654848390, 1347, '58.63.1.34', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (3, 'yiyeshu', '0ebb9fa973b0f37ad1c66c43c452131e', '4wnrosga8cq39y1zthmb', '', '一页书', 13800000002, 1, '一页书', '/storage/avatars/avatar_256_ozhxs3abn61638065889.png', 1, 1, 1, '合伙人B', 1637596800, 0, 1654605710, 1654840504, 2, '27.36.90.63', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (4, 'fengcailing', 'cac2539c7517bb52a3c626a0cfc5bd7b', 'yonpz73fhcam6igw8ksl', '', '风采铃', 13800000003, 1, '风采铃', '/storage/avatars/avatar_256_f8i54nd7uk1638066170.png', 3, 2, 1, '深情义、明是非、才貌出众。为天蝶盟所用，欲以才华美貌、用情诱取素还真之性命，但却被素还真满腹经纶之才情与悲天悯人的胸怀所吸引而谱下一段血泪情缘。情路境遇坎坷、与爱子素续缘间亲情缘薄，但仍坚强不移，令人敬服。', 1637596800, 0, 1654605736, 1654743896, 95, '221.4.214.146', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (5, 'yucixin', '9b7b59e48c27a2657b6b6a73af7d6c8c', 'd3rcny2joz516gwhvuqi', '', '玉辞心', 13800000004, 1, '玉辞心', '/storage/avatars/avatar_256_upo9jznv561638066393.png', 3, 3, 1, '自称戢武王特遣之令使，为查明剑之初身世而入苦境，脸上妆容有一特殊的蝴蝶纹彩，举止言谈不时流露出一股不凡贵气，实力惊人，在鄙女风气兴盛的杀戮碎岛实属罕见，也为玉辞心身份增添了一丝神秘色彩。', 1637596800, 0, 1638148058, 1654650489, 40, '123.149.238.91', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (6, 'qinjiaxian', '9ecd4a6ebe6059baf952e69561e722e6', 'r0kqm5dv8j2sno4t61ga', '', '秦假仙', 13800000005, 1, '秦假仙', '/storage/avatars/avatar_256_w3efzn65bm1638066470.png', 4, 4, 1, '名人榜上天下第一辩，急公好义、脑筋灵活、辩才无碍，鬼点子永远用不完，一手包办武林中大小琐事，是正道最重要的情报贩子。个性自私小气、欺善怕恶，出门总带着一群跟班小弟，但却有着超乎常人的好运，加上过人的机智以及不择手段的行事风格，每每于关键时刻小兵立大功，对武林和平的贡献，有着不可磨灭、取代的地位，乃人不可貌相的最佳典范。', 1637596800, 0, 1654605799, 1654674396, 19, '113.89.98.158', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (7, 'yexiaochai', '61e3f1c16c02b795ccf58417edd2193f', 'tmhdspw4e2rxnu0k57fg', '', '叶小钗', 13800000006, 1, '叶小钗', '/storage/avatars/avatar_256_6r2nx5a7em1638066524.png', 6, 5, 1, '耿直专一、守信重诺的侠客，虽为侍童出身，但不屈不挠的个性，丰富的人生阅历，让其成为中原武林不可或缺的一员，享有“刀狂剑痴”之盛名，披肩的白发和脸上的英雄疤，搭配沉默无言的特色，营造出该角色独特的风范。', 1637596800, 0, 1654605510, 1654846854, 157, '27.36.90.63', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (8, 'tanwuyu', '77c56c1f8317b0a3b3a8efc7f0483ee1', '0zpwk1m6e92ticbjxhug', '', '谈无欲', 13800000007, 1, '谈无欲', '/storage/avatars/avatar_256_qz13s8emh01638067352.png', 5, 6, 1, '日月星三才子之月才子，呈现出与素还真全然不同的作风与个性，这点由他的诗号可窥知一二，完全的自信促使他一出道便和素还真在台面下互相较劲，两人维持着亦敌亦友的关系。由于过度的骄矜自满与好胜，让谈无欲坠入深渊，至此一蹶不振；然净从秽生、明从暗出，沉潜再出的谈无欲，蜕化为六丑暗助正道，并重拾昔日统辖文武半边天的风采，共同戮力于武林和平..', 1637769600, 0, 1654605510, 1644553903, 3, '27.36.88.53', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (9, 'hongchenxue', '6a62a68f7ba42faaaff5fee1bc8d5c23', 'qv0ltwjso43752ranye6', 'fhtj0a', '红尘雪', 13800000008, 2, '红尘雪', '/storage/avatars/avatar_256_1l2qbjwdci1638067440.png', 7, 6, 1, '倚晴江山楼之主，亦是隐流左单锋之主。文秀儒雅、貌美如花，善于琴棋书画，学识渊博又天赋异禀，能将知识传授给灵兽。看似武林少见才女，实有剑中洛神之美誉，其武学脱胎于父亲天剑老人的极单锋，练就自成一格的“翩单锋”，宛若游龙，点化为惊鸿七式。', 1637769600, 0, 1654605510, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (10, 'qiufen', '0a8c42b30732a1739af85864a1cbc6bb', '8qsyh1xk0c9rvm4od6a5', 'slmvwk', '秋分', 13800000009, 2, '秋分', '/storage/avatars/avatar_256_nxe19wd4s51638067663.png', 1, 8, 1, '风采铃贴身侍女。', 1637856000, 0, 1654605510, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (11, 'daoshou', '2d5ff743c1898459581ea0757d9b5d6f', 'les926iwxbjoud4t73z8', '', '刀兽', 13800000010, 1, '刀兽', '/storage/202201/92d518433f6f5cbe1b9b5df5f00eb28b.jpg', 4, 17, 1, '风采铃贴身侍卫。', 1637856000, 0, 1654605510, 1641606771, 2, '220.194.147.103', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (12, 'jianqin', 'ddc479ee1ad0a8e3005ea995015f8269', 'zkn70l42bmgxfsv6e1rd', 'slmvwk', '剑禽', 13800000011, 1, '剑禽', '/storage/avatars/avatar_256_djk5wvazqm1638067753.png', 4, 17, 1, '风采铃贴身侍卫。', 1637856000, 0, 1654605510, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (13, 'fuyingnv', '16e35c24ec220875611b316d5a47f9c8', 'swobpi7acm1jlz03n654', '', '符应女', 13800000012, 2, '符应女', '/storage/avatars/avatar_256_uj2vhc95oe1638067831.png', 13, 10, 1, '摄论太宫之妹，为棘岛专有的医生，医术专攻针灸之术，佐以药理，自封符应女，彰显其对自身医术的信心。个性豁达，暗中受玄觉之请托，至弃云峰医治戢武王的箭伤。', 1637856000, 0, 1654605510, 1638177142, 2, '58.252.118.218', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (14, 'jitianshuangji', '5f8463d0ed80a17897739045e880ca08', 'xbzsij2943106lqgypof', '', '祭天双姬', 13800000013, 2, '祭天双姬', '/storage/avatars/avatar_256_avw1hfkd931638067867.png', 3, 9, 1, '戢武王秘密势力，暗藏于祭天台的两名护持神姬，浑身裹满红纱，手持新月刃，一旦外人踏入禁地，两名神姬便会自石壁上现身，击退来犯者。', 1637856000, 0, 1642989980, 1642989994, 2, '27.45.158.192', 2);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (15, 'rangmingnv', 'fd52a4ae46d5a9b700bb3ec6abcbe895', 'lgv1aetwy2pjqickho57', '', '禳命女', 13800000014, 2, '禳命女', '/storage/avatars/avatar_256_rdhmjsu31y1638067920.png', 3, 10, 1, '气质轻灵，性格外柔内刚，与寒烟翠情同姐妹，因仰慕楔子的文采，对楔子情有独钟。为了追求爱情而不惜牺牲一切来到苦境，由于穿越境界的咒法有限，无意中解救走火入魔的南风不竞，不仅因此石化，更卷入了一段恩怨纠缠的爱恨情仇当中，在苦境找到楔子之化身枫岫后，直承内心思慕，毫不遮掩，是一名直接坦白，且勇于追求所爱的聪慧女子，然则面对南风不竞的强力追求，虽深为苦恼却无法摆脱，在寒烟翠告白之后，四角关系越趋复杂。', 1637856000, 0, 1654605510, 1638178704, 2, '58.252.118.218', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (16, 'yetuling', '920586af647f4447aee091485cb14f19', 'n2cr4yt9svzkeaj3uoil', 'xj5lw4', '业途灵', 13800000015, 1, '业途灵', '/storage/avatars/avatar_256_zk0xsabyd51638068106.png', 4, 11, 1, '原为灭境三途判之一，与十三邪灵大闹苦境，造成生灵途炭，但之后被造世七侠炼化，又被表象意魔所擒，侥幸没死反功力大增，但仍不敌慈海渡者被废去武功，被秦假仙收为跟班，个性变为搞笑、逗趣。继而宇宙神知在梦中渡化其本性并收为徒弟。跟随秦假仙屡助正道完成不少事迹。', 1638028800, 0, 1654605510, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (17, 'yinshiren', 'd843de8bd36b71cc33fc9bc034417605', 'hwvbqm24od1nz3sk0a5j', 'xj5lw4', '荫尸人', 13800000016, 1, '荫尸人', '/storage/avatars/avatar_256_slp9riu57z1638068129.png', 4, 11, 1, '千邪洞之主，擅长使用术法易容，整天梦想当上武林皇帝；本为欧阳世家一份子，被秦假仙收服后跟随身旁，乃霹雳系列的代表甘草人物之一。最终死于太学主。', 1638028800, 0, 1654605510, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (18, 'jineren', '69601a2a5c5f17111a031056198d01ce', 'cgs2wepk46y5dqvimz30', 'xj5lw4', '金蛾人', 13800000017, 1, '金蛾人', '/storage/avatars/avatar_256_qsj3z1g0961638068175.png', 4, 11, 1, '为向乱世狂刀复仇而绑架业途灵，期望乱世狂刀前来救人，却被成为天下第三人的秦假仙抓走，收为小弟。', 1638028800, 0, 1654605510, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (19, 'mofuluo', 'c8f94a65c182ca57a844b420de27d810', '24fjvoyinakzl0ce8d9u', 'xj5lw4', '摩弗罗', 13800000018, 1, '摩弗罗', '/storage/avatars/avatar_256_170qj8ze2p1638068207.png', 4, 11, 1, '见金蛾人绑架业途灵而前去救人，结果与金蛾人一道被成为天下第三人的秦假仙抓走，收为小弟。', 1638028800, 0, 1654605517, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (20, 'yinchaoji', '8b86365a7f4a31575684a74d759b35d4', 's0f7womrlqzn82hkti54', 'xj5lw4', '印超机', 13800000019, 1, '印超机', '/storage/avatars/avatar_256_njiz9c7ukx1638068232.png', 4, 11, 1, '业途灵为秦假仙新收的小弟。', 1638028800, 0, 1654605517, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (21, 'yinqiaoji', 'b5e4620d7d3d1822859ece0850845cf5', 'nkmwc09tbyrep8fgqiz7', 'xj5lw4', '印巧机', 13800000020, 1, '印巧机', '/storage/avatars/avatar_256_jwfryi78nz1638068252.png', 4, 11, 1, '印超机的兄弟，印超机死后代替兄弟成为秦假仙的小弟。', 1638028800, 0, 1654605517, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (22, 'bingwuyi', 'ff744c2ba32b05a12f85d36310b20adc', 'pzykx1jb820lwtn7e46u', 'xj5lw4', '冰无漪', 13800000021, 1, '冰无漪', '/storage/avatars/avatar_256_x6m3g74vli1638068304.png', 4, 11, 1, '因为被算计而欠下巨额赌债，因此要当500集的杂役工还债。后被秦假仙所买下，教训剡冥后还其自由。', 1638028800, 0, 1654605517, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (23, 'fujianfenshuo', '7e2b523db4c0f827e988f8028dbb0388', 'bgf89nxarhmiz4e1ptsk', 'xj5lw4', '佛剑分说', 13800000022, 1, '佛剑分说', '/storage/avatars/avatar_256_qcybo0hmtz1638068398.png', 8, 18, 1, '佛剑分说-体悟佛理，愿斩尽世间一切恶业，坠入无间亦不悔的慈悲佛者。得天佛尊赠与佛牒，开启其艰辛的修行之路，个性刚直不阿、正气凛然，在见识过灭绝希望的未来世界之后，更加深佛剑坚定的救世之路，纵然逆天之路艰辛难行，亦是不由分说的一人承担。', 1638028800, 0, 1654605517, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (24, 'jianzixianji', '546ba83a79231817253c0cb9ebf485af', 'ps2wujxnbdhevg61tz34', 'xj5lw4', '剑子仙迹', 13800000023, 1, '剑子仙迹', '/storage/avatars/avatar_256_592z781fpr1638068428.png', 9, 18, 1, '道门不世出的先天高人，心性无为，率真豁达，是严肃中又带着轻松幽默，与些微讽刺的世俗矫情的言谈、笑看江湖，外表看似不理江湖喧闹，实则为最关心中原安危的先天剑者。 ', 1638028800, 0, 1654605517, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (25, 'shuloulongsu', '4fb6d02919179aca970df26b8cd5293c', 'hzqx5vpw9orgseufm6b0', 'xj5lw4', '疏楼龙宿', 13800000024, 1, '疏楼龙宿', '/storage/avatars/avatar_256_9nr5sbceoq1638068456.png', 10, 18, 1, '华丽无双，足智多谋，机敏好辩，潇洒自信，过着逍遥自在的隐居生活。但其作为却颠覆儒家传统的形象，谈笑风生间隐隐透出坚决果断的冷酷，屡屡因挚友剑子仙迹与佛剑分说而涉足江湖', 1638028800, 0, 1654605517, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (26, 'fengsengbaiyunjian', '33f69e3821ef2c597076556477070196', 'zthd6pnyb24kxjrc7fg0', 'xj5lw4', '风僧白云剑', 13800000025, 1, '风僧白云剑', '/storage/avatars/avatar_256_t5x3w209hp1638068544.png', 8, 19, 1, '少年白发、帅气潇洒，正气凛然，个性雅痞风趣，潇洒快意江湖。虽是佛门俗家弟子，但是剑法通神，为西佛国百年难得一见的天才剑客，也被寄予厚望继承佛牒，乃是佛剑分说的竞争对手。', 1638028800, 0, 1654605517, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (27, 'wenputi', 'ab8fcc8679e3e4b3fe9f4e2e081ca971', '97pdfwy46ocgbqeutisj', 'xj5lw4', '问菩提', 13800000026, 1, '问菩提', '/storage/avatars/avatar_256_famxig6qs71638068577.png', 8, 19, 1, '自梵宇圣菩提所生，被视为生带天命的因果之子，曾在隳梵之战中解救梵宇，被封为圣虔者。其后却因故离开梵宇，隐居世外，虽不问世事，仍是才名广传，成为江湖上颇负盛名的名士，有「精熟三教经史、通达六艺文武，窃掠半点天机、冠绝九江才子」之美誉。', 1638028800, 0, 1654605517, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (28, 'jianmoyan', '375d2f66804aef5367813d6ee9eb05b9', '6nuz9rj7vykpfxb43giq', 'xj5lw4', '剑默言', 13800000027, 1, '剑默言', '/storage/avatars/avatar_256_pj5vxa09uo1638068607.png', 8, 19, 1, '身穿银白僧衣、身背梵字剑盒的神秘少年，性格正直而刚毅，在佛门遭遇灭佛之祸时，挺身而出，一心伸张正义、斩业护生。自称圣道初行，令人不禁与圣行者‧佛剑分说有所联想', 1638028800, 0, 1654605517, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (29, 'shaoyangjun', 'fd4edca1baa04371ea73b714ce39007f', '7cukve0m1x6idsob84tg', 'xj5lw4', '少阳君', 13800000028, 1, '少阳君', '/storage/avatars/avatar_256_b150yjpsl71638068644.png', 8, 19, 1, '身负殊异的三教修为，一心要寻找在墨殇天爆后就消失武林的三教顶峰，并从泥菩萨口中得知，全天下只有他才能找到“未孚”之所在。', 1638028800, 0, 0, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (30, 'yanqingcheng', '9eed7dd563b525bd61d943b81fac6460', 'nadmjsbcxp17tqy6i0ue', 'xj5lw4', '言倾城', 13800000029, 2, '言倾城', '/storage/avatars/avatar_256_bixgw0c27v1638068693.png', 8, 19, 1, '春霖境界言家堡大小姐，知书达礼的名门闺秀，拥有观向未来之眼、以及预知部分未来的殊能，辟吉嘴每说必中，因而成了人人闻之色变的魔女。', 1638028800, 0, 1654605517, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (31, 'yujiaoniang', '3997ea9ebedb1b55c7d11aa34a6cf939', '54u6t102cmjzidqab98l', 'xj5lw4', '欲娇娘', 13800000030, 2, '欲娇娘', '/storage/avatars/avatar_256_4y1962c3og1638068766.png', 9, 19, 1, '主张废物利用，将任务失败的三大战栗，加上八面鬼戎与鬼蚩邪尊的鬼能，融合创造出「三眼蚩厉」。化身天紫漪跟随佛剑分说，却逐渐对佛剑分说暗生情愫。', 1638028800, 0, 1654605517, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (32, 'aoxiaohongchen', '79ed6063ada94d6db7cb9657c3135084', 'rw987lhsbp153nf4vyac', 'xj5lw4', '傲笑红尘', 13800000031, 1, '傲笑红尘', '/storage/avatars/avatar_256_rbzqtwkdl61638068825.png', 9, 19, 1, '为人刚正不阿，对于所认定的事物，有著超乎常人的坚持。坚信公理正义的存在，不容许任何奸诈之徒为恶。剑法高深，身在诡谲武林，仍坚信自身的理念。虽有隐世之心，穷极一生寻找武林中之净土，却卸不下对武林的责任。', 1638028800, 0, 1654605517, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (33, 'mushaoai', '21d54a621268b5fcf27d9ffb2be59279', '4q0vpj7ne6tblxkcw38o', 'xj5lw4', '慕少艾', 13800000032, 1, '慕少艾', '/storage/avatars/avatar_256_ko21bp6wxf1638068857.png', 2, 19, 1, '幽默风趣、风雅隽逸的药师神医，拥有相当高超的医术与修为，早前曾与素还真较劲失利，而潜沉于琉璃仙境之下；后赢得麒麟穴而步入红尘，担起对抗异度魔界之重责，即使遇上艰难逆境也会以轻松态度面对、自我调侃，是正道不可多得的好帮手。', 1638028800, 0, 1654605517, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (34, 'xiaofengjun', '049da788e05ee57ddeb6fdd47659ae3d', 'pygc7kjwrdv0qhlox5in', '', '笑封君', 13800000033, 1, '笑封君', '/storage/avatars/avatar_256_1hdxlc4aj51638068908.png', 9, 19, 1, '性格刚毅，稳重老成，但思想偏激，执着于自我，不易受他人影响。根基高绝，其刀形似狂草中的道。多年前曾亡于剑子仙迹之手，随着妖世浮屠的出现，在佛业双身协助下复生，并对剑子展开复仇。', 1638028800, 0, 1654605517, 1652776829, 2, '121.34.50.168', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (35, 'liufengcui', '74eb5162ee2cc6f18f40e14c40894d73', '65l8cotiwzj3m70e29g1', 'xj5lw4', '柳峰翠', 13800000035, 1, '柳峰翠', '/storage/avatars/avatar_256_bivpwc3lag1638068954.png', 9, 19, 1, '因天心堂遭百岫嶙峋所灭，遂与妙胤传心展开与百岫嶙峋的对垒。而后更协助正道，共同对抗魔佛恶体阎达，为苍生献己心力。', 1638028800, 0, 1654605517, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (36, 'muxiaohan', '4b06267a7d917dd6dcb52c66a2e4719c', 'nfvilqotbc560k429par', 'xj5lw4', '慕潇韩', 13800000036, 1, '慕潇韩', '/storage/avatars/avatar_256_70gtf6xyqu1638068984.png', 9, 19, 1, '道门阴阳流派之首，与苍、剑子仙迹略有交情，平日幽居篁翠东风，凭竹为乐，因收到天佛原乡邀请，与剑子仙迹一同出席云相夺天局，始踏足红尘。慕潇韩以韩湘为笛，潇湘为剑，搭配独门剑式“湘神篇”，名响道门剑界。', 1638028800, 0, 0, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (37, 'jianfeidao', '70ba2b303e97d568c58ea920ca7dfeb8', 'jb5hg2m34kraezqx16n7', 'xj5lw4', '剑非道', 13800000037, 1, '剑非道', '/storage/avatars/avatar_256_5yrzl7egs11638069017.png', 9, 19, 1, '手持玄笛，身背道剑相忘，风姿清卓、一派伟岸，珞珞出群的表现，因而被委以重任看守道镇伏魔崖。 在看似沉稳的性格中，却有着对邪恶不容肆虐的正义之心，因而在幽都、魔流剑、叹希奇等势力巅乱武林时挺身对抗。', 1638028800, 0, 1654605517, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (38, 'shouwanjie', '06a37fc0e2b0996fad7d682638dff5a7', 'pdsf3ac5mwiz2u9gelbx', 'xj5lw4', '收万劫', 13800000038, 1, '收万劫', '/storage/avatars/avatar_256_qatrz1bf8l1638069041.png', 9, 19, 1, '身负正宗道门玄功、以及厄祸邪力，性格冷酷阴柔，酷爱血红之色，浑身上下充满艳红的邪杀之气。与青阳子双双现身道武王谷，一举夺走擘古镜封印的八歧龙首，并崩毁界天塔地脉，震惊在场众人。', 1638028800, 0, 1654605517, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (39, 'huoqingyun', 'fa5526b0629420cbeae1b5af144ec535', 'sh4djg1qai835rbwtecu', 'xj5lw4', '豁青云', 13800000039, 1, '豁青云', '/storage/avatars/avatar_256_ckmj2t9pul1638069069.png', 4, 19, 1, '才俊不凡的剑客，个性洒脱不羁，处事诙谐，拥有深厚的剑术修为，称号名字更是寓含弦外之音。预先疏离西武林派门至合修会据点避难，并数次阻止九变妖媸，救援武林正道。几经历练后，成为圣龙口副道主。', 1638028800, 0, 0, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (40, 'qingyangzi', '5ca225fe00a0926d0a3c2dd74d6a59b1', 'k6mczbv0ol9j2dgaxeys', 'xj5lw4', '青阳子', 13800000040, 1, '青阳子', '/storage/avatars/avatar_256_0ojtmzu5ws1638069096.png', 9, 19, 1, '龙脑、合修会创始人，雄才大略、智谋无双，作风明确果断、为人重情重义，毕生致力发扬道门雄风，曾集三教精华义理创立合修会，在因缘际会下与素还真结义，渐受其影响，从昔日枭雄转为正道栋梁。潜沉天地门再出的龙脑，幕后运筹帷幄、率领正道群英力抗冥界，乃气魄雄浑、豪情比天的旷世奇才', 1638028800, 0, 1654605517, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (41, 'muxianfeng', 'f3b5cbd961807b4734bf727810077126', 'gh1di2cyo7j8aqxl9bv4', 'xj5lw4', '穆仙凤', 13800000041, 2, '穆仙凤', '/storage/avatars/avatar_256_pa3q4vhkbl1638069202.png', 10, 19, 1, '聪慧机敏、善解人意、体贴窝心、忠贞不二，自幼在龙宿身边长大，甚得龙宿疼爱，与默言歆一起负责看顾疏楼西风。后受暴雨心奴所害，受感染之际龙宿不得已将其变为嗜血者，后在霹雳魔封第6章结尾龙宿与剑子谈话中得知已被解除嗜血者体质变回人类。', 1638028800, 0, 1654605517, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (42, 'moyanxin', 'f700614b59307e8b5a5d621866774014', 'fi793jucxlskr0b8oqt1', 'xj5lw4', '默言歆', 13800000042, 1, '默言歆', '/storage/avatars/avatar_256_mo02c9ul1z1638069233.png', 10, 19, 1, '人如其名，个性木讷寡言，与穆仙凤同为龙宿一手调教之爱将，平日负责打扫、顾守疏楼西风，外表看似平凡的守门仆人，然拳脚功夫精湛，对主上忠心耿耿。', 1638028800, 0, 1654605522, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (43, 'yingwuyou', '5b9ebd6d058f35647788e128883f45aa', 'x3psnmg5hbwycfud6o84', 'xj5lw4', '应无忧', 13800000043, 2, '应无忧', '/storage/avatars/avatar_256_t1x0iyub891638069268.png', 10, 19, 1, '龙宿华丽再出的新侍从，顶替默言歆之位，与穆仙凤随侍左右，个性沉默寡言，专为龙宿奉刀护持，看顾疏楼西风。', 1638028800, 0, 1654605522, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (44, 'jinlinghanya', '7de46691c7aac4c1998c392ddd4220e3', 'nd6imbwl4k9ga3y2fqxt', 'xj5lw4', '金陵寒鸦', 13800000044, 1, '金陵寒鸦', '/storage/avatars/avatar_256_qxl6p1zyvg1638069289.png', 3, 19, 1, '疏楼龙宿的持剑侍从，寡默无语，性格坚毅，对龙宿十分的忠诚，与穆仙凤随侍左右。恪尽职守，相当捍卫龙宿的颜面。金陵寒鸦本是受翳日一脉禁锢之役童，为龙宿所带出教养，并赐其遮日冠，让其不畏天阳。', 1638028800, 0, 1654605522, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (45, 'yulijing', 'd45bac680f8dc46421c30da14a947899', 'vri92wfuce8tk1s6aql4', 'xj5lw4', '玉离经', 13800000045, 1, '玉离经', '/storage/avatars/avatar_256_kotnby603w1638069316.png', 10, 19, 1, '文雅从容，有一门之主的气度华贵，但不过分自傲或自谦。待人较为和顺轻松，但心思缜密，深谋远虑，看待正事则严肃审慎。', 1638028800, 0, 1654605522, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (46, 'yingshuangqing', '739f4f663d18ec851e3148b4459c7c9c', 'bmnirw4g93aj8hyqc7sl', 'xj5lw4', '映霜清', 13800000046, 2, '映霜清', '/storage/avatars/avatar_256_2nd74sp3if1638069336.png', 10, 19, 1, '脸上半罩面纱，神秘优美，尊号“凤儒无情”。个性温和淡雅，婉约仁慈，在玉离经前来求援时出手相助。本性较爱好自由，但因对儒门的责任感而留守，擅于术法，身法灵巧，通天地灵性。', 1638028800, 0, 1654605522, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (47, 'xiaruwuzong', '54aa3808e8125f5bfe8c74c75d800972', 't40v7f9zpyl5a86jdqkb', 'xj5lw4', '侠儒无踪', 13800000047, 1, '侠儒无踪', '/storage/avatars/avatar_256_3upy26ovk51638069382.png', 10, 19, 1, '身负绝顶轻功千里无踪，搭配绝世剑法千里剑式。虽出身儒门文质之身，却具豪侠傲骨。凭借一身武艺与韧性，获得皇儒无上青睐，立身昊正第四道“问侠道”。', 1638028800, 0, 1654605522, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (48, 'huabanyue', 'b6f153e17117f798aa715903f5b2fa1c', 'fla1bzm7e320hsrigunw', 'xj5lw4', '花伴月', 13800000048, 1, '花伴月', '/storage/avatars/avatar_256_1dkpiyan5g1638069433.png', 10, 19, 1, '儒门天下仪礼监司，儒雅秀逸，毕生尊崇孔孟之学、奉行先圣之言，虽恪守儒家中庸之道，但面对外侮入侵的纷乱局势，亦有匡正平乱之心。', 1638028800, 0, 1654605522, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (49, 'yanchuanyun', '61ce2ff01d4753c4fe9b17c115cc01da', 'x7dwkh6ib0vo8jmpnsuf', 'xj5lw4', '雁穿云', 13800000049, 1, '雁穿云', '/storage/avatars/avatar_256_gi21moayj51638069464.png', 10, 19, 1, '儒门天下书监司，掌乐理教化民情、移风易俗，修乐以道志也，属典型的儒家士大夫，恪守中庸之道，略通兵法，能配合礼监司摆设儒门花雁阵。', 1638028800, 0, 1654605522, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (50, 'yuyoushui', '3e9cdb42839a1e42517b53815182e99d', 'jmi1as6f4p0byzto7lwu', 'xj5lw4', '鱼游水', 13800000050, 1, '鱼游水', '/storage/avatars/avatar_256_hvtlyu7xd31638069493.png', 10, 19, 1, '儒门天下乐监司，有着读书人的傲气，但略显迂腐，只求独善其身，对外界漠不关心。鱼游水虽自视甚高，却无相对的实力，以致除恶不成，反惨死于变裔天邪手中。', 1638028800, 0, 1654605522, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (51, 'zhaoshimingdeng', '74046a81f26b9cced948f86f2da15dfa', 'l7jq1huz3f0d6kniyst9', '', '照世明灯', 13800000051, 1, '照世明灯', '/storage/avatars/avatar_256_roeqlfsxhy1638069685.png', 11, 14, 1, '人如其名，一直给人如温泉水般柔和、仁慈的感觉。无论身处何地、遭遇何事，慈郎总是以一贯沉稳内敛的态度去面对，以及对苍生苦难的叹息与悲悯。本已隐蔽红尘多时，后为卸下原无乡双臂的银骠玄解而再出江湖。', 1638028800, 0, 1654842658, 1654842667, 2, '27.36.90.63', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (52, 'qushitu', '4141c77eb5213e144a47a9df62588a41', 'ia96x1tzn5yef2m8wp0j', 'xj5lw4', '屈世途', 13800000052, 1, '屈世途', '/storage/avatars/avatar_256_05ubvetyis1638069768.png', 12, 15, 1, '化身屈世途为天策真龙座下无名小兵，真龙现世，袭卷武林之时，与天策军众谋士合作，展露其不凡才能，让天策真龙赏识，进而提拔为座前军师。', 1638028800, 0, 1654605522, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (53, 'luanshikuangdao', '8ed9f44d385c56b1b452c0813a254794', 'molgnkje0572cirvs9f4', 'xj5lw4', '乱世狂刀', 13800000053, 1, '乱世狂刀', '/storage/avatars/avatar_256_r8awqs63zv1638069791.png', 13, 15, 1, '性情刚烈霸气、豪迈奔放，为爱执著不悔的血性男儿。因天残武祖的奸计而冤屈被囚禁多年！刀法精纯、气势惊天，以一口狮头宝刀、一套狂龙八斩法扬名天下；用情至深，为爱妻慕容婵可堪任何牺牲、甚至一日三千斩亦在所不惜。', 1638028800, 0, 1654605522, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (54, 'lucixin', 'deaa759079f5afa5db84cb3c310e587a', 'zgl7wcisuh4b8p21km3j', 'xj5lw4', '陆慈心', 13800000054, 2, '陆慈心', '/storage/avatars/avatar_256_grye1nzx951638069904.png', 11, 20, 1, '蕙质兰心，让万烛公一见倾心，并与万俟焉修练天火九变，进入天地门探查其中的秘密。后为救师命而进入代刑堡星河殿，被改造为集元师太，沦为三世道君的打手。', 1638028800, 0, 1654605522, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (55, 'feifangongzi', '3cd2a540cf55410b0c141760317c6c9a', '25txr7h1ag0y9iopuj8c', 'xj5lw4', '非凡公子', 13800000055, 1, '非凡公子', '/storage/avatars/avatar_256_1ijl4t63251638069990.png', 11, 20, 1, '身具三教主与魔族的正邪血统，造就非凡公子亦正亦邪的特殊性格。聪明、自负，以初生之犊不畏虎的气势及傲人的智慧武功，居于猜心园中运筹帷幄。之后因刚愎自用，行事尖锐而树敌众多落难流离。', 1638028800, 0, 1654605522, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (56, 'qiluren', 'bbef2b54815574ab62d458d2ee51fee5', '675qpdb4t3islucz0vwy', 'xj5lw4', '崎路人', 13800000056, 1, '崎路人', '/storage/avatars/avatar_256_wkgtz18ysr1638070024.png', 11, 20, 1, '原为集境人士，为追杀仇人灯蝶而偷渡至苦境，是一位具有智慧的领袖型人物，个性风趣巧慧，慎谋能断。身为天虎八将之一，与紫锦囊并肩作战、助导金少爷步入正途；於素还真危难时给予最大支持，为人处世有另一种不凡的手腕，主张该牺牲时就必须有所牺牲。', 1638028800, 0, 0, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (57, 'dengtouren', '7b82ef231028a33fb49a45588ef87d27', 'br02pe4gwlfx8vhc36nt', 'xj5lw4', '灯头人', 13800000057, 1, '灯头人', '/storage/avatars/avatar_256_jvxbm6kz301638070086.png', 11, 20, 1, '照世明灯部属', 1638028800, 0, 1654605522, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (58, 'ouyanglin', '1c8321ad6dd302026a31b4df654adfad', 'r8xk2l1sgoupbdafzhe3', 'xj5lw4', '欧阳麟', 13800000058, 1, '欧阳麟', '/storage/avatars/avatar_256_sab94j7pi51638070162.png', 3, 15, 1, '屈世途外甥', 1638028800, 0, 1654605522, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (59, 'ouyanglin1', 'b053cfba32fe10a074efa02349e7ddfc', 'oi7dswbe4x8nqafjk2v6', 'xj5lw4', '欧阳琳', 13800000059, 2, '欧阳琳', '/storage/avatars/avatar_256_cdltzm76xy1638070664.png', 12, 15, 1, '屈世途外甥女', 1638028800, 0, 1654605522, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (60, 'ouyangling', '33660837c5c54b83b33ebb729316d5c9', 'b6a1537e9r0mtdiqspnh', 'xj5lw4', '欧阳翎', 13800000060, 2, '欧阳翎', '/storage/avatars/avatar_256_3nvka9cp621638070700.png', 12, 15, 1, '为欧阳上智之亲女之一，自幼就到苗疆学艺，面容姣好，却为天下第一智-欧阳世家的杀手。其后因自责流星君之死而自尽。', 1638028800, 0, 1654605522, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (61, 'murongchan', 'af5c03582b46ebbbbdfdab2ef7cde24d', 'eqyohbax72j489fc6lzs', 'xj5lw4', '慕容婵', 13800000061, 2, '慕容婵', '/storage/avatars/avatar_256_pdczfltavn1638070845.png', 13, 13, 1, '个性温和柔顺，温婉秀丽，愿意为所爱之人牺牲一切的女子。曾为了成全其姊而自愿放弃意中人——乱世狂刀，也曾为了父亲的大业而以天行奇侠的模样行走江湖，在几经波折后终于如愿与乱世狂刀退隐。不料当时的武林至尊金小开一声令下而惨亡于乱军中。', 1638028800, 0, 1654605522, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (62, 'fengzhihen', '5f508aecc334cfd601dc28979aa4d093', 'cg4le09ndmf57i6azryj', 'xj5lw4', '风之痕', 13800000062, 1, '风之痕', '/storage/avatars/avatar_256_ijl4xak2s01638070871.png', 13, 13, 1, '魔界传说中的绝代剑者，无人能出其右，平生追求剑术极致，崇尚自由不受拘束，对权力等武林斗争毫无兴趣，创造出“风之痕”与“魔流剑”二种完全截然不同的剑法，一为冷静快意，一为狠野疯狂。', 1638028800, 0, 1654605522, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (63, 'fouleqing', '33f07f3e1dac67bffc32d6601ff5836e', 'g02qz1nxshawecpj48kv', 'xj5lw4', '不了情', 13800000063, 1, '不了情', '/storage/avatars/avatar_256_imgn85hfc71638070906.png', 13, 13, 1, '身坐北阙毡，氅披东皇衣，肩负剑南卷，手捻西冷弦的琴界之人。拥有一幅如画如琴的画弦琴，为好友少年游之遗物，为纪念故友，所以琴又名少年游。人如其名，琴艺高超，看似逍遥方外、个性恬淡，实际上心里却背负着好友少年游死仇。', 1638028800, 0, 1654605528, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (64, 'qiaotiangong', '4b830ba82ed600927fa77f8dc3243e25', 'ryk769xuh2poflnmqet8', 'xj5lw4', '巧天工', 13800000064, 2, '巧天工', '/storage/avatars/avatar_256_mo10dyqwh91638070935.png', 13, 13, 1, '，性情刁蛮古怪、伶牙俐齿，最喜阅耽美书籍。为四大名手之一，铸剑功力堪称一流，更对剑的特性瞭若指掌，头上的发钗拔下后可化为单锋剑。乱世狂刀与沽命师都曾请求其铸造单锋剑，巧天工表面看似刁难狂刀，实则有深意寄托其中，是一介以补天裂铸术闻名的女高手。', 1638028800, 0, 1654605528, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (65, 'luozishang', '288f71f056f89c4a8cb94652ad907400', '6i31t8g0hjsln7qoyk95', 'xj5lw4', '洛子商', 13800000065, 1, '洛子商', '/storage/avatars/avatar_256_7jwk8c2m3a1638070965.png', 13, 13, 1, '忆秋年之高徒，与情人苗飞飞居于玉篱园中，种植花卉与书法修身养性。虽为年少却有不凡的剑术造诣，豁达且不拘小节，与师傅同样乐天开朗，以从容的心态看待天下事物。在剑法舞动中自然流露出一股不受拘束的随性，一如处事玩世不恭、乐观看待世事的潇洒性情。', 1638028800, 0, 1654605528, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (66, 'shengminglianxisheng', '3e733cd1f5e9f2f00adf547abd21395c', 'meg8vcokpulht012di9z', 'xj5lw4', '生命练习生', 13800000066, 1, '生命练习生', '/storage/avatars/avatar_256_tu3wmg4i911638070988.png', 13, 13, 1, '当代用枪之高手，人称枪神，乃为人正直、豪放不羁、直率敢言的热血男儿。看似骄傲，却从不自视甚高，自有一套探索生命的人生哲理。曾在万堺论衡结束后，与剑非道以武比试，两人相互竞争中同也肯定彼此，并结交为友。坚持以生命练习枪法，盼以万千次的练习来达到武道之最，并成为真正的枪者巅峰。', 1638028800, 0, 1654605528, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (67, 'zangjiansheng', '33d2e176d9713cfd9d8ede1d2d803b02', 'v8mzxewypojcqutkb1r9', 'xj5lw4', '藏剑生', 13800000067, 1, '藏剑生', '/storage/avatars/avatar_256_ci4kdn1p2f1638071021.png', 13, 13, 1, '个性内敛温和，对爱情心灰意冷下隐遁于冰寒透骨，眉宇言行之间，总有股抹不去的愁绪，直到收养义女盼梦圆，才让他重拾生命中的温馨亲情。', 1638028800, 0, 1654605528, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (68, 'jianjunshierhen', '722bc505d61f62bc57ff8ce20ea3881a', 'hq9ug325n0dxkc41wv6j', 'xj5lw4', '剑君十二恨', 13800000068, 1, '剑君十二恨', '/storage/avatars/avatar_256_fkt1yxds301638071046.png', 13, 13, 1, '以剑为名、仗剑天涯，一生追求剑的真意，为人重情重义、极富正义感，自然率真、毫不虚伪，乃剑界中傲骨桀然之独行侠客。初入江湖追求天下第一快剑闻名，因得灵啸月引荐成为儒教传人，使原本冷傲性格渐趋圆融、睿智，在相继拜得名师的指点下、和对剑的领悟与执着，让他不断突破自我、为剑攀越顶峰，达到自己心中的完美、体悟最终的剑意。', 1638028800, 0, 1654605528, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (69, 'heibailangjun', '5aeac4083a6e75d0eddc318b7c91e8bb', 'vgoc948jwz1ps72dqefx', 'xj5lw4', '黑白郎君', 13800000069, 1, '黑白郎君', '/storage/avatars/avatar_256_uwkylzf9571638071082.png', 13, 13, 1, '狂傲不羁、极为自负的铮铮铁汉，四处挑战武林中盛名的角色，以别人的失败为快乐，快意恩仇、置生死于度外，有过人的胆识、气魄，乃布袋戏当中最富盛名的角色之一。', 1638028800, 0, 1654605528, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (70, 'gujicanglang', '2156a207b2058cd0f09d087020b43c4b', 'u1scxyimekp89qtrg7zd', 'xj5lw4', '孤迹苍狼', 13800000070, 1, '孤迹苍狼', '/storage/avatars/avatar_256_aefinbrh2v1638071200.png', 13, 13, 1, '西疆皇朝王子，沉默寡言，为神剑守护者。为歼灭魔剑道而积极寻找神剑，不其然遇上昔日应为二娘的月灵公主，牵扯出一段西疆皇朝的故怨。', 1638028800, 0, 1654605528, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (71, 'cuiluohan', '81f81488d891aa7c11892189aaf61b62', 'lz9ansku058c6qxvjgtb', 'xj5lw4', '翠萝寒', 13800000071, 2, '翠萝寒', '/storage/avatars/avatar_256_xyvu7m0asg1638071274.png', 14, 16, 1, '一女剑侠，柔美的外貌下有着刚强直接的性格，好胜有主见，并对自己有兴趣的事物必要探究到底。与同修姊妹居于幽篁秋水，平日喜爱抚琴助兴，被论剑海主席步渊渟赞誉琴律中富含绝美剑意，以及白云邈远之怀。翠萝寒绝学九针剑法乃御剑乘风中，剑气可化九种针刺型态，不仅能成杀人之剑，更可成医人之剑，故被素还真请出，医治倦收天俱断的筋脉。', 1638028800, 0, 1654605528, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (72, 'yefeitian', 'fa8464ebee510b9facc0aa6e39202ee2', 'jhn70bv6xayd1c84tgr9', 'xj5lw4', '夜飞天', 13800000072, 2, '夜飞天', '/storage/avatars/avatar_256_o8twf4xnda1638071313.png', 15, 16, 1, '弓界盛会，天弓狼神台获选之高手，英姿飒爽，不让须眉的冷酷女弓者，能凝泪为冰、冻气成箭，受玄真君的请托，暂时代为守护离愁谷。殊不知，广寒神女夜飞天与涤瑕快剑为旧识，随著涤瑕快剑再现南域，一场身份疑云，引爆多方猜疑。', 1638028800, 0, 1654605528, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (73, 'jianlangya', '116d762be7477a6dfd830a5c4de6d202', '04bpnvs7jdacwoh9rkuq', 'xj5lw4', '剑琅琊', 13800000073, 2, '剑琅琊', '/storage/avatars/avatar_256_7jr1ygith41638071360.png', 14, 16, 1, '锋魔剑上缺之女，是锋魔的唯一传人，剑法高超冷杀，乃幽界之中，非常特殊的流派。集性感、神秘、危险于一身，封于释魔录第三页，为圣母九婴所释放，在天证龙战第一决中，代表幽界出战紫烨疾邪。', 1638028800, 0, 1654605528, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (74, 'dumengjun', '8c4b100a808867ca35587ae0e9658435', 'qr2efgcv39u6dps75mnh', 'xj5lw4', '独梦君', 13800000074, 2, '独梦君', '/storage/avatars/avatar_256_7k2d9q10m81638071384.png', 14, 16, 1, '浪迹江湖的女刀客，英气勃勃，刀法绝伦，为人重情重义，多年来一直在寻找着自己下落不明的妹妹。后因心中的正义感而加入邀月仙阁，欲与红尘雪等众侠女一同铲奸除恶，成为中原正道不可多得的新助力。', 1638028800, 0, 1654605528, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (75, 'fengjiyue', 'fa7fdae413de18520b6e08f534089a32', 'w1bm7hx4i0l352y6n9ea', 'xj5lw4', '风霁月', 13800000075, 2, '风霁月', '/storage/avatars/avatar_256_9137szunx41638071414.png', 14, 16, 1, '身披孔雀衣，手持拨羽炉，足踏凌云靴，风姿清逸，稳重贴心。乃宇宙之牢的主事者之一，同时也是绝代天骄的义妹，曾暗助其离开战云界。因祌天爻帝身体被蜕变类所夺一案，宇宙之牢声誉遭受莫大损害，故而找上意琦行协助。', 1638028800, 0, 1654605528, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (76, 'shuangyefei', 'ad4fee6b7b1c1a43b8034f82cdec83bd', '4eru2w0bdyz5jon9mk8p', 'xj5lw4', '霜叶飞', 13800000076, 2, '霜叶飞', '/storage/avatars/avatar_256_irw36xkup71638071446.png', 14, 16, 1, '玉手九针的同修姊妹，与翠萝寒、闻琴语居于幽篁秋水，排行老二，心思较为细腻、体贴，常替翠萝寒先接待外来客人。霜叶飞真实身分为赫墨族人穆倾雪，因违反族规与东方印生下一子，尔后离开赫墨族，以霜叶飞身分自居。然而在盲虬找到母亲欲相认的当下，也让霜叶飞的内心产生巨大冲击与纠结。', 1638028800, 0, 1654605528, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (77, 'wenqinyu', '8e39fea5b7ba788487776a3ba2f2a1f3', 'kqxotyij46m5rn80lf9z', 'xj5lw4', '闻琴语', 13800000077, 2, '闻琴语', '/storage/avatars/avatar_256_7vf0tgu2cr1638071467.png', 14, 16, 1, '玉手九针的同修姊妹，与翠萝寒、霜叶飞居于幽篁秋水，是三人中最年长的，故排行老大，并习有剑艺。闻琴语性格在三姊妹中属较冲动，容易与外来者起冲突，并会为两姊妹出头，十分外放且有身为大姐应具备的责任心。', 1638028800, 0, 1654605528, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (78, 'cuihousheng', '73f2129d66e8ffb8e241abb5f4c75a49', '35bf4y1avjzxtcw0oe7s', 'xj5lw4', '翠厚生', 13800000079, 1, '翠厚生', '/storage/avatars/avatar_256_938fgix2sc1638071496.png', 14, 16, 1, '天生一对招风耳，戴着大大的眼镜，自小到大备受呵护，生性善良单纯，对世事充满好奇心，老实的个性也为自己带来鸿运，常常有意外的收获。喜欢发明创造，同时相当崇拜亲姊翠萝寒的武艺和果敢，更向往着外头的世界，希望能用自己的力量为纷乱的江湖带来和平安乐', 1638028800, 0, 1654605528, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (79, 'feiyuyuanji', '00f9bf7cbcb733c352d6effb95c58472', 'hzxwn5icuybt9aosr8p4', 'xj5lw4', '绯羽怨姬', 13800000080, 1, '绯羽怨姬', '/storage/avatars/avatar_256_8qakfnvtr61638071536.png', 14, 16, 1, '深居灵蛊山的女医者，精通医蛊毒，容貌绝艳唯美，个性温柔纤细，对人无心机，内心却是刚毅坚持。情感纯真，对爱始终不渝，长年守在月华树下，只为等待约定之人。', 1638028800, 0, 1654605528, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (80, 'xiaoshuixian', 'b431cb24ae1cb9908b2a7a107989322f', 'ehz3jlabfq1vnkpwd8o9', 'xj5lw4', '小水仙', 13800000081, 1, '小水仙', '/storage/avatars/avatar_256_fsk7382wv41638071589.png', 15, 16, 1, '麒麟阁蓬瀛小三仙之一，系琴狐大人精心栽培的女侦探，暗中似有其他身份，在南域为琴狐搜集各路情报。小水仙本性善良，机智聪慧，擅长易容，是琴狐大人最佳左右手，风云儿更对她心仪已久，但小水仙内心，却另有一段憧憬已久的故事。', 1638028800, 0, 1654605528, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (81, 'sixuanying', 'a1d85e73d8346626e6c718a0a91b786f', 'irpecz5xh0ofg3ktmuw8', 'xj5lw4', '姒玄英', 13800000082, 1, '姒玄英', '/storage/avatars/avatar_256_y8sm9xvhwl1638071635.png', 15, 16, 1, '凌虚七仙排行第四，彬彬有礼的修真女道，专长是炼丹，曾出掌帮助风云儿恢复，并在前往中土采药时，意外救了琴狐和小水仙。负责守护天窍秘境的入口，对七仙无论长幼，皆十分有礼，是个识大体，和蔼的女道者。', 1638028800, 0, 1654605528, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (82, 'xianzongwuming', 'a61b68e2cddc71cd74616f792ee5eb44', 'ub3tnyog2hz86qlk9x1i', 'xj5lw4', '仙踪无名', 13800000083, 1, '仙踪无名', '/storage/avatars/avatar_256_yfircomeaw1638071664.png', 15, 16, 1, '仙道双修，儒风道骨之超凡者，头戴珠玉冠，身背君子玉剑，手握玦玉麈，御仙兽从天而降，以仙踪无名为号，行走武林。为追查被盗的真龙之血，现临北海灵洲寰宇斗奇之争，当昊天身亡一案成为焦点时，仙踪看穿天魔灵车之秘，一掌逼出背后的阴谋家！', 1638028800, 0, 1654605528, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (83, 'shaziyan', 'c8ddeada82178d9c9d59041831428aa1', 'qf0l1pgknhw9udtmasez', '', '刹紫烟', 13800000084, 2, '刹紫烟', '/storage/avatars/avatar_256_5be3lky96u1638071700.png', 14, 16, 1, '姹紫嫣受后狨改造，成为性格冷酷如冰的女杀手「刹紫烟」，一反从前温柔亲善的性格，已是完全截然相反的两个人，对于过去的回忆再记不得半点，而自认为是「圣堂之子」。在独梦君的奔走与寄飞龙的帮助下终于重拾自我，拜寄飞龙为师，加入侠音剑鸣，共抗猂族。', 1638028800, 0, 1654605533, 1639218445, 2, '59.109.145.140', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (84, 'lingboying', '624a4456358fcaff765c997d38c51484', '1y2k745nxrqbzpoijdth', 'xj5lw4', '凌波影', 13800000085, 2, '凌波影', '/storage/avatars/avatar_256_wnzslqxyea1638071737.png', 15, 16, 1, '性格直爽明快，听从红尘雪之命令，曾与鸳鸯镜一同奉命帮助害怕蜘蛛的生命练习生解围。习有红尘雪翩单锋之奥义，平日与鸳鸯镜保护清幽的倚晴江山楼，只有能破两人所布阵法之能人才得以进入。', 1638028800, 0, 1654605533, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (85, 'yuanyangjing', '7bc8656f70d684264405b1e01a92f489', '1rxloe5f8qh24jpvw6d3', 'xj5lw4', '鸳鸯镜', 13800000086, 2, '鸳鸯镜', '/storage/avatars/avatar_256_s4h7op3dir1638071759.png', 15, 16, 1, '看似温柔婉约、亭亭玉立，却又藏有小聪明的幽默性格，在红尘雪不知情的情况下，常将其所撰写的著作稍作修改，并发行于市面上，与凌波影一样习有红尘雪翩单锋奥义，替红尘雪控管进入倚晴江山楼之人。', 1638028800, 0, 1654605533, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (86, 'jilingyuan', '328cd6897b688f98611b0ea799c7bbeb', '2nexvd06q8hg7p1yblj4', 'xj5lw4', '脊令原', 13800000087, 1, '脊令原', '/storage/avatars/avatar_256_9g7z5x2fiw1638071831.png', 15, 16, 1, '天子枪的代理人，个性忠诚不二，驻守在问天道，肩负守护天子枪的修行之地，不许他人侵犯。因红尘雪指点，解锋镝踏入问天道，一问玉梁皇与枪界始末，却因此暴露问天道所在，遭六道神兵府杀手闯入。', 1638028800, 0, 1654605533, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (87, 'guxinglei', 'ec9826c3ecde12f359805e7fc8172257', '5346maipghbxurknoysz', 'xj5lw4', '孤星泪', 13800000088, 1, '孤星泪', '/storage/avatars/avatar_256_cxdp8y54901638071856.png', 15, 16, 1, '枪界中最神秘的百步银邪枪，有枪中弑神之称。年幼时曾经历过极端惨事，以致心性孤寂、离群索居，总是于满木枯黄的落叶纷飞中现身，沉默不语，散发出萧瑟、悲怆气息。幼年时曾为邪天子所救，两人也因此建立了深厚友情。', 1638028800, 0, 1654605533, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (88, 'fengxiuzhuren', '4647a5c7b8e6f899bb1f5d139e6fe1df', '8kvmrhg1lzn0dapiybcw', '', '枫岫主人', 13800000089, 1, '枫岫主人', '/storage/avatars/avatar_256_svkcxjeuzg1638499532.png', 2, 17, 1, '', 1638460800, 0, 1654605533, 1653749723, 3, '112.97.53.133', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (89, 'yiyeshu1', '19fd0fa02442e56440a8456c21a741c4', 'm94thsriaoflkuvqe6y0', '', '一页书', 13431029299, 1, '一页书', '/storage/avatars/avatar_256_kzhe8m6qv11639531878.png', 9, 19, 1, '', 1639497600, 0, 1654605533, 1653216214, 4, '123.121.15.64', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (90, 'chengyuan', '58dbc0c50dd5bc87d84ee0810fac4336', '9ak2gfxqwn3e1vc8m0dp', '4rhmgz', '成员', 13800017077, 1, '成员', '/storage/avatars/avatar_256_43exjalchv1644418627.png', 11, 17, 1, '', 1644336000, 0, 1653317342, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (91, 'jiwuyou', 'd67112f31a5663408eb9b500bef7672c', 'zd03hjgrsqnpflv98o4y', 'nl5wy7', '纪无忧', 13688885588, 1, '纪无忧', '/storage/avatars/avatar_256_l3rcn5jvds1644564104.png', 5, 19, 1, '', 1644508800, 0, 1654605533, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (92, 'chengyuan1', '889ed153a547b54aa02e42f5443af27c', '7np5fu0qvzlighwt234m', 'o6bvd9', '成员', 13431029268, 1, '成员', '/storage/avatars/avatar_256_p4aw2mvfq51644564462.png', 3, 10, 1, '', 1644508800, 0, 1654605533, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (93, 'chenxiansheng', '39e8c7fdb822d420f483f360e0f73aac', 'lzinm673ca1gvx5jk08f', '8j0x24', '陈先生', 13188889999, 1, '陈先生', '/storage/202202/6ede2edc3733c179c058ff551b75cea2.jpg', 4, 2, 1, '', 1644508800, 0, 1654605533, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (94, 'chengyuanta', '1682d4b6c031413f122f91ec52c6ca15', 'onjchf8ktazwevyqx4g7', '5livjc', '成员塔', 13801017077, 1, '成员塔', '/storage/avatars/avatar_256_rvqyw48xie1644566270.png', 4, 2, 2, '', 1644595200, 0, 1653317342, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (95, 'zhangsan', '250e9978075e1d58b271332c0d7f4508', 'joc58d4zsf6r1pga9ku2', 'n6sijw', '张三', 13100007890, 1, '张三', '/storage/avatars/avatar_256_yvklf2dqeb1644644566.png', 10, 5, 1, '', 1644595200, 0, 1654605533, 1652853764, 1, '123.233.120.51', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (96, 'yexiaoming', '8f0accba37aba0131f62ba4de36f61b6', '7uq4lzmw3fd0s6thacby', '198e5p', '叶晓明', 15878858985, 1, '叶晓明', '/storage/avatars/avatar_256_uf0ok5ya2e1644764303.png', 4, 19, 1, '', 1644508800, 0, 1654648174, 1654648199, 6, '27.18.3.107', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (97, 'liudehua', 'bce50f0d57f4261c27b69fab374d2f7d', 'nph6mv7kyb9r4cfqz1el', 'kvu64n', '刘德华', 13888888888, 1, '刘德华', '/storage/avatars/avatar_256_65cdrgw1xn1646098440.png', 8, 6, 1, '', 1646064000, 0, 1654605533, 1646098499, 2, '222.160.12.90', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (98, 'lingxinyifu', 'b22607cf23abf9d3820cdbdf3b178674', '63lgsu2ekwbymr1jnd8c', '', '灵心异佛', 18712397319, 2, '灵心异佛', '/storage/avatars/avatar_256_r72oklzdnh1651203522.png', 1, 2, 2, '', 1649347200, 0, 1654605533, 1651720472, 2, '59.53.226.39', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (99, 'zhangsan1', '9aad77efa829c28c176a32718a61dc48', 'fi3b7ngd1chkj6pvs0l4', 'b0k8ct', '张三', 15345678911, 1, '张三', '/storage/avatars/avatar_256_0wfq4cs8ae1652701118.png', 3, 5, 2, '', 1652630400, 0, 1654605533, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (100, 'yizhi', 'd2235b59b363b5cb351b6168c62b0fce', 'oyc89jxzvn7med4h5kb0', 'c935dg', '一直', 13457777890, 1, '一直', '/storage/avatars/avatar_256_m4r0n6uf181653103044.png', 10, 18, 1, '', 1651593600, 0, 1654605533, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (101, 'shangsan', '7c7da3090357a318bfce786d7542db06', '47k2t56xgmzfh8v9pouj', 'edn8ma', '上三', 19191919191, 1, '上三', '/storage/202205/20c5e2504b1fd8ed543f942a1a37dc60.jpg', 1, 3, 3, '...', 1653235200, 0, 1654605533, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (102, 'zhangsan2', 'd2d275270e3e5a9d7d33c63c96c4c077', 'dbfxap0ql83tskyrewui', 's7qc6a', '张三', 13602482680, 2, '张三', '/storage/avatars/avatar_256_ie6polgwsm1653468697.png', 3, 4, 1, '', 1653408000, 0, 1654605533, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (103, 'zhangsan3', '102c10c70430b21450b737d0fc97ee26', '1m58dfrag2shql6b0cpw', 'v9q7m8', '张三', 13688888228, 1, '张三', '/storage/avatars/avatar_256_y9jdgpraot1653468730.png', 1, 5, 2, '', 1653408000, 0, 1654605533, 0, 0, '', 1);
+INSERT INTO `oa_admin`(`id`, `username`, `pwd`, `salt`, `reg_pwd`, `name`, `mobile`, `sex`, `nickname`, `thumb`, `did`, `position_id`, `type`, `desc`, `entry_time`, `create_time`, `update_time`, `last_login_time`, `login_num`, `last_login_ip`, `status`) VALUES (104, 'ceshiyuangong', '30a58d123f372b6006bae874cdb2e4a3', 'qusxd4b98r6kh0jcvigo', '', '测试员工', 13300000001, 0, '测试员工', '/storage/avatars/avatar_256_3jy6lrbikq1654012653.png', 11, 8, 1, '', 1653926400, 0, 1654605533, 1654842444, 3, '27.36.90.63', 1);
diff --git a/app/install/validate/InstallCheck.php b/app/install/validate/InstallCheck.php
new file mode 100644
index 0000000000000000000000000000000000000000..b60eb69e31421b16ef15b884c47d323d8d54795b
--- /dev/null
+++ b/app/install/validate/InstallCheck.php
@@ -0,0 +1,49 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\install\validate;
+
+use think\Validate;
+
+class InstallCheck extends Validate
+{
+    protected $rule = [
+        'DB_TYPE' => 'require|eq:mysql',
+        'DB_HOST' => 'require',
+        'DB_PORT' => 'require',
+        'DB_USER' => 'require',
+        'DB_PWD' => 'require',
+        'DB_NAME' => 'require',
+        'DB_PREFIX' => 'require',
+        'username' => 'require',
+        'password' => 'require|confirm',
+    ];
+
+    protected $message = [
+        'DB_TYPE.require' => '数据库类型不能为空',
+        'DB_TYPE.eq' => '数据库类型固定为mysql',
+        'DB_HOST.require' => '数据库地址不能为空',
+        'DB_PORT.require' => '数据库端口不能为空',
+        'DB_USER.require' => '数据库用户名不能为空',
+        'DB_PWD.require' => '数据库密码不能为空',
+        'DB_NAME.require' => '数据库名字不能为空',
+        'DB_PREFIX.require' => '表前缀不能为空',
+        'username.require' => '管理员账户不能为空',
+        'password.require' => '密码不能为空',
+        'password.confirm' => '两次密码不一致',
+    ];
+
+    protected $scene = [
+
+    ];
+}
diff --git a/app/install/view/index/step1.html b/app/install/view/index/step1.html
new file mode 100644
index 0000000000000000000000000000000000000000..4d958a2ad070b61eb36b78a6c9a085eb433c6a3d
--- /dev/null
+++ b/app/install/view/index/step1.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+	<meta charset="utf-8">
+	<title>勾股OA安装</title>
+	<meta name="renderer" content="webkit">
+	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+	<link rel="stylesheet" href="{__GOUGU__}/layui/css/layui.css" media="all">
+	<style>
+		body {
+			width: 100%;
+			height: 100%;
+			background: url("{__IMG__}/bg.jpg");
+			background-size: cover;
+			background: url("{__IMG__}/bg_pattern.png"), #7b4397;
+			background: url("{__IMG__}/bg_pattern.png"), -webkit-linear-gradient(to left, #34a853, #4285f4);
+			background: url("{__IMG__}/bg_pattern.png"), linear-gradient(to left, #34a853, #4285f4);
+		}
+	</style>
+</head>
+
+<body>
+	<div style="width:200px;margin: 20px auto;"><img src="{__IMG__}/syslogo.png" alt="勾股OA安装" width="300"></div>
+	<div style="width:888px;margin:0 auto 30px;">
+		<div class="layui-layout layui-layout-admin">
+			<div class="layui-header layui-bg-red" style="border-radius:6px 6px 0 0; position:relative;">
+				<div class="layui-logo" style="color: #fff; width:100px;">安装引导</div>
+				<ul class="layui-nav layui-layout-right">
+					<li class="layui-nav-item">v{:CMS_VERSION}</li>
+				</ul>
+			</div>
+			<div style="padding:20px; background-color:#fff;line-height: 27px; border-radius:0 0 6px 6px">
+				<p>勾股OA是一套基于ThinkPHP{$TP_VERSION} + Layui{:LAYUI_VERSION} + MySql打造的轻量级、高性能OA办公系统。简单实用,系统集成了十二大办公基本的功能模块：系统管理、基础数据、员工管理、消息通知、企业公告、知识文章、办公审批、日常办公、财务管理、客户管理、合同管理、项目管理等基础模块。系统易于功能扩展，方便二次开发，让开发者更专注于业务深度需求的开发，帮助开发者简单高效降低二次开发成本，通过二次开发之后可以用来做CRM，ERP，业务管理等系统。<br><br>
+					<strong>有限担保和免责声明：</strong><br>
+					1、本软件及所附带的文件是作为不提供任何明确的或隐含的赔偿或担保的形式提供的。<br>
+					2、用户出于自愿而使用本软件，您必须了解使用本软件的风险。<br>
+					3、我们不承诺提供任何形式的技术支持、使用担保，也不承担任何因使用本软件而产生问题的相关责任。<br>
+					4、使用本软件构建的网站系统的任何信息内容以及导致的任何版权纠纷和法律争议及后果，本系统不承担任何责任。<br>
+					5、您一旦安装使用本软件，即被视为完全理解并接受本协议的各项条款，在享有上述条款授予的权力的同时，受到相关的约束和限制。
+				</p>
+				<div style="margin:10px auto;width: 90px;">
+					<a href="/index.php?s=install/index/step2" class="layui-btn layui-bg-blue">接受协议</a>
+				</div>
+			</div>
+		</div>
+	</div>
+	<script src="{__GOUGU__}/layui/layui.js" charset="utf-8"></script>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/app/install/view/index/step2.html b/app/install/view/index/step2.html
new file mode 100644
index 0000000000000000000000000000000000000000..0ec84b6ea08d1f129ed7ef55acc5d4983b383219
--- /dev/null
+++ b/app/install/view/index/step2.html
@@ -0,0 +1,210 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+	<meta charset="utf-8">
+	<title>勾股OA安装</title>
+	<meta name="renderer" content="webkit">
+	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+	<link rel="stylesheet" href="{__GOUGU__}/layui/css/layui.css" media="all">
+	<style>
+		body {
+			width: 100%;
+			height: 100%;
+			background: url("{__IMG__}/bg.jpg");
+			background-size: cover;
+			background: url("{__IMG__}/bg_pattern.png"), #7b4397;
+			background: url("{__IMG__}/bg_pattern.png"), -webkit-linear-gradient(to left, #34a853, #4285f4);
+			background: url("{__IMG__}/bg_pattern.png"), linear-gradient(to left, #34a853, #4285f4);
+		}
+	</style>
+</head>
+
+<body>
+	<div style="width:200px;margin: 20px auto;"><img src="{__IMG__}/syslogo.png" alt="勾股OA安装" width="300"></div>
+	<div style="width:888px;margin:0 auto 30px;">
+		<div class="layui-layout layui-layout-admin">
+			<div class="layui-header layui-bg-red" style="border-radius:6px 6px 0 0;position:relative;">
+				<div class="layui-logo" style="color: #fff; width:100px;">安装引导</div>
+				<ul class="layui-nav layui-layout-right">
+					<li class="layui-nav-item">v{:CMS_VERSION}</li>
+				</ul>
+			</div>
+			<div style="padding:20px; background-color:#fff;line-height: 27px; border-radius:0 0 6px 6px">
+				<h3>安装环境检测</h3>
+				<table class="layui-table" lay-skin="nob" lay-size="sm">
+					<colgroup>
+						<col width="150">
+						<col width="200">
+						<col width="200">
+						<col width="100">
+						<col>
+					</colgroup>
+					<thead>
+						<tr>
+							<th>环境</th>
+							<th>最低配置</th>
+							<th>当前配置</th>
+							<th>是否符合</th>
+						</tr>
+					</thead>
+					<tbody>
+						<tr>
+							<td>操作系统</td>
+							<td>不限</td>
+							<td>
+								<?php echo php_uname('s'); ?>
+							</td>
+							<td class="yes"><i class="layui-icon layui-icon-ok"></i></td>
+						</tr>
+						<tr>
+							<td>php版本</td>
+							<td>≥ 8.0</td>
+							<td>
+								<?php echo PHP_VERSION ?>
+							</td>
+							<?php $php_version=explode('.', PHP_VERSION); ?>
+							<td class="<?php if(($php_version['0']>=8))echo 'yes'; ?>">
+								<?php if (($php_version['0']>=8)): ?>
+								<i class="layui-icon layui-icon-ok"></i>
+								<?php else: ?>
+								<i class="layui-icon layui-icon-close"></i>
+								<?php endif ?>
+							</td>
+						</tr>
+					</tbody>
+				</table>
+				<h3>模块检测</h3>
+				<table class="layui-table" lay-skin="nob" lay-size="sm">
+					<colgroup>
+						<col width="150">
+						<col width="200">
+						<col width="200">
+						<col width="100">
+						<col>
+					</colgroup>
+					<thead>
+						<tr>
+							<th>环境</th>
+							<th>最低配置</th>
+							<th>当前配置</th>
+							<th>是否符合</th>
+						</tr>
+					</thead>
+					<tbody>
+						<tr>
+							<td>session</td>
+							<td>支持</td>
+							<td>{eq name="$data.session" value="1"}支持{else /}不支持{/eq}</td>
+							<td><i class="layui-icon {eq name=" $data.session" value="1" }layui-icon-ok yes{else
+									/}layui-icon-close{/eq}">
+								</i> </td>
+						</tr>
+						<tr>
+							<td>PDO</td>
+							<td>开启</td>
+							<td>{eq name="$data.pdo" value="1"}已开启{else /}未开启{/eq}</td>
+							<td><i class="layui-icon {eq name=" $data.pdo" value="1" }layui-icon-ok yes{else
+									/}layui-icon-close{/eq}"> </i>
+							</td>
+						</tr>
+						<tr>
+							<td>PDO_Mysql</td>
+							<td>开启</td>
+							<td>{eq name="$data.pdo_mysql" value="1"}已开启{else /}未开启{/eq}</td>
+							<td><i class="layui-icon {eq name=" $data.pdo_mysql" value="1" }layui-icon-ok yes{else
+									/}layui-icon-close{/eq}"> </i> </td>
+						</tr>
+						<tr>
+							<td>上传限制</td>
+							<td>≥ 2M</td>
+							<td>{eq name="$data.upload_size" value="0"}不支持{else /}{$data.upload_size}{/eq}</td>
+							<td><i class="layui-icon {eq name=" $data.upload_size" value="0" }layui-icon-close{else
+									/}layui-icon-ok yes{/eq}">
+								</i> </td>
+						</tr>
+					</tbody>
+				</table>
+				<h3>目录权限</h3>
+				<table class="layui-table" lay-skin="nob" lay-size="sm">
+					<colgroup>
+						<col width="150">
+						<col width="200">
+						<col width="200">
+						<col width="100">
+						<col>
+					</colgroup>
+					<thead>
+						<tr>
+							<th>环境</th>
+							<th>最低配置</th>
+							<th>当前配置</th>
+							<th>是否符合</th>
+						</tr>
+					</thead>
+					<tbody>
+						<tr>
+							<td>config</td>
+							<td>可写</td>
+							<td>
+								<?php if (is_writable(CMS_ROOT . 'config')): ?>
+								可写
+								<?php else: ?>
+								不可写
+								<?php endif ?>
+							</td>
+							<td class="<?php if(is_writable(CMS_ROOT . 'config'))echo 'yes'; ?>">
+								<?php if (is_writable(CMS_ROOT . 'config')): ?>
+								<i class="layui-icon layui-icon-ok"></i>
+								<?php else: ?>
+								<i class="layui-icon layui-icon-close"></i>
+								<?php endif ?>
+							</td>
+						</tr>
+						<tr>
+							<td>/storage</td>
+							<td>可写</td>
+							<td>
+								<?php if (is_writable('./storage')): ?>
+								可写
+								<?php else: ?>
+								不可写
+								<?php endif ?>
+							</td>
+							<td class="<?php if(is_writable('./storage'))echo 'yes'; ?>">
+								<?php if (is_writable('./storage')): ?>
+								<i class="layui-icon layui-icon-ok"></i>
+								<?php else: ?>
+								<i class="layui-icon layui-icon-close"></i>
+								<?php endif ?>
+							</td>
+						</tr>
+					</tbody>
+				</table>
+				<div style="margin:10px auto;width: 190px;">
+					<a href="/index.php?s=install/index/index" class="layui-btn layui-bg-cyan">上一步</a>
+					<a href="javascript:;" class="layui-btn layui-bg-blue" id="step2">下一步</a>
+				</div>
+			</div>
+		</div>
+	</div>
+
+	<script src="{__GOUGU__}/layui/layui.js" charset="utf-8"></script>
+	<script>
+		layui.use(['jquery', 'layer'], function () {
+			var $ = layui.jquery,
+				layer = layui.layer;
+			$('#step2').click(function () {
+				if ($('.yes').length != 8) {
+					layer.tips('您的配置或权限不符合要求', this);
+				} else {
+					location.href = "/index.php?s=install/index/step3";
+				}
+			})
+
+		});
+	</script>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/app/install/view/index/step3.html b/app/install/view/index/step3.html
new file mode 100644
index 0000000000000000000000000000000000000000..5312cfbf8dfbd017166f112380f126a3fffa37e2
--- /dev/null
+++ b/app/install/view/index/step3.html
@@ -0,0 +1,174 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+	<meta charset="utf-8">
+	<title>勾股OA安装</title>
+	<meta name="renderer" content="webkit">
+	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+	<link rel="stylesheet" href="{__GOUGU__}/layui/css/layui.css" media="all">
+	<style>
+		body {
+			width: 100%;
+			height: 100%;
+			background: url("{__IMG__}/bg.jpg");
+			background-size: cover;
+			background: url("{__IMG__}/bg_pattern.png"), #7b4397;
+			background: url("{__IMG__}/bg_pattern.png"), -webkit-linear-gradient(to left, #34a853, #4285f4);
+			background: url("{__IMG__}/bg_pattern.png"), linear-gradient(to left, #34a853, #4285f4);
+		}
+		.layui-form-item{margin-bottom:10px;}
+		h3{padding-bottom:10px; font-weight:600;}
+	</style>
+</head>
+
+<body>
+	<div style="width:200px;margin: 20px auto;"><img src="{__IMG__}/syslogo.png" alt="勾股OA安装" width="300"></div>
+	<div style="width:888px;margin:0 auto 30px;">
+		<div class="layui-layout layui-layout-admin">
+			<div class="layui-header layui-bg-red" style="border-radius:6px 6px 0 0;position:relative;">
+				<div class="layui-logo" style="color: #fff; width:100px;">安装引导</div>
+				<ul class="layui-nav layui-layout-right">
+					<li class="layui-nav-item">v{:CMS_VERSION}</li>
+				</ul>
+			</div>
+			<div style="padding:15px 20px; background-color:#fff;line-height: 27px; border-radius:0 0 6px 6px">
+				<form class="layui-form" action="" id="form">
+					<h3>数据库配置</h3>
+					<div class="layui-form-item">
+						<label class="layui-form-label">数据库类型</label>
+						<div class="layui-input-inline">
+							<input type="text" name="DB_TYPE" required lay-verify="required" autocomplete="off" class="layui-input" value="mysql" disabled="disabled">
+						</div>
+						<div class="layui-form-mid layui-word-aux">固定为mysql，不可更改</div>
+					</div>
+					<div class="layui-form-item">
+						<label class="layui-form-label">数据库地址</label>
+						<div class="layui-input-inline">
+							<input type="text" name="DB_HOST" required lay-verify="required" autocomplete="off" class="layui-input" value="127.0.0.1" lay-reqText="请输入数据库地址">
+						</div>
+						<div class="layui-form-mid layui-word-aux">数据库服务器地址，一般为127.0.0.1</div>
+					</div>
+					<div class="layui-form-item">
+						<label class="layui-form-label">数据库端口</label>
+						<div class="layui-input-inline">
+							<input type="text" name="DB_PORT" required lay-verify="required" autocomplete="off" class="layui-input" value="3306" lay-reqText="请输入数据库端口">
+						</div>
+						<div class="layui-form-mid layui-word-aux">数据库端口，一般为3306</div>
+					</div>
+					<div class="layui-form-item">
+						<label class="layui-form-label">数据库名</label>
+						<div class="layui-input-inline">
+							<input type="text" name="DB_NAME" required lay-verify="required" autocomplete="off" class="layui-input" value="oa" lay-reqText="请输入数据库名">
+						</div>
+						<div class="layui-form-mid layui-word-aux">系统数据库名,必须包含字母,不能有"-"等特殊符号</div>
+					</div>
+					<div class="layui-form-item">
+						<label class="layui-form-label">用户名</label>
+						<div class="layui-input-inline">
+							<input type="text" name="DB_USER" required lay-verify="required" autocomplete="off" class="layui-input" value="root" lay-reqText="请输入数据库用户名">
+						</div>
+						<div class="layui-form-mid layui-word-aux">连接数据库的用户名</div>
+					</div>
+					<div class="layui-form-item">
+						<label class="layui-form-label">密码</label>
+						<div class="layui-input-inline">
+							<input type="password" name="DB_PWD" required lay-verify="required" autocomplete="off" class="layui-input" lay-reqText="请输入数据库连接密码">
+						</div>
+						<div class="layui-form-mid layui-word-aux">连接数据库的密码</div>
+					</div>
+					<div class="layui-form-item">
+						<label class="layui-form-label">表前缀</label>
+						<div class="layui-input-inline">
+							<input type="text" name="DB_PREFIX" required lay-verify="required" autocomplete="off" class="layui-input" value="oa_" lay-reqText="请输入数据库表前缀">
+						</div>
+						<div class="layui-form-mid layui-word-aux">建议使用默认，同一个数据库安装多个系统时需更改，否则会覆盖</div>
+					</div>
+
+					<hr>
+					<h3>管理员配置</h3>
+					<div class="layui-form-item">
+						<label class="layui-form-label">管理员账号</label>
+						<div class="layui-input-inline" style="width:150px;">
+							<input type="text" name="username" lay-verify="required" autocomplete="off" class="layui-input" lay-reqText="请输入管理员账户">
+						</div>
+						<label class="layui-form-label">登录密码</label>
+						<div class="layui-input-inline" style="width:150px;">
+							<input type="password" name="password" lay-verify="required" autocomplete="off" class="layui-input" lay-reqText="请输入管理员账户密码">
+						</div>
+						<label class="layui-form-label">确认密码</label>
+						<div class="layui-input-inline" style="width:150px;">
+							<input type="password" name="password_confirm" lay-verify="required" autocomplete="off" class="layui-input" lay-reqText="请重复输入管理员账户密码">
+						</div>
+					</div>
+					<div style="padding:10px 0">
+						<div class="layui-progress layui-progress-big" lay-showpercent="true" lay-filter="demo" style="display: none;" id="progress">
+							<div class="layui-progress-bar layui-bg-blue" lay-percent="0%"></div>
+						</div>
+					</div>
+
+					<div class="layui-form-item">
+						<div style="margin:10px auto; width: 190px;">
+							<a href="/index.php?s=install/index/step2" class="layui-btn layui-bg-cyan">上一步</a>
+							<button class="layui-btn layui-bg-blue" lay-submit="" lay-filter="install" id="install">安装系统</button>
+						</div>
+					</div>
+				</form>
+			</div>
+		</div>
+	</div>
+
+	<script src="{__GOUGU__}/layui/layui.js" charset="utf-8"></script>
+	<script>
+		layui.use(['element', 'jquery', 'layer', 'form'], function () {
+			var $ = layui.jquery,
+				layer = layui.layer,
+				form = layui.form,
+				element = layui.element;
+			var n = 0;
+			//监听提交
+			form.on('submit(install)', function (data) {
+				$('#progress').css('display', 'block');
+				let n=0;
+				var timer = setInterval(function () {
+					n = n + Math.random() * 10 | 0;
+					if (n > 99) {
+						n = 99;
+						clearInterval(timer);
+					}
+					element.progress('demo', n + '%');
+				}, 200 + Math.random() * 100);
+				$("#install").html(n);
+				$.ajax({
+					url: "/index.php?s=install/index/install",
+					type: "post",
+					data: data.field,
+					beforeSend: function () {
+						// 禁用按钮防止重复提交
+						$("#install").attr({disabled: "disabled"}).html('安装中...');
+					},
+					success: function (res) {
+						clearInterval(timer);
+						if (res.code == 1) {
+							$('#progress').css('display', 'none');
+							layer.msg(res.msg);
+						} else {
+							element.progress('demo', 100 + '%');
+							setTimeout(function(){
+								window.location.href='/index.php?s=install/index/step4';
+							},400);
+							return false;
+						}
+					},
+					complete: function () {
+						clearInterval(timer);
+						$("#install").removeAttr("disabled").html('安装系统');
+					}
+				})
+				return false;
+			});
+		});
+	</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/app/install/view/index/step4.html b/app/install/view/index/step4.html
new file mode 100644
index 0000000000000000000000000000000000000000..5bfb7d0403eeed04383a79d6cafb662ddfa351a3
--- /dev/null
+++ b/app/install/view/index/step4.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+	<meta charset="utf-8">
+	<title>勾股OA安装</title>
+	<meta name="renderer" content="webkit">
+	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+	<link rel="stylesheet" href="{__GOUGU__}/layui/css/layui.css" media="all">
+	<style>
+		body {
+			width: 100%;
+			height: 100%;
+			background: url("{__IMG__}/bg.jpg");
+			background-size: cover;
+			background: url("{__IMG__}/bg_pattern.png"), #7b4397;
+			background: url("{__IMG__}/bg_pattern.png"), -webkit-linear-gradient(to left, #34a853, #4285f4);
+			background: url("{__IMG__}/bg_pattern.png"), linear-gradient(to left, #34a853, #4285f4);
+		}
+		.layui-form-item{margin-bottom:10px;}
+		h3{padding-bottom:10px; font-weight:600;}
+	</style>
+</head>
+
+<body>
+	<div style="width:200px;margin: 20px auto;"><img src="{__IMG__}/syslogo.png" alt="勾股OA安装" width="300"></div>
+	<div style="width:888px;margin:0 auto 30px;">
+		<div class="layui-layout layui-layout-admin">
+			<div class="layui-header layui-bg-red" style="border-radius:6px 6px 0 0;position:relative;">
+				<div class="layui-logo" style="color: #fff; width:100px;">安装引导</div>
+				<ul class="layui-nav layui-layout-right">
+					<li class="layui-nav-item">v{:CMS_VERSION}</li>
+				</ul>
+			</div>
+			<div style="padding:15px 20px; background-color:#fff;line-height: 27px; border-radius:0 0 6px 6px">
+				<div style="padding: 20px 0; text-align: center;" id="complete">
+					<h1>恭喜，已安装完成!</h1><br><br>
+					<div style="color:red; font-size:16px;">你已经安装好勾股OA系统！如需重新安装，请删除“config/install.lock”文件</div>
+					<br>
+					<div style="color:red; font-size:16px;">注意：如果出现页面无法访问，请注意把ThinkPHP的伪静态配置好。<a href="https://blog.gougucms.com/home/book/detail/bid/2/id/6.html" target="_blank" class="layui-btn layui-btn-xs layui-bg-blue">更多问题</a></div>
+					<br><br><br>
+					<a href="/" target="_blank" class="layui-btn layui-bg-green">开始体验</a>
+				</div>
+			</div>
+		</div>
+	</div>
+
+	<script src="{__GOUGU__}/layui/layui.js" charset="utf-8"></script>
+	<script>
+		var url = "{$domain|default='http://www.gougucms.com'}";
+		layui.use(['element', 'jquery', 'layer', 'form'], function () {
+			var $ = layui.jquery;
+			$.ajax({  
+				url:url+"/index.php?s=home/get_module/install_ajax",
+				dataType:'jsonp',  
+				data:{'name':'勾股OA'},  
+				jsonp:'callback',  
+				success:function(result) {  
+					console.log(result);
+				},  
+				timeout:3000  
+			});
+		});
+	</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/app/listener/SendMessage.php b/app/listener/SendMessage.php
new file mode 100644
index 0000000000000000000000000000000000000000..295294781bb76bde5aa4c47aace79fe01c64689a
--- /dev/null
+++ b/app/listener/SendMessage.php
@@ -0,0 +1,130 @@
+<?php
+namespace app\listener;
+use think\facade\Db;
+class SendMessage
+{
+	/**
+	 * 发送系统模板消息
+	 * @param  $user_id 接收人
+	 * @param  $template_id 消息模板
+	 * @param  $data 操作内容
+	 * @return
+	 */
+	public function handle($msg=[])
+	{
+		try {
+			// 可能会抛出异常的代码
+			if(is_numeric($msg['template_id'])){
+				$template = Db::name('Template')->where('id',$msg['template_id'])->find();
+			}
+			else{
+				$template = Db::name('Template')->where('name',$msg['template_id'])->find();
+			}
+			if(empty($template)){
+				return true;
+			}
+			$title_field = 'msg_title_'.$msg['template_field'];
+			$content_field = 'msg_content_'.$msg['template_field'];
+			$title = $template[$title_field];
+			$content = $template[$content_field];
+			$msg_link = $template['msg_link'];
+			$data = $msg['content'];
+			$data['from_user'] = Db::name('Admin')->where('id',$msg['from_uid'])->value('name');
+			$data['date'] = date('Y-m-d');
+			if(!isset($data['action_id'])){
+				$data['action_id'] = 0;
+			}
+			foreach ($data as $key => $val) {
+				$title = str_replace('{' . $key . '}', $val, $title);
+				$content = str_replace('{' . $key . '}', $val, $content);
+			}
+			$wxmsg_link ='';
+			if(!empty($msg_link)){
+				$wxmsg_link = str_replace('{action_id}', $data['action_id'], $msg_link);
+			}
+			if (!is_array($msg['to_uids'])) {
+				$users = explode(",", strval($msg['to_uids']));
+			} else {
+				$users = $msg['to_uids'];
+			}
+			$users = array_unique(array_filter($users));
+			//组合要发的消息
+			$send_data = [];
+			foreach ($users as $key => $value) {
+				$send_data[] = array(
+					'to_uid' => $value,//接收人
+					'action_id' => $data['action_id'],
+					'title' => $title,
+					'content' => $content,
+					'template' => $template['id'],
+					'create_time' => time()
+				);
+			}
+			$res = Db::name('Msg')->strict(false)->field(true)->insertAll($send_data);
+			$this->qiyeMessage($users,$title,$content,$wxmsg_link);
+		} catch (\Exception $e) {
+			// 处理异常，记录日志或者其他逻辑
+			// 但不要抛出异常，以免中断主程序流程
+		}
+	}
+	
+	
+	//获取access_token
+	function get_access_token($corpid,$corpsecret)
+	{
+		$url="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$corpid&corpsecret=$corpsecret";
+		$ch=curl_init();
+		curl_setopt($ch,CURLOPT_URL,$url);
+		curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
+		curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
+		curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
+
+		$output=curl_exec($ch);
+
+		curl_close($ch);
+		$jsoninfo = json_decode($output,true);
+		return $jsoninfo["access_token"];
+	}
+
+	function qiyeMessage($users,$title,$content,$msg_link)
+	{	
+		$workchat = get_config('workchat');
+		if($workchat['workweixin']==false){
+			return false;
+		}
+		$userid = Db::name('Admin')->where([['id','in',$users],['userid','<>','']])->column('userid');
+		if (empty($userid)) {
+		   return false;
+		}
+		$users = implode('|' ,$userid);
+		$corpid=$workchat['corpid'];
+		$corpsecret=$workchat['corpsecret'];
+		$agentid=$workchat['agentid'];
+		$host=$workchat['host'];
+		//$message_array =['title'=>$title,'tips'=>$content,'url'=>$msg_link];
+		//获取access_token
+		$accesstoken=$this->get_access_token($corpid,$corpsecret);
+		$url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$accesstoken";
+		$time_str = date('Y年m月d日 H:i:s',time());
+		$data = array(
+			'touser' => $users,
+			'agentid' => $agentid,
+			'msgtype' => 'textcard',
+			"textcard" => array(
+				"title" => $title,
+				"description" => "<div class=\"gray\">".$time_str."</div><div class=\"normal\">".$content."</div><div class=\"highlight\">点击【详情】可查看详细内容。</div>",
+				"url" => $host.$msg_link,
+				"btntxt"=>"详情"
+			)
+		);
+		$res=curl_post($url,json_encode($data));
+		$ret= json_decode($res,true);
+		$errcode = $ret['errcode'];
+		if ($errcode == 0) {
+			return true;
+		} else {
+			return false;
+			//echo '消息发送失败，错误码：' . $errcode;
+		}
+	}
+}
\ No newline at end of file
diff --git a/app/middleware.php b/app/middleware.php
new file mode 100644
index 0000000000000000000000000000000000000000..fa0f62e4c1a3ddec633e6642169a21bce5c1f6fc
--- /dev/null
+++ b/app/middleware.php
@@ -0,0 +1,10 @@
+<?php
+// 全局中间件定义文件
+return [
+    // 全局请求缓存
+    // \think\middleware\CheckRequestCache::class,
+    // 多语言加载
+    // \think\middleware\LoadLangPack::class,
+    // Session初始化
+    'think\middleware\SessionInit',
+];
diff --git a/app/mobile/common.php b/app/mobile/common.php
new file mode 100644
index 0000000000000000000000000000000000000000..328bb5bb2b68b321accc8bfd72a2921cd93923e8
--- /dev/null
+++ b/app/mobile/common.php
@@ -0,0 +1,18 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+/**
+======================
+ *模块数据获取公共文件
+======================
+ */
+use think\facade\Db;
\ No newline at end of file
diff --git a/app/mobile/controller/Bar.php b/app/mobile/controller/Bar.php
new file mode 100644
index 0000000000000000000000000000000000000000..0976be59fd5e6e3a655d3508ed550a32e4cb5409
--- /dev/null
+++ b/app/mobile/controller/Bar.php
@@ -0,0 +1,141 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\mobile\controller;
+
+use app\base\BaseController;
+use app\mobile\model\MobileBar as MobileBarModel;
+use app\mobile\validate\BarValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Bar extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new MobileBarModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+            $list = $this->model->order('sort asc')->select();
+            return to_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {		
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(BarValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(BarValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				View::assign('detail', $detail);
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			View::assign('detail', $detail);
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		if (request()->isDelete()) {
+			$param = get_params();
+			$id = isset($param['id']) ? $param['id'] : 0;
+			$type = isset($param['type']) ? $param['type'] : 0;
+			$this->model->delById($id,$type);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+
+    /**
+    * 设置
+    */
+    public function set()
+    {
+		if (request()->isAjax()) {
+			$param = get_params();
+			$res = $this->model->strict(false)->field('id,status')->update($param);
+			if ($res) {
+				if($param['status'] == 0){
+					add_log('disable', $param['id'], $param);
+				}
+				else if($param['status'] == 1){
+					add_log('recovery', $param['id'], $param);
+				}
+				return to_assign();
+			}
+			else{
+				return to_assign(0, '操作失败');
+			}
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+   
+
+}
diff --git a/app/mobile/controller/Menu.php b/app/mobile/controller/Menu.php
new file mode 100644
index 0000000000000000000000000000000000000000..9976e99e5c068e2f1e361aff1eae75445ee5fc17
--- /dev/null
+++ b/app/mobile/controller/Menu.php
@@ -0,0 +1,144 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\mobile\controller;
+
+use app\base\BaseController;
+use app\mobile\model\MobileMenu as MobileMenuModel;
+use app\mobile\validate\MenuValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Menu extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new MobileMenuModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+            $list = $this->model->where('delete_time',0)->order('sort asc')->select();
+			foreach ($list as $key => &$val) {
+				$val['types_title'] = Db::name('MobileTypes')->where(['id' => $val['types']])->value('title');
+			}				
+            return to_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {		
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(MenuValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(MenuValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				View::assign('detail', $detail);
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			View::assign('detail', $detail);
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		if (request()->isDelete()) {
+			$param = get_params();
+			$id = isset($param['id']) ? $param['id'] : 0;
+			$type = isset($param['type']) ? $param['type'] : 0;
+			$this->model->delById($id,$type);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+
+    /**
+    * 设置
+    */
+    public function set()
+    {
+		if (request()->isAjax()) {
+			$param = get_params();
+			$res = $this->model->strict(false)->field('id,status')->update($param);
+			if ($res) {
+				if($param['status'] == 0){
+					add_log('disable', $param['id'], $param);
+				}
+				else if($param['status'] == 1){
+					add_log('recovery', $param['id'], $param);
+				}
+				return to_assign();
+			}
+			else{
+				return to_assign(0, '操作失败');
+			}
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+   
+
+}
diff --git a/app/mobile/controller/Types.php b/app/mobile/controller/Types.php
new file mode 100644
index 0000000000000000000000000000000000000000..43293575c768d1c3bca63fbbae4dea1d59dfdebd
--- /dev/null
+++ b/app/mobile/controller/Types.php
@@ -0,0 +1,141 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\mobile\controller;
+
+use app\base\BaseController;
+use app\mobile\model\MobileTypes as MobileTypesModel;
+use app\mobile\validate\TypesValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Types extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new MobileTypesModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+            $list = $this->model->order('sort asc')->select();
+            return to_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {		
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(TypesValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(TypesValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				View::assign('detail', $detail);
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			View::assign('detail', $detail);
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		if (request()->isDelete()) {
+			$param = get_params();
+			$id = isset($param['id']) ? $param['id'] : 0;
+			$type = isset($param['type']) ? $param['type'] : 0;
+			$this->model->delById($id,$type);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+
+    /**
+    * 设置
+    */
+    public function set()
+    {
+		if (request()->isAjax()) {
+			$param = get_params();
+			$res = $this->model->strict(false)->field('id,status')->update($param);
+			if ($res) {
+				if($param['status'] == 0){
+					add_log('disable', $param['id'], $param);
+				}
+				else if($param['status'] == 1){
+					add_log('recovery', $param['id'], $param);
+				}
+				return to_assign();
+			}
+			else{
+				return to_assign(0, '操作失败');
+			}
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+   
+
+}
diff --git a/app/mobile/event.php b/app/mobile/event.php
new file mode 100644
index 0000000000000000000000000000000000000000..afe59182c6aa72dfdf36da12c258d8e48725b43e
--- /dev/null
+++ b/app/mobile/event.php
@@ -0,0 +1,8 @@
+<?php
+return [
+	'listen'    => [
+        //注册监听类
+        'SendMessage' => ['app\listener\SendMessage'],
+    ],
+    //'subscribe' => ['app\subscribe\Message'],
+];
diff --git a/app/mobile/middleware.php b/app/mobile/middleware.php
new file mode 100644
index 0000000000000000000000000000000000000000..a500c6f3c49234d4b0e811c4c004f053b8dbd03c
--- /dev/null
+++ b/app/mobile/middleware.php
@@ -0,0 +1,8 @@
+<?php
+// 这是系统自动生成的middleware定义文件
+return [
+    //开启session中间件
+    //'think\middleware\SessionInit',
+    //验证勾股OA是否完成安装
+    \app\home\middleware\Install::class,
+];
diff --git a/app/mobile/model/MobileBar.php b/app/mobile/model/MobileBar.php
new file mode 100644
index 0000000000000000000000000000000000000000..200206e1ba1b6ab77bbc56048b5cd97813d37954
--- /dev/null
+++ b/app/mobile/model/MobileBar.php
@@ -0,0 +1,124 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\mobile\model;
+use think\model;
+use think\facade\Db;
+class MobileBar extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($param=[],$where=[],$whereOr=[])
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->where(function ($query) use($whereOr) {
+				if (!empty($whereOr)){
+					$query->whereOr($whereOr);
+				}
+			})->order($order)->paginate(['list_rows'=> $rows]);
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			//自动为系统超级管理员角色组分配新增的节点
+			$group = Db::name('AdminGroup')->find(1);
+			if (!empty($group)) {
+				$newGroup['id'] = 1;
+				$newGroup['mobile_bar'] = $group['mobile_bar'] . ',' . $insertId;
+				Db::name('AdminGroup')->strict(false)->field(true)->update($newGroup);
+			}
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		clear_cache('MobileRules');
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		clear_cache('MobileRules');
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		clear_cache('MobileRules');
+		return to_assign();
+    }
+}
+
diff --git a/app/mobile/model/MobileMenu.php b/app/mobile/model/MobileMenu.php
new file mode 100644
index 0000000000000000000000000000000000000000..e0e228fb214873ff5ec0816134e0ac2707467ff2
--- /dev/null
+++ b/app/mobile/model/MobileMenu.php
@@ -0,0 +1,121 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\mobile\model;
+use think\model;
+use think\facade\Db;
+class MobileMenu extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($param=[],$where=[],$whereOr=[])
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->where(function ($query) use($whereOr) {
+				if (!empty($whereOr)){
+					$query->whereOr($whereOr);
+				}
+			})->order($order)
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key){
+				$item->types_title = Db::name('MobileTypes')->where(['id' => $item->types])->value('title');
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		clear_cache('MobileRules');
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		clear_cache('MobileRules');
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		clear_cache('MobileRules');
+		return to_assign();
+    }
+}
+
diff --git a/app/mobile/model/MobileTypes.php b/app/mobile/model/MobileTypes.php
new file mode 100644
index 0000000000000000000000000000000000000000..958087f8175db26e03f33d6649a864eb234330a1
--- /dev/null
+++ b/app/mobile/model/MobileTypes.php
@@ -0,0 +1,124 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\mobile\model;
+use think\model;
+use think\facade\Db;
+class MobileTypes extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($param=[],$where=[],$whereOr=[])
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->where(function ($query) use($whereOr) {
+				if (!empty($whereOr)){
+					$query->whereOr($whereOr);
+				}
+			})->order($order)->paginate(['list_rows'=> $rows]);
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			//自动为系统超级管理员角色组分配新增的节点
+			$group = Db::name('AdminGroup')->find(1);
+			if (!empty($group)) {
+				$newGroup['id'] = 1;
+				$newGroup['mobile_menu'] = $group['mobile_menu'] . ',' . $insertId;
+				Db::name('AdminGroup')->strict(false)->field(true)->update($newGroup);
+			}
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		clear_cache('MobileRules');
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		clear_cache('MobileRules');
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		clear_cache('MobileRules');
+		return to_assign();
+    }
+}
+
diff --git a/app/mobile/validate/BarValidate.php b/app/mobile/validate/BarValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..a27edc31f7f18f45ace937e178313436f57e6585
--- /dev/null
+++ b/app/mobile/validate/BarValidate.php
@@ -0,0 +1,43 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\mobile\validate;
+use think\Validate;
+use think\facade\Db;
+
+class BarValidate extends Validate
+{
+	// 自定义验证规则
+	protected function checkOne($value,$rule,$data=[])
+	{
+		$id = isset($data['id'])?$data['id']:0;
+		$count = Db::name('MobileBar')->where([['title','=',$data['title']],['id','<>',$id]])->count();
+		return $count == 0 ? true : false;
+	}
+	
+    protected $rule = [
+		'title' => 'require|checkOne',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'title.require' => '名称不能为空',
+		'title.checkOne' => '同样的名称已经存在',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['title', 'id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/mobile/validate/MenuValidate.php b/app/mobile/validate/MenuValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..b8a6dd0c9309fcc2b16a65ac17dc10b58cba177b
--- /dev/null
+++ b/app/mobile/validate/MenuValidate.php
@@ -0,0 +1,43 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\mobile\validate;
+use think\Validate;
+use think\facade\Db;
+
+class MenuValidate extends Validate
+{
+	// 自定义验证规则
+	protected function checkOne($value,$rule,$data=[])
+	{
+		$id = isset($data['id'])?$data['id']:0;
+		$count = Db::name('MobileMenu')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count();
+		return $count == 0 ? true : false;
+	}
+	
+    protected $rule = [
+		'title' => 'require|checkOne',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'title.require' => '名称不能为空',
+		'title.checkOne' => '同样的名称已经存在',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['title', 'id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/mobile/validate/TypesValidate.php b/app/mobile/validate/TypesValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..44bb31f97ade92bcf00b62bff4d7a4f254b13d5a
--- /dev/null
+++ b/app/mobile/validate/TypesValidate.php
@@ -0,0 +1,43 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\mobile\validate;
+use think\Validate;
+use think\facade\Db;
+
+class TypesValidate extends Validate
+{
+	// 自定义验证规则
+	protected function checkOne($value,$rule,$data=[])
+	{
+		$id = isset($data['id'])?$data['id']:0;
+		$count = Db::name('MobileTypes')->where([['title','=',$data['title']],['id','<>',$id]])->count();
+		return $count == 0 ? true : false;
+	}
+	
+    protected $rule = [
+		'title' => 'require|checkOne',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'title.require' => '名称不能为空',
+		'title.checkOne' => '同样的名称已经存在',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['title', 'id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/mobile/view/bar/add.html b/app/mobile/view/bar/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..7a0d43125f646282670da8e6d444f0e8d9087408
--- /dev/null
+++ b/app/mobile/view/bar/add.html
@@ -0,0 +1,53 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">Bar菜单</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">菜单名称<font>*</font></td>
+			<td><input type="text" class="layui-input" name="title" placeholder="请输入菜单名称，建议2到3个字" lay-verify="required" lay-reqText="请输入菜单名称" value="{$detail.title|default=''}"></td>
+			<td class="layui-td-gray">排序</td>
+			<td><input type="text" name="sort" placeholder="请输入排序，数字" class="layui-input" value="{$detail.sort|default=''}"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">菜单URL<font>*</font></td>
+			<td><input type="text" class="layui-input" name="url" placeholder="请输入菜单URL" lay-verify="required" lay-reqText="请输入菜单URL" value="{$detail.url|default=''}"></td>
+			<td class="layui-td-gray">菜单图标<font>*</font></td>
+			<td>
+				<input style="width:150px; display:inline" type="text" name="icon" value="{$detail.icon|default=''}" placeholder="请输入菜单图标" lay-verify="required" lay-reqText="请输入菜单图标" class="layui-input">
+				<strong class="iconfont icon-xiangmuguanli"></strong><a href="/static/assets/icon/index.html" target="_blank" style="margin-left:10px; color:#007AFF">[查看图标]</a>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$detail.id|default=0}"/>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool'];
+
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			tool.post("/mobile/bar/add", data.field, callback);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/mobile/view/bar/datalist.html b/app/mobile/view/bar/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..8165c1cbcada071296477da022ed28e5f254b8fa
--- /dev/null
+++ b/app/mobile/view/bar/datalist.html
@@ -0,0 +1,110 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<div class="layui-card border-x border-t" style="margin-bottom:0; box-shadow:0 0 0 0 rgb(5 32 96 / 0%)">
+		<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
+			<ul class="layui-tab-title">
+				<li class="layui-this"><a href="/mobile/bar/datalist">BAR菜单</a></li>
+				<li><a href="/mobile/types/datalist">工作台菜单类型</a></li>
+				<li><a href="/mobile/menu/datalist">工作台菜单</a></li>
+			</ul>
+		</div>
+	</div>
+	<table class="layui-hide" id="table_mobile_bar" lay-filter="table_mobile_bar"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-group">
+  	<button class="layui-btn layui-btn-sm tool-add" type="button" data-href="/mobile/bar/add">+ 添加Bar菜单</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool;
+		
+		layui.pageTable = table.render({
+			elem: "#table_mobile_bar"
+			,title: 'Bar菜单列表'
+			,toolbar: '#toolbarDemo'
+			,url: "/mobile/bar/datalist"
+			,page: false
+			,limit: 999
+			,cellMinWidth: 80
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'icon',title: '菜单图标',width: 80, align: 'center' ,templet: function(d){
+					var html='<strong class="iconfont '+d.icon+'"></strong>';
+					return html;
+				}}
+				,{field:'title',title: '类型名称'}
+				, { field: 'url', title: 'URL链接' }
+				, { field: 'sort', width: 60, title: '排序', align: 'center' }
+				,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+					var html1='<span class="green">正常</span>';
+					var html2='<span class="yellow">禁用</span>';
+					if(d.status==1){
+						return html1;
+					}
+					else{
+						return html2;
+					}
+				}}
+				,{width:100,title: '操作', align:'center',ignoreExport:true,templet: function(d){
+					var html='';
+					var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+					if(d.status==1){
+						html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+					}
+					else{
+						html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+					}
+					return html;
+				}}
+			]]
+		});
+			
+		table.on('tool(table_mobile_bar)',function (obj) {
+			if(obj.event === 'edit'){					
+				tool.side('/mobile/bar/add?id='+obj.data.id);
+			}
+			if(obj.event === 'disable'){
+				layer.confirm('确定要禁用该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/mobile/bar/set", {id:obj.data.id,status: 0}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'open'){
+				layer.confirm('确定要启用该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/mobile/bar/set", {id:obj.data.id,status:1}, callback);
+					layer.close(index);
+				});
+			}
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/mobile/view/menu/add.html b/app/mobile/view/menu/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..b517a996be563691fc09e57fb397af938b1ef4a0
--- /dev/null
+++ b/app/mobile/view/menu/add.html
@@ -0,0 +1,97 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">工作台菜单</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">菜单名称<font>*</font></td>
+			<td><input type="text" class="layui-input" name="title" placeholder="请输入菜单名称，建议4个字" lay-verify="required" lay-reqText="请输入菜单名称" value="{$detail.title|default=''}"></td>
+			<td class="layui-td-gray">所属类型<font>*</font></td>
+			<td>
+				{empty name="$detail"}
+				<select name="types" lay-verify="required" lay-reqText="请选择所属类型">
+				  <option value="">请选择</option>
+				  {volist name=":get_base_data('mobile_types')" id="vo"}
+				  <option value="{$vo.id}">{$vo.title}</option>
+				  {/volist}
+				</select>
+				{else/}
+				<select name="types" lay-verify="required" lay-reqText="请选择所属类型">
+				  <option value="">请选择</option>
+				  {volist name=":get_base_data('mobile_types')" id="vo"}
+				  <option value="{$vo.id}" {eq name="$detail.types" value="$vo.id"} selected{/eq}>{$vo.title}</option>
+				  {/volist}
+				</select>
+				{/empty}			
+			</td>
+			<td class="layui-td-gray">排序</td>
+			<td><input type="text" name="sort" placeholder="请输入排序，数字" class="layui-input" value="{$detail.sort|default=''}"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">菜单URL<font>*</font></td>
+			<td><input type="text" class="layui-input" name="url" placeholder="请输入菜单URL" lay-verify="required" lay-reqText="请输入菜单URL" value="{$detail.url|default=''}"></td>
+			<td class="layui-td-gray">背景色<font>*</font></td>
+			<td>
+				{empty name="$detail"}
+				<select name="bgcolor" lay-verify="required" lay-reqText="请选择背景色">
+				  <option value="">请选择</option>
+				  <option value="red">红</option>
+				  <option value="orange">橙</option>
+				  <option value="yellow">黄</option>
+				  <option value="green">绿</option>
+				  <option value="blue">蓝</option>
+				  <option value="cyan">青</option>
+				  <option value="purple">紫</option>
+				</select>
+				{else/}
+				<select name="bgcolor" lay-verify="required" lay-reqText="请选择背景色">
+				  <option value="">请选择</option>
+				  <option value="red" {eq name="$detail.bgcolor" value="red"} selected{/eq}>红</option>
+				  <option value="orange" {eq name="$detail.bgcolor" value="orange"} selected{/eq}>橙</option>
+				  <option value="yellow" {eq name="$detail.bgcolor" value="yellow"} selected{/eq}>黄</option>
+				  <option value="green" {eq name="$detail.bgcolor" value="green"} selected{/eq}>绿</option>
+				  <option value="blue" {eq name="$detail.bgcolor" value="blue"} selected{/eq}>蓝</option>
+				  <option value="cyan" {eq name="$detail.bgcolor" value="cyan"} selected{/eq}>青</option>
+				  <option value="purple" {eq name="$detail.bgcolor" value="purple"} selected{/eq}>紫</option>
+				</select>
+				{/empty}			
+			</td>
+			<td class="layui-td-gray">菜单图标<font>*</font></td>
+			<td>
+				<input style="width:150px; display:inline" type="text" name="icon" value="{$detail.icon|default=''}" placeholder="请输入图标" lay-verify="required" lay-reqText="请输入图标" class="layui-input">
+				<strong class="iconfont icon-xiangmuguanli"></strong><a href="/static/assets/icon/index.html" target="_blank" style="margin-left:10px; color:#007AFF">[查看图标]</a>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$detail.id|default=0}"/>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool'];
+
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			tool.post("/mobile/menu/add", data.field, callback);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/mobile/view/menu/datalist.html b/app/mobile/view/menu/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..b6b38f92d70b2a415ad6bd6172ed9773091d7008
--- /dev/null
+++ b/app/mobile/view/menu/datalist.html
@@ -0,0 +1,125 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<div class="layui-card border-x border-t" style="margin-bottom:0; box-shadow:0 0 0 0 rgb(5 32 96 / 0%)">
+		<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
+			<ul class="layui-tab-title">
+				<li><a href="/mobile/bar/datalist">BAR菜单</a></li>
+				<li><a href="/mobile/types/datalist">工作台菜单类型</a></li>
+				<li class="layui-this"><a href="/mobile/menu/datalist">工作台菜单</a></li>
+			</ul>
+		</div>
+	</div>
+	<table class="layui-hide" id="table_mobile_menu" lay-filter="table_mobile_menu"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-group">
+  	<button class="layui-btn layui-btn-sm tool-add" type="button" data-href="/mobile/menu/add">+ 添加工作台菜单</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool;
+		
+		layui.pageTable = table.render({
+			elem: "#table_mobile_menu"
+			,title: '工作台菜单列表'
+			,toolbar: '#toolbarDemo'
+			,url: "/mobile/menu/datalist"
+			,page: false
+			,limit: 999
+			,cellMinWidth: 80
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'icon',title: '菜单图标',width: 80, align: 'center' ,templet: function(d){
+					var html='<strong class="iconfont '+d.icon+'"></strong>';
+					return html;
+				}}
+				,{field:'title',title: '类型名称'}
+				, { field: 'url', title: 'URL链接' }
+				, { field: 'types_title', width: 100, title: '所属类型', align: 'center'}
+				,{ field: 'bgcolor', width: 80, title: '背景色', align: 'center' }
+				, { field: 'sort', width: 60, title: '排序', align: 'center' }
+				,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+					var html1='<span class="green">正常</span>';
+					var html2='<span class="yellow">禁用</span>';
+					if(d.status==1){
+						return html1;
+					}
+					else{
+						return html2;
+					}
+				}}
+				,{width:120,title: '操作', align:'center',ignoreExport:true,templet: function(d){
+					var html='';
+					var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn1='<a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="disable">禁用</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+					var btn3='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
+					if(d.status==1){
+						html = '<div class="layui-btn-group">'+btn+btn1+btn3+'</div>';
+					}
+					else{
+						html = '<div class="layui-btn-group">'+btn+btn2+btn3+'</div>';
+					}
+					return html;
+				}}
+			]]
+		});
+			
+		table.on('tool(table_mobile_menu)',function (obj) {
+			if(obj.event === 'edit'){					
+				tool.side('/mobile/menu/add?id='+obj.data.id);
+			}
+			if(obj.event === 'disable'){
+				layer.confirm('确定要禁用该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/mobile/menu/set", {id:obj.data.id,status: 0}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'open'){
+				layer.confirm('确定要启用该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/mobile/menu/set", {id:obj.data.id,status:1}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'del'){
+				layer.confirm('确定要删除该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.delete("/mobile/menu/del", {id:obj.data.id}, callback);
+					layer.close(index);
+				});
+			}
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/mobile/view/types/add.html b/app/mobile/view/types/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..0b14d196db30519c5971e49d67fbffa8ef243382
--- /dev/null
+++ b/app/mobile/view/types/add.html
@@ -0,0 +1,44 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">工作台菜单类型</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">类型名称<font>*</font></td>
+			<td><input type="text" class="layui-input" name="title" placeholder="请输入菜单类型名称，建议4个字" lay-verify="required" lay-reqText="请输入菜单类型名称" value="{$detail.title|default=''}"></td>
+			<td class="layui-td-gray">排序</td>
+			<td><input type="text" name="sort" placeholder="请输入排序，数字" class="layui-input" value="{$detail.sort|default=''}"></td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$detail.id|default=0}"/>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool'];
+
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			tool.post("/mobile/types/add", data.field, callback);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/mobile/view/types/datalist.html b/app/mobile/view/types/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..1fe7b33f0b79d3c3c12c4cf02a33e1313221dd15
--- /dev/null
+++ b/app/mobile/view/types/datalist.html
@@ -0,0 +1,105 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<div class="layui-card border-x border-t" style="margin-bottom:0; box-shadow:0 0 0 0 rgb(5 32 96 / 0%)">
+		<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
+			<ul class="layui-tab-title">
+				<li><a href="/mobile/bar/datalist">BAR菜单</a></li>
+				<li class="layui-this"><a href="/mobile/types/datalist">工作台菜单类型</a></li>
+				<li><a href="/mobile/menu/datalist">工作台菜单</a></li>
+			</ul>
+		</div>
+	</div>
+	<table class="layui-hide" id="table_mobile_types" lay-filter="table_mobile_types"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-group">
+  	<button class="layui-btn layui-btn-sm tool-add" type="button" data-href="/mobile/types/add">+ 添加工作台菜单类型</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool;
+		
+		layui.pageTable = table.render({
+			elem: "#table_mobile_types"
+			,title: '工作台菜单类型列表'
+			,toolbar: '#toolbarDemo'
+			,url: "/mobile/types/datalist"
+			,page: false
+			,limit: 999
+			,cellMinWidth: 80
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',title: '类型名称'}
+				,{ field: 'sort', width: 60, title: '排序', align: 'center' }
+				,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+					var html1='<span class="green">正常</span>';
+					var html2='<span class="yellow">禁用</span>';
+					if(d.status==1){
+						return html1;
+					}
+					else{
+						return html2;
+					}
+				}}
+				,{width:100,title: '操作', align:'center',ignoreExport:true,templet: function(d){
+					var html='';
+					var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+					if(d.status==1){
+						html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+					}
+					else{
+						html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+					}
+					return html;
+				}}
+			]]
+		});
+			
+		table.on('tool(table_mobile_types)',function (obj) {
+			if(obj.event === 'edit'){					
+				tool.side('/mobile/types/add?id='+obj.data.id);
+			}
+			if(obj.event === 'disable'){
+				layer.confirm('确定要禁用该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/mobile/types/set", {id:obj.data.id,status: 0}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'open'){
+				layer.confirm('确定要启用该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/mobile/types/set", {id:obj.data.id,status:1}, callback);
+					layer.close(index);
+				});
+			}
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/oa/common.php b/app/oa/common.php
new file mode 100644
index 0000000000000000000000000000000000000000..31d13ebb000e29fd34abb0d00da99d112d0aaac5
--- /dev/null
+++ b/app/oa/common.php
@@ -0,0 +1,49 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+use think\facade\Db;
+
+//读取职位
+function get_position()
+{
+    $position = Db::name('Position')->where(['status' => 1])->select()->toArray();
+    return $position;
+}
+
+//读取印章类型
+function oa_seal_cate()
+{
+    $list = Db::name('SealCate')->where(['status' => 1])->select()->toArray();
+    return $list;
+}
+
+//读取会议室
+function oa_meeting_cate()
+{
+    $list = Db::name('MeetingCate')->where(['status' => 1])->select()->toArray();
+    return $list;
+}
+
+//读取车辆类型
+function oa_car_cate()
+{
+    $list = Db::name('CarCate')->where(['status' => 1])->select()->toArray();
+    return $list;
+}
+
+//读取费用类型
+function oa_cost_cate()
+{
+    $list = Db::name('CostCate')->where(['status' => 1])->select()->toArray();
+    return $list;
+}
diff --git a/app/oa/controller/Api.php b/app/oa/controller/Api.php
new file mode 100644
index 0000000000000000000000000000000000000000..bffae351e9394668fa2c128888a3cf795f443bc0
--- /dev/null
+++ b/app/oa/controller/Api.php
@@ -0,0 +1,117 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+declare (strict_types = 1);
+namespace app\oa\controller;
+
+use app\api\BaseController;
+use app\oa\model\Schedule;
+use think\facade\Db;
+use think\facade\View;
+
+class Api extends BaseController
+{
+	//获取工作日志列表
+    public function get_schedule()
+    {
+		$param = get_params();
+		$project_id = isset($param['project_id']) ? $param['project_id'] : 0;
+		$task_id = isset($param['task_id']) ? $param['task_id'] : 0;
+		if ($project_id>0) {
+			$task_ids = Db::name('ProjectTask')->where(['delete_time' => 0, 'project_id' => $project_id])->column('id');
+			$where[] = ['a.tid', 'in', $task_ids];
+		}
+		if ($task_id>0) {
+			$where[] = ['a.tid', '=', $task_id];
+		}
+		$where[] = ['a.delete_time', '=', 0];
+		$model = new Schedule();
+		$list = $model->datalist($param,$where);
+		return table_assign(0, '', $list);
+    }
+	
+    //调整工时
+    public function update_schedule()
+    {
+        $param = get_params();
+		$is_leader = isLeader($this->uid);
+		$role_auth = isAuth($this->uid,'office_admin','conf_1');
+		$hour_auth = valueAuth('office_admin','conf_2');
+		$edit_role = false;		
+		if($hour_auth==4 && $role_auth > 0){
+			$edit_role = true;	
+		}
+		if($hour_auth==3 && $is_leader > 0){
+			$edit_role = true;
+		}
+		if($hour_auth==2){
+			$admin_id = Db::name('Schedule')->where('id',$param['id'])->value('admin_id');
+			if($admin_id == $this->uid){
+				$edit_role = true;
+			}				
+		}
+		if($edit_role == false){
+			return to_assign(1, "您无权限编辑");
+		}
+		
+        if (isset($param['start_time_a'])) {
+            $param['start_time'] = strtotime($param['start_time_a'] . '' . $param['start_time_b']);
+        }
+        if (isset($param['end_time_a'])) {
+            $param['end_time'] = strtotime($param['end_time_a'] . '' . $param['end_time_b']);
+        }
+		if($param['start_time']>time()){
+			return to_assign(1, "开始时间不能大于当前时间");		
+		}
+        if ($param['end_time'] <= $param['start_time']) {
+            return to_assign(1, "结束时间需要大于开始时间");
+        }
+        $where1[] = ['delete_time', '=', 0];
+        $where1[] = ['id', '<>', $param['id']];
+        $where1[] = ['admin_id', '=', $param['admin_id']];
+        $where1[] = ['start_time', 'between', [$param['start_time'], $param['end_time'] - 1]];
+
+        $where2[] = ['delete_time', '=', 0];
+        $where2[] = ['id', '<>', $param['id']];
+        $where2[] = ['admin_id', '=', $param['admin_id']];
+        $where2[] = ['start_time', '<=', $param['start_time']];
+        $where2[] = ['start_time', '>=', $param['end_time']];
+
+        $where3[] = ['delete_time', '=', 0];
+        $where3[] = ['id', '<>', $param['id']];
+        $where3[] = ['admin_id', '=', $param['admin_id']];
+        $where3[] = ['end_time', 'between', [$param['start_time'] + 1, $param['end_time']]];
+
+        $record = Db::name('Schedule')
+            ->where(function ($query) use ($where1) {
+                $query->where($where1);
+            })
+            ->whereOr(function ($query) use ($where2) {
+                $query->where($where2);
+            })
+            ->whereOr(function ($query) use ($where3) {
+                $query->where($where3);
+            })
+            ->count();
+        if ($record > 0) {
+            return to_assign(1, "您所选的时间区间已有工作记录，请重新选时间");
+        }
+        $param['labor_time'] = ($param['end_time'] - $param['start_time']) / 3600;
+        $res = Db::name('Schedule')->strict(false)->field(true)->update($param);
+        if ($res !== false) {
+            return to_assign(0, "操作成功");
+            add_log('edit', $param['id'], $param);
+        } else {
+            return to_assign(1, "操作失败");
+        }
+    }
+}
diff --git a/app/oa/controller/Meeting.php b/app/oa/controller/Meeting.php
new file mode 100644
index 0000000000000000000000000000000000000000..2b657ad8f8ff9dc9bd31820beb86131d062b8b9a
--- /dev/null
+++ b/app/oa/controller/Meeting.php
@@ -0,0 +1,75 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\oa\controller;
+
+use app\base\BaseController;
+use app\adm\model\MeetingRecords as MeetingRecordsModel;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Meeting extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new MeetingRecordsModel();
+    }
+	
+	//会议纪要
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+            $param = get_params();
+			$where=[];
+			$whereOr = [];
+			$uid = $this->uid;
+            if (!empty($param['keywords'])) {
+                $where[] = ['title', 'like', '%' . $param['keywords'] . '%'];
+            }
+			if (!empty($param['anchor_id'])) {
+                $where[] = ['anchor_id', '=', $param['anchor_id']];
+            }
+			if (!empty($param['diff_time'])) {
+				$diff_time =explode('~', $param['diff_time']);
+                $where[] = ['meeting_date', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]];
+            }
+            $where[] = ['delete_time', '=', 0];
+			$whereOr[] = ['recorder_id|anchor_id','=',$uid];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',join_uids)")];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',sign_uids)")];
+			$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_uids)")];
+			$list = $this->model->datalist($param,$where,$whereOr);
+            return table_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+
+    //查看会议纪要
+    public function view($id)
+    {
+		View::assign('detail', $this->model->getById($id));
+		if(is_mobile()){
+			return view('qiye@/index/meeting_view');
+		}
+        return view();
+    }
+}
diff --git a/app/oa/controller/News.php b/app/oa/controller/News.php
new file mode 100644
index 0000000000000000000000000000000000000000..63130a0c51cc60f51d00d6c53384f16e008d1d41
--- /dev/null
+++ b/app/oa/controller/News.php
@@ -0,0 +1,80 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\oa\controller;
+
+use app\base\BaseController;
+use app\adm\model\News as NewsModel;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class News extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new NewsModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			$where=[];
+			$where[]=['delete_time','=',0];
+            if (!empty($param['keywords'])) {
+                $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%'];
+            }
+            $list = $this->model->datalist($where, $param);
+            return table_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			$detail['cate'] = Db::name('NoteCate')->where(['id' => $detail['cate_id']])->value('title');
+			$detail['admin_name'] = Db::name('Admin')->where(['id' => $detail['admin_id']])->value('name');
+			if($detail['file_ids'] !=''){
+				$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+				$detail['file_array'] = $file_array;
+			}
+			View::assign('detail', $detail);
+			if(is_mobile()){
+				return view('qiye@/index/news_view');
+			}
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+
+}
diff --git a/app/oa/controller/Note.php b/app/oa/controller/Note.php
new file mode 100644
index 0000000000000000000000000000000000000000..2ac8eb07b8e3d77ae7ca4e5bf729b247643e9279
--- /dev/null
+++ b/app/oa/controller/Note.php
@@ -0,0 +1,80 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\oa\controller;
+
+use app\base\BaseController;
+use app\adm\model\Note as NoteModel;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Note extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new NoteModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+		$param = get_params();
+        if (request()->isAjax()) {
+			$where=[];
+			$where[]=['a.delete_time','=',0];
+            if (!empty($param['keywords'])) {
+                $where[] = ['a.id|a.title', 'like', '%' . $param['keywords'] . '%'];
+            }
+            $list = $this->model->datalist($where, $param);
+            return table_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			$detail['cate'] = Db::name('NoteCate')->where(['id' => $detail['cate_id']])->value('title');
+			$detail['admin_name'] = Db::name('Admin')->where(['id' => $detail['admin_id']])->value('name');
+			if($detail['file_ids'] !=''){
+				$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+				$detail['file_array'] = $file_array;
+			}
+			View::assign('detail', $detail);
+			if(is_mobile()){
+				return view('qiye@/index/note_view');
+			}
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+
+}
diff --git a/app/oa/controller/Plan.php b/app/oa/controller/Plan.php
new file mode 100644
index 0000000000000000000000000000000000000000..8936c4630973473a844e37fbc05372518fe1146f
--- /dev/null
+++ b/app/oa/controller/Plan.php
@@ -0,0 +1,236 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\oa\controller;
+
+use app\base\BaseController;
+use app\oa\model\Plan as PlanList;
+use schedule\Schedule as ScheduleIndex;
+use think\facade\Db;
+use think\facade\View;
+
+class Plan extends BaseController
+{
+    function datalist() {
+        if (request()->isAjax()) {
+            $param = get_params();			
+			//按时间检索
+			if (!empty($param['diff_time'])) {
+				$diff_time =explode('~', $param['diff_time']);
+                $where[] = ['a.start_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]];
+            }
+			
+            if (!empty($param['keywords'])) {
+                $where[] = ['a.title', 'like', '%' . trim($param['keywords']) . '%'];
+            }
+            if (!empty($param['uid'])) {
+                $where[] = ['a.admin_id', '=', $param['uid']];
+            } else {
+                $where[] = ['a.admin_id', '=', $this->uid];
+            }
+			if (!empty($param['type'])) {
+                $where[] = ['a.type', '=', $param['type']];
+            }
+            $where[] = ['a.delete_time', '=', 0];
+            $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+            $plan = PlanList::where($where)
+                ->field('a.*,u.name as create_admin')
+                ->alias('a')
+                ->join('admin u', 'u.id = a.admin_id', 'LEFT')
+                ->order('a.id desc')
+                ->paginate(['list_rows'=> $rows])
+                ->each(function ($item, $key) {
+                    $item->remind_time = empty($item->remind_time) ? '-' : date('Y-m-d H:i', $item->remind_time);
+                    $item->start_time = empty($item->start_time) ? '' : date('Y-m-d H:i', $item->start_time);
+                    $item->end_time = empty($item->end_time) ? '': date('Y-m-d H:i', $item->end_time);
+                });
+            return table_assign(0, '', $plan);
+        } else {
+			View::assign('is_leader', isLeader($this->uid));
+            return view();
+        }
+    }
+
+    //工作记录
+    public function calendar()
+    {
+        if (request()->isAjax()) {
+            $param = get_params();
+            $uid = $this->uid;
+            if (!empty($param['uid'])) {
+                $uid = $param['uid'];
+            }
+            $where = [];
+			
+			$where[] = ['start_time','<=',strtotime($param['end'])];
+            $where[] = ['end_time','>=',strtotime($param['start'])];
+            $where[] = ['delete_time', '=', 0];
+            $where[] = ['admin_id', '=', $uid];
+
+            $schedule = Db::name('Plan')
+            ->where($where)
+            ->field('id,title,type,remind_type,start_time,end_time')
+            ->select()->toArray();
+            $events = [];
+            $bg_array=['#ECECEC','#FFD3D3','#F6F6C7','#D7EBFF','#CCEBCC','#E9E9CB'];
+            $border_array=['#CCCCCC','#FF9999','#E8E89B','#99CCFF','#99CC99','#CCCC99'];
+            foreach ($schedule as $k => $v) {
+                $v['backgroundColor'] = $bg_array[$v['type']];
+                $v['borderColor'] = $border_array[$v['type']];
+                $v['title'] = $v['title'];
+                $v['start'] = date('Y-m-d H:i', $v['start_time']);
+                $v['end'] = date('Y-m-d H:i', $v['end_time']);
+                unset($v['start_time']);
+                unset($v['end_time']);
+                $events[] = $v;
+            }
+            $input_arrays = $events;
+            $range_start = parseDateTime($param['start']);
+            $range_end = parseDateTime($param['end']);
+            $timeZone = null;
+            if (isset($_GET['timeZone'])) {
+                $timeZone = new DateTimeZone($_GET['timeZone']);
+            }
+
+            // Accumulate an output array of event data arrays.
+            $output_arrays = array();
+            foreach ($input_arrays as $array) {
+                // Convert the input array into a useful Event object
+                $event = new ScheduleIndex($array, $timeZone);
+                // If the event is in-bounds, add it to the output
+                if ($event->isWithinDayRange($range_start, $range_end)) {
+                    $output_arrays[] = $event->toArray();
+                }
+            }
+            return json($output_arrays);
+        } else {
+			View::assign('is_leader', isLeader($this->uid));
+            return view();
+        }
+    }
+
+    //保存日志数据
+    public function add()
+    {
+        $param = get_params();
+        $admin_id = $this->uid;
+		if (isset($param['start_time'])) {
+			$param['start_time'] = strtotime($param['start_time']);
+		}
+		if (isset($param['end_time'])) {
+			$param['end_time'] = strtotime($param['end_time']);
+		}
+        if (isset($param['start_time_a'])) {
+            $param['start_time'] = strtotime($param['start_time_a'] . '' . $param['start_time_b']);
+        }
+        if (isset($param['end_time_a'])) {
+            $param['end_time'] = strtotime($param['end_time_a'] . '' . $param['end_time_b']);
+        }
+        if ($param['end_time'] <= $param['start_time']) {
+            return to_assign(1, "结束时间需要大于开始时间");
+        }
+		/*
+		if ($param['start_time'] <= time()) {
+            return to_assign(1, "开始时间需要大于当前时间");
+        }
+		*/
+		if (isset($param['remind_type'])) {
+			if($param['remind_type']==1){
+				$param['remind_time'] = $param['start_time']-5*60;
+			}
+			if($param['remind_type']==2){
+				$param['remind_time'] = $param['start_time']-15*60;
+			}
+			if($param['remind_type']==3){
+				$param['remind_time'] = $param['start_time']-30*60;
+			}
+			if($param['remind_type']==4){
+				$param['remind_time'] = $param['start_time']-60*60;
+			}
+			if($param['remind_type']==5){
+				$param['remind_time'] = $param['start_time']-120*60;
+			}
+			if($param['remind_type']==6){
+				$param['remind_time'] = $param['start_time']-1440*60;
+			}
+		}
+        if ($param['id'] == 0) {
+            $param['admin_id'] = $admin_id;
+            $param['did'] = get_admin($admin_id)['did'];
+            $param['create_time'] = time();
+            $addid = Db::name('Plan')->strict(false)->field(true)->insertGetId($param);
+            if ($addid > 0) {
+                add_log('add', $addid, $param);
+                return to_assign(0, '操作成功');
+            } else {
+                return to_assign(0, '操作失败');
+            }
+        } else {
+            $param['update_time'] = time();
+            $res = Db::name('Plan')->strict(false)->field(true)->update($param);
+            if ($res !== false) {
+                add_log('edit', $param['id'], $param);
+                return to_assign(0, '操作成功');
+            } else {
+                return to_assign(0, '操作失败');
+            }
+        }
+    }
+
+    //删除工作记录
+    public function del()
+    {
+        $id = get_params("id");
+        $data['id'] = $id;
+        $data['delete_time'] = time();
+        if (Db::name('Plan')->update($data) !== false) {
+            add_log('delete', $data['id'], $data);
+            return to_assign(0, "删除成功");
+        } else {
+            return to_assign(1, "删除失败");
+        }
+    }
+
+    public function detail()
+    {
+		$id = get_params("id");
+        $schedule = Db::name('Plan')->where(['id' => $id])->find();
+        if (!empty($schedule)) {
+            $schedule['remind_time'] = $schedule['remind_time'] == 0?'-':date('Y-m-d H:i', $schedule['remind_time']);
+            $schedule['start_time_a'] = date('Y-m-d', $schedule['start_time']);
+            $schedule['end_time_a'] = date('Y-m-d', $schedule['end_time']);
+            $schedule['start_time_b'] = date('H:i', $schedule['start_time']);
+            $schedule['end_time_b'] = date('H:i', $schedule['end_time']);
+            $schedule['start_time'] = date('Y-m-d H:i', $schedule['start_time']);
+            $schedule['end_time'] = date('Y-m-d H:i', $schedule['end_time']);
+            $schedule['create_time'] = date('Y-m-d H:i:s', $schedule['create_time']);
+            $schedule['user'] = Db::name('Admin')->where(['id' => $schedule['admin_id']])->value('name');
+        }
+        return $schedule;
+    }
+
+    //读取日程弹层详情
+    public function view()
+    {
+		$id = get_params("id");
+        $schedule = $this->detail($id);
+        if (request()->isAjax()) {
+            return to_assign(0, "", $schedule);
+        } else {
+            return $schedule;
+        }
+    }
+
+}
diff --git a/app/oa/controller/Schedule.php b/app/oa/controller/Schedule.php
new file mode 100644
index 0000000000000000000000000000000000000000..ce67b4878f354272ea271b384917b2614c42394d
--- /dev/null
+++ b/app/oa/controller/Schedule.php
@@ -0,0 +1,274 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\oa\controller;
+
+use app\base\BaseController;
+use app\oa\model\Schedule as ScheduleModel;
+use schedule\Schedule as ScheduleIndex;
+use think\facade\Db;
+use think\facade\View;
+
+class Schedule extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new ScheduleModel();
+    }
+	
+    function datalist() {
+        if (request()->isAjax()) {
+            $param = get_params();
+            $where = [];			
+            $whereOr = [];	
+			$uid= $this->uid;			
+			if (!empty($param['keywords'])) {
+				$where[] = ['a.title', 'like', '%' . trim($param['keywords']) . '%'];
+			}
+			if (!empty($param['labor_type'])) {
+				$where[] = ['a.labor_type', '=',$param['labor_type']];
+			}
+			if (!empty($param['cid'])) {
+				$where[] = ['a.cid', '=',$param['cid']];
+			}
+			//按时间检索
+			if (!empty($param['diff_time'])) {
+				$diff_time =explode('~', $param['diff_time']);
+				$where[] = ['a.start_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]];
+			}
+            $where[] = ['a.delete_time', '=', 0];
+			if (!empty($param['uid'])) {
+				$where[] = ['a.admin_id', '=', $param['uid']];
+			} else {
+				$whereOr[] = ['a.admin_id', '=', $uid];
+				$dids_a = get_leader_departments($uid);	
+				$dids_b = get_role_departments($uid);
+				$dids = array_merge($dids_a, $dids_b);
+				if(!empty($dids)){
+					$whereOr[] = ['a.did','in',$dids];
+				}
+			}
+            $list = $this->model->datalist($param,$where,$whereOr);
+            return table_assign(0, '', $list);
+        } else {
+			View::assign('is_leader', isLeader($this->uid));
+			View::assign('role_auth', isAuth($this->uid,'office_admin','conf_1'));
+			View::assign('hour_auth', valueAuth('office_admin','conf_2'));
+            return view();
+        }
+    }
+
+    //工作记录
+    public function calendar()
+    {
+        if (request()->isAjax()) {
+            $param = get_params();
+            $uid = $this->uid;
+            if (!empty($param['uid'])) {
+                $uid = $param['uid'];
+            }
+            $where = [];
+            $where[] = ['start_time', '>=', strtotime($param['start'])];
+            $where[] = ['end_time', '<=', strtotime($param['end'])];
+            $where[] = ['admin_id', '=', $uid];
+            $where[] = ['delete_time', '=', 0];
+            $schedule = Db::name('Schedule')->where($where)->field('id,title,labor_time,start_time,end_time')->select()->toArray();
+            $events = [];
+            $countEvents = [];
+            foreach ($schedule as $k => $v) {
+                $v['backgroundColor'] = '#12bb37';
+                $v['borderColor'] = '#12bb37';
+                $v['title'] = '[' . $v['labor_time'] . '工时] ' . $v['title'];
+                $v['start'] = date('Y-m-d H:i', $v['start_time']);
+                $v['end'] = date('Y-m-d H:i', $v['end_time']);
+                $temData = date('Y-m-d', $v['start_time']);
+                if (array_key_exists($temData, $countEvents)) {
+                    $countEvents[$temData]['times'] += $v['labor_time'];
+                } else {
+                    $countEvents[$temData]['times'] = $v['labor_time'];
+                    $countEvents[$temData]['start'] = date('Y-m-d', $v['start_time']);
+                }
+                unset($v['start_time']);
+                unset($v['end_time']);
+                $events[] = $v;
+            }
+            foreach ($countEvents as $kk => $vv) {
+                $vv['backgroundColor'] = '#eeeeee';
+                $vv['borderColor'] = '#eeeeee';
+                $vv['title'] = '【当天总工时：' . $vv['times'] . '】';
+                $vv['end'] = $vv['start'];
+                $vv['id'] = 0;
+                unset($vv['times']);
+                $events[] = $vv;
+            }
+            $input_arrays = $events;
+            $range_start = parseDateTime($param['start']);
+            $range_end = parseDateTime($param['end']);
+            $timeZone = null;
+            if (isset($_GET['timeZone'])) {
+                $timeZone = new DateTimeZone($_GET['timeZone']);
+            }
+
+            // Accumulate an output array of event data arrays.
+            $output_arrays = array();
+            foreach ($input_arrays as $array) {
+                // Convert the input array into a useful Event object
+                $event = new ScheduleIndex($array, $timeZone);
+                // If the event is in-bounds, add it to the output
+                if ($event->isWithinDayRange($range_start, $range_end)) {
+                    $output_arrays[] = $event->toArray();
+                }
+            }
+            return json($output_arrays);
+        } else {
+			View::assign('is_leader', isLeader($this->uid));
+            return view();
+        }
+    }
+
+    //保存日志数据
+    public function add()
+    {
+        $param = get_params();
+        $admin_id = $this->uid;
+        if ($param['id'] == 0) {
+			if (isset($param['start_time'])) {
+                $param['start_time'] = strtotime($param['start_time']);
+            }
+			if (isset($param['end_time'])) {
+                $param['end_time'] = strtotime($param['end_time']);
+            }
+            if (isset($param['end_time_a'])) {
+                $param['end_time'] = strtotime($param['end_time_a'] . '' . $param['end_time_b']);
+            }
+            if (isset($param['start_time_a'])) {
+                $param['start_time'] = strtotime($param['start_time_a'] . '' . $param['start_time_b']);
+            }
+            if (isset($param['end_time_a'])) {
+                $param['end_time'] = strtotime($param['end_time_a'] . '' . $param['end_time_b']);
+            }
+			if($param['start_time']>time()){
+				return to_assign(1, "开始时间不能大于现在时间");			
+			}
+            if ($param['end_time'] <= $param['start_time']) {
+                return to_assign(1, "结束时间需要大于开始时间");
+            }
+			if (date('d',$param['end_time']) != date('d',$param['start_time'])) {
+                return to_assign(1, "结束时间与开始时间必须是同一天");
+            }
+            $where1[] = ['delete_time', '=', 0];
+            $where1[] = ['admin_id', '=', $admin_id];
+            $where1[] = ['start_time', 'between', [$param['start_time'], $param['end_time'] - 1]];
+
+            $where2[] = ['delete_time', '=', 0];
+            $where2[] = ['admin_id', '=', $admin_id];
+            $where2[] = ['start_time', '<=', $param['start_time']];
+            $where2[] = ['start_time', '>=', $param['end_time']];
+
+            $where3[] = ['delete_time', '=', 0];
+            $where3[] = ['admin_id', '=', $admin_id];
+            $where3[] = ['end_time', 'between', [$param['start_time'] + 1, $param['end_time']]];
+
+            $record = Db::name('Schedule')
+                ->where(function ($query) use ($where1) {
+                    $query->where($where1);
+                })
+                ->whereOr(function ($query) use ($where2) {
+                    $query->where($where2);
+                })
+                ->whereOr(function ($query) use ($where3) {
+                    $query->where($where3);
+                })
+                ->count();
+            if ($record > 0) {
+                return to_assign(1, "您所选的时间区间已有工作记录，请重新选时间");
+            }
+            $param['labor_time'] = ($param['end_time'] - $param['start_time']) / 3600;
+            $param['admin_id'] = $admin_id;
+            $param['did'] = get_admin($admin_id)['did'];
+            $param['create_time'] = time();
+            $sid = Db::name('Schedule')->strict(false)->field(true)->insertGetId($param);
+            if ($sid > 0) {
+                add_log('add', $sid, $param);
+                return to_assign(0, '操作成功');
+            } else {
+                return to_assign(0, '操作失败');
+            }
+        } else {
+            $param['update_time'] = time();
+            $res = Db::name('Schedule')->strict(false)->field(true)->update($param);
+            if ($res !== false) {
+                add_log('edit', $param['id'], $param);
+                return to_assign(0, '操作成功');
+            } else {
+                return to_assign(0, '操作失败');
+            }
+        }
+    }
+
+    //删除工作记录
+    public function del()
+    {
+        $id = get_params("id");
+        $data['id'] = $id;
+        $data['delete_time'] = time();
+        if (Db::name('schedule')->update($data) !== false) {
+            add_log('delete', $data['id'], $data);
+            return to_assign(0, "删除成功");
+        } else {
+            return to_assign(1, "删除失败");
+        }
+    }
+
+    public function view()
+    {
+        $id = get_params('id');
+        $schedule = Db::name('Schedule')->where(['id' => $id])->find();
+        if (!empty($schedule)) {
+            $schedule['start_time_1'] = date('H:i', $schedule['start_time']);
+            $schedule['end_time_1'] = date('H:i', $schedule['end_time']);
+            $schedule['start_time'] = date('Y-m-d', $schedule['start_time']);
+            $schedule['end_time'] = date('Y-m-d', $schedule['end_time']);
+            $schedule['create_time'] = date('Y-m-d H:i:s', $schedule['create_time']);
+            $schedule['name'] = Db::name('Admin')->where(['id' => $schedule['admin_id']])->value('name');
+			$schedule['labor_type_string'] = '案头工作';
+			if($schedule['labor_type'] == 2){
+				$schedule['labor_type_string'] = '外勤工作';
+			}
+			$schedule['department'] = get_admin($schedule['admin_id'])['department'];
+			$schedule['work_cate'] = Db::name('WorkCate')->where(['id' => $schedule['cid']])->value('title');
+			if($schedule['tid']>0){
+				$task = Db::name('ProjectTask')->where(['id' => $schedule['tid']])->find();
+				$schedule['task'] = $task['title'];
+				$schedule['project'] = Db::name('Project')->where(['id' => $task['project_id']])->value('name');
+			}
+        }
+        if (request()->isAjax()) {
+            return to_assign(0, "", $schedule);
+        } else {			
+			View::assign('detail',$schedule);
+			if(is_mobile()){
+				return view('qiye@/index/schedule_view');
+			}
+            return $schedule;
+        }
+    }
+
+}
diff --git a/app/oa/controller/Work.php b/app/oa/controller/Work.php
new file mode 100644
index 0000000000000000000000000000000000000000..45acffd8693ab249c4f27d57342438fbdb6396ee
--- /dev/null
+++ b/app/oa/controller/Work.php
@@ -0,0 +1,285 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\oa\controller;
+
+use app\base\BaseController;
+use app\oa\model\Work as WorkModel;
+use app\oa\model\WorkRecord;
+use think\facade\Db;
+use think\facade\View;
+
+class Work extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new WorkModel();
+    }
+    //获取接收汇报列表
+    public function get_accept($map = [], $param = [])
+    {
+        $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$Work = WorkRecord::alias('a')
+			->field('a.id,a.from_uid,a.to_uid,a.send_time,a.read_time,w.id as wid,w.types,w.works,w.file_ids,w.start_date,w.end_date')
+			->join('Work w','a.work_id = w.id','left')
+			->where($map)
+			->order('a.send_time desc')
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key) {
+				$item->send_time = empty($item->send_time) ? '-' : date('Y-m-d H:i:s', $item->send_time);
+				$item->from_name = Db::name('Admin')->where(['id' => $item->from_uid])->value('name');
+				$item->to_name = Db::name('Admin')->where(['id' => $item->to_uid])->value('name');
+				if($item->start_date>0){
+					$item->start_date = date('Y-m-d',$item->start_date);
+				}
+				if($item->end_date>0){
+					$item->end_date = date('Y-m-d',$item->end_date);
+				}
+				$item->files = Db::name('File')->where('id', 'in', $item->file_ids)->count();
+			});
+		return $Work;
+    }
+	
+    //汇报列表
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+            $param = get_params();
+            $map = [];
+			if($param['send']==1){
+				if (!empty($param['types'])) {
+					$map[] = ['types', '=', $param['types']];
+				}
+				//按时间检索
+				if (!empty($param['diff_time'])) {
+					$diff_time =explode('~', $param['diff_time']);
+					$map[] = ['start_date', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1]))]];
+				}
+				$map[] = ['admin_id', '=', $this->uid];         
+				$map[] = ['delete_time', '=', 0];
+				$list =  $this->model->get_send($param,$map);
+			}
+			else{
+				if (!empty($param['read'])) {
+					if($param['read']==1){
+						$map[] = ['a.read_time', '=', 0];
+					}else{
+						$map[] = ['a.read_time', '>', 0];
+					}                
+				}
+				if (!empty($param['types'])) {
+					$map[] = ['w.types', '=', $param['types']];
+				}
+				$map[] = ['a.to_uid', '=', $this->uid];
+				$map[] = ['a.delete_time', '=', 0];
+				//按时间检索
+				if (!empty($param['diff_time'])) {
+					$diff_time =explode('~', $param['diff_time']);
+					$map[] = ['a.send_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1]))]];
+				}
+				$list = $this->get_accept($map, $param);
+			}            
+            return table_assign(0, '', $list);
+        } else {
+			$send = empty(get_params('send')) ? 1 : get_params('send');
+			return view('datalist_'.$send);
+        }
+    }
+
+    //新增&编辑
+    public function add()
+    {
+		if (request()->isAjax()) {
+			$param = get_params();
+			$id = $param['id'] ? $param['id'] : 0;
+			if(!empty($param['start_date'])){
+				$param['start_date'] = strtotime($param['start_date']);
+			}
+			if(!empty($param['end_date'])){
+				$param['end_date'] = strtotime($param['end_date']);
+			}
+			if(!empty($param['range_date'])){
+				$range_date =explode('~', $param['range_date']);
+				$param['start_date'] = strtotime(urldecode($range_date[0]));
+				$param['end_date'] = strtotime(urldecode($range_date[1]));
+			}
+			if($id>0){
+				$param['update_time'] = time();
+				$res = Db::name('Work')->strict(false)->field(true)->update($param);			
+				if ($res !== false) {
+					add_log('edit',$id,$param);
+					if($param['send']==1){
+						$users = explode(',',$param['to_uids']);
+						//组合要发的消息
+						$send_data = [];
+						foreach ($users as $key => $value) {
+							if (!$value || ($value == $this->uid)) {
+								continue;
+							}
+							$send_data[] = array(
+								'work_id' => $id,//关联id
+								'to_uid' => $value,//接收人
+								'from_uid' => $this->uid,//发送人
+								'send_time' => time()
+							);
+						}
+						Db::name('WorkRecord')->strict(false)->field(true)->insertAll($send_data);
+						Db::name('Work')->strict(false)->field('send_time')->update(['id' => $id,'send_time' => time()]);
+						add_log('send',$id);
+						$msg=[
+							'from_uid'=>$this->uid,//发送人
+							'to_uids'=>$param['to_uids'],//接收人
+							'template_id'=>'work',//消息模板标识
+							'content'=>[ //消息内容
+								'send_time'=>date('Y-m-d H:i:s'),
+								'action_id'=>$id
+							]
+						];
+						event('SendMessage',$msg);
+						return to_assign(0, '发送成功');
+					}
+					return to_assign();				
+				}
+				else{
+					return to_assign(1,'操作失败');	
+				}
+			}
+			else{
+				$param['admin_id'] = $this->uid;
+				$param['create_time'] = time();
+				$wid = Db::name('Work')->strict(false)->field(true)->insertGetId($param);
+				if ($wid !== false) {
+					add_log('add',$wid,$param);
+					if($param['send']==1){
+						$users = explode(',',$param['to_uids']);
+						//组合要发的内容
+						$send_data = [];
+						foreach ($users as $key => $value) {
+							if (!$value || ($value == $this->uid)) {
+								continue;
+							}
+							$send_data[] = array(
+								'work_id' => $wid,//关联id
+								'to_uid' => $value,//接收人
+								'from_uid' => $this->uid,//发送人
+								'send_time' => time()
+							);
+						}
+						Db::name('WorkRecord')->strict(false)->field(true)->insertAll($send_data);
+						Db::name('Work')->strict(false)->field('send_time')->update(['id' => $wid,'send_time' => time()]);
+						add_log('send',$wid);
+						$msg=[
+							'from_uid'=>$this->uid,//发送人
+							'to_uids'=>$param['to_uids'],//接收人
+							'template_id'=>'work',//消息模板ID
+							'content'=>[ //消息内容
+								'create_time'=>date('Y-m-d H:i:s'),
+								'action_id'=>$wid
+							]
+						];
+						event('SendMessage',$msg);
+						return to_assign(0, '发送成功');
+					}					
+					return to_assign();
+				}
+				else{
+					return to_assign(1,'操作失败');	
+				}
+			}
+		}
+		else{
+			$id = empty(get_params('id')) ? 0 : get_params('id');
+			$types = empty(get_params('types')) ? 1 : get_params('types');
+			if ($id > 0) {
+				$detail = $this->model->detail($id);
+				$types = $detail['types'];
+				View::assign('detail', $detail);
+			}
+			View::assign('id', $id);
+			View::assign('types', $types);
+			return view('add_'.$types);
+		}
+    }
+
+    //查看
+    public function view()
+    {
+        $param = get_params();
+        $id = $param['id'];
+		$detail = $this->model->detail($id);
+		//已读人查询
+		$read_user_names = [];
+		if($detail['admin_id'] !=$this->uid){
+			$record = Db::name('WorkRecord')->where(['work_id' => $detail['id'],'to_uid' => $this->uid])->count();
+			if ($record == 0) {
+				echo '<div style="text-align:center;color:red;margin-top:20%;">该汇报不存在</div>';exit;
+			}
+			else{
+				Db::name('WorkRecord')->where(['work_id' => $detail['id'],'to_uid' => $this->uid])->update(['read_time' => time()]);
+			}
+		}
+		else{
+			$read_user_ids= Db::name('WorkRecord')->where([['work_id','=',$detail['id']],['read_time','>',0]])->column('to_uid');
+			$read_user_names = Db::name('Admin')->where('id', 'in', $read_user_ids)->column('name');
+		}
+		$sender = get_admin($detail['admin_id']);
+		$detail['person_name'] = $sender['name'];
+		if($detail['send_time']>0){
+			$detail['send_time'] = date('Y-m-d H:i:s',$detail['send_time']);
+		}
+        //接收人查询
+		$user_names = Db::name('Admin')->where('status', 1)->where('id', 'in', $detail['to_uids'])->column('name');		
+        $detail['users'] = implode(",", $user_names);
+		$detail['read_users'] = implode(",", $read_user_names);
+		$detail['comment_auth'] = 0;
+		$type_user_array = explode(",", $detail['to_uids']);
+		if (in_array($this->uid, $type_user_array)) {
+			$detail['comment_auth'] = 1;
+		}
+        View::assign('detail', $detail);
+		if(is_mobile()){
+			return view('qiye@/index/work_view');
+		}
+        return view();
+    }
+	
+	
+    //删除汇报
+    public function del()
+    {	
+        $param = get_params();
+        $id = $param['id'];
+		$detail = Db::name('Work')->where(['id' => $id])->find();
+		if($detail['admin_id'] == $this->uid){
+			$res = Db::name('Work')->where('id',$detail['id'])->update(['delete_time' => time()]);
+			if($res!==false){
+				Db::name('WorkRecord')->where('work_id',$detail['id'])->update(['delete_time' => time()]);
+				add_log('delete', $param['id']);
+				return to_assign();
+			}
+			else{
+				return to_assign(1, '操作失败');
+			}
+		}
+		else{
+			return to_assign(1, '无权限删除');
+		}
+	}
+}
diff --git a/app/oa/event.php b/app/oa/event.php
new file mode 100644
index 0000000000000000000000000000000000000000..c9322cf82237fbc39b2aef17e70bc65f2818f850
--- /dev/null
+++ b/app/oa/event.php
@@ -0,0 +1,9 @@
+<?php
+return [
+	'listen'    => [
+        //注册监听类
+        'SendMessage' => ['app\listener\SendMessage'],
+    ],
+    //'subscribe' => ['app\subscribe\Message'],
+];
+
diff --git a/app/oa/middleware.php b/app/oa/middleware.php
new file mode 100644
index 0000000000000000000000000000000000000000..c482cdc94129fdc23d6b57facd94e78af56a3c34
--- /dev/null
+++ b/app/oa/middleware.php
@@ -0,0 +1,9 @@
+<?php
+
+// 这是系统自动生成的middleware定义文件
+return [
+    //开启session中间件
+    //'think\middleware\SessionInit',
+    //验证勾股OA是否完成安装
+    \app\home\middleware\Install::class,
+];
diff --git a/app/oa/model/Plan.php b/app/oa/model/Plan.php
new file mode 100644
index 0000000000000000000000000000000000000000..0f1fa55ed208eb6c0c41a32c615cdd307cdebcaa
--- /dev/null
+++ b/app/oa/model/Plan.php
@@ -0,0 +1,19 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\oa\model;
+use think\Model;
+class Plan extends Model
+{
+
+}
\ No newline at end of file
diff --git a/app/oa/model/Schedule.php b/app/oa/model/Schedule.php
new file mode 100644
index 0000000000000000000000000000000000000000..d7b6d4a422763706445098c981e2075435e0023f
--- /dev/null
+++ b/app/oa/model/Schedule.php
@@ -0,0 +1,68 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\oa\model;
+use think\Model;
+use think\facade\Db;
+class Schedule extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($param=[], $where=[], $whereOr=[])
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'a.end_time desc' : $param['order'];
+        try {
+            $list = self::field('a.*,u.name,w.title as work_cate')
+				->alias('a')
+				->join('Admin u', 'a.admin_id = u.id', 'LEFT')
+				->join('WorkCate w', 'w.id = a.cid', 'LEFT')
+				->where($where)
+				->where(function ($query) use ($whereOr) {
+				if (!empty($whereOr))
+					$query->whereOr($whereOr);
+				})
+				->order($order)
+                ->paginate(['list_rows'=> $rows])
+                ->each(function ($item, $key) {
+					$item->labor_type_string = '案头工作';
+					if($item->labor_type == 2){
+						$item->labor_type_string = '外勤工作';
+					}
+					if($item->did > 0){
+						$item->department = Db::name('Department')->where(['id' => $item->did])->value('title');
+					}
+					else{
+						$item->department='-';
+					}
+					if($item->tid > 0){
+						$task = Db::name('ProjectTask')->where(['id' => $item->tid])->find();
+						$item->task = $task['title'];
+						$item->project = Db::name('Project')->where(['id' => $task['project_id']])->value('name');
+					}
+					$item->start_time_a = empty($item->start_time) ? '' : date('Y-m-d', $item->start_time);
+					$item->start_time_b = empty($item->start_time) ? '' : date('H:i', $item->start_time);
+					$item->end_time_a = empty($item->end_time) ? '' : date('Y-m-d', $item->end_time);
+					$item->end_time_b = empty($item->end_time) ? '' : date('H:i', $item->end_time);
+                    $item->start_time = empty($item->start_time) ? '' : date('Y-m-d H:i', $item->start_time);
+                    $item->end_time = empty($item->end_time) ? '' : date('H:i', $item->end_time);
+                });
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/oa/model/Work.php b/app/oa/model/Work.php
new file mode 100644
index 0000000000000000000000000000000000000000..5fcb08b9ebcd394e0daf1b046522d45a1596944e
--- /dev/null
+++ b/app/oa/model/Work.php
@@ -0,0 +1,62 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\oa\model;
+
+use think\Model;
+use think\facade\Db;
+
+class Work extends Model
+{
+    //获取发送汇报列表
+    public function get_send($param = [],$where = [])
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'create_time desc' : $param['order'];
+			try {
+				$list = self::where($where)
+				->order($order)
+				->paginate(['list_rows'=> $rows])
+				->each(function ($item, $key) {
+					if($item['start_date']>0){
+						$item['start_date'] = date('Y-m-d',$item['start_date']);
+					}
+					if($item['end_date']>0){
+						$item['end_date'] = date('Y-m-d',$item['end_date']);
+					}
+					$to_names = Db::name('Admin')->where('status', 1)->where('id', 'in', $item['to_uids'])->column('name');
+					$item['to_names'] = implode(",", $to_names);
+					$item['files'] = Db::name('File')->where('id', 'in', $item['file_ids'])->count();
+				});
+				return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+	
+	//详情
+	public function detail($id)
+    {
+		$detail = self::find($id);
+		if($detail['types']>1){
+			$detail['range_date'] = date('Y-m-d',$detail['start_date']).' ~ '.date('Y-m-d',$detail['end_date']);
+		}
+		else{
+			$detail['range_date'] = date('Y-m-d',$detail['start_date']);
+		}
+		$to_unames = Db::name('Admin')->where('status', 1)->where('id', 'in', $detail['to_uids'])->column('name');
+		$detail['to_unames'] = implode(",", $to_unames);
+		$detail['file_array'] = Db::name('File')->where([['id','in',$detail['file_ids']]])->select()->toArray();
+		return $detail;
+    }
+}
diff --git a/app/oa/model/WorkRecord.php b/app/oa/model/WorkRecord.php
new file mode 100644
index 0000000000000000000000000000000000000000..6112ac8d251729d0260958c88ce67c820dddbb98
--- /dev/null
+++ b/app/oa/model/WorkRecord.php
@@ -0,0 +1,22 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\oa\model;
+
+use think\Model;
+use think\facade\Db;
+
+class WorkRecord extends Model
+{
+
+}
diff --git a/app/oa/view/meeting/datalist.html b/app/oa/view/meeting/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..598ebd4625dc5e4606498290ae348a91f625c17c
--- /dev/null
+++ b/app/oa/view/meeting/datalist.html
@@ -0,0 +1,101 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<style>
+.layui-table-tool-temp{padding-right:0}
+</style>
+<div class="p-3">
+	<form class="layui-form gg-form-bar border-x border-t" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:300px;">
+			<input type="text" class="layui-input" id="diff_time" placeholder="会议日期" readonly name="diff_time">
+		</div>
+		<div class="layui-input-inline" style="width:220px;">
+			<input type="text" name="keywords" placeholder="会议主题" class="layui-input"/>
+		</div>	
+		<div class="layui-input-inline" style="width:150px;">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form> 
+	<table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+<h3>会议纪要</h3>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','oaPicker','laydatePlus','tablePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool ,form = layui.form, laydatePlus = layui.laydatePlus;	
+		//日期范围
+		var diff_time = new laydatePlus({'target':'diff_time'});
+		
+		layui.pageTable = table.render({
+			elem: '#test',
+			title: '会议纪要列表',
+			toolbar: '#toolbarDemo',
+			defaultToolbar: false,
+			page: true, //开启分页
+			limit: 20,
+			url: "/oa/meeting/datalist", //数据接口		
+			cols: [
+				[
+					{type:'checkbox',fixed:'left'},
+					{
+						field: 'id',
+						title: '序号',
+						align: 'center',
+						width: 80
+					}, {
+						field: 'meeting_date',
+						title: '会议日期',
+						align: 'center',
+						width: 100
+					},{
+						field: 'title',
+						title: '会议主题',
+						minWidth:240
+					},{
+						field: 'did_name',
+						title: '主办部门',
+						align: 'center',
+						width: 90
+					},{
+						field: 'anchor',
+						title: '主持人',
+						align: 'center',
+						width: 90
+					},{
+						field: 'recorder_name',
+						title: '记录人',
+						align: 'center',
+						width: 90
+					}, {
+						field: 'right',
+						title: '操作',
+						width: 80,
+						align: 'center',
+						templet: function(d){
+							return '<span class="layui-btn layui-btn-xs layui-bg-blue" lay-event="view">查看</span>';
+						}
+					}
+				]
+			]
+		});
+
+		//监听行工具事件
+		table.on('tool(test)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/adm/meeting/records_view?id="+data.id);
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
diff --git a/app/oa/view/meeting/view.html b/app/oa/view/meeting/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..48966287c9e0955fcef43771c3bc25958d2a531f
--- /dev/null
+++ b/app/oa/view/meeting/view.html
@@ -0,0 +1,64 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">会议纪要</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">会议时间</td>
+			<td>{$detail.meeting_date|date='Y-m-d H:i:s'}</td>
+			<td class="layui-td-gray">主持人</td>
+			<td>{$detail.anchor_name}</td>
+			<td class="layui-td-gray">记录人</td>
+			<td>{$detail.recorder_name}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">会 议 室</td>
+			<td colspan="3">{$detail.room}</td>
+			<td class="layui-td-gray">主办部门</td>
+			<td>{$detail.did_name|default=""}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">参会人员</td>
+			<td colspan="5">{$detail.join_names}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">会议主题</td>
+			<td colspan="5">{$detail.title}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">会议内容</td>
+			<td colspan="5">{$detail.content}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2" style="vertical-align:top;">下一步<br>工作计划</td>
+			<td colspan="5">{$detail.plans}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">参会人员签字</td>
+			<td colspan="5">{$detail.sign_names}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">共享给谁</td>
+			<td colspan="5">{$detail.share_names}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">备注信息</td>
+			<td colspan="5">{$detail.remarks|default=''}</td>
+		</tr>
+	</table>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool;		
+
+}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/oa/view/news/datalist.html b/app/oa/view/news/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..77428c3a22aa1a08571e5784896afd7ce9f4facf
--- /dev/null
+++ b/app/oa/view/news/datalist.html
@@ -0,0 +1,62 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:300px">
+			<input type="text" name="keywords" placeholder="关键字" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_news" lay-filter="table_news"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <h3>公司新闻</h3>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool;
+		
+		layui.pageTable = table.render({
+			elem: "#table_news"
+			, toolbar: "#toolbarDemo"
+			,url: "/oa/news/datalist"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 80
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',title: '名称'}
+				,{field:'admin_name',title: '创建人',width:90,align:'center'}
+				,{field:'create_time', title: '创建时间',width:150,align:'center'}
+				,{width:80,fixed:'right',title: '操作', align:'center',ignoreExport:true,templet: function(d){
+					var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详细</a>';
+					return btn;
+				}}
+			]]
+		});
+			
+		table.on('tool(table_news)',function (obj) {
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/oa/news/view?id="+data.id);
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/oa/view/news/view.html b/app/oa/view/news/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..c6f9098eccadab1448f11f03d8ef760e019e5991
--- /dev/null
+++ b/app/oa/view/news/view.html
@@ -0,0 +1,63 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<link rel="stylesheet" href="{__GOUGU__}/third_party/prism/prism.css"/>
+<style>
+.text-detial-ops{line-height: 30px; color:#999; font-size: 12px; padding: 12px 0;}
+.text-detial-ops span{margin-right: 20px;}
+.text-detial-ops a{margin-right:10px;}
+.text-detial-content{padding: 8px 0; color:#333; word-break: break-all; border-top:1px solid #e8e8e8;font-size: 16px!important; line-height: 1.72!important;}
+.text-detial-content p{padding: 8px 0;}
+.text-detial-content img{max-width:98%!important; margin:0 auto; display:block; border: 1px solid #e6e6e6; -webkit-box-shadow: 0 2px 6px rgba(26,26,26,.08); box-shadow: 0 2px 6px rgba(26,26,26,.08); border-radius: 4px;}
+.text-detial-content h1,.text-detial-content h2,.text-detial-content h3,.text-detial-content h4,.text-detial-content h5{margin-top:10px;}
+.text-detial-content a{color:#186AF2; font-style:italic;}
+.text-detial-content a:hover{text-decoration:underline;}
+
+.text-detial-content p code,.blog-detial-content pre{margin:0 3px;font-size: 14px; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; background: #f6f6f6; padding: 10px; border-radius: 2px;}
+.text-detial-content p code{border: 1px solid #eee;padding: 2px 4px;}
+.text-detial-content table {border-collapse: collapse; border-spacing: 0; display: block; width: 100%; overflow: auto;  word-break: normal;word-break: keep-all; margin-top: 0;margin-bottom: 16px;}
+.text-detial-content table tr {background-color: #fff;border-top: 1px solid #ccc;}
+.text-detial-content table tr:nth-child(2n) {background-color: #f8f8f8;}
+.text-detial-content table td, .blog-detial-content table th { padding: 6px 12px;border: 1px solid #ddd; font-size:14px; }
+.text-detial-content table th {font-weight: 800;}
+.text-detial-content li {list-style: initial;margin-left: 20px;}
+:not(pre)>code[class*=language-], pre[class*=language-]{background:#fff!important;border:1px solid #e8e8e8!important; border-radius:3px;}
+.upload-file{padding:12px; background-color:#fff; border:1px solid #eee; margin-bottom:12px;}
+.upload-file h3{margin-bottom:12px;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h1>{$detail.title}</h1>
+	<div class="text-detial-ops">
+		<span>{$detail.admin_name}发表于：{$detail.create_time | date='Y-m-d H:i:s'}</span>
+	</div>
+	<div class="text-detial-content">
+	{$detail.content|raw}
+	</div>
+	{notempty name="$detail.src"}
+	<div class="py-3" style="font-size:16px;">
+		关联链接：<a class="blue" href="{$detail.src}" target="_blank">{$detail.src}</a>
+	</div>
+	{/notempty}
+	{notempty name="$detail.file_ids"}
+	<div class="upload-file layui-row">
+		<h3>相关附件</h3>
+		{volist name="$detail.file_array" id="vo"}
+			<div class="layui-col-md4" id="uploadFile{$vo.id}">{:file_card($vo,'view')}</div>
+		{/volist}
+	</div>
+	{/notempty}	
+</div>
+{/block}
+<!-- 脚本 -->
+{block name="script"}
+<script src="{__GOUGU__}/third_party/prism/prism.js"></script>
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool;	
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/oa/view/note/datalist.html b/app/oa/view/note/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..224fe907ac3ec581bd16d9231e904f3469411798
--- /dev/null
+++ b/app/oa/view/note/datalist.html
@@ -0,0 +1,69 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:300px">
+			<input type="text" name="keywords" placeholder="关键字" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_note" lay-filter="table_note"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <h3>公告通知</h3>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool;
+		
+		layui.pageTable = table.render({
+			elem: "#table_note"
+			, toolbar: "#toolbarDemo"
+			,url: "/oa/note/datalist"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 80
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',title: '公告主题'}
+				,{field:'cate',title: '所属分类',width:120,align:'center'}
+				,{field: 'time',title: '公告展示期间',align: 'center',width: 180,
+					templet: function (d) {
+						var html = d.start_time + ' ~ ' + d.end_time;
+						return html;
+					}
+				}
+				,{field:'admin_name',title: '创建人',width:90,align:'center'}
+				,{field:'create_time', title: '创建时间',width:150,align:'center'}
+				,{width:80,fixed:'right',title: '操作', align:'center',ignoreExport:true,templet: function(d){
+					var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详细</a>';
+					return btn;
+				}}
+			]]
+		});
+			
+		table.on('tool(table_note)',function (obj) {
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/oa/note/view?id="+data.id);
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/oa/view/note/view.html b/app/oa/view/note/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..b21d5ac0f167fcf4f5a908a04b269525e54cddc1
--- /dev/null
+++ b/app/oa/view/note/view.html
@@ -0,0 +1,64 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<link rel="stylesheet" href="{__GOUGU__}/third_party/prism/prism.css"/>
+<style>
+.text-detial-ops{line-height: 30px; color:#999; font-size: 12px; padding: 12px 0;}
+.text-detial-ops span{margin-right: 20px;}
+.text-detial-ops a{margin-right:10px;}
+.text-detial-content{padding: 8px 0; color:#333; word-break: break-all; border-top:1px solid #e8e8e8;font-size: 16px!important; line-height: 1.72!important;}
+.text-detial-content p{padding: 8px 0;}
+.text-detial-content img{max-width:98%!important; margin:0 auto; display:block; border: 1px solid #e6e6e6; -webkit-box-shadow: 0 2px 6px rgba(26,26,26,.08); box-shadow: 0 2px 6px rgba(26,26,26,.08); border-radius: 4px;}
+.text-detial-content h1,.text-detial-content h2,.text-detial-content h3,.text-detial-content h4,.text-detial-content h5{margin-top:10px;}
+.text-detial-content a{color:#186AF2; font-style:italic;}
+.text-detial-content a:hover{text-decoration:underline;}
+
+.text-detial-content p code,.blog-detial-content pre{margin:0 3px;font-size: 14px; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; background: #f6f6f6; padding: 10px; border-radius: 2px;}
+.text-detial-content p code{border: 1px solid #eee;padding: 2px 4px;}
+.text-detial-content table {border-collapse: collapse; border-spacing: 0; display: block; width: 100%; overflow: auto;  word-break: normal;word-break: keep-all; margin-top: 0;margin-bottom: 16px;}
+.text-detial-content table tr {background-color: #fff;border-top: 1px solid #ccc;}
+.text-detial-content table tr:nth-child(2n) {background-color: #f8f8f8;}
+.text-detial-content table td, .blog-detial-content table th { padding: 6px 12px;border: 1px solid #ddd; font-size:14px; }
+.text-detial-content table th {font-weight: 800;}
+.text-detial-content li {list-style: initial;margin-left: 20px;}
+:not(pre)>code[class*=language-], pre[class*=language-]{background:#fff!important;border:1px solid #e8e8e8!important; border-radius:3px;}
+.upload-file{padding:12px; background-color:#fff; border:1px solid #eee; margin-bottom:12px;}
+.upload-file h3{margin-bottom:12px;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-5">
+	<h1>{$detail.title}</h1>
+	<div class="text-detial-ops">
+		<span>{$detail.admin_name}发表于：{$detail.create_time | date='Y-m-d H:i:s'}</span><span>公告分类：{$detail.cate}</span>
+		<span>展示期间：{$detail.start_time | date='Y-m-d'} - {$detail.end_time | date='Y-m-d'}</span>
+	</div>
+	<div class="text-detial-content">
+	{$detail.content|raw}
+	</div>
+	{notempty name="$detail.src"}
+	<div class="py-3" style="font-size:16px;">
+		关联链接：<a class="blue" href="{$detail.src}" target="_blank">{$detail.src}</a>
+	</div>
+	{/notempty}
+	{notempty name="$detail.file_ids"}
+	<div class="upload-file layui-row">
+		<h3>相关附件</h3>
+		{volist name="$detail.file_array" id="vo"}
+			<div class="layui-col-md4" id="uploadFile{$vo.id}">{:file_card($vo,'view')}</div>
+		{/volist}
+	</div>
+	{/notempty}	
+</div>
+{/block}
+<!-- 脚本 -->
+{block name="script"}
+<script src="{__GOUGU__}/third_party/prism/prism.js"></script>
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool;	
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/oa/view/plan/calendar.html b/app/oa/view/plan/calendar.html
new file mode 100644
index 0000000000000000000000000000000000000000..f074e5fd34dfc92787826eb94615e37d530cbd2c
--- /dev/null
+++ b/app/oa/view/plan/calendar.html
@@ -0,0 +1,548 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<link rel="stylesheet" href="{__GOUGU__}/third_party/fullcalendar/main.min.css"/>
+<style>
+#calendar {width: 100%;margin: 0 auto; background-color:#fff;
+-moz-user-select: none; /*火狐*/
+-webkit-user-select: none; /*webkit浏览器*/
+}
+.fc .fc-toolbar.fc-header-toolbar{margin-bottom:0;border:1px solid #eeeeee; border-bottom:none;padding:15px 12px;}
+.fc-col-header{background-color:#fafafa;}
+.fc .fc-button-primary {color: #fff; background-color: #1E9FFF; border-color: #1E9FFF;}
+.fc .fc-button-primary:not(:disabled).fc-button-active, .fc .fc-button-primary:not(:disabled):active { color: #fff; background-color: #FBBC05; border-color: #FBBC05;}
+.fc .fc-button-primary:focus, .fc .fc-button-primary:not(:disabled).fc-button-active:focus, .fc .fc-button-primary:not(:disabled):active:focus {box-shadow: 0 0 0 0;}
+.fc .fc-button-primary:hover{color:#fff; background-color:#52B5FF; border-color:#52B5FF;}
+.fc-daygrid-event-harness{cursor:pointer;}
+.fc .fc-daygrid-week-number{font-size:12px;}
+.fc-daygrid-block-event .fc-event-time{font-weight:800}
+.fc-h-event .fc-event-main{color:#111111}
+.fc-theme-standard .fc-scrollgrid,.fc-theme-standard td, .fc-theme-standard th{border-color:#eee;}
+.fc-v-event .fc-event-main-frame{color:#333}
+/*今天背景色和字体颜色 */
+.fc .fc-daygrid-day.fc-day-today .fc-event-title,.fc .fc-daygrid-day.fc-day-today .fc-event-time,.fc .fc-daygrid-day.fc-day-today .fc-daygrid-day-number{font-weight:800;color:#FF5722;}
+.calendar-select{width:100px; height:40px; position:absolute; top:31px; right:262px; z-index:100;}
+.calendar-select .layui-input{height: 36px; line-height: 1.2;}
+.layui-tags-span {padding: 3px 6px;font-size: 12px; background-color:#fff; border-radius: 3px; margin:2px 0; margin-right: 5px; border: 1px solid #e6e6e6; display: inline-block;}
+.layui-layer-content .layui-table-view .layui-table td,.layui-layer-content .layui-table-view .layui-table th{padding:1px 0;}
+.layui-unselect dl {max-height:188px;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<script src="{__GOUGU__}/third_party/fullcalendar/main.min.js"></script>
+<div class="p-page">
+	<div id="calendar"></div>
+	{gt name="is_leader" value="0"}
+	<div class="calendar-select">
+		<div class="layui-input-inline"><input type="text" placeholder="选择下属员工" class="layui-input" data-event="select" autocomplete="off"/></div>		
+	</div>
+	{/gt}
+</div>
+<!-- /主体 -->
+{/block}
+{block name="copyright"}{/block}
+<!-- 脚本 -->
+{block name="script"}
+<script type="text/javascript">
+	var uid=0;	
+	function addZero(num){
+		if(num<10){
+			num='0'+num;
+		}
+		return num;
+	}
+	const moduleInit = ['tool','oaPicker'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool, oaPicker = layui.oaPicker,laydate = layui.laydate,dropdown = layui.dropdown;
+		
+		// 选择下属员工
+		$('body').on('click','[data-event="select"]',function(){
+			var that = $(this);
+			oaPicker.employeeInit({
+				title:"选择下属",
+				department_url: "/api/index/get_department_tree_sub",
+				employee_url: "/api/index/get_employee_sub",
+				ids: '',
+				names: '',
+				type: 1,
+				callback:function(data){
+					//这里是选择后的回调方法，可以根据具体需求自定义写哦
+					let select_id=[],select_name=[];
+					for(var a=0; a<data.length;a++){
+						select_id.push(data[a].id);
+						select_name.push(data[a].name);
+					}
+					that.val(select_name.join(','));
+					uid = select_id.join(','); 
+					calendar.refetchEvents();
+				}
+			})
+		});
+		  
+		function addEvent(detail){			
+			var type='<span style="color:#aaa">请选择</span>';
+			if(detail.type==1){
+				type = '<span class="layui-badge-dot"></span> 紧急';
+			}
+			else if(detail.type==2){
+				type = '<span class="layui-badge-dot layui-bg-orange"></span> 重要';
+			}
+			else if(detail.type==3){
+				type = '<span class="layui-badge-dot layui-bg-blue"></span> 次要';
+			}
+			else if(detail.type==4){
+				type = '<span class="layui-badge-dot layui-bg-green"></span> 不重要';
+			}
+			else if(detail.type==5){
+				type = '<span class="layui-badge-dot layui-bg-black"></span> 无优先级';
+			}
+			
+			var remind_type='不提醒';
+			if(detail.remind_type==1){
+				remind_type = '提前5分钟';
+			}
+			else if(detail.remind_type==2){
+				remind_type = '提前15分钟';
+			}
+			else if(detail.remind_type==3){
+				remind_type = '提前30分钟';
+			}
+			else if(detail.remind_type==4){
+				remind_type = '提前1小时';
+			}
+			else if(detail.remind_type==5){
+				remind_type = '提前2小时';
+			}else if(detail.remind_type==6){
+				remind_type = '提前1天';
+			}
+			
+			var content='<form class="layui-form" style="width:728px">\
+							<table class="layui-table" style="margin:12px 12px 0;">\
+								<tr>\
+									<td class="layui-td-gray-2">日程时间范围<font>*</font></td>\
+									<td>\
+										<input id="start_time_a" name="start_time_a" style="width:90px; display:inline-block;" autocomplete="off" class="layui-input" value="'+detail.start_time_a+'" readonly lay-verify="required" placeholder="请选择时间" lay-reqText="请选择时间"><div style="display: inline-block; margin-left:3px; width: 80px;"><select lay-filter="start_time_b" id="start_time_b"></select></div> 至 <input id="end_time_a" name="end_time_a" style="width:90px; display:inline-block;" autocomplete="off" class="layui-input" value="" readonly lay-verify="required" placeholder="请选择时间" lay-reqText="请选择时间"><div style="display: inline-block; margin-left:3px; width: 80px;"><select lay-filter="end_time_b" id="end_time_b"></select></div>\
+									</td>\
+									<td class="layui-td-gray">提醒<font>*</font></td>\
+									<td>\
+										<div class="layui-input" id="remind_type" style="width:120px; line-height:35px;">'+remind_type+'</div>\
+									</td>\
+								</tr>\
+								<tr>\
+									<td class="layui-td-gray">日程内容<font>*</font></td>\
+									<td><input name="title" class="layui-input" value="'+detail.title+'" lay-verify="required" placeholder="请完成日程内容" lay-reqText="请完成日程内容"></td>\
+									<td class="layui-td-gray">优先级<font>*</font></td>\
+									<td>\
+										<div class="layui-input" id="type" style="width:120px; line-height:35px;">'+type+'</div>\
+									</td>\
+								</tr>\
+								<tr>\
+									<td class="layui-td-gray-2">日程详细描述</td>\
+									<td colspan="3">\
+										<textarea name="remark" form-input="remark" class="layui-textarea" style="min-height:150px;">'+detail.remark+'</textarea>\
+									</td>\
+								</tr>\
+							</table>\
+						</form>';
+			layer.open({
+				type:1,
+				title:'创建日程安排',
+				area:['750px','399px'],
+				content:content,
+				success:function(){
+					//日期时间范围
+					laydate.render({
+						elem: '#start_time_a',
+						type: 'date',
+						format: 'yyyy-MM-dd',
+						showBottom: false,
+						done:function(a,b,c){
+							detail.start_time_a=a;
+						}
+					});
+
+					//日期时间范围
+					laydate.render({
+						elem: '#end_time_a',
+						type: 'date',
+						format: 'yyyy-MM-dd',
+						showBottom: false,
+						done:function(a,b,c){
+							detail.end_time_a=a;
+						}
+					});
+					$('#start_time_a,#end_time_a').empty();
+					
+					var hourArray=[];
+					for(var h=0;h<24;h++){
+						var t=h<10?'0'+h:h
+						var t_1=t+':00',t_2=t+':15',t_3=t+':30',t_4=t+':45';
+						hourArray.push(t_1,t_2,t_3,t_4);
+					}					
+					var html_1='', html_2='',def_h1=detail.start_time_b=detail.start_time_b,def_h2='';
+					for(var s=0;s<hourArray.length;s++){
+						var check_1='',check_2='';
+						if(hourArray[s]==def_h1){
+							check_1='selected';
+						}
+						if(hourArray[s]==def_h2){
+							check_2='selected';
+						}
+						html_1 += '<option value="'+hourArray[s]+'" '+check_1+'>'+hourArray[s]+'</option>';
+						html_2 += '<option value="'+hourArray[s]+'" '+check_2+'>'+hourArray[s]+'</option>';
+					}
+					
+					$('#start_time_b').append(html_1);
+					$('#end_time_b').append(html_2);
+					form.render();
+					
+					$('[name="title"]').on('input',function(){
+						var _val=$(this).val();
+						detail.title=_val;
+					});	
+					form.on('select(start_time_b)', function(data){
+						detail.start_time_b=data.value;
+					});
+					form.on('select(end_time_b)', function(data){
+						detail.end_time_b=data.value;
+					});
+					$('[form-input="remark"]').on('input',function(){
+						var _val=$(this).val();
+						detail.remark=_val;
+					});
+
+					dropdown.render({
+						elem: '#type'
+						,data: [{
+						  title: '紧急',
+						  templet: function(d){
+							  return '<span class="layui-badge-dot"></span> ' + d.title;
+						  },
+						  id: 1
+						},{
+						  title: '重要',
+						  templet: function(d){
+							  return '<span class="layui-badge-dot layui-bg-orange"></span> ' + d.title;
+						  },
+						  id: 2
+						},{
+						  title: '次要',
+						  templet: function(d){
+							  return '<span class="layui-badge-dot layui-bg-blue"></span> ' + d.title;
+						  },
+						  id: 3
+						},{
+						  title: '不重要',
+						  templet: function(d){
+							  return '<span class="layui-badge-dot layui-bg-green"></span> ' + d.title;
+						  },
+						  id: 4
+						},{
+						  title: '无优先级',
+						  templet: function(d){
+							  return '<span class="layui-badge-dot layui-bg-black"></span> ' + d.title;
+						  },
+						  id: 5
+						}]
+						,click: function(obj){
+							this.elem.html(obj.title);
+							detail.type = obj.id;
+						}
+						,style: 'width: 120px;'
+					  });
+					  
+					  dropdown.render({
+						elem: '#remind_type'
+						,data: [{
+						  title: '不提醒',
+						  id: 0
+						},{
+						  title: '提前5分钟',
+						  id: 1
+						},{
+						  title: '提前15分钟',
+						  id: 2
+						},{
+						  title: '提前30分钟',
+						  id: 3
+						},{
+						  title: '提前1小时',
+						  id: 4
+						},{
+						  title: '提前2小时',
+						  id: 5
+						},{
+						  title: '提前1天',
+						  id:6
+						}]
+						,click: function(obj){
+						  this.elem.html(obj.title);
+						  detail.remind_type = obj.id;
+						}
+						,style: 'width: 120px;'
+					  });					
+				},
+				btn: ['确定提交'],
+				btnAlign:'c',
+				yes: function(idx){
+					if(detail.start_time_a=='' || detail.end_time_a==''){
+						layer.msg('请完善日程时间范围');
+						return;
+					}
+					if(detail.title==''){
+						layer.msg('请填写日程内容');
+						return;
+					}
+					if(detail.type==0){
+						layer.msg('请选择日程优先级');
+						return;
+					}
+					console.log(detail);
+					$.ajax({
+						url: "/oa/plan/add",
+						type:'post',
+						data:detail,
+						success:function(e){
+							layer.msg(e.msg);
+							if(e.code==0){								
+								layer.close(idx);								
+								setTimeout(function(){
+									window.location.reload();
+								},1000)	
+							}
+						}
+					})			
+				}
+			})	
+		}
+		
+		
+		//查看日程记录
+		function viewEvent(detail){
+			var work_type='<span style="color:#393D49">无优先级</span>';
+			if(detail.type==1){
+				work_type = '<span style="color:#FF5722">紧急</span>';
+			}
+			else if(detail.type==2){
+				work_type = '<span style="color:#FFB800">重要</span>';
+			}
+			else if(detail.type==3){
+				work_type = '<span style="color:#1E9FFF">次要</span>';
+			}
+			else if(detail.type==4){
+				work_type = '<span style="color:#009688">不重要</span>';
+			}		
+			var content='<div style="width:724px">\
+							<table class="layui-table" style="margin:12px 12px 0;">\
+								<tr>\
+									<td class="layui-td-gray-2">日程时间范围</td>\
+									<td>'+detail.start_time+' 至 '+detail.end_time+'</td>\
+									<td class="layui-td-gray">提醒时间</td>\
+									<td>'+detail.remind_time+'</td>\
+								</tr>\
+								<tr>\
+									<td class="layui-td-gray-2">日程安排内容</td>\
+									<td>'+detail.title+'</td>\
+									<td class="layui-td-gray">优先级</td>\
+									<td>'+work_type+'</td>\
+								</tr>\
+								<tr>\
+									<td class="layui-td-gray-2">日程内容描述</td>\
+									<td colspan="3">'+detail.remark+'</td>\
+								</tr>\
+							</table>\
+						</div>';
+			layer.open({
+				type:1,
+				title:'查看日程安排',
+				area:['750px','398px'],
+				content:content,
+				success:function(){
+					
+				},
+				btn: ['关闭'],
+				btnAlign: 'c',
+				yes: function(idx){
+					layer.close(idx);			
+				}
+			})	
+		}
+		
+		//请求事件api数据
+		function eventApi(id){
+			if(id==0){
+				return false;
+			}
+			$.ajax({
+				url: "/oa/plan/view",
+				type:'post',
+				data:{id:id},
+				success:function(res){					
+					var detail=res.data;
+					viewEvent(detail);
+				}
+			});			
+		}
+		
+		//日历
+		var calendarEl = document.getElementById('calendar');
+		var calendar = new FullCalendar.Calendar(calendarEl, {
+			views: {
+				dayGrid: {
+					viewDidMount:function(arg){
+						calendar.setOption('height', window.innerHeight-30);
+					}
+				},
+				timeGrid: {
+					viewDidMount:function(arg){
+						calendar.setOption('height', 'auto');
+					}
+				},
+				week: {
+					viewDidMount:function(arg){
+						calendar.setOption('height', 'auto');
+					}
+				},
+				day: {
+					viewDidMount:function(arg){
+						calendar.setOption('height', 'auto');
+					}
+				}
+			},
+			//initialDate: '2020-09-12',//默认显示日期
+			initialView: 'dayGridMonth',//默认显示月视图
+			customButtons: {
+				clear: {
+					text: '清空员工', click: function () {
+						uid = 0;
+						$('[data-event="select"]').val('');
+						calendar.refetchEvents();
+					}
+				}
+            },
+			headerToolbar: {
+				left: 'prev,next',//prev,next today add
+				center: 'title',
+				right: 'clear dayGridMonth,timeGridWeek,listWeek' //clear dayGridMonth,timeGridWeek,timeGridDay,listWeek
+			},
+			height: 'auto',//自动高度
+			navLinks: true, // can click day/week names to navigate views
+			editable: true,//确定是否可以拖拉调整日历事件的时间。
+			eventResize:function(ev) {
+				var arg = ev.event
+				console.log(arg);
+				var detail={};
+				detail['id']=arg.id;
+				detail['start_time_a']=arg.start.getFullYear()+'-'+addZero(arg.start.getMonth()+1)+'-'+addZero(arg.start.getDate());
+				detail['end_time_a']=arg.end.getFullYear()+'-'+addZero(arg.end.getMonth()+1)+'-'+addZero(arg.end.getDate());		
+				detail['start_time_b']=addZero(arg.start.getHours())+':'+addZero(arg.start.getMinutes());
+				detail['end_time_b']=addZero(arg.end.getHours())+':'+addZero(arg.end.getMinutes());	
+				console.log(detail);
+				$.ajax({
+					url: "/home/plan/add",
+					type:'post',
+					data:detail,
+					success:function(e){
+						layer.msg(e.msg);
+						if(e.code==1){							
+							ev.revert();
+						}
+					}
+				})
+			},
+			eventDrop:function(ev) {
+				var arg = ev.event
+				console.log(arg);
+				var detail={};
+				detail['id']=arg.id;
+				detail['start_time_a']=arg.start.getFullYear()+'-'+addZero(arg.start.getMonth()+1)+'-'+addZero(arg.start.getDate());
+				detail['end_time_a']=arg.end.getFullYear()+'-'+addZero(arg.end.getMonth()+1)+'-'+addZero(arg.end.getDate());		
+				detail['start_time_b']=addZero(arg.start.getHours())+':'+addZero(arg.start.getMinutes());
+				detail['end_time_b']=addZero(arg.end.getHours())+':'+addZero(arg.end.getMinutes());	
+				console.log(detail);
+				$.ajax({
+					url: "/oa/plan/add",
+					type:'post',
+					data:detail,
+					success:function(e){
+						layer.msg(e.msg);
+						if(e.code==1){							
+							ev.revert();
+						}
+					}
+				})
+			},
+			selectable: true,//拖拉选择日期
+			selectMirror: true,//是否在用户拖动时绘制"占位符"事件。
+			select: function(arg) {
+				var detail={};
+				detail['id']=0;
+				detail['title']='';
+				detail['start_time_a']=arg.start.getFullYear()+'-'+addZero(arg.start.getMonth()+1)+'-'+addZero(arg.start.getDate());
+				detail['end_time_a']="";		
+				detail['start_time_b']="09:00";
+				detail['end_time_b']="00:00";		
+				detail['remark']='';
+				detail['type']=0;
+				detail['remind_type']=0;
+				console.log(detail);	
+				addEvent(detail);	
+			},
+			nowIndicator: true,
+			firstDay: 1,
+			weekNumbers: true,// 是否开启周数
+			displayEventEnd: false, //所有视图显示结束时间
+			eventTimeFormat: { // 事件的时间格式，like '14:30:00'
+				hour: '2-digit',
+				minute: '2-digit',
+				//second: '2-digit',
+				meridiem: false,
+				hour12: false //设置时间为24小时
+			},
+			slotLabelFormat: { // 列表视图左边的时间格式，like '14:30:00'
+				hour: '2-digit',
+				minute: '2-digit',
+				//second: '2-digit',
+				meridiem: false,
+				hour12: false //设置时间为24小时
+			},
+			locale: 'zh-cn',//语言
+			buttonText: {
+				//按钮文本
+				today: '今天',
+				month: '月',
+				week: '周',
+				day: '日',
+				list: '日程列表',
+			},
+			weekText: '周',
+			allDayText: '全天',
+			moreLinkText: function(n) {
+				return '另外 ' + n + ' 个'
+			},
+			noEventsText: '没有事件显示',
+			events: function(fetchInfo, successCallback, failureCallback ){
+				$.ajax({
+					type:"POST",
+					url: "/oa/plan/calendar",
+					dataType:"json",
+					data:{start:fetchInfo.startStr,end:fetchInfo.endStr,uid:uid},
+					success:function(result){
+						//console.info(result);
+						successCallback(result);
+					},
+					error:function(){
+						failureCallback();
+					}
+				})
+			},
+			eventClick: function(info) {
+				//console.log(info.event);
+				eventApi(info.event.id);
+			}
+		});
+		calendar.render();
+	}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/oa/view/plan/datalist.html b/app/oa/view/plan/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..53cb45f5f69cd59d4dcc94447429ddb407e34f5d
--- /dev/null
+++ b/app/oa/view/plan/datalist.html
@@ -0,0 +1,464 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+.layui-unselect dl {max-height:188px;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-x border-t" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:180px">
+			<input type="text"  name="diff_time" class="layui-input tool-time" data-range="~" placeholder="选择时间区间" readonly>
+		</div>
+		{gt name="is_leader" value="0"}
+		<div class="layui-input-inline" style="width:120px;">
+			<input type="text" name="username" placeholder="请选择下属员工" class="layui-input picker-sub" readonly />
+			<input type="text" name="uid" value="" style="display:none" />	
+		</div>
+		{/gt}
+		<div class="layui-input-inline" style="width:120px;">
+			<select name="type">
+				<option value="">选择优先级</option>
+				<option value="1">紧急</option>
+				<option value="2">重要</option>
+				<option value="3">次要</option>
+				<option value="4">不重要</option>
+				<option value="5">无优先级</option>
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:240px;">
+			<input type="text" name="keywords"  placeholder="输入关键字，日程安排内容" class="layui-input"/>
+		</div>	
+		<div class="layui-input-inline" style="width:150px;">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form> 
+	<div>
+		<table class="layui-hide" id="test" lay-filter="test"></table>
+	</div>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm addLoan" type="button">+ 新增日程安排</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool','tablePlus','oaPicker'];
+	function gouguInit() {
+		var form = layui.form,table = layui.tablePlus,tool=layui.tool,dropdown = layui.dropdown,laydate = layui.laydate;  
+
+		layui.pageTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,title:'日程安排列表'
+			,url: "/oa/plan/datalist"
+			,cellMinWidth: 80
+			,height: 'full-112'
+			,cols: [[ //表头
+				{field: 'id', title: '序号',fixed: 'left', width:80, align:'center'}
+				,{field: 'type', title: '优先级', align:'center',width:100,templet:function(d){
+					var html='';
+					if(d.type==1){
+						html = '<span style="color:#FF5722">『紧急』</span>';
+					}
+					else if(d.type==2){
+						html = '<span style="color:#FFB800">『重要』</span>';
+					}
+					else if(d.type==3){
+						html = '<span style="color:#1E9FFF">『次要』</span>';
+					}
+					else if(d.type==4){
+						html = '<span style="color:#009688">『不重要』</span>';
+					}
+					else if(d.type==5){
+						html = '<span style="color:#393D49">『无优先级』</span>';
+					}
+					return html;
+				}}
+				,{field: 'start_time', title: '日程时间范围', align:'center',width:260,templet:function(d){
+					var html=d.start_time+'至'+d.end_time;
+					return html;
+				}}
+				,{field: 'title', title: '日程安排内容'}
+				,{field: 'remind_time', title: '提醒时间', align:'center',width:136}
+				,{field: 'right', title: '操作',fixed:'right', width:120, align:'center',templet:function(d){
+					var html='<div class="layui-btn-group">';
+					html+='<button class="layui-btn layui-btn-xs layui-btn-normal" lay-event="view">查看</button>';
+					if(d.admin_id==login_admin){
+						html+='<button class="layui-btn layui-btn-xs" lay-event="edit">编辑</button>';
+						html+='<button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button>';
+					}
+					html+='</div>';
+					return html;
+				}}
+			]]
+		});
+
+		//操作
+		table.on('tool(test)', function(obj){
+			var data = obj.data;
+			if(obj.event === 'edit'){
+				$.ajax({
+					url: "/oa/plan/view",
+					type:'get',
+					data:{id:data.id},
+					success:function(e){
+						if(e.code==0){			
+							var detail={};
+							detail['id']=e.data.id;
+							detail['title']=e.data.title;
+							detail['start_time_a']=e.data.start_time_a;
+							detail['end_time_a']=e.data.end_time_a;		
+							detail['start_time_b']=e.data.start_time_b;
+							detail['end_time_b']=e.data.end_time_b;
+							detail['remark']=e.data.remark;
+							detail['type']=e.data.type;
+							detail['remind_type']=e.data.remind_type;
+							addEvent(detail);
+						}
+					}
+				})	
+				return;				
+			}
+			else if(obj.event === 'view'){
+				$.ajax({
+					url: "/oa/plan/view",
+					type:'get',
+					data:{id:data.id},
+					success:function(e){
+						if(e.code==0){								
+							viewEvent(e.data);
+						}
+					}
+				})
+				return;				
+			}
+			else if(obj.event === 'del'){
+				layer.confirm('您确定要删除该日程', {
+					icon: 3,
+					title: '提示'
+				}, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.delete("/oa/plan/del", { id: obj.data.id }, callback);
+					layer.close(index);
+				});
+				return;				
+			}
+		});
+		
+		//查看日程记录
+		function viewEvent(detail){
+			var work_type='<span style="color:#393D49">无优先级</span>';
+			if(detail.type==1){
+				work_type = '<span style="color:#FF5722">紧急</span>';
+			}
+			else if(detail.type==2){
+				work_type = '<span style="color:#FFB800">重要</span>';
+			}
+			else if(detail.type==3){
+				work_type = '<span style="color:#1E9FFF">次要</span>';
+			}
+			else if(detail.type==4){
+				work_type = '<span style="color:#009688">不重要</span>';
+			}		
+			var content='<div style="width:724px">\
+							<table class="layui-table" style="margin:12px 12px 0;">\
+								<tr>\
+									<td class="layui-td-gray-2">日程时间范围</td>\
+									<td>'+detail.start_time+' 至 '+detail.end_time+'</td>\
+									<td class="layui-td-gray">提醒时间</td>\
+									<td>'+detail.remind_time+'</td>\
+								</tr>\
+								<tr>\
+									<td class="layui-td-gray-2">日程安排内容</td>\
+									<td>'+detail.title+'</td>\
+									<td class="layui-td-gray">优先级</td>\
+									<td>'+work_type+'</td>\
+								</tr>\
+								<tr>\
+									<td class="layui-td-gray-2">日程内容描述</td>\
+									<td colspan="3">'+detail.remark+'</td>\
+								</tr>\
+							</table>\
+						</div>';
+			layer.open({
+				type:1,
+				title:'日程安排',
+				area:['750px','398px'],
+				content:content,
+				success:function(){
+					
+				},
+				btn: ['关闭'],
+				btnAlign: 'c',
+				yes: function(idx){
+					layer.close(idx);			
+				}
+			})	
+		}
+		  
+		$('body').on('click','.addLoan',function(){
+			var detail={};
+			detail['id']=0;
+			detail['title']='';
+			detail['start_time_a']='';
+			detail['end_time_a']='';		
+			detail['start_time_b']='09:00';
+			detail['end_time_b']='18:00';		
+			detail['remark']='';
+			detail['type']=0;
+			detail['remind_type']=0;
+			addEvent(detail);		
+		});
+
+
+		function addEvent(detail){			
+			var type='<span style="color:#aaa">请选择</span>';
+			if(detail.type==1){
+				type = '<span class="layui-badge-dot"></span> 紧急';
+			}
+			else if(detail.type==2){
+				type = '<span class="layui-badge-dot layui-bg-orange"></span> 重要';
+			}
+			else if(detail.type==3){
+				type = '<span class="layui-badge-dot layui-bg-blue"></span> 次要';
+			}
+			else if(detail.type==4){
+				type = '<span class="layui-badge-dot layui-bg-green"></span> 不重要';
+			}
+			else if(detail.type==5){
+				type = '<span class="layui-badge-dot layui-bg-black"></span> 无优先级';
+			}
+			
+			var remind_type='不提醒';
+			if(detail.remind_type==1){
+				remind_type = '提前5分钟';
+			}
+			else if(detail.remind_type==2){
+				remind_type = '提前15分钟';
+			}
+			else if(detail.remind_type==3){
+				remind_type = '提前30分钟';
+			}
+			else if(detail.remind_type==4){
+				remind_type = '提前1小时';
+			}
+			else if(detail.remind_type==5){
+				remind_type = '提前2小时';
+			}else if(detail.remind_type==6){
+				remind_type = '提前1天';
+			}
+			
+			var content='<form class="layui-form" style="width:728px">\
+							<table class="layui-table" style="margin:12px 12px 0;">\
+								<tr>\
+									<td class="layui-td-gray-2">日程时间范围<font>*</font></td>\
+									<td>\
+										<input id="start_time_a" name="start_time_a" style="width:90px; display:inline-block;" autocomplete="off" class="layui-input" value="'+detail.start_time_a+'" readonly lay-verify="required" placeholder="请选择时间" lay-reqText="请选择时间"><div style="display: inline-block; margin-left:3px; width: 80px;"><select lay-filter="start_time_b" id="start_time_b"></select></div> 至 <input id="end_time_a" name="end_time_a" style="width:90px; display:inline-block;" autocomplete="off" class="layui-input" value="'+detail.end_time_a+'" readonly lay-verify="required" placeholder="请选择时间" lay-reqText="请选择时间"><div style="display: inline-block; margin-left:3px; width: 80px;"><select lay-filter="end_time_b" id="end_time_b"></select></div>\
+									</td>\
+									<td class="layui-td-gray">提醒<font>*</font></td>\
+									<td>\
+										<div class="layui-input" id="remind_type" style="width:120px; line-height:35px;">'+remind_type+'</div>\
+									</td>\
+								</tr>\
+								<tr>\
+									<td class="layui-td-gray">日程内容<font>*</font></td>\
+									<td><input name="title" class="layui-input" value="'+detail.title+'" lay-verify="required" placeholder="请完成日程内容" lay-reqText="请完成日程内容"></td>\
+									<td class="layui-td-gray">优先级<font>*</font></td>\
+									<td>\
+										<div class="layui-input" id="type" style="width:120px; line-height:35px;">'+type+'</div>\
+									</td>\
+								</tr>\
+								<tr>\
+									<td class="layui-td-gray-2">日程详细描述</td>\
+									<td colspan="3">\
+										<textarea name="remark" form-input="remark" class="layui-textarea" style="min-height:150px;">'+detail.remark+'</textarea>\
+									</td>\
+								</tr>\
+							</table>\
+						</form>';
+			layer.open({
+				type:1,
+				title:'日程安排',
+				area:['750px','398px'],
+				content:content,
+				success:function(){
+					//日期时间范围
+					laydate.render({
+						elem: '#start_time_a',
+						type: 'date',
+						format: 'yyyy-MM-dd',
+						showBottom: false,
+						done:function(a,b,c){
+							detail.start_time_a=a;
+						}
+					});
+
+					//日期时间范围
+					laydate.render({
+						elem: '#end_time_a',
+						type: 'date',
+						format: 'yyyy-MM-dd',
+						showBottom: false,
+						done:function(a,b,c){
+							detail.end_time_a=a;
+						}
+					});
+					$('#start_time_a,#end_time_a').empty();
+					
+					var hourArray=[];
+					for(var h=0;h<24;h++){
+						var t=h<10?'0'+h:h
+						var t_1=t+':00',t_2=t+':15',t_3=t+':30',t_4=t+':45';
+						hourArray.push(t_1,t_2,t_3,t_4);
+					}					
+					var html_1='', html_2='',def_h1=detail.start_time_b,def_h2=detail.end_time_b;
+					for(var s=0;s<hourArray.length;s++){
+						var check_1='',check_2='';
+						if(hourArray[s]==def_h1){
+							check_1='selected';
+						}
+						if(hourArray[s]==def_h2){
+							check_2='selected';
+						}
+						html_1 += '<option value="'+hourArray[s]+'" '+check_1+'>'+hourArray[s]+'</option>';
+						html_2 += '<option value="'+hourArray[s]+'" '+check_2+'>'+hourArray[s]+'</option>';
+					}
+					
+					$('#start_time_b').append(html_1);
+					$('#end_time_b').append(html_2);
+					form.render();
+					
+					$('[name="title"]').on('input',function(){
+						var _val=$(this).val();
+						detail.title=_val;
+					});	
+					form.on('select(start_time_b)', function(data){
+						detail.start_time_b=data.value;
+					});
+					form.on('select(end_time_b)', function(data){
+						detail.end_time_b=data.value;
+					});
+					$('[form-input="remark"]').on('input',function(){
+						var _val=$(this).val();
+						detail.remark=_val;
+					});
+
+					dropdown.render({
+						elem: '#type'
+						,data: [{
+						  title: '紧急',
+						  templet: function(d){
+							  return '<span class="layui-badge-dot"></span> ' + d.title;
+						  },
+						  id: 1
+						},{
+						  title: '重要',
+						  templet: function(d){
+							  return '<span class="layui-badge-dot layui-bg-orange"></span> ' + d.title;
+						  },
+						  id: 2
+						},{
+						  title: '次要',
+						  templet: function(d){
+							  return '<span class="layui-badge-dot layui-bg-blue"></span> ' + d.title;
+						  },
+						  id: 3
+						},{
+						  title: '不重要',
+						  templet: function(d){
+							  return '<span class="layui-badge-dot layui-bg-green"></span> ' + d.title;
+						  },
+						  id: 4
+						},{
+						  title: '无优先级',
+						  templet: function(d){
+							  return '<span class="layui-badge-dot layui-bg-black"></span> ' + d.title;
+						  },
+						  id: 5
+						}]
+						,click: function(obj){
+							this.elem.html(obj.title);
+							detail.type = obj.id;
+						}
+						,style: 'width: 120px;'
+					  });
+					  
+					  dropdown.render({
+						elem: '#remind_type'
+						,data: [{
+						  title: '不提醒',
+						  id: 0
+						},{
+						  title: '提前5分钟',
+						  id: 1
+						},{
+						  title: '提前15分钟',
+						  id: 2
+						},{
+						  title: '提前30分钟',
+						  id: 3
+						},{
+						  title: '提前1小时',
+						  id: 4
+						},{
+						  title: '提前2小时',
+						  id: 5
+						},{
+						  title: '提前1天',
+						  id:6
+						}]
+						,click: function(obj){
+						  this.elem.html(obj.title);
+						  detail.remind_type = obj.id;
+						}
+						,style: 'width: 120px;'
+					  });					
+				},
+				btn: ['确定提交'],
+				btnAlign:'c',
+				yes: function(idx){
+					if(detail.start_time_a=='' || detail.end_time_a==''){
+						layer.msg('请完善日程时间范围');
+						return;
+					}
+					if(detail.type==0){
+						layer.msg('请选择日程优先级');
+						return;
+					}
+					if(detail.title==''){
+						layer.msg('请填写日程内容');
+						return;
+					}
+					console.log(detail);
+					$.ajax({
+						url: "/oa/plan/add",
+						type:'post',
+						data:detail,
+						success:function(e){
+							layer.msg(e.msg);
+							if(e.code==0){								
+								layer.close(idx);								
+								layui.pageTable.reload();
+							}
+						}
+					})			
+				}
+			})	
+		}		  
+	}		
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/oa/view/schedule/calendar.html b/app/oa/view/schedule/calendar.html
new file mode 100644
index 0000000000000000000000000000000000000000..0c4863d8d9eceb9fa023d5ef0e5449d781f94b5b
--- /dev/null
+++ b/app/oa/view/schedule/calendar.html
@@ -0,0 +1,210 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<link rel="stylesheet" href="{__GOUGU__}/third_party/fullcalendar/main.min.css"/>
+<style>
+#calendar {width: 100%;margin: 0 auto; background-color:#fff;
+-moz-user-select: none; /*火狐*/
+-webkit-user-select: none; /*webkit浏览器*/
+}
+.fc .fc-toolbar.fc-header-toolbar{margin-bottom:0;border:1px solid #eeeeee; border-bottom:none;padding:15px 12px;}
+.fc-col-header{background-color:#fafafa;}
+.fc .fc-button-primary {color: #fff; background-color: #1E9FFF; border-color: #1E9FFF;}
+.fc .fc-button-primary:not(:disabled).fc-button-active, .fc .fc-button-primary:not(:disabled):active { color: #fff; background-color: #FBBC05; border-color: #FBBC05;}
+.fc .fc-button-primary:focus, .fc .fc-button-primary:not(:disabled).fc-button-active:focus, .fc .fc-button-primary:not(:disabled):active:focus {box-shadow: 0 0 0 0;}
+.fc .fc-button-primary:hover{color:#fff; background-color:#52B5FF; border-color:#52B5FF;}
+.fc-daygrid-event-harness{cursor:pointer;}
+.fc .fc-daygrid-week-number{font-size:12px;}
+.fc-daygrid-block-event .fc-event-time{font-weight:800}
+.fc-h-event .fc-event-main{color:#111111}
+.fc-theme-standard .fc-scrollgrid,.fc-theme-standard td, .fc-theme-standard th{border-color:#eee;}
+/*今天背景色和字体颜色 */
+.fc .fc-daygrid-day.fc-day-today .fc-event-title,.fc .fc-daygrid-day.fc-day-today .fc-event-time,.fc .fc-daygrid-day.fc-day-today .fc-daygrid-day-number{font-weight:800;color:#FF5722;}
+.calendar-select{width:100px; height:40px; position:absolute; top:31px; right:262px; z-index:100;}
+.calendar-select .layui-input{height: 36px; line-height: 1.2;}
+.layui-tags-span {padding: 3px 6px;font-size: 12px; background-color:#fff; border-radius: 3px; margin:2px 0; margin-right: 5px; border: 1px solid #e6e6e6; display: inline-block;}
+.layui-layer-content .layui-table-view .layui-table td,.layui-layer-content .layui-table-view .layui-table th{padding:1px 0;}
+.layui-unselect dl {max-height:188px;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<script src="{__GOUGU__}/third_party/fullcalendar/main.min.js"></script>
+<div class="p-page">
+	<div id="calendar"></div>
+	{gt name="is_leader" value="0"}
+	<div class="calendar-select">
+		<div class="layui-input-inline"><input type="text" placeholder="选择下属员工" class="layui-input" data-event="select" autocomplete="off"/></div>		
+	</div>
+	{/gt}
+</div>
+<!-- /主体 -->
+{/block}
+{block name="copyright"}{/block}
+<!-- 脚本 -->
+{block name="script"}
+<script type="text/javascript">
+	var uid=0;	
+	function addZero(num){
+		if(num<10){
+			num='0'+num;
+		}
+		return num;
+	}
+	const moduleInit = ['tool','oaPicker','oaSchedule'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool, oaPicker = layui.oaPicker,laydate = layui.laydate,work = layui.oaSchedule;
+		// 选择下属员工
+		$('body').on('click','[data-event="select"]',function(){
+			var that = $(this);
+			oaPicker.employeeInit({
+				title:"选择下属",
+				department_url: "/api/index/get_department_tree_sub",
+				employee_url: "/api/index/get_employee_sub",
+				ids: '',
+				names: '',
+				type: 1,
+				callback:function(data){
+					//这里是选择后的回调方法，可以根据具体需求自定义写哦
+					let select_id=[],select_name=[];
+					for(var a=0; a<data.length;a++){
+						select_id.push(data[a].id);
+						select_name.push(data[a].name);
+					}
+					that.val(select_name.join(','));
+					uid = select_id.join(','); 
+					calendar.refetchEvents();
+				}
+			})
+		});
+		
+		//请求事件api数据
+		function eventApi(id){
+			if(id==0){
+				return false;
+			}
+			$.ajax({
+				url: "/oa/schedule/view",
+				type:'post',
+				data:{id:id},
+				success:function(res){					
+					detail=res.data;
+					work.view(detail);
+				}
+			});	
+		}
+
+
+		//日历
+		var calendarEl = document.getElementById('calendar');
+		var calendar = new FullCalendar.Calendar(calendarEl, {
+			views: {
+				dayGrid: {
+					viewDidMount:function(arg){
+						calendar.setOption('height', window.innerHeight-30);
+					}
+				},
+				timeGrid: {
+					viewDidMount:function(arg){
+						calendar.setOption('height', 'auto');
+					}
+				},
+				week: {
+					viewDidMount:function(arg){
+						calendar.setOption('height', 'auto');
+					}
+				},
+				day: {
+					viewDidMount:function(arg){
+						calendar.setOption('height', 'auto');
+					}
+				}
+			},
+			//initialDate: '2020-09-12',//默认显示日期
+			initialView: 'dayGridMonth',//默认显示月视图
+			customButtons: {
+				clear: {
+					text: '清空员工', click: function () {
+						uid = 0;
+						$('[data-event="select"]').val('');
+						calendar.refetchEvents();
+					}
+				}
+            },
+			headerToolbar: {
+				left: 'prev,next',
+				center: 'title',
+				right: 'clear dayGridMonth,timeGridWeek,listWeek'
+			},
+			height: 'auto',//自动高度
+			navLinks: true, // can click day/week names to navigate views
+			editable: false,//确定是否可以拖拉调整日历事件的时间。
+			selectable: false,//拖拉选择日期
+			selectMirror: false,//是否在用户拖动时绘制"占位符"事件。
+			dateClick: function(arg) {
+				console.log(arg);
+				var dateStr	= arg.date.getFullYear()+'-'+addZero(arg.date.getMonth()+1)+'-'+addZero(arg.date.getDate());			
+				var detail={};
+				detail['id']=0;
+				detail['title']='';
+				detail['labor_type']=0;
+				detail['start_time_a']=dateStr;
+				detail['end_time_a']=dateStr;		
+				detail['start_time_b']='09:00';
+				detail['end_time_b']='09:30';		
+				detail['remark']='';
+				detail['type']=0;
+				detail['remind_type']=0;
+				//console.log(detail);	
+				work.add(0, detail);	
+			},
+			nowIndicator: true,
+			weekNumbers: true,// 是否开启周数
+			firstDay: 1,
+			displayEventEnd: false, //所有视图显示结束时间
+			eventTimeFormat: { // like '14:30:00'
+				hour: '2-digit',
+				minute: '2-digit',
+				//second: '2-digit',
+				meridiem: false,
+				hour12: false //设置时间为24小时
+			},
+			locale: 'zh-cn',//语言
+			buttonText: {
+				//按钮文本
+				today: '今天',
+				month: '月',
+				week: '周',
+				day: '日',
+				list: '记录列表',
+			},
+			weekText: '周',
+			allDayText: '全天',
+			moreLinkText: function(n) {
+				return '另外 ' + n + ' 个'
+			},
+			noEventsText: '没有事件显示',
+			events: function(fetchInfo, successCallback, failureCallback ){
+				$.ajax({
+					type:"POST",
+					url: "/oa/schedule/calendar",
+					dataType:"json",
+					data:{start:fetchInfo.startStr,end:fetchInfo.endStr,uid:uid},
+					success:function(result){
+						//console.info(result);
+						successCallback(result);
+					},
+					error:function(){
+						failureCallback();
+					}
+				})
+			},
+			eventClick: function(info) {
+				//console.log(info.event);
+				eventApi(info.event.id);
+			}
+		});
+		calendar.render();
+	}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/oa/view/schedule/datalist.html b/app/oa/view/schedule/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..7563c56d4646a18c56943d5a3f1c9f816be9414d
--- /dev/null
+++ b/app/oa/view/schedule/datalist.html
@@ -0,0 +1,243 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+.layui-unselect dl {max-height:200px;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-x border-t" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:180px">
+			<input type="text"  name="diff_time" class="layui-input tool-time" data-range="~" placeholder="选择时间区间" readonly>
+		</div>
+		{gt name="is_leader" value="0"}
+		<div class="layui-input-inline" style="width:120px;">
+			<input type="text" name="username" placeholder="请选择下属员工" class="layui-input picker-sub" readonly />
+			<input type="text" name="uid" value="" style="display:none" />	
+		</div>
+		{/gt}
+		<div class="layui-input-inline" style="width:130px;">
+			<select name="cid">
+				<option value="">选择工作类别</option>
+				{volist name=":get_base_data('WorkCate')" id="vo"}
+				<option value="{$vo.id}">{$vo.title}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:130px;">
+			<select name="labor_type">
+				<option value="">选择工作类型</option>
+				<option value="1">案头工作</option>
+				<option value="2">外勤工作</option>
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:220px;">
+			<input type="text" name="keywords"  placeholder="输入关键字，工作内容" class="layui-input"/>
+		</div>	
+		<div class="layui-input-inline" style="width:150px;">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form> 
+	<div>
+		<table class="layui-hide" id="test" lay-filter="test"></table>
+	</div>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm addLoan" type="button">+ 新增工作记录</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const is_leader = '{$is_leader}';
+	const role_auth = '{$role_auth}';
+	const hour_auth = '{$hour_auth}';
+	const moduleInit = ['tool','tablePlus','oaPicker','oaSchedule'];
+	function gouguInit() {
+		var form = layui.form,table = layui.tablePlus,tool=layui.tool, laydate = layui.laydate,work = layui.oaSchedule;	  
+		//日期范围
+		laydate.render({
+			elem: '#barDate',
+			range: ['#start_time', '#end_time']
+		});
+
+		layui.scheduleTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,title:'工作记录列表'
+			,url: "/oa/schedule/datalist"
+			,cellMinWidth: 80
+			,height: 'full-112'
+			,cols: [[ //表头
+				{field: 'id', title: '序号',fixed: 'left', width:80, align:'center'}
+				,{field: 'labor_type_string', title: '工作类型', align:'center',width:100,templet:function(d){
+					var html='';
+					if(d.labor_type==0){
+						html='<span class="layui-color-'+d.labor_type+'">-</span>';
+					}
+					else if(d.labor_type == 1){
+						html='<span class="layui-color-'+d.labor_type+'">『案头工作』</span>';
+					}
+					else if(d.labor_type == 2){
+						html='<span class="layui-color-'+d.labor_type+'">『外勤工作』</span>';
+					}
+					return html;
+				}}
+				,{field: 'work_cate', title: '工作类别', align:'center',width:100}
+				,{field: 'start_time', title: '工作时间范围', align:'center',width:186,templet:function(d){
+					var html=d.start_time+'至'+d.end_time;
+					return html;
+				}}
+				,{field: 'name', title: '执行人', align:'center',width:80}
+				,{field: 'labor_time', title: '工时', align:'center',width:80}
+				,{field: 'title', title: '工作内容'}
+				,{field: 'create_time', title: '记录时间', align:'center',width:150}
+				,{field: 'right', title: '操作',fixed:'right', width:150, align:'center',templet:function(d){
+					var html='<div class="layui-btn-group">';
+					if(hour_auth==2 && d.admin_id==login_admin){
+						//开放员工自己调整
+						html+='<button class="layui-btn layui-btn-xs layui-btn-danger" lay-event="time">调整工时</button>';
+					}
+					if(hour_auth==3 && is_leader > 0){
+						//开放部门负责人调整
+						html+='<button class="layui-btn layui-btn-xs layui-btn-danger" lay-event="time">调整工时</button>';
+					}
+					if(hour_auth==4 && role_auth > 0){
+						//开放日常办公数据管理员调整
+						html+='<button class="layui-btn layui-btn-xs layui-btn-danger" lay-event="time">调整工时</button>';
+					}
+					if(d.admin_id==login_admin){
+						html+='<button class="layui-btn layui-btn-xs" lay-event="edit">编辑</button>';
+					}
+					html+='<button class="layui-btn layui-btn-xs layui-btn-normal" lay-event="view">查看</button>';
+					html+='</div>';
+					return html;
+				}}
+			]]
+		});
+
+		//更改工时
+		table.on('tool(test)', function(obj){
+			var data = obj.data;
+			if(obj.event === 'time'){
+			  var content='<form class="layui-form" style="width:666px">\
+							<table class="layui-table" style="margin:12px 12px 0;">\
+								<tr>\
+									<td class="layui-td-gray-2">工作时间范围<font>*</font></td>\
+									<td>\
+										<input id="start_time_a" name="start_time_a" style="width:150px; display:inline-block;" autocomplete="off" class="layui-input" value="" readonly lay-verify="required" lay-reqText="请选择"><div style="display: inline-block; margin-left:5px; width: 90px;"><select lay-filter="start_time_b" id="start_time_b"></select></div> 至 <input id="end_time_a" name="end_time_a" style="width:150px; display:inline-block;" autocomplete="off" class="layui-input" value="" readonly lay-verify="required" lay-reqText="请选择"><div style="display: inline-block; margin-left:5px; width: 90px;"><select lay-filter="end_time_b" id="end_time_b"></select></div>\
+									</td>\
+								</tr>\
+							</table>\
+						</form>';
+				layer.open({
+					type:1,
+					title:'调整工时',
+					area:['692px','398px'],
+					content:content,
+					success:function(){
+						//日期时间范围
+						laydate.render({
+							elem: '#start_time_a',
+							type: 'date',
+							max:0,
+							format: 'yyyy-MM-dd',
+							showBottom: false,
+							done:function(a,b,c){
+								$('#end_time_a').val(a);
+							}
+						});
+
+						//日期时间范围
+						laydate.render({
+							elem: '#end_time_a',
+							type: 'date',
+							max:0,
+							format: 'yyyy-MM-dd',
+							showBottom: false,
+							done:function(a,b,c){
+								$('#start_time_a').val(a);
+							}
+						});
+						$('#start_time_b,#end_time_b').empty();
+						
+						var hourArray=[];
+						for(var h=0;h<24;h++){
+							var t=h<10?'0'+h:h
+							var t_1=t+':00',t_2=t+':15',t_3=t+':30',t_4=t+':45';
+							hourArray.push(t_1,t_2,t_3,t_4);
+						}
+						
+						var html_1='', html_2='',def_h1='09:00',def_h2='09:30';
+						for(var s=0;s<hourArray.length;s++){
+							var check_1='',check_2='';
+							if(hourArray[s]==def_h1){
+								check_1='selected';
+							}
+							if(hourArray[s]==def_h2){
+								check_2='selected';
+							}
+							html_1 += '<option value="'+hourArray[s]+'" '+check_1+'>'+hourArray[s]+'</option>';
+							html_2 += '<option value="'+hourArray[s]+'" '+check_2+'>'+hourArray[s]+'</option>';
+						}
+						
+						$('#start_time_b').append(html_1);
+						$('#end_time_b').append(html_2);
+						form.render();
+					
+					},
+					btn: ['确定提交'],
+					btnAlign: 'c',
+					yes: function(idx){
+						let start_time_a = $('#start_time_a').val();
+						let end_time_a = $('#end_time_a').val();
+						let start_time_b = $('#start_time_b').val();
+						let end_time_b = $('#end_time_b').val();
+						if(start_time_a=='' || end_time_a==''){
+							layer.msg('请选择工作时间范围');
+							return;
+						}
+						$.ajax({
+							url: "/oa/api/update_schedule",
+							type:'post',
+							data:{
+								id:data.id,
+								admin_id:data.admin_id,
+								start_time_a:start_time_a,
+								end_time_a:end_time_a,
+								start_time_b:start_time_b,
+								end_time_b:end_time_b
+							},
+							success:function(e){
+								layer.msg(e.msg);
+								if(e.code==0){								
+									layer.close(idx);								
+									layui.scheduleTable.reload();
+								}
+							}
+						})			
+					}
+				})
+			}
+			else if(obj.event === 'edit'){
+				work.add(0, obj.data);	
+			}
+			else if(obj.event === 'view'){
+				work.view(obj.data);				
+			}
+		});
+		  
+		$('body').on('click','.addLoan',function(){
+			work.add(0,{'id':0});	
+		});	  
+	}
+		
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/oa/view/work/add_1.html b/app/oa/view/work/add_1.html
new file mode 100644
index 0000000000000000000000000000000000000000..ab11eea62d2a22dbe7825272fbad0334f3d554ce
--- /dev/null
+++ b/app/oa/view/work/add_1.html
@@ -0,0 +1,113 @@
+{extend name="../../base/view/common/base" /}
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">工作日报汇报</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			{if ($id == 0) OR ($detail.send_time == 0) }
+			<td class="layui-td-gray">接收人<font>*</font></td>
+			<td>
+				<input type="text" name="to_unames" value="{$detail.to_unames|default=''}" lay-verify="required" lay-reqText="请选择接收人" placeholder="请选择接收人" readonly class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="to_uids" value="{$detail.to_uids|default=''}">
+			</td>
+			{else/}
+			<td class="layui-td-gray">接收人</td>
+			<td>{$detail.to_unames|default=''}</td>
+			{/if}
+			<td class="layui-td-gray">汇报周期<font>*</font></td>
+			<td><input type="text" class="layui-input tool-time" name="start_date" readonly value="{$detail.range_date|default=''}" lay-verify="required" lay-reqText="请完善汇报周期"></td>
+		</tr>		
+		<tr>
+			<td class="layui-td-gray">今日工作<font>*</font></td>
+			<td colspan="3"><textarea name="works" placeholder="请输入今日工作内容" class="layui-textarea" style="height: 120px;" lay-verify="required" lay-reqText="请输入今日工作内容">{$detail.works|default=''}</textarea></td>
+		</tr>
+		<tr><td class="layui-td-gray">明日计划</td>
+			<td colspan="3"><textarea name="plans" placeholder="请输入明日计划" class="layui-textarea" style="height: 120px;">{$detail.plans|default=''}</textarea></td>
+		</tr>
+		<tr><td class="layui-td-gray">其它事项</td>
+			<td colspan="3"><textarea name="remark" placeholder="请输入其它事项" class="layui-textarea" style="height: 120px;">{$detail.remark|default=''}</textarea></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray"><div class="layui-input-inline">附件</div> <div class="layui-input-inline"><button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button></div></td>
+			<td colspan="3" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" name="file_ids" data-type="file" value="{$detail.file_ids|default=''}">
+					{notempty name="$detail.file_array"}
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<input type="hidden" value="{$id}" name="id">
+		<input type="hidden" value="{$types}" name="types">
+		<input type="hidden" value="0" name="send">
+		<button class="layui-btn" lay-submit="" lay-filter="webform1">仅保存</button>
+		{if ($id == 0) OR ($detail.send_time == 0) }
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">保存并发送</button>
+		{/if}
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool','oaPicker','uploadPlus'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,uploadPlus = layui.uploadPlus;
+		var attachment = new uploadPlus({
+			"title":'上传文件',
+			"target":'uploadBtn',
+			"targetBox":'uploadBox'
+		});
+		//监听发送
+		form.on('submit(webform)', function(data){
+			if(data.field.uids==login_admin){
+				layer.msg('接收人不能是自己');
+				return false;
+			}
+			data.field.send=1;
+			tool.ask('确定要保存后直接发送该工作汇报吗?', function(index){
+				$.ajax({
+					url: "/oa/work/add",
+					type:'post',
+					data:data.field,
+					success:function(e){
+						layer.msg(e.msg);
+						if (e.code == 0) {						
+							tool.sideClose(1000);
+						}
+					}
+				})
+				layer.close(index);
+			});
+			return false;
+		});
+		
+		//监听保存
+		form.on('submit(webform1)', function(data){
+			tool.ask('确定要仅保存该工作汇报吗?', function(index){
+				$.ajax({
+					url: "/oa/work/add",
+					type:'post',
+					data:data.field,
+					success:function(e){
+						layer.msg(e.msg);
+						if (e.code == 0) {						
+							tool.sideClose(1000);
+						}
+					}
+				})
+				layer.close(index);
+			});
+			return false;
+		});
+	}		
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/oa/view/work/add_2.html b/app/oa/view/work/add_2.html
new file mode 100644
index 0000000000000000000000000000000000000000..8c2ed1ddfeb4df49230ad01298c800dff7edd3d5
--- /dev/null
+++ b/app/oa/view/work/add_2.html
@@ -0,0 +1,113 @@
+{extend name="../../base/view/common/base" /}
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">工作周报汇报</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			{if ($id == 0) OR ($detail.send_time == 0) }
+			<td class="layui-td-gray">接收人<font>*</font></td>
+			<td>
+				<input type="text" name="to_unames" value="{$detail.to_unames|default=''}" lay-verify="required" lay-reqText="请选择接收人" placeholder="请选择接收人" readonly class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="to_uids" value="{$detail.to_uids|default=''}">
+			</td>
+			{else/}
+			<td class="layui-td-gray">接收人</td>
+			<td>{$detail.to_unames|default=''}</td>
+			{/if}
+			<td class="layui-td-gray">汇报周期<font>*</font></td>
+			<td><input type="text" class="layui-input tool-time" data-range="~" name="range_date" readonly value="{$detail.range_date|default=''}" lay-verify="required" lay-reqText="请完善汇报周期"></td>
+		</tr>		
+		<tr>
+			<td class="layui-td-gray">本周工作<font>*</font></td>
+			<td colspan="3"><textarea name="works" placeholder="请输入本周工作内容" class="layui-textarea" style="height: 120px;" lay-verify="required" lay-reqText="请输入本周工作内容">{$detail.works|default=''}</textarea></td>
+		</tr>
+		<tr><td class="layui-td-gray">下周计划</td>
+			<td colspan="3"><textarea name="plans" placeholder="请输入下周计划" class="layui-textarea" style="height: 120px;">{$detail.plans|default=''}</textarea></td>
+		</tr>
+		<tr><td class="layui-td-gray">其它事项</td>
+			<td colspan="3"><textarea name="remark" placeholder="请输入其它事项" class="layui-textarea" style="height: 120px;">{$detail.remark|default=''}</textarea></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray"><div class="layui-input-inline">附件</div> <div class="layui-input-inline"><button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button></div></td>
+			<td colspan="3" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" name="file_ids" data-type="file" value="{$detail.file_ids|default=''}">
+					{notempty name="$detail.file_array"}
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<input type="hidden" value="{$id}" name="id">
+		<input type="hidden" value="{$types}" name="types">
+		<input type="hidden" value="0" name="send">
+		<button class="layui-btn" lay-submit="" lay-filter="webform1">仅保存</button>
+		{if ($id == 0) OR ($detail.send_time == 0) }
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">保存并发送</button>
+		{/if}
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool','oaPicker','uploadPlus'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,uploadPlus = layui.uploadPlus;
+		var attachment = new uploadPlus({
+			"title":'上传文件',
+			"target":'uploadBtn',
+			"targetBox":'uploadBox'
+		});
+		//监听发送
+		form.on('submit(webform)', function(data){
+			if(data.field.uids==login_admin){
+				layer.msg('接收人不能是自己');
+				return false;
+			}
+			data.field.send=1;
+			tool.ask('确定要保存后直接发送该工作汇报吗?', function(index){
+				$.ajax({
+					url: "/oa/work/add",
+					type:'post',
+					data:data.field,
+					success:function(e){
+						layer.msg(e.msg);
+						if (e.code == 0) {						
+							tool.sideClose(1000);
+						}
+					}
+				})
+				layer.close(index);
+			});
+			return false;
+		});
+		
+		//监听保存
+		form.on('submit(webform1)', function(data){
+			tool.ask('确定要仅保存该工作汇报吗?', function(index){
+				$.ajax({
+					url: "/oa/work/add",
+					type:'post',
+					data:data.field,
+					success:function(e){
+						layer.msg(e.msg);
+						if (e.code == 0) {						
+							tool.sideClose(1000);
+						}
+					}
+				})
+				layer.close(index);
+			});
+			return false;
+		});
+	}		
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/oa/view/work/add_3.html b/app/oa/view/work/add_3.html
new file mode 100644
index 0000000000000000000000000000000000000000..549d1ad6c79ddf87b075da655448a60a6888dbe7
--- /dev/null
+++ b/app/oa/view/work/add_3.html
@@ -0,0 +1,113 @@
+{extend name="../../base/view/common/base" /}
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">工作月报汇报</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			{if ($id == 0) OR ($detail.send_time == 0) }
+			<td class="layui-td-gray">接收人<font>*</font></td>
+			<td>
+				<input type="text" name="to_unames" value="{$detail.to_unames|default=''}" lay-verify="required" lay-reqText="请选择接收人" placeholder="请选择接收人" readonly class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="to_uids" value="{$detail.to_uids|default=''}">
+			</td>
+			{else/}
+			<td class="layui-td-gray">接收人</td>
+			<td>{$detail.to_unames|default=''}</td>
+			{/if}
+			<td class="layui-td-gray">汇报周期<font>*</font></td>
+			<td><input type="text" class="layui-input tool-time" data-range="~" name="range_date" readonly value="{$detail.range_date|default=''}" lay-verify="required" lay-reqText="请完善汇报周期"></td>
+		</tr>		
+		<tr>
+			<td class="layui-td-gray">本月工作<font>*</font></td>
+			<td colspan="3"><textarea name="works" placeholder="请输入本月工作内容" class="layui-textarea" style="height: 120px;" lay-verify="required" lay-reqText="请输入本月工作内容">{$detail.works|default=''}</textarea></td>
+		</tr>
+		<tr><td class="layui-td-gray">下月计划</td>
+			<td colspan="3"><textarea name="plans" placeholder="请输入下月计划" class="layui-textarea" style="height: 120px;">{$detail.plans|default=''}</textarea></td>
+		</tr>
+		<tr><td class="layui-td-gray">其它事项</td>
+			<td colspan="3"><textarea name="remark" placeholder="请输入其它事项" class="layui-textarea" style="height: 120px;">{$detail.remark|default=''}</textarea></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray"><div class="layui-input-inline">附件</div> <div class="layui-input-inline"><button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button></div></td>
+			<td colspan="3" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" name="file_ids" data-type="file" value="{$detail.file_ids|default=''}">
+					{notempty name="$detail.file_array"}
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<input type="hidden" value="{$id}" name="id">
+		<input type="hidden" value="{$types}" name="types">
+		<input type="hidden" value="0" name="send">
+		<button class="layui-btn" lay-submit="" lay-filter="webform1">仅保存</button>
+		{if ($id == 0) OR ($detail.send_time == 0) }
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">保存并发送</button>
+		{/if}
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool','oaPicker','uploadPlus'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,uploadPlus = layui.uploadPlus;
+		var attachment = new uploadPlus({
+			"title":'上传文件',
+			"target":'uploadBtn',
+			"targetBox":'uploadBox'
+		});
+		//监听发送
+		form.on('submit(webform)', function(data){
+			if(data.field.uids==login_admin){
+				layer.msg('接收人不能是自己');
+				return false;
+			}
+			data.field.send=1;
+			tool.ask('确定要保存后直接发送该工作汇报吗?', function(index){
+				$.ajax({
+					url: "/oa/work/add",
+					type:'post',
+					data:data.field,
+					success:function(e){
+						layer.msg(e.msg);
+						if (e.code == 0) {						
+							tool.sideClose(1000);
+						}
+					}
+				})
+				layer.close(index);
+			});
+			return false;
+		});
+		
+		//监听保存
+		form.on('submit(webform1)', function(data){
+			tool.ask('确定要仅保存该工作汇报吗?', function(index){
+				$.ajax({
+					url: "/oa/work/add",
+					type:'post',
+					data:data.field,
+					success:function(e){
+						layer.msg(e.msg);
+						if (e.code == 0) {						
+							tool.sideClose(1000);
+						}
+					}
+				})
+				layer.close(index);
+			});
+			return false;
+		});
+	}		
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/oa/view/work/datalist_1.html b/app/oa/view/work/datalist_1.html
new file mode 100644
index 0000000000000000000000000000000000000000..2051461b4d4e262760afee0c7985aec0113f1dd6
--- /dev/null
+++ b/app/oa/view/work/datalist_1.html
@@ -0,0 +1,157 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<div class="layui-tab layui-tab-brief border" lay-filter="tab" style="background-color:#fff; margin:0; border-bottom:0">
+		<ul class="layui-tab-title">
+			<li class="layui-this"><a href="/oa/work/datalist?send=1">发送的汇报</a></li>
+			<li><a href="/oa/work/datalist?send=2">接受的汇报</a></li>
+		</ul>
+	</div>
+	<form class="layui-form gg-form-bar border-x" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:180px">
+			<input type="text"  name="diff_time" class="layui-input tool-time" data-range="~" placeholder="选择时间区间" readonly>
+		</div>
+		<div class="layui-input-inline" style="width:136px">
+			<select name="types">
+				<option value="">选择类型</option>
+				<option value="1">日报</option>
+				<option value="2">周报</option>
+				<option value="3">月报</option>
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:240px;">
+			<input type="text" name="keywords" placeholder="输入关键字，工作内容" class="layui-input"/>
+		</div>	
+		<div class="layui-input-inline" style="width:150px;">
+			<input type="hidden" name="send" value="1" />
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+	<button class="layui-btn layui-btn-sm" lay-event="add">
+		<span>+ 新建汇报</span>
+		<i class="layui-icon layui-icon-down layui-font-12"></i>
+	</button>
+  </div>
+</script>
+
+<script type="text/html" id="barDemo">
+<div class="layui-btn-group"><button class="layui-btn layui-btn-xs layui-btn-normal" lay-event="view">查看</button>
+  <button class="layui-btn layui-btn-xs" lay-event="edit">编辑</button><button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button></div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus'];
+	const work_types = [{"id":1,"title":"日报"},{"id":2,"title":"周报"},{"id":3,"title":"月报"}];
+	function gouguInit() {
+		var form = layui.form,dropdown = layui.dropdown,table = layui.tablePlus,tool=layui.tool;
+
+		layui.pageTable = table.render({
+			elem: '#test',
+			toolbar: '#toolbarDemo',
+			title:'工作汇报列表',
+			url: "/oa/work/datalist", //数据接口
+			where:{'send':1},
+			height: 'full-152',
+			cellMinWidth: 80, //全局定义常规单元格的最小宽度
+			cols: [[ //表头
+				{field:'id',title: '序号',width:80,align:'center'},
+				{field: 'types', title: '汇报类型',width:80,align:'center',templet:function(d){
+					var html='';
+					if(d.types==1){
+						html = '<span class="green">『日报』</span>';
+					}
+					else if(d.types==2){
+						html = '<span class="blue">『周报』</span>';
+					}
+					else if(d.types==3){
+						html = '<span class="yellow">『月报』</span>';
+					}
+					return html;
+				}},
+				{field: 'send_time', title: '发送状态',width:80,align:'center',templet:function(d){
+					var html='';
+					if(d.send_time==0){
+						html = '<span class="red">未发送</span>';
+					}
+					else{
+						html = '<span class="green">已发送</span>';
+					}
+					return html;
+				}},
+				{field: 'to_names', title: '接收人', width:240},
+				{field: 'works', title: '工作内容'},
+				{field: 'create_time', title: '汇报周期', align:'center',width:200,templet:function(d){
+						if(d.types==1){
+							return d.start_date;
+						}else{
+							return d.start_date+' 至 '+d.end_date;
+						}
+					}
+				},
+				{field: 'create_time', title: '汇报时间', align:'center',width:160},
+				{field: 'files', title: '附件(个)',align:'center', width:80},
+				{field: 'right', title: '操作',fixed:'right', toolbar: '#barDemo', width:120, align:'center'}
+			]],
+		});
+
+		//监听行工具事件
+		table.on('tool(test)', function(obj){
+			var data = obj.data;
+			if(obj.event === 'edit'){
+				tool.side('/oa/work/add?id='+data.id);
+				return;
+			}
+			if(obj.event === 'del'){
+				layer.confirm('确定要删除该汇报吗?', {icon: 3, title:'提示'}, function(index){
+					$.ajax({
+						url: "/oa/work/del",
+						type:'post',
+						data:{id:data.id},
+						success:function(e){
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								obj.del();
+							}
+						}
+					})
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'view'){
+				tool.side('/oa/work/view?id='+data.id);
+				return;
+			}
+		});
+		
+		//表头工具栏事件
+		table.on('toolbar(test)', function(obj){
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = checkStatus.data;
+			var that = this;
+			if (obj.event === 'add'){
+				dropdown.render({
+					elem: that,
+					show: true, // 外部事件触发即显示
+					data: work_types,
+					click: function(obj){
+						tool.side('/oa/work/add?types='+obj.id);
+					}
+				});
+				return;
+			}		
+		});
+	}		
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/oa/view/work/datalist_2.html b/app/oa/view/work/datalist_2.html
new file mode 100644
index 0000000000000000000000000000000000000000..75fa6fd6dfc85ea5b9902856cb690515ac423b5b
--- /dev/null
+++ b/app/oa/view/work/datalist_2.html
@@ -0,0 +1,103 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<div class="layui-tab layui-tab-brief border" lay-filter="tab" style="background-color:#fff; margin:0; border-bottom:0">
+		<ul class="layui-tab-title">
+			<li><a href="/oa/work/datalist?send=1">发送的汇报</a></li>
+			<li class="layui-this"><a href="/oa/work/datalist?send=2">接受的汇报</a></li>
+		</ul>
+	</div>
+	<form class="layui-form gg-form-bar border-x" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:180px">
+			<input type="text"  name="diff_time" class="layui-input tool-time" data-range="~" placeholder="选择时间区间" readonly>
+		</div>
+		<div class="layui-input-inline" style="width:136px">
+			<select name="types">
+				<option value="">选择类型</option>
+				<option value="1">日报</option>
+				<option value="2">周报</option>
+				<option value="3">月报</option>
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:240px;">
+			<input type="text" name="keywords" placeholder="输入关键字，工作内容" class="layui-input"/>
+		</div>	
+		<div class="layui-input-inline" style="width:150px;">
+			<input type="hidden" name="send" value="2" />
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <h3>接受的工作汇报</h3>
+</script>
+
+<script type="text/html" id="barDemo">
+<div class="layui-btn-group"><button class="layui-btn layui-btn-xs layui-btn-normal" lay-event="view">查看</button></div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus'];
+	const work_types = [{"id":1,"title":"日报"},{"id":2,"title":"周报"},{"id":3,"title":"月报"}];
+	function gouguInit() {
+		var form = layui.form,dropdown = layui.dropdown,table = layui.tablePlus,tool=layui.tool;
+
+		layui.pageTable = table.render({
+			elem: '#test',
+			toolbar: '#toolbarDemo',
+			title:'工作汇报列表',
+			url: "/oa/work/datalist", //数据接口
+			where:{'send':2},
+			height: 'full-152',
+			cellMinWidth: 80, //全局定义常规单元格的最小宽度
+			cols: [[ //表头
+				{field:'id',title: '序号',width:80,align:'center'},
+				{field: 'types', title: '汇报类型',width:80,align:'center',templet:function(d){
+					var html='';
+					if(d.types==1){
+						html = '<span class="green">『日报』</span>';
+					}
+					else if(d.types==2){
+						html = '<span class="blue">『周报』</span>';
+					}
+					else if(d.types==3){
+						html = '<span class="yellow">『月报』</span>';
+					}
+					return html;
+				}},
+				{field: 'from_name', title: '汇报人', width:100,align:'center'},
+				{field: 'works', title: '工作内容'},
+				{field: 'create_time', title: '汇报周期', align:'center',width:200,templet:function(d){
+						if(d.types==1){
+							return d.start_date;
+						}else{
+							return d.start_date+' 至 '+d.end_date;
+						}
+					}
+				},
+				{field: 'send_time', title: '汇报时间', align:'center',width:160},
+				{field: 'files', title: '附件(个)',align:'center', width:80},
+				{field: 'right', title: '操作',fixed:'right', toolbar: '#barDemo', width:120, align:'center'}
+			]],
+		});
+
+		//监听行工具事件
+		table.on('tool(test)', function(obj){
+			var data = obj.data;
+			if(obj.event === 'view'){
+				tool.side('/oa/work/view?id='+data.wid);
+				return;
+			}
+		});
+	}		
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/oa/view/work/view.html b/app/oa/view/work/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..9239ca9aa3e4b10f625d2ba4378c912703419425
--- /dev/null
+++ b/app/oa/view/work/view.html
@@ -0,0 +1,108 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+.comment-input .comment-image{width:40px; height:40px; border-radius:50%}
+.comment-item .comment-avatar{width:50px; float:left}
+.comment-item .comment-image{width:36px; height:36px; border-radius:50%}
+.comment-item .comment-body{margin-left:50px;}
+.comment-item .comment-content blockquote{border-left:3px solid #f1f1f1; padding:4px 8px;}
+.comment-item .comment-actions a{color:#8c95a8; cursor:pointer; font-size:12px;}
+.comment-item .comment-actions a:hover{color:#3582fb;}
+.comment-meta span{font-size:12px;}
+</style>
+{/block}
+{block name="body"}
+<div class="p-4">
+	<h3 class="pb-1">汇报详情</h3>
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">汇报人</td>
+			<td>{$detail.person_name}</td>
+			<td class="layui-td-gray">汇报类型</td>
+			<td>
+				{eq name="$detail.types" value="1"}<span class="green">『日报』</span>{/eq}
+				{eq name="$detail.types" value="2"}<span class="blue">『周报』</span>{/eq}
+				{eq name="$detail.types" value="3"}<span class="yellow">『月报』</span>{/eq}			
+			</td>
+			<td class="layui-td-gray">汇报时间</td>
+			<td>
+				{eq name="$detail.send_time" value="0"}
+				<span class="red">未汇报</span>
+				{else/}
+				{$detail.send_time}
+				{/eq}
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">汇报周期</td>
+			<td>{$detail.range_date}</td>
+			<td class="layui-td-gray">接收人</td>
+			<td colspan="3">{$detail.users}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">工作内容</td>
+			<td colspan="5">
+				{:nl2br($detail.works)}
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">工作计划</td>
+			<td colspan="5">
+				{:nl2br($detail.plans)}
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">其他事项</td>
+			<td colspan="5">
+				{:nl2br($detail.remark)}
+			</td>
+		</tr>
+		{notempty name="$detail.file_array"}
+		<tr>
+			<td class="layui-td-gray">相关附件</td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row">
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+		{notempty name="$detail.read_users"}
+		<tr>
+			<td class="layui-td-gray">已读回执</td>
+			<td colspan="5" class="yellow">{$detail.read_users}</td>
+		</tr>
+		{/notempty}
+	</table>
+	{gt name="$detail.update_time" value="0"}
+	<div style="color:#999; padding:10px 0">该汇报于 {$detail.update_time} 进行过编辑</div>
+	{/gt}
+	<div class="p-3 border bg-white">
+		<h3 class="pb-3">工作点评</h3>
+		<div class="comment-input">
+			<input type="text" id="commentInput" readonly placeholder="发表一下你的看法" class="layui-input" value="">
+		</div>		
+		<div id="commentBox" class="pt-3"></div>
+	</div>
+</div>
+{/block}
+<!-- /主体 -->
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const work_id = {$detail.id};
+const moduleInit = ['tool','oaComment'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool,comment = layui.oaComment;	
+   comment.init({
+		"box":'commentBox',//容器id
+		"input": 'commentInput',
+		"topic_id":work_id,
+		"module": 'work',
+	});
+
+  }
+</script>
+{/block}
\ No newline at end of file
diff --git a/app/project/common.php b/app/project/common.php
new file mode 100644
index 0000000000000000000000000000000000000000..3f2a153549c47c97a8135104d3626dc3e9c1a9fa
--- /dev/null
+++ b/app/project/common.php
@@ -0,0 +1,170 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+use think\facade\Db;
+
+//获取项目状态
+function get_status($id=0)
+{
+	$status_array = ['未设置','未开始','进行中','已完成','已关闭'];
+	if($id==0){
+		return $status_array;
+	}
+	else{
+		$news_array=[];
+		foreach($status_array as $key => $value){
+			if($key>0){
+				$news_array[]=array(
+					'id'=>$key,
+					'title'=>$value,
+				);
+			}
+		}
+		return $news_array;
+	}
+}
+
+//根据状态读取审批状态名称
+function status_name($status=0)
+{
+	$status_array = get_status();
+	return $status_array[$status];
+}
+
+
+//获取任务全部状态
+function get_task_status($id=0)
+{
+	$status_task_array = ['未设置','未开始','进行中','已完成','已拒绝','已关闭'];
+	if($id==0){
+		return $status_task_array;
+	}
+	else{
+		$news_array=[];
+		foreach($status_task_array as $key => $value){
+			if($key>0){
+				$news_array[]=array(
+					'id'=>$key,
+					'title'=>$value,
+				);
+			}
+		}
+		return $news_array;
+	}
+}
+
+//根据任务状态读取审批状态名称
+function status_task_name($status=0)
+{
+	$status_task_array = get_task_status();
+	return $status_task_array[$status];
+}
+
+//获取任务紧急程度
+function get_priority($id=0)
+{
+	$priority_array = ['未设置','低','中','高','紧急'];
+	if($id==0){
+		return $priority_array;
+	}
+	else{
+		$news_array=[];
+		foreach($priority_array as $key => $value){
+			if($key>0){
+				$news_array[]=array(
+					'id'=>$key,
+					'title'=>$value,
+				);
+			}
+		}
+		return $news_array;
+	}
+}
+
+//根据任务紧急程度名称
+function priority_name($priority=0)
+{
+	$priority_array = get_priority();
+	return $priority_array[$priority];
+}
+
+//是否是项目管理员,count>1即有权限
+function isAuthProject($uid)
+{
+	if($uid == 1){
+		return 1;
+	}
+	$map = [];
+	$map[] = ['name', '=', 'project_admin'];
+	$map[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',conf_1)")];
+    $count = Db::name('DataAuth')->where($map)->count();
+    return $count;
+}
+//读取项目
+function get_project($uid = 0)
+{
+    $map = [];
+    $map[] = ['delete_time', '=', 0];
+    if ($uid > 0) {
+        $project_ids = Db::name('ProjectUser')->where(['uid' => $uid, 'delete_time' => 0])->column('project_id');
+        $map[] = ['id', 'in', $project_ids];
+    }
+    $project = Db::name('Project')->where($map)->select()->toArray();
+    return $project;
+}
+
+//任务分配情况统计
+function plan_count($arrData)
+{
+    $documents = array();
+    foreach ($arrData as $index => $value) {
+        $planTime = date("Y-m-d", $value['end_time']);
+        if (empty($documents[$planTime])) {
+            $documents[$planTime] = 1;
+        } else {
+            $documents[$planTime] += 1;
+        }
+    }
+    return $documents;
+}
+
+//工时登记情况统计
+function hour_count($arrData)
+{
+    $documents = array();
+    foreach ($arrData as $index => $value) {
+        $hourTime = date("Y-m-d", $value['start_time']);
+        if (empty($documents[$hourTime])) {
+            $documents[$hourTime] = $value['labor_time'] + 0;
+        } else {
+            $documents[$hourTime] += $value['labor_time'];
+        }
+        $documents[$hourTime] = round($documents[$hourTime], 2);
+    }
+    return $documents;
+}
+
+//燃尽图统计
+function cross_count($arrData)
+{
+    $documents = array();
+    foreach ($arrData as $index => $value) {
+        $planTime = date("Y-m-d", $value['end_time']);
+        if (empty($documents[$planTime])) {
+            $documents[$planTime] = 1;
+        } else {
+            $documents[$planTime] += 1;
+        }
+    }
+    return $documents;
+}
\ No newline at end of file
diff --git a/app/project/controller/Api.php b/app/project/controller/Api.php
new file mode 100644
index 0000000000000000000000000000000000000000..59240deb32bdab33244371e3c836cebe9df2ecca
--- /dev/null
+++ b/app/project/controller/Api.php
@@ -0,0 +1,578 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+declare (strict_types = 1);
+namespace app\project\controller;
+
+use app\api\BaseController;
+use app\project\model\Project as ProjectModel;
+use app\project\model\ProjectTask;
+use app\oa\model\Schedule;
+use think\facade\Db;
+use think\facade\View;
+
+class Api extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new ProjectModel();
+    }
+    //获取项目列表
+    public function get_project()
+    {
+		$param = get_params();
+		$uid = $this->uid;
+		$auth = isAuth($uid,'project_admin','conf_1');
+		$where = array();
+		$whereOr = array();
+		$where[] = ['delete_time', '=', 0];		
+		if($auth == 0){
+			$whereOr[] = ['director_uid', '=', $uid];
+			$project_ids = Db::name('ProjectUser')->where(['uid' => $uid, 'delete_time' => 0])->column('project_id');
+			$whereOr[] = ['id', 'in', $project_ids];
+			$dids_a = get_leader_departments($uid);	
+			$dids_b = get_role_departments($uid);
+			$dids = array_merge($dids_a, $dids_b);
+			if(!empty($dids)){
+				$whereOr[] = ['did','in',$dids];
+			}
+		}
+		if (!empty($param['keywords'])) {
+			$where[] = ['name|content', 'like', '%' . $param['keywords'] . '%'];
+		}
+		$list = $this->model->datalist($param,$where,$whereOr);
+		return table_assign(0, '', $list);
+    }
+	
+    //获取任务列表
+    public function get_task()
+    {
+		$param = get_params();
+		$uid = $this->uid;
+		$where = [];
+		$whereOr = [];
+		$where[] = ['delete_time', '=', 0];
+        if (!empty($param['status'])) {
+            $where[] = ['status', '=', $param['status']];
+        }
+        if (!empty($param['priority'])) {
+            $where[] = ['priority', '=', $param['priority']];
+        }
+        if (!empty($param['work_id'])) {
+            $where[] = ['work_id', '=', $param['work_id']];
+        }
+        if (!empty($param['director_uid'])) {
+            $where[] = ['director_uid', 'in', $param['director_uid']];
+        }
+        if (!empty($param['keywords'])) {
+            $where[] = ['title|content', 'like', '%' . $param['keywords'] . '%'];
+        }
+		if(!empty($param['project_id'])){
+			$where[] = ['project_id', '=', $param['project_id']];			
+		}
+		else{
+			$auth = isAuth($uid,'project_admin','conf_1');
+			if($auth == 0){
+				$whereOr[] = ['admin_id', '=', $uid];
+				$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',assist_admin_ids)")];
+				$dids_a = get_leader_departments($uid);	
+				$dids_b = get_role_departments($uid);
+				$dids = array_merge($dids_a, $dids_b);
+				if(!empty($dids)){
+					$whereOr[] = ['did','in',$dids];
+				}
+				if (empty($param['director_uid'])) {
+					$whereOr[] = ['director_uid', '=', $uid];
+				}
+			}
+		}
+		
+		$model = new ProjectTask();
+        $list = $model->datalist($param,$where,$whereOr);
+        return table_assign(0, '', $list);
+    }
+	
+	//获取项目概况数据
+	public function get_chart_data()
+    {
+        $param = get_params();
+        $tasks = Db::name('ProjectTask')->field('id,plan_hours,end_time,status,over_time')->order('end_time asc')->where([['project_id', '=', $param['project_id']],['end_time','>',0],['delete_time', '=', 0]])->select()->toArray();
+
+        $task_count = count($tasks);
+        $task_count_ok = Db::name('ProjectTask')->where([['project_id', '=', $param['project_id']], ['delete_time', '=', 0],['status', '>', 2]])->count();
+        $task_delay = 0;
+        if ($task_count > 0) {
+            foreach ($tasks as $k => $v) {
+                if (($v['status'] < 3) && ($v['end_time'] < time() - 86400)) {
+                    $task_delay++;
+                }
+                if (($v['status'] == 3) && ($v['end_time'] < $v['over_time'] - 86400)) {
+                    $task_delay++;
+                }
+            }
+        }
+        $task_pie = [
+            'count' => $task_count,
+            'count_ok' => $task_count_ok,
+            'delay' => $task_delay,
+            'ok_lv' => $task_count == 0 ? 100 : round($task_count_ok * 100 / $task_count, 2),
+            'delay_lv' => $task_count == 0 ? 100 : round($task_delay * 100 / $task_count, 2),
+        ];
+
+        $date_tasks = [];
+        if ($tasks) {
+            $date_tasks = plan_count($tasks);
+        }
+
+        $tasks_ok = Db::name('ProjectTask')->field('id,over_time as end_time')->order('over_time asc')->where([['over_time', '>', 0], ['delete_time', '=', 0], ['project_id', '=', $param['project_id']]])->select()->toArray();
+        $date_tasks_ok = [];
+        if ($tasks_ok) {
+            $date_tasks_ok = plan_count($tasks_ok);
+        }
+        $tids = Db::name('ProjectTask')->where(['delete_time' => 0, 'project_id' => $param['project_id']])->column('id');
+        $schedules = Db::name('Schedule')->where([['tid', 'in', $tids], ['delete_time', '=', 0]])->select()->toArray();
+        $date_schedules = [];
+        if ($schedules) {
+            $date_schedules = hour_count($schedules);
+        }
+        $res['task_pie'] = $task_pie;
+        $res['date_tasks'] = $date_tasks;
+        $res['date_tasks_ok'] = $date_tasks_ok;
+        $res['date_schedules'] = $date_schedules;
+        to_assign(0, '', $res);
+    }	
+
+    //添加附件
+    public function add_file()
+    {
+        $param = get_params();
+        $param['create_time'] = time();
+        $param['admin_id'] = $this->uid;
+        $fid = Db::name('ProjectFile')->strict(false)->field(true)->insertGetId($param);
+        if ($fid) {
+            return to_assign(0, '上传成功', $fid);
+        }
+    }
+    
+    //删除
+    public function delete_file()
+    {
+        if (request()->isDelete()) {
+            $id = get_params("id");
+            $detail = Db::name('ProjectFile')->where('id', $id)->find();
+            if (Db::name('ProjectFile')->where('id', $id)->delete() !== false) {
+                $file_name = Db::name('File')->where('id', $detail['file_id'])->value('name');
+                return to_assign(0, "删除成功");
+            } else {
+                return to_assign(0, "删除失败");
+            }
+        } else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+	
+    //工作记录列表
+    public function schedule()
+    {
+		$param = get_params();
+		$task_ids = Db::name('ProjectTask')->where(['delete_time' => 0, 'project_id' => $param['tid']])->column('id');
+		$where = array();
+		if (!empty($param['keywords'])) {
+			$where[] = ['a.title', 'like', '%' . $param['keywords'] . '%'];
+		}
+		if (!empty($param['uid'])) {
+			$where[] = ['a.admin_id', '=', $param['uid']];
+		}
+		if (!empty($task_ids)) {
+			$where[] = ['a.tid', 'in', $task_ids];
+		}
+		$where[] = ['a.delete_time', '=', 0];
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$list = Schedule::where($where)
+			->field('a.*,u.name,d.title as department,t.title as task,p.name as project,w.title as work_cate')
+			->alias('a')
+			->join('Admin u', 'a.admin_id = u.id', 'LEFT')
+			->join('Department d', 'u.did = d.id', 'LEFT')
+			->join('ProjectTask t', 'a.tid = t.id', 'LEFT')
+			->join('WorkCate w', 'w.id = t.cate', 'LEFT')
+			->join('Project p', 't.project_id = p.id', 'LEFT')
+			->order('a.end_time desc')
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key) {
+				$item->start_time_a = empty($item->start_time) ? '' : date('Y-m-d', $item->start_time);
+				$item->start_time_b = empty($item->start_time) ? '' : date('H:i', $item->start_time);
+				$item->end_time_a = empty($item->end_time) ? '' : date('Y-m-d', $item->end_time);
+				$item->end_time_b = empty($item->end_time) ? '' : date('H:i', $item->end_time);
+
+				$item->start_time = empty($item->start_time) ? '' : date('Y-m-d H:i', $item->start_time);
+				$item->end_time = empty($item->end_time) ? '' : date('H:i', $item->end_time);
+			});
+		return table_assign(0, '', $list);
+    }
+	
+    //查看工作记录详情
+    public function schedule_detail($id)
+    {
+        $id = get_params('id');
+        $schedule = Schedule::where(['id' => $id])->find();
+        if (!empty($schedule)) {
+            $schedule['start_time_1'] = date('H:i', $schedule['start_time']);
+            $schedule['end_time_1'] = date('H:i', $schedule['end_time']);
+            $schedule['start_time'] = date('Y-m-d', $schedule['start_time']);
+            $schedule['end_time'] = date('Y-m-d', $schedule['end_time']);
+            $schedule['user'] = Db::name('Admin')->where(['id' => $schedule['admin_id']])->value('name');
+            $schedule['department'] = Db::name('Department')->where(['id' => $schedule['did']])->value('title');
+        }
+        if (request()->isAjax()) {
+            return to_assign(0, "", $schedule);
+        } else {
+            return $schedule;
+        }
+    }
+
+    //任务的工作记录列表
+    public function task_schedule()
+    {
+        $param = get_params();
+        $where = array();
+        $where['a.tid'] = $param['tid'];
+        $where['a.delete_time'] = 0;
+        $list = Db::name('Schedule')
+            ->field('a.*,u.name')
+            ->alias('a')
+            ->join('Admin u', 'u.id = a.admin_id')
+            ->order('a.create_time desc')
+            ->where($where)
+            ->select()->toArray();
+        foreach ($list as $k => $v) {
+            $list[$k]['start_time'] = empty($v['start_time']) ? '' : date('Y-m-d H:i', $v['start_time']);
+            $list[$k]['end_time'] = empty($v['end_time']) ? '' : date('H:i', $v['end_time']);
+        }
+        return to_assign(0, '', $list);
+    }
+
+
+	public function project_user()
+    {
+        $param = get_params();
+		$project = Db::name('Project')->where(['id' => $param['tid']])->find();
+		$users = Db::name('ProjectUser')
+				->field('pu.*,a.name,a.mobile,p.title as position,d.title as department')
+				->alias('pu')
+				->join('Admin a', 'pu.uid = a.id', 'LEFT')
+				->join('Department d', 'a.did = d.id', 'LEFT')
+				->join('Position p', 'a.position_id = p.id', 'LEFT')
+				->order('pu.id asc')
+				->where(['pu.project_id' => $param['tid']])
+				->select()->toArray();
+		if(!empty($users)){
+			foreach ($users as $k => &$v) {
+				$v['role'] = 0; //普通项目成员
+				if ($v['uid'] == $project['admin_id']) {
+					$v['role'] = 1; //项目创建人
+				}
+				if ($v['uid'] == $project['director_uid']) {
+					$v['role'] = 2; //项目负责人
+				}
+
+				$v['create_time'] = date('Y-m-d', (int) $v['create_time']);
+				if($v['delete_time'] > 0){
+					$v['delete_time'] = date('Y-m-d', (int) $v['delete_time']);
+				}
+				else{
+					$v['delete_time'] = '-';
+				}
+
+				$tids = Db::name('ProjectTask')->where([['project_id','=',$param['tid']],['delete_time','=',0]])->column('id');
+				$schedule_map = [];
+        		$schedule_map[] = ['tid','in',$tids];
+        		$schedule_map[] = ['delete_time','=',0];
+        		$schedule_map[] = ['admin_id','=',$v['uid']];
+        		$v['schedules'] = Db::name('Schedule')->where($schedule_map)->count();
+        		$v['labor_times'] = Db::name('Schedule')->where($schedule_map)->sum('labor_time');
+
+				$task_map = [];
+				$task_map[] = ['project_id','=',$param['tid']];
+				$task_map[] = ['delete_time', '=', 0];
+
+				$task_map1 = [
+					['admin_id', '=', $v['uid']],
+				];
+				$task_map2 = [
+					['director_uid', '=', $v['uid']],
+				];
+				$task_map3 = [
+					['', 'exp', Db::raw("FIND_IN_SET('{$v['uid']}',assist_admin_ids)")],
+				];
+
+				//任务总数
+				$v['tasks_total'] = Db::name('ProjectTask')
+				->where(function ($query) use ($task_map1, $task_map2, $task_map3) {
+					$query->where($task_map1)->whereor($task_map2)->whereor($task_map3);
+				})
+				->where($task_map)->count();
+				//已完成任务
+				$task_map[] = ['status', '>', 2]; //已完成
+				$v['tasks_finish'] = Db::name('ProjectTask')->where(function ($query) use ($task_map1, $task_map2, $task_map3) {
+					$query->where($task_map1)->whereor($task_map2)->whereor($task_map3);
+				})
+				->where($task_map)->count();
+				//未完成任务
+				$v['tasks_unfinish'] = $v['tasks_total'] - $v['tasks_finish'];
+				$v['tasks_pensent'] = "100％";
+				if ($v['tasks_total'] > 0) {
+					$v['tasks_pensent'] = round($v['tasks_finish'] / $v['tasks_total'] * 100, 2) . "％";
+				}
+			}
+		}
+        to_assign(0, '', $users);
+    }
+
+	//新增项目成员
+    public function add_user()
+    {
+        $param = get_params();
+        if (request()->isPost()) {
+			if($param['uid'] == 0){
+				to_assign(1, '已取消');
+			}
+			$has = Db::name('ProjectUser')->where(['uid' => $param['uid'],'project_id'=>$param['project_id']])->find();
+			if(!empty($has)){
+				to_assign(1, '该员工已经是项目成员');
+			}
+			$project = Db::name('Project')->where(['id' => $param['project_id']])->find();
+			if($this->uid == 1 || $this->uid == $project['admin_id'] || $this->uid == $project['director_uid']){
+				$param['admin_id'] = $this->uid;
+				$param['create_time'] = time();
+				$res = Db::name('ProjectUser')->strict(false)->field(true)->insert($param);
+				if ($res) {
+					to_assign();
+				}				
+			}else{
+				to_assign(1, '只有项目创建者和负责人才有权限新增项目成员');
+			}
+		}
+	}
+
+	//移除项目成员
+	public function remove_user()
+	{
+		$param = get_params();
+		if (request()->isDelete()) {
+			$detail = Db::name('ProjectUser')->where(['id' => $param['id']])->find();
+			$project = Db::name('Project')->where(['id' => $detail['project_id']])->find();
+			if($this->uid == $project['admin_id'] || $this->uid == $project['director_uid']){
+				if($detail['uid'] == $project['admin_id']){
+					to_assign(1, '该项目成员是项目的创建者，不能移除');
+				}
+				if($detail['uid'] == $project['director_uid']){
+					to_assign(1, '该项目成员是项目的负责人，需要去除负责人权限才能移除');
+				}
+				$param['delete_time'] = time();
+				if (Db::name('ProjectUser')->update($param) !== false) {				
+					return to_assign(0, "移除成功");
+				} else {
+					return to_assign(1, "移除失败");
+				}
+			}else{
+				to_assign(1, '只有项目创建者和负责人才有权限移除项目成员');
+			}
+		}else{
+			return to_assign(1, "错误的请求");
+		}
+	}
+	//恢复项目成员
+	public function recover_user()
+	{
+		$param = get_params();
+		if (request()->isPost()) {
+			$detail = Db::name('ProjectUser')->where(['id' => $param['id']])->find();
+			$project = Db::name('Project')->where(['id' => $detail['project_id']])->find();
+			if($this->uid == $project['admin_id'] || $this->uid == $project['director_uid']){
+				$param['delete_time'] = 0;
+				if (Db::name('ProjectUser')->update($param) !== false) {				
+					return to_assign(0, "恢复成功");
+				} else {
+					return to_assign(1, "恢复失败");
+				}
+			}else{
+				to_assign(1, '只有项目创建者和负责人才有权限恢复项目成员');
+			}
+		}else{
+			return to_assign(1, "错误的请求");
+		}
+	}
+	
+    //关闭项目
+    public function close()
+    {
+        if (request()->isPost()) {
+            $id = get_params("id");
+            $project = Db::name('Project')->where('id', $id)->find();
+			if($project['status'] == 3){
+				return to_assign(1, "已完成的项目当不能关闭");
+			}
+			$auth = isAuth($this->uid,'project_admin','conf_1');
+			if($project['admin_id'] == $this->uid || $project['director_uid'] == $this->uid || $auth==1){
+				if (Db::name('Project')->where('id', $id)->update(['status'=>4]) !== false) {
+					add_log('close', $id, [],'项目');
+					return to_assign(0, "操作成功");
+				} else {
+					return to_assign(1, "操作失败");
+				}
+			}
+			else{
+				return to_assign(1, "只有项目管理员、项目创建人、项目负责人才有权限关闭");
+			}
+        } else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+	
+	//关闭项目
+    public function open()
+    {
+        if (request()->isPost()) {
+            $id = get_params("id");
+            $project = Db::name('Project')->where('id', $id)->find();
+			if($project['status'] == 3){
+				return to_assign(1, "已完成的项目当不能开启");
+			}
+			$auth = isAuth($this->uid,'project_admin','conf_1');
+			if($project['admin_id'] == $this->uid || $project['director_uid'] == $this->uid || $auth==1){
+				if (Db::name('Project')->where('id', $id)->update(['status'=>2]) !== false) {
+					add_log('open', $id, [],'项目');
+					return to_assign(0, "操作成功");
+				} else {
+					return to_assign(1, "操作失败");
+				}
+			}
+			else{
+				return to_assign(1, "只有项目管理员、项目创建人、项目负责人才有权限开启");
+			}
+        } else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+	
+	//删除已有的项目步骤
+    public function step_del()
+    {
+        if (request()->isDelete()) {
+            $id = get_params("id");
+            $step = Db::name('ProjectStep')->where('id', $id)->find();
+			if($step['is_current'] == 1){
+				return to_assign(1, "项目当前所在步骤不能删除");
+			}
+			$project = Db::name('Project')->where('id', $step['project_id'])->find();
+			$auth = isAuth($this->uid,'project_admin','conf_1');
+			if($project['admin_id'] == $this->uid || $project['director_uid'] == $this->uid || $auth==1){
+				if (Db::name('ProjectStep')->where('id', $id)->update(['delete_time'=>time()]) !== false) {
+					return to_assign(0, "删除成功");
+				} else {
+					return to_assign(1, "删除失败");
+				}
+			}
+			else{
+				return to_assign(1, "只有项目管理员、项目创建人、项目负责人才有权限删除");
+			}
+        } else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+	
+	//审核
+    public function step_check()
+    {
+        $param = get_params();
+		$detail = Db::name('Project')->where(['id' => $param['id']])->find();
+		if($detail['status'] > 2){
+			return to_assign(1, "不支持该操作：项目已完成或者已关闭");
+		}
+		//当前审核节点详情
+		$step = Db::name('ProjectStep')->where(['project_id'=>$detail['id'],'is_current' => 1,'delete_time'=>0])->find();
+		if ($this->uid != $step['director_uid']){		
+			return to_assign(1,'您没权限操作');
+		}
+		//审核通过
+		if($param['check'] == 1){
+			$next_step = Db::name('ProjectStep')->where([['project_id','=',$detail['id']],['sort','>',$step['sort']],['delete_time','=',0]])->order('sort', 'asc')->find();
+			if(!empty($next_step)){
+				Db::name('ProjectStep')->where('id', $step['id'])->strict(false)->field(true)->update(['is_current'=>0]);
+				Db::name('ProjectStep')->where('id', $next_step['id'])->strict(false)->field(true)->update(['is_current'=>1]);
+				$param['status'] = 2;
+			}
+			else{
+				//不存在下一步审核，审核结束
+				$param['status'] = 3;
+				Db::name('ProjectStep')->where('id', $step['id'])->strict(false)->field(true)->update(['is_current'=>0]);
+			}		
+			//审核通过数据操作
+			Db::name('Project')->strict(false)->field('status')->update($param);
+			$checkData=array(
+				'project_id' => $detail['id'],
+				'step_id' => $step['id'],
+				'check_uid' => $this->uid,
+				'check_time' => time(),
+				'status' => $param['check'],
+				'content' => $param['content'],
+				'create_time' => time()
+			);
+			Db::name('ProjectStepRecord')->strict(false)->field(true)->insertGetId($checkData);
+			add_log('check', $param['id'], $param,'项目阶段');
+			return to_assign();
+		}
+		//回退审核
+		else if($param['check'] == 2){
+			//获取上一步的审核信息
+			$prev_step = Db::name('ProjectStep')->where([['project_id','=',$detail['id']],['sort','<',$step['sort']],['delete_time','=',0]])->order('sort', 'desc')->find();
+			if(!empty($prev_step)){
+				//存在上一步审核
+				Db::name('ProjectStep')->where('id', $step['id'])->strict(false)->field(true)->update(['is_current'=>0]);
+				Db::name('ProjectStep')->where('id', $prev_step['id'])->strict(false)->field(true)->update(['is_current'=>1]);
+				$checkData=array(
+					'project_id' => $detail['id'],
+					'step_id' => $step['id'],
+					'check_uid' => $this->uid,
+					'check_time' => time(),
+					'status' => $param['check'],
+					'content' => $param['content'],
+					'create_time' => time()
+				);	
+				Db::name('ProjectStepRecord')->strict(false)->field(true)->insertGetId($checkData);
+				add_log('refue', $param['id'], $param,'项目阶段');
+				return to_assign();
+			}
+			else{
+				return to_assign(1,'已经是第一个阶段了');
+			}
+		}				
+    }
+	
+	//获取项目类别
+	public function get_project_cate()
+    {
+		$list = get_base_data('project_cate');
+		return to_assign(0, '', $list);
+    }
+	
+	public function project_edit()
+    {
+		$param = get_params();
+		$this->model->apiedit($param);
+    }
+}
diff --git a/app/project/controller/Cate.php b/app/project/controller/Cate.php
new file mode 100644
index 0000000000000000000000000000000000000000..4e600235a1953b8b5f2b62702384a77a0b405495
--- /dev/null
+++ b/app/project/controller/Cate.php
@@ -0,0 +1,141 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\project\controller;
+
+use app\base\BaseController;
+use app\project\model\ProjectCate as ProjectCateModel;
+use app\project\validate\CateValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Cate extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new ProjectCateModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+            $list = $this->model->where('delete_time',0)->order('sort asc')->select();
+            return to_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {		
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(CateValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(CateValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				View::assign('detail', $detail);
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			View::assign('detail', $detail);
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		if (request()->isDelete()) {
+			$param = get_params();
+			$id = isset($param['id']) ? $param['id'] : 0;
+			$type = isset($param['type']) ? $param['type'] : 0;
+			$this->model->delById($id,$type);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+
+    /**
+    * 设置
+    */
+    public function set()
+    {
+		if (request()->isAjax()) {
+			$param = get_params();
+			$res = $this->model->strict(false)->field('id,status')->update($param);
+			if ($res) {
+				if($param['status'] == 0){
+					add_log('disable', $param['id'], $param);
+				}
+				else if($param['status'] == 1){
+					add_log('recovery', $param['id'], $param);
+				}
+				return to_assign();
+			}
+			else{
+				return to_assign(0, '操作失败');
+			}
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+   
+
+}
diff --git a/app/project/controller/Document.php b/app/project/controller/Document.php
new file mode 100644
index 0000000000000000000000000000000000000000..b6c09be7953eb779da1c7d4a6804e04ddea88979
--- /dev/null
+++ b/app/project/controller/Document.php
@@ -0,0 +1,154 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\project\controller;
+
+use app\base\BaseController;
+use app\project\model\ProjectDocument;
+use app\project\validate\DocumentCheck;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Document extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new ProjectDocument();
+    }
+	
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+            $param = get_params();			
+			$where = array();
+			$whereOr  = array();
+			if (!empty($param['keywords'])) {
+				$where[] = ['title|content', 'like', '%' . $param['keywords'] . '%'];
+			}
+			if (!empty($param['project_id'])) {
+				$where[] = ['project_id', '=', $param['project_id']];
+			} else {
+				$project_ids = Db::name('ProjectUser')->where(['uid' => $this->uid, 'delete_time' => 0])->column('project_id');
+				$whereOr[] = ['admin_id', '=', $this->uid];
+				$whereOr[] = ['project_id', 'in', $project_ids];
+			}
+			$where[] = ['delete_time', '=', 0];
+			$list = $this->model->datalist($param,$where,$whereOr);
+            return table_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+
+    //添加
+    public function add()
+    {
+        $param = get_params();
+        if (request()->isPost()) {
+            if (!empty($param['id']) && $param['id'] > 0) {
+                $detail = $this->model->detail($param['id']);
+                try {
+                    validate(DocumentCheck::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['update_time'] = time();
+                $res = ProjectDocument::where('id', $param['id'])->strict(false)->field(true)->update($param);
+                if ($res) {
+                    add_log('edit', $param['id'], $param);
+                }
+                return to_assign();
+            } else {
+                try {
+                    validate(DocumentCheck::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['create_time'] = time();
+                $param['admin_id'] = $this->uid;
+                $sid = ProjectDocument::strict(false)->field(true)->insertGetId($param);
+                if ($sid) {
+                    add_log('add', $sid, $param);
+                }
+                return to_assign();
+            }
+        } else {
+			$id = isset($param['id']) ? $param['id'] : 0;
+			$project_id = isset($param['project_id']) ? $param['project_id'] : 0;
+			if($id>0){
+				View::assign('detail', $this->model->detail($param['id']));
+			}
+			if($project_id>0){
+				$project_name =  Db::name('Project')->where(['id' => $project_id])->value('name');
+				View::assign('project_name', $project_name);
+			}
+            View::assign('project_id', $project_id);
+            View::assign('id', $id);
+            return view();
+        }
+    }
+
+    //查看
+    public function view()
+    {
+        $param = get_params();
+        $id = isset($param['id']) ? $param['id'] : 0;
+        $detail = $this->model->detail($id);
+        if (empty($detail)) {
+			if (empty($detail)) {
+				echo '<div style="text-align:center;color:red;margin-top:20%;">该文档不存在</div>';exit;
+			}
+        } else {
+            $project_ids = Db::name('ProjectUser')->where(['uid' => $this->uid, 'delete_time' => 0])->column('project_id');
+            if (in_array($detail['project_id'], $project_ids) || ($this->uid = $detail['admin_id'])) {
+                View::assign('detail', $detail);
+                if(is_mobile()){
+					return view('qiye@/project/document_view');
+				}
+                return view();
+            }
+            else{
+				echo '<div style="text-align:center;color:red;margin-top:20%;">您没权限查看该文档</div>';exit;
+            }
+        }
+    }
+
+    //删除
+    public function delete()
+    {
+        if (request()->isDelete()) {
+            $id = get_params("id");
+            $detail = Db::name('ProjectDocument')->where('id', $id)->find();
+            if ($detail['admin_id'] != $this->uid) {
+                return to_assign(1, "你不是该文档的创建人，无权限删除");
+            }
+            if (Db::name('ProjectDocument')->where('id', $id)->update(['delete_time' => time()]) !== false) {
+                return to_assign(0, "删除成功");
+            } else {
+                return to_assign(0, "删除失败");
+            }
+        } else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+}
diff --git a/app/project/controller/Index.php b/app/project/controller/Index.php
new file mode 100644
index 0000000000000000000000000000000000000000..140650e8e5de66e1cdb7574f705597a73ee94bab
--- /dev/null
+++ b/app/project/controller/Index.php
@@ -0,0 +1,291 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\project\controller;
+
+use app\base\BaseController;
+use app\project\model\Project as ProjectModel;
+use app\project\validate\IndexValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Index extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new ProjectModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+		$param = get_params();
+		$uid = $this->uid;
+		$auth = isAuth($uid,'project_admin','conf_1');
+		$tab = isset($param['tab']) ? $param['tab'] : 0;
+        if (request()->isAjax()) {
+			$where = array();
+			$whereOr = array();
+			$where[] = ['delete_time', '=', 0];
+			if (!empty($param['status'])) {
+				$where[] = ['status', '=', $param['status']];
+			}
+			if (!empty($param['cate_id'])) {
+                $where[] = ['cate_id', '=', $param['cate_id']];
+            }
+			if (!empty($param['keywords'])) {
+				$where[] = ['name|content', 'like', '%' . $param['keywords'] . '%'];
+			}
+			if (!empty($param['director_uid'])) {
+				$where[] = ['director_uid', 'in', $param['director_uid']];
+			}
+			else{
+				if($auth == 0){
+					$whereOr[] = ['director_uid', '=', $uid];
+					$project_ids = Db::name('ProjectUser')->where(['uid' => $uid, 'delete_time' => 0])->column('project_id');
+					$whereOr[] = ['id', 'in', $project_ids];
+					$dids_a = get_leader_departments($uid);	
+					$dids_b = get_role_departments($uid);
+					$dids = array_merge($dids_a, $dids_b);
+					if(!empty($dids)){
+						$whereOr[] = ['did','in',$dids];
+					}
+				}
+			}
+			if($tab == 0){
+
+			}
+			if($tab == 1){
+				$where[] = ['status', '=', 2];
+			}
+			if($tab == 2){
+				$time = time();
+				$dalay_time = time()+7*86400;
+				$where[] = ['status', '<', 3];
+				$where[] = ['end_time', 'between', [$time,$dalay_time]];
+			}
+			if($tab == 3){
+				$where[] = ['status', '<', 3];
+				$where[] = ['end_time', '<', time()];
+			}
+            $list = $this->model->datalist($param,$where,$whereOr);
+            return table_assign(0, '', $list);
+        }
+        else{
+			View::assign('auth', $auth);
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {
+			if (isset($param['range_time'])) {
+                $range_time = explode('到',$param['range_time']);
+				$param['start_time'] = strtotime(urldecode(trim($range_time[0])));
+				$param['end_time'] = strtotime(urldecode(trim($range_time[1])));
+            }			
+			$param['status'] = 2;
+			$param['step_sort'] = 0;
+			$step_title_data = isset($param['step_title']) ? $param['step_title'] : '';
+			$step_director_uid_data = isset($param['step_director_uid']) ? $param['step_director_uid'] : '';
+			$step_uids_data = isset($param['step_uids']) ? $param['step_uids'] : '';
+			$step_cycle_time_data = isset($param['step_cycle_time']) ? $param['step_cycle_time'] : '';
+			$step_remark_data = isset($param['step_remark']) ? $param['step_remark'] : '';
+			$step_id_data = isset($param['step_id']) ? $param['step_id'] : 0;
+			
+			$step = [];
+			$time_1 = $param['start_time'];
+			$time_2 = $param['end_time'];
+			foreach ($step_title_data as $key => $value) {
+				if (!$value) {
+					continue;
+				}				
+				$step_cycle_time = explode('到',$step_cycle_time_data[$key]);
+				$start_time = strtotime(urldecode(trim($step_cycle_time[0])));
+				$end_time = strtotime(urldecode(trim($step_cycle_time[1])));
+				if($start_time<$time_1){
+					return to_assign(1, '第'.($key+1).'阶段的开始时间不能小于项目计划周期的开始时间');
+					break;
+				}
+				if($end_time>$time_2){
+					return to_assign(1, '第'.($key+1).'阶段的结束时间不能大于项目计划周期的结束时间');
+					break;
+				}
+				$item = [];
+				$item['title'] = $value;
+				$item['director_uid'] = $step_director_uid_data[$key];
+				$item['uids'] = $step_uids_data[$key];
+				$item['sort'] = $key;
+				$item['start_time'] = $start_time;
+				$item['end_time'] = $end_time;
+				$item['remark'] = $step_remark_data[$key];
+				$item['id'] = $step_id_data[$key];
+				$item['create_time'] = time();
+				$step[]=$item;	
+			}
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(IndexValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param,$step);
+            } else {
+                try {
+                    validate(IndexValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$param['admin_id'] = $this->uid;
+                $this->model->add($param,$step);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				$detail['current_step'] = Db::name('ProjectStep')->where(['project_id' => $id, 'is_current' => 1,'delete_time'=>0])->value('sort');
+				View::assign('detail', $detail);
+				return view('edit');
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			$detail['status_name'] = status_name($detail['status']);
+			$detail['cate'] = Db::name('ProjectCate')->where([['id', '=', $detail['cate_id']]])->value('title');
+			$team_admin_ids = Db::name('ProjectUser')->where(['delete_time' => 0,'project_id'=>$id])->column('uid');
+            $team_admin_names = Db::name('Admin')->where('id', 'in', $team_admin_ids)->column('name');
+            $detail['team_admin_names'] = implode(',', $team_admin_names);
+			
+			$tids = Db::name('ProjectTask')->where([['project_id', '=', $detail['id']], ['delete_time', '=', 0]])->column('id');
+            $detail['schedules'] = Db::name('Schedule')->where([['tid', 'in', $tids], ['delete_time', '=', 0]])->count();
+            $detail['hours'] = Db::name('Schedule')->where([['tid', 'in', $tids], ['delete_time', '=', 0]])->sum('labor_time');
+            $detail['plan_hours'] = Db::name('ProjectTask')->where([['project_id', '=', $detail['id']], ['delete_time', '=', 0]])->sum('plan_hours');
+			
+			$detail['tasks'] = Db::name('ProjectTask')->where([['project_id', '=', $detail['id']],['delete_time', '=', 0]])->count();
+            $detail['tasks_finish'] = Db::name('ProjectTask')->where([['project_id', '=', $detail['id']],['status', '>', 2], ['delete_time', '=', 0]])->count();
+            $detail['tasks_unfinish'] = $detail['tasks'] - $detail['tasks_finish'];
+			
+            $task_map = [];
+            $task_map[] = ['project_id', '=', $detail['id']];
+            $task_map[] = ['delete_time', '=', 0];
+            //判断是否是创建者或者负责人
+            $role = 0;
+            if ($detail['admin_id'] == $this->uid) {
+                $role = 1; //创建人
+            }
+            if ($detail['director_uid'] == $this->uid) {
+                $role = 2; //负责人
+            }
+			$auth = isAuth($this->uid,'project_admin','conf_1');
+			if ($auth == 1) {
+                $role = 3; //项目管理员
+            }
+
+			//相关附件
+			$file_array = Db::name('ProjectFile')
+                ->field('mf.id,mf.topic_id,mf.admin_id,f.id as file_id,f.name,f.filesize,f.filepath,f.fileext,f.create_time,f.admin_id,a.name as admin_name')
+                ->alias('mf')
+                ->join('File f', 'mf.file_id = f.id', 'LEFT')
+                ->join('Admin a', 'mf.admin_id = a.id', 'LEFT')
+                ->order('mf.create_time desc')
+                ->where(array('mf.topic_id' => $id, 'mf.module' => 'project'))
+                ->select()->toArray();
+		
+			//阶段操作记录			
+			$step_record = Db::name('ProjectStepRecord')
+				->field('s.*,a.name as check_name,p.title')
+				->alias('s')
+				->join('Admin a', 'a.id = s.check_uid', 'LEFT')
+				->join('ProjectStep p', 'p.id = s.step_id', 'LEFT')
+				->order('s.check_time asc')
+				->where(array('s.project_id' => $id))
+				->select()->toArray();		
+			foreach ($step_record as $kk => &$vv) {		
+				$vv['check_time_str'] = date('Y-m-d H:i', $vv['check_time']);
+				$vv['status_str'] = '提交';
+				if($vv['status'] == 1){
+					$vv['status_str'] = '确认完成';
+				}
+				else if($vv['status'] == 2){
+					$vv['status_str'] = '回退';
+				}
+				if($vv['status'] == 3){
+					$vv['status_str'] = '撤销';
+				}
+				if($vv['content'] == ''){
+					$vv['content'] = '无';
+				}
+			}
+			
+			//当前项目阶段
+			$step = Db::name('ProjectStep')->where(array('project_id' => $id, 'is_current' => 1,'delete_time'=>0))->find();
+			if(!empty($step)){
+				$step['director_name'] = Db::name('Admin')->where(['id' => $step['director_uid']])->value('name');
+				$unames = Db::name('Admin')->where([['id','in',$step['uids']]])->column('name');
+				$step['unames'] = implode(',',$unames);	
+			}
+            View::assign('role', $role);	
+            View::assign('file_array', $file_array);
+            View::assign('step', $step);
+			View::assign('step_record', $step_record);
+            View::assign('detail', $detail);
+			if(is_mobile()){
+				return view('qiye@/project/view');
+			}
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		$param = get_params();
+		$id = isset($param['id']) ? $param['id'] : 0;
+		if (request()->isDelete()) {
+			$this->model->delById($id);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }   
+
+}
diff --git a/app/project/controller/Step.php b/app/project/controller/Step.php
new file mode 100644
index 0000000000000000000000000000000000000000..661837ee6e82f1d8b835c7fee246e191e845b24d
--- /dev/null
+++ b/app/project/controller/Step.php
@@ -0,0 +1,141 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\project\controller;
+
+use app\base\BaseController;
+use app\project\model\Step as StepModel;
+use app\project\validate\StepValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Step extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new StepModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+            $list = $this->model->where('delete_time',0)->order('sort asc')->select();
+            return to_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {		
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(StepValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(StepValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				View::assign('detail', $detail);
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			View::assign('detail', $detail);
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		if (request()->isDelete()) {
+			$param = get_params();
+			$id = isset($param['id']) ? $param['id'] : 0;
+			$type = isset($param['type']) ? $param['type'] : 0;
+			$this->model->delById($id,$type);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+
+    /**
+    * 设置
+    */
+    public function set()
+    {
+		if (request()->isAjax()) {
+			$param = get_params();
+			$res = $this->model->strict(false)->field('id,status')->update($param);
+			if ($res) {
+				if($param['status'] == 0){
+					add_log('disable', $param['id'], $param);
+				}
+				else if($param['status'] == 1){
+					add_log('recovery', $param['id'], $param);
+				}
+				return to_assign();
+			}
+			else{
+				return to_assign(0, '操作失败');
+			}
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+   
+
+}
diff --git a/app/project/controller/Task.php b/app/project/controller/Task.php
new file mode 100644
index 0000000000000000000000000000000000000000..5aed379b8ca89f8776e213c48f555060c2353793
--- /dev/null
+++ b/app/project/controller/Task.php
@@ -0,0 +1,299 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\project\controller;
+
+use app\base\BaseController;
+use app\project\model\ProjectTask;
+use app\api\model\Comment;
+use app\oa\model\Schedule;
+use app\api\model\EditLog;
+use app\project\validate\TaskCheck;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Task extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new ProjectTask();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+		$param = get_params();
+		$uid = $this->uid;
+		$auth = isAuth($uid,'project_admin','conf_1');
+        if (request()->isAjax()) {
+			$tab = isset($param['tab']) ? $param['tab'] : 0;
+			$time = time();
+			$time = time();
+			$dalay_time = time()+7*86400;
+			$where = [];
+			$whereOr = [];
+			$where[] = ['delete_time', '=', 0];
+			if (!empty($param['status'])) {
+				$where[] = ['status', '=', $param['status']];
+			}
+			if (!empty($param['priority'])) {
+				$where[] = ['priority', '=', $param['priority']];
+			}
+			if (!empty($param['work_id'])) {
+				$where[] = ['work_id', '=', $param['work_id']];
+			}
+			if (!empty($param['keywords'])) {
+				$where[] = ['title|content', 'like', '%' . $param['keywords'] . '%'];
+			}
+			if(!empty($param['project_id'])){
+				$where[] = ['project_id', '=', $param['project_id']];			
+			}
+			if (!empty($param['director_uid'])) {
+				$where[] = ['director_uid', 'in', $param['director_uid']];
+			}
+			else{
+				if($auth == 0){
+					$whereOr[] = ['admin_id', '=', $uid];
+					$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',assist_admin_ids)")];
+					$dids_a = get_leader_departments($uid);	
+					$dids_b = get_role_departments($uid);
+					$dids = array_merge($dids_a, $dids_b);
+					if(!empty($dids)){
+						$whereOr[] = ['did','in',$dids];
+					}
+					if (empty($param['director_uid'])) {
+						$whereOr[] = ['director_uid', '=', $uid];
+					}
+				}
+			}
+			if($tab==1){
+				//进行中
+				$where[] = ['status', '<', 3];
+			}
+			if($tab==2){
+				//即将逾期
+				$where[] = ['status', '<', 3];
+				$where[] = ['end_time','between',[$time,$dalay_time]];
+			}
+			if($tab==3){
+				//已逾期
+				$where[] = ['status', '<', 3];
+				$where[] = ['end_time','<',$time];
+			}			
+			$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+			$order = empty($param['order']) ? 'status asc,id desc' : $param['order'];
+			$list = $this->model->datalist($param,$where,$whereOr);
+			return table_assign(0, '', $list);
+        }
+        else{
+			View::assign('auth', $auth);
+            return view();
+        }
+    }
+
+    //添加
+    public function add()
+    {
+        $param = get_params();
+        if (request()->isPost()) {
+            if (isset($param['end_time'])) {
+                $param['end_time'] = strtotime(urldecode($param['end_time']));
+            }if (isset($param['status'])) {
+                if ($param['status'] == 3) {
+                    $param['over_time'] = time();
+                } else {
+                    $param['over_time'] = 0;
+                }
+            }
+            if (!empty($param['id']) && $param['id'] > 0) {
+                $old = $this->model->detail($param['id']);
+                try {
+                    validate(TaskCheck::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['update_time'] = time();
+                $res = ProjectTask::where('id', $param['id'])->strict(false)->field(true)->update($param);
+                if ($res) {
+                    add_log('edit', $param['id'], $param);
+					$log=new EditLog();
+					$log->edit('Task',$param['id'],$param,$old);
+                }
+                return to_assign();
+            } else {
+                try {
+                    validate(TaskCheck::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['create_time'] = time();
+                $param['admin_id'] = $this->uid;
+                $insertId = ProjectTask::strict(false)->field(true)->insertGetId($param);
+                if ($insertId) {
+                    add_log('add', $insertId, $param);
+					$log=new EditLog();
+					$log->add('Task',$insertId);
+					//发消息
+					//event('SendMessage',$msg);
+                }
+                return to_assign();
+            }
+        } else {
+            if (isset($param['project_id'])) {
+                View::assign('project_id', $param['project_id']);
+            }
+            return view();
+        }
+    }
+
+    //查看
+    public function view()
+    {
+        $param = get_params();
+        $id = isset($param['id']) ? $param['id'] : 0;
+        $detail = (new ProjectTask())->detail($id);
+		$role_uid = [$detail['admin_id'], $detail['director_uid']];
+		$role_edit = 'view';
+		if (in_array($this->uid, $role_uid)) {
+			$role_edit = 'edit';
+		}
+		$project_ids = Db::name('ProjectUser')->where(['uid' => $this->uid, 'delete_time' => 0])->column('project_id');
+		$auth = isAuth($this->uid,'project_admin','conf_1');
+		if (in_array($detail['project_id'], $project_ids) || in_array($this->uid, $role_uid) || in_array($this->uid, explode(",",$detail['assist_admin_ids'])) || $auth==1) {
+			$file_array = Db::name('ProjectFile')
+			->field('mf.id,mf.topic_id,mf.admin_id,mf.file_id,f.name,f.filesize,f.filepath,f.fileext,f.create_time,f.admin_id,a.name as admin_name')
+			->alias('mf')
+			->join('File f', 'mf.file_id = f.id', 'LEFT')
+			->join('Admin a', 'mf.admin_id = a.id', 'LEFT')
+			->order('mf.create_time desc')
+			->where(array('mf.topic_id' => $id, 'mf.module' => 'task'))
+			->select()->toArray();
+
+			View::assign('detail', $detail);
+			View::assign('file_array', $file_array);
+			View::assign('role_edit', $role_edit);
+			View::assign('id', $id);
+			if(is_mobile()){
+				return view('qiye@/project/task_view');
+			}
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>405,'warning'=>'无权限访问']);
+		}
+    }
+
+    //删除
+    public function delete()
+    {
+        if (request()->isDelete()) {
+            $id = get_params("id");
+			$auth = isAuth($this->uid,'project_admin','conf_1');
+            $detail = Db::name('ProjectTask')->where('id', $id)->find();
+            if ($detail['admin_id'] != $this->uid && $auth==0) {
+                return to_assign(1, "你不是该任务的创建人，无权限删除");
+            }
+            if (Db::name('ProjectTask')->where('id', $id)->update(['delete_time' => time()]) !== false) {
+                return to_assign(0, "删除成功");
+            } else {
+                return to_assign(0, "删除失败");
+            }
+        } else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+	
+	public function hour() {
+        if (request()->isAjax()) {
+            $param = get_params();
+			$uid = $this->uid;
+			$auth = isAuth($uid,'project_admin','conf_1');
+            //按时间检索
+            $start_time = isset($param['start_time']) ? strtotime($param['start_time']) : 0;
+            $end_time = isset($param['end_time']) ? strtotime($param['end_time']) : 0;
+            $tid = isset($param['tid']) ? $param['tid'] : 0;
+            $where = [];
+            $whereOr = [];
+			if ($tid>0) {
+                $task_ids = Db::name('ProjectTask')->where(['delete_time' => 0, 'project_id' => $param['tid']])->column('id');
+				$where[] = ['a.tid', 'in', $task_ids];
+            }
+			else{
+				$where[] = ['a.tid', '>', 0];
+				if (!empty($param['keywords'])) {
+					$where[] = ['a.title', 'like', '%' . trim($param['keywords']) . '%'];
+				}
+				if ($start_time > 0 && $end_time > 0) {
+					$where[] = ['a.start_time', 'between', [$start_time, $end_time]];
+				}
+				if($auth == 0){
+					if (!empty($param['uid'])) {
+						$where[] = ['a.admin_id', '=', $param['uid']];
+					} else {
+						$whereOr[] = ['a.admin_id', '=', $uid];
+						$dids_a = get_leader_departments($uid);	
+						$dids_b = get_role_departments($uid);
+						$dids = array_merge($dids_a, $dids_b);
+						if(!empty($dids)){
+							$whereOr[] = ['a.did','in',$dids];
+						}
+					}
+				}
+			}
+            $where[] = ['a.delete_time', '=', 0];
+			
+			$model = new Schedule();
+			$list = $model->datalist($param,$where,$whereOr);
+            return table_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+	
+	public function comment() {
+        if (request()->isAjax()) {
+            $param = get_params();
+			$param['admin_id'] = $this->uid;
+			if (!empty($param['uid'])) {
+				$where[] = ['admin_id', '=', $param['uid']];
+			}
+			if (!empty($param['keywords'])) {
+				$where[] = ['content', 'like', '%' . trim($param['keywords']) . '%'];
+			}
+			if (!empty($param['module'])) {
+				$where[] = ['module', '=', $param['module']];
+			}
+			if (!empty($param['topic_id'])) {
+				$where['topic_id'] = $param['topic_id'];
+			}			
+            $where[] = ['delete_time', '=', 0];
+			$model = new Comment();
+            $list = $model->datalist($param,$where);
+            return table_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+}
diff --git a/app/project/controller/Work.php b/app/project/controller/Work.php
new file mode 100644
index 0000000000000000000000000000000000000000..3299e76da8a8c1b3f5be99a61f5ea38217bb3a2b
--- /dev/null
+++ b/app/project/controller/Work.php
@@ -0,0 +1,141 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\project\controller;
+
+use app\base\BaseController;
+use app\project\model\WorkCate as WorkCateModel;
+use app\project\validate\WorkValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Work extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new WorkCateModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+            $list = $this->model->order('sort asc')->select();
+            return to_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {		
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(WorkValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(WorkValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				View::assign('detail', $detail);
+			}
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			View::assign('detail', $detail);
+			return view();
+		}
+		else{
+			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		if (request()->isDelete()) {
+			$param = get_params();
+			$id = isset($param['id']) ? $param['id'] : 0;
+			$type = isset($param['type']) ? $param['type'] : 0;
+			$this->model->delById($id,$type);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+
+    /**
+    * 设置
+    */
+    public function set()
+    {
+		if (request()->isAjax()) {
+			$param = get_params();
+			$res = $this->model->strict(false)->field('id,status')->update($param);
+			if ($res) {
+				if($param['status'] == 0){
+					add_log('disable', $param['id'], $param);
+				}
+				else if($param['status'] == 1){
+					add_log('recovery', $param['id'], $param);
+				}
+				return to_assign();
+			}
+			else{
+				return to_assign(0, '操作失败');
+			}
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }
+   
+
+}
diff --git a/app/project/event.php b/app/project/event.php
new file mode 100644
index 0000000000000000000000000000000000000000..afe59182c6aa72dfdf36da12c258d8e48725b43e
--- /dev/null
+++ b/app/project/event.php
@@ -0,0 +1,8 @@
+<?php
+return [
+	'listen'    => [
+        //注册监听类
+        'SendMessage' => ['app\listener\SendMessage'],
+    ],
+    //'subscribe' => ['app\subscribe\Message'],
+];
diff --git a/app/project/middleware.php b/app/project/middleware.php
new file mode 100644
index 0000000000000000000000000000000000000000..c482cdc94129fdc23d6b57facd94e78af56a3c34
--- /dev/null
+++ b/app/project/middleware.php
@@ -0,0 +1,9 @@
+<?php
+
+// 这是系统自动生成的middleware定义文件
+return [
+    //开启session中间件
+    //'think\middleware\SessionInit',
+    //验证勾股OA是否完成安装
+    \app\home\middleware\Install::class,
+];
diff --git a/app/project/model/Project.php b/app/project/model/Project.php
new file mode 100644
index 0000000000000000000000000000000000000000..0bcaa51581f670bec4c0649044be037d45196e8f
--- /dev/null
+++ b/app/project/model/Project.php
@@ -0,0 +1,272 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\project\model;
+use think\model;
+use think\facade\Db;
+use app\api\model\EditLog;
+class Project extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($param=[],$where=[],$whereOr=[])
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			 ->where(function ($query) use ($whereOr) {
+				if (!empty($whereOr))
+					$query->whereOr($whereOr);
+				})
+			->order($order)
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key){
+				$item['title'] = $item['name'];
+				$item->director_name = Db::name('Admin')->where(['id' => $item->director_uid])->value('name');
+				$item->department = Db::name('Department')->where(['id' => $item->did])->value('title');
+				$item->admin_name = Db::name('Admin')->where(['id' => $item->admin_id])->value('name');
+				$item->status_name = status_name($item->status);
+				$item->range_time = date('Y-m-d',$item->start_time). ' 至 ' .date('Y-m-d',$item->end_time);
+				$item->delay = count_days(date("Y-m-d"),date('Y-m-d', $item->end_time));
+				$item->cate = Db::name('ProjectCate')->where('id', $item->cate_id)->value('title');
+				$task_map = [];
+                $task_map[] = ['project_id', '=', $item->id];
+                $task_map[] = ['delete_time', '=', 0];
+                //任务总数
+                $item->tasks_total = Db::name('ProjectTask')->where($task_map)->count();
+                //已完成任务
+                $task_map[] = ['status', '>', 2];
+                $item->tasks_finish = Db::name('ProjectTask')->where($task_map)->count();
+                //未完成任务
+				$item->tasks_unfinish = $item->tasks_total - $item->tasks_finish;
+				$item->tasks_pensent = "0.00％";
+				if ($item->tasks_total > 0) {
+                    $item->tasks_pensent = round($item->tasks_finish / $item->tasks_total * 100, 2) . "％";
+                }
+				$step = Db::name('ProjectStep')->where(['project_id' => $item->id,'is_current' => 1,'delete_time'=>0])->find();
+				if(!empty($step)){
+					$item->step_director = Db::name('Admin')->where(['id'=>$step['director_uid']])->value('name');
+					$item->step = $step['title'] . '『' . $item->step_director. '』';
+				}
+				else{						
+					$item->step = '-';
+				}
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+	
+    public function apilist($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)->field('id,status,name as title')->order($order)->paginate(['list_rows'=> $rows]);
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param,$step)
+    {
+		$insertId = 0;
+		// 启动事务
+		Db::startTrans();
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			$step_users=[];
+			//项目阶段
+			foreach ($step as $key => &$value) {
+				if($key==0){
+					$value['is_current'] = 1;
+				}
+				else{
+					$value['is_current'] = 0;
+				}
+				$value['project_id'] = $insertId;
+				if(!empty($value['director_uid'])){
+					$step_users[] = $value['director_uid'];
+				}
+				if(!empty($value['uids'])){
+					$step_users[] = $value['uids'];
+				}
+			}
+			Db::name('ProjectStep')->strict(false)->field(true)->insertAll($step);
+			$step_users_str = implode(',',$step_users);
+			//项目成员
+			$project_users = $param['admin_id'];
+			if (!empty($param['director_uid'])){
+				$project_users.=",".$param['director_uid'];
+			}
+			if (!empty($param['team_admin_ids'])){
+				$project_users.=",".$param['team_admin_ids'];
+			}
+			if (!empty($step_users_str)){
+				$project_users.=",".$step_users_str;
+			}
+			$project_array = explode(",",(string)$project_users);
+			$project_array = array_unique($project_array);
+			$project_user_array=[];
+			foreach ($project_array as $k => $v) {
+				if (is_numeric($v)) {
+					$project_user_array[]=array(
+						'uid'=>$v,
+						'admin_id'=>$param['admin_id'],
+						'project_id'=>$insertId,
+						'create_time'=>time(),
+					);
+				}
+			}
+			Db::name('ProjectUser')->strict(false)->field(true)->insertAll($project_user_array);
+			
+			
+			add_log('add', $insertId, $param);
+			$log=new EditLog();
+			$log->add('Project',$insertId);
+			// 提交事务
+			Db::commit();
+        } catch(\Exception $e) {
+			// 回滚事务
+			Db::rollback();
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param,$step)
+    {
+		// 启动事务
+		Db::startTrans();
+        try {
+            $param['update_time'] = time();
+			$old = self::find($param['id']);
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			$current_step = Db::name('ProjectStep')->where(['project_id' => $param['id'], 'is_current' => 1,'delete_time'=>0])->value('sort');
+			//项目阶段
+			foreach ($step as $key => $value) {
+				$value['project_id'] = $param['id'];
+				if($value['id'] == 0){
+					Db::name('ProjectStep')->strict(false)->field(true)->insert($value);
+				}
+				else{
+					$value['update_time'] = time();
+					if($value['sort'] == $current_step){
+						$value['is_current'] = 1;
+					}
+					else{
+						$value['is_current'] = 0;
+					}
+					Db::name('ProjectStep')->strict(false)->field(true)->update($value);
+				}
+			}			
+			add_log('edit', $param['id'], $param);
+			$log=new EditLog();
+			$log->edit('Project',$param['id'],$param,$old);
+			// 提交事务
+			Db::commit();
+        } catch(\Exception $e) {
+			// 回滚事务
+			Db::rollback();
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    public function apiedit($param)
+    {
+		try {
+            $param['update_time'] = time();
+			$old = self::find($param['id']);
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);		
+			add_log('edit', $param['id'], $param);
+			$log=new EditLog();
+			$log->edit('Project',$param['id'],$param,$old);
+		} catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+		}
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		$info['admin_name'] = Db::name('Admin')->where(['id' => $info['admin_id']])->value('name');
+		$info['director_name'] = Db::name('Admin')->where(['id' => $info['director_uid']])->value('name');
+		$info['department'] = Db::name('Department')->where(['id' => $info['did']])->value('title');
+		$info['contract_name'] = Db::name('Contract')->where(['id' => $info['contract_id']])->value('name');
+		//项目阶段			
+		$step_array = Db::name('ProjectStep')
+			->field('s.*,a.name as director_name')
+			->alias('s')
+			->join('Admin a', 'a.id = s.director_uid', 'LEFT')
+			->order('s.sort asc')
+			->where(array('s.project_id' => $id, 's.delete_time' => 0))
+			->select()->toArray();
+		foreach ($step_array as $kk => &$vv) {
+			$unames = Db::name('Admin')->where([['id','in',$vv['uids']]])->column('name');
+			$vv['unames'] = implode(',',$unames);	
+		}
+		$info['step_array'] = $step_array;
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/project/model/ProjectCate.php b/app/project/model/ProjectCate.php
new file mode 100644
index 0000000000000000000000000000000000000000..a221f0c0b766901428cd06adba148dc8860701ec
--- /dev/null
+++ b/app/project/model/ProjectCate.php
@@ -0,0 +1,108 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\project\model;
+use think\model;
+use think\facade\Db;
+class ProjectCate extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)->order($order)->paginate(['list_rows'=> $rows]);
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/project/model/ProjectDocument.php b/app/project/model/ProjectDocument.php
new file mode 100644
index 0000000000000000000000000000000000000000..c1f84d25fb6ef253e181a7378d2b067c3709d33f
--- /dev/null
+++ b/app/project/model/ProjectDocument.php
@@ -0,0 +1,63 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+namespace app\Project\model;
+use think\facade\Db;
+use think\Model;
+
+class ProjectDocument extends Model
+{
+    public function datalist($param,$where,$whereOr)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+				->where(function ($query) use($whereOr) {
+					if (!empty($whereOr)){
+						$query->whereOr($whereOr);
+					}
+				})
+				->order($order)
+				->paginate(['list_rows'=> $rows])
+				->each(function ($item, $key){
+					$item->admin_name = Db::name('Admin')->where(['id' => $item->admin_id])->value('name');
+					if ($item->project_id > 0) {
+						$item->project = Db::name('Project')->where(['id' => $item->project_id])->value('name');
+					}
+					else{						
+						$item->project = '-';
+					}
+				});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+	}	
+    //详情
+    public function detail($id)
+    {
+        $detail = Db::name('ProjectDocument')->where(['id' => $id])->find();
+        if (!empty($detail)) {
+			$detail['project_name'] = '-';
+            if ($detail['project_id'] > 0) {
+                $detail['project_name'] = Db::name('Project')->where(['id' => $detail['project_id']])->value('name');
+            }
+            $detail['admin_name'] = Db::name('Admin')->where(['id' => $detail['admin_id']])->value('name');
+            $detail['times'] = time_trans($detail['create_time']);
+            $detail['create_time'] = date('Y-m-d H:i:s', $detail['create_time']);
+        }
+        return $detail;
+    }
+}
diff --git a/app/project/model/ProjectTask.php b/app/project/model/ProjectTask.php
new file mode 100644
index 0000000000000000000000000000000000000000..979db0762bb70211143ff7bf4e92e0901bf34845
--- /dev/null
+++ b/app/project/model/ProjectTask.php
@@ -0,0 +1,117 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\project\model;
+
+use think\facade\Db;
+use think\Model;
+
+class ProjectTask extends Model
+{	
+    //列表
+    function datalist($param=[],$where=[],$whereOr=[]) {
+        $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'status asc,id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->where(function ($query) use ($whereOr) {
+				if (!empty($whereOr))
+					$query->whereOr($whereOr);
+				})
+			->withoutField('content')
+			->order($order)
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key){
+				$item['director_name'] = '-';
+				if ($item['director_uid'] > 0) {
+					$item['director_name'] = Db::name('Admin')->where(['id' => $item['director_uid']])->value('name');
+				}
+				$assist_admin_names = Db::name('Admin')->where([['id', 'in', $item['assist_admin_ids']]])->column('name');
+				if (empty($assist_admin_names)) {
+                    $item['assist_admin_names'] = '-';
+                } else {
+                    $item['assist_admin_names'] = implode(',', $assist_admin_names);
+                }
+				$item['cate_name'] = Db::name('WorkCate')->where(['id' => $item['work_id']])->value('title');
+				if ($item['project_id'] == 0) {
+					$item['project_name'] = '-';
+				} else {
+					$item['project_name'] = Db::name('Project')->where(['id' => $item['project_id']])->value('name');
+				}
+				$item['delay'] = 0;
+				if ($item['end_time'] > 0) {
+					$item['end_time'] = date('Y-m-d', $item['end_time']);
+					if ($item['over_time'] > 0 && $item['status'] < 4) {
+						$item['delay'] = count_days($item['end_time'], date('Y-m-d', $item['over_time']));
+					}
+					if ($item['over_time'] == 0 && $item['status'] < 4) {
+						$item['delay'] = count_days($item['end_time']);
+					}
+				}
+				else{
+					$item['delay'] = 9999;
+					$item['end_time'] = '-';
+				}
+				$item['priority_name'] = priority_name($item['priority']);
+				$item['status_name'] = status_task_name($item['status']);
+				return $item;
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+    //详情
+    public function detail($id)
+    {
+        $detail = Db::name('ProjectTask')->where(['id' => $id])->find();
+        if (!empty($detail)) {
+            $detail['project_name'] = '';
+            if ($detail['project_id'] > 0) {
+                $detail['project_name'] = Db::name('Project')->where(['id' => $detail['project_id']])->value('name');
+            }
+            $detail['admin_name'] = Db::name('Admin')->where(['id' => $detail['admin_id']])->value('name');
+            $detail['work_hours'] = Db::name('Schedule')->where(['delete_time' => 0, 'tid' => $detail['id']])->sum('labor_time');
+            $detail['cate_name'] = Db::name('WorkCate')->where(['id' => $detail['work_id']])->value('title');
+			
+			$detail['director_name']= '';
+			if($detail['director_uid'] > 0){
+				$detail['director_name'] = Db::name('Admin')->where(['id' => $detail['director_uid']])->value('name');
+			}
+            $detail['logs'] = Db::name('EditLog')->where(['name' => 'Task', 'action_id' => $detail['id']])->count();
+			$detail['comments'] = Db::name('Comment')->where(['module' => 'task', 'delete_time' => 0, 'topic_id' => $detail['id']])->count();
+            $detail['assist_admin_names'] = '';
+            if (!empty($detail['assist_admin_ids'])) {
+                $assist_admin_names = Db::name('Admin')->where('id', 'in', $detail['assist_admin_ids'])->column('name');
+                $detail['assist_admin_names'] = implode(',', $assist_admin_names);
+            }
+            $detail['priority_name'] = priority_name($detail['priority']);
+			$detail['status_name'] = status_task_name($detail['status']);
+            $detail['times'] = time_trans($detail['create_time']);
+			$detail['delay'] = 0;
+			if($detail['end_time']>0){
+				$detail['end_time'] = date('Y-m-d', $detail['end_time']);
+				if ($detail['over_time'] > 0 && $detail['status'] < 4) {
+					$detail['delay'] = count_days($detail['end_time'], date('Y-m-d', $detail['over_time']));
+				}
+				if ($detail['over_time'] == 0 && $detail['status'] < 4) {
+					$detail['delay'] = count_days($detail['end_time']);
+				}
+			}
+			else{
+				$detail['end_time'] = '';
+			}
+        }
+        return $detail;
+    }
+}
diff --git a/app/project/model/Step.php b/app/project/model/Step.php
new file mode 100644
index 0000000000000000000000000000000000000000..cf7be298792fee9ecf97e85ba034b520e5e038e3
--- /dev/null
+++ b/app/project/model/Step.php
@@ -0,0 +1,108 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\project\model;
+use think\model;
+use think\facade\Db;
+class Step extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)->order($order)->paginate(['list_rows'=> $rows]);
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/project/model/WorkCate.php b/app/project/model/WorkCate.php
new file mode 100644
index 0000000000000000000000000000000000000000..9bdcf7c65959e1049b99761e4ef62810a478e3e0
--- /dev/null
+++ b/app/project/model/WorkCate.php
@@ -0,0 +1,109 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\project\model;
+use think\model;
+use think\facade\Db;
+class WorkCate extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)->order($order)->paginate(['list_rows'=> $rows]);
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['return_id'=>$param['id']]);
+    }
+	
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/project/validate/CateValidate.php b/app/project/validate/CateValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..48d0413e97e8b7e23fd5793352c067f971c03ae3
--- /dev/null
+++ b/app/project/validate/CateValidate.php
@@ -0,0 +1,43 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\project\validate;
+use think\Validate;
+use think\facade\Db;
+
+class CateValidate extends Validate
+{
+	// 自定义验证规则
+	protected function checkOne($value,$rule,$data=[])
+	{
+		$id = isset($data['id'])?$data['id']:0;
+		$count = Db::name('ProjectCate')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count();
+		return $count == 0 ? true : false;
+	}
+	
+    protected $rule = [
+		'title' => 'require|checkOne',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'title.require' => '名称不能为空',
+		'title.checkOne' => '同样的名称已经存在',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['title', 'id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/project/validate/DocumentCheck.php b/app/project/validate/DocumentCheck.php
new file mode 100644
index 0000000000000000000000000000000000000000..131aeb0c0b0e6f37933db098d9de95c7643ce256
--- /dev/null
+++ b/app/project/validate/DocumentCheck.php
@@ -0,0 +1,34 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\project\validate;
+
+use think\Validate;
+
+class DocumentCheck extends Validate
+{
+    protected $rule = [
+        'title' => 'require',
+        'id' => 'require',
+    ];
+
+    protected $message = [
+        'title.require' => '文档标题不能为空',
+        'id.require' => '缺少更新条件',
+    ];
+
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['id'],
+    ];
+}
diff --git a/app/project/validate/IndexValidate.php b/app/project/validate/IndexValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..d44a98bbe90e12487db7a55dd8cb0c45905fb5d5
--- /dev/null
+++ b/app/project/validate/IndexValidate.php
@@ -0,0 +1,43 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\project\validate;
+use think\Validate;
+use think\facade\Db;
+
+class IndexValidate extends Validate
+{
+	// 自定义验证规则
+	protected function checkOne($value,$rule,$data=[])
+	{
+		$id = isset($data['id'])?$data['id']:0;
+		$count = Db::name('Project')->where([['name','=',$data['name']],['id','<>',$id],['delete_time','=',0]])->count();
+		return $count == 0 ? true : false;
+	}
+	
+    protected $rule = [
+		'name' => 'require|checkOne',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'name.require' => '项目名称不能为空',
+		'name.checkOne' => '同样的项目名称已经存在',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['title', 'id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/project/validate/StepValidate.php b/app/project/validate/StepValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..cc6eebecb7a733c93a79856700907185f32afaba
--- /dev/null
+++ b/app/project/validate/StepValidate.php
@@ -0,0 +1,43 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\project\validate;
+use think\Validate;
+use think\facade\Db;
+
+class StepValidate extends Validate
+{
+	// 自定义验证规则
+	protected function checkOne($value,$rule,$data=[])
+	{
+		$id = isset($data['id'])?$data['id']:0;
+		$count = Db::name('Step')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count();
+		return $count == 0 ? true : false;
+	}
+	
+    protected $rule = [
+		'title' => 'require|checkOne',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'title.require' => '名称不能为空',
+		'title.checkOne' => '同样的名称已经存在',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['title', 'id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/project/validate/TaskCheck.php b/app/project/validate/TaskCheck.php
new file mode 100644
index 0000000000000000000000000000000000000000..5c7d9b1b77a5fb9ce3aa0a65205f0ddd266c4c4d
--- /dev/null
+++ b/app/project/validate/TaskCheck.php
@@ -0,0 +1,38 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\project\validate;
+
+use think\Validate;
+
+class TaskCheck extends Validate
+{
+    protected $rule = [
+        'title' => 'require',
+        'plan_hours' => 'require|regex:/^[0-9]+(.[0-9]{1,1})?$/',
+        'id' => 'require',
+    ];
+
+    protected $message = [
+        'title.require' => '任务主题不能为空',
+        'plan_hours.require' => '预估工时不能为空',
+        'plan_hours.regex' => '预估工时只能是整数或者1位小数的数字',
+        'id.require' => '缺少更新条件',
+    ];
+
+    protected $scene = [
+        'add' => ['title'],
+        'hours' => ['plan_hours'],
+        'edit' => ['id'],
+    ];
+}
diff --git a/app/project/validate/WorkValidate.php b/app/project/validate/WorkValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..b5d56e269dad9cf032dea3f8bbd561b9136eb277
--- /dev/null
+++ b/app/project/validate/WorkValidate.php
@@ -0,0 +1,43 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\project\validate;
+use think\Validate;
+use think\facade\Db;
+
+class WorkValidate extends Validate
+{
+	// 自定义验证规则
+	protected function checkOne($value,$rule,$data=[])
+	{
+		$id = isset($data['id'])?$data['id']:0;
+		$count = Db::name('WorkCate')->where([['title','=',$data['title']],['id','<>',$id]])->count();
+		return $count == 0 ? true : false;
+	}
+	
+    protected $rule = [
+		'title' => 'require|checkOne',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'title.require' => '名称不能为空',
+		'title.checkOne' => '同样的名称已经存在',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['title', 'id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/project/view/cate/add.html b/app/project/view/cate/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..09f9fa00fd06243adc1b28f460f86c13c1ec4ccb
--- /dev/null
+++ b/app/project/view/cate/add.html
@@ -0,0 +1,45 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">项目分类</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">项目分类名称<font>*</font></td>
+			<td><input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入项目分类名称" lay-reqText="请输入项目分类名称"class="layui-input" value="{$detail.title|default=''}"></td>
+			<td class="layui-td-gray">排序</td>
+			<td><input type="text" name="sort" placeholder="请输入排序，数字" autocomplete="off" class="layui-input" value="{$detail.sort|default=''}"></td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$detail.id|default=0}"/>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool'];
+
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/project/cate/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/project/view/cate/datalist.html b/app/project/view/cate/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..b02916259fe0c5bef33dfae2bf365fc4255d93ca
--- /dev/null
+++ b/app/project/view/cate/datalist.html
@@ -0,0 +1,124 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<table class="layui-hide" id="table_project_cate" lay-filter="table_project_cate"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm add-new" type="button">+ 添加项目分类</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool;
+		
+		layui.pageTable = table.render({
+			elem: "#table_project_cate"
+			,toolbar: '#toolbarDemo'
+			,url: "/project/cate/datalist"
+			,page: false
+			,limit: 999
+			,cellMinWidth: 80
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',title: '类型名称'}
+				,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+					var html1='<span class="green">正常</span>';
+					var html2='<span class="yellow">禁用</span>';
+					if(d.status==1){
+						return html1;
+					}
+					else{
+						return html2;
+					}
+				}}
+				,{width:100,title: '操作', align:'center',ignoreExport:true,templet: function(d){
+					var html='';
+					var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+					if(d.status==1){
+						html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+					}
+					else{
+						html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+					}
+					return html;
+				}}
+			]]
+		});
+			
+		table.on('tool(table_project_cate)',function (obj) {
+			if(obj.event === 'edit'){					
+				add_cate(obj.data.id,obj.data.title);
+			}
+			if(obj.event === 'disable'){
+				layer.confirm('确定要禁用该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/project/cate/set", {id:obj.data.id,status: 0}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'open'){
+				layer.confirm('确定要启用该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/project/cate/set", {id:obj.data.id,status:1}, callback);
+					layer.close(index);
+				});
+			}
+		});
+		
+		$('body').on('click','.add-new',function(){
+			add_cate(0,'');	
+		});
+		
+		function add_cate(id,val){
+			var title = '新增类型';
+			if(id>0){
+				title = '编辑类型';
+			}
+			layer.prompt({
+				title: title,
+				value: val,
+				yes: function(index, layero) {
+					// 获取文本框输入的值
+					var value = layero.find(".layui-layer-input").val();
+					if (value) {
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();				
+							}
+						}
+						tool.post("/project/cate/add", {id: id,title: value}, callback);
+						layer.close(index);
+					} else {
+						layer.msg('请填写类型名称');
+					}
+				}
+			})
+		}
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/project/view/cate/view.html b/app/project/view/cate/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..b31077a5dd0c84b16e60c1a5f747b77f305acfda
--- /dev/null
+++ b/app/project/view/cate/view.html
@@ -0,0 +1,16 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<h3 class="pb-3">项目分类详情</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">项目分类名称</td>
+			<td>{$detail.title|default=''}"></td>
+			<td class="layui-td-gray">排序</td>
+			<td>{$detail.sort|default=0}</td>
+		</tr>
+	</table>
+</div>
+{/block}
+<!-- /主体 -->
\ No newline at end of file
diff --git a/app/project/view/document/add.html b/app/project/view/document/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..5275a2233e31427b8af55b06e01759b291414e3c
--- /dev/null
+++ b/app/project/view/document/add.html
@@ -0,0 +1,98 @@
+{extend name="../../base/view/common/base" /}
+{block name="body"}
+<form class="layui-form p-4">
+	{eq name="id" value ="0"}
+	<h3 class="pb-3">新建文档</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">文档名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" lay-verify="required" lay-reqText="请输入文档名称" placeholder="请输入文档名称" class="layui-input" value="">
+			</td>
+			<td class="layui-td-gray">关联项目<font>*</font></td>
+			<td>
+				<input type="text" name="project_name" placeholder="所属项目" value="{$project_name|default=''}" readonly class="layui-input picker-oa" data-types="project" autocomplete="off" />
+				<input type="hidden" name="project_id" value="{$project_id}" />
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">文档内容<font>*</font></td>
+			<td colspan="5">
+			  <textarea name="content" placeholder="请输入内容" class="layui-textarea" id="container" style="border:0;padding:0"></textarea>
+			</td>
+		</tr>
+	</table>
+	</div>
+	{else/}
+	<h3  class="pb-3">编辑文档</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">文档名称<font>*</font>
+			</td>
+			<td>
+				<input type="text" name="title" lay-verify="required" lay-reqText="请输入文档名称" placeholder="请输入文档名称"
+					class="layui-input" value="{$detail.title}">
+			</td>
+			<td class="layui-td-gray">关联项目<font>*</font></td>
+			<td>
+				<select id="projectId" name="project_id" lay-filter="project_id">
+					<option value="">请选择关联项目</option>
+					{volist name=":get_project()" id="v"}
+					<option value="{$v.id}" {eq name = "$v.id" value="$detail.project_id"} selected{/eq}>{$v.name}</option>
+					{/volist}
+				</select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">文档内容<font>*</font></td>
+			<td colspan="5">
+			  <textarea name="content" placeholder="请输入内容" class="layui-textarea" id="container" style="border:0;padding:0">{$detail.content}</textarea>
+			</td>
+		</tr>
+	</table>
+	{/eq}
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$id}" />
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tinymce','oaPicker'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool;
+		
+		//编辑器初始化
+		var editor = layui.tinymce;
+		var edit = editor.render({
+			selector: "#container",
+			images_upload_url: '/api/index/upload/sourse/tinymce',//图片上传接口
+			height:600
+		});
+
+		//监听提交
+		form.on('submit(webform)', function (data) {
+		  data.field.content = tinyMCE.editors['container'].getContent();
+			if (data.field.content == '') {
+				layer.msg('请先完善文档内容');
+				return false;
+			}
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000,'documentTable');
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/project/document/add", data.field, callback,clickbtn);
+			return false;
+		});
+  }
+
+</script>
+{/block}
\ No newline at end of file
diff --git a/app/project/view/document/datalist.html b/app/project/view/document/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..6d19936ffa3246909e955fb6fe134618dce18989
--- /dev/null
+++ b/app/project/view/document/datalist.html
@@ -0,0 +1,116 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<div class="gg-form-bar border-t border-x">
+		<form class="layui-form" lay-filter="barsearchform">
+			<div class="layui-input-inline" style="width:240px;">
+				<input type="text" name="project_name" placeholder="所属项目" readonly class="layui-input picker-oa" data-types="project" autocomplete="off" />
+				<input name="project_id" style="display: none;" value="" />
+			</div>
+			<div class="layui-input-inline" style="width:300px;">
+				<input type="text" name="keywords" placeholder="关键字" class="layui-input" autocomplete="off" />
+			</div>
+			<div class="layui-input-inline" style="width:150px;">
+				<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+				<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+			</div>
+		</form>
+	</div>
+	<table class="layui-hide" id="document" lay-filter="document"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm" lay-event="add">+ 新建文档</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus','oaPicker'];
+	function gouguInit() {
+		var table = layui.tablePlus, form = layui.form, tool = layui.tool;
+
+		layui.documentTable = table.render({
+			elem: '#document',
+			title: '文档列表',
+			toolbar: '#toolbarDemo',
+			is_excel: true,
+			cellMinWidth: 80,
+			height: 'full-112',
+			url: "/project/document/datalist",
+			cols: [[
+				{
+					field: 'id', title: '文档编号', width: 90, align: 'center', templet: function (d) {
+						return 'D' + d.id;
+					}
+				}
+				, {
+					field: 'title', title: '文档主题',minWidth:240, templet: function (d) {
+						var html = '<a class="side-a" data-href="/project/document/view/id/' + d.id + '">' + d.title + '</a>';
+						return html;
+					}
+				}
+				, { field: 'project', title: '关联项目', width: 240,}
+				, { field: 'admin_name', title: '创建人', align: 'center', width: 80 }
+				, { field: 'create_time', title: '创建时间', align: 'center', width: 150 }
+				,{
+					field: 'right',
+					fixed:'right',
+					title: '操作',
+					width: 120,
+					align: 'center',
+					templet: function (d) {
+						var html = '<div class="layui-btn-group">';
+						var btn1='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详细</span>';
+						var btn2='<span class="layui-btn layui-btn-xs" lay-event="edit">编辑</span>';
+						var btn3='<span class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</span>';
+						return html+btn1+btn2+btn3+'</div>';
+					}						
+				}
+			]]
+		});
+		
+		
+		//触发事件
+		table.on('toolbar(document)', function(obj){
+			if (obj.event === 'add') {
+				tool.side("/project/document/add");
+				return;
+			}
+		});
+		
+		//监听行工具事件
+		table.on('tool(document)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/project/document/view?id="+data.id);
+				return;
+			}
+			if(obj.event === 'edit'){
+				tool.side('/project/document/add?id='+data.id);
+				return;
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要删除吗?', {
+					icon: 3,
+					title: '提示'
+				}, function(index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/project/document/delete", {id: data.id}, callback);
+					layer.close(index);
+				});
+			}
+		});
+	}		
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/project/view/document/view.html b/app/project/view/document/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..918554110f0cbc5535f918682e4044e3cd8eb771
--- /dev/null
+++ b/app/project/view/document/view.html
@@ -0,0 +1,42 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<link rel="stylesheet" href="{__GOUGU__}/third_party/prism/prism.css"/>
+<style>
+.text-detial-ops{line-height: 30px; color:#999; font-size: 12px; padding: 12px 0;}
+.text-detial-ops span{margin-right: 20px;}
+.text-detial-ops a{margin-right:10px;}
+.text-detial-content{padding: 8px 0; color:#333; word-break: break-all; border-top:1px solid #e8e8e8;font-size: 16px!important; line-height: 1.72!important;}
+.text-detial-content p{padding: 8px 0;}
+.text-detial-content img{max-width:98%!important; margin:0 auto; display:block; border: 1px solid #e6e6e6; -webkit-box-shadow: 0 2px 6px rgba(26,26,26,.08); box-shadow: 0 2px 6px rgba(26,26,26,.08); border-radius: 4px;}
+.text-detial-content h1,.text-detial-content h2,.text-detial-content h3,.text-detial-content h4,.text-detial-content h5{margin-top:10px;}
+.text-detial-content a{color:#186AF2; font-style:italic;}
+.text-detial-content a:hover{text-decoration:underline;}
+
+.text-detial-content p code,.blog-detial-content pre{margin:0 3px;font-size: 14px; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; background: #f6f6f6; padding: 10px; border-radius: 2px;}
+.text-detial-content p code{border: 1px solid #eee;padding: 2px 4px;}
+.text-detial-content table {border-collapse: collapse; border-spacing: 0; display: block; width: 100%; overflow: auto;  word-break: normal;word-break: keep-all; margin-top: 0;margin-bottom: 16px;}
+.text-detial-content table tr {background-color: #fff;border-top: 1px solid #ccc;}
+.text-detial-content table tr:nth-child(2n) {background-color: #f8f8f8;}
+.text-detial-content table td, .blog-detial-content table th { padding: 6px 12px;border: 1px solid #ddd; font-size:14px; }
+.text-detial-content table th {font-weight: 800;}
+.text-detial-content li {list-style: initial;margin-left: 20px;}
+:not(pre)>code[class*=language-], pre[class*=language-]{background:#fff!important;border:1px solid #e8e8e8!important; border-radius:3px;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h1>{$detail.title}</h1>
+	<div class="text-detial-ops">
+		<span>{$detail.admin_name}发表于：{$detail.create_time}</span><span>关联项目：{$detail.project_name}</span>
+	</div>
+	<div class="text-detial-content">
+	{$detail.content|raw}
+	</div>
+</div>
+{/block}
+<!-- 脚本 -->
+{block name="script"}
+<script src="{__GOUGU__}/third_party/prism/prism.js"></script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/project/view/index/add.html b/app/project/view/index/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..3aadad2413e74e477aa730ed220878b0753f64d9
--- /dev/null
+++ b/app/project/view/index/add.html
@@ -0,0 +1,236 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">新建项目</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">项目名称<font>*</font></td>
+			<td colspan="3"><input type="text" name="name" lay-verify="required" lay-reqText="请输入项目名称" placeholder="请输入项目名称" class="layui-input" value=""></td>
+			<td class="layui-td-gray">项目类别<font>*</font></td>
+			<td>
+				<select name="cate_id" lay-filter="cate" lay-verify="required" lay-reqText="请选择项目类别">
+					<option value="">请选择</option>
+					{volist name = ":get_base_data('ProjectCate')" id="vo"}
+					<option value="{$vo.id}">{$vo.title}</option>
+					{/volist}
+				</select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">项目经理<font>*</font></td>
+			<td>
+				<input type="text" name="director_name" placeholder="请选择项目经理(负责人)" readonly class="layui-input" value="" lay-verify="required" readonly lay-reqText="请选择项目经理(负责人)">
+				<input type="hidden" name="director_uid" value="0">
+				<input type="hidden" name="did" value="0">
+			</td>
+			<td class="layui-td-gray">归属部门<font>*</font></td>
+			<td><input type="text" name="department" value="" autocomplete="off" readonly class="layui-input"></td>
+			<td class="layui-td-gray">始止日期<span style="color: red">*</span></td>
+			<td><input type="text" name="range_time" class="layui-input tool-time" data-range="到" readonly placeholder="开始 到 结束" lay-verify="required" lay-reqText="请选择计划完成周期"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">项目成员<span style="color: red">*</span></td>
+			<td colspan="5">
+				<input type="text" name="team_admin_names"  placeholder="请选择项目成员" readonly class="layui-input picker-admin" data-type="2" value="" lay-verify="required" lay-reqText="请完善项目成员">
+				<input type="hidden" name="team_admin_ids" class="layui-input" value="">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">关联合同</td>
+			<td colspan="5">
+				<input type="text" class="layui-input picker-oa" data-types="contract" name="contract_name" placeholder="请选择需要关联的合同" readonly value="">		
+				<input type="hidden" class="layui-input" name="contract_id" value="0">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">项目简介</td>
+			<td colspan="5">
+				<textarea name="content" class="layui-textarea"></textarea>
+			</td>
+		</tr>
+		<tr>
+			<td colspan="6" style="background-color:#FAFAFA;">
+				<strong>项目阶段</strong><span style="color: red">*</span>
+				<span class="layui-btn layui-btn-sm" id="stepAdd">+ 添加阶段</span>				
+			</td>
+		</tr>
+		<tr>
+			<td colspan="6">
+				<table id="stepTable" class="layui-table layui-table-min" style="margin:0">
+					<tr>
+						<th width="60">序号</th>
+						<th width="180">阶段名称</th>
+						<th width="80">阶段负责人</th>
+						<th width="180">阶段成员</th>
+						<th width="162">阶段周期</th>
+						<th>阶段说明</th>
+						<th width="120">操作</th>
+					</tr>
+					{volist name = ":get_base_data('step')" id="vo" key="k"}
+					<tr class="step-tr">
+						<td class="step-key">第 <strong>{$k}</strong> 阶段</td>
+						<td><input type="text" name="step_title[]" value="{$vo.title}" class="layui-input" lay-verify="required" lay-reqText="请输入阶段名称"></td>
+						<td>
+							<input type="text" value="" class="layui-input layui-input-readonly picker-admin" lay-verify="required" lay-reqText="请选择阶段负责人" readonly>
+							<input type="hidden" name="step_director_uid[]" value="0" readonly>
+						</td>
+						<td>
+							<input type="text" value="" class="layui-input layui-input-readonly picker-admin" data-type="2">
+							<input type="hidden" name="step_uids[]" value="">
+						</td>
+						<td><input type="text" name="step_cycle_time[]" value="" class="layui-input layui-input-readonly tool-time" data-range="到" lay-verify="required" lay-reqText="请选择阶段周期" readonly></td>
+						<td><input type="text" name="step_remark[]" value="" class="layui-input"></td>
+						<td>
+							<input type="hidden" name="step_id[]" value="0" class="layui-input">
+							<div class="layui-btn-group">
+								<span class="layui-btn layui-btn-xs step-up">上移</span>
+								<span class="layui-btn layui-btn-normal layui-btn-xs step-down">下移</span>
+								<span class="layui-btn layui-btn-danger layui-btn-xs step-del" data-id="0">删除</span>
+							</div>
+						</td>
+					</tr>
+					{/volist}
+				</table>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-3">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool','oaPicker'];
+
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool,oaPicker = layui.oaPicker;
+		//选择项目经理
+		$('body').on('click','[name="director_name"]',function () {
+			var ids=$('[name="director_uid"]').val(),names=$('[name="director_name"]').val();
+			oaPicker.employeeInit({
+				ids:ids,
+				names:names,
+				type:1,
+				callback:function(data){
+					let select_id=[],select_name=[],select_did=[],select_dname=[];
+					for(var a=0; a<data.length;a++){
+						select_id.push(data[a].id);
+						select_name.push(data[a].name);
+						select_did.push(data[a].did);
+						select_dname.push(data[a].department);
+					}
+					$('[name="director_uid"]').val(select_id.join(','));
+					$('[name="director_name"]').val(select_name.join(','));
+					$('[name="did"]').val(select_did.join(','));
+					$('[name="department"]').val(select_dname.join(','));
+				}
+			});
+		});
+		
+		//添加阶段信息表格
+		$('#stepAdd').on('click',function(){
+			var html = '';
+			html += '<tr class="step-tr">\
+						<td class="step-key">第 <strong>0</strong> 阶段</td>\
+						<td><input type="text" name="step_title[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入阶段名称"></td>\
+						<td>\
+							<input type="text" value="" class="layui-input layui-input-readonly picker-admin" lay-verify="required" lay-reqText="请选择阶段负责人" readonly>\
+							<input type="hidden" name="step_director_uid[]" value="0" readonly>\
+						</td>\
+						<td>\
+							<input type="text" value="" class="layui-input layui-input-readonly picker-admin" data-type="2">\
+							<input type="hidden" name="step_uids[]" value="">\
+						</td>\
+						<td><input type="text" name="step_cycle_time[]" value="" class="layui-input layui-input-readonly tool-time" data-range="到" lay-verify="required" lay-reqText="请选择服务周期" readonly></td>\
+						<td><input type="text" name="step_remark[]" value="" class="layui-input"></td>\
+						<td>\
+							<input type="hidden" name="step_id[]" value="0" class="layui-input">\
+							<div class="layui-btn-group">\
+								<span class="layui-btn layui-btn-xs step-up">上移</span>\
+								<span class="layui-btn layui-btn-normal layui-btn-xs step-down">下移</span>\
+								<span class="layui-btn layui-btn-danger layui-btn-xs step-del" data-id="0">删除</span>\
+							</div>\
+						</td>\
+					</tr>';
+			$('#stepTable').append(html).find('.tr-none').remove();
+			$('#stepTable').find('.step-key').each(function(index,item){
+				$(this).html('第 <strong>'+(index+1)+'</strong> 阶段');
+			})
+			form.render();
+		});
+		$('#stepTable').on('click','.step-del',function(){
+			if($('.step-tr').length<2){
+				layer.msg('至少保留一个项目阶段');
+				return false;
+			}
+			$(this).parents('.step-tr').remove();
+			$('#stepTable').find('.step-key').each(function(index,item){
+				$(this).html('第 <strong>'+(index+1)+'</strong> 阶段');
+			})
+		});
+		
+		$('#stepTable').on('click','.step-up',function(e){
+			let obj = $(e.target).closest('tr');
+            tr_pre($(obj[0]));
+		})
+		
+		$('#stepTable').on('click','.step-down',function(e){
+			var obj = $(e.target).closest('tr');
+            tr_next($(obj[0]));
+		})
+		
+		
+		function tr_pre(o) {
+			var pres = o.prevAll('tr.step-tr');
+			if (pres.length > 0) {
+				var tmp = o.clone(true);
+				var oo = pres[0];
+				o.remove();
+				$(oo).before(tmp);
+				$('#stepTable').find('.step-key').each(function(index,item){
+					$(this).html('第 <strong>'+(index+1)+'</strong> 阶段');
+				})
+			}
+			else{
+				layer.msg('已经第一个了');
+			}
+		}
+
+		function tr_next(o) {
+			var nexts = o.nextAll('tr.step-tr');
+			if (nexts.length > 0) {
+				var tmp = o.clone(true);
+				var oo = nexts[0];
+				o.remove();
+				$(oo).after(tmp);
+				$('#stepTable').find('.step-key').each(function(index,item){
+					$(this).html('第 <strong>'+(index+1)+'</strong> 阶段');
+				})
+			}else{
+				layer.msg('已经最后一个了');
+			}
+		}
+		
+		
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/project/index/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/project/view/index/datalist.html b/app/project/view/index/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..9160cdbc8ee3fe1285bf7e4325fe75abb008109d
--- /dev/null
+++ b/app/project/view/index/datalist.html
@@ -0,0 +1,128 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:100px;">
+			<select name="status">
+				<option value="">项目状态</option>
+				<option value="1">未开始</option>
+				<option value="2">进行中</option>
+				<option value="3">已完成</option>
+				<option value="4">已关闭</option>
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:136px;">
+            <select name="cate_id">
+                <option value="">项目类别</option>
+                {volist name = ":get_base_data('ProjectCate')" id="vo"}
+                <option value="{$vo.id}">{$vo.title}</option>
+                {/volist}
+            </select>
+        </div>
+		<div class="layui-input-inline" style="width:160px;">
+			<input type="text" name="director" placeholder="项目负责人，可多选" readonly class="layui-input picker-admin" data-type="2" autocomplete="off" />
+			<input name="director_uid" style="display: none;" value="" />
+		</div>
+		<div class="layui-input-inline" style="width:300px">
+			<input type="text" name="keywords" placeholder="关键字,项目名称/项目描述" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_project" lay-filter="table_project"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm tool-add" type="button" data-href="/project/index/add">+ 添加项目</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const auth = {$auth};
+	const moduleInit = ['tool','tablePlus','oaPicker'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool;
+		
+		layui.pageTable = table.render({
+			elem: "#table_project"
+			, toolbar: "#toolbarDemo"
+			,url: "/project/index/datalist"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 80
+			,height: 'full-112'
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{ field: 'status', title: '项目状态', align: 'center', width: 90, templet: function (d) {
+					var html = '<span class="check-status-color-' + d.status + '">『' + d.status_name + '』</span>';
+					return html;
+					}
+				}
+				,{field:'cate',title: '项目类别',width:100,align:'center'}
+				,{field:'name',title: '项目名称',minWidth:240}
+				,{field:'director_name',title: '负责人',width:80,align:'center'}
+				,{ field:'range_time', title: '项目计划周期', align: 'center', width: 180}
+				,{field:'step',title: '当前阶段及负责人',align: 'center',width: 180}
+				,{field:'tasks_unfinish', align: 'center', style: 'color: #91CC75;', width: 90, 'title': '进行中任务' }
+				,{field:'tasks_finish', align: 'center', style: 'color: #FAC858;', width: 90, 'title': '已完成任务' }
+				,{field:'tasks_pensent', align: 'center', style: 'color: #EE6666;', width: 90, 'title': '任务完成率' }
+				,{field:'admin_name',title: '创建人',width:80,align:'center'}
+				,{field:'create_time', title: '创建时间',width:150,align:'center'}
+				,{width:120,fixed:'right',title: '操作', align:'center',ignoreExport:true,templet: function(d){
+					var html='';
+					var btn1='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详细</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn3='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
+					if(d.status==3){
+						btn2='';
+						btn3='';
+					}
+					if(auth == 1 || d.admin_id == login_admin || d.director_uid == login_admin){
+						return '<div class="layui-btn-group">'+btn1+btn2+btn3+'</div>';
+					}
+					else{
+						return btn1
+					}
+				}}
+			]]
+		});
+			
+		table.on('tool(table_project)',function (obj) {
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = obj.data;
+			if (obj.event === 'view') {
+				tool.side("/project/index/view?id="+data.id);
+				return;
+			}
+			if (obj.event === 'edit') {
+				tool.side("/project/index/add?id="+data.id);
+				return;
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要删除该项目吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/project/index/del", { id: data.id }, callback);
+					layer.close(index);
+				});
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/project/view/index/edit.html b/app/project/view/index/edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..c44fb12ae253fd88fbe494de1a9416e00c027f23
--- /dev/null
+++ b/app/project/view/index/edit.html
@@ -0,0 +1,264 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">编辑项目</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">项目名称<font>*</font></td>
+			<td colspan="3"><input type="text" name="name" lay-verify="required" lay-reqText="请输入项目名称" placeholder="请输入项目名称" class="layui-input" value="{$detail.name}"></td>
+			<td class="layui-td-gray">项目类别<font>*</font></td>
+			<td>
+				<select name="cate_id" lay-verify="required" lay-reqText="请选择项目类别">
+					<option value="">请选择</option>
+					{volist name = ":get_base_data('ProjectCate')" id="vo"}
+					<option value="{$vo.id}" {eq name="$vo.id" value="$detail.cate_id"} selected{/eq}>{$vo.title}</option>
+					{/volist}
+				</select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">项目经理<font>*</font></td>
+			<td>
+				<input type="text" name="director_name" placeholder="请选择项目经理(负责人)" readonly class="layui-input" value="{$detail.director_name}" lay-verify="required" readonly lay-reqText="请选择项目经理(负责人)">
+				<input type="hidden" name="director_uid" value="{$detail.director_uid}">
+				<input type="hidden" name="did" value="{$detail.did}">
+			</td>
+			<td class="layui-td-gray">归属部门<font>*</font></td>
+			<td><input type="text" name="department" value="{$detail.department}" autocomplete="off" readonly class="layui-input"></td>
+			<td class="layui-td-gray">始止日期<span style="color: red">*</span></td>
+			<td><input type="text" name="range_time" value="{$detail.start_time|date='Y-m-d'} 到 {$detail.end_time|date='Y-m-d'}" class="layui-input tool-time" data-range="到" readonly placeholder="开始 到 结束" lay-verify="required" lay-reqText="请选择计划完成周期"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">关联合同</td>
+			<td colspan="5">
+				<input type="text" class="layui-input picker-oa" data-types="contract" name="contract_name" placeholder="请选择需要关联的合同" readonly value="{$detail.contract_name|default=''}">		
+				<input type="hidden" class="layui-input" name="contract_id" value="{$detail.contract_id}">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">项目简介</td>
+			<td colspan="5">
+				<textarea name="content" class="layui-textarea">{$detail.content|default=''}</textarea>
+			</td>
+		</tr>
+		<tr>
+			<td colspan="6" style="background-color:#FAFAFA;"><strong>项目阶段</strong><span style="color: red">*</span> <span class="layui-btn layui-btn-xs" id="stepAdd">+ 添加阶段</span></td>
+		</tr>
+		<tr>
+			<td colspan="6">
+				<table id="stepTable" class="layui-table layui-table-min" style="margin:0">
+					<tr>
+						<th width="60">序号</th>
+						<th width="180">阶段名称</th>
+						<th width="80">阶段负责人</th>
+						<th width="180">阶段成员</th>
+						<th width="162">阶段周期</th>
+						<th>阶段说明</th>
+						<th width="120">操作</th>
+					</tr>
+					{volist name="$detail.step_array" id="vo" key="k"}
+					{egt name="$vo.sort" value="$detail.current_step"}
+					<tr class="step-tr">
+						<td class="step-key">第 <strong>{$k}</strong> 阶段</td>
+						<td><input type="text" name="step_title[]" value="{$vo.title}" class="layui-input" lay-verify="required" lay-reqText="请输入阶段名称"></td>
+						<td>
+							<input type="text" value="{$vo.director_name}" class="layui-input layui-input-readonly picker-admin" lay-verify="required" lay-reqText="请选择阶段负责人" readonly>
+							<input type="hidden" name="step_director_uid[]" value="{$vo.director_uid}" readonly>
+						</td>
+						<td>
+							<input type="text" value="{$vo.unames}" class="layui-input layui-input-readonly picker-admin" data-type="2">
+							<input type="hidden" name="step_uids[]" value="{$vo.uids}">
+						</td>
+						<td><input type="text" name="step_cycle_time[]" value="{$vo.start_time|date='Y-m-d'} 到 {$vo.end_time|date='Y-m-d'}" class="layui-input layui-input-readonly tool-time" data-range="到" lay-verify="required" lay-reqText="请选择阶段周期" readonly></td>
+						<td><input type="text" name="step_remark[]" value="{$vo.remark|default=''}" class="layui-input"></td>
+						<td>
+							<input type="hidden" name="step_id[]" value="{$vo.id}" class="layui-input">
+							<div class="layui-btn-group">
+								<span class="layui-btn layui-btn-xs step-up">上移</span>
+								<span class="layui-btn layui-btn-normal layui-btn-xs step-down">下移</span>
+								<span class="layui-btn layui-btn-danger layui-btn-xs step-del" data-id="{$vo.id}">删除</span>
+							</div>
+						</td>
+					</tr>
+					{else/}
+					<tr>
+						<td class="step-key">第 <strong>{$k}</strong> 阶段</td>
+						<td><input type="text" name="step_title[]" value="{$vo.title}" class="layui-input layui-input-readonly" readonly lay-verify="required" lay-reqText="请输入阶段名称"></td>
+						<td>
+							<input type="text" value="{$vo.director_name}" class="layui-input layui-input-readonly" lay-verify="required" lay-reqText="请选择阶段负责人" readonly>
+							<input type="hidden" name="step_director_uid[]" value="{$vo.director_uid}" readonly>
+						</td>
+						<td>
+							<input type="text" value="{$vo.unames}" class="layui-input layui-input-readonly" data-type="2">
+							<input type="hidden" name="step_uids[]" value="{$vo.uids}">
+						</td>
+						<td><input type="text" name="step_cycle_time[]" value="{$vo.start_time|date='Y-m-d'} 到 {$vo.end_time|date='Y-m-d'}" class="layui-input layui-input-readonly" data-range="到" lay-verify="required" lay-reqText="请选择阶段周期" readonly></td>
+						<td><input type="text" name="step_remark[]" value="{$vo.remark|default=''}" readonly class="layui-input layui-input-readonly"></td>
+						<td>
+							<input type="hidden" name="step_id[]" value="{$vo.id}" class="layui-input">
+							-
+						</td>
+					</tr>
+					{/egt}
+					{/volist}
+				</table>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-3">
+		<input type="hidden" name="id" value="{$detail.id|default=0}"/>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool','oaPicker'];
+
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool,oaPicker = layui.oaPicker;
+		//选择项目经理
+		$('body').on('click','[name="director_name"]',function () {
+			var ids=$('[name="director_uid"]').val(),names=$('[name="director_name"]').val();
+			oaPicker.employeeInit({
+				ids:ids,
+				names:names,
+				type:1,
+				callback:function(data){
+					let select_id=[],select_name=[],select_did=[],select_dname=[];
+					for(var a=0; a<data.length;a++){
+						select_id.push(data[a].id);
+						select_name.push(data[a].name);
+						select_did.push(data[a].did);
+						select_dname.push(data[a].department);
+					}
+					$('[name="director_uid"]').val(select_id.join(','));
+					$('[name="director_name"]').val(select_name.join(','));
+					$('[name="did"]').val(select_did.join(','));
+					$('[name="department"]').val(select_dname.join(','));
+				}
+			});
+		});	
+		//添加阶段信息表格
+		$('#stepAdd').on('click',function(){
+			var html = '';
+			html += '<tr class="step-tr">\
+						<td class="step-key">第 <strong>0</strong> 阶段</td>\
+						<td><input type="text" name="step_title[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入阶段名称"></td>\
+						<td>\
+							<input type="text" value="" class="layui-input layui-input-readonly picker-admin" lay-verify="required" lay-reqText="请选择阶段负责人" readonly>\
+							<input type="hidden" name="step_director_uid[]" value="0" readonly>\
+						</td>\
+						<td>\
+							<input type="text" value="" class="layui-input layui-input-readonly picker-admin" data-type="2">\
+							<input type="hidden" name="step_uids[]" value="">\
+						</td>\
+						<td><input type="text" name="step_cycle_time[]" value="" class="layui-input layui-input-readonly tool-time" data-range="到" lay-verify="required" lay-reqText="请选择服务周期" readonly></td>\
+						<td><input type="text" name="step_remark[]" value="" class="layui-input"></td>\
+						<td>\
+							<input type="hidden" name="step_id[]" value="0" class="layui-input">\
+							<div class="layui-btn-group">\
+								<span class="layui-btn layui-btn-xs step-up">上移</span>\
+								<span class="layui-btn layui-btn-normal layui-btn-xs step-down">下移</span>\
+								<span class="layui-btn layui-btn-danger layui-btn-xs step-del" data-id="0">删除</span>\
+							</div>\
+						</td>\
+					</tr>';
+			$('#stepTable').append(html).find('.tr-none').remove();
+			$('#stepTable').find('.step-key').each(function(index,item){
+				$(this).html('第 <strong>'+(index+1)+'</strong> 阶段');
+			})
+			form.render();
+		});
+		$('#stepTable').on('click','.layui-btn-danger',function(){
+			if($('.step-tr').length<2){
+				layer.msg('至少保留一个项目阶段');
+				return false;
+			}
+			let that=$(this);
+			let id = that.data('id');
+			if(id==0){
+				that.parents('.step-tr').remove();
+				$('#stepTable').find('.step-key').each(function(index,item){
+					$(this).html('第 <strong>'+(index+1)+'</strong> 阶段');
+				})
+			}
+			else{
+				layer.confirm('确定要删除该项目阶段吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							that.parents('.step-tr').remove();
+							$('#stepTable').find('.step-key').each(function(index,item){
+								$(this).html('第 <strong>'+(index+1)+'</strong> 阶段');
+							})
+						}
+					}
+					tool.delete("/project/api/step_del", { id: id }, callback);
+					layer.close(index);
+				});
+			}
+		});
+		
+		$('#stepTable').on('click','.step-up',function(e){
+			let obj = $(e.target).closest('tr');
+            tr_pre($(obj[0]));
+		})
+		
+		$('#stepTable').on('click','.step-down',function(e){
+			var obj = $(e.target).closest('tr');
+            tr_next($(obj[0]));
+		})
+		
+		
+		function tr_pre(o) {
+			var pres = o.prevAll('tr.step-tr');
+			if (pres.length > 0) {
+				var tmp = o.clone(true);
+				var oo = pres[0];
+				o.remove();
+				$(oo).before(tmp);
+				$('#stepTable').find('.step-key').each(function(index,item){
+					$(this).html('第 <strong>'+(index+1)+'</strong> 阶段');
+				})
+			}
+			else{
+				layer.msg('已经第一个了');
+			}
+		}
+
+		function tr_next(o) {
+			var nexts = o.nextAll('tr.step-tr');
+			if (nexts.length > 0) {
+				var tmp = o.clone(true);
+				var oo = nexts[0];
+				o.remove();
+				$(oo).after(tmp);
+				$('#stepTable').find('.step-key').each(function(index,item){
+					$(this).html('第 <strong>'+(index+1)+'</strong> 阶段');
+				})
+			}else{
+				layer.msg('已经最后一个了');
+			}
+		}
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/project/index/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/project/view/index/view.html b/app/project/view/index/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..2e83a48c57fa1b5462c4d033fceccd0d3f22273c
--- /dev/null
+++ b/app/project/view/index/view.html
@@ -0,0 +1,552 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+.layui-tab-title .layui-this{background-color:#fff;}
+.layui-tab-card,.layui-card{box-shadow:0 0 0 0 rgb(0 0 0 / 10%); border-radius:0;}
+.layui-card-tips {color: #969696;}
+.layui-card-value {padding: 4px 0 16px;font-size: 18px;color: #1E9FFF;}
+.layui-tab-title .layui-this:after{z-index:1}
+
+.check-items{overflow-x: auto; padding: 2px 0;}
+
+.check-item .check-item-icon strong{margin-right:3px; font-size:36px;}
+.check-item strong.blue,.check-item strong.gray{display:none;}
+.check-item.blue strong.black,.check-item.gray strong.black{display:none;}
+.check-item.blue strong.blue{display:block;}
+.check-item.gray strong.gray{display:block;}
+
+.flow-flex-row {box-direction: row;
+	box-orient: horizontal;
+    -webkit-box-orient: horizontal;
+    -ms-flex-direction: row;
+    flex-direction: row;
+}
+.flow-flexbox { width: 100%;text-align: left;
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    display: -webkit-flex;
+    box-align: center;
+    -webkit-box-align: center;
+    -ms-flex-align: center;
+    align-items: center;
+	flex-wrap: wrap;
+}
+.check-item{width: auto; -ms-flex-negative: 0; flex-shrink: 0; padding:8px 0;}
+.check-item i{font-size:20px; margin-right:3px;}
+.layui-icon[data-ok]{color:#34a853}
+.layui-icon[data-no]{color:#FF5722;}
+.layui-icon[data-on]{color:#4285f4;}
+.check-item-time{color:#969696; font-size:12px; margin-left:3px;}
+.check-item .layui-icon.layui-icon-right{font-size:20px;}
+.check-item:last-child .layui-icon-right{display:none;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<h2 class="pb-3">
+		<span class="font20">{$detail.name}</span> 
+		{gt name="$role" value="0"}
+			{eq name="$detail.status" value="4"}
+			<span class="layui-btn layui-btn-xs" data-event="open">开启</span>
+			{else/}
+			<span class="layui-btn layui-btn-danger layui-btn-xs" data-event="close">关闭</span>
+			{/eq}
+		{/gt}
+	</h2>
+	<div>
+		<span class="layui-badge layui-bg-gray">#T{$detail.id}</span>
+		<span class="mx-2">{$detail.admin_name}</span>
+		<span class="gray">创建于{$detail.create_time}<span>{gt name="$detail.update_time" value="0"}，最近更新于 {$detail.update_time}{/gt}</span></span>
+	</div>
+	<div class="body-table layui-tab layui-tab-brief" lay-filter="project" id="projectTab">
+		<ul class="layui-tab-title border-t border-x bg-white" style="border-bottom:0;">
+			<li class="layui-this" data-load="true">项目概览</li>
+			<li data-load="">项目任务</li>
+			<li data-load="">工作记录</li>
+			<li data-load="">项目文档</li>
+			<li data-load="">项目人员</li>
+			<li data-load="">项目动态</li>
+			<li data-load="">项目评论</li>
+		</ul>
+		<div class="layui-tab-content" style="padding:0">
+			<div class="layui-tab-item layui-show">
+				{include file="/index/view_overview" /}
+			</div>
+			
+			<div class="layui-tab-item">
+				{include file="/index/view_task" /}				
+			</div>
+			
+			<div class="layui-tab-item">
+				{include file="/index/view_schedule" /}				
+			</div>
+			
+			<div class="layui-tab-item">
+				{include file="/index/view_document" /}				
+			</div>
+			
+			<div class="layui-tab-item">
+				{include file="/index/view_user" /}		
+			</div>
+			
+			<div class="layui-tab-item">
+				{include file="/index/view_log" /}
+			</div>
+			
+			<div class="layui-tab-item">
+				{include file="/index/view_comment" /}
+			</div>
+		</div>
+	</div>
+</div>
+{/block}
+<!-- /主体 -->
+<!-- 脚本 -->
+{block name="script"}
+<script src="{__GOUGU__}/third_party/echart/echarts.min.js"></script>
+<script>
+	const project_id = '{$detail.id}';
+	const project_start_time = "{$detail.start_time|date='Y-m-d'}";
+	var chartProgress = document.getElementById('progress');
+	var progressChart = echarts.init(chartProgress);
+	var optionA;
+	optionA = {
+		backgroundColor: "#ffffff",
+		title: {
+			text: '67.45%',//主标题文本
+			subtext: '任务完成率',//副标题文本
+			x: 'center',
+			y: '39%',
+			textStyle: {
+				fontWeight: 'normal',
+				fontSize: 18,
+				color: '#FF974C',
+				align: 'center'
+			},
+			subtextStyle: {
+				fontSize: 12,
+				color: '#6c7a89',
+			}
+		},
+		tooltip: {
+			trigger: "item",
+			formatter: '{b}：<br/><strong>{c}</strong>',
+			show: true,
+		},
+		series: [
+			{
+				type: 'pie',
+				radius: ['60%', '80%'],
+				center: ['50%', '50%'],
+				avoidLabelOverlap: false,
+				label: {
+					show: false
+				},
+				data: [
+					{ value: 1048, name: '待处理' },
+					{ value: 735, name: '已完成' }
+				]
+			}
+		]
+	};
+
+	var chartDelay = document.getElementById('delay');
+	var delayChart = echarts.init(chartDelay);
+	var optionB;
+	optionB = {
+		backgroundColor: "#ffffff",
+		title: {
+			text: '40.25%',//主标题文本
+			subtext: '任务延迟率',//副标题文本
+			x: 'center',
+			y: '39%',
+			textStyle: {
+				fontWeight: 'normal',
+				fontSize: 18,
+				color: '#FF974C',
+				align: 'center',
+				marginLeft: '-10px'
+			},
+			subtextStyle: {
+				fontSize: 12,
+				color: '#6c7a89',
+			}
+		},
+		tooltip: {
+			trigger: "item",
+			formatter: '{b}：<br/><strong>{c}</strong>',
+			show: true,
+		},
+		series: [
+			{
+				type: 'pie',
+				radius: ['60%', '80%'],
+				center: ['50%', '50%'],
+				avoidLabelOverlap: false,
+				label: {
+					show: false
+				},
+				data: [{
+					value: 1048,
+					name: '延迟',
+					itemStyle: {
+						color: "#ED6666",
+					}
+				},
+				{
+					value: 735,
+					name: '未延迟',
+					itemStyle: {
+						color: "#91CC75",
+					}
+				}
+				]
+			}
+		]
+	};
+
+
+	var chartCross = document.getElementById('cross');
+	var crossChart = echarts.init(chartCross);
+	var optionD;
+	optionD = {
+		backgroundColor: "#ffffff",
+		color: ['#8C92A4', '#2C7EF8'],
+		tooltip: {
+			trigger: 'axis',
+			axisPointer: {
+				type: 'cross',
+				label: {
+					backgroundColor: '#6a7985'
+				}
+			}
+		},
+		legend: {
+			data: ['任务计划剩余', '任务实际剩余']
+		},
+		grid: {
+			top: 36,
+			left: 8,
+			right: 36,
+			bottom: 0,
+			containLabel: true
+		},
+		xAxis: [
+			{
+				type: 'category',
+				boundaryGap: false,
+				splitLine: {
+					show: true,
+					lineStyle: {
+						type: 'dashed'
+					}
+				}
+			}
+		],
+		yAxis: [{
+			axisLine: {
+				show: true
+			},
+			boundaryGap: false,
+			splitLine: {
+				show: true,
+				lineStyle: {
+					type: 'dashed'
+				}
+			},
+			type: 'value'
+		}
+		]
+	};
+
+
+	var chartPlan = document.getElementById('plan');
+	var planChart = echarts.init(chartPlan);
+	var optionE;
+
+	optionE = {
+		backgroundColor: "#ffffff",
+		title: {
+			top: 0,
+			left: 0,
+			text: ''
+		},
+		tooltip: {
+			padding: 6,
+			formatter: function (obj) {
+				var value = obj.value;
+				var tips = '<div style="font-size: 12px;">' + value[0] + '<br>';
+				tips += '共 ' + value[1] + ' 个工作任务';
+				tips += '</div>';
+				return tips;
+			}
+		},
+		visualMap: {
+			min: 0,
+			max: 10,
+			show: false,
+			inRange: {
+				color: ['#fafafa', '#20BF3F']
+			}
+		},
+		calendar: {
+			top: 24,
+			left: 36,
+			right: 4,
+			cellSize: ['auto', 16],
+			range: ['2022-03-01', '2022-08-01'],
+			splitLine: {
+				lineStyle: {
+					color: '#333',
+					type: 'dashed',
+				}
+			},
+			itemStyle: {
+				borderWidth: 0.5
+			},
+			yearLabel: { show: false },
+			monthLabel: {
+				nameMap: 'cn',
+				fontSize: 12
+			},
+			dayLabel: {
+				show: true,
+				formatter: '{start}  1st',
+				fontWeight: 'lighter',
+				nameMap: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
+				fontSize: 12
+			}
+		},
+		series: {
+			type: 'heatmap',
+			coordinateSystem: 'calendar',
+			data: []
+		}
+	};
+
+
+	var chartWork = document.getElementById('work');
+	var workChart = echarts.init(chartWork);
+	var optionF;
+
+	optionF = {
+		backgroundColor: "#ffffff",
+		title: {
+			top: 0,
+			left: 0,
+			text: ''
+		},
+		tooltip: {
+			padding: 6,
+			formatter: function (obj) {
+				var value = obj.value;
+				var tips = '<div style="font-size: 12px;">' + value[0] + '<br>';
+				tips += '共 ' + value[1] + ' 个工时';
+				tips += '</div>';
+				return tips;
+			}
+		},
+		visualMap: {
+			min: 0,
+			max: 10,
+			show: false,
+			inRange: {
+				color: ['#fafafa', '#359AEF']
+			}
+		},
+		calendar: {
+			top: 24,
+			left: 36,
+			right: 4,
+			cellSize: ['auto', 16],
+			range: ['2022-03-01', '2022-08-01'],
+			splitLine: {
+				lineStyle: {
+					color: '#333',
+					type: 'dashed',
+				}
+			},
+			itemStyle: {
+				borderWidth: 0.5
+			},
+			yearLabel: { show: false },
+			monthLabel: {
+				nameMap: 'cn',
+				fontSize: 12
+			},
+			dayLabel: {
+				show: true,
+				formatter: '{start}  1st',
+				fontWeight: 'lighter',
+				nameMap: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
+				fontSize: 12
+			}
+		},
+		series: {
+			type: 'heatmap',
+			coordinateSystem: 'calendar',
+			data: []
+		}
+	};
+
+
+	function getCalendarData(arr) {
+		var rangeArray = [];
+		for (var property in arr) {
+			rangeArray.push(property);
+		}
+		var rangeArray = [rangeArray[0], rangeArray[rangeArray.length - 1]];
+		var start = +echarts.number.parseDate(rangeArray[0]);
+		var end = +echarts.number.parseDate(rangeArray[1]);
+		if (start + 7776000000 > end) {
+			end = start + 8640000000;
+			rangeArray[1] = echarts.format.formatTime('yyyy-MM-dd', end);
+		}
+		var dayTime = 3600 * 24 * 1000;
+		var data = [];
+		for (var time = start; time < end; time += dayTime) {
+			var this_date = echarts.format.formatTime('yyyy-MM-dd', time);
+			if (arr[this_date]) {
+				data.push([this_date, arr[this_date]]);
+			} else {
+				data.push([this_date, 0]);
+			}
+		}
+		var res = { 'range': rangeArray, 'data': data };
+		return res;
+	}
+
+	//燃尽图统计
+	function cross_count(arr, arr2) {
+		var planArray = [], doArray = [];
+		var today = new Date();
+		var todayStr = today.getFullYear() + '-' + (today.getMonth() + 1) + '-' + today.getDate();
+		for (var a in arr) {
+			planArray.push(a);
+		}
+		var rangeArray = [planArray[0], planArray[planArray.length - 1]];
+		if (arr2 instanceof Array == false) {
+			for (var b in arr2) {
+				doArray.push(b);
+			}
+			if ((+echarts.number.parseDate(doArray[doArray.length - 1])) < (+echarts.number.parseDate(todayStr))) {
+				doArray.push(todayStr);
+			}
+			if ((+echarts.number.parseDate(planArray[planArray.length - 1])) < (+echarts.number.parseDate(doArray[doArray.length - 1]))) {
+				rangeArray[1] = doArray[doArray.length - 1];
+			}
+		}
+		var start = +echarts.number.parseDate(rangeArray[0]);
+		var end = +echarts.number.parseDate(rangeArray[1]);
+		var todayInt = +echarts.number.parseDate(todayStr);
+		var dayTime = 3600 * 24 * 1000;
+		var xArray = [], yArray = [], yArray2 = [], done = 0, doneArray = [];
+		for (var time = start; time <= end; time += dayTime) {
+			var this_date = echarts.format.formatTime('yyyy-MM-dd', time);
+			xArray.push(this_date);
+			var plan = cross_recursion(time, end, arr);
+			yArray.push(plan);
+
+			if (arr2[this_date]) {
+				done += arr2[this_date];
+			}
+			if (time <= todayInt) {
+				doneArray.push(done);
+			}
+		}
+		for (var i = 0; i < doneArray.length; i++) {
+			yArray2.push(yArray[0] - doneArray[i]);
+		}
+		var start_time = +echarts.number.parseDate(project_start_time), tem_x_array = [], tem_y_array = [];
+		if (start_time < start) {
+			for (var tem_time = start_time; tem_time < start; tem_time += dayTime) {
+				var this_date = echarts.format.formatTime('yyyy-MM-dd', tem_time);
+				tem_x_array.push(this_date);
+				tem_y_array.push(yArray[0]);
+			}
+			xArray = tem_x_array.concat(xArray);
+			yArray = tem_y_array.concat(yArray);
+			yArray2 = tem_y_array.concat(yArray2);
+		}
+		return { 'x': xArray, 'y': yArray, 'y2': yArray2 };
+	}
+
+	function cross_recursion(start, end, arr) {
+		var count = 0;
+		var dayTime = 3600 * 24 * 1000;
+		for (var time = start; time <= end; time += dayTime) {
+			var this_date = echarts.format.formatTime('yyyy-MM-dd', time);
+			if (arr[this_date]) {
+				count += arr[this_date];
+			}
+		}
+		return count;
+	}
+	
+	//
+	const moduleInit = ['tool','oaPicker','uploadPlus','tablePlus','oaComment','oaSchedule','oaEdit'];
+
+	function gouguInit() {
+		var tool = layui.tool,element = layui.element,comment = layui.oaComment;
+		
+		comment.init({
+			"box":'commentBox',//容器id
+			"input": 'commentInput',
+			"topic_id":project_id,
+			"module": 'project',
+		});
+		
+		$('body').on('click','[data-event="close"]',function(){
+			tool.ask('确定要关闭该项目？',function(){
+				let callback = function (e) {
+					layer.msg(e.msg);
+					if(e.code==0){
+						parent.layui.pageTable.reload();
+						setTimeout(function(){
+							location.reload();
+						},2000)
+					}
+				}
+				tool.post("/project/api/close", { 'id': project_id}, callback);
+			})
+		})
+		$('body').on('click','[data-event="open"]',function(){
+			tool.ask('确定要开启该项目？',function(){
+				let callback = function (e) {
+					layer.msg(e.msg);
+					if(e.code==0){
+						parent.layui.pageTable.reload();
+						setTimeout(function(){
+							location.reload();
+						},2000)
+					}
+				}
+				tool.post("/project/api/open", { 'id': project_id}, callback);
+			})
+		})
+		
+		overview();		
+		element.on('tab(project)', function(data){
+			let index = data.index;
+			if(index == 1){
+				project_task();	
+			}
+			else if(index == 2){
+				project_schedule();	
+			}
+			else if(index == 3){
+				project_document();	
+			}
+			else if(index == 4){
+				project_user();	
+			}
+			else if(index == 5){
+				project_log();	
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/project/view/index/view_comment.html b/app/project/view/index/view_comment.html
new file mode 100644
index 0000000000000000000000000000000000000000..05a7986ef2becedc2804ea57f0b6c068d3428207
--- /dev/null
+++ b/app/project/view/index/view_comment.html
@@ -0,0 +1,6 @@
+<div class="px-3 pt-3 border bg-white">
+	<div class="comment-input">
+		<input type="text" id="commentInput" readonly placeholder="发表一下你的看法" class="layui-input" value="">
+	</div>
+	<div id="commentBox" class="pt-3"></div>
+</div>
\ No newline at end of file
diff --git a/app/project/view/index/view_document.html b/app/project/view/index/view_document.html
new file mode 100644
index 0000000000000000000000000000000000000000..9772c61b0a3e7b3af273fb3beb76133468130c2a
--- /dev/null
+++ b/app/project/view/index/view_document.html
@@ -0,0 +1,86 @@
+<div class="bg-white">
+	<table class="layui-hide" id="document" lay-filter="document"></table>
+</div>
+<script type="text/html" id="toolbardocument">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm" lay-event="add">+ 新建文档</button>
+  </div>
+</script>
+<script>
+function project_document(){
+	if($('#projectTab').find('li').eq(3).data('load') =='true'){
+		return false;
+	}
+	$('#projectTab').find('li').eq(3).data('load','true');
+	let tool = layui.tool, table = layui.tablePlus;
+	//项目任务
+	parent.layui.documentTable = table.render({
+		elem: '#document',
+		title: '文档列表',
+		toolbar: '#toolbardocument',
+		cellMinWidth:80,
+		url: "/project/document/datalist",
+		where:{'project_id':project_id},
+		page: true, //开启分页
+		limit: 20,
+		cols:  [[
+			{field: 'id', title: '文档编号', width: 80, align: 'center', templet: function (d) {
+					return 'D' + d.id;
+				}
+			}
+			,{field: 'title', title: '文档主题'}
+			,{field:'admin_name',title: '创建人', align:'center',width: 80}			
+			,{field:'create_time',title: '创建时间', align:'center', width: 150}
+			,{
+				field: 'right',
+				fixed:'right',
+				title: '操作',
+				width: 120,
+				align: 'center',
+				templet: function (d) {
+					var html = '<div class="layui-btn-group">';
+					var btn1='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详细</a>'
+					var btn2='<span class="layui-btn layui-btn-xs" lay-event="edit">编辑</span>';
+					var btn3='<span class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</span>';
+					return html+btn1+btn2+btn3+'</div>';
+				}						
+			}
+		]]
+	});
+	
+	//触发事件
+	table.on('toolbar(document)', function(obj){
+		if (obj.event === 'add') {
+			tool.side('/project/document/add?project_id='+project_id);
+			return;
+		}
+	});
+	
+	table.on('tool(document)', function(obj){
+		var data = obj.data; //获得当前行数据		
+		if(obj.event === 'view'){ //查看
+			let url = '/project/document/view/id/'+data.id;
+			tool.side(url);
+		}
+		if(obj.event === 'edit'){
+			tool.side('/project/document/add?id='+data.id);
+			return;
+		}
+		if (obj.event === 'del') {
+			layer.confirm('确定要删除吗?', {
+				icon: 3,
+				title: '提示'
+			}, function(index) {
+				let callback = function (e) {
+					layer.msg(e.msg);
+					if (e.code == 0) {
+						obj.del();
+					}
+				}
+				tool.delete("/project/document/delete", {id: data.id}, callback);
+				layer.close(index);
+			});
+		}
+	})
+}
+</script>
\ No newline at end of file
diff --git a/app/project/view/index/view_log.html b/app/project/view/index/view_log.html
new file mode 100644
index 0000000000000000000000000000000000000000..18eacc36f90317f43f3b8414bdea2d7b9e798a6e
--- /dev/null
+++ b/app/project/view/index/view_log.html
@@ -0,0 +1,9 @@
+<div class="border">
+	<div id="logList" class="log-timeline p-3"></div>
+</div>
+<script>	
+function project_log(){
+	let oaEdit = layui.oaEdit;	
+	oaEdit.log('logList','Project',project_id);
+}
+</script>
\ No newline at end of file
diff --git a/app/project/view/index/view_overview.html b/app/project/view/index/view_overview.html
new file mode 100644
index 0000000000000000000000000000000000000000..98204f9adb20c9c7d6704a04ee5b9feb8a9769e0
--- /dev/null
+++ b/app/project/view/index/view_overview.html
@@ -0,0 +1,419 @@
+<table class="layui-table layui-table-form">
+	<tr>
+		<td class="layui-td-gray">项目状态</td>
+		<td><span class="check-status-color-{$detail.status}">『{$detail.status_name}』</span></td>
+		<td class="layui-td-gray">项目类别</td>
+		<td>{$detail.cate}</td>
+		<td class="layui-td-gray">始止日期</td>
+		<td>{$detail.start_time|date='Y-m-d'} 到 {$detail.end_time|date='Y-m-d'}</td>
+		<td class="layui-td-gray">所属部门</td>
+		<td>{$detail.department|default='-'}</td>
+	</tr>
+	<tr>
+		<td class="layui-td-gray">项目经理</td>
+		<td>{$detail.director_name}</td>
+		<td class="layui-td-gray">项目成员</td>
+		<td colspan="5">{$detail.team_admin_names|default='-'}</td>
+	</tr>
+	{gt name="$detail.contract_id" value="0"}
+	<tr>
+		<td class="layui-td-gray">关联合同</td>
+		<td colspan="7">{$detail.contract_name}</td>
+	</tr>
+	{/gt}
+	{notempty name="$detail.content"}
+	<tr>
+		<td class="layui-td-gray">项目简介</td>
+		<td colspan="7">{$detail.content}</td>
+	</tr>
+	{/notempty}
+</table>
+
+<div class="layui-card border" style="margin-top:16px;">
+	<div class="layui-card-header" style="height:43px;">
+		<div class="layui-row">
+			<div class="layui-col-md6">
+				<strong>项目阶段</strong>
+			</div>
+		</div>
+	</div>
+	<div class="px-3 py-1 border-b">
+		<div class="flow-flexbox check-items flow-flex-row">
+			{volist name="$detail.step_array" id="vo"}
+			<div class='flow-flexbox flow-flex-row check-item {eq name="$vo.is_current" value="1"} blue{/eq} {notempty name="$step"}{lt name="$vo.sort" value="$step.sort"} gray{/lt}{else/} gray{/notempty}'>
+				<div class="check-item-icon">
+					<strong class="iconfont icon-bianji blue"></strong>
+					<strong class="iconfont icon-kaoheguanli gray"></strong>
+					<strong class="iconfont icon-genjinjilu black"></strong>
+				</div>
+				<div>
+					<div class="check-item-name"><strong class="f16">{$vo.title}</strong> {$vo.director_name|default=''}</div>
+					<div class="check-item-time">{$vo.start_time|date='Y-m-d'} 到 {$vo.end_time|date='Y-m-d'}</div>
+				</div>
+				<div class="layui-icon layui-icon-right"></div>
+			</div>
+			{/volist}
+		</div>
+	</div>
+	{notempty name="$step"}
+	<div class="p-3 border-b">
+		<div>
+			<span class="gray">当前阶段：</span>{$step.title}
+			<span class="gray" style="margin-left:20px">阶段周期：</span>{$step.start_time|date='Y-m-d'} 到 {$step.end_time|date='Y-m-d'}
+			<span class="gray" style="margin-left:20px">负责人：</span>{$step.director_name}
+			{eq name="$step.director_uid" value="$login_admin.id"}
+			<span class="layui-btn layui-btn-normal layui-btn-xs" data-event="step" data-check="1">确认完成</span>
+			<span class="layui-btn layui-btn-danger layui-btn-xs" data-event="step" data-check="2">退回上一阶段</span>
+			{/eq}
+		</div>
+		{notempty name="$step.unames"}
+		<div class="pt-2">
+			<span class="gray">阶段成员：</span>{$step.unames|default=''}
+		</div>
+		{/notempty}
+		{notempty name="$step.remark"}
+		<div class="pt-2">
+			<span class="gray">阶段说明：</span>{$step.remark|default=''}
+		</div>
+		{/notempty}
+	</div>
+	{/notempty}
+	<div class="p-3">
+		<p><strong>阶段流转记录</strong></p>
+		{notempty name="$step_record"}
+			<ul class="layui-timeline pt-2">
+			{volist name="$step_record" id="vo"}		
+				<li class="layui-timeline-item delete_{$vo.delete_time}">
+					<i class="layui-icon layui-timeline-axis">&#xe63f;</i>
+					{if ($vo.status == 1)}
+					<p style="padding-left:24px">{$vo.check_time_str}<span class="black mx-1">{$vo.check_name}</span><span class="mr-1 green">{$vo.status_str}</span>了『{$vo.title}』的工作。操作意见：<span class="green">{$vo.content|default='-'}</span></p>
+					{else /}
+					<p style="padding-left:24px">{$vo.check_time_str}<span class="black mx-1">{$vo.check_name}</span>在阶段『{$vo.title}』执行了<span class="mx-1 red">{$vo.status_str}</span>操作。操作意见：<span class="red">{$vo.content|default='-'}</span></p>
+					{/if}					
+				</li>
+			{/volist}
+			</ul>
+		{else/}
+		<div class="layui-data-none">暂无阶段流转记录</div>
+		{/notempty}
+	</div>
+</div>
+
+<div class="layui-card border">
+	<div class="layui-card-header" style="height:45px;">
+		<strong>项目附件</strong>
+		<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn">上传附件</button>
+	</div>
+	<div class="layui-row p-2" id="uploadBox">
+		{volist name="file_array" id="vo"}
+			<div class="layui-col-md4" id="fileItem{$vo.id}">{:file_card($vo)}</div>
+		{/volist}
+		{empty name="$file_array" }
+		<div class="layui-data-none">暂无项目附件</div>
+		{/empty}
+	</div>
+</div>
+
+<div class="layui-row mb-4 border">
+	<div class="layui-col-xs6 layui-col-md3">
+		<div class="layui-card">
+			<div class="layui-card-header">
+				<strong>项目概况</strong>
+			</div>
+			<div class="p-3">
+				<dl>
+					<dt>任务 <span class="gray">(已完成/全部)</span></dt>
+					<dd class="layui-card-value" title="已完成/总任务">{$detail.tasks_finish} / {$detail.tasks}</dd>
+				</dl>
+			</div>
+			<div class="pt-2 px-3">
+				<dl>
+					<dt>项目工时 <span class="gray">(实际/计划)</span></dt>
+					<dd class="layui-card-value" title="实际工时/计划工时">{$detail.hours} / {$detail.plan_hours}</dd>
+				</dl>
+			</div>
+			<div class="pt-2 px-3">
+				<dl>
+					<dt>工作记录</dt>
+					<dd class="layui-card-value" title="工作记录数">{$detail.schedules}</dd>
+				</dl>
+			</div>
+		</div>
+	</div>
+	<div class="layui-col-xs6 layui-col-md9">
+		<div class="layui-card border-l">
+			<div class="layui-card-header">
+				<strong>项目进度</strong>
+			</div>
+			<div class="layui-card-body">
+				<div class="layui-row">
+					<div class="layui-col-md6">
+						<div id="progress" class="gougu-data-none" style="width:100%; height:200px;"></div>
+					</div>
+					<div class="layui-col-md6">
+						<div id="delay" class="gougu-data-none" style="width:100%; height:200px;"></div>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+
+<div class="layui-card border">
+	<div class="layui-card-header">
+		<strong>项目燃尽图</strong>
+	</div>
+	<div class="layui-card-body">
+		<div id="cross" class="gougu-data-none" style="width:100%; height:360px;"
+			data-tips="任务数：{$detail.tasks}，已完成：{$detail.tasks_finish}，未完成：{$detail.tasks_unfinish}">
+		</div>
+	</div>
+</div>
+
+<div class="layui-row border">
+	<div class="layui-col-xs6 layui-col-md6">
+		<div class="layui-card  border-r">
+			<div class="layui-card-header">
+				<strong>任务分配情况</strong>
+			</div>
+			<div class="layui-card-body">
+				<div id="plan" class="gougu-data-none" style="width:100%; height:150px;"></div>
+			</div>
+		</div>
+	</div>
+	<div class="layui-col-xs6 layui-col-md6">
+		<div class="layui-card">
+			<div class="layui-card-header">
+				<strong>工时登记情况</strong>
+			</div>
+			<div class="layui-card-body">
+				<div id="work" class="gougu-data-none" style="width:100%; height:150px;"></div>
+			</div>
+		</div>
+	</div>
+</div>
+<script>
+function overview(){
+	let form = layui.form,tool = layui.tool,uploadPlus = layui.uploadPlus;
+	
+	$('body').on('click','[data-event="step"]',function(){
+		let check = $(this).data('check');
+		let callback = function (e) {
+			layer.msg(e.msg);
+			if(e.code==0){
+				setTimeout(function(){
+					location.reload();
+				},2000)
+				parent.layui.pageTable.reload();
+			}
+		}
+		if(check == 2){
+			$(parent.$('.express-close')).addClass('parent-colse');
+			layer.open({
+				type: 1,
+				title: '请输入退回的原因或理由',
+				area: ['500px', '252px'],
+				content: '<div style="padding:5px;"><textarea class="layui-textarea" id="remarkTextarea" style="width: 100%; height:132px;"></textarea></div>',
+				btnAlign: 'c',
+				btn: ['确认回退'],
+				end: function(){
+					$(parent.$('.express-close')).removeClass('parent-colse');
+				},
+				yes: function () {
+					let remark = $("#remarkTextarea").val();
+					if (remark != '') {
+						tool.post("/project/api/step_check", {id: project_id,check:check,content:remark}, callback);
+					} else {
+						layer.msg('请输入原因或理由');
+					}
+				}
+			})
+		}
+		else{
+			$(parent.$('.express-close')).addClass('parent-colse');
+			layer.open({
+				type: 1,
+				title: '请输入操作意见',
+				area: ['500px', '252px'],
+				content: '<div style="padding:5px;"><textarea class="layui-textarea" id="remarkTextarea" style="width: 100%; height:132px;"></textarea></div>',
+				btnAlign: 'c',
+				btn: ['确认完成'],
+				end: function(){
+					$(parent.$('.express-close')).removeClass('parent-colse');
+				},
+				yes: function () {
+					let remark = $("#remarkTextarea").val();
+					if (remark != '') {
+						tool.post("/project/api/step_check", {id: project_id,check:check,content:remark}, callback);
+					} else {
+						layer.msg('请输入操作意见');
+					}
+				}
+			})
+		}
+	});
+
+	var attachment = new uploadPlus({
+		"target":'uploadBtn',
+         "targetBox":'uploadBox',
+         "attachment":{
+            "type":1,//0ajax多文件模式，1ajax单文件单记录模式
+            "uidDelete":true,//是否开启只有上传人自己才能删除自己的附件
+			"ajaxSave":function(res){
+				let callback = function (e) {
+					layer.msg('上传成功');
+					setTimeout(function(){
+						location.reload();
+					},2000)	
+				}
+				tool.post("/project/api/add_file", { 'topic_id': project_id, 'file_id': res.data.id, 'file_name': res.data.name, 'module': 'project' }, callback);
+			},
+			"ajaxDelete":function(file_id){
+				let callback = function (e) {
+					layer.msg(e.msg);
+					if (e.code == 0) {						
+						$('#fileItem' + file_id).remove();
+					}
+				}
+				tool.delete("/project/api/delete_file", {id: file_id}, callback);			
+			}
+		}
+	});
+
+	let callback = function (res) {
+		if (res.data.date_tasks instanceof Array == false) {
+			optionA.title.text = res.data.task_pie.ok_lv + '%';
+			optionA.series = [
+				{
+					type: 'pie',
+					radius: ['60%', '80%'],
+					center: ['50%', '50%'],
+					avoidLabelOverlap: false,
+					label: {
+						show: false
+					},
+					data: [
+						{ value: res.data.task_pie.count - res.data.task_pie.count_ok, name: '待处理' },
+						{ value: res.data.task_pie.count_ok, name: '已完成' }
+					]
+				}
+			];
+			optionA && progressChart.setOption(optionA);
+
+			optionB.title.text = res.data.task_pie.delay_lv + '%';
+			optionB.series = [
+				{
+					type: 'pie',
+					radius: ['60%', '80%'],
+					center: ['50%', '50%'],
+					avoidLabelOverlap: false,
+					label: {
+						show: false
+					},
+					data: [{
+						value: res.data.task_pie.delay,
+						name: '延迟',
+						itemStyle: {
+							color: "#ED6666",
+						}
+					},
+					{
+						value: (res.data.task_pie.count - res.data.task_pie.delay),
+						name: '未延迟',
+						itemStyle: {
+							color: "#91CC75",
+						}
+					}
+					]
+				}
+			];
+			optionB && delayChart.setOption(optionB);
+
+			var dataD = cross_count(res.data.date_tasks, res.data.date_tasks_ok);
+			var tips = $('#cross').data('tips');
+			optionD.title = {
+				text: '',
+				subtext: tips,
+				top: -10,
+			},
+			optionD.xAxis = {
+				type: 'category',
+				boundaryGap: false,
+				splitLine: {
+					show: true,
+					lineStyle: {
+						type: 'dashed'
+					}
+				},
+				data: dataD.x,
+				axisLabel: {
+					rotate: 30,
+					formatter: function (value, index) {
+						return value.slice(5);
+					}
+				}
+			};
+			optionD.series = [
+				{
+					name: '任务计划剩余',
+					type: 'line',
+					showSymbol: false,
+					markLine: {
+						data: [{ type: 'average', name: 'Avg' }],
+					},
+					lineStyle: {
+						width: 2
+					},
+					data: dataD.y
+				},
+				{
+					name: '任务实际剩余',
+					type: 'line',
+					showSymbol: false,
+					areaStyle: {
+						opacity: 0.1
+					},
+					markLine: {
+						data: [{ type: 'average', name: 'Avg' }],
+					},
+					lineStyle: {
+						width: 2
+					},
+					data: dataD.y2
+				}
+			]
+			optionD && crossChart.setOption(optionD)
+
+			var dataE = getCalendarData(res.data.date_tasks);
+			optionE.calendar.range = dataE.range,
+				optionE.series = {
+					type: 'heatmap',
+					coordinateSystem: 'calendar',
+					data: dataE.data
+				}
+			optionE && planChart.setOption(optionE);
+
+			if (res.data.date_schedules instanceof Array == false) {
+				var dataF = getCalendarData(res.data.date_schedules);
+				optionF.calendar.range = dataF.range,
+					optionF.series = {
+						type: 'heatmap',
+						coordinateSystem: 'calendar',
+						data: dataF.data
+					}
+				optionF && workChart.setOption(optionF);
+			}
+		}
+	}
+	tool.get('/project/api/get_chart_data', { 'project_id': project_id }, callback);
+
+	window.onresize = function () {
+		progressChart.resize();
+		delayChart.resize();
+		crossChart.resize();
+		planChart.resize();
+		workChart.resize();
+	}
+}
+</script>
\ No newline at end of file
diff --git a/app/project/view/index/view_schedule.html b/app/project/view/index/view_schedule.html
new file mode 100644
index 0000000000000000000000000000000000000000..a835d2659a76ec175e93f88ce94ee5791e12af0f
--- /dev/null
+++ b/app/project/view/index/view_schedule.html
@@ -0,0 +1,59 @@
+<div class="bg-white">
+	<table class="layui-hide" id="scheduleApi" lay-filter="schedule"></table>
+</div>
+<script type="text/html" id="toolbarschedule">
+  <div class="layui-btn-container">
+  	<span class="yellow">如需创建工作日志，请到项目任务的详情页创建</span>
+  </div>
+</script>
+<script>
+function project_schedule(){
+	if($('#projectTab').find('li').eq(2).data('load') =='true'){
+		return false;
+	}
+	$('#projectTab').find('li').eq(2).data('load','true');
+	let form = layui.form,tool = layui.tool,table = layui.tablePlus,work = layui.oaSchedule,oaPicker = layui.oaPicker;
+	//项目工作记录
+	layui.scheduleTable = table.render({
+		elem: '#scheduleApi',
+		title: '工作记录列表',
+		toolbar: '#toolbarschedule',
+		cellMinWidth: 80,
+		url: "/oa/api/get_schedule", //数据接口
+		where: { 'project_id': project_id },
+		cols: [[ //表头
+			{ field: 'id', title: '序号', width: 60, align: 'center' }
+			, {
+				field: 'start_time', title: '工作时间范围', align: 'center', width: 180, templet: function (d) {
+					var html = d.start_time + '至' + d.end_time;
+					return html;
+				}
+			}
+			, { field: 'labor_time', title: '工时', style: 'color: #91CC75;', align: 'center', width: 60 }
+			, { field: 'labor_type_string', title: '工作类型', align: 'center', width: 90,templet:function(d){
+				var html = '<span class="layui-color-'+d.labor_type+'">'+d.labor_type_string+'</span>';
+				return html;
+			}}
+			, { field: 'work_cate', title: '工作类别', align: 'center', width: 100 }
+			, { field: 'title', title: '工作内容' }
+			, { field: 'name', title: '执行员工', align: 'center', width: 80 }
+			, { field: 'department', title: '所在部门', align: 'center', width: 100 }
+			, { field: 'create_time', title: '记录时间', align: 'center', width: 150 }
+			, {title: '操作',fixed:'right', align: 'center', width: 100, templet: function (d) {
+					return '<div class="layui-btn-group"><span class="layui-btn layui-btn-xs" lay-event="edit">修改</span><span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详细</span></div>';
+				}
+			}
+		]]
+	});
+	//监听行工具事件		
+	table.on('tool(schedule)', function (obj) {
+		if (obj.event === 'edit') {
+			work.add(0, obj.data);
+		}
+		if (obj.event === 'view') {
+			work.view(obj.data);
+		}
+		return false;
+	})
+}
+</script>
\ No newline at end of file
diff --git a/app/project/view/index/view_task.html b/app/project/view/index/view_task.html
new file mode 100644
index 0000000000000000000000000000000000000000..63dc8bd9054eb3f0cbe4d1bc835d0765f76b43f8
--- /dev/null
+++ b/app/project/view/index/view_task.html
@@ -0,0 +1,64 @@
+<div class="bg-white">
+	<table class="layui-hide" id="task" lay-filter="task"></table>
+</div>
+<script type="text/html" id="toolbartask">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm" lay-event="add">+ 新建任务</button>
+  </div>
+</script>
+<script>
+function project_task(){
+	if($('#projectTab').find('li').eq(1).data('load') =='true'){
+		return false;
+	}
+	$('#projectTab').find('li').eq(1).data('load','true');
+	let tool = layui.tool, table = layui.tablePlus;
+	//项目任务
+	parent.layui.taskTable = table.render({
+		elem: '#task',
+		title: '任务列表',
+		toolbar: '#toolbartask',
+		cellMinWidth:80,
+		url: "/project/api/get_task",
+		where:{'project_id':project_id},
+		page: true, //开启分页
+		limit: 20,
+		cols:  [[
+			{field: 'id', title: '任务编号', width: 80, align: 'center', fixed: 'left', templet: function (d) {
+					return 'T' + d.id;
+				}
+			}
+			,{ field: 'status', title: '任务状态', align: 'center', width: 90, templet: function (d) {
+					var html = '<span class="check-status-color-' + d.status + '">『' + d.status_name + '』</span>';
+					return html;
+					}
+				}
+			, { field: 'cate_name', title: '工作类型', width: 90, align: 'center'}
+			,{field:'title',title: '任务主题', minWidth: 300,templet:function(d){
+					var html = '<span class="layui-badge layui-bg-'+d.priority+'">'+d.priority_name+'</span> <a data-href="/project/task/view/id/'+d.id+'.html" class="side-a">'+d.title+'</a>';
+					return html;
+				}}
+			,{field:'director_name',title: '负责人', align:'center',width: 80}
+			,{field:'assist_admin_names',title: '协作人',width: 160}
+			,{field:'plan_hours',title: '预估工时', align:'center',width: 80}				
+			,{field:'end_time',title: '预计结束日期', width: 150,templet:function(d){
+				var html = d.end_time;	
+				if(d.delay>0){
+					html+= '<span class="red ml-1" style="font-size:12px;">逾期'+d.delay+'天</span>';	
+				}			
+				return html;
+			}}
+		]]
+	});
+	
+	//触发事件
+	table.on('toolbar(task)', function(obj){
+	  var checkStatus = table.checkStatus(obj.config.id);
+	  switch(obj.event){
+		case 'add':
+		  tool.side('/project/task/add?project_id='+project_id);
+		break;
+	  };
+	});
+}
+</script>
\ No newline at end of file
diff --git a/app/project/view/index/view_user.html b/app/project/view/index/view_user.html
new file mode 100644
index 0000000000000000000000000000000000000000..dae59b26a1aad46214aa5a55e1bfbbd98296205a
--- /dev/null
+++ b/app/project/view/index/view_user.html
@@ -0,0 +1,116 @@
+<div class="bg-white">
+	<table class="layui-hide" id="user" lay-filter="user"></table>
+</div>
+<script type="text/html" id="toolbaruser">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm" lay-event="add">+ 新增项目成员</button>
+  </div>
+</script>
+<script>
+function project_user(){
+	if($('#projectTab').find('li').eq(4).data('load') =='true'){
+		return false;
+	}
+	$('#projectTab').find('li').eq(4).data('load','true');
+	let tool = layui.tool, table = layui.tablePlus,oaPicker = layui.oaPicker;
+	//项目成员
+	layui.userTable = table.render({
+		elem: '#user',
+		title: '项目成员列表',
+		cellMinWidth: 60,
+		toolbar: '#toolbaruser',
+		url: "/project/api/project_user", //数据接口
+		where: { 'tid': project_id },
+		page: false, //开启分页
+		limit: 20,
+		cols: [[ //表头
+			{ field: 'name', fixed: 'left', title: '成员姓名', width: 90, align: 'center', rowspan: 2 }
+			, { field: 'create_time', title: '进入项目日期', width: 110, align: 'center', rowspan: 2 }
+			, { field: 'role', title: '角色', align: 'center', width: 90, rowspan: 2, templet: function (d) {
+				var html='<span style="color: #4285F4;">普通成员</span>';
+				if(d.role==1){
+					html='<span style="color: #EE6666;">项目创建人</span>';
+				}
+				if(d.role==2){
+					html='<span style="color: #91CC75;">项目负责人</span>';
+				}
+				return html;
+			}}
+			, { field: 'position', title: '职位', align: 'center', width: 100, rowspan: 2 }
+			, { field: 'department', title: '所在部门', align: 'center', width: 120, rowspan: 2 }
+			, { field: 'mobile', title: '手机号码', align: 'center', width: 110, rowspan: 2 }
+			, { align: 'center', title: '工作记录', colspan: 2 }
+			, { align: 'center', title: '项目任务', colspan: 3 }
+			, { field: 'delete_time', title: '移除日期', align: 'center', minWidth: 120, rowspan: 2 }
+			, { field: 'status',fixed: 'right', title: '状态', align: 'center', width: 60, rowspan: 2, templet: function (d) {
+					var html = '<span style="color:#EE6666">✘</span>';
+					if(d.delete_time == '-')
+						html = '<span style="color:#91CC75">✔</span>';
+					return html;
+				}}				
+			, {title: '操作',fixed: 'right', align: 'center', width: 60, rowspan: 2, templet: function (d) {
+					var html = '<span class="layui-btn layui-btn-xs" lay-event="recover">恢复</span>';
+					if(d.delete_time == '-')
+						html = '<span class="layui-btn layui-btn-danger layui-btn-xs" lay-event="remove">移除</span>';
+					return html;
+				}
+			}
+		], [
+			{ field: 'schedules', align: 'center', style: 'color: #91CC75;', width: 72, 'title': '记录' }
+			, { field: 'labor_times', align: 'center', style: 'color: #4285F4;', width: 70, 'title': '工时' }
+			, { field: 'tasks_unfinish', align: 'center', style: 'color: #91CC75;', width: 72, 'title': '进行中' }
+			, { field: 'tasks_finish', align: 'center', style: 'color: #FAC858;', width: 70, 'title': '已完成' }
+			, { field: 'tasks_pensent', align: 'center', style: 'color: #EE6666;', width: 72, 'title': '完成率' }
+		]]
+	});
+	
+	//触发事件
+	table.on('toolbar(user)', function(obj){
+		var checkStatus = table.checkStatus(obj.config.id);
+		switch(obj.event){
+			case 'add':
+			  oaPicker.employeeInit({
+				type: 1,
+				callback: function (data) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if(e.code == 0){
+							layui.userTable.reload();
+						}						
+					}
+					let select_id=[];
+					for(var a=0; a<data.length;a++){
+						select_id.push(data[a].id);
+					}
+					let ids = select_id.join(',');
+					tool.post("/project/api/add_user", {uid: ids,project_id: project_id}, callback);
+				}
+			})			
+			break;
+		};
+	});
+
+	//监听行工具事件
+	table.on('tool(user)', function (obj) {
+		let postData = { "id": obj.data.id };
+		let callback = function (e) {
+				layer.closeAll();
+				layer.msg(e.msg);
+				if(e.code == 0){
+					layui.userTable.reload();
+				}
+			}
+		if (obj.event === 'remove') {
+			layer.confirm('确定要移除该项目成员吗?', { icon: 3, title: '提示' }, function (index) {
+				tool.delete("/project/api/remove_user", postData, callback);
+			});
+		}
+		if (obj.event === 'recover') {
+			layer.confirm('确定要恢复该项目成员吗?', { icon: 3, title: '提示' }, function (index) {
+				tool.post("/project/api/recover_user", postData, callback);
+			});
+		}
+		return;
+	});
+}
+</script>
\ No newline at end of file
diff --git a/app/project/view/step/add.html b/app/project/view/step/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..01e774b01a4b078bf6f9522950137b5cc8fdbb05
--- /dev/null
+++ b/app/project/view/step/add.html
@@ -0,0 +1,45 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">项目步骤</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">项目步骤名称<font>*</font></td>
+			<td><input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入项目步骤名称" lay-reqText="请输入项目步骤名称"class="layui-input" value="{$detail.title|default=''}"></td>
+			<td class="layui-td-gray">排序</td>
+			<td><input type="text" name="sort" placeholder="请输入排序，数字" autocomplete="off" class="layui-input" value="{$detail.sort|default=''}"></td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$detail.id|default=0}"/>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool'];
+
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/project/step/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/project/view/step/datalist.html b/app/project/view/step/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..d27423fa2e45b22712d8ff9b0723d6076058ee22
--- /dev/null
+++ b/app/project/view/step/datalist.html
@@ -0,0 +1,124 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<table class="layui-hide" id="table_step" lay-filter="table_step"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm add-new" type="button">+ 添加项目步骤</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool;
+		
+		layui.pageTable = table.render({
+			elem: "#table_step"
+			,toolbar: '#toolbarDemo'
+			,url: "/project/step/datalist"
+			,page: false
+			,limit: 999
+			,cellMinWidth: 80
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',title: '类型名称'}
+				,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+					var html1='<span class="green">正常</span>';
+					var html2='<span class="yellow">禁用</span>';
+					if(d.status==1){
+						return html1;
+					}
+					else{
+						return html2;
+					}
+				}}
+				,{width:100,title: '操作', align:'center',ignoreExport:true,templet: function(d){
+					var html='';
+					var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+					if(d.status==1){
+						html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+					}
+					else{
+						html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+					}
+					return html;
+				}}
+			]]
+		});
+			
+		table.on('tool(table_step)',function (obj) {
+			if(obj.event === 'edit'){					
+				add_cate(obj.data.id,obj.data.title);
+			}
+			if(obj.event === 'disable'){
+				layer.confirm('确定要禁用该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/project/step/set", {id:obj.data.id,status: 0}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'open'){
+				layer.confirm('确定要启用该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/project/step/set", {id:obj.data.id,status:1}, callback);
+					layer.close(index);
+				});
+			}
+		});
+		
+		$('body').on('click','.add-new',function(){
+			add_cate(0,'');	
+		});
+		
+		function add_cate(id,val){
+			var title = '新增类型';
+			if(id>0){
+				title = '编辑类型';
+			}
+			layer.prompt({
+				title: title,
+				value: val,
+				yes: function(index, layero) {
+					// 获取文本框输入的值
+					var value = layero.find(".layui-layer-input").val();
+					if (value) {
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();				
+							}
+						}
+						tool.post("/project/step/add", {id: id,title: value}, callback);
+						layer.close(index);
+					} else {
+						layer.msg('请填写类型名称');
+					}
+				}
+			})
+		}
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/project/view/step/view.html b/app/project/view/step/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..9a83abbb2cfb0836fc4b7bc33903dde85c86436f
--- /dev/null
+++ b/app/project/view/step/view.html
@@ -0,0 +1,16 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<h3 class="pb-3">项目步骤详情</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">项目步骤名称</td>
+			<td>{$detail.title|default=''}"></td>
+			<td class="layui-td-gray">排序</td>
+			<td>{$detail.sort|default=0}</td>
+		</tr>
+	</table>
+</div>
+{/block}
+<!-- /主体 -->
\ No newline at end of file
diff --git a/app/project/view/task/add.html b/app/project/view/task/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..318569caf3bf6549b15714cf3f743f8518cc31a2
--- /dev/null
+++ b/app/project/view/task/add.html
@@ -0,0 +1,111 @@
+{extend name="../../base/view/common/base" /}
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">新建任务</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">任务主题<font>*</font></td>
+			<td colspan="3"><input type="text" name="title" lay-verify="required" lay-reqText="请输入任务主题" placeholder="请输入任务主题" class="layui-input" value=""></td>
+			<td class="layui-td-gray-2">任务优先级<span style="color: red">*</span></td>
+			<td>
+				<select name="priority" lay-verify="required" lay-reqText="请选择优先级">
+					{volist name=":get_priority()" id="vo"}
+					{gt name="$key" value="0"}
+					<option value="{$key}">{$vo}</option>
+					{/gt}
+					{/volist}
+				</select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">工作类型<span style="color: red">*</span></td>
+			<td>
+				<select name="work_id" lay-verify="required" lay-reqText="请选择工作类型">
+					<option value="">请选择</option>
+					{volist name=":get_base_data('WorkCate')" id="vo"}
+					<option value="{$vo.id}">{$vo.title}</option>
+					{/volist}
+				</select>
+			</td>
+			<td class="layui-td-gray">预估工时<span style="color: red">*</span></td>
+			<td><input type="text" name="plan_hours" lay-verify="required|number" lay-reqText="请填写预估工时" placeholder="请填写预估工时" class="layui-input" value=""></td>
+			<td class="layui-td-gray-2">预计结束日期<span style="color: red">*</span></td>
+			<td><input type="text" name="end_time" readonly lay-verify="required" lay-reqText="请选择预计结束日期" placeholder="请选择时间" class="layui-input tool-time" value=""></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">负责人</td>
+			<td>
+				<input type="text" name="director_name" placeholder="请选择" readonly class="layui-input picker-admin" value="">
+				<input type="hidden" name="director_uid" readonly value="0">
+			</td>
+			{empty name="$project_id"}
+			<td class="layui-td-gray">协作人</td>
+			<td>
+				<input type="text" name="assist_admin_names" placeholder="请选择" readonly class="layui-input picker-admin" data-type="2" value="">
+				<input type="hidden" name="assist_admin_ids" readonly value="">
+			</td>
+			<td class="layui-td-gray">关联项目</td>
+			<td>
+				<input type="text" name="project_name" placeholder="所属项目" readonly class="layui-input picker-oa" data-types="project" autocomplete="off" />
+				<input type="hidden" name="project_id" value="0" />
+			</td>
+			{else/}
+			<td class="layui-td-gray">协作人</td>
+			<td colspan="3">
+				<input type="hidden" name="project_id" readonly value="{$project_id}">
+				<input type="text" name="assist_admin_names" placeholder="请选择" readonly class="layui-input picker-admin" data-type="2" value="">
+				<input type="hidden" name="assist_admin_ids" readonly value="">
+			</td>
+			{/empty}
+		</tr>
+		<tr>
+			<td class="layui-td-gray" style="vertical-align:top;">详细描述<font>*</font></td>
+			<td colspan="5">
+			  <textarea name="content" placeholder="请输入内容" class="layui-textarea" id="container" style="border:0;padding:0"></textarea>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<input type="hidden" name="id" value="0" />
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+const moduleInit = ['tool','tinymce','oaPicker'];
+function gouguInit() {
+	var form = layui.form,tool=layui.tool, oaPicker = layui.oaPicker;
+	
+	//编辑器初始化
+	var editor = layui.tinymce;
+	var edit = editor.render({
+		selector: "#container",
+		images_upload_url: '/api/index/upload/sourse/tinymce',//图片上传接口
+		height: 500
+	});
+	
+	//监听提交
+	form.on('submit(webform)', function (data) {
+		data.field.content = tinyMCE.editors['container'].getContent();
+			if (data.field.content == '') {
+				layer.msg('请先完善任务描述内容');
+				return false;
+			}
+		let callback = function (e) {
+			layer.msg(e.msg);
+			if (e.code == 0) {
+				tool.sideClose(1000);
+			}
+		}
+		let clickbtn = $(this);
+		tool.post("/project/task/add", data.field, callback,clickbtn);
+		return false;
+	});
+}
+</script>
+{/block}
\ No newline at end of file
diff --git a/app/project/view/task/comment.html b/app/project/view/task/comment.html
new file mode 100644
index 0000000000000000000000000000000000000000..28640a8b658dd733d4b4d23a0eaa50687884eeb7
--- /dev/null
+++ b/app/project/view/task/comment.html
@@ -0,0 +1,111 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+.layui-unselect dl {max-height:188px;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-x border-t" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:100px;">
+			<input type="text" name="username"  placeholder="请选择评论人" class="layui-input picker-admin" readonly />
+			<input type="text" name="uid" value="" style="display:none" />	
+		</div>
+		<div class="layui-input-inline" style="width:300px;">
+			<input type="text" name="keywords"  placeholder="关键字，输入评论内容" class="layui-input"/>
+		</div>	
+		<div class="layui-input-inline" style="width:150px;">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form> 
+	<div>
+		<table class="layui-hide" id="test" lay-filter="test"></table>
+	</div>
+</div>
+<script type="text/html" id="toolbarDemo">
+<h3>任务评论</h3>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool','tablePlus','oaPicker'];
+	function gouguInit() {
+		var form = layui.form,table = layui.tablePlus,tool=layui.tool, work = layui.oaSchedule;	  
+		layui.commentTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,title:'评论列表'
+			,url: "/project/task/comment"
+			,cellMinWidth: 80
+			,is_excel:true
+			,height: 'full-110'
+			,cols: [[ //表头
+				{field: 'id', title: '序号',fixed: 'left', width:80, align:'center'}
+				,{field: 'content', title: '评论内容'}
+				,{field: 'project', title: '关联项目&任务', width:300,templet:function(d){
+					var html='';
+					if(d.labor_type==0){
+						html='<span class="layui-color-'+d.labor_type+'">-</span>';
+					}
+					else if(d.module =='project'){
+						html='<span class="green">『项目』</span><a data-href="/project/index/view/id/'+d.topic_id+'.html" class="side-a">'+d.topic_name+'</a>';
+					}
+					else{
+						html='<span class="blue">『任务』</span><a data-href="/project/task/view/id/'+d.topic_id+'.html" class="side-a">'+d.topic_name+'</a>';
+					}
+					return html;
+				}}
+				,{field: 'to_names', title: '@关联人', width:160}
+				,{field: 'admin_name', title: '评论人', align:'center',width:80}
+				,{field: 'create_time', title: '评论时间', align:'center',width:150}
+				,{field: 'right', title: '操作',fixed:'right', width:90, align:'center',templet:function(d){
+					if(d.read==0){
+						return '<button class="layui-btn layui-btn-xs layui-btn-normal" lay-event="read">设为已读</button>';
+					}
+					else if(d.read==2){
+						return '<button class="layui-btn layui-btn-xs layui-btn-danger" lay-event="del">删除</button>';
+					}
+					else{
+						return '-';
+					}
+				}}
+			]]
+		});
+
+		table.on('tool(test)', function(obj){
+			var data = obj.data;
+			if (obj.event === 'read') {
+				let callback = function (e) {
+					layer.msg(e.msg);
+					if (e.code == 0) {
+						layui.commentTable.reload();
+					}
+				}
+				tool.post("/project/api/read_comment", { id: data.id }, callback);
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要删除该评论吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/project/api/delete_comment", { id: data.id }, callback);
+					layer.close(index);
+				});
+				return;
+			}
+			return;
+		});
+		   
+	}
+		
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/project/view/task/datalist.html b/app/project/view/task/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..7d8f55e8cf499166be195a87f371a8849b5f8ebb
--- /dev/null
+++ b/app/project/view/task/datalist.html
@@ -0,0 +1,121 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="style"}
+<style>
+	.layui-unselect dl {
+		max-height: 188px;
+	}
+</style>
+{/block}
+{block name="body"}
+<div class="p-page">
+	<div class="gg-form-bar border-t border-x">
+		<form id="taskForm" class="layui-form" lay-filter="barsearchform">
+			<div class="layui-input-inline" style="width:100px;">
+				<select name="status" lay-filter="status">
+					<option value="">任务状态</option>
+					{volist name=":get_task_status()" id="vo"}
+					{gt name="$key" value="0"}
+					<option value="{$key}">{$vo}</option>
+					{/gt}
+					{/volist}
+				</select>
+			</div>
+			<div class="layui-input-inline" style="width:100px;">
+				<select name="priority" lay-filter="priority">
+					<option value="">优先级</option>
+					{volist name=":get_priority()" id="vo"}
+					{gt name="$key" value="0"}
+					<option value="{$key}">{$vo}</option>
+					{/gt}
+					{/volist}
+				</select>
+			</div>
+			<div class="layui-input-inline" style="width:100px;">
+				<select name="work_id" lay-filter="cate">
+					<option value="">工作类型</option>
+					{volist name=":get_base_data('WorkCate')" id="vo"}
+					<option value="{$vo.id}">{$vo.title}</option>
+					{/volist}
+				</select>
+			</div>
+			<div class="layui-input-inline" style="width:240px;">
+				<input type="text" name="project_name" placeholder="所属项目" readonly class="layui-input picker-oa" data-types="project" autocomplete="off" />
+				<input name="project_id" style="display: none;" value="" />
+			</div>
+			<div class="layui-input-inline" style="width:160px;">
+				<input type="text" name="director" placeholder="任务负责人，可多选" readonly class="layui-input picker-admin" data-type="2" autocomplete="off" />
+				<input name="director_uid" style="display: none;" value="" />
+			</div>
+			<div class="layui-input-inline" style="width:240px;">
+				<input type="text" name="keywords" placeholder="关键字，任务主题/描述内容" class="layui-input" autocomplete="off" />
+			</div>
+			<div class="layui-input-inline" style="width:150px;">
+				<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+				<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+			</div>
+		</form>
+	</div>
+	<table class="layui-hide" id="task" lay-filter="task"></table>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm" lay-event="add">+ 新建任务</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus','oaPicker'];
+	function gouguInit() {
+		var table = layui.tablePlus, form = layui.form, tool = layui.tool;
+
+		layui.taskTable = table.render({
+			elem: '#task',
+			title: '任务列表',
+			toolbar: '#toolbarDemo',
+			is_excel:true,
+			cellMinWidth: 80,
+			url: "/project/task/datalist", //数据接口
+			height: 'full-110',
+			cols: [[
+				{field: 'id', title: '任务编号', width: 80, align: 'center', fixed: 'left', templet: function (d) {
+					return 'T' + d.id;
+				}}
+				,{ field: 'status', title: '任务状态', align: 'center', width: 90, templet: function (d) {
+						var html = '<span class="check-status-color-' + d.status + '">『' + d.status_name + '』</span>';
+						return html;
+						}
+					}
+				, { field: 'cate_name', title: '工作类型', width: 90, align: 'center'}
+				,{field:'title',title: '任务主题', minWidth: 300,templet:function(d){
+					var html = '<span class="layui-badge layui-bg-'+d.priority+'">'+d.priority_name+'</span> <a data-href="/project/task/view/id/'+d.id+'.html" class="side-a">'+d.title+'</a>';
+					return html;
+				}}
+				,{field:'director_name',title: '负责人', align:'center',width: 80}
+				,{field:'assist_admin_names',title: '协作人',width: 160}
+				,{field:'plan_hours',title: '预估工时', align:'center',width: 80}				
+				,{field:'end_time',title: '预计结束日期', width: 150,templet:function(d){
+					var html = d.end_time;	
+					if(d.delay>0){
+						html+= '<span class="red ml-1" style="font-size:12px;">逾期'+d.delay+'天</span>';	
+					}			
+					return html;
+				}}
+			]]
+		});
+		
+		//触发事件
+		table.on('toolbar(task)', function(obj){
+			if(obj.event === 'add'){
+				tool.side('/project/task/add');
+				return;
+			}
+		});
+	}		
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/project/view/task/hour.html b/app/project/view/task/hour.html
new file mode 100644
index 0000000000000000000000000000000000000000..74e8b0ea1d9180d56b975653d76d0eec14a85b5d
--- /dev/null
+++ b/app/project/view/task/hour.html
@@ -0,0 +1,200 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+.layui-unselect dl {max-height:188px;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-x border-t" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:180px;">
+			<input type="text" class="layui-input tool-time" data-range="至" placeholder="选择时间区间" readonly name="range_time">
+		</div>
+		<div class="layui-input-inline" style="width:100px;">
+			<input type="text" name="username"  placeholder="请选择员工" class="layui-input picker-admin" readonly />
+			<input type="text" name="uid" value="" style="display:none" />	
+		</div>
+		<div class="layui-input-inline" style="width:300px;">
+			<input type="text" name="keywords"  placeholder="关键字，输入工作内容" class="layui-input"/>
+		</div>	
+		<div class="layui-input-inline" style="width:150px;">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form> 
+	<div>
+		<table class="layui-hide" id="test" lay-filter="test"></table>
+	</div>
+</div>
+<script type="text/html" id="toolbarDemo">
+<h3>任务工时</h3>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool','tablePlus','oaPicker','oaSchedule'];
+	function gouguInit() {
+		var form = layui.form,table = layui.tablePlus,tool=layui.tool, work = layui.oaSchedule,laydate = layui.laydate;	  
+		layui.scheduleTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,title:'工时列表'
+			,url: "/project/task/hour"
+			,cellMinWidth: 80
+			,is_excel:true
+			,height: 'full-110'
+			,cols: [[ //表头
+				{field: 'id', title: '序号',fixed: 'left', width:80, align:'center'}
+				,{field: 'labor_type_string', title: '工作类型', align:'center',width:90,templet:function(d){
+					var html='';
+					if(d.labor_type==0){
+						html='<span class="layui-color-'+d.labor_type+'">-</span>';
+					}
+					else if(d.labor_type == 1){
+						html='<span class="layui-color-'+d.labor_type+'">案头工作</span>';
+					}
+					else if(d.labor_type == 2){
+						html='<span class="layui-color-'+d.labor_type+'">外勤工作</span>';
+					}
+					return html;
+				}}
+				,{field: 'work_cate', title: '工作类别', align:'center',width:80}
+				,{field: 'start_time', title: '工作时间范围', align:'center',width:186,templet:function(d){
+					var html=d.start_time+'至'+d.end_time;
+					return html;
+				}}
+				,{field: 'name', title: '执行人', align:'center',width:80}
+				,{field: 'labor_time', title: '工时', align:'center',width:80}
+				,{field: 'title', title: '工作内容'}
+				,{field: 'project', title: '关联项目', width:180}
+				,{field: 'create_time', title: '记录时间', align:'center',width:150}
+				,{field: 'right', title: '操作',fixed:'right', width:150, align:'center',templet:function(d){
+					var html='<div class="layui-btn-group">';
+					html+='<button class="layui-btn layui-btn-xs layui-btn-danger" lay-event="time">调整工时</button><button class="layui-btn layui-btn-xs layui-btn-normal"  lay-event="view">查看</button>';
+					if(d.admin_id==login_admin){
+						html+='<button class="layui-btn layui-btn-xs" lay-event="edit">编辑</button>';
+					}
+					html+='</div>';
+					return html;
+				}}
+			]]
+		});
+		//更改工时
+		table.on('tool(test)', function(obj){
+			var data = obj.data;
+			if(obj.event === 'time'){
+			  var content='<form class="layui-form" style="width:568px">\
+							<table class="layui-table" style="margin:15px 15px 0;">\
+								<tr>\
+									<td class="layui-td-gray-2">工作时间范围<font>*</font></td>\
+									<td>\
+										<input id="start_time_a" name="start_time_a" style="width:120px; display:inline-block;" autocomplete="off" class="layui-input" value="" readonly lay-verify="required" lay-reqText="请选择"><div style="display: inline-block; margin-left:5px; width: 80px;"><select lay-filter="start_time_b" id="start_time_b"></select></div> 至 <input id="end_time_a" name="end_time_a" style="width:120px; display:inline-block;" autocomplete="off" class="layui-input" value="" readonly lay-verify="required" lay-reqText="请选择"><div style="display: inline-block; margin-left:5px; width: 80px;"><select lay-filter="end_time_b" id="end_time_b"></select></div>\
+									</td>\
+								</tr>\
+							</table>\
+						</form>';
+				layer.open({
+					type:1,
+					title:'调整工时',
+					area:['600px','388px'],
+					content:content,
+					success:function(){
+						//日期时间范围
+						laydate.render({
+							elem: '#start_time_a',
+							type: 'date',
+							max:0,
+							format: 'yyyy-MM-dd',
+							showBottom: false,
+							done:function(a,b,c){
+								$('#end_time_a').val(a);
+							}
+						});
+
+						//日期时间范围
+						laydate.render({
+							elem: '#end_time_a',
+							type: 'date',
+							max:0,
+							format: 'yyyy-MM-dd',
+							showBottom: false,
+							done:function(a,b,c){
+								$('#start_time_a').val(a);
+							}
+						});
+						$('#start_time_b,#end_time_b').empty();
+						
+						var hourArray=[];
+						for(var h=0;h<24;h++){
+							var t=h<10?'0'+h:h
+							var t_1=t+':00',t_2=t+':15',t_3=t+':30',t_4=t+':45';
+							hourArray.push(t_1,t_2,t_3,t_4);
+						}
+						
+						var html_1='', html_2='',def_h1='09:00',def_h2='09:30';
+						for(var s=0;s<hourArray.length;s++){
+							var check_1='',check_2='';
+							if(hourArray[s]==def_h1){
+								check_1='selected';
+							}
+							if(hourArray[s]==def_h2){
+								check_2='selected';
+							}
+							html_1 += '<option value="'+hourArray[s]+'" '+check_1+'>'+hourArray[s]+'</option>';
+							html_2 += '<option value="'+hourArray[s]+'" '+check_2+'>'+hourArray[s]+'</option>';
+						}
+						
+						$('#start_time_b').append(html_1);
+						$('#end_time_b').append(html_2);
+						form.render();
+					
+					},
+					btn: ['确定提交'],
+					btnAlign: 'c',
+					yes: function(idx){
+						let start_time_a = $('#start_time_a').val();
+						let end_time_a = $('#end_time_a').val();
+						let start_time_b = $('#start_time_b').val();
+						let end_time_b = $('#end_time_b').val();
+						if(start_time_a=='' || end_time_a==''){
+							layer.msg('请选择工作时间范围');
+							return;
+						}
+						$.ajax({
+							url: "/oa/api/update_schedule",
+							type:'post',
+							data:{
+								id:data.id,
+								admin_id:data.admin_id,
+								start_time_a:start_time_a,
+								end_time_a:end_time_a,
+								start_time_b:start_time_b,
+								end_time_b:end_time_b
+							},
+							success:function(e){
+								layer.msg(e.msg);
+								if(e.code==0){								
+									layer.close(idx);								
+									layui.scheduleTable.reload();
+								}
+							}
+						})			
+					}
+				})
+			}
+			else if(obj.event === 'edit'){
+				work.add(0, obj.data);	
+			}
+			else if(obj.event === 'view'){
+				work.view(obj.data);				
+			}
+		}); 
+	}
+		
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/project/view/task/view.html b/app/project/view/task/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..f62b4f6c0f931d3bfe7dab6a4fe25a3b7ae2ec83
--- /dev/null
+++ b/app/project/view/task/view.html
@@ -0,0 +1,256 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+.layui-tab-title .layui-this{background-color:#fff;}
+.layui-tab-card,.layui-card{box-shadow:0 0 0 0 rgb(0 0 0 / 10%); border-radius:0; border-top:none;}
+.layui-card-tips {color: #969696;}
+.layui-card-value {padding: 4px 0 16px;font-size: 18px;color: #1E9FFF;}
+
+.content-content{line-height:1.6;}
+.content-content p{margin-bottom:6px;}
+.content-content img{max-width:100%; padding:8px; box-sizing: border-box;}
+
+.log-item i{font-weight:800; color:#323232}
+.log-content strong{margin:0 4px; color:#323232}
+.layui-unselect dl {max-height:188px;}
+.layui-table td.table-content img{max-width:100%; height:auto;}
+</style>
+{/block}
+{block name="body"}
+<div class="p-page">
+	<h3 class="pb-3">任务详情</h3>
+	<table class="layui-table layui-table-form" id="task">
+		<tr>
+			<td class="layui-td-gray">任务主题</td>
+			<td colspan="3" class="click-edit" data-types="text" data-field="title">{$detail.title|default=''}</td>
+			<td class="layui-td-gray">工作类型</td>
+			<td class="click-edit" data-types="picker" data-field="work_id" data-type="1" data-picker="workcate">{$detail.cate_name|default='-'}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">负责人员</td>
+			<td class="click-edit" data-types="adminpicker" data-field="director_uid" data-type="1" data-ids="{$detail.director_uid}" data-names="{$detail.director_name|default=''}">{$detail.director_name|default=''}</td>
+			<td class="layui-td-gray">协作人</td>
+			<td colspan="3" class="click-edit" data-types="adminpicker" data-field="assist_admin_ids" data-type="2" data-ids="{$detail.assist_admin_ids}" data-names="{$detail.assist_admin_names|default=''}">{$detail.assist_admin_names|default=''}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">优先级</td>
+			<td class="click-edit" data-types="dropdown" data-field="priority" data-array="priority" data-text="{$detail.priority}">{$detail.priority_name}</td>
+			<td class="layui-td-gray">关联项目</td>
+			<td colspan="3" class="click-edit" data-types="picker" data-field="project_id" data-type="1" data-picker="project">{$detail.project_name|default='-'}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">完成进度</td>
+			<td class="click-edit" data-types="num" data-field="done_ratio" data-text="{$detail.done_ratio}" data-min="0" data-max="100">{$detail.done_ratio|default='0'}%</td>
+			<td class="layui-td-gray">估计结束日期</td>
+			<td class="click-edit" data-types="oadate" data-field="end_time">{$detail.end_time|date='Y-m-d'}</span>{gt name="$detail.delay" value="0"}<span class="red">『逾期 {$detail.delay}天』</span>{/gt}</td>
+			<td class="layui-td-gray-3">估计工作量(工时)</td>
+			<td class="click-edit" data-types="num" data-field="plan_hours">{$detail.plan_hours|default=''}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">任务状态</td>
+			<td class="click-edit" data-types="dropdown" data-field="status" data-array="status" data-text="{$detail.status}">{$detail.status_name}</td>
+			<td class="layui-td-gray-2">实际完成日期</td>
+			<td>{eq name="$detail.over_time" value="0"}-{else/}{$detail.over_time|date='Y-m-d'}{/eq}</td>
+			<td class="layui-td-gray">实际工时</td>
+			<td>{eq name="$detail.work_hours" value="0"}-{else/}{$detail.work_hours}{/eq}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">相关附件 <button type="button" class="layui-btn layui-btn-xs" id="uploadBtn">附件上传</button></td>
+			<td colspan="5" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids|default=''}">
+					{notempty name="$file_array"}
+					{volist name="$file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td colspan="6" class="click-edit" data-types="editor" data-field="content" data-target="content" style="background-color:#FAFAFA;"><strong>任务描述</strong></td>
+		</tr>
+		<tr>
+			<td colspan="6" id="content" class="table-content">{$detail.content|raw}</td>
+		</tr>
+	</table>
+	
+
+	<div class="layui-tab layui-tab-card" style="margin:0;" lay-filter="docDemoTabBrief">
+		<ul class="layui-tab-title">
+			<li class="layui-this">工作记录({$detail.comments})</li>
+			<li>员工评论({$detail.comments})</li>
+			<li>操作日志({$detail.logs})</li>
+		</ul>
+		<div class="layui-tab-content py-1 px-3" style="background-color:#fff;">
+			<div class="layui-tab-item layui-show py-2">
+				<table class="layui-hide" id="table_work" lay-filter="table_work"></table>
+			</div>
+			<div class="layui-tab-item comment-list">
+				<div class="comment-input my-2">
+					<input type="text" id="commentInput" readonly placeholder="发表一下你的看法" class="layui-input" value="">
+				</div>
+				<div id="commentBox"></div>
+			</div>
+			<div class="layui-tab-item logs-list">
+				<div id="logList" class="log-timeline p-3"></div>
+			</div>
+		</div>
+	</div>
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div>
+  	<div class="layui-input-inline" style="margin-right:12px;"><strong>工作日志</strong></div><div class="layui-input-inline"><button class="layui-btn layui-btn-xs" type="button" lay-event="add">+ 添加工作日志</button></div>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const admin_id = '{$detail.admin_id}';
+	const detail_id = '{$detail.id}';
+	const status_array = {:json_encode(get_task_status(1),JSON_UNESCAPED_UNICODE)};
+	const priority_array = {:json_encode(get_priority(1),JSON_UNESCAPED_UNICODE)};
+	const moduleInit = ['tool','oaPicker','oaEdit','oaSchedule','oaComment','uploadPlus'];
+	function gouguInit() {
+		const oaEdit = layui.oaEdit,work = layui.oaSchedule,comment = layui.oaComment, uploadPlus = layui.uploadPlus, tool = layui.tool, table = layui.table;
+		
+		oaEdit.log('logList','Task',detail_id);
+		
+		comment.init({
+			"box":'commentBox',//容器id
+			"input": 'commentInput',
+			"topic_id":detail_id,
+			"module": 'task',
+		});
+	
+		let edit_callback = function(e){
+			layer.msg(e.msg);
+			if(e.code==0){
+				setTimeout(function(){
+					location.reload();
+				},1000)
+			}			
+		}
+		//附件上传
+		var attachment = new uploadPlus({
+			"target":'uploadBtn',
+			"targetBox":'uploadBox',
+			"attachment":{
+				"type":1,//0ajax多文件模式，1ajax单文件单记录模式
+				"uidDelete":true,//是否开启只有上传人自己才能删除自己的附件
+				"ajaxSave":function(res){
+					tool.post('/project/api/add_file',{'topic_id':detail_id,'file_id':res.data.id,'file_name': res.data.name, 'module': 'task'},edit_callback);
+				},
+				"ajaxDelete":function(file_id){
+					tool.delete('/project/api/delete_file', {id: file_id}, edit_callback);	
+				}
+			}
+		});
+	
+		//快捷编辑
+		oaEdit.init({
+			box:'task',
+			id:detail_id,
+			url: "/project/task/add",
+			dropdown:{
+				status:status_array,
+				priority:priority_array
+			}
+		});
+		
+		//工作记录相关
+		layui.scheduleTable = table.render({
+			elem: "#table_work"
+			, toolbar: "#toolbarDemo"
+			,url: "/oa/api/get_schedule"
+			,page: true
+			,limit: 20
+			,where:{task_id:detail_id}
+			,cellMinWidth: 80
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',title: '工作内容',minWidth:240}
+				,{field: 'name', title: '所属人员', align:'center',width:80}
+				,{field: 'start_time', title: '工作时间范围', align:'center',width:260,templet:function(d){
+					var html=d.start_time+' 至 '+d.end_time;
+					return html;
+				}}
+				,{field: 'labor_type_string', title: '工作类型', align:'center',width:80}
+				,{field: 'labor_time', title: '工时', align:'center',width:80}
+				,{field:'create_time', title: '创建时间',width:150,align:'center'}
+				,{width:120,fixed:'right',title: '操作', align:'center',ignoreExport:true,templet: function(d){
+					var html='';
+					var btn1='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详细</a>';
+					if(d.admin_id !== login_admin){
+						return btn1;
+					}
+					else{
+						var btn2='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
+						var btn3='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
+						html = '<div class="layui-btn-group">'+btn1+btn2+btn3+'</div>';
+						return html;
+					}
+				}}
+			]]
+		});
+		
+		table.on('toolbar(table_work)',function (obj) {
+			if (obj.event === 'add') {
+				work.add(detail_id,{'id':0});
+			}
+		});	 
+		table.on('tool(table_work)',function (obj) {
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = obj.data;
+			if (obj.event === 'view') {
+				work.view(data);
+				return;
+			}
+			if (obj.event === 'edit') {
+				work.add(data.task_id,data);
+				return;
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要删除该内容吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/project/task/del", { id: data.id }, callback);
+					layer.close(index);
+				});
+				return;
+			}
+		});
+		
+		//工作记录相关
+		$('.add-schedule').on('click', function () {
+			work.add(detail_id,{'id':0});	
+		})
+		//回复
+		$('#comment_task_' + detail_id).on('click', '[data-event="replay"]', function () {
+			let pid = $(this).data('id');
+			let to_uid = $(this).data('uid');
+			let to_unames = $(this).data('unames');
+			comment.textarea(0,detail_id,'task','',pid,to_uid,to_unames);
+		})
+		//编辑
+		$('#comment_task_' + detail_id).on('click', '[data-event="edit"]', function () {
+			let id = $(this).data('id');
+			let content = $('#comment_' + id).data('content');
+			comment.textarea(id, detail_id, 'task', content,0,0,'');
+		})
+
+		//删除
+		$('#comment_task_' + detail_id).on('click', '[data-event="del"]', function () {
+			let id = $(this).data('id');
+			comment.del(id, detail_id, 'task');
+		})
+	}
+</script>
+{/block}
\ No newline at end of file
diff --git a/app/project/view/work/add.html b/app/project/view/work/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..d223f4ddf065f470cbd24e689bde5c26f4edb694
--- /dev/null
+++ b/app/project/view/work/add.html
@@ -0,0 +1,45 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">工作类型</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">工作类型名称<font>*</font></td>
+			<td><input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入工作类型名称" lay-reqText="请输入工作类型名称"class="layui-input" value="{$detail.title|default=''}"></td>
+			<td class="layui-td-gray">排序</td>
+			<td><input type="text" name="sort" placeholder="请输入排序，数字" autocomplete="off" class="layui-input" value="{$detail.sort|default=''}"></td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$detail.id|default=0}"/>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool'];
+
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/project/work/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/project/view/work/datalist.html b/app/project/view/work/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..ea199e1902c57cb626ed7db4c9729eac799ccc23
--- /dev/null
+++ b/app/project/view/work/datalist.html
@@ -0,0 +1,124 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<table class="layui-hide" id="table_work_cate" lay-filter="table_work_cate"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm add-new" type="button">+ 添加工作类型</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool;
+		
+		layui.pageTable = table.render({
+			elem: "#table_work_cate"
+			,toolbar: '#toolbarDemo'
+			,url: "/project/work/datalist"
+			,page: false
+			,limit: 999
+			,cellMinWidth: 80
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',title: '类型名称'}
+				,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+					var html1='<span class="green">正常</span>';
+					var html2='<span class="yellow">禁用</span>';
+					if(d.status==1){
+						return html1;
+					}
+					else{
+						return html2;
+					}
+				}}
+				,{width:100,title: '操作', align:'center',ignoreExport:true,templet: function(d){
+					var html='';
+					var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+					if(d.status==1){
+						html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+					}
+					else{
+						html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+					}
+					return html;
+				}}
+			]]
+		});
+			
+		table.on('tool(table_work_cate)',function (obj) {
+			if(obj.event === 'edit'){					
+				add_cate(obj.data.id,obj.data.title);
+			}
+			if(obj.event === 'disable'){
+				layer.confirm('确定要禁用该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/project/work/set", {id:obj.data.id,status: 0}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'open'){
+				layer.confirm('确定要启用该记录吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/project/work/set", {id:obj.data.id,status:1}, callback);
+					layer.close(index);
+				});
+			}
+		});
+		
+		$('body').on('click','.add-new',function(){
+			add_cate(0,'');	
+		});
+		
+		function add_cate(id,val){
+			var title = '新增类型';
+			if(id>0){
+				title = '编辑类型';
+			}
+			layer.prompt({
+				title: title,
+				value: val,
+				yes: function(index, layero) {
+					// 获取文本框输入的值
+					var value = layero.find(".layui-layer-input").val();
+					if (value) {
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();				
+							}
+						}
+						tool.post("/project/work/add", {id: id,title: value}, callback);
+						layer.close(index);
+					} else {
+						layer.msg('请填写类型名称');
+					}
+				}
+			})
+		}
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/project/view/work/view.html b/app/project/view/work/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..9bb19a503469f3702c952de1557b28034da9f6a6
--- /dev/null
+++ b/app/project/view/work/view.html
@@ -0,0 +1,16 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<h3 class="pb-3">工作类型详情</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">工作类型名称</td>
+			<td>{$detail.title|default=''}"></td>
+			<td class="layui-td-gray">排序</td>
+			<td>{$detail.sort|default=0}</td>
+		</tr>
+	</table>
+</div>
+{/block}
+<!-- /主体 -->
\ No newline at end of file
diff --git a/app/provider.php b/app/provider.php
new file mode 100644
index 0000000000000000000000000000000000000000..aee9966b35e9b72bb90eabf80c0a147ca11799a8
--- /dev/null
+++ b/app/provider.php
@@ -0,0 +1,7 @@
+<?php
+
+// 容器Provider定义文件
+return [
+    // 绑定自定义异常处理handle类
+    'think\exception\Handle'       => '\\app\\exception\\Http',
+];
diff --git a/app/user/common.php b/app/user/common.php
new file mode 100644
index 0000000000000000000000000000000000000000..e7e2f8a1b94dbe561e25e5f05c49ee8241cb65e7
--- /dev/null
+++ b/app/user/common.php
@@ -0,0 +1,14 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+use think\facade\Db;
diff --git a/app/user/controller/Api.php b/app/user/controller/Api.php
new file mode 100644
index 0000000000000000000000000000000000000000..956c6e0b39a1320ee3e6e6bf4c4731772d307afe
--- /dev/null
+++ b/app/user/controller/Api.php
@@ -0,0 +1,32 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+declare (strict_types = 1);
+namespace app\user\controller;
+
+use app\api\BaseController;
+use think\facade\Db;
+
+class Api extends BaseController
+{
+    //删除档案记录相关
+    public function del_profiles()
+    {
+        $id = get_params("id");
+		if (Db::name('AdminProfiles')->where('id', $id)->update(['delete_time'=>time()]) !== false) {
+			return to_assign(0, "删除成功");
+		} else {
+			return to_assign(1, "删除失败");
+		}
+    }
+
+}
diff --git a/app/user/controller/Basic.php b/app/user/controller/Basic.php
new file mode 100644
index 0000000000000000000000000000000000000000..95ca53bad7e0a0e0883e531bd6488e020e68cd91
--- /dev/null
+++ b/app/user/controller/Basic.php
@@ -0,0 +1,93 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\user\controller;
+
+use app\base\BaseController;
+use app\user\validate\BasicUserCheck;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Basic extends BaseController
+{	
+	public function datalist()
+    {
+        if (request()->isAjax()) {
+			$param = get_params();
+			$where=[];
+			if (!empty($param['types'])) {
+                $where[] = ['types', '=', $param['types']];
+            }
+            $list = Db::name('BasicUser')->where($where)->order('create_time asc')->select();
+            return to_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+    //新建编辑
+    public function add()
+    {
+        if (request()->isAjax()) {
+            $param = get_params();
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(BasicUserCheck::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['update_time'] = time();
+                $res = Db::name('BasicUser')->strict(false)->field('title,types,id,update_time')->update($param);
+                if ($res) {
+                    add_log('edit', $param['id'], $param);
+                }
+                return to_assign();
+            } else {
+                try {
+                    validate(BasicUserCheck::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['create_time'] = time();
+                $insertId = Db::name('BasicUser')->strict(false)->field('title,types,id,create_time')->insertGetId($param);
+                if ($insertId) {
+                    add_log('add', $insertId, $param);
+                }
+                return to_assign();
+            }
+        }
+    }
+	
+    //设置
+    public function set()
+    {
+		$param = get_params();
+        $res = Db::name('BasicUser')->strict(false)->field('id,status')->update($param);
+		if ($res) {
+			if($param['status'] == 0){
+				add_log('disable', $param['id'], $param);
+			}
+			else if($param['status'] == 1){
+				add_log('recovery', $param['id'], $param);
+			}
+			return to_assign();
+		}
+		else{
+			return to_assign(0, '操作失败');
+		}
+    }   
+}
diff --git a/app/user/controller/Care.php b/app/user/controller/Care.php
new file mode 100644
index 0000000000000000000000000000000000000000..51fa9bd1ff0057f682665f3bebb57fd7f9bcefcc
--- /dev/null
+++ b/app/user/controller/Care.php
@@ -0,0 +1,138 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\user\controller;
+
+use app\base\BaseController;
+use app\user\model\Care as CareModel;
+use app\user\validate\CareValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Care extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new CareModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+			$param = get_params();
+			$where=[];
+			$where[]=['delete_time','=',0];
+            if (!empty($param['keywords'])) {
+                $where[] = ['id|thing|remark', 'like', '%' . $param['keywords'] . '%'];
+            }
+            if (!empty($param['status'])) {
+                $where[] = ['status', '=', $param['status']];
+            }
+			if (!empty($param['care_cate'])) {
+                $where[] = ['care_cate', '=', $param['care_cate']];
+            }
+			if (!empty($param['uid'])) {
+                $where[] = ['uid', '=', $param['uid']];
+            }
+			if (!empty($param['diff_time'])) {
+				$diff_time =explode('~', $param['diff_time']);
+                $where[] = ['care_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1]))]];
+            }
+            $list = $this->model->datalist($where, $param);
+             return table_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {
+			$param['care_time'] = isset($param['care_time']) ? strtotime($param['care_time']) : 0;
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(CareValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(CareValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$param['admin_id'] = $this->uid;
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				$detail['user_name'] = Db::name('Admin')->where('id',$detail['uid'])->value('name');
+				$detail['care_time'] = date('Y-m-d',$detail['care_time']);
+				View::assign('detail', $detail);
+			}
+			View::assign('id', $id);
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			$detail['cate'] = Db::name('CareCate')->where('id',$detail['care_cate'])->value('title');
+			$detail['user_name'] = Db::name('Admin')->where('id',$detail['uid'])->value('name');
+			$detail['admin_name'] = Db::name('Admin')->where('id',$detail['admin_id'])->value('name');
+			$detail['care_time'] = date('Y-m-d',$detail['care_time']);
+			View::assign('detail', $detail);
+			return view();
+		}
+		else{
+			throw new \think\exception\HttpException(404, '找不到页面');
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		$param = get_params();
+		$id = isset($param['id']) ? $param['id'] : 0;
+        $this->model->delById($id);
+    }  
+
+}
diff --git a/app/user/controller/Carecate.php b/app/user/controller/Carecate.php
new file mode 100644
index 0000000000000000000000000000000000000000..08caa95b1804aa02db997cb572dedb2e0ff1ee2a
--- /dev/null
+++ b/app/user/controller/Carecate.php
@@ -0,0 +1,105 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\user\controller;
+
+use app\base\BaseController;
+use app\user\model\CareCate as CareCateModel;
+use app\user\validate\CareCateValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Carecate extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new CareCateModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+            $list = $this->model->select();
+            return to_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {		
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(CareCateValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(CareCateValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getCateById($id);
+			}
+			return view();
+		}
+    }
+    /**
+    * 设置
+    */
+    public function set()
+    {
+		$param = get_params();
+        $res = $this->model->strict(false)->field('id,status')->update($param);
+		if ($res) {
+			if($param['status'] == 0){
+				add_log('disable', $param['id'], $param);
+			}
+			else if($param['status'] == 1){
+				add_log('recovery', $param['id'], $param);
+			}
+			return to_assign();
+		}
+		else{
+			return to_assign(0, '操作失败');
+		}
+    }
+   
+
+}
diff --git a/app/user/controller/Department.php b/app/user/controller/Department.php
new file mode 100644
index 0000000000000000000000000000000000000000..d620e7c46089b87ed2d9593b910dec7a8a7e34b6
--- /dev/null
+++ b/app/user/controller/Department.php
@@ -0,0 +1,116 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\user\controller;
+
+use app\base\BaseController;
+use app\user\model\Department as DepartmentModel;
+use app\user\validate\DepartmentCheck;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Department extends BaseController
+{
+    public function index()
+    {
+        if (request()->isAjax()) {
+            $list = Db::name('Department')->order('sort desc,id asc')->select()->toArray();
+			foreach ($list as $key => &$v) {
+				$admin_array = Db::name('Admin')->where([['id','in',$v['leader_ids']]])->column('name');
+				$v['leader'] = split_array_field($admin_array);
+			}
+			$res = generateTree($list);
+            return to_assign(0, '', $res);
+        } else {
+            return view();
+        }
+    }
+
+    //添加部门
+    public function add()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+            if ($param['id'] > 0) {
+                try {
+                    validate(DepartmentCheck::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['update_time'] = time();
+                $department_array = get_department_son($param['id']);
+                if (in_array($param['pid'], $department_array)) {
+                    return to_assign(1, '上级部门不能是该部门本身或其下属部门');
+                } else {
+                    Db::name('Department')->strict(false)->field(true)->update($param);
+					$model = new DepartmentModel();
+					$model->update_auth_dids_son_dids();
+                    add_log('edit', $param['id'], $param);
+                    return to_assign();
+                }
+            } else {
+                try {
+                    validate(DepartmentCheck::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $did = Db::name('Department')->strict(false)->field(true)->insertGetId($param);
+				$model = new DepartmentModel();
+				$model->update_auth_dids_son_dids();
+                add_log('add', $did, $param);
+                return to_assign();
+            }
+        } else {
+            $id = isset($param['id']) ? $param['id'] : 0;
+            $pid = isset($param['pid']) ? $param['pid'] : 0;
+            $department = set_recursion(get_department());
+            if ($id > 0) {
+                $detail = Db::name('Department')->where(['id' => $id])->find();
+				//获取子部门
+				$department_array = get_department_son($id);
+                $users = get_department_employee($id);
+                View::assign('users', $users);
+                View::assign('detail', $detail);
+            }
+            View::assign('department', $department);
+            View::assign('pid', $pid);
+            View::assign('id', $id);
+            return view();
+        }
+    }
+
+    //删除
+    public function delete()
+    {
+        $id = get_params("id");
+        $count = Db::name('Department')->where([['pid', '=', $id], ['status', '>=', 0]])->count();
+        if ($count > 0) {
+            return to_assign(1, "该部门下还有子部门，无法删除");
+        }
+        $users = Db::name('Admin')->where([['did', '=', $id], ['status', '>=', 0]])->count();
+        if ($users > 0) {
+            return to_assign(1, "该部门下还有员工，无法删除");
+        }
+        if (Db::name('Department')->delete($id) !== false) {
+            add_log('delete', $id);
+            return to_assign(0, "删除部门成功");
+        } else {
+            return to_assign(1, "删除失败");
+        }
+    }
+}
diff --git a/app/user/controller/Files.php b/app/user/controller/Files.php
new file mode 100644
index 0000000000000000000000000000000000000000..000798de0f73b242226b6a9753a54c6b0861069e
--- /dev/null
+++ b/app/user/controller/Files.php
@@ -0,0 +1,387 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\user\controller;
+
+use app\base\BaseController;
+use app\user\model\Admin as AdminList;
+use think\facade\Db;
+use think\facade\View;
+
+class Files extends BaseController
+{
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+            $param = get_params();
+            $where = array();
+            $whereOr = array();
+            if (!empty($param['keywords'])) {
+                $where[] = ['a.id|a.username|a.name|a.nickname|a.mobile|a.desc', 'like', '%' . $param['keywords'] . '%'];
+            }
+			if (isset($param['status']) && $param['status']!='') {
+                $where[] = ['a.status', '=', $param['status']];
+            }
+			else{
+				$where[] = ['a.status', '<', 2];
+			}
+            if (!empty($param['political'])) {
+                $where[] = ['a.political', '=', $param['political']];
+            }
+			if (!empty($param['position_name'])) {
+                $where[] = ['a.position_name', '=', $param['position_name']];
+            }
+			if (!empty($param['position_rank'])) {
+                $where[] = ['a.position_rank', '=', $param['position_rank']];
+            }
+            if (!empty($param['did'])) {
+				$admin_array = Db::name('DepartmentAdmin')->where('department_id',$param['did'])->column('admin_id');
+				$map1=[
+					['a.id','in',$admin_array],
+				];
+				$map2=[
+					['a.did', '=', $param['did']],
+				];
+				$whereOr =[$map1,$map2];
+            }
+			$where[] = ['a.id', '>', 1];
+			$admin = AdminList::alias('a')
+				->with('departments')
+				->field('a.*,p.title as position,d.title as department')
+				->join('Department d', 'd.id = a.did','left')
+				->join('Position p', 'p.id = a.position_id','left')
+				->where($where)
+				->where(function ($query) use($whereOr) {
+					if (!empty($whereOr)){
+						$query->whereOr($whereOr);
+					}
+				})
+				->paginate(intval($this->pageSize))
+				->order('a.id desc')
+                ->each(function ($item, $key) {
+					//遍历次要部门数据
+					$departments = $item->departments->toArray();
+					if(empty($departments)){
+						$item->departments = '-';
+					}
+					else{
+						$item->departments = split_array_field($departments,'title');
+					}
+                    $item->entry_time = empty($item->entry_time) ? '-' : date('Y-m-d', $item->entry_time);
+                    $item->birthday = empty($item->birthday) ? '-' : date('Y-m-d', $item->birthday);
+                    $item->last_login_time = empty($item->last_login_time) ? '-' : date('Y-m-d H:i', $item->last_login_time);
+                    $item->last_login_ip = empty($item->last_login_ip) ? '-' : $item->last_login_ip;
+					if($item->political==1){
+						$item->political = '中共党员';
+					}
+					else if($item->political==2){
+						$item->political = '团员';
+					}
+					else{
+						$item->political = '-';
+					}
+                });
+            return table_assign(0, '', $admin);
+        } else {
+            return view();
+        }
+    }
+
+    //添加
+    public function add()
+    {
+        $param = get_params();
+		$id = isset($param['id'])?$param['id']:0;
+        if (request()->isAjax()) {
+            $param['birthday'] = empty($param['birthday']) ? '0':strtotime($param['birthday']);
+            $param['graduate_day'] = empty($param['graduate_day']) ? '0':strtotime($param['graduate_day']);
+            $param['work_date'] = empty($param['work_date']) ? '0':strtotime($param['work_date']);
+			if($id == 1){
+				return to_assign(1, '超级管理员信息不支持编辑');
+			}
+			$res = Db::name('Admin')->where(['id' => $id])->strict(false)->field(true)->update($param);
+			if($res!==false){
+				
+				//教育经历
+				$edu_start_time = isset($param['edu_start_time']) ? $param['edu_start_time'] : '';
+				$edu_end_time = isset($param['edu_end_time']) ? $param['edu_end_time'] : '';
+				$edu_title = isset($param['edu_title']) ? $param['edu_title'] : '';
+				$edu_speciality = isset($param['edu_speciality']) ? $param['edu_speciality'] : '';
+				$edu_education = isset($param['edu_education']) ? $param['edu_education'] : '';
+				$edu_remark = isset($param['edu_remark']) ? $param['edu_remark'] : '';
+				$edu_id = isset($param['edu_id']) ? $param['edu_id'] : 0;			
+
+				if ($edu_start_time) {
+					foreach ($edu_start_time as $key => $value) {
+						if (!$value && $value !=' ') {
+							continue;
+						}
+						$data = [];
+						$data['start_time'] = $value;
+						$data['end_time'] = $edu_end_time[$key];
+						$data['title'] = $edu_title[$key];
+						$data['speciality'] = $edu_speciality[$key];
+						$data['education'] = $edu_education[$key];
+						$data['remark'] = $edu_remark[$key];
+						$data['admin_id'] = $id;
+						$data['types'] = 1;
+						if($edu_id[$key]>0){
+							$data['id'] = $edu_id[$key];
+							$data['update_time'] = time();
+							Db::name('AdminProfiles')->strict(false)->field(true)->update($data);
+						}
+						else{
+							$data['create_uid'] = $this->uid;
+							$data['create_time'] = time();
+							$data['update_time'] = time();
+							$eid = Db::name('AdminProfiles')->strict(false)->field(true)->insertGetId($data);
+						}						
+					}
+				}
+			
+			
+				//工作经历			
+				$work_start_time = isset($param['work_start_time']) ? $param['work_start_time'] : '';
+				$work_end_time = isset($param['work_end_time']) ? $param['work_end_time'] : '';
+				$work_title = isset($param['work_title']) ? $param['work_title'] : '';
+				$work_position = isset($param['work_position']) ? $param['work_position'] : '';
+				$work_remark = isset($param['work_remark']) ? $param['work_remark'] : '';
+				$work_id = isset($param['work_id']) ? $param['work_id'] : 0;
+			
+				if ($work_start_time) {
+					foreach ($work_start_time as $key => $value) {
+						if (!$value && $value !=' ') {
+							continue;
+						}
+						$data = [];
+						$data['start_time'] = $value;
+						$data['end_time'] = $work_end_time[$key];
+						$data['title'] = $work_title[$key];
+						$data['position'] = $work_position[$key];
+						$data['remark'] = $work_remark[$key];
+						$data['admin_id'] = $id;
+						$data['types'] = 2;
+						if($work_id[$key]>0){
+							$data['id'] = $work_id[$key];
+							$data['update_time'] = time();
+							Db::name('AdminProfiles')->strict(false)->field(true)->update($data);
+						}
+						else{
+							$data['create_uid'] = $this->uid;
+							$data['create_time'] = time();
+							$data['update_time'] = time();
+							$eid = Db::name('AdminProfiles')->strict(false)->field(true)->insertGetId($data);
+						}						
+					}
+				}
+			
+				//相关证书
+				$certificate_start_time = isset($param['certificate_start_time']) ? $param['certificate_start_time'] : '';
+				$certificate_title = isset($param['certificate_title']) ? $param['certificate_title'] : '';
+				$certificate_authority = isset($param['certificate_authority']) ? $param['certificate_authority'] : '';
+				$certificate_remark = isset($param['certificate_remark']) ? $param['certificate_remark'] : '';
+				$certificate_id = isset($param['certificate_id']) ? $param['certificate_id'] : 0;
+
+				if ($certificate_start_time) {
+					foreach ($certificate_start_time as $key => $value) {
+						if (!$value && $value !=' ') {
+							continue;
+						}
+						$data = [];
+						$data['start_time'] = $value;
+						$data['title'] = $certificate_title[$key];
+						$data['authority'] = $certificate_authority[$key];
+						$data['remark'] = $certificate_remark[$key];
+						$data['admin_id'] = $id;
+						$data['types'] = 3;
+						if($certificate_id[$key]>0){
+							$data['id'] = $certificate_id[$key];
+							$data['update_time'] = time();
+							Db::name('AdminProfiles')->strict(false)->field(true)->update($data);
+						}
+						else{
+							$data['create_uid'] = $this->uid;
+							$data['create_time'] = time();
+							$data['update_time'] = time();
+							$eid = Db::name('AdminProfiles')->strict(false)->field(true)->insertGetId($data);
+						}						
+					}
+				}
+				
+				//计算机技能
+				$skills_title = isset($param['skills_title']) ? $param['skills_title'] : '';
+				$skills_know = isset($param['skills_know']) ? $param['skills_know'] : '';
+				$skills_remark = isset($param['skills_remark']) ? $param['skills_remark'] : '';
+				$skills_id = isset($param['skills_id']) ? $param['skills_id'] : 0;
+
+				if ($skills_title) {
+					foreach ($skills_title as $key => $value) {
+						if (!$value && $value !=' ') {
+							continue;
+						}
+						$data = [];
+						$data['title'] = $skills_title[$key];
+						$data['know'] = $skills_know[$key];
+						$data['remark'] = $skills_remark[$key];
+						$data['admin_id'] = $id;
+						$data['types'] = 4;
+						if($skills_id[$key]>0){
+							$data['id'] = $skills_id[$key];
+							$data['update_time'] = time();
+							Db::name('AdminProfiles')->strict(false)->field(true)->update($data);
+						}
+						else{
+							$data['create_uid'] = $this->uid;
+							$data['create_time'] = time();
+							$data['update_time'] = time();
+							$eid = Db::name('AdminProfiles')->strict(false)->field(true)->insertGetId($data);
+						}						
+					}
+				}
+				
+				//语言能力
+				$language_title = isset($param['language_title']) ? $param['language_title'] : '';
+				$language_know = isset($param['language_know']) ? $param['language_know'] : '';
+				$language_remark = isset($param['language_remark']) ? $param['language_remark'] : '';
+				$language_id = isset($param['language_id']) ? $param['language_id'] : 0;
+
+				if ($language_title) {
+					foreach ($language_title as $key => $value) {
+						if (!$value && $value !=' ') {
+							continue;
+						}
+						$data = [];
+						$data['title'] = $language_title[$key];
+						$data['know'] = $language_know[$key];
+						$data['remark'] = $language_remark[$key];
+						$data['admin_id'] = $id;
+						$data['types'] = 5;
+						if($language_id[$key]>0){
+							$data['id'] = $language_id[$key];
+							$data['update_time'] = time();
+							Db::name('AdminProfiles')->strict(false)->field(true)->update($data);
+						}
+						else{
+							$data['create_uid'] = $this->uid;
+							$data['create_time'] = time();
+							$data['update_time'] = time();
+							$eid = Db::name('AdminProfiles')->strict(false)->field(true)->insertGetId($data);
+						}						
+					}
+				}
+				
+				add_log('edit', $id, $param);
+				return to_assign();
+			}
+			else{
+				return to_assign(1, '提交失败');
+			}
+        } else {
+            $detail = get_admin($id);
+			$detail['pname'] = Db::name('Admin')->where('id',$detail['pid'])->value('name');
+			$detail['position'] = Db::name('Position')->where('id',$detail['position_id'])->value('title');
+			$detail['department'] = Db::name('Department')->where('id',$detail['did'])->value('title');
+			$department_ids = Db::name('DepartmentAdmin')->where('admin_id',$id)->column('department_id');
+			$department_names = Db::name('Department')->whereIn('id',$department_ids)->column('title');
+			$detail['department_names'] = implode(',',$department_names);
+			if($detail['birthday']>0){
+				$detail['birthday'] = date('Y-m-d',$detail['birthday']);
+			}
+			else{
+				$detail['birthday'] = '';
+			}
+			if($detail['graduate_day']>0){
+				$detail['graduate_day'] = date('Y-m-d',$detail['graduate_day']);
+			}
+			else{
+				$detail['graduate_day'] = '';
+			}
+			if($detail['work_date']>0){
+				$detail['work_date'] = date('Y-m-d',$detail['work_date']);
+			}
+			else{
+				$detail['work_date'] = '';
+			}
+			
+			if($detail['file_ids'] !=''){
+				$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+				$detail['file_array'] = $file_array;
+			}
+			
+			$edu = Db::name('AdminProfiles')->where(['types'=>1,'admin_id'=>$id,'delete_time'=>0])->select()->toArray();
+			$work = Db::name('AdminProfiles')->where(['types'=>2,'admin_id'=>$id,'delete_time'=>0])->select()->toArray();
+			$certificate = Db::name('AdminProfiles')->where(['types'=>3,'admin_id'=>$id,'delete_time'=>0])->select()->toArray();
+			$skills = Db::name('AdminProfiles')->where(['types'=>4,'admin_id'=>$id,'delete_time'=>0])->select()->toArray();
+			$language = Db::name('AdminProfiles')->where(['types'=>5,'admin_id'=>$id,'delete_time'=>0])->select()->toArray();
+            View::assign('edu', $edu);
+            View::assign('work', $work);
+            View::assign('skills', $skills);
+            View::assign('certificate', $certificate);
+            View::assign('language', $language);
+            View::assign('detail', $detail);
+            View::assign('id', $id);
+            return view();
+        }
+    }
+
+    //查看
+    public function view()
+    {
+		$param = get_params();
+		$id = isset($param['id'])?$param['id']:0;
+		$detail = get_admin($id);
+		$detail['pname'] = Db::name('Admin')->where('id',$detail['pid'])->value('name');
+		$detail['position'] = Db::name('Position')->where('id',$detail['position_id'])->value('title');
+		$detail['department'] = Db::name('Department')->where('id',$detail['did'])->value('title');
+		$department_ids = Db::name('DepartmentAdmin')->where('admin_id',$id)->column('department_id');
+		$department_names = Db::name('Department')->whereIn('id',$department_ids)->column('title');
+		$detail['department_names'] = implode(',',$department_names);
+		if($detail['birthday']>0){
+			$detail['birthday'] = date('Y-m-d',$detail['birthday']);
+		}
+		else{
+			$detail['birthday'] = '';
+		}
+		if($detail['graduate_day']>0){
+			$detail['graduate_day'] = date('Y-m-d',$detail['graduate_day']);
+		}
+		else{
+			$detail['graduate_day'] = '';
+		}
+		if($detail['work_date']>0){
+			$detail['work_date'] = date('Y-m-d',$detail['work_date']);
+		}
+		else{
+			$detail['work_date'] = '';
+		}
+		if($detail['file_ids'] !=''){
+			$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+			$detail['file_array'] = $file_array;
+		}
+		$edu = Db::name('AdminProfiles')->where(['types'=>1,'admin_id'=>$id,'delete_time'=>0])->select()->toArray();
+		$work = Db::name('AdminProfiles')->where(['types'=>2,'admin_id'=>$id,'delete_time'=>0])->select()->toArray();
+		$certificate = Db::name('AdminProfiles')->where(['types'=>3,'admin_id'=>$id,'delete_time'=>0])->select()->toArray();
+		$skills = Db::name('AdminProfiles')->where(['types'=>4,'admin_id'=>$id,'delete_time'=>0])->select()->toArray();
+		$language = Db::name('AdminProfiles')->where(['types'=>5,'admin_id'=>$id,'delete_time'=>0])->select()->toArray();
+		View::assign('edu', $edu);
+		View::assign('work', $work);
+		View::assign('skills', $skills);
+		View::assign('certificate', $certificate);
+		View::assign('language', $language);
+		View::assign('detail', $detail);
+		View::assign('id', $id);
+		return view();
+    }
+}
diff --git a/app/user/controller/Laborcontract.php b/app/user/controller/Laborcontract.php
new file mode 100644
index 0000000000000000000000000000000000000000..b2eb5e9ee6002d25b382ab8c75bc83f60af33b97
--- /dev/null
+++ b/app/user/controller/Laborcontract.php
@@ -0,0 +1,290 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\user\controller;
+
+use app\base\BaseController;
+use app\user\model\LaborContract as LaborContractModel;
+use app\user\validate\LaborContractValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Laborcontract extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new LaborContractModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+			$param = get_params();
+			$where=[];
+			$where[]=['delete_time','=',0];
+            if (!empty($param['status'])) {
+                $where[] = ['status', '=', $param['status']];
+            }
+			if (!empty($param['types'])) {
+                $where[] = ['types', '=', $param['types']];
+            }
+			if (!empty($param['cate'])) {
+                $where[] = ['cate', '=', $param['cate']];
+            }
+			if (!empty($param['properties'])) {
+                $where[] = ['properties', '=', $param['properties']];
+            }
+			if (!empty($param['uid'])) {
+                $where[] = ['uid', '=', $param['uid']];
+            }
+			if (!empty($param['diff_time'])) {
+				$diff_time =explode('~', $param['diff_time']);
+                $where[] = ['sign_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1]))]];
+            }
+            $list = $this->model->datalist($where, $param);
+             return table_assign(0, '', $list);
+        }
+        else{
+			$this->model::where([['end_time','<',time()],['status','=',1]])->update(['status'=>2]);
+			View::assign('cate', $this->model::$laborcontract_cate);
+			View::assign('types', $this->model::$laborcontract_types);
+			View::assign('properties', $this->model::$laborcontract_properties);
+			View::assign('status', $this->model::$laborcontract_status);
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {
+			$param['sign_time'] = isset($param['sign_time']) ? strtotime($param['sign_time']) : 0;
+			$param['start_time'] = isset($param['start_time']) ? strtotime($param['start_time']) : 0;
+			$param['end_time'] = isset($param['end_time']) ? strtotime($param['end_time']) : 0;
+			$param['trial_end_time'] = isset($param['trial_end_time']) ? strtotime($param['trial_end_time']) : 0;
+			if($param['end_time']<=$param['start_time']){
+				return to_assign(1,'合同失效时间需要大于开始时间');
+			}
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(LaborContractValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				if($param['end_time']<time() && $param['status']==1){
+					$param['status'] = 2;
+				}
+				if($param['end_time']>time() && $param['status']==2){
+					$param['status'] = 1;
+				}
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(LaborContractValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				if($param['end_time']<time()){
+					$param['status'] = 2;
+				}
+				$param['admin_id'] = $this->uid;
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			$cate_id = isset($param['cate_id']) ? $param['cate_id'] : 0;
+			View::assign('properties', $this->model::$laborcontract_properties);
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				$detail['user_name'] = Db::name('Admin')->where('id',$detail['uid'])->value('name');
+				if($detail['file_ids'] !=''){
+					$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+					$detail['file_array'] = $file_array;
+				}
+				View::assign('detail', $detail);
+				return view('edit');
+			}
+			$cate_title='';
+			if($cate_id>0){
+				$cate_title = $this->model::$laborcontract_cate[$cate_id-1]['title'];
+			}
+			View::assign('id', $id);
+			View::assign('cate_id', $cate_id);
+			View::assign('cate_title', $cate_title);
+			return view();
+		}
+    }
+	
+    /**
+    * 续签合同
+    */
+    public function add_renewal()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {
+			$param['sign_time'] = isset($param['sign_time']) ? strtotime($param['sign_time']) : 0;
+			$param['start_time'] = isset($param['start_time']) ? strtotime($param['start_time']) : 0;
+			$param['end_time'] = isset($param['end_time']) ? strtotime($param['end_time']) : 0;
+			$param['trial_end_time'] = isset($param['trial_end_time']) ? strtotime($param['trial_end_time']) : 0;
+			if($param['end_time']<=$param['start_time']){
+				return to_assign(1,'合同失效时间需要大于开始时间');
+			}
+			if($param['end_time']<time()){
+				$param['status'] = 3;
+			}
+			try {
+				validate(LaborContractValidate::class)->scene('add')->check($param);
+			} catch (ValidateException $e) {
+				// 验证失败 输出错误信息
+				return to_assign(1, $e->getError());
+			}
+			$param['admin_id'] = $this->uid;
+			$this->model->add($param);
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if($id>0){
+				$detail = $this->model->getById($id);
+				$detail['user_name'] = Db::name('Admin')->where('id',$detail['uid'])->value('name');
+				View::assign('detail', $detail);
+			}
+			View::assign('properties', $this->model::$laborcontract_properties);
+			return view();
+		}
+    }
+	
+    /**
+    * 变更合同
+    */
+    public function add_change()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {
+			$param['sign_time'] = isset($param['sign_time']) ? strtotime($param['sign_time']) : 0;
+			$param['start_time'] = isset($param['start_time']) ? strtotime($param['start_time']) : 0;
+			$param['end_time'] = isset($param['end_time']) ? strtotime($param['end_time']) : 0;
+			$param['trial_end_time'] = isset($param['trial_end_time']) ? strtotime($param['trial_end_time']) : 0;
+			if($param['end_time']<=$param['start_time']){
+				return to_assign(1,'合同失效时间需要大于开始时间');
+			}
+			if($param['end_time']<time()){
+				$param['status'] = 3;
+			}
+			try {
+				validate(LaborContractValidate::class)->scene('add')->check($param);
+			} catch (ValidateException $e) {
+				// 验证失败 输出错误信息
+				return to_assign(1, $e->getError());
+			}
+			$param['admin_id'] = $this->uid;
+			$this->model->add($param);
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if($id>0){
+				$detail = $this->model->getById($id);
+				$detail['user_name'] = Db::name('Admin')->where('id',$detail['uid'])->value('name');
+				View::assign('detail', $detail);
+			}
+			View::assign('properties', $this->model::$laborcontract_properties);
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			$detail['cate_str'] = $this->model::$laborcontract_cate[$detail['cate']-1]['title'];
+			$detail['types_str'] = $this->model::$laborcontract_types[$detail['types']];
+			$detail['properties_str'] = $this->model::$laborcontract_properties[$detail['properties']];
+			$detail['status_str'] = $this->model::$laborcontract_status[$detail['status']];
+			$detail['user_name'] = Db::name('Admin')->where('id',$detail['uid'])->value('name');
+			$detail['admin_name'] = Db::name('Admin')->where('id',$detail['admin_id'])->value('name');
+			if($detail['file_ids'] !=''){
+				$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+				$detail['file_array'] = $file_array;
+			}
+			if($detail['renewal_pid'] > 0){
+				$detail['renewal_ptitle'] = Db::name('LaborContract')->where('id',$detail['renewal_pid'])->value('title');
+			}
+			if($detail['change_pid'] > 0){
+				$detail['change_ptitle'] = Db::name('LaborContract')->where('id',$detail['change_pid'])->value('title');
+			}
+			View::assign('detail', $detail);
+			View::assign('renewal', Db::name('LaborContract')->where(['renewal_pid'=>$id,'delete_time'=>0])->find());
+			View::assign('change', Db::name('LaborContract')->where(['change_pid'=>$id,'delete_time'=>0])->find());
+			return view();
+		}
+		else{
+			throw new \think\exception\HttpException(404, '找不到页面');
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		$param = get_params();
+		$id = isset($param['id']) ? $param['id'] : 0;
+		if (request()->isDelete()) {
+			$this->model->delById($id);
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    }  
+
+   /**
+    * 解除、恢复
+    */
+    public function set($id,$status)
+    {
+		if (request()->isAjax()) {
+			$param = get_params();
+			$renewal = Db::name('LaborContract')->where(['renewal_pid'=>$id,'delete_time'=>0])->count();
+			$change = Db::name('LaborContract')->where(['change_pid'=>$id,'delete_time'=>0])->count();			
+			if($renewal>0 || $change>0){
+				return to_assign(1, "已续签或者已变更的合同不支持该操作");
+			}
+			$this->model::where('id', $id)->strict(false)->field(true)->update(['status'=>$status]);
+			if($status==3){
+				add_log('secure', $id, $param);
+			}
+			else{
+				add_log('recovery', $id, $param);
+			}
+			return to_assign();
+		} else {
+            return to_assign(1, "错误的请求");
+        }
+    } 
+
+}
diff --git a/app/user/controller/Personal.php b/app/user/controller/Personal.php
new file mode 100644
index 0000000000000000000000000000000000000000..0d98ca747852e4ee7c5c627c3be6741f1d26aea9
--- /dev/null
+++ b/app/user/controller/Personal.php
@@ -0,0 +1,237 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\user\controller;
+
+use app\base\BaseController;
+use app\user\model\DepartmentChange as DepartmentChange;
+use app\user\model\PersonalQuit as PersonalQuit;
+use app\user\model\Department as DepartmentModel;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Personal extends BaseController
+{
+    //调部门列表
+    public function change()
+    {
+        if (request()->isAjax()) {
+            $param = get_params();
+			$where = [];
+            if (!empty($param['keywords'])) {
+                $where[] = ['u.name|p.remark|a.title|b.title','like', '%' . $param['keywords'] . '%'];
+            }
+            $where[] = ['p.status','=', 1];
+            $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+            $list = DepartmentChange::where($where)
+                ->field('p.*,u.name as name,ad.name as admin')
+                ->alias('p')
+                ->join('admin u', 'p.uid = u.id', 'LEFT')
+                ->join('admin ad', 'p.admin_id = ad.id', 'LEFT')              
+                ->order('p.id desc')
+				->paginate(['list_rows'=> $rows])
+                ->each(function ($item, $key) {
+                    $item->move_time = date('Y-m-d', $item->move_time);
+					$adepartment = Db::name('Department')->whereIn('id',$item->from_did)->column('title');
+					$item->adepartment = implode(',', $adepartment);
+					$bdepartment = Db::name('Department')->whereIn('id',$item->to_did)->column('title');
+					$item->bdepartment = implode(',', $bdepartment);
+                });
+            return table_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+
+    //新增&编辑调部门
+    public function change_add()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+            if ($param['id'] > 0) {
+                $param['update_time'] = time();
+                $res = Db::name('DepartmentChange')->strict(false)->field(true)->update($param);
+                add_log('edit', $param['id'], $param);
+            } else {
+				$uid = $param['uid'];
+				$map = [];
+				$map[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',leader_ids)")];
+				$count = Db::name('Department')->where($map)->count();
+				if($count>0){
+					return to_assign(1,'请先撤销该员工的部门负责人头衔再调部门');
+				}
+				$param['move_time'] = isset($param['move_time']) ? strtotime($param['move_time']) : 0;
+                $param['create_time'] = time();
+                $param['admin_id'] = $this->uid;
+                $res = Db::name('DepartmentChange')->strict(false)->field(true)->insertGetId($param);
+				if ($res!==false) {
+					add_log('add', $res, $param);
+					Db::name('Admin')->where('id', $param['uid'])->update(['did' => $param['to_did']]);
+					Db::name('DepartmentAdmin')->where(['admin_id'=>$param['uid'],'department_id'=>$param['to_did']])->delete();
+					
+					$info = Db::name('Admin')->where('id', $param['uid'])->find();
+					$model = new DepartmentModel();
+					$auth_dids = $model->get_auth_departments($info);
+					$son_dids = $model->get_son_departments($info);
+					Db::name('Admin')->where('id',$param['uid'])->update(['auth_dids'=>$auth_dids,'son_dids'=>$son_dids]);
+				}
+            }
+            return to_assign();
+        } else {
+            $id = isset($param['id']) ? $param['id'] : 0;
+            $department = set_recursion(get_department());
+            if ($id > 0) {
+                $detail = Db::name('DepartmentChange')->where(['id' => $id])->find();
+                $detail['name'] = Db::name('Admin')->where(['id' => $detail['uid']])->value('name');
+                $detail['from_department'] = Db::name('Department')->where(['id' => $detail['from_did']])->value('title');
+                $detail['move_time'] = date('Y-m-d', $detail['move_time']);
+                View::assign('detail', $detail);
+            }
+            View::assign('department', $department);
+            View::assign('id', $id);
+            return view();
+        }
+    }
+
+    //离职
+    public function leave()
+    {
+        if (request()->isAjax()) {
+            $param = get_params();
+            $where = array();
+            if (!empty($param['keywords'])) {
+                $where['u.name|p.remark'] = ['like', '%' . $param['keywords'] . '%'];
+            }
+            $where['p.status'] = array('eq', 1);
+            $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+            $list = PersonalQuit::where($where)
+                ->field('p.*,u.name as name,ps.title as position')
+                ->alias('p')
+                ->join('admin u', 'p.uid = u.id', 'LEFT')
+                ->join('position ps', 'u.position_id = ps.id', 'LEFT')
+                ->order('p.id desc')
+                ->paginate(['list_rows'=> $rows])
+                ->each(function ($item, $key) {
+                    $item->quit_time = date('Y-m-d', $item->quit_time);
+					$item->connect_time_str='-';
+					if($item->connect_time>0){
+						$item->connect_time_str = date('Y-m-d', $item->connect_time);
+					}
+                    $item->lead_admin = Db::name('admin')->where(['id' => $item->lead_admin_id])->value('name');
+                    $item->connect_name = Db::name('admin')->where(['id' => $item->connect_id])->value('name');
+                    $this_uids_name = Db::name('admin')->where([['id','in', $item->connect_uids]])->column('name');
+                    $item->connect_names = implode(',', $this_uids_name);
+					
+					$dids =  Db::name('DepartmentAdmin')->where('admin_id',$item->uid)->column('department_id');
+					$department = Db::name('Department')->whereIn('id',$dids)->column('title');
+					$item->department = implode(',', $department);
+                });
+            return table_assign(0, '', $list);
+        } else {
+            return view();
+        }
+    }
+
+    //添加离职档案
+    public function leave_add()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+            $param['quit_time'] = isset($param['quit_time']) ? strtotime($param['quit_time']) : 0;
+            if ($param['id'] > 0) {
+                $param['update_time'] = time();
+                $res = Db::name('PersonalQuit')->strict(false)->field(true)->update($param);
+                add_log('edit', $param['id'], $param);
+            } else {
+                $param['create_time'] = time();
+                $param['admin_id'] = $this->uid;
+                $res = Db::name('PersonalQuit')->strict(false)->field(true)->insertGetId($param);
+                add_log('add', $res, $param);
+            }
+            if ($res!==false) {
+                Db::name('Admin')->where('id', $param['uid'])->update(['status' => 2]);
+            }
+            return to_assign();
+        } else {
+            $id = isset($param['id']) ? $param['id'] : 0;
+            $where = array();
+            if ($id>0) {
+                $where['p.id'] = array('eq', $id);
+                $detail = Db::name('PersonalQuit')
+                    ->field('p.*,u.name as name,l.name as lead_admin_name')
+                    ->alias('p')
+                    ->join('admin u', 'p.uid = u.id', 'LEFT')
+                    ->join('admin l', 'p.lead_admin_id = l.id', 'LEFT')
+                    ->where($where)
+                    ->find();
+                $this_uids_name = Db::name('Admin')->where([['id','in', $detail['connect_uids']]])->column('name');
+                $detail['connect_names'] = implode(',', $this_uids_name);
+                $detail['quit_time'] = date('Y-m-d', $detail['quit_time']);
+				$detail['connect_name'] = Db::name('admin')->where(['id' => $detail['connect_id']])->value('name');
+				
+				$dids =  Db::name('DepartmentAdmin')->where('admin_id',$detail['uid'])->column('department_id');
+				$department = Db::name('Department')->whereIn('id',$dids)->column('title');
+				$detail['department'] = implode(',', $department);
+                View::assign('detail', $detail);
+            }
+            View::assign('id', $id);
+            return view();
+        }
+    }
+
+    //删除离职档案
+    public function leave_delete()
+    {
+        $id = get_params("id");
+        $data['status'] = '-1';
+        $data['id'] = $id;
+        $data['update_time'] = time();
+        if (Db::name('PersonalQuit')->update($data) !== false) {
+            $uid = Db::name('PersonalQuit')->where('id', $id)->value('uid');
+            Db::name('Admin')->where('id', $uid)->update(['status' => 1]);
+            add_log('delete', $id);
+            return to_assign(0, "删除成功");
+        } else {
+            return to_assign(1, "删除失败");
+        }
+    }
+	
+	//一键交接资料
+    public function leave_check()
+    {
+        $id = get_params("id");
+        $data['id'] = $id;
+        $data['connect_time'] = time();
+		$detail = Db::name('PersonalQuit')->where('id', $id)->find();
+        $uid =  $detail['uid'];
+        $connect_uid = $detail['connect_id'];
+        if (Db::name('PersonalQuit')->update($data) !== false) {
+			//项目负责人
+            Db::name('Project')->where([['director_uid','=',$uid],['status','<',3]])->update(['director_uid' => $connect_uid]);
+			//任务负责人
+            Db::name('ProjectTask')->where([['director_uid','=',$uid],['status','<',3]])->update(['director_uid' => $connect_uid]);			
+			//客户所属人
+			$did = Db::name('Admin')->where('id', $connect_uid)->value('did');
+            Db::name('Customer')->where([['belong_uid','=',$uid]])->update(['belong_uid' => $connect_uid,'belong_did'=>$did]);
+			//合同
+            Db::name('Contract')->where([['admin_id','=',$uid],['check_status','<',3]])->update(['admin_id' => $connect_uid]);
+            add_log('hand', $id);
+            return to_assign(0, "交接成功");
+        } else {
+            return to_assign(1, "交接失败");
+        }
+    }
+}
diff --git a/app/user/controller/Position.php b/app/user/controller/Position.php
new file mode 100644
index 0000000000000000000000000000000000000000..0e9d08924fc26cf8462120c0e26741cfbc5f692d
--- /dev/null
+++ b/app/user/controller/Position.php
@@ -0,0 +1,186 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\user\controller;
+
+use app\base\BaseController;
+use app\user\validate\PositionCheck;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Position extends BaseController
+{
+    public function index()
+    {
+        if (request()->isAjax()) {
+            $list = Db::name('Position')->where('status', '>=', 0)->order('create_time asc')->select()->toArray();
+            foreach ($list as &$val) {
+                $groupId = Db::name('PositionGroup')->where(['pid' => $val['id']])->column('group_id');
+                $groupName = Db::name('AdminGroup')->where('id', 'in', $groupId)->column('title');
+                $val['groupName'] = implode(',', $groupName);
+            }
+            $res['data'] = $list;
+            return table_assign(0, '', $res);
+        } else {
+            return view();
+        }
+    }
+
+    //添加&编辑
+    public function add()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+            if (!empty($param['id']) && $param['id'] > 0) {
+                if($param['id']==1){
+                    return to_assign(1, '超级管理员不能编辑');
+                }
+                try {
+                    validate(PositionCheck::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                // 启动事务
+                Db::startTrans();
+                try {
+                    Db::name('Position')->where(['id' => $param['id']])->strict(false)->field(true)->update($param);
+                    Db::name('PositionGroup')->where(['pid' => $param['id']])->delete();
+                    foreach ($param['group_id'] as $k => $v) {
+                        $data[$k] = [
+                            'pid' => $param['id'],
+                            'group_id' => $v,
+                            'create_time' => time(),
+                        ];
+                    }
+                    Db::name('PositionGroup')->strict(false)->field(true)->insertAll($data);
+                    add_log('edit', $param['id'], $param);
+                    //清除菜单\权限缓存
+                    clear_cache('adminMenu');
+                    clear_cache('adminRules');
+                    // 提交事务
+                    Db::commit();
+                } catch (\Exception $e) {
+                    // 回滚事务
+                    Db::rollback();
+                    return to_assign(1, '提交失败:' . $e->getMessage());
+                }
+            } else {
+                try {
+                    validate(PositionCheck::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                // 启动事务
+                Db::startTrans();
+                try {
+                    $uid = Db::name('Position')->strict(false)->field(true)->insertGetId($param);
+                    foreach ($param['group_id'] as $k => $v) {
+                        $data[$k] = [
+                            'pid' => $uid,
+                            'group_id' => $v,
+                            'create_time' => time(),
+                        ];
+                    }
+                    Db::name('PositionGroup')->strict(false)->field(true)->insertAll($data);
+                    add_log('add', $uid, $param);
+                    // 提交事务
+                    Db::commit();
+                } catch (\Exception $e) {
+                    // 回滚事务
+                    Db::rollback();
+                    return to_assign(1, '提交失败:' . $e->getMessage());
+                }
+            }
+            return to_assign();
+        }
+        else{
+            $id = isset($param['id']) ? $param['id'] : 0;
+            $group = Db::name('AdminGroup')->order('create_time asc')->select()->toArray();
+            if ($id > 0) {
+                $detail = Db::name('Position')->where(['id' => $id])->find();
+                $detail['group_id'] = Db::name('PositionGroup')->where(['pid' => $id])->column('group_id');
+                foreach ($group as &$val) {
+                    if (in_array($val['id'], $detail['group_id'])) {
+                        $val['checked'] = 1;
+                    } else {
+                        $val['checked'] = 0;
+                    }
+                }
+                View::assign('detail', $detail);
+            }
+            View::assign('group', $group);
+            View::assign('id', $id);
+            return view();
+        }
+    }
+
+    //查看
+    public function view()
+    {
+        $id = get_params('id');
+        $group = Db::name('AdminGroup')->order('create_time asc')->select()->toArray();
+        $detail = Db::name('Position')->where(['id' => $id])->find();
+        $detail['group_id'] = Db::name('PositionGroup')->where(['pid' => $id])->column('group_id');
+        foreach ($group as &$val) {
+            if (in_array($val['id'], $detail['group_id'])) {
+                $val['checked'] = 1;
+            } else {
+                $val['checked'] = 0;
+            }
+        }
+
+        $rule = Db::name('AdminRule')->order('sort asc,id asc')->select()->toArray();
+        $user_groups = Db::name('PositionGroup')
+            ->alias('a')
+            ->join("AdminGroup g", "a.group_id=g.id", 'LEFT')
+            ->where("a.pid='{$id}' and g.status='1'")
+            ->select()
+            ->toArray();
+        $groups = $user_groups ?: [];
+
+        $rules = [];
+        foreach ($groups as $g) {
+            $rules = array_merge($rules, explode(',', trim($g['rules'], ',')));
+        }
+        $rules = array_unique($rules);
+
+        $role_rule = create_tree_list(0, $rule, $rules);
+        View::assign('role_rule', $role_rule);
+        View::assign('detail', $detail);
+        View::assign('group', $group);
+        add_log('view', $id);
+        return view();
+    }
+    //删除
+    public function delete()
+    {
+        $id = get_params("id");
+        if ($id == 1) {
+            return to_assign(0, "超级岗位，不能删除");
+        }
+        $data['status'] = '-1';
+        $data['id'] = $id;
+        $data['update_time'] = time();
+        if (Db::name('Position')->update($data) !== false) {
+            add_log('delete', $id);
+            return to_assign(0, "删除岗位成功");
+        } else {
+            return to_assign(1, "删除失败");
+        }
+    }
+}
diff --git a/app/user/controller/Rewards.php b/app/user/controller/Rewards.php
new file mode 100644
index 0000000000000000000000000000000000000000..0850d22074c1c26c57e82d857caef7b8353a50ae
--- /dev/null
+++ b/app/user/controller/Rewards.php
@@ -0,0 +1,141 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\user\controller;
+
+use app\base\BaseController;
+use app\user\model\Rewards as RewardsModel;
+use app\user\validate\RewardsValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Rewards extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new RewardsModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+			$param = get_params();
+			$where=[];
+			$where[]=['delete_time','=',0];
+            if (!empty($param['keywords'])) {
+                $where[] = ['id|thing|remark', 'like', '%' . $param['keywords'] . '%'];
+            }
+            if (!empty($param['status'])) {
+                $where[] = ['status', '=', $param['status']];
+            }
+			if (!empty($param['types'])) {
+                $where[] = ['types', '=', $param['types']];
+            }
+			if (!empty($param['rewards_cate'])) {
+                $where[] = ['rewards_cate', '=', $param['rewards_cate']];
+            }
+			if (!empty($param['uid'])) {
+                $where[] = ['uid', '=', $param['uid']];
+            }
+			if (!empty($param['diff_time'])) {
+				$diff_time =explode('~', $param['diff_time']);
+                $where[] = ['rewards_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1]))]];
+            }
+            $list = $this->model->datalist($where, $param);
+            return table_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {
+			$param['rewards_time'] = isset($param['rewards_time']) ? strtotime($param['rewards_time']) : 0;
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(RewardsValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(RewardsValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$param['admin_id'] = $this->uid;
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getById($id);
+				$detail['user_name'] = Db::name('Admin')->where('id',$detail['uid'])->value('name');
+				$detail['rewards_time'] = date('Y-m-d',$detail['rewards_time']);
+				View::assign('detail', $detail);
+			}
+			View::assign('id', $id);
+			return view();
+		}
+    }
+	
+    /**
+    * 查看
+    */
+    public function view($id)
+    {
+		$detail = $this->model->getById($id);
+		if (!empty($detail)) {
+			$detail['cate'] = Db::name('RewardsCate')->where('id',$detail['rewards_cate'])->value('title');
+			$detail['user_name'] = Db::name('Admin')->where('id',$detail['uid'])->value('name');
+			$detail['admin_name'] = Db::name('Admin')->where('id',$detail['admin_id'])->value('name');
+			$detail['rewards_time'] = date('Y-m-d',$detail['rewards_time']);
+			View::assign('detail', $detail);
+			return view();
+		}
+		else{
+			throw new \think\exception\HttpException(404, '找不到页面');
+		}
+    }
+	
+   /**
+    * 删除
+    */
+    public function del()
+    {
+		$param = get_params();
+		$id = isset($param['id']) ? $param['id'] : 0;
+        $this->model->delById($id);
+    }  
+
+}
diff --git a/app/user/controller/Rewardscate.php b/app/user/controller/Rewardscate.php
new file mode 100644
index 0000000000000000000000000000000000000000..fb7e9f198e9f1bd0833c4fa5f5244dc658ffd887
--- /dev/null
+++ b/app/user/controller/Rewardscate.php
@@ -0,0 +1,105 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+ 
+declare (strict_types = 1);
+
+namespace app\user\controller;
+
+use app\base\BaseController;
+use app\user\model\RewardsCate as RewardsCateModel;
+use app\user\validate\RewardsCateValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class Rewardscate extends BaseController
+{
+	/**
+     * 构造函数
+     */
+	protected $model;
+    public function __construct()
+    {
+		parent::__construct(); // 调用父类构造函数
+        $this->model = new RewardsCateModel();
+    }
+	
+    /**
+    * 数据列表
+    */
+    public function datalist()
+    {
+        if (request()->isAjax()) {
+            $list = $this->model->select();
+            return to_assign(0, '', $list);
+        }
+        else{
+            return view();
+        }
+    }
+	
+    /**
+    * 添加/编辑
+    */
+    public function add()
+    {
+		$param = get_params();	
+        if (request()->isAjax()) {		
+            if (!empty($param['id']) && $param['id'] > 0) {
+                try {
+                    validate(RewardsCateValidate::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$this->model->edit($param);
+            } else {
+                try {
+                    validate(RewardsCateValidate::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $this->model->add($param);
+            }	 
+        }else{
+			$id = isset($param['id']) ? $param['id'] : 0;
+			if ($id>0) {
+				$detail = $this->model->getCateById($id);
+			}
+			return view();
+		}
+    }
+    /**
+    * 设置
+    */
+    public function set()
+    {
+		$param = get_params();
+        $res = $this->model->strict(false)->field('id,status')->update($param);
+		if ($res) {
+			if($param['status'] == 0){
+				add_log('disable', $param['id'], $param);
+			}
+			else if($param['status'] == 1){
+				add_log('recovery', $param['id'], $param);
+			}
+			return to_assign();
+		}
+		else{
+			return to_assign(0, '操作失败');
+		}
+    }
+   
+
+}
diff --git a/app/user/controller/User.php b/app/user/controller/User.php
new file mode 100644
index 0000000000000000000000000000000000000000..9f1f43145a82509807033664bc00a23614efbc66
--- /dev/null
+++ b/app/user/controller/User.php
@@ -0,0 +1,373 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+
+namespace app\user\controller;
+
+use app\base\BaseController;
+use app\user\model\Admin as AdminList;
+use app\user\model\Department as DepartmentModel;
+use app\user\validate\AdminCheck;
+use avatars\MDAvatars;
+use Overtrue\Pinyin\Pinyin;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\View;
+
+class User extends BaseController
+{
+    public function index()
+    {
+        if (request()->isAjax()) {
+            $param = get_params();
+            $where = array();
+            $whereOr = array();
+            if (!empty($param['keywords'])) {
+                $where[] = ['a.id|a.username|a.name|a.nickname|a.mobile|a.desc', 'like', '%' . $param['keywords'] . '%'];
+            }
+            if (isset($param['status']) && $param['status']!='') {
+                $where[] = ['a.status', '=', $param['status']];
+            }
+			else{
+				$where[] = ['a.status', '<', 2];
+			}
+            if (!empty($param['type'])) {
+                $where[] = ['a.type', '=', $param['type']];
+            }
+            if (!empty($param['did'])) {
+				$admin_array = Db::name('DepartmentAdmin')->where('department_id',$param['did'])->column('admin_id');
+				$map1=[
+					['a.id','in',$admin_array],
+				];
+				$map2=[
+					['a.did', '=', $param['did']],
+				];
+				$whereOr =[$map1,$map2];
+            }
+			$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+			$admin = AdminList::alias('a')
+				->with('departments')
+				->field('a.*,p.title as position,d.title as department')
+				->join('Department d', 'd.id = a.did','left')
+				->join('Position p', 'p.id = a.position_id','left')
+				->where($where)
+				->where(function ($query) use($whereOr) {
+					if (!empty($whereOr)){
+						$query->whereOr($whereOr);
+					}
+				})
+				->paginate(['list_rows'=> $rows])
+				->order('a.id desc')
+                ->each(function ($item, $key) {
+					//遍历次要部门数据
+					$departments = $item->departments->toArray();
+					if(empty($departments)){
+						$item->departments = '-';
+					}
+					else{
+						$item->departments = split_array_field($departments,'title');
+					}
+                    $item->entry_time = empty($item->entry_time) ? '-' : date('Y-m-d', $item->entry_time);
+                    $item->last_login_time = empty($item->last_login_time) ? '-' : date('Y-m-d H:i', $item->last_login_time);
+                    $item->last_login_ip = empty($item->last_login_ip) ? '-' : $item->last_login_ip;
+                });
+            return table_assign(0, '', $admin);
+        } else {
+            return view();
+        }
+    }
+
+    //生成登录名
+    public function create_name($name,$id=0,$total=0,$old='')
+    {
+		$count = Db::name('Admin')->where([['username','=',$name],['id','<>',$id]])->count();
+		if($total==0){
+			$old = $name;
+		}
+		$total++;
+		if($count>0){
+			$newname = $old.$total;
+			$name = $this->create_name($newname,$id,$total,$old);
+		}
+		return $name;
+    }
+
+    //添加
+    public function add()
+    {
+        $param = get_params();
+        if (request()->isAjax()) {
+			$id = isset($param['id'])?$param['id']:0;
+            $param['entry_time'] = strtotime($param['entry_time']);
+            $param['nickname'] = $param['name'];
+            if ($id > 0) {
+				if($id == 1){
+					return to_assign(1, '超级管理员信息不支持编辑');
+				}
+                try {
+                    validate(AdminCheck::class)->scene('edit')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+				$detail = get_admin($param['id']);
+				$department_ids = Db::name('DepartmentAdmin')->where('admin_id',$param['id'])->column('department_id');
+				$detail['department_ids'] = implode(',',$department_ids);
+                // 启动事务
+                Db::startTrans();
+                try {
+                    Db::name('Admin')->where(['id' => $id])->strict(false)->field(true)->update($param);
+					if($detail['department_ids'] != $param['department_ids']){
+						Db::name('DepartmentAdmin')->where('admin_id',$id)->whereIn('department_id', $detail['department_ids'])->delete();
+						if(!empty($param['department_ids'])){
+							$dids = explode(',',$param['department_ids']);
+							foreach ($dids as $did) {
+								Db::name('DepartmentAdmin')->insert(['admin_id'=>$param['id'],'department_id'=>$did,'create_time' => time()]);
+							}
+						}
+					}
+                    if(empty($param['thumb'])){
+                        $char = mb_substr($param['name'], 0, 1, 'utf-8');
+                        Db::name('Admin')->where('id', $id)->update(['thumb' => $this->to_avatars($char)]);
+                    }
+					$info = Db::name('Admin')->where('id', $id)->find();
+					$model = new DepartmentModel();
+					$auth_dids = $model->get_auth_departments($info);
+					$son_dids = $model->get_son_departments($info);
+					Db::name('Admin')->where('id',$id)->update(['auth_dids'=>$auth_dids,'son_dids'=>$son_dids]);
+                    add_log('edit', $id, $param);
+                    //清除菜单\权限缓存
+                    clear_cache('adminMenu');
+                    // 提交事务
+                    Db::commit();
+                } catch (\Exception $e) {
+                    // 回滚事务
+                    Db::rollback();
+                    return to_assign(1, '提交失败:' . $e->getMessage());
+                }
+            } else {
+				$username = Pinyin::name($param['name'],'none')->join('');
+				$param['username'] = $this->create_name($username,$id);
+                try {
+                    validate(AdminCheck::class)->scene('add')->check($param);
+                } catch (ValidateException $e) {
+                    // 验证失败 输出错误信息
+                    return to_assign(1, $e->getError());
+                }
+                $param['create_time'] = time();
+                $param['salt'] = set_salt(20);
+                $param['pwd'] = set_password($param['reg_pwd'], $param['salt']);
+                // 启动事务
+                Db::startTrans();
+                try {
+                    $uid = Db::name('Admin')->strict(false)->field(true)->insertGetId($param);
+					if(!empty($param['department_ids'])){
+						$dids = explode(',',$param['department_ids']);
+						foreach ($dids as $did) {
+							Db::name('DepartmentAdmin')->insert(['admin_id'=>$uid,'department_id'=>$did,'create_time' => time()]);
+						}
+					}
+                    if(empty($param['thumb'])){
+                        $char = mb_substr($param['name'], 0, 1, 'utf-8');
+                        Db::name('Admin')->where('id', $uid)->update(['thumb' => $this->to_avatars($char)]);
+                    }
+					$info = Db::name('Admin')->where('id', $uid)->find();
+					$model = new DepartmentModel();
+					$auth_dids = $model->get_auth_departments($info);
+					$son_dids = $model->get_son_departments($info);
+					Db::name('Admin')->where('id',$uid)->update(['auth_dids'=>$auth_dids,'son_dids'=>$son_dids]);
+                    add_log('add', $uid, $param);
+                    // 提交事务
+                    Db::commit();
+                } catch (\Exception $e) {
+                    // 回滚事务
+                    Db::rollback();
+                    return to_assign(1, '提交失败:' . $e->getMessage());
+                }
+            }
+            return to_assign();
+        } else {
+            $id = isset($param['id']) ? $param['id'] : 0;
+            $department = set_recursion(get_department());
+            $position = Db::name('Position')->where('status', '>=', 0)->order('create_time asc')->select();
+            if ($id > 0) {
+                $detail = get_admin($id);
+                $detail['pname'] =  Db::name('Admin')->where('id',$detail['pid'])->value('name');
+				$department_ids = Db::name('DepartmentAdmin')->where('admin_id',$param['id'])->column('department_id');
+				$detail['department_ids'] = implode(',',$department_ids);
+                View::assign('detail', $detail);
+            } else {
+                //初始化密码
+                $reg_pwd = set_salt(6);
+                View::assign('reg_pwd', $reg_pwd);
+            }
+            View::assign('department', $department);
+            View::assign('position', $position);
+            View::assign('id', $id);
+            return view();
+        }
+    }
+    //生成头像
+    public function to_avatars($char)
+    {
+        $defaultData = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
+            'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'S', 'Y', 'Z',
+            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+            '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖', '拾',
+            '一', '二', '三', '四', '五', '六', '七', '八', '九', '十');
+        if (isset($char)) {
+            $Char = $char;
+        } else {
+            $Char = $defaultData[mt_rand(0, count($defaultData) - 1)];
+        }
+        $OutputSize = min(512, empty($_GET['size']) ? 36 : intval($_GET['size']));
+
+        $Avatar = new MDAvatars($Char, 256, 1);
+        $avatar_name = '/avatars/avatar_256_' . set_salt(10) . time() . '.png';
+        $path = get_config('filesystem.disks.public.url') . $avatar_name;
+        $res = $Avatar->Save('.' . $path, 256);
+        $Avatar->Free();
+        return $path;
+    }
+
+    //查看
+    public function view()
+    {
+        $id = get_params('id');
+        $detail = get_admin($id);
+		$department_ids = Db::name('DepartmentAdmin')->where('admin_id',$id)->column('department_id');
+		$department_names = Db::name('Department')->whereIn('id',$department_ids)->column('title');
+		$detail['department_names'] = implode(',',$department_names);
+		$detail['pname'] =  Db::name('Admin')->where('id',$detail['pid'])->value('name');
+        //查询所有菜单和权限节点
+        $menu = Db::name('AdminRule')->where(['menu' => 1])->order('sort asc,id asc')->select()->toArray();
+        $rule = Db::name('AdminRule')->order('sort asc,id asc')->select()->toArray();
+
+        //查询用户拥有的菜单和节点
+        $user_groups = Db::name('PositionGroup')
+            ->alias('a')
+            ->join("AdminGroup g", "a.group_id=g.id", 'LEFT')
+            ->where([['a.pid', '=', $detail["position_id"]], ['g.status', '=', 1]])
+            ->select()
+            ->toArray();
+        $groups = $user_groups ?: [];
+
+        $rules = [];
+        foreach ($groups as $g) {
+            $rules = array_merge($rules, explode(',', trim($g['rules'], ',')));
+        }
+        $rules = array_unique($rules);
+
+        //数据嵌套
+        $role_rule = create_tree_list(0, $rule, $rules);
+
+        View::assign('role_rule', $role_rule);
+        View::assign('detail', $detail);
+        add_log('view', get_params('id'));
+        return view();
+    }
+    //禁用,恢复
+    public function set()
+    {
+        $type = get_params("type");
+        $ids = get_params("ids");
+        $idArray = explode(',', $ids);
+        $list = [];
+        foreach ($idArray as $key => $val) {
+            if ($val == 1) {
+                continue;
+            }
+            $list[] = [
+                'status' => $type,
+                'id' => $val,
+                'update_time' => time(),
+            ];
+        }
+        foreach ($list as $key => $v) {
+            if (Db::name('Admin')->update($v) !== false) {
+                if ($type == 0) {
+                    add_log('disable', $v['id']);
+                } else if ($type == 1) {
+                    add_log('recovery', $v['id']);
+                }
+            }
+        }
+        return to_assign(0, '操作成功');
+    }
+
+    //重置密码
+    public function reset_psw()
+    {
+        $id = get_params("id");
+		if($id == 1){
+			return to_assign(1, '该账号是超级管理员，不允许重置');
+		}
+        $new_pwd = set_salt(6);
+        $salt = set_salt(20);
+        $data = [
+            'reg_pwd' => $new_pwd,
+            'salt' => $salt,
+            'pwd' => set_password($new_pwd, $salt),
+            'id' => $id,
+            'update_time' => time(),
+        ];
+        if (Db::name('Admin')->update($data) !== false) {
+            add_log('reset', $id);
+            return to_assign(0, '操作成功');
+        } else {
+            return to_assign(1, '操作失败');
+        }
+    }
+
+    //管理员操作日志
+    public function log()
+    {
+        if (request()->isAjax()) {
+            $param = get_params();
+            $where = array();
+            if (!empty($param['keywords'])) {
+                $where[] = ['name|rule_menu|param_id', 'like', '%' . $param['keywords'] . '%'];
+            }
+            if (!empty($param['title_cate'])) {
+                $where['title'] = $param['title_cate'];
+            }
+            if (!empty($param['rule_menu'])) {
+                $where['rule_menu'] = $param['rule_menu'];
+            }
+            $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+            $content = DB::name('AdminLog')
+                ->field("id,uid,name,action,title,content,rule_menu,ip,param_id,param,FROM_UNIXTIME(create_time,'%Y-%m-%d %H:%i:%s') create_time")
+                ->order('create_time desc')
+                ->where($where)
+                ->paginate(['list_rows'=> $rows]);
+            $content->toArray();
+            foreach ($content as $k => $v) {
+                $data = $v;
+                $param_array = json_decode($v['param'], true);
+                $param_value = '';
+                foreach ($param_array as $key => $value) {
+                    if (is_array($value)) {
+                        $value = implode(',', $value);
+                    }
+                    $param_value .= $key . ':' . $value . '&nbsp;&nbsp;|&nbsp;&nbsp;';
+                }
+                $data['param'] = $param_value;
+                $content->offsetSet($k, $data);
+            }
+            return table_assign(0, '', $content);
+        } else {
+            return view();
+        }
+    }
+}
diff --git a/app/user/event.php b/app/user/event.php
new file mode 100644
index 0000000000000000000000000000000000000000..4eff8908bd643cd6072b9fde6ee38ca4ad6f04ad
--- /dev/null
+++ b/app/user/event.php
@@ -0,0 +1,5 @@
+<?php
+// 这是系统自动生成的event定义文件
+return [
+
+];
diff --git a/app/user/middleware.php b/app/user/middleware.php
new file mode 100644
index 0000000000000000000000000000000000000000..c482cdc94129fdc23d6b57facd94e78af56a3c34
--- /dev/null
+++ b/app/user/middleware.php
@@ -0,0 +1,9 @@
+<?php
+
+// 这是系统自动生成的middleware定义文件
+return [
+    //开启session中间件
+    //'think\middleware\SessionInit',
+    //验证勾股OA是否完成安装
+    \app\home\middleware\Install::class,
+];
diff --git a/app/user/model/Admin.php b/app/user/model/Admin.php
new file mode 100644
index 0000000000000000000000000000000000000000..122f0cd605e4131ad0abe82048f8274259d229a4
--- /dev/null
+++ b/app/user/model/Admin.php
@@ -0,0 +1,27 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\user\model;
+use think\Model;
+class Admin extends Model
+{
+	public function position()
+    {
+        return $this->hasOne(Position::class);
+    }
+	// 定义与部门的多对多关联关系
+    public function departments()
+    {
+        return $this->belongsToMany(Department::class, 'department_admin');
+    }
+}
diff --git a/app/user/model/Care.php b/app/user/model/Care.php
new file mode 100644
index 0000000000000000000000000000000000000000..eae4d7a9a63574a089385c20d295e86823d65dae
--- /dev/null
+++ b/app/user/model/Care.php
@@ -0,0 +1,117 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\user\model;
+use think\model;
+use think\facade\Db;
+class Care extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->order($order)
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key){
+				$item->cate = Db::name('CareCate')->where('id',$item->care_cate)->value('title');
+				$item->user_name = Db::name('Admin')->where('id',$item->uid)->value('name');
+				$item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name');
+				$item->care_time = date('Y-m-d',$item->care_time);
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['aid'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign();
+    }
+	
+
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/user/model/CareCate.php b/app/user/model/CareCate.php
new file mode 100644
index 0000000000000000000000000000000000000000..ffb89c5a96251e10d034d05444f49c48320effeb
--- /dev/null
+++ b/app/user/model/CareCate.php
@@ -0,0 +1,78 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\user\model;
+use think\model;
+class CareCate extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function getList($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)->order($order)->paginate(['list_rows'=> $rows]);
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['aid'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign();
+    }
+	
+
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = slef::where('id', $id)->find();
+		return $info;
+    }
+}
+
diff --git a/app/user/model/Department.php b/app/user/model/Department.php
new file mode 100644
index 0000000000000000000000000000000000000000..e002f54936e3f11deccb7d49d8cb05a7da65eb3c
--- /dev/null
+++ b/app/user/model/Department.php
@@ -0,0 +1,191 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\user\model;
+use think\Model;
+use think\facade\Db;
+class Department extends Model
+{
+	// 定义与员工的多对多关联关系
+    public function admins()
+    {
+        return $this->belongsToMany(Admin::class, 'department_admin');
+    }
+	
+	public function update_auth_dids_son_dids(){
+		$admin = Db::name('Admin')->field('id,did,auth_did')->select()->toArray();
+		foreach ($admin as $key => $val) {
+			$auth_dids = $this->get_auth_departments($val);
+			$son_dids = $this->get_son_departments($val);
+			Db::name('Admin')->where('id',$val['id'])->update(['auth_dids'=>$auth_dids,'son_dids'=>$son_dids]);
+		}
+	}
+	
+	/*获取某员工所能看的部门数据(dids)
+	*传入某员工uid，输出部门数组，如:'1,2,3'。
+	*超级管理员默认返回全部部门数据
+	*/
+	public function get_auth_departments($admin)
+	{
+		$str='';
+		$uid = $admin['id'];
+		$did = $admin['did'];
+		$auth_did = $admin['auth_did'];
+		$dids = Db::name('Department')->where('status',1)->column('id');
+		$departments = Db::name('Department')->where('status',1)->select()->toArray();
+		//次要部门did
+		$secondary_dids = Db::name('DepartmentAdmin')->where('admin_id',$uid)->column('department_id');
+		//全部可见部门
+		$all_dids = array_merge($secondary_dids,[$did]);
+		
+		//超级管理员||所有部门数据权限
+		if($uid==1 || $auth_did==10){
+			$str = implode(',',$dids);
+		}
+		//仅自己关联的数据
+		if($auth_did==0){
+			$str='';
+		}
+
+		//所属主部门的数据
+		if($auth_did==1){
+			$str=$did;
+		}
+		
+		//所属次部门的数据
+		if($auth_did==2){
+			$str = implode(',',$secondary_dids);
+		}
+		
+		//仅所属主次部门数据
+		if($auth_did==3){
+			$str = implode(',',$all_dids);
+		}
+		
+		//所属主部门及其子部门数据
+		if($auth_did==4){
+			//获取子部门
+			$department_list = get_data_node($departments, $did);
+			$department_array = array_column($department_list, 'id');
+			//包括自己部门在内
+			$department_array[] = $did;
+			$str = implode(',',$department_array);
+		}
+		
+		//所属次部门及其子部门数据
+		if($auth_did==5){
+			//获取子部门
+			$list_array = [];
+			foreach ($secondary_dids as $key => $value) {
+				$department_list = get_data_node($departments, $value);
+				$department_array = array_column($department_list, 'id');
+				//包括自己部门在内
+				$department_array[] = $value;
+				$list_array = array_merge($list_array,$department_array);
+			}
+			$new_array = array_unique($list_array);
+			$str = implode(',',$new_array);
+		}
+		
+		//所属主次部门及其子部门数据
+		if($auth_did==6){
+			//获取子部门
+			$list_array = [];
+			foreach ($all_dids as $key => $value) {
+				$department_list = get_data_node($departments, $value);
+				$department_array = array_column($department_list, 'id');
+				//包括自己部门在内
+				$department_array[] = $value;
+				$list_array = array_merge($list_array,$department_array);
+			}
+			$new_array = array_unique($list_array);
+			$str = implode(',',$new_array);
+		}
+		
+		//所属主部门所在顶级部门及其子部门数据
+		if($auth_did==7){
+			//获取顶级部门
+			$top_did = get_department_top($did);
+			$new_array = get_department_son($top_did,1);
+			$str = implode(',',$new_array);
+		}
+		
+		//所属次部门所在顶级部门及其子部门数据
+		if($auth_did==8){
+			//获取顶级部门
+			$top_dids =[];
+			foreach ($secondary_dids as $key => $value) {
+				array_push($top_dids, get_department_top($value));
+			}
+			
+			$list_array = [];
+			foreach ($top_dids as $key => $value) {
+				$list_array = array_merge($list_array,get_department_son($value,1));
+			}
+			$new_array = array_unique($list_array);
+			$str = implode(',',$new_array);
+		}
+		
+		//所属主次部门所在顶级部门及其子部门数据
+		if($auth_did==9){
+			//获取顶级部门
+			$top_dids =[];
+			foreach ($all_dids as $key => $value) {
+				array_push($top_dids, get_department_top($value));
+			}
+			
+			$list_array = [];
+			foreach ($top_dids as $key => $value) {
+				$list_array = array_merge($list_array,get_department_son($value,1));
+			}
+			$new_array = array_unique($list_array);
+			$str = implode(',',$new_array);
+		}
+		return $str;
+	}
+	
+	/*获取某负责人所负责的部门的数据集(ids),传入某员工uid，输出部门字符串，如:1,2,3,
+	*逻辑：先判断传入的uid是否是负责人，如果是负责人再读取对应的部门数据。
+	*超级管理员默认返回全部部门数据
+	*/
+	public function get_son_departments($admin)
+	{
+		$str='';
+		$uid = $admin['id'];
+		$dids = Db::name('Department')->where('status',1)->column('id');
+		$departments = Db::name('Department')->where('status',1)->select()->toArray();
+		if($uid==1){
+			$str = implode(',',$dids);
+		}
+		else{
+			$map = [];
+			$map[] = ['status','=',1];
+			$map[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',leader_ids)")];
+			$leader_dids = Db::name('Department')->where($map)->column('id');
+			//判断是否是部门负责人
+			if(!empty($leader_dids)){
+				//获取子部门
+				$list_array = [];
+				foreach ($leader_dids as $key => $value) {
+					$department_list = get_data_node($departments, $value);
+					$department_array = array_column($department_list, 'id');
+					//包括自己部门在内
+					$department_array[] = $value;
+					$list_array = array_merge($list_array,$department_array);
+				}
+				$str = implode(',',$list_array);
+			}
+		}
+		return $str;
+	}
+}
diff --git a/app/user/model/DepartmentChange.php b/app/user/model/DepartmentChange.php
new file mode 100644
index 0000000000000000000000000000000000000000..49044d0c8f0dd6ad95c04a6c72226610f52ba590
--- /dev/null
+++ b/app/user/model/DepartmentChange.php
@@ -0,0 +1,19 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\user\model;
+use think\Model;
+class DepartmentChange extends Model
+{
+
+}
\ No newline at end of file
diff --git a/app/user/model/IndustryCate.php b/app/user/model/IndustryCate.php
new file mode 100644
index 0000000000000000000000000000000000000000..53f36c776608444de967c55f6c9fa207e21467b8
--- /dev/null
+++ b/app/user/model/IndustryCate.php
@@ -0,0 +1,19 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\user\model;
+use think\Model;
+class IndustryCate extends Model
+{
+
+}
diff --git a/app/user/model/LaborContract.php b/app/user/model/LaborContract.php
new file mode 100644
index 0000000000000000000000000000000000000000..f6e9cdf25ff4551964890b1f871d11bfd80b53df
--- /dev/null
+++ b/app/user/model/LaborContract.php
@@ -0,0 +1,155 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\user\model;
+use think\model;
+use think\facade\Db;
+class LaborContract extends Model
+{
+	//合同类别
+	public static $laborcontract_cate = array(
+		array('id' => 1, 'title' => '劳动合同'),
+		array('id' => 2, 'title' => '劳务合同'),
+		array('id' => 3, 'title' => '实习协议'),
+		array('id' => 4, 'title' => '保密协议')
+	);
+
+	//合同类型
+	public static $laborcontract_types = ['','新签合同','续签合同','变更合同'];
+
+	//合同属性
+	public static $laborcontract_properties = ['','初级职称','中级职称','高级职称'];
+	
+	//合同状态
+	public static $laborcontract_status = ['','正常','已到期','已解除'];
+
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->order($order)
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key){
+				$item->cate_str = self::$laborcontract_cate[$item->cate-1]['title'];
+				$item->types_str = self::$laborcontract_types[$item->types];
+				$item->properties_str = self::$laborcontract_properties[$item->properties];
+				$item->status_str = self::$laborcontract_status[$item->status];
+				$item->enterprise = Db::name('Enterprise')->where('id',$item->enterprise_id)->value('title');
+				$item->user_name = Db::name('Admin')->where('id',$item->uid)->value('name');
+				$item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name');
+				$item->sign_time = date('Y-m-d',$item->sign_time);
+				$item->start_time = date('Y-m-d',$item->start_time);
+				$item->end_time = date('Y-m-d',$item->end_time);
+				$item->diff_time = $item->start_time.' 至 '.$item->end_time;
+				$item->renewal = Db::name('LaborContract')->where(['renewal_pid'=>$item->id,'delete_time'=>0])->count();
+				$item->change = Db::name('LaborContract')->where(['change_pid'=>$item->id,'delete_time'=>0])->count();
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['aid'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign();
+    }
+	
+
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		$info['cate_str'] = self::$laborcontract_cate[$info['cate']-1]['title'];
+		$info['types_str'] = self::$laborcontract_types[$info['types']];
+		$info['properties_str'] = self::$laborcontract_properties[$info['properties']];
+		$info['status_str'] = self::$laborcontract_status[$info['status']];
+		$info['enterprise'] = Db::name('Enterprise')->where('id',$info['enterprise_id'])->value('title');
+		$info['user_name'] = Db::name('Admin')->where('id',$info['uid'])->value('name');
+		$info['sign_time'] = date('Y-m-d',$info['sign_time']);
+		$info['start_time'] = date('Y-m-d',$info['start_time']);
+		$info['end_time'] = date('Y-m-d',$info['end_time']);
+		if($info['trial_end_time']>0){
+			$info['trial_end_time'] = date('Y-m-d',$info['trial_end_time']);
+		}
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/user/model/PersonalQuit.php b/app/user/model/PersonalQuit.php
new file mode 100644
index 0000000000000000000000000000000000000000..7e8c586e15100e0853e1b48eed4c13a822c0e234
--- /dev/null
+++ b/app/user/model/PersonalQuit.php
@@ -0,0 +1,19 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\user\model;
+use think\Model;
+class PersonalQuit extends Model
+{
+
+}
\ No newline at end of file
diff --git a/app/user/model/Rewards.php b/app/user/model/Rewards.php
new file mode 100644
index 0000000000000000000000000000000000000000..8495cfbe5e852b97310b70ddf8994a221f985fd9
--- /dev/null
+++ b/app/user/model/Rewards.php
@@ -0,0 +1,117 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+namespace app\user\model;
+use think\model;
+use think\facade\Db;
+class Rewards extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function datalist($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = self::where($where)
+			->order($order)
+			->paginate(['list_rows'=> $rows])
+			->each(function ($item, $key){
+				$item->cate = Db::name('RewardsCate')->where('id',$item->rewards_cate)->value('title');
+				$item->user_name = Db::name('Admin')->where('id',$item->uid)->value('name');
+				$item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name');
+				$item->rewards_time = date('Y-m-d',$item->rewards_time);
+			});
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = self::strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['aid'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            self::where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign();
+    }
+	
+
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = self::find($id);
+		return $info;
+    }
+
+    /**
+    * 删除信息
+    * @param $id
+    * @param $type
+    * @return array
+    */
+    public function delById($id,$type=0)
+    {
+		if($type==0){
+			//逻辑删除
+			try {
+				$param['delete_time'] = time();
+				self::where('id', $id)->update(['delete_time'=>time()]);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		else{
+			//物理删除
+			try {
+				self::destroy($id);
+				add_log('delete', $id);
+			} catch(\Exception $e) {
+				return to_assign(1, '操作失败，原因：'.$e->getMessage());
+			}
+		}
+		return to_assign();
+    }
+}
+
diff --git a/app/user/model/RewardsCate.php b/app/user/model/RewardsCate.php
new file mode 100644
index 0000000000000000000000000000000000000000..8e12aa93de9a038e61551575249bb1395dc67c4c
--- /dev/null
+++ b/app/user/model/RewardsCate.php
@@ -0,0 +1,79 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\user\model;
+use think\model;
+class RewardsCate extends Model
+{
+    /**
+    * 获取分页列表
+    * @param $where
+    * @param $param
+    */
+    public function getList($where, $param)
+    {
+		$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
+		$order = empty($param['order']) ? 'id desc' : $param['order'];
+        try {
+            $list = $this->where($where)->order($order)->paginate(['list_rows'=> $rows]);
+			return $list;
+        } catch(\Exception $e) {
+            return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
+        }
+    }
+
+    /**
+    * 添加数据
+    * @param $param
+    */
+    public function add($param)
+    {
+		$insertId = 0;
+        try {
+			$param['create_time'] = time();
+			$insertId = $this->strict(false)->field(true)->insertGetId($param);
+			add_log('add', $insertId, $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign(0,'操作成功',['aid'=>$insertId]);
+    }
+
+    /**
+    * 编辑信息
+    * @param $param
+    */
+    public function edit($param)
+    {
+        try {
+            $param['update_time'] = time();
+            $this->where('id', $param['id'])->strict(false)->field(true)->update($param);
+			add_log('edit', $param['id'], $param);
+        } catch(\Exception $e) {
+			return to_assign(1, '操作失败，原因：'.$e->getMessage());
+        }
+		return to_assign();
+    }
+	
+
+    /**
+    * 根据id获取信息
+    * @param $id
+    */
+    public function getById($id)
+    {
+        $info = $this->where('id', $id)->find();
+		return $info;
+    }
+}
+
diff --git a/app/user/validate/AdminCheck.php b/app/user/validate/AdminCheck.php
new file mode 100644
index 0000000000000000000000000000000000000000..dc6da3d2b6a80ed3ff6ba010de3eb7e04a15f5e9
--- /dev/null
+++ b/app/user/validate/AdminCheck.php
@@ -0,0 +1,84 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\user\validate;
+use think\facade\Db;
+use think\Validate;
+
+class AdminCheck extends Validate
+{
+	protected $regex = [ 'checkUser' => '/^[A-Za-z]{1}[A-Za-z0-9_-]{3,19}$/'];
+	// 自定义验证规则
+    protected function checkUnique($value, $rule, $data)
+    {
+        [$table, $field, $id] = explode(',', $rule);
+        $idField = $id ?: 'id';
+        $idValue = $data[$idField] ?? null;
+        $map = [
+            [$field, '=', $value],
+        ];
+        if (!is_null($idValue)) {
+            $map[] = [$idField, '<>', $idValue];
+        }
+        $map[] = ['status', '>=', 0];
+        return !Db::name($table)->where($map)->count();
+    }
+	
+    protected $rule = [
+        'name' => 'require|chs',
+        'username' => 'require|regex:checkUser',
+        'mobile' => 'require|mobile|checkUnique:Admin,mobile,id',
+        'email' => 'require|email|checkUnique:Admin,email,id',
+        'reg_pwd' => 'require|min:6',
+        'did' => 'require',
+        'position_id' => 'require',
+        'type' => 'require',
+        'entry_time' => 'require',
+        'id' => 'require',
+        'pwd' => 'require|min:6|confirm',
+        'status' => 'require|checkStatus:-1,1',
+        'old_pwd' => 'require|different:pwd',
+    ];
+
+    protected $message = [
+	    'name.require' => '员工姓名不能为空',
+        'name.chs' => '员工姓名只能是汉字',
+        'username.require' => '登录账号不能为空',
+        'username.regex' => '登录账号必须是以字母开头，只能包含字母数字下划线和减号，4到20位',
+		'mobile.require' => '手机不能为空',
+        'mobile.mobile' => '手机格式错误',
+		'mobile.checkUnique' => '同样的手机号码已经存在，请检查一下是否被离职或者禁用员工占用',
+		'email.require' => '邮箱不能为空',
+        'email.email' => '邮箱格式错误',
+		'email.checkUnique' => '同样的邮箱已经存在，请检查一下是否被离职或者禁用员工占用',
+        'reg_pwd.require' => '密码不能为空',
+        'reg_pwd.min' => '密码至少要6个字符',
+		'did.require' => '请选择所在部门',
+        'position_id.require' => '请选择职位',
+		'type.require' => '请选择员工类型',
+		'entry_time.require' => '请选择入职时间',
+        'id.require' => '缺少更新条件',
+        'pwd.require' => '密码不能为空',
+		'pwd.min' => '密码至少要6个字符',
+        'pwd.confirm' => '两次密码不一致',
+        'old_pwd.require' => '请提供旧密码',
+        'old_pwd.different' => '新密码不能和旧密码一样',
+    ];
+
+    protected $scene = [
+        'add' => ['name', 'username', 'mobile','email','reg_pwd', 'did', 'position_id', 'type', 'entry_time'],
+        'edit' => ['name', 'mobile','email', 'did', 'position_id', 'entry_time', 'id'],
+        'editPwd' => ['old_pwd', 'pwd'],
+    ];
+
+}
diff --git a/app/user/validate/BasicUserCheck.php b/app/user/validate/BasicUserCheck.php
new file mode 100644
index 0000000000000000000000000000000000000000..caf60f5d3ce996de0993178c2194e278da6be87e
--- /dev/null
+++ b/app/user/validate/BasicUserCheck.php
@@ -0,0 +1,34 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\user\validate;
+
+use think\Validate;
+
+class BasicUserCheck extends Validate
+{
+    protected $rule = [
+        'title' => 'require',
+        'id' => 'require',
+    ];
+
+    protected $message = [
+        'title.require' => '名称不能为空',
+        'id.require' => '缺少更新条件',
+    ];
+
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['id', 'title'],
+    ];
+}
diff --git a/app/user/validate/CareCateValidate.php b/app/user/validate/CareCateValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..283f055f60e38c2987514ee525c1f1e818f48608
--- /dev/null
+++ b/app/user/validate/CareCateValidate.php
@@ -0,0 +1,42 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\user\validate;
+use think\Validate;
+use think\facade\Db;
+
+class CareCateValidate extends Validate
+{
+	// 自定义验证规则
+	protected function checkOne($value,$rule,$data=[])
+	{
+		$count = Db::name('CareCate')->where([['title','=',$data['title']],['id','<>',$data['id']]])->count();
+		return $count == 0 ? true : false;
+	}
+	
+    protected $rule = [
+		'title' => 'require|checkOne',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'title.require' => '名称不能为空',
+		'title.checkOne' => '同样的名称已经存在',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['title', 'id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/user/validate/CareValidate.php b/app/user/validate/CareValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..ac093c21c04ff6a6ce3a59ecdd64c7341aabbc3b
--- /dev/null
+++ b/app/user/validate/CareValidate.php
@@ -0,0 +1,34 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\user\validate;
+use think\Validate;
+use think\facade\Db;
+
+class CareValidate extends Validate
+{	
+    protected $rule = [
+		'uid' => 'require',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'title.require' => '员工不能为空',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['uid'],
+        'edit' => ['uid', 'id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/user/validate/DepartmentCheck.php b/app/user/validate/DepartmentCheck.php
new file mode 100644
index 0000000000000000000000000000000000000000..467d29ab1d4d07f4a0e653f2e9bf2baa8c381e2d
--- /dev/null
+++ b/app/user/validate/DepartmentCheck.php
@@ -0,0 +1,34 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\user\validate;
+
+use think\Validate;
+
+class DepartmentCheck extends Validate
+{
+    protected $rule = [
+        'title' => 'require',
+        'id' => 'require',
+    ];
+
+    protected $message = [
+        'title.require' => '部门名称不能为空',
+        'id.require' => '缺少更新条件',
+    ];
+
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['id', 'title'],
+    ];
+}
\ No newline at end of file
diff --git a/app/user/validate/LaborContractValidate.php b/app/user/validate/LaborContractValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..0976f900946ca08cf8cf7ce5aecd97eb15cba319
--- /dev/null
+++ b/app/user/validate/LaborContractValidate.php
@@ -0,0 +1,44 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\user\validate;
+use think\Validate;
+use think\facade\Db;
+
+class LaborContractValidate extends Validate
+{
+	// 自定义验证规则
+	protected function checkOne($value,$rule,$data=[])
+	{
+		$count = Db::name('LaborContract')->where([['code','=',$data['code']],['id','<>',$data['id']],['delete_time','=',0]])->count();
+		return $count == 0 ? true : false;
+	}
+	
+    protected $rule = [
+		'code' => 'require|checkOne',
+		'title' => 'require',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'code.require' => '合同编码不能为空',
+		'code.checkOne' => '同样的合同编码已经存在',
+		'title' => '合同名称不能为空',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['code','title'],
+        'edit' => ['code','title', 'id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/user/validate/PositionCheck.php b/app/user/validate/PositionCheck.php
new file mode 100644
index 0000000000000000000000000000000000000000..0b88ebad71f9cbf53eea2d98496356b1d10ed9d5
--- /dev/null
+++ b/app/user/validate/PositionCheck.php
@@ -0,0 +1,55 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\user\validate;
+use think\facade\Db;
+use think\Validate;
+
+class PositionCheck extends Validate
+{	
+	// 自定义验证规则
+    protected function checkUnique($value, $rule, $data)
+    {
+        [$table, $field, $id] = explode(',', $rule);
+        $idField = $id ?: 'id';
+        $idValue = $data[$idField] ?? null;
+        $map = [
+            [$field, '=', $value],
+        ];
+        if (!is_null($idValue)) {
+            $map[] = [$idField, '<>', $idValue];
+        }
+        $map[] = ['status', '=', 1];
+        return !Db::name($table)->where($map)->count();
+    }
+    protected $rule = [
+        'title' => 'require|checkUnique:Position,title,id',
+        'work_price' => 'require|number',
+        'group_id' => 'require',
+        'id' => 'require'
+    ];
+
+    protected $message = [
+        'title.require' => '岗位名称不能为空',
+        'title.checkUnique' => '同样的岗位名称已经存在',
+        'work_price.require' => '岗位工时单价不能为空',
+        'work_price.number' => '岗位工时单价只能是整数',
+        'group_id.require' => '至少要选择一个角色权限',
+        'id.require' => '缺少更新条件',
+    ];
+
+    protected $scene = [
+        'add' => ['title', 'work_price', 'group_id'],
+        'edit' => ['title', 'work_price', 'group_id', 'id'],
+    ];
+}
diff --git a/app/user/validate/RewardsCateValidate.php b/app/user/validate/RewardsCateValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..d6d5880eca549b5a7b64f6632765309dc3f3b4a9
--- /dev/null
+++ b/app/user/validate/RewardsCateValidate.php
@@ -0,0 +1,42 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\user\validate;
+use think\Validate;
+use think\facade\Db;
+
+class RewardsCateValidate extends Validate
+{
+	// 自定义验证规则
+	protected function checkOne($value,$rule,$data=[])
+	{
+		$count = Db::name('RewardsCate')->where([['title','=',$data['title']],['id','<>',$data['id']]])->count();
+		return $count == 0 ? true : false;
+	}
+	
+    protected $rule = [
+		'title' => 'require|checkOne',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'title.require' => '名称不能为空',
+		'title.checkOne' => '同样的名称已经存在',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['title'],
+        'edit' => ['title', 'id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/user/validate/RewardsValidate.php b/app/user/validate/RewardsValidate.php
new file mode 100644
index 0000000000000000000000000000000000000000..3fe91a793fb9eb1e6ebd0243cd4b916f13e7d479
--- /dev/null
+++ b/app/user/validate/RewardsValidate.php
@@ -0,0 +1,34 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace app\user\validate;
+use think\Validate;
+use think\facade\Db;
+
+class RewardsValidate extends Validate
+{	
+    protected $rule = [
+		'uid' => 'require',
+		'id' => 'require',
+	];
+
+    protected $message = [
+		'title.require' => '员工不能为空',
+		'id.require' => '缺少更新条件',
+	];
+	
+    protected $scene = [
+        'add' => ['uid'],
+        'edit' => ['uid', 'id'],
+    ];
+}
\ No newline at end of file
diff --git a/app/user/view/basic/datalist.html b/app/user/view/basic/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..2ae8bc790532ecdaf48d679ab188042a48ff249e
--- /dev/null
+++ b/app/user/view/basic/datalist.html
@@ -0,0 +1,138 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-3">
+    <div class="layui-card">
+		<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
+			<ul class="layui-tab-title" style="border-bottom:none;">
+				<li class="layui-this" data-index="1">职务</li>
+				<li data-index="2">职级</li>
+			</ul>
+			<div class="layui-tab-content" style="padding:0">
+				<table class="layui-hide" id="test" lay-filter="test"></table>
+			</div>
+		</div> 
+	</div> 
+</div>
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm add-new" type="button">+ 新增内容</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+	<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool, element = layui.element,form = layui.form;
+		var data_type=1;
+		element.on('tab(tab)', function(data){
+			data_type = data.index+1;
+			layui.pageTable.reload({where:{types:data_type},page:{curr:1}});
+			return false;
+		});
+		
+		layui.pageTable = table.render({
+			elem: '#test'
+			,toolbar: '#toolbarDemo'
+			,title:'基础数据列表'
+			,url: "/user/basic/datalist"
+			,where:{types:data_type}
+			,page: false
+			,cellMinWidth: 80
+			,cols: [[
+					{field:'id',width:80, title: 'ID号', align:'center'}
+					,{field:'title',title: '名称'}
+					,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+						var html1='<span class="green">正常</span>';
+						var html2='<span class="yellow">禁用</span>';
+						if(d.status==1){
+							return html1;
+						}
+						else{
+							return html2;
+						}
+					}}
+					,{width:100,title: '操作', align:'center',templet: function(d){
+						var html='';
+						var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
+						var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+						var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+						if(d.status==1){
+							html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+						}
+						else{
+							html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+						}
+						return html;
+					}}
+				]]
+			});
+			
+			table.on('tool(test)',function (obj) {
+				if(obj.event === 'edit'){					
+					addExpense(obj.data.id,obj.data.title);
+				}
+				if(obj.event === 'disable'){
+					layer.confirm('确定要禁用该数据吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/user/basic/set", { id: obj.data.id,status: 0,title: obj.data.title}, callback);
+						layer.close(index);
+					});
+				}
+				if(obj.event === 'open'){
+					layer.confirm('确定要启用该数据吗?', {icon: 3, title:'提示'}, function(index){
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();
+							}
+						}
+						tool.post("/user/basic/set", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
+						layer.close(index);
+					});
+				}
+			});
+			
+			$('body').on('click','.add-new',function(){
+				addExpense(0,'');	
+			});
+			
+			function addExpense(id,val){
+				var title = '新增内容';
+				if(id>0){
+					title = '编辑内容';
+				}
+				layer.prompt({
+					title: title,
+					value: val,
+					yes: function(index, layero) {
+						// 获取文本框输入的值
+						var value = layero.find(".layui-layer-input").val();
+						if (value) {
+							let callback = function (e) {
+								layer.msg(e.msg);
+								if (e.code == 0) {
+									layui.pageTable.reload();				
+								}
+							}
+							tool.post("/user/basic/add", {id: id,types:data_type,title: value}, callback);
+							layer.close(index);
+						} else {
+							layer.msg('请填写内容');
+						}
+					}
+				})
+			}
+		}
+	</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/user/view/care/add.html b/app/user/view/care/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..a0101b300501ac284969b7c84322088a0f08ab6a
--- /dev/null
+++ b/app/user/view/care/add.html
@@ -0,0 +1,109 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">关怀信息</h3>
+	<table class="layui-table layui-table-form">
+		{eq name="$id" value="0"}
+		<tr>
+			<td class="layui-td-gray">员工姓名<font>*</font></td>
+			<td>
+				<input type="text" name="uname" lay-verify="required" autocomplete="off" placeholder="请选择" lay-reqText="请选择员工姓名" class="layui-input picker-admin" readonly value="">
+				<input type="hidden" name="uid" value="0">
+			</td>
+			<td class="layui-td-gray">关怀项目<font>*</font></td>
+			<td>
+				<select name="care_cate" lay-verify="required" lay-reqText="请选择关怀项目">
+					<option value="">请选择</option>
+					{volist name=":get_base_data('care_cate')" id="vo"}
+					<option value="{$vo.id}">{$vo.title}</option>
+					{/volist}
+				</select>
+			</td>
+			<td class="layui-td-gray">当前状态</td>
+			<td>
+				<input type="radio" name="status" lay-filter="checktype" value="1" title="待执行" checked>
+				<input type="radio" name="status" lay-filter="checktype" value="2" title="已执行" >
+			</td>
+		</tr>
+		{else/}
+			<tr>
+			<td class="layui-td-gray">员工姓名<font>*</font></td>
+			<td>
+				<input type="text" name="uname" lay-verify="required" autocomplete="off" placeholder="请选择" lay-reqText="请选择员工姓名" class="layui-input picker-admin" readonly value="{$detail.user_name|default=''}">
+				<input type="hidden" name="uid" value="{$detail.uid|default=0}">
+			</td>
+				<td class="layui-td-gray">关怀项目<font>*</font></td>
+				<td>
+					<select name="care_cate" lay-verify="required" lay-reqText="请选择关怀项目">
+						<option value="">请选择</option>
+						{volist name=":get_base_data('care_cate')" id="vo"}
+						<option value="{$vo.id}" {eq name="$vo.id" value="$detail.care_cate"} selected{/eq}>{$vo.title}</option>
+						{/volist}
+					</select>
+				</td>
+				<td class="layui-td-gray">当前状态</td>
+				<td>
+					<input type="radio" name="status" value="1" title="待执行" {eq name="$detail.status" value="1"} checked{/eq}>
+					<input type="radio" name="status" value="2" title="已执行" {eq name="$detail.status" value="2"} checked{/eq}>
+				</td>
+			</tr>
+		{/eq}
+		<tr>
+			<td class="layui-td-gray-2">关怀金额(元)<font>*</font></td>
+			<td>
+				<input type="text" name="cost" lay-verify="required|number" autocomplete="off" placeholder="请选择" lay-reqText="请完善金额，仅为数字" class="layui-input" value="{$detail.cost|default=''}">
+			</td>
+			<td class="layui-td-gray">关怀日期<font>*</font></td>
+			<td>
+				<input type="text" name="care_time" readonly lay-verify="required" autocomplete="off" placeholder="请选择" lay-reqText="请选择关怀日期" class="layui-input tool-time" value="{$detail.care_time|default=''}">
+			</td>
+			<td class="layui-td-gray">关怀假日</td>
+			<td>
+				<input type="text" name="vacation" lay-verify="number" autocomplete="off" placeholder="" lay-reqText="请完善关怀假日，仅为数字" class="layui-input" value="{$detail.vacation|default=''}">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">关怀物品</td>
+			<td colspan="5">
+				<input type="text" name="thing" autocomplete="off" placeholder="请输入关怀物品，可空" class="layui-input" value="{$detail.thing|default=''}">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">关怀描述</td>
+			<td colspan="5">
+				<textarea name="remark" placeholder="请输入关怀描述，可空" class="layui-textarea">{$detail.remark|default=''}</textarea>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$id|default=0}"/>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool','oaPicker'];
+
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			tool.post("/user/care/add", data.field, callback);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/user/view/care/datalist.html b/app/user/view/care/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..5fda1ed6e960e3aa2260e1c5808f43e49f6f142e
--- /dev/null
+++ b/app/user/view/care/datalist.html
@@ -0,0 +1,132 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:100px">
+			<select name="status">
+				<option value="">关怀状态</option>
+				<option value="1">待执行</option>
+				<option value="2">已执行</option>
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:100px">
+			<select name="care_cate">
+				<option value="">关怀项目</option>
+				{volist name=":get_base_data('care_cate')" id="vo"}
+				<option value="{$vo.id}">{$vo.title}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:80px">
+			<input type="text" name="uname" placeholder="关怀员工" class="layui-input picker-admin" value="" readonly>
+			<input type="text" name="uid" value="" style="display:none;">
+		</div>
+		<div class="layui-input-inline" style="width:292px;">
+			<input type="text" class="layui-input" id="diff_time" placeholder="关怀日期" readonly name="diff_time">
+		</div>
+		<div class="layui-input-inline" style="width:188px">
+			<input type="text" name="keywords" placeholder="关键字" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px;">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_care" lay-filter="table_care"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm" lay-event="add" type="button">+ 添加关怀管理</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','oaPicker','tablePlus','laydatePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool, laydatePlus = layui.laydatePlus;
+		var diff_time = new laydatePlus({'target':'diff_time'});
+		layui.pageTable = table.render({
+			elem: "#table_care"
+			, toolbar: "#toolbarDemo"
+			,url: "/user/care/datalist"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 80
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'status',title: '状态',width:90, align:'center',templet: function(d){
+					var html='';
+					if(d.status==1){
+						return '<span class="green">『待执行』</span>';
+					}
+					if(d.status==2){
+						return '<span class="red">『已执行』</span>';
+					}
+					else{
+						return '-';
+					}
+				}}
+				,{field:'user_name',title: '员工',width:90, align:'center'}
+				,{field:'cate',title: '关怀项目',width:100, align:'center'}
+				,{field:'care_time',title: '关怀日期',width:90, align:'center'}
+				,{field:'cost',title: '金额(元)',width:90, align:'right'}
+				,{field:'vacation',title: '关怀假日',width:90, align:'center'}
+				,{field:'thing',title: '物品'}
+				,{field:'admin_name',title: '创建人',width:90,align:'center'}
+				,{field:'create_time', title: '创建时间',width:150,align:'center'}
+				,{width:120,fixed:'right',title: '操作', align:'center',templet: function(d){
+					var html='';
+					var btn1='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详细</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn3='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
+					html = '<div class="layui-btn-group">'+btn1+btn2+btn3+'</div>';
+					return html;
+				}}
+			]]
+		});
+		
+		//表头工具栏事件
+		table.on('toolbar(table_care)', function(obj){
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = checkStatus.data;
+			if (obj.event === 'add') {
+				tool.side("/user/care/add");
+				return;
+			}
+		});	
+			
+		table.on('tool(table_care)',function (obj) {
+			let data=obj.data
+			if (obj.event === 'view') {
+				tool.side("/user/care/view?id="+data.id);
+				return;
+			}
+			if (obj.event === 'edit') {
+				tool.side("/user/care/add?id="+data.id);
+				return;
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要删除该内容吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/user/care/del", { id: data.id }, callback);
+					layer.close(index);
+				});
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/user/view/care/view.html b/app/user/view/care/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..55df0251c0f227c22b7e30533e3b4dcab9291bec
--- /dev/null
+++ b/app/user/view/care/view.html
@@ -0,0 +1,53 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">奖罚信息</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">员工姓名</td>
+			<td>{$detail.user_name|default=''}</td>
+			<td class="layui-td-gray">关怀类型</td>
+			<td>
+				{eq name="$detail.types" value="1"}<span class="green">奖励</span>{/eq}
+				{eq name="$detail.types" value="2"}<span class="red">惩罚</span>{/eq}
+			</td>
+			<td class="layui-td-gray">当前状态</td>
+			<td>
+				{eq name="$detail.status" value="1"}<span class="green">『待执行』</span>{/eq}
+				{eq name="$detail.status" value="2"}<span class="red">『已执行』</span>{/eq}
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">关怀项目</td>
+			<td>{$detail.cate}</td>
+			<td class="layui-td-gray-2">关怀金额(元)</td>
+			<td>{$detail.cost}</td>
+			<td class="layui-td-gray">关怀日期</td>
+			<td>{$detail.care_time}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">关怀物品</td>
+			<td colspan="5">{$detail.thing}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">奖罚描述</td>
+			<td colspan="5">{$detail.remark|default=''}</td>
+		</tr>
+	</table>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool'];
+
+	function gouguInit() {
+		var tool = layui.tool;
+
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/user/view/carecate/add.html b/app/user/view/carecate/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..7584f4eda23c765f3ed05a2cf6166b8cdec6dd57
--- /dev/null
+++ b/app/user/view/carecate/add.html
@@ -0,0 +1,48 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">关怀项目</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">关怀项目名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入关怀项目名称" lay-reqText="请输入关怀项目名称"class="layui-input" value="{$detail.title|default=''}">
+			</td>
+			<td class="layui-td-gray">排序</td>
+			<td>
+				<input type="text" name="sort" placeholder="请输入排序，数字" autocomplete="off" class="layui-input" value="{$detail.sort|default=''}">
+			</td>
+		</tr>
+	</table>
+	<div class="pt-3">
+		<input type="hidden" name="id" value="{$detail.id|default=0}"/>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool'];
+
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			tool.post("/user/carecate/add", data.field, callback);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/user/view/carecate/datalist.html b/app/user/view/carecate/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..2407ac56ff70241ea1d397f027c18113fd0f149a
--- /dev/null
+++ b/app/user/view/carecate/datalist.html
@@ -0,0 +1,124 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<table class="layui-hide" id="table_care_cate" lay-filter="table_care_cate"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm add-new" type="button">+ 添加关怀项目</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool;
+		
+		layui.pageTable = table.render({
+			elem: "#table_care_cate"
+			,toolbar: '#toolbarDemo'
+			,url: "/user/carecate/datalist"
+			,page: false
+			,limit: 999
+			,cellMinWidth: 80
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',title: '名称'}
+				,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+					var html1='<span class="green">正常</span>';
+					var html2='<span class="yellow">禁用</span>';
+					if(d.status==1){
+						return html1;
+					}
+					else{
+						return html2;
+					}
+				}}
+				,{width:100,title: '操作', align:'center',templet: function(d){
+					var html='';
+					var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+					if(d.status==1){
+						html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+					}
+					else{
+						html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+					}
+					return html;
+				}}
+			]]
+		});
+			
+		table.on('tool(table_care_cate)',function (obj) {
+			if(obj.event === 'edit'){					
+				add_cate(obj.data.id,obj.data.title);
+			}
+			if(obj.event === 'disable'){
+				layer.confirm('确定要禁用该关怀项目吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/user/carecate/set", {id:obj.data.id,status: 0}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'open'){
+				layer.confirm('确定要启用该关怀项目吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/user/carecate/set", {id:obj.data.id,status:1}, callback);
+					layer.close(index);
+				});
+			}
+		});
+		
+		$('body').on('click','.add-new',function(){
+			add_cate(0,'');	
+		});
+		
+		function add_cate(id,val){
+			var title = '新增关怀项目';
+			if(id>0){
+				title = '编辑关怀项目';
+			}
+			layer.prompt({
+				title: title,
+				value: val,
+				yes: function(index, layero) {
+					// 获取文本框输入的值
+					var value = layero.find(".layui-layer-input").val();
+					if (value) {
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();				
+							}
+						}
+						tool.post("/user/carecate/add", {id: id,title: value}, callback);
+						layer.close(index);
+					} else {
+						layer.msg('请填写关怀项目名称');
+					}
+				}
+			})
+		}
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/user/view/department/add.html b/app/user/view/department/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..a0b07dc932d02366ac0ce6545c17bfd4cf826373
--- /dev/null
+++ b/app/user/view/department/add.html
@@ -0,0 +1,105 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">部门架构</h3>
+	{eq name="$id" value="0"}
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">部门名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入部门名称" lay-reqText="请输入部门名称" class="layui-input">
+			</td>
+			<td class="layui-td-gray">上级部门<font>*</font></td>
+			<td>
+				<select name="pid" lay-verify="required" lay-reqText="请选择上级部门">
+					<option value="0">作为顶级部门</option>
+					{volist name="department" id="v"}
+					<option value="{$v.id}" {eq name="$pid" value="$v.id"} selected{/eq}>{$v.title}</option>
+					{/volist}
+				</select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">排序<font>*</font></td>
+			<td>
+				<input type="text" name="sort" lay-verify="required|number" value="0" autocomplete="off" placeholder="请输入排序" lay-reqText="请输入排序" class="layui-input">
+			</td>
+			<td class="layui-td-gray-2">部门联系电话</td>
+			<td>
+				<input type="text" name="phone" placeholder="请输入部门联系电话，可空" autocomplete="off" class="layui-input">
+			</td>
+		</tr>
+	</table>
+	{else/}
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">部门名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" value="{$detail.title}" lay-verify="required" autocomplete="off" placeholder="请输入部门名称" lay-reqText="请输入部门名称" class="layui-input">
+			</td>
+			<td class="layui-td-gray">上级部门<font>*</font></td>
+			<td>
+				<select name="pid" lay-verify="required" lay-reqText="请选择上级部门">
+					<option value="0">作为顶级部门</option>
+					{volist name="department" id="v"}
+					<option value="{$v.id}" {eq name="$detail.pid" value="$v.id"} selected{/eq}>{$v.title}</option>
+					{/volist}
+				</select>
+			</td>
+			<td class="layui-td-gray">排序<font>*</font></td>
+			<td>
+				<input type="text" name="sort" lay-verify="required|number" value="{$detail.sort}" autocomplete="off" placeholder="请输入排序" lay-reqText="请输入排序" class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">部门负责人</td>
+			<td colspan="3">
+				<select id="leader_ids" name="leader_ids" xm-selected="{$detail.leader_ids|default=''}" xm-select="select1" xm-select-skin="default"></select>
+			</td>
+			<td class="layui-td-gray-2">部门联系电话</td>
+			<td>
+				<input type="text" name="phone" value="{$detail.phone}" placeholder="请输入部门联系电话，可空" autocomplete="off" class="layui-input">
+			</td>
+		</tr>
+	</table>
+	{/eq}
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const did = {$id};
+	const moduleInit = ['tool','formSelects'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,formSelects=layui.formSelects;
+		if(did>0){
+			//选择部门人员
+			var selected = $('#leader_ids').attr('xm-selected');
+			formSelects.data('select1', 'server', {
+				url: '/api/index/get_employee_select?did='+did,
+				keyword: selected
+			});
+		}
+		//监听提交
+		form.on('submit(webform)', function(data){
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);					
+				}
+			}
+			tool.post("/user/department/add", data.field, callback);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
diff --git a/app/user/view/department/index.html b/app/user/view/department/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..92acfddefffbf8ab21107060fa15223478be8208
--- /dev/null
+++ b/app/user/view/department/index.html
@@ -0,0 +1,84 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<div class="gg-form-bar border-t border-x" style="padding-bottom:12px;">
+		<button class="layui-btn layui-btn-sm add-menu">+ 添加部门</button>
+	</div>
+	<div>
+		<table class="layui-hide" id="treeTable" lay-filter="treeTable"></table>
+	</div>
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var treeTable = layui.treeTable, tool = layui.tool;
+		
+		layui.pageTable = treeTable.render({
+			elem: '#treeTable'
+			,id: 'treeTable'
+			,url: "/user/department/index"
+			,tree: { // treeTable 特定属性集
+				customName: {name:'title'},
+				data: {},
+				view: {showIcon:false},
+				async: {},
+				callback: {}
+			}
+			,done:function(){
+				treeTable.expandAll('treeTable', true); // 关闭全部节点
+			}
+			, cols: [[
+				 { field: 'id', width: 80, title: 'ID号', align: 'center' }
+				, { field: 'pid', title: '上级部门ID',width: 90, align: 'center'}
+				, { field: 'title', title: '部门名称'}
+				, { field: 'sort', title: '排序',width: 60, align: 'center'}
+				, { field: 'leader', title: '部门负责人',width: 200}
+				, { field: 'phone', title: '部门电话',width: 136,}
+				, { width:168, title: '操作', align: 'center', templet: function (d) {
+						var html = '<span class="layui-btn-group"><button class="layui-btn layui-btn-xs" lay-event="add">添加下级部门</button><button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</button><button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button></span>';
+						return html;
+					}
+				}
+			]]
+			, page: false
+		});
+		
+		//表头工具栏事件
+		$('body').on('click','.add-menu', function(){
+			tool.side("/user/department/add");
+			return;
+		});
+
+		//操作按钮
+		treeTable.on('tool(treeTable)', function (obj) {
+			if (obj.event === 'add') {
+				tool.side("/user/department/add?pid="+obj.data.id);
+				return;
+			}
+			if (obj.event === 'edit') {
+				tool.side("/user/department/add?id="+obj.data.id);
+				return;
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要删除吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/user/department/delete", { id: obj.data.id }, callback);
+					layer.close(index);
+				});
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/user/view/files/add.html b/app/user/view/files/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..38098c424ae6c73276a0484ec3646b678097db82
--- /dev/null
+++ b/app/user/view/files/add.html
@@ -0,0 +1,530 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+.tr-none td{padding:20px 0; color:#999;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">编辑员工档案</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td colspan="8"><strong>基本信息</strong></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">员工姓名</td>
+			<td>{$detail.name}</td>
+			<td class="layui-td-gray-2">员工性别</td>
+			<td>
+				{eq name="$detail.sex" value="1"}男{/eq}
+				{eq name="$detail.sex" value="2"}女{/eq}
+			</td>
+			<td rowspan="7" class="layui-td-gray-2">头像</td>
+			<td rowspan="7" valign="top" style="width: 180px;">
+				<div class="layui-upload" style="width: 180px;">
+					<div class="layui-upload-list" id="uploadThumb" style="width: 100%; height:180px; overflow: hidden;">
+						<img src="{$detail.thumb}" height="180" style="max-width: 100%;" />
+						<input type="hidden" name="thumb" value="{$detail.thumb}">
+					</div>
+					<button type="button" class="layui-btn layui-btn-normal" style="width: 100%;" id="uploadImg">更换头像</button>
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">出生日期</td>
+			<td><input type="text" name="birthday" value="{$detail.birthday}" readonly autocomplete="off" placeholder="请选择" class="layui-input tool-time"></td>
+			<td class="layui-td-gray">身份证号码</td>
+			<td><input type="text" name="idcard" value="{$detail.idcard}" autocomplete="off" placeholder="请输入" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">政治面貌</td>
+			<td>
+				<select name="political">
+					<option value="0" {eq name="$detail.political" value="0"} selected{/eq}>无</option>
+					<option value="1" {eq name="$detail.political" value="1"} selected{/eq}>中共党员</option>
+					<option value="2" {eq name="$detail.political" value="2"} selected{/eq}>团员</option>
+				</select>
+			</td>
+			<td class="layui-td-gray">婚姻状况</td>
+			<td>
+				<input type="radio" name="marital_status" value="1" title="未婚" {eq name="$detail.marital_status" value="1"} checked{/eq}>
+				<input type="radio" name="marital_status" value="2" title="已婚" {eq name="$detail.marital_status" value="2"} checked{/eq}>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">民族</td>
+			<td><input type="text" name="nation" value="{$detail.nation}" autocomplete="off" placeholder="请输入" class="layui-input"></td>
+			<td class="layui-td-gray">籍贯</td>
+			<td><input type="text" name="native_place" value="{$detail.native_place}" autocomplete="off" placeholder="请输入" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">户口性质</td>
+			<td>
+				<input type="radio" name="resident_type" value="1" title="农村户口" {eq name="$detail.resident_type" value="1"} checked{/eq}>
+				<input type="radio" name="resident_type" value="2" title="城镇户口" {eq name="$detail.resident_type" value="2"} checked{/eq}>
+			</td>
+			<td class="layui-td-gray">户口所在地</td>
+			<td><input type="text" name="resident_place" value="{$detail.resident_place}" autocomplete="off" placeholder="请输入" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">毕业院校</td>
+			<td><input type="text" name="graduate_school" value="{$detail.graduate_school}" autocomplete="off" placeholder="请输入" class="layui-input"></td>
+			<td class="layui-td-gray">毕业日期</td>
+			<td><input type="text" name="graduate_day" value="{$detail.graduate_day}" readonly autocomplete="off" placeholder="请选择" class="layui-input tool-time"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">最高学位</td>
+			<td><input type="text" name="education" value="{$detail.education}" autocomplete="off" placeholder="请输入" class="layui-input"></td>
+			<td class="layui-td-gray">专业</td>
+			<td><input type="text" name="speciality" value="{$detail.speciality}" autocomplete="off" placeholder="请输入" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">家庭住址</td>
+			<td><input type="text" name="home_address" value="{$detail.home_address}" autocomplete="off" placeholder="请输入" class="layui-input"></td>
+			<td class="layui-td-gray">手机号码</td>
+			<td>{$detail.mobile}</td>
+			<td class="layui-td-gray">电子邮箱</td>
+			<td>{$detail.email}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">现住地址</td>
+			<td><input type="text" name="current_address" value="{$detail.current_address}" autocomplete="off" placeholder="请输入" class="layui-input"></td>
+			<td class="layui-td-gray">紧急联系人</td>
+			<td><input type="text" name="contact" value="{$detail.contact}" autocomplete="off" placeholder="请输入" class="layui-input"></td>
+			<td class="layui-td-gray">紧急联系电话</td>
+			<td><input type="text" name="contact_mobile" value="{$detail.contact_mobile}" autocomplete="off" placeholder="请输入" class="layui-input"></td>
+		</tr>
+
+		<tr>
+			<td class="layui-td-gray">员工简介</td>
+			<td colspan="7">
+				<textarea name="desc" placeholder="请输入员工简介" class="layui-textarea">{$detail.desc|default=''}</textarea>
+			</td>
+		</tr>
+		<tr>
+			<td colspan="8"><strong>入职信息</strong></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">所在部门</td>
+			<td>{$detail.department}</td>
+			<td class="layui-td-gray">上级主管</td>
+			<td>{$detail.pname|default='无'}</td>
+			<td class="layui-td-gray">岗位</td>
+			<td>{$detail.position}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">入职日期</td>
+			<td>{$detail.entry_time|date='Y-m-d'}</td>
+			<td class="layui-td-gray">职务</td>
+			<td>
+				<select name="position_name" lay-verify="required" lay-reqText="请选择职务">
+					<option value="0">请选择</option>
+					{volist name=":get_base_type_data('basic_user',1)" id="v"}
+					<option value="{$v.id}" {eq name="$detail.position_name" value="$v.id"} selected{/eq}>{$v.title}</option>
+					{/volist}
+				</select>
+			</td>
+			<td class="layui-td-gray">职级</td>
+			<td>
+				<select name="position_rank" lay-verify="required" lay-reqText="请选择职级">
+					<option value="0">请选择</option>
+					{volist name=":get_base_type_data('basic_user',2)" id="v"}
+					<option value="{$v.id}" {eq name="$detail.position_rank" value="$v.id"} selected{/eq}>{$v.title}</option>
+					{/volist}
+				</select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">员工类型</td>
+			<td>
+				{eq name="$detail.type" value="3"}实习{/eq}
+				{eq name="$detail.type" value="2"}试用{/eq}
+				{eq name="$detail.type" value="1"}正式{/eq}
+			</td>
+			<td class="layui-td-gray">工资卡开户行</td>
+			<td><input type="text" name="bank_info" value="{$detail.bank_info}" autocomplete="off" placeholder="请输入" class="layui-input"></td>
+			<td class="layui-td-gray">工资卡帐号</td>
+			<td><input type="text" name="bank_account" value="{$detail.bank_account}" autocomplete="off" placeholder="请输入" class="layui-input"></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">公积金号</td>
+			<td><input type="text" name="provident_account" value="{$detail.provident_account}" autocomplete="off" placeholder="请输入" class="layui-input"></td>
+			<td class="layui-td-gray">社保卡号</td>
+			<td><input type="text" name="social_account" value="{$detail.social_account}" autocomplete="off" placeholder="请输入" class="layui-input"></td>
+			<td class="layui-td-gray">参加工作时间</td>
+			<td><input type="text" name="work_date" value="{$detail.work_date}" readonly autocomplete="off" placeholder="请输入" class="layui-input tool-time"></td>
+		</tr>
+		<tr>
+			<td colspan="8"><strong>教育经历</strong> <button class="layui-btn layui-btn-xs add-tr" type="button" data-type="edu">+ 教育经历</button></td>
+		</tr>
+		<tr>
+			<td colspan="8">
+				<table id="edu_table" class="layui-table layui-table-min" style="margin:0">
+					<tr>
+						<th width="150">开始时间</th>
+						<th width="150">结束时间</th>
+						<th width="200">就读院校</th>
+						<th width="150">学习专业</th>
+						<th width="100">所获学历</th>
+						<th>备注说明</th>
+						<th width="60">操作</th>
+					</tr>
+					{empty name="$edu"}
+					<tr class="tr-none">
+						<td colspan="7">暂无数据</td>
+					</tr>
+					{else/}
+					{volist name="$edu" id="v"}
+						<tr class="edu_interfix">
+							<td><input type="text" name="edu_start_time[]" value="{$v.start_time}" class="layui-input tool-time" readonly lay-verify="required" lay-reqText="请完善开始时间"></td>
+							<td><input type="text" name="edu_end_time[]" value="{$v.end_time}" class="layui-input tool-time" readonly lay-verify="required" lay-reqText="请完善结束时间"></td>
+							<td><input type="text" name="edu_title[]" value="{$v.title}" class="layui-input" lay-verify="required" lay-reqText="请完善就读院校"></td>
+							<td><input type="text" name="edu_speciality[]" value="{$v.speciality}" class="layui-input" lay-verify="required" lay-reqText="请完善学习专业"></td>
+							<td><input type="text" name="edu_education[]" value="{$v.education}" class="layui-input" lay-verify="required" lay-reqText="请完善所获学历"></td>
+							<td><input type="text" name="edu_remark[]" class="layui-input" value="{$v.remark}"></td>
+							<td><input type="hidden" name="edu_id[]" class="layui-input" value="{$v.id}"><a class="layui-btn layui-btn-danger layui-btn-xs" data-id="{$v.id}" data-type="edu" lay-event="del">删除</a></td>
+						</tr>
+					{/volist}
+					{/empty}
+				</table>
+			</td>
+		</tr>
+		<tr>
+			<td colspan="8"><strong>工作经历</strong> <button class="layui-btn layui-btn-xs add-tr" type="button" data-type="work">+ 工作经历</button></td>
+		</tr>
+		<tr>
+			<td colspan="8">
+				<table id="work_table" class="layui-table layui-table-min" style="margin:0">
+					<tr>
+						<th width="150">开始时间</th>
+						<th width="150">结束时间</th>
+						<th width="200">公司名称</th>
+						<th width="100">职位</th>
+						<th>备注说明</th>
+						<th width="60">操作</th>
+					</tr>
+					{empty name="$work"}
+					<tr class="tr-none">
+						<td colspan="6">暂无数据</td>
+					</tr>
+					{else/}
+					{volist name="$work" id="v"}
+						<tr class="work_interfix">
+							<td><input type="text" name="work_start_time[]" value="{$v.start_time}" class="layui-input tool-time" readonly lay-verify="required" lay-reqText="请完善开始时间"></td>
+							<td><input type="text" name="work_end_time[]" value="{$v.end_time}" class="layui-input tool-time" readonly lay-verify="required" lay-reqText="请完善结束时间"></td>
+							<td><input type="text" name="work_title[]" value="{$v.title}" class="layui-input" lay-verify="required" lay-reqText="请完善公司名称"></td>
+							<td><input type="text" name="work_position[]" value="{$v.position}" class="layui-input" lay-verify="required" lay-reqText="请完善职位"></td>
+							<td><input type="text" name="work_remark[]" class="layui-input" value="{$v.remark}"></td>
+							<td><input type="hidden" name="work_id[]" class="layui-input" value="{$v.id}"><a class="layui-btn layui-btn-danger layui-btn-xs" data-id="{$v.id}" data-type="work" lay-event="del">删除</a></td>
+						</tr>
+					{/volist}
+					{/empty}
+				</table>
+			</td>
+		</tr>
+		<tr>
+			<td colspan="8"><strong>相关证书</strong> <button class="layui-btn layui-btn-xs add-tr" type="button" data-type="certificate">+ 相关证书</button></td>
+		</tr>
+		<tr>
+			<td colspan="8">
+				<table id="certificate_table" class="layui-table layui-table-min" style="margin:0">
+					<tr>
+						<th width="150">证书名称</th>
+						<th width="150">获得时间</th>
+						<th width="200">颁发机构</th>
+						<th>备注说明</th>
+						<th width="60">操作</th>
+					</tr>
+					{empty name="$certificate"}
+					<tr class="tr-none">
+						<td colspan="5">暂无数据</td>
+					</tr>
+					{else/}
+					{volist name="$certificate" id="v"}
+						<tr class="certificate_interfix">
+							<td><input type="text" name="certificate_title[]" value="{$v.title}" class="layui-input" lay-verify="required" lay-reqText="请完善证书名称"></td>
+							<td><input type="text" name="certificate_start_time[]" value="{$v.start_time}" class="layui-input tool-time" lay-verify="required" lay-reqText="请完善获得时间"></td>
+							<td><input type="text" name="certificate_authority[]" value="{$v.authority}" class="layui-input" lay-verify="required" lay-reqText="请完善颁发机构"></td>
+							<td><input type="text" name="certificate_remark[]" class="layui-input" value="{$v.remark}"></td>
+							<td><input type="hidden" name="certificate_id[]" class="layui-input" value="{$v.id}"><a class="layui-btn layui-btn-danger layui-btn-xs" data-id="{$v.id}" data-type="certificate" lay-event="del">删除</a></td>
+						</tr>
+					{/volist}
+					{/empty}
+				</table>
+			</td>
+		</tr>
+		<tr>
+			<td colspan="8"><strong>计算机技能</strong> <button class="layui-btn layui-btn-xs add-tr" type="button" data-type="skills">+ 计算机技能</button></td>
+		</tr>
+		<tr>
+			<td colspan="8">
+				<table id="skills_table" class="layui-table layui-table-min" style="margin:0">
+					<tr>
+						<th width="200">技能名称</th>
+						<th width="150">熟悉程度</th>
+						<th>备注说明</th>
+						<th width="60">操作</th>
+					</tr>
+					{empty name="$skills"}
+					<tr class="tr-none">
+						<td colspan="4">暂无数据</td>
+					</tr>
+					{else/}
+					{volist name="$skills" id="v"}
+						<tr class="skills_interfix">
+							<td><input type="text" name="skills_title[]" value="{$v.title}" class="layui-input" lay-verify="required" lay-reqText="请完善技能名称"></td>
+							<td>
+								<select name="skills_know[]" lay-verify="required" lay-reqText="请选择熟悉程度">
+									<option value="">请选择</option>
+									<option value="1" {eq name="$v.know" value="1"} selected{/eq}>熟练</option>
+									<option value="2" {eq name="$v.know" value="2"} selected{/eq}>良好</option>
+									<option value="3" {eq name="$v.know" value="3"} selected{/eq}>一般</option>
+									<option value="4" {eq name="$v.know" value="4"} selected{/eq}>较差</option>
+								</select>
+							</td>
+							<td><input type="text" name="skills_remark[]" class="layui-input" value="{$v.remark}"></td>
+							<td><input type="hidden" name="skills_id[]" class="layui-input" value="{$v.id}"><a class="layui-btn layui-btn-danger layui-btn-xs" data-id="{$v.id}" data-type="skills" lay-event="del">删除</a></td>
+						</tr>
+					{/volist}
+					{/empty}
+				</table>
+			</td>
+		</tr>
+		<tr>
+			<td colspan="8"><strong>语言能力</strong> <button class="layui-btn layui-btn-xs add-tr" type="button" data-type="language">+ 语言能力</button></td>
+		</tr>
+		<tr>
+			<td colspan="8">
+				<table id="language_table" class="layui-table layui-table-min" style="margin:0">
+					<tr>
+						<th width="200">语言名称</th>
+						<th width="150">熟悉程度</th>
+						<th>备注说明</th>
+						<th width="60">操作</th>
+					</tr>
+					{empty name="$language"}
+					<tr class="tr-none">
+						<td colspan="4">暂无数据</td>
+					</tr>
+					{else/}
+					{volist name="$language" id="v"}
+						<tr class="language_interfix">
+							<td><input type="text" name="language_title[]" value="{$v.title}" class="layui-input" lay-verify="required" lay-reqText="请完善技能名称"></td>
+							<td>
+								<select name="language_know[]" lay-verify="required" lay-reqText="请选择熟悉程度">
+									<option value="">请选择</option>
+									<option value="1" {eq name="$v.know" value="1"} selected{/eq}>熟练</option>
+									<option value="2" {eq name="$v.know" value="2"} selected{/eq}>良好</option>
+									<option value="3" {eq name="$v.know" value="3"} selected{/eq}>一般</option>
+									<option value="4" {eq name="$v.know" value="4"} selected{/eq}>较差</option>
+								</select>
+							</td>
+							<td><input type="text" name="language_remark[]" class="layui-input" value="{$v.remark}"></td>
+							<td><input type="hidden" name="language_id[]" class="layui-input" value="{$v.id}"><a class="layui-btn layui-btn-danger layui-btn-xs" data-id="{$v.id}" data-type="language" lay-event="del">删除</a></td>
+						</tr>
+					{/volist}
+					{/empty}
+				</table>
+			</td>
+		</tr>
+		<tr>
+			<td colspan="8"><strong>档案相关附件</strong> <button class="layui-btn layui-btn-xs add-tr" type="button" data-type="upload" id="uploadBtn">+ 上传附件</button></td>
+		</tr>
+		<tr>
+			<td colspan="8" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids}">
+					{notempty name="$detail.file_ids"}
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr>
+	</table>
+
+	<div class="pt-4">
+		<input type="hidden" value="{$detail.id}" name="id">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+
+<div style="display:none;">
+	<table>
+	<tbody id="edu_html">
+	<tr class="edu_interfix">
+		<td><input type="text" name="edu_start_time[]" value="" class="layui-input tool-time" readonly lay-verify="required" lay-reqText="请完善开始时间"></td>
+		<td><input type="text" name="edu_end_time[]" value="" class="layui-input tool-time" readonly lay-verify="required" lay-reqText="请完善结束时间"></td>
+		<td><input type="text" name="edu_title[]" value="" class="layui-input" lay-verify="required" lay-reqText="请完善就读院校"></td>
+		<td><input type="text" name="edu_speciality[]" value="" class="layui-input" lay-verify="required" lay-reqText="请完善学习专业"></td>
+		<td><input type="text" name="edu_education[]" value="" class="layui-input" lay-verify="required" lay-reqText="请完善所获学历"></td>
+		<td><input type="text" name="edu_remark[]" class="layui-input" value=""></td>
+		<td><input type="hidden" name="edu_id[]" class="layui-input" value="0"><a class="layui-btn layui-btn-danger layui-btn-xs" data-id="0" data-type="edu" lay-event="del">删除</a></td>
+	</tr>
+	</tbody>
+	</table>
+</div>
+
+<div style="display:none;">
+	<table>
+	<tbody id="work_html">
+	<tr class="work_interfix">
+		<td><input type="text" name="work_start_time[]" value="" class="layui-input tool-time" readonly lay-verify="required" lay-reqText="请完善开始时间"></td>
+		<td><input type="text" name="work_end_time[]" value="" class="layui-input tool-time" readonly lay-verify="required" lay-reqText="请完善结束时间"></td>
+		<td><input type="text" name="work_title[]" value="" class="layui-input" lay-verify="required" lay-reqText="请完善公司名称"></td>
+		<td><input type="text" name="work_position[]" value="" class="layui-input" lay-verify="required" lay-reqText="请完善职位"></td>
+		<td><input type="text" name="work_remark[]" class="layui-input" value=""></td>
+		<td><input type="hidden" name="work_id[]" class="layui-input" value="0"><a class="layui-btn layui-btn-danger layui-btn-xs" data-id="0" data-type="work" lay-event="del">删除</a></td>
+	</tr>
+	</tbody>
+	</table>
+</div>
+
+<div style="display:none;">
+	<table>
+	<tbody id="certificate_html">
+	<tr class="certificate_interfix">
+		<td><input type="text" name="certificate_title[]" value="" class="layui-input" lay-verify="required" lay-reqText="请完善证书名称"></td>
+		<td><input type="text" name="certificate_start_time[]" value="" class="layui-input tool-time" lay-verify="required" lay-reqText="请完善获得时间"></td>
+		<td><input type="text" name="certificate_authority[]" value="" class="layui-input" lay-verify="required" lay-reqText="请完善颁发机构"></td>
+		<td><input type="text" name="certificate_remark[]" class="layui-input" value=""></td>
+		<td><input type="hidden" name="certificate_id[]" class="layui-input" value="0"><a class="layui-btn layui-btn-danger layui-btn-xs" data-id="0" data-type="certificate" lay-event="del">删除</a></td>
+	</tr>
+	</tbody>
+	</table>
+</div>
+
+<div style="display:none;">
+	<table>
+	<tbody id="skills_html">
+	<tr class="skills_interfix">
+		<td><input type="text" name="skills_title[]" value="" class="layui-input" lay-verify="required" lay-reqText="请完善技能名称"></td>
+		<td>
+			<select name="skills_know[]" lay-verify="required" lay-reqText="请选择熟悉程度">
+				<option value="">请选择</option>
+				<option value="1">熟练</option>
+				<option value="2">良好</option>
+				<option value="3">一般</option>
+				<option value="4">较差</option>
+			</select>
+		</td>
+		<td><input type="text" name="skills_remark[]" class="layui-input" value=""></td>
+		<td><input type="hidden" name="skills_id[]" class="layui-input" value="0"><a class="layui-btn layui-btn-danger layui-btn-xs" data-id="0" data-type="skills" lay-event="del">删除</a></td>
+	</tr>
+	</tbody>
+	</table>
+</div>
+
+<div style="display:none;">
+	<table>
+	<tbody id="language_html">
+	<tr class="language_interfix">
+		<td><input type="text" name="language_title[]" value="" class="layui-input" lay-verify="required" lay-reqText="请完善语言名称"></td>
+		<td>
+			<select name="language_know[]" lay-verify="required" lay-reqText="请选择熟悉程度">
+				<option value="">请选择</option>
+				<option value="1">熟练</option>
+				<option value="2">良好</option>
+				<option value="3">一般</option>
+				<option value="4">较差</option>
+			</select>
+		</td>
+		<td><input type="text" name="language_remark[]" class="layui-input" value=""></td>
+		<td><input type="hidden" name="language_id[]" class="layui-input" value="0"><a class="layui-btn layui-btn-danger layui-btn-xs" data-id="0" data-type="language" lay-event="del">删除</a></td>
+	</tr>
+	</tbody>
+	</table>
+</div>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','uploadPlus'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,uploadPlus=layui.uploadPlus;
+		
+		//头像上传
+		var photoUpload = new uploadPlus({
+			'use':'single',
+			'target':'uploadImg',
+			'callback':function(res){
+				layer.msg(res.msg);
+				if (res.code == 0) {
+					//上传成功
+					$('#uploadThumb input').attr('value', res.data.filepath);
+					$('#uploadThumb img').attr('src', res.data.filepath);
+				}
+			}
+		});
+		
+		//相关附件上传
+		var attachment = new uploadPlus();
+		
+		//添加表格
+		$('.add-tr').on('click',function(){
+			let type = $(this).data('type');
+			let html = $('#'+type+'_html').html();
+			let timestamp = Date.now();
+			let $html = $(html);
+			let elem = $html.find('.diff_time').addClass('time_'+timestamp);
+			$('#'+type+'_table').append($html).find('.tr-none').remove();
+			form.render();
+		});
+
+		$('body').on('click', '[lay-event="del"]', function() {
+			var that=$(this);
+			let type = $(this).data('type');
+			var _id = that.data('id');
+			if(_id>0){
+				layer.confirm('确定删除该数据？', {
+					icon: 3,
+					title: '提示'
+				}, function(index) {
+					$.ajax({
+						url: "/user/api/del_profiles",
+						type:'post',
+						data: {id: _id},
+						success: function(res) {
+							layer.msg(res.msg);
+							if (res.code == 0) {
+								that.parents("."+type+"_interfix").remove();
+								if($('#'+type+'_table').find('tr').length<2){
+									$('#'+type+'_table').append('<tr class="tr-none"><td colspan="7">暂无数据</td></tr>');
+									return false;
+								}
+							}
+						}
+					})
+					layer.close(index);
+				});
+			}
+			else{
+				that.parents("."+type+"_interfix").remove();
+				if($('#'+type+'_table').find('tr').length<2){
+					$('#'+type+'_table').append('<tr class="tr-none"><td colspan="7">暂无数据</td></tr>');
+					return false;
+				}
+			}
+		});
+
+		//监听提交
+		form.on('submit(webform)', function(data){
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			tool.post("/user/files/add", data.field, callback);
+			return false;
+		});
+	}
+
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/user/view/files/datalist.html b/app/user/view/files/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..0401ecb337d6438e9f4119fe8f999a7a123c404e
--- /dev/null
+++ b/app/user/view/files/datalist.html
@@ -0,0 +1,245 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+  <style>
+	.tree-left{width:200px; float:left; height:calc(100vh - 79px); overflow-y: auto; border:1px solid #eeeeee; border-right:0; background-color:#fbfbfb; padding:12px 12px 12px 5px;}
+	.tree-left::-webkit-scrollbar {width: 0;}
+	.tree-left h3{font-size:16px; height:30px; padding-left:10px; font-weight:800}
+  </style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<div class="tree-left">
+		<h3>企业组织架构</h3>
+		<div id="depament"></div>
+	</div>
+	<div class="body-table" style="margin-left:200px; overflow:hidden;">
+		<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
+			<div class="layui-input-inline" style="width:124px">
+				<select name="status">
+					<option value="">选择员工状态</option>
+					<option value="1">正常状态</option>
+					<option value="2">离职状态</option>
+					<option value="0">禁止登录</option>
+				</select>
+			</div>
+			<div class="layui-input-inline" style="width:124px">
+				<select name="political">
+					<option value="">选择政治面貌</option>
+					<option value="1">中共党员</option>
+					<option value="2">团员</option>
+					<option value="0">无</option>
+				</select>
+			</div>
+			<div class="layui-input-inline" style="width:136px">
+				<select name="position_name">
+					<option value="">选择员工职务</option>
+					{volist name=":get_base_type_data('basic_user',1)" id="v"}
+					<option value="{$v.id}">{$v.title}</option>
+					{/volist}
+				</select>
+			</div>
+			<div class="layui-input-inline" style="width:136px">
+				<select name="position_rank">
+					<option value="">选择员工职级</option>
+					{volist name=":get_base_type_data('basic_user',2)" id="v"}
+					<option value="{$v.id}">{$v.title}</option>
+					{/volist}
+				</select>
+			</div>
+			<div class="layui-input-inline" style="width:360px">
+				<input type="text" name="keywords" placeholder="关键字，如：ID号/姓名/登录账号/手机号码/电子邮箱" class="layui-input" autocomplete="off" />
+			</div>
+			<div class="layui-input-inline" style="width:150px;">
+				<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+				<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+			</div>
+		</form>
+		<table class="layui-hide" id="test" lay-filter="test"></table>
+	</div>
+</div>
+
+<script type="text/html" id="thumb">
+	<img src="{{d.thumb}}" width="30" height="30" />
+</script>
+<script type="text/html" id="toolbara">
+	<h3>员工档案</h3>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus,tool = layui.tool,tree = layui.tree,form = layui.form;			
+		$.ajax({
+			url: "/api/index/get_department_tree",
+			type:'get',
+			success:function(res){					
+				//仅节点左侧图标控制收缩
+				tree.render({
+					elem: '#depament',
+					data: res.trees,
+					onlyIconControl: true,  //是否仅允许节点左侧图标控制展开收缩
+					click: function(obj){
+						//layer.msg(JSON.stringify(obj.data));
+						$('#depament').find('.layui-tree-main').removeClass('on');
+						$(obj.elem).find('.layui-tree-main').eq(0).addClass('on');
+						layui.pageTable.reload({
+						   where:{did: obj.data.id},
+						   page:{curr:1}
+						});
+						$('[name="keywords"]').val('');
+						$('[name="status"]').val('');
+						$('[name="type"]').val('');
+						layui.form.render('select');
+					}
+				});	
+			}
+		});
+		
+		layui.pageTable = table.render({
+			elem: '#test',
+			title: '员工列表',
+			toolbar: '#toolbara',
+			defaultToolbar: [],
+			is_excel:true,
+			url: "/user/files/datalist", //数据接口	
+			height: 'full-112',
+			cols: [
+				[
+					{
+						field: 'id',
+						title: 'ID号',
+						align: 'center',
+						fixed:'left',
+						width: 80
+					},{
+						field: 'type',
+						title: '员工类型',
+						align: 'center',
+						width: 80,
+						templet: function (d) {
+							var html = '<span style="color:#393D49">正式员工</span>';
+							if(d.type == 2){
+								html = '<span style="color:#01AAED">试用员工</span>'
+							}
+							else if(d.type == 3){
+								html = '<span style="color:#5FB878">实 习 生</span>'
+							}
+							return html;
+						}
+					}, {
+						field: 'name',
+						title: '员工姓名',
+						align: 'center',
+						width: 80
+					}, {
+						field: 'thumb',
+						title: '头像',
+						toolbar: '#thumb',
+						align: 'center',
+						width: 50
+					}, {
+						field: 'mobile',
+						title: '手机号码',
+						align: 'center',
+						width: 120
+					},{
+						field: 'email',
+						title: '电子邮箱',
+						width: 200
+					},{
+						field: 'sex',
+						title: '性别',
+						align: 'center',
+						width: 50,
+						templet: function (d) {
+							var html = '未知';
+							if(d.sex == 1){
+								html = '男'
+							}
+							else if(d.sex == 2){
+								html = '女'
+							}
+							return html;
+						}
+					},{
+						field: 'department',
+						title: '所在主部门',
+						width: 100
+					}, {
+						field: 'departments',
+						title: '所在次部门',
+						width: 160
+					}, {
+						field: 'position',
+						title: '岗位职称',
+						align: 'center',
+						width: 100
+					}, {
+						field: 'job_number',
+						title: '工号',
+						align: 'center',
+						width: 120
+					},{
+						field: 'entry_time',
+						title: '入职日期',
+						align: 'center',
+						width: 100
+					}, {
+						field: 'birthday',
+						title: '出生日期',
+						align: 'center',
+						width: 90
+					}, {
+						field: 'nation',
+						title: '民族',
+						align: 'center',
+						minWidth: 60
+					}, {
+						field: 'native_place',
+						title: '籍贯',
+						align: 'center',
+						minWidth: 90
+					}, {
+						field: 'political',
+						title: '政治面貌',
+						align: 'center',
+						minWidth: 80
+					},{
+						field: 'right',
+						fixed:'right',
+						title: '操作',
+						width: 90,
+						align: 'center',
+						templet: function (d) {
+							var html = '';
+							var btn1 = '<span class="layui-btn layui-btn-xs layui-btn-normal" lay-event="view">详情</span>';
+							var btn2 = '<span class="layui-btn layui-btn-xs" lay-event="edit">编辑</span>';
+							html = '<div class="layui-btn-group">'+btn1+btn2+'</div>';
+							return html;
+						}						
+					}
+				]
+			]
+		});
+
+		//监听行工具事件
+		table.on('tool(test)', function (obj) {
+			var data = obj.data;			
+			if (obj.event === 'view') {
+				tool.side('/user/files/view?id='+data.id);
+				return;
+			}
+			if(obj.event === 'edit'){
+				tool.side('/user/files/add?id='+data.id);
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/user/view/files/view.html b/app/user/view/files/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..02833c352b1677b0adc667394ea53713c4a6aebe
--- /dev/null
+++ b/app/user/view/files/view.html
@@ -0,0 +1,312 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+.tr-none td{padding:20px 0; color:#999;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">{$detail.name}员工档案详情</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td colspan="8"><strong>基本信息</strong></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">员工姓名</td>
+			<td>{$detail.name}</td>
+			<td class="layui-td-gray-2">员工性别</td>
+			<td>
+				{eq name="$detail.sex" value="1"}男{/eq}
+				{eq name="$detail.sex" value="2"}女{/eq}
+			</td>
+			<td rowspan="7" class="layui-td-gray-2">头像</td>
+			<td rowspan="7" valign="top" style="width: 180px;">
+				<div class="layui-upload" style="width: 180px;">
+					<img src="{$detail.thumb}" style="max-width: 100%;" />
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">出生日期</td>
+			<td>{$detail.birthday}</td>
+			<td class="layui-td-gray">身份证号码</td>
+			<td>{$detail.idcard}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">政治面貌</td>
+			<td>
+				{eq name="$detail.political" value="0"}无{/eq}
+				{eq name="$detail.political" value="1"}中共党员{/eq}
+				{eq name="$detail.political" value="2"}团员{/eq}
+			</td>
+			<td class="layui-td-gray">婚姻状况</td>
+			<td>
+				{eq name="$detail.marital_status" value="1"}未婚{/eq}
+				{eq name="$detail.marital_status" value="2"}已婚{/eq}
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">民族</td>
+			<td>{$detail.nation}</td>
+			<td class="layui-td-gray">籍贯</td>
+			<td>{$detail.native_place}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">户口性质</td>
+			<td>
+				{eq name="$detail.resident_type" value="1"}农村户口{/eq}
+				{eq name="$detail.resident_type" value="2"}城镇户口{/eq}
+			</td>
+			<td class="layui-td-gray">户口所在地</td>
+			<td>{$detail.resident_place}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">毕业院校</td>
+			<td>{$detail.graduate_school}</td>
+			<td class="layui-td-gray">毕业日期</td>
+			<td>{$detail.graduate_day}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">最高学位</td>
+			<td>{$detail.education}</td>
+			<td class="layui-td-gray">专业</td>
+			<td>{$detail.speciality}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">家庭住址</td>
+			<td>{$detail.home_address}</td>
+			<td class="layui-td-gray">手机号码</td>
+			<td>{$detail.mobile}</td>
+			<td class="layui-td-gray">电子邮箱</td>
+			<td>{$detail.email}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">现住地址</td>
+			<td>{$detail.current_address}</td>
+			<td class="layui-td-gray">紧急联系人</td>
+			<td>{$detail.contact}</td>
+			<td class="layui-td-gray">紧急联系电话</td>
+			<td>{$detail.contact_mobile}</td>
+		</tr>
+
+		<tr>
+			<td class="layui-td-gray">员工简介</td>
+			<td colspan="7">
+				{$detail.desc|default=''}
+			</td>
+		</tr>
+		<tr>
+			<td colspan="8"><strong>入职信息</strong></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">所在部门</td>
+			<td>{$detail.department}</td>
+			<td class="layui-td-gray">上级主管</td>
+			<td>{$detail.pname|default='无'}</td>
+			<td class="layui-td-gray">岗位</td>
+			<td>{$detail.position}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">入职日期</td>
+			<td>{$detail.entry_time|date='Y-m-d'}</td>
+			<td class="layui-td-gray">职务</td>
+			<td>
+				{volist name=":get_base_type_data('basic_user',1)" id="v"}
+				{eq name="$detail.position_name" value="$v.id"}{$v.title}{/eq}
+				{/volist}
+			</td>
+			<td class="layui-td-gray">职级</td>
+			<td>
+				{volist name=":get_base_type_data('basic_user',2)" id="v"}
+				{eq name="$detail.position_rank" value="$v.id"}{$v.title}{/eq}>
+				{/volist}
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">员工类型</td>
+			<td>
+				{eq name="$detail.type" value="3"}实习{/eq}
+				{eq name="$detail.type" value="2"}试用{/eq}
+				{eq name="$detail.type" value="1"}正式{/eq}
+			</td>
+			<td class="layui-td-gray">工资卡开户行</td>
+			<td>{$detail.bank_info}</td>
+			<td class="layui-td-gray">工资卡帐号</td>
+			<td>{$detail.bank_account}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">公积金号</td>
+			<td>{$detail.provident_account}</td>
+			<td class="layui-td-gray">社保卡号</td>
+			<td>{$detail.social_account}</td>
+			<td class="layui-td-gray">参加工作时间</td>
+			<td>{$detail.work_date}</td>
+		</tr>
+		{notempty name="$edu"}
+		<tr>
+			<td colspan="8"><strong>教育经历</strong></td>
+		</tr>
+		<tr>
+			<td colspan="8">
+				<table id="edu_table" class="layui-table layui-table-min" style="margin:0">
+					<tr>
+						<th width="150">开始时间</th>
+						<th width="150">结束时间</th>
+						<th width="200">就读院校</th>
+						<th width="150">学习专业</th>
+						<th width="100">所获学历</th>
+						<th>备注说明</th>
+					</tr>
+					{volist name="$edu" id="v"}
+						<tr class="edu_interfix">
+							<td>{$v.start_time}</td>
+							<td>{$v.end_time}</td>
+							<td>{$v.title}</td>
+							<td>{$v.speciality}</td>
+							<td>{$v.education}</td>
+							<td style="text-align:left;">{$v.remark}</td>
+						</tr>
+					{/volist}
+				</table>
+			</td>
+		</tr>
+		{/notempty}
+		{notempty name="$work"}
+		<tr>
+			<td colspan="8"><strong>工作经历</strong></td>
+		</tr>
+		<tr>
+			<td colspan="8">
+				<table id="work_table" class="layui-table layui-table-min" style="margin:0">
+					<tr>
+						<th width="150">开始时间</th>
+						<th width="150">结束时间</th>
+						<th width="200">公司名称</th>
+						<th width="100">职位</th>
+						<th>备注说明</th>
+					</tr>
+					{volist name="$work" id="v"}
+						<tr class="work_interfix">
+							<td>{$v.start_time}</td>
+							<td>{$v.end_time}</td>
+							<td>{$v.title}</td>
+							<td>{$v.position}</td>
+							<td style="text-align:left;">{$v.remark}</td>
+						</tr>
+					{/volist}
+				</table>
+			</td>
+		</tr>
+		{/notempty}
+		{notempty name="$certificate"}
+		<tr>
+			<td colspan="8"><strong>相关证书</strong></td>
+		</tr>
+		<tr>
+			<td colspan="8">
+				<table id="certificate_table" class="layui-table layui-table-min" style="margin:0">
+					<tr>
+						<th width="150">证书名称</th>
+						<th width="150">获得时间</th>
+						<th width="200">颁发机构</th>
+						<th>备注说明</th>
+					</tr>
+					{volist name="$certificate" id="v"}
+						<tr class="certificate_interfix">
+							<td>{$v.title}</td>
+							<td>{$v.start_time}</td>
+							<td>{$v.authority}</td>
+							<td style="text-align:left;">{$v.remark}</td>
+						</tr>
+					{/volist}
+				</table>
+			</td>
+		</tr>
+		{/notempty}
+		{notempty name="$certificate"}
+		<tr>
+			<td colspan="8"><strong>计算机技能</strong></td>
+		</tr>
+		<tr>
+			<td colspan="8">
+				<table id="skills_table" class="layui-table layui-table-min" style="margin:0">
+					<tr>
+						<th width="200">技能名称</th>
+						<th width="150">熟悉程度</th>
+						<th>备注说明</th>
+					</tr>
+					{volist name="$skills" id="v"}
+					<tr class="skills_interfix">
+						<td>{$v.title}</td>
+						<td>
+							{eq name="$v.know" value="1"}熟练{/eq}
+							{eq name="$v.know" value="2"}良好{/eq}
+							{eq name="$v.know" value="3"}一般{/eq}
+							{eq name="$v.know" value="4"}较差{/eq}
+						</td>
+						<td style="text-align:left;">{$v.remark}</td>
+					</tr>
+					{/volist}
+				</table>
+			</td>
+		</tr>
+		{/notempty}
+		{notempty name="$language"}
+		<tr>
+			<td colspan="8"><strong>语言能力</strong></td>
+		</tr>
+		<tr>
+			<td colspan="8">
+				<table id="language_table" class="layui-table layui-table-min" style="margin:0">
+					<tr>
+						<th width="200">语言名称</th>
+						<th width="150">熟悉程度</th>
+						<th>备注说明</th>
+					</tr>
+					{volist name="$language" id="v"}
+						<tr class="skills_interfix">
+							<td>{$v.title}</td>
+							<td>
+								{eq name="$v.know" value="1"}熟练{/eq}
+								{eq name="$v.know" value="2"}良好{/eq}
+								{eq name="$v.know" value="3"}一般{/eq}
+								{eq name="$v.know" value="4"}较差{/eq}
+							</td>
+							<td style="text-align:left;">{$v.remark}</td>
+						</tr>
+					{/volist}
+				</table>
+			</td>
+		</tr>
+		{/notempty}
+		{notempty name="$detail.file_ids"}
+		<tr>
+			<td colspan="8"><strong>档案相关附件</strong></td>
+		</tr>
+		<tr>
+			<td colspan="8" style="line-height:inherit">
+				<div class="layui-row">
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+	</table>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+	
+	}
+
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/user/view/laborcontract/add.html b/app/user/view/laborcontract/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..56f6ae56a818e4e10db964dfd2c33b7e4cae9f61
--- /dev/null
+++ b/app/user/view/laborcontract/add.html
@@ -0,0 +1,146 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">新增员工合同</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">合同类别</td>
+			<td>{$cate_title}</td>
+			<td class="layui-td-gray">合同类型</td>
+			<td>新签合同</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">员工姓名<font>*</font></td>
+			<td>
+				<input type="text" name="uname" lay-verify="required" autocomplete="off" placeholder="请选择" lay-reqText="请选择员工姓名" class="layui-input picker-admin" readonly value="">
+				<input type="hidden" name="uid" value="0">
+			</td>
+			<td class="layui-td-gray">签约主体公司<font>*</font></td>
+			<td>
+				<select name="enterprise_id" lay-verify="required" lay-reqText="请选择签约主体公司">
+					<option value="">请选择</option>
+					{volist name=":get_base_data('Enterprise')" id="vo"}
+					<option value="{$vo.id}">{$vo.title}</option>
+					{/volist}
+				</select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">合同名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请完善合同名称" lay-reqText="请完善合同名称" class="layui-input" value="">
+			</td>
+			<td class="layui-td-gray">合同编码<font>*</font></td>
+			<td>
+				<input type="text" name="code" lay-verify="required" autocomplete="off" placeholder="请完善合同编码" lay-reqText="请完善合同编码" class="layui-input" value="">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">签订日期<font>*</font></td>
+			<td>
+				<input type="text" name="sign_time" readonly lay-verify="required" autocomplete="off" placeholder="请选择" lay-reqText="请选择签约日期" class="layui-input tool-time" value="">
+			</td>
+			<td class="layui-td-gray">合同属性<font>*</font></td>
+			<td>
+				<select name="properties" lay-verify="required" lay-reqText="请选择合同属性">
+					<option value="">请选择</option>
+					{volist name="$properties" id="vo"}
+					{gt name="$key" value="0"}
+					<option value="{$key}">{$vo}</option>
+					{/gt}
+					{/volist}
+				</select>
+			</td>
+		</tr>
+		</tr>
+		<tr>			
+			<td class="layui-td-gray-2">合同生效时间<font>*</font></td>
+			<td>
+				<input type="text" name="start_time" readonly lay-verify="required" autocomplete="off" placeholder="请选择" lay-reqText="请选择生效时间" class="layui-input tool-time" value="">
+			</td>
+			<td class="layui-td-gray-2">合同失效时间<font>*</font></td>
+			<td>
+				<input type="text" name="end_time" readonly lay-verify="required" autocomplete="off" placeholder="请选择" lay-reqText="请选择失效时间" class="layui-input tool-time" value="">
+			</td>
+		</tr>
+		{eq name="$cate_id" value="1"}
+		<tr>
+			<td class="layui-td-gray-2">员工试用月数<font>*</font></td>
+			<td>
+				<input type="text" name="trial_months" lay-verify="required|number" autocomplete="off" placeholder="请选择" lay-reqText="请完善试用月数，仅为数字" class="layui-input" value="">
+			</td>
+			<td class="layui-td-gray-2">试用结束时间<font>*</font></td>
+			<td>
+				<input type="text" name="trial_end_time" readonly lay-verify="required" autocomplete="off" placeholder="请选择" lay-reqText="请选择试用结束时间" class="layui-input tool-time" value="">
+			</td>
+		</tr>
+		<tr>	
+			<td class="layui-td-gray-2">试用工资(元)<font>*</font></td>
+			<td>
+				<input type="text" name="trial_salary" lay-verify="required|number" autocomplete="off" placeholder="请选择" lay-reqText="请完善试用工资，仅为数字" class="layui-input" value="">
+			</td>
+			<td class="layui-td-gray-2">转正工资(元)<font>*</font></td>
+			<td>
+				<input type="text" name="worker_salary" lay-verify="required|number" autocomplete="off" placeholder="请选择" lay-reqText="请完善转正工资，仅为数字" class="layui-input" value="">
+			</td>
+		</tr>
+		{/eq}
+		{in name="$cate_id" value="2,3"}
+		<tr>	
+			<td class="layui-td-gray-2">工资费用(元)<font>*</font></td>
+			<td>
+				<input type="text" name="worker_salary" lay-verify="required|number" autocomplete="off" placeholder="请选择" lay-reqText="请完善转正工资，仅为数字" class="layui-input" value="">
+			</td>
+		</tr>
+		{/in}
+		<tr>
+			<td class="layui-td-gray">备注说明</td>
+			<td colspan="3">
+				<textarea name="remark" placeholder="请输入备注说明，可空" class="layui-textarea"></textarea>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray"><strong>相关附件</strong> <button class="layui-btn layui-btn-xs add-tr" type="button" data-type="upload" id="uploadBtn">+ 上传附件</button></td>
+			<td colspan="3" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="">
+				</div>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<input type="hidden" name="id" value="0"/>
+		<input type="hidden" name="cate" value="{$cate_id|default=1}"/>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool','oaPicker','uploadPlus'];
+
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool,uploadPlus=layui.uploadPlus;
+		//相关附件上传
+		var attachment = new uploadPlus();
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/user/laborcontract/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/user/view/laborcontract/add_change.html b/app/user/view/laborcontract/add_change.html
new file mode 100644
index 0000000000000000000000000000000000000000..1abfe8f7d583147d3ea6eadd821db525c4f3e604
--- /dev/null
+++ b/app/user/view/laborcontract/add_change.html
@@ -0,0 +1,150 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">变更员工合同</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">合同类别</td>
+			<td>{$detail.cate_str}</td>
+			<td class="layui-td-gray">合同类型</td>
+			<td>变更合同</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">续签协议</td>
+			<td colspan="3">{$detail.title}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">员工姓名</td>
+			<td>{$detail.user_name|default=''}</td>
+			<td class="layui-td-gray">签约主体公司</td>
+			<td>
+				<select name="enterprise_id" lay-verify="required" lay-reqText="请选择签约主体公司">
+					<option value="">请选择</option>
+					{volist name=":get_base_data('Enterprise')" id="vo"}
+					<option value="{$vo.id}" {eq name="$detail.enterprise_id" value="$vo.id"} selected{/eq}>{$vo.title}</option>
+					{/volist}
+				</select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">合同名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请完善合同名称" lay-reqText="请完善合同名称" class="layui-input" value="">
+			</td>
+			<td class="layui-td-gray">合同编码<font>*</font></td>
+			<td>
+				<input type="text" name="code" lay-verify="required" autocomplete="off" placeholder="请完善合同编码" lay-reqText="请完善合同编码" class="layui-input" value="">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">签订日期<font>*</font></td>
+			<td>
+				<input type="text" name="sign_time" readonly lay-verify="required" autocomplete="off" placeholder="请选择" lay-reqText="请选择签约日期" class="layui-input tool-time" value="">
+			</td>
+			<td class="layui-td-gray">合同属性<font>*</font></td>
+			<td>
+				<select name="properties" lay-verify="required" lay-reqText="请选择合同属性">
+					<option value="">请选择</option>
+					{volist name="$properties" id="vo"}
+					{gt name="$key" value="0"}
+					<option value="{$key}" {eq name="$detail.properties" value="$key"} selected{/eq}>{$vo}</option>
+					{/gt}
+					{/volist}
+				</select>
+			</td>
+		</tr>
+		</tr>
+		<tr>			
+			<td class="layui-td-gray-2">合同生效时间<font>*</font></td>
+			<td>
+				<input type="text" name="start_time" readonly lay-verify="required" autocomplete="off" placeholder="请选择" lay-reqText="请选择生效时间" class="layui-input tool-time" value="">
+			</td>
+			<td class="layui-td-gray-2">合同失效时间<font>*</font></td>
+			<td>
+				<input type="text" name="end_time" readonly lay-verify="required" autocomplete="off" placeholder="请选择" lay-reqText="请选择失效时间" class="layui-input tool-time" value="">
+			</td>
+		</tr>
+		{eq name="$detail.cate" value="1"}
+		<tr>
+			<td class="layui-td-gray-2">员工试用月数<font>*</font></td>
+			<td>
+				<input type="text" name="trial_months" lay-verify="required|number" autocomplete="off" placeholder="请选择" lay-reqText="请完善试用月数，仅为数字" class="layui-input" value="">
+			</td>
+			<td class="layui-td-gray-2">试用结束时间<font>*</font></td>
+			<td>
+				<input type="text" name="trial_end_time" readonly lay-verify="required" autocomplete="off" placeholder="请选择" lay-reqText="请选择试用结束时间" class="layui-input tool-time" value="">
+			</td>
+		</tr>
+		<tr>	
+			<td class="layui-td-gray-2">试用工资(元)<font>*</font></td>
+			<td>
+				<input type="text" name="trial_salary" lay-verify="required|number" autocomplete="off" placeholder="请选择" lay-reqText="请完善试用工资，仅为数字" class="layui-input" value="">
+			</td>
+			<td class="layui-td-gray-2">转正工资(元)<font>*</font></td>
+			<td>
+				<input type="text" name="worker_salary" lay-verify="required|number" autocomplete="off" placeholder="请选择" lay-reqText="请完善转正工资，仅为数字" class="layui-input" value="">
+			</td>
+		</tr>
+		{/eq}
+		{in name="$detail.cate" value="2,3"}
+		<tr>	
+			<td class="layui-td-gray-2">工资费用(元)<font>*</font></td>
+			<td>
+				<input type="text" name="worker_salary" lay-verify="required|number" autocomplete="off" placeholder="请选择" lay-reqText="请完善转正工资，仅为数字" class="layui-input" value="">
+			</td>
+		</tr>
+		{/in}
+		<tr>
+			<td class="layui-td-gray">备注说明</td>
+			<td colspan="3">
+				<textarea name="remark" placeholder="请输入备注说明，可空" class="layui-textarea"></textarea>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray"><strong>相关附件</strong> <button class="layui-btn layui-btn-xs add-tr" type="button" data-type="upload" id="uploadBtn">+ 上传附件</button></td>
+			<td colspan="3" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="">
+				</div>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<input type="hidden" name="id" value="0"/>
+		<input type="hidden" name="change_pid" value="{$detail.id}"/>
+		<input type="hidden" name="cate" value="{$detail.cate}"/>
+		<input type="hidden" name="types" value="3">
+		<input type="hidden" name="uid" value="{$detail.uid|default=0}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool','oaPicker','uploadPlus'];
+
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool,uploadPlus=layui.uploadPlus;
+		//相关附件上传
+		var attachment = new uploadPlus();
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/user/laborcontract/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/user/view/laborcontract/add_renewal.html b/app/user/view/laborcontract/add_renewal.html
new file mode 100644
index 0000000000000000000000000000000000000000..5242b5863eb5806b0ab7d1d2c96b4432b0c17de9
--- /dev/null
+++ b/app/user/view/laborcontract/add_renewal.html
@@ -0,0 +1,144 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">续签员工合同</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">合同类别</td>
+			<td>{$detail.cate_str}</td>
+			<td class="layui-td-gray">合同类型</td>
+			<td>续签合同</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">续签协议</td>
+			<td colspan="3">{$detail.title}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">员工姓名</td>
+			<td>{$detail.user_name|default=''}</td>
+			<td class="layui-td-gray">签约主体公司</td>
+			<td>{$detail.enterprise|default=''}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">合同名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请完善合同名称" lay-reqText="请完善合同名称" class="layui-input" value="">
+			</td>
+			<td class="layui-td-gray">合同编码<font>*</font></td>
+			<td>
+				<input type="text" name="code" lay-verify="required" autocomplete="off" placeholder="请完善合同编码" lay-reqText="请完善合同编码" class="layui-input" value="">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">签订日期<font>*</font></td>
+			<td>
+				<input type="text" name="sign_time" readonly lay-verify="required" autocomplete="off" placeholder="请选择" lay-reqText="请选择签约日期" class="layui-input tool-time" value="">
+			</td>
+			<td class="layui-td-gray">合同属性<font>*</font></td>
+			<td>
+				<select name="properties" lay-verify="required" lay-reqText="请选择合同属性">
+					<option value="">请选择</option>
+					{volist name="$properties" id="vo"}
+					{gt name="$key" value="0"}
+					<option value="{$key}">{$vo}</option>
+					{/gt}
+					{/volist}
+				</select>
+			</td>
+		</tr>
+		</tr>
+		<tr>			
+			<td class="layui-td-gray-2">合同生效时间<font>*</font></td>
+			<td>
+				<input type="text" name="start_time" readonly lay-verify="required" autocomplete="off" placeholder="请选择" lay-reqText="请选择生效时间" class="layui-input tool-time" value="">
+			</td>
+			<td class="layui-td-gray-2">合同失效时间<font>*</font></td>
+			<td>
+				<input type="text" name="end_time" readonly lay-verify="required" autocomplete="off" placeholder="请选择" lay-reqText="请选择失效时间" class="layui-input tool-time" value="">
+			</td>
+		</tr>
+		{eq name="$detail.cate" value="1"}
+		<tr>
+			<td class="layui-td-gray-2">员工试用月数<font>*</font></td>
+			<td>
+				<input type="text" name="trial_months" lay-verify="required|number" autocomplete="off" placeholder="请选择" lay-reqText="请完善试用月数，仅为数字" class="layui-input" value="">
+			</td>
+			<td class="layui-td-gray-2">试用结束时间<font>*</font></td>
+			<td>
+				<input type="text" name="trial_end_time" readonly lay-verify="required" autocomplete="off" placeholder="请选择" lay-reqText="请选择试用结束时间" class="layui-input tool-time" value="">
+			</td>
+		</tr>
+		<tr>	
+			<td class="layui-td-gray-2">试用工资(元)<font>*</font></td>
+			<td>
+				<input type="text" name="trial_salary" lay-verify="required|number" autocomplete="off" placeholder="请选择" lay-reqText="请完善试用工资，仅为数字" class="layui-input" value="">
+			</td>
+			<td class="layui-td-gray-2">转正工资(元)<font>*</font></td>
+			<td>
+				<input type="text" name="worker_salary" lay-verify="required|number" autocomplete="off" placeholder="请选择" lay-reqText="请完善转正工资，仅为数字" class="layui-input" value="">
+			</td>
+		</tr>
+		{/eq}
+		{in name="$detail.cate" value="2,3"}
+		<tr>	
+			<td class="layui-td-gray-2">工资费用(元)<font>*</font></td>
+			<td>
+				<input type="text" name="worker_salary" lay-verify="required|number" autocomplete="off" placeholder="请选择" lay-reqText="请完善转正工资，仅为数字" class="layui-input" value="">
+			</td>
+		</tr>
+		{/in}
+		<tr>
+			<td class="layui-td-gray">备注说明</td>
+			<td colspan="3">
+				<textarea name="remark" placeholder="请输入备注说明，可空" class="layui-textarea"></textarea>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray"><strong>相关附件</strong> <button class="layui-btn layui-btn-xs add-tr" type="button" data-type="upload" id="uploadBtn">+ 上传附件</button></td>
+			<td colspan="3" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="">
+				</div>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<input type="hidden" name="id" value="0"/>
+		<input type="hidden" name="renewal_pid" value="{$detail.id}"/>
+		<input type="hidden" name="cate" value="{$detail.cate}"/>
+		<input type="hidden" name="types" value="2">
+		<input type="hidden" name="uid" value="{$detail.uid|default=0}">
+		<input type="hidden" name="enterprise_id" value="{$detail.enterprise_id|default=0}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool','oaPicker','uploadPlus'];
+
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool,uploadPlus=layui.uploadPlus;
+		//相关附件上传
+		var attachment = new uploadPlus();
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/user/laborcontract/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/user/view/laborcontract/datalist.html b/app/user/view/laborcontract/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..72fb082779e675eacdfd432a6e9e34ca6043580d
--- /dev/null
+++ b/app/user/view/laborcontract/datalist.html
@@ -0,0 +1,192 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:100px">
+			<select name="status">
+				<option value="">合同状态</option>
+				{volist name="$status" id="vo"}
+				{gt name="$key" value="0"}
+				<option value="{$key}">{$vo}</option>
+				{/gt}
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:100px">
+			<select name="cate">
+				<option value="">合同类别</option>
+				{volist name="$cate" id="vo"}
+				<option value="{$vo.id}">{$vo.title}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:100px">
+			<select name="types">
+				<option value="">合同类型</option>
+				{volist name="$types" id="vo"}
+				{gt name="$key" value="0"}
+				<option value="{$key}">{$vo}</option>
+				{/gt}
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:100px">
+			<select name="properties">
+				<option value="">合同属性</option>
+				{volist name="$properties" id="vo"}
+				{gt name="$key" value="0"}
+				<option value="{$key}">{$vo}</option>
+				{/gt}
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:80px">
+			<input type="text" name="uname" placeholder="签订员工" class="layui-input picker-admin" value="" readonly>
+			<input type="text" name="uid" value="" style="display:none;">
+		</div>
+		<div class="layui-input-inline" style="width:292px;">
+			<input type="text" class="layui-input" id="diff_time" placeholder="签订日期" readonly name="diff_time">
+		</div>
+		<div class="layui-input-inline" style="width:150px;">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_laborcontract" lay-filter="table_laborcontract"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+	<button class="layui-btn layui-btn-sm" lay-event="add">
+		<span>+ 添加合同</span>
+		<i class="layui-icon layui-icon-down layui-font-12"></i>
+	</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const contract_cate = {:json_encode($cate,JSON_UNESCAPED_UNICODE)};
+	const moduleInit = ['tool','oaPicker','tablePlus','laydatePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool, laydatePlus = layui.laydatePlus,dropdown = layui.dropdown;		
+		
+		var diff_time = new laydatePlus({'target':'diff_time'});
+		layui.pageTable = table.render({
+			elem: "#table_laborcontract"
+			, toolbar: "#toolbarDemo"
+			,url: "/user/laborcontract/datalist"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 80
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'status',title: '合同状态',width:90, align:'center',templet: function(d){
+					if(d.status==1){
+						return '<span class="green">『'+d.status_str+'』</span>';
+					}
+					else if(d.status==2){
+						return '<span class="yellow">『'+d.status_str+'』</span>';
+					}
+					else if(d.status==3){
+						return '<span class="red">『'+d.status_str+'』</span>';
+					}
+					else{
+						return '-';
+					}
+				}}
+				,{field:'user_name',title: '员工',width:90, align:'center'}
+				,{field:'title',title: '合同名称',minWidth:240}
+				,{field:'cate_str',title: '合同类型',width:90, align:'center'}
+				,{field:'types_str',title: '合同属性',width:90, align:'center'}
+				,{field:'enterprise',title: '签约主体公司',width:200}
+				,{field:'sign_time',title: '签订日期',width:90, align:'center'}
+				,{field:'diff_time',title: '合同有效期间',width:180, align:'center'}
+				,{field:'renewal',title: '续签状态',width:80, align:'center',templet: function(d){
+					if(d.renewal>0){
+						return '<span class="red">已续签</span>';
+					}
+					else{
+						return '<span class="green">未续签</span>';
+					}
+				}}
+				,{field:'change',title: '变更状态',width:80, align:'center',templet: function(d){
+					if(d.change>0){
+						return '<span class="red">已变更</span>';
+					}
+					else{
+						return '<span class="green">未变更</span>';
+					}
+				}}
+				,{field:'admin_name',title: '创建人',width:90,align:'center'}
+				,{field:'create_time', title: '创建时间',width:150,align:'center'}
+				,{width:120,fixed:'right',title: '操作', align:'center',templet: function(d){
+					var html='';
+					var btn1='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详细</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn3='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
+					html = '<div class="layui-btn-group">'+btn1+btn2+btn3+'</div>';
+					return html;
+				}}
+			]]
+		});
+		
+		//表头工具栏事件
+		table.on('toolbar(table_laborcontract)', function(obj){
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = checkStatus.data;
+			var that = this;
+			if (obj.event === 'add'){
+				  dropdown.render({
+					elem: that,
+					show: true, // 外部事件触发即显示
+					data: contract_cate,
+					click: function(obj){
+						tool.side("/user/laborcontract/add?cate_id="+obj.id);
+					}
+				  });
+				return;
+			}
+		});	
+			
+		table.on('tool(table_laborcontract)',function (obj) {
+			let data=obj.data
+			if (obj.event === 'view') {
+				tool.side("/user/laborcontract/view?id="+data.id);
+				return;
+			}
+			if (obj.event === 'edit') {
+				if(data.renewal>0 || data.change>0){
+					layer.msg('已续签或者已变更的合同不支持编辑，如需[编辑]请先删除续签或者变更的合同');
+					return false;
+				}
+				tool.side("/user/laborcontract/add?id="+data.id);
+				return;
+			}
+			if (obj.event === 'del') {
+				if(data.renewal>0 || data.change>0){
+					layer.msg('已续签或者已变更的合同不支持删除，如需[删除]请先删除续签或者变更的合同');
+					return false;
+				}
+				layer.confirm('确定要删除该员工合同吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.delete("/user/laborcontract/del", { id: data.id }, callback);
+					layer.close(index);
+				});
+			}
+		});
+		
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/user/view/laborcontract/edit.html b/app/user/view/laborcontract/edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..8b6142ae6fe3aaaea22144b10ee0d61728d10c1c
--- /dev/null
+++ b/app/user/view/laborcontract/edit.html
@@ -0,0 +1,152 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">编辑员工合同</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">合同类别</td>
+			<td>{$detail.cate_str}</td>
+			<td class="layui-td-gray">合同类型</td>
+			<td>新签合同</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">员工姓名<font>*</font></td>
+			<td>
+				<input type="text" name="uname" lay-verify="required" autocomplete="off" placeholder="请选择" lay-reqText="请选择员工姓名" class="layui-input picker-admin" readonly value="{$detail.user_name|default=''}">
+				<input type="hidden" name="uid" value="{$detail.uid|default=0}">
+			</td>
+			<td class="layui-td-gray">签约主体公司<font>*</font></td>
+			<td>
+				<select name="enterprise_id" lay-verify="required" lay-reqText="请选择签约主体公司">
+					<option value="">请选择</option>
+					{volist name=":get_base_data('Enterprise')" id="vo"}
+					<option value="{$vo.id}" {eq name="$detail.enterprise_id" value="$vo.id"} selected{/eq}>{$vo.title}</option>
+					{/volist}
+				</select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">合同名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请完善合同名称" lay-reqText="请完善合同名称" class="layui-input" value="{$detail.title|default=''}">
+			</td>
+			<td class="layui-td-gray">合同编码<font>*</font></td>
+			<td>
+				<input type="text" name="code" lay-verify="required" autocomplete="off" placeholder="请完善合同编码" lay-reqText="请完善合同编码" class="layui-input" value="{$detail.code|default=''}">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">签订日期<font>*</font></td>
+			<td>
+				<input type="text" name="sign_time" readonly lay-verify="required" autocomplete="off" placeholder="请选择" lay-reqText="请选择签约日期" class="layui-input tool-time" value="{$detail.sign_time|default=''}">
+			</td>
+			<td class="layui-td-gray">合同属性<font>*</font></td>
+			<td>
+				<select name="properties" lay-verify="required" lay-reqText="请选择合同属性">
+					<option value="">请选择</option>
+					{volist name="$properties" id="vo"}
+					{gt name="$key" value="0"}
+					<option value="{$key}" {eq name="$detail.properties" value="$key"} selected{/eq}>{$vo}</option>
+					{/gt}
+					{/volist}
+				</select>
+			</td>
+		</tr>
+		</tr>
+		<tr>			
+			<td class="layui-td-gray-2">合同生效时间<font>*</font></td>
+			<td>
+				<input type="text" name="start_time" readonly lay-verify="required" autocomplete="off" placeholder="请选择" lay-reqText="请选择生效时间" class="layui-input tool-time" value="{$detail.start_time|default=''}">
+			</td>
+			<td class="layui-td-gray-2">合同失效时间<font>*</font></td>
+			<td>
+				<input type="text" name="end_time" readonly lay-verify="required" autocomplete="off" placeholder="请选择" lay-reqText="请选择失效时间" class="layui-input tool-time" value="{$detail.end_time|default=''}">
+			</td>
+		</tr>
+		{eq name="$detail.cate" value="1"}
+		<tr>
+			<td class="layui-td-gray-2">员工试用月数<font>*</font></td>
+			<td>
+				<input type="text" name="trial_months" lay-verify="required|number" autocomplete="off" placeholder="请选择" lay-reqText="请完善试用月数，仅为数字" class="layui-input" value="{$detail.trial_months|default=''}">
+			</td>
+			<td class="layui-td-gray-2">试用结束时间<font>*</font></td>
+			<td>
+				<input type="text" name="trial_end_time" readonly lay-verify="required" autocomplete="off" placeholder="请选择" lay-reqText="请选择试用结束时间" class="layui-input tool-time" value="{$detail.trial_end_time|default=''}">
+			</td>
+		</tr>
+		<tr>	
+			<td class="layui-td-gray-2">试用工资(元)<font>*</font></td>
+			<td>
+				<input type="text" name="trial_salary" lay-verify="required|number" autocomplete="off" placeholder="请选择" lay-reqText="请完善试用工资，仅为数字" class="layui-input" value="{$detail.trial_salary|default=''}">
+			</td>
+			<td class="layui-td-gray-2">转正工资(元)<font>*</font></td>
+			<td>
+				<input type="text" name="worker_salary" lay-verify="required|number" autocomplete="off" placeholder="请选择" lay-reqText="请完善转正工资，仅为数字" class="layui-input" value="{$detail.worker_salary|default=''}">
+			</td>
+		</tr>
+		{/eq}
+		{in name="$detail.cate" value="2,3"}
+		<tr>	
+			<td class="layui-td-gray-2">工资费用(元)<font>*</font></td>
+			<td>
+				<input type="text" name="worker_salary" lay-verify="required|number" autocomplete="off" placeholder="请选择" lay-reqText="请完善转正工资，仅为数字" class="layui-input" value="{$detail.worker_salary|default=''}">
+			</td>
+		</tr>
+		{/in}
+		<tr>
+			<td class="layui-td-gray">备注说明</td>
+			<td colspan="3">
+				<textarea name="remark" placeholder="请输入备注说明，可空" class="layui-textarea">{$detail.remark|default=''}</textarea>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray"><strong>相关附件</strong> <button class="layui-btn layui-btn-xs add-tr" type="button" data-type="upload" id="uploadBtn">+ 上传附件</button></td>
+			<td colspan="3" style="line-height:inherit">
+				<div class="layui-row" id="uploadBox">
+					<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids|default=''}">
+					{notempty name="$detail.file_ids"}
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo)}</div>
+					{/volist}
+					{/notempty}
+				</div>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$detail.id|default=0}"/>
+		<input type="hidden" name="cate" value="{$detail.cate|default=1}"/>
+		<input type="hidden" name="status" value="{$detail.status|default=1}"/>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool','oaPicker','uploadPlus'];
+
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool,uploadPlus=layui.uploadPlus;
+		//相关附件上传
+		var attachment = new uploadPlus();
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/user/laborcontract/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/user/view/laborcontract/view.html b/app/user/view/laborcontract/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..77b702dd225c56c7e7b3e1219065d9c288fcabff
--- /dev/null
+++ b/app/user/view/laborcontract/view.html
@@ -0,0 +1,150 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">员工合同详细信息</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">合同类别</td>
+			<td>{$detail.cate_str}</td>
+			<td class="layui-td-gray">合同类型</td>
+			<td>{$detail.types_str}</td>
+		</tr>
+		{gt name="$detail.renewal_pid" value="0"}
+		<tr>
+			<td class="layui-td-gray">续签母协议</td>
+			<td colspan="3"><a class="blue" href="/user/laborcontract/view?id={$detail.renewal_pid}">{$detail.renewal_ptitle}</a></td>
+		</tr>
+		{/gt}
+		{gt name="$detail.change_pid" value="0"}
+		<tr>
+			<td class="layui-td-gray">变更母协议</td>
+			<td colspan="3"><a class="blue" href="/user/laborcontract/view?id={$detail.change_pid}">{$detail.change_ptitle}</a></td>
+		</tr>
+		{/gt}
+		<tr>
+			<td class="layui-td-gray">员工姓名</td>
+			<td>{$detail.user_name}</td>
+			<td class="layui-td-gray">签约主体公司</td>
+			<td>{$detail.enterprise}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">合同名称</td>
+			<td>{$detail.title}</td>
+			<td class="layui-td-gray">合同编码</td>
+			<td>{$detail.code}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">签订日期</td>
+			<td>{$detail.sign_time}</td>
+			<td class="layui-td-gray">合同属性</td>
+			<td>{$detail.properties_str}</td>
+		</tr>
+		</tr>
+		<tr>			
+			<td class="layui-td-gray-2">合同生效时间</td>
+			<td>{$detail.start_time}</td>
+			<td class="layui-td-gray-2">合同失效时间</td>
+			<td>{$detail.end_time}</td>
+		</tr>
+		{eq name="$detail.cate" value="1"}
+		<tr>
+			<td class="layui-td-gray-2">员工试用月数</td>
+			<td>{$detail.trial_months}</td>
+			<td class="layui-td-gray-2">试用结束时间</td>
+			<td>{$detail.trial_end_time}</td>
+		</tr>
+		<tr>	
+			<td class="layui-td-gray-2">试用工资(元)</td>
+			<td>{$detail.trial_salary}</td>
+			<td class="layui-td-gray-2">转正工资(元)</td>
+			<td>{$detail.worker_salary}</td>
+		</tr>
+		{/eq}
+		{in name="$detail.cate" value="2,3"}
+		<tr>	
+			<td class="layui-td-gray-2">工资费用(元)</td>
+			<td>{$detail.worker_salary}</td>
+		</tr>
+		{/in}
+		<tr>
+			<td class="layui-td-gray">备注说明</td>
+			<td colspan="3">{$detail.remark|default=''}</td>
+		</tr>
+		{notempty name="$detail.file_ids"}
+		<tr>
+			<td class="layui-td-gray"><strong>相关附件</strong></td>
+			<td colspan="3" style="line-height:inherit">
+				<div class="layui-row">
+					{volist name="$detail.file_array" id="vo"}
+					<div class="layui-col-md4" id="uploadImg{$vo.id}">{:file_card($vo,'view')}</div>
+					{/volist}
+				</div>
+			</td>
+		</tr>
+		{/notempty}
+		<tr>
+			<td class="layui-td-gray">合同状态</td>
+			{eq name="$detail.status" value="1"}
+			<td colspan="3"><span class="green">正常</span>，<span class="layui-btn layui-bg-red layui-btn-xs set-status" data-status="3">解除合同</span></td>
+			{/eq}
+			{eq name="$detail.status" value="2"}
+			<td colspan="3"><span class="yellow">已到期</span></td>
+			{/eq}
+			{eq name="$detail.status" value="3"}
+			<td colspan="3"><span class="red">已解除</span>，<span class="layui-btn layui-bg-blue layui-btn-xs set-status" data-status="1">恢复合同</span></td>
+			{/eq}
+		</tr>
+		<tr>
+			<td class="layui-td-gray">续签状态</td>
+			{empty name="$renewal"}
+			<td colspan="3"><span class="green">未续签</span>{eq name="$detail.status" value="1"}，<a class="layui-btn layui-btn-xs" href="/user/laborcontract/add_renewal?id={$detail.id}">新增续签合同</a>{/eq}</td>
+			{else/}
+			<td colspan="3"><span class="red">已续签</span>，续签日期：{$renewal.create_time|date="Y-m-d"}。<a class="layui-btn layui-bg-blue layui-btn-xs" href="/user/laborcontract/view?id={$renewal.id}">续签合同详情</a></td>
+			{/empty}
+		</tr>
+		<tr>
+			<td class="layui-td-gray">变更状态</td>
+			{empty name="$change"}
+			<td colspan="3"><span class="green">未变更</span>{eq name="$detail.status" value="1"}，<a class="layui-btn layui-btn-xs" href="/user/laborcontract/add_change?id={$detail.id}">新增变更合同</a>{/eq}</td>
+			{else/}
+			<td colspan="3"><span class="red">已变更</span>，续签日期：{$change.create_time|date="Y-m-d"}。<a class="layui-btn layui-bg-blue layui-btn-xs" href="/user/laborcontract/view?id={$change.id}">变更合同详情</a></td>
+			{/empty}
+		</tr>
+	</table>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const id = {$detail.id};
+	var moduleInit = ['tool'];
+	function gouguInit() {
+		var tool = layui.tool;
+		$('body').on('click','.set-status',function(){
+			let status = $(this).data('status');
+			let tips='确定要解除该合同吗?';
+			if(status==1){
+				tips='确定要恢复该合同吗?';
+			}
+			layer.confirm(tips, { icon: 3, title: '提示' }, function (index) {
+				let callback = function (e) {
+					layer.msg(e.msg);
+					if (e.code == 0) {
+						if(parent.layui.pageTable){
+							parent.layui.pageTable.reload();
+						}
+						location.reload();
+					}
+				}
+				tool.post("/user/laborcontract/set", {id:id,status:status}, callback);
+				layer.close(index);
+			});
+			
+		})
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/user/view/personal/change.html b/app/user/view/personal/change.html
new file mode 100644
index 0000000000000000000000000000000000000000..7743ec6d3881f18a79e295c6bd143a6e424fb173
--- /dev/null
+++ b/app/user/view/personal/change.html
@@ -0,0 +1,87 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-t border-x">
+		<div class="layui-input-inline">
+			<input type="text" name="keywords" placeholder="关键字" class="layui-input" autocomplete="off"/>
+		</div>
+		<div class="layui-input-inline" style="width:150px;">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+	<button class="layui-btn layui-btn-sm" lay-event="add">+ 添加人事调动记录</button>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool ,form = layui.form;
+		layui.pageTable = table.render({
+			elem: '#test'
+			, toolbar: '#toolbarDemo'
+			,defaultToolbar: false
+			, url: "/user/personal/change"
+			, page: true //开启分页
+			, limit: 20
+			, cols: [[
+				{ field: 'id', width: 80, title: '序号', align: 'center' }
+				, { field: 'name', width: 100, title: '员工姓名', align: 'center'}
+				, { field: 'adepartment', width: 160, title: '调出部门'}
+				, { field: 'bdepartment', width: 160, title: '调入部门'}
+				, { field: 'remark', title: '调动原因'}
+				, { field: 'move_time', title: '调动日期',width: 100, align: 'center'}
+				, { field: 'admin', title: '调动操作人',width: 100, align: 'center'}
+				, {
+					width: 80, title: '操作', align: 'center'
+					, templet: function (d) {
+						var html = '';
+						var delBtn = '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</button>';
+						return delBtn;
+					}
+				}
+			]]
+		});
+		
+		//监听行工具事件
+		table.on('tool(test)', function(obj){
+			var data = obj.data;
+			if(obj.event === 'edit'){
+				tool.side('/user/personal/change_add?id='+data.id);
+				return;
+			}
+		});
+		
+		//表头工具栏事件
+		table.on('toolbar(test)', function(obj){
+			if (obj.event === 'add') {
+				tool.side("/user/personal/change_add");
+				return;
+			}
+		});
+
+		//监听搜索提交
+		form.on('submit(webform)', function(data){
+			if(data.field.keywords) {
+				layui.pageTable.reload({where:{keywords:data.field.keywords},page:{curr:1}});			  
+			}
+			else{
+				location.reload();
+			}
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/user/view/personal/change_add.html b/app/user/view/personal/change_add.html
new file mode 100644
index 0000000000000000000000000000000000000000..502790d0a27494f97a4feaed3dc76f814aca6ae2
--- /dev/null
+++ b/app/user/view/personal/change_add.html
@@ -0,0 +1,153 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">人事调动</h3>
+	{if condition="$id eq 0"}
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">调动员工<font>*</font></td>
+			<td>				
+				<input type="text" name="name" placeholder="请选择需要调动的员工" lay-reqText="请选择需要调动的员工" lay-verify="required" autocomplete="off" class="layui-input" readonly>
+				<input type="hidden" name="uid" value="0" autocomplete="off">
+			</td>
+			<td class="layui-td-gray">调出部门<font>*</font></td>
+			<td>				
+				<input type="hidden" name="from_did" value="0">
+				<input type="text" name="from_department" lay-verify="required" autocomplete="off" placeholder="请选择调出部门" lay-reqText="请选择调出部门" class="layui-input" readonly>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">调动日期<font>*</font></td>
+			<td><input type="text" name="move_time" lay-verify="required" autocomplete="off" placeholder="请选择调动日期" lay-reqText="请选择调动日期" readonly class="layui-input tool-time">
+			</td>
+			<td class="layui-td-gray">调入部门<font>*</font></td>
+			<td>
+			<select name="to_did" lay-verify="required" lay-reqText="请选择调入部门">
+				<option value="">请选择调入部门</option>
+				{volist name="$department" id="v"}
+				<option value="{$v.id}">{$v.title}</option>
+				{/volist}
+			</select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">调动原因</td>
+			<td colspan="3">				
+				<textarea name="remark" placeholder="请输入调动原因" class="layui-textarea"></textarea>
+			</td>
+		</tr>
+	</table>
+	{else/}
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">调动员工<font>*</font></td>
+			<td>				
+				{$detail.name}
+			</td>
+			<td class="layui-td-gray">调出部门<font>*</font></td>
+			<td>				
+				{$detail.from_department}
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">调动日期<font>*</font></td>
+			<td>{$detail.move_time}
+			</td>
+			<td class="layui-td-gray">调入部门<font>*</font></td>
+			<td>
+			<select name="to_did" lay-verify="required" disabled lay-reqText="请选择调入部门">
+				<option value="">请选择调入部门</option>
+				{volist name="$department" id="v"}
+				<option value="{$v.id}" {eq name="$detail.to_did" value="$v.id"} selected{/eq}>{$v.title}</option>
+				{/volist}
+			</select>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">调动原因</td>
+			<td colspan="3">				
+				<textarea name="remark" placeholder="请输入调动原因" class="layui-textarea">{$detail.remark}</textarea>
+			</td>
+		</tr>
+	</table>
+	{/if}
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$id}" />
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','oaPicker'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,oaPicker = layui.oaPicker;
+		
+		$('body').on('click','[name="from_department"]',function(){
+			var val=$(this).val();
+			if(val==''){
+				layer.msg('请先选择需要调动的员工');
+			}			
+		});		
+		
+		//选择员工弹窗	
+		$('body').on('click','[name="name"]',function () {
+			let that = $(this);
+			let ids=that.next().val()+'',names = that.val()+'';
+			oaPicker.employeeInit({
+				ids:ids,
+				names:names,
+				type:1,//1是单选，2是多选
+				callback:function(data){
+					//这里是选择后的回调方法，可以根据具体需求自定义写哦
+					let select_id=[],select_name=[],select_did=[],select_department=[];
+					for(var a=0; a<data.length;a++){
+						select_id.push(data[a].id);
+						select_name.push(data[a].name);
+						select_did.push(data[a].did);
+						select_department.push(data[a].department);
+					}
+					that.val(select_name.join(','));
+					that.next().val(select_id.join(','));
+					$('[name="uid"]').val(select_id.join(','));
+					$('[name="name"]').val(select_name.join(','));
+					$('[name="from_did"]').val(select_did.join(','));
+					$('[name="from_department"]').val(select_department.join(','));
+				}
+			});
+		}); 
+
+
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			if(data.field.uid==0 || data.field.from_did==0){
+				layer.msg('请选择要调用的员工');
+				return false;
+			}
+			if(data.field.to_did==''){
+				layer.msg('请选择要调用的部门');
+				return false;
+			}			
+			if(data.field.to_did==data.field.from_did){
+				layer.msg('要调入的部门和调出的部门不能是同一个部门');
+				return false;
+			}
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/user/personal/change_add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/user/view/personal/leave.html b/app/user/view/personal/leave.html
new file mode 100644
index 0000000000000000000000000000000000000000..38d46ccc76503f46120fb2a9586152a4f737eead
--- /dev/null
+++ b/app/user/view/personal/leave.html
@@ -0,0 +1,128 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-t border-x">
+		<div class="layui-input-inline">
+			<input type="text" name="keywords" placeholder="关键字" class="layui-input" autocomplete="off"/>
+		</div>
+		<div class="layui-input-inline" style="width:150px;">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+	<button class="layui-btn layui-btn-sm" lay-event="add">+ 添加离职档案记录</button> <span style="font-size:12px; margin-left:20px; color:#FF5722">删除离职档案即可恢复在职状态，已交接的资料无法恢复</span>
+  </div>
+</script>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool ,form = layui.form;
+		layui.pageTable = table.render({
+			elem: '#test'
+			, toolbar: '#toolbarDemo'
+			,defaultToolbar: false
+			, url: "/user/personal/leave"
+			, page: true //开启分页
+			, limit: 20
+			, cols: [[
+				{ field: 'id', width: 80, title: '序号', align: 'center' }
+				, { field: 'name', width: 110, title: '离职员工', align: 'center','style':'color:#FF5722'}
+				, { field: 'position', width: 100, title: '职位', align: 'center'}
+				, { field: 'department', width: 120, title: '所在部门', align: 'center'}
+				, { field: 'lead_admin', width: 90, title: '部门负责人', align: 'center'}
+				, { field: 'quit_time', width: 100,title: '离职日期', align: 'center'}
+				, { field: 'connect_status', width: 100,title: '资料交接状态', align: 'center',
+					templet: function (d) {
+						if(d.connect_time==0){
+							return '<span class="green">未交接</span>';
+						}
+						else{
+							return '<span class="red">已交接</span>';
+						}
+					}
+				}
+				, { field: 'connect_name', width: 90, title: '资料接受人', align: 'center'}
+				, { field: 'connect_time_str', width: 90, title: '交接日期', align: 'center'}
+				, { field: 'connect_names', width: 180, title: '参与交接人'}
+				, { field: 'remark', title: '离职原因'}
+				, {
+					width: 150, title: '操作',fixed:'right', align: 'center'
+					, templet: function (d) {
+						let btn1='<button class="layui-btn layui-btn-xs" lay-event="edit">编辑</button>';
+						let	btn2='<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="set">资料交接</button>';
+						let	btn3='<button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button>';
+						
+						if(d.connect_time==0){
+							return '<div class="layui-btn-group">'+btn1+btn2+btn3+'</div>';
+						}
+						else{
+							return '<div class="layui-btn-group">'+btn3+'</div>';
+						}
+					}
+				}
+			]]
+		});
+
+		//监听行工具事件
+		table.on('tool(test)', function(obj){
+			var data = obj.data;
+			if(obj.event === 'edit'){
+				tool.side('/user/personal/leave_add?id='+data.id);
+				return;
+			}
+			if (obj.event === 'set') {
+				layer.confirm('确定要把【'+data.name+'】相关的项目、合同、客户等资料交接给【'+data.connect_name+'】吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.delete("/user/personal/leave_check", { id: data.id }, callback);
+					layer.close(index);
+				});
+			}
+			if (obj.event === 'del') {
+				layer.confirm('删除该离职档案【'+data.name+'】即可恢复在职状态，已交接的资料无法恢复，确定要删除吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.delete("/user/personal/leave_delete", { id: data.id }, callback);
+					layer.close(index);
+				});
+			}
+		});
+		
+		//表头工具栏事件
+		table.on('toolbar(test)', function(obj){
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = checkStatus.data; 
+			if (obj.event === 'add') {
+				tool.side("/user/personal/leave_add");
+				return;
+			}
+		});
+
+		//监听搜索提交
+		form.on('submit(webform)', function(data){
+			layui.pageTable.reload({where:data.field,page:{curr:1}});			  
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/user/view/personal/leave_add.html b/app/user/view/personal/leave_add.html
new file mode 100644
index 0000000000000000000000000000000000000000..ece7c1effa9fe6115dac465b9592ead5388a5cda
--- /dev/null
+++ b/app/user/view/personal/leave_add.html
@@ -0,0 +1,163 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">离职档案</h3>
+	{if condition="$id eq 0"}
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">离职员工<font>*</font></td>
+			<td>				
+				<input type="text" name="name" placeholder="请选择离职员工" lay-reqText="请选择离职员工" lay-verify="required" autocomplete="off" class="layui-input picker" readonly>
+				<input type="hidden" name="uid" value="0" autocomplete="off">
+			</td>
+			<td class="layui-td-gray">所在部门</td>
+			<td>
+				<input type="text" name="department" autocomplete="off" class="layui-input" readonly>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">离职日期<font>*</font></td>
+			<td><input type="text" name="quit_time" lay-verify="required" autocomplete="off" placeholder="请选择离职日期" lay-reqText="请选择离职日期" readonly class="layui-input tool-time">
+			</td>
+			<td class="layui-td-gray-2">部门负责人<font>*</font></td>
+			<td>
+			<input type="text" name="lead_admin_name" autocomplete="off" lay-verify="required" placeholder="请选择部门负责人" lay-reqText="请选择部门负责人" readonly class="layui-input picker-admin">
+			<input type="hidden" name="lead_admin_id" autocomplete="off" value="0">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">资料接受人<font>*</font></td>
+			<td>				
+				<input type="text" name="connect_name" autocomplete="off" lay-verify="required" placeholder="请选择资料接受人" lay-reqText="请选择资料接受人" readonly class="layui-input picker-admin">
+				<input type="hidden" name="connect_id" class="layui-input">
+			</td>
+			<td class="layui-td-gray-2">参与交接人员<font>*</font></td>
+			<td>				
+				<input type="text" name="connect_names" autocomplete="off" lay-verify="required" placeholder="请选择参与交接人员" lay-reqText="请选择参与交接人员" readonly class="layui-input picker-admin" data-type="2">
+				<input type="hidden" name="connect_uids" class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">离职原因<font>*</font></td>
+			<td colspan="3">				
+				<textarea name="remark" lay-verify="required" placeholder="请输入离职原因" lay-reqText="请输入离职原因" class="layui-textarea"></textarea>
+			</td>
+		</tr>
+	</table>
+	{else/}
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">离职员工</td>
+			<td>{$detail.name}</td>
+			<td class="layui-td-gray">所在部门</td>
+			<td>{$detail.department}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">离职日期<font>*</font></td>
+			<td><input type="text" name="quit_time" value="{$detail.quit_time}" lay-verify="required" autocomplete="off" placeholder="请选择离职日期" lay-reqText="请选择离职日期" readonly class="layui-input tool-time">
+			</td>
+			<td class="layui-td-gray-2">部门负责人<font>*</font></td>
+			<td>
+			<input type="text" name="lead_admin_name" autocomplete="off" value="{$detail.lead_admin_name}" lay-verify="required" placeholder="请选择部门负责人" lay-reqText="请选择部门负责人" readonly class="layui-input picker-admin">
+			<input type="hidden" name="lead_admin_id" autocomplete="off" value="{$detail.lead_admin_id}">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">资料接受人<font>*</font></td>
+			<td>				
+				<input type="text" name="connect_name" autocomplete="off" lay-verify="required" placeholder="请选择资料接受人" lay-reqText="请选择资料接受人" readonly class="layui-input picker-admin" value="{$detail.connect_name}">
+				<input type="hidden" name="connect_id" class="layui-input" value="{$detail.connect_id}">
+			</td>
+			<td class="layui-td-gray-2">参与交接人员<font>*</font></td>
+			<td>				
+				<input type="text" name="connect_names" autocomplete="off" lay-verify="required" placeholder="请选择参与交接人员" lay-reqText="请选择参与交接人员" readonly class="layui-input picker-admin" data-type="2" value="{$detail.connect_names}">
+				<input type="hidden" name="connect_uids" class="layui-input" value="{$detail.connect_uids}">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">离职原因<font>*</font></td>
+			<td colspan="3">				
+				<textarea name="remark" lay-verify="required" placeholder="请输入离职原因" lay-reqText="请输入离职原因" class="layui-textarea">{$detail.remark}</textarea>
+			</td>
+		</tr>
+	</table>
+	{/if}
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$id}" />
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','oaPicker'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,oaPicker = layui.oaPicker;
+
+		$('body').on('click','[name="department"]',function(){
+			var val=$(this).val();
+			if(val==''){
+				layer.msg('请选择离职员工');
+			}			
+		});		
+		
+		//选择员工弹窗	
+		$('body').on('click','.picker',function () {
+			let that = $(this);
+			let ids=that.next().val()+'',names = that.val()+'';
+			oaPicker.employeeInit({
+				ids:ids,
+				names:names,
+				type:1,//1是单选，2是多选
+				callback:function(data){
+					//这里是选择后的回调方法，可以根据具体需求自定义写哦
+					let select_id=[],select_name=[],select_did=[],select_department=[];
+					for(var a=0; a<data.length;a++){
+						select_id.push(data[a].id);
+						select_name.push(data[a].name);
+						select_did.push(data[a].did);
+						select_department.push(data[a].department);
+					}
+					that.val(select_name.join(','));
+					that.next().val(select_id.join(','));
+					$('[name="uid"]').val(select_id.join(','));
+					$('[name="name"]').val(select_name.join(','));
+					//$('[name="from_did"]').val(select_did.join(','));
+					$('[name="department"]').val(select_department.join(','));
+				}
+			});
+		}); 
+
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			if(data.field.uid==0){
+				layer.msg('请选择离职员工');
+				return false;
+			}
+			if(data.field.uid==data.field.lead_admin_id){
+				layer.msg('离职员工和部门负责人不能是同一个人');
+				return false;
+			}
+			if(data.field.uid==data.field.connect_id){
+				layer.msg('离职员工和资料接受人不能是同一个人');
+				return false;
+			}
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/user/personal/leave_add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/user/view/position/add.html b/app/user/view/position/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..47a3f0192c97ecc76d7d60bea6ed9954fd449d22
--- /dev/null
+++ b/app/user/view/position/add.html
@@ -0,0 +1,106 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">岗位职称</h3>
+	{if condition="$id eq 0"}
+	<table class="layui-table">
+		<tr>
+			<td class="layui-td-gray">岗位名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入岗位名称" lay-reqText="请输入岗位名称" class="layui-input">
+			</td>
+			<td class="layui-td-gray-3">岗位工时单价(元)<font>*</font></td>
+			<td>
+				<input type="text" name="work_price" lay-verify="required|number" placeholder="请输入岗位工时单价" lay-reqText="请输入岗位工时单价" autocomplete="off" class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">状态<font>*</font></td>
+			<td colspan="3">
+				<input type="radio" name="status" value="1" title="正常" checked>
+				<input type="radio" name="status" value="0" title="禁用">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">权限角色<font>*</font></td>
+			<td colspan="3">
+				{volist name="$group" id="v"}
+				<input type="checkbox" name="group_id[]" title="{$v.title}" value="{$v.id}" lay-skin="primary">
+				{/volist}
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">岗位备注</td>
+			<td colspan="3">
+				<textarea name="remark" placeholder="请输入岗位备注" class="layui-textarea"></textarea>
+			</td>
+		</tr>
+	</table>
+	{else/}
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">岗位名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" value="{$detail.title}" lay-verify="required" autocomplete="off" placeholder="请输入岗位名称" lay-reqText="请输入岗位名称" class="layui-input">
+			</td>
+			<td class="layui-td-gray-3">岗位工时单价(元)<font>*</font></td>
+			<td>
+				<input type="text" name="work_price" value="{$detail.work_price}" lay-verify="required|number" placeholder="请输入岗位工时单价" lay-reqText="请输入岗位工时单价" autocomplete="off" class="layui-input">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">状态<font>*</font></td>
+			<td colspan="3">
+				<input type="radio" name="status" value="1" title="正常" {eq name="$detail.status" value="1"}checked{/eq}>
+				<input type="radio" name="status" value="0" title="禁止" {eq name="$detail.status" value="0"}checked{/eq}>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">权限角色<font>*</font></td>
+			<td colspan="3">
+			{volist name="$group" id="v"}
+				<input type="checkbox" name="group_id[]" title="{$v.title}" value="{$v.id}" {eq name="$v.checked" value="1" }checked{/eq} lay-skin="primary">
+			{/volist}
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">岗位备注</td>
+			<td colspan="3">
+				<textarea name="remark" placeholder="请输入岗位备注" class="layui-textarea">{$detail.remark}</textarea>
+			</td>
+		</tr>
+	</table>
+	{/if}
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$id}">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool;
+		//监听提交
+		form.on('submit(webform)', function(data){
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/user/position/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/user/view/position/index.html b/app/user/view/position/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..f6613007b051332739f7ea35e3be99699a2458a1
--- /dev/null
+++ b/app/user/view/position/index.html
@@ -0,0 +1,117 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<table class="layui-hide" id="test" lay-filter="test"></table>
+</div>
+
+<script type="text/html" id="status">
+	<i class="layui-icon {{#  if(d.status == 1){ }}green layui-icon-ok{{#  } else { }}yellow layui-icon-close{{#  } }}"></i>
+</script>
+<script type="text/html" id="toolbarDemo">
+	<div class="layui-btn-container">
+		<button class="layui-btn layui-btn-sm" lay-event="add">+ 添加岗位</button>
+	</div>
+</script>
+<script type="text/html" id="barDemo">
+<div class="layui-btn-group"><button class="layui-btn layui-btn-xs layui-btn-normal" lay-event="view">详情</button><button class="layui-btn layui-btn-xs" lay-event="edit">编辑</button><button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button></div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool;
+		layui.pageTable = table.render({
+			elem: '#test',
+			title: '岗位列表',
+			toolbar: '#toolbarDemo',
+			defaultToolbar: false,
+			url: "/user/position/index", //数据接口				
+			page: false, //开启分页
+			cols: [
+				[
+					{
+						field: 'id',
+						title: 'ID号',
+						align: 'center',
+						width: 80
+					}, {
+						field: 'title',
+						title: '岗位名称',
+						align: 'center',
+						width: 120
+					},{
+						field: 'groupName',
+						title: '权限角色'
+					},{
+						field: 'remark',
+						title: '备注'
+					},{
+						field: 'work_price',
+						title: '岗位工时单价(元)',
+						align: 'center',
+						width: 132
+					}, {
+						field: 'status',
+						title: '状态',
+						toolbar: '#status',
+						align: 'center',
+						width: 60
+					}, {
+						field: 'right',
+						title: '操作',
+						toolbar: '#barDemo',
+						width: 120,
+						align: 'center'
+					}
+				]
+			]
+		});
+
+		//表头工具栏事件
+		table.on('toolbar(test)', function(obj){
+			if (obj.event === 'add') {
+				tool.side("/user/position/add");
+				return;
+			}
+		});
+		//监听行工具事件
+		table.on('tool(test)', function (obj) {
+			var data = obj.data;
+			if(obj.event === 'view'){
+				tool.side('/user/position/view?id='+data.id);
+				return;
+			}
+			if(obj.event === 'edit'){
+				tool.side('/user/position/add?id='+data.id);
+				return;
+			}
+			if (obj.event === 'del') {
+				if (data.id == 1) {
+					layer.msg('超级岗位不能删除');
+					return;
+				}
+				layer.confirm('您确定要删除该岗位', {
+					icon: 3,
+					title: '提示'
+				}, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/user/position/delete", { id: obj.data.id }, callback);
+					layer.close(index);
+				});
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/user/view/position/view.html b/app/user/view/position/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..5522887eb0b7d899218eeae533e2d3a93e37d7e7
--- /dev/null
+++ b/app/user/view/position/view.html
@@ -0,0 +1,79 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+.left-note{font-weight:800; vertical-align:top; padding-top:28px!important; text-align:center}
+.left-note .layui-checkbox-disabled span {color: #808080!important;}
+
+.layui-form-checked.layui-checkbox-disabled i{background-color:#ababab!important;color: #ffffff!important;border-color:#ababab!important;}
+.layui-form-checked.layui-checkbox-disabled[lay-skin=primary] i{background-color:#ababab!important;}
+.right-note .layui-checkbox-disabled span {color: #808080!important;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">岗位信息</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">岗位名称</td>
+			<td>
+				{$detail.title}
+			</td>
+			<td class="layui-td-gray-2">岗位工时单价</td>
+			<td>
+				{$detail.work_price}
+			</td>
+			<td class="layui-td-gray">状态</td>
+			<td>
+				{eq name="$detail.status" value="1" }正常{/eq}
+				{eq name="$detail.status" value="0" }禁止登录{/eq}
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">用户角色</td>
+			<td colspan="5">
+				{volist name="$group" id="v"}
+					{eq name="$v.checked" value="1" }{$v.title},{/eq} 
+				{/volist}
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">岗位备注</td>
+			<td colspan="5">
+				{$detail.remark}
+			</td>
+		</tr>
+	</table>
+	<h3 class="py-3">岗位权限</h3>
+	<table class="layui-table layui-table-form">
+		{volist name="role_rule" id="vo"}
+		<tr>
+			<td class="left-note">
+			  <input type="checkbox" disabled value="{$vo.id}" title="{$vo.title}" {eq name="$vo.checked" value="true" }checked{/eq}>
+			</td>
+			{notempty name="vo.children"}
+				<td class="right-note">
+					<div style="padding:0 0 0 10px;">
+					{volist name="vo.children" key="k" id="voo"}
+						<div class="checkbox16" style="padding:10px 0;">
+							<input type="checkbox" disabled lay-filter="rule" name="rule[]" value="{$voo.id}" lay-skin="primary" title="{$voo.title}" {eq name="$voo.checked" value="true" }checked{/eq}>
+						</div>
+						{notempty name="voo.children"}
+							<div style="padding:0 0 3px; {if condition='$k != count($vo.children)'}margin-bottom:3px; padding-bottom:16px; border-bottom:1px solid #eee;{/if}">
+							{volist name="voo.children" id="vooo"}
+								<div class="layui-input-inline" style="margin-right:10px;">
+									<input type="checkbox" disabled data-rule="{$voo.id}" name="rule[]" value="{$vooo.id}" lay-skin="primary" title="{$vooo.title}" {eq name="$vooo.checked" value="true" }checked{/eq}>
+								</div>
+							{/volist}
+							</div>
+						{/notempty}
+					{/volist}
+					</div>
+				</td>
+			{/notempty}
+		</tr>
+		{/volist}
+	</table>
+</form>
+{/block}
+<!-- /主体 -->
\ No newline at end of file
diff --git a/app/user/view/rewards/add.html b/app/user/view/rewards/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..501a6fec8faa4becc32f227484e3f926efebaa1f
--- /dev/null
+++ b/app/user/view/rewards/add.html
@@ -0,0 +1,111 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">奖罚信息</h3>
+	<table class="layui-table layui-table-form">
+		{eq name="$id" value="0"}
+		<tr>
+			<td class="layui-td-gray">奖惩项目<font>*</font></td>
+			<td>
+				<select name="rewards_cate" lay-verify="required" lay-reqText="请选择奖惩项目">
+					<option value="">请选择</option>
+					{volist name=":get_base_data('rewards_cate')" id="vo"}
+					<option value="{$vo.id}">{$vo.title}</option>
+					{/volist}
+				</select>
+			</td>
+			<td class="layui-td-gray">奖惩类型</td>
+			<td>
+				<input type="radio" name="types" lay-filter="checktype" value="1" title="奖励" checked>
+				<input type="radio" name="types" lay-filter="checktype" value="2" title="惩罚" >
+			</td>
+			<td class="layui-td-gray">当前状态</td>
+			<td>
+				<input type="radio" name="status" lay-filter="checktype" value="1" title="待执行" checked>
+				<input type="radio" name="status" lay-filter="checktype" value="2" title="已执行" >
+			</td>
+		</tr>
+		{else/}
+			<tr>
+				<td class="layui-td-gray">奖惩项目<font>*</font></td>
+				<td>
+					<select name="rewards_cate" lay-verify="required" lay-reqText="请选择奖惩项目">
+						<option value="">请选择</option>
+						{volist name=":get_base_data('rewards_cate')" id="vo"}
+						<option value="{$vo.id}" {eq name="$vo.id" value="$detail.rewards_cate"} selected{/eq}>{$vo.title}</option>
+						{/volist}
+					</select>
+				</td>
+				<td class="layui-td-gray">奖惩类型</td>
+				<td>
+					<input type="radio" name="types" value="1" title="奖励" {eq name="$detail.types" value="1"} checked{/eq}>
+					<input type="radio" name="types" value="2" title="惩罚" {eq name="$detail.types" value="2"} checked{/eq}>
+				</td>
+				<td class="layui-td-gray">当前状态</td>
+				<td>
+					<input type="radio" name="status" value="1" title="待执行" {eq name="$detail.status" value="1"} checked{/eq}>
+					<input type="radio" name="status" value="2" title="已执行" {eq name="$detail.status" value="2"} checked{/eq}>
+				</td>
+			</tr>
+		{/eq}
+		<tr>
+			<td class="layui-td-gray">员工姓名<font>*</font></td>
+			<td>
+				<input type="text" name="uname" lay-verify="required" autocomplete="off" placeholder="请选择" lay-reqText="请选择员工姓名" class="layui-input picker-admin" readonly value="{$detail.user_name|default=''}">
+				<input type="hidden" name="uid" value="{$detail.uid|default=0}">
+			</td>
+			<td class="layui-td-gray-2">奖惩金额(元)<font>*</font></td>
+			<td>
+				<input type="text" name="cost" lay-verify="required|number" autocomplete="off" placeholder="请选择" lay-reqText="请完善金额，仅为数字" class="layui-input" value="{$detail.cost|default=''}">
+			</td>
+			<td class="layui-td-gray">奖惩日期<font>*</font></td>
+			<td>
+				<input type="text" name="rewards_time" readonly lay-verify="required" autocomplete="off" placeholder="请选择" lay-reqText="请选择奖惩日期" class="layui-input tool-time" value="{$detail.rewards_time|default=''}">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">奖惩物品</td>
+			<td colspan="5">
+				<input type="text" name="thing" autocomplete="off" placeholder="请输入奖惩物品，可空" class="layui-input" value="{$detail.thing|default=''}">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">奖罚描述</td>
+			<td colspan="5">
+				<textarea name="remark" placeholder="请输入奖罚描述，可空" class="layui-textarea">{$detail.remark|default=''}</textarea>
+			</td>
+		</tr>
+	</table>
+	<div class="pt-4">
+		<input type="hidden" name="id" value="{$id|default=0}"/>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool','oaPicker'];
+
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/user/rewards/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/user/view/rewards/datalist.html b/app/user/view/rewards/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..a1540ce886f7a73938f41c3087cdb4e910354ce8
--- /dev/null
+++ b/app/user/view/rewards/datalist.html
@@ -0,0 +1,150 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
+		<div class="layui-input-inline" style="width:100px">
+			<select name="status">
+				<option value="">奖惩状态</option>
+				<option value="1">待执行</option>
+				<option value="2">已执行</option>
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:100px">
+			<select name="types">
+				<option value="">奖惩类型</option>
+				<option value="1">奖励</option>
+				<option value="2">惩罚</option>
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:100px">
+			<select name="rewards_cate">
+				<option value="">奖惩项目</option>
+				{volist name=":get_base_data('rewards_cate')" id="vo"}
+				<option value="{$vo.id}">{$vo.title}</option>
+				{/volist}
+			</select>
+		</div>
+		<div class="layui-input-inline" style="width:80px">
+			<input type="text" name="uname" placeholder="奖惩员工" class="layui-input picker-admin" value="" readonly>
+			<input type="text" name="uid" value="" style="display:none;">
+		</div>
+		<div class="layui-input-inline" style="width:292px;">
+			<input type="text" class="layui-input" id="diff_time" placeholder="奖惩日期" readonly name="diff_time">
+		</div>
+		<div class="layui-input-inline" style="width:188px">
+			<input type="text" name="keywords" placeholder="关键字" class="layui-input" autocomplete="off" />
+		</div>
+		<div class="layui-input-inline" style="width:150px;">
+			<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+			<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+		</div>
+	</form>
+	<table class="layui-hide" id="table_rewards" lay-filter="table_rewards"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm" lay-event="add" type="button">+ 添加奖罚管理</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','oaPicker','tablePlus','laydatePlus'];
+	function gouguInit() {
+		var table = layui.tablePlus, tool = layui.tool, laydatePlus = layui.laydatePlus;
+		var diff_time = new laydatePlus({'target':'diff_time'});
+		layui.pageTable = table.render({
+			elem: "#table_rewards"
+			, toolbar: "#toolbarDemo"
+			,url: "/user/rewards/datalist"
+			,page: true
+			,limit: 20
+			,cellMinWidth: 80
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'status',title: '状态',width:90, align:'center',templet: function(d){
+					var html='';
+					if(d.status==1){
+						return '<span class="green">『待执行』</span>';
+					}
+					if(d.status==2){
+						return '<span class="red">『已执行』</span>';
+					}
+					else{
+						return '-';
+					}
+				}}
+				,{field:'user_name',title: '员工',width:90, align:'center'}
+				,{field:'types',title: '奖惩类型',width:90, align:'center',templet: function(d){
+					var html='';
+					if(d.types==1){
+						return '<span class="green">奖励</span>';
+					}
+					if(d.types==2){
+						return '<span class="red">罚款</span>';
+					}
+					else{
+						return '-';
+					}
+				}}
+				,{field:'cate',title: '奖惩项目',width:100, align:'center'}
+				,{field:'rewards_time',title: '奖惩日期',width:90, align:'center'}
+				,{field:'cost',title: '金额(元)',width:90, align:'right'}
+				,{field:'thing',title: '物品'}
+				,{field:'admin_name',title: '创建人',width:90,align:'center'}
+				,{field:'create_time', title: '创建时间',width:150,align:'center'}
+				,{width:120,fixed:'right',title: '操作', align:'center',templet: function(d){
+					var html='';
+					var btn1='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详细</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn3='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
+					html = '<div class="layui-btn-group">'+btn1+btn2+btn3+'</div>';
+					return html;
+				}}
+			]]
+		});
+		
+		//表头工具栏事件
+		table.on('toolbar(table_rewards)', function(obj){
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = checkStatus.data;
+			if (obj.event === 'add') {
+				tool.side("/user/rewards/add");
+				return;
+			}
+		});	
+			
+		table.on('tool(table_rewards)',function (obj) {
+			let data=obj.data
+			if (obj.event === 'view') {
+				tool.side("/user/rewards/view?id="+data.id);
+				return;
+			}
+			if (obj.event === 'edit') {
+				tool.side("/user/rewards/add?id="+data.id);
+				return;
+			}
+			if (obj.event === 'del') {
+				layer.confirm('确定要删除该内容吗?', { icon: 3, title: '提示' }, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							obj.del();
+						}
+					}
+					tool.delete("/user/rewards/del", { id: data.id }, callback);
+					layer.close(index);
+				});
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/user/view/rewards/view.html b/app/user/view/rewards/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..302aec2961c3e7dab487f879930ec188eda80249
--- /dev/null
+++ b/app/user/view/rewards/view.html
@@ -0,0 +1,53 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">奖罚信息</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">员工姓名</td>
+			<td>{$detail.user_name|default=''}</td>
+			<td class="layui-td-gray">奖惩类型</td>
+			<td>
+				{eq name="$detail.types" value="1"}<span class="green">奖励</span>{/eq}
+				{eq name="$detail.types" value="2"}<span class="red">惩罚</span>{/eq}
+			</td>
+			<td class="layui-td-gray">当前状态</td>
+			<td>
+				{eq name="$detail.status" value="1"}<span class="green">『待执行』</span>{/eq}
+				{eq name="$detail.status" value="2"}<span class="red">『已执行』</span>{/eq}
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">奖惩项目</td>
+			<td>{$detail.cate}</td>
+			<td class="layui-td-gray-2">奖惩金额(元)</td>
+			<td>{$detail.cost}</td>
+			<td class="layui-td-gray">奖惩日期</td>
+			<td>{$detail.rewards_time}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">奖惩物品</td>
+			<td colspan="5">{$detail.thing}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">奖罚描述</td>
+			<td colspan="5">{$detail.remark|default=''}</td>
+		</tr>
+	</table>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool'];
+
+	function gouguInit() {
+		var tool = layui.tool;
+
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/user/view/rewardscate/add.html b/app/user/view/rewardscate/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..93b87b3203ccf49ad2566e394cf86a166e9f5350
--- /dev/null
+++ b/app/user/view/rewardscate/add.html
@@ -0,0 +1,49 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-page">
+	<h3 class="pb-3">奖惩项目</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">奖惩项目名称<font>*</font></td>
+			<td>
+				<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入奖惩项目名称" lay-reqText="请输入奖惩项目名称"class="layui-input" value="{$detail.title|default=''}">
+			</td>
+			<td class="layui-td-gray">排序</td>
+			<td>
+				<input type="text" name="sort" placeholder="请输入排序，数字" autocomplete="off" class="layui-input" value="{$detail.sort|default=''}">
+			</td>
+		</tr>
+	</table>
+	<div class="pt-3">
+		<input type="hidden" name="id" value="{$detail.id|default=0}"/>
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	var moduleInit = ['tool'];
+
+	function gouguInit() {
+		var form = layui.form, tool = layui.tool;
+		//监听提交
+		form.on('submit(webform)', function (data) {
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/user/rewardscate/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/user/view/rewardscate/datalist.html b/app/user/view/rewardscate/datalist.html
new file mode 100644
index 0000000000000000000000000000000000000000..980c8df035bb66e37182533ddeb9e384926237b3
--- /dev/null
+++ b/app/user/view/rewardscate/datalist.html
@@ -0,0 +1,124 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+
+<div class="p-page">
+	<table class="layui-hide" id="table_rewards_cate" lay-filter="table_rewards_cate"></table>
+</div>
+
+<script type="text/html" id="toolbarDemo">
+  <div class="layui-btn-container">
+  	<button class="layui-btn layui-btn-sm add-new" type="button">+ 添加奖惩项目</button>
+  </div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var table = layui.table, tool = layui.tool;
+		
+		layui.pageTable = table.render({
+			elem: "#table_rewards_cate"
+			,toolbar: '#toolbarDemo'
+			,url: "/user/rewardscate/datalist"
+			,page: false
+			,limit: 999
+			,cellMinWidth: 80
+			,cols: [[
+				{field:'id',width:80, title: 'ID号', align:'center'}
+				,{field:'title',title: '名称'}
+				,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
+					var html1='<span class="green">正常</span>';
+					var html2='<span class="yellow">禁用</span>';
+					if(d.status==1){
+						return html1;
+					}
+					else{
+						return html2;
+					}
+				}}
+				,{width:100,title: '操作', align:'center',templet: function(d){
+					var html='';
+					var btn='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>';
+					var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
+					var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
+					if(d.status==1){
+						html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
+					}
+					else{
+						html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
+					}
+					return html;
+				}}
+			]]
+		});
+			
+		table.on('tool(table_rewards_cate)',function (obj) {
+			if(obj.event === 'edit'){					
+				add_cate(obj.data.id,obj.data.title);
+			}
+			if(obj.event === 'disable'){
+				layer.confirm('确定要禁用该奖惩项目吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/user/rewardscate/set", {id:obj.data.id,status: 0}, callback);
+					layer.close(index);
+				});
+			}
+			if(obj.event === 'open'){
+				layer.confirm('确定要启用该奖惩项目吗?', {icon: 3, title:'提示'}, function(index){
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/user/rewardscate/set", {id:obj.data.id,status:1}, callback);
+					layer.close(index);
+				});
+			}
+		});
+		
+		$('body').on('click','.add-new',function(){
+			add_cate(0,'');	
+		});
+		
+		function add_cate(id,val){
+			var title = '新增奖惩项目';
+			if(id>0){
+				title = '编辑奖惩项目';
+			}
+			layer.prompt({
+				title: title,
+				value: val,
+				yes: function(index, layero) {
+					// 获取文本框输入的值
+					var value = layero.find(".layui-layer-input").val();
+					if (value) {
+						let callback = function (e) {
+							layer.msg(e.msg);
+							if (e.code == 0) {
+								layui.pageTable.reload();				
+							}
+						}
+						tool.post("/user/rewardscate/add", {id: id,title: value}, callback);
+						layer.close(index);
+					} else {
+						layer.msg('请填写奖惩项目名称');
+					}
+				}
+			})
+		}
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/user/view/user/add.html b/app/user/view/user/add.html
new file mode 100644
index 0000000000000000000000000000000000000000..8df1b87c09b8b28161a1ca92bde75a0dd7a03391
--- /dev/null
+++ b/app/user/view/user/add.html
@@ -0,0 +1,295 @@
+{extend name="../../base/view/common/base" /}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	{if condition="$id eq 0"}
+	<h3 class="pb-3">添加员工信息</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">员工姓名<font>*</font></td>
+			<td>
+				<input type="text" name="name" lay-verify="required" placeholder="请输入员工姓名" lay-reqText="请输入员工姓名" class="layui-input">
+			</td>
+			<td class="layui-td-gray">员工性别<font>*</font></td>
+			<td>
+				<input type="radio" name="sex" value="1" title="男">
+				<input type="radio" name="sex" value="2" title="女">
+			</td>
+			<td class="layui-td-gray">初始密码</td>
+			<td>
+				{$reg_pwd}
+				<input type="hidden" name="reg_pwd" value="{$reg_pwd}" lay-verify="required">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">手机号码<font>*</font></td>
+			<td>
+				<input type="text" name="mobile" lay-verify="required|phone" lay-reqText="请输入正确的手机号码" placeholder="可使用手机号码登录" class="layui-input">
+			</td>
+			<td class="layui-td-gray">电子邮箱<font>*</font></td>
+			<td>
+				<input type="text" name="email" lay-verify="required|email" lay-reqText="请输入正确的电子邮箱" placeholder="请输入电子邮箱" class="layui-input">
+			</td>
+			<td rowspan="3" class="layui-td-gray">头像<br /><span style="font-size: 12px;">(如若不上传<br />系统将自动生成)</span></td>
+			<td rowspan="3" valign="top" style="width: 120px;">
+				<div class="layui-upload" style="width: 120px;">
+					<div class="layui-upload-list" id="uploadBox" style="width: 100%; height:120px; overflow: hidden;">
+						<img src="/static/home/images/nonepic600x600.jpg" height="120" style="max-width: 100%; width: 100%;" />
+						<input type="hidden" name="thumb" value="">
+					</div>
+					<button type="button" class="layui-btn layui-btn-normal layui-btn-sm" style="width: 100%;" id="uploadBtn">上传头像</button>
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">主部门<font>*</font></td>
+			<td><select id="did" name="did" xm-selected="" xm-select="select2" xm-select-skin="default" xm-select-radio="true"></select></td>
+			<td class="layui-td-gray">次要部门</td>
+			<td><select id="department_ids" name="department_ids" xm-selected="" xm-select="select1" xm-select-skin="default"></select></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">岗位职称<font>*</font></td>
+			<td>
+				<select name="position_id" lay-verify="required" lay-reqText="请选择岗位职称">
+					<option value="">请选择岗位职称</option>
+					{volist name="position" id="v"}
+						<option value="{$v.id}">{$v.title}</option>
+					{/volist}
+				</select>				
+			</td>
+			<td class="layui-td-gray">上级主管</td>
+			<td>
+				<input type="text" name="pname" readonly placeholder="请选择" class="layui-input picker-admin">
+				<input type="hidden" name="pid" value="0">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">入职日期<font>*</font></td>
+			<td>
+				<input type="text" name="entry_time" readonly lay-verify="required" placeholder="请选择入职日期" lay-reqText="请选择入职日期" class="layui-input tool-time">
+			</td>
+			<td class="layui-td-gray">身份类型<font>*</font></td>
+			<td>
+				<input type="radio" name="is_staff" value="1" title="企业员工">
+				<input type="radio" name="is_staff" value="2" title="劳动派遣">
+				<input type="radio" name="is_staff" value="3" title="兼职人员">
+			</td>
+			<td class="layui-td-gray-2">隐藏联系方式</td>
+			<td>
+				<input type="radio" name="is_hide" value="0" title="否" checked>
+				<input type="radio" name="is_hide" value="1" title="是">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">员工类型<font>*</font></td>
+			<td colspan="5">
+				<input type="radio" name="type" value="1" title="正式">
+				<input type="radio" name="type" value="2" title="试用">
+				<input type="radio" name="type" value="3" title="实习">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">数据权限<font>*</font></td>
+			<td colspan="5">
+				<input type="radio" name="auth_did" value="0" title="仅自己关联的数据" checked>
+				<input type="radio" name="auth_did" value="1" title="所属主部门的数据">				
+				<input type="radio" name="auth_did" value="2" title="所属次部门的数据">				
+				<input type="radio" name="auth_did" value="3" title="所属主次部门的数据">				
+				<input type="radio" name="auth_did" value="4" title="所属主部门及其子部门数据">				
+				<input type="radio" name="auth_did" value="5" title="所属次部门及其子部门数据">				
+				<input type="radio" name="auth_did" value="6" title="所属主次部门及其子部门数据">				
+				<input type="radio" name="auth_did" value="7" title="所属主部门所在顶级部门及其子部门数据">				
+				<input type="radio" name="auth_did" value="8" title="所属次部门所在顶级部门及其子部门数据">				
+				<input type="radio" name="auth_did" value="9" title="所属主次部门所在顶级部门及其子部门数据">				
+				<input type="radio" name="auth_did" value="10" title="所有部门数据">			
+			</td>
+		</tr>
+	</table>
+	{else/}
+	<h3 class="pb-3">编辑员工信息</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">员工姓名<font>*</font></td>
+			<td>
+				<input type="text" name="name" value="{$detail.name}" lay-verify="required" placeholder="请输入员工姓名" lay-reqText="请输入员工姓名" class="layui-input">
+			</td>
+			<td class="layui-td-gray">登录账号</td>
+			<td>
+				{$detail.username}
+			</td>
+			<td class="layui-td-gray">初始密码</td>
+			<td>
+				{empty name="$detail.reg_pwd"}
+					密码已重置
+				{else/}
+					{$detail.reg_pwd}
+				{/empty}
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">手机号码<font>*</font></td>
+			<td>
+				<input type="text" name="mobile" value="{$detail.mobile}" lay-verify="required|phone" lay-reqText="请输入正确的手机号码" placeholder="可使用手机号码登录" class="layui-input">
+			</td>
+			<td class="layui-td-gray">电子邮箱<font>*</font></td>
+			<td>
+				<input type="text" name="email" value="{$detail.email}" lay-verify="required|email" lay-reqText="请输入正确的电子邮箱" placeholder="请输入电子邮箱" class="layui-input">
+			</td>
+			<td rowspan="4" class="layui-td-gray">头像<br /><span style="font-size: 12px;">(如若不上传<br />系统将自动生成)</span></td>
+			<td rowspan="4" valign="top" style="width: 160px;">
+				<div class="layui-upload" style="width: 160px;">
+					<div class="layui-upload-list" id="uploadBox" style="width: 100%; height:150px; overflow: hidden;">
+						<img src="{$detail.thumb}" height="150" style="max-width: 100%;" />
+						<input type="hidden" name="thumb" value="{$detail.thumb}">
+					</div>
+					<button type="button" class="layui-btn layui-btn-normal" style="width: 100%;" id="uploadBtn">上传头像</button>
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">员工性别<font>*</font></td>
+			<td>
+				<input type="radio" name="sex" value="1" title="男" {eq name="$detail.sex" value="1"}checked{/eq}>
+				<input type="radio" name="sex" value="2" title="女" {eq name="$detail.sex" value="2"}checked{/eq}>
+			</td>
+			<td class="layui-td-gray">入职日期<font>*</font></td>
+			<td>
+				<input type="text" value="{$detail.entry_time|date='Y-m-d'}" name="entry_time" readonly lay-verify="required" placeholder="请选择入职日期" lay-reqText="请选择入职日期" class="layui-input tool-time">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">主部门<font>*</font></td>
+			<td><select id="did" name="did" xm-selected="{$detail.did}" xm-select="select2" xm-select-skin="default" xm-select-radio="true"></select></td>
+			<td class="layui-td-gray">次要部门</td>
+			<td><select id="department_ids" name="department_ids" xm-selected="{$detail.department_ids}" xm-select="select1" xm-select-skin="default"></select></td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">岗位职称<font>*</font></td>
+			<td>
+				<select name="position_id" lay-verify="required" lay-reqText="请选择岗位职称">
+					<option value="">请选择岗位职称</option>
+					{volist name="position" id="v"}
+						<option value="{$v.id}" {eq name="$v.id" value="$detail.position_id"}selected{/eq}>{$v.title}</option>
+					{/volist}
+				</select>				
+			</td>
+			<td class="layui-td-gray">上级主管</td>
+			<td>
+				<input type="text" name="pname" value="{$detail.pname|default=''}" readonly placeholder="请选择" class="layui-input picker-admin">
+				<input type="hidden" name="pid" value="{$detail.pid}">
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">员工类型<font>*</font></td>
+			<td>
+				<input type="radio" name="type" value="1" title="正式" {eq name="$detail.type" value="1"}checked{/eq}>
+				<input type="radio" name="type" value="2" title="试用" {eq name="$detail.type" value="2"}checked{/eq}>
+				<input type="radio" name="type" value="3" title="实习" {eq name="$detail.type" value="3"}checked{/eq}>
+			</td>
+			<td class="layui-td-gray">身份类型<font>*</font></td>
+			<td>
+				<input type="radio" name="is_staff" value="1" title="企业员工" {eq name="$detail.is_staff" value="1"}checked{/eq}>
+				<input type="radio" name="is_staff" value="2" title="劳动派遣" {eq name="$detail.is_staff" value="2"}checked{/eq}>
+				<input type="radio" name="is_staff" value="3" title="兼职员工" {eq name="$detail.is_staff" value="3"}checked{/eq}>
+			</td>
+			<td class="layui-td-gray-3">隐藏联系方式</td>
+			<td>
+				<input type="radio" name="is_hide" value="0" title="否" {eq name="$detail.is_hide" value="0"}checked{/eq}>
+				<input type="radio" name="is_hide" value="1" title="是" {eq name="$detail.is_hide" value="1"}checked{/eq}>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">数据权限<font>*</font></td>
+			<td colspan="5">
+				<input type="radio" name="auth_did" value="0" title="仅自己关联的数据" {eq name="$detail.auth_did" value="0"}checked{/eq}>
+				<input type="radio" name="auth_did" value="1" title="所属主部门的数据" {eq name="$detail.auth_did" value="1"}checked{/eq}>				
+				<input type="radio" name="auth_did" value="2" title="所属次部门的数据" {eq name="$detail.auth_did" value="2"}checked{/eq}>				
+				<input type="radio" name="auth_did" value="3" title="所属主次部门的数据" {eq name="$detail.auth_did" value="3"}checked{/eq}>				
+				<input type="radio" name="auth_did" value="4" title="所属主部门及其子部门数据" {eq name="$detail.auth_did" value="4"}checked{/eq}>				
+				<input type="radio" name="auth_did" value="5" title="所属次部门及其子部门数据" {eq name="$detail.auth_did" value="5"}checked{/eq}>				
+				<input type="radio" name="auth_did" value="6" title="所属主次部门及其子部门数据" {eq name="$detail.auth_did" value="6"}checked{/eq}>				
+				<input type="radio" name="auth_did" value="7" title="所属主部门所在顶级部门及其子部门数据" {eq name="$detail.auth_did" value="7"}checked{/eq}>				
+				<input type="radio" name="auth_did" value="8" title="所属次部门所在顶级部门及其子部门数据" {eq name="$detail.auth_did" value="8"}checked{/eq}>				
+				<input type="radio" name="auth_did" value="9" title="所属主次部门所在顶级部门及其子部门数据" {eq name="$detail.auth_did" value="9"}checked{/eq}>					
+				<input type="radio" name="auth_did" value="10" title="所有部门数据" {eq name="$detail.auth_did" value="10"}checked{/eq}>				
+			</td>
+		</tr>
+	</table>
+	{/if}
+
+	<div class="pt-4">
+		<input type="hidden" value="{$id}" name="id">
+		<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
+		<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+	</div>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','formSelects','oaPicker','uploadPlus'];
+	function gouguInit() {
+		var form = layui.form,tool=layui.tool,formSelects=layui.formSelects,oaPicker = layui.oaPicker,uploadPlus=layui.uploadPlus;
+		
+		//选择所属部门
+		var selected_a = $('#did').attr('xm-selected');
+		formSelects.data('select2', 'server', {
+			url: '/api/index/get_department_select',
+			keyword: selected_a
+		});
+		//选择所属其他部门
+		var selected_b = $('#department_ids').attr('xm-selected');
+		formSelects.data('select1', 'server', {
+			url: '/api/index/get_department_select',
+			keyword: selected_b
+		});
+		
+		//头像上传
+		var photoUpload = new uploadPlus({
+			'use':'single',
+			'callback':function(res){
+				layer.msg(res.msg);
+				if (res.code == 0) {
+					//上传成功
+					$('#uploadBox input').attr('value', res.data.filepath);
+					$('#uploadBox img').attr('src', res.data.filepath);
+				}
+			}
+		});
+
+		//监听提交
+		form.on('submit(webform)', function(data){
+			if(!data.field.sex){
+				layer.msg('请选择员工性别');
+				return false;
+			}
+			if(!data.field.type){
+				layer.msg('请选择员工类型');
+				return false;
+			}
+			if(!data.field.is_staff){
+				layer.msg('请选择员工身份');
+				return false;
+			}
+			let department_ids = data.field.department_ids.split(',');
+			if(department_ids.includes(data.field.did)){
+				layer.msg('次要部门不能包含主部门');
+				return false;
+			}
+			let callback = function (e) {
+				layer.msg(e.msg);
+				if (e.code == 0) {
+					tool.sideClose(1000);
+				}
+			}
+			let clickbtn = $(this);
+			tool.post("/user/user/add", data.field, callback,clickbtn);
+			return false;
+		});
+	}
+
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/user/view/user/index.html b/app/user/view/user/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..d144571621b0a70124c31621622e299010aeac86
--- /dev/null
+++ b/app/user/view/user/index.html
@@ -0,0 +1,343 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+  <style>
+	.tree-left{width:200px; float:left; height:calc(100vh - 79px); overflow-y: auto; border:1px solid #eeeeee; border-right:0; background-color:#fbfbfb; padding:12px 12px 12px 5px;}
+	.tree-left::-webkit-scrollbar {width: 0;}
+	.tree-left h3{font-size:16px; height:30px; padding-left:10px; font-weight:800}
+  </style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<div class="p-page">
+	<div class="tree-left">
+		<h3>企业组织架构</h3>
+		<div id="depament"></div>
+	</div>
+	<div class="body-table" style="margin-left:200px; overflow:hidden;">
+		<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
+			<div class="layui-input-inline" style="width:136px">
+				<select name="status">
+					<option value="">选择员工状态</option>
+					<option value="1">正常状态</option>
+					<option value="2">离职状态</option>
+					<option value="0">禁止登录</option>
+				</select>
+			</div>
+			<div class="layui-input-inline" style="width:136px">
+				<select name="type">
+					<option value="">选择员工类型</option>
+					<option value="1">正式员工</option>
+					<option value="2">试用员工</option>
+					<option value="3">实习员工</option>
+				</select>
+			</div>
+			<div class="layui-input-inline" style="width:360px">
+				<input type="text" name="keywords" placeholder="关键字，如：ID号/姓名/登录账号/手机号码/电子邮箱" class="layui-input" autocomplete="off" />
+			</div>
+			<div class="layui-input-inline" style="width:150px;">
+				<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
+				<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
+			</div>
+		</form>
+		<table class="layui-hide" id="test" lay-filter="test"></table>
+	</div>
+</div>
+
+<script type="text/html" id="thumb">
+	<img src="{{d.thumb}}" width="30" height="30" />
+</script>
+<script type="text/html" id="toolbara">
+	<div class="layui-btn-group">
+		<button class="layui-btn layui-btn-sm" lay-event="add"><i class="layui-icon">&#xe61f;</i>添加员工</button>
+		<button class="layui-btn layui-btn-danger layui-btn-sm" lay-event="disable"><i class="layui-icon">&#x1006;</i>禁止登录</button>
+		<button class="layui-btn layui-btn-warm layui-btn-sm" lay-event="recovery"><i class="layui-icon">&#xe605;</i>恢复正常</button>
+		<button class="layui-btn layui-btn-normal layui-btn-sm" lay-event="import"><i class="layui-icon">&#xe66f;</i>批量导入</button>
+	</div>
+</script>
+
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool','tablePlus','uploadPlus'];
+	function gouguInit() {
+		var table = layui.tablePlus,tool = layui.tool,tree = layui.tree,form = layui.form,uploadPlus = layui.uploadPlus;			
+		$.ajax({
+			url: "/api/index/get_department_tree",
+			type:'get',
+			success:function(res){					
+				//仅节点左侧图标控制收缩
+				tree.render({
+					elem: '#depament',
+					data: res.trees,
+					onlyIconControl: true,  //是否仅允许节点左侧图标控制展开收缩
+					click: function(obj){
+						//layer.msg(JSON.stringify(obj.data));
+						$('#depament').find('.layui-tree-main').removeClass('on');
+						$(obj.elem).find('.layui-tree-main').eq(0).addClass('on');
+						layui.pageTable.reload({
+						   where:{did: obj.data.id},
+						   page:{curr:1}
+						});
+						$('[name="keywords"]').val('');
+						$('[name="status"]').val('');
+						$('[name="type"]').val('');
+						layui.form.render('select');
+					}
+				});	
+			}
+		});
+		
+		layui.pageTable = table.render({
+			elem: '#test',
+			title: '员工列表',
+			toolbar: '#toolbara',
+			url: "/user/user/index", //数据接口	
+			height: 'full-112',
+			cols: [
+				[
+					{type:'checkbox',fixed:'left'},
+					{
+						field: 'id',
+						title: 'ID号',
+						align: 'center',
+						width: 80
+					}, {
+						field: 'status',
+						title: '状态',
+						align: 'center',
+						width: 60,
+						templet: function (d) {
+							var html = '<span class="layui-badge layui-bg-green">正常</span>';
+							if(d.status == 2){
+								html = '<span class="layui-badge layui-bg-orange">已离职</span>'
+							}
+							else if(d.status == 0){
+								html = '<span class="layui-badge">被禁用</span>'
+							}
+							return html;
+						}
+					},{
+						field: 'type',
+						title: '员工类型',
+						align: 'center',
+						width: 80,
+						templet: function (d) {
+							var html = '<span style="color:#393D49">正式员工</span>';
+							if(d.type == 2){
+								html = '<span style="color:#01AAED">试用员工</span>'
+							}
+							else if(d.type == 3){
+								html = '<span style="color:#5FB878">实 习 生</span>'
+							}
+							return html;
+						}
+					}, {
+						field: 'username',
+						title: '登录账号',
+						width: 132
+					}, {
+						field: 'thumb',
+						title: '头像',
+						toolbar: '#thumb',
+						align: 'center',
+						width: 50
+					}, {
+						field: 'name',
+						title: '员工姓名',
+						align: 'center',
+						width: 80
+					},{
+						field: 'mobile',
+						title: '手机号码',
+						align: 'center',
+						width: 120
+					},{
+						field: 'email',
+						title: '电子邮箱',
+						width: 200
+					},{
+						field: 'sex',
+						title: '性别',
+						align: 'center',
+						width: 50,
+						templet: function (d) {
+							var html = '未知';
+							if(d.sex == 1){
+								html = '男'
+							}
+							else if(d.sex == 2){
+								html = '女'
+							}
+							return html;
+						}
+					},{
+						field: 'department',
+						title: '所在主部门',
+						width: 100
+					}, {
+						field: 'departments',
+						title: '所在次部门',
+						width: 160
+					}, {
+						field: 'position',
+						title: '岗位职称',
+						align: 'center',
+						width: 100
+					}, {
+						field: 'entry_time',
+						title: '入职日期',
+						align: 'center',
+						width: 100
+					}, {
+						field: 'login_num',
+						title: '累计登录',
+						align: 'center',
+						width: 80
+					}, {
+						field: 'last_login_time',
+						title: '最后登录时间',
+						align: 'center',
+						minWidth: 136
+					},{
+						field: 'right',
+						fixed:'right',
+						title: '操作',
+						width: 150,
+						align: 'center',
+						ignoreExport:true,
+						templet: function (d) {
+							var html = '';
+							var btn1 = '<span class="layui-btn layui-btn-xs layui-btn-normal" lay-event="view">详情</span>';
+							var btn2 = '<span class="layui-btn layui-btn-xs" lay-event="edit">编辑</span>';
+							var btn3 = '<span class="layui-btn layui-btn-xs layui-btn-warm" lay-event="copy">复制密码</span>';
+							var btn4 = '<span class="layui-btn layui-btn-xs layui-btn-danger" lay-event="psw">重置密码</span>';
+							if(d.reg_pwd == ''){
+								html = '<div class="layui-btn-group">'+btn1+btn2+btn4+'</div>';
+							}
+							else{
+								html = '<div class="layui-btn-group">'+btn1+btn2+btn3+'</div>';
+							}
+							return html;
+						}						
+					}
+				]
+			]
+		});
+
+		//表头工具栏事件
+		table.on('toolbar(test)', function(obj){
+			var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
+			var data = checkStatus.data;
+			if (obj.event === 'add') {
+				tool.side("/user/user/add");
+				return;
+			}
+			if (obj.event === 'import') {
+				let importUpload = new uploadPlus({
+					"title":'批量导入员工',
+					"use":'import',
+					"url":'/api/import/import_admin',
+					"import":{
+						"template":'/static/home/file/勾股OA员工导入模板.xlsx',
+						"tips":'如果导入失败，请根据提示注意检查表格数据，部门、职位需要是系统中存在的数据，如果不存在的话可能会导入失败。'
+					},
+					callback:function(res){
+						layui.pageTable.reload();
+					}
+				});	
+				return;				
+			}
+
+			var uidArray=[],msg='是否执行该操作？',type=0;
+			for(var i=0;i<data.length;i++){
+				uidArray.push(data[i].id);
+			}
+			if (obj.event === 'disable') {
+				if(data.length==0){
+					layer.msg('请选择要操作的员工');
+					return false;
+				}
+				layer.confirm('您确定要把选中的员工设为禁止登录?', {
+					icon: 3,
+					title: '提示'
+				}, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/user/user/set", {ids: uidArray.join(','),type:0}, callback);
+					layer.close(index);
+				});
+			}
+			
+			if (obj.event === 'recovery') {
+				if(data.length==0){
+					layer.msg('请选择要操作的员工');
+					return false;
+				}
+				layer.confirm('您确定要把选中的员工恢复正常?', {
+					icon: 3,
+					title: '提示'
+				}, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/user/user/set", {ids: uidArray.join(','),type:1}, callback);
+					layer.close(index);
+				});
+			}
+			
+		});
+
+
+		//监听行工具事件
+		table.on('tool(test)', function (obj) {
+			var data = obj.data;			
+			if (obj.event === 'view') {
+				tool.side('/user/user/view?id='+data.id);
+				return;
+			}
+			if(obj.data.status == 2){
+				layer.msg('离职员工不支持操作');
+				return false;
+			}
+			if(obj.event === 'edit'){
+				if(obj.data.id == 1){
+					layer.msg('超级管理员信息不支持编辑');
+					return false;
+				}
+				tool.side('/user/user/add?id='+data.id);
+			}
+			else if (obj.event === 'copy') {
+				tool.copyCtrl(data.reg_pwd);
+				return;
+			}
+			else if (obj.event === 'psw') {
+				layer.confirm('确定要重设该用户的密码？', {
+					icon: 3,
+					title: '提示'
+				}, function (index) {
+					let callback = function (e) {
+						layer.msg(e.msg);
+						if (e.code == 0) {
+							layui.pageTable.reload();
+						}
+					}
+					tool.post("/user/user/reset_psw", {id: data.id}, callback);
+					layer.close(index);
+				});
+				return;
+			}
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/app/user/view/user/view.html b/app/user/view/user/view.html
new file mode 100644
index 0000000000000000000000000000000000000000..72c0a936bb6f65d04e29173fbad28c0e8227c682
--- /dev/null
+++ b/app/user/view/user/view.html
@@ -0,0 +1,189 @@
+{extend name="../../base/view/common/base" /}
+{block name="style"}
+<style>
+.checkbox16 .layui-form-checkbox span{font-size:15px;font-weight:800;}
+.layui-checkbox-disabled>div{color: #666666!important;}
+.layui-disabled,.layui-radio-disabled>*,.layui-radio-disabled>i{color: #666666!important;}
+.layui-form-checked.layui-checkbox-disabled[lay-skin=primary]>i{background-color:#999!important;}
+</style>
+{/block}
+<!-- 主体 -->
+{block name="body"}
+<form class="layui-form p-4">
+	<h3 class="pb-3">员工信息</h3>
+	<table class="layui-table layui-table-form">
+		<tr>
+			<td class="layui-td-gray">登录账号</td>
+			<td>{$detail.username}</td>
+			<td class="layui-td-gray">登录密码</td>
+			<td>
+				{empty name="$detail.reg_pwd"}
+					密码已重置
+					<span class="layui-btn layui-btn-normal layui-btn-xs reset-psw" data-id="{$detail.id}">重设新密码</span>
+				{else/}
+					{$detail.reg_pwd}
+					<span class="layui-btn layui-btn-normal layui-btn-xs copy-psw" data-pwd="{$detail.reg_pwd}">复制初始密码</span>
+				{/empty}
+			</td>
+			<td class="layui-td-gray">员工状态</td>
+			<td>
+				{eq name="$detail.status" value="0"}<span style="color:#FF5722">禁止登录</span>{/eq}
+				{eq name="$detail.status" value="1"}<span style="color:#16b777">正常</span>{/eq}
+				{eq name="$detail.status" value="2"}<span style="color:#FFB800">已离职</span>{/eq}
+			</td>
+			<td rowspan="5" class="layui-td-gray">头像</td>
+			<td rowspan="5" valign="top" style="width: 160px;">
+				<div class="layui-upload">
+					<img src="{$detail.thumb}" style="width:160px; height:160px; max-width:100%" />
+				</div>
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">员工姓名</td>
+			<td>
+				{$detail.name}
+				{eq name="$detail.sex" value="1"}  <span class="layui-badge layui-bg-green">男</span>{/eq}
+				{eq name="$detail.sex" value="2"}  <span class="layui-badge layui-bg-red">女</span>{/eq}
+			</td>
+			<td class="layui-td-gray">手机号码</td>
+			<td>{$detail.mobile}</td>
+			<td class="layui-td-gray">电子邮箱</td>
+			<td>{$detail.email}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">所在主部门</td>
+			<td>{$detail.department}</td>
+			<td class="layui-td-gray">所在次部门</td>
+			<td>{$detail.department_names|default=''}</td>
+			<td class="layui-td-gray">上级主管</td>
+			<td>{$detail.pname|default=''}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">岗位职称</td>
+			<td>{$detail.position}</td>
+			<td class="layui-td-gray">入职日期</td>
+			<td>{$detail.entry_time | date='Y-m-d'}</td>
+			<td class="layui-td-gray">员工类型</td>
+			<td>
+				{eq name="$detail.type" value="1"}<span style="color:#393D49">正式员工</span>{/eq}
+				{eq name="$detail.type" value="2"}<span style="color:#01AAED">试用员工</span>{/eq}
+				{eq name="$detail.type" value="3"}<span style="color:#5FB878">实 习 生</span>{/eq}				
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">身份类型</td>
+			<td>
+				{eq name="$detail.is_staff" value="1"}<span style="color:#393D49">企业员工</span>{/eq}
+				{eq name="$detail.is_staff" value="2"}<span style="color:#01AAED">劳务派遣</span>{/eq}
+				{eq name="$detail.is_staff" value="3"}<span style="color:#5FB878">兼职员工</span>{/eq}	
+			</td>
+			<td class="layui-td-gray">隐藏联系方式</td>
+			<td colspan="3">
+				{eq name="$detail.is_hide" value="0"}否{/eq}
+				{eq name="$detail.is_hide" value="1"}是{/eq}
+			</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray-2">最后登录时间</td>
+			<td>{eq name="$detail.last_login_time" value="0"}-{else/}{$detail.last_login_time|date='Y-m-d H:i:s'}{/eq}</td>
+			<td class="layui-td-gray-2">最后登录IP</td>
+			<td>{$detail.last_login_ip}</td>
+			<td class="layui-td-gray-2">累计登录次数</td>
+			<td colspan="3">{$detail.login_num}</td>
+		</tr>
+		<tr>
+			<td class="layui-td-gray">数据权限</td>
+			<td colspan="7">
+				<input type="radio" name="auth_did" value="0" disabled title="仅自己关联的数据" {eq name="$detail.auth_did" value="0"}checked{/eq}>
+				<input type="radio" name="auth_did" value="1" disabled title="所属主部门的数据" {eq name="$detail.auth_did" value="1"}checked{/eq}>				
+				<input type="radio" name="auth_did" value="2" disabled title="所属次部门的数据" {eq name="$detail.auth_did" value="2"}checked{/eq}>				
+				<input type="radio" name="auth_did" value="3" disabled title="所属主次部门的数据" {eq name="$detail.auth_did" value="3"}checked{/eq}>				
+				<input type="radio" name="auth_did" value="4" disabled title="所属主部门及其子部门数据" {eq name="$detail.auth_did" value="4"}checked{/eq}>				
+				<input type="radio" name="auth_did" value="5" disabled title="所属次部门及其子部门数据" {eq name="$detail.auth_did" value="5"}checked{/eq}>				
+				<input type="radio" name="auth_did" value="6" disabled title="所属主次部门及其子部门数据" {eq name="$detail.auth_did" value="6"}checked{/eq}>				
+				<input type="radio" name="auth_did" value="7" disabled title="所属主部门所在顶级部门及其子部门数据" {eq name="$detail.auth_did" value="7"}checked{/eq}>				
+				<input type="radio" name="auth_did" value="8" disabled title="所属次部门所在顶级部门及其子部门数据" {eq name="$detail.auth_did" value="8"}checked{/eq}>				
+				<input type="radio" name="auth_did" value="9" disabled title="所属主次部门所在顶级部门及其子部门数据" {eq name="$detail.auth_did" value="9"}checked{/eq}>					
+				<input type="radio" name="auth_did" value="10" disabled title="所有部门数据" {eq name="$detail.auth_did" value="10"}checked{/eq}>				
+			</td>
+		</tr>
+	</table>
+	<h3 class="py-3">用户权限</h3>
+	<table class="layui-table layui-table-form">
+		{volist name="role_rule" id="vo"}
+		<tr>
+			<td style="font-weight:800; text-align:center;">
+			  <input type="checkbox" disabled value="{$vo.id}" title="{$vo.title}" {eq name="$vo.checked" value="true" }checked{/eq}>
+			</td>
+			{notempty name="vo.children"}
+				<td>
+					<div style="padding:0 0 0 10px;">
+					{volist name="vo.children" key="k" id="voo"}
+						<div class="checkbox16" style="padding:10px 0;">
+							<input type="checkbox" disabled lay-filter="rule" name="rule[]" value="{$voo.id}" lay-skin="primary" title="{$voo.title}" {eq name="$voo.checked" value="true" }checked{/eq}>
+						</div>
+						{notempty name="voo.children"}
+							<div style="padding:0 0 3px; {if condition='$k != count($vo.children)'}margin-bottom:3px; padding-bottom:16px; border-bottom:1px solid #eee;{/if}">
+							{volist name="voo.children" id="vooo"}
+								<div class="layui-input-inline" style="margin-right:10px;">
+									<input type="checkbox" disabled data-rule="{$voo.id}" name="rule[]" value="{$vooo.id}" lay-skin="primary" title="{$vooo.title}" {eq name="$vooo.checked" value="true" }checked{/eq}>
+								</div>
+							{/volist}
+							</div>
+						{/notempty}
+					{/volist}
+					</div>
+				</td>
+			{/notempty}
+		</tr>
+		{/volist}
+	</table>
+</form>
+{/block}
+<!-- /主体 -->
+
+<!-- 脚本 -->
+{block name="script"}
+<script>
+	const moduleInit = ['tool'];
+	function gouguInit() {
+		var tool=layui.tool;
+		//拷贝密码
+		$('.copy-psw').on('click',function(){
+			let pwd=$(this).data('pwd');
+			lay.clipboard.writeText({
+				text:pwd,
+				done:function(){
+					layer.msg('已复制初始化密码');
+				},
+				error:function(){
+					layer.msg('复制失败，请点击详情手动复制');
+				}
+			});
+		});
+		//重设密码
+		$('.reset-psw').on('click',function(){
+			let id=$(this).data('id');
+			layer.confirm('确定要重设该用户的密码？', {
+				icon: 3,
+				title: '提示'
+			}, function (index) {
+				let callback = function (e) {
+					layer.msg(e.msg);
+					if (e.code == 0) {
+						layer.msg(e.msg);
+						if(e.code==0){
+							setTimeout(function(){
+								location.reload();
+							},2000);
+						}
+					}
+				}
+				tool.post("/user/user/reset_psw",{id: id}, callback);
+				layer.close(index);
+			})	
+		});
+	}
+</script>
+{/block}
+<!-- /脚本 -->
\ No newline at end of file
diff --git a/composer.json b/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..2de72b3466b5a0d9174496a27d450505b3db4954
--- /dev/null
+++ b/composer.json
@@ -0,0 +1,64 @@
+{
+    "name": "gougu/oa",
+    "description": "the gouguoa project",
+    "type": "project",
+    "keywords": [
+        "dev",
+        "oa",
+        "cms"
+    ],
+    "homepage": "http://www.gouguoa.com",
+    "license": "Apache-2.0",
+    "authors": [
+        {
+            "name": "oa",
+            "email": "hdm58@qq.com"
+        }        
+    ],
+    "require": {
+        "php": ">=8.0",
+		"ext-curl": "*",
+        "ext-fileinfo": "*",
+        "ext-openssl": "*",
+        "ext-pdo": "*",
+        "ext-zip": "*",
+        "topthink/framework": "^8.0.3",
+		"topthink/think-filesystem": "^2.0",
+        "topthink/think-multi-app": "^1.0",
+        "topthink/think-view": "^2.0",
+        "topthink/think-captcha": "^3.0",
+        "topthink/think-helper": "^3.1",
+        "overtrue/pinyin": "^5.2",
+        "phpmailer/phpmailer": "^6.8",
+        "firebase/php-jwt": "^6.8",
+        "phpoffice/phpspreadsheet": "^1.2",
+        "phpoffice/phpword": "^1.2"
+    },
+    "require-dev": {
+        "symfony/var-dumper": "^6.0",
+        "topthink/think-trace":"^1.6"
+    },
+    "autoload": {
+        "psr-4": {
+            "app\\": "app"
+        },
+        "psr-0": {
+            "": "extend/"
+        }
+    },
+    "config": {
+        "preferred-install": "dist"
+    },
+    "scripts": {
+        "post-autoload-dump": [
+            "@php think service:discover",
+            "@php think vendor:publish"
+        ]
+    },
+	"repositories": {
+        "packagist": {
+            "type": "composer",
+            "url": "https://mirrors.tencent.com/composer/"
+        }
+    }
+}
diff --git a/config/app.php b/config/app.php
new file mode 100644
index 0000000000000000000000000000000000000000..21fed668734176bd2eaa892ceab50d8ae8dc5053
--- /dev/null
+++ b/config/app.php
@@ -0,0 +1,65 @@
+<?php
+// +----------------------------------------------------------------------
+// | 应用设置
+// +----------------------------------------------------------------------
+
+return [
+    // 应用地址
+    'app_host'         => env('app.host', ''),
+    // 应用的命名空间
+    'app_namespace'    => '',
+    // 是否启用路由
+    'with_route'       => true,
+    // 默认应用
+    'default_app'      => 'home',
+    // 默认时区
+    'default_timezone' => 'Asia/Shanghai',
+	//授权域名
+	'auth_host'    => 'oa.a.gougucms.com',
+	//授权key
+	'auth_key'    => 'YcXACHWh0s',
+	//授权码
+	'auth_code'    => 'o8aH.naS.4g8o7uwgkuKclmGsO.5c6oWmiY5cIXjAMCFHoW5ha0lslmkoabii9lteNERxeXYrUDByeFhBeFE9PQ==',
+    // 应用映射（自动多应用模式有效）
+    'app_map'          => [],
+    // 域名绑定（自动多应用模式有效）
+    'domain_bind'      => [],
+    // 禁止URL访问的应用列表（自动多应用模式有效）
+    'deny_app_list'    => [],
+	
+	// 默认全局过滤方法 用逗号分隔多个
+    'default_filter'         => 'htmlspecialchars',
+
+    // 异常页面的模板文件
+    'exception_tmpl'   => app()->getRootPath() . '/public/tpl/think_exception.tpl',
+    // 默认跳转页面对应的模板文件【新增】
+    'dispatch_success_tmpl' => app()->getRootPath() . '/public/tpl/dispatch_jump.tpl',
+    'dispatch_error_tmpl'  => app()->getRootPath() . '/public/tpl/dispatch_jump.tpl',
+    // 错误显示信息,非调试模式有效
+    'error_message'    => '😔错误～',
+    // 显示错误信息
+    'show_error_msg'   => false,
+	
+	'page_size'    => 20,//分页默认数据长度
+	
+	'file_size'    => 50,//附件大小50M
+	
+	'session_user'    => 'gougu_user',
+	
+	'session_admin'    => 'gougu_admin',
+
+	'http_exception_template'    =>  [
+		// 登录失败
+		401 => public_path() . 'tpl/401.html',
+		// 禁止访问
+		403 => public_path() . 'tpl/403.html',
+		// 无法找到文件
+		404 => public_path() . 'tpl/404.html',
+		// 无权限访问
+		405 => public_path() . 'tpl/405.html',
+		// 找不到数据
+		406 => public_path() . 'tpl/406.html',
+		//内部服务器错误
+		500 => public_path() . 'tpl/500.html',
+	]
+];
diff --git a/config/approve.php b/config/approve.php
new file mode 100644
index 0000000000000000000000000000000000000000..ae806224a14025364054f8bd4f15ffe7ff9f58d1
--- /dev/null
+++ b/config/approve.php
@@ -0,0 +1,59 @@
+<?php
+
+// +----------------------------------------------------------------------
+// | 审批类型
+// +----------------------------------------------------------------------
+
+return [
+    // 审批类型
+    'type'  => [
+		[
+			'id' => '1',
+			'title'=> '假勤',
+			'db_type'=>1,
+			'db_name'=>'',
+        ],
+		 [
+			'id' => '2',
+			'title'=> '行政',
+			'db_type'=>1,
+			'db_name'=>'',			
+        ],
+		[
+			'id' => '3',
+			'title'=> '财务',
+			'db_type'=>1,
+			'db_name'=>'',			
+        ],
+		[
+			'id' => '4',
+			'title'=> '人事',
+			'db_type'=>1,
+			'db_name'=>'',            
+        ],
+		[
+			'id' => '5',
+			'title'=> '其他',
+			'db_type'=>1,
+			'db_name'=>'',			
+        ],
+		[
+			'id' => '6',
+			'title'=> '报销' ,
+			'db_type'=>2,
+			'db_name'=>'',			
+        ],
+		[
+			'id' => '7',
+			'title'=> '发票',
+			'db_type'=>3,
+			'db_name'=>'',			
+        ],
+		[
+			'id' => '8',
+			'title'=> '合同',
+			'db_type'=>4,
+			'db_name'=>'',            
+        ],
+	],
+];
diff --git a/config/cache.php b/config/cache.php
new file mode 100644
index 0000000000000000000000000000000000000000..a8d69d247be95ccf50446556d71ec782080a56bb
--- /dev/null
+++ b/config/cache.php
@@ -0,0 +1,29 @@
+<?php
+
+// +----------------------------------------------------------------------
+// | 缓存设置
+// +----------------------------------------------------------------------
+
+return [
+    // 默认缓存驱动
+    'default' => env('cache.driver', 'file'),
+
+    // 缓存连接方式配置
+    'stores'  => [
+        'file' => [
+            // 驱动方式
+            'type'       => 'File',
+            // 缓存保存目录
+            'path'       => '',
+            // 缓存前缀
+            'prefix'     => '',
+            // 缓存有效期 0表示永久缓存
+            'expire'     => 0,
+            // 缓存标签前缀
+            'tag_prefix' => 'tag:',
+            // 序列化机制 例如 ['serialize', 'unserialize']
+            'serialize'  => [],
+        ],
+        // 更多的缓存连接
+    ],
+];
diff --git a/config/captcha.php b/config/captcha.php
new file mode 100644
index 0000000000000000000000000000000000000000..9661b06df423c17a3300567ec0017c87543ae88d
--- /dev/null
+++ b/config/captcha.php
@@ -0,0 +1,39 @@
+<?php
+// +----------------------------------------------------------------------
+// | Captcha配置文件
+// +----------------------------------------------------------------------
+
+return [
+    //验证码位数
+    'length'   => 5,
+    // 验证码字符集合
+    'codeSet'  => '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY',
+    // 验证码过期时间
+    'expire'   => 1800,
+    // 是否使用中文验证码
+    'useZh'    => false,
+    // 是否使用算术验证码
+    'math'     => true,
+    // 是否使用背景图
+    'useImgBg' => false,
+    //验证码字符大小
+    'fontSize' => 25,
+    // 是否使用混淆曲线
+    'useCurve' => true,
+    //是否添加杂点
+    'useNoise' => true,
+    // 验证码字体 不设置则随机
+    'fontttf'  => '',
+    //背景颜色
+    'bg'       => [243, 251, 254],
+    // 验证码图片高度
+    'imageH'   => 0,
+    // 验证码图片宽度
+    'imageW'   => 0,
+
+    // 添加额外的验证码设置
+    // verify => [
+    //     'length'=>4,
+    //    ...
+    //],
+];
diff --git a/config/console.php b/config/console.php
new file mode 100644
index 0000000000000000000000000000000000000000..e351a612a62847bc601d55c5ea2e32aca3af8189
--- /dev/null
+++ b/config/console.php
@@ -0,0 +1,17 @@
+<?php
+
+// +----------------------------------------------------------------------
+
+// | 控制台配置
+
+// +----------------------------------------------------------------------
+
+return [
+
+    // 指令定义
+    'commands' => [
+		'crud' => 'app\crud\command\Crud',
+    ],
+
+];
+
diff --git a/config/cookie.php b/config/cookie.php
new file mode 100644
index 0000000000000000000000000000000000000000..f728024f450fa837b9589c946baeebf05b7bc1a3
--- /dev/null
+++ b/config/cookie.php
@@ -0,0 +1,18 @@
+<?php
+// +----------------------------------------------------------------------
+// | Cookie设置
+// +----------------------------------------------------------------------
+return [
+    // cookie 保存时间
+    'expire'    => 0,
+    // cookie 保存路径
+    'path'      => '/',
+    // cookie 有效域名
+    'domain'    => '',
+    //  cookie 启用安全传输
+    'secure'    => false,
+    // httponly设置
+    'httponly'  => false,
+    // 是否使用 setcookie
+    'setcookie' => true,
+];
diff --git a/config/database.php b/config/database.php
new file mode 100644
index 0000000000000000000000000000000000000000..1b9ac73f35363fcc3d74fcf17039f29c3953cfc4
--- /dev/null
+++ b/config/database.php
@@ -0,0 +1,54 @@
+<?php
+return [
+    // 默认使用的数据库连接配置
+    'default'         => 'mysql',
+    // 自定义时间查询规则
+    'time_query_rule' => [],
+    // 自动写入时间戳字段
+    // true为自动识别类型 false关闭
+    // 字符串则明确指定时间字段类型 支持 int timestamp datetime date
+    'auto_timestamp'  => true,
+    // 时间字段取出后的默认时间格式
+    'datetime_format' => 'Y-m-d H:i:s',
+    // 数据库连接配置信息
+    'connections'     => [
+        'mysql' => [
+            // 数据库类型
+            'type'               =>  'mysql',
+            // 服务器地址
+            'hostname'           =>  '127.0.0.1',
+            // 数据库名
+            'database'           =>  'oa',
+            // 用户名
+            'username'           =>  'root',
+            // 密码
+            'password'           =>  '123456',
+            // 端口
+            'hostport'           =>  '3306',
+            // 数据库表前缀
+            'prefix'             =>  'oa_',
+            // 数据库连接参数
+            'params'          => [],
+            // 数据库编码默认采用utf8mb4
+            'charset'         => 'utf8mb4',
+            // 数据库调试模式
+            'debug'           => false,
+            // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
+            'deploy'          => 0,
+            // 数据库读写是否分离 主从式有效
+            'rw_separate'     => false,
+            // 读写分离后 主服务器数量
+            'master_num'      => 1,
+            // 指定从服务器序号
+            'slave_no'        => '',
+            // 是否严格检查字段是否存在
+            'fields_strict'   => true,
+            // 是否需要断线重连
+            'break_reconnect' => false,
+            // 监听SQL
+            'trigger_sql'     => true,
+            // 开启字段缓存
+            'fields_cache'    => false,
+        ],
+    ],
+];
\ No newline at end of file
diff --git a/config/filesystem.php b/config/filesystem.php
new file mode 100644
index 0000000000000000000000000000000000000000..c851aed10171c2becf26b163eae208f2ceb1d240
--- /dev/null
+++ b/config/filesystem.php
@@ -0,0 +1,26 @@
+<?php
+
+use think\facade\Env;
+
+return [
+    // 默认磁盘
+    'default' => Env::get('filesystem.driver', 'local'),
+    // 磁盘列表
+    'disks'   => [
+        'local'  => [
+            'type' => 'local',
+            'root' => app()->getRuntimePath() . 'storage',
+        ],
+        'public' => [
+            // 磁盘类型
+            'type'       => 'local',
+            // 磁盘路径
+            'root'       => app()->getRootPath() . 'public/storage',
+            // 磁盘路径对应的外部URL路径
+            'url'        => '/storage',
+            // 可见性
+            'visibility' => 'public',
+        ],
+        // 更多的磁盘配置信息
+    ],
+];
diff --git a/config/lang.php b/config/lang.php
new file mode 100644
index 0000000000000000000000000000000000000000..59f320ffd7c568df4aeb9ac751de08616268a16b
--- /dev/null
+++ b/config/lang.php
@@ -0,0 +1,27 @@
+<?php
+// +----------------------------------------------------------------------
+// | 多语言设置
+// +----------------------------------------------------------------------
+
+return [
+    // 默认语言
+    'default_lang'    => env('lang.default_lang', 'zh-cn'),
+    // 允许的语言列表
+    'allow_lang_list' => [],
+    // 多语言自动侦测变量名
+    'detect_var'      => 'lang',
+    // 是否使用Cookie记录
+    'use_cookie'      => true,
+    // 多语言cookie变量
+    'cookie_var'      => 'think_lang',
+    // 多语言header变量
+    'header_var'      => 'think-lang',
+    // 扩展语言包
+    'extend_list'     => [],
+    // Accept-Language转义为对应语言包名称
+    'accept_language' => [
+        'zh-hans-cn' => 'zh-cn',
+    ],
+    // 是否支持语言分组
+    'allow_group'     => false,
+];
diff --git a/config/layout.php b/config/layout.php
new file mode 100644
index 0000000000000000000000000000000000000000..99b69b4854b2bde4ae2064cba0ad2cd193e70fd6
--- /dev/null
+++ b/config/layout.php
@@ -0,0 +1,76 @@
+<?php
+
+return [
+        [
+			'id'       => 1,
+			'row'       => 1,
+			'name'       => 'count',
+			'title'       => '模块统计',
+        ],
+         [
+			'id'       => 2,
+			'row'       => 1,
+			'name'       => 'event',
+			'title'       => '待办事项',
+        ],
+        [
+			'id'       => 3,
+			'row'       => 1,
+			'name'       => 'note',
+			'title'       => '企业公告',
+        ],
+		[
+			'id'       => 4,
+			'row'       => 1,
+			'name'       => 'project',
+			'title'       => '项目列表',
+        ],
+        [
+			'id'       => 5,
+			'row'       => 1,
+			'name'       => 'task',
+			'title'       => '任务列表',
+        ],
+        [
+			'id'       => 6,
+			'row'       => 1,
+			'name'       => 'chartview',
+			'title'       => '今日员工活跃度',
+        ],
+        [
+			'id'       => 7,
+			'row'       => 1,
+			'name'       => 'chartyear',
+			'title'       => '年度员工活跃度',
+        ],
+        [
+			'id'       => 8,
+			'row'       => 2,
+			'name'       => 'fastentry',
+			'title'       => '快捷入口',
+        ],
+        [
+			'id'       => 9,
+			'row'       => 2,
+			'name'       => 'approve',
+			'title'       => '办公审批',
+        ],
+        [
+			'id'       => 10,
+			'row'       => 2,
+			'name'       => 'system',
+			'title'       => '系统信息',
+        ],
+        [
+			'id'       => 11,
+			'row'       => 2,
+			'name'       => 'ranking',
+			'title'       => '活跃员工',
+        ],
+		[
+			'id'       => 12,
+			'row'       => 2,
+			'name'       => 'action',
+			'title'       => '员工动态',
+        ]
+];
diff --git a/config/log.php b/config/log.php
new file mode 100644
index 0000000000000000000000000000000000000000..78f9f2e9f0cdd8755c226c217b622a1e24d1daa7
--- /dev/null
+++ b/config/log.php
@@ -0,0 +1,91 @@
+<?php
+
+// +----------------------------------------------------------------------
+// | 日志设置
+// +----------------------------------------------------------------------
+return [
+    // 默认日志记录通道
+    'default'      => env('log.channel', 'file'),
+    // 日志记录级别
+    'level'        => [],
+    // 日志类型记录的通道 ['error'=>'email',...]
+    'type_channel' => [],
+    // 关闭全局日志写入
+    'close'        => false,
+    // 全局日志处理 支持闭包
+    'processor'    => null,
+
+    // 日志通道列表
+    'channels'     => [
+        'file' => [
+            // 日志记录方式
+            'type'           => 'File',
+            // 日志保存目录
+            'path'           => '',
+            // 单文件日志写入
+            'single'         => false,
+            // 独立日志级别
+            'apart_level'    => [],
+            // 最大日志文件数量
+            'max_files'      => 0,
+            // 使用JSON格式记录
+            'json'           => false,
+            // 日志处理
+            'processor'      => null,
+            // 关闭通道日志写入
+            'close'          => false,
+            // 日志输出格式化
+            'format'         => '[%s][%s] %s',
+            // 是否实时写入
+            'realtime_write' => false,
+        ],
+        // 其它日志通道配置
+    ],
+	'type_action' => [
+		'login'      => '登录',
+		'upload'     => '上传',
+		'down'       => '下载',
+		'bak'        => '备份',
+		'optimize'   => '优化',
+		'repair'     => '修复',
+		'reduction'  => '还原',
+		'import'     => '导入',
+		'export'     => '导出',
+		'add'        => '新增',
+		'edit'       => '编辑',
+		'view'       => '查看',
+		'save'       => '保存',
+		'delete'     => '删除',
+		'send'       => '发送',
+		'disable'    => '禁用',
+		'close'      => '关闭',
+		'secure'     => '解除',
+		'recovery'   => '恢复',
+		'set'		 => '设置',
+		'hand'		 => '交接',
+		'apply'      => '申请',
+		'check'      => '审核通过',
+		'refue'      => '审核拒绝',
+		'grant'      => '授予',
+		'back'       => '撤销',
+		'topay'      => '打款',
+		'open'       => '开具',
+		'enter'      => '到账',
+		'tovoid'     => '作废',
+		'leave'      => '离职',
+		'get'        => '获取',
+		'allot'      => '分配',
+		'remove'     => '移除',
+		'clear'      => '清除',
+		'star'   	 => '星标',
+		'unstar'  	 => '取消星标',
+		'lock'   	 => '锁住',
+		'unlock'   	 => '解锁',
+		'tosea'      => '公海移入',
+		'totrash'    => '废弃池移入',
+		'reset'      => '重新设置',
+		'install'    => '安装',
+		'uninstall'  => '卸载',
+    ],
+
+];
diff --git a/config/middleware.php b/config/middleware.php
new file mode 100644
index 0000000000000000000000000000000000000000..7e1972f5a09c7f09a1801dca6742e1971cc4e26d
--- /dev/null
+++ b/config/middleware.php
@@ -0,0 +1,8 @@
+<?php
+// 中间件配置
+return [
+    // 别名或分组
+    'alias'    => [],
+    // 优先级设置，此数组中的中间件会按照数组中的顺序优先执行
+    'priority' => [],
+];
diff --git a/config/route.php b/config/route.php
new file mode 100644
index 0000000000000000000000000000000000000000..2f4cd12902712b07c826a16d7653399c45184a44
--- /dev/null
+++ b/config/route.php
@@ -0,0 +1,45 @@
+<?php
+// +----------------------------------------------------------------------
+// | 路由设置
+// +----------------------------------------------------------------------
+
+return [
+    // pathinfo分隔符
+    'pathinfo_depr'         => '/',
+    // URL伪静态后缀
+    'url_html_suffix'       => 'html',
+    // URL普通方式参数 用于自动生成
+    'url_common_param'      => true,
+    // 是否开启路由延迟解析
+    'url_lazy_route'        => false,
+    // 是否强制使用路由
+    'url_route_must'        => false,
+    // 合并路由规则
+    'route_rule_merge'      => false,
+    // 路由是否完全匹配
+    'route_complete_match'  => false,
+    // 访问控制器层名称
+    'controller_layer'      => 'controller',
+    // 空控制器名
+    'empty_controller'      => 'Error',
+    // 是否使用控制器后缀
+    'controller_suffix'     => false,
+    // 默认的路由变量规则
+    'default_route_pattern' => '[\w\.]+',
+    // 是否开启请求缓存 true自动缓存 支持设置请求缓存规则
+    'request_cache_key'     => false,
+    // 请求缓存有效期
+    'request_cache_expire'  => null,
+    // 全局请求缓存排除规则
+    'request_cache_except'  => [],
+    // 默认控制器名
+    'default_controller'    => 'Index',
+    // 默认操作名
+    'default_action'        => 'index',
+    // 操作方法后缀
+    'action_suffix'         => '',
+    // 默认JSONP格式返回的处理方法
+    'default_jsonp_handler' => 'jsonpReturn',
+    // 默认JSONP处理方法
+    'var_jsonp_handler'     => 'callback',
+];
diff --git a/config/session.php b/config/session.php
new file mode 100644
index 0000000000000000000000000000000000000000..120cb909a5096e339369f87843fdea20c1d96278
--- /dev/null
+++ b/config/session.php
@@ -0,0 +1,19 @@
+<?php
+// +----------------------------------------------------------------------
+// | 会话设置
+// +----------------------------------------------------------------------
+
+return [
+    // session name
+    'name'           => 'PHPSESSID',
+    // SESSION_ID的提交变量,解决flash上传跨域
+    'var_session_id' => '',
+    // 驱动方式 支持file cache
+    'type'           => 'file',
+    // 存储连接标识 当type使用cache的时候有效
+    'store'          => null,
+    // 过期时间
+    'expire'         => 86400,
+    // 前缀
+    'prefix'         => '',
+];
diff --git a/config/trace.php b/config/trace.php
new file mode 100644
index 0000000000000000000000000000000000000000..fad2392d9bba5b6e9aaedf64824bc30560212aee
--- /dev/null
+++ b/config/trace.php
@@ -0,0 +1,10 @@
+<?php
+// +----------------------------------------------------------------------
+// | Trace设置 开启调试模式后有效
+// +----------------------------------------------------------------------
+return [
+    // 内置Html和Console两种方式 支持扩展
+    'type'    => 'Html',
+    // 读取的日志通道名
+    'channel' => '',
+];
diff --git a/config/view.php b/config/view.php
new file mode 100644
index 0000000000000000000000000000000000000000..f74d49f1db2844f92b424afae10933d75f867623
--- /dev/null
+++ b/config/view.php
@@ -0,0 +1,32 @@
+<?php
+// +----------------------------------------------------------------------
+// | 模板设置
+// +----------------------------------------------------------------------
+
+return [
+    // 模板引擎类型使用Think
+    'type' => 'Think',
+    // 默认模板渲染规则 1 解析为小写+下划线 2 全部转换小写 3 保持操作方法
+    'auto_rule' => 1,
+    // 模板目录名
+    'view_dir_name' => 'view',
+    // 模板后缀
+    'view_suffix' => 'html',
+    // 模板文件名分隔符
+    'view_depr' => DIRECTORY_SEPARATOR,
+    // 模板引擎普通标签开始标记
+    'tpl_begin' => '{',
+    // 模板引擎普通标签结束标记
+    'tpl_end' => '}',
+    // 标签库标签开始标记
+    'taglib_begin' => '{',
+    // 标签库标签结束标记
+    'taglib_end' => '}',
+    'tpl_replace_string' => array(
+        '{__STATIC__}' => '/static',
+        '{__GOUGU__}' => '/static/assets',
+        '{__CSS__}' => '/static/home/css',
+        '{__JS__}' => '/static/home/js',
+        '{__IMG__}' => '/static/home/images'
+    ),
+];
diff --git a/config/workchat.php b/config/workchat.php
new file mode 100644
index 0000000000000000000000000000000000000000..f67bea032b1e683c9aac28493803dcf05fdb46db
--- /dev/null
+++ b/config/workchat.php
@@ -0,0 +1,26 @@
+<?php
+
+// +----------------------------------------------------------------------
+// | 企业微信设置
+// +----------------------------------------------------------------------
+return [
+	// 是否打通企业微信
+    'workweixin' => false,
+    // 企业id
+    'corpid'        => 'ww04cexxxxxxx7e2322',
+    // 功能模块id
+    'agentid'       => '1000015',
+    // 功能模块secret
+    'corpsecret'    => 'VvBCWVmm9DVaTs-xxxxxxx-psruoN01VwnVqlwgxScU',
+    // 登录回调页面
+    'redirectUri'   =>'http://www.gouguoa.com/qiye/login/callback',
+    'host'          =>'http://www.gouguoa.com',
+	 // 是否是授权登录
+    'authorization' => true,
+    	//授权域名
+	'auth_host'     => '192.168.31.184',
+	//授权key
+	'auth_key'      => 'UtGcWvJkME',
+	//授权码
+	'auth_code'     => '1D9T2J.R1o6y8t.T3/1o.91X8L4ZUft7Gpc9Wiv8Jjk1MkEymboVbhixlQeVE0aVh6akQrME4zL05SeHc9PQ==',
+];
diff --git a/crud/.gitignore b/crud/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..c96a04f008ee21e260b28f7701595ed59e2839e3
--- /dev/null
+++ b/crud/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
\ No newline at end of file
diff --git a/extend/avatars/MDAvatars.php b/extend/avatars/MDAvatars.php
new file mode 100644
index 0000000000000000000000000000000000000000..6f697029b4a86b13c32b0fb6b150d4f72ad3f4a5
--- /dev/null
+++ b/extend/avatars/MDAvatars.php
@@ -0,0 +1,432 @@
+<?php
+/*
+ * Material-Design-Avatars
+ * https://github.com/lincanbin/Material-Design-Avatars
+ *
+ * Copyright 2015 Canbin Lin (lincanbin@hotmail.com)
+ * http://www.94cb.com/
+ *
+ * Licensed under the Apache License, Version 2.0:
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Create material deisgn avatars for users just like Gmail or Messager in Android.
+ */
+declare (strict_types = 1);
+namespace avatars;
+
+class MDAvatars
+{
+    public $Char;
+    public $AvatarSize;
+    public $Shape;
+    public $Padding;
+    public $Avatar;
+    public $FontFile;
+    public $IsNotLetter;
+    public $LetterFont;
+    public $AsianFont;
+    public $EnableAsianChar;
+
+
+    function __construct($Char, $AvatarSize = 256 ,$Shape = 1)
+    {
+        $this->Char            = mb_strtoupper(mb_substr($Char, 0, 1, "UTF-8"));
+        $this->AvatarSize      = $AvatarSize;
+        $this->Shape           = $Shape;
+        $this->Padding         = 30 * ($this->AvatarSize / 256);
+        $this->LetterFont      = dirname(__FILE__) . '/fonts/SourceCodePro-Light.ttf';
+        $this->AsianFont       = dirname(__FILE__) . '/fonts/SourceHanSansCN-Normal.ttf';
+        $this->EnableAsianChar = is_file($this->AsianFont);
+        $path='./storage/avatars/';
+        if(!is_dir($path)){
+            mkdir($path, 0755, true);
+        }
+        $CNChar = ord($this->Char);
+        if (!$this->EnableAsianChar &&
+            preg_match("/^[\x7f-\xff]/", $this->Char) &&
+            !($CNChar >= ord("A") && $CNChar <= ord("z"))
+        ) {
+            //如果是中文，并且没有中文字体包，则按拼音首字母对其进行转换
+            $CNByte = iconv("UTF-8", "gb2312", $this->Char);
+            $Code   = ord($CNByte[0]) * 256 + ord($CNByte[1]) - 65536;//求其偏移量
+            if ($Code >= -20319 and $Code <= -20284) $this->Char = "A";
+            if ($Code >= -20283 and $Code <= -19776) $this->Char = "B";
+            if ($Code >= -19775 and $Code <= -19219) $this->Char = "C";
+            if ($Code >= -19218 and $Code <= -18711) $this->Char = "D";
+            if ($Code >= -18710 and $Code <= -18527) $this->Char = "E";
+            if ($Code >= -18526 and $Code <= -18240) $this->Char = "F";
+            if ($Code >= -18239 and $Code <= -17923) $this->Char = "G";
+            if ($Code >= -17922 and $Code <= -17418) $this->Char = "H";
+            if ($Code >= -17417 and $Code <= -16475) $this->Char = "J";
+            if ($Code >= -16474 and $Code <= -16213) $this->Char = "K";
+            if ($Code >= -16212 and $Code <= -15641) $this->Char = "L";
+            if ($Code >= -15640 and $Code <= -15166) $this->Char = "M";
+            if ($Code >= -15165 and $Code <= -14923) $this->Char = "N";
+            if ($Code >= -14922 and $Code <= -14915) $this->Char = "O";
+            if ($Code >= -14914 and $Code <= -14631) $this->Char = "P";
+            if ($Code >= -14630 and $Code <= -14150) $this->Char = "Q";
+            if ($Code >= -14149 and $Code <= -14091) $this->Char = "R";
+            if ($Code >= -14090 and $Code <= -13319) $this->Char = "S";
+            if ($Code >= -13318 and $Code <= -12839) $this->Char = "T";
+            if ($Code >= -12838 and $Code <= -12557) $this->Char = "W";
+            if ($Code >= -12556 and $Code <= -11848) $this->Char = "X";
+            if ($Code >= -11847 and $Code <= -11056) $this->Char = "Y";
+            if ($Code >= -11055 and $Code <= -10247) $this->Char = "Z";
+        }
+        if (in_array($this->Char, str_split('QWERTYUIOPASDFGHJKLZXCVBNM0123456789', 1))) {
+            $this->IsNotLetter = false;
+            $this->FontFile    = $this->LetterFont;
+        } else {
+            $this->IsNotLetter = true;
+            $this->FontFile    = $this->AsianFont;
+        }
+        $this->Initialize();
+    }
+
+    private function Initialize()
+    {
+        //extension_loaded('gd')
+        $Width        = $this->AvatarSize;//Width of avatar
+        $Height       = $this->AvatarSize;//Height of avatar
+        $Padding      = $this->Padding;
+        $this->Avatar = imagecreatetruecolor($Width, $Height);
+        //全透明背景
+        imageSaveAlpha($this->Avatar, true);
+        $BackgroundAlpha = imagecolorallocatealpha($this->Avatar, 255, 255, 255, 127);
+        imagefill($this->Avatar, 0, 0, $BackgroundAlpha);
+        //抗锯齿
+        if (function_exists('imageantialias')) {
+            imageantialias($this->Avatar, true);
+        }
+        //Material Design参考颜色
+        //http://www.google.com/design/spec/style/color.html#color-color-palette
+        $MaterialDesignColor  = array(
+            array(239, 154, 154),
+            array(229, 115, 115),
+            array(239, 83, 80),
+            array(244, 67, 54),
+            array(229, 57, 53),
+            array(211, 47, 47),
+            array(198, 40, 40),
+            array(183, 28, 28),
+            array(255, 138, 128),
+            array(255, 82, 82),
+            array(255, 23, 68),
+            array(213, 0, 0),
+            array(248, 187, 208),
+            array(244, 143, 177),
+            array(240, 98, 146),
+            array(236, 64, 122),
+            array(233, 30, 99),
+            array(216, 27, 96),
+            array(194, 24, 91),
+            array(173, 20, 87),
+            array(136, 14, 79),
+            array(255, 128, 171),
+            array(255, 64, 129),
+            array(245, 0, 87),
+            array(197, 17, 98),
+            array(206, 147, 216),
+            array(186, 104, 200),
+            array(171, 71, 188),
+            array(156, 39, 176),
+            array(142, 36, 170),
+            array(123, 31, 162),
+            array(106, 27, 154),
+            array(74, 20, 140),
+            array(234, 128, 252),
+            array(224, 64, 251),
+            array(213, 0, 249),
+            array(170, 0, 255),
+            array(179, 157, 219),
+            array(149, 117, 205),
+            array(126, 87, 194),
+            array(103, 58, 183),
+            array(94, 53, 177),
+            array(81, 45, 168),
+            array(69, 39, 160),
+            array(49, 27, 146),
+            array(179, 136, 255),
+            array(124, 77, 255),
+            array(101, 31, 255),
+            array(98, 0, 234),
+            array(197, 202, 233),
+            array(159, 168, 218),
+            array(121, 134, 203),
+            array(92, 107, 192),
+            array(63, 81, 181),
+            array(57, 73, 171),
+            array(48, 63, 159),
+            array(40, 53, 147),
+            array(26, 35, 126),
+            array(140, 158, 255),
+            array(83, 109, 254),
+            array(61, 90, 254),
+            array(48, 79, 254),
+            array(227, 242, 253),
+            array(187, 222, 251),
+            array(144, 202, 249),
+            array(100, 181, 246),
+            array(66, 165, 245),
+            array(33, 150, 243),
+            array(30, 136, 229),
+            array(25, 118, 210),
+            array(21, 101, 192),
+            array(13, 71, 161),
+            array(130, 177, 255),
+            array(68, 138, 255),
+            array(41, 121, 255),
+            array(41, 98, 255),
+            array(179, 229, 252),
+            array(129, 212, 250),
+            array(79, 195, 247),
+            array(41, 182, 252),
+            array(3, 169, 244),
+            array(3, 155, 229),
+            array(2, 136, 209),
+            array(2, 119, 189),
+            array(1, 87, 155),
+            array(128, 216, 255),
+            array(64, 196, 255),
+            array(0, 176, 255),
+            array(0, 145, 234),
+            array(178, 235, 242),
+            array(128, 222, 234),
+            array(77, 208, 225),
+            array(38, 198, 218),
+            array(0, 188, 212),
+            array(0, 172, 193),
+            array(0, 151, 167),
+            array(0, 131, 143),
+            array(0, 96, 100),
+            array(132, 255, 255),
+            array(24, 255, 255),
+            array(0, 229, 255),
+            array(0, 184, 212),
+            array(178, 223, 219),
+            array(128, 203, 196),
+            array(77, 182, 172),
+            array(38, 166, 154),
+            array(0, 150, 136),
+            array(0, 137, 123),
+            array(0, 121, 107),
+            array(0, 105, 92),
+            array(0, 77, 64),
+            array(167, 255, 235),
+            array(100, 255, 218),
+            array(29, 233, 182),
+            array(0, 191, 165),
+            array(165, 214, 167),
+            array(129, 199, 132),
+            array(102, 187, 106),
+            array(76, 175, 80),
+            array(67, 160, 71),
+            array(56, 142, 60),
+            array(46, 125, 50),
+            array(27, 94, 32),
+            array(185, 246, 202),
+            array(105, 240, 174),
+            array(0, 230, 118),
+            array(0, 200, 83),
+            array(197, 225, 165),
+            array(174, 213, 129),
+            array(156, 204, 101),
+            array(139, 195, 74),
+            array(124, 179, 66),
+            array(104, 159, 56),
+            array(85, 139, 47),
+            array(51, 105, 30),
+            array(178, 255, 89),
+            array(118, 255, 3),
+            array(100, 221, 23),
+            array(249, 251, 231),
+            array(240, 244, 195),
+            array(230, 238, 156),
+            array(220, 231, 117),
+            array(212, 225, 87),
+            array(205, 220, 57),
+            array(192, 202, 51),
+            array(164, 180, 43),
+            array(158, 157, 36),
+            array(130, 119, 23),
+            array(198, 255, 0),
+            array(174, 234, 0),
+            array(251, 192, 45),
+            array(249, 168, 37),
+            array(245, 127, 23),
+            array(255, 179, 0),
+            array(255, 160, 0),
+            array(255, 143, 0),
+            array(255, 111, 0),
+            array(255, 171, 0),
+            array(255, 183, 77),
+            array(255, 167, 38),
+            array(255, 152, 0),
+            array(251, 140, 0),
+            array(245, 124, 0),
+            array(239, 108, 0),
+            array(230, 81, 0),
+            array(255, 171, 64),
+            array(255, 145, 0),
+            array(255, 109, 0),
+            array(255, 171, 145),
+            array(255, 138, 101),
+            array(255, 112, 67),
+            array(255, 87, 34),
+            array(244, 81, 30),
+            array(230, 74, 25),
+            array(216, 67, 21),
+            array(191, 54, 12),
+            array(255, 158, 128),
+            array(255, 110, 64),
+            array(255, 61, 0),
+            array(221, 38, 0),
+            array(188, 170, 164),
+            array(161, 136, 127),
+            array(141, 110, 99),
+            array(121, 85, 72),
+            array(109, 76, 65),
+            array(93, 64, 55),
+            array(78, 52, 46),
+            array(62, 39, 35),
+            array(189, 189, 189),
+            array(158, 158, 158),
+            array(117, 117, 117),
+            array(97, 97, 97),
+            array(66, 66, 66),
+            array(33, 33, 33),
+            array(236, 239, 241),
+            array(176, 187, 197),
+            array(144, 164, 174),
+            array(120, 144, 156),
+            array(96, 125, 139),
+            array(84, 110, 122),
+            array(69, 90, 100),
+            array(55, 71, 79),
+            array(38, 50, 56)
+        );
+        $BackgroundColorIndex = mt_rand(0, count($MaterialDesignColor) - 1);
+        $BackgroundColor      = imagecolorallocate($this->Avatar,
+            $MaterialDesignColor[$BackgroundColorIndex][0],
+            $MaterialDesignColor[$BackgroundColorIndex][1],
+            $MaterialDesignColor[$BackgroundColorIndex][2]
+        );
+		if($this->Shape == 1){
+			//画一个矩形
+			imagerectangle($this->Avatar,
+				0,
+				0,
+				$Width,
+				$Height,
+				$BackgroundColor
+			);
+			imagefilledrectangle($this->Avatar,
+				0,
+				0,
+				$Width,
+				$Height,
+				$BackgroundColor
+			);
+		}
+		else{
+			//画一个居中圆形
+			imagefilledellipse($this->Avatar,
+				$Width / 2,
+				$Height / 2,
+				$Width,
+				$Height,
+				$BackgroundColor
+			);
+		}
+        //字体
+        $FontColor = imagecolorallocate($this->Avatar, 255, 255, 255);
+        if ($this->IsNotLetter) {
+            //中文字符偏移
+            $FontSize = $Width - $Padding * 3.5;
+            $X        = $Padding + (-2 / 166) * $FontSize;
+            $Y        = $Height - $Padding - (23.5 / 166) * $FontSize;
+        } else {
+            $FontSize = $Width - $Padding * 2;
+            $X        = $Padding + (20 / 196) * $FontSize;
+            $Y        = $Height - $Padding - (13 / 196) * $FontSize;
+        }
+        // 在圆正中央填入字符
+        imagettftext($this->Avatar, $FontSize,0,intval($X), intval($Y),$FontColor,$this->FontFile, $this->Char);
+    }
+
+    private function Resize($TargetSize)
+    {
+        if (isset($this->Avatar)) {
+            if ($this->AvatarSize > $TargetSize) {
+                $Percent         = $TargetSize / $this->AvatarSize;
+                $TargetWidth     = round($this->AvatarSize * $Percent);
+                $TargetHeight    = round($this->AvatarSize * $Percent);
+                $TargetImageData = imagecreatetruecolor($TargetWidth, $TargetHeight);
+                //全透明背景
+                imageSaveAlpha($TargetImageData, true);
+                $BackgroundAlpha = imagecolorallocatealpha($TargetImageData, 255, 255, 255, 127);
+                imagefill($TargetImageData, 0, 0, $BackgroundAlpha);
+                imagecopyresampled($TargetImageData, $this->Avatar, 0, 0, 0, 0, $TargetWidth, $TargetHeight, $this->AvatarSize, $this->AvatarSize);
+                return $TargetImageData;
+            } else {
+                return $this->Avatar;
+            }
+        } else {
+            return false;
+        }
+    }
+
+    public function Free()
+    {
+        imagedestroy($this->Avatar);
+    }
+
+    public function Output2Browser($AvatarSize = 0)
+    {
+        if (!$AvatarSize) {
+            $AvatarSize = $this->AvatarSize;
+        }
+        header('Content-Type: image/png');
+        return imagepng($this->Resize($AvatarSize));
+    }
+
+    /**
+     * Get image resource identifier
+     * @param int $AvatarSize
+     * @return resource
+     */
+    public function Output2ImageResource($AvatarSize = 0)
+    {
+        if (!$AvatarSize) {
+            $AvatarSize = $this->AvatarSize;
+        }
+        return $this->Resize($AvatarSize);
+    }
+
+    /**
+     * Output Base64 encoded image data
+     * @param int $AvatarSize
+     * @return string
+     */
+    public function Output2Base64($AvatarSize = 0)
+    {
+        if (!$AvatarSize) {
+            $AvatarSize = $this->AvatarSize;
+        }
+
+        ob_start();
+        imagepng($this->Resize($AvatarSize));
+        $content = ob_get_contents();
+        ob_end_clean();
+
+        return 'data:image/png;base64,' . base64_encode($content);
+    }
+
+    public function Save($Path, $AvatarSize = 0)
+    {
+        if (!$AvatarSize) {
+            $AvatarSize = $this->AvatarSize;
+        }
+        return imagepng($this->Resize($AvatarSize), $Path);
+    }
+}
\ No newline at end of file
diff --git a/extend/avatars/fonts/SourceCodePro-Light.ttf b/extend/avatars/fonts/SourceCodePro-Light.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..1c68ee3fa7380db5577b8b82bd911b68a1e1611f
Binary files /dev/null and b/extend/avatars/fonts/SourceCodePro-Light.ttf differ
diff --git a/extend/avatars/fonts/SourceHanSansCN-Normal.ttf b/extend/avatars/fonts/SourceHanSansCN-Normal.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..d4f0fc4158346ad2f929396bcdf04167727cb9d8
Binary files /dev/null and b/extend/avatars/fonts/SourceHanSansCN-Normal.ttf differ
diff --git a/extend/backup/Backup.php b/extend/backup/Backup.php
new file mode 100644
index 0000000000000000000000000000000000000000..8003dcc59bb5f87a9ccffc5bf0eddab6fdf6b1b8
--- /dev/null
+++ b/extend/backup/Backup.php
@@ -0,0 +1,524 @@
+<?php
+declare (strict_types = 1);
+namespace backup;
+use think\facade\Config;
+class Backup
+{
+    private $fp;
+    /**
+     * 备份文件信息 part - 卷号，name - 文件名
+     * @var array
+     */
+    private $file;
+    /**
+     * 当前打开文件大小
+     * @var integer
+     */
+    private $size = 0;
+
+    /**
+     * 数据库配置
+     * @var integer
+     */
+    private $dbconfig = array();
+    /**
+     * 备份配置
+     * @var integer
+     */
+    private $config = array(
+		//数据库备份路径
+        'path' => './backup/',
+		//数据库备份卷大小,默认10MB
+        'part' => 10485760,
+        //数据库备份文件是否启用压缩 0不压缩 1 压缩
+        'compress' => 0,
+        //数压缩级别
+        'level' => 9,
+    );
+    /**
+     * 数据库备份构造方法
+     * @param array  $file   备份或还原的文件信息
+     * @param array  $config 备份配置信息
+     */
+    public function __construct($config = [])
+    {
+        $this->config = array_merge($this->config, $config);
+        //初始化文件名
+        $this->setFile();
+        //初始化数据库连接参数
+        $this->setDbConn();
+        //检查文件是否可写
+        if (!$this->checkPath($this->config['path'])) {
+            throw new \think\Exception("The current directory is not writable");
+        }
+    }
+    /**
+     * 设置脚本运行超时时间
+     * 0表示不限制，支持连贯操作
+     */
+    public function setTimeout($time=null)
+    {
+        if (!is_null($time)) {
+           set_time_limit($time)||ini_set("max_execution_time", $time);
+        }
+        return $this;
+    }
+    /**
+     * 设置数据库连接必备参数
+     * @param array  $dbconfig   数据库连接配置信息
+     * @return object
+     */
+    public function setDbConn($dbconfig = [])
+    {
+        if (empty($dbconfig)) {
+            $this->dbconfig = Config::get('database');
+        } else {
+            $this->dbconfig = $dbconfig;
+        }
+        return $this;
+    }
+    /**
+     * 设置备份文件名
+     * @param Array  $file  文件名字
+     * @return object
+     */
+    public function setFile($file = null)
+    {
+        if (is_null($file)) {
+            $this->file = ['name' => date('Ymd-His'), 'part' => 1];
+        } else {
+            if (!array_key_exists("name", $file) && !array_key_exists("part", $file)) {
+                $this->file = $file['1'];
+            } else {
+                $this->file = $file;
+            }
+        }
+        return $this;
+    }
+    //数据类连接
+    public static function connect()
+    {
+        return \think\facade\Db::connect();
+    }
+    //数据库表列表
+    public function dataList($table = null,$type=1)
+    {
+        $db = self::connect();
+        if (is_null($table)) {
+            $list = $db->query("SHOW TABLE STATUS");
+        } else {
+            if ($type) {
+                $list = $db->query("SHOW FULL COLUMNS FROM {$table}");
+            }else{
+                 $list = $db->query("show columns from {$table}");
+            }
+        }
+        return array_map('array_change_key_case', $list);
+        //$list;
+    }
+    //数据库备份文件列表
+    public function fileList()
+    {
+        if (!is_dir($this->config['path'])) {
+            mkdir($this->config['path'], 0755, true);
+        }
+        $path = realpath($this->config['path']);
+        $flag = \FilesystemIterator::KEY_AS_FILENAME;
+        $glob = new \FilesystemIterator($path, $flag);
+        $list = array();
+        foreach ($glob as $name => $file) {
+            if (preg_match('/^\\d{8,8}-\\d{6,6}-\\d+\\.sql(?:\\.gz)?$/', $name)) {
+                $name1= $name;
+                $name = sscanf($name, '%4s%2s%2s-%2s%2s%2s-%d');
+                $date = "{$name[0]}-{$name[1]}-{$name[2]}";
+                $time = "{$name[3]}:{$name[4]}:{$name[5]}";
+                $part = $name[6];
+                if (isset($list["{$date} {$time}"])) {
+                    $info = $list["{$date} {$time}"];
+                    $info['part'] = max($info['part'], $part);
+                    $info['size'] = $info['size'] + $file->getSize();
+                } else {
+                    $info['part'] = $part;
+                    $info['size'] = $file->getSize();
+                }
+                $extension = strtoupper(pathinfo($file->getFilename(), PATHINFO_EXTENSION));
+                $info['name']=$name1;
+                $info['compress'] = $extension === 'SQL' ? '-' : $extension;
+                $info['time'] = strtotime("{$date} {$time}");
+                $list["{$date} {$time}"] = $info;
+            }
+        }
+        return $list;
+    }
+    public function getFile($type = '', $time = 0)
+    {
+        //
+        if (!is_numeric($time)) {
+            throw new \think\Exception("{$time} Illegal data type");
+        }
+        switch ($type) {
+            case 'time':
+                $name = date('Ymd-His', $time) . '-*.sql*';
+                $path = realpath($this->config['path']) . DIRECTORY_SEPARATOR . $name;
+                return glob($path);
+                break;
+            case 'timeverif':
+                $name = date('Ymd-His', $time) . '-*.sql*';
+                $path = realpath($this->config['path']) . DIRECTORY_SEPARATOR . $name;
+                $files = glob($path);
+                $list = array();
+                foreach ($files as $name) {
+                    $basename = basename($name);
+                    $match = sscanf($basename, '%4s%2s%2s-%2s%2s%2s-%d');
+                    $gz = preg_match('/^\\d{8,8}-\\d{6,6}-\\d+\\.sql.gz$/', $basename);
+                    $list[$match[6]] = array($match[6], $name, $gz);
+                }
+                $last = end($list);
+                if (count($list) === $last[0]) {
+                    return $list;
+                } else {
+                    throw new \think\Exception("File {$files['0']} may be damaged, please check again");
+                }
+                break;
+            case 'pathname':
+                return "{$this->config['path']}{$this->file['name']}-{$this->file['part']}.sql";
+                break;
+            case 'filename':
+                return "{$this->file['name']}-{$this->file['part']}.sql";
+                break;
+            case 'filepath':
+                return $this->config['path'];
+                break;
+            default:
+                $arr = array('pathname' => "{$this->config['path']}{$this->file['name']}-{$this->file['part']}.sql", 'filename' => "{$this->file['name']}-{$this->file['part']}.sql", 'filepath' => $this->config['path'], 'file' => $this->file);
+                return $arr;
+        }
+    }
+    //删除备份文件
+    public function delFile($time)
+    {
+        if ($time) {
+            $file = $this->getFile('time', $time);
+            array_map("unlink", $this->getFile('time', $time));
+            if (count($this->getFile('time', $time))) {
+                throw new \think\Exception("File {$path} deleted failed");
+            } else {
+                return $time;
+            }
+        } else {
+            throw new \think\Exception("{$time} Time parameter is incorrect");
+        }
+    }
+    /**
+     * 下载备份
+     * @param string $time
+     * @param integer $part
+     * @return array|mixed|string
+     */
+    public function downloadFile($time, $part = 0)
+    {
+        $file = $this->getFile('time', $time);
+        $fileName = $file[$part];
+        if (file_exists($fileName)) {
+            ob_end_clean();
+            header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
+            header('Content-Description: File Transfer');
+            header('Content-Type: application/octet-stream');
+            header('Content-Length: ' . filesize($fileName));
+            header('Content-Disposition: attachment; filename=' . basename($fileName));
+            readfile($fileName);
+        } else {
+            throw new \think\Exception("{$time} File is abnormal");
+        }
+    }
+    public function import($start,$time,$part)
+    {
+        //还原数据
+        $db = self::connect();
+        //$this->file=$this->getFile('time',$time);
+		$file = $this->getFile('time', $time);
+        $fileName = $file[$part-1];
+        if (!file_exists($fileName)) {
+			return false;
+		}
+        if ($this->config['compress']) {
+            $gz = gzopen($fileName, 'r');
+            $size = 0;
+        } else {
+            $size = filesize($fileName);
+            $gz = fopen($fileName, 'r');
+        }
+        $sql = '';
+        if ($start) {
+            $this->config['compress'] ? gzseek($gz, $start) : fseek($gz, $start);
+        }
+        for ($i = 0; $i < 1000; $i++) {
+            $sql .= $this->config['compress'] ? gzgets($gz) : fgets($gz);
+            if (preg_match('/.*;$/', trim($sql))) {
+                if (false !== $db->execute($sql)) {
+                    $start += strlen($sql);
+                } else {
+                    return false;
+                }
+                $sql = '';
+            } elseif ($this->config['compress'] ? gzeof($gz) : feof($gz)) {
+                return 0;
+            }
+        }
+        return array($start, $size);
+    }
+    /**
+     * 写入初始数据
+     * @return boolean true - 写入成功，false - 写入失败
+     */
+    public function Backup_Init()
+    {
+        $sql = "-- -----------------------------\n";
+        $sql .= "-- Think MySQL Data Transfer \n";
+        $sql .= "-- \n";
+        $sql .= "-- \n";
+        $sql .= "-- Part : #{$this->file['part']}\n";
+        $sql .= "-- Date : " . date("Y-m-d H:i:s") . "\n";
+        $sql .= "-- -----------------------------\n\n";
+        $sql .= "SET FOREIGN_KEY_CHECKS = 0;\n\n";
+        return $this->write($sql);
+    }
+    /**
+     * 备份表结构
+     * @param  string  $table 表名
+     * @param  integer $start 起始行数
+     * @return boolean        false - 备份失败
+     */
+    public function backup($table, $start)
+    {
+        $db = self::connect();
+        // 备份表结构
+        if (0 == $start) {
+            $result = $db->query("SHOW CREATE TABLE `{$table}`");
+            $sql = "\n";
+            $sql .= "-- -----------------------------\n";
+            $sql .= "-- Table structure for `{$table}`\n";
+            $sql .= "-- -----------------------------\n";
+            $sql .= "DROP TABLE IF EXISTS `{$table}`;\n";
+            $sql .= trim($result[0]['Create Table']) . ";\n\n";
+            if (false === $this->write($sql)) {
+                return false;
+            }
+        }
+        //数据总数
+        $result = $db->query("SELECT COUNT(*) AS count FROM `{$table}`");
+        $count = $result['0']['count'];
+        //备份表数据
+        if ($count) {
+            //写入数据注释
+            if (0 == $start) {
+                $sql = "-- -----------------------------\n";
+                $sql .= "-- Records of `{$table}`\n";
+                $sql .= "-- -----------------------------\n";
+                $this->write($sql);
+            }
+            //备份数据记录
+            $result = $db->query("SELECT * FROM `{$table}` LIMIT {$start}, 1000");
+            foreach ($result as $row) {
+                $sql = "INSERT INTO `{$table}` VALUES ('" . str_replace(array("\r", "\n"), array('\\r', '\\n'), implode("', '", $row)) . "');\n";
+                if (false === $this->write($sql)) {
+                    return false;
+                }
+            }
+            //还有更多数据
+            if ($count > $start + 1000) {
+                return $this->backup($table, $start + 1000);
+            }
+        }
+        //备份下一表
+        return 0;
+    }
+    /**
+     * 优化表
+     * @param  String $tables 表名
+     * @return String $tables
+     */
+    public function optimize($tables = null)
+    {
+        if ($tables) {
+            $db = self::connect();
+            if (is_array($tables)) {
+                $tables = implode('`,`', $tables);
+                $list = $db->query("OPTIMIZE TABLE `{$tables}`");
+            } else {
+                $list = $db->query("OPTIMIZE TABLE `{$tables}`");
+            }
+            if ($list) {
+                return $tables;
+            } else {
+                throw new \think\Exception("data sheet'{$tables}'Repair mistakes please try again!");
+            }
+        } else {
+            throw new \think\Exception("Please specify the table to be repaired!");
+        }
+    }
+    /**
+     * 修复表
+     * @param  String $tables 表名
+     * @return String $tables
+     */
+    public function repair($tables = null)
+    {
+        if ($tables) {
+            $db = self::connect();
+            if (is_array($tables)) {
+                $tables = implode('`,`', $tables);
+                $list = $db->query("REPAIR TABLE `{$tables}`");
+            } else {
+                $list = $db->query("REPAIR TABLE `{$tables}`");
+            }
+            if ($list) {
+                return $list;
+            } else {
+                throw new \think\Exception("data sheet'{$tables}'Repair mistakes please try again!");
+            }
+        } else {
+            throw new \think\Exception("Please specify the table to be repaired!");
+        }
+    }
+    /**
+     * 写入SQL语句
+     * @param  string $sql 要写入的SQL语句
+     * @return boolean     true - 写入成功，false - 写入失败！
+     */
+    private function write($sql)
+    {
+        $size = strlen($sql);
+        //由于压缩原因，无法计算出压缩后的长度，这里假设压缩率为50%，
+        //一般情况压缩率都会高于50%；
+        $size = $this->config['compress'] ? $size / 2 : $size;
+        $this->open($size);
+        return $this->config['compress'] ? @gzwrite($this->fp, $sql) : @fwrite($this->fp, $sql);
+    }
+    /**
+     * 打开一个卷，用于写入数据
+     * @param  integer $size 写入数据的大小
+     */
+    private function open($size)
+    {
+        if ($this->fp) {
+            $this->size += $size;
+            if ($this->size > $this->config['part']) {
+                $this->config['compress'] ? @gzclose($this->fp) : @fclose($this->fp);
+                $this->fp = null;
+                $this->file['part']++;
+                session('backup_file', $this->file);
+                $this->Backup_Init();
+            }
+        } else {
+            $backuppath = $this->config['path'];
+            $filename = "{$backuppath}{$this->file['name']}-{$this->file['part']}.sql";
+            if ($this->config['compress']) {
+                $filename = "{$filename}.gz";
+                $this->fp = @gzopen($filename, "a{$this->config['level']}");
+            } else {
+                $this->fp = @fopen($filename, 'a');
+            }
+            $this->size = filesize($filename) + $size;
+        }
+    }
+    /**
+     * 检查目录是否可写
+     * @param  string   $path    目录
+     * @return boolean
+     */
+    protected function checkPath($path)
+    {
+        if (is_dir($path)) {
+            return true;
+        }
+        if (mkdir($path, 0755, true)) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+    /**
+     * 析构方法，用于关闭文件资源
+     */
+    public function __destruct()
+    {
+        if($this->fp){
+            $this->config['compress'] ? @gzclose($this->fp) : @fclose($this->fp);
+        }
+    }
+	
+	//判断某数据表是否存在
+	public function check_table($table){
+		$prefix = config('database.connections.mysql.prefix');
+		$db = self::connect();
+        $res = $db->query('SHOW TABLES LIKE '."'".$prefix.$table."'");
+        if($res){
+            return 1;
+        }else{
+            return 0;
+        }
+    }
+	//判断某数据表中某字段是否存在
+	public function check_column($table,$column){
+		$prefix = config('database.mysql.prefix');
+        $db = self::connect();
+        $res = $db->query('select count(*) from information_schema.columns where table_name = '."'".$table."' ". 'and column_name ='."'".$column."'");
+        if($res[0]['count(*)'] != 0){
+            return 1;
+        }else{
+            return 0;
+        }
+    }
+	
+	//添加字段
+	public function add_column($table,$column,$type,$condition,$after){
+        $db = self::connect();
+        $res = $db->execute('alter table'." `".$table."` ".'add'." `".$column."` ".$type." ".$condition." ".'after'." `".$after."`");
+        if($res){
+            return 1;
+        }else{
+            return 0;
+        }
+    }
+	
+	//删除字段
+	public function del_column($table,$column){
+        $db = self::connect();
+        $res = $db->execute('alter table '."`".$table."`".' drop column'."`".$column."`");
+        if($res){
+            return 1;
+        }else{
+            return 0;
+        }
+    }
+	
+	//修改字段
+	public function update_column($table,$old_column,$column,$type){
+        //字段名和类型同时修改才会返回1不然返回0
+        $db = self::connect();
+        $res = $db->execute('alter table' ." `".$table."` ". 'change' ." `".$old_column."` " ."`".$column."`" .$type);
+        if($res){
+            return 1;
+        }else{
+            return 0;
+        }
+    }
+	//执行sql
+	public function run_sql($sql){
+		$prefix = config('database.connections.mysql.prefix');
+		$db = self::connect();
+		$sql_array = preg_split("/;[\r\n]+/", str_replace("oa_", $prefix, $sql));
+		foreach ($sql_array as $k => $v) {
+			if (!empty($v)) {				
+				try {
+					$res = $db->query($v);
+				} catch (\Exception $e) {
+					return 0;
+					break;
+				}
+			}
+		}
+        return 1;
+    }
+}
diff --git a/extend/dateset/Dateset.php b/extend/dateset/Dateset.php
new file mode 100644
index 0000000000000000000000000000000000000000..9001207f4b8b83dbfc1dc4af21595526982fc61f
--- /dev/null
+++ b/extend/dateset/Dateset.php
@@ -0,0 +1,545 @@
+<?php
+declare (strict_types = 1);
+
+namespace dateset;
+
+/**
+ * 日期时间处理类
+ */
+class Dateset
+{
+    const YEAR = 31536000;
+    const MONTH = 2592000;
+    const WEEK = 604800;
+    const DAY = 86400;
+    const HOUR = 3600;
+    const MINUTE = 60;
+
+	/**
+	 * 间隔时间段格式化
+	 * @param int $time 时间戳
+	 * @param string $format 格式 【d：显示到天 i显示到分钟 s显示到秒】
+	 * @return string
+	 */
+	function time_trans($time, $format = 'd')
+	{
+		$now = time();
+		$diff = $now - $time;
+		if ($diff < self::MINUTE) {
+			return '1分钟前';
+		} else if ($diff < self::HOUR) {
+			return floor($diff / self::MINUTE) . '分钟前';
+		} else if ($diff < self::DAY) {
+			return floor($diff / self::HOUR) . '小时前';
+		}
+		$yes_start_time = strtotime(date('Y-m-d 00:00:00', strtotime('-1 days'))); //昨天开始时间
+		$yes_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-1 days'))); //昨天结束时间
+		$two_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-2 days'))); //2天前结束时间
+		$three_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-3 days'))); //3天前结束时间
+		$four_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-4 days'))); //4天前结束时间
+		$five_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-5 days'))); //5天前结束时间
+		$six_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-6 days'))); //6天前结束时间
+		$seven_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-7 days'))); //7天前结束时间
+
+		if ($time > $yes_start_time && $time < $yes_end_time) {
+			return '昨天';
+		}
+
+		if ($time > $yes_start_time && $time < $two_end_time) {
+			return '1天前';
+		}
+
+		if ($time > $yes_start_time && $time < $three_end_time) {
+			return '2天前';
+		}
+
+		if ($time > $yes_start_time && $time < $four_end_time) {
+			return '3天前';
+		}
+
+		if ($time > $yes_start_time && $time < $five_end_time) {
+			return '4天前';
+		}
+
+		if ($time > $yes_start_time && $time < $six_end_time) {
+			return '5天前';
+		}
+
+		if ($time > $yes_start_time && $time < $seven_end_time) {
+			return '6天前';
+		}
+
+		switch ($format) {
+			case 'd':
+				$show_time = date('Y-m-d', $time);
+				break;
+			case 'i':
+				$show_time = date('Y-m-d H:i', $time);
+				break;
+			case 's':
+				$show_time = date('Y-m-d H:i:s', $time);
+				break;
+		}
+		return $show_time;
+	}
+
+
+    /**
+     * 计算两个时间戳之间相差的时间
+     *
+     * $differ = self::differ(60, 182, 'minutes,seconds'); // array('minutes' => 2, 'seconds' => 2)
+     * $differ = self::differ(60, 182, 'minutes'); // 2
+     *
+     * @param int    $remote timestamp to find the span of
+     * @param int    $local  timestamp to use as the baseline
+     * @param string $output formatting string
+     * @return  string   when only a single output is requested
+     * @return  array    associative list of all outputs requested
+     * @from https://github.com/kohana/ohanzee-helpers/blob/master/src/Date.php
+     */
+    public static function differ($remote, $local = null, $output = 'years,months,weeks,days,hours,minutes,seconds')
+    {
+        // Normalize output
+        $output = trim(strtolower((string)$output));
+        if (!$output) {
+            // Invalid output
+            return false;
+        }
+        // Array with the output formats
+        $output = preg_split('/[^a-z]+/', $output);
+        // Convert the list of outputs to an associative array
+        $output = array_combine($output, array_fill(0, count($output), 0));
+        // Make the output values into keys
+        extract(array_flip($output), EXTR_SKIP);
+        if ($local === null) {
+            // Calculate the span from the current time
+            $local = time();
+        }
+        // Calculate timespan (seconds)
+        $timespan = abs($remote - $local);
+        if (isset($output['years'])) {
+            $timespan -= self::YEAR * ($output['years'] = (int)floor($timespan / self::YEAR));
+        }
+        if (isset($output['months'])) {
+            $timespan -= self::MONTH * ($output['months'] = (int)floor($timespan / self::MONTH));
+        }
+        if (isset($output['weeks'])) {
+            $timespan -= self::WEEK * ($output['weeks'] = (int)floor($timespan / self::WEEK));
+        }
+        if (isset($output['days'])) {
+            $timespan -= self::DAY * ($output['days'] = (int)floor($timespan / self::DAY));
+        }
+        if (isset($output['hours'])) {
+            $timespan -= self::HOUR * ($output['hours'] = (int)floor($timespan / self::HOUR));
+        }
+        if (isset($output['minutes'])) {
+            $timespan -= self::MINUTE * ($output['minutes'] = (int)floor($timespan / self::MINUTE));
+        }
+        // Seconds ago, 1
+        if (isset($output['seconds'])) {
+            $output['seconds'] = $timespan;
+        }
+        if (count($output) === 1) {
+            // Only a single output was requested, return it
+            return array_pop($output);
+        }
+        // Return array
+        return $output;
+    }
+
+    /**
+     * 获取指定年月拥有的天数
+     * @param int $month
+     * @param int $year
+     * @return false|int|string
+     */
+    public static function days_in_month($month, $year)
+    {
+        if (function_exists("cal_days_in_month")) {
+            return cal_days_in_month(CAL_GREGORIAN, $month, $year);
+        } else {
+            return date('t', mktime(0, 0, 0, $month, 1, $year));
+        }
+    }
+	
+
+	/**
+	 * 将秒数转换为时间 (小时、分、秒）
+	 * @param
+	 */
+	function getTimeBySec($time,$second=true)
+	{
+		if (is_numeric($time)) {
+			$value = array(
+				"hours" => 0,
+				"minutes" => 0, "seconds" => 0,
+			);
+			$t='';
+			if ($time >= 3600) {
+				$value["hours"] = floor($time / 3600);
+				$time = ($time % 3600);
+				$t .= $value["hours"] . "小时";
+			}
+			if ($time >= 60) {
+				$value["minutes"] = floor($time / 60);
+				$time = ($time % 60);
+				$t .= $value["minutes"] . "分钟";
+			}
+			if ($time > 0 && $time < 60 && $second==true) {
+				$value["seconds"] = floor($time);
+				$t .= $value["seconds"] . "秒";
+			}
+			return $t;
+		} else {
+			return (bool)FALSE;
+		}
+	}
+
+	/**
+	 * 将秒数转换为时间 (年、天、小时、分、秒）
+	 * @param
+	 */
+	function getDateBySec($time,$second=false)
+	{
+		if (is_numeric($time)) {
+			$value = array(
+				"years" => 0, "days" => 0, "hours" => 0,
+				"minutes" => 0, "seconds" => 0,
+			);
+			$t='';
+			if ($time >= 31556926) {
+				$value["years"] = floor($time / 31556926);
+				$time = ($time % 31556926);
+				$t .= $value["years"] . "年";
+			}
+			if ($time >= 86400) {
+				$value["days"] = floor($time / 86400);
+				$time = ($time % 86400);
+				$t .= $value["days"] . "天";
+			}
+			if ($time >= 3600) {
+				$value["hours"] = floor($time / 3600);
+				$time = ($time % 3600);
+				$t .= $value["hours"] . "小时";
+			}
+			if ($time >= 60) {
+				$value["minutes"] = floor($time / 60);
+				$time = ($time % 60);
+				$t .= $value["minutes"] . "分钟";
+			}
+			if ($time < 60 && $second==true) {
+				$value["seconds"] = floor($time);
+				$t .= $value["seconds"] . "秒";
+			}
+			return $t;
+		} else {
+			return (bool)FALSE;
+		}
+	}
+
+	/*
+	 *根据年月计算有几天
+	 */
+	function getmonthByYM($param)
+	{
+		$month = $param['month'] ? $param['month'] : date('m', time());
+		$year = $param['year'] ? $param['year'] : date('Y', time());
+		if (in_array($month, array('1', '3', '5', '7', '8', '01', '03', '05', '07', '08', '10', '12'))) {
+			$days = '31';
+		} elseif ($month == 2) {
+			if ($year % 400 == 0 || ($year % 4 == 0 && $year % 100 !== 0)) {
+				//判断是否是闰年  
+				$days = '29';
+			} else {
+				$days = '28';
+			}
+		} else {
+			$days = '30';
+		}
+		return $days;
+	}
+
+	/**
+	 * 根据时间戳计算当月天数
+	 * @param
+	 */
+	function getmonthdays($time)
+	{
+		$month = date('m', $time);
+		$year = date('Y', $time);
+		if (in_array($month, array('1', '3', '5', '7', '8', '01', '03', '05', '07', '08', '10', '12'))) {
+			$days = '31';
+		} elseif ($month == 2) {
+			if ($year % 400 == 0 || ($year % 4 == 0 && $year % 100 !== 0)) {
+				//判断是否是闰年  
+				$days = '29';
+			} else {
+				$days = '28';
+			}
+		} else {
+			$days = '30';
+		}
+		return $days;
+	}
+
+	/**
+	 * 生成从开始时间到结束时间的日期数组
+	 * @param type，默认时间戳格式
+	 * @param type = 1 时，date格式
+	 * @param type = 2 时，获取每日开始、结束时间
+	 */
+	function dateList($start, $end, $type = 0)
+	{
+		if (!is_numeric($start) || !is_numeric($end) || ($end <= $start)) return '';
+		$i = 0;
+		//从开始日期到结束日期的每日时间戳数组
+		$d = array();
+		if ($type == 1) {
+			while ($start <= $end) {
+				$d[$i] = date('Y-m-d', $start);
+				$start = $start + 86400;
+				$i++;
+			}
+		} else {
+			while ($start <= $end) {
+				$d[$i] = $start;
+				$start = $start + 86400;
+				$i++;
+			}
+		}
+		if ($type == 2) {
+			$list = array();
+			foreach ($d as $k => $v) {
+				$list[$k] = $this->getDateRange($v);
+			}
+			return $list;
+		} else {
+			return $d;
+		}
+	}
+
+	/**
+	 * 获取指定日期开始时间与结束时间
+	 */
+	function getDateRange($timestamp)
+	{
+		$ret = array();
+		$ret['sdate'] = strtotime(date('Y-m-d', $timestamp));
+		$ret['edate'] = strtotime(date('Y-m-d', $timestamp)) + 86400;
+		return $ret;
+	}
+
+	/**
+	 * 生成从开始月份到结束月份的月份数组
+	 * @param int $start 开始时间戳
+	 * @param int $end 结束时间戳
+	 */
+	function monthList($start, $end)
+	{
+		if (!is_numeric($start) || !is_numeric($end) || ($end <= $start)) return '';
+		$start = date('Y-m', $start);
+		$end = date('Y-m', $end);
+		//转为时间戳
+		$start = strtotime($start . '-01');
+		$end = strtotime($end . '-01');
+		$i = 0;
+		$d = array();
+		while ($start <= $end) {
+			//这里累加每个月的的总秒数 计算公式：上一月1号的时间戳秒数减去当前月的时间戳秒数
+			$d[$i] = $start;
+			$start += strtotime('+1 month', $start) - $start;
+			$i++;
+		}
+		return $d;
+	}
+
+	/**
+	 * 等于（时间段）数据处理
+	 *
+	 * @param $type
+	 * @return array
+	 * @since 2021-06-11
+	 * @author fanqi
+	 */
+	function advancedDate($type)
+	{
+		// 本年度
+		if ($type == 'year') {
+			$arrTime = DataTime::year();
+			$start_time = date('Y-m-d 00:00:00', $arrTime[0]);
+			$end_time = date('Y-m-d 23:59:59', $arrTime[1]);
+		}
+
+		// 上一年度
+		if ($type == 'lastYear') {
+			$start_time = date('Y-m-d 00:00:00', strtotime(date('Y-m-d') . '-1 year'));
+			$end_time = date('Y-m-d 23:59:59', strtotime(date('Y-m-d') . '-1 year'));
+		}
+
+		// 下一年度
+		if ($type == 'nextYear') {
+			$start_time = date('Y-m-d 00:00:00', strtotime(date('Y-m-d') . '+1 year'));
+			$end_time = date('Y-m-d 23:59:59', strtotime(date('Y-m-d') . '+1 year'));
+		}
+
+		// 上半年
+		if ($type == 'firstHalfYear') {
+			$start_time = date('Y-01-01 00:00:00');
+			$end_time = date('Y-06-30 23:59:59');
+		}
+
+		// 下半年
+		if ($type == 'nextHalfYear') {
+			$start_time = date('Y-07-01 00:00:00');
+			$end_time = date('Y-12-31 23:59:59');
+		}
+
+		// 本季度
+		if ($type == 'quarter') {
+			$season = ceil((date('n')) / 3);
+			$start_time = date('Y-m-d H:i:s', mktime(0, 0, 0, $season * 3 - 3 + 1, 1, date('Y')));
+			$end_time = date('Y-m-d H:i:s', mktime(23, 59, 59, $season * 3, date('t', mktime(0, 0, 0, $season * 3, 1, date("Y"))), date('Y')));
+		}
+
+		// 上一季度
+		if ($type == 'lastQuarter') {
+			$season = ceil((date('n')) / 3) - 1;
+			$start_time = date('Y-m-d H:i:s', mktime(0, 0, 0, $season * 3 - 3 + 1, 1, date('Y')));
+			$end_time = date('Y-m-d H:i:s', mktime(23, 59, 59, $season * 3, date('t', mktime(0, 0, 0, $season * 3, 1, date("Y"))), date('Y')));
+		}
+
+		// 下一季度
+		if ($type == 'nextQuarter') {
+			$season = ceil((date('n')) / 3);
+			$start_time = date('Y-m-d H:i:s', mktime(0, 0, 0, $season * 3 + 1, 1, date('Y')));
+			$end_time = date('Y-m-d H:i:s', mktime(23, 59, 59, $season * 3 + 3, date('t', mktime(0, 0, 0, $season * 3, 1, date("Y"))), date('Y')));
+		}
+
+		// 本月
+		if ($type == 'month') {
+			$start_time = date('Y-m-01 00:00:00');
+			$end_time = date('Y-m-31 23:59:59');
+		}
+
+		// 上月
+		if ($type == 'lastMonth') {
+			$start_time = date('Y-m-01 00:00:00', strtotime(date('Y-m-d') . '-1 month'));
+			$end_time = date('Y-m-31 23:59:59', strtotime(date('Y-m-d') . '-1 month'));
+		}
+
+		// 下月
+		if ($type == 'nextMonth') {
+			$start_time = date('Y-m-01 00:00:00', strtotime(date('Y-m-d') . '+1 month'));
+			$end_time = date('Y-m-31 23:59:59', strtotime(date('Y-m-d') . '+1 month'));
+		}
+
+		// 本周
+		if ($type == 'week') {
+			$start_time = date('Y-m-d 00:00:00', mktime(0, 0, 0, date('m'), date('d') - date('w') + 1, date('Y')));
+			$end_time = date('Y-m-d 23:59:59', mktime(23, 59, 59, date('m'), date('d') - date('w') + 7, date('Y')));
+		}
+
+		// 上周
+		if ($type == 'lastWeek') {
+			$date = date("Y-m-d");
+			$w = date("w", strtotime($date));
+			$d = $w ? $w - 1 : 6;
+			$start = date("Y-m-d", strtotime($date . " - " . $d . " days"));
+			$start_time = date('Y-m-d', strtotime($start . " - 7 days"));
+			$end_time = date('Y-m-d', strtotime($start . " - 1 days"));
+		}
+
+		// 下周
+		if ($type == 'nextWeek') {
+			$date = date("Y-m-d");
+			$w = date("w", strtotime($date));
+			$d = $w ? $w - 1 : 6;
+			$start = date("Y-m-d", strtotime($date . " - " . $d . " days"));
+			$start_time = date('Y-m-d', strtotime($start . " + 7 days"));
+			$end_time = date('Y-m-d', strtotime($start . " + 13 days"));
+		}
+
+		// 今天
+		if ($type == 'today') {
+			$start_time = date('Y-m-d 00:00:00');
+			$end_time = date('Y-m-d 23:59:59');
+		}
+
+		// 昨天
+		if ($type == 'yesterday') {
+			$start_time = date('Y-m-d 00:00:00', strtotime(date('Y-m-d') . '-1 day'));
+			$end_time = date('Y-m-d 23:59:59', strtotime(date('Y-m-d') . '-1 day'));
+		}
+
+		// 明天
+		if ($type == 'tomorrow') {
+			$start_time = date('Y-m-d 00:00:00', strtotime(date('Y-m-d') . '+1 day'));
+			$end_time = date('Y-m-d 23:59:59', strtotime(date('Y-m-d') . '+1 day'));
+		}
+
+		// 过去3天
+		if ($type == 'previous3day') {
+			$start_time = date('Y-m-d 00:00:00', strtotime(date('Y-m-d') . '-3 day'));
+			$end_time = date('Y-m-d 23:59:59', strtotime(date('Y-m-d') . '-1 day'));
+		}
+
+		// 过去5天
+		if ($type == 'previous5day') {
+			$start_time = date('Y-m-d 00:00:00', strtotime(date('Y-m-d') . '-5 day'));
+			$end_time = date('Y-m-d 23:59:59', strtotime(date('Y-m-d') . '-1 day'));
+		}
+
+		// 过去7天
+		if ($type == 'previous7day') {
+			$start_time = date('Y-m-d 00:00:00', strtotime(date('Y-m-d') . '-7 day'));
+			$end_time = date('Y-m-d 23:59:59', strtotime(date('Y-m-d') . '-1 day'));
+		}
+		// 过去10天
+		if ($type == 'previous10day') {
+			$start_time = date('Y-m-d 00:00:00', strtotime(date('Y-m-d') . '-10 day'));
+			$end_time = date('Y-m-d 23:59:59', strtotime(date('Y-m-d') . '-1 day'));
+		}
+		// 过去30天
+		if ($type == 'previous30day') {
+			$start_time = date('Y-m-d 00:00:00', strtotime(date('Y-m-d') . '-30 day'));
+			$end_time = date('Y-m-d 23:59:59', strtotime(date('Y-m-d') . '-1 day'));
+		}
+		// 未来3天
+		if ($type == 'future3day') {
+			$start_time = date('Y-m-d 00:00:00', strtotime(date('Y-m-d') . '+1 day'));
+			$end_time = date('Y-m-d 23:59:59', strtotime(date('Y-m-d') . '+3 day'));
+		}
+		// 未来5天
+		if ($type == 'future5day') {
+			$start_time = date('Y-m-d 00:00:00', strtotime(date('Y-m-d') . '+1 day'));
+			$end_time = date('Y-m-d 23:59:59', strtotime(date('Y-m-d') . '+5 day'));
+		}
+		// 未来7天
+		if ($type == 'future7day') {
+			$start_time = date('Y-m-d 00:00:00', strtotime(date('Y-m-d') . '+1 day'));
+			$end_time = date('Y-m-d 23:59:59', strtotime(date('Y-m-d') . '+7 day'));
+		}
+		// 未来10天
+		if ($type == 'future10day') {
+			$start_time = date('Y-m-d 00:00:00', strtotime(date('Y-m-d') . '+1 day'));
+			$end_time = date('Y-m-d 23:59:59', strtotime(date('Y-m-d') . '+10 day'));
+		}
+		// 未来30天
+		if ($type == 'future30day') {
+			$start_time = date('Y-m-d 00:00:00', strtotime(date('Y-m-d') . '+1 day'));
+			$end_time = date('Y-m-d 23:59:59', strtotime(date('Y-m-d') . '+30 day'));
+		}
+		return [$start_time,$end_time];
+	}
+
+	/**
+	 * 根据时间戳获取星期几
+	 * @param $time 要转换的时间戳
+	 */
+	function getTimeWeek($time, $i = 0)
+	{
+		$weekarray = array("日", "一", "二", "三", "四", "五", "六");
+		$oneD = 24 * 60 * 60;
+		return "星期" . $weekarray[date("w", $time + $oneD * $i)];
+	}
+}
diff --git a/extend/schedule/Schedule.php b/extend/schedule/Schedule.php
new file mode 100644
index 0000000000000000000000000000000000000000..4a18fd8777269f5beb09e678931206f2df49dfb5
--- /dev/null
+++ b/extend/schedule/Schedule.php
@@ -0,0 +1,102 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+namespace Schedule;
+
+class Schedule {
+  // Tests whether the given ISO8601 string has a time-of-day or not
+  const ALL_DAY_REGEX = '/^\d{4}-\d\d-\d\d$/'; // matches strings like "2013-12-29"
+
+  public $title;
+  public $allDay; // a boolean
+  public $start; // a DateTime
+  public $end; // a DateTime, or null
+  public $properties = array(); // an array of other misc properties
+
+  // Constructs an Event object from the given array of key=>values.
+  // You can optionally force the timeZone of the parsed dates.
+  public function __construct($array, $timeZone=null) {
+
+    $this->title = $array['title'];
+
+    if (isset($array['allDay'])) {
+      // allDay has been explicitly specified
+      $this->allDay = (bool)$array['allDay'];
+    }
+    else {
+      // Guess allDay based off of ISO8601 date strings
+      $this->allDay = preg_match(self::ALL_DAY_REGEX, $array['start']) &&
+        (!isset($array['end']) || preg_match(self::ALL_DAY_REGEX, $array['end']));
+    }
+
+    if ($this->allDay) {
+      // If dates are allDay, we want to parse them in UTC to avoid DST issues.
+      $timeZone = null;
+    }
+
+    // Parse dates
+    $this->start = parseDateTime($array['start'], $timeZone);
+    $this->end = isset($array['end']) ? parseDateTime($array['end'], $timeZone) : null;
+
+    // Record misc properties
+    foreach ($array as $name => $value) {
+      if (!in_array($name, array('title', 'allDay', 'start', 'end'))) {
+        $this->properties[$name] = $value;
+      }
+    }
+  }
+
+  // Returns whether the date range of our event intersects with the given all-day range.
+  // $rangeStart and $rangeEnd are assumed to be dates in UTC with 00:00:00 time.
+  public function isWithinDayRange($rangeStart, $rangeEnd) {
+
+    // Normalize our event's dates for comparison with the all-day range.
+    $eventStart = stripTime($this->start);
+
+    if (isset($this->end)) {
+      $eventEnd = stripTime($this->end); // normalize
+    }
+    else {
+      $eventEnd = $eventStart; // consider this a zero-duration event
+    }
+
+    // Check if the two whole-day ranges intersect.
+    return $eventStart < $rangeEnd && $eventEnd >= $rangeStart;
+  }
+
+  // Converts this Event object back to a plain data array, to be used for generating JSON
+  public function toArray() {
+
+    // Start with the misc properties (don't worry, PHP won't affect the original array)
+    $array = $this->properties;
+
+    $array['title'] = $this->title;
+
+    // Figure out the date format. This essentially encodes allDay into the date string.
+    if ($this->allDay) {
+      $format = 'Y-m-d'; // output like "2013-12-29"
+    }
+    else {
+		$format = 'Y-m-d H:i:s';
+		// $format = 'c'; // full ISO8601 output, like "2013-12-29T09:00:00+08:00"
+    }
+
+    // Serialize dates into strings
+    $array['start'] = $this->start->format($format);
+    if (isset($this->end)) {
+      $array['end'] = $this->end->format($format);
+    }
+    return $array;
+  }
+
+}
\ No newline at end of file
diff --git a/extend/systematic/Systematic.php b/extend/systematic/Systematic.php
new file mode 100644
index 0000000000000000000000000000000000000000..33138f4a1b61015a2648cecd757155a7e222e849
--- /dev/null
+++ b/extend/systematic/Systematic.php
@@ -0,0 +1,65 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 左手研发，右手开源，未来可期！]
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 勾股OA，开源且可免费使用，但并不是自由软件，未经授权许可不能去除勾股OA的相关版权信息
++-----------------------------------------------------------------------------------------------
+* @Author 勾股工作室 <hdm58@qq.com>
++-----------------------------------------------------------------------------------------------
+*/
+
+declare (strict_types = 1);
+namespace systematic;
+use think\facade\Config;
+use think\facade\Cache;
+use think\facade\Db;
+/**
+ * 系统类
+ */
+class Systematic
+{	
+    public function auth($uid)
+    {
+        if (!Cache::get('RulesSrc' . $uid) || !Cache::get('RulesSrc0')) {
+            //用户所在权限组及所拥有的权限
+            $groups = [];
+            $position_id = Db::name('Admin')->where('id', $uid)->value('position_id');
+            $groups = Db::name('PositionGroup')
+                ->alias('a')
+                ->join("AdminGroup g", "a.group_id=g.id", 'LEFT')
+                ->where([['a.pid', '=', $position_id], ['g.status', '=', 1]])
+                ->select()->toArray();
+            //保存用户所属用户组设置的所有权限规则id
+            $ids = [];
+            foreach ($groups as $g) {
+                $ids = array_merge($ids, explode(',', trim($g['rules'], ',')));
+            }
+            $ids = array_unique($ids);
+            //读取所有权限规则
+            $rules_all = Db::name('AdminRule')->field('src')->select()->toArray();
+            //读取用户组所有权限规则
+            $rules = Db::name('AdminRule')->where('id', 'in', $ids)->field('src')->select()->toArray();
+            //循环规则，判断结果。
+            $auth_list_all = [];
+            $auth_list = [];
+            foreach ($rules_all as $rule_all) {
+                $auth_list_all[] = strtolower($rule_all['src']);
+            }
+            foreach ($rules as $rule) {
+                $auth_list[] = strtolower($rule['src']);
+            }
+            //规则列表结果保存到Cache
+            Cache::tag('adminRules')->set('RulesSrc0', $auth_list_all, 36000);
+            Cache::tag('adminRules')->set('RulesSrc' . $uid, $auth_list, 36000);
+        }
+    }
+	
+	//读取文件配置
+	public function getConfig($key)
+	{
+		return Config::get($key);
+	}
+}
diff --git a/public/.htaccess b/public/.htaccess
new file mode 100644
index 0000000000000000000000000000000000000000..0519ecba6ea913e21689ec692e81e9e4973fbf73
--- /dev/null
+++ b/public/.htaccess
@@ -0,0 +1 @@
+ 
\ No newline at end of file
diff --git a/public/404.html b/public/404.html
new file mode 100644
index 0000000000000000000000000000000000000000..5964fc3f9c71f36ab5af96f19431c968ed406bba
--- /dev/null
+++ b/public/404.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+	<meta name="renderer" content="webkit" />
+	<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
+	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+	<title>页面不存在</title>	
+	<style type="text/css">
+		html,body {width: 100%;height: 100%;background: #f7f7f7;margin: 0;padding: 0;border: 0;}
+		div,p {margin: 0;padding: 0;border: 0;}
+		.container {width: 100%;height: 100%;position: fixed;top: 0;left: 0;z-index: 999;overflow: hidden;}
+		.info {width: 360px;height: 360px;position: absolute;top: 50%;left: 50%;margin-top: -200px;margin-left: -180px;text-align:center;}
+		.info-status{width: 360px; display:none;justify-content: space-between;align-items: center;flex-wrap: nowrap;}
+		.info-status div{width:180px; height:180px; line-height:180px; font-size:160px; font-weight:200; color:#F35F37}
+		.info-status div.face{font-size:60px; border:9px solid #F35F37; width:120px; height:120px; line-height:118px; background-color:#fff; border-radius:50%;}
+		.info-tips{font-size:20px;color:#F35F37; padding-top:32px; font-weight:600; line-height:1.8}
+		.footer {position: absolute;font-size: 12px;bottom: 28px;text-align: center;width: 100%;color: #969696;}
+		.info-status.code-404{display: -webkit-flex;display: flex;flex-direction: row;}
+	</style>
+</head>
+
+<body>
+	<div class="container">
+		<div class="info">
+			<div class="info-status code-404" title="找不到页面"><div>4</div><div class="face">😔</div><div>4</div></div>
+			<div class="info-tips">哎呀！找不到页面<br>请检查URL，或者系统伪静态配置</div>
+		</div>
+		<div class="footer">
+			Copyright © 2022-2024 勾股OA ，Powered by GouguOPEN
+		</div>
+	</div>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/public/backup/.gitignore b/public/backup/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..c96a04f008ee21e260b28f7701595ed59e2839e3
--- /dev/null
+++ b/public/backup/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
\ No newline at end of file
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..e73c72ac8875791f0a6b227aaadfb9a5b063e817
Binary files /dev/null and b/public/favicon.ico differ
diff --git a/public/index.php b/public/index.php
new file mode 100644
index 0000000000000000000000000000000000000000..3ace0ce65368b623462c9bc97921422dd9c4461c
--- /dev/null
+++ b/public/index.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * @copyright Copyright (c) 2021 勾股工作室
+ * @license https://opensource.org/licenses/GPL-3.0
+ * @link https://www.gougucms.com
+ */
+ 
+// [ 应用入口文件 ]
+namespace think;
+
+if (empty(file_exists(__DIR__ . '/../vendor/autoload.php'))) {
+    echo '您还未获取PHP依赖包，请输入命令获取：composer install，安装教程点击<a href="https://blog.gougucms.com/home/book/detail/bid/3/id/8.html" target="_blank">这里</a>。';
+    exit;
+}
+require __DIR__ . '/../vendor/autoload.php';
+
+// 定义当前版本号
+define('CMS_VERSION','5.6.8');
+
+// 定义手机端当前版本号
+define('MB_VERSION','1.0');
+
+// 定义Layui版本号
+define('LAYUI_VERSION','2.9.21');
+
+// 定义项目目录
+define('CMS_ROOT', __DIR__ . '/../');
+
+// 定义报错模版
+define('EEEOR_REPORTING',CMS_ROOT.'/public/tpl/error.html');
+
+// 执行HTTP应用并响应
+$http = (new App())->http;
+
+$response = $http->run();
+
+$response->send();
+
+$http->end($response);
diff --git a/public/office.php b/public/office.php
new file mode 100644
index 0000000000000000000000000000000000000000..48f9d186dbcabc37a85215cd56925f034f757814
--- /dev/null
+++ b/public/office.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * @copyright Copyright (c) 2021 勾股工作室
+ * @license https://opensource.org/licenses/GPL-3.0
+ * @link https://www.gougucms.com
+ */
+ 
+// [ 应用入口文件 ]
+namespace think;
+use think\facade\Db;
+require __DIR__ . '/../vendor/autoload.php';
+// 定义项目目录
+define('CMS_ROOT', __DIR__ . '/../');
+// 执行HTTP应用并响应
+$http = (new App())->http;
+$response = $http->run();
+if (($body_stream = file_get_contents("php://input"))===FALSE){
+	echo "Bad Request";
+}
+//echo dirname(CMS_ROOT)."/storage/202312/i4b1z_e724c0b9ea54214fc0eaa13192f92b93.docx";
+//exit;
+$data = json_decode($body_stream, TRUE);
+if ($data["status"] == 2){
+	$downloadUri = $data["url"];
+	$key = $data["key"];
+	//$key = substr($key,10,strlen($key) - 1);
+	//$file_path = str_replace("T", "/", $key);
+	$id = explode('T', $key)[1];
+	$file_path = Db::name('File')->where('id',$id)->value('filepath');
+	$path_for_save =  dirname(CMS_ROOT).$file_path;
+	if (($new_data = file_get_contents($downloadUri))===FALSE){
+		echo "Bad Response";
+	} else {
+		Db::name('File')->where('id',$id)->inc('audit_time')->update();
+		file_put_contents($path_for_save, $new_data, LOCK_EX);
+	}
+}
+echo "{\"error\":0}";
+exit;
diff --git a/public/robots.txt b/public/robots.txt
new file mode 100644
index 0000000000000000000000000000000000000000..eb0536286f3081c6c0646817037faf5446e3547d
--- /dev/null
+++ b/public/robots.txt
@@ -0,0 +1,2 @@
+User-agent: *
+Disallow:
diff --git a/public/router.php b/public/router.php
new file mode 100644
index 0000000000000000000000000000000000000000..9b39a62c9771c00bd676713be4bb48f3a5cdc443
--- /dev/null
+++ b/public/router.php
@@ -0,0 +1,19 @@
+<?php
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st <liu21st@gmail.com>
+// +----------------------------------------------------------------------
+// $Id$
+
+if (is_file($_SERVER["DOCUMENT_ROOT"] . $_SERVER["SCRIPT_NAME"])) {
+    return false;
+} else {
+    $_SERVER["SCRIPT_FILENAME"] = __DIR__ . '/index.php';
+
+    require __DIR__ . "/index.php";
+}
diff --git a/public/static/assets/gougu/css/gougu.css b/public/static/assets/gougu/css/gougu.css
new file mode 100644
index 0000000000000000000000000000000000000000..ef5c45d6a20b0c3d46bb72b558f71d3b761ee36c
--- /dev/null
+++ b/public/static/assets/gougu/css/gougu.css
@@ -0,0 +1,463 @@
+@import url("../../layui/css/layui.css");
+@import url("../../icon/iconfont.css");
+/*reset layui*/
+.layui-card{margin-bottom:16px; box-shadow: 0 1px 3px 0 rgb(5 32 96 / 10%);}
+.layui-card-header {position: relative; padding:0 12px;}
+.layui-card-header .layui-icon,.layui-card-header .pull-right{line-height: initial; position: absolute;right: 12px;top: 50%; margin-top: -9px}
+.layui-card-title {font-size: 18px;font-weight: 600;padding: 12px;}
+.layui-table td, .layui-table th{padding:8px;}
+.gougu-picker .layui-layer-btn1{background-color:#f5f5f5}
+.gougu-picker .layui-layer-btn2{background-color:#EAFAFF}
+.picker-table{padding:8px 8px 0;}
+.picker-table .layui-table-cell {padding:4px; height: 32px;line-height: 24px;}
+.layui-table-cell{padding:6px;}
+.layui-table-box{background-color:#fff;}
+.layui-table-page{background-color:#fff;border-bottom:1px solid #eeeeee;}
+.layui-table-tool{box-shadow: 0 0 0 rgb(0 0 0 / 1%);padding:10px 12px; background-color:#fff;}
+.layui-input, .layui-select, .layui-textarea {height: 36px;line-height: 1.22;line-height: 36px\9;}
+.layui-input, .layui-textarea {padding-left:6px;}
+.layui-input-readonly {border-style: dashed; background-color:#fafafa;}
+.layui-form-pane .layui-form-label{height: 36px; padding:8px;}
+.layui-form-pane .layui-label-inline{height: 24px; padding:8px; float:left;}
+
+.layui-btn {height: 36px;line-height: 36px; padding:0 16px;}
+.layui-btn-sm {height: 30px; line-height: 30px; padding:0 8px;}
+.layui-btn-xs {height: 22px; line-height: 22px; padding:0 4px;}
+.layui-btn-reset {height: 36px;background-color: #fff; line-height: 36px; border: 1px solid transparent;padding: 0 8px; white-space: nowrap; color: #767a82;font-size: 14px;cursor: pointer;vertical-align: middle;}
+.layui-btn-reset:hover{color: #323232;}
+
+.layui-tab-brief>.layui-tab-title .layui-this{color:#1A75FF}
+.layui-tab-brief>.layui-tab-more li.layui-this:after, .layui-tab-brief>.layui-tab-title .layui-this:after{border-color:#1A75FF;z-index:1}
+.layui-form-radio{padding-right:4px;}
+.layui-form-radio>i{margin-right:4px;}
+.layui-form-label{padding:9px; color:#909399}
+.layui-form-label font{color:#FF6347; margin-right: 2px;}
+.layui-input-block{margin-left:100px;}
+.layui-form-2 .layui-form-label{width:112px;}
+.layui-form-2 .layui-input-block{margin-left:130px;}
+
+.layui-table-view{margin:0;}
+.layui-table-view .layui-table th{background-color:#f8f8f8;}
+.layui-table-form{margin:0;}
+.layui-table-form tbody tr:hover{background-color: #fff;}
+.layui-td-gray,.layui-td-gray-2,.layui-td-gray-3,.layui-td-gray-4{color:#909399; width:68px; text-align:right; background-color:#fafafa;}
+.layui-td-gray-2{width:96px;}
+.layui-td-gray-3{width:126px;}
+.layui-td-gray-4{width:152px;}
+.layui-td-gray font,.layui-td-gray-2 font,.layui-td-gray-3 font,.layui-td-gray-4 font{color:#FF6347; margin-left: 2px;}
+.layui-table-min th{font-size:13px; text-align:center; background-color:#f8f8f8;}
+.layui-table-min td{font-size:13px; padding:6px;text-align:center;}
+
+.layui-tree-entry{line-height:24px}
+.layui-tree-set{padding:2px 0}
+.layui-tree-main.on .layui-tree-txt,.layui-tree-main.on .layui-icon{color:#1A75FF;}
+.layui-icon layui-icon-file{font-size:16px;}
+.layui-tree-icon {height: 16px;line-height: 14px; width: 16px; text-align: center;}
+.layui-tree-icon .layui-icon{color:#969696}
+.layui-tree-line .layui-tree-set .layui-tree-set:after{top:18px;}
+.layui-tree-line .layui-tree-entry:hover .layui-tree-txt{text-decoration:none; color:#186AF2;}
+.layui-tree-iconClick .layui-icon.layui-icon-file:before { content: "\e857";}
+.layui-select-tags{padding:10px 0;}
+.layui-tags-span{padding:3px 6px 4px; font-size:14px; border-radius:3px; margin-bottom:6px; margin-right:6px; border:1px solid #e6e6e6; display:inline-block;cursor:pointer;}
+.layui-tags-span:hover{border:1px solid #ddd; background-color:#f5f5f5;}
+.layui-tags-span.on{border:1px solid #eee; color:#bbb; background-color:#ffffff;cursor:not-allowed}
+.layui-readonly{background-color: #f5f5f5; color:#999;}
+.layui-tags-span i{margin-left:5px; font-size:14px;}
+.layui-tags-span i:hover{border-radius:2px;background-color:#FF6347;color:#fff}
+.layui-letter-span{padding:10px 5px; font-size:16px; display:inline-block; cursor:pointer;}
+.layui-letter-span.on{color:#FF6347;}
+.layui-letter-span:hover{color:#1e9fff;}
+.layui-tags-all{float: right; font-weight: 200; background-color:#1e9fff; color:#fff; border-radius: 3px; padding: 2px 6px; cursor: pointer; display: none;}
+
+.layui-data-none{padding:12px 0; color:#969696; text-align:center; font-size:12px;}
+.gougu-data-none{background:url(../images/data-none.png) no-repeat center center; background-size:auto 80%;}
+
+.click-edit{position: relative; padding-right:24px; box-sizing:border-box; cursor:pointer;}
+.click-edit::after{content: ""; width: 36px; height: 36px; display: block; position: absolute; right:0; top: 0; background:url(../images/click-edit.png) no-repeat center; background-size:24px auto; opacity: 0; transition: opacity ease-in-out .2s;}
+.click-edit:hover::after {opacity: 1;}
+
+html {background-color: #F9F9F9;}
+html,body{height:100%;scrollbar-width: thin; color:#323232}
+.p-page{padding:15px 12px 0;box-sizing: border-box; width:100%; position:relative;}
+.copyright{padding:10px 0; text-align:center; font-size:12px; color: #989898; text-shadow: 2px 2px 0px #fff}
+.copyright a{margin-left:12px; color: #989898;text-shadow: 2px 2px 0px #fff}
+.bg-white{background-color:#fff;}
+a.tab-a,a.open-a,a.link-a,a.right-a,a.side-a{color:#1A75FF; cursor:pointer;}
+a.tab-a:hover,a:hover,a.open-a:hover,a.link-a:hover,a.right-a:hover{color:#1A75FF; opacity:0.8}
+.layui-btn.side-a{color:#fff;}
+.left{float:left;}
+.right{float:right;}
+.h1,h1{font-size:24px; font-weight: 600;}
+.h2,h2{font-size:20px; font-weight: 600;}
+.h3,h3{font-size:18px; font-weight: 600;}
+.h4,h4{font-size:16px; font-weight: 600;}
+
+.f12{font-size:12px;}
+.f14{font-size:14px;}
+.f16{font-size:16px;}
+.f18{font-size:18px;}
+.f20{font-size:20px;}
+.f24{font-size:24px;}
+.f28{font-size:28px;}
+.f32{font-size:32px;}
+.f36{font-size:36px;}
+
+.m-0{margin:0}
+.m-1{margin:4px}
+.m-2{margin:8px}
+.m-3{margin:12px}
+.m-4{margin:16px}
+.m-5{margin:20px}
+.my-1{margin-top:4px;margin-bottom:4px}
+.my-2{margin-top:8px;margin-bottom:8px}
+.my-3{margin-top:12px;margin-bottom:12px}
+.my-4{margin-top:16px;margin-bottom:16px}
+.my-5{margin-top:20px;margin-bottom:20px}
+.mx-1{margin-left:4px;margin-right:4px}
+.mx-2{margin-left:8px;margin-right:8px}
+.mx-3{margin-left:12px;margin-right:12px}
+.mx-4{margin-left:16px;margin-right:16px}
+.mx-5{margin-left:20px;margin-right:20px}
+.ml-1{margin-left:4px}
+.ml-2{margin-left:8px}
+.ml-3{margin-left:12px}
+.ml-4{margin-left:16px}
+.ml-5{margin-left:20px}
+.mt-1{margin-top:4px}
+.mt-2{margin-top:8px}
+.mt-3{margin-top:12px}
+.mt-4{margin-top:16px}
+.mt-5{margin-top:20px}
+.mr-1{margin-right:4px}
+.mr-2{margin-right:8px}
+.mr-3{margin-right:12px}
+.mr-4{margin-right:16px}
+.mr-5{margin-right:20px}
+.mb-1{margin-bottom:4px}
+.mb-2{margin-bottom:8px}
+.mb-3{margin-bottom:12px}
+.mb-4{margin-bottom:16px}
+.mb-5{margin-bottom:20px}
+
+.p-0{padding:0}
+.p-1{padding:4px}
+.p-2{padding:8px}
+.p-3{padding:12px}
+.p-4{padding:16px}
+.p-5{padding:20px}
+.py-1{padding-top:4px;padding-bottom:4px}
+.py-2{padding-top:8px;padding-bottom:8px}
+.py-3{padding-top:12px;padding-bottom:12px}
+.py-4{padding-top:16px;padding-bottom:16px}
+.py-5{padding-top:20px;padding-bottom:20px}
+.px-1{padding-left:4px;padding-right:4px}
+.px-2{padding-left:8px;padding-right:8px}
+.px-3{padding-left:12px;padding-right:12px}
+.px-4{padding-left:16px;padding-right:16px}
+.px-5{padding-left:20px;padding-right:20px}
+.pl-1{padding-left:4px}
+.pl-2{padding-left:8px}
+.pl-3{padding-left:12px}
+.pl-4{padding-left:16px}
+.pt-1{padding-top:4px}
+.pt-2{padding-top:8px}
+.pt-3{padding-top:12px}
+.pt-4{padding-top:16px}
+.pt-5{padding-top:20px}
+.pr-1{padding-right:4px}
+.pr-2{padding-right:8px}
+.pr-3{padding-right:12px}
+.pr-4{padding-right:16px}
+.pr-5{padding-right:20px}
+.pb-1{padding-bottom:4px}
+.pb-2{padding-bottom:8px}
+.pb-3{padding-bottom:12px}
+.pb-4{padding-bottom:16px}
+.pb-5{padding-bottom:20px}
+
+.border{border:1px solid #eee; box-sizing:border-box}
+.border-y{border-top:1px solid #eee;border-bottom:1px solid #eee; box-sizing:border-box}
+.border-x{border-left:1px solid #eee;border-right:1px solid #eee; box-sizing:border-box}
+.border-t{border-top:1px solid #eee; box-sizing:border-box}
+.border-b{border-bottom:1px solid #eee; box-sizing:border-box}
+.border-l{border-left:1px solid #eee; box-sizing:border-box}
+.border-r{border-right:1px solid #eee; box-sizing:border-box}
+
+.layui-bg-0{background-color:#648A8D !important;}/*灰青*/
+.layui-bg-1,.layui-bg-green{background-color:#16b777 !important;}/*亮绿*/
+.layui-bg-2{background-color:#1A75FF !important;}/*亮蓝*/
+.layui-bg-3{background-color:#FEC939 !important;}/*亮黄*/
+.layui-bg-4{background-color:#FD6206 !important;}/*亮橙*/
+.layui-bg-5{background-color:#FF5823 !important;}/*亮红*/
+.layui-bg-6{background-color:#4AC8BE !important;}/*亮青*/
+.layui-bg-7{background-color:#7860C0 !important;}/*亮紫*/
+.layui-bg-8{background-color:#646464 !important;}/*黑*/
+.layui-bg-9{background-color:#969696 !important;}/*灰黑*/
+
+.layui-color-0{color:#648A8D !important;}/*灰青*/
+.layui-color-1{color:#16b777 !important;}/*亮绿*/
+.layui-color-2{color:#1A75FF !important;}/*亮蓝*/
+.layui-color-3{color:#FEC939 !important;}/*亮黄*/
+.layui-color-4{color:#FD6206 !important;}/*亮橙*/
+.layui-color-5{color:#FF5823 !important;}/*亮红*/
+.layui-color-6{color:#4AC8BE !important;}/*亮青*/
+.layui-color-7{color:#7860C0 !important;}/*亮紫*/
+.layui-color-8{color:#646464 !important;}/*黑*/
+.layui-color-9{color:#969696 !important;}/*灰黑*/
+
+.check-status-color-0{color:#a233c6 !important;}/*待提交审核,亮紫*/
+.check-status-color-1{color:#1A75FF !important;}/*审核中,亮蓝*/
+.check-status-color-2{color:#16b777 !important;}/*审核通过,亮绿*/
+.check-status-color-3{color:#FF5823 !important;}/*审核不通过,亮红*/
+.check-status-color-4{color:#969696 !important;}/*撤销审核,灰黑*/
+.check-status-color-5{color:#a233c6 !important;}/*反确认审核,亮紫*/
+
+.black{color:#182b50}
+
+.blue{color:#1A75FF}
+.blue-dark{color:#3c9cff;}
+.blue-disabled{color:#9acafc;}
+.blue-light{color:#ecf5ff;}
+
+.yellow{color:#f9ae3d;}
+.yellow-dark{color:#f1a532;}
+.yellow-disabled{color:#f9d39b;}
+.yellow-light{color:#fdf6ec;}
+
+.green{color:#16b777;}
+.green-dark{color:#53c21d;}
+.green-disabled{color:#a9e08f;}
+.green-light{color:#f5fff0;}
+
+.red{color:#f56c6c;}
+.red-dark{color:#e45656;}
+.red-disabled{color:#f7b2b2;}
+.red-light{color:#fef0f0;}
+
+.gray{color:#969696;}
+.gray-dark{color:#767676;}
+.gray-disabled{color:#c6c6c6;}
+.gray-light{color:#f1f1f1;}
+
+/* 滚动条 */
+::-webkit-scrollbar {
+	width: 8px;
+}
+::-webkit-scrollbar-thumb {
+	background-color:rgba(0,0,0,.15);background-clip:content-box;border:1px solid transparent;border-radius:8px
+}
+
+::-webkit-scrollbar-track{background-color:transparent}
+::-webkit-scrollbar-track:hover{background-color:rgba(0,0,0,.04)}
+::-webkit-scrollbar-thumb:hover{background-color:rgba(0,0,0,.4);border:1px solid transparent}
+::-webkit-scrollbar-thumb:active{background-color:rgba(0,0,0,.65)}
+
+::-moz-scrollbar {
+	width: 8px;
+	background-color: transparent;
+}
+::-moz-scrollbar-thumb {
+	background-color: #c1c1c1;
+	border-radius: 8px;
+}
+body.right-open{overflow-y:clip;overflow:hidden;}
+div.layui-table-main::-webkit-scrollbar{width:12px;height:12px}
+div.layui-table-main::-webkit-scrollbar-thumb{min-width:12px;min-height:12px;background-color:rgba(0,0,0,.15);background-clip:content-box;border:2px solid transparent;border-radius:12px}
+div.layui-table-main::-webkit-scrollbar-track{background-color:transparent}
+div.layui-table-main::-webkit-scrollbar-track:hover{background-color:rgba(0,0,0,.04)}
+div.layui-table-main::-webkit-scrollbar-thumb:hover{background-color:rgba(0,0,0,.4);border:2px solid transparent}
+div.layui-table-main::-webkit-scrollbar-thumb:active{background-color:rgba(0,0,0,.65)}
+/*placeholder*/
+::-webkit-input-placeholder { /* WebKit, Blink, Edge */
+   color: #aaa;
+}
+:-moz-placeholder { /* Mozilla Firefox 4 to 18 */
+   color:#aaa;
+}
+::-moz-placeholder { /* Mozilla Firefox 19+ */
+   color:#aaa;
+}
+ :-ms-input-placeholder { /* Internet Explorer 10-11 */
+    color:#aaa;
+ }
+ /*text ellipsis*/
+.text-overflow1{ overflow: hidden; text-overflow: ellipsis; word-break: break-all; display: -webkit-box !important;
+	-webkit-box-orient: vertical;
+	-webkit-line-clamp: 1;
+}
+.text-overflow2{ overflow: hidden; text-overflow: ellipsis; word-break: break-all; display: -webkit-box !important;
+	-webkit-box-orient: vertical;
+	-webkit-line-clamp: 2;
+}
+.text-overflow3{ overflow: hidden; text-overflow: ellipsis; word-break: break-all; display: -webkit-box !important;
+	-webkit-box-orient: vertical;
+	-webkit-line-clamp: 3;
+}
+
+/*gg-DIY*/
+.gg-form-bar{padding:12px 12px 0; background-color:#fff;}
+.gg-form-bar .layui-input-inline{margin-bottom:10px;}
+.gg-tab-bar{background-color:#fff;}
+.gg-tab{text-align: left!important;}
+.gg-tab-title{position: relative;left: 0; height: 40px; white-space: nowrap; font-size: 0;}
+.gg-tab-title li{display: inline-block;*display: inline;*zoom: 1;vertical-align: middle; font-size: 16px; position: relative;line-height: 40px; min-width: 64px; padding: 0 12px;text-align: center;cursor: pointer;}
+.gg-tab-title li:hover,.gougu-tab li.tab-this{ color:#1A75FF;}
+.gg-tab-title li.tab-this:after{border-bottom: 2px solid #1A75FF;position: absolute;left: 0; top: 0;  content: ""; width: 100%; height: 41px; box-sizing: border-box;pointer-events: none;}
+.gg-tab-title.big{height: 46px;}
+.gg-tab-title.big li{line-height: 46px;}
+.gg-tab-title.big li{line-height: 46px;}
+.gg-tab-title.big li.tab-this:after{height: 47px;}
+.gg-img-center{display: table-cell;vertical-align: middle;}
+.gg-img-center img{max-width: 100%; max-height: 100%; display: block; margin: auto;}
+.gg-img-radius img{border-radius:4px;max-width: 100%; max-height: 100%;}
+.gg-img-round img{border-radius:50%;max-width: 100%; max-height: 100%;}
+.gg-img-cover { width: 100%; position: relative; padding-top: 0; border-radius: 3px; overflow: hidden; background-color: #f0f0f0;}
+.gg-img-cover img { width: 100%;height: 100%; object-fit: cover; position: absolute; top: 0; left: 0; border-radius: 2px; max-width: 100%;}
+.gg-img-cover.cover-2-1 { padding-top: 50%;}
+.gg-img-cover.cover-4-3 { padding-top: 75%;}
+.gg-img-cover.cover-16-9 { padding-top: 56.25%;}
+
+.sub-menu { overflow: hidden; position: absolute; height: 100%;top: 0;left: 0;}
+.sub-menu ul{padding:0; line-height:2.7}
+.sub-menu li.sub-menu-title{margin-top:10px;}
+.sub-menu li.sub-menu-title i{font-size:18px; font-weight:800}
+.sub-menu li.sub-menu-title span{padding-left:8px; font-size:15px;}
+.sub-menu li.sub-menu-title cite{font-size:12px; margin-left:4px; color:#999}
+.sub-menu li.sub-menu-title.active a{color:#4285F4;}
+.sub-menu li.sub-menu-li a{padding-left:12px; font-size:14px; display:inline-block; width:100%; box-sizing:border-box;}
+.sub-menu li.sub-menu-li a .iconfont{margin-right:8px; font-weight:600}
+.sub-menu li.sub-menu-li.active a{color:#4285F4; background-color:#F2F8FF}
+.sub-menu li.sub-menu-li span.num{margin-left:4px}
+/*审批*/
+.check-items{overflow-x: auto; padding: 2px 0;}
+.flow-flex-row {box-direction: row;
+	box-orient: horizontal;
+    -webkit-box-orient: horizontal;
+    -ms-flex-direction: row;
+    flex-direction: row;
+}
+.flow-flexbox { width: 100%;text-align: left;
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    display: -webkit-flex;
+    box-align: center;
+    -webkit-box-align: center;
+    -ms-flex-align: center;
+    align-items: center;
+	flex-wrap: wrap;
+}
+.check-item{width: auto; -ms-flex-negative: 0; flex-shrink: 0; padding:4px 0}
+.check-item i{margin-right:3px; color:#646464;}
+.check-item span{color:#999;margin:0 3px;}
+.check-item .layui-icon {font-size:18px;}
+.check-item .layui-icon.layui-icon-right{font-size:12px;}
+.layui-icon[data-ok]{color:#34a853}
+.layui-icon[data-no]{color:#FF5722;}
+.check-item-status{color:#999; font-size:12px; margin-left:3px;}
+
+.flow-tips{padding:6px 10px;}
+.flow-tips li{padding:5px 0;}
+.flow-tips li i{color:#4285f4;}
+.flow-tips li span{color:#999; font-size:12px; margin-left:4px;}
+
+.flow-record{padding:4px 4px 0;}
+.flow-record .layui-timeline-item{text-decoration:line-through; color:#acacac; padding-bottom:10px;}
+.flow-record .layui-timeline-item.delete-0{text-decoration:none; color:#323232;}
+.layui-timeline-content ul{font-size:12px;}
+.check-status{color:#999; margin-left:5px;}
+.check-remark{padding:6px; margin-top:6px; margin-bottom:10px; border-radius:4px; background-color:#f5f5f5;}
+.check-record{line-height:1.5; padding:4px 0}
+.flow-this{font-weight:800;color:#4285f4}
+.flow-this .check-item-status{color:#4285f4}
+.flow-this i{color:#4285f4}
+
+
+.editormd,.editormd-toolbar,.editormd .CodeMirror,.CodeMirror-gutters{border-color:#eeeeee!important;}
+.editormd{margin-bottom:0!important;}
+.CodeMirror-gutters{background-color:#fafafa!important;}
+
+.layui-layer-gougu-admin {box-shadow: 1px 1px 10px rgba(0,0,0,.1); border-radius: 0!important;overflow:initial!important;}
+.express-box { position: fixed; z-index:9999; height:100%; right: -100%; top:0;background-color: #fff;}
+.express-box article{width:100%; height:100%; overflow:auto;}
+.express-mask{ display: none; position: fixed; top: 0; left: 0; z-index: 9998; width: 100%; height: 100%; background-color: rgba(0,0,0,.6); }
+
+
+.express-close{width: 40px; height:200px;position: absolute; left:-39px; right: 0; top: 12%; cursor: pointer;}
+.express-close.parent-colse{opacity:0;}
+.express-container{position:relative; width:40px;}
+.express-bar{left:-92px;top: 80px; width: 220px; height: 44px; position: absolute;
+	transform:rotate(-90deg);
+    clip-path: url(#menu);
+    will-change: transform;
+    background-color: #F9F9F9;
+}
+.express-close .express-btn{top:85px; width:20px; height:20px; padding:6px; position: absolute; border-radius: 50%; left:8px;background-color: #FF5722;transition: transform 0.3s ease-in-out; transform:rotate(0deg);}
+.express-close .express-btn .express-icon{width:20px; height:20px;}
+.express-close:hover .express-btn{transform:rotate(-90deg);}
+
+
+/*uploadPlus*/
+.gougu-upload-files{background-color: #ffffff; border:1px solid #e4e7ed;color: #c0c4cc; min-width:240px; cursor: not-allowed; padding:0 12px; box-sizing: border-box; display: inline-block; font-size: inherit; height: 38px; line-height: 35px; margin-right:8px; border-radius:2px;}
+.gougu-upload-box{background-color:#f8f8f8; border:1px solid #eee; border-radius:6px; width:888px; height:440px; padding:5px; overflow-y:auto; margin:0 auto; position:relative;-webkit-user-select:none;-moz-user-select:none-ms-user-select:none;}
+.select .gougu-upload-btn{width:100%; height:100%; position:absolute;top:0;left:0; line-height:440px;}
+.select .gougu-upload-btn-box{width:100%; height:100%; box-sizing: border-box; padding-top:160px; line-height:1.2;text-align:center; cursor:pointer; color:#49bc85;font-size:22px;}\
+.select .gougu-upload-btn-box i{font-size:60px;}
+.selected .gougu-upload-btn{width:100px; height:100px; float:left; padding:5px;}
+.selected .gougu-upload-btn-box{width:100px; height:100px; box-sizing: border-box; background-color:#eaf7f0; border:1px solid #49bc85; padding-top:16px; line-height:1.2;font-size:14px; text-align:center; cursor:pointer; color:#49bc85}
+.selected .gougu-upload-btn-box i{font-size:36px;}
+.gougu-upload-card{width:100px; height:100px; float:left; padding:5px;}
+.gougu-upload-card-box{width:100px; height:100px; box-sizing: border-box; background-color:#fff; border:1px solid #eee;position: relative;overflow: hidden;}
+.gougu-upload-card-box img {width: 100px; height: 100px; object-fit: cover;}
+.gougu-upload-card-text{background-color:rgba(0,0,0,.618); color:#fff; position:absolute;left:0; bottom:0; line-height:1.6; font-size:12px; width:100px; text-overflow:hidden; white-space: nowrap; text-overflow: ellipsis;}
+.gougu-upload-card-reload{width:50px; height:32px; position:absolute; top:5px; left:3px; font-size:12px;display:none;}
+.gougu-upload-card-del{width:32px; height:32px; position:absolute; top:5px; right:0; display:none;}
+.gougu-upload-card:hover .gougu-upload-card-del{display:block;}
+.uploadok.gougu-upload-card .gougu-upload-card-del{display:none;}
+.reload.gougu-upload-card .gougu-upload-card-reload{display:block;}\
+.gougu-upload-card-bar{width:100%; position:absolute;left:0; bottom:16px;}
+.gougu-upload-tips{color:#969696; font-size:12px; margin-right:24px;}
+.gougu-import-tips{color:#969696; font-size:14px; padding-right:20px;line-height:1.8;}
+.layui-import .layui-form-item{margin-bottom:8px;}
+.layui-import .layui-input-block{min-height:24px;}
+/*附件*/
+.file-card {background: #fff;border: 1px solid #f1f1f1; border-radius: 2px; padding:0; margin:4px 6px;
+    -webkit-box-align: center;
+    -ms-flex-align: center;
+    align-items: center;
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+}
+.file-card .file-icon{font-size:44px; color:#646464; margin-right: 4px;}
+.file-card .file-info {width: calc(100% - 88px); line-height:1.5}
+.file-card .file-title {font-size: 14px; word-break:keep-all; overflow: hidden; text-overflow: ellipsis; display: width: 100%;}
+.file-card .file-ops{font-size:12px; color:#aaa;}
+.file-card .file-tool .iconfont{font-size:30px; font-weight:400; padding:3px; display:inline-block; cursor:pointer;}
+.file-hasdelete{background:url(../images/delete_icon.png) no-repeat 99% 0; background-size: auto 58px; color:#aaa}
+.file-hasdelete .file-icon{color:#aaa;}
+.file-hasdelete .file-tool{display:none}
+.layui-dropdown.file-menu{min-width:64px;}
+.layui-menu{margin:0}
+/*编辑日志*/
+.log-timeline{position: relative; min-height:120px; padding-left: 48px; background-color:#fff;}
+.log-timeline:after {content: ""; position: absolute; top: 0; left: 24px; width: 1px; height: 100%; background: #e3e9ed;}
+.log-timeline dl{padding-bottom: 8px; position: relative;}
+.log-timeline dt{font-size: 16px; line-height: 2.4; color: #323232; font-weight:600}
+.log-timeline dd{font-size: 14px; line-height: 1.6; padding:5px 0}
+.log-timeline .date-second-point{width: 10px; height: 10px; display: block; border-radius: 50%; border: 3px solid #FBBC05; background: #fff; position: absolute; z-index: 99; left:-32px; top:9px}
+.log-timeline .log-thumb{width: 24px; height: 24px; border-radius: 50%; margin-right:4px;}
+.log-timeline .open-a{margin:0 4px;}
+.log-item i{font-weight:800; color:#323232}
+.log-content strong{margin:0 4px; color:#323232}
+.layui-timeline-item{color:#c9c9c9; padding-bottom:8px}
+.layui-timeline-item.delete_0{color:#646464;}
+/*评论*/
+.comment-input .comment-image{width:40px; height:40px; border-radius:50%}
+.comment-item .comment-avatar{width:50px; float:left}
+.comment-item .comment-image{width:36px; height:36px; border-radius:50%}
+.comment-item .comment-body{margin-left:50px;}
+.comment-item .comment-content blockquote{border-left:3px solid #f1f1f1; padding:4px 8px;}
+.comment-item .comment-actions a{color:#8c95a8; cursor:pointer; font-size:12px;}
+.comment-item .comment-actions a:hover{color:#3582fb;}
+.comment-meta span{font-size:12px;}
diff --git a/public/static/assets/gougu/css/layout.css b/public/static/assets/gougu/css/layout.css
new file mode 100644
index 0000000000000000000000000000000000000000..06a631b6e236904fad8f8cdcc320ecfb2a9bfa59
--- /dev/null
+++ b/public/static/assets/gougu/css/layout.css
@@ -0,0 +1,271 @@
+body{color:#323232}
+.gg-layout .layui-header {position: fixed; top: 0;left: 0; width: 100%; height: 50px; border-bottom: 1px solid #eeeeee;box-sizing: border-box;background-color: #fff}
+.gg-layout .layui-header a,
+.gg-layout .layui-header a cite {color: #323232}
+.gg-layout .layui-header a:hover {color: #000}
+.gg-head-item{display:block; padding:0 16px; height:50px; line-height:50px; float:left;}
+.gg-head-item i.layui-icon{font-size:20px;}
+.gg-head-item .layui-nav{background:0 0;padding:0;}
+.gg-head-item .layui-nav .layui-nav-item a{padding:0;}
+.layui-layout-right .gg-head-item{border-left:1px solid #eeeeee;}
+.layui-layout-right .gg-head-item i.layui-icon{font-weight:600}
+
+.layui-layout-right .gg-head-message{position:relative;}
+.layui-layout-right .gg-message-num{height: 18px;position: absolute; top: -12px;margin-left: -4px;left: 50%;}
+.layui-layout-right .gg-message-num span {min-width: 18px; height: 18px; margin: 0;padding: 0 4px; display: inline-block; font-size: 11px; line-height: 18px; text-align: center;background-color: #FF5722; color: #fff; border-radius: 12px;cursor: pointer;}
+.gg-head-avatar img{width:28px; height:28px; border-radius:50%; margin-right:3px;}
+.gg-head-avatar i.layui-icon{font-size:14px;position: relative;}
+.layui-layout-right .layui-nav .layui-nav-item{height: 50px;line-height: 50px}
+.gg-head-item .layui-nav .layui-this:after{display:none;}
+
+/*默认菜单模式*/
+.gg-layout .layui-side { width: 180px; height:100%; z-index: 1000; overflow: auto;}
+.gg-layout .layui-side::-webkit-scrollbar { width: 0; }
+.gg-layout .layui-side{scrollbar-width: none;}
+.gg-layout .layui-logo {position: fixed;left: 0; top: 0; z-index: 1001; width: 180px; height: 49px; text-align:center; line-height:49px; overflow: hidden;background-color: #111827;  border-bottom: 1px solid #011120; cursor:pointer;}
+.gg-layout .layui-logo,.gg-layout .layui-logo a {color: #f1f1f1; text-align:center;}
+.gg-layout .layui-side .layui-nav-item .iconfont{font-weight:600; font-size:18px;}
+.gg-layout .layui-side .layui-nav-bar{width:3px;left:inherit;right:0; background-color:#1A75FF}
+
+/** 展开菜单模式 **/
+.gg-layout .layui-side-expand,
+.gg-layout .layui-side-expand .layui-logo{width: 120px;}
+.layui-side-expand ul {margin-top: 49px;}
+.layui-side-expand .menu-li {padding-top:1px;}
+.layui-side-expand .menu-li > a { position: relative; display: block; padding-right: 12px; padding-left: 36px; height: 42px; color: rgba(255, 255, 255, 0.75); transition: 0.1s cubic-bezier(0.145, 0.045, 0.355, 1); line-height: 42px;}
+.layui-side-expand .menu-li > a > i { position: absolute; top: 50%; left: 8px; margin-top: -21px;}
+.layui-side-expand .menu-li > a > cite { overflow: hidden; font-size: 14px; text-overflow: ellipsis; white-space: nowrap; }
+
+/**二级菜单**/
+.layui-side-expand .menu-li .gg-second-menu::-webkit-scrollbar { width: 0; }
+.layui-side-expand .menu-li .gg-second-menu { position: fixed; top: 93px; bottom: 0; left: 120px; display: none; overflow-y: auto; width: 120px; background: #ffffff;border-left: 1px solid rgba(0, 0, 0, .05); box-shadow: 1px 0 2px 0 rgba(0, 0, 0, .05);transition: all 0.3s;}
+.layui-side-expand .menu-li .gg-second-menu.current { display: block; }
+.layui-side-expand .menu-li .gg-second-menu dt {height: 42px; font-size: 15px; line-height:42px; border-bottom: 1px solid #eeeeee;}
+.layui-side-expand .menu-li .gg-second-menu dt strong {display: block; padding-left: 12px; color:#323232;}
+.layui-side-expand .menu-li .gg-second-menu dd { display: block; width: 100%; line-height: 43px; }
+.layui-side-expand .menu-li .gg-second-menu dd a { position: relative; display: block; padding-left: 12px; font-size: 14px; color: #323232!important;}
+.layui-side-expand .menu-li .gg-second-menu dd > a > i { position: absolute; top: 1px; right: 5px; display: inline-block; font-size: 12px; transition: all 0.3s ease-in-out; }
+.layui-side-expand .menu-li .gg-second-menu dd a.layui-this {background: #F0F6FE; color:#1A75FF!important;border-right:3px solid #186AF2}
+.layui-side-expand .menu-li .gg-second-menu dd a:hover {color:#1A75FF!important;}
+
+.layui-side-expand .menu-li .gg-three-menu dt {height: 43px; font-size: 14px; line-height:43px; cursor:pointer; border-bottom: 0; position:relative;}
+.layui-side-expand .menu-li .gg-three-menu dt strong {display: block; padding-left: 12px; color:#323232;}
+.layui-side-expand .menu-li .gg-three-menu .layui-icon{position: absolute; top: 50%;right: 12px; margin-top: -22px; color:#677C91}
+.layui-side-expand .menu-li .gg-three-menu .layui-icon-up{display:block}
+.layui-side-expand .menu-li .gg-three-menu .layui-icon-down{display:none;}
+.layui-side-expand .menu-li .gg-three-menu.show-up .layui-icon-down{display:block}
+.layui-side-expand .menu-li .gg-three-menu.show-up .layui-icon-up,.layui-side-expand .menu-li .gg-three-menu.show-up dd{display:none;}
+
+/**默认菜单模式**/
+.layui-side-menu {box-shadow: 1px 0 2px 0 rgba(0, 0, 0, .05);background-color: #001529; color: #fff}
+.layui-side-menu .layui-side-scroll {width: 100%;}
+.layui-side-menu .layui-nav {width: 180px; margin-top: 50px; background: 0 0}
+.layui-side-menu .layui-nav-item a {height: 42px;line-height: 42px; padding-left: 44px; padding-right: 20px}
+.layui-side-menu .layui-nav-item>a {padding-top: 2px;padding-bottom: 2px}
+.layui-side-menu .layui-nav-itemed>.layui-nav-child { padding: 0}
+.layui-side-menu .layui-nav-item .bi,
+.layui-side-menu .layui-nav-item .iconfont,
+.layui-side-menu .layui-nav-item .layui-icon{position: absolute; top: 50%;left: 16px; margin-top: -21px}
+.layui-side-menu .layui-nav-item .layui-nav-more {margin-top: -24px; color:#677C91}
+.layui-side-menu .layui-nav-child .layui-nav-more {margin-top: -20px; color:#677C91}
+
+.layui-side-menu .layui-nav-child .layui-nav-child { background: 0 0 !important}
+.layui-side-menu .layui-nav-child .layui-nav-child a {padding-left: 58px}
+.layui-side-menu .layui-nav-more {right: 12px}
+
+
+/**black**/
+.layui-side-black{background-color:#111827;}
+.layui-side-black .layui-logo {border-bottom: 1px solid #000F1D;}
+.layui-side-black .layui-nav-child dd.layui-this,
+.layui-side-black .layui-nav-child dd.layui-this a,
+.layui-side-black .layui-this,
+.layui-side-black .layui-this>a,
+.layui-side-black .layui-this>a:hover {background-color: #2F333F;}
+.layui-side-black .layui-nav-child dd a:hover{background-color:#2F333F!important;}
+
+
+/**white**/
+.layui-side-white{background-color: #fff; color: #323232; box-shadow: 1px 0 2px 0 rgba(0, 0, 0, .05);}
+.layui-side-white .layui-logo {background-color: #ffffff;border-bottom: 1px solid #eeeeee;}
+.layui-side-white .layui-nav-itemed>.layui-nav-child{background-color:#ffffff!important;}
+.layui-side-white .layui-nav-item a,.layui-side-white .layui-nav-itemed>a{color:#323232!important;}
+.layui-side-white .layui-nav-item a:hover{color:#1A75FF!important;}
+.layui-side-white .layui-nav-item a.layui-this{color:#1A75FF!important;}
+.layout-menu-classical .layui-side-white .layui-nav-item a.layui-this{border-right:3px solid #186AF2}
+.layui-side-white .layui-nav-child dd.layui-this,
+.layui-side-white .layui-nav-child dd.layui-this a,
+.layui-side-white .layui-this,
+.layui-side-white .layui-this>a,
+.layui-side-white .layui-this>a:hover {background-color: #EBF3FF;}
+.layui-side-white .layui-nav-child dd a:hover{background-color:#F8FAFF!important;color: #1A75FF!important; opacity: 0.9;}
+.layui-side-white .layui-nav-tree .layui-nav-child{background-color:#ffffff!important;}
+/**blue**/
+.layui-side-blue{background-color:#192A5E; color: #C5C9D2;}
+.layui-side-blue .layui-logo {background-color:#192A5E;border-bottom: 1px solid #122150;}
+.layui-side-blue .layui-nav-itemed>.layui-nav-child{background-color:#122150!important;}
+.layui-side-blue .layui-nav-item a,
+.layui-side-blue .layui-nav-itemed>a,
+.layui-side-blue .layui-nav-title a,
+.layui-side-blue .layui-nav-title a:hover{color:#C5C9D2!important;}
+.layui-side-blue .layui-nav-child dd.layui-this,
+.layui-side-blue .layui-nav-child dd.layui-this a,
+.layui-side-blue .layui-this,
+.layui-side-blue .layui-this>a,
+.layui-side-blue .layui-this>a:hover {background-color: #3c508c;color: #ffffff;}
+.layui-side-blue .layui-nav-child dd a:hover{background-color:#2b3e79!important;color: #C5C9D2!important;}
+
+.page-tabs{ position: fixed; top: 50px; right: 0; z-index: 999; height: 42px; line-height: 42px; padding: 0 80px 0 40px; background-color: #fff; box-sizing: border-box; box-shadow: 0 1px 3px rgb(0 0 0 / 12%);}
+.gg-layout .page-tabs,
+.gg-layout .layui-body,
+.gg-layout .layui-footer,
+.gg-layout .layui-layout-left {left: 180px}
+
+.layout-menu-expand .page-tabs,
+.layout-menu-expand .layui-body,
+.layout-menu-expand .layui-footer,
+.layout-menu-expand .layui-layout-left {left: 120px;}
+.layout-menu-expand .layui-logo{width:120px;}
+
+.layout-menu-expand .layui-body.expand-menu{left: 240px;}
+
+.page-tabs,
+.gg-layout .layui-body,
+.gg-layout .layui-footer,
+.gg-layout .layui-header .layui-layout-right,
+.gg-layout .layui-header .layui-nav .layui-nav-item,
+.gg-layout .layui-layout-left,
+.gg-layout .layui-logo,
+.gg-layout .layui-side {transition: all .3s;-webkit-transition: all .3s}
+
+.gg-layout .layui-body {top: 90px;bottom: 0; height:calc(100% - 90px); position: fixed;}
+.gg-layout .gg-tab-page {position: absolute; top: 0; bottom: 0;left: 0; right: 0; display: none; overflow: hidden;}
+.gg-layout .layui-footer {padding: 10px 0;text-align: center; box-shadow: 0 -1px 2px 0 rgba(0, 0, 0, .05)}
+.gg-body-shade {position: fixed; display: none;left: 0; right: 0; top: 0; bottom: 0; background-color: rgba(0, 0, 0, .3); z-index: 1000}
+
+.page-tabs .gg-tabs-control { position: absolute; top: 0;width: 40px; height: 100%;text-align: center; cursor: pointer;box-sizing: border-box; border-left: 1px solid #eeeeee;
+    transition: all .3s;
+    -webkit-transition: all .3s;
+}
+.page-tabs .gg-tabs-control:hover {background-color: #fafafa}
+.page-tabs .layui-icon-prev {left: 0; border-left: none; border-right: 1px solid #eeeeee}
+.page-tabs .layui-icon-next {right: 40px}
+.page-tabs .layui-icon-down {right: 0}
+.page-tabs .layui-tab {margin: 0; overflow: hidden}
+.page-tabs .layui-tab-title {height: 42px;border: none}
+.page-tabs .layui-tab-title i{font-size:18px; font-weight:600}
+
+.page-tabs .layui-tab-title li { min-width: 0; line-height: 42px; max-width: 160px; text-overflow: ellipsis; padding-left:12px; padding-right: 32px;overflow: hidden;border-right: 1px solid #eeeeee;vertical-align: top}
+.page-tabs .layui-tab-title li:first-child {padding-right: 15px}
+.page-tabs .layui-tab-title li .layui-tab-close { position: absolute;right: 8px; top: 50%;margin: -7px 0 0; width: 16px; height: 16px;line-height: 16px;border-radius: 50%;font-size: 12px}
+.page-tabs .layui-tab-title li:after { content: ''; position: absolute; top: 0; left: 0;width: 0; height: 3px; border-radius: 0; background-color: #1A75FF;
+    transition: all .3s;
+    -webkit-transition: all .3s
+}
+
+.page-tabs .layui-tab-title li:hover:after {width: 100%}
+
+.page-tabs .layui-tab-title li.layui-this,
+.page-tabs .layui-tab-title li:hover { background-color: #fafafa; color:#1A75FF}
+
+.page-tabs .layui-tab-title li.layui-this:after {width: 100%; border: none; background-color: #1A75FF}
+
+.page-tabs .layui-tab-title li:first-child .layui-tab-close,
+.gg-tabs-select.layui-nav .layui-nav-bar,
+.gg-tabs-select.layui-nav .layui-nav-more {display: none}
+
+.gg-tabs-select.layui-nav { position: absolute; left: 0; top: 0; width: 100%; height: 100%; padding: 0; background: 0 0}
+.gg-tabs-select.layui-nav .layui-nav-item { line-height: 40px}
+.gg-tabs-select.layui-nav .layui-nav-item>a {height: 40px}
+.gg-tabs-select.layui-nav .layui-nav-item a {color: #666}
+.gg-tabs-select.layui-nav .layui-nav-child {top: 40px;left: auto;right: 0}
+
+.gg-tabs-select.layui-nav .layui-nav-child dd.layui-this,
+.gg-tabs-select.layui-nav .layui-nav-child dd.layui-this a {background-color: #f2f2f2 !important;color: #323232}
+
+.gg-layout .layui-logo .logo{display: none}
+.side-spread .gg-layout .layui-logo {width: 52px;}
+.side-spread .gg-layout .layui-logo .syslogo{display: none}
+.side-spread .gg-layout .layui-logo .logo{display: inline-block}
+.side-spread .layui-side {left: 0;width: 52px}
+.side-spread .layui-side-expand .menu-li > a > i{left:15px;}
+.side-spread .layui-side-expand .menu-li .gg-second-menu{left:52px;}
+
+.side-spread .page-tabs,
+.side-spread .gg-layout .layui-body,
+.side-spread .gg-layout .layui-footer,
+.side-spread .gg-layout .layui-layout-left {left: 52px}
+
+.side-spread .layout-menu-expand .layui-body.expand-menu{left: 172px;}
+
+.side-spread .layui-side .layui-nav {position: static; width: 52px}
+.side-spread .layui-side .layui-nav-item {position: static}
+.side-spread .layui-side .layui-nav-item>a {padding-right: 0;padding-left:55px;}
+
+.side-spread .layui-side .layui-nav-item cite,
+.side-spread .layui-side .layui-nav>.layui-nav-item>.layui-nav-child,
+.side-spread .layui-side .layui-nav>.layui-nav-item>a .layui-nav-more {display: none; padding: 8px 0;width: 180px}
+
+.side-spread .layui-side .layui-nav>.layui-nav-itemed>a {background: rgba(0, 0, 0, .3)}
+
+.side-layout .layui-layer-TipsG.layui-layer-TipsR{display:none;}
+.side-layout.layui-layer-tips .layui-layer-content{padding:0!important; border-radius:0!important;}
+.side-layout .layui-nav-tree .layui-nav-bar{background-color: #3C9CFF;width:3px;}
+
+.side-spread-sm .layui-side {
+    transform: translate3d(0,0,0);
+    -webkit-transform: translate3d(0,0,0);
+}
+.side-spread-sm .page-tabs,
+.side-spread-sm .gg-layout .layui-body,
+.side-spread-sm .gg-layout .layui-footer,
+.side-spread-sm .gg-layout .layui-layout-left {
+    left: 0;
+    transform: translate3d(200px,0,0);
+    -webkit-transform: translate3d(200px,0,0);
+}
+.side-spread-sm .gg-body-shade {
+    display: block;
+}
+
+/** tab过场动画 **/
+.tab-loading{ position: absolute; top: 0; right: 0; bottom: 0; left: 0; z-index: 666666; display: block; width: 100%; height: 100%; background-color: #fafafa;}
+.tab-loader {position: absolute;top: calc(50% - 1.6em);left: calc(50% - 1.6em); width: 3.2em; height: 3.2em; transform: rotate(165deg);}
+.tab-loader:before,.tab-loader:after {content: ""; position: absolute; top: 50%; left: 50%; display: block; width: 0.6em; height: 0.6em; border-radius: 0.3em; transform: translate(-50%, -50%);}
+.tab-loader:before { animation: before 2s infinite;}
+.tab-loader:after {animation: after 2s infinite;}
+
+@keyframes before {
+  0% {
+    width: 0.6em;
+    box-shadow: 1.6em -0.6em rgba(225, 20, 98, 0.88), -1.6em 0.6em rgba(111, 202, 220, 0.88);
+  }
+  35% {
+    width: 3.2em;
+    box-shadow: 0 -0.6em rgba(225, 20, 98, 0.88), 0 0.6em rgba(111, 202, 220, 0.88);
+  }
+  70% {
+    width: 0.6em;
+    box-shadow: -1em -0.6em rgba(225, 20, 98, 0.88), 1.6em 0.6em rgba(111, 202, 220, 0.88);
+  }
+  100% {
+    box-shadow: 1em -0.6em rgba(225, 20, 98, 0.88), -1.6em 0.6em rgba(111, 202, 220, 0.88);
+  }
+}
+@keyframes after {
+  0% {
+    height: 0.6em;
+    box-shadow: 0.6em 1.6em rgba(61, 184, 143, 0.88), -0.6em -1.6em rgba(233, 169, 32, 0.88);
+  }
+  35% {
+    height: 3.2em;
+    box-shadow: 0.6em 0 rgba(61, 184, 143, 0.88), -0.6em 0 rgba(233, 169, 32, 0.88);
+  }
+  70% {
+    height: 0.6em;
+    box-shadow: 0.6em -1.6em rgba(61, 184, 143, 0.88), -0.6em 1.6em rgba(233, 169, 32, 0.88);
+  }
+  100% {
+    box-shadow: 0.6em 1.6em rgba(61, 184, 143, 0.88), -0.6em -1.6em rgba(233, 169, 32, 0.88);
+  }
+}
\ No newline at end of file
diff --git a/public/static/assets/gougu/gouguInit.js b/public/static/assets/gougu/gouguInit.js
new file mode 100644
index 0000000000000000000000000000000000000000..1656a5ef27fd145f9688867786d6c22d55c9663e
--- /dev/null
+++ b/public/static/assets/gougu/gouguInit.js
@@ -0,0 +1,37 @@
+window.rootPath = (function (src) {
+	src = document.currentScript
+		? document.currentScript.src
+		: document.scripts[document.scripts.length - 1].src;
+	return src.substring(0, src.lastIndexOf("/") + 1);
+})();
+
+window.rootVersion = (function (src) {
+	src = document.currentScript
+		? document.currentScript.src
+		: document.scripts[document.scripts.length - 1].src;
+	return src.split('?v=')[1];
+})();
+
+if (typeof $ == "undefined") {
+	window.jQuery = layui.jquery;
+	window.$ = layui.jquery;
+}
+if (typeof moduleInit == "undefined") {
+	window.moduleInit = [];
+}
+var module = {};
+if (moduleInit.length > 0) {
+	for (var i = 0; i < moduleInit.length; i++) {
+		module[moduleInit[i]] = moduleInit[i];
+	}
+}
+layui.config({
+	base: rootPath + "module/",
+	version: rootVersion
+}).extend(module).use(moduleInit, function () {
+	if (typeof gouguInit === 'function') {
+		gouguInit();
+	}
+});
+
+
diff --git a/public/static/assets/gougu/images/click-edit.png b/public/static/assets/gougu/images/click-edit.png
new file mode 100644
index 0000000000000000000000000000000000000000..0995decb45587763f7870c786a06c95ea2fc8ec2
Binary files /dev/null and b/public/static/assets/gougu/images/click-edit.png differ
diff --git a/public/static/assets/gougu/images/data-none.png b/public/static/assets/gougu/images/data-none.png
new file mode 100644
index 0000000000000000000000000000000000000000..67d9b321d0ed1c78a737f3b31b537fb642cd6941
Binary files /dev/null and b/public/static/assets/gougu/images/data-none.png differ
diff --git a/public/static/assets/gougu/images/delete_icon.png b/public/static/assets/gougu/images/delete_icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..40d02632e6634ecc02877217d5ae86431100c80d
Binary files /dev/null and b/public/static/assets/gougu/images/delete_icon.png differ
diff --git a/public/static/assets/gougu/images/gouguadmin.png b/public/static/assets/gougu/images/gouguadmin.png
new file mode 100644
index 0000000000000000000000000000000000000000..e85e113e16956eb39285ff290928a4f01fd06709
Binary files /dev/null and b/public/static/assets/gougu/images/gouguadmin.png differ
diff --git a/public/static/assets/gougu/images/icon.png b/public/static/assets/gougu/images/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..9a516e4f319d9ded822f7eee86928289c98cd4de
Binary files /dev/null and b/public/static/assets/gougu/images/icon.png differ
diff --git a/public/static/assets/gougu/images/logo.png b/public/static/assets/gougu/images/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..82e989345220f80e4d5a5a15eb68580d8e3b7990
Binary files /dev/null and b/public/static/assets/gougu/images/logo.png differ
diff --git a/public/static/assets/gougu/images/nonepic600x360.jpg b/public/static/assets/gougu/images/nonepic600x360.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..d15f7d1c346f0f2fa3c75af234307894543153c6
Binary files /dev/null and b/public/static/assets/gougu/images/nonepic600x360.jpg differ
diff --git a/public/static/assets/gougu/module/admin.js b/public/static/assets/gougu/module/admin.js
new file mode 100644
index 0000000000000000000000000000000000000000..8b653e86a7bf74fdc492af33b597d301606f1793
--- /dev/null
+++ b/public/static/assets/gougu/module/admin.js
@@ -0,0 +1,542 @@
+layui.define([], function (exports) {
+	let element = layui.element;
+	let $gouguApp = $("#GouguApp");
+	let $gouguAppBody = $("#GouguAppBody");
+	let $gouguMenuList = $("#menuList");
+	let tab = {
+        // tab动画加载效果
+        loading: function() {
+            let load = '<div class="tab-loading"><div class="tab-loader"></div></div>';
+            let $iframe = $gouguAppBody.find('.gg-tab-page.layui-show iframe');
+            if (!$iframe.next().length) {
+                $iframe.parent().append(load);
+                let tabLoad = $iframe.parent().find('.tab-loading');
+				let tab_timestamp =  $iframe.data('timestamp');
+				let timestamp = new Date().getTime();
+				//console.log(tab_timestamp);
+				if(timestamp-tab_timestamp<666){
+					$iframe.on('load', function() {
+						tabLoad.fadeOut(666, function() {
+							tabLoad.remove();
+						});
+					})
+				}
+				else{
+					tabLoad.fadeOut(666, function() {
+						tabLoad.remove();
+					});
+				}
+            }
+        },
+		//历史tab预加载
+		tabTem: function (id, url, title) {
+			element.tabAdd('gg-admin-tab', {
+				id: id,
+				url:url,
+				title: '<span class="gg-tab-active"></span>' + title
+			});
+			$gouguAppBody.append('<div class="gg-tab-page" title="'+title+'" id="tabItem' + id + '" data-id="' + id + '" data-url="' + url + '"></div>');
+		},
+		/*新增一个Tab页面
+		* @id，tab页面唯一标识，可是标签中data-id的属性值
+		* @url,tab页面地址
+		* @name,tab页面标题，
+		*/
+		tabAdd: function (id, url, title) {
+			let thetabs = $('#pageTabUl').find('li');
+			if (thetabs.length > 15) {
+				layer.tips('点击LOGO快速关闭已开的TAB页面', $('.layui-logo'));
+			}
+			if (thetabs.length > 20) {
+				layer.msg('你已打开了太多TAB页面了，请关闭部分TAB再使用');
+				return false;
+			}
+			element.tabAdd('gg-admin-tab', {
+				id: id,
+				url:url,
+				title: '<span class="gg-tab-active"></span>' + title
+			});
+			// 获取当前时间戳（毫秒数）
+			let timestamp = new Date().getTime();
+			$gouguAppBody.append('<div class="gg-tab-page" title="'+title+'" id="tabItem'+id+'" data-id="'+id +'"><iframe id="'+id+'" data-frameid="'+id+'" data-timestamp="'+timestamp+'" src="'+url+'" frameborder="0" align="left" width="100%" height="100%" scrolling="yes"></iframe></div>');
+			this.tabChange(id);
+		},
+		//从子页面打开新的Tab页面，防止id重复，使用时间戳作为唯一标识
+		sonAdd: function (url, title,id) {
+			if ($(".layui-tab-title li[lay-id]").length <= 0) {
+				//打开新的tab项
+				this.tabAdd(id, url, title);
+			} else {
+				//否则判断该tab项是否以及存在
+				let isHas = false;
+				$.each($(".layui-tab-title li[lay-id]"), function () {
+					//如果点击左侧菜单栏所传入的id 在右侧tab项中的lay-id属性可以找到，则说明该tab项已经打开
+					if ($(this).attr("lay-id") == id) {
+						isHas = true;
+						$('[data-frameid="' + id + '"]').attr('src', url);
+						//最后不管是否新增tab，最后都转到要打开的选项页面上
+						tab.tabChange(id);
+					}
+				})
+				if (isHas == false) {
+					//标志为false 新增一个tab项
+					tab.tabAdd(id, url, title);
+				}
+			}
+			try {
+				layer.close(window.openTips);
+			} catch (e) {
+				console.log(e.message);
+			}
+		},
+		//根据传入的id传入到指定的tab项，并滚动定位
+		tabChange: function (id) {
+			element.tabChange('gg-admin-tab', id);
+		},
+		//删除tab页面
+		tabDelete: function (id) {
+			if (id == 0) {
+				return;
+			}
+			element.tabDelete('gg-admin-tab', id);
+		},
+		/*删除所有tab页面
+		*@ids 是一个数组，存放多个id，调用tabDelete方法分别删除
+		*/
+		tabDeleteAll: function (ids) {
+			let that = this;
+			$.each(ids, function (i, item) {
+				that.tabDelete(item);
+			})
+		},
+		//tab页面关闭自己，需要使用父iframe配合一起调用，如：parent.tab.sonClose();
+		sonClose: function (id) {
+			$('.layui-tab .layui-tab-title .layui-this i').click();
+		},
+		//滚动tab
+		tabRoll: function (event, index) {
+			let $tabTitle = $("#pageTabs .layui-tab-title"),
+				$tabs = $tabTitle.children("li"),
+				$outerWidth = ($tabTitle.prop("scrollWidth"), $tabTitle.outerWidth()),
+				$left = parseFloat($tabTitle.css("left"));
+			if ("left" === event) {
+				if (!$left && $left <= 0){
+					return;
+				}
+				let roll = -$left - $outerWidth;
+				$tabs.each(function (item, i) {
+					let $item = $(i),$itemleft = $item.position().left;
+					if ($itemleft >= roll) {
+						return $tabTitle.css("left", -$itemleft), false;
+					}
+				})
+			} else "auto" === event ? ! function () {
+				let $itemleft, $item = $tabs.eq(index);
+				if ($item[0]) {
+					if ($itemleft = $item.position().left, $itemleft < -$left) return $tabTitle.css("left", -$itemleft);
+					if ($itemleft + $item.outerWidth() >= $outerWidth - $left) {
+						let $diff = $itemleft + $item.outerWidth() - ($outerWidth - $left);
+						$tabs.each(function (e, i) {
+							let $tabitem = $(i),$tabitemleft = $tabitem.position().left;
+							if ($tabitemleft + $left > 0 && $tabitemleft - $left > $diff) return $tabTitle.css("left", -$tabitemleft), false;
+						})
+					}
+				}
+			}() : $tabs.each(function (item, i) {
+				let $item = $(i),$itemleft = $item.position().left;
+				if ($itemleft + $item.outerWidth() >= $outerWidth - $left) return $tabTitle.css("left", -$itemleft), false;
+			})
+		},
+		tabFollow:function(id){
+			$gouguMenuList.find('.side-menu-item').removeClass('layui-this');
+			$gouguMenuList.find('dd').removeClass('layui-this').removeClass('layui-nav-itemed');
+			$gouguMenuList.find('.menu-li').removeClass('layui-nav-itemed');
+			$gouguMenuList.find('.gg-second-menu').removeClass('current');
+			$('#GouguAppBody').removeClass('expand-menu');
+			$('.side-menu-item').each(function (index,item){
+				if($(item).data("id") == id) {
+					//console.log(item);
+					$(item).addClass('layui-this');
+					$(item).parents('dd').addClass('layui-nav-itemed');
+					$(item).parents('dl').addClass('current');
+					
+					let $menuli = $(item).parents('.menu-li');
+					$menuli.addClass('layui-nav-itemed');
+					
+					// 展开菜单模式
+					if ($('.layout-menu-expand').length) {
+						$menuli.siblings().find('a').removeClass('layui-this');
+						$menuli.children('a').addClass('layui-this');
+						// 子级菜单
+						$menuli.siblings().find('.gg-second-menu').removeClass('current');
+						if ($menuli.children('.gg-second-menu').length) {
+							$('#GouguAppBody').addClass('expand-menu');
+							let second_menu = $(this).parent().parent();
+							second_menu.removeClass('show-up');
+							//console.log(second_menu.html());
+						}
+					}
+				}
+			})
+		},
+		refresh:function(id){
+			if(parent.document.getElementById(id)){
+				let src = parent.document.getElementById(id).contentWindow.location.href ? parent.document.getElementById(id).contentWindow.location.href : iframe.src;
+				document.getElementById(id).src = src;
+			}
+		},
+		tabCookie:function(){
+			let thetabs = $('#pageTabUl').find('li'),tab_id = 0,tab_array=[];
+			thetabs.each(function(index,item){
+				let _id = $(item).attr('lay-id'),_url = $(item).attr('lay-url'),_title = $(item).text();
+				if(_id>0){
+					tab_array.push({'id':_id,'url':_url,'title':_title});
+				}
+				if($(item).hasClass('layui-this')){
+					tab_id = _id;
+				}				
+			})
+			if(tab_array.length>0){
+				let tabs_obj = {'tab_id':tab_id,'tab_array':tab_array};
+				tab.setCookie('gougutab',JSON.stringify(tabs_obj));
+			}
+			else{
+				tab.delCookie('gougutab');
+			}
+		},
+		setCookie: function (name, value, days) {
+			let expires = "";
+			if (days) {
+				let date = new Date();
+				date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
+				expires = "; expires=" + date.toGMTString();
+			}
+			document.cookie = name + "=" + value + expires + "; path=/";
+		},
+		getCookie: function (name) {
+			let arr = document.cookie.match(new RegExp("(^| )" + name + "=([^;]*)(;|$)"));
+			if (arr != null) {
+				return unescape(arr[ 2 ]);
+			}
+			return null;
+		},
+		delCookie: function (name) {
+			this.setCookie(name, "", -1);
+		},
+		officeView:function (id,mode){
+			layer.open({
+				type: 2,
+				title: 'OFFICE文件查看（当前使用的是微软官方的OFFICE接口，服务器需要连接外网才能查看）',
+				id:'officeView',
+				shadeClose: false,
+				maxmin: false, //开启最大化最小化按钮
+				area: ['100%', window.innerHeight+'px'],
+				offset: 'b',
+				//zIndex:2999,
+				resize:false,
+				anim: 2,
+				scrollbar:false,
+				//content: '/api/office/view?id='+id+'&mode='+mode,
+				content: '/api/office/officeapps?id='+id+'&mode='+mode,
+				cancel: function(index, layero, that){
+					//layer.msg('文件在后台保存中，请稍再查看或下载...', {time: 3*1000});
+				}
+			});
+		},
+		pdfView:function (href){
+			layer.open({
+				type: 2,
+				title: 'PDF文件查看（当前使用的是浏览器自身接口查看）',
+				id:'pdfView',
+				shadeClose: false,
+				anim: 2,
+				maxmin: false, //开启最大化最小化按钮
+				area: ['100%', window.innerHeight+'px'],
+				offset: 'b',
+				//zIndex:2999,
+				resize:false,
+				content: href
+			});
+		},
+		videoView:function (href){
+			layer.open({
+				type: 1,
+				title: '视频文件播放',
+				id:'videoView',
+				shadeClose: false,
+				area: ['810px', '510px'],
+				content: '<div style="padding:5px 5px 0"><video src="'+href+'" playsinline="" controls="true" style="width:800px; height:450px"></video></div>'
+			});
+		},
+		audioView:function (href){
+			layer.open({
+				type: 1,
+				title: '音频文件播放',
+				id:'audioView',
+				shadeClose: false,
+				area: ['500px', '120px'],
+				content: '<audio src="'+href+'" playsinline="" controls="true" style="width:500px; height:60px"></audio>'
+			});
+		},
+		photoView:function (href){
+			let photos = { "data": [{"src": href}]};
+			layer.photos({
+				photos: photos,
+				anim: 5 //0-6的选择，指定弹出图片动画类型，默认随机（请注意，3.0之前的版本用shift参数）
+			});
+		}
+	};
+	//切换tab
+	element.on('tab(gg-admin-tab)', function (data) {
+		let thisPage = $gouguAppBody.find('.gg-tab-page').eq(data.index);
+		let id = thisPage.data('id');
+		let url = thisPage.data('url');
+		if(thisPage.find('iframe').length==0){
+			// 获取当前时间戳（毫秒数）
+			let timestamp = new Date().getTime();
+			thisPage.html('<iframe id="'+id+'" data-frameid="'+id+'" data-timestamp="'+timestamp+'" src="'+url+'" frameborder="0" align="left" width="100%" height="100%" scrolling="yes"></iframe>');
+		}
+		tab.tabFollow(id);
+		$gouguAppBody.find('.gg-tab-page').removeClass('layui-show');
+		thisPage.addClass('layui-show');
+		if(data.index==0){
+			tab.refresh(0);
+		}
+		tab.loading();
+		tab.tabRoll("auto", data.index);
+		tab.tabCookie();
+	});
+	//删除tab
+	element.on('tabDelete(gg-admin-tab)', function (data) {
+		$gouguAppBody.find('.gg-tab-page').eq(data.index).remove();
+		tab.tabRoll("auto", data.index);
+		tab.tabCookie();
+	});
+
+	//右滚动tab
+	$('[gg-event="tabRollRight"]').click(function () {
+		tab.tabRoll("right");
+	})
+	//左滚动tab
+	$('[gg-event="tabRollLeft"]').click(function () {
+		tab.tabRoll("left");
+	})
+
+	//关闭全部tab，只保留首页
+	$gouguApp.on('click', '[gg-event="closeAllTabs"]', function () {
+		let thetabs = $('#pageTabs .layui-tab-title').find('li'), ids = [];
+		for (let i = 0; i < thetabs.length; i++) {
+			let id = thetabs.eq(i).attr('lay-id');
+			ids.push(id);
+		}
+		tab.tabDeleteAll(ids);
+		return false;
+	})
+
+	//关闭其他tab
+	$gouguApp.on('click', '[gg-event="closeOtherTabs"]', function () {
+		let thetabs = $('#pageTabs .layui-tab-title').find('li'), ids = [];
+		let thisid = $('#pageTabs .layui-tab-title').find('.layui-this').attr('lay-id');
+		for (let i = 0; i < thetabs.length; i++) {
+			let id = thetabs.eq(i).attr('lay-id');
+			if (id != thisid) {
+				ids.push(id);
+			}
+		}
+		tab.tabDeleteAll(ids);
+		return false;
+	})
+
+	//关闭当前tab
+	$gouguApp.on('click', '[gg-event="closeThisTabs"]', function () {
+		let thisid = $('#pageTabs .layui-tab-title').find('.layui-this').attr('lay-id');
+		tab.tabDelete(thisid);
+		return false;
+	})
+
+	//当点击有side-menu-item属性的标签时，即左侧菜单栏中内容 ，触发tab
+	$('body').on('click', 'a.side-menu-item', function () {
+		let that = $(this);
+		let url = that.data("href"), id = that.data("id"), title = that.data("title");
+		if (url == '' || url == '/') {
+			return false;
+		}
+		//这时会判断右侧.layui-tab-title属性下的有lay-id属性的li的数目，即已经打开的tab项数目
+		//$('.site-menu-active').removeClass('layui-this');
+		//that.addClass('layui-this');
+		//$gouguApp.removeClass('side-spread-sm');
+		if ($(".layui-tab-title li[lay-id]").length <= 0) {
+			//打开新的tab项
+			tab.tabAdd(id, url, title);
+		} else {
+			//否则判断该tab项是否以及存在
+			let isHas = false;
+			$.each($(".layui-tab-title li[lay-id]"), function () {
+				//如果点击左侧菜单栏所传入的id 在右侧tab项中的lay-id属性可以找到，则说明该tab项已经打开
+				if ($(this).attr("lay-id") == id) {
+					isHas = true;
+					$('[data-frameid="' + id + '"]').attr('src', url);
+					//最后不管是否新增tab，最后都转到要打开的选项页面上
+					tab.tabChange(id);
+				}
+			})
+			if (isHas == false) {
+				//标志为false 新增一个tab项
+				tab.tabAdd(id, url, title);
+			}
+		}
+		try {
+			layer.close(window.openTips);
+		} catch (e) {
+			console.log(e.message);
+		}
+	});
+
+	//左侧菜单展开&收缩
+	$gouguApp.on('click', '[gg-event="shrink"]', function () {
+		let that_i = $(this).children('i');
+		if (that_i.hasClass("layui-icon-shrink-right")) {
+			that_i.removeClass("layui-icon-shrink-right").addClass("layui-icon-spread-left");			
+		}
+		else{
+			that_i.removeClass("layui-icon-spread-left").addClass("layui-icon-shrink-right");	
+		}
+		$gouguApp.toggleClass('side-spread');
+	})
+	/*
+	$gouguApp.on('click', '[gg-event="shade"]', function () {
+		$gouguApp.removeClass('side-spread-sm');
+	})
+	*/
+
+	//左上角清除缓存
+	$gouguApp.on('click', '[gg-event="cache"]', function (e) {
+		let that = $(this);
+		let url = $(this).data('href');
+		if (that.attr('class') === 'clearThis') {
+			layer.tips('正在努力清理中...', this);
+			return false;
+		}
+		layer.tips('正在清理系统缓存...', this);
+		that.attr('class', 'clearThis');
+		$.ajax({
+			url: url,
+			success: function (res) {
+				if (res.code == 1) {
+					setTimeout(function () {
+						that.attr('class', '');
+						layer.tips(res.msg, that);
+					}, 1000)
+				} else {
+					layer.tips(res.msg, that);
+				}
+			}
+		})
+	})
+
+	//右上角刷新当前tab页面
+	$gouguApp.on('click', '[gg-event="refresh"]', function () {
+		let that = $(this);
+		if (that.hasClass("refreshThis")) {
+			that.removeClass("refreshThis");
+			let iframe = $(".gg-tab-page.layui-show").find("iframe")[0];
+			if (iframe) {
+				tab.refresh(iframe.id);
+			}
+			setTimeout(function () {
+				that.attr("class", "refreshThis");
+			}, 2000)
+		} else {
+			layer.tips("每2秒只可刷新一次", this, {
+				tips: 1
+			});
+		}
+		return false;
+	})
+
+	//右上角全屏&退出全屏
+	$gouguApp.on("click", ".fullScreen", function () {
+		if ($(this).hasClass("layui-icon-screen-restore")) {
+			screenFun(2).then(function () {
+				$(".fullScreen").eq(0).removeClass("layui-icon-screen-restore");
+			});
+		} else {
+			screenFun(1).then(function () {
+				$(".fullScreen").eq(0).addClass("layui-icon-screen-restore");
+			});
+		}
+	});
+
+	//小菜单展现多级菜单
+	$gouguApp.on("mouseenter", ".layui-nav-tree .menu-li", function () {
+		let tips = $(this).prop("innerHTML");
+		if ($gouguApp.hasClass('side-spread') && tips) {
+			tips = "<ul class='layuimini-menu-left-zoom layui-nav layui-nav-tree layui-this'><li class='layui-nav-item layui-nav-itemed'>" + tips + "</li></ul>";
+			window.openTips = layer.tips(tips, $(this), {
+				tips: [2, '#2f4056'],
+				time: 300000,
+				skin: "popup-tips",
+				success: function (el) {
+					let left = $(el).position().left - 10;
+					$(el).addClass('side-layout').css({ left: left });
+					element.render();
+				}
+			});
+		}
+	});
+
+	$("body").on("mouseleave", ".popup-tips", function () {
+		try {
+			layer.close(window.openTips);
+		} catch (e) {
+			console.log(e.message);
+		}
+	});
+
+	function screenFun(num) {
+		num = num || 1;
+		num = num * 1;
+		let docElm = document.documentElement;
+		switch (num) {
+			case 1:
+				if (docElm.requestFullscreen) {
+					docElm.requestFullscreen();
+				} else if (docElm.mozRequestFullScreen) {
+					docElm.mozRequestFullScreen();
+				} else if (docElm.webkitRequestFullScreen) {
+					docElm.webkitRequestFullScreen();
+				} else if (docElm.msRequestFullscreen) {
+					docElm.msRequestFullscreen();
+				}
+				break;
+			case 2:
+				if (document.exitFullscreen) {
+					document.exitFullscreen();
+				} else if (document.mozCancelFullScreen) {
+					document.mozCancelFullScreen();
+				} else if (document.webkitCancelFullScreen) {
+					document.webkitCancelFullScreen();
+				} else if (document.msExitFullscreen) {
+					document.msExitFullscreen();
+				}
+				break;
+		}
+		return new Promise(function (res, rej) {
+			res("返回值");
+		});
+	}
+
+	function isFullscreen() {
+		return document.fullscreenElement ||
+			document.msFullscreenElement ||
+			document.mozFullScreenElement ||
+			document.webkitFullscreenElement || false;
+	}
+
+	window.onresize = function () {
+		if (!isFullscreen()) {
+			$(".fullScreen").eq(0).removeClass("layui-icon-screen-restore");
+		}
+	}
+	exports('admin', tab);
+});  
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/areaSelect.js b/public/static/assets/gougu/module/areaSelect.js
new file mode 100644
index 0000000000000000000000000000000000000000..f9f3bb6287d8ce177ef6dfe1e5be388c044ed999
--- /dev/null
+++ b/public/static/assets/gougu/module/areaSelect.js
@@ -0,0 +1,235 @@
+layui.define([], function (exports) {  
+    let $ = layui.$, form = layui.form;
+	let gouguarea = {
+		_id: 0,
+		config: {},
+		set: function (options) {
+			let that = this;
+			that.config = $.extend({}, that.config, options);
+			return that;
+		},
+		on: function (events, callback) {
+			return layui.onevent.call(this, 'gouguarea', events, callback);
+		}
+    };
+    let thisArea = function () {
+		let that = this;
+		return {
+			gouguarea: function (files) {
+				that.gouguarea.call(that, files);
+			},
+			config: that.config
+		}
+    };
+    let Class = function (options) {
+		let that = this;
+		that.config = $.extend({}, that.config, gouguarea.config, options);
+		that.render();
+    };
+  
+    let areaList = {
+      province_list: { "110000": "北京市", "120000": "天津市", "130000": "河北省", "140000": "山西省", "150000": "内蒙古自治区", "210000": "辽宁省", "220000": "吉林省", "230000": "黑龙江省", "310000": "上海市", "320000": "江苏省", "330000": "浙江省", "340000": "安徽省", "350000": "福建省", "360000": "江西省", "370000": "山东省", "410000": "河南省", "420000": "湖北省", "430000": "湖南省", "440000": "广东省", "450000": "广西壮族自治区", "460000": "海南省", "500000": "重庆市", "510000": "四川省", "520000": "贵州省", "530000": "云南省", "540000": "西藏自治区", "610000": "陕西省", "620000": "甘肃省", "630000": "青海省", "640000": "宁夏回族自治区", "650000": "新疆维吾尔自治区", "714368": "香港特别行政区", "714390": "澳门特别行政区", "714401": "台湾" },
+      city_list: { "110100": "北京市", "120100": "天津市", "130100": "石家庄市", "130200": "唐山市", "130300": "秦皇岛市", "130400": "邯郸市", "130500": "邢台市", "130600": "保定市", "130700": "张家口市", "130800": "承德市", "130900": "沧州市", "131000": "廊坊市", "131100": "衡水市", "140100": "太原市", "140200": "大同市", "140300": "阳泉市", "140400": "长治市", "140500": "晋城市", "140600": "朔州市", "140700": "晋中市", "140800": "运城市", "140900": "忻州市", "141000": "临汾市", "141100": "吕梁市", "150100": "呼和浩特市", "150200": "包头市", "150300": "乌海市", "150400": "赤峰市", "150500": "通辽市", "150600": "鄂尔多斯市", "150700": "呼伦贝尔市", "150800": "巴彦淖尔市", "150900": "乌兰察布市", "152200": "兴安盟", "152500": "锡林郭勒盟", "152900": "阿拉善盟", "210100": "沈阳市", "210200": "大连市", "210300": "鞍山市", "210400": "抚顺市", "210500": "本溪市", "210600": "丹东市", "210700": "锦州市", "210800": "营口市", "210900": "阜新市", "211000": "辽阳市", "211100": "盘锦市", "211200": "铁岭市", "211300": "朝阳市", "211400": "葫芦岛市", "220100": "长春市", "220200": "吉林市", "220300": "四平市", "220400": "辽源市", "220500": "通化市", "220600": "白山市", "220700": "松原市", "220800": "白城市", "222400": "延边朝鲜族自治州", "230100": "哈尔滨市", "230200": "齐齐哈尔市", "230300": "鸡西市", "230400": "鹤岗市", "230500": "双鸭山市", "230600": "大庆市", "230700": "伊春市", "230800": "佳木斯市", "230900": "七台河市", "231000": "牡丹江市", "231100": "黑河市", "231200": "绥化市", "232700": "大兴安岭地区", "310100": "上海市", "320100": "南京市", "320200": "无锡市", "320300": "徐州市", "320400": "常州市", "320500": "苏州市", "320600": "南通市", "320700": "连云港市", "320800": "淮安市", "320900": "盐城市", "321000": "扬州市", "321100": "镇江市", "321200": "泰州市", "321300": "宿迁市", "330100": "杭州市", "330200": "宁波市", "330300": "温州市", "330400": "嘉兴市", "330500": "湖州市", "330600": "绍兴市", "330700": "金华市", "330800": "衢州市", "330900": "舟山市", "331000": "台州市", "331100": "丽水市", "340100": "合肥市", "340200": "芜湖市", "340300": "蚌埠市", "340400": "淮南市", "340500": "马鞍山市", "340600": "淮北市", "340700": "铜陵市", "340800": "安庆市", "341000": "黄山市", "341100": "滁州市", "341200": "阜阳市", "341300": "宿州市", "341500": "六安市", "341600": "亳州市", "341700": "池州市", "341800": "宣城市", "350100": "福州市", "350200": "厦门市", "350300": "莆田市", "350400": "三明市", "350500": "泉州市", "350600": "漳州市", "350700": "南平市", "350800": "龙岩市", "350900": "宁德市", "360100": "南昌市", "360200": "景德镇市", "360300": "萍乡市", "360400": "九江市", "360500": "新余市", "360600": "鹰潭市", "360700": "赣州市", "360800": "吉安市", "360900": "宜春市", "361000": "抚州市", "361100": "上饶市", "370100": "济南市", "370200": "青岛市", "370300": "淄博市", "370400": "枣庄市", "370500": "东营市", "370600": "烟台市", "370700": "潍坊市", "370800": "济宁市", "370900": "泰安市", "371000": "威海市", "371100": "日照市", "371300": "临沂市", "371400": "德州市", "371500": "聊城市", "371600": "滨州市", "371700": "菏泽市", "410100": "郑州市", "410200": "开封市", "410300": "洛阳市", "410400": "平顶山市", "410500": "安阳市", "410600": "鹤壁市", "410700": "新乡市", "410800": "焦作市", "410900": "濮阳市", "411000": "许昌市", "411100": "漯河市", "411200": "三门峡市", "411300": "南阳市", "411400": "商丘市", "411500": "信阳市", "411600": "周口市", "411700": "驻马店市", "420100": "武汉市", "420200": "黄石市", "420300": "十堰市", "420500": "宜昌市", "420600": "襄阳市", "420700": "鄂州市", "420800": "荆门市", "420900": "孝感市", "421000": "荆州市", "421100": "黄冈市", "421200": "咸宁市", "421300": "随州市", "422800": "恩施土家族苗族自治州", "430100": "长沙市", "430200": "株洲市", "430300": "湘潭市", "430400": "衡阳市", "430500": "邵阳市", "430600": "岳阳市", "430700": "常德市", "430800": "张家界市", "430900": "益阳市", "431000": "郴州市", "431100": "永州市", "431200": "怀化市", "431300": "娄底市", "433100": "湘西土家族苗族自治州", "440100": "广州市", "440200": "韶关市", "440300": "深圳市", "440400": "珠海市", "440500": "汕头市", "440600": "佛山市", "440700": "江门市", "440800": "湛江市", "440900": "茂名市", "441200": "肇庆市", "441300": "惠州市", "441400": "梅州市", "441500": "汕尾市", "441600": "河源市", "441700": "阳江市", "441800": "清远市", "441900": "东莞市", "442000": "中山市", "445100": "潮州市", "445200": "揭阳市", "445300": "云浮市", "450100": "南宁市", "450200": "柳州市", "450300": "桂林市", "450400": "梧州市", "450500": "北海市", "450600": "防城港市", "450700": "钦州市", "450800": "贵港市", "450900": "玉林市", "451000": "百色市", "451100": "贺州市", "451200": "河池市", "451300": "来宾市", "451400": "崇左市", "460100": "海口市", "460200": "三亚市", "460300": "三沙市", "460400": "儋州市", "500100": "重庆市", "510100": "成都市", "510300": "自贡市", "510400": "攀枝花市", "510500": "泸州市", "510600": "德阳市", "510700": "绵阳市", "510800": "广元市", "510900": "遂宁市", "511000": "内江市", "511100": "乐山市", "511300": "南充市", "511400": "眉山市", "511500": "宜宾市", "511600": "广安市", "511700": "达州市", "511800": "雅安市", "511900": "巴中市", "512000": "资阳市", "513200": "阿坝藏族羌族自治州", "513300": "甘孜藏族自治州", "513400": "凉山彝族自治州", "520100": "贵阳市", "520200": "六盘水市", "520300": "遵义市", "520400": "安顺市", "520500": "毕节市", "520600": "铜仁市", "522300": "黔西南布依族苗族自治州", "522600": "黔东南苗族侗族自治州", "522700": "黔南布依族苗族自治州", "530100": "昆明市", "530300": "曲靖市", "530400": "玉溪市", "530500": "保山市", "530600": "昭通市", "530700": "丽江市", "530800": "普洱市", "530900": "临沧市", "532300": "楚雄彝族自治州", "532500": "红河哈尼族彝族自治州", "532600": "文山壮族苗族自治州", "532800": "西双版纳傣族自治州", "532900": "大理白族自治州", "533100": "德宏傣族景颇族自治州", "533300": "怒江傈僳族自治州", "533400": "迪庆藏族自治州", "540100": "拉萨市", "540200": "日喀则市", "540300": "昌都市", "540400": "林芝市", "540500": "山南市", "540600": "那曲市", "542500": "阿里地区", "610100": "西安市", "610200": "铜川市", "610300": "宝鸡市", "610400": "咸阳市", "610500": "渭南市", "610600": "延安市", "610700": "汉中市", "610800": "榆林市", "610900": "安康市", "611000": "商洛市", "620100": "兰州市", "620200": "嘉峪关市", "620300": "金昌市", "620400": "白银市", "620500": "天水市", "620600": "武威市", "620700": "张掖市", "620800": "平凉市", "620900": "酒泉市", "621000": "庆阳市", "621100": "定西市", "621200": "陇南市", "622900": "临夏回族自治州", "623000": "甘南藏族自治州", "630100": "西宁市", "630200": "海东市", "632200": "海北藏族自治州", "632300": "黄南藏族自治州", "632500": "海南藏族自治州", "632600": "果洛藏族自治州", "632700": "玉树藏族自治州", "632800": "海西蒙古族藏族自治州", "640100": "银川市", "640200": "石嘴山市", "640300": "吴忠市", "640400": "固原市", "640500": "中卫市", "650100": "乌鲁木齐市", "650200": "克拉玛依市", "650400": "吐鲁番市", "650500": "哈密市", "652300": "昌吉回族自治州", "652700": "博尔塔拉蒙古自治州", "652800": "巴音郭楞蒙古自治州", "652900": "阿克苏地区", "653000": "克孜勒苏柯尔克孜自治州", "653100": "喀什地区", "653200": "和田地区", "654000": "伊犁哈萨克自治州", "654200": "塔城地区", "654300": "阿勒泰地区", "659000": "直辖县级行政区", "714402": "彰化县", "717531": "新北市", "719868": "澎湖县", "720118": "屏东县", "722024": "臺中市", "725488": "臺南市", "727730": "臺北市", "729928": "臺东县", "730843": "桃园市", "734179": "宜兰县", "736051": "南投县", "737856": "南海岛", "737861": "苗栗县", "739957": "嘉义市", "740510": "嘉义县", "742126": "新竹市", "742636": "新竹县", "743938": "花莲县", "745674": "高雄市", "748553": "基隆市", "749571": "金门县", "749930": "连江县", "749957": "云林县", "752150": "香港特别行政区", "752169": "澳门特别行政区" },
+      district_list: { "110101": "东城区", "110102": "西城区", "110105": "朝阳区", "110106": "丰台区", "110107": "石景山区", "110108": "海淀区", "110109": "门头沟区", "110111": "房山区", "110112": "通州区", "110113": "顺义区", "110114": "昌平区", "110115": "大兴区", "110116": "怀柔区", "110117": "平谷区", "110118": "密云区", "110119": "延庆区", "120101": "和平区", "120102": "河东区", "120103": "河西区", "120104": "南开区", "120105": "河北区", "120106": "红桥区", "120110": "东丽区", "120111": "西青区", "120112": "津南区", "120113": "北辰区", "120114": "武清区", "120115": "宝坻区", "120116": "滨海新区", "120117": "宁河区", "120118": "静海区", "120119": "蓟州区", "130102": "长安区", "130104": "桥西区", "130105": "新华区", "130107": "井陉矿区", "130108": "裕华区", "130109": "藁城区", "130110": "鹿泉区", "130111": "栾城区", "130121": "井陉县", "130123": "正定县", "130125": "行唐县", "130126": "灵寿县", "130127": "高邑县", "130128": "深泽县", "130129": "赞皇县", "130130": "无极县", "130131": "平山县", "130132": "元氏县", "130133": "赵县", "130181": "辛集市", "130183": "晋州市", "130184": "新乐市", "130202": "路南区", "130203": "路北区", "130204": "古冶区", "130205": "开平区", "130207": "丰南区", "130208": "丰润区", "130209": "曹妃甸区", "130224": "滦南县", "130225": "乐亭县", "130227": "迁西县", "130229": "玉田县", "130281": "遵化市", "130283": "迁安市", "130284": "滦州市", "130302": "海港区", "130303": "山海关区", "130304": "北戴河区", "130306": "抚宁区", "130321": "青龙满族自治县", "130322": "昌黎县", "130324": "卢龙县", "130402": "邯山区", "130403": "丛台区", "130404": "复兴区", "130406": "峰峰矿区", "130407": "肥乡区", "130408": "永年区", "130423": "临漳县", "130424": "成安县", "130425": "大名县", "130426": "涉县", "130427": "磁县", "130430": "邱县", "130431": "鸡泽县", "130432": "广平县", "130433": "馆陶县", "130434": "魏县", "130435": "曲周县", "130481": "武安市", "130502": "襄都区", "130503": "信都区", "130505": "任泽区", "130506": "南和区", "130522": "临城县", "130523": "内丘县", "130524": "柏乡县", "130525": "隆尧县", "130528": "宁晋县", "130529": "巨鹿县", "130530": "新河县", "130531": "广宗县", "130532": "平乡县", "130533": "威县", "130534": "清河县", "130535": "临西县", "130581": "南宫市", "130582": "沙河市", "130602": "竞秀区", "130606": "莲池区", "130607": "满城区", "130608": "清苑区", "130609": "徐水区", "130623": "涞水县", "130624": "阜平县", "130626": "定兴县", "130627": "唐县", "130628": "高阳县", "130629": "容城县", "130630": "涞源县", "130631": "望都县", "130632": "安新县", "130633": "易县", "130634": "曲阳县", "130635": "蠡县", "130636": "顺平县", "130637": "博野县", "130638": "雄县", "130681": "涿州市", "130682": "定州市", "130683": "安国市", "130684": "高碑店市", "130702": "桥东区", "130703": "桥西区", "130705": "宣化区", "130706": "下花园区", "130708": "万全区", "130709": "崇礼区", "130722": "张北县", "130723": "康保县", "130724": "沽源县", "130725": "尚义县", "130726": "蔚县", "130727": "阳原县", "130728": "怀安县", "130730": "怀来县", "130731": "涿鹿县", "130732": "赤城县", "130802": "双桥区", "130803": "双滦区", "130804": "鹰手营子矿区", "130821": "承德县", "130822": "兴隆县", "130824": "滦平县", "130825": "隆化县", "130826": "丰宁满族自治县", "130827": "宽城满族自治县", "130828": "围场满族蒙古族自治县", "130881": "平泉市", "130902": "新华区", "130903": "运河区", "130921": "沧县", "130922": "青县", "130923": "东光县", "130924": "海兴县", "130925": "盐山县", "130926": "肃宁县", "130927": "南皮县", "130928": "吴桥县", "130929": "献县", "130930": "孟村回族自治县", "130981": "泊头市", "130982": "任丘市", "130983": "黄骅市", "130984": "河间市", "131002": "安次区", "131003": "广阳区", "131022": "固安县", "131023": "永清县", "131024": "香河县", "131025": "大城县", "131026": "文安县", "131028": "大厂回族自治县", "131081": "霸州市", "131082": "三河市", "131102": "桃城区", "131103": "冀州区", "131121": "枣强县", "131122": "武邑县", "131123": "武强县", "131124": "饶阳县", "131125": "安平县", "131126": "故城县", "131127": "景县", "131128": "阜城县", "131182": "深州市", "140105": "小店区", "140106": "迎泽区", "140107": "杏花岭区", "140108": "尖草坪区", "140109": "万柏林区", "140110": "晋源区", "140121": "清徐县", "140122": "阳曲县", "140123": "娄烦县", "140181": "古交市", "140212": "新荣区", "140213": "平城区", "140214": "云冈区", "140215": "云州区", "140221": "阳高县", "140222": "天镇县", "140223": "广灵县", "140224": "灵丘县", "140225": "浑源县", "140226": "左云县", "140302": "城区", "140303": "矿区", "140311": "郊区", "140321": "平定县", "140322": "盂县", "140403": "潞州区", "140404": "上党区", "140405": "屯留区", "140406": "潞城区", "140423": "襄垣县", "140425": "平顺县", "140426": "黎城县", "140427": "壶关县", "140428": "长子县", "140429": "武乡县", "140430": "沁县", "140431": "沁源县", "140502": "城区", "140521": "沁水县", "140522": "阳城县", "140524": "陵川县", "140525": "泽州县", "140581": "高平市", "140602": "朔城区", "140603": "平鲁区", "140621": "山阴县", "140622": "应县", "140623": "右玉县", "140681": "怀仁市", "140702": "榆次区", "140703": "太谷区", "140721": "榆社县", "140722": "左权县", "140723": "和顺县", "140724": "昔阳县", "140725": "寿阳县", "140727": "祁县", "140728": "平遥县", "140729": "灵石县", "140781": "介休市", "140802": "盐湖区", "140821": "临猗县", "140822": "万荣县", "140823": "闻喜县", "140824": "稷山县", "140825": "新绛县", "140826": "绛县", "140827": "垣曲县", "140828": "夏县", "140829": "平陆县", "140830": "芮城县", "140881": "永济市", "140882": "河津市", "140902": "忻府区", "140921": "定襄县", "140922": "五台县", "140923": "代县", "140924": "繁峙县", "140925": "宁武县", "140926": "静乐县", "140927": "神池县", "140928": "五寨县", "140929": "岢岚县", "140930": "河曲县", "140931": "保德县", "140932": "偏关县", "140981": "原平市", "141002": "尧都区", "141021": "曲沃县", "141022": "翼城县", "141023": "襄汾县", "141024": "洪洞县", "141025": "古县", "141026": "安泽县", "141027": "浮山县", "141028": "吉县", "141029": "乡宁县", "141030": "大宁县", "141031": "隰县", "141032": "永和县", "141033": "蒲县", "141034": "汾西县", "141081": "侯马市", "141082": "霍州市", "141102": "离石区", "141121": "文水县", "141122": "交城县", "141123": "兴县", "141124": "临县", "141125": "柳林县", "141126": "石楼县", "141127": "岚县", "141128": "方山县", "141129": "中阳县", "141130": "交口县", "141181": "孝义市", "141182": "汾阳市", "150102": "新城区", "150103": "回民区", "150104": "玉泉区", "150105": "赛罕区", "150121": "土默特左旗", "150122": "托克托县", "150123": "和林格尔县", "150124": "清水河县", "150125": "武川县", "150202": "东河区", "150203": "昆都仑区", "150204": "青山区", "150205": "石拐区", "150206": "白云鄂博矿区", "150207": "九原区", "150221": "土默特右旗", "150222": "固阳县", "150223": "达尔罕茂明安联合旗", "150302": "海勃湾区", "150303": "海南区", "150304": "乌达区", "150402": "红山区", "150403": "元宝山区", "150404": "松山区", "150421": "阿鲁科尔沁旗", "150422": "巴林左旗", "150423": "巴林右旗", "150424": "林西县", "150425": "克什克腾旗", "150426": "翁牛特旗", "150428": "喀喇沁旗", "150429": "宁城县", "150430": "敖汉旗", "150502": "科尔沁区", "150521": "科尔沁左翼中旗", "150522": "科尔沁左翼后旗", "150523": "开鲁县", "150524": "库伦旗", "150525": "奈曼旗", "150526": "扎鲁特旗", "150581": "霍林郭勒市", "150602": "东胜区", "150603": "康巴什区", "150621": "达拉特旗", "150622": "准格尔旗", "150623": "鄂托克前旗", "150624": "鄂托克旗", "150625": "杭锦旗", "150626": "乌审旗", "150627": "伊金霍洛旗", "150702": "海拉尔区", "150703": "扎赉诺尔区", "150721": "阿荣旗", "150722": "莫力达瓦达斡尔族自治旗", "150723": "鄂伦春自治旗", "150724": "鄂温克族自治旗", "150725": "陈巴尔虎旗", "150726": "新巴尔虎左旗", "150727": "新巴尔虎右旗", "150781": "满洲里市", "150782": "牙克石市", "150783": "扎兰屯市", "150784": "额尔古纳市", "150785": "根河市", "150802": "临河区", "150821": "五原县", "150822": "磴口县", "150823": "乌拉特前旗", "150824": "乌拉特中旗", "150825": "乌拉特后旗", "150826": "杭锦后旗", "150902": "集宁区", "150921": "卓资县", "150922": "化德县", "150923": "商都县", "150924": "兴和县", "150925": "凉城县", "150926": "察哈尔右翼前旗", "150927": "察哈尔右翼中旗", "150928": "察哈尔右翼后旗", "150929": "四子王旗", "150981": "丰镇市", "152201": "乌兰浩特市", "152202": "阿尔山市", "152221": "科尔沁右翼前旗", "152222": "科尔沁右翼中旗", "152223": "扎赉特旗", "152224": "突泉县", "152501": "二连浩特市", "152502": "锡林浩特市", "152522": "阿巴嘎旗", "152523": "苏尼特左旗", "152524": "苏尼特右旗", "152525": "东乌珠穆沁旗", "152526": "西乌珠穆沁旗", "152527": "太仆寺旗", "152528": "镶黄旗", "152529": "正镶白旗", "152530": "正蓝旗", "152531": "多伦县", "152921": "阿拉善左旗", "152922": "阿拉善右旗", "152923": "额济纳旗", "210102": "和平区", "210103": "沈河区", "210104": "大东区", "210105": "皇姑区", "210106": "铁西区", "210111": "苏家屯区", "210112": "浑南区", "210113": "沈北新区", "210114": "于洪区", "210115": "辽中区", "210123": "康平县", "210124": "法库县", "210181": "新民市", "210202": "中山区", "210203": "西岗区", "210204": "沙河口区", "210211": "甘井子区", "210212": "旅顺口区", "210213": "金州区", "210214": "普兰店区", "210224": "长海县", "210281": "瓦房店市", "210283": "庄河市", "210302": "铁东区", "210303": "铁西区", "210304": "立山区", "210311": "千山区", "210321": "台安县", "210323": "岫岩满族自治县", "210381": "海城市", "210402": "新抚区", "210403": "东洲区", "210404": "望花区", "210411": "顺城区", "210421": "抚顺县", "210422": "新宾满族自治县", "210423": "清原满族自治县", "210502": "平山区", "210503": "溪湖区", "210504": "明山区", "210505": "南芬区", "210521": "本溪满族自治县", "210522": "桓仁满族自治县", "210602": "元宝区", "210603": "振兴区", "210604": "振安区", "210624": "宽甸满族自治县", "210681": "东港市", "210682": "凤城市", "210702": "古塔区", "210703": "凌河区", "210711": "太和区", "210726": "黑山县", "210727": "义县", "210781": "凌海市", "210782": "北镇市", "210802": "站前区", "210803": "西市区", "210804": "鲅鱼圈区", "210811": "老边区", "210881": "盖州市", "210882": "大石桥市", "210902": "海州区", "210903": "新邱区", "210904": "太平区", "210905": "清河门区", "210911": "细河区", "210921": "阜新蒙古族自治县", "210922": "彰武县", "211002": "白塔区", "211003": "文圣区", "211004": "宏伟区", "211005": "弓长岭区", "211011": "太子河区", "211021": "辽阳县", "211081": "灯塔市", "211102": "双台子区", "211103": "兴隆台区", "211104": "大洼区", "211122": "盘山县", "211202": "银州区", "211204": "清河区", "211221": "铁岭县", "211223": "西丰县", "211224": "昌图县", "211281": "调兵山市", "211282": "开原市", "211302": "双塔区", "211303": "龙城区", "211321": "朝阳县", "211322": "建平县", "211324": "喀喇沁左翼蒙古族自治县", "211381": "北票市", "211382": "凌源市", "211402": "连山区", "211403": "龙港区", "211404": "南票区", "211421": "绥中县", "211422": "建昌县", "211481": "兴城市", "220102": "南关区", "220103": "宽城区", "220104": "朝阳区", "220105": "二道区", "220106": "绿园区", "220112": "双阳区", "220113": "九台区", "220122": "农安县", "220182": "榆树市", "220183": "德惠市", "220184": "公主岭市", "220202": "昌邑区", "220203": "龙潭区", "220204": "船营区", "220211": "丰满区", "220221": "永吉县", "220281": "蛟河市", "220282": "桦甸市", "220283": "舒兰市", "220284": "磐石市", "220302": "铁西区", "220303": "铁东区", "220322": "梨树县", "220323": "伊通满族自治县", "220382": "双辽市", "220402": "龙山区", "220403": "西安区", "220421": "东丰县", "220422": "东辽县", "220502": "东昌区", "220503": "二道江区", "220521": "通化县", "220523": "辉南县", "220524": "柳河县", "220581": "梅河口市", "220582": "集安市", "220602": "浑江区", "220605": "江源区", "220621": "抚松县", "220622": "靖宇县", "220623": "长白朝鲜族自治县", "220681": "临江市", "220702": "宁江区", "220721": "前郭尔罗斯蒙古族自治县", "220722": "长岭县", "220723": "乾安县", "220781": "扶余市", "220802": "洮北区", "220821": "镇赉县", "220822": "通榆县", "220881": "洮南市", "220882": "大安市", "222401": "延吉市", "222402": "图们市", "222403": "敦化市", "222404": "珲春市", "222405": "龙井市", "222406": "和龙市", "222424": "汪清县", "222426": "安图县", "230102": "道里区", "230103": "南岗区", "230104": "道外区", "230108": "平房区", "230109": "松北区", "230110": "香坊区", "230111": "呼兰区", "230112": "阿城区", "230113": "双城区", "230123": "依兰县", "230124": "方正县", "230125": "宾县", "230126": "巴彦县", "230127": "木兰县", "230128": "通河县", "230129": "延寿县", "230183": "尚志市", "230184": "五常市", "230202": "龙沙区", "230203": "建华区", "230204": "铁锋区", "230205": "昂昂溪区", "230206": "富拉尔基区", "230207": "碾子山区", "230208": "梅里斯达斡尔族区", "230221": "龙江县", "230223": "依安县", "230224": "泰来县", "230225": "甘南县", "230227": "富裕县", "230229": "克山县", "230230": "克东县", "230231": "拜泉县", "230281": "讷河市", "230302": "鸡冠区", "230303": "恒山区", "230304": "滴道区", "230305": "梨树区", "230306": "城子河区", "230307": "麻山区", "230321": "鸡东县", "230381": "虎林市", "230382": "密山市", "230402": "向阳区", "230403": "工农区", "230404": "南山区", "230405": "兴安区", "230406": "东山区", "230407": "兴山区", "230421": "萝北县", "230422": "绥滨县", "230502": "尖山区", "230503": "岭东区", "230505": "四方台区", "230506": "宝山区", "230521": "集贤县", "230522": "友谊县", "230523": "宝清县", "230524": "饶河县", "230602": "萨尔图区", "230603": "龙凤区", "230604": "让胡路区", "230605": "红岗区", "230606": "大同区", "230621": "肇州县", "230622": "肇源县", "230623": "林甸县", "230624": "杜尔伯特蒙古族自治县", "230717": "伊美区", "230718": "乌翠区", "230719": "友好区", "230722": "嘉荫县", "230723": "汤旺县", "230724": "丰林县", "230725": "大箐山县", "230726": "南岔县", "230751": "金林区", "230781": "铁力市", "230803": "向阳区", "230804": "前进区", "230805": "东风区", "230811": "郊区", "230822": "桦南县", "230826": "桦川县", "230828": "汤原县", "230881": "同江市", "230882": "富锦市", "230883": "抚远市", "230902": "新兴区", "230903": "桃山区", "230904": "茄子河区", "230921": "勃利县", "231002": "东安区", "231003": "阳明区", "231004": "爱民区", "231005": "西安区", "231025": "林口县", "231081": "绥芬河市", "231083": "海林市", "231084": "宁安市", "231085": "穆棱市", "231086": "东宁市", "231102": "爱辉区", "231123": "逊克县", "231124": "孙吴县", "231181": "北安市", "231182": "五大连池市", "231183": "嫩江市", "231202": "北林区", "231221": "望奎县", "231222": "兰西县", "231223": "青冈县", "231224": "庆安县", "231225": "明水县", "231226": "绥棱县", "231281": "安达市", "231282": "肇东市", "231283": "海伦市", "232701": "漠河市", "232721": "呼玛县", "232722": "塔河县", "310101": "黄浦区", "310104": "徐汇区", "310105": "长宁区", "310106": "静安区", "310107": "普陀区", "310109": "虹口区", "310110": "杨浦区", "310112": "闵行区", "310113": "宝山区", "310114": "嘉定区", "310115": "浦东新区", "310116": "金山区", "310117": "松江区", "310118": "青浦区", "310120": "奉贤区", "310151": "崇明区", "320102": "玄武区", "320104": "秦淮区", "320105": "建邺区", "320106": "鼓楼区", "320111": "浦口区", "320113": "栖霞区", "320114": "雨花台区", "320115": "江宁区", "320116": "六合区", "320117": "溧水区", "320118": "高淳区", "320205": "锡山区", "320206": "惠山区", "320211": "滨湖区", "320213": "梁溪区", "320214": "新吴区", "320281": "江阴市", "320282": "宜兴市", "320302": "鼓楼区", "320303": "云龙区", "320305": "贾汪区", "320311": "泉山区", "320312": "铜山区", "320321": "丰县", "320322": "沛县", "320324": "睢宁县", "320381": "新沂市", "320382": "邳州市", "320402": "天宁区", "320404": "钟楼区", "320411": "新北区", "320412": "武进区", "320413": "金坛区", "320481": "溧阳市", "320505": "虎丘区", "320506": "吴中区", "320507": "相城区", "320508": "姑苏区", "320509": "吴江区", "320581": "常熟市", "320582": "张家港市", "320583": "昆山市", "320585": "太仓市", "320602": "崇川区", "320611": "港闸区", "320612": "通州区", "320623": "如东县", "320681": "启东市", "320682": "如皋市", "320684": "海门市", "320685": "海安市", "320703": "连云区", "320706": "海州区", "320707": "赣榆区", "320722": "东海县", "320723": "灌云县", "320724": "灌南县", "320803": "淮安区", "320804": "淮阴区", "320812": "清江浦区", "320813": "洪泽区", "320826": "涟水县", "320830": "盱眙县", "320831": "金湖县", "320902": "亭湖区", "320903": "盐都区", "320904": "大丰区", "320921": "响水县", "320922": "滨海县", "320923": "阜宁县", "320924": "射阳县", "320925": "建湖县", "320981": "东台市", "321002": "广陵区", "321003": "邗江区", "321012": "江都区", "321023": "宝应县", "321081": "仪征市", "321084": "高邮市", "321102": "京口区", "321111": "润州区", "321112": "丹徒区", "321181": "丹阳市", "321182": "扬中市", "321183": "句容市", "321202": "海陵区", "321203": "高港区", "321204": "姜堰区", "321281": "兴化市", "321282": "靖江市", "321283": "泰兴市", "321302": "宿城区", "321311": "宿豫区", "321322": "沭阳县", "321323": "泗阳县", "321324": "泗洪县", "330102": "上城区", "330103": "下城区", "330104": "江干区", "330105": "拱墅区", "330106": "西湖区", "330108": "滨江区", "330109": "萧山区", "330110": "余杭区", "330111": "富阳区", "330112": "临安区", "330122": "桐庐县", "330127": "淳安县", "330182": "建德市", "330203": "海曙区", "330205": "江北区", "330206": "北仑区", "330211": "镇海区", "330212": "鄞州区", "330213": "奉化区", "330225": "象山县", "330226": "宁海县", "330281": "余姚市", "330282": "慈溪市", "330302": "鹿城区", "330303": "龙湾区", "330304": "瓯海区", "330305": "洞头区", "330324": "永嘉县", "330326": "平阳县", "330327": "苍南县", "330328": "文成县", "330329": "泰顺县", "330381": "瑞安市", "330382": "乐清市", "330383": "龙港市", "330402": "南湖区", "330411": "秀洲区", "330421": "嘉善县", "330424": "海盐县", "330481": "海宁市", "330482": "平湖市", "330483": "桐乡市", "330502": "吴兴区", "330503": "南浔区", "330521": "德清县", "330522": "长兴县", "330523": "安吉县", "330602": "越城区", "330603": "柯桥区", "330604": "上虞区", "330624": "新昌县", "330681": "诸暨市", "330683": "嵊州市", "330702": "婺城区", "330703": "金东区", "330723": "武义县", "330726": "浦江县", "330727": "磐安县", "330781": "兰溪市", "330782": "义乌市", "330783": "东阳市", "330784": "永康市", "330802": "柯城区", "330803": "衢江区", "330822": "常山县", "330824": "开化县", "330825": "龙游县", "330881": "江山市", "330902": "定海区", "330903": "普陀区", "330921": "岱山县", "330922": "嵊泗县", "331002": "椒江区", "331003": "黄岩区", "331004": "路桥区", "331022": "三门县", "331023": "天台县", "331024": "仙居县", "331081": "温岭市", "331082": "临海市", "331083": "玉环市", "331102": "莲都区", "331121": "青田县", "331122": "缙云县", "331123": "遂昌县", "331124": "松阳县", "331125": "云和县", "331126": "庆元县", "331127": "景宁畲族自治县", "331181": "龙泉市", "340102": "瑶海区", "340103": "庐阳区", "340104": "蜀山区", "340111": "包河区", "340121": "长丰县", "340122": "肥东县", "340123": "肥西县", "340124": "庐江县", "340181": "巢湖市", "340202": "镜湖区", "340207": "鸠江区", "340209": "弋江区", "340210": "湾沚区", "340211": "繁昌区", "340223": "南陵县", "340281": "无为市", "340302": "龙子湖区", "340303": "蚌山区", "340304": "禹会区", "340311": "淮上区", "340321": "怀远县", "340322": "五河县", "340323": "固镇县", "340402": "大通区", "340403": "田家庵区", "340404": "谢家集区", "340405": "八公山区", "340406": "潘集区", "340421": "凤台县", "340422": "寿县", "340503": "花山区", "340504": "雨山区", "340506": "博望区", "340521": "当涂县", "340522": "含山县", "340523": "和县", "340602": "杜集区", "340603": "相山区", "340604": "烈山区", "340621": "濉溪县", "340705": "铜官区", "340706": "义安区", "340711": "郊区", "340722": "枞阳县", "340802": "迎江区", "340803": "大观区", "340811": "宜秀区", "340822": "怀宁县", "340825": "太湖县", "340826": "宿松县", "340827": "望江县", "340828": "岳西县", "340881": "桐城市", "340882": "潜山市", "341002": "屯溪区", "341003": "黄山区", "341004": "徽州区", "341021": "歙县", "341022": "休宁县", "341023": "黟县", "341024": "祁门县", "341102": "琅琊区", "341103": "南谯区", "341122": "来安县", "341124": "全椒县", "341125": "定远县", "341126": "凤阳县", "341181": "天长市", "341182": "明光市", "341202": "颍州区", "341203": "颍东区", "341204": "颍泉区", "341221": "临泉县", "341222": "太和县", "341225": "阜南县", "341226": "颍上县", "341282": "界首市", "341302": "埇桥区", "341321": "砀山县", "341322": "萧县", "341323": "灵璧县", "341324": "泗县", "341502": "金安区", "341503": "裕安区", "341504": "叶集区", "341522": "霍邱县", "341523": "舒城县", "341524": "金寨县", "341525": "霍山县", "341602": "谯城区", "341621": "涡阳县", "341622": "蒙城县", "341623": "利辛县", "341702": "贵池区", "341721": "东至县", "341722": "石台县", "341723": "青阳县", "341802": "宣州区", "341821": "郎溪县", "341823": "泾县", "341824": "绩溪县", "341825": "旌德县", "341881": "宁国市", "341882": "广德市", "350102": "鼓楼区", "350103": "台江区", "350104": "仓山区", "350105": "马尾区", "350111": "晋安区", "350112": "长乐区", "350121": "闽侯县", "350122": "连江县", "350123": "罗源县", "350124": "闽清县", "350125": "永泰县", "350128": "平潭县", "350181": "福清市", "350203": "思明区", "350205": "海沧区", "350206": "湖里区", "350211": "集美区", "350212": "同安区", "350213": "翔安区", "350302": "城厢区", "350303": "涵江区", "350304": "荔城区", "350305": "秀屿区", "350322": "仙游县", "350402": "梅列区", "350403": "三元区", "350421": "明溪县", "350423": "清流县", "350424": "宁化县", "350425": "大田县", "350426": "尤溪县", "350427": "沙县", "350428": "将乐县", "350429": "泰宁县", "350430": "建宁县", "350481": "永安市", "350502": "鲤城区", "350503": "丰泽区", "350504": "洛江区", "350505": "泉港区", "350521": "惠安县", "350524": "安溪县", "350525": "永春县", "350526": "德化县", "350527": "金门县", "350581": "石狮市", "350582": "晋江市", "350583": "南安市", "350602": "芗城区", "350603": "龙文区", "350622": "云霄县", "350623": "漳浦县", "350624": "诏安县", "350625": "长泰县", "350626": "东山县", "350627": "南靖县", "350628": "平和县", "350629": "华安县", "350681": "龙海市", "350702": "延平区", "350703": "建阳区", "350721": "顺昌县", "350722": "浦城县", "350723": "光泽县", "350724": "松溪县", "350725": "政和县", "350781": "邵武市", "350782": "武夷山市", "350783": "建瓯市", "350802": "新罗区", "350803": "永定区", "350821": "长汀县", "350823": "上杭县", "350824": "武平县", "350825": "连城县", "350881": "漳平市", "350902": "蕉城区", "350921": "霞浦县", "350922": "古田县", "350923": "屏南县", "350924": "寿宁县", "350925": "周宁县", "350926": "柘荣县", "350981": "福安市", "350982": "福鼎市", "360102": "东湖区", "360103": "西湖区", "360104": "青云谱区", "360111": "青山湖区", "360112": "新建区", "360113": "红谷滩区", "360121": "南昌县", "360123": "安义县", "360124": "进贤县", "360202": "昌江区", "360203": "珠山区", "360222": "浮梁县", "360281": "乐平市", "360302": "安源区", "360313": "湘东区", "360321": "莲花县", "360322": "上栗县", "360323": "芦溪县", "360402": "濂溪区", "360403": "浔阳区", "360404": "柴桑区", "360423": "武宁县", "360424": "修水县", "360425": "永修县", "360426": "德安县", "360428": "都昌县", "360429": "湖口县", "360430": "彭泽县", "360481": "瑞昌市", "360482": "共青城市", "360483": "庐山市", "360502": "渝水区", "360521": "分宜县", "360602": "月湖区", "360603": "余江区", "360681": "贵溪市", "360702": "章贡区", "360703": "南康区", "360704": "赣县区", "360722": "信丰县", "360723": "大余县", "360724": "上犹县", "360725": "崇义县", "360726": "安远县", "360728": "定南县", "360729": "全南县", "360730": "宁都县", "360731": "于都县", "360732": "兴国县", "360733": "会昌县", "360734": "寻乌县", "360735": "石城县", "360781": "瑞金市", "360783": "龙南市", "360802": "吉州区", "360803": "青原区", "360821": "吉安县", "360822": "吉水县", "360823": "峡江县", "360824": "新干县", "360825": "永丰县", "360826": "泰和县", "360827": "遂川县", "360828": "万安县", "360829": "安福县", "360830": "永新县", "360881": "井冈山市", "360902": "袁州区", "360921": "奉新县", "360922": "万载县", "360923": "上高县", "360924": "宜丰县", "360925": "靖安县", "360926": "铜鼓县", "360981": "丰城市", "360982": "樟树市", "360983": "高安市", "361002": "临川区", "361003": "东乡区", "361021": "南城县", "361022": "黎川县", "361023": "南丰县", "361024": "崇仁县", "361025": "乐安县", "361026": "宜黄县", "361027": "金溪县", "361028": "资溪县", "361030": "广昌县", "361102": "信州区", "361103": "广丰区", "361104": "广信区", "361123": "玉山县", "361124": "铅山县", "361125": "横峰县", "361126": "弋阳县", "361127": "余干县", "361128": "鄱阳县", "361129": "万年县", "361130": "婺源县", "361181": "德兴市", "370102": "历下区", "370103": "市中区", "370104": "槐荫区", "370105": "天桥区", "370112": "历城区", "370113": "长清区", "370114": "章丘区", "370115": "济阳区", "370116": "莱芜区", "370117": "钢城区", "370124": "平阴县", "370126": "商河县", "370202": "市南区", "370203": "市北区", "370211": "黄岛区", "370212": "崂山区", "370213": "李沧区", "370214": "城阳区", "370215": "即墨区", "370281": "胶州市", "370283": "平度市", "370285": "莱西市", "370302": "淄川区", "370303": "张店区", "370304": "博山区", "370305": "临淄区", "370306": "周村区", "370321": "桓台县", "370322": "高青县", "370323": "沂源县", "370402": "市中区", "370403": "薛城区", "370404": "峄城区", "370405": "台儿庄区", "370406": "山亭区", "370481": "滕州市", "370502": "东营区", "370503": "河口区", "370505": "垦利区", "370522": "利津县", "370523": "广饶县", "370602": "芝罘区", "370611": "福山区", "370612": "牟平区", "370613": "莱山区", "370614": "蓬莱区", "370681": "龙口市", "370682": "莱阳市", "370683": "莱州市", "370685": "招远市", "370686": "栖霞市", "370687": "海阳市", "370702": "潍城区", "370703": "寒亭区", "370704": "坊子区", "370705": "奎文区", "370724": "临朐县", "370725": "昌乐县", "370781": "青州市", "370782": "诸城市", "370783": "寿光市", "370784": "安丘市", "370785": "高密市", "370786": "昌邑市", "370811": "任城区", "370812": "兖州区", "370826": "微山县", "370827": "鱼台县", "370828": "金乡县", "370829": "嘉祥县", "370830": "汶上县", "370831": "泗水县", "370832": "梁山县", "370881": "曲阜市", "370883": "邹城市", "370902": "泰山区", "370911": "岱岳区", "370921": "宁阳县", "370923": "东平县", "370982": "新泰市", "370983": "肥城市", "371002": "环翠区", "371003": "文登区", "371082": "荣成市", "371083": "乳山市", "371102": "东港区", "371103": "岚山区", "371121": "五莲县", "371122": "莒县", "371302": "兰山区", "371311": "罗庄区", "371312": "河东区", "371321": "沂南县", "371322": "郯城县", "371323": "沂水县", "371324": "兰陵县", "371325": "费县", "371326": "平邑县", "371327": "莒南县", "371328": "蒙阴县", "371329": "临沭县", "371402": "德城区", "371403": "陵城区", "371422": "宁津县", "371423": "庆云县", "371424": "临邑县", "371425": "齐河县", "371426": "平原县", "371427": "夏津县", "371428": "武城县", "371481": "乐陵市", "371482": "禹城市", "371502": "东昌府区", "371503": "茌平区", "371521": "阳谷县", "371522": "莘县", "371524": "东阿县", "371525": "冠县", "371526": "高唐县", "371581": "临清市", "371602": "滨城区", "371603": "沾化区", "371621": "惠民县", "371622": "阳信县", "371623": "无棣县", "371625": "博兴县", "371681": "邹平市", "371702": "牡丹区", "371703": "定陶区", "371721": "曹县", "371722": "单县", "371723": "成武县", "371724": "巨野县", "371725": "郓城县", "371726": "鄄城县", "371728": "东明县", "410102": "中原区", "410103": "二七区", "410104": "管城回族区", "410105": "金水区", "410106": "上街区", "410108": "惠济区", "410122": "中牟县", "410181": "巩义市", "410182": "荥阳市", "410183": "新密市", "410184": "新郑市", "410185": "登封市", "410202": "龙亭区", "410203": "顺河回族区", "410204": "鼓楼区", "410205": "禹王台区", "410212": "祥符区", "410221": "杞县", "410222": "通许县", "410223": "尉氏县", "410225": "兰考县", "410302": "老城区", "410303": "西工区", "410304": "瀍河回族区", "410305": "涧西区", "410306": "吉利区", "410311": "洛龙区", "410322": "孟津县", "410323": "新安县", "410324": "栾川县", "410325": "嵩县", "410326": "汝阳县", "410327": "宜阳县", "410328": "洛宁县", "410329": "伊川县", "410381": "偃师市", "410402": "新华区", "410403": "卫东区", "410404": "石龙区", "410411": "湛河区", "410421": "宝丰县", "410422": "叶县", "410423": "鲁山县", "410425": "郏县", "410481": "舞钢市", "410482": "汝州市", "410502": "文峰区", "410503": "北关区", "410505": "殷都区", "410506": "龙安区", "410522": "安阳县", "410523": "汤阴县", "410526": "滑县", "410527": "内黄县", "410581": "林州市", "410602": "鹤山区", "410603": "山城区", "410611": "淇滨区", "410621": "浚县", "410622": "淇县", "410702": "红旗区", "410703": "卫滨区", "410704": "凤泉区", "410711": "牧野区", "410721": "新乡县", "410724": "获嘉县", "410725": "原阳县", "410726": "延津县", "410727": "封丘县", "410781": "卫辉市", "410782": "辉县市", "410783": "长垣市", "410802": "解放区", "410803": "中站区", "410804": "马村区", "410811": "山阳区", "410821": "修武县", "410822": "博爱县", "410823": "武陟县", "410825": "温县", "410882": "沁阳市", "410883": "孟州市", "410902": "华龙区", "410922": "清丰县", "410923": "南乐县", "410926": "范县", "410927": "台前县", "410928": "濮阳县", "411002": "魏都区", "411003": "建安区", "411024": "鄢陵县", "411025": "襄城县", "411081": "禹州市", "411082": "长葛市", "411102": "源汇区", "411103": "郾城区", "411104": "召陵区", "411121": "舞阳县", "411122": "临颍县", "411202": "湖滨区", "411203": "陕州区", "411221": "渑池县", "411224": "卢氏县", "411281": "义马市", "411282": "灵宝市", "411302": "宛城区", "411303": "卧龙区", "411321": "南召县", "411322": "方城县", "411323": "西峡县", "411324": "镇平县", "411325": "内乡县", "411326": "淅川县", "411327": "社旗县", "411328": "唐河县", "411329": "新野县", "411330": "桐柏县", "411381": "邓州市", "411402": "梁园区", "411403": "睢阳区", "411421": "民权县", "411422": "睢县", "411423": "宁陵县", "411424": "柘城县", "411425": "虞城县", "411426": "夏邑县", "411481": "永城市", "411502": "浉河区", "411503": "平桥区", "411521": "罗山县", "411522": "光山县", "411523": "新县", "411524": "商城县", "411525": "固始县", "411526": "潢川县", "411527": "淮滨县", "411528": "息县", "411602": "川汇区", "411603": "淮阳区", "411621": "扶沟县", "411622": "西华县", "411623": "商水县", "411624": "沈丘县", "411625": "郸城县", "411627": "太康县", "411628": "鹿邑县", "411681": "项城市", "411702": "驿城区", "411721": "西平县", "411722": "上蔡县", "411723": "平舆县", "411724": "正阳县", "411725": "确山县", "411726": "泌阳县", "411727": "汝南县", "411728": "遂平县", "411729": "新蔡县", "419001": "济源市", "420102": "江岸区", "420103": "江汉区", "420104": "硚口区", "420105": "汉阳区", "420106": "武昌区", "420107": "青山区", "420111": "洪山区", "420112": "东西湖区", "420113": "汉南区", "420114": "蔡甸区", "420115": "江夏区", "420116": "黄陂区", "420117": "新洲区", "420202": "黄石港区", "420203": "西塞山区", "420204": "下陆区", "420205": "铁山区", "420222": "阳新县", "420281": "大冶市", "420302": "茅箭区", "420303": "张湾区", "420304": "郧阳区", "420322": "郧西县", "420323": "竹山县", "420324": "竹溪县", "420325": "房县", "420381": "丹江口市", "420502": "西陵区", "420503": "伍家岗区", "420504": "点军区", "420505": "猇亭区", "420506": "夷陵区", "420525": "远安县", "420526": "兴山县", "420527": "秭归县", "420528": "长阳土家族自治县", "420529": "五峰土家族自治县", "420581": "宜都市", "420582": "当阳市", "420583": "枝江市", "420602": "襄城区", "420606": "樊城区", "420607": "襄州区", "420624": "南漳县", "420625": "谷城县", "420626": "保康县", "420682": "老河口市", "420683": "枣阳市", "420684": "宜城市", "420702": "梁子湖区", "420703": "华容区", "420704": "鄂城区", "420802": "东宝区", "420804": "掇刀区", "420822": "沙洋县", "420881": "钟祥市", "420882": "京山市", "420902": "孝南区", "420921": "孝昌县", "420922": "大悟县", "420923": "云梦县", "420981": "应城市", "420982": "安陆市", "420984": "汉川市", "421002": "沙市区", "421003": "荆州区", "421022": "公安县", "421023": "监利县", "421024": "江陵县", "421081": "石首市", "421083": "洪湖市", "421087": "松滋市", "421102": "黄州区", "421121": "团风县", "421122": "红安县", "421123": "罗田县", "421124": "英山县", "421125": "浠水县", "421126": "蕲春县", "421127": "黄梅县", "421181": "麻城市", "421182": "武穴市", "421202": "咸安区", "421221": "嘉鱼县", "421222": "通城县", "421223": "崇阳县", "421224": "通山县", "421281": "赤壁市", "421303": "曾都区", "421321": "随县", "421381": "广水市", "422801": "恩施市", "422802": "利川市", "422822": "建始县", "422823": "巴东县", "422825": "宣恩县", "422826": "咸丰县", "422827": "来凤县", "422828": "鹤峰县", "429004": "仙桃市", "429005": "潜江市", "429006": "天门市", "429021": "神农架林区", "430102": "芙蓉区", "430103": "天心区", "430104": "岳麓区", "430105": "开福区", "430111": "雨花区", "430112": "望城区", "430121": "长沙县", "430181": "浏阳市", "430182": "宁乡市", "430202": "荷塘区", "430203": "芦淞区", "430204": "石峰区", "430211": "天元区", "430212": "渌口区", "430223": "攸县", "430224": "茶陵县", "430225": "炎陵县", "430281": "醴陵市", "430302": "雨湖区", "430304": "岳塘区", "430321": "湘潭县", "430381": "湘乡市", "430382": "韶山市", "430405": "珠晖区", "430406": "雁峰区", "430407": "石鼓区", "430408": "蒸湘区", "430412": "南岳区", "430421": "衡阳县", "430422": "衡南县", "430423": "衡山县", "430424": "衡东县", "430426": "祁东县", "430481": "耒阳市", "430482": "常宁市", "430502": "双清区", "430503": "大祥区", "430511": "北塔区", "430522": "新邵县", "430523": "邵阳县", "430524": "隆回县", "430525": "洞口县", "430527": "绥宁县", "430528": "新宁县", "430529": "城步苗族自治县", "430581": "武冈市", "430582": "邵东市", "430602": "岳阳楼区", "430603": "云溪区", "430611": "君山区", "430621": "岳阳县", "430623": "华容县", "430624": "湘阴县", "430626": "平江县", "430681": "汨罗市", "430682": "临湘市", "430702": "武陵区", "430703": "鼎城区", "430721": "安乡县", "430722": "汉寿县", "430723": "澧县", "430724": "临澧县", "430725": "桃源县", "430726": "石门县", "430781": "津市市", "430802": "永定区", "430811": "武陵源区", "430821": "慈利县", "430822": "桑植县", "430902": "资阳区", "430903": "赫山区", "430921": "南县", "430922": "桃江县", "430923": "安化县", "430981": "沅江市", "431002": "北湖区", "431003": "苏仙区", "431021": "桂阳县", "431022": "宜章县", "431023": "永兴县", "431024": "嘉禾县", "431025": "临武县", "431026": "汝城县", "431027": "桂东县", "431028": "安仁县", "431081": "资兴市", "431102": "零陵区", "431103": "冷水滩区", "431121": "祁阳县", "431122": "东安县", "431123": "双牌县", "431124": "道县", "431125": "江永县", "431126": "宁远县", "431127": "蓝山县", "431128": "新田县", "431129": "江华瑶族自治县", "431202": "鹤城区", "431221": "中方县", "431222": "沅陵县", "431223": "辰溪县", "431224": "溆浦县", "431225": "会同县", "431226": "麻阳苗族自治县", "431227": "新晃侗族自治县", "431228": "芷江侗族自治县", "431229": "靖州苗族侗族自治县", "431230": "通道侗族自治县", "431281": "洪江市", "431302": "娄星区", "431321": "双峰县", "431322": "新化县", "431381": "冷水江市", "431382": "涟源市", "433101": "吉首市", "433122": "泸溪县", "433123": "凤凰县", "433124": "花垣县", "433125": "保靖县", "433126": "古丈县", "433127": "永顺县", "433130": "龙山县", "440103": "荔湾区", "440104": "越秀区", "440105": "海珠区", "440106": "天河区", "440111": "白云区", "440112": "黄埔区", "440113": "番禺区", "440114": "花都区", "440115": "南沙区", "440117": "从化区", "440118": "增城区", "440203": "武江区", "440204": "浈江区", "440205": "曲江区", "440222": "始兴县", "440224": "仁化县", "440229": "翁源县", "440232": "乳源瑶族自治县", "440233": "新丰县", "440281": "乐昌市", "440282": "南雄市", "440303": "罗湖区", "440304": "福田区", "440305": "南山区", "440306": "宝安区", "440307": "龙岗区", "440308": "盐田区", "440309": "龙华区", "440310": "坪山区", "440311": "光明区", "440402": "香洲区", "440403": "斗门区", "440404": "金湾区", "440507": "龙湖区", "440511": "金平区", "440512": "濠江区", "440513": "潮阳区", "440514": "潮南区", "440515": "澄海区", "440523": "南澳县", "440604": "禅城区", "440605": "南海区", "440606": "顺德区", "440607": "三水区", "440608": "高明区", "440703": "蓬江区", "440704": "江海区", "440705": "新会区", "440781": "台山市", "440783": "开平市", "440784": "鹤山市", "440785": "恩平市", "440802": "赤坎区", "440803": "霞山区", "440804": "坡头区", "440811": "麻章区", "440823": "遂溪县", "440825": "徐闻县", "440881": "廉江市", "440882": "雷州市", "440883": "吴川市", "440902": "茂南区", "440904": "电白区", "440981": "高州市", "440982": "化州市", "440983": "信宜市", "441202": "端州区", "441203": "鼎湖区", "441204": "高要区", "441223": "广宁县", "441224": "怀集县", "441225": "封开县", "441226": "德庆县", "441284": "四会市", "441302": "惠城区", "441303": "惠阳区", "441322": "博罗县", "441323": "惠东县", "441324": "龙门县", "441402": "梅江区", "441403": "梅县区", "441422": "大埔县", "441423": "丰顺县", "441424": "五华县", "441426": "平远县", "441427": "蕉岭县", "441481": "兴宁市", "441502": "城区", "441521": "海丰县", "441523": "陆河县", "441581": "陆丰市", "441602": "源城区", "441621": "紫金县", "441622": "龙川县", "441623": "连平县", "441624": "和平县", "441625": "东源县", "441702": "江城区", "441704": "阳东区", "441721": "阳西县", "441781": "阳春市", "441802": "清城区", "441803": "清新区", "441821": "佛冈县", "441823": "阳山县", "441825": "连山壮族瑶族自治县", "441826": "连南瑶族自治县", "441881": "英德市", "441882": "连州市", "445102": "湘桥区", "445103": "潮安区", "445122": "饶平县", "445202": "榕城区", "445203": "揭东区", "445222": "揭西县", "445224": "惠来县", "445281": "普宁市", "445302": "云城区", "445303": "云安区", "445321": "新兴县", "445322": "郁南县", "445381": "罗定市", "450102": "兴宁区", "450103": "青秀区", "450105": "江南区", "450107": "西乡塘区", "450108": "良庆区", "450109": "邕宁区", "450110": "武鸣区", "450123": "隆安县", "450124": "马山县", "450125": "上林县", "450126": "宾阳县", "450127": "横县", "450202": "城中区", "450203": "鱼峰区", "450204": "柳南区", "450205": "柳北区", "450206": "柳江区", "450222": "柳城县", "450223": "鹿寨县", "450224": "融安县", "450225": "融水苗族自治县", "450226": "三江侗族自治县", "450302": "秀峰区", "450303": "叠彩区", "450304": "象山区", "450305": "七星区", "450311": "雁山区", "450312": "临桂区", "450321": "阳朔县", "450323": "灵川县", "450324": "全州县", "450325": "兴安县", "450326": "永福县", "450327": "灌阳县", "450328": "龙胜各族自治县", "450329": "资源县", "450330": "平乐县", "450332": "恭城瑶族自治县", "450381": "荔浦市", "450403": "万秀区", "450405": "长洲区", "450406": "龙圩区", "450421": "苍梧县", "450422": "藤县", "450423": "蒙山县", "450481": "岑溪市", "450502": "海城区", "450503": "银海区", "450512": "铁山港区", "450521": "合浦县", "450602": "港口区", "450603": "防城区", "450621": "上思县", "450681": "东兴市", "450702": "钦南区", "450703": "钦北区", "450721": "灵山县", "450722": "浦北县", "450802": "港北区", "450803": "港南区", "450804": "覃塘区", "450821": "平南县", "450881": "桂平市", "450902": "玉州区", "450903": "福绵区", "450921": "容县", "450922": "陆川县", "450923": "博白县", "450924": "兴业县", "450981": "北流市", "451002": "右江区", "451003": "田阳区", "451022": "田东县", "451024": "德保县", "451026": "那坡县", "451027": "凌云县", "451028": "乐业县", "451029": "田林县", "451030": "西林县", "451031": "隆林各族自治县", "451081": "靖西市", "451082": "平果市", "451102": "八步区", "451103": "平桂区", "451121": "昭平县", "451122": "钟山县", "451123": "富川瑶族自治县", "451202": "金城江区", "451203": "宜州区", "451221": "南丹县", "451222": "天峨县", "451223": "凤山县", "451224": "东兰县", "451225": "罗城仫佬族自治县", "451226": "环江毛南族自治县", "451227": "巴马瑶族自治县", "451228": "都安瑶族自治县", "451229": "大化瑶族自治县", "451302": "兴宾区", "451321": "忻城县", "451322": "象州县", "451323": "武宣县", "451324": "金秀瑶族自治县", "451381": "合山市", "451402": "江州区", "451421": "扶绥县", "451422": "宁明县", "451423": "龙州县", "451424": "大新县", "451425": "天等县", "451481": "凭祥市", "460105": "秀英区", "460106": "龙华区", "460107": "琼山区", "460108": "美兰区", "460202": "海棠区", "460203": "吉阳区", "460204": "天涯区", "460205": "崖州区", "460321": "西沙群岛", "460322": "南沙群岛", "460323": "中沙群岛的岛礁及其海域", "469001": "五指山市", "469002": "琼海市", "469005": "文昌市", "469006": "万宁市", "469007": "东方市", "469021": "定安县", "469022": "屯昌县", "469023": "澄迈县", "469024": "临高县", "469025": "白沙黎族自治县", "469026": "昌江黎族自治县", "469027": "乐东黎族自治县", "469028": "陵水黎族自治县", "469029": "保亭黎族苗族自治县", "469030": "琼中黎族苗族自治县", "500101": "万州区", "500102": "涪陵区", "500103": "渝中区", "500104": "大渡口区", "500105": "江北区", "500106": "沙坪坝区", "500107": "九龙坡区", "500108": "南岸区", "500109": "北碚区", "500110": "綦江区", "500111": "大足区", "500112": "渝北区", "500113": "巴南区", "500114": "黔江区", "500115": "长寿区", "500116": "江津区", "500117": "合川区", "500118": "永川区", "500119": "南川区", "500120": "璧山区", "500151": "铜梁区", "500152": "潼南区", "500153": "荣昌区", "500154": "开州区", "500155": "梁平区", "500156": "武隆区", "500229": "城口县", "500230": "丰都县", "500231": "垫江县", "500233": "忠县", "500235": "云阳县", "500236": "奉节县", "500237": "巫山县", "500238": "巫溪县", "500240": "石柱土家族自治县", "500241": "秀山土家族苗族自治县", "500242": "酉阳土家族苗族自治县", "500243": "彭水苗族土家族自治县", "510104": "锦江区", "510105": "青羊区", "510106": "金牛区", "510107": "武侯区", "510108": "成华区", "510112": "龙泉驿区", "510113": "青白江区", "510114": "新都区", "510115": "温江区", "510116": "双流区", "510117": "郫都区", "510118": "新津区", "510121": "金堂县", "510129": "大邑县", "510131": "蒲江县", "510181": "都江堰市", "510182": "彭州市", "510183": "邛崃市", "510184": "崇州市", "510185": "简阳市", "510302": "自流井区", "510303": "贡井区", "510304": "大安区", "510311": "沿滩区", "510321": "荣县", "510322": "富顺县", "510402": "东区", "510403": "西区", "510411": "仁和区", "510421": "米易县", "510422": "盐边县", "510502": "江阳区", "510503": "纳溪区", "510504": "龙马潭区", "510521": "泸县", "510522": "合江县", "510524": "叙永县", "510525": "古蔺县", "510603": "旌阳区", "510604": "罗江区", "510623": "中江县", "510681": "广汉市", "510682": "什邡市", "510683": "绵竹市", "510703": "涪城区", "510704": "游仙区", "510705": "安州区", "510722": "三台县", "510723": "盐亭县", "510725": "梓潼县", "510726": "北川羌族自治县", "510727": "平武县", "510781": "江油市", "510802": "利州区", "510811": "昭化区", "510812": "朝天区", "510821": "旺苍县", "510822": "青川县", "510823": "剑阁县", "510824": "苍溪县", "510903": "船山区", "510904": "安居区", "510921": "蓬溪县", "510923": "大英县", "510981": "射洪市", "511002": "市中区", "511011": "东兴区", "511024": "威远县", "511025": "资中县", "511083": "隆昌市", "511102": "市中区", "511111": "沙湾区", "511112": "五通桥区", "511113": "金口河区", "511123": "犍为县", "511124": "井研县", "511126": "夹江县", "511129": "沐川县", "511132": "峨边彝族自治县", "511133": "马边彝族自治县", "511181": "峨眉山市", "511302": "顺庆区", "511303": "高坪区", "511304": "嘉陵区", "511321": "南部县", "511322": "营山县", "511323": "蓬安县", "511324": "仪陇县", "511325": "西充县", "511381": "阆中市", "511402": "东坡区", "511403": "彭山区", "511421": "仁寿县", "511423": "洪雅县", "511424": "丹棱县", "511425": "青神县", "511502": "翠屏区", "511503": "南溪区", "511504": "叙州区", "511523": "江安县", "511524": "长宁县", "511525": "高县", "511526": "珙县", "511527": "筠连县", "511528": "兴文县", "511529": "屏山县", "511602": "广安区", "511603": "前锋区", "511621": "岳池县", "511622": "武胜县", "511623": "邻水县", "511681": "华蓥市", "511702": "通川区", "511703": "达川区", "511722": "宣汉县", "511723": "开江县", "511724": "大竹县", "511725": "渠县", "511781": "万源市", "511802": "雨城区", "511803": "名山区", "511822": "荥经县", "511823": "汉源县", "511824": "石棉县", "511825": "天全县", "511826": "芦山县", "511827": "宝兴县", "511902": "巴州区", "511903": "恩阳区", "511921": "通江县", "511922": "南江县", "511923": "平昌县", "512002": "雁江区", "512021": "安岳县", "512022": "乐至县", "513201": "马尔康市", "513221": "汶川县", "513222": "理县", "513223": "茂县", "513224": "松潘县", "513225": "九寨沟县", "513226": "金川县", "513227": "小金县", "513228": "黑水县", "513230": "壤塘县", "513231": "阿坝县", "513232": "若尔盖县", "513233": "红原县", "513301": "康定市", "513322": "泸定县", "513323": "丹巴县", "513324": "九龙县", "513325": "雅江县", "513326": "道孚县", "513327": "炉霍县", "513328": "甘孜县", "513329": "新龙县", "513330": "德格县", "513331": "白玉县", "513332": "石渠县", "513333": "色达县", "513334": "理塘县", "513335": "巴塘县", "513336": "乡城县", "513337": "稻城县", "513338": "得荣县", "513401": "西昌市", "513422": "木里藏族自治县", "513423": "盐源县", "513424": "德昌县", "513425": "会理县", "513426": "会东县", "513427": "宁南县", "513428": "普格县", "513429": "布拖县", "513430": "金阳县", "513431": "昭觉县", "513432": "喜德县", "513433": "冕宁县", "513434": "越西县", "513435": "甘洛县", "513436": "美姑县", "513437": "雷波县", "520102": "南明区", "520103": "云岩区", "520111": "花溪区", "520112": "乌当区", "520113": "白云区", "520115": "观山湖区", "520121": "开阳县", "520122": "息烽县", "520123": "修文县", "520181": "清镇市", "520201": "钟山区", "520203": "六枝特区", "520221": "水城县", "520281": "盘州市", "520302": "红花岗区", "520303": "汇川区", "520304": "播州区", "520322": "桐梓县", "520323": "绥阳县", "520324": "正安县", "520325": "道真仡佬族苗族自治县", "520326": "务川仡佬族苗族自治县", "520327": "凤冈县", "520328": "湄潭县", "520329": "余庆县", "520330": "习水县", "520381": "赤水市", "520382": "仁怀市", "520402": "西秀区", "520403": "平坝区", "520422": "普定县", "520423": "镇宁布依族苗族自治县", "520424": "关岭布依族苗族自治县", "520425": "紫云苗族布依族自治县", "520502": "七星关区", "520521": "大方县", "520522": "黔西县", "520523": "金沙县", "520524": "织金县", "520525": "纳雍县", "520526": "威宁彝族回族苗族自治县", "520527": "赫章县", "520602": "碧江区", "520603": "万山区", "520621": "江口县", "520622": "玉屏侗族自治县", "520623": "石阡县", "520624": "思南县", "520625": "印江土家族苗族自治县", "520626": "德江县", "520627": "沿河土家族自治县", "520628": "松桃苗族自治县", "522301": "兴义市", "522302": "兴仁市", "522323": "普安县", "522324": "晴隆县", "522325": "贞丰县", "522326": "望谟县", "522327": "册亨县", "522328": "安龙县", "522601": "凯里市", "522622": "黄平县", "522623": "施秉县", "522624": "三穗县", "522625": "镇远县", "522626": "岑巩县", "522627": "天柱县", "522628": "锦屏县", "522629": "剑河县", "522630": "台江县", "522631": "黎平县", "522632": "榕江县", "522633": "从江县", "522634": "雷山县", "522635": "麻江县", "522636": "丹寨县", "522701": "都匀市", "522702": "福泉市", "522722": "荔波县", "522723": "贵定县", "522725": "瓮安县", "522726": "独山县", "522727": "平塘县", "522728": "罗甸县", "522729": "长顺县", "522730": "龙里县", "522731": "惠水县", "522732": "三都水族自治县", "530102": "五华区", "530103": "盘龙区", "530111": "官渡区", "530112": "西山区", "530113": "东川区", "530114": "呈贡区", "530115": "晋宁区", "530124": "富民县", "530125": "宜良县", "530126": "石林彝族自治县", "530127": "嵩明县", "530128": "禄劝彝族苗族自治县", "530129": "寻甸回族彝族自治县", "530181": "安宁市", "530302": "麒麟区", "530303": "沾益区", "530304": "马龙区", "530322": "陆良县", "530323": "师宗县", "530324": "罗平县", "530325": "富源县", "530326": "会泽县", "530381": "宣威市", "530402": "红塔区", "530403": "江川区", "530423": "通海县", "530424": "华宁县", "530425": "易门县", "530426": "峨山彝族自治县", "530427": "新平彝族傣族自治县", "530428": "元江哈尼族彝族傣族自治县", "530481": "澄江市", "530502": "隆阳区", "530521": "施甸县", "530523": "龙陵县", "530524": "昌宁县", "530581": "腾冲市", "530602": "昭阳区", "530621": "鲁甸县", "530622": "巧家县", "530623": "盐津县", "530624": "大关县", "530625": "永善县", "530626": "绥江县", "530627": "镇雄县", "530628": "彝良县", "530629": "威信县", "530681": "水富市", "530702": "古城区", "530721": "玉龙纳西族自治县", "530722": "永胜县", "530723": "华坪县", "530724": "宁蒗彝族自治县", "530802": "思茅区", "530821": "宁洱哈尼族彝族自治县", "530822": "墨江哈尼族自治县", "530823": "景东彝族自治县", "530824": "景谷傣族彝族自治县", "530825": "镇沅彝族哈尼族拉祜族自治县", "530826": "江城哈尼族彝族自治县", "530827": "孟连傣族拉祜族佤族自治县", "530828": "澜沧拉祜族自治县", "530829": "西盟佤族自治县", "530902": "临翔区", "530921": "凤庆县", "530922": "云县", "530923": "永德县", "530924": "镇康县", "530925": "双江拉祜族佤族布朗族傣族自治县", "530926": "耿马傣族佤族自治县", "530927": "沧源佤族自治县", "532301": "楚雄市", "532322": "双柏县", "532323": "牟定县", "532324": "南华县", "532325": "姚安县", "532326": "大姚县", "532327": "永仁县", "532328": "元谋县", "532329": "武定县", "532331": "禄丰县", "532501": "个旧市", "532502": "开远市", "532503": "蒙自市", "532504": "弥勒市", "532523": "屏边苗族自治县", "532524": "建水县", "532525": "石屏县", "532527": "泸西县", "532528": "元阳县", "532529": "红河县", "532530": "金平苗族瑶族傣族自治县", "532531": "绿春县", "532532": "河口瑶族自治县", "532601": "文山市", "532622": "砚山县", "532623": "西畴县", "532624": "麻栗坡县", "532625": "马关县", "532626": "丘北县", "532627": "广南县", "532628": "富宁县", "532801": "景洪市", "532822": "勐海县", "532823": "勐腊县", "532901": "大理市", "532922": "漾濞彝族自治县", "532923": "祥云县", "532924": "宾川县", "532925": "弥渡县", "532926": "南涧彝族自治县", "532927": "巍山彝族回族自治县", "532928": "永平县", "532929": "云龙县", "532930": "洱源县", "532931": "剑川县", "532932": "鹤庆县", "533102": "瑞丽市", "533103": "芒市", "533122": "梁河县", "533123": "盈江县", "533124": "陇川县", "533301": "泸水市", "533323": "福贡县", "533324": "贡山独龙族怒族自治县", "533325": "兰坪白族普米族自治县", "533401": "香格里拉市", "533422": "德钦县", "533423": "维西傈僳族自治县", "540102": "城关区", "540103": "堆龙德庆区", "540104": "达孜区", "540121": "林周县", "540122": "当雄县", "540123": "尼木县", "540124": "曲水县", "540127": "墨竹工卡县", "540202": "桑珠孜区", "540221": "南木林县", "540222": "江孜县", "540223": "定日县", "540224": "萨迦县", "540225": "拉孜县", "540226": "昂仁县", "540227": "谢通门县", "540228": "白朗县", "540229": "仁布县", "540230": "康马县", "540231": "定结县", "540232": "仲巴县", "540233": "亚东县", "540234": "吉隆县", "540235": "聂拉木县", "540236": "萨嘎县", "540237": "岗巴县", "540302": "卡若区", "540321": "江达县", "540322": "贡觉县", "540323": "类乌齐县", "540324": "丁青县", "540325": "察雅县", "540326": "八宿县", "540327": "左贡县", "540328": "芒康县", "540329": "洛隆县", "540330": "边坝县", "540402": "巴宜区", "540421": "工布江达县", "540422": "米林县", "540423": "墨脱县", "540424": "波密县", "540425": "察隅县", "540426": "朗县", "540502": "乃东区", "540521": "扎囊县", "540522": "贡嘎县", "540523": "桑日县", "540524": "琼结县", "540525": "曲松县", "540526": "措美县", "540527": "洛扎县", "540528": "加查县", "540529": "隆子县", "540530": "错那县", "540531": "浪卡子县", "540602": "色尼区", "540621": "嘉黎县", "540622": "比如县", "540623": "聂荣县", "540624": "安多县", "540625": "申扎县", "540626": "索县", "540627": "班戈县", "540628": "巴青县", "540629": "尼玛县", "540630": "双湖县", "542521": "普兰县", "542522": "札达县", "542523": "噶尔县", "542524": "日土县", "542525": "革吉县", "542526": "改则县", "542527": "措勤县", "610102": "新城区", "610103": "碑林区", "610104": "莲湖区", "610111": "灞桥区", "610112": "未央区", "610113": "雁塔区", "610114": "阎良区", "610115": "临潼区", "610116": "长安区", "610117": "高陵区", "610118": "鄠邑区", "610122": "蓝田县", "610124": "周至县", "610202": "王益区", "610203": "印台区", "610204": "耀州区", "610222": "宜君县", "610302": "渭滨区", "610303": "金台区", "610304": "陈仓区", "610322": "凤翔县", "610323": "岐山县", "610324": "扶风县", "610326": "眉县", "610327": "陇县", "610328": "千阳县", "610329": "麟游县", "610330": "凤县", "610331": "太白县", "610402": "秦都区", "610403": "杨陵区", "610404": "渭城区", "610422": "三原县", "610423": "泾阳县", "610424": "乾县", "610425": "礼泉县", "610426": "永寿县", "610428": "长武县", "610429": "旬邑县", "610430": "淳化县", "610431": "武功县", "610481": "兴平市", "610482": "彬州市", "610502": "临渭区", "610503": "华州区", "610522": "潼关县", "610523": "大荔县", "610524": "合阳县", "610525": "澄城县", "610526": "蒲城县", "610527": "白水县", "610528": "富平县", "610581": "韩城市", "610582": "华阴市", "610602": "宝塔区", "610603": "安塞区", "610621": "延长县", "610622": "延川县", "610625": "志丹县", "610626": "吴起县", "610627": "甘泉县", "610628": "富县", "610629": "洛川县", "610630": "宜川县", "610631": "黄龙县", "610632": "黄陵县", "610681": "子长市", "610702": "汉台区", "610703": "南郑区", "610722": "城固县", "610723": "洋县", "610724": "西乡县", "610725": "勉县", "610726": "宁强县", "610727": "略阳县", "610728": "镇巴县", "610729": "留坝县", "610730": "佛坪县", "610802": "榆阳区", "610803": "横山区", "610822": "府谷县", "610824": "靖边县", "610825": "定边县", "610826": "绥德县", "610827": "米脂县", "610828": "佳县", "610829": "吴堡县", "610830": "清涧县", "610831": "子洲县", "610881": "神木市", "610902": "汉滨区", "610921": "汉阴县", "610922": "石泉县", "610923": "宁陕县", "610924": "紫阳县", "610925": "岚皋县", "610926": "平利县", "610927": "镇坪县", "610928": "旬阳县", "610929": "白河县", "611002": "商州区", "611021": "洛南县", "611022": "丹凤县", "611023": "商南县", "611024": "山阳县", "611025": "镇安县", "611026": "柞水县", "620102": "城关区", "620103": "七里河区", "620104": "西固区", "620105": "安宁区", "620111": "红古区", "620121": "永登县", "620122": "皋兰县", "620123": "榆中县", "620302": "金川区", "620321": "永昌县", "620402": "白银区", "620403": "平川区", "620421": "靖远县", "620422": "会宁县", "620423": "景泰县", "620502": "秦州区", "620503": "麦积区", "620521": "清水县", "620522": "秦安县", "620523": "甘谷县", "620524": "武山县", "620525": "张家川回族自治县", "620602": "凉州区", "620621": "民勤县", "620622": "古浪县", "620623": "天祝藏族自治县", "620702": "甘州区", "620721": "肃南裕固族自治县", "620722": "民乐县", "620723": "临泽县", "620724": "高台县", "620725": "山丹县", "620802": "崆峒区", "620821": "泾川县", "620822": "灵台县", "620823": "崇信县", "620825": "庄浪县", "620826": "静宁县", "620881": "华亭市", "620902": "肃州区", "620921": "金塔县", "620922": "瓜州县", "620923": "肃北蒙古族自治县", "620924": "阿克塞哈萨克族自治县", "620981": "玉门市", "620982": "敦煌市", "621002": "西峰区", "621021": "庆城县", "621022": "环县", "621023": "华池县", "621024": "合水县", "621025": "正宁县", "621026": "宁县", "621027": "镇原县", "621102": "安定区", "621121": "通渭县", "621122": "陇西县", "621123": "渭源县", "621124": "临洮县", "621125": "漳县", "621126": "岷县", "621202": "武都区", "621221": "成县", "621222": "文县", "621223": "宕昌县", "621224": "康县", "621225": "西和县", "621226": "礼县", "621227": "徽县", "621228": "两当县", "622901": "临夏市", "622921": "临夏县", "622922": "康乐县", "622923": "永靖县", "622924": "广河县", "622925": "和政县", "622926": "东乡族自治县", "622927": "积石山保安族东乡族撒拉族自治县", "623001": "合作市", "623021": "临潭县", "623022": "卓尼县", "623023": "舟曲县", "623024": "迭部县", "623025": "玛曲县", "623026": "碌曲县", "623027": "夏河县", "630102": "城东区", "630103": "城中区", "630104": "城西区", "630105": "城北区", "630106": "湟中区", "630121": "大通回族土族自治县", "630123": "湟源县", "630202": "乐都区", "630203": "平安区", "630222": "民和回族土族自治县", "630223": "互助土族自治县", "630224": "化隆回族自治县", "630225": "循化撒拉族自治县", "632221": "门源回族自治县", "632222": "祁连县", "632223": "海晏县", "632224": "刚察县", "632301": "同仁市", "632322": "尖扎县", "632323": "泽库县", "632324": "河南蒙古族自治县", "632521": "共和县", "632522": "同德县", "632523": "贵德县", "632524": "兴海县", "632525": "贵南县", "632621": "玛沁县", "632622": "班玛县", "632623": "甘德县", "632624": "达日县", "632625": "久治县", "632626": "玛多县", "632701": "玉树市", "632722": "杂多县", "632723": "称多县", "632724": "治多县", "632725": "囊谦县", "632726": "曲麻莱县", "632801": "格尔木市", "632802": "德令哈市", "632803": "茫崖市", "632821": "乌兰县", "632822": "都兰县", "632823": "天峻县", "640104": "兴庆区", "640105": "西夏区", "640106": "金凤区", "640121": "永宁县", "640122": "贺兰县", "640181": "灵武市", "640202": "大武口区", "640205": "惠农区", "640221": "平罗县", "640302": "利通区", "640303": "红寺堡区", "640323": "盐池县", "640324": "同心县", "640381": "青铜峡市", "640402": "原州区", "640422": "西吉县", "640423": "隆德县", "640424": "泾源县", "640425": "彭阳县", "640502": "沙坡头区", "640521": "中宁县", "640522": "海原县", "650102": "天山区", "650103": "沙依巴克区", "650104": "新市区", "650105": "水磨沟区", "650106": "头屯河区", "650107": "达坂城区", "650109": "米东区", "650121": "乌鲁木齐县", "650202": "独山子区", "650203": "克拉玛依区", "650204": "白碱滩区", "650205": "乌尔禾区", "650402": "高昌区", "650421": "鄯善县", "650422": "托克逊县", "650502": "伊州区", "650521": "巴里坤哈萨克自治县", "650522": "伊吾县", "652301": "昌吉市", "652302": "阜康市", "652323": "呼图壁县", "652324": "玛纳斯县", "652325": "奇台县", "652327": "吉木萨尔县", "652328": "木垒哈萨克自治县", "652701": "博乐市", "652702": "阿拉山口市", "652722": "精河县", "652723": "温泉县", "652801": "库尔勒市", "652822": "轮台县", "652823": "尉犁县", "652824": "若羌县", "652825": "且末县", "652826": "焉耆回族自治县", "652827": "和静县", "652828": "和硕县", "652829": "博湖县", "652901": "阿克苏市", "652902": "库车市", "652922": "温宿县", "652924": "沙雅县", "652925": "新和县", "652926": "拜城县", "652927": "乌什县", "652928": "阿瓦提县", "652929": "柯坪县", "653001": "阿图什市", "653022": "阿克陶县", "653023": "阿合奇县", "653024": "乌恰县", "653101": "喀什市", "653121": "疏附县", "653122": "疏勒县", "653123": "英吉沙县", "653124": "泽普县", "653125": "莎车县", "653126": "叶城县", "653127": "麦盖提县", "653128": "岳普湖县", "653129": "伽师县", "653130": "巴楚县", "653131": "塔什库尔干塔吉克自治县", "653201": "和田市", "653221": "和田县", "653222": "墨玉县", "653223": "皮山县", "653224": "洛浦县", "653225": "策勒县", "653226": "于田县", "653227": "民丰县", "654002": "伊宁市", "654003": "奎屯市", "654004": "霍尔果斯市", "654021": "伊宁县", "654022": "察布查尔锡伯自治县", "654023": "霍城县", "654024": "巩留县", "654025": "新源县", "654026": "昭苏县", "654027": "特克斯县", "654028": "尼勒克县", "654201": "塔城市", "654202": "乌苏市", "654221": "额敏县", "654223": "沙湾县", "654224": "托里县", "654225": "裕民县", "654226": "和布克赛尔蒙古自治县", "654301": "阿勒泰市", "654321": "布尔津县", "654322": "富蕴县", "654323": "福海县", "654324": "哈巴河县", "654325": "青河县", "654326": "吉木乃县", "659001": "石河子市", "659002": "阿拉尔市", "659003": "图木舒克市", "659004": "五家渠市", "659005": "北屯市", "659006": "铁门关市", "659007": "双河市", "659008": "可克达拉市", "659009": "昆玉市", "659010": "胡杨河市", "714403": "芳苑乡", "714632": "芬园乡", "714701": "福兴乡", "714777": "和美镇", "715055": "花坛乡", "715172": "鹿港镇", "715490": "埤头乡", "715602": "埔心乡", "715745": "埔盐乡", "715795": "伸港乡", "715960": "社头乡", "716105": "田尾乡", "716202": "田中镇", "716341": "线西乡", "716421": "溪湖镇", "716750": "秀水乡", "716874": "溪州乡", "717107": "永靖乡", "717238": "员林市", "717447": "竹塘乡", "717532": "八里区", "717645": "板桥区", "717902": "贡寮区", "717955": "金山区", "718036": "林口区", "718195": "芦洲区", "718266": "坪林区", "718327": "平溪区", "718375": "瑞芳区", "718490": "三重区", "718786": "三峡区", "718879": "三芝区", "718980": "深坑区", "719023": "石碇区", "719115": "石门区", "719155": "双溪区", "719243": "树林区", "719382": "泰山区", "719498": "淡水区", "719731": "土城区", "719869": "白沙乡", "719890": "湖西乡", "719916": "马公市", "720065": "七美乡", "720090": "望安乡", "720102": "西屿乡", "720119": "三地门乡", "720142": "狮子乡", "720163": "泰武乡", "720186": "万丹乡", "720415": "万峦乡", "720480": "雾臺乡", "720502": "新埤乡", "720553": "新园乡", "720649": "盐埔乡", "720748": "竹田乡", "720835": "长治乡", "720975": "潮州镇", "721293": "车城乡", "721335": "春日乡", "721344": "东港镇", "721490": "枋寮乡", "721617": "枋山乡", "721638": "高树乡", "721805": "恆春镇", "721930": "佳冬乡", "722025": "梧栖区", "722212": "乌日区", "722402": "新社区", "722474": "西屯区", "722699": "北屯区", "722879": "中区", "722923": "大肚区", "723021": "大甲区", "723211": "大里区", "723592": "大雅区", "723756": "大安区", "723802": "东势区", "723966": "东区", "724148": "丰原区", "724424": "和平区", "724504": "后里区", "724656": "龙井区", "724797": "南屯区", "724872": "北区", "725199": "清水区", "725489": "佳里区", "725588": "将军区", "725620": "六甲区", "725679": "柳营区", "725795": "龙崎区", "725841": "麻豆区", "725927": "南化区", "725938": "楠西区", "725973": "北区", "726300": "七股区", "726338": "仁德区", "726539": "善化区", "726675": "山上区", "726691": "南区", "727041": "中西区", "727251": "下营区", "727339": "西港区", "727375": "新化区", "727425": "新市区", "727529": "新营区", "727731": "北投区", "727897": "大同区", "728070": "大安区", "728116": "南港区", "728220": "内湖区", "728340": "士林区", "728550": "松山区", "728713": "万华区", "728920": "文山区", "729073": "信义区", "729277": "中山区", "729583": "中正区", "729929": "卑南乡", "729994": "长滨乡", "730033": "成功镇", "730107": "池上乡", "730196": "达仁乡", "730219": "大武乡", "730268": "东河乡", "730308": "关山镇", "730384": "海端乡", "730409": "金峰乡", "730416": "兰屿乡", "730423": "绿岛乡", "730438": "鹿野乡", "730510": "太麻里乡", "730565": "臺东市", "730832": "延平乡", "730844": "八德区", "731212": "大溪区", "731471": "大园区", "731767": "復兴区", "731835": "观音区", "732079": "龟山区", "732469": "龙潭区", "732800": "芦竹区", "733144": "平镇区", "733179": "桃园区", "733390": "新屋区", "733537": "杨梅区", "733876": "中坜区", "734180": "大同乡", "734246": "钓鱼臺", "734248": "冬山乡", "734579": "礁溪乡", "734681": "罗东镇", "734842": "南澳乡", "734865": "三星乡", "735104": "苏澳镇", "735319": "头城镇", "735419": "五结乡", "735620": "宜兰市", "735851": "员山乡", "735970": "壮围乡", "736052": "草屯镇", "736305": "国姓乡", "736356": "集集镇", "736449": "鹿谷乡", "736522": "名间乡", "736622": "南投市", "736887": "埔里镇", "737266": "仁爱乡", "737337": "水里乡", "737496": "信义乡", "737533": "鱼池乡", "737591": "中寮乡", "737625": "竹山镇", "737857": "东沙群岛", "737859": "南沙群岛", "737862": "头屋乡", "737894": "西湖乡", "737948": "苑里镇", "738050": "造桥乡", "738158": "竹南镇", "738454": "卓兰镇", "738528": "大湖乡", "738619": "公馆乡", "738695": "后龙镇", "738882": "苗栗市", "739250": "南庄乡", "739302": "三湾乡", "739369": "三义乡", "739419": "狮潭乡", "739465": "泰安乡", "739487": "铜锣乡", "739564": "通霄镇", "739642": "头份市", "739958": "东区", "740140": "西区", "740511": "阿里山乡", "740536": "布袋镇", "740625": "大林镇", "740746": "大埔乡", "740792": "东石乡", "740845": "番路乡", "740943": "六脚乡", "740975": "鹿草乡", "741010": "梅山乡", "741137": "民雄乡", "741312": "朴子市", "741451": "水上乡", "741550": "太保市", "741646": "溪口乡", "741688": "新港乡", "741750": "义竹乡", "741785": "中埔乡", "741936": "竹崎乡", "742127": "东区", "742309": "北区", "742637": "峨眉乡", "742674": "关西镇", "742797": "横山乡", "742852": "湖口乡", "743201": "尖石乡", "743246": "芎林乡", "743298": "五峰乡", "743319": "新丰乡", "743414": "新埔镇", "743527": "竹北市", "743565": "竹东镇", "743725": "宝山乡", "743888": "北埔乡", "743939": "卓溪乡", "743956": "丰滨乡", "743993": "凤林镇", "744128": "富里乡", "744185": "光復乡", "744246": "花莲市", "744625": "吉安乡", "745050": "瑞穗乡", "745196": "寿丰乡", "745354": "万荣乡", "745363": "新城乡", "745486": "秀林乡", "745532": "玉里镇", "745675": "阿莲区", "745715": "大寮区", "746083": "大社区", "746199": "大树区", "746294": "凤山区", "746624": "冈山区", "746906": "鼓山区", "747053": "湖内区", "747108": "甲仙区", "747150": "苓雅区", "747342": "林园区", "747481": "六龟区", "747536": "路竹区", "747643": "茂林区", "747647": "美浓区", "747764": "弥陀区", "747894": "那玛夏区", "747902": "楠梓区", "748258": "内门区", "748344": "鸟松区", "748554": "安乐区", "748581": "暖暖区", "748599": "七堵区", "748670": "仁爱区", "748716": "信义区", "748920": "中山区", "749226": "中正区", "749572": "金城镇", "749647": "金湖镇", "749752": "金宁乡", "749810": "金沙镇", "749894": "烈屿乡", "749928": "乌坵乡", "749931": "北竿乡", "749938": "东引乡", "749941": "莒光乡", "749947": "南竿乡", "749958": "褒忠乡", "749991": "北港镇", "750170": "莿桐乡", "750218": "大埤乡", "750291": "东势乡", "750363": "斗六市", "750795": "斗南镇", "751009": "二崙乡", "751071": "古坑乡", "751147": "虎尾镇", "751400": "口湖乡", "751493": "林内乡", "751555": "崙背乡", "751674": "麦寮乡", "751764": "水林乡", "751832": "四湖乡", "751907": "臺西乡", "751956": "土库镇", "752034": "西螺镇", "752149": "元长乡", "752151": "中西区", "752152": "东区", "752153": "九龙城区", "752154": "观塘区", "752155": "南区", "752156": "深水埗区", "752157": "湾仔区", "752158": "黄大仙区", "752159": "油尖旺区", "752160": "离岛区", "752161": "葵青区", "752162": "北区", "752163": "西贡区", "752164": "沙田区", "752165": "屯门区", "752166": "大埔区", "752167": "荃湾区", "752168": "元朗区", "752170": "澳门半岛", "752171": "凼仔", "752172": "路凼城", "752173": "路环", "752177": "龙华区", "441900003": "东城街道办事处", "441900004": "南城街道办事处", "441900005": "万江街道办事处", "441900006": "莞城街道办事处", "441900101": "石碣镇", "441900102": "石龙镇", "441900103": "茶山镇", "441900104": "石排镇", "441900105": "企石镇", "441900106": "横沥镇", "441900107": "桥头镇", "441900108": "谢岗镇", "441900109": "东坑镇", "441900110": "常平镇", "441900111": "寮步镇", "441900112": "樟木头镇", "441900113": "大朗镇", "441900114": "黄江镇", "441900115": "清溪镇", "441900116": "塘厦镇", "441900117": "凤岗镇", "441900118": "大岭山镇", "441900119": "长安镇", "441900121": "虎门镇", "441900122": "厚街镇", "441900123": "沙田镇", "441900124": "道滘镇", "441900125": "洪梅镇", "441900126": "麻涌镇", "441900127": "望牛墩镇", "441900128": "中堂镇", "441900129": "高埗镇", "441900401": "松山湖管委会", "441900402": "虎门港管委会", "441900403": "东莞生态园", "442000001": "石岐区街道办事处", "442000002": "东区街道办事处", "442000003": "火炬开发区街道办事处", "442000004": "西区街道办事处", "442000005": "南区街道办事处", "442000006": "五桂山街道办事处", "442000100": "小榄镇", "442000101": "黄圃镇", "442000102": "民众镇", "442000103": "东凤镇", "442000104": "东升镇", "442000105": "古镇镇", "442000106": "沙溪镇", "442000107": "坦洲镇", "442000108": "港口镇", "442000109": "三角镇", "442000110": "横栏镇", "442000111": "南头镇", "442000112": "阜沙镇", "442000113": "南朗镇", "442000114": "三乡镇", "442000115": "板芙镇", "442000116": "大涌镇", "442000117": "神湾镇", "460400100": "那大镇", "460400101": "和庆镇", "460400102": "南丰镇", "460400103": "大成镇", "460400104": "雅星镇", "460400105": "兰洋镇", "460400106": "光村镇", "460400107": "木棠镇", "460400108": "海头镇", "460400109": "峨蔓镇", "460400110": "三都镇", "460400111": "王五镇", "460400112": "白马井镇", "460400113": "中和镇", "460400114": "排浦镇", "460400115": "东成镇", "460400116": "新州镇", "460400400": "国营西培农场", "460400404": "国营西联农场", "460400405": "国营蓝洋农场", "460400407": "国营八一农场", "460400499": "洋浦经济开发区", "460400500": "华南热作学院" }
+    };  
+  
+    Class.prototype.config = {
+        elem: '',
+        data: {
+			province: {code:0,name:'--请选择省--'},
+			city: {code:0,name:'--请选择市--'},
+			district: {code:0,name:'--请选择区--'},
+		},
+		change: function(result){}
+    };
+  
+    Class.prototype.index = 0;  
+    Class.prototype.render = function () {
+		let that = this, options = that.config;
+		options.elem = $(options.elem);
+		options.bindAction = $(options.bindAction);  
+		that.events();
+    };
+  
+    Class.prototype.events = function () {
+		let that = this, options = that.config, index;
+		let provinceFilter = 'province-' + gouguarea._id;
+		let cityFilter = 'city-' + gouguarea._id;
+		let districtFilter = 'district-' + gouguarea._id;
+  
+		let provinceEl = options.elem.find('.province-select');
+		let cityEl = options.elem.find('.city-select');
+		let districtEl = options.elem.find('.district-select');
+  
+		//filter
+		if(provinceEl.attr('lay-filter')){
+			provinceFilter = provinceEl.attr('lay-filter');
+		}
+		if(cityEl.attr('lay-filter')){
+			cityFilter = cityEl.attr('lay-filter');
+		}
+		if(districtEl.attr('lay-filter')){
+			districtFilter = districtEl.attr('lay-filter');
+		}
+		provinceEl.attr('lay-filter', provinceFilter);
+		cityEl.attr('lay-filter', cityFilter);
+		districtEl.attr('lay-filter', districtFilter);
+  
+		//获取默认值
+		if(provinceEl.data('value')){
+			options.data.province.code = provinceEl.data('value');
+			options.data.province.name = getName('province', provinceEl.data('value'));
+		}
+		if(cityEl.data('value')){
+			options.data.city.code = cityEl.data('value');
+			options.data.city.name = getName('city', cityEl.data('value'));
+		}
+		if(districtEl.data('value')){
+			options.data.district.code = districtEl.data('value');
+			options.data.district.name = getName('district', districtEl.data('value'));
+		}
+		provinceEl.attr('lay-filter', provinceFilter);
+		cityEl.attr('lay-filter', cityFilter);
+		districtEl.attr('lay-filter', districtFilter);
+  
+		//监听结果
+		form.on('select('+provinceFilter+')', function(data){
+			options.data.province.code = data.value;
+			options.data.province.name = getName('province', data.value);
+			renderCity(data.value);  
+			options.change(options.data);
+		});
+		form.on('select('+cityFilter+')', function(data){
+			options.data.city.code = data.value;
+			options.data.city.name = getName('city', data.value);
+			renderDistrict(data.value);  
+			options.change(options.data);
+		});
+		form.on('select('+districtFilter+')', function(data){
+			options.data.district.code = data.value;
+			options.data.district.name = getName('district', data.value);
+			options.change(options.data);
+		});
+  
+		//查找province
+		function renderProvince(){
+			let tpl = '';
+			let provinceList = getList("province");
+			let currentCode = '';
+			let currentName = '';
+			provinceList.forEach(function(_item){
+			if (!currentCode){
+				currentCode = _item.code;
+				currentName = _item.name;
+			}
+			if(_item.code == options.data.province.code){
+				currentCode = _item.code;
+				currentName = _item.name;
+			}
+			tpl += '<option value="'+_item.code+'">'+_item.name+'</option>';
+        });
+			options.data.province.code = currentCode;
+			options.data.province.name = currentName;
+			provinceEl.html(tpl);
+			provinceEl.val(options.data.province.code);
+			form.render('select');
+			renderCity(currentCode);
+		}
+  
+		//查找city
+		function renderCity(provinceCode){
+			let tpl = '';
+			let cityList = getList('city', provinceCode.slice(0, 2));
+			let currentCode = '';
+			let currentName = '';
+			cityList.forEach(function(_item){
+				if (!currentCode){
+					currentCode = _item.code;
+					currentName = _item.name;
+				}
+				if(_item.code == options.data.city.code){
+					currentCode = _item.code;
+					currentName = _item.name;
+				}
+				tpl += '<option value="'+_item.code+'">'+_item.name+'</option>';
+			});
+			options.data.city.code = currentCode;
+			options.data.city.name = currentName;
+			cityEl.html(tpl);
+			cityEl.val(options.data.city.code);
+			form.render('select');
+			renderDistrict(currentCode);
+		}
+	
+		//查找district
+		function renderDistrict(cityCode){
+			let tpl = '';
+			let districtList = getList('district', cityCode.slice(0, 4));
+			let currentCode = '';
+			let currentName = '';
+			districtList.forEach(function(_item){
+				if (!currentCode){
+					currentCode = _item.code;
+					currentName = _item.name;
+				}
+				if(_item.code == options.data.district.code){
+					currentCode = _item.code;
+					currentName = _item.name;
+				}
+				tpl += '<option value="'+_item.code+'">'+_item.name+'</option>';
+			});
+			options.data.district.code = currentCode;
+			options.data.district.name = currentName;
+			districtEl.html(tpl);
+			districtEl.val(options.data.district.code);  
+			form.render('select');
+		}
+  
+		function getList(type, code) {
+			let result = [];  
+			if (type !== 'province' && !code) {
+				return result;
+			}  
+			let list = areaList[type + "_list"] || {};
+			result = Object.keys(list).map(function (code) {
+				return {
+					code: code,
+					name: list[code]
+				};
+			});  
+			if (code) {
+				if (code[0] === '9' && type === 'city') {
+					code = '9';
+				}	  
+				result = result.filter(function (item) {
+					return item.code.indexOf(code) === 0;
+				});
+			}  
+			return result;
+		}
+  
+		function getCode(type, name){
+			let code = '';
+			let list = areaList[type + "_list"] || {};
+			layui.each(list, function(_code, _name){
+				if(_name === name){
+					code = _code;
+				}
+			});  
+			return code;
+		}
+		
+		function getName(type, code){
+			let list = areaList[type + "_list"] || {}; 
+			return list[code];
+		}
+		renderProvince();
+    };
+  
+    gouguarea.render = function (options) {
+		let inst = new Class(options);
+		gouguarea._id++;
+		return thisArea.call(inst);
+    };
+    exports('areaSelect', gouguarea);
+  });
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/excel.js b/public/static/assets/gougu/module/excel.js
new file mode 100644
index 0000000000000000000000000000000000000000..9038f77a18038c01df1a53f4f78665bb7876ad93
--- /dev/null
+++ b/public/static/assets/gougu/module/excel.js
@@ -0,0 +1,35 @@
+layui.define([], function (exports) {
+	var MOD_NAME = 'excel';
+	var modFile = layui.cache.modules['excel'];
+	var modPath = modFile.substr(0, modFile.lastIndexOf('.'));
+	var settings = {
+		name: '表格'
+	};
+	var excel = {
+		init: function (tableId, options) {
+			loadScript();
+			var opts = $.extend({}, settings, options);
+			$('#'+tableId).table2excel({
+				name: opts.name,
+				filename: opts.name + new Date().getTime() + ".xls",
+				exclude: ".noExl",
+				exclude_img: false,
+				exclude_links: false,
+				exclude_inputs: false,
+				preserveColors:true
+			});
+		}
+	}
+	function loadScript() {
+		if (typeof table2excel == 'undefined') {
+			$.ajax({ //获取插件
+				url: modPath + '/table2excel.js' ,
+				dataType: 'script',
+				cache: true,
+				async: false
+			});
+		}
+	}
+	loadScript();
+	exports(MOD_NAME, excel);
+});
diff --git a/public/static/assets/gougu/module/excel/table2excel.js b/public/static/assets/gougu/module/excel/table2excel.js
new file mode 100644
index 0000000000000000000000000000000000000000..58197d4ec9b518efaaf8829c1c2555359197fa1a
--- /dev/null
+++ b/public/static/assets/gougu/module/excel/table2excel.js
@@ -0,0 +1,276 @@
+/*
+ *  jQuery table2excel - v1.1.2
+ *  jQuery plugin to export an .xls file in browser from an HTML table
+ *  https://github.com/rainabba/jquery-table2excel
+ *
+ *  Made by rainabba
+ *  Under MIT License
+ */
+(function ($, window, document, undefined) {
+    var pluginName = "table2excel",
+        defaults = {
+            exclude: ".noExl",
+            name: "Table2Excel",
+            filename: "table2excel",
+            fileext: ".xls",
+            exclude_img: true,
+            exclude_links: true,
+            exclude_inputs: true,
+            preserveColors: true,
+            subtotal: 0,//"合计"行所在的行号(不包括标题行),0表示没有合计行...
+            width: 50,//表格宽度百分比,默认100%
+			trHeight:32,//表格行高,默认32px
+			thBackgroundColor:"#eeeeee"//TH背景色
+        };
+    //插件配置
+    function Plugin(element, options) {
+        this.element = element;
+        this.settings = $.extend({}, defaults, options);
+        this._defaults = defaults;
+        this._name = pluginName;
+        this.init();
+    }
+    Plugin.prototype = {
+        init: function () {
+            var e = this;
+            var w = getWidth(e.settings);//导出EXCEL表格的宽度,默认100%
+            var utf8Heading = "<meta http-equiv=\"content-type\" content=\"application/vnd.ms-excel; charset=UTF-8\">";
+            e.template = {
+                head: "<html xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\" xmlns=\"http://www.w3.org/TR/REC-html40\">" + utf8Heading + "<head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets>",
+                sheet: {
+                    head: "<x:ExcelWorksheet><x:Name>",
+                    tail: "</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet>"
+                },
+                mid: "</x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body>",
+                table: {
+                    head: " <table border='1' style='width:" + w + "%;'>",//<table>的边框&宽度
+                    tail: " </table>"
+                },
+                foot: "</body></html>"
+            };
+            e.tableRows = [];
+ 
+            //读取原始表
+            var rowNumber = 0;//行号
+            $(e.element).each(function (i, o) {
+                var tempRows = "";//table的html
+                $(o).find("tr").not(e.settings.exclude).each(function (i, p) {
+                    //<tr>的样式
+                    var trStyles = "height:"+e.settings.trHeight+"px;";//整行样式
+                    //开始创建一行表格
+                    tempRows += "<tr align='center' style='" + trStyles + "'>";//内容居中：align='center'
+ 
+                    //读取原始<table>的<th>表头行(表头必须是<th>！表头如果是<td>的话则会当做普通数据行处理...)
+                    $(p).find("th").not(e.settings.exclude).each(function (i, q) {
+                        //<th>的样式:
+                        var thStyles = "background-color: "+e.settings.thBackgroundColor+";";
+                        var rc = {
+                            rows: $(this).attr("rowspan"),
+                            cols: $(this).attr("colspan"),
+                            flag: $(q).find(e.settings.exclude)
+                        };
+                        if (rc.flag.length > 0) {
+                            tempRows += "<td> </td>"; //空格!
+                        } else {
+                            tempRows += "<td";
+                            if (rc.rows > 0) {
+                                tempRows += " rowspan='" + rc.rows + "' ";//跨行
+                            }
+                            if (rc.cols > 0) {
+                                tempRows += " colspan='" + rc.cols + "' ";//跨列
+                            }
+                            if (thStyles) {
+                                tempRows += " style='" + thStyles + "'";//样式
+                            }
+                            tempRows += ">" + $(q).html() + "</td>";//内容
+                        }
+                    });
+ 
+                    //读取原始<table>的<td>数据行
+                    $(p).find("td").not(e.settings.exclude).each(function (i, q) {
+						// Reset for this column
+						additionalStyles = "";						
+						// Preserve background and text colors on the row
+						if(e.settings.preserveColors){
+							let compStyle = getComputedStyle(q);
+							additionalStyles += (compStyle && compStyle.backgroundColor ? "background-color: " + compStyle.backgroundColor + ";" : "");
+							additionalStyles += (compStyle && compStyle.color ? "color: " + compStyle.color + ";" : "");
+						}
+						
+                        //<td>的样式
+                        var tdStyles = "background-color:#8DB4E2;";//合计行的样式
+                        var rc = {
+                            rows: $(this).attr("rowspan"),
+                            cols: $(this).attr("colspan"),
+							align:$(this).attr("align"),
+                            flag: $(q).find(e.settings.exclude)
+                        };
+						var align='';
+						if( rc.align && rc.align.length > 1 ) {
+							align =' align="'+rc.align+'" valign="center" ';
+						}
+                        if (rc.flag.length > 0) {
+                            tempRows += "<td "+align+"> </td>"; //空格！                       
+                        } else {
+                            tempRows += "<td "+align;
+                            if (rc.rows > 0) {
+                                tempRows += " rowspan='" + rc.rows + "' ";//跨行
+                            }
+                            if (rc.cols > 0) {
+                                tempRows += " colspan='" + rc.cols + "' ";//跨列
+                            }
+                            var subtotal = getSubtotal(e.settings);//获取"合计"行所在的行号(不包括标题行)
+                            if (rowNumber == subtotal) {//if(当前行行号 == 合计行行号)
+                                if (tdStyles) {
+                                    tempRows += " style='mso-number-format:\"\@\"; " + tdStyles + "' ";//样式
+                                }
+                                else {
+                                    tempRows += " style='mso-number-format:\"\@\";' ";//纯文本
+                                }
+                            }
+                            else { 
+								if(additionalStyles!=''){
+									tempRows += " style='" + additionalStyles + "'";
+								}
+								else{
+									tempRows += " style='mso-number-format:\"\@\";' ";//纯文本
+								}
+                            }
+                            tempRows += ">" + $(q).html() + "</td>";
+                        }
+                    });
+                    tempRows += "</tr>";//生成一行结束
+                    rowNumber++;//行号+1
+                });
+                // exclude img tags
+                if (e.settings.exclude_img) {
+                    tempRows = exclude_img(tempRows);
+                }
+                // exclude link tags
+                if (e.settings.exclude_links) {
+                    tempRows = exclude_links(tempRows);
+                }
+                // exclude input tags
+                if (e.settings.exclude_inputs) {
+                    tempRows = exclude_inputs(tempRows);
+                }
+                e.tableRows.push(tempRows);
+            });
+            e.tableToExcel(e.tableRows, e.settings.name, e.settings.sheetName);
+        },
+        tableToExcel: function (table, name, sheetName) {
+            var e = this, fullTemplate = "", i, link, a;
+            e.format = function (s, c) {
+                return s.replace(/{(\w+)}/g, function (m, p) {
+                    return c[p];
+                });
+            };
+            sheetName = typeof sheetName === "undefined" ? "Sheet" : sheetName;
+            e.ctx = {
+                worksheet: name || "Worksheet",
+                table: table,
+                sheetName: sheetName
+            };
+            fullTemplate = e.template.head;
+            if ($.isArray(table)) {
+                Object.keys(table).forEach(function (i) {
+                    //fullTemplate += e.template.sheet.head + "{worksheet" + i + "}" + e.template.sheet.tail;
+                    fullTemplate += e.template.sheet.head + sheetName + i + e.template.sheet.tail;
+                });
+            }
+            fullTemplate += e.template.mid;
+            if ($.isArray(table)) {
+                Object.keys(table).forEach(function (i) {
+                    fullTemplate += e.template.table.head + "{table" + i + "}" + e.template.table.tail;
+                });
+            }
+            fullTemplate += e.template.foot;
+            for (i in table) {
+                e.ctx["table" + i] = table[i];
+            }
+            delete e.ctx.table;
+            var isIE = navigator.appVersion.indexOf("MSIE 10") !== -1 || (navigator.userAgent.indexOf("Trident") !== -1 && navigator.userAgent.indexOf("rv:11") !== -1); // this works with IE10 and IE11 both :)
+            //if (typeof msie !== "undefined" && msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./))      // this works ONLY with IE 11!!!
+            if (isIE) {
+                if (typeof Blob !== "undefined") {
+                    //use blobs if we can
+                    fullTemplate = e.format(fullTemplate, e.ctx); // with this, works with IE
+                    fullTemplate = [fullTemplate];
+                    //convert to array
+                    var blob1 = new Blob(fullTemplate, { type: "text/html" });
+                    window.navigator.msSaveBlob(blob1, getFileName(e.settings));
+                } else {
+                    //otherwise use the iframe and save
+                    //requires a blank iframe on page called txtArea1
+                    txtArea1.document.open("text/html", "replace");
+                    txtArea1.document.write(e.format(fullTemplate, e.ctx));
+                    txtArea1.document.close();
+                    txtArea1.focus();
+                    sa = txtArea1.document.execCommand("SaveAs", true, getFileName(e.settings));
+                }
+ 
+            } else {
+                var blob = new Blob([e.format(fullTemplate, e.ctx)], { type: "application/vnd.ms-excel" });
+                window.URL = window.URL || window.webkitURL;
+                link = window.URL.createObjectURL(blob);
+                a = document.createElement("a");
+                a.download = getFileName(e.settings);
+                a.href = link;
+                document.body.appendChild(a);
+                a.click();
+                document.body.removeChild(a);
+            }
+            return true;
+        }
+    };
+    //获取excel文件名
+    function getFileName(settings) {
+        return (settings.filename ? settings.filename : "table2excel");
+    }
+    //获取"合计"行所在的行号(不包括标题行)
+    function getSubtotal(settings) {
+        return (settings.subtotal ? settings.subtotal : 0);//默认值0
+    }
+    //导出Excel的表格宽度百分比的值(不含%号),默认100%
+    function getWidth(settings) {
+        return (settings.width ? settings.width : 100);
+    }
+    // Removes all img tags
+    function exclude_img(string) {
+        var _patt = /(\s+alt\s*=\s*"([^"]*)"|\s+alt\s*=\s*'([^']*)')/i;
+        return string.replace(/<img[^>]*>/gi, function myFunction(x) {
+            var res = _patt.exec(x);
+            if (res !== null && res.length >= 2) {
+                return res[2];
+            } else {
+                return "";
+            }
+        });
+    }
+    // Removes all link tags
+    function exclude_links(string) {
+        return string.replace(/<a[^>]*>|<\/a>/gi, "");
+    }
+    // Removes input params
+    function exclude_inputs(string) {
+        var _patt = /(\s+value\s*=\s*"([^"]*)"|\s+value\s*=\s*'([^']*)')/i;
+        return string.replace(/<input[^>]*>|<\/input>/gi, function myFunction(x) {
+            var res = _patt.exec(x);
+            if (res !== null && res.length >= 2) {
+                return res[2];
+            } else {
+                return "";
+            }
+        });
+    }
+    $.fn[pluginName] = function (options) {
+        var e = this;
+        e.each(function () {
+            if (!$.data(e, "plugin_" + pluginName)) {
+                $.data(e, "plugin_" + pluginName, new Plugin(this, options));
+            }
+        });
+        // chain jQuery functions
+        return e;
+    };
+})(jQuery, window, document);
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/formSelects.css b/public/static/assets/gougu/module/formSelects.css
new file mode 100644
index 0000000000000000000000000000000000000000..dc3547cffc9bc19db31641df835a0118cbc38773
--- /dev/null
+++ b/public/static/assets/gougu/module/formSelects.css
@@ -0,0 +1,174 @@
+/* formSelects多选css */
+select[xm-select]{display: none !important;}
+.xm-select-parent * {margin: 0;padding: 0;font-family: "Helvetica Neue", Helvetica, "PingFang SC", 微软雅黑, Tahoma, Arial, sans-serif; box-sizing: initial;}
+.xm-select-parent {text-align: left;}
+.xm-select-parent select {display: none;}
+.xm-select-parent .xm-select-title {position: relative;min-height: 36px;}
+.xm-select-parent .xm-input {cursor: pointer;border-radius: 2px;border-width: 1px;border-style: solid;border-color: #E6E6E6;display: block;width: 100%;box-sizing: border-box;background-color: #FFF;height: 36px;line-height: 1.3;padding-left: 10px;outline: 0}
+.xm-select-parent .xm-select-sj {display: inline-block;width: 0;height: 0;border-style: dashed;border-color: transparent;overflow: hidden;position: absolute;right: 10px;top: 50%;margin-top: -3px;cursor: pointer;border-width: 6px;border-top-color: #C2C2C2;border-top-style: solid;transition: all .3s;-webkit-transition: all .3s}
+.xm-select-parent .xm-form-selected .xm-select-sj {margin-top: -9px;transform: rotate(180deg)}
+.xm-select-parent .xm-form-select dl {display: none;position: absolute;left: 0;top: 42px;padding: 5px 0;z-index: 999;min-width: 100%;border: 1px solid #d2d2d2;max-height: 300px;overflow-y: auto;background-color: #fff;border-radius: 2px;box-shadow: 0 2px 4px rgba(0, 0, 0, .12);box-sizing: border-box;animation-fill-mode: both;-webkit-animation-name: layui-upbit;animation-name: layui-upbit;-webkit-animation-duration: .3s;animation-duration: .3s;-webkit-animation-fill-mode: both;animation-fill-mode: both}
+@-webkit-keyframes layui-upbit {
+	from {-webkit-transform: translate3d(0, 30px, 0);opacity: .3}
+	to {-webkit-transform: translate3d(0, 0, 0);opacity: 1}
+}
+@keyframes layui-upbit {
+	from {transform: translate3d(0, 30px, 0);opacity: .3}
+	to {transform: translate3d(0, 0, 0);opacity: 1}
+}
+.xm-select-parent .xm-form-selected dl {display: block}
+.xm-select-parent .xm-form-select dl dd,.xm-select-parent .xm-form-select dl dt {padding: 0 10px;line-height: 30px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis}
+.xm-select-parent .xm-form-select dl dd {cursor: pointer;height: 30px;}
+.xm-select-parent .xm-form-select dl dd:hover {background-color: #f2f2f2}
+.xm-select-parent .xm-form-select dl dt {font-size: 12px;color: #999}
+.layui-select-disabled .xm-dis-disabled {border-color: #eee!important}
+.xm-select-parent .xm-form-select dl .xm-select-tips {padding-left: 10px!important;color: #999;font-size: 14px}
+.xm-unselect {-moz-user-select: none;-webkit-user-select: none;-ms-user-select: none}
+
+.xm-form-checkbox {position: relative;display: block;vertical-align: middle;cursor: pointer;font-size: 0;-webkit-transition: .1s linear;transition: .1s linear;box-sizing: border-box;height: auto!important;line-height: normal!important;border: none!important;margin-right: 0;padding-right: 0;background: 0 0;}
+.xm-form-checkbox > i {color: #FFF; font-size: 14px; width: 14px; height: 14px; position: absolute; top: 7px; border: 1px solid #5FB878; border-radius: 2px; z-index: 2;}
+.xm-form-checkbox:hover > i {border-color: #5FB878;}
+.xm-form-checkbox > span{display: block;position: relative;padding: 0 15px 0 30px;height: 100%;font-size: 14px;border-radius: 2px 0 0 2px;background-color: #d2d2d2;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;background: 0 0;color: #666;line-height: 30px;}
+
+.xm-select-parent dl{width: 100%;}
+.xm-select-parent dl dd{position: relative;}
+.xm-select-parent dl dd > i:not(.icon-sousuo){position: absolute; right: 10px; top: 2px; color: #AAAAAA;}
+.xm-select-parent dl dd.xm-select-this div i {border: none; color: #009688; font-size: 18px;}
+.xm-select-parent dl dd.xm-select-this div i:after{content: '\e613';}
+.xm-select-parent dl dd.xm-dis-disabled div i {border-color: #C2C2C2;}
+.xm-select-parent dl dd.xm-dis-disabled.xm-select-this div i {color: #C2C2C2;}
+.xm-select-radio div.xm-form-checkbox > i {border-radius: 20px;}
+.xm-select-parent dl.xm-select-radio dd.xm-select-this div i:after{content: '\e62b';}
+
+.xm-dis-disabled,.xm-dis-disabled:hover {cursor: not-allowed!important}
+.xm-form-select dl dd.xm-dis-disabled {background-color: #fff!important}
+.xm-form-select dl dd.xm-dis-disabled span {color: #C2C2C2}
+.xm-form-select dl dd.xm-dis-disabled .xm-icon-yes {border-color: #C2C2C2}
+.xm-select-parent {position: relative;-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none}
+.xm-select-parent .xm-select {line-height: normal;height: auto;padding: 4px 10px 1px 10px;overflow: hidden;min-height: 36px;left: 0;z-index: 99;position: absolute;background: 0 0;padding-right: 20px}
+.xm-select-parent .xm-select:hover {border-color: #C0C4CC}
+.xm-select-parent .xm-select .xm-select-label {display: inline-block;margin: 0;vertical-align: middle}
+.xm-select-parent .xm-select-title div.xm-select-label>span {position: relative;padding: 2px 5px;background-color: #009688;border-radius: 2px;color: #FFF;display: inline-block;line-height: 18px;height: 18px;margin: 2px 5px 2px 0;cursor: initial;user-select: none;font-size: 14px;padding-right: 25px;-webkit-user-select: none;}
+.xm-select-parent .xm-select-title div.xm-select-label>span i {position: absolute; margin-left: 8px; font-size: 12px; cursor: pointer; line-height: 20px;}
+.xm-select-parent .xm-select .xm-select-input {border: none;height: 28px;background-color: transparent;padding: 0;vertical-align: middle;display: inline-block;width: 50px}
+.xm-select-parent .xm-select--suffix input {border: none}
+.xm-form-selected .xm-select,.xm-form-selected .xm-select:hover {border-color: #009688!important}
+.xm-select--suffix+div {position: absolute;top: 0;left: 0;bottom: 0;right: 0}
+.xm-select-dis .xm-select--suffix+div {z-index: 100;cursor: no-drop!important;opacity: .2;background-color: #FFF;}
+.xm-select-disabled,.xm-select-disabled:hover {color: #d2d2d2!important;cursor: not-allowed!important;background-color: #fff}
+.xm-select-none {display: none;margin: 5px 0;text-align: center;}
+.xm-select-none:hover {background-color: #FFF!important}
+.xm-select-empty {display: block}
+.xm-span-hide {display: none!important;}
+.layui-form-pane .xm-select,.layui-form-pane .xm-select:hover {border: none!important;top: 0px}
+.layui-form-pane .xm-select-title {border: 1px solid #e6e6e6!important}
+.xm-select-hide {display: none !important;}
+div[xm-hg] .xm-select-label{white-space: nowrap; overflow: hidden; position: absolute; right: 30px; left: 0; padding-left: 10px;}
+
+/* 颜色相关 */
+div[xm-select-skin] .xm-select-title div.xm-select-label>span {border: 1px solid #009688}
+div[xm-select-skin] .xm-select-title div.xm-select-label>span i:hover {opacity: .8;filter: alpha(opacity=80);cursor: pointer}
+div[xm-select-skin=default] .xm-select-title div.xm-select-label>span {background-color: #F0F2F5;color: #909399;border: 1px solid #F0F2F5}
+div[xm-select-skin=default] .xm-select-title div.xm-select-label>span i {color: #C0C4CC}
+div[xm-select-skin=default] .xm-select-title div.xm-select-label>span i:before {content: '\e60b'; font-size: 14px; margin-left: -3px;}
+div[xm-select-skin=default] dl dd:not(.xm-dis-disabled) i {border-color: #5FB878}
+div[xm-select-skin=default] dl dd.xm-select-this:not(.xm-dis-disabled) i {color: #5FB878}
+div[xm-select-skin=default].xm-form-selected .xm-select,div[xm-select-skin=default].xm-form-selected .xm-select:hover {border-color: #C0C4CC!important}
+div[xm-select-skin=primary] .xm-select-title div.xm-select-label>span {background-color: #009688;color: #FFF;border: 1px solid #009688}
+div[xm-select-skin=primary] .xm-select-title div.xm-select-label>span i {background-color: #009688; color: #FFF}
+div[xm-select-skin=primary] dl dd:not(.xm-dis-disabled) i {border-color: #009688}
+div[xm-select-skin=primary] dl dd.xm-select-this:not(.xm-dis-disabled) i {color: #009688}
+div[xm-select-skin=primary].xm-form-selected .xm-select,div[xm-select-skin=primary].xm-form-selected .xm-select:hover {border-color: #009688!important}
+div[xm-select-skin=normal] .xm-select-title div.xm-select-label>span {background-color: #1E9FFF;color: #FFF;border: 1px solid #1E9FFF}
+div[xm-select-skin=normal] .xm-select-title div.xm-select-label>span i {background-color: #1E9FFF;color: #FFF}
+div[xm-select-skin=normal] dl dd:not(.xm-dis-disabled) i {border-color: #1E9FFF}
+div[xm-select-skin=normal] dl dd.xm-select-this:not(.xm-dis-disabled) i {color: #1E9FFF}
+div[xm-select-skin=normal].xm-form-selected .xm-select,div[xm-select-skin=normal].xm-form-selected .xm-select:hover {border-color: #1E9FFF!important}
+div[xm-select-skin=warm] .xm-select-title div.xm-select-label>span {background-color: #FFB800;color: #FFF;border: 1px solid #FFB800}
+div[xm-select-skin=warm] .xm-select-title div.xm-select-label>span i {background-color: #FFB800;color: #FFF}
+div[xm-select-skin=warm] dl dd:not(.xm-dis-disabled) i {border-color: #FFB800}
+div[xm-select-skin=warm] dl dd.xm-select-this:not(.xm-dis-disabled) i {color: #FFB800}
+div[xm-select-skin=warm].xm-form-selected .xm-select,div[xm-select-skin=warm].xm-form-selected .xm-select:hover {border-color: #FFB800!important}
+div[xm-select-skin=danger] .xm-select-title div.xm-select-label>span {background-color: #FF5722;color: #FFF;border: 1px solid #FF5722}
+div[xm-select-skin=danger] .xm-select-title div.xm-select-label>span i {background-color: #FF5722;color: #FFF}
+div[xm-select-skin=danger] dl dd:not(.xm-dis-disabled) i {border-color: #FF5722}
+div[xm-select-skin=danger] dl dd.xm-select-this:not(.xm-dis-disabled) i {color: #FF5722}
+div[xm-select-skin=danger].xm-form-selected .xm-select,div[xm-select-skin=danger].xm-form-selected .xm-select:hover {border-color: #FF5722!important}
+
+
+/* 多选联动  */
+.xm-select-parent .layui-form-danger+.xm-select-title .xm-select {border-color: #FF5722 !important;}
+.xm-select-linkage li {padding: 10px 0px;cursor: pointer;}
+.xm-select-linkage li span {padding-left: 20px;padding-right: 30px;display: inline-block;height: 20px;overflow: hidden;text-overflow: ellipsis;}
+.xm-select-linkage li.xm-select-this span {border-left: 5px solid #009688;color: #009688;padding-left: 15px;}
+.xm-select-linkage-group {position: absolute;left: 0;top: 0;right: 0;bottom: 0;overflow-x: hidden;overflow-y: auto;}
+.xm-select-linkage-group li:hover {border-left: 1px solid #009688;}
+.xm-select-linkage-group li:hover span {padding-left: 19px;}
+.xm-select-linkage-group li.xm-select-this:hover span {padding-left: 15px;border-left-width: 4px;}
+.xm-select-linkage-group:nth-child(4n+1){background-color: #EFEFEF; left: 0;}
+.xm-select-linkage-group:nth-child(4n+1) li.xm-select-active{background-color: #F5F5F5;}
+.xm-select-linkage-group:nth-child(4n+2){background-color: #F5F5F5; left: 100px;}
+.xm-select-linkage-group:nth-child(4n+3) li.xm-select-active{background-color: #FAFAFA;}
+.xm-select-linkage-group:nth-child(4n+3){background-color: #FAFAFA; left: 200px;}
+.xm-select-linkage-group:nth-child(4n+3) li.xm-select-active{background-color: #FFFFFF;}
+.xm-select-linkage-group:nth-child(4n+4){background-color: #FFFFFF; left: 300px;}
+.xm-select-linkage-group:nth-child(4n+4) li.xm-select-active{background-color: #EFEFEF;}
+.xm-select-linkage li{list-style: none;}
+.xm-select-linkage-hide {display: none;}
+.xm-select-linkage-show {display: block;}
+
+div[xm-select-skin='default'] .xm-select-linkage li.xm-select-this span {border-left-color: #5FB878;color: #5FB878;}
+div[xm-select-skin='default'] .xm-select-linkage-group li:hover {border-left-color: #5FB878;}
+div[xm-select-skin='primary'] .xm-select-linkage li.xm-select-this span {border-left-color: #1E9FFF;color: #1E9FFF;}
+div[xm-select-skin='primary'] .xm-select-linkage-group li:hover {border-left-color: #1E9FFF;}
+div[xm-select-skin='normal'] .xm-select-linkage li.xm-select-this span {border-left-color: #1E9FFF;color: #1E9FFF;}
+div[xm-select-skin='normal'] .xm-select-linkage-group li:hover {border-left-color: #1E9FFF;}
+div[xm-select-skin='warm'] .xm-select-linkage li.xm-select-this span {border-left-color: #FFB800;color: #FFB800;}
+div[xm-select-skin='warm'] .xm-select-linkage-group li:hover {border-left-color: #FFB800;}
+div[xm-select-skin='danger'] .xm-select-linkage li.xm-select-this span {border-left-color: #FF5722;color: #FF5722;}
+div[xm-select-skin='danger'] .xm-select-linkage-group li:hover {border-left-color: #FF5722;}
+
+
+/* 快捷操作 */
+.xm-select-tips[style]:hover{background-color: #FFF!important;}
+.xm-select-parent dd > .xm-cz{position: absolute; top: 0px; right: 10px;}
+.xm-select-parent dd > .xm-cz-group{margin-right: 30px; border-right: 2px solid #ddd; height: 16px; margin-top: 8px; line-height: 16px; overflow: hidden;}
+.xm-select-parent dd > .xm-cz-group .xm-cz{display: inline-block; margin-right: 30px;}
+.xm-select-parent dd > .xm-cz-group .xm-cz i{margin-right: 5px;}
+.xm-select-parent dd > .xm-cz-group[show='name'] .xm-cz i{display: none;}
+.xm-select-parent dd > .xm-cz-group[show='icon'] .xm-cz span{display: none;}
+.xm-select-parent dd .xm-cz:hover{color: #009688;}
+div[xm-select-skin='default'] dd .xm-cz:hover{color: #C0C4CC;}
+div[xm-select-skin='primary'] dd .xm-cz:hover{color: #009688;}
+div[xm-select-skin='normal'] dd .xm-cz:hover{color: #1E9FFF;}
+div[xm-select-skin='warm'] dd .xm-cz:hover{color: #FFB800;}
+div[xm-select-skin='danger'] dd .xm-cz:hover{color: #FF5722;}
+
+
+/* 下拉里面的搜索 */
+.xm-select-tips .xm-input{border: none; border-bottom: 1px solid #E6E6E6; padding-left: 27px;}
+.xm-select-tips .icon-sousuo{position: absolute;}
+.xm-select-tips.xm-dl-input{display: none;}
+div[xm-select-search-type="1"] .xm-select-tips.xm-dl-input{display: block;}
+div[xm-select-search-type="1"] .xm-select .xm-select-input{display: none !important;}
+
+/* 阿里巴巴矢量图标库 */
+@font-face {font-family: "xm-iconfont";
+  src: url('//at.alicdn.com/t/font_792691_qxv28s6g1l9.eot?t=1534240067831'); /* IE9*/
+  src: url('//at.alicdn.com/t/font_792691_qxv28s6g1l9.eot?t=1534240067831#iefix') format('embedded-opentype'), /* IE6-IE8 */
+  url('data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAAsYAAsAAAAAEQwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAARAAAAFY8ukovY21hcAAAAYAAAACrAAACPBtV6wxnbHlmAAACLAAABnEAAAmMovtEvWhlYWQAAAigAAAAMQAAADYSctBCaGhlYQAACNQAAAAgAAAAJAgBA69obXR4AAAI9AAAABsAAAAwMCX//WxvY2EAAAkQAAAAGgAAABoN8gwubWF4cAAACSwAAAAeAAAAIAEiAM9uYW1lAAAJTAAAAUUAAAJtPlT+fXBvc3QAAAqUAAAAhAAAALJ1LunfeJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2BkYWacwMDKwMHUyXSGgYGhH0IzvmYwYuRgYGBiYGVmwAoC0lxTGByeMbwwZ27438AQw9zMcAQozAiSAwDk4AxmeJzlks0JwzAMhZ8bN/1xD4GU0h2Se26BbJMJOkkn6KmTPbJF8mT5UGg3qMRn0EPIRs8A9gAq0YsIhDcCLF5SQ9YrnLMe8VB9RSMlMjCxYcueIyfOy7CuAFHU7lP9iqApt5L3ksBJbzlgZ9PVkXDUvbWa6x8T/i0u+XyWKtmmHW0NDI55yeRok2DjaKdg65jX7Bzzm71jXnN08vzJkQvg7Ng/WAYH9Qb3wzM/AHicjVVvbFzFEd/Zfbv7/vn9uXf33vl8Pt/dO99BHOzEZ9/DKTImRS0KjUoLDUFCjtpCMGkT1D9qldQmhkiUSv2G1BBB1VYqilGREOIDViWEGzttqkpI/cAXqyL5gFRALVIF+VCJe9fZd+fEpR/o6d3s7G9mZ2dmZ3aJIKR3h0ZYmVgkIjGZJV8mDxECtenOTDOu1UU+hJoD+TCqzcNMk2V8O5OCbDVRPgZhEt4JCNTZ/4HA3+DfuWIxl8pcFFErG3K7oD7fvev8UaMUmEu259lrRjBsfs6cLhYbRfzSbSjGRVAkfQYihUXsyPkHTVyyZDNmXzSHg3Tl+aPKxpJFqbWGdtLl8w8iYDxuDTQIx7yc1YCdIx7Jk3HSwbwQwGBcyMKZVtG0ZCuJxjFJBb+foMSfhJaPOSr4FYgwSwqIx2MHJALtAdBi/7xcSMJL+fxmmBS2guD61tZm96X02mgcj0J1NAaIR9UMmhXIV24FuLUC71+r1AEmK1AYrQHUK/Tly/m8MrOZz2+FSf7jzc3NK9XR9F2lVq+gmRp0r+HK9B+VJmR263Rgd7ALwR/FOFfx/FeJS0YxQh9drakgMJhaBVizkwgqWxLD6eQ0Qo8f7p44fJziSH9x+PjLZUO+/jZ9+K35X37ljn/Rv+yW4Ziuf2nl4PfS5/LrP47OHTsFJULYjf369UZAEBmSqEOSJmG4Me6LeznA0BFkcDoJlGynVzmH2vY21DhPr25v9DjvbfTp2TXG1s5mlK0q4S7lT++6obbRox/s6CHF2LMEsHvoFfSFQIKnKQMZJVFCD6WH0p0PVvvcRx8uph8eUks0jOFNtskOkpDsJ18k9+NqVRg3qqMCSSerjyRuYUi1/vFH7YIqikGVcD+ehFl/pqPSPKZ6DG6mHisljFhBFvU/PoRkSNd/JHO6Ja5JOXcfwIGJbm/igBq/hn8Kfb57YbYUxyX4cwkLKH1u4gD9GVSL6USxCjjCO2p8VdcvH9XRYIQWqUblu3pR/v2BvXMAc3tTmJiDAQ895B9NL0C9BFdKqqRKczDX/Whg7O1irVbcqZ8/sbfYBOZwihC+6wSDzszUf+dF7rRO1O+fKaDO+nXOr6+vf8L5J44Qe4UvnlyRntwrxMoKzpFdeRJBNb9dGyiur1+nE59R+uwi9M1G395jb9KP0bcK2YM9nJB5cojcS75OFskxclzdc+pW699z8iYbtf14BGKf77ruZNyXKC0e50OEBI+V/Aug5Dex/9WjJfipuqnS00gfybjXbNe1f762tXmRPp3Bdl/l6g5JXyqXR0bK8J3PR+jvwYs8/GBnTM+kr8FX4ZknwC16XtG9iH9QfNn1vDHPe2GAj3ieV3XdF2+IPdeteh62Ra+HfQrsKWKSBtlHSOBgM7KkKQBLWnZoq1mVwotCLRGhOtSkMzMuqq2ml3SqUehdnZtynbtPLB88/Dy9dDrYVzoy/MTT6Svnlpd/AHueon5wpnGsEae/PZm+d3Jp6SSUTy7R3xw4f9/B5RN3O+5t3VNncjm6Cnt+uLx8DpedGj4yvD84HceNxTcG6ku4VPmZ9n6nNdj95BHyB3IJKxBPsKm6rpn4QopmqzlFm1MwqdxO5rPGnIc7aSfCGg1Vqyo6nUlQhnh7WiFhXzgGhVC4qjPRki9xdGCc4zXeSWb9BG1ktlqz2Q5Y7S2sIJfivkpVKCCDpyCWdbQzECj76qMVqvyJ/LxyI2rTv1bTC25lSM9xAUJ4Lc+U0wXTsKXDmaA8tHX+hvDt4Wa9IHLcMUBz9VwpL4xi2aGasAPPKNUbbmD/2jAtk0uXY4eJx8zRgj9iAnVNt5X+BL5vlHTOaiOmG7g6+7ZBNUOaefNXuJF3u25RjVvBLeW8E4wV7ZJBpbAXXGnqrwgupWVTAKqZjq5HbW44fMguNJhgwmw8oOk8GCqE8F3GhLB0uS/UDVt4lgjtqGxK/rpwuaDAqKHZNuWmJjVKuWUxbpg2B9DtoRdN3TKF9B0hw4p41C5i3CI9w4civP3aQLlmLMK3wpJpaI7BvmlhPtH3nPWCKQAdE2hK9zyuUeAm921qCA2kvqY8N1yDMq4beJlG+4XQqHDCQnqPlJIyyN579S4tIGcRv/82BbFfK9SgnVHkZzMeaSQjqR5/fP5XF2Chh+sW0g0gn27snqXv3/bsszsfJbCAIiTdjRTVCBL6jV0K5D8H/8xVAAAAeJxjYGRgYADi16c/vIvnt/nKwM3CAALXZxxzhtH///23YVFhbgZyORiYQKIAm34OJQAAAHicY2BkYGBu+N/AEMOi/P/f//8sKgxAERTAAwCmuAa3eJxjYWBgYAFhRiiNFf//z6L8/x+IDQAkCQRQAAAAAAAAjAEAATgBfgGaAiACbgMMA2AEhATGAAB4nGNgZGBg4GE4DMQgwATEXEDIwPAfzGcAAB2tAfIAAHicZY9NTsMwEIVf+gekEqqoYIfkBWIBKP0Rq25YVGr3XXTfpk6bKokjx63UA3AejsAJOALcgDvwSCebNpbH37x5Y08A3OAHHo7fLfeRPVwyO3INF7gXrlN/EG6QX4SbaONVuEX9TdjHM6bCbXRheYPXuGL2hHdhDx18CNdwjU/hOvUv4Qb5W7iJO/wKt9Dx6sI+5l5XuI1HL/bHVi+cXqnlQcWhySKTOb+CmV7vkoWt0uqca1vEJlODoF9JU51pW91T7NdD5yIVWZOqCas6SYzKrdnq0AUb5/JRrxeJHoQm5Vhj/rbGAo5xBYUlDowxQhhkiMro6DtVZvSvsUPCXntWPc3ndFsU1P9zhQEC9M9cU7qy0nk6T4E9XxtSdXQrbsuelDSRXs1JErJCXta2VELqATZlV44RelzRiT8oZ0j/AAlabsgAAAB4nG2L3QqCQBCFZ9RWU7sOfAeh8IFi3N10EHYUG1p8+gSjqz44F+cPEjgo4T81Jphihic0mGOBZyyxwhovUCxKIe4ylthRuDqV+I22UcLQ6+QH4ubWdZZkU3m4o/0tUqtSvT33TPLits12fzc+zhRcvoquo0o281OLhcMw7Q+AD8sULE0=') format('woff'),
+  url('//at.alicdn.com/t/font_792691_qxv28s6g1l9.ttf?t=1534240067831') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
+  url('//at.alicdn.com/t/font_792691_qxv28s6g1l9.svg?t=1534240067831#iconfont') format('svg'); /* iOS 4.1- */
+}
+.xm-iconfont {font-family:"xm-iconfont" !important; font-size:14px; font-style:normal; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;}
+.icon-quanxuan:before { content: "\e62c"; }
+.icon-caidan:before { content: "\e610"; }
+.icon-fanxuan:before { content: "\e837"; }
+.icon-pifu:before { content: "\e668"; }
+.icon-qingkong:before { content: "\e63e"; }
+.icon-sousuo:before { content: "\e600"; }
+.icon-danx:before { content: "\e62b"; }
+.icon-duox:before { content: "\e613"; }
+.icon-close:before { content: "\e601"; }
+.icon-expand:before { content: "\e641"; }
+
diff --git a/public/static/assets/gougu/module/formSelects.js b/public/static/assets/gougu/module/formSelects.js
new file mode 100644
index 0000000000000000000000000000000000000000..f675e947b8331c4a490172c1ab1e94c789c28ca1
--- /dev/null
+++ b/public/static/assets/gougu/module/formSelects.js
@@ -0,0 +1 @@
+"use strict";var _typeof=typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};function _defineProperty(e,t,n){if(t in e){Object.defineProperty(e,t,{value:n,enumerable:true,configurable:true,writable:true})}else{e[t]=n}return e}(function(e,t,n){if((typeof exports==="undefined"?"undefined":_typeof(exports))==="object"){module.exports=n()}else if(typeof define==="function"&&define.amd){define(n)}else if(t.layui&&e.define){e.define(["jquery"],function(e){e("formSelects",n())})}else{t.formSelects=n()}})(typeof layui=="undefined"?null:layui,window,function(){var t="4.0.0.0910",v="xm-select",m="xm-select-parent",y="xm-select-input",g="xm-select--suffix",w="xm-select-this",x="xm-select-label",k="xm-select-search",b="xm-select-search-type",C="xm-select-show-count",S="xm-select-create",d="xm-select-create-long",T="xm-select-max",L="xm-select-skin",j="xm-select-direction",A="xm-select-height",E="xm-dis-disabled",N="xm-select-dis",p="xm-select-temp",D="xm-select-radio",H="xm-select-linkage",F="xm-select-dl",h="xm-select-hide",_="xm-hide-input",O="xm-select-sj",e="xm-icon-close",I="xm-select-title",P="xm-form-select",f="xm-form-selected",V="xm-select-none",U="xm-select-empty",M="xm-input",W="xm-dl-input",J="xm-select-tips",s="xm-iconfont",B="XM_PID_VALUE",R="xm-cz",l="xm-cz-group",n="请选择",q={},z={on:{},endOn:{},filter:{},maxTips:{},opened:{},closed:{}},X={type:"get",header:{},first:true,data:{},searchUrl:"",searchName:"keyword",searchVal:null,keyName:"name",keyVal:"value",keySel:"selected",keyDis:"disabled",keyChildren:"children",dataType:"",delay:500,beforeSuccess:null,success:null,error:null,beforeSearch:null,response:{statusCode:0,statusName:"code",msgName:"msg",dataName:"data"},tree:{nextClick:function e(t,n,i){i([])},folderChoose:true,lazy:true}},i=[{icon:"xm-iconfont icon-quanxuan",name:"全选",click:function e(t,n){n.selectAll(t,true,true)}},{icon:"xm-iconfont icon-qingkong",name:"清空",click:function e(t,n){n.removeAll(t,true,true)}},{icon:"xm-iconfont icon-fanxuan",name:"反选",click:function e(t,n){n.reverse(t,true,true)}},{icon:"xm-iconfont icon-pifu",name:"换肤",click:function e(t,n){n.skin(t)}}],Q=window.$||window.layui&&window.layui.jquery,c=Q(window),Y={},a={},r={},$=function e(t){var l=this;this.config={name:null,max:null,maxTips:function e(t,n,i,a){var r=Q('[xid="'+l.config.name+'"]').prev().find("."+v);if(r.parents(".layui-form-item[pane]").length){r=r.parents(".layui-form-item[pane]")}r.attr("style","border-color: red !important");setTimeout(function(){r.removeAttr("style")},300)},init:null,on:null,opened:null,closed:null,filter:function e(t,n,i,a){return i.name.indexOf(n)==-1},clearid:-1,direction:"auto",height:null,isEmpty:false,btns:[i[0],i[1],i[2]],searchType:0,create:function e(t,n){return Date.now()},template:function e(t,n){return n.name},showCount:0,isCreate:false,placeholder:n,clearInput:false};this.select=null;this.values=[];Q.extend(this.config,t,{searchUrl:t.isSearch?t.searchUrl:null,placeholder:t.optionsFirst?t.optionsFirst.value?n:t.optionsFirst.innerHTML||n:n,btns:t.radio?[i[1]]:[i[0],i[1],i[2]]},r[t.name]||a);if(isNaN(this.config.showCount)||this.config.showCount<=0){this.config.showCount=19921012}};var o=function e(){this.appender();this.on();this.onreset()};o.prototype.appender=function(){if(!Array.prototype.map){Array.prototype.map=function(e,t){var n,i,a,r=Object(this),l=r.length>>>0;if(t){n=t}i=new Array(l);a=0;while(a<l){var o,s;if(a in r){o=r[a];s=e.call(n,o,a,r);i[a]=s}a++}return i}}if(!Array.prototype.forEach){Array.prototype.forEach=function e(t,n){var i,a;if(this==null){throw new TypeError("this is null or not defined")}var r=Object(this);var l=r.length>>>0;if(typeof t!=="function"){throw new TypeError(t+" is not a function")}if(arguments.length>1){i=n}a=0;while(a<l){var o;if(a in r){o=r[a];t.call(i,o,a,r)}a++}}}if(!Array.prototype.filter){Array.prototype.filter=function(e){if(this===void 0||this===null){throw new TypeError}var t=Object(this);var n=t.length>>>0;if(typeof e!=="function"){throw new TypeError}var i=[];var a=arguments[1];for(var r=0;r<n;r++){if(r in t){var l=t[r];if(e.call(a,l,r,t)){i.push(l)}}}return i}}};o.prototype.init=function(e){var h=this;Q(e?e:"select["+v+"]").each(function(e,t){var n=Q(t),i=n.attr(v),a=n.next(".layui-form-select"),r=n.next("."+m),l={name:i,disabled:t.disabled,max:n.attr(T)-0,isSearch:n.attr(k)!=undefined,searchUrl:n.attr(k),isCreate:n.attr(S)!=undefined,radio:n.attr(D)!=undefined,skin:n.attr(L),direction:n.attr(j),optionsFirst:t.options[0],height:n.attr(A),formname:n.attr("name")||n.attr("_name"),layverify:n.attr("lay-verify")||n.attr("_lay-verify"),layverType:n.attr("lay-verType"),searchType:n.attr(b)=="dl"?1:0,showCount:n.attr(C)-0},o=n.find("option[selected]").toArray().map(function(e){return{name:e.innerHTML,value:e.value}}),s=new $(l);s.values=o;if(s.config.init){s.values=s.config.init.map(function(e){if((typeof e==="undefined"?"undefined":_typeof(e))=="object"){return e}return{name:n.find('option[value="'+e+'"]').text(),value:e}}).filter(function(e){return e.name});s.config.init=s.values.concat([])}else{s.config.init=o.concat([])}!s.values&&(s.values=[]);q[i]=s;a[0]&&a.remove();r[0]&&r.remove();var d=h.renderSelect(i,s.config.placeholder,t);var c=!s.config.height||s.config.height=="auto"?"":'xm-hg style="height: 34px;"';var f=['<div class="'+x+'">','<input type="text" fsw class="'+M+" "+y+'" '+(s.config.isSearch?"":'style="display: none;"')+' autocomplete="off" debounce="0" />',"</div>"];var u=Q('<div class="'+P+'" '+L+'="'+s.config.skin+'">\n\t\t\t\t\t<input class="'+_+'" value="" name="'+s.config.formname+'" lay-verify="'+s.config.layverify+'" lay-verType="'+s.config.layverType+'" type="text" style="position: absolute;bottom: 0; z-index: -1;width: 100%; height: 100%; border: none; opacity: 0;"/>\n\t\t\t\t\t<div class="'+I+" "+(s.config.disabled?N:"")+'">\n\t\t\t\t\t\t<div class="'+M+" "+v+'" '+c+">\n\t\t\t\t\t\t\t"+f.join("")+'\n\t\t\t\t\t\t\t<i class="'+O+'"></i>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="'+g+'">\n\t\t\t\t\t\t\t<input type="text" autocomplete="off" placeholder="'+s.config.placeholder+'" readonly="readonly" unselectable="on" class="'+M+'">\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<dl xid="'+i+'" class="'+F+" "+(s.config.radio?D:"")+'">'+d+"</dl>\n\t\t\t\t</div>");var p=Q('<div class="'+m+'" FS_ID="'+i+'"></div>');p.append(u);n.after(p);n.attr("lay-ignore","");n.removeAttr("name")&&n.attr("_name",s.config.formname);n.removeAttr("lay-verify")&&n.attr("_lay-verify",s.config.layverify);if(s.config.isSearch){Y[i]=Q.extend({},X,{searchUrl:s.config.searchUrl},Y[i]);Q(document).on("input","div."+m+'[FS_ID="'+i+'"] .'+y,function(e){h.search(i,e,s.config.searchUrl)});if(s.config.searchUrl){h.triggerSearch(u,true)}}else{u.find("dl dd."+W).css("display","none")}})};o.prototype.search=function(a,e,t,n){var r=this;var i=void 0;if(n){i=n}else{i=e.target;var l=e.keyCode;if(l===9||l===13||l===37||l===38||l===39||l===40){return false}}var o=Q.trim(i.value);this.changePlaceHolder(Q(i));var s=Y[a]?Y[a]:X;t=s.searchUrl||t;var d=q[a],c=d.config.isCreate,f=Q('dl[xid="'+a+'"]').parents("."+P);if(t){if(s.searchVal){o=s.searchVal;s.searchVal=""}if(!s.beforeSearch||s.beforeSearch&&s.beforeSearch instanceof Function&&s.beforeSearch(a,t,o)){var u=s.delay;if(s.first){s.first=false;u=10}clearTimeout(d.clearid);d.clearid=setTimeout(function(){f.find("dl > *:not(."+J+")").remove();f.find("dd."+V).addClass(U).text("请求中");r.ajax(a,t,o,false,null,true)},u)}}else{f.find("dl ."+h).removeClass(h);f.find("dl dd:not(."+J+")").each(function(e,t){var n=Q(t);var i=z.filter[a]||q[a].config.filter;if(i&&i(a,o,r.getItem(a,n),n.hasClass(E))==true){n.addClass(h)}});f.find("dl dt").each(function(e,t){if(!Q(t).nextUntil("dt",":not(."+h+")").length){Q(t).addClass(h)}});this.create(a,c,o);var p=f.find("dl dd:not(."+J+"):not(."+h+")");if(!p.length){f.find("dd."+V).addClass(U).text("无匹配项")}else{f.find("dd."+V).removeClass(U)}}};o.prototype.isArray=function(e){return Object.prototype.toString.call(e)=="[object Array]"};o.prototype.triggerSearch=function(e,i){var a=this;(e?[e]:Q("."+P).toArray()).forEach(function(e,t){e=Q(e);var n=e.find("dl").attr("xid");if(n&&q[n]&&q[n].config.isEmpty||i){a.search(n,null,null,q[n].config.searchType==0?e.find("."+x+" ."+y):e.find("dl ."+W+" ."+y))}})};o.prototype.clearInput=function(e){var t=Q("."+m+'[fs_id="'+e+'"]');var n=q[e].config.searchType==0?t.find("."+x+" ."+y):t.find("dl ."+W+" ."+y);n.val("")};o.prototype.ajax=function(i,a,r,l,o,s,d,c){var f=this;var u=Q("."+m+' dl[xid="'+i+'"]').parents("."+P);if(!u[0]||!a){return}var p=Y[i]?Y[i]:X;var e=Q.extend(true,{},p.data);e[p.searchName]=r;Q.ajax({type:p.type,headers:p.header,url:a,data:p.dataType=="json"?JSON.stringify(e):e,success:function e(t){if(typeof t=="string"){t=JSON.parse(t)}p.beforeSuccess&&p.beforeSuccess instanceof Function&&(t=p.beforeSuccess(i,a,r,t));if(f.isArray(t)){var n={};n[p.response.statusName]=p.response.statusCode;n[p.response.msgName]="";n[p.response.dataName]=t;t=n}if(t[p.response.statusName]!=p.response.statusCode){u.find("dd."+V).addClass(U).text(t[p.response.msgName])}else{u.find("dd."+V).removeClass(U);f.renderData(i,t[p.response.dataName],l,o,s,c);q[i].config.isEmpty=t[p.response.dataName].length==0}d&&d(i);p.success&&p.success instanceof Function&&p.success(i,a,r,t)},error:function e(t){u.find("dd[lay-value]:not(."+J+")").remove();u.find("dd."+V).addClass(U).text("服务异常");p.error&&p.error instanceof Function&&p.error(i,a,r,t)}})};o.prototype.renderData=function(n,e,t,i,a,r){var l=this;if(t){this.renderLinkage(n,e,i);return}if(r){this.renderReplace(n,e);return}var o=Q("."+m+' dl[xid="'+n+'"]').parents("."+P);var s=Y[n]?Y[n]:X;var d=o.find("."+g+" input");e=this.exchangeData(n,e);var c=[];o.find("dl").html(this.renderSelect(n,d.attr("placeholder")||d.attr("back"),e.map(function(e){var t=Q.extend({},e,{innerHTML:e[s.keyName],value:e[s.keyVal],sel:e[s.keySel],disabled:e[s.keyDis],type:e.type,name:e[s.keyName]});if(t.sel){c.push(t)}return t})));var f=o.find("."+x);var u=o.find("dl[xid]");if(a){var p=q[n].values;p.forEach(function(e,t){u.find('dd[lay-value="'+e.value+'"]').addClass(w)});c.forEach(function(e,t){if(l.indexOf(p,e)==-1){l.addLabel(n,f,e);u.find('dd[lay-value="'+e.value+'"]').addClass(w);p.push(e)}})}else{c.forEach(function(e,t){l.addLabel(n,f,e);u.find('dd[lay-value="'+e.value+'"]').addClass(w)});q[n].values=c}this.commonHandler(n,f)};o.prototype.renderLinkage=function(l,e,n){var i=[],a=0,o={0:e},s=Y[l]?Y[l]:X;G[l]={};var t=function e(){var r=i[a++]=[],t=o;o={};Q.each(t,function(a,e){Q.each(e,function(e,t){var n={pid:a,name:t[s.keyName],value:t[s.keyVal]};G[l][n.value]=Q.extend(t,n);r.push(n);var i=t[s.keyChildren];if(i&&i.length){o[n.value]=i}})})};do{t()}while(Object.getOwnPropertyNames(o).length);var r=Q("."+m+' dl[xid="'+l+'"]').parents("."+P);var d=['<div class="xm-select-linkage">'];Q.each(i,function(e,t){var i=['<div style="left: '+(n-0)*e+'px;" class="xm-select-linkage-group xm-select-linkage-group'+(e+1)+" "+(e!=0?"xm-select-linkage-hide":"")+'">'];Q.each(t,function(e,t){var n='<li title="'+t.name+'" pid="'+t.pid+'" xm-value="'+t.value+'"><span>'+t.name+"</span></li>";i.push(n)});i.push("</div>");d=d.concat(i)});d.push('<div style="clear: both; height: 288px;"></div>');d.push("</div>");r.find("dl").html(d.join(""));r.find("."+y).css("display","none")};o.prototype.renderReplace=function(n,e){var i=this;var t=Q("."+m+' dl[xid="'+n+'"]');var a=Y[n]?Y[n]:X;e=this.exchangeData(n,e);G[n]=e;var r=e.map(function(e){var t=Q.extend({},e,{innerHTML:e[a.keyName],value:e[a.keyVal],sel:e[a.keySel],disabled:e[a.keyDis],type:e.type,name:e[a.keyName]});return i.createDD(n,t)}).join("");t.find("dd:not(."+J+"),dt:not([style])").remove();t.find("dt[style]").after(Q(r))};o.prototype.exchangeData=function(e,t){var n=Y[e]?Y[e]:X;var i=n["keyChildren"];var a=n["keyDis"];G[e]={};var r=this.getChildrenList(t,i,a,[],false);return r};o.prototype.getChildrenList=function(e,t,n,i,a){var r=[],l=0;for(var o=0;o<e.length;o++){var s=e[o];if(s.type&&s.type=="optgroup"){r.push(s);continue}else{l++}var d=i.concat([]);d.push(l-1+"_E");s[B]=JSON.stringify(d);s[n]=s[n]||a;r.push(s);var c=s[t];if(c&&K.isArray(c)&&c.length){s["XM_TREE_FOLDER"]=true;var f=d.concat([]);var u=this.getChildrenList(c,t,n,f,s[n]);r=r.concat(u)}}return r};o.prototype.create=function(e,t,n){if(t&&n){var i=q[e],a=Q('[xid="'+e+'"]'),r=a.find("dd."+J+"."+W),l=null,o=a.find("dd."+p);a.find("dd:not(."+J+"):not(."+p+")").each(function(e,t){if(n==Q(t).find("span").attr("name")){l=t}});if(!l){var s=i.config.create(e,n);if(o[0]){o.attr("lay-value",s);o.find("span").text(n);o.find("span").attr("name",n);o.removeClass(h)}else{r.after(Q(this.createDD(e,{name:n,innerHTML:n,value:s},p+" "+d)))}}}else{Q("[xid="+e+"] dd."+p).remove()}};o.prototype.createDD=function(e,t,n){var i=Y[e]?Y[e]:X;var a=Q.trim(t.innerHTML);G[e][t.value]=Q(t).is("option")?t=function(){var e={};e[i.keyName]=a;e[i.keyVal]=t.value;e[i.keyDis]=t.disabled;return e}():t;var r=q[e].config.template(e,t);var l=t[B];l?l=JSON.parse(l):l=[-1];var o=l[0]==-1?"":'tree-id="'+l.join("-")+'" tree-folder="'+!!t["XM_TREE_FOLDER"]+'"';return'<dd lay-value="'+t.value+'" class="'+(t.disabled?E:"")+" "+(n?n:"")+'" '+o+'>\n\t\t\t\t\t<div class="xm-unselect xm-form-checkbox '+(t.disabled?E:"")+'"  style="margin-left: '+(l.length-1)*30+'px">\n\t\t\t\t\t\t<i class="'+s+'"></i>\n\t\t\t\t\t\t<span name="'+a+'">'+r+"</span>\n\t\t\t\t\t</div>\n\t\t\t\t</dd>"};o.prototype.createQuickBtn=function(e,t){return'<div class="'+R+'" method="'+e.name+'" title="'+e.name+'" '+(t?'style="margin-right: '+t+'"':"")+'><i class="'+e.icon+'"></i><span>'+e.name+"</span></div>"};o.prototype.renderBtns=function(e,t,n){var i=this;var a=[];var r=Q('dl[xid="'+e+'"]');a.push('<div class="'+l+'" show="'+t+'" style="max-width: '+(r.prev().width()-54)+'px;">');Q.each(q[e].config.btns,function(e,t){a.push(i.createQuickBtn(t,n))});a.push("</div>");a.push(this.createQuickBtn({icon:"xm-iconfont icon-caidan",name:""}));return a.join("")};o.prototype.renderSelect=function(n,e,t){var i=this;G[n]={};var a=[];if(q[n].config.btns.length){setTimeout(function(){var e=Q('dl[xid="'+n+'"]');e.parents("."+P).attr(b,q[n].config.searchType);e.find("."+l).css("max-width",e.prev().width()-54+"px")},10);a.push(['<dd lay-value="" class="'+J+'" style="background-color: #FFF!important;">',this.renderBtns(n,null,"30px"),"</dd>",'<dd lay-value="" class="'+J+" "+W+'" style="background-color: #FFF!important;">','<i class="xm-iconfont icon-sousuo"></i>','<input type="text" class="'+M+" "+y+'" placeholder="请搜索"/>',"</dd>"].join(""))}else{a.push('<dd lay-value="" class="'+J+'">'+e+"</dd>")}if(this.isArray(t)){Q(t).each(function(e,t){if(t){if(t.type&&t.type==="optgroup"){a.push("<dt>"+t.name+"</dt>")}else{a.push(i.createDD(n,t))}}})}else{Q(t).find("*").each(function(e,t){if(t.tagName.toLowerCase()=="option"&&e==0&&!t.value){return}if(t.tagName.toLowerCase()==="optgroup"){a.push("<dt>"+t.label+"</dt>")}else{a.push(i.createDD(n,t))}})}a.push('<dt style="display:none;"> </dt>');a.push('<dd class="'+J+" "+V+" "+(a.length===2?U:"")+'">没有选项</dd>');return a.join("")};o.prototype.on=function(){var n=this;this.one();Q(document).on("click",function(e){if(!Q(e.target).parents("."+I)[0]){Q("."+m+" dl ."+h).removeClass(h);Q("."+m+" dl dd."+U).removeClass(U);Q("."+m+" dl dd."+p).remove();Q.each(q,function(e,t){n.clearInput(e);if(!t.values.length){n.changePlaceHolder(Q('div[FS_ID="'+e+'"] .'+x))}})}Q("."+m+" ."+f).each(function(e,t){n.changeShow(Q(t).find("."+I),false)})})};o.prototype.calcLabelLeft=function(e,t,n){var i=this.getPosition(e[0]);i.y=i.x+e[0].clientWidth;var a=e[0].offsetLeft;if(!e.find("span").length){a=0}else if(n){var r=e.find("span:last");r.css("display")=="none"?r=r.prev()[0]:r=r[0];var l=this.getPosition(r);l.y=l.x+r.clientWidth;if(l.y>i.y){a=a-(l.y-i.y)-5}else{a=0}}else{if(t<0){var o=e.find(":last");o.css("display")=="none"?o=o.prev()[0]:o=o[0];var s=this.getPosition(o);s.y=s.x+o.clientWidth;if(s.y>i.y){a-=10}}else{if(a<0){a+=10}if(a>0){a=0}}}e.css("left",a+"px")};o.prototype.one=function(e){var C=this;Q(e?e:document).off("click","."+I).on("click","."+I,function(e){var t=Q(e.target),n=t.is(I)?t:t.parents("."+I),i=n.next(),a=i.attr("xid");Q("dl[xid]").not(i).each(function(e,t){C.clearInput(Q(t).attr("xid"))});Q("dl[xid]").not(i).find("dd."+h).removeClass(h);if(n.hasClass(N)){return false}if(t.is("."+O)||t.is("."+y+"[readonly]")){C.changeShow(n,!n.parents("."+P).hasClass(f));return false}if(n.find("."+y+":not(readonly)")[0]){var r=n.find("."+y),l={x:e.pageX,y:e.pageY},o=C.getPosition(n[0]),s=n.width();while(l.x>o.x){if(Q(document.elementFromPoint(l.x,l.y)).is(r)){r.focus();C.changeShow(n,true);return false}l.x-=50}}if(t.is("."+y)){C.changeShow(n,true);return false}if(t.is('i[fsw="'+v+'"]')){var d=C.getItem(a,t),c=i.find("dd[lay-value='"+d.value+"']");if(c.hasClass(E)){return false}C.handlerLabel(a,c,false,d);return false}C.changeShow(n,!n.parents("."+P).hasClass(f));return false});Q(e?e:document).off("click","dl."+F).on("click","dl."+F,function(e){var t=Q(e.target);if(t.is("."+H)||t.parents("."+H)[0]){t=t.is("li")?t:t.parents("li[xm-value]");var n=t.parents(".xm-select-linkage-group"),i=t.parents("dl").attr("xid");if(!i){return false}n.find(".xm-select-active").removeClass("xm-select-active");t.addClass("xm-select-active");n.nextAll(".xm-select-linkage-group").addClass("xm-select-linkage-hide");var a=n.next(".xm-select-linkage-group");a.find("li").addClass("xm-select-linkage-hide");a.find('li[pid="'+t.attr("xm-value")+'"]').removeClass("xm-select-linkage-hide");if(!a[0]||a.find("li:not(.xm-select-linkage-hide)").length==0){var r=[],l=0,o=!t.hasClass("xm-select-this");if(q[i].config.radio){t.parents(".xm-select-linkage").find(".xm-select-this").removeClass("xm-select-this")}do{r[l++]={name:t.find("span").text(),value:t.attr("xm-value")};t=t.parents(".xm-select-linkage-group").prev().find('li[xm-value="'+t.attr("pid")+'"]')}while(t.length);r.reverse();var s={name:r.map(function(e){return e.name}).join("/"),value:r.map(function(e){return e.value}).join("/")};C.handlerLabel(i,null,o,s)}else{a.removeClass("xm-select-linkage-hide")}return false}if(t.is("dl")){return false}if(t.is("dt")){t.nextUntil("dt").each(function(e,t){t=Q(t);if(t.hasClass(E)||t.hasClass(w)){}else{t.find("i:not(.icon-expand)").click()}});return false}var d=t.is("dd")?t:t.parents("dd");var c=d.parent("dl").attr("xid");if(d.hasClass(E)){return false}if(t.is("i.icon-caidan")){var f=[],u=[];t.parents("dl").find('dd[tree-folder="true"]').each(function(e,t){Q(t).attr("xm-tree-hidn")==undefined?f.push(t):u.push(t)});var p=u.length?u:f;p.forEach(function(e){return e.click()});return false}var h=d.attr("tree-id");if(h){if(t.is("i:not(.icon-expand)")){C.handlerLabel(c,d,!d.hasClass(w));return false}var v=Y[c]||X;var m=v.tree;var y=d.nextAll('dd[tree-id^="'+h+'"]');if(y&&y.length){var g=y[0].clientHeight;g?(C.addTreeHeight(d,g),g=0):(g=d.attr("xm-tree-hidn")||36,d.removeAttr("xm-tree-hidn"),d.find(">i").remove(),y=y.filter(function(e,t){return Q(t).attr("tree-id").split("-").length-1==h.split("-").length}));y.animate({height:g},150);return false}else{if(m.nextClick&&m.nextClick instanceof Function){m.nextClick(c,C.getItem(c,d),function(e){if(!e||!e.length){C.handlerLabel(c,d,!d.hasClass(w))}else{d.attr("tree-folder","true");var n=[];e.forEach(function(e,t){e.innerHTML=e[v.keyName];e[B]=JSON.stringify(h.split("-").concat([t]));n.push(C.createDD(c,e));G[c][e[v.keyVal]]=e});d.after(n.join(""))}});return false}}}if(d.hasClass(J)){var x=t.is("."+R)?t:t.parents("."+R);if(!x[0]){return false}var k=x.attr("method");var b=q[c].config.btns.filter(function(e){return e.name==k})[0];b&&b.click&&b.click instanceof Function&&b.click(c,C);return false}C.handlerLabel(c,d,!d.hasClass(w));return false})};o.prototype.addTreeHeight=function(e,i){var a=this;var t=e.attr("tree-id");var n=e.nextAll('dd[tree-id^="'+t+'"]');if(n.length){e.append('<i class="xm-iconfont icon-expand"></i>');e.attr("xm-tree-hidn",i);n.each(function(e,t){var n=Q(t);a.addTreeHeight(n,i)})}};var G={};o.prototype.getItem=function(e,t){if(t instanceof Q){if(t.is('i[fsw="'+v+'"]')){var n=t.parent();return G[e][t]||{name:n.find("font").text(),value:n.attr("value")}}var i=t.attr("lay-value");return!G[e][i]?G[e][i]={name:t.find("span[name]").attr("name"),value:i}:G[e][i]}else if(typeof t=="string"&&t.indexOf("/")!=-1){return G[e][t]||{name:this.valToName(e,t),value:t}}return G[e][t]};o.prototype.linkageAdd=function(e,t){var n=Q('dl[xid="'+e+'"]');n.find(".xm-select-active").removeClass("xm-select-active");var i=t.value.split("/");var a=void 0,r=void 0,l=0;var o=[];do{a=i[l];r=n.find(".xm-select-linkage-group"+(l+1)+' li[xm-value="'+a+'"]');r[0]&&o.push(r);l++}while(r.length&&a!=undefined);if(o.length==i.length){Q.each(o,function(e,t){t.addClass("xm-select-this")})}};o.prototype.linkageDel=function(e,t){var n=Q('dl[xid="'+e+'"]');var i=t.value.split("/");var a=void 0,r=void 0,l=i.length-1;do{a=i[l];r=n.find(".xm-select-linkage-group"+(l+1)+' li[xm-value="'+a+'"]');if(!r.parent().next().find("li[pid="+a+"].xm-select-this").length){r.removeClass("xm-select-this")}l--}while(r.length&&a!=undefined)};o.prototype.valToName=function(e,t){var i=Q('dl[xid="'+e+'"]');var n=(t+"").split("/");if(!n.length){return null}var a=[];Q.each(n,function(e,t){var n=i.find(".xm-select-linkage-group"+(e+1)+' li[xm-value="'+t+'"] span').text();a.push(n)});return a.length==n.length?a.join("/"):null};o.prototype.commonHandler=function(e,t){if(!t||!t[0]){return}this.checkHideSpan(e,t);this.changePlaceHolder(t);this.retop(t.parents("."+P));this.calcLabelLeft(t,0,true);this.setHidnVal(e,t);t.parents("."+I+" ."+v).attr("title",q[e].values.map(function(e){return e.name}).join(","))};o.prototype.initVal=function(e){var o=this;var t={};if(e){t[e]=q[e]}else{t=q}Q.each(t,function(n,e){var t=e.values,i=Q('dl[xid="'+n+'"]').parent(),a=i.find("."+x),r=i.find("dl");r.find("dd."+w).removeClass(w);var l=t.concat([]);l.concat([]).forEach(function(e,t){o.addLabel(n,a,e);r.find('dd[lay-value="'+e.value+'"]').addClass(w)});if(e.config.radio){l.length&&t.push(l[l.length-1])}o.commonHandler(n,a)})};o.prototype.setHidnVal=function(e,t){if(!t||!t[0]){return}t.parents("."+m).find("."+_).val(q[e].values.map(function(e){return e.value}).join(","))};o.prototype.handlerLabel=function(e,t,n,i,a){var r=Q('[xid="'+e+'"]').prev().find("."+x),l=t&&this.getItem(e,t),o=q[e].values,s=q[e].config.on||z.on[e],d=q[e].config.endOn||z.endOn[e];if(i){l=i}var c=q[e];if(n&&c.config.max&&c.values.length>=c.config.max){var f=z.maxTips[e]||q[e].config.maxTips;f&&f(e,o.concat([]),l,c.config.max);return}if(!a){if(s&&s instanceof Function&&s(e,o.concat([]),l,n,t&&t.hasClass(E))==false){return}}var u=Q('dl[xid="'+e+'"]');n?(t&&t[0]?(t.addClass(w),t.removeClass(p)):u.find(".xm-select-linkage")[0]&&this.linkageAdd(e,l),this.addLabel(e,r,l),o.push(l)):(t&&t[0]?t.removeClass(w):u.find(".xm-select-linkage")[0]&&this.linkageDel(e,l),this.delLabel(e,r,l),this.remove(o,l));if(!r[0])return;if(c.config.radio){this.changeShow(r,false)}r.parents("."+I).prev().removeClass("layui-form-danger");c.config.clearInput&&this.clearInput(e);this.commonHandler(e,r);!a&&d&&d instanceof Function&&d(e,o.concat([]),l,n,t&&t.hasClass(E))};o.prototype.addLabel=function(e,t,n){if(!n)return;var i='fsw="'+v+'"';var a=[Q("<span "+i+' value="'+n.value+'"><font '+i+">"+n.name+"</font></span>"),Q("<i "+i+' class="xm-iconfont icon-close"></i>')],r=a[0],l=a[1];r.append(l);var o=q[e];if(o.config.radio){o.values.length=0;Q('dl[xid="'+e+'"]').find("dd."+w+':not([lay-value="'+n.value+'"])').removeClass(w);t.find("span").remove()}t.find("input").css("width","50px");t.find("input").before(r)};o.prototype.delLabel=function(e,t,n){if(!n)return;t.find('span[value="'+n.value+'"]:first').remove()};o.prototype.checkHideSpan=function(e,t){var n=t.parents("."+v)[0].offsetHeight+5;t.find("span.xm-span-hide").removeClass("xm-span-hide");t.find("span[style]").remove();var i=q[e].config.showCount;t.find("span").each(function(e,t){if(e>=i){Q(t).addClass("xm-span-hide")}});var a=t.find("span:eq("+i+")");a[0]&&a.before(Q('<span style="padding-right: 6px;" fsw="'+v+'"> + '+(t.find("span").length-i)+"</span>"))};o.prototype.retop=function(e){var t=e.find("dl"),n=e.offset().top+e.outerHeight()+5-c.scrollTop(),i=t.outerHeight();var a=e.hasClass("layui-form-selectup")||t.css("top").indexOf("-")!=-1||n+i>c.height()&&n>=i;e=e.find("."+v);var r=q[t.attr("xid")];var l=t.parents(".layui-form-pane")[0]&&t.prev()[0].clientHeight>38?14:10;if(r&&r.config.direction=="up"||a){a=true;if(r&&r.config.direction=="down"){a=false}}var o=e[0].offsetTop+e.height()+l;if(a){t.css({top:"auto",bottom:o+3+"px"})}else{t.css({top:o+"px",bottom:"auto"})}};o.prototype.changeShow=function(e,t){Q(".layui-form-selected").removeClass("layui-form-selected");var n=e.parents("."+P),i=n.hasClass(f),a=n.find("dl").attr("xid");Q("."+m+" ."+P).not(n).removeClass(f);if(t){this.retop(n);n.addClass(f);n.find("."+y).focus();if(!n.find("dl dd[lay-value]:not(."+J+")").length){n.find("dl ."+V).addClass(U)}}else{n.removeClass(f);this.clearInput(a);n.find("dl ."+U).removeClass(U);n.find("dl dd."+h).removeClass(h);n.find("dl dd."+p).remove();if(a&&q[a]&&q[a].config.isEmpty){this.triggerSearch(n)}this.changePlaceHolder(n.find("."+x))}if(t!=i){var r=q[a].config.opened||z.opened[a];t&&r&&r instanceof Function&&r(a);var l=q[a].config.closed||z.closed[a];!t&&l&&l instanceof Function&&l(a)}};o.prototype.changePlaceHolder=function(e){var t=e.parents("."+I);t[0]||(t=e.parents("dl").prev());if(!t[0]){return}var n=e.parents("."+m).find("dl[xid]").attr("xid");if(q[n]&&q[n].config.height){}else{var i=t.find("."+v)[0].clientHeight;t.css("height",(i>36?i+4:i)+"px");var a=t.parents("."+m).parent().prev();if(a.is(".layui-form-label")&&t.parents(".layui-form-pane")[0]){i=i>36?i+4:i;t.css("height",i+"px");a.css({height:i+2+"px",lineHeight:i-18+"px"})}}var r=t.find("."+g+" input"),l=!e.find("span:last")[0]&&!t.find("."+y).val();if(l){var o=r.attr("back");r.removeAttr("back");r.attr("placeholder",o)}else{var s=r.attr("placeholder");r.removeAttr("placeholder");r.attr("back",s)}};o.prototype.indexOf=function(e,t){for(var n=0;n<e.length;n++){if(e[n].value==t||e[n].value==(t?t.value:t)||e[n]==t||JSON.stringify(e[n])==JSON.stringify(t)){return n}}return-1};o.prototype.remove=function(e,t){var n=this.indexOf(e,t?t.value:t);if(n>-1){e.splice(n,1);return true}return false};o.prototype.selectAll=function(i,a,e){var r=this;var l=Q('[xid="'+i+'"]');if(!l[0]){return}if(l.find(".xm-select-linkage")[0]){return}l.find("dd[lay-value]:not(."+J+"):not(."+w+")"+(e?":not(."+E+")":"")).each(function(e,t){t=Q(t);var n=r.getItem(i,t);r.handlerLabel(i,l.find('dd[lay-value="'+n.value+'"]'),true,n,!a)})};o.prototype.removeAll=function(n,i,a){var r=this;var l=Q('[xid="'+n+'"]');if(!l[0]){return}if(l.find(".xm-select-linkage")[0]){q[n].values.concat([]).forEach(function(e,t){var n=e.value.split("/");var i=void 0,a=void 0,r=0;do{i=n[r++];a=l.find(".xm-select-linkage-group"+r+':not(.xm-select-linkage-hide) li[xm-value="'+i+'"]');a.click()}while(a.length&&i!=undefined)});return}q[n].values.concat([]).forEach(function(e,t){if(a&&l.find('dd[lay-value="'+e.value+'"]').hasClass(E)){}else{r.handlerLabel(n,l.find('dd[lay-value="'+e.value+'"]'),false,e,!i)}})};o.prototype.reverse=function(i,a,e){var r=this;var l=Q('[xid="'+i+'"]');if(!l[0]){return}if(l.find(".xm-select-linkage")[0]){return}l.find("dd[lay-value]:not(."+J+")"+(e?":not(."+E+")":"")).each(function(e,t){t=Q(t);var n=r.getItem(i,t);r.handlerLabel(i,l.find('dd[lay-value="'+n.value+'"]'),!t.hasClass(w),n,!a)})};o.prototype.skin=function(e){var t=["default","primary","normal","warm","danger"];var n=t[Math.floor(Math.random()*t.length)];Q('dl[xid="'+e+'"]').parents("."+m).find("."+P).attr("xm-select-skin",n);this.check(e)&&this.commonHandler(e,Q('dl[xid="'+e+'"]').parents("."+m).find("."+x))};o.prototype.getPosition=function(e){var t=0,n=0;while(e!=null){t+=e.offsetLeft;n+=e.offsetTop;e=e.offsetParent}return{x:t,y:n}};o.prototype.onreset=function(){Q(document).on("click","[type=reset]",function(e){Q(e.target).parents("form").find("."+m+" dl[xid]").each(function(e,t){var n=t.getAttribute("xid"),i=Q(t),a=void 0,r={};K.removeAll(n);q[n].config.init.forEach(function(e,t){if(e&&(!r[e]||q[n].config.repeat)&&(a=i.find('dd[lay-value="'+e.value+'"]'))[0]){K.handlerLabel(n,a,true);r[e]=1}})})})};o.prototype.bindEvent=function(n,e,i){if(e&&e instanceof Function){i=e;e=null}if(i&&i instanceof Function){if(!e){Q.each(q,function(e,t){q[e]?q[e].config[n]=i:z[n][e]=i})}else{q[e]?(q[e].config[n]=i,delete z[n][e]):z[n][e]=i}}};o.prototype.check=function(e,t){if(Q('dl[xid="'+e+'"]').length){return true}else if(Q('select[xm-select="'+e+'"]').length){if(!t){this.render(e,Q('select[xm-select="'+e+'"]'));return true}}else{delete q[e];return false}};o.prototype.render=function(e,t){K.init(t);K.one(Q('dl[xid="'+e+'"]').parents("."+m));K.initVal(e)};o.prototype.log=function(e){console.log(e)};var u=function e(){this.v=t;this.render()};var K=new o;u.prototype.value=function(i,e,t){if(typeof i!="string"){return[]}var a=q[i];if(!K.check(i)){return[]}if(typeof e=="string"||e==undefined){var n=a.values.concat([])||[];if(e=="val"){return n.map(function(e){return e.value})}if(e=="valStr"){return n.map(function(e){return e.value}).join(",")}if(e=="name"){return n.map(function(e){return e.name})}if(e=="nameStr"){return n.map(function(e){return e.name}).join(",")}return n}if(K.isArray(e)){var r=Q('[xid="'+i+'"]'),l={},o=void 0,s=true;if(t==false){s=false}else if(t==true){s=true}else{K.removeAll(i)}if(s){a.values.forEach(function(e,t){l[e.value]=1})}e.forEach(function(e,t){if(e&&(!l[e]||a.config.repeat)){if((o=r.find('dd[lay-value="'+e+'"]'))[0]){K.handlerLabel(i,o,s,null,true);l[e]=1}else{var n=K.valToName(i,e);if(n){K.handlerLabel(i,o,s,K.getItem(i,e),true);l[e]=1}}}})}};u.prototype.on=function(e,t,n){K.bindEvent(n?"endOn":"on",e,t);return this};u.prototype.filter=function(e,t){K.bindEvent("filter",e,t);return this};u.prototype.maxTips=function(e,t){K.bindEvent("maxTips",e,t);return this};u.prototype.opened=function(e,t){K.bindEvent("opened",e,t);return this};u.prototype.closed=function(e,t){K.bindEvent("closed",e,t);return this};u.prototype.config=function(e,n,t){if(e&&(typeof e==="undefined"?"undefined":_typeof(e))=="object"){t=n==true;n=e;e=null}if(n&&(typeof n==="undefined"?"undefined":_typeof(n))=="object"){if(t){n.header||(n.header={});n.header["Content-Type"]="application/json; charset=UTF-8";n.dataType="json"}e?(Y[e]=Q.extend(true,{},Y[e]||X,n),!K.check(e)&&this.render(e),q[e]&&n.direction&&(q[e].config.direction=n.direction),q[e]&&n.clearInput&&(q[e].config.clearInput=true),n.searchUrl&&q[e]&&K.triggerSearch(Q("."+m+' dl[xid="'+e+'"]').parents("."+P),true)):(Q.extend(true,X,n),Q.each(Y,function(e,t){Q.extend(true,t,n)}))}return this};u.prototype.render=function(e,t){var n;if(e&&(typeof e==="undefined"?"undefined":_typeof(e))=="object"){t=e;e=null}var i=t?(n={init:t.init,disabled:t.disabled,max:t.max,isSearch:t.isSearch,searchUrl:t.searchUrl,isCreate:t.isCreate,radio:t.radio,skin:t.skin,direction:t.direction,height:t.height,formname:t.formname,layverify:t.layverify,layverType:t.layverType,showCount:t.showCount,placeholder:t.placeholder,create:t.create,filter:t.filter,maxTips:t.maxTips,on:t.on},_defineProperty(n,"on",t.on),_defineProperty(n,"opened",t.opened),_defineProperty(n,"closed",t.closed),_defineProperty(n,"template",t.template),_defineProperty(n,"clearInput",t.clearInput),n):{};t&&t.searchType!=undefined&&(i.searchType=t.searchType=="dl"?1:0);if(e){r[e]={};Q.extend(r[e],q[e]?q[e].config:{},i)}else{Q.extend(a,i)}(Q("select["+v+'="'+e+'"]')[0]?Q("select["+v+'="'+e+'"]'):Q("select["+v+"]")).each(function(e,t){var n=t.getAttribute(v);K.render(n,t);setTimeout(function(){return K.setHidnVal(n,Q('select[xm-select="'+n+'"] + div.'+m+" ."+x))},10)});return this};u.prototype.disabled=function(e){var t={};e?K.check(e)&&(t[e]=q[e]):t=q;Q.each(t,function(e,t){Q('dl[xid="'+e+'"]').prev().addClass(N)});return this};u.prototype.undisabled=function(e){var t={};e?K.check(e)&&(t[e]=q[e]):t=q;Q.each(t,function(e,t){Q('dl[xid="'+e+'"]').prev().removeClass(N)});return this};u.prototype.data=function(e,t,n){if(!e||!t||!n){K.log("id: "+e+" param error !!!");return this}if(!K.check(e)){K.log("id: "+e+" not render !!!");return this}this.value(e,[]);this.config(e,n);if(t=="local"){K.renderData(e,n.arr,n.linkage==true,n.linkageWidth?n.linkageWidth:"100")}else if(t=="server"){K.ajax(e,n.url,n.keyword,n.linkage==true,n.linkageWidth?n.linkageWidth:"100")}return this};u.prototype.btns=function(e,o,s){if(e&&K.isArray(e)){o=e;e=null}if(!o||!K.isArray(o)){return this}var t={};e?K.check(e)&&(t[e]=q[e]):t=q;o=o.map(function(e){if(typeof e=="string"){if(e=="select"){return i[0]}if(e=="remove"){return i[1]}if(e=="reverse"){return i[2]}if(e=="skin"){return i[3]}}return e});Q.each(t,function(e,t){t.config.btns=o;var n=Q('dl[xid="'+e+'"]').find("."+J+":first");if(o.length){var i=s&&s.show&&(s.show=="name"||s.show=="icon")?s.show:"";var a=K.renderBtns(e,i,s&&s.space?s.space:"30px");n.html(a)}else{var r=n.parents("."+P).find("."+g+" input");var l=r.attr("placeholder")||r.attr("back");n.html(l);n.removeAttr("style")}});return this};u.prototype.search=function(e,t){if(e&&K.check(e)){Y[e]=Q.extend(true,{},Y[e]||X,{first:true,searchVal:t});K.triggerSearch(Q('dl[xid="'+e+'"]').parents("."+P),true)}return this};u.prototype.replace=function(e,t,n){var i=this;if(!e||!t||!n){K.log("id: "+e+" param error !!!");return this}if(!K.check(e,true)){K.log("id: "+e+" not render !!!");return this}var a=this.value(e,"val");this.value(e,[]);this.config(e,n);if(t=="local"){K.renderData(e,n.arr,n.linkage==true,n.linkageWidth?n.linkageWidth:"100",false,true);this.value(e,a,true)}else if(t=="server"){K.ajax(e,n.url,n.keyword,n.linkage==true,n.linkageWidth?n.linkageWidth:"100",false,function(e){i.value(e,a,true)},true)}};layui.link(rootPath+'module/formSelects.css');return new u});
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/laydatePlus.js b/public/static/assets/gougu/module/laydatePlus.js
new file mode 100644
index 0000000000000000000000000000000000000000..51ad2ee7e0f92382b819189ab548139540e681a4
--- /dev/null
+++ b/public/static/assets/gougu/module/laydatePlus.js
@@ -0,0 +1,181 @@
+layui.define(['layer'],function(exports){
+	//提示：模块也可以依赖其它模块，如：layui.define('layer', callback);
+	let laydate = layui.laydate;	
+	const opts={
+		"target":'laydateplus',
+		"type":'date',
+		"rangeLinked":false,
+		"callback": null
+	};
+	var laydatePlus = function(options){
+		this.settings = $.extend({}, opts, options);
+		let me = this;
+		$('#'+this.settings.target).click(function(){
+			me.init();
+		});
+	};    
+	laydatePlus.prototype = {		
+		init: function () {
+			var me = this;
+			
+			let shortcuts = [
+				{
+					text: "昨天",
+					value: function(){					  
+						var value = [];
+						var date1 = new Date();
+						date1.setDate(date1.getDate() - 1);
+						date1.setHours(0, 0, 0, 0);
+						value.push(date1);
+						var date2 = new Date();
+						date2.setDate(date2.getDate() - 1);
+						date2.setHours(23, 59, 59, 999);
+						value.push(new Date(date2));
+						return value;
+					}()
+				},
+				{
+					text: "今天",
+					value: function(){					  
+						var value = [];
+						var date1 = new Date();
+						date1.setDate(date1.getDate());
+						date1.setHours(0, 0, 0, 0);
+						value.push(date1);
+						var date2 = new Date();
+						date2.setDate(date2.getDate());
+						date2.setHours(23, 59, 59, 999);
+						value.push(new Date(date2));
+						return value;
+					}()
+				},
+				{
+					text: "最近7天",
+					value: function(){					  
+						var value = [];
+						var date1 = new Date();
+						date1.setDate(date1.getDate() - 7);
+						date1.setHours(0, 0, 0, 0);
+						value.push(date1);
+						var date2 = new Date();
+						date2.setHours(23, 59, 59, 999);
+						value.push(new Date(date2));
+						return value;
+					}()
+				},
+				{
+					text: "最近30天",
+					value: function(){					  
+						var value = [];
+						var date1 = new Date();
+						date1.setDate(date1.getDate() - 30);
+						date1.setHours(0, 0, 0, 0);
+						value.push(date1);
+						var date2 = new Date();
+						date2.setHours(23, 59, 59, 999);
+						value.push(new Date(date2));
+						return value;
+					}()
+				},
+				{
+					text: "本周",
+					value: function(){					  
+						var value = [];
+						var today = new Date();
+						var date1 = new Date(today.setDate(today.getDate() - today.getDay() + (today.getDay() === 0 ? -6 : 1)));
+						date1.setHours(0, 0, 0, 0);						
+						value.push(date1);
+						var date2 = new Date(today.setDate(today.getDate() + 6));
+						date2.setHours(23, 59, 59, 999);
+						value.push(new Date(date2));
+						return value;
+					}()
+				},
+				{
+					text: "上周",
+					value: function(){					  
+						var value = [];
+						var today = new Date();
+						var lastWeek = new Date(today.getFullYear(), today.getMonth(), today.getDate() - 7);
+						var date1 = new Date(lastWeek.getFullYear(), lastWeek.getMonth(), lastWeek.getDate() - lastWeek.getDay() + 1);
+						date1.setHours(0, 0, 0, 0);						
+						value.push(date1);
+						var date2 = new Date(lastWeek.getFullYear(), lastWeek.getMonth(), lastWeek.getDate() - lastWeek.getDay() + 7);
+						date2.setHours(23, 59, 59, 999);
+						value.push(new Date(date2));
+						return value;
+					}()
+				},
+				{
+					text: "上个月",
+					value: function(){
+						var value = [];
+						var date1 = new Date();
+						date1.setMonth(date1.getMonth() - 1);
+						date1.setDate(1);
+						date1.setHours(0, 0, 0, 0);
+						value.push(date1);
+						var date2 = new Date();
+						date2.setDate(1);
+						date2.setHours(0, 0, 0, 0);
+						date2 = date2.getTime() - 1;
+						value.push(new Date(date2));
+						return value;
+					}()
+				  },
+				  {
+					text: "这个月",
+					value: function(){
+						var value = [];
+						var date1 = new Date();
+						date1.setDate(1);
+						date1.setHours(0, 0, 0, 0);
+						value.push(date1);
+						var date2 = new Date();
+						date2.setMonth(date2.getMonth() + 1);
+						date2.setDate(1);
+						date2.setHours(0, 0, 0, 0);
+						date2 = date2.getTime() - 1;
+						value.push(new Date(date2));
+						return value;
+					}()
+				  },
+				  {
+					text: "下个月",
+					value: function(){
+						var value = [];
+						var date1 = new Date();
+						date1.setMonth(date1.getMonth() + 1);
+						date1.setDate(1);
+						date1.setHours(0, 0, 0, 0);
+						value.push(date1);
+						var date2 = new Date();
+						date2.setMonth(date2.getMonth() + 2);
+						date2.setDate(1);
+						date2.setHours(0, 0, 0, 0);
+						date2 = date2.getTime() - 1;
+						value.push(new Date(date2));
+						return value;
+					}()
+				  }
+				];
+			  // 日期时间范围
+			laydate.render({
+				elem: '#'+me.settings.target,
+				type: me.settings.type,
+				range: '~',
+				trigger: 'none',
+				rangeLinked:me.settings.rangeLinked,
+				shortcuts: shortcuts,
+				show:true,
+				done: function(value, date, endDate){
+					if (typeof me.settings.callback === 'function') {
+						me.settings.callback(value, date, endDate);
+					}
+				}
+			});
+		}
+	}
+	//输出接口
+	exports('laydatePlus', laydatePlus);
+});   
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/oaCheck.js b/public/static/assets/gougu/module/oaCheck.js
new file mode 100644
index 0000000000000000000000000000000000000000..f4576dbde60b6a3ea5f458b04d44e867a353c054
--- /dev/null
+++ b/public/static/assets/gougu/module/oaCheck.js
@@ -0,0 +1,578 @@
+layui.define(['tool','oaPicker'], function (exports) {
+	const layer = layui.layer;
+	const form = layui.form;
+	const tool = layui.tool;
+	const opts={
+		"checkBox":"checkBox",//审核容器id
+		"check_copy": 1,//是否需要操送人
+		"check_name": "",//审核类型标识
+		"check_btn":1,//是否显示提交审核按钮
+		"check_back":0,//是否支持反确认审核操作
+		"checking_btn":''//待审核状态下添加的按钮
+	};
+	const obj = {
+		loading:false,
+		checkStatus: function (status) {
+			statusArray = ['待提交审批','审批中','审批通过','审批不通过','已撤回'];
+			return '<span class="check-status-color-'+status+'">'+statusArray[status]+'</span>';
+		},
+		statusTemplate: function (status) {
+			let me = this;
+			let tem =`
+				<tr>
+					<td class="layui-td-gray">审批状态</td>
+					<td>${me.checkStatus(status)}</td>
+				</tr>
+			`;
+			return tem;
+		},
+		uidsTemplate: function () {
+			let tem =`
+				<td class="layui-td-gray">审批人<font>*</font></td>
+				<td>
+					<input type="text" name="check_uames" value="" autocomplete="off" placeholder="请选择审批人" lay-verify="required" lay-reqText="请选择审批人" class="layui-input picker-admin" readonly><input type="text" name="check_uids" value="" readonly style="display:none;">
+				</td>
+			`;
+			return tem;
+		},
+		flowTemplate: function (data) {
+			let flowtype='<option value="" title="">--请选择--</option>';
+			if(data && data.length>0){
+				for(let i=0;i<data.length;i++){
+					flowtype+='<option value="'+data[i].id+'" title="'+data[i].check_type+'">'+data[i].title+'</option>';
+				}				
+			}
+			let tem =`
+				<tr>
+					<td class="layui-td-gray">审批流程<font>*</font></td>
+					<td>
+						<select name="flow_id" lay-verify="required" lay-filter="flowtype" lay-reqText="请选择审批流程">
+						${flowtype}
+						</select>
+					</td>
+				</tr>
+			`;
+			return tem;
+		},
+		copyTemplate: function () {
+			let me = this;
+			let tem =`
+			<tr>
+				<td class="layui-td-gray">抄送人</td>
+				<td>
+					<input type="text" name="check_copy_unames" value="" readonly autocomplete="off" placeholder="请选择审批通过后的抄送人" class="layui-input picker-admin" data-type="2"><input type="text" name="check_copy_uids" value="" readonly style="display:none;">
+				</td>
+			</tr>
+			`;
+			if(me.sets.check_copy == 1){
+				return tem;
+			}else{
+				return '';
+			}			
+		},
+		btnTemplate: function () {
+			let me = this;
+			let tem =`
+			<div class="pt-3">
+				<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="checkform">提交审批</button>
+				<button type="reset" class="layui-btn layui-btn-primary">重置</button>
+				${me.sets.checking_btn}
+			</div>
+			`;			
+			if(me.sets.check_btn == 1){
+				return tem;
+			}else{
+				return '';
+			}			
+		},
+		recordTemplate: function (record) {
+			let me = this;
+			let tem ='';
+			if(record.length>0){
+				tem+='<tr><td class="layui-td-gray">审批记录</td><td colspan="5"><ul class="layui-timeline flow-record pt-2">';
+				for(let l=0;l<record.length;l++){
+					tem+='<li class="layui-timeline-item delete-'+record[l].delete_time+'">\
+								<i class="layui-icon layui-timeline-axis">&#xe63f;</i>\
+								<p style="padding-left:24px">'+record[l].check_time_str+'<span class="black ml-2">'+record[l].name+'</span><span class="check-status-color-'+(record[l].check_status+1)+'">『'+record[l].status_str+'』</span>了此申请。审批意见：<span class="green">'+record[l].content+'。</span></p>\
+							</li>';
+				}		
+				tem+='</ul></td></tr>';	
+			}
+			return tem;		
+		},
+		createTemplate: function (flow) {
+			let me = this;
+			let checkHtml = `
+				<form class="layui-form">
+					<h3 class="pb-2">审批操作</h3>
+					<table class="layui-table layui-table-form">
+						${me.flowTemplate(flow)}
+						<tr id="checkTR">${me.uidsTemplate()}</tr>
+						${me.copyTemplate()}
+					</table>
+				</form>
+			`;
+			return checkHtml;
+		},
+		//审批待提交模版
+		initTemplate: function (detail) {
+			let me = this;
+			let checkHtml = `
+				<form class="layui-form">
+					<h3 class="pb-2">审批操作</h3>
+					<table class="layui-table layui-table-form">
+						${me.statusTemplate(detail.check_status)}
+						${me.recordTemplate(detail.check_record)}
+						${me.flowTemplate(detail.flow)}
+						<tr id="checkTR">${me.uidsTemplate()}</tr>
+						${me.copyTemplate()}
+					</table>
+					${me.btnTemplate()}
+				</form>
+			`;
+			let viewHtml = `
+				<form class="layui-form">
+					<h3 class="pb-2">审批操作</h3>
+					<table class="layui-table layui-table-form">
+						${me.statusTemplate(detail.check_status)}
+						${me.recordTemplate(detail.check_record)}
+					</table>
+				</form>
+			`;
+			if(detail.is_creater==1){
+				return checkHtml;
+			}
+			else{
+				return viewHtml;
+			}
+		},
+		//审批中模版
+		checkTemplate: function (detail) {
+			let me = this,flowHtml='',list = detail.nodes;
+			for(var f=0;f<list.length;f++){
+				//审批流程
+				let checkUser = '',
+				iconRight ='<span class="layui-icon layui-icon-right"></span>',
+				iconStatus ='<i class="layui-icon layui-icon-time"></i>',
+				strStatus ='<div class="check-item-status">待审批</div>',
+				check_types= '',
+				sortClass ='';
+				if(f == list.length-1){
+					iconRight ='';
+				}
+				if(detail.check_step_sort == list[f].sort){
+					sortClass ='flow-this';
+					iconStatus ='<i class="layui-icon layui-icon-time"></i>';
+					strStatus ='<div class="check-item-status">当前审批</div>';
+					if(list[f].check_uids_info.length>1){
+						check_types= ' <span class="layui-badge layui-bg-blue">会签</span>';
+						if(list[f].check_types==2){
+							check_types= ' <span class="layui-badge layui-bg-orange">或签</span>';
+						}
+					}
+				}
+				if(list[f].check_role == 0 || list[f].check_role == 5){
+					checkUser=list[f].check_uids_info[0].name;
+				}
+				if(list[f].check_role == 1 || list[f].check_role == 2 || list[f].check_role == 3  || list[f].check_role == 4){
+					checkUser=list[f].flow_name;
+				}	
+				if(list[f].check_list.length>0){
+					let one=0,two=0,three=0;
+					for(var m=0;m<list[f].check_uids_info.length;m++){
+						if(list[f].check_uids_info[m].check_status == 2){
+							three++
+						}
+						if(list[f].check_uids_info[m].check_status == 1){
+							two++
+						}
+						if(list[f].check_uids_info[m].check_status == 0){
+							one++
+						}
+					}
+					//会签
+					if(list[f].check_types==1){
+						if(three > 0){
+							iconStatus ='<i class="layui-icon layui-icon-close" data-no=""></i>';
+							strStatus ='<div class="check-item-status">拒绝</div>';
+						}
+						else{
+							if(one > 0){
+								iconStatus ='<i class="layui-icon layui-icon-time"></i>';
+								strStatus ='<div class="check-item-status">待审批</div>';
+							}
+							else{
+								iconStatus ='<i class="layui-icon layui-icon-ok-circle" data-ok=""></i>';
+								strStatus ='<div class="check-item-status">通过</div>';	
+							}
+						}
+					}
+					//或签
+					if(list[f].check_types==2){
+						if(two > 0){
+							iconStatus ='<i class="layui-icon layui-icon-ok-circle" data-ok=""></i>';
+							strStatus ='<div class="check-item-status">通过</div>';
+						}
+						else{
+							iconStatus ='<i class="layui-icon layui-icon-close" data-no=""></i>';
+							strStatus ='<div class="check-item-status">拒绝</div>';
+						}
+					}
+				}
+				flowHtml+= '<div class="flow-flexbox check-item flow-flex-row '+sortClass+'" id="flow'+f+'">'+iconStatus+'<div class="check-item-name">'+check_types+checkUser+'</div>'+strStatus+iconRight+'</div>';
+			}			
+			
+			let checkCopy='<tr><td class="layui-td-gray">抄送人</td><td colspan="3">'+detail.copy_unames+'</td></tr>';
+			
+			let checkNode = `<tr>
+					<td class="layui-td-gray">审批节点 <font>*</font></td>
+					<td colspan="3">
+						<input type="radio" name="check_node" lay-filter="check_node" value="1" title="审批结束">
+						<input type="radio" name="check_node" lay-filter="check_node" value="2" title="下一审批人">
+						<div class="layui-inline">
+							<input type="text" name="check_uname" value="" readonly autocomplete="off" placeholder="请选择下一审批人" lay-verify="required" lay-reqText="请选择下一审批人" class="layui-input picker-admin"><input type="hidden" name="check_uids" value="">
+						</div>				
+					</td>
+				</tr>
+				`;
+				
+			let checkContent = `<tr>
+							<td class="layui-td-gray">审批意见 <font>*</font></td>
+							<td colspan="3">
+								<textarea name="content" placeholder="请输入审批意见" class="layui-textarea"></textarea>
+							</td>
+					</tr>`;
+				
+			let btnCheck='<span class="layui-btn layui-btn-normal btn-check" data-status="1"><i class="layui-icon layui-icon-ok"></i> 通过</span><span class="layui-btn layui-btn-danger btn-check" data-status="2"><i class="layui-icon layui-icon-close"></i> 拒绝</span>';
+			
+			if(detail.step.check_role==5){
+				btnCheck='<span class="layui-btn layui-btn-normal btn-check" data-status="1"><i class="layui-icon layui-icon-ok"></i> 通过</span><span class="layui-btn layui-btn-danger btn-check" data-status="2"><i class="layui-icon layui-icon-close"></i> 退回</span>';
+			}
+			
+			let btnBack='<span class="layui-btn layui-btn-primary btn-check" data-status="3"><i class="layui-icon layui-icon-reduce-circle"></i> 撤回</span>';
+			let btnCheckBack='<span class="layui-btn layui-btn-danger btn-check" data-event="check" data-status="4">反确认审核</span>';
+			
+			let checkHtml = `
+				<form class="layui-form">
+				<h3 class="pb-2">审批操作</h3>
+					<table class="layui-table layui-table-form">
+						<tr>
+							<td class="layui-td-gray">审批状态</td>
+							<td>${me.checkStatus(detail.check_status)}</td>
+							<td class="layui-td-gray-2">当前审批人</td>
+							<td>${detail.check_unames}</td>
+						</tr>
+						${me.sets.check_copy == 1 ? checkCopy : ""}
+						<tr>
+							<td class="layui-td-gray">审批流</td>
+							<td colspan="3">
+								<div class="flow-flexbox check-items flow-flex-row" id="flowList">
+									<div class="flow-flexbox check-item flow-flex-row">
+										<i class="layui-icon layui-icon-add-circle" data-ok=""></i>
+										<div class="check-item-name">${detail.admin_name}</div>
+										<div class="check-item-status">创建</div>
+										<span class="layui-icon layui-icon-right"></span>
+									</div>
+									${flowHtml}
+								</div>
+							</td>
+						</tr>
+						${me.recordTemplate(detail.check_record)}
+						${detail.is_checker==1 && detail.step.check_role==0?checkNode:''}
+						${detail.is_checker==1?checkContent:''}
+					</table>
+					<div class="pt-3">
+						<input type="hidden" name="check_role" value="${detail.step.check_role}">
+						${detail.is_checker==1?btnCheck:''}
+						${detail.is_creater==1 && (detail.check_status==1 || detail.check_status==3)?btnBack:''}
+						${me.sets.check_back == 1 && detail.check_status==2?btnCheckBack:''}						
+					</div>
+				</form>
+			`;
+			return checkHtml;
+		},
+		//审批撤回模版
+		backTemplate: function (detail) {
+			let me = this;
+			let btnHtml ='';
+			if(me.sets.check_btn == 1){
+				btnHtml ='<div class="pt-3"><button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="checkform">提交审批</button><button type="reset" class="layui-btn layui-btn-primary">重置</button></div>';
+			}
+			let checkHtml = `
+				<form class="layui-form">
+					<h3 class="pb-2">审批操作</h3>
+					<table class="layui-table layui-table-form">
+						${me.statusTemplate(detail.check_status)}
+						${me.recordTemplate(detail.check_record)}
+						${me.flowTemplate(detail.flow)}
+						<tr id="checkTR">${me.uidsTemplate()}</tr>
+						${me.copyTemplate()}
+					</table>
+					${me.btnTemplate()}
+				</form>
+			`;
+			let viewHtml = `
+				<form class="layui-form">
+					<h3 class="pb-2">审批操作</h3>
+					<table class="layui-table layui-table-form">
+						${me.statusTemplate(detail.check_status)}
+						${me.recordTemplate(detail.check_record)}
+					</table>
+				</form>
+			`;
+			if(detail.is_creater==1){
+				return checkHtml;
+			}
+			else{
+				return viewHtml;
+			}
+		},
+		submit:function(data,callback){
+			tool.post("/api/check/submit_check", data, callback);
+		},
+		init: function (options) {
+			this.sets = $.extend({}, opts, options);
+			let me = this;
+			let checkBox = $('#'+me.sets.checkBox);
+			let action_id = checkBox.data('id');
+			let check_status = checkBox.data('status');
+			let check_flow_id = checkBox.data('checkflowid');
+			if(action_id === undefined || check_status === undefined || check_flow_id === undefined){
+				return false;
+			}
+			//获取审批信息
+			$.ajax({
+				url: "/api/check/get_flow_nodes",
+				type:'get',
+				data:{check_name:me.sets.check_name,action_id:action_id,flow_id:check_flow_id},
+				success: function (e) {
+					if (e.code == 0) {
+						if(check_status==0){
+							if(action_id==0){
+								checkBox.append(me.createTemplate(e.data));
+							}
+							else{
+								checkBox.append(me.initTemplate(e.data));
+							}
+						}
+						else if(check_status==4){
+							checkBox.append(me.backTemplate(e.data));
+						}
+						else{
+							checkBox.append(me.checkTemplate(e.data));
+						}
+						form.render();
+					}
+				}
+			})
+			
+			//选择审批流
+			form.on('select(flowtype)', function(data){
+				var check_type = data.elem[data.elem.selectedIndex].title;
+				if(data.value==''){
+					$('#checkTR').html(me.uidsTemplate());
+					checkBox.find('[name="check_copy_unames"]').val('');
+					checkBox.find('[name="check_copy_uids"]').val('');
+					form.render();
+					return false;
+				}
+				if(check_type == 1){
+					$('#checkTR').html(me.uidsTemplate());
+					form.render();
+				}
+				$.ajax({
+					url: "/api/check/get_flow_users",
+					type:'get',
+					data:{id:data.value},
+					success: function (e) {
+						if (e.code == 0) {
+							var flow_li='',flow_idx=0;
+							var flow_data = e.data.flow_data;
+							if(e.data.copy_uids && e.data.copy_uids !='' && me.sets.check_copy==1){
+								checkBox.find('[name="check_copy_unames"]').val(e.data.copy_unames);
+								checkBox.find('[name="check_copy_uids"]').val(e.data.copy_uids.split(','));
+							}
+							if(check_type == 2 || check_type == 3){
+								for(var a=0;a<flow_data.length;a++){
+									var check_types = '',check_role = '',user_li='';
+									if(flow_data[a].check_types==1){
+										check_types= ' <span class="layui-badge layui-bg-blue">会签</span>';
+									}
+									if(flow_data[a].check_types==2){
+										check_types= ' <span class="layui-badge layui-bg-orange">或签</span>';
+									}
+									
+									if(flow_data[a].check_role==1){
+										check_role = '当前部门负责人';
+									}
+									if(flow_data[a].check_role==2){
+										check_role = '上级部门负责人';
+									}
+									if(flow_data[a].check_role==3){
+										check_role = '岗位职称:'+flow_data[a].check_position;
+									}
+									if(flow_data[a].check_role==4){
+										check_role = '指定人员';
+									}
+									if(flow_data[a].check_role==5){
+										check_role = flow_data[a].flow_name;
+										check_types= ' <span class="layui-badge layui-bg-green">可回退</span>';
+									}
+									let check_uids_info=flow_data[a].check_uids_info;
+									if(check_uids_info.length>0){
+										flow_idx++;
+										for(var b=0;b<check_uids_info.length;b++){
+											user_li+= '<li style="padding:3px 0;line-height:22px"><img src="'+check_uids_info[b].thumb+'" style="width:22px; height:22px; border-radius:50%; vertical-align: bottom; margin-right:8px;" />'+check_uids_info[b].name+'</li>';
+										}
+										flow_li+='<li class="layui-timeline-item" style="padding-bottom:5px;">\
+											<i class="layui-icon layui-timeline-axis">&#xe63f;</i>\
+											<div class="layui-timeline-content">\
+											  <p class="layui-timeline-title" style="margin-bottom:3px">第'+flow_idx+'级审批『'+check_role+'』'+check_types+'</p>\
+											  <ul>'+user_li+'</ul>\
+											</div>\
+										</li>';
+									}
+								}							
+								formHtml = '<td class="layui-td-gray">审批流</td>\
+											<td>\
+												<ul id="flowList" class="layui-timeline">'+flow_li+'</ul>\
+											</td>';
+								$('#checkTR').html(formHtml);
+							}
+						}
+					}
+				})
+			});
+			
+			//提交审批
+			form.on('submit(checkform)', function(data){
+				data.field.action_id = action_id;
+				data.field.check_name = me.sets.check_name;
+				let callback = function (e) {
+					layer.msg(e.msg);
+					if (e.code == 0) {
+						tool.sideClose(1000);				
+					}
+				}
+				tool.post("/api/check/submit_check", data.field, callback);
+				return false;
+			});
+			
+			//审批操作按钮
+			checkBox.on('click','.btn-check', function(data){
+				let content=checkBox.find('[name="content"]').val();
+				let check_status=$(this).data('status');
+				let check_role = checkBox.find('input[name="check_role"]').val();
+				
+				let check_node=0,check_uids='';
+				if(check_role == 0 && check_status==1){
+					check_node = checkBox.find('input[name="check_node"]:checked').val();
+					check_uids = checkBox.find('input[name="check_uids"]').val();
+					if(!check_node){
+						layer.msg('请选择下一审批节点');
+						return false;
+					}
+					if(check_node == 2 && check_uids==''){
+						layer.msg('请选择下一审批人');
+						return false;
+					}
+				}
+				if(check_status ==1 || check_status==2){
+					if(content==''){
+						layer.msg('请输入审批意见');
+						return false;
+					}
+					let confirmTips='确定通过该审批？';
+					if(check_status==2){
+						confirmTips='确定拒绝该审批？';
+					}				
+					tool.ask(confirmTips, function(index){
+						$.ajax({
+							url: "/api/check/flow_check",
+							type:'post',
+							data:{
+								action_id:action_id,
+								check_name:me.sets.check_name,
+								check_flow_id:check_flow_id,
+								check_node:check_node,
+								check_uids:check_uids,
+								check:check_status,
+								content:content
+							},
+							success: function (e) {
+								layer.msg(e.msg);
+								if (e.code == 0) {	
+									tool.sideClose(1000);
+								}
+							}
+						})
+						layer.close(index);
+					});   
+				}
+				else if(check_status ==3){			
+					layer.prompt({
+						formType: 2,
+						title: '请输入撤回理由',
+						area: ['480px', '120px'] //自定义文本域宽高
+					}, function(value, index, elem){
+						if(value==''){
+							layer.msg('请输入撤回理由');
+							return false;
+						}
+						$.ajax({
+							url: "/api/check/flow_check",
+							type:'post',
+							data:{
+								action_id:action_id,
+								check_name:me.sets.check_name,
+								check_flow_id:check_flow_id,
+								check:check_status,
+								content:value
+							},
+							success: function (e) {
+								layer.msg(e.msg);
+								if (e.code == 0) {	
+									tool.sideClose(1000);
+								}
+							}
+						})
+						layer.close(index);
+					});
+				}
+				else if(check_status ==4){			
+					layer.prompt({
+						formType: 2,
+						title: '请输入反确认理由',
+						area: ['480px', '120px'] //自定义文本域宽高
+					}, function(value, index, elem){
+						if(value==''){
+							layer.msg('请输入反确认理由');
+							return false;
+						}
+						$.ajax({
+							url: "/api/check/flow_check",
+							type:'post',
+							data:{
+								action_id:action_id,
+								check_name:me.sets.check_name,
+								check_flow_id:check_flow_id,
+								check:check_status,
+								content:value
+							},
+							success: function (e) {
+								layer.msg(e.msg);
+								if (e.code == 0) {	
+									tool.sideClose(1000);
+								}
+							}
+						})
+						layer.close(index);
+					});
+				}
+				return false;
+			});
+			
+		}
+	};
+	exports('oaCheck', obj);
+});
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/oaComment.js b/public/static/assets/gougu/module/oaComment.js
new file mode 100644
index 0000000000000000000000000000000000000000..bee7bba6c85a01c18f9ab34c2e6f39bb5ee633b6
--- /dev/null
+++ b/public/static/assets/gougu/module/oaComment.js
@@ -0,0 +1,160 @@
+layui.define(['tool','oaPicker'], function (exports) {
+	const layer = layui.layer, tool = layui.tool;
+	const opts={
+		"box":'commentBox',//容器id
+		"input": 'commentInput',
+		"topic_id":0,
+		"module": '',
+		"callback":function(e){
+			layer.msg(e.msg);
+			if(e.code==0){
+				setTimeout(function(){
+					obj.load();
+				},1000)
+			}			
+		}
+	};
+	const obj = {
+		load: function () {
+			let me = this;
+			let topic_id = me.sets.topic_id, module = me.sets.module;
+			let page=1;
+			let callback = function (res) {
+				layer.closeAll();
+				me.template(res,page);
+			}
+			tool.get("/api/comment/datalist", {topic_id: topic_id,module: module,page:page}, callback);
+		},
+		template:function(res,page){
+			let me = this;
+			if (res.code == 0 && res.data.length > 0) {
+				let itemComment = '';
+				$.each(res.data, function (index, item) {
+					let to_names = '', ops = '' ,ptext='';
+					if (item.to_names !='' && item.to_names !='-') {
+						to_names = '<span class="blue">@' + item.to_names + '</span>';
+					}
+					if (item.admin_id == login_admin) {
+						ops = `<a class="mr-4" data-event="edit" data-id="${item.id}">编辑</a><a class="mr-4" data-event="del" data-id="${item.id}">删除</a>`;
+					}
+					else{
+						ops = `<a class="mr-4" data-event="replay" data-id="${item.id}" data-uid="${item.admin_id}" data-unames="${item.name}">回复</a>`;
+					}
+					if(item.pid>0){
+						ptext=`<div style="padding-bottom:8px;"><fieldset style="border:1px solid #eeeeee; background-color:#f9f9f9;"><legend>回复『${item.padmin}』${item.ptimes}的评论</legend>${item.pcontent}</fieldset></div>`;
+					}
+					itemComment += `
+						<div id="comment_${item.id}" class="comment-item py-3 border-t" data-content="${item.content}">
+						<div class="comment-avatar" title="${item.name}">
+							<img class="comment-image" src="${item.thumb}">
+						</div>
+						<div class="comment-body">
+							<div class="comment-meta">
+								<strong class="comment-name">${item.name}</strong><span class="ml-2 gray" title="${item.create_time}">${item.create_times}${item.update_times}</span>
+							</div>
+							<div class="comment-content py-2">${to_names} ${item.content}</div>
+							${ptext}
+							<div class="comment-actions">${ops}</div>
+						</div>
+					</div>
+					`;
+				});
+				if(res.data.length>19){
+					page++;
+					itemComment+='<div class="py-3 log-more"><button class="layui-btn layui-btn-normal layui-btn-sm" type="button">查看更多</button></div>';
+				}
+				$('#'+me.sets.box).html(itemComment).data('page',page);
+			}
+			else{
+				if(page ==1){
+					$('#'+me.sets.box).html('<div class="layui-data-none">暂无记录</div>');
+				}
+			}
+		},
+		add: function (id,content,pid,to_uids) {
+			let me = this;
+			if (content == '') {
+				layer.msg('请完善评论内容');
+				return false;
+			}
+			let postData = { id: id, topic_id: me.sets.topic_id, pid: pid, to_uids: to_uids, module: me.sets.module, content: content};
+			tool.post("/api/comment/add", postData, me.sets.callback);
+		},
+		del: function (id) {
+			let me = this;
+			layer.confirm('确定删除该评论吗？', {
+				icon: 3,
+				title: '提示'
+			}, function (index) {
+				tool.delete("/api/comment/del", { id: id }, me.sets.callback);
+				layer.close(index);
+			});
+		},
+		//文本
+		textarea: function (id,txt, pid, to_uid, to_uname) {
+			let that = this;
+			let display='',usersInput='',height='286px';
+			if(id==0){
+				usersInput='<div class="layui-input-wrap" style="margin-bottom:5px;"><div class="layui-input-prefix"><i class="layui-icon layui-icon-at"></i></div><input type="text" placeholder="要提醒的员工" value="'+to_uname+'" readonly class="layui-input picker-admin" data-type="2" /><input type="hidden" id="to_uids" value="'+to_uid+'" /></div>';
+				height='320px';
+			}
+			$(parent.$('.express-close')).addClass('parent-colse');
+			layer.open({
+				type: 1,
+				title: '请输入评论内容',
+				area: ['600px', height],
+				content: '<div style="padding:5px;">'+usersInput+'<textarea class="layui-textarea" id="editTextarea" style="width: 100%; height: 160px;">'+txt+'</textarea></div>',
+				end: function(){
+					$(parent.$('.express-close')).removeClass('parent-colse');
+				},
+				btnAlign: 'c',
+				btn: ['提交保存'],
+				yes: function () {
+					let to_uids = $("#to_uids").val();
+					let newval = $("#editTextarea").val();
+					if (newval != '') {
+						that.add(id,newval,pid,to_uids);
+					} else {
+						layer.msg('请输入评论内容');
+					}
+				}
+			})
+		},
+		init: function (options) {
+			this.sets = $.extend({}, opts, options);
+			let me = this;
+			let commentBox = $('#'+me.sets.box);
+			me.load();
+			$('#'+me.sets.input).on('click', function () {
+				me.textarea(0,'',0,0,'');
+			})
+			//回复
+			commentBox.on('click', '[data-event="replay"]', function () {
+				let pid = $(this).data('id');
+				let to_uid = $(this).data('uid');
+				let to_unames = $(this).data('unames');
+				me.textarea(0,'',pid,to_uid,to_unames);
+			})
+			//编辑
+			commentBox.on('click', '[data-event="edit"]', function () {
+				let id = $(this).data('id');
+				let content = commentBox.find('#comment_' + id).data('content');
+				me.textarea(id,content,0,0,'');
+			})
+			//删除
+			commentBox.on('click', '[data-event="del"]', function () {
+				let id = $(this).data('id');
+				me.del(id);
+			})
+			//加载更多
+			commentBox.on('click','.log-more',function(){
+				let page = commentBox.data(page);
+				let callback = function (res) {
+					me.template(res,page);
+				}
+				tool.get("/api/comment/datalist", {topic_id: me.sets.topic_id,module: me.sets.module,page:page}, callback);
+			});
+		}
+	};
+	exports('oaComment', obj);
+});  
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/oaEdit.js b/public/static/assets/gougu/module/oaEdit.js
new file mode 100644
index 0000000000000000000000000000000000000000..755ecae29a6839545610895d095f2c6e42ff0476
--- /dev/null
+++ b/public/static/assets/gougu/module/oaEdit.js
@@ -0,0 +1,380 @@
+layui.define(['tool','oaPicker','tinymce'],function(exports){
+	let layer = layui.layer,tool=layui.tool,laydate = layui.laydate,dropdown = layui.dropdown,oaPicker = layui.oaPicker,tinymce = layui.tinymce;
+	const opts={
+		"box":'editBox',//编辑容器id
+		"id":0,//编辑容器id
+		"url": '',
+		"dropdown":{},
+		"callback":function(e){
+			layer.msg(e.msg);
+			if(e.code==0){
+				setTimeout(function(){
+					location.reload();
+				},1000)
+			}			
+		}
+	};
+	
+	const obj = {
+		log: function (box,name,action_id) {
+			let page=1;
+			let callback = function (res) {
+				if (res.code == 0 && res.data.length > 0) {
+					let itemLog = '',logTime='';
+					$.each(res.data, function (index, item) {
+						let detail = "";
+						if(logTime != item.create_time){
+							if(logTime==''){
+								itemLog+='<dl><dt><span class="date-second-point"></span>'+item.create_time+'</dt>'
+							}
+							else{
+								itemLog+='</dl><dl><dt><span class="date-second-point"></span>'+item.create_time+'</dt>'
+							}
+							logTime = 	item.create_time;			
+						}
+						detail= `
+							<span class="log-content gray">将<strong>${item.field_name}</strong>从 <span class="green">${item.old_content}</span> ${item.action}为 <span class="blue">${item.new_content}</span><span class="ml-4 gray" title="${item.create_time}">${item.times}</span></span>
+						`;
+						
+						if(item.field=='new'){
+							detail= `
+								<span class="log-content gray">创建了该数据记录<span class="ml-4 gray" title="${item.create_time}">${item.times}</span></span>
+							`;
+						}
+						
+						itemLog+= `
+							<dd><img src="${item.thumb}" class="log-thumb" /><span class="log-name">${item.admin_name}</span>${detail}</dd>
+						`;
+					});
+					itemLog+='</dl>';
+					if(res.data.length>19){
+						itemLog+='<div class="py-3 log-more"><button class="layui-btn layui-btn-normal layui-btn-sm" type="button">查看更多</button></div>';
+					}
+					$("#"+box).html(itemLog);
+				}
+				else{
+					if(page ==1){
+						$("#"+box).html('<div class="layui-data-none">暂无记录</div>');
+					}
+				}
+			}
+			tool.get("/api/index/load_log", {name:name,action_id:action_id,page:page}, callback);
+			$("#"+box).on('click','.log-more',function(){
+				page++;
+				tool.get("/api/index/load_log", {name:name,action_id:action_id,page:page}, callback);
+			});
+		},
+		//短文本
+		text: function (that) {
+			let me = this;
+			let field = that.data('field');
+			let text = that.data('text');
+			if (typeof(text) == "undefined") {
+				text = that.text();
+			}
+			$(parent.$('.express-close')).addClass('parent-colse');
+			layer.open({
+				type: 1,
+				title: '请输入内容',
+				area: ['360px', '158px'],
+				content: '<div style="padding:5px;"><input class="layui-input" id="oaEditText" value="' + text + '"/></div>',
+				end: function(){
+					$(parent.$('.express-close')).removeClass('parent-colse');
+				},
+				btnAlign: 'c',
+				btn: ['提交保存'],
+				yes: function () {
+					let val = $("#oaEditText").val();
+					if (val != '') {
+						let postData = {'id':me.sets.id,'scene':'oaedit'};
+						postData[field] = val;
+						tool.post(me.sets.url,postData,me.sets.callback);
+					} else {
+						layer.msg('请输入内容');
+					}
+				}
+			})			
+		},
+		//长文本
+		textarea: function (that) {
+			let me = this;
+			let field = that.data('field');
+			let target = that.data('target');
+			let textarea='';
+			if (typeof(target) == "undefined") {
+				textarea = that.text();
+			}
+			else{
+				textarea = $('#'+target).text();
+			}
+			$(parent.$('.express-close')).addClass('parent-colse');
+			layer.open({
+				type: 1,
+				title: '请输入内容',
+				area: ['600px', '320px'],
+				content: '<div style="padding:5px;"><textarea class="layui-textarea" id="oaEditTextarea" style="width: 100%; height: 200px;">' + textarea + '</textarea></div>',
+				btnAlign: 'c',
+				end: function(){
+					$(parent.$('.express-close')).removeClass('parent-colse');
+				},
+				btn: ['提交保存'],
+				yes: function () {
+					let val = $("#oaEditTextarea").val();
+					if (val != '') {
+						let postData = {'id':me.sets.id,'scene':'oaedit'};
+						postData[field] = val;
+						tool.post(me.sets.url,postData,me.sets.callback);
+					} else {
+						layer.msg('请输入内容');
+					}
+				}
+			})			
+		},
+		//数字
+		num: function (that) {
+			let me = this;
+			let field = that.data('field');
+			let text = that.data('text');
+			let min = that.data('min');
+			let max = that.data('max');
+			if (typeof(min) == "undefined") {
+				min = '';
+			}
+			if (typeof(max) == "undefined") {
+				max = '';
+			}
+			if (typeof(text) == "undefined") {
+				text = that.text();
+			}
+			$(parent.$('.express-close')).addClass('parent-colse');
+			layer.open({
+				type: 1,
+				title: '请输入数字',
+				area: ['200px', '158px'],
+				content: '<div style="padding:5px;"><input class="layui-input" oninput="this.value = this.value.replace(/[^0-9]/g,\'\')" id="oaEditNum" value="' + text + '"/></div>',
+				end: function(){
+					$(parent.$('.express-close')).removeClass('parent-colse');
+				},
+				btnAlign: 'c',
+				btn: ['提交保存'],
+				yes: function () {
+					let val = $("#oaEditNum").val();
+					if (val != '') {
+						if(min !='' && val<min){
+							layer.msg('输入数字不能小于'+min);
+							return false;
+						}
+						if(max !='' && val>max){
+							layer.msg('输入数字不能大于'+max);
+							return false;
+						}
+						let postData = {'id':me.sets.id,'scene':'oaedit'};
+						postData[field] = val;
+						tool.post(me.sets.url,postData,me.sets.callback);
+					} else {
+						layer.msg('请输入内容');
+					}
+				}
+			})			
+		},
+		dropdown: function (that) {
+			let me = this;
+			let field = that.data('field');
+			let text = that.data('text');
+			let cancel = that.data('cancel');
+			let arrayidx = that.data('array');
+			if (typeof(text) == "undefined") {
+				text = that.text();
+			}
+			if (typeof(cancel) == "undefined") {
+				cancel = 0;
+			}
+			let data = me.sets.dropdown[arrayidx];
+			let len = data.length;
+			while (len--) {
+				if (data[len].id == text) {
+					data.splice(len, 1);
+				}
+			}
+			if (data.length == 0) {
+				layer.msg('无可关联的内容');
+				return false;
+			}
+			if (cancel==1) {
+				data.push({ id: 0, title: '<span style="color:#FF5722">取消关联</span>' });
+			}
+			dropdown.render({
+				elem: that,
+				show: true,
+				data: data,
+				click: function (data, othis) {
+					let postData = {'id':me.sets.id,'scene':'oaedit'};
+					postData[field] = data.id;
+					tool.post(me.sets.url,postData,me.sets.callback);
+				}
+			});
+		},
+		oadate: function (that) {
+			let me = this;
+			let type = that.data('type');
+			let range = that.data('range');
+			let min = that.data('min');
+			let max = that.data('max');
+			if (typeof(type) == "undefined" || type === '') {
+				type = 'date';
+			}
+			if (typeof(range) == "undefined" || type === '') {
+				range = false;
+			}
+			if (typeof(min) == "undefined" || min === '') {
+				min = '1900-1-1';
+			}
+			if (typeof(max) == "undefined" || max === '') {
+				max = '2099-1-1';
+			}
+			let field = that.data('field');
+			let text = that.data('text');
+			if (typeof(text) == "undefined") {
+				text = that.text();
+			}
+			layui.laydate.render({ 
+				elem: that,
+				show: true,
+				type: type,
+				range: range,
+				min: min,
+				max: max,
+				fullPanel: true,
+				done: function (val, date) {
+					let postData = {'id':me.sets.id,'scene':'oaedit'};
+					postData[field] = val;
+					tool.post(me.sets.url,postData,me.sets.callback);
+				}
+			});
+		},
+		adminpicker: function (that){
+			let me = this;
+			let field = that.data('field');
+			let ids = that.data('ids');
+			let names = that.data('names');
+			let type = that.data('type');
+			if (typeof(type) == "undefined") {
+				type = 1;
+			}
+			oaPicker.employeeInit({
+				ids:ids.toString(),
+				names:names.toString(),
+				type:type,
+				callback:function(seleted){
+					let select_id=[],select_name=[];
+					for(var a=0; a<seleted.length;a++){
+						select_id.push(seleted[a].id);
+						select_name.push(seleted[a].name);
+					}
+					let postData = {'id':me.sets.id,'scene':'oaedit'};
+					postData[field] = select_id.join(',');
+					tool.post(me.sets.url,postData,me.sets.callback);
+				}
+			});
+		},
+		picker:function(that){
+			let me = this;
+			let field = that.data('field');
+			let types = that.data('picker');
+			let type = that.data('type');
+			if (typeof(type) == "undefined") {
+				type = 1;
+			}
+			let map = {};
+			let callback = function(data){
+				let ids = [],titles=[];
+                for ( var i = 0; i <data.length; i++){
+                    ids.push(data[i].id);
+                    titles.push(data[i].title);
+                }
+                let postData = {'id':me.sets.id,'scene':'oaedit'};
+				postData[field] = ids.join(',');
+				tool.post(me.sets.url,postData,me.sets.callback);
+            }
+            oaPicker.picker(types,type,callback,map);
+		},
+		editor:function(that){
+			let me = this,index = Date.now();
+			let field = that.data('field');
+			let target = that.data('target');
+			let content='';
+			if (typeof(target) == "undefined") {
+				content = that.html();
+			}
+			else{
+				content = $('#'+target).html();
+			}
+			$(parent.$('.express-close')).addClass('parent-colse');
+			layer.open({
+				type: 1,
+				title: '请输入内容',
+				zIndex:20,
+				area: ['900px', '600px'],
+				content: '<div style="padding:5px;"><textarea class="layui-textarea" id="oaEditEditor'+index+'" style="width: 100%;">' + content + '</textarea></div>',
+				btnAlign: 'c',
+				btn: ['提交保存'],
+				end: function(){
+					$(parent.$('.express-close')).removeClass('parent-colse');
+				},
+				success:function(){					
+					var edit = tinymce.render({
+						selector: "#oaEditEditor"+index,
+						images_upload_url: '/api/index/upload/sourse/tinymce',//图片上传接口
+						height: 480
+					});
+				},
+				yes: function () {
+					let val = tinyMCE.editors['oaEditEditor'+index].getContent();
+					if (val != '') {
+						let postData = {'id':me.sets.id,'scene':'oaedit'};
+						postData[field] = val;
+						tool.post(me.sets.url,postData,me.sets.callback);
+					} else {
+						layer.msg('请输入内容');
+					}
+				}
+			})
+		},
+		init: function (options) {
+			this.sets = $.extend({}, opts, options);
+			let me = this;
+			let editBox = $('#'+me.sets.box);
+			editBox.on('click','.click-edit',function(){
+				let that = $(this);
+				let types = that.data('types');
+				switch (types) {
+					case "num":
+						me.num(that);
+						break;
+					case "oadate":
+						me.oadate(that);
+						break;
+					case "textarea":
+						me.textarea(that);
+						break;
+					case "dropdown":
+						me.dropdown(that);
+						break;
+					case "adminpicker":
+						me.adminpicker(that);
+						break;
+					case "picker":
+						me.picker(that);
+						break;
+					case "editor":
+						me.editor(that);
+						break;
+					default:
+						me.text(that);
+				}
+			})
+		}
+	}
+	//输出接口
+	exports('oaEdit', obj);
+});   
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/oaFlow.js b/public/static/assets/gougu/module/oaFlow.js
new file mode 100644
index 0000000000000000000000000000000000000000..7a5a9f88a74ae8929d94866955399f532ba392f0
--- /dev/null
+++ b/public/static/assets/gougu/module/oaFlow.js
@@ -0,0 +1,247 @@
+layui.define(['tool'], function (exports) {
+	const layer = layui.layer;
+	const form = layui.form;
+	const tool = layui.tool;
+	const dropdown = layui.dropdown;
+	const opts={
+		"flowBox":'flowBox',
+		"flowBar":'flowBar',
+		"callback": null
+	};
+	const obj = {
+		loading:false,
+		size:1.0,
+		//节点模版
+		nodeApend: function (types,nodeId) {
+			let nodeHtml = '';
+			if(types == 1){
+				//审核人
+				nodeHtml = `<div><div class="node-wrap">
+								<div class="node-wrap-box">
+									<div class="node-title" style="background:#ffb800;">
+										<span class="user-edit">审核人</span>
+										<i class="remove-node" data-id="${nodeId}">✖</i>
+									</div>
+									<div>
+										<span>请设置审核人</span>
+										<i class="select-icon"><?xml version="1.0" encoding="UTF-8"?><svg width="24" height="24" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M19 12L31 24L19 36" stroke="#333" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></i>
+									</div>
+								</div>
+								<div class="node-add-btn-box">
+									<div class="add-node-btn">
+										<button class="add-node">+</button>
+									</div>
+								</div>
+							</div><div>`;
+			}
+			else if(types == 2){
+				//抄送人
+				nodeHtml = `<div><div class="node-wrap">
+								<div class="node-wrap-box">
+									<div class="node-title" style="background:#1e9fff;">
+										<span class="user-edit">抄送人</span>
+										<i class="remove-node" data-id="${nodeId}">✖</i>
+									</div>
+									<div>
+										<span>请设置抄送人</span>
+										<i class="select-icon"><?xml version="1.0" encoding="UTF-8"?><svg width="24" height="24" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M19 12L31 24L19 36" stroke="#333" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></i>
+									</div>
+								</div>
+								<div class="node-add-btn-box">
+									<div class="add-node-btn">
+										<button class="add-node">+</button>
+									</div>
+								</div>
+							</div><div>`;
+			}
+			else if(types==3){
+				//条件分支
+				nodeHtml = `<div class="branch-wrap">
+								<div class="branch-box-wrap">
+									<div class="branch-box">
+										<span class="add-branch" title="添加条件">添加条件分支</span>
+										<div class="col-box">
+											<div class="condition-node">
+												<div class="condition-node-box">
+													<div class="condition-judge">
+														<div class="condition-title">   
+															<input type="text" class="condition-input" placeholder="条件1">
+															<span class="condition-priority">优先级1</span>
+															<i class="remove-node" data-id="${nodeId}">✖</i>
+														</div>
+														<div>
+															请设置条件
+														</div>
+													</div>
+													<div class="node-add-btn-box">
+														<div class="add-node-btn">
+															<button class="add-node">+</button>
+														</div>
+													</div>
+												</div>
+											</div>                                           
+											<div class="top-left-cover-line"></div>
+											<div class="bottom-left-cover-line"></div>
+										</div>
+										<div class="col-box">
+											<div class="condition-node">
+												<div class="condition-node-box">
+													<div class="condition-judge">
+														<div class="condition-title">   
+															<input type="text" class="condition-input" placeholder="其他情况">
+															<span class="condition-priority">优先级2</span>
+														</div>
+														<div>
+															如存在未满足其他分支条件的情况，则进入此分支
+														</div>
+													</div>
+													<div class="node-add-btn-box">
+														<div class="add-node-btn">
+															<button class="add-node">+</button>
+														</div>
+													</div>                                                   
+												</div>
+											</div>
+											<div class="top-right-cover-line"></div>
+											<div class="bottom-right-cover-line"></div>
+										</div>
+									</div>
+									<div class="node-add-btn-box">
+										<div class="add-node-btn">
+											<button class="add-node">+</button>
+										</div>
+									</div>    
+								</div>
+							</div>
+						</div>`;
+			}
+			else{
+				//条件内容
+				nodeHtml = `<div class="col-box">
+                    <div class="condition-node">
+                        <div class="condition-node-box">
+                            <div class="condition-judge">
+                                <div class="condition-title">   
+                                    <input type="text" class="condition-input" placeholder="条件1">
+                                    <span class="condition-priority">优先级1</span>
+                                    <i class="remove-node" data-id="${nodeId}">✖</i>
+                                </div>
+                                <div>
+                                    请设置条件
+                                </div>
+                            </div>
+                            <div class="node-add-btn-box">
+                                <div class="add-node-btn">
+                                    <button class="add-node">+</button>
+                                </div>
+                            </div>
+                        </div>
+                    </div>                                           
+                </div>`;
+			}
+			return nodeHtml;
+		},
+		init: function (options) {
+			this.settings = $.extend({}, opts, options);
+			let me = this;
+			let flowBox = $('#'+me.settings.flowBox);
+			let flowBar = $('#'+me.settings.flowBar);
+			//添加节点
+			flowBox.on("click",".add-node",function(e){
+				let that = $(this);
+				dropdown.render({
+					elem: that,
+					show: true, // 外部事件触发即显示
+					data: [{
+					  title: '审 核 人',
+					  id: '1',
+					  templet: function(d){
+						  return '<i style="vertical-align: sub; color:red"><?xml version="1.0" encoding="UTF-8"?><svg width="20" height="20" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8 36L8.00461 28.0426C8.00551 27.4906 8.45313 27.0432 9.00519 27.0426C12.3391 27.0426 15.6731 27.0426 19.0071 27.0426C19.9286 27.0426 19.9237 26.2252 19.9237 24.2792C19.9237 22.3332 15.0221 20.6941 15.0221 13.8528C15.0221 7.01151 20.0999 5 24.32 5C28.5401 5 33.1366 7.01151 33.1366 13.8528C33.1366 20.6941 28.2607 21.7818 28.2607 24.2792C28.2607 26.7765 28.2607 27.0426 29.0413 27.0426C32.3609 27.0426 35.6806 27.0426 39.0003 27.0426C39.5525 27.0426 40.0003 27.4904 40.0003 28.0426V36H8Z" fill="none" stroke="#ffb800" stroke-width="4" stroke-linejoin="round"/><path d="M8 42H40" stroke="#ffb800" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/></svg></i> ' + d.title;
+					  }
+					}, {
+					  title: '抄 送 人',
+					  id: '2',
+					  templet: function(d){
+						  return '<i style="vertical-align: sub; color:red"><?xml version="1.0" encoding="UTF-8"?><svg width="20" height="20" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M43 5L29.7 43L22.1 25.9L5 18.3L43 5Z" stroke="#1e9fff" stroke-width="4" stroke-linejoin="round"/><path d="M43.0001 5L22.1001 25.9" stroke="#1e9fff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/></svg></i> ' + d.title;
+					  }
+					}, {
+					  title: '条件分支',
+					  id: '3',
+					  templet: function(d){
+						  return '<i style="vertical-align: sub; color:red"><?xml version="1.0" encoding="UTF-8"?><svg width="20" height="20" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M24 33V15" stroke="#16b777" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><rect x="10" y="9" width="28" height="6" fill="none" stroke="#16b777" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><path d="M8 32L14 25H33.9743L40 32" stroke="#16b777" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><rect x="4" y="33" width="8" height="8" fill="none" stroke="#16b777" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><rect x="20" y="33" width="8" height="8" fill="none" stroke="#16b777" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><rect x="36" y="33" width="8" height="8" fill="none" stroke="#16b777" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/></svg></i> ' + d.title;
+					  }
+					}],
+					click: function(data, othis){
+						let timestamp = new Date().getTime();
+						that.parent().parent().parent().parent().after(me.nodeApend(data.id,timestamp));
+					}
+				});
+			});			
+			
+			//添加条件
+			flowBox.on("click",".add-branch",function(e){
+				let timestamp = new Date().getTime();
+				$(this).parent().find(".col-box").first().after(me.nodeApend(4,timestamp));
+				let branchWrap = $($(this).parents(".branch-wrap")[0]);
+				let colBbox = branchWrap.find('.col-box');
+				colBbox.each(function(index,item){
+					$(item).find('.condition-priority').html('优先级'+(index+1));
+					if(index<colBbox.length-1){
+						$(item).find('.condition-input').attr('placeholder','条件'+(index+1));
+					}
+				});				
+			})
+		
+			//删除节点、条件
+			flowBox.on("click",".remove-node",function(e){
+				if($(this).parents().hasClass("condition-judge")){
+					let idx =$(this).closest('.col-box').index();
+					let branchWrap = $($(this).parents(".branch-wrap")[0]);
+					let colBbox = branchWrap.find('.col-box');
+					if(colBbox.length==2 || idx==1){
+						layer.confirm('确定需要删除整个条件分支？', {icon: 3}, function(){
+							branchWrap.remove();
+							layer.closeAll();
+						});
+					}
+					else{
+						$(this).closest(".col-box").remove();
+						colBbox = branchWrap.find('.col-box');
+						colBbox.each(function(index,item){
+							$(item).find('.condition-priority').html('优先级'+(index+1));
+							if(index<colBbox.length-1){
+								$(item).find('.condition-input').attr('placeholder','条件'+(index+1));
+							}
+						});	
+					}
+				}else if($(this).parents().hasClass("node-wrap")){
+					$(this).closest(".node-wrap").parent().remove();
+				}
+			})
+			
+			//放大、缩小
+			flowBar.on("click",".zoom-ctrl",function(e){
+				let type = $(this).data('type'),size=1;
+				if(type==1){
+					size = me.size - 0.25;
+				}
+				else{
+					size = me.size + 0.25;
+				}
+				
+				if(size<=0){
+					layer.msg('已经是最小了');
+					return false;
+				}
+				else if(size>3){
+					layer.msg('已经是最大了');
+					return false;
+				}
+				me.size = size;
+				flowBox.css("transform","scale("+size+")");
+				flowBar.find('.zoom-num').html((size*100)+'%');
+			})
+		}
+	};
+	exports('oaFlow', obj);
+});  
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/oaNumber.js b/public/static/assets/gougu/module/oaNumber.js
new file mode 100644
index 0000000000000000000000000000000000000000..f6499427876ea16fe580641e359f165a5213ef62
--- /dev/null
+++ b/public/static/assets/gougu/module/oaNumber.js
@@ -0,0 +1,119 @@
+layui.define([], function (exports) {
+	let oaNumber = {
+		// 加法函数
+		accAdd:function(arg1, arg2) {
+			var r1, r2, m;
+			try {
+				// 获取到小数点的位数
+				r1 = arg1.toString().split(".")[1].length;
+			} catch (e) {
+				r1 = 0;
+			}
+			try {
+				r2 = arg2.toString().split(".")[1].length;
+			} catch (e) {
+				r2 = 0;
+			}
+			// 取位数最大的 10^ n次方
+			m = Math.pow(10, Math.max(r1, r2));
+			return (arg1 * m + arg2 * m) / m;
+		},
+		//减法函数
+		accSub:function(arg1, arg2) {
+			var r1, r2, m, n;
+			try {
+				r1 = arg1.toString().split(".")[1].length;
+			} catch (e) {
+				r1 = 0;
+			}
+			try {
+				r2 = arg2.toString().split(".")[1].length;
+			} catch (e) {
+				r2 = 0;
+			}
+			m = Math.pow(10, Math.max(r1, r2)); // 动态控制精度长度
+			// 计算结果保留的位数
+			n = (r1 >= r2) ? r1 : r2;
+			return parseFloat(((arg1 * m - arg2 * m) / m).toFixed(n));
+		},
+		//乘法函数
+		accMul:function(arg1, arg2) {
+			var m = 0,
+				s1 = arg1.toString(),
+				s2 = arg2.toString();
+			try {
+				m += s1.split(".")[1].length;
+			} catch (e) {
+			}
+			try {
+				m += s2.split(".")[1].length;
+			} catch (e) {
+			}
+			return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
+		},
+		//除法函数
+		accDiv(arg1, arg2) {
+			var t1 = 0,
+				t2 = 0,
+				r1, r2;
+			try {
+				t1 = arg1.toString().split(".")[1].length;
+			} catch (e) {
+			}
+			try {
+				t2 = arg2.toString().split(".")[1].length;
+			} catch (e) {
+			}
+			with (Math) {
+				r1 = Number(arg1.toString().replace(".", ""));
+				r2 = Number(arg2.toString().replace(".", ""));
+				return (r1 / r2) * pow(10, t2 - t1);
+			}
+		},
+		//千分号格式化金额
+		accFormat:function (num) {
+			if (typeof num !== 'number') {
+				return '-';
+			}
+			if(num=='-'||num==''){
+				return '-';
+			}
+			var res=num.toString().replace(/\d+/, function(n){ // 先提取整数部分
+			   return n.replace(/(\d)(?=(\d{3})+$)/g,function($1){
+				  return $1+",";
+				});
+			})
+			return res;
+		},
+		//金额转人民币大写
+	    accCny:function(num){
+			if (typeof num !== 'number') {
+				return '-';
+			}
+			if (num === 0) {
+				return '零元整';
+			}
+			const fraction = ['角', '分'];
+			const digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
+			const unit = [['元', '万', '亿'], ['', '拾', '佰', '仟']];
+			let head = num < 0 ? '欠' : '';
+			num = Math.abs(num);
+			let s = '';
+			for (let i = 0; i < fraction.length; i++) {
+				s += (digit[Math.floor(num * 10 * Math.pow(10, i)) % 10] + fraction[i]).replace(/零./, '');
+			}
+			s = s || '整';
+			num = Math.floor(num);
+			for (let i = 0; i < unit[0].length && num > 0; i++) {
+				let p = '';
+				for (let j = 0; j < unit[1].length && num > 0; j++) {
+					p = digit[num % 10] + unit[1][j] + p;
+					num = Math.floor(num / 10);
+				}
+				s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s;
+			}
+			return head + s.replace(/(零.)*零元/, '元').replace(/(零.)+/g, '零').replace(/^整$/, '零元整');
+		}
+	};
+	exports('oaNumber', oaNumber);
+});  
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/oaPicker.js b/public/static/assets/gougu/module/oaPicker.js
new file mode 100644
index 0000000000000000000000000000000000000000..fe167d1fe8d9d256f7e57c051a87660dead756b7
--- /dev/null
+++ b/public/static/assets/gougu/module/oaPicker.js
@@ -0,0 +1,514 @@
+layui.define(['tool'], function (exports) {
+	const layer = layui.layer, tool = layui.tool,form=layui.form, table=layui.table,tree = layui.tree;
+	
+	const dataPicker ={
+		'department':{
+			title:'选择部门',
+			url:'/api/index/get_department',
+			area: ['400px', '524px'],
+			searchbar:'',
+			page:false,
+			cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'部门名称'}]
+		},
+		'position':{
+			title:'选择岗位',
+			url:'/api/index/get_position',
+			area: ['400px', '524px'],
+			searchbar:'',
+			page:false,
+			cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'岗位名称'}]
+		},
+		'services':{
+			title:'选择服务类型',
+			url:'/api/index/get_services',
+			area: ['400px', '524px'],
+			searchbar:'',
+			page:false,
+			cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'服务名称'},{field:'price',title:'服务单价'}]
+		},
+		'template':{
+			title:'选择消息模板',
+			url:'/api/index/get_template',
+			area: ['600px', '568px'],
+			cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'消息模板名称'}]
+		},
+		'workcate':{
+			title:'选择工作类型',
+			url:'/api/index/get_work_cate',
+			area: ['400px', '524px'],
+			searchbar:'',
+			page:false,
+			cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'工作类型名称'}]
+		},
+		'property':{
+			title:'选择固定资产',
+			url:'/adm/api/get_property',
+			cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'资产名称'}]
+		},
+		'car':{
+			title:'选择车辆信息',
+			url:'/adm/api/get_car',
+			cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'车辆名称'},{field:'name',width:100,title:'车牌号码',align:'center'}]
+		},
+		'room':{
+			title:'选择会议室',
+			url:'/adm/api/get_meeting_room',
+			cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'会议室名称'},{field:'num',width:100,title:'可容纳人数',align:'center'}]
+		},
+		'customer':{
+			title:'选择客户',
+			url:'/customer/api/get_customer',
+			cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'name',title:'客户名称'}]
+		},
+		'supplier':{
+			title:'选择供应商',
+			url:'/contract/api/get_supplier',
+			cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'供应商名称'}]
+		},
+		'contract':{
+			title:'选择销售合同',
+			url:'/contract/api/get_contract',
+			area: ['800px', '568px'],
+			cols:[{ field: 'code',width:160,title:'合同编号',align:'center'},{field:'name',title:'合同名称'},{ field:'customer',title:'关联客户',width: 240}]
+		},
+		'product':{
+			title:'选择产品',
+			url:'/contract/api/get_product',
+			cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'产品名称'},{field:'sale_price',title:'销售单价',width: 120,align:'center'}]
+		},
+		'purchase':{
+			title:'选择采购合同',
+			url:'/contract/api/get_purchase',
+			area: ['800px', '568px'],
+			cols:[{ field: 'code',width:160,title:'合同编号',align:'center'},{field:'name',title:'合同名称'},{ field:'supplier',title:'关联供应商',width: 240}]
+		},
+		'purchased':{
+			title:'选择采购物品',
+			url:'/contract/api/get_purchased',
+			cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'采购物品名称'},{field:'purchase_price',title:'采购单价',width: 120,align:'center'}]
+		},
+		'project':{
+			title:'选择项目',
+			url:'/project/api/get_project',
+			cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'项目名称'}]
+		},
+		'task':{
+			title:'选择任务',
+			url:'/project/api/get_task',
+			area: ['800px', '568px'],
+			cols:[{field:'id',width:90,title:'序号',align:'center'},{ field:'title',title:'任务主题'},{field:'project',width:240,title:'关联项目'}]
+		}
+	}
+
+	let select_ids=[];select_names=[];select_array=[];
+	const obj = {
+		employeeRender:function(){
+			var me=this,letterTem='';
+			for(var i=0;i<26;i++){
+				letterTem+='<span class="layui-letter-span" data-code="'+String.fromCharCode(97+i)+'">'+String.fromCharCode(65+i)+'</span>';
+			}
+			var tpl='<div style="width:210px; height:388px; border-right:1px solid #eee; overflow-x: hidden; overflow-y: auto; float:left;">\
+							<div id="employeeDepament" style="padding:6px 0;"></div>\
+						</div>\
+						<div style="width:588px; height:388px; user-select:none; overflow-x: hidden; overflow-y: auto; float:left;">\
+							<div style="padding:12px 10px 0;"><div style="color:#999; text-align:center;">⇐ 点击左边部门筛选员工，或者点击下面字母筛选</div><div id="letterBar" style="color:#999; text-align:center;">'+letterTem+'</div></div>\
+							<div id="employee" style="padding:6px 12px"></div>\
+							<div style="padding:10px 15px; border-top:1px solid #eee;;"><strong>已选择</strong><span class="layui-tags-all">全选</span></div>\
+							<div id="selectTags" style="padding:10px 15px;">'+me.employeeSelect(0)+'</div>\
+						</div>';
+			return tpl;
+		},
+		employeeSelect:function(t){
+			var me=this,select_tags='';
+			if(me.settings.type == 0){
+				select_tags+='<span style="color:#1E9FFF">'+me.settings.names+'</span>';
+			}
+			else{
+				select_ids=[];
+				select_names=[];
+				for(var a=0;a<select_array.length;a++){
+					if(me.settings.fixedid==select_array[a].id && me.settings.fixedid!=0){
+						select_tags+='<span class="layui-tags-span">'+select_array[a].name+'</span>';
+					}
+					else{
+						select_tags+='<span class="layui-tags-span">'+select_array[a].name+'<i data-id="'+select_array[a].id+'" class="layui-icon layui-tags-close">ဆ</i></span>';
+					}
+					if(t==1){
+						$('#employee').find('[data-id="'+select_array[a].id+'"]').addClass('on');
+					}
+					select_ids.push(parseInt(select_array[a].id));
+					select_names.push(select_array[a].name);
+				}
+			}
+			//console.log(select_array);
+			return select_tags;
+		},
+		employeeInit: function (options) {
+			const opts={
+				"title":"选择员工",
+				"department_url": "/api/index/get_department_tree",
+				"employee_url": "/api/index/get_employee",
+				"type":1,//1单人,2多人
+				"fixedid":0,
+				"ids":"",
+				"names":"",
+				"ajax_data":[],
+				"callback": function(){}
+			};
+			this.settings = $.extend({}, opts, options);
+			var me=this;
+			select_ids=[];
+			select_names=[];
+			select_array=[];
+			if(me.settings.ids!='' && me.settings.names!=''){
+				select_ids=me.settings.ids.split(',');
+				select_names=me.settings.names.split(',');
+				select_ids.sort((a, b) => a - b);
+				for(var m=0;m<select_ids.length;m++){
+					select_array.push({id:select_ids[m],name:select_names[m]});
+				}
+			}
+			$(parent.$('.express-close')).addClass('parent-colse');
+			layer.open({
+				type:1,
+				title:me.settings.title,
+				area:['800px','500px'],
+				resize:false,
+				content:me.employeeRender(),
+				end: function(){
+					$(parent.$('.express-close')).removeClass('parent-colse');
+				},
+				success:function(obj,idx){
+						var dataList=[],letterBar=$('#letterBar'),employee = $('#employee'),selectTags = $('#selectTags');
+						$.ajax({
+							url:me.settings.department_url,
+							type:'get',
+							success:function(res){			
+								//仅节点左侧图标控制收缩
+								tree.render({
+									elem: '#employeeDepament',
+									data: res.trees,
+									onlyIconControl: true,  //是否仅允许节点左侧图标控制展开收缩
+									click: function(obj){
+										var tagsItem='<div style="color:#999; text-align:center;">暂无员工</div>';
+										$("#employeeDepament").find('.layui-tree-main').removeClass('on');
+										$(obj.elem).find('.layui-tree-main').eq(0).addClass('on');
+										letterBar.find('span').removeClass('on');
+										$.ajax({
+											url:me.settings.employee_url,
+											type:'get',
+											data:{did:obj.data.id},
+											success:function(res){
+												me.ajax_data = res.data;
+												dataList=me.ajax_data;
+												if(dataList.length>1 && me.settings.type == 2){
+													$('.layui-tags-all').show();
+												}
+												else{
+													$('.layui-tags-all').hide();
+												}
+												if(dataList.length>0){
+													tagsItem='';
+													for(var i=0; i<dataList.length; i++){
+														if(select_ids.indexOf(dataList[i].id) == -1){
+															tagsItem+='<span class="layui-tags-span" data-idx="'+i+'" data-id="'+dataList[i].id+'">'+dataList[i].name+'</span>';
+														}
+														else{
+															tagsItem+='<span class="layui-tags-span on" data-idx="'+i+'" data-id="'+dataList[i].id+'">'+dataList[i].name+'</span>';
+														}
+													}
+												}
+												employee.html(tagsItem);
+											}
+										})
+									}
+								});	
+								
+								letterBar.on("click" ,'span',function(){
+									var code=$(this).data('code');
+									$(this).addClass('on').siblings().removeClass('on');
+									$.ajax({
+										url:me.settings.employee_url,
+										type:'get',
+										data:{id:1},
+										success:function(res){	
+											me.ajax_data = res.data;
+											var letterData=[],tagsItem='<div style="color:#999; text-align:center;">暂无员工</div>';;
+											if(me.ajax_data.length>0){
+												var tagsItemCode='';
+												for(var i=0; i<me.ajax_data.length; i++){
+													if(me.ajax_data[i].username.slice(0,1)==code){
+														if(select_ids.indexOf(me.ajax_data[i].id) == -1){
+															tagsItemCode+='<span class="layui-tags-span" data-idx="'+i+'" data-id="'+me.ajax_data[i].id+'">'+me.ajax_data[i].name+'</span>';
+														}
+														else{
+															tagsItemCode+='<span class="layui-tags-span on" data-idx="'+i+'" data-id="'+me.ajax_data[i].id+'">'+me.ajax_data[i].name+'</span>';
+														}
+														letterData.push(me.ajax_data[i]);
+													}
+												}
+												dataList=letterData;
+												if(dataList.length>2 && me.settings.type == 2){
+													$('.layui-tags-all').show();
+												}
+												else{
+													$('.layui-tags-all').hide();
+												}
+												if(tagsItemCode!=''){
+													tagsItem = tagsItemCode;
+												}
+											}
+											employee.html(tagsItem);
+										}
+									})
+								});								
+							}
+						})
+						
+						if(me.settings.type == 2){
+							$('.layui-tags-all').on('click',function(){
+								for(var a=0; a<dataList.length;a++){
+									if(select_ids.indexOf(dataList[a]['id']) == -1){
+										select_array.push(dataList[a]);;
+									}									
+								}
+								selectTags.html(me.employeeSelect(1));	
+							});
+						}					
+						
+						employee.on('click','.layui-tags-span',function(){
+							let item_idx=$(this).data('idx');
+							let select_item = me.ajax_data[item_idx];
+							if(me.settings.type == 1){
+								me.settings.callback([select_item]);
+								layer.close(idx);
+							}
+							else{
+								if(select_ids.indexOf(select_item['id']) == -1){
+									select_array.push(select_item);
+									selectTags.html(me.employeeSelect(1));	
+								}
+							}					
+						});
+						
+						selectTags.on('click','.layui-tags-close',function(){
+							let id=$(this).data('id');
+							let new_slected=[];
+							$('#employee').find('[data-id="'+id+'"]').removeClass('on');
+							for(var i=0;i<select_array.length;i++){
+								if(select_array[i].id!=id){
+									new_slected.push(select_array[i]);
+								}
+							}
+							select_array=new_slected;
+							selectTags.html(me.employeeSelect(1));
+						});
+						if(me.settings.type == 1){
+							$('#layui-layer'+idx).find('.layui-layer-btn0').hide();
+						}						
+					},
+					btn: ['确定添加', '清空已选'],
+					btnAlign:'c',
+					btn1: function(idx){
+						me.settings.callback(select_array);
+						layer.close(idx);
+					},
+					btn2: function(idx){
+						let canceldata= {department:"",did:0,id:0,mobile:0,name:"",nickname:"",position_id:0,sex:0,status:0,thumb:"",username:""};
+						me.settings.callback([canceldata]);
+						layer.close(idx);
+					}
+			})	
+		},
+		picker:function(types,type,callback,map){
+			let pickerIndex = new Date().getTime();
+			let pickerTable,options;
+			const opts={
+				"title":"选择",
+				"url": "",
+				"ids":"",
+				"titles":"",
+				"where":map,
+				"area": ['600px', '568px'],
+				"cols":[{field: 'id',width: 80,title:'序号',align:'center'},{field:'title',title:'名称'}],
+				"searchbar":'<form class="layui-form pb-2"><div class="layui-input-inline" style="width:420px; margin-right:5px;"><input type="text" name="keywords" placeholder="请输入关键字" class="layui-input" autocomplete="off" /></div><button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="picker">提交搜索</button><button type="reset" class="layui-btn layui-btn-reset" lay-filter="picker-reset">清空</button></form>',
+				"page":true,
+				"type":type,//1单选择,2多选
+				"btnno":true,
+				"add": "",//新增url
+				"callback": callback
+			};
+			if(Object.prototype.toString.call(types) === '[object Object]'){
+				options = types;
+			}
+			else{
+				options = dataPicker[types];
+			}
+			let settings = $.extend({},opts,options);
+			//console.log(settings);
+			let btn = ['确定选择'];
+			if(settings.btnno==true){
+				btn = ['确定选择','清空已选'];
+			}
+			if(settings.add!=''){
+				btn = ['确定选择','清空已选','新增'];
+			}
+			$(parent.$('.express-close')).addClass('parent-colse');
+			layer.open({
+				title: settings.title,
+				area: settings.area,
+				type: 1,
+				skin: 'gougu-picker',
+				content: '<div class="picker-table" id="pickerBox'+pickerIndex+'">'+settings.searchbar+'<div id="pickerTable'+pickerIndex+'"></div></div>',
+				end: function(){
+					$(parent.$('.express-close')).removeClass('parent-colse');
+				},
+				success: function () {
+					let cols=JSON.parse(JSON.stringify(settings.cols));
+					if(settings.type==1){
+						cols.splice(0, 0, {type: 'radio', title: '选择'});
+					}
+					if(settings.type==2){
+						cols.splice(0, 0, {type: 'checkbox', title: '选择'});
+					}
+					pickerTable = table.render({
+						elem: '#pickerTable'+pickerIndex,
+						url: settings.url,
+						where:settings.where,
+						page: settings.page, //开启分页
+						limit: 10,
+						height: '407',
+						cols: [cols]
+					});
+					//搜索提交
+					form.on('submit(picker)', function (data) {
+						let maps = $.extend({}, settings.where, data.field);
+						pickerTable.reload({where:maps,page:{curr: 1}});
+						return false;
+					});
+					//重置搜索提交
+					$('#pickerBox'+pickerIndex).on('click', '[lay-filter="picker-reset"]', function () {
+						let prev = $(this).prev();
+						if (typeof(prev) != "undefined" ) {
+							setTimeout(function () {
+								prev.click();
+							}, 10)
+						}
+					});	
+				},
+				btn: btn,
+				btnAlign: 'c',
+				btn1: function (idx) {
+					var checkStatus = table.checkStatus(pickerTable.config.id);
+					var data = checkStatus.data;
+					if (data.length > 0) {
+						callback(data);
+						layer.close(idx);
+					}
+					else {
+						layer.msg('请先选择内容');
+						return false;
+					}
+				},
+				btn2: function (idx) {
+					callback([{'id':0,'title':'','name':''}]);
+					layer.close(idx);
+				},
+				btn3: function (idx) {
+					tool.side(settings.add);
+					layer.close(idx);
+				}
+			})
+		}
+	}
+	
+	//选择员工弹窗		
+	$('body').on('click','.picker-admin',function () {
+		let that = $(this);
+		let type = that.data('type');
+		if (typeof(type) == "undefined" || type == '') {
+			type = 1;
+		}
+		let ids=that.next().val()+'',names = that.val()+'';
+		obj.employeeInit({
+			ids:ids,
+			names:names,
+			type:type,
+			callback:function(data){
+				let select_id=[],select_name=[];
+				for(var a=0; a<data.length;a++){
+					select_id.push(data[a].id);
+					select_name.push(data[a].name);
+				}
+				console.log(select_name);
+				that.val(select_name.join(','));
+				that.next().val(select_id.join(','));
+			}
+		});
+	});
+	
+	//选择下属员工弹窗		
+	$('body').on('click','.picker-sub',function () {
+		let that = $(this);
+		let type = that.data('type');
+		if (typeof(type) == "undefined" || type == '') {
+			type = 1;
+		}
+		let ids=that.next().val()+'',names = that.val()+'';
+		obj.employeeInit({
+			title:"选择下属",
+			department_url: "/api/index/get_department_tree_sub",
+			employee_url: "/api/index/get_employee_sub",
+			ids:ids,
+			names:names,
+			type:type,
+			callback:function(data){
+				let select_id=[],select_name=[];
+				for(var a=0; a<data.length;a++){
+					select_id.push(data[a].id);
+					select_name.push(data[a].name);
+				}
+				console.log(select_name);
+				that.val(select_name.join(','));
+				that.next().val(select_id.join(','));
+			}
+		});
+	});
+	
+	//选择OA数据弹层	
+	$('body').on('click','.picker-oa',function () {
+		let that = $(this),ids = [],titles=[],map = {};
+		let types = that.data('types');
+		let type = that.data('type');
+		let where = that.data('where');
+		if (typeof(types) == "undefined" || types == '') {
+			layer.msg('请设置【picker】的类型');
+			return false;
+		}
+		if (typeof(type) == "undefined" || type == '') {
+			type = 1;
+		}
+		if (typeof(where) == "undefined" || where == '') {
+			map = {};
+		}
+		else{
+			map = JSON.parse(where);
+		}
+		let callback = function(data){
+			for ( var i = 0; i <data.length; i++){
+				ids.push(data[i].id);
+				if(!data[i].title){
+					titles.push(data[i].name);
+				}else{
+					titles.push(data[i].title);
+				}				
+			}
+			that.val(titles.join(','));
+			that.next().val(ids.join(','));
+		}
+		obj.picker(types,type,callback,map);
+	});
+	
+	//输出接口
+	exports('oaPicker', obj);
+});   
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/oaSchedule.js b/public/static/assets/gougu/module/oaSchedule.js
new file mode 100644
index 0000000000000000000000000000000000000000..67fdef081563efd79a2a0b3ab1079196a059d3dd
--- /dev/null
+++ b/public/static/assets/gougu/module/oaSchedule.js
@@ -0,0 +1,297 @@
+layui.define(['tool'], function (exports) {
+	const tool = layui.tool,layer = layui.layer,form = layui.form,laydate = layui.laydate;
+	const obj = {
+		loading:false,
+		load: function (tid) {
+			let callback = function (res) {
+				if (res.code == 0 && res.data.length > 0) {
+					let itemSchedule = '';
+					$.each(res.data, function (index, item) {
+						itemSchedule += `
+							<div class="pt-2">
+								<p class="gray">${item.start_time}~${item.end_time}，${item.labor_time}工时</p>
+								<p><span class="blue">${item.name}：</span>${item.title}</p>
+							</div>
+						`;
+					});
+					$("#schedule_" + tid).html(itemSchedule);
+					layer.closeAll();
+				}
+			}
+			tool.get("/project/api/task_schedule", { tid: tid }, callback);
+		},
+		//保存
+		save: function (postData) {
+			let callback = function (e) {
+				if (e.code == 0) {
+					layer.closeAll();
+					layer.msg(e.msg);
+					if(layui.scheduleTable){
+						layui.scheduleTable.reload();
+					}
+					else{
+						setTimeout(function(){
+							location.reload();
+						},1000);	
+					}					
+				} else {
+					layer.msg(e.msg);
+				}
+			}
+			tool.post("/oa/schedule/add", postData, callback);
+		},
+		//查看
+		view: function (detail) {
+			let project = '';
+			if(detail.tid>0){
+				project = `<table class="layui-table" style="margin:12px 12px 0;">
+								<tr>
+								<td class="layui-td-gray">关联项目</td>
+								<td>${detail.project}</td>
+								</tr>
+								<tr>
+									<td class="layui-td-gray">关联任务</td>
+									<td>${detail.task}</td>
+								</tr>
+							</table>`;
+			}
+			let content = `<div style="width:696px">
+							<table class="layui-table" style="margin:12px 12px 0;">
+								<tr>
+									<td class="layui-td-gray">执行员工</td>
+									<td>${detail.name}</td>									
+									<td class="layui-td-gray">所在部门</td>
+									<td>${detail.department}</td>
+									<td class="layui-td-gray">工作类别</td>
+									<td>${detail.work_cate}</td>
+								</tr>
+								<tr>
+									<td class="layui-td-gray">时间范围</td>
+									<td colspan="3">${detail.start_time} 至 ${detail.end_time}，共${detail.labor_time}工时</td>
+									<td class="layui-td-gray">工作类型</td>
+									<td>${detail.labor_type_string}</td>
+								</tr>
+								<tr>
+									<td class="layui-td-gray">工作内容</td>
+									<td colspan="5">${detail.title}</td>
+								</tr>
+								<tr>
+									<td class="layui-td-gray">补充描述</td>
+									<td colspan="5">${detail.remark}</td>
+								</tr>
+							</table>
+							${project}
+						</div>`;
+			$(parent.$('.express-close')).addClass('parent-colse');			
+			layer.open({
+				type: 1,
+				title: '工作记录详情',
+				area: ['720px', '420px'],
+				content: content,
+				end: function(){
+					$(parent.$('.express-close')).removeClass('parent-colse');
+				},
+				success: function () {
+
+				},
+				btn: ['关闭'],
+				btnAlign: 'c',
+				yes: function (idx) {
+					layer.close(idx);
+				}
+			})
+		},
+		add: function (tid, schedule) {
+			let that = this, detail = {}, title = '添加工作记录';
+			if(that.loading == true){
+				return false;
+			}
+			that.loading = true;
+			let html_time = '';
+			if (schedule['id'] > 0) {
+				if(schedule['admin_id'] != login_admin){
+					layer.msg('不能编辑他人的工作记录');
+					return false;
+				}
+				title = '编辑工作记录';
+				detail['id'] = schedule['id'];
+				detail['cid'] = schedule['cid'];
+				detail['tid'] = schedule['tid'];
+				detail['title'] = schedule['title'];
+				detail['labor_type'] = schedule['labor_type'];
+				detail['start_time_a'] = schedule['start_time_a'];
+				detail['start_time_b'] = schedule['start_time_b'];
+				detail['end_time_a'] = schedule['end_time_a'];
+				detail['end_time_b'] = schedule['end_time_b'];
+				detail['remark'] = schedule['remark'];
+				
+				html_time = detail.start_time_a+' '+detail.start_time_b+' 至 '+detail.end_time_b+'，共'+schedule.labor_time+'工时';
+			} else {
+				detail['id'] = schedule['id'];
+				detail['tid'] = tid;
+				detail['cid'] = 1;
+				detail['title'] = '';
+				detail['labor_type'] = 0;
+				detail['start_time_a'] = schedule['start_time_a']?schedule['start_time_a']:'';
+				detail['start_time_b'] = '09:00';
+				detail['end_time_a'] = schedule['end_time_a']?schedule['end_time_a']:'';
+				detail['end_time_b'] = '09:30';
+				detail['remark'] = '';
+				
+				html_time = `<input id="start_time_a" name="start_time_a" style="width:90px; display:inline-block;" autocomplete="off" class="layui-input" value="${detail.start_time_a}" readonly lay-verify="required" lay-reqText="请选择"><div style="display: inline-block; margin-left:3px; width: 80px;"><select lay-filter="start_time_b" id="start_time_b"></select></div> 至 <input id="end_time_a" name="end_time_a" style="width:90px; display:inline-block;" autocomplete="off" class="layui-input" value="${detail.end_time_a}" readonly lay-verify="required" lay-reqText="请选择"><div style="display: inline-block; margin-left:3px; width: 80px;"><select lay-filter="end_time_b" id="end_time_b"></select></div>`;
+			}			
+			let callback = function(e){
+				that.loading = false;
+				if(e.code==0){
+					let cate = e.data;	
+					let content = `<form class="layui-form" style="width:696px">
+							<table class="layui-table" style="margin:12px 12px 0;">
+								<tr>
+									<td class="layui-td-gray">时间范围 <span style="color: red">*</span></td>
+									<td>${html_time}</td>
+									<td class="layui-td-gray">工作类别<font>*</font></td>
+									<td style="width: 120px;"><select name="cid" lay-filter="work_cate" id="work_cate"></select></td>
+								</tr>
+								<tr>
+									<td class="layui-td-gray">工作类型<font>*</font></td>
+									<td colspan="3"><input type="radio" name="labor_type" lay-filter="labor_type" value="1" title="案头工作"><input type="radio" name="labor_type" value="2" lay-filter="labor_type" title="外勤工作"></td>
+								</tr>
+								<tr>
+									<td class="layui-td-gray">工作内容 <span style="color: red">*</span></td>
+									<td colspan="3"><input name="title" class="layui-input" value="${detail.title}" lay-verify="required" lay-reqText="请完成工作内容"></td>
+								</tr>
+								<tr>
+									<td class="layui-td-gray">补充描述</td>
+									<td colspan="3">
+										<textarea name="remark" form-input="remark" class="layui-textarea" style="min-height:120px;">${detail.remark}</textarea>
+										<input name="tid" type="hidden" value="${detail.tid}">
+									</td>
+								</tr>
+							</table>
+						</form>`;
+					$(parent.$('.express-close')).addClass('parent-colse');		
+					layer.open({
+						type: 1,
+						title: title,
+						area: ['720px', '420px'],
+						content: content,
+						end: function(){
+							$(parent.$('.express-close')).removeClass('parent-colse');
+						},
+						success: function () {
+							if (detail['id'] == 0) {
+								//日期时间范围
+								laydate.render({
+									elem: '#start_time_a',
+									type: 'date',
+									min: -7,
+									max: 0,
+									format: 'yyyy-MM-dd',
+									showBottom: false,
+									done: function (a, b, c) {
+										$('#end_time_a').val(a);
+										detail.start_time_a = a;
+										detail.end_time_a = a;
+									}
+								});
+
+								//日期时间范围
+								laydate.render({
+									elem: '#end_time_a',
+									type: 'date',
+									min: -7,
+									max: 0,
+									format: 'yyyy-MM-dd',
+									showBottom: false,
+									done: function (a, b, c) {
+										$('#start_time_a').val(a);
+										detail.start_time_a = a;
+										detail.end_time_a = a;
+									}
+								});
+								$('#start_time_b,#end_time_b').empty();
+
+								var hourArray = [];
+								for (var h = 0; h < 24; h++) {
+									var t = h < 10 ? '0' + h : h
+									var t_1 = t + ':00', t_2 = t + ':15', t_3 = t + ':30', t_4 = t + ':45';
+									hourArray.push(t_1, t_2, t_3, t_4);
+								}
+
+								var html_1 = '', html_2 = '', def_h1 = detail['start_time_b'], def_h2 = detail['end_time_b'];
+								for (var s = 0; s < hourArray.length; s++) {
+									var check_1 = '', check_2 = '';
+									if (hourArray[s] == def_h1) {
+										check_1 = 'selected';
+									}
+									if (hourArray[s] == def_h2) {
+										check_2 = 'selected';
+									}
+									html_1 += '<option value="' + hourArray[s] + '" ' + check_1 + '>' + hourArray[s] + '</option>';
+									html_2 += '<option value="' + hourArray[s] + '" ' + check_2 + '>' + hourArray[s] + '</option>';
+								}
+
+								$('#start_time_b').append(html_1);
+								$('#end_time_b').append(html_2);
+							}
+							$("input[name=labor_type][value="+detail.labor_type+"]").prop("checked","true");	
+							
+							var html_c='';
+							for (var c = 0; c < cate.length; c++) {
+								var check_c = '';
+								if (cate[c].id == detail['cid']) {
+									check_c = 'selected';
+								}
+								html_c += '<option value="' + cate[c].id + '" ' + check_c + '>' + cate[c].title + '</option>';
+							}
+
+							$('#work_cate').append(html_c);
+							
+							form.render();
+
+							form.on('select(start_time_b)', function (data) {
+								detail.start_time_b = data.value;
+							});
+							form.on('select(end_time_b)', function (data) {
+								detail.end_time_b = data.value;
+							});
+							$('[name="title"]').on('input', function () {
+								var _val = $(this).val();
+								detail.title = _val;
+							});
+							form.on('radio(labor_type)', function(data){
+							   detail.labor_type=data.value;
+							})
+							form.on('select(work_cate)', function(data){
+							   detail.cid=data.value;
+							})
+							$('[form-input="remark"]').on('input', function () {
+								var _val = $(this).val();
+								detail.remark = _val;
+							});
+						},
+						btn: ['确定提交'],
+						btnAlign: 'c',
+						yes: function (idx) {
+							if (detail.start_time_a == '' || detail.end_time_a == '') {
+								layer.msg('请选择工作时间范围');
+								return;
+							}
+							if(detail.labor_type==0){
+								layer.msg('请选择工作类型');
+								return;
+							}
+							if (detail.title == '') {
+								layer.msg('请填写工作内容');
+								return;
+							}
+							that.save(detail);
+						}
+					})
+				}
+			}
+			tool.get("/api/index/get_work_cate", {}, callback);
+		}
+	};
+	exports('oaSchedule', obj);
+});  
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/oaWork.js b/public/static/assets/gougu/module/oaWork.js
new file mode 100644
index 0000000000000000000000000000000000000000..47da5a0c7890a5861669ac56dc5fef338715ea46
--- /dev/null
+++ b/public/static/assets/gougu/module/oaWork.js
@@ -0,0 +1,359 @@
+layui.define(['tool','oaPicker'], function (exports) {
+	const layer = layui.layer;
+	const form = layui.form;
+	const tool = layui.tool;
+	const laydate = layui.laydate;
+	const oaPicker = layui.oaPicker;
+	// 定义工作时间段
+	const workPeriods = [
+		{ start: 8, end: 12 }, // 早上工作时间段
+		{ start: 14, end: 18 } // 下午工作时间段
+	];	
+	const obj = {
+		//计算工时
+		calculateWorkHours:function(startTimeStr, endTimeStr) {
+			if(startTimeStr == '' || endTimeStr==''){
+				return 0;
+			}
+			// 解析时间字符串为Date对象
+			const startTime = new Date(startTimeStr);
+			const endTime = new Date(endTimeStr);
+
+			// 确保结束时间晚于或等于开始时间
+			if (endTime < startTime) {
+				layer.msg('结束时间必须晚于或等于开始时间');
+				return 0;
+			}
+			let totalWorkHours = 0;
+
+			// 遍历每一天
+			let currentDay = new Date(startTime);
+			let nextDay = new Date(currentDay);
+			//nextDay.setDate(nextDay.getDate() + 1); // 设置为下一天的同一时间
+
+			while (currentDay <= endTime) {
+				// 计算当前天的工作时间
+				for (const period of workPeriods) {
+					// 获取当前天的工作时间段开始和结束时间
+					let dayStart = new Date(currentDay.getFullYear(), currentDay.getMonth(), currentDay.getDate(), period.start, 0, 0);
+					let dayEnd = new Date(currentDay.getFullYear(), currentDay.getMonth(), currentDay.getDate(), period.end, 0, 0);
+
+					// 检查是否在当前天的工作时间段内
+					if (currentDay <= dayEnd && (dayStart <= endTime || dayStart <= currentDay)) {
+						// 计算重叠的时间段
+						let overlapStart = Math.max(dayStart, Math.max(currentDay, startTime));
+						let overlapEnd = Math.min(dayEnd, endTime);
+
+						// 计算重叠时间段的时长（以毫秒为单位）
+						let overlapDuration = overlapEnd - overlapStart;
+
+						// 将时长转换为小时，并累加到总工时
+						totalWorkHours += overlapDuration / (1000 * 60 * 60);
+					}
+				}
+
+				// 移到下一天
+				currentDay = nextDay;
+				nextDay.setDate(nextDay.getDate() + 1);
+			}
+			// 保留两位小数
+			return totalWorkHours.toFixed(2);
+		},
+		count_total:function(detail){
+			let amount=0,work_total=0;
+			if(detail.fee==''){
+				detail.fee=0;
+			}
+			if(detail.hours==0){
+				amount = detail.fee;
+			}
+			else{
+				work_total = detail.hours*detail.work_price;
+				amount = (detail.fee*100+work_total*100)/100;
+			}
+			let total = {amount:amount.toFixed(2),work_total:work_total.toFixed(2)}
+			return total;
+		},
+		//保存
+		save: function (postData) {
+			let callback = function (e) {
+				if (e.code == 0) {
+					layer.closeAll();
+					layer.msg(e.msg);
+					if(layui.workTable){
+						layui.workTable.reload();
+					}
+					else{
+						setTimeout(function(){
+							location.reload();
+						},1000);	
+					}					
+				} else {
+					layer.msg(e.msg);
+				}
+			}
+			tool.post("/task/work/add", postData, callback);
+		},
+		//查看
+		view: function (detail) {
+			let demand = '',problems = '',task = '';
+			if(detail.demand_id>0){
+				demand = `<tr><td class="layui-td-gray">关联请求</td><td colspan="3">${detail.demand}</td></tr>`;
+			}
+			if(detail.problems_id>0){
+				problems = `<tr><td class="layui-td-gray">关联问题</td><td colspan="3">${detail.problems}</td></tr>`;
+			}
+			if(detail.task_id>0){
+				task = `<tr><td class="layui-td-gray">关联任务</td><td colspan="3">${detail.task}</td></tr>`;
+			}
+			let content = `<div class="p-2">
+					<table class="layui-table" style="margin:0">
+						${demand}
+						${problems}
+						${task}
+						<tr>
+							<td class="layui-td-gray-2">开始时间</td>
+							<td>${detail.start_time}</td>
+							<td class="layui-td-gray-2">结束时间</td>
+							<td>${detail.end_time}</td>
+						</tr>
+						<tr>
+							<td class="layui-td-gray">所有者</td>
+							<td>${detail.director_name}</td>
+							<td class="layui-td-gray">工时费用(元)</td>
+							<td>${detail.work_price}</td>
+						</tr>
+						<tr>
+							<td class="layui-td-gray">所用工时(小时)</td>
+							<td>${detail.hours}</td>
+							<td class="layui-td-gray">技术费用(元)</td>
+							<td>${detail.work_total}</td>
+						</tr>
+						<tr>
+							<td class="layui-td-gray">其他费用(元)</td>
+							<td>${detail.fee}</td>
+							<td class="layui-td-gray">总费用(元)</td>
+							<td>${detail.amount}</td>
+						</tr>
+						<tr>
+							<td class="layui-td-gray">工作内容</td>
+							<td colspan="3">${detail.title}</td>
+						</tr>
+						<tr>
+							<td class="layui-td-gray">补充描述</td>
+							<td colspan="3">${detail.remark}</td>
+						</tr>
+					</table>
+				</div>`;
+			layer.open({
+				type: 1,
+				title: '工作记录详情',
+				area: ['692px', '432px'],
+				content: content,
+				success: function () {
+
+				},
+				btn: ['关闭'],
+				btnAlign: 'c',
+				yes: function (idx) {
+					layer.close(idx);
+				}
+			})
+		},
+		add: function (schedule) {
+			let that = this, detail = {}, title = '添加工作记录',timestamp = new Date().getTime();;
+			let html_time = '';
+			if (schedule['id'] > 0) {
+				title = '编辑工作记录';
+				detail['id'] = schedule['id'];
+				detail['title'] = schedule['title'];
+				detail['start_time'] = schedule['start_time'];
+				detail['end_time'] = schedule['end_time'];
+				detail['director_name'] = schedule['director_name'];
+				detail['director_id'] = schedule['director_id'];
+				detail['hours'] = schedule['hours'];
+				detail['work_price'] = schedule['work_price'];
+				detail['fee'] = schedule['fee'];
+				detail['work_total'] = schedule['work_total'];
+				detail['amount'] = schedule['amount'];
+				detail['remark'] = schedule['remark'];
+			} else {
+				detail['task_id'] = schedule['task_id'];
+				detail['problems_id'] = schedule['problems_id'];
+				detail['demand_id'] = schedule['demand_id'];
+				detail['title'] = '';
+				detail['start_time'] = '';
+				detail['end_time'] = '';
+				detail['director_name'] = '';
+				detail['director_id'] = 0;
+				detail['hours'] = 0;
+				detail['work_price'] = 0;
+				detail['fee'] = 0;
+				detail['work_total'] = 0;
+				detail['amount'] = 0;
+				detail['remark'] = '';
+			}			
+			let content = `<form class="layui-form p-2">
+					<table class="layui-table" style="margin:0" id="table${timestamp}">
+						<tr>
+							<td class="layui-td-gray-2">开始时间 <span style="color: red">*</span></td>
+							<td><input id="start_time" name="start_time" class="layui-input" value="${detail.start_time}" readonly lay-verify="required" lay-reqText="请选择"></td>
+							<td class="layui-td-gray-2">结束时间 <span style="color: red">*</span></td>
+							<td><input id="end_time" name="end_time" class="layui-input" value="${detail.end_time}" readonly lay-verify="required" lay-reqText="请选择"></td>
+						</tr>
+						<tr>
+							<td class="layui-td-gray">所有者<font>*</font></td>
+							<td>
+								<input type="text" name="director_name" lay-verify="required" readonly placeholder="请选择" lay-reqText="请完善所有者" class="layui-input picker-diy" value="${detail.director_name}">
+								<input type="hidden" name="director_id" value="${detail.director_id}">
+							</td>
+							<td class="layui-td-gray">工时费用(元)</td>
+							<td><input name="work_price" class="layui-input layui-input-readonly" value="${detail.work_price}" readonly lay-verify="number"></td>
+						</tr>
+						<tr>
+							<td class="layui-td-gray">所用工时(小时)</td>
+							<td><input name="hours" class="layui-input layui-input-readonly" readonly value="${detail.hours}" lay-verify="number"></td>
+							<td class="layui-td-gray">技术费用(元)</td>
+							<td><input name="work_total" class="layui-input layui-input-readonly" value="${detail.work_total}" readonly lay-verify="number"></td>
+						</tr>
+						<tr>
+							<td class="layui-td-gray">其他费用(元)</td>
+							<td><input name="fee" class="layui-input" value="${detail.fee}" lay-verify="number"></td>
+							<td class="layui-td-gray">总费用(元)</td>
+							<td><input name="amount" class="layui-input layui-input-readonly" value="${detail.amount}" readonly lay-verify="number"></td>
+						</tr>
+						<tr>
+							<td class="layui-td-gray">工作内容 <span style="color: red">*</span></td>
+							<td colspan="3"><input name="title" class="layui-input" value="${detail.title}" lay-verify="required" lay-reqText="请完成工作内容"></td>
+						</tr>
+						<tr>
+							<td class="layui-td-gray">补充描述</td>
+							<td colspan="3">
+								<textarea name="remark" form-input="remark" class="layui-textarea" style="min-height:92px;">${detail.remark}</textarea>
+								<input name="tid" type="hidden" value="${detail.tid}">
+							</td>
+						</tr>
+					</table>
+				</form>`;					
+			layer.open({
+				type: 1,
+				title: title,
+				area: ['800px', '500px'],
+				content: content,
+				success: function () {	
+					//选择员工弹窗        
+					$('#table'+timestamp).on('click','.picker-diy',function () {
+						let self = $(this);
+						let ids=self.next().val()+'',names = self.val()+'';
+						oaPicker.employeeInit({
+							ids:ids,
+							names:names,
+							type:1,//1是单选，2是多选
+							callback:function(data){
+								self.val(data[0].name);
+								self.next().val(data[0].id);
+								detail.director_id = data[0].id;
+								if(data[0].id==0){
+									data[0].work_price=0.00;
+								}
+								detail.work_price = data[0].work_price;
+								$('[name="work_price"]').val(data[0].work_price);
+								let total = that.count_total(detail);
+								$('[name="amount"]').val(total.amount);
+								$('[name="work_total"]').val(total.work_total);
+								detail.amount = total.amount;
+								detail.work_total = total.work_total;
+							}
+						});
+					});				
+					//日期时间范围
+					laydate.render({
+						elem: '#start_time',
+						max: 0,
+						type: 'datetime',
+						format: 'yyyy-MM-dd HH:mm',
+						fullPanel: true,
+						done: function (a, b, c) {
+							detail.start_time = a;
+							detail.hours = that.calculateWorkHours(detail.start_time,detail.end_time);
+							$('[name="hours"]').val(detail.hours);
+							let total = that.count_total(detail);
+							$('[name="amount"]').val(total.amount);
+							$('[name="work_total"]').val(total.work_total);
+							detail.amount = total.amount;
+							detail.work_total = total.work_total;
+						}
+					});
+
+					//日期时间范围
+					laydate.render({
+						elem: '#end_time',
+						max: 0,
+						type: 'datetime',
+						format: 'yyyy-MM-dd HH:mm',
+						fullPanel: true,
+						done: function (a, b, c) {
+							detail.end_time = a;
+							that.calculateWorkHours(detail.start_time,detail.end_time);
+							detail.hours = that.calculateWorkHours(detail.start_time,detail.end_time);
+							$('[name="hours"]').val(detail.hours);
+							let total = that.count_total(detail);
+							$('[name="amount"]').val(total.amount);
+							$('[name="work_total"]').val(total.work_total);
+							detail.amount = total.amount;
+							detail.work_total = total.work_total;
+						}
+					});
+					
+					form.render();
+					
+					$('[name="title"]').on('input', function () {
+						var _val = $(this).val();
+						detail.title = _val;
+					});
+					$('[name="fee"]').on('input', function () {
+						this.value = this.value.replace(/[^0-9]/g,'');
+						var _val = $(this).val();
+						detail.fee = _val;
+						let total = that.count_total(detail);
+						$('[name="amount"]').val(total.amount);
+						$('[name="work_total"]').val(total.work_total);
+						detail.amount = total.amount;
+						detail.work_total = total.work_total;
+					});
+					$('[form-input="remark"]').on('input', function () {
+						var _val = $(this).val();
+						detail.remark = _val;
+					});
+				},
+				btn: ['确定提交'],
+				btnAlign: 'c',
+				yes: function (idx) {
+					if (detail.start_time == '') {
+						layer.msg('请选择开始时间');
+						return;
+					}
+					if (detail.end_time == '') {
+						layer.msg('请选择结束时间');
+						return;
+					}
+					if(detail.hours*100<=0){
+						layer.msg('请选择工作时间有问题');
+						return;
+					}
+					if(detail.director_id==0){
+						layer.msg('请完善所有者');
+						return;
+					}
+					if (detail.title == '') {
+						layer.msg('请填写工作内容');
+						return;
+					}
+					console.log(detail);
+					that.save(detail);
+				}
+			})
+		}
+	};
+	exports('oaWork', obj);
+});  
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tablePlus.js b/public/static/assets/gougu/module/tablePlus.js
new file mode 100644
index 0000000000000000000000000000000000000000..c62b5396d94c27079a227ee16cdd5936b2967bc4
--- /dev/null
+++ b/public/static/assets/gougu/module/tablePlus.js
@@ -0,0 +1,191 @@
+layui.define(function(exports) {
+	//tablePlus在原来的table模块的基础上实现了批量数据导出功能，实现defaultToolbar中筛选列记忆功能
+	var table = layui.table;	
+	var form = layui.form;	
+    var MOD_NAME='tablePlus';	
+    var tablePlus=$.extend({},table);	
+    tablePlus._render = tablePlus.render;
+	tablePlus.excel = function(total,options){
+		//console.log(options);
+		let _page = parseInt(total/options.excel_limit);
+		let page = total%options.excel_limit>0?(_page+1):_page;
+		let pageHtml='<p style="padding:16px 10px 0; text-align:center; color:red">由于导出数据比较消耗服务器资源，建议使用搜索功能筛选好数据再导出</p><p style="padding:5px 10px 10px; text-align:center; color:red">如果点击导出后，没有立即导出文件，请耐心等待一下，30秒内请勿重复点击。</p><p style="padding:0 10px; text-align:center;">共查询到<strong> '+total+' </strong>条数据，每次最多导出<strong>'+options.excel_limit+'</strong>条，共<strong>'+page+'</strong>页，请点击下面的页码导出</p><div id="exportPage" class="layui-box layui-laypage" style="padding:10px 0; width:100%;text-align:center;">';
+		for (i = 1; i <= page; i++) {
+			pageHtml += '<a href="javascript:;" data-page="'+i+'">'+i+'</a>';
+		}
+		pageHtml+='</div>';							
+		layer.open({
+			type: 1,
+			title: '导出数据',
+			area:['580px','240px'],
+			content: pageHtml,
+			success:function(res){
+				let tableWhere = JSON.parse(JSON.stringify(options.where));
+				tableWhere.limit=options.excel_limit;										
+				$('#exportPage').on('click','a',function(){
+					tableWhere.page=$(this).data('page');
+					let msg = layer.msg('正在导出数据...', {time:3000});
+					$.ajax({
+						url: options.url,
+						data: tableWhere,
+						success:function(res){
+							table.exportFile(options.id, res.data,'csv');
+							setTimeout(function(){
+								layer.msg('导出完成');			
+							},2000)	
+						}
+					});
+				})
+			}
+		});
+	}
+	//重写渲染方法
+    tablePlus.render=function(params){
+		if(params.excel_limit === undefined){
+			params.excel_limit = 10000;
+		}
+		if(params.cols_save === undefined){
+			params.cols_save = false;
+		}
+		if(params.limit === undefined){
+			params.limit = 20;
+		}
+		if(params.page === undefined){
+			params.page = true;
+		}
+		if(params.cellMinWidth === undefined){
+			params.cellMinWidth = 80;
+		}
+		if(params.help === undefined){
+			params.help = '无帮助说明';
+		}		
+		let defaultToolbar = [
+		  'filter',
+		  {
+			name: 'exports',
+			onClick: function(obj) {
+				// 当前示例配置项
+				let options = obj.config;
+				let total = obj.data.length;
+				// 弹出面板
+				obj.openPanel({
+					list: [ // 列表
+						'<li data-type="page">导出当前页</li>',
+						'<li data-type="all">导出全部</li>'
+					].join(''),
+					done: function(panel, list) { 
+						list.on('click', function() {
+							if(total==0){
+								layer.msg('暂无数据');
+								return false;
+							}
+							let type = $(this).data('type')
+							if(type === 'page') {
+								// 调用内置导出方法
+								let msg = layer.msg('正在导出数据...', {time:1000});
+								table.exportFile(options.id, null, 'csv');
+							}else if(type === 'all') {
+								let tableWhere = JSON.parse(JSON.stringify(options.where));
+								tableWhere.limit=options.excel_limit;
+								if(total<=tableWhere.limit){
+									tableWhere.page=1;
+									let msg = layer.msg('正在导出数据...', {time:3000});
+									$.ajax({
+										url: options.url,
+										data: tableWhere,
+										success:function(res){
+											table.exportFile(options.id, res.data,'csv');
+											setTimeout(function(){
+												layer.msg('导出完成');			
+											},3000)	
+										}
+									});
+								}
+								else{
+									tablePlus.excel(total,options)
+								}
+							}
+						});
+					}
+				 });
+			 }
+		  },{
+			  title:'数据说明',
+			  icon: 'layui-icon-help',
+			  layEvent: 'LAYTABLE_HELP',
+			  onClick: function(obj) {
+				layer.open({
+					shadeClose: true,
+					title:'帮助说明',
+					type: 1,
+					content: '<div style="padding:20px 15px; min-width:300px; line-height:1.8">'+obj.config.help+'</div>'
+				})
+			  }
+		  }
+		]
+		
+		if(params.defaultToolbar != false){
+			params.defaultToolbar = defaultToolbar;
+		}		
+		if(params.cols_save == true){
+			// 从本地存储获取用户保存的列显示设置
+			let savedCols = localStorage.getItem('col-filter-'+params.url);
+			let colsStatus = savedCols ? JSON.parse(savedCols) : {};
+			let cols = params.cols;
+			for (var i=0;i<cols[0].length;i++){
+                if(cols[0][i].field!=undefined  && colsStatus[cols[0][i].field] != undefined){
+                    cols[0][i].hide=colsStatus[cols[0][i].field];
+                }
+            }
+			params.cols = cols;
+			
+			if(typeof params.done === "function"){
+				let _done = params.done;
+				params.done = function(data, curr, count){
+					let obj = this;
+					_done(data, curr, count);	
+					obj.elem.next().on('mousedown', 'input[lay-filter="LAY_TABLE_TOOL_COLS"]+', function(){
+						var input = $(this).prev()[0];
+						layui.data ('col-filter-'+params.url,{
+							key: input.name,
+							value: input.checked
+						})
+					});
+				}
+			}
+			else{
+				params.done = function(data){
+					let obj = this;
+					obj.elem.next().on('mousedown', 'input[lay-filter="LAY_TABLE_TOOL_COLS"]+', function(){
+						var input = $(this).prev()[0];
+						layui.data ('col-filter-'+params.url,{
+							key: input.name,
+							value: input.checked
+						})
+					});
+				}
+			}			
+		}
+		var init = tablePlus._render(params);
+		//监听搜索提交
+		form.on('submit(table-search)', function(data) {
+			init.reload({
+				where: data.field,
+				page: {curr: 1}
+			});
+			return false;
+		});
+		//重置搜索提交
+		$('body').on('click', '[lay-filter="table-reset"]', function () {
+			let prev = $(this).prev();
+			if (typeof(prev) != "undefined" ) {
+				setTimeout(function () {
+					prev.click();
+				}, 10)
+			}
+		});		
+		return init;
+		//console.log(params);
+    };
+    exports(MOD_NAME, tablePlus);
+});
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce.js b/public/static/assets/gougu/module/tinymce.js
new file mode 100644
index 0000000000000000000000000000000000000000..74fa4af2f7d70e3e669a93d195d09a475172bca5
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce.js
@@ -0,0 +1,92 @@
+layui.define([], function (exports) {
+	var MOD_NAME = 'tinymce';
+	var modFile = layui.cache.modules['tinymce'];
+	var modPath = modFile.substr(0, modFile.lastIndexOf('.'));
+	var plugin_filename = 'tinymce.min.js'//插件名称
+	var settings = {
+		base_url:modPath,
+		images_upload_url: '/admin/api/upload/sourse/tinymce',//图片上传接口
+		images_upload_credentials:true,
+		placeholder: '请输入内容...',
+		language: 'zh_CN',//语言
+		suffix: '.min',
+		selector: '#gouguedit',
+		quickbars_insert_toolbar:'',
+		quickbars_selection_toolbar: 'cut copy | bold italic underline strikethrough ',
+		plugins: 'code quickbars print preview searchreplace autolink fullscreen image link media codesample table charmap hr advlist lists wordcount imagetools paste',
+		toolbar: 'code undo redo | forecolor backcolor bold italic underline strikethrough removeformat | alignleft aligncenter alignright alignjustify outdent indent | bullist numlist table blockquote link image media codesample | formatselect fontselect fontsizeselect',
+		resize: false,
+		elementpath: false,
+		branding: false,
+		statusbar: false,
+		convert_urls: false,// 附件路径无需要转换为相对路径。
+		contextmenu_never_use_native: true,
+		paste_data_images: true,
+		menubar: 'file edit insert format table',
+		menu: {
+			file: { title: '文件', items: 'preview fullscreen | wordcount' },
+			edit: { title: '编辑', items: 'undo redo | cut copy paste pastetext selectall | searchreplace' },
+			format: {
+				title: '格式',
+				items: 'bold italic underline strikethrough superscript subscript | formats | forecolor backcolor | removeformat'
+			},
+			table: { title: '表格', items: 'inserttable tableprops deletetable | cell row column' },
+		},
+		codesample_languages: [
+			{text: 'HTML', value: 'html'},
+			{text: 'JavaScript', value: 'javascript'},
+			{text: 'CSS', value: 'css'},
+			{text: 'PHP', value: 'php'},
+			{text: 'Java', value: 'java'},
+			{text: 'Shell', value: 'shell'},
+			{text: 'SQL', value: 'sql'},
+			{text: 'JOSN', value: 'json'},
+			{text: 'Python', value: 'python'},
+			{text: 'XML', value: 'xml'},
+			{text: 'Golang', value: 'go'},
+			{text: 'Objective-c', value: 'objective-c'},
+		],
+		fontsize_formats: '12px 14px 16px 18px 24px 36px 48px 56px 72px',
+		font_formats: '微软雅黑=Microsoft YaHei,Helvetica Neue,PingFang SC,sans-serif;苹果苹方=PingFang SC,Microsoft YaHei,sans-serif;宋体=simsun,serif;仿宋体=FangSong,serif;黑体=SimHei,sans-serif;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats;知乎配置=BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, WenQuanYi Micro Hei, sans-serif;小米配置=Helvetica Neue,Helvetica,Arial,Microsoft Yahei,Hiragino Sans GB,Heiti SC,WenQuanYi Micro Hei,sans-serif',
+		setup: function(editor) {
+			console.log("ID为: " + editor.id + " 的编辑器即将初始化.");
+		},
+		init_instance_callback : function(editor) {
+			console.log("ID为: " + editor.id + " 的编辑器已初始化完成.");
+		}
+	};
+
+	var editor = {
+		render: function (options) {
+			loadScript();
+			var opts = $.extend({}, settings, options), edit = this.get(opts.elem);
+			if (edit) {
+				edit.destroy();
+			}
+			tinymce.init(opts);
+			return this.get(opts.elem);
+		},
+		// 获取ID对应的编辑器对象
+		get: function (elem) {
+			loadScript();
+			if (elem && /^#|\./.test(elem)) {
+				var id = elem.substr(1);
+				var edit = tinymce.editors[id];
+				return edit;
+			} else {
+				return false;
+			}
+		}
+	}
+	function loadScript() {
+		if (typeof tinymce == 'undefined') {
+			$.ajax({//获取插件
+				url: modPath + '/' + plugin_filename,
+				dataType: 'script',
+				cache: true,
+				async: false,
+			});
+		}
+	}
+	exports(MOD_NAME, editor);
+});
diff --git a/public/static/assets/gougu/module/tinymce/icons/default/icons.min.js b/public/static/assets/gougu/module/tinymce/icons/default/icons.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..2cf9ef86da30d2cf9848bb281e22b6a01531c524
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/icons/default/icons.min.js
@@ -0,0 +1 @@
+tinymce.IconManager.add("default",{icons:{"accessibility-check":'<svg width="24" height="24"><path d="M12 2a2 2 0 012 2 2 2 0 01-2 2 2 2 0 01-2-2c0-1.1.9-2 2-2zm8 7h-5v12c0 .6-.4 1-1 1a1 1 0 01-1-1v-5c0-.6-.4-1-1-1a1 1 0 00-1 1v5c0 .6-.4 1-1 1a1 1 0 01-1-1V9H4a1 1 0 110-2h16c.6 0 1 .4 1 1s-.4 1-1 1z" fill-rule="nonzero"/></svg>',"action-next":'<svg width="24" height="24"><path fill-rule="nonzero" d="M5.7 7.3a1 1 0 00-1.4 1.4l7.7 7.7 7.7-7.7a1 1 0 10-1.4-1.4L12 13.6 5.7 7.3z"/></svg>',"action-prev":'<svg width="24" height="24"><path fill-rule="nonzero" d="M18.3 15.7a1 1 0 001.4-1.4L12 6.6l-7.7 7.7a1 1 0 001.4 1.4L12 9.4l6.3 6.3z"/></svg>',"align-center":'<svg width="24" height="24"><path d="M5 5h14c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 110-2zm3 4h8c.6 0 1 .4 1 1s-.4 1-1 1H8a1 1 0 110-2zm0 8h8c.6 0 1 .4 1 1s-.4 1-1 1H8a1 1 0 010-2zm-3-4h14c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 010-2z" fill-rule="evenodd"/></svg>',"align-justify":'<svg width="24" height="24"><path d="M5 5h14c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 110-2zm0 4h14c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 110-2zm0 4h14c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 010-2zm0 4h14c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 010-2z" fill-rule="evenodd"/></svg>',"align-left":'<svg width="24" height="24"><path d="M5 5h14c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 110-2zm0 4h8c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 110-2zm0 8h8c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 010-2zm0-4h14c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 010-2z" fill-rule="evenodd"/></svg>',"align-none":'<svg width="24" height="24"><path d="M14.2 5L13 7H5a1 1 0 110-2h9.2zm4 0h.8a1 1 0 010 2h-2l1.2-2zm-6.4 4l-1.2 2H5a1 1 0 010-2h6.8zm4 0H19a1 1 0 010 2h-4.4l1.2-2zm-6.4 4l-1.2 2H5a1 1 0 010-2h4.4zm4 0H19a1 1 0 010 2h-6.8l1.2-2zM7 17l-1.2 2H5a1 1 0 010-2h2zm4 0h8a1 1 0 010 2H9.8l1.2-2zm5.2-13.5l1.3.7-9.7 16.3-1.3-.7 9.7-16.3z" fill-rule="evenodd"/></svg>',"align-right":'<svg width="24" height="24"><path d="M5 5h14c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 110-2zm6 4h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 010-2zm0 8h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 010-2zm-6-4h14c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 010-2z" fill-rule="evenodd"/></svg>',"arrow-left":'<svg width="24" height="24"><path d="M5.6 13l12 6a1 1 0 001.4-1V6a1 1 0 00-1.4-.9l-12 6a1 1 0 000 1.8z" fill-rule="evenodd"/></svg>',"arrow-right":'<svg width="24" height="24"><path d="M18.5 13l-12 6A1 1 0 015 18V6a1 1 0 011.4-.9l12 6a1 1 0 010 1.8z" fill-rule="evenodd"/></svg>',bold:'<svg width="24" height="24"><path d="M7.8 19c-.3 0-.5 0-.6-.2l-.2-.5V5.7c0-.2 0-.4.2-.5l.6-.2h5c1.5 0 2.7.3 3.5 1 .7.6 1.1 1.4 1.1 2.5a3 3 0 01-.6 1.9c-.4.6-1 1-1.6 1.2.4.1.9.3 1.3.6s.8.7 1 1.2c.4.4.5 1 .5 1.6 0 1.3-.4 2.3-1.3 3-.8.7-2.1 1-3.8 1H7.8zm5-8.3c.6 0 1.2-.1 1.6-.5.4-.3.6-.7.6-1.3 0-1.1-.8-1.7-2.3-1.7H9.3v3.5h3.4zm.5 6c.7 0 1.3-.1 1.7-.4.4-.4.6-.9.6-1.5s-.2-1-.7-1.4c-.4-.3-1-.4-2-.4H9.4v3.8h4z" fill-rule="evenodd"/></svg>',bookmark:'<svg width="24" height="24"><path d="M6 4v17l6-4 6 4V4c0-.6-.4-1-1-1H7a1 1 0 00-1 1z" fill-rule="nonzero"/></svg>',"border-style":'<svg width="24" height="24"><g fill-rule="evenodd"><rect width="18" height="2" x="3" y="6" rx="1"/><rect width="2.8" height="2" x="3" y="16" rx="1"/><rect width="2.8" height="2" x="6.8" y="16" rx="1"/><rect width="2.8" height="2" x="10.6" y="16" rx="1"/><rect width="2.8" height="2" x="14.4" y="16" rx="1"/><rect width="2.8" height="2" x="18.2" y="16" rx="1"/><rect width="8" height="2" x="3" y="11" rx="1"/><rect width="8" height="2" x="13" y="11" rx="1"/></g></svg>',"border-width":'<svg width="24" height="24"><g fill-rule="evenodd"><rect width="18" height="5" x="3" y="5" rx="1"/><rect width="18" height="3.5" x="3" y="11.5" rx="1"/><rect width="18" height="2" x="3" y="17" rx="1"/></g></svg>',brightness:'<svg width="24" height="24"><path d="M12 17c.3 0 .5.1.7.3.2.2.3.4.3.7v1c0 .3-.1.5-.3.7a1 1 0 01-.7.3 1 1 0 01-.7-.3 1 1 0 01-.3-.7v-1c0-.3.1-.5.3-.7.2-.2.4-.3.7-.3zm0-10a1 1 0 01-.7-.3A1 1 0 0111 6V5c0-.3.1-.5.3-.7.2-.2.4-.3.7-.3.3 0 .5.1.7.3.2.2.3.4.3.7v1c0 .3-.1.5-.3.7a1 1 0 01-.7.3zm7 4c.3 0 .5.1.7.3.2.2.3.4.3.7 0 .3-.1.5-.3.7a1 1 0 01-.7.3h-1a1 1 0 01-.7-.3 1 1 0 01-.3-.7c0-.3.1-.5.3-.7.2-.2.4-.3.7-.3h1zM7 12c0 .3-.1.5-.3.7a1 1 0 01-.7.3H5a1 1 0 01-.7-.3A1 1 0 014 12c0-.3.1-.5.3-.7.2-.2.4-.3.7-.3h1c.3 0 .5.1.7.3.2.2.3.4.3.7zm10 3.5l.7.8c.2.1.3.4.3.6 0 .3-.1.6-.3.8a1 1 0 01-.8.3 1 1 0 01-.6-.3l-.8-.7a1 1 0 01-.3-.8c0-.2.1-.5.3-.7a1 1 0 011.4 0zm-10-7l-.7-.8a1 1 0 01-.3-.6c0-.3.1-.6.3-.8.2-.2.5-.3.8-.3.2 0 .5.1.7.3l.7.7c.2.2.3.5.3.8 0 .2-.1.5-.3.7a1 1 0 01-.7.3 1 1 0 01-.8-.3zm10 0a1 1 0 01-.8.3 1 1 0 01-.7-.3 1 1 0 01-.3-.7c0-.3.1-.6.3-.8l.8-.7c.1-.2.4-.3.6-.3.3 0 .6.1.8.3.2.2.3.5.3.8 0 .2-.1.5-.3.7l-.7.7zm-10 7c.2-.2.5-.3.8-.3.2 0 .5.1.7.3a1 1 0 010 1.4l-.8.8a1 1 0 01-.6.3 1 1 0 01-.8-.3 1 1 0 01-.3-.8c0-.2.1-.5.3-.6l.7-.8zM12 8a4 4 0 013.7 2.4 4 4 0 010 3.2A4 4 0 0112 16a4 4 0 01-3.7-2.4 4 4 0 010-3.2A4 4 0 0112 8zm0 6.5c.7 0 1.3-.2 1.8-.7.5-.5.7-1.1.7-1.8s-.2-1.3-.7-1.8c-.5-.5-1.1-.7-1.8-.7s-1.3.2-1.8.7c-.5.5-.7 1.1-.7 1.8s.2 1.3.7 1.8c.5.5 1.1.7 1.8.7z" fill-rule="evenodd"/></svg>',browse:'<svg width="24" height="24"><path d="M19 4a2 2 0 012 2v12a2 2 0 01-2 2h-4v-2h4V8H5v10h4v2H5a2 2 0 01-2-2V6c0-1.1.9-2 2-2h14zm-8 9.4l-2.3 2.3a1 1 0 11-1.4-1.4l4-4a1 1 0 011.4 0l4 4a1 1 0 01-1.4 1.4L13 13.4V20a1 1 0 01-2 0v-6.6z" fill-rule="nonzero"/></svg>',cancel:'<svg width="24" height="24"><path d="M12 4.6a7.4 7.4 0 110 14.8 7.4 7.4 0 010-14.8zM12 3a9 9 0 100 18 9 9 0 000-18zm0 8L14.8 8l1 1.1-2.7 2.8 2.7 2.7-1.1 1.1-2.7-2.7-2.7 2.7-1-1.1 2.6-2.7-2.7-2.7 1-1.1 2.8 2.7z" fill-rule="nonzero"/></svg>',"cell-background-color":'<svg width="24" height="24"><path d="M15.7 2l1.6 1.6-2.7 2.6 5.9 5.8c.7.7.7 1.7 0 2.4l-6.3 6.1a1.7 1.7 0 01-2.4 0l-6.3-6.1c-.7-.7-.7-1.7 0-2.4L15.7 2zM18 12l-4.5-4L9 12h9zM4 16s2 2.4 2 3.8C6 21 5.1 22 4 22s-2-1-2-2.2C2 18.4 4 16 4 16z"/></svg>',"cell-border-color":'<svg width="24" height="24"><g fill-rule="evenodd"><path fill-rule="nonzero" d="M5 13v5h2v2H5a2 2 0 01-2-2v-5h2zm8-7V4h6a2 2 0 012 2h-8z" opacity=".2"/><path fill-rule="nonzero" d="M13 4v2H5v7H3V6c0-1.1.9-2 2-2h8zm-2.6 14.1l.1-.1.1.1.2.3.2.2.2.2c.4.6.8 1.2.8 1.7 0 .8-.7 1.5-1.5 1.5S9 21.3 9 20.5c0-.5.4-1.1.8-1.7l.2-.2.2-.2.2-.3z"/><path d="M13 11l-2 2H5v-2h6V6h2z"/><path fill-rule="nonzero" d="M18.4 8l1 1-1.8 1.9 4 4c.5.4.5 1.1 0 1.6l-4.3 4.2a1.2 1.2 0 01-1.6 0l-4.4-4.2c-.4-.5-.4-1.2 0-1.7l7-6.8zm1.6 7l-3-3-3 3h6z"/></g></svg>',"change-case":'<svg width="24" height="24"><path d="M18.4 18.2v-.6c-.5.8-1.3 1.2-2.4 1.2-2.2 0-3.3-1.6-3.3-4.8 0-3.1 1-4.7 3.3-4.7 1.1 0 1.8.3 2.4 1.1v-.6c0-.5.4-.8.8-.8s.8.3.8.8v8.4c0 .5-.4.8-.8.8a.8.8 0 01-.8-.8zm-2-7.4c-1.3 0-1.8.9-1.8 3.2 0 2.4.5 3.3 1.7 3.3 1.3 0 1.8-.9 1.8-3.2 0-2.4-.5-3.3-1.7-3.3zM10 15.7H5.5l-.8 2.6a1 1 0 01-1 .7h-.2a.7.7 0 01-.7-1l4-12a1 1 0 012 0l4 12a.7.7 0 01-.8 1h-.2a1 1 0 01-1-.7l-.8-2.6zm-.3-1.5l-2-6.5-1.9 6.5h3.9z" fill-rule="evenodd"/></svg>',"character-count":'<svg width="24" height="24"><path d="M4 11.5h16v1H4v-1zm4.8-6.8V10H7.7V5.8h-1v-1h2zM11 8.3V9h2v1h-3V7.7l2-1v-.9h-2v-1h3v2.4l-2 1zm6.3-3.4V10h-3.1V9h2.1V8h-2.1V6.8h2.1v-1h-2.1v-1h3.1zM5.8 16.4c0-.5.2-.8.5-1 .2-.2.6-.3 1.2-.3l.8.1c.2 0 .4.2.5.3l.4.4v2.8l.2.3H8.2v-.1-.2l-.6.3H7c-.4 0-.7 0-1-.2a1 1 0 01-.3-.9c0-.3 0-.6.3-.8.3-.2.7-.4 1.2-.4l.6-.2h.3v-.2l-.1-.2a.8.8 0 00-.5-.1 1 1 0 00-.4 0l-.3.4h-1zm2.3.8h-.2l-.2.1-.4.1a1 1 0 00-.4.2l-.2.2.1.3.5.1h.4l.4-.4v-.6zm2-3.4h1.2v1.7l.5-.3h.5c.5 0 .9.1 1.2.5.3.4.5.8.5 1.4 0 .6-.2 1.1-.5 1.5-.3.4-.7.6-1.3.6l-.6-.1-.4-.4v.4h-1.1v-5.4zm1.1 3.3c0 .3 0 .6.2.8a.7.7 0 001.2 0l.2-.8c0-.4 0-.6-.2-.8a.7.7 0 00-.6-.3l-.6.3-.2.8zm6.1-.5c0-.2 0-.3-.2-.4a.8.8 0 00-.5-.2c-.3 0-.5.1-.6.3l-.2.9c0 .3 0 .6.2.8.1.2.3.3.6.3.2 0 .4 0 .5-.2l.2-.4h1.1c0 .5-.3.8-.6 1.1a2 2 0 01-1.3.4c-.5 0-1-.2-1.3-.6a2 2 0 01-.5-1.4c0-.6.1-1.1.5-1.5.3-.4.8-.5 1.4-.5.5 0 1 0 1.2.3.4.3.5.7.5 1.2h-1v-.1z" fill-rule="evenodd"/></svg>',"checklist-rtl":'<svg width="24" height="24"><path d="M5 17h8c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 010-2zm0-6h8c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 010-2zm0-6h8c.6 0 1 .4 1 1s-.4 1-1 1H5a1 1 0 110-2zm14.2 11c.2-.4.6-.5.9-.3.3.2.4.6.2 1L18 20c-.2.3-.7.4-1 0l-1.3-1.3a.7.7 0 010-1c.3-.2.7-.2 1 0l.7.9 1.7-2.8zm0-6c.2-.4.6-.5.9-.3.3.2.4.6.2 1L18 14c-.2.3-.7.4-1 0l-1.3-1.3a.7.7 0 010-1c.3-.2.7-.2 1 0l.7.9 1.7-2.8zm0-6c.2-.4.6-.5.9-.3.3.2.4.6.2 1L18 8c-.2.3-.7.4-1 0l-1.3-1.3a.7.7 0 010-1c.3-.2.7-.2 1 0l.7.9 1.7-2.8z" fill-rule="evenodd"/></svg>',checklist:'<svg width="24" height="24"><path d="M11 17h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 010-2zm0-6h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 010-2zm0-6h8a1 1 0 010 2h-8a1 1 0 010-2zM7.2 16c.2-.4.6-.5.9-.3.3.2.4.6.2 1L6 20c-.2.3-.7.4-1 0l-1.3-1.3a.7.7 0 010-1c.3-.2.7-.2 1 0l.7.9 1.7-2.8zm0-6c.2-.4.6-.5.9-.3.3.2.4.6.2 1L6 14c-.2.3-.7.4-1 0l-1.3-1.3a.7.7 0 010-1c.3-.2.7-.2 1 0l.7.9 1.7-2.8zm0-6c.2-.4.6-.5.9-.3.3.2.4.6.2 1L6 8c-.2.3-.7.4-1 0L3.8 6.9a.7.7 0 010-1c.3-.2.7-.2 1 0l.7.9 1.7-2.8z" fill-rule="evenodd"/></svg>',checkmark:'<svg width="24" height="24"><path d="M18.2 5.4a1 1 0 011.6 1.2l-8 12a1 1 0 01-1.5.1l-5-5a1 1 0 111.4-1.4l4.1 4.1 7.4-11z" fill-rule="nonzero"/></svg>',"chevron-down":'<svg width="10" height="10"><path d="M8.7 2.2c.3-.3.8-.3 1 0 .4.4.4.9 0 1.2L5.7 7.8c-.3.3-.9.3-1.2 0L.2 3.4a.8.8 0 010-1.2c.3-.3.8-.3 1.1 0L5 6l3.7-3.8z" fill-rule="nonzero"/></svg>',"chevron-left":'<svg width="10" height="10"><path d="M7.8 1.3L4 5l3.8 3.7c.3.3.3.8 0 1-.4.4-.9.4-1.2 0L2.2 5.7a.8.8 0 010-1.2L6.6.2C7 0 7.4 0 7.8.2c.3.3.3.8 0 1.1z" fill-rule="nonzero"/></svg>',"chevron-right":'<svg width="10" height="10"><path d="M2.2 1.3a.8.8 0 010-1c.4-.4.9-.4 1.2 0l4.4 4.1c.3.4.3.9 0 1.2L3.4 9.8c-.3.3-.8.3-1.2 0a.8.8 0 010-1.1L6 5 2.2 1.3z" fill-rule="nonzero"/></svg>',"chevron-up":'<svg width="10" height="10"><path d="M8.7 7.8L5 4 1.3 7.8c-.3.3-.8.3-1 0a.8.8 0 010-1.2l4.1-4.4c.3-.3.9-.3 1.2 0l4.2 4.4c.3.3.3.9 0 1.2-.3.3-.8.3-1.1 0z" fill-rule="nonzero"/></svg>',close:'<svg width="24" height="24"><path d="M17.3 8.2L13.4 12l3.9 3.8a1 1 0 01-1.5 1.5L12 13.4l-3.8 3.9a1 1 0 01-1.5-1.5l3.9-3.8-3.9-3.8a1 1 0 011.5-1.5l3.8 3.9 3.8-3.9a1 1 0 011.5 1.5z" fill-rule="evenodd"/></svg>',"code-sample":'<svg width="24" height="26"><path d="M7.1 11a2.8 2.8 0 01-.8 2 2.8 2.8 0 01.8 2v1.7c0 .3.1.6.4.8.2.3.5.4.8.4.3 0 .4.2.4.4v.8c0 .2-.1.4-.4.4-.7 0-1.4-.3-2-.8-.5-.6-.8-1.3-.8-2V15c0-.3-.1-.6-.4-.8-.2-.3-.5-.4-.8-.4a.4.4 0 01-.4-.4v-.8c0-.2.2-.4.4-.4.3 0 .6-.1.8-.4.3-.2.4-.5.4-.8V9.3c0-.7.3-1.4.8-2 .6-.5 1.3-.8 2-.8.3 0 .4.2.4.4v.8c0 .2-.1.4-.4.4-.3 0-.6.1-.8.4-.3.2-.4.5-.4.8V11zm9.8 0V9.3c0-.3-.1-.6-.4-.8-.2-.3-.5-.4-.8-.4a.4.4 0 01-.4-.4V7c0-.2.1-.4.4-.4.7 0 1.4.3 2 .8.5.6.8 1.3.8 2V11c0 .3.1.6.4.8.2.3.5.4.8.4.2 0 .4.2.4.4v.8c0 .2-.2.4-.4.4-.3 0-.6.1-.8.4-.3.2-.4.5-.4.8v1.7c0 .7-.3 1.4-.8 2-.6.5-1.3.8-2 .8a.4.4 0 01-.4-.4v-.8c0-.2.1-.4.4-.4.3 0 .6-.1.8-.4.3-.2.4-.5.4-.8V15a2.8 2.8 0 01.8-2 2.8 2.8 0 01-.8-2zm-3.3-.4c0 .4-.1.8-.5 1.1-.3.3-.7.5-1.1.5-.4 0-.8-.2-1.1-.5-.4-.3-.5-.7-.5-1.1 0-.5.1-.9.5-1.2.3-.3.7-.4 1.1-.4.4 0 .8.1 1.1.4.4.3.5.7.5 1.2zM12 13c.4 0 .8.1 1.1.5.4.3.5.7.5 1.1 0 1-.1 1.6-.5 2a3 3 0 01-1.1 1c-.4.3-.8.4-1.1.4a.5.5 0 01-.5-.5V17a3 3 0 001-.2l.6-.6c-.6 0-1-.2-1.3-.5-.2-.3-.3-.7-.3-1 0-.5.1-1 .5-1.2.3-.4.7-.5 1.1-.5z" fill-rule="evenodd"/></svg>',"color-levels":'<svg width="24" height="24"><path d="M17.5 11.4A9 9 0 0118 14c0 .5 0 1-.2 1.4 0 .4-.3.9-.5 1.3a6.2 6.2 0 01-3.7 3 5.7 5.7 0 01-3.2 0A5.9 5.9 0 017.6 18a6.2 6.2 0 01-1.4-2.6 6.7 6.7 0 010-2.8c0-.4.1-.9.3-1.3a13.6 13.6 0 012.3-4A20 20 0 0112 4a26.4 26.4 0 013.2 3.4 18.2 18.2 0 012.3 4zm-2 4.5c.4-.7.5-1.4.5-2a7.3 7.3 0 00-1-3.2c.2.6.2 1.2.2 1.9a4.5 4.5 0 01-1.3 3 5.3 5.3 0 01-2.3 1.5 4.9 4.9 0 01-2 .1 4.3 4.3 0 002.4.8 4 4 0 002-.6 4 4 0 001.5-1.5z" fill-rule="evenodd"/></svg>',"color-picker":'<svg width="24" height="24"><path d="M12 3a9 9 0 000 18 1.5 1.5 0 001.1-2.5c-.2-.3-.4-.6-.4-1 0-.8.7-1.5 1.5-1.5H16a5 5 0 005-5c0-4.4-4-8-9-8zm-5.5 9a1.5 1.5 0 110-3 1.5 1.5 0 010 3zm3-4a1.5 1.5 0 110-3 1.5 1.5 0 010 3zm5 0a1.5 1.5 0 110-3 1.5 1.5 0 010 3zm3 4a1.5 1.5 0 110-3 1.5 1.5 0 010 3z" fill-rule="nonzero"/></svg>',"color-swatch-remove-color":'<svg width="24" height="24"><path stroke="#000" stroke-width="2" d="M21 3L3 21" fill-rule="evenodd"/></svg>',"color-swatch":'<svg width="24" height="24"><rect x="3" y="3" width="18" height="18" rx="1" fill-rule="evenodd"/></svg>',"comment-add":'<svg width="24" height="24"><g fill-rule="nonzero"><path d="M9 19l3-2h7c.6 0 1-.4 1-1V6c0-.6-.4-1-1-1H5a1 1 0 00-1 1v10c0 .6.4 1 1 1h4v2zm-2 4v-4H5a3 3 0 01-3-3V6a3 3 0 013-3h14a3 3 0 013 3v10a3 3 0 01-3 3h-6.4L7 23z"/><path d="M13 10h2a1 1 0 010 2h-2v2a1 1 0 01-2 0v-2H9a1 1 0 010-2h2V8a1 1 0 012 0v2z"/></g></svg>',comment:'<svg width="24" height="24"><path fill-rule="nonzero" d="M9 19l3-2h7c.6 0 1-.4 1-1V6c0-.6-.4-1-1-1H5a1 1 0 00-1 1v10c0 .6.4 1 1 1h4v2zm-2 4v-4H5a3 3 0 01-3-3V6a3 3 0 013-3h14a3 3 0 013 3v10a3 3 0 01-3 3h-6.4L7 23z"/></svg>',contrast:'<svg width="24" height="24"><path d="M12 4a7.8 7.8 0 015.7 2.3A8 8 0 1112 4zm-6 8a6 6 0 006 6V6a6 6 0 00-6 6z" fill-rule="evenodd"/></svg>',copy:'<svg width="24" height="24"><path d="M16 3H6a2 2 0 00-2 2v11h2V5h10V3zm1 4a2 2 0 012 2v10a2 2 0 01-2 2h-7a2 2 0 01-2-2V9c0-1.2.9-2 2-2h7zm0 12V9h-7v10h7z" fill-rule="nonzero"/></svg>',crop:'<svg width="24" height="24"><path d="M17 8v7h2c.6 0 1 .4 1 1s-.4 1-1 1h-2v2c0 .6-.4 1-1 1a1 1 0 01-1-1v-2H7V9H5a1 1 0 110-2h2V5c0-.6.4-1 1-1s1 .4 1 1v2h7l3-3 1 1-3 3zM9 9v5l5-5H9zm1 6h5v-5l-5 5z" fill-rule="evenodd"/></svg>',"cut-column":'<svg width="24" height="24"><path fill-rule="evenodd" d="M7.2 4.5c.9 0 1.6.4 2.2 1A3.7 3.7 0 0110.5 8v.5l1 1 4-4 1-.5a3.3 3.3 0 012 0c.4 0 .7.3 1 .5L17 8h4v13h-6V10l-1.5 1.5.5.5v4l-2.5-2.5-1 1v.5c0 .4 0 .8-.3 1.2-.2.5-.4.9-.8 1.2-.6.7-1.3 1-2.2 1-.8.2-1.5 0-2-.6l-.5-.8-.2-1c0-.4 0-.8.3-1.2A3.9 3.9 0 017 12.7c.5-.2 1-.3 1.5-.2l1-1-1-1c-.5 0-1 0-1.5-.2-.5-.1-1-.4-1.4-.9-.4-.3-.6-.7-.8-1.2L4.5 7c0-.4 0-.7.2-1 0-.3.3-.6.5-.8.5-.5 1.2-.8 2-.7zm12.3 5h-3v10h3v-10zM8 13.8h-.3l-.4.2a2.8 2.8 0 00-.7.4v.1a2.8 2.8 0 00-.6.8l-.1.4v.7l.2.5.5.2h.7a2.6 2.6 0 00.8-.3 2.4 2.4 0 00.7-.7 2.5 2.5 0 00.3-.8 1.5 1.5 0 000-.8 1 1 0 00-.2-.4 1 1 0 00-.5-.2H8zm3.5-3.7c-.4 0-.7.1-1 .4-.3.3-.4.6-.4 1s.1.7.4 1c.3.3.6.4 1 .4s.7-.1 1-.4c.3-.3.4-.6.4-1s-.1-.7-.4-1c-.3-.3-.6-.4-1-.4zM7 5.8h-.4a1 1 0 00-.5.3 1 1 0 00-.2.5v.7a2.5 2.5 0 00.3.8l.2.3h.1l.4.4.4.2.4.1h.7L9 9l.2-.4a1.6 1.6 0 000-.8 2.6 2.6 0 00-.3-.8A2.5 2.5 0 007.7 6l-.4-.1H7z"/></svg>',"cut-row":'<svg width="24" height="24"><path fill-rule="evenodd" d="M22 3v5H9l3 3 2-2h4l-4 4 1 1h.5c.4 0 .8 0 1.2.3.5.2.9.4 1.2.8.7.6 1 1.3 1 2.2.2.8 0 1.5-.6 2l-.8.5-1 .2c-.4 0-.8 0-1.2-.3a3.9 3.9 0 01-2.1-2.2c-.2-.5-.3-1-.2-1.5l-1-1-1 1c0 .5 0 1-.2 1.5-.1.5-.4 1-.9 1.4-.3.4-.7.6-1.2.8l-1.2.3c-.4 0-.7 0-1-.2-.3 0-.6-.3-.8-.5-.5-.5-.8-1.2-.7-2 0-.9.4-1.6 1-2.2A3.7 3.7 0 018.6 14H9l1-1-4-4-.5-1a3.3 3.3 0 010-2c0-.4.3-.7.5-1l2 2V3h14zM8.5 15.3h-.3a2.6 2.6 0 00-.8.4 2.5 2.5 0 00-.9 1.1l-.1.4v.7l.2.5.5.2h.7a2.5 2.5 0 00.8-.3L9 18V18l.4-.4.2-.4.1-.4v-.3-.4a1 1 0 00-.2-.5 1 1 0 00-.4-.2h-.5zm7 0H15a1 1 0 00-.4.3 1 1 0 00-.2.5 1.5 1.5 0 000 .7v.4a2.8 2.8 0 00.5.7h.1a2.8 2.8 0 00.8.6l.4.1h.7l.5-.2.2-.5v-.4-.3a2.6 2.6 0 00-.3-.8 2.4 2.4 0 00-.7-.7 2.5 2.5 0 00-.8-.3h-.3zM12 11.6c-.4 0-.7.1-1 .4-.3.3-.4.6-.4 1s.1.7.4 1c.3.3.6.4 1 .4s.7-.1 1-.4c.3-.3.4-.6.4-1s-.1-.7-.4-1c-.3-.3-.6-.4-1-.4zm8.5-7.1h-11v2h11v-2z"/></svg>',cut:'<svg width="24" height="24"><path d="M18 15c.6.7 1 1.4 1 2.3 0 .8-.2 1.5-.7 2l-.8.5-1 .2c-.4 0-.8 0-1.2-.3a3.9 3.9 0 01-2.1-2.2c-.2-.5-.3-1-.2-1.5l-1-1-1 1c0 .5 0 1-.2 1.5-.1.5-.4 1-.9 1.4-.3.4-.7.6-1.2.8l-1.2.3c-.4 0-.7 0-1-.2-.3 0-.6-.3-.8-.5-.5-.5-.8-1.2-.7-2 0-.9.4-1.6 1-2.2A3.7 3.7 0 018.6 14H9l1-1-4-4-.5-1a3.3 3.3 0 010-2c0-.4.3-.7.5-1l6 6 6-6 .5 1a3.3 3.3 0 010 2c0 .4-.3.7-.5 1l-4 4 1 1h.5c.4 0 .8 0 1.2.3.5.2.9.4 1.2.8zm-8.5 2.2l.1-.4v-.3-.4a1 1 0 00-.2-.5 1 1 0 00-.4-.2 1.6 1.6 0 00-.8 0 2.6 2.6 0 00-.8.3 2.5 2.5 0 00-.9 1.1l-.1.4v.7l.2.5.5.2h.7a2.5 2.5 0 00.8-.3 2.8 2.8 0 001-1zm2.5-2.8c.4 0 .7-.1 1-.4.3-.3.4-.6.4-1s-.1-.7-.4-1c-.3-.3-.6-.4-1-.4s-.7.1-1 .4c-.3.3-.4.6-.4 1s.1.7.4 1c.3.3.6.4 1 .4zm5.4 4l.2-.5v-.4-.3a2.6 2.6 0 00-.3-.8 2.4 2.4 0 00-.7-.7 2.5 2.5 0 00-.8-.3 1.5 1.5 0 00-.8 0 1 1 0 00-.4.2 1 1 0 00-.2.5 1.5 1.5 0 000 .7v.4l.3.4.3.4a2.8 2.8 0 00.8.5l.4.1h.7l.5-.2z" fill-rule="evenodd"/></svg>',"document-properties":'<svg width="24" height="24"><path d="M14.4 3H7a2 2 0 00-2 2v14c0 1.1.9 2 2 2h10a2 2 0 002-2V7.6L14.4 3zM17 19H7V5h6v4h4v10z" fill-rule="nonzero"/></svg>',drag:'<svg width="24" height="24"><path d="M13 5h2v2h-2V5zm0 4h2v2h-2V9zM9 9h2v2H9V9zm4 4h2v2h-2v-2zm-4 0h2v2H9v-2zm0 4h2v2H9v-2zm4 0h2v2h-2v-2zM9 5h2v2H9V5z" fill-rule="evenodd"/></svg>',"duplicate-column":'<svg width="24" height="24"><path d="M17 6v16h-7V6h7zm-2 2h-3v12h3V8zm-2-6v2H8v15H6V2h7z"/></svg>',"duplicate-row":'<svg width="24" height="24"><path d="M22 11v7H6v-7h16zm-2 2H8v3h12v-3zm-1-6v2H4v5H2V7h17z"/></svg>',duplicate:'<svg width="24" height="24"><g fill-rule="nonzero"><path d="M16 3v2H6v11H4V5c0-1.1.9-2 2-2h10zm3 8h-2V9h-7v10h9a2 2 0 01-2 2h-7a2 2 0 01-2-2V9c0-1.2.9-2 2-2h7a2 2 0 012 2v2z"/><path d="M17 14h1a1 1 0 010 2h-1v1a1 1 0 01-2 0v-1h-1a1 1 0 010-2h1v-1a1 1 0 012 0v1z"/></g></svg>',"edit-block":'<svg width="24" height="24"><path fill-rule="nonzero" d="M19.8 8.8l-9.4 9.4c-.2.2-.5.4-.9.4l-5.4 1.2 1.2-5.4.5-.8 9.4-9.4c.7-.7 1.8-.7 2.5 0l2.1 2.1c.7.7.7 1.8 0 2.5zm-2-.2l1-.9v-.3l-2.2-2.2a.3.3 0 00-.3 0l-1 1L18 8.5zm-1 1l-2.5-2.4-6 6 2.5 2.5 6-6zm-7 7.1l-2.6-2.4-.3.3-.1.2-.7 3 3.1-.6h.1l.4-.5z"/></svg>',"edit-image":'<svg width="24" height="24"><path d="M18 16h2V7a2 2 0 00-2-2H7v2h11v9zM6 17h15a1 1 0 010 2h-1v1a1 1 0 01-2 0v-1H6a2 2 0 01-2-2V7H3a1 1 0 110-2h1V4a1 1 0 112 0v13zm3-5.3l1.3 2 3-4.7 3.7 6H7l2-3.3z" fill-rule="nonzero"/></svg>',"embed-page":'<svg width="24" height="24"><path d="M19 6V5H5v14h2A13 13 0 0119 6zm0 1.4c-.8.8-1.6 2.4-2.2 4.6H19V7.4zm0 5.6h-2.4c-.4 1.8-.6 3.8-.6 6h3v-6zm-4 6c0-2.2.2-4.2.6-6H13c-.7 1.8-1.1 3.8-1.1 6h3zm-4 0c0-2.2.4-4.2 1-6H9.6A12 12 0 008 19h3zM4 3h16c.6 0 1 .4 1 1v16c0 .6-.4 1-1 1H4a1 1 0 01-1-1V4c0-.6.4-1 1-1zm11.8 9c.4-1.9 1-3.4 1.8-4.5a9.2 9.2 0 00-4 4.5h2.2zm-3.4 0a12 12 0 012.8-4 12 12 0 00-5 4h2.2z" fill-rule="nonzero"/></svg>',embed:'<svg width="24" height="24"><path d="M4 3h16c.6 0 1 .4 1 1v16c0 .6-.4 1-1 1H4a1 1 0 01-1-1V4c0-.6.4-1 1-1zm1 2v14h14V5H5zm4.8 2.6l5.6 4a.5.5 0 010 .8l-5.6 4A.5.5 0 019 16V8a.5.5 0 01.8-.4z" fill-rule="nonzero"/></svg>',emoji:'<svg width="24" height="24"><path d="M9 11c.6 0 1-.4 1-1s-.4-1-1-1a1 1 0 00-1 1c0 .6.4 1 1 1zm6 0c.6 0 1-.4 1-1s-.4-1-1-1a1 1 0 00-1 1c0 .6.4 1 1 1zm-3 5.5c2.1 0 4-1.5 4.4-3.5H7.6c.5 2 2.3 3.5 4.4 3.5zM12 4a8 8 0 100 16 8 8 0 000-16zm0 14.5a6.5 6.5 0 110-13 6.5 6.5 0 010 13z" fill-rule="nonzero"/></svg>',export:'<svg width="24" height="24"><g fill-rule="nonzero"><path d="M14.4 3L18 7v1h-5V5H7v14h9a1 1 0 012 0c0 1-.8 2-1.9 2H7c-1 0-2-.8-2-1.9V5c0-1 .8-2 1.9-2h7.5z"/><path d="M18.1 12c.5 0 .9.4.9 1 0 .5-.3 1-.8 1h-7.3c-.5 0-.9-.4-.9-1 0-.5.3-1 .8-1h7.3z"/><path d="M16.4 9.2a1 1 0 011.4.2l2.4 3.6-2.4 3.6a1 1 0 01-1.7-1v-.2l1.7-2.4-1.6-2.4a1 1 0 01.2-1.4z"/></g></svg>',fill:'<svg width="24" height="26"><path d="M16.6 12l-9-9-1.4 1.4 2.4 2.4-5.2 5.1c-.5.6-.5 1.6 0 2.2L9 19.6a1.5 1.5 0 002.2 0l5.5-5.5c.5-.6.5-1.6 0-2.2zM5.2 13L10 8.2l4.8 4.8H5.2zM19 14.5s-2 2.2-2 3.5c0 1.1.9 2 2 2a2 2 0 002-2c0-1.3-2-3.5-2-3.5z" fill-rule="nonzero"/></svg>',"flip-horizontally":'<svg width="24" height="24"><path d="M14 19h2v-2h-2v2zm4-8h2V9h-2v2zM4 7v10c0 1.1.9 2 2 2h3v-2H6V7h3V5H6a2 2 0 00-2 2zm14-2v2h2a2 2 0 00-2-2zm-7 16h2V3h-2v18zm7-6h2v-2h-2v2zm-4-8h2V5h-2v2zm4 12a2 2 0 002-2h-2v2z" fill-rule="nonzero"/></svg>',"flip-vertically":'<svg width="24" height="24"><path d="M5 14v2h2v-2H5zm8 4v2h2v-2h-2zm4-14H7a2 2 0 00-2 2v3h2V6h10v3h2V6a2 2 0 00-2-2zm2 14h-2v2a2 2 0 002-2zM3 11v2h18v-2H3zm6 7v2h2v-2H9zm8-4v2h2v-2h-2zM5 18c0 1.1.9 2 2 2v-2H5z" fill-rule="nonzero"/></svg>',"format-painter":'<svg width="24" height="24"><path d="M18 5V4c0-.5-.4-1-1-1H5a1 1 0 00-1 1v4c0 .6.5 1 1 1h12c.6 0 1-.4 1-1V7h1v4H9v9c0 .6.4 1 1 1h2c.6 0 1-.4 1-1v-7h8V5h-3z" fill-rule="nonzero"/></svg>',format:'<svg width="24" height="24"><path fill-rule="evenodd" d="M17 5a1 1 0 010 2h-4v11a1 1 0 01-2 0V7H7a1 1 0 110-2h10z"/></svg>',fullscreen:'<svg width="24" height="24"><path d="M15.3 10l-1.2-1.3 2.9-3h-2.3a.9.9 0 110-1.7H19c.5 0 .9.4.9.9v4.4a.9.9 0 11-1.8 0V7l-2.9 3zm0 4l3 3v-2.3a.9.9 0 111.7 0V19c0 .5-.4.9-.9.9h-4.4a.9.9 0 110-1.8H17l-3-2.9 1.3-1.2zM10 15.4l-2.9 3h2.3a.9.9 0 110 1.7H5a.9.9 0 01-.9-.9v-4.4a.9.9 0 111.8 0V17l2.9-3 1.2 1.3zM8.7 10L5.7 7v2.3a.9.9 0 01-1.7 0V5c0-.5.4-.9.9-.9h4.4a.9.9 0 010 1.8H7l3 2.9-1.3 1.2z" fill-rule="nonzero"/></svg>',gallery:'<svg width="24" height="24"><path fill-rule="nonzero" d="M5 15.7l2.3-2.2c.3-.3.7-.3 1 0L11 16l5.1-5c.3-.4.8-.4 1 0l2 1.9V8H5v7.7zM5 18V19h3l1.8-1.9-2-2L5 17.9zm14-3l-2.5-2.4-6.4 6.5H19v-4zM4 6h16c.6 0 1 .4 1 1v13c0 .6-.4 1-1 1H4a1 1 0 01-1-1V7c0-.6.4-1 1-1zm6 7a2 2 0 110-4 2 2 0 010 4zM4.5 4h15a.5.5 0 110 1h-15a.5.5 0 010-1zm2-2h11a.5.5 0 110 1h-11a.5.5 0 010-1z"/></svg>',gamma:'<svg width="24" height="24"><path d="M4 3h16c.6 0 1 .4 1 1v16c0 .6-.4 1-1 1H4a1 1 0 01-1-1V4c0-.6.4-1 1-1zm1 2v14h14V5H5zm6.5 11.8V14L9.2 8.7a5.1 5.1 0 00-.4-.8l-.1-.2H8 8v-1l.3-.1.3-.1h.7a1 1 0 01.6.5l.1.3a8.5 8.5 0 01.3.6l1.9 4.6 2-5.2a1 1 0 011-.6.5.5 0 01.5.6L13 14v2.8a.7.7 0 01-1.4 0z" fill-rule="nonzero"/></svg>',help:'<svg width="24" height="24"><g fill-rule="evenodd"><path d="M12 5.5a6.5 6.5 0 00-6 9 6.3 6.3 0 001.4 2l1 1a6.3 6.3 0 003.6 1 6.5 6.5 0 006-9 6.3 6.3 0 00-1.4-2l-1-1a6.3 6.3 0 00-3.6-1zM12 4a7.8 7.8 0 015.7 2.3A8 8 0 1112 4z"/><path d="M9.6 9.7a.7.7 0 01-.7-.8c0-1.1 1.5-1.8 3.2-1.8 1.8 0 3.2.8 3.2 2.4 0 1.4-.4 2.1-1.5 2.8-.2 0-.3.1-.3.2a2 2 0 00-.8.8.8.8 0 01-1.4-.6c.3-.7.8-1 1.3-1.5l.4-.2c.7-.4.8-.6.8-1.5 0-.5-.6-.9-1.7-.9-.5 0-1 .1-1.4.3-.2 0-.3.1-.3.2v-.2c0 .4-.4.8-.8.8z" fill-rule="nonzero"/><circle cx="12" cy="16" r="1"/></g></svg>',"highlight-bg-color":'<svg width="24" height="24"><g fill-rule="evenodd"><path id="tox-icon-highlight-bg-color__color" d="M3 18h18v3H3z"/><path fill-rule="nonzero" d="M7.7 16.7H3l3.3-3.3-.7-.8L10.2 8l4 4.1-4 4.2c-.2.2-.6.2-.8 0l-.6-.7-1.1 1.1zm5-7.5L11 7.4l3-2.9a2 2 0 012.6 0L18 6c.7.7.7 2 0 2.7l-2.9 2.9-1.8-1.8-.5-.6"/></g></svg>',home:'<svg width="24" height="24"><path fill-rule="nonzero" d="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z"/></svg>',"horizontal-rule":'<svg width="24" height="24"><path d="M4 11h16v2H4z" fill-rule="evenodd"/></svg>',"image-options":'<svg width="24" height="24"><path d="M6 10a2 2 0 00-2 2c0 1.1.9 2 2 2a2 2 0 002-2 2 2 0 00-2-2zm12 0a2 2 0 00-2 2c0 1.1.9 2 2 2a2 2 0 002-2 2 2 0 00-2-2zm-6 0a2 2 0 00-2 2c0 1.1.9 2 2 2a2 2 0 002-2 2 2 0 00-2-2z" fill-rule="nonzero"/></svg>',image:'<svg width="24" height="24"><path d="M5 15.7l3.3-3.2c.3-.3.7-.3 1 0L12 15l4.1-4c.3-.4.8-.4 1 0l2 1.9V5H5v10.7zM5 18V19h3l2.8-2.9-2-2L5 17.9zm14-3l-2.5-2.4-6.4 6.5H19v-4zM4 3h16c.6 0 1 .4 1 1v16c0 .6-.4 1-1 1H4a1 1 0 01-1-1V4c0-.6.4-1 1-1zm6 8a2 2 0 100-4 2 2 0 000 4z" fill-rule="nonzero"/></svg>',indent:'<svg width="24" height="24"><path d="M7 5h12c.6 0 1 .4 1 1s-.4 1-1 1H7a1 1 0 110-2zm5 4h7c.6 0 1 .4 1 1s-.4 1-1 1h-7a1 1 0 010-2zm0 4h7c.6 0 1 .4 1 1s-.4 1-1 1h-7a1 1 0 010-2zm-5 4h12a1 1 0 010 2H7a1 1 0 010-2zm-2.6-3.8L6.2 12l-1.8-1.2a1 1 0 011.2-1.6l3 2a1 1 0 010 1.6l-3 2a1 1 0 11-1.2-1.6z" fill-rule="evenodd"/></svg>',info:'<svg width="24" height="24"><path d="M12 4a7.8 7.8 0 015.7 2.3A8 8 0 1112 4zm-1 3v2h2V7h-2zm3 10v-1h-1v-5h-3v1h1v4h-1v1h4z" fill-rule="evenodd"/></svg>',"insert-character":'<svg width="24" height="24"><path d="M15 18h4l1-2v4h-6v-3.3l1.4-1a6 6 0 001.8-2.9 6.3 6.3 0 00-.1-4.1 5.8 5.8 0 00-3-3.2c-.6-.3-1.3-.5-2.1-.5a5.1 5.1 0 00-3.9 1.8 6.3 6.3 0 00-1.3 6 6.2 6.2 0 001.8 3l1.4.9V20H4v-4l1 2h4v-.5l-2-1L5.4 15A6.5 6.5 0 014 11c0-1 .2-1.9.6-2.7A7 7 0 016.3 6C7.1 5.4 8 5 9 4.5c1-.3 2-.5 3.1-.5a8.8 8.8 0 015.7 2 7 7 0 011.7 2.3 6 6 0 01.2 4.8c-.2.7-.6 1.3-1 1.9a7.6 7.6 0 01-3.6 2.5v.5z" fill-rule="evenodd"/></svg>',"insert-time":'<svg width="24" height="24"><g fill-rule="nonzero"><path d="M12 19a7 7 0 100-14 7 7 0 000 14zm0 2a9 9 0 110-18 9 9 0 010 18z"/><path d="M16 12h-3V7c0-.6-.4-1-1-1a1 1 0 00-1 1v7h5c.6 0 1-.4 1-1s-.4-1-1-1z"/></g></svg>',invert:'<svg width="24" height="24"><path d="M18 19.3L16.5 18a5.8 5.8 0 01-3.1 1.9 6.1 6.1 0 01-5.5-1.6A5.8 5.8 0 016 14v-.3l.1-1.2A13.9 13.9 0 017.7 9l-3-3 .7-.8 2.8 2.9 9 8.9 1.5 1.6-.7.6zm0-5.5v.3l-.1 1.1-.4 1-1.2-1.2a4.3 4.3 0 00.2-1v-.2c0-.4 0-.8-.2-1.3l-.5-1.4a14.8 14.8 0 00-3-4.2L12 6a26.1 26.1 0 00-2.2 2.5l-1-1a20.9 20.9 0 012.9-3.3L12 4l1 .8a22.2 22.2 0 014 5.4c.6 1.2 1 2.4 1 3.6z" fill-rule="evenodd"/></svg>',italic:'<svg width="24" height="24"><path d="M16.7 4.7l-.1.9h-.3c-.6 0-1 0-1.4.3-.3.3-.4.6-.5 1.1l-2.1 9.8v.6c0 .5.4.8 1.4.8h.2l-.2.8H8l.2-.8h.2c1.1 0 1.8-.5 2-1.5l2-9.8.1-.5c0-.6-.4-.8-1.4-.8h-.3l.2-.9h5.8z" fill-rule="evenodd"/></svg>',language:'<svg width="24" height="24"><path d="M12 3a9 9 0 110 18 9 9 0 010-18zm4.3 13.3c-.5 1-1.2 2-2 2.9a7.5 7.5 0 003.2-2.1l-.2-.2a6 6 0 00-1-.6zm-8.6 0c-.5.2-.9.5-1.2.8.9 1 2 1.7 3.2 2a10 10 0 01-2-2.8zm3.6-.8c-.8 0-1.6.1-2.2.3.5 1 1.2 1.9 2.1 2.7zm1.5 0v3c.9-.8 1.6-1.7 2.1-2.7-.6-.2-1.4-.3-2.1-.3zm-6-2.7H4.5c.2 1 .5 2.1 1 3h.3l1.3-1a10 10 0 01-.3-2zm12.7 0h-2.3c0 .7-.1 1.4-.3 2l1.6 1.1c.5-1 .9-2 1-3.1zm-3.8 0h-3V14c1 0 2 .1 2.7.4.2-.5.3-1 .3-1.6zm-4.4 0h-3l.3 1.6c.8-.3 1.7-.4 2.7-.4v-1.3zm-5.5-5c-.7 1-1.1 2.2-1.3 3.5h2.3c0-1 .2-1.8.5-2.6l-1.5-1zm2.9 1.4v.1c-.2.6-.4 1.3-.4 2h3V9.4c-1 0-1.8-.1-2.6-.3zm6.6 0h-.1l-2.4.3v1.8h3l-.5-2.1zm3-1.4l-.3.1-1.3.8c.3.8.5 1.6.5 2.6h2.3a7.5 7.5 0 00-1.3-3.5zm-9 0l2 .2V5.5a9 9 0 00-2 2.2zm3.5-2.3V8c.6 0 1.3 0 1.9-.2a9 9 0 00-2-2.3zm-3-.7h-.1c-1.1.4-2.1 1-3 1.8l1.2.7a10 10 0 011.9-2.5zm4.4 0l.1.1a10 10 0 011.8 2.4l1.1-.7a7.5 7.5 0 00-3-1.8z"/></svg>',"line-height":'<svg width="24" height="24"><path d="M21 5a1 1 0 01.1 2H13a1 1 0 01-.1-2H21zm0 4a1 1 0 01.1 2H13a1 1 0 01-.1-2H21zm0 4a1 1 0 01.1 2H13a1 1 0 01-.1-2H21zm0 4a1 1 0 01.1 2H13a1 1 0 01-.1-2H21zM7 3.6l3.7 3.7a1 1 0 01-1.3 1.5h-.1L8 7.3v9.2l1.3-1.3a1 1 0 011.3 0h.1c.4.4.4 1 0 1.3v.1L7 20.4l-3.7-3.7a1 1 0 011.3-1.5h.1L6 16.7V7.4L4.7 8.7a1 1 0 01-1.3 0h-.1a1 1 0 010-1.3v-.1L7 3.6z"/></svg>',line:'<svg width="24" height="24"><path d="M15 9l-8 8H4v-3l8-8 3 3zm1-1l-3-3 1-1h1c-.2 0 0 0 0 0l2 2s0 .2 0 0v1l-1 1zM4 18h16v2H4v-2z" fill-rule="evenodd"/></svg>',link:'<svg width="24" height="24"><path d="M6.2 12.3a1 1 0 011.4 1.4l-2.1 2a2 2 0 102.7 2.8l4.8-4.8a1 1 0 000-1.4 1 1 0 111.4-1.3 2.9 2.9 0 010 4L9.6 20a3.9 3.9 0 01-5.5-5.5l2-2zm11.6-.6a1 1 0 01-1.4-1.4l2-2a2 2 0 10-2.6-2.8L11 10.3a1 1 0 000 1.4A1 1 0 119.6 13a2.9 2.9 0 010-4L14.4 4a3.9 3.9 0 015.5 5.5l-2 2z" fill-rule="nonzero"/></svg>',"list-bull-circle":'<svg width="48" height="48"><g fill-rule="evenodd"><path d="M11 16a2 2 0 100-4 2 2 0 000 4zm0 1a3 3 0 110-6 3 3 0 010 6zM11 26a2 2 0 100-4 2 2 0 000 4zm0 1a3 3 0 110-6 3 3 0 010 6zM11 36a2 2 0 100-4 2 2 0 000 4zm0 1a3 3 0 110-6 3 3 0 010 6z" fill-rule="nonzero"/><path opacity=".2" d="M18 12h22v4H18zM18 22h22v4H18zM18 32h22v4H18z"/></g></svg>',"list-bull-default":'<svg width="48" height="48"><g fill-rule="evenodd"><circle cx="11" cy="14" r="3"/><circle cx="11" cy="24" r="3"/><circle cx="11" cy="34" r="3"/><path opacity=".2" d="M18 12h22v4H18zM18 22h22v4H18zM18 32h22v4H18z"/></g></svg>',"list-bull-square":'<svg width="48" height="48"><g fill-rule="evenodd"><path d="M8 11h6v6H8zM8 21h6v6H8zM8 31h6v6H8z"/><path opacity=".2" d="M18 12h22v4H18zM18 22h22v4H18zM18 32h22v4H18z"/></g></svg>',"list-num-default-rtl":'<svg width="48" height="48"><g fill-rule="evenodd"><path opacity=".2" d="M8 12h22v4H8zM8 22h22v4H8zM8 32h22v4H8z"/><path d="M37.4 17v-4.8l-1.6 1v-1.1l1.6-1h1.2V17zM33.3 17.1c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7zm1.7 5.7c0-1.2 1-2 2.2-2 1.3 0 2.1.8 2.1 1.8 0 .7-.3 1.2-1.3 2.2l-1.2 1v.2h2.6v1h-4.3v-.9l2-1.9c.8-.8 1-1.1 1-1.5 0-.5-.4-.8-1-.8-.5 0-.9.3-.9.9H35zm-1.7 4.3c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7zm3.2 7.3v-1h.7c.6 0 1-.3 1-.8 0-.4-.4-.7-1-.7s-1 .3-1 .8H35c0-1.1 1-1.8 2.2-1.8 1.2 0 2.1.6 2.1 1.6 0 .7-.4 1.2-1 1.3v.1c.7.1 1.3.7 1.3 1.4 0 1-1 1.9-2.4 1.9-1.3 0-2.2-.8-2.3-2h1.2c0 .6.5 1 1.1 1 .6 0 1-.4 1-1 0-.5-.3-.8-1-.8h-.7zm-3.3 2.7c-.4 0-.7-.3-.7-.7 0-.4.3-.7.7-.7.5 0 .8.3.8.7 0 .4-.3.7-.8.7z"/></g></svg>',"list-num-default":'<svg width="48" height="48"><g fill-rule="evenodd"><path opacity=".2" d="M18 12h22v4H18zM18 22h22v4H18zM18 32h22v4H18z"/><path d="M10 17v-4.8l-1.5 1v-1.1l1.6-1h1.2V17h-1.2zm3.6.1c-.4 0-.7-.3-.7-.7 0-.4.3-.7.7-.7.5 0 .7.3.7.7 0 .4-.2.7-.7.7zm-5 5.7c0-1.2.8-2 2.1-2s2.1.8 2.1 1.8c0 .7-.3 1.2-1.4 2.2l-1.1 1v.2h2.6v1H8.6v-.9l2-1.9c.8-.8 1-1.1 1-1.5 0-.5-.4-.8-1-.8-.5 0-.9.3-.9.9H8.5zm6.3 4.3c-.5 0-.7-.3-.7-.7 0-.4.2-.7.7-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7zM10 34.4v-1h.7c.6 0 1-.3 1-.8 0-.4-.4-.7-1-.7s-1 .3-1 .8H8.6c0-1.1 1-1.8 2.2-1.8 1.3 0 2.1.6 2.1 1.6 0 .7-.4 1.2-1 1.3v.1c.8.1 1.3.7 1.3 1.4 0 1-1 1.9-2.4 1.9-1.3 0-2.2-.8-2.3-2h1.2c0 .6.5 1 1.1 1 .7 0 1-.4 1-1 0-.5-.3-.8-1-.8h-.7zm4.7 2.7c-.4 0-.7-.3-.7-.7 0-.4.3-.7.7-.7.5 0 .8.3.8.7 0 .4-.3.7-.8.7z"/></g></svg>',"list-num-lower-alpha-rtl":'<svg width="48" height="48"><g fill-rule="evenodd"><path opacity=".2" d="M8 12h22v4H8zM8 22h22v4H8zM8 32h22v4H8z"/><path d="M36.5 16c-.9 0-1.5-.5-1.5-1.3s.6-1.3 1.8-1.4h1v-.4c0-.4-.2-.6-.7-.6-.4 0-.7.1-.8.4h-1.1c0-.8.8-1.4 2-1.4S39 12 39 13V16h-1.2v-.6c-.3.4-.8.7-1.4.7zm.4-.8c.6 0 1-.4 1-.9V14h-1c-.5.1-.7.3-.7.6 0 .4.3.6.7.6zM33.1 16.1c-.4 0-.7-.3-.7-.7 0-.4.3-.7.7-.7.5 0 .8.3.8.7 0 .4-.3.7-.8.7zM37.7 26c-.7 0-1.2-.2-1.5-.7v.7H35v-6.3h1.2v2.5c.3-.5.8-.9 1.5-.9 1.1 0 1.8 1 1.8 2.4 0 1.5-.7 2.4-1.8 2.4zm-.5-3.6c-.6 0-1 .5-1 1.3s.4 1.4 1 1.4c.7 0 1-.6 1-1.4 0-.8-.3-1.3-1-1.3zM33.2 26.1c-.4 0-.7-.3-.7-.7 0-.4.3-.7.7-.7.5 0 .8.3.8.7 0 .4-.3.7-.8.7zm6 7h-1c-.1-.5-.4-.8-1-.8s-1 .5-1 1.4c0 1 .4 1.4 1 1.4.5 0 .9-.2 1-.7h1c0 1-.8 1.7-2 1.7-1.4 0-2.2-.9-2.2-2.4s.8-2.4 2.2-2.4c1.2 0 2 .7 2 1.7zm-6.1 3c-.5 0-.7-.3-.7-.7 0-.4.2-.7.7-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7z"/></g></svg>',"list-num-lower-alpha":'<svg width="48" height="48"><g fill-rule="evenodd"><path opacity=".2" d="M18 12h22v4H18zM18 22h22v4H18zM18 32h22v4H18z"/><path d="M10.3 15.2c.5 0 1-.4 1-.9V14h-1c-.5.1-.8.3-.8.6 0 .4.3.6.8.6zm-.4.9c-1 0-1.5-.6-1.5-1.4 0-.8.6-1.3 1.7-1.4h1.1v-.4c0-.4-.2-.6-.7-.6-.5 0-.8.1-.9.4h-1c0-.8.8-1.4 2-1.4 1.1 0 1.8.6 1.8 1.6V16h-1.1v-.6h-.1c-.2.4-.7.7-1.3.7zm4.6 0c-.5 0-.7-.3-.7-.7 0-.4.2-.7.7-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7zm-3.2 10c-.6 0-1.2-.3-1.4-.8v.7H8.5v-6.3H10v2.5c.3-.5.8-.9 1.4-.9 1.2 0 1.9 1 1.9 2.4 0 1.5-.7 2.4-1.9 2.4zm-.4-3.7c-.7 0-1 .5-1 1.3s.3 1.4 1 1.4c.6 0 1-.6 1-1.4 0-.8-.4-1.3-1-1.3zm4 3.7c-.5 0-.7-.3-.7-.7 0-.4.2-.7.7-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7zm-2.2 7h-1.2c0-.5-.4-.8-.9-.8-.6 0-1 .5-1 1.4 0 1 .4 1.4 1 1.4.5 0 .8-.2 1-.7h1c0 1-.8 1.7-2 1.7-1.4 0-2.2-.9-2.2-2.4s.8-2.4 2.2-2.4c1.2 0 2 .7 2 1.7zm1.8 3c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7z"/></g></svg>',"list-num-lower-greek-rtl":'<svg width="48" height="48"><g fill-rule="evenodd"><path opacity=".2" d="M8 12h22v4H8zM8 22h22v4H8zM8 32h22v4H8z"/><path d="M37.4 16c-1.2 0-2-.8-2-2.3 0-1.5.8-2.4 2-2.4.6 0 1 .4 1.3 1v-.9H40v3.2c0 .4.1.5.4.5h.2v.9h-.6c-.6 0-1-.2-1-.7h-.2c-.2.4-.7.8-1.3.8zm.3-1c.6 0 1-.5 1-1.3s-.4-1.3-1-1.3-1 .5-1 1.3.4 1.4 1 1.4zM33.3 16.1c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7zM36 21.9c0-1.5.8-2.3 2.1-2.3 1.2 0 2 .6 2 1.6 0 .6-.3 1-.9 1.3.9.3 1.3.8 1.3 1.7 0 1.2-.7 1.9-1.8 1.9-.6 0-1.1-.3-1.4-.8v2.2H36V22zm1.8 1.2v-1h.3c.5 0 .9-.2.9-.7 0-.5-.3-.8-.9-.8-.5 0-.8.3-.8 1v2.2c0 .8.4 1.3 1 1.3s1-.4 1-1-.4-1-1.2-1h-.3zM33.3 26.1c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7zM37.1 34.6L34.8 30h1.4l1.7 3.5 1.7-3.5h1.1l-2.2 4.6v.1c.5.8.7 1.4.7 1.8 0 .4-.2.8-.4 1-.2.2-.6.3-1 .3-.9 0-1.3-.4-1.3-1.2 0-.5.2-1 .5-1.7l.1-.2zm.7 1a2 2 0 00-.4.9c0 .3.1.4.4.4.3 0 .4-.1.4-.4 0-.2-.1-.6-.4-1zM33.3 36.1c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7z"/></g></svg>',"list-num-lower-greek":'<svg width="48" height="48"><g fill-rule="evenodd"><path opacity=".2" d="M18 12h22v4H18zM18 22h22v4H18zM18 32h22v4H18z"/><path d="M10.5 15c.7 0 1-.5 1-1.3s-.3-1.3-1-1.3c-.5 0-.9.5-.9 1.3s.4 1.4 1 1.4zm-.3 1c-1.1 0-1.8-.8-1.8-2.3 0-1.5.7-2.4 1.8-2.4.7 0 1.1.4 1.3 1h.1v-.9h1.2v3.2c0 .4.1.5.4.5h.2v.9h-.6c-.6 0-1-.2-1.1-.7h-.1c-.2.4-.7.8-1.4.8zm5 .1c-.5 0-.8-.3-.8-.7 0-.4.3-.7.7-.7.5 0 .8.3.8.7 0 .4-.3.7-.8.7zm-4.9 7v-1h.3c.6 0 1-.2 1-.7 0-.5-.4-.8-1-.8-.5 0-.8.3-.8 1v2.2c0 .8.4 1.3 1.1 1.3.6 0 1-.4 1-1s-.5-1-1.3-1h-.3zM8.6 22c0-1.5.7-2.3 2-2.3 1.2 0 2 .6 2 1.6 0 .6-.3 1-.8 1.3.8.3 1.3.8 1.3 1.7 0 1.2-.8 1.9-1.9 1.9-.6 0-1.1-.3-1.3-.8v2.2H8.5V22zm6.2 4.2c-.4 0-.7-.3-.7-.7 0-.4.3-.7.7-.7.5 0 .7.3.7.7 0 .4-.2.7-.7.7zm-4.5 8.5L8 30h1.4l1.7 3.5 1.7-3.5h1.1l-2.2 4.6v.1c.5.8.7 1.4.7 1.8 0 .4-.1.8-.4 1-.2.2-.6.3-1 .3-.9 0-1.3-.4-1.3-1.2 0-.5.2-1 .5-1.7l.1-.2zm.7 1a2 2 0 00-.4.9c0 .3.1.4.4.4.3 0 .4-.1.4-.4 0-.2-.1-.6-.4-1zm4.5.5c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7z"/></g></svg>',"list-num-lower-roman-rtl":'<svg width="48" height="48"><g fill-rule="evenodd"><path opacity=".2" d="M8 12h22v4H8zM8 22h22v4H8zM8 32h22v4H8z"/><path d="M32.9 16v-1.2h-1.3V16H33zm0 10v-1.2h-1.3V26H33zm0 10v-1.2h-1.3V36H33z"/><path fill-rule="nonzero" d="M36 21h-1.5v5H36zM36 31h-1.5v5H36zM39 21h-1.5v5H39zM39 31h-1.5v5H39zM42 31h-1.5v5H42zM36 11h-1.5v5H36zM36 19h-1.5v1H36zM36 29h-1.5v1H36zM39 19h-1.5v1H39zM39 29h-1.5v1H39zM42 29h-1.5v1H42zM36 9h-1.5v1H36z"/></g></svg>',"list-num-lower-roman":'<svg width="48" height="48"><g fill-rule="evenodd"><path opacity=".2" d="M18 12h22v4H18zM18 22h22v4H18zM18 32h22v4H18z"/><path d="M15.1 16v-1.2h1.3V16H15zm0 10v-1.2h1.3V26H15zm0 10v-1.2h1.3V36H15z"/><path fill-rule="nonzero" d="M12 21h1.5v5H12zM12 31h1.5v5H12zM9 21h1.5v5H9zM9 31h1.5v5H9zM6 31h1.5v5H6zM12 11h1.5v5H12zM12 19h1.5v1H12zM12 29h1.5v1H12zM9 19h1.5v1H9zM9 29h1.5v1H9zM6 29h1.5v1H6zM12 9h1.5v1H12z"/></g></svg>',"list-num-upper-alpha-rtl":'<svg width="48" height="48"><g fill-rule="evenodd"><path opacity=".2" d="M8 12h22v4H8zM8 22h22v4H8zM8 32h22v4H8z"/><path d="M39.3 17l-.5-1.4h-2l-.5 1.4H35l2-6h1.6l2 6h-1.3zm-1.6-4.7l-.7 2.3h1.6l-.8-2.3zM33.4 17c-.4 0-.7-.3-.7-.7 0-.4.3-.7.7-.7.5 0 .7.3.7.7 0 .4-.2.7-.7.7zm4.7 9.9h-2.7v-6H38c1.2 0 1.9.6 1.9 1.5 0 .6-.5 1.2-1 1.3.7.1 1.3.7 1.3 1.5 0 1-.8 1.7-2 1.7zm-1.4-5v1.5h1c.6 0 1-.3 1-.8 0-.4-.4-.7-1-.7h-1zm0 4h1.1c.7 0 1.1-.3 1.1-.8 0-.6-.4-.9-1.1-.9h-1.1V26zM33 27.1c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7zm4.9 10c-1.8 0-2.8-1.1-2.8-3.1s1-3.1 2.8-3.1c1.4 0 2.5.9 2.6 2.2h-1.3c0-.7-.6-1.1-1.3-1.1-1 0-1.6.7-1.6 2s.6 2 1.6 2c.7 0 1.2-.4 1.4-1h1.2c-.1 1.3-1.2 2.2-2.6 2.2zm-4.5 0c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7z"/></g></svg>',"list-num-upper-alpha":'<svg width="48" height="48"><g fill-rule="evenodd"><path opacity=".2" d="M18 12h22v4H18zM18 22h22v4H18zM18 32h22v4H18z"/><path d="M12.6 17l-.5-1.4h-2L9.5 17H8.3l2-6H12l2 6h-1.3zM11 12.3l-.7 2.3h1.6l-.8-2.3zm4.7 4.8c-.4 0-.7-.3-.7-.7 0-.4.3-.7.7-.7.5 0 .7.3.7.7 0 .4-.2.7-.7.7zM11.4 27H8.7v-6h2.6c1.2 0 1.9.6 1.9 1.5 0 .6-.5 1.2-1 1.3.7.1 1.3.7 1.3 1.5 0 1-.8 1.7-2 1.7zM10 22v1.5h1c.6 0 1-.3 1-.8 0-.4-.4-.7-1-.7h-1zm0 4H11c.7 0 1.1-.3 1.1-.8 0-.6-.4-.9-1.1-.9H10V26zm5.4 1.1c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7zm-4.1 10c-1.8 0-2.8-1.1-2.8-3.1s1-3.1 2.8-3.1c1.4 0 2.5.9 2.6 2.2h-1.3c0-.7-.6-1.1-1.3-1.1-1 0-1.6.7-1.6 2s.6 2 1.6 2c.7 0 1.2-.4 1.4-1h1.2c-.1 1.3-1.2 2.2-2.6 2.2zm4.5 0c-.5 0-.8-.3-.8-.7 0-.4.3-.7.8-.7.4 0 .7.3.7.7 0 .4-.3.7-.7.7z"/></g></svg>',"list-num-upper-roman-rtl":'<svg width="48" height="48"><g fill-rule="evenodd"><path opacity=".2" d="M8 12h22v4H8zM8 22h22v4H8zM8 32h22v4H8z"/><path d="M31.6 17v-1.2H33V17h-1.3zm0 10v-1.2H33V27h-1.3zm0 10v-1.2H33V37h-1.3z"/><path fill-rule="nonzero" d="M34.5 20H36v7h-1.5zM34.5 30H36v7h-1.5zM37.5 20H39v7h-1.5zM37.5 30H39v7h-1.5zM40.5 30H42v7h-1.5zM34.5 10H36v7h-1.5z"/></g></svg>',"list-num-upper-roman":'<svg width="48" height="48"><g fill-rule="evenodd"><path opacity=".2" d="M18 12h22v4H18zM18 22h22v4H18zM18 32h22v4H18z"/><path d="M15.1 17v-1.2h1.3V17H15zm0 10v-1.2h1.3V27H15zm0 10v-1.2h1.3V37H15z"/><path fill-rule="nonzero" d="M12 20h1.5v7H12zM12 30h1.5v7H12zM9 20h1.5v7H9zM9 30h1.5v7H9zM6 30h1.5v7H6zM12 10h1.5v7H12z"/></g></svg>',lock:'<svg width="24" height="24"><path d="M16.3 11c.2 0 .3 0 .5.2l.2.6v7.4c0 .3 0 .4-.2.6l-.6.2H7.8c-.3 0-.4 0-.6-.2a.7.7 0 01-.2-.6v-7.4c0-.3 0-.4.2-.6l.5-.2H8V8c0-.8.3-1.5.9-2.1.6-.6 1.3-.9 2.1-.9h2c.8 0 1.5.3 2.1.9.6.6.9 1.3.9 2.1v3h.3zM10 8v3h4V8a1 1 0 00-.3-.7A1 1 0 0013 7h-2a1 1 0 00-.7.3 1 1 0 00-.3.7z" fill-rule="evenodd"/></svg>',ltr:'<svg width="24" height="24"><path d="M11 5h7a1 1 0 010 2h-1v11a1 1 0 01-2 0V7h-2v11a1 1 0 01-2 0v-6c-.5 0-1 0-1.4-.3A3.4 3.4 0 017.8 10a3.3 3.3 0 010-2.8 3.4 3.4 0 011.8-1.8L11 5zM4.4 16.2L6.2 15l-1.8-1.2a1 1 0 011.2-1.6l3 2a1 1 0 010 1.6l-3 2a1 1 0 11-1.2-1.6z" fill-rule="evenodd"/></svg>',"more-drawer":'<svg width="24" height="24"><path d="M6 10a2 2 0 00-2 2c0 1.1.9 2 2 2a2 2 0 002-2 2 2 0 00-2-2zm12 0a2 2 0 00-2 2c0 1.1.9 2 2 2a2 2 0 002-2 2 2 0 00-2-2zm-6 0a2 2 0 00-2 2c0 1.1.9 2 2 2a2 2 0 002-2 2 2 0 00-2-2z" fill-rule="nonzero"/></svg>',"new-document":'<svg width="24" height="24"><path d="M14.4 3H7a2 2 0 00-2 2v14c0 1.1.9 2 2 2h10a2 2 0 002-2V7.6L14.4 3zM17 19H7V5h6v4h4v10z" fill-rule="nonzero"/></svg>',"new-tab":'<svg width="24" height="24"><path d="M15 13l2-2v8H5V7h8l-2 2H7v8h8v-4zm4-8v5.5l-2-2-5.6 5.5H10v-1.4L15.5 7l-2-2H19z" fill-rule="evenodd"/></svg>',"non-breaking":'<svg width="24" height="24"><path d="M11 11H8a1 1 0 110-2h3V6c0-.6.4-1 1-1s1 .4 1 1v3h3c.6 0 1 .4 1 1s-.4 1-1 1h-3v3c0 .6-.4 1-1 1a1 1 0 01-1-1v-3zm10 4v5H3v-5c0-.6.4-1 1-1s1 .4 1 1v3h14v-3c0-.6.4-1 1-1s1 .4 1 1z" fill-rule="evenodd"/></svg>',notice:'<svg width="24" height="24"><path d="M17.8 9.8L15.4 4 20 8.5v7L15.5 20h-7L4 15.5v-7L8.5 4h7l2.3 5.8zm0 0l2.2 5.7-2.3-5.8zM13 17v-2h-2v2h2zm0-4V7h-2v6h2z" fill-rule="evenodd"/></svg>',"ordered-list-rtl":'<svg width="24" height="24"><path d="M6 17h8a1 1 0 010 2H6a1 1 0 010-2zm0-6h8a1 1 0 010 2H6a1 1 0 010-2zm0-6h8a1 1 0 010 2H6a1 1 0 110-2zm13-1v3.5a.5.5 0 11-1 0V5h-.5a.5.5 0 110-1H19zm-1 8.8l.2.2h1.3a.5.5 0 110 1h-1.6a1 1 0 01-.9-1V13c0-.4.3-.8.6-1l1.2-.4.2-.3a.2.2 0 00-.2-.2h-1.3a.5.5 0 01-.5-.5c0-.3.2-.5.5-.5h1.6c.5 0 .9.4.9 1v.1c0 .4-.3.8-.6 1l-1.2.4-.2.3zm2 4.2v2c0 .6-.4 1-1 1h-1.5a.5.5 0 010-1h1.2a.3.3 0 100-.6h-1.3a.4.4 0 110-.8h1.3a.3.3 0 000-.6h-1.2a.5.5 0 110-1H19c.6 0 1 .4 1 1z" fill-rule="evenodd"/></svg>',"ordered-list":'<svg width="24" height="24"><path d="M10 17h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 010-2zm0-6h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 010-2zm0-6h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 110-2zM6 4v3.5c0 .3-.2.5-.5.5a.5.5 0 01-.5-.5V5h-.5a.5.5 0 010-1H6zm-1 8.8l.2.2h1.3c.3 0 .5.2.5.5s-.2.5-.5.5H4.9a1 1 0 01-.9-1V13c0-.4.3-.8.6-1l1.2-.4.2-.3a.2.2 0 00-.2-.2H4.5a.5.5 0 01-.5-.5c0-.3.2-.5.5-.5h1.6c.5 0 .9.4.9 1v.1c0 .4-.3.8-.6 1l-1.2.4-.2.3zM7 17v2c0 .6-.4 1-1 1H4.5a.5.5 0 010-1h1.2c.2 0 .3-.1.3-.3 0-.2-.1-.3-.3-.3H4.4a.4.4 0 110-.8h1.3c.2 0 .3-.1.3-.3 0-.2-.1-.3-.3-.3H4.5a.5.5 0 110-1H6c.6 0 1 .4 1 1z" fill-rule="evenodd"/></svg>',orientation:'<svg width="24" height="24"><path d="M7.3 6.4L1 13l6.4 6.5 6.5-6.5-6.5-6.5zM3.7 13l3.6-3.7L11 13l-3.7 3.7-3.6-3.7zM12 6l2.8 2.7c.3.3.3.8 0 1-.3.4-.9.4-1.2 0L9.2 5.7a.8.8 0 010-1.2L13.6.2c.3-.3.9-.3 1.2 0 .3.3.3.8 0 1.1L12 4h1a9 9 0 11-4.3 16.9l1.5-1.5A7 7 0 1013 6h-1z" fill-rule="nonzero"/></svg>',outdent:'<svg width="24" height="24"><path d="M7 5h12c.6 0 1 .4 1 1s-.4 1-1 1H7a1 1 0 110-2zm5 4h7c.6 0 1 .4 1 1s-.4 1-1 1h-7a1 1 0 010-2zm0 4h7c.6 0 1 .4 1 1s-.4 1-1 1h-7a1 1 0 010-2zm-5 4h12a1 1 0 010 2H7a1 1 0 010-2zm1.6-3.8a1 1 0 01-1.2 1.6l-3-2a1 1 0 010-1.6l3-2a1 1 0 011.2 1.6L6.8 12l1.8 1.2z" fill-rule="evenodd"/></svg>',"page-break":'<svg width="24" height="24"><g fill-rule="evenodd"><path d="M5 11c.6 0 1 .4 1 1s-.4 1-1 1a1 1 0 010-2zm3 0h1c.6 0 1 .4 1 1s-.4 1-1 1H8a1 1 0 010-2zm4 0c.6 0 1 .4 1 1s-.4 1-1 1a1 1 0 010-2zm3 0h1c.6 0 1 .4 1 1s-.4 1-1 1h-1a1 1 0 010-2zm4 0c.6 0 1 .4 1 1s-.4 1-1 1a1 1 0 010-2zM7 3v5h10V3c0-.6.4-1 1-1s1 .4 1 1v7H5V3c0-.6.4-1 1-1s1 .4 1 1zM6 22a1 1 0 01-1-1v-7h14v7c0 .6-.4 1-1 1a1 1 0 01-1-1v-5H7v5c0 .6-.4 1-1 1z"/></g></svg>',paragraph:'<svg width="24" height="24"><path fill-rule="evenodd" d="M10 5h7a1 1 0 010 2h-1v11a1 1 0 01-2 0V7h-2v11a1 1 0 01-2 0v-6c-.5 0-1 0-1.4-.3A3.4 3.4 0 016.8 10a3.3 3.3 0 010-2.8 3.4 3.4 0 011.8-1.8L10 5z"/></svg>',"paste-column-after":'<svg width="24" height="24"><path fill-rule="evenodd" d="M12 1a3 3 0 012.8 2H18c1 0 2 .8 2 1.9V7h-2V5h-2v1c0 .6-.4 1-1 1H9a1 1 0 01-1-1V5H6v13h7v2H6c-1 0-2-.8-2-1.9V5c0-1 .8-2 1.9-2H9.2A3 3 0 0112 1zm8 7v12h-6V8h6zm-1.5 1.5h-3v9h3v-9zM12 3a1 1 0 100 2 1 1 0 000-2z"/></svg>',"paste-column-before":'<svg width="24" height="24"><path fill-rule="evenodd" d="M12 1a3 3 0 012.8 2H18c1 0 2 .8 2 1.9V18c0 1-.8 2-1.9 2H11v-2h7V5h-2v1c0 .6-.4 1-1 1H9a1 1 0 01-1-1V5H6v2H4V5c0-1 .8-2 1.9-2H9.2A3 3 0 0112 1zm-2 7v12H4V8h6zM8.5 9.5h-3v9h3v-9zM12 3a1 1 0 100 2 1 1 0 000-2z"/></svg>',"paste-row-after":'<svg width="24" height="24"><path fill-rule="evenodd" d="M12 1a3 3 0 012.8 2H18c1 0 2 .8 2 1.9V11h-2V5h-2v1c0 .6-.4 1-1 1H9a1 1 0 01-1-1V5H6v13h14c0 1-.8 2-1.9 2H6c-1 0-2-.8-2-1.9V5c0-1 .8-2 1.9-2H9.2A3 3 0 0112 1zm10 11v5H8v-5h14zm-1.5 1.5h-11v2h11v-2zM12 3a1 1 0 100 2 1 1 0 000-2z"/></svg>',"paste-row-before":'<svg width="24" height="24"><path fill-rule="evenodd" d="M12 1a3 3 0 012.8 2H18c1 0 2 .8 2 1.9V7h-2V5h-2v1c0 .6-.4 1-1 1H9a1 1 0 01-1-1V5H6v13h12v-4h2v4c0 1-.8 2-1.9 2H6c-1 0-2-.8-2-1.9V5c0-1 .8-2 1.9-2H9.2A3 3 0 0112 1zm10 7v5H8V8h14zm-1.5 1.5h-11v2h11v-2zM12 3a1 1 0 100 2 1 1 0 000-2z"/></svg>',"paste-text":'<svg width="24" height="24"><path d="M18 9V5h-2v1c0 .6-.4 1-1 1H9a1 1 0 01-1-1V5H6v13h3V9h9zM9 20H6a2 2 0 01-2-2V5c0-1.1.9-2 2-2h3.2A3 3 0 0112 1a3 3 0 012.8 2H18a2 2 0 012 2v4h1v12H9v-1zm1.5-9.5v9h9v-9h-9zM12 3a1 1 0 00-1 1c0 .5.4 1 1 1s1-.5 1-1-.4-1-1-1zm0 9h6v2h-.5l-.5-1h-1v4h.8v1h-3.6v-1h.8v-4h-1l-.5 1H12v-2z" fill-rule="nonzero"/></svg>',paste:'<svg width="24" height="24"><path d="M18 9V5h-2v1c0 .6-.4 1-1 1H9a1 1 0 01-1-1V5H6v13h3V9h9zM9 20H6a2 2 0 01-2-2V5c0-1.1.9-2 2-2h3.2A3 3 0 0112 1a3 3 0 012.8 2H18a2 2 0 012 2v4h1v12H9v-1zm1.5-9.5v9h9v-9h-9zM12 3a1 1 0 00-1 1c0 .5.4 1 1 1s1-.5 1-1-.4-1-1-1z" fill-rule="nonzero"/></svg>',"permanent-pen":'<svg width="24" height="24"><path d="M10.5 17.5L8 20H3v-3l3.5-3.5a2 2 0 010-3L14 3l1 1-7.3 7.3a1 1 0 000 1.4l3.6 3.6c.4.4 1 .4 1.4 0L20 9l1 1-7.6 7.6a2 2 0 01-2.8 0l-.1-.1z" fill-rule="nonzero"/></svg>',plus:'<svg width="24" height="24"><path d="M12 4c.5 0 1 .4 1 .9V11h6a1 1 0 01.1 2H13v6a1 1 0 01-2 .1V13H5a1 1 0 01-.1-2H11V5c0-.6.4-1 1-1z"/></svg>',preferences:'<svg width="24" height="24"><path d="M20.1 13.5l-1.9.2a5.8 5.8 0 01-.6 1.5l1.2 1.5c.4.4.3 1 0 1.4l-.7.7a1 1 0 01-1.4 0l-1.5-1.2a6.2 6.2 0 01-1.5.6l-.2 1.9c0 .5-.5.9-1 .9h-1a1 1 0 01-1-.9l-.2-1.9a5.8 5.8 0 01-1.5-.6l-1.5 1.2a1 1 0 01-1.4 0l-.7-.7a1 1 0 010-1.4l1.2-1.5a6.2 6.2 0 01-.6-1.5l-1.9-.2a1 1 0 01-.9-1v-1c0-.5.4-1 .9-1l1.9-.2a5.8 5.8 0 01.6-1.5L5.2 7.3a1 1 0 010-1.4l.7-.7a1 1 0 011.4 0l1.5 1.2a6.2 6.2 0 011.5-.6l.2-1.9c0-.5.5-.9 1-.9h1c.5 0 1 .4 1 .9l.2 1.9a5.8 5.8 0 011.5.6l1.5-1.2a1 1 0 011.4 0l.7.7c.3.4.4 1 0 1.4l-1.2 1.5a6.2 6.2 0 01.6 1.5l1.9.2c.5 0 .9.5.9 1v1c0 .5-.4 1-.9 1zM12 15a3 3 0 100-6 3 3 0 000 6z" fill-rule="evenodd"/></svg>',preview:'<svg width="24" height="24"><path d="M3.5 12.5c.5.8 1.1 1.6 1.8 2.3 2 2 4.2 3.2 6.7 3.2s4.7-1.2 6.7-3.2a16.2 16.2 0 002.1-2.8 15.7 15.7 0 00-2.1-2.8c-2-2-4.2-3.2-6.7-3.2a9.3 9.3 0 00-6.7 3.2A16.2 16.2 0 003.2 12c0 .2.2.3.3.5zm-2.4-1l.7-1.2L4 7.8C6.2 5.4 8.9 4 12 4c3 0 5.8 1.4 8.1 3.8a18.2 18.2 0 012.8 3.7v1l-.7 1.2-2.1 2.5c-2.3 2.4-5 3.8-8.1 3.8-3 0-5.8-1.4-8.1-3.8a18.2 18.2 0 01-2.8-3.7 1 1 0 010-1zm12-3.3a2 2 0 102.7 2.6 4 4 0 11-2.6-2.6z" fill-rule="nonzero"/></svg>',print:'<svg width="24" height="24"><path d="M18 8H6a3 3 0 00-3 3v6h2v3h14v-3h2v-6a3 3 0 00-3-3zm-1 10H7v-4h10v4zm.5-5c-.8 0-1.5-.7-1.5-1.5s.7-1.5 1.5-1.5 1.5.7 1.5 1.5-.7 1.5-1.5 1.5zm.5-8H6v2h12V5z" fill-rule="nonzero"/></svg>',quote:'<svg width="24" height="24"><path d="M7.5 17h.9c.4 0 .7-.2.9-.6L11 13V8c0-.6-.4-1-1-1H6a1 1 0 00-1 1v4c0 .6.4 1 1 1h2l-1.3 2.7a1 1 0 00.8 1.3zm8 0h.9c.4 0 .7-.2.9-.6L19 13V8c0-.6-.4-1-1-1h-4a1 1 0 00-1 1v4c0 .6.4 1 1 1h2l-1.3 2.7a1 1 0 00.8 1.3z" fill-rule="nonzero"/></svg>',redo:'<svg width="24" height="24"><path d="M17.6 10H12c-2.8 0-4.4 1.4-4.9 3.5-.4 2 .3 4 1.4 4.6a1 1 0 11-1 1.8c-2-1.2-2.9-4.1-2.3-6.8.6-3 3-5.1 6.8-5.1h5.6l-3.3-3.3a1 1 0 111.4-1.4l5 5a1 1 0 010 1.4l-5 5a1 1 0 01-1.4-1.4l3.3-3.3z" fill-rule="nonzero"/></svg>',reload:'<svg width="24" height="24"><g fill-rule="nonzero"><path d="M5 22.1l-1.2-4.7v-.2a1 1 0 011-1l5 .4a1 1 0 11-.2 2l-2.2-.2a7.8 7.8 0 008.4.2 7.5 7.5 0 003.5-6.4 1 1 0 112 0 9.5 9.5 0 01-4.5 8 9.9 9.9 0 01-10.2 0l.4 1.4a1 1 0 11-2 .5zM13.6 7.4c0-.5.5-1 1-.9l2.8.2a8 8 0 00-9.5-1 7.5 7.5 0 00-3.6 7 1 1 0 01-2 0 9.5 9.5 0 014.5-8.6 10 10 0 0110.9.3l-.3-1a1 1 0 012-.5l1.1 4.8a1 1 0 01-1 1.2l-5-.4a1 1 0 01-.9-1z"/></g></svg>',"remove-formatting":'<svg width="24" height="24"><path d="M13.2 6a1 1 0 010 .2l-2.6 10a1 1 0 01-1 .8h-.2a.8.8 0 01-.8-1l2.6-10H8a1 1 0 110-2h9a1 1 0 010 2h-3.8zM5 18h7a1 1 0 010 2H5a1 1 0 010-2zm13 1.5L16.5 18 15 19.5a.7.7 0 01-1-1l1.5-1.5-1.5-1.5a.7.7 0 011-1l1.5 1.5 1.5-1.5a.7.7 0 011 1L17.5 17l1.5 1.5a.7.7 0 01-1 1z" fill-rule="evenodd"/></svg>',remove:'<svg width="24" height="24"><path d="M16 7h3a1 1 0 010 2h-1v9a3 3 0 01-3 3H9a3 3 0 01-3-3V9H5a1 1 0 110-2h3V6a3 3 0 013-3h2a3 3 0 013 3v1zm-2 0V6c0-.6-.4-1-1-1h-2a1 1 0 00-1 1v1h4zm2 2H8v9c0 .6.4 1 1 1h6c.6 0 1-.4 1-1V9zm-7 3a1 1 0 012 0v4a1 1 0 01-2 0v-4zm4 0a1 1 0 012 0v4a1 1 0 01-2 0v-4z" fill-rule="nonzero"/></svg>',"resize-handle":'<svg width="10" height="10"><g fill-rule="nonzero"><path d="M8.1 1.1A.5.5 0 119 2l-7 7A.5.5 0 111 8l7-7zM8.1 5.1A.5.5 0 119 6l-3 3A.5.5 0 115 8l3-3z"/></g></svg>',resize:'<svg width="24" height="24"><path d="M4 5c0-.3.1-.5.3-.7.2-.2.4-.3.7-.3h6c.3 0 .5.1.7.3.2.2.3.4.3.7 0 .3-.1.5-.3.7a1 1 0 01-.7.3H7.4L18 16.6V13c0-.3.1-.5.3-.7.2-.2.4-.3.7-.3.3 0 .5.1.7.3.2.2.3.4.3.7v6c0 .3-.1.5-.3.7a1 1 0 01-.7.3h-6a1 1 0 01-.7-.3 1 1 0 01-.3-.7c0-.3.1-.5.3-.7.2-.2.4-.3.7-.3h3.6L6 7.4V11c0 .3-.1.5-.3.7a1 1 0 01-.7.3 1 1 0 01-.7-.3A1 1 0 014 11V5z" fill-rule="evenodd"/></svg>',"restore-draft":'<svg width="24" height="24"><g fill-rule="evenodd"><path d="M17 13c0 .6-.4 1-1 1h-4V8c0-.6.4-1 1-1s1 .4 1 1v4h2c.6 0 1 .4 1 1z"/><path d="M4.7 10H9a1 1 0 010 2H3a1 1 0 01-1-1V5a1 1 0 112 0v3l2.5-2.4a9.2 9.2 0 0110.8-1.5A9 9 0 0113.4 21c-2.4.1-4.7-.7-6.5-2.2a1 1 0 111.3-1.5 7.2 7.2 0 0011.6-3.7 7 7 0 00-3.5-7.7A7.2 7.2 0 008 7L4.7 10z" fill-rule="nonzero"/></g></svg>',"rotate-left":'<svg width="24" height="24"><path d="M4.7 10H9a1 1 0 010 2H3a1 1 0 01-1-1V5a1 1 0 112 0v3l2.5-2.4a9.2 9.2 0 0110.8-1.5A9 9 0 0113.4 21c-2.4.1-4.7-.7-6.5-2.2a1 1 0 111.3-1.5 7.2 7.2 0 0011.6-3.7 7 7 0 00-3.5-7.7A7.2 7.2 0 008 7L4.7 10z" fill-rule="nonzero"/></svg>',"rotate-right":'<svg width="24" height="24"><path d="M20 8V5a1 1 0 012 0v6c0 .6-.4 1-1 1h-6a1 1 0 010-2h4.3L16 7A7.2 7.2 0 007.7 6a7 7 0 003 13.1c1.9.1 3.7-.5 5-1.7a1 1 0 011.4 1.5A9.2 9.2 0 012.2 14c-.9-3.9 1-8 4.5-9.9 3.5-1.9 8-1.3 10.8 1.5L20 8z" fill-rule="nonzero"/></svg>',rtl:'<svg width="24" height="24"><path d="M8 5h8v2h-2v12h-2V7h-2v12H8v-7c-.5 0-1 0-1.4-.3A3.4 3.4 0 014.8 10a3.3 3.3 0 010-2.8 3.4 3.4 0 011.8-1.8L8 5zm12 11.2a1 1 0 11-1 1.6l-3-2a1 1 0 010-1.6l3-2a1 1 0 111 1.6L18.4 15l1.8 1.2z" fill-rule="evenodd"/></svg>',save:'<svg width="24" height="24"><path d="M5 16h14a2 2 0 012 2v2a2 2 0 01-2 2H5a2 2 0 01-2-2v-2c0-1.1.9-2 2-2zm0 2v2h14v-2H5zm10 0h2v2h-2v-2zm-4-6.4L8.7 9.3a1 1 0 10-1.4 1.4l4 4c.4.4 1 .4 1.4 0l4-4a1 1 0 10-1.4-1.4L13 11.6V4a1 1 0 00-2 0v7.6z" fill-rule="nonzero"/></svg>',search:'<svg width="24" height="24"><path d="M16 17.3a8 8 0 111.4-1.4l4.3 4.4a1 1 0 01-1.4 1.4l-4.4-4.3zm-5-.3a6 6 0 100-12 6 6 0 000 12z" fill-rule="nonzero"/></svg>',"select-all":'<svg width="24" height="24"><path d="M3 5h2V3a2 2 0 00-2 2zm0 8h2v-2H3v2zm4 8h2v-2H7v2zM3 9h2V7H3v2zm10-6h-2v2h2V3zm6 0v2h2a2 2 0 00-2-2zM5 21v-2H3c0 1.1.9 2 2 2zm-2-4h2v-2H3v2zM9 3H7v2h2V3zm2 18h2v-2h-2v2zm8-8h2v-2h-2v2zm0 8a2 2 0 002-2h-2v2zm0-12h2V7h-2v2zm0 8h2v-2h-2v2zm-4 4h2v-2h-2v2zm0-16h2V3h-2v2zM7 17h10V7H7v10zm2-8h6v6H9V9z" fill-rule="nonzero"/></svg>',selected:'<svg width="24" height="24"><path fill-rule="nonzero" d="M6 4h12a2 2 0 012 2v12a2 2 0 01-2 2H6a2 2 0 01-2-2V6c0-1.1.9-2 2-2zm3.6 10.9L7 12.3a.7.7 0 00-1 1L9.6 17 18 8.6a.7.7 0 000-1 .7.7 0 00-1 0l-7.4 7.3z"/></svg>',settings:'<svg width="24" height="24"><path d="M11 6h8c.6 0 1 .4 1 1s-.4 1-1 1h-8v.3c0 .2 0 .3-.2.5l-.6.2H7.8c-.3 0-.4 0-.6-.2a.7.7 0 01-.2-.6V8H5a1 1 0 110-2h2v-.3c0-.2 0-.3.2-.5l.5-.2h2.5c.3 0 .4 0 .6.2l.2.5V6zM8 8h2V6H8v2zm9 2.8v.2h2c.6 0 1 .4 1 1s-.4 1-1 1h-2v.3c0 .2 0 .3-.2.5l-.6.2h-2.4c-.3 0-.4 0-.6-.2a.7.7 0 01-.2-.6V13H5a1 1 0 010-2h8v-.3c0-.2 0-.3.2-.5l.6-.2h2.4c.3 0 .4 0 .6.2l.2.6zM14 13h2v-2h-2v2zm-3 2.8v.2h8c.6 0 1 .4 1 1s-.4 1-1 1h-8v.3c0 .2 0 .3-.2.5l-.6.2H7.8c-.3 0-.4 0-.6-.2a.7.7 0 01-.2-.6V18H5a1 1 0 010-2h2v-.3c0-.2 0-.3.2-.5l.5-.2h2.5c.3 0 .4 0 .6.2l.2.6zM8 18h2v-2H8v2z" fill-rule="evenodd"/></svg>',sharpen:'<svg width="24" height="24"><path d="M16 6l4 4-8 9-8-9 4-4h8zm-4 10.2l5.5-6.2-.1-.1H12v-.3h5.1l-.2-.2H12V9h4.6l-.2-.2H12v-.3h4.1l-.2-.2H12V8h3.6l-.2-.2H8.7L6.5 10l.1.1H12v.3H6.9l.2.2H12v.3H7.3l.2.2H12v.3H7.7l.3.2h4v.3H8.2l.2.2H12v.3H8.6l.3.2H12v.3H9l.3.2H12v.3H9.5l.2.2H12v.3h-2l.2.2H12v.3h-1.6l.2.2H12v.3h-1.1l.2.2h.9v.3h-.7l.2.2h.5v.3h-.3l.3.2z" fill-rule="evenodd"/></svg>',sourcecode:'<svg width="24" height="24"><g fill-rule="nonzero"><path d="M9.8 15.7c.3.3.3.8 0 1-.3.4-.9.4-1.2 0l-4.4-4.1a.8.8 0 010-1.2l4.4-4.2c.3-.3.9-.3 1.2 0 .3.3.3.8 0 1.1L6 12l3.8 3.7zM14.2 15.7c-.3.3-.3.8 0 1 .4.4.9.4 1.2 0l4.4-4.1c.3-.3.3-.9 0-1.2l-4.4-4.2a.8.8 0 00-1.2 0c-.3.3-.3.8 0 1.1L18 12l-3.8 3.7z"/></g></svg>',"spell-check":'<svg width="24" height="24"><path d="M6 8v3H5V5c0-.3.1-.5.3-.7.2-.2.4-.3.7-.3h2c.3 0 .5.1.7.3.2.2.3.4.3.7v6H8V8H6zm0-3v2h2V5H6zm13 0h-3v5h3v1h-3a1 1 0 01-.7-.3 1 1 0 01-.3-.7V5c0-.3.1-.5.3-.7.2-.2.4-.3.7-.3h3v1zm-5 1.5l-.1.7c-.1.2-.3.3-.6.3.3 0 .5.1.6.3l.1.7V10c0 .3-.1.5-.3.7a1 1 0 01-.7.3h-3V4h3c.3 0 .5.1.7.3.2.2.3.4.3.7v1.5zM13 10V8h-2v2h2zm0-3V5h-2v2h2zm3 5l1 1-6.5 7L7 15.5l1.3-1 2.2 2.2L16 12z" fill-rule="evenodd"/></svg>',"strike-through":'<svg width="24" height="24"><g fill-rule="evenodd"><path d="M15.6 8.5c-.5-.7-1-1.1-1.3-1.3-.6-.4-1.3-.6-2-.6-2.7 0-2.8 1.7-2.8 2.1 0 1.6 1.8 2 3.2 2.3 4.4.9 4.6 2.8 4.6 3.9 0 1.4-.7 4.1-5 4.1A6.2 6.2 0 017 16.4l1.5-1.1c.4.6 1.6 2 3.7 2 1.6 0 2.5-.4 3-1.2.4-.8.3-2-.8-2.6-.7-.4-1.6-.7-2.9-1-1-.2-3.9-.8-3.9-3.6C7.6 6 10.3 5 12.4 5c2.9 0 4.2 1.6 4.7 2.4l-1.5 1.1z"/><path d="M5 11h14a1 1 0 010 2H5a1 1 0 010-2z" fill-rule="nonzero"/></g></svg>',subscript:'<svg width="24" height="24"><path d="M10.4 10l4.6 4.6-1.4 1.4L9 11.4 4.4 16 3 14.6 7.6 10 3 5.4 4.4 4 9 8.6 13.6 4 15 5.4 10.4 10zM21 19h-5v-1l1-.8 1.7-1.6c.3-.4.5-.8.5-1.2 0-.3 0-.6-.2-.7-.2-.2-.5-.3-.9-.3a2 2 0 00-.8.2l-.7.3-.4-1.1 1-.6 1.2-.2c.8 0 1.4.3 1.8.7.4.4.6.9.6 1.5s-.2 1.1-.5 1.6a8 8 0 01-1.3 1.3l-.6.6h2.6V19z" fill-rule="nonzero"/></svg>',superscript:'<svg width="24" height="24"><path d="M15 9.4L10.4 14l4.6 4.6-1.4 1.4L9 15.4 4.4 20 3 18.6 7.6 14 3 9.4 4.4 8 9 12.6 13.6 8 15 9.4zm5.9 1.6h-5v-1l1-.8 1.7-1.6c.3-.5.5-.9.5-1.3 0-.3 0-.5-.2-.7-.2-.2-.5-.3-.9-.3l-.8.2-.7.4-.4-1.2c.2-.2.5-.4 1-.5.3-.2.8-.2 1.2-.2.8 0 1.4.2 1.8.6.4.4.6 1 .6 1.6 0 .5-.2 1-.5 1.5l-1.3 1.4-.6.5h2.6V11z" fill-rule="nonzero"/></svg>',"table-caption":'<svg width="24" height="24"><g fill-rule="nonzero"><rect width="12" height="2" x="3" y="4" rx="1"/><path d="M19 8a2 2 0 012 2v8a2 2 0 01-2 2H5a2 2 0 01-2-2v-8c0-1.1.9-2 2-2h14zM5 15v3h6v-3H5zm14 0h-6v3h6v-3zm0-5h-6v3h6v-3zM5 13h6v-3H5v3z"/></g></svg>',"table-cell-classes":'<svg width="24" height="24"><g fill-rule="evenodd"><path fill-rule="nonzero" d="M13 4v9H3V6c0-1.1.9-2 2-2h8zm-2 2H5v5h6V6z"/><path fill-rule="nonzero" d="M13 4h6a2 2 0 012 2v7h-8v-2h6V6h-6V4z" opacity=".2"/><path d="M18 20l-2.6 1.6.7-3-2.4-2 3.1-.2 1.2-2.9 1.2 2.9 3 .2-2.3 2 .7 3z"/><path fill-rule="nonzero" d="M3 13v5c0 1.1.9 2 2 2h8v-7h-2v5H5v-5H3z" opacity=".2"/></g></svg>',"table-cell-properties":'<svg width="24" height="24"><path fill-rule="nonzero" d="M19 4a2 2 0 012 2v12a2 2 0 01-2 2H5a2 2 0 01-2-2V6c0-1.1.9-2 2-2h14zm-8 9H5v5h6v-5zm8 0h-6v5h6v-5zm-8-7H5v5h6V6z"/></svg>',"table-cell-select-all":'<svg width="24" height="24"><g fill-rule="evenodd"><path fill-rule="nonzero" d="M19 4a2 2 0 012 2v12a2 2 0 01-2 2H5a2 2 0 01-2-2V6c0-1.1.9-2 2-2h14zm0 2H5v12h14V6z"/><path d="M13 6v5h6v2h-6v5h-2v-5H5v-2h6V6h2z" opacity=".2"/></g></svg>',"table-cell-select-inner":'<svg width="24" height="24"><g fill-rule="evenodd"><path fill-rule="nonzero" d="M19 4a2 2 0 012 2v12a2 2 0 01-2 2H5a2 2 0 01-2-2V6c0-1.1.9-2 2-2h14zm0 2H5v12h14V6z" opacity=".2"/><path d="M13 6v5h6v2h-6v5h-2v-5H5v-2h6V6h2z"/></g></svg>',"table-classes":'<svg width="24" height="24"><g fill-rule="evenodd"><path fill-rule="nonzero" d="M19 4a2 2 0 012 2v7h-8v7H5a2 2 0 01-2-2V6c0-1.1.9-2 2-2h14zm-8 9H5v5h6v-5zm8-7h-6v5h6V6zm-8 0H5v5h6V6z"/><path d="M18 20l-2.6 1.6.7-3-2.4-2 3.1-.2 1.2-2.9 1.2 2.9 3 .2-2.3 2 .7 3z"/></g></svg>',"table-delete-column":'<svg width="24" height="24"><path fill-rule="nonzero" d="M19 4a2 2 0 012 2v12a2 2 0 01-2 2H5a2 2 0 01-2-2V6c0-1.1.9-2 2-2h14zm-4 4h-2V6h-2v2H9V6H5v12h4v-2h2v2h2v-2h2v2h4V6h-4v2zm.3.5l1 1.2-3 2.3 3 2.3-1 1.2L12 13l-3.3 2.6-1-1.2 3-2.3-3-2.3 1-1.2L12 11l3.3-2.5z"/></svg>',"table-delete-row":'<svg width="24" height="24"><path fill-rule="nonzero" d="M19 4a2 2 0 012 2v12a2 2 0 01-2 2H5a2 2 0 01-2-2V6c0-1.1.9-2 2-2h14zm0 2H5v3h2.5v2H5v2h2.5v2H5v3h14v-3h-2.5v-2H19v-2h-2.5V9H19V6zm-4.7 1.8l1.2 1L13 12l2.6 3.3-1.2 1-2.3-3-2.3 3-1.2-1L11 12 8.5 8.7l1.2-1 2.3 3 2.3-3z"/></svg>',"table-delete-table":'<svg width="24" height="24"><g fill-rule="nonzero"><path d="M19 4a2 2 0 012 2v12a2 2 0 01-2 2H5a2 2 0 01-2-2V6c0-1.1.9-2 2-2h14zM5 6v12h14V6H5z"/><path d="M14.4 8.6l1 1-2.3 2.4 2.3 2.4-1 1-2.4-2.3-2.4 2.3-1-1 2.3-2.4-2.3-2.4 1-1 2.4 2.3z"/></g></svg>',"table-insert-column-after":'<svg width="24" height="24"><path fill-rule="nonzero" d="M20 4c.6 0 1 .4 1 1v2a1 1 0 01-2 0V6h-8v12h8v-1a1 1 0 012 0v2c0 .5-.4 1-.9 1H5a2 2 0 01-2-2V6c0-1.1.9-2 2-2h15zM9 13H5v5h4v-5zm7-5c.5 0 1 .4 1 .9V11h2a1 1 0 01.1 2H17v2a1 1 0 01-2 .1V13h-2a1 1 0 01-.1-2H15V9c0-.6.4-1 1-1zM9 6H5v5h4V6z"/></svg>',"table-insert-column-before":'<svg width="24" height="24"><path fill-rule="nonzero" d="M19 4a2 2 0 012 2v12a2 2 0 01-2 2H4a1 1 0 01-1-1v-2a1 1 0 012 0v1h8V6H5v1a1 1 0 11-2 0V5c0-.6.4-1 1-1h15zm0 9h-4v5h4v-5zM8 8c.5 0 1 .4 1 .9V11h2a1 1 0 01.1 2H9v2a1 1 0 01-2 .1V13H5a1 1 0 01-.1-2H7V9c0-.6.4-1 1-1zm11-2h-4v5h4V6z"/></svg>',"table-insert-row-above":'<svg width="24" height="24"><path fill-rule="nonzero" d="M6 4a1 1 0 110 2H5v6h14V6h-1a1 1 0 010-2h2c.6 0 1 .4 1 1v13a2 2 0 01-2 2H5a2 2 0 01-2-2V5c0-.6.4-1 1-1h2zm5 10H5v4h6v-4zm8 0h-6v4h6v-4zM12 3c.5 0 1 .4 1 .9V6h2a1 1 0 010 2h-2v2a1 1 0 01-2 .1V8H9a1 1 0 010-2h2V4c0-.6.4-1 1-1z"/></svg>',"table-insert-row-after":'<svg width="24" height="24"><path fill-rule="nonzero" d="M12 13c.5 0 1 .4 1 .9V16h2a1 1 0 01.1 2H13v2a1 1 0 01-2 .1V18H9a1 1 0 01-.1-2H11v-2c0-.6.4-1 1-1zm6 7a1 1 0 010-2h1v-6H5v6h1a1 1 0 010 2H4a1 1 0 01-1-1V6c0-1.1.9-2 2-2h14a2 2 0 012 2v13c0 .5-.4 1-.9 1H18zM11 6H5v4h6V6zm8 0h-6v4h6V6z"/></svg>',"table-left-header":'<svg width="24" height="24"><path d="M19 4a2 2 0 012 2v12a2 2 0 01-2 2H5a2 2 0 01-2-2V6c0-1.1.9-2 2-2h14zm0 9h-4v5h4v-5zm-6 0H9v5h4v-5zm0-7H9v5h4V6zm6 0h-4v5h4V6z"/></svg>',"table-merge-cells":'<svg width="24" height="24"><path fill-rule="nonzero" d="M19 4a2 2 0 012 2v12a2 2 0 01-2 2H5a2 2 0 01-2-2V6c0-1.1.9-2 2-2h14zM5 15.5V18h3v-2.5H5zm14-5h-9V18h9v-7.5zM19 6h-4v2.5h4V6zM8 6H5v2.5h3V6zm5 0h-3v2.5h3V6zm-8 7.5h3v-3H5v3z"/></svg>',"table-row-numbering-rtl":'<svg width="24" height="24"><path d="M6 4a2 2 0 00-2 2v13c0 1.1.9 2 2 2h12a2 2 0 002-2V6a2 2 0 00-2-2H6zm0 12h8v3H6v-3zm11 0c.6 0 1 .4 1 1v1a1 1 0 01-2 0v-1c0-.6.4-1 1-1zM6 11h8v3H6v-3zm11 0c.6 0 1 .4 1 1v1a1 1 0 01-2 0v-1c0-.6.4-1 1-1zM6 6h8v3H6V6zm11 0c.6 0 1 .4 1 1v1a1 1 0 11-2 0V7c0-.6.4-1 1-1z"/></svg>',"table-row-numbering":'<svg width="24" height="24"><path d="M18 4a2 2 0 012 2v13a2 2 0 01-2 2H6a2 2 0 01-2-2V6c0-1.1.9-2 2-2h12zm0 12h-8v3h8v-3zM7 16a1 1 0 00-1 1v1a1 1 0 002 0v-1c0-.6-.4-1-1-1zm11-5h-8v3h8v-3zM7 11a1 1 0 00-1 1v1a1 1 0 002 0v-1c0-.6-.4-1-1-1zm11-5h-8v3h8V6zM7 6a1 1 0 00-1 1v1a1 1 0 102 0V7c0-.6-.4-1-1-1z"/></svg>',"table-row-properties":'<svg width="24" height="24"><path fill-rule="nonzero" d="M19 4a2 2 0 012 2v12a2 2 0 01-2 2H5a2 2 0 01-2-2V6c0-1.1.9-2 2-2h14zM5 15v3h6v-3H5zm14 0h-6v3h6v-3zm0-9h-6v3h6V6zM5 9h6V6H5v3z"/></svg>',"table-split-cells":'<svg width="24" height="24"><path fill-rule="nonzero" d="M19 4a2 2 0 012 2v12a2 2 0 01-2 2H5a2 2 0 01-2-2V6c0-1.1.9-2 2-2h14zM8 15.5H5V18h3v-2.5zm11-5h-9V18h9v-7.5zm-2.5 1l1 1-2 2 2 2-1 1-2-2-2 2-1-1 2-2-2-2 1-1 2 2 2-2zm-8.5-1H5v3h3v-3zM19 6h-4v2.5h4V6zM8 6H5v2.5h3V6zm5 0h-3v2.5h3V6z"/></svg>',"table-top-header":'<svg width="24" height="24"><path d="M19 4a2 2 0 012 2v12a2 2 0 01-2 2H5a2 2 0 01-2-2V6c0-1.1.9-2 2-2h14zm-8 11H5v3h6v-3zm8 0h-6v3h6v-3zm0-5h-6v3h6v-3zM5 13h6v-3H5v3z"/></svg>',table:'<svg width="24" height="24"><path fill-rule="nonzero" d="M19 4a2 2 0 012 2v12a2 2 0 01-2 2H5a2 2 0 01-2-2V6c0-1.1.9-2 2-2h14zM5 14v4h6v-4H5zm14 0h-6v4h6v-4zm0-6h-6v4h6V8zM5 12h6V8H5v4z"/></svg>',template:'<svg width="24" height="24"><path d="M19 19v-1H5v1h14zM9 16v-4a5 5 0 116 0v4h4a2 2 0 012 2v3H3v-3c0-1.1.9-2 2-2h4zm4 0v-5l.8-.6a3 3 0 10-3.6 0l.8.6v5h2z" fill-rule="nonzero"/></svg>',"temporary-placeholder":'<svg width="24" height="24"><g fill-rule="evenodd"><path d="M9 7.6V6h2.5V4.5a.5.5 0 111 0V6H15v1.6a8 8 0 11-6 0zm-2.6 5.3a.5.5 0 00.3.6c.3 0 .6 0 .6-.3l.1-.2a5 5 0 013.3-2.8c.3-.1.4-.4.4-.6-.1-.3-.4-.5-.6-.4a6 6 0 00-4.1 3.7z"/><circle cx="14" cy="4" r="1"/><circle cx="12" cy="2" r="1"/><circle cx="10" cy="4" r="1"/></g></svg>',"text-color":'<svg width="24" height="24"><g fill-rule="evenodd"><path id="tox-icon-text-color__color" d="M3 18h18v3H3z"/><path d="M8.7 16h-.8a.5.5 0 01-.5-.6l2.7-9c.1-.3.3-.4.5-.4h2.8c.2 0 .4.1.5.4l2.7 9a.5.5 0 01-.5.6h-.8a.5.5 0 01-.4-.4l-.7-2.2c0-.3-.3-.4-.5-.4h-3.4c-.2 0-.4.1-.5.4l-.7 2.2c0 .3-.2.4-.4.4zm2.6-7.6l-.6 2a.5.5 0 00.5.6h1.6a.5.5 0 00.5-.6l-.6-2c0-.3-.3-.4-.5-.4h-.4c-.2 0-.4.1-.5.4z"/></g></svg>',toc:'<svg width="24" height="24"><path d="M5 5c.6 0 1 .4 1 1s-.4 1-1 1a1 1 0 110-2zm3 0h11c.6 0 1 .4 1 1s-.4 1-1 1H8a1 1 0 110-2zm-3 8c.6 0 1 .4 1 1s-.4 1-1 1a1 1 0 010-2zm3 0h11c.6 0 1 .4 1 1s-.4 1-1 1H8a1 1 0 010-2zm0-4c.6 0 1 .4 1 1s-.4 1-1 1a1 1 0 110-2zm3 0h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 010-2zm-3 8c.6 0 1 .4 1 1s-.4 1-1 1a1 1 0 010-2zm3 0h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 010-2z" fill-rule="evenodd"/></svg>',translate:'<svg width="24" height="24"><path d="M12.7 14.3l-.3.7-.4.7-2.2-2.2-3.1 3c-.3.4-.8.4-1 0a.7.7 0 010-1l3.1-3A12.4 12.4 0 016.7 9H8a10.1 10.1 0 001.7 2.4c.5-.5 1-1.1 1.4-1.8l.9-2H4.7a.7.7 0 110-1.5h4.4v-.7c0-.4.3-.8.7-.8.4 0 .7.4.7.8v.7H15c.4 0 .8.3.8.7 0 .4-.4.8-.8.8h-1.4a12.3 12.3 0 01-1 2.4 13.5 13.5 0 01-1.7 2.3l1.9 1.8zm4.3-3l2.7 7.3a.5.5 0 01-.4.7 1 1 0 01-1-.7l-.6-1.5h-3.4l-.6 1.5a1 1 0 01-1 .7.5.5 0 01-.4-.7l2.7-7.4a1 1 0 012 0zm-2.2 4.4h2.4L16 12.5l-1.2 3.2z" fill-rule="evenodd"/></svg>',underline:'<svg width="24" height="24"><path d="M16 5c.6 0 1 .4 1 1v5.5a4 4 0 01-.4 1.8l-1 1.4a5.3 5.3 0 01-5.5 1 5 5 0 01-1.6-1c-.5-.4-.8-.9-1.1-1.4a4 4 0 01-.4-1.8V6c0-.6.4-1 1-1s1 .4 1 1v5.5c0 .3 0 .6.2 1l.6.7a3.3 3.3 0 002.2.8 3.4 3.4 0 002.2-.8c.3-.2.4-.5.6-.8l.2-.9V6c0-.6.4-1 1-1zM8 17h8c.6 0 1 .4 1 1s-.4 1-1 1H8a1 1 0 010-2z" fill-rule="evenodd"/></svg>',undo:'<svg width="24" height="24"><path d="M6.4 8H12c3.7 0 6.2 2 6.8 5.1.6 2.7-.4 5.6-2.3 6.8a1 1 0 01-1-1.8c1.1-.6 1.8-2.7 1.4-4.6-.5-2.1-2.1-3.5-4.9-3.5H6.4l3.3 3.3a1 1 0 11-1.4 1.4l-5-5a1 1 0 010-1.4l5-5a1 1 0 011.4 1.4L6.4 8z" fill-rule="nonzero"/></svg>',unlink:'<svg width="24" height="24"><path d="M6.2 12.3a1 1 0 011.4 1.4l-2 2a2 2 0 102.6 2.8l4.8-4.8a1 1 0 000-1.4 1 1 0 111.4-1.3 2.9 2.9 0 010 4L9.6 20a3.9 3.9 0 01-5.5-5.5l2-2zm11.6-.6a1 1 0 01-1.4-1.4l2.1-2a2 2 0 10-2.7-2.8L11 10.3a1 1 0 000 1.4A1 1 0 119.6 13a2.9 2.9 0 010-4L14.4 4a3.9 3.9 0 015.5 5.5l-2 2zM7.6 6.3a.8.8 0 01-1 1.1L3.3 4.2a.7.7 0 111-1l3.2 3.1zM5.1 8.6a.8.8 0 010 1.5H3a.8.8 0 010-1.5H5zm5-3.5a.8.8 0 01-1.5 0V3a.8.8 0 011.5 0V5zm6 11.8a.8.8 0 011-1l3.2 3.2a.8.8 0 01-1 1L16 17zm-2.2 2a.8.8 0 011.5 0V21a.8.8 0 01-1.5 0V19zm5-3.5a.7.7 0 110-1.5H21a.8.8 0 010 1.5H19z" fill-rule="nonzero"/></svg>',unlock:'<svg width="24" height="24"><path d="M16 5c.8 0 1.5.3 2.1.9.6.6.9 1.3.9 2.1v3h-2V8a1 1 0 00-.3-.7A1 1 0 0016 7h-2a1 1 0 00-.7.3 1 1 0 00-.3.7v3h.3c.2 0 .3 0 .5.2l.2.6v7.4c0 .3 0 .4-.2.6l-.6.2H4.8c-.3 0-.4 0-.6-.2a.7.7 0 01-.2-.6v-7.4c0-.3 0-.4.2-.6l.5-.2H11V8c0-.8.3-1.5.9-2.1.6-.6 1.3-.9 2.1-.9h2z" fill-rule="evenodd"/></svg>',"unordered-list":'<svg width="24" height="24"><path d="M11 5h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 010-2zm0 6h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 010-2zm0 6h8c.6 0 1 .4 1 1s-.4 1-1 1h-8a1 1 0 010-2zM4.5 6c0-.4.1-.8.4-1 .3-.4.7-.5 1.1-.5.4 0 .8.1 1 .4.4.3.5.7.5 1.1 0 .4-.1.8-.4 1-.3.4-.7.5-1.1.5-.4 0-.8-.1-1-.4-.4-.3-.5-.7-.5-1.1zm0 6c0-.4.1-.8.4-1 .3-.4.7-.5 1.1-.5.4 0 .8.1 1 .4.4.3.5.7.5 1.1 0 .4-.1.8-.4 1-.3.4-.7.5-1.1.5-.4 0-.8-.1-1-.4-.4-.3-.5-.7-.5-1.1zm0 6c0-.4.1-.8.4-1 .3-.4.7-.5 1.1-.5.4 0 .8.1 1 .4.4.3.5.7.5 1.1 0 .4-.1.8-.4 1-.3.4-.7.5-1.1.5-.4 0-.8-.1-1-.4-.4-.3-.5-.7-.5-1.1z" fill-rule="evenodd"/></svg>',unselected:'<svg width="24" height="24"><path fill-rule="nonzero" d="M6 4h12a2 2 0 012 2v12a2 2 0 01-2 2H6a2 2 0 01-2-2V6c0-1.1.9-2 2-2zm0 1a1 1 0 00-1 1v12c0 .6.4 1 1 1h12c.6 0 1-.4 1-1V6c0-.6-.4-1-1-1H6z"/></svg>',upload:'<svg width="24" height="24"><path d="M18 19v-2a1 1 0 012 0v3c0 .6-.4 1-1 1H5a1 1 0 01-1-1v-3a1 1 0 012 0v2h12zM11 6.4L8.7 8.7a1 1 0 01-1.4-1.4l4-4a1 1 0 011.4 0l4 4a1 1 0 11-1.4 1.4L13 6.4V16a1 1 0 01-2 0V6.4z" fill-rule="nonzero"/></svg>',user:'<svg width="24" height="24"><path d="M12 24a12 12 0 110-24 12 12 0 010 24zm-8.7-5.3a11 11 0 0017.4 0C19.4 16.3 14.6 15 12 15c-2.6 0-7.4 1.3-8.7 3.7zM12 13c2.2 0 4-2 4-4.5S14.2 4 12 4 8 6 8 8.5 9.8 13 12 13z" fill-rule="nonzero"/></svg>',"vertical-align":'<svg width="24" height="24"><g fill-rule="nonzero"><rect width="18" height="2" x="3" y="11" rx="1"/><path d="M12 2c.6 0 1 .4 1 1v4l2-1.3a1 1 0 011.2 1.5l-.1.1-4.1 3-4-3a1 1 0 011-1.7l2 1.5V3c0-.6.4-1 1-1zm0 11.8l4 2.9a1 1 0 01-1 1.7l-2-1.5V21c0 .5-.4 1-.9 1H12a1 1 0 01-1-1v-4l-2 1.3a1 1 0 01-1.2-.1l-.1-.1a1 1 0 01.1-1.3l.1-.1 4.1-3z"/></g></svg>',visualblocks:'<svg width="24" height="24"><path d="M9 19v2H7v-2h2zm-4 0v2a2 2 0 01-2-2h2zm8 0v2h-2v-2h2zm8 0a2 2 0 01-2 2v-2h2zm-4 0v2h-2v-2h2zM15 7a1 1 0 010 2v7a1 1 0 01-2 0V9h-1v7a1 1 0 01-2 0v-4a2.5 2.5 0 01-.2-5H15zM5 15v2H3v-2h2zm16 0v2h-2v-2h2zM5 11v2H3v-2h2zm16 0v2h-2v-2h2zM5 7v2H3V7h2zm16 0v2h-2V7h2zM5 3v2H3c0-1.1.9-2 2-2zm8 0v2h-2V3h2zm6 0a2 2 0 012 2h-2V3zM9 3v2H7V3h2zm8 0v2h-2V3h2z" fill-rule="evenodd"/></svg>',visualchars:'<svg width="24" height="24"><path d="M10 5h7a1 1 0 010 2h-1v11a1 1 0 01-2 0V7h-2v11a1 1 0 01-2 0v-6c-.5 0-1 0-1.4-.3A3.4 3.4 0 016.8 10a3.3 3.3 0 010-2.8 3.4 3.4 0 011.8-1.8L10 5z" fill-rule="evenodd"/></svg>',warning:'<svg width="24" height="24"><path d="M19.8 18.3c.2.5.3.9 0 1.2-.1.3-.5.5-1 .5H5.2c-.5 0-.9-.2-1-.5-.3-.3-.2-.7 0-1.2L11 4.7l.5-.5.5-.2c.2 0 .3 0 .5.2.2 0 .3.3.5.5l6.8 13.6zM12 18c.3 0 .5-.1.7-.3.2-.2.3-.4.3-.7a1 1 0 00-.3-.7 1 1 0 00-.7-.3 1 1 0 00-.7.3 1 1 0 00-.3.7c0 .3.1.5.3.7.2.2.4.3.7.3zm.7-3l.3-4a1 1 0 00-.3-.7 1 1 0 00-.7-.3 1 1 0 00-.7.3 1 1 0 00-.3.7l.3 4h1.4z" fill-rule="evenodd"/></svg>',"zoom-in":'<svg width="24" height="24"><path d="M16 17.3a8 8 0 111.4-1.4l4.3 4.4a1 1 0 01-1.4 1.4l-4.4-4.3zm-5-.3a6 6 0 100-12 6 6 0 000 12zm-1-9a1 1 0 012 0v6a1 1 0 01-2 0V8zm-2 4a1 1 0 010-2h6a1 1 0 010 2H8z" fill-rule="nonzero"/></svg>',"zoom-out":'<svg width="24" height="24"><path d="M16 17.3a8 8 0 111.4-1.4l4.3 4.4a1 1 0 01-1.4 1.4l-4.4-4.3zm-5-.3a6 6 0 100-12 6 6 0 000 12zm-3-5a1 1 0 010-2h6a1 1 0 010 2H8z" fill-rule="nonzero"/></svg>'}});
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/jquery.tinymce.min.js b/public/static/assets/gougu/module/tinymce/jquery.tinymce.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..46e24d2684c7c77348646bd3e78b5f8520f57999
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/jquery.tinymce.min.js
@@ -0,0 +1,91 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+/**
+ * Jquery integration plugin.
+ *
+ * @class tinymce.core.JqueryIntegration
+ * @private
+ */
+!function(){function f(){
+// Reference to tinymce needs to be lazily evaluated since tinymce
+// might be loaded through the compressor or other means
+return d.tinymce}var p,c,u,s=[],d="undefined"!=typeof global?global:window,m=d.jQuery;m.fn.tinymce=function(o){var e,t,i,n,l=this,r="";
+// No match then just ignore the call
+return l.length?
+// Get editor instance
+o?(l.css("visibility","hidden"),
+// Load TinyMCE on demand, if we need to
+d.tinymce||c||!(e=o.script_url)?
+// Delay the init call until tinymce is loaded
+1===c?s.push(a):a():(c=1,t=e.substring(0,e.lastIndexOf("/")),
+// Check if it's a dev/src version they want to load then
+// make sure that all plugins, themes etc are loaded in source mode as well
+-1!=e.indexOf(".min")&&(r=".min"),
+// Setup tinyMCEPreInit object this will later be used by the TinyMCE
+// core script to locate other resources like CSS files, dialogs etc
+// You can also predefined a tinyMCEPreInit object and then it will use that instead
+d.tinymce=d.tinyMCEPreInit||{base:t,suffix:r},
+// url contains gzip then we assume it's a compressor
+-1!=e.indexOf("gzip")&&(i=o.language||"en",e=e+(/\?/.test(e)?"&":"?")+"js=true&core=true&suffix="+escape(r)+"&themes="+escape(o.theme||"modern")+"&plugins="+escape(o.plugins||"")+"&languages="+(i||""),
+// Check if compressor script is already loaded otherwise setup a basic one
+d.tinyMCE_GZ||(d.tinyMCE_GZ={start:function(){function n(e){f().ScriptLoader.markDone(f().baseURI.toAbsolute(e))}
+// Add core languages
+n("langs/"+i+".js"),
+// Add themes with languages
+n("themes/"+o.theme+"/theme"+r+".js"),n("themes/"+o.theme+"/langs/"+i+".js"),
+// Add plugins with languages
+m.each(o.plugins.split(","),function(e,t){t&&(n("plugins/"+t+"/plugin"+r+".js"),n("plugins/"+t+"/langs/"+i+".js"))})},end:function(){}})),(n=document.createElement("script")).type="text/javascript",n.onload=n.onreadystatechange=function(e){e=e||window.event,2===c||"load"!=e.type&&!/complete|loaded/.test(n.readyState)||(f().dom.Event.domLoaded=1,c=2,
+// Execute callback after mainscript has been loaded and before the initialization occurs
+o.script_loaded&&o.script_loaded(),a(),m.each(s,function(e,t){t()}))},n.src=e,document.body.appendChild(n)),l):f()?f().get(l[0].id):null:l;function a(){var a=[],c=0;
+// Apply patches to the jQuery object, only once
+u||(v(),u=!0),
+// Create an editor instance for each matched node
+l.each(function(e,t){var n,i=t.id,r=o.oninit;
+// Generate unique id for target element if needed
+i||(t.id=i=f().DOM.uniqueId()),
+// Only init the editor once
+f().get(i)||(
+// Create editor instance and render it
+n=f().createEditor(i,o),a.push(n),n.on("init",function(){var e,t=r;l.css("visibility",""),
+// Run this if the oninit setting is defined
+// this logic will fire the oninit callback ones each
+// matched editor instance is initialized
+r&&++c==a.length&&("string"==typeof t&&(e=-1===t.indexOf(".")?null:f().resolve(t.replace(/\.\w+$/,"")),t=f().resolve(t)),
+// Call the oninit function with the object
+t.apply(e||f(),a))}))}),
+// Render the editor instances in a separate loop since we
+// need to have the full editors array used in the onInit calls
+m.each(a,function(e,t){t.render()})}},
+// Add :tinymce pseudo selector this will select elements that has been converted into editor instances
+// it's now possible to use things like $('*:tinymce') to get all TinyMCE bound elements.
+m.extend(m.expr[":"],{tinymce:function(e){var t;return!!(e.id&&"tinymce"in d&&(t=f().get(e.id))&&t.editorManager===f())}});
+// This function patches internal jQuery functions so that if
+// you for example remove an div element containing an editor it's
+// automatically destroyed by the TinyMCE API
+var v=function(){function r(e){
+// If the function is remove
+"remove"===e&&this.each(function(e,t){var n=u(t);n&&n.remove()}),this.find("span.mceEditor,div.mceEditor").each(function(e,t){var n=f().get(t.id.replace(/_parent$/,""));n&&n.remove()})}function o(i){var e,t=this;
+// Handle set value
+/*jshint eqnull:true */if(null!=i)r.call(t),
+// Saves the contents before get/set value of textarea/div
+t.each(function(e,t){var n;(n=f().get(t.id))&&n.setContent(i)});else if(0<t.length&&(e=f().get(t[0].id)))return e.getContent()}function l(e){return e&&e.length&&d.tinymce&&e.is(":tinymce")}
+// Removes any child editor instances by looking for editor wrapper elements
+var u=function(e){var t=null;return e&&e.id&&d.tinymce?f().get(e.id):t},s={};
+// Loads or saves contents from/to textarea if the value
+// argument is defined it will set the TinyMCE internal contents
+// Patch some setter/getter functions these will
+// now be able to set/get the contents of editor instances for
+// example $('#editorid').html('Content'); will update the TinyMCE iframe instance
+m.each(["text","html","val"],function(e,t){var a=s[t]=m.fn[t],c="text"===t;m.fn[t]=function(e){var t=this;if(!l(t))return a.apply(t,arguments);if(e!==p)return o.call(t.filter(":tinymce"),e),a.apply(t.not(":tinymce"),arguments),t;// return original set for chaining
+var i="",r=arguments;return(c?t:t.eq(0)).each(function(e,t){var n=u(t);i+=n?c?n.getContent().replace(/<(?:"[^"]*"|'[^']*'|[^'">])*>/g,""):n.getContent({save:!0}):a.apply(m(t),r)}),i}}),
+// Makes it possible to use $('#id').append("content"); to append contents to the TinyMCE editor iframe
+m.each(["append","prepend"],function(e,t){var n=s[t]=m.fn[t],r="prepend"===t;m.fn[t]=function(i){var e=this;return l(e)?i!==p?("string"==typeof i&&e.filter(":tinymce").each(function(e,t){var n=u(t);n&&n.setContent(r?i+n.getContent():n.getContent()+i)}),n.apply(e.not(":tinymce"),arguments),e):void 0:n.apply(e,arguments)}}),
+// Makes sure that the editor instance gets properly destroyed when the parent element is removed
+m.each(["remove","replaceWith","replaceAll","empty"],function(e,t){var n=s[t]=m.fn[t];m.fn[t]=function(){return r.call(this,t),n.apply(this,arguments)}}),s.attr=m.fn.attr,
+// Makes sure that $('#tinymce_id').attr('value') gets the editors current HTML contents
+m.fn.attr=function(e,t){var n=this,i=arguments;if(!e||"value"!==e||!l(n))return s.attr.apply(n,i);if(t!==p)return o.call(n.filter(":tinymce"),t),s.attr.apply(n.not(":tinymce"),i),n;// return original set for chaining
+var r=n[0],a=u(r);return a?a.getContent({save:!0}):s.attr.apply(m(r),i)}}}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/langs/README.md b/public/static/assets/gougu/module/tinymce/langs/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..a52bf03f9a3ae977eaca0d3f4c406199cc15b023
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/langs/README.md
@@ -0,0 +1,3 @@
+This is where language files should be placed.
+
+Please DO NOT translate these directly use this service: https://www.transifex.com/projects/p/tinymce/
diff --git a/public/static/assets/gougu/module/tinymce/langs/zh_CN.js b/public/static/assets/gougu/module/tinymce/langs/zh_CN.js
new file mode 100644
index 0000000000000000000000000000000000000000..a9e86f2c8c8efa6552407f51389d66ceb2fe3696
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/langs/zh_CN.js
@@ -0,0 +1,417 @@
+tinymce.addI18n('zh_CN',{
+"Redo": "恢复",
+"Undo": "撤销",
+"Cut": "剪切",
+"Copy": "复制",
+"Paste": "粘贴",
+"Select all": "全选",
+"New document": "新建文档",
+"Ok": "确定",
+"Cancel": "取消",
+"Visual aids": "网格线",
+"Bold": "粗体",
+"Italic": "斜体",
+"Underline": "下划线",
+"Strikethrough": "删除线",
+"Superscript": "上标",
+"Subscript": "下标",
+"Clear formatting": "清除格式",
+"Align left": "左对齐",
+"Align center": "居中",
+"Align right": "右对齐",
+"Justify": "两端对齐",
+"Bullet list": "符号列表",
+"Numbered list": "数字列表",
+"Decrease indent": "减少缩进",
+"Increase indent": "增加缩进",
+"Close": "关闭",
+"Formats": "格式",
+"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "当前浏览器不支持访问剪贴板，请使用快捷键Ctrl+X/C/V复制粘贴",
+"Headers": "标题",
+"Header 1": "标题1",
+"Header 2": "标题2",
+"Header 3": "标题3",
+"Header 4": "标题4",
+"Header 5": "标题5",
+"Header 6": "标题6",
+"Headings": "标题",
+"Heading 1": "标题1",
+"Heading 2": "标题2",
+"Heading 3": "标题3",
+"Heading 4": "标题4",
+"Heading 5": "标题5",
+"Heading 6": "标题6",
+"Preformatted": "预格式化",
+"Div": "Div区块",
+"Pre": "预格式文本",
+"Code": "代码",
+"Paragraph": "段落",
+"Blockquote": "引用",
+"Inline": "文本",
+"Blocks": "区块",
+"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "当前为纯文本粘贴模式，再次点击可以回到普通粘贴模式。",
+"Fonts": "字体",
+"Font Sizes": "字号",
+"Class": "Class",
+"Browse for an image": "浏览图像",
+"OR": "或",
+"Drop an image here": "拖放一张图片文件至此",
+"Upload": "上传",
+"Block": "块",
+"Align": "对齐",
+"Default": "默认",
+"Circle": "空心圆",
+"Disc": "实心圆",
+"Square": "方块",
+"Lower Alpha": "小写英文字母",
+"Lower Greek": "小写希腊字母",
+"Lower Roman": "小写罗马字母",
+"Upper Alpha": "大写英文字母",
+"Upper Roman": "大写罗马字母",
+"Anchor...": "锚点...",
+"Name": "名称",
+"Id": "id",
+"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "id应该以字母开头，后跟字母、数字、横线、点、冒号或下划线。",
+"You have unsaved changes are you sure you want to navigate away?": "你对文档的修改尚未保存，确定离开吗？",
+"Restore last draft": "恢复上次的草稿",
+"Special characters...": "特殊字符...",
+"Source code": "HTML源码",
+"Insert\/Edit code sample": "插入/编辑代码示例",
+"Language": "语言",
+"Code sample...": "代码示例...",
+"Color Picker": "选取颜色",
+"R": "R",
+"G": "G",
+"B": "B",
+"Left to right": "从左到右",
+"Right to left": "从右到左",
+"Emoticons...": "表情符号...",
+"Metadata and Document Properties": "元数据和文档属性",
+"Title": "标题",
+"Keywords": "关键词",
+"Description": "描述",
+"Robots": "机器人",
+"Author": "作者",
+"Encoding": "编码",
+"Fullscreen": "全屏",
+"Action": "操作",
+"Shortcut": "快捷键",
+"Help": "帮助",
+"Address": "地址",
+"Focus to menubar": "移动焦点到菜单栏",
+"Focus to toolbar": "移动焦点到工具栏",
+"Focus to element path": "移动焦点到元素路径",
+"Focus to contextual toolbar": "移动焦点到上下文菜单",
+"Insert link (if link plugin activated)": "插入链接 (如果链接插件已激活)",
+"Save (if save plugin activated)": "保存(如果保存插件已激活)",
+"Find (if searchreplace plugin activated)": "查找(如果查找替换插件已激活)",
+"Plugins installed ({0}):": "已安装插件 ({0})：",
+"Premium plugins:": "优秀插件：",
+"Learn more...": "了解更多...",
+"You are using {0}": "你正在使用 {0}",
+"Plugins": "插件",
+"Handy Shortcuts": "快捷键",
+"Horizontal line": "水平分割线",
+"Insert\/edit image": "插入/编辑图片",
+"Image description": "图片描述",
+"Source": "地址",
+"Dimensions": "大小",
+"Constrain proportions": "保持宽高比",
+"General": "常规",
+"Advanced": "高级",
+"Style": "样式",
+"Vertical space": "垂直边距",
+"Horizontal space": "水平边距",
+"Border": "边框",
+"Insert image": "插入图片",
+"Image...": "图片...",
+"Image list": "图片列表",
+"Rotate counterclockwise": "逆时针旋转",
+"Rotate clockwise": "顺时针旋转",
+"Flip vertically": "垂直翻转",
+"Flip horizontally": "水平翻转",
+"Edit image": "编辑图片",
+"Image options": "图片选项",
+"Zoom in": "放大",
+"Zoom out": "缩小",
+"Crop": "裁剪",
+"Resize": "调整大小",
+"Orientation": "方向",
+"Brightness": "亮度",
+"Sharpen": "锐化",
+"Contrast": "对比度",
+"Color levels": "色阶",
+"Gamma": "伽马值",
+"Invert": "反转",
+"Apply": "应用",
+"Back": "后退",
+"Insert date\/time": "插入日期/时间",
+"Date\/time": "日期/时间",
+"Insert\/Edit Link": "插入/编辑链接",
+"Insert\/edit link": "插入/编辑链接",
+"Text to display": "显示文字",
+"Url": "地址",
+"Open link in...": "链接打开方式...",
+"Current window": "当前窗口打开",
+"None": "在当前窗口/框架打开",
+"New window": "在新窗口打开",
+"Remove link": "删除链接",
+"Anchors": "锚点",
+"Link...": "链接...",
+"Paste or type a link": "粘贴或输入链接",
+"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "你所填写的URL地址为邮件地址，需要加上mailto:前缀吗？",
+"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "你所填写的URL地址属于外部链接，需要加上http://:前缀吗？",
+"Link list": "链接列表",
+"Insert video": "插入视频",
+"Insert\/edit video": "插入/编辑视频",
+"Insert\/edit media": "插入/编辑媒体",
+"Alternative source": "替代资源",
+"Alternative image URL": "资源备用地址",
+"Media poster (Image URL)": "封面(图片地址)",
+"Paste your embed code below:": "将内嵌代码粘贴在下面:",
+"Embed": "内嵌",
+"Media...": "多媒体...",
+"Nonbreaking space": "不间断空格",
+"Page break": "分页符",
+"Paste as text": "粘贴为文本",
+"Preview": "预览",
+"Print...": "打印...",
+"Save": "保存",
+"Find": "查找",
+"Replace with": "替换为",
+"Replace": "替换",
+"Replace all": "替换全部",
+"Previous": "上一个",
+"Next": "下一个",
+"Find and replace...": "查找并替换...",
+"Could not find the specified string.": "未找到搜索内容。",
+"Match case": "区分大小写",
+"Find whole words only": "全单词匹配",
+"Spell check": "拼写检查",
+"Ignore": "忽略",
+"Ignore all": "忽略全部",
+"Finish": "完成",
+"Add to Dictionary": "添加到字典",
+"Insert table": "插入表格",
+"Table properties": "表格属性",
+"Delete table": "删除表格",
+"Cell": "单元格",
+"Row": "行",
+"Column": "列",
+"Cell properties": "单元格属性",
+"Merge cells": "合并单元格",
+"Split cell": "拆分单元格",
+"Insert row before": "在上方插入",
+"Insert row after": "在下方插入",
+"Delete row": "删除行",
+"Row properties": "行属性",
+"Cut row": "剪切行",
+"Copy row": "复制行",
+"Paste row before": "粘贴到上方",
+"Paste row after": "粘贴到下方",
+"Insert column before": "在左侧插入",
+"Insert column after": "在右侧插入",
+"Delete column": "删除列",
+"Cols": "列",
+"Rows": "行",
+"Width": "宽",
+"Height": "高",
+"Cell spacing": "单元格外间距",
+"Cell padding": "单元格内边距",
+"Show caption": "显示标题",
+"Left": "左对齐",
+"Center": "居中",
+"Right": "右对齐",
+"Cell type": "单元格类型",
+"Scope": "范围",
+"Alignment": "对齐方式",
+"H Align": "水平对齐",
+"V Align": "垂直对齐",
+"Top": "顶部对齐",
+"Middle": "垂直居中",
+"Bottom": "底部对齐",
+"Header cell": "表头单元格",
+"Row group": "行组",
+"Column group": "列组",
+"Row type": "行类型",
+"Header": "表头",
+"Body": "表体",
+"Footer": "表尾",
+"Border color": "边框颜色",
+"Insert template...": "插入模板...",
+"Templates": "模板",
+"Template": "模板",
+"Text color": "文字颜色",
+"Background color": "背景色",
+"Custom...": "自定义...",
+"Custom color": "自定义颜色",
+"No color": "无",
+"Remove color": "删除颜色",
+"Table of Contents": "目录",
+"Show blocks": "显示区块边框",
+"Show invisible characters": "显示不可见字符",
+"Word count": "字数统计",
+"Words: {0}": "字数：{0}",
+"{0} words": "{0} 个字",
+"File": "文件",
+"Edit": "编辑",
+"Insert": "插入",
+"View": "查看",
+"Format": "格式",
+"Table": "表格",
+"Tools": "工具",
+"Powered by {0}": "Powered by {0}",
+"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "在编辑区按ALT+F9打开菜单，按ALT+F10打开工具栏，按ALT+0查看帮助",
+"Image title": "图片标题",
+"Border width": "边框宽度",
+"Border style": "边框样式",
+"Error": "错误",
+"Warn": "警告",
+"Valid": "有效",
+"To open the popup, press Shift+Enter": "此快捷为软回车（插入<br>）",
+"Rich Text Area. Press ALT-0 for help.": "编辑区. 按Alt+0键打开帮助",
+"System Font": "默认字体",
+"Failed to upload image: {0}": "图片上传失败: {0}",
+"Failed to load plugin: {0} from url {1}": "插件加载失败: {0} - {1}",
+"Failed to load plugin url: {0}": "插件加载失败: {0}",
+"Failed to initialize plugin: {0}": "插件初始化失败: {0}",
+"example": "示例",
+"Search": "查找",
+"All": "全部",
+"Currency": "货币",
+"Text": "文本",
+"Quotations": "引用",
+"Mathematical": "数学运算符",
+"Extended Latin": "拉丁语扩充",
+"Symbols": "符号",
+"Arrows": "箭头",
+"User Defined": "自定义",
+"dollar sign": "美元",
+"currency sign": "货币",
+"euro-currency sign": "欧元",
+"colon sign": "冒号",
+"cruzeiro sign": "克鲁赛罗币",
+"french franc sign": "法郎",
+"lira sign": "里拉",
+"mill sign": "密尔",
+"naira sign": "奈拉",
+"peseta sign": "比塞塔",
+"rupee sign": "卢比",
+"won sign": "韩元",
+"new sheqel sign": "新谢克尔",
+"dong sign": "越南盾",
+"kip sign": "老挝基普",
+"tugrik sign": "图格里克",
+"drachma sign": "德拉克马",
+"german penny symbol": "德国便士",
+"peso sign": "比索",
+"guarani sign": "瓜拉尼",
+"austral sign": "澳元",
+"hryvnia sign": "格里夫尼亚",
+"cedi sign": "塞地",
+"livre tournois sign": "里弗弗尔",
+"spesmilo sign": "一千spesoj的货币符号，该货币未使用",
+"tenge sign": "坚戈",
+"indian rupee sign": "印度卢比",
+"turkish lira sign": "土耳其里拉",
+"nordic mark sign": "北欧马克",
+"manat sign": "马纳特",
+"ruble sign": "卢布",
+"yen character": "日元",
+"yuan character": "人民币元",
+"yuan character, in hong kong and taiwan": "元的繁体字",
+"yen\/yuan character variant one": "元（大写）",
+"Loading emoticons...": "正在加载表情文字...",
+"Could not load emoticons": "不能加载表情文字",
+"People": "人类",
+"Animals and Nature": "动物和自然",
+"Food and Drink": "食物和饮品",
+"Activity": "活动",
+"Travel and Places": "旅游和地点",
+"Objects": "物件",
+"Flags": "旗帜",
+"Characters": "字数",
+"Characters (no spaces)": "字数（不含空格）",
+"Error: Form submit field collision.": "错误: 表单提交字段冲突.",
+"Error: No form element found.": "错误: 未找到可用的form.",
+"Update": "更新",
+"Color swatch": "颜色样本",
+"Turquoise": "青绿",
+"Green": "绿色",
+"Blue": "蓝色",
+"Purple": "紫色",
+"Navy Blue": "海军蓝",
+"Dark Turquoise": "深蓝绿色",
+"Dark Green": "暗绿",
+"Medium Blue": "中蓝",
+"Medium Purple": "中紫",
+"Midnight Blue": "深蓝",
+"Yellow": "黄色",
+"Orange": "橙色",
+"Red": "红色",
+"Light Gray": "浅灰",
+"Gray": "灰色",
+"Dark Yellow": "暗黄",
+"Dark Orange": "暗橙",
+"Dark Red": "暗红",
+"Medium Gray": "中灰",
+"Dark Gray": "深灰",
+"Black": "黑色",
+"White": "白色",
+"Switch to or from fullscreen mode": "切换全屏模式",
+"Open help dialog": "打开帮助对话框",
+"history": "历史",
+"styles": "样式",
+"formatting": "格式化",
+"alignment": "对齐",
+"indentation": "缩进",
+"permanent pen": "记号笔",
+"comments": "注释",
+"Anchor": "锚点",
+"Special character": "特殊字符",
+"Code sample": "代码示例",
+"Color": "颜色",
+"Emoticons": "表情",
+"Document properties": "文档属性",
+"Image": "图片",
+"Insert link": "插入链接",
+"Target": "目标",
+"Link": "链接",
+"Poster": "封面",
+"Media": "音视频",
+"Print": "打印",
+"Prev": "上一个",
+"Find and replace": "查找并替换",
+"Whole words": "全字匹配",
+"Spellcheck": "拼写检查",
+"Caption": "标题",
+"Insert template": "插入模板",
+//以下为补充汉化内容 by 莫若卿
+"Code view": "代码区域",
+"Select...": "选择...",
+"Format Painter": "格式刷",
+"No templates defined.": "无内置模板",
+"Special character...": "特殊字符...",
+"Open link": "打开链接",
+"None": "无",
+"Count": "统计",
+"Document": "整个文档",
+"Selection": "选取部分",
+"Words": "字词数",
+"{0} characters": "{0} 个字符",
+"Alternative source URL": "替代资源地址",
+"Alternative description": "替代说明文字",
+"Accessibility": "可访问性",
+"Image is decorative": "仅用于装饰",
+//5.6新增
+"Line height": "行高",
+"Cut column": "剪切列",
+"Copy column": "复制列",
+"Paste column before": "粘贴到前方",
+"Paste column after": "粘贴到后方",
+"Copy column": "复制列",
+//帮助窗口内的文字
+"Version": "版本",
+"Keyboard Navigation": "键盘导航",
+"Open popup menu for split buttons": "该组合键的作用是软回车（插入br）",
+});
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/license.txt b/public/static/assets/gougu/module/tinymce/license.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b17fc90494cf7573951fdbcccc9d2df35ad95797
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/license.txt
@@ -0,0 +1,504 @@
+      GNU LESSER GENERAL PUBLIC LICENSE
+           Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+          Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+      GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+          NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+         END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+
diff --git a/public/static/assets/gougu/module/tinymce/plugins/advlist/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/advlist/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..78c96637d5caa8d60a95b6962a0d9b2a52bd3508
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/advlist/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function f(t,e,n){t.execCommand("UL"===e?"InsertUnorderedList":"InsertOrderedList",!1,!1===n?null:{"list-style-type":n})}function i(t){return function(){return t}}function t(t){return t}function e(){return s}var n=tinymce.util.Tools.resolve("tinymce.PluginManager"),g=tinymce.util.Tools.resolve("tinymce.util.Tools"),u=i(!1),l=i(!0),s={fold:function(t,e){return t()},isSome:u,isNone:l,getOr:t,getOrThunk:r,getOrDie:function(t){throw new Error(t||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(void 0),or:t,orThunk:r,map:e,each:function(){},bind:e,exists:u,forall:l,filter:function(){return s},toArray:function(){return[]},toString:i("none()")};function r(t){return t()}function d(t){return t&&/^(TH|TD)$/.test(t.nodeName)}function m(c,a){return function(s){function t(t){var e,n,r,o,i,u,l;s.setActive((e=c,r=a,i=-1!==(o=function(t,e){for(var n=0;n<t.length;n++)if(e(t[n]))return n;return-1}((n=t).parents,d))?n.parents.slice(0,o):n.parents,0<(u=g.grep(i,(l=e,function(t){return t&&/^(OL|UL|DL)$/.test(t.nodeName)&&(e=t,l.$.contains(l.getBody(),e));var e}))).length&&u[0].nodeName===r))}return c.on("NodeChange",t),function(){return c.off("NodeChange",t)}}}function c(t,e,n,r,o,i){var u,l,s,c,a,d;1<i.length?(c=r,a=o,d=i,(s=t).ui.registry.addSplitButton(e,{tooltip:n,icon:"OL"===a?"ordered-list":"unordered-list",presets:"listpreview",columns:3,fetch:function(t){t(g.map(d,function(t){return{type:"choiceitem",value:"default"===t?"":t,icon:"list-"+("OL"===a?"num":"bull")+"-"+("disc"===t||"decimal"===t?"default":t),text:t.replace(/\-/g," ").replace(/\b\w/g,function(t){return t.toUpperCase()})}}))},onAction:function(){return s.execCommand(c)},onItemAction:function(t,e){f(s,a,e)},select:function(e){var t,n=(t=s).dom.getParent(t.selection.getNode(),"ol,ul"),r=t.dom.getStyle(n,"listStyleType");return p(r).map(function(t){return e===t}).getOr(!1)},onSetup:m(s,a)})):(l=r,(u=t).ui.registry.addToggleButton(e,{active:!1,tooltip:n,icon:"OL"===o?"ordered-list":"unordered-list",onSetup:m(u,o),onAction:function(){return u.execCommand(l)}}))}var a=function(n){function t(){return o}function e(t){return t(n)}var r=i(n),o={fold:function(t,e){return e(n)},isSome:l,isNone:u,getOr:r,getOrThunk:r,getOrDie:r,getOrNull:r,getOrUndefined:r,or:t,orThunk:t,map:function(t){return a(t(n))},each:function(t){t(n)},bind:e,exists:e,forall:e,filter:function(t){return t(n)?o:s},toArray:function(){return[n]},toString:function(){return"some("+n+")"}};return o},p=function(t){return null==t?s:a(t)};n.add("advlist",function(t){var n,e,r,o;t.hasPlugin("lists")?(c(e=t,"numlist","Numbered list","InsertOrderedList","OL",(r=e.getParam("advlist_number_styles","default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman"))?r.split(/[ ,]/):[]),c(e,"bullist","Bullet list","InsertUnorderedList","UL",(o=e.getParam("advlist_bullet_styles","default,circle,square"))?o.split(/[ ,]/):[]),(n=t).addCommand("ApplyUnorderedListStyle",function(t,e){f(n,"UL",e["list-style-type"])}),n.addCommand("ApplyOrderedListStyle",function(t,e){f(n,"OL",e["list-style-type"])})):console.error("Please use the Lists plugin together with the Advanced List plugin.")})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/anchor/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/anchor/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..06fcf3b3db6968e3fca2f1a1cfaf70af57831136
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/anchor/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function a(e){return e.getAttribute("id")||e.getAttribute("name")||""}function c(e){return e&&"a"===e.nodeName.toLowerCase()&&!e.getAttribute("href")&&""!==a(e)}function d(e){return e.dom.getParent(e.selection.getStart(),l)}function r(e,t){var o,a,n,r,i,l=d(e);l?(n=e,r=t,(i=l).removeAttribute("name"),i.id=r,n.addVisual(),n.undoManager.add()):(a=t,(o=e).undoManager.transact(function(){var e,n;o.getParam("allow_html_in_named_anchor",!1,"boolean")||o.selection.collapse(!0),o.selection.isCollapsed()?o.insertContent(o.dom.createHTML("a",{id:a})):(n=(e=o).dom,u(n).walk(e.selection.getRng(),function(e){s.each(e,function(e){var t;c(t=e)&&!t.firstChild&&n.remove(e,!1)})}),o.formatter.remove("namedAnchor",null,null,!0),o.formatter.apply("namedAnchor",{value:a}),o.addVisual())})),e.focus()}function i(r){return function(e){for(var t,n=0;n<e.length;n++){var o=e[n],a=void 0;!(a=t=o)||a.attr("href")||!a.attr("id")&&!a.attr("name")||t.firstChild||o.attr("contenteditable",r)}}}var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),u=tinymce.util.Tools.resolve("tinymce.dom.RangeUtils"),s=tinymce.util.Tools.resolve("tinymce.util.Tools"),l="a:not([href])";e.add("anchor",function(e){var t,n,o;(t=e).on("PreInit",function(){t.parser.addNodeFilter("a",i("false")),t.serializer.addNodeFilter("a",i(null))}),(n=e).addCommand("mceAnchor",function(){var o,e,t;t=(e=d(o=n))?a(e):"",o.windowManager.open({title:"Anchor",size:"normal",body:{type:"panel",items:[{name:"id",type:"input",label:"ID",placeholder:"example"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{id:t},onSubmit:function(e){var t=o,n=e.getData().id;(/^[A-Za-z][A-Za-z0-9\-:._]*$/.test(n)?(r(t,n),0):(t.windowManager.alert("Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores."),1))||e.close()}})}),(o=e).ui.registry.addToggleButton("anchor",{icon:"bookmark",tooltip:"Anchor",onAction:function(){return o.execCommand("mceAnchor")},onSetup:function(e){return o.selection.selectorChangedWithUnbind("a:not([href])",e.setActive).unbind}}),o.ui.registry.addMenuItem("anchor",{icon:"bookmark",text:"Anchor...",onAction:function(){return o.execCommand("mceAnchor")}}),e.on("PreInit",function(){e.formatter.register("namedAnchor",{inline:"a",selector:l,remove:"all",split:!0,deep:!0,attributes:{id:"%value"},onmatch:c})})})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/autolink/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/autolink/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..19d2d5932f4af826b5d3355048596ab22fe466fa
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/autolink/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function o(e,t){var n;return t<0&&(t=0),3!==e.nodeType||(n=e.data.length)<t&&(t=n),t}function p(e,t,n){1!==t.nodeType||t.hasChildNodes()?e.setStart(t,o(t,n)):e.setStartBefore(t)}function A(e,t,n){1!==t.nodeType||t.hasChildNodes()?e.setEnd(t,o(t,n)):e.setEndAfter(t)}function i(e,t,n){var o,i,r,a,d,s,l=e.getParam("autolink_pattern",v),f=e.getParam("default_link_target",!1);if("A"!==e.selection.getNode().tagName){var c=e.selection.getRng().cloneRange();if(c.startOffset<5){if(!(a=c.endContainer.previousSibling)){if(!c.endContainer.firstChild||!c.endContainer.firstChild.nextSibling)return;a=c.endContainer.firstChild.nextSibling}if(p(c,a,d=a.length),A(c,a,d),c.endOffset<5)return;o=c.endOffset,i=a}else{if(3!==(i=c.endContainer).nodeType&&i.firstChild){for(;3!==i.nodeType&&i.firstChild;)i=i.firstChild;3===i.nodeType&&(p(c,i,0),A(c,i,i.nodeValue.length))}o=1===c.endOffset?2:c.endOffset-1-t}for(var g,u=o;p(c,i,2<=o?o-2:0),A(c,i,1<=o?o-1:0),--o," "!==(s=c.toString())&&""!==s&&160!==s.charCodeAt(0)&&0<=o-2&&s!==n;);(g=c.toString())===n||" "===g||160===g.charCodeAt(0)?(p(c,i,o),A(c,i,u),o+=1):(0===c.startOffset?p(c,i,0):p(c,i,o),A(c,i,u)),h=c.toString(),/[?!,.;:]/.test(h.charAt(h.length-1))&&A(c,i,u-1);var h,C,m,y,k=(h=c.toString().trim()).match(l),w=e.getParam("link_default_protocol","http","string");k&&((m=C=k[0]).length>=(y="www.").length&&m.substr(0,0+y.length)===y?C=w+"://"+C:-1===C.indexOf("@")||/^([A-Za-z][A-Za-z\d.+-]*:\/\/)|mailto:/.test(C)||(C="mailto:"+C),r=e.selection.getBookmark(),e.selection.setRng(c),e.execCommand("createlink",!1,C),!1!==f&&e.dom.setAttrib(e.selection.getNode(),"target",f),e.selection.moveToBookmark(r),e.nodeChanged())}}var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),r=tinymce.util.Tools.resolve("tinymce.Env"),v=new RegExp("^"+/(?:[A-Za-z][A-Za-z\d.+-]{0,14}:\/\/(?:[-.~*+=!&;:'%@?^${}(),\w]+@)?|www\.|[-;:&=+$,.\w]+@)[A-Za-z\d-]+(?:\.[A-Za-z\d-]+)*(?::\d+)?(?:\/(?:[-+~=.,%()\/\w]*[-+~=%()\/\w])?)?(?:\?(?:[-.~*+=!&;:'%@?^${}(),\/\w]+))?(?:#(?:[-.~*+=!&;:'%@?^${}(),\/\w]+))?/g.source+"$","i");e.add("autolink",function(e){var t,n;(t=e).on("keydown",function(e){13===e.keyCode&&i(t,-1,"")}),r.browser.isIE()?t.on("focus",function(){if(!n){n=!0;try{t.execCommand("AutoUrlDetect",!1,!0)}catch(e){}}}):(t.on("keypress",function(e){41===e.keyCode&&i(t,-1,"(")}),t.on("keyup",function(e){32===e.keyCode&&i(t,0,"")}))})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/autoresize/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/autoresize/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..d558aedf8bb99097484f887884c3623aee8f9458
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/autoresize/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function y(e){return e.getParam("min_height",e.getElement().offsetHeight,"number")}function p(e,t){var n=e.getBody();n&&(n.style.overflowY=t?"":"hidden",t||(n.scrollTop=0))}function v(e,t,n,i){var o=parseInt(e.getStyle(t,n,i),10);return isNaN(o)?0:o}var l=Object.hasOwnProperty,e=tinymce.util.Tools.resolve("tinymce.PluginManager"),b=tinymce.util.Tools.resolve("tinymce.Env"),r=tinymce.util.Tools.resolve("tinymce.util.Delay"),u=function(e,t,n,i,o){r.setEditorTimeout(e,function(){C(e,t),n--?u(e,t,n,i,o):o&&o()},i)},C=function(e,t,n){var i,o,r,s,a,l,u,g,c,m,f,d=e.dom,h=e.getDoc();h&&(e.plugins.fullscreen&&e.plugins.fullscreen.isFullscreen()?p(e,!0):(i=h.documentElement,o=e.getParam("autoresize_bottom_margin",50,"number"),r=y(e),s=v(d,i,"margin-top",!0),a=v(d,i,"margin-bottom",!0),(l=(l=i.offsetHeight+s+a+o)<0?0:l)+(u=e.getContainer().offsetHeight-e.getContentAreaContainer().offsetHeight)>y(e)&&(r=l+u),(g=e.getParam("max_height",0,"number"))&&g<r?(r=g,p(e,!0)):p(e,!1),r!==t.get()&&(c=r-t.get(),d.setStyle(e.getContainer(),"height",r+"px"),t.set(r),e.fire("ResizeEditor"),b.browser.isSafari()&&b.mac&&(m=e.getWin()).scrollTo(m.pageXOffset,m.pageYOffset),!e.hasFocus()||"setcontent"!==(null==(f=n)?void 0:f.type.toLowerCase())||!0!==f.selection&&!0!==f.paste||e.selection.scrollIntoView(),b.webkit&&c<0&&C(e,t,n))))};e.add("autoresize",function(e){var t,n,i,o,r,s,a=e.settings;l.call(a,"resize")||(e.settings.resize=!1),e.inline||(s=0,r=t={get:function(){return s},set:function(e){s=e}},(o=e).addCommand("mceAutoResize",function(){C(o,r)}),i=t,(n=e).on("init",function(){var e=n.getParam("autoresize_overflow_padding",1,"number"),t=n.dom;t.setStyles(n.getDoc().documentElement,{height:"auto"}),t.setStyles(n.getBody(),{paddingLeft:e,paddingRight:e,"min-height":0})}),n.on("NodeChange SetContent keyup FullscreenStateChanged ResizeContent",function(e){C(n,i,e)}),n.getParam("autoresize_on_init",!0,"boolean")&&n.on("init",function(){u(n,i,20,100,function(){u(n,i,5,1e3)})}))})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/autosave/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/autosave/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..ef3bc584f09458b88614c621fc01e0fb811afa6c
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/autosave/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function o(t,e){var r=t||e,n=/^(\d+)([ms]?)$/.exec(""+r);return(n[2]?{s:1e3,m:6e4}[n[2]]:1)*parseInt(r,10)}function n(t){var e=document.location;return t.getParam("autosave_prefix","tinymce-autosave-{path}{query}{hash}-{id}-").replace(/{path}/g,e.pathname).replace(/{query}/g,e.search).replace(/{hash}/g,e.hash).replace(/{id}/g,t.id)}function i(t,e){if(a(e))return t.dom.isEmpty(t.getBody());var r=d.trim(e);if(""===r)return!0;var n=(new DOMParser).parseFromString(r,"text/html");return t.dom.isEmpty(n)}function u(t){var e=parseInt(v.getItem(n(t)+"time"),10)||0;return!((new Date).getTime()-e>o(t.getParam("autosave_retention"),"20m")&&(g(t,!1),1))}function s(t){var e=n(t);!i(t)&&t.isDirty()&&(v.setItem(e+"draft",t.getContent({format:"raw",no_events:!0})),v.setItem(e+"time",(new Date).getTime().toString()),t.fire("StoreDraft"))}function f(t){var e=n(t);u(t)&&(t.setContent(v.getItem(e+"draft"),{format:"raw"}),t.fire("RestoreDraft"))}function c(t){t.undoManager.transact(function(){f(t),g(t)}),t.focus()}function m(r){return function(t){function e(){return t.setDisabled(!u(r))}return t.setDisabled(!u(r)),r.on("StoreDraft RestoreDraft RemoveDraft",e),function(){return r.off("StoreDraft RestoreDraft RemoveDraft",e)}}}var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),a=function(t){return void 0===t},l=tinymce.util.Tools.resolve("tinymce.util.Delay"),v=tinymce.util.Tools.resolve("tinymce.util.LocalStorage"),d=tinymce.util.Tools.resolve("tinymce.util.Tools"),g=function(t,e){var r=n(t);v.removeItem(r+"draft"),v.removeItem(r+"time"),!1!==e&&t.fire("RemoveDraft")},y=tinymce.util.Tools.resolve("tinymce.EditorManager");t.add("autosave",function(t){var e,r,n,a;return t.editorManager.on("BeforeUnload",function(t){var e;d.each(y.get(),function(t){t.plugins.autosave&&t.plugins.autosave.storeDraft(),!e&&t.isDirty()&&t.getParam("autosave_ask_before_unload",!0)&&(e=t.translate("You have unsaved changes are you sure you want to navigate away?"))}),e&&(t.preventDefault(),t.returnValue=e)}),n=e=t,a=o(n.getParam("autosave_interval"),"30s"),l.setEditorInterval(n,function(){s(n)},a),e.ui.registry.addButton("restoredraft",{tooltip:"Restore last draft",icon:"restore-draft",onAction:function(){c(e)},onSetup:m(e)}),e.ui.registry.addMenuItem("restoredraft",{text:"Restore last draft",icon:"restore-draft",onAction:function(){c(e)},onSetup:m(e)}),t.on("init",function(){t.getParam("autosave_restore_when_empty",!1)&&t.dom.isEmpty(t.getBody())&&f(t)}),r=t,{hasDraft:function(){return u(r)},storeDraft:function(){return s(r)},restoreDraft:function(){return f(r)},removeDraft:function(t){return g(r,t)},isEmpty:function(t){return i(r,t)}}})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/bbcode/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/bbcode/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..a4fa39e91f7ecb509e4e86b936a8079d92ce3817
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/bbcode/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function i(t){function o(o,e){t=t.replace(o,e)}return t=n.trim(t),o(/\n/gi,"<br />"),o(/\[b\]/gi,"<strong>"),o(/\[\/b\]/gi,"</strong>"),o(/\[i\]/gi,"<em>"),o(/\[\/i\]/gi,"</em>"),o(/\[u\]/gi,"<u>"),o(/\[\/u\]/gi,"</u>"),o(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,'<a href="$1">$2</a>'),o(/\[url\](.*?)\[\/url\]/gi,'<a href="$1">$1</a>'),o(/\[img\](.*?)\[\/img\]/gi,'<img src="$1" />'),o(/\[color=(.*?)\](.*?)\[\/color\]/gi,'<font color="$1">$2</font>'),o(/\[code\](.*?)\[\/code\]/gi,'<span class="codeStyle">$1</span>&nbsp;'),o(/\[quote.*?\](.*?)\[\/quote\]/gi,'<span class="quoteStyle">$1</span>&nbsp;'),t}var o=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=tinymce.util.Tools.resolve("tinymce.util.Tools");o.add("bbcode",function(o){o.on("BeforeSetContent",function(o){o.content=i(o.content)}),o.on("PostProcess",function(o){function e(o,e){t=t.replace(o,e)}var t;o.set&&(o.content=i(o.content)),o.get&&(o.content=(t=o.content,t=n.trim(t),e(/<a.*?href=\"(.*?)\".*?>(.*?)<\/a>/gi,"[url=$1]$2[/url]"),e(/<font.*?color=\"(.*?)\".*?class=\"codeStyle\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),e(/<font.*?color=\"(.*?)\".*?class=\"quoteStyle\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),e(/<font.*?class=\"codeStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),e(/<font.*?class=\"quoteStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),e(/<span style=\"color: ?(.*?);\">(.*?)<\/span>/gi,"[color=$1]$2[/color]"),e(/<font.*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[color=$1]$2[/color]"),e(/<span style=\"font-size:(.*?);\">(.*?)<\/span>/gi,"[size=$1]$2[/size]"),e(/<font>(.*?)<\/font>/gi,"$1"),e(/<img.*?src=\"(.*?)\".*?\/>/gi,"[img]$1[/img]"),e(/<span class=\"codeStyle\">(.*?)<\/span>/gi,"[code]$1[/code]"),e(/<span class=\"quoteStyle\">(.*?)<\/span>/gi,"[quote]$1[/quote]"),e(/<strong class=\"codeStyle\">(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]"),e(/<strong class=\"quoteStyle\">(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]"),e(/<em class=\"codeStyle\">(.*?)<\/em>/gi,"[code][i]$1[/i][/code]"),e(/<em class=\"quoteStyle\">(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]"),e(/<u class=\"codeStyle\">(.*?)<\/u>/gi,"[code][u]$1[/u][/code]"),e(/<u class=\"quoteStyle\">(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]"),e(/<\/(strong|b)>/gi,"[/b]"),e(/<(strong|b)>/gi,"[b]"),e(/<\/(em|i)>/gi,"[/i]"),e(/<(em|i)>/gi,"[i]"),e(/<\/u>/gi,"[/u]"),e(/<span style=\"text-decoration: ?underline;\">(.*?)<\/span>/gi,"[u]$1[/u]"),e(/<u>/gi,"[u]"),e(/<blockquote[^>]*>/gi,"[quote]"),e(/<\/blockquote>/gi,"[/quote]"),e(/<br \/>/gi,"\n"),e(/<br\/>/gi,"\n"),e(/<br>/gi,"\n"),e(/<p>/gi,""),e(/<\/p>/gi,"\n"),e(/&nbsp;|\u00a0/gi," "),e(/&quot;/gi,'"'),e(/&lt;/gi,"<"),e(/&gt;/gi,">"),e(/&amp;/gi,"&"),t))})})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/charmap/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/charmap/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..a17128e7ca2bef51ba3d4ae52e260015ec4bfcb4
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/charmap/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function l(e,r){var n=e.fire("insertCustomChar",{chr:r}).chr;e.execCommand("mceInsertContent",!1,n)}function i(e){return function(){return e}}function e(e){return e}function r(){return c}var t,g,n=tinymce.util.Tools.resolve("tinymce.PluginManager"),a=function(e){return n=typeof(r=e),(null===r?"null":"object"==n&&(Array.prototype.isPrototypeOf(r)||r.constructor&&"Array"===r.constructor.name)?"array":"object"==n&&(String.prototype.isPrototypeOf(r)||r.constructor&&"String"===r.constructor.name)?"string":n)===t;var r,n},m=i(!(t="array")),o=i(!(g=null)),c={fold:function(e,r){return e()},isSome:m,isNone:o,getOr:e,getOrThunk:u,getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(void 0),or:e,orThunk:u,map:r,each:function(){},bind:r,exists:m,forall:o,filter:function(){return c},toArray:function(){return[]},toString:i("none()")};function u(e){return e()}function f(e,r){for(var n=e.length,t=new Array(n),a=0;a<n;a++){var i=e[a];t[a]=r(i,a)}return t}function s(e){return A(e)?x.grep(e,function(e){return A(e)&&2===e.length}):"function"==typeof e?e():[]}function h(e){var r=function(e,r){var n=e.getParam("charmap");n&&(r=[{name:O,characters:s(n)}]);var t=e.getParam("charmap_append");if(t){var a=x.grep(r,function(e){return e.name===O});return a.length?(a[0].characters=[].concat(a[0].characters).concat(s(t)),r):r.concat({name:O,characters:s(t)})}return r}(e,[{name:"Currency",characters:[[36,"dollar sign"],[162,"cent sign"],[8364,"euro sign"],[163,"pound sign"],[165,"yen sign"],[164,"currency sign"],[8352,"euro-currency sign"],[8353,"colon sign"],[8354,"cruzeiro sign"],[8355,"french franc sign"],[8356,"lira sign"],[8357,"mill sign"],[8358,"naira sign"],[8359,"peseta sign"],[8360,"rupee sign"],[8361,"won sign"],[8362,"new sheqel sign"],[8363,"dong sign"],[8365,"kip sign"],[8366,"tugrik sign"],[8367,"drachma sign"],[8368,"german penny symbol"],[8369,"peso sign"],[8370,"guarani sign"],[8371,"austral sign"],[8372,"hryvnia sign"],[8373,"cedi sign"],[8374,"livre tournois sign"],[8375,"spesmilo sign"],[8376,"tenge sign"],[8377,"indian rupee sign"],[8378,"turkish lira sign"],[8379,"nordic mark sign"],[8380,"manat sign"],[8381,"ruble sign"],[20870,"yen character"],[20803,"yuan character"],[22291,"yuan character, in hong kong and taiwan"],[22278,"yen/yuan character variant one"]]},{name:"Text",characters:[[169,"copyright sign"],[174,"registered sign"],[8482,"trade mark sign"],[8240,"per mille sign"],[181,"micro sign"],[183,"middle dot"],[8226,"bullet"],[8230,"three dot leader"],[8242,"minutes / feet"],[8243,"seconds / inches"],[167,"section sign"],[182,"paragraph sign"],[223,"sharp s / ess-zed"]]},{name:"Quotations",characters:[[8249,"single left-pointing angle quotation mark"],[8250,"single right-pointing angle quotation mark"],[171,"left pointing guillemet"],[187,"right pointing guillemet"],[8216,"left single quotation mark"],[8217,"right single quotation mark"],[8220,"left double quotation mark"],[8221,"right double quotation mark"],[8218,"single low-9 quotation mark"],[8222,"double low-9 quotation mark"],[60,"less-than sign"],[62,"greater-than sign"],[8804,"less-than or equal to"],[8805,"greater-than or equal to"],[8211,"en dash"],[8212,"em dash"],[175,"macron"],[8254,"overline"],[164,"currency sign"],[166,"broken bar"],[168,"diaeresis"],[161,"inverted exclamation mark"],[191,"turned question mark"],[710,"circumflex accent"],[732,"small tilde"],[176,"degree sign"],[8722,"minus sign"],[177,"plus-minus sign"],[247,"division sign"],[8260,"fraction slash"],[215,"multiplication sign"],[185,"superscript one"],[178,"superscript two"],[179,"superscript three"],[188,"fraction one quarter"],[189,"fraction one half"],[190,"fraction three quarters"]]},{name:"Mathematical",characters:[[402,"function / florin"],[8747,"integral"],[8721,"n-ary sumation"],[8734,"infinity"],[8730,"square root"],[8764,"similar to"],[8773,"approximately equal to"],[8776,"almost equal to"],[8800,"not equal to"],[8801,"identical to"],[8712,"element of"],[8713,"not an element of"],[8715,"contains as member"],[8719,"n-ary product"],[8743,"logical and"],[8744,"logical or"],[172,"not sign"],[8745,"intersection"],[8746,"union"],[8706,"partial differential"],[8704,"for all"],[8707,"there exists"],[8709,"diameter"],[8711,"backward difference"],[8727,"asterisk operator"],[8733,"proportional to"],[8736,"angle"]]},{name:"Extended Latin",characters:[[192,"A - grave"],[193,"A - acute"],[194,"A - circumflex"],[195,"A - tilde"],[196,"A - diaeresis"],[197,"A - ring above"],[256,"A - macron"],[198,"ligature AE"],[199,"C - cedilla"],[200,"E - grave"],[201,"E - acute"],[202,"E - circumflex"],[203,"E - diaeresis"],[274,"E - macron"],[204,"I - grave"],[205,"I - acute"],[206,"I - circumflex"],[207,"I - diaeresis"],[298,"I - macron"],[208,"ETH"],[209,"N - tilde"],[210,"O - grave"],[211,"O - acute"],[212,"O - circumflex"],[213,"O - tilde"],[214,"O - diaeresis"],[216,"O - slash"],[332,"O - macron"],[338,"ligature OE"],[352,"S - caron"],[217,"U - grave"],[218,"U - acute"],[219,"U - circumflex"],[220,"U - diaeresis"],[362,"U - macron"],[221,"Y - acute"],[376,"Y - diaeresis"],[562,"Y - macron"],[222,"THORN"],[224,"a - grave"],[225,"a - acute"],[226,"a - circumflex"],[227,"a - tilde"],[228,"a - diaeresis"],[229,"a - ring above"],[257,"a - macron"],[230,"ligature ae"],[231,"c - cedilla"],[232,"e - grave"],[233,"e - acute"],[234,"e - circumflex"],[235,"e - diaeresis"],[275,"e - macron"],[236,"i - grave"],[237,"i - acute"],[238,"i - circumflex"],[239,"i - diaeresis"],[299,"i - macron"],[240,"eth"],[241,"n - tilde"],[242,"o - grave"],[243,"o - acute"],[244,"o - circumflex"],[245,"o - tilde"],[246,"o - diaeresis"],[248,"o slash"],[333,"o macron"],[339,"ligature oe"],[353,"s - caron"],[249,"u - grave"],[250,"u - acute"],[251,"u - circumflex"],[252,"u - diaeresis"],[363,"u - macron"],[253,"y - acute"],[254,"thorn"],[255,"y - diaeresis"],[563,"y - macron"],[913,"Alpha"],[914,"Beta"],[915,"Gamma"],[916,"Delta"],[917,"Epsilon"],[918,"Zeta"],[919,"Eta"],[920,"Theta"],[921,"Iota"],[922,"Kappa"],[923,"Lambda"],[924,"Mu"],[925,"Nu"],[926,"Xi"],[927,"Omicron"],[928,"Pi"],[929,"Rho"],[931,"Sigma"],[932,"Tau"],[933,"Upsilon"],[934,"Phi"],[935,"Chi"],[936,"Psi"],[937,"Omega"],[945,"alpha"],[946,"beta"],[947,"gamma"],[948,"delta"],[949,"epsilon"],[950,"zeta"],[951,"eta"],[952,"theta"],[953,"iota"],[954,"kappa"],[955,"lambda"],[956,"mu"],[957,"nu"],[958,"xi"],[959,"omicron"],[960,"pi"],[961,"rho"],[962,"final sigma"],[963,"sigma"],[964,"tau"],[965,"upsilon"],[966,"phi"],[967,"chi"],[968,"psi"],[969,"omega"]]},{name:"Symbols",characters:[[8501,"alef symbol"],[982,"pi symbol"],[8476,"real part symbol"],[978,"upsilon - hook symbol"],[8472,"Weierstrass p"],[8465,"imaginary part"]]},{name:"Arrows",characters:[[8592,"leftwards arrow"],[8593,"upwards arrow"],[8594,"rightwards arrow"],[8595,"downwards arrow"],[8596,"left right arrow"],[8629,"carriage return"],[8656,"leftwards double arrow"],[8657,"upwards double arrow"],[8658,"rightwards double arrow"],[8659,"downwards double arrow"],[8660,"left right double arrow"],[8756,"therefore"],[8834,"subset of"],[8835,"superset of"],[8836,"not a subset of"],[8838,"subset of or equal to"],[8839,"superset of or equal to"],[8853,"circled plus"],[8855,"circled times"],[8869,"perpendicular"],[8901,"dot operator"],[8968,"left ceiling"],[8969,"right ceiling"],[8970,"left floor"],[8971,"right floor"],[9001,"left-pointing angle bracket"],[9002,"right-pointing angle bracket"],[9674,"lozenge"],[9824,"black spade suit"],[9827,"black club suit"],[9829,"black heart suit"],[9830,"black diamond suit"],[8194,"en space"],[8195,"em space"],[8201,"thin space"],[8204,"zero width non-joiner"],[8205,"zero width joiner"],[8206,"left-to-right mark"],[8207,"right-to-left mark"]]}]);return 1<r.length?[{name:"All",characters:function(e){for(var r=[],n=0,t=e.length;n<t;++n){if(!a(e[n]))throw new Error("Arr.flatten item "+n+" was not an array, input: "+e);C.apply(r,e[n])}return r}(f(r,function(e){return e.characters}))}].concat(r):r}function p(e){var r=e;return{get:function(){return r},set:function(e){r=e}}}function d(e,r){return-1!==e.indexOf(r)}function y(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];if(q)return q.apply(void 0,e);for(var n=[],t="",a=0,i=e.length;a!==i;++a){var o=+e[a];if(!(o<1114111&&o>>>0===o))throw RangeError("Invalid code point: "+o);16383<=(o<=65535?n.push(o):(o-=65536,n.push(55296+(o>>10),o%1024+56320)))&&(t+=String.fromCharCode.apply(null,n),n.length=0)}return t+String.fromCharCode.apply(null,n)}function v(e,r){var c=[],u=r.toLowerCase();return function(e){for(var r,n,t,a,i=0,o=e.length;i<o;i++)r=e[i],a=t=n=a=t=n=void 0,n=r[0],t=r[1],a=u,(d(y(n).toLowerCase(),a)||d(t.toLowerCase(),a)||d(t.toLowerCase().replace(/\s+/g,""),a))&&c.push(r)}(e.characters),f(c,function(e){return{text:e[1],value:y(e[0]),icon:y(e[0])}})}function w(n,a){function r(){return[{label:"Search",type:"input",name:S},{type:"collection",name:"results"}]}var t,i,o=1===a.length?p(O):p("All"),c=(t=function(e){var r=e.getData().pattern,n=e,t=r;(function(e,r,n){for(var t=0,a=e.length;t<a;t++){var i=e[t];if(r(i,t))return k.some(i);if(n(i,t))break}return k.none()})(a,function(e){return e.name===o.get()},m).each(function(e){var r=v(e,t);n.setData({results:r})})},i=null,{cancel:u,throttle:function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];u(),i=setTimeout(function(){i=null,t.apply(null,e)},40)}});function u(){g===i||(clearTimeout(i),i=null)}var e=1===a.length?{type:"panel",items:r()}:{type:"tabpanel",tabs:f(a,function(e){return{title:e.name,name:e.name,items:r()}})},s={pattern:"",results:v(a[0],"")};n.windowManager.open({title:"Special Character",size:"normal",body:e,buttons:[{type:"cancel",name:"close",text:"Close",primary:!0}],initialData:s,onAction:function(e,r){"results"===r.name&&(l(n,r.value),e.close())},onTabChange:function(e,r){o.set(r.newTabName),c.throttle(e)},onChange:function(e,r){r.name===S&&c.throttle(e)}}).focus(S)}var b=function(n){function e(){return a}function r(e){return e(n)}var t=i(n),a={fold:function(e,r){return r(n)},isSome:o,isNone:m,getOr:t,getOrThunk:t,getOrDie:t,getOrNull:t,getOrUndefined:t,or:e,orThunk:e,map:function(e){return b(e(n))},each:function(e){e(n)},bind:r,exists:r,forall:r,filter:function(e){return e(n)?a:c},toArray:function(){return[n]},toString:function(){return"some("+n+")"}};return a},k={some:b,none:r,from:function(e){return null==e?c:b(e)}},C=Array.prototype.push,x=tinymce.util.Tools.resolve("tinymce.util.Tools"),A=x.isArray,O="User Defined",q=String.fromCodePoint,S="pattern",T=tinymce.util.Tools.resolve("tinymce.util.Promise");n.add("charmap",function(e){var r,n,t,a,i,o=h(e),c=o;return(r=e).addCommand("mceShowCharmap",function(){w(r,c)}),(n=e).ui.registry.addButton("charmap",{icon:"insert-character",tooltip:"Special character",onAction:function(){return n.execCommand("mceShowCharmap")}}),n.ui.registry.addMenuItem("charmap",{icon:"insert-character",text:"Special character...",onAction:function(){return n.execCommand("mceShowCharmap")}}),t=e,a=o[0],t.ui.registry.addAutocompleter("charmap",{ch:":",columns:"auto",minChars:2,fetch:function(n,e){return new T(function(e,r){e(v(a,n))})},onAction:function(e,r,n){t.selection.setRng(r),t.insertContent(n),e.hide()}}),i=e,{getCharMap:function(){return h(i)},insertChar:function(e){l(i,e)}}})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/code/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/code/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..d83339a218b0e0ebb559b660325225b1659f491e
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/code/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("code",function(e){var t,o;function n(){return o.execCommand("mceCodeEditor")}return(t=e).addCommand("mceCodeEditor",function(){var n,e;e=(n=t).getContent({source_view:!0}),n.windowManager.open({title:"Source Code",size:"large",body:{type:"panel",items:[{type:"textarea",name:"code"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{code:e},onSubmit:function(e){var t=n,o=e.getData().code;t.focus(),t.undoManager.transact(function(){t.setContent(o)}),t.selection.setCursorLocation(),t.nodeChanged(),e.close()}})}),(o=e).ui.registry.addButton("code",{icon:"sourcecode",tooltip:"Source code",onAction:n}),o.ui.registry.addMenuItem("code",{icon:"sourcecode",text:"Source code",onAction:n}),{}})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/codesample/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/codesample/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..bc59b29e2c09200390c9affca421d8dc7323458a
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/codesample/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function o(e){return function(){return e}}function e(e){return e}function n(){return l}var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),s=o(!1),i=o(!0),l={fold:function(e,n){return e()},isSome:s,isNone:i,getOr:e,getOrThunk:a,getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:o(null),getOrUndefined:o(void 0),or:e,orThunk:a,map:n,each:function(){},bind:n,exists:s,forall:i,filter:function(){return l},toArray:function(){return[]},toString:o("none()")};function a(e){return e()}function u(e){return e&&"PRE"===e.nodeName&&-1!==e.className.indexOf("language-")}function c(t){return function(e,n){return t(n)}}var d=function(t){function e(){return r}function n(e){return e(t)}var a=o(t),r={fold:function(e,n){return n(t)},isSome:i,isNone:s,getOr:a,getOrThunk:a,getOrDie:a,getOrNull:a,getOrUndefined:a,or:e,orThunk:e,map:function(e){return d(e(t))},each:function(e){e(t)},bind:n,exists:n,forall:n,filter:function(e){return e(t)?r:l},toArray:function(){return[t]},toString:function(){return"some("+t+")"}};return r},p={some:d,none:n,from:function(e){return null==e?l:d(e)}},g=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),r="undefined"!=typeof window?window:Function("return this;")(),b={},m={exports:b},f={};function h(e){return r.Prism&&e.getParam("codesample_global_prismjs",!1,"boolean")?r.Prism:k}function y(e){var n=e.selection?e.selection.getNode():null;return u(n)?p.some(n):p.none()}function w(s){var t,e,n=s.getParam("codesample_languages")||[{text:"HTML/XML",value:"markup"},{text:"JavaScript",value:"javascript"},{text:"CSS",value:"css"},{text:"PHP",value:"php"},{text:"Ruby",value:"ruby"},{text:"Python",value:"python"},{text:"Java",value:"java"},{text:"C",value:"c"},{text:"C#",value:"csharp"},{text:"C++",value:"cpp"}],a=(0<(e=n).length?p.some(e[0]):p.none()).fold(o(""),function(e){return e.value}),r=(t=a,y(s).fold(function(){return t},function(e){var n=e.className.match(/language-(\w+)/);return n?n[1]:t})),i=y(s).fold(o(""),function(e){return e.textContent});s.windowManager.open({title:"Insert/Edit Code Sample",size:"large",body:{type:"panel",items:[{type:"selectbox",name:"language",label:"Language",items:n},{type:"textarea",name:"code",label:"Code view"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{language:r,code:i},onSubmit:function(e){var n=e.getData(),t=s,a=n.language,r=n.code;t.undoManager.transact(function(){var e=y(t);return r=g.DOM.encode(r),e.fold(function(){t.insertContent('<pre id="__new" class="language-'+a+'">'+r+"</pre>"),t.selection.select(t.$("#__new").removeAttr("id")[0])},function(e){t.dom.setAttrib(e,"class","language-"+a),e.innerHTML=r,h(t).highlightElement(e),t.selection.select(e)})}),e.close()}})}!function(e,n){var t,a,r=window.Prism;window.Prism={manual:!0},t=this,a=function(){var e,n,h,t,a,r,s,i,o,l,u="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:f,c={exports:{}};function y(e,n){return"___"+e.toUpperCase()+n+"___"}return e=c,n=function(u){var c=/\blang(?:uage)?-([\w-]+)\b/i,n=0,e={},j={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof T?new T(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++n}),e.__id},clone:function t(e,a){var r,n;switch(a=a||{},j.util.type(e)){case"Object":if(n=j.util.objId(e),a[n])return a[n];for(var s in r={},a[n]=r,e)e.hasOwnProperty(s)&&(r[s]=t(e[s],a));return r;case"Array":return n=j.util.objId(e),a[n]||(r=[],a[n]=r,e.forEach(function(e,n){r[n]=t(e,a)}),r);default:return e}},getLanguage:function(e){for(;e&&!c.test(e.className);)e=e.parentElement;return e?(e.className.match(c)||[,"none"])[1].toLowerCase():"none"},currentScript:function(){if("undefined"==typeof document)return null;if("currentScript"in document)return document.currentScript;try{throw new Error}catch(e){var n=(/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(e.stack)||[])[1];if(n){var t,a=document.getElementsByTagName("script");for(t in a)if(a[t].src==n)return a[t]}return null}},isActive:function(e,n,t){for(var a="no-"+n;e;){var r=e.classList;if(r.contains(n))return!0;if(r.contains(a))return!1;e=e.parentElement}return!!t}},languages:{plain:e,plaintext:e,text:e,txt:e,extend:function(e,n){var t,a=j.util.clone(j.languages[e]);for(t in n)a[t]=n[t];return a},insertBefore:function(t,e,n,a){var r,s=(a=a||j.languages)[t],i={};for(r in s)if(s.hasOwnProperty(r)){if(r==e)for(var o in n)n.hasOwnProperty(o)&&(i[o]=n[o]);n.hasOwnProperty(r)||(i[r]=s[r])}var l=a[t];return a[t]=i,j.languages.DFS(j.languages,function(e,n){n===l&&e!=t&&(this[e]=i)}),i},DFS:function e(n,t,a,r){r=r||{};var s,i,o,l=j.util.objId;for(s in n)n.hasOwnProperty(s)&&(t.call(n,s,n[s],a||s),i=n[s],"Object"!==(o=j.util.type(i))||r[l(i)]?"Array"!==o||r[l(i)]||(r[l(i)]=!0,e(i,t,s,r)):(r[l(i)]=!0,e(i,t,null,r)))}},plugins:{},highlightAll:function(e,n){j.highlightAllUnder(document,e,n)},highlightAllUnder:function(e,n,t){var a={callback:t,container:e,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};j.hooks.run("before-highlightall",a),a.elements=Array.prototype.slice.apply(a.container.querySelectorAll(a.selector)),j.hooks.run("before-all-elements-highlight",a);for(var r,s=0;r=a.elements[s++];)j.highlightElement(r,!0===n,a.callback)},highlightElement:function(e,n,t){var a=j.util.getLanguage(e),r=j.languages[a];e.className=e.className.replace(c,"").replace(/\s+/g," ")+" language-"+a;var s=e.parentElement;s&&"pre"===s.nodeName.toLowerCase()&&(s.className=s.className.replace(c,"").replace(/\s+/g," ")+" language-"+a);var i,o={element:e,language:a,grammar:r,code:e.textContent};function l(e){o.highlightedCode=e,j.hooks.run("before-insert",o),o.element.innerHTML=o.highlightedCode,j.hooks.run("after-highlight",o),j.hooks.run("complete",o),t&&t.call(o.element)}if(j.hooks.run("before-sanity-check",o),(s=o.element.parentElement)&&"pre"===s.nodeName.toLowerCase()&&!s.hasAttribute("tabindex")&&s.setAttribute("tabindex","0"),!o.code)return j.hooks.run("complete",o),void(t&&t.call(o.element));j.hooks.run("before-highlight",o),o.grammar?n&&u.Worker?((i=new Worker(j.filename)).onmessage=function(e){l(e.data)},i.postMessage(JSON.stringify({language:o.language,code:o.code,immediateClose:!0}))):l(j.highlight(o.code,o.grammar,o.language)):l(j.util.encode(o.code))},highlight:function(e,n,t){var a={code:e,grammar:n,language:t};return j.hooks.run("before-tokenize",a),a.tokens=j.tokenize(a.code,a.grammar),j.hooks.run("after-tokenize",a),T.stringify(j.util.encode(a.tokens),a.language)},tokenize:function(e,n){var t=n.rest;if(t){for(var a in t)n[a]=t[a];delete n.rest}var r=new s;return N(r,r.head,e),function e(n,t,a,r,s,i){for(var o in a)if(a.hasOwnProperty(o)&&a[o])for(var l=a[o],l=Array.isArray(l)?l:[l],u=0;u<l.length;++u){if(i&&i.cause==o+","+u)return;var c,d=l[u],p=d.inside,g=!!d.lookbehind,b=!!d.greedy,m=d.alias;b&&!d.pattern.global&&(c=d.pattern.toString().match(/[imsuy]*$/)[0],d.pattern=RegExp(d.pattern.source,c+"g"));for(var f=d.pattern||d,h=r.next,y=s;h!==t.tail&&!(i&&y>=i.reach);y+=h.value.length,h=h.next){var w=h.value;if(t.length>n.length)return;if(!(w instanceof T)){var k,v=1;if(b){if(!(k=O(f,y,n,g)))break;var _=k.index,x=k.index+k[0].length,F=y;for(F+=h.value.length;F<=_;)F+=(h=h.next).value.length;if(y=F-=h.value.length,h.value instanceof T)continue;for(var P=h;P!==t.tail&&(F<x||"string"==typeof P.value);P=P.next)v++,F+=P.value.length;v--,w=n.slice(y,F),k.index-=y}else if(!(k=O(f,0,w,g)))continue;var _=k.index,A=k[0],S=w.slice(0,_),$=w.slice(_+A.length),z=y+w.length;i&&z>i.reach&&(i.reach=z);var E=h.prev;S&&(E=N(t,E,S),y+=S.length),function(e,n,t){for(var a=n.next,r=0;r<t&&a!==e.tail;r++)a=a.next;(n.next=a).prev=n,e.length-=r}(t,E,v);var C,h=N(t,E,new T(o,p?j.tokenize(A,p):A,m,A));$&&N(t,h,$),1<v&&(e(n,t,a,h.prev,y,C={cause:o+","+u,reach:z}),i&&C.reach>i.reach&&(i.reach=C.reach))}}}}(e,r,n,r.head,0),function(e){for(var n=[],t=e.head.next;t!==e.tail;)n.push(t.value),t=t.next;return n}(r)},hooks:{all:{},add:function(e,n){var t=j.hooks.all;t[e]=t[e]||[],t[e].push(n)},run:function(e,n){var t=j.hooks.all[e];if(t&&t.length)for(var a,r=0;a=t[r++];)a(n)}},Token:T};function T(e,n,t,a){this.type=e,this.content=n,this.alias=t,this.length=0|(a||"").length}function O(e,n,t,a){e.lastIndex=n;var r,s=e.exec(t);return s&&a&&s[1]&&(r=s[1].length,s.index+=r,s[0]=s[0].slice(r)),s}function s(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function N(e,n,t){var a=n.next,r={value:t,prev:n,next:a};return n.next=r,a.prev=r,e.length++,r}if(u.Prism=j,T.stringify=function n(e,t){if("string"==typeof e)return e;if(Array.isArray(e)){var a="";return e.forEach(function(e){a+=n(e,t)}),a}var r={type:e.type,content:n(e.content,t),tag:"span",classes:["token",e.type],attributes:{},language:t},s=e.alias;s&&(Array.isArray(s)?Array.prototype.push.apply(r.classes,s):r.classes.push(s)),j.hooks.run("wrap",r);var i,o="";for(i in r.attributes)o+=" "+i+'="'+(r.attributes[i]||"").replace(/"/g,"&quot;")+'"';return"<"+r.tag+' class="'+r.classes.join(" ")+'"'+o+">"+r.content+"</"+r.tag+">"},!u.document)return u.addEventListener&&(j.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,a=n.code,r=n.immediateClose;u.postMessage(j.highlight(a,j.languages[t],t)),r&&u.close()},!1)),j;var t,a=j.util.currentScript();function r(){j.manual||j.highlightAll()}return a&&(j.filename=a.src,a.hasAttribute("data-manual")&&(j.manual=!0)),j.manual||("loading"===(t=document.readyState)||"interactive"===t&&a&&a.defer?document.addEventListener("DOMContentLoaded",r):window.requestAnimationFrame?window.requestAnimationFrame(r):window.setTimeout(r,16)),j}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{}),e.exports&&(e.exports=n),void 0!==u&&(u.Prism=n),Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,boolean:/\b(?:true|false)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},h=Prism,Object.defineProperties(h.languages["markup-templating"]={},{buildPlaceholders:{value:function(a,r,e,s){var i;a.language===r&&(i=a.tokenStack=[],a.code=a.code.replace(e,function(e){if("function"==typeof s&&!s(e))return e;for(var n,t=i.length;-1!==a.code.indexOf(n=y(r,t));)++t;return i[t]=e,n}),a.grammar=h.languages.markup)}},tokenizePlaceholders:{value:function(g,b){var m,f;g.language===b&&g.tokenStack&&(g.grammar=h.languages[b],m=0,f=Object.keys(g.tokenStack),function e(n){for(var t=0;t<n.length&&!(m>=f.length);t++){var a,r,s,i,o,l,u,c,d,p=n[t];"string"==typeof p||p.content&&"string"==typeof p.content?(a=f[m],r=g.tokenStack[a],s="string"==typeof p?p:p.content,i=y(b,a),-1<(o=s.indexOf(i))&&(++m,l=s.substring(0,o),u=new h.Token(b,h.tokenize(r,g.grammar),"language-"+b,r),c=s.substring(o+i.length),d=[],l&&d.push.apply(d,e([l])),d.push(u),c&&d.push.apply(d,e([c])),"string"==typeof p?n.splice.apply(n,[t,1].concat(d)):p.content=d)):p.content&&e(p.content)}return n}(g.tokens))}}}),Prism.languages.c=Prism.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:__attribute__|_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],comment:Prism.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:Prism.languages.c}}},constant:/\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/}),delete Prism.languages.c.boolean,t=Prism,a=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char8_t|char16_t|char32_t|class|compl|concept|const|consteval|constexpr|constinit|const_cast|continue|co_await|co_return|co_yield|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,r=/\b(?!<keyword>)\w+(?:\s*\.\s*\w+)*\b/.source.replace(/<keyword>/g,function(){return a.source}),t.languages.cpp=t.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!<keyword>)\w+/.source.replace(/<keyword>/g,function(){return a.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:a,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:true|false)\b/}),t.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:module|import)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/<mod-name>(?:\s*:\s*<mod-name>)?|:\s*<mod-name>/.source.replace(/<mod-name>/g,function(){return r})+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),t.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t.languages.cpp}}}}),t.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),t.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:t.languages.extend("cpp",{})}}),t.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},t.languages.cpp["base-clause"]),function(t){function a(e,t){return e.replace(/<<(\d+)>>/g,function(e,n){return"(?:"+t[+n]+")"})}function r(e,n,t){return RegExp(a(e,n),t||"")}function e(e,n){for(var t=0;t<n;t++)e=e.replace(/<<self>>/g,function(){return"(?:"+e+")"});return e.replace(/<<self>>/g,"[^\\s\\S]")}var n="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",s="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var u=l(s),c=RegExp(l(n+" "+s+" "+i+" "+o)),d=l(s+" "+i+" "+o),p=l(n+" "+s+" "+o),g=e(/<(?:[^<>;=+\-*/%&|^]|<<self>>)*>/.source,2),b=e(/\((?:[^()]|<<self>>)*\)/.source,2),m=/@?\b[A-Za-z_]\w*\b/.source,f=a(/<<0>>(?:\s*<<1>>)?/.source,[m,g]),h=a(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source,[d,f]),y=/\[\s*(?:,\s*)*\]/.source,w=a(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source,[h,y]),k=a(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source,[g,b,y]),v=a(/\(<<0>>+(?:,<<0>>+)+\)/.source,[k]),_=a(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source,[v,h,y]),x={keyword:c,punctuation:/[<>()?,.:[\]]/},F=/'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source,P=/"(?:\\.|[^\\"\r\n])*"/.source;t.languages.csharp=t.languages.extend("clike",{string:[{pattern:r(/(^|[^$\\])<<0>>/.source,[/@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source]),lookbehind:!0,greedy:!0},{pattern:r(/(^|[^@$\\])<<0>>/.source,[P]),lookbehind:!0,greedy:!0},{pattern:RegExp(F),greedy:!0,alias:"character"}],"class-name":[{pattern:r(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source,[h]),lookbehind:!0,inside:x},{pattern:r(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source,[m,_]),lookbehind:!0,inside:x},{pattern:r(/(\busing\s+)<<0>>(?=\s*=)/.source,[m]),lookbehind:!0},{pattern:r(/(\b<<0>>\s+)<<1>>/.source,[u,f]),lookbehind:!0,inside:x},{pattern:r(/(\bcatch\s*\(\s*)<<0>>/.source,[h]),lookbehind:!0,inside:x},{pattern:r(/(\bwhere\s+)<<0>>/.source,[m]),lookbehind:!0},{pattern:r(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source,[w]),lookbehind:!0,inside:x},{pattern:r(/\b<<0>>(?=\s+(?!<<1>>|with\s*\{)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source,[_,p,m]),inside:x}],keyword:c,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:ul|lu|[dflmu])?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),t.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),t.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:r(/([(,]\s*)<<0>>(?=\s*:)/.source,[m]),lookbehind:!0,alias:"punctuation"}}),t.languages.insertBefore("csharp","class-name",{namespace:{pattern:r(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source,[m]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:r(/(\b(?:default|typeof|sizeof)\s*\(\s*(?!\s))(?:[^()\s]|\s(?!\s)|<<0>>)*(?=\s*\))/.source,[b]),lookbehind:!0,alias:"class-name",inside:x},"return-type":{pattern:r(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source,[_,h]),inside:x,alias:"class-name"},"constructor-invocation":{pattern:r(/(\bnew\s+)<<0>>(?=\s*[[({])/.source,[_]),lookbehind:!0,inside:x,alias:"class-name"},"generic-method":{pattern:r(/<<0>>\s*<<1>>(?=\s*\()/.source,[m,g]),inside:{function:r(/^<<0>>/.source,[m]),generic:{pattern:RegExp(g),alias:"class-name",inside:x}}},"type-list":{pattern:r(/\b((?:<<0>>\s+<<1>>|record\s+<<1>>\s*<<5>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>|<<1>>\s*<<5>>|<<6>>)(?:\s*,\s*(?:<<3>>|<<4>>|<<6>>))*(?=\s*(?:where|[{;]|=>|$))/.source,[u,f,m,_,c.source,b,/\bnew\s*\(\s*\)/.source]),lookbehind:!0,inside:{"record-arguments":{pattern:r(/(^(?!new\s*\()<<0>>\s*)<<1>>/.source,[f,b]),lookbehind:!0,greedy:!0,inside:t.languages.csharp},keyword:c,"class-name":{pattern:RegExp(_),greedy:!0,inside:x},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var A=P+"|"+F,S=a(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source,[A]),$=e(a(/[^"'/()]|<<0>>|\(<<self>>*\)/.source,[S]),2),z=/\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source,E=a(/<<0>>(?:\s*\(<<1>>*\))?/.source,[h,$]);t.languages.insertBefore("csharp","class-name",{attribute:{pattern:r(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source,[z,E]),lookbehind:!0,greedy:!0,inside:{target:{pattern:r(/^<<0>>(?=\s*:)/.source,[z]),alias:"keyword"},"attribute-arguments":{pattern:r(/\(<<0>>*\)/.source,[$]),inside:t.languages.csharp},"class-name":{pattern:RegExp(h),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var C=/:[^}\r\n]+/.source,j=e(a(/[^"'/()]|<<0>>|\(<<self>>*\)/.source,[S]),2),T=a(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[j,C]),O=e(a(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<<self>>*\)/.source,[A]),2),N=a(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[O,C]);function B(e,n){return{interpolation:{pattern:r(/((?:^|[^{])(?:\{\{)*)<<0>>/.source,[e]),lookbehind:!0,inside:{"format-string":{pattern:r(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source,[n,C]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:t.languages.csharp}}},string:/[\s\S]+/}}t.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:r(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source,[T]),lookbehind:!0,greedy:!0,inside:B(T,j)},{pattern:r(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source,[N]),lookbehind:!0,greedy:!0,inside:B(N,O)}]})}(Prism),Prism.languages.dotnet=Prism.languages.cs=Prism.languages.csharp,function(e){var n=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+n.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+n.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+n.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:n,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var t=e.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism),s=Prism,i=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,o=/(^|[^\w.])(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,l={pattern:RegExp(o+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}},s.languages.java=s.languages.extend("clike",{"class-name":[l,{pattern:RegExp(o+/[A-Z]\w*(?=\s+\w+\s*[;,=()])/.source),lookbehind:!0,inside:l.inside}],keyword:i,function:[s.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),s.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"}}),s.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":l,keyword:i,punctuation:/[<>(),.:]/,operator:/[?&|]/}},namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!<keyword>)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(/<keyword>/g,function(){return i.source})),lookbehind:!0,inside:{punctuation:/\./}}}),Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),Prism.languages.js=Prism.languages.javascript,Prism.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&amp;/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(e,n){var t={};t["language-"+n]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:Prism.languages[n]},t.cdata=/^<!\[CDATA\[|\]\]>$/i;var a={"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:t}};a["language-"+n]={pattern:/[\s\S]+/,inside:Prism.languages[n]};var r={};r[e]={pattern:RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g,function(){return e}),"i"),lookbehind:!0,greedy:!0,inside:a},Prism.languages.insertBefore("markup","cdata",r)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(e,n){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[n,"language-"+n],inside:Prism.languages[n]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml,function(n){var e=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,t=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],a=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,r=/<?=>|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,s=/[{}\[\](),:;]/;n.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:e,variable:/\$+(?:\w+\b|(?=\{))/i,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:bool|boolean|int|integer|float|string|object|array)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:bool|int|float|string|object|array(?!\s*\()|mixed|self|static|callable|iterable|(?:null|false)(?=\s*\|))\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*[\w|]\|\s*)(?:null|false)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:bool|int|float|string|object|void|array(?!\s*\()|mixed|self|static|callable|iterable|(?:null|false)(?=\s*\|))\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?[\w|]\|\s*)(?:null|false)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:bool|int|float|string|object|void|array(?!\s*\()|mixed|iterable|(?:null|false)(?=\s*\|))\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:null|false)\b/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:__halt_compiler|abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|namespace|match|new|or|parent|print|private|protected|public|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s+)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:a,operator:r,punctuation:s};var i={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:n.languages.php},o=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:i}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:i}}];n.languages.insertBefore("php","variable",{string:o,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:e,string:o,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,number:a,operator:r,punctuation:s}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),n.hooks.add("before-tokenize",function(e){/<\?/.test(e.code)&&n.languages["markup-templating"].buildPlaceholders(e,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/gi)}),n.hooks.add("after-tokenize",function(e){n.languages["markup-templating"].tokenizePlaceholders(e,"php")})}(Prism),Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},"string-interpolation":{pattern:/(?:f|rf|fr)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|rb|br)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/im,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:True|False|None)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python,function(e){e.languages.ruby=e.languages.extend("clike",{comment:[/#.*/,{pattern:/^=begin\s[\s\S]*?^=end/m,greedy:!0}],"class-name":{pattern:/(\b(?:class)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|protected|private|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/});var n={pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"tag"},rest:e.languages.ruby}};delete e.languages.ruby.function,e.languages.insertBefore("ruby","keyword",{regex:[{pattern:RegExp(/%r/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S])*\)/.source,/\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S])*\]/.source,/<(?:[^<>\\]|\\[\s\S])*>/.source].join("|")+")"+/[egimnosux]{0,6}/.source),greedy:!0,inside:{interpolation:n}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:n}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:{pattern:/(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/,lookbehind:!0},"method-definition":{pattern:/(\bdef\s+)[\w.]+/,lookbehind:!0,inside:{function:/\w+$/,rest:e.languages.ruby}}}),e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|Fixnum|Float|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,constant:/\b[A-Z]\w*(?:[?!]|\b)/}),e.languages.ruby.string=[{pattern:RegExp(/%[qQiIwWxs]?/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S])*\)/.source,/\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S])*\]/.source,/<(?:[^<>\\]|\\[\s\S])*>/.source].join("|")+")"),greedy:!0,inside:{interpolation:n}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:n}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|[a-z_]\w*$/i,alias:"symbol",inside:{punctuation:/^<<[-~]?/}},interpolation:n}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|[a-z_]\w*$/i,alias:"symbol",inside:{punctuation:/^<<[-~]?'|'$/}}}}],e.languages.rb=e.languages.ruby}(Prism),{boltExport:c.exports}},"object"==typeof e&&void 0!==n?n.exports=a():(t="undefined"!=typeof globalThis?globalThis:t||self).EphoxContactWrapper=a();window.Prism;window.Prism=r}(b,m);var k=m.exports.boltExport;t.add("codesample",function(n){var t,r,a,s;function e(){return s.execCommand("codesample")}r=(t=n).$,t.on("PreProcess",function(e){r("pre[contenteditable=false]",e.node).filter(c(u)).each(function(e,n){var t=r(n),a=n.textContent;t.attr("class",r.trim(t.attr("class"))),t.removeAttr("contentEditable"),t.empty().append(r("<code></code>").each(function(){this.textContent=a}))})}),t.on("SetContent",function(){var e=r("pre").filter(c(u)).filter(function(e,n){return"false"!==n.contentEditable});e.length&&t.undoManager.transact(function(){e.each(function(e,n){r(n).find("br").each(function(e,n){n.parentNode.replaceChild(t.getDoc().createTextNode("\n"),n)}),n.contentEditable="false",n.innerHTML=t.dom.encode(n.textContent),h(t).highlightElement(n),n.className=r.trim(n.className)})})}),(s=n).ui.registry.addToggleButton("codesample",{icon:"code-sample",tooltip:"Insert/edit code sample",onAction:e,onSetup:function(t){function e(){var e,n;t.setActive((n=(e=s).selection.getStart(),e.dom.is(n,'pre[class*="language-"]')))}return s.on("NodeChange",e),function(){return s.off("NodeChange",e)}}}),s.ui.registry.addMenuItem("codesample",{text:"Code sample...",icon:"code-sample",onAction:e}),(a=n).addCommand("codesample",function(){var e=a.selection.getNode();a.selection.isCollapsed()||u(e)?w(a):a.formatter.toggle("code")}),n.on("dblclick",function(e){u(e.target)&&w(n)})})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/colorpicker/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/colorpicker/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..3b9247355012f0ed53cbb65a321876f3e58c2887
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/colorpicker/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("colorpicker",function(){})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/contextmenu/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/contextmenu/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..258bb2c94ca6ef613372135012b3a3d00b7c4f4b
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/contextmenu/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("contextmenu",function(){})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/directionality/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/directionality/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..9cf34afe5a349e6c23713329b22ade9d67a22a2d
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/directionality/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function n(t){return function(n){return typeof n===t}}function u(n){return function(){return n}}function t(n){return n}function r(){return d}var o,e=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=function(n){return r=typeof(t=n),(null===t?"null":"object"==r&&(Array.prototype.isPrototypeOf(t)||t.constructor&&"Array"===t.constructor.name)?"array":"object"==r&&(String.prototype.isPrototypeOf(t)||t.constructor&&"String"===t.constructor.name)?"string":r)===o;var t,r},c=n("boolean"),f=n("function"),l=n("number"),a=u(!(o="string")),m=u(!0),d={fold:function(n,t){return n()},isSome:a,isNone:m,getOr:t,getOrThunk:s,getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:u(null),getOrUndefined:u(void 0),or:t,orThunk:s,map:r,each:function(){},bind:r,exists:a,forall:m,filter:function(){return d},toArray:function(){return[]},toString:u("none()")};function s(n){return n()}function g(n,t){for(var r=0,o=n.length;r<o;r++)t(n[r],r)}function h(n,t){var r=n.dom;if(1!==r.nodeType)return!1;var o=r;if(void 0!==o.matches)return o.matches(t);if(void 0!==o.msMatchesSelector)return o.msMatchesSelector(t);if(void 0!==o.webkitMatchesSelector)return o.webkitMatchesSelector(t);if(void 0!==o.mozMatchesSelector)return o.mozMatchesSelector(t);throw new Error("Browser lacks native selectors")}function v(n){if(null==n)throw new Error("Node cannot be null or undefined");return{dom:n}}var p=function(r){function n(){return e}function t(n){return n(r)}var o=u(r),e={fold:function(n,t){return t(r)},isSome:m,isNone:a,getOr:o,getOrThunk:o,getOrDie:o,getOrNull:o,getOrUndefined:o,or:n,orThunk:n,map:function(n){return p(n(r))},each:function(n){n(r)},bind:t,exists:t,forall:t,filter:function(n){return n(r)?e:d},toArray:function(){return[r]},toString:function(){return"some("+r+")"}};return e},y={some:p,none:r,from:function(n){return null==n?d:p(n)}},w={fromHtml:function(n,t){var r=(t||document).createElement("div");if(r.innerHTML=n,!r.hasChildNodes()||1<r.childNodes.length)throw console.error("HTML does not have a single root node",n),new Error("HTML must have a single root node");return v(r.childNodes[0])},fromTag:function(n,t){var r=(t||document).createElement(n);return v(r)},fromText:function(n,t){var r=(t||document).createTextNode(n);return v(r)},fromDom:v,fromPoint:function(n,t,r){return y.from(n.dom.elementFromPoint(t,r)).map(v)}};function D(t){return function(n){return n.dom.nodeType===t}}function N(n,t,r){!function(n,t,r){if(!(i(r)||c(r)||l(r)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",r,":: Element ",n),new Error("Attribute value was not simple");n.setAttribute(t,r+"")}(n.dom,t,r)}function T(n,t){n.dom.removeAttribute(t)}function S(n){return w.fromDom(n.dom.host)}function b(e,u,n){return function(n){for(var t=e.dom,r=f(n)?n:a;t.parentNode;){var t=t.parentNode,o=w.fromDom(t);if(h(o,u))return y.some(o);if(r(o))break}return y.none()}(n)}function O(n){return"rtl"===(r="direction",o=(t=n).dom,""!==(e=window.getComputedStyle(o).getPropertyValue(r))||B(t)?e:H(o,r))?"rtl":"ltr";var t,r,o,e}function A(n,t){return r=function(n){return h(n,t)},function(n,t){for(var r=[],o=0,e=n.length;o<e;o++){var u=n[o];t(u,o)&&r.push(u)}return r}(function(n,t){for(var r=n.length,o=new Array(r),e=0;e<r;e++){var u=n[e];o[e]=t(u,e)}return o}(n.dom.childNodes,w.fromDom),r);var r}function C(n,u){var t=n.selection.getSelectedBlocks();0<t.length&&(g(t,function(n){var t,r=w.fromDom(n),o=k(r),e=(t=r,(o?b(t,"ol,ul"):y.some(t)).getOr(t));y.from(e.dom.parentNode).map(w.fromDom).filter(E).each(function(n){O(n)!==u?N(e,"dir",u):O(e)!==u&&T(e,"dir"),o&&g(A(e,"li[dir]"),function(n){return T(n,"dir"),0})})}),n.nodeChanged())}function M(t,o){return function(r){function n(n){var t=w.fromDom(n.element);r.setActive(O(t)===o)}return t.on("NodeChange",n),function(){return t.off("NodeChange",n)}}}"undefined"!=typeof window||Function("return this;")();function k(n){return E(n)&&"li"===n.dom.nodeName.toLowerCase()}var E=D(1),L=D(3),P=D(9),R=D(11),x=f(Element.prototype.attachShadow)&&f(Node.prototype.getRootNode)?function(n){return w.fromDom(n.dom.getRootNode())}:function(n){return P(n)?n:w.fromDom(n.dom.ownerDocument)},B=function(n){var t=L(n)?n.dom.parentNode:n.dom;if(null==t||null===t.ownerDocument)return!1;var r,o,e,u,i,c=t.ownerDocument;return e=w.fromDom(t),i=x(e),(R(u=i)&&null!=u.dom.host?y.some(i):y.none()).fold(function(){return c.body.contains(t)},(r=B,o=S,function(n){return r(o(n))}))},H=function(n,t){return void 0!==n.style&&f(n.style.getPropertyValue)?n.style.getPropertyValue(t):""};e.add("directionality",function(n){var t,r;(t=n).addCommand("mceDirectionLTR",function(){C(t,"ltr")}),t.addCommand("mceDirectionRTL",function(){C(t,"rtl")}),(r=n).ui.registry.addToggleButton("ltr",{tooltip:"Left to right",icon:"ltr",onAction:function(){return r.execCommand("mceDirectionLTR")},onSetup:M(r,"ltr")}),r.ui.registry.addToggleButton("rtl",{tooltip:"Right to left",icon:"rtl",onAction:function(){return r.execCommand("mceDirectionRTL")},onSetup:M(r,"rtl")})})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/emoticons/js/emojiimages.js b/public/static/assets/gougu/module/tinymce/plugins/emoticons/js/emojiimages.js
new file mode 100644
index 0000000000000000000000000000000000000000..d5f9734baa6067db1a55acfb8ad13975a21c22b4
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/emoticons/js/emojiimages.js
@@ -0,0 +1,9424 @@
+// Source: npm package: emojilib
+// Images provided by twemoji: https://github.com/twitter/twemoji
+window.tinymce.Resource.add("tinymce.plugins.emoticons", {
+  100: {
+    keywords: [ "score", "perfect", "numbers", "century", "exam", "quiz", "test", "pass", "hundred" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcaf" src="1f4af.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  1234: {
+    keywords: [ "numbers", "blue-square" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd22" src="1f522.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  grinning: {
+    keywords: [ "face", "smile", "happy", "joy", ":D", "grin" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude00" src="1f600.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  grimacing: {
+    keywords: [ "face", "grimace", "teeth" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude2c" src="1f62c.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  grin: {
+    keywords: [ "face", "happy", "smile", "joy", "kawaii" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude01" src="1f601.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  joy: {
+    keywords: [ "face", "cry", "tears", "weep", "happy", "happytears", "haha" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude02" src="1f602.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  rofl: {
+    keywords: [ "face", "rolling", "floor", "laughing", "lol", "haha" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd23" src="1f923.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  partying: {
+    keywords: [ "face", "celebration", "woohoo" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd73" src="1f973.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  smiley: {
+    keywords: [ "face", "happy", "joy", "haha", ":D", ":)", "smile", "funny" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude03" src="1f603.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  smile: {
+    keywords: [ "face", "happy", "joy", "funny", "haha", "laugh", "like", ":D", ":)" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude04" src="1f604.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  sweat_smile: {
+    keywords: [ "face", "hot", "happy", "laugh", "sweat", "smile", "relief" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude05" src="1f605.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  laughing: {
+    keywords: [ "happy", "joy", "lol", "satisfied", "haha", "face", "glad", "XD", "laugh" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude06" src="1f606.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  innocent: {
+    keywords: [ "face", "angel", "heaven", "halo" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude07" src="1f607.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  wink: {
+    keywords: [ "face", "happy", "mischievous", "secret", ";)", "smile", "eye" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude09" src="1f609.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  blush: {
+    keywords: [ "face", "smile", "happy", "flushed", "crush", "embarrassed", "shy", "joy" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude0a" src="1f60a.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  slightly_smiling_face: {
+    keywords: [ "face", "smile" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude42" src="1f642.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  upside_down_face: {
+    keywords: [ "face", "flipped", "silly", "smile" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude43" src="1f643.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  relaxed: {
+    keywords: [ "face", "blush", "massage", "happiness" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u263a\ufe0f" src="263a.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  yum: {
+    keywords: [ "happy", "joy", "tongue", "smile", "face", "silly", "yummy", "nom", "delicious", "savouring" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude0b" src="1f60b.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  relieved: {
+    keywords: [ "face", "relaxed", "phew", "massage", "happiness" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude0c" src="1f60c.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  heart_eyes: {
+    keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "crush", "heart" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude0d" src="1f60d.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  smiling_face_with_three_hearts: {
+    keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "crush", "hearts", "adore" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd70" src="1f970.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  kissing_heart: {
+    keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "kiss" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude18" src="1f618.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  kissing: {
+    keywords: [ "love", "like", "face", "3", "valentines", "infatuation", "kiss" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude17" src="1f617.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  kissing_smiling_eyes: {
+    keywords: [ "face", "affection", "valentines", "infatuation", "kiss" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude19" src="1f619.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  kissing_closed_eyes: {
+    keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "kiss" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude1a" src="1f61a.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  stuck_out_tongue_winking_eye: {
+    keywords: [ "face", "prank", "childish", "playful", "mischievous", "smile", "wink", "tongue" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude1c" src="1f61c.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  zany: {
+    keywords: [ "face", "goofy", "crazy" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd2a" src="1f92a.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  raised_eyebrow: {
+    keywords: [ "face", "distrust", "scepticism", "disapproval", "disbelief", "surprise" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd28" src="1f928.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  monocle: {
+    keywords: [ "face", "stuffy", "wealthy" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddd0" src="1f9d0.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  stuck_out_tongue_closed_eyes: {
+    keywords: [ "face", "prank", "playful", "mischievous", "smile", "tongue" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude1d" src="1f61d.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  stuck_out_tongue: {
+    keywords: [ "face", "prank", "childish", "playful", "mischievous", "smile", "tongue" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude1b" src="1f61b.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  money_mouth_face: {
+    keywords: [ "face", "rich", "dollar", "money" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd11" src="1f911.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  nerd_face: {
+    keywords: [ "face", "nerdy", "geek", "dork" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd13" src="1f913.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  sunglasses: {
+    keywords: [ "face", "cool", "smile", "summer", "beach", "sunglass" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude0e" src="1f60e.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  star_struck: {
+    keywords: [ "face", "smile", "starry", "eyes", "grinning" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd29" src="1f929.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  clown_face: {
+    keywords: [ "face" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd21" src="1f921.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  cowboy_hat_face: {
+    keywords: [ "face", "cowgirl", "hat" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd20" src="1f920.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  hugs: {
+    keywords: [ "face", "smile", "hug" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd17" src="1f917.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  smirk: {
+    keywords: [ "face", "smile", "mean", "prank", "smug", "sarcasm" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude0f" src="1f60f.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  no_mouth: {
+    keywords: [ "face", "hellokitty" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude36" src="1f636.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  neutral_face: {
+    keywords: [ "indifference", "meh", ":|", "neutral" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude10" src="1f610.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  expressionless: {
+    keywords: [ "face", "indifferent", "-_-", "meh", "deadpan" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude11" src="1f611.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  unamused: {
+    keywords: [ "indifference", "bored", "straight face", "serious", "sarcasm", "unimpressed", "skeptical", "dubious", "side_eye" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude12" src="1f612.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  roll_eyes: {
+    keywords: [ "face", "eyeroll", "frustrated" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude44" src="1f644.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  thinking: {
+    keywords: [ "face", "hmmm", "think", "consider" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd14" src="1f914.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  lying_face: {
+    keywords: [ "face", "lie", "pinocchio" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd25" src="1f925.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  hand_over_mouth: {
+    keywords: [ "face", "whoops", "shock", "surprise" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd2d" src="1f92d.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  shushing: {
+    keywords: [ "face", "quiet", "shhh" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd2b" src="1f92b.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  symbols_over_mouth: {
+    keywords: [ "face", "swearing", "cursing", "cussing", "profanity", "expletive" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd2c" src="1f92c.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  exploding_head: {
+    keywords: [ "face", "shocked", "mind", "blown" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd2f" src="1f92f.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  flushed: {
+    keywords: [ "face", "blush", "shy", "flattered" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude33" src="1f633.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  disappointed: {
+    keywords: [ "face", "sad", "upset", "depressed", ":(" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude1e" src="1f61e.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  worried: {
+    keywords: [ "face", "concern", "nervous", ":(" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude1f" src="1f61f.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  angry: {
+    keywords: [ "mad", "face", "annoyed", "frustrated" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude20" src="1f620.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  rage: {
+    keywords: [ "angry", "mad", "hate", "despise" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude21" src="1f621.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  pensive: {
+    keywords: [ "face", "sad", "depressed", "upset" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude14" src="1f614.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  confused: {
+    keywords: [ "face", "indifference", "huh", "weird", "hmmm", ":/" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude15" src="1f615.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  slightly_frowning_face: {
+    keywords: [ "face", "frowning", "disappointed", "sad", "upset" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude41" src="1f641.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  frowning_face: {
+    keywords: [ "face", "sad", "upset", "frown" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2639" src="2639.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  persevere: {
+    keywords: [ "face", "sick", "no", "upset", "oops" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude23" src="1f623.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  confounded: {
+    keywords: [ "face", "confused", "sick", "unwell", "oops", ":S" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude16" src="1f616.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  tired_face: {
+    keywords: [ "sick", "whine", "upset", "frustrated" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude2b" src="1f62b.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  weary: {
+    keywords: [ "face", "tired", "sleepy", "sad", "frustrated", "upset" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude29" src="1f629.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  pleading: {
+    keywords: [ "face", "begging", "mercy" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd7a" src="1f97a.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  triumph: {
+    keywords: [ "face", "gas", "phew", "proud", "pride" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude24" src="1f624.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  open_mouth: {
+    keywords: [ "face", "surprise", "impressed", "wow", "whoa", ":O" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude2e" src="1f62e.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  scream: {
+    keywords: [ "face", "munch", "scared", "omg" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude31" src="1f631.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  fearful: {
+    keywords: [ "face", "scared", "terrified", "nervous", "oops", "huh" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude28" src="1f628.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  cold_sweat: {
+    keywords: [ "face", "nervous", "sweat" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude30" src="1f630.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  hushed: {
+    keywords: [ "face", "woo", "shh" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude2f" src="1f62f.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  frowning: {
+    keywords: [ "face", "aw", "what" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude26" src="1f626.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  anguished: {
+    keywords: [ "face", "stunned", "nervous" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude27" src="1f627.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  cry: {
+    keywords: [ "face", "tears", "sad", "depressed", "upset", ":'(" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude22" src="1f622.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  disappointed_relieved: {
+    keywords: [ "face", "phew", "sweat", "nervous" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude25" src="1f625.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  drooling_face: {
+    keywords: [ "face" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd24" src="1f924.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  sleepy: {
+    keywords: [ "face", "tired", "rest", "nap" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude2a" src="1f62a.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  sweat: {
+    keywords: [ "face", "hot", "sad", "tired", "exercise" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude13" src="1f613.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  hot: {
+    keywords: [ "face", "feverish", "heat", "red", "sweating" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd75" src="1f975.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  cold: {
+    keywords: [ "face", "blue", "freezing", "frozen", "frostbite", "icicles" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd76" src="1f976.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  sob: {
+    keywords: [ "face", "cry", "tears", "sad", "upset", "depressed" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude2d" src="1f62d.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  dizzy_face: {
+    keywords: [ "spent", "unconscious", "xox", "dizzy" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude35" src="1f635.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  astonished: {
+    keywords: [ "face", "xox", "surprised", "poisoned" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude32" src="1f632.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  zipper_mouth_face: {
+    keywords: [ "face", "sealed", "zipper", "secret" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd10" src="1f910.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  nauseated_face: {
+    keywords: [ "face", "vomit", "gross", "green", "sick", "throw up", "ill" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd22" src="1f922.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  sneezing_face: {
+    keywords: [ "face", "gesundheit", "sneeze", "sick", "allergy" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd27" src="1f927.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  vomiting: {
+    keywords: [ "face", "sick" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd2e" src="1f92e.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  mask: {
+    keywords: [ "face", "sick", "ill", "disease" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude37" src="1f637.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  face_with_thermometer: {
+    keywords: [ "sick", "temperature", "thermometer", "cold", "fever" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd12" src="1f912.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  face_with_head_bandage: {
+    keywords: [ "injured", "clumsy", "bandage", "hurt" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd15" src="1f915.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  woozy: {
+    keywords: [ "face", "dizzy", "intoxicated", "tipsy", "wavy" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd74" src="1f974.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  sleeping: {
+    keywords: [ "face", "tired", "sleepy", "night", "zzz" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude34" src="1f634.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  zzz: {
+    keywords: [ "sleepy", "tired", "dream" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udca4" src="1f4a4.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  poop: {
+    keywords: [ "hankey", "shitface", "fail", "turd", "shit" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udca9" src="1f4a9.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  smiling_imp: {
+    keywords: [ "devil", "horns" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude08" src="1f608.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  imp: {
+    keywords: [ "devil", "angry", "horns" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc7f" src="1f47f.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  japanese_ogre: {
+    keywords: [ "monster", "red", "mask", "halloween", "scary", "creepy", "devil", "demon", "japanese", "ogre" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc79" src="1f479.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  japanese_goblin: {
+    keywords: [ "red", "evil", "mask", "monster", "scary", "creepy", "japanese", "goblin" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc7a" src="1f47a.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  skull: {
+    keywords: [ "dead", "skeleton", "creepy", "death" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc80" src="1f480.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  ghost: {
+    keywords: [ "halloween", "spooky", "scary" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc7b" src="1f47b.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  alien: {
+    keywords: [ "UFO", "paul", "weird", "outer_space" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc7d" src="1f47d.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  robot: {
+    keywords: [ "computer", "machine", "bot" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd16" src="1f916.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  smiley_cat: {
+    keywords: [ "animal", "cats", "happy", "smile" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude3a" src="1f63a.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  smile_cat: {
+    keywords: [ "animal", "cats", "smile" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude38" src="1f638.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  joy_cat: {
+    keywords: [ "animal", "cats", "haha", "happy", "tears" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude39" src="1f639.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  heart_eyes_cat: {
+    keywords: [ "animal", "love", "like", "affection", "cats", "valentines", "heart" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude3b" src="1f63b.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  smirk_cat: {
+    keywords: [ "animal", "cats", "smirk" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude3c" src="1f63c.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  kissing_cat: {
+    keywords: [ "animal", "cats", "kiss" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude3d" src="1f63d.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  scream_cat: {
+    keywords: [ "animal", "cats", "munch", "scared", "scream" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude40" src="1f640.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  crying_cat_face: {
+    keywords: [ "animal", "tears", "weep", "sad", "cats", "upset", "cry" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude3f" src="1f63f.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  pouting_cat: {
+    keywords: [ "animal", "cats" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude3e" src="1f63e.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  palms_up: {
+    keywords: [ "hands", "gesture", "cupped", "prayer" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd32" src="1f932.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  raised_hands: {
+    keywords: [ "gesture", "hooray", "yea", "celebration", "hands" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude4c" src="1f64c.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  clap: {
+    keywords: [ "hands", "praise", "applause", "congrats", "yay" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc4f" src="1f44f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  wave: {
+    keywords: [ "hands", "gesture", "goodbye", "solong", "farewell", "hello", "hi", "palm" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc4b" src="1f44b.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  call_me_hand: {
+    keywords: [ "hands", "gesture" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd19" src="1f919.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  "+1": {
+    keywords: [ "thumbsup", "yes", "awesome", "good", "agree", "accept", "cool", "hand", "like" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc4d" src="1f44d.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  "-1": {
+    keywords: [ "thumbsdown", "no", "dislike", "hand" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc4e" src="1f44e.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  facepunch: {
+    keywords: [ "angry", "violence", "fist", "hit", "attack", "hand" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc4a" src="1f44a.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  fist: {
+    keywords: [ "fingers", "hand", "grasp" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u270a" src="270a.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  fist_left: {
+    keywords: [ "hand", "fistbump" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd1b" src="1f91b.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  fist_right: {
+    keywords: [ "hand", "fistbump" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd1c" src="1f91c.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  v: {
+    keywords: [ "fingers", "ohyeah", "hand", "peace", "victory", "two" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u270c" src="270c.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  ok_hand: {
+    keywords: [ "fingers", "limbs", "perfect", "ok", "okay" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc4c" src="1f44c.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  raised_hand: {
+    keywords: [ "fingers", "stop", "highfive", "palm", "ban" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u270b" src="270b.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  raised_back_of_hand: {
+    keywords: [ "fingers", "raised", "backhand" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd1a" src="1f91a.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  open_hands: {
+    keywords: [ "fingers", "butterfly", "hands", "open" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc50" src="1f450.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  muscle: {
+    keywords: [ "arm", "flex", "hand", "summer", "strong", "biceps" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcaa" src="1f4aa.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  pray: {
+    keywords: [ "please", "hope", "wish", "namaste", "highfive" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude4f" src="1f64f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  foot: {
+    keywords: [ "kick", "stomp" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddb6" src="1f9b6.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  leg: {
+    keywords: [ "kick", "limb" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddb5" src="1f9b5.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  handshake: {
+    keywords: [ "agreement", "shake" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd1d" src="1f91d.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  point_up: {
+    keywords: [ "hand", "fingers", "direction", "up" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u261d" src="261d.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  point_up_2: {
+    keywords: [ "fingers", "hand", "direction", "up" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc46" src="1f446.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  point_down: {
+    keywords: [ "fingers", "hand", "direction", "down" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc47" src="1f447.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  point_left: {
+    keywords: [ "direction", "fingers", "hand", "left" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc48" src="1f448.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  point_right: {
+    keywords: [ "fingers", "hand", "direction", "right" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc49" src="1f449.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  fu: {
+    keywords: [ "hand", "fingers", "rude", "middle", "flipping" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd95" src="1f595.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  raised_hand_with_fingers_splayed: {
+    keywords: [ "hand", "fingers", "palm" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd90" src="1f590.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  love_you: {
+    keywords: [ "hand", "fingers", "gesture" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd1f" src="1f91f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  metal: {
+    keywords: [ "hand", "fingers", "evil_eye", "sign_of_horns", "rock_on" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd18" src="1f918.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  crossed_fingers: {
+    keywords: [ "good", "lucky" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd1e" src="1f91e.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  vulcan_salute: {
+    keywords: [ "hand", "fingers", "spock", "star trek" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd96" src="1f596.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  writing_hand: {
+    keywords: [ "lower_left_ballpoint_pen", "stationery", "write", "compose" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u270d" src="270d.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  selfie: {
+    keywords: [ "camera", "phone" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd33" src="1f933.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  nail_care: {
+    keywords: [ "beauty", "manicure", "finger", "fashion", "nail" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc85" src="1f485.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  lips: {
+    keywords: [ "mouth", "kiss" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc44" src="1f444.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  tooth: {
+    keywords: [ "teeth", "dentist" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddb7" src="1f9b7.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  tongue: {
+    keywords: [ "mouth", "playful" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc45" src="1f445.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  ear: {
+    keywords: [ "face", "hear", "sound", "listen" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc42" src="1f442.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  nose: {
+    keywords: [ "smell", "sniff" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc43" src="1f443.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  eye: {
+    keywords: [ "face", "look", "see", "watch", "stare" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc41" src="1f441.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  eyes: {
+    keywords: [ "look", "watch", "stalk", "peek", "see" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc40" src="1f440.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  brain: {
+    keywords: [ "smart", "intelligent" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udde0" src="1f9e0.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  bust_in_silhouette: {
+    keywords: [ "user", "person", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc64" src="1f464.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  busts_in_silhouette: {
+    keywords: [ "user", "person", "human", "group", "team" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc65" src="1f465.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  speaking_head: {
+    keywords: [ "user", "person", "human", "sing", "say", "talk" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udde3" src="1f5e3.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  baby: {
+    keywords: [ "child", "boy", "girl", "toddler" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc76" src="1f476.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  child: {
+    keywords: [ "gender-neutral", "young" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddd2" src="1f9d2.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  boy: {
+    keywords: [ "man", "male", "guy", "teenager" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc66" src="1f466.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  girl: {
+    keywords: [ "female", "woman", "teenager" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc67" src="1f467.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  adult: {
+    keywords: [ "gender-neutral", "person" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddd1" src="1f9d1.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man: {
+    keywords: [ "mustache", "father", "dad", "guy", "classy", "sir", "moustache" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68" src="1f468.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman: {
+    keywords: [ "female", "girls", "lady" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69" src="1f469.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  blonde_woman: {
+    keywords: [ "woman", "female", "girl", "blonde", "person" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc71\u200d\u2640\ufe0f" src="1f471-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  blonde_man: {
+    keywords: [ "man", "male", "boy", "blonde", "guy", "person" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc71" src="1f471.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  bearded_person: {
+    keywords: [ "person", "bewhiskered" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddd4" src="1f9d4.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  older_adult: {
+    keywords: [ "human", "elder", "senior", "gender-neutral" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddd3" src="1f9d3.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  older_man: {
+    keywords: [ "human", "male", "men", "old", "elder", "senior" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc74" src="1f474.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  older_woman: {
+    keywords: [ "human", "female", "women", "lady", "old", "elder", "senior" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc75" src="1f475.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_with_gua_pi_mao: {
+    keywords: [ "male", "boy", "chinese" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc72" src="1f472.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_with_headscarf: {
+    keywords: [ "female", "hijab", "mantilla", "tichel" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddd5" src="1f9d5.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_with_turban: {
+    keywords: [ "female", "indian", "hinduism", "arabs", "woman" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc73\u200d\u2640\ufe0f" src="1f473-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_with_turban: {
+    keywords: [ "male", "indian", "hinduism", "arabs" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc73" src="1f473.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  policewoman: {
+    keywords: [ "woman", "police", "law", "legal", "enforcement", "arrest", "911", "female" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc6e\u200d\u2640\ufe0f" src="1f46e-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  policeman: {
+    keywords: [ "man", "police", "law", "legal", "enforcement", "arrest", "911" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc6e" src="1f46e.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  construction_worker_woman: {
+    keywords: [ "female", "human", "wip", "build", "construction", "worker", "labor", "woman" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc77\u200d\u2640\ufe0f" src="1f477-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  construction_worker_man: {
+    keywords: [ "male", "human", "wip", "guy", "build", "construction", "worker", "labor" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc77" src="1f477.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  guardswoman: {
+    keywords: [ "uk", "gb", "british", "female", "royal", "woman" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc82\u200d\u2640\ufe0f" src="1f482-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  guardsman: {
+    keywords: [ "uk", "gb", "british", "male", "guy", "royal" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc82" src="1f482.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  female_detective: {
+    keywords: [ "human", "spy", "detective", "female", "woman" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd75\ufe0f\u200d\u2640\ufe0f" src="1f575-fe0f-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  male_detective: {
+    keywords: [ "human", "spy", "detective" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd75" src="1f575.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_health_worker: {
+    keywords: [ "doctor", "nurse", "therapist", "healthcare", "woman", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\u2695\ufe0f" src="1f469-200d-2695-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_health_worker: {
+    keywords: [ "doctor", "nurse", "therapist", "healthcare", "man", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\u2695\ufe0f" src="1f468-200d-2695-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_farmer: {
+    keywords: [ "rancher", "gardener", "woman", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83c\udf3e" src="1f469-200d-1f33e.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_farmer: {
+    keywords: [ "rancher", "gardener", "man", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83c\udf3e" src="1f468-200d-1f33e.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_cook: {
+    keywords: [ "chef", "woman", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83c\udf73" src="1f469-200d-1f373.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_cook: {
+    keywords: [ "chef", "man", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83c\udf73" src="1f468-200d-1f373.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_student: {
+    keywords: [ "graduate", "woman", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83c\udf93" src="1f469-200d-1f393.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_student: {
+    keywords: [ "graduate", "man", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83c\udf93" src="1f468-200d-1f393.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_singer: {
+    keywords: [ "rockstar", "entertainer", "woman", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83c\udfa4" src="1f469-200d-1f3a4.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_singer: {
+    keywords: [ "rockstar", "entertainer", "man", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83c\udfa4" src="1f468-200d-1f3a4.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_teacher: {
+    keywords: [ "instructor", "professor", "woman", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83c\udfeb" src="1f469-200d-1f3eb.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_teacher: {
+    keywords: [ "instructor", "professor", "man", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83c\udfeb" src="1f468-200d-1f3eb.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_factory_worker: {
+    keywords: [ "assembly", "industrial", "woman", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83c\udfed" src="1f469-200d-1f3ed.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_factory_worker: {
+    keywords: [ "assembly", "industrial", "man", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83c\udfed" src="1f468-200d-1f3ed.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_technologist: {
+    keywords: [ "coder", "developer", "engineer", "programmer", "software", "woman", "human", "laptop", "computer" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83d\udcbb" src="1f469-200d-1f4bb.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_technologist: {
+    keywords: [ "coder", "developer", "engineer", "programmer", "software", "man", "human", "laptop", "computer" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udcbb" src="1f468-200d-1f4bb.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_office_worker: {
+    keywords: [ "business", "manager", "woman", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83d\udcbc" src="1f469-200d-1f4bc.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_office_worker: {
+    keywords: [ "business", "manager", "man", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udcbc" src="1f468-200d-1f4bc.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_mechanic: {
+    keywords: [ "plumber", "woman", "human", "wrench" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83d\udd27" src="1f469-200d-1f527.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_mechanic: {
+    keywords: [ "plumber", "man", "human", "wrench" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udd27" src="1f468-200d-1f527.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_scientist: {
+    keywords: [ "biologist", "chemist", "engineer", "physicist", "woman", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83d\udd2c" src="1f469-200d-1f52c.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_scientist: {
+    keywords: [ "biologist", "chemist", "engineer", "physicist", "man", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udd2c" src="1f468-200d-1f52c.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_artist: {
+    keywords: [ "painter", "woman", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83c\udfa8" src="1f469-200d-1f3a8.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_artist: {
+    keywords: [ "painter", "man", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83c\udfa8" src="1f468-200d-1f3a8.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_firefighter: {
+    keywords: [ "fireman", "woman", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83d\ude92" src="1f469-200d-1f692.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_firefighter: {
+    keywords: [ "fireman", "man", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\ude92" src="1f468-200d-1f692.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_pilot: {
+    keywords: [ "aviator", "plane", "woman", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\u2708\ufe0f" src="1f469-200d-2708-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_pilot: {
+    keywords: [ "aviator", "plane", "man", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\u2708\ufe0f" src="1f468-200d-2708-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_astronaut: {
+    keywords: [ "space", "rocket", "woman", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83d\ude80" src="1f469-200d-1f680.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_astronaut: {
+    keywords: [ "space", "rocket", "man", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\ude80" src="1f468-200d-1f680.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_judge: {
+    keywords: [ "justice", "court", "woman", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\u2696\ufe0f" src="1f469-200d-2696-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_judge: {
+    keywords: [ "justice", "court", "man", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\u2696\ufe0f" src="1f468-200d-2696-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_superhero: {
+    keywords: [ "woman", "female", "good", "heroine", "superpowers" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddb8\u200d\u2640\ufe0f" src="1f9b8-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_superhero: {
+    keywords: [ "man", "male", "good", "hero", "superpowers" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddb8\u200d\u2642\ufe0f" src="1f9b8-200d-2642-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_supervillain: {
+    keywords: [ "woman", "female", "evil", "bad", "criminal", "heroine", "superpowers" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddb9\u200d\u2640\ufe0f" src="1f9b9-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_supervillain: {
+    keywords: [ "man", "male", "evil", "bad", "criminal", "hero", "superpowers" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddb9\u200d\u2642\ufe0f" src="1f9b9-200d-2642-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  mrs_claus: {
+    keywords: [ "woman", "female", "xmas", "mother christmas" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd36" src="1f936.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  santa: {
+    keywords: [ "festival", "man", "male", "xmas", "father christmas" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf85" src="1f385.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  sorceress: {
+    keywords: [ "woman", "female", "mage", "witch" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddd9\u200d\u2640\ufe0f" src="1f9d9-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  wizard: {
+    keywords: [ "man", "male", "mage", "sorcerer" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddd9\u200d\u2642\ufe0f" src="1f9d9-200d-2642-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_elf: {
+    keywords: [ "woman", "female" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udddd\u200d\u2640\ufe0f" src="1f9dd-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_elf: {
+    keywords: [ "man", "male" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udddd\u200d\u2642\ufe0f" src="1f9dd-200d-2642-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_vampire: {
+    keywords: [ "woman", "female" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udddb\u200d\u2640\ufe0f" src="1f9db-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_vampire: {
+    keywords: [ "man", "male", "dracula" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udddb\u200d\u2642\ufe0f" src="1f9db-200d-2642-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_zombie: {
+    keywords: [ "woman", "female", "undead", "walking dead" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udddf\u200d\u2640\ufe0f" src="1f9df-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  man_zombie: {
+    keywords: [ "man", "male", "dracula", "undead", "walking dead" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udddf\u200d\u2642\ufe0f" src="1f9df-200d-2642-fe0f.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  woman_genie: {
+    keywords: [ "woman", "female" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddde\u200d\u2640\ufe0f" src="1f9de-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  man_genie: {
+    keywords: [ "man", "male" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddde\u200d\u2642\ufe0f" src="1f9de-200d-2642-fe0f.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  mermaid: {
+    keywords: [ "woman", "female", "merwoman", "ariel" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udddc\u200d\u2640\ufe0f" src="1f9dc-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  merman: {
+    keywords: [ "man", "male", "triton" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udddc\u200d\u2642\ufe0f" src="1f9dc-200d-2642-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_fairy: {
+    keywords: [ "woman", "female" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddda\u200d\u2640\ufe0f" src="1f9da-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_fairy: {
+    keywords: [ "man", "male" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddda\u200d\u2642\ufe0f" src="1f9da-200d-2642-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  angel: {
+    keywords: [ "heaven", "wings", "halo" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc7c" src="1f47c.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  pregnant_woman: {
+    keywords: [ "baby" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd30" src="1f930.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  breastfeeding: {
+    keywords: [ "nursing", "baby" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd31" src="1f931.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  princess: {
+    keywords: [ "girl", "woman", "female", "blond", "crown", "royal", "queen" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc78" src="1f478.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  prince: {
+    keywords: [ "boy", "man", "male", "crown", "royal", "king" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd34" src="1f934.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  bride_with_veil: {
+    keywords: [ "couple", "marriage", "wedding", "woman", "bride" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc70" src="1f470.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_in_tuxedo: {
+    keywords: [ "couple", "marriage", "wedding", "groom" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd35" src="1f935.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  running_woman: {
+    keywords: [ "woman", "walking", "exercise", "race", "running", "female" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfc3\u200d\u2640\ufe0f" src="1f3c3-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  running_man: {
+    keywords: [ "man", "walking", "exercise", "race", "running" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfc3" src="1f3c3.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  walking_woman: {
+    keywords: [ "human", "feet", "steps", "woman", "female" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeb6\u200d\u2640\ufe0f" src="1f6b6-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  walking_man: {
+    keywords: [ "human", "feet", "steps" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeb6" src="1f6b6.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  dancer: {
+    keywords: [ "female", "girl", "woman", "fun" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc83" src="1f483.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_dancing: {
+    keywords: [ "male", "boy", "fun", "dancer" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd7a" src="1f57a.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  dancing_women: {
+    keywords: [ "female", "bunny", "women", "girls" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc6f" src="1f46f.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  dancing_men: {
+    keywords: [ "male", "bunny", "men", "boys" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc6f\u200d\u2642\ufe0f" src="1f46f-200d-2642-fe0f.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  couple: {
+    keywords: [ "pair", "people", "human", "love", "date", "dating", "like", "affection", "valentines", "marriage" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc6b" src="1f46b.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  two_men_holding_hands: {
+    keywords: [ "pair", "couple", "love", "like", "bromance", "friendship", "people", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc6c" src="1f46c.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  two_women_holding_hands: {
+    keywords: [ "pair", "friendship", "couple", "love", "like", "female", "people", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc6d" src="1f46d.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  bowing_woman: {
+    keywords: [ "woman", "female", "girl" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude47\u200d\u2640\ufe0f" src="1f647-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  bowing_man: {
+    keywords: [ "man", "male", "boy" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude47" src="1f647.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_facepalming: {
+    keywords: [ "man", "male", "boy", "disbelief" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd26\u200d\u2642\ufe0f" src="1f926-200d-2642-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_facepalming: {
+    keywords: [ "woman", "female", "girl", "disbelief" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd26\u200d\u2640\ufe0f" src="1f926-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_shrugging: {
+    keywords: [ "woman", "female", "girl", "confused", "indifferent", "doubt" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd37" src="1f937.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_shrugging: {
+    keywords: [ "man", "male", "boy", "confused", "indifferent", "doubt" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd37\u200d\u2642\ufe0f" src="1f937-200d-2642-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  tipping_hand_woman: {
+    keywords: [ "female", "girl", "woman", "human", "information" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc81" src="1f481.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  tipping_hand_man: {
+    keywords: [ "male", "boy", "man", "human", "information" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc81\u200d\u2642\ufe0f" src="1f481-200d-2642-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  no_good_woman: {
+    keywords: [ "female", "girl", "woman", "nope" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude45" src="1f645.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  no_good_man: {
+    keywords: [ "male", "boy", "man", "nope" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude45\u200d\u2642\ufe0f" src="1f645-200d-2642-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  ok_woman: {
+    keywords: [ "women", "girl", "female", "pink", "human", "woman" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude46" src="1f646.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  ok_man: {
+    keywords: [ "men", "boy", "male", "blue", "human", "man" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude46\u200d\u2642\ufe0f" src="1f646-200d-2642-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  raising_hand_woman: {
+    keywords: [ "female", "girl", "woman" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude4b" src="1f64b.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  raising_hand_man: {
+    keywords: [ "male", "boy", "man" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude4b\u200d\u2642\ufe0f" src="1f64b-200d-2642-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  pouting_woman: {
+    keywords: [ "female", "girl", "woman" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude4e" src="1f64e.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  pouting_man: {
+    keywords: [ "male", "boy", "man" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude4e\u200d\u2642\ufe0f" src="1f64e-200d-2642-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  frowning_woman: {
+    keywords: [ "female", "girl", "woman", "sad", "depressed", "discouraged", "unhappy" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude4d" src="1f64d.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  frowning_man: {
+    keywords: [ "male", "boy", "man", "sad", "depressed", "discouraged", "unhappy" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude4d\u200d\u2642\ufe0f" src="1f64d-200d-2642-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  haircut_woman: {
+    keywords: [ "female", "girl", "woman" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc87" src="1f487.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  haircut_man: {
+    keywords: [ "male", "boy", "man" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc87\u200d\u2642\ufe0f" src="1f487-200d-2642-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  massage_woman: {
+    keywords: [ "female", "girl", "woman", "head" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc86" src="1f486.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  massage_man: {
+    keywords: [ "male", "boy", "man", "head" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc86\u200d\u2642\ufe0f" src="1f486-200d-2642-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_in_steamy_room: {
+    keywords: [ "female", "woman", "spa", "steamroom", "sauna" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddd6\u200d\u2640\ufe0f" src="1f9d6-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_in_steamy_room: {
+    keywords: [ "male", "man", "spa", "steamroom", "sauna" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddd6\u200d\u2642\ufe0f" src="1f9d6-200d-2642-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  couple_with_heart_woman_man: {
+    keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc91" src="1f491.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  couple_with_heart_woman_woman: {
+    keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc69" src="1f469-200d-2764-fe0f-200d-1f469.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  couple_with_heart_man_man: {
+    keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68" src="1f468-200d-2764-fe0f-200d-1f468.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  couplekiss_man_woman: {
+    keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc8f" src="1f48f.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  couplekiss_woman_woman: {
+    keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69" src="1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  couplekiss_man_man: {
+    keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68" src="1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_man_woman_boy: {
+    keywords: [ "home", "parents", "child", "mom", "dad", "father", "mother", "people", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc6a" src="1f46a.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_man_woman_girl: {
+    keywords: [ "home", "parents", "people", "human", "child" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67" src="1f468-200d-1f469-200d-1f467.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_man_woman_girl_boy: {
+    keywords: [ "home", "parents", "people", "human", "children" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66" src="1f468-200d-1f469-200d-1f467-200d-1f466.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_man_woman_boy_boy: {
+    keywords: [ "home", "parents", "people", "human", "children" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66" src="1f468-200d-1f469-200d-1f466-200d-1f466.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_man_woman_girl_girl: {
+    keywords: [ "home", "parents", "people", "human", "children" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67" src="1f468-200d-1f469-200d-1f467-200d-1f467.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_woman_woman_boy: {
+    keywords: [ "home", "parents", "people", "human", "children" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66" src="1f469-200d-1f469-200d-1f466.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_woman_woman_girl: {
+    keywords: [ "home", "parents", "people", "human", "children" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67" src="1f469-200d-1f469-200d-1f467.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_woman_woman_girl_boy: {
+    keywords: [ "home", "parents", "people", "human", "children" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66" src="1f469-200d-1f469-200d-1f467-200d-1f466.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_woman_woman_boy_boy: {
+    keywords: [ "home", "parents", "people", "human", "children" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66" src="1f469-200d-1f469-200d-1f466-200d-1f466.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_woman_woman_girl_girl: {
+    keywords: [ "home", "parents", "people", "human", "children" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67" src="1f469-200d-1f469-200d-1f467-200d-1f467.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_man_man_boy: {
+    keywords: [ "home", "parents", "people", "human", "children" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66" src="1f468-200d-1f468-200d-1f466.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_man_man_girl: {
+    keywords: [ "home", "parents", "people", "human", "children" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67" src="1f468-200d-1f468-200d-1f467.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_man_man_girl_boy: {
+    keywords: [ "home", "parents", "people", "human", "children" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66" src="1f468-200d-1f468-200d-1f467-200d-1f466.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_man_man_boy_boy: {
+    keywords: [ "home", "parents", "people", "human", "children" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66" src="1f468-200d-1f468-200d-1f466-200d-1f466.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_man_man_girl_girl: {
+    keywords: [ "home", "parents", "people", "human", "children" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67" src="1f468-200d-1f468-200d-1f467-200d-1f467.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_woman_boy: {
+    keywords: [ "home", "parent", "people", "human", "child" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83d\udc66" src="1f469-200d-1f466.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_woman_girl: {
+    keywords: [ "home", "parent", "people", "human", "child" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83d\udc67" src="1f469-200d-1f467.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_woman_girl_boy: {
+    keywords: [ "home", "parent", "people", "human", "children" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66" src="1f469-200d-1f467-200d-1f466.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_woman_boy_boy: {
+    keywords: [ "home", "parent", "people", "human", "children" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66" src="1f469-200d-1f466-200d-1f466.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_woman_girl_girl: {
+    keywords: [ "home", "parent", "people", "human", "children" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67" src="1f469-200d-1f467-200d-1f467.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_man_boy: {
+    keywords: [ "home", "parent", "people", "human", "child" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udc66" src="1f468-200d-1f466.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_man_girl: {
+    keywords: [ "home", "parent", "people", "human", "child" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udc67" src="1f468-200d-1f467.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_man_girl_boy: {
+    keywords: [ "home", "parent", "people", "human", "children" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66" src="1f468-200d-1f467-200d-1f466.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_man_boy_boy: {
+    keywords: [ "home", "parent", "people", "human", "children" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66" src="1f468-200d-1f466-200d-1f466.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_man_girl_girl: {
+    keywords: [ "home", "parent", "people", "human", "children" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67" src="1f468-200d-1f467-200d-1f467.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  yarn: {
+    keywords: [ "ball", "crochet", "knit" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddf6" src="1f9f6.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  thread: {
+    keywords: [ "needle", "sewing", "spool", "string" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddf5" src="1f9f5.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  coat: {
+    keywords: [ "jacket" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udde5" src="1f9e5.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  labcoat: {
+    keywords: [ "doctor", "experiment", "scientist", "chemist" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd7c" src="1f97c.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  womans_clothes: {
+    keywords: [ "fashion", "shopping_bags", "female" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc5a" src="1f45a.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  tshirt: {
+    keywords: [ "fashion", "cloth", "casual", "shirt", "tee" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc55" src="1f455.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  jeans: {
+    keywords: [ "fashion", "shopping" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc56" src="1f456.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  necktie: {
+    keywords: [ "shirt", "suitup", "formal", "fashion", "cloth", "business" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc54" src="1f454.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  dress: {
+    keywords: [ "clothes", "fashion", "shopping" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc57" src="1f457.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  bikini: {
+    keywords: [ "swimming", "female", "woman", "girl", "fashion", "beach", "summer" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc59" src="1f459.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  kimono: {
+    keywords: [ "dress", "fashion", "women", "female", "japanese" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc58" src="1f458.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  lipstick: {
+    keywords: [ "female", "girl", "fashion", "woman" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc84" src="1f484.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  kiss: {
+    keywords: [ "face", "lips", "love", "like", "affection", "valentines" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc8b" src="1f48b.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  footprints: {
+    keywords: [ "feet", "tracking", "walking", "beach" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc63" src="1f463.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  flat_shoe: {
+    keywords: [ "ballet", "slip-on", "slipper" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd7f" src="1f97f.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  high_heel: {
+    keywords: [ "fashion", "shoes", "female", "pumps", "stiletto" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc60" src="1f460.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  sandal: {
+    keywords: [ "shoes", "fashion", "flip flops" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc61" src="1f461.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  boot: {
+    keywords: [ "shoes", "fashion" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc62" src="1f462.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  mans_shoe: {
+    keywords: [ "fashion", "male" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc5e" src="1f45e.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  athletic_shoe: {
+    keywords: [ "shoes", "sports", "sneakers" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc5f" src="1f45f.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  hiking_boot: {
+    keywords: [ "backpacking", "camping", "hiking" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd7e" src="1f97e.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  socks: {
+    keywords: [ "stockings", "clothes" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udde6" src="1f9e6.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  gloves: {
+    keywords: [ "hands", "winter", "clothes" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udde4" src="1f9e4.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  scarf: {
+    keywords: [ "neck", "winter", "clothes" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udde3" src="1f9e3.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  womans_hat: {
+    keywords: [ "fashion", "accessories", "female", "lady", "spring" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc52" src="1f452.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  tophat: {
+    keywords: [ "magic", "gentleman", "classy", "circus" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfa9" src="1f3a9.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  billed_hat: {
+    keywords: [ "cap", "baseball" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udde2" src="1f9e2.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  rescue_worker_helmet: {
+    keywords: [ "construction", "build" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26d1" src="26d1.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  mortar_board: {
+    keywords: [ "school", "college", "degree", "university", "graduation", "cap", "hat", "legal", "learn", "education" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf93" src="1f393.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  crown: {
+    keywords: [ "king", "kod", "leader", "royalty", "lord" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc51" src="1f451.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  school_satchel: {
+    keywords: [ "student", "education", "bag", "backpack" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf92" src="1f392.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  luggage: {
+    keywords: [ "packing", "travel" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddf3" src="1f9f3.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  pouch: {
+    keywords: [ "bag", "accessories", "shopping" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc5d" src="1f45d.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  purse: {
+    keywords: [ "fashion", "accessories", "money", "sales", "shopping" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc5b" src="1f45b.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  handbag: {
+    keywords: [ "fashion", "accessory", "accessories", "shopping" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc5c" src="1f45c.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  briefcase: {
+    keywords: [ "business", "documents", "work", "law", "legal", "job", "career" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcbc" src="1f4bc.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  eyeglasses: {
+    keywords: [ "fashion", "accessories", "eyesight", "nerdy", "dork", "geek" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc53" src="1f453.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  dark_sunglasses: {
+    keywords: [ "face", "cool", "accessories" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd76" src="1f576.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  goggles: {
+    keywords: [ "eyes", "protection", "safety" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd7d" src="1f97d.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  ring: {
+    keywords: [ "wedding", "propose", "marriage", "valentines", "diamond", "fashion", "jewelry", "gem", "engagement" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc8d" src="1f48d.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  closed_umbrella: {
+    keywords: [ "weather", "rain", "drizzle" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf02" src="1f302.png"/>',
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  dog: {
+    keywords: [ "animal", "friend", "nature", "woof", "puppy", "pet", "faithful" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc36" src="1f436.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  cat: {
+    keywords: [ "animal", "meow", "nature", "pet", "kitten" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc31" src="1f431.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  mouse: {
+    keywords: [ "animal", "nature", "cheese_wedge", "rodent" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc2d" src="1f42d.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  hamster: {
+    keywords: [ "animal", "nature" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc39" src="1f439.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  rabbit: {
+    keywords: [ "animal", "nature", "pet", "spring", "magic", "bunny" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc30" src="1f430.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  fox_face: {
+    keywords: [ "animal", "nature", "face" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd8a" src="1f98a.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  bear: {
+    keywords: [ "animal", "nature", "wild" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc3b" src="1f43b.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  panda_face: {
+    keywords: [ "animal", "nature", "panda" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc3c" src="1f43c.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  koala: {
+    keywords: [ "animal", "nature" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc28" src="1f428.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  tiger: {
+    keywords: [ "animal", "cat", "danger", "wild", "nature", "roar" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc2f" src="1f42f.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  lion: {
+    keywords: [ "animal", "nature" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd81" src="1f981.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  cow: {
+    keywords: [ "beef", "ox", "animal", "nature", "moo", "milk" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc2e" src="1f42e.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  pig: {
+    keywords: [ "animal", "oink", "nature" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc37" src="1f437.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  pig_nose: {
+    keywords: [ "animal", "oink" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc3d" src="1f43d.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  frog: {
+    keywords: [ "animal", "nature", "croak", "toad" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc38" src="1f438.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  squid: {
+    keywords: [ "animal", "nature", "ocean", "sea" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd91" src="1f991.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  octopus: {
+    keywords: [ "animal", "creature", "ocean", "sea", "nature", "beach" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc19" src="1f419.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  shrimp: {
+    keywords: [ "animal", "ocean", "nature", "seafood" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd90" src="1f990.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  monkey_face: {
+    keywords: [ "animal", "nature", "circus" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc35" src="1f435.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  gorilla: {
+    keywords: [ "animal", "nature", "circus" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd8d" src="1f98d.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  see_no_evil: {
+    keywords: [ "monkey", "animal", "nature", "haha" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude48" src="1f648.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  hear_no_evil: {
+    keywords: [ "animal", "monkey", "nature" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude49" src="1f649.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  speak_no_evil: {
+    keywords: [ "monkey", "animal", "nature", "omg" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude4a" src="1f64a.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  monkey: {
+    keywords: [ "animal", "nature", "banana", "circus" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc12" src="1f412.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  chicken: {
+    keywords: [ "animal", "cluck", "nature", "bird" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc14" src="1f414.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  penguin: {
+    keywords: [ "animal", "nature" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc27" src="1f427.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  bird: {
+    keywords: [ "animal", "nature", "fly", "tweet", "spring" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc26" src="1f426.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  baby_chick: {
+    keywords: [ "animal", "chicken", "bird" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc24" src="1f424.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  hatching_chick: {
+    keywords: [ "animal", "chicken", "egg", "born", "baby", "bird" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc23" src="1f423.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  hatched_chick: {
+    keywords: [ "animal", "chicken", "baby", "bird" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc25" src="1f425.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  duck: {
+    keywords: [ "animal", "nature", "bird", "mallard" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd86" src="1f986.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  eagle: {
+    keywords: [ "animal", "nature", "bird" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd85" src="1f985.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  owl: {
+    keywords: [ "animal", "nature", "bird", "hoot" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd89" src="1f989.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  bat: {
+    keywords: [ "animal", "nature", "blind", "vampire" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd87" src="1f987.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  wolf: {
+    keywords: [ "animal", "nature", "wild" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc3a" src="1f43a.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  boar: {
+    keywords: [ "animal", "nature" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc17" src="1f417.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  horse: {
+    keywords: [ "animal", "brown", "nature" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc34" src="1f434.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  unicorn: {
+    keywords: [ "animal", "nature", "mystical" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd84" src="1f984.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  honeybee: {
+    keywords: [ "animal", "insect", "nature", "bug", "spring", "honey" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc1d" src="1f41d.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  bug: {
+    keywords: [ "animal", "insect", "nature", "worm" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc1b" src="1f41b.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  butterfly: {
+    keywords: [ "animal", "insect", "nature", "caterpillar" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd8b" src="1f98b.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  snail: {
+    keywords: [ "slow", "animal", "shell" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc0c" src="1f40c.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  beetle: {
+    keywords: [ "animal", "insect", "nature", "ladybug" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc1e" src="1f41e.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  ant: {
+    keywords: [ "animal", "insect", "nature", "bug" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc1c" src="1f41c.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  grasshopper: {
+    keywords: [ "animal", "cricket", "chirp" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd97" src="1f997.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  spider: {
+    keywords: [ "animal", "arachnid" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd77" src="1f577.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  scorpion: {
+    keywords: [ "animal", "arachnid" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd82" src="1f982.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  crab: {
+    keywords: [ "animal", "crustacean" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd80" src="1f980.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  snake: {
+    keywords: [ "animal", "evil", "nature", "hiss", "python" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc0d" src="1f40d.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  lizard: {
+    keywords: [ "animal", "nature", "reptile" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd8e" src="1f98e.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  "t-rex": {
+    keywords: [ "animal", "nature", "dinosaur", "tyrannosaurus", "extinct" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd96" src="1f996.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  sauropod: {
+    keywords: [ "animal", "nature", "dinosaur", "brachiosaurus", "brontosaurus", "diplodocus", "extinct" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd95" src="1f995.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  turtle: {
+    keywords: [ "animal", "slow", "nature", "tortoise" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc22" src="1f422.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  tropical_fish: {
+    keywords: [ "animal", "swim", "ocean", "beach", "nemo" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc20" src="1f420.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  fish: {
+    keywords: [ "animal", "food", "nature" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc1f" src="1f41f.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  blowfish: {
+    keywords: [ "animal", "nature", "food", "sea", "ocean" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc21" src="1f421.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  dolphin: {
+    keywords: [ "animal", "nature", "fish", "sea", "ocean", "flipper", "fins", "beach" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc2c" src="1f42c.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  shark: {
+    keywords: [ "animal", "nature", "fish", "sea", "ocean", "jaws", "fins", "beach" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd88" src="1f988.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  whale: {
+    keywords: [ "animal", "nature", "sea", "ocean" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc33" src="1f433.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  whale2: {
+    keywords: [ "animal", "nature", "sea", "ocean" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc0b" src="1f40b.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  crocodile: {
+    keywords: [ "animal", "nature", "reptile", "lizard", "alligator" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc0a" src="1f40a.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  leopard: {
+    keywords: [ "animal", "nature" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc06" src="1f406.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  zebra: {
+    keywords: [ "animal", "nature", "stripes", "safari" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd93" src="1f993.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  tiger2: {
+    keywords: [ "animal", "nature", "roar" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc05" src="1f405.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  water_buffalo: {
+    keywords: [ "animal", "nature", "ox", "cow" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc03" src="1f403.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  ox: {
+    keywords: [ "animal", "cow", "beef" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc02" src="1f402.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  cow2: {
+    keywords: [ "beef", "ox", "animal", "nature", "moo", "milk" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc04" src="1f404.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  deer: {
+    keywords: [ "animal", "nature", "horns", "venison" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd8c" src="1f98c.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  dromedary_camel: {
+    keywords: [ "animal", "hot", "desert", "hump" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc2a" src="1f42a.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  camel: {
+    keywords: [ "animal", "nature", "hot", "desert", "hump" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc2b" src="1f42b.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  giraffe: {
+    keywords: [ "animal", "nature", "spots", "safari" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd92" src="1f992.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  elephant: {
+    keywords: [ "animal", "nature", "nose", "th", "circus" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc18" src="1f418.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  rhinoceros: {
+    keywords: [ "animal", "nature", "horn" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd8f" src="1f98f.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  goat: {
+    keywords: [ "animal", "nature" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc10" src="1f410.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  ram: {
+    keywords: [ "animal", "sheep", "nature" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc0f" src="1f40f.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  sheep: {
+    keywords: [ "animal", "nature", "wool", "shipit" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc11" src="1f411.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  racehorse: {
+    keywords: [ "animal", "gamble", "luck" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc0e" src="1f40e.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  pig2: {
+    keywords: [ "animal", "nature" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc16" src="1f416.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  rat: {
+    keywords: [ "animal", "mouse", "rodent" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc00" src="1f400.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  mouse2: {
+    keywords: [ "animal", "nature", "rodent" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc01" src="1f401.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  rooster: {
+    keywords: [ "animal", "nature", "chicken" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc13" src="1f413.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  turkey: {
+    keywords: [ "animal", "bird" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd83" src="1f983.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  dove: {
+    keywords: [ "animal", "bird" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd4a" src="1f54a.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  dog2: {
+    keywords: [ "animal", "nature", "friend", "doge", "pet", "faithful" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc15" src="1f415.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  poodle: {
+    keywords: [ "dog", "animal", "101", "nature", "pet" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc29" src="1f429.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  cat2: {
+    keywords: [ "animal", "meow", "pet", "cats" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc08" src="1f408.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  rabbit2: {
+    keywords: [ "animal", "nature", "pet", "magic", "spring" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc07" src="1f407.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  chipmunk: {
+    keywords: [ "animal", "nature", "rodent", "squirrel" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc3f" src="1f43f.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  hedgehog: {
+    keywords: [ "animal", "nature", "spiny" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd94" src="1f994.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  raccoon: {
+    keywords: [ "animal", "nature" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd9d" src="1f99d.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  llama: {
+    keywords: [ "animal", "nature", "alpaca" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd99" src="1f999.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  hippopotamus: {
+    keywords: [ "animal", "nature" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd9b" src="1f99b.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  kangaroo: {
+    keywords: [ "animal", "nature", "australia", "joey", "hop", "marsupial" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd98" src="1f998.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  badger: {
+    keywords: [ "animal", "nature", "honey" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udda1" src="1f9a1.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  swan: {
+    keywords: [ "animal", "nature", "bird" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udda2" src="1f9a2.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  peacock: {
+    keywords: [ "animal", "nature", "peahen", "bird" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd9a" src="1f99a.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  parrot: {
+    keywords: [ "animal", "nature", "bird", "pirate", "talk" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd9c" src="1f99c.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  lobster: {
+    keywords: [ "animal", "nature", "bisque", "claws", "seafood" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd9e" src="1f99e.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  mosquito: {
+    keywords: [ "animal", "nature", "insect", "malaria" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd9f" src="1f99f.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  paw_prints: {
+    keywords: [ "animal", "tracking", "footprints", "dog", "cat", "pet", "feet" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc3e" src="1f43e.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  dragon: {
+    keywords: [ "animal", "myth", "nature", "chinese", "green" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc09" src="1f409.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  dragon_face: {
+    keywords: [ "animal", "myth", "nature", "chinese", "green" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc32" src="1f432.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  cactus: {
+    keywords: [ "vegetable", "plant", "nature" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf35" src="1f335.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  christmas_tree: {
+    keywords: [ "festival", "vacation", "december", "xmas", "celebration" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf84" src="1f384.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  evergreen_tree: {
+    keywords: [ "plant", "nature" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf32" src="1f332.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  deciduous_tree: {
+    keywords: [ "plant", "nature" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf33" src="1f333.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  palm_tree: {
+    keywords: [ "plant", "vegetable", "nature", "summer", "beach", "mojito", "tropical" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf34" src="1f334.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  seedling: {
+    keywords: [ "plant", "nature", "grass", "lawn", "spring" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf31" src="1f331.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  herb: {
+    keywords: [ "vegetable", "plant", "medicine", "weed", "grass", "lawn" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf3f" src="1f33f.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  shamrock: {
+    keywords: [ "vegetable", "plant", "nature", "irish", "clover" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2618" src="2618.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  four_leaf_clover: {
+    keywords: [ "vegetable", "plant", "nature", "lucky", "irish" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf40" src="1f340.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  bamboo: {
+    keywords: [ "plant", "nature", "vegetable", "panda", "pine_decoration" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf8d" src="1f38d.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  tanabata_tree: {
+    keywords: [ "plant", "nature", "branch", "summer" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf8b" src="1f38b.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  leaves: {
+    keywords: [ "nature", "plant", "tree", "vegetable", "grass", "lawn", "spring" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf43" src="1f343.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  fallen_leaf: {
+    keywords: [ "nature", "plant", "vegetable", "leaves" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf42" src="1f342.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  maple_leaf: {
+    keywords: [ "nature", "plant", "vegetable", "ca", "fall" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf41" src="1f341.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  ear_of_rice: {
+    keywords: [ "nature", "plant" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf3e" src="1f33e.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  hibiscus: {
+    keywords: [ "plant", "vegetable", "flowers", "beach" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf3a" src="1f33a.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  sunflower: {
+    keywords: [ "nature", "plant", "fall" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf3b" src="1f33b.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  rose: {
+    keywords: [ "flowers", "valentines", "love", "spring" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf39" src="1f339.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  wilted_flower: {
+    keywords: [ "plant", "nature", "flower" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd40" src="1f940.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  tulip: {
+    keywords: [ "flowers", "plant", "nature", "summer", "spring" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf37" src="1f337.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  blossom: {
+    keywords: [ "nature", "flowers", "yellow" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf3c" src="1f33c.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  cherry_blossom: {
+    keywords: [ "nature", "plant", "spring", "flower" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf38" src="1f338.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  bouquet: {
+    keywords: [ "flowers", "nature", "spring" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc90" src="1f490.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  mushroom: {
+    keywords: [ "plant", "vegetable" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf44" src="1f344.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  chestnut: {
+    keywords: [ "food", "squirrel" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf30" src="1f330.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  jack_o_lantern: {
+    keywords: [ "halloween", "light", "pumpkin", "creepy", "fall" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf83" src="1f383.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  shell: {
+    keywords: [ "nature", "sea", "beach" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc1a" src="1f41a.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  spider_web: {
+    keywords: [ "animal", "insect", "arachnid", "silk" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd78" src="1f578.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  earth_americas: {
+    keywords: [ "globe", "world", "USA", "international" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf0e" src="1f30e.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  earth_africa: {
+    keywords: [ "globe", "world", "international" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf0d" src="1f30d.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  earth_asia: {
+    keywords: [ "globe", "world", "east", "international" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf0f" src="1f30f.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  full_moon: {
+    keywords: [ "nature", "yellow", "twilight", "planet", "space", "night", "evening", "sleep" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf15" src="1f315.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  waning_gibbous_moon: {
+    keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep", "waxing_gibbous_moon" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf16" src="1f316.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  last_quarter_moon: {
+    keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf17" src="1f317.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  waning_crescent_moon: {
+    keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf18" src="1f318.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  new_moon: {
+    keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf11" src="1f311.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  waxing_crescent_moon: {
+    keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf12" src="1f312.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  first_quarter_moon: {
+    keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf13" src="1f313.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  waxing_gibbous_moon: {
+    keywords: [ "nature", "night", "sky", "gray", "twilight", "planet", "space", "evening", "sleep" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf14" src="1f314.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  new_moon_with_face: {
+    keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf1a" src="1f31a.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  full_moon_with_face: {
+    keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf1d" src="1f31d.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  first_quarter_moon_with_face: {
+    keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf1b" src="1f31b.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  last_quarter_moon_with_face: {
+    keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf1c" src="1f31c.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  sun_with_face: {
+    keywords: [ "nature", "morning", "sky" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf1e" src="1f31e.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  crescent_moon: {
+    keywords: [ "night", "sleep", "sky", "evening", "magic" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf19" src="1f319.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  star: {
+    keywords: [ "night", "yellow" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2b50" src="2b50.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  star2: {
+    keywords: [ "night", "sparkle", "awesome", "good", "magic" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf1f" src="1f31f.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  dizzy: {
+    keywords: [ "star", "sparkle", "shoot", "magic" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcab" src="1f4ab.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  sparkles: {
+    keywords: [ "stars", "shine", "shiny", "cool", "awesome", "good", "magic" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2728" src="2728.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  comet: {
+    keywords: [ "space" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2604" src="2604.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  sunny: {
+    keywords: [ "weather", "nature", "brightness", "summer", "beach", "spring" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2600\ufe0f" src="2600.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  sun_behind_small_cloud: {
+    keywords: [ "weather" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf24" src="1f324.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  partly_sunny: {
+    keywords: [ "weather", "nature", "cloudy", "morning", "fall", "spring" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26c5" src="26c5.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  sun_behind_large_cloud: {
+    keywords: [ "weather" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf25" src="1f325.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  sun_behind_rain_cloud: {
+    keywords: [ "weather" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf26" src="1f326.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  cloud: {
+    keywords: [ "weather", "sky" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2601\ufe0f" src="2601.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  cloud_with_rain: {
+    keywords: [ "weather" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf27" src="1f327.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  cloud_with_lightning_and_rain: {
+    keywords: [ "weather", "lightning" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26c8" src="26c8.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  cloud_with_lightning: {
+    keywords: [ "weather", "thunder" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf29" src="1f329.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  zap: {
+    keywords: [ "thunder", "weather", "lightning bolt", "fast" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26a1" src="26a1.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  fire: {
+    keywords: [ "hot", "cook", "flame" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd25" src="1f525.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  boom: {
+    keywords: [ "bomb", "explode", "explosion", "collision", "blown" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udca5" src="1f4a5.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  snowflake: {
+    keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2744\ufe0f" src="2744.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  cloud_with_snow: {
+    keywords: [ "weather" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf28" src="1f328.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  snowman: {
+    keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas", "frozen", "without_snow" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26c4" src="26c4.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  snowman_with_snow: {
+    keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas", "frozen" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2603" src="2603.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  wind_face: {
+    keywords: [ "gust", "air" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf2c" src="1f32c.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  dash: {
+    keywords: [ "wind", "air", "fast", "shoo", "fart", "smoke", "puff" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udca8" src="1f4a8.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  tornado: {
+    keywords: [ "weather", "cyclone", "twister" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf2a" src="1f32a.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  fog: {
+    keywords: [ "weather" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf2b" src="1f32b.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  open_umbrella: {
+    keywords: [ "weather", "spring" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2602" src="2602.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  umbrella: {
+    keywords: [ "rainy", "weather", "spring" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2614" src="2614.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  droplet: {
+    keywords: [ "water", "drip", "faucet", "spring" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udca7" src="1f4a7.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  sweat_drops: {
+    keywords: [ "water", "drip", "oops" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udca6" src="1f4a6.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  ocean: {
+    keywords: [ "sea", "water", "wave", "nature", "tsunami", "disaster" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf0a" src="1f30a.png"/>',
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  green_apple: {
+    keywords: [ "fruit", "nature" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf4f" src="1f34f.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  apple: {
+    keywords: [ "fruit", "mac", "school" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf4e" src="1f34e.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  pear: {
+    keywords: [ "fruit", "nature", "food" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf50" src="1f350.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  tangerine: {
+    keywords: [ "food", "fruit", "nature", "orange" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf4a" src="1f34a.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  lemon: {
+    keywords: [ "fruit", "nature" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf4b" src="1f34b.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  banana: {
+    keywords: [ "fruit", "food", "monkey" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf4c" src="1f34c.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  watermelon: {
+    keywords: [ "fruit", "food", "picnic", "summer" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf49" src="1f349.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  grapes: {
+    keywords: [ "fruit", "food", "wine" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf47" src="1f347.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  strawberry: {
+    keywords: [ "fruit", "food", "nature" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf53" src="1f353.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  melon: {
+    keywords: [ "fruit", "nature", "food" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf48" src="1f348.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  cherries: {
+    keywords: [ "food", "fruit" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf52" src="1f352.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  peach: {
+    keywords: [ "fruit", "nature", "food" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf51" src="1f351.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  pineapple: {
+    keywords: [ "fruit", "nature", "food" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf4d" src="1f34d.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  coconut: {
+    keywords: [ "fruit", "nature", "food", "palm" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd65" src="1f965.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  kiwi_fruit: {
+    keywords: [ "fruit", "food" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd5d" src="1f95d.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  mango: {
+    keywords: [ "fruit", "food", "tropical" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd6d" src="1f96d.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  avocado: {
+    keywords: [ "fruit", "food" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd51" src="1f951.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  broccoli: {
+    keywords: [ "fruit", "food", "vegetable" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd66" src="1f966.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  tomato: {
+    keywords: [ "fruit", "vegetable", "nature", "food" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf45" src="1f345.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  eggplant: {
+    keywords: [ "vegetable", "nature", "food", "aubergine" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf46" src="1f346.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  cucumber: {
+    keywords: [ "fruit", "food", "pickle" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd52" src="1f952.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  carrot: {
+    keywords: [ "vegetable", "food", "orange" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd55" src="1f955.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  hot_pepper: {
+    keywords: [ "food", "spicy", "chilli", "chili" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf36" src="1f336.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  potato: {
+    keywords: [ "food", "tuber", "vegatable", "starch" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd54" src="1f954.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  corn: {
+    keywords: [ "food", "vegetable", "plant" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf3d" src="1f33d.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  leafy_greens: {
+    keywords: [ "food", "vegetable", "plant", "bok choy", "cabbage", "kale", "lettuce" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd6c" src="1f96c.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  sweet_potato: {
+    keywords: [ "food", "nature" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf60" src="1f360.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  peanuts: {
+    keywords: [ "food", "nut" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd5c" src="1f95c.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  honey_pot: {
+    keywords: [ "bees", "sweet", "kitchen" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf6f" src="1f36f.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  croissant: {
+    keywords: [ "food", "bread", "french" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd50" src="1f950.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  bread: {
+    keywords: [ "food", "wheat", "breakfast", "toast" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf5e" src="1f35e.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  baguette_bread: {
+    keywords: [ "food", "bread", "french" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd56" src="1f956.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  bagel: {
+    keywords: [ "food", "bread", "bakery", "schmear" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd6f" src="1f96f.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  pretzel: {
+    keywords: [ "food", "bread", "twisted" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd68" src="1f968.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  cheese: {
+    keywords: [ "food", "chadder" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddc0" src="1f9c0.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  egg: {
+    keywords: [ "food", "chicken", "breakfast" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd5a" src="1f95a.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  bacon: {
+    keywords: [ "food", "breakfast", "pork", "pig", "meat" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd53" src="1f953.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  steak: {
+    keywords: [ "food", "cow", "meat", "cut", "chop", "lambchop", "porkchop" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd69" src="1f969.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  pancakes: {
+    keywords: [ "food", "breakfast", "flapjacks", "hotcakes" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd5e" src="1f95e.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  poultry_leg: {
+    keywords: [ "food", "meat", "drumstick", "bird", "chicken", "turkey" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf57" src="1f357.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  meat_on_bone: {
+    keywords: [ "good", "food", "drumstick" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf56" src="1f356.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  bone: {
+    keywords: [ "skeleton" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddb4" src="1f9b4.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  fried_shrimp: {
+    keywords: [ "food", "animal", "appetizer", "summer" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf64" src="1f364.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  fried_egg: {
+    keywords: [ "food", "breakfast", "kitchen", "egg" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf73" src="1f373.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  hamburger: {
+    keywords: [ "meat", "fast food", "beef", "cheeseburger", "mcdonalds", "burger king" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf54" src="1f354.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  fries: {
+    keywords: [ "chips", "snack", "fast food" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf5f" src="1f35f.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  stuffed_flatbread: {
+    keywords: [ "food", "flatbread", "stuffed", "gyro" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd59" src="1f959.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  hotdog: {
+    keywords: [ "food", "frankfurter" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf2d" src="1f32d.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  pizza: {
+    keywords: [ "food", "party" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf55" src="1f355.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  sandwich: {
+    keywords: [ "food", "lunch", "bread" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd6a" src="1f96a.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  canned_food: {
+    keywords: [ "food", "soup" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd6b" src="1f96b.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  spaghetti: {
+    keywords: [ "food", "italian", "noodle" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf5d" src="1f35d.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  taco: {
+    keywords: [ "food", "mexican" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf2e" src="1f32e.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  burrito: {
+    keywords: [ "food", "mexican" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf2f" src="1f32f.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  green_salad: {
+    keywords: [ "food", "healthy", "lettuce" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd57" src="1f957.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  shallow_pan_of_food: {
+    keywords: [ "food", "cooking", "casserole", "paella" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd58" src="1f958.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  ramen: {
+    keywords: [ "food", "japanese", "noodle", "chopsticks" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf5c" src="1f35c.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  stew: {
+    keywords: [ "food", "meat", "soup" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf72" src="1f372.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  fish_cake: {
+    keywords: [ "food", "japan", "sea", "beach", "narutomaki", "pink", "swirl", "kamaboko", "surimi", "ramen" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf65" src="1f365.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  fortune_cookie: {
+    keywords: [ "food", "prophecy" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd60" src="1f960.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  sushi: {
+    keywords: [ "food", "fish", "japanese", "rice" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf63" src="1f363.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  bento: {
+    keywords: [ "food", "japanese", "box" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf71" src="1f371.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  curry: {
+    keywords: [ "food", "spicy", "hot", "indian" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf5b" src="1f35b.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  rice_ball: {
+    keywords: [ "food", "japanese" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf59" src="1f359.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  rice: {
+    keywords: [ "food", "china", "asian" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf5a" src="1f35a.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  rice_cracker: {
+    keywords: [ "food", "japanese" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf58" src="1f358.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  oden: {
+    keywords: [ "food", "japanese" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf62" src="1f362.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  dango: {
+    keywords: [ "food", "dessert", "sweet", "japanese", "barbecue", "meat" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf61" src="1f361.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  shaved_ice: {
+    keywords: [ "hot", "dessert", "summer" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf67" src="1f367.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  ice_cream: {
+    keywords: [ "food", "hot", "dessert" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf68" src="1f368.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  icecream: {
+    keywords: [ "food", "hot", "dessert", "summer" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf66" src="1f366.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  pie: {
+    keywords: [ "food", "dessert", "pastry" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd67" src="1f967.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  cake: {
+    keywords: [ "food", "dessert" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf70" src="1f370.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  cupcake: {
+    keywords: [ "food", "dessert", "bakery", "sweet" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddc1" src="1f9c1.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  moon_cake: {
+    keywords: [ "food", "autumn" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd6e" src="1f96e.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  birthday: {
+    keywords: [ "food", "dessert", "cake" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf82" src="1f382.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  custard: {
+    keywords: [ "dessert", "food" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf6e" src="1f36e.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  candy: {
+    keywords: [ "snack", "dessert", "sweet", "lolly" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf6c" src="1f36c.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  lollipop: {
+    keywords: [ "food", "snack", "candy", "sweet" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf6d" src="1f36d.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  chocolate_bar: {
+    keywords: [ "food", "snack", "dessert", "sweet" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf6b" src="1f36b.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  popcorn: {
+    keywords: [ "food", "movie theater", "films", "snack" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf7f" src="1f37f.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  dumpling: {
+    keywords: [ "food", "empanada", "pierogi", "potsticker" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd5f" src="1f95f.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  doughnut: {
+    keywords: [ "food", "dessert", "snack", "sweet", "donut" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf69" src="1f369.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  cookie: {
+    keywords: [ "food", "snack", "oreo", "chocolate", "sweet", "dessert" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf6a" src="1f36a.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  milk_glass: {
+    keywords: [ "beverage", "drink", "cow" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd5b" src="1f95b.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  beer: {
+    keywords: [ "relax", "beverage", "drink", "drunk", "party", "pub", "summer", "alcohol", "booze" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf7a" src="1f37a.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  beers: {
+    keywords: [ "relax", "beverage", "drink", "drunk", "party", "pub", "summer", "alcohol", "booze" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf7b" src="1f37b.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  clinking_glasses: {
+    keywords: [ "beverage", "drink", "party", "alcohol", "celebrate", "cheers", "wine", "champagne", "toast" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd42" src="1f942.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  wine_glass: {
+    keywords: [ "drink", "beverage", "drunk", "alcohol", "booze" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf77" src="1f377.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  tumbler_glass: {
+    keywords: [ "drink", "beverage", "drunk", "alcohol", "liquor", "booze", "bourbon", "scotch", "whisky", "glass", "shot" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd43" src="1f943.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  cocktail: {
+    keywords: [ "drink", "drunk", "alcohol", "beverage", "booze", "mojito" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf78" src="1f378.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  tropical_drink: {
+    keywords: [ "beverage", "cocktail", "summer", "beach", "alcohol", "booze", "mojito" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf79" src="1f379.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  champagne: {
+    keywords: [ "drink", "wine", "bottle", "celebration" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf7e" src="1f37e.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  sake: {
+    keywords: [ "wine", "drink", "drunk", "beverage", "japanese", "alcohol", "booze" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf76" src="1f376.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  tea: {
+    keywords: [ "drink", "bowl", "breakfast", "green", "british" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf75" src="1f375.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  cup_with_straw: {
+    keywords: [ "drink", "soda" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd64" src="1f964.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  coffee: {
+    keywords: [ "beverage", "caffeine", "latte", "espresso" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2615" src="2615.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  baby_bottle: {
+    keywords: [ "food", "container", "milk" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf7c" src="1f37c.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  salt: {
+    keywords: [ "condiment", "shaker" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddc2" src="1f9c2.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  spoon: {
+    keywords: [ "cutlery", "kitchen", "tableware" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd44" src="1f944.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  fork_and_knife: {
+    keywords: [ "cutlery", "kitchen" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf74" src="1f374.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  plate_with_cutlery: {
+    keywords: [ "food", "eat", "meal", "lunch", "dinner", "restaurant" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf7d" src="1f37d.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  bowl_with_spoon: {
+    keywords: [ "food", "breakfast", "cereal", "oatmeal", "porridge" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd63" src="1f963.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  takeout_box: {
+    keywords: [ "food", "leftovers" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd61" src="1f961.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  chopsticks: {
+    keywords: [ "food" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd62" src="1f962.png"/>',
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  soccer: {
+    keywords: [ "sports", "football" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26bd" src="26bd.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  basketball: {
+    keywords: [ "sports", "balls", "NBA" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfc0" src="1f3c0.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  football: {
+    keywords: [ "sports", "balls", "NFL" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfc8" src="1f3c8.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  baseball: {
+    keywords: [ "sports", "balls" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26be" src="26be.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  softball: {
+    keywords: [ "sports", "balls" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd4e" src="1f94e.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  tennis: {
+    keywords: [ "sports", "balls", "green" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfbe" src="1f3be.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  volleyball: {
+    keywords: [ "sports", "balls" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfd0" src="1f3d0.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  rugby_football: {
+    keywords: [ "sports", "team" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfc9" src="1f3c9.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  flying_disc: {
+    keywords: [ "sports", "frisbee", "ultimate" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd4f" src="1f94f.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  "8ball": {
+    keywords: [ "pool", "hobby", "game", "luck", "magic" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfb1" src="1f3b1.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  golf: {
+    keywords: [ "sports", "business", "flag", "hole", "summer" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26f3" src="26f3.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  golfing_woman: {
+    keywords: [ "sports", "business", "woman", "female" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfcc\ufe0f\u200d\u2640\ufe0f" src="1f3cc-fe0f-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  golfing_man: {
+    keywords: [ "sports", "business" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfcc" src="1f3cc.png"/>',
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  ping_pong: {
+    keywords: [ "sports", "pingpong" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfd3" src="1f3d3.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  badminton: {
+    keywords: [ "sports" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udff8" src="1f3f8.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  goal_net: {
+    keywords: [ "sports" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd45" src="1f945.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  ice_hockey: {
+    keywords: [ "sports" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfd2" src="1f3d2.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  field_hockey: {
+    keywords: [ "sports" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfd1" src="1f3d1.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  lacrosse: {
+    keywords: [ "sports", "ball", "stick" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd4d" src="1f94d.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  cricket: {
+    keywords: [ "sports" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfcf" src="1f3cf.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  ski: {
+    keywords: [ "sports", "winter", "cold", "snow" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfbf" src="1f3bf.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  skier: {
+    keywords: [ "sports", "winter", "snow" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26f7" src="26f7.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  snowboarder: {
+    keywords: [ "sports", "winter" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfc2" src="1f3c2.png"/>',
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  person_fencing: {
+    keywords: [ "sports", "fencing", "sword" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd3a" src="1f93a.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  women_wrestling: {
+    keywords: [ "sports", "wrestlers" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd3c\u200d\u2640\ufe0f" src="1f93c-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  men_wrestling: {
+    keywords: [ "sports", "wrestlers" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd3c\u200d\u2642\ufe0f" src="1f93c-200d-2642-fe0f.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  woman_cartwheeling: {
+    keywords: [ "gymnastics" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd38\u200d\u2640\ufe0f" src="1f938-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  man_cartwheeling: {
+    keywords: [ "gymnastics" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd38\u200d\u2642\ufe0f" src="1f938-200d-2642-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  woman_playing_handball: {
+    keywords: [ "sports" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd3e\u200d\u2640\ufe0f" src="1f93e-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  man_playing_handball: {
+    keywords: [ "sports" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd3e\u200d\u2642\ufe0f" src="1f93e-200d-2642-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  ice_skate: {
+    keywords: [ "sports" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26f8" src="26f8.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  curling_stone: {
+    keywords: [ "sports" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd4c" src="1f94c.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  skateboard: {
+    keywords: [ "board" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udef9" src="1f6f9.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  sled: {
+    keywords: [ "sleigh", "luge", "toboggan" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udef7" src="1f6f7.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  bow_and_arrow: {
+    keywords: [ "sports" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udff9" src="1f3f9.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  fishing_pole_and_fish: {
+    keywords: [ "food", "hobby", "summer" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfa3" src="1f3a3.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  boxing_glove: {
+    keywords: [ "sports", "fighting" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd4a" src="1f94a.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  martial_arts_uniform: {
+    keywords: [ "judo", "karate", "taekwondo" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd4b" src="1f94b.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  rowing_woman: {
+    keywords: [ "sports", "hobby", "water", "ship", "woman", "female" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udea3\u200d\u2640\ufe0f" src="1f6a3-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  rowing_man: {
+    keywords: [ "sports", "hobby", "water", "ship" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udea3" src="1f6a3.png"/>',
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  climbing_woman: {
+    keywords: [ "sports", "hobby", "woman", "female", "rock" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddd7\u200d\u2640\ufe0f" src="1f9d7-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  climbing_man: {
+    keywords: [ "sports", "hobby", "man", "male", "rock" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddd7\u200d\u2642\ufe0f" src="1f9d7-200d-2642-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  swimming_woman: {
+    keywords: [ "sports", "exercise", "human", "athlete", "water", "summer", "woman", "female" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfca\u200d\u2640\ufe0f" src="1f3ca-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  swimming_man: {
+    keywords: [ "sports", "exercise", "human", "athlete", "water", "summer" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfca" src="1f3ca.png"/>',
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  woman_playing_water_polo: {
+    keywords: [ "sports", "pool" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd3d\u200d\u2640\ufe0f" src="1f93d-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  man_playing_water_polo: {
+    keywords: [ "sports", "pool" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd3d\u200d\u2642\ufe0f" src="1f93d-200d-2642-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  woman_in_lotus_position: {
+    keywords: [ "woman", "female", "meditation", "yoga", "serenity", "zen", "mindfulness" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddd8\u200d\u2640\ufe0f" src="1f9d8-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  man_in_lotus_position: {
+    keywords: [ "man", "male", "meditation", "yoga", "serenity", "zen", "mindfulness" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddd8\u200d\u2642\ufe0f" src="1f9d8-200d-2642-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  surfing_woman: {
+    keywords: [ "sports", "ocean", "sea", "summer", "beach", "woman", "female" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfc4\u200d\u2640\ufe0f" src="1f3c4-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  surfing_man: {
+    keywords: [ "sports", "ocean", "sea", "summer", "beach" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfc4" src="1f3c4.png"/>',
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  bath: {
+    keywords: [ "clean", "shower", "bathroom" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udec0" src="1f6c0.png"/>',
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  basketball_woman: {
+    keywords: [ "sports", "human", "woman", "female" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26f9\ufe0f\u200d\u2640\ufe0f" src="26f9-fe0f-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  basketball_man: {
+    keywords: [ "sports", "human" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26f9" src="26f9.png"/>',
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  weight_lifting_woman: {
+    keywords: [ "sports", "training", "exercise", "woman", "female" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfcb\ufe0f\u200d\u2640\ufe0f" src="1f3cb-fe0f-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  weight_lifting_man: {
+    keywords: [ "sports", "training", "exercise" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfcb" src="1f3cb.png"/>',
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  biking_woman: {
+    keywords: [ "sports", "bike", "exercise", "hipster", "woman", "female" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeb4\u200d\u2640\ufe0f" src="1f6b4-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  biking_man: {
+    keywords: [ "sports", "bike", "exercise", "hipster" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeb4" src="1f6b4.png"/>',
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  mountain_biking_woman: {
+    keywords: [ "transportation", "sports", "human", "race", "bike", "woman", "female" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeb5\u200d\u2640\ufe0f" src="1f6b5-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  mountain_biking_man: {
+    keywords: [ "transportation", "sports", "human", "race", "bike" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeb5" src="1f6b5.png"/>',
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  horse_racing: {
+    keywords: [ "animal", "betting", "competition", "gambling", "luck" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfc7" src="1f3c7.png"/>',
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  business_suit_levitating: {
+    keywords: [ "suit", "business", "levitate", "hover", "jump" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd74" src="1f574.png"/>',
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  trophy: {
+    keywords: [ "win", "award", "contest", "place", "ftw", "ceremony" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfc6" src="1f3c6.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  running_shirt_with_sash: {
+    keywords: [ "play", "pageant" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfbd" src="1f3bd.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  medal_sports: {
+    keywords: [ "award", "winning" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfc5" src="1f3c5.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  medal_military: {
+    keywords: [ "award", "winning", "army" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf96" src="1f396.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  "1st_place_medal": {
+    keywords: [ "award", "winning", "first" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd47" src="1f947.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  "2nd_place_medal": {
+    keywords: [ "award", "second" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd48" src="1f948.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  "3rd_place_medal": {
+    keywords: [ "award", "third" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd49" src="1f949.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  reminder_ribbon: {
+    keywords: [ "sports", "cause", "support", "awareness" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf97" src="1f397.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  rosette: {
+    keywords: [ "flower", "decoration", "military" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udff5" src="1f3f5.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  ticket: {
+    keywords: [ "event", "concert", "pass" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfab" src="1f3ab.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  tickets: {
+    keywords: [ "sports", "concert", "entrance" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf9f" src="1f39f.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  performing_arts: {
+    keywords: [ "acting", "theater", "drama" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfad" src="1f3ad.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  art: {
+    keywords: [ "design", "paint", "draw", "colors" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfa8" src="1f3a8.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  circus_tent: {
+    keywords: [ "festival", "carnival", "party" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfaa" src="1f3aa.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  woman_juggling: {
+    keywords: [ "juggle", "balance", "skill", "multitask" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd39\u200d\u2640\ufe0f" src="1f939-200d-2640-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  man_juggling: {
+    keywords: [ "juggle", "balance", "skill", "multitask" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd39\u200d\u2642\ufe0f" src="1f939-200d-2642-fe0f.png"/>',
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  microphone: {
+    keywords: [ "sound", "music", "PA", "sing", "talkshow" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfa4" src="1f3a4.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  headphones: {
+    keywords: [ "music", "score", "gadgets" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfa7" src="1f3a7.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  musical_score: {
+    keywords: [ "treble", "clef", "compose" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfbc" src="1f3bc.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  musical_keyboard: {
+    keywords: [ "piano", "instrument", "compose" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfb9" src="1f3b9.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  drum: {
+    keywords: [ "music", "instrument", "drumsticks", "snare" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd41" src="1f941.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  saxophone: {
+    keywords: [ "music", "instrument", "jazz", "blues" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfb7" src="1f3b7.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  trumpet: {
+    keywords: [ "music", "brass" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfba" src="1f3ba.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  guitar: {
+    keywords: [ "music", "instrument" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfb8" src="1f3b8.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  violin: {
+    keywords: [ "music", "instrument", "orchestra", "symphony" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfbb" src="1f3bb.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  clapper: {
+    keywords: [ "movie", "film", "record" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfac" src="1f3ac.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  video_game: {
+    keywords: [ "play", "console", "PS4", "controller" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfae" src="1f3ae.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  space_invader: {
+    keywords: [ "game", "arcade", "play" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc7e" src="1f47e.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  dart: {
+    keywords: [ "game", "play", "bar", "target", "bullseye" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfaf" src="1f3af.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  game_die: {
+    keywords: [ "dice", "random", "tabletop", "play", "luck" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfb2" src="1f3b2.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  chess_pawn: {
+    keywords: [ "expendable" ],
+    char: "\u265f",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  slot_machine: {
+    keywords: [ "bet", "gamble", "vegas", "fruit machine", "luck", "casino" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfb0" src="1f3b0.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  jigsaw: {
+    keywords: [ "interlocking", "puzzle", "piece" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udde9" src="1f9e9.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  bowling: {
+    keywords: [ "sports", "fun", "play" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfb3" src="1f3b3.png"/>',
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  red_car: {
+    keywords: [ "red", "transportation", "vehicle" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude97" src="1f697.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  taxi: {
+    keywords: [ "uber", "vehicle", "cars", "transportation" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude95" src="1f695.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  blue_car: {
+    keywords: [ "transportation", "vehicle" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude99" src="1f699.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  bus: {
+    keywords: [ "car", "vehicle", "transportation" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude8c" src="1f68c.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  trolleybus: {
+    keywords: [ "bart", "transportation", "vehicle" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude8e" src="1f68e.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  racing_car: {
+    keywords: [ "sports", "race", "fast", "formula", "f1" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfce" src="1f3ce.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  police_car: {
+    keywords: [ "vehicle", "cars", "transportation", "law", "legal", "enforcement" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude93" src="1f693.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  ambulance: {
+    keywords: [ "health", "911", "hospital" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude91" src="1f691.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  fire_engine: {
+    keywords: [ "transportation", "cars", "vehicle" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude92" src="1f692.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  minibus: {
+    keywords: [ "vehicle", "car", "transportation" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude90" src="1f690.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  truck: {
+    keywords: [ "cars", "transportation" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude9a" src="1f69a.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  articulated_lorry: {
+    keywords: [ "vehicle", "cars", "transportation", "express" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude9b" src="1f69b.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  tractor: {
+    keywords: [ "vehicle", "car", "farming", "agriculture" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude9c" src="1f69c.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  kick_scooter: {
+    keywords: [ "vehicle", "kick", "razor" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udef4" src="1f6f4.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  motorcycle: {
+    keywords: [ "race", "sports", "fast" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfcd" src="1f3cd.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  bike: {
+    keywords: [ "sports", "bicycle", "exercise", "hipster" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeb2" src="1f6b2.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  motor_scooter: {
+    keywords: [ "vehicle", "vespa", "sasha" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udef5" src="1f6f5.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  rotating_light: {
+    keywords: [ "police", "ambulance", "911", "emergency", "alert", "error", "pinged", "law", "legal" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udea8" src="1f6a8.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  oncoming_police_car: {
+    keywords: [ "vehicle", "law", "legal", "enforcement", "911" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude94" src="1f694.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  oncoming_bus: {
+    keywords: [ "vehicle", "transportation" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude8d" src="1f68d.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  oncoming_automobile: {
+    keywords: [ "car", "vehicle", "transportation" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude98" src="1f698.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  oncoming_taxi: {
+    keywords: [ "vehicle", "cars", "uber" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude96" src="1f696.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  aerial_tramway: {
+    keywords: [ "transportation", "vehicle", "ski" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udea1" src="1f6a1.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  mountain_cableway: {
+    keywords: [ "transportation", "vehicle", "ski" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udea0" src="1f6a0.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  suspension_railway: {
+    keywords: [ "vehicle", "transportation" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude9f" src="1f69f.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  railway_car: {
+    keywords: [ "transportation", "vehicle" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude83" src="1f683.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  train: {
+    keywords: [ "transportation", "vehicle", "carriage", "public", "travel" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude8b" src="1f68b.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  monorail: {
+    keywords: [ "transportation", "vehicle" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude9d" src="1f69d.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  bullettrain_side: {
+    keywords: [ "transportation", "vehicle" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude84" src="1f684.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  bullettrain_front: {
+    keywords: [ "transportation", "vehicle", "speed", "fast", "public", "travel" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude85" src="1f685.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  light_rail: {
+    keywords: [ "transportation", "vehicle" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude88" src="1f688.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  mountain_railway: {
+    keywords: [ "transportation", "vehicle" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude9e" src="1f69e.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  steam_locomotive: {
+    keywords: [ "transportation", "vehicle", "train" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude82" src="1f682.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  train2: {
+    keywords: [ "transportation", "vehicle" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude86" src="1f686.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  metro: {
+    keywords: [ "transportation", "blue-square", "mrt", "underground", "tube" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude87" src="1f687.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  tram: {
+    keywords: [ "transportation", "vehicle" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude8a" src="1f68a.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  station: {
+    keywords: [ "transportation", "vehicle", "public" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude89" src="1f689.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  flying_saucer: {
+    keywords: [ "transportation", "vehicle", "ufo" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udef8" src="1f6f8.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  helicopter: {
+    keywords: [ "transportation", "vehicle", "fly" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude81" src="1f681.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  small_airplane: {
+    keywords: [ "flight", "transportation", "fly", "vehicle" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udee9" src="1f6e9.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  airplane: {
+    keywords: [ "vehicle", "transportation", "flight", "fly" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2708\ufe0f" src="2708.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  flight_departure: {
+    keywords: [ "airport", "flight", "landing" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeeb" src="1f6eb.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  flight_arrival: {
+    keywords: [ "airport", "flight", "boarding" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeec" src="1f6ec.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  sailboat: {
+    keywords: [ "ship", "summer", "transportation", "water", "sailing" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26f5" src="26f5.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  motor_boat: {
+    keywords: [ "ship" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udee5" src="1f6e5.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  speedboat: {
+    keywords: [ "ship", "transportation", "vehicle", "summer" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udea4" src="1f6a4.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  ferry: {
+    keywords: [ "boat", "ship", "yacht" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26f4" src="26f4.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  passenger_ship: {
+    keywords: [ "yacht", "cruise", "ferry" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udef3" src="1f6f3.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  rocket: {
+    keywords: [ "launch", "ship", "staffmode", "NASA", "outer space", "outer_space", "fly" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude80" src="1f680.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  artificial_satellite: {
+    keywords: [ "communication", "gps", "orbit", "spaceflight", "NASA", "ISS" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udef0" src="1f6f0.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  seat: {
+    keywords: [ "sit", "airplane", "transport", "bus", "flight", "fly" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcba" src="1f4ba.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  canoe: {
+    keywords: [ "boat", "paddle", "water", "ship" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udef6" src="1f6f6.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  anchor: {
+    keywords: [ "ship", "ferry", "sea", "boat" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2693" src="2693.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  construction: {
+    keywords: [ "wip", "progress", "caution", "warning" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udea7" src="1f6a7.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  fuelpump: {
+    keywords: [ "gas station", "petroleum" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26fd" src="26fd.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  busstop: {
+    keywords: [ "transportation", "wait" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude8f" src="1f68f.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  vertical_traffic_light: {
+    keywords: [ "transportation", "driving" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udea6" src="1f6a6.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  traffic_light: {
+    keywords: [ "transportation", "signal" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udea5" src="1f6a5.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  checkered_flag: {
+    keywords: [ "contest", "finishline", "race", "gokart" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfc1" src="1f3c1.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  ship: {
+    keywords: [ "transportation", "titanic", "deploy" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udea2" src="1f6a2.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  ferris_wheel: {
+    keywords: [ "photo", "carnival", "londoneye" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfa1" src="1f3a1.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  roller_coaster: {
+    keywords: [ "carnival", "playground", "photo", "fun" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfa2" src="1f3a2.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  carousel_horse: {
+    keywords: [ "photo", "carnival" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfa0" src="1f3a0.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  building_construction: {
+    keywords: [ "wip", "working", "progress" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfd7" src="1f3d7.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  foggy: {
+    keywords: [ "photo", "mountain" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf01" src="1f301.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  tokyo_tower: {
+    keywords: [ "photo", "japanese" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddfc" src="1f5fc.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  factory: {
+    keywords: [ "building", "industry", "pollution", "smoke" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfed" src="1f3ed.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  fountain: {
+    keywords: [ "photo", "summer", "water", "fresh" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26f2" src="26f2.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  rice_scene: {
+    keywords: [ "photo", "japan", "asia", "tsukimi" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf91" src="1f391.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  mountain: {
+    keywords: [ "photo", "nature", "environment" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26f0" src="26f0.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  mountain_snow: {
+    keywords: [ "photo", "nature", "environment", "winter", "cold" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfd4" src="1f3d4.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  mount_fuji: {
+    keywords: [ "photo", "mountain", "nature", "japanese" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddfb" src="1f5fb.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  volcano: {
+    keywords: [ "photo", "nature", "disaster" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf0b" src="1f30b.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  japan: {
+    keywords: [ "nation", "country", "japanese", "asia" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddfe" src="1f5fe.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  camping: {
+    keywords: [ "photo", "outdoors", "tent" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfd5" src="1f3d5.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  tent: {
+    keywords: [ "photo", "camping", "outdoors" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26fa" src="26fa.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  national_park: {
+    keywords: [ "photo", "environment", "nature" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfde" src="1f3de.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  motorway: {
+    keywords: [ "road", "cupertino", "interstate", "highway" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udee3" src="1f6e3.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  railway_track: {
+    keywords: [ "train", "transportation" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udee4" src="1f6e4.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  sunrise: {
+    keywords: [ "morning", "view", "vacation", "photo" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf05" src="1f305.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  sunrise_over_mountains: {
+    keywords: [ "view", "vacation", "photo" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf04" src="1f304.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  desert: {
+    keywords: [ "photo", "warm", "saharah" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfdc" src="1f3dc.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  beach_umbrella: {
+    keywords: [ "weather", "summer", "sunny", "sand", "mojito" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfd6" src="1f3d6.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  desert_island: {
+    keywords: [ "photo", "tropical", "mojito" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfdd" src="1f3dd.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  city_sunrise: {
+    keywords: [ "photo", "good morning", "dawn" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf07" src="1f307.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  city_sunset: {
+    keywords: [ "photo", "evening", "sky", "buildings" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf06" src="1f306.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  cityscape: {
+    keywords: [ "photo", "night life", "urban" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfd9" src="1f3d9.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  night_with_stars: {
+    keywords: [ "evening", "city", "downtown" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf03" src="1f303.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  bridge_at_night: {
+    keywords: [ "photo", "sanfrancisco" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf09" src="1f309.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  milky_way: {
+    keywords: [ "photo", "space", "stars" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf0c" src="1f30c.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  stars: {
+    keywords: [ "night", "photo" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf20" src="1f320.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  sparkler: {
+    keywords: [ "stars", "night", "shine" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf87" src="1f387.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  fireworks: {
+    keywords: [ "photo", "festival", "carnival", "congratulations" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf86" src="1f386.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  rainbow: {
+    keywords: [ "nature", "happy", "unicorn_face", "photo", "sky", "spring" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf08" src="1f308.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  houses: {
+    keywords: [ "buildings", "photo" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfd8" src="1f3d8.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  european_castle: {
+    keywords: [ "building", "royalty", "history" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udff0" src="1f3f0.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  japanese_castle: {
+    keywords: [ "photo", "building" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfef" src="1f3ef.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  stadium: {
+    keywords: [ "photo", "place", "sports", "concert", "venue" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfdf" src="1f3df.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  statue_of_liberty: {
+    keywords: [ "american", "newyork" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddfd" src="1f5fd.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  house: {
+    keywords: [ "building", "home" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfe0" src="1f3e0.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  house_with_garden: {
+    keywords: [ "home", "plant", "nature" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfe1" src="1f3e1.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  derelict_house: {
+    keywords: [ "abandon", "evict", "broken", "building" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfda" src="1f3da.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  office: {
+    keywords: [ "building", "bureau", "work" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfe2" src="1f3e2.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  department_store: {
+    keywords: [ "building", "shopping", "mall" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfec" src="1f3ec.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  post_office: {
+    keywords: [ "building", "envelope", "communication" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfe3" src="1f3e3.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  european_post_office: {
+    keywords: [ "building", "email" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfe4" src="1f3e4.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  hospital: {
+    keywords: [ "building", "health", "surgery", "doctor" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfe5" src="1f3e5.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  bank: {
+    keywords: [ "building", "money", "sales", "cash", "business", "enterprise" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfe6" src="1f3e6.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  hotel: {
+    keywords: [ "building", "accomodation", "checkin" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfe8" src="1f3e8.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  convenience_store: {
+    keywords: [ "building", "shopping", "groceries" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfea" src="1f3ea.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  school: {
+    keywords: [ "building", "student", "education", "learn", "teach" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfeb" src="1f3eb.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  love_hotel: {
+    keywords: [ "like", "affection", "dating" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfe9" src="1f3e9.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  wedding: {
+    keywords: [ "love", "like", "affection", "couple", "marriage", "bride", "groom" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc92" src="1f492.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  classical_building: {
+    keywords: [ "art", "culture", "history" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfdb" src="1f3db.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  church: {
+    keywords: [ "building", "religion", "christ" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26ea" src="26ea.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  mosque: {
+    keywords: [ "islam", "worship", "minaret" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd4c" src="1f54c.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  synagogue: {
+    keywords: [ "judaism", "worship", "temple", "jewish" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd4d" src="1f54d.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  kaaba: {
+    keywords: [ "mecca", "mosque", "islam" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd4b" src="1f54b.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  shinto_shrine: {
+    keywords: [ "temple", "japan", "kyoto" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26e9" src="26e9.png"/>',
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  watch: {
+    keywords: [ "time", "accessories" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u231a" src="231a.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  iphone: {
+    keywords: [ "technology", "apple", "gadgets", "dial" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcf1" src="1f4f1.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  calling: {
+    keywords: [ "iphone", "incoming" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcf2" src="1f4f2.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  computer: {
+    keywords: [ "technology", "laptop", "screen", "display", "monitor" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcbb" src="1f4bb.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  keyboard: {
+    keywords: [ "technology", "computer", "type", "input", "text" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2328" src="2328.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  desktop_computer: {
+    keywords: [ "technology", "computing", "screen" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udda5" src="1f5a5.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  printer: {
+    keywords: [ "paper", "ink" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udda8" src="1f5a8.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  computer_mouse: {
+    keywords: [ "click" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddb1" src="1f5b1.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  trackball: {
+    keywords: [ "technology", "trackpad" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddb2" src="1f5b2.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  joystick: {
+    keywords: [ "game", "play" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd79" src="1f579.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  clamp: {
+    keywords: [ "tool" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udddc" src="1f5dc.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  minidisc: {
+    keywords: [ "technology", "record", "data", "disk", "90s" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcbd" src="1f4bd.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  floppy_disk: {
+    keywords: [ "oldschool", "technology", "save", "90s", "80s" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcbe" src="1f4be.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  cd: {
+    keywords: [ "technology", "dvd", "disk", "disc", "90s" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcbf" src="1f4bf.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  dvd: {
+    keywords: [ "cd", "disk", "disc" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcc0" src="1f4c0.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  vhs: {
+    keywords: [ "record", "video", "oldschool", "90s", "80s" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcfc" src="1f4fc.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  camera: {
+    keywords: [ "gadgets", "photography" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcf7" src="1f4f7.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  camera_flash: {
+    keywords: [ "photography", "gadgets" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcf8" src="1f4f8.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  video_camera: {
+    keywords: [ "film", "record" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcf9" src="1f4f9.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  movie_camera: {
+    keywords: [ "film", "record" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfa5" src="1f3a5.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  film_projector: {
+    keywords: [ "video", "tape", "record", "movie" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcfd" src="1f4fd.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  film_strip: {
+    keywords: [ "movie" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf9e" src="1f39e.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  telephone_receiver: {
+    keywords: [ "technology", "communication", "dial" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcde" src="1f4de.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  phone: {
+    keywords: [ "technology", "communication", "dial", "telephone" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u260e\ufe0f" src="260e.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  pager: {
+    keywords: [ "bbcall", "oldschool", "90s" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcdf" src="1f4df.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  fax: {
+    keywords: [ "communication", "technology" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udce0" src="1f4e0.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  tv: {
+    keywords: [ "technology", "program", "oldschool", "show", "television" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcfa" src="1f4fa.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  radio: {
+    keywords: [ "communication", "music", "podcast", "program" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcfb" src="1f4fb.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  studio_microphone: {
+    keywords: [ "sing", "recording", "artist", "talkshow" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf99" src="1f399.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  level_slider: {
+    keywords: [ "scale" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf9a" src="1f39a.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  control_knobs: {
+    keywords: [ "dial" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf9b" src="1f39b.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  compass: {
+    keywords: [ "magnetic", "navigation", "orienteering" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udded" src="1f9ed.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  stopwatch: {
+    keywords: [ "time", "deadline" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u23f1" src="23f1.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  timer_clock: {
+    keywords: [ "alarm" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u23f2" src="23f2.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  alarm_clock: {
+    keywords: [ "time", "wake" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u23f0" src="23f0.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  mantelpiece_clock: {
+    keywords: [ "time" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd70" src="1f570.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  hourglass_flowing_sand: {
+    keywords: [ "oldschool", "time", "countdown" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u23f3" src="23f3.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  hourglass: {
+    keywords: [ "time", "clock", "oldschool", "limit", "exam", "quiz", "test" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u231b" src="231b.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  satellite: {
+    keywords: [ "communication", "future", "radio", "space" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udce1" src="1f4e1.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  battery: {
+    keywords: [ "power", "energy", "sustain" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd0b" src="1f50b.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  electric_plug: {
+    keywords: [ "charger", "power" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd0c" src="1f50c.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  bulb: {
+    keywords: [ "light", "electricity", "idea" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udca1" src="1f4a1.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  flashlight: {
+    keywords: [ "dark", "camping", "sight", "night" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd26" src="1f526.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  candle: {
+    keywords: [ "fire", "wax" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd6f" src="1f56f.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  fire_extinguisher: {
+    keywords: [ "quench" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddef" src="1f9ef.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  wastebasket: {
+    keywords: [ "bin", "trash", "rubbish", "garbage", "toss" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddd1" src="1f5d1.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  oil_drum: {
+    keywords: [ "barrell" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udee2" src="1f6e2.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  money_with_wings: {
+    keywords: [ "dollar", "bills", "payment", "sale" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcb8" src="1f4b8.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  dollar: {
+    keywords: [ "money", "sales", "bill", "currency" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcb5" src="1f4b5.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  yen: {
+    keywords: [ "money", "sales", "japanese", "dollar", "currency" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcb4" src="1f4b4.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  euro: {
+    keywords: [ "money", "sales", "dollar", "currency" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcb6" src="1f4b6.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  pound: {
+    keywords: [ "british", "sterling", "money", "sales", "bills", "uk", "england", "currency" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcb7" src="1f4b7.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  moneybag: {
+    keywords: [ "dollar", "payment", "coins", "sale" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcb0" src="1f4b0.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  credit_card: {
+    keywords: [ "money", "sales", "dollar", "bill", "payment", "shopping" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcb3" src="1f4b3.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  gem: {
+    keywords: [ "blue", "ruby", "diamond", "jewelry" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc8e" src="1f48e.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  balance_scale: {
+    keywords: [ "law", "fairness", "weight" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2696" src="2696.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  toolbox: {
+    keywords: [ "tools", "diy", "fix", "maintainer", "mechanic" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddf0" src="1f9f0.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  wrench: {
+    keywords: [ "tools", "diy", "ikea", "fix", "maintainer" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd27" src="1f527.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  hammer: {
+    keywords: [ "tools", "build", "create" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd28" src="1f528.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  hammer_and_pick: {
+    keywords: [ "tools", "build", "create" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2692" src="2692.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  hammer_and_wrench: {
+    keywords: [ "tools", "build", "create" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udee0" src="1f6e0.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  pick: {
+    keywords: [ "tools", "dig" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26cf" src="26cf.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  nut_and_bolt: {
+    keywords: [ "handy", "tools", "fix" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd29" src="1f529.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  gear: {
+    keywords: [ "cog" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2699" src="2699.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  brick: {
+    keywords: [ "bricks" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddf1" src="1f9f1.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  chains: {
+    keywords: [ "lock", "arrest" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26d3" src="26d3.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  magnet: {
+    keywords: [ "attraction", "magnetic" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddf2" src="1f9f2.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  gun: {
+    keywords: [ "violence", "weapon", "pistol", "revolver" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd2b" src="1f52b.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  bomb: {
+    keywords: [ "boom", "explode", "explosion", "terrorism" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udca3" src="1f4a3.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  firecracker: {
+    keywords: [ "dynamite", "boom", "explode", "explosion", "explosive" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udde8" src="1f9e8.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  hocho: {
+    keywords: [ "knife", "blade", "cutlery", "kitchen", "weapon" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd2a" src="1f52a.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  dagger: {
+    keywords: [ "weapon" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udde1" src="1f5e1.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  crossed_swords: {
+    keywords: [ "weapon" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2694" src="2694.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  shield: {
+    keywords: [ "protection", "security" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udee1" src="1f6e1.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  smoking: {
+    keywords: [ "kills", "tobacco", "cigarette", "joint", "smoke" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeac" src="1f6ac.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  skull_and_crossbones: {
+    keywords: [ "poison", "danger", "deadly", "scary", "death", "pirate", "evil" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2620" src="2620.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  coffin: {
+    keywords: [ "vampire", "dead", "die", "death", "rip", "graveyard", "cemetery", "casket", "funeral", "box" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26b0" src="26b0.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  funeral_urn: {
+    keywords: [ "dead", "die", "death", "rip", "ashes" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26b1" src="26b1.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  amphora: {
+    keywords: [ "vase", "jar" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udffa" src="1f3fa.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  crystal_ball: {
+    keywords: [ "disco", "party", "magic", "circus", "fortune_teller" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd2e" src="1f52e.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  prayer_beads: {
+    keywords: [ "dhikr", "religious" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcff" src="1f4ff.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  nazar_amulet: {
+    keywords: [ "bead", "charm" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddff" src="1f9ff.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  barber: {
+    keywords: [ "hair", "salon", "style" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc88" src="1f488.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  alembic: {
+    keywords: [ "distilling", "science", "experiment", "chemistry" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2697" src="2697.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  telescope: {
+    keywords: [ "stars", "space", "zoom", "science", "astronomy" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd2d" src="1f52d.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  microscope: {
+    keywords: [ "laboratory", "experiment", "zoomin", "science", "study" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd2c" src="1f52c.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  hole: {
+    keywords: [ "embarrassing" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd73" src="1f573.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  pill: {
+    keywords: [ "health", "medicine", "doctor", "pharmacy", "drug" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc8a" src="1f48a.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  syringe: {
+    keywords: [ "health", "hospital", "drugs", "blood", "medicine", "needle", "doctor", "nurse" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc89" src="1f489.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  dna: {
+    keywords: [ "biologist", "genetics", "life" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddec" src="1f9ec.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  microbe: {
+    keywords: [ "amoeba", "bacteria", "germs" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udda0" src="1f9a0.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  petri_dish: {
+    keywords: [ "bacteria", "biology", "culture", "lab" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddeb" src="1f9eb.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  test_tube: {
+    keywords: [ "chemistry", "experiment", "lab", "science" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddea" src="1f9ea.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  thermometer: {
+    keywords: [ "weather", "temperature", "hot", "cold" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf21" src="1f321.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  broom: {
+    keywords: [ "cleaning", "sweeping", "witch" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddf9" src="1f9f9.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  basket: {
+    keywords: [ "laundry" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddfa" src="1f9fa.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  toilet_paper: {
+    keywords: [ "roll" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddfb" src="1f9fb.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  label: {
+    keywords: [ "sale", "tag" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udff7" src="1f3f7.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  bookmark: {
+    keywords: [ "favorite", "label", "save" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd16" src="1f516.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  toilet: {
+    keywords: [ "restroom", "wc", "washroom", "bathroom", "potty" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udebd" src="1f6bd.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  shower: {
+    keywords: [ "clean", "water", "bathroom" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udebf" src="1f6bf.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  bathtub: {
+    keywords: [ "clean", "shower", "bathroom" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udec1" src="1f6c1.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  soap: {
+    keywords: [ "bar", "bathing", "cleaning", "lather" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddfc" src="1f9fc.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  sponge: {
+    keywords: [ "absorbing", "cleaning", "porous" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddfd" src="1f9fd.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  lotion_bottle: {
+    keywords: [ "moisturizer", "sunscreen" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddf4" src="1f9f4.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  key: {
+    keywords: [ "lock", "door", "password" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd11" src="1f511.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  old_key: {
+    keywords: [ "lock", "door", "password" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udddd" src="1f5dd.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  couch_and_lamp: {
+    keywords: [ "read", "chill" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udecb" src="1f6cb.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  sleeping_bed: {
+    keywords: [ "bed", "rest" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udecc" src="1f6cc.png"/>',
+    fitzpatrick_scale: true,
+    category: "objects"
+  },
+  bed: {
+    keywords: [ "sleep", "rest" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udecf" src="1f6cf.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  door: {
+    keywords: [ "house", "entry", "exit" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeaa" src="1f6aa.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  bellhop_bell: {
+    keywords: [ "service" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udece" src="1f6ce.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  teddy_bear: {
+    keywords: [ "plush", "stuffed" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddf8" src="1f9f8.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  framed_picture: {
+    keywords: [ "photography" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddbc" src="1f5bc.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  world_map: {
+    keywords: [ "location", "direction" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddfa" src="1f5fa.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  parasol_on_ground: {
+    keywords: [ "weather", "summer" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26f1" src="26f1.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  moyai: {
+    keywords: [ "rock", "easter island", "moai" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddff" src="1f5ff.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  shopping: {
+    keywords: [ "mall", "buy", "purchase" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udecd" src="1f6cd.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  shopping_cart: {
+    keywords: [ "trolley" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uded2" src="1f6d2.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  balloon: {
+    keywords: [ "party", "celebration", "birthday", "circus" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf88" src="1f388.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  flags: {
+    keywords: [ "fish", "japanese", "koinobori", "carp", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf8f" src="1f38f.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  ribbon: {
+    keywords: [ "decoration", "pink", "girl", "bowtie" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf80" src="1f380.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  gift: {
+    keywords: [ "present", "birthday", "christmas", "xmas" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf81" src="1f381.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  confetti_ball: {
+    keywords: [ "festival", "party", "birthday", "circus" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf8a" src="1f38a.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  tada: {
+    keywords: [ "party", "congratulations", "birthday", "magic", "circus", "celebration" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf89" src="1f389.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  dolls: {
+    keywords: [ "japanese", "toy", "kimono" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf8e" src="1f38e.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  wind_chime: {
+    keywords: [ "nature", "ding", "spring", "bell" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf90" src="1f390.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  crossed_flags: {
+    keywords: [ "japanese", "nation", "country", "border" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf8c" src="1f38c.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  izakaya_lantern: {
+    keywords: [ "light", "paper", "halloween", "spooky" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfee" src="1f3ee.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  red_envelope: {
+    keywords: [ "gift" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udde7" src="1f9e7.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  email: {
+    keywords: [ "letter", "postal", "inbox", "communication" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2709\ufe0f" src="2709.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  envelope_with_arrow: {
+    keywords: [ "email", "communication" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udce9" src="1f4e9.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  incoming_envelope: {
+    keywords: [ "email", "inbox" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udce8" src="1f4e8.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  "e-mail": {
+    keywords: [ "communication", "inbox" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udce7" src="1f4e7.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  love_letter: {
+    keywords: [ "email", "like", "affection", "envelope", "valentines" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc8c" src="1f48c.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  postbox: {
+    keywords: [ "email", "letter", "envelope" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcee" src="1f4ee.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  mailbox_closed: {
+    keywords: [ "email", "communication", "inbox" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcea" src="1f4ea.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  mailbox: {
+    keywords: [ "email", "inbox", "communication" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udceb" src="1f4eb.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  mailbox_with_mail: {
+    keywords: [ "email", "inbox", "communication" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcec" src="1f4ec.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  mailbox_with_no_mail: {
+    keywords: [ "email", "inbox" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udced" src="1f4ed.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  package: {
+    keywords: [ "mail", "gift", "cardboard", "box", "moving" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udce6" src="1f4e6.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  postal_horn: {
+    keywords: [ "instrument", "music" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcef" src="1f4ef.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  inbox_tray: {
+    keywords: [ "email", "documents" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udce5" src="1f4e5.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  outbox_tray: {
+    keywords: [ "inbox", "email" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udce4" src="1f4e4.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  scroll: {
+    keywords: [ "documents", "ancient", "history", "paper" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcdc" src="1f4dc.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  page_with_curl: {
+    keywords: [ "documents", "office", "paper" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcc3" src="1f4c3.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  bookmark_tabs: {
+    keywords: [ "favorite", "save", "order", "tidy" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcd1" src="1f4d1.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  receipt: {
+    keywords: [ "accounting", "expenses" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddfe" src="1f9fe.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  bar_chart: {
+    keywords: [ "graph", "presentation", "stats" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcca" src="1f4ca.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  chart_with_upwards_trend: {
+    keywords: [ "graph", "presentation", "stats", "recovery", "business", "economics", "money", "sales", "good", "success" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcc8" src="1f4c8.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  chart_with_downwards_trend: {
+    keywords: [ "graph", "presentation", "stats", "recession", "business", "economics", "money", "sales", "bad", "failure" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcc9" src="1f4c9.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  page_facing_up: {
+    keywords: [ "documents", "office", "paper", "information" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcc4" src="1f4c4.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  date: {
+    keywords: [ "calendar", "schedule" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcc5" src="1f4c5.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  calendar: {
+    keywords: [ "schedule", "date", "planning" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcc6" src="1f4c6.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  spiral_calendar: {
+    keywords: [ "date", "schedule", "planning" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddd3" src="1f5d3.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  card_index: {
+    keywords: [ "business", "stationery" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcc7" src="1f4c7.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  card_file_box: {
+    keywords: [ "business", "stationery" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddc3" src="1f5c3.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  ballot_box: {
+    keywords: [ "election", "vote" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddf3" src="1f5f3.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  file_cabinet: {
+    keywords: [ "filing", "organizing" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddc4" src="1f5c4.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  clipboard: {
+    keywords: [ "stationery", "documents" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udccb" src="1f4cb.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  spiral_notepad: {
+    keywords: [ "memo", "stationery" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddd2" src="1f5d2.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  file_folder: {
+    keywords: [ "documents", "business", "office" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcc1" src="1f4c1.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  open_file_folder: {
+    keywords: [ "documents", "load" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcc2" src="1f4c2.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  card_index_dividers: {
+    keywords: [ "organizing", "business", "stationery" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddc2" src="1f5c2.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  newspaper_roll: {
+    keywords: [ "press", "headline" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddde" src="1f5de.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  newspaper: {
+    keywords: [ "press", "headline" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcf0" src="1f4f0.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  notebook: {
+    keywords: [ "stationery", "record", "notes", "paper", "study" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcd3" src="1f4d3.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  closed_book: {
+    keywords: [ "read", "library", "knowledge", "textbook", "learn" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcd5" src="1f4d5.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  green_book: {
+    keywords: [ "read", "library", "knowledge", "study" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcd7" src="1f4d7.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  blue_book: {
+    keywords: [ "read", "library", "knowledge", "learn", "study" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcd8" src="1f4d8.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  orange_book: {
+    keywords: [ "read", "library", "knowledge", "textbook", "study" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcd9" src="1f4d9.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  notebook_with_decorative_cover: {
+    keywords: [ "classroom", "notes", "record", "paper", "study" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcd4" src="1f4d4.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  ledger: {
+    keywords: [ "notes", "paper" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcd2" src="1f4d2.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  books: {
+    keywords: [ "literature", "library", "study" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcda" src="1f4da.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  open_book: {
+    keywords: [ "book", "read", "library", "knowledge", "literature", "learn", "study" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcd6" src="1f4d6.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  safety_pin: {
+    keywords: [ "diaper" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddf7" src="1f9f7.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  link: {
+    keywords: [ "rings", "url" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd17" src="1f517.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  paperclip: {
+    keywords: [ "documents", "stationery" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcce" src="1f4ce.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  paperclips: {
+    keywords: [ "documents", "stationery" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd87" src="1f587.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  scissors: {
+    keywords: [ "stationery", "cut" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2702\ufe0f" src="2702.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  triangular_ruler: {
+    keywords: [ "stationery", "math", "architect", "sketch" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcd0" src="1f4d0.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  straight_ruler: {
+    keywords: [ "stationery", "calculate", "length", "math", "school", "drawing", "architect", "sketch" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udccf" src="1f4cf.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  abacus: {
+    keywords: [ "calculation" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddee" src="1f9ee.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  pushpin: {
+    keywords: [ "stationery", "mark", "here" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udccc" src="1f4cc.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  round_pushpin: {
+    keywords: [ "stationery", "location", "map", "here" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udccd" src="1f4cd.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  triangular_flag_on_post: {
+    keywords: [ "mark", "milestone", "place" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udea9" src="1f6a9.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  white_flag: {
+    keywords: [ "losing", "loser", "lost", "surrender", "give up", "fail" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udff3" src="1f3f3.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  black_flag: {
+    keywords: [ "pirate" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udff4" src="1f3f4.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  rainbow_flag: {
+    keywords: [ "flag", "rainbow", "pride", "gay", "lgbt", "glbt", "queer", "homosexual", "lesbian", "bisexual", "transgender" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udff3\ufe0f\u200d\ud83c\udf08" src="1f3f3-fe0f-200d-1f308.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  closed_lock_with_key: {
+    keywords: [ "security", "privacy" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd10" src="1f510.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  lock: {
+    keywords: [ "security", "password", "padlock" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd12" src="1f512.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  unlock: {
+    keywords: [ "privacy", "security" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd13" src="1f513.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  lock_with_ink_pen: {
+    keywords: [ "security", "secret" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd0f" src="1f50f.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  pen: {
+    keywords: [ "stationery", "writing", "write" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd8a" src="1f58a.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  fountain_pen: {
+    keywords: [ "stationery", "writing", "write" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd8b" src="1f58b.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  black_nib: {
+    keywords: [ "pen", "stationery", "writing", "write" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2712\ufe0f" src="2712.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  memo: {
+    keywords: [ "write", "documents", "stationery", "pencil", "paper", "writing", "legal", "exam", "quiz", "test", "study", "compose" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcdd" src="1f4dd.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  pencil2: {
+    keywords: [ "stationery", "write", "paper", "writing", "school", "study" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u270f\ufe0f" src="270f.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  crayon: {
+    keywords: [ "drawing", "creativity" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd8d" src="1f58d.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  paintbrush: {
+    keywords: [ "drawing", "creativity", "art" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd8c" src="1f58c.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  mag: {
+    keywords: [ "search", "zoom", "find", "detective" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd0d" src="1f50d.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  mag_right: {
+    keywords: [ "search", "zoom", "find", "detective" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd0e" src="1f50e.png"/>',
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  heart: {
+    keywords: [ "love", "like", "valentines" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2764\ufe0f" src="2764.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  orange_heart: {
+    keywords: [ "love", "like", "affection", "valentines" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udde1" src="1f9e1.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  yellow_heart: {
+    keywords: [ "love", "like", "affection", "valentines" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc9b" src="1f49b.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  green_heart: {
+    keywords: [ "love", "like", "affection", "valentines" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc9a" src="1f49a.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  blue_heart: {
+    keywords: [ "love", "like", "affection", "valentines" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc99" src="1f499.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  purple_heart: {
+    keywords: [ "love", "like", "affection", "valentines" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc9c" src="1f49c.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  black_heart: {
+    keywords: [ "evil" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udda4" src="1f5a4.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  broken_heart: {
+    keywords: [ "sad", "sorry", "break", "heart", "heartbreak" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc94" src="1f494.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  heavy_heart_exclamation: {
+    keywords: [ "decoration", "love" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2763" src="2763.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  two_hearts: {
+    keywords: [ "love", "like", "affection", "valentines", "heart" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc95" src="1f495.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  revolving_hearts: {
+    keywords: [ "love", "like", "affection", "valentines" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc9e" src="1f49e.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  heartbeat: {
+    keywords: [ "love", "like", "affection", "valentines", "pink", "heart" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc93" src="1f493.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  heartpulse: {
+    keywords: [ "like", "love", "affection", "valentines", "pink" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc97" src="1f497.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  sparkling_heart: {
+    keywords: [ "love", "like", "affection", "valentines" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc96" src="1f496.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  cupid: {
+    keywords: [ "love", "like", "heart", "affection", "valentines" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc98" src="1f498.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  gift_heart: {
+    keywords: [ "love", "valentines" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc9d" src="1f49d.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  heart_decoration: {
+    keywords: [ "purple-square", "love", "like" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc9f" src="1f49f.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  peace_symbol: {
+    keywords: [ "hippie" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u262e" src="262e.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  latin_cross: {
+    keywords: [ "christianity" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u271d" src="271d.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  star_and_crescent: {
+    keywords: [ "islam" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u262a" src="262a.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  om: {
+    keywords: [ "hinduism", "buddhism", "sikhism", "jainism" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd49" src="1f549.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  wheel_of_dharma: {
+    keywords: [ "hinduism", "buddhism", "sikhism", "jainism" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2638" src="2638.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  star_of_david: {
+    keywords: [ "judaism" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2721" src="2721.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  six_pointed_star: {
+    keywords: [ "purple-square", "religion", "jewish", "hexagram" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd2f" src="1f52f.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  menorah: {
+    keywords: [ "hanukkah", "candles", "jewish" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd4e" src="1f54e.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  yin_yang: {
+    keywords: [ "balance" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u262f" src="262f.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  orthodox_cross: {
+    keywords: [ "suppedaneum", "religion" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2626" src="2626.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  place_of_worship: {
+    keywords: [ "religion", "church", "temple", "prayer" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uded0" src="1f6d0.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  ophiuchus: {
+    keywords: [ "sign", "purple-square", "constellation", "astrology" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26ce" src="26ce.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  aries: {
+    keywords: [ "sign", "purple-square", "zodiac", "astrology" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2648" src="2648.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  taurus: {
+    keywords: [ "purple-square", "sign", "zodiac", "astrology" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2649" src="2649.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  gemini: {
+    keywords: [ "sign", "zodiac", "purple-square", "astrology" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u264a" src="264a.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  cancer: {
+    keywords: [ "sign", "zodiac", "purple-square", "astrology" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u264b" src="264b.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  leo: {
+    keywords: [ "sign", "purple-square", "zodiac", "astrology" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u264c" src="264c.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  virgo: {
+    keywords: [ "sign", "zodiac", "purple-square", "astrology" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u264d" src="264d.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  libra: {
+    keywords: [ "sign", "purple-square", "zodiac", "astrology" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u264e" src="264e.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  scorpius: {
+    keywords: [ "sign", "zodiac", "purple-square", "astrology", "scorpio" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u264f" src="264f.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  sagittarius: {
+    keywords: [ "sign", "zodiac", "purple-square", "astrology" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2650" src="2650.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  capricorn: {
+    keywords: [ "sign", "zodiac", "purple-square", "astrology" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2651" src="2651.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  aquarius: {
+    keywords: [ "sign", "purple-square", "zodiac", "astrology" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2652" src="2652.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  pisces: {
+    keywords: [ "purple-square", "sign", "zodiac", "astrology" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2653" src="2653.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  id: {
+    keywords: [ "purple-square", "words" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udd94" src="1f194.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  atom_symbol: {
+    keywords: [ "science", "physics", "chemistry" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u269b" src="269b.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  u7a7a: {
+    keywords: [ "kanji", "japanese", "chinese", "empty", "sky", "blue-square" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\ude33" src="1f233.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  u5272: {
+    keywords: [ "cut", "divide", "chinese", "kanji", "pink-square" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\ude39" src="1f239.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  radioactive: {
+    keywords: [ "nuclear", "danger" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2622" src="2622.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  biohazard: {
+    keywords: [ "danger" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2623" src="2623.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  mobile_phone_off: {
+    keywords: [ "mute", "orange-square", "silence", "quiet" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcf4" src="1f4f4.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  vibration_mode: {
+    keywords: [ "orange-square", "phone" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcf3" src="1f4f3.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  u6709: {
+    keywords: [ "orange-square", "chinese", "have", "kanji" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\ude36" src="1f236.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  u7121: {
+    keywords: [ "nothing", "chinese", "kanji", "japanese", "orange-square" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\ude1a" src="1f21a.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  u7533: {
+    keywords: [ "chinese", "japanese", "kanji", "orange-square" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\ude38" src="1f238.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  u55b6: {
+    keywords: [ "japanese", "opening hours", "orange-square" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\ude3a" src="1f23a.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  u6708: {
+    keywords: [ "chinese", "month", "moon", "japanese", "orange-square", "kanji" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\ude37\ufe0f" src="1f237.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  eight_pointed_black_star: {
+    keywords: [ "orange-square", "shape", "polygon" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2734\ufe0f" src="2734.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  vs: {
+    keywords: [ "words", "orange-square" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udd9a" src="1f19a.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  accept: {
+    keywords: [ "ok", "good", "chinese", "kanji", "agree", "yes", "orange-circle" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\ude51" src="1f251.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  white_flower: {
+    keywords: [ "japanese", "spring" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcae" src="1f4ae.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  ideograph_advantage: {
+    keywords: [ "chinese", "kanji", "obtain", "get", "circle" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\ude50" src="1f250.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  secret: {
+    keywords: [ "privacy", "chinese", "sshh", "kanji", "red-circle" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u3299\ufe0f" src="3299.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  congratulations: {
+    keywords: [ "chinese", "kanji", "japanese", "red-circle" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u3297\ufe0f" src="3297.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  u5408: {
+    keywords: [ "japanese", "chinese", "join", "kanji", "red-square" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\ude34" src="1f234.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  u6e80: {
+    keywords: [ "full", "chinese", "japanese", "red-square", "kanji" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\ude35" src="1f235.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  u7981: {
+    keywords: [ "kanji", "japanese", "chinese", "forbidden", "limit", "restricted", "red-square" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\ude32" src="1f232.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  a: {
+    keywords: [ "red-square", "alphabet", "letter" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udd70\ufe0f" src="1f170.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  b: {
+    keywords: [ "red-square", "alphabet", "letter" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udd71\ufe0f" src="1f171.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  ab: {
+    keywords: [ "red-square", "alphabet" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udd8e" src="1f18e.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  cl: {
+    keywords: [ "alphabet", "words", "red-square" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udd91" src="1f191.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  o2: {
+    keywords: [ "alphabet", "red-square", "letter" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udd7e\ufe0f" src="1f17e.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  sos: {
+    keywords: [ "help", "red-square", "words", "emergency", "911" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udd98" src="1f198.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  no_entry: {
+    keywords: [ "limit", "security", "privacy", "bad", "denied", "stop", "circle" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26d4" src="26d4.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  name_badge: {
+    keywords: [ "fire", "forbid" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcdb" src="1f4db.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  no_entry_sign: {
+    keywords: [ "forbid", "stop", "limit", "denied", "disallow", "circle" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeab" src="1f6ab.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  x: {
+    keywords: [ "no", "delete", "remove", "cancel", "red" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u274c" src="274c.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  o: {
+    keywords: [ "circle", "round" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2b55" src="2b55.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  stop_sign: {
+    keywords: [ "stop" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uded1" src="1f6d1.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  anger: {
+    keywords: [ "angry", "mad" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udca2" src="1f4a2.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  hotsprings: {
+    keywords: [ "bath", "warm", "relax" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2668\ufe0f" src="2668.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  no_pedestrians: {
+    keywords: [ "rules", "crossing", "walking", "circle" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeb7" src="1f6b7.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  do_not_litter: {
+    keywords: [ "trash", "bin", "garbage", "circle" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeaf" src="1f6af.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  no_bicycles: {
+    keywords: [ "cyclist", "prohibited", "circle" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeb3" src="1f6b3.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  "non-potable_water": {
+    keywords: [ "drink", "faucet", "tap", "circle" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeb1" src="1f6b1.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  underage: {
+    keywords: [ "18", "drink", "pub", "night", "minor", "circle" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd1e" src="1f51e.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  no_mobile_phones: {
+    keywords: [ "iphone", "mute", "circle" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcf5" src="1f4f5.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  exclamation: {
+    keywords: [ "heavy_exclamation_mark", "danger", "surprise", "punctuation", "wow", "warning" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2757" src="2757.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  grey_exclamation: {
+    keywords: [ "surprise", "punctuation", "gray", "wow", "warning" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2755" src="2755.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  question: {
+    keywords: [ "doubt", "confused" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2753" src="2753.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  grey_question: {
+    keywords: [ "doubts", "gray", "huh", "confused" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2754" src="2754.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  bangbang: {
+    keywords: [ "exclamation", "surprise" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u203c\ufe0f" src="203c.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  interrobang: {
+    keywords: [ "wat", "punctuation", "surprise" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2049\ufe0f" src="2049.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  low_brightness: {
+    keywords: [ "sun", "afternoon", "warm", "summer" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd05" src="1f505.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  high_brightness: {
+    keywords: [ "sun", "light" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd06" src="1f506.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  trident: {
+    keywords: [ "weapon", "spear" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd31" src="1f531.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  fleur_de_lis: {
+    keywords: [ "decorative", "scout" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u269c" src="269c.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  part_alternation_mark: {
+    keywords: [ "graph", "presentation", "stats", "business", "economics", "bad" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u303d\ufe0f" src="303d.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  warning: {
+    keywords: [ "exclamation", "wip", "alert", "error", "problem", "issue" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26a0\ufe0f" src="26a0.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  children_crossing: {
+    keywords: [ "school", "warning", "danger", "sign", "driving", "yellow-diamond" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeb8" src="1f6b8.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  beginner: {
+    keywords: [ "badge", "shield" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd30" src="1f530.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  recycle: {
+    keywords: [ "arrow", "environment", "garbage", "trash" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u267b\ufe0f" src="267b.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  u6307: {
+    keywords: [ "chinese", "point", "green-square", "kanji" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\ude2f" src="1f22f.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  chart: {
+    keywords: [ "green-square", "graph", "presentation", "stats" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcb9" src="1f4b9.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  sparkle: {
+    keywords: [ "stars", "green-square", "awesome", "good", "fireworks" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2747\ufe0f" src="2747.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  eight_spoked_asterisk: {
+    keywords: [ "star", "sparkle", "green-square" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2733\ufe0f" src="2733.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  negative_squared_cross_mark: {
+    keywords: [ "x", "green-square", "no", "deny" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u274e" src="274e.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  white_check_mark: {
+    keywords: [ "green-square", "ok", "agree", "vote", "election", "answer", "tick" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2705" src="2705.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  diamond_shape_with_a_dot_inside: {
+    keywords: [ "jewel", "blue", "gem", "crystal", "fancy" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udca0" src="1f4a0.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  cyclone: {
+    keywords: [ "weather", "swirl", "blue", "cloud", "vortex", "spiral", "whirlpool", "spin", "tornado", "hurricane", "typhoon" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf00" src="1f300.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  loop: {
+    keywords: [ "tape", "cassette" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u27bf" src="27bf.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  globe_with_meridians: {
+    keywords: [ "earth", "international", "world", "internet", "interweb", "i18n" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf10" src="1f310.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  m: {
+    keywords: [ "alphabet", "blue-circle", "letter" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u24c2\ufe0f" src="24c2.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  atm: {
+    keywords: [ "money", "sales", "cash", "blue-square", "payment", "bank" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfe7" src="1f3e7.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  sa: {
+    keywords: [ "japanese", "blue-square", "katakana" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\ude02\ufe0f" src="1f202.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  passport_control: {
+    keywords: [ "custom", "blue-square" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udec2" src="1f6c2.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  customs: {
+    keywords: [ "passport", "border", "blue-square" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udec3" src="1f6c3.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  baggage_claim: {
+    keywords: [ "blue-square", "airport", "transport" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udec4" src="1f6c4.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  left_luggage: {
+    keywords: [ "blue-square", "travel" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udec5" src="1f6c5.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  wheelchair: {
+    keywords: [ "blue-square", "disabled", "a11y", "accessibility" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u267f" src="267f.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  no_smoking: {
+    keywords: [ "cigarette", "blue-square", "smell", "smoke" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udead" src="1f6ad.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  wc: {
+    keywords: [ "toilet", "restroom", "blue-square" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udebe" src="1f6be.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  parking: {
+    keywords: [ "cars", "blue-square", "alphabet", "letter" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udd7f\ufe0f" src="1f17f.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  potable_water: {
+    keywords: [ "blue-square", "liquid", "restroom", "cleaning", "faucet" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeb0" src="1f6b0.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  mens: {
+    keywords: [ "toilet", "restroom", "wc", "blue-square", "gender", "male" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeb9" src="1f6b9.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  womens: {
+    keywords: [ "purple-square", "woman", "female", "toilet", "loo", "restroom", "gender" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeba" src="1f6ba.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  baby_symbol: {
+    keywords: [ "orange-square", "child" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udebc" src="1f6bc.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  restroom: {
+    keywords: [ "blue-square", "toilet", "refresh", "wc", "gender" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udebb" src="1f6bb.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  put_litter_in_its_place: {
+    keywords: [ "blue-square", "sign", "human", "info" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeae" src="1f6ae.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  cinema: {
+    keywords: [ "blue-square", "record", "film", "movie", "curtain", "stage", "theater" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfa6" src="1f3a6.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  signal_strength: {
+    keywords: [ "blue-square", "reception", "phone", "internet", "connection", "wifi", "bluetooth", "bars" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcf6" src="1f4f6.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  koko: {
+    keywords: [ "blue-square", "here", "katakana", "japanese", "destination" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\ude01" src="1f201.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  ng: {
+    keywords: [ "blue-square", "words", "shape", "icon" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udd96" src="1f196.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  ok: {
+    keywords: [ "good", "agree", "yes", "blue-square" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udd97" src="1f197.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  up: {
+    keywords: [ "blue-square", "above", "high" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udd99" src="1f199.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  cool: {
+    keywords: [ "words", "blue-square" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udd92" src="1f192.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  new: {
+    keywords: [ "blue-square", "words", "start" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udd95" src="1f195.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  free: {
+    keywords: [ "blue-square", "words" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udd93" src="1f193.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  zero: {
+    keywords: [ "0", "numbers", "blue-square", "null" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="0\ufe0f\u20e3" src="30-20e3.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  one: {
+    keywords: [ "blue-square", "numbers", "1" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="1\ufe0f\u20e3" src="31-20e3.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  two: {
+    keywords: [ "numbers", "2", "prime", "blue-square" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="2\ufe0f\u20e3" src="32-20e3.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  three: {
+    keywords: [ "3", "numbers", "prime", "blue-square" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="3\ufe0f\u20e3" src="33-20e3.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  four: {
+    keywords: [ "4", "numbers", "blue-square" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="4\ufe0f\u20e3" src="34-20e3.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  five: {
+    keywords: [ "5", "numbers", "blue-square", "prime" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="5\ufe0f\u20e3" src="35-20e3.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  six: {
+    keywords: [ "6", "numbers", "blue-square" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="6\ufe0f\u20e3" src="36-20e3.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  seven: {
+    keywords: [ "7", "numbers", "blue-square", "prime" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="7\ufe0f\u20e3" src="37-20e3.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  eight: {
+    keywords: [ "8", "blue-square", "numbers" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="8\ufe0f\u20e3" src="38-20e3.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  nine: {
+    keywords: [ "blue-square", "numbers", "9" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="9\ufe0f\u20e3" src="39-20e3.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  keycap_ten: {
+    keywords: [ "numbers", "10", "blue-square" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd1f" src="1f51f.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  asterisk: {
+    keywords: [ "star", "keycap" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="*\u20e3" src="2a-20e3.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  eject_button: {
+    keywords: [ "blue-square" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u23cf\ufe0f" src="23cf.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_forward: {
+    keywords: [ "blue-square", "right", "direction", "play" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u25b6\ufe0f" src="25b6.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  pause_button: {
+    keywords: [ "pause", "blue-square" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u23f8" src="23f8.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  next_track_button: {
+    keywords: [ "forward", "next", "blue-square" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u23ed" src="23ed.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  stop_button: {
+    keywords: [ "blue-square" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u23f9" src="23f9.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  record_button: {
+    keywords: [ "blue-square" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u23fa" src="23fa.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  play_or_pause_button: {
+    keywords: [ "blue-square", "play", "pause" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u23ef" src="23ef.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  previous_track_button: {
+    keywords: [ "backward" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u23ee" src="23ee.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  fast_forward: {
+    keywords: [ "blue-square", "play", "speed", "continue" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u23e9" src="23e9.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  rewind: {
+    keywords: [ "play", "blue-square" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u23ea" src="23ea.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  twisted_rightwards_arrows: {
+    keywords: [ "blue-square", "shuffle", "music", "random" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd00" src="1f500.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  repeat: {
+    keywords: [ "loop", "record" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd01" src="1f501.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  repeat_one: {
+    keywords: [ "blue-square", "loop" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd02" src="1f502.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_backward: {
+    keywords: [ "blue-square", "left", "direction" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u25c0\ufe0f" src="25c0.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_up_small: {
+    keywords: [ "blue-square", "triangle", "direction", "point", "forward", "top" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd3c" src="1f53c.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_down_small: {
+    keywords: [ "blue-square", "direction", "bottom" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd3d" src="1f53d.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_double_up: {
+    keywords: [ "blue-square", "direction", "top" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u23eb" src="23eb.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_double_down: {
+    keywords: [ "blue-square", "direction", "bottom" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u23ec" src="23ec.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_right: {
+    keywords: [ "blue-square", "next" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u27a1\ufe0f" src="27a1.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_left: {
+    keywords: [ "blue-square", "previous", "back" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2b05\ufe0f" src="2b05.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_up: {
+    keywords: [ "blue-square", "continue", "top", "direction" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2b06\ufe0f" src="2b06.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_down: {
+    keywords: [ "blue-square", "direction", "bottom" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2b07\ufe0f" src="2b07.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_upper_right: {
+    keywords: [ "blue-square", "point", "direction", "diagonal", "northeast" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2197\ufe0f" src="2197.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_lower_right: {
+    keywords: [ "blue-square", "direction", "diagonal", "southeast" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2198\ufe0f" src="2198.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_lower_left: {
+    keywords: [ "blue-square", "direction", "diagonal", "southwest" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2199\ufe0f" src="2199.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_upper_left: {
+    keywords: [ "blue-square", "point", "direction", "diagonal", "northwest" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2196\ufe0f" src="2196.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_up_down: {
+    keywords: [ "blue-square", "direction", "way", "vertical" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2195\ufe0f" src="2195.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  left_right_arrow: {
+    keywords: [ "shape", "direction", "horizontal", "sideways" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2194\ufe0f" src="2194.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrows_counterclockwise: {
+    keywords: [ "blue-square", "sync", "cycle" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd04" src="1f504.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_right_hook: {
+    keywords: [ "blue-square", "return", "rotate", "direction" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u21aa\ufe0f" src="21aa.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  leftwards_arrow_with_hook: {
+    keywords: [ "back", "return", "blue-square", "undo", "enter" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u21a9\ufe0f" src="21a9.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_heading_up: {
+    keywords: [ "blue-square", "direction", "top" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2934\ufe0f" src="2934.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_heading_down: {
+    keywords: [ "blue-square", "direction", "bottom" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2935\ufe0f" src="2935.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  hash: {
+    keywords: [ "symbol", "blue-square", "twitter" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="#\ufe0f\u20e3" src="23-20e3.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  information_source: {
+    keywords: [ "blue-square", "alphabet", "letter" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2139\ufe0f" src="2139.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  abc: {
+    keywords: [ "blue-square", "alphabet" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd24" src="1f524.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  abcd: {
+    keywords: [ "blue-square", "alphabet" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd21" src="1f521.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  capital_abcd: {
+    keywords: [ "alphabet", "words", "blue-square" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd20" src="1f520.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  symbols: {
+    keywords: [ "blue-square", "music", "note", "ampersand", "percent", "glyphs", "characters" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd23" src="1f523.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  musical_note: {
+    keywords: [ "score", "tone", "sound" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfb5" src="1f3b5.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  notes: {
+    keywords: [ "music", "score" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfb6" src="1f3b6.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  wavy_dash: {
+    keywords: [ "draw", "line", "moustache", "mustache", "squiggle", "scribble" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u3030\ufe0f" src="3030.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  curly_loop: {
+    keywords: [ "scribble", "draw", "shape", "squiggle" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u27b0" src="27b0.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  heavy_check_mark: {
+    keywords: [ "ok", "nike", "answer", "yes", "tick" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2714\ufe0f" src="2714.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrows_clockwise: {
+    keywords: [ "sync", "cycle", "round", "repeat" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd03" src="1f503.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  heavy_plus_sign: {
+    keywords: [ "math", "calculation", "addition", "more", "increase" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2795" src="2795.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  heavy_minus_sign: {
+    keywords: [ "math", "calculation", "subtract", "less" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2796" src="2796.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  heavy_division_sign: {
+    keywords: [ "divide", "math", "calculation" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2797" src="2797.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  heavy_multiplication_x: {
+    keywords: [ "math", "calculation" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2716\ufe0f" src="2716.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  infinity: {
+    keywords: [ "forever" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u267e" src="267e.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  heavy_dollar_sign: {
+    keywords: [ "money", "sales", "payment", "currency", "buck" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcb2" src="1f4b2.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  currency_exchange: {
+    keywords: [ "money", "sales", "dollar", "travel" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcb1" src="1f4b1.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  copyright: {
+    keywords: [ "ip", "license", "circle", "law", "legal" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\xa9\ufe0f" src="a9.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  registered: {
+    keywords: [ "alphabet", "circle" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\xae\ufe0f" src="ae.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  tm: {
+    keywords: [ "trademark", "brand", "law", "legal" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2122\ufe0f" src="2122.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  end: {
+    keywords: [ "words", "arrow" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd1a" src="1f51a.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  back: {
+    keywords: [ "arrow", "words", "return" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd19" src="1f519.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  on: {
+    keywords: [ "arrow", "words" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd1b" src="1f51b.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  top: {
+    keywords: [ "words", "blue-square" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd1d" src="1f51d.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  soon: {
+    keywords: [ "arrow", "words" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd1c" src="1f51c.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  ballot_box_with_check: {
+    keywords: [ "ok", "agree", "confirm", "black-square", "vote", "election", "yes", "tick" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2611\ufe0f" src="2611.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  radio_button: {
+    keywords: [ "input", "old", "music", "circle" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd18" src="1f518.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  white_circle: {
+    keywords: [ "shape", "round" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26aa" src="26aa.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  black_circle: {
+    keywords: [ "shape", "button", "round" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26ab" src="26ab.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  red_circle: {
+    keywords: [ "shape", "error", "danger" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd34" src="1f534.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  large_blue_circle: {
+    keywords: [ "shape", "icon", "button" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd35" src="1f535.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  small_orange_diamond: {
+    keywords: [ "shape", "jewel", "gem" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd38" src="1f538.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  small_blue_diamond: {
+    keywords: [ "shape", "jewel", "gem" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd39" src="1f539.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  large_orange_diamond: {
+    keywords: [ "shape", "jewel", "gem" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd36" src="1f536.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  large_blue_diamond: {
+    keywords: [ "shape", "jewel", "gem" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd37" src="1f537.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  small_red_triangle: {
+    keywords: [ "shape", "direction", "up", "top" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd3a" src="1f53a.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  black_small_square: {
+    keywords: [ "shape", "icon" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u25aa\ufe0f" src="25aa.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  white_small_square: {
+    keywords: [ "shape", "icon" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u25ab\ufe0f" src="25ab.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  black_large_square: {
+    keywords: [ "shape", "icon", "button" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2b1b" src="2b1b.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  white_large_square: {
+    keywords: [ "shape", "icon", "stone", "button" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2b1c" src="2b1c.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  small_red_triangle_down: {
+    keywords: [ "shape", "direction", "bottom" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd3b" src="1f53b.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  black_medium_square: {
+    keywords: [ "shape", "button", "icon" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u25fc\ufe0f" src="25fc.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  white_medium_square: {
+    keywords: [ "shape", "stone", "icon" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u25fb\ufe0f" src="25fb.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  black_medium_small_square: {
+    keywords: [ "icon", "shape", "button" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u25fe" src="25fe.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  white_medium_small_square: {
+    keywords: [ "shape", "stone", "icon", "button" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u25fd" src="25fd.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  black_square_button: {
+    keywords: [ "shape", "input", "frame" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd32" src="1f532.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  white_square_button: {
+    keywords: [ "shape", "input" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd33" src="1f533.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  speaker: {
+    keywords: [ "sound", "volume", "silence", "broadcast" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd08" src="1f508.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  sound: {
+    keywords: [ "volume", "speaker", "broadcast" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd09" src="1f509.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  loud_sound: {
+    keywords: [ "volume", "noise", "noisy", "speaker", "broadcast" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd0a" src="1f50a.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  mute: {
+    keywords: [ "sound", "volume", "silence", "quiet" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd07" src="1f507.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  mega: {
+    keywords: [ "sound", "speaker", "volume" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udce3" src="1f4e3.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  loudspeaker: {
+    keywords: [ "volume", "sound" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udce2" src="1f4e2.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  bell: {
+    keywords: [ "sound", "notification", "christmas", "xmas", "chime" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd14" src="1f514.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  no_bell: {
+    keywords: [ "sound", "volume", "mute", "quiet", "silent" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd15" src="1f515.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  black_joker: {
+    keywords: [ "poker", "cards", "game", "play", "magic" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udccf" src="1f0cf.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  mahjong: {
+    keywords: [ "game", "play", "chinese", "kanji" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udc04" src="1f004.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  spades: {
+    keywords: [ "poker", "cards", "suits", "magic" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2660\ufe0f" src="2660.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clubs: {
+    keywords: [ "poker", "cards", "magic", "suits" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2663\ufe0f" src="2663.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  hearts: {
+    keywords: [ "poker", "cards", "magic", "suits" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2665\ufe0f" src="2665.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  diamonds: {
+    keywords: [ "poker", "cards", "magic", "suits" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2666\ufe0f" src="2666.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  flower_playing_cards: {
+    keywords: [ "game", "sunset", "red" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfb4" src="1f3b4.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  thought_balloon: {
+    keywords: [ "bubble", "cloud", "speech", "thinking", "dream" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcad" src="1f4ad.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  right_anger_bubble: {
+    keywords: [ "caption", "speech", "thinking", "mad" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddef" src="1f5ef.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  speech_balloon: {
+    keywords: [ "bubble", "words", "message", "talk", "chatting" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcac" src="1f4ac.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  left_speech_bubble: {
+    keywords: [ "words", "message", "talk", "chatting" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udde8" src="1f5e8.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock1: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd50" src="1f550.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock2: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd51" src="1f551.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock3: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd52" src="1f552.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock4: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd53" src="1f553.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock5: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd54" src="1f554.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock6: {
+    keywords: [ "time", "late", "early", "schedule", "dawn", "dusk" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd55" src="1f555.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock7: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd56" src="1f556.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock8: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd57" src="1f557.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock9: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd58" src="1f558.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock10: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd59" src="1f559.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock11: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd5a" src="1f55a.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock12: {
+    keywords: [ "time", "noon", "midnight", "midday", "late", "early", "schedule" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd5b" src="1f55b.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock130: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd5c" src="1f55c.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock230: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd5d" src="1f55d.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock330: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd5e" src="1f55e.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock430: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd5f" src="1f55f.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock530: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd60" src="1f560.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock630: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd61" src="1f561.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock730: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd62" src="1f562.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock830: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd63" src="1f563.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock930: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd64" src="1f564.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock1030: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd65" src="1f565.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock1130: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd66" src="1f566.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock1230: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd67" src="1f567.png"/>',
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  afghanistan: {
+    keywords: [ "af", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde6\ud83c\uddeb" src="1f1e6-1f1eb.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  aland_islands: {
+    keywords: [ "\xc5land", "islands", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde6\ud83c\uddfd" src="1f1e6-1f1fd.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  albania: {
+    keywords: [ "al", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde6\ud83c\uddf1" src="1f1e6-1f1f1.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  algeria: {
+    keywords: [ "dz", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde9\ud83c\uddff" src="1f1e9-1f1ff.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  american_samoa: {
+    keywords: [ "american", "ws", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde6\ud83c\uddf8" src="1f1e6-1f1f8.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  andorra: {
+    keywords: [ "ad", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde6\ud83c\udde9" src="1f1e6-1f1e9.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  angola: {
+    keywords: [ "ao", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde6\ud83c\uddf4" src="1f1e6-1f1f4.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  anguilla: {
+    keywords: [ "ai", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde6\ud83c\uddee" src="1f1e6-1f1ee.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  antarctica: {
+    keywords: [ "aq", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde6\ud83c\uddf6" src="1f1e6-1f1f6.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  antigua_barbuda: {
+    keywords: [ "antigua", "barbuda", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde6\ud83c\uddec" src="1f1e6-1f1ec.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  argentina: {
+    keywords: [ "ar", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde6\ud83c\uddf7" src="1f1e6-1f1f7.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  armenia: {
+    keywords: [ "am", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde6\ud83c\uddf2" src="1f1e6-1f1f2.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  aruba: {
+    keywords: [ "aw", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde6\ud83c\uddfc" src="1f1e6-1f1fc.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  australia: {
+    keywords: [ "au", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde6\ud83c\uddfa" src="1f1e6-1f1fa.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  austria: {
+    keywords: [ "at", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde6\ud83c\uddf9" src="1f1e6-1f1f9.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  azerbaijan: {
+    keywords: [ "az", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde6\ud83c\uddff" src="1f1e6-1f1ff.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  bahamas: {
+    keywords: [ "bs", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\uddf8" src="1f1e7-1f1f8.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  bahrain: {
+    keywords: [ "bh", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\udded" src="1f1e7-1f1ed.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  bangladesh: {
+    keywords: [ "bd", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\udde9" src="1f1e7-1f1e9.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  barbados: {
+    keywords: [ "bb", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\udde7" src="1f1e7-1f1e7.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  belarus: {
+    keywords: [ "by", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\uddfe" src="1f1e7-1f1fe.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  belgium: {
+    keywords: [ "be", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\uddea" src="1f1e7-1f1ea.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  belize: {
+    keywords: [ "bz", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\uddff" src="1f1e7-1f1ff.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  benin: {
+    keywords: [ "bj", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\uddef" src="1f1e7-1f1ef.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  bermuda: {
+    keywords: [ "bm", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\uddf2" src="1f1e7-1f1f2.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  bhutan: {
+    keywords: [ "bt", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\uddf9" src="1f1e7-1f1f9.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  bolivia: {
+    keywords: [ "bo", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\uddf4" src="1f1e7-1f1f4.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  caribbean_netherlands: {
+    keywords: [ "bonaire", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\uddf6" src="1f1e7-1f1f6.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  bosnia_herzegovina: {
+    keywords: [ "bosnia", "herzegovina", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\udde6" src="1f1e7-1f1e6.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  botswana: {
+    keywords: [ "bw", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\uddfc" src="1f1e7-1f1fc.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  brazil: {
+    keywords: [ "br", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\uddf7" src="1f1e7-1f1f7.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  british_indian_ocean_territory: {
+    keywords: [ "british", "indian", "ocean", "territory", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddee\ud83c\uddf4" src="1f1ee-1f1f4.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  british_virgin_islands: {
+    keywords: [ "british", "virgin", "islands", "bvi", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfb\ud83c\uddec" src="1f1fb-1f1ec.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  brunei: {
+    keywords: [ "bn", "darussalam", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\uddf3" src="1f1e7-1f1f3.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  bulgaria: {
+    keywords: [ "bg", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\uddec" src="1f1e7-1f1ec.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  burkina_faso: {
+    keywords: [ "burkina", "faso", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\uddeb" src="1f1e7-1f1eb.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  burundi: {
+    keywords: [ "bi", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\uddee" src="1f1e7-1f1ee.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  cape_verde: {
+    keywords: [ "cabo", "verde", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\uddfb" src="1f1e8-1f1fb.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  cambodia: {
+    keywords: [ "kh", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf0\ud83c\udded" src="1f1f0-1f1ed.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  cameroon: {
+    keywords: [ "cm", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\uddf2" src="1f1e8-1f1f2.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  canada: {
+    keywords: [ "ca", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\udde6" src="1f1e8-1f1e6.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  canary_islands: {
+    keywords: [ "canary", "islands", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddee\ud83c\udde8" src="1f1ee-1f1e8.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  cayman_islands: {
+    keywords: [ "cayman", "islands", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf0\ud83c\uddfe" src="1f1f0-1f1fe.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  central_african_republic: {
+    keywords: [ "central", "african", "republic", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\uddeb" src="1f1e8-1f1eb.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  chad: {
+    keywords: [ "td", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf9\ud83c\udde9" src="1f1f9-1f1e9.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  chile: {
+    keywords: [ "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\uddf1" src="1f1e8-1f1f1.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  cn: {
+    keywords: [ "china", "chinese", "prc", "flag", "country", "nation", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\uddf3" src="1f1e8-1f1f3.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  christmas_island: {
+    keywords: [ "christmas", "island", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\uddfd" src="1f1e8-1f1fd.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  cocos_islands: {
+    keywords: [ "cocos", "keeling", "islands", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\udde8" src="1f1e8-1f1e8.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  colombia: {
+    keywords: [ "co", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\uddf4" src="1f1e8-1f1f4.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  comoros: {
+    keywords: [ "km", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf0\ud83c\uddf2" src="1f1f0-1f1f2.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  congo_brazzaville: {
+    keywords: [ "congo", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\uddec" src="1f1e8-1f1ec.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  congo_kinshasa: {
+    keywords: [ "congo", "democratic", "republic", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\udde9" src="1f1e8-1f1e9.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  cook_islands: {
+    keywords: [ "cook", "islands", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\uddf0" src="1f1e8-1f1f0.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  costa_rica: {
+    keywords: [ "costa", "rica", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\uddf7" src="1f1e8-1f1f7.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  croatia: {
+    keywords: [ "hr", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udded\ud83c\uddf7" src="1f1ed-1f1f7.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  cuba: {
+    keywords: [ "cu", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\uddfa" src="1f1e8-1f1fa.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  curacao: {
+    keywords: [ "cura\xe7ao", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\uddfc" src="1f1e8-1f1fc.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  cyprus: {
+    keywords: [ "cy", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\uddfe" src="1f1e8-1f1fe.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  czech_republic: {
+    keywords: [ "cz", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\uddff" src="1f1e8-1f1ff.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  denmark: {
+    keywords: [ "dk", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde9\ud83c\uddf0" src="1f1e9-1f1f0.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  djibouti: {
+    keywords: [ "dj", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde9\ud83c\uddef" src="1f1e9-1f1ef.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  dominica: {
+    keywords: [ "dm", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde9\ud83c\uddf2" src="1f1e9-1f1f2.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  dominican_republic: {
+    keywords: [ "dominican", "republic", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde9\ud83c\uddf4" src="1f1e9-1f1f4.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  ecuador: {
+    keywords: [ "ec", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddea\ud83c\udde8" src="1f1ea-1f1e8.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  egypt: {
+    keywords: [ "eg", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddea\ud83c\uddec" src="1f1ea-1f1ec.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  el_salvador: {
+    keywords: [ "el", "salvador", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\uddfb" src="1f1f8-1f1fb.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  equatorial_guinea: {
+    keywords: [ "equatorial", "gn", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\uddf6" src="1f1ec-1f1f6.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  eritrea: {
+    keywords: [ "er", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddea\ud83c\uddf7" src="1f1ea-1f1f7.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  estonia: {
+    keywords: [ "ee", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddea\ud83c\uddea" src="1f1ea-1f1ea.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  ethiopia: {
+    keywords: [ "et", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddea\ud83c\uddf9" src="1f1ea-1f1f9.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  eu: {
+    keywords: [ "european", "union", "flag", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddea\ud83c\uddfa" src="1f1ea-1f1fa.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  falkland_islands: {
+    keywords: [ "falkland", "islands", "malvinas", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddeb\ud83c\uddf0" src="1f1eb-1f1f0.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  faroe_islands: {
+    keywords: [ "faroe", "islands", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddeb\ud83c\uddf4" src="1f1eb-1f1f4.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  fiji: {
+    keywords: [ "fj", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddeb\ud83c\uddef" src="1f1eb-1f1ef.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  finland: {
+    keywords: [ "fi", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddeb\ud83c\uddee" src="1f1eb-1f1ee.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  fr: {
+    keywords: [ "banner", "flag", "nation", "france", "french", "country" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddeb\ud83c\uddf7" src="1f1eb-1f1f7.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  french_guiana: {
+    keywords: [ "french", "guiana", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\uddeb" src="1f1ec-1f1eb.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  french_polynesia: {
+    keywords: [ "french", "polynesia", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf5\ud83c\uddeb" src="1f1f5-1f1eb.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  french_southern_territories: {
+    keywords: [ "french", "southern", "territories", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf9\ud83c\uddeb" src="1f1f9-1f1eb.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  gabon: {
+    keywords: [ "ga", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\udde6" src="1f1ec-1f1e6.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  gambia: {
+    keywords: [ "gm", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\uddf2" src="1f1ec-1f1f2.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  georgia: {
+    keywords: [ "ge", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\uddea" src="1f1ec-1f1ea.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  de: {
+    keywords: [ "german", "nation", "flag", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde9\ud83c\uddea" src="1f1e9-1f1ea.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  ghana: {
+    keywords: [ "gh", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\udded" src="1f1ec-1f1ed.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  gibraltar: {
+    keywords: [ "gi", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\uddee" src="1f1ec-1f1ee.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  greece: {
+    keywords: [ "gr", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\uddf7" src="1f1ec-1f1f7.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  greenland: {
+    keywords: [ "gl", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\uddf1" src="1f1ec-1f1f1.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  grenada: {
+    keywords: [ "gd", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\udde9" src="1f1ec-1f1e9.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  guadeloupe: {
+    keywords: [ "gp", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\uddf5" src="1f1ec-1f1f5.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  guam: {
+    keywords: [ "gu", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\uddfa" src="1f1ec-1f1fa.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  guatemala: {
+    keywords: [ "gt", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\uddf9" src="1f1ec-1f1f9.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  guernsey: {
+    keywords: [ "gg", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\uddec" src="1f1ec-1f1ec.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  guinea: {
+    keywords: [ "gn", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\uddf3" src="1f1ec-1f1f3.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  guinea_bissau: {
+    keywords: [ "gw", "bissau", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\uddfc" src="1f1ec-1f1fc.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  guyana: {
+    keywords: [ "gy", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\uddfe" src="1f1ec-1f1fe.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  haiti: {
+    keywords: [ "ht", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udded\ud83c\uddf9" src="1f1ed-1f1f9.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  honduras: {
+    keywords: [ "hn", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udded\ud83c\uddf3" src="1f1ed-1f1f3.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  hong_kong: {
+    keywords: [ "hong", "kong", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udded\ud83c\uddf0" src="1f1ed-1f1f0.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  hungary: {
+    keywords: [ "hu", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udded\ud83c\uddfa" src="1f1ed-1f1fa.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  iceland: {
+    keywords: [ "is", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddee\ud83c\uddf8" src="1f1ee-1f1f8.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  india: {
+    keywords: [ "in", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddee\ud83c\uddf3" src="1f1ee-1f1f3.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  indonesia: {
+    keywords: [ "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddee\ud83c\udde9" src="1f1ee-1f1e9.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  iran: {
+    keywords: [ "iran,", "islamic", "republic", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddee\ud83c\uddf7" src="1f1ee-1f1f7.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  iraq: {
+    keywords: [ "iq", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddee\ud83c\uddf6" src="1f1ee-1f1f6.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  ireland: {
+    keywords: [ "ie", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddee\ud83c\uddea" src="1f1ee-1f1ea.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  isle_of_man: {
+    keywords: [ "isle", "man", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddee\ud83c\uddf2" src="1f1ee-1f1f2.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  israel: {
+    keywords: [ "il", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddee\ud83c\uddf1" src="1f1ee-1f1f1.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  it: {
+    keywords: [ "italy", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddee\ud83c\uddf9" src="1f1ee-1f1f9.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  cote_divoire: {
+    keywords: [ "ivory", "coast", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\uddee" src="1f1e8-1f1ee.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  jamaica: {
+    keywords: [ "jm", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddef\ud83c\uddf2" src="1f1ef-1f1f2.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  jp: {
+    keywords: [ "japanese", "nation", "flag", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddef\ud83c\uddf5" src="1f1ef-1f1f5.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  jersey: {
+    keywords: [ "je", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddef\ud83c\uddea" src="1f1ef-1f1ea.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  jordan: {
+    keywords: [ "jo", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddef\ud83c\uddf4" src="1f1ef-1f1f4.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  kazakhstan: {
+    keywords: [ "kz", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf0\ud83c\uddff" src="1f1f0-1f1ff.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  kenya: {
+    keywords: [ "ke", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf0\ud83c\uddea" src="1f1f0-1f1ea.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  kiribati: {
+    keywords: [ "ki", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf0\ud83c\uddee" src="1f1f0-1f1ee.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  kosovo: {
+    keywords: [ "xk", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfd\ud83c\uddf0" src="1f1fd-1f1f0.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  kuwait: {
+    keywords: [ "kw", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf0\ud83c\uddfc" src="1f1f0-1f1fc.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  kyrgyzstan: {
+    keywords: [ "kg", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf0\ud83c\uddec" src="1f1f0-1f1ec.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  laos: {
+    keywords: [ "lao", "democratic", "republic", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf1\ud83c\udde6" src="1f1f1-1f1e6.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  latvia: {
+    keywords: [ "lv", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf1\ud83c\uddfb" src="1f1f1-1f1fb.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  lebanon: {
+    keywords: [ "lb", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf1\ud83c\udde7" src="1f1f1-1f1e7.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  lesotho: {
+    keywords: [ "ls", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf1\ud83c\uddf8" src="1f1f1-1f1f8.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  liberia: {
+    keywords: [ "lr", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf1\ud83c\uddf7" src="1f1f1-1f1f7.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  libya: {
+    keywords: [ "ly", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf1\ud83c\uddfe" src="1f1f1-1f1fe.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  liechtenstein: {
+    keywords: [ "li", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf1\ud83c\uddee" src="1f1f1-1f1ee.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  lithuania: {
+    keywords: [ "lt", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf1\ud83c\uddf9" src="1f1f1-1f1f9.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  luxembourg: {
+    keywords: [ "lu", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf1\ud83c\uddfa" src="1f1f1-1f1fa.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  macau: {
+    keywords: [ "macao", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddf4" src="1f1f2-1f1f4.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  macedonia: {
+    keywords: [ "macedonia,", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddf0" src="1f1f2-1f1f0.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  madagascar: {
+    keywords: [ "mg", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddec" src="1f1f2-1f1ec.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  malawi: {
+    keywords: [ "mw", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddfc" src="1f1f2-1f1fc.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  malaysia: {
+    keywords: [ "my", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddfe" src="1f1f2-1f1fe.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  maldives: {
+    keywords: [ "mv", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddfb" src="1f1f2-1f1fb.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  mali: {
+    keywords: [ "ml", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddf1" src="1f1f2-1f1f1.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  malta: {
+    keywords: [ "mt", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddf9" src="1f1f2-1f1f9.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  marshall_islands: {
+    keywords: [ "marshall", "islands", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\udded" src="1f1f2-1f1ed.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  martinique: {
+    keywords: [ "mq", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddf6" src="1f1f2-1f1f6.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  mauritania: {
+    keywords: [ "mr", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddf7" src="1f1f2-1f1f7.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  mauritius: {
+    keywords: [ "mu", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddfa" src="1f1f2-1f1fa.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  mayotte: {
+    keywords: [ "yt", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfe\ud83c\uddf9" src="1f1fe-1f1f9.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  mexico: {
+    keywords: [ "mx", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddfd" src="1f1f2-1f1fd.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  micronesia: {
+    keywords: [ "micronesia,", "federated", "states", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddeb\ud83c\uddf2" src="1f1eb-1f1f2.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  moldova: {
+    keywords: [ "moldova,", "republic", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\udde9" src="1f1f2-1f1e9.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  monaco: {
+    keywords: [ "mc", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\udde8" src="1f1f2-1f1e8.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  mongolia: {
+    keywords: [ "mn", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddf3" src="1f1f2-1f1f3.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  montenegro: {
+    keywords: [ "me", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddea" src="1f1f2-1f1ea.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  montserrat: {
+    keywords: [ "ms", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddf8" src="1f1f2-1f1f8.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  morocco: {
+    keywords: [ "ma", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\udde6" src="1f1f2-1f1e6.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  mozambique: {
+    keywords: [ "mz", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddff" src="1f1f2-1f1ff.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  myanmar: {
+    keywords: [ "mm", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddf2" src="1f1f2-1f1f2.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  namibia: {
+    keywords: [ "na", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf3\ud83c\udde6" src="1f1f3-1f1e6.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  nauru: {
+    keywords: [ "nr", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf3\ud83c\uddf7" src="1f1f3-1f1f7.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  nepal: {
+    keywords: [ "np", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf3\ud83c\uddf5" src="1f1f3-1f1f5.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  netherlands: {
+    keywords: [ "nl", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf3\ud83c\uddf1" src="1f1f3-1f1f1.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  new_caledonia: {
+    keywords: [ "new", "caledonia", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf3\ud83c\udde8" src="1f1f3-1f1e8.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  new_zealand: {
+    keywords: [ "new", "zealand", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf3\ud83c\uddff" src="1f1f3-1f1ff.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  nicaragua: {
+    keywords: [ "ni", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf3\ud83c\uddee" src="1f1f3-1f1ee.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  niger: {
+    keywords: [ "ne", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf3\ud83c\uddea" src="1f1f3-1f1ea.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  nigeria: {
+    keywords: [ "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf3\ud83c\uddec" src="1f1f3-1f1ec.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  niue: {
+    keywords: [ "nu", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf3\ud83c\uddfa" src="1f1f3-1f1fa.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  norfolk_island: {
+    keywords: [ "norfolk", "island", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf3\ud83c\uddeb" src="1f1f3-1f1eb.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  northern_mariana_islands: {
+    keywords: [ "northern", "mariana", "islands", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddf5" src="1f1f2-1f1f5.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  north_korea: {
+    keywords: [ "north", "korea", "nation", "flag", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf0\ud83c\uddf5" src="1f1f0-1f1f5.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  norway: {
+    keywords: [ "no", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf3\ud83c\uddf4" src="1f1f3-1f1f4.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  oman: {
+    keywords: [ "om_symbol", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf4\ud83c\uddf2" src="1f1f4-1f1f2.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  pakistan: {
+    keywords: [ "pk", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf5\ud83c\uddf0" src="1f1f5-1f1f0.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  palau: {
+    keywords: [ "pw", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf5\ud83c\uddfc" src="1f1f5-1f1fc.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  palestinian_territories: {
+    keywords: [ "palestine", "palestinian", "territories", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf5\ud83c\uddf8" src="1f1f5-1f1f8.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  panama: {
+    keywords: [ "pa", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf5\ud83c\udde6" src="1f1f5-1f1e6.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  papua_new_guinea: {
+    keywords: [ "papua", "new", "guinea", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf5\ud83c\uddec" src="1f1f5-1f1ec.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  paraguay: {
+    keywords: [ "py", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf5\ud83c\uddfe" src="1f1f5-1f1fe.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  peru: {
+    keywords: [ "pe", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf5\ud83c\uddea" src="1f1f5-1f1ea.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  philippines: {
+    keywords: [ "ph", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf5\ud83c\udded" src="1f1f5-1f1ed.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  pitcairn_islands: {
+    keywords: [ "pitcairn", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf5\ud83c\uddf3" src="1f1f5-1f1f3.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  poland: {
+    keywords: [ "pl", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf5\ud83c\uddf1" src="1f1f5-1f1f1.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  portugal: {
+    keywords: [ "pt", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf5\ud83c\uddf9" src="1f1f5-1f1f9.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  puerto_rico: {
+    keywords: [ "puerto", "rico", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf5\ud83c\uddf7" src="1f1f5-1f1f7.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  qatar: {
+    keywords: [ "qa", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf6\ud83c\udde6" src="1f1f6-1f1e6.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  reunion: {
+    keywords: [ "r\xe9union", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf7\ud83c\uddea" src="1f1f7-1f1ea.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  romania: {
+    keywords: [ "ro", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf7\ud83c\uddf4" src="1f1f7-1f1f4.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  ru: {
+    keywords: [ "russian", "federation", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf7\ud83c\uddfa" src="1f1f7-1f1fa.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  rwanda: {
+    keywords: [ "rw", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf7\ud83c\uddfc" src="1f1f7-1f1fc.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  st_barthelemy: {
+    keywords: [ "saint", "barth\xe9lemy", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\uddf1" src="1f1e7-1f1f1.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  st_helena: {
+    keywords: [ "saint", "helena", "ascension", "tristan", "cunha", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\udded" src="1f1f8-1f1ed.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  st_kitts_nevis: {
+    keywords: [ "saint", "kitts", "nevis", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf0\ud83c\uddf3" src="1f1f0-1f1f3.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  st_lucia: {
+    keywords: [ "saint", "lucia", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf1\ud83c\udde8" src="1f1f1-1f1e8.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  st_pierre_miquelon: {
+    keywords: [ "saint", "pierre", "miquelon", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf5\ud83c\uddf2" src="1f1f5-1f1f2.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  st_vincent_grenadines: {
+    keywords: [ "saint", "vincent", "grenadines", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfb\ud83c\udde8" src="1f1fb-1f1e8.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  samoa: {
+    keywords: [ "ws", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfc\ud83c\uddf8" src="1f1fc-1f1f8.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  san_marino: {
+    keywords: [ "san", "marino", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\uddf2" src="1f1f8-1f1f2.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  sao_tome_principe: {
+    keywords: [ "sao", "tome", "principe", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\uddf9" src="1f1f8-1f1f9.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  saudi_arabia: {
+    keywords: [ "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\udde6" src="1f1f8-1f1e6.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  senegal: {
+    keywords: [ "sn", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\uddf3" src="1f1f8-1f1f3.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  serbia: {
+    keywords: [ "rs", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf7\ud83c\uddf8" src="1f1f7-1f1f8.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  seychelles: {
+    keywords: [ "sc", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\udde8" src="1f1f8-1f1e8.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  sierra_leone: {
+    keywords: [ "sierra", "leone", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\uddf1" src="1f1f8-1f1f1.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  singapore: {
+    keywords: [ "sg", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\uddec" src="1f1f8-1f1ec.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  sint_maarten: {
+    keywords: [ "sint", "maarten", "dutch", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\uddfd" src="1f1f8-1f1fd.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  slovakia: {
+    keywords: [ "sk", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\uddf0" src="1f1f8-1f1f0.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  slovenia: {
+    keywords: [ "si", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\uddee" src="1f1f8-1f1ee.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  solomon_islands: {
+    keywords: [ "solomon", "islands", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\udde7" src="1f1f8-1f1e7.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  somalia: {
+    keywords: [ "so", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\uddf4" src="1f1f8-1f1f4.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  south_africa: {
+    keywords: [ "south", "africa", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddff\ud83c\udde6" src="1f1ff-1f1e6.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  south_georgia_south_sandwich_islands: {
+    keywords: [ "south", "georgia", "sandwich", "islands", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\uddf8" src="1f1ec-1f1f8.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  kr: {
+    keywords: [ "south", "korea", "nation", "flag", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf0\ud83c\uddf7" src="1f1f0-1f1f7.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  south_sudan: {
+    keywords: [ "south", "sd", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\uddf8" src="1f1f8-1f1f8.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  es: {
+    keywords: [ "spain", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddea\ud83c\uddf8" src="1f1ea-1f1f8.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  sri_lanka: {
+    keywords: [ "sri", "lanka", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf1\ud83c\uddf0" src="1f1f1-1f1f0.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  sudan: {
+    keywords: [ "sd", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\udde9" src="1f1f8-1f1e9.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  suriname: {
+    keywords: [ "sr", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\uddf7" src="1f1f8-1f1f7.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  swaziland: {
+    keywords: [ "sz", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\uddff" src="1f1f8-1f1ff.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  sweden: {
+    keywords: [ "se", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\uddea" src="1f1f8-1f1ea.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  switzerland: {
+    keywords: [ "ch", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\udded" src="1f1e8-1f1ed.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  syria: {
+    keywords: [ "syrian", "arab", "republic", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\uddfe" src="1f1f8-1f1fe.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  taiwan: {
+    keywords: [ "tw", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf9\ud83c\uddfc" src="1f1f9-1f1fc.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  tajikistan: {
+    keywords: [ "tj", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf9\ud83c\uddef" src="1f1f9-1f1ef.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  tanzania: {
+    keywords: [ "tanzania,", "united", "republic", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf9\ud83c\uddff" src="1f1f9-1f1ff.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  thailand: {
+    keywords: [ "th", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf9\ud83c\udded" src="1f1f9-1f1ed.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  timor_leste: {
+    keywords: [ "timor", "leste", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf9\ud83c\uddf1" src="1f1f9-1f1f1.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  togo: {
+    keywords: [ "tg", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf9\ud83c\uddec" src="1f1f9-1f1ec.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  tokelau: {
+    keywords: [ "tk", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf9\ud83c\uddf0" src="1f1f9-1f1f0.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  tonga: {
+    keywords: [ "to", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf9\ud83c\uddf4" src="1f1f9-1f1f4.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  trinidad_tobago: {
+    keywords: [ "trinidad", "tobago", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf9\ud83c\uddf9" src="1f1f9-1f1f9.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  tunisia: {
+    keywords: [ "tn", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf9\ud83c\uddf3" src="1f1f9-1f1f3.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  tr: {
+    keywords: [ "turkey", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf9\ud83c\uddf7" src="1f1f9-1f1f7.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  turkmenistan: {
+    keywords: [ "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf9\ud83c\uddf2" src="1f1f9-1f1f2.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  turks_caicos_islands: {
+    keywords: [ "turks", "caicos", "islands", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf9\ud83c\udde8" src="1f1f9-1f1e8.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  tuvalu: {
+    keywords: [ "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf9\ud83c\uddfb" src="1f1f9-1f1fb.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  uganda: {
+    keywords: [ "ug", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfa\ud83c\uddec" src="1f1fa-1f1ec.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  ukraine: {
+    keywords: [ "ua", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfa\ud83c\udde6" src="1f1fa-1f1e6.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  united_arab_emirates: {
+    keywords: [ "united", "arab", "emirates", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde6\ud83c\uddea" src="1f1e6-1f1ea.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  uk: {
+    keywords: [ "united", "kingdom", "great", "britain", "northern", "ireland", "flag", "nation", "country", "banner", "british", "UK", "english", "england", "union jack" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\udde7" src="1f1ec-1f1e7.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  england: {
+    keywords: [ "flag", "english" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f" src="1f3f4-e0067-e0062-e0065-e006e-e0067-e007f.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  scotland: {
+    keywords: [ "flag", "scottish" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f" src="1f3f4-e0067-e0062-e0073-e0063-e0074-e007f.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  wales: {
+    keywords: [ "flag", "welsh" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f" src="1f3f4-e0067-e0062-e0077-e006c-e0073-e007f.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  us: {
+    keywords: [ "united", "states", "america", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfa\ud83c\uddf8" src="1f1fa-1f1f8.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  us_virgin_islands: {
+    keywords: [ "virgin", "islands", "us", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfb\ud83c\uddee" src="1f1fb-1f1ee.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  uruguay: {
+    keywords: [ "uy", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfa\ud83c\uddfe" src="1f1fa-1f1fe.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  uzbekistan: {
+    keywords: [ "uz", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfa\ud83c\uddff" src="1f1fa-1f1ff.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  vanuatu: {
+    keywords: [ "vu", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfb\ud83c\uddfa" src="1f1fb-1f1fa.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  vatican_city: {
+    keywords: [ "vatican", "city", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfb\ud83c\udde6" src="1f1fb-1f1e6.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  venezuela: {
+    keywords: [ "ve", "bolivarian", "republic", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfb\ud83c\uddea" src="1f1fb-1f1ea.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  vietnam: {
+    keywords: [ "viet", "nam", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfb\ud83c\uddf3" src="1f1fb-1f1f3.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  wallis_futuna: {
+    keywords: [ "wallis", "futuna", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfc\ud83c\uddeb" src="1f1fc-1f1eb.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  western_sahara: {
+    keywords: [ "western", "sahara", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddea\ud83c\udded" src="1f1ea-1f1ed.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  yemen: {
+    keywords: [ "ye", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfe\ud83c\uddea" src="1f1fe-1f1ea.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  zambia: {
+    keywords: [ "zm", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddff\ud83c\uddf2" src="1f1ff-1f1f2.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  zimbabwe: {
+    keywords: [ "zw", "flag", "nation", "country", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddff\ud83c\uddfc" src="1f1ff-1f1fc.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  united_nations: {
+    keywords: [ "un", "flag", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfa\ud83c\uddf3" src="1f1fa-1f1f3.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  pirate_flag: {
+    keywords: [ "skull", "crossbones", "flag", "banner" ],
+    char: '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udff4\u200d\u2620\ufe0f" src="1f3f4-200d-2620-fe0f.png"/>',
+    fitzpatrick_scale: false,
+    category: "flags"
+  }
+});
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/emoticons/js/emojiimages.min.js b/public/static/assets/gougu/module/tinymce/plugins/emoticons/js/emojiimages.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..a0451629e5469119a68ddf382938fcb9f156d2e5
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/emoticons/js/emojiimages.min.js
@@ -0,0 +1,3 @@
+// Source: npm package: emojilib
+// Images provided by twemoji: https://github.com/twitter/twemoji
+window.tinymce.Resource.add("tinymce.plugins.emoticons",{100:{keywords:["score","perfect","numbers","century","exam","quiz","test","pass","hundred"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcaf" src="1f4af.png"/>',fitzpatrick_scale:!1,category:"symbols"},1234:{keywords:["numbers","blue-square"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd22" src="1f522.png"/>',fitzpatrick_scale:!1,category:"symbols"},grinning:{keywords:["face","smile","happy","joy",":D","grin"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude00" src="1f600.png"/>',fitzpatrick_scale:!1,category:"people"},grimacing:{keywords:["face","grimace","teeth"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude2c" src="1f62c.png"/>',fitzpatrick_scale:!1,category:"people"},grin:{keywords:["face","happy","smile","joy","kawaii"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude01" src="1f601.png"/>',fitzpatrick_scale:!1,category:"people"},joy:{keywords:["face","cry","tears","weep","happy","happytears","haha"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude02" src="1f602.png"/>',fitzpatrick_scale:!1,category:"people"},rofl:{keywords:["face","rolling","floor","laughing","lol","haha"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd23" src="1f923.png"/>',fitzpatrick_scale:!1,category:"people"},partying:{keywords:["face","celebration","woohoo"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd73" src="1f973.png"/>',fitzpatrick_scale:!1,category:"people"},smiley:{keywords:["face","happy","joy","haha",":D",":)","smile","funny"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude03" src="1f603.png"/>',fitzpatrick_scale:!1,category:"people"},smile:{keywords:["face","happy","joy","funny","haha","laugh","like",":D",":)"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude04" src="1f604.png"/>',fitzpatrick_scale:!1,category:"people"},sweat_smile:{keywords:["face","hot","happy","laugh","sweat","smile","relief"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude05" src="1f605.png"/>',fitzpatrick_scale:!1,category:"people"},laughing:{keywords:["happy","joy","lol","satisfied","haha","face","glad","XD","laugh"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude06" src="1f606.png"/>',fitzpatrick_scale:!1,category:"people"},innocent:{keywords:["face","angel","heaven","halo"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude07" src="1f607.png"/>',fitzpatrick_scale:!1,category:"people"},wink:{keywords:["face","happy","mischievous","secret",";)","smile","eye"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude09" src="1f609.png"/>',fitzpatrick_scale:!1,category:"people"},blush:{keywords:["face","smile","happy","flushed","crush","embarrassed","shy","joy"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude0a" src="1f60a.png"/>',fitzpatrick_scale:!1,category:"people"},slightly_smiling_face:{keywords:["face","smile"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude42" src="1f642.png"/>',fitzpatrick_scale:!1,category:"people"},upside_down_face:{keywords:["face","flipped","silly","smile"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude43" src="1f643.png"/>',fitzpatrick_scale:!1,category:"people"},relaxed:{keywords:["face","blush","massage","happiness"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u263a\ufe0f" src="263a.png"/>',fitzpatrick_scale:!1,category:"people"},yum:{keywords:["happy","joy","tongue","smile","face","silly","yummy","nom","delicious","savouring"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude0b" src="1f60b.png"/>',fitzpatrick_scale:!1,category:"people"},relieved:{keywords:["face","relaxed","phew","massage","happiness"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude0c" src="1f60c.png"/>',fitzpatrick_scale:!1,category:"people"},heart_eyes:{keywords:["face","love","like","affection","valentines","infatuation","crush","heart"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude0d" src="1f60d.png"/>',fitzpatrick_scale:!1,category:"people"},smiling_face_with_three_hearts:{keywords:["face","love","like","affection","valentines","infatuation","crush","hearts","adore"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd70" src="1f970.png"/>',fitzpatrick_scale:!1,category:"people"},kissing_heart:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude18" src="1f618.png"/>',fitzpatrick_scale:!1,category:"people"},kissing:{keywords:["love","like","face","3","valentines","infatuation","kiss"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude17" src="1f617.png"/>',fitzpatrick_scale:!1,category:"people"},kissing_smiling_eyes:{keywords:["face","affection","valentines","infatuation","kiss"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude19" src="1f619.png"/>',fitzpatrick_scale:!1,category:"people"},kissing_closed_eyes:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude1a" src="1f61a.png"/>',fitzpatrick_scale:!1,category:"people"},stuck_out_tongue_winking_eye:{keywords:["face","prank","childish","playful","mischievous","smile","wink","tongue"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude1c" src="1f61c.png"/>',fitzpatrick_scale:!1,category:"people"},zany:{keywords:["face","goofy","crazy"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd2a" src="1f92a.png"/>',fitzpatrick_scale:!1,category:"people"},raised_eyebrow:{keywords:["face","distrust","scepticism","disapproval","disbelief","surprise"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd28" src="1f928.png"/>',fitzpatrick_scale:!1,category:"people"},monocle:{keywords:["face","stuffy","wealthy"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddd0" src="1f9d0.png"/>',fitzpatrick_scale:!1,category:"people"},stuck_out_tongue_closed_eyes:{keywords:["face","prank","playful","mischievous","smile","tongue"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude1d" src="1f61d.png"/>',fitzpatrick_scale:!1,category:"people"},stuck_out_tongue:{keywords:["face","prank","childish","playful","mischievous","smile","tongue"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude1b" src="1f61b.png"/>',fitzpatrick_scale:!1,category:"people"},money_mouth_face:{keywords:["face","rich","dollar","money"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd11" src="1f911.png"/>',fitzpatrick_scale:!1,category:"people"},nerd_face:{keywords:["face","nerdy","geek","dork"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd13" src="1f913.png"/>',fitzpatrick_scale:!1,category:"people"},sunglasses:{keywords:["face","cool","smile","summer","beach","sunglass"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude0e" src="1f60e.png"/>',fitzpatrick_scale:!1,category:"people"},star_struck:{keywords:["face","smile","starry","eyes","grinning"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd29" src="1f929.png"/>',fitzpatrick_scale:!1,category:"people"},clown_face:{keywords:["face"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd21" src="1f921.png"/>',fitzpatrick_scale:!1,category:"people"},cowboy_hat_face:{keywords:["face","cowgirl","hat"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd20" src="1f920.png"/>',fitzpatrick_scale:!1,category:"people"},hugs:{keywords:["face","smile","hug"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd17" src="1f917.png"/>',fitzpatrick_scale:!1,category:"people"},smirk:{keywords:["face","smile","mean","prank","smug","sarcasm"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude0f" src="1f60f.png"/>',fitzpatrick_scale:!1,category:"people"},no_mouth:{keywords:["face","hellokitty"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude36" src="1f636.png"/>',fitzpatrick_scale:!1,category:"people"},neutral_face:{keywords:["indifference","meh",":|","neutral"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude10" src="1f610.png"/>',fitzpatrick_scale:!1,category:"people"},expressionless:{keywords:["face","indifferent","-_-","meh","deadpan"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude11" src="1f611.png"/>',fitzpatrick_scale:!1,category:"people"},unamused:{keywords:["indifference","bored","straight face","serious","sarcasm","unimpressed","skeptical","dubious","side_eye"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude12" src="1f612.png"/>',fitzpatrick_scale:!1,category:"people"},roll_eyes:{keywords:["face","eyeroll","frustrated"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude44" src="1f644.png"/>',fitzpatrick_scale:!1,category:"people"},thinking:{keywords:["face","hmmm","think","consider"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd14" src="1f914.png"/>',fitzpatrick_scale:!1,category:"people"},lying_face:{keywords:["face","lie","pinocchio"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd25" src="1f925.png"/>',fitzpatrick_scale:!1,category:"people"},hand_over_mouth:{keywords:["face","whoops","shock","surprise"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd2d" src="1f92d.png"/>',fitzpatrick_scale:!1,category:"people"},shushing:{keywords:["face","quiet","shhh"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd2b" src="1f92b.png"/>',fitzpatrick_scale:!1,category:"people"},symbols_over_mouth:{keywords:["face","swearing","cursing","cussing","profanity","expletive"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd2c" src="1f92c.png"/>',fitzpatrick_scale:!1,category:"people"},exploding_head:{keywords:["face","shocked","mind","blown"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd2f" src="1f92f.png"/>',fitzpatrick_scale:!1,category:"people"},flushed:{keywords:["face","blush","shy","flattered"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude33" src="1f633.png"/>',fitzpatrick_scale:!1,category:"people"},disappointed:{keywords:["face","sad","upset","depressed",":("],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude1e" src="1f61e.png"/>',fitzpatrick_scale:!1,category:"people"},worried:{keywords:["face","concern","nervous",":("],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude1f" src="1f61f.png"/>',fitzpatrick_scale:!1,category:"people"},angry:{keywords:["mad","face","annoyed","frustrated"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude20" src="1f620.png"/>',fitzpatrick_scale:!1,category:"people"},rage:{keywords:["angry","mad","hate","despise"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude21" src="1f621.png"/>',fitzpatrick_scale:!1,category:"people"},pensive:{keywords:["face","sad","depressed","upset"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude14" src="1f614.png"/>',fitzpatrick_scale:!1,category:"people"},confused:{keywords:["face","indifference","huh","weird","hmmm",":/"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude15" src="1f615.png"/>',fitzpatrick_scale:!1,category:"people"},slightly_frowning_face:{keywords:["face","frowning","disappointed","sad","upset"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude41" src="1f641.png"/>',fitzpatrick_scale:!1,category:"people"},frowning_face:{keywords:["face","sad","upset","frown"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2639" src="2639.png"/>',fitzpatrick_scale:!1,category:"people"},persevere:{keywords:["face","sick","no","upset","oops"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude23" src="1f623.png"/>',fitzpatrick_scale:!1,category:"people"},confounded:{keywords:["face","confused","sick","unwell","oops",":S"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude16" src="1f616.png"/>',fitzpatrick_scale:!1,category:"people"},tired_face:{keywords:["sick","whine","upset","frustrated"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude2b" src="1f62b.png"/>',fitzpatrick_scale:!1,category:"people"},weary:{keywords:["face","tired","sleepy","sad","frustrated","upset"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude29" src="1f629.png"/>',fitzpatrick_scale:!1,category:"people"},pleading:{keywords:["face","begging","mercy"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd7a" src="1f97a.png"/>',fitzpatrick_scale:!1,category:"people"},triumph:{keywords:["face","gas","phew","proud","pride"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude24" src="1f624.png"/>',fitzpatrick_scale:!1,category:"people"},open_mouth:{keywords:["face","surprise","impressed","wow","whoa",":O"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude2e" src="1f62e.png"/>',fitzpatrick_scale:!1,category:"people"},scream:{keywords:["face","munch","scared","omg"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude31" src="1f631.png"/>',fitzpatrick_scale:!1,category:"people"},fearful:{keywords:["face","scared","terrified","nervous","oops","huh"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude28" src="1f628.png"/>',fitzpatrick_scale:!1,category:"people"},cold_sweat:{keywords:["face","nervous","sweat"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude30" src="1f630.png"/>',fitzpatrick_scale:!1,category:"people"},hushed:{keywords:["face","woo","shh"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude2f" src="1f62f.png"/>',fitzpatrick_scale:!1,category:"people"},frowning:{keywords:["face","aw","what"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude26" src="1f626.png"/>',fitzpatrick_scale:!1,category:"people"},anguished:{keywords:["face","stunned","nervous"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude27" src="1f627.png"/>',fitzpatrick_scale:!1,category:"people"},cry:{keywords:["face","tears","sad","depressed","upset",":'("],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude22" src="1f622.png"/>',fitzpatrick_scale:!1,category:"people"},disappointed_relieved:{keywords:["face","phew","sweat","nervous"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude25" src="1f625.png"/>',fitzpatrick_scale:!1,category:"people"},drooling_face:{keywords:["face"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd24" src="1f924.png"/>',fitzpatrick_scale:!1,category:"people"},sleepy:{keywords:["face","tired","rest","nap"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude2a" src="1f62a.png"/>',fitzpatrick_scale:!1,category:"people"},sweat:{keywords:["face","hot","sad","tired","exercise"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude13" src="1f613.png"/>',fitzpatrick_scale:!1,category:"people"},hot:{keywords:["face","feverish","heat","red","sweating"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd75" src="1f975.png"/>',fitzpatrick_scale:!1,category:"people"},cold:{keywords:["face","blue","freezing","frozen","frostbite","icicles"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd76" src="1f976.png"/>',fitzpatrick_scale:!1,category:"people"},sob:{keywords:["face","cry","tears","sad","upset","depressed"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude2d" src="1f62d.png"/>',fitzpatrick_scale:!1,category:"people"},dizzy_face:{keywords:["spent","unconscious","xox","dizzy"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude35" src="1f635.png"/>',fitzpatrick_scale:!1,category:"people"},astonished:{keywords:["face","xox","surprised","poisoned"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude32" src="1f632.png"/>',fitzpatrick_scale:!1,category:"people"},zipper_mouth_face:{keywords:["face","sealed","zipper","secret"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd10" src="1f910.png"/>',fitzpatrick_scale:!1,category:"people"},nauseated_face:{keywords:["face","vomit","gross","green","sick","throw up","ill"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd22" src="1f922.png"/>',fitzpatrick_scale:!1,category:"people"},sneezing_face:{keywords:["face","gesundheit","sneeze","sick","allergy"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd27" src="1f927.png"/>',fitzpatrick_scale:!1,category:"people"},vomiting:{keywords:["face","sick"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd2e" src="1f92e.png"/>',fitzpatrick_scale:!1,category:"people"},mask:{keywords:["face","sick","ill","disease"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude37" src="1f637.png"/>',fitzpatrick_scale:!1,category:"people"},face_with_thermometer:{keywords:["sick","temperature","thermometer","cold","fever"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd12" src="1f912.png"/>',fitzpatrick_scale:!1,category:"people"},face_with_head_bandage:{keywords:["injured","clumsy","bandage","hurt"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd15" src="1f915.png"/>',fitzpatrick_scale:!1,category:"people"},woozy:{keywords:["face","dizzy","intoxicated","tipsy","wavy"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd74" src="1f974.png"/>',fitzpatrick_scale:!1,category:"people"},sleeping:{keywords:["face","tired","sleepy","night","zzz"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude34" src="1f634.png"/>',fitzpatrick_scale:!1,category:"people"},zzz:{keywords:["sleepy","tired","dream"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udca4" src="1f4a4.png"/>',fitzpatrick_scale:!1,category:"people"},poop:{keywords:["hankey","shitface","fail","turd","shit"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udca9" src="1f4a9.png"/>',fitzpatrick_scale:!1,category:"people"},smiling_imp:{keywords:["devil","horns"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude08" src="1f608.png"/>',fitzpatrick_scale:!1,category:"people"},imp:{keywords:["devil","angry","horns"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc7f" src="1f47f.png"/>',fitzpatrick_scale:!1,category:"people"},japanese_ogre:{keywords:["monster","red","mask","halloween","scary","creepy","devil","demon","japanese","ogre"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc79" src="1f479.png"/>',fitzpatrick_scale:!1,category:"people"},japanese_goblin:{keywords:["red","evil","mask","monster","scary","creepy","japanese","goblin"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc7a" src="1f47a.png"/>',fitzpatrick_scale:!1,category:"people"},skull:{keywords:["dead","skeleton","creepy","death"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc80" src="1f480.png"/>',fitzpatrick_scale:!1,category:"people"},ghost:{keywords:["halloween","spooky","scary"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc7b" src="1f47b.png"/>',fitzpatrick_scale:!1,category:"people"},alien:{keywords:["UFO","paul","weird","outer_space"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc7d" src="1f47d.png"/>',fitzpatrick_scale:!1,category:"people"},robot:{keywords:["computer","machine","bot"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd16" src="1f916.png"/>',fitzpatrick_scale:!1,category:"people"},smiley_cat:{keywords:["animal","cats","happy","smile"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude3a" src="1f63a.png"/>',fitzpatrick_scale:!1,category:"people"},smile_cat:{keywords:["animal","cats","smile"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude38" src="1f638.png"/>',fitzpatrick_scale:!1,category:"people"},joy_cat:{keywords:["animal","cats","haha","happy","tears"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude39" src="1f639.png"/>',fitzpatrick_scale:!1,category:"people"},heart_eyes_cat:{keywords:["animal","love","like","affection","cats","valentines","heart"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude3b" src="1f63b.png"/>',fitzpatrick_scale:!1,category:"people"},smirk_cat:{keywords:["animal","cats","smirk"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude3c" src="1f63c.png"/>',fitzpatrick_scale:!1,category:"people"},kissing_cat:{keywords:["animal","cats","kiss"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude3d" src="1f63d.png"/>',fitzpatrick_scale:!1,category:"people"},scream_cat:{keywords:["animal","cats","munch","scared","scream"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude40" src="1f640.png"/>',fitzpatrick_scale:!1,category:"people"},crying_cat_face:{keywords:["animal","tears","weep","sad","cats","upset","cry"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude3f" src="1f63f.png"/>',fitzpatrick_scale:!1,category:"people"},pouting_cat:{keywords:["animal","cats"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude3e" src="1f63e.png"/>',fitzpatrick_scale:!1,category:"people"},palms_up:{keywords:["hands","gesture","cupped","prayer"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd32" src="1f932.png"/>',fitzpatrick_scale:!0,category:"people"},raised_hands:{keywords:["gesture","hooray","yea","celebration","hands"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude4c" src="1f64c.png"/>',fitzpatrick_scale:!0,category:"people"},clap:{keywords:["hands","praise","applause","congrats","yay"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc4f" src="1f44f.png"/>',fitzpatrick_scale:!0,category:"people"},wave:{keywords:["hands","gesture","goodbye","solong","farewell","hello","hi","palm"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc4b" src="1f44b.png"/>',fitzpatrick_scale:!0,category:"people"},call_me_hand:{keywords:["hands","gesture"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd19" src="1f919.png"/>',fitzpatrick_scale:!0,category:"people"},"+1":{keywords:["thumbsup","yes","awesome","good","agree","accept","cool","hand","like"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc4d" src="1f44d.png"/>',fitzpatrick_scale:!0,category:"people"},"-1":{keywords:["thumbsdown","no","dislike","hand"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc4e" src="1f44e.png"/>',fitzpatrick_scale:!0,category:"people"},facepunch:{keywords:["angry","violence","fist","hit","attack","hand"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc4a" src="1f44a.png"/>',fitzpatrick_scale:!0,category:"people"},fist:{keywords:["fingers","hand","grasp"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u270a" src="270a.png"/>',fitzpatrick_scale:!0,category:"people"},fist_left:{keywords:["hand","fistbump"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd1b" src="1f91b.png"/>',fitzpatrick_scale:!0,category:"people"},fist_right:{keywords:["hand","fistbump"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd1c" src="1f91c.png"/>',fitzpatrick_scale:!0,category:"people"},v:{keywords:["fingers","ohyeah","hand","peace","victory","two"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u270c" src="270c.png"/>',fitzpatrick_scale:!0,category:"people"},ok_hand:{keywords:["fingers","limbs","perfect","ok","okay"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc4c" src="1f44c.png"/>',fitzpatrick_scale:!0,category:"people"},raised_hand:{keywords:["fingers","stop","highfive","palm","ban"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u270b" src="270b.png"/>',fitzpatrick_scale:!0,category:"people"},raised_back_of_hand:{keywords:["fingers","raised","backhand"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd1a" src="1f91a.png"/>',fitzpatrick_scale:!0,category:"people"},open_hands:{keywords:["fingers","butterfly","hands","open"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc50" src="1f450.png"/>',fitzpatrick_scale:!0,category:"people"},muscle:{keywords:["arm","flex","hand","summer","strong","biceps"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcaa" src="1f4aa.png"/>',fitzpatrick_scale:!0,category:"people"},pray:{keywords:["please","hope","wish","namaste","highfive"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude4f" src="1f64f.png"/>',fitzpatrick_scale:!0,category:"people"},foot:{keywords:["kick","stomp"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddb6" src="1f9b6.png"/>',fitzpatrick_scale:!0,category:"people"},leg:{keywords:["kick","limb"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddb5" src="1f9b5.png"/>',fitzpatrick_scale:!0,category:"people"},handshake:{keywords:["agreement","shake"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd1d" src="1f91d.png"/>',fitzpatrick_scale:!1,category:"people"},point_up:{keywords:["hand","fingers","direction","up"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u261d" src="261d.png"/>',fitzpatrick_scale:!0,category:"people"},point_up_2:{keywords:["fingers","hand","direction","up"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc46" src="1f446.png"/>',fitzpatrick_scale:!0,category:"people"},point_down:{keywords:["fingers","hand","direction","down"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc47" src="1f447.png"/>',fitzpatrick_scale:!0,category:"people"},point_left:{keywords:["direction","fingers","hand","left"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc48" src="1f448.png"/>',fitzpatrick_scale:!0,category:"people"},point_right:{keywords:["fingers","hand","direction","right"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc49" src="1f449.png"/>',fitzpatrick_scale:!0,category:"people"},fu:{keywords:["hand","fingers","rude","middle","flipping"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd95" src="1f595.png"/>',fitzpatrick_scale:!0,category:"people"},raised_hand_with_fingers_splayed:{keywords:["hand","fingers","palm"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd90" src="1f590.png"/>',fitzpatrick_scale:!0,category:"people"},love_you:{keywords:["hand","fingers","gesture"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd1f" src="1f91f.png"/>',fitzpatrick_scale:!0,category:"people"},metal:{keywords:["hand","fingers","evil_eye","sign_of_horns","rock_on"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd18" src="1f918.png"/>',fitzpatrick_scale:!0,category:"people"},crossed_fingers:{keywords:["good","lucky"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd1e" src="1f91e.png"/>',fitzpatrick_scale:!0,category:"people"},vulcan_salute:{keywords:["hand","fingers","spock","star trek"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd96" src="1f596.png"/>',fitzpatrick_scale:!0,category:"people"},writing_hand:{keywords:["lower_left_ballpoint_pen","stationery","write","compose"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u270d" src="270d.png"/>',fitzpatrick_scale:!0,category:"people"},selfie:{keywords:["camera","phone"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd33" src="1f933.png"/>',fitzpatrick_scale:!0,category:"people"},nail_care:{keywords:["beauty","manicure","finger","fashion","nail"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc85" src="1f485.png"/>',fitzpatrick_scale:!0,category:"people"},lips:{keywords:["mouth","kiss"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc44" src="1f444.png"/>',fitzpatrick_scale:!1,category:"people"},tooth:{keywords:["teeth","dentist"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddb7" src="1f9b7.png"/>',fitzpatrick_scale:!1,category:"people"},tongue:{keywords:["mouth","playful"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc45" src="1f445.png"/>',fitzpatrick_scale:!1,category:"people"},ear:{keywords:["face","hear","sound","listen"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc42" src="1f442.png"/>',fitzpatrick_scale:!0,category:"people"},nose:{keywords:["smell","sniff"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc43" src="1f443.png"/>',fitzpatrick_scale:!0,category:"people"},eye:{keywords:["face","look","see","watch","stare"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc41" src="1f441.png"/>',fitzpatrick_scale:!1,category:"people"},eyes:{keywords:["look","watch","stalk","peek","see"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc40" src="1f440.png"/>',fitzpatrick_scale:!1,category:"people"},brain:{keywords:["smart","intelligent"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udde0" src="1f9e0.png"/>',fitzpatrick_scale:!1,category:"people"},bust_in_silhouette:{keywords:["user","person","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc64" src="1f464.png"/>',fitzpatrick_scale:!1,category:"people"},busts_in_silhouette:{keywords:["user","person","human","group","team"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc65" src="1f465.png"/>',fitzpatrick_scale:!1,category:"people"},speaking_head:{keywords:["user","person","human","sing","say","talk"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udde3" src="1f5e3.png"/>',fitzpatrick_scale:!1,category:"people"},baby:{keywords:["child","boy","girl","toddler"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc76" src="1f476.png"/>',fitzpatrick_scale:!0,category:"people"},child:{keywords:["gender-neutral","young"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddd2" src="1f9d2.png"/>',fitzpatrick_scale:!0,category:"people"},boy:{keywords:["man","male","guy","teenager"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc66" src="1f466.png"/>',fitzpatrick_scale:!0,category:"people"},girl:{keywords:["female","woman","teenager"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc67" src="1f467.png"/>',fitzpatrick_scale:!0,category:"people"},adult:{keywords:["gender-neutral","person"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddd1" src="1f9d1.png"/>',fitzpatrick_scale:!0,category:"people"},man:{keywords:["mustache","father","dad","guy","classy","sir","moustache"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68" src="1f468.png"/>',fitzpatrick_scale:!0,category:"people"},woman:{keywords:["female","girls","lady"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69" src="1f469.png"/>',fitzpatrick_scale:!0,category:"people"},blonde_woman:{keywords:["woman","female","girl","blonde","person"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc71\u200d\u2640\ufe0f" src="1f471-200d-2640-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},blonde_man:{keywords:["man","male","boy","blonde","guy","person"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc71" src="1f471.png"/>',fitzpatrick_scale:!0,category:"people"},bearded_person:{keywords:["person","bewhiskered"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddd4" src="1f9d4.png"/>',fitzpatrick_scale:!0,category:"people"},older_adult:{keywords:["human","elder","senior","gender-neutral"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddd3" src="1f9d3.png"/>',fitzpatrick_scale:!0,category:"people"},older_man:{keywords:["human","male","men","old","elder","senior"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc74" src="1f474.png"/>',fitzpatrick_scale:!0,category:"people"},older_woman:{keywords:["human","female","women","lady","old","elder","senior"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc75" src="1f475.png"/>',fitzpatrick_scale:!0,category:"people"},man_with_gua_pi_mao:{keywords:["male","boy","chinese"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc72" src="1f472.png"/>',fitzpatrick_scale:!0,category:"people"},woman_with_headscarf:{keywords:["female","hijab","mantilla","tichel"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddd5" src="1f9d5.png"/>',fitzpatrick_scale:!0,category:"people"},woman_with_turban:{keywords:["female","indian","hinduism","arabs","woman"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc73\u200d\u2640\ufe0f" src="1f473-200d-2640-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},man_with_turban:{keywords:["male","indian","hinduism","arabs"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc73" src="1f473.png"/>',fitzpatrick_scale:!0,category:"people"},policewoman:{keywords:["woman","police","law","legal","enforcement","arrest","911","female"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc6e\u200d\u2640\ufe0f" src="1f46e-200d-2640-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},policeman:{keywords:["man","police","law","legal","enforcement","arrest","911"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc6e" src="1f46e.png"/>',fitzpatrick_scale:!0,category:"people"},construction_worker_woman:{keywords:["female","human","wip","build","construction","worker","labor","woman"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc77\u200d\u2640\ufe0f" src="1f477-200d-2640-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},construction_worker_man:{keywords:["male","human","wip","guy","build","construction","worker","labor"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc77" src="1f477.png"/>',fitzpatrick_scale:!0,category:"people"},guardswoman:{keywords:["uk","gb","british","female","royal","woman"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc82\u200d\u2640\ufe0f" src="1f482-200d-2640-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},guardsman:{keywords:["uk","gb","british","male","guy","royal"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc82" src="1f482.png"/>',fitzpatrick_scale:!0,category:"people"},female_detective:{keywords:["human","spy","detective","female","woman"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd75\ufe0f\u200d\u2640\ufe0f" src="1f575-fe0f-200d-2640-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},male_detective:{keywords:["human","spy","detective"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd75" src="1f575.png"/>',fitzpatrick_scale:!0,category:"people"},woman_health_worker:{keywords:["doctor","nurse","therapist","healthcare","woman","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\u2695\ufe0f" src="1f469-200d-2695-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},man_health_worker:{keywords:["doctor","nurse","therapist","healthcare","man","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\u2695\ufe0f" src="1f468-200d-2695-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},woman_farmer:{keywords:["rancher","gardener","woman","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83c\udf3e" src="1f469-200d-1f33e.png"/>',fitzpatrick_scale:!0,category:"people"},man_farmer:{keywords:["rancher","gardener","man","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83c\udf3e" src="1f468-200d-1f33e.png"/>',fitzpatrick_scale:!0,category:"people"},woman_cook:{keywords:["chef","woman","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83c\udf73" src="1f469-200d-1f373.png"/>',fitzpatrick_scale:!0,category:"people"},man_cook:{keywords:["chef","man","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83c\udf73" src="1f468-200d-1f373.png"/>',fitzpatrick_scale:!0,category:"people"},woman_student:{keywords:["graduate","woman","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83c\udf93" src="1f469-200d-1f393.png"/>',fitzpatrick_scale:!0,category:"people"},man_student:{keywords:["graduate","man","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83c\udf93" src="1f468-200d-1f393.png"/>',fitzpatrick_scale:!0,category:"people"},woman_singer:{keywords:["rockstar","entertainer","woman","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83c\udfa4" src="1f469-200d-1f3a4.png"/>',fitzpatrick_scale:!0,category:"people"},man_singer:{keywords:["rockstar","entertainer","man","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83c\udfa4" src="1f468-200d-1f3a4.png"/>',fitzpatrick_scale:!0,category:"people"},woman_teacher:{keywords:["instructor","professor","woman","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83c\udfeb" src="1f469-200d-1f3eb.png"/>',fitzpatrick_scale:!0,category:"people"},man_teacher:{keywords:["instructor","professor","man","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83c\udfeb" src="1f468-200d-1f3eb.png"/>',fitzpatrick_scale:!0,category:"people"},woman_factory_worker:{keywords:["assembly","industrial","woman","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83c\udfed" src="1f469-200d-1f3ed.png"/>',fitzpatrick_scale:!0,category:"people"},man_factory_worker:{keywords:["assembly","industrial","man","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83c\udfed" src="1f468-200d-1f3ed.png"/>',fitzpatrick_scale:!0,category:"people"},woman_technologist:{keywords:["coder","developer","engineer","programmer","software","woman","human","laptop","computer"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83d\udcbb" src="1f469-200d-1f4bb.png"/>',fitzpatrick_scale:!0,category:"people"},man_technologist:{keywords:["coder","developer","engineer","programmer","software","man","human","laptop","computer"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udcbb" src="1f468-200d-1f4bb.png"/>',fitzpatrick_scale:!0,category:"people"},woman_office_worker:{keywords:["business","manager","woman","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83d\udcbc" src="1f469-200d-1f4bc.png"/>',fitzpatrick_scale:!0,category:"people"},man_office_worker:{keywords:["business","manager","man","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udcbc" src="1f468-200d-1f4bc.png"/>',fitzpatrick_scale:!0,category:"people"},woman_mechanic:{keywords:["plumber","woman","human","wrench"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83d\udd27" src="1f469-200d-1f527.png"/>',fitzpatrick_scale:!0,category:"people"},man_mechanic:{keywords:["plumber","man","human","wrench"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udd27" src="1f468-200d-1f527.png"/>',fitzpatrick_scale:!0,category:"people"},woman_scientist:{keywords:["biologist","chemist","engineer","physicist","woman","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83d\udd2c" src="1f469-200d-1f52c.png"/>',fitzpatrick_scale:!0,category:"people"},man_scientist:{keywords:["biologist","chemist","engineer","physicist","man","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udd2c" src="1f468-200d-1f52c.png"/>',fitzpatrick_scale:!0,category:"people"},woman_artist:{keywords:["painter","woman","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83c\udfa8" src="1f469-200d-1f3a8.png"/>',fitzpatrick_scale:!0,category:"people"},man_artist:{keywords:["painter","man","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83c\udfa8" src="1f468-200d-1f3a8.png"/>',fitzpatrick_scale:!0,category:"people"},woman_firefighter:{keywords:["fireman","woman","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83d\ude92" src="1f469-200d-1f692.png"/>',fitzpatrick_scale:!0,category:"people"},man_firefighter:{keywords:["fireman","man","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\ude92" src="1f468-200d-1f692.png"/>',fitzpatrick_scale:!0,category:"people"},woman_pilot:{keywords:["aviator","plane","woman","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\u2708\ufe0f" src="1f469-200d-2708-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},man_pilot:{keywords:["aviator","plane","man","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\u2708\ufe0f" src="1f468-200d-2708-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},woman_astronaut:{keywords:["space","rocket","woman","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83d\ude80" src="1f469-200d-1f680.png"/>',fitzpatrick_scale:!0,category:"people"},man_astronaut:{keywords:["space","rocket","man","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\ude80" src="1f468-200d-1f680.png"/>',fitzpatrick_scale:!0,category:"people"},woman_judge:{keywords:["justice","court","woman","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\u2696\ufe0f" src="1f469-200d-2696-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},man_judge:{keywords:["justice","court","man","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\u2696\ufe0f" src="1f468-200d-2696-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},woman_superhero:{keywords:["woman","female","good","heroine","superpowers"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddb8\u200d\u2640\ufe0f" src="1f9b8-200d-2640-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},man_superhero:{keywords:["man","male","good","hero","superpowers"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddb8\u200d\u2642\ufe0f" src="1f9b8-200d-2642-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},woman_supervillain:{keywords:["woman","female","evil","bad","criminal","heroine","superpowers"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddb9\u200d\u2640\ufe0f" src="1f9b9-200d-2640-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},man_supervillain:{keywords:["man","male","evil","bad","criminal","hero","superpowers"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddb9\u200d\u2642\ufe0f" src="1f9b9-200d-2642-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},mrs_claus:{keywords:["woman","female","xmas","mother christmas"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd36" src="1f936.png"/>',fitzpatrick_scale:!0,category:"people"},santa:{keywords:["festival","man","male","xmas","father christmas"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf85" src="1f385.png"/>',fitzpatrick_scale:!0,category:"people"},sorceress:{keywords:["woman","female","mage","witch"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddd9\u200d\u2640\ufe0f" src="1f9d9-200d-2640-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},wizard:{keywords:["man","male","mage","sorcerer"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddd9\u200d\u2642\ufe0f" src="1f9d9-200d-2642-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},woman_elf:{keywords:["woman","female"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udddd\u200d\u2640\ufe0f" src="1f9dd-200d-2640-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},man_elf:{keywords:["man","male"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udddd\u200d\u2642\ufe0f" src="1f9dd-200d-2642-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},woman_vampire:{keywords:["woman","female"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udddb\u200d\u2640\ufe0f" src="1f9db-200d-2640-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},man_vampire:{keywords:["man","male","dracula"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udddb\u200d\u2642\ufe0f" src="1f9db-200d-2642-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},woman_zombie:{keywords:["woman","female","undead","walking dead"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udddf\u200d\u2640\ufe0f" src="1f9df-200d-2640-fe0f.png"/>',fitzpatrick_scale:!1,category:"people"},man_zombie:{keywords:["man","male","dracula","undead","walking dead"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udddf\u200d\u2642\ufe0f" src="1f9df-200d-2642-fe0f.png"/>',fitzpatrick_scale:!1,category:"people"},woman_genie:{keywords:["woman","female"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddde\u200d\u2640\ufe0f" src="1f9de-200d-2640-fe0f.png"/>',fitzpatrick_scale:!1,category:"people"},man_genie:{keywords:["man","male"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddde\u200d\u2642\ufe0f" src="1f9de-200d-2642-fe0f.png"/>',fitzpatrick_scale:!1,category:"people"},mermaid:{keywords:["woman","female","merwoman","ariel"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udddc\u200d\u2640\ufe0f" src="1f9dc-200d-2640-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},merman:{keywords:["man","male","triton"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udddc\u200d\u2642\ufe0f" src="1f9dc-200d-2642-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},woman_fairy:{keywords:["woman","female"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddda\u200d\u2640\ufe0f" src="1f9da-200d-2640-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},man_fairy:{keywords:["man","male"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddda\u200d\u2642\ufe0f" src="1f9da-200d-2642-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},angel:{keywords:["heaven","wings","halo"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc7c" src="1f47c.png"/>',fitzpatrick_scale:!0,category:"people"},pregnant_woman:{keywords:["baby"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd30" src="1f930.png"/>',fitzpatrick_scale:!0,category:"people"},breastfeeding:{keywords:["nursing","baby"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd31" src="1f931.png"/>',fitzpatrick_scale:!0,category:"people"},princess:{keywords:["girl","woman","female","blond","crown","royal","queen"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc78" src="1f478.png"/>',fitzpatrick_scale:!0,category:"people"},prince:{keywords:["boy","man","male","crown","royal","king"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd34" src="1f934.png"/>',fitzpatrick_scale:!0,category:"people"},bride_with_veil:{keywords:["couple","marriage","wedding","woman","bride"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc70" src="1f470.png"/>',fitzpatrick_scale:!0,category:"people"},man_in_tuxedo:{keywords:["couple","marriage","wedding","groom"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd35" src="1f935.png"/>',fitzpatrick_scale:!0,category:"people"},running_woman:{keywords:["woman","walking","exercise","race","running","female"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfc3\u200d\u2640\ufe0f" src="1f3c3-200d-2640-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},running_man:{keywords:["man","walking","exercise","race","running"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfc3" src="1f3c3.png"/>',fitzpatrick_scale:!0,category:"people"},walking_woman:{keywords:["human","feet","steps","woman","female"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeb6\u200d\u2640\ufe0f" src="1f6b6-200d-2640-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},walking_man:{keywords:["human","feet","steps"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeb6" src="1f6b6.png"/>',fitzpatrick_scale:!0,category:"people"},dancer:{keywords:["female","girl","woman","fun"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc83" src="1f483.png"/>',fitzpatrick_scale:!0,category:"people"},man_dancing:{keywords:["male","boy","fun","dancer"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd7a" src="1f57a.png"/>',fitzpatrick_scale:!0,category:"people"},dancing_women:{keywords:["female","bunny","women","girls"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc6f" src="1f46f.png"/>',fitzpatrick_scale:!1,category:"people"},dancing_men:{keywords:["male","bunny","men","boys"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc6f\u200d\u2642\ufe0f" src="1f46f-200d-2642-fe0f.png"/>',fitzpatrick_scale:!1,category:"people"},couple:{keywords:["pair","people","human","love","date","dating","like","affection","valentines","marriage"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc6b" src="1f46b.png"/>',fitzpatrick_scale:!1,category:"people"},two_men_holding_hands:{keywords:["pair","couple","love","like","bromance","friendship","people","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc6c" src="1f46c.png"/>',fitzpatrick_scale:!1,category:"people"},two_women_holding_hands:{keywords:["pair","friendship","couple","love","like","female","people","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc6d" src="1f46d.png"/>',fitzpatrick_scale:!1,category:"people"},bowing_woman:{keywords:["woman","female","girl"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude47\u200d\u2640\ufe0f" src="1f647-200d-2640-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},bowing_man:{keywords:["man","male","boy"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude47" src="1f647.png"/>',fitzpatrick_scale:!0,category:"people"},man_facepalming:{keywords:["man","male","boy","disbelief"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd26\u200d\u2642\ufe0f" src="1f926-200d-2642-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},woman_facepalming:{keywords:["woman","female","girl","disbelief"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd26\u200d\u2640\ufe0f" src="1f926-200d-2640-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},woman_shrugging:{keywords:["woman","female","girl","confused","indifferent","doubt"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd37" src="1f937.png"/>',fitzpatrick_scale:!0,category:"people"},man_shrugging:{keywords:["man","male","boy","confused","indifferent","doubt"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd37\u200d\u2642\ufe0f" src="1f937-200d-2642-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},tipping_hand_woman:{keywords:["female","girl","woman","human","information"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc81" src="1f481.png"/>',fitzpatrick_scale:!0,category:"people"},tipping_hand_man:{keywords:["male","boy","man","human","information"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc81\u200d\u2642\ufe0f" src="1f481-200d-2642-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},no_good_woman:{keywords:["female","girl","woman","nope"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude45" src="1f645.png"/>',fitzpatrick_scale:!0,category:"people"},no_good_man:{keywords:["male","boy","man","nope"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude45\u200d\u2642\ufe0f" src="1f645-200d-2642-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},ok_woman:{keywords:["women","girl","female","pink","human","woman"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude46" src="1f646.png"/>',fitzpatrick_scale:!0,category:"people"},ok_man:{keywords:["men","boy","male","blue","human","man"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude46\u200d\u2642\ufe0f" src="1f646-200d-2642-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},raising_hand_woman:{keywords:["female","girl","woman"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude4b" src="1f64b.png"/>',fitzpatrick_scale:!0,category:"people"},raising_hand_man:{keywords:["male","boy","man"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude4b\u200d\u2642\ufe0f" src="1f64b-200d-2642-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},pouting_woman:{keywords:["female","girl","woman"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude4e" src="1f64e.png"/>',fitzpatrick_scale:!0,category:"people"},pouting_man:{keywords:["male","boy","man"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude4e\u200d\u2642\ufe0f" src="1f64e-200d-2642-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},frowning_woman:{keywords:["female","girl","woman","sad","depressed","discouraged","unhappy"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude4d" src="1f64d.png"/>',fitzpatrick_scale:!0,category:"people"},frowning_man:{keywords:["male","boy","man","sad","depressed","discouraged","unhappy"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude4d\u200d\u2642\ufe0f" src="1f64d-200d-2642-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},haircut_woman:{keywords:["female","girl","woman"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc87" src="1f487.png"/>',fitzpatrick_scale:!0,category:"people"},haircut_man:{keywords:["male","boy","man"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc87\u200d\u2642\ufe0f" src="1f487-200d-2642-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},massage_woman:{keywords:["female","girl","woman","head"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc86" src="1f486.png"/>',fitzpatrick_scale:!0,category:"people"},massage_man:{keywords:["male","boy","man","head"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc86\u200d\u2642\ufe0f" src="1f486-200d-2642-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},woman_in_steamy_room:{keywords:["female","woman","spa","steamroom","sauna"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddd6\u200d\u2640\ufe0f" src="1f9d6-200d-2640-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},man_in_steamy_room:{keywords:["male","man","spa","steamroom","sauna"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddd6\u200d\u2642\ufe0f" src="1f9d6-200d-2642-fe0f.png"/>',fitzpatrick_scale:!0,category:"people"},couple_with_heart_woman_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc91" src="1f491.png"/>',fitzpatrick_scale:!1,category:"people"},couple_with_heart_woman_woman:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc69" src="1f469-200d-2764-fe0f-200d-1f469.png"/>',fitzpatrick_scale:!1,category:"people"},couple_with_heart_man_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68" src="1f468-200d-2764-fe0f-200d-1f468.png"/>',fitzpatrick_scale:!1,category:"people"},couplekiss_man_woman:{keywords:["pair","valentines","love","like","dating","marriage"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc8f" src="1f48f.png"/>',fitzpatrick_scale:!1,category:"people"},couplekiss_woman_woman:{keywords:["pair","valentines","love","like","dating","marriage"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69" src="1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.png"/>',fitzpatrick_scale:!1,category:"people"},couplekiss_man_man:{keywords:["pair","valentines","love","like","dating","marriage"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68" src="1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.png"/>',fitzpatrick_scale:!1,category:"people"},family_man_woman_boy:{keywords:["home","parents","child","mom","dad","father","mother","people","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc6a" src="1f46a.png"/>',fitzpatrick_scale:!1,category:"people"},family_man_woman_girl:{keywords:["home","parents","people","human","child"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67" src="1f468-200d-1f469-200d-1f467.png"/>',fitzpatrick_scale:!1,category:"people"},family_man_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66" src="1f468-200d-1f469-200d-1f467-200d-1f466.png"/>',fitzpatrick_scale:!1,category:"people"},family_man_woman_boy_boy:{keywords:["home","parents","people","human","children"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66" src="1f468-200d-1f469-200d-1f466-200d-1f466.png"/>',fitzpatrick_scale:!1,category:"people"},family_man_woman_girl_girl:{keywords:["home","parents","people","human","children"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67" src="1f468-200d-1f469-200d-1f467-200d-1f467.png"/>',fitzpatrick_scale:!1,category:"people"},family_woman_woman_boy:{keywords:["home","parents","people","human","children"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66" src="1f469-200d-1f469-200d-1f466.png"/>',fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl:{keywords:["home","parents","people","human","children"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67" src="1f469-200d-1f469-200d-1f467.png"/>',fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66" src="1f469-200d-1f469-200d-1f467-200d-1f466.png"/>',fitzpatrick_scale:!1,category:"people"},family_woman_woman_boy_boy:{keywords:["home","parents","people","human","children"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66" src="1f469-200d-1f469-200d-1f466-200d-1f466.png"/>',fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl_girl:{keywords:["home","parents","people","human","children"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67" src="1f469-200d-1f469-200d-1f467-200d-1f467.png"/>',fitzpatrick_scale:!1,category:"people"},family_man_man_boy:{keywords:["home","parents","people","human","children"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66" src="1f468-200d-1f468-200d-1f466.png"/>',fitzpatrick_scale:!1,category:"people"},family_man_man_girl:{keywords:["home","parents","people","human","children"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67" src="1f468-200d-1f468-200d-1f467.png"/>',fitzpatrick_scale:!1,category:"people"},family_man_man_girl_boy:{keywords:["home","parents","people","human","children"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66" src="1f468-200d-1f468-200d-1f467-200d-1f466.png"/>',fitzpatrick_scale:!1,category:"people"},family_man_man_boy_boy:{keywords:["home","parents","people","human","children"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66" src="1f468-200d-1f468-200d-1f466-200d-1f466.png"/>',fitzpatrick_scale:!1,category:"people"},family_man_man_girl_girl:{keywords:["home","parents","people","human","children"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67" src="1f468-200d-1f468-200d-1f467-200d-1f467.png"/>',fitzpatrick_scale:!1,category:"people"},family_woman_boy:{keywords:["home","parent","people","human","child"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83d\udc66" src="1f469-200d-1f466.png"/>',fitzpatrick_scale:!1,category:"people"},family_woman_girl:{keywords:["home","parent","people","human","child"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83d\udc67" src="1f469-200d-1f467.png"/>',fitzpatrick_scale:!1,category:"people"},family_woman_girl_boy:{keywords:["home","parent","people","human","children"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66" src="1f469-200d-1f467-200d-1f466.png"/>',fitzpatrick_scale:!1,category:"people"},family_woman_boy_boy:{keywords:["home","parent","people","human","children"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66" src="1f469-200d-1f466-200d-1f466.png"/>',fitzpatrick_scale:!1,category:"people"},family_woman_girl_girl:{keywords:["home","parent","people","human","children"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67" src="1f469-200d-1f467-200d-1f467.png"/>',fitzpatrick_scale:!1,category:"people"},family_man_boy:{keywords:["home","parent","people","human","child"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udc66" src="1f468-200d-1f466.png"/>',fitzpatrick_scale:!1,category:"people"},family_man_girl:{keywords:["home","parent","people","human","child"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udc67" src="1f468-200d-1f467.png"/>',fitzpatrick_scale:!1,category:"people"},family_man_girl_boy:{keywords:["home","parent","people","human","children"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66" src="1f468-200d-1f467-200d-1f466.png"/>',fitzpatrick_scale:!1,category:"people"},family_man_boy_boy:{keywords:["home","parent","people","human","children"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66" src="1f468-200d-1f466-200d-1f466.png"/>',fitzpatrick_scale:!1,category:"people"},family_man_girl_girl:{keywords:["home","parent","people","human","children"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67" src="1f468-200d-1f467-200d-1f467.png"/>',fitzpatrick_scale:!1,category:"people"},yarn:{keywords:["ball","crochet","knit"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddf6" src="1f9f6.png"/>',fitzpatrick_scale:!1,category:"people"},thread:{keywords:["needle","sewing","spool","string"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddf5" src="1f9f5.png"/>',fitzpatrick_scale:!1,category:"people"},coat:{keywords:["jacket"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udde5" src="1f9e5.png"/>',fitzpatrick_scale:!1,category:"people"},labcoat:{keywords:["doctor","experiment","scientist","chemist"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd7c" src="1f97c.png"/>',fitzpatrick_scale:!1,category:"people"},womans_clothes:{keywords:["fashion","shopping_bags","female"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc5a" src="1f45a.png"/>',fitzpatrick_scale:!1,category:"people"},tshirt:{keywords:["fashion","cloth","casual","shirt","tee"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc55" src="1f455.png"/>',fitzpatrick_scale:!1,category:"people"},jeans:{keywords:["fashion","shopping"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc56" src="1f456.png"/>',fitzpatrick_scale:!1,category:"people"},necktie:{keywords:["shirt","suitup","formal","fashion","cloth","business"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc54" src="1f454.png"/>',fitzpatrick_scale:!1,category:"people"},dress:{keywords:["clothes","fashion","shopping"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc57" src="1f457.png"/>',fitzpatrick_scale:!1,category:"people"},bikini:{keywords:["swimming","female","woman","girl","fashion","beach","summer"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc59" src="1f459.png"/>',fitzpatrick_scale:!1,category:"people"},kimono:{keywords:["dress","fashion","women","female","japanese"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc58" src="1f458.png"/>',fitzpatrick_scale:!1,category:"people"},lipstick:{keywords:["female","girl","fashion","woman"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc84" src="1f484.png"/>',fitzpatrick_scale:!1,category:"people"},kiss:{keywords:["face","lips","love","like","affection","valentines"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc8b" src="1f48b.png"/>',fitzpatrick_scale:!1,category:"people"},footprints:{keywords:["feet","tracking","walking","beach"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc63" src="1f463.png"/>',fitzpatrick_scale:!1,category:"people"},flat_shoe:{keywords:["ballet","slip-on","slipper"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd7f" src="1f97f.png"/>',fitzpatrick_scale:!1,category:"people"},high_heel:{keywords:["fashion","shoes","female","pumps","stiletto"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc60" src="1f460.png"/>',fitzpatrick_scale:!1,category:"people"},sandal:{keywords:["shoes","fashion","flip flops"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc61" src="1f461.png"/>',fitzpatrick_scale:!1,category:"people"},boot:{keywords:["shoes","fashion"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc62" src="1f462.png"/>',fitzpatrick_scale:!1,category:"people"},mans_shoe:{keywords:["fashion","male"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc5e" src="1f45e.png"/>',fitzpatrick_scale:!1,category:"people"},athletic_shoe:{keywords:["shoes","sports","sneakers"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc5f" src="1f45f.png"/>',fitzpatrick_scale:!1,category:"people"},hiking_boot:{keywords:["backpacking","camping","hiking"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd7e" src="1f97e.png"/>',fitzpatrick_scale:!1,category:"people"},socks:{keywords:["stockings","clothes"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udde6" src="1f9e6.png"/>',fitzpatrick_scale:!1,category:"people"},gloves:{keywords:["hands","winter","clothes"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udde4" src="1f9e4.png"/>',fitzpatrick_scale:!1,category:"people"},scarf:{keywords:["neck","winter","clothes"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udde3" src="1f9e3.png"/>',fitzpatrick_scale:!1,category:"people"},womans_hat:{keywords:["fashion","accessories","female","lady","spring"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc52" src="1f452.png"/>',fitzpatrick_scale:!1,category:"people"},tophat:{keywords:["magic","gentleman","classy","circus"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfa9" src="1f3a9.png"/>',fitzpatrick_scale:!1,category:"people"},billed_hat:{keywords:["cap","baseball"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udde2" src="1f9e2.png"/>',fitzpatrick_scale:!1,category:"people"},rescue_worker_helmet:{keywords:["construction","build"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26d1" src="26d1.png"/>',fitzpatrick_scale:!1,category:"people"},mortar_board:{keywords:["school","college","degree","university","graduation","cap","hat","legal","learn","education"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf93" src="1f393.png"/>',fitzpatrick_scale:!1,category:"people"},crown:{keywords:["king","kod","leader","royalty","lord"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc51" src="1f451.png"/>',fitzpatrick_scale:!1,category:"people"},school_satchel:{keywords:["student","education","bag","backpack"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf92" src="1f392.png"/>',fitzpatrick_scale:!1,category:"people"},luggage:{keywords:["packing","travel"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddf3" src="1f9f3.png"/>',fitzpatrick_scale:!1,category:"people"},pouch:{keywords:["bag","accessories","shopping"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc5d" src="1f45d.png"/>',fitzpatrick_scale:!1,category:"people"},purse:{keywords:["fashion","accessories","money","sales","shopping"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc5b" src="1f45b.png"/>',fitzpatrick_scale:!1,category:"people"},handbag:{keywords:["fashion","accessory","accessories","shopping"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc5c" src="1f45c.png"/>',fitzpatrick_scale:!1,category:"people"},briefcase:{keywords:["business","documents","work","law","legal","job","career"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcbc" src="1f4bc.png"/>',fitzpatrick_scale:!1,category:"people"},eyeglasses:{keywords:["fashion","accessories","eyesight","nerdy","dork","geek"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc53" src="1f453.png"/>',fitzpatrick_scale:!1,category:"people"},dark_sunglasses:{keywords:["face","cool","accessories"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd76" src="1f576.png"/>',fitzpatrick_scale:!1,category:"people"},goggles:{keywords:["eyes","protection","safety"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd7d" src="1f97d.png"/>',fitzpatrick_scale:!1,category:"people"},ring:{keywords:["wedding","propose","marriage","valentines","diamond","fashion","jewelry","gem","engagement"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc8d" src="1f48d.png"/>',fitzpatrick_scale:!1,category:"people"},closed_umbrella:{keywords:["weather","rain","drizzle"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf02" src="1f302.png"/>',fitzpatrick_scale:!1,category:"people"},dog:{keywords:["animal","friend","nature","woof","puppy","pet","faithful"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc36" src="1f436.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},cat:{keywords:["animal","meow","nature","pet","kitten"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc31" src="1f431.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},mouse:{keywords:["animal","nature","cheese_wedge","rodent"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc2d" src="1f42d.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},hamster:{keywords:["animal","nature"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc39" src="1f439.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},rabbit:{keywords:["animal","nature","pet","spring","magic","bunny"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc30" src="1f430.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},fox_face:{keywords:["animal","nature","face"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd8a" src="1f98a.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},bear:{keywords:["animal","nature","wild"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc3b" src="1f43b.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},panda_face:{keywords:["animal","nature","panda"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc3c" src="1f43c.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},koala:{keywords:["animal","nature"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc28" src="1f428.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},tiger:{keywords:["animal","cat","danger","wild","nature","roar"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc2f" src="1f42f.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},lion:{keywords:["animal","nature"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd81" src="1f981.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},cow:{keywords:["beef","ox","animal","nature","moo","milk"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc2e" src="1f42e.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},pig:{keywords:["animal","oink","nature"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc37" src="1f437.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},pig_nose:{keywords:["animal","oink"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc3d" src="1f43d.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},frog:{keywords:["animal","nature","croak","toad"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc38" src="1f438.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},squid:{keywords:["animal","nature","ocean","sea"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd91" src="1f991.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},octopus:{keywords:["animal","creature","ocean","sea","nature","beach"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc19" src="1f419.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},shrimp:{keywords:["animal","ocean","nature","seafood"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd90" src="1f990.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},monkey_face:{keywords:["animal","nature","circus"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc35" src="1f435.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},gorilla:{keywords:["animal","nature","circus"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd8d" src="1f98d.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},see_no_evil:{keywords:["monkey","animal","nature","haha"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude48" src="1f648.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},hear_no_evil:{keywords:["animal","monkey","nature"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude49" src="1f649.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},speak_no_evil:{keywords:["monkey","animal","nature","omg"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude4a" src="1f64a.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},monkey:{keywords:["animal","nature","banana","circus"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc12" src="1f412.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},chicken:{keywords:["animal","cluck","nature","bird"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc14" src="1f414.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},penguin:{keywords:["animal","nature"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc27" src="1f427.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},bird:{keywords:["animal","nature","fly","tweet","spring"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc26" src="1f426.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},baby_chick:{keywords:["animal","chicken","bird"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc24" src="1f424.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},hatching_chick:{keywords:["animal","chicken","egg","born","baby","bird"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc23" src="1f423.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},hatched_chick:{keywords:["animal","chicken","baby","bird"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc25" src="1f425.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},duck:{keywords:["animal","nature","bird","mallard"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd86" src="1f986.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},eagle:{keywords:["animal","nature","bird"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd85" src="1f985.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},owl:{keywords:["animal","nature","bird","hoot"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd89" src="1f989.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},bat:{keywords:["animal","nature","blind","vampire"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd87" src="1f987.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},wolf:{keywords:["animal","nature","wild"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc3a" src="1f43a.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},boar:{keywords:["animal","nature"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc17" src="1f417.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},horse:{keywords:["animal","brown","nature"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc34" src="1f434.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},unicorn:{keywords:["animal","nature","mystical"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd84" src="1f984.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},honeybee:{keywords:["animal","insect","nature","bug","spring","honey"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc1d" src="1f41d.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},bug:{keywords:["animal","insect","nature","worm"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc1b" src="1f41b.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},butterfly:{keywords:["animal","insect","nature","caterpillar"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd8b" src="1f98b.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},snail:{keywords:["slow","animal","shell"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc0c" src="1f40c.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},beetle:{keywords:["animal","insect","nature","ladybug"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc1e" src="1f41e.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},ant:{keywords:["animal","insect","nature","bug"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc1c" src="1f41c.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},grasshopper:{keywords:["animal","cricket","chirp"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd97" src="1f997.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},spider:{keywords:["animal","arachnid"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd77" src="1f577.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},scorpion:{keywords:["animal","arachnid"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd82" src="1f982.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},crab:{keywords:["animal","crustacean"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd80" src="1f980.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},snake:{keywords:["animal","evil","nature","hiss","python"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc0d" src="1f40d.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},lizard:{keywords:["animal","nature","reptile"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd8e" src="1f98e.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},"t-rex":{keywords:["animal","nature","dinosaur","tyrannosaurus","extinct"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd96" src="1f996.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},sauropod:{keywords:["animal","nature","dinosaur","brachiosaurus","brontosaurus","diplodocus","extinct"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd95" src="1f995.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},turtle:{keywords:["animal","slow","nature","tortoise"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc22" src="1f422.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},tropical_fish:{keywords:["animal","swim","ocean","beach","nemo"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc20" src="1f420.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},fish:{keywords:["animal","food","nature"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc1f" src="1f41f.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},blowfish:{keywords:["animal","nature","food","sea","ocean"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc21" src="1f421.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},dolphin:{keywords:["animal","nature","fish","sea","ocean","flipper","fins","beach"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc2c" src="1f42c.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},shark:{keywords:["animal","nature","fish","sea","ocean","jaws","fins","beach"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd88" src="1f988.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},whale:{keywords:["animal","nature","sea","ocean"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc33" src="1f433.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},whale2:{keywords:["animal","nature","sea","ocean"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc0b" src="1f40b.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},crocodile:{keywords:["animal","nature","reptile","lizard","alligator"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc0a" src="1f40a.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},leopard:{keywords:["animal","nature"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc06" src="1f406.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},zebra:{keywords:["animal","nature","stripes","safari"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd93" src="1f993.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},tiger2:{keywords:["animal","nature","roar"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc05" src="1f405.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},water_buffalo:{keywords:["animal","nature","ox","cow"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc03" src="1f403.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},ox:{keywords:["animal","cow","beef"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc02" src="1f402.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},cow2:{keywords:["beef","ox","animal","nature","moo","milk"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc04" src="1f404.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},deer:{keywords:["animal","nature","horns","venison"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd8c" src="1f98c.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},dromedary_camel:{keywords:["animal","hot","desert","hump"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc2a" src="1f42a.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},camel:{keywords:["animal","nature","hot","desert","hump"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc2b" src="1f42b.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},giraffe:{keywords:["animal","nature","spots","safari"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd92" src="1f992.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},elephant:{keywords:["animal","nature","nose","th","circus"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc18" src="1f418.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},rhinoceros:{keywords:["animal","nature","horn"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd8f" src="1f98f.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},goat:{keywords:["animal","nature"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc10" src="1f410.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},ram:{keywords:["animal","sheep","nature"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc0f" src="1f40f.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},sheep:{keywords:["animal","nature","wool","shipit"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc11" src="1f411.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},racehorse:{keywords:["animal","gamble","luck"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc0e" src="1f40e.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},pig2:{keywords:["animal","nature"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc16" src="1f416.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},rat:{keywords:["animal","mouse","rodent"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc00" src="1f400.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},mouse2:{keywords:["animal","nature","rodent"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc01" src="1f401.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},rooster:{keywords:["animal","nature","chicken"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc13" src="1f413.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},turkey:{keywords:["animal","bird"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd83" src="1f983.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},dove:{keywords:["animal","bird"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd4a" src="1f54a.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},dog2:{keywords:["animal","nature","friend","doge","pet","faithful"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc15" src="1f415.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},poodle:{keywords:["dog","animal","101","nature","pet"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc29" src="1f429.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},cat2:{keywords:["animal","meow","pet","cats"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc08" src="1f408.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},rabbit2:{keywords:["animal","nature","pet","magic","spring"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc07" src="1f407.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},chipmunk:{keywords:["animal","nature","rodent","squirrel"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc3f" src="1f43f.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},hedgehog:{keywords:["animal","nature","spiny"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd94" src="1f994.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},raccoon:{keywords:["animal","nature"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd9d" src="1f99d.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},llama:{keywords:["animal","nature","alpaca"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd99" src="1f999.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},hippopotamus:{keywords:["animal","nature"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd9b" src="1f99b.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},kangaroo:{keywords:["animal","nature","australia","joey","hop","marsupial"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd98" src="1f998.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},badger:{keywords:["animal","nature","honey"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udda1" src="1f9a1.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},swan:{keywords:["animal","nature","bird"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udda2" src="1f9a2.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},peacock:{keywords:["animal","nature","peahen","bird"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd9a" src="1f99a.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},parrot:{keywords:["animal","nature","bird","pirate","talk"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd9c" src="1f99c.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},lobster:{keywords:["animal","nature","bisque","claws","seafood"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd9e" src="1f99e.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},mosquito:{keywords:["animal","nature","insect","malaria"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd9f" src="1f99f.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},paw_prints:{keywords:["animal","tracking","footprints","dog","cat","pet","feet"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc3e" src="1f43e.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},dragon:{keywords:["animal","myth","nature","chinese","green"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc09" src="1f409.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},dragon_face:{keywords:["animal","myth","nature","chinese","green"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc32" src="1f432.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},cactus:{keywords:["vegetable","plant","nature"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf35" src="1f335.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},christmas_tree:{keywords:["festival","vacation","december","xmas","celebration"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf84" src="1f384.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},evergreen_tree:{keywords:["plant","nature"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf32" src="1f332.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},deciduous_tree:{keywords:["plant","nature"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf33" src="1f333.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},palm_tree:{keywords:["plant","vegetable","nature","summer","beach","mojito","tropical"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf34" src="1f334.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},seedling:{keywords:["plant","nature","grass","lawn","spring"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf31" src="1f331.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},herb:{keywords:["vegetable","plant","medicine","weed","grass","lawn"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf3f" src="1f33f.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},shamrock:{keywords:["vegetable","plant","nature","irish","clover"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2618" src="2618.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},four_leaf_clover:{keywords:["vegetable","plant","nature","lucky","irish"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf40" src="1f340.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},bamboo:{keywords:["plant","nature","vegetable","panda","pine_decoration"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf8d" src="1f38d.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},tanabata_tree:{keywords:["plant","nature","branch","summer"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf8b" src="1f38b.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},leaves:{keywords:["nature","plant","tree","vegetable","grass","lawn","spring"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf43" src="1f343.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},fallen_leaf:{keywords:["nature","plant","vegetable","leaves"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf42" src="1f342.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},maple_leaf:{keywords:["nature","plant","vegetable","ca","fall"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf41" src="1f341.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},ear_of_rice:{keywords:["nature","plant"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf3e" src="1f33e.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},hibiscus:{keywords:["plant","vegetable","flowers","beach"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf3a" src="1f33a.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},sunflower:{keywords:["nature","plant","fall"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf3b" src="1f33b.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},rose:{keywords:["flowers","valentines","love","spring"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf39" src="1f339.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},wilted_flower:{keywords:["plant","nature","flower"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd40" src="1f940.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},tulip:{keywords:["flowers","plant","nature","summer","spring"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf37" src="1f337.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},blossom:{keywords:["nature","flowers","yellow"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf3c" src="1f33c.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},cherry_blossom:{keywords:["nature","plant","spring","flower"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf38" src="1f338.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},bouquet:{keywords:["flowers","nature","spring"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc90" src="1f490.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},mushroom:{keywords:["plant","vegetable"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf44" src="1f344.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},chestnut:{keywords:["food","squirrel"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf30" src="1f330.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},jack_o_lantern:{keywords:["halloween","light","pumpkin","creepy","fall"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf83" src="1f383.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},shell:{keywords:["nature","sea","beach"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc1a" src="1f41a.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},spider_web:{keywords:["animal","insect","arachnid","silk"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd78" src="1f578.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},earth_americas:{keywords:["globe","world","USA","international"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf0e" src="1f30e.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},earth_africa:{keywords:["globe","world","international"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf0d" src="1f30d.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},earth_asia:{keywords:["globe","world","east","international"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf0f" src="1f30f.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},full_moon:{keywords:["nature","yellow","twilight","planet","space","night","evening","sleep"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf15" src="1f315.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},waning_gibbous_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep","waxing_gibbous_moon"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf16" src="1f316.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},last_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf17" src="1f317.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},waning_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf18" src="1f318.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},new_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf11" src="1f311.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},waxing_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf12" src="1f312.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},first_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf13" src="1f313.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},waxing_gibbous_moon:{keywords:["nature","night","sky","gray","twilight","planet","space","evening","sleep"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf14" src="1f314.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},new_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf1a" src="1f31a.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},full_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf1d" src="1f31d.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},first_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf1b" src="1f31b.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},last_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf1c" src="1f31c.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},sun_with_face:{keywords:["nature","morning","sky"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf1e" src="1f31e.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},crescent_moon:{keywords:["night","sleep","sky","evening","magic"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf19" src="1f319.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},star:{keywords:["night","yellow"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2b50" src="2b50.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},star2:{keywords:["night","sparkle","awesome","good","magic"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf1f" src="1f31f.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},dizzy:{keywords:["star","sparkle","shoot","magic"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcab" src="1f4ab.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},sparkles:{keywords:["stars","shine","shiny","cool","awesome","good","magic"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2728" src="2728.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},comet:{keywords:["space"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2604" src="2604.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},sunny:{keywords:["weather","nature","brightness","summer","beach","spring"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2600\ufe0f" src="2600.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_small_cloud:{keywords:["weather"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf24" src="1f324.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},partly_sunny:{keywords:["weather","nature","cloudy","morning","fall","spring"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26c5" src="26c5.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_large_cloud:{keywords:["weather"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf25" src="1f325.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_rain_cloud:{keywords:["weather"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf26" src="1f326.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud:{keywords:["weather","sky"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2601\ufe0f" src="2601.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_rain:{keywords:["weather"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf27" src="1f327.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_lightning_and_rain:{keywords:["weather","lightning"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26c8" src="26c8.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_lightning:{keywords:["weather","thunder"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf29" src="1f329.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},zap:{keywords:["thunder","weather","lightning bolt","fast"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26a1" src="26a1.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},fire:{keywords:["hot","cook","flame"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd25" src="1f525.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},boom:{keywords:["bomb","explode","explosion","collision","blown"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udca5" src="1f4a5.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},snowflake:{keywords:["winter","season","cold","weather","christmas","xmas"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2744\ufe0f" src="2744.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_snow:{keywords:["weather"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf28" src="1f328.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},snowman:{keywords:["winter","season","cold","weather","christmas","xmas","frozen","without_snow"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26c4" src="26c4.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},snowman_with_snow:{keywords:["winter","season","cold","weather","christmas","xmas","frozen"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2603" src="2603.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},wind_face:{keywords:["gust","air"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf2c" src="1f32c.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},dash:{keywords:["wind","air","fast","shoo","fart","smoke","puff"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udca8" src="1f4a8.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},tornado:{keywords:["weather","cyclone","twister"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf2a" src="1f32a.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},fog:{keywords:["weather"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf2b" src="1f32b.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},open_umbrella:{keywords:["weather","spring"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2602" src="2602.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},umbrella:{keywords:["rainy","weather","spring"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2614" src="2614.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},droplet:{keywords:["water","drip","faucet","spring"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udca7" src="1f4a7.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},sweat_drops:{keywords:["water","drip","oops"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udca6" src="1f4a6.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},ocean:{keywords:["sea","water","wave","nature","tsunami","disaster"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf0a" src="1f30a.png"/>',fitzpatrick_scale:!1,category:"animals_and_nature"},green_apple:{keywords:["fruit","nature"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf4f" src="1f34f.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},apple:{keywords:["fruit","mac","school"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf4e" src="1f34e.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},pear:{keywords:["fruit","nature","food"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf50" src="1f350.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},tangerine:{keywords:["food","fruit","nature","orange"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf4a" src="1f34a.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},lemon:{keywords:["fruit","nature"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf4b" src="1f34b.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},banana:{keywords:["fruit","food","monkey"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf4c" src="1f34c.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},watermelon:{keywords:["fruit","food","picnic","summer"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf49" src="1f349.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},grapes:{keywords:["fruit","food","wine"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf47" src="1f347.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},strawberry:{keywords:["fruit","food","nature"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf53" src="1f353.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},melon:{keywords:["fruit","nature","food"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf48" src="1f348.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},cherries:{keywords:["food","fruit"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf52" src="1f352.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},peach:{keywords:["fruit","nature","food"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf51" src="1f351.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},pineapple:{keywords:["fruit","nature","food"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf4d" src="1f34d.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},coconut:{keywords:["fruit","nature","food","palm"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd65" src="1f965.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},kiwi_fruit:{keywords:["fruit","food"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd5d" src="1f95d.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},mango:{keywords:["fruit","food","tropical"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd6d" src="1f96d.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},avocado:{keywords:["fruit","food"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd51" src="1f951.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},broccoli:{keywords:["fruit","food","vegetable"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd66" src="1f966.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},tomato:{keywords:["fruit","vegetable","nature","food"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf45" src="1f345.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},eggplant:{keywords:["vegetable","nature","food","aubergine"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf46" src="1f346.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},cucumber:{keywords:["fruit","food","pickle"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd52" src="1f952.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},carrot:{keywords:["vegetable","food","orange"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd55" src="1f955.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},hot_pepper:{keywords:["food","spicy","chilli","chili"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf36" src="1f336.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},potato:{keywords:["food","tuber","vegatable","starch"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd54" src="1f954.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},corn:{keywords:["food","vegetable","plant"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf3d" src="1f33d.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},leafy_greens:{keywords:["food","vegetable","plant","bok choy","cabbage","kale","lettuce"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd6c" src="1f96c.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},sweet_potato:{keywords:["food","nature"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf60" src="1f360.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},peanuts:{keywords:["food","nut"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd5c" src="1f95c.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},honey_pot:{keywords:["bees","sweet","kitchen"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf6f" src="1f36f.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},croissant:{keywords:["food","bread","french"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd50" src="1f950.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},bread:{keywords:["food","wheat","breakfast","toast"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf5e" src="1f35e.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},baguette_bread:{keywords:["food","bread","french"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd56" src="1f956.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},bagel:{keywords:["food","bread","bakery","schmear"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd6f" src="1f96f.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},pretzel:{keywords:["food","bread","twisted"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd68" src="1f968.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},cheese:{keywords:["food","chadder"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddc0" src="1f9c0.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},egg:{keywords:["food","chicken","breakfast"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd5a" src="1f95a.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},bacon:{keywords:["food","breakfast","pork","pig","meat"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd53" src="1f953.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},steak:{keywords:["food","cow","meat","cut","chop","lambchop","porkchop"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd69" src="1f969.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},pancakes:{keywords:["food","breakfast","flapjacks","hotcakes"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd5e" src="1f95e.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},poultry_leg:{keywords:["food","meat","drumstick","bird","chicken","turkey"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf57" src="1f357.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},meat_on_bone:{keywords:["good","food","drumstick"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf56" src="1f356.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},bone:{keywords:["skeleton"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddb4" src="1f9b4.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},fried_shrimp:{keywords:["food","animal","appetizer","summer"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf64" src="1f364.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},fried_egg:{keywords:["food","breakfast","kitchen","egg"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf73" src="1f373.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},hamburger:{keywords:["meat","fast food","beef","cheeseburger","mcdonalds","burger king"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf54" src="1f354.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},fries:{keywords:["chips","snack","fast food"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf5f" src="1f35f.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},stuffed_flatbread:{keywords:["food","flatbread","stuffed","gyro"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd59" src="1f959.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},hotdog:{keywords:["food","frankfurter"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf2d" src="1f32d.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},pizza:{keywords:["food","party"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf55" src="1f355.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},sandwich:{keywords:["food","lunch","bread"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd6a" src="1f96a.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},canned_food:{keywords:["food","soup"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd6b" src="1f96b.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},spaghetti:{keywords:["food","italian","noodle"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf5d" src="1f35d.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},taco:{keywords:["food","mexican"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf2e" src="1f32e.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},burrito:{keywords:["food","mexican"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf2f" src="1f32f.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},green_salad:{keywords:["food","healthy","lettuce"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd57" src="1f957.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},shallow_pan_of_food:{keywords:["food","cooking","casserole","paella"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd58" src="1f958.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},ramen:{keywords:["food","japanese","noodle","chopsticks"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf5c" src="1f35c.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},stew:{keywords:["food","meat","soup"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf72" src="1f372.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},fish_cake:{keywords:["food","japan","sea","beach","narutomaki","pink","swirl","kamaboko","surimi","ramen"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf65" src="1f365.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},fortune_cookie:{keywords:["food","prophecy"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd60" src="1f960.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},sushi:{keywords:["food","fish","japanese","rice"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf63" src="1f363.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},bento:{keywords:["food","japanese","box"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf71" src="1f371.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},curry:{keywords:["food","spicy","hot","indian"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf5b" src="1f35b.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},rice_ball:{keywords:["food","japanese"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf59" src="1f359.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},rice:{keywords:["food","china","asian"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf5a" src="1f35a.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},rice_cracker:{keywords:["food","japanese"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf58" src="1f358.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},oden:{keywords:["food","japanese"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf62" src="1f362.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},dango:{keywords:["food","dessert","sweet","japanese","barbecue","meat"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf61" src="1f361.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},shaved_ice:{keywords:["hot","dessert","summer"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf67" src="1f367.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},ice_cream:{keywords:["food","hot","dessert"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf68" src="1f368.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},icecream:{keywords:["food","hot","dessert","summer"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf66" src="1f366.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},pie:{keywords:["food","dessert","pastry"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd67" src="1f967.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},cake:{keywords:["food","dessert"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf70" src="1f370.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},cupcake:{keywords:["food","dessert","bakery","sweet"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddc1" src="1f9c1.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},moon_cake:{keywords:["food","autumn"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd6e" src="1f96e.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},birthday:{keywords:["food","dessert","cake"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf82" src="1f382.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},custard:{keywords:["dessert","food"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf6e" src="1f36e.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},candy:{keywords:["snack","dessert","sweet","lolly"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf6c" src="1f36c.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},lollipop:{keywords:["food","snack","candy","sweet"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf6d" src="1f36d.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},chocolate_bar:{keywords:["food","snack","dessert","sweet"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf6b" src="1f36b.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},popcorn:{keywords:["food","movie theater","films","snack"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf7f" src="1f37f.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},dumpling:{keywords:["food","empanada","pierogi","potsticker"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd5f" src="1f95f.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},doughnut:{keywords:["food","dessert","snack","sweet","donut"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf69" src="1f369.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},cookie:{keywords:["food","snack","oreo","chocolate","sweet","dessert"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf6a" src="1f36a.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},milk_glass:{keywords:["beverage","drink","cow"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd5b" src="1f95b.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},beer:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf7a" src="1f37a.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},beers:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf7b" src="1f37b.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},clinking_glasses:{keywords:["beverage","drink","party","alcohol","celebrate","cheers","wine","champagne","toast"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd42" src="1f942.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},wine_glass:{keywords:["drink","beverage","drunk","alcohol","booze"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf77" src="1f377.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},tumbler_glass:{keywords:["drink","beverage","drunk","alcohol","liquor","booze","bourbon","scotch","whisky","glass","shot"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd43" src="1f943.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},cocktail:{keywords:["drink","drunk","alcohol","beverage","booze","mojito"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf78" src="1f378.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},tropical_drink:{keywords:["beverage","cocktail","summer","beach","alcohol","booze","mojito"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf79" src="1f379.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},champagne:{keywords:["drink","wine","bottle","celebration"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf7e" src="1f37e.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},sake:{keywords:["wine","drink","drunk","beverage","japanese","alcohol","booze"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf76" src="1f376.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},tea:{keywords:["drink","bowl","breakfast","green","british"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf75" src="1f375.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},cup_with_straw:{keywords:["drink","soda"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd64" src="1f964.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},coffee:{keywords:["beverage","caffeine","latte","espresso"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2615" src="2615.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},baby_bottle:{keywords:["food","container","milk"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf7c" src="1f37c.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},salt:{keywords:["condiment","shaker"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddc2" src="1f9c2.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},spoon:{keywords:["cutlery","kitchen","tableware"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd44" src="1f944.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},fork_and_knife:{keywords:["cutlery","kitchen"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf74" src="1f374.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},plate_with_cutlery:{keywords:["food","eat","meal","lunch","dinner","restaurant"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf7d" src="1f37d.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},bowl_with_spoon:{keywords:["food","breakfast","cereal","oatmeal","porridge"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd63" src="1f963.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},takeout_box:{keywords:["food","leftovers"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd61" src="1f961.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},chopsticks:{keywords:["food"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd62" src="1f962.png"/>',fitzpatrick_scale:!1,category:"food_and_drink"},soccer:{keywords:["sports","football"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26bd" src="26bd.png"/>',fitzpatrick_scale:!1,category:"activity"},basketball:{keywords:["sports","balls","NBA"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfc0" src="1f3c0.png"/>',fitzpatrick_scale:!1,category:"activity"},football:{keywords:["sports","balls","NFL"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfc8" src="1f3c8.png"/>',fitzpatrick_scale:!1,category:"activity"},baseball:{keywords:["sports","balls"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26be" src="26be.png"/>',fitzpatrick_scale:!1,category:"activity"},softball:{keywords:["sports","balls"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd4e" src="1f94e.png"/>',fitzpatrick_scale:!1,category:"activity"},tennis:{keywords:["sports","balls","green"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfbe" src="1f3be.png"/>',fitzpatrick_scale:!1,category:"activity"},volleyball:{keywords:["sports","balls"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfd0" src="1f3d0.png"/>',fitzpatrick_scale:!1,category:"activity"},rugby_football:{keywords:["sports","team"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfc9" src="1f3c9.png"/>',fitzpatrick_scale:!1,category:"activity"},flying_disc:{keywords:["sports","frisbee","ultimate"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd4f" src="1f94f.png"/>',fitzpatrick_scale:!1,category:"activity"},"8ball":{keywords:["pool","hobby","game","luck","magic"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfb1" src="1f3b1.png"/>',fitzpatrick_scale:!1,category:"activity"},golf:{keywords:["sports","business","flag","hole","summer"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26f3" src="26f3.png"/>',fitzpatrick_scale:!1,category:"activity"},golfing_woman:{keywords:["sports","business","woman","female"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfcc\ufe0f\u200d\u2640\ufe0f" src="1f3cc-fe0f-200d-2640-fe0f.png"/>',fitzpatrick_scale:!1,category:"activity"},golfing_man:{keywords:["sports","business"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfcc" src="1f3cc.png"/>',fitzpatrick_scale:!0,category:"activity"},ping_pong:{keywords:["sports","pingpong"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfd3" src="1f3d3.png"/>',fitzpatrick_scale:!1,category:"activity"},badminton:{keywords:["sports"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udff8" src="1f3f8.png"/>',fitzpatrick_scale:!1,category:"activity"},goal_net:{keywords:["sports"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd45" src="1f945.png"/>',fitzpatrick_scale:!1,category:"activity"},ice_hockey:{keywords:["sports"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfd2" src="1f3d2.png"/>',fitzpatrick_scale:!1,category:"activity"},field_hockey:{keywords:["sports"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfd1" src="1f3d1.png"/>',fitzpatrick_scale:!1,category:"activity"},lacrosse:{keywords:["sports","ball","stick"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd4d" src="1f94d.png"/>',fitzpatrick_scale:!1,category:"activity"},cricket:{keywords:["sports"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfcf" src="1f3cf.png"/>',fitzpatrick_scale:!1,category:"activity"},ski:{keywords:["sports","winter","cold","snow"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfbf" src="1f3bf.png"/>',fitzpatrick_scale:!1,category:"activity"},skier:{keywords:["sports","winter","snow"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26f7" src="26f7.png"/>',fitzpatrick_scale:!1,category:"activity"},snowboarder:{keywords:["sports","winter"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfc2" src="1f3c2.png"/>',fitzpatrick_scale:!0,category:"activity"},person_fencing:{keywords:["sports","fencing","sword"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd3a" src="1f93a.png"/>',fitzpatrick_scale:!1,category:"activity"},women_wrestling:{keywords:["sports","wrestlers"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd3c\u200d\u2640\ufe0f" src="1f93c-200d-2640-fe0f.png"/>',fitzpatrick_scale:!1,category:"activity"},men_wrestling:{keywords:["sports","wrestlers"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd3c\u200d\u2642\ufe0f" src="1f93c-200d-2642-fe0f.png"/>',fitzpatrick_scale:!1,category:"activity"},woman_cartwheeling:{keywords:["gymnastics"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd38\u200d\u2640\ufe0f" src="1f938-200d-2640-fe0f.png"/>',fitzpatrick_scale:!0,category:"activity"},man_cartwheeling:{keywords:["gymnastics"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd38\u200d\u2642\ufe0f" src="1f938-200d-2642-fe0f.png"/>',fitzpatrick_scale:!0,category:"activity"},woman_playing_handball:{keywords:["sports"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd3e\u200d\u2640\ufe0f" src="1f93e-200d-2640-fe0f.png"/>',fitzpatrick_scale:!0,category:"activity"},man_playing_handball:{keywords:["sports"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd3e\u200d\u2642\ufe0f" src="1f93e-200d-2642-fe0f.png"/>',fitzpatrick_scale:!0,category:"activity"},ice_skate:{keywords:["sports"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26f8" src="26f8.png"/>',fitzpatrick_scale:!1,category:"activity"},curling_stone:{keywords:["sports"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd4c" src="1f94c.png"/>',fitzpatrick_scale:!1,category:"activity"},skateboard:{keywords:["board"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udef9" src="1f6f9.png"/>',fitzpatrick_scale:!1,category:"activity"},sled:{keywords:["sleigh","luge","toboggan"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udef7" src="1f6f7.png"/>',fitzpatrick_scale:!1,category:"activity"},bow_and_arrow:{keywords:["sports"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udff9" src="1f3f9.png"/>',fitzpatrick_scale:!1,category:"activity"},fishing_pole_and_fish:{keywords:["food","hobby","summer"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfa3" src="1f3a3.png"/>',fitzpatrick_scale:!1,category:"activity"},boxing_glove:{keywords:["sports","fighting"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd4a" src="1f94a.png"/>',fitzpatrick_scale:!1,category:"activity"},martial_arts_uniform:{keywords:["judo","karate","taekwondo"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd4b" src="1f94b.png"/>',fitzpatrick_scale:!1,category:"activity"},rowing_woman:{keywords:["sports","hobby","water","ship","woman","female"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udea3\u200d\u2640\ufe0f" src="1f6a3-200d-2640-fe0f.png"/>',fitzpatrick_scale:!0,category:"activity"},rowing_man:{keywords:["sports","hobby","water","ship"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udea3" src="1f6a3.png"/>',fitzpatrick_scale:!0,category:"activity"},climbing_woman:{keywords:["sports","hobby","woman","female","rock"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddd7\u200d\u2640\ufe0f" src="1f9d7-200d-2640-fe0f.png"/>',fitzpatrick_scale:!0,category:"activity"},climbing_man:{keywords:["sports","hobby","man","male","rock"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddd7\u200d\u2642\ufe0f" src="1f9d7-200d-2642-fe0f.png"/>',fitzpatrick_scale:!0,category:"activity"},swimming_woman:{keywords:["sports","exercise","human","athlete","water","summer","woman","female"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfca\u200d\u2640\ufe0f" src="1f3ca-200d-2640-fe0f.png"/>',fitzpatrick_scale:!0,category:"activity"},swimming_man:{keywords:["sports","exercise","human","athlete","water","summer"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfca" src="1f3ca.png"/>',fitzpatrick_scale:!0,category:"activity"},woman_playing_water_polo:{keywords:["sports","pool"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd3d\u200d\u2640\ufe0f" src="1f93d-200d-2640-fe0f.png"/>',fitzpatrick_scale:!0,category:"activity"},man_playing_water_polo:{keywords:["sports","pool"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd3d\u200d\u2642\ufe0f" src="1f93d-200d-2642-fe0f.png"/>',fitzpatrick_scale:!0,category:"activity"},woman_in_lotus_position:{keywords:["woman","female","meditation","yoga","serenity","zen","mindfulness"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddd8\u200d\u2640\ufe0f" src="1f9d8-200d-2640-fe0f.png"/>',fitzpatrick_scale:!0,category:"activity"},man_in_lotus_position:{keywords:["man","male","meditation","yoga","serenity","zen","mindfulness"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddd8\u200d\u2642\ufe0f" src="1f9d8-200d-2642-fe0f.png"/>',fitzpatrick_scale:!0,category:"activity"},surfing_woman:{keywords:["sports","ocean","sea","summer","beach","woman","female"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfc4\u200d\u2640\ufe0f" src="1f3c4-200d-2640-fe0f.png"/>',fitzpatrick_scale:!0,category:"activity"},surfing_man:{keywords:["sports","ocean","sea","summer","beach"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfc4" src="1f3c4.png"/>',fitzpatrick_scale:!0,category:"activity"},bath:{keywords:["clean","shower","bathroom"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udec0" src="1f6c0.png"/>',fitzpatrick_scale:!0,category:"activity"},basketball_woman:{keywords:["sports","human","woman","female"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26f9\ufe0f\u200d\u2640\ufe0f" src="26f9-fe0f-200d-2640-fe0f.png"/>',fitzpatrick_scale:!0,category:"activity"},basketball_man:{keywords:["sports","human"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26f9" src="26f9.png"/>',fitzpatrick_scale:!0,category:"activity"},weight_lifting_woman:{keywords:["sports","training","exercise","woman","female"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfcb\ufe0f\u200d\u2640\ufe0f" src="1f3cb-fe0f-200d-2640-fe0f.png"/>',fitzpatrick_scale:!0,category:"activity"},weight_lifting_man:{keywords:["sports","training","exercise"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfcb" src="1f3cb.png"/>',fitzpatrick_scale:!0,category:"activity"},biking_woman:{keywords:["sports","bike","exercise","hipster","woman","female"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeb4\u200d\u2640\ufe0f" src="1f6b4-200d-2640-fe0f.png"/>',fitzpatrick_scale:!0,category:"activity"},biking_man:{keywords:["sports","bike","exercise","hipster"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeb4" src="1f6b4.png"/>',fitzpatrick_scale:!0,category:"activity"},mountain_biking_woman:{keywords:["transportation","sports","human","race","bike","woman","female"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeb5\u200d\u2640\ufe0f" src="1f6b5-200d-2640-fe0f.png"/>',fitzpatrick_scale:!0,category:"activity"},mountain_biking_man:{keywords:["transportation","sports","human","race","bike"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeb5" src="1f6b5.png"/>',fitzpatrick_scale:!0,category:"activity"},horse_racing:{keywords:["animal","betting","competition","gambling","luck"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfc7" src="1f3c7.png"/>',fitzpatrick_scale:!0,category:"activity"},business_suit_levitating:{keywords:["suit","business","levitate","hover","jump"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd74" src="1f574.png"/>',fitzpatrick_scale:!0,category:"activity"},trophy:{keywords:["win","award","contest","place","ftw","ceremony"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfc6" src="1f3c6.png"/>',fitzpatrick_scale:!1,category:"activity"},running_shirt_with_sash:{keywords:["play","pageant"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfbd" src="1f3bd.png"/>',fitzpatrick_scale:!1,category:"activity"},medal_sports:{keywords:["award","winning"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfc5" src="1f3c5.png"/>',fitzpatrick_scale:!1,category:"activity"},medal_military:{keywords:["award","winning","army"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf96" src="1f396.png"/>',fitzpatrick_scale:!1,category:"activity"},"1st_place_medal":{keywords:["award","winning","first"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd47" src="1f947.png"/>',fitzpatrick_scale:!1,category:"activity"},"2nd_place_medal":{keywords:["award","second"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd48" src="1f948.png"/>',fitzpatrick_scale:!1,category:"activity"},"3rd_place_medal":{keywords:["award","third"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd49" src="1f949.png"/>',fitzpatrick_scale:!1,category:"activity"},reminder_ribbon:{keywords:["sports","cause","support","awareness"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf97" src="1f397.png"/>',fitzpatrick_scale:!1,category:"activity"},rosette:{keywords:["flower","decoration","military"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udff5" src="1f3f5.png"/>',fitzpatrick_scale:!1,category:"activity"},ticket:{keywords:["event","concert","pass"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfab" src="1f3ab.png"/>',fitzpatrick_scale:!1,category:"activity"},tickets:{keywords:["sports","concert","entrance"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf9f" src="1f39f.png"/>',fitzpatrick_scale:!1,category:"activity"},performing_arts:{keywords:["acting","theater","drama"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfad" src="1f3ad.png"/>',fitzpatrick_scale:!1,category:"activity"},art:{keywords:["design","paint","draw","colors"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfa8" src="1f3a8.png"/>',fitzpatrick_scale:!1,category:"activity"},circus_tent:{keywords:["festival","carnival","party"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfaa" src="1f3aa.png"/>',fitzpatrick_scale:!1,category:"activity"},woman_juggling:{keywords:["juggle","balance","skill","multitask"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd39\u200d\u2640\ufe0f" src="1f939-200d-2640-fe0f.png"/>',fitzpatrick_scale:!0,category:"activity"},man_juggling:{keywords:["juggle","balance","skill","multitask"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd39\u200d\u2642\ufe0f" src="1f939-200d-2642-fe0f.png"/>',fitzpatrick_scale:!0,category:"activity"},microphone:{keywords:["sound","music","PA","sing","talkshow"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfa4" src="1f3a4.png"/>',fitzpatrick_scale:!1,category:"activity"},headphones:{keywords:["music","score","gadgets"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfa7" src="1f3a7.png"/>',fitzpatrick_scale:!1,category:"activity"},musical_score:{keywords:["treble","clef","compose"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfbc" src="1f3bc.png"/>',fitzpatrick_scale:!1,category:"activity"},musical_keyboard:{keywords:["piano","instrument","compose"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfb9" src="1f3b9.png"/>',fitzpatrick_scale:!1,category:"activity"},drum:{keywords:["music","instrument","drumsticks","snare"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udd41" src="1f941.png"/>',fitzpatrick_scale:!1,category:"activity"},saxophone:{keywords:["music","instrument","jazz","blues"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfb7" src="1f3b7.png"/>',fitzpatrick_scale:!1,category:"activity"},trumpet:{keywords:["music","brass"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfba" src="1f3ba.png"/>',fitzpatrick_scale:!1,category:"activity"},guitar:{keywords:["music","instrument"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfb8" src="1f3b8.png"/>',fitzpatrick_scale:!1,category:"activity"},violin:{keywords:["music","instrument","orchestra","symphony"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfbb" src="1f3bb.png"/>',fitzpatrick_scale:!1,category:"activity"},clapper:{keywords:["movie","film","record"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfac" src="1f3ac.png"/>',fitzpatrick_scale:!1,category:"activity"},video_game:{keywords:["play","console","PS4","controller"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfae" src="1f3ae.png"/>',fitzpatrick_scale:!1,category:"activity"},space_invader:{keywords:["game","arcade","play"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc7e" src="1f47e.png"/>',fitzpatrick_scale:!1,category:"activity"},dart:{keywords:["game","play","bar","target","bullseye"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfaf" src="1f3af.png"/>',fitzpatrick_scale:!1,category:"activity"},game_die:{keywords:["dice","random","tabletop","play","luck"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfb2" src="1f3b2.png"/>',fitzpatrick_scale:!1,category:"activity"},chess_pawn:{keywords:["expendable"],char:"\u265f",fitzpatrick_scale:!1,category:"activity"},slot_machine:{keywords:["bet","gamble","vegas","fruit machine","luck","casino"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfb0" src="1f3b0.png"/>',fitzpatrick_scale:!1,category:"activity"},jigsaw:{keywords:["interlocking","puzzle","piece"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udde9" src="1f9e9.png"/>',fitzpatrick_scale:!1,category:"activity"},bowling:{keywords:["sports","fun","play"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfb3" src="1f3b3.png"/>',fitzpatrick_scale:!1,category:"activity"},red_car:{keywords:["red","transportation","vehicle"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude97" src="1f697.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},taxi:{keywords:["uber","vehicle","cars","transportation"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude95" src="1f695.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},blue_car:{keywords:["transportation","vehicle"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude99" src="1f699.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},bus:{keywords:["car","vehicle","transportation"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude8c" src="1f68c.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},trolleybus:{keywords:["bart","transportation","vehicle"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude8e" src="1f68e.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},racing_car:{keywords:["sports","race","fast","formula","f1"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfce" src="1f3ce.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},police_car:{keywords:["vehicle","cars","transportation","law","legal","enforcement"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude93" src="1f693.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},ambulance:{keywords:["health","911","hospital"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude91" src="1f691.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},fire_engine:{keywords:["transportation","cars","vehicle"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude92" src="1f692.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},minibus:{keywords:["vehicle","car","transportation"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude90" src="1f690.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},truck:{keywords:["cars","transportation"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude9a" src="1f69a.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},articulated_lorry:{keywords:["vehicle","cars","transportation","express"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude9b" src="1f69b.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},tractor:{keywords:["vehicle","car","farming","agriculture"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude9c" src="1f69c.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},kick_scooter:{keywords:["vehicle","kick","razor"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udef4" src="1f6f4.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},motorcycle:{keywords:["race","sports","fast"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfcd" src="1f3cd.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},bike:{keywords:["sports","bicycle","exercise","hipster"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeb2" src="1f6b2.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},motor_scooter:{keywords:["vehicle","vespa","sasha"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udef5" src="1f6f5.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},rotating_light:{keywords:["police","ambulance","911","emergency","alert","error","pinged","law","legal"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udea8" src="1f6a8.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_police_car:{keywords:["vehicle","law","legal","enforcement","911"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude94" src="1f694.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_bus:{keywords:["vehicle","transportation"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude8d" src="1f68d.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_automobile:{keywords:["car","vehicle","transportation"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude98" src="1f698.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_taxi:{keywords:["vehicle","cars","uber"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude96" src="1f696.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},aerial_tramway:{keywords:["transportation","vehicle","ski"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udea1" src="1f6a1.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},mountain_cableway:{keywords:["transportation","vehicle","ski"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udea0" src="1f6a0.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},suspension_railway:{keywords:["vehicle","transportation"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude9f" src="1f69f.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},railway_car:{keywords:["transportation","vehicle"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude83" src="1f683.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},train:{keywords:["transportation","vehicle","carriage","public","travel"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude8b" src="1f68b.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},monorail:{keywords:["transportation","vehicle"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude9d" src="1f69d.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},bullettrain_side:{keywords:["transportation","vehicle"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude84" src="1f684.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},bullettrain_front:{keywords:["transportation","vehicle","speed","fast","public","travel"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude85" src="1f685.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},light_rail:{keywords:["transportation","vehicle"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude88" src="1f688.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},mountain_railway:{keywords:["transportation","vehicle"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude9e" src="1f69e.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},steam_locomotive:{keywords:["transportation","vehicle","train"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude82" src="1f682.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},train2:{keywords:["transportation","vehicle"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude86" src="1f686.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},metro:{keywords:["transportation","blue-square","mrt","underground","tube"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude87" src="1f687.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},tram:{keywords:["transportation","vehicle"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude8a" src="1f68a.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},station:{keywords:["transportation","vehicle","public"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude89" src="1f689.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},flying_saucer:{keywords:["transportation","vehicle","ufo"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udef8" src="1f6f8.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},helicopter:{keywords:["transportation","vehicle","fly"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude81" src="1f681.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},small_airplane:{keywords:["flight","transportation","fly","vehicle"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udee9" src="1f6e9.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},airplane:{keywords:["vehicle","transportation","flight","fly"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2708\ufe0f" src="2708.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},flight_departure:{keywords:["airport","flight","landing"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeeb" src="1f6eb.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},flight_arrival:{keywords:["airport","flight","boarding"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeec" src="1f6ec.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},sailboat:{keywords:["ship","summer","transportation","water","sailing"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26f5" src="26f5.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},motor_boat:{keywords:["ship"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udee5" src="1f6e5.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},speedboat:{keywords:["ship","transportation","vehicle","summer"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udea4" src="1f6a4.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},ferry:{keywords:["boat","ship","yacht"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26f4" src="26f4.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},passenger_ship:{keywords:["yacht","cruise","ferry"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udef3" src="1f6f3.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},rocket:{keywords:["launch","ship","staffmode","NASA","outer space","outer_space","fly"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude80" src="1f680.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},artificial_satellite:{keywords:["communication","gps","orbit","spaceflight","NASA","ISS"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udef0" src="1f6f0.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},seat:{keywords:["sit","airplane","transport","bus","flight","fly"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcba" src="1f4ba.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},canoe:{keywords:["boat","paddle","water","ship"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udef6" src="1f6f6.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},anchor:{keywords:["ship","ferry","sea","boat"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2693" src="2693.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},construction:{keywords:["wip","progress","caution","warning"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udea7" src="1f6a7.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},fuelpump:{keywords:["gas station","petroleum"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26fd" src="26fd.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},busstop:{keywords:["transportation","wait"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\ude8f" src="1f68f.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},vertical_traffic_light:{keywords:["transportation","driving"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udea6" src="1f6a6.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},traffic_light:{keywords:["transportation","signal"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udea5" src="1f6a5.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},checkered_flag:{keywords:["contest","finishline","race","gokart"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfc1" src="1f3c1.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},ship:{keywords:["transportation","titanic","deploy"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udea2" src="1f6a2.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},ferris_wheel:{keywords:["photo","carnival","londoneye"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfa1" src="1f3a1.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},roller_coaster:{keywords:["carnival","playground","photo","fun"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfa2" src="1f3a2.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},carousel_horse:{keywords:["photo","carnival"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfa0" src="1f3a0.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},building_construction:{keywords:["wip","working","progress"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfd7" src="1f3d7.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},foggy:{keywords:["photo","mountain"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf01" src="1f301.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},tokyo_tower:{keywords:["photo","japanese"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddfc" src="1f5fc.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},factory:{keywords:["building","industry","pollution","smoke"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfed" src="1f3ed.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},fountain:{keywords:["photo","summer","water","fresh"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26f2" src="26f2.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},rice_scene:{keywords:["photo","japan","asia","tsukimi"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf91" src="1f391.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},mountain:{keywords:["photo","nature","environment"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26f0" src="26f0.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},mountain_snow:{keywords:["photo","nature","environment","winter","cold"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfd4" src="1f3d4.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},mount_fuji:{keywords:["photo","mountain","nature","japanese"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddfb" src="1f5fb.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},volcano:{keywords:["photo","nature","disaster"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf0b" src="1f30b.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},japan:{keywords:["nation","country","japanese","asia"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddfe" src="1f5fe.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},camping:{keywords:["photo","outdoors","tent"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfd5" src="1f3d5.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},tent:{keywords:["photo","camping","outdoors"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26fa" src="26fa.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},national_park:{keywords:["photo","environment","nature"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfde" src="1f3de.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},motorway:{keywords:["road","cupertino","interstate","highway"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udee3" src="1f6e3.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},railway_track:{keywords:["train","transportation"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udee4" src="1f6e4.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},sunrise:{keywords:["morning","view","vacation","photo"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf05" src="1f305.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},sunrise_over_mountains:{keywords:["view","vacation","photo"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf04" src="1f304.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},desert:{keywords:["photo","warm","saharah"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfdc" src="1f3dc.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},beach_umbrella:{keywords:["weather","summer","sunny","sand","mojito"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfd6" src="1f3d6.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},desert_island:{keywords:["photo","tropical","mojito"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfdd" src="1f3dd.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},city_sunrise:{keywords:["photo","good morning","dawn"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf07" src="1f307.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},city_sunset:{keywords:["photo","evening","sky","buildings"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf06" src="1f306.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},cityscape:{keywords:["photo","night life","urban"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfd9" src="1f3d9.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},night_with_stars:{keywords:["evening","city","downtown"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf03" src="1f303.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},bridge_at_night:{keywords:["photo","sanfrancisco"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf09" src="1f309.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},milky_way:{keywords:["photo","space","stars"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf0c" src="1f30c.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},stars:{keywords:["night","photo"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf20" src="1f320.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},sparkler:{keywords:["stars","night","shine"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf87" src="1f387.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},fireworks:{keywords:["photo","festival","carnival","congratulations"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf86" src="1f386.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},rainbow:{keywords:["nature","happy","unicorn_face","photo","sky","spring"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf08" src="1f308.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},houses:{keywords:["buildings","photo"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfd8" src="1f3d8.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},european_castle:{keywords:["building","royalty","history"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udff0" src="1f3f0.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},japanese_castle:{keywords:["photo","building"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfef" src="1f3ef.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},stadium:{keywords:["photo","place","sports","concert","venue"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfdf" src="1f3df.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},statue_of_liberty:{keywords:["american","newyork"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddfd" src="1f5fd.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},house:{keywords:["building","home"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfe0" src="1f3e0.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},house_with_garden:{keywords:["home","plant","nature"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfe1" src="1f3e1.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},derelict_house:{keywords:["abandon","evict","broken","building"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfda" src="1f3da.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},office:{keywords:["building","bureau","work"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfe2" src="1f3e2.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},department_store:{keywords:["building","shopping","mall"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfec" src="1f3ec.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},post_office:{keywords:["building","envelope","communication"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfe3" src="1f3e3.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},european_post_office:{keywords:["building","email"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfe4" src="1f3e4.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},hospital:{keywords:["building","health","surgery","doctor"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfe5" src="1f3e5.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},bank:{keywords:["building","money","sales","cash","business","enterprise"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfe6" src="1f3e6.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},hotel:{keywords:["building","accomodation","checkin"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfe8" src="1f3e8.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},convenience_store:{keywords:["building","shopping","groceries"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfea" src="1f3ea.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},school:{keywords:["building","student","education","learn","teach"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfeb" src="1f3eb.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},love_hotel:{keywords:["like","affection","dating"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfe9" src="1f3e9.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},wedding:{keywords:["love","like","affection","couple","marriage","bride","groom"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc92" src="1f492.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},classical_building:{keywords:["art","culture","history"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfdb" src="1f3db.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},church:{keywords:["building","religion","christ"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26ea" src="26ea.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},mosque:{keywords:["islam","worship","minaret"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd4c" src="1f54c.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},synagogue:{keywords:["judaism","worship","temple","jewish"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd4d" src="1f54d.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},kaaba:{keywords:["mecca","mosque","islam"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd4b" src="1f54b.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},shinto_shrine:{keywords:["temple","japan","kyoto"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26e9" src="26e9.png"/>',fitzpatrick_scale:!1,category:"travel_and_places"},watch:{keywords:["time","accessories"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u231a" src="231a.png"/>',fitzpatrick_scale:!1,category:"objects"},iphone:{keywords:["technology","apple","gadgets","dial"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcf1" src="1f4f1.png"/>',fitzpatrick_scale:!1,category:"objects"},calling:{keywords:["iphone","incoming"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcf2" src="1f4f2.png"/>',fitzpatrick_scale:!1,category:"objects"},computer:{keywords:["technology","laptop","screen","display","monitor"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcbb" src="1f4bb.png"/>',fitzpatrick_scale:!1,category:"objects"},keyboard:{keywords:["technology","computer","type","input","text"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2328" src="2328.png"/>',fitzpatrick_scale:!1,category:"objects"},desktop_computer:{keywords:["technology","computing","screen"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udda5" src="1f5a5.png"/>',fitzpatrick_scale:!1,category:"objects"},printer:{keywords:["paper","ink"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udda8" src="1f5a8.png"/>',fitzpatrick_scale:!1,category:"objects"},computer_mouse:{keywords:["click"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddb1" src="1f5b1.png"/>',fitzpatrick_scale:!1,category:"objects"},trackball:{keywords:["technology","trackpad"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddb2" src="1f5b2.png"/>',fitzpatrick_scale:!1,category:"objects"},joystick:{keywords:["game","play"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd79" src="1f579.png"/>',fitzpatrick_scale:!1,category:"objects"},clamp:{keywords:["tool"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udddc" src="1f5dc.png"/>',fitzpatrick_scale:!1,category:"objects"},minidisc:{keywords:["technology","record","data","disk","90s"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcbd" src="1f4bd.png"/>',fitzpatrick_scale:!1,category:"objects"},floppy_disk:{keywords:["oldschool","technology","save","90s","80s"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcbe" src="1f4be.png"/>',fitzpatrick_scale:!1,category:"objects"},cd:{keywords:["technology","dvd","disk","disc","90s"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcbf" src="1f4bf.png"/>',fitzpatrick_scale:!1,category:"objects"},dvd:{keywords:["cd","disk","disc"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcc0" src="1f4c0.png"/>',fitzpatrick_scale:!1,category:"objects"},vhs:{keywords:["record","video","oldschool","90s","80s"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcfc" src="1f4fc.png"/>',fitzpatrick_scale:!1,category:"objects"},camera:{keywords:["gadgets","photography"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcf7" src="1f4f7.png"/>',fitzpatrick_scale:!1,category:"objects"},camera_flash:{keywords:["photography","gadgets"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcf8" src="1f4f8.png"/>',fitzpatrick_scale:!1,category:"objects"},video_camera:{keywords:["film","record"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcf9" src="1f4f9.png"/>',fitzpatrick_scale:!1,category:"objects"},movie_camera:{keywords:["film","record"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfa5" src="1f3a5.png"/>',fitzpatrick_scale:!1,category:"objects"},film_projector:{keywords:["video","tape","record","movie"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcfd" src="1f4fd.png"/>',fitzpatrick_scale:!1,category:"objects"},film_strip:{keywords:["movie"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf9e" src="1f39e.png"/>',fitzpatrick_scale:!1,category:"objects"},telephone_receiver:{keywords:["technology","communication","dial"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcde" src="1f4de.png"/>',fitzpatrick_scale:!1,category:"objects"},phone:{keywords:["technology","communication","dial","telephone"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u260e\ufe0f" src="260e.png"/>',fitzpatrick_scale:!1,category:"objects"},pager:{keywords:["bbcall","oldschool","90s"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcdf" src="1f4df.png"/>',fitzpatrick_scale:!1,category:"objects"},fax:{keywords:["communication","technology"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udce0" src="1f4e0.png"/>',fitzpatrick_scale:!1,category:"objects"},tv:{keywords:["technology","program","oldschool","show","television"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcfa" src="1f4fa.png"/>',fitzpatrick_scale:!1,category:"objects"},radio:{keywords:["communication","music","podcast","program"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcfb" src="1f4fb.png"/>',fitzpatrick_scale:!1,category:"objects"},studio_microphone:{keywords:["sing","recording","artist","talkshow"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf99" src="1f399.png"/>',fitzpatrick_scale:!1,category:"objects"},level_slider:{keywords:["scale"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf9a" src="1f39a.png"/>',fitzpatrick_scale:!1,category:"objects"},control_knobs:{keywords:["dial"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf9b" src="1f39b.png"/>',fitzpatrick_scale:!1,category:"objects"},compass:{keywords:["magnetic","navigation","orienteering"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udded" src="1f9ed.png"/>',fitzpatrick_scale:!1,category:"objects"},stopwatch:{keywords:["time","deadline"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u23f1" src="23f1.png"/>',fitzpatrick_scale:!1,category:"objects"},timer_clock:{keywords:["alarm"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u23f2" src="23f2.png"/>',fitzpatrick_scale:!1,category:"objects"},alarm_clock:{keywords:["time","wake"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u23f0" src="23f0.png"/>',fitzpatrick_scale:!1,category:"objects"},mantelpiece_clock:{keywords:["time"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd70" src="1f570.png"/>',fitzpatrick_scale:!1,category:"objects"},hourglass_flowing_sand:{keywords:["oldschool","time","countdown"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u23f3" src="23f3.png"/>',fitzpatrick_scale:!1,category:"objects"},hourglass:{keywords:["time","clock","oldschool","limit","exam","quiz","test"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u231b" src="231b.png"/>',fitzpatrick_scale:!1,category:"objects"},satellite:{keywords:["communication","future","radio","space"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udce1" src="1f4e1.png"/>',fitzpatrick_scale:!1,category:"objects"},battery:{keywords:["power","energy","sustain"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd0b" src="1f50b.png"/>',fitzpatrick_scale:!1,category:"objects"},electric_plug:{keywords:["charger","power"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd0c" src="1f50c.png"/>',fitzpatrick_scale:!1,category:"objects"},bulb:{keywords:["light","electricity","idea"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udca1" src="1f4a1.png"/>',fitzpatrick_scale:!1,category:"objects"},flashlight:{keywords:["dark","camping","sight","night"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd26" src="1f526.png"/>',fitzpatrick_scale:!1,category:"objects"},candle:{keywords:["fire","wax"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd6f" src="1f56f.png"/>',fitzpatrick_scale:!1,category:"objects"},fire_extinguisher:{keywords:["quench"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddef" src="1f9ef.png"/>',fitzpatrick_scale:!1,category:"objects"},wastebasket:{keywords:["bin","trash","rubbish","garbage","toss"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddd1" src="1f5d1.png"/>',fitzpatrick_scale:!1,category:"objects"},oil_drum:{keywords:["barrell"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udee2" src="1f6e2.png"/>',fitzpatrick_scale:!1,category:"objects"},money_with_wings:{keywords:["dollar","bills","payment","sale"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcb8" src="1f4b8.png"/>',fitzpatrick_scale:!1,category:"objects"},dollar:{keywords:["money","sales","bill","currency"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcb5" src="1f4b5.png"/>',fitzpatrick_scale:!1,category:"objects"},yen:{keywords:["money","sales","japanese","dollar","currency"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcb4" src="1f4b4.png"/>',fitzpatrick_scale:!1,category:"objects"},euro:{keywords:["money","sales","dollar","currency"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcb6" src="1f4b6.png"/>',fitzpatrick_scale:!1,category:"objects"},pound:{keywords:["british","sterling","money","sales","bills","uk","england","currency"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcb7" src="1f4b7.png"/>',fitzpatrick_scale:!1,category:"objects"},moneybag:{keywords:["dollar","payment","coins","sale"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcb0" src="1f4b0.png"/>',fitzpatrick_scale:!1,category:"objects"},credit_card:{keywords:["money","sales","dollar","bill","payment","shopping"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcb3" src="1f4b3.png"/>',fitzpatrick_scale:!1,category:"objects"},gem:{keywords:["blue","ruby","diamond","jewelry"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc8e" src="1f48e.png"/>',fitzpatrick_scale:!1,category:"objects"},balance_scale:{keywords:["law","fairness","weight"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2696" src="2696.png"/>',fitzpatrick_scale:!1,category:"objects"},toolbox:{keywords:["tools","diy","fix","maintainer","mechanic"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddf0" src="1f9f0.png"/>',fitzpatrick_scale:!1,category:"objects"},wrench:{keywords:["tools","diy","ikea","fix","maintainer"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd27" src="1f527.png"/>',fitzpatrick_scale:!1,category:"objects"},hammer:{keywords:["tools","build","create"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd28" src="1f528.png"/>',fitzpatrick_scale:!1,category:"objects"},hammer_and_pick:{keywords:["tools","build","create"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2692" src="2692.png"/>',fitzpatrick_scale:!1,category:"objects"},hammer_and_wrench:{keywords:["tools","build","create"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udee0" src="1f6e0.png"/>',fitzpatrick_scale:!1,category:"objects"},pick:{keywords:["tools","dig"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26cf" src="26cf.png"/>',fitzpatrick_scale:!1,category:"objects"},nut_and_bolt:{keywords:["handy","tools","fix"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd29" src="1f529.png"/>',fitzpatrick_scale:!1,category:"objects"},gear:{keywords:["cog"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2699" src="2699.png"/>',fitzpatrick_scale:!1,category:"objects"},brick:{keywords:["bricks"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddf1" src="1f9f1.png"/>',fitzpatrick_scale:!1,category:"objects"},chains:{keywords:["lock","arrest"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26d3" src="26d3.png"/>',fitzpatrick_scale:!1,category:"objects"},magnet:{keywords:["attraction","magnetic"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddf2" src="1f9f2.png"/>',fitzpatrick_scale:!1,category:"objects"},gun:{keywords:["violence","weapon","pistol","revolver"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd2b" src="1f52b.png"/>',fitzpatrick_scale:!1,category:"objects"},bomb:{keywords:["boom","explode","explosion","terrorism"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udca3" src="1f4a3.png"/>',fitzpatrick_scale:!1,category:"objects"},firecracker:{keywords:["dynamite","boom","explode","explosion","explosive"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udde8" src="1f9e8.png"/>',fitzpatrick_scale:!1,category:"objects"},hocho:{keywords:["knife","blade","cutlery","kitchen","weapon"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd2a" src="1f52a.png"/>',fitzpatrick_scale:!1,category:"objects"},dagger:{keywords:["weapon"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udde1" src="1f5e1.png"/>',fitzpatrick_scale:!1,category:"objects"},crossed_swords:{keywords:["weapon"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2694" src="2694.png"/>',fitzpatrick_scale:!1,category:"objects"},shield:{keywords:["protection","security"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udee1" src="1f6e1.png"/>',fitzpatrick_scale:!1,category:"objects"},smoking:{keywords:["kills","tobacco","cigarette","joint","smoke"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeac" src="1f6ac.png"/>',fitzpatrick_scale:!1,category:"objects"},skull_and_crossbones:{keywords:["poison","danger","deadly","scary","death","pirate","evil"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2620" src="2620.png"/>',fitzpatrick_scale:!1,category:"objects"},coffin:{keywords:["vampire","dead","die","death","rip","graveyard","cemetery","casket","funeral","box"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26b0" src="26b0.png"/>',fitzpatrick_scale:!1,category:"objects"},funeral_urn:{keywords:["dead","die","death","rip","ashes"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26b1" src="26b1.png"/>',fitzpatrick_scale:!1,category:"objects"},amphora:{keywords:["vase","jar"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udffa" src="1f3fa.png"/>',fitzpatrick_scale:!1,category:"objects"},crystal_ball:{keywords:["disco","party","magic","circus","fortune_teller"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd2e" src="1f52e.png"/>',fitzpatrick_scale:!1,category:"objects"},prayer_beads:{keywords:["dhikr","religious"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcff" src="1f4ff.png"/>',fitzpatrick_scale:!1,category:"objects"},nazar_amulet:{keywords:["bead","charm"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddff" src="1f9ff.png"/>',fitzpatrick_scale:!1,category:"objects"},barber:{keywords:["hair","salon","style"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc88" src="1f488.png"/>',fitzpatrick_scale:!1,category:"objects"},alembic:{keywords:["distilling","science","experiment","chemistry"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2697" src="2697.png"/>',fitzpatrick_scale:!1,category:"objects"},telescope:{keywords:["stars","space","zoom","science","astronomy"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd2d" src="1f52d.png"/>',fitzpatrick_scale:!1,category:"objects"},microscope:{keywords:["laboratory","experiment","zoomin","science","study"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd2c" src="1f52c.png"/>',fitzpatrick_scale:!1,category:"objects"},hole:{keywords:["embarrassing"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd73" src="1f573.png"/>',fitzpatrick_scale:!1,category:"objects"},pill:{keywords:["health","medicine","doctor","pharmacy","drug"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc8a" src="1f48a.png"/>',fitzpatrick_scale:!1,category:"objects"},syringe:{keywords:["health","hospital","drugs","blood","medicine","needle","doctor","nurse"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc89" src="1f489.png"/>',fitzpatrick_scale:!1,category:"objects"},dna:{keywords:["biologist","genetics","life"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddec" src="1f9ec.png"/>',fitzpatrick_scale:!1,category:"objects"},microbe:{keywords:["amoeba","bacteria","germs"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udda0" src="1f9a0.png"/>',fitzpatrick_scale:!1,category:"objects"},petri_dish:{keywords:["bacteria","biology","culture","lab"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddeb" src="1f9eb.png"/>',fitzpatrick_scale:!1,category:"objects"},test_tube:{keywords:["chemistry","experiment","lab","science"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddea" src="1f9ea.png"/>',fitzpatrick_scale:!1,category:"objects"},thermometer:{keywords:["weather","temperature","hot","cold"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf21" src="1f321.png"/>',fitzpatrick_scale:!1,category:"objects"},broom:{keywords:["cleaning","sweeping","witch"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddf9" src="1f9f9.png"/>',fitzpatrick_scale:!1,category:"objects"},basket:{keywords:["laundry"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddfa" src="1f9fa.png"/>',fitzpatrick_scale:!1,category:"objects"},toilet_paper:{keywords:["roll"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddfb" src="1f9fb.png"/>',fitzpatrick_scale:!1,category:"objects"},label:{keywords:["sale","tag"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udff7" src="1f3f7.png"/>',fitzpatrick_scale:!1,category:"objects"},bookmark:{keywords:["favorite","label","save"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd16" src="1f516.png"/>',fitzpatrick_scale:!1,category:"objects"},toilet:{keywords:["restroom","wc","washroom","bathroom","potty"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udebd" src="1f6bd.png"/>',fitzpatrick_scale:!1,category:"objects"},shower:{keywords:["clean","water","bathroom"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udebf" src="1f6bf.png"/>',fitzpatrick_scale:!1,category:"objects"},bathtub:{keywords:["clean","shower","bathroom"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udec1" src="1f6c1.png"/>',fitzpatrick_scale:!1,category:"objects"},soap:{keywords:["bar","bathing","cleaning","lather"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddfc" src="1f9fc.png"/>',fitzpatrick_scale:!1,category:"objects"},sponge:{keywords:["absorbing","cleaning","porous"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddfd" src="1f9fd.png"/>',fitzpatrick_scale:!1,category:"objects"},lotion_bottle:{keywords:["moisturizer","sunscreen"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddf4" src="1f9f4.png"/>',fitzpatrick_scale:!1,category:"objects"},key:{keywords:["lock","door","password"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd11" src="1f511.png"/>',fitzpatrick_scale:!1,category:"objects"},old_key:{keywords:["lock","door","password"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udddd" src="1f5dd.png"/>',fitzpatrick_scale:!1,category:"objects"},couch_and_lamp:{keywords:["read","chill"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udecb" src="1f6cb.png"/>',fitzpatrick_scale:!1,category:"objects"},sleeping_bed:{keywords:["bed","rest"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udecc" src="1f6cc.png"/>',fitzpatrick_scale:!0,category:"objects"},bed:{keywords:["sleep","rest"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udecf" src="1f6cf.png"/>',fitzpatrick_scale:!1,category:"objects"},door:{keywords:["house","entry","exit"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeaa" src="1f6aa.png"/>',fitzpatrick_scale:!1,category:"objects"},bellhop_bell:{keywords:["service"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udece" src="1f6ce.png"/>',fitzpatrick_scale:!1,category:"objects"},teddy_bear:{keywords:["plush","stuffed"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddf8" src="1f9f8.png"/>',fitzpatrick_scale:!1,category:"objects"},framed_picture:{keywords:["photography"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddbc" src="1f5bc.png"/>',fitzpatrick_scale:!1,category:"objects"},world_map:{keywords:["location","direction"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddfa" src="1f5fa.png"/>',fitzpatrick_scale:!1,category:"objects"},parasol_on_ground:{keywords:["weather","summer"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26f1" src="26f1.png"/>',fitzpatrick_scale:!1,category:"objects"},moyai:{keywords:["rock","easter island","moai"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddff" src="1f5ff.png"/>',fitzpatrick_scale:!1,category:"objects"},shopping:{keywords:["mall","buy","purchase"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udecd" src="1f6cd.png"/>',fitzpatrick_scale:!1,category:"objects"},shopping_cart:{keywords:["trolley"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uded2" src="1f6d2.png"/>',fitzpatrick_scale:!1,category:"objects"},balloon:{keywords:["party","celebration","birthday","circus"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf88" src="1f388.png"/>',fitzpatrick_scale:!1,category:"objects"},flags:{keywords:["fish","japanese","koinobori","carp","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf8f" src="1f38f.png"/>',fitzpatrick_scale:!1,category:"objects"},ribbon:{keywords:["decoration","pink","girl","bowtie"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf80" src="1f380.png"/>',fitzpatrick_scale:!1,category:"objects"},gift:{keywords:["present","birthday","christmas","xmas"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf81" src="1f381.png"/>',fitzpatrick_scale:!1,category:"objects"},confetti_ball:{keywords:["festival","party","birthday","circus"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf8a" src="1f38a.png"/>',fitzpatrick_scale:!1,category:"objects"},tada:{keywords:["party","congratulations","birthday","magic","circus","celebration"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf89" src="1f389.png"/>',fitzpatrick_scale:!1,category:"objects"},dolls:{keywords:["japanese","toy","kimono"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf8e" src="1f38e.png"/>',fitzpatrick_scale:!1,category:"objects"},wind_chime:{keywords:["nature","ding","spring","bell"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf90" src="1f390.png"/>',fitzpatrick_scale:!1,category:"objects"},crossed_flags:{keywords:["japanese","nation","country","border"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf8c" src="1f38c.png"/>',fitzpatrick_scale:!1,category:"objects"},izakaya_lantern:{keywords:["light","paper","halloween","spooky"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfee" src="1f3ee.png"/>',fitzpatrick_scale:!1,category:"objects"},red_envelope:{keywords:["gift"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udde7" src="1f9e7.png"/>',fitzpatrick_scale:!1,category:"objects"},email:{keywords:["letter","postal","inbox","communication"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2709\ufe0f" src="2709.png"/>',fitzpatrick_scale:!1,category:"objects"},envelope_with_arrow:{keywords:["email","communication"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udce9" src="1f4e9.png"/>',fitzpatrick_scale:!1,category:"objects"},incoming_envelope:{keywords:["email","inbox"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udce8" src="1f4e8.png"/>',fitzpatrick_scale:!1,category:"objects"},"e-mail":{keywords:["communication","inbox"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udce7" src="1f4e7.png"/>',fitzpatrick_scale:!1,category:"objects"},love_letter:{keywords:["email","like","affection","envelope","valentines"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc8c" src="1f48c.png"/>',fitzpatrick_scale:!1,category:"objects"},postbox:{keywords:["email","letter","envelope"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcee" src="1f4ee.png"/>',fitzpatrick_scale:!1,category:"objects"},mailbox_closed:{keywords:["email","communication","inbox"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcea" src="1f4ea.png"/>',fitzpatrick_scale:!1,category:"objects"},mailbox:{keywords:["email","inbox","communication"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udceb" src="1f4eb.png"/>',fitzpatrick_scale:!1,category:"objects"},mailbox_with_mail:{keywords:["email","inbox","communication"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcec" src="1f4ec.png"/>',fitzpatrick_scale:!1,category:"objects"},mailbox_with_no_mail:{keywords:["email","inbox"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udced" src="1f4ed.png"/>',fitzpatrick_scale:!1,category:"objects"},package:{keywords:["mail","gift","cardboard","box","moving"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udce6" src="1f4e6.png"/>',fitzpatrick_scale:!1,category:"objects"},postal_horn:{keywords:["instrument","music"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcef" src="1f4ef.png"/>',fitzpatrick_scale:!1,category:"objects"},inbox_tray:{keywords:["email","documents"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udce5" src="1f4e5.png"/>',fitzpatrick_scale:!1,category:"objects"},outbox_tray:{keywords:["inbox","email"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udce4" src="1f4e4.png"/>',fitzpatrick_scale:!1,category:"objects"},scroll:{keywords:["documents","ancient","history","paper"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcdc" src="1f4dc.png"/>',fitzpatrick_scale:!1,category:"objects"},page_with_curl:{keywords:["documents","office","paper"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcc3" src="1f4c3.png"/>',fitzpatrick_scale:!1,category:"objects"},bookmark_tabs:{keywords:["favorite","save","order","tidy"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcd1" src="1f4d1.png"/>',fitzpatrick_scale:!1,category:"objects"},receipt:{keywords:["accounting","expenses"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddfe" src="1f9fe.png"/>',fitzpatrick_scale:!1,category:"objects"},bar_chart:{keywords:["graph","presentation","stats"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcca" src="1f4ca.png"/>',fitzpatrick_scale:!1,category:"objects"},chart_with_upwards_trend:{keywords:["graph","presentation","stats","recovery","business","economics","money","sales","good","success"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcc8" src="1f4c8.png"/>',fitzpatrick_scale:!1,category:"objects"},chart_with_downwards_trend:{keywords:["graph","presentation","stats","recession","business","economics","money","sales","bad","failure"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcc9" src="1f4c9.png"/>',fitzpatrick_scale:!1,category:"objects"},page_facing_up:{keywords:["documents","office","paper","information"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcc4" src="1f4c4.png"/>',fitzpatrick_scale:!1,category:"objects"},date:{keywords:["calendar","schedule"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcc5" src="1f4c5.png"/>',fitzpatrick_scale:!1,category:"objects"},calendar:{keywords:["schedule","date","planning"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcc6" src="1f4c6.png"/>',fitzpatrick_scale:!1,category:"objects"},spiral_calendar:{keywords:["date","schedule","planning"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddd3" src="1f5d3.png"/>',fitzpatrick_scale:!1,category:"objects"},card_index:{keywords:["business","stationery"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcc7" src="1f4c7.png"/>',fitzpatrick_scale:!1,category:"objects"},card_file_box:{keywords:["business","stationery"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddc3" src="1f5c3.png"/>',fitzpatrick_scale:!1,category:"objects"},ballot_box:{keywords:["election","vote"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddf3" src="1f5f3.png"/>',fitzpatrick_scale:!1,category:"objects"},file_cabinet:{keywords:["filing","organizing"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddc4" src="1f5c4.png"/>',fitzpatrick_scale:!1,category:"objects"},clipboard:{keywords:["stationery","documents"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udccb" src="1f4cb.png"/>',fitzpatrick_scale:!1,category:"objects"},spiral_notepad:{keywords:["memo","stationery"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddd2" src="1f5d2.png"/>',fitzpatrick_scale:!1,category:"objects"},file_folder:{keywords:["documents","business","office"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcc1" src="1f4c1.png"/>',fitzpatrick_scale:!1,category:"objects"},open_file_folder:{keywords:["documents","load"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcc2" src="1f4c2.png"/>',fitzpatrick_scale:!1,category:"objects"},card_index_dividers:{keywords:["organizing","business","stationery"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddc2" src="1f5c2.png"/>',fitzpatrick_scale:!1,category:"objects"},newspaper_roll:{keywords:["press","headline"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddde" src="1f5de.png"/>',fitzpatrick_scale:!1,category:"objects"},newspaper:{keywords:["press","headline"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcf0" src="1f4f0.png"/>',fitzpatrick_scale:!1,category:"objects"},notebook:{keywords:["stationery","record","notes","paper","study"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcd3" src="1f4d3.png"/>',fitzpatrick_scale:!1,category:"objects"},closed_book:{keywords:["read","library","knowledge","textbook","learn"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcd5" src="1f4d5.png"/>',fitzpatrick_scale:!1,category:"objects"},green_book:{keywords:["read","library","knowledge","study"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcd7" src="1f4d7.png"/>',fitzpatrick_scale:!1,category:"objects"},blue_book:{keywords:["read","library","knowledge","learn","study"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcd8" src="1f4d8.png"/>',fitzpatrick_scale:!1,category:"objects"},orange_book:{keywords:["read","library","knowledge","textbook","study"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcd9" src="1f4d9.png"/>',fitzpatrick_scale:!1,category:"objects"},notebook_with_decorative_cover:{keywords:["classroom","notes","record","paper","study"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcd4" src="1f4d4.png"/>',fitzpatrick_scale:!1,category:"objects"},ledger:{keywords:["notes","paper"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcd2" src="1f4d2.png"/>',fitzpatrick_scale:!1,category:"objects"},books:{keywords:["literature","library","study"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcda" src="1f4da.png"/>',fitzpatrick_scale:!1,category:"objects"},open_book:{keywords:["book","read","library","knowledge","literature","learn","study"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcd6" src="1f4d6.png"/>',fitzpatrick_scale:!1,category:"objects"},safety_pin:{keywords:["diaper"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddf7" src="1f9f7.png"/>',fitzpatrick_scale:!1,category:"objects"},link:{keywords:["rings","url"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd17" src="1f517.png"/>',fitzpatrick_scale:!1,category:"objects"},paperclip:{keywords:["documents","stationery"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcce" src="1f4ce.png"/>',fitzpatrick_scale:!1,category:"objects"},paperclips:{keywords:["documents","stationery"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd87" src="1f587.png"/>',fitzpatrick_scale:!1,category:"objects"},scissors:{keywords:["stationery","cut"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2702\ufe0f" src="2702.png"/>',fitzpatrick_scale:!1,category:"objects"},triangular_ruler:{keywords:["stationery","math","architect","sketch"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcd0" src="1f4d0.png"/>',fitzpatrick_scale:!1,category:"objects"},straight_ruler:{keywords:["stationery","calculate","length","math","school","drawing","architect","sketch"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udccf" src="1f4cf.png"/>',fitzpatrick_scale:!1,category:"objects"},abacus:{keywords:["calculation"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\uddee" src="1f9ee.png"/>',fitzpatrick_scale:!1,category:"objects"},pushpin:{keywords:["stationery","mark","here"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udccc" src="1f4cc.png"/>',fitzpatrick_scale:!1,category:"objects"},round_pushpin:{keywords:["stationery","location","map","here"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udccd" src="1f4cd.png"/>',fitzpatrick_scale:!1,category:"objects"},triangular_flag_on_post:{keywords:["mark","milestone","place"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udea9" src="1f6a9.png"/>',fitzpatrick_scale:!1,category:"objects"},white_flag:{keywords:["losing","loser","lost","surrender","give up","fail"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udff3" src="1f3f3.png"/>',fitzpatrick_scale:!1,category:"objects"},black_flag:{keywords:["pirate"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udff4" src="1f3f4.png"/>',fitzpatrick_scale:!1,category:"objects"},rainbow_flag:{keywords:["flag","rainbow","pride","gay","lgbt","glbt","queer","homosexual","lesbian","bisexual","transgender"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udff3\ufe0f\u200d\ud83c\udf08" src="1f3f3-fe0f-200d-1f308.png"/>',fitzpatrick_scale:!1,category:"objects"},closed_lock_with_key:{keywords:["security","privacy"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd10" src="1f510.png"/>',fitzpatrick_scale:!1,category:"objects"},lock:{keywords:["security","password","padlock"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd12" src="1f512.png"/>',fitzpatrick_scale:!1,category:"objects"},unlock:{keywords:["privacy","security"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd13" src="1f513.png"/>',fitzpatrick_scale:!1,category:"objects"},lock_with_ink_pen:{keywords:["security","secret"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd0f" src="1f50f.png"/>',fitzpatrick_scale:!1,category:"objects"},pen:{keywords:["stationery","writing","write"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd8a" src="1f58a.png"/>',fitzpatrick_scale:!1,category:"objects"},fountain_pen:{keywords:["stationery","writing","write"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd8b" src="1f58b.png"/>',fitzpatrick_scale:!1,category:"objects"},black_nib:{keywords:["pen","stationery","writing","write"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2712\ufe0f" src="2712.png"/>',fitzpatrick_scale:!1,category:"objects"},memo:{keywords:["write","documents","stationery","pencil","paper","writing","legal","exam","quiz","test","study","compose"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcdd" src="1f4dd.png"/>',fitzpatrick_scale:!1,category:"objects"},pencil2:{keywords:["stationery","write","paper","writing","school","study"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u270f\ufe0f" src="270f.png"/>',fitzpatrick_scale:!1,category:"objects"},crayon:{keywords:["drawing","creativity"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd8d" src="1f58d.png"/>',fitzpatrick_scale:!1,category:"objects"},paintbrush:{keywords:["drawing","creativity","art"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd8c" src="1f58c.png"/>',fitzpatrick_scale:!1,category:"objects"},mag:{keywords:["search","zoom","find","detective"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd0d" src="1f50d.png"/>',fitzpatrick_scale:!1,category:"objects"},mag_right:{keywords:["search","zoom","find","detective"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd0e" src="1f50e.png"/>',fitzpatrick_scale:!1,category:"objects"},heart:{keywords:["love","like","valentines"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2764\ufe0f" src="2764.png"/>',fitzpatrick_scale:!1,category:"symbols"},orange_heart:{keywords:["love","like","affection","valentines"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83e\udde1" src="1f9e1.png"/>',fitzpatrick_scale:!1,category:"symbols"},yellow_heart:{keywords:["love","like","affection","valentines"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc9b" src="1f49b.png"/>',fitzpatrick_scale:!1,category:"symbols"},green_heart:{keywords:["love","like","affection","valentines"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc9a" src="1f49a.png"/>',fitzpatrick_scale:!1,category:"symbols"},blue_heart:{keywords:["love","like","affection","valentines"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc99" src="1f499.png"/>',fitzpatrick_scale:!1,category:"symbols"},purple_heart:{keywords:["love","like","affection","valentines"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc9c" src="1f49c.png"/>',fitzpatrick_scale:!1,category:"symbols"},black_heart:{keywords:["evil"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udda4" src="1f5a4.png"/>',fitzpatrick_scale:!1,category:"symbols"},broken_heart:{keywords:["sad","sorry","break","heart","heartbreak"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc94" src="1f494.png"/>',fitzpatrick_scale:!1,category:"symbols"},heavy_heart_exclamation:{keywords:["decoration","love"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2763" src="2763.png"/>',fitzpatrick_scale:!1,category:"symbols"},two_hearts:{keywords:["love","like","affection","valentines","heart"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc95" src="1f495.png"/>',fitzpatrick_scale:!1,category:"symbols"},revolving_hearts:{keywords:["love","like","affection","valentines"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc9e" src="1f49e.png"/>',fitzpatrick_scale:!1,category:"symbols"},heartbeat:{keywords:["love","like","affection","valentines","pink","heart"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc93" src="1f493.png"/>',fitzpatrick_scale:!1,category:"symbols"},heartpulse:{keywords:["like","love","affection","valentines","pink"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc97" src="1f497.png"/>',fitzpatrick_scale:!1,category:"symbols"},sparkling_heart:{keywords:["love","like","affection","valentines"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc96" src="1f496.png"/>',fitzpatrick_scale:!1,category:"symbols"},cupid:{keywords:["love","like","heart","affection","valentines"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc98" src="1f498.png"/>',fitzpatrick_scale:!1,category:"symbols"},gift_heart:{keywords:["love","valentines"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc9d" src="1f49d.png"/>',fitzpatrick_scale:!1,category:"symbols"},heart_decoration:{keywords:["purple-square","love","like"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udc9f" src="1f49f.png"/>',fitzpatrick_scale:!1,category:"symbols"},peace_symbol:{keywords:["hippie"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u262e" src="262e.png"/>',fitzpatrick_scale:!1,category:"symbols"},latin_cross:{keywords:["christianity"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u271d" src="271d.png"/>',fitzpatrick_scale:!1,category:"symbols"},star_and_crescent:{keywords:["islam"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u262a" src="262a.png"/>',fitzpatrick_scale:!1,category:"symbols"},om:{keywords:["hinduism","buddhism","sikhism","jainism"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd49" src="1f549.png"/>',fitzpatrick_scale:!1,category:"symbols"},wheel_of_dharma:{keywords:["hinduism","buddhism","sikhism","jainism"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2638" src="2638.png"/>',fitzpatrick_scale:!1,category:"symbols"},star_of_david:{keywords:["judaism"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2721" src="2721.png"/>',fitzpatrick_scale:!1,category:"symbols"},six_pointed_star:{keywords:["purple-square","religion","jewish","hexagram"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd2f" src="1f52f.png"/>',fitzpatrick_scale:!1,category:"symbols"},menorah:{keywords:["hanukkah","candles","jewish"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd4e" src="1f54e.png"/>',fitzpatrick_scale:!1,category:"symbols"},yin_yang:{keywords:["balance"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u262f" src="262f.png"/>',fitzpatrick_scale:!1,category:"symbols"},orthodox_cross:{keywords:["suppedaneum","religion"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2626" src="2626.png"/>',fitzpatrick_scale:!1,category:"symbols"},place_of_worship:{keywords:["religion","church","temple","prayer"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uded0" src="1f6d0.png"/>',fitzpatrick_scale:!1,category:"symbols"},ophiuchus:{keywords:["sign","purple-square","constellation","astrology"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26ce" src="26ce.png"/>',fitzpatrick_scale:!1,category:"symbols"},aries:{keywords:["sign","purple-square","zodiac","astrology"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2648" src="2648.png"/>',fitzpatrick_scale:!1,category:"symbols"},taurus:{keywords:["purple-square","sign","zodiac","astrology"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2649" src="2649.png"/>',fitzpatrick_scale:!1,category:"symbols"},gemini:{keywords:["sign","zodiac","purple-square","astrology"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u264a" src="264a.png"/>',fitzpatrick_scale:!1,category:"symbols"},cancer:{keywords:["sign","zodiac","purple-square","astrology"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u264b" src="264b.png"/>',fitzpatrick_scale:!1,category:"symbols"},leo:{keywords:["sign","purple-square","zodiac","astrology"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u264c" src="264c.png"/>',fitzpatrick_scale:!1,category:"symbols"},virgo:{keywords:["sign","zodiac","purple-square","astrology"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u264d" src="264d.png"/>',fitzpatrick_scale:!1,category:"symbols"},libra:{keywords:["sign","purple-square","zodiac","astrology"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u264e" src="264e.png"/>',fitzpatrick_scale:!1,category:"symbols"},scorpius:{keywords:["sign","zodiac","purple-square","astrology","scorpio"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u264f" src="264f.png"/>',fitzpatrick_scale:!1,category:"symbols"},sagittarius:{keywords:["sign","zodiac","purple-square","astrology"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2650" src="2650.png"/>',fitzpatrick_scale:!1,category:"symbols"},capricorn:{keywords:["sign","zodiac","purple-square","astrology"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2651" src="2651.png"/>',fitzpatrick_scale:!1,category:"symbols"},aquarius:{keywords:["sign","purple-square","zodiac","astrology"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2652" src="2652.png"/>',fitzpatrick_scale:!1,category:"symbols"},pisces:{keywords:["purple-square","sign","zodiac","astrology"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2653" src="2653.png"/>',fitzpatrick_scale:!1,category:"symbols"},id:{keywords:["purple-square","words"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udd94" src="1f194.png"/>',fitzpatrick_scale:!1,category:"symbols"},atom_symbol:{keywords:["science","physics","chemistry"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u269b" src="269b.png"/>',fitzpatrick_scale:!1,category:"symbols"},u7a7a:{keywords:["kanji","japanese","chinese","empty","sky","blue-square"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\ude33" src="1f233.png"/>',fitzpatrick_scale:!1,category:"symbols"},u5272:{keywords:["cut","divide","chinese","kanji","pink-square"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\ude39" src="1f239.png"/>',fitzpatrick_scale:!1,category:"symbols"},radioactive:{keywords:["nuclear","danger"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2622" src="2622.png"/>',fitzpatrick_scale:!1,category:"symbols"},biohazard:{keywords:["danger"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2623" src="2623.png"/>',fitzpatrick_scale:!1,category:"symbols"},mobile_phone_off:{keywords:["mute","orange-square","silence","quiet"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcf4" src="1f4f4.png"/>',fitzpatrick_scale:!1,category:"symbols"},vibration_mode:{keywords:["orange-square","phone"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcf3" src="1f4f3.png"/>',fitzpatrick_scale:!1,category:"symbols"},u6709:{keywords:["orange-square","chinese","have","kanji"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\ude36" src="1f236.png"/>',fitzpatrick_scale:!1,category:"symbols"},u7121:{keywords:["nothing","chinese","kanji","japanese","orange-square"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\ude1a" src="1f21a.png"/>',fitzpatrick_scale:!1,category:"symbols"},u7533:{keywords:["chinese","japanese","kanji","orange-square"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\ude38" src="1f238.png"/>',fitzpatrick_scale:!1,category:"symbols"},u55b6:{keywords:["japanese","opening hours","orange-square"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\ude3a" src="1f23a.png"/>',fitzpatrick_scale:!1,category:"symbols"},u6708:{keywords:["chinese","month","moon","japanese","orange-square","kanji"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\ude37\ufe0f" src="1f237.png"/>',fitzpatrick_scale:!1,category:"symbols"},eight_pointed_black_star:{keywords:["orange-square","shape","polygon"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2734\ufe0f" src="2734.png"/>',fitzpatrick_scale:!1,category:"symbols"},vs:{keywords:["words","orange-square"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udd9a" src="1f19a.png"/>',fitzpatrick_scale:!1,category:"symbols"},accept:{keywords:["ok","good","chinese","kanji","agree","yes","orange-circle"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\ude51" src="1f251.png"/>',fitzpatrick_scale:!1,category:"symbols"},white_flower:{keywords:["japanese","spring"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcae" src="1f4ae.png"/>',fitzpatrick_scale:!1,category:"symbols"},ideograph_advantage:{keywords:["chinese","kanji","obtain","get","circle"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\ude50" src="1f250.png"/>',fitzpatrick_scale:!1,category:"symbols"},secret:{keywords:["privacy","chinese","sshh","kanji","red-circle"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u3299\ufe0f" src="3299.png"/>',fitzpatrick_scale:!1,category:"symbols"},congratulations:{keywords:["chinese","kanji","japanese","red-circle"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u3297\ufe0f" src="3297.png"/>',fitzpatrick_scale:!1,category:"symbols"},u5408:{keywords:["japanese","chinese","join","kanji","red-square"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\ude34" src="1f234.png"/>',fitzpatrick_scale:!1,category:"symbols"},u6e80:{keywords:["full","chinese","japanese","red-square","kanji"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\ude35" src="1f235.png"/>',fitzpatrick_scale:!1,category:"symbols"},u7981:{keywords:["kanji","japanese","chinese","forbidden","limit","restricted","red-square"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\ude32" src="1f232.png"/>',fitzpatrick_scale:!1,category:"symbols"},a:{keywords:["red-square","alphabet","letter"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udd70\ufe0f" src="1f170.png"/>',fitzpatrick_scale:!1,category:"symbols"},b:{keywords:["red-square","alphabet","letter"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udd71\ufe0f" src="1f171.png"/>',fitzpatrick_scale:!1,category:"symbols"},ab:{keywords:["red-square","alphabet"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udd8e" src="1f18e.png"/>',fitzpatrick_scale:!1,category:"symbols"},cl:{keywords:["alphabet","words","red-square"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udd91" src="1f191.png"/>',fitzpatrick_scale:!1,category:"symbols"},o2:{keywords:["alphabet","red-square","letter"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udd7e\ufe0f" src="1f17e.png"/>',fitzpatrick_scale:!1,category:"symbols"},sos:{keywords:["help","red-square","words","emergency","911"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udd98" src="1f198.png"/>',fitzpatrick_scale:!1,category:"symbols"},no_entry:{keywords:["limit","security","privacy","bad","denied","stop","circle"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26d4" src="26d4.png"/>',fitzpatrick_scale:!1,category:"symbols"},name_badge:{keywords:["fire","forbid"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcdb" src="1f4db.png"/>',fitzpatrick_scale:!1,category:"symbols"},no_entry_sign:{keywords:["forbid","stop","limit","denied","disallow","circle"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeab" src="1f6ab.png"/>',fitzpatrick_scale:!1,category:"symbols"},x:{keywords:["no","delete","remove","cancel","red"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u274c" src="274c.png"/>',fitzpatrick_scale:!1,category:"symbols"},o:{keywords:["circle","round"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2b55" src="2b55.png"/>',fitzpatrick_scale:!1,category:"symbols"},stop_sign:{keywords:["stop"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uded1" src="1f6d1.png"/>',fitzpatrick_scale:!1,category:"symbols"},anger:{keywords:["angry","mad"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udca2" src="1f4a2.png"/>',fitzpatrick_scale:!1,category:"symbols"},hotsprings:{keywords:["bath","warm","relax"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2668\ufe0f" src="2668.png"/>',fitzpatrick_scale:!1,category:"symbols"},no_pedestrians:{keywords:["rules","crossing","walking","circle"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeb7" src="1f6b7.png"/>',fitzpatrick_scale:!1,category:"symbols"},do_not_litter:{keywords:["trash","bin","garbage","circle"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeaf" src="1f6af.png"/>',fitzpatrick_scale:!1,category:"symbols"},no_bicycles:{keywords:["cyclist","prohibited","circle"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeb3" src="1f6b3.png"/>',fitzpatrick_scale:!1,category:"symbols"},"non-potable_water":{keywords:["drink","faucet","tap","circle"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeb1" src="1f6b1.png"/>',fitzpatrick_scale:!1,category:"symbols"},underage:{keywords:["18","drink","pub","night","minor","circle"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd1e" src="1f51e.png"/>',fitzpatrick_scale:!1,category:"symbols"},no_mobile_phones:{keywords:["iphone","mute","circle"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcf5" src="1f4f5.png"/>',fitzpatrick_scale:!1,category:"symbols"},exclamation:{keywords:["heavy_exclamation_mark","danger","surprise","punctuation","wow","warning"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2757" src="2757.png"/>',fitzpatrick_scale:!1,category:"symbols"},grey_exclamation:{keywords:["surprise","punctuation","gray","wow","warning"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2755" src="2755.png"/>',fitzpatrick_scale:!1,category:"symbols"},question:{keywords:["doubt","confused"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2753" src="2753.png"/>',fitzpatrick_scale:!1,category:"symbols"},grey_question:{keywords:["doubts","gray","huh","confused"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2754" src="2754.png"/>',fitzpatrick_scale:!1,category:"symbols"},bangbang:{keywords:["exclamation","surprise"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u203c\ufe0f" src="203c.png"/>',fitzpatrick_scale:!1,category:"symbols"},interrobang:{keywords:["wat","punctuation","surprise"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2049\ufe0f" src="2049.png"/>',fitzpatrick_scale:!1,category:"symbols"},low_brightness:{keywords:["sun","afternoon","warm","summer"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd05" src="1f505.png"/>',fitzpatrick_scale:!1,category:"symbols"},high_brightness:{keywords:["sun","light"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd06" src="1f506.png"/>',fitzpatrick_scale:!1,category:"symbols"},trident:{keywords:["weapon","spear"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd31" src="1f531.png"/>',fitzpatrick_scale:!1,category:"symbols"},fleur_de_lis:{keywords:["decorative","scout"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u269c" src="269c.png"/>',fitzpatrick_scale:!1,category:"symbols"},part_alternation_mark:{keywords:["graph","presentation","stats","business","economics","bad"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u303d\ufe0f" src="303d.png"/>',fitzpatrick_scale:!1,category:"symbols"},warning:{keywords:["exclamation","wip","alert","error","problem","issue"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26a0\ufe0f" src="26a0.png"/>',fitzpatrick_scale:!1,category:"symbols"},children_crossing:{keywords:["school","warning","danger","sign","driving","yellow-diamond"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeb8" src="1f6b8.png"/>',fitzpatrick_scale:!1,category:"symbols"},beginner:{keywords:["badge","shield"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd30" src="1f530.png"/>',fitzpatrick_scale:!1,category:"symbols"},recycle:{keywords:["arrow","environment","garbage","trash"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u267b\ufe0f" src="267b.png"/>',fitzpatrick_scale:!1,category:"symbols"},u6307:{keywords:["chinese","point","green-square","kanji"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\ude2f" src="1f22f.png"/>',fitzpatrick_scale:!1,category:"symbols"},chart:{keywords:["green-square","graph","presentation","stats"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcb9" src="1f4b9.png"/>',fitzpatrick_scale:!1,category:"symbols"},sparkle:{keywords:["stars","green-square","awesome","good","fireworks"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2747\ufe0f" src="2747.png"/>',fitzpatrick_scale:!1,category:"symbols"},eight_spoked_asterisk:{keywords:["star","sparkle","green-square"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2733\ufe0f" src="2733.png"/>',fitzpatrick_scale:!1,category:"symbols"},negative_squared_cross_mark:{keywords:["x","green-square","no","deny"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u274e" src="274e.png"/>',fitzpatrick_scale:!1,category:"symbols"},white_check_mark:{keywords:["green-square","ok","agree","vote","election","answer","tick"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2705" src="2705.png"/>',fitzpatrick_scale:!1,category:"symbols"},diamond_shape_with_a_dot_inside:{keywords:["jewel","blue","gem","crystal","fancy"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udca0" src="1f4a0.png"/>',fitzpatrick_scale:!1,category:"symbols"},cyclone:{keywords:["weather","swirl","blue","cloud","vortex","spiral","whirlpool","spin","tornado","hurricane","typhoon"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf00" src="1f300.png"/>',fitzpatrick_scale:!1,category:"symbols"},loop:{keywords:["tape","cassette"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u27bf" src="27bf.png"/>',fitzpatrick_scale:!1,category:"symbols"},globe_with_meridians:{keywords:["earth","international","world","internet","interweb","i18n"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf10" src="1f310.png"/>',fitzpatrick_scale:!1,category:"symbols"},m:{keywords:["alphabet","blue-circle","letter"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u24c2\ufe0f" src="24c2.png"/>',fitzpatrick_scale:!1,category:"symbols"},atm:{keywords:["money","sales","cash","blue-square","payment","bank"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfe7" src="1f3e7.png"/>',fitzpatrick_scale:!1,category:"symbols"},sa:{keywords:["japanese","blue-square","katakana"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\ude02\ufe0f" src="1f202.png"/>',fitzpatrick_scale:!1,category:"symbols"},passport_control:{keywords:["custom","blue-square"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udec2" src="1f6c2.png"/>',fitzpatrick_scale:!1,category:"symbols"},customs:{keywords:["passport","border","blue-square"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udec3" src="1f6c3.png"/>',fitzpatrick_scale:!1,category:"symbols"},baggage_claim:{keywords:["blue-square","airport","transport"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udec4" src="1f6c4.png"/>',fitzpatrick_scale:!1,category:"symbols"},left_luggage:{keywords:["blue-square","travel"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udec5" src="1f6c5.png"/>',fitzpatrick_scale:!1,category:"symbols"},wheelchair:{keywords:["blue-square","disabled","a11y","accessibility"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u267f" src="267f.png"/>',fitzpatrick_scale:!1,category:"symbols"},no_smoking:{keywords:["cigarette","blue-square","smell","smoke"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udead" src="1f6ad.png"/>',fitzpatrick_scale:!1,category:"symbols"},wc:{keywords:["toilet","restroom","blue-square"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udebe" src="1f6be.png"/>',fitzpatrick_scale:!1,category:"symbols"},parking:{keywords:["cars","blue-square","alphabet","letter"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udd7f\ufe0f" src="1f17f.png"/>',fitzpatrick_scale:!1,category:"symbols"},potable_water:{keywords:["blue-square","liquid","restroom","cleaning","faucet"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeb0" src="1f6b0.png"/>',fitzpatrick_scale:!1,category:"symbols"},mens:{keywords:["toilet","restroom","wc","blue-square","gender","male"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeb9" src="1f6b9.png"/>',fitzpatrick_scale:!1,category:"symbols"},womens:{keywords:["purple-square","woman","female","toilet","loo","restroom","gender"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeba" src="1f6ba.png"/>',fitzpatrick_scale:!1,category:"symbols"},baby_symbol:{keywords:["orange-square","child"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udebc" src="1f6bc.png"/>',fitzpatrick_scale:!1,category:"symbols"},restroom:{keywords:["blue-square","toilet","refresh","wc","gender"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udebb" src="1f6bb.png"/>',fitzpatrick_scale:!1,category:"symbols"},put_litter_in_its_place:{keywords:["blue-square","sign","human","info"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udeae" src="1f6ae.png"/>',fitzpatrick_scale:!1,category:"symbols"},cinema:{keywords:["blue-square","record","film","movie","curtain","stage","theater"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfa6" src="1f3a6.png"/>',fitzpatrick_scale:!1,category:"symbols"},signal_strength:{keywords:["blue-square","reception","phone","internet","connection","wifi","bluetooth","bars"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcf6" src="1f4f6.png"/>',fitzpatrick_scale:!1,category:"symbols"},koko:{keywords:["blue-square","here","katakana","japanese","destination"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\ude01" src="1f201.png"/>',fitzpatrick_scale:!1,category:"symbols"},ng:{keywords:["blue-square","words","shape","icon"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udd96" src="1f196.png"/>',fitzpatrick_scale:!1,category:"symbols"},ok:{keywords:["good","agree","yes","blue-square"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udd97" src="1f197.png"/>',fitzpatrick_scale:!1,category:"symbols"},up:{keywords:["blue-square","above","high"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udd99" src="1f199.png"/>',fitzpatrick_scale:!1,category:"symbols"},cool:{keywords:["words","blue-square"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udd92" src="1f192.png"/>',fitzpatrick_scale:!1,category:"symbols"},new:{keywords:["blue-square","words","start"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udd95" src="1f195.png"/>',fitzpatrick_scale:!1,category:"symbols"},free:{keywords:["blue-square","words"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udd93" src="1f193.png"/>',fitzpatrick_scale:!1,category:"symbols"},zero:{keywords:["0","numbers","blue-square","null"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="0\ufe0f\u20e3" src="30-20e3.png"/>',fitzpatrick_scale:!1,category:"symbols"},one:{keywords:["blue-square","numbers","1"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="1\ufe0f\u20e3" src="31-20e3.png"/>',fitzpatrick_scale:!1,category:"symbols"},two:{keywords:["numbers","2","prime","blue-square"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="2\ufe0f\u20e3" src="32-20e3.png"/>',fitzpatrick_scale:!1,category:"symbols"},three:{keywords:["3","numbers","prime","blue-square"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="3\ufe0f\u20e3" src="33-20e3.png"/>',fitzpatrick_scale:!1,category:"symbols"},four:{keywords:["4","numbers","blue-square"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="4\ufe0f\u20e3" src="34-20e3.png"/>',fitzpatrick_scale:!1,category:"symbols"},five:{keywords:["5","numbers","blue-square","prime"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="5\ufe0f\u20e3" src="35-20e3.png"/>',fitzpatrick_scale:!1,category:"symbols"},six:{keywords:["6","numbers","blue-square"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="6\ufe0f\u20e3" src="36-20e3.png"/>',fitzpatrick_scale:!1,category:"symbols"},seven:{keywords:["7","numbers","blue-square","prime"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="7\ufe0f\u20e3" src="37-20e3.png"/>',fitzpatrick_scale:!1,category:"symbols"},eight:{keywords:["8","blue-square","numbers"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="8\ufe0f\u20e3" src="38-20e3.png"/>',fitzpatrick_scale:!1,category:"symbols"},nine:{keywords:["blue-square","numbers","9"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="9\ufe0f\u20e3" src="39-20e3.png"/>',fitzpatrick_scale:!1,category:"symbols"},keycap_ten:{keywords:["numbers","10","blue-square"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd1f" src="1f51f.png"/>',fitzpatrick_scale:!1,category:"symbols"},asterisk:{keywords:["star","keycap"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="*\u20e3" src="2a-20e3.png"/>',fitzpatrick_scale:!1,category:"symbols"},eject_button:{keywords:["blue-square"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u23cf\ufe0f" src="23cf.png"/>',fitzpatrick_scale:!1,category:"symbols"},arrow_forward:{keywords:["blue-square","right","direction","play"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u25b6\ufe0f" src="25b6.png"/>',fitzpatrick_scale:!1,category:"symbols"},pause_button:{keywords:["pause","blue-square"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u23f8" src="23f8.png"/>',fitzpatrick_scale:!1,category:"symbols"},next_track_button:{keywords:["forward","next","blue-square"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u23ed" src="23ed.png"/>',fitzpatrick_scale:!1,category:"symbols"},stop_button:{keywords:["blue-square"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u23f9" src="23f9.png"/>',fitzpatrick_scale:!1,category:"symbols"},record_button:{keywords:["blue-square"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u23fa" src="23fa.png"/>',fitzpatrick_scale:!1,category:"symbols"},play_or_pause_button:{keywords:["blue-square","play","pause"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u23ef" src="23ef.png"/>',fitzpatrick_scale:!1,category:"symbols"},previous_track_button:{keywords:["backward"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u23ee" src="23ee.png"/>',fitzpatrick_scale:!1,category:"symbols"},fast_forward:{keywords:["blue-square","play","speed","continue"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u23e9" src="23e9.png"/>',fitzpatrick_scale:!1,category:"symbols"},rewind:{keywords:["play","blue-square"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u23ea" src="23ea.png"/>',fitzpatrick_scale:!1,category:"symbols"},twisted_rightwards_arrows:{keywords:["blue-square","shuffle","music","random"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd00" src="1f500.png"/>',fitzpatrick_scale:!1,category:"symbols"},repeat:{keywords:["loop","record"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd01" src="1f501.png"/>',fitzpatrick_scale:!1,category:"symbols"},repeat_one:{keywords:["blue-square","loop"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd02" src="1f502.png"/>',fitzpatrick_scale:!1,category:"symbols"},arrow_backward:{keywords:["blue-square","left","direction"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u25c0\ufe0f" src="25c0.png"/>',fitzpatrick_scale:!1,category:"symbols"},arrow_up_small:{keywords:["blue-square","triangle","direction","point","forward","top"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd3c" src="1f53c.png"/>',fitzpatrick_scale:!1,category:"symbols"},arrow_down_small:{keywords:["blue-square","direction","bottom"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd3d" src="1f53d.png"/>',fitzpatrick_scale:!1,category:"symbols"},arrow_double_up:{keywords:["blue-square","direction","top"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u23eb" src="23eb.png"/>',fitzpatrick_scale:!1,category:"symbols"},arrow_double_down:{keywords:["blue-square","direction","bottom"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u23ec" src="23ec.png"/>',fitzpatrick_scale:!1,category:"symbols"},arrow_right:{keywords:["blue-square","next"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u27a1\ufe0f" src="27a1.png"/>',fitzpatrick_scale:!1,category:"symbols"},arrow_left:{keywords:["blue-square","previous","back"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2b05\ufe0f" src="2b05.png"/>',fitzpatrick_scale:!1,category:"symbols"},arrow_up:{keywords:["blue-square","continue","top","direction"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2b06\ufe0f" src="2b06.png"/>',fitzpatrick_scale:!1,category:"symbols"},arrow_down:{keywords:["blue-square","direction","bottom"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2b07\ufe0f" src="2b07.png"/>',fitzpatrick_scale:!1,category:"symbols"},arrow_upper_right:{keywords:["blue-square","point","direction","diagonal","northeast"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2197\ufe0f" src="2197.png"/>',fitzpatrick_scale:!1,category:"symbols"},arrow_lower_right:{keywords:["blue-square","direction","diagonal","southeast"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2198\ufe0f" src="2198.png"/>',fitzpatrick_scale:!1,category:"symbols"},arrow_lower_left:{keywords:["blue-square","direction","diagonal","southwest"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2199\ufe0f" src="2199.png"/>',fitzpatrick_scale:!1,category:"symbols"},arrow_upper_left:{keywords:["blue-square","point","direction","diagonal","northwest"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2196\ufe0f" src="2196.png"/>',fitzpatrick_scale:!1,category:"symbols"},arrow_up_down:{keywords:["blue-square","direction","way","vertical"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2195\ufe0f" src="2195.png"/>',fitzpatrick_scale:!1,category:"symbols"},left_right_arrow:{keywords:["shape","direction","horizontal","sideways"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2194\ufe0f" src="2194.png"/>',fitzpatrick_scale:!1,category:"symbols"},arrows_counterclockwise:{keywords:["blue-square","sync","cycle"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd04" src="1f504.png"/>',fitzpatrick_scale:!1,category:"symbols"},arrow_right_hook:{keywords:["blue-square","return","rotate","direction"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u21aa\ufe0f" src="21aa.png"/>',fitzpatrick_scale:!1,category:"symbols"},leftwards_arrow_with_hook:{keywords:["back","return","blue-square","undo","enter"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u21a9\ufe0f" src="21a9.png"/>',fitzpatrick_scale:!1,category:"symbols"},arrow_heading_up:{keywords:["blue-square","direction","top"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2934\ufe0f" src="2934.png"/>',fitzpatrick_scale:!1,category:"symbols"},arrow_heading_down:{keywords:["blue-square","direction","bottom"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2935\ufe0f" src="2935.png"/>',fitzpatrick_scale:!1,category:"symbols"},hash:{keywords:["symbol","blue-square","twitter"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="#\ufe0f\u20e3" src="23-20e3.png"/>',fitzpatrick_scale:!1,category:"symbols"},information_source:{keywords:["blue-square","alphabet","letter"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2139\ufe0f" src="2139.png"/>',fitzpatrick_scale:!1,category:"symbols"},abc:{keywords:["blue-square","alphabet"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd24" src="1f524.png"/>',fitzpatrick_scale:!1,category:"symbols"},abcd:{keywords:["blue-square","alphabet"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd21" src="1f521.png"/>',fitzpatrick_scale:!1,category:"symbols"},capital_abcd:{keywords:["alphabet","words","blue-square"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd20" src="1f520.png"/>',fitzpatrick_scale:!1,category:"symbols"},symbols:{keywords:["blue-square","music","note","ampersand","percent","glyphs","characters"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd23" src="1f523.png"/>',fitzpatrick_scale:!1,category:"symbols"},musical_note:{keywords:["score","tone","sound"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfb5" src="1f3b5.png"/>',fitzpatrick_scale:!1,category:"symbols"},notes:{keywords:["music","score"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfb6" src="1f3b6.png"/>',fitzpatrick_scale:!1,category:"symbols"},wavy_dash:{keywords:["draw","line","moustache","mustache","squiggle","scribble"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u3030\ufe0f" src="3030.png"/>',fitzpatrick_scale:!1,category:"symbols"},curly_loop:{keywords:["scribble","draw","shape","squiggle"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u27b0" src="27b0.png"/>',fitzpatrick_scale:!1,category:"symbols"},heavy_check_mark:{keywords:["ok","nike","answer","yes","tick"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2714\ufe0f" src="2714.png"/>',fitzpatrick_scale:!1,category:"symbols"},arrows_clockwise:{keywords:["sync","cycle","round","repeat"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd03" src="1f503.png"/>',fitzpatrick_scale:!1,category:"symbols"},heavy_plus_sign:{keywords:["math","calculation","addition","more","increase"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2795" src="2795.png"/>',fitzpatrick_scale:!1,category:"symbols"},heavy_minus_sign:{keywords:["math","calculation","subtract","less"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2796" src="2796.png"/>',fitzpatrick_scale:!1,category:"symbols"},heavy_division_sign:{keywords:["divide","math","calculation"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2797" src="2797.png"/>',fitzpatrick_scale:!1,category:"symbols"},heavy_multiplication_x:{keywords:["math","calculation"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2716\ufe0f" src="2716.png"/>',fitzpatrick_scale:!1,category:"symbols"},infinity:{keywords:["forever"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u267e" src="267e.png"/>',fitzpatrick_scale:!1,category:"symbols"},heavy_dollar_sign:{keywords:["money","sales","payment","currency","buck"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcb2" src="1f4b2.png"/>',fitzpatrick_scale:!1,category:"symbols"},currency_exchange:{keywords:["money","sales","dollar","travel"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcb1" src="1f4b1.png"/>',fitzpatrick_scale:!1,category:"symbols"},copyright:{keywords:["ip","license","circle","law","legal"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\xa9\ufe0f" src="a9.png"/>',fitzpatrick_scale:!1,category:"symbols"},registered:{keywords:["alphabet","circle"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\xae\ufe0f" src="ae.png"/>',fitzpatrick_scale:!1,category:"symbols"},tm:{keywords:["trademark","brand","law","legal"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2122\ufe0f" src="2122.png"/>',fitzpatrick_scale:!1,category:"symbols"},end:{keywords:["words","arrow"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd1a" src="1f51a.png"/>',fitzpatrick_scale:!1,category:"symbols"},back:{keywords:["arrow","words","return"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd19" src="1f519.png"/>',fitzpatrick_scale:!1,category:"symbols"},on:{keywords:["arrow","words"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd1b" src="1f51b.png"/>',fitzpatrick_scale:!1,category:"symbols"},top:{keywords:["words","blue-square"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd1d" src="1f51d.png"/>',fitzpatrick_scale:!1,category:"symbols"},soon:{keywords:["arrow","words"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd1c" src="1f51c.png"/>',fitzpatrick_scale:!1,category:"symbols"},ballot_box_with_check:{keywords:["ok","agree","confirm","black-square","vote","election","yes","tick"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2611\ufe0f" src="2611.png"/>',fitzpatrick_scale:!1,category:"symbols"},radio_button:{keywords:["input","old","music","circle"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd18" src="1f518.png"/>',fitzpatrick_scale:!1,category:"symbols"},white_circle:{keywords:["shape","round"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26aa" src="26aa.png"/>',fitzpatrick_scale:!1,category:"symbols"},black_circle:{keywords:["shape","button","round"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u26ab" src="26ab.png"/>',fitzpatrick_scale:!1,category:"symbols"},red_circle:{keywords:["shape","error","danger"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd34" src="1f534.png"/>',fitzpatrick_scale:!1,category:"symbols"},large_blue_circle:{keywords:["shape","icon","button"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd35" src="1f535.png"/>',fitzpatrick_scale:!1,category:"symbols"},small_orange_diamond:{keywords:["shape","jewel","gem"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd38" src="1f538.png"/>',fitzpatrick_scale:!1,category:"symbols"},small_blue_diamond:{keywords:["shape","jewel","gem"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd39" src="1f539.png"/>',fitzpatrick_scale:!1,category:"symbols"},large_orange_diamond:{keywords:["shape","jewel","gem"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd36" src="1f536.png"/>',fitzpatrick_scale:!1,category:"symbols"},large_blue_diamond:{keywords:["shape","jewel","gem"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd37" src="1f537.png"/>',fitzpatrick_scale:!1,category:"symbols"},small_red_triangle:{keywords:["shape","direction","up","top"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd3a" src="1f53a.png"/>',fitzpatrick_scale:!1,category:"symbols"},black_small_square:{keywords:["shape","icon"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u25aa\ufe0f" src="25aa.png"/>',fitzpatrick_scale:!1,category:"symbols"},white_small_square:{keywords:["shape","icon"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u25ab\ufe0f" src="25ab.png"/>',fitzpatrick_scale:!1,category:"symbols"},black_large_square:{keywords:["shape","icon","button"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2b1b" src="2b1b.png"/>',fitzpatrick_scale:!1,category:"symbols"},white_large_square:{keywords:["shape","icon","stone","button"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2b1c" src="2b1c.png"/>',fitzpatrick_scale:!1,category:"symbols"},small_red_triangle_down:{keywords:["shape","direction","bottom"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd3b" src="1f53b.png"/>',fitzpatrick_scale:!1,category:"symbols"},black_medium_square:{keywords:["shape","button","icon"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u25fc\ufe0f" src="25fc.png"/>',fitzpatrick_scale:!1,category:"symbols"},white_medium_square:{keywords:["shape","stone","icon"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u25fb\ufe0f" src="25fb.png"/>',fitzpatrick_scale:!1,category:"symbols"},black_medium_small_square:{keywords:["icon","shape","button"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u25fe" src="25fe.png"/>',fitzpatrick_scale:!1,category:"symbols"},white_medium_small_square:{keywords:["shape","stone","icon","button"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u25fd" src="25fd.png"/>',fitzpatrick_scale:!1,category:"symbols"},black_square_button:{keywords:["shape","input","frame"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd32" src="1f532.png"/>',fitzpatrick_scale:!1,category:"symbols"},white_square_button:{keywords:["shape","input"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd33" src="1f533.png"/>',fitzpatrick_scale:!1,category:"symbols"},speaker:{keywords:["sound","volume","silence","broadcast"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd08" src="1f508.png"/>',fitzpatrick_scale:!1,category:"symbols"},sound:{keywords:["volume","speaker","broadcast"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd09" src="1f509.png"/>',fitzpatrick_scale:!1,category:"symbols"},loud_sound:{keywords:["volume","noise","noisy","speaker","broadcast"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd0a" src="1f50a.png"/>',fitzpatrick_scale:!1,category:"symbols"},mute:{keywords:["sound","volume","silence","quiet"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd07" src="1f507.png"/>',fitzpatrick_scale:!1,category:"symbols"},mega:{keywords:["sound","speaker","volume"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udce3" src="1f4e3.png"/>',fitzpatrick_scale:!1,category:"symbols"},loudspeaker:{keywords:["volume","sound"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udce2" src="1f4e2.png"/>',fitzpatrick_scale:!1,category:"symbols"},bell:{keywords:["sound","notification","christmas","xmas","chime"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd14" src="1f514.png"/>',fitzpatrick_scale:!1,category:"symbols"},no_bell:{keywords:["sound","volume","mute","quiet","silent"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd15" src="1f515.png"/>',fitzpatrick_scale:!1,category:"symbols"},black_joker:{keywords:["poker","cards","game","play","magic"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udccf" src="1f0cf.png"/>',fitzpatrick_scale:!1,category:"symbols"},mahjong:{keywords:["game","play","chinese","kanji"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udc04" src="1f004.png"/>',fitzpatrick_scale:!1,category:"symbols"},spades:{keywords:["poker","cards","suits","magic"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2660\ufe0f" src="2660.png"/>',fitzpatrick_scale:!1,category:"symbols"},clubs:{keywords:["poker","cards","magic","suits"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2663\ufe0f" src="2663.png"/>',fitzpatrick_scale:!1,category:"symbols"},hearts:{keywords:["poker","cards","magic","suits"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2665\ufe0f" src="2665.png"/>',fitzpatrick_scale:!1,category:"symbols"},diamonds:{keywords:["poker","cards","magic","suits"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\u2666\ufe0f" src="2666.png"/>',fitzpatrick_scale:!1,category:"symbols"},flower_playing_cards:{keywords:["game","sunset","red"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfb4" src="1f3b4.png"/>',fitzpatrick_scale:!1,category:"symbols"},thought_balloon:{keywords:["bubble","cloud","speech","thinking","dream"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcad" src="1f4ad.png"/>',fitzpatrick_scale:!1,category:"symbols"},right_anger_bubble:{keywords:["caption","speech","thinking","mad"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\uddef" src="1f5ef.png"/>',fitzpatrick_scale:!1,category:"symbols"},speech_balloon:{keywords:["bubble","words","message","talk","chatting"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udcac" src="1f4ac.png"/>',fitzpatrick_scale:!1,category:"symbols"},left_speech_bubble:{keywords:["words","message","talk","chatting"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udde8" src="1f5e8.png"/>',fitzpatrick_scale:!1,category:"symbols"},clock1:{keywords:["time","late","early","schedule"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd50" src="1f550.png"/>',fitzpatrick_scale:!1,category:"symbols"},clock2:{keywords:["time","late","early","schedule"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd51" src="1f551.png"/>',fitzpatrick_scale:!1,category:"symbols"},clock3:{keywords:["time","late","early","schedule"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd52" src="1f552.png"/>',fitzpatrick_scale:!1,category:"symbols"},clock4:{keywords:["time","late","early","schedule"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd53" src="1f553.png"/>',fitzpatrick_scale:!1,category:"symbols"},clock5:{keywords:["time","late","early","schedule"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd54" src="1f554.png"/>',fitzpatrick_scale:!1,category:"symbols"},clock6:{keywords:["time","late","early","schedule","dawn","dusk"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd55" src="1f555.png"/>',fitzpatrick_scale:!1,category:"symbols"},clock7:{keywords:["time","late","early","schedule"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd56" src="1f556.png"/>',fitzpatrick_scale:!1,category:"symbols"},clock8:{keywords:["time","late","early","schedule"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd57" src="1f557.png"/>',fitzpatrick_scale:!1,category:"symbols"},clock9:{keywords:["time","late","early","schedule"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd58" src="1f558.png"/>',fitzpatrick_scale:!1,category:"symbols"},clock10:{keywords:["time","late","early","schedule"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd59" src="1f559.png"/>',fitzpatrick_scale:!1,category:"symbols"},clock11:{keywords:["time","late","early","schedule"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd5a" src="1f55a.png"/>',fitzpatrick_scale:!1,category:"symbols"},clock12:{keywords:["time","noon","midnight","midday","late","early","schedule"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd5b" src="1f55b.png"/>',fitzpatrick_scale:!1,category:"symbols"},clock130:{keywords:["time","late","early","schedule"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd5c" src="1f55c.png"/>',fitzpatrick_scale:!1,category:"symbols"},clock230:{keywords:["time","late","early","schedule"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd5d" src="1f55d.png"/>',fitzpatrick_scale:!1,category:"symbols"},clock330:{keywords:["time","late","early","schedule"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd5e" src="1f55e.png"/>',fitzpatrick_scale:!1,category:"symbols"},clock430:{keywords:["time","late","early","schedule"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd5f" src="1f55f.png"/>',fitzpatrick_scale:!1,category:"symbols"},clock530:{keywords:["time","late","early","schedule"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd60" src="1f560.png"/>',fitzpatrick_scale:!1,category:"symbols"},clock630:{keywords:["time","late","early","schedule"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd61" src="1f561.png"/>',fitzpatrick_scale:!1,category:"symbols"},clock730:{keywords:["time","late","early","schedule"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd62" src="1f562.png"/>',fitzpatrick_scale:!1,category:"symbols"},clock830:{keywords:["time","late","early","schedule"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd63" src="1f563.png"/>',fitzpatrick_scale:!1,category:"symbols"},clock930:{keywords:["time","late","early","schedule"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd64" src="1f564.png"/>',fitzpatrick_scale:!1,category:"symbols"},clock1030:{keywords:["time","late","early","schedule"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd65" src="1f565.png"/>',fitzpatrick_scale:!1,category:"symbols"},clock1130:{keywords:["time","late","early","schedule"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd66" src="1f566.png"/>',fitzpatrick_scale:!1,category:"symbols"},clock1230:{keywords:["time","late","early","schedule"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83d\udd67" src="1f567.png"/>',fitzpatrick_scale:!1,category:"symbols"},afghanistan:{keywords:["af","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde6\ud83c\uddeb" src="1f1e6-1f1eb.png"/>',fitzpatrick_scale:!1,category:"flags"},aland_islands:{keywords:["\xc5land","islands","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde6\ud83c\uddfd" src="1f1e6-1f1fd.png"/>',fitzpatrick_scale:!1,category:"flags"},albania:{keywords:["al","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde6\ud83c\uddf1" src="1f1e6-1f1f1.png"/>',fitzpatrick_scale:!1,category:"flags"},algeria:{keywords:["dz","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde9\ud83c\uddff" src="1f1e9-1f1ff.png"/>',fitzpatrick_scale:!1,category:"flags"},american_samoa:{keywords:["american","ws","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde6\ud83c\uddf8" src="1f1e6-1f1f8.png"/>',fitzpatrick_scale:!1,category:"flags"},andorra:{keywords:["ad","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde6\ud83c\udde9" src="1f1e6-1f1e9.png"/>',fitzpatrick_scale:!1,category:"flags"},angola:{keywords:["ao","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde6\ud83c\uddf4" src="1f1e6-1f1f4.png"/>',fitzpatrick_scale:!1,category:"flags"},anguilla:{keywords:["ai","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde6\ud83c\uddee" src="1f1e6-1f1ee.png"/>',fitzpatrick_scale:!1,category:"flags"},antarctica:{keywords:["aq","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde6\ud83c\uddf6" src="1f1e6-1f1f6.png"/>',fitzpatrick_scale:!1,category:"flags"},antigua_barbuda:{keywords:["antigua","barbuda","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde6\ud83c\uddec" src="1f1e6-1f1ec.png"/>',fitzpatrick_scale:!1,category:"flags"},argentina:{keywords:["ar","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde6\ud83c\uddf7" src="1f1e6-1f1f7.png"/>',fitzpatrick_scale:!1,category:"flags"},armenia:{keywords:["am","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde6\ud83c\uddf2" src="1f1e6-1f1f2.png"/>',fitzpatrick_scale:!1,category:"flags"},aruba:{keywords:["aw","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde6\ud83c\uddfc" src="1f1e6-1f1fc.png"/>',fitzpatrick_scale:!1,category:"flags"},australia:{keywords:["au","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde6\ud83c\uddfa" src="1f1e6-1f1fa.png"/>',fitzpatrick_scale:!1,category:"flags"},austria:{keywords:["at","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde6\ud83c\uddf9" src="1f1e6-1f1f9.png"/>',fitzpatrick_scale:!1,category:"flags"},azerbaijan:{keywords:["az","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde6\ud83c\uddff" src="1f1e6-1f1ff.png"/>',fitzpatrick_scale:!1,category:"flags"},bahamas:{keywords:["bs","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\uddf8" src="1f1e7-1f1f8.png"/>',fitzpatrick_scale:!1,category:"flags"},bahrain:{keywords:["bh","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\udded" src="1f1e7-1f1ed.png"/>',fitzpatrick_scale:!1,category:"flags"},bangladesh:{keywords:["bd","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\udde9" src="1f1e7-1f1e9.png"/>',fitzpatrick_scale:!1,category:"flags"},barbados:{keywords:["bb","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\udde7" src="1f1e7-1f1e7.png"/>',fitzpatrick_scale:!1,category:"flags"},belarus:{keywords:["by","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\uddfe" src="1f1e7-1f1fe.png"/>',fitzpatrick_scale:!1,category:"flags"},belgium:{keywords:["be","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\uddea" src="1f1e7-1f1ea.png"/>',fitzpatrick_scale:!1,category:"flags"},belize:{keywords:["bz","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\uddff" src="1f1e7-1f1ff.png"/>',fitzpatrick_scale:!1,category:"flags"},benin:{keywords:["bj","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\uddef" src="1f1e7-1f1ef.png"/>',fitzpatrick_scale:!1,category:"flags"},bermuda:{keywords:["bm","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\uddf2" src="1f1e7-1f1f2.png"/>',fitzpatrick_scale:!1,category:"flags"},bhutan:{keywords:["bt","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\uddf9" src="1f1e7-1f1f9.png"/>',fitzpatrick_scale:!1,category:"flags"},bolivia:{keywords:["bo","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\uddf4" src="1f1e7-1f1f4.png"/>',fitzpatrick_scale:!1,category:"flags"},caribbean_netherlands:{keywords:["bonaire","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\uddf6" src="1f1e7-1f1f6.png"/>',fitzpatrick_scale:!1,category:"flags"},bosnia_herzegovina:{keywords:["bosnia","herzegovina","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\udde6" src="1f1e7-1f1e6.png"/>',fitzpatrick_scale:!1,category:"flags"},botswana:{keywords:["bw","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\uddfc" src="1f1e7-1f1fc.png"/>',fitzpatrick_scale:!1,category:"flags"},brazil:{keywords:["br","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\uddf7" src="1f1e7-1f1f7.png"/>',fitzpatrick_scale:!1,category:"flags"},british_indian_ocean_territory:{keywords:["british","indian","ocean","territory","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddee\ud83c\uddf4" src="1f1ee-1f1f4.png"/>',fitzpatrick_scale:!1,category:"flags"},british_virgin_islands:{keywords:["british","virgin","islands","bvi","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfb\ud83c\uddec" src="1f1fb-1f1ec.png"/>',fitzpatrick_scale:!1,category:"flags"},brunei:{keywords:["bn","darussalam","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\uddf3" src="1f1e7-1f1f3.png"/>',fitzpatrick_scale:!1,category:"flags"},bulgaria:{keywords:["bg","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\uddec" src="1f1e7-1f1ec.png"/>',fitzpatrick_scale:!1,category:"flags"},burkina_faso:{keywords:["burkina","faso","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\uddeb" src="1f1e7-1f1eb.png"/>',fitzpatrick_scale:!1,category:"flags"},burundi:{keywords:["bi","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\uddee" src="1f1e7-1f1ee.png"/>',fitzpatrick_scale:!1,category:"flags"},cape_verde:{keywords:["cabo","verde","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\uddfb" src="1f1e8-1f1fb.png"/>',fitzpatrick_scale:!1,category:"flags"},cambodia:{keywords:["kh","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf0\ud83c\udded" src="1f1f0-1f1ed.png"/>',fitzpatrick_scale:!1,category:"flags"},cameroon:{keywords:["cm","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\uddf2" src="1f1e8-1f1f2.png"/>',fitzpatrick_scale:!1,category:"flags"},canada:{keywords:["ca","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\udde6" src="1f1e8-1f1e6.png"/>',fitzpatrick_scale:!1,category:"flags"},canary_islands:{keywords:["canary","islands","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddee\ud83c\udde8" src="1f1ee-1f1e8.png"/>',fitzpatrick_scale:!1,category:"flags"},cayman_islands:{keywords:["cayman","islands","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf0\ud83c\uddfe" src="1f1f0-1f1fe.png"/>',fitzpatrick_scale:!1,category:"flags"},central_african_republic:{keywords:["central","african","republic","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\uddeb" src="1f1e8-1f1eb.png"/>',fitzpatrick_scale:!1,category:"flags"},chad:{keywords:["td","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf9\ud83c\udde9" src="1f1f9-1f1e9.png"/>',fitzpatrick_scale:!1,category:"flags"},chile:{keywords:["flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\uddf1" src="1f1e8-1f1f1.png"/>',fitzpatrick_scale:!1,category:"flags"},cn:{keywords:["china","chinese","prc","flag","country","nation","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\uddf3" src="1f1e8-1f1f3.png"/>',fitzpatrick_scale:!1,category:"flags"},christmas_island:{keywords:["christmas","island","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\uddfd" src="1f1e8-1f1fd.png"/>',fitzpatrick_scale:!1,category:"flags"},cocos_islands:{keywords:["cocos","keeling","islands","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\udde8" src="1f1e8-1f1e8.png"/>',fitzpatrick_scale:!1,category:"flags"},colombia:{keywords:["co","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\uddf4" src="1f1e8-1f1f4.png"/>',fitzpatrick_scale:!1,category:"flags"},comoros:{keywords:["km","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf0\ud83c\uddf2" src="1f1f0-1f1f2.png"/>',fitzpatrick_scale:!1,category:"flags"},congo_brazzaville:{keywords:["congo","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\uddec" src="1f1e8-1f1ec.png"/>',fitzpatrick_scale:!1,category:"flags"},congo_kinshasa:{keywords:["congo","democratic","republic","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\udde9" src="1f1e8-1f1e9.png"/>',fitzpatrick_scale:!1,category:"flags"},cook_islands:{keywords:["cook","islands","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\uddf0" src="1f1e8-1f1f0.png"/>',fitzpatrick_scale:!1,category:"flags"},costa_rica:{keywords:["costa","rica","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\uddf7" src="1f1e8-1f1f7.png"/>',fitzpatrick_scale:!1,category:"flags"},croatia:{keywords:["hr","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udded\ud83c\uddf7" src="1f1ed-1f1f7.png"/>',fitzpatrick_scale:!1,category:"flags"},cuba:{keywords:["cu","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\uddfa" src="1f1e8-1f1fa.png"/>',fitzpatrick_scale:!1,category:"flags"},curacao:{keywords:["cura\xe7ao","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\uddfc" src="1f1e8-1f1fc.png"/>',fitzpatrick_scale:!1,category:"flags"},cyprus:{keywords:["cy","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\uddfe" src="1f1e8-1f1fe.png"/>',fitzpatrick_scale:!1,category:"flags"},czech_republic:{keywords:["cz","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\uddff" src="1f1e8-1f1ff.png"/>',fitzpatrick_scale:!1,category:"flags"},denmark:{keywords:["dk","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde9\ud83c\uddf0" src="1f1e9-1f1f0.png"/>',fitzpatrick_scale:!1,category:"flags"},djibouti:{keywords:["dj","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde9\ud83c\uddef" src="1f1e9-1f1ef.png"/>',fitzpatrick_scale:!1,category:"flags"},dominica:{keywords:["dm","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde9\ud83c\uddf2" src="1f1e9-1f1f2.png"/>',fitzpatrick_scale:!1,category:"flags"},dominican_republic:{keywords:["dominican","republic","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde9\ud83c\uddf4" src="1f1e9-1f1f4.png"/>',fitzpatrick_scale:!1,category:"flags"},ecuador:{keywords:["ec","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddea\ud83c\udde8" src="1f1ea-1f1e8.png"/>',fitzpatrick_scale:!1,category:"flags"},egypt:{keywords:["eg","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddea\ud83c\uddec" src="1f1ea-1f1ec.png"/>',fitzpatrick_scale:!1,category:"flags"},el_salvador:{keywords:["el","salvador","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\uddfb" src="1f1f8-1f1fb.png"/>',fitzpatrick_scale:!1,category:"flags"},equatorial_guinea:{keywords:["equatorial","gn","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\uddf6" src="1f1ec-1f1f6.png"/>',fitzpatrick_scale:!1,category:"flags"},eritrea:{keywords:["er","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddea\ud83c\uddf7" src="1f1ea-1f1f7.png"/>',fitzpatrick_scale:!1,category:"flags"},estonia:{keywords:["ee","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddea\ud83c\uddea" src="1f1ea-1f1ea.png"/>',fitzpatrick_scale:!1,category:"flags"},ethiopia:{keywords:["et","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddea\ud83c\uddf9" src="1f1ea-1f1f9.png"/>',fitzpatrick_scale:!1,category:"flags"},eu:{keywords:["european","union","flag","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddea\ud83c\uddfa" src="1f1ea-1f1fa.png"/>',fitzpatrick_scale:!1,category:"flags"},falkland_islands:{keywords:["falkland","islands","malvinas","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddeb\ud83c\uddf0" src="1f1eb-1f1f0.png"/>',fitzpatrick_scale:!1,category:"flags"},faroe_islands:{keywords:["faroe","islands","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddeb\ud83c\uddf4" src="1f1eb-1f1f4.png"/>',fitzpatrick_scale:!1,category:"flags"},fiji:{keywords:["fj","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddeb\ud83c\uddef" src="1f1eb-1f1ef.png"/>',fitzpatrick_scale:!1,category:"flags"},finland:{keywords:["fi","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddeb\ud83c\uddee" src="1f1eb-1f1ee.png"/>',fitzpatrick_scale:!1,category:"flags"},fr:{keywords:["banner","flag","nation","france","french","country"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddeb\ud83c\uddf7" src="1f1eb-1f1f7.png"/>',fitzpatrick_scale:!1,category:"flags"},french_guiana:{keywords:["french","guiana","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\uddeb" src="1f1ec-1f1eb.png"/>',fitzpatrick_scale:!1,category:"flags"},french_polynesia:{keywords:["french","polynesia","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf5\ud83c\uddeb" src="1f1f5-1f1eb.png"/>',fitzpatrick_scale:!1,category:"flags"},french_southern_territories:{keywords:["french","southern","territories","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf9\ud83c\uddeb" src="1f1f9-1f1eb.png"/>',fitzpatrick_scale:!1,category:"flags"},gabon:{keywords:["ga","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\udde6" src="1f1ec-1f1e6.png"/>',fitzpatrick_scale:!1,category:"flags"},gambia:{keywords:["gm","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\uddf2" src="1f1ec-1f1f2.png"/>',fitzpatrick_scale:!1,category:"flags"},georgia:{keywords:["ge","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\uddea" src="1f1ec-1f1ea.png"/>',fitzpatrick_scale:!1,category:"flags"},de:{keywords:["german","nation","flag","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde9\ud83c\uddea" src="1f1e9-1f1ea.png"/>',fitzpatrick_scale:!1,category:"flags"},ghana:{keywords:["gh","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\udded" src="1f1ec-1f1ed.png"/>',fitzpatrick_scale:!1,category:"flags"},gibraltar:{keywords:["gi","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\uddee" src="1f1ec-1f1ee.png"/>',fitzpatrick_scale:!1,category:"flags"},greece:{keywords:["gr","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\uddf7" src="1f1ec-1f1f7.png"/>',fitzpatrick_scale:!1,category:"flags"},greenland:{keywords:["gl","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\uddf1" src="1f1ec-1f1f1.png"/>',fitzpatrick_scale:!1,category:"flags"},grenada:{keywords:["gd","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\udde9" src="1f1ec-1f1e9.png"/>',fitzpatrick_scale:!1,category:"flags"},guadeloupe:{keywords:["gp","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\uddf5" src="1f1ec-1f1f5.png"/>',fitzpatrick_scale:!1,category:"flags"},guam:{keywords:["gu","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\uddfa" src="1f1ec-1f1fa.png"/>',fitzpatrick_scale:!1,category:"flags"},guatemala:{keywords:["gt","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\uddf9" src="1f1ec-1f1f9.png"/>',fitzpatrick_scale:!1,category:"flags"},guernsey:{keywords:["gg","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\uddec" src="1f1ec-1f1ec.png"/>',fitzpatrick_scale:!1,category:"flags"},guinea:{keywords:["gn","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\uddf3" src="1f1ec-1f1f3.png"/>',fitzpatrick_scale:!1,category:"flags"},guinea_bissau:{keywords:["gw","bissau","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\uddfc" src="1f1ec-1f1fc.png"/>',fitzpatrick_scale:!1,category:"flags"},guyana:{keywords:["gy","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\uddfe" src="1f1ec-1f1fe.png"/>',fitzpatrick_scale:!1,category:"flags"},haiti:{keywords:["ht","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udded\ud83c\uddf9" src="1f1ed-1f1f9.png"/>',fitzpatrick_scale:!1,category:"flags"},honduras:{keywords:["hn","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udded\ud83c\uddf3" src="1f1ed-1f1f3.png"/>',fitzpatrick_scale:!1,category:"flags"},hong_kong:{keywords:["hong","kong","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udded\ud83c\uddf0" src="1f1ed-1f1f0.png"/>',fitzpatrick_scale:!1,category:"flags"},hungary:{keywords:["hu","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udded\ud83c\uddfa" src="1f1ed-1f1fa.png"/>',fitzpatrick_scale:!1,category:"flags"},iceland:{keywords:["is","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddee\ud83c\uddf8" src="1f1ee-1f1f8.png"/>',fitzpatrick_scale:!1,category:"flags"},india:{keywords:["in","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddee\ud83c\uddf3" src="1f1ee-1f1f3.png"/>',fitzpatrick_scale:!1,category:"flags"},indonesia:{keywords:["flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddee\ud83c\udde9" src="1f1ee-1f1e9.png"/>',fitzpatrick_scale:!1,category:"flags"},iran:{keywords:["iran,","islamic","republic","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddee\ud83c\uddf7" src="1f1ee-1f1f7.png"/>',fitzpatrick_scale:!1,category:"flags"},iraq:{keywords:["iq","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddee\ud83c\uddf6" src="1f1ee-1f1f6.png"/>',fitzpatrick_scale:!1,category:"flags"},ireland:{keywords:["ie","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddee\ud83c\uddea" src="1f1ee-1f1ea.png"/>',fitzpatrick_scale:!1,category:"flags"},isle_of_man:{keywords:["isle","man","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddee\ud83c\uddf2" src="1f1ee-1f1f2.png"/>',fitzpatrick_scale:!1,category:"flags"},israel:{keywords:["il","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddee\ud83c\uddf1" src="1f1ee-1f1f1.png"/>',fitzpatrick_scale:!1,category:"flags"},it:{keywords:["italy","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddee\ud83c\uddf9" src="1f1ee-1f1f9.png"/>',fitzpatrick_scale:!1,category:"flags"},cote_divoire:{keywords:["ivory","coast","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\uddee" src="1f1e8-1f1ee.png"/>',fitzpatrick_scale:!1,category:"flags"},jamaica:{keywords:["jm","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddef\ud83c\uddf2" src="1f1ef-1f1f2.png"/>',fitzpatrick_scale:!1,category:"flags"},jp:{keywords:["japanese","nation","flag","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddef\ud83c\uddf5" src="1f1ef-1f1f5.png"/>',fitzpatrick_scale:!1,category:"flags"},jersey:{keywords:["je","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddef\ud83c\uddea" src="1f1ef-1f1ea.png"/>',fitzpatrick_scale:!1,category:"flags"},jordan:{keywords:["jo","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddef\ud83c\uddf4" src="1f1ef-1f1f4.png"/>',fitzpatrick_scale:!1,category:"flags"},kazakhstan:{keywords:["kz","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf0\ud83c\uddff" src="1f1f0-1f1ff.png"/>',fitzpatrick_scale:!1,category:"flags"},kenya:{keywords:["ke","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf0\ud83c\uddea" src="1f1f0-1f1ea.png"/>',fitzpatrick_scale:!1,category:"flags"},kiribati:{keywords:["ki","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf0\ud83c\uddee" src="1f1f0-1f1ee.png"/>',fitzpatrick_scale:!1,category:"flags"},kosovo:{keywords:["xk","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfd\ud83c\uddf0" src="1f1fd-1f1f0.png"/>',fitzpatrick_scale:!1,category:"flags"},kuwait:{keywords:["kw","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf0\ud83c\uddfc" src="1f1f0-1f1fc.png"/>',fitzpatrick_scale:!1,category:"flags"},kyrgyzstan:{keywords:["kg","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf0\ud83c\uddec" src="1f1f0-1f1ec.png"/>',fitzpatrick_scale:!1,category:"flags"},laos:{keywords:["lao","democratic","republic","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf1\ud83c\udde6" src="1f1f1-1f1e6.png"/>',fitzpatrick_scale:!1,category:"flags"},latvia:{keywords:["lv","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf1\ud83c\uddfb" src="1f1f1-1f1fb.png"/>',fitzpatrick_scale:!1,category:"flags"},lebanon:{keywords:["lb","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf1\ud83c\udde7" src="1f1f1-1f1e7.png"/>',fitzpatrick_scale:!1,category:"flags"},lesotho:{keywords:["ls","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf1\ud83c\uddf8" src="1f1f1-1f1f8.png"/>',fitzpatrick_scale:!1,category:"flags"},liberia:{keywords:["lr","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf1\ud83c\uddf7" src="1f1f1-1f1f7.png"/>',fitzpatrick_scale:!1,category:"flags"},libya:{keywords:["ly","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf1\ud83c\uddfe" src="1f1f1-1f1fe.png"/>',fitzpatrick_scale:!1,category:"flags"},liechtenstein:{keywords:["li","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf1\ud83c\uddee" src="1f1f1-1f1ee.png"/>',fitzpatrick_scale:!1,category:"flags"},lithuania:{keywords:["lt","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf1\ud83c\uddf9" src="1f1f1-1f1f9.png"/>',fitzpatrick_scale:!1,category:"flags"},luxembourg:{keywords:["lu","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf1\ud83c\uddfa" src="1f1f1-1f1fa.png"/>',fitzpatrick_scale:!1,category:"flags"},macau:{keywords:["macao","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddf4" src="1f1f2-1f1f4.png"/>',fitzpatrick_scale:!1,category:"flags"},macedonia:{keywords:["macedonia,","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddf0" src="1f1f2-1f1f0.png"/>',fitzpatrick_scale:!1,category:"flags"},madagascar:{keywords:["mg","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddec" src="1f1f2-1f1ec.png"/>',fitzpatrick_scale:!1,category:"flags"},malawi:{keywords:["mw","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddfc" src="1f1f2-1f1fc.png"/>',fitzpatrick_scale:!1,category:"flags"},malaysia:{keywords:["my","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddfe" src="1f1f2-1f1fe.png"/>',fitzpatrick_scale:!1,category:"flags"},maldives:{keywords:["mv","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddfb" src="1f1f2-1f1fb.png"/>',fitzpatrick_scale:!1,category:"flags"},mali:{keywords:["ml","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddf1" src="1f1f2-1f1f1.png"/>',fitzpatrick_scale:!1,category:"flags"},malta:{keywords:["mt","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddf9" src="1f1f2-1f1f9.png"/>',fitzpatrick_scale:!1,category:"flags"},marshall_islands:{keywords:["marshall","islands","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\udded" src="1f1f2-1f1ed.png"/>',fitzpatrick_scale:!1,category:"flags"},martinique:{keywords:["mq","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddf6" src="1f1f2-1f1f6.png"/>',fitzpatrick_scale:!1,category:"flags"},mauritania:{keywords:["mr","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddf7" src="1f1f2-1f1f7.png"/>',fitzpatrick_scale:!1,category:"flags"},mauritius:{keywords:["mu","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddfa" src="1f1f2-1f1fa.png"/>',fitzpatrick_scale:!1,category:"flags"},mayotte:{keywords:["yt","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfe\ud83c\uddf9" src="1f1fe-1f1f9.png"/>',fitzpatrick_scale:!1,category:"flags"},mexico:{keywords:["mx","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddfd" src="1f1f2-1f1fd.png"/>',fitzpatrick_scale:!1,category:"flags"},micronesia:{keywords:["micronesia,","federated","states","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddeb\ud83c\uddf2" src="1f1eb-1f1f2.png"/>',fitzpatrick_scale:!1,category:"flags"},moldova:{keywords:["moldova,","republic","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\udde9" src="1f1f2-1f1e9.png"/>',fitzpatrick_scale:!1,category:"flags"},monaco:{keywords:["mc","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\udde8" src="1f1f2-1f1e8.png"/>',fitzpatrick_scale:!1,category:"flags"},mongolia:{keywords:["mn","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddf3" src="1f1f2-1f1f3.png"/>',fitzpatrick_scale:!1,category:"flags"},montenegro:{keywords:["me","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddea" src="1f1f2-1f1ea.png"/>',fitzpatrick_scale:!1,category:"flags"},montserrat:{keywords:["ms","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddf8" src="1f1f2-1f1f8.png"/>',fitzpatrick_scale:!1,category:"flags"},morocco:{keywords:["ma","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\udde6" src="1f1f2-1f1e6.png"/>',fitzpatrick_scale:!1,category:"flags"},mozambique:{keywords:["mz","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddff" src="1f1f2-1f1ff.png"/>',fitzpatrick_scale:!1,category:"flags"},myanmar:{keywords:["mm","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddf2" src="1f1f2-1f1f2.png"/>',fitzpatrick_scale:!1,category:"flags"},namibia:{keywords:["na","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf3\ud83c\udde6" src="1f1f3-1f1e6.png"/>',fitzpatrick_scale:!1,category:"flags"},nauru:{keywords:["nr","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf3\ud83c\uddf7" src="1f1f3-1f1f7.png"/>',fitzpatrick_scale:!1,category:"flags"},nepal:{keywords:["np","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf3\ud83c\uddf5" src="1f1f3-1f1f5.png"/>',fitzpatrick_scale:!1,category:"flags"},netherlands:{keywords:["nl","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf3\ud83c\uddf1" src="1f1f3-1f1f1.png"/>',fitzpatrick_scale:!1,category:"flags"},new_caledonia:{keywords:["new","caledonia","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf3\ud83c\udde8" src="1f1f3-1f1e8.png"/>',fitzpatrick_scale:!1,category:"flags"},new_zealand:{keywords:["new","zealand","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf3\ud83c\uddff" src="1f1f3-1f1ff.png"/>',fitzpatrick_scale:!1,category:"flags"},nicaragua:{keywords:["ni","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf3\ud83c\uddee" src="1f1f3-1f1ee.png"/>',fitzpatrick_scale:!1,category:"flags"},niger:{keywords:["ne","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf3\ud83c\uddea" src="1f1f3-1f1ea.png"/>',fitzpatrick_scale:!1,category:"flags"},nigeria:{keywords:["flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf3\ud83c\uddec" src="1f1f3-1f1ec.png"/>',fitzpatrick_scale:!1,category:"flags"},niue:{keywords:["nu","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf3\ud83c\uddfa" src="1f1f3-1f1fa.png"/>',fitzpatrick_scale:!1,category:"flags"},norfolk_island:{keywords:["norfolk","island","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf3\ud83c\uddeb" src="1f1f3-1f1eb.png"/>',fitzpatrick_scale:!1,category:"flags"},northern_mariana_islands:{keywords:["northern","mariana","islands","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf2\ud83c\uddf5" src="1f1f2-1f1f5.png"/>',fitzpatrick_scale:!1,category:"flags"},north_korea:{keywords:["north","korea","nation","flag","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf0\ud83c\uddf5" src="1f1f0-1f1f5.png"/>',fitzpatrick_scale:!1,category:"flags"},norway:{keywords:["no","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf3\ud83c\uddf4" src="1f1f3-1f1f4.png"/>',fitzpatrick_scale:!1,category:"flags"},oman:{keywords:["om_symbol","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf4\ud83c\uddf2" src="1f1f4-1f1f2.png"/>',fitzpatrick_scale:!1,category:"flags"},pakistan:{keywords:["pk","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf5\ud83c\uddf0" src="1f1f5-1f1f0.png"/>',fitzpatrick_scale:!1,category:"flags"},palau:{keywords:["pw","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf5\ud83c\uddfc" src="1f1f5-1f1fc.png"/>',fitzpatrick_scale:!1,category:"flags"},palestinian_territories:{keywords:["palestine","palestinian","territories","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf5\ud83c\uddf8" src="1f1f5-1f1f8.png"/>',fitzpatrick_scale:!1,category:"flags"},panama:{keywords:["pa","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf5\ud83c\udde6" src="1f1f5-1f1e6.png"/>',fitzpatrick_scale:!1,category:"flags"},papua_new_guinea:{keywords:["papua","new","guinea","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf5\ud83c\uddec" src="1f1f5-1f1ec.png"/>',fitzpatrick_scale:!1,category:"flags"},paraguay:{keywords:["py","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf5\ud83c\uddfe" src="1f1f5-1f1fe.png"/>',fitzpatrick_scale:!1,category:"flags"},peru:{keywords:["pe","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf5\ud83c\uddea" src="1f1f5-1f1ea.png"/>',fitzpatrick_scale:!1,category:"flags"},philippines:{keywords:["ph","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf5\ud83c\udded" src="1f1f5-1f1ed.png"/>',fitzpatrick_scale:!1,category:"flags"},pitcairn_islands:{keywords:["pitcairn","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf5\ud83c\uddf3" src="1f1f5-1f1f3.png"/>',fitzpatrick_scale:!1,category:"flags"},poland:{keywords:["pl","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf5\ud83c\uddf1" src="1f1f5-1f1f1.png"/>',fitzpatrick_scale:!1,category:"flags"},portugal:{keywords:["pt","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf5\ud83c\uddf9" src="1f1f5-1f1f9.png"/>',fitzpatrick_scale:!1,category:"flags"},puerto_rico:{keywords:["puerto","rico","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf5\ud83c\uddf7" src="1f1f5-1f1f7.png"/>',fitzpatrick_scale:!1,category:"flags"},qatar:{keywords:["qa","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf6\ud83c\udde6" src="1f1f6-1f1e6.png"/>',fitzpatrick_scale:!1,category:"flags"},reunion:{keywords:["r\xe9union","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf7\ud83c\uddea" src="1f1f7-1f1ea.png"/>',fitzpatrick_scale:!1,category:"flags"},romania:{keywords:["ro","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf7\ud83c\uddf4" src="1f1f7-1f1f4.png"/>',fitzpatrick_scale:!1,category:"flags"},ru:{keywords:["russian","federation","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf7\ud83c\uddfa" src="1f1f7-1f1fa.png"/>',fitzpatrick_scale:!1,category:"flags"},rwanda:{keywords:["rw","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf7\ud83c\uddfc" src="1f1f7-1f1fc.png"/>',fitzpatrick_scale:!1,category:"flags"},st_barthelemy:{keywords:["saint","barth\xe9lemy","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde7\ud83c\uddf1" src="1f1e7-1f1f1.png"/>',fitzpatrick_scale:!1,category:"flags"},st_helena:{keywords:["saint","helena","ascension","tristan","cunha","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\udded" src="1f1f8-1f1ed.png"/>',fitzpatrick_scale:!1,category:"flags"},st_kitts_nevis:{keywords:["saint","kitts","nevis","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf0\ud83c\uddf3" src="1f1f0-1f1f3.png"/>',fitzpatrick_scale:!1,category:"flags"},st_lucia:{keywords:["saint","lucia","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf1\ud83c\udde8" src="1f1f1-1f1e8.png"/>',fitzpatrick_scale:!1,category:"flags"},st_pierre_miquelon:{keywords:["saint","pierre","miquelon","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf5\ud83c\uddf2" src="1f1f5-1f1f2.png"/>',fitzpatrick_scale:!1,category:"flags"},st_vincent_grenadines:{keywords:["saint","vincent","grenadines","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfb\ud83c\udde8" src="1f1fb-1f1e8.png"/>',fitzpatrick_scale:!1,category:"flags"},samoa:{keywords:["ws","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfc\ud83c\uddf8" src="1f1fc-1f1f8.png"/>',fitzpatrick_scale:!1,category:"flags"},san_marino:{keywords:["san","marino","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\uddf2" src="1f1f8-1f1f2.png"/>',fitzpatrick_scale:!1,category:"flags"},sao_tome_principe:{keywords:["sao","tome","principe","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\uddf9" src="1f1f8-1f1f9.png"/>',fitzpatrick_scale:!1,category:"flags"},saudi_arabia:{keywords:["flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\udde6" src="1f1f8-1f1e6.png"/>',fitzpatrick_scale:!1,category:"flags"},senegal:{keywords:["sn","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\uddf3" src="1f1f8-1f1f3.png"/>',fitzpatrick_scale:!1,category:"flags"},serbia:{keywords:["rs","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf7\ud83c\uddf8" src="1f1f7-1f1f8.png"/>',fitzpatrick_scale:!1,category:"flags"},seychelles:{keywords:["sc","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\udde8" src="1f1f8-1f1e8.png"/>',fitzpatrick_scale:!1,category:"flags"},sierra_leone:{keywords:["sierra","leone","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\uddf1" src="1f1f8-1f1f1.png"/>',fitzpatrick_scale:!1,category:"flags"},singapore:{keywords:["sg","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\uddec" src="1f1f8-1f1ec.png"/>',fitzpatrick_scale:!1,category:"flags"},sint_maarten:{keywords:["sint","maarten","dutch","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\uddfd" src="1f1f8-1f1fd.png"/>',fitzpatrick_scale:!1,category:"flags"},slovakia:{keywords:["sk","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\uddf0" src="1f1f8-1f1f0.png"/>',fitzpatrick_scale:!1,category:"flags"},slovenia:{keywords:["si","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\uddee" src="1f1f8-1f1ee.png"/>',fitzpatrick_scale:!1,category:"flags"},solomon_islands:{keywords:["solomon","islands","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\udde7" src="1f1f8-1f1e7.png"/>',fitzpatrick_scale:!1,category:"flags"},somalia:{keywords:["so","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\uddf4" src="1f1f8-1f1f4.png"/>',fitzpatrick_scale:!1,category:"flags"},south_africa:{keywords:["south","africa","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddff\ud83c\udde6" src="1f1ff-1f1e6.png"/>',fitzpatrick_scale:!1,category:"flags"},south_georgia_south_sandwich_islands:{keywords:["south","georgia","sandwich","islands","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\uddf8" src="1f1ec-1f1f8.png"/>',fitzpatrick_scale:!1,category:"flags"},kr:{keywords:["south","korea","nation","flag","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf0\ud83c\uddf7" src="1f1f0-1f1f7.png"/>',fitzpatrick_scale:!1,category:"flags"},south_sudan:{keywords:["south","sd","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\uddf8" src="1f1f8-1f1f8.png"/>',fitzpatrick_scale:!1,category:"flags"},es:{keywords:["spain","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddea\ud83c\uddf8" src="1f1ea-1f1f8.png"/>',fitzpatrick_scale:!1,category:"flags"},sri_lanka:{keywords:["sri","lanka","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf1\ud83c\uddf0" src="1f1f1-1f1f0.png"/>',fitzpatrick_scale:!1,category:"flags"},sudan:{keywords:["sd","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\udde9" src="1f1f8-1f1e9.png"/>',fitzpatrick_scale:!1,category:"flags"},suriname:{keywords:["sr","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\uddf7" src="1f1f8-1f1f7.png"/>',fitzpatrick_scale:!1,category:"flags"},swaziland:{keywords:["sz","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\uddff" src="1f1f8-1f1ff.png"/>',fitzpatrick_scale:!1,category:"flags"},sweden:{keywords:["se","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\uddea" src="1f1f8-1f1ea.png"/>',fitzpatrick_scale:!1,category:"flags"},switzerland:{keywords:["ch","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde8\ud83c\udded" src="1f1e8-1f1ed.png"/>',fitzpatrick_scale:!1,category:"flags"},syria:{keywords:["syrian","arab","republic","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf8\ud83c\uddfe" src="1f1f8-1f1fe.png"/>',fitzpatrick_scale:!1,category:"flags"},taiwan:{keywords:["tw","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf9\ud83c\uddfc" src="1f1f9-1f1fc.png"/>',fitzpatrick_scale:!1,category:"flags"},tajikistan:{keywords:["tj","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf9\ud83c\uddef" src="1f1f9-1f1ef.png"/>',fitzpatrick_scale:!1,category:"flags"},tanzania:{keywords:["tanzania,","united","republic","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf9\ud83c\uddff" src="1f1f9-1f1ff.png"/>',fitzpatrick_scale:!1,category:"flags"},thailand:{keywords:["th","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf9\ud83c\udded" src="1f1f9-1f1ed.png"/>',fitzpatrick_scale:!1,category:"flags"},timor_leste:{keywords:["timor","leste","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf9\ud83c\uddf1" src="1f1f9-1f1f1.png"/>',fitzpatrick_scale:!1,category:"flags"},togo:{keywords:["tg","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf9\ud83c\uddec" src="1f1f9-1f1ec.png"/>',fitzpatrick_scale:!1,category:"flags"},tokelau:{keywords:["tk","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf9\ud83c\uddf0" src="1f1f9-1f1f0.png"/>',fitzpatrick_scale:!1,category:"flags"},tonga:{keywords:["to","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf9\ud83c\uddf4" src="1f1f9-1f1f4.png"/>',fitzpatrick_scale:!1,category:"flags"},trinidad_tobago:{keywords:["trinidad","tobago","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf9\ud83c\uddf9" src="1f1f9-1f1f9.png"/>',fitzpatrick_scale:!1,category:"flags"},tunisia:{keywords:["tn","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf9\ud83c\uddf3" src="1f1f9-1f1f3.png"/>',fitzpatrick_scale:!1,category:"flags"},tr:{keywords:["turkey","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf9\ud83c\uddf7" src="1f1f9-1f1f7.png"/>',fitzpatrick_scale:!1,category:"flags"},turkmenistan:{keywords:["flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf9\ud83c\uddf2" src="1f1f9-1f1f2.png"/>',fitzpatrick_scale:!1,category:"flags"},turks_caicos_islands:{keywords:["turks","caicos","islands","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf9\ud83c\udde8" src="1f1f9-1f1e8.png"/>',fitzpatrick_scale:!1,category:"flags"},tuvalu:{keywords:["flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddf9\ud83c\uddfb" src="1f1f9-1f1fb.png"/>',fitzpatrick_scale:!1,category:"flags"},uganda:{keywords:["ug","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfa\ud83c\uddec" src="1f1fa-1f1ec.png"/>',fitzpatrick_scale:!1,category:"flags"},ukraine:{keywords:["ua","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfa\ud83c\udde6" src="1f1fa-1f1e6.png"/>',fitzpatrick_scale:!1,category:"flags"},united_arab_emirates:{keywords:["united","arab","emirates","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udde6\ud83c\uddea" src="1f1e6-1f1ea.png"/>',fitzpatrick_scale:!1,category:"flags"},uk:{keywords:["united","kingdom","great","britain","northern","ireland","flag","nation","country","banner","british","UK","english","england","union jack"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddec\ud83c\udde7" src="1f1ec-1f1e7.png"/>',fitzpatrick_scale:!1,category:"flags"},england:{keywords:["flag","english"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f" src="1f3f4-e0067-e0062-e0065-e006e-e0067-e007f.png"/>',fitzpatrick_scale:!1,category:"flags"},scotland:{keywords:["flag","scottish"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f" src="1f3f4-e0067-e0062-e0073-e0063-e0074-e007f.png"/>',fitzpatrick_scale:!1,category:"flags"},wales:{keywords:["flag","welsh"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f" src="1f3f4-e0067-e0062-e0077-e006c-e0073-e007f.png"/>',fitzpatrick_scale:!1,category:"flags"},us:{keywords:["united","states","america","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfa\ud83c\uddf8" src="1f1fa-1f1f8.png"/>',fitzpatrick_scale:!1,category:"flags"},us_virgin_islands:{keywords:["virgin","islands","us","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfb\ud83c\uddee" src="1f1fb-1f1ee.png"/>',fitzpatrick_scale:!1,category:"flags"},uruguay:{keywords:["uy","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfa\ud83c\uddfe" src="1f1fa-1f1fe.png"/>',fitzpatrick_scale:!1,category:"flags"},uzbekistan:{keywords:["uz","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfa\ud83c\uddff" src="1f1fa-1f1ff.png"/>',fitzpatrick_scale:!1,category:"flags"},vanuatu:{keywords:["vu","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfb\ud83c\uddfa" src="1f1fb-1f1fa.png"/>',fitzpatrick_scale:!1,category:"flags"},vatican_city:{keywords:["vatican","city","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfb\ud83c\udde6" src="1f1fb-1f1e6.png"/>',fitzpatrick_scale:!1,category:"flags"},venezuela:{keywords:["ve","bolivarian","republic","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfb\ud83c\uddea" src="1f1fb-1f1ea.png"/>',fitzpatrick_scale:!1,category:"flags"},vietnam:{keywords:["viet","nam","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfb\ud83c\uddf3" src="1f1fb-1f1f3.png"/>',fitzpatrick_scale:!1,category:"flags"},wallis_futuna:{keywords:["wallis","futuna","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfc\ud83c\uddeb" src="1f1fc-1f1eb.png"/>',fitzpatrick_scale:!1,category:"flags"},western_sahara:{keywords:["western","sahara","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddea\ud83c\udded" src="1f1ea-1f1ed.png"/>',fitzpatrick_scale:!1,category:"flags"},yemen:{keywords:["ye","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfe\ud83c\uddea" src="1f1fe-1f1ea.png"/>',fitzpatrick_scale:!1,category:"flags"},zambia:{keywords:["zm","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddff\ud83c\uddf2" src="1f1ff-1f1f2.png"/>',fitzpatrick_scale:!1,category:"flags"},zimbabwe:{keywords:["zw","flag","nation","country","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddff\ud83c\uddfc" src="1f1ff-1f1fc.png"/>',fitzpatrick_scale:!1,category:"flags"},united_nations:{keywords:["un","flag","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\uddfa\ud83c\uddf3" src="1f1fa-1f1f3.png"/>',fitzpatrick_scale:!1,category:"flags"},pirate_flag:{keywords:["skull","crossbones","flag","banner"],char:'<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udff4\u200d\u2620\ufe0f" src="1f3f4-200d-2620-fe0f.png"/>',fitzpatrick_scale:!1,category:"flags"}});
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/emoticons/js/emojis.js b/public/static/assets/gougu/module/tinymce/plugins/emoticons/js/emojis.js
new file mode 100644
index 0000000000000000000000000000000000000000..cf7f472bfddc1bbdf06f6ef5dcf45c2895fc6f39
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/emoticons/js/emojis.js
@@ -0,0 +1,9423 @@
+// Source: npm package: emojilib, file:emojis.json
+window.tinymce.Resource.add("tinymce.plugins.emoticons", {
+  grinning: {
+    keywords: [ "face", "smile", "happy", "joy", ":D", "grin" ],
+    char: "\ud83d\ude00",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  grimacing: {
+    keywords: [ "face", "grimace", "teeth" ],
+    char: "\ud83d\ude2c",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  grin: {
+    keywords: [ "face", "happy", "smile", "joy", "kawaii" ],
+    char: "\ud83d\ude01",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  joy: {
+    keywords: [ "face", "cry", "tears", "weep", "happy", "happytears", "haha" ],
+    char: "\ud83d\ude02",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  rofl: {
+    keywords: [ "face", "rolling", "floor", "laughing", "lol", "haha" ],
+    char: "\ud83e\udd23",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  partying: {
+    keywords: [ "face", "celebration", "woohoo" ],
+    char: "\ud83e\udd73",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  smiley: {
+    keywords: [ "face", "happy", "joy", "haha", ":D", ":)", "smile", "funny" ],
+    char: "\ud83d\ude03",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  smile: {
+    keywords: [ "face", "happy", "joy", "funny", "haha", "laugh", "like", ":D", ":)" ],
+    char: "\ud83d\ude04",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  sweat_smile: {
+    keywords: [ "face", "hot", "happy", "laugh", "sweat", "smile", "relief" ],
+    char: "\ud83d\ude05",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  laughing: {
+    keywords: [ "happy", "joy", "lol", "satisfied", "haha", "face", "glad", "XD", "laugh" ],
+    char: "\ud83d\ude06",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  innocent: {
+    keywords: [ "face", "angel", "heaven", "halo" ],
+    char: "\ud83d\ude07",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  wink: {
+    keywords: [ "face", "happy", "mischievous", "secret", ";)", "smile", "eye" ],
+    char: "\ud83d\ude09",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  blush: {
+    keywords: [ "face", "smile", "happy", "flushed", "crush", "embarrassed", "shy", "joy" ],
+    char: "\ud83d\ude0a",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  slightly_smiling_face: {
+    keywords: [ "face", "smile" ],
+    char: "\ud83d\ude42",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  upside_down_face: {
+    keywords: [ "face", "flipped", "silly", "smile" ],
+    char: "\ud83d\ude43",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  relaxed: {
+    keywords: [ "face", "blush", "massage", "happiness" ],
+    char: "\u263a\ufe0f",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  yum: {
+    keywords: [ "happy", "joy", "tongue", "smile", "face", "silly", "yummy", "nom", "delicious", "savouring" ],
+    char: "\ud83d\ude0b",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  relieved: {
+    keywords: [ "face", "relaxed", "phew", "massage", "happiness" ],
+    char: "\ud83d\ude0c",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  heart_eyes: {
+    keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "crush", "heart" ],
+    char: "\ud83d\ude0d",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  smiling_face_with_three_hearts: {
+    keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "crush", "hearts", "adore" ],
+    char: "\ud83e\udd70",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  kissing_heart: {
+    keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "kiss" ],
+    char: "\ud83d\ude18",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  kissing: {
+    keywords: [ "love", "like", "face", "3", "valentines", "infatuation", "kiss" ],
+    char: "\ud83d\ude17",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  kissing_smiling_eyes: {
+    keywords: [ "face", "affection", "valentines", "infatuation", "kiss" ],
+    char: "\ud83d\ude19",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  kissing_closed_eyes: {
+    keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "kiss" ],
+    char: "\ud83d\ude1a",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  stuck_out_tongue_winking_eye: {
+    keywords: [ "face", "prank", "childish", "playful", "mischievous", "smile", "wink", "tongue" ],
+    char: "\ud83d\ude1c",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  zany: {
+    keywords: [ "face", "goofy", "crazy" ],
+    char: "\ud83e\udd2a",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  raised_eyebrow: {
+    keywords: [ "face", "distrust", "scepticism", "disapproval", "disbelief", "surprise" ],
+    char: "\ud83e\udd28",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  monocle: {
+    keywords: [ "face", "stuffy", "wealthy" ],
+    char: "\ud83e\uddd0",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  stuck_out_tongue_closed_eyes: {
+    keywords: [ "face", "prank", "playful", "mischievous", "smile", "tongue" ],
+    char: "\ud83d\ude1d",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  stuck_out_tongue: {
+    keywords: [ "face", "prank", "childish", "playful", "mischievous", "smile", "tongue" ],
+    char: "\ud83d\ude1b",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  money_mouth_face: {
+    keywords: [ "face", "rich", "dollar", "money" ],
+    char: "\ud83e\udd11",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  nerd_face: {
+    keywords: [ "face", "nerdy", "geek", "dork" ],
+    char: "\ud83e\udd13",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  sunglasses: {
+    keywords: [ "face", "cool", "smile", "summer", "beach", "sunglass" ],
+    char: "\ud83d\ude0e",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  star_struck: {
+    keywords: [ "face", "smile", "starry", "eyes", "grinning" ],
+    char: "\ud83e\udd29",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  clown_face: {
+    keywords: [ "face" ],
+    char: "\ud83e\udd21",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  cowboy_hat_face: {
+    keywords: [ "face", "cowgirl", "hat" ],
+    char: "\ud83e\udd20",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  hugs: {
+    keywords: [ "face", "smile", "hug" ],
+    char: "\ud83e\udd17",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  smirk: {
+    keywords: [ "face", "smile", "mean", "prank", "smug", "sarcasm" ],
+    char: "\ud83d\ude0f",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  no_mouth: {
+    keywords: [ "face", "hellokitty" ],
+    char: "\ud83d\ude36",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  neutral_face: {
+    keywords: [ "indifference", "meh", ":|", "neutral" ],
+    char: "\ud83d\ude10",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  expressionless: {
+    keywords: [ "face", "indifferent", "-_-", "meh", "deadpan" ],
+    char: "\ud83d\ude11",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  unamused: {
+    keywords: [ "indifference", "bored", "straight face", "serious", "sarcasm", "unimpressed", "skeptical", "dubious", "side_eye" ],
+    char: "\ud83d\ude12",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  roll_eyes: {
+    keywords: [ "face", "eyeroll", "frustrated" ],
+    char: "\ud83d\ude44",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  thinking: {
+    keywords: [ "face", "hmmm", "think", "consider" ],
+    char: "\ud83e\udd14",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  lying_face: {
+    keywords: [ "face", "lie", "pinocchio" ],
+    char: "\ud83e\udd25",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  hand_over_mouth: {
+    keywords: [ "face", "whoops", "shock", "surprise" ],
+    char: "\ud83e\udd2d",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  shushing: {
+    keywords: [ "face", "quiet", "shhh" ],
+    char: "\ud83e\udd2b",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  symbols_over_mouth: {
+    keywords: [ "face", "swearing", "cursing", "cussing", "profanity", "expletive" ],
+    char: "\ud83e\udd2c",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  exploding_head: {
+    keywords: [ "face", "shocked", "mind", "blown" ],
+    char: "\ud83e\udd2f",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  flushed: {
+    keywords: [ "face", "blush", "shy", "flattered" ],
+    char: "\ud83d\ude33",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  disappointed: {
+    keywords: [ "face", "sad", "upset", "depressed", ":(" ],
+    char: "\ud83d\ude1e",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  worried: {
+    keywords: [ "face", "concern", "nervous", ":(" ],
+    char: "\ud83d\ude1f",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  angry: {
+    keywords: [ "mad", "face", "annoyed", "frustrated" ],
+    char: "\ud83d\ude20",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  rage: {
+    keywords: [ "angry", "mad", "hate", "despise" ],
+    char: "\ud83d\ude21",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  pensive: {
+    keywords: [ "face", "sad", "depressed", "upset" ],
+    char: "\ud83d\ude14",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  confused: {
+    keywords: [ "face", "indifference", "huh", "weird", "hmmm", ":/" ],
+    char: "\ud83d\ude15",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  slightly_frowning_face: {
+    keywords: [ "face", "frowning", "disappointed", "sad", "upset" ],
+    char: "\ud83d\ude41",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  frowning_face: {
+    keywords: [ "face", "sad", "upset", "frown" ],
+    char: "\u2639",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  persevere: {
+    keywords: [ "face", "sick", "no", "upset", "oops" ],
+    char: "\ud83d\ude23",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  confounded: {
+    keywords: [ "face", "confused", "sick", "unwell", "oops", ":S" ],
+    char: "\ud83d\ude16",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  tired_face: {
+    keywords: [ "sick", "whine", "upset", "frustrated" ],
+    char: "\ud83d\ude2b",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  weary: {
+    keywords: [ "face", "tired", "sleepy", "sad", "frustrated", "upset" ],
+    char: "\ud83d\ude29",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  pleading: {
+    keywords: [ "face", "begging", "mercy" ],
+    char: "\ud83e\udd7a",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  triumph: {
+    keywords: [ "face", "gas", "phew", "proud", "pride" ],
+    char: "\ud83d\ude24",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  open_mouth: {
+    keywords: [ "face", "surprise", "impressed", "wow", "whoa", ":O" ],
+    char: "\ud83d\ude2e",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  scream: {
+    keywords: [ "face", "munch", "scared", "omg" ],
+    char: "\ud83d\ude31",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  fearful: {
+    keywords: [ "face", "scared", "terrified", "nervous", "oops", "huh" ],
+    char: "\ud83d\ude28",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  cold_sweat: {
+    keywords: [ "face", "nervous", "sweat" ],
+    char: "\ud83d\ude30",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  hushed: {
+    keywords: [ "face", "woo", "shh" ],
+    char: "\ud83d\ude2f",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  frowning: {
+    keywords: [ "face", "aw", "what" ],
+    char: "\ud83d\ude26",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  anguished: {
+    keywords: [ "face", "stunned", "nervous" ],
+    char: "\ud83d\ude27",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  cry: {
+    keywords: [ "face", "tears", "sad", "depressed", "upset", ":'(" ],
+    char: "\ud83d\ude22",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  disappointed_relieved: {
+    keywords: [ "face", "phew", "sweat", "nervous" ],
+    char: "\ud83d\ude25",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  drooling_face: {
+    keywords: [ "face" ],
+    char: "\ud83e\udd24",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  sleepy: {
+    keywords: [ "face", "tired", "rest", "nap" ],
+    char: "\ud83d\ude2a",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  sweat: {
+    keywords: [ "face", "hot", "sad", "tired", "exercise" ],
+    char: "\ud83d\ude13",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  hot: {
+    keywords: [ "face", "feverish", "heat", "red", "sweating" ],
+    char: "\ud83e\udd75",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  cold: {
+    keywords: [ "face", "blue", "freezing", "frozen", "frostbite", "icicles" ],
+    char: "\ud83e\udd76",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  sob: {
+    keywords: [ "face", "cry", "tears", "sad", "upset", "depressed" ],
+    char: "\ud83d\ude2d",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  dizzy_face: {
+    keywords: [ "spent", "unconscious", "xox", "dizzy" ],
+    char: "\ud83d\ude35",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  astonished: {
+    keywords: [ "face", "xox", "surprised", "poisoned" ],
+    char: "\ud83d\ude32",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  zipper_mouth_face: {
+    keywords: [ "face", "sealed", "zipper", "secret" ],
+    char: "\ud83e\udd10",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  nauseated_face: {
+    keywords: [ "face", "vomit", "gross", "green", "sick", "throw up", "ill" ],
+    char: "\ud83e\udd22",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  sneezing_face: {
+    keywords: [ "face", "gesundheit", "sneeze", "sick", "allergy" ],
+    char: "\ud83e\udd27",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  vomiting: {
+    keywords: [ "face", "sick" ],
+    char: "\ud83e\udd2e",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  mask: {
+    keywords: [ "face", "sick", "ill", "disease" ],
+    char: "\ud83d\ude37",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  face_with_thermometer: {
+    keywords: [ "sick", "temperature", "thermometer", "cold", "fever" ],
+    char: "\ud83e\udd12",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  face_with_head_bandage: {
+    keywords: [ "injured", "clumsy", "bandage", "hurt" ],
+    char: "\ud83e\udd15",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  woozy: {
+    keywords: [ "face", "dizzy", "intoxicated", "tipsy", "wavy" ],
+    char: "\ud83e\udd74",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  sleeping: {
+    keywords: [ "face", "tired", "sleepy", "night", "zzz" ],
+    char: "\ud83d\ude34",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  zzz: {
+    keywords: [ "sleepy", "tired", "dream" ],
+    char: "\ud83d\udca4",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  poop: {
+    keywords: [ "hankey", "shitface", "fail", "turd", "shit" ],
+    char: "\ud83d\udca9",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  smiling_imp: {
+    keywords: [ "devil", "horns" ],
+    char: "\ud83d\ude08",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  imp: {
+    keywords: [ "devil", "angry", "horns" ],
+    char: "\ud83d\udc7f",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  japanese_ogre: {
+    keywords: [ "monster", "red", "mask", "halloween", "scary", "creepy", "devil", "demon", "japanese", "ogre" ],
+    char: "\ud83d\udc79",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  japanese_goblin: {
+    keywords: [ "red", "evil", "mask", "monster", "scary", "creepy", "japanese", "goblin" ],
+    char: "\ud83d\udc7a",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  skull: {
+    keywords: [ "dead", "skeleton", "creepy", "death" ],
+    char: "\ud83d\udc80",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  ghost: {
+    keywords: [ "halloween", "spooky", "scary" ],
+    char: "\ud83d\udc7b",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  alien: {
+    keywords: [ "UFO", "paul", "weird", "outer_space" ],
+    char: "\ud83d\udc7d",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  robot: {
+    keywords: [ "computer", "machine", "bot" ],
+    char: "\ud83e\udd16",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  smiley_cat: {
+    keywords: [ "animal", "cats", "happy", "smile" ],
+    char: "\ud83d\ude3a",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  smile_cat: {
+    keywords: [ "animal", "cats", "smile" ],
+    char: "\ud83d\ude38",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  joy_cat: {
+    keywords: [ "animal", "cats", "haha", "happy", "tears" ],
+    char: "\ud83d\ude39",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  heart_eyes_cat: {
+    keywords: [ "animal", "love", "like", "affection", "cats", "valentines", "heart" ],
+    char: "\ud83d\ude3b",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  smirk_cat: {
+    keywords: [ "animal", "cats", "smirk" ],
+    char: "\ud83d\ude3c",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  kissing_cat: {
+    keywords: [ "animal", "cats", "kiss" ],
+    char: "\ud83d\ude3d",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  scream_cat: {
+    keywords: [ "animal", "cats", "munch", "scared", "scream" ],
+    char: "\ud83d\ude40",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  crying_cat_face: {
+    keywords: [ "animal", "tears", "weep", "sad", "cats", "upset", "cry" ],
+    char: "\ud83d\ude3f",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  pouting_cat: {
+    keywords: [ "animal", "cats" ],
+    char: "\ud83d\ude3e",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  palms_up: {
+    keywords: [ "hands", "gesture", "cupped", "prayer" ],
+    char: "\ud83e\udd32",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  raised_hands: {
+    keywords: [ "gesture", "hooray", "yea", "celebration", "hands" ],
+    char: "\ud83d\ude4c",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  clap: {
+    keywords: [ "hands", "praise", "applause", "congrats", "yay" ],
+    char: "\ud83d\udc4f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  wave: {
+    keywords: [ "hands", "gesture", "goodbye", "solong", "farewell", "hello", "hi", "palm" ],
+    char: "\ud83d\udc4b",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  call_me_hand: {
+    keywords: [ "hands", "gesture" ],
+    char: "\ud83e\udd19",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  "+1": {
+    keywords: [ "thumbsup", "yes", "awesome", "good", "agree", "accept", "cool", "hand", "like" ],
+    char: "\ud83d\udc4d",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  "-1": {
+    keywords: [ "thumbsdown", "no", "dislike", "hand" ],
+    char: "\ud83d\udc4e",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  facepunch: {
+    keywords: [ "angry", "violence", "fist", "hit", "attack", "hand" ],
+    char: "\ud83d\udc4a",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  fist: {
+    keywords: [ "fingers", "hand", "grasp" ],
+    char: "\u270a",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  fist_left: {
+    keywords: [ "hand", "fistbump" ],
+    char: "\ud83e\udd1b",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  fist_right: {
+    keywords: [ "hand", "fistbump" ],
+    char: "\ud83e\udd1c",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  v: {
+    keywords: [ "fingers", "ohyeah", "hand", "peace", "victory", "two" ],
+    char: "\u270c",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  ok_hand: {
+    keywords: [ "fingers", "limbs", "perfect", "ok", "okay" ],
+    char: "\ud83d\udc4c",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  raised_hand: {
+    keywords: [ "fingers", "stop", "highfive", "palm", "ban" ],
+    char: "\u270b",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  raised_back_of_hand: {
+    keywords: [ "fingers", "raised", "backhand" ],
+    char: "\ud83e\udd1a",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  open_hands: {
+    keywords: [ "fingers", "butterfly", "hands", "open" ],
+    char: "\ud83d\udc50",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  muscle: {
+    keywords: [ "arm", "flex", "hand", "summer", "strong", "biceps" ],
+    char: "\ud83d\udcaa",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  pray: {
+    keywords: [ "please", "hope", "wish", "namaste", "highfive" ],
+    char: "\ud83d\ude4f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  foot: {
+    keywords: [ "kick", "stomp" ],
+    char: "\ud83e\uddb6",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  leg: {
+    keywords: [ "kick", "limb" ],
+    char: "\ud83e\uddb5",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  handshake: {
+    keywords: [ "agreement", "shake" ],
+    char: "\ud83e\udd1d",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  point_up: {
+    keywords: [ "hand", "fingers", "direction", "up" ],
+    char: "\u261d",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  point_up_2: {
+    keywords: [ "fingers", "hand", "direction", "up" ],
+    char: "\ud83d\udc46",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  point_down: {
+    keywords: [ "fingers", "hand", "direction", "down" ],
+    char: "\ud83d\udc47",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  point_left: {
+    keywords: [ "direction", "fingers", "hand", "left" ],
+    char: "\ud83d\udc48",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  point_right: {
+    keywords: [ "fingers", "hand", "direction", "right" ],
+    char: "\ud83d\udc49",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  fu: {
+    keywords: [ "hand", "fingers", "rude", "middle", "flipping" ],
+    char: "\ud83d\udd95",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  raised_hand_with_fingers_splayed: {
+    keywords: [ "hand", "fingers", "palm" ],
+    char: "\ud83d\udd90",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  love_you: {
+    keywords: [ "hand", "fingers", "gesture" ],
+    char: "\ud83e\udd1f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  metal: {
+    keywords: [ "hand", "fingers", "evil_eye", "sign_of_horns", "rock_on" ],
+    char: "\ud83e\udd18",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  crossed_fingers: {
+    keywords: [ "good", "lucky" ],
+    char: "\ud83e\udd1e",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  vulcan_salute: {
+    keywords: [ "hand", "fingers", "spock", "star trek" ],
+    char: "\ud83d\udd96",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  writing_hand: {
+    keywords: [ "lower_left_ballpoint_pen", "stationery", "write", "compose" ],
+    char: "\u270d",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  selfie: {
+    keywords: [ "camera", "phone" ],
+    char: "\ud83e\udd33",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  nail_care: {
+    keywords: [ "beauty", "manicure", "finger", "fashion", "nail" ],
+    char: "\ud83d\udc85",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  lips: {
+    keywords: [ "mouth", "kiss" ],
+    char: "\ud83d\udc44",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  tooth: {
+    keywords: [ "teeth", "dentist" ],
+    char: "\ud83e\uddb7",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  tongue: {
+    keywords: [ "mouth", "playful" ],
+    char: "\ud83d\udc45",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  ear: {
+    keywords: [ "face", "hear", "sound", "listen" ],
+    char: "\ud83d\udc42",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  nose: {
+    keywords: [ "smell", "sniff" ],
+    char: "\ud83d\udc43",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  eye: {
+    keywords: [ "face", "look", "see", "watch", "stare" ],
+    char: "\ud83d\udc41",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  eyes: {
+    keywords: [ "look", "watch", "stalk", "peek", "see" ],
+    char: "\ud83d\udc40",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  brain: {
+    keywords: [ "smart", "intelligent" ],
+    char: "\ud83e\udde0",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  bust_in_silhouette: {
+    keywords: [ "user", "person", "human" ],
+    char: "\ud83d\udc64",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  busts_in_silhouette: {
+    keywords: [ "user", "person", "human", "group", "team" ],
+    char: "\ud83d\udc65",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  speaking_head: {
+    keywords: [ "user", "person", "human", "sing", "say", "talk" ],
+    char: "\ud83d\udde3",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  baby: {
+    keywords: [ "child", "boy", "girl", "toddler" ],
+    char: "\ud83d\udc76",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  child: {
+    keywords: [ "gender-neutral", "young" ],
+    char: "\ud83e\uddd2",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  boy: {
+    keywords: [ "man", "male", "guy", "teenager" ],
+    char: "\ud83d\udc66",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  girl: {
+    keywords: [ "female", "woman", "teenager" ],
+    char: "\ud83d\udc67",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  adult: {
+    keywords: [ "gender-neutral", "person" ],
+    char: "\ud83e\uddd1",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man: {
+    keywords: [ "mustache", "father", "dad", "guy", "classy", "sir", "moustache" ],
+    char: "\ud83d\udc68",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman: {
+    keywords: [ "female", "girls", "lady" ],
+    char: "\ud83d\udc69",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  blonde_woman: {
+    keywords: [ "woman", "female", "girl", "blonde", "person" ],
+    char: "\ud83d\udc71\u200d\u2640\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  blonde_man: {
+    keywords: [ "man", "male", "boy", "blonde", "guy", "person" ],
+    char: "\ud83d\udc71",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  bearded_person: {
+    keywords: [ "person", "bewhiskered" ],
+    char: "\ud83e\uddd4",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  older_adult: {
+    keywords: [ "human", "elder", "senior", "gender-neutral" ],
+    char: "\ud83e\uddd3",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  older_man: {
+    keywords: [ "human", "male", "men", "old", "elder", "senior" ],
+    char: "\ud83d\udc74",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  older_woman: {
+    keywords: [ "human", "female", "women", "lady", "old", "elder", "senior" ],
+    char: "\ud83d\udc75",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_with_gua_pi_mao: {
+    keywords: [ "male", "boy", "chinese" ],
+    char: "\ud83d\udc72",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_with_headscarf: {
+    keywords: [ "female", "hijab", "mantilla", "tichel" ],
+    char: "\ud83e\uddd5",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_with_turban: {
+    keywords: [ "female", "indian", "hinduism", "arabs", "woman" ],
+    char: "\ud83d\udc73\u200d\u2640\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_with_turban: {
+    keywords: [ "male", "indian", "hinduism", "arabs" ],
+    char: "\ud83d\udc73",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  policewoman: {
+    keywords: [ "woman", "police", "law", "legal", "enforcement", "arrest", "911", "female" ],
+    char: "\ud83d\udc6e\u200d\u2640\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  policeman: {
+    keywords: [ "man", "police", "law", "legal", "enforcement", "arrest", "911" ],
+    char: "\ud83d\udc6e",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  construction_worker_woman: {
+    keywords: [ "female", "human", "wip", "build", "construction", "worker", "labor", "woman" ],
+    char: "\ud83d\udc77\u200d\u2640\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  construction_worker_man: {
+    keywords: [ "male", "human", "wip", "guy", "build", "construction", "worker", "labor" ],
+    char: "\ud83d\udc77",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  guardswoman: {
+    keywords: [ "uk", "gb", "british", "female", "royal", "woman" ],
+    char: "\ud83d\udc82\u200d\u2640\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  guardsman: {
+    keywords: [ "uk", "gb", "british", "male", "guy", "royal" ],
+    char: "\ud83d\udc82",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  female_detective: {
+    keywords: [ "human", "spy", "detective", "female", "woman" ],
+    char: "\ud83d\udd75\ufe0f\u200d\u2640\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  male_detective: {
+    keywords: [ "human", "spy", "detective" ],
+    char: "\ud83d\udd75",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_health_worker: {
+    keywords: [ "doctor", "nurse", "therapist", "healthcare", "woman", "human" ],
+    char: "\ud83d\udc69\u200d\u2695\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_health_worker: {
+    keywords: [ "doctor", "nurse", "therapist", "healthcare", "man", "human" ],
+    char: "\ud83d\udc68\u200d\u2695\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_farmer: {
+    keywords: [ "rancher", "gardener", "woman", "human" ],
+    char: "\ud83d\udc69\u200d\ud83c\udf3e",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_farmer: {
+    keywords: [ "rancher", "gardener", "man", "human" ],
+    char: "\ud83d\udc68\u200d\ud83c\udf3e",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_cook: {
+    keywords: [ "chef", "woman", "human" ],
+    char: "\ud83d\udc69\u200d\ud83c\udf73",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_cook: {
+    keywords: [ "chef", "man", "human" ],
+    char: "\ud83d\udc68\u200d\ud83c\udf73",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_student: {
+    keywords: [ "graduate", "woman", "human" ],
+    char: "\ud83d\udc69\u200d\ud83c\udf93",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_student: {
+    keywords: [ "graduate", "man", "human" ],
+    char: "\ud83d\udc68\u200d\ud83c\udf93",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_singer: {
+    keywords: [ "rockstar", "entertainer", "woman", "human" ],
+    char: "\ud83d\udc69\u200d\ud83c\udfa4",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_singer: {
+    keywords: [ "rockstar", "entertainer", "man", "human" ],
+    char: "\ud83d\udc68\u200d\ud83c\udfa4",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_teacher: {
+    keywords: [ "instructor", "professor", "woman", "human" ],
+    char: "\ud83d\udc69\u200d\ud83c\udfeb",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_teacher: {
+    keywords: [ "instructor", "professor", "man", "human" ],
+    char: "\ud83d\udc68\u200d\ud83c\udfeb",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_factory_worker: {
+    keywords: [ "assembly", "industrial", "woman", "human" ],
+    char: "\ud83d\udc69\u200d\ud83c\udfed",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_factory_worker: {
+    keywords: [ "assembly", "industrial", "man", "human" ],
+    char: "\ud83d\udc68\u200d\ud83c\udfed",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_technologist: {
+    keywords: [ "coder", "developer", "engineer", "programmer", "software", "woman", "human", "laptop", "computer" ],
+    char: "\ud83d\udc69\u200d\ud83d\udcbb",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_technologist: {
+    keywords: [ "coder", "developer", "engineer", "programmer", "software", "man", "human", "laptop", "computer" ],
+    char: "\ud83d\udc68\u200d\ud83d\udcbb",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_office_worker: {
+    keywords: [ "business", "manager", "woman", "human" ],
+    char: "\ud83d\udc69\u200d\ud83d\udcbc",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_office_worker: {
+    keywords: [ "business", "manager", "man", "human" ],
+    char: "\ud83d\udc68\u200d\ud83d\udcbc",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_mechanic: {
+    keywords: [ "plumber", "woman", "human", "wrench" ],
+    char: "\ud83d\udc69\u200d\ud83d\udd27",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_mechanic: {
+    keywords: [ "plumber", "man", "human", "wrench" ],
+    char: "\ud83d\udc68\u200d\ud83d\udd27",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_scientist: {
+    keywords: [ "biologist", "chemist", "engineer", "physicist", "woman", "human" ],
+    char: "\ud83d\udc69\u200d\ud83d\udd2c",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_scientist: {
+    keywords: [ "biologist", "chemist", "engineer", "physicist", "man", "human" ],
+    char: "\ud83d\udc68\u200d\ud83d\udd2c",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_artist: {
+    keywords: [ "painter", "woman", "human" ],
+    char: "\ud83d\udc69\u200d\ud83c\udfa8",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_artist: {
+    keywords: [ "painter", "man", "human" ],
+    char: "\ud83d\udc68\u200d\ud83c\udfa8",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_firefighter: {
+    keywords: [ "fireman", "woman", "human" ],
+    char: "\ud83d\udc69\u200d\ud83d\ude92",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_firefighter: {
+    keywords: [ "fireman", "man", "human" ],
+    char: "\ud83d\udc68\u200d\ud83d\ude92",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_pilot: {
+    keywords: [ "aviator", "plane", "woman", "human" ],
+    char: "\ud83d\udc69\u200d\u2708\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_pilot: {
+    keywords: [ "aviator", "plane", "man", "human" ],
+    char: "\ud83d\udc68\u200d\u2708\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_astronaut: {
+    keywords: [ "space", "rocket", "woman", "human" ],
+    char: "\ud83d\udc69\u200d\ud83d\ude80",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_astronaut: {
+    keywords: [ "space", "rocket", "man", "human" ],
+    char: "\ud83d\udc68\u200d\ud83d\ude80",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_judge: {
+    keywords: [ "justice", "court", "woman", "human" ],
+    char: "\ud83d\udc69\u200d\u2696\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_judge: {
+    keywords: [ "justice", "court", "man", "human" ],
+    char: "\ud83d\udc68\u200d\u2696\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_superhero: {
+    keywords: [ "woman", "female", "good", "heroine", "superpowers" ],
+    char: "\ud83e\uddb8\u200d\u2640\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_superhero: {
+    keywords: [ "man", "male", "good", "hero", "superpowers" ],
+    char: "\ud83e\uddb8\u200d\u2642\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_supervillain: {
+    keywords: [ "woman", "female", "evil", "bad", "criminal", "heroine", "superpowers" ],
+    char: "\ud83e\uddb9\u200d\u2640\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_supervillain: {
+    keywords: [ "man", "male", "evil", "bad", "criminal", "hero", "superpowers" ],
+    char: "\ud83e\uddb9\u200d\u2642\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  mrs_claus: {
+    keywords: [ "woman", "female", "xmas", "mother christmas" ],
+    char: "\ud83e\udd36",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  santa: {
+    keywords: [ "festival", "man", "male", "xmas", "father christmas" ],
+    char: "\ud83c\udf85",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  sorceress: {
+    keywords: [ "woman", "female", "mage", "witch" ],
+    char: "\ud83e\uddd9\u200d\u2640\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  wizard: {
+    keywords: [ "man", "male", "mage", "sorcerer" ],
+    char: "\ud83e\uddd9\u200d\u2642\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_elf: {
+    keywords: [ "woman", "female" ],
+    char: "\ud83e\udddd\u200d\u2640\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_elf: {
+    keywords: [ "man", "male" ],
+    char: "\ud83e\udddd\u200d\u2642\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_vampire: {
+    keywords: [ "woman", "female" ],
+    char: "\ud83e\udddb\u200d\u2640\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_vampire: {
+    keywords: [ "man", "male", "dracula" ],
+    char: "\ud83e\udddb\u200d\u2642\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_zombie: {
+    keywords: [ "woman", "female", "undead", "walking dead" ],
+    char: "\ud83e\udddf\u200d\u2640\ufe0f",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  man_zombie: {
+    keywords: [ "man", "male", "dracula", "undead", "walking dead" ],
+    char: "\ud83e\udddf\u200d\u2642\ufe0f",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  woman_genie: {
+    keywords: [ "woman", "female" ],
+    char: "\ud83e\uddde\u200d\u2640\ufe0f",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  man_genie: {
+    keywords: [ "man", "male" ],
+    char: "\ud83e\uddde\u200d\u2642\ufe0f",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  mermaid: {
+    keywords: [ "woman", "female", "merwoman", "ariel" ],
+    char: "\ud83e\udddc\u200d\u2640\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  merman: {
+    keywords: [ "man", "male", "triton" ],
+    char: "\ud83e\udddc\u200d\u2642\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_fairy: {
+    keywords: [ "woman", "female" ],
+    char: "\ud83e\uddda\u200d\u2640\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_fairy: {
+    keywords: [ "man", "male" ],
+    char: "\ud83e\uddda\u200d\u2642\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  angel: {
+    keywords: [ "heaven", "wings", "halo" ],
+    char: "\ud83d\udc7c",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  pregnant_woman: {
+    keywords: [ "baby" ],
+    char: "\ud83e\udd30",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  breastfeeding: {
+    keywords: [ "nursing", "baby" ],
+    char: "\ud83e\udd31",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  princess: {
+    keywords: [ "girl", "woman", "female", "blond", "crown", "royal", "queen" ],
+    char: "\ud83d\udc78",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  prince: {
+    keywords: [ "boy", "man", "male", "crown", "royal", "king" ],
+    char: "\ud83e\udd34",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  bride_with_veil: {
+    keywords: [ "couple", "marriage", "wedding", "woman", "bride" ],
+    char: "\ud83d\udc70",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_in_tuxedo: {
+    keywords: [ "couple", "marriage", "wedding", "groom" ],
+    char: "\ud83e\udd35",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  running_woman: {
+    keywords: [ "woman", "walking", "exercise", "race", "running", "female" ],
+    char: "\ud83c\udfc3\u200d\u2640\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  running_man: {
+    keywords: [ "man", "walking", "exercise", "race", "running" ],
+    char: "\ud83c\udfc3",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  walking_woman: {
+    keywords: [ "human", "feet", "steps", "woman", "female" ],
+    char: "\ud83d\udeb6\u200d\u2640\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  walking_man: {
+    keywords: [ "human", "feet", "steps" ],
+    char: "\ud83d\udeb6",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  dancer: {
+    keywords: [ "female", "girl", "woman", "fun" ],
+    char: "\ud83d\udc83",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_dancing: {
+    keywords: [ "male", "boy", "fun", "dancer" ],
+    char: "\ud83d\udd7a",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  dancing_women: {
+    keywords: [ "female", "bunny", "women", "girls" ],
+    char: "\ud83d\udc6f",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  dancing_men: {
+    keywords: [ "male", "bunny", "men", "boys" ],
+    char: "\ud83d\udc6f\u200d\u2642\ufe0f",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  couple: {
+    keywords: [ "pair", "people", "human", "love", "date", "dating", "like", "affection", "valentines", "marriage" ],
+    char: "\ud83d\udc6b",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  two_men_holding_hands: {
+    keywords: [ "pair", "couple", "love", "like", "bromance", "friendship", "people", "human" ],
+    char: "\ud83d\udc6c",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  two_women_holding_hands: {
+    keywords: [ "pair", "friendship", "couple", "love", "like", "female", "people", "human" ],
+    char: "\ud83d\udc6d",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  bowing_woman: {
+    keywords: [ "woman", "female", "girl" ],
+    char: "\ud83d\ude47\u200d\u2640\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  bowing_man: {
+    keywords: [ "man", "male", "boy" ],
+    char: "\ud83d\ude47",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_facepalming: {
+    keywords: [ "man", "male", "boy", "disbelief" ],
+    char: "\ud83e\udd26\u200d\u2642\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_facepalming: {
+    keywords: [ "woman", "female", "girl", "disbelief" ],
+    char: "\ud83e\udd26\u200d\u2640\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_shrugging: {
+    keywords: [ "woman", "female", "girl", "confused", "indifferent", "doubt" ],
+    char: "\ud83e\udd37",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_shrugging: {
+    keywords: [ "man", "male", "boy", "confused", "indifferent", "doubt" ],
+    char: "\ud83e\udd37\u200d\u2642\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  tipping_hand_woman: {
+    keywords: [ "female", "girl", "woman", "human", "information" ],
+    char: "\ud83d\udc81",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  tipping_hand_man: {
+    keywords: [ "male", "boy", "man", "human", "information" ],
+    char: "\ud83d\udc81\u200d\u2642\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  no_good_woman: {
+    keywords: [ "female", "girl", "woman", "nope" ],
+    char: "\ud83d\ude45",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  no_good_man: {
+    keywords: [ "male", "boy", "man", "nope" ],
+    char: "\ud83d\ude45\u200d\u2642\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  ok_woman: {
+    keywords: [ "women", "girl", "female", "pink", "human", "woman" ],
+    char: "\ud83d\ude46",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  ok_man: {
+    keywords: [ "men", "boy", "male", "blue", "human", "man" ],
+    char: "\ud83d\ude46\u200d\u2642\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  raising_hand_woman: {
+    keywords: [ "female", "girl", "woman" ],
+    char: "\ud83d\ude4b",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  raising_hand_man: {
+    keywords: [ "male", "boy", "man" ],
+    char: "\ud83d\ude4b\u200d\u2642\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  pouting_woman: {
+    keywords: [ "female", "girl", "woman" ],
+    char: "\ud83d\ude4e",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  pouting_man: {
+    keywords: [ "male", "boy", "man" ],
+    char: "\ud83d\ude4e\u200d\u2642\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  frowning_woman: {
+    keywords: [ "female", "girl", "woman", "sad", "depressed", "discouraged", "unhappy" ],
+    char: "\ud83d\ude4d",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  frowning_man: {
+    keywords: [ "male", "boy", "man", "sad", "depressed", "discouraged", "unhappy" ],
+    char: "\ud83d\ude4d\u200d\u2642\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  haircut_woman: {
+    keywords: [ "female", "girl", "woman" ],
+    char: "\ud83d\udc87",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  haircut_man: {
+    keywords: [ "male", "boy", "man" ],
+    char: "\ud83d\udc87\u200d\u2642\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  massage_woman: {
+    keywords: [ "female", "girl", "woman", "head" ],
+    char: "\ud83d\udc86",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  massage_man: {
+    keywords: [ "male", "boy", "man", "head" ],
+    char: "\ud83d\udc86\u200d\u2642\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  woman_in_steamy_room: {
+    keywords: [ "female", "woman", "spa", "steamroom", "sauna" ],
+    char: "\ud83e\uddd6\u200d\u2640\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  man_in_steamy_room: {
+    keywords: [ "male", "man", "spa", "steamroom", "sauna" ],
+    char: "\ud83e\uddd6\u200d\u2642\ufe0f",
+    fitzpatrick_scale: true,
+    category: "people"
+  },
+  couple_with_heart_woman_man: {
+    keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ],
+    char: "\ud83d\udc91",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  couple_with_heart_woman_woman: {
+    keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ],
+    char: "\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc69",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  couple_with_heart_man_man: {
+    keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ],
+    char: "\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  couplekiss_man_woman: {
+    keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ],
+    char: "\ud83d\udc8f",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  couplekiss_woman_woman: {
+    keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ],
+    char: "\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  couplekiss_man_man: {
+    keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ],
+    char: "\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_man_woman_boy: {
+    keywords: [ "home", "parents", "child", "mom", "dad", "father", "mother", "people", "human" ],
+    char: "\ud83d\udc6a",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_man_woman_girl: {
+    keywords: [ "home", "parents", "people", "human", "child" ],
+    char: "\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_man_woman_girl_boy: {
+    keywords: [ "home", "parents", "people", "human", "children" ],
+    char: "\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_man_woman_boy_boy: {
+    keywords: [ "home", "parents", "people", "human", "children" ],
+    char: "\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_man_woman_girl_girl: {
+    keywords: [ "home", "parents", "people", "human", "children" ],
+    char: "\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_woman_woman_boy: {
+    keywords: [ "home", "parents", "people", "human", "children" ],
+    char: "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_woman_woman_girl: {
+    keywords: [ "home", "parents", "people", "human", "children" ],
+    char: "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_woman_woman_girl_boy: {
+    keywords: [ "home", "parents", "people", "human", "children" ],
+    char: "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_woman_woman_boy_boy: {
+    keywords: [ "home", "parents", "people", "human", "children" ],
+    char: "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_woman_woman_girl_girl: {
+    keywords: [ "home", "parents", "people", "human", "children" ],
+    char: "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_man_man_boy: {
+    keywords: [ "home", "parents", "people", "human", "children" ],
+    char: "\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_man_man_girl: {
+    keywords: [ "home", "parents", "people", "human", "children" ],
+    char: "\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_man_man_girl_boy: {
+    keywords: [ "home", "parents", "people", "human", "children" ],
+    char: "\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_man_man_boy_boy: {
+    keywords: [ "home", "parents", "people", "human", "children" ],
+    char: "\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_man_man_girl_girl: {
+    keywords: [ "home", "parents", "people", "human", "children" ],
+    char: "\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_woman_boy: {
+    keywords: [ "home", "parent", "people", "human", "child" ],
+    char: "\ud83d\udc69\u200d\ud83d\udc66",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_woman_girl: {
+    keywords: [ "home", "parent", "people", "human", "child" ],
+    char: "\ud83d\udc69\u200d\ud83d\udc67",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_woman_girl_boy: {
+    keywords: [ "home", "parent", "people", "human", "children" ],
+    char: "\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_woman_boy_boy: {
+    keywords: [ "home", "parent", "people", "human", "children" ],
+    char: "\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_woman_girl_girl: {
+    keywords: [ "home", "parent", "people", "human", "children" ],
+    char: "\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_man_boy: {
+    keywords: [ "home", "parent", "people", "human", "child" ],
+    char: "\ud83d\udc68\u200d\ud83d\udc66",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_man_girl: {
+    keywords: [ "home", "parent", "people", "human", "child" ],
+    char: "\ud83d\udc68\u200d\ud83d\udc67",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_man_girl_boy: {
+    keywords: [ "home", "parent", "people", "human", "children" ],
+    char: "\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_man_boy_boy: {
+    keywords: [ "home", "parent", "people", "human", "children" ],
+    char: "\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  family_man_girl_girl: {
+    keywords: [ "home", "parent", "people", "human", "children" ],
+    char: "\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  yarn: {
+    keywords: [ "ball", "crochet", "knit" ],
+    char: "\ud83e\uddf6",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  thread: {
+    keywords: [ "needle", "sewing", "spool", "string" ],
+    char: "\ud83e\uddf5",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  coat: {
+    keywords: [ "jacket" ],
+    char: "\ud83e\udde5",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  labcoat: {
+    keywords: [ "doctor", "experiment", "scientist", "chemist" ],
+    char: "\ud83e\udd7c",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  womans_clothes: {
+    keywords: [ "fashion", "shopping_bags", "female" ],
+    char: "\ud83d\udc5a",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  tshirt: {
+    keywords: [ "fashion", "cloth", "casual", "shirt", "tee" ],
+    char: "\ud83d\udc55",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  jeans: {
+    keywords: [ "fashion", "shopping" ],
+    char: "\ud83d\udc56",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  necktie: {
+    keywords: [ "shirt", "suitup", "formal", "fashion", "cloth", "business" ],
+    char: "\ud83d\udc54",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  dress: {
+    keywords: [ "clothes", "fashion", "shopping" ],
+    char: "\ud83d\udc57",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  bikini: {
+    keywords: [ "swimming", "female", "woman", "girl", "fashion", "beach", "summer" ],
+    char: "\ud83d\udc59",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  kimono: {
+    keywords: [ "dress", "fashion", "women", "female", "japanese" ],
+    char: "\ud83d\udc58",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  lipstick: {
+    keywords: [ "female", "girl", "fashion", "woman" ],
+    char: "\ud83d\udc84",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  kiss: {
+    keywords: [ "face", "lips", "love", "like", "affection", "valentines" ],
+    char: "\ud83d\udc8b",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  footprints: {
+    keywords: [ "feet", "tracking", "walking", "beach" ],
+    char: "\ud83d\udc63",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  flat_shoe: {
+    keywords: [ "ballet", "slip-on", "slipper" ],
+    char: "\ud83e\udd7f",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  high_heel: {
+    keywords: [ "fashion", "shoes", "female", "pumps", "stiletto" ],
+    char: "\ud83d\udc60",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  sandal: {
+    keywords: [ "shoes", "fashion", "flip flops" ],
+    char: "\ud83d\udc61",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  boot: {
+    keywords: [ "shoes", "fashion" ],
+    char: "\ud83d\udc62",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  mans_shoe: {
+    keywords: [ "fashion", "male" ],
+    char: "\ud83d\udc5e",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  athletic_shoe: {
+    keywords: [ "shoes", "sports", "sneakers" ],
+    char: "\ud83d\udc5f",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  hiking_boot: {
+    keywords: [ "backpacking", "camping", "hiking" ],
+    char: "\ud83e\udd7e",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  socks: {
+    keywords: [ "stockings", "clothes" ],
+    char: "\ud83e\udde6",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  gloves: {
+    keywords: [ "hands", "winter", "clothes" ],
+    char: "\ud83e\udde4",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  scarf: {
+    keywords: [ "neck", "winter", "clothes" ],
+    char: "\ud83e\udde3",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  womans_hat: {
+    keywords: [ "fashion", "accessories", "female", "lady", "spring" ],
+    char: "\ud83d\udc52",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  tophat: {
+    keywords: [ "magic", "gentleman", "classy", "circus" ],
+    char: "\ud83c\udfa9",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  billed_hat: {
+    keywords: [ "cap", "baseball" ],
+    char: "\ud83e\udde2",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  rescue_worker_helmet: {
+    keywords: [ "construction", "build" ],
+    char: "\u26d1",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  mortar_board: {
+    keywords: [ "school", "college", "degree", "university", "graduation", "cap", "hat", "legal", "learn", "education" ],
+    char: "\ud83c\udf93",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  crown: {
+    keywords: [ "king", "kod", "leader", "royalty", "lord" ],
+    char: "\ud83d\udc51",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  school_satchel: {
+    keywords: [ "student", "education", "bag", "backpack" ],
+    char: "\ud83c\udf92",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  luggage: {
+    keywords: [ "packing", "travel" ],
+    char: "\ud83e\uddf3",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  pouch: {
+    keywords: [ "bag", "accessories", "shopping" ],
+    char: "\ud83d\udc5d",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  purse: {
+    keywords: [ "fashion", "accessories", "money", "sales", "shopping" ],
+    char: "\ud83d\udc5b",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  handbag: {
+    keywords: [ "fashion", "accessory", "accessories", "shopping" ],
+    char: "\ud83d\udc5c",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  briefcase: {
+    keywords: [ "business", "documents", "work", "law", "legal", "job", "career" ],
+    char: "\ud83d\udcbc",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  eyeglasses: {
+    keywords: [ "fashion", "accessories", "eyesight", "nerdy", "dork", "geek" ],
+    char: "\ud83d\udc53",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  dark_sunglasses: {
+    keywords: [ "face", "cool", "accessories" ],
+    char: "\ud83d\udd76",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  goggles: {
+    keywords: [ "eyes", "protection", "safety" ],
+    char: "\ud83e\udd7d",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  ring: {
+    keywords: [ "wedding", "propose", "marriage", "valentines", "diamond", "fashion", "jewelry", "gem", "engagement" ],
+    char: "\ud83d\udc8d",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  closed_umbrella: {
+    keywords: [ "weather", "rain", "drizzle" ],
+    char: "\ud83c\udf02",
+    fitzpatrick_scale: false,
+    category: "people"
+  },
+  dog: {
+    keywords: [ "animal", "friend", "nature", "woof", "puppy", "pet", "faithful" ],
+    char: "\ud83d\udc36",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  cat: {
+    keywords: [ "animal", "meow", "nature", "pet", "kitten" ],
+    char: "\ud83d\udc31",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  mouse: {
+    keywords: [ "animal", "nature", "cheese_wedge", "rodent" ],
+    char: "\ud83d\udc2d",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  hamster: {
+    keywords: [ "animal", "nature" ],
+    char: "\ud83d\udc39",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  rabbit: {
+    keywords: [ "animal", "nature", "pet", "spring", "magic", "bunny" ],
+    char: "\ud83d\udc30",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  fox_face: {
+    keywords: [ "animal", "nature", "face" ],
+    char: "\ud83e\udd8a",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  bear: {
+    keywords: [ "animal", "nature", "wild" ],
+    char: "\ud83d\udc3b",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  panda_face: {
+    keywords: [ "animal", "nature", "panda" ],
+    char: "\ud83d\udc3c",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  koala: {
+    keywords: [ "animal", "nature" ],
+    char: "\ud83d\udc28",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  tiger: {
+    keywords: [ "animal", "cat", "danger", "wild", "nature", "roar" ],
+    char: "\ud83d\udc2f",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  lion: {
+    keywords: [ "animal", "nature" ],
+    char: "\ud83e\udd81",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  cow: {
+    keywords: [ "beef", "ox", "animal", "nature", "moo", "milk" ],
+    char: "\ud83d\udc2e",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  pig: {
+    keywords: [ "animal", "oink", "nature" ],
+    char: "\ud83d\udc37",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  pig_nose: {
+    keywords: [ "animal", "oink" ],
+    char: "\ud83d\udc3d",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  frog: {
+    keywords: [ "animal", "nature", "croak", "toad" ],
+    char: "\ud83d\udc38",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  squid: {
+    keywords: [ "animal", "nature", "ocean", "sea" ],
+    char: "\ud83e\udd91",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  octopus: {
+    keywords: [ "animal", "creature", "ocean", "sea", "nature", "beach" ],
+    char: "\ud83d\udc19",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  shrimp: {
+    keywords: [ "animal", "ocean", "nature", "seafood" ],
+    char: "\ud83e\udd90",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  monkey_face: {
+    keywords: [ "animal", "nature", "circus" ],
+    char: "\ud83d\udc35",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  gorilla: {
+    keywords: [ "animal", "nature", "circus" ],
+    char: "\ud83e\udd8d",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  see_no_evil: {
+    keywords: [ "monkey", "animal", "nature", "haha" ],
+    char: "\ud83d\ude48",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  hear_no_evil: {
+    keywords: [ "animal", "monkey", "nature" ],
+    char: "\ud83d\ude49",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  speak_no_evil: {
+    keywords: [ "monkey", "animal", "nature", "omg" ],
+    char: "\ud83d\ude4a",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  monkey: {
+    keywords: [ "animal", "nature", "banana", "circus" ],
+    char: "\ud83d\udc12",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  chicken: {
+    keywords: [ "animal", "cluck", "nature", "bird" ],
+    char: "\ud83d\udc14",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  penguin: {
+    keywords: [ "animal", "nature" ],
+    char: "\ud83d\udc27",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  bird: {
+    keywords: [ "animal", "nature", "fly", "tweet", "spring" ],
+    char: "\ud83d\udc26",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  baby_chick: {
+    keywords: [ "animal", "chicken", "bird" ],
+    char: "\ud83d\udc24",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  hatching_chick: {
+    keywords: [ "animal", "chicken", "egg", "born", "baby", "bird" ],
+    char: "\ud83d\udc23",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  hatched_chick: {
+    keywords: [ "animal", "chicken", "baby", "bird" ],
+    char: "\ud83d\udc25",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  duck: {
+    keywords: [ "animal", "nature", "bird", "mallard" ],
+    char: "\ud83e\udd86",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  eagle: {
+    keywords: [ "animal", "nature", "bird" ],
+    char: "\ud83e\udd85",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  owl: {
+    keywords: [ "animal", "nature", "bird", "hoot" ],
+    char: "\ud83e\udd89",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  bat: {
+    keywords: [ "animal", "nature", "blind", "vampire" ],
+    char: "\ud83e\udd87",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  wolf: {
+    keywords: [ "animal", "nature", "wild" ],
+    char: "\ud83d\udc3a",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  boar: {
+    keywords: [ "animal", "nature" ],
+    char: "\ud83d\udc17",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  horse: {
+    keywords: [ "animal", "brown", "nature" ],
+    char: "\ud83d\udc34",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  unicorn: {
+    keywords: [ "animal", "nature", "mystical" ],
+    char: "\ud83e\udd84",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  honeybee: {
+    keywords: [ "animal", "insect", "nature", "bug", "spring", "honey" ],
+    char: "\ud83d\udc1d",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  bug: {
+    keywords: [ "animal", "insect", "nature", "worm" ],
+    char: "\ud83d\udc1b",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  butterfly: {
+    keywords: [ "animal", "insect", "nature", "caterpillar" ],
+    char: "\ud83e\udd8b",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  snail: {
+    keywords: [ "slow", "animal", "shell" ],
+    char: "\ud83d\udc0c",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  beetle: {
+    keywords: [ "animal", "insect", "nature", "ladybug" ],
+    char: "\ud83d\udc1e",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  ant: {
+    keywords: [ "animal", "insect", "nature", "bug" ],
+    char: "\ud83d\udc1c",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  grasshopper: {
+    keywords: [ "animal", "cricket", "chirp" ],
+    char: "\ud83e\udd97",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  spider: {
+    keywords: [ "animal", "arachnid" ],
+    char: "\ud83d\udd77",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  scorpion: {
+    keywords: [ "animal", "arachnid" ],
+    char: "\ud83e\udd82",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  crab: {
+    keywords: [ "animal", "crustacean" ],
+    char: "\ud83e\udd80",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  snake: {
+    keywords: [ "animal", "evil", "nature", "hiss", "python" ],
+    char: "\ud83d\udc0d",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  lizard: {
+    keywords: [ "animal", "nature", "reptile" ],
+    char: "\ud83e\udd8e",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  "t-rex": {
+    keywords: [ "animal", "nature", "dinosaur", "tyrannosaurus", "extinct" ],
+    char: "\ud83e\udd96",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  sauropod: {
+    keywords: [ "animal", "nature", "dinosaur", "brachiosaurus", "brontosaurus", "diplodocus", "extinct" ],
+    char: "\ud83e\udd95",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  turtle: {
+    keywords: [ "animal", "slow", "nature", "tortoise" ],
+    char: "\ud83d\udc22",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  tropical_fish: {
+    keywords: [ "animal", "swim", "ocean", "beach", "nemo" ],
+    char: "\ud83d\udc20",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  fish: {
+    keywords: [ "animal", "food", "nature" ],
+    char: "\ud83d\udc1f",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  blowfish: {
+    keywords: [ "animal", "nature", "food", "sea", "ocean" ],
+    char: "\ud83d\udc21",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  dolphin: {
+    keywords: [ "animal", "nature", "fish", "sea", "ocean", "flipper", "fins", "beach" ],
+    char: "\ud83d\udc2c",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  shark: {
+    keywords: [ "animal", "nature", "fish", "sea", "ocean", "jaws", "fins", "beach" ],
+    char: "\ud83e\udd88",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  whale: {
+    keywords: [ "animal", "nature", "sea", "ocean" ],
+    char: "\ud83d\udc33",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  whale2: {
+    keywords: [ "animal", "nature", "sea", "ocean" ],
+    char: "\ud83d\udc0b",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  crocodile: {
+    keywords: [ "animal", "nature", "reptile", "lizard", "alligator" ],
+    char: "\ud83d\udc0a",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  leopard: {
+    keywords: [ "animal", "nature" ],
+    char: "\ud83d\udc06",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  zebra: {
+    keywords: [ "animal", "nature", "stripes", "safari" ],
+    char: "\ud83e\udd93",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  tiger2: {
+    keywords: [ "animal", "nature", "roar" ],
+    char: "\ud83d\udc05",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  water_buffalo: {
+    keywords: [ "animal", "nature", "ox", "cow" ],
+    char: "\ud83d\udc03",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  ox: {
+    keywords: [ "animal", "cow", "beef" ],
+    char: "\ud83d\udc02",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  cow2: {
+    keywords: [ "beef", "ox", "animal", "nature", "moo", "milk" ],
+    char: "\ud83d\udc04",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  deer: {
+    keywords: [ "animal", "nature", "horns", "venison" ],
+    char: "\ud83e\udd8c",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  dromedary_camel: {
+    keywords: [ "animal", "hot", "desert", "hump" ],
+    char: "\ud83d\udc2a",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  camel: {
+    keywords: [ "animal", "nature", "hot", "desert", "hump" ],
+    char: "\ud83d\udc2b",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  giraffe: {
+    keywords: [ "animal", "nature", "spots", "safari" ],
+    char: "\ud83e\udd92",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  elephant: {
+    keywords: [ "animal", "nature", "nose", "th", "circus" ],
+    char: "\ud83d\udc18",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  rhinoceros: {
+    keywords: [ "animal", "nature", "horn" ],
+    char: "\ud83e\udd8f",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  goat: {
+    keywords: [ "animal", "nature" ],
+    char: "\ud83d\udc10",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  ram: {
+    keywords: [ "animal", "sheep", "nature" ],
+    char: "\ud83d\udc0f",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  sheep: {
+    keywords: [ "animal", "nature", "wool", "shipit" ],
+    char: "\ud83d\udc11",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  racehorse: {
+    keywords: [ "animal", "gamble", "luck" ],
+    char: "\ud83d\udc0e",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  pig2: {
+    keywords: [ "animal", "nature" ],
+    char: "\ud83d\udc16",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  rat: {
+    keywords: [ "animal", "mouse", "rodent" ],
+    char: "\ud83d\udc00",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  mouse2: {
+    keywords: [ "animal", "nature", "rodent" ],
+    char: "\ud83d\udc01",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  rooster: {
+    keywords: [ "animal", "nature", "chicken" ],
+    char: "\ud83d\udc13",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  turkey: {
+    keywords: [ "animal", "bird" ],
+    char: "\ud83e\udd83",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  dove: {
+    keywords: [ "animal", "bird" ],
+    char: "\ud83d\udd4a",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  dog2: {
+    keywords: [ "animal", "nature", "friend", "doge", "pet", "faithful" ],
+    char: "\ud83d\udc15",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  poodle: {
+    keywords: [ "dog", "animal", "101", "nature", "pet" ],
+    char: "\ud83d\udc29",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  cat2: {
+    keywords: [ "animal", "meow", "pet", "cats" ],
+    char: "\ud83d\udc08",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  rabbit2: {
+    keywords: [ "animal", "nature", "pet", "magic", "spring" ],
+    char: "\ud83d\udc07",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  chipmunk: {
+    keywords: [ "animal", "nature", "rodent", "squirrel" ],
+    char: "\ud83d\udc3f",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  hedgehog: {
+    keywords: [ "animal", "nature", "spiny" ],
+    char: "\ud83e\udd94",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  raccoon: {
+    keywords: [ "animal", "nature" ],
+    char: "\ud83e\udd9d",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  llama: {
+    keywords: [ "animal", "nature", "alpaca" ],
+    char: "\ud83e\udd99",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  hippopotamus: {
+    keywords: [ "animal", "nature" ],
+    char: "\ud83e\udd9b",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  kangaroo: {
+    keywords: [ "animal", "nature", "australia", "joey", "hop", "marsupial" ],
+    char: "\ud83e\udd98",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  badger: {
+    keywords: [ "animal", "nature", "honey" ],
+    char: "\ud83e\udda1",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  swan: {
+    keywords: [ "animal", "nature", "bird" ],
+    char: "\ud83e\udda2",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  peacock: {
+    keywords: [ "animal", "nature", "peahen", "bird" ],
+    char: "\ud83e\udd9a",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  parrot: {
+    keywords: [ "animal", "nature", "bird", "pirate", "talk" ],
+    char: "\ud83e\udd9c",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  lobster: {
+    keywords: [ "animal", "nature", "bisque", "claws", "seafood" ],
+    char: "\ud83e\udd9e",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  mosquito: {
+    keywords: [ "animal", "nature", "insect", "malaria" ],
+    char: "\ud83e\udd9f",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  paw_prints: {
+    keywords: [ "animal", "tracking", "footprints", "dog", "cat", "pet", "feet" ],
+    char: "\ud83d\udc3e",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  dragon: {
+    keywords: [ "animal", "myth", "nature", "chinese", "green" ],
+    char: "\ud83d\udc09",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  dragon_face: {
+    keywords: [ "animal", "myth", "nature", "chinese", "green" ],
+    char: "\ud83d\udc32",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  cactus: {
+    keywords: [ "vegetable", "plant", "nature" ],
+    char: "\ud83c\udf35",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  christmas_tree: {
+    keywords: [ "festival", "vacation", "december", "xmas", "celebration" ],
+    char: "\ud83c\udf84",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  evergreen_tree: {
+    keywords: [ "plant", "nature" ],
+    char: "\ud83c\udf32",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  deciduous_tree: {
+    keywords: [ "plant", "nature" ],
+    char: "\ud83c\udf33",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  palm_tree: {
+    keywords: [ "plant", "vegetable", "nature", "summer", "beach", "mojito", "tropical" ],
+    char: "\ud83c\udf34",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  seedling: {
+    keywords: [ "plant", "nature", "grass", "lawn", "spring" ],
+    char: "\ud83c\udf31",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  herb: {
+    keywords: [ "vegetable", "plant", "medicine", "weed", "grass", "lawn" ],
+    char: "\ud83c\udf3f",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  shamrock: {
+    keywords: [ "vegetable", "plant", "nature", "irish", "clover" ],
+    char: "\u2618",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  four_leaf_clover: {
+    keywords: [ "vegetable", "plant", "nature", "lucky", "irish" ],
+    char: "\ud83c\udf40",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  bamboo: {
+    keywords: [ "plant", "nature", "vegetable", "panda", "pine_decoration" ],
+    char: "\ud83c\udf8d",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  tanabata_tree: {
+    keywords: [ "plant", "nature", "branch", "summer" ],
+    char: "\ud83c\udf8b",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  leaves: {
+    keywords: [ "nature", "plant", "tree", "vegetable", "grass", "lawn", "spring" ],
+    char: "\ud83c\udf43",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  fallen_leaf: {
+    keywords: [ "nature", "plant", "vegetable", "leaves" ],
+    char: "\ud83c\udf42",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  maple_leaf: {
+    keywords: [ "nature", "plant", "vegetable", "ca", "fall" ],
+    char: "\ud83c\udf41",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  ear_of_rice: {
+    keywords: [ "nature", "plant" ],
+    char: "\ud83c\udf3e",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  hibiscus: {
+    keywords: [ "plant", "vegetable", "flowers", "beach" ],
+    char: "\ud83c\udf3a",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  sunflower: {
+    keywords: [ "nature", "plant", "fall" ],
+    char: "\ud83c\udf3b",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  rose: {
+    keywords: [ "flowers", "valentines", "love", "spring" ],
+    char: "\ud83c\udf39",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  wilted_flower: {
+    keywords: [ "plant", "nature", "flower" ],
+    char: "\ud83e\udd40",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  tulip: {
+    keywords: [ "flowers", "plant", "nature", "summer", "spring" ],
+    char: "\ud83c\udf37",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  blossom: {
+    keywords: [ "nature", "flowers", "yellow" ],
+    char: "\ud83c\udf3c",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  cherry_blossom: {
+    keywords: [ "nature", "plant", "spring", "flower" ],
+    char: "\ud83c\udf38",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  bouquet: {
+    keywords: [ "flowers", "nature", "spring" ],
+    char: "\ud83d\udc90",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  mushroom: {
+    keywords: [ "plant", "vegetable" ],
+    char: "\ud83c\udf44",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  chestnut: {
+    keywords: [ "food", "squirrel" ],
+    char: "\ud83c\udf30",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  jack_o_lantern: {
+    keywords: [ "halloween", "light", "pumpkin", "creepy", "fall" ],
+    char: "\ud83c\udf83",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  shell: {
+    keywords: [ "nature", "sea", "beach" ],
+    char: "\ud83d\udc1a",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  spider_web: {
+    keywords: [ "animal", "insect", "arachnid", "silk" ],
+    char: "\ud83d\udd78",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  earth_americas: {
+    keywords: [ "globe", "world", "USA", "international" ],
+    char: "\ud83c\udf0e",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  earth_africa: {
+    keywords: [ "globe", "world", "international" ],
+    char: "\ud83c\udf0d",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  earth_asia: {
+    keywords: [ "globe", "world", "east", "international" ],
+    char: "\ud83c\udf0f",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  full_moon: {
+    keywords: [ "nature", "yellow", "twilight", "planet", "space", "night", "evening", "sleep" ],
+    char: "\ud83c\udf15",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  waning_gibbous_moon: {
+    keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep", "waxing_gibbous_moon" ],
+    char: "\ud83c\udf16",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  last_quarter_moon: {
+    keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ],
+    char: "\ud83c\udf17",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  waning_crescent_moon: {
+    keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ],
+    char: "\ud83c\udf18",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  new_moon: {
+    keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ],
+    char: "\ud83c\udf11",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  waxing_crescent_moon: {
+    keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ],
+    char: "\ud83c\udf12",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  first_quarter_moon: {
+    keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ],
+    char: "\ud83c\udf13",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  waxing_gibbous_moon: {
+    keywords: [ "nature", "night", "sky", "gray", "twilight", "planet", "space", "evening", "sleep" ],
+    char: "\ud83c\udf14",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  new_moon_with_face: {
+    keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ],
+    char: "\ud83c\udf1a",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  full_moon_with_face: {
+    keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ],
+    char: "\ud83c\udf1d",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  first_quarter_moon_with_face: {
+    keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ],
+    char: "\ud83c\udf1b",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  last_quarter_moon_with_face: {
+    keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ],
+    char: "\ud83c\udf1c",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  sun_with_face: {
+    keywords: [ "nature", "morning", "sky" ],
+    char: "\ud83c\udf1e",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  crescent_moon: {
+    keywords: [ "night", "sleep", "sky", "evening", "magic" ],
+    char: "\ud83c\udf19",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  star: {
+    keywords: [ "night", "yellow" ],
+    char: "\u2b50",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  star2: {
+    keywords: [ "night", "sparkle", "awesome", "good", "magic" ],
+    char: "\ud83c\udf1f",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  dizzy: {
+    keywords: [ "star", "sparkle", "shoot", "magic" ],
+    char: "\ud83d\udcab",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  sparkles: {
+    keywords: [ "stars", "shine", "shiny", "cool", "awesome", "good", "magic" ],
+    char: "\u2728",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  comet: {
+    keywords: [ "space" ],
+    char: "\u2604",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  sunny: {
+    keywords: [ "weather", "nature", "brightness", "summer", "beach", "spring" ],
+    char: "\u2600\ufe0f",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  sun_behind_small_cloud: {
+    keywords: [ "weather" ],
+    char: "\ud83c\udf24",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  partly_sunny: {
+    keywords: [ "weather", "nature", "cloudy", "morning", "fall", "spring" ],
+    char: "\u26c5",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  sun_behind_large_cloud: {
+    keywords: [ "weather" ],
+    char: "\ud83c\udf25",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  sun_behind_rain_cloud: {
+    keywords: [ "weather" ],
+    char: "\ud83c\udf26",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  cloud: {
+    keywords: [ "weather", "sky" ],
+    char: "\u2601\ufe0f",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  cloud_with_rain: {
+    keywords: [ "weather" ],
+    char: "\ud83c\udf27",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  cloud_with_lightning_and_rain: {
+    keywords: [ "weather", "lightning" ],
+    char: "\u26c8",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  cloud_with_lightning: {
+    keywords: [ "weather", "thunder" ],
+    char: "\ud83c\udf29",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  zap: {
+    keywords: [ "thunder", "weather", "lightning bolt", "fast" ],
+    char: "\u26a1",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  fire: {
+    keywords: [ "hot", "cook", "flame" ],
+    char: "\ud83d\udd25",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  boom: {
+    keywords: [ "bomb", "explode", "explosion", "collision", "blown" ],
+    char: "\ud83d\udca5",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  snowflake: {
+    keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas" ],
+    char: "\u2744\ufe0f",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  cloud_with_snow: {
+    keywords: [ "weather" ],
+    char: "\ud83c\udf28",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  snowman: {
+    keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas", "frozen", "without_snow" ],
+    char: "\u26c4",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  snowman_with_snow: {
+    keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas", "frozen" ],
+    char: "\u2603",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  wind_face: {
+    keywords: [ "gust", "air" ],
+    char: "\ud83c\udf2c",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  dash: {
+    keywords: [ "wind", "air", "fast", "shoo", "fart", "smoke", "puff" ],
+    char: "\ud83d\udca8",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  tornado: {
+    keywords: [ "weather", "cyclone", "twister" ],
+    char: "\ud83c\udf2a",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  fog: {
+    keywords: [ "weather" ],
+    char: "\ud83c\udf2b",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  open_umbrella: {
+    keywords: [ "weather", "spring" ],
+    char: "\u2602",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  umbrella: {
+    keywords: [ "rainy", "weather", "spring" ],
+    char: "\u2614",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  droplet: {
+    keywords: [ "water", "drip", "faucet", "spring" ],
+    char: "\ud83d\udca7",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  sweat_drops: {
+    keywords: [ "water", "drip", "oops" ],
+    char: "\ud83d\udca6",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  ocean: {
+    keywords: [ "sea", "water", "wave", "nature", "tsunami", "disaster" ],
+    char: "\ud83c\udf0a",
+    fitzpatrick_scale: false,
+    category: "animals_and_nature"
+  },
+  green_apple: {
+    keywords: [ "fruit", "nature" ],
+    char: "\ud83c\udf4f",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  apple: {
+    keywords: [ "fruit", "mac", "school" ],
+    char: "\ud83c\udf4e",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  pear: {
+    keywords: [ "fruit", "nature", "food" ],
+    char: "\ud83c\udf50",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  tangerine: {
+    keywords: [ "food", "fruit", "nature", "orange" ],
+    char: "\ud83c\udf4a",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  lemon: {
+    keywords: [ "fruit", "nature" ],
+    char: "\ud83c\udf4b",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  banana: {
+    keywords: [ "fruit", "food", "monkey" ],
+    char: "\ud83c\udf4c",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  watermelon: {
+    keywords: [ "fruit", "food", "picnic", "summer" ],
+    char: "\ud83c\udf49",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  grapes: {
+    keywords: [ "fruit", "food", "wine" ],
+    char: "\ud83c\udf47",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  strawberry: {
+    keywords: [ "fruit", "food", "nature" ],
+    char: "\ud83c\udf53",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  melon: {
+    keywords: [ "fruit", "nature", "food" ],
+    char: "\ud83c\udf48",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  cherries: {
+    keywords: [ "food", "fruit" ],
+    char: "\ud83c\udf52",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  peach: {
+    keywords: [ "fruit", "nature", "food" ],
+    char: "\ud83c\udf51",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  pineapple: {
+    keywords: [ "fruit", "nature", "food" ],
+    char: "\ud83c\udf4d",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  coconut: {
+    keywords: [ "fruit", "nature", "food", "palm" ],
+    char: "\ud83e\udd65",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  kiwi_fruit: {
+    keywords: [ "fruit", "food" ],
+    char: "\ud83e\udd5d",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  mango: {
+    keywords: [ "fruit", "food", "tropical" ],
+    char: "\ud83e\udd6d",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  avocado: {
+    keywords: [ "fruit", "food" ],
+    char: "\ud83e\udd51",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  broccoli: {
+    keywords: [ "fruit", "food", "vegetable" ],
+    char: "\ud83e\udd66",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  tomato: {
+    keywords: [ "fruit", "vegetable", "nature", "food" ],
+    char: "\ud83c\udf45",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  eggplant: {
+    keywords: [ "vegetable", "nature", "food", "aubergine" ],
+    char: "\ud83c\udf46",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  cucumber: {
+    keywords: [ "fruit", "food", "pickle" ],
+    char: "\ud83e\udd52",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  carrot: {
+    keywords: [ "vegetable", "food", "orange" ],
+    char: "\ud83e\udd55",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  hot_pepper: {
+    keywords: [ "food", "spicy", "chilli", "chili" ],
+    char: "\ud83c\udf36",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  potato: {
+    keywords: [ "food", "tuber", "vegatable", "starch" ],
+    char: "\ud83e\udd54",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  corn: {
+    keywords: [ "food", "vegetable", "plant" ],
+    char: "\ud83c\udf3d",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  leafy_greens: {
+    keywords: [ "food", "vegetable", "plant", "bok choy", "cabbage", "kale", "lettuce" ],
+    char: "\ud83e\udd6c",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  sweet_potato: {
+    keywords: [ "food", "nature" ],
+    char: "\ud83c\udf60",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  peanuts: {
+    keywords: [ "food", "nut" ],
+    char: "\ud83e\udd5c",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  honey_pot: {
+    keywords: [ "bees", "sweet", "kitchen" ],
+    char: "\ud83c\udf6f",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  croissant: {
+    keywords: [ "food", "bread", "french" ],
+    char: "\ud83e\udd50",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  bread: {
+    keywords: [ "food", "wheat", "breakfast", "toast" ],
+    char: "\ud83c\udf5e",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  baguette_bread: {
+    keywords: [ "food", "bread", "french" ],
+    char: "\ud83e\udd56",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  bagel: {
+    keywords: [ "food", "bread", "bakery", "schmear" ],
+    char: "\ud83e\udd6f",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  pretzel: {
+    keywords: [ "food", "bread", "twisted" ],
+    char: "\ud83e\udd68",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  cheese: {
+    keywords: [ "food", "chadder" ],
+    char: "\ud83e\uddc0",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  egg: {
+    keywords: [ "food", "chicken", "breakfast" ],
+    char: "\ud83e\udd5a",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  bacon: {
+    keywords: [ "food", "breakfast", "pork", "pig", "meat" ],
+    char: "\ud83e\udd53",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  steak: {
+    keywords: [ "food", "cow", "meat", "cut", "chop", "lambchop", "porkchop" ],
+    char: "\ud83e\udd69",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  pancakes: {
+    keywords: [ "food", "breakfast", "flapjacks", "hotcakes" ],
+    char: "\ud83e\udd5e",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  poultry_leg: {
+    keywords: [ "food", "meat", "drumstick", "bird", "chicken", "turkey" ],
+    char: "\ud83c\udf57",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  meat_on_bone: {
+    keywords: [ "good", "food", "drumstick" ],
+    char: "\ud83c\udf56",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  bone: {
+    keywords: [ "skeleton" ],
+    char: "\ud83e\uddb4",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  fried_shrimp: {
+    keywords: [ "food", "animal", "appetizer", "summer" ],
+    char: "\ud83c\udf64",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  fried_egg: {
+    keywords: [ "food", "breakfast", "kitchen", "egg" ],
+    char: "\ud83c\udf73",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  hamburger: {
+    keywords: [ "meat", "fast food", "beef", "cheeseburger", "mcdonalds", "burger king" ],
+    char: "\ud83c\udf54",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  fries: {
+    keywords: [ "chips", "snack", "fast food" ],
+    char: "\ud83c\udf5f",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  stuffed_flatbread: {
+    keywords: [ "food", "flatbread", "stuffed", "gyro" ],
+    char: "\ud83e\udd59",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  hotdog: {
+    keywords: [ "food", "frankfurter" ],
+    char: "\ud83c\udf2d",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  pizza: {
+    keywords: [ "food", "party" ],
+    char: "\ud83c\udf55",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  sandwich: {
+    keywords: [ "food", "lunch", "bread" ],
+    char: "\ud83e\udd6a",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  canned_food: {
+    keywords: [ "food", "soup" ],
+    char: "\ud83e\udd6b",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  spaghetti: {
+    keywords: [ "food", "italian", "noodle" ],
+    char: "\ud83c\udf5d",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  taco: {
+    keywords: [ "food", "mexican" ],
+    char: "\ud83c\udf2e",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  burrito: {
+    keywords: [ "food", "mexican" ],
+    char: "\ud83c\udf2f",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  green_salad: {
+    keywords: [ "food", "healthy", "lettuce" ],
+    char: "\ud83e\udd57",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  shallow_pan_of_food: {
+    keywords: [ "food", "cooking", "casserole", "paella" ],
+    char: "\ud83e\udd58",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  ramen: {
+    keywords: [ "food", "japanese", "noodle", "chopsticks" ],
+    char: "\ud83c\udf5c",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  stew: {
+    keywords: [ "food", "meat", "soup" ],
+    char: "\ud83c\udf72",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  fish_cake: {
+    keywords: [ "food", "japan", "sea", "beach", "narutomaki", "pink", "swirl", "kamaboko", "surimi", "ramen" ],
+    char: "\ud83c\udf65",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  fortune_cookie: {
+    keywords: [ "food", "prophecy" ],
+    char: "\ud83e\udd60",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  sushi: {
+    keywords: [ "food", "fish", "japanese", "rice" ],
+    char: "\ud83c\udf63",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  bento: {
+    keywords: [ "food", "japanese", "box" ],
+    char: "\ud83c\udf71",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  curry: {
+    keywords: [ "food", "spicy", "hot", "indian" ],
+    char: "\ud83c\udf5b",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  rice_ball: {
+    keywords: [ "food", "japanese" ],
+    char: "\ud83c\udf59",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  rice: {
+    keywords: [ "food", "china", "asian" ],
+    char: "\ud83c\udf5a",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  rice_cracker: {
+    keywords: [ "food", "japanese" ],
+    char: "\ud83c\udf58",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  oden: {
+    keywords: [ "food", "japanese" ],
+    char: "\ud83c\udf62",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  dango: {
+    keywords: [ "food", "dessert", "sweet", "japanese", "barbecue", "meat" ],
+    char: "\ud83c\udf61",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  shaved_ice: {
+    keywords: [ "hot", "dessert", "summer" ],
+    char: "\ud83c\udf67",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  ice_cream: {
+    keywords: [ "food", "hot", "dessert" ],
+    char: "\ud83c\udf68",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  icecream: {
+    keywords: [ "food", "hot", "dessert", "summer" ],
+    char: "\ud83c\udf66",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  pie: {
+    keywords: [ "food", "dessert", "pastry" ],
+    char: "\ud83e\udd67",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  cake: {
+    keywords: [ "food", "dessert" ],
+    char: "\ud83c\udf70",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  cupcake: {
+    keywords: [ "food", "dessert", "bakery", "sweet" ],
+    char: "\ud83e\uddc1",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  moon_cake: {
+    keywords: [ "food", "autumn" ],
+    char: "\ud83e\udd6e",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  birthday: {
+    keywords: [ "food", "dessert", "cake" ],
+    char: "\ud83c\udf82",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  custard: {
+    keywords: [ "dessert", "food" ],
+    char: "\ud83c\udf6e",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  candy: {
+    keywords: [ "snack", "dessert", "sweet", "lolly" ],
+    char: "\ud83c\udf6c",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  lollipop: {
+    keywords: [ "food", "snack", "candy", "sweet" ],
+    char: "\ud83c\udf6d",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  chocolate_bar: {
+    keywords: [ "food", "snack", "dessert", "sweet" ],
+    char: "\ud83c\udf6b",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  popcorn: {
+    keywords: [ "food", "movie theater", "films", "snack" ],
+    char: "\ud83c\udf7f",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  dumpling: {
+    keywords: [ "food", "empanada", "pierogi", "potsticker" ],
+    char: "\ud83e\udd5f",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  doughnut: {
+    keywords: [ "food", "dessert", "snack", "sweet", "donut" ],
+    char: "\ud83c\udf69",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  cookie: {
+    keywords: [ "food", "snack", "oreo", "chocolate", "sweet", "dessert" ],
+    char: "\ud83c\udf6a",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  milk_glass: {
+    keywords: [ "beverage", "drink", "cow" ],
+    char: "\ud83e\udd5b",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  beer: {
+    keywords: [ "relax", "beverage", "drink", "drunk", "party", "pub", "summer", "alcohol", "booze" ],
+    char: "\ud83c\udf7a",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  beers: {
+    keywords: [ "relax", "beverage", "drink", "drunk", "party", "pub", "summer", "alcohol", "booze" ],
+    char: "\ud83c\udf7b",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  clinking_glasses: {
+    keywords: [ "beverage", "drink", "party", "alcohol", "celebrate", "cheers", "wine", "champagne", "toast" ],
+    char: "\ud83e\udd42",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  wine_glass: {
+    keywords: [ "drink", "beverage", "drunk", "alcohol", "booze" ],
+    char: "\ud83c\udf77",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  tumbler_glass: {
+    keywords: [ "drink", "beverage", "drunk", "alcohol", "liquor", "booze", "bourbon", "scotch", "whisky", "glass", "shot" ],
+    char: "\ud83e\udd43",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  cocktail: {
+    keywords: [ "drink", "drunk", "alcohol", "beverage", "booze", "mojito" ],
+    char: "\ud83c\udf78",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  tropical_drink: {
+    keywords: [ "beverage", "cocktail", "summer", "beach", "alcohol", "booze", "mojito" ],
+    char: "\ud83c\udf79",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  champagne: {
+    keywords: [ "drink", "wine", "bottle", "celebration" ],
+    char: "\ud83c\udf7e",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  sake: {
+    keywords: [ "wine", "drink", "drunk", "beverage", "japanese", "alcohol", "booze" ],
+    char: "\ud83c\udf76",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  tea: {
+    keywords: [ "drink", "bowl", "breakfast", "green", "british" ],
+    char: "\ud83c\udf75",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  cup_with_straw: {
+    keywords: [ "drink", "soda" ],
+    char: "\ud83e\udd64",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  coffee: {
+    keywords: [ "beverage", "caffeine", "latte", "espresso" ],
+    char: "\u2615",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  baby_bottle: {
+    keywords: [ "food", "container", "milk" ],
+    char: "\ud83c\udf7c",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  salt: {
+    keywords: [ "condiment", "shaker" ],
+    char: "\ud83e\uddc2",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  spoon: {
+    keywords: [ "cutlery", "kitchen", "tableware" ],
+    char: "\ud83e\udd44",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  fork_and_knife: {
+    keywords: [ "cutlery", "kitchen" ],
+    char: "\ud83c\udf74",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  plate_with_cutlery: {
+    keywords: [ "food", "eat", "meal", "lunch", "dinner", "restaurant" ],
+    char: "\ud83c\udf7d",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  bowl_with_spoon: {
+    keywords: [ "food", "breakfast", "cereal", "oatmeal", "porridge" ],
+    char: "\ud83e\udd63",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  takeout_box: {
+    keywords: [ "food", "leftovers" ],
+    char: "\ud83e\udd61",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  chopsticks: {
+    keywords: [ "food" ],
+    char: "\ud83e\udd62",
+    fitzpatrick_scale: false,
+    category: "food_and_drink"
+  },
+  soccer: {
+    keywords: [ "sports", "football" ],
+    char: "\u26bd",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  basketball: {
+    keywords: [ "sports", "balls", "NBA" ],
+    char: "\ud83c\udfc0",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  football: {
+    keywords: [ "sports", "balls", "NFL" ],
+    char: "\ud83c\udfc8",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  baseball: {
+    keywords: [ "sports", "balls" ],
+    char: "\u26be",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  softball: {
+    keywords: [ "sports", "balls" ],
+    char: "\ud83e\udd4e",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  tennis: {
+    keywords: [ "sports", "balls", "green" ],
+    char: "\ud83c\udfbe",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  volleyball: {
+    keywords: [ "sports", "balls" ],
+    char: "\ud83c\udfd0",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  rugby_football: {
+    keywords: [ "sports", "team" ],
+    char: "\ud83c\udfc9",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  flying_disc: {
+    keywords: [ "sports", "frisbee", "ultimate" ],
+    char: "\ud83e\udd4f",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  "8ball": {
+    keywords: [ "pool", "hobby", "game", "luck", "magic" ],
+    char: "\ud83c\udfb1",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  golf: {
+    keywords: [ "sports", "business", "flag", "hole", "summer" ],
+    char: "\u26f3",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  golfing_woman: {
+    keywords: [ "sports", "business", "woman", "female" ],
+    char: "\ud83c\udfcc\ufe0f\u200d\u2640\ufe0f",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  golfing_man: {
+    keywords: [ "sports", "business" ],
+    char: "\ud83c\udfcc",
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  ping_pong: {
+    keywords: [ "sports", "pingpong" ],
+    char: "\ud83c\udfd3",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  badminton: {
+    keywords: [ "sports" ],
+    char: "\ud83c\udff8",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  goal_net: {
+    keywords: [ "sports" ],
+    char: "\ud83e\udd45",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  ice_hockey: {
+    keywords: [ "sports" ],
+    char: "\ud83c\udfd2",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  field_hockey: {
+    keywords: [ "sports" ],
+    char: "\ud83c\udfd1",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  lacrosse: {
+    keywords: [ "sports", "ball", "stick" ],
+    char: "\ud83e\udd4d",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  cricket: {
+    keywords: [ "sports" ],
+    char: "\ud83c\udfcf",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  ski: {
+    keywords: [ "sports", "winter", "cold", "snow" ],
+    char: "\ud83c\udfbf",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  skier: {
+    keywords: [ "sports", "winter", "snow" ],
+    char: "\u26f7",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  snowboarder: {
+    keywords: [ "sports", "winter" ],
+    char: "\ud83c\udfc2",
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  person_fencing: {
+    keywords: [ "sports", "fencing", "sword" ],
+    char: "\ud83e\udd3a",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  women_wrestling: {
+    keywords: [ "sports", "wrestlers" ],
+    char: "\ud83e\udd3c\u200d\u2640\ufe0f",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  men_wrestling: {
+    keywords: [ "sports", "wrestlers" ],
+    char: "\ud83e\udd3c\u200d\u2642\ufe0f",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  woman_cartwheeling: {
+    keywords: [ "gymnastics" ],
+    char: "\ud83e\udd38\u200d\u2640\ufe0f",
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  man_cartwheeling: {
+    keywords: [ "gymnastics" ],
+    char: "\ud83e\udd38\u200d\u2642\ufe0f",
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  woman_playing_handball: {
+    keywords: [ "sports" ],
+    char: "\ud83e\udd3e\u200d\u2640\ufe0f",
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  man_playing_handball: {
+    keywords: [ "sports" ],
+    char: "\ud83e\udd3e\u200d\u2642\ufe0f",
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  ice_skate: {
+    keywords: [ "sports" ],
+    char: "\u26f8",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  curling_stone: {
+    keywords: [ "sports" ],
+    char: "\ud83e\udd4c",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  skateboard: {
+    keywords: [ "board" ],
+    char: "\ud83d\udef9",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  sled: {
+    keywords: [ "sleigh", "luge", "toboggan" ],
+    char: "\ud83d\udef7",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  bow_and_arrow: {
+    keywords: [ "sports" ],
+    char: "\ud83c\udff9",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  fishing_pole_and_fish: {
+    keywords: [ "food", "hobby", "summer" ],
+    char: "\ud83c\udfa3",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  boxing_glove: {
+    keywords: [ "sports", "fighting" ],
+    char: "\ud83e\udd4a",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  martial_arts_uniform: {
+    keywords: [ "judo", "karate", "taekwondo" ],
+    char: "\ud83e\udd4b",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  rowing_woman: {
+    keywords: [ "sports", "hobby", "water", "ship", "woman", "female" ],
+    char: "\ud83d\udea3\u200d\u2640\ufe0f",
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  rowing_man: {
+    keywords: [ "sports", "hobby", "water", "ship" ],
+    char: "\ud83d\udea3",
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  climbing_woman: {
+    keywords: [ "sports", "hobby", "woman", "female", "rock" ],
+    char: "\ud83e\uddd7\u200d\u2640\ufe0f",
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  climbing_man: {
+    keywords: [ "sports", "hobby", "man", "male", "rock" ],
+    char: "\ud83e\uddd7\u200d\u2642\ufe0f",
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  swimming_woman: {
+    keywords: [ "sports", "exercise", "human", "athlete", "water", "summer", "woman", "female" ],
+    char: "\ud83c\udfca\u200d\u2640\ufe0f",
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  swimming_man: {
+    keywords: [ "sports", "exercise", "human", "athlete", "water", "summer" ],
+    char: "\ud83c\udfca",
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  woman_playing_water_polo: {
+    keywords: [ "sports", "pool" ],
+    char: "\ud83e\udd3d\u200d\u2640\ufe0f",
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  man_playing_water_polo: {
+    keywords: [ "sports", "pool" ],
+    char: "\ud83e\udd3d\u200d\u2642\ufe0f",
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  woman_in_lotus_position: {
+    keywords: [ "woman", "female", "meditation", "yoga", "serenity", "zen", "mindfulness" ],
+    char: "\ud83e\uddd8\u200d\u2640\ufe0f",
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  man_in_lotus_position: {
+    keywords: [ "man", "male", "meditation", "yoga", "serenity", "zen", "mindfulness" ],
+    char: "\ud83e\uddd8\u200d\u2642\ufe0f",
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  surfing_woman: {
+    keywords: [ "sports", "ocean", "sea", "summer", "beach", "woman", "female" ],
+    char: "\ud83c\udfc4\u200d\u2640\ufe0f",
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  surfing_man: {
+    keywords: [ "sports", "ocean", "sea", "summer", "beach" ],
+    char: "\ud83c\udfc4",
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  bath: {
+    keywords: [ "clean", "shower", "bathroom" ],
+    char: "\ud83d\udec0",
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  basketball_woman: {
+    keywords: [ "sports", "human", "woman", "female" ],
+    char: "\u26f9\ufe0f\u200d\u2640\ufe0f",
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  basketball_man: {
+    keywords: [ "sports", "human" ],
+    char: "\u26f9",
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  weight_lifting_woman: {
+    keywords: [ "sports", "training", "exercise", "woman", "female" ],
+    char: "\ud83c\udfcb\ufe0f\u200d\u2640\ufe0f",
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  weight_lifting_man: {
+    keywords: [ "sports", "training", "exercise" ],
+    char: "\ud83c\udfcb",
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  biking_woman: {
+    keywords: [ "sports", "bike", "exercise", "hipster", "woman", "female" ],
+    char: "\ud83d\udeb4\u200d\u2640\ufe0f",
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  biking_man: {
+    keywords: [ "sports", "bike", "exercise", "hipster" ],
+    char: "\ud83d\udeb4",
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  mountain_biking_woman: {
+    keywords: [ "transportation", "sports", "human", "race", "bike", "woman", "female" ],
+    char: "\ud83d\udeb5\u200d\u2640\ufe0f",
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  mountain_biking_man: {
+    keywords: [ "transportation", "sports", "human", "race", "bike" ],
+    char: "\ud83d\udeb5",
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  horse_racing: {
+    keywords: [ "animal", "betting", "competition", "gambling", "luck" ],
+    char: "\ud83c\udfc7",
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  business_suit_levitating: {
+    keywords: [ "suit", "business", "levitate", "hover", "jump" ],
+    char: "\ud83d\udd74",
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  trophy: {
+    keywords: [ "win", "award", "contest", "place", "ftw", "ceremony" ],
+    char: "\ud83c\udfc6",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  running_shirt_with_sash: {
+    keywords: [ "play", "pageant" ],
+    char: "\ud83c\udfbd",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  medal_sports: {
+    keywords: [ "award", "winning" ],
+    char: "\ud83c\udfc5",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  medal_military: {
+    keywords: [ "award", "winning", "army" ],
+    char: "\ud83c\udf96",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  "1st_place_medal": {
+    keywords: [ "award", "winning", "first" ],
+    char: "\ud83e\udd47",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  "2nd_place_medal": {
+    keywords: [ "award", "second" ],
+    char: "\ud83e\udd48",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  "3rd_place_medal": {
+    keywords: [ "award", "third" ],
+    char: "\ud83e\udd49",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  reminder_ribbon: {
+    keywords: [ "sports", "cause", "support", "awareness" ],
+    char: "\ud83c\udf97",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  rosette: {
+    keywords: [ "flower", "decoration", "military" ],
+    char: "\ud83c\udff5",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  ticket: {
+    keywords: [ "event", "concert", "pass" ],
+    char: "\ud83c\udfab",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  tickets: {
+    keywords: [ "sports", "concert", "entrance" ],
+    char: "\ud83c\udf9f",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  performing_arts: {
+    keywords: [ "acting", "theater", "drama" ],
+    char: "\ud83c\udfad",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  art: {
+    keywords: [ "design", "paint", "draw", "colors" ],
+    char: "\ud83c\udfa8",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  circus_tent: {
+    keywords: [ "festival", "carnival", "party" ],
+    char: "\ud83c\udfaa",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  woman_juggling: {
+    keywords: [ "juggle", "balance", "skill", "multitask" ],
+    char: "\ud83e\udd39\u200d\u2640\ufe0f",
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  man_juggling: {
+    keywords: [ "juggle", "balance", "skill", "multitask" ],
+    char: "\ud83e\udd39\u200d\u2642\ufe0f",
+    fitzpatrick_scale: true,
+    category: "activity"
+  },
+  microphone: {
+    keywords: [ "sound", "music", "PA", "sing", "talkshow" ],
+    char: "\ud83c\udfa4",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  headphones: {
+    keywords: [ "music", "score", "gadgets" ],
+    char: "\ud83c\udfa7",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  musical_score: {
+    keywords: [ "treble", "clef", "compose" ],
+    char: "\ud83c\udfbc",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  musical_keyboard: {
+    keywords: [ "piano", "instrument", "compose" ],
+    char: "\ud83c\udfb9",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  drum: {
+    keywords: [ "music", "instrument", "drumsticks", "snare" ],
+    char: "\ud83e\udd41",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  saxophone: {
+    keywords: [ "music", "instrument", "jazz", "blues" ],
+    char: "\ud83c\udfb7",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  trumpet: {
+    keywords: [ "music", "brass" ],
+    char: "\ud83c\udfba",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  guitar: {
+    keywords: [ "music", "instrument" ],
+    char: "\ud83c\udfb8",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  violin: {
+    keywords: [ "music", "instrument", "orchestra", "symphony" ],
+    char: "\ud83c\udfbb",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  clapper: {
+    keywords: [ "movie", "film", "record" ],
+    char: "\ud83c\udfac",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  video_game: {
+    keywords: [ "play", "console", "PS4", "controller" ],
+    char: "\ud83c\udfae",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  space_invader: {
+    keywords: [ "game", "arcade", "play" ],
+    char: "\ud83d\udc7e",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  dart: {
+    keywords: [ "game", "play", "bar", "target", "bullseye" ],
+    char: "\ud83c\udfaf",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  game_die: {
+    keywords: [ "dice", "random", "tabletop", "play", "luck" ],
+    char: "\ud83c\udfb2",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  chess_pawn: {
+    keywords: [ "expendable" ],
+    char: "\u265f",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  slot_machine: {
+    keywords: [ "bet", "gamble", "vegas", "fruit machine", "luck", "casino" ],
+    char: "\ud83c\udfb0",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  jigsaw: {
+    keywords: [ "interlocking", "puzzle", "piece" ],
+    char: "\ud83e\udde9",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  bowling: {
+    keywords: [ "sports", "fun", "play" ],
+    char: "\ud83c\udfb3",
+    fitzpatrick_scale: false,
+    category: "activity"
+  },
+  red_car: {
+    keywords: [ "red", "transportation", "vehicle" ],
+    char: "\ud83d\ude97",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  taxi: {
+    keywords: [ "uber", "vehicle", "cars", "transportation" ],
+    char: "\ud83d\ude95",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  blue_car: {
+    keywords: [ "transportation", "vehicle" ],
+    char: "\ud83d\ude99",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  bus: {
+    keywords: [ "car", "vehicle", "transportation" ],
+    char: "\ud83d\ude8c",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  trolleybus: {
+    keywords: [ "bart", "transportation", "vehicle" ],
+    char: "\ud83d\ude8e",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  racing_car: {
+    keywords: [ "sports", "race", "fast", "formula", "f1" ],
+    char: "\ud83c\udfce",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  police_car: {
+    keywords: [ "vehicle", "cars", "transportation", "law", "legal", "enforcement" ],
+    char: "\ud83d\ude93",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  ambulance: {
+    keywords: [ "health", "911", "hospital" ],
+    char: "\ud83d\ude91",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  fire_engine: {
+    keywords: [ "transportation", "cars", "vehicle" ],
+    char: "\ud83d\ude92",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  minibus: {
+    keywords: [ "vehicle", "car", "transportation" ],
+    char: "\ud83d\ude90",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  truck: {
+    keywords: [ "cars", "transportation" ],
+    char: "\ud83d\ude9a",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  articulated_lorry: {
+    keywords: [ "vehicle", "cars", "transportation", "express" ],
+    char: "\ud83d\ude9b",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  tractor: {
+    keywords: [ "vehicle", "car", "farming", "agriculture" ],
+    char: "\ud83d\ude9c",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  kick_scooter: {
+    keywords: [ "vehicle", "kick", "razor" ],
+    char: "\ud83d\udef4",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  motorcycle: {
+    keywords: [ "race", "sports", "fast" ],
+    char: "\ud83c\udfcd",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  bike: {
+    keywords: [ "sports", "bicycle", "exercise", "hipster" ],
+    char: "\ud83d\udeb2",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  motor_scooter: {
+    keywords: [ "vehicle", "vespa", "sasha" ],
+    char: "\ud83d\udef5",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  rotating_light: {
+    keywords: [ "police", "ambulance", "911", "emergency", "alert", "error", "pinged", "law", "legal" ],
+    char: "\ud83d\udea8",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  oncoming_police_car: {
+    keywords: [ "vehicle", "law", "legal", "enforcement", "911" ],
+    char: "\ud83d\ude94",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  oncoming_bus: {
+    keywords: [ "vehicle", "transportation" ],
+    char: "\ud83d\ude8d",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  oncoming_automobile: {
+    keywords: [ "car", "vehicle", "transportation" ],
+    char: "\ud83d\ude98",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  oncoming_taxi: {
+    keywords: [ "vehicle", "cars", "uber" ],
+    char: "\ud83d\ude96",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  aerial_tramway: {
+    keywords: [ "transportation", "vehicle", "ski" ],
+    char: "\ud83d\udea1",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  mountain_cableway: {
+    keywords: [ "transportation", "vehicle", "ski" ],
+    char: "\ud83d\udea0",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  suspension_railway: {
+    keywords: [ "vehicle", "transportation" ],
+    char: "\ud83d\ude9f",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  railway_car: {
+    keywords: [ "transportation", "vehicle" ],
+    char: "\ud83d\ude83",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  train: {
+    keywords: [ "transportation", "vehicle", "carriage", "public", "travel" ],
+    char: "\ud83d\ude8b",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  monorail: {
+    keywords: [ "transportation", "vehicle" ],
+    char: "\ud83d\ude9d",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  bullettrain_side: {
+    keywords: [ "transportation", "vehicle" ],
+    char: "\ud83d\ude84",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  bullettrain_front: {
+    keywords: [ "transportation", "vehicle", "speed", "fast", "public", "travel" ],
+    char: "\ud83d\ude85",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  light_rail: {
+    keywords: [ "transportation", "vehicle" ],
+    char: "\ud83d\ude88",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  mountain_railway: {
+    keywords: [ "transportation", "vehicle" ],
+    char: "\ud83d\ude9e",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  steam_locomotive: {
+    keywords: [ "transportation", "vehicle", "train" ],
+    char: "\ud83d\ude82",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  train2: {
+    keywords: [ "transportation", "vehicle" ],
+    char: "\ud83d\ude86",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  metro: {
+    keywords: [ "transportation", "blue-square", "mrt", "underground", "tube" ],
+    char: "\ud83d\ude87",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  tram: {
+    keywords: [ "transportation", "vehicle" ],
+    char: "\ud83d\ude8a",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  station: {
+    keywords: [ "transportation", "vehicle", "public" ],
+    char: "\ud83d\ude89",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  flying_saucer: {
+    keywords: [ "transportation", "vehicle", "ufo" ],
+    char: "\ud83d\udef8",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  helicopter: {
+    keywords: [ "transportation", "vehicle", "fly" ],
+    char: "\ud83d\ude81",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  small_airplane: {
+    keywords: [ "flight", "transportation", "fly", "vehicle" ],
+    char: "\ud83d\udee9",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  airplane: {
+    keywords: [ "vehicle", "transportation", "flight", "fly" ],
+    char: "\u2708\ufe0f",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  flight_departure: {
+    keywords: [ "airport", "flight", "landing" ],
+    char: "\ud83d\udeeb",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  flight_arrival: {
+    keywords: [ "airport", "flight", "boarding" ],
+    char: "\ud83d\udeec",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  sailboat: {
+    keywords: [ "ship", "summer", "transportation", "water", "sailing" ],
+    char: "\u26f5",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  motor_boat: {
+    keywords: [ "ship" ],
+    char: "\ud83d\udee5",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  speedboat: {
+    keywords: [ "ship", "transportation", "vehicle", "summer" ],
+    char: "\ud83d\udea4",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  ferry: {
+    keywords: [ "boat", "ship", "yacht" ],
+    char: "\u26f4",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  passenger_ship: {
+    keywords: [ "yacht", "cruise", "ferry" ],
+    char: "\ud83d\udef3",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  rocket: {
+    keywords: [ "launch", "ship", "staffmode", "NASA", "outer space", "outer_space", "fly" ],
+    char: "\ud83d\ude80",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  artificial_satellite: {
+    keywords: [ "communication", "gps", "orbit", "spaceflight", "NASA", "ISS" ],
+    char: "\ud83d\udef0",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  seat: {
+    keywords: [ "sit", "airplane", "transport", "bus", "flight", "fly" ],
+    char: "\ud83d\udcba",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  canoe: {
+    keywords: [ "boat", "paddle", "water", "ship" ],
+    char: "\ud83d\udef6",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  anchor: {
+    keywords: [ "ship", "ferry", "sea", "boat" ],
+    char: "\u2693",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  construction: {
+    keywords: [ "wip", "progress", "caution", "warning" ],
+    char: "\ud83d\udea7",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  fuelpump: {
+    keywords: [ "gas station", "petroleum" ],
+    char: "\u26fd",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  busstop: {
+    keywords: [ "transportation", "wait" ],
+    char: "\ud83d\ude8f",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  vertical_traffic_light: {
+    keywords: [ "transportation", "driving" ],
+    char: "\ud83d\udea6",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  traffic_light: {
+    keywords: [ "transportation", "signal" ],
+    char: "\ud83d\udea5",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  checkered_flag: {
+    keywords: [ "contest", "finishline", "race", "gokart" ],
+    char: "\ud83c\udfc1",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  ship: {
+    keywords: [ "transportation", "titanic", "deploy" ],
+    char: "\ud83d\udea2",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  ferris_wheel: {
+    keywords: [ "photo", "carnival", "londoneye" ],
+    char: "\ud83c\udfa1",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  roller_coaster: {
+    keywords: [ "carnival", "playground", "photo", "fun" ],
+    char: "\ud83c\udfa2",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  carousel_horse: {
+    keywords: [ "photo", "carnival" ],
+    char: "\ud83c\udfa0",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  building_construction: {
+    keywords: [ "wip", "working", "progress" ],
+    char: "\ud83c\udfd7",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  foggy: {
+    keywords: [ "photo", "mountain" ],
+    char: "\ud83c\udf01",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  tokyo_tower: {
+    keywords: [ "photo", "japanese" ],
+    char: "\ud83d\uddfc",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  factory: {
+    keywords: [ "building", "industry", "pollution", "smoke" ],
+    char: "\ud83c\udfed",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  fountain: {
+    keywords: [ "photo", "summer", "water", "fresh" ],
+    char: "\u26f2",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  rice_scene: {
+    keywords: [ "photo", "japan", "asia", "tsukimi" ],
+    char: "\ud83c\udf91",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  mountain: {
+    keywords: [ "photo", "nature", "environment" ],
+    char: "\u26f0",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  mountain_snow: {
+    keywords: [ "photo", "nature", "environment", "winter", "cold" ],
+    char: "\ud83c\udfd4",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  mount_fuji: {
+    keywords: [ "photo", "mountain", "nature", "japanese" ],
+    char: "\ud83d\uddfb",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  volcano: {
+    keywords: [ "photo", "nature", "disaster" ],
+    char: "\ud83c\udf0b",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  japan: {
+    keywords: [ "nation", "country", "japanese", "asia" ],
+    char: "\ud83d\uddfe",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  camping: {
+    keywords: [ "photo", "outdoors", "tent" ],
+    char: "\ud83c\udfd5",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  tent: {
+    keywords: [ "photo", "camping", "outdoors" ],
+    char: "\u26fa",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  national_park: {
+    keywords: [ "photo", "environment", "nature" ],
+    char: "\ud83c\udfde",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  motorway: {
+    keywords: [ "road", "cupertino", "interstate", "highway" ],
+    char: "\ud83d\udee3",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  railway_track: {
+    keywords: [ "train", "transportation" ],
+    char: "\ud83d\udee4",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  sunrise: {
+    keywords: [ "morning", "view", "vacation", "photo" ],
+    char: "\ud83c\udf05",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  sunrise_over_mountains: {
+    keywords: [ "view", "vacation", "photo" ],
+    char: "\ud83c\udf04",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  desert: {
+    keywords: [ "photo", "warm", "saharah" ],
+    char: "\ud83c\udfdc",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  beach_umbrella: {
+    keywords: [ "weather", "summer", "sunny", "sand", "mojito" ],
+    char: "\ud83c\udfd6",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  desert_island: {
+    keywords: [ "photo", "tropical", "mojito" ],
+    char: "\ud83c\udfdd",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  city_sunrise: {
+    keywords: [ "photo", "good morning", "dawn" ],
+    char: "\ud83c\udf07",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  city_sunset: {
+    keywords: [ "photo", "evening", "sky", "buildings" ],
+    char: "\ud83c\udf06",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  cityscape: {
+    keywords: [ "photo", "night life", "urban" ],
+    char: "\ud83c\udfd9",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  night_with_stars: {
+    keywords: [ "evening", "city", "downtown" ],
+    char: "\ud83c\udf03",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  bridge_at_night: {
+    keywords: [ "photo", "sanfrancisco" ],
+    char: "\ud83c\udf09",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  milky_way: {
+    keywords: [ "photo", "space", "stars" ],
+    char: "\ud83c\udf0c",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  stars: {
+    keywords: [ "night", "photo" ],
+    char: "\ud83c\udf20",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  sparkler: {
+    keywords: [ "stars", "night", "shine" ],
+    char: "\ud83c\udf87",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  fireworks: {
+    keywords: [ "photo", "festival", "carnival", "congratulations" ],
+    char: "\ud83c\udf86",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  rainbow: {
+    keywords: [ "nature", "happy", "unicorn_face", "photo", "sky", "spring" ],
+    char: "\ud83c\udf08",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  houses: {
+    keywords: [ "buildings", "photo" ],
+    char: "\ud83c\udfd8",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  european_castle: {
+    keywords: [ "building", "royalty", "history" ],
+    char: "\ud83c\udff0",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  japanese_castle: {
+    keywords: [ "photo", "building" ],
+    char: "\ud83c\udfef",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  stadium: {
+    keywords: [ "photo", "place", "sports", "concert", "venue" ],
+    char: "\ud83c\udfdf",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  statue_of_liberty: {
+    keywords: [ "american", "newyork" ],
+    char: "\ud83d\uddfd",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  house: {
+    keywords: [ "building", "home" ],
+    char: "\ud83c\udfe0",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  house_with_garden: {
+    keywords: [ "home", "plant", "nature" ],
+    char: "\ud83c\udfe1",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  derelict_house: {
+    keywords: [ "abandon", "evict", "broken", "building" ],
+    char: "\ud83c\udfda",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  office: {
+    keywords: [ "building", "bureau", "work" ],
+    char: "\ud83c\udfe2",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  department_store: {
+    keywords: [ "building", "shopping", "mall" ],
+    char: "\ud83c\udfec",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  post_office: {
+    keywords: [ "building", "envelope", "communication" ],
+    char: "\ud83c\udfe3",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  european_post_office: {
+    keywords: [ "building", "email" ],
+    char: "\ud83c\udfe4",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  hospital: {
+    keywords: [ "building", "health", "surgery", "doctor" ],
+    char: "\ud83c\udfe5",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  bank: {
+    keywords: [ "building", "money", "sales", "cash", "business", "enterprise" ],
+    char: "\ud83c\udfe6",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  hotel: {
+    keywords: [ "building", "accomodation", "checkin" ],
+    char: "\ud83c\udfe8",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  convenience_store: {
+    keywords: [ "building", "shopping", "groceries" ],
+    char: "\ud83c\udfea",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  school: {
+    keywords: [ "building", "student", "education", "learn", "teach" ],
+    char: "\ud83c\udfeb",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  love_hotel: {
+    keywords: [ "like", "affection", "dating" ],
+    char: "\ud83c\udfe9",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  wedding: {
+    keywords: [ "love", "like", "affection", "couple", "marriage", "bride", "groom" ],
+    char: "\ud83d\udc92",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  classical_building: {
+    keywords: [ "art", "culture", "history" ],
+    char: "\ud83c\udfdb",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  church: {
+    keywords: [ "building", "religion", "christ" ],
+    char: "\u26ea",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  mosque: {
+    keywords: [ "islam", "worship", "minaret" ],
+    char: "\ud83d\udd4c",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  synagogue: {
+    keywords: [ "judaism", "worship", "temple", "jewish" ],
+    char: "\ud83d\udd4d",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  kaaba: {
+    keywords: [ "mecca", "mosque", "islam" ],
+    char: "\ud83d\udd4b",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  shinto_shrine: {
+    keywords: [ "temple", "japan", "kyoto" ],
+    char: "\u26e9",
+    fitzpatrick_scale: false,
+    category: "travel_and_places"
+  },
+  watch: {
+    keywords: [ "time", "accessories" ],
+    char: "\u231a",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  iphone: {
+    keywords: [ "technology", "apple", "gadgets", "dial" ],
+    char: "\ud83d\udcf1",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  calling: {
+    keywords: [ "iphone", "incoming" ],
+    char: "\ud83d\udcf2",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  computer: {
+    keywords: [ "technology", "laptop", "screen", "display", "monitor" ],
+    char: "\ud83d\udcbb",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  keyboard: {
+    keywords: [ "technology", "computer", "type", "input", "text" ],
+    char: "\u2328",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  desktop_computer: {
+    keywords: [ "technology", "computing", "screen" ],
+    char: "\ud83d\udda5",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  printer: {
+    keywords: [ "paper", "ink" ],
+    char: "\ud83d\udda8",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  computer_mouse: {
+    keywords: [ "click" ],
+    char: "\ud83d\uddb1",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  trackball: {
+    keywords: [ "technology", "trackpad" ],
+    char: "\ud83d\uddb2",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  joystick: {
+    keywords: [ "game", "play" ],
+    char: "\ud83d\udd79",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  clamp: {
+    keywords: [ "tool" ],
+    char: "\ud83d\udddc",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  minidisc: {
+    keywords: [ "technology", "record", "data", "disk", "90s" ],
+    char: "\ud83d\udcbd",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  floppy_disk: {
+    keywords: [ "oldschool", "technology", "save", "90s", "80s" ],
+    char: "\ud83d\udcbe",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  cd: {
+    keywords: [ "technology", "dvd", "disk", "disc", "90s" ],
+    char: "\ud83d\udcbf",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  dvd: {
+    keywords: [ "cd", "disk", "disc" ],
+    char: "\ud83d\udcc0",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  vhs: {
+    keywords: [ "record", "video", "oldschool", "90s", "80s" ],
+    char: "\ud83d\udcfc",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  camera: {
+    keywords: [ "gadgets", "photography" ],
+    char: "\ud83d\udcf7",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  camera_flash: {
+    keywords: [ "photography", "gadgets" ],
+    char: "\ud83d\udcf8",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  video_camera: {
+    keywords: [ "film", "record" ],
+    char: "\ud83d\udcf9",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  movie_camera: {
+    keywords: [ "film", "record" ],
+    char: "\ud83c\udfa5",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  film_projector: {
+    keywords: [ "video", "tape", "record", "movie" ],
+    char: "\ud83d\udcfd",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  film_strip: {
+    keywords: [ "movie" ],
+    char: "\ud83c\udf9e",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  telephone_receiver: {
+    keywords: [ "technology", "communication", "dial" ],
+    char: "\ud83d\udcde",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  phone: {
+    keywords: [ "technology", "communication", "dial", "telephone" ],
+    char: "\u260e\ufe0f",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  pager: {
+    keywords: [ "bbcall", "oldschool", "90s" ],
+    char: "\ud83d\udcdf",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  fax: {
+    keywords: [ "communication", "technology" ],
+    char: "\ud83d\udce0",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  tv: {
+    keywords: [ "technology", "program", "oldschool", "show", "television" ],
+    char: "\ud83d\udcfa",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  radio: {
+    keywords: [ "communication", "music", "podcast", "program" ],
+    char: "\ud83d\udcfb",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  studio_microphone: {
+    keywords: [ "sing", "recording", "artist", "talkshow" ],
+    char: "\ud83c\udf99",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  level_slider: {
+    keywords: [ "scale" ],
+    char: "\ud83c\udf9a",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  control_knobs: {
+    keywords: [ "dial" ],
+    char: "\ud83c\udf9b",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  compass: {
+    keywords: [ "magnetic", "navigation", "orienteering" ],
+    char: "\ud83e\udded",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  stopwatch: {
+    keywords: [ "time", "deadline" ],
+    char: "\u23f1",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  timer_clock: {
+    keywords: [ "alarm" ],
+    char: "\u23f2",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  alarm_clock: {
+    keywords: [ "time", "wake" ],
+    char: "\u23f0",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  mantelpiece_clock: {
+    keywords: [ "time" ],
+    char: "\ud83d\udd70",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  hourglass_flowing_sand: {
+    keywords: [ "oldschool", "time", "countdown" ],
+    char: "\u23f3",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  hourglass: {
+    keywords: [ "time", "clock", "oldschool", "limit", "exam", "quiz", "test" ],
+    char: "\u231b",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  satellite: {
+    keywords: [ "communication", "future", "radio", "space" ],
+    char: "\ud83d\udce1",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  battery: {
+    keywords: [ "power", "energy", "sustain" ],
+    char: "\ud83d\udd0b",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  electric_plug: {
+    keywords: [ "charger", "power" ],
+    char: "\ud83d\udd0c",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  bulb: {
+    keywords: [ "light", "electricity", "idea" ],
+    char: "\ud83d\udca1",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  flashlight: {
+    keywords: [ "dark", "camping", "sight", "night" ],
+    char: "\ud83d\udd26",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  candle: {
+    keywords: [ "fire", "wax" ],
+    char: "\ud83d\udd6f",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  fire_extinguisher: {
+    keywords: [ "quench" ],
+    char: "\ud83e\uddef",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  wastebasket: {
+    keywords: [ "bin", "trash", "rubbish", "garbage", "toss" ],
+    char: "\ud83d\uddd1",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  oil_drum: {
+    keywords: [ "barrell" ],
+    char: "\ud83d\udee2",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  money_with_wings: {
+    keywords: [ "dollar", "bills", "payment", "sale" ],
+    char: "\ud83d\udcb8",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  dollar: {
+    keywords: [ "money", "sales", "bill", "currency" ],
+    char: "\ud83d\udcb5",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  yen: {
+    keywords: [ "money", "sales", "japanese", "dollar", "currency" ],
+    char: "\ud83d\udcb4",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  euro: {
+    keywords: [ "money", "sales", "dollar", "currency" ],
+    char: "\ud83d\udcb6",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  pound: {
+    keywords: [ "british", "sterling", "money", "sales", "bills", "uk", "england", "currency" ],
+    char: "\ud83d\udcb7",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  moneybag: {
+    keywords: [ "dollar", "payment", "coins", "sale" ],
+    char: "\ud83d\udcb0",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  credit_card: {
+    keywords: [ "money", "sales", "dollar", "bill", "payment", "shopping" ],
+    char: "\ud83d\udcb3",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  gem: {
+    keywords: [ "blue", "ruby", "diamond", "jewelry" ],
+    char: "\ud83d\udc8e",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  balance_scale: {
+    keywords: [ "law", "fairness", "weight" ],
+    char: "\u2696",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  toolbox: {
+    keywords: [ "tools", "diy", "fix", "maintainer", "mechanic" ],
+    char: "\ud83e\uddf0",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  wrench: {
+    keywords: [ "tools", "diy", "ikea", "fix", "maintainer" ],
+    char: "\ud83d\udd27",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  hammer: {
+    keywords: [ "tools", "build", "create" ],
+    char: "\ud83d\udd28",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  hammer_and_pick: {
+    keywords: [ "tools", "build", "create" ],
+    char: "\u2692",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  hammer_and_wrench: {
+    keywords: [ "tools", "build", "create" ],
+    char: "\ud83d\udee0",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  pick: {
+    keywords: [ "tools", "dig" ],
+    char: "\u26cf",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  nut_and_bolt: {
+    keywords: [ "handy", "tools", "fix" ],
+    char: "\ud83d\udd29",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  gear: {
+    keywords: [ "cog" ],
+    char: "\u2699",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  brick: {
+    keywords: [ "bricks" ],
+    char: "\ud83e\uddf1",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  chains: {
+    keywords: [ "lock", "arrest" ],
+    char: "\u26d3",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  magnet: {
+    keywords: [ "attraction", "magnetic" ],
+    char: "\ud83e\uddf2",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  gun: {
+    keywords: [ "violence", "weapon", "pistol", "revolver" ],
+    char: "\ud83d\udd2b",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  bomb: {
+    keywords: [ "boom", "explode", "explosion", "terrorism" ],
+    char: "\ud83d\udca3",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  firecracker: {
+    keywords: [ "dynamite", "boom", "explode", "explosion", "explosive" ],
+    char: "\ud83e\udde8",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  hocho: {
+    keywords: [ "knife", "blade", "cutlery", "kitchen", "weapon" ],
+    char: "\ud83d\udd2a",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  dagger: {
+    keywords: [ "weapon" ],
+    char: "\ud83d\udde1",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  crossed_swords: {
+    keywords: [ "weapon" ],
+    char: "\u2694",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  shield: {
+    keywords: [ "protection", "security" ],
+    char: "\ud83d\udee1",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  smoking: {
+    keywords: [ "kills", "tobacco", "cigarette", "joint", "smoke" ],
+    char: "\ud83d\udeac",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  skull_and_crossbones: {
+    keywords: [ "poison", "danger", "deadly", "scary", "death", "pirate", "evil" ],
+    char: "\u2620",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  coffin: {
+    keywords: [ "vampire", "dead", "die", "death", "rip", "graveyard", "cemetery", "casket", "funeral", "box" ],
+    char: "\u26b0",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  funeral_urn: {
+    keywords: [ "dead", "die", "death", "rip", "ashes" ],
+    char: "\u26b1",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  amphora: {
+    keywords: [ "vase", "jar" ],
+    char: "\ud83c\udffa",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  crystal_ball: {
+    keywords: [ "disco", "party", "magic", "circus", "fortune_teller" ],
+    char: "\ud83d\udd2e",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  prayer_beads: {
+    keywords: [ "dhikr", "religious" ],
+    char: "\ud83d\udcff",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  nazar_amulet: {
+    keywords: [ "bead", "charm" ],
+    char: "\ud83e\uddff",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  barber: {
+    keywords: [ "hair", "salon", "style" ],
+    char: "\ud83d\udc88",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  alembic: {
+    keywords: [ "distilling", "science", "experiment", "chemistry" ],
+    char: "\u2697",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  telescope: {
+    keywords: [ "stars", "space", "zoom", "science", "astronomy" ],
+    char: "\ud83d\udd2d",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  microscope: {
+    keywords: [ "laboratory", "experiment", "zoomin", "science", "study" ],
+    char: "\ud83d\udd2c",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  hole: {
+    keywords: [ "embarrassing" ],
+    char: "\ud83d\udd73",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  pill: {
+    keywords: [ "health", "medicine", "doctor", "pharmacy", "drug" ],
+    char: "\ud83d\udc8a",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  syringe: {
+    keywords: [ "health", "hospital", "drugs", "blood", "medicine", "needle", "doctor", "nurse" ],
+    char: "\ud83d\udc89",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  dna: {
+    keywords: [ "biologist", "genetics", "life" ],
+    char: "\ud83e\uddec",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  microbe: {
+    keywords: [ "amoeba", "bacteria", "germs" ],
+    char: "\ud83e\udda0",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  petri_dish: {
+    keywords: [ "bacteria", "biology", "culture", "lab" ],
+    char: "\ud83e\uddeb",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  test_tube: {
+    keywords: [ "chemistry", "experiment", "lab", "science" ],
+    char: "\ud83e\uddea",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  thermometer: {
+    keywords: [ "weather", "temperature", "hot", "cold" ],
+    char: "\ud83c\udf21",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  broom: {
+    keywords: [ "cleaning", "sweeping", "witch" ],
+    char: "\ud83e\uddf9",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  basket: {
+    keywords: [ "laundry" ],
+    char: "\ud83e\uddfa",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  toilet_paper: {
+    keywords: [ "roll" ],
+    char: "\ud83e\uddfb",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  label: {
+    keywords: [ "sale", "tag" ],
+    char: "\ud83c\udff7",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  bookmark: {
+    keywords: [ "favorite", "label", "save" ],
+    char: "\ud83d\udd16",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  toilet: {
+    keywords: [ "restroom", "wc", "washroom", "bathroom", "potty" ],
+    char: "\ud83d\udebd",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  shower: {
+    keywords: [ "clean", "water", "bathroom" ],
+    char: "\ud83d\udebf",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  bathtub: {
+    keywords: [ "clean", "shower", "bathroom" ],
+    char: "\ud83d\udec1",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  soap: {
+    keywords: [ "bar", "bathing", "cleaning", "lather" ],
+    char: "\ud83e\uddfc",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  sponge: {
+    keywords: [ "absorbing", "cleaning", "porous" ],
+    char: "\ud83e\uddfd",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  lotion_bottle: {
+    keywords: [ "moisturizer", "sunscreen" ],
+    char: "\ud83e\uddf4",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  key: {
+    keywords: [ "lock", "door", "password" ],
+    char: "\ud83d\udd11",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  old_key: {
+    keywords: [ "lock", "door", "password" ],
+    char: "\ud83d\udddd",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  couch_and_lamp: {
+    keywords: [ "read", "chill" ],
+    char: "\ud83d\udecb",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  sleeping_bed: {
+    keywords: [ "bed", "rest" ],
+    char: "\ud83d\udecc",
+    fitzpatrick_scale: true,
+    category: "objects"
+  },
+  bed: {
+    keywords: [ "sleep", "rest" ],
+    char: "\ud83d\udecf",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  door: {
+    keywords: [ "house", "entry", "exit" ],
+    char: "\ud83d\udeaa",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  bellhop_bell: {
+    keywords: [ "service" ],
+    char: "\ud83d\udece",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  teddy_bear: {
+    keywords: [ "plush", "stuffed" ],
+    char: "\ud83e\uddf8",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  framed_picture: {
+    keywords: [ "photography" ],
+    char: "\ud83d\uddbc",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  world_map: {
+    keywords: [ "location", "direction" ],
+    char: "\ud83d\uddfa",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  parasol_on_ground: {
+    keywords: [ "weather", "summer" ],
+    char: "\u26f1",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  moyai: {
+    keywords: [ "rock", "easter island", "moai" ],
+    char: "\ud83d\uddff",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  shopping: {
+    keywords: [ "mall", "buy", "purchase" ],
+    char: "\ud83d\udecd",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  shopping_cart: {
+    keywords: [ "trolley" ],
+    char: "\ud83d\uded2",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  balloon: {
+    keywords: [ "party", "celebration", "birthday", "circus" ],
+    char: "\ud83c\udf88",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  flags: {
+    keywords: [ "fish", "japanese", "koinobori", "carp", "banner" ],
+    char: "\ud83c\udf8f",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  ribbon: {
+    keywords: [ "decoration", "pink", "girl", "bowtie" ],
+    char: "\ud83c\udf80",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  gift: {
+    keywords: [ "present", "birthday", "christmas", "xmas" ],
+    char: "\ud83c\udf81",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  confetti_ball: {
+    keywords: [ "festival", "party", "birthday", "circus" ],
+    char: "\ud83c\udf8a",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  tada: {
+    keywords: [ "party", "congratulations", "birthday", "magic", "circus", "celebration" ],
+    char: "\ud83c\udf89",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  dolls: {
+    keywords: [ "japanese", "toy", "kimono" ],
+    char: "\ud83c\udf8e",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  wind_chime: {
+    keywords: [ "nature", "ding", "spring", "bell" ],
+    char: "\ud83c\udf90",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  crossed_flags: {
+    keywords: [ "japanese", "nation", "country", "border" ],
+    char: "\ud83c\udf8c",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  izakaya_lantern: {
+    keywords: [ "light", "paper", "halloween", "spooky" ],
+    char: "\ud83c\udfee",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  red_envelope: {
+    keywords: [ "gift" ],
+    char: "\ud83e\udde7",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  email: {
+    keywords: [ "letter", "postal", "inbox", "communication" ],
+    char: "\u2709\ufe0f",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  envelope_with_arrow: {
+    keywords: [ "email", "communication" ],
+    char: "\ud83d\udce9",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  incoming_envelope: {
+    keywords: [ "email", "inbox" ],
+    char: "\ud83d\udce8",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  "e-mail": {
+    keywords: [ "communication", "inbox" ],
+    char: "\ud83d\udce7",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  love_letter: {
+    keywords: [ "email", "like", "affection", "envelope", "valentines" ],
+    char: "\ud83d\udc8c",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  postbox: {
+    keywords: [ "email", "letter", "envelope" ],
+    char: "\ud83d\udcee",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  mailbox_closed: {
+    keywords: [ "email", "communication", "inbox" ],
+    char: "\ud83d\udcea",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  mailbox: {
+    keywords: [ "email", "inbox", "communication" ],
+    char: "\ud83d\udceb",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  mailbox_with_mail: {
+    keywords: [ "email", "inbox", "communication" ],
+    char: "\ud83d\udcec",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  mailbox_with_no_mail: {
+    keywords: [ "email", "inbox" ],
+    char: "\ud83d\udced",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  package: {
+    keywords: [ "mail", "gift", "cardboard", "box", "moving" ],
+    char: "\ud83d\udce6",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  postal_horn: {
+    keywords: [ "instrument", "music" ],
+    char: "\ud83d\udcef",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  inbox_tray: {
+    keywords: [ "email", "documents" ],
+    char: "\ud83d\udce5",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  outbox_tray: {
+    keywords: [ "inbox", "email" ],
+    char: "\ud83d\udce4",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  scroll: {
+    keywords: [ "documents", "ancient", "history", "paper" ],
+    char: "\ud83d\udcdc",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  page_with_curl: {
+    keywords: [ "documents", "office", "paper" ],
+    char: "\ud83d\udcc3",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  bookmark_tabs: {
+    keywords: [ "favorite", "save", "order", "tidy" ],
+    char: "\ud83d\udcd1",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  receipt: {
+    keywords: [ "accounting", "expenses" ],
+    char: "\ud83e\uddfe",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  bar_chart: {
+    keywords: [ "graph", "presentation", "stats" ],
+    char: "\ud83d\udcca",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  chart_with_upwards_trend: {
+    keywords: [ "graph", "presentation", "stats", "recovery", "business", "economics", "money", "sales", "good", "success" ],
+    char: "\ud83d\udcc8",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  chart_with_downwards_trend: {
+    keywords: [ "graph", "presentation", "stats", "recession", "business", "economics", "money", "sales", "bad", "failure" ],
+    char: "\ud83d\udcc9",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  page_facing_up: {
+    keywords: [ "documents", "office", "paper", "information" ],
+    char: "\ud83d\udcc4",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  date: {
+    keywords: [ "calendar", "schedule" ],
+    char: "\ud83d\udcc5",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  calendar: {
+    keywords: [ "schedule", "date", "planning" ],
+    char: "\ud83d\udcc6",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  spiral_calendar: {
+    keywords: [ "date", "schedule", "planning" ],
+    char: "\ud83d\uddd3",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  card_index: {
+    keywords: [ "business", "stationery" ],
+    char: "\ud83d\udcc7",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  card_file_box: {
+    keywords: [ "business", "stationery" ],
+    char: "\ud83d\uddc3",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  ballot_box: {
+    keywords: [ "election", "vote" ],
+    char: "\ud83d\uddf3",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  file_cabinet: {
+    keywords: [ "filing", "organizing" ],
+    char: "\ud83d\uddc4",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  clipboard: {
+    keywords: [ "stationery", "documents" ],
+    char: "\ud83d\udccb",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  spiral_notepad: {
+    keywords: [ "memo", "stationery" ],
+    char: "\ud83d\uddd2",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  file_folder: {
+    keywords: [ "documents", "business", "office" ],
+    char: "\ud83d\udcc1",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  open_file_folder: {
+    keywords: [ "documents", "load" ],
+    char: "\ud83d\udcc2",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  card_index_dividers: {
+    keywords: [ "organizing", "business", "stationery" ],
+    char: "\ud83d\uddc2",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  newspaper_roll: {
+    keywords: [ "press", "headline" ],
+    char: "\ud83d\uddde",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  newspaper: {
+    keywords: [ "press", "headline" ],
+    char: "\ud83d\udcf0",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  notebook: {
+    keywords: [ "stationery", "record", "notes", "paper", "study" ],
+    char: "\ud83d\udcd3",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  closed_book: {
+    keywords: [ "read", "library", "knowledge", "textbook", "learn" ],
+    char: "\ud83d\udcd5",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  green_book: {
+    keywords: [ "read", "library", "knowledge", "study" ],
+    char: "\ud83d\udcd7",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  blue_book: {
+    keywords: [ "read", "library", "knowledge", "learn", "study" ],
+    char: "\ud83d\udcd8",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  orange_book: {
+    keywords: [ "read", "library", "knowledge", "textbook", "study" ],
+    char: "\ud83d\udcd9",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  notebook_with_decorative_cover: {
+    keywords: [ "classroom", "notes", "record", "paper", "study" ],
+    char: "\ud83d\udcd4",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  ledger: {
+    keywords: [ "notes", "paper" ],
+    char: "\ud83d\udcd2",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  books: {
+    keywords: [ "literature", "library", "study" ],
+    char: "\ud83d\udcda",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  open_book: {
+    keywords: [ "book", "read", "library", "knowledge", "literature", "learn", "study" ],
+    char: "\ud83d\udcd6",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  safety_pin: {
+    keywords: [ "diaper" ],
+    char: "\ud83e\uddf7",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  link: {
+    keywords: [ "rings", "url" ],
+    char: "\ud83d\udd17",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  paperclip: {
+    keywords: [ "documents", "stationery" ],
+    char: "\ud83d\udcce",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  paperclips: {
+    keywords: [ "documents", "stationery" ],
+    char: "\ud83d\udd87",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  scissors: {
+    keywords: [ "stationery", "cut" ],
+    char: "\u2702\ufe0f",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  triangular_ruler: {
+    keywords: [ "stationery", "math", "architect", "sketch" ],
+    char: "\ud83d\udcd0",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  straight_ruler: {
+    keywords: [ "stationery", "calculate", "length", "math", "school", "drawing", "architect", "sketch" ],
+    char: "\ud83d\udccf",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  abacus: {
+    keywords: [ "calculation" ],
+    char: "\ud83e\uddee",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  pushpin: {
+    keywords: [ "stationery", "mark", "here" ],
+    char: "\ud83d\udccc",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  round_pushpin: {
+    keywords: [ "stationery", "location", "map", "here" ],
+    char: "\ud83d\udccd",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  triangular_flag_on_post: {
+    keywords: [ "mark", "milestone", "place" ],
+    char: "\ud83d\udea9",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  white_flag: {
+    keywords: [ "losing", "loser", "lost", "surrender", "give up", "fail" ],
+    char: "\ud83c\udff3",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  black_flag: {
+    keywords: [ "pirate" ],
+    char: "\ud83c\udff4",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  rainbow_flag: {
+    keywords: [ "flag", "rainbow", "pride", "gay", "lgbt", "glbt", "queer", "homosexual", "lesbian", "bisexual", "transgender" ],
+    char: "\ud83c\udff3\ufe0f\u200d\ud83c\udf08",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  closed_lock_with_key: {
+    keywords: [ "security", "privacy" ],
+    char: "\ud83d\udd10",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  lock: {
+    keywords: [ "security", "password", "padlock" ],
+    char: "\ud83d\udd12",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  unlock: {
+    keywords: [ "privacy", "security" ],
+    char: "\ud83d\udd13",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  lock_with_ink_pen: {
+    keywords: [ "security", "secret" ],
+    char: "\ud83d\udd0f",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  pen: {
+    keywords: [ "stationery", "writing", "write" ],
+    char: "\ud83d\udd8a",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  fountain_pen: {
+    keywords: [ "stationery", "writing", "write" ],
+    char: "\ud83d\udd8b",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  black_nib: {
+    keywords: [ "pen", "stationery", "writing", "write" ],
+    char: "\u2712\ufe0f",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  memo: {
+    keywords: [ "write", "documents", "stationery", "pencil", "paper", "writing", "legal", "exam", "quiz", "test", "study", "compose" ],
+    char: "\ud83d\udcdd",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  pencil2: {
+    keywords: [ "stationery", "write", "paper", "writing", "school", "study" ],
+    char: "\u270f\ufe0f",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  crayon: {
+    keywords: [ "drawing", "creativity" ],
+    char: "\ud83d\udd8d",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  paintbrush: {
+    keywords: [ "drawing", "creativity", "art" ],
+    char: "\ud83d\udd8c",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  mag: {
+    keywords: [ "search", "zoom", "find", "detective" ],
+    char: "\ud83d\udd0d",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  mag_right: {
+    keywords: [ "search", "zoom", "find", "detective" ],
+    char: "\ud83d\udd0e",
+    fitzpatrick_scale: false,
+    category: "objects"
+  },
+  heart: {
+    keywords: [ "love", "like", "valentines" ],
+    char: "\u2764\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  orange_heart: {
+    keywords: [ "love", "like", "affection", "valentines" ],
+    char: "\ud83e\udde1",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  yellow_heart: {
+    keywords: [ "love", "like", "affection", "valentines" ],
+    char: "\ud83d\udc9b",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  green_heart: {
+    keywords: [ "love", "like", "affection", "valentines" ],
+    char: "\ud83d\udc9a",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  blue_heart: {
+    keywords: [ "love", "like", "affection", "valentines" ],
+    char: "\ud83d\udc99",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  purple_heart: {
+    keywords: [ "love", "like", "affection", "valentines" ],
+    char: "\ud83d\udc9c",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  black_heart: {
+    keywords: [ "evil" ],
+    char: "\ud83d\udda4",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  broken_heart: {
+    keywords: [ "sad", "sorry", "break", "heart", "heartbreak" ],
+    char: "\ud83d\udc94",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  heavy_heart_exclamation: {
+    keywords: [ "decoration", "love" ],
+    char: "\u2763",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  two_hearts: {
+    keywords: [ "love", "like", "affection", "valentines", "heart" ],
+    char: "\ud83d\udc95",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  revolving_hearts: {
+    keywords: [ "love", "like", "affection", "valentines" ],
+    char: "\ud83d\udc9e",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  heartbeat: {
+    keywords: [ "love", "like", "affection", "valentines", "pink", "heart" ],
+    char: "\ud83d\udc93",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  heartpulse: {
+    keywords: [ "like", "love", "affection", "valentines", "pink" ],
+    char: "\ud83d\udc97",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  sparkling_heart: {
+    keywords: [ "love", "like", "affection", "valentines" ],
+    char: "\ud83d\udc96",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  cupid: {
+    keywords: [ "love", "like", "heart", "affection", "valentines" ],
+    char: "\ud83d\udc98",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  gift_heart: {
+    keywords: [ "love", "valentines" ],
+    char: "\ud83d\udc9d",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  heart_decoration: {
+    keywords: [ "purple-square", "love", "like" ],
+    char: "\ud83d\udc9f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  peace_symbol: {
+    keywords: [ "hippie" ],
+    char: "\u262e",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  latin_cross: {
+    keywords: [ "christianity" ],
+    char: "\u271d",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  star_and_crescent: {
+    keywords: [ "islam" ],
+    char: "\u262a",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  om: {
+    keywords: [ "hinduism", "buddhism", "sikhism", "jainism" ],
+    char: "\ud83d\udd49",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  wheel_of_dharma: {
+    keywords: [ "hinduism", "buddhism", "sikhism", "jainism" ],
+    char: "\u2638",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  star_of_david: {
+    keywords: [ "judaism" ],
+    char: "\u2721",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  six_pointed_star: {
+    keywords: [ "purple-square", "religion", "jewish", "hexagram" ],
+    char: "\ud83d\udd2f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  menorah: {
+    keywords: [ "hanukkah", "candles", "jewish" ],
+    char: "\ud83d\udd4e",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  yin_yang: {
+    keywords: [ "balance" ],
+    char: "\u262f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  orthodox_cross: {
+    keywords: [ "suppedaneum", "religion" ],
+    char: "\u2626",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  place_of_worship: {
+    keywords: [ "religion", "church", "temple", "prayer" ],
+    char: "\ud83d\uded0",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  ophiuchus: {
+    keywords: [ "sign", "purple-square", "constellation", "astrology" ],
+    char: "\u26ce",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  aries: {
+    keywords: [ "sign", "purple-square", "zodiac", "astrology" ],
+    char: "\u2648",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  taurus: {
+    keywords: [ "purple-square", "sign", "zodiac", "astrology" ],
+    char: "\u2649",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  gemini: {
+    keywords: [ "sign", "zodiac", "purple-square", "astrology" ],
+    char: "\u264a",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  cancer: {
+    keywords: [ "sign", "zodiac", "purple-square", "astrology" ],
+    char: "\u264b",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  leo: {
+    keywords: [ "sign", "purple-square", "zodiac", "astrology" ],
+    char: "\u264c",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  virgo: {
+    keywords: [ "sign", "zodiac", "purple-square", "astrology" ],
+    char: "\u264d",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  libra: {
+    keywords: [ "sign", "purple-square", "zodiac", "astrology" ],
+    char: "\u264e",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  scorpius: {
+    keywords: [ "sign", "zodiac", "purple-square", "astrology", "scorpio" ],
+    char: "\u264f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  sagittarius: {
+    keywords: [ "sign", "zodiac", "purple-square", "astrology" ],
+    char: "\u2650",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  capricorn: {
+    keywords: [ "sign", "zodiac", "purple-square", "astrology" ],
+    char: "\u2651",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  aquarius: {
+    keywords: [ "sign", "purple-square", "zodiac", "astrology" ],
+    char: "\u2652",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  pisces: {
+    keywords: [ "purple-square", "sign", "zodiac", "astrology" ],
+    char: "\u2653",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  id: {
+    keywords: [ "purple-square", "words" ],
+    char: "\ud83c\udd94",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  atom_symbol: {
+    keywords: [ "science", "physics", "chemistry" ],
+    char: "\u269b",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  u7a7a: {
+    keywords: [ "kanji", "japanese", "chinese", "empty", "sky", "blue-square" ],
+    char: "\ud83c\ude33",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  u5272: {
+    keywords: [ "cut", "divide", "chinese", "kanji", "pink-square" ],
+    char: "\ud83c\ude39",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  radioactive: {
+    keywords: [ "nuclear", "danger" ],
+    char: "\u2622",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  biohazard: {
+    keywords: [ "danger" ],
+    char: "\u2623",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  mobile_phone_off: {
+    keywords: [ "mute", "orange-square", "silence", "quiet" ],
+    char: "\ud83d\udcf4",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  vibration_mode: {
+    keywords: [ "orange-square", "phone" ],
+    char: "\ud83d\udcf3",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  u6709: {
+    keywords: [ "orange-square", "chinese", "have", "kanji" ],
+    char: "\ud83c\ude36",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  u7121: {
+    keywords: [ "nothing", "chinese", "kanji", "japanese", "orange-square" ],
+    char: "\ud83c\ude1a",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  u7533: {
+    keywords: [ "chinese", "japanese", "kanji", "orange-square" ],
+    char: "\ud83c\ude38",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  u55b6: {
+    keywords: [ "japanese", "opening hours", "orange-square" ],
+    char: "\ud83c\ude3a",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  u6708: {
+    keywords: [ "chinese", "month", "moon", "japanese", "orange-square", "kanji" ],
+    char: "\ud83c\ude37\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  eight_pointed_black_star: {
+    keywords: [ "orange-square", "shape", "polygon" ],
+    char: "\u2734\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  vs: {
+    keywords: [ "words", "orange-square" ],
+    char: "\ud83c\udd9a",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  accept: {
+    keywords: [ "ok", "good", "chinese", "kanji", "agree", "yes", "orange-circle" ],
+    char: "\ud83c\ude51",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  white_flower: {
+    keywords: [ "japanese", "spring" ],
+    char: "\ud83d\udcae",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  ideograph_advantage: {
+    keywords: [ "chinese", "kanji", "obtain", "get", "circle" ],
+    char: "\ud83c\ude50",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  secret: {
+    keywords: [ "privacy", "chinese", "sshh", "kanji", "red-circle" ],
+    char: "\u3299\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  congratulations: {
+    keywords: [ "chinese", "kanji", "japanese", "red-circle" ],
+    char: "\u3297\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  u5408: {
+    keywords: [ "japanese", "chinese", "join", "kanji", "red-square" ],
+    char: "\ud83c\ude34",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  u6e80: {
+    keywords: [ "full", "chinese", "japanese", "red-square", "kanji" ],
+    char: "\ud83c\ude35",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  u7981: {
+    keywords: [ "kanji", "japanese", "chinese", "forbidden", "limit", "restricted", "red-square" ],
+    char: "\ud83c\ude32",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  a: {
+    keywords: [ "red-square", "alphabet", "letter" ],
+    char: "\ud83c\udd70\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  b: {
+    keywords: [ "red-square", "alphabet", "letter" ],
+    char: "\ud83c\udd71\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  ab: {
+    keywords: [ "red-square", "alphabet" ],
+    char: "\ud83c\udd8e",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  cl: {
+    keywords: [ "alphabet", "words", "red-square" ],
+    char: "\ud83c\udd91",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  o2: {
+    keywords: [ "alphabet", "red-square", "letter" ],
+    char: "\ud83c\udd7e\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  sos: {
+    keywords: [ "help", "red-square", "words", "emergency", "911" ],
+    char: "\ud83c\udd98",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  no_entry: {
+    keywords: [ "limit", "security", "privacy", "bad", "denied", "stop", "circle" ],
+    char: "\u26d4",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  name_badge: {
+    keywords: [ "fire", "forbid" ],
+    char: "\ud83d\udcdb",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  no_entry_sign: {
+    keywords: [ "forbid", "stop", "limit", "denied", "disallow", "circle" ],
+    char: "\ud83d\udeab",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  x: {
+    keywords: [ "no", "delete", "remove", "cancel", "red" ],
+    char: "\u274c",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  o: {
+    keywords: [ "circle", "round" ],
+    char: "\u2b55",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  stop_sign: {
+    keywords: [ "stop" ],
+    char: "\ud83d\uded1",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  anger: {
+    keywords: [ "angry", "mad" ],
+    char: "\ud83d\udca2",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  hotsprings: {
+    keywords: [ "bath", "warm", "relax" ],
+    char: "\u2668\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  no_pedestrians: {
+    keywords: [ "rules", "crossing", "walking", "circle" ],
+    char: "\ud83d\udeb7",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  do_not_litter: {
+    keywords: [ "trash", "bin", "garbage", "circle" ],
+    char: "\ud83d\udeaf",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  no_bicycles: {
+    keywords: [ "cyclist", "prohibited", "circle" ],
+    char: "\ud83d\udeb3",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  "non-potable_water": {
+    keywords: [ "drink", "faucet", "tap", "circle" ],
+    char: "\ud83d\udeb1",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  underage: {
+    keywords: [ "18", "drink", "pub", "night", "minor", "circle" ],
+    char: "\ud83d\udd1e",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  no_mobile_phones: {
+    keywords: [ "iphone", "mute", "circle" ],
+    char: "\ud83d\udcf5",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  exclamation: {
+    keywords: [ "heavy_exclamation_mark", "danger", "surprise", "punctuation", "wow", "warning" ],
+    char: "\u2757",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  grey_exclamation: {
+    keywords: [ "surprise", "punctuation", "gray", "wow", "warning" ],
+    char: "\u2755",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  question: {
+    keywords: [ "doubt", "confused" ],
+    char: "\u2753",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  grey_question: {
+    keywords: [ "doubts", "gray", "huh", "confused" ],
+    char: "\u2754",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  bangbang: {
+    keywords: [ "exclamation", "surprise" ],
+    char: "\u203c\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  interrobang: {
+    keywords: [ "wat", "punctuation", "surprise" ],
+    char: "\u2049\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  100: {
+    keywords: [ "score", "perfect", "numbers", "century", "exam", "quiz", "test", "pass", "hundred" ],
+    char: "\ud83d\udcaf",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  low_brightness: {
+    keywords: [ "sun", "afternoon", "warm", "summer" ],
+    char: "\ud83d\udd05",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  high_brightness: {
+    keywords: [ "sun", "light" ],
+    char: "\ud83d\udd06",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  trident: {
+    keywords: [ "weapon", "spear" ],
+    char: "\ud83d\udd31",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  fleur_de_lis: {
+    keywords: [ "decorative", "scout" ],
+    char: "\u269c",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  part_alternation_mark: {
+    keywords: [ "graph", "presentation", "stats", "business", "economics", "bad" ],
+    char: "\u303d\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  warning: {
+    keywords: [ "exclamation", "wip", "alert", "error", "problem", "issue" ],
+    char: "\u26a0\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  children_crossing: {
+    keywords: [ "school", "warning", "danger", "sign", "driving", "yellow-diamond" ],
+    char: "\ud83d\udeb8",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  beginner: {
+    keywords: [ "badge", "shield" ],
+    char: "\ud83d\udd30",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  recycle: {
+    keywords: [ "arrow", "environment", "garbage", "trash" ],
+    char: "\u267b\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  u6307: {
+    keywords: [ "chinese", "point", "green-square", "kanji" ],
+    char: "\ud83c\ude2f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  chart: {
+    keywords: [ "green-square", "graph", "presentation", "stats" ],
+    char: "\ud83d\udcb9",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  sparkle: {
+    keywords: [ "stars", "green-square", "awesome", "good", "fireworks" ],
+    char: "\u2747\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  eight_spoked_asterisk: {
+    keywords: [ "star", "sparkle", "green-square" ],
+    char: "\u2733\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  negative_squared_cross_mark: {
+    keywords: [ "x", "green-square", "no", "deny" ],
+    char: "\u274e",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  white_check_mark: {
+    keywords: [ "green-square", "ok", "agree", "vote", "election", "answer", "tick" ],
+    char: "\u2705",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  diamond_shape_with_a_dot_inside: {
+    keywords: [ "jewel", "blue", "gem", "crystal", "fancy" ],
+    char: "\ud83d\udca0",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  cyclone: {
+    keywords: [ "weather", "swirl", "blue", "cloud", "vortex", "spiral", "whirlpool", "spin", "tornado", "hurricane", "typhoon" ],
+    char: "\ud83c\udf00",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  loop: {
+    keywords: [ "tape", "cassette" ],
+    char: "\u27bf",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  globe_with_meridians: {
+    keywords: [ "earth", "international", "world", "internet", "interweb", "i18n" ],
+    char: "\ud83c\udf10",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  m: {
+    keywords: [ "alphabet", "blue-circle", "letter" ],
+    char: "\u24c2\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  atm: {
+    keywords: [ "money", "sales", "cash", "blue-square", "payment", "bank" ],
+    char: "\ud83c\udfe7",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  sa: {
+    keywords: [ "japanese", "blue-square", "katakana" ],
+    char: "\ud83c\ude02\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  passport_control: {
+    keywords: [ "custom", "blue-square" ],
+    char: "\ud83d\udec2",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  customs: {
+    keywords: [ "passport", "border", "blue-square" ],
+    char: "\ud83d\udec3",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  baggage_claim: {
+    keywords: [ "blue-square", "airport", "transport" ],
+    char: "\ud83d\udec4",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  left_luggage: {
+    keywords: [ "blue-square", "travel" ],
+    char: "\ud83d\udec5",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  wheelchair: {
+    keywords: [ "blue-square", "disabled", "a11y", "accessibility" ],
+    char: "\u267f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  no_smoking: {
+    keywords: [ "cigarette", "blue-square", "smell", "smoke" ],
+    char: "\ud83d\udead",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  wc: {
+    keywords: [ "toilet", "restroom", "blue-square" ],
+    char: "\ud83d\udebe",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  parking: {
+    keywords: [ "cars", "blue-square", "alphabet", "letter" ],
+    char: "\ud83c\udd7f\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  potable_water: {
+    keywords: [ "blue-square", "liquid", "restroom", "cleaning", "faucet" ],
+    char: "\ud83d\udeb0",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  mens: {
+    keywords: [ "toilet", "restroom", "wc", "blue-square", "gender", "male" ],
+    char: "\ud83d\udeb9",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  womens: {
+    keywords: [ "purple-square", "woman", "female", "toilet", "loo", "restroom", "gender" ],
+    char: "\ud83d\udeba",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  baby_symbol: {
+    keywords: [ "orange-square", "child" ],
+    char: "\ud83d\udebc",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  restroom: {
+    keywords: [ "blue-square", "toilet", "refresh", "wc", "gender" ],
+    char: "\ud83d\udebb",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  put_litter_in_its_place: {
+    keywords: [ "blue-square", "sign", "human", "info" ],
+    char: "\ud83d\udeae",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  cinema: {
+    keywords: [ "blue-square", "record", "film", "movie", "curtain", "stage", "theater" ],
+    char: "\ud83c\udfa6",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  signal_strength: {
+    keywords: [ "blue-square", "reception", "phone", "internet", "connection", "wifi", "bluetooth", "bars" ],
+    char: "\ud83d\udcf6",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  koko: {
+    keywords: [ "blue-square", "here", "katakana", "japanese", "destination" ],
+    char: "\ud83c\ude01",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  ng: {
+    keywords: [ "blue-square", "words", "shape", "icon" ],
+    char: "\ud83c\udd96",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  ok: {
+    keywords: [ "good", "agree", "yes", "blue-square" ],
+    char: "\ud83c\udd97",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  up: {
+    keywords: [ "blue-square", "above", "high" ],
+    char: "\ud83c\udd99",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  cool: {
+    keywords: [ "words", "blue-square" ],
+    char: "\ud83c\udd92",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  new: {
+    keywords: [ "blue-square", "words", "start" ],
+    char: "\ud83c\udd95",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  free: {
+    keywords: [ "blue-square", "words" ],
+    char: "\ud83c\udd93",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  zero: {
+    keywords: [ "0", "numbers", "blue-square", "null" ],
+    char: "0\ufe0f\u20e3",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  one: {
+    keywords: [ "blue-square", "numbers", "1" ],
+    char: "1\ufe0f\u20e3",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  two: {
+    keywords: [ "numbers", "2", "prime", "blue-square" ],
+    char: "2\ufe0f\u20e3",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  three: {
+    keywords: [ "3", "numbers", "prime", "blue-square" ],
+    char: "3\ufe0f\u20e3",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  four: {
+    keywords: [ "4", "numbers", "blue-square" ],
+    char: "4\ufe0f\u20e3",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  five: {
+    keywords: [ "5", "numbers", "blue-square", "prime" ],
+    char: "5\ufe0f\u20e3",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  six: {
+    keywords: [ "6", "numbers", "blue-square" ],
+    char: "6\ufe0f\u20e3",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  seven: {
+    keywords: [ "7", "numbers", "blue-square", "prime" ],
+    char: "7\ufe0f\u20e3",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  eight: {
+    keywords: [ "8", "blue-square", "numbers" ],
+    char: "8\ufe0f\u20e3",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  nine: {
+    keywords: [ "blue-square", "numbers", "9" ],
+    char: "9\ufe0f\u20e3",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  keycap_ten: {
+    keywords: [ "numbers", "10", "blue-square" ],
+    char: "\ud83d\udd1f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  asterisk: {
+    keywords: [ "star", "keycap" ],
+    char: "*\u20e3",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  1234: {
+    keywords: [ "numbers", "blue-square" ],
+    char: "\ud83d\udd22",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  eject_button: {
+    keywords: [ "blue-square" ],
+    char: "\u23cf\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_forward: {
+    keywords: [ "blue-square", "right", "direction", "play" ],
+    char: "\u25b6\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  pause_button: {
+    keywords: [ "pause", "blue-square" ],
+    char: "\u23f8",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  next_track_button: {
+    keywords: [ "forward", "next", "blue-square" ],
+    char: "\u23ed",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  stop_button: {
+    keywords: [ "blue-square" ],
+    char: "\u23f9",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  record_button: {
+    keywords: [ "blue-square" ],
+    char: "\u23fa",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  play_or_pause_button: {
+    keywords: [ "blue-square", "play", "pause" ],
+    char: "\u23ef",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  previous_track_button: {
+    keywords: [ "backward" ],
+    char: "\u23ee",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  fast_forward: {
+    keywords: [ "blue-square", "play", "speed", "continue" ],
+    char: "\u23e9",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  rewind: {
+    keywords: [ "play", "blue-square" ],
+    char: "\u23ea",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  twisted_rightwards_arrows: {
+    keywords: [ "blue-square", "shuffle", "music", "random" ],
+    char: "\ud83d\udd00",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  repeat: {
+    keywords: [ "loop", "record" ],
+    char: "\ud83d\udd01",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  repeat_one: {
+    keywords: [ "blue-square", "loop" ],
+    char: "\ud83d\udd02",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_backward: {
+    keywords: [ "blue-square", "left", "direction" ],
+    char: "\u25c0\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_up_small: {
+    keywords: [ "blue-square", "triangle", "direction", "point", "forward", "top" ],
+    char: "\ud83d\udd3c",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_down_small: {
+    keywords: [ "blue-square", "direction", "bottom" ],
+    char: "\ud83d\udd3d",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_double_up: {
+    keywords: [ "blue-square", "direction", "top" ],
+    char: "\u23eb",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_double_down: {
+    keywords: [ "blue-square", "direction", "bottom" ],
+    char: "\u23ec",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_right: {
+    keywords: [ "blue-square", "next" ],
+    char: "\u27a1\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_left: {
+    keywords: [ "blue-square", "previous", "back" ],
+    char: "\u2b05\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_up: {
+    keywords: [ "blue-square", "continue", "top", "direction" ],
+    char: "\u2b06\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_down: {
+    keywords: [ "blue-square", "direction", "bottom" ],
+    char: "\u2b07\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_upper_right: {
+    keywords: [ "blue-square", "point", "direction", "diagonal", "northeast" ],
+    char: "\u2197\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_lower_right: {
+    keywords: [ "blue-square", "direction", "diagonal", "southeast" ],
+    char: "\u2198\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_lower_left: {
+    keywords: [ "blue-square", "direction", "diagonal", "southwest" ],
+    char: "\u2199\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_upper_left: {
+    keywords: [ "blue-square", "point", "direction", "diagonal", "northwest" ],
+    char: "\u2196\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_up_down: {
+    keywords: [ "blue-square", "direction", "way", "vertical" ],
+    char: "\u2195\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  left_right_arrow: {
+    keywords: [ "shape", "direction", "horizontal", "sideways" ],
+    char: "\u2194\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrows_counterclockwise: {
+    keywords: [ "blue-square", "sync", "cycle" ],
+    char: "\ud83d\udd04",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_right_hook: {
+    keywords: [ "blue-square", "return", "rotate", "direction" ],
+    char: "\u21aa\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  leftwards_arrow_with_hook: {
+    keywords: [ "back", "return", "blue-square", "undo", "enter" ],
+    char: "\u21a9\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_heading_up: {
+    keywords: [ "blue-square", "direction", "top" ],
+    char: "\u2934\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrow_heading_down: {
+    keywords: [ "blue-square", "direction", "bottom" ],
+    char: "\u2935\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  hash: {
+    keywords: [ "symbol", "blue-square", "twitter" ],
+    char: "#\ufe0f\u20e3",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  information_source: {
+    keywords: [ "blue-square", "alphabet", "letter" ],
+    char: "\u2139\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  abc: {
+    keywords: [ "blue-square", "alphabet" ],
+    char: "\ud83d\udd24",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  abcd: {
+    keywords: [ "blue-square", "alphabet" ],
+    char: "\ud83d\udd21",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  capital_abcd: {
+    keywords: [ "alphabet", "words", "blue-square" ],
+    char: "\ud83d\udd20",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  symbols: {
+    keywords: [ "blue-square", "music", "note", "ampersand", "percent", "glyphs", "characters" ],
+    char: "\ud83d\udd23",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  musical_note: {
+    keywords: [ "score", "tone", "sound" ],
+    char: "\ud83c\udfb5",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  notes: {
+    keywords: [ "music", "score" ],
+    char: "\ud83c\udfb6",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  wavy_dash: {
+    keywords: [ "draw", "line", "moustache", "mustache", "squiggle", "scribble" ],
+    char: "\u3030\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  curly_loop: {
+    keywords: [ "scribble", "draw", "shape", "squiggle" ],
+    char: "\u27b0",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  heavy_check_mark: {
+    keywords: [ "ok", "nike", "answer", "yes", "tick" ],
+    char: "\u2714\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  arrows_clockwise: {
+    keywords: [ "sync", "cycle", "round", "repeat" ],
+    char: "\ud83d\udd03",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  heavy_plus_sign: {
+    keywords: [ "math", "calculation", "addition", "more", "increase" ],
+    char: "\u2795",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  heavy_minus_sign: {
+    keywords: [ "math", "calculation", "subtract", "less" ],
+    char: "\u2796",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  heavy_division_sign: {
+    keywords: [ "divide", "math", "calculation" ],
+    char: "\u2797",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  heavy_multiplication_x: {
+    keywords: [ "math", "calculation" ],
+    char: "\u2716\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  infinity: {
+    keywords: [ "forever" ],
+    char: "\u267e",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  heavy_dollar_sign: {
+    keywords: [ "money", "sales", "payment", "currency", "buck" ],
+    char: "\ud83d\udcb2",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  currency_exchange: {
+    keywords: [ "money", "sales", "dollar", "travel" ],
+    char: "\ud83d\udcb1",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  copyright: {
+    keywords: [ "ip", "license", "circle", "law", "legal" ],
+    char: "\xa9\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  registered: {
+    keywords: [ "alphabet", "circle" ],
+    char: "\xae\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  tm: {
+    keywords: [ "trademark", "brand", "law", "legal" ],
+    char: "\u2122\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  end: {
+    keywords: [ "words", "arrow" ],
+    char: "\ud83d\udd1a",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  back: {
+    keywords: [ "arrow", "words", "return" ],
+    char: "\ud83d\udd19",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  on: {
+    keywords: [ "arrow", "words" ],
+    char: "\ud83d\udd1b",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  top: {
+    keywords: [ "words", "blue-square" ],
+    char: "\ud83d\udd1d",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  soon: {
+    keywords: [ "arrow", "words" ],
+    char: "\ud83d\udd1c",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  ballot_box_with_check: {
+    keywords: [ "ok", "agree", "confirm", "black-square", "vote", "election", "yes", "tick" ],
+    char: "\u2611\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  radio_button: {
+    keywords: [ "input", "old", "music", "circle" ],
+    char: "\ud83d\udd18",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  white_circle: {
+    keywords: [ "shape", "round" ],
+    char: "\u26aa",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  black_circle: {
+    keywords: [ "shape", "button", "round" ],
+    char: "\u26ab",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  red_circle: {
+    keywords: [ "shape", "error", "danger" ],
+    char: "\ud83d\udd34",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  large_blue_circle: {
+    keywords: [ "shape", "icon", "button" ],
+    char: "\ud83d\udd35",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  small_orange_diamond: {
+    keywords: [ "shape", "jewel", "gem" ],
+    char: "\ud83d\udd38",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  small_blue_diamond: {
+    keywords: [ "shape", "jewel", "gem" ],
+    char: "\ud83d\udd39",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  large_orange_diamond: {
+    keywords: [ "shape", "jewel", "gem" ],
+    char: "\ud83d\udd36",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  large_blue_diamond: {
+    keywords: [ "shape", "jewel", "gem" ],
+    char: "\ud83d\udd37",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  small_red_triangle: {
+    keywords: [ "shape", "direction", "up", "top" ],
+    char: "\ud83d\udd3a",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  black_small_square: {
+    keywords: [ "shape", "icon" ],
+    char: "\u25aa\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  white_small_square: {
+    keywords: [ "shape", "icon" ],
+    char: "\u25ab\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  black_large_square: {
+    keywords: [ "shape", "icon", "button" ],
+    char: "\u2b1b",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  white_large_square: {
+    keywords: [ "shape", "icon", "stone", "button" ],
+    char: "\u2b1c",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  small_red_triangle_down: {
+    keywords: [ "shape", "direction", "bottom" ],
+    char: "\ud83d\udd3b",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  black_medium_square: {
+    keywords: [ "shape", "button", "icon" ],
+    char: "\u25fc\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  white_medium_square: {
+    keywords: [ "shape", "stone", "icon" ],
+    char: "\u25fb\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  black_medium_small_square: {
+    keywords: [ "icon", "shape", "button" ],
+    char: "\u25fe",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  white_medium_small_square: {
+    keywords: [ "shape", "stone", "icon", "button" ],
+    char: "\u25fd",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  black_square_button: {
+    keywords: [ "shape", "input", "frame" ],
+    char: "\ud83d\udd32",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  white_square_button: {
+    keywords: [ "shape", "input" ],
+    char: "\ud83d\udd33",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  speaker: {
+    keywords: [ "sound", "volume", "silence", "broadcast" ],
+    char: "\ud83d\udd08",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  sound: {
+    keywords: [ "volume", "speaker", "broadcast" ],
+    char: "\ud83d\udd09",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  loud_sound: {
+    keywords: [ "volume", "noise", "noisy", "speaker", "broadcast" ],
+    char: "\ud83d\udd0a",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  mute: {
+    keywords: [ "sound", "volume", "silence", "quiet" ],
+    char: "\ud83d\udd07",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  mega: {
+    keywords: [ "sound", "speaker", "volume" ],
+    char: "\ud83d\udce3",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  loudspeaker: {
+    keywords: [ "volume", "sound" ],
+    char: "\ud83d\udce2",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  bell: {
+    keywords: [ "sound", "notification", "christmas", "xmas", "chime" ],
+    char: "\ud83d\udd14",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  no_bell: {
+    keywords: [ "sound", "volume", "mute", "quiet", "silent" ],
+    char: "\ud83d\udd15",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  black_joker: {
+    keywords: [ "poker", "cards", "game", "play", "magic" ],
+    char: "\ud83c\udccf",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  mahjong: {
+    keywords: [ "game", "play", "chinese", "kanji" ],
+    char: "\ud83c\udc04",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  spades: {
+    keywords: [ "poker", "cards", "suits", "magic" ],
+    char: "\u2660\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clubs: {
+    keywords: [ "poker", "cards", "magic", "suits" ],
+    char: "\u2663\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  hearts: {
+    keywords: [ "poker", "cards", "magic", "suits" ],
+    char: "\u2665\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  diamonds: {
+    keywords: [ "poker", "cards", "magic", "suits" ],
+    char: "\u2666\ufe0f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  flower_playing_cards: {
+    keywords: [ "game", "sunset", "red" ],
+    char: "\ud83c\udfb4",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  thought_balloon: {
+    keywords: [ "bubble", "cloud", "speech", "thinking", "dream" ],
+    char: "\ud83d\udcad",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  right_anger_bubble: {
+    keywords: [ "caption", "speech", "thinking", "mad" ],
+    char: "\ud83d\uddef",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  speech_balloon: {
+    keywords: [ "bubble", "words", "message", "talk", "chatting" ],
+    char: "\ud83d\udcac",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  left_speech_bubble: {
+    keywords: [ "words", "message", "talk", "chatting" ],
+    char: "\ud83d\udde8",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock1: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: "\ud83d\udd50",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock2: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: "\ud83d\udd51",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock3: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: "\ud83d\udd52",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock4: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: "\ud83d\udd53",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock5: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: "\ud83d\udd54",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock6: {
+    keywords: [ "time", "late", "early", "schedule", "dawn", "dusk" ],
+    char: "\ud83d\udd55",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock7: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: "\ud83d\udd56",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock8: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: "\ud83d\udd57",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock9: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: "\ud83d\udd58",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock10: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: "\ud83d\udd59",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock11: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: "\ud83d\udd5a",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock12: {
+    keywords: [ "time", "noon", "midnight", "midday", "late", "early", "schedule" ],
+    char: "\ud83d\udd5b",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock130: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: "\ud83d\udd5c",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock230: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: "\ud83d\udd5d",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock330: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: "\ud83d\udd5e",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock430: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: "\ud83d\udd5f",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock530: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: "\ud83d\udd60",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock630: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: "\ud83d\udd61",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock730: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: "\ud83d\udd62",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock830: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: "\ud83d\udd63",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock930: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: "\ud83d\udd64",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock1030: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: "\ud83d\udd65",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock1130: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: "\ud83d\udd66",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  clock1230: {
+    keywords: [ "time", "late", "early", "schedule" ],
+    char: "\ud83d\udd67",
+    fitzpatrick_scale: false,
+    category: "symbols"
+  },
+  afghanistan: {
+    keywords: [ "af", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde6\ud83c\uddeb",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  aland_islands: {
+    keywords: [ "\xc5land", "islands", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde6\ud83c\uddfd",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  albania: {
+    keywords: [ "al", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde6\ud83c\uddf1",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  algeria: {
+    keywords: [ "dz", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde9\ud83c\uddff",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  american_samoa: {
+    keywords: [ "american", "ws", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde6\ud83c\uddf8",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  andorra: {
+    keywords: [ "ad", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde6\ud83c\udde9",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  angola: {
+    keywords: [ "ao", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde6\ud83c\uddf4",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  anguilla: {
+    keywords: [ "ai", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde6\ud83c\uddee",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  antarctica: {
+    keywords: [ "aq", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde6\ud83c\uddf6",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  antigua_barbuda: {
+    keywords: [ "antigua", "barbuda", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde6\ud83c\uddec",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  argentina: {
+    keywords: [ "ar", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde6\ud83c\uddf7",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  armenia: {
+    keywords: [ "am", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde6\ud83c\uddf2",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  aruba: {
+    keywords: [ "aw", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde6\ud83c\uddfc",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  australia: {
+    keywords: [ "au", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde6\ud83c\uddfa",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  austria: {
+    keywords: [ "at", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde6\ud83c\uddf9",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  azerbaijan: {
+    keywords: [ "az", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde6\ud83c\uddff",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  bahamas: {
+    keywords: [ "bs", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde7\ud83c\uddf8",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  bahrain: {
+    keywords: [ "bh", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde7\ud83c\udded",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  bangladesh: {
+    keywords: [ "bd", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde7\ud83c\udde9",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  barbados: {
+    keywords: [ "bb", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde7\ud83c\udde7",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  belarus: {
+    keywords: [ "by", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde7\ud83c\uddfe",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  belgium: {
+    keywords: [ "be", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde7\ud83c\uddea",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  belize: {
+    keywords: [ "bz", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde7\ud83c\uddff",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  benin: {
+    keywords: [ "bj", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde7\ud83c\uddef",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  bermuda: {
+    keywords: [ "bm", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde7\ud83c\uddf2",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  bhutan: {
+    keywords: [ "bt", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde7\ud83c\uddf9",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  bolivia: {
+    keywords: [ "bo", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde7\ud83c\uddf4",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  caribbean_netherlands: {
+    keywords: [ "bonaire", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde7\ud83c\uddf6",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  bosnia_herzegovina: {
+    keywords: [ "bosnia", "herzegovina", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde7\ud83c\udde6",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  botswana: {
+    keywords: [ "bw", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde7\ud83c\uddfc",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  brazil: {
+    keywords: [ "br", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde7\ud83c\uddf7",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  british_indian_ocean_territory: {
+    keywords: [ "british", "indian", "ocean", "territory", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddee\ud83c\uddf4",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  british_virgin_islands: {
+    keywords: [ "british", "virgin", "islands", "bvi", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddfb\ud83c\uddec",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  brunei: {
+    keywords: [ "bn", "darussalam", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde7\ud83c\uddf3",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  bulgaria: {
+    keywords: [ "bg", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde7\ud83c\uddec",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  burkina_faso: {
+    keywords: [ "burkina", "faso", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde7\ud83c\uddeb",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  burundi: {
+    keywords: [ "bi", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde7\ud83c\uddee",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  cape_verde: {
+    keywords: [ "cabo", "verde", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde8\ud83c\uddfb",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  cambodia: {
+    keywords: [ "kh", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf0\ud83c\udded",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  cameroon: {
+    keywords: [ "cm", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde8\ud83c\uddf2",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  canada: {
+    keywords: [ "ca", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde8\ud83c\udde6",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  canary_islands: {
+    keywords: [ "canary", "islands", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddee\ud83c\udde8",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  cayman_islands: {
+    keywords: [ "cayman", "islands", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf0\ud83c\uddfe",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  central_african_republic: {
+    keywords: [ "central", "african", "republic", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde8\ud83c\uddeb",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  chad: {
+    keywords: [ "td", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf9\ud83c\udde9",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  chile: {
+    keywords: [ "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde8\ud83c\uddf1",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  cn: {
+    keywords: [ "china", "chinese", "prc", "flag", "country", "nation", "banner" ],
+    char: "\ud83c\udde8\ud83c\uddf3",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  christmas_island: {
+    keywords: [ "christmas", "island", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde8\ud83c\uddfd",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  cocos_islands: {
+    keywords: [ "cocos", "keeling", "islands", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde8\ud83c\udde8",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  colombia: {
+    keywords: [ "co", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde8\ud83c\uddf4",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  comoros: {
+    keywords: [ "km", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf0\ud83c\uddf2",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  congo_brazzaville: {
+    keywords: [ "congo", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde8\ud83c\uddec",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  congo_kinshasa: {
+    keywords: [ "congo", "democratic", "republic", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde8\ud83c\udde9",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  cook_islands: {
+    keywords: [ "cook", "islands", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde8\ud83c\uddf0",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  costa_rica: {
+    keywords: [ "costa", "rica", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde8\ud83c\uddf7",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  croatia: {
+    keywords: [ "hr", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udded\ud83c\uddf7",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  cuba: {
+    keywords: [ "cu", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde8\ud83c\uddfa",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  curacao: {
+    keywords: [ "cura\xe7ao", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde8\ud83c\uddfc",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  cyprus: {
+    keywords: [ "cy", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde8\ud83c\uddfe",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  czech_republic: {
+    keywords: [ "cz", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde8\ud83c\uddff",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  denmark: {
+    keywords: [ "dk", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde9\ud83c\uddf0",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  djibouti: {
+    keywords: [ "dj", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde9\ud83c\uddef",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  dominica: {
+    keywords: [ "dm", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde9\ud83c\uddf2",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  dominican_republic: {
+    keywords: [ "dominican", "republic", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde9\ud83c\uddf4",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  ecuador: {
+    keywords: [ "ec", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddea\ud83c\udde8",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  egypt: {
+    keywords: [ "eg", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddea\ud83c\uddec",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  el_salvador: {
+    keywords: [ "el", "salvador", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf8\ud83c\uddfb",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  equatorial_guinea: {
+    keywords: [ "equatorial", "gn", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddec\ud83c\uddf6",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  eritrea: {
+    keywords: [ "er", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddea\ud83c\uddf7",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  estonia: {
+    keywords: [ "ee", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddea\ud83c\uddea",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  ethiopia: {
+    keywords: [ "et", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddea\ud83c\uddf9",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  eu: {
+    keywords: [ "european", "union", "flag", "banner" ],
+    char: "\ud83c\uddea\ud83c\uddfa",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  falkland_islands: {
+    keywords: [ "falkland", "islands", "malvinas", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddeb\ud83c\uddf0",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  faroe_islands: {
+    keywords: [ "faroe", "islands", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddeb\ud83c\uddf4",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  fiji: {
+    keywords: [ "fj", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddeb\ud83c\uddef",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  finland: {
+    keywords: [ "fi", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddeb\ud83c\uddee",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  fr: {
+    keywords: [ "banner", "flag", "nation", "france", "french", "country" ],
+    char: "\ud83c\uddeb\ud83c\uddf7",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  french_guiana: {
+    keywords: [ "french", "guiana", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddec\ud83c\uddeb",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  french_polynesia: {
+    keywords: [ "french", "polynesia", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf5\ud83c\uddeb",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  french_southern_territories: {
+    keywords: [ "french", "southern", "territories", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf9\ud83c\uddeb",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  gabon: {
+    keywords: [ "ga", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddec\ud83c\udde6",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  gambia: {
+    keywords: [ "gm", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddec\ud83c\uddf2",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  georgia: {
+    keywords: [ "ge", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddec\ud83c\uddea",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  de: {
+    keywords: [ "german", "nation", "flag", "country", "banner" ],
+    char: "\ud83c\udde9\ud83c\uddea",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  ghana: {
+    keywords: [ "gh", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddec\ud83c\udded",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  gibraltar: {
+    keywords: [ "gi", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddec\ud83c\uddee",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  greece: {
+    keywords: [ "gr", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddec\ud83c\uddf7",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  greenland: {
+    keywords: [ "gl", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddec\ud83c\uddf1",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  grenada: {
+    keywords: [ "gd", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddec\ud83c\udde9",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  guadeloupe: {
+    keywords: [ "gp", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddec\ud83c\uddf5",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  guam: {
+    keywords: [ "gu", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddec\ud83c\uddfa",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  guatemala: {
+    keywords: [ "gt", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddec\ud83c\uddf9",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  guernsey: {
+    keywords: [ "gg", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddec\ud83c\uddec",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  guinea: {
+    keywords: [ "gn", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddec\ud83c\uddf3",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  guinea_bissau: {
+    keywords: [ "gw", "bissau", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddec\ud83c\uddfc",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  guyana: {
+    keywords: [ "gy", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddec\ud83c\uddfe",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  haiti: {
+    keywords: [ "ht", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udded\ud83c\uddf9",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  honduras: {
+    keywords: [ "hn", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udded\ud83c\uddf3",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  hong_kong: {
+    keywords: [ "hong", "kong", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udded\ud83c\uddf0",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  hungary: {
+    keywords: [ "hu", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udded\ud83c\uddfa",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  iceland: {
+    keywords: [ "is", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddee\ud83c\uddf8",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  india: {
+    keywords: [ "in", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddee\ud83c\uddf3",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  indonesia: {
+    keywords: [ "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddee\ud83c\udde9",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  iran: {
+    keywords: [ "iran,", "islamic", "republic", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddee\ud83c\uddf7",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  iraq: {
+    keywords: [ "iq", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddee\ud83c\uddf6",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  ireland: {
+    keywords: [ "ie", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddee\ud83c\uddea",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  isle_of_man: {
+    keywords: [ "isle", "man", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddee\ud83c\uddf2",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  israel: {
+    keywords: [ "il", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddee\ud83c\uddf1",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  it: {
+    keywords: [ "italy", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddee\ud83c\uddf9",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  cote_divoire: {
+    keywords: [ "ivory", "coast", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde8\ud83c\uddee",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  jamaica: {
+    keywords: [ "jm", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddef\ud83c\uddf2",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  jp: {
+    keywords: [ "japanese", "nation", "flag", "country", "banner" ],
+    char: "\ud83c\uddef\ud83c\uddf5",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  jersey: {
+    keywords: [ "je", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddef\ud83c\uddea",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  jordan: {
+    keywords: [ "jo", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddef\ud83c\uddf4",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  kazakhstan: {
+    keywords: [ "kz", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf0\ud83c\uddff",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  kenya: {
+    keywords: [ "ke", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf0\ud83c\uddea",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  kiribati: {
+    keywords: [ "ki", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf0\ud83c\uddee",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  kosovo: {
+    keywords: [ "xk", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddfd\ud83c\uddf0",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  kuwait: {
+    keywords: [ "kw", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf0\ud83c\uddfc",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  kyrgyzstan: {
+    keywords: [ "kg", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf0\ud83c\uddec",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  laos: {
+    keywords: [ "lao", "democratic", "republic", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf1\ud83c\udde6",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  latvia: {
+    keywords: [ "lv", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf1\ud83c\uddfb",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  lebanon: {
+    keywords: [ "lb", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf1\ud83c\udde7",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  lesotho: {
+    keywords: [ "ls", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf1\ud83c\uddf8",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  liberia: {
+    keywords: [ "lr", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf1\ud83c\uddf7",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  libya: {
+    keywords: [ "ly", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf1\ud83c\uddfe",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  liechtenstein: {
+    keywords: [ "li", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf1\ud83c\uddee",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  lithuania: {
+    keywords: [ "lt", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf1\ud83c\uddf9",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  luxembourg: {
+    keywords: [ "lu", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf1\ud83c\uddfa",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  macau: {
+    keywords: [ "macao", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf2\ud83c\uddf4",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  macedonia: {
+    keywords: [ "macedonia,", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf2\ud83c\uddf0",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  madagascar: {
+    keywords: [ "mg", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf2\ud83c\uddec",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  malawi: {
+    keywords: [ "mw", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf2\ud83c\uddfc",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  malaysia: {
+    keywords: [ "my", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf2\ud83c\uddfe",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  maldives: {
+    keywords: [ "mv", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf2\ud83c\uddfb",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  mali: {
+    keywords: [ "ml", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf2\ud83c\uddf1",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  malta: {
+    keywords: [ "mt", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf2\ud83c\uddf9",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  marshall_islands: {
+    keywords: [ "marshall", "islands", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf2\ud83c\udded",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  martinique: {
+    keywords: [ "mq", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf2\ud83c\uddf6",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  mauritania: {
+    keywords: [ "mr", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf2\ud83c\uddf7",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  mauritius: {
+    keywords: [ "mu", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf2\ud83c\uddfa",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  mayotte: {
+    keywords: [ "yt", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddfe\ud83c\uddf9",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  mexico: {
+    keywords: [ "mx", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf2\ud83c\uddfd",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  micronesia: {
+    keywords: [ "micronesia,", "federated", "states", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddeb\ud83c\uddf2",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  moldova: {
+    keywords: [ "moldova,", "republic", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf2\ud83c\udde9",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  monaco: {
+    keywords: [ "mc", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf2\ud83c\udde8",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  mongolia: {
+    keywords: [ "mn", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf2\ud83c\uddf3",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  montenegro: {
+    keywords: [ "me", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf2\ud83c\uddea",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  montserrat: {
+    keywords: [ "ms", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf2\ud83c\uddf8",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  morocco: {
+    keywords: [ "ma", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf2\ud83c\udde6",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  mozambique: {
+    keywords: [ "mz", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf2\ud83c\uddff",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  myanmar: {
+    keywords: [ "mm", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf2\ud83c\uddf2",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  namibia: {
+    keywords: [ "na", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf3\ud83c\udde6",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  nauru: {
+    keywords: [ "nr", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf3\ud83c\uddf7",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  nepal: {
+    keywords: [ "np", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf3\ud83c\uddf5",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  netherlands: {
+    keywords: [ "nl", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf3\ud83c\uddf1",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  new_caledonia: {
+    keywords: [ "new", "caledonia", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf3\ud83c\udde8",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  new_zealand: {
+    keywords: [ "new", "zealand", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf3\ud83c\uddff",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  nicaragua: {
+    keywords: [ "ni", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf3\ud83c\uddee",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  niger: {
+    keywords: [ "ne", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf3\ud83c\uddea",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  nigeria: {
+    keywords: [ "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf3\ud83c\uddec",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  niue: {
+    keywords: [ "nu", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf3\ud83c\uddfa",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  norfolk_island: {
+    keywords: [ "norfolk", "island", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf3\ud83c\uddeb",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  northern_mariana_islands: {
+    keywords: [ "northern", "mariana", "islands", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf2\ud83c\uddf5",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  north_korea: {
+    keywords: [ "north", "korea", "nation", "flag", "country", "banner" ],
+    char: "\ud83c\uddf0\ud83c\uddf5",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  norway: {
+    keywords: [ "no", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf3\ud83c\uddf4",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  oman: {
+    keywords: [ "om_symbol", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf4\ud83c\uddf2",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  pakistan: {
+    keywords: [ "pk", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf5\ud83c\uddf0",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  palau: {
+    keywords: [ "pw", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf5\ud83c\uddfc",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  palestinian_territories: {
+    keywords: [ "palestine", "palestinian", "territories", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf5\ud83c\uddf8",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  panama: {
+    keywords: [ "pa", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf5\ud83c\udde6",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  papua_new_guinea: {
+    keywords: [ "papua", "new", "guinea", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf5\ud83c\uddec",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  paraguay: {
+    keywords: [ "py", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf5\ud83c\uddfe",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  peru: {
+    keywords: [ "pe", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf5\ud83c\uddea",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  philippines: {
+    keywords: [ "ph", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf5\ud83c\udded",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  pitcairn_islands: {
+    keywords: [ "pitcairn", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf5\ud83c\uddf3",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  poland: {
+    keywords: [ "pl", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf5\ud83c\uddf1",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  portugal: {
+    keywords: [ "pt", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf5\ud83c\uddf9",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  puerto_rico: {
+    keywords: [ "puerto", "rico", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf5\ud83c\uddf7",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  qatar: {
+    keywords: [ "qa", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf6\ud83c\udde6",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  reunion: {
+    keywords: [ "r\xe9union", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf7\ud83c\uddea",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  romania: {
+    keywords: [ "ro", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf7\ud83c\uddf4",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  ru: {
+    keywords: [ "russian", "federation", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf7\ud83c\uddfa",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  rwanda: {
+    keywords: [ "rw", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf7\ud83c\uddfc",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  st_barthelemy: {
+    keywords: [ "saint", "barth\xe9lemy", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde7\ud83c\uddf1",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  st_helena: {
+    keywords: [ "saint", "helena", "ascension", "tristan", "cunha", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf8\ud83c\udded",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  st_kitts_nevis: {
+    keywords: [ "saint", "kitts", "nevis", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf0\ud83c\uddf3",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  st_lucia: {
+    keywords: [ "saint", "lucia", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf1\ud83c\udde8",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  st_pierre_miquelon: {
+    keywords: [ "saint", "pierre", "miquelon", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf5\ud83c\uddf2",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  st_vincent_grenadines: {
+    keywords: [ "saint", "vincent", "grenadines", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddfb\ud83c\udde8",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  samoa: {
+    keywords: [ "ws", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddfc\ud83c\uddf8",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  san_marino: {
+    keywords: [ "san", "marino", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf8\ud83c\uddf2",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  sao_tome_principe: {
+    keywords: [ "sao", "tome", "principe", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf8\ud83c\uddf9",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  saudi_arabia: {
+    keywords: [ "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf8\ud83c\udde6",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  senegal: {
+    keywords: [ "sn", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf8\ud83c\uddf3",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  serbia: {
+    keywords: [ "rs", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf7\ud83c\uddf8",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  seychelles: {
+    keywords: [ "sc", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf8\ud83c\udde8",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  sierra_leone: {
+    keywords: [ "sierra", "leone", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf8\ud83c\uddf1",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  singapore: {
+    keywords: [ "sg", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf8\ud83c\uddec",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  sint_maarten: {
+    keywords: [ "sint", "maarten", "dutch", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf8\ud83c\uddfd",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  slovakia: {
+    keywords: [ "sk", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf8\ud83c\uddf0",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  slovenia: {
+    keywords: [ "si", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf8\ud83c\uddee",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  solomon_islands: {
+    keywords: [ "solomon", "islands", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf8\ud83c\udde7",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  somalia: {
+    keywords: [ "so", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf8\ud83c\uddf4",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  south_africa: {
+    keywords: [ "south", "africa", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddff\ud83c\udde6",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  south_georgia_south_sandwich_islands: {
+    keywords: [ "south", "georgia", "sandwich", "islands", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddec\ud83c\uddf8",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  kr: {
+    keywords: [ "south", "korea", "nation", "flag", "country", "banner" ],
+    char: "\ud83c\uddf0\ud83c\uddf7",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  south_sudan: {
+    keywords: [ "south", "sd", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf8\ud83c\uddf8",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  es: {
+    keywords: [ "spain", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddea\ud83c\uddf8",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  sri_lanka: {
+    keywords: [ "sri", "lanka", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf1\ud83c\uddf0",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  sudan: {
+    keywords: [ "sd", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf8\ud83c\udde9",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  suriname: {
+    keywords: [ "sr", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf8\ud83c\uddf7",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  swaziland: {
+    keywords: [ "sz", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf8\ud83c\uddff",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  sweden: {
+    keywords: [ "se", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf8\ud83c\uddea",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  switzerland: {
+    keywords: [ "ch", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde8\ud83c\udded",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  syria: {
+    keywords: [ "syrian", "arab", "republic", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf8\ud83c\uddfe",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  taiwan: {
+    keywords: [ "tw", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf9\ud83c\uddfc",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  tajikistan: {
+    keywords: [ "tj", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf9\ud83c\uddef",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  tanzania: {
+    keywords: [ "tanzania,", "united", "republic", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf9\ud83c\uddff",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  thailand: {
+    keywords: [ "th", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf9\ud83c\udded",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  timor_leste: {
+    keywords: [ "timor", "leste", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf9\ud83c\uddf1",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  togo: {
+    keywords: [ "tg", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf9\ud83c\uddec",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  tokelau: {
+    keywords: [ "tk", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf9\ud83c\uddf0",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  tonga: {
+    keywords: [ "to", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf9\ud83c\uddf4",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  trinidad_tobago: {
+    keywords: [ "trinidad", "tobago", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf9\ud83c\uddf9",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  tunisia: {
+    keywords: [ "tn", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf9\ud83c\uddf3",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  tr: {
+    keywords: [ "turkey", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf9\ud83c\uddf7",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  turkmenistan: {
+    keywords: [ "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf9\ud83c\uddf2",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  turks_caicos_islands: {
+    keywords: [ "turks", "caicos", "islands", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf9\ud83c\udde8",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  tuvalu: {
+    keywords: [ "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddf9\ud83c\uddfb",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  uganda: {
+    keywords: [ "ug", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddfa\ud83c\uddec",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  ukraine: {
+    keywords: [ "ua", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddfa\ud83c\udde6",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  united_arab_emirates: {
+    keywords: [ "united", "arab", "emirates", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\udde6\ud83c\uddea",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  uk: {
+    keywords: [ "united", "kingdom", "great", "britain", "northern", "ireland", "flag", "nation", "country", "banner", "british", "UK", "english", "england", "union jack" ],
+    char: "\ud83c\uddec\ud83c\udde7",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  england: {
+    keywords: [ "flag", "english" ],
+    char: "\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  scotland: {
+    keywords: [ "flag", "scottish" ],
+    char: "\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  wales: {
+    keywords: [ "flag", "welsh" ],
+    char: "\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  us: {
+    keywords: [ "united", "states", "america", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddfa\ud83c\uddf8",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  us_virgin_islands: {
+    keywords: [ "virgin", "islands", "us", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddfb\ud83c\uddee",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  uruguay: {
+    keywords: [ "uy", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddfa\ud83c\uddfe",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  uzbekistan: {
+    keywords: [ "uz", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddfa\ud83c\uddff",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  vanuatu: {
+    keywords: [ "vu", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddfb\ud83c\uddfa",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  vatican_city: {
+    keywords: [ "vatican", "city", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddfb\ud83c\udde6",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  venezuela: {
+    keywords: [ "ve", "bolivarian", "republic", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddfb\ud83c\uddea",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  vietnam: {
+    keywords: [ "viet", "nam", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddfb\ud83c\uddf3",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  wallis_futuna: {
+    keywords: [ "wallis", "futuna", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddfc\ud83c\uddeb",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  western_sahara: {
+    keywords: [ "western", "sahara", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddea\ud83c\udded",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  yemen: {
+    keywords: [ "ye", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddfe\ud83c\uddea",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  zambia: {
+    keywords: [ "zm", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddff\ud83c\uddf2",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  zimbabwe: {
+    keywords: [ "zw", "flag", "nation", "country", "banner" ],
+    char: "\ud83c\uddff\ud83c\uddfc",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  united_nations: {
+    keywords: [ "un", "flag", "banner" ],
+    char: "\ud83c\uddfa\ud83c\uddf3",
+    fitzpatrick_scale: false,
+    category: "flags"
+  },
+  pirate_flag: {
+    keywords: [ "skull", "crossbones", "flag", "banner" ],
+    char: "\ud83c\udff4\u200d\u2620\ufe0f",
+    fitzpatrick_scale: false,
+    category: "flags"
+  }
+});
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/emoticons/js/emojis.min.js b/public/static/assets/gougu/module/tinymce/plugins/emoticons/js/emojis.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..42cea9ab402c49fd15591275d0e0373e2834acc0
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/emoticons/js/emojis.min.js
@@ -0,0 +1,2 @@
+// Source: npm package: emojilib, file:emojis.json
+window.tinymce.Resource.add("tinymce.plugins.emoticons",{grinning:{keywords:["face","smile","happy","joy",":D","grin"],char:"\ud83d\ude00",fitzpatrick_scale:!1,category:"people"},grimacing:{keywords:["face","grimace","teeth"],char:"\ud83d\ude2c",fitzpatrick_scale:!1,category:"people"},grin:{keywords:["face","happy","smile","joy","kawaii"],char:"\ud83d\ude01",fitzpatrick_scale:!1,category:"people"},joy:{keywords:["face","cry","tears","weep","happy","happytears","haha"],char:"\ud83d\ude02",fitzpatrick_scale:!1,category:"people"},rofl:{keywords:["face","rolling","floor","laughing","lol","haha"],char:"\ud83e\udd23",fitzpatrick_scale:!1,category:"people"},partying:{keywords:["face","celebration","woohoo"],char:"\ud83e\udd73",fitzpatrick_scale:!1,category:"people"},smiley:{keywords:["face","happy","joy","haha",":D",":)","smile","funny"],char:"\ud83d\ude03",fitzpatrick_scale:!1,category:"people"},smile:{keywords:["face","happy","joy","funny","haha","laugh","like",":D",":)"],char:"\ud83d\ude04",fitzpatrick_scale:!1,category:"people"},sweat_smile:{keywords:["face","hot","happy","laugh","sweat","smile","relief"],char:"\ud83d\ude05",fitzpatrick_scale:!1,category:"people"},laughing:{keywords:["happy","joy","lol","satisfied","haha","face","glad","XD","laugh"],char:"\ud83d\ude06",fitzpatrick_scale:!1,category:"people"},innocent:{keywords:["face","angel","heaven","halo"],char:"\ud83d\ude07",fitzpatrick_scale:!1,category:"people"},wink:{keywords:["face","happy","mischievous","secret",";)","smile","eye"],char:"\ud83d\ude09",fitzpatrick_scale:!1,category:"people"},blush:{keywords:["face","smile","happy","flushed","crush","embarrassed","shy","joy"],char:"\ud83d\ude0a",fitzpatrick_scale:!1,category:"people"},slightly_smiling_face:{keywords:["face","smile"],char:"\ud83d\ude42",fitzpatrick_scale:!1,category:"people"},upside_down_face:{keywords:["face","flipped","silly","smile"],char:"\ud83d\ude43",fitzpatrick_scale:!1,category:"people"},relaxed:{keywords:["face","blush","massage","happiness"],char:"\u263a\ufe0f",fitzpatrick_scale:!1,category:"people"},yum:{keywords:["happy","joy","tongue","smile","face","silly","yummy","nom","delicious","savouring"],char:"\ud83d\ude0b",fitzpatrick_scale:!1,category:"people"},relieved:{keywords:["face","relaxed","phew","massage","happiness"],char:"\ud83d\ude0c",fitzpatrick_scale:!1,category:"people"},heart_eyes:{keywords:["face","love","like","affection","valentines","infatuation","crush","heart"],char:"\ud83d\ude0d",fitzpatrick_scale:!1,category:"people"},smiling_face_with_three_hearts:{keywords:["face","love","like","affection","valentines","infatuation","crush","hearts","adore"],char:"\ud83e\udd70",fitzpatrick_scale:!1,category:"people"},kissing_heart:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:"\ud83d\ude18",fitzpatrick_scale:!1,category:"people"},kissing:{keywords:["love","like","face","3","valentines","infatuation","kiss"],char:"\ud83d\ude17",fitzpatrick_scale:!1,category:"people"},kissing_smiling_eyes:{keywords:["face","affection","valentines","infatuation","kiss"],char:"\ud83d\ude19",fitzpatrick_scale:!1,category:"people"},kissing_closed_eyes:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:"\ud83d\ude1a",fitzpatrick_scale:!1,category:"people"},stuck_out_tongue_winking_eye:{keywords:["face","prank","childish","playful","mischievous","smile","wink","tongue"],char:"\ud83d\ude1c",fitzpatrick_scale:!1,category:"people"},zany:{keywords:["face","goofy","crazy"],char:"\ud83e\udd2a",fitzpatrick_scale:!1,category:"people"},raised_eyebrow:{keywords:["face","distrust","scepticism","disapproval","disbelief","surprise"],char:"\ud83e\udd28",fitzpatrick_scale:!1,category:"people"},monocle:{keywords:["face","stuffy","wealthy"],char:"\ud83e\uddd0",fitzpatrick_scale:!1,category:"people"},stuck_out_tongue_closed_eyes:{keywords:["face","prank","playful","mischievous","smile","tongue"],char:"\ud83d\ude1d",fitzpatrick_scale:!1,category:"people"},stuck_out_tongue:{keywords:["face","prank","childish","playful","mischievous","smile","tongue"],char:"\ud83d\ude1b",fitzpatrick_scale:!1,category:"people"},money_mouth_face:{keywords:["face","rich","dollar","money"],char:"\ud83e\udd11",fitzpatrick_scale:!1,category:"people"},nerd_face:{keywords:["face","nerdy","geek","dork"],char:"\ud83e\udd13",fitzpatrick_scale:!1,category:"people"},sunglasses:{keywords:["face","cool","smile","summer","beach","sunglass"],char:"\ud83d\ude0e",fitzpatrick_scale:!1,category:"people"},star_struck:{keywords:["face","smile","starry","eyes","grinning"],char:"\ud83e\udd29",fitzpatrick_scale:!1,category:"people"},clown_face:{keywords:["face"],char:"\ud83e\udd21",fitzpatrick_scale:!1,category:"people"},cowboy_hat_face:{keywords:["face","cowgirl","hat"],char:"\ud83e\udd20",fitzpatrick_scale:!1,category:"people"},hugs:{keywords:["face","smile","hug"],char:"\ud83e\udd17",fitzpatrick_scale:!1,category:"people"},smirk:{keywords:["face","smile","mean","prank","smug","sarcasm"],char:"\ud83d\ude0f",fitzpatrick_scale:!1,category:"people"},no_mouth:{keywords:["face","hellokitty"],char:"\ud83d\ude36",fitzpatrick_scale:!1,category:"people"},neutral_face:{keywords:["indifference","meh",":|","neutral"],char:"\ud83d\ude10",fitzpatrick_scale:!1,category:"people"},expressionless:{keywords:["face","indifferent","-_-","meh","deadpan"],char:"\ud83d\ude11",fitzpatrick_scale:!1,category:"people"},unamused:{keywords:["indifference","bored","straight face","serious","sarcasm","unimpressed","skeptical","dubious","side_eye"],char:"\ud83d\ude12",fitzpatrick_scale:!1,category:"people"},roll_eyes:{keywords:["face","eyeroll","frustrated"],char:"\ud83d\ude44",fitzpatrick_scale:!1,category:"people"},thinking:{keywords:["face","hmmm","think","consider"],char:"\ud83e\udd14",fitzpatrick_scale:!1,category:"people"},lying_face:{keywords:["face","lie","pinocchio"],char:"\ud83e\udd25",fitzpatrick_scale:!1,category:"people"},hand_over_mouth:{keywords:["face","whoops","shock","surprise"],char:"\ud83e\udd2d",fitzpatrick_scale:!1,category:"people"},shushing:{keywords:["face","quiet","shhh"],char:"\ud83e\udd2b",fitzpatrick_scale:!1,category:"people"},symbols_over_mouth:{keywords:["face","swearing","cursing","cussing","profanity","expletive"],char:"\ud83e\udd2c",fitzpatrick_scale:!1,category:"people"},exploding_head:{keywords:["face","shocked","mind","blown"],char:"\ud83e\udd2f",fitzpatrick_scale:!1,category:"people"},flushed:{keywords:["face","blush","shy","flattered"],char:"\ud83d\ude33",fitzpatrick_scale:!1,category:"people"},disappointed:{keywords:["face","sad","upset","depressed",":("],char:"\ud83d\ude1e",fitzpatrick_scale:!1,category:"people"},worried:{keywords:["face","concern","nervous",":("],char:"\ud83d\ude1f",fitzpatrick_scale:!1,category:"people"},angry:{keywords:["mad","face","annoyed","frustrated"],char:"\ud83d\ude20",fitzpatrick_scale:!1,category:"people"},rage:{keywords:["angry","mad","hate","despise"],char:"\ud83d\ude21",fitzpatrick_scale:!1,category:"people"},pensive:{keywords:["face","sad","depressed","upset"],char:"\ud83d\ude14",fitzpatrick_scale:!1,category:"people"},confused:{keywords:["face","indifference","huh","weird","hmmm",":/"],char:"\ud83d\ude15",fitzpatrick_scale:!1,category:"people"},slightly_frowning_face:{keywords:["face","frowning","disappointed","sad","upset"],char:"\ud83d\ude41",fitzpatrick_scale:!1,category:"people"},frowning_face:{keywords:["face","sad","upset","frown"],char:"\u2639",fitzpatrick_scale:!1,category:"people"},persevere:{keywords:["face","sick","no","upset","oops"],char:"\ud83d\ude23",fitzpatrick_scale:!1,category:"people"},confounded:{keywords:["face","confused","sick","unwell","oops",":S"],char:"\ud83d\ude16",fitzpatrick_scale:!1,category:"people"},tired_face:{keywords:["sick","whine","upset","frustrated"],char:"\ud83d\ude2b",fitzpatrick_scale:!1,category:"people"},weary:{keywords:["face","tired","sleepy","sad","frustrated","upset"],char:"\ud83d\ude29",fitzpatrick_scale:!1,category:"people"},pleading:{keywords:["face","begging","mercy"],char:"\ud83e\udd7a",fitzpatrick_scale:!1,category:"people"},triumph:{keywords:["face","gas","phew","proud","pride"],char:"\ud83d\ude24",fitzpatrick_scale:!1,category:"people"},open_mouth:{keywords:["face","surprise","impressed","wow","whoa",":O"],char:"\ud83d\ude2e",fitzpatrick_scale:!1,category:"people"},scream:{keywords:["face","munch","scared","omg"],char:"\ud83d\ude31",fitzpatrick_scale:!1,category:"people"},fearful:{keywords:["face","scared","terrified","nervous","oops","huh"],char:"\ud83d\ude28",fitzpatrick_scale:!1,category:"people"},cold_sweat:{keywords:["face","nervous","sweat"],char:"\ud83d\ude30",fitzpatrick_scale:!1,category:"people"},hushed:{keywords:["face","woo","shh"],char:"\ud83d\ude2f",fitzpatrick_scale:!1,category:"people"},frowning:{keywords:["face","aw","what"],char:"\ud83d\ude26",fitzpatrick_scale:!1,category:"people"},anguished:{keywords:["face","stunned","nervous"],char:"\ud83d\ude27",fitzpatrick_scale:!1,category:"people"},cry:{keywords:["face","tears","sad","depressed","upset",":'("],char:"\ud83d\ude22",fitzpatrick_scale:!1,category:"people"},disappointed_relieved:{keywords:["face","phew","sweat","nervous"],char:"\ud83d\ude25",fitzpatrick_scale:!1,category:"people"},drooling_face:{keywords:["face"],char:"\ud83e\udd24",fitzpatrick_scale:!1,category:"people"},sleepy:{keywords:["face","tired","rest","nap"],char:"\ud83d\ude2a",fitzpatrick_scale:!1,category:"people"},sweat:{keywords:["face","hot","sad","tired","exercise"],char:"\ud83d\ude13",fitzpatrick_scale:!1,category:"people"},hot:{keywords:["face","feverish","heat","red","sweating"],char:"\ud83e\udd75",fitzpatrick_scale:!1,category:"people"},cold:{keywords:["face","blue","freezing","frozen","frostbite","icicles"],char:"\ud83e\udd76",fitzpatrick_scale:!1,category:"people"},sob:{keywords:["face","cry","tears","sad","upset","depressed"],char:"\ud83d\ude2d",fitzpatrick_scale:!1,category:"people"},dizzy_face:{keywords:["spent","unconscious","xox","dizzy"],char:"\ud83d\ude35",fitzpatrick_scale:!1,category:"people"},astonished:{keywords:["face","xox","surprised","poisoned"],char:"\ud83d\ude32",fitzpatrick_scale:!1,category:"people"},zipper_mouth_face:{keywords:["face","sealed","zipper","secret"],char:"\ud83e\udd10",fitzpatrick_scale:!1,category:"people"},nauseated_face:{keywords:["face","vomit","gross","green","sick","throw up","ill"],char:"\ud83e\udd22",fitzpatrick_scale:!1,category:"people"},sneezing_face:{keywords:["face","gesundheit","sneeze","sick","allergy"],char:"\ud83e\udd27",fitzpatrick_scale:!1,category:"people"},vomiting:{keywords:["face","sick"],char:"\ud83e\udd2e",fitzpatrick_scale:!1,category:"people"},mask:{keywords:["face","sick","ill","disease"],char:"\ud83d\ude37",fitzpatrick_scale:!1,category:"people"},face_with_thermometer:{keywords:["sick","temperature","thermometer","cold","fever"],char:"\ud83e\udd12",fitzpatrick_scale:!1,category:"people"},face_with_head_bandage:{keywords:["injured","clumsy","bandage","hurt"],char:"\ud83e\udd15",fitzpatrick_scale:!1,category:"people"},woozy:{keywords:["face","dizzy","intoxicated","tipsy","wavy"],char:"\ud83e\udd74",fitzpatrick_scale:!1,category:"people"},sleeping:{keywords:["face","tired","sleepy","night","zzz"],char:"\ud83d\ude34",fitzpatrick_scale:!1,category:"people"},zzz:{keywords:["sleepy","tired","dream"],char:"\ud83d\udca4",fitzpatrick_scale:!1,category:"people"},poop:{keywords:["hankey","shitface","fail","turd","shit"],char:"\ud83d\udca9",fitzpatrick_scale:!1,category:"people"},smiling_imp:{keywords:["devil","horns"],char:"\ud83d\ude08",fitzpatrick_scale:!1,category:"people"},imp:{keywords:["devil","angry","horns"],char:"\ud83d\udc7f",fitzpatrick_scale:!1,category:"people"},japanese_ogre:{keywords:["monster","red","mask","halloween","scary","creepy","devil","demon","japanese","ogre"],char:"\ud83d\udc79",fitzpatrick_scale:!1,category:"people"},japanese_goblin:{keywords:["red","evil","mask","monster","scary","creepy","japanese","goblin"],char:"\ud83d\udc7a",fitzpatrick_scale:!1,category:"people"},skull:{keywords:["dead","skeleton","creepy","death"],char:"\ud83d\udc80",fitzpatrick_scale:!1,category:"people"},ghost:{keywords:["halloween","spooky","scary"],char:"\ud83d\udc7b",fitzpatrick_scale:!1,category:"people"},alien:{keywords:["UFO","paul","weird","outer_space"],char:"\ud83d\udc7d",fitzpatrick_scale:!1,category:"people"},robot:{keywords:["computer","machine","bot"],char:"\ud83e\udd16",fitzpatrick_scale:!1,category:"people"},smiley_cat:{keywords:["animal","cats","happy","smile"],char:"\ud83d\ude3a",fitzpatrick_scale:!1,category:"people"},smile_cat:{keywords:["animal","cats","smile"],char:"\ud83d\ude38",fitzpatrick_scale:!1,category:"people"},joy_cat:{keywords:["animal","cats","haha","happy","tears"],char:"\ud83d\ude39",fitzpatrick_scale:!1,category:"people"},heart_eyes_cat:{keywords:["animal","love","like","affection","cats","valentines","heart"],char:"\ud83d\ude3b",fitzpatrick_scale:!1,category:"people"},smirk_cat:{keywords:["animal","cats","smirk"],char:"\ud83d\ude3c",fitzpatrick_scale:!1,category:"people"},kissing_cat:{keywords:["animal","cats","kiss"],char:"\ud83d\ude3d",fitzpatrick_scale:!1,category:"people"},scream_cat:{keywords:["animal","cats","munch","scared","scream"],char:"\ud83d\ude40",fitzpatrick_scale:!1,category:"people"},crying_cat_face:{keywords:["animal","tears","weep","sad","cats","upset","cry"],char:"\ud83d\ude3f",fitzpatrick_scale:!1,category:"people"},pouting_cat:{keywords:["animal","cats"],char:"\ud83d\ude3e",fitzpatrick_scale:!1,category:"people"},palms_up:{keywords:["hands","gesture","cupped","prayer"],char:"\ud83e\udd32",fitzpatrick_scale:!0,category:"people"},raised_hands:{keywords:["gesture","hooray","yea","celebration","hands"],char:"\ud83d\ude4c",fitzpatrick_scale:!0,category:"people"},clap:{keywords:["hands","praise","applause","congrats","yay"],char:"\ud83d\udc4f",fitzpatrick_scale:!0,category:"people"},wave:{keywords:["hands","gesture","goodbye","solong","farewell","hello","hi","palm"],char:"\ud83d\udc4b",fitzpatrick_scale:!0,category:"people"},call_me_hand:{keywords:["hands","gesture"],char:"\ud83e\udd19",fitzpatrick_scale:!0,category:"people"},"+1":{keywords:["thumbsup","yes","awesome","good","agree","accept","cool","hand","like"],char:"\ud83d\udc4d",fitzpatrick_scale:!0,category:"people"},"-1":{keywords:["thumbsdown","no","dislike","hand"],char:"\ud83d\udc4e",fitzpatrick_scale:!0,category:"people"},facepunch:{keywords:["angry","violence","fist","hit","attack","hand"],char:"\ud83d\udc4a",fitzpatrick_scale:!0,category:"people"},fist:{keywords:["fingers","hand","grasp"],char:"\u270a",fitzpatrick_scale:!0,category:"people"},fist_left:{keywords:["hand","fistbump"],char:"\ud83e\udd1b",fitzpatrick_scale:!0,category:"people"},fist_right:{keywords:["hand","fistbump"],char:"\ud83e\udd1c",fitzpatrick_scale:!0,category:"people"},v:{keywords:["fingers","ohyeah","hand","peace","victory","two"],char:"\u270c",fitzpatrick_scale:!0,category:"people"},ok_hand:{keywords:["fingers","limbs","perfect","ok","okay"],char:"\ud83d\udc4c",fitzpatrick_scale:!0,category:"people"},raised_hand:{keywords:["fingers","stop","highfive","palm","ban"],char:"\u270b",fitzpatrick_scale:!0,category:"people"},raised_back_of_hand:{keywords:["fingers","raised","backhand"],char:"\ud83e\udd1a",fitzpatrick_scale:!0,category:"people"},open_hands:{keywords:["fingers","butterfly","hands","open"],char:"\ud83d\udc50",fitzpatrick_scale:!0,category:"people"},muscle:{keywords:["arm","flex","hand","summer","strong","biceps"],char:"\ud83d\udcaa",fitzpatrick_scale:!0,category:"people"},pray:{keywords:["please","hope","wish","namaste","highfive"],char:"\ud83d\ude4f",fitzpatrick_scale:!0,category:"people"},foot:{keywords:["kick","stomp"],char:"\ud83e\uddb6",fitzpatrick_scale:!0,category:"people"},leg:{keywords:["kick","limb"],char:"\ud83e\uddb5",fitzpatrick_scale:!0,category:"people"},handshake:{keywords:["agreement","shake"],char:"\ud83e\udd1d",fitzpatrick_scale:!1,category:"people"},point_up:{keywords:["hand","fingers","direction","up"],char:"\u261d",fitzpatrick_scale:!0,category:"people"},point_up_2:{keywords:["fingers","hand","direction","up"],char:"\ud83d\udc46",fitzpatrick_scale:!0,category:"people"},point_down:{keywords:["fingers","hand","direction","down"],char:"\ud83d\udc47",fitzpatrick_scale:!0,category:"people"},point_left:{keywords:["direction","fingers","hand","left"],char:"\ud83d\udc48",fitzpatrick_scale:!0,category:"people"},point_right:{keywords:["fingers","hand","direction","right"],char:"\ud83d\udc49",fitzpatrick_scale:!0,category:"people"},fu:{keywords:["hand","fingers","rude","middle","flipping"],char:"\ud83d\udd95",fitzpatrick_scale:!0,category:"people"},raised_hand_with_fingers_splayed:{keywords:["hand","fingers","palm"],char:"\ud83d\udd90",fitzpatrick_scale:!0,category:"people"},love_you:{keywords:["hand","fingers","gesture"],char:"\ud83e\udd1f",fitzpatrick_scale:!0,category:"people"},metal:{keywords:["hand","fingers","evil_eye","sign_of_horns","rock_on"],char:"\ud83e\udd18",fitzpatrick_scale:!0,category:"people"},crossed_fingers:{keywords:["good","lucky"],char:"\ud83e\udd1e",fitzpatrick_scale:!0,category:"people"},vulcan_salute:{keywords:["hand","fingers","spock","star trek"],char:"\ud83d\udd96",fitzpatrick_scale:!0,category:"people"},writing_hand:{keywords:["lower_left_ballpoint_pen","stationery","write","compose"],char:"\u270d",fitzpatrick_scale:!0,category:"people"},selfie:{keywords:["camera","phone"],char:"\ud83e\udd33",fitzpatrick_scale:!0,category:"people"},nail_care:{keywords:["beauty","manicure","finger","fashion","nail"],char:"\ud83d\udc85",fitzpatrick_scale:!0,category:"people"},lips:{keywords:["mouth","kiss"],char:"\ud83d\udc44",fitzpatrick_scale:!1,category:"people"},tooth:{keywords:["teeth","dentist"],char:"\ud83e\uddb7",fitzpatrick_scale:!1,category:"people"},tongue:{keywords:["mouth","playful"],char:"\ud83d\udc45",fitzpatrick_scale:!1,category:"people"},ear:{keywords:["face","hear","sound","listen"],char:"\ud83d\udc42",fitzpatrick_scale:!0,category:"people"},nose:{keywords:["smell","sniff"],char:"\ud83d\udc43",fitzpatrick_scale:!0,category:"people"},eye:{keywords:["face","look","see","watch","stare"],char:"\ud83d\udc41",fitzpatrick_scale:!1,category:"people"},eyes:{keywords:["look","watch","stalk","peek","see"],char:"\ud83d\udc40",fitzpatrick_scale:!1,category:"people"},brain:{keywords:["smart","intelligent"],char:"\ud83e\udde0",fitzpatrick_scale:!1,category:"people"},bust_in_silhouette:{keywords:["user","person","human"],char:"\ud83d\udc64",fitzpatrick_scale:!1,category:"people"},busts_in_silhouette:{keywords:["user","person","human","group","team"],char:"\ud83d\udc65",fitzpatrick_scale:!1,category:"people"},speaking_head:{keywords:["user","person","human","sing","say","talk"],char:"\ud83d\udde3",fitzpatrick_scale:!1,category:"people"},baby:{keywords:["child","boy","girl","toddler"],char:"\ud83d\udc76",fitzpatrick_scale:!0,category:"people"},child:{keywords:["gender-neutral","young"],char:"\ud83e\uddd2",fitzpatrick_scale:!0,category:"people"},boy:{keywords:["man","male","guy","teenager"],char:"\ud83d\udc66",fitzpatrick_scale:!0,category:"people"},girl:{keywords:["female","woman","teenager"],char:"\ud83d\udc67",fitzpatrick_scale:!0,category:"people"},adult:{keywords:["gender-neutral","person"],char:"\ud83e\uddd1",fitzpatrick_scale:!0,category:"people"},man:{keywords:["mustache","father","dad","guy","classy","sir","moustache"],char:"\ud83d\udc68",fitzpatrick_scale:!0,category:"people"},woman:{keywords:["female","girls","lady"],char:"\ud83d\udc69",fitzpatrick_scale:!0,category:"people"},blonde_woman:{keywords:["woman","female","girl","blonde","person"],char:"\ud83d\udc71\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},blonde_man:{keywords:["man","male","boy","blonde","guy","person"],char:"\ud83d\udc71",fitzpatrick_scale:!0,category:"people"},bearded_person:{keywords:["person","bewhiskered"],char:"\ud83e\uddd4",fitzpatrick_scale:!0,category:"people"},older_adult:{keywords:["human","elder","senior","gender-neutral"],char:"\ud83e\uddd3",fitzpatrick_scale:!0,category:"people"},older_man:{keywords:["human","male","men","old","elder","senior"],char:"\ud83d\udc74",fitzpatrick_scale:!0,category:"people"},older_woman:{keywords:["human","female","women","lady","old","elder","senior"],char:"\ud83d\udc75",fitzpatrick_scale:!0,category:"people"},man_with_gua_pi_mao:{keywords:["male","boy","chinese"],char:"\ud83d\udc72",fitzpatrick_scale:!0,category:"people"},woman_with_headscarf:{keywords:["female","hijab","mantilla","tichel"],char:"\ud83e\uddd5",fitzpatrick_scale:!0,category:"people"},woman_with_turban:{keywords:["female","indian","hinduism","arabs","woman"],char:"\ud83d\udc73\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_with_turban:{keywords:["male","indian","hinduism","arabs"],char:"\ud83d\udc73",fitzpatrick_scale:!0,category:"people"},policewoman:{keywords:["woman","police","law","legal","enforcement","arrest","911","female"],char:"\ud83d\udc6e\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},policeman:{keywords:["man","police","law","legal","enforcement","arrest","911"],char:"\ud83d\udc6e",fitzpatrick_scale:!0,category:"people"},construction_worker_woman:{keywords:["female","human","wip","build","construction","worker","labor","woman"],char:"\ud83d\udc77\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},construction_worker_man:{keywords:["male","human","wip","guy","build","construction","worker","labor"],char:"\ud83d\udc77",fitzpatrick_scale:!0,category:"people"},guardswoman:{keywords:["uk","gb","british","female","royal","woman"],char:"\ud83d\udc82\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},guardsman:{keywords:["uk","gb","british","male","guy","royal"],char:"\ud83d\udc82",fitzpatrick_scale:!0,category:"people"},female_detective:{keywords:["human","spy","detective","female","woman"],char:"\ud83d\udd75\ufe0f\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},male_detective:{keywords:["human","spy","detective"],char:"\ud83d\udd75",fitzpatrick_scale:!0,category:"people"},woman_health_worker:{keywords:["doctor","nurse","therapist","healthcare","woman","human"],char:"\ud83d\udc69\u200d\u2695\ufe0f",fitzpatrick_scale:!0,category:"people"},man_health_worker:{keywords:["doctor","nurse","therapist","healthcare","man","human"],char:"\ud83d\udc68\u200d\u2695\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_farmer:{keywords:["rancher","gardener","woman","human"],char:"\ud83d\udc69\u200d\ud83c\udf3e",fitzpatrick_scale:!0,category:"people"},man_farmer:{keywords:["rancher","gardener","man","human"],char:"\ud83d\udc68\u200d\ud83c\udf3e",fitzpatrick_scale:!0,category:"people"},woman_cook:{keywords:["chef","woman","human"],char:"\ud83d\udc69\u200d\ud83c\udf73",fitzpatrick_scale:!0,category:"people"},man_cook:{keywords:["chef","man","human"],char:"\ud83d\udc68\u200d\ud83c\udf73",fitzpatrick_scale:!0,category:"people"},woman_student:{keywords:["graduate","woman","human"],char:"\ud83d\udc69\u200d\ud83c\udf93",fitzpatrick_scale:!0,category:"people"},man_student:{keywords:["graduate","man","human"],char:"\ud83d\udc68\u200d\ud83c\udf93",fitzpatrick_scale:!0,category:"people"},woman_singer:{keywords:["rockstar","entertainer","woman","human"],char:"\ud83d\udc69\u200d\ud83c\udfa4",fitzpatrick_scale:!0,category:"people"},man_singer:{keywords:["rockstar","entertainer","man","human"],char:"\ud83d\udc68\u200d\ud83c\udfa4",fitzpatrick_scale:!0,category:"people"},woman_teacher:{keywords:["instructor","professor","woman","human"],char:"\ud83d\udc69\u200d\ud83c\udfeb",fitzpatrick_scale:!0,category:"people"},man_teacher:{keywords:["instructor","professor","man","human"],char:"\ud83d\udc68\u200d\ud83c\udfeb",fitzpatrick_scale:!0,category:"people"},woman_factory_worker:{keywords:["assembly","industrial","woman","human"],char:"\ud83d\udc69\u200d\ud83c\udfed",fitzpatrick_scale:!0,category:"people"},man_factory_worker:{keywords:["assembly","industrial","man","human"],char:"\ud83d\udc68\u200d\ud83c\udfed",fitzpatrick_scale:!0,category:"people"},woman_technologist:{keywords:["coder","developer","engineer","programmer","software","woman","human","laptop","computer"],char:"\ud83d\udc69\u200d\ud83d\udcbb",fitzpatrick_scale:!0,category:"people"},man_technologist:{keywords:["coder","developer","engineer","programmer","software","man","human","laptop","computer"],char:"\ud83d\udc68\u200d\ud83d\udcbb",fitzpatrick_scale:!0,category:"people"},woman_office_worker:{keywords:["business","manager","woman","human"],char:"\ud83d\udc69\u200d\ud83d\udcbc",fitzpatrick_scale:!0,category:"people"},man_office_worker:{keywords:["business","manager","man","human"],char:"\ud83d\udc68\u200d\ud83d\udcbc",fitzpatrick_scale:!0,category:"people"},woman_mechanic:{keywords:["plumber","woman","human","wrench"],char:"\ud83d\udc69\u200d\ud83d\udd27",fitzpatrick_scale:!0,category:"people"},man_mechanic:{keywords:["plumber","man","human","wrench"],char:"\ud83d\udc68\u200d\ud83d\udd27",fitzpatrick_scale:!0,category:"people"},woman_scientist:{keywords:["biologist","chemist","engineer","physicist","woman","human"],char:"\ud83d\udc69\u200d\ud83d\udd2c",fitzpatrick_scale:!0,category:"people"},man_scientist:{keywords:["biologist","chemist","engineer","physicist","man","human"],char:"\ud83d\udc68\u200d\ud83d\udd2c",fitzpatrick_scale:!0,category:"people"},woman_artist:{keywords:["painter","woman","human"],char:"\ud83d\udc69\u200d\ud83c\udfa8",fitzpatrick_scale:!0,category:"people"},man_artist:{keywords:["painter","man","human"],char:"\ud83d\udc68\u200d\ud83c\udfa8",fitzpatrick_scale:!0,category:"people"},woman_firefighter:{keywords:["fireman","woman","human"],char:"\ud83d\udc69\u200d\ud83d\ude92",fitzpatrick_scale:!0,category:"people"},man_firefighter:{keywords:["fireman","man","human"],char:"\ud83d\udc68\u200d\ud83d\ude92",fitzpatrick_scale:!0,category:"people"},woman_pilot:{keywords:["aviator","plane","woman","human"],char:"\ud83d\udc69\u200d\u2708\ufe0f",fitzpatrick_scale:!0,category:"people"},man_pilot:{keywords:["aviator","plane","man","human"],char:"\ud83d\udc68\u200d\u2708\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_astronaut:{keywords:["space","rocket","woman","human"],char:"\ud83d\udc69\u200d\ud83d\ude80",fitzpatrick_scale:!0,category:"people"},man_astronaut:{keywords:["space","rocket","man","human"],char:"\ud83d\udc68\u200d\ud83d\ude80",fitzpatrick_scale:!0,category:"people"},woman_judge:{keywords:["justice","court","woman","human"],char:"\ud83d\udc69\u200d\u2696\ufe0f",fitzpatrick_scale:!0,category:"people"},man_judge:{keywords:["justice","court","man","human"],char:"\ud83d\udc68\u200d\u2696\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_superhero:{keywords:["woman","female","good","heroine","superpowers"],char:"\ud83e\uddb8\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_superhero:{keywords:["man","male","good","hero","superpowers"],char:"\ud83e\uddb8\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_supervillain:{keywords:["woman","female","evil","bad","criminal","heroine","superpowers"],char:"\ud83e\uddb9\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_supervillain:{keywords:["man","male","evil","bad","criminal","hero","superpowers"],char:"\ud83e\uddb9\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},mrs_claus:{keywords:["woman","female","xmas","mother christmas"],char:"\ud83e\udd36",fitzpatrick_scale:!0,category:"people"},santa:{keywords:["festival","man","male","xmas","father christmas"],char:"\ud83c\udf85",fitzpatrick_scale:!0,category:"people"},sorceress:{keywords:["woman","female","mage","witch"],char:"\ud83e\uddd9\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},wizard:{keywords:["man","male","mage","sorcerer"],char:"\ud83e\uddd9\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_elf:{keywords:["woman","female"],char:"\ud83e\udddd\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_elf:{keywords:["man","male"],char:"\ud83e\udddd\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_vampire:{keywords:["woman","female"],char:"\ud83e\udddb\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_vampire:{keywords:["man","male","dracula"],char:"\ud83e\udddb\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_zombie:{keywords:["woman","female","undead","walking dead"],char:"\ud83e\udddf\u200d\u2640\ufe0f",fitzpatrick_scale:!1,category:"people"},man_zombie:{keywords:["man","male","dracula","undead","walking dead"],char:"\ud83e\udddf\u200d\u2642\ufe0f",fitzpatrick_scale:!1,category:"people"},woman_genie:{keywords:["woman","female"],char:"\ud83e\uddde\u200d\u2640\ufe0f",fitzpatrick_scale:!1,category:"people"},man_genie:{keywords:["man","male"],char:"\ud83e\uddde\u200d\u2642\ufe0f",fitzpatrick_scale:!1,category:"people"},mermaid:{keywords:["woman","female","merwoman","ariel"],char:"\ud83e\udddc\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},merman:{keywords:["man","male","triton"],char:"\ud83e\udddc\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_fairy:{keywords:["woman","female"],char:"\ud83e\uddda\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_fairy:{keywords:["man","male"],char:"\ud83e\uddda\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},angel:{keywords:["heaven","wings","halo"],char:"\ud83d\udc7c",fitzpatrick_scale:!0,category:"people"},pregnant_woman:{keywords:["baby"],char:"\ud83e\udd30",fitzpatrick_scale:!0,category:"people"},breastfeeding:{keywords:["nursing","baby"],char:"\ud83e\udd31",fitzpatrick_scale:!0,category:"people"},princess:{keywords:["girl","woman","female","blond","crown","royal","queen"],char:"\ud83d\udc78",fitzpatrick_scale:!0,category:"people"},prince:{keywords:["boy","man","male","crown","royal","king"],char:"\ud83e\udd34",fitzpatrick_scale:!0,category:"people"},bride_with_veil:{keywords:["couple","marriage","wedding","woman","bride"],char:"\ud83d\udc70",fitzpatrick_scale:!0,category:"people"},man_in_tuxedo:{keywords:["couple","marriage","wedding","groom"],char:"\ud83e\udd35",fitzpatrick_scale:!0,category:"people"},running_woman:{keywords:["woman","walking","exercise","race","running","female"],char:"\ud83c\udfc3\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},running_man:{keywords:["man","walking","exercise","race","running"],char:"\ud83c\udfc3",fitzpatrick_scale:!0,category:"people"},walking_woman:{keywords:["human","feet","steps","woman","female"],char:"\ud83d\udeb6\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},walking_man:{keywords:["human","feet","steps"],char:"\ud83d\udeb6",fitzpatrick_scale:!0,category:"people"},dancer:{keywords:["female","girl","woman","fun"],char:"\ud83d\udc83",fitzpatrick_scale:!0,category:"people"},man_dancing:{keywords:["male","boy","fun","dancer"],char:"\ud83d\udd7a",fitzpatrick_scale:!0,category:"people"},dancing_women:{keywords:["female","bunny","women","girls"],char:"\ud83d\udc6f",fitzpatrick_scale:!1,category:"people"},dancing_men:{keywords:["male","bunny","men","boys"],char:"\ud83d\udc6f\u200d\u2642\ufe0f",fitzpatrick_scale:!1,category:"people"},couple:{keywords:["pair","people","human","love","date","dating","like","affection","valentines","marriage"],char:"\ud83d\udc6b",fitzpatrick_scale:!1,category:"people"},two_men_holding_hands:{keywords:["pair","couple","love","like","bromance","friendship","people","human"],char:"\ud83d\udc6c",fitzpatrick_scale:!1,category:"people"},two_women_holding_hands:{keywords:["pair","friendship","couple","love","like","female","people","human"],char:"\ud83d\udc6d",fitzpatrick_scale:!1,category:"people"},bowing_woman:{keywords:["woman","female","girl"],char:"\ud83d\ude47\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},bowing_man:{keywords:["man","male","boy"],char:"\ud83d\ude47",fitzpatrick_scale:!0,category:"people"},man_facepalming:{keywords:["man","male","boy","disbelief"],char:"\ud83e\udd26\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_facepalming:{keywords:["woman","female","girl","disbelief"],char:"\ud83e\udd26\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_shrugging:{keywords:["woman","female","girl","confused","indifferent","doubt"],char:"\ud83e\udd37",fitzpatrick_scale:!0,category:"people"},man_shrugging:{keywords:["man","male","boy","confused","indifferent","doubt"],char:"\ud83e\udd37\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},tipping_hand_woman:{keywords:["female","girl","woman","human","information"],char:"\ud83d\udc81",fitzpatrick_scale:!0,category:"people"},tipping_hand_man:{keywords:["male","boy","man","human","information"],char:"\ud83d\udc81\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},no_good_woman:{keywords:["female","girl","woman","nope"],char:"\ud83d\ude45",fitzpatrick_scale:!0,category:"people"},no_good_man:{keywords:["male","boy","man","nope"],char:"\ud83d\ude45\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},ok_woman:{keywords:["women","girl","female","pink","human","woman"],char:"\ud83d\ude46",fitzpatrick_scale:!0,category:"people"},ok_man:{keywords:["men","boy","male","blue","human","man"],char:"\ud83d\ude46\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},raising_hand_woman:{keywords:["female","girl","woman"],char:"\ud83d\ude4b",fitzpatrick_scale:!0,category:"people"},raising_hand_man:{keywords:["male","boy","man"],char:"\ud83d\ude4b\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},pouting_woman:{keywords:["female","girl","woman"],char:"\ud83d\ude4e",fitzpatrick_scale:!0,category:"people"},pouting_man:{keywords:["male","boy","man"],char:"\ud83d\ude4e\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},frowning_woman:{keywords:["female","girl","woman","sad","depressed","discouraged","unhappy"],char:"\ud83d\ude4d",fitzpatrick_scale:!0,category:"people"},frowning_man:{keywords:["male","boy","man","sad","depressed","discouraged","unhappy"],char:"\ud83d\ude4d\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},haircut_woman:{keywords:["female","girl","woman"],char:"\ud83d\udc87",fitzpatrick_scale:!0,category:"people"},haircut_man:{keywords:["male","boy","man"],char:"\ud83d\udc87\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},massage_woman:{keywords:["female","girl","woman","head"],char:"\ud83d\udc86",fitzpatrick_scale:!0,category:"people"},massage_man:{keywords:["male","boy","man","head"],char:"\ud83d\udc86\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_in_steamy_room:{keywords:["female","woman","spa","steamroom","sauna"],char:"\ud83e\uddd6\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_in_steamy_room:{keywords:["male","man","spa","steamroom","sauna"],char:"\ud83e\uddd6\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},couple_with_heart_woman_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:"\ud83d\udc91",fitzpatrick_scale:!1,category:"people"},couple_with_heart_woman_woman:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:"\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc69",fitzpatrick_scale:!1,category:"people"},couple_with_heart_man_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:"\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68",fitzpatrick_scale:!1,category:"people"},couplekiss_man_woman:{keywords:["pair","valentines","love","like","dating","marriage"],char:"\ud83d\udc8f",fitzpatrick_scale:!1,category:"people"},couplekiss_woman_woman:{keywords:["pair","valentines","love","like","dating","marriage"],char:"\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69",fitzpatrick_scale:!1,category:"people"},couplekiss_man_man:{keywords:["pair","valentines","love","like","dating","marriage"],char:"\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68",fitzpatrick_scale:!1,category:"people"},family_man_woman_boy:{keywords:["home","parents","child","mom","dad","father","mother","people","human"],char:"\ud83d\udc6a",fitzpatrick_scale:!1,category:"people"},family_man_woman_girl:{keywords:["home","parents","people","human","child"],char:"\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_man_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_woman_boy_boy:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_woman_girl_girl:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_woman_woman_boy:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_woman_boy_boy:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl_girl:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_man_man_boy:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_man_girl:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_man_man_girl_boy:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_man_boy_boy:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_man_girl_girl:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_woman_boy:{keywords:["home","parent","people","human","child"],char:"\ud83d\udc69\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_girl:{keywords:["home","parent","people","human","child"],char:"\ud83d\udc69\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_woman_girl_boy:{keywords:["home","parent","people","human","children"],char:"\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_boy_boy:{keywords:["home","parent","people","human","children"],char:"\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_girl_girl:{keywords:["home","parent","people","human","children"],char:"\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_man_boy:{keywords:["home","parent","people","human","child"],char:"\ud83d\udc68\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_girl:{keywords:["home","parent","people","human","child"],char:"\ud83d\udc68\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_man_girl_boy:{keywords:["home","parent","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_boy_boy:{keywords:["home","parent","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_girl_girl:{keywords:["home","parent","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},yarn:{keywords:["ball","crochet","knit"],char:"\ud83e\uddf6",fitzpatrick_scale:!1,category:"people"},thread:{keywords:["needle","sewing","spool","string"],char:"\ud83e\uddf5",fitzpatrick_scale:!1,category:"people"},coat:{keywords:["jacket"],char:"\ud83e\udde5",fitzpatrick_scale:!1,category:"people"},labcoat:{keywords:["doctor","experiment","scientist","chemist"],char:"\ud83e\udd7c",fitzpatrick_scale:!1,category:"people"},womans_clothes:{keywords:["fashion","shopping_bags","female"],char:"\ud83d\udc5a",fitzpatrick_scale:!1,category:"people"},tshirt:{keywords:["fashion","cloth","casual","shirt","tee"],char:"\ud83d\udc55",fitzpatrick_scale:!1,category:"people"},jeans:{keywords:["fashion","shopping"],char:"\ud83d\udc56",fitzpatrick_scale:!1,category:"people"},necktie:{keywords:["shirt","suitup","formal","fashion","cloth","business"],char:"\ud83d\udc54",fitzpatrick_scale:!1,category:"people"},dress:{keywords:["clothes","fashion","shopping"],char:"\ud83d\udc57",fitzpatrick_scale:!1,category:"people"},bikini:{keywords:["swimming","female","woman","girl","fashion","beach","summer"],char:"\ud83d\udc59",fitzpatrick_scale:!1,category:"people"},kimono:{keywords:["dress","fashion","women","female","japanese"],char:"\ud83d\udc58",fitzpatrick_scale:!1,category:"people"},lipstick:{keywords:["female","girl","fashion","woman"],char:"\ud83d\udc84",fitzpatrick_scale:!1,category:"people"},kiss:{keywords:["face","lips","love","like","affection","valentines"],char:"\ud83d\udc8b",fitzpatrick_scale:!1,category:"people"},footprints:{keywords:["feet","tracking","walking","beach"],char:"\ud83d\udc63",fitzpatrick_scale:!1,category:"people"},flat_shoe:{keywords:["ballet","slip-on","slipper"],char:"\ud83e\udd7f",fitzpatrick_scale:!1,category:"people"},high_heel:{keywords:["fashion","shoes","female","pumps","stiletto"],char:"\ud83d\udc60",fitzpatrick_scale:!1,category:"people"},sandal:{keywords:["shoes","fashion","flip flops"],char:"\ud83d\udc61",fitzpatrick_scale:!1,category:"people"},boot:{keywords:["shoes","fashion"],char:"\ud83d\udc62",fitzpatrick_scale:!1,category:"people"},mans_shoe:{keywords:["fashion","male"],char:"\ud83d\udc5e",fitzpatrick_scale:!1,category:"people"},athletic_shoe:{keywords:["shoes","sports","sneakers"],char:"\ud83d\udc5f",fitzpatrick_scale:!1,category:"people"},hiking_boot:{keywords:["backpacking","camping","hiking"],char:"\ud83e\udd7e",fitzpatrick_scale:!1,category:"people"},socks:{keywords:["stockings","clothes"],char:"\ud83e\udde6",fitzpatrick_scale:!1,category:"people"},gloves:{keywords:["hands","winter","clothes"],char:"\ud83e\udde4",fitzpatrick_scale:!1,category:"people"},scarf:{keywords:["neck","winter","clothes"],char:"\ud83e\udde3",fitzpatrick_scale:!1,category:"people"},womans_hat:{keywords:["fashion","accessories","female","lady","spring"],char:"\ud83d\udc52",fitzpatrick_scale:!1,category:"people"},tophat:{keywords:["magic","gentleman","classy","circus"],char:"\ud83c\udfa9",fitzpatrick_scale:!1,category:"people"},billed_hat:{keywords:["cap","baseball"],char:"\ud83e\udde2",fitzpatrick_scale:!1,category:"people"},rescue_worker_helmet:{keywords:["construction","build"],char:"\u26d1",fitzpatrick_scale:!1,category:"people"},mortar_board:{keywords:["school","college","degree","university","graduation","cap","hat","legal","learn","education"],char:"\ud83c\udf93",fitzpatrick_scale:!1,category:"people"},crown:{keywords:["king","kod","leader","royalty","lord"],char:"\ud83d\udc51",fitzpatrick_scale:!1,category:"people"},school_satchel:{keywords:["student","education","bag","backpack"],char:"\ud83c\udf92",fitzpatrick_scale:!1,category:"people"},luggage:{keywords:["packing","travel"],char:"\ud83e\uddf3",fitzpatrick_scale:!1,category:"people"},pouch:{keywords:["bag","accessories","shopping"],char:"\ud83d\udc5d",fitzpatrick_scale:!1,category:"people"},purse:{keywords:["fashion","accessories","money","sales","shopping"],char:"\ud83d\udc5b",fitzpatrick_scale:!1,category:"people"},handbag:{keywords:["fashion","accessory","accessories","shopping"],char:"\ud83d\udc5c",fitzpatrick_scale:!1,category:"people"},briefcase:{keywords:["business","documents","work","law","legal","job","career"],char:"\ud83d\udcbc",fitzpatrick_scale:!1,category:"people"},eyeglasses:{keywords:["fashion","accessories","eyesight","nerdy","dork","geek"],char:"\ud83d\udc53",fitzpatrick_scale:!1,category:"people"},dark_sunglasses:{keywords:["face","cool","accessories"],char:"\ud83d\udd76",fitzpatrick_scale:!1,category:"people"},goggles:{keywords:["eyes","protection","safety"],char:"\ud83e\udd7d",fitzpatrick_scale:!1,category:"people"},ring:{keywords:["wedding","propose","marriage","valentines","diamond","fashion","jewelry","gem","engagement"],char:"\ud83d\udc8d",fitzpatrick_scale:!1,category:"people"},closed_umbrella:{keywords:["weather","rain","drizzle"],char:"\ud83c\udf02",fitzpatrick_scale:!1,category:"people"},dog:{keywords:["animal","friend","nature","woof","puppy","pet","faithful"],char:"\ud83d\udc36",fitzpatrick_scale:!1,category:"animals_and_nature"},cat:{keywords:["animal","meow","nature","pet","kitten"],char:"\ud83d\udc31",fitzpatrick_scale:!1,category:"animals_and_nature"},mouse:{keywords:["animal","nature","cheese_wedge","rodent"],char:"\ud83d\udc2d",fitzpatrick_scale:!1,category:"animals_and_nature"},hamster:{keywords:["animal","nature"],char:"\ud83d\udc39",fitzpatrick_scale:!1,category:"animals_and_nature"},rabbit:{keywords:["animal","nature","pet","spring","magic","bunny"],char:"\ud83d\udc30",fitzpatrick_scale:!1,category:"animals_and_nature"},fox_face:{keywords:["animal","nature","face"],char:"\ud83e\udd8a",fitzpatrick_scale:!1,category:"animals_and_nature"},bear:{keywords:["animal","nature","wild"],char:"\ud83d\udc3b",fitzpatrick_scale:!1,category:"animals_and_nature"},panda_face:{keywords:["animal","nature","panda"],char:"\ud83d\udc3c",fitzpatrick_scale:!1,category:"animals_and_nature"},koala:{keywords:["animal","nature"],char:"\ud83d\udc28",fitzpatrick_scale:!1,category:"animals_and_nature"},tiger:{keywords:["animal","cat","danger","wild","nature","roar"],char:"\ud83d\udc2f",fitzpatrick_scale:!1,category:"animals_and_nature"},lion:{keywords:["animal","nature"],char:"\ud83e\udd81",fitzpatrick_scale:!1,category:"animals_and_nature"},cow:{keywords:["beef","ox","animal","nature","moo","milk"],char:"\ud83d\udc2e",fitzpatrick_scale:!1,category:"animals_and_nature"},pig:{keywords:["animal","oink","nature"],char:"\ud83d\udc37",fitzpatrick_scale:!1,category:"animals_and_nature"},pig_nose:{keywords:["animal","oink"],char:"\ud83d\udc3d",fitzpatrick_scale:!1,category:"animals_and_nature"},frog:{keywords:["animal","nature","croak","toad"],char:"\ud83d\udc38",fitzpatrick_scale:!1,category:"animals_and_nature"},squid:{keywords:["animal","nature","ocean","sea"],char:"\ud83e\udd91",fitzpatrick_scale:!1,category:"animals_and_nature"},octopus:{keywords:["animal","creature","ocean","sea","nature","beach"],char:"\ud83d\udc19",fitzpatrick_scale:!1,category:"animals_and_nature"},shrimp:{keywords:["animal","ocean","nature","seafood"],char:"\ud83e\udd90",fitzpatrick_scale:!1,category:"animals_and_nature"},monkey_face:{keywords:["animal","nature","circus"],char:"\ud83d\udc35",fitzpatrick_scale:!1,category:"animals_and_nature"},gorilla:{keywords:["animal","nature","circus"],char:"\ud83e\udd8d",fitzpatrick_scale:!1,category:"animals_and_nature"},see_no_evil:{keywords:["monkey","animal","nature","haha"],char:"\ud83d\ude48",fitzpatrick_scale:!1,category:"animals_and_nature"},hear_no_evil:{keywords:["animal","monkey","nature"],char:"\ud83d\ude49",fitzpatrick_scale:!1,category:"animals_and_nature"},speak_no_evil:{keywords:["monkey","animal","nature","omg"],char:"\ud83d\ude4a",fitzpatrick_scale:!1,category:"animals_and_nature"},monkey:{keywords:["animal","nature","banana","circus"],char:"\ud83d\udc12",fitzpatrick_scale:!1,category:"animals_and_nature"},chicken:{keywords:["animal","cluck","nature","bird"],char:"\ud83d\udc14",fitzpatrick_scale:!1,category:"animals_and_nature"},penguin:{keywords:["animal","nature"],char:"\ud83d\udc27",fitzpatrick_scale:!1,category:"animals_and_nature"},bird:{keywords:["animal","nature","fly","tweet","spring"],char:"\ud83d\udc26",fitzpatrick_scale:!1,category:"animals_and_nature"},baby_chick:{keywords:["animal","chicken","bird"],char:"\ud83d\udc24",fitzpatrick_scale:!1,category:"animals_and_nature"},hatching_chick:{keywords:["animal","chicken","egg","born","baby","bird"],char:"\ud83d\udc23",fitzpatrick_scale:!1,category:"animals_and_nature"},hatched_chick:{keywords:["animal","chicken","baby","bird"],char:"\ud83d\udc25",fitzpatrick_scale:!1,category:"animals_and_nature"},duck:{keywords:["animal","nature","bird","mallard"],char:"\ud83e\udd86",fitzpatrick_scale:!1,category:"animals_and_nature"},eagle:{keywords:["animal","nature","bird"],char:"\ud83e\udd85",fitzpatrick_scale:!1,category:"animals_and_nature"},owl:{keywords:["animal","nature","bird","hoot"],char:"\ud83e\udd89",fitzpatrick_scale:!1,category:"animals_and_nature"},bat:{keywords:["animal","nature","blind","vampire"],char:"\ud83e\udd87",fitzpatrick_scale:!1,category:"animals_and_nature"},wolf:{keywords:["animal","nature","wild"],char:"\ud83d\udc3a",fitzpatrick_scale:!1,category:"animals_and_nature"},boar:{keywords:["animal","nature"],char:"\ud83d\udc17",fitzpatrick_scale:!1,category:"animals_and_nature"},horse:{keywords:["animal","brown","nature"],char:"\ud83d\udc34",fitzpatrick_scale:!1,category:"animals_and_nature"},unicorn:{keywords:["animal","nature","mystical"],char:"\ud83e\udd84",fitzpatrick_scale:!1,category:"animals_and_nature"},honeybee:{keywords:["animal","insect","nature","bug","spring","honey"],char:"\ud83d\udc1d",fitzpatrick_scale:!1,category:"animals_and_nature"},bug:{keywords:["animal","insect","nature","worm"],char:"\ud83d\udc1b",fitzpatrick_scale:!1,category:"animals_and_nature"},butterfly:{keywords:["animal","insect","nature","caterpillar"],char:"\ud83e\udd8b",fitzpatrick_scale:!1,category:"animals_and_nature"},snail:{keywords:["slow","animal","shell"],char:"\ud83d\udc0c",fitzpatrick_scale:!1,category:"animals_and_nature"},beetle:{keywords:["animal","insect","nature","ladybug"],char:"\ud83d\udc1e",fitzpatrick_scale:!1,category:"animals_and_nature"},ant:{keywords:["animal","insect","nature","bug"],char:"\ud83d\udc1c",fitzpatrick_scale:!1,category:"animals_and_nature"},grasshopper:{keywords:["animal","cricket","chirp"],char:"\ud83e\udd97",fitzpatrick_scale:!1,category:"animals_and_nature"},spider:{keywords:["animal","arachnid"],char:"\ud83d\udd77",fitzpatrick_scale:!1,category:"animals_and_nature"},scorpion:{keywords:["animal","arachnid"],char:"\ud83e\udd82",fitzpatrick_scale:!1,category:"animals_and_nature"},crab:{keywords:["animal","crustacean"],char:"\ud83e\udd80",fitzpatrick_scale:!1,category:"animals_and_nature"},snake:{keywords:["animal","evil","nature","hiss","python"],char:"\ud83d\udc0d",fitzpatrick_scale:!1,category:"animals_and_nature"},lizard:{keywords:["animal","nature","reptile"],char:"\ud83e\udd8e",fitzpatrick_scale:!1,category:"animals_and_nature"},"t-rex":{keywords:["animal","nature","dinosaur","tyrannosaurus","extinct"],char:"\ud83e\udd96",fitzpatrick_scale:!1,category:"animals_and_nature"},sauropod:{keywords:["animal","nature","dinosaur","brachiosaurus","brontosaurus","diplodocus","extinct"],char:"\ud83e\udd95",fitzpatrick_scale:!1,category:"animals_and_nature"},turtle:{keywords:["animal","slow","nature","tortoise"],char:"\ud83d\udc22",fitzpatrick_scale:!1,category:"animals_and_nature"},tropical_fish:{keywords:["animal","swim","ocean","beach","nemo"],char:"\ud83d\udc20",fitzpatrick_scale:!1,category:"animals_and_nature"},fish:{keywords:["animal","food","nature"],char:"\ud83d\udc1f",fitzpatrick_scale:!1,category:"animals_and_nature"},blowfish:{keywords:["animal","nature","food","sea","ocean"],char:"\ud83d\udc21",fitzpatrick_scale:!1,category:"animals_and_nature"},dolphin:{keywords:["animal","nature","fish","sea","ocean","flipper","fins","beach"],char:"\ud83d\udc2c",fitzpatrick_scale:!1,category:"animals_and_nature"},shark:{keywords:["animal","nature","fish","sea","ocean","jaws","fins","beach"],char:"\ud83e\udd88",fitzpatrick_scale:!1,category:"animals_and_nature"},whale:{keywords:["animal","nature","sea","ocean"],char:"\ud83d\udc33",fitzpatrick_scale:!1,category:"animals_and_nature"},whale2:{keywords:["animal","nature","sea","ocean"],char:"\ud83d\udc0b",fitzpatrick_scale:!1,category:"animals_and_nature"},crocodile:{keywords:["animal","nature","reptile","lizard","alligator"],char:"\ud83d\udc0a",fitzpatrick_scale:!1,category:"animals_and_nature"},leopard:{keywords:["animal","nature"],char:"\ud83d\udc06",fitzpatrick_scale:!1,category:"animals_and_nature"},zebra:{keywords:["animal","nature","stripes","safari"],char:"\ud83e\udd93",fitzpatrick_scale:!1,category:"animals_and_nature"},tiger2:{keywords:["animal","nature","roar"],char:"\ud83d\udc05",fitzpatrick_scale:!1,category:"animals_and_nature"},water_buffalo:{keywords:["animal","nature","ox","cow"],char:"\ud83d\udc03",fitzpatrick_scale:!1,category:"animals_and_nature"},ox:{keywords:["animal","cow","beef"],char:"\ud83d\udc02",fitzpatrick_scale:!1,category:"animals_and_nature"},cow2:{keywords:["beef","ox","animal","nature","moo","milk"],char:"\ud83d\udc04",fitzpatrick_scale:!1,category:"animals_and_nature"},deer:{keywords:["animal","nature","horns","venison"],char:"\ud83e\udd8c",fitzpatrick_scale:!1,category:"animals_and_nature"},dromedary_camel:{keywords:["animal","hot","desert","hump"],char:"\ud83d\udc2a",fitzpatrick_scale:!1,category:"animals_and_nature"},camel:{keywords:["animal","nature","hot","desert","hump"],char:"\ud83d\udc2b",fitzpatrick_scale:!1,category:"animals_and_nature"},giraffe:{keywords:["animal","nature","spots","safari"],char:"\ud83e\udd92",fitzpatrick_scale:!1,category:"animals_and_nature"},elephant:{keywords:["animal","nature","nose","th","circus"],char:"\ud83d\udc18",fitzpatrick_scale:!1,category:"animals_and_nature"},rhinoceros:{keywords:["animal","nature","horn"],char:"\ud83e\udd8f",fitzpatrick_scale:!1,category:"animals_and_nature"},goat:{keywords:["animal","nature"],char:"\ud83d\udc10",fitzpatrick_scale:!1,category:"animals_and_nature"},ram:{keywords:["animal","sheep","nature"],char:"\ud83d\udc0f",fitzpatrick_scale:!1,category:"animals_and_nature"},sheep:{keywords:["animal","nature","wool","shipit"],char:"\ud83d\udc11",fitzpatrick_scale:!1,category:"animals_and_nature"},racehorse:{keywords:["animal","gamble","luck"],char:"\ud83d\udc0e",fitzpatrick_scale:!1,category:"animals_and_nature"},pig2:{keywords:["animal","nature"],char:"\ud83d\udc16",fitzpatrick_scale:!1,category:"animals_and_nature"},rat:{keywords:["animal","mouse","rodent"],char:"\ud83d\udc00",fitzpatrick_scale:!1,category:"animals_and_nature"},mouse2:{keywords:["animal","nature","rodent"],char:"\ud83d\udc01",fitzpatrick_scale:!1,category:"animals_and_nature"},rooster:{keywords:["animal","nature","chicken"],char:"\ud83d\udc13",fitzpatrick_scale:!1,category:"animals_and_nature"},turkey:{keywords:["animal","bird"],char:"\ud83e\udd83",fitzpatrick_scale:!1,category:"animals_and_nature"},dove:{keywords:["animal","bird"],char:"\ud83d\udd4a",fitzpatrick_scale:!1,category:"animals_and_nature"},dog2:{keywords:["animal","nature","friend","doge","pet","faithful"],char:"\ud83d\udc15",fitzpatrick_scale:!1,category:"animals_and_nature"},poodle:{keywords:["dog","animal","101","nature","pet"],char:"\ud83d\udc29",fitzpatrick_scale:!1,category:"animals_and_nature"},cat2:{keywords:["animal","meow","pet","cats"],char:"\ud83d\udc08",fitzpatrick_scale:!1,category:"animals_and_nature"},rabbit2:{keywords:["animal","nature","pet","magic","spring"],char:"\ud83d\udc07",fitzpatrick_scale:!1,category:"animals_and_nature"},chipmunk:{keywords:["animal","nature","rodent","squirrel"],char:"\ud83d\udc3f",fitzpatrick_scale:!1,category:"animals_and_nature"},hedgehog:{keywords:["animal","nature","spiny"],char:"\ud83e\udd94",fitzpatrick_scale:!1,category:"animals_and_nature"},raccoon:{keywords:["animal","nature"],char:"\ud83e\udd9d",fitzpatrick_scale:!1,category:"animals_and_nature"},llama:{keywords:["animal","nature","alpaca"],char:"\ud83e\udd99",fitzpatrick_scale:!1,category:"animals_and_nature"},hippopotamus:{keywords:["animal","nature"],char:"\ud83e\udd9b",fitzpatrick_scale:!1,category:"animals_and_nature"},kangaroo:{keywords:["animal","nature","australia","joey","hop","marsupial"],char:"\ud83e\udd98",fitzpatrick_scale:!1,category:"animals_and_nature"},badger:{keywords:["animal","nature","honey"],char:"\ud83e\udda1",fitzpatrick_scale:!1,category:"animals_and_nature"},swan:{keywords:["animal","nature","bird"],char:"\ud83e\udda2",fitzpatrick_scale:!1,category:"animals_and_nature"},peacock:{keywords:["animal","nature","peahen","bird"],char:"\ud83e\udd9a",fitzpatrick_scale:!1,category:"animals_and_nature"},parrot:{keywords:["animal","nature","bird","pirate","talk"],char:"\ud83e\udd9c",fitzpatrick_scale:!1,category:"animals_and_nature"},lobster:{keywords:["animal","nature","bisque","claws","seafood"],char:"\ud83e\udd9e",fitzpatrick_scale:!1,category:"animals_and_nature"},mosquito:{keywords:["animal","nature","insect","malaria"],char:"\ud83e\udd9f",fitzpatrick_scale:!1,category:"animals_and_nature"},paw_prints:{keywords:["animal","tracking","footprints","dog","cat","pet","feet"],char:"\ud83d\udc3e",fitzpatrick_scale:!1,category:"animals_and_nature"},dragon:{keywords:["animal","myth","nature","chinese","green"],char:"\ud83d\udc09",fitzpatrick_scale:!1,category:"animals_and_nature"},dragon_face:{keywords:["animal","myth","nature","chinese","green"],char:"\ud83d\udc32",fitzpatrick_scale:!1,category:"animals_and_nature"},cactus:{keywords:["vegetable","plant","nature"],char:"\ud83c\udf35",fitzpatrick_scale:!1,category:"animals_and_nature"},christmas_tree:{keywords:["festival","vacation","december","xmas","celebration"],char:"\ud83c\udf84",fitzpatrick_scale:!1,category:"animals_and_nature"},evergreen_tree:{keywords:["plant","nature"],char:"\ud83c\udf32",fitzpatrick_scale:!1,category:"animals_and_nature"},deciduous_tree:{keywords:["plant","nature"],char:"\ud83c\udf33",fitzpatrick_scale:!1,category:"animals_and_nature"},palm_tree:{keywords:["plant","vegetable","nature","summer","beach","mojito","tropical"],char:"\ud83c\udf34",fitzpatrick_scale:!1,category:"animals_and_nature"},seedling:{keywords:["plant","nature","grass","lawn","spring"],char:"\ud83c\udf31",fitzpatrick_scale:!1,category:"animals_and_nature"},herb:{keywords:["vegetable","plant","medicine","weed","grass","lawn"],char:"\ud83c\udf3f",fitzpatrick_scale:!1,category:"animals_and_nature"},shamrock:{keywords:["vegetable","plant","nature","irish","clover"],char:"\u2618",fitzpatrick_scale:!1,category:"animals_and_nature"},four_leaf_clover:{keywords:["vegetable","plant","nature","lucky","irish"],char:"\ud83c\udf40",fitzpatrick_scale:!1,category:"animals_and_nature"},bamboo:{keywords:["plant","nature","vegetable","panda","pine_decoration"],char:"\ud83c\udf8d",fitzpatrick_scale:!1,category:"animals_and_nature"},tanabata_tree:{keywords:["plant","nature","branch","summer"],char:"\ud83c\udf8b",fitzpatrick_scale:!1,category:"animals_and_nature"},leaves:{keywords:["nature","plant","tree","vegetable","grass","lawn","spring"],char:"\ud83c\udf43",fitzpatrick_scale:!1,category:"animals_and_nature"},fallen_leaf:{keywords:["nature","plant","vegetable","leaves"],char:"\ud83c\udf42",fitzpatrick_scale:!1,category:"animals_and_nature"},maple_leaf:{keywords:["nature","plant","vegetable","ca","fall"],char:"\ud83c\udf41",fitzpatrick_scale:!1,category:"animals_and_nature"},ear_of_rice:{keywords:["nature","plant"],char:"\ud83c\udf3e",fitzpatrick_scale:!1,category:"animals_and_nature"},hibiscus:{keywords:["plant","vegetable","flowers","beach"],char:"\ud83c\udf3a",fitzpatrick_scale:!1,category:"animals_and_nature"},sunflower:{keywords:["nature","plant","fall"],char:"\ud83c\udf3b",fitzpatrick_scale:!1,category:"animals_and_nature"},rose:{keywords:["flowers","valentines","love","spring"],char:"\ud83c\udf39",fitzpatrick_scale:!1,category:"animals_and_nature"},wilted_flower:{keywords:["plant","nature","flower"],char:"\ud83e\udd40",fitzpatrick_scale:!1,category:"animals_and_nature"},tulip:{keywords:["flowers","plant","nature","summer","spring"],char:"\ud83c\udf37",fitzpatrick_scale:!1,category:"animals_and_nature"},blossom:{keywords:["nature","flowers","yellow"],char:"\ud83c\udf3c",fitzpatrick_scale:!1,category:"animals_and_nature"},cherry_blossom:{keywords:["nature","plant","spring","flower"],char:"\ud83c\udf38",fitzpatrick_scale:!1,category:"animals_and_nature"},bouquet:{keywords:["flowers","nature","spring"],char:"\ud83d\udc90",fitzpatrick_scale:!1,category:"animals_and_nature"},mushroom:{keywords:["plant","vegetable"],char:"\ud83c\udf44",fitzpatrick_scale:!1,category:"animals_and_nature"},chestnut:{keywords:["food","squirrel"],char:"\ud83c\udf30",fitzpatrick_scale:!1,category:"animals_and_nature"},jack_o_lantern:{keywords:["halloween","light","pumpkin","creepy","fall"],char:"\ud83c\udf83",fitzpatrick_scale:!1,category:"animals_and_nature"},shell:{keywords:["nature","sea","beach"],char:"\ud83d\udc1a",fitzpatrick_scale:!1,category:"animals_and_nature"},spider_web:{keywords:["animal","insect","arachnid","silk"],char:"\ud83d\udd78",fitzpatrick_scale:!1,category:"animals_and_nature"},earth_americas:{keywords:["globe","world","USA","international"],char:"\ud83c\udf0e",fitzpatrick_scale:!1,category:"animals_and_nature"},earth_africa:{keywords:["globe","world","international"],char:"\ud83c\udf0d",fitzpatrick_scale:!1,category:"animals_and_nature"},earth_asia:{keywords:["globe","world","east","international"],char:"\ud83c\udf0f",fitzpatrick_scale:!1,category:"animals_and_nature"},full_moon:{keywords:["nature","yellow","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf15",fitzpatrick_scale:!1,category:"animals_and_nature"},waning_gibbous_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep","waxing_gibbous_moon"],char:"\ud83c\udf16",fitzpatrick_scale:!1,category:"animals_and_nature"},last_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf17",fitzpatrick_scale:!1,category:"animals_and_nature"},waning_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf18",fitzpatrick_scale:!1,category:"animals_and_nature"},new_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf11",fitzpatrick_scale:!1,category:"animals_and_nature"},waxing_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf12",fitzpatrick_scale:!1,category:"animals_and_nature"},first_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf13",fitzpatrick_scale:!1,category:"animals_and_nature"},waxing_gibbous_moon:{keywords:["nature","night","sky","gray","twilight","planet","space","evening","sleep"],char:"\ud83c\udf14",fitzpatrick_scale:!1,category:"animals_and_nature"},new_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf1a",fitzpatrick_scale:!1,category:"animals_and_nature"},full_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf1d",fitzpatrick_scale:!1,category:"animals_and_nature"},first_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf1b",fitzpatrick_scale:!1,category:"animals_and_nature"},last_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf1c",fitzpatrick_scale:!1,category:"animals_and_nature"},sun_with_face:{keywords:["nature","morning","sky"],char:"\ud83c\udf1e",fitzpatrick_scale:!1,category:"animals_and_nature"},crescent_moon:{keywords:["night","sleep","sky","evening","magic"],char:"\ud83c\udf19",fitzpatrick_scale:!1,category:"animals_and_nature"},star:{keywords:["night","yellow"],char:"\u2b50",fitzpatrick_scale:!1,category:"animals_and_nature"},star2:{keywords:["night","sparkle","awesome","good","magic"],char:"\ud83c\udf1f",fitzpatrick_scale:!1,category:"animals_and_nature"},dizzy:{keywords:["star","sparkle","shoot","magic"],char:"\ud83d\udcab",fitzpatrick_scale:!1,category:"animals_and_nature"},sparkles:{keywords:["stars","shine","shiny","cool","awesome","good","magic"],char:"\u2728",fitzpatrick_scale:!1,category:"animals_and_nature"},comet:{keywords:["space"],char:"\u2604",fitzpatrick_scale:!1,category:"animals_and_nature"},sunny:{keywords:["weather","nature","brightness","summer","beach","spring"],char:"\u2600\ufe0f",fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_small_cloud:{keywords:["weather"],char:"\ud83c\udf24",fitzpatrick_scale:!1,category:"animals_and_nature"},partly_sunny:{keywords:["weather","nature","cloudy","morning","fall","spring"],char:"\u26c5",fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_large_cloud:{keywords:["weather"],char:"\ud83c\udf25",fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_rain_cloud:{keywords:["weather"],char:"\ud83c\udf26",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud:{keywords:["weather","sky"],char:"\u2601\ufe0f",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_rain:{keywords:["weather"],char:"\ud83c\udf27",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_lightning_and_rain:{keywords:["weather","lightning"],char:"\u26c8",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_lightning:{keywords:["weather","thunder"],char:"\ud83c\udf29",fitzpatrick_scale:!1,category:"animals_and_nature"},zap:{keywords:["thunder","weather","lightning bolt","fast"],char:"\u26a1",fitzpatrick_scale:!1,category:"animals_and_nature"},fire:{keywords:["hot","cook","flame"],char:"\ud83d\udd25",fitzpatrick_scale:!1,category:"animals_and_nature"},boom:{keywords:["bomb","explode","explosion","collision","blown"],char:"\ud83d\udca5",fitzpatrick_scale:!1,category:"animals_and_nature"},snowflake:{keywords:["winter","season","cold","weather","christmas","xmas"],char:"\u2744\ufe0f",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_snow:{keywords:["weather"],char:"\ud83c\udf28",fitzpatrick_scale:!1,category:"animals_and_nature"},snowman:{keywords:["winter","season","cold","weather","christmas","xmas","frozen","without_snow"],char:"\u26c4",fitzpatrick_scale:!1,category:"animals_and_nature"},snowman_with_snow:{keywords:["winter","season","cold","weather","christmas","xmas","frozen"],char:"\u2603",fitzpatrick_scale:!1,category:"animals_and_nature"},wind_face:{keywords:["gust","air"],char:"\ud83c\udf2c",fitzpatrick_scale:!1,category:"animals_and_nature"},dash:{keywords:["wind","air","fast","shoo","fart","smoke","puff"],char:"\ud83d\udca8",fitzpatrick_scale:!1,category:"animals_and_nature"},tornado:{keywords:["weather","cyclone","twister"],char:"\ud83c\udf2a",fitzpatrick_scale:!1,category:"animals_and_nature"},fog:{keywords:["weather"],char:"\ud83c\udf2b",fitzpatrick_scale:!1,category:"animals_and_nature"},open_umbrella:{keywords:["weather","spring"],char:"\u2602",fitzpatrick_scale:!1,category:"animals_and_nature"},umbrella:{keywords:["rainy","weather","spring"],char:"\u2614",fitzpatrick_scale:!1,category:"animals_and_nature"},droplet:{keywords:["water","drip","faucet","spring"],char:"\ud83d\udca7",fitzpatrick_scale:!1,category:"animals_and_nature"},sweat_drops:{keywords:["water","drip","oops"],char:"\ud83d\udca6",fitzpatrick_scale:!1,category:"animals_and_nature"},ocean:{keywords:["sea","water","wave","nature","tsunami","disaster"],char:"\ud83c\udf0a",fitzpatrick_scale:!1,category:"animals_and_nature"},green_apple:{keywords:["fruit","nature"],char:"\ud83c\udf4f",fitzpatrick_scale:!1,category:"food_and_drink"},apple:{keywords:["fruit","mac","school"],char:"\ud83c\udf4e",fitzpatrick_scale:!1,category:"food_and_drink"},pear:{keywords:["fruit","nature","food"],char:"\ud83c\udf50",fitzpatrick_scale:!1,category:"food_and_drink"},tangerine:{keywords:["food","fruit","nature","orange"],char:"\ud83c\udf4a",fitzpatrick_scale:!1,category:"food_and_drink"},lemon:{keywords:["fruit","nature"],char:"\ud83c\udf4b",fitzpatrick_scale:!1,category:"food_and_drink"},banana:{keywords:["fruit","food","monkey"],char:"\ud83c\udf4c",fitzpatrick_scale:!1,category:"food_and_drink"},watermelon:{keywords:["fruit","food","picnic","summer"],char:"\ud83c\udf49",fitzpatrick_scale:!1,category:"food_and_drink"},grapes:{keywords:["fruit","food","wine"],char:"\ud83c\udf47",fitzpatrick_scale:!1,category:"food_and_drink"},strawberry:{keywords:["fruit","food","nature"],char:"\ud83c\udf53",fitzpatrick_scale:!1,category:"food_and_drink"},melon:{keywords:["fruit","nature","food"],char:"\ud83c\udf48",fitzpatrick_scale:!1,category:"food_and_drink"},cherries:{keywords:["food","fruit"],char:"\ud83c\udf52",fitzpatrick_scale:!1,category:"food_and_drink"},peach:{keywords:["fruit","nature","food"],char:"\ud83c\udf51",fitzpatrick_scale:!1,category:"food_and_drink"},pineapple:{keywords:["fruit","nature","food"],char:"\ud83c\udf4d",fitzpatrick_scale:!1,category:"food_and_drink"},coconut:{keywords:["fruit","nature","food","palm"],char:"\ud83e\udd65",fitzpatrick_scale:!1,category:"food_and_drink"},kiwi_fruit:{keywords:["fruit","food"],char:"\ud83e\udd5d",fitzpatrick_scale:!1,category:"food_and_drink"},mango:{keywords:["fruit","food","tropical"],char:"\ud83e\udd6d",fitzpatrick_scale:!1,category:"food_and_drink"},avocado:{keywords:["fruit","food"],char:"\ud83e\udd51",fitzpatrick_scale:!1,category:"food_and_drink"},broccoli:{keywords:["fruit","food","vegetable"],char:"\ud83e\udd66",fitzpatrick_scale:!1,category:"food_and_drink"},tomato:{keywords:["fruit","vegetable","nature","food"],char:"\ud83c\udf45",fitzpatrick_scale:!1,category:"food_and_drink"},eggplant:{keywords:["vegetable","nature","food","aubergine"],char:"\ud83c\udf46",fitzpatrick_scale:!1,category:"food_and_drink"},cucumber:{keywords:["fruit","food","pickle"],char:"\ud83e\udd52",fitzpatrick_scale:!1,category:"food_and_drink"},carrot:{keywords:["vegetable","food","orange"],char:"\ud83e\udd55",fitzpatrick_scale:!1,category:"food_and_drink"},hot_pepper:{keywords:["food","spicy","chilli","chili"],char:"\ud83c\udf36",fitzpatrick_scale:!1,category:"food_and_drink"},potato:{keywords:["food","tuber","vegatable","starch"],char:"\ud83e\udd54",fitzpatrick_scale:!1,category:"food_and_drink"},corn:{keywords:["food","vegetable","plant"],char:"\ud83c\udf3d",fitzpatrick_scale:!1,category:"food_and_drink"},leafy_greens:{keywords:["food","vegetable","plant","bok choy","cabbage","kale","lettuce"],char:"\ud83e\udd6c",fitzpatrick_scale:!1,category:"food_and_drink"},sweet_potato:{keywords:["food","nature"],char:"\ud83c\udf60",fitzpatrick_scale:!1,category:"food_and_drink"},peanuts:{keywords:["food","nut"],char:"\ud83e\udd5c",fitzpatrick_scale:!1,category:"food_and_drink"},honey_pot:{keywords:["bees","sweet","kitchen"],char:"\ud83c\udf6f",fitzpatrick_scale:!1,category:"food_and_drink"},croissant:{keywords:["food","bread","french"],char:"\ud83e\udd50",fitzpatrick_scale:!1,category:"food_and_drink"},bread:{keywords:["food","wheat","breakfast","toast"],char:"\ud83c\udf5e",fitzpatrick_scale:!1,category:"food_and_drink"},baguette_bread:{keywords:["food","bread","french"],char:"\ud83e\udd56",fitzpatrick_scale:!1,category:"food_and_drink"},bagel:{keywords:["food","bread","bakery","schmear"],char:"\ud83e\udd6f",fitzpatrick_scale:!1,category:"food_and_drink"},pretzel:{keywords:["food","bread","twisted"],char:"\ud83e\udd68",fitzpatrick_scale:!1,category:"food_and_drink"},cheese:{keywords:["food","chadder"],char:"\ud83e\uddc0",fitzpatrick_scale:!1,category:"food_and_drink"},egg:{keywords:["food","chicken","breakfast"],char:"\ud83e\udd5a",fitzpatrick_scale:!1,category:"food_and_drink"},bacon:{keywords:["food","breakfast","pork","pig","meat"],char:"\ud83e\udd53",fitzpatrick_scale:!1,category:"food_and_drink"},steak:{keywords:["food","cow","meat","cut","chop","lambchop","porkchop"],char:"\ud83e\udd69",fitzpatrick_scale:!1,category:"food_and_drink"},pancakes:{keywords:["food","breakfast","flapjacks","hotcakes"],char:"\ud83e\udd5e",fitzpatrick_scale:!1,category:"food_and_drink"},poultry_leg:{keywords:["food","meat","drumstick","bird","chicken","turkey"],char:"\ud83c\udf57",fitzpatrick_scale:!1,category:"food_and_drink"},meat_on_bone:{keywords:["good","food","drumstick"],char:"\ud83c\udf56",fitzpatrick_scale:!1,category:"food_and_drink"},bone:{keywords:["skeleton"],char:"\ud83e\uddb4",fitzpatrick_scale:!1,category:"food_and_drink"},fried_shrimp:{keywords:["food","animal","appetizer","summer"],char:"\ud83c\udf64",fitzpatrick_scale:!1,category:"food_and_drink"},fried_egg:{keywords:["food","breakfast","kitchen","egg"],char:"\ud83c\udf73",fitzpatrick_scale:!1,category:"food_and_drink"},hamburger:{keywords:["meat","fast food","beef","cheeseburger","mcdonalds","burger king"],char:"\ud83c\udf54",fitzpatrick_scale:!1,category:"food_and_drink"},fries:{keywords:["chips","snack","fast food"],char:"\ud83c\udf5f",fitzpatrick_scale:!1,category:"food_and_drink"},stuffed_flatbread:{keywords:["food","flatbread","stuffed","gyro"],char:"\ud83e\udd59",fitzpatrick_scale:!1,category:"food_and_drink"},hotdog:{keywords:["food","frankfurter"],char:"\ud83c\udf2d",fitzpatrick_scale:!1,category:"food_and_drink"},pizza:{keywords:["food","party"],char:"\ud83c\udf55",fitzpatrick_scale:!1,category:"food_and_drink"},sandwich:{keywords:["food","lunch","bread"],char:"\ud83e\udd6a",fitzpatrick_scale:!1,category:"food_and_drink"},canned_food:{keywords:["food","soup"],char:"\ud83e\udd6b",fitzpatrick_scale:!1,category:"food_and_drink"},spaghetti:{keywords:["food","italian","noodle"],char:"\ud83c\udf5d",fitzpatrick_scale:!1,category:"food_and_drink"},taco:{keywords:["food","mexican"],char:"\ud83c\udf2e",fitzpatrick_scale:!1,category:"food_and_drink"},burrito:{keywords:["food","mexican"],char:"\ud83c\udf2f",fitzpatrick_scale:!1,category:"food_and_drink"},green_salad:{keywords:["food","healthy","lettuce"],char:"\ud83e\udd57",fitzpatrick_scale:!1,category:"food_and_drink"},shallow_pan_of_food:{keywords:["food","cooking","casserole","paella"],char:"\ud83e\udd58",fitzpatrick_scale:!1,category:"food_and_drink"},ramen:{keywords:["food","japanese","noodle","chopsticks"],char:"\ud83c\udf5c",fitzpatrick_scale:!1,category:"food_and_drink"},stew:{keywords:["food","meat","soup"],char:"\ud83c\udf72",fitzpatrick_scale:!1,category:"food_and_drink"},fish_cake:{keywords:["food","japan","sea","beach","narutomaki","pink","swirl","kamaboko","surimi","ramen"],char:"\ud83c\udf65",fitzpatrick_scale:!1,category:"food_and_drink"},fortune_cookie:{keywords:["food","prophecy"],char:"\ud83e\udd60",fitzpatrick_scale:!1,category:"food_and_drink"},sushi:{keywords:["food","fish","japanese","rice"],char:"\ud83c\udf63",fitzpatrick_scale:!1,category:"food_and_drink"},bento:{keywords:["food","japanese","box"],char:"\ud83c\udf71",fitzpatrick_scale:!1,category:"food_and_drink"},curry:{keywords:["food","spicy","hot","indian"],char:"\ud83c\udf5b",fitzpatrick_scale:!1,category:"food_and_drink"},rice_ball:{keywords:["food","japanese"],char:"\ud83c\udf59",fitzpatrick_scale:!1,category:"food_and_drink"},rice:{keywords:["food","china","asian"],char:"\ud83c\udf5a",fitzpatrick_scale:!1,category:"food_and_drink"},rice_cracker:{keywords:["food","japanese"],char:"\ud83c\udf58",fitzpatrick_scale:!1,category:"food_and_drink"},oden:{keywords:["food","japanese"],char:"\ud83c\udf62",fitzpatrick_scale:!1,category:"food_and_drink"},dango:{keywords:["food","dessert","sweet","japanese","barbecue","meat"],char:"\ud83c\udf61",fitzpatrick_scale:!1,category:"food_and_drink"},shaved_ice:{keywords:["hot","dessert","summer"],char:"\ud83c\udf67",fitzpatrick_scale:!1,category:"food_and_drink"},ice_cream:{keywords:["food","hot","dessert"],char:"\ud83c\udf68",fitzpatrick_scale:!1,category:"food_and_drink"},icecream:{keywords:["food","hot","dessert","summer"],char:"\ud83c\udf66",fitzpatrick_scale:!1,category:"food_and_drink"},pie:{keywords:["food","dessert","pastry"],char:"\ud83e\udd67",fitzpatrick_scale:!1,category:"food_and_drink"},cake:{keywords:["food","dessert"],char:"\ud83c\udf70",fitzpatrick_scale:!1,category:"food_and_drink"},cupcake:{keywords:["food","dessert","bakery","sweet"],char:"\ud83e\uddc1",fitzpatrick_scale:!1,category:"food_and_drink"},moon_cake:{keywords:["food","autumn"],char:"\ud83e\udd6e",fitzpatrick_scale:!1,category:"food_and_drink"},birthday:{keywords:["food","dessert","cake"],char:"\ud83c\udf82",fitzpatrick_scale:!1,category:"food_and_drink"},custard:{keywords:["dessert","food"],char:"\ud83c\udf6e",fitzpatrick_scale:!1,category:"food_and_drink"},candy:{keywords:["snack","dessert","sweet","lolly"],char:"\ud83c\udf6c",fitzpatrick_scale:!1,category:"food_and_drink"},lollipop:{keywords:["food","snack","candy","sweet"],char:"\ud83c\udf6d",fitzpatrick_scale:!1,category:"food_and_drink"},chocolate_bar:{keywords:["food","snack","dessert","sweet"],char:"\ud83c\udf6b",fitzpatrick_scale:!1,category:"food_and_drink"},popcorn:{keywords:["food","movie theater","films","snack"],char:"\ud83c\udf7f",fitzpatrick_scale:!1,category:"food_and_drink"},dumpling:{keywords:["food","empanada","pierogi","potsticker"],char:"\ud83e\udd5f",fitzpatrick_scale:!1,category:"food_and_drink"},doughnut:{keywords:["food","dessert","snack","sweet","donut"],char:"\ud83c\udf69",fitzpatrick_scale:!1,category:"food_and_drink"},cookie:{keywords:["food","snack","oreo","chocolate","sweet","dessert"],char:"\ud83c\udf6a",fitzpatrick_scale:!1,category:"food_and_drink"},milk_glass:{keywords:["beverage","drink","cow"],char:"\ud83e\udd5b",fitzpatrick_scale:!1,category:"food_and_drink"},beer:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:"\ud83c\udf7a",fitzpatrick_scale:!1,category:"food_and_drink"},beers:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:"\ud83c\udf7b",fitzpatrick_scale:!1,category:"food_and_drink"},clinking_glasses:{keywords:["beverage","drink","party","alcohol","celebrate","cheers","wine","champagne","toast"],char:"\ud83e\udd42",fitzpatrick_scale:!1,category:"food_and_drink"},wine_glass:{keywords:["drink","beverage","drunk","alcohol","booze"],char:"\ud83c\udf77",fitzpatrick_scale:!1,category:"food_and_drink"},tumbler_glass:{keywords:["drink","beverage","drunk","alcohol","liquor","booze","bourbon","scotch","whisky","glass","shot"],char:"\ud83e\udd43",fitzpatrick_scale:!1,category:"food_and_drink"},cocktail:{keywords:["drink","drunk","alcohol","beverage","booze","mojito"],char:"\ud83c\udf78",fitzpatrick_scale:!1,category:"food_and_drink"},tropical_drink:{keywords:["beverage","cocktail","summer","beach","alcohol","booze","mojito"],char:"\ud83c\udf79",fitzpatrick_scale:!1,category:"food_and_drink"},champagne:{keywords:["drink","wine","bottle","celebration"],char:"\ud83c\udf7e",fitzpatrick_scale:!1,category:"food_and_drink"},sake:{keywords:["wine","drink","drunk","beverage","japanese","alcohol","booze"],char:"\ud83c\udf76",fitzpatrick_scale:!1,category:"food_and_drink"},tea:{keywords:["drink","bowl","breakfast","green","british"],char:"\ud83c\udf75",fitzpatrick_scale:!1,category:"food_and_drink"},cup_with_straw:{keywords:["drink","soda"],char:"\ud83e\udd64",fitzpatrick_scale:!1,category:"food_and_drink"},coffee:{keywords:["beverage","caffeine","latte","espresso"],char:"\u2615",fitzpatrick_scale:!1,category:"food_and_drink"},baby_bottle:{keywords:["food","container","milk"],char:"\ud83c\udf7c",fitzpatrick_scale:!1,category:"food_and_drink"},salt:{keywords:["condiment","shaker"],char:"\ud83e\uddc2",fitzpatrick_scale:!1,category:"food_and_drink"},spoon:{keywords:["cutlery","kitchen","tableware"],char:"\ud83e\udd44",fitzpatrick_scale:!1,category:"food_and_drink"},fork_and_knife:{keywords:["cutlery","kitchen"],char:"\ud83c\udf74",fitzpatrick_scale:!1,category:"food_and_drink"},plate_with_cutlery:{keywords:["food","eat","meal","lunch","dinner","restaurant"],char:"\ud83c\udf7d",fitzpatrick_scale:!1,category:"food_and_drink"},bowl_with_spoon:{keywords:["food","breakfast","cereal","oatmeal","porridge"],char:"\ud83e\udd63",fitzpatrick_scale:!1,category:"food_and_drink"},takeout_box:{keywords:["food","leftovers"],char:"\ud83e\udd61",fitzpatrick_scale:!1,category:"food_and_drink"},chopsticks:{keywords:["food"],char:"\ud83e\udd62",fitzpatrick_scale:!1,category:"food_and_drink"},soccer:{keywords:["sports","football"],char:"\u26bd",fitzpatrick_scale:!1,category:"activity"},basketball:{keywords:["sports","balls","NBA"],char:"\ud83c\udfc0",fitzpatrick_scale:!1,category:"activity"},football:{keywords:["sports","balls","NFL"],char:"\ud83c\udfc8",fitzpatrick_scale:!1,category:"activity"},baseball:{keywords:["sports","balls"],char:"\u26be",fitzpatrick_scale:!1,category:"activity"},softball:{keywords:["sports","balls"],char:"\ud83e\udd4e",fitzpatrick_scale:!1,category:"activity"},tennis:{keywords:["sports","balls","green"],char:"\ud83c\udfbe",fitzpatrick_scale:!1,category:"activity"},volleyball:{keywords:["sports","balls"],char:"\ud83c\udfd0",fitzpatrick_scale:!1,category:"activity"},rugby_football:{keywords:["sports","team"],char:"\ud83c\udfc9",fitzpatrick_scale:!1,category:"activity"},flying_disc:{keywords:["sports","frisbee","ultimate"],char:"\ud83e\udd4f",fitzpatrick_scale:!1,category:"activity"},"8ball":{keywords:["pool","hobby","game","luck","magic"],char:"\ud83c\udfb1",fitzpatrick_scale:!1,category:"activity"},golf:{keywords:["sports","business","flag","hole","summer"],char:"\u26f3",fitzpatrick_scale:!1,category:"activity"},golfing_woman:{keywords:["sports","business","woman","female"],char:"\ud83c\udfcc\ufe0f\u200d\u2640\ufe0f",fitzpatrick_scale:!1,category:"activity"},golfing_man:{keywords:["sports","business"],char:"\ud83c\udfcc",fitzpatrick_scale:!0,category:"activity"},ping_pong:{keywords:["sports","pingpong"],char:"\ud83c\udfd3",fitzpatrick_scale:!1,category:"activity"},badminton:{keywords:["sports"],char:"\ud83c\udff8",fitzpatrick_scale:!1,category:"activity"},goal_net:{keywords:["sports"],char:"\ud83e\udd45",fitzpatrick_scale:!1,category:"activity"},ice_hockey:{keywords:["sports"],char:"\ud83c\udfd2",fitzpatrick_scale:!1,category:"activity"},field_hockey:{keywords:["sports"],char:"\ud83c\udfd1",fitzpatrick_scale:!1,category:"activity"},lacrosse:{keywords:["sports","ball","stick"],char:"\ud83e\udd4d",fitzpatrick_scale:!1,category:"activity"},cricket:{keywords:["sports"],char:"\ud83c\udfcf",fitzpatrick_scale:!1,category:"activity"},ski:{keywords:["sports","winter","cold","snow"],char:"\ud83c\udfbf",fitzpatrick_scale:!1,category:"activity"},skier:{keywords:["sports","winter","snow"],char:"\u26f7",fitzpatrick_scale:!1,category:"activity"},snowboarder:{keywords:["sports","winter"],char:"\ud83c\udfc2",fitzpatrick_scale:!0,category:"activity"},person_fencing:{keywords:["sports","fencing","sword"],char:"\ud83e\udd3a",fitzpatrick_scale:!1,category:"activity"},women_wrestling:{keywords:["sports","wrestlers"],char:"\ud83e\udd3c\u200d\u2640\ufe0f",fitzpatrick_scale:!1,category:"activity"},men_wrestling:{keywords:["sports","wrestlers"],char:"\ud83e\udd3c\u200d\u2642\ufe0f",fitzpatrick_scale:!1,category:"activity"},woman_cartwheeling:{keywords:["gymnastics"],char:"\ud83e\udd38\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_cartwheeling:{keywords:["gymnastics"],char:"\ud83e\udd38\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},woman_playing_handball:{keywords:["sports"],char:"\ud83e\udd3e\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_playing_handball:{keywords:["sports"],char:"\ud83e\udd3e\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},ice_skate:{keywords:["sports"],char:"\u26f8",fitzpatrick_scale:!1,category:"activity"},curling_stone:{keywords:["sports"],char:"\ud83e\udd4c",fitzpatrick_scale:!1,category:"activity"},skateboard:{keywords:["board"],char:"\ud83d\udef9",fitzpatrick_scale:!1,category:"activity"},sled:{keywords:["sleigh","luge","toboggan"],char:"\ud83d\udef7",fitzpatrick_scale:!1,category:"activity"},bow_and_arrow:{keywords:["sports"],char:"\ud83c\udff9",fitzpatrick_scale:!1,category:"activity"},fishing_pole_and_fish:{keywords:["food","hobby","summer"],char:"\ud83c\udfa3",fitzpatrick_scale:!1,category:"activity"},boxing_glove:{keywords:["sports","fighting"],char:"\ud83e\udd4a",fitzpatrick_scale:!1,category:"activity"},martial_arts_uniform:{keywords:["judo","karate","taekwondo"],char:"\ud83e\udd4b",fitzpatrick_scale:!1,category:"activity"},rowing_woman:{keywords:["sports","hobby","water","ship","woman","female"],char:"\ud83d\udea3\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},rowing_man:{keywords:["sports","hobby","water","ship"],char:"\ud83d\udea3",fitzpatrick_scale:!0,category:"activity"},climbing_woman:{keywords:["sports","hobby","woman","female","rock"],char:"\ud83e\uddd7\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},climbing_man:{keywords:["sports","hobby","man","male","rock"],char:"\ud83e\uddd7\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},swimming_woman:{keywords:["sports","exercise","human","athlete","water","summer","woman","female"],char:"\ud83c\udfca\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},swimming_man:{keywords:["sports","exercise","human","athlete","water","summer"],char:"\ud83c\udfca",fitzpatrick_scale:!0,category:"activity"},woman_playing_water_polo:{keywords:["sports","pool"],char:"\ud83e\udd3d\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_playing_water_polo:{keywords:["sports","pool"],char:"\ud83e\udd3d\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},woman_in_lotus_position:{keywords:["woman","female","meditation","yoga","serenity","zen","mindfulness"],char:"\ud83e\uddd8\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_in_lotus_position:{keywords:["man","male","meditation","yoga","serenity","zen","mindfulness"],char:"\ud83e\uddd8\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},surfing_woman:{keywords:["sports","ocean","sea","summer","beach","woman","female"],char:"\ud83c\udfc4\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},surfing_man:{keywords:["sports","ocean","sea","summer","beach"],char:"\ud83c\udfc4",fitzpatrick_scale:!0,category:"activity"},bath:{keywords:["clean","shower","bathroom"],char:"\ud83d\udec0",fitzpatrick_scale:!0,category:"activity"},basketball_woman:{keywords:["sports","human","woman","female"],char:"\u26f9\ufe0f\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},basketball_man:{keywords:["sports","human"],char:"\u26f9",fitzpatrick_scale:!0,category:"activity"},weight_lifting_woman:{keywords:["sports","training","exercise","woman","female"],char:"\ud83c\udfcb\ufe0f\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},weight_lifting_man:{keywords:["sports","training","exercise"],char:"\ud83c\udfcb",fitzpatrick_scale:!0,category:"activity"},biking_woman:{keywords:["sports","bike","exercise","hipster","woman","female"],char:"\ud83d\udeb4\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},biking_man:{keywords:["sports","bike","exercise","hipster"],char:"\ud83d\udeb4",fitzpatrick_scale:!0,category:"activity"},mountain_biking_woman:{keywords:["transportation","sports","human","race","bike","woman","female"],char:"\ud83d\udeb5\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},mountain_biking_man:{keywords:["transportation","sports","human","race","bike"],char:"\ud83d\udeb5",fitzpatrick_scale:!0,category:"activity"},horse_racing:{keywords:["animal","betting","competition","gambling","luck"],char:"\ud83c\udfc7",fitzpatrick_scale:!0,category:"activity"},business_suit_levitating:{keywords:["suit","business","levitate","hover","jump"],char:"\ud83d\udd74",fitzpatrick_scale:!0,category:"activity"},trophy:{keywords:["win","award","contest","place","ftw","ceremony"],char:"\ud83c\udfc6",fitzpatrick_scale:!1,category:"activity"},running_shirt_with_sash:{keywords:["play","pageant"],char:"\ud83c\udfbd",fitzpatrick_scale:!1,category:"activity"},medal_sports:{keywords:["award","winning"],char:"\ud83c\udfc5",fitzpatrick_scale:!1,category:"activity"},medal_military:{keywords:["award","winning","army"],char:"\ud83c\udf96",fitzpatrick_scale:!1,category:"activity"},"1st_place_medal":{keywords:["award","winning","first"],char:"\ud83e\udd47",fitzpatrick_scale:!1,category:"activity"},"2nd_place_medal":{keywords:["award","second"],char:"\ud83e\udd48",fitzpatrick_scale:!1,category:"activity"},"3rd_place_medal":{keywords:["award","third"],char:"\ud83e\udd49",fitzpatrick_scale:!1,category:"activity"},reminder_ribbon:{keywords:["sports","cause","support","awareness"],char:"\ud83c\udf97",fitzpatrick_scale:!1,category:"activity"},rosette:{keywords:["flower","decoration","military"],char:"\ud83c\udff5",fitzpatrick_scale:!1,category:"activity"},ticket:{keywords:["event","concert","pass"],char:"\ud83c\udfab",fitzpatrick_scale:!1,category:"activity"},tickets:{keywords:["sports","concert","entrance"],char:"\ud83c\udf9f",fitzpatrick_scale:!1,category:"activity"},performing_arts:{keywords:["acting","theater","drama"],char:"\ud83c\udfad",fitzpatrick_scale:!1,category:"activity"},art:{keywords:["design","paint","draw","colors"],char:"\ud83c\udfa8",fitzpatrick_scale:!1,category:"activity"},circus_tent:{keywords:["festival","carnival","party"],char:"\ud83c\udfaa",fitzpatrick_scale:!1,category:"activity"},woman_juggling:{keywords:["juggle","balance","skill","multitask"],char:"\ud83e\udd39\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_juggling:{keywords:["juggle","balance","skill","multitask"],char:"\ud83e\udd39\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},microphone:{keywords:["sound","music","PA","sing","talkshow"],char:"\ud83c\udfa4",fitzpatrick_scale:!1,category:"activity"},headphones:{keywords:["music","score","gadgets"],char:"\ud83c\udfa7",fitzpatrick_scale:!1,category:"activity"},musical_score:{keywords:["treble","clef","compose"],char:"\ud83c\udfbc",fitzpatrick_scale:!1,category:"activity"},musical_keyboard:{keywords:["piano","instrument","compose"],char:"\ud83c\udfb9",fitzpatrick_scale:!1,category:"activity"},drum:{keywords:["music","instrument","drumsticks","snare"],char:"\ud83e\udd41",fitzpatrick_scale:!1,category:"activity"},saxophone:{keywords:["music","instrument","jazz","blues"],char:"\ud83c\udfb7",fitzpatrick_scale:!1,category:"activity"},trumpet:{keywords:["music","brass"],char:"\ud83c\udfba",fitzpatrick_scale:!1,category:"activity"},guitar:{keywords:["music","instrument"],char:"\ud83c\udfb8",fitzpatrick_scale:!1,category:"activity"},violin:{keywords:["music","instrument","orchestra","symphony"],char:"\ud83c\udfbb",fitzpatrick_scale:!1,category:"activity"},clapper:{keywords:["movie","film","record"],char:"\ud83c\udfac",fitzpatrick_scale:!1,category:"activity"},video_game:{keywords:["play","console","PS4","controller"],char:"\ud83c\udfae",fitzpatrick_scale:!1,category:"activity"},space_invader:{keywords:["game","arcade","play"],char:"\ud83d\udc7e",fitzpatrick_scale:!1,category:"activity"},dart:{keywords:["game","play","bar","target","bullseye"],char:"\ud83c\udfaf",fitzpatrick_scale:!1,category:"activity"},game_die:{keywords:["dice","random","tabletop","play","luck"],char:"\ud83c\udfb2",fitzpatrick_scale:!1,category:"activity"},chess_pawn:{keywords:["expendable"],char:"\u265f",fitzpatrick_scale:!1,category:"activity"},slot_machine:{keywords:["bet","gamble","vegas","fruit machine","luck","casino"],char:"\ud83c\udfb0",fitzpatrick_scale:!1,category:"activity"},jigsaw:{keywords:["interlocking","puzzle","piece"],char:"\ud83e\udde9",fitzpatrick_scale:!1,category:"activity"},bowling:{keywords:["sports","fun","play"],char:"\ud83c\udfb3",fitzpatrick_scale:!1,category:"activity"},red_car:{keywords:["red","transportation","vehicle"],char:"\ud83d\ude97",fitzpatrick_scale:!1,category:"travel_and_places"},taxi:{keywords:["uber","vehicle","cars","transportation"],char:"\ud83d\ude95",fitzpatrick_scale:!1,category:"travel_and_places"},blue_car:{keywords:["transportation","vehicle"],char:"\ud83d\ude99",fitzpatrick_scale:!1,category:"travel_and_places"},bus:{keywords:["car","vehicle","transportation"],char:"\ud83d\ude8c",fitzpatrick_scale:!1,category:"travel_and_places"},trolleybus:{keywords:["bart","transportation","vehicle"],char:"\ud83d\ude8e",fitzpatrick_scale:!1,category:"travel_and_places"},racing_car:{keywords:["sports","race","fast","formula","f1"],char:"\ud83c\udfce",fitzpatrick_scale:!1,category:"travel_and_places"},police_car:{keywords:["vehicle","cars","transportation","law","legal","enforcement"],char:"\ud83d\ude93",fitzpatrick_scale:!1,category:"travel_and_places"},ambulance:{keywords:["health","911","hospital"],char:"\ud83d\ude91",fitzpatrick_scale:!1,category:"travel_and_places"},fire_engine:{keywords:["transportation","cars","vehicle"],char:"\ud83d\ude92",fitzpatrick_scale:!1,category:"travel_and_places"},minibus:{keywords:["vehicle","car","transportation"],char:"\ud83d\ude90",fitzpatrick_scale:!1,category:"travel_and_places"},truck:{keywords:["cars","transportation"],char:"\ud83d\ude9a",fitzpatrick_scale:!1,category:"travel_and_places"},articulated_lorry:{keywords:["vehicle","cars","transportation","express"],char:"\ud83d\ude9b",fitzpatrick_scale:!1,category:"travel_and_places"},tractor:{keywords:["vehicle","car","farming","agriculture"],char:"\ud83d\ude9c",fitzpatrick_scale:!1,category:"travel_and_places"},kick_scooter:{keywords:["vehicle","kick","razor"],char:"\ud83d\udef4",fitzpatrick_scale:!1,category:"travel_and_places"},motorcycle:{keywords:["race","sports","fast"],char:"\ud83c\udfcd",fitzpatrick_scale:!1,category:"travel_and_places"},bike:{keywords:["sports","bicycle","exercise","hipster"],char:"\ud83d\udeb2",fitzpatrick_scale:!1,category:"travel_and_places"},motor_scooter:{keywords:["vehicle","vespa","sasha"],char:"\ud83d\udef5",fitzpatrick_scale:!1,category:"travel_and_places"},rotating_light:{keywords:["police","ambulance","911","emergency","alert","error","pinged","law","legal"],char:"\ud83d\udea8",fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_police_car:{keywords:["vehicle","law","legal","enforcement","911"],char:"\ud83d\ude94",fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_bus:{keywords:["vehicle","transportation"],char:"\ud83d\ude8d",fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_automobile:{keywords:["car","vehicle","transportation"],char:"\ud83d\ude98",fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_taxi:{keywords:["vehicle","cars","uber"],char:"\ud83d\ude96",fitzpatrick_scale:!1,category:"travel_and_places"},aerial_tramway:{keywords:["transportation","vehicle","ski"],char:"\ud83d\udea1",fitzpatrick_scale:!1,category:"travel_and_places"},mountain_cableway:{keywords:["transportation","vehicle","ski"],char:"\ud83d\udea0",fitzpatrick_scale:!1,category:"travel_and_places"},suspension_railway:{keywords:["vehicle","transportation"],char:"\ud83d\ude9f",fitzpatrick_scale:!1,category:"travel_and_places"},railway_car:{keywords:["transportation","vehicle"],char:"\ud83d\ude83",fitzpatrick_scale:!1,category:"travel_and_places"},train:{keywords:["transportation","vehicle","carriage","public","travel"],char:"\ud83d\ude8b",fitzpatrick_scale:!1,category:"travel_and_places"},monorail:{keywords:["transportation","vehicle"],char:"\ud83d\ude9d",fitzpatrick_scale:!1,category:"travel_and_places"},bullettrain_side:{keywords:["transportation","vehicle"],char:"\ud83d\ude84",fitzpatrick_scale:!1,category:"travel_and_places"},bullettrain_front:{keywords:["transportation","vehicle","speed","fast","public","travel"],char:"\ud83d\ude85",fitzpatrick_scale:!1,category:"travel_and_places"},light_rail:{keywords:["transportation","vehicle"],char:"\ud83d\ude88",fitzpatrick_scale:!1,category:"travel_and_places"},mountain_railway:{keywords:["transportation","vehicle"],char:"\ud83d\ude9e",fitzpatrick_scale:!1,category:"travel_and_places"},steam_locomotive:{keywords:["transportation","vehicle","train"],char:"\ud83d\ude82",fitzpatrick_scale:!1,category:"travel_and_places"},train2:{keywords:["transportation","vehicle"],char:"\ud83d\ude86",fitzpatrick_scale:!1,category:"travel_and_places"},metro:{keywords:["transportation","blue-square","mrt","underground","tube"],char:"\ud83d\ude87",fitzpatrick_scale:!1,category:"travel_and_places"},tram:{keywords:["transportation","vehicle"],char:"\ud83d\ude8a",fitzpatrick_scale:!1,category:"travel_and_places"},station:{keywords:["transportation","vehicle","public"],char:"\ud83d\ude89",fitzpatrick_scale:!1,category:"travel_and_places"},flying_saucer:{keywords:["transportation","vehicle","ufo"],char:"\ud83d\udef8",fitzpatrick_scale:!1,category:"travel_and_places"},helicopter:{keywords:["transportation","vehicle","fly"],char:"\ud83d\ude81",fitzpatrick_scale:!1,category:"travel_and_places"},small_airplane:{keywords:["flight","transportation","fly","vehicle"],char:"\ud83d\udee9",fitzpatrick_scale:!1,category:"travel_and_places"},airplane:{keywords:["vehicle","transportation","flight","fly"],char:"\u2708\ufe0f",fitzpatrick_scale:!1,category:"travel_and_places"},flight_departure:{keywords:["airport","flight","landing"],char:"\ud83d\udeeb",fitzpatrick_scale:!1,category:"travel_and_places"},flight_arrival:{keywords:["airport","flight","boarding"],char:"\ud83d\udeec",fitzpatrick_scale:!1,category:"travel_and_places"},sailboat:{keywords:["ship","summer","transportation","water","sailing"],char:"\u26f5",fitzpatrick_scale:!1,category:"travel_and_places"},motor_boat:{keywords:["ship"],char:"\ud83d\udee5",fitzpatrick_scale:!1,category:"travel_and_places"},speedboat:{keywords:["ship","transportation","vehicle","summer"],char:"\ud83d\udea4",fitzpatrick_scale:!1,category:"travel_and_places"},ferry:{keywords:["boat","ship","yacht"],char:"\u26f4",fitzpatrick_scale:!1,category:"travel_and_places"},passenger_ship:{keywords:["yacht","cruise","ferry"],char:"\ud83d\udef3",fitzpatrick_scale:!1,category:"travel_and_places"},rocket:{keywords:["launch","ship","staffmode","NASA","outer space","outer_space","fly"],char:"\ud83d\ude80",fitzpatrick_scale:!1,category:"travel_and_places"},artificial_satellite:{keywords:["communication","gps","orbit","spaceflight","NASA","ISS"],char:"\ud83d\udef0",fitzpatrick_scale:!1,category:"travel_and_places"},seat:{keywords:["sit","airplane","transport","bus","flight","fly"],char:"\ud83d\udcba",fitzpatrick_scale:!1,category:"travel_and_places"},canoe:{keywords:["boat","paddle","water","ship"],char:"\ud83d\udef6",fitzpatrick_scale:!1,category:"travel_and_places"},anchor:{keywords:["ship","ferry","sea","boat"],char:"\u2693",fitzpatrick_scale:!1,category:"travel_and_places"},construction:{keywords:["wip","progress","caution","warning"],char:"\ud83d\udea7",fitzpatrick_scale:!1,category:"travel_and_places"},fuelpump:{keywords:["gas station","petroleum"],char:"\u26fd",fitzpatrick_scale:!1,category:"travel_and_places"},busstop:{keywords:["transportation","wait"],char:"\ud83d\ude8f",fitzpatrick_scale:!1,category:"travel_and_places"},vertical_traffic_light:{keywords:["transportation","driving"],char:"\ud83d\udea6",fitzpatrick_scale:!1,category:"travel_and_places"},traffic_light:{keywords:["transportation","signal"],char:"\ud83d\udea5",fitzpatrick_scale:!1,category:"travel_and_places"},checkered_flag:{keywords:["contest","finishline","race","gokart"],char:"\ud83c\udfc1",fitzpatrick_scale:!1,category:"travel_and_places"},ship:{keywords:["transportation","titanic","deploy"],char:"\ud83d\udea2",fitzpatrick_scale:!1,category:"travel_and_places"},ferris_wheel:{keywords:["photo","carnival","londoneye"],char:"\ud83c\udfa1",fitzpatrick_scale:!1,category:"travel_and_places"},roller_coaster:{keywords:["carnival","playground","photo","fun"],char:"\ud83c\udfa2",fitzpatrick_scale:!1,category:"travel_and_places"},carousel_horse:{keywords:["photo","carnival"],char:"\ud83c\udfa0",fitzpatrick_scale:!1,category:"travel_and_places"},building_construction:{keywords:["wip","working","progress"],char:"\ud83c\udfd7",fitzpatrick_scale:!1,category:"travel_and_places"},foggy:{keywords:["photo","mountain"],char:"\ud83c\udf01",fitzpatrick_scale:!1,category:"travel_and_places"},tokyo_tower:{keywords:["photo","japanese"],char:"\ud83d\uddfc",fitzpatrick_scale:!1,category:"travel_and_places"},factory:{keywords:["building","industry","pollution","smoke"],char:"\ud83c\udfed",fitzpatrick_scale:!1,category:"travel_and_places"},fountain:{keywords:["photo","summer","water","fresh"],char:"\u26f2",fitzpatrick_scale:!1,category:"travel_and_places"},rice_scene:{keywords:["photo","japan","asia","tsukimi"],char:"\ud83c\udf91",fitzpatrick_scale:!1,category:"travel_and_places"},mountain:{keywords:["photo","nature","environment"],char:"\u26f0",fitzpatrick_scale:!1,category:"travel_and_places"},mountain_snow:{keywords:["photo","nature","environment","winter","cold"],char:"\ud83c\udfd4",fitzpatrick_scale:!1,category:"travel_and_places"},mount_fuji:{keywords:["photo","mountain","nature","japanese"],char:"\ud83d\uddfb",fitzpatrick_scale:!1,category:"travel_and_places"},volcano:{keywords:["photo","nature","disaster"],char:"\ud83c\udf0b",fitzpatrick_scale:!1,category:"travel_and_places"},japan:{keywords:["nation","country","japanese","asia"],char:"\ud83d\uddfe",fitzpatrick_scale:!1,category:"travel_and_places"},camping:{keywords:["photo","outdoors","tent"],char:"\ud83c\udfd5",fitzpatrick_scale:!1,category:"travel_and_places"},tent:{keywords:["photo","camping","outdoors"],char:"\u26fa",fitzpatrick_scale:!1,category:"travel_and_places"},national_park:{keywords:["photo","environment","nature"],char:"\ud83c\udfde",fitzpatrick_scale:!1,category:"travel_and_places"},motorway:{keywords:["road","cupertino","interstate","highway"],char:"\ud83d\udee3",fitzpatrick_scale:!1,category:"travel_and_places"},railway_track:{keywords:["train","transportation"],char:"\ud83d\udee4",fitzpatrick_scale:!1,category:"travel_and_places"},sunrise:{keywords:["morning","view","vacation","photo"],char:"\ud83c\udf05",fitzpatrick_scale:!1,category:"travel_and_places"},sunrise_over_mountains:{keywords:["view","vacation","photo"],char:"\ud83c\udf04",fitzpatrick_scale:!1,category:"travel_and_places"},desert:{keywords:["photo","warm","saharah"],char:"\ud83c\udfdc",fitzpatrick_scale:!1,category:"travel_and_places"},beach_umbrella:{keywords:["weather","summer","sunny","sand","mojito"],char:"\ud83c\udfd6",fitzpatrick_scale:!1,category:"travel_and_places"},desert_island:{keywords:["photo","tropical","mojito"],char:"\ud83c\udfdd",fitzpatrick_scale:!1,category:"travel_and_places"},city_sunrise:{keywords:["photo","good morning","dawn"],char:"\ud83c\udf07",fitzpatrick_scale:!1,category:"travel_and_places"},city_sunset:{keywords:["photo","evening","sky","buildings"],char:"\ud83c\udf06",fitzpatrick_scale:!1,category:"travel_and_places"},cityscape:{keywords:["photo","night life","urban"],char:"\ud83c\udfd9",fitzpatrick_scale:!1,category:"travel_and_places"},night_with_stars:{keywords:["evening","city","downtown"],char:"\ud83c\udf03",fitzpatrick_scale:!1,category:"travel_and_places"},bridge_at_night:{keywords:["photo","sanfrancisco"],char:"\ud83c\udf09",fitzpatrick_scale:!1,category:"travel_and_places"},milky_way:{keywords:["photo","space","stars"],char:"\ud83c\udf0c",fitzpatrick_scale:!1,category:"travel_and_places"},stars:{keywords:["night","photo"],char:"\ud83c\udf20",fitzpatrick_scale:!1,category:"travel_and_places"},sparkler:{keywords:["stars","night","shine"],char:"\ud83c\udf87",fitzpatrick_scale:!1,category:"travel_and_places"},fireworks:{keywords:["photo","festival","carnival","congratulations"],char:"\ud83c\udf86",fitzpatrick_scale:!1,category:"travel_and_places"},rainbow:{keywords:["nature","happy","unicorn_face","photo","sky","spring"],char:"\ud83c\udf08",fitzpatrick_scale:!1,category:"travel_and_places"},houses:{keywords:["buildings","photo"],char:"\ud83c\udfd8",fitzpatrick_scale:!1,category:"travel_and_places"},european_castle:{keywords:["building","royalty","history"],char:"\ud83c\udff0",fitzpatrick_scale:!1,category:"travel_and_places"},japanese_castle:{keywords:["photo","building"],char:"\ud83c\udfef",fitzpatrick_scale:!1,category:"travel_and_places"},stadium:{keywords:["photo","place","sports","concert","venue"],char:"\ud83c\udfdf",fitzpatrick_scale:!1,category:"travel_and_places"},statue_of_liberty:{keywords:["american","newyork"],char:"\ud83d\uddfd",fitzpatrick_scale:!1,category:"travel_and_places"},house:{keywords:["building","home"],char:"\ud83c\udfe0",fitzpatrick_scale:!1,category:"travel_and_places"},house_with_garden:{keywords:["home","plant","nature"],char:"\ud83c\udfe1",fitzpatrick_scale:!1,category:"travel_and_places"},derelict_house:{keywords:["abandon","evict","broken","building"],char:"\ud83c\udfda",fitzpatrick_scale:!1,category:"travel_and_places"},office:{keywords:["building","bureau","work"],char:"\ud83c\udfe2",fitzpatrick_scale:!1,category:"travel_and_places"},department_store:{keywords:["building","shopping","mall"],char:"\ud83c\udfec",fitzpatrick_scale:!1,category:"travel_and_places"},post_office:{keywords:["building","envelope","communication"],char:"\ud83c\udfe3",fitzpatrick_scale:!1,category:"travel_and_places"},european_post_office:{keywords:["building","email"],char:"\ud83c\udfe4",fitzpatrick_scale:!1,category:"travel_and_places"},hospital:{keywords:["building","health","surgery","doctor"],char:"\ud83c\udfe5",fitzpatrick_scale:!1,category:"travel_and_places"},bank:{keywords:["building","money","sales","cash","business","enterprise"],char:"\ud83c\udfe6",fitzpatrick_scale:!1,category:"travel_and_places"},hotel:{keywords:["building","accomodation","checkin"],char:"\ud83c\udfe8",fitzpatrick_scale:!1,category:"travel_and_places"},convenience_store:{keywords:["building","shopping","groceries"],char:"\ud83c\udfea",fitzpatrick_scale:!1,category:"travel_and_places"},school:{keywords:["building","student","education","learn","teach"],char:"\ud83c\udfeb",fitzpatrick_scale:!1,category:"travel_and_places"},love_hotel:{keywords:["like","affection","dating"],char:"\ud83c\udfe9",fitzpatrick_scale:!1,category:"travel_and_places"},wedding:{keywords:["love","like","affection","couple","marriage","bride","groom"],char:"\ud83d\udc92",fitzpatrick_scale:!1,category:"travel_and_places"},classical_building:{keywords:["art","culture","history"],char:"\ud83c\udfdb",fitzpatrick_scale:!1,category:"travel_and_places"},church:{keywords:["building","religion","christ"],char:"\u26ea",fitzpatrick_scale:!1,category:"travel_and_places"},mosque:{keywords:["islam","worship","minaret"],char:"\ud83d\udd4c",fitzpatrick_scale:!1,category:"travel_and_places"},synagogue:{keywords:["judaism","worship","temple","jewish"],char:"\ud83d\udd4d",fitzpatrick_scale:!1,category:"travel_and_places"},kaaba:{keywords:["mecca","mosque","islam"],char:"\ud83d\udd4b",fitzpatrick_scale:!1,category:"travel_and_places"},shinto_shrine:{keywords:["temple","japan","kyoto"],char:"\u26e9",fitzpatrick_scale:!1,category:"travel_and_places"},watch:{keywords:["time","accessories"],char:"\u231a",fitzpatrick_scale:!1,category:"objects"},iphone:{keywords:["technology","apple","gadgets","dial"],char:"\ud83d\udcf1",fitzpatrick_scale:!1,category:"objects"},calling:{keywords:["iphone","incoming"],char:"\ud83d\udcf2",fitzpatrick_scale:!1,category:"objects"},computer:{keywords:["technology","laptop","screen","display","monitor"],char:"\ud83d\udcbb",fitzpatrick_scale:!1,category:"objects"},keyboard:{keywords:["technology","computer","type","input","text"],char:"\u2328",fitzpatrick_scale:!1,category:"objects"},desktop_computer:{keywords:["technology","computing","screen"],char:"\ud83d\udda5",fitzpatrick_scale:!1,category:"objects"},printer:{keywords:["paper","ink"],char:"\ud83d\udda8",fitzpatrick_scale:!1,category:"objects"},computer_mouse:{keywords:["click"],char:"\ud83d\uddb1",fitzpatrick_scale:!1,category:"objects"},trackball:{keywords:["technology","trackpad"],char:"\ud83d\uddb2",fitzpatrick_scale:!1,category:"objects"},joystick:{keywords:["game","play"],char:"\ud83d\udd79",fitzpatrick_scale:!1,category:"objects"},clamp:{keywords:["tool"],char:"\ud83d\udddc",fitzpatrick_scale:!1,category:"objects"},minidisc:{keywords:["technology","record","data","disk","90s"],char:"\ud83d\udcbd",fitzpatrick_scale:!1,category:"objects"},floppy_disk:{keywords:["oldschool","technology","save","90s","80s"],char:"\ud83d\udcbe",fitzpatrick_scale:!1,category:"objects"},cd:{keywords:["technology","dvd","disk","disc","90s"],char:"\ud83d\udcbf",fitzpatrick_scale:!1,category:"objects"},dvd:{keywords:["cd","disk","disc"],char:"\ud83d\udcc0",fitzpatrick_scale:!1,category:"objects"},vhs:{keywords:["record","video","oldschool","90s","80s"],char:"\ud83d\udcfc",fitzpatrick_scale:!1,category:"objects"},camera:{keywords:["gadgets","photography"],char:"\ud83d\udcf7",fitzpatrick_scale:!1,category:"objects"},camera_flash:{keywords:["photography","gadgets"],char:"\ud83d\udcf8",fitzpatrick_scale:!1,category:"objects"},video_camera:{keywords:["film","record"],char:"\ud83d\udcf9",fitzpatrick_scale:!1,category:"objects"},movie_camera:{keywords:["film","record"],char:"\ud83c\udfa5",fitzpatrick_scale:!1,category:"objects"},film_projector:{keywords:["video","tape","record","movie"],char:"\ud83d\udcfd",fitzpatrick_scale:!1,category:"objects"},film_strip:{keywords:["movie"],char:"\ud83c\udf9e",fitzpatrick_scale:!1,category:"objects"},telephone_receiver:{keywords:["technology","communication","dial"],char:"\ud83d\udcde",fitzpatrick_scale:!1,category:"objects"},phone:{keywords:["technology","communication","dial","telephone"],char:"\u260e\ufe0f",fitzpatrick_scale:!1,category:"objects"},pager:{keywords:["bbcall","oldschool","90s"],char:"\ud83d\udcdf",fitzpatrick_scale:!1,category:"objects"},fax:{keywords:["communication","technology"],char:"\ud83d\udce0",fitzpatrick_scale:!1,category:"objects"},tv:{keywords:["technology","program","oldschool","show","television"],char:"\ud83d\udcfa",fitzpatrick_scale:!1,category:"objects"},radio:{keywords:["communication","music","podcast","program"],char:"\ud83d\udcfb",fitzpatrick_scale:!1,category:"objects"},studio_microphone:{keywords:["sing","recording","artist","talkshow"],char:"\ud83c\udf99",fitzpatrick_scale:!1,category:"objects"},level_slider:{keywords:["scale"],char:"\ud83c\udf9a",fitzpatrick_scale:!1,category:"objects"},control_knobs:{keywords:["dial"],char:"\ud83c\udf9b",fitzpatrick_scale:!1,category:"objects"},compass:{keywords:["magnetic","navigation","orienteering"],char:"\ud83e\udded",fitzpatrick_scale:!1,category:"objects"},stopwatch:{keywords:["time","deadline"],char:"\u23f1",fitzpatrick_scale:!1,category:"objects"},timer_clock:{keywords:["alarm"],char:"\u23f2",fitzpatrick_scale:!1,category:"objects"},alarm_clock:{keywords:["time","wake"],char:"\u23f0",fitzpatrick_scale:!1,category:"objects"},mantelpiece_clock:{keywords:["time"],char:"\ud83d\udd70",fitzpatrick_scale:!1,category:"objects"},hourglass_flowing_sand:{keywords:["oldschool","time","countdown"],char:"\u23f3",fitzpatrick_scale:!1,category:"objects"},hourglass:{keywords:["time","clock","oldschool","limit","exam","quiz","test"],char:"\u231b",fitzpatrick_scale:!1,category:"objects"},satellite:{keywords:["communication","future","radio","space"],char:"\ud83d\udce1",fitzpatrick_scale:!1,category:"objects"},battery:{keywords:["power","energy","sustain"],char:"\ud83d\udd0b",fitzpatrick_scale:!1,category:"objects"},electric_plug:{keywords:["charger","power"],char:"\ud83d\udd0c",fitzpatrick_scale:!1,category:"objects"},bulb:{keywords:["light","electricity","idea"],char:"\ud83d\udca1",fitzpatrick_scale:!1,category:"objects"},flashlight:{keywords:["dark","camping","sight","night"],char:"\ud83d\udd26",fitzpatrick_scale:!1,category:"objects"},candle:{keywords:["fire","wax"],char:"\ud83d\udd6f",fitzpatrick_scale:!1,category:"objects"},fire_extinguisher:{keywords:["quench"],char:"\ud83e\uddef",fitzpatrick_scale:!1,category:"objects"},wastebasket:{keywords:["bin","trash","rubbish","garbage","toss"],char:"\ud83d\uddd1",fitzpatrick_scale:!1,category:"objects"},oil_drum:{keywords:["barrell"],char:"\ud83d\udee2",fitzpatrick_scale:!1,category:"objects"},money_with_wings:{keywords:["dollar","bills","payment","sale"],char:"\ud83d\udcb8",fitzpatrick_scale:!1,category:"objects"},dollar:{keywords:["money","sales","bill","currency"],char:"\ud83d\udcb5",fitzpatrick_scale:!1,category:"objects"},yen:{keywords:["money","sales","japanese","dollar","currency"],char:"\ud83d\udcb4",fitzpatrick_scale:!1,category:"objects"},euro:{keywords:["money","sales","dollar","currency"],char:"\ud83d\udcb6",fitzpatrick_scale:!1,category:"objects"},pound:{keywords:["british","sterling","money","sales","bills","uk","england","currency"],char:"\ud83d\udcb7",fitzpatrick_scale:!1,category:"objects"},moneybag:{keywords:["dollar","payment","coins","sale"],char:"\ud83d\udcb0",fitzpatrick_scale:!1,category:"objects"},credit_card:{keywords:["money","sales","dollar","bill","payment","shopping"],char:"\ud83d\udcb3",fitzpatrick_scale:!1,category:"objects"},gem:{keywords:["blue","ruby","diamond","jewelry"],char:"\ud83d\udc8e",fitzpatrick_scale:!1,category:"objects"},balance_scale:{keywords:["law","fairness","weight"],char:"\u2696",fitzpatrick_scale:!1,category:"objects"},toolbox:{keywords:["tools","diy","fix","maintainer","mechanic"],char:"\ud83e\uddf0",fitzpatrick_scale:!1,category:"objects"},wrench:{keywords:["tools","diy","ikea","fix","maintainer"],char:"\ud83d\udd27",fitzpatrick_scale:!1,category:"objects"},hammer:{keywords:["tools","build","create"],char:"\ud83d\udd28",fitzpatrick_scale:!1,category:"objects"},hammer_and_pick:{keywords:["tools","build","create"],char:"\u2692",fitzpatrick_scale:!1,category:"objects"},hammer_and_wrench:{keywords:["tools","build","create"],char:"\ud83d\udee0",fitzpatrick_scale:!1,category:"objects"},pick:{keywords:["tools","dig"],char:"\u26cf",fitzpatrick_scale:!1,category:"objects"},nut_and_bolt:{keywords:["handy","tools","fix"],char:"\ud83d\udd29",fitzpatrick_scale:!1,category:"objects"},gear:{keywords:["cog"],char:"\u2699",fitzpatrick_scale:!1,category:"objects"},brick:{keywords:["bricks"],char:"\ud83e\uddf1",fitzpatrick_scale:!1,category:"objects"},chains:{keywords:["lock","arrest"],char:"\u26d3",fitzpatrick_scale:!1,category:"objects"},magnet:{keywords:["attraction","magnetic"],char:"\ud83e\uddf2",fitzpatrick_scale:!1,category:"objects"},gun:{keywords:["violence","weapon","pistol","revolver"],char:"\ud83d\udd2b",fitzpatrick_scale:!1,category:"objects"},bomb:{keywords:["boom","explode","explosion","terrorism"],char:"\ud83d\udca3",fitzpatrick_scale:!1,category:"objects"},firecracker:{keywords:["dynamite","boom","explode","explosion","explosive"],char:"\ud83e\udde8",fitzpatrick_scale:!1,category:"objects"},hocho:{keywords:["knife","blade","cutlery","kitchen","weapon"],char:"\ud83d\udd2a",fitzpatrick_scale:!1,category:"objects"},dagger:{keywords:["weapon"],char:"\ud83d\udde1",fitzpatrick_scale:!1,category:"objects"},crossed_swords:{keywords:["weapon"],char:"\u2694",fitzpatrick_scale:!1,category:"objects"},shield:{keywords:["protection","security"],char:"\ud83d\udee1",fitzpatrick_scale:!1,category:"objects"},smoking:{keywords:["kills","tobacco","cigarette","joint","smoke"],char:"\ud83d\udeac",fitzpatrick_scale:!1,category:"objects"},skull_and_crossbones:{keywords:["poison","danger","deadly","scary","death","pirate","evil"],char:"\u2620",fitzpatrick_scale:!1,category:"objects"},coffin:{keywords:["vampire","dead","die","death","rip","graveyard","cemetery","casket","funeral","box"],char:"\u26b0",fitzpatrick_scale:!1,category:"objects"},funeral_urn:{keywords:["dead","die","death","rip","ashes"],char:"\u26b1",fitzpatrick_scale:!1,category:"objects"},amphora:{keywords:["vase","jar"],char:"\ud83c\udffa",fitzpatrick_scale:!1,category:"objects"},crystal_ball:{keywords:["disco","party","magic","circus","fortune_teller"],char:"\ud83d\udd2e",fitzpatrick_scale:!1,category:"objects"},prayer_beads:{keywords:["dhikr","religious"],char:"\ud83d\udcff",fitzpatrick_scale:!1,category:"objects"},nazar_amulet:{keywords:["bead","charm"],char:"\ud83e\uddff",fitzpatrick_scale:!1,category:"objects"},barber:{keywords:["hair","salon","style"],char:"\ud83d\udc88",fitzpatrick_scale:!1,category:"objects"},alembic:{keywords:["distilling","science","experiment","chemistry"],char:"\u2697",fitzpatrick_scale:!1,category:"objects"},telescope:{keywords:["stars","space","zoom","science","astronomy"],char:"\ud83d\udd2d",fitzpatrick_scale:!1,category:"objects"},microscope:{keywords:["laboratory","experiment","zoomin","science","study"],char:"\ud83d\udd2c",fitzpatrick_scale:!1,category:"objects"},hole:{keywords:["embarrassing"],char:"\ud83d\udd73",fitzpatrick_scale:!1,category:"objects"},pill:{keywords:["health","medicine","doctor","pharmacy","drug"],char:"\ud83d\udc8a",fitzpatrick_scale:!1,category:"objects"},syringe:{keywords:["health","hospital","drugs","blood","medicine","needle","doctor","nurse"],char:"\ud83d\udc89",fitzpatrick_scale:!1,category:"objects"},dna:{keywords:["biologist","genetics","life"],char:"\ud83e\uddec",fitzpatrick_scale:!1,category:"objects"},microbe:{keywords:["amoeba","bacteria","germs"],char:"\ud83e\udda0",fitzpatrick_scale:!1,category:"objects"},petri_dish:{keywords:["bacteria","biology","culture","lab"],char:"\ud83e\uddeb",fitzpatrick_scale:!1,category:"objects"},test_tube:{keywords:["chemistry","experiment","lab","science"],char:"\ud83e\uddea",fitzpatrick_scale:!1,category:"objects"},thermometer:{keywords:["weather","temperature","hot","cold"],char:"\ud83c\udf21",fitzpatrick_scale:!1,category:"objects"},broom:{keywords:["cleaning","sweeping","witch"],char:"\ud83e\uddf9",fitzpatrick_scale:!1,category:"objects"},basket:{keywords:["laundry"],char:"\ud83e\uddfa",fitzpatrick_scale:!1,category:"objects"},toilet_paper:{keywords:["roll"],char:"\ud83e\uddfb",fitzpatrick_scale:!1,category:"objects"},label:{keywords:["sale","tag"],char:"\ud83c\udff7",fitzpatrick_scale:!1,category:"objects"},bookmark:{keywords:["favorite","label","save"],char:"\ud83d\udd16",fitzpatrick_scale:!1,category:"objects"},toilet:{keywords:["restroom","wc","washroom","bathroom","potty"],char:"\ud83d\udebd",fitzpatrick_scale:!1,category:"objects"},shower:{keywords:["clean","water","bathroom"],char:"\ud83d\udebf",fitzpatrick_scale:!1,category:"objects"},bathtub:{keywords:["clean","shower","bathroom"],char:"\ud83d\udec1",fitzpatrick_scale:!1,category:"objects"},soap:{keywords:["bar","bathing","cleaning","lather"],char:"\ud83e\uddfc",fitzpatrick_scale:!1,category:"objects"},sponge:{keywords:["absorbing","cleaning","porous"],char:"\ud83e\uddfd",fitzpatrick_scale:!1,category:"objects"},lotion_bottle:{keywords:["moisturizer","sunscreen"],char:"\ud83e\uddf4",fitzpatrick_scale:!1,category:"objects"},key:{keywords:["lock","door","password"],char:"\ud83d\udd11",fitzpatrick_scale:!1,category:"objects"},old_key:{keywords:["lock","door","password"],char:"\ud83d\udddd",fitzpatrick_scale:!1,category:"objects"},couch_and_lamp:{keywords:["read","chill"],char:"\ud83d\udecb",fitzpatrick_scale:!1,category:"objects"},sleeping_bed:{keywords:["bed","rest"],char:"\ud83d\udecc",fitzpatrick_scale:!0,category:"objects"},bed:{keywords:["sleep","rest"],char:"\ud83d\udecf",fitzpatrick_scale:!1,category:"objects"},door:{keywords:["house","entry","exit"],char:"\ud83d\udeaa",fitzpatrick_scale:!1,category:"objects"},bellhop_bell:{keywords:["service"],char:"\ud83d\udece",fitzpatrick_scale:!1,category:"objects"},teddy_bear:{keywords:["plush","stuffed"],char:"\ud83e\uddf8",fitzpatrick_scale:!1,category:"objects"},framed_picture:{keywords:["photography"],char:"\ud83d\uddbc",fitzpatrick_scale:!1,category:"objects"},world_map:{keywords:["location","direction"],char:"\ud83d\uddfa",fitzpatrick_scale:!1,category:"objects"},parasol_on_ground:{keywords:["weather","summer"],char:"\u26f1",fitzpatrick_scale:!1,category:"objects"},moyai:{keywords:["rock","easter island","moai"],char:"\ud83d\uddff",fitzpatrick_scale:!1,category:"objects"},shopping:{keywords:["mall","buy","purchase"],char:"\ud83d\udecd",fitzpatrick_scale:!1,category:"objects"},shopping_cart:{keywords:["trolley"],char:"\ud83d\uded2",fitzpatrick_scale:!1,category:"objects"},balloon:{keywords:["party","celebration","birthday","circus"],char:"\ud83c\udf88",fitzpatrick_scale:!1,category:"objects"},flags:{keywords:["fish","japanese","koinobori","carp","banner"],char:"\ud83c\udf8f",fitzpatrick_scale:!1,category:"objects"},ribbon:{keywords:["decoration","pink","girl","bowtie"],char:"\ud83c\udf80",fitzpatrick_scale:!1,category:"objects"},gift:{keywords:["present","birthday","christmas","xmas"],char:"\ud83c\udf81",fitzpatrick_scale:!1,category:"objects"},confetti_ball:{keywords:["festival","party","birthday","circus"],char:"\ud83c\udf8a",fitzpatrick_scale:!1,category:"objects"},tada:{keywords:["party","congratulations","birthday","magic","circus","celebration"],char:"\ud83c\udf89",fitzpatrick_scale:!1,category:"objects"},dolls:{keywords:["japanese","toy","kimono"],char:"\ud83c\udf8e",fitzpatrick_scale:!1,category:"objects"},wind_chime:{keywords:["nature","ding","spring","bell"],char:"\ud83c\udf90",fitzpatrick_scale:!1,category:"objects"},crossed_flags:{keywords:["japanese","nation","country","border"],char:"\ud83c\udf8c",fitzpatrick_scale:!1,category:"objects"},izakaya_lantern:{keywords:["light","paper","halloween","spooky"],char:"\ud83c\udfee",fitzpatrick_scale:!1,category:"objects"},red_envelope:{keywords:["gift"],char:"\ud83e\udde7",fitzpatrick_scale:!1,category:"objects"},email:{keywords:["letter","postal","inbox","communication"],char:"\u2709\ufe0f",fitzpatrick_scale:!1,category:"objects"},envelope_with_arrow:{keywords:["email","communication"],char:"\ud83d\udce9",fitzpatrick_scale:!1,category:"objects"},incoming_envelope:{keywords:["email","inbox"],char:"\ud83d\udce8",fitzpatrick_scale:!1,category:"objects"},"e-mail":{keywords:["communication","inbox"],char:"\ud83d\udce7",fitzpatrick_scale:!1,category:"objects"},love_letter:{keywords:["email","like","affection","envelope","valentines"],char:"\ud83d\udc8c",fitzpatrick_scale:!1,category:"objects"},postbox:{keywords:["email","letter","envelope"],char:"\ud83d\udcee",fitzpatrick_scale:!1,category:"objects"},mailbox_closed:{keywords:["email","communication","inbox"],char:"\ud83d\udcea",fitzpatrick_scale:!1,category:"objects"},mailbox:{keywords:["email","inbox","communication"],char:"\ud83d\udceb",fitzpatrick_scale:!1,category:"objects"},mailbox_with_mail:{keywords:["email","inbox","communication"],char:"\ud83d\udcec",fitzpatrick_scale:!1,category:"objects"},mailbox_with_no_mail:{keywords:["email","inbox"],char:"\ud83d\udced",fitzpatrick_scale:!1,category:"objects"},package:{keywords:["mail","gift","cardboard","box","moving"],char:"\ud83d\udce6",fitzpatrick_scale:!1,category:"objects"},postal_horn:{keywords:["instrument","music"],char:"\ud83d\udcef",fitzpatrick_scale:!1,category:"objects"},inbox_tray:{keywords:["email","documents"],char:"\ud83d\udce5",fitzpatrick_scale:!1,category:"objects"},outbox_tray:{keywords:["inbox","email"],char:"\ud83d\udce4",fitzpatrick_scale:!1,category:"objects"},scroll:{keywords:["documents","ancient","history","paper"],char:"\ud83d\udcdc",fitzpatrick_scale:!1,category:"objects"},page_with_curl:{keywords:["documents","office","paper"],char:"\ud83d\udcc3",fitzpatrick_scale:!1,category:"objects"},bookmark_tabs:{keywords:["favorite","save","order","tidy"],char:"\ud83d\udcd1",fitzpatrick_scale:!1,category:"objects"},receipt:{keywords:["accounting","expenses"],char:"\ud83e\uddfe",fitzpatrick_scale:!1,category:"objects"},bar_chart:{keywords:["graph","presentation","stats"],char:"\ud83d\udcca",fitzpatrick_scale:!1,category:"objects"},chart_with_upwards_trend:{keywords:["graph","presentation","stats","recovery","business","economics","money","sales","good","success"],char:"\ud83d\udcc8",fitzpatrick_scale:!1,category:"objects"},chart_with_downwards_trend:{keywords:["graph","presentation","stats","recession","business","economics","money","sales","bad","failure"],char:"\ud83d\udcc9",fitzpatrick_scale:!1,category:"objects"},page_facing_up:{keywords:["documents","office","paper","information"],char:"\ud83d\udcc4",fitzpatrick_scale:!1,category:"objects"},date:{keywords:["calendar","schedule"],char:"\ud83d\udcc5",fitzpatrick_scale:!1,category:"objects"},calendar:{keywords:["schedule","date","planning"],char:"\ud83d\udcc6",fitzpatrick_scale:!1,category:"objects"},spiral_calendar:{keywords:["date","schedule","planning"],char:"\ud83d\uddd3",fitzpatrick_scale:!1,category:"objects"},card_index:{keywords:["business","stationery"],char:"\ud83d\udcc7",fitzpatrick_scale:!1,category:"objects"},card_file_box:{keywords:["business","stationery"],char:"\ud83d\uddc3",fitzpatrick_scale:!1,category:"objects"},ballot_box:{keywords:["election","vote"],char:"\ud83d\uddf3",fitzpatrick_scale:!1,category:"objects"},file_cabinet:{keywords:["filing","organizing"],char:"\ud83d\uddc4",fitzpatrick_scale:!1,category:"objects"},clipboard:{keywords:["stationery","documents"],char:"\ud83d\udccb",fitzpatrick_scale:!1,category:"objects"},spiral_notepad:{keywords:["memo","stationery"],char:"\ud83d\uddd2",fitzpatrick_scale:!1,category:"objects"},file_folder:{keywords:["documents","business","office"],char:"\ud83d\udcc1",fitzpatrick_scale:!1,category:"objects"},open_file_folder:{keywords:["documents","load"],char:"\ud83d\udcc2",fitzpatrick_scale:!1,category:"objects"},card_index_dividers:{keywords:["organizing","business","stationery"],char:"\ud83d\uddc2",fitzpatrick_scale:!1,category:"objects"},newspaper_roll:{keywords:["press","headline"],char:"\ud83d\uddde",fitzpatrick_scale:!1,category:"objects"},newspaper:{keywords:["press","headline"],char:"\ud83d\udcf0",fitzpatrick_scale:!1,category:"objects"},notebook:{keywords:["stationery","record","notes","paper","study"],char:"\ud83d\udcd3",fitzpatrick_scale:!1,category:"objects"},closed_book:{keywords:["read","library","knowledge","textbook","learn"],char:"\ud83d\udcd5",fitzpatrick_scale:!1,category:"objects"},green_book:{keywords:["read","library","knowledge","study"],char:"\ud83d\udcd7",fitzpatrick_scale:!1,category:"objects"},blue_book:{keywords:["read","library","knowledge","learn","study"],char:"\ud83d\udcd8",fitzpatrick_scale:!1,category:"objects"},orange_book:{keywords:["read","library","knowledge","textbook","study"],char:"\ud83d\udcd9",fitzpatrick_scale:!1,category:"objects"},notebook_with_decorative_cover:{keywords:["classroom","notes","record","paper","study"],char:"\ud83d\udcd4",fitzpatrick_scale:!1,category:"objects"},ledger:{keywords:["notes","paper"],char:"\ud83d\udcd2",fitzpatrick_scale:!1,category:"objects"},books:{keywords:["literature","library","study"],char:"\ud83d\udcda",fitzpatrick_scale:!1,category:"objects"},open_book:{keywords:["book","read","library","knowledge","literature","learn","study"],char:"\ud83d\udcd6",fitzpatrick_scale:!1,category:"objects"},safety_pin:{keywords:["diaper"],char:"\ud83e\uddf7",fitzpatrick_scale:!1,category:"objects"},link:{keywords:["rings","url"],char:"\ud83d\udd17",fitzpatrick_scale:!1,category:"objects"},paperclip:{keywords:["documents","stationery"],char:"\ud83d\udcce",fitzpatrick_scale:!1,category:"objects"},paperclips:{keywords:["documents","stationery"],char:"\ud83d\udd87",fitzpatrick_scale:!1,category:"objects"},scissors:{keywords:["stationery","cut"],char:"\u2702\ufe0f",fitzpatrick_scale:!1,category:"objects"},triangular_ruler:{keywords:["stationery","math","architect","sketch"],char:"\ud83d\udcd0",fitzpatrick_scale:!1,category:"objects"},straight_ruler:{keywords:["stationery","calculate","length","math","school","drawing","architect","sketch"],char:"\ud83d\udccf",fitzpatrick_scale:!1,category:"objects"},abacus:{keywords:["calculation"],char:"\ud83e\uddee",fitzpatrick_scale:!1,category:"objects"},pushpin:{keywords:["stationery","mark","here"],char:"\ud83d\udccc",fitzpatrick_scale:!1,category:"objects"},round_pushpin:{keywords:["stationery","location","map","here"],char:"\ud83d\udccd",fitzpatrick_scale:!1,category:"objects"},triangular_flag_on_post:{keywords:["mark","milestone","place"],char:"\ud83d\udea9",fitzpatrick_scale:!1,category:"objects"},white_flag:{keywords:["losing","loser","lost","surrender","give up","fail"],char:"\ud83c\udff3",fitzpatrick_scale:!1,category:"objects"},black_flag:{keywords:["pirate"],char:"\ud83c\udff4",fitzpatrick_scale:!1,category:"objects"},rainbow_flag:{keywords:["flag","rainbow","pride","gay","lgbt","glbt","queer","homosexual","lesbian","bisexual","transgender"],char:"\ud83c\udff3\ufe0f\u200d\ud83c\udf08",fitzpatrick_scale:!1,category:"objects"},closed_lock_with_key:{keywords:["security","privacy"],char:"\ud83d\udd10",fitzpatrick_scale:!1,category:"objects"},lock:{keywords:["security","password","padlock"],char:"\ud83d\udd12",fitzpatrick_scale:!1,category:"objects"},unlock:{keywords:["privacy","security"],char:"\ud83d\udd13",fitzpatrick_scale:!1,category:"objects"},lock_with_ink_pen:{keywords:["security","secret"],char:"\ud83d\udd0f",fitzpatrick_scale:!1,category:"objects"},pen:{keywords:["stationery","writing","write"],char:"\ud83d\udd8a",fitzpatrick_scale:!1,category:"objects"},fountain_pen:{keywords:["stationery","writing","write"],char:"\ud83d\udd8b",fitzpatrick_scale:!1,category:"objects"},black_nib:{keywords:["pen","stationery","writing","write"],char:"\u2712\ufe0f",fitzpatrick_scale:!1,category:"objects"},memo:{keywords:["write","documents","stationery","pencil","paper","writing","legal","exam","quiz","test","study","compose"],char:"\ud83d\udcdd",fitzpatrick_scale:!1,category:"objects"},pencil2:{keywords:["stationery","write","paper","writing","school","study"],char:"\u270f\ufe0f",fitzpatrick_scale:!1,category:"objects"},crayon:{keywords:["drawing","creativity"],char:"\ud83d\udd8d",fitzpatrick_scale:!1,category:"objects"},paintbrush:{keywords:["drawing","creativity","art"],char:"\ud83d\udd8c",fitzpatrick_scale:!1,category:"objects"},mag:{keywords:["search","zoom","find","detective"],char:"\ud83d\udd0d",fitzpatrick_scale:!1,category:"objects"},mag_right:{keywords:["search","zoom","find","detective"],char:"\ud83d\udd0e",fitzpatrick_scale:!1,category:"objects"},heart:{keywords:["love","like","valentines"],char:"\u2764\ufe0f",fitzpatrick_scale:!1,category:"symbols"},orange_heart:{keywords:["love","like","affection","valentines"],char:"\ud83e\udde1",fitzpatrick_scale:!1,category:"symbols"},yellow_heart:{keywords:["love","like","affection","valentines"],char:"\ud83d\udc9b",fitzpatrick_scale:!1,category:"symbols"},green_heart:{keywords:["love","like","affection","valentines"],char:"\ud83d\udc9a",fitzpatrick_scale:!1,category:"symbols"},blue_heart:{keywords:["love","like","affection","valentines"],char:"\ud83d\udc99",fitzpatrick_scale:!1,category:"symbols"},purple_heart:{keywords:["love","like","affection","valentines"],char:"\ud83d\udc9c",fitzpatrick_scale:!1,category:"symbols"},black_heart:{keywords:["evil"],char:"\ud83d\udda4",fitzpatrick_scale:!1,category:"symbols"},broken_heart:{keywords:["sad","sorry","break","heart","heartbreak"],char:"\ud83d\udc94",fitzpatrick_scale:!1,category:"symbols"},heavy_heart_exclamation:{keywords:["decoration","love"],char:"\u2763",fitzpatrick_scale:!1,category:"symbols"},two_hearts:{keywords:["love","like","affection","valentines","heart"],char:"\ud83d\udc95",fitzpatrick_scale:!1,category:"symbols"},revolving_hearts:{keywords:["love","like","affection","valentines"],char:"\ud83d\udc9e",fitzpatrick_scale:!1,category:"symbols"},heartbeat:{keywords:["love","like","affection","valentines","pink","heart"],char:"\ud83d\udc93",fitzpatrick_scale:!1,category:"symbols"},heartpulse:{keywords:["like","love","affection","valentines","pink"],char:"\ud83d\udc97",fitzpatrick_scale:!1,category:"symbols"},sparkling_heart:{keywords:["love","like","affection","valentines"],char:"\ud83d\udc96",fitzpatrick_scale:!1,category:"symbols"},cupid:{keywords:["love","like","heart","affection","valentines"],char:"\ud83d\udc98",fitzpatrick_scale:!1,category:"symbols"},gift_heart:{keywords:["love","valentines"],char:"\ud83d\udc9d",fitzpatrick_scale:!1,category:"symbols"},heart_decoration:{keywords:["purple-square","love","like"],char:"\ud83d\udc9f",fitzpatrick_scale:!1,category:"symbols"},peace_symbol:{keywords:["hippie"],char:"\u262e",fitzpatrick_scale:!1,category:"symbols"},latin_cross:{keywords:["christianity"],char:"\u271d",fitzpatrick_scale:!1,category:"symbols"},star_and_crescent:{keywords:["islam"],char:"\u262a",fitzpatrick_scale:!1,category:"symbols"},om:{keywords:["hinduism","buddhism","sikhism","jainism"],char:"\ud83d\udd49",fitzpatrick_scale:!1,category:"symbols"},wheel_of_dharma:{keywords:["hinduism","buddhism","sikhism","jainism"],char:"\u2638",fitzpatrick_scale:!1,category:"symbols"},star_of_david:{keywords:["judaism"],char:"\u2721",fitzpatrick_scale:!1,category:"symbols"},six_pointed_star:{keywords:["purple-square","religion","jewish","hexagram"],char:"\ud83d\udd2f",fitzpatrick_scale:!1,category:"symbols"},menorah:{keywords:["hanukkah","candles","jewish"],char:"\ud83d\udd4e",fitzpatrick_scale:!1,category:"symbols"},yin_yang:{keywords:["balance"],char:"\u262f",fitzpatrick_scale:!1,category:"symbols"},orthodox_cross:{keywords:["suppedaneum","religion"],char:"\u2626",fitzpatrick_scale:!1,category:"symbols"},place_of_worship:{keywords:["religion","church","temple","prayer"],char:"\ud83d\uded0",fitzpatrick_scale:!1,category:"symbols"},ophiuchus:{keywords:["sign","purple-square","constellation","astrology"],char:"\u26ce",fitzpatrick_scale:!1,category:"symbols"},aries:{keywords:["sign","purple-square","zodiac","astrology"],char:"\u2648",fitzpatrick_scale:!1,category:"symbols"},taurus:{keywords:["purple-square","sign","zodiac","astrology"],char:"\u2649",fitzpatrick_scale:!1,category:"symbols"},gemini:{keywords:["sign","zodiac","purple-square","astrology"],char:"\u264a",fitzpatrick_scale:!1,category:"symbols"},cancer:{keywords:["sign","zodiac","purple-square","astrology"],char:"\u264b",fitzpatrick_scale:!1,category:"symbols"},leo:{keywords:["sign","purple-square","zodiac","astrology"],char:"\u264c",fitzpatrick_scale:!1,category:"symbols"},virgo:{keywords:["sign","zodiac","purple-square","astrology"],char:"\u264d",fitzpatrick_scale:!1,category:"symbols"},libra:{keywords:["sign","purple-square","zodiac","astrology"],char:"\u264e",fitzpatrick_scale:!1,category:"symbols"},scorpius:{keywords:["sign","zodiac","purple-square","astrology","scorpio"],char:"\u264f",fitzpatrick_scale:!1,category:"symbols"},sagittarius:{keywords:["sign","zodiac","purple-square","astrology"],char:"\u2650",fitzpatrick_scale:!1,category:"symbols"},capricorn:{keywords:["sign","zodiac","purple-square","astrology"],char:"\u2651",fitzpatrick_scale:!1,category:"symbols"},aquarius:{keywords:["sign","purple-square","zodiac","astrology"],char:"\u2652",fitzpatrick_scale:!1,category:"symbols"},pisces:{keywords:["purple-square","sign","zodiac","astrology"],char:"\u2653",fitzpatrick_scale:!1,category:"symbols"},id:{keywords:["purple-square","words"],char:"\ud83c\udd94",fitzpatrick_scale:!1,category:"symbols"},atom_symbol:{keywords:["science","physics","chemistry"],char:"\u269b",fitzpatrick_scale:!1,category:"symbols"},u7a7a:{keywords:["kanji","japanese","chinese","empty","sky","blue-square"],char:"\ud83c\ude33",fitzpatrick_scale:!1,category:"symbols"},u5272:{keywords:["cut","divide","chinese","kanji","pink-square"],char:"\ud83c\ude39",fitzpatrick_scale:!1,category:"symbols"},radioactive:{keywords:["nuclear","danger"],char:"\u2622",fitzpatrick_scale:!1,category:"symbols"},biohazard:{keywords:["danger"],char:"\u2623",fitzpatrick_scale:!1,category:"symbols"},mobile_phone_off:{keywords:["mute","orange-square","silence","quiet"],char:"\ud83d\udcf4",fitzpatrick_scale:!1,category:"symbols"},vibration_mode:{keywords:["orange-square","phone"],char:"\ud83d\udcf3",fitzpatrick_scale:!1,category:"symbols"},u6709:{keywords:["orange-square","chinese","have","kanji"],char:"\ud83c\ude36",fitzpatrick_scale:!1,category:"symbols"},u7121:{keywords:["nothing","chinese","kanji","japanese","orange-square"],char:"\ud83c\ude1a",fitzpatrick_scale:!1,category:"symbols"},u7533:{keywords:["chinese","japanese","kanji","orange-square"],char:"\ud83c\ude38",fitzpatrick_scale:!1,category:"symbols"},u55b6:{keywords:["japanese","opening hours","orange-square"],char:"\ud83c\ude3a",fitzpatrick_scale:!1,category:"symbols"},u6708:{keywords:["chinese","month","moon","japanese","orange-square","kanji"],char:"\ud83c\ude37\ufe0f",fitzpatrick_scale:!1,category:"symbols"},eight_pointed_black_star:{keywords:["orange-square","shape","polygon"],char:"\u2734\ufe0f",fitzpatrick_scale:!1,category:"symbols"},vs:{keywords:["words","orange-square"],char:"\ud83c\udd9a",fitzpatrick_scale:!1,category:"symbols"},accept:{keywords:["ok","good","chinese","kanji","agree","yes","orange-circle"],char:"\ud83c\ude51",fitzpatrick_scale:!1,category:"symbols"},white_flower:{keywords:["japanese","spring"],char:"\ud83d\udcae",fitzpatrick_scale:!1,category:"symbols"},ideograph_advantage:{keywords:["chinese","kanji","obtain","get","circle"],char:"\ud83c\ude50",fitzpatrick_scale:!1,category:"symbols"},secret:{keywords:["privacy","chinese","sshh","kanji","red-circle"],char:"\u3299\ufe0f",fitzpatrick_scale:!1,category:"symbols"},congratulations:{keywords:["chinese","kanji","japanese","red-circle"],char:"\u3297\ufe0f",fitzpatrick_scale:!1,category:"symbols"},u5408:{keywords:["japanese","chinese","join","kanji","red-square"],char:"\ud83c\ude34",fitzpatrick_scale:!1,category:"symbols"},u6e80:{keywords:["full","chinese","japanese","red-square","kanji"],char:"\ud83c\ude35",fitzpatrick_scale:!1,category:"symbols"},u7981:{keywords:["kanji","japanese","chinese","forbidden","limit","restricted","red-square"],char:"\ud83c\ude32",fitzpatrick_scale:!1,category:"symbols"},a:{keywords:["red-square","alphabet","letter"],char:"\ud83c\udd70\ufe0f",fitzpatrick_scale:!1,category:"symbols"},b:{keywords:["red-square","alphabet","letter"],char:"\ud83c\udd71\ufe0f",fitzpatrick_scale:!1,category:"symbols"},ab:{keywords:["red-square","alphabet"],char:"\ud83c\udd8e",fitzpatrick_scale:!1,category:"symbols"},cl:{keywords:["alphabet","words","red-square"],char:"\ud83c\udd91",fitzpatrick_scale:!1,category:"symbols"},o2:{keywords:["alphabet","red-square","letter"],char:"\ud83c\udd7e\ufe0f",fitzpatrick_scale:!1,category:"symbols"},sos:{keywords:["help","red-square","words","emergency","911"],char:"\ud83c\udd98",fitzpatrick_scale:!1,category:"symbols"},no_entry:{keywords:["limit","security","privacy","bad","denied","stop","circle"],char:"\u26d4",fitzpatrick_scale:!1,category:"symbols"},name_badge:{keywords:["fire","forbid"],char:"\ud83d\udcdb",fitzpatrick_scale:!1,category:"symbols"},no_entry_sign:{keywords:["forbid","stop","limit","denied","disallow","circle"],char:"\ud83d\udeab",fitzpatrick_scale:!1,category:"symbols"},x:{keywords:["no","delete","remove","cancel","red"],char:"\u274c",fitzpatrick_scale:!1,category:"symbols"},o:{keywords:["circle","round"],char:"\u2b55",fitzpatrick_scale:!1,category:"symbols"},stop_sign:{keywords:["stop"],char:"\ud83d\uded1",fitzpatrick_scale:!1,category:"symbols"},anger:{keywords:["angry","mad"],char:"\ud83d\udca2",fitzpatrick_scale:!1,category:"symbols"},hotsprings:{keywords:["bath","warm","relax"],char:"\u2668\ufe0f",fitzpatrick_scale:!1,category:"symbols"},no_pedestrians:{keywords:["rules","crossing","walking","circle"],char:"\ud83d\udeb7",fitzpatrick_scale:!1,category:"symbols"},do_not_litter:{keywords:["trash","bin","garbage","circle"],char:"\ud83d\udeaf",fitzpatrick_scale:!1,category:"symbols"},no_bicycles:{keywords:["cyclist","prohibited","circle"],char:"\ud83d\udeb3",fitzpatrick_scale:!1,category:"symbols"},"non-potable_water":{keywords:["drink","faucet","tap","circle"],char:"\ud83d\udeb1",fitzpatrick_scale:!1,category:"symbols"},underage:{keywords:["18","drink","pub","night","minor","circle"],char:"\ud83d\udd1e",fitzpatrick_scale:!1,category:"symbols"},no_mobile_phones:{keywords:["iphone","mute","circle"],char:"\ud83d\udcf5",fitzpatrick_scale:!1,category:"symbols"},exclamation:{keywords:["heavy_exclamation_mark","danger","surprise","punctuation","wow","warning"],char:"\u2757",fitzpatrick_scale:!1,category:"symbols"},grey_exclamation:{keywords:["surprise","punctuation","gray","wow","warning"],char:"\u2755",fitzpatrick_scale:!1,category:"symbols"},question:{keywords:["doubt","confused"],char:"\u2753",fitzpatrick_scale:!1,category:"symbols"},grey_question:{keywords:["doubts","gray","huh","confused"],char:"\u2754",fitzpatrick_scale:!1,category:"symbols"},bangbang:{keywords:["exclamation","surprise"],char:"\u203c\ufe0f",fitzpatrick_scale:!1,category:"symbols"},interrobang:{keywords:["wat","punctuation","surprise"],char:"\u2049\ufe0f",fitzpatrick_scale:!1,category:"symbols"},100:{keywords:["score","perfect","numbers","century","exam","quiz","test","pass","hundred"],char:"\ud83d\udcaf",fitzpatrick_scale:!1,category:"symbols"},low_brightness:{keywords:["sun","afternoon","warm","summer"],char:"\ud83d\udd05",fitzpatrick_scale:!1,category:"symbols"},high_brightness:{keywords:["sun","light"],char:"\ud83d\udd06",fitzpatrick_scale:!1,category:"symbols"},trident:{keywords:["weapon","spear"],char:"\ud83d\udd31",fitzpatrick_scale:!1,category:"symbols"},fleur_de_lis:{keywords:["decorative","scout"],char:"\u269c",fitzpatrick_scale:!1,category:"symbols"},part_alternation_mark:{keywords:["graph","presentation","stats","business","economics","bad"],char:"\u303d\ufe0f",fitzpatrick_scale:!1,category:"symbols"},warning:{keywords:["exclamation","wip","alert","error","problem","issue"],char:"\u26a0\ufe0f",fitzpatrick_scale:!1,category:"symbols"},children_crossing:{keywords:["school","warning","danger","sign","driving","yellow-diamond"],char:"\ud83d\udeb8",fitzpatrick_scale:!1,category:"symbols"},beginner:{keywords:["badge","shield"],char:"\ud83d\udd30",fitzpatrick_scale:!1,category:"symbols"},recycle:{keywords:["arrow","environment","garbage","trash"],char:"\u267b\ufe0f",fitzpatrick_scale:!1,category:"symbols"},u6307:{keywords:["chinese","point","green-square","kanji"],char:"\ud83c\ude2f",fitzpatrick_scale:!1,category:"symbols"},chart:{keywords:["green-square","graph","presentation","stats"],char:"\ud83d\udcb9",fitzpatrick_scale:!1,category:"symbols"},sparkle:{keywords:["stars","green-square","awesome","good","fireworks"],char:"\u2747\ufe0f",fitzpatrick_scale:!1,category:"symbols"},eight_spoked_asterisk:{keywords:["star","sparkle","green-square"],char:"\u2733\ufe0f",fitzpatrick_scale:!1,category:"symbols"},negative_squared_cross_mark:{keywords:["x","green-square","no","deny"],char:"\u274e",fitzpatrick_scale:!1,category:"symbols"},white_check_mark:{keywords:["green-square","ok","agree","vote","election","answer","tick"],char:"\u2705",fitzpatrick_scale:!1,category:"symbols"},diamond_shape_with_a_dot_inside:{keywords:["jewel","blue","gem","crystal","fancy"],char:"\ud83d\udca0",fitzpatrick_scale:!1,category:"symbols"},cyclone:{keywords:["weather","swirl","blue","cloud","vortex","spiral","whirlpool","spin","tornado","hurricane","typhoon"],char:"\ud83c\udf00",fitzpatrick_scale:!1,category:"symbols"},loop:{keywords:["tape","cassette"],char:"\u27bf",fitzpatrick_scale:!1,category:"symbols"},globe_with_meridians:{keywords:["earth","international","world","internet","interweb","i18n"],char:"\ud83c\udf10",fitzpatrick_scale:!1,category:"symbols"},m:{keywords:["alphabet","blue-circle","letter"],char:"\u24c2\ufe0f",fitzpatrick_scale:!1,category:"symbols"},atm:{keywords:["money","sales","cash","blue-square","payment","bank"],char:"\ud83c\udfe7",fitzpatrick_scale:!1,category:"symbols"},sa:{keywords:["japanese","blue-square","katakana"],char:"\ud83c\ude02\ufe0f",fitzpatrick_scale:!1,category:"symbols"},passport_control:{keywords:["custom","blue-square"],char:"\ud83d\udec2",fitzpatrick_scale:!1,category:"symbols"},customs:{keywords:["passport","border","blue-square"],char:"\ud83d\udec3",fitzpatrick_scale:!1,category:"symbols"},baggage_claim:{keywords:["blue-square","airport","transport"],char:"\ud83d\udec4",fitzpatrick_scale:!1,category:"symbols"},left_luggage:{keywords:["blue-square","travel"],char:"\ud83d\udec5",fitzpatrick_scale:!1,category:"symbols"},wheelchair:{keywords:["blue-square","disabled","a11y","accessibility"],char:"\u267f",fitzpatrick_scale:!1,category:"symbols"},no_smoking:{keywords:["cigarette","blue-square","smell","smoke"],char:"\ud83d\udead",fitzpatrick_scale:!1,category:"symbols"},wc:{keywords:["toilet","restroom","blue-square"],char:"\ud83d\udebe",fitzpatrick_scale:!1,category:"symbols"},parking:{keywords:["cars","blue-square","alphabet","letter"],char:"\ud83c\udd7f\ufe0f",fitzpatrick_scale:!1,category:"symbols"},potable_water:{keywords:["blue-square","liquid","restroom","cleaning","faucet"],char:"\ud83d\udeb0",fitzpatrick_scale:!1,category:"symbols"},mens:{keywords:["toilet","restroom","wc","blue-square","gender","male"],char:"\ud83d\udeb9",fitzpatrick_scale:!1,category:"symbols"},womens:{keywords:["purple-square","woman","female","toilet","loo","restroom","gender"],char:"\ud83d\udeba",fitzpatrick_scale:!1,category:"symbols"},baby_symbol:{keywords:["orange-square","child"],char:"\ud83d\udebc",fitzpatrick_scale:!1,category:"symbols"},restroom:{keywords:["blue-square","toilet","refresh","wc","gender"],char:"\ud83d\udebb",fitzpatrick_scale:!1,category:"symbols"},put_litter_in_its_place:{keywords:["blue-square","sign","human","info"],char:"\ud83d\udeae",fitzpatrick_scale:!1,category:"symbols"},cinema:{keywords:["blue-square","record","film","movie","curtain","stage","theater"],char:"\ud83c\udfa6",fitzpatrick_scale:!1,category:"symbols"},signal_strength:{keywords:["blue-square","reception","phone","internet","connection","wifi","bluetooth","bars"],char:"\ud83d\udcf6",fitzpatrick_scale:!1,category:"symbols"},koko:{keywords:["blue-square","here","katakana","japanese","destination"],char:"\ud83c\ude01",fitzpatrick_scale:!1,category:"symbols"},ng:{keywords:["blue-square","words","shape","icon"],char:"\ud83c\udd96",fitzpatrick_scale:!1,category:"symbols"},ok:{keywords:["good","agree","yes","blue-square"],char:"\ud83c\udd97",fitzpatrick_scale:!1,category:"symbols"},up:{keywords:["blue-square","above","high"],char:"\ud83c\udd99",fitzpatrick_scale:!1,category:"symbols"},cool:{keywords:["words","blue-square"],char:"\ud83c\udd92",fitzpatrick_scale:!1,category:"symbols"},new:{keywords:["blue-square","words","start"],char:"\ud83c\udd95",fitzpatrick_scale:!1,category:"symbols"},free:{keywords:["blue-square","words"],char:"\ud83c\udd93",fitzpatrick_scale:!1,category:"symbols"},zero:{keywords:["0","numbers","blue-square","null"],char:"0\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},one:{keywords:["blue-square","numbers","1"],char:"1\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},two:{keywords:["numbers","2","prime","blue-square"],char:"2\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},three:{keywords:["3","numbers","prime","blue-square"],char:"3\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},four:{keywords:["4","numbers","blue-square"],char:"4\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},five:{keywords:["5","numbers","blue-square","prime"],char:"5\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},six:{keywords:["6","numbers","blue-square"],char:"6\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},seven:{keywords:["7","numbers","blue-square","prime"],char:"7\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},eight:{keywords:["8","blue-square","numbers"],char:"8\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},nine:{keywords:["blue-square","numbers","9"],char:"9\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},keycap_ten:{keywords:["numbers","10","blue-square"],char:"\ud83d\udd1f",fitzpatrick_scale:!1,category:"symbols"},asterisk:{keywords:["star","keycap"],char:"*\u20e3",fitzpatrick_scale:!1,category:"symbols"},1234:{keywords:["numbers","blue-square"],char:"\ud83d\udd22",fitzpatrick_scale:!1,category:"symbols"},eject_button:{keywords:["blue-square"],char:"\u23cf\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_forward:{keywords:["blue-square","right","direction","play"],char:"\u25b6\ufe0f",fitzpatrick_scale:!1,category:"symbols"},pause_button:{keywords:["pause","blue-square"],char:"\u23f8",fitzpatrick_scale:!1,category:"symbols"},next_track_button:{keywords:["forward","next","blue-square"],char:"\u23ed",fitzpatrick_scale:!1,category:"symbols"},stop_button:{keywords:["blue-square"],char:"\u23f9",fitzpatrick_scale:!1,category:"symbols"},record_button:{keywords:["blue-square"],char:"\u23fa",fitzpatrick_scale:!1,category:"symbols"},play_or_pause_button:{keywords:["blue-square","play","pause"],char:"\u23ef",fitzpatrick_scale:!1,category:"symbols"},previous_track_button:{keywords:["backward"],char:"\u23ee",fitzpatrick_scale:!1,category:"symbols"},fast_forward:{keywords:["blue-square","play","speed","continue"],char:"\u23e9",fitzpatrick_scale:!1,category:"symbols"},rewind:{keywords:["play","blue-square"],char:"\u23ea",fitzpatrick_scale:!1,category:"symbols"},twisted_rightwards_arrows:{keywords:["blue-square","shuffle","music","random"],char:"\ud83d\udd00",fitzpatrick_scale:!1,category:"symbols"},repeat:{keywords:["loop","record"],char:"\ud83d\udd01",fitzpatrick_scale:!1,category:"symbols"},repeat_one:{keywords:["blue-square","loop"],char:"\ud83d\udd02",fitzpatrick_scale:!1,category:"symbols"},arrow_backward:{keywords:["blue-square","left","direction"],char:"\u25c0\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_up_small:{keywords:["blue-square","triangle","direction","point","forward","top"],char:"\ud83d\udd3c",fitzpatrick_scale:!1,category:"symbols"},arrow_down_small:{keywords:["blue-square","direction","bottom"],char:"\ud83d\udd3d",fitzpatrick_scale:!1,category:"symbols"},arrow_double_up:{keywords:["blue-square","direction","top"],char:"\u23eb",fitzpatrick_scale:!1,category:"symbols"},arrow_double_down:{keywords:["blue-square","direction","bottom"],char:"\u23ec",fitzpatrick_scale:!1,category:"symbols"},arrow_right:{keywords:["blue-square","next"],char:"\u27a1\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_left:{keywords:["blue-square","previous","back"],char:"\u2b05\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_up:{keywords:["blue-square","continue","top","direction"],char:"\u2b06\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_down:{keywords:["blue-square","direction","bottom"],char:"\u2b07\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_upper_right:{keywords:["blue-square","point","direction","diagonal","northeast"],char:"\u2197\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_lower_right:{keywords:["blue-square","direction","diagonal","southeast"],char:"\u2198\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_lower_left:{keywords:["blue-square","direction","diagonal","southwest"],char:"\u2199\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_upper_left:{keywords:["blue-square","point","direction","diagonal","northwest"],char:"\u2196\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_up_down:{keywords:["blue-square","direction","way","vertical"],char:"\u2195\ufe0f",fitzpatrick_scale:!1,category:"symbols"},left_right_arrow:{keywords:["shape","direction","horizontal","sideways"],char:"\u2194\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrows_counterclockwise:{keywords:["blue-square","sync","cycle"],char:"\ud83d\udd04",fitzpatrick_scale:!1,category:"symbols"},arrow_right_hook:{keywords:["blue-square","return","rotate","direction"],char:"\u21aa\ufe0f",fitzpatrick_scale:!1,category:"symbols"},leftwards_arrow_with_hook:{keywords:["back","return","blue-square","undo","enter"],char:"\u21a9\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_heading_up:{keywords:["blue-square","direction","top"],char:"\u2934\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_heading_down:{keywords:["blue-square","direction","bottom"],char:"\u2935\ufe0f",fitzpatrick_scale:!1,category:"symbols"},hash:{keywords:["symbol","blue-square","twitter"],char:"#\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},information_source:{keywords:["blue-square","alphabet","letter"],char:"\u2139\ufe0f",fitzpatrick_scale:!1,category:"symbols"},abc:{keywords:["blue-square","alphabet"],char:"\ud83d\udd24",fitzpatrick_scale:!1,category:"symbols"},abcd:{keywords:["blue-square","alphabet"],char:"\ud83d\udd21",fitzpatrick_scale:!1,category:"symbols"},capital_abcd:{keywords:["alphabet","words","blue-square"],char:"\ud83d\udd20",fitzpatrick_scale:!1,category:"symbols"},symbols:{keywords:["blue-square","music","note","ampersand","percent","glyphs","characters"],char:"\ud83d\udd23",fitzpatrick_scale:!1,category:"symbols"},musical_note:{keywords:["score","tone","sound"],char:"\ud83c\udfb5",fitzpatrick_scale:!1,category:"symbols"},notes:{keywords:["music","score"],char:"\ud83c\udfb6",fitzpatrick_scale:!1,category:"symbols"},wavy_dash:{keywords:["draw","line","moustache","mustache","squiggle","scribble"],char:"\u3030\ufe0f",fitzpatrick_scale:!1,category:"symbols"},curly_loop:{keywords:["scribble","draw","shape","squiggle"],char:"\u27b0",fitzpatrick_scale:!1,category:"symbols"},heavy_check_mark:{keywords:["ok","nike","answer","yes","tick"],char:"\u2714\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrows_clockwise:{keywords:["sync","cycle","round","repeat"],char:"\ud83d\udd03",fitzpatrick_scale:!1,category:"symbols"},heavy_plus_sign:{keywords:["math","calculation","addition","more","increase"],char:"\u2795",fitzpatrick_scale:!1,category:"symbols"},heavy_minus_sign:{keywords:["math","calculation","subtract","less"],char:"\u2796",fitzpatrick_scale:!1,category:"symbols"},heavy_division_sign:{keywords:["divide","math","calculation"],char:"\u2797",fitzpatrick_scale:!1,category:"symbols"},heavy_multiplication_x:{keywords:["math","calculation"],char:"\u2716\ufe0f",fitzpatrick_scale:!1,category:"symbols"},infinity:{keywords:["forever"],char:"\u267e",fitzpatrick_scale:!1,category:"symbols"},heavy_dollar_sign:{keywords:["money","sales","payment","currency","buck"],char:"\ud83d\udcb2",fitzpatrick_scale:!1,category:"symbols"},currency_exchange:{keywords:["money","sales","dollar","travel"],char:"\ud83d\udcb1",fitzpatrick_scale:!1,category:"symbols"},copyright:{keywords:["ip","license","circle","law","legal"],char:"\xa9\ufe0f",fitzpatrick_scale:!1,category:"symbols"},registered:{keywords:["alphabet","circle"],char:"\xae\ufe0f",fitzpatrick_scale:!1,category:"symbols"},tm:{keywords:["trademark","brand","law","legal"],char:"\u2122\ufe0f",fitzpatrick_scale:!1,category:"symbols"},end:{keywords:["words","arrow"],char:"\ud83d\udd1a",fitzpatrick_scale:!1,category:"symbols"},back:{keywords:["arrow","words","return"],char:"\ud83d\udd19",fitzpatrick_scale:!1,category:"symbols"},on:{keywords:["arrow","words"],char:"\ud83d\udd1b",fitzpatrick_scale:!1,category:"symbols"},top:{keywords:["words","blue-square"],char:"\ud83d\udd1d",fitzpatrick_scale:!1,category:"symbols"},soon:{keywords:["arrow","words"],char:"\ud83d\udd1c",fitzpatrick_scale:!1,category:"symbols"},ballot_box_with_check:{keywords:["ok","agree","confirm","black-square","vote","election","yes","tick"],char:"\u2611\ufe0f",fitzpatrick_scale:!1,category:"symbols"},radio_button:{keywords:["input","old","music","circle"],char:"\ud83d\udd18",fitzpatrick_scale:!1,category:"symbols"},white_circle:{keywords:["shape","round"],char:"\u26aa",fitzpatrick_scale:!1,category:"symbols"},black_circle:{keywords:["shape","button","round"],char:"\u26ab",fitzpatrick_scale:!1,category:"symbols"},red_circle:{keywords:["shape","error","danger"],char:"\ud83d\udd34",fitzpatrick_scale:!1,category:"symbols"},large_blue_circle:{keywords:["shape","icon","button"],char:"\ud83d\udd35",fitzpatrick_scale:!1,category:"symbols"},small_orange_diamond:{keywords:["shape","jewel","gem"],char:"\ud83d\udd38",fitzpatrick_scale:!1,category:"symbols"},small_blue_diamond:{keywords:["shape","jewel","gem"],char:"\ud83d\udd39",fitzpatrick_scale:!1,category:"symbols"},large_orange_diamond:{keywords:["shape","jewel","gem"],char:"\ud83d\udd36",fitzpatrick_scale:!1,category:"symbols"},large_blue_diamond:{keywords:["shape","jewel","gem"],char:"\ud83d\udd37",fitzpatrick_scale:!1,category:"symbols"},small_red_triangle:{keywords:["shape","direction","up","top"],char:"\ud83d\udd3a",fitzpatrick_scale:!1,category:"symbols"},black_small_square:{keywords:["shape","icon"],char:"\u25aa\ufe0f",fitzpatrick_scale:!1,category:"symbols"},white_small_square:{keywords:["shape","icon"],char:"\u25ab\ufe0f",fitzpatrick_scale:!1,category:"symbols"},black_large_square:{keywords:["shape","icon","button"],char:"\u2b1b",fitzpatrick_scale:!1,category:"symbols"},white_large_square:{keywords:["shape","icon","stone","button"],char:"\u2b1c",fitzpatrick_scale:!1,category:"symbols"},small_red_triangle_down:{keywords:["shape","direction","bottom"],char:"\ud83d\udd3b",fitzpatrick_scale:!1,category:"symbols"},black_medium_square:{keywords:["shape","button","icon"],char:"\u25fc\ufe0f",fitzpatrick_scale:!1,category:"symbols"},white_medium_square:{keywords:["shape","stone","icon"],char:"\u25fb\ufe0f",fitzpatrick_scale:!1,category:"symbols"},black_medium_small_square:{keywords:["icon","shape","button"],char:"\u25fe",fitzpatrick_scale:!1,category:"symbols"},white_medium_small_square:{keywords:["shape","stone","icon","button"],char:"\u25fd",fitzpatrick_scale:!1,category:"symbols"},black_square_button:{keywords:["shape","input","frame"],char:"\ud83d\udd32",fitzpatrick_scale:!1,category:"symbols"},white_square_button:{keywords:["shape","input"],char:"\ud83d\udd33",fitzpatrick_scale:!1,category:"symbols"},speaker:{keywords:["sound","volume","silence","broadcast"],char:"\ud83d\udd08",fitzpatrick_scale:!1,category:"symbols"},sound:{keywords:["volume","speaker","broadcast"],char:"\ud83d\udd09",fitzpatrick_scale:!1,category:"symbols"},loud_sound:{keywords:["volume","noise","noisy","speaker","broadcast"],char:"\ud83d\udd0a",fitzpatrick_scale:!1,category:"symbols"},mute:{keywords:["sound","volume","silence","quiet"],char:"\ud83d\udd07",fitzpatrick_scale:!1,category:"symbols"},mega:{keywords:["sound","speaker","volume"],char:"\ud83d\udce3",fitzpatrick_scale:!1,category:"symbols"},loudspeaker:{keywords:["volume","sound"],char:"\ud83d\udce2",fitzpatrick_scale:!1,category:"symbols"},bell:{keywords:["sound","notification","christmas","xmas","chime"],char:"\ud83d\udd14",fitzpatrick_scale:!1,category:"symbols"},no_bell:{keywords:["sound","volume","mute","quiet","silent"],char:"\ud83d\udd15",fitzpatrick_scale:!1,category:"symbols"},black_joker:{keywords:["poker","cards","game","play","magic"],char:"\ud83c\udccf",fitzpatrick_scale:!1,category:"symbols"},mahjong:{keywords:["game","play","chinese","kanji"],char:"\ud83c\udc04",fitzpatrick_scale:!1,category:"symbols"},spades:{keywords:["poker","cards","suits","magic"],char:"\u2660\ufe0f",fitzpatrick_scale:!1,category:"symbols"},clubs:{keywords:["poker","cards","magic","suits"],char:"\u2663\ufe0f",fitzpatrick_scale:!1,category:"symbols"},hearts:{keywords:["poker","cards","magic","suits"],char:"\u2665\ufe0f",fitzpatrick_scale:!1,category:"symbols"},diamonds:{keywords:["poker","cards","magic","suits"],char:"\u2666\ufe0f",fitzpatrick_scale:!1,category:"symbols"},flower_playing_cards:{keywords:["game","sunset","red"],char:"\ud83c\udfb4",fitzpatrick_scale:!1,category:"symbols"},thought_balloon:{keywords:["bubble","cloud","speech","thinking","dream"],char:"\ud83d\udcad",fitzpatrick_scale:!1,category:"symbols"},right_anger_bubble:{keywords:["caption","speech","thinking","mad"],char:"\ud83d\uddef",fitzpatrick_scale:!1,category:"symbols"},speech_balloon:{keywords:["bubble","words","message","talk","chatting"],char:"\ud83d\udcac",fitzpatrick_scale:!1,category:"symbols"},left_speech_bubble:{keywords:["words","message","talk","chatting"],char:"\ud83d\udde8",fitzpatrick_scale:!1,category:"symbols"},clock1:{keywords:["time","late","early","schedule"],char:"\ud83d\udd50",fitzpatrick_scale:!1,category:"symbols"},clock2:{keywords:["time","late","early","schedule"],char:"\ud83d\udd51",fitzpatrick_scale:!1,category:"symbols"},clock3:{keywords:["time","late","early","schedule"],char:"\ud83d\udd52",fitzpatrick_scale:!1,category:"symbols"},clock4:{keywords:["time","late","early","schedule"],char:"\ud83d\udd53",fitzpatrick_scale:!1,category:"symbols"},clock5:{keywords:["time","late","early","schedule"],char:"\ud83d\udd54",fitzpatrick_scale:!1,category:"symbols"},clock6:{keywords:["time","late","early","schedule","dawn","dusk"],char:"\ud83d\udd55",fitzpatrick_scale:!1,category:"symbols"},clock7:{keywords:["time","late","early","schedule"],char:"\ud83d\udd56",fitzpatrick_scale:!1,category:"symbols"},clock8:{keywords:["time","late","early","schedule"],char:"\ud83d\udd57",fitzpatrick_scale:!1,category:"symbols"},clock9:{keywords:["time","late","early","schedule"],char:"\ud83d\udd58",fitzpatrick_scale:!1,category:"symbols"},clock10:{keywords:["time","late","early","schedule"],char:"\ud83d\udd59",fitzpatrick_scale:!1,category:"symbols"},clock11:{keywords:["time","late","early","schedule"],char:"\ud83d\udd5a",fitzpatrick_scale:!1,category:"symbols"},clock12:{keywords:["time","noon","midnight","midday","late","early","schedule"],char:"\ud83d\udd5b",fitzpatrick_scale:!1,category:"symbols"},clock130:{keywords:["time","late","early","schedule"],char:"\ud83d\udd5c",fitzpatrick_scale:!1,category:"symbols"},clock230:{keywords:["time","late","early","schedule"],char:"\ud83d\udd5d",fitzpatrick_scale:!1,category:"symbols"},clock330:{keywords:["time","late","early","schedule"],char:"\ud83d\udd5e",fitzpatrick_scale:!1,category:"symbols"},clock430:{keywords:["time","late","early","schedule"],char:"\ud83d\udd5f",fitzpatrick_scale:!1,category:"symbols"},clock530:{keywords:["time","late","early","schedule"],char:"\ud83d\udd60",fitzpatrick_scale:!1,category:"symbols"},clock630:{keywords:["time","late","early","schedule"],char:"\ud83d\udd61",fitzpatrick_scale:!1,category:"symbols"},clock730:{keywords:["time","late","early","schedule"],char:"\ud83d\udd62",fitzpatrick_scale:!1,category:"symbols"},clock830:{keywords:["time","late","early","schedule"],char:"\ud83d\udd63",fitzpatrick_scale:!1,category:"symbols"},clock930:{keywords:["time","late","early","schedule"],char:"\ud83d\udd64",fitzpatrick_scale:!1,category:"symbols"},clock1030:{keywords:["time","late","early","schedule"],char:"\ud83d\udd65",fitzpatrick_scale:!1,category:"symbols"},clock1130:{keywords:["time","late","early","schedule"],char:"\ud83d\udd66",fitzpatrick_scale:!1,category:"symbols"},clock1230:{keywords:["time","late","early","schedule"],char:"\ud83d\udd67",fitzpatrick_scale:!1,category:"symbols"},afghanistan:{keywords:["af","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},aland_islands:{keywords:["\xc5land","islands","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddfd",fitzpatrick_scale:!1,category:"flags"},albania:{keywords:["al","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},algeria:{keywords:["dz","flag","nation","country","banner"],char:"\ud83c\udde9\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},american_samoa:{keywords:["american","ws","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},andorra:{keywords:["ad","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},angola:{keywords:["ao","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},anguilla:{keywords:["ai","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},antarctica:{keywords:["aq","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddf6",fitzpatrick_scale:!1,category:"flags"},antigua_barbuda:{keywords:["antigua","barbuda","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},argentina:{keywords:["ar","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},armenia:{keywords:["am","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},aruba:{keywords:["aw","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},australia:{keywords:["au","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},austria:{keywords:["at","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},azerbaijan:{keywords:["az","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},bahamas:{keywords:["bs","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},bahrain:{keywords:["bh","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},bangladesh:{keywords:["bd","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},barbados:{keywords:["bb","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\udde7",fitzpatrick_scale:!1,category:"flags"},belarus:{keywords:["by","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},belgium:{keywords:["be","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},belize:{keywords:["bz","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},benin:{keywords:["bj","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddef",fitzpatrick_scale:!1,category:"flags"},bermuda:{keywords:["bm","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},bhutan:{keywords:["bt","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},bolivia:{keywords:["bo","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},caribbean_netherlands:{keywords:["bonaire","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddf6",fitzpatrick_scale:!1,category:"flags"},bosnia_herzegovina:{keywords:["bosnia","herzegovina","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},botswana:{keywords:["bw","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},brazil:{keywords:["br","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},british_indian_ocean_territory:{keywords:["british","indian","ocean","territory","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},british_virgin_islands:{keywords:["british","virgin","islands","bvi","flag","nation","country","banner"],char:"\ud83c\uddfb\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},brunei:{keywords:["bn","darussalam","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},bulgaria:{keywords:["bg","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},burkina_faso:{keywords:["burkina","faso","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},burundi:{keywords:["bi","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},cape_verde:{keywords:["cabo","verde","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddfb",fitzpatrick_scale:!1,category:"flags"},cambodia:{keywords:["kh","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},cameroon:{keywords:["cm","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},canada:{keywords:["ca","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},canary_islands:{keywords:["canary","islands","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},cayman_islands:{keywords:["cayman","islands","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},central_african_republic:{keywords:["central","african","republic","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},chad:{keywords:["td","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},chile:{keywords:["flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},cn:{keywords:["china","chinese","prc","flag","country","nation","banner"],char:"\ud83c\udde8\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},christmas_island:{keywords:["christmas","island","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddfd",fitzpatrick_scale:!1,category:"flags"},cocos_islands:{keywords:["cocos","keeling","islands","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},colombia:{keywords:["co","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},comoros:{keywords:["km","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},congo_brazzaville:{keywords:["congo","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},congo_kinshasa:{keywords:["congo","democratic","republic","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},cook_islands:{keywords:["cook","islands","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},costa_rica:{keywords:["costa","rica","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},croatia:{keywords:["hr","flag","nation","country","banner"],char:"\ud83c\udded\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},cuba:{keywords:["cu","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},curacao:{keywords:["cura\xe7ao","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},cyprus:{keywords:["cy","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},czech_republic:{keywords:["cz","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},denmark:{keywords:["dk","flag","nation","country","banner"],char:"\ud83c\udde9\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},djibouti:{keywords:["dj","flag","nation","country","banner"],char:"\ud83c\udde9\ud83c\uddef",fitzpatrick_scale:!1,category:"flags"},dominica:{keywords:["dm","flag","nation","country","banner"],char:"\ud83c\udde9\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},dominican_republic:{keywords:["dominican","republic","flag","nation","country","banner"],char:"\ud83c\udde9\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},ecuador:{keywords:["ec","flag","nation","country","banner"],char:"\ud83c\uddea\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},egypt:{keywords:["eg","flag","nation","country","banner"],char:"\ud83c\uddea\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},el_salvador:{keywords:["el","salvador","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddfb",fitzpatrick_scale:!1,category:"flags"},equatorial_guinea:{keywords:["equatorial","gn","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddf6",fitzpatrick_scale:!1,category:"flags"},eritrea:{keywords:["er","flag","nation","country","banner"],char:"\ud83c\uddea\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},estonia:{keywords:["ee","flag","nation","country","banner"],char:"\ud83c\uddea\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},ethiopia:{keywords:["et","flag","nation","country","banner"],char:"\ud83c\uddea\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},eu:{keywords:["european","union","flag","banner"],char:"\ud83c\uddea\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},falkland_islands:{keywords:["falkland","islands","malvinas","flag","nation","country","banner"],char:"\ud83c\uddeb\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},faroe_islands:{keywords:["faroe","islands","flag","nation","country","banner"],char:"\ud83c\uddeb\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},fiji:{keywords:["fj","flag","nation","country","banner"],char:"\ud83c\uddeb\ud83c\uddef",fitzpatrick_scale:!1,category:"flags"},finland:{keywords:["fi","flag","nation","country","banner"],char:"\ud83c\uddeb\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},fr:{keywords:["banner","flag","nation","france","french","country"],char:"\ud83c\uddeb\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},french_guiana:{keywords:["french","guiana","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},french_polynesia:{keywords:["french","polynesia","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},french_southern_territories:{keywords:["french","southern","territories","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},gabon:{keywords:["ga","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},gambia:{keywords:["gm","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},georgia:{keywords:["ge","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},de:{keywords:["german","nation","flag","country","banner"],char:"\ud83c\udde9\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},ghana:{keywords:["gh","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},gibraltar:{keywords:["gi","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},greece:{keywords:["gr","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},greenland:{keywords:["gl","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},grenada:{keywords:["gd","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},guadeloupe:{keywords:["gp","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddf5",fitzpatrick_scale:!1,category:"flags"},guam:{keywords:["gu","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},guatemala:{keywords:["gt","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},guernsey:{keywords:["gg","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},guinea:{keywords:["gn","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},guinea_bissau:{keywords:["gw","bissau","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},guyana:{keywords:["gy","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},haiti:{keywords:["ht","flag","nation","country","banner"],char:"\ud83c\udded\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},honduras:{keywords:["hn","flag","nation","country","banner"],char:"\ud83c\udded\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},hong_kong:{keywords:["hong","kong","flag","nation","country","banner"],char:"\ud83c\udded\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},hungary:{keywords:["hu","flag","nation","country","banner"],char:"\ud83c\udded\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},iceland:{keywords:["is","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},india:{keywords:["in","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},indonesia:{keywords:["flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},iran:{keywords:["iran,","islamic","republic","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},iraq:{keywords:["iq","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddf6",fitzpatrick_scale:!1,category:"flags"},ireland:{keywords:["ie","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},isle_of_man:{keywords:["isle","man","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},israel:{keywords:["il","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},it:{keywords:["italy","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},cote_divoire:{keywords:["ivory","coast","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},jamaica:{keywords:["jm","flag","nation","country","banner"],char:"\ud83c\uddef\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},jp:{keywords:["japanese","nation","flag","country","banner"],char:"\ud83c\uddef\ud83c\uddf5",fitzpatrick_scale:!1,category:"flags"},jersey:{keywords:["je","flag","nation","country","banner"],char:"\ud83c\uddef\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},jordan:{keywords:["jo","flag","nation","country","banner"],char:"\ud83c\uddef\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},kazakhstan:{keywords:["kz","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},kenya:{keywords:["ke","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},kiribati:{keywords:["ki","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},kosovo:{keywords:["xk","flag","nation","country","banner"],char:"\ud83c\uddfd\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},kuwait:{keywords:["kw","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},kyrgyzstan:{keywords:["kg","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},laos:{keywords:["lao","democratic","republic","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},latvia:{keywords:["lv","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\uddfb",fitzpatrick_scale:!1,category:"flags"},lebanon:{keywords:["lb","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\udde7",fitzpatrick_scale:!1,category:"flags"},lesotho:{keywords:["ls","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},liberia:{keywords:["lr","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},libya:{keywords:["ly","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},liechtenstein:{keywords:["li","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},lithuania:{keywords:["lt","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},luxembourg:{keywords:["lu","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},macau:{keywords:["macao","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},macedonia:{keywords:["macedonia,","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},madagascar:{keywords:["mg","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},malawi:{keywords:["mw","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},malaysia:{keywords:["my","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},maldives:{keywords:["mv","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddfb",fitzpatrick_scale:!1,category:"flags"},mali:{keywords:["ml","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},malta:{keywords:["mt","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},marshall_islands:{keywords:["marshall","islands","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},martinique:{keywords:["mq","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf6",fitzpatrick_scale:!1,category:"flags"},mauritania:{keywords:["mr","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},mauritius:{keywords:["mu","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},mayotte:{keywords:["yt","flag","nation","country","banner"],char:"\ud83c\uddfe\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},mexico:{keywords:["mx","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddfd",fitzpatrick_scale:!1,category:"flags"},micronesia:{keywords:["micronesia,","federated","states","flag","nation","country","banner"],char:"\ud83c\uddeb\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},moldova:{keywords:["moldova,","republic","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},monaco:{keywords:["mc","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},mongolia:{keywords:["mn","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},montenegro:{keywords:["me","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},montserrat:{keywords:["ms","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},morocco:{keywords:["ma","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},mozambique:{keywords:["mz","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},myanmar:{keywords:["mm","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},namibia:{keywords:["na","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},nauru:{keywords:["nr","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},nepal:{keywords:["np","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddf5",fitzpatrick_scale:!1,category:"flags"},netherlands:{keywords:["nl","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},new_caledonia:{keywords:["new","caledonia","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},new_zealand:{keywords:["new","zealand","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},nicaragua:{keywords:["ni","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},niger:{keywords:["ne","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},nigeria:{keywords:["flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},niue:{keywords:["nu","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},norfolk_island:{keywords:["norfolk","island","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},northern_mariana_islands:{keywords:["northern","mariana","islands","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf5",fitzpatrick_scale:!1,category:"flags"},north_korea:{keywords:["north","korea","nation","flag","country","banner"],char:"\ud83c\uddf0\ud83c\uddf5",fitzpatrick_scale:!1,category:"flags"},norway:{keywords:["no","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},oman:{keywords:["om_symbol","flag","nation","country","banner"],char:"\ud83c\uddf4\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},pakistan:{keywords:["pk","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},palau:{keywords:["pw","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},palestinian_territories:{keywords:["palestine","palestinian","territories","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},panama:{keywords:["pa","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},papua_new_guinea:{keywords:["papua","new","guinea","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},paraguay:{keywords:["py","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},peru:{keywords:["pe","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},philippines:{keywords:["ph","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},pitcairn_islands:{keywords:["pitcairn","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},poland:{keywords:["pl","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},portugal:{keywords:["pt","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},puerto_rico:{keywords:["puerto","rico","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},qatar:{keywords:["qa","flag","nation","country","banner"],char:"\ud83c\uddf6\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},reunion:{keywords:["r\xe9union","flag","nation","country","banner"],char:"\ud83c\uddf7\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},romania:{keywords:["ro","flag","nation","country","banner"],char:"\ud83c\uddf7\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},ru:{keywords:["russian","federation","flag","nation","country","banner"],char:"\ud83c\uddf7\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},rwanda:{keywords:["rw","flag","nation","country","banner"],char:"\ud83c\uddf7\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},st_barthelemy:{keywords:["saint","barth\xe9lemy","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},st_helena:{keywords:["saint","helena","ascension","tristan","cunha","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},st_kitts_nevis:{keywords:["saint","kitts","nevis","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},st_lucia:{keywords:["saint","lucia","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},st_pierre_miquelon:{keywords:["saint","pierre","miquelon","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},st_vincent_grenadines:{keywords:["saint","vincent","grenadines","flag","nation","country","banner"],char:"\ud83c\uddfb\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},samoa:{keywords:["ws","flag","nation","country","banner"],char:"\ud83c\uddfc\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},san_marino:{keywords:["san","marino","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},sao_tome_principe:{keywords:["sao","tome","principe","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},saudi_arabia:{keywords:["flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},senegal:{keywords:["sn","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},serbia:{keywords:["rs","flag","nation","country","banner"],char:"\ud83c\uddf7\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},seychelles:{keywords:["sc","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},sierra_leone:{keywords:["sierra","leone","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},singapore:{keywords:["sg","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},sint_maarten:{keywords:["sint","maarten","dutch","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddfd",fitzpatrick_scale:!1,category:"flags"},slovakia:{keywords:["sk","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},slovenia:{keywords:["si","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},solomon_islands:{keywords:["solomon","islands","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\udde7",fitzpatrick_scale:!1,category:"flags"},somalia:{keywords:["so","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},south_africa:{keywords:["south","africa","flag","nation","country","banner"],char:"\ud83c\uddff\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},south_georgia_south_sandwich_islands:{keywords:["south","georgia","sandwich","islands","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},kr:{keywords:["south","korea","nation","flag","country","banner"],char:"\ud83c\uddf0\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},south_sudan:{keywords:["south","sd","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},es:{keywords:["spain","flag","nation","country","banner"],char:"\ud83c\uddea\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},sri_lanka:{keywords:["sri","lanka","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},sudan:{keywords:["sd","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},suriname:{keywords:["sr","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},swaziland:{keywords:["sz","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},sweden:{keywords:["se","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},switzerland:{keywords:["ch","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},syria:{keywords:["syrian","arab","republic","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},taiwan:{keywords:["tw","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},tajikistan:{keywords:["tj","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddef",fitzpatrick_scale:!1,category:"flags"},tanzania:{keywords:["tanzania,","united","republic","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},thailand:{keywords:["th","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},timor_leste:{keywords:["timor","leste","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},togo:{keywords:["tg","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},tokelau:{keywords:["tk","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},tonga:{keywords:["to","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},trinidad_tobago:{keywords:["trinidad","tobago","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},tunisia:{keywords:["tn","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},tr:{keywords:["turkey","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},turkmenistan:{keywords:["flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},turks_caicos_islands:{keywords:["turks","caicos","islands","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},tuvalu:{keywords:["flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddfb",fitzpatrick_scale:!1,category:"flags"},uganda:{keywords:["ug","flag","nation","country","banner"],char:"\ud83c\uddfa\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},ukraine:{keywords:["ua","flag","nation","country","banner"],char:"\ud83c\uddfa\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},united_arab_emirates:{keywords:["united","arab","emirates","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},uk:{keywords:["united","kingdom","great","britain","northern","ireland","flag","nation","country","banner","british","UK","english","england","union jack"],char:"\ud83c\uddec\ud83c\udde7",fitzpatrick_scale:!1,category:"flags"},england:{keywords:["flag","english"],char:"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f",fitzpatrick_scale:!1,category:"flags"},scotland:{keywords:["flag","scottish"],char:"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f",fitzpatrick_scale:!1,category:"flags"},wales:{keywords:["flag","welsh"],char:"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f",fitzpatrick_scale:!1,category:"flags"},us:{keywords:["united","states","america","flag","nation","country","banner"],char:"\ud83c\uddfa\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},us_virgin_islands:{keywords:["virgin","islands","us","flag","nation","country","banner"],char:"\ud83c\uddfb\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},uruguay:{keywords:["uy","flag","nation","country","banner"],char:"\ud83c\uddfa\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},uzbekistan:{keywords:["uz","flag","nation","country","banner"],char:"\ud83c\uddfa\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},vanuatu:{keywords:["vu","flag","nation","country","banner"],char:"\ud83c\uddfb\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},vatican_city:{keywords:["vatican","city","flag","nation","country","banner"],char:"\ud83c\uddfb\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},venezuela:{keywords:["ve","bolivarian","republic","flag","nation","country","banner"],char:"\ud83c\uddfb\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},vietnam:{keywords:["viet","nam","flag","nation","country","banner"],char:"\ud83c\uddfb\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},wallis_futuna:{keywords:["wallis","futuna","flag","nation","country","banner"],char:"\ud83c\uddfc\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},western_sahara:{keywords:["western","sahara","flag","nation","country","banner"],char:"\ud83c\uddea\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},yemen:{keywords:["ye","flag","nation","country","banner"],char:"\ud83c\uddfe\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},zambia:{keywords:["zm","flag","nation","country","banner"],char:"\ud83c\uddff\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},zimbabwe:{keywords:["zw","flag","nation","country","banner"],char:"\ud83c\uddff\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},united_nations:{keywords:["un","flag","banner"],char:"\ud83c\uddfa\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},pirate_flag:{keywords:["skull","crossbones","flag","banner"],char:"\ud83c\udff4\u200d\u2620\ufe0f",fitzpatrick_scale:!1,category:"flags"}});
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/emoticons/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/emoticons/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..fbff5713f17c17b1bc9748c54712503b0477aa07
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/emoticons/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function r(){}function i(t){return function(){return t}}function t(t){return t}function n(){return c}var m,e=tinymce.util.Tools.resolve("tinymce.PluginManager"),l=i(!1),a=i(!(m=null)),c={fold:function(t,n){return t()},isSome:l,isNone:a,getOr:t,getOrThunk:o,getOrDie:function(t){throw new Error(t||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(void 0),or:t,orThunk:o,map:n,each:r,bind:n,exists:l,forall:a,filter:function(){return c},toArray:function(){return[]},toString:i("none()")};function o(t){return t()}function g(t){var n=t;return{get:function(){return n},set:function(t){n=t}}}function d(t,n){for(var e=k(t),o=0,r=e.length;o<r;o++){var i=e[o];n(t[i],i)}}function h(t,n){return j.call(t,n)}function s(){var t,n,e=(t=r,n=g(O.none()),{clear:function(){o(),n.set(O.none())},isSet:function(){return n.get().isSome()},get:function(){return n.get()},set:function(t){o(),n.set(O.some(t))}});function o(){return n.get().each(t)}return C(C({},e),{on:function(t){return e.get().each(t)}})}function f(t,n){return-1!==t.indexOf(n)}function v(i,r,t){var a=s(),c=s(),f=i.getParam("emoticons_images_url","https://twemoji.maxcdn.com/v/13.0.1/72x72/","string");i.on("init",function(){_.load(t,r).then(function(t){var n,e,o,l,s,r=(n=i.getParam("emoticons_append",{},"object"),e=function(t){return C({keywords:[],category:"user"},t)},A(n,function(t,n){return{k:n,v:e(t)}}));o=w(t,r),l={},s=[],d(o,function(t,n){var e,o,r,i,a,c={title:n,keywords:t.keywords,char:(i=(r=t).char).length>=(a="<img").length&&i.substr(0,0+a.length)===a?r.char.replace(/src="([^"]+)"/,function(t,n){return'src="'+f+n+'"'}):r.char,category:h(e=D,o=t.category)?e[o]:o},u=void 0!==l[c.category]?l[c.category]:[];l[c.category]=u.concat([c]),s.push(c)}),a.set(l),c.set(s)},function(t){console.log("Failed to load emoticons: "+t),a.set({}),c.set([])})});function e(){return c.get().getOr([])}function u(){return a.isSet()&&c.isSet()}return{listCategories:function(){return[P].concat(k(a.get().getOr({})))},hasLoaded:u,waitForLoad:function(){return u()?x.resolve(!0):new x(function(t,n){var e=15,o=T.setInterval(function(){u()?(T.clearInterval(o),t(!0)):--e<0&&(console.log("Could not load emojis from url: "+r),T.clearInterval(o),n(!1))},100)})},listAll:e,listCategory:function(n){return n===P?e():a.get().bind(function(t){return O.from(t[n])}).getOr([])}}}function y(t,n,e){for(var o,r,i=[],a=n.toLowerCase(),c=e.fold(function(){return l},function(n){return function(t){return n<=t}}),u=0;u<t.length&&(0!==n.length&&(o=t[u],r=a,!f(o.title.toLowerCase(),r)&&!function(t){for(var n=0,e=t.length;n<e;n++)if(f(t[n].toLowerCase(),r))return 1}(o.keywords))||(i.push({value:t[u].char,text:t[u].title,icon:t[u].char}),!c(i.length)));u++);return i}function p(o,i){var e,r,t={pattern:"",results:y(i.listAll(),"",O.some(300))},a=g(P),c=(e=function(t){var n,e=(n=t).getData(),o=a.get(),r=y(i.listCategory(o),e[S],o===P?O.some(300):O.none());n.setData({results:r})},r=null,{cancel:u,throttle:function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];u(),r=setTimeout(function(){r=null,e.apply(null,t)},200)}});function u(){m===r||(clearTimeout(r),r=null)}function n(){return{title:"Emoticons",size:"normal",body:{type:"tabpanel",tabs:function(t){for(var n=t.length,e=new Array(n),o=0;o<n;o++){var r=t[o];e[o]={title:r,name:r,items:[l,s]}}return e}(i.listCategories())},initialData:t,onTabChange:function(t,n){a.set(n.newTabName),c.throttle(t)},onChange:c.throttle,onAction:function(t,n){var e;"results"===n.name&&(e=n.value,o.insertContent(e),t.close())},buttons:[{type:"cancel",text:"Close",primary:!0}]}}var l={label:"Search",type:"input",name:S},s={type:"collection",name:"results"},f=o.windowManager.open(n());f.focus(S),i.hasLoaded()||(f.block("Loading emoticons..."),i.waitForLoad().then(function(){f.redial(n()),c.throttle(f),f.focus(S),f.unblock()}).catch(function(t){f.redial({title:"Emoticons",body:{type:"panel",items:[{type:"alertbanner",level:"error",icon:"warning",text:"<p>Could not load emoticons</p>"}]},buttons:[{type:"cancel",text:"Close",primary:!0}],initialData:{pattern:"",results:[]}}),f.focus(S),f.unblock()}))}function b(t){t.on("PreInit",function(){t.parser.addAttributeFilter("data-emoticon",function(t){!function(t){for(var n,e=0,o=t.length;e<o;e++)(n=t[e]).attr("data-mce-resize","false"),n.attr("data-mce-placeholder","1")}(t)})})}function w(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];if(0===t.length)throw new Error("Can't merge zero objects");for(var e={},o=0;o<t.length;o++){var r,i=t[o];for(r in i)h(i,r)&&(e[r]=(e[r],i[r]))}return e}var u=function(e){function t(){return r}function n(t){return t(e)}var o=i(e),r={fold:function(t,n){return n(e)},isSome:a,isNone:l,getOr:o,getOrThunk:o,getOrDie:o,getOrNull:o,getOrUndefined:o,or:t,orThunk:t,map:function(t){return u(t(e))},each:function(t){t(e)},bind:n,exists:n,forall:n,filter:function(t){return t(e)?r:c},toArray:function(){return[e]},toString:function(){return"some("+e+")"}};return r},O={some:u,none:n,from:function(t){return null==t?c:u(t)}},C=function(){return(C=Object.assign||function(t){for(var n,e=1,o=arguments.length;e<o;e++)for(var r in n=arguments[e])Object.prototype.hasOwnProperty.call(n,r)&&(t[r]=n[r]);return t}).apply(this,arguments)},k=Object.keys,j=Object.hasOwnProperty,A=function(t,o){var r={};return d(t,function(t,n){var e=o(t,n);r[e.k]=e.v}),r},_=tinymce.util.Tools.resolve("tinymce.Resource"),T=tinymce.util.Tools.resolve("tinymce.util.Delay"),x=tinymce.util.Tools.resolve("tinymce.util.Promise"),P="All",D={symbols:"Symbols",people:"People",animals_and_nature:"Animals and Nature",food_and_drink:"Food and Drink",activity:"Activity",travel_and_places:"Travel and Places",objects:"Objects",flags:"Flags",user:"User Defined"},S="pattern";e.add("emoticons",function(t,n){var e,o,r,i,a,c,u,l,s=(o=n,r=(e=t).getParam("emoticons_database","emojis","string"),e.getParam("emoticons_database_url",o+"/js/"+r+e.suffix+".js","string")),f=t.getParam("emoticons_database_id","tinymce.plugins.emoticons","string"),m=v(t,s,f);function g(){return c.execCommand("mceEmoticons")}a=m,(i=t).addCommand("mceEmoticons",function(){return p(i,a)}),(c=t).ui.registry.addButton("emoticons",{tooltip:"Emoticons",icon:"emoji",onAction:g}),c.ui.registry.addMenuItem("emoticons",{text:"Emoticons...",icon:"emoji",onAction:g}),l=m,(u=t).ui.registry.addAutocompleter("emoticons",{ch:":",columns:"auto",minChars:2,fetch:function(t,n){return l.waitForLoad().then(function(){return y(l.listAll(),t,O.some(n))})},onAction:function(t,n,e){u.selection.setRng(n),u.insertContent(e),t.hide()}}),b(t)})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/fullpage/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/fullpage/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..ddf884b668b2c2f357f22d30069515572d1efe4a
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/fullpage/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function i(e){var t=e;return{get:function(){return t},set:function(e){t=e}}}function _(e){return e.getParam("fullpage_hide_in_source_view")}function b(e){return e.getParam("fullpage_default_encoding")}function x(e){return e.getParam("fullpage_default_font_family")}function k(e){return e.getParam("fullpage_default_font_size")}function C(e,t){return n({validate:!1,root_name:"#document"},e.schema).parse(t,{format:"xhtml"})}function c(u,m){u.addCommand("mceFullPageProperties",function(){var l,i,o,e,t,n,r,a,c,s;function d(e,t){return e.attr(t)||""}t=l=u,n=(i=m).get(),c=C(t,n),(s={}).fontface=x(t),s.fontsize=k(t),7===(r=c.firstChild).type&&(s.xml_pi=!0,(a=/encoding="([^"]+)"/.exec(r.value))&&(s.docencoding=a[1])),(r=c.getAll("#doctype")[0])&&(s.doctype="<!DOCTYPE"+r.value+">"),(r=c.getAll("title")[0])&&r.firstChild&&(s.title=r.firstChild.value),w.each(c.getAll("meta"),function(e){var t,n=e.attr("name"),l=e.attr("http-equiv");n?s[n.toLowerCase()]=e.attr("content"):"Content-Type"===l&&(t=/charset\s*=\s*(.*)\s*/gi.exec(e.attr("content")))&&(s.docencoding=t[1])}),(r=c.getAll("html")[0])&&(s.langcode=d(r,"lang")||d(r,"xml:lang")),s.stylesheets=[],w.each(c.getAll("link"),function(e){"stylesheet"===e.attr("rel")&&s.stylesheets.push(e.attr("href"))}),(r=c.getAll("body")[0])&&(s.langdir=d(r,"dir"),s.style=d(r,"style"),s.visited_color=d(r,"vlink"),s.link_color=d(r,"link"),s.active_color=d(r,"alink")),o=s,e=g(g({},{title:"",keywords:"",description:"",robots:"",author:"",docencoding:""}),o),l.windowManager.open({title:"Metadata and Document Properties",size:"normal",body:{type:"panel",items:[{name:"title",type:"input",label:"Title"},{name:"keywords",type:"input",label:"Keywords"},{name:"description",type:"input",label:"Description"},{name:"robots",type:"input",label:"Robots"},{name:"author",type:"input",label:"Author"},{name:"docencoding",type:"input",label:"Encoding"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:e,onSubmit:function(e){var t=e.getData(),n=function(e,o,t){function n(e,t,n){e.attr(t,n||void 0)}function r(e){s.firstChild?s.insert(e,s.firstChild):s.append(e)}var a,l,i=e.dom,c=C(e,t),s=c.getAll("head")[0];s||(a=c.getAll("html")[0],s=new f("head",1),a.firstChild?a.insert(s,a.firstChild,!0):a.append(s)),a=c.firstChild,o.xml_pi?(l='version="1.0"',o.docencoding&&(l+=' encoding="'+o.docencoding+'"'),7!==a.type&&(a=new f("xml",7),c.insert(a,c.firstChild,!0)),a.value=l):a&&7===a.type&&a.remove(),a=c.getAll("#doctype")[0],o.doctype?(a||(a=new f("#doctype",10),o.xml_pi?c.insert(a,c.firstChild):r(a)),a.value=o.doctype.substring(9,o.doctype.length-1)):a&&a.remove(),a=null,w.each(c.getAll("meta"),function(e){"Content-Type"===e.attr("http-equiv")&&(a=e)}),o.docencoding?(a||((a=new f("meta",1)).attr("http-equiv","Content-Type"),a.shortEnded=!0,r(a)),a.attr("content","text/html; charset="+o.docencoding)):a&&a.remove(),a=c.getAll("title")[0],o.title?(a?a.empty():r(a=new f("title",1)),a.append(new f("#text",3)).value=o.title):a&&a.remove(),w.each("keywords,description,author,copyright,robots".split(","),function(e){for(var t,n=c.getAll("meta"),l=o[e],i=0;i<n.length;i++)if((t=n[i]).attr("name")===e)return void(l?t.attr("content",l):t.remove());l&&((a=new f("meta",1)).attr("name",e),a.attr("content",l),a.shortEnded=!0,r(a))});var d={};w.each(c.getAll("link"),function(e){"stylesheet"===e.attr("rel")&&(d[e.attr("href")]=e)}),w.each(o.stylesheets,function(e){d[e]||((a=new f("link",1)).attr({rel:"stylesheet",text:"text/css",href:e}),a.shortEnded=!0,r(a)),delete d[e]}),w.each(d,function(e){e.remove()}),(a=c.getAll("body")[0])&&(n(a,"dir",o.langdir),n(a,"style",o.style),n(a,"vlink",o.visited_color),n(a,"link",o.link_color),n(a,"alink",o.active_color),i.setAttribs(e.getBody(),{style:o.style,dir:o.dir,vLink:o.visited_color,link:o.link_color,aLink:o.active_color})),(a=c.getAll("html")[0])&&(n(a,"lang",o.langcode),n(a,"xml:lang",o.langcode)),s.firstChild||s.remove();var u=p({validate:!1,indent:!0,indent_before:"head,html,body,meta,title,script,link,style",indent_after:"head,html,body,meta,title,script,link,style"}).serialize(c);return u.substring(0,u.indexOf("</body>"))}(l,w.extend(o,t),i.get());i.set(n),e.close()}})})}function A(e){return e.replace(/<\/?[A-Z]+/g,function(e){return e.toLowerCase()})}function s(e,t,n,l){var i,o,r,a,c,s,d,u,m,g,f,p,h,y="",v=e.dom;l.selection||(a=e.getParam("protect"),c=l.content,w.each(a,function(e){c=c.replace(e,function(e){return"\x3c!--mce:protected "+escape(e)+"--\x3e"})}),r=c,"raw"===l.format&&t.get()||l.source_view&&_(e)||(-1!==(i=(r=(r=0!==r.length||l.source_view?r:w.trim(t.get())+"\n"+w.trim(r)+"\n"+w.trim(n.get())).replace(/<(\/?)BODY/gi,"<$1body")).indexOf("<body"))?(i=r.indexOf(">",i),t.set(A(r.substring(0,i+1))),-1===(o=r.indexOf("</body",i))&&(o=r.length),l.content=w.trim(r.substring(i+1,o)),n.set(A(r.substring(o)))):(t.set((h=p="",(g=e).getParam("fullpage_default_xml_pi")&&(p+='<?xml version="1.0" encoding="'+(b(g)||"ISO-8859-1")+'" ?>\n'),p+=g.getParam("fullpage_default_doctype","<!DOCTYPE html>"),p+="\n<html>\n<head>\n",(f=g.getParam("fullpage_default_title"))&&(p+="<title>"+f+"</title>\n"),(f=b(g))&&(p+='<meta http-equiv="Content-Type" content="text/html; charset='+f+'" />\n'),(f=x(g))&&(h+="font-family: "+f+";"),(f=k(g))&&(h+="font-size: "+f+";"),(f=g.getParam("fullpage_default_text_color"))&&(h+="color: "+f+";"),p+="</head>\n<body"+(h?' style="'+h+'"':"")+">\n")),n.set("\n</body>\n</html>")),s=C(e,t.get()),P(s.getAll("style"),function(e){e.firstChild&&(y+=e.firstChild.value)}),(d=s.getAll("body")[0])&&v.setAttribs(e.getBody(),{style:d.attr("style")||"",dir:d.attr("dir")||"",vLink:d.attr("vlink")||"",link:d.attr("link")||"",aLink:d.attr("alink")||""}),v.remove("fullpage_styles"),u=e.getDoc().getElementsByTagName("head")[0],y&&v.add(u,"style",{id:"fullpage_styles"}).appendChild(document.createTextNode(y)),m={},w.each(u.getElementsByTagName("link"),function(e){"stylesheet"===e.rel&&e.getAttribute("data-mce-fullpage")&&(m[e.href]=e)}),w.each(s.getAll("link"),function(e){var t=e.attr("href");if(!t)return!0;m[t]||"stylesheet"!==e.attr("rel")||v.add(u,"link",{rel:"stylesheet",text:"text/css",href:t,"data-mce-fullpage":"1"}),delete m[t]}),w.each(m,function(e){e.parentNode.removeChild(e)})))}var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),g=function(){return(g=Object.assign||function(e){for(var t,n=1,l=arguments.length;n<l;n++)for(var i in t=arguments[n])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e}).apply(this,arguments)},w=tinymce.util.Tools.resolve("tinymce.util.Tools"),n=tinymce.util.Tools.resolve("tinymce.html.DomParser"),f=tinymce.util.Tools.resolve("tinymce.html.Node"),p=tinymce.util.Tools.resolve("tinymce.html.Serializer"),P=w.each;e.add("fullpage",function(e){var t,o,r,a,n=i(""),l=i("");c(e,n),(t=e).ui.registry.addButton("fullpage",{tooltip:"Metadata and document properties",icon:"document-properties",onAction:function(){t.execCommand("mceFullPageProperties")}}),t.ui.registry.addMenuItem("fullpage",{text:"Metadata and document properties",icon:"document-properties",onAction:function(){t.execCommand("mceFullPageProperties")}}),r=n,a=l,(o=e).on("BeforeSetContent",function(e){s(o,r,a,e)}),o.on("GetContent",function(e){var t,n,l,i;t=o,n=r.get(),l=a.get(),"html"!==(i=e).format||i.selection||i.source_view&&_(t)||(i.content=(w.trim(n)+"\n"+w.trim(i.content)+"\n"+w.trim(l)).replace(/<!--mce:protected ([\s\S]*?)-->/g,function(e,t){return unescape(t)}))})})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/fullscreen/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/fullscreen/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..3cf2ac8176819b52b5b0004069ee51dc246c9a95
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/fullscreen/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function a(e){var n=e;return{get:function(){return n},set:function(e){n=e}}}function e(t){return function(e){return r=typeof(n=e),(null===n?"null":"object"==r&&(Array.prototype.isPrototypeOf(n)||n.constructor&&"Array"===n.constructor.name)?"array":"object"==r&&(String.prototype.isPrototypeOf(n)||n.constructor&&"String"===n.constructor.name)?"string":r)===t;var n,r}}function n(n){return function(e){return typeof e===n}}function c(e){return!(null==e)}function s(){}function y(e){return function(){return e}}function r(e){return e}var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),l=e("string"),d=e("array"),o=n("boolean"),h=n("function"),i=n("number");function u(){return m}var v=y(!1),f=y(!0),m={fold:function(e,n){return e()},isSome:v,isNone:f,getOr:r,getOrThunk:g,getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:y(null),getOrUndefined:y(void 0),or:r,orThunk:g,map:u,each:s,bind:u,exists:v,forall:f,filter:function(){return m},toArray:function(){return[]},toString:y("none()")};function g(e){return e()}function p(e){function n(){return r.get().each(e)}var r=a(A.none());return{clear:function(){n(),r.set(A.none())},isSet:function(){return r.get().isSome()},get:function(){return r.get()},set:function(e){n(),r.set(A.some(e))}}}function w(){return p(function(e){return e.unbind()})}function C(e,n){for(var r=e.length,t=new Array(r),o=0;o<r;o++){var i=e[o];t[o]=n(i,o)}return t}function D(e,n){for(var r=0,t=e.length;r<t;r++)n(e[r],r)}function b(e,n){for(var r=[],t=0,o=e.length;t<o;t++){var i=e[t];n(i,t)&&r.push(i)}return r}function S(e,n){return function(e,n,r){for(var t=0,o=e.length;t<o;t++){var i=e[t];if(n(i,t))return A.some(i);if(r(i,t))break}return A.none()}(e,n,v)}function x(e,n){return-1!==e.indexOf(n)}function E(e){return void 0!==e.style&&h(e.style.getPropertyValue)}function O(e){if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}}var F=function(r){function e(){return o}function n(e){return e(r)}var t=y(r),o={fold:function(e,n){return n(r)},isSome:f,isNone:v,getOr:t,getOrThunk:t,getOrDie:t,getOrNull:t,getOrUndefined:t,or:e,orThunk:e,map:function(e){return F(e(r))},each:function(e){e(r)},bind:n,exists:n,forall:n,filter:function(e){return e(r)?o:m},toArray:function(){return[r]},toString:function(){return"some("+r+")"}};return o},A={some:F,none:u,from:function(e){return null==e?m:F(e)}},T=function(){return(T=Object.assign||function(e){for(var n,r=1,t=arguments.length;r<t;r++)for(var o in n=arguments[r])Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o]);return e}).apply(this,arguments)},k=Array.prototype.push,R=Object.keys,L={fromHtml:function(e,n){var r=(n||document).createElement("div");if(r.innerHTML=e,!r.hasChildNodes()||1<r.childNodes.length)throw console.error("HTML does not have a single root node",e),new Error("HTML must have a single root node");return O(r.childNodes[0])},fromTag:function(e,n){var r=(n||document).createElement(e);return O(r)},fromText:function(e,n){var r=(n||document).createTextNode(e);return O(r)},fromDom:O,fromPoint:function(e,n,r){return A.from(e.dom.elementFromPoint(n,r)).map(O)}};function P(n){return function(e){return e.dom.nodeType===n}}function M(t,e){return function(e){for(var n=0;n<e.length;n++){var r=function(n){var r=n.brand.toLowerCase();return S(t,function(e){var n;return r===(null===(n=e.brand)||void 0===n?void 0:n.toLowerCase())}).map(function(e){return{current:e.name,version:he.nu(parseInt(n.version,10),0)}})}(e[n]);if(r.isSome())return r}return A.none()}(e.brands)}function N(e,n){var r=String(n).toLowerCase();return S(e,function(e){return e.search(r)})}function H(n){return function(e){return x(e,n)}}function W(e){return window.matchMedia(e).matches}function q(e,n){var r=e.dom;if(1!==r.nodeType)return!1;var t=r;if(void 0!==t.matches)return t.matches(n);if(void 0!==t.msMatchesSelector)return t.msMatchesSelector(n);if(void 0!==t.webkitMatchesSelector)return t.webkitMatchesSelector(n);if(void 0!==t.mozMatchesSelector)return t.mozMatchesSelector(n);throw new Error("Browser lacks native selectors")}function I(e){return L.fromDom(e.dom.ownerDocument)}function j(e){var n,r=Re(e);return me(n=r)&&c(n.dom.host)?A.some(r):A.none()}function B(e){return L.fromDom(e.dom.host)}function V(e,n,r){!function(e,n,r){if(!(l(r)||o(r)||i(r)))throw console.error("Invalid call to Attribute.set. Key ",n,":: Value ",r,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(n,r+"")}(e.dom,n,r)}function X(e,n){var r=e.dom.getAttribute(n);return null===r?void 0:r}function _(e,n){e.dom.removeAttribute(n)}function z(e,n){var u=e.dom;!function(e){for(var n,r=R(e),t=0,o=r.length;t<o;t++){var i=r[t];n=e[i],function(e,n,r){if(!l(r))throw console.error("Invalid call to CSS.set. Property ",n,":: Value ",r,":: Element ",e),new Error("CSS value must be a string: "+r);E(e)&&e.style.setProperty(n,r)}(u,i,n)}}(n)}function U(e){function n(){return e.stopPropagation()}function r(){return e.preventDefault()}var t,o,i=L.fromDom(function(e){if(Ae()&&c(e.target)){var n=L.fromDom(e.target);if(se(n)&&Le(n)&&e.composed&&e.composedPath){var r=e.composedPath();if(r)return 0<(t=r).length?A.some(t[0]):A.none()}}var t;return A.from(e.target)}(e).getOr(e.target)),u=(t=r,o=n,function(){for(var e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];return t(o.apply(null,e))});return{target:i,x:e.clientX,y:e.clientY,stop:n,prevent:r,kill:u,raw:e}}function $(e,n,r){return o=n,i=!1,u=He,c=r,a=function(e){u(e)&&c(U(e))},(t=e).dom.addEventListener(o,a,i),{unbind:function(t){for(var o=[],e=1;e<arguments.length;e++)o[e-1]=arguments[e];return function(){for(var e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];var r=o.concat(e);return t.apply(null,r)}}(Ne,t,o,a,i)};var t,o,i,u,c,a}function K(e){var n=void 0===e?window:e;return ke().browser.isFirefox()?A.none():A.from(n.visualViewport)}function Y(e,n,r,t){return{x:e,y:n,width:r,height:t,right:e+r,bottom:n+t}}function G(r,t,e){return K(e).map(function(e){function n(e){return t(U(e))}return e.addEventListener(r,n),{unbind:function(){return e.removeEventListener(r,n)}}}).getOrThunk(function(){return{unbind:s}})}function J(e,n){e.fire("FullscreenStateChanged",{state:n})}function Q(e){return e.getParam("fullscreen_native",!1,"boolean")}function Z(e){return e.dom===(void 0!==(n=I(e).dom).fullscreenElement?n.fullscreenElement:void 0!==n.msFullscreenElement?n.msFullscreenElement:void 0!==n.webkitFullscreenElement?n.webkitFullscreenElement:null);var n}function ee(e,n){return t=function(e){return q(e,n)},b((r=e,A.from(r.dom.parentNode).map(L.fromDom).map(Ce).map(function(e){return b(e,function(e){return r.dom!==e.dom})}).getOr([])),t);var r,t}function ne(o,e,n){function r(t){return function(e){var n=X(e,"style"),r=void 0===n?"no-styles":n.trim();r===t||(V(e,Ve,r),z(e,o.parseStyle(t)))}}var t,i,u,c,a,s,l=(s=function(e){return q(e,"*")},b(function(e,n){for(var r=h(n)?n:v,t=e.dom,o=[];null!==t.parentNode&&void 0!==t.parentNode;){var i=t.parentNode,u=L.fromDom(i);if(o.push(u),!0===r(u))break;t=i}return o}(e,void 0),s)),f=function(e){for(var n=[],r=0,t=e.length;r<t;++r){if(!d(e[r]))throw new Error("Arr.flatten item "+r+" was not an array, input: "+e);k.apply(n,e[r])}return n}(C(l,function(e){return ee(e,"*:not(.tox-silver-sink)")})),m=(i="background-color",u=(t=n).dom,void 0!==(a=""!==(c=window.getComputedStyle(u).getPropertyValue(i))||Pe(t)?c:Me(u,i))&&""!==a?"background-color:"+a+"!important":"background-color:rgb(255,255,255)!important;");D(f,r("display:none!important;")),D(l,r(Xe+_e+m)),r((!0===ze?"":Xe)+_e+m)(e)}function re(r,t){return function(n){function e(e){return n.setActive(e.state)}return n.setActive(null!==t.get()),r.on("FullscreenStateChanged",e),function(){return r.off("FullscreenStateChanged",e)}}}"undefined"!=typeof window||Function("return this;")();function te(){return de(0,0)}function oe(e){function n(e){return function(){return r===e}}var r=e.current,t=e.version;return{current:r,version:t,isEdge:n("Edge"),isChrome:n("Chrome"),isIE:n("IE"),isOpera:n("Opera"),isFirefox:n(pe),isSafari:n("Safari")}}function ie(e){function n(e){return function(){return r===e}}var r=e.current,t=e.version;return{current:r,version:t,isWindows:n(be),isiOS:n("iOS"),isAndroid:n(Se),isOSX:n("OSX"),isLinux:n("Linux"),isSolaris:n(xe),isFreeBSD:n(Ee),isChromeOS:n(Oe)}}var ue,ce,ae,se=P(1),le=P(3),fe=P(9),me=P(11),de=function(e,n){return{major:e,minor:n}},he={nu:de,detect:function(e,n){var r,t,o=String(n).toLowerCase();return 0===e.length?te():(t=function(e,n){for(var r=0;r<e.length;r++){var t=e[r];if(t.test(n))return t}}(e,r=o))?de(i(1),i(2)):{major:0,minor:0};function i(e){return Number(r.replace(t,"$"+e))}},unknown:te},ve=/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,ge={browsers:y([{name:"Edge",versionRegexes:[/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],search:function(e){return x(e,"edge/")&&x(e,"chrome")&&x(e,"safari")&&x(e,"applewebkit")}},{name:"Chrome",brand:"Chromium",versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/,ve],search:function(e){return x(e,"chrome")&&!x(e,"chromeframe")}},{name:"IE",versionRegexes:[/.*?msie\ ?([0-9]+)\.([0-9]+).*/,/.*?rv:([0-9]+)\.([0-9]+).*/],search:function(e){return x(e,"msie")||x(e,"trident")}},{name:"Opera",versionRegexes:[ve,/.*?opera\/([0-9]+)\.([0-9]+).*/],search:H("opera")},{name:"Firefox",versionRegexes:[/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],search:H("firefox")},{name:"Safari",versionRegexes:[ve,/.*?cpu os ([0-9]+)_([0-9]+).*/],search:function(e){return(x(e,"safari")||x(e,"mobile/"))&&x(e,"applewebkit")}}]),oses:y([{name:"Windows",search:H("win"),versionRegexes:[/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]},{name:"iOS",search:function(e){return x(e,"iphone")||x(e,"ipad")},versionRegexes:[/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,/.*cpu os ([0-9]+)_([0-9]+).*/,/.*cpu iphone os ([0-9]+)_([0-9]+).*/]},{name:"Android",search:H("android"),versionRegexes:[/.*?android\ ?([0-9]+)\.([0-9]+).*/]},{name:"OSX",search:H("mac os x"),versionRegexes:[/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]},{name:"Linux",search:H("linux"),versionRegexes:[]},{name:"Solaris",search:H("sunos"),versionRegexes:[]},{name:"FreeBSD",search:H("freebsd"),versionRegexes:[]},{name:"ChromeOS",search:H("cros"),versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/]}])},pe="Firefox",we=function(){return oe({current:void 0,version:he.unknown()})},ye=oe,be=(y("Edge"),y("Chrome"),y("IE"),y("Opera"),y(pe),y("Safari"),"Windows"),Se="Android",xe="Solaris",Ee="FreeBSD",Oe="ChromeOS",Fe=function(){return ie({current:void 0,version:he.unknown()})},Te=ie,ke=(y(be),y("iOS"),y(Se),y("Linux"),y("OSX"),y(xe),y(Ee),y(Oe),ae=!(ue=function(){return e=navigator.userAgent,n=A.from(navigator.userAgentData),r=W,v=ge.browsers(),g=ge.oses(),p=n.bind(function(e){return M(v,e)}).orThunk(function(){return N(v,r=e).map(function(e){var n=he.detect(e.versionRegexes,r);return{current:e.name,version:n}});var r}).fold(we,ye),w=N(g,t=e).map(function(e){var n=he.detect(e.versionRegexes,t);return{current:e.name,version:n}}).fold(Fe,Te),{browser:p,os:w,deviceType:(i=p,u=e,c=r,a=(o=w).isiOS()&&!0===/ipad/i.test(u),s=o.isiOS()&&!a,f=(l=o.isiOS()||o.isAndroid())||c("(pointer:coarse)"),m=a||!s&&l&&c("(min-device-width:768px)"),d=s||l&&!m,h=i.isSafari()&&o.isiOS()&&!1===/safari/i.test(u),{isiPad:y(a),isiPhone:y(s),isTablet:y(m),isPhone:y(d),isTouch:y(f),isAndroid:o.isAndroid,isiOS:o.isiOS,isWebView:y(h),isDesktop:y(!d&&!m&&!h)})};var e,n,r,t,o,i,u,c,a,s,l,f,m,d,h,v,g,p,w}),function(){for(var e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];return ae||(ae=!0,ce=ue.apply(null,e)),ce}),Ce=function(e){return C(e.dom.childNodes,L.fromDom)},De=h(Element.prototype.attachShadow)&&h(Node.prototype.getRootNode),Ae=y(De),Re=De?function(e){return L.fromDom(e.dom.getRootNode())}:function(e){return fe(e)?e:I(e)},Le=function(e){return c(e.dom.shadowRoot)},Pe=function(e){var n=le(e)?e.dom.parentNode:e.dom;if(null==n||null===n.ownerDocument)return!1;var r,t,o=n.ownerDocument;return j(L.fromDom(n)).fold(function(){return o.body.contains(n)},(r=Pe,t=B,function(e){return r(t(e))}))},Me=function(e,n){return E(e)?e.style.getPropertyValue(n):""},Ne=function(e,n,r,t){e.dom.removeEventListener(n,r,t)},He=f,We=function(r,t){return{left:r,top:t,translate:function(e,n){return We(r+e,t+n)}}},qe=We,Ie=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),je=tinymce.util.Tools.resolve("tinymce.Env"),Be=tinymce.util.Tools.resolve("tinymce.util.Delay"),Ve="data-ephox-mobile-fullscreen-style",Xe="position:absolute!important;",_e="top:0!important;left:0!important;margin:0!important;padding:0!important;width:100%!important;height:100%!important;overflow:visible!important;",ze=je.os.isAndroid(),Ue=Ie.DOM,$e=K().fold(function(){return{bind:s,unbind:s}},function(n){var r,t=(r=p(s),T(T({},r),{on:function(e){return r.get().each(e)}})),o=w(),i=w(),u=Be.throttle(function(){document.body.scrollTop=0,document.documentElement.scrollTop=0,window.requestAnimationFrame(function(){t.on(function(e){return z(e,{top:n.offsetTop+"px",left:n.offsetLeft+"px",height:n.height+"px",width:n.width+"px"})})})},50);return{bind:function(e){t.set(e),u(),o.set(G("resize",u)),i.set(G("scroll",u))},unbind:function(){t.on(function(){o.clear(),i.clear()}),t.clear()}}}),Ke=function(o,i){function u(n){n(w,"tox-fullscreen"),n(y,"tox-fullscreen"),n(b,"tox-fullscreen"),j(S).map(function(e){return B(e).dom}).each(function(e){n(e,"tox-fullscreen"),n(e,"tox-shadowhost")})}function e(){var r,e,n,t;F&&(r=o.dom,e="["+Ve+"]",D(1!==(n=t=document).nodeType&&9!==n.nodeType&&11!==n.nodeType||0===n.childElementCount?[]:C(t.querySelectorAll(e),L.fromDom),function(e){var n=X(e,Ve);"no-styles"!==n?z(e,r.parseStyle(n)):_(e,"style"),_(e,Ve)})),u(Ue.removeClass),$e.unbind(),A.from(i.get()).each(function(e){return e.fullscreenChangeHandler.unbind()})}var n,r,t,c,a,s,l,f,m,d,h,v,g,p,w=document.body,y=document.documentElement,b=o.getContainer(),S=L.fromDom(b),x=j(s=L.fromDom(o.getElement())).map(B).getOrThunk(function(){var e=I(s).dom.body;if(null==e)throw new Error("Body is not available yet");return L.fromDom(e)}),E=i.get(),O=L.fromDom(o.getBody()),F=je.deviceType.isTouch(),T=b.style,k=o.iframeElement.style;E?(E.fullscreenChangeHandler.unbind(),Q(o)&&Z(x)&&((c=I(x).dom).exitFullscreen?c.exitFullscreen():c.msExitFullscreen?c.msExitFullscreen():c.webkitCancelFullScreen&&c.webkitCancelFullScreen()),k.width=E.iframeWidth,k.height=E.iframeHeight,T.width=E.containerWidth,T.height=E.containerHeight,T.top=E.containerTop,T.left=E.containerLeft,t=E.scrollPos,window.scrollTo(t.x,t.y),i.set(null),J(o,!1),e(),o.off("remove",e)):(n=$(I(x),void 0!==document.fullscreenElement?"fullscreenchange":void 0!==document.msFullscreenElement?"MSFullscreenChange":void 0!==document.webkitFullscreenElement?"webkitfullscreenchange":"fullscreenchange",function(e){Q(o)&&(Z(x)||null===i.get()||Ke(o,i))}),r={scrollPos:(l=window,v=void 0===l?window:l,g=v.document,d=(m=void 0!==(f=L.fromDom(g))?f.dom:document).body.scrollLeft||m.documentElement.scrollLeft,h=m.body.scrollTop||m.documentElement.scrollTop,p=qe(d,h),K(v).fold(function(){var e=v.document.documentElement,n=e.clientWidth,r=e.clientHeight;return Y(p.left,p.top,n,r)},function(e){return Y(Math.max(e.pageLeft,p.left),Math.max(e.pageTop,p.top),e.width,e.height)})),containerWidth:T.width,containerHeight:T.height,containerTop:T.top,containerLeft:T.left,iframeWidth:k.width,iframeHeight:k.height,fullscreenChangeHandler:n},F&&ne(o.dom,S,O),k.width=k.height="100%",T.width=T.height="",u(Ue.addClass),$e.bind(S),o.on("remove",e),i.set(r),Q(o)&&((a=x.dom).requestFullscreen?a.requestFullscreen():a.msRequestFullscreen?a.msRequestFullscreen():a.webkitRequestFullScreen&&a.webkitRequestFullScreen()),J(o,!0))};t.add("fullscreen",function(e){var n,r,t,o,i,u=a(null);return e.inline||(r=u,(n=e).addCommand("mceFullScreen",function(){Ke(n,r)}),(t=e).ui.registry.addToggleMenuItem("fullscreen",{text:"Fullscreen",icon:"fullscreen",shortcut:"Meta+Shift+F",onAction:c,onSetup:re(t,o=u)}),t.ui.registry.addToggleButton("fullscreen",{tooltip:"Fullscreen",icon:"fullscreen",onAction:c,onSetup:re(t,o)}),e.addShortcut("Meta+Shift+F","","mceFullScreen")),i=u,{isFullscreen:function(){return null!==i.get()}};function c(){return t.execCommand("mceFullScreen")}})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/help/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/help/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..a334ea6a95f824c93ce058ffecca49ae58184533
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/help/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function i(e){return function(){return e}}function e(e){return e}function t(){return s}var n=tinymce.util.Tools.resolve("tinymce.PluginManager"),g=function(){return(g=Object.assign||function(e){for(var t,n=1,a=arguments.length;n<a;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e}).apply(this,arguments)},u=i(!1),r=i(!0),s={fold:function(e,t){return e()},isSome:u,isNone:r,getOr:e,getOrThunk:a,getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(void 0),or:e,orThunk:a,map:t,each:function(){},bind:t,exists:u,forall:r,filter:function(){return s},toArray:function(){return[]},toString:i("none()")};function a(e){return e()}function b(e,t){for(var n=e.length,a=new Array(n),o=0;o<n;o++){var i=e[o];a[o]=t(i,o)}return a}function m(e,t){for(var n=[],a=0,o=e.length;a<o;a++){var i=e[a];t(i,a)&&n.push(i)}return n}function f(e){var n=p.mac?{alt:"&#x2325;",ctrl:"&#x2303;",shift:"&#x21E7;",meta:"&#x2318;",access:"&#x2303;&#x2325;"}:{meta:"Ctrl ",access:"Shift + Alt "},t=b(e.split("+"),function(e){var t=e.toLowerCase().trim();return A(n,t)?n[t]:e});return p.mac?t.join("").replace(/\s/,""):t.join("+")}function k(e){function a(e){return'<a href="'+e.url+'" target="_blank" rel="noopener">'+e.name+"</a>"}var t,o,n,i,r,s,l,c;return{name:"plugins",title:"Plugins",items:[{type:"htmlpanel",presets:"document",html:[null==e?"":'<div data-mce-tabstop="1" tabindex="-1">'+(s=b((i=w((n=o=e).plugins),void 0===(r=n.getParam("forced_plugins"))?i:m(i,function(e){return!(-1<h.call(r,e))})),function(e){return"<li>"+(t=o,n=e,function(e,t,n){for(var a=0,o=e.length;a<o;a++){var i=e[a];if(t(i,a))return v.some(i);if(n(i,a))break}return v.none()}(d,function(e){return e.key===n},u).fold(function(){var e=t.plugins[n].getMetadata;return"function"==typeof e?a(e()):n},function(e){return a({name:"premium"===e.type?e.name+"*":e.name,url:"https://www.tiny.cloud/docs/plugins/"+e.type+"/"+e.slug})}))+"</li>";var t,n}),l=s.length,c=s.join(""),"<p><b>"+T.translate(["Plugins installed ({0}):",l])+"</b></p><ul>"+c+"</ul>")+"</div>",(t=b(m(d,function(e){var t=e.key,n=e.type;return"autocorrect"!==t&&"premium"===n}),function(e){return"<li>"+T.translate(e.name)+"</li>"}).join(""),'<div data-mce-tabstop="1" tabindex="-1"><p><b>'+T.translate("Premium plugins:")+"</b></p><ul>"+t+'<li class="tox-help__more-link" "><a href="https://www.tiny.cloud/pricing/?utm_campaign=editor_referral&utm_medium=help_dialog&utm_source=tinymce" target="_blank">'+T.translate("Learn more...")+"</a></li></ul></div>")].join("")}]}}function l(d,y){return function(){var e,t,n,a,o,i,r,s,l,c,u,m=(e=d,t=y,r={name:"shortcuts",title:"Handy Shortcuts",items:[{type:"table",header:["Action","Shortcut"],cells:b(x,function(e){var t=b(e.shortcuts,f).join(" or ");return[e.action,t]})}]},s={name:"keyboardnav",title:"Keyboard Navigation",items:[{type:"htmlpanel",presets:"document",html:"<h1>Editor UI keyboard navigation</h1>\n\n<h2>Activating keyboard navigation</h2>\n\n<p>The sections of the outer UI of the editor - the menubar, toolbar, sidebar and footer - are all keyboard navigable. As such, there are multiple ways to activate keyboard navigation:</p>\n<ul>\n  <li>Focus the menubar: Alt + F9 (Windows) or &#x2325;F9 (MacOS)</li>\n  <li>Focus the toolbar: Alt + F10 (Windows) or &#x2325;F10 (MacOS)</li>\n  <li>Focus the footer: Alt + F11 (Windows) or &#x2325;F11 (MacOS)</li>\n</ul>\n\n<p>Focusing the menubar or toolbar will start keyboard navigation at the first item in the menubar or toolbar, which will be highlighted with a gray background. Focusing the footer will start keyboard navigation at the first item in the element path, which will be highlighted with an underline. </p>\n\n<h2>Moving between UI sections</h2>\n\n<p>When keyboard navigation is active, pressing tab will move the focus to the next major section of the UI, where applicable. These sections are:</p>\n<ul>\n  <li>the menubar</li>\n  <li>each group of the toolbar </li>\n  <li>the sidebar</li>\n  <li>the element path in the footer </li>\n  <li>the wordcount toggle button in the footer </li>\n  <li>the branding link in the footer </li>\n  <li>the editor resize handle in the footer</li>\n</ul>\n\n<p>Pressing shift + tab will move backwards through the same sections, except when moving from the footer to the toolbar. Focusing the element path then pressing shift + tab will move focus to the first toolbar group, not the last.</p>\n\n<h2>Moving within UI sections</h2>\n\n<p>Keyboard navigation within UI sections can usually be achieved using the left and right arrow keys. This includes:</p>\n<ul>\n  <li>moving between menus in the menubar</li>\n  <li>moving between buttons in a toolbar group</li>\n  <li>moving between items in the element path</li>\n</ul>\n\n<p>In all these UI sections, keyboard navigation will cycle within the section. For example, focusing the last button in a toolbar group then pressing right arrow will move focus to the first item in the same toolbar group. </p>\n\n<h1>Executing buttons</h1>\n\n<p>To execute a button, navigate the selection to the desired button and hit space or enter.</p>\n\n<h1>Opening, navigating and closing menus</h1>\n\n<p>When focusing a menubar button or a toolbar button with a menu, pressing space, enter or down arrow will open the menu. When the menu opens the first item will be selected. To move up or down the menu, press the up or down arrow key respectively. This is the same for submenus, which can also be opened and closed using the left and right arrow keys.</p>\n\n<p>To close any active menu, hit the escape key. When a menu is closed the selection will be restored to its previous selection. This also works for closing submenus.</p>\n\n<h1>Context toolbars and menus</h1>\n\n<p>To focus an open context toolbar such as the table context toolbar, press Ctrl + F9 (Windows) or &#x2303;F9 (MacOS).</p>\n\n<p>Context toolbar navigation is the same as toolbar navigation, and context menu navigation is the same as standard menu navigation.</p>\n\n<h1>Dialog navigation</h1>\n\n<p>There are two types of dialog UIs in TinyMCE: tabbed dialogs and non-tabbed dialogs.</p>\n\n<p>When a non-tabbed dialog is opened, the first interactive component in the dialog will be focused. Users can navigate between interactive components by pressing tab. This includes any footer buttons. Navigation will cycle back to the first dialog component if tab is pressed while focusing the last component in the dialog. Pressing shift + tab will navigate backwards.</p>\n\n<p>When a tabbed dialog is opened, the first button in the tab menu is focused. Pressing tab will navigate to the first interactive component in that tab, and will cycle through the tab\u2019s components, the footer buttons, then back to the tab button. To switch to another tab, focus the tab button for the current tab, then use the arrow keys to cycle through the tab buttons.</p>"}]},l=k(e),a=C.majorVersion,o=C.minorVersion,i=0===a.indexOf("@")?"X.X.X":a+"."+o,c={name:"versions",title:"Version",items:[{type:"htmlpanel",html:"<p>"+T.translate(["You are using {0}",'<a href="https://www.tiny.cloud/docs/changelog/?utm_campaign=editor_referral&utm_medium=help_dialog&utm_source=tinymce" target="_blank">TinyMCE '+i+"</a>"])+"</p>",presets:"document"}]},u=g(((n={})[r.name]=r,n[s.name]=s,n[l.name]=l,n[c.name]=c,n),t.get()),v.from(e.getParam("help_tabs")).fold(function(){return-1!==(n=(t=w(e=u)).indexOf("versions"))&&(t.splice(n,1),t.push("versions")),{tabs:e,names:t};var e,t,n},function(e){return t=u,n={},a=b(e,function(e){return"string"==typeof e?(A(t,e)&&(n[e]=t[e]),e):(n[e.name]=e).name}),{tabs:n,names:a};var t,n,a})),h=m.tabs,p=function(e){for(var t=[],n=function(e){t.push(e)},a=0;a<e.length;a++)e[a].each(n);return t}(b(m.names,function(e){return A(t=h,n=e)?v.from(t[n]):v.none();var t,n}));d.windowManager.open({title:"Help",size:"medium",body:{type:"tabpanel",tabs:p},buttons:[{type:"cancel",name:"close",text:"Close",primary:!0}],initialData:{}})}}var c=function(n){function e(){return o}function t(e){return e(n)}var a=i(n),o={fold:function(e,t){return t(n)},isSome:r,isNone:u,getOr:a,getOrThunk:a,getOrDie:a,getOrNull:a,getOrUndefined:a,or:e,orThunk:e,map:function(e){return c(e(n))},each:function(e){e(n)},bind:t,exists:t,forall:t,filter:function(e){return e(n)?o:s},toArray:function(){return[n]},toString:function(){return"some("+n+")"}};return o},v={some:c,none:t,from:function(e){return null==e?s:c(e)}},h=Array.prototype.indexOf,w=Object.keys,o=Object.hasOwnProperty,A=function(e,t){return o.call(e,t)},p=tinymce.util.Tools.resolve("tinymce.Env"),x=[{shortcuts:["Meta + B"],action:"Bold"},{shortcuts:["Meta + I"],action:"Italic"},{shortcuts:["Meta + U"],action:"Underline"},{shortcuts:["Meta + A"],action:"Select all"},{shortcuts:["Meta + Y","Meta + Shift + Z"],action:"Redo"},{shortcuts:["Meta + Z"],action:"Undo"},{shortcuts:["Access + 1"],action:"Heading 1"},{shortcuts:["Access + 2"],action:"Heading 2"},{shortcuts:["Access + 3"],action:"Heading 3"},{shortcuts:["Access + 4"],action:"Heading 4"},{shortcuts:["Access + 5"],action:"Heading 5"},{shortcuts:["Access + 6"],action:"Heading 6"},{shortcuts:["Access + 7"],action:"Paragraph"},{shortcuts:["Access + 8"],action:"Div"},{shortcuts:["Access + 9"],action:"Address"},{shortcuts:["Alt + 0"],action:"Open help dialog"},{shortcuts:["Alt + F9"],action:"Focus to menubar"},{shortcuts:["Alt + F10"],action:"Focus to toolbar"},{shortcuts:["Alt + F11"],action:"Focus to element path"},{shortcuts:["Ctrl + F9"],action:"Focus to contextual toolbar"},{shortcuts:["Shift + Enter"],action:"Open popup menu for split buttons"},{shortcuts:["Meta + K"],action:"Insert link (if link plugin activated)"},{shortcuts:["Meta + S"],action:"Save (if save plugin activated)"},{shortcuts:["Meta + F"],action:"Find (if searchreplace plugin activated)"},{shortcuts:["Meta + Shift + F"],action:"Switch to or from fullscreen mode"}],T=tinymce.util.Tools.resolve("tinymce.util.I18n"),d=b([{key:"advlist",name:"Advanced List"},{key:"anchor",name:"Anchor"},{key:"autolink",name:"Autolink"},{key:"autoresize",name:"Autoresize"},{key:"autosave",name:"Autosave"},{key:"bbcode",name:"BBCode"},{key:"charmap",name:"Character Map"},{key:"code",name:"Code"},{key:"codesample",name:"Code Sample"},{key:"colorpicker",name:"Color Picker"},{key:"directionality",name:"Directionality"},{key:"emoticons",name:"Emoticons"},{key:"fullpage",name:"Full Page"},{key:"fullscreen",name:"Full Screen"},{key:"help",name:"Help"},{key:"hr",name:"Horizontal Rule"},{key:"image",name:"Image"},{key:"imagetools",name:"Image Tools"},{key:"importcss",name:"Import CSS"},{key:"insertdatetime",name:"Insert Date/Time"},{key:"legacyoutput",name:"Legacy Output"},{key:"link",name:"Link"},{key:"lists",name:"Lists"},{key:"media",name:"Media"},{key:"nonbreaking",name:"Nonbreaking"},{key:"noneditable",name:"Noneditable"},{key:"pagebreak",name:"Page Break"},{key:"paste",name:"Paste"},{key:"preview",name:"Preview"},{key:"print",name:"Print"},{key:"quickbars",name:"Quick Toolbars"},{key:"save",name:"Save"},{key:"searchreplace",name:"Search and Replace"},{key:"spellchecker",name:"Spell Checker"},{key:"tabfocus",name:"Tab Focus"},{key:"table",name:"Table"},{key:"template",name:"Template"},{key:"textcolor",name:"Text Color"},{key:"textpattern",name:"Text Pattern"},{key:"toc",name:"Table of Contents"},{key:"visualblocks",name:"Visual Blocks"},{key:"visualchars",name:"Visual Characters"},{key:"wordcount",name:"Word Count"},{key:"a11ychecker",name:"Accessibility Checker",type:"premium"},{key:"advcode",name:"Advanced Code Editor",type:"premium"},{key:"advtable",name:"Advanced Tables",type:"premium"},{key:"autocorrect",name:"Autocorrect",type:"premium"},{key:"casechange",name:"Case Change",type:"premium"},{key:"checklist",name:"Checklist",type:"premium"},{key:"export",name:"Export",type:"premium"},{key:"mediaembed",name:"Enhanced Media Embed",type:"premium"},{key:"formatpainter",name:"Format Painter",type:"premium"},{key:"linkchecker",name:"Link Checker",type:"premium"},{key:"mentions",name:"Mentions",type:"premium"},{key:"pageembed",name:"Page Embed",type:"premium"},{key:"permanentpen",name:"Permanent Pen",type:"premium"},{key:"powerpaste",name:"PowerPaste",type:"premium"},{key:"rtc",name:"Real-Time Collaboration",type:"premium"},{key:"tinymcespellchecker",name:"Spell Checker Pro",type:"premium"},{key:"tinycomments",name:"Tiny Comments",type:"premium",slug:"comments"},{key:"tinydrive",name:"Tiny Drive",type:"premium"}],function(e){return g(g({},e),{type:e.type||"opensource",slug:e.slug||e.key})}),C=tinymce.util.Tools.resolve("tinymce.EditorManager");n.add("help",function(e){var t,n,a,o=(t={},{get:function(){return t},set:function(e){t=e}}),i={addTab:function(e){var t=n.get();t[e.name]=e,n.set(t)}},r=l(e,n=o),s=r;return(a=e).ui.registry.addButton("help",{icon:"help",tooltip:"Help",onAction:s}),a.ui.registry.addMenuItem("help",{text:"Help",icon:"help",shortcut:"Alt+0",onAction:s}),e.addCommand("mceHelp",r),e.shortcuts.add("Alt+0","Open help dialog","mceHelp"),i})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/hr/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/hr/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..19df90d26e5fc5d419f4052dbbd91ce844aee346
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/hr/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("hr",function(n){var o,t;function e(){return t.execCommand("InsertHorizontalRule")}(o=n).addCommand("InsertHorizontalRule",function(){o.execCommand("mceInsertContent",!1,"<hr />")}),(t=n).ui.registry.addButton("hr",{icon:"horizontal-rule",tooltip:"Horizontal line",onAction:e}),t.ui.registry.addMenuItem("hr",{icon:"horizontal-rule",text:"Horizontal line",onAction:e})})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/image/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/image/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..c9307a2579c6cfc9b7a11fcde1d80526fb453dd6
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/image/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function e(r){return function(e){return n=typeof(t=e),(null===t?"null":"object"==n&&(Array.prototype.isPrototypeOf(t)||t.constructor&&"Array"===t.constructor.name)?"array":"object"==n&&(String.prototype.isPrototypeOf(t)||t.constructor&&"String"===t.constructor.name)?"string":n)===r;var t,n}}function t(t){return function(e){return typeof e===t}}function D(e){return!(null==e)}function l(){}function a(e){return function(){return e}}function n(e){return e}function r(){return g}var i,o=tinymce.util.Tools.resolve("tinymce.PluginManager"),v=function(){return(v=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var i in t=arguments[n])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e}).apply(this,arguments)},T=e("string"),s=e("object"),c=e("array"),N=t("boolean"),w=t("function"),u=t("number"),m=a(!1),d=a(!(i=null)),g={fold:function(e,t){return e()},isSome:m,isNone:d,getOr:n,getOrThunk:p,getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:a(null),getOrUndefined:a(void 0),or:n,orThunk:p,map:r,each:l,bind:r,exists:m,forall:d,filter:function(){return g},toArray:function(){return[]},toString:a("none()")};function p(e){return e()}function f(e,a,o,l){return function(e){for(var t=y(e),n=0,r=t.length;n<r;n++){var i=t[n];!function(e,t){(a(e,t)?o:l)(e,t)}(e[i],i)}}(e),1}function h(e,t){return A.call(e,t)}function S(e){for(var t=[],n=0,r=e.length;n<r;++n){if(!c(e[n]))throw new Error("Arr.flatten item "+n+" was not an array, input: "+e);U.apply(t,e[n])}return t}var b=function(n){function e(){return i}function t(e){return e(n)}var r=a(n),i={fold:function(e,t){return t(n)},isSome:d,isNone:m,getOr:r,getOrThunk:r,getOrDie:r,getOrNull:r,getOrUndefined:r,or:e,orThunk:e,map:function(e){return b(e(n))},each:function(e){e(n)},bind:t,exists:t,forall:t,filter:function(e){return e(n)?i:g},toArray:function(){return[n]},toString:function(){return"some("+n+")"}};return i},L={some:b,none:r,from:function(e){return null==e?g:b(e)}},y=Object.keys,A=Object.hasOwnProperty,U=Array.prototype.push;function I(e,t,n){!function(e,t,n){if(!(T(n)||N(n)||u(n)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",n,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,n+"")}(e.dom,t,n)}function C(e){return e.getParam("image_dimensions",!0,"boolean")}function x(e,t){return Math.max(parseInt(e,10),parseInt(t,10))}function O(e){return e&&e.replace(/px$/,"")}function P(e){return 0<e.length&&/^[0-9]+$/.test(e)&&(e+="px"),e}function _(e){if(e.margin){var t=String(e.margin).split(" ");switch(t.length){case 1:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[0],e["margin-bottom"]=e["margin-bottom"]||t[0],e["margin-left"]=e["margin-left"]||t[0];break;case 2:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[0],e["margin-left"]=e["margin-left"]||t[1];break;case 3:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[2],e["margin-left"]=e["margin-left"]||t[1];break;case 4:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[2],e["margin-left"]=e["margin-left"]||t[3]}delete e.margin}return e}function E(e){return"IMG"===e.nodeName&&(e.hasAttribute("data-mce-object")||e.hasAttribute("data-mce-placeholder"))}function R(e,t){return we.isDomSafe(t,"img",e.settings)}function k(e){return e.style.marginLeft&&e.style.marginRight&&e.style.marginLeft===e.style.marginRight?O(e.style.marginLeft):""}function z(e){return e.style.marginTop&&e.style.marginBottom&&e.style.marginTop===e.style.marginBottom?O(e.style.marginTop):""}function M(e){return e.style.borderWidth?O(e.style.borderWidth):""}function j(e,t){return e.hasAttribute(t)?e.getAttribute(t):""}function B(e,t){return e.style[t]||""}function H(e){return null!==e.parentNode&&"FIGURE"===e.parentNode.nodeName}function F(e,t,n){""===n?e.removeAttribute(t):e.setAttribute(t,n)}function G(e,t){var n=e.getAttribute("style"),r=t(null!==n?n:"");0<r.length?(e.setAttribute("style",r),e.setAttribute("data-mce-style",r)):e.removeAttribute("style")}function W(e,r){return function(e,t,n){e.style[t]?(e.style[t]=P(n),G(e,r)):F(e,t,n)}}function V(e,t){return e.style[t]?O(e.style[t]):j(e,t)}function $(e,t){var n=P(t);e.style.marginLeft=n,e.style.marginRight=n}function J(e,t){var n=P(t);e.style.marginTop=n,e.style.marginBottom=n}function K(e,t){var n=P(t);e.style.borderWidth=n}function X(e,t){e.style.borderStyle=t}function Z(e){return"FIGURE"===e.nodeName}function q(e){return 0===Ue.getAttrib(e,"alt").length&&"presentation"===Ue.getAttrib(e,"role")}function Q(){return{src:"",alt:"",title:"",width:"",height:"",class:"",style:"",caption:!1,hspace:"",vspace:"",border:"",borderStyle:"",isDecorative:!1}}function Y(e,t){return{src:j(t,"src"),alt:q(n=t)?"":j(n,"alt"),title:j(t,"title"),width:V(t,"width"),height:V(t,"height"),class:j(t,"class"),style:e(j(t,"style")),caption:H(t),hspace:k(t),vspace:z(t),border:M(t),borderStyle:B(t,"borderStyle"),isDecorative:q(t)};var n}function ee(e,t,n,r,i){n[r]!==t[r]&&i(e,r,n[r])}function te(r,i){return function(e,t,n){r(e,n),G(e,i)}}function ne(e,t){var n=_(e.dom.styles.parse(t)),r=e.dom.styles.parse(e.dom.styles.serialize(n));return e.dom.styles.serialize(r)}function re(e){var t=e.selection.getNode(),n=e.dom.getParent(t,"figure.image");return n?e.dom.select("img",n)[0]:t&&("IMG"!==t.nodeName||E(t))?null:t}function ie(n,e){var r,t,i=n.dom,a=(f(n.schema.getTextBlockElements(),function(e,t){return!n.schema.isValidChild(t,"figure")},(r=t={},function(e,t){r[t]=e}),l),t),o=i.getParent(e.parentNode,function(e){return h(t=a,n=e.nodeName)&&null!=t[n];var t,n},n.getBody());return o?i.split(o,e):e}function ae(r,e){var t=function(e){var t=document.createElement("img");if(Ce(function(e){return ne(r,e)},v(v({},e),{caption:!1}),t),Ie(t,e.alt,e.isDecorative),e.caption){var n=Ue.create("figure",{class:"image"});return n.appendChild(t),n.appendChild(Ue.create("figcaption",{contentEditable:"true"},"Caption")),n.contentEditable="false",n}return t}(e);r.dom.setAttrib(t,"data-mce-id","__mcenew"),r.focus(),r.selection.setContent(t.outerHTML);var n,i=r.dom.select('*[data-mce-id="__mcenew"]')[0];r.dom.setAttrib(i,"data-mce-id",null),Z(i)?(n=ie(r,i),r.selection.select(n)):r.selection.select(i)}function oe(t,e){var n,r,i,a,o,l,s,c,u,m,d,g,p,f,h,b=re(t);function y(){f.onload=f.onerror=null,g.selection&&(g.selection.select(f),g.nodeChanged())}b?(n=Y(function(e){return ne(t,e)},b),r=v(v({},n),e),s=t,c=r.src,i=v(v({},r),{src:R(s,c)?c:""}),r.src?(m=i,h=re(u=t),Ce(function(e){return ne(u,e)},m,h),u.dom.setAttrib(h,"src",h.getAttribute("src")),Z(h.parentNode)?(d=h.parentNode,ie(u,d),u.selection.select(h.parentNode)):(u.selection.select(h),g=u,p=m,(f=h).onload=function(){p.width||p.height||!C(g)||g.dom.setAttribs(f,{width:String(f.clientWidth),height:String(f.clientHeight)}),y()},f.onerror=y)):(a=t,(o=b)&&(l=a.dom.is(o.parentNode,"figure.image")?o.parentNode:o,a.dom.remove(l),a.focus(),a.nodeChanged(),a.dom.isEmpty(a.getBody())&&(a.setContent(""),a.selection.setCursorLocation())))):e.src&&ae(t,v(v({},Q()),e))}function le(e){return T(e.value)?e.value:""}function se(t){return void 0===t&&(t=le),function(e){return e?L.from(e).map(function(e){return Ne(e,t)}):L.none()}}function ce(e){var t=e.imageList.map(function(e){return{name:"images",type:"listbox",label:"Image list",items:e}}),n={name:"alt",type:"input",label:"Alternative description",disabled:e.hasAccessibilityOptions&&e.image.isDecorative},r=e.classList.map(function(e){return{name:"classes",type:"listbox",label:"Class",items:e}});return S([[{name:"src",type:"urlinput",filetype:"image",label:"Source"}],t.toArray(),e.hasAccessibilityOptions&&e.hasDescription?[{type:"label",label:"Accessibility",items:[{name:"isDecorative",type:"checkbox",label:"Image is decorative"}]}]:[],e.hasDescription?[n]:[],e.hasImageTitle?[{name:"title",type:"input",label:"Image title"}]:[],e.hasDimensions?[{name:"dimensions",type:"sizeinput"}]:[],[v(v({},e.classList.isSome()&&e.hasImageCaption?{type:"grid",columns:2}:{type:"panel"}),{items:S([r.toArray(),e.hasImageCaption?[{type:"label",label:"Caption",items:[{type:"checkbox",name:"caption",label:"Show caption"}]}]:[]])})]])}function ue(e){return{src:{value:e.src,meta:{}},images:e.src,alt:e.alt,title:e.title,dimensions:{width:e.width,height:e.height},classes:e.class,caption:e.caption,style:e.style,vspace:e.vspace,border:e.border,hspace:e.hspace,borderstyle:e.borderStyle,fileinput:[],isDecorative:e.isDecorative}}function me(e,t){return{src:e.src.value,alt:0===e.alt.length&&t?null:e.alt,title:e.title,width:e.dimensions.width,height:e.dimensions.height,class:e.classes,style:e.style,caption:e.caption,hspace:e.hspace,vspace:e.vspace,border:e.border,borderStyle:e.borderstyle,isDecorative:e.isDecorative}}function de(e,t,n,r){var i,a,o,l,s,c,u,m,d,g,p,f,h,b,y,v,A,D,w,S,U,I,C,x,O;U=t,C=(I=r).getData(),x=U,O=C.src.value,(/^(?:[a-zA-Z]+:)?\/\//.test(O)?L.none():x.prependURL.bind(function(e){return O.substring(0,e.length)!==e?L.some(e+O):L.none()})).each(function(e){I.setData({src:{value:e,meta:C.src.meta}})}),h=t,w=(b=r).getData(),void 0!==(S=w.src.meta)&&(y=xe({},w),A=y,D=S,(v=h).hasDescription&&T(D.alt)&&(A.alt=D.alt),v.hasAccessibilityOptions&&(A.isDecorative=D.isDecorative||A.isDecorative||!1),v.hasImageTitle&&T(D.title)&&(A.title=D.title),v.hasDimensions&&(T(D.width)&&(A.dimensions.width=D.width),T(D.height)&&(A.dimensions.height=D.height)),T(D.class)&&Ee(v.classList,D.class).each(function(e){A.classes=e.value}),v.hasImageCaption&&N(D.caption)&&(A.caption=D.caption),v.hasAdvTab&&(T(D.style)&&(A.style=D.style),T(D.vspace)&&(A.vspace=D.vspace),T(D.border)&&(A.border=D.border),T(D.hspace)&&(A.hspace=D.hspace),T(D.borderstyle)&&(A.borderstyle=D.borderstyle)),b.setData(y)),i=e,a=t,o=n,c=(s=(l=r).getData()).src.value,(u=s.src.meta||{}).width||u.height||!a.hasDimensions||(0<c.length?i.imageSize(c).then(function(e){o.open&&l.setData({dimensions:e})}).catch(function(e){return console.error(e)}):l.setData({dimensions:{width:"",height:""}})),m=t,d=n,p=(g=r).getData(),f=Ee(m.imageList,p.src.value),d.prevImage=f,g.setData({images:f.map(function(e){return e.value}).getOr("")})}function ge(l,s,t,c){var e,n=c.getData();c.block("Uploading image"),(0<(e=n.fileinput).length?L.some(e[0]):L.none()).fold(function(){c.unblock()},function(n){function r(){c.unblock(),URL.revokeObjectURL(a)}function i(e){c.setData({src:{value:e,meta:{}}}),c.showTab("general"),de(l,s,t,c)}var a=URL.createObjectURL(n),o=n;new De(function(e,t){var n=new FileReader;n.onload=function(){e(n.result)},n.onerror=function(){t(n.error.message)},n.readAsDataURL(o)}).then(function(e){var t=l.createBlobCache(n,a,e);s.automaticUploads?l.uploadImage(t).then(function(e){i(e.url),r()}).catch(function(e){r(),l.alertErr(e)}):(l.addToBlobCache(t),i(t.blobUri()),c.unblock())})})}function pe(S,U,I){return function(e,t){var n,r,i,a,o,l,s,c,u,m,d,g,p,f,h,b,y,v,A,D,w;"src"===t.name?de(S,U,I,e):"images"===t.name?(c=S,u=U,m=I,g=(d=e).getData(),(p=Ee(u.imageList,g.images)).each(function(e){""===g.alt||m.prevImage.map(function(e){return e.text===g.alt}).getOr(!1)?""===e.value?d.setData({src:e,alt:m.prevAlt}):d.setData({src:e,alt:e.text}):d.setData({src:e})}),m.prevImage=p,de(c,u,m,d)):"alt"===t.name?I.prevAlt=e.getData().alt:"style"===t.name?(o=S,s=(l=e).getData(),y=o.parseStyle,v=o.serializeStyle,D=_(y((A=s).style)),(w=xe({},A)).vspace=D["margin-top"]&&D["margin-bottom"]&&D["margin-top"]===D["margin-bottom"]?O(String(D["margin-top"])):"",w.hspace=D["margin-right"]&&D["margin-left"]&&D["margin-right"]===D["margin-left"]?O(String(D["margin-right"])):"",w.border=D["border-width"]?O(String(D["border-width"])):"",w.borderstyle=D["border-style"]?String(D["border-style"]):"",w.style=v(y(v(D))),l.setData(w)):"vspace"===t.name||"hspace"===t.name||"border"===t.name||"borderstyle"===t.name?(n=S,i=xe(ue(U.image),(r=e).getData()),f=n.normalizeCss,h=me(i,!1),F(b=document.createElement("img"),"style",h.style),!k(b)&&""===h.hspace||$(b,h.hspace),!z(b)&&""===h.vspace||J(b,h.vspace),!M(b)&&""===h.border||K(b,h.border),!B(b,"borderStyle")&&""===h.borderStyle||X(b,h.borderStyle),a=f(b.getAttribute("style")),r.setData({style:a})):"fileinput"===t.name?ge(S,U,I,e):"isDecorative"===t.name&&(e.getData().isDecorative?e.disable("alt"):e.enable("alt"))}}function fe(v){var t,n,r,i,a,o,l,s,c,A={onSubmit:function(n){return function(e){var t=xe(ue(n.image),e.getData());c.execCommand("mceUpdateImage",!1,me(t,n.hasAccessibilityOptions)),c.editorUpload.uploadImagesAuto(),e.close()}},imageSize:function(e){return R(s,e)?(i=s.documentBaseURI.toAbsolute(e),new De(function(t){function n(e){r.onload=r.onerror=null,r.parentNode&&r.parentNode.removeChild(r),t(e)}var r=document.createElement("img");r.onload=function(){var e=x(r.width,r.clientWidth),t=x(r.height,r.clientHeight);n(De.resolve({width:e,height:t}))},r.onerror=function(){n(De.reject("Failed to get image dimensions for: "+i))};var e=r.style;e.visibility="hidden",e.position="fixed",e.bottom=e.left="0px",e.width=e.height="auto",document.body.appendChild(r),r.src=i}).then(function(e){return{width:String(e.width),height:String(e.height)}})):De.resolve({width:"",height:""});var i},addToBlobCache:function(e){l.editorUpload.blobCache.add(e)},createBlobCache:function(e,t,n){return o.editorUpload.blobCache.create({blob:e,blobUri:t,name:e.name?e.name.replace(/\.[^\.]+$/,""):null,filename:e.name,base64:n.split(",")[1]})},alertErr:function(e){a.windowManager.alert(e)},normalizeCss:function(e){return ne(i,e)},parseStyle:function(e){return r.dom.parseStyle(e)},serializeStyle:function(e,t){return n.dom.serializeStyle(e,t)},uploadImage:(t=n=r=i=a=o=l=s=c=v,function(e){return Oe(t).upload([e],!1).then(function(e){return 0===e.length?De.reject("Failed to upload image"):!1===e[0].status?De.reject(e[0].error.message):e[0]})})};return{open:function(){var a,r,t,e,i,n,o,l,s,c,u,m,d,g,p,f,h,b,y;r=v,i=Pe(function(e){return r.convertURL(e.value||e.url,"src")}),n=new De(function(t){var n=function(e){t(i(e).map(function(e){return S([[{text:"None",value:""}],e])}))},e=r.getParam("image_list",!1);T(e)?Se.send({url:e,success:function(e){n(JSON.parse(e))}}):w(e)?e(n):n(e)}),o=_e(r.getParam("image_class_list")),l=r.getParam("image_advtab",!1,"boolean"),s=r.getParam("image_uploadtab",!0,"boolean"),c=D(r.getParam("images_upload_url")),u=D(r.getParam("images_upload_handler")),m=(e=re(t=r))?Y(function(e){return ne(t,e)},e):Q(),d=r.getParam("image_description",!0,"boolean"),g=r.getParam("image_title",!1,"boolean"),p=C(r),f=r.getParam("image_caption",!1,"boolean"),h=r.getParam("a11y_advanced_options",!1,"boolean"),b=r.getParam("automatic_uploads",!0,"boolean"),y=L.some(r.getParam("image_prepend_url","","string")).filter(function(e){return T(e)&&0<e.length}),n.then(function(e){return{image:m,imageList:e,classList:o,hasAdvTab:l,hasUploadTab:s,hasUploadUrl:c,hasUploadHandler:u,hasDescription:d,hasImageTitle:g,hasDimensions:p,hasImageCaption:f,prependURL:y,hasAccessibilityOptions:h,automaticUploads:b}}).then((a=A,function(e){var t,n,r,i={prevImage:Ee((t=e).imageList,t.image.src),prevAlt:t.image.alt,open:!0};return{title:"Insert/Edit Image",size:"normal",body:(r=e).hasAdvTab||r.hasUploadUrl||r.hasUploadHandler?{type:"tabpanel",tabs:S([[ke(r)],r.hasAdvTab?[Re(r)]:[],r.hasUploadTab&&(r.hasUploadUrl||r.hasUploadHandler)?[Me(r)]:[]])}:{type:"panel",items:ze(r)},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:ue(e.image),onSubmit:a.onSubmit(e),onChange:pe(a,e,i),onClose:(n=i,function(){n.open=!1})}})).then(v.windowManager.open)}}}function he(a){return function(e){for(var t=e.length,n=function(e){e.attr("contenteditable",a?"true":null)};t--;){var r,i=e[t];(r=i.attr("class"))&&/\bimage\b/.test(r)&&(i.attr("contenteditable",a?"false":null),Te.each(i.getAll("figcaption"),n))}}}"undefined"!=typeof window||Function("return this;")();function be(e){if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}}var ye,ve=be,Ae=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),De=tinymce.util.Tools.resolve("tinymce.util.Promise"),we=tinymce.util.Tools.resolve("tinymce.util.URI"),Se=tinymce.util.Tools.resolve("tinymce.util.XHR"),Ue=Ae.DOM,Ie=function(e,t,n){n?(Ue.setAttrib(e,"role","presentation"),I(ve(e),"alt","")):(i===t?ve(e).dom.removeAttribute("alt"):I(ve(e),"alt",t),"presentation"===Ue.getAttrib(e,"role")&&Ue.setAttrib(e,"role",""))},Ce=function(e,t,n){var r=Y(e,n);ee(n,r,t,"caption",function(e,t,n){return H(r=e)?(o=r.parentNode,Ue.insertAfter(r,o),Ue.remove(o)):(i=r,a=Ue.create("figure",{class:"image"}),Ue.insertAfter(a,i),a.appendChild(i),a.appendChild(Ue.create("figcaption",{contentEditable:"true"},"Caption")),a.contentEditable="false"),0;var r,i,a,o}),ee(n,r,t,"src",F),ee(n,r,t,"title",F),ee(n,r,t,"width",W(0,e)),ee(n,r,t,"height",W(0,e)),ee(n,r,t,"class",F),ee(n,r,t,"style",te(function(e,t){return F(e,"style",t),0},e)),ee(n,r,t,"hspace",te($,e)),ee(n,r,t,"vspace",te(J,e)),ee(n,r,t,"border",te(K,e)),ee(n,r,t,"borderStyle",te(X,e)),t.alt===r.alt&&t.isDecorative===r.isDecorative||Ie(n,t.alt,t.isDecorative)},xe=(ye=function(e,t){return s(e)&&s(t)?xe(e,t):t},function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];if(0===e.length)throw new Error("Can't merge zero objects");for(var n={},r=0;r<e.length;r++){var i,a=e[r];for(i in a)h(a,i)&&(n[i]=ye(n[i],a[i]))}return n}),Oe=tinymce.util.Tools.resolve("tinymce.util.ImageUploader"),Te=tinymce.util.Tools.resolve("tinymce.util.Tools"),Ne=function(e,a){var o=[];return Te.each(e,function(e){var t,n,r,i=T((t=e).text)?t.text:T(t.title)?t.title:"";void 0!==e.menu?(n=Ne(e.menu,a),o.push({text:i,items:n})):(r=a(e),o.push({text:i,value:r}))}),o},Le=function(e,i){return function(e){for(var t,n=0;n<e.length;n++){var r=h(t=e[n],"items")?Le(t.items,i):t.value===i?L.some(t):L.none();if(r.isSome())return r}return L.none()}(e)},Pe=se,_e=function(e){return se(le)(e)},Ee=function(e,t){return e.bind(function(e){return Le(e,t)})},Re=function(e){return{title:"Advanced",name:"advanced",items:[{type:"input",label:"Style",name:"style"},{type:"grid",columns:2,items:[{type:"input",label:"Vertical space",name:"vspace",inputMode:"numeric"},{type:"input",label:"Horizontal space",name:"hspace",inputMode:"numeric"},{type:"input",label:"Border width",name:"border",inputMode:"numeric"},{type:"listbox",name:"borderstyle",label:"Border style",items:[{text:"Select...",value:""},{text:"Solid",value:"solid"},{text:"Dotted",value:"dotted"},{text:"Dashed",value:"dashed"},{text:"Double",value:"double"},{text:"Groove",value:"groove"},{text:"Ridge",value:"ridge"},{text:"Inset",value:"inset"},{text:"Outset",value:"outset"},{text:"None",value:"none"},{text:"Hidden",value:"hidden"}]}]}]}},ke=function(e){return{title:"General",name:"general",items:ce(e)}},ze=ce,Me=function(e){return{title:"Upload",name:"upload",items:[{type:"dropzone",name:"fileinput"}]}};o.add("image",function(e){var t,n,r;(t=e).on("PreInit",function(){t.parser.addNodeFilter("figure",he(!0)),t.serializer.addNodeFilter("figure",he(!1))}),(n=e).ui.registry.addToggleButton("image",{icon:"image",tooltip:"Insert/edit image",onAction:fe(n).open,onSetup:function(e){return e.setActive(D(re(n))),n.selection.selectorChangedWithUnbind("img:not([data-mce-object],[data-mce-placeholder]),figure.image",e.setActive).unbind}}),n.ui.registry.addMenuItem("image",{icon:"image",text:"Image...",onAction:fe(n).open}),n.ui.registry.addContextMenu("image",{update:function(e){return Z(e)||"IMG"===e.nodeName&&!E(e)?["image"]:[]}}),(r=e).addCommand("mceImage",fe(r).open),r.addCommand("mceUpdateImage",function(e,t){r.undoManager.transact(function(){return oe(r,t)})})})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/imagetools/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/imagetools/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..a58c33c160d9e5e19dc8d11fbaa2379e5718808c
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/imagetools/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function c(e){var t=e;return{get:function(){return t},set:function(e){t=e}}}function h(e){return null!=e}function r(){}function i(e){return function(){return e}}function e(e){return e}function t(){return d}function s(e){return n=typeof(t=e),"array"==(null===t?"null":"object"==n&&(Array.prototype.isPrototypeOf(t)||t.constructor&&"Array"===t.constructor.name)?"array":"object"==n&&(String.prototype.isPrototypeOf(t)||t.constructor&&"String"===t.constructor.name)?"string":n);var t,n}var n,o=tinymce.util.Tools.resolve("tinymce.PluginManager"),f=tinymce.util.Tools.resolve("tinymce.util.Tools"),a=function(e){return typeof e===n},u=i(!(n="function")),l=i(!0),d={fold:function(e,t){return e()},isSome:u,isNone:l,getOr:e,getOrThunk:m,getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(void 0),or:e,orThunk:m,map:t,each:r,bind:t,exists:u,forall:l,filter:function(){return d},toArray:function(){return[]},toString:i("none()")};function m(e){return e()}var g=function(n){function e(){return o}function t(e){return e(n)}var r=i(n),o={fold:function(e,t){return t(n)},isSome:l,isNone:u,getOr:r,getOrThunk:r,getOrDie:r,getOrNull:r,getOrUndefined:r,or:e,orThunk:e,map:function(e){return g(e(n))},each:function(e){e(n)},bind:t,exists:t,forall:t,filter:function(e){return e(n)?o:d},toArray:function(){return[n]},toString:function(){return"some("+n+")"}};return o},p={some:g,none:t,from:function(e){return null==e?d:g(e)}},v={},y={exports:v};function w(e,t){return U(document.createElement("canvas"),e,t)}function b(e){var t=w(e.width,e.height);return R(t).drawImage(e,0,0),t}function _(u){return new I(function(e,t){function n(){o.removeEventListener("load",i),o.removeEventListener("error",a)}var r=URL.createObjectURL(u),o=new Image,i=function(){n(),e(o)},a=function(){n(),t("Unable to load data of type "+u.type+": "+r)};o.addEventListener("load",i),o.addEventListener("error",a),o.src=r,o.complete&&setTimeout(i,0)})}function E(e,r,o){return r=r||"image/png",a(HTMLCanvasElement.prototype.toBlob)?new I(function(t,n){e.toBlob(function(e){e?t(e):n()},r,o)}):j(e.toDataURL(r,o))}function T(e,t){for(var n=0,r=e.length;n<r;n++)t(e[n],n)}function x(e,t){return function(e,t,n){for(var r=0,o=e.length;r<o;r++){var i=e[r];if(t(i,r))return p.some(i);if(n(i,r))break}return p.none()}(e,t,u)}!function(){var e=this,t=function(){var e,t,n,r={exports:{}};function o(){}function i(e){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof e)throw new TypeError("not a function");this._state=0,this._handled=!1,this._value=void 0,this._deferreds=[],l(e,this)}function a(n,r){for(;3===n._state;)n=n._value;0!==n._state?(n._handled=!0,i._immediateFn(function(){var e,t=1===n._state?r.onFulfilled:r.onRejected;if(null!==t){try{e=t(n._value)}catch(e){return void c(r.promise,e)}u(r.promise,e)}else(1===n._state?u:c)(r.promise,n._value)})):n._deferreds.push(r)}function u(t,e){try{if(e===t)throw new TypeError("A promise cannot be resolved with itself.");if(e&&("object"==typeof e||"function"==typeof e)){var n=e.then;if(e instanceof i)return t._state=3,t._value=e,void s(t);if("function"==typeof n)return void l((r=n,o=e,function(){r.apply(o,arguments)}),t)}t._state=1,t._value=e,s(t)}catch(e){c(t,e)}var r,o}function c(e,t){e._state=2,e._value=t,s(e)}function s(e){2===e._state&&0===e._deferreds.length&&i._immediateFn(function(){e._handled||i._unhandledRejectionFn(e._value)});for(var t=0,n=e._deferreds.length;t<n;t++)a(e,e._deferreds[t]);e._deferreds=null}function f(e,t,n){this.onFulfilled="function"==typeof e?e:null,this.onRejected="function"==typeof t?t:null,this.promise=n}function l(e,t){var n=!1;try{e(function(e){n||(n=!0,u(t,e))},function(e){n||(n=!0,c(t,e))})}catch(e){if(n)return;n=!0,c(t,e)}}e=r,t="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=setTimeout,i.prototype.catch=function(e){return this.then(null,e)},i.prototype.then=function(e,t){var n=new this.constructor(o);return a(this,new f(e,t,n)),n},i.all=function(e){var u=Array.prototype.slice.call(e);return new i(function(o,i){if(0===u.length)return o([]);for(var a=u.length,e=0;e<u.length;e++)!function t(n,e){try{if(e&&("object"==typeof e||"function"==typeof e)){var r=e.then;if("function"==typeof r)return r.call(e,function(e){t(n,e)},i),0}u[n]=e,0==--a&&o(u)}catch(e){i(e)}}(e,u[e])})},i.resolve=function(t){return t&&"object"==typeof t&&t.constructor===i?t:new i(function(e){e(t)})},i.reject=function(n){return new i(function(e,t){t(n)})},i.race=function(o){return new i(function(e,t){for(var n=0,r=o.length;n<r;n++)o[n].then(e,t)})},i._immediateFn="function"==typeof setImmediate?function(e){setImmediate(e)}:function(e){n(e,0)},i._unhandledRejectionFn=function(e){"undefined"!=typeof console&&console&&console.warn("Possible Unhandled Promise Rejection:",e)},i._setImmediateFn=function(e){i._immediateFn=e},i._setUnhandledRejectionFn=function(e){i._unhandledRejectionFn=e},e.exports?e.exports=i:t.Promise||(t.Promise=i);var d=r.exports;return{boltExport:("undefined"!=typeof window?window:Function("return this;")()).Promise||d}};"object"==typeof v&&void 0!==y?y.exports=t():(e="undefined"!=typeof globalThis?globalThis:e||self).EphoxContactWrapper=t()}();var I=y.exports.boltExport,R=function(e){return e.getContext("2d")},U=function(e,t,n){return e.width=t,e.height=n,e},A=function(r){return new I(function(e,t){var n=new XMLHttpRequest;n.open("GET",r,!0),n.responseType="blob",n.onload=function(){200===this.status&&e(this.response)},n.onerror=function(){var e;t(0===this.status?((e=new Error("No access to download image")).code=18,e.name="SecurityError",e):new Error("Error "+this.status+" downloading image"))},n.send()})},j=function(h){return new I(function(e,t){!function(){var e=h.split(","),t=/data:([^;]+)/.exec(e[0]);if(!t)return p.none();for(var n=t[1],r=e[1],o=atob(r),i=o.length,a=Math.ceil(i/1024),u=new Array(a),c=0;c<a;++c){for(var s=1024*c,f=Math.min(1024+s,i),l=new Array(f-s),d=s,m=0;d<f;++m,++d)l[m]=o[d].charCodeAt(0);u[c]=new Uint8Array(l)}return p.some(new Blob(u,{type:n}))}().fold(function(){t("uri is not base64: "+h)},e)})},S=function(e){URL.revokeObjectURL(e.src)},M=_,P=Array.prototype.indexOf,O=Object.keys;function L(e,t,n){function r(t,n){return e.then(function(e){return e.toDataURL(t||"image/png",n)})}return{getType:i(t.type),toBlob:function(){return I.resolve(t)},toDataURL:i(n),toBase64:function(){return n.split(",")[1]},toAdjustedBlob:function(t,n){return e.then(function(e){return E(e,t,n)})},toAdjustedDataURL:r,toAdjustedBase64:function(e,t){return r(e,t).then(function(e){return e.split(",")[1]})},toCanvas:function(){return e.then(b)}}}function k(t,e){return E(t,e).then(function(e){return L(I.resolve(t),e,t.toDataURL())})}function C(e,t){void 0===t&&(t=2);var n=Math.pow(10,t),r=Math.round(e*n);return Math.ceil(r/n)}function F(t,n,r){return void 0===r&&(r=!1),new I(function(e){var a=new XMLHttpRequest;a.onreadystatechange=function(){4===a.readyState&&e({status:a.status,blob:a.response})},a.open("GET",t,!0),a.withCredentials=r,function(e){for(var t,n=O(e),r=0,o=n.length;r<o;r++){var i=n[r];t=e[i],a.setRequestHeader(i,t)}}(n),a.responseType="blob",a.send()})}function B(e){var t,n=(t=e,"ImageProxy HTTP error: "+x(J,function(e){return t===e.code}).fold(i("Unknown ImageProxy error"),function(e){return e.message}));return I.reject(n)}function N(t){return x(K,function(e){return e.type===t}).fold(i("Unknown service error"),function(e){return e.message})}function D(e){return"ImageProxy Service error: "+function(e){try{return p.some(JSON.parse(e))}catch(e){return p.none()}}(e).bind(function(e){return n=function(e,t){return h(e)?e[t]:void 0},r=e,T(["error","type"],function(e,t){r=n(r,e)}),t=r,p.from(t).map(N);var n,r,t}).getOr("Invalid JSON in service error message")}function H(e){return e<200||300<=e}function z(e,t){var n,r,o,i={"Content-Type":"application/json;charset=UTF-8","tiny-api-key":t};return F((r=t,o=-1===(n=e).indexOf("?")?"?":"&",/[?&]apiKey=/.test(n)?n:n+o+"apiKey="+encodeURIComponent(r)),i).then(function(e){return H(e.status)?(t=e.status,"application/json"!==(null==(n=e.blob)?void 0:n.type)||400!==t&&403!==t&&404!==t&&500!==t?B(t):(r=n,new I(function(e,t){var n=new FileReader;n.onload=function(){e(n.result)},n.onerror=function(e){t(e)},n.readAsText(r)}).then(function(e){var t=D(e);return I.reject(t)}))):I.resolve(e.blob);var r,t,n})}function q(e,t,n){return void 0===n&&(n=!1),t?z(e,t):F(e,{},n).then(function(e){return H(e.status)?B(e.status):I.resolve(e.blob)})}function W(t){return n=t,new I(function(e){var t=new FileReader;t.onloadend=function(){e(t.result)},t.readAsDataURL(n)}).then(function(e){return L(_(t).then(function(e){S(e);var t=w(e.naturalWidth||e.width,e.naturalHeight||e.height);return R(t).drawImage(e,0,0),t}),t,e)});var n}!function(a){if(!s(a))throw new Error("cases must be an array");if(0===a.length)throw new Error("there must be at least one case");var u=[],n={};T(a,function(e,r){var t=O(e);if(1!==t.length)throw new Error("one and only one name per case");var i=t[0],o=e[i];if(void 0!==n[i])throw new Error("duplicate key detected:"+i);if("cata"===i)throw new Error("cannot have a case named cata (sorry)");if(!s(o))throw new Error("case arguments must be an array");u.push(i),n[i]=function(){for(var n=[],e=0;e<arguments.length;e++)n[e]=arguments[e];var t=n.length;if(t!==o.length)throw new Error("Wrong number of arguments to case "+i+". Expected "+o.length+" ("+o+"), got "+t);return{fold:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];if(e.length!==a.length)throw new Error("Wrong number of arguments to fold. Expected "+a.length+", got "+e.length);return e[r].apply(null,n)},match:function(e){var o=O(e);if(u.length!==o.length)throw new Error("Wrong number of arguments to match. Expected: "+u.join(",")+"\nActual: "+o.join(","));if(!function(e){for(var t,n=0,r=e.length;n<r;++n)if(!0!==(t=e[n],function(e,t){return-1<P.call(e,t)}(o,t)))return;return 1}(u))throw new Error("Not all branches were specified when using match. Specified: "+o.join(", ")+"\nRequired: "+u.join(", "));return e[i].apply(null,n)},log:function(e){console.log(e,{constructors:u,constructor:i,params:n})}}}})}([{bothErrors:["error1","error2"]},{firstError:["error1","value2"]},{secondError:["value1","error2"]},{bothValues:["value1","value2"]}]);function $(e){if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}}var V=function(e,t,n){var r=(n<0?360+n:n)*Math.PI/180,o=e.width,i=e.height,a=Math.sin(r),u=Math.cos(r),c=C(Math.abs(o*u)+Math.abs(i*a)),s=C(Math.abs(o*a)+Math.abs(i*u)),f=w(c,s),l=R(f);return l.translate(c/2,s/2),l.rotate(r),l.drawImage(e,-o/2,-i/2),k(f,t)},G=function(e,t,n){var r=w(e.width,e.height),o=R(r);return"v"===n?(o.scale(1,-1),o.drawImage(e,0,-r.height)):(o.scale(-1,1),o.drawImage(e,-r.width,0)),k(r,t)},J=[{code:404,message:"Could not find Image Proxy"},{code:403,message:"Rejected request"},{code:0,message:"Incorrect Image Proxy URL"}],K=[{type:"not_found",message:"Failed to load image."},{type:"key_missing",message:"The request did not include an api key."},{type:"key_not_found",message:"The provided api key could not be found."},{type:"domain_not_trusted",message:"The api key is not valid for the request origins."}],X={fromHtml:function(e,t){var n=(t||document).createElement("div");if(n.innerHTML=e,!n.hasChildNodes()||1<n.childNodes.length)throw console.error("HTML does not have a single root node",e),new Error("HTML must have a single root node");return $(n.childNodes[0])},fromTag:function(e,t){var n=(t||document).createElement(e);return $(n)},fromText:function(e,t){var n=(t||document).createTextNode(e);return $(n)},fromDom:$,fromPoint:function(e,t,n){return p.from(e.dom.elementFromPoint(t,n)).map($)}};function Q(e){return e.getParam("imagetools_proxy")}function Y(e){function t(e){return/^[0-9\.]+px$/.test(e)}var n=e.style.width,r=e.style.height;return n||r?t(n)&&t(r)?{w:parseInt(n,10),h:parseInt(r,10)}:null:(n=e.width,r=e.height,n&&r?{w:parseInt(n,10),h:parseInt(r,10)}:null)}function Z(e){return{w:e.naturalWidth,h:e.naturalHeight}}function ee(e){return t=X.fromDom(e),n="img",r=function(r){return function(e){var t=r.dom;if(1!==t.nodeType)return!1;var n=t;if(void 0!==n.matches)return n.matches(e);if(void 0!==n.msMatchesSelector)return n.msMatchesSelector(e);if(void 0!==n.webkitMatchesSelector)return n.webkitMatchesSelector(e);if(void 0!==n.mozMatchesSelector)return n.mozMatchesSelector(e);throw new Error("Browser lacks native selectors")}(n)},x(t.dom.childNodes,function(e){return r(X.fromDom(e))}).map(X.fromDom);var t,n,r}function te(e,t){return e.dom.is(t,"figure")}function ne(e,t){return e.dom.is(t,"img:not([data-mce-object],[data-mce-placeholder])")}function re(t,e){function n(e){return ne(t,e)&&(be(t,e)||_e(t,e)||h(Q(t)))}return te(t,e)?ee(e).bind(function(e){return n(e.dom)?p.some(e.dom):p.none()}):n(e)?p.some(e):p.none()}function oe(e,t){e.notificationManager.open({text:t,type:"error"})}function ie(e){var t=e.selection.getNode(),n=e.dom.getParent(t,"figure.image");return null!==n&&te(e,n)?ee(n):ne(e,t)?p.some(X.fromDom(t)):p.none()}function ae(e,t,n){var r=t.match(/(?:\/|^)(([^\/\?]+)\.(?:[a-z0-9.]+))(?:\?|$)/i);return h(r)?e.dom.encode(r[n]):null}function ue(e,t){if(_e(e,t))return q(t.src,null,(n=t,-1!==f.inArray(e.getParam("imagetools_credentials_hosts",[],"string[]"),new ye(n.src).host)));var n,r;if(be(e,t))return(0===(r=t.src).indexOf("data:")?j:A)(r);var o=Q(e);return q(o+(-1===o.indexOf("?")?"?":"&")+"url="+encodeURIComponent(t.src),e.getParam("api_key",e.getParam("imagetools_api_key","","string"),"string"),!1)}function ce(e,t){var n,r,o=e.editorUpload.blobCache.getByUri(t.src);return o?ve.resolve(o.blob()):(n=e,r=t,p.from(n.getParam("imagetools_fetch_image",null,"function")).fold(function(){return ue(n,r)},function(e){return e(r)}))}function se(e){pe.clearTimeout(e.get())}function fe(u,c,s,f,l,d,m){return s.toBlob().then(function(e){var t,n,o,r=u.editorUpload.blobCache,i=d.src,a=c.type===e.type;return u.getParam("images_reuse_filename",!1,"boolean")&&(n=h(o=r.getByUri(i))?(i=o.uri(),t=o.name(),o.filename()):(t=ae(u,i,2),ae(u,i,1))),o=r.create({id:"imagetools"+we++,blob:e,base64:s.toBase64(),uri:i,name:t,filename:a?n:void 0}),r.add(o),u.undoManager.transact(function(){var r=function(){var e,t,n;u.$(d).off("load",r),u.nodeChanged(),f?u.editorUpload.uploadImagesAuto():(se(l),e=u,t=l,n=pe.setEditorTimeout(e,function(){e.editorUpload.uploadImagesAuto()},e.getParam("images_upload_timeout",3e4,"number")),t.set(n))};u.$(d).on("load",r),m&&u.$(d).attr({width:m.w,height:m.h}),u.$(d).attr({src:o.blobUri()}).removeAttr("data-mce-src")}),o})}function le(r,o,e,i){return function(){return ie(r).fold(function(){oe(r,"Could not find selected image")},function(n){return r._scanForImages().then(function(){return ce(r,n.dom)}).then(function(t){return W(t).then(e).then(function(e){return fe(r,t,e,!1,o,n.dom,i)})}).catch(function(e){oe(r,e)})})}}function de(t,n,r){return function(){var e=ie(t).map(function(e){var t=Y(e.dom);return t?{w:t.h,h:t.w}:null}).getOrNull();return le(t,n,function(e){return n=r,(t=e).toCanvas().then(function(e){return V(e,t.getType(),n)});var t,n},e)()}}function me(e,t,r){return function(){return le(e,t,function(e){return n=r,(t=e).toCanvas().then(function(e){return G(e,t.getType(),n)});var t,n})()}}function he(s,f){return function(){var n=ie(s),i=n.map(function(e){return Z(e.dom)});n.each(function(t){re(s,t.dom).each(function(e){ce(s,t.dom).then(function(e){var t={blob:e,url:URL.createObjectURL(e)};s.windowManager.open({title:"Edit Image",size:"large",body:{type:"panel",items:[{type:"imagetools",name:"imagetools",label:"Edit Image",currentState:t}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0,disabled:!0}],onSubmit:function(e){var o=e.getData().imagetools.blob;n.each(function(r){i.each(function(e){var t,n,a,u,c;t=s,n=f,a=r.dom,u=e,M(c=o).then(function(e){var t,n,r,o,i=Z(e);return u.w===i.w&&u.h===i.h||Y(a)&&(t=a,(n=i)&&(r=t.style.width,o=t.style.height,(r||o)&&(t.style.width=n.w+"px",t.style.height=n.h+"px",t.removeAttribute("data-mce-style")),r=t.width,o=t.height,(r||o)&&(t.setAttribute("width",String(n.w)),t.setAttribute("height",String(n.h))))),URL.revokeObjectURL(e.src),c}).then(W).then(function(e){return fe(t,c,e,!0,n,a)})})}),e.close()},onCancel:r,onAction:function(e,t){switch(t.name){case"save-state":t.value?e.enable("save"):e.disable("save");break;case"disable":e.disable("save"),e.disable("cancel");break;case"enable":e.enable("cancel")}}})})})})}}function ge(t){function n(e){return function(){return t.execCommand(e)}}function e(){return ie(t).exists(function(e){return re(t,e.dom).isSome()})}function r(t){function i(e){return t.setDisabled(!e)}return i(e()),o=o.concat([i]),function(){o=function(e){for(var t=[],n=0,r=e.length;n<r;n++){var o=e[n];o!==i&&t.push(o)}return t}(o)}}var o=[];t.on("NodeChange",function(){var t=e();T(o,function(e){return e(t)})}),t.ui.registry.addButton("rotateleft",{tooltip:"Rotate counterclockwise",icon:"rotate-left",onAction:n("mceImageRotateLeft"),onSetup:r}),t.ui.registry.addButton("rotateright",{tooltip:"Rotate clockwise",icon:"rotate-right",onAction:n("mceImageRotateRight"),onSetup:r}),t.ui.registry.addButton("flipv",{tooltip:"Flip vertically",icon:"flip-vertically",onAction:n("mceImageFlipVertical"),onSetup:r}),t.ui.registry.addButton("fliph",{tooltip:"Flip horizontally",icon:"flip-horizontally",onAction:n("mceImageFlipHorizontal"),onSetup:r}),t.ui.registry.addButton("editimage",{tooltip:"Edit image",icon:"edit-image",onAction:n("mceEditImage"),onSetup:r}),t.ui.registry.addButton("imageoptions",{tooltip:"Image options",icon:"image",onAction:n("mceImage")}),t.ui.registry.addContextMenu("imagetools",{update:function(e){return re(t,e).map(function(e){return{text:"Edit image",icon:"edit-image",onAction:n("mceEditImage")}}).toArray()}})}"undefined"!=typeof window||Function("return this;")();var pe=tinymce.util.Tools.resolve("tinymce.util.Delay"),ve=tinymce.util.Tools.resolve("tinymce.util.Promise"),ye=tinymce.util.Tools.resolve("tinymce.util.URI"),we=0,be=function(e,t){var n=t.src;return 0===n.indexOf("data:")||0===n.indexOf("blob:")||new ye(n).host===e.documentBaseURI.host},_e=function(e,t){return-1!==f.inArray(e.getParam("imagetools_cors_hosts",[],"string[]"),new ye(t.src).host)};o.add("imagetools",function(e){var t,r,o,i,n=c(0),a=c(null),u=e;f.each({mceImageRotateLeft:de(u,n,-90),mceImageRotateRight:de(u,n,90),mceImageFlipVertical:me(u,n,"v"),mceImageFlipHorizontal:me(u,n,"h"),mceEditImage:he(u,n)},function(e,t){u.addCommand(t,e)}),ge(e),(t=e).ui.registry.addContextToolbar("imagetools",{items:t.getParam("imagetools_toolbar","rotateleft rotateright flipv fliph editimage imageoptions"),predicate:function(e){return re(t,e).isSome()},position:"node",scope:"node"}),o=n,i=a,(r=e).on("NodeChange",function(e){var t=i.get(),n=re(r,e.element);t&&!n.exists(function(e){return t.src===e.src})&&(se(o),r.editorUpload.uploadImagesAuto(),i.set(null)),n.each(i.set)})})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/importcss/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/importcss/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..7ff3c535287e4b53279e0605edbd050a67f1f315
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/importcss/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function t(n){return function(t){return r=typeof(e=t),(null===e?"null":"object"==r&&(Array.prototype.isPrototypeOf(e)||e.constructor&&"Array"===e.constructor.name)?"array":"object"==r&&(String.prototype.isPrototypeOf(e)||e.constructor&&"String"===e.constructor.name)?"string":r)===n;var e,r}}function y(t){return t.getParam("importcss_selector_converter")}function u(e){return l(e)?function(t){return-1!==t.indexOf(e)}:e instanceof RegExp?function(t){return e.test(t)}:e}function h(t,e){var r,n=/^(?:([a-z0-9\-_]+))?(\.[a-z0-9_\-\.]+)$/i.exec(e);if(n){var o=n[1],i=n[2].substr(1).split(".").join(" "),c=x.makeMap("a,img");return n[1]?(r={title:e},t.schema.getTextBlockElements()[o]?r.block=o:t.schema.getBlockElements()[o]||c[o.toLowerCase()]?r.selector=o:r.inline=o):n[2]&&(r={inline:"span",title:e.substr(1),classes:i}),!1!==t.getParam("importcss_merge_classes")?r.classes=i:r.attributes={class:i},r}}function d(t,e){return null===e||!1!==t.getParam("importcss_exclusive")}function r(v){v.on("init",function(){function o(t,e){if(f=t,p=g,!(d(v,m=e)?f in p:f in m.selectors)){a=t,l=g,d(v,u=e)?l[a]=!0:u.selectors[a]=!0;var r=(i=(o=v).plugins.importcss,c=t,((s=e)&&s.selector_converter?s.selector_converter:y(o)?y(o):function(){return h(o,c)}).call(i,c,s));if(r){var n=r.name||_.DOM.uniqueId();return v.formatter.register(n,r),{title:r.title,format:n}}}var o,i,c,s,a,u,l,f,m,p;return null}var e,r,n,t,i=(e=[],r=[],n={},{addItemToGroup:function(t,e){n[t]?n[t].push(e):(r.push(t),n[t]=[e])},addItem:function(t){e.push(t)},toFormats:function(){return function(t){for(var e=[],r=0,n=t.length;r<n;++r){if(!f(t[r]))throw new Error("Arr.flatten item "+r+" was not an array, input: "+t);P.apply(e,t[r])}return e}(function(t,e){for(var r=t.length,n=new Array(r),o=0;o<r;o++){var i=t[o];n[o]=e(i,o)}return n}(r,function(t){var e=n[t];return 0===e.length?[]:[{title:t,items:e}]})).concat(e)}}),g={},c=u(v.getParam("importcss_selector_filter")),s=(t=v.getParam("importcss_groups"),x.map(t,function(t){return x.extend({},t,{original:t,selectors:{},filter:u(t.filter)})}));x.each(function(c,t,s){var a=[],r={},u=function(t,e){var r,n,o=n=t.href,i=p.cacheSuffix;if((n=o=l(o)?o.replace("?"+i,"").replace("&"+i,""):o)&&s(n,e)&&!function(t,e){var r,n=!1!==(r=t.getParam("skin"))&&(r||"oxide");if(n){var o=t.getParam("skin_url"),i=o?t.documentBaseURI.toAbsolute(o):m.baseURL+"/skins/ui/"+n,c=m.baseURL+"/skins/content/";return e===i+"/content"+(t.inline?".inline":"")+".min.css"||-1!==e.indexOf(c)}}(c,n)){x.each(t.imports,function(t){u(t,!0)});try{r=t.cssRules||t.rules}catch(t){}x.each(r,function(t){t.styleSheet?u(t.styleSheet,!0):t.selectorText&&x.each(t.selectorText.split(","),function(t){a.push(x.trim(t))})})}};x.each(c.contentCSS,function(t){r[t]=!0}),s=s||function(t,e){return e||r[t]};try{x.each(t.styleSheets,function(t){u(t)})}catch(t){}return a}(v,v.getDoc(),u(v.getParam("importcss_file_filter"))),function(r){var t,e,n;-1===r.indexOf(".mce-")&&(c&&!c(r)||(n=r,0<(t=x.grep(s,function(t){return!t.filter||t.filter(n)})).length?x.each(t,function(t){var e=o(r,t);e&&i.addItemToGroup(t.title,e)}):(e=o(r,null))&&i.addItem(e)))});var a=i.toFormats();v.fire("addStyleModifications",{items:a,replace:!v.getParam("importcss_append")})})}var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),l=t("string"),f=t("array"),_=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),m=tinymce.util.Tools.resolve("tinymce.EditorManager"),p=tinymce.util.Tools.resolve("tinymce.Env"),x=tinymce.util.Tools.resolve("tinymce.util.Tools"),P=Array.prototype.push;e.add("importcss",function(t){return r(t),e=t,{convertSelectorToFormat:function(t){return h(e,t)}};var e})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/insertdatetime/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/insertdatetime/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..5f11c37965ad7f750b5415cd37b015a05569f767
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/insertdatetime/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function l(e){return e.getParam("insertdatetime_timeformat",e.translate("%H:%M:%S"))}function s(e){return e.getParam("insertdatetime_formats",["%H:%M:%S","%Y-%m-%d","%I:%M:%S %p","%D"])}function r(e,t){if((e=""+e).length<t)for(var n=0;n<t-e.length;n++)e="0"+e;return e}function d(e,t,n){return void 0===n&&(n=new Date),(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=t.replace("%D","%m/%d/%Y")).replace("%r","%I:%M:%S %p")).replace("%Y",""+n.getFullYear())).replace("%y",""+n.getYear())).replace("%m",r(n.getMonth()+1,2))).replace("%d",r(n.getDate(),2))).replace("%H",""+r(n.getHours(),2))).replace("%M",""+r(n.getMinutes(),2))).replace("%S",""+r(n.getSeconds(),2))).replace("%I",""+((n.getHours()+11)%12+1))).replace("%p",n.getHours()<12?"AM":"PM")).replace("%B",""+e.translate(u[n.getMonth()]))).replace("%b",""+e.translate(o[n.getMonth()]))).replace("%A",""+e.translate(i[n.getDay()]))).replace("%a",""+e.translate(a[n.getDay()]))).replace("%%","%")}function p(e,t){var n,r,a,i,o,u;e.getParam("insertdatetime_element",!1)?(n=d(e,t),r=/%[HMSIp]/.test(t)?d(e,"%Y-%m-%dT%H:%M"):d(e,"%Y-%m-%d"),(a=e.dom.getParent(e.selection.getStart(),"time"))?(o=a,u=(i=e).dom.create("time",{datetime:r},n),o.parentNode.insertBefore(u,o),i.dom.remove(o),i.selection.select(u,!0),i.selection.collapse(!1)):e.insertContent('<time datetime="'+r+'">'+n+"</time>")):e.insertContent(d(e,t))}var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),a="Sun Mon Tue Wed Thu Fri Sat Sun".split(" "),i="Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday".split(" "),o="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),u="January February March April May June July August September October November December".split(" "),g=tinymce.util.Tools.resolve("tinymce.util.Tools");e.add("insertdatetime",function(e){var n,r,t,a,i,o,u,c;function m(e){return r.execCommand("mceInsertDate",!1,e)}(n=e).addCommand("mceInsertDate",function(e,t){p(n,null!=t?t:n.getParam("insertdatetime_dateformat",n.translate("%Y-%m-%d")))}),n.addCommand("mceInsertTime",function(e,t){p(n,null!=t?t:l(n))}),u=s(r=e),t=0<(o=s(i=r)).length?o[0]:l(i),a=t,c={get:function(){return a},set:function(e){a=e}},r.ui.registry.addSplitButton("insertdatetime",{icon:"insert-time",tooltip:"Insert date/time",select:function(e){return e===c.get()},fetch:function(e){e(g.map(u,function(e){return{type:"choiceitem",text:d(r,e),value:e}}))},onAction:function(e){m(c.get())},onItemAction:function(e,t){c.set(t),m(t)}}),r.ui.registry.addNestedMenuItem("insertdatetime",{icon:"insert-time",text:"Date/time",getSubmenuItems:function(){return g.map(u,function(e){return{type:"menuitem",text:d(r,e),onAction:(t=e,function(){c.set(t),m(t)})};var t})}})})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/legacyoutput/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/legacyoutput/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..bfab85e25c46f393fd6b3dc6a5d5b9d938f4e9e7
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/legacyoutput/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),l=tinymce.util.Tools.resolve("tinymce.util.Tools");e.add("legacyoutput",function(e){var s,t;(t=s=e).settings.inline_styles=!1,t.getParam("fontsize_formats")||(t.settings.fontsize_formats="8pt=1 10pt=2 12pt=3 14pt=4 18pt=5 24pt=6 36pt=7"),t.getParam("font_formats")||(t.settings.font_formats="Andale Mono=andale mono,monospace;Arial=arial,helvetica,sans-serif;Arial Black=arial black,sans-serif;Book Antiqua=book antiqua,palatino,serif;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,palatino,serif;Helvetica=helvetica,arial,sans-serif;Impact=impact,sans-serif;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco,monospace;Times New Roman=times new roman,times,serif;Trebuchet MS=trebuchet ms,geneva,sans-serif;Verdana=verdana,geneva,sans-serif;Webdings=webdings;Wingdings=wingdings,zapf dingbats"),s.on("PreInit",function(){var e=s,t="p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table",i=l.explode(e.getParam("font_size_style_values","xx-small,x-small,small,medium,large,x-large,xx-large")),a=e.schema;e.formatter.register({alignleft:{selector:t,attributes:{align:"left"}},aligncenter:{selector:t,attributes:{align:"center"}},alignright:{selector:t,attributes:{align:"right"}},alignjustify:{selector:t,attributes:{align:"justify"}},bold:[{inline:"b",remove:"all",preserve_attributes:["class","style"]},{inline:"strong",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{fontWeight:"bold"}}],italic:[{inline:"i",remove:"all",preserve_attributes:["class","style"]},{inline:"em",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{fontStyle:"italic"}}],underline:[{inline:"u",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{textDecoration:"underline"},exact:!0}],strikethrough:[{inline:"strike",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{textDecoration:"line-through"},exact:!0}],fontname:{inline:"font",toggle:!1,attributes:{face:"%value"}},fontsize:{inline:"font",toggle:!1,attributes:{size:function(e){return String(l.inArray(i,e.value)+1)}}},forecolor:{inline:"font",attributes:{color:"%value"},links:!0,remove_similar:!0,clear_child_styles:!0},hilitecolor:{inline:"font",styles:{backgroundColor:"%value"},links:!0,remove_similar:!0,clear_child_styles:!0}}),l.each("b,i,u,strike".split(","),function(e){a.addValidElements(e+"[*]")}),a.getElementRule("font")||a.addValidElements("font[face|size|color|style]"),l.each(t.split(","),function(e){var t=a.getElementRule(e);t&&(t.attributes.align||(t.attributes.align={},t.attributesOrder.push("align")))})})})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/link/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/link/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..024c63591f02327f540cc18646ab287312f58d56
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/link/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function t(r){return function(t){return e=typeof(n=t),(null===n?"null":"object"==e&&(Array.prototype.isPrototypeOf(n)||n.constructor&&"Array"===n.constructor.name)?"array":"object"==e&&(String.prototype.isPrototypeOf(n)||n.constructor&&"String"===n.constructor.name)?"string":e)===r;var n,e}}function n(n){return function(t){return typeof t===n}}function h(){}function i(t){return function(){return t}}function e(t){return t}function r(t,n){return t===n}function o(){return v}var u,a=tinymce.util.Tools.resolve("tinymce.PluginManager"),c=tinymce.util.Tools.resolve("tinymce.util.VK"),l=t("string"),d=t("array"),p=function(t){return u===t},f=n("boolean"),s=n("function"),m=i(!1),g=i(!(u=null)),v={fold:function(t,n){return t()},isSome:m,isNone:g,getOr:e,getOrThunk:y,getOrDie:function(t){throw new Error(t||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(void 0),or:e,orThunk:y,map:o,each:h,bind:o,exists:m,forall:g,filter:function(){return v},toArray:function(){return[]},toString:i("none()")};function y(t){return t()}function k(t,o,i){return function(t){for(var n,e=0,r=t.length;e<r;e++)n=t[e],i=o(i,n,e)}(t),i}function x(t){for(var n=[],e=0,r=t.length;e<r;++e){if(!d(t[e]))throw new Error("Arr.flatten item "+e+" was not an array, input: "+t);at.apply(n,t[e])}return n}function b(t,n){for(var e=0;e<t.length;e++){var r=n(t[e],e);if(r.isSome())return r}return it.none()}function O(t,n,e){return void 0===e&&(e=r),t.exists(function(t){return e(t,n)})}function w(t,n){return t?it.some(n):it.none()}function C(t){var n=t.getParam("link_assume_external_targets",!1);return f(n)&&n?1:!l(n)||"http"!==n&&"https"!==n?0:n}function N(t){return t.getParam("default_link_target")}function A(t){return t.getParam("target_list",!0)}function T(t){return t.getParam("rel_list",[],"array")}function P(t){return t.getParam("allow_unsafe_link_target",!1,"boolean")}function S(t){return l(t.value)?t.value:""}function _(n){return void 0===n&&(n=S),function(t){return it.from(t).map(function(t){return ct(t,n)})}}function R(t,i,u,a){return function(t){for(var n=mt(t),e=0,r=n.length;e<r;e++){var o=n[e];!function(t,n){(i(t,n)?u:a)(t,n)}(t[o],o)}}(t),1}function D(t,n){return gt.call(t,n)}function L(t){return t&&"a"===t.nodeName.toLowerCase()}function E(t){return L(t)&&!!pt(t)}function M(t,n){if(t.collapsed)return[];for(var e=t.cloneContents(),r=new dt(e.firstChild,e),o=[],i=e.firstChild;n(i)&&o.push(i),i=r.next(););return o}function U(t){return/^\w+:/i.test(t)}function B(t,n){function e(t){return t.filter(function(t){return-1===lt.inArray(o,t)})}var r,o=["noopener"],i=t?t.split(/\s+/):[],u=n?0<(r=e(r=i)).length?r.concat(o):o:e(i);return 0<u.length?lt.trim(u.sort().join(" ")):""}function I(t,n){return n=n||t.selection.getNode(),vt(n)?t.dom.select("a[href]",n)[0]:t.dom.getParent(n,"a[href]")}function K(t,n){return(n?n.innerText||n.textContent:t.getContent({format:"text"})).replace(/\uFEFF/g,"")}function z(t){return 0<lt.grep(t,E).length}function j(t){var n=t.schema.getTextInlineElements();return 0===M(t.selection.getRng(),function(t){return 1===t.nodeType&&!L(t)&&!D(n,t.nodeName.toLowerCase())}).length}function V(l,c,f){var t,n,e,r,o,i,u,s=l.selection.getNode(),m=I(l,s),g=(n=l,e=k(["title","rel","class","target"],function(n,e){return t[e].each(function(t){n[e]=0<t.length?t:null}),n},{href:(t=f).href}),u=st({},e),0<T(n).length||!1!==P(n)||(r=B(u.rel,"_blank"===u.target),u.rel=r||null),it.from(u.target).isNone()&&!1===A(n)&&(u.target=N(n)),u.href=(o=u.href,"http"!==(i=C(n))&&"https"!==i||U(o)?o:i+"://"+o),u);l.undoManager.transact(function(){var n,t,e,r,o,i,u,a;f.href===c.href&&c.attach(),m?(l.focus(),o=l,i=m,u=f.text,a=g,u.each(function(t){D(i,"innerText")?i.innerText=t:i.textContent=t}),o.dom.setAttribs(i,a),o.selection.select(i)):(n=l,e=f.text,r=g,vt(t=s)?kt(n,t,r):e.fold(function(){n.execCommand("mceInsertLink",!1,r)},function(t){n.insertContent(n.dom.createHTML("a",r,n.dom.encode(t)))}))})}function q(t,n,e){var r,o,i,u,a,l,c,f,s,m,g=(r=t,o=e.href,st(st({},e),{href:ht.isDomSafe(o,"a",r.settings)?o:""}));t.hasPlugin("rtc",!0)?t.execCommand("createlink",!1,(a=g.class,l=g.href,c=g.rel,f=g.target,s=g.text,m=g.title,R({class:a.getOrNull(),href:l,rel:c.getOrNull(),target:f.getOrNull(),text:s.getOrNull(),title:m.getOrNull()},function(t,n){return!1===p(t)},(i=u={},function(t,n){i[n]=t}),h),u)):V(t,n,g)}function F(t){var l;t.hasPlugin("rtc",!0)?t.execCommand("unlink"):(l=t).undoManager.transact(function(){var t,n,e,r,o,i,u,a=l.selection.getNode();vt(a)?yt(l,a):(n=(t=l).dom,r=(e=t.selection).getBookmark(),o=e.getRng().cloneRange(),i=n.getParent(o.startContainer,"a[href]",t.getBody()),u=n.getParent(o.endContainer,"a[href]",t.getBody()),i&&o.setStartBefore(i),u&&o.setEndAfter(u),e.setRng(o),t.execCommand("unlink"),e.moveToBookmark(r)),l.focus()})}function W(t){var n=t.href;return 0<n.indexOf("@")&&-1===n.indexOf("/")&&-1===n.indexOf("mailto:")?it.some({message:"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?",preprocess:function(t){return st(st({},t),{href:"mailto:"+n})}}):it.none()}function H(t,n,e){var r=t.getAttrib(n,e);return null!==r&&0<r.length?it.some(r):it.none()}function G(d){var t,n=I(t=d);Tt(t,n).then(function(t){var n,e,i,u,r=function(t){var e=t.getData();if(!e.url.value)return F(i),void t.close();function n(n){return it.from(e[n]).filter(function(t){return!O(u.anchor[n],t)})}var r={href:e.url.value,text:n("text"),target:n("target"),rel:n("rel"),class:n("linkClass"),title:n("title")},o={href:e.url.value,attach:void 0!==e.url.meta&&e.url.meta.attach?e.url.meta.attach:h};Ct(i,r).then(function(t){q(i,o,t)}),t.close()},o=i=d,a=(n=u=t).anchor.text.map(function(){return{name:"text",type:"input",label:"Text to display"}}).toArray(),l=n.flags.titleEnabled?[{name:"title",type:"input",label:"Title"}]:[],c=it.from(N(o)),f=n.anchor,s={url:{value:e=f.url.getOr(""),meta:{original:{value:e}}},text:f.text.getOr(""),title:f.title.getOr(""),anchor:e,link:e,rel:f.rel.getOr(""),target:f.target.or(c).getOr(""),linkClass:f.linkClass.getOr("")},m=n.catalogs,g=bt(s,m);return{title:"Insert/Edit Link",size:"normal",body:{type:"panel",items:x([[{name:"url",type:"urlinput",filetype:"file",label:"URL"}],a,l,function(t){for(var n=[],e=function(t){n.push(t)},r=0;r<t.length;r++)t[r].each(e);return n}([m.anchor.map(ft.createUi("anchor","Anchors")),m.rels.map(ft.createUi("rel","Rel")),m.targets.map(ft.createUi("target","Open link in...")),m.link.map(ft.createUi("link","Link list")),m.classes.map(ft.createUi("linkClass","Class"))])])},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:s,onChange:function(n,t){var e=t.name;g.onChange(n.getData,{name:e}).each(function(t){n.setData(t)})},onSubmit:r}}).then(function(t){d.windowManager.open(t)})}function J(t,n){return t.dom.getParent(n,"a[href]")}function X(t){return J(t,t.selection.getStart())}function $(t,n){var e,r;n&&(e=pt(n),/^#/.test(e)?(r=t.$(e)).length&&t.selection.scrollIntoView(r[0],!0):function(t){var n=document.createElement("a");n.target="_blank",n.href=t,n.rel="noreferrer noopener";var e,r,o=document.createEvent("MouseEvents");o.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),e=n,r=o,document.body.appendChild(e),e.dispatchEvent(r),document.body.removeChild(e)}(n.href))}function Q(t){return function(){G(t)}}function Y(t){return function(){$(t,X(t))}}function Z(t,n){return t.on("NodeChange",n),function(){return t.off("NodeChange",n)}}function tt(e){return function(t){function n(){return t.setActive(!e.mode.isReadOnly()&&null!==I(e,e.selection.getNode()))}return n(),Z(e,n)}}function nt(e){return function(t){function n(){return t.setDisabled(null===I(e,e.selection.getNode()))}return n(),Z(e,n)}}function et(r){return function(n){function e(t){return z(t)||0<M(r.selection.getRng(),E).length}var t=r.dom.getParents(r.selection.getStart());return n.setDisabled(!e(t)),Z(r,function(t){return n.setDisabled(!e(t.parents))})}}function rt(t){var n=x(function(t,n){for(var e=t.length,r=new Array(e),o=0;o<e;o++){var i=t[o];r[o]=n(i,o)}return r}(t.dom.select("a:not([href])"),function(t){var n=t.name||t.id;return n?[{text:n,value:"#"+n}]:[]}));return 0<n.length?it.some([{text:"None",value:""}].concat(n)):it.none()}var ot=function(e){function t(){return o}function n(t){return t(e)}var r=i(e),o={fold:function(t,n){return n(e)},isSome:g,isNone:m,getOr:r,getOrThunk:r,getOrDie:r,getOrNull:r,getOrUndefined:r,or:t,orThunk:t,map:function(t){return ot(t(e))},each:function(t){t(e)},bind:n,exists:n,forall:n,filter:function(t){return t(e)?o:v},toArray:function(){return[e]},toString:function(){return"some("+e+")"}};return o},it={some:ot,none:o,from:function(t){return null==t?v:ot(t)}},ut=Array.prototype.indexOf,at=Array.prototype.push,lt=tinymce.util.Tools.resolve("tinymce.util.Tools"),ct=function(t,i){var u=[];return lt.each(t,function(t){var n,e,r,o=l((n=t).text)?n.text:l(n.title)?n.title:"";void 0!==t.menu?(e=ct(t.menu,i),u.push({text:o,items:e})):(r=i(t),u.push({text:o,value:r}))}),u},ft={sanitize:function(t){return _(S)(t)},sanitizeWith:_,createUi:function(n,e){return function(t){return{name:n,type:"listbox",label:e,items:t}}},getValue:S},st=function(){return(st=Object.assign||function(t){for(var n,e=1,r=arguments.length;e<r;e++)for(var o in n=arguments[e])Object.prototype.hasOwnProperty.call(n,o)&&(t[o]=n[o]);return t}).apply(this,arguments)},mt=Object.keys,gt=Object.hasOwnProperty,dt=tinymce.util.Tools.resolve("tinymce.dom.TreeWalker"),ht=tinymce.util.Tools.resolve("tinymce.util.URI"),pt=function(t){return t.getAttribute("data-mce-href")||t.getAttribute("href")},vt=function(t){return t&&"FIGURE"===t.nodeName&&/\bimage\b/i.test(t.className)},yt=function(t,n){var e,r=t.dom.select("img",n)[0];!r||(e=t.dom.getParents(r,"a[href]",n)[0])&&(e.parentNode.insertBefore(r,e),t.dom.remove(e))},kt=function(t,n,e){var r,o=t.dom.select("img",n)[0];o&&(r=t.dom.create("a",e),o.parentNode.insertBefore(r,o),r.appendChild(o))},xt=function(e,t){return b(t,function(t){return D(n=t,"items")&&void 0!==n.items&&null!==n.items?xt(e,t.items):w(t.value===e,t);var n})},bt=function(t,c){function f(t,n){var e,r,o,i,u,a,l=("link"===(e=n.name)?c.link:"anchor"===e?c.anchor:it.none()).getOr([]);return r=s.text,o=n.name,i=l,u=t[o],a=0<r.length,void 0!==u?xt(u,i).map(function(t){return{url:{value:t.value,meta:{text:a?r:t.text,attach:h}},text:a?r:t.text}}):it.none()}var s={text:t.text,title:t.title};return{onChange:function(t,n){var e,r,o,i,u,a,l=n.name;return"url"===l?(r=t(),o=r.url,u=w(s.text.length<=0,it.from(o.meta.text).getOr(o.value)),i=r.url,a=w(s.title.length<=0,it.from(i.meta.title).getOr("")),u.isSome()||a.isSome()?it.some(st(st({},u.map(function(t){return{text:t}}).getOr({})),a.map(function(t){return{title:t}}).getOr({}))):it.none()):(e=["anchor","link"],-1<ut.call(e,l)?f(t(),n):("text"!==l&&"title"!==l||(s[l]=t()[l]),it.none()))}}},Ot=tinymce.util.Tools.resolve("tinymce.util.Delay"),wt=tinymce.util.Tools.resolve("tinymce.util.Promise"),Ct=function(u,a){return b([W,(e=C(u),r=u.getParam("link_default_protocol","http","string"),function(t){var n=t.href;return 1===e&&!U(n)||0===e&&/^\s*www(\.|\d\.)/i.test(n)?it.some({message:"The URL you entered seems to be an external link. Do you want to add the required "+r+":// prefix?",preprocess:function(t){return st(st({},t),{href:r+"://"+n})}}):it.none()})],function(t){return t(a)}).fold(function(){return wt.resolve(a)},function(i){return new wt(function(n){var e=u,t=i.message,r=function(t){n(t?i.preprocess(a):a)},o=e.selection.getRng();Ot.setEditorTimeout(e,function(){e.windowManager.confirm(t,function(t){e.selection.setRng(o),r(t)})})})});var e,r},Nt=tinymce.util.Tools.resolve("tinymce.util.XHR"),At=[{text:"Current window",value:""},{text:"New window",value:"_blank"}],Tt=function(m,g){return t=(e=m).getParam("link_list"),new wt(function(n){l(t)?Nt.send({url:t,success:function(t){return n(function(t){try{return it.some(JSON.parse(t))}catch(t){return it.none()}}(t))},error:function(t){return n(it.none())}}):s(t)?t(function(t){return n(it.some(t))}):n(it.from(t))}).then(function(t){return t.bind(ft.sanitizeWith(n)).map(function(t){return 0<t.length?[{text:"None",value:""}].concat(t):t})}).then(function(t){var n,e,r,o,i,u,a,l,c,f,s=(e=g,r=(n=m).dom,o=j(n)?it.some(K(n.selection,e)):it.none(),i=e?it.some(r.getAttrib(e,"href")):it.none(),u=e?it.from(r.getAttrib(e,"target")):it.none(),a=H(r,e,"rel"),l=H(r,e,"class"),{url:i,text:o,title:H(r,e,"title"),target:u,rel:a,linkClass:l});return{anchor:s,catalogs:{targets:(f=A(m),d(f)?ft.sanitize(f).orThunk(function(){return it.some(At)}):!1===f?it.none():it.some(At)),rels:function(t,n){var e=T(t);if(0<e.length){var r=O(n,"_blank");return(!1===P(t)?ft.sanitizeWith(function(t){return B(ft.getValue(t),r)}):ft.sanitize)(e)}return it.none()}(m,s.target),classes:0<(c=m.getParam("link_class_list",[],"array")).length?ft.sanitize(c):it.none(),anchor:rt(m),link:t},optNode:it.from(g),flags:{titleEnabled:m.getParam("link_title",!0,"boolean")}}});function n(t){return e.convertURL(t.value||t.url,"href")}var e,t};a.add("link",function(t){var n,e,r,o,i,u,a;function l(t){var n=a.selection.getNode();return t.setDisabled(!I(a,n)),h}(n=t).ui.registry.addToggleButton("link",{icon:"link",tooltip:"Insert/edit link",onAction:Q(n),onSetup:tt(n)}),n.ui.registry.addButton("openlink",{icon:"new-tab",tooltip:"Open link",onAction:Y(n),onSetup:nt(n)}),n.ui.registry.addButton("unlink",{icon:"unlink",tooltip:"Remove link",onAction:function(){return F(n)},onSetup:et(n)}),(e=t).ui.registry.addMenuItem("openlink",{text:"Open link",icon:"new-tab",onAction:Y(e),onSetup:nt(e)}),e.ui.registry.addMenuItem("link",{icon:"link",text:"Link...",shortcut:"Meta+K",onAction:Q(e)}),e.ui.registry.addMenuItem("unlink",{icon:"unlink",text:"Remove link",onAction:function(){return F(e)},onSetup:et(e)}),(r=t).ui.registry.addContextMenu("link",{update:function(t){return z(r.dom.getParents(t,"a"))?"link unlink openlink":"link"}}),(a=t).ui.registry.addContextForm("quicklink",{launch:{type:"contextformtogglebutton",icon:"link",tooltip:"Link",onSetup:tt(a)},label:"Link",predicate:function(t){return!!I(a,t)&&a.getParam("link_context_toolbar",!1,"boolean")},initValue:function(){var t=I(a);return t?pt(t):""},commands:[{type:"contextformtogglebutton",icon:"link",tooltip:"Link",primary:!0,onSetup:function(t){var n=a.selection.getNode();return t.setActive(!!I(a,n)),tt(a)(t)},onAction:function(t){var n=t.getValue(),e=function(t){var n=I(a),e=j(a);if(n||!e)return it.none();var r=K(a.selection,n);return it.some(0<r.length?r:t)}(n);q(a,{href:n,attach:h},{href:n,text:e,title:it.none(),rel:it.none(),target:it.none(),class:it.none()}),a.selection.collapse(!1),t.hide()}},{type:"contextformbutton",icon:"unlink",tooltip:"Remove link",onSetup:l,onAction:function(t){F(a),t.hide()}},{type:"contextformbutton",icon:"new-tab",tooltip:"Open link",onSetup:l,onAction:function(t){Y(a)(),t.hide()}}]}),(u=t).on("click",function(t){var n=J(u,t.target);n&&c.metaKeyPressed(t)&&(t.preventDefault(),$(u,n))}),u.on("keydown",function(t){var n=X(u);n&&13===t.keyCode&&!0===t.altKey&&!1===t.shiftKey&&!1===t.ctrlKey&&!1===t.metaKey&&(t.preventDefault(),$(u,n))}),(o=t).addCommand("mceLink",function(){o.getParam("link_quicklink",!1,"boolean")?o.fire("contexttoolbar-show",{toolbarKey:"quicklink"}):Q(o)()}),(i=t).addShortcut("Meta+K","",function(){i.execCommand("mceLink")})})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/lists/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/lists/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..5c3b43d248d8d09ac064ce59573f1e0550a8c10b
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/lists/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function e(r){return function(e){return n=typeof(t=e),(null===t?"null":"object"==n&&(Array.prototype.isPrototypeOf(t)||t.constructor&&"Array"===t.constructor.name)?"array":"object"==n&&(String.prototype.isPrototypeOf(t)||t.constructor&&"String"===t.constructor.name)?"string":n)===r;var t,n}}function t(t){return function(e){return typeof e===t}}function u(){}function S(e){return function(){return e}}function n(e){return e}function r(e,t){return e===t}function y(t){return function(e){return!t(e)}}function o(){return p}var i=tinymce.util.Tools.resolve("tinymce.PluginManager"),a=e("string"),O=e("object"),s=e("array"),c=t("boolean"),f=t("function"),d=t("number"),l=S(!1),m=S(!0),p={fold:function(e,t){return e()},isSome:l,isNone:m,getOr:n,getOrThunk:g,getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:S(null),getOrUndefined:S(void 0),or:n,orThunk:g,map:o,each:u,bind:o,exists:l,forall:m,filter:function(){return p},toArray:function(){return[]},toString:S("none()")};function g(e){return e()}function C(e,t){for(var n=e.length,r=new Array(n),o=0;o<n;o++){var i=e[o];r[o]=t(i,o)}return r}function b(e,t){for(var n=0,r=e.length;n<r;n++)t(e[n],n)}function L(e,t){for(var n=[],r=0,o=e.length;r<o;r++){var i=e[r];t(i,r)&&n.push(i)}return n}function v(e,n,r){return b(e,function(e,t){r=n(r,e,t)}),r}function h(e,t,n){for(var r=0,o=e.length;r<o;r++){var i=e[r];if(t(i,r))return E.some(i);if(n(i,r))break}return E.none()}function N(e,t){return h(e,t,l)}function T(e,t){return function(e){for(var t=[],n=0,r=e.length;n<r;++n){if(!s(e[n]))throw new Error("Arr.flatten item "+n+" was not an array, input: "+e);P.apply(t,e[n])}return t}(C(e,t))}function D(e){var t=I.call(e,0);return t.reverse(),t}function x(e,t){return 0<=t&&t<e.length?E.some(e[t]):E.none()}function A(e){return x(e,0)}function w(e){return x(e,e.length-1)}var k=function(n){function e(){return o}function t(e){return e(n)}var r=S(n),o={fold:function(e,t){return t(n)},isSome:m,isNone:l,getOr:r,getOrThunk:r,getOrDie:r,getOrNull:r,getOrUndefined:r,or:e,orThunk:e,map:function(e){return k(e(n))},each:function(e){e(n)},bind:t,exists:t,forall:t,filter:function(e){return e(n)?o:p},toArray:function(){return[n]},toString:function(){return"some("+n+")"}};return o},E={some:k,none:o,from:function(e){return null==e?p:k(e)}},I=Array.prototype.slice,P=Array.prototype.push,B=function(){return(B=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e}).apply(this,arguments)};function R(r,e){return function(e){for(var t=0;t<e.length;t++){var n=function(t){var n=t.brand.toLowerCase();return N(r,function(e){var t;return n===(null===(t=e.brand)||void 0===t?void 0:t.toLowerCase())}).map(function(e){return{current:e.name,version:G.nu(parseInt(t.version,10),0)}})}(e[t]);if(n.isSome())return n}return E.none()}(e.brands)}function M(e,t){var n=String(t).toLowerCase();return N(e,function(e){return e.search(n)})}function U(e,t){return-1!==e.indexOf(t)}function _(t){return function(e){return U(e,t)}}function $(e){return window.matchMedia(e).matches}function F(e,t){return e.dom===t.dom}function H(e,t){return le().browser.isIE()?(n=e.dom,r=t.dom,o=Node.DOCUMENT_POSITION_CONTAINED_BY,0!=(n.compareDocumentPosition(r)&o)):(i=e.dom)!==(a=t.dom)&&i.contains(a);var n,r,o,i,a}function j(e,t){for(var n=ye(e),r=0,o=n.length;r<o;r++){var i=n[r];t(e[i],i)}}function K(){return Z(0,0)}function V(e){function t(e){return function(){return n===e}}var n=e.current,r=e.version;return{current:n,version:r,isEdge:t("Edge"),isChrome:t("Chrome"),isIE:t("IE"),isOpera:t("Opera"),isFirefox:t(ne),isSafari:t("Safari")}}function W(e){function t(e){return function(){return n===e}}var n=e.current,r=e.version;return{current:n,version:r,isWindows:t(ie),isiOS:t("iOS"),isAndroid:t(ae),isOSX:t("OSX"),isLinux:t("Linux"),isSolaris:t(se),isFreeBSD:t(ue),isChromeOS:t(ce)}}function Q(e){if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}}var X,q,z,Y,Z=function(e,t){return{major:e,minor:t}},G={nu:Z,detect:function(e,t){var n,r,o=String(t).toLowerCase();return 0===e.length?K():(r=function(e,t){for(var n=0;n<e.length;n++){var r=e[n];if(r.test(t))return r}}(e,n=o))?Z(i(1),i(2)):{major:0,minor:0};function i(e){return Number(n.replace(r,"$"+e))}},unknown:K},J=(X=/^\s+|\s+$/g,function(e){return e.replace(X,"")}),ee=/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,te={browsers:S([{name:"Edge",versionRegexes:[/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],search:function(e){return U(e,"edge/")&&U(e,"chrome")&&U(e,"safari")&&U(e,"applewebkit")}},{name:"Chrome",brand:"Chromium",versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/,ee],search:function(e){return U(e,"chrome")&&!U(e,"chromeframe")}},{name:"IE",versionRegexes:[/.*?msie\ ?([0-9]+)\.([0-9]+).*/,/.*?rv:([0-9]+)\.([0-9]+).*/],search:function(e){return U(e,"msie")||U(e,"trident")}},{name:"Opera",versionRegexes:[ee,/.*?opera\/([0-9]+)\.([0-9]+).*/],search:_("opera")},{name:"Firefox",versionRegexes:[/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],search:_("firefox")},{name:"Safari",versionRegexes:[ee,/.*?cpu os ([0-9]+)_([0-9]+).*/],search:function(e){return(U(e,"safari")||U(e,"mobile/"))&&U(e,"applewebkit")}}]),oses:S([{name:"Windows",search:_("win"),versionRegexes:[/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]},{name:"iOS",search:function(e){return U(e,"iphone")||U(e,"ipad")},versionRegexes:[/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,/.*cpu os ([0-9]+)_([0-9]+).*/,/.*cpu iphone os ([0-9]+)_([0-9]+).*/]},{name:"Android",search:_("android"),versionRegexes:[/.*?android\ ?([0-9]+)\.([0-9]+).*/]},{name:"OSX",search:_("mac os x"),versionRegexes:[/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]},{name:"Linux",search:_("linux"),versionRegexes:[]},{name:"Solaris",search:_("sunos"),versionRegexes:[]},{name:"FreeBSD",search:_("freebsd"),versionRegexes:[]},{name:"ChromeOS",search:_("cros"),versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/]}])},ne="Firefox",re=function(){return V({current:void 0,version:G.unknown()})},oe=V,ie=(S("Edge"),S("Chrome"),S("IE"),S("Opera"),S(ne),S("Safari"),"Windows"),ae="Android",se="Solaris",ue="FreeBSD",ce="ChromeOS",fe=function(){return W({current:void 0,version:G.unknown()})},de=W,le=(S(ie),S("iOS"),S(ae),S("Linux"),S("OSX"),S(se),S(ue),S(ce),Y=!(q=function(){return e=navigator.userAgent,t=E.from(navigator.userAgentData),n=$,g=te.browsers(),v=te.oses(),h=t.bind(function(e){return R(g,e)}).orThunk(function(){return M(g,n=e).map(function(e){var t=G.detect(e.versionRegexes,n);return{current:e.name,version:t}});var n}).fold(re,oe),y=M(v,r=e).map(function(e){var t=G.detect(e.versionRegexes,r);return{current:e.name,version:t}}).fold(fe,de),{browser:h,os:y,deviceType:(i=h,a=e,s=n,u=(o=y).isiOS()&&!0===/ipad/i.test(a),c=o.isiOS()&&!u,d=(f=o.isiOS()||o.isAndroid())||s("(pointer:coarse)"),l=u||!c&&f&&s("(min-device-width:768px)"),m=c||f&&!l,p=i.isSafari()&&o.isiOS()&&!1===/safari/i.test(a),{isiPad:S(u),isiPhone:S(c),isTablet:S(l),isPhone:S(m),isTouch:S(d),isAndroid:o.isAndroid,isiOS:o.isiOS,isWebView:S(p),isDesktop:S(!m&&!l&&!p)})};var e,t,n,r,o,i,a,s,u,c,f,d,l,m,p,g,v,h,y}),function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Y||(Y=!0,z=q.apply(null,e)),z}),me={fromHtml:function(e,t){var n=(t||document).createElement("div");if(n.innerHTML=e,!n.hasChildNodes()||1<n.childNodes.length)throw console.error("HTML does not have a single root node",e),new Error("HTML must have a single root node");return Q(n.childNodes[0])},fromTag:function(e,t){var n=(t||document).createElement(e);return Q(n)},fromText:function(e,t){var n=(t||document).createTextNode(e);return Q(n)},fromDom:Q,fromPoint:function(e,t,n){return E.from(e.dom.elementFromPoint(t,n)).map(Q)}},pe=function(e,t){var n=e.dom;if(1!==n.nodeType)return!1;var r=n;if(void 0!==r.matches)return r.matches(t);if(void 0!==r.msMatchesSelector)return r.msMatchesSelector(t);if(void 0!==r.webkitMatchesSelector)return r.webkitMatchesSelector(t);if(void 0!==r.mozMatchesSelector)return r.mozMatchesSelector(t);throw new Error("Browser lacks native selectors")},ge=tinymce.util.Tools.resolve("tinymce.dom.RangeUtils"),ve=tinymce.util.Tools.resolve("tinymce.dom.TreeWalker"),he=tinymce.util.Tools.resolve("tinymce.util.VK"),ye=Object.keys;function Se(e){return e.dom.nodeName.toLowerCase()}function Ce(t){return function(e){return Bt(e)&&Se(e)===t}}function be(e,t){var n=e.dom;j(t,function(e,t){!function(e,t,n){if(!(a(n)||c(n)||d(n)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",n,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,n+"")}(n,t,e)})}function Ne(e){return v(e.dom.attributes,function(e,t){return e[t.name]=t.value,e},{})}function Oe(e){return E.from(e.dom.parentNode).map(me.fromDom)}function Le(e){return C(e.dom.childNodes,me.fromDom)}function Te(e,t){var n=e.dom.childNodes;return E.from(n[t]).map(me.fromDom)}function De(e){return Te(e,0)}function xe(e){return Te(e,e.dom.childNodes.length-1)}function Ae(t,n){Oe(t).each(function(e){e.dom.insertBefore(n.dom,t.dom)})}function we(e,t){e.dom.appendChild(t.dom)}function ke(t,e){b(e,function(e){we(t,e)})}function Ee(e){var t=e.dom;null!==t.parentNode&&t.parentNode.removeChild(t)}function Ie(e){return me.fromDom(e.dom.cloneNode(!0))}function Pe(e,t){var n,r,o=(n=e,be(r=me.fromTag(t),Ne(n)),r);return Ae(e,o),ke(o,Le(e)),Ee(e),o}function Be(t){return function(e){return e&&e.nodeName.toLowerCase()===t}}function Re(t){return function(e){return e&&t.test(e.nodeName)}}function Me(e){return e&&3===e.nodeType}function Ue(e,t){return t&&e.schema.getTextBlockElements()[t.nodeName]}function _e(e,t){return e&&e.nodeName in t}function $e(e,t,n){var r=e.isEmpty(t);return!(n&&0<e.select("span[data-mce-type=bookmark]",t).length)&&r}function Fe(e,t){return e.isChildOf(t,e.getRoot())}function He(e,t){var n,r,o,i,a=e.dom,s=e.schema.getBlockElements(),u=a.createFragment(),c=!1===(n=e.getParam("forced_root_block","p"))?"":!0===n?"p":n;if(c&&((o=a.create(c)).tagName===c.toUpperCase()&&a.setAttribs(o,e.getParam("forced_root_block_attrs",{})),_e(t.firstChild,s)||u.appendChild(o)),t)for(;r=t.firstChild;){var f=r.nodeName;i||"SPAN"===f&&"bookmark"===r.getAttribute("data-mce-type")||(i=!0),_e(r,s)?(u.appendChild(r),o=null):c?(o||(o=a.create(c),u.appendChild(o)),o.appendChild(r)):u.appendChild(r)}return c?i||o.appendChild(a.create("br",{"data-mce-bogus":"1"})):u.appendChild(a.create("br")),u}function je(e){Qt(e)&&Pe(e,"dd")}function Ke(r,e,t){b(t,"Indent"===e?je:function(e){return t=r,Wt(n=e)?Pe(n,"dt"):Qt(n)&&Oe(n).each(function(e){return function(e,t,n){var r=Vt.select('span[data-mce-type="bookmark"]',t),o=He(e,n),i=Vt.createRng();i.setStartAfter(n),i.setEndAfter(t);for(var a,s=i.extractContents(),u=s.firstChild;u;u=u.firstChild)if("LI"===u.nodeName&&e.dom.isEmpty(u)){Vt.remove(u);break}e.dom.isEmpty(s)||Vt.insertAfter(s,t),Vt.insertAfter(o,t),$e(e.dom,n.parentNode)&&(a=n.parentNode,Mt.each(r,function(e){a.parentNode.insertBefore(e,n.parentNode)}),Vt.remove(a)),Vt.remove(n),$e(e.dom,t)&&Vt.remove(t)}(t,e.dom,n.dom)}),0;var t,n})}function Ve(e,t){if(Me(e))return{container:e,offset:t};var n=ge.getNode(e,t);return Me(n)?{container:n,offset:t>=e.childNodes.length?n.data.length:0}:n.previousSibling&&Me(n.previousSibling)?{container:n.previousSibling,offset:n.previousSibling.data.length}:n.nextSibling&&Me(n.nextSibling)?{container:n.nextSibling,offset:0}:{container:e,offset:t}}function We(e){var t=e.cloneRange(),n=Ve(e.startContainer,e.startOffset);t.setStart(n.container,n.offset);var r=Ve(e.endContainer,e.endOffset);return t.setEnd(r.container,r.offset),t}function Qe(e,t){var n=t||e.selection.getStart(!0);return e.dom.getParent(n,"OL,UL,DL",qt(e,n))}function Xe(e){var t,n,r=e.selection.getSelectedBlocks();return L((t=e,n=Mt.map(r,function(e){return t.dom.getParent(e,"li,dd,dt",qt(t,e))||e}),Xt.unique(n)),Ft)}function qe(e,t){return w(e.dom.getParents(t,"ol,ul",qt(e,t)))}function ze(e,t,n){return void 0===n&&(n=r),e.exists(function(e){return n(e,t)})}function Ye(e,t,n){return e.isSome()&&t.isSome()?E.some(n(e.getOrDie(),t.getOrDie())):E.none()}function Ze(e,t,n){return e.fire("ListMutation",{action:t,element:n})}function Ge(e,t){we(e.item,t.list)}function Je(e,t){for(var n=0;n<e.length-1;n++)(function(e,t,n){if(!a(n))throw console.error("Invalid call to CSS.set. Property ",t,":: Value ",n,":: Element ",e),new Error("CSS value must be a string: "+n);void 0!==e.style&&f(e.style.getPropertyValue)&&e.style.setProperty(t,n)})(e[n].item.dom,"list-style-type","none");w(e).each(function(e){be(e.list,t.listAttributes),be(e.item,t.itemAttributes),ke(e.item,t.content)})}function et(u,e,c){var t=e.slice(0,c.depth);return w(t).each(function(e){var t,n,r,o,i,a,s=(t=c.itemAttributes,n=c.content,be(r=me.fromTag("li",u),t),ke(r,n),r);we((o=e).list,s),o.item=s,a=c,Se((i=e).list)!==a.listType&&(i.list=Pe(i.list,a.listType)),be(i.list,a.listAttributes)}),t}function tt(e,t,n){var r,o=function(e,t,n){for(var r,o,i,a=[],s=0;s<n;s++)a.push((o=t.listType,we((i={list:me.fromTag(o,r=e),item:me.fromTag("li",r)}).list,i.item),i));return a}(e,n,n.depth-t.length);return function(e){for(var t=1;t<e.length;t++)Ge(e[t-1],e[t])}(o),Je(o,n),r=o,Ye(w(t),A(r),Ge),t.concat(o)}function nt(e){return pe(e,"OL,UL")}function rt(e){return De(e).exists(nt)}function ot(e){return 0<e.depth}function it(e){return e.isSelected}function at(s){return b(s,function(a,e){function t(e){return e.depth===i&&!e.dirty}function n(e){return e.depth<i}var r,o,i;i=(r=s)[o=e].depth,h(D(r.slice(0,o)),t,n).orThunk(function(){return h(r.slice(o+1),t,n)}).fold(function(){var e,t,n,r,o,i;a.dirty&&(a.listAttributes=(e=a.listAttributes,n=function(e,t){return"start"!==t},r=t={},o=function(e,t){r[t]=e},i=u,j(e,function(e,t){(n(e,t)?o:i)(e,t)}),t))},function(e){var t=e;a.listType=t.listType,a.listAttributes=B({},t.listAttributes)})}),s}function st(n,a,s,u){return De(u).filter(nt).fold(function(){a.each(function(e){F(e.start,u)&&s.set(!0)});var r,o,i,e=(r=u,o=n,i=s.get(),Oe(r).filter(Bt).map(function(e){return{depth:o,dirty:!1,isSelected:i,content:(n=Le(t=r),C(xe(t).exists(nt)?n.slice(0,-1):n,Ie)),itemAttributes:Ne(r),listAttributes:Ne(e),listType:Se(e)};var t,n}));a.each(function(e){F(e.end,u)&&s.set(!1)});var t=xe(u).filter(nt).map(function(e){return Yt(n,a,s,e)}).getOr([]);return e.toArray().concat(t)},function(e){return Yt(n,a,s,e)})}function ut(o,e){return C(at(e),function(e){var t,n,r=(t=e.content,n=document.createDocumentFragment(),b(t,function(e){n.appendChild(e.dom)}),me.fromDom(n));return me.fromDom(He(o,r.dom))})}function ct(e,t){var n=at(t),r=e.contentDocument;return A(v(n,function(e,t){return(t.depth>e.length?tt:et)(r,e,t)},[])).map(function(e){return e.list}).toArray()}function ft(e,t){b(L(e,it),function(e){return function(e){switch(t){case"Indent":e.depth++;break;case"Outdent":e.depth--;break;case"Flatten":e.depth=0}e.dirty=!0}(e),0})}function dt(e,t){var n,r,o,i,a,s,u,c,f,d,l,m,p,g=C((i=qe(o=r=e,o.selection.getStart()),a=L(o.selection.getSelectedBlocks(),_t),s=i.toArray().concat(a),zt(r,s)),me.fromDom),v=C(L(Xe(e),Ht),me.fromDom),h=!1;return(g.length||v.length)&&(n=e.selection.getBookmark(),c=t,b((f=g,p=C(Xe(u=e),me.fromDom),d=Ye(N(p,y(rt)),N(D(p),y(rt)),function(e,t){return{start:e,end:t}}),l=!1,m={get:function(){return l},set:function(e){l=e}},C(f,function(e){return{sourceList:e,entries:Yt(0,d,m,e)}})),function(e){ft(e.entries,c);var t,n,r=(t=u,T(function(e,t){if(0===e.length)return[];for(var n=t(e[0]),r=[],o=[],i=0,a=e.length;i<a;i++){var s=e[i],u=t(s);u!==n&&(r.push(o),o=[]),n=u,o.push(s)}return 0!==o.length&&r.push(o),r}(e.entries,ot),function(e){return(A(e).exists(ot)?ct:ut)(t,e)}));b(r,function(e){Ze(u,"Indent"===c?"IndentList":"OutdentList",e.dom)}),n=e.sourceList,b(r,function(e){Ae(n,e)}),Ee(e.sourceList)}),Ke(e,t,v),e.selection.moveToBookmark(n),e.selection.setRng(We(e.selection.getRng())),e.nodeChanged(),h=!0),h}function lt(e){return dt(e,"Indent")}function mt(e){return dt(e,"Outdent")}function pt(e){return dt(e,"Flatten")}function gt(o){function e(e){var t,n=o[e?"startContainer":"endContainer"],r=o[e?"startOffset":"endOffset"];1===n.nodeType&&(t=Gt.create("span",{"data-mce-type":"bookmark"}),n.hasChildNodes()?(r=Math.min(r,n.childNodes.length-1),e?n.insertBefore(t,n.childNodes[r]):Gt.insertAfter(t,n.childNodes[r])):n.appendChild(t),n=t,r=0),i[e?"startContainer":"endContainer"]=n,i[e?"startOffset":"endOffset"]=r}var i={};return e(!0),o.collapsed||e(),i}function vt(o){function e(e){var t,n=t=o[e?"startContainer":"endContainer"],r=o[e?"startOffset":"endOffset"];n&&(1===n.nodeType&&(r=function(e){for(var t=e.parentNode.firstChild,n=0;t;){if(t===e)return n;1===t.nodeType&&"bookmark"===t.getAttribute("data-mce-type")||n++,t=t.nextSibling}return-1}(n),n=n.parentNode,Gt.remove(t),!n.hasChildNodes()&&Gt.isBlock(n)&&n.appendChild(Gt.create("br"))),o[e?"startContainer":"endContainer"]=n,o[e?"startOffset":"endOffset"]=r)}e(!0),e();var t=Gt.createRng();return t.setStart(o.startContainer,o.startOffset),o.endContainer&&t.setEnd(o.endContainer,o.endOffset),We(t)}function ht(e){switch(e){case"UL":return"ToggleUlList";case"OL":return"ToggleOlList";case"DL":return"ToggleDLList"}}function yt(e){return/\btox\-/.test(e.className)}function St(e,n,r){function t(e){var t=h(e.parents,Ut,jt).filter(function(e){return e.nodeName===n&&!yt(e)}).isSome();r(t)}return t({parents:e.dom.getParents(e.selection.getNode())}),e.on("NodeChange",t),function(){return e.off("NodeChange",t)}}function Ct(n,e){Mt.each(e,function(e,t){n.setAttribute(t,e)})}function bt(e,t,n){var r,o,i,a=n["list-style-type"]||null;e.setStyle(t,"list-style-type",a),r=e,Ct(o=t,(i=n)["list-attributes"]),Mt.each(r.select("li",o),function(e){Ct(e,i["list-item-attributes"])})}function Nt(e,t,n,r){var o=t[n?"startContainer":"endContainer"],i=t[n?"startOffset":"endOffset"];for(1===o.nodeType&&(o=o.childNodes[Math.min(i,o.childNodes.length-1)]||o),!n&&Kt(o.nextSibling)&&(o=o.nextSibling);o.parentNode!==r;){if(Ue(e,o))return o;if(/^(TD|TH)$/.test(o.parentNode.nodeName))return o;o=o.parentNode}return o}function Ot(u,c,f){var e,t,n=u.selection.getRng(),d="LI",r=qt(u,u.selection.getStart(!0)),l=u.dom;"false"!==l.getContentEditable(u.selection.getNode())&&("DL"===(c=c.toUpperCase())&&(d="DT"),e=gt(n),t=function(n,e,r){for(var o,i=[],a=n.dom,t=Nt(n,e,!0,r),s=Nt(n,e,!1,r),u=[],c=t;c&&(u.push(c),c!==s);c=c.nextSibling);return Mt.each(u,function(e){if(Ue(n,e))return i.push(e),void(o=null);if(a.isBlock(e)||Kt(e))return Kt(e)&&a.remove(e),void(o=null);var t=e.nextSibling;Zt.isBookmarkNode(e)&&(Ut(t)||Ue(n,t)||!t&&e.parentNode===r)?o=null:(o||(o=a.create("p"),e.parentNode.insertBefore(o,e),i.push(o)),o.appendChild(e))}),i}(u,n,r),Mt.each(t,function(e){var t,n,r,o,i,a=e.previousSibling,s=e.parentNode;Ft(s)||(a&&Ut(a)&&a.nodeName===c&&(o=f,l.getStyle(a,"list-style-type")===(i=null===(i=o?o["list-style-type"]:"")?"":i))?(t=a,e=l.rename(e,d),a.appendChild(e)):(t=l.create(c),e.parentNode.insertBefore(t,e),t.appendChild(e),e=l.rename(e,d)),n=l,r=e,Mt.each(["margin","margin-right","margin-bottom","margin-left","margin-top","padding","padding-right","padding-bottom","padding-left","padding-top"],function(e){var t;return n.setStyle(r,((t={})[e]="",t))}),bt(l,t,f),Jt(u.dom,t))}),u.selection.setRng(vt(e)))}function Lt(e,t,n){return a=n,(i=t)&&a&&Ut(i)&&i.nodeName===a.nodeName&&(o=n,(r=e).getStyle(t,"list-style-type",!0)===r.getStyle(o,"list-style-type",!0))&&t.className===n.className;var r,o,i,a}function Tt(e,t,n){var r,o,i,a,s,u,c,f,d,l,m,p,g,v,h,y,S,C=Qe(e),b=(f=Qe(c=e),d=c.selection.getSelectedBlocks(),f&&1===d.length&&d[0]===f?L(f.querySelectorAll("ol,ul,dl"),Ut):L(d,function(e){return Ut(e)&&f!==e})),N=O(n)?n:{};0<b.length?(l=e,p=b,g=t,v=N,(S=Ut(m=C))&&m.nodeName===g&&!en(v)?pt(l):(Ot(l,g,v),h=gt(l.selection.getRng()),y=S?function(e,t){for(var n,r=0,o=t.length;r<o;r++)!n&&r in t||((n=n||Array.prototype.slice.call(t,0,r))[r]=t[r]);return e.concat(n||Array.prototype.slice.call(t))}([m],p,!0):p,Mt.each(y,function(e){var t,n,r=l,o=g,i=v;(t=e).nodeName!==o?(n=r.dom.rename(t,o),bt(r.dom,n,i),Ze(r,ht(o),n)):(bt(r.dom,t,i),Ze(r,ht(o),t))}),l.selection.setRng(vt(h)))):(i=t,a=N,(o=C)!==(r=e).getBody()&&(o?o.nodeName!==i||en(a)||yt(o)?(s=gt(r.selection.getRng()),bt(r.dom,o,a),u=r.dom.rename(o,i),Jt(r.dom,u),r.selection.setRng(vt(s)),Ot(r,i,a),Ze(r,ht(i),u)):pt(r):(Ot(r,i,a),Ze(r,ht(i),o))))}function Dt(e,t,n,r){var o=t.startContainer,i=t.startOffset;if(Me(o)&&(n?i<o.data.length:0<i))return o;var a=e.schema.getNonEmptyElements();1===o.nodeType&&(o=ge.getNode(o,i));var s,u,c=new ve(o,r);for(n&&(s=e.dom,Kt(u=o)&&s.isBlock(u.nextSibling)&&!Kt(u.previousSibling)&&c.next());o=c[n?"next":"prev2"]();){if("LI"===o.nodeName&&!o.hasChildNodes())return o;if(a[o.nodeName])return o;if(Me(o)&&0<o.data.length)return o}}function xt(e,t){var n=t.childNodes;return 1===n.length&&!Ut(n[0])&&e.isBlock(n[0])}function At(t,e,n){var r,o,i,a=e.parentNode;Fe(t,e)&&Fe(t,n)&&(Ut(n.lastChild)&&(r=n.lastChild),a===n.lastChild&&Kt(a.previousSibling)&&t.remove(a.previousSibling),(o=n.lastChild)&&Kt(o)&&e.hasChildNodes()&&t.remove(o),$e(t,n,!0)&&t.$(n).empty(),function(e,t,n){var r,o,i,a=xt(e,n)?n.firstChild:n;if(xt(o=e,i=t)&&o.remove(i.firstChild,!0),!$e(e,t,!0))for(;r=t.firstChild;)a.appendChild(r)}(t,e,n),r&&n.appendChild(r),i=H(me.fromDom(n),me.fromDom(e))?t.getParents(e,Ut,n):[],t.remove(e),b(i,function(e){$e(t,e)&&e!==t.getRoot()&&t.remove(e)}))}function wt(c,f){var e=c.dom,t=c.selection,n=t.getStart(),r=qt(c,n),d=e.getParent(t.getStart(),"LI",r);if(d){var o=d.parentNode;if(o===c.getBody()&&$e(e,o))return 1;var l=We(t.getRng()),m=e.getParent(Dt(c,l,f,r),"LI",r);if(m&&m!==d)return c.undoManager.transact(function(){var e,t,n,r,o,i,a,s,u;f?(t=l,n=m,r=d,(u=(e=c).dom).isEmpty(r)?(a=n,(i=e).dom.$(s=r).empty(),At(i.dom,a,s),i.selection.setCursorLocation(s,0)):(o=gt(t),At(u,n,r),e.selection.setRng(vt(o)))):d.parentNode.firstChild===d?mt(c):function(e,t,n){var r=gt(l);At(e.dom,t,n);var o=vt(r);e.selection.setRng(o)}(c,d,m)}),1;if(!m&&!f&&0===l.startOffset&&0===l.endOffset)return c.undoManager.transact(function(){pt(c)}),1}}function kt(e,t){return e.selection.isCollapsed()?wt(i=e,a=t)||function(r,o){var i=r.dom,e=r.selection.getStart(),a=qt(r,e),s=i.getParent(e,i.isBlock,a);if(s&&i.isEmpty(s)){var t=We(r.selection.getRng()),u=i.getParent(Dt(r,t,o,a),"LI",a);if(u)return r.undoManager.transact(function(){var e,t=s,n=(e=i).getParent(t.parentNode,e.isBlock,a);e.remove(t),n&&e.isEmpty(n)&&e.remove(n),Jt(i,u.parentNode),r.selection.select(u,!0),r.selection.collapse(o)}),1}}(i,a):(r=(n=e).selection.getStart(),o=qt(n,r),(n.dom.getParent(r,"LI,DT,DD",o)||0<Xe(n).length)&&(n.undoManager.transact(function(){var i,e,t;n.execCommand("Delete"),i=n.dom,e=n.getBody(),t=Mt.grep(i.select("ol,ul",e)),Mt.each(t,function(e){var t,n,r,o=i;"LI"===(r=(t=e).parentNode).nodeName&&r.firstChild===t&&((n=r.previousSibling)&&"LI"===n.nodeName?(n.appendChild(t),$e(o,r)&&tn.remove(r)):tn.setStyle(r,"listStyleType","none")),Ut(r)&&(n=r.previousSibling)&&"LI"===n.nodeName&&n.appendChild(t)})}),1));var n,r,o,i,a}function Et(e){return v(C(D(J(e).split("")),function(e,t){var n=e.toUpperCase().charCodeAt(0)-"A".charCodeAt(0)+1;return Math.pow(26,t)*n}),function(e,t){return e+t},0)}function It(t,n){return function(){var e=Qe(t);return e&&e.nodeName===n}}function Pt(o){o.addCommand("mceListProps",function(){var t,e,n,r;r=Qe(t=o),$t(r)&&t.windowManager.open({title:"List Properties",body:{type:"panel",items:[{type:"input",name:"start",label:"Start list at number",inputMode:"numeric"}]},initialData:{start:(e={start:t.dom.getAttrib(r,"start","1"),listStyleType:E.some(t.dom.getStyle(r,"list-style-type"))},n=parseInt(e.start,10),ze(e.listStyleType,"upper-alpha")?nn(n):ze(e.listStyleType,"lower-alpha")?nn(n).toLowerCase():e.start)},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],onSubmit:function(e){!function(e){switch(/^[0-9]+$/.test(t=e)?2:/^[A-Z]+$/.test(t)?0:/^[a-z]+$/.test(t)?1:0<t.length?4:3){case 2:return E.some({listStyleType:E.none(),start:e});case 0:return E.some({listStyleType:E.some("upper-alpha"),start:Et(e).toString()});case 1:return E.some({listStyleType:E.some("lower-alpha"),start:Et(e).toString()});case 3:return E.some({listStyleType:E.none(),start:""});case 4:return E.none()}var t}(e.getData().start).each(function(e){t.execCommand("mceListUpdate",!1,{attrs:{start:"1"===e.start?"":e.start},styles:{"list-style-type":e.listStyleType.getOr("")}})}),e.close()}})})}"undefined"!=typeof window||Function("return this;")();function Bt(e){return 1===e.dom.nodeType}var Rt=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),Mt=tinymce.util.Tools.resolve("tinymce.util.Tools"),Ut=Re(/^(OL|UL|DL)$/),_t=Re(/^(OL|UL)$/),$t=Be("ol"),Ft=Re(/^(LI|DT|DD)$/),Ht=Re(/^(DT|DD)$/),jt=Re(/^(TH|TD)$/),Kt=Be("br"),Vt=Rt.DOM,Wt=Ce("dd"),Qt=Ce("dt"),Xt=tinymce.util.Tools.resolve("tinymce.dom.DomQuery"),qt=function(e,t){var n=e.dom.getParents(t,"TD,TH");return 0<n.length?n[0]:e.getBody()},zt=function(t,e){var n=C(e,function(e){return qe(t,e).getOr(e)});return Xt.unique(n)},Yt=function(t,n,r,e){return T(Le(e),function(e){return(nt(e)?Yt:st)(t+1,n,r,e)})},Zt=tinymce.util.Tools.resolve("tinymce.dom.BookmarkManager"),Gt=Rt.DOM,Jt=function(e,t){var n,r=t.nextSibling;if(Lt(e,t,r)){for(;n=r.firstChild;)t.appendChild(n);e.remove(r)}if(Lt(e,t,r=t.previousSibling)){for(;n=r.lastChild;)t.insertBefore(n,t.firstChild);e.remove(r)}},en=function(e){return"list-style-type"in e},tn=Rt.DOM,nn=function(e){if(--e<0)return"";var t=e%26,n=Math.floor(e/26);return nn(n)+String.fromCharCode("A".charCodeAt(0)+t)};i.add("lists",function(e){var n,t,r,o,i,a,s,u;return!1===e.hasPlugin("rtc",!0)?((a=e).getParam("lists_indent_on_tab",!0)&&(s=a).on("keydown",function(e){e.keyCode!==he.TAB||he.metaKeyPressed(e)||s.undoManager.transact(function(){(e.shiftKey?mt:lt)(s)&&e.preventDefault()})}),(u=a).on("keydown",function(e){e.keyCode===he.BACKSPACE?kt(u,!1)&&e.preventDefault():e.keyCode===he.DELETE&&kt(u,!0)&&e.preventDefault()}),(i=e).on("BeforeExecCommand",function(e){var t=e.command.toLowerCase();"indent"===t?lt(i):"outdent"===t&&mt(i)}),i.addCommand("InsertUnorderedList",function(e,t){Tt(i,"UL",t)}),i.addCommand("InsertOrderedList",function(e,t){Tt(i,"OL",t)}),i.addCommand("InsertDefinitionList",function(e,t){Tt(i,"DL",t)}),i.addCommand("RemoveList",function(){pt(i)}),Pt(i),i.addCommand("mceListUpdate",function(e,t){var n,r,o;O(t)&&(r=t,o=Qe(n=i),n.undoManager.transact(function(){O(r.styles)&&n.dom.setStyles(o,r.styles),O(r.attrs)&&j(r.attrs,function(e,t){return n.dom.setAttrib(o,t,e)})}))}),i.addQueryStateHandler("InsertUnorderedList",It(i,"UL")),i.addQueryStateHandler("InsertOrderedList",It(i,"OL")),i.addQueryStateHandler("InsertDefinitionList",It(i,"DL"))):Pt(e),(o=e).hasPlugin("advlist")||(o.ui.registry.addToggleButton("numlist",{icon:"ordered-list",active:!1,tooltip:"Numbered list",onAction:c("InsertOrderedList"),onSetup:function(e){return St(o,"OL",e.setActive)}}),o.ui.registry.addToggleButton("bullist",{icon:"unordered-list",active:!1,tooltip:"Bullet list",onAction:c("InsertUnorderedList"),onSetup:function(e){return St(o,"UL",e.setActive)}})),t={text:"List properties...",icon:"ordered-list",onAction:function(){return n.execCommand("mceListProps")},onSetup:function(t){return St(n,"OL",function(e){return t.setDisabled(!e)})}},(n=e).ui.registry.addMenuItem("listprops",t),n.ui.registry.addContextMenu("lists",{update:function(e){var t=Qe(n,e);return $t(t)?["listprops"]:[]}}),r=e,{backspaceDelete:function(e){kt(r,e)}};function c(e){return function(){return o.execCommand(e)}}})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/media/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/media/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..e0e570956036df95763fedc101e70466ef6fd18b
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/media/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function e(n){return function(e){return r=typeof(t=e),(null===t?"null":"object"==r&&(Array.prototype.isPrototypeOf(t)||t.constructor&&"Array"===t.constructor.name)?"array":"object"==r&&(String.prototype.isPrototypeOf(t)||t.constructor&&"String"===t.constructor.name)?"string":r)===n;var t,r}}function s(e){return null!=e}function o(e){return function(){return e}}function t(e){return e}function r(){return d}var n=tinymce.util.Tools.resolve("tinymce.PluginManager"),p=function(){return(p=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var a in t=arguments[r])Object.prototype.hasOwnProperty.call(t,a)&&(e[a]=t[a]);return e}).apply(this,arguments)},i=e("string"),u=e("object"),l=e("array"),c=o(!1),m=o(!0),d={fold:function(e,t){return e()},isSome:c,isNone:m,getOr:t,getOrThunk:a,getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:o(null),getOrUndefined:o(void 0),or:t,orThunk:a,map:r,each:function(){},bind:r,exists:c,forall:m,filter:function(){return d},toArray:function(){return[]},toString:o("none()")};function a(e){return e()}function h(e,t){for(var r=0,n=e.length;r<n;r++)t(e[r],r)}function f(e){var t=e;return{get:function(){return t},set:function(e){t=e}}}function g(e,t){return J(e,t)?W.from(e[t]):W.none()}function v(e){return e.getParam("media_scripts")}function b(e,t){if(e)for(var r=0;r<e.length;r++)if(-1!==t.indexOf(e[r].filter))return e[r]}function w(e){return e.replace(/px$/,"")}function y(i,e){var c=f(!1),s={};return V({validate:!1,allow_conditional_comments:!0,start:function(e,t){if(!c.get())if(J(t.map,"data-ephox-embed-iri"))c.set(!0),o=(a=(n=t).map.style)?X.parseStyle(a):{},s={type:"ephox-embed-iri",source:n.map["data-ephox-embed-iri"],altsource:"",poster:"",width:g(o,"max-width").map(w).getOr(""),height:g(o,"max-height").map(w).getOr("")};else{if(s.source||"param"!==e||(s.source=t.map.movie),"iframe"!==e&&"object"!==e&&"embed"!==e&&"video"!==e&&"audio"!==e||(s.type||(s.type=e),s=K.extend(t.map,s)),"script"===e){var r=b(i,t.map.src);if(!r)return;s={type:"script",source:t.map.src,width:String(r.width),height:String(r.height)}}"source"===e&&(s.source?s.altsource||(s.altsource=t.map.src):s.source=t.map.src),"img"!==e||s.poster||(s.poster=t.map.src)}var n,a,o}}).parse(e),s.source=s.source||s.src||s.data,s.altsource=s.altsource||"",s.poster=s.poster||"",s}function x(e){return{mp3:"audio/mpeg",m4a:"audio/x-m4a",wav:"audio/wav",mp4:"video/mp4",webm:"video/webm",ogg:"video/ogg",swf:"application/x-shockwave-flash"}[e.toLowerCase().split(".").pop()]||""}function j(e){return/^[0-9.]+$/.test(e)?e+"px":e}function O(o,e){!function(e){for(var t=q(e),r=0,n=t.length;r<n;r++){var a=t[r];!function(e,t){var r=""+e;if(o.map[t])for(var n=o.length;n--;){var a=o[n];a.name===t&&(r?(o.map[t]=r,a.value=r):(delete o.map[t],o.splice(n,1)))}else r&&(o.push({name:t,value:r}),o.map[t]=r)}(e[a],a)}}(e)}function S(e,c,s){var u,l=Z(),m=f(!1),d=0;return V({validate:!1,allow_conditional_comments:!0,comment:function(e){l.comment(e)},cdata:function(e){l.cdata(e)},text:function(e,t){l.text(e,t)},start:function(e,t,r){if(!m.get())if(J(t.map,"data-ephox-embed-iri"))m.set(!0),n=c,(i=(o=(a=t).map.style)?ee.parseStyle(o):{})["max-width"]=j(n.width),i["max-height"]=j(n.height),O(a,{style:ee.serializeStyle(i)});else{switch(e){case"video":case"object":case"embed":case"img":case"iframe":void 0!==c.height&&void 0!==c.width&&O(t,{width:c.width,height:c.height})}if(s)switch(e){case"video":O(t,{poster:c.poster,src:""}),c.altsource&&O(t,{src:""});break;case"iframe":O(t,{src:c.source});break;case"source":if(d<2&&(O(t,{src:c[te[d]],type:c[te[d]+"mime"]}),!c[te[d]]))return;d++;break;case"img":if(!c.poster)return;u=!0}}var n,a,o,i;l.start(e,t,r)},end:function(e){if(!m.get()){if("video"===e&&s)for(var t,r=0;r<2;r++)c[te[r]]&&((t=[]).map={},d<=r&&(O(t,{src:c[te[r]],type:c[te[r]+"mime"]}),l.start("source",t,!0)));var n;c.poster&&"object"===e&&s&&!u&&((n=[]).map={},O(n,{src:c.poster,width:c.width,height:c.height}),l.start("img",n,!0))}l.end(e)}},Y({})).parse(e),l.getContent()}function _(e,t){for(var r,n=(r=t.match(/^(https?:\/\/|www\.)(.+)$/i))&&1<r.length&&"www."!==r[1]?r[1]:"https://",a=e.regex.exec(t),o=n+e.url,i=0;i<a.length;i++)!function(e){o=o.replace("$"+e,function(){return a[e]||""})}(i);return o.replace(/\?$/,"")}function k(r,e){var n=K.extend({},e);if(!n.source&&(K.extend(n,y(v(r),n.embed)),!n.source))return"";n.altsource||(n.altsource=""),n.poster||(n.poster=""),n.source=r.convertURL(n.source,"source"),n.altsource=r.convertURL(n.altsource,"source"),n.sourcemime=x(n.source),n.altsourcemime=x(n.altsource),n.poster=r.convertURL(n.poster,"poster");var t,a,o=(t=n.source,0<(a=re.filter(function(e){return e.regex.test(t)})).length?K.extend({},a[0],{url:_(a[0],t)}):null);if(o&&(n.source=o.url,n.type=o.type,n.allowfullscreen=o.allowFullscreen,n.width=n.width||String(o.w),n.height=n.height||String(o.h)),n.embed)return S(n.embed,n,!0);var i=b(v(r),n.source);i&&(n.type="script",n.width=String(i.width),n.height=String(i.height));var c,s,u,l,m=r.getParam("audio_template_callback"),d=r.getParam("video_template_callback");return n.width=n.width||"300",n.height=n.height||"150",K.each(n,function(e,t){n[t]=r.dom.encode(""+e)}),"iframe"===n.type?(l=n.allowfullscreen?' allowFullscreen="1"':"",'<iframe src="'+n.source+'" width="'+n.width+'" height="'+n.height+'"'+l+"></iframe>"):"application/x-shockwave-flash"===n.sourcemime?(u='<object data="'+n.source+'" width="'+n.width+'" height="'+n.height+'" type="application/x-shockwave-flash">',n.poster&&(u+='<img src="'+n.poster+'" width="'+n.width+'" height="'+n.height+'" />'),u+"</object>"):-1!==n.sourcemime.indexOf("audio")?(s=n,m?m(s):'<audio controls="controls" src="'+s.source+'">'+(s.altsource?'\n<source src="'+s.altsource+'"'+(s.altsourcemime?' type="'+s.altsourcemime+'"':"")+" />\n":"")+"</audio>"):"script"===n.type?'<script src="'+n.source+'"><\/script>':(c=n,d?d(c):'<video width="'+c.width+'" height="'+c.height+'"'+(c.poster?' poster="'+c.poster+'"':"")+' controls="controls">\n<source src="'+c.source+'"'+(c.sourcemime?' type="'+c.sourcemime+'"':"")+" />\n"+(c.altsource?'<source src="'+c.altsource+'"'+(c.altsourcemime?' type="'+c.altsourcemime+'"':"")+" />\n":"")+"</video>")}function A(e){return e.hasAttribute("data-mce-object")||e.hasAttribute("data-ephox-embed-iri")}function T(t){return function(e){return k(t,e)}}function C(e,t){var r,n,a,o,i,c=e.getParam("media_url_resolver");return c?(a=t,o=T(e),i=c,new ne(function(t,e){function r(e){return e.html&&(ae[a.source]=e),t({url:a.source,html:e.html||o(a)})}ae[a.source]?r(ae[a.source]):i({url:a.source},r,e)})):(n=T(e),ne.resolve({html:n(r=t),url:r.source}))}function D(e,t){var r,n,o,i,c,a=t?g(e,t).bind(function(e){return g(e,"meta")}).getOr({}):{},s=(o=e,i=a,c=t,function(e){function t(){return g(o,e)}function r(){return g(i,e)}function n(e){return g(e,"value").bind(function(e){return 0<e.length?W.some(e):W.none()})}var a={};return a[e]=(e===c?t().bind(function(e){return u(e)?n(e).orThunk(r):r().orThunk(function(){return W.from(e)})}):r().orThunk(function(){return t().bind(function(e){return u(e)?n(e):W.from(e)})})).getOr(""),a});return p(p(p(p(p({},s("source")),s("altsource")),s("poster")),s("embed")),(r=a,n={},g(e,"dimensions").each(function(e){h(["width","height"],function(t){g(r,t).orThunk(function(){return g(e,t)}).each(function(e){return n[t]=e})})}),n))}function P(e){var n=p(p({},e),{source:{value:g(e,"source").getOr("")},altsource:{value:g(e,"altsource").getOr("")},poster:{value:g(e,"poster").getOr("")}});return h(["width","height"],function(r){g(e,r).each(function(e){var t=n.dimensions||{};t[r]=e,n.dimensions=t})}),n}function $(r){return function(e){var t=e&&e.msg?"Media embed handler error: "+e.msg:"Media embed handler threw unknown error.";r.notificationManager.open({type:"error",text:t})}}function M(e,t){return y(v(e),t)}function F(a,o){return function(e){var t,r,n;i(e.url)&&0<e.url.trim().length&&(t=e.html,r=M(o,t),n=p(p({},r),{source:e.url,embed:t}),a.setData(P(n)))}}function z(e,t){var r=e.dom.select("*[data-mce-object]");e.insertContent(t),function(e,t){for(var r=e.dom.select("*[data-mce-object]"),n=0;n<t.length;n++)for(var a=r.length-1;0<=a;a--)t[n]===r[a]&&r.splice(a,1);e.selection.select(r[0])}(e,r),e.nodeChanged()}function N(m){var e,t,r,n=(r=A(t=(e=m).selection.getNode())?e.serializer.serialize(t,{selection:!0}):"",p({embed:r},y(v(e),r))),d=f(n),a=P(n),o={title:"General",name:"general",items:function(e){for(var t=[],r=0,n=e.length;r<n;++r){if(!l(e[r]))throw new Error("Arr.flatten item "+r+" was not an array, input: "+e);G.apply(t,e[r])}return t}([[{name:"source",type:"urlinput",filetype:"media",label:"Source"}],m.getParam("media_dimensions",!0)?[{type:"sizeinput",name:"dimensions",label:"Constrain proportions",constrain:!0}]:[]])},i=[];m.getParam("media_alt_source",!0)&&i.push({name:"altsource",type:"urlinput",filetype:"media",label:"Alternative source URL"}),m.getParam("media_poster",!0)&&i.push({name:"poster",type:"urlinput",filetype:"image",label:"Media poster (Image URL)"});var c=[o,{title:"Embed",items:[{type:"textarea",name:"embed",label:"Paste your embed code below:"}]}];0<i.length&&c.push({title:"Advanced",name:"advanced",items:i});var h=m.windowManager.open({title:"Insert/Edit Media",size:"normal",body:{type:"tabpanel",tabs:c},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],onSubmit:function(e){var t,r,n,a,o=D(e.getData());t=d.get(),n=m,(r=o).embed=S(r.embed,r),r.embed&&(t.source===r.source||(a=r.source,J(ae,a)))?z(n,r.embed):C(n,r).then(function(e){z(n,e.html)}).catch($(n)),e.close()},onChange:function(e,t){switch(t.name){case"source":u=d.get(),l=D(e.getData(),"source"),u.source!==l.source&&(F(h,m)({url:l.source,html:""}),C(m,l).then(F(h,m)).catch($(m)));break;case"embed":c=D((i=e).getData()),s=M(m,c.embed),i.setData(P(s));break;case"dimensions":case"altsource":case"poster":n=t.name,a=D((r=e).getData(),n),o=k(m,a),r.setData(P(p(p({},a),{embed:o})))}var r,n,a,o,i,c,s,u,l;d.set(D(e.getData()))},initialData:a})}function U(o,e){if(!1===o.getParam("media_filter_html",!0))return e;var i,c=Z();return V({validate:!1,allow_conditional_comments:!1,comment:function(e){i||c.comment(e)},cdata:function(e){i||c.cdata(e)},text:function(e,t){i||c.text(e,t)},start:function(e,t,r){if(i=!0,"script"!==e&&"noscript"!==e&&"svg"!==e){for(var n=t.length-1;0<=n;n--){var a=t[n].name;0===a.indexOf("on")&&(delete t.map[a],t.splice(n,1)),"style"===a&&(t[n].value=o.dom.serializeStyle(o.dom.parseStyle(t[n].value),e))}c.start(e,t,r),i=!1}},end:function(e){i||c.end(e)}},Y({})).parse(e),c.getContent()}function E(e,t,r,n){void 0===n&&(n=null);var a=e.attr(r);return s(a)?a:J(t,r)?null:n}function R(e,t,r){var n="img"===t.name||"video"===e.name,a="audio"===e.name?"30":"150",o=n?a:null;t.attr({width:E(e,r,"width",n?"300":null),height:E(e,r,"height",o)})}function L(e,t){var r=t.name,n=new oe("span",1);n.attr({contentEditable:"false",style:t.attr("style"),"data-mce-object":r,class:"mce-preview-object mce-object-"+r}),se(e,t,n);var a,o=e.dom.parseStyle(t.attr("style")),i=new oe(r,1);R(t,i,o),i.attr({src:t.attr("src"),style:t.attr("style"),class:t.attr("class")}),"iframe"===r?i.attr({allowfullscreen:t.attr("allowfullscreen"),frameborder:"0"}):(h(["controls","crossorigin","currentTime","loop","muted","poster","preload"],function(e){i.attr(e,t.attr(e))}),s(a=n.attr("data-mce-html"))&&function(e,t,r,n){for(var a=ce({forced_root_block:!1,validate:!1},e.schema).parse(n,{context:t});a.firstChild;)r.append(a.firstChild)}(e,r,i,unescape(a)));var c=new oe("span",1);return c.attr("class","mce-shim"),n.append(i),n.append(c),n}function I(e){for(;e=e.parent;)if(e.attr("data-ephox-embed-iri")||(t=e.attr("class"))&&/\btiny-pageembed\b/.test(t))return 1;var t}var B=function(r){function e(){return a}function t(e){return e(r)}var n=o(r),a={fold:function(e,t){return t(r)},isSome:m,isNone:c,getOr:n,getOrThunk:n,getOrDie:n,getOrNull:n,getOrUndefined:n,or:e,orThunk:e,map:function(e){return B(e(r))},each:function(e){e(r)},bind:t,exists:t,forall:t,filter:function(e){return e(r)?a:d},toArray:function(){return[r]},toString:function(){return"some("+r+")"}};return a},W={some:B,none:r,from:function(e){return null==e?d:B(e)}},G=Array.prototype.push,q=Object.keys,H=Object.hasOwnProperty,J=function(e,t){return H.call(e,t)},K=tinymce.util.Tools.resolve("tinymce.util.Tools"),Q=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),V=tinymce.util.Tools.resolve("tinymce.html.SaxParser"),X=Q.DOM,Y=tinymce.util.Tools.resolve("tinymce.html.Schema"),Z=tinymce.util.Tools.resolve("tinymce.html.Writer"),ee=Q.DOM,te=["source","altsource"],re=[{regex:/youtu\.be\/([\w\-_\?&=.]+)/i,type:"iframe",w:560,h:314,url:"www.youtube.com/embed/$1",allowFullscreen:!0},{regex:/youtube\.com(.+)v=([^&]+)(&([a-z0-9&=\-_]+))?/i,type:"iframe",w:560,h:314,url:"www.youtube.com/embed/$2?$4",allowFullscreen:!0},{regex:/youtube.com\/embed\/([a-z0-9\?&=\-_]+)/i,type:"iframe",w:560,h:314,url:"www.youtube.com/embed/$1",allowFullscreen:!0},{regex:/vimeo\.com\/([0-9]+)/,type:"iframe",w:425,h:350,url:"player.vimeo.com/video/$1?title=0&byline=0&portrait=0&color=8dc7dc",allowFullscreen:!0},{regex:/vimeo\.com\/(.*)\/([0-9]+)/,type:"iframe",w:425,h:350,url:"player.vimeo.com/video/$2?title=0&amp;byline=0",allowFullscreen:!0},{regex:/maps\.google\.([a-z]{2,3})\/maps\/(.+)msid=(.+)/,type:"iframe",w:425,h:350,url:'maps.google.com/maps/ms?msid=$2&output=embed"',allowFullscreen:!1},{regex:/dailymotion\.com\/video\/([^_]+)/,type:"iframe",w:480,h:270,url:"www.dailymotion.com/embed/video/$1",allowFullscreen:!0},{regex:/dai\.ly\/([^_]+)/,type:"iframe",w:480,h:270,url:"www.dailymotion.com/embed/video/$1",allowFullscreen:!0}],ne=tinymce.util.Tools.resolve("tinymce.util.Promise"),ae={},oe=tinymce.util.Tools.resolve("tinymce.html.Node"),ie=tinymce.util.Tools.resolve("tinymce.Env"),ce=tinymce.util.Tools.resolve("tinymce.html.DomParser"),se=function(e,t,r){for(var n=t.attributes,a=n.length;a--;){var o=n[a].name,i=n[a].value;"width"!==o&&"height"!==o&&"style"!==o&&("data"!==o&&"src"!==o||(i=e.convertURL(i,o)),r.attr("data-mce-p-"+o,i))}var c=t.firstChild&&t.firstChild.value;c&&(r.attr("data-mce-html",escape(U(e,c))),r.firstChild=null)};n.add("media",function(e){var t,r,d,n,a;function o(){return r.execCommand("mceMedia")}return(t=e).addCommand("mceMedia",function(){N(t)}),(r=e).ui.registry.addToggleButton("media",{tooltip:"Insert/edit media",icon:"embed",onAction:o,onSetup:function(e){var t=r.selection;return e.setActive(A(t.getNode())),t.selectorChangedWithUnbind("img[data-mce-object],span[data-mce-object],div[data-ephox-embed-iri]",e.setActive).unbind}}),r.ui.registry.addMenuItem("media",{icon:"embed",text:"Media...",onAction:o}),e.on("ResolveName",function(e){var t;1===e.target.nodeType&&(t=e.target.getAttribute("data-mce-object"))&&(e.name=t)}),(d=e).on("preInit",function(){var t=d.schema.getSpecialElements();K.each("video audio iframe object".split(" "),function(e){t[e]=new RegExp("</"+e+"[^>]*>","gi")});var u,r=d.schema.getBoolAttrs();K.each("webkitallowfullscreen mozallowfullscreen allowfullscreen".split(" "),function(e){r[e]={}}),d.parser.addNodeFilter("iframe,video,audio,object,embed,script",(u=d,function(e){for(var t,r,n,a,o,i,c,s=e.length;s--;)(t=e[s]).parent&&(t.parent.attr("data-mce-object")||"script"===t.name&&!(r=b(v(u),t.attr("src")))||(r&&(r.width&&t.attr("width",r.width.toString()),r.height&&t.attr("height",r.height.toString())),("iframe"===(c=t.name)||"video"===c||"audio"===c)&&u.getParam("media_live_embeds",!0)&&ie.ceFalse?I(t)||t.replace(L(u,t)):I(t)||t.replace((n=u,i=void 0,o=(a=t).name,(i=new oe("img",1)).shortEnded=!0,se(n,a,i),R(a,i,{}),i.attr({style:a.attr("style"),src:ie.transparentSrc,"data-mce-object":o,class:"mce-object mce-object-"+o}),i))))})),d.serializer.addAttributeFilter("data-mce-object",function(e,t){for(var r,n,a,o,i,c,s,u,l=e.length;l--;)if((r=e[l]).parent){for(s=r.attr(t),n=new oe(s,1),"audio"!==s&&"script"!==s&&((u=r.attr("class"))&&-1!==u.indexOf("mce-preview-object")?n.attr({width:r.firstChild.attr("width"),height:r.firstChild.attr("height")}):n.attr({width:r.attr("width"),height:r.attr("height")})),n.attr({style:r.attr("style")}),a=(o=r.attributes).length;a--;){var m=o[a].name;0===m.indexOf("data-mce-p-")&&n.attr(m.substr(11),o[a].value)}"script"===s&&n.attr("type","text/javascript"),(i=r.attr("data-mce-html"))&&((c=new oe("#text",3)).raw=!0,c.value=U(d,unescape(i)),n.append(c)),r.replace(n)}})}),d.on("SetContent",function(){d.$("span.mce-preview-object").each(function(e,t){var r=d.$(t);0===r.find("span.mce-shim").length&&r.append('<span class="mce-shim"></span>')})}),(n=e).on("click keyup touchend",function(){var e=n.selection.getNode();e&&n.dom.hasClass(e,"mce-preview-object")&&n.dom.getAttrib(e,"data-mce-selected")&&e.setAttribute("data-mce-selected","2")}),n.on("ObjectSelected",function(e){"script"===e.target.getAttribute("data-mce-object")&&e.preventDefault()}),n.on("ObjectResized",function(e){var t,r=e.target;!r.getAttribute("data-mce-object")||(t=r.getAttribute("data-mce-html"))&&(t=unescape(t),r.setAttribute("data-mce-html",escape(S(t,{width:String(e.width),height:String(e.height)}))))}),a=e,{showDialog:function(){N(a)}}})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/nonbreaking/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/nonbreaking/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..fd213b45bc8be0298fe5ccf104f72e3850e69743
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/nonbreaking/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function o(n,e){for(var a="",o=0;o<e;o++)a+=n;return a}function s(n,e){var a=n.getParam("nonbreaking_wrap",!0,"boolean")||n.plugins.visualchars?'<span class="'+(n.plugins.visualchars&&n.plugins.visualchars.isEnabled()?"mce-nbsp-wrap mce-nbsp":"mce-nbsp-wrap")+'" contenteditable="false">'+o("&nbsp;",e)+"</span>":o("&nbsp;",e);n.undoManager.transact(function(){return n.insertContent(a)})}var n=tinymce.util.Tools.resolve("tinymce.PluginManager"),c=tinymce.util.Tools.resolve("tinymce.util.VK");n.add("nonbreaking",function(n){var e,a,o,t,i;function r(){return a.execCommand("mceNonBreaking")}(e=n).addCommand("mceNonBreaking",function(){s(e,1)}),(a=n).ui.registry.addButton("nonbreaking",{icon:"non-breaking",tooltip:"Nonbreaking space",onAction:r}),a.ui.registry.addMenuItem("nonbreaking",{icon:"non-breaking",text:"Nonbreaking space",onAction:r}),0<(i="boolean"==typeof(t=(o=n).getParam("nonbreaking_force_tab",0))?!0===t?3:0:t)&&o.on("keydown",function(n){n.keyCode!==c.TAB||n.isDefaultPrevented()||n.shiftKey||(n.preventDefault(),n.stopImmediatePropagation(),s(o,i))})})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/noneditable/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/noneditable/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..cdd909f5c4e0c22e6df29d31f4e275fb0b658be7
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/noneditable/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function l(t){return t.getParam("noneditable_noneditable_class","mceNonEditable")}function u(e){return function(t){return-1!==(" "+t.attr("class")+" ").indexOf(e)}}function e(e){var t,r="contenteditable",n=" "+f.trim(e.getParam("noneditable_editable_class","mceEditable"))+" ",a=" "+f.trim(l(e))+" ",i=u(n),o=u(a),c=(t=e.getParam("noneditable_regexp",[]))&&t.constructor===RegExp?[t]:t;e.on("PreInit",function(){0<c.length&&e.on("BeforeSetContent",function(t){!function(t,e,n){var r=e.length,a=n.content;if("raw"!==n.format){for(;r--;)a=a.replace(e[r],function(i,o,c){return function(t){var e=arguments,n=e[e.length-2],r=0<n?o.charAt(n-1):"";if('"'===r)return t;if(">"===r){var a=o.lastIndexOf("<",n);if(-1!==a&&-1!==o.substring(a,n).indexOf('contenteditable="false"'))return t}return'<span class="'+c+'" data-mce-content="'+i.dom.encode(e[0])+'">'+i.dom.encode("string"==typeof e[1]?e[1]:e[0])+"</span>"}}(t,a,l(t)));n.content=a}}(e,c,t)}),e.parser.addAttributeFilter("class",function(t){for(var e,n=t.length;n--;)e=t[n],i(e)?e.attr(r,"true"):o(e)&&e.attr(r,"false")}),e.serializer.addAttributeFilter(r,function(t){for(var e,n=t.length;n--;)e=t[n],(i(e)||o(e))&&(0<c.length&&e.attr("data-mce-content")?(e.name="#text",e.type=3,e.raw=!0,e.value=e.attr("data-mce-content")):e.attr(r,null))})})}var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),f=tinymce.util.Tools.resolve("tinymce.util.Tools");t.add("noneditable",function(t){e(t)})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/pagebreak/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/pagebreak/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..eb81e1c13bce883e3085cba12ee85fdfcecde93d
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/pagebreak/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function u(e){return e.getParam("pagebreak_split_block",!1)}function l(e){var a='<img src="'+n.transparentSrc+'" class="'+m+'" data-mce-resize="false" data-mce-placeholder />';return e?"<p>"+a+"</p>":a}var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=tinymce.util.Tools.resolve("tinymce.Env"),m="mce-pagebreak";e.add("pagebreak",function(e){var a,n,o,i,t,r;function c(){return n.execCommand("mcePageBreak")}function g(){return u(o)}(a=e).addCommand("mcePageBreak",function(){a.insertContent(l(u(a)))}),(n=e).ui.registry.addButton("pagebreak",{icon:"page-break",tooltip:"Page break",onAction:c}),n.ui.registry.addMenuItem("pagebreak",{text:"Page break",icon:"page-break",onAction:c}),i=(o=e).getParam("pagebreak_separator","\x3c!-- pagebreak --\x3e"),t=new RegExp(i.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g,function(e){return"\\"+e}),"gi"),o.on("BeforeSetContent",function(e){e.content=e.content.replace(t,l(g()))}),o.on("PreInit",function(){o.serializer.addNodeFilter("img",function(e){for(var a,n,t,r=e.length;r--;)(t=(n=e[r]).attr("class"))&&-1!==t.indexOf(m)&&(a=n.parent,o.schema.getBlockElements()[a.name]&&g()?(a.type=3,a.value=i,a.raw=!0,n.remove()):(n.type=3,n.value=i,n.raw=!0))})}),(r=e).on("ResolveName",function(e){"IMG"===e.target.nodeName&&r.dom.hasClass(e.target,m)&&(e.name="pagebreak")})})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/paste/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/paste/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..db546c9dd01ec926dbaade64fc38a3daf76081da
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/paste/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function w(e){var t=e;return{get:function(){return t},set:function(e){t=e}}}function P(e){return!(null==e)}function _(){}function o(e){return function(){return e}}function e(e){return e}function t(){return l}var n,r=tinymce.util.Tools.resolve("tinymce.PluginManager"),u=function(e){return n=typeof(t=e),"array"==(null===t?"null":"object"==n&&(Array.prototype.isPrototypeOf(t)||t.constructor&&"Array"===t.constructor.name)?"array":"object"==n&&(String.prototype.isPrototypeOf(t)||t.constructor&&"String"===t.constructor.name)?"string":n);var t,n},i=o(!(n="function")),s=o(!0),l={fold:function(e,t){return e()},isSome:i,isNone:s,getOr:e,getOrThunk:a,getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:o(null),getOrUndefined:o(void 0),or:e,orThunk:a,map:t,each:_,bind:t,exists:i,forall:s,filter:function(){return l},toArray:function(){return[]},toString:o("none()")};function a(e){return e()}function c(e,t){for(var n=0,r=e.length;n<r;n++)if(t(e[n],n))return!0;return!1}function f(e,t){for(var n=e.length,r=new Array(n),a=0;a<n;a++){var o=e[a];r[a]=t(o,a)}return r}function d(e,t){for(var n=0,r=e.length;n<r;n++)t(e[n],n)}function p(){var e,t,n=(e=_,t=w(le.none()),{clear:function(){r(),t.set(le.none())},isSet:function(){return t.get().isSome()},get:function(){return t.get()},set:function(e){r(),t.set(le.some(e))}});function r(){return t.get().each(e)}return de(de({},n),{on:function(e){return n.get().each(e)}})}function m(e,t,n){return""===t||e.length>=t.length&&e.substr(n,n+t.length)===t}function C(e,t){return e.fire("PastePlainTextToggle",{state:t})}function T(e){return e.getParam("paste_data_images",!1)}function g(e){return e.getParam("paste_retain_style_properties")}function h(e){return e.getParam("validate")}function y(e){return e.getParam("paste_data_images",!1,"boolean")}function v(e){return he.explode(e.getParam("images_file_types","jpeg,jpg,jpe,jfi,jif,jfif,png,gif,bmp,webp","string"))}function b(e){return-1!==e.indexOf(be)}function x(e,t,n){return t?(r=!0===t?"p":t,a=n,o=e.split(/\n\n/),i=function(e,t){var n,r=[],a="<"+e;if("object"==typeof t){for(var o in t)n=o,we.call(t,n)&&r.push(o+'="'+Pe.encodeAllRaw(t[o])+'"');r.length&&(a+=" "+r.join(" "))}return a+">"}(r,a),s="</"+r+">",1===(l=he.map(o,function(e){return e.split(/\n/).join("<br />")})).length?l[0]:he.map(l,function(e){return i+e+s}).join("")):e.replace(/\r?\n/g,"<br>");var r,a,o,i,s,l}function D(t,e){return he.each(e,function(e){t=e.constructor===RegExp?t.replace(e,""):t.replace(e[0],e[1])}),t}function k(e){return D(e,[/^[\s\S]*<body[^>]*>\s*|\s*<\/body[^>]*>[\s\S]*$/gi,/<!--StartFragment-->|<!--EndFragment-->/g,[/( ?)<span class="Apple-converted-space">\u00a0<\/span>( ?)/g,function(e,t,n){return t||n?"\xa0":" "}],/<br class="Apple-interchange-newline">/g,/<br>$/i])}function O(e){return/<font face="Times New Roman"|class="?Mso|style="[^"]*\bmso-|style='[^']*\bmso-|w:WordDocument/i.test(e)||/class="OutlineElement/.test(e)||/id="?docs\-internal\-guid\-/.test(e)}function S(r,e){var a,t=g(r);t&&(a=he.makeMap(t.split(/[, ]/))),e=D(e,[/<br class="?Apple-interchange-newline"?>/gi,/<b[^>]+id="?docs-internal-[^>]*>/gi,/<!--[\s\S]+?-->/gi,/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi,[/<(\/?)s>/gi,"<$1strike>"],[/&nbsp;/gi,"\xa0"],[/<span\s+style\s*=\s*"\s*mso-spacerun\s*:\s*yes\s*;?\s*"\s*>([\s\u00a0]*)<\/span>/gi,function(e,t){return 0<t.length?t.replace(/./," ").slice(Math.floor(t.length/2)).split("").join("\xa0"):""}]]);var n=r.getParam("paste_word_valid_elements","-strong/b,-em/i,-u,-span,-p,-ol,-ul,-li,-h1,-h2,-h3,-h4,-h5,-h6,-p/div,-a[href|name],sub,sup,strike,br,del,table[width],tr,td[colspan|rowspan|width],th[colspan|rowspan|width],thead,tfoot,tbody"),o=De({valid_elements:n,valid_children:"-li[p]"});he.each(o.elements,function(e){e.attributes.class||(e.attributes.class={},e.attributesOrder.push("class")),e.attributes.style||(e.attributes.style={},e.attributesOrder.push("style"))});var i=_e({},o);i.addAttributeFilter("style",function(e){for(var t,n=e.length;n--;)(t=e[n]).attr("style",function(r,a,o,i){var s={},e=r.dom.parseStyle(i);return he.each(e,function(e,t){switch(t){case"mso-list":var n=/\w+ \w+([0-9]+)/i.exec(i);n&&(o._listLevel=parseInt(n[1],10)),/Ignore/i.test(e)&&o.firstChild&&(o._listIgnore=!0,o.firstChild._listIgnore=!0);break;case"horiz-align":t="text-align";break;case"vert-align":t="vertical-align";break;case"font-color":case"mso-foreground":t="color";break;case"mso-background":case"mso-highlight":t="background";break;case"font-weight":case"font-style":return void("normal"!==e&&(s[t]=e));case"mso-element":if(/^(comment|comment-list)$/i.test(e))return void o.remove()}0!==t.indexOf("mso-comment")?0!==t.indexOf("mso-")&&("all"===g(r)||a&&a[t])&&(s[t]=e):o.remove()}),/(bold)/i.test(s["font-weight"])&&(delete s["font-weight"],o.wrap(new Te("b",1))),/(italic)/i.test(s["font-style"])&&(delete s["font-style"],o.wrap(new Te("i",1))),r.dom.serializeStyle(s,o.name)||null}(r,a,t,t.attr("style"))),"span"===t.name&&t.parent&&!t.attributes.length&&t.unwrap()}),i.addAttributeFilter("class",function(e){for(var t,n,r=e.length;r--;)n=(t=e[r]).attr("class"),/^(MsoCommentReference|MsoCommentText|msoDel)$/i.test(n)&&t.remove(),t.attr("class",null)}),i.addNodeFilter("del",function(e){for(var t=e.length;t--;)e[t].remove()}),i.addNodeFilter("a",function(e){for(var t,n,r,a=e.length;a--;)n=(t=e[a]).attr("href"),r=t.attr("name"),n&&-1!==n.indexOf("#_msocom_")?t.remove():!(n=n&&0===n.indexOf("file://")?(n=n.split("#")[1])&&"#"+n:n)&&!r||r&&!/^_?(?:toc|edn|ftn)/i.test(r)?t.unwrap():t.attr({href:n,name:r})});var s=i.parse(e);return r.getParam("paste_convert_word_fake_lists",!0)&&function(e){for(var a,o,i=1,n=function(e){var t="";if(3===e.type)return e.value;if(e=e.firstChild)for(;t+=n(e),e=e.next;);return t},s=function(e,t){if(3===e.type&&t.test(e.value))return e.value=e.value.replace(t,""),!1;if(e=e.firstChild)do{if(!s(e,t))return!1}while(e=e.next);return!0},l=function(e){if(e._listIgnore)e.remove();else if(e=e.firstChild)for(;l(e),e=e.next;);},t=function(e,t,n){var r=e._listLevel||i;(a=r!==i?r<i?a&&a.parent.parent:(o=a,null):a)&&a.name===t?a.append(e):(o=o||a,a=new Te(t,1),1<n&&a.attr("start",""+n),e.wrap(a)),e.name="li",i<r&&o&&o.lastChild.append(a),i=r,l(e),s(e,/^\u00a0+/),s(e,/^\s*([\u2022\u00b7\u00a7\u25CF]|\w+\.)/),s(e,/^\u00a0+/)},r=[],u=e.firstChild;null!=u;)if(r.push(u),null!==(u=u.walk()))for(;void 0!==u&&u.parent!==e;)u=u.walk();for(var c,f,d,p=0;p<r.length;p++)"p"===(e=r[p]).name&&e.firstChild?(c=n(e),/^[\s\u00a0]*[\u2022\u00b7\u00a7\u25CF]\s*/.test(c)?t(e,"ul"):function(t){var n=!1;return t=c.replace(/^[\u00a0 ]+/,""),he.each([/^[IVXLMCD]+\.[ \u00a0]/,/^[ivxlmcd]+\.[ \u00a0]/,/^[a-z]{1,2}[\.\)][ \u00a0]/,/^[A-Z]{1,2}[\.\)][ \u00a0]/,/^[0-9]+\.[ \u00a0]/,/^[\u3007\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d]+\.[ \u00a0]/,/^[\u58f1\u5f10\u53c2\u56db\u4f0d\u516d\u4e03\u516b\u4e5d\u62fe]+\.[ \u00a0]/],function(e){if(e.test(t))return!(n=!0)}),n}(c)?(d=1,t(e,"ol",d=(f=/([0-9]+)\./.exec(c))?parseInt(f[1],10):d)):e._listLevel?t(e,"ul",1):a=null):(o=a,a=null)}(s),Ce({validate:h(r)},o).serialize(s)}function j(e,t){return{content:e,cancelled:t}}function A(e,t,n){var r,a,o,i,s,l,u,c,f,d,p,m,g=O(t),v=g?(a=t,(r=e).getParam("paste_enable_default_filters",!0)?S(r,a):a):t;return i=n,s=g,p=(o=e).fire("PastePreProcess",{content:v,internal:i,wordContent:s}),m=function(e,t){var n=_e({},e.schema);n.addNodeFilter("meta",function(e){he.each(e,function(e){e.remove()})});var r=n.parse(t,{forced_root_block:!1,isRootContent:!0});return Ce({validate:h(e)},e.schema).serialize(r)}(o,p.content),o.hasEventListeners("PastePostProcess")&&!p.isDefaultPrevented()?(u=i,c=s,f=(l=o).dom.create("div",{style:"display:none"},m),j((d=l.fire("PastePostProcess",{node:f,internal:u,wordContent:c})).node.innerHTML,d.isDefaultPrevented())):j(m,p.isDefaultPrevented())}function R(e,t){return e.insertContent(t,{merge:e.getParam("paste_merge_formats",!0),paste:!0}),!0}function I(e){return/^https?:\/\/[\w\?\-\/+=.&%@~#]+$/i.test(e)}function F(e,t,n){return!(!1!==e.selection.isCollapsed()||!I(t)||(a=t,o=n,(r=e).undoManager.extra(function(){o(r,a)},function(){r.execCommand("mceInsertLink",!1,a)}),0));var r,a,o}function E(e,t,n){return r=e,!(!I(a=t)||!c(v(r),function(e){return m(t=a.toLowerCase(),n="."+e.toLowerCase(),t.length-n.length);var t,n})||(i=t,s=n,(o=e).undoManager.extra(function(){s(o,i)},function(){o.insertContent('<img src="'+i+'">')}),0));var r,a,o,i,s}function M(e){return"\n"===e||"\r"===e}function B(e,t,n,r){var a,o,i,s,l=A(e,t,n);!1===l.cancelled&&(a=e,o=l.content,r||!1===a.getParam("smart_paste",!0)?R(a,o):(i=a,s=o,he.each([F,E,R],function(e){return!0!==e(i,s,R)})))}function L(e,t,n){var r=n||b(t);B(e,t.replace(be,""),r,!1)}function N(e,t){var n,r,a,o,i,s,l=e.dom.encode(t).replace(/\r\n/g,"\n"),u=x((n=l,o=(r=e.getParam("paste_tab_spaces",4,"number"))<=0?"":new Array(r+1).join(" "),i=n.replace(/\t/g,o),s={pcIsSpace:!(a=function(e,t){return-1!==" \f\t\v".indexOf(t)||"\xa0"===t?e.pcIsSpace||""===e.str||e.str.length===i.length-1||(n=e.str.length+1)<i.length&&0<=n&&M(i[n])?{pcIsSpace:!1,str:e.str+"\xa0"}:{pcIsSpace:!0,str:e.str+" "}:{pcIsSpace:M(t),str:e.str+t};var n}),str:""},d(i,function(e,t){s=a(s,e)}),s.str),e.getParam("forced_root_block"),e.getParam("forced_root_block_attrs"));B(e,u,!1,!0)}function H(e){var t,n={};if(e&&(!e.getData||(t=e.getData("Text"))&&0<t.length&&-1===t.indexOf("data:text/mce-internal,")&&(n["text/plain"]=t),e.types))for(var r=0;r<e.types.length;r++){var a=e.types[r];try{n[a]=e.getData(a)}catch(e){n[a]=""}}return n}function $(e,t){return t in e&&0<e[t].length}function z(e){return $(e,"text/html")||$(e,"text/plain")}function U(w,e,t){var n,r,a,o,i,s="paste"===e.type?e.clipboardData:e.dataTransfer;if(y(w)&&s){var l=(n=w,a=(r=s).items?function(e){for(var t=[],n=0,r=e.length;n<r;++n){if(!u(e[n]))throw new Error("Arr.flatten item "+n+" was not an array, input: "+e);ce.apply(t,e[n])}return t}(f(fe(r.items),function(e){return"file"===e.kind?[e.getAsFile()]:[]})):[],o=r.files?fe(r.files):[],function(e,t){for(var n=[],r=0,a=e.length;r<a;r++){var o=e[r];t(o,r)&&n.push(o)}return n}(0<a.length?a:o,(i=v(n),function(r){return m(r.type,"image/",0)&&c(i,function(e){return t=e.toLowerCase(),(he.hasOwn(n={jpg:"jpeg",jpe:"jpeg",jfi:"jpeg",jif:"jpeg",jfif:"jpeg",pjpeg:"jpeg",pjp:"jpeg",svg:"svg+xml"},t)?"image/"+n[t]:"image/"+t)===r.type;var t,n})})));if(0<l.length)return e.preventDefault(),ge.all(f(l,function(r){return new ge(function(e){var t=P(r.getAsFile)?r.getAsFile():r,n=new window.FileReader;n.onload=function(){e({blob:t,uri:n.result})},n.readAsDataURL(t)})})).then(function(e){t&&w.selection.setRng(t),d(e,function(e){var t,n,r,a,o,i,s,l,u,c,f,d,p,m,g,v,h,y,b,x;t=w,r=(n=e).uri,g=(a=/data:([^;]+);base64,([a-z0-9\+\/=]+)/i.exec(r))?{type:a[1],data:decodeURIComponent(a[2])}:{type:null,data:null},v=g.data,h=g.type,y=ke(),b=n.blob,(x=new Image).src=n.uri,p=x,!(m=t.getParam("images_dataimg_filter"))||m(p)?(c=void 0,(i=(o=t.editorUpload.blobCache).getByData(v,h))?c=i:(l=(s=t.getParam("images_reuse_filename")&&P(b.name))?(f=t,P(d=b.name.match(/([\s\S]+?)(?:\.[a-z0-9.]+)$/i))?f.dom.encode(d[1]):null):y,u=s?b.name:void 0,c=o.create(y,b,v,l,u),o.add(c)),L(t,'<img src="'+c.blobUri()+'">',!1)):L(t,'<img src="'+n.uri+'">',!1)})}),!0}return!1}function V(e){return ve.metaKeyPressed(e)&&86===e.keyCode||e.shiftKey&&45===e.keyCode}function K(o,e,t){var i,s,v,l,u,c,f;function d(e,t,n,r,a){var o;$(t,"text/html")?o=t["text/html"]:(o=v.getHtml(),a=a||b(o),v.isDefaultContent(o)&&(r=!0)),o=k(o),v.remove();var i,s,l,u,c,f,d,p,m=!1===a&&!/<(?:\/?(?!(?:div|p|br|span)>)\w+|(?:(?!(?:span style="white-space:\s?pre;?">)|br\s?\/>))\w+\s[^>]+)>/i.test(o),g=I(o);((r=!o.length||m&&!g||r)||g)&&(o=$(t,"text/plain")&&m?t["text/plain"]:(i=o,s=De(),l=_e({},s),u="",c=s.getShortEndedElements(),f=he.makeMap("script noscript style textarea video audio iframe object"," "),d=s.getBlockElements(),p=function(e){var t=e.name,n=e;if("br"!==t){if("wbr"!==t)if(c[t]&&(u+=" "),f[t])u+=" ";else{if(3===e.type&&(u+=e.value),!e.shortEnded&&(e=e.firstChild))for(;p(e),e=e.next;);d[t]&&n.next&&(u+="\n","p"===t&&(u+="\n"))}}else u+="\n"},i=D(i,[/<!\[[^\]]+\]>/g]),p(l.parse(i)),u)),v.isDefaultContent(o)?n||e.windowManager.alert("Please use Ctrl+V/Cmd+V keyboard shortcuts to paste contents."):r?N(e,o):L(e,o,a)}s=o,v=e,l=t,c=p(),f=p(),s.on("keyup",f.clear),s.on("keydown",function(e){function t(e){V(e)&&!e.isDefaultPrevented()&&v.remove()}if(V(e)&&!e.isDefaultPrevented()&&(!(u=e.shiftKey&&86===e.keyCode)||!pe.webkit||-1===navigator.userAgent.indexOf("Version/"))){if(e.stopImmediatePropagation(),c.set(e),f.set(!0),pe.ie&&u)return e.preventDefault(),void s.fire("paste",{ieFake:!0});v.remove(),v.create(),s.once("keyup",t),s.once("paste",function(){s.off("keyup",t)})}}),s.on("paste",function(e){var t=c.isSet()||f.isSet();t&&c.clear();var n,r=H(e.clipboardData||s.getDoc().dataTransfer),a="text"===l.get()||u,o=$(r,xe());u=!1,e.isDefaultPrevented()||(n=e.clipboardData,-1!==navigator.userAgent.indexOf("Android")&&n&&n.items&&0===n.items.length)||!z(r)&&U(s,e,v.getLastRng()||s.selection.getRng())?v.remove():(t||e.preventDefault(),!pe.ie||t&&!e.ieFake||$(r,"text/html")||(v.create(),s.dom.bind(v.getEl(),"paste",function(e){e.stopPropagation()}),s.getDoc().execCommand("Paste",!1,null),r["text/html"]=v.getHtml()),$(r,"text/html")?(e.preventDefault(),o=o||b(r["text/html"]),d(s,r,t,a,o)):me.setEditorTimeout(s,function(){d(s,r,t,a,o)},0))}),o.parser.addNodeFilter("img",function(e,t,n){var r;if(!y(o)&&n.data&&!0===n.data.paste)for(var a=e.length;a--;)(i=e[a].attr("src"))&&(0!==i.indexOf("webkit-fake-url")&&(o.getParam("allow_html_data_urls",!1,"boolean")||0!==i.indexOf("data:"))||((r=e[a]).attr("data-mce-object")||i===pe.transparentSrc||r.remove()))})}function X(e){return pe.ie&&e.inline?document.body:e.getBody()}function W(e){var t=w(null),n="%MCEPASTEBIN%";return{create:function(){return function(e,t,n){var r=e.dom,a=e.getBody();t.set(e.selection.getRng());var o,i,s,l,u=e.dom.add(X(e),"div",{id:"mcepastebin",class:"mce-pastebin",contentEditable:!0,"data-mce-bogus":"all",style:"position: fixed; top: 50%; width: 10px; height: 10px; overflow: hidden; opacity: 0"},n);(pe.ie||pe.gecko)&&r.setStyle(u,"left","rtl"===r.getStyle(a,"direction",!0)?65535:-65535),r.bind(u,"beforedeactivate focusin focusout",function(e){e.stopPropagation()}),i=u,s=n,X(l=o=e)!==l.getBody()&&o.dom.bind(i,"paste keyup",function(e){Oe(o,s)||o.fire("paste")}),u.focus(),e.selection.select(u,!0)}(e,t,n)},remove:function(){return function(e,t){if(oe(e)){for(var n,r=t.get();n=e.dom.get("mcepastebin");)e.dom.remove(n),e.dom.unbind(n);r&&e.selection.setRng(r)}t.set(null)}(e,t)},getEl:function(){return oe(e)},getHtml:function(){return function(n){function t(e,t){e.appendChild(t),n.dom.remove(t,!0)}var e=he.grep(X(n).childNodes,function(e){return"mcepastebin"===e.id}),r=e.shift();he.each(e,function(e){t(r,e)});for(var a=n.dom.select("div[id=mcepastebin]",r),o=a.length-1;0<=o;o--){var i=n.dom.create("div");r.insertBefore(i,a[o]),t(i,a[o])}return r?r.innerHTML:""}(e)},getLastRng:t.get,isDefault:function(){return Oe(e,n)},isDefaultContent:function(e){return e===n}}}function Y(e,t,n,r){!function(e,t,n){if(!1===pe.iOS&&"function"==typeof(null==e?void 0:e.setData))try{return e.clearData(),e.setData("text/html",t),e.setData("text/plain",n),e.setData(xe(),t),1}catch(e){return}}(e.clipboardData,t.html,t.text)?n(t.html,r):(e.preventDefault(),r())}function Z(s){return function(e,t){var n=be+e,r=s.dom.create("div",{contenteditable:"false","data-mce-bogus":"all"}),a=s.dom.create("div",{contenteditable:"true"},n);s.dom.setStyles(r,{position:"fixed",top:"0",left:"-3000px",width:"1000px",overflow:"hidden"}),r.appendChild(a),s.dom.add(s.getBody(),r);var o=s.selection.getRng();a.focus();var i=s.dom.createRng();i.selectNodeContents(a),s.selection.setRng(i),me.setTimeout(function(){s.selection.setRng(o),r.parentNode.removeChild(r),t()},0)}}function q(e){return{html:e.selection.getContent({contextual:!0}),text:e.selection.getContent({format:"text"})}}function G(e){return!e.selection.isCollapsed()||(t=e).dom.getParent(t.selection.getStart(),"td[data-mce-selected],th[data-mce-selected]",t.getBody());var t}function J(e,t){return Se.getCaretRangeFromPoint(t.clientX,t.clientY,e.getDoc())}function Q(e,t){e.focus(),e.selection.setRng(t)}function ee(t,n){t.on("PastePreProcess",function(e){e.content=n(t,e.content,e.internal,e.wordContent)})}function te(e,t){if(!O(t))return t;var n=[];return he.each(e.schema.getBlockElements(),function(e,t){n.push(t)}),t=D(t,[[new RegExp("(?:<br>&nbsp;[\\s\\r\\n]+|<br>)*(<\\/?("+n.join("|")+")[^>]*>)(?:<br>&nbsp;[\\s\\r\\n]+|<br>)*","g"),"$1"]]),D(t,[[/<br><br>/g,"<BR><BR>"],[/<br>/g," "],[/<BR><BR>/g,"<br>"]])}function ne(e,t,n,r){if(r||n)return t;var c,f,d,a=e.getParam("paste_webkit_styles");return!1===e.getParam("paste_remove_styles_if_webkit",!0)||"all"===a?t:(t=(c=a?a.split(/[, ]/):c)?(f=e.dom,d=e.selection.getNode(),t.replace(/(<[^>]+) style="([^"]*)"([^>]*>)/gi,function(e,t,n,r){var a=f.parseStyle(f.decode(n)),o={};if("none"===c)return t+r;for(var i=0;i<c.length;i++){var s=a[c[i]],l=f.getStyle(d,c[i],!0);/color/.test(c[i])&&(s=f.toHex(s),l=f.toHex(l)),l!==s&&(o[c[i]]=s)}var u=f.serializeStyle(o,"span");return u?t+' style="'+u+'"'+r:t+r})):t.replace(/(<[^>]+) style="([^"]*)"([^>]*>)/gi,"$1$3")).replace(/(<[^>]+) data-mce-style="([^"]+)"([^>]*>)/gi,function(e,t,n,r){return t+' style="'+n+'"'+r})}function re(n,e){n.$("a",e).find("font,u").each(function(e,t){n.dom.remove(t,!0)})}function ae(n,r){return function(t){function e(e){return t.setActive(e.state)}return t.setActive("text"===r.pasteFormat.get()),n.on("PastePlainTextToggle",e),function(){return n.off("PastePlainTextToggle",e)}}}function oe(e){return e.dom.get("mcepastebin")}var ie,se=function(n){function e(){return a}function t(e){return e(n)}var r=o(n),a={fold:function(e,t){return t(n)},isSome:s,isNone:i,getOr:r,getOrThunk:r,getOrDie:r,getOrNull:r,getOrUndefined:r,or:e,orThunk:e,map:function(e){return se(e(n))},each:function(e){e(n)},bind:t,exists:t,forall:t,filter:function(e){return e(n)?a:l},toArray:function(){return[n]},toString:function(){return"some("+n+")"}};return a},le={some:se,none:t,from:function(e){return null==e?l:se(e)}},ue=Array.prototype.slice,ce=Array.prototype.push,fe=typeof Array.from===n?Array.from:function(e){return ue.call(e)},de=function(){return(de=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var a in t=arguments[n])Object.prototype.hasOwnProperty.call(t,a)&&(e[a]=t[a]);return e}).apply(this,arguments)},pe=tinymce.util.Tools.resolve("tinymce.Env"),me=tinymce.util.Tools.resolve("tinymce.util.Delay"),ge=tinymce.util.Tools.resolve("tinymce.util.Promise"),ve=tinymce.util.Tools.resolve("tinymce.util.VK"),he=tinymce.util.Tools.resolve("tinymce.util.Tools"),ye="x-tinymce/html",be="\x3c!-- "+ye+" --\x3e",xe=o(ye),we=Object.hasOwnProperty,Pe=tinymce.util.Tools.resolve("tinymce.html.Entities"),_e=tinymce.util.Tools.resolve("tinymce.html.DomParser"),Ce=tinymce.util.Tools.resolve("tinymce.html.Serializer"),Te=tinymce.util.Tools.resolve("tinymce.html.Node"),De=tinymce.util.Tools.resolve("tinymce.html.Schema"),ke=(ie=0,function(){return"mceclip"+ie++}),Oe=function(e,t){var n=oe(e);return n&&"mcepastebin"===n.id&&n.innerHTML===t},Se=tinymce.util.Tools.resolve("tinymce.dom.RangeUtils");r.add("paste",function(e){if(0==(!!e.hasPlugin("powerpaste",!0)&&(void 0!==window.console&&window.console.log&&window.console.log("PowerPaste is incompatible with Paste plugin! Remove 'paste' from the 'plugins' option."),!0))){var t=w(!1),n=w(e.getParam("paste_as_text",!1)?"text":"html"),r=(y=n,b=W(h=e),h.on("PreInit",function(){return K(h,b,y)}),{pasteFormat:y,pasteHtml:function(e,t){return L(h,e,t)},pasteText:function(e){return N(h,e)},pasteImageData:function(e,t){return U(h,e,t)},getDataTransferItems:H,hasHtmlOrText:z,hasContentType:$}),a=e;return pe.webkit&&ee(a,ne),pe.ie&&(ee(a,te),v=re,(g=a).on("PastePostProcess",function(e){v(g,e.node)})),(p=e).ui.registry.addToggleButton("pastetext",{active:!1,icon:"paste-text",tooltip:"Paste as text",onAction:x,onSetup:ae(p,m=r)}),p.ui.registry.addToggleMenuItem("pastetext",{text:"Paste as text",icon:"paste-text",onAction:x,onSetup:ae(p,m)}),d=r,(f=e).addCommand("mceTogglePlainTextPaste",function(){var e,t=f;"text"===(e=d).pasteFormat.get()?(e.pasteFormat.set("html"),C(t,!1)):(e.pasteFormat.set("text"),C(t,!0)),t.focus()}),f.addCommand("mceInsertClipboardContent",function(e,t){t.content&&d.pasteHtml(t.content,t.internal),t.text&&d.pasteText(t.text)}),function(e){var t=e.plugins.paste,n=e.getParam("paste_preprocess");n&&e.on("PastePreProcess",function(e){n.call(t,t,e)});var r=e.getParam("paste_postprocess");r&&e.on("PastePostProcess",function(e){r.call(t,t,e)})}(e),(o=e).on("cut",(u=o,function(e){G(u)&&Y(e,q(u),Z(u),function(){var e;pe.browser.isChrome()||pe.browser.isFirefox()?(e=u.selection.getRng(),me.setEditorTimeout(u,function(){u.selection.setRng(e),u.execCommand("Delete")},0)):u.execCommand("Delete")})})),o.on("copy",(c=o,function(e){G(c)&&Y(e,q(c),Z(c),_)})),s=r,l=t,(i=e).getParam("paste_block_drop",!1)&&i.on("dragend dragover draggesture dragdrop drop drag",function(e){e.preventDefault(),e.stopPropagation()}),T(i)||i.on("drop",function(e){var t=e.dataTransfer;t&&t.files&&0<t.files.length&&e.preventDefault()}),i.on("drop",function(e){var t,n,r,a,o=J(i,e);e.isDefaultPrevented()||l.get()||(t=s.getDataTransferItems(e.dataTransfer),n=s.hasContentType(t,xe()),(!s.hasHtmlOrText(t)||(r=t["text/plain"])&&0===r.indexOf("file://"))&&s.pasteImageData(e,o)||!o||!i.getParam("paste_filter_drop",!0)||(a=t["mce-internal"]||t["text/html"]||t["text/plain"])&&(e.preventDefault(),me.setEditorTimeout(i,function(){i.undoManager.transact(function(){t["mce-internal"]&&i.execCommand("Delete"),Q(i,o),a=k(a),t["text/html"]?s.pasteHtml(a,n):s.pasteText(a)})})))}),i.on("dragstart",function(e){l.set(!0)}),i.on("dragover dragend",function(e){T(i)&&!1===l.get()&&(e.preventDefault(),Q(i,J(i,e))),"dragend"===e.type&&l.set(!1)}),{clipboard:r}}var i,s,l,o,u,c,f,d,p,m,a,g,v,h,y,b;function x(){return p.execCommand("mceTogglePlainTextPaste")}})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/preview/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/preview/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..fbb309278d5516b2a6dab45a265cd9978c1552c7
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/preview/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),f=tinymce.util.Tools.resolve("tinymce.Env"),w=tinymce.util.Tools.resolve("tinymce.util.Tools");e.add("preview",function(e){var n,t;function i(){return t.execCommand("mcePreview")}(n=e).addCommand("mcePreview",function(){var e,t;t=function(t){var n="",i=t.dom.encode,e=t.getParam("content_style","","string");n+='<base href="'+i(t.documentBaseURI.getURI())+'">';var o=t.getParam("content_css_cors",!1,"boolean")?' crossorigin="anonymous"':"";w.each(t.contentCSS,function(e){n+='<link type="text/css" rel="stylesheet" href="'+i(t.documentBaseURI.toAbsolute(e))+'"'+o+">"}),e&&(n+='<style type="text/css">'+e+"</style>");var a,r,s,c,d,l,m,y=-1===(c=(a=t).getParam("body_id","tinymce","string")).indexOf("=")?c:(s=(r=a).getParam("body_id","","hash"))[r.id]||s,u=-1===(m=(d=t).getParam("body_class","","string")).indexOf("=")?m:(l=d).getParam("body_class","","hash")[l.id]||"",v='<script>document.addEventListener && document.addEventListener("click", function(e) {for (var elm = e.target; elm; elm = elm.parentNode) {if (elm.nodeName === "A" && !('+(f.mac?"e.metaKey":"e.ctrlKey && !e.altKey")+")) {e.preventDefault();}}}, false);<\/script> ",g=t.getBody().dir,p=g?' dir="'+i(g)+'"':"";return"<!DOCTYPE html><html><head>"+n+'</head><body id="'+i(y)+'" class="mce-content-body '+i(u)+'"'+p+">"+t.getContent()+v+"</body></html>"}(e=n),e.windowManager.open({title:"Preview",size:"large",body:{type:"panel",items:[{name:"preview",type:"iframe",sandboxed:!0}]},buttons:[{type:"cancel",name:"close",text:"Close",primary:!0}],initialData:{preview:t}}).focus("close")}),(t=e).ui.registry.addButton("preview",{icon:"preview",tooltip:"Preview",onAction:i}),t.ui.registry.addMenuItem("preview",{icon:"preview",text:"Preview",onAction:i})})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/print/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/print/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..7a5f97afd1687299b746810ccbf234a2bcc5111c
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/print/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";var n=tinymce.util.Tools.resolve("tinymce.PluginManager"),r=tinymce.util.Tools.resolve("tinymce.Env");n.add("print",function(n){var t,i;function e(){return i.execCommand("mcePrint")}(t=n).addCommand("mcePrint",function(){r.browser.isIE()?t.getDoc().execCommand("print",!1,null):t.getWin().print()}),(i=n).ui.registry.addButton("print",{icon:"print",tooltip:"Print",onAction:e}),i.ui.registry.addMenuItem("print",{text:"Print...",icon:"print",onAction:e}),n.addShortcut("Meta+P","","mcePrint")})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/quickbars/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/quickbars/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..808bb23fa4a95c4cc03a0cec0664bbf61eb3ecfa
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/quickbars/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function n(a){a.ui.registry.addButton("quickimage",{icon:"image",tooltip:"Insert image",onAction:function(){var i=a;new s(function(n){var r=document.createElement("input");r.type="file",r.accept="image/*",r.style.position="fixed",r.style.left="0",r.style.top="0",r.style.opacity="0.001",document.body.appendChild(r),r.addEventListener("change",function(t){n(Array.prototype.slice.call(t.target.files))});var o=function(t){function e(){n([]),r.parentNode.removeChild(r)}d.os.isAndroid()&&"remove"!==t.type?f.setEditorTimeout(i,e,0):e(),i.off("focusin remove",o)};i.on("focusin remove",o),r.click()}).then(function(t){var c,n;0<t.length&&(c=t[0],n=c,new s(function(t){var e=new FileReader;e.onloadend=function(){t(e.result.split(",")[1])},e.readAsDataURL(n)}).then(function(t){var e,n,r,o,i,u;n=t,r=c,i=(e=a).editorUpload.blobCache,u=i.create((o=(new Date).getTime(),"mceu_"+Math.floor(1e9*Math.random())+ ++l+String(o)),r,n),i.add(u),e.insertContent(e.dom.createHTML("img",{src:u.blobUri()}))}))})}}),a.ui.registry.addButton("quicktable",{icon:"table",tooltip:"Insert table",onAction:function(){var t,n;(t=a).plugins.table?t.plugins.table.insertTable(2,2):(n=t).undoManager.transact(function(){n.insertContent(function(){var t='<table data-mce-id="mce" style="width: 100%">';t+="<tbody>";for(var e=0;e<2;e++){t+="<tr>";for(var n=0;n<2;n++)t+="<td><br></td>";t+="</tr>"}return(t+="</tbody>")+"</table>"}());var t=n.dom.select("*[data-mce-id]")[0];t.removeAttribute("data-mce-id");var e=n.dom.select("td,th",t);n.selection.setCursorLocation(e[0],0)})}})}function t(r){return function(t){return n=typeof(e=t),(null===e?"null":"object"==n&&(Array.prototype.isPrototypeOf(e)||e.constructor&&"Array"===e.constructor.name)?"array":"object"==n&&(String.prototype.isPrototypeOf(e)||e.constructor&&"String"===e.constructor.name)?"string":n)===r;var e,n}}function e(e){return function(t){return typeof t===e}}function i(t){return function(){return t}}function r(t){return t}function o(){return y}var u,c=tinymce.util.Tools.resolve("tinymce.PluginManager"),l=0,s=tinymce.util.Tools.resolve("tinymce.util.Promise"),d=tinymce.util.Tools.resolve("tinymce.Env"),f=tinymce.util.Tools.resolve("tinymce.util.Delay"),a=t("string"),m=t("object"),g=t("array"),v=e("boolean"),h=e("function"),p=i(!1),b=i(!(u=void 0)),y={fold:function(t,e){return t()},isSome:p,isNone:b,getOr:r,getOrThunk:k,getOrDie:function(t){throw new Error(t||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(void 0),or:r,orThunk:k,map:o,each:function(){},bind:o,exists:p,forall:b,filter:function(){return y},toArray:function(){return[]},toString:i("none()")};function k(t){return t()}var w=function(n){function t(){return o}function e(t){return t(n)}var r=i(n),o={fold:function(t,e){return e(n)},isSome:b,isNone:p,getOr:r,getOrThunk:r,getOrDie:r,getOrNull:r,getOrUndefined:r,or:t,orThunk:t,map:function(t){return w(t(n))},each:function(t){t(n)},bind:e,exists:e,forall:e,filter:function(t){return t(n)?o:y},toArray:function(){return[n]},toString:function(){return"some("+n+")"}};return o},T={some:w,none:o,from:function(t){return null==t?y:w(t)}};function E(t,e,n,r,o){return t(n,r)?T.some(n):h(o)&&o(n)?T.none():e(n,r,o)}function N(t,e){var n=t.dom;if(1!==n.nodeType)return!1;var r=n;if(void 0!==r.matches)return r.matches(e);if(void 0!==r.msMatchesSelector)return r.msMatchesSelector(e);if(void 0!==r.webkitMatchesSelector)return r.webkitMatchesSelector(e);if(void 0!==r.mozMatchesSelector)return r.mozMatchesSelector(e);throw new Error("Browser lacks native selectors")}function M(t){if(null==t)throw new Error("Node cannot be null or undefined");return{dom:t}}var S={fromHtml:function(t,e){var n=(e||document).createElement("div");if(n.innerHTML=t,!n.hasChildNodes()||1<n.childNodes.length)throw console.error("HTML does not have a single root node",t),new Error("HTML must have a single root node");return M(n.childNodes[0])},fromTag:function(t,e){var n=(e||document).createElement(t);return M(n)},fromText:function(t,e){var n=(e||document).createTextNode(t);return M(n)},fromDom:M,fromPoint:function(t,e,n){return T.from(t.dom.elementFromPoint(e,n)).map(M)}};function C(t,e,n){for(var r=t.dom,o=h(n)?n:p;r.parentNode;){var r=r.parentNode,i=S.fromDom(r);if(e(i))return T.some(i);if(o(i))break}return T.none()}function O(t,e,n){return C(t,function(t){return N(t,e)},n)}"undefined"!=typeof window||Function("return this;")();var q,x=(q=a,function(t,e,n){return function(){if(!q(n))throw new Error("Default value doesn't match requested type.")}(),function(t,e){if(g(t)||m(t))throw new Error("expected a string but found: "+t);return u===t?e:v(t)?!1===t?"":e:t}(t.getParam(e,n),n)});c.add("quickbars",function(t){var o,e;n(t),0<(e=x(o=t,"quickbars_insert_toolbar","quickimage quicktable")).trim().length&&o.ui.registry.addContextToolbar("quickblock",{predicate:function(t){function e(t){return t.dom===o.getBody()}var n=S.fromDom(t),r=o.schema.getTextBlockElements();return E(N,O,n,"table",e).fold(function(){return E(function(t,e){return e(t)},C,n,function(t){return t.dom.nodeName.toLowerCase()in r&&o.dom.isEmpty(t.dom)},e).isSome()},p)},items:e,position:"line",scope:"editor"}),function(e){function n(t){return"IMG"===t.nodeName||"FIGURE"===t.nodeName&&/image/i.test(t.className)}var t=x(e,"quickbars_image_toolbar","alignleft aligncenter alignright");0<t.trim().length&&e.ui.registry.addContextToolbar("imageselection",{predicate:n,items:t,position:"node"});var r=x(e,"quickbars_selection_toolbar","bold italic | quicklink h2 h3 blockquote");0<r.trim().length&&e.ui.registry.addContextToolbar("textselection",{predicate:function(t){return!n(t)&&!e.selection.isCollapsed()&&"false"!==e.dom.getContentEditableParent(t)},items:r,position:"selection",scope:"editor"})}(t)})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/save/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/save/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..597971cdb7c1785720ad755d745333736f828734
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/save/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function o(e){return e.getParam("save_enablewhendirty",!0)}function a(e,n){e.notificationManager.open({text:n,type:"error"})}function t(t){t.addCommand("mceSave",function(){!function(e){var n=c.DOM.getParent(e.id,"form");if(!o(e)||e.isDirty()){if(e.save(),e.getParam("save_onsavecallback"))return e.execCallback("save_onsavecallback",e),e.nodeChanged();n?(e.setDirty(!1),n.onsubmit&&!n.onsubmit()||("function"==typeof n.submit?n.submit():a(e,"Error: Form submit field collision.")),e.nodeChanged()):a(e,"Error: No form element found.")}}(t)}),t.addCommand("mceCancel",function(){var e=t,n=r.trim(e.startContent);e.getParam("save_oncancelcallback")?e.execCallback("save_oncancelcallback",e):e.resetContent(n)})}function i(t){return function(e){function n(){e.setDisabled(o(t)&&!t.isDirty())}return n(),t.on("NodeChange dirty",n),function(){return t.off("NodeChange dirty",n)}}}var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),c=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),r=tinymce.util.Tools.resolve("tinymce.util.Tools");e.add("save",function(e){var n;(n=e).ui.registry.addButton("save",{icon:"save",tooltip:"Save",disabled:!0,onAction:function(){return n.execCommand("mceSave")},onSetup:i(n)}),n.ui.registry.addButton("cancel",{icon:"cancel",tooltip:"Cancel",disabled:!0,onAction:function(){return n.execCommand("mceCancel")},onSetup:i(n)}),n.addShortcut("Meta+S","","mceSave"),t(e)})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/searchreplace/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/searchreplace/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..260ef720f942d9e838b015201aff4ee3d8eecc01
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/searchreplace/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function g(e){var t=e;return{get:function(){return t},set:function(e){t=e}}}function e(r){return function(e){return n=typeof(t=e),(null===t?"null":"object"==n&&(Array.prototype.isPrototypeOf(t)||t.constructor&&"Array"===t.constructor.name)?"array":"object"==n&&(String.prototype.isPrototypeOf(t)||t.constructor&&"String"===t.constructor.name)?"string":n)===r;var t,n}}function t(t){return function(e){return typeof e===t}}function p(){}function i(e){return function(){return e}}function n(e){return e}function r(){return m}var o=tinymce.util.Tools.resolve("tinymce.PluginManager"),v=function(){return(v=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e}).apply(this,arguments)},a=e("string"),c=e("array"),u=t("boolean"),l=t("number"),s=i(!1),f=i(!0),d=i("[!-#%-*,-\\/:;?@\\[-\\]_{}\xa1\xab\xb7\xbb\xbf;\xb7\u055a-\u055f\u0589\u058a\u05be\u05c0\u05c3\u05c6\u05f3\u05f4\u0609\u060a\u060c\u060d\u061b\u061e\u061f\u066a-\u066d\u06d4\u0700-\u070d\u07f7-\u07f9\u0830-\u083e\u085e\u0964\u0965\u0970\u0df4\u0e4f\u0e5a\u0e5b\u0f04-\u0f12\u0f3a-\u0f3d\u0f85\u0fd0-\u0fd4\u0fd9\u0fda\u104a-\u104f\u10fb\u1361-\u1368\u1400\u166d\u166e\u169b\u169c\u16eb-\u16ed\u1735\u1736\u17d4-\u17d6\u17d8-\u17da\u1800-\u180a\u1944\u1945\u1a1e\u1a1f\u1aa0-\u1aa6\u1aa8-\u1aad\u1b5a-\u1b60\u1bfc-\u1bff\u1c3b-\u1c3f\u1c7e\u1c7f\u1cd3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205e\u207d\u207e\u208d\u208e\u3008\u3009\u2768-\u2775\u27c5\u27c6\u27e6-\u27ef\u2983-\u2998\u29d8-\u29db\u29fc\u29fd\u2cf9-\u2cfc\u2cfe\u2cff\u2d70\u2e00-\u2e2e\u2e30\u2e31\u3001-\u3003\u3008-\u3011\u3014-\u301f\u3030\u303d\u30a0\u30fb\ua4fe\ua4ff\ua60d-\ua60f\ua673\ua67e\ua6f2-\ua6f7\ua874-\ua877\ua8ce\ua8cf\ua8f8-\ua8fa\ua92e\ua92f\ua95f\ua9c1-\ua9cd\ua9de\ua9df\uaa5c-\uaa5f\uaade\uaadf\uabeb\ufd3e\ufd3f\ufe10-\ufe19\ufe30-\ufe52\ufe54-\ufe61\ufe63\ufe68\ufe6a\ufe6b\uff01-\uff03\uff05-\uff0a\uff0c-\uff0f\uff1a\uff1b\uff1f\uff20\uff3b-\uff3d\uff3f\uff5b\uff5d\uff5f-\uff65]"),m={fold:function(e,t){return e()},isSome:s,isNone:f,getOr:n,getOrThunk:h,getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(void 0),or:n,orThunk:h,map:r,each:p,bind:r,exists:s,forall:f,filter:function(){return m},toArray:function(){return[]},toString:i("none()")};function h(e){return e()}function y(e,t){for(var n=e.length,r=new Array(n),o=0;o<n;o++){var i=e[o];r[o]=t(i,o)}return r}function x(e,t){for(var n=0,r=e.length;n<r;n++)t(e[n],n)}function b(e,t){for(var n=e.length-1;0<=n;n--)t(e[n],n)}function w(e,t){return function(e){for(var t=[],n=0,r=e.length;n<r;++n){if(!c(e[n]))throw new Error("Arr.flatten item "+n+" was not an array, input: "+e);S.apply(t,e[n])}return t}(y(e,t))}function O(e,t){return A.call(e,t)}var C=function(n){function e(){return o}function t(e){return e(n)}var r=i(n),o={fold:function(e,t){return t(n)},isSome:f,isNone:s,getOr:r,getOrThunk:r,getOrDie:r,getOrNull:r,getOrUndefined:r,or:e,orThunk:e,map:function(e){return C(e(n))},each:function(e){e(n)},bind:t,exists:t,forall:t,filter:function(e){return e(n)?o:m},toArray:function(){return[n]},toString:function(){return"some("+n+")"}};return o},T={some:C,none:r,from:function(e){return null==e?m:C(e)}},E=d,N=tinymce.util.Tools.resolve("tinymce.util.Tools"),k=Array.prototype.slice,S=Array.prototype.push,A=Object.hasOwnProperty;function D(e,t,n){!function(e,t,n){if(!(a(n)||u(n)||l(n)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",n,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,n+"")}(e.dom,t,n)}function M(e,t){return{element:e,offset:t}}function B(e,t){var n,r;n=e,r=t,T.from(n.dom.parentNode).map(se.fromDom).each(function(e){e.dom.insertBefore(r.dom,n.dom)}),t.dom.appendChild(e.dom)}function F(e){return fe.get(e)}function I(e,t){return e.isBlock(t)||O(e.schema.getShortEndedElements(),t.nodeName)}function P(e,t){return"false"===e.getContentEditable(t)}function R(e,t){return!e.isBlock(t)&&O(e.schema.getWhiteSpaceElements(),t.nodeName)}function W(){return{sOffset:0,fOffset:0,elements:[]}}function j(e,t){return n=se.fromDom(e),r=t,0<(o=y(n.dom.childNodes,se.fromDom)).length&&r<o.length?M(o[r],0):M(n,r);var n,r,o}function V(e,t,n,r,o,i){for(var a=(i=void 0===i||i)?t(!1):n;a;){var c=P(e,a);if(c||R(e,a)){if(c?r.cef(a):r.boundary(a))break;a=t(!0)}else{if(I(e,a)){if(r.boundary(a))break}else 3===a.nodeType&&r.text(a);if(a===o)break;a=t(!1)}}}function H(e,t,n,r,o){var i,a,c,u,l,s;I(i=e,a=n)||P(i,a)||R(i,a)||"true"===(c=i).getContentEditable(u=a)&&"false"===c.getContentEditableParent(u.parentNode)||(l=e.getParent(r,e.isBlock),s=new de(n,l),V(e,(o?s.next:s.prev).bind(s),n,{boundary:f,cef:f,text:function(e){o?t.fOffset+=e.length:t.sOffset+=e.length,t.elements.push(se.fromDom(e))}}))}function L(e,t,n,r,o,i){void 0===i&&(i=!0);var a=new de(n,t),c=[],u=W();function l(){return 0<u.elements.length&&(c.push(u),u=W()),!1}return H(e,u,n,t,!1),V(e,a.next.bind(a),n,{boundary:l,cef:function(e){return l(),o&&c.push.apply(c,o.cef(e)),!1},text:function(e){u.elements.push(se.fromDom(e)),o&&o.text(e,u)}},r,i),r&&H(e,u,r,t,!0),l(),c}function U(u,e){var n=j(e.startContainer,e.startOffset),r=n.element.dom,o=j(e.endContainer,e.endOffset),i=o.element.dom;return L(u,e.commonAncestorContainer,r,i,{text:function(e,t){e===i?t.fOffset+=e.length-o.offset:e===r&&(t.sOffset+=n.offset)},cef:function(e){var t,n,r,o,i,a=w((n=se.fromDom(e),r="*[contenteditable=true]",1!==(o=i=void 0===n?document:n.dom).nodeType&&9!==o.nodeType&&11!==o.nodeType||0===o.childElementCount?[]:y(i.querySelectorAll(r),se.fromDom)),function(e){var t=e.dom;return L(u,t,t)}),c=function(e,t){return n=e.elements[0].dom,r=t.elements[0].dom,o=Node.DOCUMENT_POSITION_PRECEDING,0!=(n.compareDocumentPosition(r)&o)?1:-1;var n,r,o};return(t=k.call(a,0)).sort(c),t}},!1)}function $(e,t){return t.collapsed?[]:U(e,t)}function _(e,t){var n=e.createRng();return n.selectNode(t),$(e,n)}function z(c,e){return w(e,function(e){var a,n,r,t=e.elements,o=y(t,F).join(""),i=function(e,t,n,r){void 0===r&&(r=e.length);var o=t.regex;o.lastIndex=n=void 0===n?0:n;for(var i,a=[];i=o.exec(e);){var c=i[t.matchIndex],u=i.index+i[0].indexOf(c),l=u+c.length;if(r<l)break;a.push({start:u,finish:l}),o.lastIndex=l}return a}(o,c,e.sOffset,o.length-e.fOffset);return a=i,function(e,t){if(0===e.length)return[];for(var n=t(e[0]),r=[],o=[],i=0,a=e.length;i<a;i++){var c=e[i],u=t(c);u!==n&&(r.push(o),o=[]),n=u,o.push(c)}return 0!==o.length&&r.push(o),r}((n=function(e,n){var t=F(n),r=e.last,o=r+t.length,i=w(a,function(e,t){return e.start<o&&e.finish>r?[{element:n,start:Math.max(r,e.start)-r,finish:Math.min(o,e.finish)-r,matchId:t}]:[]});return{results:e.results.concat(i),last:o}},r={results:[],last:0},x(t,function(e,t){r=n(r,e)}),r.results),function(e){return e.matchId})})}function q(e,i){b(e,function(e,o){b(e,function(e){var t=se.fromDom(i.cloneNode(!1));D(t,"data-mce-index",o);var n,r=e.element.dom;r.length===e.finish&&0===e.start?B(e.element,t):(r.length!==e.finish&&r.splitText(e.finish),n=r.splitText(e.start),B(se.fromDom(n),t))})})}function G(e){var t=e.getAttribute("data-mce-index");return"number"==typeof t?""+t:t}function K(e,t,n,r){var o=e.dom.create("span",{"data-mce-bogus":1});o.className="mce-match-marker";var i,a,c,u,l,s,f,d,m,h,g=e.getBody();return me(e,t,!1),r?(c=e.dom,u=n,l=e.selection,s=o,d=l.getBookmark(),m=c.select("td[data-mce-selected],th[data-mce-selected]"),q(h=z(u,0<m.length?(f=c,w(m,function(e){return _(f,e)})):$(c,l.getRng())),s),l.moveToBookmark(d),h.length):(i=o,q(a=z(n,_(e.dom,g)),i),a.length)}function J(e){var t=e.parentNode;e.firstChild&&t.insertBefore(e.firstChild,e),e.parentNode.removeChild(e)}function Q(e,t){var n=[],r=N.toArray(e.getBody().getElementsByTagName("span"));if(r.length)for(var o=0;o<r.length;o++){var i=G(r[o]);null!==i&&i.length&&i===t.toString()&&n.push(r[o])}return n}function X(e,t,n){var r=t.get(),o=r.index,i=e.dom;(n=!1!==n)?o+1===r.count?o=0:o++:o-1==-1?o=r.count-1:o--,i.removeClass(Q(e,r.index),"mce-match-marker-selected");var a=Q(e,o);return a.length?(i.addClass(Q(e,o),"mce-match-marker-selected"),e.selection.scrollIntoView(a[0]),o):-1}function Y(e,t){var n=t.parentNode;e.remove(t),e.isEmpty(n)&&e.remove(n)}function Z(e,t,n,r,o,i){var a,c,u,l=(a=o,c="("+n.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&").replace(/\s/g,"[^\\S\\r\\n\\uFEFF]")+")",a?"(?:^|\\s|"+E()+")"+c+"(?=$|\\s|"+E()+")":c),s=K(e,t,{regex:new RegExp(l,r?"g":"gi"),matchIndex:1},i);return s&&(u=X(e,t,!0),t.set({index:u,count:s,text:n,matchCase:r,wholeWord:o,inSelection:i})),s}function ee(e,t){var n=X(e,t,!0);t.set(v(v({},t.get()),{index:n}))}function te(e,t){var n=X(e,t,!1);t.set(v(v({},t.get()),{index:n}))}function ne(e){var t=G(e);return null!==t&&0<t.length}function re(e,t,n,r,o){var i,a=t.get(),c=a.index,u=c;r=!1!==r;for(var l=e.getBody(),s=N.grep(N.toArray(l.getElementsByTagName("span")),ne),f=0;f<s.length;f++){var d=G(s[f]),m=i=parseInt(d,10);if(o||m===a.index){for(n.length?(s[f].firstChild.nodeValue=n,J(s[f])):Y(e.dom,s[f]);s[++f];){if((m=parseInt(G(s[f]),10))!==i){f--;break}Y(e.dom,s[f])}r&&u--}else c<i&&s[f].setAttribute("data-mce-index",String(i-1))}return t.set(v(v({},a),{count:o?0:a.count-1,index:u})),(r?ee:te)(e,t),!o&&0<t.get().count}function oe(i,a){var e,t,n,r=(e=p,t=g(T.none()),v(v({},n={clear:function(){o(),t.set(T.none())},isSet:function(){return t.get().isSome()},get:function(){return t.get()},set:function(e){o(),t.set(T.some(e))}}),{on:function(e){return n.get().each(e)}}));function o(){return t.get().each(e)}function c(e){(1<a.get().count?e.enable:e.disable)("next"),(1<a.get().count?e.enable:e.disable)("prev")}function u(e,t){x(["replace","replaceall","prev","next"],t?e.disable:e.enable)}function l(e,t){he.browser.isSafari()&&he.deviceType.isTouch()&&("find"===t||"replace"===t||"replaceall"===t)&&e.focus(t)}function s(e){me(i,a,!1),u(e,!0),c(e)}function f(e){var t,n,r=e.getData(),o=a.get();r.findtext.length?(o.text===r.findtext&&o.matchCase===r.matchcase&&o.wholeWord===r.wholewords?ee(i,a):((t=Z(i,a,r.findtext,r.matchcase,r.wholewords,r.inselection))<=0&&(n=e,i.windowManager.alert("Could not find the specified string.",function(){n.focus("findtext")})),u(e,0===t)),c(e)):s(e)}i.undoManager.add();var d=N.trim(i.selection.getContent({format:"text"})),m=a.get(),h={title:"Find and Replace",size:"normal",body:{type:"panel",items:[{type:"bar",items:[{type:"input",name:"findtext",placeholder:"Find",maximized:!0,inputMode:"search"},{type:"button",name:"prev",text:"Previous",icon:"action-prev",disabled:!0,borderless:!0},{type:"button",name:"next",text:"Next",icon:"action-next",disabled:!0,borderless:!0}]},{type:"input",name:"replacetext",placeholder:"Replace with",inputMode:"search"}]},buttons:[{type:"menu",name:"options",icon:"preferences",tooltip:"Preferences",align:"start",items:[{type:"togglemenuitem",name:"matchcase",text:"Match case"},{type:"togglemenuitem",name:"wholewords",text:"Find whole words only"},{type:"togglemenuitem",name:"inselection",text:"Find in selection"}]},{type:"custom",name:"find",text:"Find",primary:!0},{type:"custom",name:"replace",text:"Replace",disabled:!0},{type:"custom",name:"replaceall",text:"Replace all",disabled:!0}],initialData:{findtext:d,replacetext:"",wholewords:m.wholeWord,matchcase:m.matchCase,inselection:m.inSelection},onChange:function(e,t){"findtext"===t.name&&0<a.get().count&&s(e)},onAction:function(e,t){var n,r,o=e.getData();switch(t.name){case"find":f(e);break;case"replace":(re(i,a,o.replacetext)?c:s)(e);break;case"replaceall":re(i,a,o.replacetext,!0,!0),s(e);break;case"prev":te(i,a),c(e);break;case"next":ee(i,a),c(e);break;case"matchcase":case"wholewords":case"inselection":n=e.getData(),r=a.get(),a.set(v(v({},r),{matchCase:n.matchcase,wholeWord:n.wholewords,inSelection:n.inselection})),s(e)}l(e,t.name)},onSubmit:function(e){f(e),l(e,"find")},onClose:function(){i.focus(),me(i,a),i.undoManager.add()}};r.set(i.windowManager.open(h,{inline:"toolbar"}))}function ie(e,t){return function(){oe(e,t)}}"undefined"!=typeof window||Function("return this;")();function ae(e){return 3===e.dom.nodeType}function ce(e){if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}}var ue,le,se={fromHtml:function(e,t){var n=(t||document).createElement("div");if(n.innerHTML=e,!n.hasChildNodes()||1<n.childNodes.length)throw console.error("HTML does not have a single root node",e),new Error("HTML must have a single root node");return ce(n.childNodes[0])},fromTag:function(e,t){var n=(t||document).createElement(e);return ce(n)},fromText:function(e,t){var n=(t||document).createTextNode(e);return ce(n)},fromDom:ce,fromPoint:function(e,t,n){return T.from(e.dom.elementFromPoint(t,n)).map(ce)}},fe=(ue=ae,{get:function(e){if(!ue(e))throw new Error("Can only get text value of a text node");return le(e).getOr("")},getOption:le=function(e){return ue(e)?T.from(e.dom.nodeValue):T.none()},set:function(e,t){if(!ue(e))throw new Error("Can only set raw text value of a text node");e.dom.nodeValue=t}}),de=tinymce.util.Tools.resolve("tinymce.dom.TreeWalker"),me=function(e,t,n){for(var r,o,i=t.get(),a=N.toArray(e.getBody().getElementsByTagName("span")),c=0;c<a.length;c++){var u=G(a[c]);null!==u&&u.length&&(u===i.index.toString()&&(r=r||a[c].firstChild,o=a[c].firstChild),J(a[c]))}if(t.set(v(v({},i),{index:-1,count:0,text:""})),r&&o){var l=e.dom.createRng();return l.setStart(r,0),l.setEnd(o,o.data.length),!1!==n&&e.selection.setRng(l),l}},he=tinymce.util.Tools.resolve("tinymce.Env");o.add("searchreplace",function(e){var t,n,r,o,i,a=g({index:-1,count:0,text:"",matchCase:!1,wholeWord:!1,inSelection:!1}),c=a;return(t=e).addCommand("SearchReplace",function(){oe(t,c)}),(n=e).ui.registry.addMenuItem("searchreplace",{text:"Find and replace...",shortcut:"Meta+F",onAction:ie(n,r=a),icon:"search"}),n.ui.registry.addButton("searchreplace",{tooltip:"Find and replace",onAction:ie(n,r),icon:"search"}),n.shortcuts.add("Meta+F","",ie(n,r)),o=e,i=a,{done:function(e){return me(o,i,e)},find:function(e,t,n,r){return Z(o,i,e,t,n,r=void 0!==r&&r)},next:function(){return ee(o,i)},prev:function(){return te(o,i)},replace:function(e,t,n){return re(o,i,e,t,n)}}})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/spellchecker/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/spellchecker/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..0c91f4a6a4a338edf1a0b40d7be2271710aea8e5
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/spellchecker/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function C(e){var t=e;return{get:function(){return t},set:function(e){t=e}}}function u(e){return e.getParam("spellchecker_rpc_url")}function E(e){var t=new RegExp('[^\\s!"#$%&()*+,-./:;<=>?@[\\]^_{|}`\xa7\xa9\xab\xae\xb1\xb6\xb7\xb8\xbb\xbc\xbd\xbe\xbf\xd7\xf7\xa4\u201d\u201c\u201e\xa0\u2002\u2003\u2009]+',"g");return e.getParam("spellchecker_wordchar_pattern",t)}function p(e){return e&&1===e.nodeType&&"false"===e.contentEditable}function r(i,r){function o(e){var t=i.getElementsByTagName("*"),n=[];e="number"==typeof e?""+e:null;for(var r=0;r<t.length;r++){var o=t[r],a=o.getAttribute("data-mce-index");null!==a&&a.length&&-1!==o.className.indexOf("mce-spellchecker-word")&&(a!==e&&null!==e||n.push(o))}return n}function a(e){for(var t=c.length;t--;)if(c[t]===e)return t;return-1}var n,c=[],v=r.dom,f=r.schema.getBlockElements(),h=r.schema.getWhiteSpaceElements(),g=r.schema.getShortEndedElements(),s=function(e){if(3===e.nodeType)return e.data;if(h[e.nodeName]&&!f[e.nodeName])return"";if(p(e))return"\n";var t="";if((f[e.nodeName]||g[e.nodeName])&&(t+="\n"),e=e.firstChild)for(;t+=s(e),e=e.nextSibling;);return t};function e(e){for(var t=0,n=c.length;t<n&&!1!==e(c[t],t);t++);return this}function t(e){for(var t=o(e?a(e):null),n=t.length;n--;)!function(e){for(var t=e.parentNode;0<e.childNodes.length;)t.insertBefore(e.childNodes[0],e);t.removeChild(e)}(t[n]);return this}function l(e){var t=o(a(e)),n=r.dom.createRng();return n.setStartBefore(t[0]),n.setEndAfter(t[t.length-1]),n}var u=s(i);return{text:u,matches:c,each:e,filter:function(n){var r=[];return e(function(e,t){n(e,t)&&r.push(e)}),c=r,this},reset:function(){return c.splice(0,c.length),t(),this},matchFromElement:function(e){return c[e.getAttribute("data-mce-index")]},elementFromMatch:function(e){return o(a(e))[0]},find:function(e,t){if(u&&e.global)for(;n=e.exec(u);)c.push(function(e,t){if(!e[0])throw new Error("findAndReplaceDOMText cannot handle zero-length matches");return{start:e.index,end:e.index+e[0].length,text:e[0],data:t}}(n,t));return this},add:function(e,t,n){return c.push({start:e,end:e+t,text:u.substr(e,t),data:n}),this},wrap:function(e){return c.length&&function(e,t,n){var r,o,a,i,c,s=[],l=0,u=e,d=0;(t=t.slice(0)).sort(function(e,t){return e.start-t.start}),c=t.shift();e:for(;;){if((f[u.nodeName]||g[u.nodeName]||p(u))&&l++,3===u.nodeType&&(!o&&u.length+l>=c.end?(o=u,i=c.end-l):r&&s.push(u),!r&&u.length+l>c.start&&(r=u,a=c.start-l),l+=u.length),r&&o){if(u=n({startNode:r,startNodeIndex:a,endNode:o,endNodeIndex:i,innerNodes:s,match:c.text,matchIndex:d}),l-=o.length-i,o=r=null,s=[],d++,!(c=t.shift()))break}else if(h[u.nodeName]&&!f[u.nodeName]||!u.firstChild){if(u.nextSibling){u=u.nextSibling;continue}}else if(!p(u)){u=u.firstChild;continue}for(;;){if(u.nextSibling){u=u.nextSibling;break}if(u.parentNode===e)break e;u=u.parentNode}}}(i,c,(o=e,function(e){var t=e.startNode,n=e.endNode,r=e.matchIndex,o=v.doc;if(t===n){var a=t,i=a.parentNode;0<e.startNodeIndex&&(s=o.createTextNode(a.data.substring(0,e.startNodeIndex)),i.insertBefore(s,a));var c=m(e.match,r);return i.insertBefore(c,a),e.endNodeIndex<a.length&&(l=o.createTextNode(a.data.substring(e.endNodeIndex)),i.insertBefore(l,a)),a.parentNode.removeChild(a),c}for(var s=o.createTextNode(t.data.substring(0,e.startNodeIndex)),l=o.createTextNode(n.data.substring(e.endNodeIndex)),u=m(t.data.substring(e.startNodeIndex),r),d=0,f=e.innerNodes.length;d<f;++d){var h=e.innerNodes[d],g=m(h.data,r);h.parentNode.replaceChild(g,h)}var p=m(n.data.substring(0,e.endNodeIndex),r);return(i=t.parentNode).insertBefore(s,t),i.insertBefore(u,t),i.removeChild(t),(i=n.parentNode).insertBefore(p,n),i.insertBefore(l,n),i.removeChild(n),p})),this;function m(e,t){var n=c[t];n.stencil||(n.stencil=o(n));var r=n.stencil.cloneNode(!1);return r.setAttribute("data-mce-index",""+t),e&&r.appendChild(v.doc.createTextNode(e)),r}var o},unwrap:t,replace:function(e,t){var n=l(e);return n.deleteContents(),0<t.length&&n.insertNode(r.dom.doc.createTextNode(t)),n},rangeFromMatch:l,indexOf:a}}function l(e,t){var n;return t.get()||(n=r(e.getBody(),e),t.set(n)),t.get()}function k(e,t,n,r,o,a,i){var c,s,l;(e.getParam("spellchecker_callback")||(c=e,s=t,l=n,function(e,t,r,o){var n={method:e,lang:l.get()},a="";n["addToDictionary"===e?"word":"text"]=t,M.each(n,function(e,t){a&&(a+="&"),a+=t+"="+encodeURIComponent(e)}),h.send({url:new f(s).toAbsolute(u(c)),type:"post",content_type:"application/x-www-form-urlencoded",data:a,success:function(e){var t,n=JSON.parse(e);n?n.error?o(n.error):r(n):(t=c.translate("Server response wasn't proper JSON."),o(t))},error:function(){var e=c.translate("The spelling service was not found: (")+u(c)+c.translate(")");o(e)}})})).call(e.plugins.spellchecker,r,o,a,i)}function R(t,e,n,r,o,a){i(t,n,r)||(t.setProgressState(!0),k(t,e,a,"spellcheck",l(t,r).text,function(e){O(t,n,r,o,e)},function(e){t.notificationManager.open({text:e,type:"error"}),t.setProgressState(!1),i(t,n,r)}),t.focus())}function y(e,t,n){e.dom.select("span.mce-spellchecker-word").length||i(e,t,n)}function S(t,e,n,r,o,a){t.selection.collapse(),a?M.each(t.dom.select("span.mce-spellchecker-word"),function(e){e.getAttribute("data-mce-word")===r&&t.dom.remove(e,!0)}):t.dom.remove(o,!0),y(t,e,n)}function b(e){var t=e.getAttribute("data-mce-index");return"number"==typeof t?""+t:t}function _(g,p,m,v,x,N){g.ui.registry.addContextMenu("spellchecker",{update:function(e){var t=e;if("mce-spellchecker-word"!==t.className)return[];var c,s,n,l,u,d,f,h,r,o,a=function(e,t){var n=[],r=M.toArray(e.getBody().getElementsByTagName("span"));if(r.length)for(var o=0;o<r.length;o++){var a=b(r[o]);null!==a&&a.length&&a===t.toString()&&n.push(r[o])}return n}(g,b(t));if(0<a.length){var i=g.dom.createRng();return i.setStartBefore(a[0]),i.setEndAfter(a[a.length-1]),g.selection.setRng(i),c=g,s=p,n=m,l=v,u=x,d=N,f=t.getAttribute("data-mce-word"),h=a,r=[],o=n.get().suggestions[f],M.each(o,function(e){r.push({text:e,onAction:function(){c.insertContent(c.dom.encode(e)),c.dom.remove(h),y(c,l,u)}})}),n.get().hasDictionarySupport&&(r.push({type:"separator"}),r.push({text:"Add to dictionary",onAction:function(){var t,e=s,n=l,r=u,o=d,a=f,i=h;(t=c).setProgressState(!0),k(t,e,o,"addToDictionary",a,function(){t.setProgressState(!1),t.dom.remove(i,!0),y(t,n,r)},function(e){t.notificationManager.open({text:e,type:"error"}),t.setProgressState(!1)})}})),r.push.apply(r,[{type:"separator"},{text:"Ignore",onAction:function(){S(c,l,u,f,h)}},{text:"Ignore all",onAction:function(){S(c,l,u,f,h,!0)}}]),r}}})}var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),d=Object.hasOwnProperty,M=tinymce.util.Tools.resolve("tinymce.util.Tools"),f=tinymce.util.Tools.resolve("tinymce.util.URI"),h=tinymce.util.Tools.resolve("tinymce.util.XHR"),i=function(e,t,n){var r=e.selection.getBookmark();if(l(e,n).reset(),e.selection.moveToBookmark(r),n.set(null),t.get())return t.set(!1),e.fire("SpellcheckEnd"),!0},O=function(t,e,n,r,o){var a=!!o.dictionary,i=o.words;if(t.setProgressState(!1),function(e){for(var t in e)if(d.call(e,t))return;return 1}(i)){var c=t.translate("No misspellings found.");return t.notificationManager.open({text:c,type:"info"}),void e.set(!1)}r.set({suggestions:i,hasDictionarySupport:a});var s=t.selection.getBookmark();l(t,n).find(E(t)).filter(function(e){return!!i[e.text]}).wrap(function(e){return t.dom.create("span",{class:"mce-spellchecker-word","aria-invalid":"spelling","data-mce-bogus":1,"data-mce-word":e.text})}),t.selection.moveToBookmark(s),e.set(!0),t.fire("SpellcheckStart")},D=function(){return(D=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e}).apply(this,arguments)},F="SpellcheckStart SpellcheckEnd";e.add("spellchecker",function(e,t){if(0==(!!e.hasPlugin("tinymcespellchecker",!0)&&(void 0!==window.console&&window.console.log&&window.console.log("Spell Checker Pro is incompatible with Spell Checker plugin! Remove 'spellchecker' from the 'plugins' option."),!0))){var n=C(!1),r=C((I=(P=e).getParam("language","en"),P.getParam("spellchecker_language",I))),o=C(null),a=C(null);return c=e,s=t,l=n,u=o,d=r,f=a,h=M.map(c.getParam("spellchecker_languages","English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr_FR,German=de,Italian=it,Polish=pl,Portuguese=pt_BR,Spanish=es,Swedish=sv").split(","),function(e){var t=e.split("=");return{name:t[0],value:t[1]}}),g=[],M.each(h,function(e){g.push({selectable:!0,text:e.name,data:e.value})}),p=g,v=D(D({},m={tooltip:"Spellcheck",onAction:i,icon:"spell-check",onSetup:function(e){function t(){e.setActive(l.get())}return c.on(F,t),function(){c.off(F,t)}}}),{type:"splitbutton",select:function(e){return e===d.get()},fetch:function(e){e(M.map(p,function(e){return{type:"choiceitem",value:e.data,text:e.text}}))},onItemAction:function(e,t){d.set(t)}}),1<p.length?c.ui.registry.addSplitButton("spellchecker",v):c.ui.registry.addToggleButton("spellchecker",m),c.ui.registry.addToggleMenuItem("spellchecker",{text:"Spellcheck",icon:"spell-check",onSetup:function(e){function t(){e.setActive(l.get())}return e.setActive(l.get()),c.on(F,t),function(){c.off(F,t)}},onAction:i}),_(e,t,a,n,o,r),b=t,w=n,T=o,A=a,B=r,(S=e).addCommand("mceSpellCheck",function(){R(S,b,w,T,A,B)}),x=e,N=n,k=a,{getTextMatcher:(y=o).get,getWordCharPattern:function(){return E(x)},markErrors:function(e){O(x,N,y,k,e)},getLanguage:r.get}}function i(){R(c,s,l,u,f,d)}var c,s,l,u,d,f,h,g,p,m,v,x,N,k,y,S,b,w,T,A,B,P,I})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/tabfocus/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/tabfocus/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..d3a4ff37a77965c4b8456fc056c52609e1388f9b
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/tabfocus/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function n(e){e.keyCode!==y.TAB||e.ctrlKey||e.altKey||e.metaKey||e.preventDefault()}var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),s=tinymce.util.Tools.resolve("tinymce.EditorManager"),o=tinymce.util.Tools.resolve("tinymce.Env"),a=tinymce.util.Tools.resolve("tinymce.util.Delay"),c=tinymce.util.Tools.resolve("tinymce.util.Tools"),y=tinymce.util.Tools.resolve("tinymce.util.VK"),d=t.DOM;e.add("tabfocus",function(e){function t(l){var r,e,t,n,i;l.keyCode!==y.TAB||l.ctrlKey||l.altKey||l.metaKey||l.isDefaultPrevented()||(e=function(e){function t(e){return/INPUT|TEXTAREA|BUTTON/.test(e.tagName)&&s.get(l.id)&&-1!==e.tabIndex&&i(e)}var n=d.select(":input:enabled,*[tabindex]:not(iframe)"),i=function(e){return"BODY"===e.nodeName||"hidden"!==e.type&&"none"!==e.style.display&&"hidden"!==e.style.visibility&&i(e.parentNode)};if(c.each(n,function(e,t){if(e.id===u.id)return r=t,!1}),0<e){for(var o=r+1;o<n.length;o++)if(t(n[o]))return n[o]}else for(o=r-1;0<=o;o--)if(t(n[o]))return n[o];return null},1===(t=c.explode(u.getParam("tab_focus",u.getParam("tabfocus_elements",":prev,:next")))).length&&(t[1]=t[0],t[0]=":prev"),(n=l.shiftKey?":prev"===t[0]?e(-1):d.get(t[0]):":next"===t[1]?e(1):d.get(t[1]))&&(i=s.get(n.id||n.name),n.id&&i?i.focus():a.setTimeout(function(){o.webkit||window.focus(),n.focus()},10),l.preventDefault()))}var u;(u=e).on("init",function(){u.inline&&d.setAttrib(u.getBody(),"tabIndex",null),u.on("keyup",n),o.gecko?u.on("keypress keydown",t):u.on("keydown",t)})})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/table/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/table/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..f835e828d85f0aecc4c8d37a518ae55f8f5a7491
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/table/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function e(r){return function(e){return t=typeof(n=e),(null===n?"null":"object"==t&&(Array.prototype.isPrototypeOf(n)||n.constructor&&"Array"===n.constructor.name)?"array":"object"==t&&(String.prototype.isPrototypeOf(n)||n.constructor&&"String"===n.constructor.name)?"string":t)===r;var n,t}}function n(n){return function(e){return typeof e===n}}function t(n){return function(e){return n===e}}function l(e){return!(null==e)}function E(){}function C(e){return function(){return e}}function S(e){return e}function r(e,n){return e===n}var T=e("string"),g=e("object"),a=e("array"),h=t(null),o=n("boolean"),u=t(void 0),c=n("function"),f=n("number");function P(r){for(var o=[],e=1;e<arguments.length;e++)o[e-1]=arguments[e];return function(){for(var e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];var t=o.concat(e);return r.apply(null,t)}}function p(n){return function(e){return!n(e)}}function i(){return s}var v=C(!1),x=C(!0),s={fold:function(e,n){return e()},isSome:v,isNone:x,getOr:S,getOrThunk:m,getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:C(null),getOrUndefined:C(void 0),or:S,orThunk:m,map:i,each:E,bind:i,exists:v,forall:x,filter:function(){return s},toArray:function(){return[]},toString:C("none()")};function m(e){return e()}function y(e,n){return-1<G.call(e,n)}function R(e,n){for(var t=0,r=e.length;t<r;t++)if(n(e[t],t))return!0;return!1}function D(e,n){for(var t=[],r=0;r<e;r++)t.push(n(r));return t}function O(e,n){for(var t=e.length,r=new Array(t),o=0;o<t;o++){var u=e[o];r[o]=n(u,o)}return r}function A(e,n){for(var t=0,r=e.length;t<r;t++)n(e[t],t)}function d(e,n){for(var t=[],r=[],o=0,u=e.length;o<u;o++){var i=e[o];(n(i,o)?t:r).push(i)}return{pass:t,fail:r}}function k(e,n){for(var t=[],r=0,o=e.length;r<o;r++){var u=e[r];n(u,r)&&t.push(u)}return t}function I(e,r,o){return function(e){for(var n,t=e.length-1;0<=t;t--)n=e[t],o=r(o,n,t)}(e),o}function B(e,t,r){return A(e,function(e,n){r=t(r,e,n)}),r}function w(e,n){return function(e,n,t){for(var r=0,o=e.length;r<o;r++){var u=e[r];if(n(u,r))return q.some(u);if(t(u,r))break}return q.none()}(e,n,v)}function b(e,n){for(var t=0,r=e.length;t<r;t++)if(n(e[t],t))return q.some(t);return q.none()}function M(e){for(var n=[],t=0,r=e.length;t<r;++t){if(!a(e[t]))throw new Error("Arr.flatten item "+t+" was not an array, input: "+e);$.apply(n,e[t])}return n}function N(e,n){return M(O(e,n))}function z(e,n){for(var t=0,r=e.length;t<r;++t)if(!0!==n(e[t],t))return!1;return!0}function L(e,n){for(var t={},r=0,o=e.length;r<o;r++){var u=e[r];t[String(u)]=n(u,r)}return t}function _(e){return[e]}function W(e,n){return 0<=n&&n<e.length?q.some(e[n]):q.none()}function j(e){return W(e,0)}function F(e){return W(e,e.length-1)}function H(e,n){for(var t=0;t<e.length;t++){var r=n(e[t],t);if(r.isSome())return r}return q.none()}var V=function(t){function e(){return o}function n(e){return e(t)}var r=C(t),o={fold:function(e,n){return n(t)},isSome:x,isNone:v,getOr:r,getOrThunk:r,getOrDie:r,getOrNull:r,getOrUndefined:r,or:e,orThunk:e,map:function(e){return V(e(t))},each:function(e){e(t)},bind:n,exists:n,forall:n,filter:function(e){return e(t)?o:s},toArray:function(){return[t]},toString:function(){return"some("+t+")"}};return o},q={some:V,none:i,from:function(e){return null==e?s:V(e)}},U=Array.prototype.slice,G=Array.prototype.indexOf,$=Array.prototype.push,K=function(){return(K=Object.assign||function(e){for(var n,t=1,r=arguments.length;t<r;t++)for(var o in n=arguments[t])Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o]);return e}).apply(this,arguments)};function X(e,n,t){if(t||2===arguments.length)for(var r,o=0,u=n.length;o<u;o++)!r&&o in n||((r=r||Array.prototype.slice.call(n,0,o))[o]=n[o]);return e.concat(r||Array.prototype.slice.call(n))}function Y(t){var r,o=!1;return function(){for(var e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];return o||(o=!0,r=t.apply(null,e)),r}}function J(e,n){var t=String(n).toLowerCase();return w(e,function(e){return e.search(t)})}function Q(e,n,t){return""===n||e.length>=n.length&&e.substr(t,t+n.length)===n}function Z(e,n){return-1!==e.indexOf(n)}function ee(e,n){return Q(e,n,e.length-n.length)}function ne(e){return 0<e.length}function te(n){return function(e){return Z(e,n)}}function re(e){return window.matchMedia(e).matches}function oe(e,n){var t=e.dom;if(1!==t.nodeType)return!1;var r=t;if(void 0!==r.matches)return r.matches(n);if(void 0!==r.msMatchesSelector)return r.msMatchesSelector(n);if(void 0!==r.webkitMatchesSelector)return r.webkitMatchesSelector(n);if(void 0!==r.mozMatchesSelector)return r.mozMatchesSelector(n);throw new Error("Browser lacks native selectors")}function ue(e){return 1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType||0===e.childElementCount}function ie(e,n){var t=void 0===n?document:n.dom;return ue(t)?q.none():q.from(t.querySelector(e)).map(Ve.fromDom)}function ce(e,n){return e.dom===n.dom}function le(e,n){return He().browser.isIE()?(t=e.dom,r=n.dom,o=Node.DOCUMENT_POSITION_CONTAINED_BY,0!=(t.compareDocumentPosition(r)&o)):(u=e.dom)!==(i=n.dom)&&u.contains(i);var t,r,o,u,i}function ae(e,n){for(var t=Ue(e),r=0,o=t.length;r<o;r++){var u=t[r];n(e[u],u)}}function fe(e,t){return $e(e,function(e,n){return{k:n,v:t(e,n)}})}function se(e,n){var t={},r=n,o=t,u=function(e,n){o[n]=e},i=E;return ae(e,function(e,n){(r(e,n)?u:i)(e,n)}),t}function me(e,t){var r=[];return ae(e,function(e,n){r.push(t(e,n))}),r}function de(e){return me(e,S)}function ge(e){return Ue(e).length}function pe(e,n){return Ke(e,n)?q.from(e[n]):q.none()}function be(e,n){return Ke(e,n)&&void 0!==e[n]&&null!==e[n]}function he(e,n,t){return{element:e,rowspan:n,colspan:t}}function ve(e,n,t){return{element:e,cells:n,section:t}}function we(e,n,t){return{element:e,isNew:n,isLocked:t}}function ye(e,n,t,r){return{element:e,cells:n,section:t,isNew:r}}function Ce(){return De(0,0)}function Se(e){function n(e){return function(){return t===e}}var t=e.current,r=e.version;return{current:t,version:r,isEdge:n("Edge"),isChrome:n("Chrome"),isIE:n("IE"),isOpera:n("Opera"),isFirefox:n(Me),isSafari:n("Safari")}}function Te(e){function n(e){return function(){return t===e}}var t=e.current,r=e.version;return{current:t,version:r,isWindows:n(Ne),isiOS:n("iOS"),isAndroid:n(ze),isOSX:n("OSX"),isLinux:n("Linux"),isSolaris:n(Le),isFreeBSD:n(_e),isChromeOS:n(We)}}function xe(e){if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}}var Re,De=function(e,n){return{major:e,minor:n}},Oe={nu:De,detect:function(e,n){var t,r,o=String(n).toLowerCase();return 0===e.length?Ce():(r=function(e,n){for(var t=0;t<e.length;t++){var r=e[t];if(r.test(n))return r}}(e,t=o))?De(u(1),u(2)):{major:0,minor:0};function u(e){return Number(t.replace(r,"$"+e))}},unknown:Ce},Ae=function(e,n){return Q(e,n,0)},ke=(Re=/^\s+|\s+$/g,function(e){return e.replace(Re,"")}),Ie=/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,Be={browsers:C([{name:"Edge",versionRegexes:[/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],search:function(e){return Z(e,"edge/")&&Z(e,"chrome")&&Z(e,"safari")&&Z(e,"applewebkit")}},{name:"Chrome",brand:"Chromium",versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/,Ie],search:function(e){return Z(e,"chrome")&&!Z(e,"chromeframe")}},{name:"IE",versionRegexes:[/.*?msie\ ?([0-9]+)\.([0-9]+).*/,/.*?rv:([0-9]+)\.([0-9]+).*/],search:function(e){return Z(e,"msie")||Z(e,"trident")}},{name:"Opera",versionRegexes:[Ie,/.*?opera\/([0-9]+)\.([0-9]+).*/],search:te("opera")},{name:"Firefox",versionRegexes:[/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],search:te("firefox")},{name:"Safari",versionRegexes:[Ie,/.*?cpu os ([0-9]+)_([0-9]+).*/],search:function(e){return(Z(e,"safari")||Z(e,"mobile/"))&&Z(e,"applewebkit")}}]),oses:C([{name:"Windows",search:te("win"),versionRegexes:[/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]},{name:"iOS",search:function(e){return Z(e,"iphone")||Z(e,"ipad")},versionRegexes:[/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,/.*cpu os ([0-9]+)_([0-9]+).*/,/.*cpu iphone os ([0-9]+)_([0-9]+).*/]},{name:"Android",search:te("android"),versionRegexes:[/.*?android\ ?([0-9]+)\.([0-9]+).*/]},{name:"OSX",search:te("mac os x"),versionRegexes:[/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]},{name:"Linux",search:te("linux"),versionRegexes:[]},{name:"Solaris",search:te("sunos"),versionRegexes:[]},{name:"FreeBSD",search:te("freebsd"),versionRegexes:[]},{name:"ChromeOS",search:te("cros"),versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/]}])},Me="Firefox",Ee=function(){return Se({current:void 0,version:Oe.unknown()})},Pe=Se,Ne=(C("Edge"),C("Chrome"),C("IE"),C("Opera"),C(Me),C("Safari"),"Windows"),ze="Android",Le="Solaris",_e="FreeBSD",We="ChromeOS",je=function(){return Te({current:void 0,version:Oe.unknown()})},Fe=Te,He=(C(Ne),C("iOS"),C(ze),C("Linux"),C("OSX"),C(Le),C(_e),C(We),Y(function(){return e=navigator.userAgent,n=q.from(navigator.userAgentData),t=re,p=Be.browsers(),b=Be.oses(),h=n.bind(function(e){return r=p,H(e.brands,function(n){var t=n.brand.toLowerCase();return w(r,function(e){var n;return t===(null===(n=e.brand)||void 0===n?void 0:n.toLowerCase())}).map(function(e){return{current:e.name,version:Oe.nu(parseInt(n.version,10),0)}})});var r}).orThunk(function(){return J(p,t=e).map(function(e){var n=Oe.detect(e.versionRegexes,t);return{current:e.name,version:n}});var t}).fold(Ee,Pe),v=J(b,r=e).map(function(e){var n=Oe.detect(e.versionRegexes,r);return{current:e.name,version:n}}).fold(je,Fe),{browser:h,os:v,deviceType:(u=h,i=e,c=t,l=(o=v).isiOS()&&!0===/ipad/i.test(i),a=o.isiOS()&&!l,s=(f=o.isiOS()||o.isAndroid())||c("(pointer:coarse)"),m=l||!a&&f&&c("(min-device-width:768px)"),d=a||f&&!m,g=u.isSafari()&&o.isiOS()&&!1===/safari/i.test(i),{isiPad:C(l),isiPhone:C(a),isTablet:C(m),isPhone:C(d),isTouch:C(s),isAndroid:o.isAndroid,isiOS:o.isiOS,isWebView:C(g),isDesktop:C(!d&&!m&&!g)})};var e,n,t,r,o,u,i,c,l,a,f,s,m,d,g,p,b,h,v})),Ve={fromHtml:function(e,n){var t=(n||document).createElement("div");if(t.innerHTML=e,!t.hasChildNodes()||1<t.childNodes.length)throw console.error("HTML does not have a single root node",e),new Error("HTML must have a single root node");return xe(t.childNodes[0])},fromTag:function(e,n){var t=(n||document).createElement(e);return xe(t)},fromText:function(e,n){var t=(n||document).createTextNode(e);return xe(t)},fromDom:xe,fromPoint:function(e,n,t){return q.from(e.dom.elementFromPoint(n,t)).map(xe)}},qe=oe,Ue=Object.keys,Ge=Object.hasOwnProperty,$e=function(e,r){var o={};return ae(e,function(e,n){var t=r(e,n);o[t.k]=t.v}),o},Ke=function(e,n){return Ge.call(e,n)},Xe=["tfoot","thead","tbody","colgroup"];function Ye(e){return e.dom.nodeName.toLowerCase()}function Je(e){return e.dom.nodeType}function Qe(n){return function(e){return Je(e)===n}}function Ze(e){return 8===Je(e)||"#comment"===Ye(e)}function en(n){return function(e){return gn(e)&&Ye(e)===n}}function nn(e){return Ve.fromDom(e.dom.ownerDocument)}function tn(e){return bn(e)?e:nn(e)}function rn(e){return q.from(e.dom.parentNode).map(Ve.fromDom)}function on(e,n){for(var t=c(n)?n:v,r=e.dom,o=[];null!==r.parentNode&&void 0!==r.parentNode;){var u=r.parentNode,i=Ve.fromDom(u);if(o.push(i),!0===t(i))break;r=u}return o}function un(e){return q.from(e.dom.previousSibling).map(Ve.fromDom)}function cn(e){return q.from(e.dom.nextSibling).map(Ve.fromDom)}function ln(e){return O(e.dom.childNodes,Ve.fromDom)}function an(e,n){var t=e.dom.childNodes;return q.from(t[n]).map(Ve.fromDom)}function fn(e){return Ve.fromDom(e.dom.host)}function sn(e,n,t){return r=function(e){return oe(e,n)},k(on(e,t),r);var r}function mn(e,n){return t=function(e){return oe(e,n)},k(ln(e),t);var t}function dn(e,n){return ue(t=void 0===e?document:e.dom)?[]:O(t.querySelectorAll(n),Ve.fromDom);var t}"undefined"!=typeof window||Function("return this;")();var gn=Qe(1),pn=Qe(3),bn=Qe(9),hn=Qe(11),vn=c(Element.prototype.attachShadow)&&c(Node.prototype.getRootNode),wn=C(vn),yn=vn?function(e){return Ve.fromDom(e.dom.getRootNode())}:tn,Cn=function(e){return l(e.dom.shadowRoot)},Sn=function(e){var n=pn(e)?e.dom.parentNode:e.dom;if(null==n||null===n.ownerDocument)return!1;var t,r,o,u,i,c=n.ownerDocument;return o=Ve.fromDom(n),i=yn(o),(hn(u=i)&&l(u.dom.host)?q.some(i):q.none()).fold(function(){return c.body.contains(n)},(t=Sn,r=fn,function(e){return t(r(e))}))},Tn=function(e){var n=e.dom.body;if(null==n)throw new Error("Body is not available yet");return Ve.fromDom(n)},xn=function(e,n){var t=[];return A(ln(e),function(e){t=(t=n(e)?t.concat([e]):t).concat(xn(e,n))}),t};function Rn(e,n,t,r,o){return e(t,r)?q.some(t):c(o)&&o(t)?q.none():n(t,r,o)}function Dn(e,n,t){for(var r=e.dom,o=c(t)?t:v;r.parentNode;){var r=r.parentNode,u=Ve.fromDom(r);if(n(u))return q.some(u);if(o(u))break}return q.none()}function On(e,n,t){return Dn(e,function(e){return oe(e,n)},t)}function An(e,n){return t=function(e){return oe(e,n)},w(e.dom.childNodes,function(e){return t(Ve.fromDom(e))}).map(Ve.fromDom);var t}function kn(e,n){return ie(n,e)}function In(e,n,t){return Rn(oe,On,e,n,t)}function Bn(e,n,t){if(!(T(t)||o(t)||f(t)))throw console.error("Invalid call to Attribute.set. Key ",n,":: Value ",t,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(n,t+"")}function Mn(e,n,t){Bn(e.dom,n,t)}function En(e,n){var t=e.dom;ae(n,function(e,n){Bn(t,n,e)})}function Pn(e,n){var t=e.dom.getAttribute(n);return null===t?void 0:t}function Nn(e,n){return q.from(Pn(e,n))}function zn(e){return B(e.dom.attributes,function(e,n){return e[n.name]=n.value,e},{})}function Ln(e,n,t){return void 0===t&&(t=r),e.exists(function(e){return t(e,n)})}function _n(e){for(var n=[],t=function(e){n.push(e)},r=0;r<e.length;r++)e[r].each(t);return n}function Wn(e,n,t){return e.isSome()&&n.isSome()?q.some(t(e.getOrDie(),n.getOrDie())):q.none()}function jn(e,n){return e?q.some(n):q.none()}function Fn(e){return void 0!==e.style&&c(e.style.getPropertyValue)}function Hn(e,n,t){if(!T(t))throw console.error("Invalid call to CSS.set. Property ",n,":: Value ",t,":: Element ",e),new Error("CSS value must be a string: "+t);Fn(e)&&e.style.setProperty(n,t)}function Vn(e,n,t){Hn(e.dom,n,t)}function qn(e,n){var t=e.dom;ae(n,function(e,n){Hn(t,n,e)})}function Un(e,n){var t=e.dom,r=window.getComputedStyle(t).getPropertyValue(n);return""!==r||Sn(e)?r:jt(t,n)}function Gn(e,n){var t=e.dom,r=jt(t,n);return q.from(r).filter(function(e){return 0<e.length})}function $n(e,n){var t,r=n;Fn(t=e.dom)&&t.style.removeProperty(r),Ln(Nn(e,"style").map(ke),"")&&Wt(e,"style")}function Kn(e,n,t){return void 0===t&&(t=0),Nn(e,n).map(function(e){return parseInt(e,10)}).getOr(t)}function Xn(e,n){return Kn(e,n,1)}function Yn(e){return en("col")(e)?1<Kn(e,"span",1):1<Xn(e,"colspan")}function Jn(e){return 1<Xn(e,"rowspan")}function Qn(e,n){return parseInt(Un(e,n),10)}function Zn(e,n){return Vt(e,n,x)}function et(e,n){return t=["td","th"],(o=void 0===(o=n)?v:n)(r=e)?q.none():y(t,Ye(r))?q.some(r):On(r,t.join(","),function(e){return oe(e,"table")||o(e)});var t,r,o}function nt(e){return Zn(e,"th,td")}function tt(e){return oe(e,"colgroup")?mn(e,"col"):N(qt(e),function(e){return mn(e,"col")})}function rt(e,n){return In(e,"table",n)}function ot(e){return Zn(e,"tr")}function ut(e,t){return O(e,function(e){if("colgroup"!==Ye(e))return ve(e,n=O(nt(e),function(e){return he(e,Kn(e,"rowspan",1),Kn(e,"colspan",1))}),t(e));var n=O(tt(e),function(e){return he(e,1,Kn(e,"span",1))});return ve(e,n,"colgroup")})}function it(e){return rn(e).map(function(e){var n=Ye(e);return y(Xe,n)?n:"tbody"}).getOr("tbody")}function ct(e){var n=ot(e);return ut(X(X([],qt(e),!0),n,!0),it)}function lt(e,n,t){var r=e.cells,o=r.slice(0,n),u=r.slice(n),i=o.concat(t).concat(u);return Ut(e,i)}function at(e,n,t){return lt(e,n,[t])}function ft(e,n,t){e.cells[n]=t}function st(e,n){return e.cells[n]}function mt(e,n){return st(e,n).element}function dt(e){return e.cells.length}function gt(e){var n=d(e,function(e){return"colgroup"===e.section});return{rows:n.fail,cols:n.pass}}function pt(e,n,t){var r=O(e.cells,t);return ye(n(e.element),r,e.section,!0)}function bt(e){return Nn(e,Gt).bind(function(e){return q.from(e.match(/\d+/g))}).map(function(e){return L(e,x)})}function ht(e){var n,t=me(B(gt(e).rows,function(t,e){return A(e.cells,function(e,n){e.isLocked&&(t[n]=!0)}),t},{}),function(e,n){return parseInt(n,10)});return(n=U.call(t,0)).sort(void 0),n}function vt(e){var l={},n=[],a=j(e).map(function(e){return e.element}).bind(rt).bind(bt).getOr({}),t=0,f=0,s=0,r=d(e,function(e){return"colgroup"===e.section}),o=r.pass;A(r.fail,function(e){var c=[];A(e.cells,function(e){for(var n=0;void 0!==l[s+","+n];)n++;for(var t=be(a,n.toString()),r={element:e.element,rowspan:e.rowspan,colspan:e.colspan,row:s,column:n,isLocked:t},o=0;o<e.colspan;o++)for(var u=0;u<e.rowspan;u++){var i=n+o;l[s+u+","+i]=r,f=Math.max(f,i+1)}c.push(r)}),t++,n.push(ve(e.element,c,e.section)),s++});var u=F(o).map(function(e){var o,u,n=(o={},u=0,A(e.cells,function(t){var r=t.colspan;D(r,function(e){var n=u+e;o[n]={element:t.element,colspan:r,column:n}}),u+=r}),o);return{colgroups:[{element:e.element,columns:de(n)}],columns:n}}).getOrThunk(function(){return{colgroups:[],columns:{}}}),i=u.columns,c=u.colgroups;return{grid:{rows:t,columns:f},access:l,all:n,columns:i,colgroups:c}}function wt(e,n){var t=n.column,r=n.column+n.colspan-1,o=n.row,u=n.row+n.rowspan-1;return t<=e.finishCol&&r>=e.startCol&&o<=e.finishRow&&u>=e.startRow}function yt(e,n){return n.column>=e.startCol&&n.column+n.colspan-1<=e.finishCol&&n.row>=e.startRow&&n.row+n.rowspan-1<=e.finishRow}function Ct(e,n,t){var r=$t.findItem(e,n,ce),o=$t.findItem(e,t,ce);return r.bind(function(r){return o.map(function(e){return n=r,t=e,{startRow:Math.min(n.row,t.row),startCol:Math.min(n.column,t.column),finishRow:Math.max(n.row+n.rowspan-1,t.row+t.rowspan-1),finishCol:Math.max(n.column+n.colspan-1,t.column+t.colspan-1)};var n,t})})}function St(n,e,t){return Ct(n,e,t).map(function(e){return O($t.filterItems(n,P(wt,e)),function(e){return e.element})})}function Tt(e,n){return $t.findItem(e,n,function(e,n){return le(n,e)}).map(function(e){return e.element})}function xt(e,n,t,r,o){var u=Kt(e),i=ce(e,t)?q.some(n):Tt(u,n),c=ce(e,o)?q.some(r):Tt(u,r);return i.bind(function(n){return c.bind(function(e){return St(u,n,e)})})}function Rt(n,t){rn(n).each(function(e){e.dom.insertBefore(t.dom,n.dom)})}function Dt(e,n){cn(e).fold(function(){rn(e).each(function(e){Xt(e,n)})},function(e){Rt(e,n)})}function Ot(n,t){an(n,0).fold(function(){Xt(n,t)},function(e){n.dom.insertBefore(t.dom,e.dom)})}function At(e,n){Rt(e,n),Xt(n,e)}function kt(t,r){A(r,function(e,n){Dt(0===n?t:r[n-1],e)})}function It(n,e){A(e,function(e){Xt(n,e)})}function Bt(e){e.dom.textContent="",A(ln(e),function(e){Yt(e)})}function Mt(e){var n,t=ln(e);0<t.length&&(n=e,A(t,function(e){Rt(n,e)})),Yt(e)}function Et(e){return Jt.get(e)}function Pt(e){return Jt.getOption(e)}function Nt(e,n){return Jt.set(e,n)}function zt(e,n){return k(N(e.all,function(e){return e.cells}),n)}var Lt,_t,Wt=function(e,n){e.dom.removeAttribute(n)},jt=function(e,n){return Fn(e)?e.style.getPropertyValue(n):""},Ft=C(10),Ht=C(10),Vt=function(e,n,t){return N(ln(e),function(e){return oe(e,n)?t(e)?[e]:[]:Vt(e,n,t)})},qt=function(e){return rt(e).fold(C([]),function(e){return mn(e,"colgroup")})},Ut=function(e,n){return ye(e.element,n,e.section,e.isNew)},Gt="data-snooker-locked-cols",$t={fromTable:function(e){return vt(ct(e))},generate:vt,getAt:function(e,n,t){return q.from(e.access[n+","+t])},findItem:function(e,n,t){var r=zt(e,function(e){return t(n,e.element)});return 0<r.length?q.some(r[0]):q.none()},filterItems:zt,justCells:function(e){return N(e.all,function(e){return e.cells})},justColumns:function(e){return de(e.columns)},hasColumns:function(e){return 0<Ue(e.columns).length},getColumnAt:function(e,n){return q.from(e.columns[n])}},Kt=$t.fromTable,Xt=function(e,n){e.dom.appendChild(n.dom)},Yt=function(e){var n=e.dom;null!==n.parentNode&&n.parentNode.removeChild(n)},Jt=(Lt=pn,{get:function(e){if(!Lt(e))throw new Error("Can only get text value of a text node");return _t(e).getOr("")},getOption:_t=function(e){return Lt(e)?q.from(e.dom.nodeValue):q.none()},set:function(e,n){if(!Lt(e))throw new Error("Can only set raw text value of a text node");e.dom.nodeValue=n}}),Qt=["body","p","div","article","aside","figcaption","figure","footer","header","nav","section","ol","ul","li","table","thead","tbody","tfoot","caption","tr","td","th","h1","h2","h3","h4","h5","h6","blockquote","pre","address"];function Zt(){return{up:C({selector:On,closest:In,predicate:Dn,all:on}),down:C({selector:dn,predicate:xn}),styles:C({get:Un,getRaw:Gn,set:Vn,remove:$n}),attrs:C({get:Pn,set:Mn,remove:Wt,copyTo:function(e,n){En(n,zn(e))}}),insert:C({before:Rt,after:Dt,afterAll:kt,append:Xt,appendAll:It,prepend:Ot,wrap:At}),remove:C({unwrap:Mt,remove:Yt}),create:C({nu:Ve.fromTag,clone:function(e){return Ve.fromDom(e.dom.cloneNode(!1))},text:Ve.fromText}),query:C({comparePosition:function(e,n){return e.dom.compareDocumentPosition(n.dom)},prevSibling:un,nextSibling:cn}),property:C({children:ln,name:Ye,parent:rn,document:function(e){return tn(e).dom},isText:pn,isComment:Ze,isElement:gn,isSpecial:function(e){return y(["script","noscript","iframe","noframes","noembed","title","style","textarea","xmp"],Ye(e))},getLanguage:function(e){return gn(e)?Nn(e,"lang"):q.none()},getText:Et,setText:Nt,isBoundary:function(e){return!!gn(e)&&("body"===Ye(e)||y(Qt,Ye(e)))},isEmptyTag:function(e){return!!gn(e)&&y(["br","img","hr","input"],Ye(e))},isNonEditable:function(e){return gn(e)&&"false"===Pn(e,"contenteditable")}}),eq:ce,is:qe}}function er(t,e){return Hr(qr,function(e,n){return t(n)},e)}function nr(e){return On(e,"table")}function tr(c,l,a){function f(n){return function(e){return void 0!==a&&a(e)||ce(e,n)}}return ce(c,l)?q.some({boxes:q.some([c]),start:c,finish:l}):nr(c).bind(function(i){return nr(l).bind(function(u){if(ce(i,u))return q.some({boxes:(r=c,o=l,St(Kt(i),r,o)),start:c,finish:l});if(le(i,u)){var e=0<(n=sn(l,"td,th",f(i))).length?n[n.length-1]:l;return q.some({boxes:xt(i,c,i,l,u),start:c,finish:e})}if(le(u,i)){var n,t=0<(n=sn(c,"td,th",f(u))).length?n[n.length-1]:c;return q.some({boxes:xt(u,c,i,l,u),start:c,finish:t})}return Vr(qr,c,l,void 0).shared.bind(function(e){return In(e,"table",a).bind(function(e){var n=sn(l,"td,th",f(e)),t=0<n.length?n[n.length-1]:l,r=sn(c,"td,th",f(e)),o=0<r.length?r[r.length-1]:c;return q.some({boxes:xt(e,c,i,l,u),start:o,finish:t})})});var r,o})})}function rr(e,n){var t=dn(e,n);return 0<t.length?q.some(t):q.none()}function or(e,n,r){return kn(e,n).bind(function(t){return kn(e,r).bind(function(n){return er(nr,[t,n]).map(function(e){return{first:t,last:n,table:e}})})})}function ur(e,r,o,u,n){return t=n,w(e,function(e){return oe(e,t)}).bind(function(e){return t=r,i=o,rt(n=e).bind(function(e){var r=Kt(e),o=t,u=i;return $t.findItem(r,n,ce).bind(function(e){var n=0<o?e.row+e.rowspan-1:e.row,t=0<u?e.column+e.colspan-1:e.column;return $t.getAt(r,n+o,t+u).map(function(e){return e.element})})}).bind(function(e){return t=u,On(n=e,"table").bind(function(e){return kn(e,t).bind(function(e){return tr(e,n).bind(function(n){return n.boxes.map(function(e){return{boxes:e,start:n.start,finish:n.finish}})})})});var n,t});var n,t,i});var t}function ir(o,e,n){return or(o,e,n).bind(function(c){function e(e){return ce(o,e)}var n="thead,tfoot,tbody,table",t=On(c.first,n,e),r=On(c.last,n,e);return t.bind(function(i){return r.bind(function(e){return ce(i,e)?(t=c.table,r=c.first,o=c.last,u=Kt(t),Ct(n=u,r,o).bind(function(e){return function(e,n){for(var t=!0,r=P(yt,n),o=n.startRow;o<=n.finishRow;o++)for(var u=n.startCol;u<=n.finishCol;u++)t=t&&$t.getAt(e,o,u).exists(r);return t?q.some(n):q.none()}(n,e)})):q.none();var n,t,r,o,u})})})}function cr(e,n,t,r){return e.fold(n,t,r)}function lr(e,n){return Ve.fromDom(e.dom.cloneNode(n))}function ar(e){return lr(e,!1)}function fr(e){return lr(e,!0)}function sr(e,n){var t=Ve.fromTag(n);return En(t,zn(e)),t}function mr(r,o){function e(e){var n=o(e);if(n<=0||null===n){var t=Un(e,r);return parseFloat(t)||0}return n}function u(o,e){return B(e,function(e,n){var t=Un(o,n),r=void 0===t?0:parseInt(t,10);return isNaN(r)?e:e+r},0)}return{set:function(e,n){if(!f(n)&&!n.match(/^[0-9]+$/))throw new Error(r+".set accepts only positive integer values. Value was "+n);var t=e.dom;Fn(t)&&(t.style[r]=n+"px")},get:e,getOuter:e,aggregate:u,max:function(e,n,t){var r=u(e,t);return r<n?n-r:0}}}function dr(){var e=He().browser;return e.isIE()||e.isEdge()}function gr(e,n,t){return r=Un(e,n),o=t,u=parseFloat(r),(isNaN(u)?q.none():q.some(u)).getOr(o);var r,o,u}function pr(e){return Un(e,"box-sizing")}function br(e,n,t,r){return n-gr(e,"padding-"+t,0)-gr(e,"padding-"+r,0)-gr(e,"border-"+t+"-width",0)-gr(e,"border-"+r+"-width",0)}function hr(e,n){var t=e.dom,r=t.getBoundingClientRect().width||t.offsetWidth;return"border-box"===n?r:br(e,r,"left","right")}function vr(e){return Jr.get(e)}function wr(e){return Jr.getOuter(e)}function yr(t,r){void 0===r&&(r=x);var e=t.grid,n=D(e.columns,S),o=D(e.rows,S);return O(n,function(n){return eo(function(){return N(o,function(e){return $t.getAt(t,e,n).filter(function(e){return e.column===n}).toArray()})},function(e){return 1===e.colspan&&r(e.element)},function(){return $t.getAt(t,0,n)})})}function Cr(t){var e=t.grid,n=D(e.rows,S),r=D(e.columns,S);return O(n,function(n){return eo(function(){return N(r,function(e){return $t.getAt(t,n,e).filter(function(e){return e.row===n}).fold(C([]),function(e){return[e]})})},function(e){return 1===e.rowspan},function(){return $t.getAt(t,n,0)})})}function Sr(n,t){return function(e){return"rtl"===no(e)?t:n}}function Tr(e){return to.get(e)}function xr(e){return to.getOuter(e)}function Rr(e,n){return void 0!==e?e:void 0!==n?n:0}function Dr(e){var n=e.dom.ownerDocument,t=n.body,r=n.defaultView,o=n.documentElement;if(t===e.dom)return uo(t.offsetLeft,t.offsetTop);var u=Rr(null==r?void 0:r.pageYOffset,o.scrollTop),i=Rr(null==r?void 0:r.pageXOffset,o.scrollLeft),c=Rr(o.clientTop,t.clientTop),l=Rr(o.clientLeft,t.clientLeft);return io(e).translate(i-l,u-c)}function Or(e,n){return{row:e,y:n}}function Ar(e,n){return{col:e,x:n}}function kr(e){return Dr(e).left+wr(e)}function Ir(e){return Dr(e).left}function Br(e,n){return Ar(e,Ir(n))}function Mr(e,n){return Ar(e,kr(n))}function Er(e){return Dr(e).top}function Pr(e,n){return Or(e,Er(n))}function Nr(e,n){return Or(e,Er(n)+xr(n))}function zr(t,n,r){if(0===r.length)return[];var e=O(r.slice(1),function(e,n){return e.map(function(e){return t(n,e)})}),o=r[r.length-1].map(function(e){return n(r.length-1,e)});return e.concat([o])}function Lr(i){if(!a(i))throw new Error("cases must be an array");if(0===i.length)throw new Error("there must be at least one case");var c=[],t={};return A(i,function(e,r){var n=Ue(e);if(1!==n.length)throw new Error("one and only one name per case");var o=n[0],u=e[o];if(void 0!==t[o])throw new Error("duplicate key detected:"+o);if("cata"===o)throw new Error("cannot have a case named cata (sorry)");if(!a(u))throw new Error("case arguments must be an array");c.push(o),t[o]=function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];var n=t.length;if(n!==u.length)throw new Error("Wrong number of arguments to case "+o+". Expected "+u.length+" ("+u+"), got "+n);return{fold:function(){for(var e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];if(e.length!==i.length)throw new Error("Wrong number of arguments to fold. Expected "+i.length+", got "+e.length);return e[r].apply(null,t)},match:function(e){var n=Ue(e);if(c.length!==n.length)throw new Error("Wrong number of arguments to match. Expected: "+c.join(",")+"\nActual: "+n.join(","));if(!z(c,function(e){return y(n,e)}))throw new Error("Not all branches were specified when using match. Specified: "+n.join(", ")+"\nRequired: "+c.join(", "));return e[o].apply(null,t)},log:function(e){console.log(e,{constructors:c,constructor:o,params:t})}}}}),t}var _r,Wr,jr,Fr=function(n,e,t){return e.bind(function(e){return t.filter(P(n.eq,e))})},Hr=function(e,n,t){return 0<t.length?(r=e,o=n,u=t[0],I(t.slice(1),function(e,n){var t=o(r,n);return Fr(r,e,t)},o(r,u))):q.none();var r,o,u},Vr=function(n,e,t,r){function o(n){return b(n,r).fold(function(){return n},function(e){return n.slice(0,e+1)})}void 0===r&&(r=v);var u=[e].concat(n.up().all(e)),i=[t].concat(n.up().all(t)),c=o(u),l=o(i),a=w(c,function(e){return R(l,P(n.eq,e))});return{firstpath:c,secondpath:l,shared:a}},qr=Zt(),Ur=rr,Gr=Lr([{none:[]},{multiple:["elements"]},{single:["element"]}]),$r=Gr.none,Kr=Gr.multiple,Xr=Gr.single,Yr=tinymce.util.Tools.resolve("tinymce.PluginManager"),Jr=mr("width",function(e){return e.dom.offsetWidth}),Qr=function(e){return hr(e,"content-box")},Zr=function(e){return dr()?hr(e,pr(e)):gr(e,"width",e.dom.offsetWidth)},eo=function(e,n,t){var r=e();return w(r,n).orThunk(function(){return q.from(r[0]).orThunk(t)}).map(function(e){return e.element})},no=function(e){return"rtl"===Un(e,"direction")?"rtl":"ltr"},to=mr("height",function(e){var n=e.dom;return Sn(e)?n.getBoundingClientRect().height:n.offsetHeight}),ro=function(e){return dr()?(t=pr(n=e),o=(r=n.dom).getBoundingClientRect().height||r.offsetHeight,"border-box"===t?o:br(n,o,"top","bottom")):gr(e,"height",e.dom.offsetHeight);var n,t,r,o},oo=function(t,r){return{left:t,top:r,translate:function(e,n){return oo(t+e,r+n)}}},uo=oo,io=function(e){var n,t=e.dom,r=t.ownerDocument.body;return r===t?uo(r.offsetLeft,r.offsetTop):Sn(e)?(n=t.getBoundingClientRect(),uo(n.left,n.top)):uo(0,0)},co={delta:S,positions:function(e){return zr(Pr,Nr,e)},edge:Er},lo=Sr({delta:S,edge:Ir,positions:function(e){return zr(Br,Mr,e)}},{delta:function(e){return-e},edge:kr,positions:function(e){return zr(Mr,Br,e)}}),ao={delta:function(e,n){return lo(n).delta(e,n)},positions:function(e,n){return lo(n).positions(e,n)},edge:function(e){return lo(e).edge(e)}},fo={unsupportedLength:["em","ex","cap","ch","ic","rem","lh","rlh","vw","vh","vi","vb","vmin","vmax","cm","mm","Q","in","pc","pt","px"],fixed:["px","pt"],relative:["%"],empty:[""]},so=(jr=["Infinity",(_r="[0-9]+")+"\\."+mo(_r)+mo(Wr="[eE][+-]?[0-9]+"),"\\."+_r+mo(Wr),_r+mo(Wr)].join("|"),new RegExp("^([+-]?(?:"+jr+"))(.*)$"));function mo(e){return"(?:"+e+")?"}function go(e,n,t){var r=q.from(e.dom.parentElement).map(Ve.fromDom).getOrThunk(function(){return Tn(nn(e))});return n(e)/t(r)*100}function po(e,n){Vn(e,"width",n+"px")}function bo(e,n){Vn(e,"width",n+"%")}function ho(e,n){Vn(e,"height",n+"px")}function vo(e){var n,t,r,o,u,i,c,l,a,f,s=ro(e)+"px";return s?(n=s,t=e,r=Tr,o=ho,f=parseFloat(n),ee(n,"%")&&"table"!==Ye(t)?(i=f,c=r,l=o,a=rt(u=t).map(function(e){var n=c(e);return Math.floor(i/100*n)}).getOr(i),l(u,a),a):f):Tr(e)}function wo(e,n){return Gn(e,n).orThunk(function(){return Nn(e,n).map(function(e){return e+"px"})})}function yo(e){return wo(e,"width")}function Co(e){return go(e,vr,Qr)}function So(e){return(jl(e)?vr:Zr)(e)}function To(e){return vo(n=e)/Xn(n,"rowspan");var n}function xo(e,n,t){Vn(e,"width",n+t)}function Ro(e){return go(e,vr,Qr)+"%"}function Do(e){return yo(e).getOrThunk(function(){return So(e)+"px"})}function Oo(e){return wo(e,"height").getOrThunk(function(){return To(e)+"px"})}function Ao(e,n,t,r,o,u){return e.filter(r).fold(function(){return u(function(t,r){if(r<0||r>=t.length-1)return q.none();var e=t[r].fold(function(){var e,n;return H((e=t.slice(0,r),(n=U.call(e,0)).reverse(),n),function(e,n){return e.map(function(e){return{value:e,delta:n+1}})})},function(e){return q.some({value:e,delta:0})}),n=t[r+1].fold(function(){return H(t.slice(r+1),function(e,n){return e.map(function(e){return{value:e,delta:n+1}})})},function(e){return q.some({value:e,delta:1})});return e.bind(function(t){return n.map(function(e){var n=e.delta+t.delta;return Math.abs(e.value-t.value)/n})})}(t,n))},function(e){return o(e)})}function ko(e,n,i,c){var l=yr(e),t=$t.hasColumns(e)?O($t.justColumns(e),function(e){return q.from(e.element)}):l,a=[q.some(ao.edge(n))].concat(O(ao.positions(l,n),function(e){return e.map(function(e){return e.x})})),f=p(Yn);return O(t,function(e,u){return Ao(e,u,a,f,function(e){return t=e,o=(r=He().browser).isChrome()||r.isFirefox(),!Hl(t)||o?i(e):Ao(null!=(n=l[u])?S(n):q.none(),u,a,f,function(e){return c(q.some(vr(e)))},c);var n,t,r,o},c)})}function Io(e){return e.map(function(e){return e+"px"}).getOr("")}function Bo(e,n,t){return ko(e,n,So,function(e){return e.getOrThunk(t.minCellWidth)})}function Mo(e,n,t,r,o){var u=Cr(e),i=[q.some(t.edge(n))].concat(O(t.positions(u,n),function(e){return e.map(function(e){return e.y})}));return O(u,function(e,n){return Ao(e,n,i,p(Jn),r,o)})}function Eo(e,n){return function(){return Sn(e)?n(e):parseFloat(Gn(e,"width").getOr("0"))}}function Po(r){var t=Eo(r,function(e){return parseFloat(Ro(e))}),n=Eo(r,vr);return{width:t,pixelWidth:n,getWidths:function(e,n){return t=n,ko(e,r,Co,function(e){return e.fold(function(){return t.minCellWidth()},function(e){return e/t.pixelWidth()*100})});var t},getCellDelta:function(e){return e/n()*100},singleColumnWidth:function(e,n){return[100-e]},minCellWidth:function(){return Ft()/n()*100},setElementWidth:bo,adjustTableWidth:function(e){var n=t();bo(r,n+e/100*n)},isRelative:!0,label:"percent"}}function No(t){var r=Eo(t,vr);return{width:r,pixelWidth:r,getWidths:function(e,n){return Bo(e,t,n)},getCellDelta:S,singleColumnWidth:function(e,n){return[Math.max(Ft(),e+n)-e]},minCellWidth:Ft,setElementWidth:po,adjustTableWidth:function(e){var n=r()+e;po(t,n)},isRelative:!1,label:"pixel"}}function zo(e,n){function t(e){return oe(e.element,n)}var u,r,i,c,l,a,f,s,o,m,d,g,p=fr(e),b=ct(p),h=Vl(e),v=$t.generate(b),w=(u=t,r=v.grid.columns,i=v.grid.rows,c=r,a=l=0,f=[],s=[],ae(v.access,function(e){var n,t,r,o;f.push(e),u(e)&&(s.push(e),t=(n=e.row)+e.rowspan-1,o=(r=e.column)+e.colspan-1,n<i?i=n:l<t&&(l=t),r<c?c=r:a<o&&(a=o))}),{minRow:i,minCol:c,maxRow:l,maxCol:a,allCells:f,selectedCells:s}),y="th:not("+n+"),td:not("+n+")";return A(Vt(p,"th,td",function(e){return oe(e,y)}),Yt),function(e,n,t,r){for(var o,u,i,c=n.grid.columns,l=n.grid.rows,a=0;a<l;a++)for(var f=!1,s=0;s<c;s++)a<t.minRow||a>t.maxRow||s<t.minCol||s>t.maxCol||($t.getAt(n,a,s).filter(r).isNone()?(o=f,0,u=e[a].element,i=Ve.fromTag("td"),Xt(i,Ve.fromTag("br")),(o?Xt:Ot)(u,i)):f=!0)}(b,v,w,t),o=p,m=w,d=v,g=function(e,n,t,r){if(0===r.minCol&&n.grid.columns===r.maxCol+1)return 0;var o=Bo(n,e,t),u=B(o,function(e,n){return e+n},0),i=B(o.slice(r.minCol,r.maxCol+1),function(e,n){return e+n},0)/u*t.pixelWidth()-t.pixelWidth();return t.getCellDelta(i)}(e,$t.fromTable(e),h,w),ae(d.columns,function(e){(e.column<m.minCol||e.column>m.maxCol)&&Yt(e.element)}),A(k(Zn(o,"tr"),function(e){return 0===e.dom.childElementCount}),Yt),m.minCol!==m.maxCol&&m.minRow!==m.maxRow||A(Zn(o,"th,td"),function(e){Wt(e,"rowspan"),Wt(e,"colspan")}),Wt(o,Gt),Wt(o,"data-snooker-col-series"),Vl(o).adjustTableWidth(g),p}function Lo(e){return"img"===Ye(e)?1:Pt(e).fold(function(){return ln(e).length},function(e){return e.length})}function _o(e){return Pt(e).filter(function(e){return 0!==e.trim().length||-1<e.indexOf("\xa0")}).isSome()||y(Gl,Ye(e))}function Wo(e){return o=_o,(u=function(e){for(var n=0;n<e.childNodes.length;n++){var t=Ve.fromDom(e.childNodes[n]);if(o(t))return q.some(t);var r=u(e.childNodes[n]);if(r.isSome())return r}return q.none()})(e.dom);var o,u}function jo(e){return $l(e,_o)}function Fo(n){return function(){var e=Ve.fromTag("td",n.dom);return Xt(e,Ve.fromTag("br",n.dom)),e}}function Ho(e){return function(){return Ve.fromTag("col",e.dom)}}function Vo(e){return function(){return Ve.fromTag("colgroup",e.dom)}}function qo(e){return function(){return Ve.fromTag("tr",e.dom)}}function Uo(e,n,t){var r,o,u=(It(o=sr(r=e,n),ln(fr(r))),o);return ae(t,function(e,n){null===e?Wt(u,n):Mn(u,n,e)}),u}function Go(e){return e}function $o(a,f,s){function m(e,n){var t=e.element.dom,r=n.dom;Fn(t)&&Fn(r)&&(r.style.cssText=t.style.cssText),$n(n,"height"),1!==e.colspan&&$n(n,"width")}return{col:function(e){var n=Ve.fromTag(Ye(e.element),f.dom);return m(e,n),a(e.element,n),n},colgroup:Vo(f),row:qo(f),cell:function(e){var n,t,r,o,u,i=Ve.fromTag(Ye(e.element),f.dom),c=s.getOr(["strong","em","b","i","span","font","h1","h2","h3","h4","h5","h6","p","div"]),l=0<c.length?(n=e.element,t=i,r=c,Wo(n).map(function(e){return I(sn(e,r.join(","),function(e){return ce(e,n)}),function(e,n){var t=ar(n);return Wt(t,"contenteditable"),Xt(e,t),t},t)}).getOr(t)):i;return Xt(l,Ve.fromTag("br")),m(e,i),o=e.element,u=i,ae(Kl,function(n,t){return Nn(o,t).filter(function(e){return y(n,e)}).each(function(e){return Mn(u,t,e)})}),a(e.element,i),i},replace:Uo,colGap:Ho(f),gap:Fo(f)}}function Ko(e){return{col:Ho(e),colgroup:Vo(e),row:qo(e),cell:Fo(e),replace:Go,colGap:Ho(e),gap:Fo(e)}}function Xo(e){return O(e,Ve.fromDom)}function Yo(e){return Ve.fromDom(e.getBody())}function Jo(e){return e.getBoundingClientRect().width}function Qo(e){return e.getBoundingClientRect().height}function Zo(n){return function(e){return ce(e,Yo(n))}}function eu(e){return/^\d+(\.\d+)?$/.test(e)?e+"px":e}function nu(e){function n(e){return Wt(e,"data-mce-style")}Wt(e,"data-mce-style"),A(nt(e),n),A(tt(e),n)}function tu(e){return Ve.fromDom(e.selection.getStart())}function ru(e){return cr(e.get(),C([]),S,_)}function ou(e,n,t){return{element:t,mergable:(u=n,i=Xl,cr(e.get(),q.none,function(n){return n.length<=1?q.none():ir(u,i.firstSelectedSelector,i.lastSelectedSelector).map(function(e){return{bounds:e,cells:n}})},q.none)),unmergable:0<(o=ru(e)).length&&z(o,function(e){return r(e,"rowspan")||r(e,"colspan")})?q.some(o):q.none(),selection:ru(e)};function r(e,n){return Nn(e,n).exists(function(e){return 1<parseInt(e,10)})}var o,u,i}function uu(o){return function(e,n){var t,r=Ye(e);return In("col"===r||"colgroup"===r?rt(t=e).bind(function(e){return Ur(e,Xl.firstSelectedSelector)}).fold(C(t),function(e){return e[0]}):e,o,n)}}function iu(a,e,f){a.on("BeforeGetContent",function(t){!0===t.selection&&cr(e.get(),E,function(e){t.preventDefault(),rt(e[0]).map(function(e){var n=zo(e,"[data-mce-selected]");return nu(n),[n]}).each(function(e){var n;t.content="text"===t.format?O(e,function(e){return e.dom.innerText}).join(""):(n=a,O(e,function(e){return n.selection.serializer.serialize(e.dom,{})}).join(""))})},E)}),a.on("BeforeSetContent",function(l){!0===l.selection&&!0===l.paste&&j(Ql(e)).each(function(c){rt(c).each(function(e){var n,t,r,o,u=k((n=l.content,(t=document.createElement("div")).innerHTML=n,ln(Ve.fromDom(t))),function(e){return"meta"!==Ye(e)}),i=en("table");1===u.length&&i(u[0])&&(l.preventDefault(),r=Ko(Ve.fromDom(a.getDoc())),o={element:c,clipboard:u[0],generators:r},f.pasteCells(e,o).each(function(){a.focus()}))})})})}function cu(e,n,t){for(var r=0,o=e;o<n;o++)r+=void 0!==t[o]?t[o]:0;return r}function lu(e,n,t){var r,o,u,i;A((r=e,o=n,$t.hasColumns(r)?(i=o,O($t.justColumns(r),function(e,n){return{element:e.element,width:i[n],colspan:e.colspan}})):(u=o,O($t.justCells(r),function(e){var n=cu(e.column,e.column+e.colspan,u);return{element:e.element,width:n,colspan:e.colspan}}))),function(e){t.setElementWidth(e.element,e.width)})}function au(e,n,t,r,o){var u,i,c,l,a,f,s,m,d,g,p=$t.fromTable(e),b=o.getCellDelta(n),h=o.getWidths(p,o),v=t===p.grid.columns-1,w=r.clampTableDelta(h,t,b,o.minCellWidth(),v),y=(i=t,c=w,l=o,a=r,m=(u=h).slice(0),s=i,d=0===(f=u).length?ea.none():1===f.length?ea.only(0):0===s?ea.left(0,1):s===f.length-1?ea.right(s-1,s):0<s&&s<f.length-1?ea.middle(s-1,s,s+1):ea.none(),g=C(O(m,C(0))),d.fold(g,function(e){return l.singleColumnWidth(m[e],c)},function(e,n){return a.calcLeftEdgeDeltas(m,e,n,c,l.minCellWidth(),l.isRelative)},function(e,n,t){return a.calcMiddleDeltas(m,e,n,t,c,l.minCellWidth(),l.isRelative)},function(e,n){return a.calcRightEdgeDeltas(m,e,n,c,l.minCellWidth(),l.isRelative)}));lu(p,O(y,function(e,n){return e+h[n]}),o),r.resizeTable(o.adjustTableWidth,w,v)}function fu(e){return O(e,C(0))}function su(e,n,t,r,o){return o(e.slice(0,n)).concat(r).concat(o(e.slice(t)))}function mu(i){return function(e,n,t,r){if(i(t)){var o=Math.max(r,e[n]-Math.abs(t)),u=Math.abs(o-e[n]);return 0<=t?u:-u}return t}}function du(){function f(e,t,n,r){var o=(100+n)/100,u=Math.max(r,(e[t]+n)/o);return O(e,function(e,n){return(n===t?u:e/o)-e})}function c(e,n,t,r,o,u){return u?f(e,n,r,o):(l=t,a=na(i=e,c=n,r,o),su(i,c,l+1,[a,0],fu));var i,c,l,a}return{resizeTable:function(e,n){return e(n)},clampTableDelta:na,calcLeftEdgeDeltas:c,calcMiddleDeltas:function(e,n,t,r,o,u,i){return c(e,t,r,o,u,i)},calcRightEdgeDeltas:function(e,n,t,r,o,u){if(u)return f(e,t,r,o);var i=na(e,t,r,o);return fu(e.slice(0,t)).concat([i])},calcRedestributedWidths:function(e,n,t,r){if(r){var o=(n+t)/n,u=O(e,function(e){return e/o});return{delta:100*o-100,newSizes:u}}return{delta:t,newSizes:e}}}}function gu(){function i(e,n,t,r,o){var u=ta(e,0<=r?t:n,r,o);return su(e,n,t+1,[u,-u],fu)}return{resizeTable:function(e,n,t){t&&e(n)},clampTableDelta:function(e,n,t,r,o){if(o){if(0<=t)return t;var u=B(e,function(e,n){return e+n-r},0);return Math.max(-u,t)}return na(e,n,t,r)},calcLeftEdgeDeltas:i,calcMiddleDeltas:function(e,n,t,r,o,u){return i(e,t,r,o,u)},calcRightEdgeDeltas:function(e,n,t,r,o,u){return u?fu(e):O(e,C(r/e.length))},calcRedestributedWidths:function(e,n,t,r){return{delta:0,newSizes:e}}}}function pu(e,n,t){var r=t.substring(0,t.length-e.length),o=parseFloat(r);return r===o.toString()?n(o):ra.invalid(t)}function bu(e,n,t){var r,o,u,i,c=oa.from(t),l=z(e,function(e){return"0px"===e})?(r=e.length,o=c.fold(function(){return C("")},function(e){return C(e/r+"px")},function(){return C(100/r+"%")}),D(r,o)):(u=e,i=n,c.fold(function(){return u},function(e){return t=(n=e)/i,O(u,function(e){return oa.from(e).fold(function(){return e},function(e){return e*t+"px"},function(e){return e/100*n+"px"})});var n,t},function(e){return n=i,O(u,function(e){return oa.from(e).fold(function(){return e},function(e){return e/n*100+"%"},function(e){return e+"%"})});var n}));return ua(l)}function hu(e,n){return 0===e.length?n:I(e,function(e,n){return oa.from(n).fold(C(0),S,S)+e},0)}function vu(e){return ia(e).fold(C("px"),C("px"),C("%"))}function wu(l,e,n){var a=$t.fromTable(l),i=a.all,f=$t.justCells(a),s=$t.justColumns(a);e.each(function(e){var t,r,o,u,n=vu(e),i=vr(l),c=bu(ko(a,l,Do,Io),i,e);$t.hasColumns(a)?(o=c,u=n,A(s,function(e,n){var t=hu([o[n]],Ft());Vn(e.element,"width",t+u)})):(t=c,r=n,A(f,function(e){var n=hu(t.slice(e.column,e.colspan+e.column),Ft());Vn(e.element,"width",n+r)})),Vn(l,"width",e)}),n.each(function(e){var n=vu(e),t=Tr(l),r=bu(Mo(a,l,co,Oo,Io),t,e),o=i,u=n;A(f,function(e){var n=hu(r.slice(e.row,e.rowspan+e.row),Ht());Vn(e.element,"height",n+u)}),A(o,function(e,n){Vn(e.element,"height",r[n])}),Vn(l,"height",e)})}function yu(e){return $t.fromTable(e).grid}function Cu(n){var o=[];return{bind:function(e){if(void 0===e)throw new Error("Event bind error: undefined handler");o.push(e)},unbind:function(n){o=k(o,function(e){return e!==n})},trigger:function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];var r={};A(n,function(e,n){r[e]=t[n]}),A(o,function(e){e(r)})}}}function Su(e){return{registry:fe(e,function(e){return{bind:e.bind,unbind:e.unbind}}),trigger:fe(e,function(e){return e.trigger})}}function Tu(e){return e.slice(0).sort()}function xu(n,e){var t=k(e,function(e){return!y(n,e)});0<t.length&&function(){throw new Error("Unsupported keys for object: "+Tu(t).join(", "))}()}function Ru(e){return function(r,o,u){if(0===o.length)throw new Error("You must specify at least one required field.");var t;return function(n,e){if(!a(e))throw new Error("The "+n+" fields must be an array. Was: "+e+".");A(e,function(e){if(!T(e))throw new Error("The value "+e+" in the "+n+" fields was not a string.")})}("required",o),w(t=Tu(o),function(e,n){return n<t.length-1&&e===t[n+1]}).each(function(e){throw new Error("The field: "+e+" occurs more than once in the combined fields: ["+t.join(", ")+"].")}),function(n){var t=Ue(n);z(o,function(e){return y(t,e)})||function(e,n){throw new Error("All required keys ("+Tu(e).join(", ")+") were not specified. Specified keys were: "+Tu(n).join(", ")+".")}(o,t),r(o,t);var e=k(o,function(e){return!u.validate(n[e],e)});return 0<e.length&&function(e,n){throw new Error("All values need to be of type: "+n+". Keys ("+Tu(e).join(", ")+") were not.")}(e,u.label),n}}(xu,e,{validate:c,label:"function"})}function Du(){var u,i,e={onEvent:E,reset:E,events:Su({move:Cu(["info"])}).registry},n=(u=q.none(),{onEvent:function(e,o){o.extract(e).each(function(e){var n=o,t=e,r=u.map(function(e){return n.compare(e,t)});u=q.some(t),r.each(function(e){i.trigger.move(e)})})},reset:function(){u=q.none()},events:(i=Su({move:Cu(["info"])})).registry}),t=e;return{on:function(){t.reset(),t=n},off:function(){t.reset(),t=e},isOn:function(){return t===n},onEvent:function(e,n){t.onEvent(e,n)},events:n.events}}function Ou(e){function n(){return e.stopPropagation()}function t(){return e.preventDefault()}var r,o,u=Ve.fromDom(function(e){if(wn()&&l(e.target)){var n=Ve.fromDom(e.target);if(gn(n)&&Cn(n)&&e.composed&&e.composedPath){var t=e.composedPath();if(t)return j(t)}}return q.from(e.target)}(e).getOr(e.target)),i=(r=t,o=n,function(){for(var e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];return r(o.apply(null,e))});return{target:u,x:e.clientX,y:e.clientY,stop:n,prevent:t,kill:i,raw:e}}function Au(e,n,t){return o=n,u=!1,i=sa,c=t,l=function(e){i(e)&&c(Ou(e))},(r=e).dom.addEventListener(o,l,u),{unbind:P(fa,r,o,l,u)};var r,o,u,i,c,l}function ku(e){return void 0!==e.dom.classList}function Iu(e,n){return o=n,Mn(e,t="class",(void 0===(r=Pn(e,t))||""===r?[]:r.split(" ")).concat([o]).join(" ")),1;var t,r,o}function Bu(e,n){ku(e)?e.dom.classList.add(n):Iu(e,n)}function Mu(e,n){return ku(e)&&e.dom.classList.contains(n)}function Eu(e){var n=e.replace(/\./g,"-");return{resolve:function(e){return n+"-"+e}}}function Pu(e){return In(e,"[contenteditable]")}function Nu(e,n){return void 0===n&&(n=!1),!He().browser.isIE()&&Sn(e)?e.dom.isContentEditable:Pu(e).fold(C(n),function(e){return"true"===pa(e)})}function zu(e){A(dn(e.parent(),"."+ha),Yt)}function Lu(t,e,r){var o=t.origin();A(e,function(e){e.each(function(e){var n=r(o,e);Bu(n,ha),Xt(t.parent(),n)})})}function _u(e,n,t,r,o){var u,i,c,l,a,f=Dr(t),s=n.isResizable,m=0<r.length?co.positions(r,t):[],d=0<m.length?(u=s,N(e.all,function(e,n){return u(e.element)?[n]:[]})):[],g=k(m,function(e,n){return R(d,function(e){return n===e})});i=n,c=g,l=f,a=wr(t),Lu(i,c,function(e,n){var t,r,o,u,i,c=(t=n.row,r=l.left-e.left,o=n.y-e.top,u=a,qn(i=Ve.fromTag("div"),{position:"absolute",left:r+"px",top:o-3.5+"px",height:"7px",width:u+"px"}),En(i,{"data-row":t,role:"presentation"}),i);return Bu(c,va),c});var p,b,h,v,w,y,C,S=0<o.length?ao.positions(o,t):[],T=0<S.length?(b=s,h=[],D((p=e).grid.columns,function(e){$t.getColumnAt(p,e).map(function(e){return e.element}).forall(b)&&h.push(e)}),k(h,function(n){return z($t.filterItems(p,function(e){return e.column===n}),function(e){return b(e.element)})})):[],x=k(S,function(e,n){return R(T,function(e){return n===e})});v=n,w=x,y=f,C=xr(t),Lu(v,w,function(e,n){var t,r,o,u,i,c=(t=n.col,r=n.x-e.left,o=y.top-e.top,u=C,qn(i=Ve.fromTag("div"),{position:"absolute",left:r-3.5+"px",top:o+"px",height:u+"px",width:"7px"}),En(i,{"data-column":t,role:"presentation"}),i);return Bu(c,wa),c})}function Wu(e,n){var t;zu(e),e.isResizable(n)&&_u(t=$t.fromTable(n),e,n,Cr(t),yr(t))}function ju(e,n){A(dn(e.parent(),"."+ha),n)}function Fu(e){ju(e,function(e){Vn(e,"display","none")})}function Hu(e){ju(e,function(e){Vn(e,"display","block")})}function Vu(o){function e(e,n){return q.from(Pn(e,n))}var n,t,r,u,i,c,l=(u=Su({drag:Cu(["xDelta","yDelta","target"])}),i=q.none(),(c={mutate:function(e,n){r.trigger.drag(e,n)},events:(r=Su({drag:Cu(["xDelta","yDelta"])})).registry}).events.drag.bind(function(n){i.each(function(e){u.trigger.drag(n.xDelta,n.yDelta,e)})}),{assign:function(e){i=q.some(e)},get:function(){return i},mutate:c.mutate,events:u.registry}),a=(t=void 0!==(n={}).mode?n.mode:ga,function(n,t,e){function r(){m.stop(),l.isOn()&&(l.off(),c.trigger.stop())}var o,u,i=!1,c=Su({start:Cu([]),stop:Cu([])}),l=Du(),a=(o=r,u=null,{cancel:f,throttle:function(){for(var e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];f(),u=setTimeout(function(){u=null,o.apply(null,e)},200)}});function f(){h(u)||(clearTimeout(u),u=null)}function s(t){return function(){for(var e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];i&&t.apply(null,e)}}l.events.move.bind(function(e){t.mutate(n,e.info)});var m=t.sink(aa({forceDrop:r,drop:s(r),move:s(function(e){a.cancel(),l.onEvent(e,t)}),delayDrop:s(a.throttle)}),e);return{element:m.element,go:function(e){m.start(e),l.on(),c.trigger.start()},on:function(){i=!0},off:function(){i=!1},destroy:function(){m.destroy()},events:c.registry}}(l,t,n)),f=q.none();function s(e,n){return Qn(e,n)-Kn(e,"data-initial-"+n,0)}function m(e,n){b.trigger.startAdjust(),l.assign(e),Mn(e,"data-initial-"+n,Qn(e,n)),Bu(e,ya),Vn(e,"opacity","0.2"),a.go(o.parent())}function d(e){return ce(e,o.view())}l.events.drag.bind(function(t){e(t.target,"data-row").each(function(e){var n=Qn(t.target,"top");Vn(t.target,"top",n+t.yDelta+"px")}),e(t.target,"data-column").each(function(e){var n=Qn(t.target,"left");Vn(t.target,"left",n+t.xDelta+"px")})}),a.events.stop.bind(function(){l.get().each(function(r){f.each(function(t){e(r,"data-row").each(function(e){var n=s(r,"top");Wt(r,"data-initial-top"),b.trigger.adjustHeight(t,n,parseInt(e,10))}),e(r,"data-column").each(function(e){var n=s(r,"left");Wt(r,"data-initial-left"),b.trigger.adjustWidth(t,n,parseInt(e,10))}),Wu(o,t)})})});var g=Au(o.parent(),"mousedown",function(e){Mu(e.target,va)&&m(e.target,"top"),Mu(e.target,wa)&&m(e.target,"left")}),p=Au(o.view(),"mouseover",function(e){In(e.target,"table",d).filter(Nu).fold(function(){Sn(e.target)&&zu(o)},function(e){f=q.some(e),Wu(o,e)})}),b=Su({adjustHeight:Cu(["table","delta","row"]),adjustWidth:Cu(["table","delta","column"]),startAdjust:Cu([])});return{destroy:function(){g.unbind(),p.unbind(),a.destroy(),zu(o)},refresh:function(e){Wu(o,e)},on:a.on,off:a.off,hideBars:P(Fu,o),showBars:P(Hu,o),events:b.registry}}function qu(e,n){return e.fire("newrow",{node:n})}function Uu(e,n){return e.fire("newcell",{node:n})}function Gu(e,n,t){e.fire("TableModified",K(K({},t),{table:n}))}function $u(e){return e.getParam("table_sizing_mode","auto")}function Ku(e){return e.getParam("table_responsive_width")}function Xu(e){return e.getParam("table_border_widths",Ra,"array")}function Yu(e){return e.getParam("table_border_styles",Da,"array")}function Ju(e){return e.getParam("table_default_attributes",Oa,"object")}function Qu(e){return e.getParam("table_default_styles",function(e){var n;if(ka(e)){var t=e.dom,r=null!==(n=t.getParent(e.selection.getStart(),t.isBlock))&&void 0!==n?n:e.getBody(),o=Qr(Ve.fromDom(r));return K(K({},xa),{width:o+"px"})}return Ia(e)?se(xa,function(e,n){return"width"!==n}):xa}(e),"object")}function Zu(e){return e.getParam("table_cell_advtab",!0,"boolean")}function ei(e){return e.getParam("table_row_advtab",!0,"boolean")}function ni(e){return e.getParam("table_advtab",!0,"boolean")}function ti(e){return e.getParam("table_style_by_css",!1,"boolean")}function ri(e){return e.getParam("table_cell_class_list",[],"array")}function oi(e){return e.getParam("table_class_list",[],"array")}function ui(e){return"relative"===$u(e)||!0===Ku(e)}function ii(e){var n="section",t=e.getParam("table_header_type",n,"string");return y(["section","cells","sectionCells","auto"],t)?t:n}function ci(e){var n=e.getParam("table_column_resizing",Aa,"string");return w(["preservetable","resizetable"],function(e){return e===n}).getOr(Aa)}function li(e){return"preservetable"===ci(e)}function ai(e){return"resizetable"===ci(e)}function fi(e){var n=e.getParam("table_clone_elements");return T(n)?q.some(n.split(/[ ,]/)):Array.isArray(n)?q.some(n):q.none()}function si(e){return e.getParam("table_background_color_map",[],"array")}function mi(e){return e.getParam("table_border_color_map",[],"array")}function di(e,n){return(ui(e)?Ul:ka(e)?ql:Vl)(n)}function gi(e){Wt(e,"width")}function pi(e){return"false"!==Pn(e,"data-mce-resize")}function bi(p){function m(e){return"TABLE"===e.nodeName}function b(e){return di(p,e)}function h(){return(li(p)?gu:du)()}var d,g,v=q.none(),w=q.none(),y=q.none();return p.on("init",function(){var e,n,t,r,o,u,i,c,l,a,m,f,s,d,g=(n=pi,(e=p).inline?(u=Yo(e),qn(c=Ve.fromTag("div"),{position:"static",height:"0",width:"0",padding:"0",margin:"0",border:"0"}),Xt(Tn(Ve.fromDom(document)),c),c,i=n,{parent:C(c),view:C(u),origin:C(uo(0,0)),isResizable:i}):Il(Ve.fromDom(e.getDoc()),n));y=q.some(g),o=p.getParam("object_resizing",!0),(T(o)?"table"===o:o)&&p.getParam("table_resize_bars",!0,"boolean")&&(t=h(),l=t,a=b,m=co,f=ao,s=Vu(g),d=Su({beforeResize:Cu(["table","type"]),afterResize:Cu(["table","type"]),startDrag:Cu([])}),s.events.adjustHeight.bind(function(e){var n=e.table;d.trigger.beforeResize(n,"row");var t,r,o,u,i,c,l,a,f,s=m.delta(e.delta,n);t=n,r=s,o=e.row,u=m,l=$t.fromTable(t),a=O(Mo(l,t,u,To,function(e){return e.getOrThunk(Ht)}),function(e,n){return o===n?Math.max(r+e,Ht()):e}),i=a,f=O($t.justCells(l),function(e){var n=cu(e.row,e.row+e.rowspan,i);return{element:e.element,height:n,rowspan:e.rowspan}}),A((c=a,O(l.all,function(e,n){return{element:e.element,height:c[n]}})),function(e){ho(e.element,e.height)}),A(f,function(e){ho(e.element,e.height)}),ho(t,I(a,function(e,n){return e+n},0)),d.trigger.afterResize(n,"row")}),s.events.startAdjust.bind(function(e){d.trigger.startDrag()}),s.events.adjustWidth.bind(function(e){var n=e.table;d.trigger.beforeResize(n,"col");var t=f.delta(e.delta,n),r=a(n);au(n,t,e.column,l,r),d.trigger.afterResize(n,"col")}),(r={on:s.on,off:s.off,hideBars:s.hideBars,showBars:s.showBars,destroy:s.destroy,events:d.registry}).on(),r.events.startDrag.bind(function(e){v=q.some(p.selection.getRng())}),r.events.beforeResize.bind(function(e){var n,t=e.table.dom,r=p,o=Jo(n=t),u=Qo(t),i=Pa+e.type;r.fire("ObjectResizeStart",{target:n,width:o,height:u,origin:i})}),r.events.afterResize.bind(function(e){var n,t,r,o,u,i=e.table,c=i.dom;nu(i),v.each(function(e){p.selection.setRng(e),p.focus()}),n=p,r=Jo(t=c),o=Qo(c),u=Pa+e.type,n.fire("ObjectResized",{target:t,width:r,height:o,origin:u}),p.undoManager.add()}),w=q.some(r))}),p.on("ObjectResizeStart",function(e){var n,t,r,o,u=e.target;m(u)&&(n=Ve.fromDom(u),A(p.dom.select(".mce-clonedresizable"),function(e){p.dom.addClass(e,"mce-"+ci(p)+"-columns")}),!Ml(n)&&ka(p)?Ma(n):!Bl(n)&&ui(p)&&Ba(n),El(n)&&Ae(e.origin,Pa)&&Ba(n),d=e.width,g=Ia(p)?"":(o=(t=p).dom.getStyle(r=u,"width")||t.dom.getAttrib(r,"width"),q.from(o).filter(ne).getOr("")))}),p.on("ObjectResized",function(e){var n,t,r,o,u,i,c,l,a,f,s=e.target;m(s)&&(n=Ve.fromDom(s),t=e.origin,Ae(t,"corner-")&&(r=n,o=e.width,f=ee(t,"e"),""===g&&Ba(r),o!==d&&""!==g?(Vn(r,"width",g),u=h(),i=b(r),c=li(p)||f?yu(r).columns-1:0,au(r,o-d,c,u,i)):/^(\d+(\.\d+)?)%$/.test(g)&&Vn(r,"width",o*parseFloat(g.replace("%",""))/d+"%"),/^(\d+(\.\d+)?)px$/.test(g)&&(a=$t.fromTable(l=r),$t.hasColumns(a)||A(nt(l),function(e){Vn(e,"width",Un(e,"width")),Wt(e,"width")}))),nu(n),Gu(p,n.dom,Ca))}),p.on("SwitchMode",function(){w.each(function(e){p.mode.isReadOnly()?e.hideBars():e.showBars()})}),{lazyResize:function(){return w},lazyWire:function(){return y.getOr(Il(Ve.fromDom(p.getBody()),pi))},destroy:function(){w.each(function(e){e.destroy()}),y.each(function(e){var n=e;p.inline&&Yt(n.parent())})}}}function hi(e,n){return{element:e,offset:n}}function vi(e,n){return(e.property().isText(n)?e.property().getText(n):e.property().children(n)).length}function wi(t,r){1===Xn(t,"colspan")&&yo(t).bind(function(e){return o=["fixed","relative","empty"],q.from(so.exec(e)).bind(function(e){var n=Number(e[1]),t=e[2],r=t;return R(o,function(e){return R(fo[e],function(e){return r===e})})?q.some({value:n,unit:t}):q.none()});var o}).each(function(e){var n=e.value/2;xo(t,n,e.unit),xo(r,n,e.unit)})}function yi(e){return z(e,function(e){return Wa(e.element)})}function Ci(e){var n="thead"===e.section,t=Ln(ja(e.cells),"th");return n||t?{type:"header",subType:n&&t?"sectionCells":n?"section":"cells"}:"tfoot"===e.section?{type:"footer"}:{type:"body"}}function Si(e,n,t){return we(t(e.element,n),!0,e.isLocked)}function Ti(e,n){return e.section!==n?ye(e.element,e.cells,n,e.isNew):e}function xi(){return{transformRow:Ti,transformCell:function(e,n,t){var r,o,u=t(e.element,n);return we("td"!==Ye(u)?(o=sr(r=u,"td"),Rt(r,o),It(o,ln(r)),Yt(r),o):u,e.isNew,e.isLocked)}}}function Ri(){return{transformRow:Ti,transformCell:Si}}function Di(){return{transformRow:function(e,n){return Ti(e,"thead"===n?"tbody":n)},transformCell:Si}}function Oi(e,n,t,r){t===r?Wt(e,n):Mn(e,n,t)}function Ai(e,n,t){F(mn(e,n)).fold(function(){return Ot(e,t)},function(e){return Dt(e,t)})}function ki(u,e){function t(e,n){var t,r,o;It((Bt(o=An(t=u,r=n).getOrThunk(function(){var e=Ve.fromTag(r,nn(t).dom);return"thead"===r?Ai(t,"caption,colgroup",e):"colgroup"===r?Ai(t,"caption",e):Xt(t,e),e})),o),("colgroup"===n?function(e){return N(e,function(e){return O(e.cells,function(e){return Oi(e.element,"span",e.colspan,1),e.element})})}:function(e){return O(e,function(e){e.isNew&&i.push(e.element);var n=e.element;return Bt(n),A(e.cells,function(e){e.isNew&&c.push(e.element),Oi(e.element,"colspan",e.colspan,1),Oi(e.element,"rowspan",e.rowspan,1),Xt(n,e.element)}),n})})(e))}function n(e,n){0<e.length?t(e,n):An(u,n).each(Yt)}var i=[],c=[],r=[],o=[],l=[],a=[];return A(e,function(e){switch(e.section){case"thead":r.push(e);break;case"tbody":o.push(e);break;case"tfoot":l.push(e);break;case"colgroup":a.push(e)}}),n(a,"colgroup"),n(r,"thead"),n(o,"tbody"),n(l,"tfoot"),{newRows:i,newCells:c}}function Ii(e,n){if(0===e.length)return 0;var t=e[0];return b(e,function(e){return!n(t.element,e.element)}).getOr(e.length)}function Bi(m,d){var g=O(m,function(e){return O(e.cells,v)});return O(m,function(e,s){var n=N(e.cells,function(e,n){if(!1!==g[s][n])return[];var t,r,o,u,i,c,l,a,f=(o=n,u=d,l=(t=m)[r=s],a="colgroup"===l.section,{colspan:Ii(l.cells.slice(o),u),rowspan:a?1:Ii((i=t.slice(r),c=o,O(i,function(e){return st(e,c)})),u)});return function(e,n,t,r){for(var o=e;o<e+t;o++)for(var u=n;u<n+r;u++)g[o][u]=!0}(s,n,f.rowspan,f.colspan),[{element:e.element,rowspan:f.rowspan,colspan:f.colspan,isNew:e.isNew}]});return{element:e.element,cells:n,section:e.section,isNew:e.isNew}})}function Mi(o,u,i){var c=[];A(o.colgroups,function(e){for(var n=[],t=0;t<o.grid.columns;t++){var r=$t.getColumnAt(o,t).map(function(e){return we(e.element,i,!1)}).getOrThunk(function(){return we(u.colGap(),!0,!1)});n.push(r)}c.push(ye(e.element,n,"colgroup",i))});for(var e=0;e<o.grid.rows;e++){for(var n=[],t=0;t<o.grid.columns;t++){var r=$t.getAt(o,e,t).map(function(e){return we(e.element,i,e.isLocked)}).getOrThunk(function(){return we(u.gap(),!0,!1)});n.push(r)}var l=o.all[e],a=ye(l.element,n,l.section,i);c.push(a)}return c}function Ei(e){return Bi(e,ce)}function Pi(e,n){return H(e.all,function(e){return w(e.cells,function(e){return ce(n,e.element)})})}function Ni(n,e,t){var r=_n(O(e.selection,function(e){return et(e).bind(function(e){return Pi(n,e)}).filter(t)}));return jn(0<r.length,r)}function zi(f,n,s,m,d){return function(o,u,e,i,c){var l=$t.fromTable(u),a=q.from(null==c?void 0:c.section).getOrThunk(Pl);return n(l,e).map(function(e){var n=Mi(l,i,!1),t=f(n,e,ce,d(i),a),r=ht(t.grid);return{info:e,grid:Ei(t.grid),cursor:t.cursor,lockedColumns:r}}).bind(function(e){var n=ki(u,e.grid),t=q.from(null==c?void 0:c.sizing).getOrThunk(function(){return Vl(u)}),r=q.from(null==c?void 0:c.resize).getOrThunk(gu);return s(u,e.grid,e.info,{sizing:t,resize:r,section:a}),m(u),Wu(o,u),Wt(u,Gt),0<e.lockedColumns.length&&Mn(u,Gt,e.lockedColumns.join(",")),q.some({cursor:e.cursor,newRows:n.newRows,newCells:n.newCells})})}}function Li(e,n){return Ni(e,n,x).map(function(e){return{cells:e,generators:n.generators,clipboard:n.clipboard}})}function _i(e,n){return Ni(e,n,x)}function Wi(e,n){return Ni(e,n,function(e){return!e.isLocked})}function ji(n,e){return z(e,function(e){return Pi(n,e).exists(function(e){return!e.isLocked})})}function Fi(n,e){return e.mergable.filter(function(e){return ji(n,e.cells)})}function Hi(n,e){return e.unmergable.filter(function(e){return ji(n,e)})}function Vi(e,n,t,r){for(var o=gt(e).rows,u=!0,i=0;i<o.length;i++)for(var c=0;c<dt(o[0]);c++){var l=o[i],a=st(l,c),f=t(a.element,n);!0===f&&!1===u?ft(l,c,we(r(),!0,a.isLocked)):!0===f&&(u=!1)}return e}function qi(e,t,i,c){var n,r,l=gt(e).rows;return 0<t&&t<l.length&&(n=l[t-1].cells,r=i,A(B(n,function(e,n){return R(e,function(e){return r(e.element,n.element)})?e:e.concat([n])},[]),function(e){for(var o=q.none(),u=t;u<l.length;u++)for(var n=0;n<dt(l[0]);n++)!function(n){var t=l[u],r=st(t,n);i(r.element,e.element)&&(o=o.isNone()?q.some(c()):o).each(function(e){ft(t,n,we(e,!0,r.isLocked))})}(n)})),e}function Ui(e,n){return{rowDelta:0,colDelta:dt(e[0])-dt(n[0])}}function Gi(e,n){return{rowDelta:e.length-n.length,colDelta:0}}function $i(e,n,t,r){var o="colgroup"===n.section?t.col:t.cell;return D(e,function(e){return we(o(),!0,r(e))})}function Ki(e,n,r,o){var u=e[e.length-1];return e.concat(D(n,function(){var e="colgroup"===u.section?r.colgroup:r.row,n=pt(u,e,S),t=$i(n.cells.length,n,r,function(e){return Ke(o,e.toString())});return Ut(n,t)}))}function Xi(e,t,r,o){return O(e,function(e){var n=$i(t,e,r,v);return lt(e,o,n)})}function Yi(e,n,t){var r=n.colDelta<0?Xi:S,o=n.rowDelta<0?Ki:S,u=ht(e),i=dt(e[0]),c=R(u,function(e){return e===i-1}),l=r(e,Math.abs(n.colDelta),t,c?i-1:i),a=ht(l);return o(l,Math.abs(n.rowDelta),t,L(a,x))}function Ji(n,t,e){return k(e,function(e){return e>=n.column&&e<=dt(t[0])+n.column})}function Qi(e,u,n,i,c){var t,r,o,l=ht(u),a=(t=e,r=l,o=dt(u[0]),{row:gt(u).cols.length+t.row,column:w(D(o-t.column,function(e){return e+t.column}),function(n){return z(r,function(e){return e!==n})}).getOr(o-1)}),f=gt(n).rows,s=Ji(a,f,l);return function(e,n,t){if(e.row>=n.length||e.column>dt(n[0]))return Ga.error("invalid start address out of table bounds, row: "+e.row+", column: "+e.column);var r=n.slice(e.row),o=r[0].cells.slice(e.column),u=dt(t[0]),i=t.length;return Ga.value({rowDelta:r.length-i,colDelta:o.length-u})}(a,u,f).map(function(e){var n=K(K({},e),{colDelta:e.colDelta-s.length}),t=Yi(u,n,i),r=ht(t),o=Ji(a,f,r);return function(e,n,t,r,o,u){for(var i,c,l,a,f,s=e.row,m=e.column,d=s+t.length,g=m+dt(t[0])+u.length,p=L(u,x),b=s;b<d;b++)for(var h,v,w,y=0,C=m;C<g;C++)p[C]?y++:(l=C,a=void 0,a=P(o,st((i=n)[c=b],l).element),f=i[c],1<i.length&&1<dt(f)&&(0<l&&a(mt(f,l-1))||l<f.cells.length-1&&a(mt(f,l+1))||0<c&&a(mt(i[c-1],l))||c<i.length-1&&a(mt(i[c+1],l)))&&Vi(n,mt(n[b],C),o,r.cell),v=(h=st(t[b-s],C-m-y)).element,w=r.replace(v),ft(n[b],C,we(w,!0,h.isLocked)));return n}(a,t,f,i,c,o)})}function Zi(t,e,n,r,o){var u=t,i=o,c=r.cell;0<u&&u<e[0].cells.length&&A(e,function(e){var n=e.cells[u-1],t=e.cells[u];i(t.element,n.element)&&ft(e,u,we(c(),!0,t.isLocked))});var l=Yi(n,Gi(n,e),r);return O(Yi(e,Gi(e,l),r),function(e,n){return lt(e,t,l[n].cells)})}function ec(e,n,t,r,o){qi(n,e,o,r.cell);var u,i,c=ht(n),l=Ui(n,t),a=Yi(n,K(K({},l),{colDelta:l.colDelta-c.length}),r),f=gt(a),s=f.cols,m=f.rows,d=ht(a),g=Ui(t,n),p=K(K({},g),{colDelta:g.colDelta+d.length}),b=Yi((u=r,i=d,O(t,function(t){return B(i,function(e,n){return at(e,n,$i(1,t,u,x)[0])},t)})),p,r);return s.concat(m.slice(0,e)).concat(b).concat(m.slice(e,m.length))}function nc(e,t,n,r,o){var u,i,c,l,a=gt(e),f=a.rows,s=a.cols,m=f.slice(0,t),d=f.slice(t),g=(u=f[n],i=function(e,n){return 0<t&&t<f.length&&r(mt(f[t-1],n),mt(f[t],n))?st(f[t],n):we(o(e.element,r),!0,e.isLocked)},c=r,l=o,pt(u,function(e){return l(e,c)},i));return s.concat(m).concat([g]).concat(d)}function tc(e,u,i,c,l){return O(e,function(e){var n,t,r=0<u&&u<dt(e)&&c(mt(e,u-1),mt(e,u)),o=(n=e.section,t=l,"colgroup"!==n&&r?st(e,u):we(t(st(e,i).element,c),!0,!1));return at(e,u,o)})}function rc(e,n,t,r){return void 0!==mt((u=e)[i=n],t)&&0<i&&r(mt(u[i-1],t),mt(u[i],t))||(o=e[n],0<t&&r(mt(o,t-1),mt(o,t)));var o,u,i}function oc(e,n,t,r){function o(e){return("row"===e?Jn:Yn)(n)?e+"group":e}return e?Wa(n)?o(t):null:r&&Wa(n)?o("row"===t?"col":"row"):null}function uc(e,n,t){return we(t(e.element,n),!0,e.isLocked)}function ic(e,u,i,c,l,a,f){return O(e,function(e,o){return t=function(e,n){if(t=e,R(u,function(e){return i(t.element,e.element)})){var r=f(e,o,n)?l(e,i,c):e;return a(r,o,n).each(function(e){var t=r.element;ae({scope:q.from(e)},function(e,n){e.fold(function(){Wt(t,n)},function(e){Bn(t.dom,n,e)})})}),r}return e;var t},r=O((n=e).cells,t),ye(n.element,r,n.section,n.isNew);var n,t,r})}function cc(t,r,o){return N(t,function(e,n){return rc(t,n,r,o)?[]:[st(e,r)]})}function lc(e,n,t,r,o){var u,i,c,l,a=gt(e).rows,f=N(n,function(e){return cc(a,e,r)}),s=O(e,function(e){return yi(e.cells)}),m=(u=f,z(i=s,S)&&yi(u)?x:function(e,n,t){return!("th"===Ye(e.element)&&i[n])}),d=(c=t,l=s,function(e,n){return q.some(oc(c,e.element,"row",l[n]))});return ic(e,f,r,o,uc,d,m)}function ac(e,n,t,r){var o=gt(e).rows;return ic(e,O(n,function(e){return st(o[e.row],e.column)}),t,r,uc,q.none,x)}function fc(e){return B(e,function(e,n){return R(e,function(e){return e.column===n.column})?e:e.concat([n])},[]).sort(function(e,n){return e.column-n.column})}function sc(e){return"tr"===Ye(e)||Ka(e)}function mc(e){return{element:e,colspan:Kn(e,"colspan",1),rowspan:Kn(e,"rowspan",1)}}function dc(e){return Nn(e,"scope").map(function(e){return e.substr(0,3)})}function gc(e){return n=e,t=Ya.property().name(n),y(Xa,t);var n,t}function pc(e){return n=e,y(["ol","ul"],Ya.property().name(n));var n}function bc(e){function u(e){return"br"===Ye(e)}function t(o){return jo(o).bind(function(t){var r=cn(t).map(function(e){return!!gc(e)||(n=e,!!y(["br","img","hr","input"],Ya.property().name(n))&&"img"!==Ye(e));var n}).getOr(!1);return rn(t).map(function(e){return!0===r||"li"===Ye(n=e)||Dn(n,pc).isSome()||u(t)||gc(e)&&!ce(o,e)?[]:[Ve.fromTag("br")];var n})}).getOr([])}var n,r=0===(n=N(e,function(e){var n=ln(e);return z(n,function(e){return u(e)||pn(e)&&0===Et(e).trim().length})?[]:n.concat(t(e))})).length?[Ve.fromTag("br")]:n;Bt(e[0]),It(e[0],r)}function hc(e){return Nu(e,!0)}function vc(e){0===nt(e).length&&Yt(e)}function wc(e,n){return{grid:e,cursor:n}}function yc(e,n,t){var r,o,u,i,c,l=(r=n,o=t,c=gt(e).rows,q.from(null===(i=null===(u=c[r])||void 0===u?void 0:u.cells[o])||void 0===i?void 0:i.element).filter(hc).orThunk(function(){return H(c,function(e){return H(e.cells,function(e){var n=e.element;return jn(hc(n),n)})})}));return wc(e,l)}function Cc(e){return B(e,function(e,n){return R(e,function(e){return e.row===n.row})?e:e.concat([n])},[]).sort(function(e,n){return e.row-n.row})}function Sc(u,i){return function(e,n,t,r,o){return yc(function(e,n,t,r,u,o,i){var c=gt(e),l=c.cols,a=c.rows,f=a[n[0]],s=N(n,function(e){return o=u,N((t=a)[r=e].cells,function(e,n){return rc(t,r,n,o)?[]:[e]});var t,r,o}),m=O(f.cells,function(e,n){return yi(cc(a,n,u))}),d=X([],a,!0);A(n,function(e){d[e]=i.transformRow(a[e],t)});var g,p,b,h,v=l.concat(d),w=(g=f,z(p=m,S)&&yi(g.cells)?x:function(e,n,t){return!("th"===Ye(e.element)&&p[t])}),y=(b=r,h=m,function(e,n,t){return q.some(oc(b,e.element,"col",h[t]))});return ic(v,s,u,o,i.transformCell,y,w)}(e,O(Cc(n),function(e){return e.row}),u,i,t,r.replaceOrInit,o),n[0].row,n[0].column)}}function Tc(e,n,t){var r,o=(r=t.section,ut(e,function(){return r}));return Mi($t.generate(o),n,!0)}function xc(e,n,t,r){var o=r.sizing,u=$t.generate(n);lu(u,o.getWidths(u,o),o)}function Rc(e,n,t,r){var o=t,u=r.sizing,i=r.resize,c=$t.generate(n),l=u.getWidths(c,u),a=u.pixelWidth(),f=i.calcRedestributedWidths(l,a,o.pixelDelta,u.isRelative),s=f.newSizes,m=f.delta;lu(c,s,u),u.adjustTableWidth(m)}function Dc(e,n){return R(n,function(e){return 0===e.column&&e.isLocked})}function Oc(n,e){return R(e,function(e){return e.column+e.colspan>=n.grid.columns&&e.isLocked})}function Ac(e,n){var t=yr(e);return B(fc(n),function(e,n){return e+t[n.column].map(wr).getOr(0)},0)}function kc(t){return function(n,e){return _i(n,e).filter(function(e){return!(t?Dc:Oc)(n,e)}).map(function(e){return{details:e,pixelDelta:Ac(n,e)}})}}function Ic(t){return function(n,e){return Li(n,e).filter(function(e){return!(t?Dc:Oc)(n,e.cells)})}}function Bc(e,n){var u=$t.fromTable(e);return _i(u,n).bind(function(e){var n=e[e.length-1],t=e[0].column,r=n.column+n.colspan,o=M(O(u.all,function(e){return k(e.cells,function(e){return e.column>=t&&e.column<r})}));return ja(o)}).getOr("")}function Mc(e,n){return _i($t.fromTable(e),n).bind(ja).getOr("")}function Ec(m,d,e){function n(e){return"table"===Ye(Yo(e))}function t(c,l,a,f,s){return function(t,e,o){void 0===o&&(o=!1),nu(t);var n=f(),r=Ve.fromDom(m.getDoc()),u=$o(a,r,g),i={sizing:di(m,t),resize:(ai(m)?du:gu)(),section:function(e){switch(ii(m)){case"section":return Fa();case"sectionCells":return Ha();case"cells":return Va();default:return function(e,n){var t;switch(H($t.fromTable(e).all,function(e){var n=Ci(e);return"header"===n.type?q.from(n.subType):q.none()}).getOr(n)){case"section":return xi();case"sectionCells":return Ri();case"cells":return Di()}}(e,"section")}}(t)};return l(t)?c(n,t,e,u,i).bind(function(e){A(e.newRows,function(e){qu(m,e.dom)}),A(e.newCells,function(e){Uu(m,e.dom)});var r,n=(r=t,e.cursor.fold(function(){return j(nt(r)).filter(Sn).map(function(e){d.clear(r);var n=m.dom.createRng();return n.selectNode(e.dom),m.selection.setRng(n),Mn(e,"data-mce-selected","1"),n})},function(e){var n=La(_a,e),t=m.dom.createRng();return t.setStart(n.element.dom,n.offset),t.setEnd(n.element.dom,n.offset),m.selection.setRng(t),d.clear(r),q.some(t)}));return Sn(t)&&(nu(t),o||Gu(m,t.dom,s)),n.map(function(e){return{rng:e,effect:s}})}):q.none()}}var g=fi(m),r=ai(m)?E:wi;return{deleteRow:t(lf,function(e){return!1===n(m)||1<yu(e).rows},E,e,Sa),deleteColumn:t(cf,function(e){return!1===n(m)||1<yu(e).columns},E,e,Sa),insertRowsBefore:t(tf,x,E,e,Sa),insertRowsAfter:t(rf,x,E,e,Sa),insertColumnsBefore:t(of,x,r,e,Sa),insertColumnsAfter:t(uf,x,r,e,Sa),mergeCells:t(bf,x,E,e,Sa),unmergeCells:t(hf,x,E,e,Sa),pasteColsBefore:t(wf,x,E,e,Sa),pasteColsAfter:t(yf,x,E,e,Sa),pasteRowsBefore:t(Cf,x,E,e,Sa),pasteRowsAfter:t(Sf,x,E,e,Sa),pasteCells:t(vf,x,E,e,Ta),makeCellsHeader:t(gf,x,E,e,Sa),unmakeCellsHeader:t(pf,x,E,e,Sa),makeColumnsHeader:t(af,x,E,e,Sa),unmakeColumnsHeader:t(ff,x,E,e,Sa),makeRowsHeader:t(sf,x,E,e,Sa),makeRowsBody:t(mf,x,E,e,Sa),makeRowsFooter:t(df,x,E,e,Sa),getTableRowType:Tf,getTableCellType:Mc,getTableColType:Bc}}function Pc(e,n,t,r){return D(e,function(e){return function(e,n,t,r){for(var o=Ve.fromTag("tr"),u=0;u<e;u++){var i=r<n||u<t?Ve.fromTag("th"):Ve.fromTag("td");u<t&&Mn(i,"scope","row"),r<n&&Mn(i,"scope","col"),Xt(i,Ve.fromTag("br")),Xt(o,i)}return o}(n,t,r,e)})}function Nc(e,n){e.selection.select(n.dom,!0),e.selection.collapse(!0)}function zc(u,i,c,l,a){var o=Qu(u),f={styles:o,attributes:Ju(u),colGroups:u.getParam("table_use_colgroups",!1,"boolean")};return u.undoManager.ignore(function(){var e=function(e,n,t,r,o,u){void 0===u&&(u=xf);var i,c,l=Ve.fromTag("table"),a="cells"!==o;qn(l,u.styles),En(l,u.attributes),u.colGroups&&Xt(l,(i=n,c=Ve.fromTag("colgroup"),D(i,function(){return Xt(c,Ve.fromTag("col"))}),c));var f,s=Math.min(e,t);a&&0<t&&(f=Ve.fromTag("thead"),Xt(l,f),It(f,Pc(t,n,"sectionCells"===o?s:0,r)));var m=Ve.fromTag("tbody");return Xt(l,m),It(m,Pc(a?e-s:e,n,a?0:t,r)),l}(c,i,a,l,ii(u),f);Mn(e,"data-mce-id","__mce");var n,t,r,o=(n=e,t=Ve.fromTag("div"),r=Ve.fromDom(n.dom.cloneNode(!0)),Xt(t,r),t.dom.innerHTML);u.insertContent(o),u.addVisual()}),kn(Yo(u),'table[data-mce-id="__mce"]').map(function(e){var n,t,r;return ka(u)?Ma(e):Ia(u)?Ea(e):(ui(u)||(n=o.width,T(n)&&-1!==n.indexOf("%")))&&Ba(e),nu(e),Wt(e,"data-mce-id"),t=u,A(dn(e,"tr"),function(e){qu(t,e.dom),A(dn(e,"th,td"),function(e){Uu(t,e.dom)})}),r=u,kn(e,"td,th").each(P(Nc,r)),e.dom}).getOr(null)}function Lc(e,n,t,r,o){function u(e){return f(e)&&0<e}if(void 0===r&&(r={}),u(n)&&u(t)){var i=r.headerRows||0;return zc(e,t,n,r.headerColumns||0,i)}return console.error(o),null}function _c(e){return function(){return e().fold(function(){return[]},function(e){return O(e,function(e){return e.dom})})}}function Wc(t){return function(e){var n=0<e.length?q.some(Xo(e)):q.none();t(n)}}function jc(e,n,t){var r=Kn(e,n,1);1===t||r<=1?Wt(e,n):Mn(e,n,Math.min(t,r))}function Fc(o,e,u){return function(e,n){for(var t=0;t<n.length;t++){var r=o.getStyle(n[t],u);if((e=void 0===e?r:e)!==r)return""}return e}(void 0,o.select("td,th",e))}function Hc(e,n,t){t&&e.formatter.apply("align"+t,{},n)}function Vc(n,t){Rf.each("left center right".split(" "),function(e){n.formatter.remove("align"+e,{},t)})}function qc(e){return Of.test(t=e)||Af.test(t)?q.some({value:(Ae(n=e,"#")?n.substring("#".length):n).toUpperCase()}):q.none();var n,t}function Uc(e){var n=e.toString(16);return(1===n.length?"0"+n:n).toUpperCase()}function Gc(e){return{value:Uc(e.red)+Uc(e.green)+Uc(e.blue)}}function $c(e,n,t,r){return{red:e,green:n,blue:t,alpha:r}}function Kc(e,n,t,r){return $c(parseInt(e,10),parseInt(n,10),parseInt(t,10),parseFloat(r))}function Xc(e){var n=e;return{get:function(){return n},set:function(e){n=e}}}function Yc(e){function n(){return t.get().each(e)}var t=Xc(q.none());return{clear:function(){n(),t.set(q.none())},isSet:function(){return t.get().isSome()},get:function(){return t.get()},set:function(e){n(),t.set(q.some(e))}}}function Jc(){var n=Yc(E);return K(K({},n),{on:function(e){return n.get().each(e)}})}function Qc(e){return be(e,"menu")}function Zc(t,r){return function(e){var n;t.execCommand("mceTableApplyCellStyle",!1,((n={})[r]=e,n))}}function el(n,t,r,o,u){return function(e){return e(Mf(n,t,r,o,u))}}function nl(r,e,o){var n=O(e,function(e){return{text:e.title,value:"#"+qc(r=e.value).orThunk(function(){return function(e){if("transparent"===e)return q.some($c(0,0,0,0));var n=kf.exec(e);if(null!==n)return q.some(Kc(n[1],n[2],n[3],"1"));var t=If.exec(e);return null!==t?q.some(Kc(t[1],t[2],t[3],t[4])):q.none()}(r).map(Gc)}).getOrThunk(function(){var e=document.createElement("canvas");e.height=1,e.width=1;var n=e.getContext("2d");n.clearRect(0,0,e.width,e.height),n.fillStyle="#FFFFFF",n.fillStyle=r,n.fillRect(0,0,1,1);var t=n.getImageData(0,0,1,1).data;return Gc($c(t[0],t[1],t[2],t[3]))}).value,type:"choiceitem"};var r});return[{type:"fancymenuitem",fancytype:"colorswatch",initData:{colors:0<n.length?n:void 0,allowCustomColors:!1},onAction:function(e){var n,t="remove"===e.value?"":e.value;r.execCommand("mceTableApplyCellStyle",!1,((n={})[o]=t,n))}}]}function tl(n){return function(){var e=n.queryCommandValue("mceTableRowType");n.execCommand("mceTableRowType",!1,{type:"header"===e?"body":"header"})}}function rl(n){return function(){var e=n.queryCommandValue("mceTableColType");n.execCommand("mceTableColType",!1,{type:"th"===e?"td":"th"})}}function ol(e){return Pf.concat((0<(n=Bf(ri(e))).length?q.some({name:"class",type:"listbox",label:"Class",items:n}):q.none()).toArray());var n}function ul(e,n){var t=[{name:"borderstyle",type:"listbox",label:"Border style",items:[{text:"Select...",value:""}].concat(Bf(Yu(e)))},{name:"bordercolor",type:"colorinput",label:"Border color"},{name:"backgroundcolor",type:"colorinput",label:"Background color"}];return{title:"Advanced",name:"advanced",items:"cell"===n?[{name:"borderwidth",type:"input",label:"Border width"}].concat(t):t}}function il(u){return function(t,r){var o=t.dom;return{setAttrib:function(e,n){u&&!n||o.setAttrib(r,e,n)},setStyle:function(e,n){u&&!n||o.setStyle(r,e,n)},setFormat:function(e,n){u&&!n||(""===n?t.formatter.remove(e,{value:null},r,!0):t.formatter.apply(e,{value:n},r))}}}}function cl(n){return function(e){return Ae(e,"rgb")?n.toHex(e):e}}function ll(e,n){var t=Ve.fromDom(n);return{borderwidth:Gn(t,"border-width").getOr(""),borderstyle:Gn(t,"border-style").getOr(""),bordercolor:Gn(t,"border-color").map(cl(e)).getOr(""),backgroundcolor:Gn(t,"background-color").map(cl(e)).getOr("")}}function al(e){var o=e[0];return A(e.slice(1),function(e){A(Ue(o),function(r){ae(e,function(e,n){var t=o[r];""!==t&&r===n&&t!==e&&(o[r]="")})})}),o}function fl(e,n,t,r){return w(e,function(e){return!u(t.formatter.matchNode(r,n+e))}).getOr("")}function sl(e,t){var n=$t.fromTable(e);return O(k($t.justCells(n),function(n){return R(t,function(e){return ce(n.element,e)})}),function(e){return{element:e.element.dom,column:$t.getColumnAt(n,e.column).map(function(e){return e.element.dom})}})}function ml(e,n,r,t){var l=t.getData();t.close(),e.undoManager.transact(function(){var o,u=e,i=n,t=r,c=se(o=l,function(e,n){return t[n]!==e});0<ge(c)&&1<=i.length&&rt(i[0]).each(function(e){var s,m,d,n=sl(e,i),t=0<ge(se(c,function(e,n){return"scope"!==n&&"celltype"!==n})),r=Ke(c,"celltype");(t||Ke(c,"scope"))&&(s=u,m=o,d=1===n.length,A(n,function(e){var n,t,r,o,u,i,c=e.element,l=d?Nf.normal(s,c):Nf.ifTruthy(s,c),a=e.column.map(function(e){return d?Nf.normal(s,e):Nf.ifTruthy(s,e)}).getOr(l),f=m;(n=l).setAttrib("scope",f.scope),n.setAttrib("class",f.class),n.setStyle("height",eu(f.height)),a.setStyle("width",eu(f.width)),Zu(s)&&((t=l).setFormat("tablecellbackgroundcolor",(r=m).backgroundcolor),t.setFormat("tablecellbordercolor",r.bordercolor),t.setFormat("tablecellborderstyle",r.borderstyle),t.setFormat("tablecellborderwidth",eu(r.borderwidth))),d&&(Vc(s,c),o=s,u=c,Rf.each("top middle bottom".split(" "),function(e){o.formatter.remove("valign"+e,{},u)})),m.halign&&Hc(s,c,m.halign),!m.valign||(i=m.valign)&&s.formatter.apply("valign"+i,{},c)})),r&&u.execCommand("mceTableCellType",!1,{type:o.celltype,no_events:!0}),Gu(u,e.dom,{structure:r,style:t})}),e.focus()})}function dl(e,n){var t,l,r,o,u,i=Ql(n);0!==i.length&&(l=e,t=al(rt((r=i)[0]).map(function(e){return O(sl(e,r),function(e){return t=l,r=e.element,o=Zu(l),u=e.column,i=t.dom,c=u.getOr(r),K({width:n(c,"width"),height:n(r,"height"),scope:i.getAttrib(r,"scope"),celltype:r.nodeName.toLowerCase(),class:i.getAttrib(r,"class",""),halign:zf(t,r),valign:Lf(t,r)},o?ll(i,r):{});function n(e,n){return i.getStyle(e,n)||i.getAttrib(e,n)}var t,r,o,u,i,c})}).getOrDie()),o={type:"tabpanel",tabs:[{title:"General",name:"general",items:ol(e)},ul(e,"cell")]},u={type:"panel",items:[{type:"grid",columns:2,items:ol(e)}]},e.windowManager.open({title:"Cell Properties",size:"normal",body:Zu(e)?o:u,buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:t,onSubmit:P(ml,e,i,t)}))}function gl(e){return _f.concat((0<(n=Bf(e.getParam("table_row_class_list",[],"array"))).length?q.some({name:"class",type:"listbox",label:"Class",items:n}):q.none()).toArray());var n}function pl(s,m,d,e){var g=e.getData();e.close(),s.undoManager.transact(function(){var e,n,t,i,c,l,a,r=s,o=m,u=d,f=se(e=g,function(e,n){return u[n]!==e});0<ge(f)&&(n=Ke(f,"type"),(t=!n||1<ge(f))&&(i=r,c=e,l=u,a=1===o.length,A(o,function(e){var n,t,r,o=a?Nf.normal(i,e):Nf.ifTruthy(i,e),u=c;(n=o).setAttrib("class",u.class),n.setStyle("height",eu(u.height)),ei(i)&&((t=o).setStyle("background-color",(r=c).backgroundcolor),t.setStyle("border-color",r.bordercolor),t.setStyle("border-style",r.borderstyle)),c.align!==l.align&&(Vc(i,e),Hc(i,e,c.align))})),n&&r.execCommand("mceTableRowType",!1,{type:e.type,no_events:!0}),rt(Ve.fromDom(o[0])).each(function(e){return Gu(r,e.dom,{structure:n,style:t})})),s.focus()})}function bl(i){var e,t,n,r,o,u,c,l=(e=tu(i),t=Xl.selected,r=(n=Jl(e)).bind(function(e){return rt(e)}).map(ot),Wn(n,r,function(n,e){return k(e,function(e){return R(Xo(e.dom.cells),function(e){return"1"===Pn(e,t)||ce(e,n)})})}).getOr([]));0!==l.length&&(o=al(O(l,function(e){return n=i,t=e.dom,r=ei(i),u=n.dom,K({height:u.getStyle(t,"height")||u.getAttrib(t,"height"),class:u.getAttrib(t,"class",""),type:rt(Ve.fromDom(o=t)).map(function(e){var n={selection:Xo(o.cells)};return Tf(e,n)}).getOr(""),align:zf(n,t)},r?ll(u,t):{});var n,t,r,o,u})),u={type:"tabpanel",tabs:[{title:"General",name:"general",items:gl(i)},ul(i,"row")]},c={type:"panel",items:[{type:"grid",columns:2,items:gl(i)}]},i.windowManager.open({title:"Row Properties",size:"normal",body:ei(i)?u:c,buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:o,onSubmit:P(pl,i,O(l,function(e){return e.dom}),o)}))}function hl(u,i,t,e){var c=u.dom,l=e.getData(),a=se(l,function(e,n){return t[n]!==e});e.close(),""===l.class&&delete l.class,u.undoManager.transact(function(){var e,n,t,r,o;i||(e=parseInt(l.cols,10)||1,n=parseInt(l.rows,10)||1,i=zc(u,e,n,0,0)),0<ge(a)&&(function(e,n,t){var r,o=e.dom,u={},i={};if(u.class=t.class,i.height=eu(t.height),o.getAttrib(n,"width")&&!ti(e)?u.width=(r=t.width)?r.replace(/px$/,""):"":i.width=eu(t.width),ti(e)?(i["border-width"]=eu(t.border),i["border-spacing"]=eu(t.cellspacing)):(u.border=t.border,u.cellpadding=t.cellpadding,u.cellspacing=t.cellspacing),ti(e)&&n.children)for(var c=0;c<n.children.length;c++)Wf(o,n.children[c],{"border-width":eu(t.border),padding:eu(t.cellpadding)}),ni(e)&&Wf(o,n.children[c],{"border-color":t.bordercolor});ni(e)&&(i["background-color"]=t.backgroundcolor,i["border-color"]=t.bordercolor,i["border-style"]=t.borderstyle),u.style=o.serializeStyle(K(K({},Qu(e)),i)),o.setAttribs(n,K(K({},Ju(e)),u))}(u,i,l),((t=c.select("caption",i)[0])&&!l.caption||!t&&l.caption)&&u.execCommand("mceTableToggleCaption"),""===l.align?Vc(u,i):Hc(u,i,l.align)),u.focus(),u.addVisual(),0<ge(a)&&(o=!(r=Ke(a,"caption"))||1<ge(a),Gu(u,i,{structure:r,style:o}))})}function vl(e,n){var t,r,o,u,i,c,l,a,f,s,m,d,g,p,b,h,v,w,y,C=e.dom,S=(o=ni(r=e),a=Qu(r),f=Ju(r),s=o?(u=r.dom,{borderstyle:pe(a,"border-style").getOr(""),bordercolor:cl(u)(pe(a,"border-color").getOr("")),backgroundcolor:cl(u)(pe(a,"background-color").getOr(""))}):{},K(K(K(K(K(K({},{height:"",width:"100%",cellspacing:"",cellpadding:"",caption:!1,class:"",align:"",border:""}),a),f),s),(l=a["border-width"],ti(r)&&l?{border:l}:pe(f,"border").fold(function(){return{}},function(e){return{border:e}}))),(i=pe(a,"border-spacing").or(pe(f,"cellspacing")).fold(function(){return{}},function(e){return{cellspacing:e}}),c=pe(a,"border-padding").or(pe(f,"cellpadding")).fold(function(){return{}},function(e){return{cellpadding:e}}),K(K({},i),c))));!1===n?(t=C.getParent(e.selection.getStart(),"table",e.getBody()))?(d=t,g=ni(m=e),v=m.dom,w=ti(m)?v.getStyle(d,"border-spacing")||v.getAttrib(d,"cellspacing"):v.getAttrib(d,"cellspacing")||v.getStyle(d,"border-spacing"),y=ti(m)?Fc(v,d,"padding")||v.getAttrib(d,"cellpadding"):v.getAttrib(d,"cellpadding")||Fc(v,d,"padding"),S=K({width:v.getStyle(d,"width")||v.getAttrib(d,"width"),height:v.getStyle(d,"height")||v.getAttrib(d,"height"),cellspacing:w,cellpadding:y,border:(p=v,h=Gn(Ve.fromDom(b=d),"border-width"),ti(m)&&h.isSome()?h.getOr(""):p.getAttrib(b,"border")||Fc(m.dom,b,"border-width")||Fc(m.dom,b,"border")),caption:!!v.select("caption",d)[0],class:v.getAttrib(d,"class",""),align:zf(m,d)},g?ll(v,d):{})):ni(e)&&(S.borderstyle="",S.bordercolor="",S.backgroundcolor=""):(S.cols="1",S.rows="1",ni(e)&&(S.borderstyle="",S.bordercolor="",S.backgroundcolor=""));var T=Bf(oi(e));0<T.length&&S.class&&(S.class=S.class.replace(/\s*mce\-item\-table\s*/g,""));var x,R,D,O,A={type:"grid",columns:2,items:(x=T,R=n?[{type:"input",name:"cols",label:"Cols",inputMode:"numeric"},{type:"input",name:"rows",label:"Rows",inputMode:"numeric"}]:[],D=e.getParam("table_appearance_options",!0,"boolean")?[{type:"input",name:"cellspacing",label:"Cell spacing",inputMode:"numeric"},{type:"input",name:"cellpadding",label:"Cell padding",inputMode:"numeric"},{type:"input",name:"border",label:"Border width"},{type:"label",label:"Caption",items:[{type:"checkbox",name:"caption",label:"Show caption"}]}]:[],O=0<x.length?[{type:"listbox",name:"class",label:"Class",items:x}]:[],R.concat([{type:"input",name:"width",label:"Width"},{type:"input",name:"height",label:"Height"}]).concat(D).concat([{type:"listbox",name:"align",label:"Alignment",items:[{text:"None",value:""},{text:"Left",value:"left"},{text:"Center",value:"center"},{text:"Right",value:"right"}]}]).concat(O))},k=ni(e)?{type:"tabpanel",tabs:[{title:"General",name:"general",items:[A]},ul(e,"table")]}:{type:"panel",items:[A]};e.windowManager.open({title:"Table Properties",size:"normal",body:k,onSubmit:P(hl,e,t,S),buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:S})}function wl(e){return Yl(tu(e),Zo(e))}function yl(l,n,e,a,t){function u(e){return rt(e,d)}function f(t){return Jl(tu(e=l),Zo(e)).bind(function(n){return u(n).map(function(e){return t(e,n)})});var e}function s(e){l.focus()}function r(r,o){return void 0===o&&(o=!1),f(function(e,n){var t=ou(a,e,n);r(e,t,o).each(s)})}function o(){return f(function(e,n){var t,r,o,u=ou(a,e,n),i=$o(E,Ve.fromDom(l.getDoc()),q.none());return t=u,r=i,_i(o=$t.fromTable(e),t).bind(function(e){var n=Ei(N(gt(Mi(o,r,!1)).rows.slice(e[0].row,e[e.length-1].row+e[e.length-1].rowspan),function(e){var n=k(e.cells,function(e){return!e.isLocked});return 0<n.length?[K(K({},e),{cells:n})]:[]}));return jn(0<n.length,n)}).map(function(e){return O(e,function(e){var t=ar(e.element);return A(e.cells,function(e){var n=fr(e.element);Oi(n,"colspan",e.colspan,1),Oi(n,"rowspan",e.rowspan,1),Xt(t,n)}),t})})})}function i(){return f(function(e,n){var t,l,r=ou(a,e,n);return t=r,Wi(l=$t.fromTable(e),t).map(function(e){var r,o,n=e[e.length-1],t=e[0].column,u=n.column+n.colspan,i=function(e,t,r){if($t.hasColumns(e)){var n=O(k($t.justColumns(e),function(e){return e.column>=t&&e.column<r}),function(e){var n=fr(e.element);return jc(n,"span",r-t),n}),o=Ve.fromTag("colgroup");return It(o,n),[o]}return[]}(l,t,u),c=(r=t,o=u,O(l.all,function(e){var n=O(k(e.cells,function(e){return e.column>=r&&e.column<o}),function(e){var n=fr(e.element);return jc(n,"colspan",o-r),n}),t=Ve.fromTag("tr");return It(t,n),t}));return X(X([],i,!0),c,!0)})})}function c(c,e){return e().each(function(e){var i=O(e,fr);f(function(e,n){var t,r,o=Ko(Ve.fromDom(l.getDoc())),u=(t=i,r=o,{selection:ru(a),clipboard:t,generators:r});c(e,u).each(s)})})}function m(t){return function(e,n){return pe(n,"type").each(function(e){r(t(e),n.no_events)})}}var d=Zo(l);ae({mceTableSplitCells:function(){return r(n.unmergeCells)},mceTableMergeCells:function(){return r(n.mergeCells)},mceTableInsertRowBefore:function(){return r(n.insertRowsBefore)},mceTableInsertRowAfter:function(){return r(n.insertRowsAfter)},mceTableInsertColBefore:function(){return r(n.insertColumnsBefore)},mceTableInsertColAfter:function(){return r(n.insertColumnsAfter)},mceTableDeleteCol:function(){return r(n.deleteColumn)},mceTableDeleteRow:function(){return r(n.deleteRow)},mceTableCutCol:function(){return i().each(function(e){t.setColumns(e),r(n.deleteColumn)})},mceTableCutRow:function(){return o().each(function(e){t.setRows(e),r(n.deleteRow)})},mceTableCopyCol:function(){return i().each(function(e){return t.setColumns(e)})},mceTableCopyRow:function(){return o().each(function(e){return t.setRows(e)})},mceTablePasteColBefore:function(){return c(n.pasteColsBefore,t.getColumns)},mceTablePasteColAfter:function(){return c(n.pasteColsAfter,t.getColumns)},mceTablePasteRowBefore:function(){return c(n.pasteRowsBefore,t.getRows)},mceTablePasteRowAfter:function(){return c(n.pasteRowsAfter,t.getRows)},mceTableDelete:function(){return wl(l).each(function(e){rt(e,d).filter(p(d)).each(function(e){var n,t=Ve.fromText("");Dt(e,t),Yt(e),l.dom.isEmpty(l.getBody())?(l.setContent(""),l.selection.setCursorLocation()):((n=l.dom.createRng()).setStart(t.dom,0),n.setEnd(t.dom,0),l.selection.setRng(n),l.nodeChanged())})})},mceTableCellToggleClass:function(e,r){f(function(e){var n=Ql(a),t=z(n,function(e){return l.formatter.match("tablecellclass",{value:r},e.dom)})?l.formatter.remove:l.formatter.apply;A(n,function(e){return t("tablecellclass",{value:r},e.dom)}),Gu(l,e.dom,Ca)})},mceTableToggleClass:function(e,n){f(function(e){l.formatter.toggle("tableclass",{value:n},e.dom),Gu(l,e.dom,Ca)})},mceTableToggleCaption:function(){wl(l).each(function(n){rt(n,d).each(function(r){An(r,"caption").fold(function(){var e,n,t=Ve.fromTag("caption");Xt(t,Ve.fromText("Caption")),n=t,an(e=r,0).fold(function(){Xt(e,n)},function(e){Rt(e,n)}),l.selection.setCursorLocation(t.dom,0)},function(e){en("caption")(n)&&ie("td",r).each(function(e){return l.selection.setCursorLocation(e.dom,0)}),Yt(e)}),Gu(l,r.dom,Sa)})})},mceTableSizingMode:function(e,n){return t=n,wl(l).each(function(e){Ia(l)||ka(l)||ui(l)||rt(e,d).each(function(e){"relative"!==t||Bl(e)?"fixed"!==t||Ml(e)?"responsive"!==t||El(e)||Ea(e):Ma(e):Ba(e),nu(e),Gu(l,e.dom,Sa)})});var t},mceTableCellType:m(function(e){return"th"===e?n.makeCellsHeader:n.unmakeCellsHeader}),mceTableColType:m(function(e){return"th"===e?n.makeColumnsHeader:n.unmakeColumnsHeader}),mceTableRowType:m(function(e){switch(e){case"header":return n.makeRowsHeader;case"footer":return n.makeRowsFooter;default:return n.makeRowsBody}})},function(e,n){return l.addCommand(n,e)}),ae({mceTableProps:P(vl,l,!1),mceTableRowProps:P(bl,l),mceTableCellProps:P(dl,l,a)},function(e,n){return l.addCommand(n,function(){return e()})}),l.addCommand("mceInsertTable",function(e,n){g(n)&&0<Ue(n).length?Lc(l,n.rows,n.columns,n.options,"Invalid values for mceInsertTable - rows and columns values are required to insert a table."):vl(l,!0)}),l.addCommand("mceTableApplyCellStyle",function(e,n){function r(e){return"tablecell"+e.toLowerCase().replace("-","")}var o,t;!g(n)||0!==(o=Ql(a)).length&&(function(e){for(var n in e)if(Ge.call(e,n))return;return 1}(t=se(n,function(e,n){return l.formatter.has(r(n))&&T(e)}))||(ae(t,function(n,t){A(o,function(e){Nf.normal(l,e.dom).setFormat(r(t),n)})}),u(o[0]).each(function(e){return Gu(l,e.dom,Ca)})))})}function Cl(t,e){return rt(t,e).bind(function(e){var n=nt(e);return b(n,function(e){return ce(t,e)}).map(function(e){return{index:e,all:n}})})}function Sl(e,n){var t=e.document.createRange();return t.selectNode(n.dom),t}function Tl(e,n){var t=e.document.createRange();return Jf(t,n),t}function xl(e,n,t){var r,o=e.document.createRange(),u=o;return n.fold(function(e){u.setStartBefore(e.dom)},function(e,n){u.setStart(e.dom,n)},function(e){u.setStartAfter(e.dom)}),r=o,t.fold(function(e){r.setEndBefore(e.dom)},function(e,n){r.setEnd(e.dom,n)},function(e){r.setEndAfter(e.dom)}),o}function Rl(e,n,t,r,o){var u=e.document.createRange();return u.setStart(n.dom,t),u.setEnd(r.dom,o),u}function Dl(e){return{left:e.left,top:e.top,right:e.right,bottom:e.bottom,width:e.width,height:e.height}}function Ol(e,n,t){return n(Ve.fromDom(t.startContainer),t.startOffset,Ve.fromDom(t.endContainer),t.endOffset)}function Al(e,n){var o,t,r,u=(o=e,n.match({domRange:function(e){return{ltr:C(e),rtl:q.none}},relative:function(e,n){return{ltr:Y(function(){return xl(o,e,n)}),rtl:Y(function(){return q.some(xl(o,n,e))})}},exact:function(e,n,t,r){return{ltr:Y(function(){return Rl(o,e,n,t,r)}),rtl:Y(function(){return q.some(Rl(o,t,r,e,n))})}}}));return(r=(t=u).ltr()).collapsed?t.rtl().filter(function(e){return!1===e.collapsed}).map(function(e){return Qf.rtl(Ve.fromDom(e.endContainer),e.endOffset,Ve.fromDom(e.startContainer),e.startOffset)}).getOrThunk(function(){return Ol(0,Qf.ltr,r)}):Ol(0,Qf.ltr,r)}function kl(u,e){return Al(u,e).match({ltr:function(e,n,t,r){var o=u.document.createRange();return o.setStart(e.dom,n),o.setEnd(t.dom,r),o},rtl:function(e,n,t,r){var o=u.document.createRange();return o.setStart(t.dom,r),o.setEnd(e.dom,n),o}})}function Il(e,n){return{parent:C(q.from(e.dom.documentElement).map(Ve.fromDom).getOr(e)),view:C(e),origin:C(uo(0,0)),isResizable:n}}function Bl(e){return yo(e).exists(function(e){return _l.test(e)})}function Ml(e){return yo(e).exists(function(e){return Wl.test(e)})}function El(e){return yo(e).isNone()}function Pl(){return{transformRow:S,transformCell:Si}}function Nl(o,u){function r(e){if(sc(e))return Ka((t={element:e}).element)?o.colgroup(t):o.row(t);var n,t,r=(n=u(e),$a(n.element)?o.col(n):o.cell(n));return i=q.some({item:e,replacement:r}),r}void 0===u&&(u=mc);var i=q.none();return{getOrInit:function(n,t){return i.fold(function(){return r(n)},function(e){return t(n,e.item)?e.replacement:r(n)})}}}function zl(r){return function(t){function u(e){var n=t.replace(e,r,"td"===r?{scope:null}:{});return i.push({item:e,sub:n}),n}var i=[];return{replaceOrInit:function(n,t){return sc(n)||$a(n)?n:(r=n,o=t,w(i,function(e){return o(e.item,r)}).fold(function(){return u(n)},function(e){return t(n,e.item)?e.sub:u(n)}));var r,o}}}}function Ll(r){return{unmerge:function(t){var e=dc(t);return e.each(function(e){return Mn(t,"scope",e)}),function(){var n=r.cell({element:t,colspan:1,rowspan:1});return $n(n,"width"),$n(t,"width"),e.each(function(e){return Mn(n,"scope",e)}),n}},merge:function(r){return $n(r[0],"width"),function(){var e=_n(O(r,dc));if(0===e.length)return q.none();var n=e[0],t=["row","col"];return R(e,function(e){return e!==n&&y(t,e)})?q.none():q.from(n)}().fold(function(){return Wt(r[0],"scope")},function(e){return Mn(r[0],"scope",e+"group")}),C(r[0])}}}var _l=/(\d+(\.\d+)?)%/,Wl=/(\d+(\.\d+)?)px|em/,jl=en("col"),Fl=C(_l),Hl=en("col"),Vl=function(r){return yo(r).fold(function(){return e=Eo(t=r,vr),n=C(0),{width:e,pixelWidth:e,getWidths:function(e,n){return Bo(e,t,n)},getCellDelta:n,singleColumnWidth:C([0]),minCellWidth:n,setElementWidth:E,adjustTableWidth:E,isRelative:!0,label:"none"};var t,e,n},function(e){return n=r,t=e,(null!==Fl().exec(t)?Po:No)(n);var n,t})},ql=No,Ul=Po,Gl=["img","br"],$l=function(e,u){var i=function(e){for(var n=ln(e),t=n.length-1;0<=t;t--){var r=n[t];if(u(r))return q.some(r);var o=i(r);if(o.isSome())return o}return q.none()};return i(e)},Kl={scope:["row","col"]},Xl={selected:"data-mce-selected",selectedSelector:"td[data-mce-selected],th[data-mce-selected]",firstSelected:"data-mce-first-selected",firstSelectedSelector:"td[data-mce-first-selected],th[data-mce-first-selected]",lastSelected:"data-mce-last-selected",lastSelectedSelector:"td[data-mce-last-selected],th[data-mce-last-selected]"},Yl=uu("th,td,caption"),Jl=uu("th,td"),Ql=ru,Zl=Lr([{none:[]},{only:["index"]},{left:["index","next"]},{middle:["prev","index","next"]},{right:["prev","index"]}]),ea=K({},Zl),na=mu(function(e){return e<0}),ta=mu(x),ra=Lr([{invalid:["raw"]},{pixels:["value"]},{percent:["value"]}]),oa=K(K({},ra),{from:function(e){return ee(e,"%")?pu("%",ra.percent,e):ee(e,"px")?pu("px",ra.pixels,e):ra.invalid(e)}}),ua=function(e){if(0===e.length)return e;var n,t,r=I(e,function(e,n){var t=oa.from(n).fold(function(){return{value:n,remainder:0}},function(e){return n=e,{value:(t=Math.floor(n))+"px",remainder:n-t};var n,t},function(e){return{value:e+"%",remainder:0}});return{output:[t.value].concat(e.output),remainder:e.remainder+t.remainder}},{output:[],remainder:0}),o=r.output;return o.slice(0,o.length-1).concat([(n=o[o.length-1],t=Math.round(r.remainder),oa.from(n).fold(C(n),function(e){return e+t+"px"},function(e){return e+t+"%"}))])},ia=oa.from,ca=Ru(["compare","extract","mutate","sink"]),la=Ru(["element","start","stop","destroy"]),aa=Ru(["forceDrop","drop","move","delayDrop"]),fa=function(e,n,t,r){e.dom.removeEventListener(n,t,r)},sa=x,ma=Ou,da=Eu("ephox-dragster").resolve,ga=ca({compare:function(e,n){return uo(n.left-e.left,n.top-e.top)},extract:function(e){return q.some(uo(e.x,e.y))},sink:function(e,n){var t,r,o,u=(t=n,r=K({layerClass:da("blocker")},t),Mn(o=Ve.fromTag("div"),"role","presentation"),qn(o,{position:"fixed",left:"0px",top:"0px",width:"100%",height:"100%"}),Bu(o,da("blocker")),Bu(o,r.layerClass),{element:C(o),destroy:function(){Yt(o)}}),i=Au(u.element(),"mousedown",e.forceDrop),c=Au(u.element(),"mouseup",e.drop),l=Au(u.element(),"mousemove",e.move),a=Au(u.element(),"mouseout",e.delayDrop);return la({element:u.element,start:function(e){Xt(e,u.element())},stop:function(){Yt(u.element())},destroy:function(){u.destroy(),c.unbind(),l.unbind(),a.unbind(),i.unbind()}})},mutate:function(e,n){e.mutate(n.left,n.top)}}),pa=function(e){return e.dom.contentEditable},ba=Eu("ephox-snooker").resolve,ha=ba("resizer-bar"),va=ba("resizer-rows"),wa=ba("resizer-cols"),ya=ba("resizer-bar-dragging"),Ca={structure:!1,style:!0},Sa={structure:!0,style:!1},Ta={structure:!0,style:!0},xa={"border-collapse":"collapse",width:"100%"},Ra=D(5,function(e){var n=e+1+"px";return{title:n,value:n}}),Da=O(["Solid","Dotted","Dashed","Double","Groove","Ridge","Inset","Outset","None","Hidden"],function(e){return{title:e,value:e.toLowerCase()}}),Oa={border:"1"},Aa="preservetable",ka=function(e){return"fixed"===$u(e)||!1===Ku(e)},Ia=function(e){return"responsive"===$u(e)},Ba=function(e){var n=Ro(e);wu(e,q.some(n),q.none()),gi(e)},Ma=function(e){var n=vr(e)+"px";wu(e,q.some(n),q.none()),gi(e)},Ea=function(e){$n(e,"width");var n=tt(e);A(0<n.length?n:nt(e),function(e){$n(e,"width"),gi(e)}),gi(e)},Pa="bar-",Na=function(n,e,t){return n.property().isText(e)&&0===n.property().getText(e).trim().length||n.property().isComment(e)?t(e).bind(function(e){return Na(n,e,t).orThunk(function(){return q.some(e)})}):q.none()},za=function(e,n){var t=Na(e,n,e.query().prevSibling).getOr(n);if(e.property().isText(t))return hi(t,vi(e,t));var r=e.property().children(t);return 0<r.length?za(e,r[r.length-1]):hi(t,vi(e,t))},La=za,_a=Zt(),Wa=en("th"),ja=function(e){var n=k(e,function(e){return Wa(e.element)});return 0===n.length?q.some("td"):n.length===e.length?q.some("th"):q.none()},Fa=xi,Ha=Ri,Va=Di,qa=function(t){return{isValue:x,isError:v,getOr:C(t),getOrThunk:C(t),getOrDie:C(t),or:function(e){return qa(t)},orThunk:function(e){return qa(t)},fold:function(e,n){return n(t)},map:function(e){return qa(e(t))},mapError:function(e){return qa(t)},each:function(e){e(t)},bind:function(e){return e(t)},exists:function(e){return e(t)},forall:function(e){return e(t)},toOptional:function(){return q.some(t)}}},Ua=function(t){return{isValue:v,isError:x,getOr:S,getOrThunk:function(e){return e()},getOrDie:function(){return e=String(t),function(){throw new Error(e)}();var e},or:S,orThunk:function(e){return e()},fold:function(e,n){return e(t)},map:function(e){return Ua(t)},mapError:function(e){return Ua(e(t))},each:E,bind:function(e){return Ua(t)},exists:v,forall:x,toOptional:q.none}},Ga={value:qa,error:Ua,fromOption:function(e,n){return e.fold(function(){return Ua(n)},qa)}},$a=en("col"),Ka=en("colgroup"),Xa=["body","p","div","article","aside","figcaption","figure","footer","header","nav","section","ol","ul","table","thead","tfoot","tbody","caption","tr","td","th","h1","h2","h3","h4","h5","h6","blockquote","pre","address"],Ya=Zt(),Ja=Sc("thead",!0),Qa=Sc("tbody",!1),Za=Sc("tfoot",!1),ef=zl("th"),nf=zl("td"),tf=zi(function(e,n,t,r){var o=n[0].row;return yc(I(Cc(n),function(e,n){return{grid:nc(e.grid,o,n.row+e.delta,t,r.getOrInit),delta:e.delta+1}},{grid:e,delta:0}).grid,o,n[0].column)},_i,E,E,Nl),rf=zi(function(e,n,t,r){var o=Cc(n),u=o[o.length-1],i=u.row+u.rowspan;return yc(I(o,function(e,n){return nc(e,i,n.row,t,r.getOrInit)},e),i,n[0].column)},_i,E,E,Nl),of=zi(function(e,n,t,r){var o=n.details,u=fc(o),i=u[0].column;return yc(I(u,function(e,n){return{grid:tc(e.grid,i,n.column+e.delta,t,r.getOrInit),delta:e.delta+1}},{grid:e,delta:0}).grid,o[0].row,i)},kc(!0),Rc,E,Nl),uf=zi(function(e,n,t,r){var o=n.details,u=o[o.length-1],i=u.column+u.colspan;return yc(I(fc(o),function(e,n){return tc(e,i,n.column,t,r.getOrInit)},e),o[0].row,i)},kc(!1),Rc,E,Nl),cf=zi(function(e,n,t,r){var o,u,i=fc(n.details),c=(o=e,u=O(i,function(e){return e.column}),N(o,function(e){var n=e.cells,t=I(u,function(e,n){return 0<=n&&n<e.length?e.slice(0,n).concat(e.slice(n+1)):e},n);return 0<t.length?[ye(e.element,t,e.section,e.isNew)]:[]})),l=0<c.length?c[0].cells.length-1:0;return yc(c,i[0].row,Math.min(i[0].column,l))},function(n,e){return Wi(n,e).map(function(e){return{details:e,pixelDelta:-Ac(n,e)}})},Rc,vc,Nl),lf=zi(function(e,n,t,r){var o,u,i,c,l=Cc(n),a=(o=l[0].row,u=l[l.length-1].row,c=(i=gt(e)).rows,i.cols.concat(c.slice(0,o)).concat(c.slice(u+1))),f=0<a.length?a.length-1:0;return yc(a,Math.min(n[0].row,f),n[0].column)},_i,E,vc,Nl),af=zi(function(e,n,t,r){return yc(lc(e,O(fc(n),function(e){return e.column}),!0,t,r.replaceOrInit),n[0].row,n[0].column)},Wi,E,E,ef),ff=zi(function(e,n,t,r){return yc(lc(e,O(fc(n),function(e){return e.column}),!1,t,r.replaceOrInit),n[0].row,n[0].column)},Wi,E,E,nf),sf=zi(Ja,Wi,E,E,ef),mf=zi(Qa,Wi,E,E,nf),df=zi(Za,Wi,E,E,nf),gf=zi(function(e,n,t,r){return yc(ac(e,n,t,r.replaceOrInit),n[0].row,n[0].column)},Wi,E,E,ef),pf=zi(function(e,n,t,r){return yc(ac(e,n,t,r.replaceOrInit),n[0].row,n[0].column)},Wi,E,E,nf),bf=zi(function(e,n,t,r){var o=n.cells;return bc(o),wc(function(e,n,t){var r=gt(e).rows;if(0===r.length)return e;for(var o=n.startRow;o<=n.finishRow;o++)for(var u=n.startCol;u<=n.finishCol;u++){var i=r[o],c=st(i,u).isLocked;ft(i,u,we(t(),!1,c))}return e}(e,n.bounds,r.merge(o)),q.from(o[0]))},Fi,xc,E,Ll),hf=zi(function(e,n,t,r){return wc(I(n,function(e,n){return Vi(e,n,t,r.unmerge(n))},e),q.from(n[0]))},Hi,xc,E,Ll),vf=zi(function(e,n,t,r){var o,u,i=(o=n.clipboard,u=n.generators,Mi($t.fromTable(o),u,!0));return Qi({row:n.row,column:n.column},e,i,n.generators,t).fold(function(){return wc(e,q.some(n.element))},function(e){return yc(e,n.row,n.column)})},function(n,t){return et(t.element).bind(function(e){return Pi(n,e).map(function(e){return K(K({},e),{generators:t.generators,clipboard:t.clipboard})})})},xc,E,Nl),wf=zi(function(e,n,t,r){var o=gt(e).rows,u=n.cells[0].column,i=o[n.cells[0].row];return yc(Zi(u,e,Tc(n.clipboard,n.generators,i),n.generators,t),n.cells[0].row,n.cells[0].column)},Ic(!0),E,E,Nl),yf=zi(function(e,n,t,r){var o=gt(e).rows,u=n.cells[n.cells.length-1].column+n.cells[n.cells.length-1].colspan,i=o[n.cells[0].row];return yc(Zi(u,e,Tc(n.clipboard,n.generators,i),n.generators,t),n.cells[0].row,n.cells[0].column)},Ic(!1),E,E,Nl),Cf=zi(function(e,n,t,r){var o=gt(e).rows,u=n.cells[0].row,i=o[u];return yc(ec(u,e,Tc(n.clipboard,n.generators,i),n.generators,t),n.cells[0].row,n.cells[0].column)},Li,E,E,Nl),Sf=zi(function(e,n,t,r){var o=gt(e).rows,u=n.cells[n.cells.length-1].row+n.cells[n.cells.length-1].rowspan,i=o[n.cells[0].row];return yc(ec(u,e,Tc(n.clipboard,n.generators,i),n.generators,t),n.cells[0].row,n.cells[0].column)},Li,E,E,Nl),Tf=function(e,n){var i=$t.fromTable(e);return _i(i,n).bind(function(e){var n=e[e.length-1],o=e[0].row,u=n.row+n.rowspan;return function(){var e=O(i.all.slice(o,u),function(e){return Ci(e).type}),n=y(e,"header"),t=y(e,"footer");if(n||t){var r=y(e,"body");return!n||r||t?n||r||!t?q.none():q.some("footer"):q.some("header")}return q.some("body")}()}).getOr("")},xf={styles:{"border-collapse":"collapse",width:"100%"},attributes:{border:"1"},colGroups:!1},Rf=tinymce.util.Tools.resolve("tinymce.util.Tools"),Df=[{text:"None",value:""},{text:"Top",value:"top"},{text:"Middle",value:"middle"},{text:"Bottom",value:"bottom"}],Of=/^#?([a-f\d])([a-f\d])([a-f\d])$/i,Af=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i,kf=/^rgb\((\d+),\s*(\d+),\s*(\d+)\)/,If=/^rgba\((\d+),\s*(\d+),\s*(\d+),\s*(\d?(?:\.\d+)?)\)/,Bf=function(e){return O(e,function(e){var n=e.text||e.title;return Qc(e)?{text:n,items:Bf(e.menu)}:{text:n,value:e.value}})},Mf=function(t,r,e,o,a){return O(e,function(e){var u,i,c,l,n=e.text||e.title;return Qc(e)?{type:"nestedmenuitem",text:n,getSubmenuItems:function(){return Mf(t,r,e.menu,o,a)}}:{text:n,type:"togglemenuitem",onAction:function(){return a(e.value)},onSetup:(u=t,i=r,c=o,l=e.value,function(t){function e(){function e(e){return u.formatter.match(c,{value:l},e.dom,o)}var n=Ql(i);o?(t.setActive(!R(n,e)),r.set(u.formatter.formatChanged(c,function(e){return t.setActive(!e)},!0))):(t.setActive(z(n,e)),r.set(u.formatter.formatChanged(c,t.setActive,!1,{value:l})))}var r=Yc(function(e){return e.unbind()}),o=!ne(l);return u.initialized?e():u.on("init",e),r.clear})}})},Ef=function(e){return N(e,function(e){return Qc(e)?[K(K({},e),{menu:Ef(e.menu)})]:ne(e.value)?[e]:[]})},Pf=[{name:"width",type:"input",label:"Width"},{name:"height",type:"input",label:"Height"},{name:"celltype",type:"listbox",label:"Cell type",items:[{text:"Cell",value:"td"},{text:"Header cell",value:"th"}]},{name:"scope",type:"listbox",label:"Scope",items:[{text:"None",value:""},{text:"Row",value:"row"},{text:"Column",value:"col"},{text:"Row group",value:"rowgroup"},{text:"Column group",value:"colgroup"}]},{name:"halign",type:"listbox",label:"Horizontal align",items:[{text:"None",value:""},{text:"Left",value:"left"},{text:"Center",value:"center"},{text:"Right",value:"right"}]},{name:"valign",type:"listbox",label:"Vertical align",items:Df}],Nf={normal:il(!1),ifTruthy:il(!0)},zf=P(fl,["left","center","right"],"align"),Lf=P(fl,["top","middle","bottom"],"valign"),_f=[{type:"listbox",name:"type",label:"Row type",items:[{text:"Header",value:"header"},{text:"Body",value:"body"},{text:"Footer",value:"footer"}]},{type:"listbox",name:"align",label:"Alignment",items:[{text:"None",value:""},{text:"Left",value:"left"},{text:"Center",value:"center"},{text:"Right",value:"right"}]},{label:"Height",name:"height",type:"input"}],Wf=function(e,n,t,r){if("TD"===n.tagName||"TH"===n.tagName)T(t)?e.setStyle(n,t,r):e.setStyle(n,t);else if(n.children)for(var o=0;o<n.children.length;o++)Wf(e,n.children[o],t,r)},jf={remove_similar:!0,inherit:!1},Ff=K({selector:"td,th"},jf),Hf={tablecellbackgroundcolor:K({styles:{backgroundColor:"%value"}},Ff),tablecellverticalalign:K({styles:{"vertical-align":"%value"}},Ff),tablecellbordercolor:K({styles:{borderColor:"%value"}},Ff),tablecellclass:K({classes:["%value"]},Ff),tableclass:K({selector:"table",classes:["%value"]},jf),tablecellborderstyle:K({styles:{borderStyle:"%value"}},Ff),tablecellborderwidth:K({styles:{borderWidth:"%value"}},Ff)},Vf=Lr([{none:["current"]},{first:["current"]},{middle:["current","target"]},{last:["current"]}]),qf=K(K({},Vf),{none:function(e){return Vf.none(e=void 0===e?void 0:e)}}),Uf=function(e,n,t,r,o){void 0===o&&(o=x);var u=1===r;if(!u&&t<=0)return qf.first(e[0]);if(u&&t>=e.length-1)return qf.last(e[e.length-1]);var i=t+r,c=e[i];return o(c)?qf.middle(n,c):Uf(e,n,i,r,o)},Gf=function(e,n,t,r){return{start:e,soffset:n,finish:t,foffset:r}},$f=Lr([{before:["element"]},{on:["element","offset"]},{after:["element"]}]),Kf={before:$f.before,on:$f.on,after:$f.after,cata:function(e,n,t,r){return e.fold(n,t,r)},getStart:function(e){return e.fold(S,S,S)}},Xf=Lr([{domRange:["rng"]},{relative:["startSitu","finishSitu"]},{exact:["start","soffset","finish","foffset"]}]),Yf={domRange:Xf.domRange,relative:Xf.relative,exact:Xf.exact,exactFromRange:function(e){return Xf.exact(e.start,e.soffset,e.finish,e.foffset)},getWin:function(e){var n=e.match({domRange:function(e){return Ve.fromDom(e.startContainer)},relative:function(e,n){return Kf.getStart(e)},exact:function(e,n,t,r){return e}});return Ve.fromDom(tn(n).dom.defaultView)},range:Gf},Jf=function(e,n){return e.selectNodeContents(n.dom)},Qf=Lr([{ltr:["start","soffset","finish","foffset"]},{rtl:["start","soffset","finish","foffset"]}]);function Zf(e,n,t){return n>=e.left&&n<=e.right&&t>=e.top&&t<=e.bottom}function es(t,r,e,n,o){function l(e){var n=t.dom.createRange();return n.setStart(r.dom,e),n.collapse(!0),n}var u=Et(r).length,i=function(e,n,t,r){if(0===r)return 0;if(e===t)return r-1;for(var o=t,u=1;u<r;u++){var i=l(u).getBoundingClientRect(),c=Math.abs(e-i.left);if(n<=i.bottom){if(n<i.top||o<c)return u-1;o=c}}return 0}(e,n,o.right,u);return l(i)}function ns(e,n){return n-e.left<e.right-n}function ts(e,n,t){var r=e.dom.createRange();return r.selectNode(n.dom),r.collapse(t),r}function rs(n,e,t){var r=n.dom.createRange();r.selectNode(e.dom);var o=ns(r.getBoundingClientRect(),t);return(!0===o?Wo:jo)(e).map(function(e){return ts(n,e,o)})}function os(e,n,t){var r=ns(n.dom.getBoundingClientRect(),t);return q.some(ts(e,n,r))}function us(e,n){var t=Ye(e);return"input"===t?Kf.after(e):y(["br","img"],t)?0===n?Kf.before(e):Kf.after(e):Kf.on(e,n)}function is(e,n){var t=e.fold(Kf.before,us,Kf.after),r=n.fold(Kf.before,us,Kf.after);return Yf.relative(t,r)}function cs(e,n,t,r){var o=us(e,n),u=us(t,r);return Yf.relative(o,u)}function ls(e){return q.from(e.getSelection())}function as(e,n){ls(e).each(function(e){e.removeAllRanges(),e.addRange(n)})}function fs(e,n,t,r,o){as(e,Rl(e,n,t,r,o))}function ss(l,e){return Al(l,e).match({ltr:function(e,n,t,r){fs(l,e,n,t,r)},rtl:function(o,u,i,c){ls(l).each(function(e){if(e.setBaseAndExtent)e.setBaseAndExtent(o.dom,u,i.dom,c);else if(e.extend)try{t=i,r=c,(n=e).collapse(o.dom,u),n.extend(t.dom,r)}catch(e){fs(l,i,c,o,u)}else fs(l,i,c,o,u);var n,t,r})}})}function ms(e,n,t,r,o){ss(e,cs(n,t,r,o))}function ds(e,n,t){ss(e,is(n,t))}function gs(e){if(0<e.rangeCount){var n=e.getRangeAt(0),t=e.getRangeAt(e.rangeCount-1);return q.some(Gf(Ve.fromDom(n.startContainer),n.startOffset,Ve.fromDom(t.endContainer),t.endOffset))}return q.none()}function ps(e){if(null===e.anchorNode||null===e.focusNode)return gs(e);var n,t,r,o,u,i,c,l,a,f,s,m=Ve.fromDom(e.anchorNode),d=Ve.fromDom(e.focusNode);return n=m,t=e.anchorOffset,r=d,o=e.focusOffset,i=t,c=r,l=o,(a=nn(u=n).dom.createRange()).setStart(u.dom,i),a.setEnd(c.dom,l),f=a,s=ce(n,r)&&t===o,f.collapsed&&!s?q.some(Gf(m,e.anchorOffset,d,e.focusOffset)):gs(e)}function bs(e,n,t){as(e,((t=void 0===t||t)?Tl:Sl)(e,n))}function hs(e){return ls(e).filter(function(e){return 0<e.rangeCount}).bind(ps).map(function(e){return Yf.exact(e.start,e.soffset,e.finish,e.foffset)})}function vs(e,n,t){return Zs(e,n,(o=Nu,Cl(r=t,void 0).fold(function(){return qf.none(r)},function(e){return Uf(e.all,r,e.index,1,o)})));var r,o}function ws(e,n){var t=kl(e,n);return Gf(Ve.fromDom(t.startContainer),t.startOffset,Ve.fromDom(t.endContainer),t.endOffset)}function ys(e,n){return{item:e,mode:n}}function Cs(e,n,t,r){return void 0===r&&(r=Ks),e.property().parent(n).map(function(e){return ys(e,r)})}function Ss(n){return function(e){return 0===n.property().children(e).length}}function Ts(e,n){return am(sm,e,Ss(sm),n)}function xs(e,n){return fm(sm,e,Ss(sm),n)}function Rs(e){return In(e,"tr")}function Ds(e){return"br"===Ye(e)}function Os(e,n,t,r){var o,u,i,c,l,a,f;return(Ds(n)?(o=e,(i=r).traverse(u=n).orThunk(function(){return pm(u,i.gather,o)}).map(i.relative)):(c=e,l=r,an(a=n,f=t).filter(Ds).orThunk(function(){return an(a,f-1).filter(Ds)}).bind(function(e){return l.traverse(e).fold(function(){return pm(e,l.gather,c).map(l.relative)},function(e){return rn(r=e).bind(function(n){var t=ln(n);return gm(t,r).map(function(e){return{parent:n,children:t,element:r,index:e}})}).map(function(e){return Kf.on(e.parent,e.index)});var r})}))).map(function(e){return{start:e,finish:e}})}function As(e,n){return{left:e.left,top:e.top+n,right:e.right,bottom:e.bottom+n}}function ks(e,n){return{left:e.left,top:e.top-n,right:e.right,bottom:e.bottom-n}}function Is(e,n,t){return{left:e.left+n,top:e.top+t,right:e.right+n,bottom:e.bottom+t}}function Bs(e){return{left:e.left,top:e.top,right:e.right,bottom:e.bottom}}function Ms(e,n){return q.some(e.getRect(n))}function Es(e,n,t){return gn(n)?Ms(e,n).map(Bs):pn(n)?(r=e,o=n,(0<=(u=t)&&u<Lo(o)?r.getRangedRect(o,u,o,u+1):0<u?r.getRangedRect(o,u-1,o,u):q.none()).map(Bs)):q.none();var r,o,u}function Ps(e,n){return gn(n)?Ms(e,n).map(Bs):pn(n)?e.getRangedRect(n,0,n,Lo(n)).map(Bs):q.none()}function Ns(n,e,r){return Rn(function(e,n){return n(e)},Dn,e,gc,void 0).fold(v,function(e){return Ps(n,e).exists(function(e){return(n=r).left<(t=e).left||Math.abs(t.right-n.left)<1||n.left>t.right;var n,t})})}function zs(n,t,e){var r,o=n.move(e,5),u=vm(t,n,e,o,100).getOr(o),i=u,c=t;return((r=n).point(i)>c.getInnerHeight()?q.some(r.point(i)-c.getInnerHeight()):r.point(i)<0?q.some(-r.point(i)):q.none()).fold(function(){return t.situsFromPoint(u.left,n.point(u))},function(e){return t.scrollBy(0,e),t.situsFromPoint(u.left,n.point(u)-e)})}function Ls(a,f,s,e,m){return In(e,"td,th",f).bind(function(l){return In(l,"table",f).bind(function(e){return n=e,Dn(m,function(e){return rn(e).exists(function(e){return ce(e,n)})},void 0).isSome()?(o=t=a,u=r=f,i=c=s,o.getSelection().bind(function(r){return Os(u,r.finish,r.foffset,i).fold(function(){return q.some(hi(r.finish,r.foffset))},function(e){var n=o.fromSitus(e),t=dm.verify(o,r.finish,r.foffset,n.finish,n.foffset,i.failure,u);return dm.cata(t,function(e){return q.none()},function(){return q.none()},function(e){return q.some(hi(e,0))},function(e){return q.some(hi(e,Lo(e)))})})}).bind(function(e){return ym(t,r,e.element,e.offset,c,20).map(t.fromSitus)}).bind(function(n){return In(n.finish,"td,th",f).map(function(e){return{start:l,finish:e,range:n}})})):q.none();var o,u,i,n,t,r,c})})}function _s(e,n,t,r,o,u){return He().browser.isIE()?q.none():u(r,n).orThunk(function(){return Ls(e,n,t,r,o).map(function(e){var n=e.range;return nm(q.some(rm(n.start,n.soffset,n.finish,n.foffset)),!0)})})}function Ws(e,r){return In(e,"tr",r).bind(function(t){return In(t,"table",r).bind(function(e){var n=dn(e,"tr");return ce(t,n[0])?am(sm,e,function(e){return jo(e).isSome()},r).map(function(e){var n=Lo(e);return nm(q.some(rm(e,n,e,n)),!0)}):q.none()})})}function js(e,r){return In(e,"tr",r).bind(function(t){return In(t,"table",r).bind(function(e){var n=dn(e,"tr");return ce(t,n[n.length-1])?fm(sm,e,function(e){return Wo(e).isSome()},r).map(function(e){return nm(q.some(rm(e,0,e,0)),!0)}):q.none()})})}function Fs(e,n,t,r,o,u,i){return Ls(e,t,r,o,u).bind(function(e){return om(n,t,e.start,e.finish,i)})}function Hs(e,n){return In(e,"td,th",n)}function Vs(n){return function(e){return e===n}}function qs(e){return 37<=e&&e<=40}function Us(l){return{elementFromPoint:function(e,n){return Ve.fromPoint(Ve.fromDom(l.document),e,n)},getRect:function(e){return e.dom.getBoundingClientRect()},getRangedRect:function(e,n,t,r){var o,u,i,c=Yf.exact(e,n,t,r);return i=(o=kl(l,c)).getClientRects(),0<(u=0<i.length?i[0]:o.getBoundingClientRect()).width||0<u.height?q.some(u).map(Dl):q.none()},getSelection:function(){return hs(l).map(function(e){return ws(l,e)})},fromSitus:function(e){var n=Yf.relative(e.start,e.finish);return ws(l,n)},situsFromPoint:function(e,n){return t=e,r=n,o=Ve.fromDom(l.document),Js(o,t,r).map(function(e){return Gf(Ve.fromDom(e.startContainer),e.startOffset,Ve.fromDom(e.endContainer),e.endOffset)}).map(function(e){return tm(e.start,e.soffset,e.finish,e.foffset)});var t,r,o},clearSelection:function(){ls(l).each(function(e){return e.removeAllRanges()})},collapseSelection:function(i){void 0===i&&(i=!1),hs(l).each(function(e){return e.fold(function(e){return e.collapse(i)},function(e,n){var t=i?e:n;ds(l,t,t)},function(e,n,t,r){var o=i?e:t,u=i?n:r;ms(l,o,u,o,u)})})},setSelection:function(e){ms(l,e.start,e.soffset,e.finish,e.foffset)},setRelativeSelection:function(e,n){ds(l,e,n)},selectNode:function(e){bs(l,e,!1)},selectContents:function(e){bs(l,e)},getInnerHeight:function(){return l.innerHeight},getScrollY:function(){var e=Ve.fromDom(l.document),n=void 0!==e?e.dom:document,t=n.body.scrollLeft||n.documentElement.scrollLeft,r=n.body.scrollTop||n.documentElement.scrollTop;return uo(t,r).top},scrollBy:function(e,n){var t,r=e,o=n,u=Ve.fromDom(l.document);(t=(void 0!==u?u.dom:document).defaultView)&&t.scrollBy(r,o)}}}function Gs(e,n){return{rows:e,cols:n}}function $s(e){return!1===Mu(Ve.fromDom(e.target),"ephox-snooker-resizer-bar")}Qf.ltr,Qf.rtl;function Ks(e,n,t,r){return void 0===r&&(r=um),t.sibling(e,n).map(function(e){return ys(e,r)})}function Xs(o,u,n){function t(e){Wt(e,o.selected),Wt(e,o.firstSelected),Wt(e,o.lastSelected)}function i(e){Mn(e,o.selected,"1")}function c(e){r(e),n()}function r(e){A(dn(e,o.selectedSelector+","+o.firstSelectedSelector+","+o.lastSelectedSelector),t)}return{clearBeforeUpdate:r,clear:c,selectRange:function(e,n,t,r){c(e),A(n,i),Mn(t,o.firstSelected,"1"),Mn(r,o.lastSelected,"1"),u(n,t,r)},selectedSelector:o.selectedSelector,firstSelectedSelector:o.firstSelectedSelector,lastSelectedSelector:o.lastSelectedSelector}}var Ys=function(e,n,t,r){return pn(n)?(u=n,i=t,c=r,(l=(o=e).dom.createRange()).selectNode(u.dom),H(l.getClientRects(),function(e){return Zf(e,i,c)?q.some(e):q.none()}).map(function(e){return es(o,u,i,c,e)})):(f=n,s=t,m=r,d=(a=e).dom.createRange(),H(ln(f),function(e){return d.selectNode(e.dom),Zf(d.getBoundingClientRect(),s,m)?Ys(a,e,s,m):q.none()}));var o,u,i,c,l,a,f,s,m,d},Js=document.caretPositionFromPoint?function(t,e,n){var r,o;return q.from(null===(o=(r=t.dom).caretPositionFromPoint)||void 0===o?void 0:o.call(r,e,n)).bind(function(e){if(null===e.offsetNode)return q.none();var n=t.dom.createRange();return n.setStart(e.offsetNode,e.offset),n.collapse(),q.some(n)})}:document.caretRangeFromPoint?function(e,n,t){var r,o;return q.from(null===(o=(r=e.dom).caretRangeFromPoint)||void 0===o?void 0:o.call(r,n,t))}:function(o,u,n){return Ve.fromPoint(o,u,n).bind(function(r){function e(){return e=o,t=u,(0===ln(n=r).length?os:rs)(e,n,t);var e,n,t}return 0===ln(r).length?e():function(e,n,t,r){var o=e.dom.createRange();o.selectNode(n.dom);var u=o.getBoundingClientRect();return function(e,n,t,r){var o=e.dom.createRange();o.selectNode(n.dom);var u=o.getBoundingClientRect(),i=Math.max(u.left,Math.min(u.right,t)),c=Math.max(u.top,Math.min(u.bottom,r));return Ys(e,n,i,c)}(e,n,Math.max(u.left,Math.min(u.right,t)),Math.max(u.top,Math.min(u.bottom,r)))}(o,r,u,n).orThunk(e)})},Qs=tinymce.util.Tools.resolve("tinymce.util.VK"),Zs=function(n,t,e){return e.fold(q.none,q.none,function(e,n){return Wo(n).map(function(e){return u=Yf.exact(e,0,e,0),t=u,o=Yf.getWin(t).dom,r=t.match({domRange:function(e){var n=Ve.fromDom(e.startContainer),t=Ve.fromDom(e.endContainer);return cs(n,e.startOffset,t,e.endOffset)},relative:is,exact:cs}),Al(o,r).match({ltr:n,rtl:n});function n(e,n,t,r){return Rl(o,e,n,t,r)}var t,o,r,u})},function(e){return n.execCommand("mceTableInsertRowAfter"),vs(n,t,e)})},em=["table","li","dl"],nm=function(e,n){return{selection:e,kill:n}},tm=function(e,n,t,r){return{start:Kf.on(e,n),finish:Kf.on(t,r)}},rm=tm,om=function(t,e,r,n,o){return ce(r,n)?q.none():tr(r,n,e).bind(function(e){var n=e.boxes.getOr([]);return 1<n.length?(o(t,n,e.start,e.finish),q.some(nm(q.some(rm(r,0,r,Lo(r))),!0))):q.none()})},um=function(e,n,t,r){void 0===r&&(r=um);var o=e.property().children(n);return t.first(o).map(function(e){return ys(e,r)})},im=[{current:Cs,next:Ks,fallback:q.none()},{current:Ks,next:um,fallback:q.some(Cs)},{current:um,next:um,fallback:q.some(Ks)}],cm=function(n,t,r,o,e){return w(e=void 0===e?im:e,function(e){return e.current===r}).bind(function(e){return e.current(n,t,o,e.next).orThunk(function(){return e.fallback.bind(function(e){return cm(n,t,e,o)})})})},lm=function(n,e,t,r,o,u){return cm(n,e,r,o).bind(function(e){return u(e.item)?q.none():t(e.item)?q.some(e.item):lm(n,e.item,t,e.mode,o,u)})},am=function(e,n,t,r){return lm(e,n,t,Ks,{sibling:function(e,n){return e.query().prevSibling(n)},first:function(e){return 0<e.length?q.some(e[e.length-1]):q.none()}},r)},fm=function(e,n,t,r){return lm(e,n,t,Ks,{sibling:function(e,n){return e.query().nextSibling(n)},first:function(e){return 0<e.length?q.some(e[0]):q.none()}},r)},sm=Zt(),mm=Lr([{none:["message"]},{success:[]},{failedUp:["cell"]},{failedDown:["cell"]}]),dm=K(K({},mm),{verify:function(i,e,n,t,r,c,o){return In(t,"td,th",o).bind(function(u){return In(e,"td,th",o).map(function(o){return ce(u,o)?ce(t,u)&&Lo(u)===r?c(o):mm.none("in same cell"):er(Rs,[u,o]).fold(function(){return n=u,t=(e=i).getRect(o),(r=e.getRect(n)).right>t.left&&r.left<t.right?mm.success():c(o);var e,n,t,r},function(e){return c(o)})})}).getOr(mm.none("default"))},cata:function(e,n,t,r,o){return e.fold(n,t,r,o)}}),gm=function(e,n){return b(e,P(ce,n))},pm=function(e,n,t){return n(e,t).bind(function(e){return pn(e)&&0===Et(e).trim().length?pm(e,n,t):q.some(e)})},bm=Lr([{none:[]},{retry:["caret"]}]),hm={point:function(e){return e.bottom},adjuster:function(e,n,t,r,o){var u=As(o,5);return Math.abs(t.bottom-r.bottom)<1||t.top>o.bottom?bm.retry(u):t.top===o.bottom?bm.retry(As(o,1)):Ns(e,n,o)?bm.retry(Is(u,5,0)):bm.none()},move:As,gather:xs},vm=function(t,r,o,u,i){return 0===i?q.some(u):(n=t,c=u.left,l=r.point(u),n.elementFromPoint(c,l).filter(function(e){return"table"===Ye(e)}).isSome()?(e=i-1,vm(t,r,o,r.move(u,5),e)):t.situsFromPoint(u.left,r.point(u)).bind(function(e){return e.start.fold(q.none,function(n){return Ps(t,n).bind(function(e){return r.adjuster(t,n,e,o,u).fold(q.none,function(e){return vm(t,r,o,e,i-1)})}).orThunk(function(){return q.some(u)})},q.none)}));var e,n,c,l},wm={tryUp:P(zs,{point:function(e){return e.top},adjuster:function(e,n,t,r,o){var u=ks(o,5);return Math.abs(t.top-r.top)<1||t.bottom<o.top?bm.retry(u):t.bottom===o.top?bm.retry(ks(o,1)):Ns(e,n,o)?bm.retry(Is(u,5,0)):bm.none()},move:ks,gather:Ts}),tryDown:P(zs,hm),ieTryUp:function(e,n){return e.situsFromPoint(n.left,n.top-5)},ieTryDown:function(e,n){return e.situsFromPoint(n.left,n.bottom+5)},getJumpSize:C(5)},ym=function(r,o,u,i,c,l){return 0===l?q.none():Tm(r,o,u,i,c).bind(function(e){var n=r.fromSitus(e),t=dm.verify(r,u,i,n.finish,n.foffset,c.failure,o);return dm.cata(t,function(){return q.none()},function(){return q.some(e)},function(e){return ce(u,e)&&0===i?Cm(r,u,i,ks,c):ym(r,o,e,0,c,l-1)},function(e){return ce(u,e)&&i===Lo(e)?Cm(r,u,i,As,c):ym(r,o,e,Lo(e),c,l-1)})})},Cm=function(n,e,t,r,o){return Es(n,e,t).bind(function(e){return Sm(n,o,r(e,wm.getJumpSize()))})},Sm=function(e,n,t){var r=He().browser;return r.isChrome()||r.isSafari()||r.isFirefox()||r.isEdge()?n.otherRetry(e,t):r.isIE()?n.ieRetry(e,t):q.none()},Tm=function(n,e,t,r,o){return Es(n,t,r).bind(function(e){return Sm(n,o,e)})},xm={traverse:cn,gather:xs,relative:Kf.before,otherRetry:wm.tryDown,ieRetry:wm.ieTryDown,failure:dm.failedDown},Rm={traverse:un,gather:Ts,relative:Kf.before,otherRetry:wm.tryUp,ieRetry:wm.ieTryUp,failure:dm.failedUp},Dm=Vs(38),Om=Vs(40),Am={isBackward:Vs(37),isForward:Vs(39)},km={isBackward:Vs(39),isForward:Vs(37)},Im=tinymce.util.Tools.resolve("tinymce.Env");function Bm(I,B,e){var M=Xs(Xl,function(l,a,f){e.targets().each(function(c){rt(a).each(function(e){var n,o,u,t=fi(I),r=$o(E,Ve.fromDom(I.getDoc()),t),i=(n=c,o=r,_i(u=$t.fromTable(e),n).map(function(e){var n,t,r=Mi(u,o,!1);return{upOrLeftCells:N(Ei(r.slice(0,(n=e)[n.length-1].row+1)),function(e){return O(e.cells.slice(0,n[n.length-1].column+1),function(e){return e.element})}),downOrRightCells:N(Ei(r.slice((t=e)[0].row+t[0].rowspan-1,r.length)),function(e){return O(e.cells.slice(t[0].column+t[0].colspan-1,e.cells.length),function(e){return e.element})})}}));I.fire("TableSelectionChange",{cells:l,start:a,finish:f,otherCells:i})})})},function(){I.fire("TableSelectionClear")});return I.on("init",function(e){var n,t,r,o,u,i,m,d,g,a,c,l,f,s,p,b,h=I.getWin(),v=Yo(I),w=Zo(I),y=(n=Us(h),{clearstate:(c=n,l=v,f=w,s=M,p=Jc(),(t={clearstate:b=p.clear,mousedown:function(e){s.clear(l),Hs(e.target,f).each(p.set)},mouseover:function(e){x(e)},mouseup:function(e){x(e),b()}}).clearstate),mousedown:t.mousedown,mouseover:t.mouseover,mouseup:t.mouseup}),C=(a=Us(h),{keydown:function(e,n,t,r,o,i){var u=e.raw,c=u.which,l=!0===u.shiftKey;return rr(m,g.selectedSelector).fold(function(){return qs(c)&&!l&&g.clearBeforeUpdate(m),Om(c)&&l?P(Fs,a,m,d,xm,r,n,g.selectRange):Dm(c)&&l?P(Fs,a,m,d,Rm,r,n,g.selectRange):Om(c)?P(_s,a,d,xm,r,n,js):Dm(c)?P(_s,a,d,Rm,r,n,Ws):q.none},function(u){function e(e){return function(){return H(e,function(e){return n=e.rows,t=e.cols,r=m,ur(u,n,t,(o=g).firstSelectedSelector,o.lastSelectedSelector).map(function(e){return o.clearBeforeUpdate(r),o.selectRange(r,e.boxes,e.start,e.finish),e.boxes});var n,t,r,o}).fold(function(){return or(m,g.firstSelectedSelector,g.lastSelectedSelector).map(function(e){var n=Om(c)||i.isForward(c)?Kf.after:Kf.before;return a.setRelativeSelection(Kf.on(e.first,0),n(e.table)),g.clear(m),nm(q.none(),!0)})},function(e){return q.some(nm(q.none(),!0))})}}return Om(c)&&l?e([Gs(1,0)]):Dm(c)&&l?e([Gs(-1,0)]):i.isBackward(c)&&l?e([Gs(0,-1),Gs(-1,0)]):i.isForward(c)&&l?e([Gs(0,1),Gs(1,0)]):qs(c)&&!l?T:q.none})()},keyup:function(c,l,a,f,s){return rr(m,g.selectedSelector).fold(function(){var t,r,e,o,u,n=c.raw,i=n.which;return!0===n.shiftKey&&qs(i)?(t=m,r=d,u=g.selectRange,ce(e=l,o=f)&&a===s?q.none():In(e,"td,th",r).bind(function(n){return In(o,"td,th",r).bind(function(e){return om(t,r,n,e,u)})})):q.none()},q.none)}}),S=(r=m=v,o=d=w,u=g=M,i=Us(h),function(e,t){u.clearBeforeUpdate(r),tr(e,t,o).each(function(e){var n=e.boxes.getOr([]);u.selectRange(r,n,e.start,e.finish),i.selectContents(t),i.collapseSelection()})});function T(){return g.clear(m),q.none()}function x(i){p.on(function(e){s.clearBeforeUpdate(l),Hs(i.target,f).each(function(u){tr(e,u,f).each(function(e){var n,t,r,o=e.boxes.getOr([]);1===o.length?(n=o[0],t="false"===pa(n),r=Ln(Pu(i.target),n,ce),t&&r&&(s.selectRange(l,o,n,n),c.selectContents(n))):1<o.length&&(s.selectRange(l,o,e.start,e.finish),c.selectContents(u))})})})}function R(e,n){!0===e.raw.shiftKey&&(n.kill&&e.kill(),n.selection.each(function(e){var n=Yf.relative(e.start,e.finish),t=kl(h,n);I.selection.setRng(t)}))}function D(e){return 0===e.button}I.on("TableSelectorChange",function(e){return S(e.start,e.finish)});var O,A,k=(O=Xc(Ve.fromDom(v)),A=Xc(0),{touchEnd:function(e){var n,t,r=Ve.fromDom(e.target);"td"!==Ye(r)&&"th"!==Ye(r)||(n=O.get(),t=A.get(),ce(n,r)&&e.timeStamp-t<300&&(e.preventDefault(),S(r,r))),O.set(r),A.set(e.timeStamp)}});I.on("dragstart",function(e){y.clearstate()}),I.on("mousedown",function(e){D(e)&&$s(e)&&y.mousedown(ma(e))}),I.on("mouseover",function(e){var n;(void 0===(n=e).buttons||Im.browser.isEdge()&&0===n.buttons||0!=(1&n.buttons))&&$s(e)&&y.mouseover(ma(e))}),I.on("mouseup",function(e){D(e)&&$s(e)&&y.mouseup(ma(e))}),I.on("touchend",k.touchEnd),I.on("keyup",function(e){var n,t,r,o=ma(e);o.raw.shiftKey&&qs(o.raw.which)&&(n=I.selection.getRng(),t=Ve.fromDom(n.startContainer),r=Ve.fromDom(n.endContainer),C.keyup(o,t,n.startOffset,r,n.endOffset).each(function(e){R(o,e)}))}),I.on("keydown",function(e){var n=ma(e);B().each(function(e){return e.hideBars()});var t=I.selection.getRng(),r=Ve.fromDom(t.startContainer),o=Ve.fromDom(t.endContainer),u=Sr(Am,km)(Ve.fromDom(I.selection.getStart()));C.keydown(n,r,t.startOffset,o,t.endOffset,u).each(function(e){R(n,e)}),B().each(function(e){return e.showBars()})}),I.on("NodeChange",function(){var e=I.selection;er(rt,[Ve.fromDom(e.getStart()),Ve.fromDom(e.getEnd())]).fold(function(){return M.clear(v)},E)})}),{clear:M.clear}}function Mm(o,u){function n(n){return d.forall(function(e){return!e[n]})}function e(){return Yl(tu(o),Zo(o)).bind(function(r){return Wn(rt(r),Yl(Ve.fromDom(o.selection.getEnd()),Zo(o)).bind(rt),function(e,n){return ce(e,n)?g(r)?q.some({element:t=r,mergable:q.none(),unmergable:q.none(),selection:[t]}):q.some(ou(u,e,r)):q.none();var t}).bind(S)})}function t(r){return rt(r.element).map(function(e){var t=$t.fromTable(e),n=B(_i(t,r).getOr([]),function(e,n){return n.isLocked&&(e.onAny=!0,0===n.column?e.onFirst=!0:n.column+n.colspan>=t.grid.columns&&(e.onLast=!0)),e},{onAny:!1,onFirst:!1,onLast:!1});return{mergeable:Fi(t,r).isSome(),unmergeable:Hi(t,r).isSome(),locked:n}})}function r(){s.set(Y(e)()),d=s.get().bind(t),A(m.get(),function(e){return e()})}function i(n){return n(),m.set(m.get().concat([n])),function(){m.set(k(m.get(),function(e){return e!==n}))}}function c(n,t){return i(function(){return s.get().fold(function(){n.setDisabled(!0)},function(e){n.setDisabled(t(e))})})}function l(n,t,r){return i(function(){return s.get().fold(function(){n.setDisabled(!0),n.setActive(!1)},function(e){n.setDisabled(t(e)),n.setActive(r(e))})})}function a(n){return d.exists(function(e){return e.locked[n]})}function f(n,t){return function(e){return l(e,function(e){return g(e.element)},function(){return o.queryCommandValue(n)===t})}}var s=Xc(q.none()),m=Xc([]),d=q.none(),g=en("caption"),p=f("mceTableRowType","header"),b=f("mceTableColType","th");return o.on("NodeChange ExecCommand TableSelectorChange",r),{onSetupTable:function(e){return c(e,function(e){return!1})},onSetupCellOrRow:function(e){return c(e,function(e){return g(e.element)})},onSetupColumn:function(n){return function(e){return c(e,function(e){return g(e.element)||a(n)})}},onSetupPasteable:function(n){return function(e){return c(e,function(e){return g(e.element)||n().isNone()})}},onSetupPasteableColumn:function(n,t){return function(e){return c(e,function(e){return g(e.element)||n().isNone()||a(t)})}},onSetupMergeable:function(e){return c(e,function(e){return n("mergeable")})},onSetupUnmergeable:function(e){return c(e,function(e){return n("unmergeable")})},resetTargets:r,onSetupTableWithCaption:function(e){return l(e,v,function(e){return rt(e.element,Zo(o)).exists(function(e){return An(e,"caption").isSome()})})},onSetupTableRowHeaders:p,onSetupTableColumnHeaders:b,targets:s.get}}Yr.add("table",function(c){var e,n,t,r,o,u,i,l,a,f,s,m,d=(e=function(){return Yo(c)},n=function(){return Jl(tu(c),Zo(c))},t=Xl.selectedSelector,{get:function(){return Ur(e(),t).fold(function(){return n().fold($r,Xr)},function(e){return Kr(e)})}}),g=Mm(c,d),p=bi(c),b=Bm(c,p.lazyResize,g),h=Ec(c,b,p.lazyWire),v=(r=Jc(),o=Jc(),{getRows:r.get,setRows:function(e){e.fold(r.clear,r.set),o.clear()},clearRows:r.clear,getColumns:o.get,setColumns:function(e){e.fold(o.clear,o.set),r.clear()},clearColumns:o.clear});return yl(c,h,0,d,v),f=h,s=d,m=Zo(a=c),ae({mceTableRowType:function(){return w(f.getTableRowType)},mceTableCellType:function(){return w(f.getTableCellType)},mceTableColType:function(){return w(f.getTableColType)}},function(e,n){return a.addQueryValueHandler(n,e)}),iu(c,d,h),function(n,e,t,r){function o(e){return function(){return n.execCommand(e)}}function u(e){n.execCommand("mceInsertTable",!1,{rows:e.numRows,columns:e.numColumns})}var i={text:"Table properties",onSetup:t.onSetupTable,onAction:o("mceTableProps")},c={text:"Delete table",icon:"table-delete-table",onSetup:t.onSetupTable,onAction:o("mceTableDelete")};n.ui.registry.addMenuItem("tableinsertrowbefore",{text:"Insert row before",icon:"table-insert-row-above",onAction:o("mceTableInsertRowBefore"),onSetup:t.onSetupCellOrRow}),n.ui.registry.addMenuItem("tableinsertrowafter",{text:"Insert row after",icon:"table-insert-row-after",onAction:o("mceTableInsertRowAfter"),onSetup:t.onSetupCellOrRow}),n.ui.registry.addMenuItem("tabledeleterow",{text:"Delete row",icon:"table-delete-row",onAction:o("mceTableDeleteRow"),onSetup:t.onSetupCellOrRow}),n.ui.registry.addMenuItem("tablerowprops",{text:"Row properties",icon:"table-row-properties",onAction:o("mceTableRowProps"),onSetup:t.onSetupCellOrRow}),n.ui.registry.addMenuItem("tablecutrow",{text:"Cut row",icon:"cut-row",onAction:o("mceTableCutRow"),onSetup:t.onSetupCellOrRow}),n.ui.registry.addMenuItem("tablecopyrow",{text:"Copy row",icon:"duplicate-row",onAction:o("mceTableCopyRow"),onSetup:t.onSetupCellOrRow}),n.ui.registry.addMenuItem("tablepasterowbefore",{text:"Paste row before",icon:"paste-row-before",onAction:o("mceTablePasteRowBefore"),onSetup:t.onSetupPasteable(r.getRows)}),n.ui.registry.addMenuItem("tablepasterowafter",{text:"Paste row after",icon:"paste-row-after",onAction:o("mceTablePasteRowAfter"),onSetup:t.onSetupPasteable(r.getRows)});var l={type:"nestedmenuitem",text:"Row",getSubmenuItems:C("tableinsertrowbefore tableinsertrowafter tabledeleterow tablerowprops | tablecutrow tablecopyrow tablepasterowbefore tablepasterowafter")};n.ui.registry.addMenuItem("tableinsertcolumnbefore",{text:"Insert column before",icon:"table-insert-column-before",onAction:o("mceTableInsertColBefore"),onSetup:t.onSetupColumn("onFirst")}),n.ui.registry.addMenuItem("tableinsertcolumnafter",{text:"Insert column after",icon:"table-insert-column-after",onAction:o("mceTableInsertColAfter"),onSetup:t.onSetupColumn("onLast")}),n.ui.registry.addMenuItem("tabledeletecolumn",{text:"Delete column",icon:"table-delete-column",onAction:o("mceTableDeleteCol"),onSetup:t.onSetupColumn("onAny")}),n.ui.registry.addMenuItem("tablecutcolumn",{text:"Cut column",icon:"cut-column",onAction:o("mceTableCutCol"),onSetup:t.onSetupColumn("onAny")}),n.ui.registry.addMenuItem("tablecopycolumn",{text:"Copy column",icon:"duplicate-column",onAction:o("mceTableCopyCol"),onSetup:t.onSetupColumn("onAny")}),n.ui.registry.addMenuItem("tablepastecolumnbefore",{text:"Paste column before",icon:"paste-column-before",onAction:o("mceTablePasteColBefore"),onSetup:t.onSetupPasteableColumn(r.getColumns,"onFirst")}),n.ui.registry.addMenuItem("tablepastecolumnafter",{text:"Paste column after",icon:"paste-column-after",onAction:o("mceTablePasteColAfter"),onSetup:t.onSetupPasteableColumn(r.getColumns,"onLast")});var a={type:"nestedmenuitem",text:"Column",getSubmenuItems:C("tableinsertcolumnbefore tableinsertcolumnafter tabledeletecolumn | tablecutcolumn tablecopycolumn tablepastecolumnbefore tablepastecolumnafter")};n.ui.registry.addMenuItem("tablecellprops",{text:"Cell properties",icon:"table-cell-properties",onAction:o("mceTableCellProps"),onSetup:t.onSetupCellOrRow}),n.ui.registry.addMenuItem("tablemergecells",{text:"Merge cells",icon:"table-merge-cells",onAction:o("mceTableMergeCells"),onSetup:t.onSetupMergeable}),n.ui.registry.addMenuItem("tablesplitcells",{text:"Split cell",icon:"table-split-cells",onAction:o("mceTableSplitCells"),onSetup:t.onSetupUnmergeable});var f={type:"nestedmenuitem",text:"Cell",getSubmenuItems:C("tablecellprops tablemergecells tablesplitcells")};!1===n.getParam("table_grid",!0,"boolean")?n.ui.registry.addMenuItem("inserttable",{text:"Table",icon:"table",onAction:o("mceInsertTable")}):n.ui.registry.addNestedMenuItem("inserttable",{text:"Table",icon:"table",getSubmenuItems:function(){return[{type:"fancymenuitem",fancytype:"inserttable",onAction:u}]}}),n.ui.registry.addMenuItem("inserttabledialog",{text:"Insert table",icon:"table",onAction:o("mceInsertTable")}),n.ui.registry.addMenuItem("tableprops",i),n.ui.registry.addMenuItem("deletetable",c),n.ui.registry.addNestedMenuItem("row",l),n.ui.registry.addNestedMenuItem("column",a),n.ui.registry.addNestedMenuItem("cell",f),n.ui.registry.addContextMenu("table",{update:function(){return t.resetTargets(),t.targets().fold(C(""),function(e){return"caption"===Ye(e.element)?"tableprops deletetable":"cell row column | advtablesort | tableprops deletetable"})}});var s=Ef(oi(n));0!==s.length&&n.ui.registry.addNestedMenuItem("tableclass",{icon:"table-classes",text:"Table styles",getSubmenuItems:function(){return Mf(n,e,s,"tableclass",function(e){return n.execCommand("mceTableToggleClass",!1,e)})},onSetup:t.onSetupTable});var m=Ef(ri(n));0!==m.length&&n.ui.registry.addNestedMenuItem("tablecellclass",{icon:"table-cell-classes",text:"Cell styles",getSubmenuItems:function(){return Mf(n,e,m,"tablecellclass",function(e){return n.execCommand("mceTableCellToggleClass",!1,e)})},onSetup:t.onSetupCellOrRow}),n.ui.registry.addNestedMenuItem("tablecellvalign",{icon:"vertical-align",text:"Vertical align",getSubmenuItems:function(){return Mf(n,e,Df,"tablecellverticalalign",Zc(n,"vertical-align"))},onSetup:t.onSetupCellOrRow}),n.ui.registry.addNestedMenuItem("tablecellborderwidth",{icon:"border-width",text:"Border width",getSubmenuItems:function(){return Mf(n,e,Xu(n),"tablecellborderwidth",Zc(n,"border-width"))},onSetup:t.onSetupCellOrRow}),n.ui.registry.addNestedMenuItem("tablecellborderstyle",{icon:"border-style",text:"Border style",getSubmenuItems:function(){return Mf(n,e,Yu(n),"tablecellborderstyle",Zc(n,"border-style"))},onSetup:t.onSetupCellOrRow}),n.ui.registry.addToggleMenuItem("tablecaption",{icon:"table-caption",text:"Table caption",onAction:o("mceTableToggleCaption"),onSetup:t.onSetupTableWithCaption}),n.ui.registry.addNestedMenuItem("tablecellbackgroundcolor",{icon:"cell-background-color",text:"Background color",getSubmenuItems:function(){return nl(n,si(n),"background-color")},onSetup:t.onSetupCellOrRow}),n.ui.registry.addNestedMenuItem("tablecellbordercolor",{icon:"cell-border-color",text:"Border color",getSubmenuItems:function(){return nl(n,mi(n),"border-color")},onSetup:t.onSetupCellOrRow}),n.ui.registry.addToggleMenuItem("tablerowheader",{text:"Row header",icon:"table-top-header",onAction:tl(n),onSetup:t.onSetupTableRowHeaders}),n.ui.registry.addToggleMenuItem("tablecolheader",{text:"Column header",icon:"table-left-header",onAction:rl(n),onSetup:t.onSetupTableColumnHeaders})}(c,d,g,v),function(n,e,t,r){function o(e){return function(){return n.execCommand(e)}}n.ui.registry.addMenuButton("table",{tooltip:"Table",icon:"table",fetch:function(e){return e("inserttable | cell row column | advtablesort | tableprops deletetable")}}),n.ui.registry.addButton("tableprops",{tooltip:"Table properties",onAction:o("mceTableProps"),icon:"table",onSetup:t.onSetupTable}),n.ui.registry.addButton("tabledelete",{tooltip:"Delete table",onAction:o("mceTableDelete"),icon:"table-delete-table",onSetup:t.onSetupTable}),n.ui.registry.addButton("tablecellprops",{tooltip:"Cell properties",onAction:o("mceTableCellProps"),icon:"table-cell-properties",onSetup:t.onSetupCellOrRow}),n.ui.registry.addButton("tablemergecells",{tooltip:"Merge cells",onAction:o("mceTableMergeCells"),icon:"table-merge-cells",onSetup:t.onSetupMergeable}),n.ui.registry.addButton("tablesplitcells",{tooltip:"Split cell",onAction:o("mceTableSplitCells"),icon:"table-split-cells",onSetup:t.onSetupUnmergeable}),n.ui.registry.addButton("tableinsertrowbefore",{tooltip:"Insert row before",onAction:o("mceTableInsertRowBefore"),icon:"table-insert-row-above",onSetup:t.onSetupCellOrRow}),n.ui.registry.addButton("tableinsertrowafter",{tooltip:"Insert row after",onAction:o("mceTableInsertRowAfter"),icon:"table-insert-row-after",onSetup:t.onSetupCellOrRow}),n.ui.registry.addButton("tabledeleterow",{tooltip:"Delete row",onAction:o("mceTableDeleteRow"),icon:"table-delete-row",onSetup:t.onSetupCellOrRow}),n.ui.registry.addButton("tablerowprops",{tooltip:"Row properties",onAction:o("mceTableRowProps"),icon:"table-row-properties",onSetup:t.onSetupCellOrRow}),n.ui.registry.addButton("tableinsertcolbefore",{tooltip:"Insert column before",onAction:o("mceTableInsertColBefore"),icon:"table-insert-column-before",onSetup:t.onSetupColumn("onFirst")}),n.ui.registry.addButton("tableinsertcolafter",{tooltip:"Insert column after",onAction:o("mceTableInsertColAfter"),icon:"table-insert-column-after",onSetup:t.onSetupColumn("onLast")}),n.ui.registry.addButton("tabledeletecol",{tooltip:"Delete column",onAction:o("mceTableDeleteCol"),icon:"table-delete-column",onSetup:t.onSetupColumn("onAny")}),n.ui.registry.addButton("tablecutrow",{tooltip:"Cut row",icon:"cut-row",onAction:o("mceTableCutRow"),onSetup:t.onSetupCellOrRow}),n.ui.registry.addButton("tablecopyrow",{tooltip:"Copy row",icon:"duplicate-row",onAction:o("mceTableCopyRow"),onSetup:t.onSetupCellOrRow}),n.ui.registry.addButton("tablepasterowbefore",{tooltip:"Paste row before",icon:"paste-row-before",onAction:o("mceTablePasteRowBefore"),onSetup:t.onSetupPasteable(r.getRows)}),n.ui.registry.addButton("tablepasterowafter",{tooltip:"Paste row after",icon:"paste-row-after",onAction:o("mceTablePasteRowAfter"),onSetup:t.onSetupPasteable(r.getRows)}),n.ui.registry.addButton("tablecutcol",{tooltip:"Cut column",icon:"cut-column",onAction:o("mceTableCutCol"),onSetup:t.onSetupColumn("onAny")}),n.ui.registry.addButton("tablecopycol",{tooltip:"Copy column",icon:"duplicate-column",onAction:o("mceTableCopyCol"),onSetup:t.onSetupColumn("onAny")}),n.ui.registry.addButton("tablepastecolbefore",{tooltip:"Paste column before",icon:"paste-column-before",onAction:o("mceTablePasteColBefore"),onSetup:t.onSetupPasteableColumn(r.getColumns,"onFirst")}),n.ui.registry.addButton("tablepastecolafter",{tooltip:"Paste column after",icon:"paste-column-after",onAction:o("mceTablePasteColAfter"),onSetup:t.onSetupPasteableColumn(r.getColumns,"onLast")}),n.ui.registry.addButton("tableinsertdialog",{tooltip:"Insert table",onAction:o("mceInsertTable"),icon:"table"});var u=Ef(oi(n));0!==u.length&&n.ui.registry.addMenuButton("tableclass",{icon:"table-classes",tooltip:"Table styles",fetch:el(n,e,u,"tableclass",function(e){return n.execCommand("mceTableToggleClass",!1,e)}),onSetup:t.onSetupTable});var i=Ef(ri(n));0!==i.length&&n.ui.registry.addMenuButton("tablecellclass",{icon:"table-cell-classes",tooltip:"Cell styles",fetch:el(n,e,i,"tablecellclass",function(e){return n.execCommand("mceTableCellToggleClass",!1,e)}),onSetup:t.onSetupCellOrRow}),n.ui.registry.addMenuButton("tablecellvalign",{icon:"vertical-align",tooltip:"Vertical align",fetch:el(n,e,Df,"tablecellverticalalign",Zc(n,"vertical-align")),onSetup:t.onSetupCellOrRow}),n.ui.registry.addMenuButton("tablecellborderwidth",{icon:"border-width",tooltip:"Border width",fetch:el(n,e,Xu(n),"tablecellborderwidth",Zc(n,"border-width")),onSetup:t.onSetupCellOrRow}),n.ui.registry.addMenuButton("tablecellborderstyle",{icon:"border-style",tooltip:"Border style",fetch:el(n,e,Yu(n),"tablecellborderstyle",Zc(n,"border-style")),onSetup:t.onSetupCellOrRow}),n.ui.registry.addToggleButton("tablecaption",{tooltip:"Table caption",onAction:o("mceTableToggleCaption"),icon:"table-caption",onSetup:t.onSetupTableWithCaption}),n.ui.registry.addMenuButton("tablecellbackgroundcolor",{icon:"cell-background-color",tooltip:"Background color",fetch:function(e){return e(nl(n,si(n),"background-color"))},onSetup:t.onSetupCellOrRow}),n.ui.registry.addMenuButton("tablecellbordercolor",{icon:"cell-border-color",tooltip:"Border color",fetch:function(e){return e(nl(n,mi(n),"border-color"))},onSetup:t.onSetupCellOrRow}),n.ui.registry.addToggleButton("tablerowheader",{tooltip:"Row header",icon:"table-top-header",onAction:tl(n),onSetup:t.onSetupTableRowHeaders}),n.ui.registry.addToggleButton("tablecolheader",{tooltip:"Column header",icon:"table-left-header",onAction:rl(n),onSetup:t.onSetupTableColumnHeaders})}(c,d,g,v),0<(l=(i=c).getParam("table_toolbar","tableprops tabledelete | tableinsertrowbefore tableinsertrowafter tabledeleterow | tableinsertcolbefore tableinsertcolafter tabledeletecol")).length&&i.ui.registry.addContextToolbar("table",{predicate:function(e){return i.dom.is(e,"table")&&i.getBody().contains(e)},items:l,scope:"node",position:"node"}),c.on("PreInit",function(){c.serializer.addTempAttr(Xl.firstSelected),c.serializer.addTempAttr(Xl.lastSelected),c.formatter.register(Hf)}),c.getParam("table_tab_navigation",!0,"boolean")&&c.on("keydown",function(e){var n,t,r,o,u=c,i=b;(n=e).keyCode===Qs.TAB&&(t=Yo(u),r=function(e){var n=Ye(e);return ce(e,t)||y(em,n)},o=u.selection.getRng(),et(Ve.fromDom(n.shiftKey?o.startContainer:o.endContainer),r).each(function(e){n.preventDefault(),rt(e,r).each(i.clear),u.selection.collapse(n.shiftKey),(n.shiftKey?function(e,n,t){return Zs(e,n,(o=Nu,Cl(r=t,void 0).fold(function(){return qf.none()},function(e){return Uf(e.all,r,e.index,-1,o)})));var r,o}:vs)(u,r,e).each(function(e){u.selection.setRng(e)})}))}),c.on("remove",function(){p.destroy()}),{insertTable:(u=c,function(e,n,t){var r=Lc(u,n,e,t=void 0===t?{}:t,"Invalid values for insertTable - rows and columns values are required to insert a table.");return u.undoManager.add(),r}),setClipboardRows:Wc(v.setRows),getClipboardRows:_c(v.getRows),setClipboardCols:Wc(v.setColumns),getClipboardCols:_c(v.getColumns),resizeHandler:p,selectionTargets:g};function w(r){return Jl(tu(a)).bind(function(t){return rt(t,m).map(function(e){var n=ou(s,e,t);return r(e,n)})}).getOr("")}})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/template/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/template/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..19c97b7899b86ca22531560a067a4e809da75e8d
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/template/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function o(e){return function(){return e}}function e(e){return e}function i(e){return n=typeof(t=e),"string"==(null===t?"null":"object"==n&&(Array.prototype.isPrototypeOf(t)||t.constructor&&"Array"===t.constructor.name)?"array":"object"==n&&(String.prototype.isPrototypeOf(t)||t.constructor&&"String"===t.constructor.name)?"string":n);var t,n}var t,n=tinymce.util.Tools.resolve("tinymce.PluginManager"),u=function(e){return typeof e===t};function s(e){return e.getParam("template_mdate_classes","mdate")}function l(e){return e.getParam("template_replace_values")}function m(e){return e.getParam("template_mdate_format",e.translate("%Y-%m-%d"))}function f(e,t){if((e=""+e).length<t)for(var n=0;n<t-e.length;n++)e="0"+e;return e}function p(e,t,n){void 0===n&&(n=new Date);var r="Sun Mon Tue Wed Thu Fri Sat Sun".split(" "),a="Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday".split(" "),o="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),c="January February March April May June July August September October November December".split(" ");return(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=t.replace("%D","%m/%d/%Y")).replace("%r","%I:%M:%S %p")).replace("%Y",""+n.getFullYear())).replace("%y",""+n.getYear())).replace("%m",f(n.getMonth()+1,2))).replace("%d",f(n.getDate(),2))).replace("%H",""+f(n.getHours(),2))).replace("%M",""+f(n.getMinutes(),2))).replace("%S",""+f(n.getSeconds(),2))).replace("%I",""+((n.getHours()+11)%12+1))).replace("%p",n.getHours()<12?"AM":"PM")).replace("%B",""+e.translate(c[n.getMonth()]))).replace("%b",""+e.translate(o[n.getMonth()]))).replace("%A",""+e.translate(a[n.getDay()]))).replace("%a",""+e.translate(r[n.getDay()]))).replace("%%","%")}function x(n,e){return O.each(e,function(e,t){u(e)&&(e=e(t)),n=n.replace(new RegExp("\\{\\$"+t+"\\}","g"),e)}),n}function d(e,t){var r=e.dom,a=l(e);O.each(r.select("*",t),function(n){O.each(a,function(e,t){r.hasClass(n,t)&&u(e)&&e(n)})})}function g(e,t){return new RegExp("\\b"+t+"\\b","g").test(e.className)}function y(t,e,n){var r=t.dom,a=t.selection.getContent();n=x(n,l(t));var o=r.create("div",null,n),c=r.select(".mceTmpl",o);c&&0<c.length&&(o=r.create("div",null)).appendChild(c[0].cloneNode(!0)),O.each(r.select("*",o),function(e){g(e,t.getParam("template_cdate_classes","cdate").replace(/\s+/g,"|"))&&(e.innerHTML=p(t,t.getParam("template_cdate_format",t.translate("%Y-%m-%d")))),g(e,s(t).replace(/\s+/g,"|"))&&(e.innerHTML=p(t,m(t))),g(e,t.getParam("template_selected_content_classes","selcontent").replace(/\s+/g,"|"))&&(e.innerHTML=a)}),d(t,o),t.execCommand("mceInsertContent",!1,o.innerHTML),t.addVisual()}function r(){return b}var c=o(!(t="function")),v=o(!0),O=tinymce.util.Tools.resolve("tinymce.util.Tools"),h=tinymce.util.Tools.resolve("tinymce.util.XHR"),b={fold:function(e,t){return e()},isSome:c,isNone:v,getOr:e,getOrThunk:a,getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:o(null),getOrUndefined:o(void 0),or:e,orThunk:a,map:r,each:function(){},bind:r,exists:c,forall:v,filter:function(){return b},toArray:function(){return[]},toString:o("none()")};function a(e){return e()}function T(M,t){function l(e,t){return function(e,t,n){for(var r=0,a=e.length;r<a;r++){var o=e[r];if(t(o,r))return P.some(o);if(n(o,r))break}return P.none()}(e,function(e){return e.text===t},c)}function i(e){M.windowManager.alert("Could not load the specified template.",function(){return e.focus("template")})}function u(e){return new _(function(t,n){e.value.url.fold(function(){return t(e.value.content.getOr(""))},function(e){return h.send({url:e,success:function(e){t(e)},error:function(e){n(e)}})})})}!function(){if(t&&0!==t.length)return P.from(O.map(t,function(e,t){function n(e){return void 0!==e.url}return{selected:0===t,text:e.title,value:{url:n(e)?P.from(e.url):P.none(),content:n(e)?P.none():P.from(e.content),description:e.description}}}));var e=M.translate("No templates defined.");return M.notificationManager.open({text:e,type:"info"}),P.none()}().each(function(o){function b(e,t){return{title:"Insert Template",size:"large",body:{type:"panel",items:e},initialData:t,buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],onSubmit:function(t){var e=t.getData();l(n,e.template).each(function(e){u(e).then(function(e){M.execCommand("mceInsertTemplate",!1,e),t.close()}).catch(function(){t.disable("save"),i(t)})})},onChange:(r=n=o,a=c,function(n,e){var t;"template"===e.name&&(t=n.getData().template,l(r,t).each(function(t){n.block("Loading..."),u(t).then(function(e){a(n,t,e)}).catch(function(){a(n,t,""),n.disable("save"),i(n)})}))})};var r,a,n}var T=function(e){for(var t=e.length,n=new Array(t),r=0;r<t;r++){var a=e[r];n[r]={text:a.text,value:a.text}}return n}(o),c=function(e,t,n){var r,a,o,c,l,i,u,s,m,f,p,d,g,y=(r=M,-1===(a=n).indexOf("<html>")&&(o="",c=r.getParam("content_style","","string"),l=r.getParam("content_css_cors",!1,"boolean")?' crossorigin="anonymous"':"",O.each(r.contentCSS,function(e){o+='<link type="text/css" rel="stylesheet" href="'+r.documentBaseURI.toAbsolute(e)+'"'+l+">"}),c&&(o+='<style type="text/css">'+c+"</style>"),i=-1===(g=(p=r).getParam("body_class","","string")).indexOf("=")?g:(d=p).getParam("body_class","","hash")[d.id]||"",u=r.dom.encode,s='<script>document.addEventListener && document.addEventListener("click", function(e) {for (var elm = e.target; elm; elm = elm.parentNode) {if (elm.nodeName === "A" && !('+(S.mac?"e.metaKey":"e.ctrlKey && !e.altKey")+")) {e.preventDefault();}}}, false);<\/script> ",f=(m=r.getBody().dir)?' dir="'+u(m)+'"':"",a='<!DOCTYPE html><html><head><base href="'+u(r.documentBaseURI.getURI())+'">'+o+s+'</head><body class="'+u(i)+'"'+f+">"+a+"</body></html>"),x(a,r.getParam("template_preview_replace_values"))),v=[{type:"selectbox",name:"template",label:"Templates",items:T},{type:"htmlpanel",html:'<p aria-live="polite">'+t.value.description.replace(/["'<>&]/g,function(e){return(C(t=A,n=e)?P.from(t[n]):P.none()).getOr(e);var t,n})+"</p>"},{label:"Preview",type:"iframe",name:"preview",sandboxed:!1}],h={template:t.text,preview:y};e.unblock(),e.redial(b(v,h)),e.focus("template")},t=M.windowManager.open(b([],{template:"",preview:""}));t.block("Loading..."),u(o[0]).then(function(e){c(t,o[0],e)}).catch(function(){c(t,o[0],""),t.disable("save"),i(t)})})}var M=function(n){function e(){return a}function t(e){return e(n)}var r=o(n),a={fold:function(e,t){return t(n)},isSome:v,isNone:c,getOr:r,getOrThunk:r,getOrDie:r,getOrNull:r,getOrUndefined:r,or:e,orThunk:e,map:function(e){return M(e(n))},each:function(e){e(n)},bind:t,exists:t,forall:t,filter:function(e){return e(n)?a:b},toArray:function(){return[n]},toString:function(){return"some("+n+")"}};return a},P={some:M,none:r,from:function(e){return null==e?b:M(e)}},S=tinymce.util.Tools.resolve("tinymce.Env"),_=tinymce.util.Tools.resolve("tinymce.util.Promise"),w=Object.hasOwnProperty,C=function(e,t){return w.call(e,t)},A={'"':"&quot;","<":"&lt;",">":"&gt;","&":"&amp;","'":"&#039;"};n.add("template",function(e){function t(){return n.execCommand("mceTemplate")}var n,r,a,o,c,l;(n=e).ui.registry.addButton("template",{icon:"template",tooltip:"Insert template",onAction:t}),n.ui.registry.addMenuItem("template",{icon:"template",text:"Insert template...",onAction:t}),(a=e).addCommand("mceInsertTemplate",function(r){for(var a=[],e=1;e<arguments.length;e++)a[e-1]=arguments[e];return function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var n=a.concat(e);return r.apply(null,n)}}(y,a)),a.addCommand("mceTemplate",(l=o=a,c=function(e){T(l,e)},function(){var e=o.getParam("templates");u(e)?e(c):i(e)?h.send({url:e,success:function(e){c(JSON.parse(e))}}):c(e)})),(r=e).on("PreProcess",function(e){var t=r.dom,n=m(r);O.each(t.select("div",e.node),function(e){t.hasClass(e,"mceTmpl")&&(O.each(t.select("*",e),function(e){t.hasClass(e,s(r).replace(/\s+/g,"|"))&&(e.innerHTML=p(r,n))}),d(r,e))})})})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/textcolor/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/textcolor/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..260de8ead940f043988ab3bffc6682c5e27e602d
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/textcolor/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("textcolor",function(){})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/textpattern/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/textpattern/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..20955a6c6c6f7d88c7cfa75f91db0f94364d5f65
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/textpattern/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),u=function(){return(u=Object.assign||function(t){for(var n,r=1,e=arguments.length;r<e;r++)for(var o in n=arguments[r])Object.prototype.hasOwnProperty.call(n,o)&&(t[o]=n[o]);return t}).apply(this,arguments)};function a(t,n,r){if(r||2===arguments.length)for(var e,o=0,a=n.length;o<a;o++)!e&&o in n||((e=e||Array.prototype.slice.call(n,0,o))[o]=n[o]);return t.concat(e||Array.prototype.slice.call(n))}function n(e){return function(t){return r=typeof(n=t),(null===n?"null":"object"==r&&(Array.prototype.isPrototypeOf(n)||n.constructor&&"Array"===n.constructor.name)?"array":"object"==r&&(String.prototype.isPrototypeOf(n)||n.constructor&&"String"===n.constructor.name)?"string":r)===e;var n,r}}function e(){}function i(t){return function(){return t}}function o(t){return t}function r(){return m}var f=n("string"),c=n("object"),s=n("array"),l=i(!1),d=i(!0),m={fold:function(t,n){return t()},isSome:l,isNone:d,getOr:o,getOrThunk:g,getOrDie:function(t){throw new Error(t||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(void 0),or:o,orThunk:g,map:r,each:e,bind:r,exists:l,forall:d,filter:function(){return m},toArray:function(){return[]},toString:i("none()")};function g(t){return t()}function p(t,n){return-1<E.call(t,n)}function h(t,n){for(var r=t.length,e=new Array(r),o=0;o<r;o++){var a=t[o];e[o]=n(a,o)}return e}function v(t,n){for(var r=0,e=t.length;r<e;r++)n(t[r],r)}function y(t,n){for(var r=[],e=0,o=t.length;e<o;e++){var a=t[e];n(a,e)&&r.push(a)}return r}function b(t,e,o){return function(t){for(var n,r=t.length-1;0<=r;r--)n=t[r],o=e(o,n,r)}(t),o}function k(t,n){for(var r=0,e=t.length;r<e;++r)if(!0!==n(t[r],r))return;return 1}var O=function(r){function t(){return o}function n(t){return t(r)}var e=i(r),o={fold:function(t,n){return n(r)},isSome:d,isNone:l,getOr:e,getOrThunk:e,getOrDie:e,getOrNull:e,getOrUndefined:e,or:t,orThunk:t,map:function(t){return O(t(r))},each:function(t){t(r)},bind:n,exists:n,forall:n,filter:function(t){return t(r)?o:m},toArray:function(){return[r]},toString:function(){return"some("+r+")"}};return o},w={some:O,none:r,from:function(t){return null==t?m:O(t)}},C=Array.prototype.slice,E=Array.prototype.indexOf,x=Object.keys,R=Object.hasOwnProperty;function T(t){var n=[],r=[];return v(t,function(t){t.fold(function(t){n.push(t)},function(t){r.push(t)})}),{errors:n,values:r}}function P(t){return"inline-command"===t.type||"inline-format"===t.type}function N(t){return"block-command"===t.type||"block-format"===t.type}function S(o){function a(t){return ut.error({message:t,pattern:o})}function t(t,n,r){if(void 0===o.format)return void 0!==o.cmd?f(o.cmd)?ut.value(r(o.cmd,o.value)):a(t+" pattern has non-string `cmd` parameter"):a(t+" pattern is missing both `format` and `cmd` parameters");var e=void 0;if(s(o.format)){if(!k(o.format,f))return a(t+" pattern has non-string items in the `format` array");e=o.format}else{if(!f(o.format))return a(t+" pattern has non-string `format` parameter");e=[o.format]}return ut.value(n(e))}if(!c(o))return a("Raw pattern is not an object");if(!f(o.start))return a("Raw pattern is missing `start` parameter");if(void 0===o.end)return void 0!==o.replacement?f(o.replacement)?0===o.start.length?a("Replacement pattern has empty `start` parameter"):ut.value({type:"inline-command",start:"",end:o.start,cmd:"mceInsertContent",value:o.replacement}):a("Replacement pattern has non-string `replacement` parameter"):0===o.start.length?a("Block pattern has empty `start` parameter"):t("Block",function(t){return{type:"block-format",start:o.start,format:t[0]}},function(t,n){return{type:"block-command",start:o.start,cmd:t,value:n}});if(!f(o.end))return a("Inline pattern has non-string `end` parameter");if(0===o.start.length&&0===o.end.length)return a("Inline pattern has empty `start` and `end` parameters");var r=o.start,e=o.end;return 0===e.length&&(e=r,r=""),t("Inline",function(t){return{type:"inline-format",start:r,end:e,format:t}},function(t,n){return{type:"inline-command",start:r,end:e,cmd:t,value:n}})}function M(t){return"block-command"===t.type?{start:t.start,cmd:t.cmd,value:t.value}:"block-format"===t.type?{start:t.start,format:t.format}:"inline-command"===t.type?"mceInsertContent"===t.cmd&&""===t.start?{start:t.end,replacement:t.value}:{start:t.start,end:t.end,cmd:t.cmd,value:t.value}:"inline-format"===t.type?{start:t.start,end:t.end,format:1===t.format.length?t.format[0]:t.format}:void 0}function A(t){return{inlinePatterns:y(t,P),blockPatterns:(n=y(t,N),r=function(t,n){return t.start.length===n.start.length?0:t.start.length>n.start.length?-1:1},(e=C.call(n,0)).sort(r),e)};var n,r,e}function B(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var r=ft.console;r&&(r.error||r.log).apply(r,t)}function D(t){var n=t.getParam("forced_root_block","p");return!1===n?"":!0===n?"p":n}function I(t,n){return{container:t,offset:n}}function j(t){return t.nodeType===Node.TEXT_NODE}function _(t,n,r,e){void 0===e&&(e=!0);var o=n.startContainer.parentNode,a=n.endContainer.parentNode;n.deleteContents(),e&&!r(n.startContainer)&&(j(n.startContainer)&&0===n.startContainer.data.length&&t.remove(n.startContainer),j(n.endContainer)&&0===n.endContainer.data.length&&t.remove(n.endContainer),pt(t,o,r),o!==a&&pt(t,a,r))}function U(t,n){var r,e=n.get(t);return s(e)&&(0<(r=e).length?w.some(r[0]):w.none()).exists(function(t){return R.call(t,"block")})}function L(t){return 0===t.start.length}function V(t,n){var r=w.from(t.dom.getParent(n.startContainer,t.dom.isBlock));return""===D(t)?r.orThunk(function(){return w.some(t.getBody())}):r}function W(n){return function(t){return n===t?-1:0}}function q(t,n,r){if(j(t)&&0<=n)return w.some(I(t,n));var e=gt(ht);return w.from(e.backwards(t,n,W(t),r)).map(function(t){return I(t.container,t.container.data.length)})}function F(t,n,r){if(j(n)&&(r<0||r>n.data.length))return[];for(var e=[r],o=n;o!==t&&o.parentNode;){for(var a=o.parentNode,i=0;i<a.childNodes.length;i++)if(a.childNodes[i]===o){e.push(i);break}o=a}return o===t?e.reverse():[]}function G(t,n,r,e,o){return{start:F(t,n,r),end:F(t,e,o)}}function H(t,n){var r=n.slice(),e=r.pop(),o=r,a=function(t,n){return t.bind(function(t){return w.from(t.childNodes[n])})},i=w.some(t);return v(o,function(t,n){i=a(i,t)}),i.bind(function(t){return j(t)&&(e<0||e>t.data.length)?w.none():w.some({node:t,offset:e})})}function J(n,r){return H(n,r.start).bind(function(t){var o=t.node,a=t.offset;return H(n,r.end).map(function(t){var n=t.node,r=t.offset,e=document.createRange();return e.setStart(o,a),e.setEnd(n,r),e})})}function K(e,o,n){!function(t,n){if(j(t)&&t.length<=0)return w.some(I(t,0));var r=gt(ht);return w.from(r.forwards(t,0,W(t),n)).map(function(t){return I(t.container,0)})}(o,o).each(function(t){var r=t.container;yt(r,n.start.length,o).each(function(t){var n=e.createRng();n.setStart(r,0),n.setEnd(t.container,t.offset),_(e,n,function(t){return t===o})})})}function X(e,a){var i=e.dom,t=e.selection.getRng();return V(e,t).filter(function(t){var n=D(e),r=""===n&&i.is(t,"body")||i.is(t,n);return null!==t&&r}).bind(function(n){var r,e=n.textContent,t=a,o=(r=e).replace("\xa0"," ");return function(t,n,r){for(var e=0,o=t.length;e<o;e++){var a=t[e];if(n(a,e))return w.some(a);if(r(a,e))break}return w.none()}(t,function(t){return 0===r.indexOf(t.start)||0===o.indexOf(t.start)},l).map(function(t){return dt.trim(e).length===t.start.length?[]:[{pattern:t,range:G(i.getRoot(),n,0,n,0)}]})}).getOr([])}function z(t,n){return t.create("span",{"data-mce-type":"bookmark",id:n})}function Q(t,n){var r=t.createRng();return r.setStartAfter(n.start),r.setEndBefore(n.end),r}function Y(t,n,r){var e=J(t.getRoot(),r).getOrDie("Unable to resolve path range"),o=e.startContainer,a=e.endContainer,i=0===e.endOffset?a:a.splitText(e.endOffset),u=0===e.startOffset?o:o.splitText(e.startOffset);return{prefix:n,end:i.parentNode.insertBefore(z(t,n+"-end"),i),start:u.parentNode.insertBefore(z(t,n+"-start"),u)}}function Z(t,n,r){pt(t,t.get(n.prefix+"-end"),r),pt(t,t.get(n.prefix+"-start"),r)}function $(n,t,r){n.selection.setRng(r),"inline-format"===t.type?v(t.format,function(t){n.formatter.apply(t)}):n.execCommand(t.cmd,!1,t.value)}function tt(r,e,o){var a=r.selection.getRng();return!1===a.collapsed?[]:V(r,a).bind(function(t){var n=a.startOffset-(o?1:0);return Ot(r,e,a.startContainer,n,t)}).fold(function(){return[]},function(t){return t.matches})}function nt(p,t){var h,n,o,r,e,a,i;0!==t.length&&(h=p.dom,n=p.selection.getBookmark(),o=h,r=t,e=(new Date).getTime(),a="mce_textpattern_"+Math.floor(1e9*Math.random())+ ++bt+String(e),i=b(r,function(t,n){var r=Y(o,a+"_end"+t.length,n.endRng);return t.concat([u(u({},n),{endMarker:r})])},[]),v(b(i,function(t,n){var r=i.length-t.length-1,e=L(n.pattern)?n.endMarker:Y(o,a+"_start"+r,n.startRng);return t.concat([u(u({},n),{startMarker:e})])},[]),function(t){function n(t){return t===g}var r,e,o,a,i,u,f,c,s,l,d,m,g=h.getParent(t.startMarker.start,h.isBlock);L(t.pattern)?(e=t.pattern,o=t.endMarker,a=n,i=Q((r=p).dom,o),_(r.dom,i,a),$(r,e,i)):(u=p,f=t.pattern,c=t.startMarker,s=t.endMarker,l=n,d=u.dom,m=Q(d,s),_(d,Q(d,c),l),_(d,m,l),$(u,f,Q(d,{prefix:c.prefix,start:c.end,end:s.start}))),Z(h,t.endMarker,n),Z(h,t.startMarker,n)}),p.selection.moveToBookmark(n))}function rt(t,n){var r=tt(t,n.inlinePatterns,!0);0<r.length&&t.undoManager.transact(function(){nt(t,r)})}function et(t,n,r){for(var e=0;e<t.length;e++)if(r(t[e],n))return 1}function ot(n,r){var e=[",",".",";",":","!","?"],o=[32];n.on("keydown",function(t){13!==t.keyCode||lt.modifierPressed(t)||!function(o,t){if(o.selection.isCollapsed()){var a=tt(o,t.inlinePatterns,!1),u=X(o,t.blockPatterns);return(0<u.length||0<a.length)&&(o.undoManager.add(),o.undoManager.extra(function(){o.execCommand("mceInsertNewLine")},function(){var i,t,n;o.insertContent("\ufeff"),nt(o,a),i=o,0!==(t=u).length&&(n=i.selection.getBookmark(),v(t,function(t){return e=(n=i).dom,o=(r=t).pattern,a=J(e.getRoot(),r.range).getOrDie("Unable to resolve path range"),V(n,a).each(function(t){"block-format"===o.type?U(o.format,n.formatter)&&n.undoManager.transact(function(){K(n.dom,t,o),n.formatter.apply(o.format)}):"block-command"===o.type&&n.undoManager.transact(function(){K(n.dom,t,o),n.execCommand(o.cmd,!1,o.value)})}),1;var n,r,e,o,a}),i.selection.moveToBookmark(n));var r=o.selection.getRng(),e=q(r.startContainer,r.startOffset,o.dom.getRoot());o.execCommand("mceInsertNewLine"),e.each(function(t){var n=t.container;"\ufeff"===n.data.charAt(t.offset-1)&&(n.deleteData(t.offset-1,1),pt(o.dom,n.parentNode,function(t){return t===o.dom.getRoot()}))})}),1)}}(n,r.get())||t.preventDefault()},!0),n.on("keyup",function(t){et(o,t,function(t,n){return t===n.keyCode&&!1===lt.modifierPressed(n)})&&rt(n,r.get())}),n.on("keypress",function(t){et(e,t,function(t,n){return t.charCodeAt(0)===n.charCode})&&st.setEditorTimeout(n,function(){rt(n,r.get())})})}!function(i){if(!s(i))throw new Error("cases must be an array");if(0===i.length)throw new Error("there must be at least one case");var u=[],r={};v(i,function(t,e){var n=x(t);if(1!==n.length)throw new Error("one and only one name per case");var o=n[0],a=t[o];if(void 0!==r[o])throw new Error("duplicate key detected:"+o);if("cata"===o)throw new Error("cannot have a case named cata (sorry)");if(!s(a))throw new Error("case arguments must be an array");u.push(o),r[o]=function(){for(var r=[],t=0;t<arguments.length;t++)r[t]=arguments[t];var n=r.length;if(n!==a.length)throw new Error("Wrong number of arguments to case "+o+". Expected "+a.length+" ("+a+"), got "+n);return{fold:function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];if(t.length!==i.length)throw new Error("Wrong number of arguments to fold. Expected "+i.length+", got "+t.length);return t[e].apply(null,r)},match:function(t){var n=x(t);if(u.length!==n.length)throw new Error("Wrong number of arguments to match. Expected: "+u.join(",")+"\nActual: "+n.join(","));if(!k(u,function(t){return p(n,t)}))throw new Error("Not all branches were specified when using match. Specified: "+n.join(", ")+"\nRequired: "+u.join(", "));return t[o].apply(null,r)},log:function(t){console.log(t,{constructors:u,constructor:o,params:r})}}}})}([{bothErrors:["error1","error2"]},{firstError:["error1","value2"]},{secondError:["value1","error2"]},{bothValues:["value1","value2"]}]);var at=function(r){return{isValue:d,isError:l,getOr:i(r),getOrThunk:i(r),getOrDie:i(r),or:function(t){return at(r)},orThunk:function(t){return at(r)},fold:function(t,n){return n(r)},map:function(t){return at(t(r))},mapError:function(t){return at(r)},each:function(t){t(r)},bind:function(t){return t(r)},exists:function(t){return t(r)},forall:function(t){return t(r)},toOptional:function(){return w.some(r)}}},it=function(r){return{isValue:l,isError:d,getOr:o,getOrThunk:function(t){return t()},getOrDie:function(){return t=String(r),function(){throw new Error(t)}();var t},or:o,orThunk:function(t){return t()},fold:function(t,n){return t(r)},map:function(t){return it(r)},mapError:function(t){return it(t(r))},each:e,bind:function(t){return it(r)},exists:l,forall:d,toOptional:w.none}},ut={value:at,error:it,fromOption:function(t,n){return t.fold(function(){return it(n)},at)}},ft="undefined"!=typeof window?window:Function("return this;")(),ct=[{start:"*",end:"*",format:"italic"},{start:"**",end:"**",format:"bold"},{start:"#",format:"h1"},{start:"##",format:"h2"},{start:"###",format:"h3"},{start:"####",format:"h4"},{start:"#####",format:"h5"},{start:"######",format:"h6"},{start:"1. ",cmd:"InsertOrderedList"},{start:"* ",cmd:"InsertUnorderedList"},{start:"- ",cmd:"InsertUnorderedList"}],st=tinymce.util.Tools.resolve("tinymce.util.Delay"),lt=tinymce.util.Tools.resolve("tinymce.util.VK"),dt=tinymce.util.Tools.resolve("tinymce.util.Tools"),mt=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),gt=tinymce.util.Tools.resolve("tinymce.dom.TextSeeker"),pt=function(t,n,r){var e;n&&t.isEmpty(n)&&!r(n)&&(e=n.parentNode,t.remove(n),pt(t,e,r))},ht=mt.DOM,vt=function(t,r,e){if(!j(t))return w.none();var n=t.textContent;if(0<=r&&r<=n.length)return w.some(I(t,r));var o=gt(ht);return w.from(o.backwards(t,r,W(t),e)).bind(function(t){var n=t.container.data;return vt(t.container,r+n.length,e)})},yt=function(t,n,r){if(!j(t))return w.none();var e=t.textContent;if(n<=e.length)return w.some(I(t,n));var o=gt(ht);return w.from(o.forwards(t,n,W(t),r)).bind(function(t){return yt(t.container,n-e.length,r)})},bt=0,kt=function(e,o,a,t){var i,n,r,u,f,c,s,l=o.start;return n=t.container,r=t.offset,i=l,u=function(t,n){var r=t.data.substring(0,n),e=r.lastIndexOf(i.charAt(i.length-1)),o=r.lastIndexOf(i);return-1!==o?o+i.length:-1!==e?e+1:-1},f=a,s=gt(e,(c=e,function(t){return c.isBlock(t)||p(["BR","IMG","HR","INPUT"],t.nodeName)||"false"===c.getContentEditable(t)})),w.from(s.backwards(n,r,u,f)).bind(function(r){if(r.offset>=l.length){var t=e.createRng();return t.setStart(r.container,r.offset-l.length),t.setEnd(r.container,r.offset),w.some(t)}var n=r.offset-l.length;return vt(r.container,n,a).map(function(t){var n=e.createRng();return n.setStart(t.container,t.offset),n.setEnd(r.container,r.offset),n}).filter(function(t){return t.toString()===l}).orThunk(function(){return kt(e,o,a,I(r.container,0))})})},Ot=function(l,d,m,g,p){var h=l.dom;return q(m,g,h.getRoot()).bind(function(t){var n=h.createRng();n.setStart(p,0),n.setEnd(m,g);for(var r,e=n.toString(),o=0;o<d.length;o++){var a,i,u=d[o],f=u.end;i=r=void 0;if(a=(r=e).length-f.length,""===(i=f)||r.length>=i.length&&r.substr(a,a+i.length)===i){var c=d.slice();c.splice(o,1);var s=function(a,i,u){var f=a.dom,c=f.getRoot(),s=u.pattern,l=u.position.container,d=u.position.offset;return vt(l,d-u.pattern.end.length,i).bind(function(t){var r=G(c,t.container,t.offset,l,d);if(L(s))return w.some({matches:[{pattern:s,startRng:r,endRng:r}],position:t});var n=Ot(a,u.remainingPatterns,t.container,t.offset,i),e=n.getOr({matches:[],position:t}),o=e.position;return function(t,r,n,e,o,a){if(void 0===a&&(a=!1),0!==r.start.length||a)return q(n,e,o).bind(function(n){return kt(t,r,o,n).bind(function(t){if(a){if(t.endContainer===n.container&&t.endOffset===n.offset)return w.none();if(0===n.offset&&t.endContainer.textContent.length===t.endOffset)return w.none()}return w.some(t)})});var i=t.createRng();return i.setStart(n,e),i.setEnd(n,e),w.some(i)}(f,s,o.container,o.offset,i,n.isNone()).map(function(t){var n=G(c,t.startContainer,t.startOffset,t.endContainer,t.endOffset);return{matches:e.matches.concat([{pattern:s,startRng:n,endRng:r}]),position:I(t.startContainer,t.startOffset)}})})}(l,p,{pattern:u,remainingPatterns:c,position:t});if(s.isSome())return s}}return w.none()})};t.add("textpattern",function(r){var t,n,e,o=(t=function(){var t=r.getParam("textpattern_patterns",ct,"array");if(!s(t))return B("The setting textpattern_patterns should be an array"),{inlinePatterns:[],blockPatterns:[]};var n=T(h(t,S));return v(n.errors,function(t){return B(t.message,t.pattern),0}),A(n.values)}(),n=t,{get:function(){return n},set:function(t){n=t}});return ot(r,o),e=o,{setPatterns:function(t){var n=T(h(t,S));if(0<n.errors.length){var r=n.errors[0];throw new Error(r.message+":\n"+JSON.stringify(r.pattern,null,2))}e.set(A(n.values))},getPatterns:function(){return a(a([],h(e.get().inlinePatterns,M),!0),h(e.get().blockPatterns,M),!0)}}})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/toc/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/toc/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..a36ebd6f7b713848a4668dbd01724d2378d871ae
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/toc/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function a(t){return t.getParam("toc_class","mce-toc")}function s(t){var e=t.getParam("toc_header","h2");return/^h[1-6]$/.test(e)?e:"h2"}function u(n){return function(t){function e(){return t.setDisabled(n.mode.isReadOnly()||!(0<g(n).length))}return e(),n.on("LoadContent SetContent change",e),function(){return n.on("LoadContent SetContent change",e)}}}function d(t){var e,n,o,r="",i=g(t),c=function(t){for(var e=9,n=0;n<t.length;n++)if(1===(e=t[n].level<e?t[n].level:e))return e;return e}(i)-1;if(!i.length)return"";r+=(e=s(t),n=v.translate("Table of Contents"),o="</"+e+">","<"+e+' contenteditable="true">'+m.DOM.encode(n)+o);for(var l=0;l<i.length;l++){var a=i[l];a.element.id=a.id;var u=i[l+1]&&i[l+1].level;if(c===a.level)r+="<li>";else for(var d=c;d<a.level;d++)r+="<ul><li>";if(r+='<a href="#'+a.id+'">'+a.title+"</a>",u!==a.level&&u)for(d=a.level;u<d;d--)r+="</li></ul><li>";else r+="</li>",u||(r+="</ul>");c=a.level}return r}function f(t){var e=a(t),n=t.$("."+e);n.length&&t.undoManager.transact(function(){n.html(d(t))})}var t,e=tinymce.util.Tools.resolve("tinymce.PluginManager"),m=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),v=tinymce.util.Tools.resolve("tinymce.util.I18n"),c=tinymce.util.Tools.resolve("tinymce.util.Tools"),l=(t=0,function(){return"mcetoc_"+(new Date).getTime().toString(32)+(t++).toString(32)}),g=function(n){var t,o=a(n),e=s(n),r=function(t){for(var e=[],n=1;n<=t;n++)e.push("h"+n);return e.join(",")}(1<=(t=parseInt(n.getParam("toc_depth","3"),10))&&t<=9?t:3),i=n.$(r);return i.length&&/^h[1-9]$/i.test(e)&&(i=i.filter(function(t,e){return!n.dom.hasClass(e.parentNode,o)})),c.map(i,function(t){return{id:t.id||l(),level:parseInt(t.nodeName.replace(/^H/i,""),10),title:n.$.text(t),element:t}})};e.add("toc",function(t){var c,e,n,o,r,i;function l(){return r.execCommand("mceInsertToc")}(c=t).addCommand("mceInsertToc",function(){var t,e,n,o,r,i;o=a(t=c),r=t.$("."+o),i=t,!r.length||0<i.dom.getParents(r[0],".mce-offscreen-selection").length?t.insertContent((n=d(e=t),'<div class="'+e.dom.encode(a(e))+'" contenteditable="false">'+n+"</div>")):f(t)}),c.addCommand("mceUpdateToc",function(){f(c)}),(r=t).ui.registry.addButton("toc",{icon:"toc",tooltip:"Table of contents",onAction:l,onSetup:u(r)}),r.ui.registry.addButton("tocupdate",{icon:"reload",tooltip:"Update",onAction:function(){return r.execCommand("mceUpdateToc")}}),r.ui.registry.addMenuItem("toc",{icon:"toc",text:"Table of contents",onAction:l,onSetup:u(r)}),r.ui.registry.addContextToolbar("toc",{items:"tocupdate",predicate:(i=r,function(t){return t&&i.dom.is(t,"."+a(i))&&i.getBody().contains(t)}),scope:"node",position:"node"}),n=(e=t).$,o=a(e),e.on("PreProcess",function(t){var e=n("."+o,t.node);e.length&&(e.removeAttr("contentEditable"),e.find("[contenteditable]").removeAttr("contentEditable"))}),e.on("SetContent",function(){var t=n("."+o);t.length&&(t.attr("contentEditable",!1),t.children(":first-child").attr("contentEditable",!0))})})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/visualblocks/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/visualblocks/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..18bf7795d2dbe9daedd39df4c85bca8d9ec57e86
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/visualblocks/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function f(t,o,e){var n,i;t.dom.toggleClass(t.getBody(),"mce-visualblocks"),e.set(!e.get()),n=t,i=e.get(),n.fire("VisualBlocks",{state:i})}function g(e,n){return function(o){function t(t){return o.setActive(t.state)}return o.setActive(n.get()),e.on("VisualBlocks",t),function(){return e.off("VisualBlocks",t)}}}tinymce.util.Tools.resolve("tinymce.PluginManager").add("visualblocks",function(t,o){var e,n,i,s,c,u,l,a=(e=!1,{get:function(){return e},set:function(t){e=t}});function r(){return s.execCommand("mceVisualBlocks")}i=a,(n=t).addCommand("mceVisualBlocks",function(){f(n,0,i)}),(s=t).ui.registry.addToggleButton("visualblocks",{icon:"visualblocks",tooltip:"Show blocks",onAction:r,onSetup:g(s,c=a)}),s.ui.registry.addToggleMenuItem("visualblocks",{text:"Show blocks",icon:"visualblocks",onAction:r,onSetup:g(s,c)}),l=a,(u=t).on("PreviewFormats AfterPreviewFormats",function(t){l.get()&&u.dom.toggleClass(u.getBody(),"mce-visualblocks","afterpreviewformats"===t.type)}),u.on("init",function(){u.getParam("visualblocks_default_state",!1,"boolean")&&f(u,0,l)})})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/visualchars/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/visualchars/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..caa10ab2c280b3612e6a0daaee41013b7744070e
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/visualchars/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function n(t){return function(n){return typeof n===t}}function i(n){return function(){return n}}function t(n){return n}function e(){return l}var o,r=tinymce.util.Tools.resolve("tinymce.PluginManager"),u=function(n){return e=typeof(t=n),(null===t?"null":"object"==e&&(Array.prototype.isPrototypeOf(t)||t.constructor&&"Array"===t.constructor.name)?"array":"object"==e&&(String.prototype.isPrototypeOf(t)||t.constructor&&"String"===t.constructor.name)?"string":e)===o;var t,e},c=n("boolean"),a=n("number"),s=i(!(o="string")),f=i(!0),l={fold:function(n,t){return n()},isSome:s,isNone:f,getOr:t,getOrThunk:d,getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(void 0),or:t,orThunk:d,map:e,each:function(){},bind:e,exists:s,forall:f,filter:function(){return l},toArray:function(){return[]},toString:i("none()")};function d(n){return n()}function m(n,t){for(var e=0,o=n.length;e<o;e++)t(n[e],e)}function v(n,t){for(var e=h(n),o=0,r=e.length;o<r;o++){var i=e[o];t(n[i],i)}}var g=function(e){function n(){return r}function t(n){return n(e)}var o=i(e),r={fold:function(n,t){return t(e)},isSome:f,isNone:s,getOr:o,getOrThunk:o,getOrDie:o,getOrNull:o,getOrUndefined:o,or:n,orThunk:n,map:function(n){return g(n(e))},each:function(n){n(e)},bind:t,exists:t,forall:t,filter:function(n){return n(e)?r:l},toArray:function(){return[e]},toString:function(){return"some("+e+")"}};return r},h=Object.keys;function p(n){return n.dom.nodeValue}function y(n,t,e){!function(n,t,e){if(!(u(e)||c(e)||a(e)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",e,":: Element ",n),new Error("Attribute value was not simple");n.setAttribute(t,e+"")}(n.dom,t,e)}function b(n,t){n.dom.removeAttribute(t)}function w(n,t){var e,o=null===(e=n.dom.getAttribute(t))?void 0:e;return void 0===o||""===o?[]:o.split(" ")}function T(n){return void 0!==n.dom.classList}function k(n,t){return i=t,0<(o=function(n){for(var t=[],e=0,o=n.length;e<o;e++){var r=n[e];r!==i&&t.push(r)}return t}(w(e=n,"class"))).length?y(e,"class",o.join(" ")):b(e,"class"),0;var e,i,o}function N(n,t){var e="";return v(n,function(n,t){e+=t}),new RegExp("["+e+"]",t?"g":"")}function A(n){return'<span data-mce-bogus="1" class="mce-'+H[n]+'">'+n+"</span>"}function O(n){var t=p(n);return j(n)&&void 0!==t&&_.test(t)}function C(n){return"span"===n.nodeName.toLowerCase()&&n.classList.contains("mce-nbsp-wrap")}function S(f,n){m(K(M.fromDom(n),O),function(n){var t,e,o,r,i,u=n.dom.parentNode;if(C(u))t=M.fromDom(u),e=U,T(t)?t.dom.classList.add(e):(r=e,i=w(o=t,"class").concat([r]),y(o,"class",i.join(" ")));else{for(var c,a=f.dom.encode(p(n)).replace(F,A),s=f.dom.create("div",null,a);c=s.lastChild;)f.dom.insertAfter(c,n.dom);f.dom.remove(n.dom)}})}function D(r,n){m(r.dom.select(I,n),function(n){var t,e,o;C(n)?(t=M.fromDom(n),e=U,T(t)?t.dom.classList.remove(e):k(t,e),0===(T(o=t)?o.dom.classList:w(o,"class")).length&&b(o,"class")):r.dom.remove(n,!0)})}function E(n){var t=n.getBody(),e=n.selection.getBookmark(),o=function(n,t){for(;n.parentNode;){if(n.parentNode===t)return n;n=n.parentNode}}(n.selection.getNode(),t);D(n,o=void 0!==o?o:t),S(n,o),n.selection.moveToBookmark(e)}function L(n,t){var e=n,o=t.get();e.fire("VisualChars",{state:o});var r=n.getBody();(!0===t.get()?S:D)(n,r)}function x(n,t){n.addCommand("mceVisualChars",function(){!function(n,t){t.set(!t.get());var e=n.selection.getBookmark();L(n,t),n.selection.moveToBookmark(e)}(n,t)})}function B(e,o){return function(t){function n(n){return t.setActive(n.state)}return t.setActive(o.get()),e.on("VisualChars",n),function(){return e.off("VisualChars",n)}}}"undefined"!=typeof window||Function("return this;")();function P(n){if(null==n)throw new Error("Node cannot be null or undefined");return{dom:n}}var V,j=function(n){return 3===n.dom.nodeType},M={fromHtml:function(n,t){var e=(t||document).createElement("div");if(e.innerHTML=n,!e.hasChildNodes()||1<e.childNodes.length)throw console.error("HTML does not have a single root node",n),new Error("HTML must have a single root node");return P(e.childNodes[0])},fromTag:function(n,t){var e=(t||document).createElement(n);return P(e)},fromText:function(n,t){var e=(t||document).createTextNode(n);return P(e)},fromDom:P,fromPoint:function(n,t,e){return(null==(o=n.dom.elementFromPoint(t,e))?l:g(o)).map(P);var o}},H={"\xa0":"nbsp","\xad":"shy"},_=N(H),F=N(H,!0),I=(V="",v(H,function(n){V&&(V+=","),V+="span.mce-"+n}),V),U="mce-nbsp",K=function(n,t){var e=[];return m(function(n,t){for(var e=n.length,o=new Array(e),r=0;r<e;r++){var i=n[r];o[r]=t(i,r)}return o}(n.dom.childNodes,M.fromDom),function(n){e=(e=t(n)?e.concat([n]):e).concat(K(n,t))}),e},R=tinymce.util.Tools.resolve("tinymce.util.Delay");r.add("visualchars",function(n){var t,e,o,r,i,u,c,a,s,f,l=(t=n.getParam("visualchars_default_state",!1),e=t,{get:function(){return e},set:function(n){e=n}});function d(){return o.execCommand("mceVisualChars")}return x(n,l),(o=n).ui.registry.addToggleButton("visualchars",{tooltip:"Show invisible characters",icon:"visualchars",onAction:d,onSetup:B(o,r=l)}),o.ui.registry.addToggleMenuItem("visualchars",{text:"Show invisible characters",icon:"visualchars",onAction:d,onSetup:B(o,r)}),i=n,u=l,c=R.debounce(function(){E(i)},300),!1!==i.getParam("forced_root_block")&&i.on("keydown",function(n){!0===u.get()&&(13===n.keyCode?E(i):c())}),i.on("remove",c.stop),s=l,(a=n).on("init",function(){L(a,s)}),f=l,{isEnabled:function(){return f.get()}}})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/plugins/wordcount/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/wordcount/plugin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..56d74b554529f2726ac660e548d69667dad9cde5
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/plugins/wordcount/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function r(t){return t}function g(t){for(var e=i,n=c.length,r=0;r<n;++r){var o=c[r];if(o&&o.test(t)){e=r;break}}return e}function d(t,e,n,r){for(var o,u,c,i,a,s,g,d,l,p=[],h=[],f=0;f<n.length;++f)h.push(t[f]),function(t,e){var n=t[e],r=t[e+1];if(!(e<0||e>t.length-1&&0!==e||0===n&&0===r)){var o=t[e+2];if(0!==n||2!==r&&1!==r&&12!==r||0!==o){var u=t[e-1];return(2!==n&&1!==n&&12!==r||0!==r||0!==u)&&(4!==n&&0!==n||4!==r&&0!==r)&&(3!==n&&1!==n||4!==r||4!==u)&&(4!==n||3!==r&&1!==r||4!==o)&&8!==n&&9!==n&&8!==u&&9!==u&&8!==r&&9!==r&&(5!==n||6!==r)&&(7===n||5===n||6===n||7===r||5===r||6===r||(10!==n||10!==r)&&(11!==r||0!==n&&4!==n&&10!==n&&11!==n)&&(11!==n||0!==r&&4!==r&&10!==r)&&12!==n)}}}(n,f)&&(o=e[f],!r.includeWhitespace&&W.test(o)||!r.includePunctuation&&E.test(o)||(u=f-h.length+1,"http"!==(i=e.slice(u,c=f+1).join(""))&&"https"!==i||(d=f,l=void 0,l=function(t){for(var e=d+1;e<t.length&&!W.test(t[e]);e++);return e}(g=e),a="://"===g.slice(d+1,l).join("").substr(0,3)?l:d,s=t.slice(c,a),Array.prototype.push.apply(h,s),f=a),p.push(h)),h=[]);return p}function o(t,e){for(var n,r=e.getBlockElements(),o=e.getShortEndedElements(),u=[],c="",i=new s(t,t);t=i.next();)3===t.nodeType?c+=t.data.replace(/\uFEFF/g,""):(r[(n=t).nodeName]||o[n.nodeName])&&c.length&&(u.push(c),c="");return c.length&&u.push(c),u}function n(t){return t.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,"_").length}function l(t,e){var n=o(t,e).join("\n");return a(n.split(""),r).length}function p(t,e){return n(o(t,e).join(""))}function h(t,e){return n(o(t,e).join("").replace(/\s/g,""))}function f(t,e){return function(){return e(t.getBody(),t.schema)}}function C(t,e){return function(){return e(t.selection.getRng().cloneContents(),t.schema)}}function y(t){return f(t,l)}function v(t,e){var n=e;t.fire("wordCountUpdate",{wordCount:{words:n.body.getWordCount(),characters:n.body.getCharacterCount(),charactersWithoutSpaces:n.body.getCharacterCountWithoutSpaces()}})}var w,t=tinymce.util.Tools.resolve("tinymce.PluginManager"),m=function(){return(m=Object.assign||function(t){for(var e,n=1,r=arguments.length;n<r;n++)for(var o in e=arguments[n])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t}).apply(this,arguments)},e=[new RegExp("[A-Za-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f3\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u10a0-\u10c5\u10d0-\u10fa\u10fc\u1100-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1a00-\u1a16\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bc0-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u24b6-\u24e9\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2d00-\u2d25\u2d30-\u2d65\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005\u303b\u303c\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790\ua791\ua7a0-\ua7a9\ua7fa-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uffa0-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc]"),new RegExp("[-'\\.\u2018\u2019\u2024\ufe52\uff07\uff0e]"),new RegExp("[:\xb7\xb7\u05f4\u2027\ufe13\ufe55\uff1a]"),new RegExp("[\xb1+*/,;;\u0589\u060c\u060d\u066c\u07f8\u2044\ufe10\ufe14\ufe50\ufe54\uff0c\uff1b]"),new RegExp("[0-9\u0660-\u0669\u066b\u06f0-\u06f9\u07c0-\u07c9\u0966-\u096f\u09e6-\u09ef\u0a66-\u0a6f\u0ae6-\u0aef\u0b66-\u0b6f\u0be6-\u0bef\u0c66-\u0c6f\u0ce6-\u0cef\u0d66-\u0d6f\u0e50-\u0e59\u0ed0-\u0ed9\u0f20-\u0f29\u1040-\u1049\u1090-\u1099\u17e0-\u17e9\u1810-\u1819\u1946-\u194f\u19d0-\u19d9\u1a80-\u1a89\u1a90-\u1a99\u1b50-\u1b59\u1bb0-\u1bb9\u1c40-\u1c49\u1c50-\u1c59\ua620-\ua629\ua8d0-\ua8d9\ua900-\ua909\ua9d0-\ua9d9\uaa50-\uaa59\uabf0-\uabf9]"),new RegExp("\\r"),new RegExp("\\n"),new RegExp("[\v\f\x85\u2028\u2029]"),new RegExp("[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065f\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0900-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0c01-\u0c03\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c82\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d02\u0d03\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f\u109a-\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b6-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u192b\u1930-\u193b\u19b0-\u19c0\u19c8\u19c9\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f\u1b00-\u1b04\u1b34-\u1b44\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1baa\u1be6-\u1bf3\u1c24-\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf2\u1dc0-\u1de6\u1dfc-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua880\ua881\ua8b4-\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa7b\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe3-\uabea\uabec\uabed\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]"),new RegExp("[\xad\u0600-\u0603\u06dd\u070f\u17b4\u17b5\u200e\u200f\u202a-\u202e\u2060-\u2064\u206a-\u206f\ufeff\ufff9-\ufffb]"),new RegExp("[\u3031-\u3035\u309b\u309c\u30a0-\u30fa\u30fc-\u30ff\u31f0-\u31ff\u32d0-\u32fe\u3300-\u3357\uff66-\uff9d]"),new RegExp("[=_\u203f\u2040\u2054\ufe33\ufe34\ufe4d-\ufe4f\uff3f\u2200-\u22ff<>]"),new RegExp("@")],u=new RegExp("^[!-#%-*,-\\/:;?@\\[-\\]_{}\xa1\xab\xb7\xbb\xbf;\xb7\u055a-\u055f\u0589\u058a\u05be\u05c0\u05c3\u05c6\u05f3\u05f4\u0609\u060a\u060c\u060d\u061b\u061e\u061f\u066a-\u066d\u06d4\u0700-\u070d\u07f7-\u07f9\u0830-\u083e\u085e\u0964\u0965\u0970\u0df4\u0e4f\u0e5a\u0e5b\u0f04-\u0f12\u0f3a-\u0f3d\u0f85\u0fd0-\u0fd4\u0fd9\u0fda\u104a-\u104f\u10fb\u1361-\u1368\u1400\u166d\u166e\u169b\u169c\u16eb-\u16ed\u1735\u1736\u17d4-\u17d6\u17d8-\u17da\u1800-\u180a\u1944\u1945\u1a1e\u1a1f\u1aa0-\u1aa6\u1aa8-\u1aad\u1b5a-\u1b60\u1bfc-\u1bff\u1c3b-\u1c3f\u1c7e\u1c7f\u1cd3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205e\u207d\u207e\u208d\u208e\u3008\u3009\u2768-\u2775\u27c5\u27c6\u27e6-\u27ef\u2983-\u2998\u29d8-\u29db\u29fc\u29fd\u2cf9-\u2cfc\u2cfe\u2cff\u2d70\u2e00-\u2e2e\u2e30\u2e31\u3001-\u3003\u3008-\u3011\u3014-\u301f\u3030\u303d\u30a0\u30fb\ua4fe\ua4ff\ua60d-\ua60f\ua673\ua67e\ua6f2-\ua6f7\ua874-\ua877\ua8ce\ua8cf\ua8f8-\ua8fa\ua92e\ua92f\ua95f\ua9c1-\ua9cd\ua9de\ua9df\uaa5c-\uaa5f\uaade\uaadf\uabeb\ufd3e\ufd3f\ufe10-\ufe19\ufe30-\ufe52\ufe54-\ufe61\ufe63\ufe68\ufe6a\ufe6b\uff01-\uff03\uff05-\uff0a\uff0c-\uff0f\uff1a\uff1b\uff1f\uff20\uff3b-\uff3d\uff3f\uff5b\uff5d\uff5f-\uff65]$"),c=e,i=13,W=/^\s+$/,E=u,a=function(t,e,n){n=m(m({},{includeWhitespace:!1,includePunctuation:!1}),n);for(var r=[],o=[],u=0;u<t.length;u++){var c=e(t[u]);"\ufeff"!==c&&(r.push(t[u]),o.push(c))}var i,a,s=function(t,e){for(var n=t.length,r=new Array(n),o=0;o<n;o++){var u=t[o];r[o]=e(u,o)}return r}(o,(i=g,a={},function(t){if(a[t])return a[t];var e=i(t);return a[t]=e}));return d(r,o,s,n)},s=tinymce.util.Tools.resolve("tinymce.dom.TreeWalker"),x=tinymce.util.Tools.resolve("tinymce.util.Delay");void 0===w&&(w=300),t.add("wordcount",function(t){var e,n,r,o,u,c,i,a={body:{getWordCount:y(t),getCharacterCount:f(t,p),getCharacterCountWithoutSpaces:f(t,h)},selection:{getWordCount:C(t,l),getCharacterCount:C(t,p),getCharacterCountWithoutSpaces:C(t,h)},getCount:y(t)};function s(){return e.execCommand("mceWordCount")}return i=a,(c=t).addCommand("mceWordCount",function(){var t=i;c.windowManager.open({title:"Word Count",body:{type:"panel",items:[{type:"table",header:["Count","Document","Selection"],cells:[["Words",String(t.body.getWordCount()),String(t.selection.getWordCount())],["Characters (no spaces)",String(t.body.getCharacterCountWithoutSpaces()),String(t.selection.getCharacterCountWithoutSpaces())],["Characters",String(t.body.getCharacterCount()),String(t.selection.getCharacterCount())]]}]},buttons:[{type:"cancel",name:"close",text:"Close",primary:!0}]})}),(e=t).ui.registry.addButton("wordcount",{tooltip:"Word count",icon:"character-count",onAction:s}),e.ui.registry.addMenuItem("wordcount",{text:"Word count",icon:"character-count",onAction:s}),n=t,r=a,o=w,u=x.debounce(function(){return v(n,r)},o),n.on("init",function(){v(n,r),x.setEditorTimeout(n,function(){n.on("SetContent BeforeAddUndo Undo Redo ViewUpdate keyup",u)},0)}),a})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/skins/content/dark/content.min.css b/public/static/assets/gougu/module/tinymce/skins/content/dark/content.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..07d40c265bd2991c704e773c051305ada5a76cdc
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/skins/content/dark/content.min.css
@@ -0,0 +1,7 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+body{background-color:#2f3742;color:#dfe0e4;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem}a{color:#4099ff}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#6d737b}figure{display:table;margin:1rem auto}figure figcaption{color:#8a8f97;display:block;margin-top:.25rem;text-align:center}hr{border-color:#6d737b;border-style:solid;border-width:1px 0 0 0}code{background-color:#6d737b;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #6d737b;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #6d737b;margin-right:1.5rem;padding-right:1rem}
diff --git a/public/static/assets/gougu/module/tinymce/skins/content/default/content.min.css b/public/static/assets/gougu/module/tinymce/skins/content/default/content.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..29cd987eae6589f3d9cf59c33c8a3662ae317956
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/skins/content/default/content.min.css
@@ -0,0 +1,7 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#ccc}figure{display:table;margin:1rem auto}figure figcaption{color:#999;display:block;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}code{background-color:#e8e8e8;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem}
diff --git a/public/static/assets/gougu/module/tinymce/skins/content/document/content.min.css b/public/static/assets/gougu/module/tinymce/skins/content/document/content.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..a1feef4c1f15856d489cdfe7b25957c64def72aa
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/skins/content/document/content.min.css
@@ -0,0 +1,7 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+@media screen{html{background:#f4f4f4;min-height:100%}}body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif}@media screen{body{background-color:#fff;box-shadow:0 0 4px rgba(0,0,0,.15);box-sizing:border-box;margin:1rem auto 0;max-width:820px;min-height:calc(100vh - 1rem);padding:4rem 6rem 6rem 6rem}}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#ccc}figure figcaption{color:#999;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem}
diff --git a/public/static/assets/gougu/module/tinymce/skins/content/writer/content.min.css b/public/static/assets/gougu/module/tinymce/skins/content/writer/content.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..0d8f5d3400ddf43df57c1bd35aa53f7d569250dd
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/skins/content/writer/content.min.css
@@ -0,0 +1,7 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem auto;max-width:900px}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#ccc}figure{display:table;margin:1rem auto}figure figcaption{color:#999;display:block;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}code{background-color:#e8e8e8;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem}
diff --git a/public/static/assets/gougu/module/tinymce/skins/ui/oxide-dark/content.inline.min.css b/public/static/assets/gougu/module/tinymce/skins/ui/oxide-dark/content.inline.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..b4ab9a3a563672b3281140239f8a935b9cfd6c4d
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/skins/ui/oxide-dark/content.inline.min.css
@@ -0,0 +1,7 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment--active{background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:1298}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #b4d7ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #b4d7ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #b4d7ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#b4d7ff}.mce-content-body .mce-edit-focus{outline:3px solid #b4d7ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid rgba(180,215,255,.7);bottom:-1px;content:'';left:-1px;mix-blend-mode:multiply;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#b4d7ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'}
diff --git a/public/static/assets/gougu/module/tinymce/skins/ui/oxide-dark/content.min.css b/public/static/assets/gougu/module/tinymce/skins/ui/oxide-dark/content.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..e27b8a0204c84beed414f6db0d7d414cfd1bca5f
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/skins/ui/oxide-dark/content.min.css
@@ -0,0 +1,7 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment--active{background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%236d737b%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#f8f8f2;background:0 0;text-shadow:0 1px rgba(0,0,0,.3);font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto;border-radius:.3em}:not(pre)>code[class*=language-],pre[class*=language-]{background:#282a36}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#6272a4}.token.punctuation{color:#f8f8f2}.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#ff79c6}.token.boolean,.token.number{color:#bd93f9}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#50fa7b}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#f1fa8c}.token.keyword{color:#8be9fd}.token.important,.token.regex{color:#ffb86c}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:1298}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #4099ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #4099ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #4099ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #4099ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #4099ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#4099ff}.mce-content-body .mce-edit-focus{outline:3px solid #4099ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid transparent;bottom:-1px;content:'';left:-1px;mix-blend-mode:lighten;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#4099ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'}body{font-family:sans-serif}table{border-collapse:collapse}
diff --git a/public/static/assets/gougu/module/tinymce/skins/ui/oxide-dark/content.mobile.min.css b/public/static/assets/gougu/module/tinymce/skins/ui/oxide-dark/content.mobile.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..35f7dc08bc50f2b8cf101d775ac1cccfb5423784
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/skins/ui/oxide-dark/content.mobile.min.css
@@ -0,0 +1,7 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{background-color:green;display:inline-block;opacity:.5;position:absolute}body{-webkit-text-size-adjust:none}body img{max-width:96vw}body table img{max-width:95%}body{font-family:sans-serif}table{border-collapse:collapse}
diff --git a/public/static/assets/gougu/module/tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff b/public/static/assets/gougu/module/tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff
new file mode 100644
index 0000000000000000000000000000000000000000..1e3be038a607cb7c2544ed8ae3d6621f77bf4c38
Binary files /dev/null and b/public/static/assets/gougu/module/tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff differ
diff --git a/public/static/assets/gougu/module/tinymce/skins/ui/oxide-dark/skin.min.css b/public/static/assets/gougu/module/tinymce/skins/ui/oxide-dark/skin.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..e71f6f0104d5a3989cd57217f37a539323ff9609
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/skins/ui/oxide-dark/skin.min.css
@@ -0,0 +1,7 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.tox{box-shadow:none;box-sizing:content-box;color:#2a3746;cursor:auto;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-style:normal;font-weight:400;line-height:normal;-webkit-tap-highlight-color:transparent;text-decoration:none;text-shadow:none;text-transform:none;vertical-align:initial;white-space:normal}.tox :not(svg):not(rect){box-sizing:inherit;color:inherit;cursor:inherit;direction:inherit;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;line-height:inherit;-webkit-tap-highlight-color:inherit;text-align:inherit;text-decoration:inherit;text-shadow:inherit;text-transform:inherit;vertical-align:inherit;white-space:inherit}.tox :not(svg):not(rect){background:0 0;border:0;box-shadow:none;float:none;height:auto;margin:0;max-width:none;outline:0;padding:0;position:static;width:auto}.tox:not([dir=rtl]){direction:ltr;text-align:left}.tox[dir=rtl]{direction:rtl;text-align:right}.tox-tinymce{border:1px solid #000;border-radius:0;box-shadow:none;box-sizing:border-box;display:flex;flex-direction:column;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;overflow:hidden;position:relative;visibility:inherit!important}.tox-tinymce-inline{border:none;box-shadow:none}.tox-tinymce-inline .tox-editor-header{background-color:transparent;border:1px solid #000;border-radius:0;box-shadow:none}.tox-tinymce-aux{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;z-index:1300}.tox-tinymce :focus,.tox-tinymce-aux :focus{outline:0}button::-moz-focus-inner{border:0}.tox[dir=rtl] .tox-icon--flip svg{transform:rotateY(180deg)}.tox .accessibility-issue__header{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description{align-items:stretch;border:1px solid #000;border-radius:3px;display:flex;justify-content:space-between}.tox .accessibility-issue__description>div{padding-bottom:4px}.tox .accessibility-issue__description>div>div{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description>:last-child:not(:only-child){border-color:#000;border-style:solid}.tox .accessibility-issue__repair{margin-top:16px}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description{background-color:rgba(32,122,183,.5);border-color:#207ab7;color:#fff}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description>:last-child{border-color:#207ab7}.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg{fill:#fff}.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description{background-color:rgba(255,165,0,.5);border-color:rgba(255,165,0,.8);color:#fff}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description>:last-child{border-color:rgba(255,165,0,.8)}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg{fill:#fff}.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description{background-color:rgba(204,0,0,.5);border-color:rgba(204,0,0,.8);color:#fff}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description>:last-child{border-color:rgba(204,0,0,.8)}.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg{fill:#fff}.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description{background-color:rgba(120,171,70,.5);border-color:rgba(120,171,70,.8);color:#fff}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description>:last-child{border-color:rgba(120,171,70,.8)}.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg{fill:#fff}.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon{color:#fff}.tox .tox-dialog__body-content .accessibility-issue__header h1,.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2{margin-top:0}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-left:4px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-left:auto}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description{padding:4px 4px 4px 8px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description>:last-child{border-left-width:1px;padding-left:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-right:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-right:auto}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description{padding:4px 8px 4px 4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description>:last-child{border-right-width:1px;padding-right:4px}.tox .tox-anchorbar{display:flex;flex:0 0 auto}.tox .tox-bar{display:flex;flex:0 0 auto}.tox .tox-button{background-color:#207ab7;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#207ab7;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;line-height:24px;margin:0;outline:0;padding:4px 16px;text-align:center;text-decoration:none;text-transform:none;white-space:nowrap}.tox .tox-button[disabled]{background-color:#207ab7;background-image:none;border-color:#207ab7;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-button:focus:not(:disabled){background-color:#1c6ca1;background-image:none;border-color:#1c6ca1;box-shadow:none;color:#fff}.tox .tox-button:hover:not(:disabled){background-color:#1c6ca1;background-image:none;border-color:#1c6ca1;box-shadow:none;color:#fff}.tox .tox-button:active:not(:disabled){background-color:#185d8c;background-image:none;border-color:#185d8c;box-shadow:none;color:#fff}.tox .tox-button--secondary{background-color:#3d546f;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#3d546f;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;color:#fff;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;outline:0;padding:4px 16px;text-decoration:none;text-transform:none}.tox .tox-button--secondary[disabled]{background-color:#3d546f;background-image:none;border-color:#3d546f;box-shadow:none;color:rgba(255,255,255,.5)}.tox .tox-button--secondary:focus:not(:disabled){background-color:#34485f;background-image:none;border-color:#34485f;box-shadow:none;color:#fff}.tox .tox-button--secondary:hover:not(:disabled){background-color:#34485f;background-image:none;border-color:#34485f;box-shadow:none;color:#fff}.tox .tox-button--secondary:active:not(:disabled){background-color:#2b3b4e;background-image:none;border-color:#2b3b4e;box-shadow:none;color:#fff}.tox .tox-button--icon,.tox .tox-button.tox-button--icon,.tox .tox-button.tox-button--secondary.tox-button--icon{padding:4px}.tox .tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg{display:block;fill:currentColor}.tox .tox-button-link{background:0;border:none;box-sizing:border-box;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-weight:400;line-height:1.3;margin:0;padding:0;white-space:nowrap}.tox .tox-button-link--sm{font-size:14px}.tox .tox-button--naked{background-color:transparent;border-color:transparent;box-shadow:unset;color:#fff}.tox .tox-button--naked[disabled]{background-color:#3d546f;border-color:#3d546f;box-shadow:none;color:rgba(255,255,255,.5)}.tox .tox-button--naked:hover:not(:disabled){background-color:#34485f;border-color:#34485f;box-shadow:none;color:#fff}.tox .tox-button--naked:focus:not(:disabled){background-color:#34485f;border-color:#34485f;box-shadow:none;color:#fff}.tox .tox-button--naked:active:not(:disabled){background-color:#2b3b4e;border-color:#2b3b4e;box-shadow:none;color:#fff}.tox .tox-button--naked .tox-icon svg{fill:currentColor}.tox .tox-button--naked.tox-button--icon:hover:not(:disabled){color:#fff}.tox .tox-checkbox{align-items:center;border-radius:3px;cursor:pointer;display:flex;height:36px;min-width:36px}.tox .tox-checkbox__input{height:1px;overflow:hidden;position:absolute;top:auto;width:1px}.tox .tox-checkbox__icons{align-items:center;border-radius:3px;box-shadow:0 0 0 2px transparent;box-sizing:content-box;display:flex;height:24px;justify-content:center;padding:calc(4px - 1px);width:24px}.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:block;fill:rgba(255,255,255,.2)}.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:none;fill:#207ab7}.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg{display:none;fill:#207ab7}.tox .tox-checkbox--disabled{color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg{fill:rgba(255,255,255,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{fill:rgba(255,255,255,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{fill:rgba(255,255,255,.5)}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__checked svg{display:block}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:block}.tox input.tox-checkbox__input:focus+.tox-checkbox__icons{border-radius:3px;box-shadow:inset 0 0 0 1px #207ab7;padding:calc(4px - 1px)}.tox:not([dir=rtl]) .tox-checkbox__label{margin-left:4px}.tox:not([dir=rtl]) .tox-checkbox__input{left:-10000px}.tox:not([dir=rtl]) .tox-bar .tox-checkbox{margin-left:4px}.tox[dir=rtl] .tox-checkbox__label{margin-right:4px}.tox[dir=rtl] .tox-checkbox__input{right:-10000px}.tox[dir=rtl] .tox-bar .tox-checkbox{margin-right:4px}.tox .tox-collection--toolbar .tox-collection__group{display:flex;padding:0}.tox .tox-collection--grid .tox-collection__group{display:flex;flex-wrap:wrap;max-height:208px;overflow-x:hidden;overflow-y:auto;padding:0}.tox .tox-collection--list .tox-collection__group{border-bottom-width:0;border-color:#1a1a1a;border-left-width:0;border-right-width:0;border-style:solid;border-top-width:1px;padding:4px 0}.tox .tox-collection--list .tox-collection__group:first-child{border-top-width:0}.tox .tox-collection__group-heading{background-color:#333;color:#fff;cursor:default;font-size:12px;font-style:normal;font-weight:400;margin-bottom:4px;margin-top:-4px;padding:4px 8px;text-transform:none;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tox .tox-collection__item{align-items:center;color:#fff;cursor:pointer;display:flex;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tox .tox-collection--list .tox-collection__item{padding:4px 8px}.tox .tox-collection--toolbar .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--grid .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--list .tox-collection__item--enabled{background-color:#2b3b4e;color:#fff}.tox .tox-collection--list .tox-collection__item--active{background-color:#4a5562}.tox .tox-collection--toolbar .tox-collection__item--enabled{background-color:#757d87;color:#fff}.tox .tox-collection--toolbar .tox-collection__item--active{background-color:#4a5562}.tox .tox-collection--grid .tox-collection__item--enabled{background-color:#757d87;color:#fff}.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled){background-color:#4a5562;color:#fff}.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#fff}.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#fff}.tox .tox-collection__item-checkmark,.tox .tox-collection__item-icon{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.tox .tox-collection__item-checkmark svg,.tox .tox-collection__item-icon svg{fill:currentColor}.tox .tox-collection--toolbar-lg .tox-collection__item-icon{height:48px;width:48px}.tox .tox-collection__item-label{color:currentColor;display:inline-block;flex:1;-ms-flex-preferred-size:auto;font-size:14px;font-style:normal;font-weight:400;line-height:24px;text-transform:none;word-break:break-all}.tox .tox-collection__item-accessory{color:rgba(255,255,255,.5);display:inline-block;font-size:14px;height:24px;line-height:24px;text-transform:none}.tox .tox-collection__item-caret{align-items:center;display:flex;min-height:24px}.tox .tox-collection__item-caret::after{content:'';font-size:0;min-height:inherit}.tox .tox-collection__item-caret svg{fill:#fff}.tox .tox-collection__item--state-disabled{background-color:transparent;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-collection__item--state-disabled .tox-collection__item-caret svg{fill:rgba(255,255,255,.5)}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg{display:none}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-accessory+.tox-collection__item-checkmark{display:none}.tox .tox-collection--horizontal{background-color:#2b3b4e;border:1px solid #1a1a1a;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15);display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:nowrap;margin-bottom:0;overflow-x:auto;padding:0}.tox .tox-collection--horizontal .tox-collection__group{align-items:center;display:flex;flex-wrap:nowrap;margin:0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item{height:34px;margin:2px 0 3px 0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item-label{white-space:nowrap}.tox .tox-collection--horizontal .tox-collection__item-caret{margin-left:4px}.tox .tox-collection__item-container{display:flex}.tox .tox-collection__item-container--row{align-items:center;flex:1 1 auto;flex-direction:row}.tox .tox-collection__item-container--row.tox-collection__item-container--align-left{margin-right:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--align-right{justify-content:flex-end;margin-left:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top{align-items:flex-start;margin-bottom:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle{align-items:center}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom{align-items:flex-end;margin-top:auto}.tox .tox-collection__item-container--column{-ms-grid-row-align:center;align-self:center;flex:1 1 auto;flex-direction:column}.tox .tox-collection__item-container--column.tox-collection__item-container--align-left{align-items:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--align-right{align-items:flex-end}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top{align-self:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle{-ms-grid-row-align:center;align-self:center}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom{align-self:flex-end}.tox:not([dir=rtl]) .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-right:1px solid #000}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>:not(:first-child){margin-left:8px}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-left:4px}.tox:not([dir=rtl]) .tox-collection__item-accessory{margin-left:16px;text-align:right}.tox:not([dir=rtl]) .tox-collection .tox-collection__item-caret{margin-left:16px}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-left:1px solid #000}.tox[dir=rtl] .tox-collection--list .tox-collection__item>:not(:first-child){margin-right:8px}.tox[dir=rtl] .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-right:4px}.tox[dir=rtl] .tox-collection__item-accessory{margin-right:16px;text-align:left}.tox[dir=rtl] .tox-collection .tox-collection__item-caret{margin-right:16px;transform:rotateY(180deg)}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__item-caret{margin-right:4px}.tox .tox-color-picker-container{display:flex;flex-direction:row;height:225px;margin:0}.tox .tox-sv-palette{box-sizing:border-box;display:flex;height:100%}.tox .tox-sv-palette-spectrum{height:100%}.tox .tox-sv-palette,.tox .tox-sv-palette-spectrum{width:225px}.tox .tox-sv-palette-thumb{background:0 0;border:1px solid #000;border-radius:50%;box-sizing:content-box;height:12px;position:absolute;width:12px}.tox .tox-sv-palette-inner-thumb{border:1px solid #fff;border-radius:50%;height:10px;position:absolute;width:10px}.tox .tox-hue-slider{box-sizing:border-box;height:100%;width:25px}.tox .tox-hue-slider-spectrum{background:linear-gradient(to bottom,red,#ff0080,#f0f,#8000ff,#00f,#0080ff,#0ff,#00ff80,#0f0,#80ff00,#ff0,#ff8000,red);height:100%;width:100%}.tox .tox-hue-slider,.tox .tox-hue-slider-spectrum{width:20px}.tox .tox-hue-slider-thumb{background:#fff;border:1px solid #000;box-sizing:content-box;height:4px;width:100%}.tox .tox-rgb-form{display:flex;flex-direction:column;justify-content:space-between}.tox .tox-rgb-form div{align-items:center;display:flex;justify-content:space-between;margin-bottom:5px;width:inherit}.tox .tox-rgb-form input{width:6em}.tox .tox-rgb-form input.tox-invalid{border:1px solid red!important}.tox .tox-rgb-form .tox-rgba-preview{border:1px solid #000;flex-grow:2;margin-bottom:0}.tox:not([dir=rtl]) .tox-sv-palette{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider-thumb{margin-left:-1px}.tox:not([dir=rtl]) .tox-rgb-form label{margin-right:.5em}.tox[dir=rtl] .tox-sv-palette{margin-left:15px}.tox[dir=rtl] .tox-hue-slider{margin-left:15px}.tox[dir=rtl] .tox-hue-slider-thumb{margin-right:-1px}.tox[dir=rtl] .tox-rgb-form label{margin-left:.5em}.tox .tox-toolbar .tox-swatches,.tox .tox-toolbar__overflow .tox-swatches,.tox .tox-toolbar__primary .tox-swatches{margin:2px 0 3px 4px}.tox .tox-collection--list .tox-collection__group .tox-swatches-menu{border:0;margin:-4px 0}.tox .tox-swatches__row{display:flex}.tox .tox-swatch{height:30px;transition:transform .15s,box-shadow .15s;width:30px}.tox .tox-swatch:focus,.tox .tox-swatch:hover{box-shadow:0 0 0 1px rgba(127,127,127,.3) inset;transform:scale(.8)}.tox .tox-swatch--remove{align-items:center;display:flex;justify-content:center}.tox .tox-swatch--remove svg path{stroke:#e74c3c}.tox .tox-swatches__picker-btn{align-items:center;background-color:transparent;border:0;cursor:pointer;display:flex;height:30px;justify-content:center;outline:0;padding:0;width:30px}.tox .tox-swatches__picker-btn svg{height:24px;width:24px}.tox .tox-swatches__picker-btn:hover{background:#4a5562}.tox:not([dir=rtl]) .tox-swatches__picker-btn{margin-left:auto}.tox[dir=rtl] .tox-swatches__picker-btn{margin-right:auto}.tox .tox-comment-thread{background:#2b3b4e;position:relative}.tox .tox-comment-thread>:not(:first-child){margin-top:8px}.tox .tox-comment{background:#2b3b4e;border:1px solid #000;border-radius:3px;box-shadow:0 4px 8px 0 rgba(42,55,70,.1);padding:8px 8px 16px 8px;position:relative}.tox .tox-comment__header{align-items:center;color:#fff;display:flex;justify-content:space-between}.tox .tox-comment__date{color:rgba(255,255,255,.5);font-size:12px}.tox .tox-comment__body{color:#fff;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;margin-top:8px;position:relative;text-transform:initial}.tox .tox-comment__body textarea{resize:none;white-space:normal;width:100%}.tox .tox-comment__expander{padding-top:8px}.tox .tox-comment__expander p{color:rgba(255,255,255,.5);font-size:14px;font-style:normal}.tox .tox-comment__body p{margin:0}.tox .tox-comment__buttonspacing{padding-top:16px;text-align:center}.tox .tox-comment-thread__overlay::after{background:#2b3b4e;bottom:0;content:"";display:flex;left:0;opacity:.9;position:absolute;right:0;top:0;z-index:5}.tox .tox-comment__reply{display:flex;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end;margin-top:8px}.tox .tox-comment__reply>:first-child{margin-bottom:8px;width:100%}.tox .tox-comment__edit{display:flex;flex-wrap:wrap;justify-content:flex-end;margin-top:16px}.tox .tox-comment__gradient::after{background:linear-gradient(rgba(43,59,78,0),#2b3b4e);bottom:0;content:"";display:block;height:5em;margin-top:-40px;position:absolute;width:100%}.tox .tox-comment__overlay{background:#2b3b4e;bottom:0;display:flex;flex-direction:column;flex-grow:1;left:0;opacity:.9;position:absolute;right:0;text-align:center;top:0;z-index:5}.tox .tox-comment__loading-text{align-items:center;color:#fff;display:flex;flex-direction:column;position:relative}.tox .tox-comment__loading-text>div{padding-bottom:16px}.tox .tox-comment__overlaytext{bottom:0;flex-direction:column;font-size:14px;left:0;padding:1em;position:absolute;right:0;top:0;z-index:10}.tox .tox-comment__overlaytext p{background-color:#2b3b4e;box-shadow:0 0 8px 8px #2b3b4e;color:#fff;text-align:center}.tox .tox-comment__overlaytext div:nth-of-type(2){font-size:.8em}.tox .tox-comment__busy-spinner{align-items:center;background-color:#2b3b4e;bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:20}.tox .tox-comment__scroll{display:flex;flex-direction:column;flex-shrink:1;overflow:auto}.tox .tox-conversations{margin:8px}.tox:not([dir=rtl]) .tox-comment__edit{margin-left:8px}.tox:not([dir=rtl]) .tox-comment__buttonspacing>:last-child,.tox:not([dir=rtl]) .tox-comment__edit>:last-child,.tox:not([dir=rtl]) .tox-comment__reply>:last-child{margin-left:8px}.tox[dir=rtl] .tox-comment__edit{margin-right:8px}.tox[dir=rtl] .tox-comment__buttonspacing>:last-child,.tox[dir=rtl] .tox-comment__edit>:last-child,.tox[dir=rtl] .tox-comment__reply>:last-child{margin-right:8px}.tox .tox-user{align-items:center;display:flex}.tox .tox-user__avatar svg{fill:rgba(255,255,255,.5)}.tox .tox-user__name{color:rgba(255,255,255,.5);font-size:12px;font-style:normal;font-weight:700;text-transform:uppercase}.tox:not([dir=rtl]) .tox-user__avatar svg{margin-right:8px}.tox:not([dir=rtl]) .tox-user__avatar+.tox-user__name{margin-left:8px}.tox[dir=rtl] .tox-user__avatar svg{margin-left:8px}.tox[dir=rtl] .tox-user__avatar+.tox-user__name{margin-right:8px}.tox .tox-dialog-wrap{align-items:center;bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:1100}.tox .tox-dialog-wrap__backdrop{background-color:rgba(34,47,62,.75);bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.tox .tox-dialog-wrap__backdrop--opaque{background-color:#222f3e}.tox .tox-dialog{background-color:#2b3b4e;border-color:#000;border-radius:3px;border-style:solid;border-width:1px;box-shadow:0 16px 16px -10px rgba(42,55,70,.15),0 0 40px 1px rgba(42,55,70,.15);display:flex;flex-direction:column;max-height:100%;max-width:480px;overflow:hidden;position:relative;width:95vw;z-index:2}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog{align-self:flex-start;margin:8px auto;width:calc(100vw - 16px)}}.tox .tox-dialog-inline{z-index:1100}.tox .tox-dialog__header{align-items:center;background-color:#2b3b4e;border-bottom:none;color:#fff;display:flex;font-size:16px;justify-content:space-between;padding:8px 16px 0 16px;position:relative}.tox .tox-dialog__header .tox-button{z-index:1}.tox .tox-dialog__draghandle{cursor:grab;height:100%;left:0;position:absolute;top:0;width:100%}.tox .tox-dialog__draghandle:active{cursor:grabbing}.tox .tox-dialog__dismiss{margin-left:auto}.tox .tox-dialog__title{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:20px;font-style:normal;font-weight:400;line-height:1.3;margin:0;text-transform:none}.tox .tox-dialog__body{color:#fff;display:flex;flex:1;-ms-flex-preferred-size:auto;font-size:16px;font-style:normal;font-weight:400;line-height:1.3;min-width:0;text-align:left;text-transform:none}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body{flex-direction:column}}.tox .tox-dialog__body-nav{align-items:flex-start;display:flex;flex-direction:column;padding:16px 16px}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body-nav{flex-direction:row;-webkit-overflow-scrolling:touch;overflow-x:auto;padding-bottom:0}}.tox .tox-dialog__body-nav-item{border-bottom:2px solid transparent;color:rgba(255,255,255,.5);display:inline-block;font-size:14px;line-height:1.3;margin-bottom:8px;text-decoration:none;white-space:nowrap}.tox .tox-dialog__body-nav-item:focus{background-color:rgba(32,122,183,.1)}.tox .tox-dialog__body-nav-item--active{border-bottom:2px solid #207ab7;color:#207ab7}.tox .tox-dialog__body-content{box-sizing:border-box;display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto;max-height:650px;overflow:auto;-webkit-overflow-scrolling:touch;padding:16px 16px}.tox .tox-dialog__body-content>*{margin-bottom:0;margin-top:16px}.tox .tox-dialog__body-content>:first-child{margin-top:0}.tox .tox-dialog__body-content>:last-child{margin-bottom:0}.tox .tox-dialog__body-content>:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog__body-content a{color:#207ab7;cursor:pointer;text-decoration:none}.tox .tox-dialog__body-content a:focus,.tox .tox-dialog__body-content a:hover{color:#185d8c;text-decoration:none}.tox .tox-dialog__body-content a:active{color:#185d8c;text-decoration:none}.tox .tox-dialog__body-content svg{fill:#fff}.tox .tox-dialog__body-content ul{display:block;list-style-type:disc;margin-bottom:16px;-webkit-margin-end:0;margin-inline-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-padding-start:2.5rem;padding-inline-start:2.5rem}.tox .tox-dialog__body-content .tox-form__group h1{color:#fff;font-size:20px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group h2{color:#fff;font-size:16px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group p{margin-bottom:16px}.tox .tox-dialog__body-content .tox-form__group h1:first-child,.tox .tox-dialog__body-content .tox-form__group h2:first-child,.tox .tox-dialog__body-content .tox-form__group p:first-child{margin-top:0}.tox .tox-dialog__body-content .tox-form__group h1:last-child,.tox .tox-dialog__body-content .tox-form__group h2:last-child,.tox .tox-dialog__body-content .tox-form__group p:last-child{margin-bottom:0}.tox .tox-dialog__body-content .tox-form__group h1:only-child,.tox .tox-dialog__body-content .tox-form__group h2:only-child,.tox .tox-dialog__body-content .tox-form__group p:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog--width-lg{height:650px;max-width:1200px}.tox .tox-dialog--width-md{max-width:800px}.tox .tox-dialog--width-md .tox-dialog__body-content{overflow:auto}.tox .tox-dialog__body-content--centered{text-align:center}.tox .tox-dialog__footer{align-items:center;background-color:#2b3b4e;border-top:1px solid #000;display:flex;justify-content:space-between;padding:8px 16px}.tox .tox-dialog__footer-end,.tox .tox-dialog__footer-start{display:flex}.tox .tox-dialog__busy-spinner{align-items:center;background-color:rgba(34,47,62,.75);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:3}.tox .tox-dialog__table{border-collapse:collapse;width:100%}.tox .tox-dialog__table thead th{font-weight:700;padding-bottom:8px}.tox .tox-dialog__table tbody tr{border-bottom:1px solid #000}.tox .tox-dialog__table tbody tr:last-child{border-bottom:none}.tox .tox-dialog__table td{padding-bottom:8px;padding-top:8px}.tox .tox-dialog__popups{position:absolute;width:100%;z-index:1100}.tox .tox-dialog__body-iframe{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-iframe .tox-navobj{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2){flex:1;-ms-flex-preferred-size:auto;height:100%}.tox .tox-dialog-dock-fadeout{opacity:0;visibility:hidden}.tox .tox-dialog-dock-fadein{opacity:1;visibility:visible}.tox .tox-dialog-dock-transition{transition:visibility 0s linear .3s,opacity .3s ease}.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein{transition-delay:0s}.tox.tox-platform-ie .tox-dialog-wrap{position:-ms-device-fixed}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav{margin-right:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav-item:not(:first-child){margin-left:8px}}.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end>*,.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start>*{margin-left:8px}.tox[dir=rtl] .tox-dialog__body{text-align:right}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav{margin-left:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav-item:not(:first-child){margin-right:8px}}.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end>*,.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start>*{margin-right:8px}body.tox-dialog__disable-scroll{overflow:hidden}.tox .tox-dropzone-container{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dropzone{align-items:center;background:#fff;border:2px dashed #000;box-sizing:border-box;display:flex;flex-direction:column;flex-grow:1;justify-content:center;min-height:100px;padding:10px}.tox .tox-dropzone p{color:rgba(255,255,255,.5);margin:0 0 16px 0}.tox .tox-edit-area{display:flex;flex:1;-ms-flex-preferred-size:auto;overflow:hidden;position:relative}.tox .tox-edit-area__iframe{background-color:#fff;border:0;box-sizing:border-box;flex:1;-ms-flex-preferred-size:auto;height:100%;position:absolute;width:100%}.tox.tox-inline-edit-area{border:1px dotted #000}.tox .tox-editor-container{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.tox .tox-editor-header{z-index:1}.tox:not(.tox-tinymce-inline) .tox-editor-header{box-shadow:none;transition:box-shadow .5s}.tox.tox-tinymce--toolbar-bottom .tox-editor-header,.tox.tox-tinymce-inline .tox-editor-header{margin-bottom:-1px}.tox.tox-tinymce--toolbar-sticky-on .tox-editor-header{background-color:transparent;box-shadow:0 4px 4px -3px rgba(0,0,0,.25)}.tox-editor-dock-fadeout{opacity:0;visibility:hidden}.tox-editor-dock-fadein{opacity:1;visibility:visible}.tox-editor-dock-transition{transition:visibility 0s linear .25s,opacity .25s ease}.tox-editor-dock-transition.tox-editor-dock-fadein{transition-delay:0s}.tox .tox-control-wrap{flex:1;position:relative}.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid{display:none}.tox .tox-control-wrap svg{display:block}.tox .tox-control-wrap__status-icon-wrap{position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-control-wrap__status-icon-invalid svg{fill:#c00}.tox .tox-control-wrap__status-icon-unknown svg{fill:orange}.tox .tox-control-wrap__status-icon-valid svg{fill:green}.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield{padding-right:32px}.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap{right:4px}.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield{padding-left:32px}.tox[dir=rtl] .tox-control-wrap__status-icon-wrap{left:4px}.tox .tox-autocompleter{max-width:25em}.tox .tox-autocompleter .tox-menu{max-width:25em}.tox .tox-autocompleter .tox-autocompleter-highlight{font-weight:700}.tox .tox-color-input{display:flex;position:relative;z-index:1}.tox .tox-color-input .tox-textfield{z-index:-1}.tox .tox-color-input span{border-color:rgba(42,55,70,.2);border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;height:24px;position:absolute;top:6px;width:24px}.tox .tox-color-input span:focus:not([aria-disabled=true]),.tox .tox-color-input span:hover:not([aria-disabled=true]){border-color:#207ab7;cursor:pointer}.tox .tox-color-input span::before{background-image:linear-gradient(45deg,rgba(255,255,255,.25) 25%,transparent 25%),linear-gradient(-45deg,rgba(255,255,255,.25) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,rgba(255,255,255,.25) 75%),linear-gradient(-45deg,transparent 75%,rgba(255,255,255,.25) 75%);background-position:0 0,0 6px,6px -6px,-6px 0;background-size:12px 12px;border:1px solid #2b3b4e;border-radius:3px;box-sizing:border-box;content:'';height:24px;left:-1px;position:absolute;top:-1px;width:24px;z-index:-1}.tox .tox-color-input span[aria-disabled=true]{cursor:not-allowed}.tox:not([dir=rtl]) .tox-color-input .tox-textfield{padding-left:36px}.tox:not([dir=rtl]) .tox-color-input span{left:6px}.tox[dir=rtl] .tox-color-input .tox-textfield{padding-right:36px}.tox[dir=rtl] .tox-color-input span{right:6px}.tox .tox-label,.tox .tox-toolbar-label{color:rgba(255,255,255,.5);display:block;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;padding:0 8px 0 0;text-transform:none;white-space:nowrap}.tox .tox-toolbar-label{padding:0 8px}.tox[dir=rtl] .tox-label{padding:0 0 0 8px}.tox .tox-form{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-form__group{box-sizing:border-box;margin-bottom:4px}.tox .tox-form-group--maximize{flex:1}.tox .tox-form__group--error{color:#c00}.tox .tox-form__group--collection{display:flex}.tox .tox-form__grid{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between}.tox .tox-form__grid--2col>.tox-form__group{width:calc(50% - (8px / 2))}.tox .tox-form__grid--3col>.tox-form__group{width:calc(100% / 3 - (8px / 2))}.tox .tox-form__grid--4col>.tox-form__group{width:calc(25% - (8px / 2))}.tox .tox-form__controls-h-stack{align-items:center;display:flex}.tox .tox-form__group--inline{align-items:center;display:flex}.tox .tox-form__group--stretched{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-textarea{flex:1;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-navobj{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-navobj :nth-child(2){flex:1;-ms-flex-preferred-size:auto;height:100%}.tox:not([dir=rtl]) .tox-form__controls-h-stack>:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-form__controls-h-stack>:not(:first-child){margin-right:4px}.tox .tox-lock.tox-locked .tox-lock-icon__unlock,.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock{display:none}.tox .tox-listboxfield .tox-listbox--select,.tox .tox-textarea,.tox .tox-textfield,.tox .tox-toolbar-textfield{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#2b3b4e;border-color:#000;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 4.75px;resize:none;width:100%}.tox .tox-textarea[disabled],.tox .tox-textfield[disabled]{background-color:#222f3e;color:rgba(255,255,255,.85);cursor:not-allowed}.tox .tox-listboxfield .tox-listbox--select:focus,.tox .tox-textarea:focus,.tox .tox-textfield:focus{background-color:#2b3b4e;border-color:#207ab7;box-shadow:none;outline:0}.tox .tox-toolbar-textfield{border-width:0;margin-bottom:3px;margin-top:2px;max-width:250px}.tox .tox-naked-btn{background-color:transparent;border:0;border-color:transparent;box-shadow:unset;color:#207ab7;cursor:pointer;display:block;margin:0;padding:0}.tox .tox-naked-btn svg{display:block;fill:#fff}.tox:not([dir=rtl]) .tox-toolbar-textfield+*{margin-left:4px}.tox[dir=rtl] .tox-toolbar-textfield+*{margin-right:4px}.tox .tox-listboxfield{cursor:pointer;position:relative}.tox .tox-listboxfield .tox-listbox--select[disabled]{background-color:#19232e;color:rgba(255,255,255,.85);cursor:not-allowed}.tox .tox-listbox__select-label{cursor:default;flex:1;margin:0 4px}.tox .tox-listbox__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-listbox__select-chevron svg{fill:#fff}.tox .tox-listboxfield .tox-listbox--select{align-items:center;display:flex}.tox:not([dir=rtl]) .tox-listboxfield svg{right:8px}.tox[dir=rtl] .tox-listboxfield svg{left:8px}.tox .tox-selectfield{cursor:pointer;position:relative}.tox .tox-selectfield select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#2b3b4e;border-color:#000;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 4.75px;resize:none;width:100%}.tox .tox-selectfield select[disabled]{background-color:#19232e;color:rgba(255,255,255,.85);cursor:not-allowed}.tox .tox-selectfield select::-ms-expand{display:none}.tox .tox-selectfield select:focus{background-color:#2b3b4e;border-color:#207ab7;box-shadow:none;outline:0}.tox .tox-selectfield svg{pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.tox:not([dir=rtl]) .tox-selectfield select[size="0"],.tox:not([dir=rtl]) .tox-selectfield select[size="1"]{padding-right:24px}.tox:not([dir=rtl]) .tox-selectfield svg{right:8px}.tox[dir=rtl] .tox-selectfield select[size="0"],.tox[dir=rtl] .tox-selectfield select[size="1"]{padding-left:24px}.tox[dir=rtl] .tox-selectfield svg{left:8px}.tox .tox-textarea{-webkit-appearance:textarea;-moz-appearance:textarea;appearance:textarea;white-space:pre-wrap}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}.tox .tox-help__more-link{list-style:none;margin-top:1em}.tox .tox-image-tools{width:100%}.tox .tox-image-tools__toolbar{align-items:center;display:flex;justify-content:center}.tox .tox-image-tools__image{background-color:#666;height:380px;overflow:auto;position:relative;width:100%}.tox .tox-image-tools__image,.tox .tox-image-tools__image+.tox-image-tools__toolbar{margin-top:8px}.tox .tox-image-tools__image-bg{background:url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==)}.tox .tox-image-tools__toolbar>.tox-spacer{flex:1;-ms-flex-preferred-size:auto}.tox .tox-croprect-block{background:#000;opacity:.5;position:absolute;zoom:1}.tox .tox-croprect-handle{border:2px solid #fff;height:20px;left:0;position:absolute;top:0;width:20px}.tox .tox-croprect-handle-move{border:0;cursor:move;position:absolute}.tox .tox-croprect-handle-nw{border-width:2px 0 0 2px;cursor:nw-resize;left:100px;margin:-2px 0 0 -2px;top:100px}.tox .tox-croprect-handle-ne{border-width:2px 2px 0 0;cursor:ne-resize;left:200px;margin:-2px 0 0 -20px;top:100px}.tox .tox-croprect-handle-sw{border-width:0 0 2px 2px;cursor:sw-resize;left:100px;margin:-20px 2px 0 -2px;top:200px}.tox .tox-croprect-handle-se{border-width:0 2px 2px 0;cursor:se-resize;left:200px;margin:-20px 0 0 -20px;top:200px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-left:8px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-left:32px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-left:32px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-right:8px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-right:32px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-right:32px}.tox .tox-insert-table-picker{display:flex;flex-wrap:wrap;width:170px}.tox .tox-insert-table-picker>div{border-color:#000;border-style:solid;border-width:0 1px 1px 0;box-sizing:border-box;height:17px;width:17px}.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker{margin:-4px 0}.tox .tox-insert-table-picker .tox-insert-table-picker__selected{background-color:rgba(32,122,183,.5);border-color:rgba(32,122,183,.5)}.tox .tox-insert-table-picker__label{color:#fff;display:block;font-size:14px;padding:4px;text-align:center;width:100%}.tox:not([dir=rtl]) .tox-insert-table-picker>div:nth-child(10n){border-right:0}.tox[dir=rtl] .tox-insert-table-picker>div:nth-child(10n+1){border-right:0}.tox .tox-menu{background-color:#2b3b4e;border:1px solid #000;border-radius:3px;box-shadow:0 4px 8px 0 rgba(42,55,70,.1);display:inline-block;overflow:hidden;vertical-align:top;z-index:1150}.tox .tox-menu.tox-collection.tox-collection--list{padding:0}.tox .tox-menu.tox-collection.tox-collection--toolbar{padding:4px}.tox .tox-menu.tox-collection.tox-collection--grid{padding:4px}.tox .tox-menu__label blockquote,.tox .tox-menu__label code,.tox .tox-menu__label h1,.tox .tox-menu__label h2,.tox .tox-menu__label h3,.tox .tox-menu__label h4,.tox .tox-menu__label h5,.tox .tox-menu__label h6,.tox .tox-menu__label p{margin:0}.tox .tox-menubar{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23000000'/%3E%3C/svg%3E") left 0 top 0 #222f3e;background-color:#222f3e;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 4px 0 4px}.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar{border-top:1px solid #000}.tox .tox-mbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#fff;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:2px 0 3px 0;outline:0;overflow:hidden;padding:0 4px;text-transform:none;width:auto}.tox .tox-mbtn[disabled]{background-color:transparent;border:0;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-mbtn:focus:not(:disabled){background:#4a5562;border:0;box-shadow:none;color:#fff}.tox .tox-mbtn--active{background:#757d87;border:0;box-shadow:none;color:#fff}.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active){background:#4a5562;border:0;box-shadow:none;color:#fff}.tox .tox-mbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-mbtn[disabled] .tox-mbtn__select-label{cursor:not-allowed}.tox .tox-mbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px;display:none}.tox .tox-notification{border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;display:-ms-grid;display:grid;font-size:14px;font-weight:400;-ms-grid-columns:minmax(40px,1fr) auto minmax(40px,1fr);grid-template-columns:minmax(40px,1fr) auto minmax(40px,1fr);margin-top:4px;opacity:0;padding:4px;transition:transform .1s ease-in,opacity 150ms ease-in}.tox .tox-notification p{font-size:14px;font-weight:400}.tox .tox-notification a{cursor:pointer;text-decoration:underline}.tox .tox-notification--in{opacity:1}.tox .tox-notification--success{background-color:#e4eeda;border-color:#d7e6c8;color:#fff}.tox .tox-notification--success p{color:#fff}.tox .tox-notification--success a{color:#547831}.tox .tox-notification--success svg{fill:#fff}.tox .tox-notification--error{background-color:#f8dede;border-color:#f2bfbf;color:#fff}.tox .tox-notification--error p{color:#fff}.tox .tox-notification--error a{color:#c00}.tox .tox-notification--error svg{fill:#fff}.tox .tox-notification--warn,.tox .tox-notification--warning{background-color:#fffaea;border-color:#ffe89d;color:#fff}.tox .tox-notification--warn p,.tox .tox-notification--warning p{color:#fff}.tox .tox-notification--warn a,.tox .tox-notification--warning a{color:#fff}.tox .tox-notification--warn svg,.tox .tox-notification--warning svg{fill:#fff}.tox .tox-notification--info{background-color:#d9edf7;border-color:#779ecb;color:#fff}.tox .tox-notification--info p{color:#fff}.tox .tox-notification--info a{color:#fff}.tox .tox-notification--info svg{fill:#fff}.tox .tox-notification__body{-ms-grid-row-align:center;align-self:center;color:#fff;font-size:14px;-ms-grid-column-span:1;grid-column-end:3;-ms-grid-column:2;grid-column-start:2;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;text-align:center;white-space:normal;word-break:break-all;word-break:break-word}.tox .tox-notification__body>*{margin:0}.tox .tox-notification__body>*+*{margin-top:1rem}.tox .tox-notification__icon{-ms-grid-row-align:center;align-self:center;-ms-grid-column-span:1;grid-column-end:2;-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;-ms-grid-column-align:end;justify-self:end}.tox .tox-notification__icon svg{display:block}.tox .tox-notification__dismiss{-ms-grid-row-align:start;align-self:start;-ms-grid-column-span:1;grid-column-end:4;-ms-grid-column:3;grid-column-start:3;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;-ms-grid-column-align:end;justify-self:end}.tox .tox-notification .tox-progress-bar{-ms-grid-column-span:3;grid-column-end:4;-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:1;grid-row-end:3;-ms-grid-row:2;grid-row-start:2;-ms-grid-column-align:center;justify-self:center}.tox .tox-pop{display:inline-block;position:relative}.tox .tox-pop--resizing{transition:width .1s ease}.tox .tox-pop--resizing .tox-toolbar,.tox .tox-pop--resizing .tox-toolbar__group{flex-wrap:nowrap}.tox .tox-pop--transition{transition:.15s ease;transition-property:left,right,top,bottom}.tox .tox-pop--transition::after,.tox .tox-pop--transition::before{transition:all .15s,visibility 0s,opacity 75ms ease 75ms}.tox .tox-pop__dialog{background-color:#222f3e;border:1px solid #000;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15);min-width:0;overflow:hidden}.tox .tox-pop__dialog>:not(.tox-toolbar){margin:4px 4px 4px 8px}.tox .tox-pop__dialog .tox-toolbar{background-color:transparent;margin-bottom:-1px}.tox .tox-pop::after,.tox .tox-pop::before{border-style:solid;content:'';display:block;height:0;opacity:1;position:absolute;width:0}.tox .tox-pop.tox-pop--inset::after,.tox .tox-pop.tox-pop--inset::before{opacity:0;transition:all 0s .15s,visibility 0s,opacity 75ms ease}.tox .tox-pop.tox-pop--bottom::after,.tox .tox-pop.tox-pop--bottom::before{left:50%;top:100%}.tox .tox-pop.tox-pop--bottom::after{border-color:#222f3e transparent transparent transparent;border-width:8px;margin-left:-8px;margin-top:-1px}.tox .tox-pop.tox-pop--bottom::before{border-color:#000 transparent transparent transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--top::after,.tox .tox-pop.tox-pop--top::before{left:50%;top:0;transform:translateY(-100%)}.tox .tox-pop.tox-pop--top::after{border-color:transparent transparent #222f3e transparent;border-width:8px;margin-left:-8px;margin-top:1px}.tox .tox-pop.tox-pop--top::before{border-color:transparent transparent #000 transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--left::after,.tox .tox-pop.tox-pop--left::before{left:0;top:calc(50% - 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--left::after{border-color:transparent #222f3e transparent transparent;border-width:8px;margin-left:-15px}.tox .tox-pop.tox-pop--left::before{border-color:transparent #000 transparent transparent;border-width:10px;margin-left:-19px}.tox .tox-pop.tox-pop--right::after,.tox .tox-pop.tox-pop--right::before{left:100%;top:calc(50% + 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--right::after{border-color:transparent transparent transparent #222f3e;border-width:8px;margin-left:-1px}.tox .tox-pop.tox-pop--right::before{border-color:transparent transparent transparent #000;border-width:10px;margin-left:-1px}.tox .tox-pop.tox-pop--align-left::after,.tox .tox-pop.tox-pop--align-left::before{left:20px}.tox .tox-pop.tox-pop--align-right::after,.tox .tox-pop.tox-pop--align-right::before{left:calc(100% - 20px)}.tox .tox-sidebar-wrap{display:flex;flex-direction:row;flex-grow:1;-ms-flex-preferred-size:0;min-height:0}.tox .tox-sidebar{background-color:#222f3e;display:flex;flex-direction:row;justify-content:flex-end}.tox .tox-sidebar__slider{display:flex;overflow:hidden}.tox .tox-sidebar__pane-container{display:flex}.tox .tox-sidebar__pane{display:flex}.tox .tox-sidebar--sliding-closed{opacity:0}.tox .tox-sidebar--sliding-open{opacity:1}.tox .tox-sidebar--sliding-growing,.tox .tox-sidebar--sliding-shrinking{transition:width .5s ease,opacity .5s ease}.tox .tox-selector{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;display:inline-block;height:10px;position:absolute;width:10px}.tox.tox-platform-touch .tox-selector{height:12px;width:12px}.tox .tox-slider{align-items:center;display:flex;flex:1;-ms-flex-preferred-size:auto;height:24px;justify-content:center;position:relative}.tox .tox-slider__rail{background-color:transparent;border:1px solid #000;border-radius:3px;height:10px;min-width:120px;width:100%}.tox .tox-slider__handle{background-color:#207ab7;border:2px solid #185d8c;border-radius:3px;box-shadow:none;height:24px;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%);width:14px}.tox .tox-source-code{overflow:auto}.tox .tox-spinner{display:flex}.tox .tox-spinner>div{animation:tam-bouncing-dots 1.5s ease-in-out 0s infinite both;background-color:rgba(255,255,255,.5);border-radius:100%;height:8px;width:8px}.tox .tox-spinner>div:nth-child(1){animation-delay:-.32s}.tox .tox-spinner>div:nth-child(2){animation-delay:-.16s}@keyframes tam-bouncing-dots{0%,100%,80%{transform:scale(0)}40%{transform:scale(1)}}.tox:not([dir=rtl]) .tox-spinner>div:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-spinner>div:not(:first-child){margin-right:4px}.tox .tox-statusbar{align-items:center;background-color:#222f3e;border-top:1px solid #000;color:#fff;display:flex;flex:0 0 auto;font-size:12px;font-weight:400;height:18px;overflow:hidden;padding:0 8px;position:relative;text-transform:uppercase}.tox .tox-statusbar__text-container{display:flex;flex:1 1 auto;justify-content:flex-end;overflow:hidden}.tox .tox-statusbar__path{display:flex;flex:1 1 auto;margin-right:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tox .tox-statusbar__path>*{display:inline;white-space:nowrap}.tox .tox-statusbar__wordcount{flex:0 0 auto;margin-left:1ch}.tox .tox-statusbar a,.tox .tox-statusbar__path-item,.tox .tox-statusbar__wordcount{color:#fff;text-decoration:none}.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]){cursor:pointer;text-decoration:underline}.tox .tox-statusbar__resize-handle{align-items:flex-end;align-self:stretch;cursor:nwse-resize;display:flex;flex:0 0 auto;justify-content:flex-end;margin-left:auto;margin-right:-8px;padding-left:1ch}.tox .tox-statusbar__resize-handle svg{display:block;fill:#fff}.tox .tox-statusbar__resize-handle:focus svg{background-color:#4a5562;border-radius:1px;box-shadow:0 0 0 2px #4a5562}.tox:not([dir=rtl]) .tox-statusbar__path>*{margin-right:4px}.tox:not([dir=rtl]) .tox-statusbar__branding{margin-left:1ch}.tox[dir=rtl] .tox-statusbar{flex-direction:row-reverse}.tox[dir=rtl] .tox-statusbar__path>*{margin-left:4px}.tox .tox-throbber{z-index:1299}.tox .tox-throbber__busy-spinner{align-items:center;background-color:rgba(34,47,62,.6);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0}.tox .tox-tbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#fff;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:2px 0 3px 0;outline:0;overflow:hidden;padding:0;text-transform:none;width:34px}.tox .tox-tbtn svg{display:block;fill:#fff}.tox .tox-tbtn.tox-tbtn-more{padding-left:5px;padding-right:5px;width:inherit}.tox .tox-tbtn:focus{background:#4a5562;border:0;box-shadow:none}.tox .tox-tbtn:hover{background:#4a5562;border:0;box-shadow:none;color:#fff}.tox .tox-tbtn:hover svg{fill:#fff}.tox .tox-tbtn:active{background:#757d87;border:0;box-shadow:none;color:#fff}.tox .tox-tbtn:active svg{fill:#fff}.tox .tox-tbtn--disabled,.tox .tox-tbtn--disabled:hover,.tox .tox-tbtn:disabled,.tox .tox-tbtn:disabled:hover{background:0 0;border:0;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-tbtn--disabled svg,.tox .tox-tbtn--disabled:hover svg,.tox .tox-tbtn:disabled svg,.tox .tox-tbtn:disabled:hover svg{fill:rgba(255,255,255,.5)}.tox .tox-tbtn--enabled,.tox .tox-tbtn--enabled:hover{background:#757d87;border:0;box-shadow:none;color:#fff}.tox .tox-tbtn--enabled:hover>*,.tox .tox-tbtn--enabled>*{transform:none}.tox .tox-tbtn--enabled svg,.tox .tox-tbtn--enabled:hover svg{fill:#fff}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled){color:#fff}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg{fill:#fff}.tox .tox-tbtn:active>*{transform:none}.tox .tox-tbtn--md{height:51px;width:51px}.tox .tox-tbtn--lg{flex-direction:column;height:68px;width:68px}.tox .tox-tbtn--return{-ms-grid-row-align:stretch;align-self:stretch;height:unset;width:16px}.tox .tox-tbtn--labeled{padding:0 4px;width:unset}.tox .tox-tbtn__vlabel{display:block;font-size:10px;font-weight:400;letter-spacing:-.025em;margin-bottom:4px;white-space:nowrap}.tox .tox-tbtn--select{margin:2px 0 3px 0;padding:0 4px;width:auto}.tox .tox-tbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-tbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-tbtn__select-chevron svg{fill:rgba(255,255,255,.5)}.tox .tox-tbtn--bespoke .tox-tbtn__select-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:7em}.tox .tox-split-button{border:0;border-radius:3px;box-sizing:border-box;display:flex;margin:2px 0 3px 0;overflow:hidden}.tox .tox-split-button:hover{box-shadow:0 0 0 1px #4a5562 inset}.tox .tox-split-button:focus{background:#4a5562;box-shadow:none;color:#fff}.tox .tox-split-button>*{border-radius:0}.tox .tox-split-button__chevron{width:16px}.tox .tox-split-button__chevron svg{fill:rgba(255,255,255,.5)}.tox .tox-split-button .tox-tbtn{margin:0}.tox.tox-platform-touch .tox-split-button .tox-tbtn:first-child{width:30px}.tox.tox-platform-touch .tox-split-button__chevron{width:20px}.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus,.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,.tox .tox-split-button.tox-tbtn--disabled:focus,.tox .tox-split-button.tox-tbtn--disabled:hover{background:0 0;box-shadow:none;color:rgba(255,255,255,.5)}.tox .tox-toolbar-overlord{background-color:#222f3e}.tox .tox-toolbar,.tox .tox-toolbar__overflow,.tox .tox-toolbar__primary{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23000000'/%3E%3C/svg%3E") left 0 top 0 #222f3e;background-color:#222f3e;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 0}.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed{height:0;opacity:0;padding-bottom:0;padding-top:0;visibility:hidden}.tox .tox-toolbar__overflow--growing{transition:height .3s ease,opacity .2s linear .1s}.tox .tox-toolbar__overflow--shrinking{transition:opacity .3s ease,height .2s linear .1s,visibility 0s linear .3s}.tox .tox-menubar+.tox-toolbar,.tox .tox-menubar+.tox-toolbar-overlord .tox-toolbar__primary{border-top:1px solid #000;margin-top:-1px}.tox .tox-toolbar--scrolling{flex-wrap:nowrap;overflow-x:auto}.tox .tox-pop .tox-toolbar{border-width:0}.tox .tox-toolbar--no-divider{background-image:none}.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar-overlord:first-child .tox-toolbar__primary,.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar:first-child{border-top:1px solid #000}.tox.tox-tinymce-aux .tox-toolbar__overflow{background-color:#222f3e;border:1px solid #000;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15)}.tox .tox-toolbar__group{align-items:center;display:flex;flex-wrap:wrap;margin:0 0;padding:0 4px 0 4px}.tox .tox-toolbar__group--pull-right{margin-left:auto}.tox .tox-toolbar--scrolling .tox-toolbar__group{flex-shrink:0;flex-wrap:nowrap}.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type){border-right:1px solid #000}.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type){border-left:1px solid #000}.tox .tox-tooltip{display:inline-block;padding:8px;position:relative}.tox .tox-tooltip__body{background-color:#3d546f;border-radius:3px;box-shadow:0 2px 4px rgba(42,55,70,.3);color:rgba(255,255,255,.75);font-size:14px;font-style:normal;font-weight:400;padding:4px 8px;text-transform:none}.tox .tox-tooltip__arrow{position:absolute}.tox .tox-tooltip--down .tox-tooltip__arrow{border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #3d546f;bottom:0;left:50%;position:absolute;transform:translateX(-50%)}.tox .tox-tooltip--up .tox-tooltip__arrow{border-bottom:8px solid #3d546f;border-left:8px solid transparent;border-right:8px solid transparent;left:50%;position:absolute;top:0;transform:translateX(-50%)}.tox .tox-tooltip--right .tox-tooltip__arrow{border-bottom:8px solid transparent;border-left:8px solid #3d546f;border-top:8px solid transparent;position:absolute;right:0;top:50%;transform:translateY(-50%)}.tox .tox-tooltip--left .tox-tooltip__arrow{border-bottom:8px solid transparent;border-right:8px solid #3d546f;border-top:8px solid transparent;left:0;position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-well{border:1px solid #000;border-radius:3px;padding:8px;width:100%}.tox .tox-well>:first-child{margin-top:0}.tox .tox-well>:last-child{margin-bottom:0}.tox .tox-well>:only-child{margin:0}.tox .tox-custom-editor{border:1px solid #000;border-radius:3px;display:flex;flex:1;position:relative}.tox .tox-dialog-loading::before{background-color:rgba(0,0,0,.5);content:"";height:100%;position:absolute;width:100%;z-index:1000}.tox .tox-tab{cursor:pointer}.tox .tox-dialog__content-js{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-content .tox-collection{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-image-tools-edit-panel{height:60px}.tox .tox-image-tools__sidebar{height:60px}
diff --git a/public/static/assets/gougu/module/tinymce/skins/ui/oxide-dark/skin.mobile.min.css b/public/static/assets/gougu/module/tinymce/skins/ui/oxide-dark/skin.mobile.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..3a45cacf0f369191a4c3cae8445b02e4d41c85e4
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/skins/ui/oxide-dark/skin.mobile.min.css
@@ -0,0 +1,7 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.tinymce-mobile-outer-container{all:initial;display:block}.tinymce-mobile-outer-container *{border:0;box-sizing:initial;cursor:inherit;float:none;line-height:1;margin:0;outline:0;padding:0;-webkit-tap-highlight-color:transparent;text-shadow:none;white-space:nowrap}.tinymce-mobile-icon-arrow-back::before{content:"\e5cd"}.tinymce-mobile-icon-image::before{content:"\e412"}.tinymce-mobile-icon-cancel-circle::before{content:"\e5c9"}.tinymce-mobile-icon-full-dot::before{content:"\e061"}.tinymce-mobile-icon-align-center::before{content:"\e234"}.tinymce-mobile-icon-align-left::before{content:"\e236"}.tinymce-mobile-icon-align-right::before{content:"\e237"}.tinymce-mobile-icon-bold::before{content:"\e238"}.tinymce-mobile-icon-italic::before{content:"\e23f"}.tinymce-mobile-icon-unordered-list::before{content:"\e241"}.tinymce-mobile-icon-ordered-list::before{content:"\e242"}.tinymce-mobile-icon-font-size::before{content:"\e245"}.tinymce-mobile-icon-underline::before{content:"\e249"}.tinymce-mobile-icon-link::before{content:"\e157"}.tinymce-mobile-icon-unlink::before{content:"\eca2"}.tinymce-mobile-icon-color::before{content:"\e891"}.tinymce-mobile-icon-previous::before{content:"\e314"}.tinymce-mobile-icon-next::before{content:"\e315"}.tinymce-mobile-icon-large-font::before,.tinymce-mobile-icon-style-formats::before{content:"\e264"}.tinymce-mobile-icon-undo::before{content:"\e166"}.tinymce-mobile-icon-redo::before{content:"\e15a"}.tinymce-mobile-icon-removeformat::before{content:"\e239"}.tinymce-mobile-icon-small-font::before{content:"\e906"}.tinymce-mobile-format-matches::after,.tinymce-mobile-icon-readonly-back::before{content:"\e5ca"}.tinymce-mobile-icon-small-heading::before{content:"small"}.tinymce-mobile-icon-large-heading::before{content:"large"}.tinymce-mobile-icon-large-heading::before,.tinymce-mobile-icon-small-heading::before{font-family:sans-serif;font-size:80%}.tinymce-mobile-mask-edit-icon::before{content:"\e254"}.tinymce-mobile-icon-back::before{content:"\e5c4"}.tinymce-mobile-icon-heading::before{content:"Headings";font-family:sans-serif;font-size:80%;font-weight:700}.tinymce-mobile-icon-h1::before{content:"H1";font-weight:700}.tinymce-mobile-icon-h2::before{content:"H2";font-weight:700}.tinymce-mobile-icon-h3::before{content:"H3";font-weight:700}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask{align-items:center;display:flex;justify-content:center;background:rgba(51,51,51,.5);height:100%;position:absolute;top:0;width:100%}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container{align-items:center;border-radius:50%;display:flex;flex-direction:column;font-family:sans-serif;font-size:1em;justify-content:space-between}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .mixin-menu-item{align-items:center;display:flex;justify-content:center;border-radius:50%;height:2.1em;width:2.1em}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section{align-items:center;display:flex;justify-content:center;flex-direction:column;font-size:1em}@media only screen and (min-device-width:700px){.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section{font-size:1.2em}}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon{align-items:center;display:flex;justify-content:center;border-radius:50%;height:2.1em;width:2.1em;background-color:#fff;color:#207ab7}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon::before{content:"\e900";font-family:tinymce-mobile,sans-serif}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section:not(.tinymce-mobile-mask-tap-icon-selected) .tinymce-mobile-mask-tap-icon{z-index:2}.tinymce-mobile-android-container.tinymce-mobile-android-maximized{background:#fff;border:none;bottom:0;display:flex;flex-direction:column;left:0;position:fixed;right:0;top:0}.tinymce-mobile-android-container:not(.tinymce-mobile-android-maximized){position:relative}.tinymce-mobile-android-container .tinymce-mobile-editor-socket{display:flex;flex-grow:1}.tinymce-mobile-android-container .tinymce-mobile-editor-socket iframe{display:flex!important;flex-grow:1;height:auto!important}.tinymce-mobile-android-scroll-reload{overflow:hidden}:not(.tinymce-mobile-readonly-mode)>.tinymce-mobile-android-selection-context-toolbar{margin-top:23px}.tinymce-mobile-toolstrip{background:#fff;display:flex;flex:0 0 auto;z-index:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar{align-items:center;background-color:#fff;border-bottom:1px solid #ccc;display:flex;flex:1;height:2.5em;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group{align-items:center;display:flex;height:100%;flex-shrink:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group>div{align-items:center;display:flex;height:100%;flex:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-exit-container{background:#f44336}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-toolbar-scrollable-group{flex-grow:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item{padding-left:.5em;padding-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button{align-items:center;display:flex;height:80%;margin-left:2px;margin-right:2px}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button.tinymce-mobile-toolbar-button-selected{background:#c8cbcf;color:#ccc}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:first-of-type,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:last-of-type{background:#207ab7;color:#eceff1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group{align-items:center;display:flex;height:100%;flex:1;padding-bottom:.4em;padding-top:.4em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog{display:flex;min-height:1.5em;overflow:hidden;padding-left:0;padding-right:0;position:relative;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain{display:flex;height:100%;transition:left cubic-bezier(.4,0,1,1) .15s;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen{display:flex;flex:0 0 auto;justify-content:space-between;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen input{font-family:Sans-serif}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container{display:flex;flex-grow:1;position:relative}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container .tinymce-mobile-input-container-x{-ms-grid-row-align:center;align-self:center;background:inherit;border:none;border-radius:50%;color:#888;font-size:.6em;font-weight:700;height:100%;padding-right:2px;position:absolute;right:0}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container.tinymce-mobile-input-container-empty .tinymce-mobile-input-container-x{display:none}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous{align-items:center;display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous::before{align-items:center;display:flex;font-weight:700;height:100%;padding-left:.5em;padding-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next.tinymce-mobile-toolbar-navigation-disabled::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous.tinymce-mobile-toolbar-navigation-disabled::before{visibility:hidden}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item{color:#ccc;font-size:10px;line-height:10px;margin:0 2px;padding-top:3px}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item.tinymce-mobile-dot-active{color:#c8cbcf}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-font::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-heading::before{margin-left:.5em;margin-right:.9em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-font::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-heading::before{margin-left:.9em;margin-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider{display:flex;flex:1;margin-left:0;margin-right:0;padding:.28em 0;position:relative}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container{align-items:center;display:flex;flex-grow:1;height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container .tinymce-mobile-slider-size-line{background:#ccc;display:flex;flex:1;height:.2em;margin-bottom:.3em;margin-top:.3em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container{padding-left:2em;padding-right:2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container{align-items:center;display:flex;flex-grow:1;height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container .tinymce-mobile-slider-gradient{background:linear-gradient(to right,red 0,#feff00 17%,#0f0 33%,#00feff 50%,#00f 67%,#ff00fe 83%,red 100%);display:flex;flex:1;height:.2em;margin-bottom:.3em;margin-top:.3em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-black{background:#000;height:.2em;margin-bottom:.3em;margin-top:.3em;width:1.2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-white{background:#fff;height:.2em;margin-bottom:.3em;margin-top:.3em;width:1.2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb{align-items:center;background-clip:padding-box;background-color:#455a64;border:.5em solid rgba(136,136,136,0);border-radius:3em;bottom:0;color:#fff;display:flex;height:.5em;justify-content:center;left:-10px;margin:auto;position:absolute;top:0;transition:border 120ms cubic-bezier(.39,.58,.57,1);width:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb.tinymce-mobile-thumb-active{border:.5em solid rgba(136,136,136,.39)}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group>div{align-items:center;display:flex;height:100%;flex:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper{flex-direction:column;justify-content:center}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item{align-items:center;display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item:not(.tinymce-mobile-serialised-dialog){height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-container{display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input{background:#fff;border:none;border-radius:0;color:#455a64;flex-grow:1;font-size:.85em;padding-bottom:.1em;padding-left:5px;padding-top:.1em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::-webkit-input-placeholder{color:#888}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::placeholder{color:#888}.tinymce-mobile-dropup{background:#fff;display:flex;overflow:hidden;width:100%}.tinymce-mobile-dropup.tinymce-mobile-dropup-shrinking{transition:height .3s ease-out}.tinymce-mobile-dropup.tinymce-mobile-dropup-growing{transition:height .3s ease-in}.tinymce-mobile-dropup.tinymce-mobile-dropup-closed{flex-grow:0}.tinymce-mobile-dropup.tinymce-mobile-dropup-open:not(.tinymce-mobile-dropup-growing){flex-grow:1}.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:200px}@media only screen and (orientation:landscape){.tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:200px}}@media only screen and (min-device-width :320px) and (max-device-width :568px) and (orientation :landscape){.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:150px}}.tinymce-mobile-styles-menu{font-family:sans-serif;outline:4px solid #000;overflow:hidden;position:relative;width:100%}.tinymce-mobile-styles-menu [role=menu]{display:flex;flex-direction:column;height:100%;position:absolute;width:100%}.tinymce-mobile-styles-menu [role=menu].transitioning{transition:transform .5s ease-in-out}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item{border-bottom:1px solid #ddd;color:#455a64;cursor:pointer;display:flex;padding:1em 1em;position:relative}.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser .tinymce-mobile-styles-collapse-icon::before{color:#455a64;content:"\e314";font-family:tinymce-mobile,sans-serif}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-styles-item-is-menu::after{color:#455a64;content:"\e315";font-family:tinymce-mobile,sans-serif;padding-left:1em;padding-right:1em;position:absolute;right:0}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-format-matches::after{font-family:tinymce-mobile,sans-serif;padding-left:1em;padding-right:1em;position:absolute;right:0}.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser,.tinymce-mobile-styles-menu .tinymce-mobile-styles-separator{align-items:center;background:#fff;border-top:#455a64;color:#455a64;display:flex;min-height:2.5em;padding-left:1em;padding-right:1em}.tinymce-mobile-styles-menu [data-transitioning-destination=before][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=before]{transform:translate(-100%)}.tinymce-mobile-styles-menu [data-transitioning-destination=current][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=current]{transform:translate(0)}.tinymce-mobile-styles-menu [data-transitioning-destination=after][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=after]{transform:translate(100%)}@font-face{font-family:tinymce-mobile;font-style:normal;font-weight:400;src:url(fonts/tinymce-mobile.woff?8x92w3) format('woff')}@media (min-device-width:700px){.tinymce-mobile-outer-container,.tinymce-mobile-outer-container input{font-size:25px}}@media (max-device-width:700px){.tinymce-mobile-outer-container,.tinymce-mobile-outer-container input{font-size:18px}}.tinymce-mobile-icon{font-family:tinymce-mobile,sans-serif}.mixin-flex-and-centre{align-items:center;display:flex;justify-content:center}.mixin-flex-bar{align-items:center;display:flex;height:100%}.tinymce-mobile-outer-container .tinymce-mobile-editor-socket iframe{background-color:#fff;width:100%}.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{background-color:#207ab7;border-radius:50%;bottom:1em;color:#fff;font-size:1em;height:2.1em;position:fixed;right:2em;width:2.1em;align-items:center;display:flex;justify-content:center}@media only screen and (min-device-width:700px){.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{font-size:1.2em}}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket{height:300px;overflow:hidden}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket iframe{height:100%}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-toolstrip{display:none}input[type=file]::-webkit-file-upload-button{display:none}@media only screen and (min-device-width :320px) and (max-device-width :568px) and (orientation :landscape){.tinymce-mobile-ios-container .tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{bottom:50%}}
diff --git a/public/static/assets/gougu/module/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css b/public/static/assets/gougu/module/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..a0893b913e5a8599a5c279c533d1071ed13676f4
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css
@@ -0,0 +1,7 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}
diff --git a/public/static/assets/gougu/module/tinymce/skins/ui/oxide/content.inline.min.css b/public/static/assets/gougu/module/tinymce/skins/ui/oxide/content.inline.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..b4ab9a3a563672b3281140239f8a935b9cfd6c4d
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/skins/ui/oxide/content.inline.min.css
@@ -0,0 +1,7 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment--active{background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:1298}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #b4d7ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #b4d7ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #b4d7ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#b4d7ff}.mce-content-body .mce-edit-focus{outline:3px solid #b4d7ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid rgba(180,215,255,.7);bottom:-1px;content:'';left:-1px;mix-blend-mode:multiply;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#b4d7ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'}
diff --git a/public/static/assets/gougu/module/tinymce/skins/ui/oxide/content.min.css b/public/static/assets/gougu/module/tinymce/skins/ui/oxide/content.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..844858d0631bba113883d64866b86e57073c78af
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/skins/ui/oxide/content.min.css
@@ -0,0 +1,7 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment--active{background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:1298}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #b4d7ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #b4d7ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #b4d7ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#b4d7ff}.mce-content-body .mce-edit-focus{outline:3px solid #b4d7ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid rgba(180,215,255,.7);bottom:-1px;content:'';left:-1px;mix-blend-mode:multiply;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#b4d7ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'}body{font-family:sans-serif}table{border-collapse:collapse}
diff --git a/public/static/assets/gougu/module/tinymce/skins/ui/oxide/content.mobile.min.css b/public/static/assets/gougu/module/tinymce/skins/ui/oxide/content.mobile.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..35f7dc08bc50f2b8cf101d775ac1cccfb5423784
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/skins/ui/oxide/content.mobile.min.css
@@ -0,0 +1,7 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{background-color:green;display:inline-block;opacity:.5;position:absolute}body{-webkit-text-size-adjust:none}body img{max-width:96vw}body table img{max-width:95%}body{font-family:sans-serif}table{border-collapse:collapse}
diff --git a/public/static/assets/gougu/module/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff b/public/static/assets/gougu/module/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff
new file mode 100644
index 0000000000000000000000000000000000000000..1e3be038a607cb7c2544ed8ae3d6621f77bf4c38
Binary files /dev/null and b/public/static/assets/gougu/module/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff differ
diff --git a/public/static/assets/gougu/module/tinymce/skins/ui/oxide/skin.min.css b/public/static/assets/gougu/module/tinymce/skins/ui/oxide/skin.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..15ba6f5ffb49766ea7913bf55cd12f22cb8e3321
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/skins/ui/oxide/skin.min.css
@@ -0,0 +1,7 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.tox{box-shadow:none;box-sizing:content-box;color:#222f3e;cursor:auto;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-style:normal;font-weight:400;line-height:normal;-webkit-tap-highlight-color:transparent;text-decoration:none;text-shadow:none;text-transform:none;vertical-align:initial;white-space:normal}.tox :not(svg):not(rect){box-sizing:inherit;color:inherit;cursor:inherit;direction:inherit;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;line-height:inherit;-webkit-tap-highlight-color:inherit;text-align:inherit;text-decoration:inherit;text-shadow:inherit;text-transform:inherit;vertical-align:inherit;white-space:inherit}.tox :not(svg):not(rect){background:0 0;border:0;box-shadow:none;float:none;height:auto;margin:0;max-width:none;outline:0;padding:0;position:static;width:auto}.tox:not([dir=rtl]){direction:ltr;text-align:left}.tox[dir=rtl]{direction:rtl;text-align:right}.tox-tinymce{border:1px solid #eee;border-radius:0;box-shadow:none;box-sizing:border-box;display:flex;flex-direction:column;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;overflow:hidden;position:relative;visibility:inherit!important}.tox-tinymce-inline{border:none;box-shadow:none}.tox-tinymce-inline .tox-editor-header{background-color:transparent;border:1px solid #ccc;border-radius:0;box-shadow:none}.tox-tinymce-aux{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;z-index:1300}.tox-tinymce :focus,.tox-tinymce-aux :focus{outline:0}button::-moz-focus-inner{border:0}.tox[dir=rtl] .tox-icon--flip svg{transform:rotateY(180deg)}.tox .accessibility-issue__header{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description{align-items:stretch;border:1px solid #ccc;border-radius:2px;display:flex;justify-content:space-between}.tox .accessibility-issue__description>div{padding-bottom:4px}.tox .accessibility-issue__description>div>div{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description>:last-child:not(:only-child){border-color:#ccc;border-style:solid}.tox .accessibility-issue__repair{margin-top:16px}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description{background-color:rgba(32,122,183,.1);border-color:rgba(32,122,183,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description>:last-child{border-color:rgba(32,122,183,.4)}.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2{color:#3c9cff}.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg{fill:#3c9cff}.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon{color:#3c9cff}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description{background-color:rgba(255,165,0,.1);border-color:rgba(255,165,0,.5);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description>:last-child{border-color:rgba(255,165,0,.5)}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2{color:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg{fill:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon{color:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description{background-color:rgba(204,0,0,.1);border-color:rgba(204,0,0,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description>:last-child{border-color:rgba(204,0,0,.4)}.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2{color:#c00}.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg{fill:#c00}.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon{color:#c00}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description{background-color:rgba(120,171,70,.1);border-color:rgba(120,171,70,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description>:last-child{border-color:rgba(120,171,70,.4)}.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2{color:#78ab46}.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg{fill:#78ab46}.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon{color:#78ab46}.tox .tox-dialog__body-content .accessibility-issue__header h1,.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2{margin-top:0}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-left:4px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-left:auto}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description{padding:4px 4px 4px 8px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description>:last-child{border-left-width:1px;padding-left:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-right:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-right:auto}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description{padding:4px 8px 4px 4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description>:last-child{border-right-width:1px;padding-right:4px}.tox .tox-anchorbar{display:flex;flex:0 0 auto}.tox .tox-bar{display:flex;flex:0 0 auto}.tox .tox-button{background-color:#3c9cff;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#3c9cff;border-radius:2px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;line-height:24px;margin:0;outline:0;padding:4px 16px;text-align:center;text-decoration:none;text-transform:none;white-space:nowrap}.tox .tox-button[disabled]{background-color:#3c9cff;background-image:none;border-color:#3c9cff;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-button:focus:not(:disabled){background-color:#1E9FFF;background-image:none;border-color:#1E9FFF;box-shadow:none;color:#fff}.tox .tox-button:hover:not(:disabled){background-color:#1E9FFF;background-image:none;border-color:#1E9FFF;box-shadow:none;color:#fff}.tox .tox-button:active:not(:disabled){background-color:#0182E2;background-image:none;border-color:#0182E2;box-shadow:none;color:#fff}.tox .tox-button--secondary{background-color:#f0f0f0;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#f0f0f0;border-radius:2px;border-style:solid;border-width:1px;box-shadow:none;color:#222f3e;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;outline:0;padding:4px 16px;text-decoration:none;text-transform:none}.tox .tox-button--secondary[disabled]{background-color:#f0f0f0;background-image:none;border-color:#f0f0f0;box-shadow:none;color:rgba(34,47,62,.5)}.tox .tox-button--secondary:focus:not(:disabled){background-color:#e3e3e3;background-image:none;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--secondary:hover:not(:disabled){background-color:#e3e3e3;background-image:none;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--secondary:active:not(:disabled){background-color:#d6d6d6;background-image:none;border-color:#d6d6d6;box-shadow:none;color:#222f3e}.tox .tox-button--icon,.tox .tox-button.tox-button--icon,.tox .tox-button.tox-button--secondary.tox-button--icon{padding:4px}.tox .tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg{display:block;fill:currentColor}.tox .tox-button-link{background:0;border:none;box-sizing:border-box;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-weight:400;line-height:1.3;margin:0;padding:0;white-space:nowrap}.tox .tox-button-link--sm{font-size:14px}.tox .tox-button--naked{background-color:transparent;border-color:transparent;box-shadow:unset;color:#222f3e}.tox .tox-button--naked[disabled]{background-color:#f0f0f0;border-color:#f0f0f0;box-shadow:none;color:rgba(34,47,62,.5)}.tox .tox-button--naked:hover:not(:disabled){background-color:#e3e3e3;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--naked:focus:not(:disabled){background-color:#e3e3e3;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--naked:active:not(:disabled){background-color:#d6d6d6;border-color:#d6d6d6;box-shadow:none;color:#222f3e}.tox .tox-button--naked .tox-icon svg{fill:currentColor}.tox .tox-button--naked.tox-button--icon:hover:not(:disabled){color:#222f3e}.tox .tox-checkbox{align-items:center;border-radius:2px;cursor:pointer;display:flex;height:36px;min-width:36px}.tox .tox-checkbox__input{height:1px;overflow:hidden;position:absolute;top:auto;width:1px}.tox .tox-checkbox__icons{align-items:center;border-radius:2px;box-shadow:0 0 0 2px transparent;box-sizing:content-box;display:flex;height:24px;justify-content:center;padding:calc(4px - 1px);width:24px}.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:block;fill:rgba(34,47,62,.3)}.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:none;fill:#3c9cff}.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg{display:none;fill:#3c9cff}.tox .tox-checkbox--disabled{color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg{fill:rgba(34,47,62,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{fill:rgba(34,47,62,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{fill:rgba(34,47,62,.5)}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__checked svg{display:block}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:block}.tox input.tox-checkbox__input:focus+.tox-checkbox__icons{border-radius:2px;box-shadow:inset 0 0 0 1px #3c9cff;padding:calc(4px - 1px)}.tox:not([dir=rtl]) .tox-checkbox__label{margin-left:4px}.tox:not([dir=rtl]) .tox-checkbox__input{left:-10000px}.tox:not([dir=rtl]) .tox-bar .tox-checkbox{margin-left:4px}.tox[dir=rtl] .tox-checkbox__label{margin-right:4px}.tox[dir=rtl] .tox-checkbox__input{right:-10000px}.tox[dir=rtl] .tox-bar .tox-checkbox{margin-right:4px}.tox .tox-collection--toolbar .tox-collection__group{display:flex;padding:0}.tox .tox-collection--grid .tox-collection__group{display:flex;flex-wrap:wrap;max-height:208px;overflow-x:hidden;overflow-y:auto;padding:0}.tox .tox-collection--list .tox-collection__group{border-bottom-width:0;border-color:#ccc;border-left-width:0;border-right-width:0;border-style:solid;border-top-width:1px;padding:4px 0}.tox .tox-collection--list .tox-collection__group:first-child{border-top-width:0}.tox .tox-collection__group-heading{background-color:#e6e6e6;color:rgba(34,47,62,.7);cursor:default;font-size:12px;font-style:normal;font-weight:400;margin-bottom:4px;margin-top:-4px;padding:4px 8px;text-transform:none;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tox .tox-collection__item{align-items:center;color:#222f3e;cursor:pointer;display:flex;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tox .tox-collection--list .tox-collection__item{padding:4px 8px}.tox .tox-collection--toolbar .tox-collection__item{border-radius:2px;padding:4px}.tox .tox-collection--grid .tox-collection__item{border-radius:2px;padding:4px}.tox .tox-collection--list .tox-collection__item--enabled{background-color:#fff;color:#222f3e}.tox .tox-collection--list .tox-collection__item--active{background-color:#dee0e2}.tox .tox-collection--toolbar .tox-collection__item--enabled{background-color:#c8cbcf;color:#222f3e}.tox .tox-collection--toolbar .tox-collection__item--active{background-color:#dee0e2}.tox .tox-collection--grid .tox-collection__item--enabled{background-color:#c8cbcf;color:#222f3e}.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled){background-color:#dee0e2;color:#222f3e}.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#222f3e}.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#222f3e}.tox .tox-collection__item-checkmark,.tox .tox-collection__item-icon{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.tox .tox-collection__item-checkmark svg,.tox .tox-collection__item-icon svg{fill:currentColor}.tox .tox-collection--toolbar-lg .tox-collection__item-icon{height:48px;width:48px}.tox .tox-collection__item-label{color:currentColor;display:inline-block;flex:1;-ms-flex-preferred-size:auto;font-size:14px;font-style:normal;font-weight:400;line-height:24px;text-transform:none;word-break:break-all}.tox .tox-collection__item-accessory{color:rgba(34,47,62,.7);display:inline-block;font-size:14px;height:24px;line-height:24px;text-transform:none}.tox .tox-collection__item-caret{align-items:center;display:flex;min-height:24px}.tox .tox-collection__item-caret::after{content:'';font-size:0;min-height:inherit}.tox .tox-collection__item-caret svg{fill:#222f3e}.tox .tox-collection__item--state-disabled{background-color:transparent;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-collection__item--state-disabled .tox-collection__item-caret svg{fill:rgba(34,47,62,.5)}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg{display:none}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-accessory+.tox-collection__item-checkmark{display:none}.tox .tox-collection--horizontal{background-color:#fff;border:1px solid #ccc;border-radius:2px;box-shadow:0 1px 3px rgba(0,0,0,.15);display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:nowrap;margin-bottom:0;overflow-x:auto;padding:0}.tox .tox-collection--horizontal .tox-collection__group{align-items:center;display:flex;flex-wrap:nowrap;margin:0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item{height:34px;margin:2px 0 3px 0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item-label{white-space:nowrap}.tox .tox-collection--horizontal .tox-collection__item-caret{margin-left:4px}.tox .tox-collection__item-container{display:flex}.tox .tox-collection__item-container--row{align-items:center;flex:1 1 auto;flex-direction:row}.tox .tox-collection__item-container--row.tox-collection__item-container--align-left{margin-right:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--align-right{justify-content:flex-end;margin-left:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top{align-items:flex-start;margin-bottom:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle{align-items:center}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom{align-items:flex-end;margin-top:auto}.tox .tox-collection__item-container--column{-ms-grid-row-align:center;align-self:center;flex:1 1 auto;flex-direction:column}.tox .tox-collection__item-container--column.tox-collection__item-container--align-left{align-items:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--align-right{align-items:flex-end}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top{align-self:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle{-ms-grid-row-align:center;align-self:center}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom{align-self:flex-end}.tox:not([dir=rtl]) .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-right:1px solid #ccc}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>:not(:first-child){margin-left:8px}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-left:4px}.tox:not([dir=rtl]) .tox-collection__item-accessory{margin-left:16px;text-align:right}.tox:not([dir=rtl]) .tox-collection .tox-collection__item-caret{margin-left:16px}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-left:1px solid #ccc}.tox[dir=rtl] .tox-collection--list .tox-collection__item>:not(:first-child){margin-right:8px}.tox[dir=rtl] .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-right:4px}.tox[dir=rtl] .tox-collection__item-accessory{margin-right:16px;text-align:left}.tox[dir=rtl] .tox-collection .tox-collection__item-caret{margin-right:16px;transform:rotateY(180deg)}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__item-caret{margin-right:4px}.tox .tox-color-picker-container{display:flex;flex-direction:row;height:225px;margin:0}.tox .tox-sv-palette{box-sizing:border-box;display:flex;height:100%}.tox .tox-sv-palette-spectrum{height:100%}.tox .tox-sv-palette,.tox .tox-sv-palette-spectrum{width:225px}.tox .tox-sv-palette-thumb{background:0 0;border:1px solid #000;border-radius:50%;box-sizing:content-box;height:12px;position:absolute;width:12px}.tox .tox-sv-palette-inner-thumb{border:1px solid #fff;border-radius:50%;height:10px;position:absolute;width:10px}.tox .tox-hue-slider{box-sizing:border-box;height:100%;width:25px}.tox .tox-hue-slider-spectrum{background:linear-gradient(to bottom,red,#ff0080,#f0f,#8000ff,#00f,#0080ff,#0ff,#00ff80,#0f0,#80ff00,#ff0,#ff8000,red);height:100%;width:100%}.tox .tox-hue-slider,.tox .tox-hue-slider-spectrum{width:20px}.tox .tox-hue-slider-thumb{background:#fff;border:1px solid #000;box-sizing:content-box;height:4px;width:100%}.tox .tox-rgb-form{display:flex;flex-direction:column;justify-content:space-between}.tox .tox-rgb-form div{align-items:center;display:flex;justify-content:space-between;margin-bottom:5px;width:inherit}.tox .tox-rgb-form input{width:6em}.tox .tox-rgb-form input.tox-invalid{border:1px solid red!important}.tox .tox-rgb-form .tox-rgba-preview{border:1px solid #000;flex-grow:2;margin-bottom:0}.tox:not([dir=rtl]) .tox-sv-palette{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider-thumb{margin-left:-1px}.tox:not([dir=rtl]) .tox-rgb-form label{margin-right:.5em}.tox[dir=rtl] .tox-sv-palette{margin-left:15px}.tox[dir=rtl] .tox-hue-slider{margin-left:15px}.tox[dir=rtl] .tox-hue-slider-thumb{margin-right:-1px}.tox[dir=rtl] .tox-rgb-form label{margin-left:.5em}.tox .tox-toolbar .tox-swatches,.tox .tox-toolbar__overflow .tox-swatches,.tox .tox-toolbar__primary .tox-swatches{margin:2px 0 3px 4px}.tox .tox-collection--list .tox-collection__group .tox-swatches-menu{border:0;margin:-4px 0}.tox .tox-swatches__row{display:flex}.tox .tox-swatch{height:30px;transition:transform .15s,box-shadow .15s;width:30px}.tox .tox-swatch:focus,.tox .tox-swatch:hover{box-shadow:0 0 0 1px rgba(127,127,127,.3) inset;transform:scale(.8)}.tox .tox-swatch--remove{align-items:center;display:flex;justify-content:center}.tox .tox-swatch--remove svg path{stroke:#e74c3c}.tox .tox-swatches__picker-btn{align-items:center;background-color:transparent;border:0;cursor:pointer;display:flex;height:30px;justify-content:center;outline:0;padding:0;width:30px}.tox .tox-swatches__picker-btn svg{height:24px;width:24px}.tox .tox-swatches__picker-btn:hover{background:#dee0e2}.tox:not([dir=rtl]) .tox-swatches__picker-btn{margin-left:auto}.tox[dir=rtl] .tox-swatches__picker-btn{margin-right:auto}.tox .tox-comment-thread{background:#fff;position:relative}.tox .tox-comment-thread>:not(:first-child){margin-top:8px}.tox .tox-comment{background:#fff;border:1px solid #ccc;border-radius:2px;box-shadow:0 4px 8px 0 rgba(34,47,62,.1);padding:8px 8px 16px 8px;position:relative}.tox .tox-comment__header{align-items:center;color:#222f3e;display:flex;justify-content:space-between}.tox .tox-comment__date{color:rgba(34,47,62,.7);font-size:12px}.tox .tox-comment__body{color:#222f3e;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;margin-top:8px;position:relative;text-transform:initial}.tox .tox-comment__body textarea{resize:none;white-space:normal;width:100%}.tox .tox-comment__expander{padding-top:8px}.tox .tox-comment__expander p{color:rgba(34,47,62,.7);font-size:14px;font-style:normal}.tox .tox-comment__body p{margin:0}.tox .tox-comment__buttonspacing{padding-top:16px;text-align:center}.tox .tox-comment-thread__overlay::after{background:#fff;bottom:0;content:"";display:flex;left:0;opacity:.9;position:absolute;right:0;top:0;z-index:5}.tox .tox-comment__reply{display:flex;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end;margin-top:8px}.tox .tox-comment__reply>:first-child{margin-bottom:8px;width:100%}.tox .tox-comment__edit{display:flex;flex-wrap:wrap;justify-content:flex-end;margin-top:16px}.tox .tox-comment__gradient::after{background:linear-gradient(rgba(255,255,255,0),#fff);bottom:0;content:"";display:block;height:5em;margin-top:-40px;position:absolute;width:100%}.tox .tox-comment__overlay{background:#fff;bottom:0;display:flex;flex-direction:column;flex-grow:1;left:0;opacity:.9;position:absolute;right:0;text-align:center;top:0;z-index:5}.tox .tox-comment__loading-text{align-items:center;color:#222f3e;display:flex;flex-direction:column;position:relative}.tox .tox-comment__loading-text>div{padding-bottom:16px}.tox .tox-comment__overlaytext{bottom:0;flex-direction:column;font-size:14px;left:0;padding:1em;position:absolute;right:0;top:0;z-index:10}.tox .tox-comment__overlaytext p{background-color:#fff;box-shadow:0 0 8px 8px #fff;color:#222f3e;text-align:center}.tox .tox-comment__overlaytext div:nth-of-type(2){font-size:.8em}.tox .tox-comment__busy-spinner{align-items:center;background-color:#fff;bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:20}.tox .tox-comment__scroll{display:flex;flex-direction:column;flex-shrink:1;overflow:auto}.tox .tox-conversations{margin:8px}.tox:not([dir=rtl]) .tox-comment__edit{margin-left:8px}.tox:not([dir=rtl]) .tox-comment__buttonspacing>:last-child,.tox:not([dir=rtl]) .tox-comment__edit>:last-child,.tox:not([dir=rtl]) .tox-comment__reply>:last-child{margin-left:8px}.tox[dir=rtl] .tox-comment__edit{margin-right:8px}.tox[dir=rtl] .tox-comment__buttonspacing>:last-child,.tox[dir=rtl] .tox-comment__edit>:last-child,.tox[dir=rtl] .tox-comment__reply>:last-child{margin-right:8px}.tox .tox-user{align-items:center;display:flex}.tox .tox-user__avatar svg{fill:rgba(34,47,62,.7)}.tox .tox-user__name{color:rgba(34,47,62,.7);font-size:12px;font-style:normal;font-weight:700;text-transform:uppercase}.tox:not([dir=rtl]) .tox-user__avatar svg{margin-right:8px}.tox:not([dir=rtl]) .tox-user__avatar+.tox-user__name{margin-left:8px}.tox[dir=rtl] .tox-user__avatar svg{margin-left:8px}.tox[dir=rtl] .tox-user__avatar+.tox-user__name{margin-right:8px}.tox .tox-dialog-wrap{align-items:center;bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:1100}.tox .tox-dialog-wrap__backdrop{background-color:rgba(255,255,255,.75);bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.tox .tox-dialog-wrap__backdrop--opaque{background-color:#fff}.tox .tox-dialog{background-color:#fff;border-color:#ccc;border-radius:2px;border-style:solid;border-width:1px;box-shadow:0 16px 16px -10px rgba(34,47,62,.15),0 0 40px 1px rgba(34,47,62,.15);display:flex;flex-direction:column;max-height:100%;max-width:480px;overflow:hidden;position:relative;width:95vw;z-index:2}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog{align-self:flex-start;margin:8px auto;width:calc(100vw - 16px)}}.tox .tox-dialog-inline{z-index:1100}.tox .tox-dialog__header{align-items:center;background-color:#fff;border-bottom:none;color:#222f3e;display:flex;font-size:16px;justify-content:space-between;padding:8px 16px 0 16px;position:relative}.tox .tox-dialog__header .tox-button{z-index:1}.tox .tox-dialog__draghandle{cursor:grab;height:100%;left:0;position:absolute;top:0;width:100%}.tox .tox-dialog__draghandle:active{cursor:grabbing}.tox .tox-dialog__dismiss{margin-left:auto}.tox .tox-dialog__title{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-style:normal;font-weight:400;line-height:1.3;margin:0;text-transform:none}.tox .tox-dialog__body{color:#222f3e;display:flex;flex:1;-ms-flex-preferred-size:auto;font-size:16px;font-style:normal;font-weight:400;line-height:1.3;min-width:0;text-align:left;text-transform:none}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body{flex-direction:column}}.tox .tox-dialog__body-nav{align-items:flex-start;display:flex;flex-direction:column;padding:16px 16px}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body-nav{flex-direction:row;-webkit-overflow-scrolling:touch;overflow-x:auto;padding-bottom:0}}.tox .tox-dialog__body-nav-item{border-bottom:2px solid transparent;color:rgba(34,47,62,.7);display:inline-block;font-size:14px;line-height:1.3;margin-bottom:8px;text-decoration:none;white-space:nowrap}.tox .tox-dialog__body-nav-item:focus{background-color:rgba(32,122,183,.1)}.tox .tox-dialog__body-nav-item--active{border-bottom:2px solid #3c9cff;color:#3c9cff}.tox .tox-dialog__body-content{box-sizing:border-box;display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto;max-height:650px;overflow:auto;-webkit-overflow-scrolling:touch;padding:16px 16px}.tox .tox-dialog__body-content>*{margin-bottom:0;margin-top:16px}.tox .tox-dialog__body-content>:first-child{margin-top:0}.tox .tox-dialog__body-content>:last-child{margin-bottom:0}.tox .tox-dialog__body-content>:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog__body-content a{color:#3c9cff;cursor:pointer;text-decoration:none}.tox .tox-dialog__body-content a:focus,.tox .tox-dialog__body-content a:hover{color:#0182E2;text-decoration:none}.tox .tox-dialog__body-content a:active{color:#0182E2;text-decoration:none}.tox .tox-dialog__body-content svg{fill:#222f3e}.tox .tox-dialog__body-content ul{display:block;list-style-type:disc;margin-bottom:16px;-webkit-margin-end:0;margin-inline-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-padding-start:2.5rem;padding-inline-start:2.5rem}.tox .tox-dialog__body-content .tox-form__group h1{color:#222f3e;font-size:20px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group h2{color:#222f3e;font-size:16px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group p{margin-bottom:16px}.tox .tox-dialog__body-content .tox-form__group h1:first-child,.tox .tox-dialog__body-content .tox-form__group h2:first-child,.tox .tox-dialog__body-content .tox-form__group p:first-child{margin-top:0}.tox .tox-dialog__body-content .tox-form__group h1:last-child,.tox .tox-dialog__body-content .tox-form__group h2:last-child,.tox .tox-dialog__body-content .tox-form__group p:last-child{margin-bottom:0}.tox .tox-dialog__body-content .tox-form__group h1:only-child,.tox .tox-dialog__body-content .tox-form__group h2:only-child,.tox .tox-dialog__body-content .tox-form__group p:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog--width-lg{height:650px;max-width:1200px}.tox .tox-dialog--width-md{max-width:800px}.tox .tox-dialog--width-md .tox-dialog__body-content{overflow:auto}.tox .tox-dialog__body-content--centered{text-align:center}.tox .tox-dialog__footer{align-items:center;background-color:#fff;border-top:1px solid #ccc;display:flex;justify-content:space-between;padding:8px 16px}.tox .tox-dialog__footer-end,.tox .tox-dialog__footer-start{display:flex}.tox .tox-dialog__busy-spinner{align-items:center;background-color:rgba(255,255,255,.75);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:3}.tox .tox-dialog__table{border-collapse:collapse;width:100%}.tox .tox-dialog__table thead th{font-weight:700;padding-bottom:8px}.tox .tox-dialog__table tbody tr{border-bottom:1px solid #ccc}.tox .tox-dialog__table tbody tr:last-child{border-bottom:none}.tox .tox-dialog__table td{padding-bottom:8px;padding-top:8px}.tox .tox-dialog__popups{position:absolute;width:100%;z-index:1100}.tox .tox-dialog__body-iframe{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-iframe .tox-navobj{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2){flex:1;-ms-flex-preferred-size:auto;height:100%}.tox .tox-dialog-dock-fadeout{opacity:0;visibility:hidden}.tox .tox-dialog-dock-fadein{opacity:1;visibility:visible}.tox .tox-dialog-dock-transition{transition:visibility 0s linear .3s,opacity .3s ease}.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein{transition-delay:0s}.tox.tox-platform-ie .tox-dialog-wrap{position:-ms-device-fixed}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav{margin-right:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav-item:not(:first-child){margin-left:8px}}.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end>*,.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start>*{margin-left:8px}.tox[dir=rtl] .tox-dialog__body{text-align:right}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav{margin-left:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav-item:not(:first-child){margin-right:8px}}.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end>*,.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start>*{margin-right:8px}body.tox-dialog__disable-scroll{overflow:hidden}.tox .tox-dropzone-container{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dropzone{align-items:center;background:#fff;border:2px dashed #ccc;box-sizing:border-box;display:flex;flex-direction:column;flex-grow:1;justify-content:center;min-height:100px;padding:10px}.tox .tox-dropzone p{color:rgba(34,47,62,.7);margin:0 0 16px 0}.tox .tox-edit-area{display:flex;flex:1;-ms-flex-preferred-size:auto;overflow:hidden;position:relative}.tox .tox-edit-area__iframe{background-color:#fff;border:0;box-sizing:border-box;flex:1;-ms-flex-preferred-size:auto;height:100%;position:absolute;width:100%}.tox.tox-inline-edit-area{border:1px dotted #ccc}.tox .tox-editor-container{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.tox .tox-editor-header{z-index:1}.tox:not(.tox-tinymce-inline) .tox-editor-header{box-shadow:none;transition:box-shadow .5s}.tox.tox-tinymce--toolbar-bottom .tox-editor-header,.tox.tox-tinymce-inline .tox-editor-header{margin-bottom:-1px}.tox.tox-tinymce--toolbar-sticky-on .tox-editor-header{background-color:transparent;box-shadow:0 4px 4px -3px rgba(0,0,0,.25)}.tox-editor-dock-fadeout{opacity:0;visibility:hidden}.tox-editor-dock-fadein{opacity:1;visibility:visible}.tox-editor-dock-transition{transition:visibility 0s linear .25s,opacity .25s ease}.tox-editor-dock-transition.tox-editor-dock-fadein{transition-delay:0s}.tox .tox-control-wrap{flex:1;position:relative}.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid{display:none}.tox .tox-control-wrap svg{display:block}.tox .tox-control-wrap__status-icon-wrap{position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-control-wrap__status-icon-invalid svg{fill:#c00}.tox .tox-control-wrap__status-icon-unknown svg{fill:orange}.tox .tox-control-wrap__status-icon-valid svg{fill:green}.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield{padding-right:32px}.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap{right:4px}.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield{padding-left:32px}.tox[dir=rtl] .tox-control-wrap__status-icon-wrap{left:4px}.tox .tox-autocompleter{max-width:25em}.tox .tox-autocompleter .tox-menu{max-width:25em}.tox .tox-autocompleter .tox-autocompleter-highlight{font-weight:700}.tox .tox-color-input{display:flex;position:relative;z-index:1}.tox .tox-color-input .tox-textfield{z-index:-1}.tox .tox-color-input span{border-color:rgba(34,47,62,.2);border-radius:2px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;height:24px;position:absolute;top:6px;width:24px}.tox .tox-color-input span:focus:not([aria-disabled=true]),.tox .tox-color-input span:hover:not([aria-disabled=true]){border-color:#3c9cff;cursor:pointer}.tox .tox-color-input span::before{background-image:linear-gradient(45deg,rgba(0,0,0,.25) 25%,transparent 25%),linear-gradient(-45deg,rgba(0,0,0,.25) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,rgba(0,0,0,.25) 75%),linear-gradient(-45deg,transparent 75%,rgba(0,0,0,.25) 75%);background-position:0 0,0 6px,6px -6px,-6px 0;background-size:12px 12px;border:1px solid #fff;border-radius:2px;box-sizing:border-box;content:'';height:24px;left:-1px;position:absolute;top:-1px;width:24px;z-index:-1}.tox .tox-color-input span[aria-disabled=true]{cursor:not-allowed}.tox:not([dir=rtl]) .tox-color-input .tox-textfield{padding-left:36px}.tox:not([dir=rtl]) .tox-color-input span{left:6px}.tox[dir=rtl] .tox-color-input .tox-textfield{padding-right:36px}.tox[dir=rtl] .tox-color-input span{right:6px}.tox .tox-label,.tox .tox-toolbar-label{color:rgba(34,47,62,.7);display:block;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;padding:0 8px 0 0;text-transform:none;white-space:nowrap}.tox .tox-toolbar-label{padding:0 8px}.tox[dir=rtl] .tox-label{padding:0 0 0 8px}.tox .tox-form{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-form__group{box-sizing:border-box;margin-bottom:4px}.tox .tox-form-group--maximize{flex:1}.tox .tox-form__group--error{color:#c00}.tox .tox-form__group--collection{display:flex}.tox .tox-form__grid{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between}.tox .tox-form__grid--2col>.tox-form__group{width:calc(50% - (8px / 2))}.tox .tox-form__grid--3col>.tox-form__group{width:calc(100% / 3 - (8px / 2))}.tox .tox-form__grid--4col>.tox-form__group{width:calc(25% - (8px / 2))}.tox .tox-form__controls-h-stack{align-items:center;display:flex}.tox .tox-form__group--inline{align-items:center;display:flex}.tox .tox-form__group--stretched{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-textarea{flex:1;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-navobj{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-navobj :nth-child(2){flex:1;-ms-flex-preferred-size:auto;height:100%}.tox:not([dir=rtl]) .tox-form__controls-h-stack>:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-form__controls-h-stack>:not(:first-child){margin-right:4px}.tox .tox-lock.tox-locked .tox-lock-icon__unlock,.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock{display:none}.tox .tox-listboxfield .tox-listbox--select,.tox .tox-textarea,.tox .tox-textfield,.tox .tox-toolbar-textfield{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#ccc;border-radius:2px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#222f3e;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 4.75px;resize:none;width:100%}.tox .tox-textarea[disabled],.tox .tox-textfield[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-listboxfield .tox-listbox--select:focus,.tox .tox-textarea:focus,.tox .tox-textfield:focus{background-color:#fff;border-color:#3c9cff;box-shadow:none;outline:0}.tox .tox-toolbar-textfield{border-width:0;margin-bottom:3px;margin-top:2px;max-width:250px}.tox .tox-naked-btn{background-color:transparent;border:0;border-color:transparent;box-shadow:unset;color:#3c9cff;cursor:pointer;display:block;margin:0;padding:0}.tox .tox-naked-btn svg{display:block;fill:#222f3e}.tox:not([dir=rtl]) .tox-toolbar-textfield+*{margin-left:4px}.tox[dir=rtl] .tox-toolbar-textfield+*{margin-right:4px}.tox .tox-listboxfield{cursor:pointer;position:relative}.tox .tox-listboxfield .tox-listbox--select[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-listbox__select-label{cursor:default;flex:1;margin:0 4px}.tox .tox-listbox__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-listbox__select-chevron svg{fill:#222f3e}.tox .tox-listboxfield .tox-listbox--select{align-items:center;display:flex}.tox:not([dir=rtl]) .tox-listboxfield svg{right:8px}.tox[dir=rtl] .tox-listboxfield svg{left:8px}.tox .tox-selectfield{cursor:pointer;position:relative}.tox .tox-selectfield select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#ccc;border-radius:2px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#222f3e;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 4.75px;resize:none;width:100%}.tox .tox-selectfield select[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-selectfield select::-ms-expand{display:none}.tox .tox-selectfield select:focus{background-color:#fff;border-color:#3c9cff;box-shadow:none;outline:0}.tox .tox-selectfield svg{pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.tox:not([dir=rtl]) .tox-selectfield select[size="0"],.tox:not([dir=rtl]) .tox-selectfield select[size="1"]{padding-right:24px}.tox:not([dir=rtl]) .tox-selectfield svg{right:8px}.tox[dir=rtl] .tox-selectfield select[size="0"],.tox[dir=rtl] .tox-selectfield select[size="1"]{padding-left:24px}.tox[dir=rtl] .tox-selectfield svg{left:8px}.tox .tox-textarea{-webkit-appearance:textarea;-moz-appearance:textarea;appearance:textarea;white-space:pre-wrap}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}.tox .tox-help__more-link{list-style:none;margin-top:1em}.tox .tox-image-tools{width:100%}.tox .tox-image-tools__toolbar{align-items:center;display:flex;justify-content:center}.tox .tox-image-tools__image{background-color:#666;height:380px;overflow:auto;position:relative;width:100%}.tox .tox-image-tools__image,.tox .tox-image-tools__image+.tox-image-tools__toolbar{margin-top:8px}.tox .tox-image-tools__image-bg{background:url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==)}.tox .tox-image-tools__toolbar>.tox-spacer{flex:1;-ms-flex-preferred-size:auto}.tox .tox-croprect-block{background:#000;opacity:.5;position:absolute;zoom:1}.tox .tox-croprect-handle{border:2px solid #fff;height:20px;left:0;position:absolute;top:0;width:20px}.tox .tox-croprect-handle-move{border:0;cursor:move;position:absolute}.tox .tox-croprect-handle-nw{border-width:2px 0 0 2px;cursor:nw-resize;left:100px;margin:-2px 0 0 -2px;top:100px}.tox .tox-croprect-handle-ne{border-width:2px 2px 0 0;cursor:ne-resize;left:200px;margin:-2px 0 0 -20px;top:100px}.tox .tox-croprect-handle-sw{border-width:0 0 2px 2px;cursor:sw-resize;left:100px;margin:-20px 2px 0 -2px;top:200px}.tox .tox-croprect-handle-se{border-width:0 2px 2px 0;cursor:se-resize;left:200px;margin:-20px 0 0 -20px;top:200px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-left:8px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-left:32px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-left:32px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-right:8px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-right:32px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-right:32px}.tox .tox-insert-table-picker{display:flex;flex-wrap:wrap;width:170px}.tox .tox-insert-table-picker>div{border-color:#ccc;border-style:solid;border-width:0 1px 1px 0;box-sizing:border-box;height:17px;width:17px}.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker{margin:-4px 0}.tox .tox-insert-table-picker .tox-insert-table-picker__selected{background-color:rgba(32,122,183,.5);border-color:rgba(32,122,183,.5)}.tox .tox-insert-table-picker__label{color:rgba(34,47,62,.7);display:block;font-size:14px;padding:4px;text-align:center;width:100%}.tox:not([dir=rtl]) .tox-insert-table-picker>div:nth-child(10n){border-right:0}.tox[dir=rtl] .tox-insert-table-picker>div:nth-child(10n+1){border-right:0}.tox .tox-menu{background-color:#fff;border:1px solid #ccc;border-radius:2px;box-shadow:0 4px 8px 0 rgba(34,47,62,.1);display:inline-block;overflow:hidden;vertical-align:top;z-index:1150}.tox .tox-menu.tox-collection.tox-collection--list{padding:0}.tox .tox-menu.tox-collection.tox-collection--toolbar{padding:4px}.tox .tox-menu.tox-collection.tox-collection--grid{padding:4px}.tox .tox-menu__label blockquote,.tox .tox-menu__label code,.tox .tox-menu__label h1,.tox .tox-menu__label h2,.tox .tox-menu__label h3,.tox .tox-menu__label h4,.tox .tox-menu__label h5,.tox .tox-menu__label h6,.tox .tox-menu__label p{margin:0}.tox .tox-menubar{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0 #fff;background-color:#f9f9f9;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 4px 0 4px}.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar{border-top:1px solid #ccc}.tox .tox-mbtn{align-items:center;background:0 0;border:0;border-radius:2px;box-shadow:none;color:#222f3e;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:2px 0 3px 0;outline:0;overflow:hidden;padding:0 4px;text-transform:none;width:auto}.tox .tox-mbtn[disabled]{background-color:transparent;border:0;box-shadow:none;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-mbtn:focus:not(:disabled){background:#dee0e2;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn--active{background:#c8cbcf;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active){background:#dee0e2;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-mbtn[disabled] .tox-mbtn__select-label{cursor:not-allowed}.tox .tox-mbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px;display:none}.tox .tox-notification{border-radius:2px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;display:-ms-grid;display:grid;font-size:14px;font-weight:400;-ms-grid-columns:minmax(40px,1fr) auto minmax(40px,1fr);grid-template-columns:minmax(40px,1fr) auto minmax(40px,1fr);margin-top:4px;opacity:0;padding:4px;transition:transform .1s ease-in,opacity 150ms ease-in}.tox .tox-notification p{font-size:14px;font-weight:400}.tox .tox-notification a{cursor:pointer;text-decoration:underline}.tox .tox-notification--in{opacity:1}.tox .tox-notification--success{background-color:#e4eeda;border-color:#d7e6c8;color:#222f3e}.tox .tox-notification--success p{color:#222f3e}.tox .tox-notification--success a{color:#547831}.tox .tox-notification--success svg{fill:#222f3e}.tox .tox-notification--error{background-color:#f8dede;border-color:#f2bfbf;color:#222f3e}.tox .tox-notification--error p{color:#222f3e}.tox .tox-notification--error a{color:#c00}.tox .tox-notification--error svg{fill:#222f3e}.tox .tox-notification--warn,.tox .tox-notification--warning{background-color:#fffaea;border-color:#ffe89d;color:#222f3e}.tox .tox-notification--warn p,.tox .tox-notification--warning p{color:#222f3e}.tox .tox-notification--warn a,.tox .tox-notification--warning a{color:#222f3e}.tox .tox-notification--warn svg,.tox .tox-notification--warning svg{fill:#222f3e}.tox .tox-notification--info{background-color:#d9edf7;border-color:#779ecb;color:#222f3e}.tox .tox-notification--info p{color:#222f3e}.tox .tox-notification--info a{color:#222f3e}.tox .tox-notification--info svg{fill:#222f3e}.tox .tox-notification__body{-ms-grid-row-align:center;align-self:center;color:#222f3e;font-size:14px;-ms-grid-column-span:1;grid-column-end:3;-ms-grid-column:2;grid-column-start:2;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;text-align:center;white-space:normal;word-break:break-all;word-break:break-word}.tox .tox-notification__body>*{margin:0}.tox .tox-notification__body>*+*{margin-top:1rem}.tox .tox-notification__icon{-ms-grid-row-align:center;align-self:center;-ms-grid-column-span:1;grid-column-end:2;-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;-ms-grid-column-align:end;justify-self:end}.tox .tox-notification__icon svg{display:block}.tox .tox-notification__dismiss{-ms-grid-row-align:start;align-self:start;-ms-grid-column-span:1;grid-column-end:4;-ms-grid-column:3;grid-column-start:3;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;-ms-grid-column-align:end;justify-self:end}.tox .tox-notification .tox-progress-bar{-ms-grid-column-span:3;grid-column-end:4;-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:1;grid-row-end:3;-ms-grid-row:2;grid-row-start:2;-ms-grid-column-align:center;justify-self:center}.tox .tox-pop{display:inline-block;position:relative}.tox .tox-pop--resizing{transition:width .1s ease}.tox .tox-pop--resizing .tox-toolbar,.tox .tox-pop--resizing .tox-toolbar__group{flex-wrap:nowrap}.tox .tox-pop--transition{transition:.15s ease;transition-property:left,right,top,bottom}.tox .tox-pop--transition::after,.tox .tox-pop--transition::before{transition:all .15s,visibility 0s,opacity 75ms ease 75ms}.tox .tox-pop__dialog{background-color:#fff;border:1px solid #ccc;border-radius:2px;box-shadow:0 1px 3px rgba(0,0,0,.15);min-width:0;overflow:hidden}.tox .tox-pop__dialog>:not(.tox-toolbar){margin:4px 4px 4px 8px}.tox .tox-pop__dialog .tox-toolbar{background-color:transparent;margin-bottom:-1px}.tox .tox-pop::after,.tox .tox-pop::before{border-style:solid;content:'';display:block;height:0;opacity:1;position:absolute;width:0}.tox .tox-pop.tox-pop--inset::after,.tox .tox-pop.tox-pop--inset::before{opacity:0;transition:all 0s .15s,visibility 0s,opacity 75ms ease}.tox .tox-pop.tox-pop--bottom::after,.tox .tox-pop.tox-pop--bottom::before{left:50%;top:100%}.tox .tox-pop.tox-pop--bottom::after{border-color:#fff transparent transparent transparent;border-width:8px;margin-left:-8px;margin-top:-1px}.tox .tox-pop.tox-pop--bottom::before{border-color:#ccc transparent transparent transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--top::after,.tox .tox-pop.tox-pop--top::before{left:50%;top:0;transform:translateY(-100%)}.tox .tox-pop.tox-pop--top::after{border-color:transparent transparent #fff transparent;border-width:8px;margin-left:-8px;margin-top:1px}.tox .tox-pop.tox-pop--top::before{border-color:transparent transparent #ccc transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--left::after,.tox .tox-pop.tox-pop--left::before{left:0;top:calc(50% - 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--left::after{border-color:transparent #fff transparent transparent;border-width:8px;margin-left:-15px}.tox .tox-pop.tox-pop--left::before{border-color:transparent #ccc transparent transparent;border-width:10px;margin-left:-19px}.tox .tox-pop.tox-pop--right::after,.tox .tox-pop.tox-pop--right::before{left:100%;top:calc(50% + 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--right::after{border-color:transparent transparent transparent #fff;border-width:8px;margin-left:-1px}.tox .tox-pop.tox-pop--right::before{border-color:transparent transparent transparent #ccc;border-width:10px;margin-left:-1px}.tox .tox-pop.tox-pop--align-left::after,.tox .tox-pop.tox-pop--align-left::before{left:20px}.tox .tox-pop.tox-pop--align-right::after,.tox .tox-pop.tox-pop--align-right::before{left:calc(100% - 20px)}.tox .tox-sidebar-wrap{display:flex;flex-direction:row;flex-grow:1;-ms-flex-preferred-size:0;min-height:0}.tox .tox-sidebar{background-color:#fff;display:flex;flex-direction:row;justify-content:flex-end}.tox .tox-sidebar__slider{display:flex;overflow:hidden}.tox .tox-sidebar__pane-container{display:flex}.tox .tox-sidebar__pane{display:flex}.tox .tox-sidebar--sliding-closed{opacity:0}.tox .tox-sidebar--sliding-open{opacity:1}.tox .tox-sidebar--sliding-growing,.tox .tox-sidebar--sliding-shrinking{transition:width .5s ease,opacity .5s ease}.tox .tox-selector{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;display:inline-block;height:10px;position:absolute;width:10px}.tox.tox-platform-touch .tox-selector{height:12px;width:12px}.tox .tox-slider{align-items:center;display:flex;flex:1;-ms-flex-preferred-size:auto;height:24px;justify-content:center;position:relative}.tox .tox-slider__rail{background-color:transparent;border:1px solid #ccc;border-radius:2px;height:10px;min-width:120px;width:100%}.tox .tox-slider__handle{background-color:#3c9cff;border:2px solid #0182E2;border-radius:2px;box-shadow:none;height:24px;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%);width:14px}.tox .tox-source-code{overflow:auto}.tox .tox-spinner{display:flex}.tox .tox-spinner>div{animation:tam-bouncing-dots 1.5s ease-in-out 0s infinite both;background-color:rgba(34,47,62,.7);border-radius:100%;height:8px;width:8px}.tox .tox-spinner>div:nth-child(1){animation-delay:-.32s}.tox .tox-spinner>div:nth-child(2){animation-delay:-.16s}@keyframes tam-bouncing-dots{0%,100%,80%{transform:scale(0)}40%{transform:scale(1)}}.tox:not([dir=rtl]) .tox-spinner>div:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-spinner>div:not(:first-child){margin-right:4px}.tox .tox-statusbar{align-items:center;background-color:#fff;border-top:1px solid #eee;color:rgba(34,47,62,.7);display:flex;flex:0 0 auto;font-size:12px;font-weight:400;height:18px;overflow:hidden;padding:0 8px;position:relative;text-transform:uppercase}.tox .tox-statusbar__text-container{display:flex;flex:1 1 auto;justify-content:flex-end;overflow:hidden}.tox .tox-statusbar__path{display:flex;flex:1 1 auto;margin-right:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tox .tox-statusbar__path>*{display:inline;white-space:nowrap}.tox .tox-statusbar__wordcount{flex:0 0 auto;margin-left:1ch}.tox .tox-statusbar a,.tox .tox-statusbar__path-item,.tox .tox-statusbar__wordcount{color:rgba(34,47,62,.7);text-decoration:none}.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]){cursor:pointer;text-decoration:underline}.tox .tox-statusbar__resize-handle{align-items:flex-end;align-self:stretch;cursor:nwse-resize;display:flex;flex:0 0 auto;justify-content:flex-end;margin-left:auto;margin-right:-8px;padding-left:1ch}.tox .tox-statusbar__resize-handle svg{display:block;fill:rgba(34,47,62,.7)}.tox .tox-statusbar__resize-handle:focus svg{background-color:#dee0e2;border-radius:1px;box-shadow:0 0 0 2px #dee0e2}.tox:not([dir=rtl]) .tox-statusbar__path>*{margin-right:4px}.tox:not([dir=rtl]) .tox-statusbar__branding{margin-left:1ch}.tox[dir=rtl] .tox-statusbar{flex-direction:row-reverse}.tox[dir=rtl] .tox-statusbar__path>*{margin-left:4px}.tox .tox-throbber{z-index:1299}.tox .tox-throbber__busy-spinner{align-items:center;background-color:rgba(255,255,255,.6);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0}.tox .tox-tbtn{align-items:center;background:0 0;border:0;border-radius:2px;box-shadow:none;color:#222f3e;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:2px 0 3px 0;outline:0;overflow:hidden;padding:0;text-transform:none;width:34px}.tox .tox-tbtn svg{display:block;fill:#222f3e}.tox .tox-tbtn.tox-tbtn-more{padding-left:5px;padding-right:5px;width:inherit}.tox .tox-tbtn:focus{background:#dee0e2;border:0;box-shadow:none}.tox .tox-tbtn:hover{background:#dee0e2;border:0;box-shadow:none;color:#222f3e}.tox .tox-tbtn:hover svg{fill:#222f3e}.tox .tox-tbtn:active{background:#c8cbcf;border:0;box-shadow:none;color:#222f3e}.tox .tox-tbtn:active svg{fill:#222f3e}.tox .tox-tbtn--disabled,.tox .tox-tbtn--disabled:hover,.tox .tox-tbtn:disabled,.tox .tox-tbtn:disabled:hover{background:0 0;border:0;box-shadow:none;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-tbtn--disabled svg,.tox .tox-tbtn--disabled:hover svg,.tox .tox-tbtn:disabled svg,.tox .tox-tbtn:disabled:hover svg{fill:rgba(34,47,62,.5)}.tox .tox-tbtn--enabled,.tox .tox-tbtn--enabled:hover{background:#c8cbcf;border:0;box-shadow:none;color:#222f3e}.tox .tox-tbtn--enabled:hover>*,.tox .tox-tbtn--enabled>*{transform:none}.tox .tox-tbtn--enabled svg,.tox .tox-tbtn--enabled:hover svg{fill:#222f3e}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled){color:#222f3e}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg{fill:#222f3e}.tox .tox-tbtn:active>*{transform:none}.tox .tox-tbtn--md{height:51px;width:51px}.tox .tox-tbtn--lg{flex-direction:column;height:68px;width:68px}.tox .tox-tbtn--return{-ms-grid-row-align:stretch;align-self:stretch;height:unset;width:16px}.tox .tox-tbtn--labeled{padding:0 4px;width:unset}.tox .tox-tbtn__vlabel{display:block;font-size:10px;font-weight:400;letter-spacing:-.025em;margin-bottom:4px;white-space:nowrap}.tox .tox-tbtn--select{margin:2px 0 3px 0;padding:0 4px;width:auto}.tox .tox-tbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-tbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-tbtn__select-chevron svg{fill:rgba(34,47,62,.5)}.tox .tox-tbtn--bespoke .tox-tbtn__select-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:7em}.tox .tox-split-button{border:0;border-radius:2px;box-sizing:border-box;display:flex;margin:2px 0 3px 0;overflow:hidden}.tox .tox-split-button:hover{box-shadow:0 0 0 1px #dee0e2 inset}.tox .tox-split-button:focus{background:#dee0e2;box-shadow:none;color:#222f3e}.tox .tox-split-button>*{border-radius:0}.tox .tox-split-button__chevron{width:16px}.tox .tox-split-button__chevron svg{fill:rgba(34,47,62,.5)}.tox .tox-split-button .tox-tbtn{margin:0}.tox.tox-platform-touch .tox-split-button .tox-tbtn:first-child{width:30px}.tox.tox-platform-touch .tox-split-button__chevron{width:20px}.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus,.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,.tox .tox-split-button.tox-tbtn--disabled:focus,.tox .tox-split-button.tox-tbtn--disabled:hover{background:0 0;box-shadow:none;color:rgba(34,47,62,.5)}.tox .tox-toolbar-overlord{background-color:#fff}.tox .tox-toolbar,.tox .tox-toolbar__overflow,.tox .tox-toolbar__primary{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23eeeeee'/%3E%3C/svg%3E") left 0 top 0 #fff;background-color:#fff;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 0}.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed{height:0;opacity:0;padding-bottom:0;padding-top:0;visibility:hidden}.tox .tox-toolbar__overflow--growing{transition:height .3s ease,opacity .2s linear .1s}.tox .tox-toolbar__overflow--shrinking{transition:opacity .3s ease,height .2s linear .1s,visibility 0s linear .3s}.tox .tox-menubar+.tox-toolbar,.tox .tox-menubar+.tox-toolbar-overlord .tox-toolbar__primary{border-top:1px solid #eee;margin-top:-1px}.tox .tox-toolbar--scrolling{flex-wrap:nowrap;overflow-x:auto}.tox .tox-pop .tox-toolbar{border-width:0}.tox .tox-toolbar--no-divider{background-image:none}.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar-overlord:first-child .tox-toolbar__primary,.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar:first-child{border-top:1px solid #eee}.tox.tox-tinymce-aux .tox-toolbar__overflow{background-color:#fff;border:1px solid #eee;border-radius:2px;box-shadow:0 1px 3px rgba(0,0,0,.15)}.tox .tox-toolbar__group{align-items:center;display:flex;flex-wrap:wrap;margin:0 0;padding:0 4px 0 4px}.tox .tox-toolbar__group--pull-right{margin-left:auto}.tox .tox-toolbar--scrolling .tox-toolbar__group{flex-shrink:0;flex-wrap:nowrap}.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type){border-right:1px solid #eee}.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type){border-left:1px solid #eee}.tox .tox-tooltip{display:inline-block;padding:8px;position:relative}.tox .tox-tooltip__body{background-color:#222f3e;border-radius:2px;box-shadow:0 2px 4px rgba(34,47,62,.3);color:rgba(255,255,255,.75);font-size:14px;font-style:normal;font-weight:400;padding:4px 8px;text-transform:none}.tox .tox-tooltip__arrow{position:absolute}.tox .tox-tooltip--down .tox-tooltip__arrow{border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #222f3e;bottom:0;left:50%;position:absolute;transform:translateX(-50%)}.tox .tox-tooltip--up .tox-tooltip__arrow{border-bottom:8px solid #222f3e;border-left:8px solid transparent;border-right:8px solid transparent;left:50%;position:absolute;top:0;transform:translateX(-50%)}.tox .tox-tooltip--right .tox-tooltip__arrow{border-bottom:8px solid transparent;border-left:8px solid #222f3e;border-top:8px solid transparent;position:absolute;right:0;top:50%;transform:translateY(-50%)}.tox .tox-tooltip--left .tox-tooltip__arrow{border-bottom:8px solid transparent;border-right:8px solid #222f3e;border-top:8px solid transparent;left:0;position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-well{border:1px solid #eee;border-radius:2px;padding:8px;width:100%}.tox .tox-well>:first-child{margin-top:0}.tox .tox-well>:last-child{margin-bottom:0}.tox .tox-well>:only-child{margin:0}.tox .tox-custom-editor{border:1px solid #eee;border-radius:2px;display:flex;flex:1;position:relative}.tox .tox-dialog-loading::before{background-color:rgba(0,0,0,.5);content:"";height:100%;position:absolute;width:100%;z-index:1000}.tox .tox-tab{cursor:pointer}.tox .tox-dialog__content-js{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-content .tox-collection{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-image-tools-edit-panel{height:60px}.tox .tox-image-tools__sidebar{height:60px}
diff --git a/public/static/assets/gougu/module/tinymce/skins/ui/oxide/skin.mobile.min.css b/public/static/assets/gougu/module/tinymce/skins/ui/oxide/skin.mobile.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..3a45cacf0f369191a4c3cae8445b02e4d41c85e4
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/skins/ui/oxide/skin.mobile.min.css
@@ -0,0 +1,7 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.tinymce-mobile-outer-container{all:initial;display:block}.tinymce-mobile-outer-container *{border:0;box-sizing:initial;cursor:inherit;float:none;line-height:1;margin:0;outline:0;padding:0;-webkit-tap-highlight-color:transparent;text-shadow:none;white-space:nowrap}.tinymce-mobile-icon-arrow-back::before{content:"\e5cd"}.tinymce-mobile-icon-image::before{content:"\e412"}.tinymce-mobile-icon-cancel-circle::before{content:"\e5c9"}.tinymce-mobile-icon-full-dot::before{content:"\e061"}.tinymce-mobile-icon-align-center::before{content:"\e234"}.tinymce-mobile-icon-align-left::before{content:"\e236"}.tinymce-mobile-icon-align-right::before{content:"\e237"}.tinymce-mobile-icon-bold::before{content:"\e238"}.tinymce-mobile-icon-italic::before{content:"\e23f"}.tinymce-mobile-icon-unordered-list::before{content:"\e241"}.tinymce-mobile-icon-ordered-list::before{content:"\e242"}.tinymce-mobile-icon-font-size::before{content:"\e245"}.tinymce-mobile-icon-underline::before{content:"\e249"}.tinymce-mobile-icon-link::before{content:"\e157"}.tinymce-mobile-icon-unlink::before{content:"\eca2"}.tinymce-mobile-icon-color::before{content:"\e891"}.tinymce-mobile-icon-previous::before{content:"\e314"}.tinymce-mobile-icon-next::before{content:"\e315"}.tinymce-mobile-icon-large-font::before,.tinymce-mobile-icon-style-formats::before{content:"\e264"}.tinymce-mobile-icon-undo::before{content:"\e166"}.tinymce-mobile-icon-redo::before{content:"\e15a"}.tinymce-mobile-icon-removeformat::before{content:"\e239"}.tinymce-mobile-icon-small-font::before{content:"\e906"}.tinymce-mobile-format-matches::after,.tinymce-mobile-icon-readonly-back::before{content:"\e5ca"}.tinymce-mobile-icon-small-heading::before{content:"small"}.tinymce-mobile-icon-large-heading::before{content:"large"}.tinymce-mobile-icon-large-heading::before,.tinymce-mobile-icon-small-heading::before{font-family:sans-serif;font-size:80%}.tinymce-mobile-mask-edit-icon::before{content:"\e254"}.tinymce-mobile-icon-back::before{content:"\e5c4"}.tinymce-mobile-icon-heading::before{content:"Headings";font-family:sans-serif;font-size:80%;font-weight:700}.tinymce-mobile-icon-h1::before{content:"H1";font-weight:700}.tinymce-mobile-icon-h2::before{content:"H2";font-weight:700}.tinymce-mobile-icon-h3::before{content:"H3";font-weight:700}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask{align-items:center;display:flex;justify-content:center;background:rgba(51,51,51,.5);height:100%;position:absolute;top:0;width:100%}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container{align-items:center;border-radius:50%;display:flex;flex-direction:column;font-family:sans-serif;font-size:1em;justify-content:space-between}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .mixin-menu-item{align-items:center;display:flex;justify-content:center;border-radius:50%;height:2.1em;width:2.1em}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section{align-items:center;display:flex;justify-content:center;flex-direction:column;font-size:1em}@media only screen and (min-device-width:700px){.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section{font-size:1.2em}}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon{align-items:center;display:flex;justify-content:center;border-radius:50%;height:2.1em;width:2.1em;background-color:#fff;color:#207ab7}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon::before{content:"\e900";font-family:tinymce-mobile,sans-serif}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section:not(.tinymce-mobile-mask-tap-icon-selected) .tinymce-mobile-mask-tap-icon{z-index:2}.tinymce-mobile-android-container.tinymce-mobile-android-maximized{background:#fff;border:none;bottom:0;display:flex;flex-direction:column;left:0;position:fixed;right:0;top:0}.tinymce-mobile-android-container:not(.tinymce-mobile-android-maximized){position:relative}.tinymce-mobile-android-container .tinymce-mobile-editor-socket{display:flex;flex-grow:1}.tinymce-mobile-android-container .tinymce-mobile-editor-socket iframe{display:flex!important;flex-grow:1;height:auto!important}.tinymce-mobile-android-scroll-reload{overflow:hidden}:not(.tinymce-mobile-readonly-mode)>.tinymce-mobile-android-selection-context-toolbar{margin-top:23px}.tinymce-mobile-toolstrip{background:#fff;display:flex;flex:0 0 auto;z-index:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar{align-items:center;background-color:#fff;border-bottom:1px solid #ccc;display:flex;flex:1;height:2.5em;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group{align-items:center;display:flex;height:100%;flex-shrink:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group>div{align-items:center;display:flex;height:100%;flex:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-exit-container{background:#f44336}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-toolbar-scrollable-group{flex-grow:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item{padding-left:.5em;padding-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button{align-items:center;display:flex;height:80%;margin-left:2px;margin-right:2px}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button.tinymce-mobile-toolbar-button-selected{background:#c8cbcf;color:#ccc}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:first-of-type,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:last-of-type{background:#207ab7;color:#eceff1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group{align-items:center;display:flex;height:100%;flex:1;padding-bottom:.4em;padding-top:.4em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog{display:flex;min-height:1.5em;overflow:hidden;padding-left:0;padding-right:0;position:relative;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain{display:flex;height:100%;transition:left cubic-bezier(.4,0,1,1) .15s;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen{display:flex;flex:0 0 auto;justify-content:space-between;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen input{font-family:Sans-serif}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container{display:flex;flex-grow:1;position:relative}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container .tinymce-mobile-input-container-x{-ms-grid-row-align:center;align-self:center;background:inherit;border:none;border-radius:50%;color:#888;font-size:.6em;font-weight:700;height:100%;padding-right:2px;position:absolute;right:0}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container.tinymce-mobile-input-container-empty .tinymce-mobile-input-container-x{display:none}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous{align-items:center;display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous::before{align-items:center;display:flex;font-weight:700;height:100%;padding-left:.5em;padding-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next.tinymce-mobile-toolbar-navigation-disabled::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous.tinymce-mobile-toolbar-navigation-disabled::before{visibility:hidden}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item{color:#ccc;font-size:10px;line-height:10px;margin:0 2px;padding-top:3px}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item.tinymce-mobile-dot-active{color:#c8cbcf}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-font::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-heading::before{margin-left:.5em;margin-right:.9em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-font::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-heading::before{margin-left:.9em;margin-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider{display:flex;flex:1;margin-left:0;margin-right:0;padding:.28em 0;position:relative}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container{align-items:center;display:flex;flex-grow:1;height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container .tinymce-mobile-slider-size-line{background:#ccc;display:flex;flex:1;height:.2em;margin-bottom:.3em;margin-top:.3em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container{padding-left:2em;padding-right:2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container{align-items:center;display:flex;flex-grow:1;height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container .tinymce-mobile-slider-gradient{background:linear-gradient(to right,red 0,#feff00 17%,#0f0 33%,#00feff 50%,#00f 67%,#ff00fe 83%,red 100%);display:flex;flex:1;height:.2em;margin-bottom:.3em;margin-top:.3em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-black{background:#000;height:.2em;margin-bottom:.3em;margin-top:.3em;width:1.2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-white{background:#fff;height:.2em;margin-bottom:.3em;margin-top:.3em;width:1.2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb{align-items:center;background-clip:padding-box;background-color:#455a64;border:.5em solid rgba(136,136,136,0);border-radius:3em;bottom:0;color:#fff;display:flex;height:.5em;justify-content:center;left:-10px;margin:auto;position:absolute;top:0;transition:border 120ms cubic-bezier(.39,.58,.57,1);width:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb.tinymce-mobile-thumb-active{border:.5em solid rgba(136,136,136,.39)}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group>div{align-items:center;display:flex;height:100%;flex:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper{flex-direction:column;justify-content:center}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item{align-items:center;display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item:not(.tinymce-mobile-serialised-dialog){height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-container{display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input{background:#fff;border:none;border-radius:0;color:#455a64;flex-grow:1;font-size:.85em;padding-bottom:.1em;padding-left:5px;padding-top:.1em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::-webkit-input-placeholder{color:#888}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::placeholder{color:#888}.tinymce-mobile-dropup{background:#fff;display:flex;overflow:hidden;width:100%}.tinymce-mobile-dropup.tinymce-mobile-dropup-shrinking{transition:height .3s ease-out}.tinymce-mobile-dropup.tinymce-mobile-dropup-growing{transition:height .3s ease-in}.tinymce-mobile-dropup.tinymce-mobile-dropup-closed{flex-grow:0}.tinymce-mobile-dropup.tinymce-mobile-dropup-open:not(.tinymce-mobile-dropup-growing){flex-grow:1}.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:200px}@media only screen and (orientation:landscape){.tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:200px}}@media only screen and (min-device-width :320px) and (max-device-width :568px) and (orientation :landscape){.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:150px}}.tinymce-mobile-styles-menu{font-family:sans-serif;outline:4px solid #000;overflow:hidden;position:relative;width:100%}.tinymce-mobile-styles-menu [role=menu]{display:flex;flex-direction:column;height:100%;position:absolute;width:100%}.tinymce-mobile-styles-menu [role=menu].transitioning{transition:transform .5s ease-in-out}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item{border-bottom:1px solid #ddd;color:#455a64;cursor:pointer;display:flex;padding:1em 1em;position:relative}.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser .tinymce-mobile-styles-collapse-icon::before{color:#455a64;content:"\e314";font-family:tinymce-mobile,sans-serif}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-styles-item-is-menu::after{color:#455a64;content:"\e315";font-family:tinymce-mobile,sans-serif;padding-left:1em;padding-right:1em;position:absolute;right:0}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-format-matches::after{font-family:tinymce-mobile,sans-serif;padding-left:1em;padding-right:1em;position:absolute;right:0}.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser,.tinymce-mobile-styles-menu .tinymce-mobile-styles-separator{align-items:center;background:#fff;border-top:#455a64;color:#455a64;display:flex;min-height:2.5em;padding-left:1em;padding-right:1em}.tinymce-mobile-styles-menu [data-transitioning-destination=before][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=before]{transform:translate(-100%)}.tinymce-mobile-styles-menu [data-transitioning-destination=current][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=current]{transform:translate(0)}.tinymce-mobile-styles-menu [data-transitioning-destination=after][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=after]{transform:translate(100%)}@font-face{font-family:tinymce-mobile;font-style:normal;font-weight:400;src:url(fonts/tinymce-mobile.woff?8x92w3) format('woff')}@media (min-device-width:700px){.tinymce-mobile-outer-container,.tinymce-mobile-outer-container input{font-size:25px}}@media (max-device-width:700px){.tinymce-mobile-outer-container,.tinymce-mobile-outer-container input{font-size:18px}}.tinymce-mobile-icon{font-family:tinymce-mobile,sans-serif}.mixin-flex-and-centre{align-items:center;display:flex;justify-content:center}.mixin-flex-bar{align-items:center;display:flex;height:100%}.tinymce-mobile-outer-container .tinymce-mobile-editor-socket iframe{background-color:#fff;width:100%}.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{background-color:#207ab7;border-radius:50%;bottom:1em;color:#fff;font-size:1em;height:2.1em;position:fixed;right:2em;width:2.1em;align-items:center;display:flex;justify-content:center}@media only screen and (min-device-width:700px){.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{font-size:1.2em}}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket{height:300px;overflow:hidden}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket iframe{height:100%}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-toolstrip{display:none}input[type=file]::-webkit-file-upload-button{display:none}@media only screen and (min-device-width :320px) and (max-device-width :568px) and (orientation :landscape){.tinymce-mobile-ios-container .tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{bottom:50%}}
diff --git a/public/static/assets/gougu/module/tinymce/skins/ui/oxide/skin.shadowdom.min.css b/public/static/assets/gougu/module/tinymce/skins/ui/oxide/skin.shadowdom.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..a0893b913e5a8599a5c279c533d1071ed13676f4
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/skins/ui/oxide/skin.shadowdom.min.css
@@ -0,0 +1,7 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}
diff --git a/public/static/assets/gougu/module/tinymce/themes/mobile/theme.min.js b/public/static/assets/gougu/module/tinymce/themes/mobile/theme.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..7dc19567967dc68800c334631e5e3734638c9a8f
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/themes/mobile/theme.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";var y=function(){return(y=Object.assign||function(n){for(var e,t=1,o=arguments.length;t<o;t++)for(var r in e=arguments[t])Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}).apply(this,arguments)};function c(n,e){var t={};for(r in n)Object.prototype.hasOwnProperty.call(n,r)&&e.indexOf(r)<0&&(t[r]=n[r]);if(null!=n&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(n);o<r.length;o++)e.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(n,r[o])&&(t[r[o]]=n[r[o]]);return t}function u(n,e,t){if(t||2===arguments.length)for(var o,r=0,i=e.length;r<i;r++)!o&&r in e||((o=o||Array.prototype.slice.call(e,0,r))[r]=e[r]);return n.concat(o||Array.prototype.slice.call(e))}function n(o){return function(n){return t=typeof(e=n),(null===e?"null":"object"==t&&(Array.prototype.isPrototypeOf(e)||e.constructor&&"Array"===e.constructor.name)?"array":"object"==t&&(String.prototype.isPrototypeOf(e)||e.constructor&&"String"===e.constructor.name)?"string":t)===o;var e,t}}function e(e){return function(n){return typeof n===e}}function t(e){return function(n){return e===n}}function l(n){return!(null==n)}function Y(){}function i(t,o){return function(){for(var n=[],e=0;e<arguments.length;e++)n[e]=arguments[e];return t(o.apply(null,n))}}function w(n){return function(){return n}}function K(n){return n}function o(n,e){return n===e}var r=n("string"),a=n("object"),D=n("array"),s=t(null),d=e("boolean"),f=t(void 0),m=e("function"),g=e("number");function J(o){for(var r=[],n=1;n<arguments.length;n++)r[n-1]=arguments[n];return function(){for(var n=[],e=0;e<arguments.length;e++)n[e]=arguments[e];var t=r.concat(n);return o.apply(null,t)}}function Q(e){return function(n){return!e(n)}}function h(n){return function(){throw new Error(n)}}function p(n){return n()}function v(){return b}var S=w(!1),x=w(!0),b={fold:function(n,e){return n()},isSome:S,isNone:x,getOr:K,getOrThunk:O,getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:w(null),getOrUndefined:w(void 0),or:K,orThunk:O,map:v,each:Y,bind:v,exists:S,forall:x,filter:function(){return b},toArray:function(){return[]},toString:w("none()")};function O(n){return n()}function k(t){var o,r=!1;return function(){for(var n=[],e=0;e<arguments.length;e++)n[e]=arguments[e];return r||(r=!0,o=t.apply(null,n)),o}}function T(n,e){return-1<pn.call(n,e)}function C(n,e){for(var t=0,o=n.length;t<o;t++)if(e(n[t],t))return 1}function Z(n,e){for(var t=n.length,o=new Array(t),r=0;r<t;r++){var i=n[r];o[r]=e(i,r)}return o}function M(n,e){for(var t=0,o=n.length;t<o;t++)e(n[t],t)}function E(n,e){for(var t=[],o=0,r=n.length;o<r;o++){var i=n[o];e(i,o)&&t.push(i)}return t}function _(n,o,r){return function(n){for(var e,t=n.length-1;0<=t;t--)e=n[t],r=o(r,e,t)}(n),r}function R(n,t,o){return M(n,function(n,e){o=t(o,n,e)}),o}function F(n,e){return function(n,e,t){for(var o=0,r=n.length;o<r;o++){var i=n[o];if(e(i,o))return mn.some(i);if(t(i,o))break}return mn.none()}(n,e,S)}function I(n,e){for(var t=0,o=n.length;t<o;t++)if(e(n[t],t))return mn.some(t);return mn.none()}function V(n){for(var e=[],t=0,o=n.length;t<o;++t){if(!D(n[t]))throw new Error("Arr.flatten item "+t+" was not an array, input: "+n);hn.apply(e,n[t])}return e}function B(n,e){return V(Z(n,e))}function A(n,e){for(var t=0,o=n.length;t<o;++t)if(!0!==e(n[t],t))return!1;return!0}function N(n){var e=gn.call(n,0);return e.reverse(),e}function H(n,e){return E(n,function(n){return!T(e,n)})}function P(n){return[n]}function z(n,e){for(var t=0;t<n.length;t++){var o=e(n[t],t);if(o.isSome())return o}return mn.none()}function j(n,e){var t=String(e).toLowerCase();return F(n,function(n){return n.search(t)})}function L(n,e){return-1!==n.indexOf(e)}function $(e){return function(n){return L(n,e)}}function G(n){return window.matchMedia(n).matches}function U(n){return w("alloy."+n)}function W(n,e){se(n,n.element,e,{})}function X(n,e,t){se(n,n.element,e,t)}function q(n){W(n,Zn())}function nn(n,e,t){se(n,e,t,{})}function en(n,e){var t=n.dom;if(1!==t.nodeType)return!1;var o=t;if(void 0!==o.matches)return o.matches(e);if(void 0!==o.msMatchesSelector)return o.msMatchesSelector(e);if(void 0!==o.webkitMatchesSelector)return o.webkitMatchesSelector(e);if(void 0!==o.mozMatchesSelector)return o.mozMatchesSelector(e);throw new Error("Browser lacks native selectors")}function tn(n){return 1!==n.nodeType&&9!==n.nodeType&&11!==n.nodeType||0===n.childElementCount}function on(n,e){var t=void 0===e?document:e.dom;return tn(t)?[]:Z(t.querySelectorAll(n),fe.fromDom)}function rn(n,e){var t=void 0===e?document:e.dom;return tn(t)?mn.none():mn.from(t.querySelector(n)).map(fe.fromDom)}function un(n,e){return n.dom===e.dom}function cn(){return vn(0,0)}function an(n){function e(n){return function(){return t===n}}var t=n.current,o=n.version;return{current:t,version:o,isEdge:e("Edge"),isChrome:e("Chrome"),isIE:e("IE"),isOpera:e("Opera"),isFirefox:e(Sn),isSafari:e("Safari")}}function sn(n){function e(n){return function(){return t===n}}var t=n.current,o=n.version;return{current:t,version:o,isWindows:e(Tn),isiOS:e("iOS"),isAndroid:e(Cn),isOSX:e("OSX"),isLinux:e("Linux"),isSolaris:e(En),isFreeBSD:e(Dn),isChromeOS:e(Mn)}}function fn(n){if(null==n)throw new Error("Node cannot be null or undefined");return{dom:n}}var ln,dn=function(t){function n(){return r}function e(n){return n(t)}var o=w(t),r={fold:function(n,e){return e(t)},isSome:x,isNone:S,getOr:o,getOrThunk:o,getOrDie:o,getOrNull:o,getOrUndefined:o,or:n,orThunk:n,map:function(n){return dn(n(t))},each:function(n){n(t)},bind:e,exists:e,forall:e,filter:function(n){return n(t)?r:b},toArray:function(){return[t]},toString:function(){return"some("+t+")"}};return r},mn={some:dn,none:v,from:function(n){return null==n?b:dn(n)}},gn=Array.prototype.slice,pn=Array.prototype.indexOf,hn=Array.prototype.push,vn=function(n,e){return{major:n,minor:e}},bn={nu:vn,detect:function(n,e){var t,o,r=String(e).toLowerCase();return 0===n.length?cn():(o=function(n,e){for(var t=0;t<n.length;t++){var o=n[t];if(o.test(e))return o}}(n,t=r))?vn(i(1),i(2)):{major:0,minor:0};function i(n){return Number(t.replace(o,"$"+n))}},unknown:cn},yn=(ln=/^\s+|\s+$/g,function(n){return n.replace(ln,"")}),xn=/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,wn={browsers:w([{name:"Edge",versionRegexes:[/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],search:function(n){return L(n,"edge/")&&L(n,"chrome")&&L(n,"safari")&&L(n,"applewebkit")}},{name:"Chrome",brand:"Chromium",versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/,xn],search:function(n){return L(n,"chrome")&&!L(n,"chromeframe")}},{name:"IE",versionRegexes:[/.*?msie\ ?([0-9]+)\.([0-9]+).*/,/.*?rv:([0-9]+)\.([0-9]+).*/],search:function(n){return L(n,"msie")||L(n,"trident")}},{name:"Opera",versionRegexes:[xn,/.*?opera\/([0-9]+)\.([0-9]+).*/],search:$("opera")},{name:"Firefox",versionRegexes:[/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],search:$("firefox")},{name:"Safari",versionRegexes:[xn,/.*?cpu os ([0-9]+)_([0-9]+).*/],search:function(n){return(L(n,"safari")||L(n,"mobile/"))&&L(n,"applewebkit")}}]),oses:w([{name:"Windows",search:$("win"),versionRegexes:[/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]},{name:"iOS",search:function(n){return L(n,"iphone")||L(n,"ipad")},versionRegexes:[/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,/.*cpu os ([0-9]+)_([0-9]+).*/,/.*cpu iphone os ([0-9]+)_([0-9]+).*/]},{name:"Android",search:$("android"),versionRegexes:[/.*?android\ ?([0-9]+)\.([0-9]+).*/]},{name:"OSX",search:$("mac os x"),versionRegexes:[/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]},{name:"Linux",search:$("linux"),versionRegexes:[]},{name:"Solaris",search:$("sunos"),versionRegexes:[]},{name:"FreeBSD",search:$("freebsd"),versionRegexes:[]},{name:"ChromeOS",search:$("cros"),versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/]}])},Sn="Firefox",On=function(){return an({current:void 0,version:bn.unknown()})},kn=an,Tn=(w("Edge"),w("Chrome"),w("IE"),w("Opera"),w(Sn),w("Safari"),"Windows"),Cn="Android",En="Solaris",Dn="FreeBSD",Mn="ChromeOS",_n=function(){return sn({current:void 0,version:bn.unknown()})},Rn=sn,Fn=(w(Tn),w("iOS"),w(Cn),w("Linux"),w("OSX"),w(En),w(Dn),w(Mn),k(function(){return n=navigator.userAgent,e=mn.from(navigator.userAgentData),t=G,p=wn.browsers(),h=wn.oses(),v=e.bind(function(n){return o=p,z(n.brands,function(e){var t=e.brand.toLowerCase();return F(o,function(n){var e;return t===(null===(e=n.brand)||void 0===e?void 0:e.toLowerCase())}).map(function(n){return{current:n.name,version:bn.nu(parseInt(e.version,10),0)}})});var o}).orThunk(function(){return j(p,t=n).map(function(n){var e=bn.detect(n.versionRegexes,t);return{current:n.name,version:e}});var t}).fold(On,kn),b=j(h,o=n).map(function(n){var e=bn.detect(n.versionRegexes,o);return{current:n.name,version:e}}).fold(_n,Rn),{browser:v,os:b,deviceType:(i=v,u=n,c=t,a=(r=b).isiOS()&&!0===/ipad/i.test(u),s=r.isiOS()&&!a,l=(f=r.isiOS()||r.isAndroid())||c("(pointer:coarse)"),d=a||!s&&f&&c("(min-device-width:768px)"),m=s||f&&!d,g=i.isSafari()&&r.isiOS()&&!1===/safari/i.test(u),{isiPad:w(a),isiPhone:w(s),isTablet:w(d),isPhone:w(m),isTouch:w(l),isAndroid:r.isAndroid,isiOS:r.isiOS,isWebView:w(g),isDesktop:w(!m&&!d&&!g)})};var n,e,t,o,r,i,u,c,a,s,f,l,d,m,g,p,h,v,b})),In=w,Vn=In("touchstart"),Bn=In("touchmove"),An=In("touchend"),Nn=In("mousedown"),Hn=In("mousemove"),Pn=In("mouseup"),zn=In("mouseover"),jn=In("keydown"),Ln=In("keyup"),$n=In("input"),Gn=In("change"),Un=In("click"),Wn=In("transitionend"),Xn=In("selectstart"),qn={tap:U("tap")},Yn=U("focus"),Kn=U("blur.post"),Jn=U("paste.post"),Qn=U("receive"),Zn=U("execute"),ne=U("focus.item"),ee=qn.tap,te=U("longpress"),oe=U("system.init"),re=U("system.attached"),ie=U("system.detached"),ue=U("focusmanager.shifted"),ce=U("highlight"),ae=U("dehighlight"),se=function(n,e,t,o){var r=y({target:e},o);n.getSystem().triggerEvent(t,e,r)},fe={fromHtml:function(n,e){var t=(e||document).createElement("div");if(t.innerHTML=n,!t.hasChildNodes()||1<t.childNodes.length)throw console.error("HTML does not have a single root node",n),new Error("HTML must have a single root node");return fn(t.childNodes[0])},fromTag:function(n,e){var t=(e||document).createElement(n);return fn(t)},fromText:function(n,e){var t=(e||document).createTextNode(n);return fn(t)},fromDom:fn,fromPoint:function(n,e,t){return mn.from(n.dom.elementFromPoint(e,t)).map(fn)}};function le(n){return n.dom.nodeName.toLowerCase()}function de(e){return function(n){return n.dom.nodeType===e}}function me(n){return fe.fromDom(n.dom.ownerDocument)}function ge(n){return Ye(n)?n:me(n)}function pe(n){return mn.from(n.dom.parentNode).map(fe.fromDom)}function he(n,e){var t=n.dom.childNodes;return mn.from(t[e]).map(fe.fromDom)}function ve(e,t){pe(e).each(function(n){n.dom.insertBefore(t.dom,e.dom)})}function be(n,e){mn.from(n.dom.nextSibling).map(fe.fromDom).fold(function(){pe(n).each(function(n){Qe(n,e)})},function(n){ve(n,e)})}function ye(e,t){he(e,0).fold(function(){Qe(e,t)},function(n){e.dom.insertBefore(t.dom,n.dom)})}function xe(e,n){M(n,function(n){Qe(e,n)})}function we(n){n.dom.textContent="",M(Je(n),function(n){Ze(n)})}function Se(n){return Ke(n)&&l(n.dom.host)}function Oe(n){return fe.fromDom(n.dom.host)}function ke(){return it(fe.fromDom(document))}function Te(n,e){Qe(n.element,e.element)}function Ce(e){var n,t=pe(e.element).bind(function(n){return e.getSystem().getByDom(n).toOptional()});ut(n=e),Ze(n.element),n.getSystem().removeFromWorld(n),t.each(function(n){n.syncComponents()})}function Ee(n,e){for(var t=st(n),o=0,r=t.length;o<r;o++){var i=t[o];e(n[i],i)}}function De(n,t){return lt(n,function(n,e){return{k:e,v:t(n,e)}})}function Me(n,t){var o=[];return Ee(n,function(n,e){o.push(t(n,e))}),o}function _e(n,e){return dt(n,e)?mn.from(n[e]):mn.none()}function Re(n,e){return dt(n,e)&&void 0!==n[e]&&null!==n[e]}function Fe(n,e,t){if(!(r(t)||d(t)||g(t)))throw console.error("Invalid call to Attribute.set. Key ",e,":: Value ",t,":: Element ",n),new Error("Attribute value was not simple");n.setAttribute(e,t+"")}function Ie(n,e,t){Fe(n.dom,e,t)}function Ve(n,e){var t=n.dom;Ee(e,function(n,e){Fe(t,e,n)})}function Be(n,e){var t=n.dom.getAttribute(e);return null===t?void 0:t}function Ae(n,e){return mn.from(Be(n,e))}function Ne(n,e){var t=n.dom;return!(!t||!t.hasAttribute)&&t.hasAttribute(e)}function He(n,e){n.dom.removeAttribute(e)}function Pe(n,e){var t=Be(n,e);return void 0===t||""===t?[]:t.split(" ")}function ze(n){return void 0!==n.dom.classList}function je(n,e){var t,o,r;ze(n)?n.dom.classList.add(e):(o=e,r=Pe(t=n,"class").concat([o]),Ie(t,"class",r.join(" ")))}function Le(n,e){var t,o,r,i;ze(n)?n.dom.classList.remove(e):(r=e,0<(i=E(Pe(o=n,"class"),function(n){return n!==r})).length?Ie(o,"class",i.join(" ")):He(o,"class")),0===(ze(t=n)?t.dom.classList:Pe(t,"class")).length&&He(t,"class")}function $e(n,e){return ze(n)&&n.dom.classList.contains(e)}function Ge(n,e,t){Le(n,t),je(n,e)}"undefined"!=typeof window||Function("return this;")();var Ue,We,Xe=de(1),qe=de(3),Ye=de(9),Ke=de(11),Je=function(n){return Z(n.dom.childNodes,fe.fromDom)},Qe=function(n,e){n.dom.appendChild(e.dom)},Ze=function(n){var e=n.dom;null!==e.parentNode&&e.parentNode.removeChild(e)},nt=m(Element.prototype.attachShadow)&&m(Node.prototype.getRootNode),et=w(nt),tt=nt?function(n){return fe.fromDom(n.dom.getRootNode())}:ge,ot=function(n){return l(n.dom.shadowRoot)},rt=function(n){var e=qe(n)?n.dom.parentNode:n.dom;if(null==e||null===e.ownerDocument)return!1;var t,o,r=e.ownerDocument,i=fe.fromDom(e),u=tt(i);return(Se(u)?mn.some(u):mn.none()).fold(function(){return r.body.contains(e)},(t=rt,o=Oe,function(n){return t(o(n))}))},it=function(n){var e=n.dom.body;if(null==e)throw new Error("Body is not available yet");return fe.fromDom(e)},ut=function(n){W(n,ie()),M(n.components(),ut)},ct=function(n){M(n.components(),ct),W(n,re())},at=function(n,e,t){n.getSystem().addToWorld(e),t(n.element,e.element),rt(n.element)&&ct(e),n.syncComponents()},st=Object.keys,ft=Object.hasOwnProperty,lt=function(n,o){var r={};return Ee(n,function(n,e){var t=o(n,e);r[t.k]=t.v}),r},dt=function(n,e){return ft.call(n,e)},mt=Object.freeze({__proto__:null,toAlpha:function(n,e,t){Ge(n.element,e.alpha,e.omega)},toOmega:function(n,e,t){Ge(n.element,e.omega,e.alpha)},isAlpha:function(n,e,t){return $e(n.element,e.alpha)},isOmega:function(n,e,t){return $e(n.element,e.omega)},clear:function(n,e,t){Le(n.element,e.alpha),Le(n.element,e.omega)}}),gt=function(t){return{isValue:x,isError:S,getOr:w(t),getOrThunk:w(t),getOrDie:w(t),or:function(n){return gt(t)},orThunk:function(n){return gt(t)},fold:function(n,e){return e(t)},map:function(n){return gt(n(t))},mapError:function(n){return gt(t)},each:function(n){n(t)},bind:function(n){return n(t)},exists:function(n){return n(t)},forall:function(n){return n(t)},toOptional:function(){return mn.some(t)}}},pt=function(t){return{isValue:S,isError:x,getOr:K,getOrThunk:function(n){return n()},getOrDie:function(){return h(String(t))()},or:K,orThunk:function(n){return n()},fold:function(n,e){return n(t)},map:function(n){return pt(t)},mapError:function(n){return pt(n(t))},each:Y,bind:function(n){return pt(t)},exists:S,forall:x,toOptional:mn.none}},ht={value:gt,error:pt,fromOption:function(n,e){return n.fold(function(){return pt(e)},gt)}};function vt(n,e,t){return n.stype===Ue.Error?e(n.serror):t(n.svalue)}function bt(n){return{stype:Ue.Value,svalue:n}}function yt(n){return{stype:Ue.Error,serror:n}}function xt(n,e,t,o){return{tag:"field",key:n,newKey:e,presence:t,prop:o}}function wt(n,e,t){switch(n.tag){case"field":return e(n.key,n.newKey,n.presence,n.prop);case"custom":return t(n.newKey,n.instantiator)}}function St(u){return function(){for(var n=[],e=0;e<arguments.length;e++)n[e]=arguments[e];if(0===n.length)throw new Error("Can't merge zero objects");for(var t={},o=0;o<n.length;o++){var r,i=n[o];for(r in i)dt(i,r)&&(t[r]=u(t[r],i[r]))}return t}}function Ot(){return{tag:"required",process:{}}}function kt(n){return{tag:"defaultedThunk",process:n}}function Tt(n){return kt(w(n))}function Ct(){return{tag:"option",process:{}}}function Et(n){return{tag:"mergeWithThunk",process:n}}function Dt(n){return a(n)&&100<st(n).length?" removed due to size":JSON.stringify(n,null,2)}function Mt(n,e){return eo([{path:n,getErrorInfo:e}])}function _t(t){return{extract:function(e,n){return oo(t(n),function(n){return Mt(e,w(n))})},toString:w("val")}}function Rt(n,e,t,o){return o(_e(n,e).getOrThunk(function(){return t(n)}))}function Ft(e,t,o,r,i){function u(n){return i.extract(t.concat([r]),n)}function n(n){return n.fold(function(){return no(mn.none())},function(n){var e=i.extract(t.concat([r]),n);return ro(e,mn.some)})}var c,a,s,f,l,d;switch(e.tag){case"required":return s=t,d=u,_e(f=o,l=r).fold(function(){return n=l,e=f,Mt(s,function(){return'Could not find valid *required* value for "'+n+'" in '+Dt(e)});var n,e},d);case"defaultedThunk":return Rt(o,r,e.process,u);case"option":return n(_e(o,r));case"defaultedOptionThunk":return a=e.process,n(_e(c=o,r).map(function(n){return!0===n?a(c):n}));case"mergeWithThunk":return Rt(o,r,w({}),function(n){return u(co(e.process(o),n))})}}function It(n){var s=lo(n),f=_(n,function(t,n){return wt(n,function(n){var e;return co(t,((e={})[n]=!0,e))},w(t))},{});return{extract:function(n,e){var t,o,r,i,u,c,a=E(d(e)?[]:st((r=l,i=o={},u=function(n,e){i[e]=n},c=Y,Ee(e,function(n,e){(r(n,e)?u:c)(n,e)}),o)),function(n){return!Re(f,n)});return 0===a.length?s.extract(n,e):(t=a,Mt(n,function(){return"There are unsupported fields: ["+t.join(", ")+"] specified"}))},toString:s.toString}}function Vt(c,a){return{extract:function(t,o){var r,n,i,e=st(o),u=(i=_t(c),r=t,n=Z(e,function(n,e){return i.extract(r.concat(["["+e+"]"]),n)}),so(n));return to(u,function(n){var e=Z(n,function(n){return xt(n,n,Ot(),a)});return lo(e).extract(t,o)})},toString:function(){return"setOf("+a.toString()+")"}}}function Bt(e,c){return{extract:function(i,u){return _e(u,e).fold(function(){return n=e,Mt(i,function(){return'Choice schema did not contain choice key: "'+n+'"'});var n},function(n){return t=i,e=u,_e(o=c,r=n).fold(function(){return n=o,e=r,Mt(t,function(){return'The chosen schema: "'+e+'" did not exist in branches: '+Dt(n)});var n,e},function(n){return n.extract(t.concat(["branch: "+r]),e)});var t,e,o,r})},toString:function(){return"chooseOn("+e+"). Possible values: "+st(c)}}}function At(e){return _t(function(n){return e(n).fold(eo,no)})}function Nt(e,n){return Vt(function(n){return e(n).fold(yt,bt)},n)}function Ht(n,e,t){return Zt((r=e.extract([n],o=t),io(r,function(n){return{input:o,errors:n}})));var o,r}function Pt(n){return n.fold(function(n){throw new Error(po(n))},K)}function zt(n,e,t){return Pt(Ht(n,e,t))}function jt(n,e){return Bt(n,De(e,lo))}function Lt(n){return ho(n,n,Ot(),mo())}function $t(n,e){return ho(n,n,Ot(),e)}function Gt(n,e){return ho(n,n,Ot(),lo(e))}function Ut(n){return ho(n,n,Ct(),mo())}function Wt(n,e){return ho(n,n,Ct(),e)}function Xt(n,e){return Wt(n,lo(e))}function qt(n,e){return Wt(n,It(e))}function Yt(n,e){return ho(n,n,Tt(e),mo())}function Kt(n,e,t){return ho(n,n,Tt(e),t)}(We=Ue={})[We.Error=0]="Error",We[We.Value=1]="Value";function Jt(u){if(!D(u))throw new Error("cases must be an array");if(0===u.length)throw new Error("there must be at least one case");var c=[],t={};return M(u,function(n,o){var e=st(n);if(1!==e.length)throw new Error("one and only one name per case");var r=e[0],i=n[r];if(void 0!==t[r])throw new Error("duplicate key detected:"+r);if("cata"===r)throw new Error("cannot have a case named cata (sorry)");if(!D(i))throw new Error("case arguments must be an array");c.push(r),t[r]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var e=t.length;if(e!==i.length)throw new Error("Wrong number of arguments to case "+r+". Expected "+i.length+" ("+i+"), got "+e);return{fold:function(){for(var n=[],e=0;e<arguments.length;e++)n[e]=arguments[e];if(n.length!==u.length)throw new Error("Wrong number of arguments to fold. Expected "+u.length+", got "+n.length);return n[o].apply(null,t)},match:function(n){var e=st(n);if(c.length!==e.length)throw new Error("Wrong number of arguments to match. Expected: "+c.join(",")+"\nActual: "+e.join(","));if(!A(c,function(n){return T(e,n)}))throw new Error("Not all branches were specified when using match. Specified: "+e.join(", ")+"\nRequired: "+c.join(", "));return n[r].apply(null,t)},log:function(n){console.log(n,{constructors:c,constructor:r,params:t})}}}}),t}var Qt,Zt=function(n){return vt(n,ht.error,ht.value)},no=bt,eo=yt,to=function(n,e){return n.stype===Ue.Value?e(n.svalue):n},oo=function(n,e){return n.stype===Ue.Error?e(n.serror):n},ro=function(n,e){return n.stype===Ue.Value?{stype:Ue.Value,svalue:e(n.svalue)}:n},io=function(n,e){return n.stype===Ue.Error?{stype:Ue.Error,serror:e(n.serror)}:n},uo=vt,co=St(function(n,e){return a(n)&&a(e)?co(n,e):e}),ao=St(function(n,e){return e}),so=function(n){var e,t,o=(e=[],t=[],M(n,function(n){vt(n,function(n){return t.push(n)},function(n){return e.push(n)})}),{values:e,errors:t});return 0<o.errors.length?i(eo,V)(o.errors):no(o.values)},fo=_t(no),lo=function(t){return{extract:function(i,u){for(var c={},a=[],n=0,e=t;n<e.length;n++)wt(e[n],function(n,e,t,o){var r=Ft(t,i,u,n,o);uo(r,function(n){a.push.apply(a,n)},function(n){c[e]=n})},function(n,e){c[n]=e(u)});return 0<a.length?eo(a):no(c)},toString:function(){return"obj{\n"+Z(t,function(n){return wt(n,function(n,e,t,o){return n+" -> "+o.toString()},function(n,e){return"state("+n+")"})}).join("\n")+"}"}}},mo=w(fo),go=(Qt=m,_t(function(n){var e=typeof n;return Qt(n)?no(n):eo("Expected type: function but got: "+e)})),po=function(n){return"Errors: \n"+Z(10<(e=n.errors).length?e.slice(0,10).concat([{path:[],getErrorInfo:w("... (only showing first ten failures)")}]):e,function(n){return"Failed path: ("+n.path.join(" > ")+")\n"+n.getErrorInfo()}).join("\n")+"\n\nInput object: "+Dt(n.input);var e},ho=xt,vo=function(n,e){return{tag:"custom",newKey:n,instantiator:e}},bo=[Lt("alpha"),Lt("omega")];function yo(n,e){return(t={})[n]=e,t;var t}function xo(n){return e={},M(n,function(n){e[n.key]=n.value}),e;var e}function wo(n,e,t){return void 0===t&&(t=o),n.exists(function(n){return t(n,e)})}function So(n){for(var e=[],t=function(n){e.push(n)},o=0;o<n.length;o++)n[o].each(t);return e}function Oo(n){return m(n)?n:S}function ko(n,e){return un(n.element,e.event.target)}function To(n){if(!Re(n,"can")&&!Re(n,"abort")&&!Re(n,"run"))throw new Error("EventHandler defined by: "+JSON.stringify(n,null,2)+" does not have can, abort, or run!");return y(y({},Xo),n)}function Co(n,e){return{key:n,value:To({abort:e})}}function Eo(n,e){return{key:n,value:To({run:e})}}function Do(n,t,o){return{key:n,value:To({run:function(n,e){t.apply(void 0,[n,e].concat(o))}})}}function Mo(n){return function(t){return{key:n,value:To({run:function(n,e){ko(n,e)&&t(n,e)}})}}}function _o(n,e,t){var i,o,r=e.partUids[t];return o=r,Eo(i=n,function(n,r){n.getSystem().getByUid(o).each(function(n){var e=n.element,t=i,o=r;n.getSystem().triggerEvent(t,e,o.event)})})}function Ro(n){return Eo(n,function(n,e){e.cut()})}function Fo(n,e){var t=n.toString(),o=t.indexOf(")")+1,r=t.indexOf("("),i=t.substring(r+1,o-1).split(/,\s*/);return n.toFunctionAnnotation=function(){return{name:e,parameters:Zo(i)}},n}function Io(n){return{classes:f(n.classes)?[]:n.classes,attributes:f(n.attributes)?{}:n.attributes,styles:f(n.styles)?{}:n.styles}}function Vo(t,o,r){return Jo(function(n,e){r(n,t,o)})}function Bo(n){return{key:n,value:void 0}}function Ao(n){var e=zt("Creating behaviour: "+n.name,rr,n),t=e.fields,o=e.name,r=e.active,i=e.apis,u=e.extra,c=e.state,a=It(t),s=Xt(o,[qt("config",t)]);return nr(a,s,o,r,i,u,c)}function No(n){var e=n;return{get:function(){return e},set:function(n){e=n}}}function Ho(n){return n.dom.focus()}function Po(n){return n.dom.blur()}function zo(n){return void 0===n&&(n=fe.fromDom(document)),mn.from(n.dom.activeElement).map(fe.fromDom)}function jo(e){return zo(tt(e)).filter(function(n){return e.dom.contains(n.dom)})}function Lo(n){return n.dom.innerHTML}function $o(n){if(Se(n))return"#shadow-root";var e=fe.fromDom(n.dom.cloneNode(!1)),t=fe.fromTag("div"),o=fe.fromDom(e.dom.cloneNode(!0));return Qe(t,o),Lo(t)}Jt([{bothErrors:["error1","error2"]},{firstError:["error1","value2"]},{secondError:["value1","error2"]},{bothValues:["value1","value2"]}]);var Go,Uo,Wo,Xo={can:x,abort:S,run:Y},qo=xo,Yo=Mo(re()),Ko=Mo(ie()),Jo=Mo(oe()),Qo=(Go=Zn(),function(n){return Eo(Go,n)}),Zo=function(n){return Z(n,function(n){return 0,e=n.length-"/*".length,n.length>="/*".length&&"/*"===n.substr(e,e+"/*".length)?n.substring(0,n.length-"/*".length):n;var e})},nr=function(t,n,l,i,e,o,r){function u(n){return Re(n,l)?n[l]():mn.none()}var c=De(e,function(n,e){return r=l,t=function(t){for(var n=[],e=1;e<arguments.length;e++)n[e-1]=arguments[e];var o=[t].concat(n);return t.config({name:w(r)}).fold(function(){throw new Error("We could not find any behaviour configuration for: "+r+". Using API: "+u)},function(n){var e=Array.prototype.slice.call(o,1);return i.apply(void 0,[t,n.config,n.state].concat(e))})},o=u=e,c=(i=n).toString(),a=c.indexOf(")")+1,s=c.indexOf("("),f=c.substring(s+1,a-1).split(/,\s*/),t.toFunctionAnnotation=function(){return{name:o,parameters:Zo(f.slice(0,1).concat(f.slice(3)))}},t;var r,i,u,t,o,c,a,s,f}),a=De(o,Fo),s=y(y(y({},a),c),{revoke:J(Bo,l),config:function(n){var e=zt(l+"-config",t,n);return{key:l,value:{config:e,me:s,configAsRaw:k(function(){return zt(l+"-config",t,n)}),initialConfig:n,state:r}}},schema:w(n),exhibit:function(n,t){return e=u(n),o=_e(i,"exhibit"),r=function(n,e){return e(t,n.config,n.state)},(e.isSome()&&o.isSome()?mn.some(r(e.getOrDie(),o.getOrDie())):mn.none()).getOrThunk(function(){return Io({})});var e,o,r},name:w(l),handlers:function(n){return u(n).map(function(n){return _e(i,"events").getOr(function(){return{}})(n.config,n.state)}).getOr({})}});return s},er={init:function(){return tr({readState:w("No State required")})}},tr=function(n){return n},or=xo,rr=It([Lt("fields"),Lt("name"),Yt("active",{}),Yt("apis",{}),Yt("state",er),Yt("extra",{})]),ir=It([Lt("branchKey"),Lt("branches"),Lt("name"),Yt("active",{}),Yt("apis",{}),Yt("state",er),Yt("extra",{})]),ur=w(void 0),cr=Ao({fields:bo,name:"swapping",apis:mt}),ar=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),sr=tinymce.util.Tools.resolve("tinymce.ThemeManager"),fr=[{title:"Headings",items:[{title:"Heading 1",format:"h1"},{title:"Heading 2",format:"h2"},{title:"Heading 3",format:"h3"},{title:"Heading 4",format:"h4"},{title:"Heading 5",format:"h5"},{title:"Heading 6",format:"h6"}]},{title:"Inline",items:[{title:"Bold",icon:"bold",format:"bold"},{title:"Italic",icon:"italic",format:"italic"},{title:"Underline",icon:"underline",format:"underline"},{title:"Strikethrough",icon:"strikethrough",format:"strikethrough"},{title:"Superscript",icon:"superscript",format:"superscript"},{title:"Subscript",icon:"subscript",format:"subscript"},{title:"Code",icon:"code",format:"code"}]},{title:"Blocks",items:[{title:"Paragraph",format:"p"},{title:"Blockquote",format:"blockquote"},{title:"Div",format:"div"},{title:"Pre",format:"pre"}]},{title:"Alignment",items:[{title:"Left",icon:"alignleft",format:"alignleft"},{title:"Center",icon:"aligncenter",format:"aligncenter"},{title:"Right",icon:"alignright",format:"alignright"},{title:"Justify",icon:"alignjustify",format:"alignjustify"}]}],lr=["undo","bold","italic","link","image","bullist","styleselect"],dr="formatChanged",mr="orientationChanged",gr="dropupDismissed",pr=Object.freeze({__proto__:null,events:function(o){return qo([Eo(Qn(),function(r,n){var e,i=o.channels,t=st(i),u=n;M((e=u).universal?t:E(t,function(n){return T(e.channels,n)}),function(n){var e=i[n],t=e.schema,o=zt("channel["+n+"] data\nReceiver: "+$o(r.element),t,u.data);e.onReceive(r,o)})})])}}),hr="unknown";function vr(e,n,t){var o,r,i,u;switch(_e(br.get(),e).orThunk(function(){return z(st(br.get()),function(n){return-1<e.indexOf(n)?mn.some(br.get()[n]):mn.none()})}).getOr(Uo.NORMAL)){case Uo.NORMAL:return t(xr());case Uo.LOGGING:var c=(o=e,r=n,i=[],u=(new Date).getTime(),{logEventCut:function(n,e,t){i.push({outcome:"cut",target:e,purpose:t})},logEventStopped:function(n,e,t){i.push({outcome:"stopped",target:e,purpose:t})},logNoParent:function(n,e,t){i.push({outcome:"no-parent",target:e,purpose:t})},logEventNoHandlers:function(n,e){i.push({outcome:"no-handlers-left",target:e})},logEventResponse:function(n,e,t){i.push({outcome:"response",purpose:t,target:e})},write:function(){var n=(new Date).getTime();T(["mousemove","mouseover","mouseout",oe()],o)||console.log(o,{event:o,time:n-u,target:r.dom,sequence:Z(i,function(n){return T(["cut","stopped","response"],n.outcome)?"{"+n.purpose+"} "+n.outcome+" at ("+$o(n.target)+")":n.outcome})})}}),a=t(c);return c.write(),a;case Uo.STOP:return!0}}(Wo=Uo={})[Wo.STOP=0]="STOP",Wo[Wo.NORMAL=1]="NORMAL",Wo[Wo.LOGGING=2]="LOGGING";var br=No({}),yr=["alloy/data/Fields","alloy/debugging/Debugging"],xr=w({logEventCut:Y,logEventStopped:Y,logNoParent:Y,logEventNoHandlers:Y,logEventResponse:Y,write:Y}),wr=w([Lt("menu"),Lt("selectedMenu")]),Sr=w([Lt("item"),Lt("selectedItem")]);function Or(n,e,t){return void 0!==(o=new Error).stack&&F(o.stack.split("\n"),function(e){return 0<e.indexOf("alloy")&&!C(yr,function(n){return-1<e.indexOf(n)})}).getOr(hr),ho(e,e,t,At(function(t){return ht.value(function(){for(var n=[],e=0;e<arguments.length;e++)n[e]=arguments[e];return t.apply(void 0,n)})}));var o}function kr(n){return Or(0,n,Tt(Y))}function Tr(n){return Or(0,n,Tt(mn.none))}function Cr(n){return Or(0,n,Ot())}function Er(n){return Or(0,n,Ot())}function Dr(n,e){return vo(n,w(e))}function Mr(n){return vo(n,K)}function _r(n,e,t){var o=e.aria;o.update(n,o,t.get())}function Rr(e,n,t){n.toggleClass.each(function(n){(t.get()?je:Le)(e.element,n)})}function Fr(n,e,t){Qr(n,e,t,!t.get())}function Ir(n,e,t){t.set(!0),Rr(n,e,t),_r(n,e,t)}function Vr(n,e,t){t.set(!1),Rr(n,e,t),_r(n,e,t)}function Br(n,e,t){Qr(n,e,t,e.selected)}function Ar(t,o){return ti.config({channels:yo(dr,{onReceive:function(n,e){e.command===t&&o(n,e.state)}})})}function Nr(n){return ti.config({channels:yo(mr,{onReceive:n})})}function Hr(n,e){return{key:n,value:{onReceive:e}}}function Pr(){function n(n,e){e.stop(),q(n)}return[Eo(Un(),n),Eo(ee(),n),Ro(Vn()),Ro(Nn())]}function zr(n,e){e.ignore||(Ho(n.element),e.onFocus(n))}function jr(n){return void 0!==n.style&&m(n.style.getPropertyValue)}function Lr(n,e,t){if(!r(t))throw console.error("Invalid call to CSS.set. Property ",e,":: Value ",t,":: Element ",n),new Error("CSS value must be a string: "+t);jr(n)&&n.style.setProperty(e,t)}function $r(n,e,t){Lr(n.dom,e,t)}function Gr(n,e){var t=n.dom;Ee(e,function(n,e){Lr(t,e,n)})}function Ur(n,e){var t=n.dom,o=window.getComputedStyle(t).getPropertyValue(e);return""!==o||rt(n)?o:li(t,e)}function Wr(n,e){var t=n.dom,o=li(t,e);return mn.from(o).filter(function(n){return 0<n.length})}function Xr(n,e){var t,o=e;jr(t=n.dom)&&t.style.removeProperty(o),wo(Ae(n,"style").map(yn),"")&&He(n,"style")}function qr(n){return n.dom.offsetWidth}function Yr(o,r){function n(n){var e=r(n);if(e<=0||null===e){var t=Ur(n,o);return parseFloat(t)||0}return e}function i(r,n){return R(n,function(n,e){var t=Ur(r,e),o=void 0===t?0:parseInt(t,10);return isNaN(o)?n:n+o},0)}return{set:function(n,e){if(!g(e)&&!e.match(/^[0-9]+$/))throw new Error(o+".set accepts only positive integer values. Value was "+e);var t=n.dom;jr(t)&&(t.style[o]=e+"px")},get:n,getOuter:n,aggregate:i,max:function(n,e,t){var o=i(n,t);return o<e?e-o:0}}}function Kr(n){return di.get(n)}function Jr(n,e){return on(e,n)}w(lo(Sr().concat(wr())));function Qr(n,e,t,o){(o?Ir:Vr)(n,e,t)}function Zr(n,e,t){Ie(n.element,"aria-expanded",t)}var ni=w(lo(Sr())),ei=w(Gt("initSize",[Lt("numColumns"),Lt("numRows")])),ti=Ao({fields:[$t("channels",Nt(ht.value,It([Cr("onReceive"),Yt("schema",mo())])))],name:"receiving",active:pr}),oi=Object.freeze({__proto__:null,onLoad:Br,toggle:Fr,isOn:function(n,e,t){return t.get()},on:Ir,off:Vr,set:Qr}),ri=Object.freeze({__proto__:null,exhibit:function(){return Io({})},events:function(n,e){var t,o,r,i=(t=n,o=e,r=Fr,Qo(function(n){r(n,t,o)})),u=Vo(n,e,Br);return qo(V([n.toggleOnExecute?[i]:[],[u]]))}}),ii=Ao({fields:[Yt("selected",!1),Ut("toggleClass"),Yt("toggleOnExecute",!0),Kt("aria",{mode:"none"},jt("mode",{pressed:[Yt("syncWithExpanded",!1),Dr("update",function(n,e,t){Ie(n.element,"aria-pressed",t),e.syncWithExpanded&&Zr(n,0,t)})],checked:[Dr("update",function(n,e,t){Ie(n.element,"aria-checked",t)})],expanded:[Dr("update",Zr)],selected:[Dr("update",function(n,e,t){Ie(n.element,"aria-selected",t)})],none:[Dr("update",Y)]}))],name:"toggling",active:ri,apis:oi,state:{init:function(){var e=No(!1);return{get:function(){return e.get()},set:function(n){return e.set(n)},clear:function(){return e.set(!1)},readState:function(){return e.get()}}}}}),ui="tinymce-mobile",ci=function(n){return ui+"-"+n},ai=Object.freeze({__proto__:null,focus:zr,blur:function(n,e){e.ignore||Po(n.element)},isFocused:function(n){return e=n.element,t=tt(e).dom,e.dom===t.activeElement;var e,t}}),si=Object.freeze({__proto__:null,exhibit:function(n,e){return Io(e.ignore?{}:{attributes:{tabindex:"-1"}})},events:function(t){return qo([Eo(Yn(),function(n,e){zr(n,t),e.stop()})].concat(t.stopMousedown?[Eo(Nn(),function(n,e){e.event.prevent()})]:[]))}}),fi=Ao({fields:[kr("onFocus"),Yt("stopMousedown",!1),Yt("ignore",!1)],name:"focusing",active:si,apis:ai}),li=function(n,e){return jr(n)?n.style.getPropertyValue(e):""},di=Yr("height",function(n){var e=n.dom;return rt(n)?e.getBoundingClientRect().height:e.offsetHeight});function mi(n,e,t,o,r){return n(t,o)?mn.some(t):m(r)&&r(t)?mn.none():e(t,o,r)}function gi(n,e,t){for(var o=n.dom,r=m(t)?t:S;o.parentNode;){var o=o.parentNode,i=fe.fromDom(o);if(e(i))return mn.some(i);if(r(i))break}return mn.none()}function pi(n,e,t){return gi(n,function(n){return en(n,e)},t)}function hi(n,e){return rn(e,n)}function vi(n,e,t){return mi(en,pi,n,e,t)}function bi(n,e,t){var o=N(n.slice(0,e)),r=N(n.slice(e+1));return F(o.concat(r),t)}function yi(n,e,t){return F(N(n.slice(0,e)),t)}function xi(n,e,t){var o=n.slice(0,e);return F(n.slice(e+1).concat(o),t)}function wi(n,e,t){return F(n.slice(e+1),t)}function Si(t){return function(n){var e=n.raw;return T(t,e.which)}}function Oi(n){return function(e){return A(n,function(n){return n(e)})}}function ki(n){return!0===n.raw.shiftKey}function Ti(n){return!0===n.raw.ctrlKey}function Ci(n,e){return{matches:n,classification:e}}function Ei(n,e,t,o){var r=n+e;return o<r?t:r<t?o:r}function Di(n,e,t){return Math.min(Math.max(n,e),t)}function Mi(t,o,n,r){M(Jr(t.element,"."+o.highlightClass),function(e){C(r,function(n){return n.element===e})||(Le(e,o.highlightClass),t.getSystem().getByDom(e).each(function(n){o.onDehighlight(t,n),W(n,ae())}))})}function _i(n,e,t,o){Mi(n,e,0,[o]),Bi(0,e,0,o)||(je(o.element,e.highlightClass),e.onHighlight(n,o),W(o,ce()))}function Ri(t,e,n,o){var r=Jr(t.element,"."+e.itemClass);return I(r,function(n){return $e(n,e.highlightClass)}).bind(function(n){var e=Ei(n,o,0,r.length-1);return t.getSystem().getByDom(r[e]).toOptional()})}function Fi(n,e,t){e.exists(function(e){return t.exists(function(n){return un(n,e)})})||X(n,ue(),{prevFocus:e,newFocus:t})}function Ii(){function o(n){return jo(n.element)}return{get:o,set:function(n,e){var t=o(n);n.getSystem().triggerFocus(e,n.element),Fi(n,t,o(n))}}}function Vi(){function r(n){return Qi.getHighlighted(n).map(function(n){return n.element})}return{get:r,set:function(e,n){var t=r(e);e.getSystem().getByDom(n).fold(Y,function(n){Qi.highlight(e,n)});var o=r(e);Fi(e,t,o)}}}function Bi(n,e,t,o){return $e(o.element,e.highlightClass)}function Ai(e,n,t){return hi(e.element,"."+n.itemClass).bind(function(n){return e.getSystem().getByDom(n).toOptional()})}function Ni(e,n,t){var o=Jr(e.element,"."+n.itemClass);return(0<o.length?mn.some(o[o.length-1]):mn.none()).bind(function(n){return e.getSystem().getByDom(n).toOptional()})}function Hi(e,n,t){return So(Z(Jr(e.element,"."+n.itemClass),function(n){return e.getSystem().getByDom(n).toOptional()}))}var Pi,zi,ji=[8],Li=[9],$i=[13],Gi=[27],Ui=[32],Wi=[37],Xi=[38],qi=[39],Yi=[40],Ki=Q(ki),Ji=Object.freeze({__proto__:null,dehighlightAll:function(n,e,t){return Mi(n,e,0,[])},dehighlight:function(n,e,t,o){Bi(0,e,0,o)&&(Le(o.element,e.highlightClass),e.onDehighlight(n,o),W(o,ae()))},highlight:_i,highlightFirst:function(e,t,n){Ai(e,t).each(function(n){_i(e,t,0,n)})},highlightLast:function(e,t,n){Ni(e,t).each(function(n){_i(e,t,0,n)})},highlightAt:function(e,t,n,o){var r,i,u;i=o,u=Jr((r=e).element,"."+t.itemClass),mn.from(u[i]).fold(function(){return ht.error(new Error("No element found with index "+i))},r.getSystem().getByDom).fold(function(n){throw n},function(n){_i(e,t,0,n)})},highlightBy:function(e,t,n,o){F(Hi(e,t),o).each(function(n){_i(e,t,0,n)})},isHighlighted:Bi,getHighlighted:function(e,n,t){return hi(e.element,"."+n.highlightClass).bind(function(n){return e.getSystem().getByDom(n).toOptional()})},getFirst:Ai,getLast:Ni,getPrevious:function(n,e,t){return Ri(n,e,0,-1)},getNext:function(n,e,t){return Ri(n,e,0,1)},getCandidates:Hi}),Qi=Ao({fields:[Lt("highlightClass"),Lt("itemClass"),kr("onHighlight"),kr("onDehighlight")],name:"highlighting",apis:Ji});function Zi(n,e,t,o,c){function a(e,t,n,o,r){var i=n(e,t,o,r),u=t.event;return F(i,function(n){return n.matches(u)}).map(function(n){return n.classification}).bind(function(n){return n(e,t,o,r)})}var r={schema:function(){return n.concat([Yt("focusManager",Ii()),Kt("focusInside","onFocus",At(function(n){return T(["onFocus","onEnterOrSpace","onApi"],n)?ht.value(n):ht.error("Invalid value for focusInside")})),Dr("handler",r),Dr("state",e),Dr("sendFocusIn",c)])},processKey:a,toEvents:function(i,u){var n=i.focusInside!==Pi.OnFocusMode?mn.none():c(i).map(function(t){return Eo(Yn(),function(n,e){t(n,i,u),e.stop()})}),e=[Eo(jn(),function(o,r){a(o,r,t,i,u).fold(function(){var e=o,t=r,n=Si(Ui.concat($i))(t.event);i.focusInside===Pi.OnEnterOrSpaceMode&&n&&ko(e,t)&&c(i).each(function(n){n(e,i,u),t.stop()})},function(n){r.stop()})}),Eo(Ln(),function(n,e){a(n,e,o,i,u).each(function(n){e.stop()})})];return qo(n.toArray().concat(e))}};return r}function nu(n){function c(n,e){return 0<Kr(n.visibilitySelector.bind(function(n){return vi(e,n)}).getOr(e))}function e(e,t,n){var o=t,r=E(Jr(e.element,o.selector),function(n){return c(o,n)});mn.from(r[o.firstTabstop]).each(function(n){t.focusManager.set(e,n)})}function o(t,n,r,i){var e,u=Jr(t.element,r.selector);return(e=r).focusManager.get(t).bind(function(n){return vi(n,e.selector)}).bind(function(n){return I(u,J(un,n)).bind(function(n){return e=t,o=r,i(u,n,function(n){return c(e=o,t=n)&&e.useTabstopAt(t);var e,t}).fold(function(){return o.cyclic?mn.some(!0):mn.none()},function(n){return o.focusManager.set(e,n),mn.some(!0)});var e,o})})}var t=[Ut("onEscape"),Ut("onEnter"),Yt("selector",'[data-alloy-tabstop="true"]:not(:disabled)'),Yt("firstTabstop",0),Yt("useTabstopAt",x),Ut("visibilitySelector")].concat([n]),r=w([Ci(Oi([ki,Si(Li)]),function(n,e,t){return o(n,0,t,t.cyclic?bi:yi)}),Ci(Si(Li),function(n,e,t){return o(n,0,t,t.cyclic?xi:wi)}),Ci(Si(Gi),function(e,t,n){return n.onEscape.bind(function(n){return n(e,t)})}),Ci(Oi([Ki,Si($i)]),function(e,t,n){return n.onEnter.bind(function(n){return n(e,t)})})]),i=w([]);return Zi(t,er.init,r,i,function(){return mn.some(e)})}function eu(n){return"input"===le(n)&&"radio"!==Be(n,"type")||"textarea"===le(n)}function tu(n,e,t){return eu(t)&&Si(Ui)(e.event)?mn.none():(nn(n,t,Zn()),mn.some(!0))}function ou(n,e){return mn.some(!0)}function ru(n,e,t){return t.execute(n,e,n.element)}function iu(n){function e(){return t.get().each(n)}var t=No(mn.none());return{clear:function(){e(),t.set(mn.none())},isSet:function(){return t.get().isSome()},get:function(){return t.get()},set:function(n){e(),t.set(mn.some(n))}}}function uu(){var e=iu(function(n){return n.destroy()});return y(y({},e),{run:function(n){return e.get().each(n)}})}function cu(){var e=iu(Y);return y(y({},e),{on:function(n){return e.get().each(n)}})}function au(){var t=cu();return tr({readState:function(){return t.get().map(function(n){return{numRows:String(n.numRows),numColumns:String(n.numColumns)}}).getOr({numRows:"?",numColumns:"?"})},setGridSize:function(n,e){t.set({numRows:n,numColumns:e})},getNumRows:function(){return t.get().map(function(n){return n.numRows})},getNumColumns:function(){return t.get().map(function(n){return n.numColumns})}})}function su(e,t){return function(n){return"rtl"===cc(n)?t:e}}function fu(i){return function(n,e,t,o){var r=i(n.element);return ac(r,n,e,t,o)}}function lu(n,e){return fu(su(n,e))}function du(n,e){return fu(su(e,n))}function mu(r){return function(n,e,t,o){return ac(r,n,e,t,o)}}function gu(n){return!((e=n.dom).offsetWidth<=0&&e.offsetHeight<=0);var e}function pu(n,e,t){var o,r=E(Jr(n,t),gu);return I(o=r,function(n){return un(n,e)}).map(function(n){return{index:n,candidates:o}})}function hu(n,e){return I(n,function(n){return un(e,n)})}function vu(t,n,o,e){return e(Math.floor(n/o),n%o).bind(function(n){var e=n.row*o+n.column;return 0<=e&&e<t.length?mn.some(t[e]):mn.none()})}function bu(r,n,i,u,c){return vu(r,n,u,function(n,e){var t=n===i-1?r.length-n*u:u,o=Ei(e,c,0,t-1);return mn.some({row:n,column:o})})}function yu(r,n,i,u,c){return vu(r,n,u,function(n,e){var t=Ei(n,c,0,i-1),o=Di(e,0,(t===i-1?r.length-t*u:u)-1);return mn.some({row:t,column:o})})}function xu(e,t,n){hi(e.element,t.selector).each(function(n){t.focusManager.set(e,n)})}function wu(r){return function(n,e,t,o){return pu(n,e,t.selector).bind(function(n){return r(n.candidates,n.index,o.getNumRows().getOr(t.initSize.numRows),o.getNumColumns().getOr(t.initSize.numColumns))})}}function Su(n,e,t){return t.captureTab?mn.some(!0):mn.none()}function Ou(n,e,t,i){var u=function(n,e,t){var o,r=Ei(e,i,0,t.length-1);return r===n?mn.none():"button"===le(o=t[r])&&"disabled"===Be(o,"disabled")?u(n,r,t):mn.from(t[r])};return pu(n,t,e).bind(function(n){var e=n.index,t=n.candidates;return u(e,e,t)})}function ku(e,t,o){return(r=o).focusManager.get(e).bind(function(n){return vi(n,r.selector)}).bind(function(n){return o.execute(e,t,n)});var r}function Tu(e,t,n){t.getInitial(e).orThunk(function(){return hi(e.element,t.selector)}).each(function(n){t.focusManager.set(e,n)})}function Cu(n,e,t){return Ou(n,t.selector,e,-1)}function Eu(n,e,t){return Ou(n,t.selector,e,1)}function Du(r){return function(n,e,t,o){return r(n,e,t,o).bind(function(){return t.executeOnMove?ku(n,e,t):mn.some(!0)})}}function Mu(n,e,t){return t.onEscape(n,e)}function _u(n,e,t){return mn.from(n[e]).bind(function(n){return mn.from(n[t]).map(function(n){return{rowIndex:e,columnIndex:t,cell:n}})})}function Ru(n,e,t,o){return _u(n,e,Ei(t,o,0,n[e].length-1))}function Fu(n,e,t,o){var r=Ei(t,o,0,n.length-1);return _u(n,r,Di(e,0,n[r].length-1))}function Iu(n,e,t,o){return _u(n,e,Di(t+o,0,n[e].length-1))}function Vu(n,e,t,o){var r=Di(t+o,0,n.length-1);return _u(n,r,Di(e,0,n[r].length-1))}function Bu(e,t,n){t.previousSelector(e).orThunk(function(){var n=t.selectors;return hi(e.element,n.cell)}).each(function(n){t.focusManager.set(e,n)})}function Au(n,o){return function(e,t,i){var u=i.cycles?n:o;return vi(t,i.selectors.row).bind(function(n){return hu(Jr(n,i.selectors.cell),t).bind(function(o){var r=Jr(e,i.selectors.row);return hu(r,n).bind(function(n){var e,t=(e=i,Z(r,function(n){return Jr(n,e.selectors.cell)}));return u(t,n,o).map(function(n){return n.cell})})})})}}function Nu(e,t,o){return o.focusManager.get(e).bind(function(n){return o.execute(e,t,n)})}function Hu(e,t,n){hi(e.element,t.selector).each(function(n){t.focusManager.set(e,n)})}function Pu(n,e,t){return Ou(n,t.selector,e,-1)}function zu(n,e,t){return Ou(n,t.selector,e,1)}function ju(o,n){return e=o,t={},r=Z(n,function(n){return e=n.name(),t="Cannot configure "+n.name()+" for "+o,ho(e,e,Ct(),_t(function(n){return eo("The field: "+e+" is forbidden. "+t)}));var e,t}).concat([vo("dump",K)]),Kt(e,t,lo(r));var e,t,r}function Lu(n,e){return y(y({},or(e)),n.dump)}function $u(n){return dt(n,"uiType")}function Gu(n){var e=(new Date).getTime();return n+"_"+Math.floor(1e9*Math.random())+ ++Kc+String(e)}function Uu(n){function e(n){return n.name}return n.fold(e,e,e,e)}function Wu(t,o){return function(n){var e=zt("Converting part type",o,n);return t(e)}}(zi=Pi=Pi||{}).OnFocusMode="onFocus",zi.OnEnterOrSpaceMode="onEnterOrSpace",zi.OnApiMode="onApi";var Xu,qu,Yu,Ku,Ju,Qu,Zu,nc,ec,tc,oc=nu(vo("cyclic",S)),rc=nu(vo("cyclic",x)),ic=Zi([Yt("execute",tu),Yt("useSpace",!1),Yt("useEnter",!0),Yt("useControlEnter",!1),Yt("useDown",!1)],er.init,function(n,e,t,o){var r=t.useSpace&&!eu(n.element)?Ui:[],i=t.useEnter?$i:[],u=t.useDown?Yi:[];return[Ci(Si(r.concat(i).concat(u)),ru)].concat(t.useControlEnter?[Ci(Oi([Ti,Si($i)]),ru)]:[])},function(n,e,t,o){return t.useSpace&&!eu(n.element)?[Ci(Si(Ui),ou)]:[]},function(){return mn.none()}),uc=Object.freeze({__proto__:null,flatgrid:au,init:function(n){return n.state(n)}}),cc=function(n){return"rtl"===Ur(n,"direction")?"rtl":"ltr"},ac=function(e,t,n,o,r){return o.focusManager.get(t).bind(function(n){return e(t.element,n,o,r)}).map(function(n){return o.focusManager.set(t,n),!0})},sc=mu,fc=mu,lc=mu,dc=wu(function(n,e,t,o){return bu(n,e,t,o,-1)}),mc=wu(function(n,e,t,o){return bu(n,e,t,o,1)}),gc=wu(function(n,e,t,o){return yu(n,e,t,o,-1)}),pc=wu(function(n,e,t,o){return yu(n,e,t,o,1)}),hc=Zi([Lt("selector"),Yt("execute",tu),Tr("onEscape"),Yt("captureTab",!1),ei()],au,w([Ci(Si(Wi),lu(dc,mc)),Ci(Si(qi),du(dc,mc)),Ci(Si(Xi),sc(gc)),Ci(Si(Yi),fc(pc)),Ci(Oi([ki,Si(Li)]),Su),Ci(Oi([Ki,Si(Li)]),Su),Ci(Si(Gi),function(n,e,t){return t.onEscape(n,e)}),Ci(Si(Ui.concat($i)),function(e,t,o,n){return(r=o).focusManager.get(e).bind(function(n){return vi(n,r.selector)}).bind(function(n){return o.execute(e,t,n)});var r})]),w([Ci(Si(Ui),ou)]),function(){return mn.some(xu)}),vc=[Lt("selector"),Yt("getInitial",mn.none),Yt("execute",tu),Tr("onEscape"),Yt("executeOnMove",!1),Yt("allowVertical",!0)],bc=w([Ci(Si(Ui),ou)]),yc=Zi(vc,er.init,function(n,e,t,o){var r=Wi.concat(t.allowVertical?Xi:[]),i=qi.concat(t.allowVertical?Yi:[]);return[Ci(Si(r),Du(lu(Cu,Eu))),Ci(Si(i),Du(du(Cu,Eu))),Ci(Si($i),ku),Ci(Si(Ui),ku),Ci(Si(Gi),Mu)]},bc,function(){return mn.some(Tu)}),xc=[Gt("selectors",[Lt("row"),Lt("cell")]),Yt("cycles",!0),Yt("previousSelector",mn.none),Yt("execute",tu)],wc=Au(function(n,e,t){return Ru(n,e,t,-1)},function(n,e,t){return Iu(n,e,t,-1)}),Sc=Au(function(n,e,t){return Ru(n,e,t,1)},function(n,e,t){return Iu(n,e,t,1)}),Oc=Au(function(n,e,t){return Fu(n,t,e,-1)},function(n,e,t){return Vu(n,t,e,-1)}),kc=Au(function(n,e,t){return Fu(n,t,e,1)},function(n,e,t){return Vu(n,t,e,1)}),Tc=w([Ci(Si(Wi),lu(wc,Sc)),Ci(Si(qi),du(wc,Sc)),Ci(Si(Xi),sc(Oc)),Ci(Si(Yi),fc(kc)),Ci(Si(Ui.concat($i)),function(e,t,o){return jo(e.element).bind(function(n){return o.execute(e,t,n)})})]),Cc=w([Ci(Si(Ui),ou)]),Ec=Zi(xc,er.init,Tc,Cc,function(){return mn.some(Bu)}),Dc=[Lt("selector"),Yt("execute",tu),Yt("moveOnTab",!1)],Mc=w([Ci(Si(Xi),lc(Pu)),Ci(Si(Yi),lc(zu)),Ci(Oi([ki,Si(Li)]),function(n,e,t,o){return t.moveOnTab?lc(Pu)(n,e,t,o):mn.none()}),Ci(Oi([Ki,Si(Li)]),function(n,e,t,o){return t.moveOnTab?lc(zu)(n,e,t,o):mn.none()}),Ci(Si($i),Nu),Ci(Si(Ui),Nu)]),_c=w([Ci(Si(Ui),ou)]),Rc=Zi(Dc,er.init,Mc,_c,function(){return mn.some(Hu)}),Fc=Zi([Tr("onSpace"),Tr("onEnter"),Tr("onShiftEnter"),Tr("onLeft"),Tr("onRight"),Tr("onTab"),Tr("onShiftTab"),Tr("onUp"),Tr("onDown"),Tr("onEscape"),Yt("stopSpaceKeyup",!1),Ut("focusIn")],er.init,function(n,e,t){return[Ci(Si(Ui),t.onSpace),Ci(Oi([Ki,Si($i)]),t.onEnter),Ci(Oi([ki,Si($i)]),t.onShiftEnter),Ci(Oi([ki,Si(Li)]),t.onShiftTab),Ci(Oi([Ki,Si(Li)]),t.onTab),Ci(Si(Xi),t.onUp),Ci(Si(Yi),t.onDown),Ci(Si(Wi),t.onLeft),Ci(Si(qi),t.onRight),Ci(Si(Ui),t.onSpace),Ci(Si(Gi),t.onEscape)]},function(n,e,t){return t.stopSpaceKeyup?[Ci(Si(Ui),ou)]:[]},function(n){return n.focusIn}),Ic=oc.schema(),Vc=rc.schema(),Bc=yc.schema(),Ac=hc.schema(),Nc=Ec.schema(),Hc=ic.schema(),Pc=Rc.schema(),zc=Fc.schema(),jc=(qu=jt((tc=zt("Creating behaviour: "+(Xu={branchKey:"mode",branches:Object.freeze({__proto__:null,acyclic:Ic,cyclic:Vc,flow:Bc,flatgrid:Ac,matrix:Nc,execution:Hc,menu:Pc,special:zc}),name:"keying",active:{events:function(n,e){return n.handler.toEvents(n,e)}},apis:{focusIn:function(e,t,o){t.sendFocusIn(t).fold(function(){e.getSystem().triggerFocus(e.element,e.element)},function(n){n(e,t,o)})},setGridSize:function(n,e,t,o,r){Re(t,"setGridSize")?t.setGridSize(o,r):console.error("Layout does not support setGridSize")}},state:uc}).name,ir,Xu)).branchKey,tc.branches),Yu=tc.name,Ku=tc.active,Ju=tc.apis,Qu=tc.extra,Zu=tc.state,ec=Xt(Yu,[Wt("config",nc=qu)]),nr(nc,ec,Yu,Ku,Ju,Qu,Zu)),Lc=ju,$c=Lu,Gc="placeholder",Uc=Jt([{single:["required","valueThunk"]},{multiple:["required","valueThunks"]}]),Wc=function(r,i,u,c){return n=r,t=c,($u(e=u)&&e.uiType===Gc?(a=e,s=t,(o=n).exists(function(n){return n!==a.owner})?Uc.single(!0,w(a)):_e(s,a.name).fold(function(){throw new Error("Unknown placeholder component: "+a.name+"\nKnown: ["+st(s)+"]\nNamespace: "+o.getOr("none")+"\nSpec: "+JSON.stringify(a,null,2))},function(n){return n.replace()})):Uc.single(!1,w(e))).fold(function(n,e){var t=$u(u)?e(i,u.config,u.validated):e(i),o=B(_e(t,"components").getOr([]),function(n){return Wc(r,i,n,c)});return[y(y({},t),{components:o})]},function(n,e){if($u(u)){var t=e(i,u.config,u.validated);return u.validated.preprocess.getOr(K)(t)}return e(i)});var n,e,t,o,a,s},Xc=Uc.single,qc=Uc.multiple,Yc=w(Gc),Kc=0,Jc=Jt([{required:["data"]},{external:["data"]},{optional:["data"]},{group:["data"]}]),Qc=Yt("factory",{sketch:K}),Zc=Yt("schema",[]),na=Lt("name"),ea=ho("pname","pname",kt(function(n){return"<alloy."+Gu(n.name)+">"}),mo()),ta=vo("schema",function(){return[Ut("preprocess")]}),oa=Yt("defaults",w({})),ra=Yt("overrides",w({})),ia=lo([Qc,Zc,na,ea,oa,ra]),ua=lo([Qc,Zc,na,oa,ra]),ca=lo([Qc,Zc,na,ea,oa,ra]),aa=lo([Qc,ta,na,Lt("unit"),ea,oa,ra]),sa=Wu(Jc.required,ia);function fa(n,e,t,o){return co(e.defaults(n,t,o),t,{uid:n.partUids[e.name]},e.overrides(n,t,o))}function la(n,e,t){return o=e,r={},i={},M(t,function(n){n.fold(function(o){r[o.pname]=Xc(!0,function(n,e,t){return o.factory.sketch(fa(n,o,e,t))})},function(n){var e=o.parts[n.name];i[n.name]=w(n.factory.sketch(fa(o,n,e[zs()]),e))},function(o){r[o.pname]=Xc(!1,function(n,e,t){return o.factory.sketch(fa(n,o,e,t))})},function(o){r[o.pname]=qc(!0,function(e,n,t){return Z(e[o.name],function(n){return o.factory.sketch(co(o.defaults(e,n,t),n,o.overrides(e,n)))})})})}),{internals:w(r),externals:w(i)};var o,r,i}function da(n,e,t){return o=mn.some(n),i=(r=e).components,s=De(t,function(n,e){return o=n,r=!1,{name:w(t=e),required:function(){return o.fold(function(n,e){return n},function(n,e){return n})},used:function(){return r},replace:function(){if(r)throw new Error("Trying to use the same placeholder more than once: "+t);return r=!0,o}};var t,o,r}),u=o,c=r,a=s,f=B(i,function(n){return Wc(u,c,n,a)}),Ee(s,function(n){if(!1===n.used()&&n.required())throw new Error("Placeholder: "+n.name()+" was not found in components list\nNamespace: "+o.getOr("none")+"\nComponents: "+JSON.stringify(r.components,null,2))}),f;var o,r,i,u,c,a,s,f}function ma(n,e,t){var o=e.partUids[t];return n.getSystem().getByUid(o).toOptional()}function ga(n,e,t){return ma(n,e,t).getOrDie("Could not find part: "+t)}function pa(o){return ho("partUids","partUids",Et(function(n){return e=n.uid,t=Z(o,Uu),xo(Z(t,function(n){return{key:n,value:e+"-"+n}}));var e,t}),mo())}function ha(n){return yo(Ls,n)}function va(o){return n=function(n){for(var e=[],t=1;t<arguments.length;t++)e[t-1]=arguments[t];return o.apply(void 0,u([n.getApis(),n],e,!1))},t=(e=o.toString()).indexOf(")")+1,r=e.indexOf("("),i=e.substring(r+1,t-1).split(/,\s*/),n.toFunctionAnnotation=function(){return{name:"OVERRIDE",parameters:Zo(i.slice(1))}},n;var n,e,t,r,i}function ba(n){var e=Xe(n)?n.dom[Ws]:null;return mn.from(e)}function ya(n,e,t,o,r){var i;return zt(n+" [SpecSchema]",It((i=r,(0<o.length?[Gt("parts",o)]:[]).concat([Lt("uid"),Yt("dom",{}),Yt("components",[]),Mr("originalSpec"),Yt("debug.sketcher",{})]).concat(i)).concat(e)),t)}function xa(n,e,t,o,r){var i=Ys(r),u=ya(n,e,i,B(t,function(n){return n.fold(mn.none,mn.some,mn.none,mn.none).map(function(n){return Gt(n.name,n.schema.concat([Mr(zs())]))}).toArray()}),[pa(t)]),c=la(0,u,t);return o(u,da(n,u,c.internals()),i,c.externals())}function wa(n){var r=zt("Sketcher for "+n.name,Ks,n),e=De(r.apis,va),t=De(r.extraApis,Fo);return y(y({name:r.name,configFields:r.configFields,sketch:function(n){return e=r.name,t=r.configFields,(0,r.factory)(ya(e,t,o=Ys(n),[],[]),o);var e,t,o}},e),t)}function Sa(n){var r,e,i,t=zt("Sketcher for "+n.name,Js,n),o=(r=t.name,e=t.partFields,i={},M(e,function(n){n.fold(mn.some,mn.none,mn.some,mn.some).each(function(t){var o=js(r,t.pname);i[t.name]=function(n){var e=zt("Part: "+t.name+" in "+r,lo(t.schema),n);return y(y({},o),{config:n,validated:e})}})}),i),u=De(t.apis,va),c=De(t.extraApis,Fo);return y(y({name:t.name,partFields:t.partFields,configFields:t.configFields,sketch:function(n){return xa(t.name,t.configFields,t.partFields,t.factory,n)},parts:o},u),c)}function Oa(n){var r,e,t,o,i,u,c=(r={prefix:ui},n.replace(/\$\{([^{}]*)\}/g,function(n,e){var t,o=r[e];return"string"==(t=typeof o)||"number"==t?o.toString():n}));return e=fe.fromHtml(c),t=Je(e),o=R(void 0!==e.dom.attributes?e.dom.attributes:[],function(n,e){var t;return"class"===e.name?n:y(y({},n),((t={})[e.name]=e.value,t))},{}),i=Array.prototype.slice.call(e.dom.classList,0),u=0===t.length?{}:{innerHtml:Lo(e)},y({tag:le(e),classes:i,attributes:o},u)}function ka(n){return{dom:Oa(n)}}function Ta(n){return or([ii.config({toggleClass:ci("toolbar-button-selected"),toggleOnExecute:!1,aria:{mode:"pressed"}}),Ar(n,function(n,e){(e?ii.on:ii.off)(n)})])}function Ca(n,e,t,o){var r=Ta(t);return nf(e,o,r,n)}function Ea(n,e){var t=e.ui.registry.getAll().icons;return mn.from(t[n]).fold(function(){return Oa('<span class="${prefix}-toolbar-button ${prefix}-toolbar-group-item ${prefix}-icon-'+n+' ${prefix}-icon"></span>')},function(n){return Oa('<span class="${prefix}-toolbar-button ${prefix}-toolbar-group-item">'+n+"</span>")})}function Da(e){return Hs({name:e+"-edge",overrides:function(n){return n.model.manager.edgeActions[e].fold(function(){return{}},function(o){return{events:qo([Do(Vn(),function(n,e,t){return o(n,t)},[n]),Do(Nn(),function(n,e,t){return o(n,t)},[n]),Do(Hn(),function(n,e,t){t.mouseIsDown.get()&&o(n,t)},[n])])}})}})}function Ma(n,e,t){e.store.manager.onLoad(n,e,t)}function _a(n,e,t){e.store.manager.onUnload(n,e,t)}function Ra(){var n=No(null);return tr({set:n.set,get:n.get,isNotSet:function(){return null===n.get()},clear:function(){n.set(null)},readState:function(){return{mode:"memory",value:n.get()}}})}function Fa(){var i=No({}),u=No({});return tr({readState:function(){return{mode:"dataset",dataByValue:i.get(),dataByText:u.get()}},lookup:function(n){return _e(i.get(),n).orThunk(function(){return _e(u.get(),n)})},update:function(n){var e=i.get(),t=u.get(),o={},r={};M(n,function(e){_e(o[e.value]=e,"meta").each(function(n){_e(n,"text").each(function(n){r[n]=e})})}),i.set(y(y({},e),o)),u.set(y(y({},t),r))},clear:function(){i.set({}),u.set({})}})}function Ia(n,e,t,o){var r=e.store;t.update([o]),r.setValue(n,o),e.onSetValue(n,o)}function Va(n,e){return vf.set(n,e)}function Ba(n){return vf.get(n)}function Aa(n){var e=n.event.raw;return-1===e.type.indexOf("touch")?void 0!==e.clientX?mn.some(e).map(function(n){return yf(n.clientX,n.clientY)}):mn.none():void 0!==e.touches&&1===e.touches.length?mn.some(e.touches[0]).map(function(n){return yf(n.clientX,n.clientY)}):mn.none()}function Na(n){return n.model.minX}function Ha(n){return n.model.minY}function Pa(n){return n.model.minX-1}function za(n){return n.model.minY-1}function ja(n){return n.model.maxX}function La(n){return n.model.maxY}function $a(n){return n.model.maxX+1}function Ga(n){return n.model.maxY+1}function Ua(n,e,t){return e(n)-t(n)}function Wa(n){return Ua(n,ja,Na)}function Xa(n){return Ua(n,La,Ha)}function qa(n){return Wa(n)/2}function Ya(n){return Xa(n)/2}function Ka(n){return n.stepSize}function Ja(n){return n.snapToGrid}function Qa(n){return n.snapStart}function Za(n){return n.rounded}function ns(n,e){return void 0!==n[e+"-edge"]}function es(n){return ns(n,"left")}function ts(n){return ns(n,"right")}function os(n){return ns(n,"top")}function rs(n){return ns(n,"bottom")}function is(n){return n.model.value.get()}function us(n,e){return{x:n,y:e}}function cs(n,e){X(n,xf(),{value:e})}function as(n,e,t,o){return n<e?n:t<n?t:n===e?e-1:Math.max(e,n-o)}function ss(n,e,t,o){return t<n?n:n<e?e:n===t?t+1:Math.min(t,n+o)}function fs(n,e,t){return Math.max(e,Math.min(t,n))}function ls(n){var e=n.min,t=n.max,o=n.range,r=n.value,i=n.step,u=n.snap,c=n.snapStart,a=n.rounded,s=n.hasMinEdge,f=n.hasMaxEdge,l=n.minBound,d=n.maxBound,m=n.screenRange,g=s?e-1:e,p=f?t+1:t;if(r<l)return g;if(d<r)return p;var h,v,b,y,x,w=fs((x=l,Math.min(d,Math.max(r,x))-x)/m*o+e,g,p);return u&&e<=w&&w<=t?(h=w,v=e,b=t,y=i,c.fold(function(){var n=Math.round((h-v)/y)*y;return fs(v+n,v-1,b+1)},function(n){var e=Math.round((h-n)%y/y),t=Math.floor((h-n)/y),o=Math.floor((b-n)/y),r=Math.min(o,t+e);return Math.max(n,n+r*y)})):a?Math.round(w):w}function ds(n){var e=n.min,t=n.max,o=n.range,r=n.value,i=n.hasMinEdge,u=n.hasMaxEdge,c=n.maxBound,a=n.maxOffset,s=n.centerMinEdge,f=n.centerMaxEdge;return r<e?i?0:s:t<r?u?c:f:(r-e)/o*a}function ms(n){return n.element.dom.getBoundingClientRect()}function gs(n){return ms(n)[wf]}function ps(n){return ms(n).right}function hs(n){return ms(n).top}function vs(n){return ms(n).bottom}function bs(n){return ms(n).width}function ys(n){return ms(n).height}function xs(n,e){var t=ms(n),o=ms(e);return(t[wf]+t.right)/2-o[wf]}function ws(n,e){var t=ms(n),o=ms(e);return(t.top+t.bottom)/2-o.top}function Ss(n,e){X(n,xf(),{value:e})}function Os(n,e,t){return ls({min:Na(e),max:ja(e),range:Wa(e),value:t,step:Ka(e),snap:Ja(e),snapStart:Qa(e),rounded:Za(e),hasMinEdge:es(e),hasMaxEdge:ts(e),minBound:gs(n),maxBound:ps(n),screenRange:bs(n)})}function ks(r){return function(n,e){return Ss(n,{x:o=(0<r?ss:as)(is(t=e).x,Na(t),ja(t),Ka(t))}),mn.some(o).map(x);var t,o}}function Ts(n,e,t,o,r,i){var u,c,a,s,f,l,d,m,g=(c=i,a=t,s=o,f=r,l=bs(u=e),d=s.bind(function(n){return mn.some(xs(n,u))}).getOr(0),m=f.bind(function(n){return mn.some(xs(n,u))}).getOr(l),ds({min:Na(c),max:ja(c),range:Wa(c),value:a,hasMinEdge:es(c),hasMaxEdge:ts(c),minBound:gs(u),minOffset:0,maxBound:ps(u),maxOffset:l,centerMinEdge:d,centerMaxEdge:m}));return gs(e)-gs(n)+g}function Cs(n,e){X(n,xf(),{value:e})}function Es(n,e,t){return ls({min:Ha(e),max:La(e),range:Xa(e),value:t,step:Ka(e),snap:Ja(e),snapStart:Qa(e),rounded:Za(e),hasMinEdge:os(e),hasMaxEdge:rs(e),minBound:hs(n),maxBound:vs(n),screenRange:ys(n)})}function Ds(r){return function(n,e){return Cs(n,{y:o=(0<r?ss:as)(is(t=e).y,Ha(t),La(t),Ka(t))}),mn.some(o).map(x);var t,o}}function Ms(n,e,t,o,r,i){var u,c,a,s,f,l,d,m,g=(c=i,a=t,s=o,f=r,l=ys(u=e),d=s.bind(function(n){return mn.some(ws(n,u))}).getOr(0),m=f.bind(function(n){return mn.some(ws(n,u))}).getOr(l),ds({min:Ha(c),max:La(c),range:Xa(c),value:a,hasMinEdge:os(c),hasMaxEdge:rs(c),minBound:hs(u),minOffset:0,maxBound:vs(u),maxOffset:l,centerMinEdge:d,centerMaxEdge:m}));return hs(e)-hs(n)+g}function _s(n,e){X(n,xf(),{value:e})}function Rs(n,e){return{x:n,y:e}}function Fs(u,c){return function(n,e){return o=e,r=0<u?ss:as,_s(n,Rs(i=(t=c)?is(o).x:r(is(o).x,Na(o),ja(o),Ka(o)),t?r(is(o).y,Ha(o),La(o),Ka(o)):is(o).y)),mn.some(i).map(x);var t,o,r,i}}function Is(e,t,o,n){return nf(t,function(){var n=o();e.setContextToolbar([{label:t+" group",items:n}])},{},n)}function Vs(n,o){var e={onChange:function(n,e,t){o.undoManager.transact(function(){o.formatter.apply("forecolor",{value:t}),o.nodeChanged()})},getInitialValue:w(-1)};return Is(n,"color-levels",function(){return[(r=e,$f.sketch({dom:Oa('<div class="${prefix}-slider ${prefix}-hue-slider-container"></div>'),components:[$f.parts["left-edge"](ka('<div class="${prefix}-hue-slider-black"></div>')),$f.parts.spectrum({dom:Oa('<div class="${prefix}-slider-gradient-container"></div>'),components:[ka('<div class="${prefix}-slider-gradient"></div>')],behaviours:or([ii.config({toggleClass:ci("thumb-active")})])}),$f.parts["right-edge"](ka('<div class="${prefix}-hue-slider-white"></div>')),$f.parts.thumb({dom:Oa('<div class="${prefix}-slider-thumb"></div>'),behaviours:or([ii.config({toggleClass:ci("thumb-active")})])})],onChange:function(n,e,t){var o=i(t.x());$r(e.element,"background-color",o),r.onChange(n,e,o)},onDragStart:function(n,e){ii.on(e)},onDragEnd:function(n,e){ii.off(e)},onInit:function(n,e,t,o){var r=i(o.x());$r(e.element,"background-color",r)},stepSize:10,model:{mode:"x",minX:0,maxX:360,getInitialValue:function(){return{x:r.getInitialValue()}}},sliderBehaviours:or([Nr($f.refresh)])}))];function i(n){return n<0?"black":360<n?"white":"hsl("+n+", 100%, 50%)"}var r},o)}function Bs(n){var e,t,o=n.selection.getStart(),r=fe.fromDom(o),i=fe.fromDom(n.getBody()),u=(e=function(n){return un(i,n)},(Xe(t=r)?mn.some(t):pe(t).filter(Xe)).map(function(n){return mi(function(n,e){return e(n)},gi,n,function(n){return Wr(n,"font-size").isSome()},e).bind(function(n){return Wr(n,"font-size")}).getOrThunk(function(){return Ur(n,"font-size")})}).getOr(""));return F(Gf,function(n){return u===n}).getOr("medium")}function As(n){return[ka('<span class="${prefix}-toolbar-button ${prefix}-icon-small-font ${prefix}-icon"></span>'),(e={onChange:n.onChange,sizes:Xf,category:"font",getInitialValue:n.getInitialValue},r=zt("SizeSlider",Wf,e),$f.sketch({dom:{tag:"div",classes:[ci("slider-"+r.category+"-size-container"),ci("slider"),ci("slider-size-container")]},onChange:function(n,e,t){var o=t.x();0<=o&&o<r.sizes.length&&r.onChange(o)},onDragStart:function(n,e){ii.on(e)},onDragEnd:function(n,e){ii.off(e)},model:{mode:"x",minX:0,maxX:r.sizes.length-1,getInitialValue:function(){return{x:r.getInitialValue()}}},stepSize:1,snapToGrid:!0,sliderBehaviours:or([Nr($f.refresh)]),components:[$f.parts.spectrum({dom:Oa('<div class="${prefix}-slider-size-container"></div>'),components:[ka('<div class="${prefix}-slider-size-line"></div>')]}),$f.parts.thumb({dom:Oa('<div class="${prefix}-slider-thumb"></div>'),behaviours:or([ii.config({toggleClass:ci("thumb-active")})])})]})),ka('<span class="${prefix}-toolbar-button ${prefix}-icon-large-font ${prefix}-icon"></span>')];var e,r}function Ns(n){var e=void 0!==n.uid&&Re(n,"uid")?n.uid:qs("memento");return{get:function(n){return n.getSystem().getByUid(e).getOrDie()},getOpt:function(n){return n.getSystem().getByUid(e).toOptional()},asSpec:function(){return y(y({},n),{uid:e})}}}Wu(Jc.external,ua);var Hs=Wu(Jc.optional,ca),Ps=Wu(Jc.group,aa),zs=w("entirety"),js=function(n,e){return{uiType:Yc(),owner:n,name:e}},Ls=Gu("alloy-premade"),$s=w("alloy-id-"),Gs=w("data-alloy-id"),Us=$s(),Ws=Gs(),Xs=function(n,e){Object.defineProperty(n.dom,Ws,{value:e,writable:!0})},qs=Gu,Ys=function(n){return dt(n,"uid")?n:y(y({},n),{uid:qs("uid")})},Ks=It([Lt("name"),Lt("factory"),Lt("configFields"),Yt("apis",{}),Yt("extraApis",{})]),Js=It([Lt("name"),Lt("factory"),Lt("configFields"),Lt("partFields"),Yt("apis",{}),Yt("extraApis",{})]),Qs=wa({name:"Button",factory:function(n){function t(e){return _e(n.dom,"attributes").bind(function(n){return _e(n,e)})}var e,o=(e=n.action,qo(V([e.map(function(t){return Qo(function(n,e){t(n),e.stop()})}).toArray(),Pr()]))),r=n.dom.tag;return{uid:n.uid,dom:n.dom,components:n.components,events:o,behaviours:$c(n.buttonBehaviours,[fi.config({}),jc.config({mode:"execution",useSpace:!0,useEnter:!0})]),domModification:{attributes:function(){if("button"!==r)return{role:t("role").getOr("button")};var n=t("type").getOr("button"),e=t("role").map(function(n){return{role:n}}).getOr({});return y({type:n},e)}()},eventOrder:n.eventOrder}},configFields:[Yt("uid",void 0),Lt("dom"),Yt("components",[]),Lc("buttonBehaviours",[fi,jc]),Ut("action"),Ut("role"),Yt("eventOrder",{})]}),Zs=Ao({fields:[],name:"unselecting",active:Object.freeze({__proto__:null,events:function(){return qo([Co(Xn(),x)])},exhibit:function(){return Io({styles:{"-webkit-user-select":"none","user-select":"none","-ms-user-select":"none","-moz-user-select":"-moz-none"},attributes:{unselectable:"on"}})}})}),nf=function(n,e,t,o){return Qs.sketch({dom:Ea(n,o),action:e,buttonBehaviours:co(or([Zs.config({})]),t)})},ef=Hs({schema:[Lt("dom")],name:"label"}),tf=Da("top-left"),of=Da("top"),rf=Da("top-right"),uf=Da("right"),cf=Da("bottom-right"),af=Da("bottom"),sf=Da("bottom-left"),ff=[ef,Da("left"),uf,of,af,tf,rf,sf,cf,sa({name:"thumb",defaults:w({dom:{styles:{position:"absolute"}}}),overrides:function(n){return{events:qo([_o(Vn(),n,"spectrum"),_o(Bn(),n,"spectrum"),_o(An(),n,"spectrum"),_o(Nn(),n,"spectrum"),_o(Hn(),n,"spectrum"),_o(Pn(),n,"spectrum")])}}}),sa({schema:[vo("mouseIsDown",function(){return No(!1)})],name:"spectrum",overrides:function(t){function o(e,n){return r.getValueFromEvent(n).map(function(n){return r.setValueFrom(e,t,n)})}var r=t.model.manager;return{behaviours:or([jc.config({mode:"special",onLeft:function(n){return r.onLeft(n,t)},onRight:function(n){return r.onRight(n,t)},onUp:function(n){return r.onUp(n,t)},onDown:function(n){return r.onDown(n,t)}}),fi.config({})]),events:qo([Eo(Vn(),o),Eo(Bn(),o),Eo(Nn(),o),Eo(Hn(),function(n,e){t.mouseIsDown.get()&&o(n,e)})])}}})],lf=Object.freeze({__proto__:null,onLoad:Ma,onUnload:_a,setValue:function(n,e,t,o){e.store.manager.setValue(n,e,t,o)},getValue:function(n,e,t){return e.store.manager.getValue(n,e,t)},getState:function(n,e,t){return t}}),df=Object.freeze({__proto__:null,events:function(t,o){var n=t.resetOnDom?[Yo(function(n,e){Ma(n,t,o)}),Ko(function(n,e){_a(n,t,o)})]:[Vo(t,o,Ma)];return qo(n)}}),mf=Object.freeze({__proto__:null,memory:Ra,dataset:Fa,manual:function(){return tr({readState:Y})},init:function(n){return n.store.manager.state(n)}}),gf=[Ut("initialValue"),Lt("getFallbackEntry"),Lt("getDataKey"),Lt("setValue"),Dr("manager",{setValue:Ia,getValue:function(n,e,t){var o=e.store,r=o.getDataKey(n);return t.lookup(r).getOrThunk(function(){return o.getFallbackEntry(r)})},onLoad:function(e,t,o){t.store.initialValue.each(function(n){Ia(e,t,o,n)})},onUnload:function(n,e,t){t.clear()},state:Fa})],pf=[Lt("getValue"),Yt("setValue",Y),Ut("initialValue"),Dr("manager",{setValue:function(n,e,t,o){e.store.setValue(n,o),e.onSetValue(n,o)},getValue:function(n,e,t){return e.store.getValue(n)},onLoad:function(e,t,n){t.store.initialValue.each(function(n){t.store.setValue(e,n)})},onUnload:Y,state:er.init})],hf=Ao({fields:[Kt("store",{mode:"memory"},jt("mode",{memory:[Ut("initialValue"),Dr("manager",{setValue:function(n,e,t,o){t.set(o),e.onSetValue(n,o)},getValue:function(n,e,t){return t.get()},onLoad:function(n,e,t){e.store.initialValue.each(function(n){t.isNotSet()&&t.set(n)})},onUnload:function(n,e,t){t.clear()},state:Ra})],manual:pf,dataset:gf})),kr("onSetValue"),Yt("resetOnDom",!1)],name:"representing",active:df,apis:lf,extra:{setValueFrom:function(n,e){var t=hf.getValue(e);hf.setValue(n,t)}},state:mf}),vf=Yr("width",function(n){return n.dom.offsetWidth}),bf=function(t,o){return{left:t,top:o,translate:function(n,e){return bf(t+n,o+e)}}},yf=bf,xf=w("slider.change.value"),wf="left",Sf=ks(-1),Of=ks(1),kf=mn.none,Tf=mn.none,Cf={"top-left":mn.none(),top:mn.none(),"top-right":mn.none(),right:mn.some(function(n,e){cs(n,{x:$a(e)})}),"bottom-right":mn.none(),bottom:mn.none(),"bottom-left":mn.none(),left:mn.some(function(n,e){cs(n,{x:Pa(e)})})},Ef=Object.freeze({__proto__:null,setValueFrom:function(n,e,t){var o=Os(n,e,t);return Ss(n,{x:o}),o},setToMin:function(n,e){Ss(n,{x:Na(e)})},setToMax:function(n,e){Ss(n,{x:ja(e)})},findValueOfOffset:Os,getValueFromEvent:function(n){return Aa(n).map(function(n){return n.left})},findPositionOfValue:Ts,setPositionFromValue:function(n,e,t,o){var r=is(t),i=Ts(n,o.getSpectrum(n),r.x,o.getLeftEdge(n),o.getRightEdge(n),t),u=Ba(e.element)/2;$r(e.element,"left",i-u+"px")},onLeft:Sf,onRight:Of,onUp:kf,onDown:Tf,edgeActions:Cf}),Df=mn.none,Mf=mn.none,_f=Ds(-1),Rf=Ds(1),Ff={"top-left":mn.none(),top:mn.some(function(n,e){cs(n,{y:za(e)})}),"top-right":mn.none(),right:mn.none(),"bottom-right":mn.none(),bottom:mn.some(function(n,e){cs(n,{y:Ga(e)})}),"bottom-left":mn.none(),left:mn.none()},If=Object.freeze({__proto__:null,setValueFrom:function(n,e,t){var o=Es(n,e,t);return Cs(n,{y:o}),o},setToMin:function(n,e){Cs(n,{y:Ha(e)})},setToMax:function(n,e){Cs(n,{y:La(e)})},findValueOfOffset:Es,getValueFromEvent:function(n){return Aa(n).map(function(n){return n.top})},findPositionOfValue:Ms,setPositionFromValue:function(n,e,t,o){var r=is(t),i=Ms(n,o.getSpectrum(n),r.y,o.getTopEdge(n),o.getBottomEdge(n),t),u=Kr(e.element)/2;$r(e.element,"top",i-u+"px")},onLeft:Df,onRight:Mf,onUp:_f,onDown:Rf,edgeActions:Ff}),Vf=Aa,Bf=Fs(-1,!1),Af=Fs(1,!1),Nf=Fs(-1,!0),Hf=Fs(1,!0),Pf={"top-left":mn.some(function(n,e){cs(n,us(Pa(e),za(e)))}),top:mn.some(function(n,e){cs(n,us(qa(e),za(e)))}),"top-right":mn.some(function(n,e){cs(n,us($a(e),za(e)))}),right:mn.some(function(n,e){cs(n,us($a(e),Ya(e)))}),"bottom-right":mn.some(function(n,e){cs(n,us($a(e),Ga(e)))}),bottom:mn.some(function(n,e){cs(n,us(qa(e),Ga(e)))}),"bottom-left":mn.some(function(n,e){cs(n,us(Pa(e),Ga(e)))}),left:mn.some(function(n,e){cs(n,us(Pa(e),Ya(e)))})},zf=Object.freeze({__proto__:null,setValueFrom:function(n,e,t){var o=Rs(Os(n,e,t.left),Es(n,e,t.top));return _s(n,o),o},setToMin:function(n,e){_s(n,Rs(Na(e),Ha(e)))},setToMax:function(n,e){_s(n,Rs(ja(e),La(e)))},getValueFromEvent:Vf,setPositionFromValue:function(n,e,t,o){var r=is(t),i=Ts(n,o.getSpectrum(n),r.x,o.getLeftEdge(n),o.getRightEdge(n),t),u=Ms(n,o.getSpectrum(n),r.y,o.getTopEdge(n),o.getBottomEdge(n),t),c=Ba(e.element)/2,a=Kr(e.element)/2;$r(e.element,"left",i-c+"px"),$r(e.element,"top",u-a+"px")},onLeft:Bf,onRight:Af,onUp:Nf,onDown:Hf,edgeActions:Pf}),jf=[Yt("stepSize",1),Yt("onChange",Y),Yt("onChoose",Y),Yt("onInit",Y),Yt("onDragStart",Y),Yt("onDragEnd",Y),Yt("snapToGrid",!1),Yt("rounded",!0),Ut("snapStart"),$t("model",jt("mode",{x:[Yt("minX",0),Yt("maxX",100),vo("value",function(n){return No(n.mode.minX)}),Lt("getInitialValue"),Dr("manager",Ef)],y:[Yt("minY",0),Yt("maxY",100),vo("value",function(n){return No(n.mode.minY)}),Lt("getInitialValue"),Dr("manager",If)],xy:[Yt("minX",0),Yt("maxX",100),Yt("minY",0),Yt("maxY",100),vo("value",function(n){return No({x:n.mode.minX,y:n.mode.minY})}),Lt("getInitialValue"),Dr("manager",zf)]})),ju("sliderBehaviours",[jc,hf]),vo("mouseIsDown",function(){return No(!1)})],Lf=w("mouse.released"),$f=Sa({name:"Slider",configFields:jf,partFields:ff,factory:function(i,n,e,t){function u(n){return ga(n,i,"thumb")}function c(n){return ga(n,i,"spectrum")}function o(n){return ma(n,i,"left-edge")}function r(n){return ma(n,i,"right-edge")}function a(n){return ma(n,i,"top-edge")}function s(n){return ma(n,i,"bottom-edge")}function f(n,e){v.setPositionFromValue(n,e,i,{getLeftEdge:o,getRightEdge:r,getTopEdge:a,getBottomEdge:s,getSpectrum:c})}function l(n,e){h.value.set(e),f(n,u(n))}function d(t){var n=i.mouseIsDown.get();i.mouseIsDown.set(!1),n&&ma(t,i,"thumb").each(function(n){var e=h.value.get();i.onChoose(t,n,e)})}function m(n,e){e.stop(),i.mouseIsDown.set(!0),i.onDragStart(n,u(n))}function g(n,e){e.stop(),i.onDragEnd(n,u(n)),d(n)}var p,h=i.model,v=h.manager;return{uid:i.uid,dom:i.dom,components:n,behaviours:Lu(i.sliderBehaviours,[jc.config({mode:"special",focusIn:function(n){return ma(n,i,"spectrum").map(jc.focusIn).map(x)}}),hf.config({store:{mode:"manual",getValue:function(n){return h.value.get()}}}),ti.config({channels:((p={})[Lf()]={onReceive:d},p)})]),events:qo([Eo(xf(),function(n,e){!function(n,e){l(n,e);var t=u(n);i.onChange(n,t,e),mn.some(!0)}(n,e.event.value)}),Yo(function(n,e){var t=h.getInitialValue();h.value.set(t);var o=u(n);f(n,o);var r=c(n);i.onInit(n,o,r,h.value.get())}),Eo(Vn(),m),Eo(An(),g),Eo(Nn(),m),Eo(Pn(),g)]),apis:{resetToMin:function(n){v.setToMin(n,i)},resetToMax:function(n){v.setToMax(n,i)},setValue:l,refresh:f},domModification:{styles:{position:"relative"}}}},apis:{setValue:function(n,e,t){n.setValue(e,t)},resetToMin:function(n,e){n.resetToMin(e)},resetToMax:function(n,e){n.resetToMax(e)},refresh:function(n,e){n.refresh(e)}}}),Gf=["9px","10px","11px","12px","14px","16px","18px","20px","24px","32px","36px"],Uf=w(Gf),Wf=It([Lt("getInitialValue"),Lt("onChange"),Lt("category"),Lt("sizes")]),Xf=Uf(),qf={},Yf={exports:qf};function Kf(u){var e=Ns({dom:{tag:"input",attributes:{accept:"image/*",type:"file",title:""},styles:{visibility:"hidden",position:"absolute"}},events:qo([Ro(Un()),Eo(Gn(),function(n,e){var t=e.event.raw,o=t.target.files||t.dataTransfer.files;mn.from(o[0]).each(function(n){var r,t,i=u;r=n,t=r,new Jl(function(n){var e=new FileReader;e.onloadend=function(){n(e.result)},e.readAsDataURL(t)}).then(function(n){return n.split(",")[1]}).then(function(o){i.undoManager.transact(function(){var n=i.editorUpload.blobCache,e=n.create(Gu("mceu"),r,o);n.add(e);var t=i.dom.createHTML("img",{src:e.blobUri()});i.insertContent(t)})})})})])});return Qs.sketch({dom:Ea("image",u),components:[e.asSpec()],action:function(n){e.get(n).element.dom.click()}})}function Jf(n){return n.dom.textContent}function Qf(n){return 0<n.length}function Zf(n){return null==n?"":n}function nl(t,u){u.url.toOptional().filter(Qf).fold(function(){var e=t;u.link.bind(K).each(function(n){e.execCommand("unlink")})},function(r){var n,e,i=(n=u,(e={}).href=r,n.title.toOptional().filter(Qf).each(function(n){e.title=n}),n.target.toOptional().filter(Qf).each(function(n){e.target=n}),e);u.link.bind(K).fold(function(){var n=u.text.toOptional().filter(Qf).getOr(r);t.insertContent(t.dom.createHTML("a",i,t.dom.encode(n)))},function(e){var t,o,n=(t=e,o=r,u.text.toOptional().filter(Qf).fold(function(){return Be(n=t,"href")===Jf(n)?mn.some(o):mn.none();var n},mn.some));Ve(e,i),n.each(function(n){e.dom.textContent=n})})})}function el(n,e){var t,o;return{key:n,value:{config:{},me:(t=n,o=qo(e),Ao({fields:[Lt("enabled")],name:t,active:{events:w(o)}})),configAsRaw:w({}),initialConfig:{},state:er}}}function tl(n){return n.dom.value}function ol(n,e){if(void 0===e)throw new Error("Value.set was undefined");n.dom.value=e}function rl(n,e){var t=Ns(rd.sketch({inputAttributes:{placeholder:cd.translate(e)},onSetValue:function(n,e){W(n,$n())},inputBehaviours:or([ed.config({find:mn.some}),ud.config({}),jc.config({mode:"execution"})]),selectOnFocus:!1})),o=Ns(Qs.sketch({dom:Oa('<button class="${prefix}-input-container-x ${prefix}-icon-cancel-circle ${prefix}-icon"></button>'),action:function(n){var e=t.get(n);hf.setValue(e,"")}}));return{name:n,spec:td.sketch({dom:Oa('<div class="${prefix}-input-container"></div>'),components:[t.asSpec(),o.asSpec()],containerBehaviours:or([ii.config({toggleClass:ci("input-container-empty")}),ed.config({find:function(n){return mn.some(t.get(n))}}),el("input-clearing",[Eo($n(),function(n){var e=t.get(n);(0<hf.getValue(e).length?ii.off:ii.on)(n)})])])})}}function il(n,e,t){(e.disabled()?sd:fd)(n,e)}function ul(n,e){return!0===e.useNative&&T(ad,le(n.element))}function cl(n,e){return ul(n,e)?Ne(n.element,"disabled"):"true"===Be(n.element,"aria-disabled")}function al(n){return"<alloy.field."+n+">"}function sl(o,r){return Ca(r,"link","link",function(){var n,e,t=hd(o,r);o.setContextToolbar(t),n=r,e=function(){o.focusToolbar()},(Zl.os.isAndroid()?function(n,e){var t=e.selection.getRng();n(),e.selection.setRng(t)}:p)(e,n),Ql(r).each(function(n){r.selection.select(n.dom)})})}function fl(e){function t(n){return"The component must be in a context to execute: "+n+(e?"\n"+$o(e().element)+" is not in context.":"")}function n(n){return function(){throw new Error(t(n))}}function o(n){return function(){console.warn(t(n))}}return{debugInfo:w("fake"),triggerEvent:o("triggerEvent"),triggerFocus:o("triggerFocus"),triggerEscape:o("triggerEscape"),broadcast:o("broadcast"),broadcastOn:o("broadcastOn"),broadcastEvent:o("broadcastEvent"),build:n("build"),addToWorld:n("addToWorld"),removeFromWorld:n("removeFromWorld"),addToGui:n("addToGui"),removeFromGui:n("removeFromGui"),getByUid:n("getByUid"),getByDom:n("getByDom"),isConnected:S}}function ll(n,r){var i={};return Ee(n,function(n,o){Ee(n,function(n,e){var t=_e(i,e).getOr([]);i[e]=t.concat([r(o,n)])})}),i}function dl(n){return n.cHandler}function ml(n,e){return{name:n,handler:e}}function gl(n,e,t){var o=e[t];return o?function(u,c,n,a){try{var e=(t=function(n,e){var t=n[c],o=e[c],r=a.indexOf(t),i=a.indexOf(o);if(-1===r)throw new Error("The ordering for "+u+" does not have an entry for "+t+".\nOrder specified: "+JSON.stringify(a,null,2));if(-1===i)throw new Error("The ordering for "+u+" does not have an entry for "+o+".\nOrder specified: "+JSON.stringify(a,null,2));return r<i?-1:i<r?1:0},(o=gn.call(n,0)).sort(t),o);return ht.value(e)}catch(n){return ht.error([n])}var t,o}("Event: "+t,"name",n,o).map(function(n){var t,e,o,r,i=Z(n,function(n){return n.handler});return{can:function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return R(e,function(n,e){return n&&e.can.apply(void 0,t)},!0)},abort:(o=e=t=i,r=function(n){return n.abort},function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return R(o,function(n,e){return n||r(e).apply(void 0,t)},!1)}),run:function(){for(var e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];M(t,function(n){n.run.apply(void 0,e)})}}}):ht.error(["The event ("+t+') has more than one behaviour that listens to it.\nWhen this occurs, you must specify an event ordering for the behaviours in your spec (e.g. [ "listing", "toggling" ]).\nThe behaviours that can trigger it are: '+JSON.stringify(Z(n,function(n){return n.name}),null,2)])}function pl(e,n){M(n,function(n){je(e,n)})}function hl(e,n){M(n,function(n){Le(e,n)})}function vl(n){var t,e,o,r,i=(t=_e(n,"behaviours").getOr({}),B(st(t),function(n){var e=t[n];return l(e)?[e.me]:[]}));return e=n,r=Z(o=i,function(n){return Xt(n.name(),[Lt("config"),Yt("state",er)])}),{list:o,data:De(Ht("component.behaviours",lo(r),e.behaviours).fold(function(n){throw new Error(po(n)+"\nComplete spec:\n"+JSON.stringify(e,null,2))},K),function(n){return w(n.map(function(n){return{config:n.config,state:n.state.init(n.config)}}))})}}function bl(n,e,t){var o,r,i=y(y({},(o=n).dom),{uid:o.uid,domChildren:Z(o.components,function(n){return n.element})}),u=n.domModification.fold(function(){return Io({})},Io),c=0<e.length?function(e,n,t,o){var r=y({},n);function i(n){return _(n,function(n,e){return y(y({},e.modification),n)},{})}M(t,function(n){r[n.name()]=n.exhibit(e,o)});var u=ll(r,function(n,e){return{name:n,modification:e}});return Io({classes:_(u.classes,function(n,e){return e.modification.concat(n)},[]),attributes:i(u.attributes),styles:i(u.styles)})}(t,{"alloy.base.modification":u},e,i):u;return y(y({},r=i),{attributes:y(y({},r.attributes),c.attributes),styles:y(y({},r.styles),c.styles),classes:r.classes.concat(c.classes)})}function yl(n,e,t){var o,r,i,u,c,a={"alloy.base.behaviour":n.events},s=n.eventOrder;return r=t,i=e,o=ll(y(y({},a),(u=r,c={},M(i,function(n){c[n.name()]=n.handlers(u)}),c)),ml),wd(o,s).getOrDie()}function xl(t){function n(){return f}var e=No(xd),o=Pt(Ht("custom.definition",Od,t)),r=vl(t),i=r.list,u=r.data,c=function(n){var c=fe.fromTag(n.tag);Ve(c,n.attributes),pl(c,n.classes),Gr(c,n.styles),n.innerHtml.each(function(n){return t=n,i=me(e=c).dom,xe(u=fe.fromDom(i.createDocumentFragment()),(o=t,(r=(i||document).createElement("div")).innerHTML=o,Je(fe.fromDom(r)))),we(e),void Qe(e,u);var e,t,o,r,i,u});var e=n.domChildren;return xe(c,e),n.value.each(function(n){ol(c,n)}),n.uid,Xs(c,n.uid),c}(bl(o,i,u)),a=yl(o,i,u),s=No(o.components),f={uid:t.uid,getSystem:e.get,config:function(n){var e=u;return(m(e[n.name()])?e[n.name()]:function(){throw new Error("Could not find "+n.name()+" in "+JSON.stringify(t,null,2))})()},hasConfigured:function(n){return m(u[n.name()])},spec:t,readState:function(n){return u[n]().map(function(n){return n.state.readState()}).getOr("not enabled")},getApis:function(){return o.apis},connect:function(n){e.set(n)},disconnect:function(){e.set(fl(n))},element:c,syncComponents:function(){var n=B(Je(c),function(n){return e.get().getByDom(n).fold(function(){return[]},P)});s.set(n)},components:s.get,events:a};return f}function wl(n){return function(n){var e=zt("external.component",It([Lt("element"),Ut("uid")]),n),t=No(fl()),o=e.uid.getOrThunk(function(){return qs("external")});Xs(e.element,o);var r={uid:o,getSystem:t.get,config:mn.none,hasConfigured:S,connect:function(n){t.set(n)},disconnect:function(){t.set(fl(function(){return r}))},getApis:function(){return{}},element:e.element,spec:n,readState:w("No state"),syncComponents:Y,components:w([]),events:{}};return ha(r)}({element:fe.fromText(n)})}function Sl(n){(jo(n.element).isNone()||fi.isFocused(n))&&(fi.isFocused(n)||fi.focus(n),X(n,Ed,{item:n}))}function Ol(n){X(n,Dd,{item:n})}function kl(n,e,t,o){var r=n.getSystem().build(o);at(n,r,t)}function Tl(n,e,t,o){F(zd(n),function(n){return un(o.element,n.element)}).each(Ce)}function Cl(e,n,t,r,o){var i=zd(e);return mn.from(i[r]).map(function(n){return Tl(e,0,0,n),o.each(function(n){kl(e,0,function(n,e){var t,o=e;he(t=n,r).fold(function(){Qe(t,o)},function(n){ve(n,o)})},n)}),n})}function El(n,e,t,o){return _e(e.routes,o.start).bind(function(n){return _e(n,o.destination)})}function Dl(t,o,n){var e,r,i=n;qd(e=t,r=o).bind(function(n){return Xd(e,r,i,n)}).each(function(n){var e=n.transition;Le(t.element,e.transitionClass),He(t.element,o.destinationAttr)})}function Ml(n,e,t,o){Dl(n,e,t),Ne(n.element,e.stateAttr)&&Be(n.element,e.stateAttr)!==o&&e.onFinish(n,o),Ie(n.element,e.stateAttr,o)}function _l(n){je(n,Qd)}function Rl(n){Le(n,Qd)}function Fl(n){return _e(n,"format").getOr(n.title)}function Il(n){return Re(n,"items")?(r=co((e=n,t=["items"],o={},Ee(e,function(n,e){T(t,e)||(o[e]=n)}),o),{menu:!0}),i=tm(e.items),{item:r,menus:co(i.menus,yo(e.title,i.items)),expansions:co(i.expansions,yo(e.title,e.title))}):{item:n,menus:{},expansions:{}};var t,o,e,r,i}function Vl(t,n,o){var e,r,i,u,c,a,s,f,l,d,m,g=(e=t,i=(r=function(n){return B(n,function(n){return void 0===n.items?!Re(n,"format")||e.formatter.canApply(n.format)?[n]:[]:0<r(n.items).length?[n]:[]})})(n),tm(i));return c=(u={formats:g,handle:function(n,e){t.undoManager.transact(function(){ii.isOn(n)?t.formatter.remove(e):t.formatter.apply(e)}),o()}}).formats,a=function(){return m},s=em("Styles",[].concat(Z(c.items,function(n){return nm(Fl(n),n.title,n.isSelected(),n.getPreview(),Re(c.expansions,Fl(n)))})),a,!1),f=De(c.menus,function(n,e){var t=Z(n,function(n){return nm(Fl(n),n.title,void 0!==n.isSelected&&n.isSelected(),void 0!==n.getPreview?n.getPreview():"",Re(c.expansions,Fl(n)))});return em(e,t,a,!0)}),l=co(f,yo("styles",s)),d={tmenu:Wd.tieredData("styles",l,c.expansions)},(m=Ns(Wd.sketch({dom:{tag:"div",classes:[ci("styles-menu")]},components:[],fakeFocus:!0,stayInDom:!0,onExecute:function(n,e){var t=hf.getValue(e);return u.handle(e,t.value),mn.none()},onEscape:function(){return mn.none()},onOpenMenu:function(n,e){var t=Ba(n.element);Va(e.element,t),Jd.jumpTo(e,"current")},onOpenSubmenu:function(n,e,t){var o=Ba(n.element),r=pi(e.element,'[role="menu"]').getOrDie("hacky"),i=n.getSystem().getByDom(r).getOrDie();Va(t.element,o),Jd.progressTo(i,"before"),Jd.jumpTo(t,"after"),Jd.progressTo(t,"current")},onCollapseMenu:function(n,e,t){var o=pi(e.element,'[role="menu"]').getOrDie("hacky"),r=n.getSystem().getByDom(o).getOrDie();Jd.progressTo(r,"after"),Jd.progressTo(t,"current")},navigateOnHover:!1,highlightImmediately:!0,data:d.tmenu,markers:{backgroundMenu:ci("styles-background-menu"),menu:ci("styles-menu"),selectedMenu:ci("styles-selected-menu"),item:ci("styles-item"),selectedItem:ci("styles-selected-item")}}))).asSpec()}function Bl(n){var e=n.replace(/\|/g," ").trim();return 0<e.length?e.split(/\s+/):[]}function Al(e,r){function n(t){return function(){return nf(e=t,function(){n.execCommand(e)},{},n=r);var n,e}}function t(o){return function(){return n=r,t=Ta(e=o),nf(e,function(){n.execCommand(e)},t,n);var n,e,t}}function o(n,e,t){return function(){return Ca(r,n,e,t)}}function i(){return Vl(r,b,function(){r.fire("scrollIntoView")})}function u(n,e){return{isSupported:function(){var e=r.ui.registry.getAll().buttons;return n.forall(function(n){return Re(e,n)})},sketch:e}}var c,a,s=n("undo"),f=n("redo"),l=t("bold"),d=t("italic"),m=t("underline"),g=n("removeformat"),p=o("unlink","link",function(){r.execCommand("unlink",null,!1)}),h=o("unordered-list","ul",function(){r.execCommand("InsertUnorderedList",null,!1)}),v=o("ordered-list","ol",function(){r.execCommand("InsertOrderedList",null,!1)}),b=(a=function(n){return Z(n,function(n){if(Re(n,"items")){var e=a(n.items);return co(co(n,{isSelected:S,getPreview:w("")}),{items:e})}return Re(n,"format")?co(n,{isSelected:y(n.format),getPreview:x(n.format)}):(o=Gu((t=n).title),r=co(t,{format:o,isSelected:y(o),getPreview:x(o)}),c.formatter.register(o,r),r);var t,o,r})})((c=r).getParam("style_formats",fr,"array"));function y(n){return function(){return c.formatter.match(n)}}function x(n){return function(){return c.formatter.getCssText(n)}}return{undo:u(mn.none(),s),redo:u(mn.none(),f),bold:u(mn.none(),l),italic:u(mn.none(),d),underline:u(mn.none(),m),removeformat:u(mn.none(),g),link:u(mn.none(),function(){return sl(e,r)}),unlink:u(mn.none(),p),image:u(mn.none(),function(){return Kf(r)}),bullist:u(mn.some("bullist"),h),numlist:u(mn.some("numlist"),v),fontsizeselect:u(mn.none(),function(){return n={onChange:function(n){var o;o=t,mn.from(Gf[n]).each(function(n){var e,t=n;Bs(e=o)!==t&&e.execCommand("fontSize",!1,t)})},getInitialValue:function(){return e=Bs(t),I(Gf,function(n){return n===e}).getOr(2);var e}},Is(e,"font-size",function(){return As(n)},t=r);var t,n}),forecolor:u(mn.none(),function(){return Vs(e,r)}),styleselect:u(mn.none(),function(){return nf("style-formats",function(n){r.fire("toReading"),e.dropup.appear(i,ii.on,n)},or([ii.config({toggleClass:ci("toolbar-button-selected"),toggleOnExecute:!1,aria:{mode:"pressed"}}),ti.config({channels:xo([Hr(mr,ii.off),Hr(gr,ii.off)])})]),r)})}}function Nl(n){function e(){return n.stopPropagation()}function t(){return n.preventDefault()}var o=i(t,e);return{target:fe.fromDom(function(n){if(et()&&l(n.target)){var e=fe.fromDom(n.target);if(Xe(e)&&ot(e)&&n.composed&&n.composedPath){var t=n.composedPath();if(t)return 0<(o=t).length?mn.some(o[0]):mn.none()}}var o;return mn.from(n.target)}(n).getOr(n.target)),x:n.clientX,y:n.clientY,stop:e,prevent:t,kill:o,raw:n}}function Hl(n,e,t,o,r){var i,u,c=(i=t,u=o,function(n){i(n)&&u(Nl(n))});return n.dom.addEventListener(e,c,r),{unbind:J(rm,n,e,c,r)}}function Pl(n,e,t){return Hl(n,e,im,t,!1)}function zl(n,e,t){return Hl(n,e,im,t,!0)}function jl(n){return{isPortrait:w(n.matchMedia("(orientation: portrait)").matches)}}function Ll(o,e){var n=fe.fromDom(o),r=null,t=Pl(n,"orientationchange",function(){um.clearInterval(r);var n=jl(o);e.onChange(n),i(function(){e.onReady(n)})}),i=function(n){um.clearInterval(r);var e=o.innerHeight,t=0;r=um.setInterval(function(){e!==o.innerHeight?(um.clearInterval(r),n(mn.some(o.innerHeight))):20<t&&(um.clearInterval(r),n(mn.none())),t++},50)};return{onAdjustment:i,destroy:function(){t.unbind()}}}function $l(n,e,t){var o,r=n.document.createRange(),i=r;return e.fold(function(n){i.setStartBefore(n.dom)},function(n,e){i.setStart(n.dom,e)},function(n){i.setStartAfter(n.dom)}),o=r,t.fold(function(n){o.setEndBefore(n.dom)},function(n,e){o.setEnd(n.dom,e)},function(n){o.setEndAfter(n.dom)}),r}function Gl(n,e,t,o,r){var i=n.document.createRange();return i.setStart(e.dom,t),i.setEnd(o.dom,r),i}function Ul(n){return{left:n.left,top:n.top,right:n.right,bottom:n.bottom,width:n.width,height:n.height}}function Wl(n,e,t){return e(fe.fromDom(t.startContainer),t.startOffset,fe.fromDom(t.endContainer),t.endOffset)}function Xl(n,e){var r,t,o,i=(r=n,e.match({domRange:function(n){return{ltr:w(n),rtl:mn.none}},relative:function(n,e){return{ltr:k(function(){return $l(r,n,e)}),rtl:k(function(){return mn.some($l(r,e,n))})}},exact:function(n,e,t,o){return{ltr:k(function(){return Gl(r,n,e,t,o)}),rtl:k(function(){return mn.some(Gl(r,t,o,n,e))})}}}));return(o=(t=i).ltr()).collapsed?t.rtl().filter(function(n){return!1===n.collapsed}).map(function(n){return cm.rtl(fe.fromDom(n.endContainer),n.endOffset,fe.fromDom(n.startContainer),n.startOffset)}).getOrThunk(function(){return Wl(0,cm.ltr,o)}):Wl(0,cm.ltr,o)}!function(){var n=this,e=function(){var n,e,t,o={exports:{}};function r(){}function i(n){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof n)throw new TypeError("not a function");this._state=0,this._handled=!1,this._value=void 0,this._deferreds=[],l(n,this)}function u(t,o){for(;3===t._state;)t=t._value;0!==t._state?(t._handled=!0,i._immediateFn(function(){var n,e=1===t._state?o.onFulfilled:o.onRejected;if(null!==e){try{n=e(t._value)}catch(n){return void a(o.promise,n)}c(o.promise,n)}else(1===t._state?c:a)(o.promise,t._value)})):t._deferreds.push(o)}function c(e,n){try{if(n===e)throw new TypeError("A promise cannot be resolved with itself.");if(n&&("object"==typeof n||"function"==typeof n)){var t=n.then;if(n instanceof i)return e._state=3,e._value=n,void s(e);if("function"==typeof t)return void l((o=t,r=n,function(){o.apply(r,arguments)}),e)}e._state=1,e._value=n,s(e)}catch(n){a(e,n)}var o,r}function a(n,e){n._state=2,n._value=e,s(n)}function s(n){2===n._state&&0===n._deferreds.length&&i._immediateFn(function(){n._handled||i._unhandledRejectionFn(n._value)});for(var e=0,t=n._deferreds.length;e<t;e++)u(n,n._deferreds[e]);n._deferreds=null}function f(n,e,t){this.onFulfilled="function"==typeof n?n:null,this.onRejected="function"==typeof e?e:null,this.promise=t}function l(n,e){var t=!1;try{n(function(n){t||(t=!0,c(e,n))},function(n){t||(t=!0,a(e,n))})}catch(n){if(t)return;t=!0,a(e,n)}}n=o,e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},t=setTimeout,i.prototype.catch=function(n){return this.then(null,n)},i.prototype.then=function(n,e){var t=new this.constructor(r);return u(this,new f(n,e,t)),t},i.all=function(n){var c=Array.prototype.slice.call(n);return new i(function(r,i){if(0===c.length)return r([]);for(var u=c.length,n=0;n<c.length;n++)!function e(t,n){try{if(n&&("object"==typeof n||"function"==typeof n)){var o=n.then;if("function"==typeof o)return o.call(n,function(n){e(t,n)},i),0}c[t]=n,0==--u&&r(c)}catch(n){i(n)}}(n,c[n])})},i.resolve=function(e){return e&&"object"==typeof e&&e.constructor===i?e:new i(function(n){n(e)})},i.reject=function(t){return new i(function(n,e){e(t)})},i.race=function(r){return new i(function(n,e){for(var t=0,o=r.length;t<o;t++)r[t].then(n,e)})},i._immediateFn="function"==typeof setImmediate?function(n){setImmediate(n)}:function(n){t(n,0)},i._unhandledRejectionFn=function(n){"undefined"!=typeof console&&console&&console.warn("Possible Unhandled Promise Rejection:",n)},i._setImmediateFn=function(n){i._immediateFn=n},i._setUnhandledRejectionFn=function(n){i._unhandledRejectionFn=n},n.exports?n.exports=i:e.Promise||(e.Promise=i);var d=o.exports;return{boltExport:("undefined"!=typeof window?window:Function("return this;")()).Promise||d}};"object"==typeof qf&&void 0!==Yf?Yf.exports=e():(n="undefined"!=typeof globalThis?globalThis:n||self).EphoxContactWrapper=e()}();function ql(r,n){return{uid:r.uid,dom:r.dom,components:n,behaviours:Lu(r.formBehaviours,[hf.config({store:{mode:"manual",getValue:function(n){var e,t,o=(e=r,t=n.getSystem(),De(e.partUids,function(n,e){return w(t.getByUid(n))}));return De(o,function(n,o){return n().bind(function(n){var e=ed.getCurrent(n),t=new Error("Cannot find a current component to extract the value from for form part '"+o+"': "+$o(n.element));return e.fold(function(){return ht.error(t)},ht.value)}).map(hf.getValue)})},setValue:function(t,n){Ee(n,function(e,n){ma(t,r,n).each(function(n){ed.getCurrent(n).each(function(n){hf.setValue(n,e)})})})}}})]),apis:{getField:function(n,e){return ma(n,r,e).bind(ed.getCurrent)}}}}function Yl(n){return"prepared"===n.type?mn.some(n.menu):mn.none()}var Kl,Jl=Yf.exports.boltExport,Ql=function(n){return vi(fe.fromDom(n.selection.getStart()),"a")},Zl=Fn(),nd=Object.freeze({__proto__:null,getCurrent:function(n,e,t){return e.find(n)}}),ed=Ao({fields:[Lt("find")],name:"composing",apis:nd}),td=wa({name:"Container",factory:function(n){var e=n.dom,t=e.attributes,o=c(e,["attributes"]);return{uid:n.uid,dom:y({tag:"div",attributes:y({role:"presentation"},t)},o),components:n.components,behaviours:n.containerBehaviours.dump,events:n.events,domModification:n.domModification,eventOrder:n.eventOrder}},configFields:[Yt("components",[]),ju("containerBehaviours",[]),Yt("events",{}),Yt("domModification",{}),Yt("eventOrder",{})]}),od=wa({name:"DataField",factory:function(t){return{uid:t.uid,dom:t.dom,behaviours:$c(t.dataBehaviours,[hf.config({store:{mode:"memory",initialValue:t.getInitialValue()}}),ed.config({find:mn.some})]),events:qo([Yo(function(n,e){hf.setValue(n,t.getInitialValue())})])}},configFields:[Lt("uid"),Lt("dom"),Lt("getInitialValue"),Lc("dataBehaviours",[hf,ed])]}),rd=wa({name:"Input",configFields:w([Ut("data"),Yt("inputAttributes",{}),Yt("inputStyles",{}),Yt("tag","input"),Yt("inputClasses",[]),kr("onSetValue"),Yt("styles",{}),Yt("eventOrder",{}),ju("inputBehaviours",[hf,fi]),Yt("selectOnFocus",!0)])(),factory:function(n,e){return{uid:n.uid,dom:{tag:(o=n).tag,attributes:y({type:"text"},o.inputAttributes),styles:o.inputStyles,classes:o.inputClasses},components:[],behaviours:(t=n,y(y({},or([fi.config({onFocus:t.selectOnFocus?function(n){var e=n.element,t=tl(e);e.dom.setSelectionRange(0,t.length)}:Y})])),Lu(t.inputBehaviours,[hf.config({store:y(y({mode:"manual"},t.data.map(function(n){return{initialValue:n}}).getOr({})),{getValue:function(n){return tl(n.element)},setValue:function(n,e){tl(n.element)!==e&&ol(n.element,e)}}),onSetValue:t.onSetValue})]))),eventOrder:n.eventOrder};var t,o}}),id=Object.freeze({__proto__:null,exhibit:function(n,e){return Io({attributes:xo([{key:e.tabAttr,value:"true"}])})}}),ud=Ao({fields:[Yt("tabAttr","data-alloy-tabstop")],name:"tabstopping",active:id}),cd=tinymce.util.Tools.resolve("tinymce.util.I18n"),ad=["input","button","textarea","select"],sd=function(e,n,t){n.disableClass.each(function(n){je(e.element,n)}),(ul(e,n)?function(n){Ie(n.element,"disabled","disabled")}:function(n){Ie(n.element,"aria-disabled","true")})(e),n.onDisabled(e)},fd=function(e,n,t){n.disableClass.each(function(n){Le(e.element,n)}),(ul(e,n)?function(n){He(n.element,"disabled")}:function(n){Ie(n.element,"aria-disabled","false")})(e),n.onEnabled(e)},ld=Object.freeze({__proto__:null,enable:fd,disable:sd,isDisabled:cl,onLoad:il,set:function(n,e,t,o){(o?sd:fd)(n,e)}}),dd=Object.freeze({__proto__:null,exhibit:function(n,e){return Io({classes:e.disabled()?e.disableClass.toArray():[]})},events:function(t,n){return qo([Co(Zn(),function(n,e){return cl(n,t)}),Vo(t,n,il)])}}),md=Ao({fields:[Kt("disabled",S,go),Yt("useNative",!0),Ut("disableClass"),kr("onDisabled"),kr("onEnabled")],name:"disabling",active:dd,apis:ld}),gd=[ju("formBehaviours",[hf])],pd=(va(function(n,e,t){return n.getField(e,t)}),function(n){var r,e={field:function(n,e){return r.push(n),t=al(n),o=e,{uiType:Yc(),owner:"form",name:t,config:o,validated:{}};var t,o},record:w(r=[])},t=n(e),o=Z(e.record(),function(n){return sa({name:n,pname:al(n)})});return xa("form",gd,o,ql,t)}),hd=k(function(o,r){return[{label:"the link group",items:[(n={fields:[rl("url","Type or paste URL"),rl("text","Link text"),rl("title","Link title"),rl("target","Link target"),{name:"link",spec:od.sketch({dom:{tag:"span",styles:{display:"none"}},getInitialValue:function(){return mn.none()}})}],maxFieldIndex:["url","text","title","target"].length-1,getInitialValue:function(){return mn.some(Ql(n=r).fold(function(){return{url:"",text:n.selection.getContent({format:"text"}),title:"",target:"",link:mn.none()}},function(n){return t=Jf(e=n),o=Be(e,"href"),r=Be(e,"title"),i=Be(e,"target"),{url:Zf(o),text:t!==o?Zf(t):"",title:Zf(r),target:Zf(i),link:mn.some(e)};var e,t,o,r,i}));var n},onExecute:function(n,e){var t=hf.getValue(n);nl(r,t),o.restoreToolbar(),r.focus()}},a="navigateEvent",s=zt("SerialisedDialog",lo([Lt("fields"),Yt("maxFieldIndex",n.fields.length-1),Lt("onExecute"),Lt("getInitialValue"),vo("state",function(){return{dialogSwipeState:cu(),currentScreen:No(0)}})]),n),f=Ns(pd(function(t){return{dom:Oa('<div class="${prefix}-serialised-dialog"></div>'),components:[td.sketch({dom:Oa('<div class="${prefix}-serialised-dialog-chain" style="left: 0px; position: absolute;"></div>'),components:Z(s.fields,function(n,e){return e<=s.maxFieldIndex?td.sketch({dom:Oa('<div class="${prefix}-serialised-dialog-screen"></div>'),components:[i(-1,"previous",0<e),t.field(n.name,n.spec),i(1,"next",e<s.maxFieldIndex)]}):t.field(n.name,n.spec)})})],formBehaviours:or([Nr(function(n,e){var t=e;hi(n.element,"."+ci("serialised-dialog-chain")).each(function(n){$r(n,"left",-s.state.currentScreen.get()*t.width+"px")})}),jc.config({mode:"special",focusIn:function(n,e){c(n)},onTab:function(n,e){return u(n,1),mn.some(!0)},onShiftTab:function(n,e){return u(n,-1),mn.some(!0)}}),el("form-events",[Yo(function(e,n){s.state.currentScreen.set(0),s.state.dialogSwipeState.clear();var t=l.get(e);Qi.highlightFirst(t),s.getInitialValue(e).each(function(n){hf.setValue(e,n)})}),Qo(s.onExecute),Eo(Wn(),function(n,e){"left"===e.event.raw.propertyName&&c(n)}),Eo(a,function(n,e){u(n,e.event.direction)})])])}})),l=Ns({dom:Oa('<div class="${prefix}-dot-container"></div>'),behaviours:or([Qi.config({highlightClass:ci("dot-active"),itemClass:ci("dot-item")})]),components:B(s.fields,function(n,e){return e<=s.maxFieldIndex?[ka('<div class="${prefix}-dot-item ${prefix}-icon-full-dot ${prefix}-icon"></div>')]:[]})}),{dom:Oa('<div class="${prefix}-serializer-wrapper"></div>'),components:[f.asSpec(),l.asSpec()],behaviours:or([jc.config({mode:"special",focusIn:function(n){var e=f.get(n);jc.focusIn(e)}}),el("serializer-wrapper-events",[Eo(Vn(),function(n,e){var t=e.event;s.state.dialogSwipeState.set({xValue:t.raw.touches[0].clientX,points:[]})}),Eo(Bn(),function(n,e){var t=e.event;s.state.dialogSwipeState.on(function(n){e.event.prevent(),s.state.dialogSwipeState.set(function(n,e){if(e===n.xValue)return n;var t=0<e-n.xValue?1:-1,o={direction:t,xValue:e};return{xValue:e,points:(0===n.points.length?[]:n.points[n.points.length-1].direction===t?n.points.slice(0,n.points.length-1):n.points).concat([o])}}(n,t.raw.touches[0].clientX))})}),Eo(An(),function(n,e){s.state.dialogSwipeState.on(function(t){u(f.get(n),-1*function(){if(0===t.points.length)return 0;var n=t.points[0].direction,e=t.points[t.points.length-1].direction;return-1===n&&-1===e?-1:1===n&&1===e?1:0}())})})])])})]}];function i(e,n,t){return Qs.sketch({dom:Oa('<span class="${prefix}-icon-'+n+' ${prefix}-icon"></span>'),action:function(n){X(n,a,{direction:e})},buttonBehaviours:or([md.config({disableClass:ci("toolbar-navigation-disabled"),disabled:function(){return!t}})])})}function u(n,r){var i=Jr(n.element,"."+ci("serialised-dialog-screen"));hi(n.element,"."+ci("serialised-dialog-chain")).each(function(o){0<=s.state.currentScreen.get()+r&&s.state.currentScreen.get()+r<i.length&&(Wr(o,"left").each(function(n){var e=parseInt(n,10),t=Ba(i[0]);$r(o,"left",e-r*t+"px")}),s.state.currentScreen.set(s.state.currentScreen.get()+r))})}function c(o){var n=Jr(o.element,"input");mn.from(n[s.state.currentScreen.get()]).each(function(n){o.getSystem().getByDom(n).each(function(n){var e=o,t=n.element;e.getSystem().triggerFocus(t,e.element)})});var e=l.get(o);Qi.highlightAt(e,s.state.currentScreen.get())}var n,a,s,f,l}),vd=qo([{key:Yn(),value:To({can:function(n,e){var t,o=e.event,r=o.originator,i=o.target;return!(un(t=r,n.element)&&!un(t,i)&&(console.warn(Yn()+" did not get interpreted by the desired target. \nOriginator: "+$o(r)+"\nTarget: "+$o(i)+"\nCheck the "+Yn()+" event handlers"),1))}})}]),bd=Object.freeze({__proto__:null,events:vd}),yd=K,xd=fl(),wd=function(n,c){var e,t,o,r,i,u,a=Me(n,function(r,u){return(1===r.length?ht.value(r[0].handler):gl(r,c,u)).map(function(n){var e,i,t=(i=m(e=n)?{can:x,abort:S,run:e}:e,function(n,e){for(var t=[],o=2;o<arguments.length;o++)t[o-2]=arguments[o];var r=[n,e].concat(t);i.abort.apply(void 0,r)?e.stop():i.can.apply(void 0,r)&&i.run.apply(void 0,r)}),o=1<r.length?E(c[u],function(e){return C(r,function(n){return n.name===e})}).join(" > "):r[0].name;return yo(u,{handler:t,purpose:o})})});return e={},t=[],o=[],M(a,function(n){n.fold(function(n){t.push(n)},function(n){o.push(n)})}),0<(u={errors:t,values:o}).errors.length?ht.error(V(u.errors)):(i=e,0===(r=u.values).length?ht.value(i):ht.value(co(i,ao.apply(void 0,r))))},Sd="alloy.base.behaviour",Od=lo([ho("dom","dom",Ot(),lo([Lt("tag"),Yt("styles",{}),Yt("classes",[]),Yt("attributes",{}),Ut("value"),Ut("innerHtml")])),Lt("components"),Lt("uid"),Yt("events",{}),Yt("apis",{}),ho("eventOrder","eventOrder",((Kl={})[Zn()]=["disabling",Sd,"toggling","typeaheadevents"],Kl[Yn()]=[Sd,"focusing","keying"],Kl[oe()]=[Sd,"disabling","toggling","representing"],Kl[$n()]=[Sd,"representing","streaming","invalidating"],Kl[ie()]=[Sd,"representing","item-events","tooltipping"],Kl[Nn()]=["focusing",Sd,"item-type-events"],Kl[Vn()]=["focusing",Sd,"item-type-events"],Kl[zn()]=["item-type-events","tooltipping"],Kl[Qn()]=["receiving","reflecting","tooltipping"],Et(w(Kl))),mo()),Ut("domModification")]),kd=qs,Td=function(u){return _e(u,Ls).getOrThunk(function(){var n,e,t,o,r,i=dt(u,"uid")?u:y({uid:kd("")},u);return n=yd(i),e=n.events,t=c(n,["events"]),o=Z(_e(t,"components").getOr([]),Td),r=y(y({},t),{events:y(y({},bd),e),components:o}),ht.value(xl(r)).getOrDie()})},Cd=ha,Ed="alloy.item-hover",Dd="alloy.item-focus",Md=w(Ed),_d=w(Dd),Rd=[Lt("data"),Lt("components"),Lt("dom"),Yt("hasSubmenu",!1),Ut("toggling"),Lc("itemBehaviours",[ii,fi,jc,hf]),Yt("ignoreFocus",!1),Yt("domModification",{}),Dr("builder",function(n){return{dom:n.dom,domModification:y(y({},n.domModification),{attributes:y(y(y({role:n.toggling.isSome()?"menuitemcheckbox":"menuitem"},n.domModification.attributes),{"aria-haspopup":n.hasSubmenu}),n.hasSubmenu?{"aria-expanded":!1}:{})}),behaviours:$c(n.itemBehaviours,[n.toggling.fold(ii.revoke,function(n){return ii.config(y({aria:{mode:"checked"}},n))}),fi.config({ignore:n.ignoreFocus,stopMousedown:n.ignoreFocus,onFocus:function(n){Ol(n)}}),jc.config({mode:"execution"}),hf.config({store:{mode:"memory",initialValue:n.data}}),el("item-type-events",u(u([],Pr(),!0),[Eo(zn(),Sl),Eo(ne(),fi.focus)],!1))]),components:n.components,eventOrder:n.eventOrder}}),Yt("eventOrder",{})],Fd=[Lt("dom"),Lt("components"),Dr("builder",function(n){return{dom:n.dom,components:n.components,events:qo([Eo(ne(),function(n,e){e.stop()})])}})],Id=w("item-widget"),Vd=w([sa({name:"widget",overrides:function(e){return{behaviours:or([hf.config({store:{mode:"manual",getValue:function(n){return e.data},setValue:Y}})])}}})]),Bd=jt("type",{widget:[Lt("uid"),Lt("data"),Lt("components"),Lt("dom"),Yt("autofocus",!1),Yt("ignoreFocus",!1),Lc("widgetBehaviours",[hf,fi,jc]),Yt("domModification",{}),pa(Vd()),Dr("builder",function(t){function o(n){return ma(n,t,"widget").map(function(n){return jc.focusIn(n),n})}function n(n,e){return eu(e.event.target)||t.autofocus&&e.setSource(n.element),mn.none()}var e=la(Id(),t,Vd()),r=da(Id(),t,e.internals());return{dom:t.dom,components:r,domModification:t.domModification,events:qo([Qo(function(n,e){o(n).each(function(n){e.stop()})}),Eo(zn(),Sl),Eo(ne(),function(n,e){t.autofocus?o(n):fi.focus(n)})]),behaviours:$c(t.widgetBehaviours,[hf.config({store:{mode:"memory",initialValue:t.data}}),fi.config({ignore:t.ignoreFocus,onFocus:function(n){Ol(n)}}),jc.config({mode:"special",focusIn:t.autofocus?function(n){o(n)}:ur(),onLeft:n,onRight:n,onEscape:function(n,e){return fi.isFocused(n)||t.autofocus?(t.autofocus&&e.setSource(n.element),mn.none()):(fi.focus(n),mn.some(!0))}})])}})],item:Rd,separator:Fd}),Ad=w([Ps({factory:{sketch:function(n){var e=zt("menu.spec item",Bd,n);return e.builder(e)}},name:"items",unit:"item",defaults:function(n,e){return dt(e,"uid")?e:y(y({},e),{uid:qs("item")})},overrides:function(n,e){return{type:e.type,ignoreFocus:n.fakeFocus,domModification:{classes:[n.markers.item]}}}})]),Nd=w([Lt("value"),Lt("items"),Lt("dom"),Lt("components"),Yt("eventOrder",{}),ju("menuBehaviours",[Qi,hf,ed,jc]),Kt("movement",{mode:"menu",moveOnTab:!0},jt("mode",{grid:[ei(),Dr("config",function(n,e){return{mode:"flatgrid",selector:"."+n.markers.item,initSize:{numColumns:e.initSize.numColumns,numRows:e.initSize.numRows},focusManager:n.focusManager}})],matrix:[Dr("config",function(n,e){return{mode:"matrix",selectors:{row:e.rowSelector,cell:"."+n.markers.item},focusManager:n.focusManager}}),Lt("rowSelector")],menu:[Yt("moveOnTab",!0),Dr("config",function(n,e){return{mode:"menu",selector:"."+n.markers.item,moveOnTab:e.moveOnTab,focusManager:n.focusManager}})]})),$t("markers",ni()),Yt("fakeFocus",!1),Yt("focusManager",Ii()),kr("onHighlight")]),Hd=w("alloy.menu-focus"),Pd=Sa({name:"Menu",configFields:Nd(),partFields:Ad(),factory:function(n,e,t,o){return{uid:n.uid,dom:n.dom,markers:n.markers,behaviours:Lu(n.menuBehaviours,[Qi.config({highlightClass:n.markers.selectedItem,itemClass:n.markers.item,onHighlight:n.onHighlight}),hf.config({store:{mode:"memory",initialValue:n.value}}),ed.config({find:mn.some}),jc.config(n.movement.config(n,n.movement))]),events:qo([Eo(_d(),function(e,t){var n=t.event;e.getSystem().getByDom(n.target).each(function(n){Qi.highlight(e,n),t.stop(),X(e,Hd(),{menu:e,item:n})})}),Eo(Md(),function(n,e){var t=e.event.item;Qi.highlight(n,t)})]),components:e,eventOrder:n.eventOrder,domModification:{attributes:{role:"menu"}}}}}),zd=function(n,e){return n.components()},jd=Ao({fields:[],name:"replacing",apis:Object.freeze({__proto__:null,append:function(n,e,t,o){kl(n,0,Qe,o)},prepend:function(n,e,t,o){kl(n,0,ye,o)},remove:Tl,replaceAt:Cl,replaceBy:function(e,n,t,o,r){return I(zd(e),o).bind(function(n){return Cl(e,0,0,n,r)})},set:function(i,n,e,u){var t,o,r,c;t=function(){var e,n,t,o,r=Z(u,i.getSystem().build);n=r,o=(e=i).components(),M((t=e).components(),function(n){return Ze(n.element)}),we(t.element),t.syncComponents(),M(H(o,n),function(n){ut(n),e.getSystem().removeFromWorld(n)}),M(n,function(n){n.getSystem().isConnected()?Te(e,n):(e.getSystem().addToWorld(n),Te(e,n),rt(e.element)&&ct(n)),e.syncComponents()})},o=i.element,r=tt(o),c=zo(r).bind(function(e){function n(n){return un(e,n)}var r,i;return n(o)?mn.some(o):(r=n,(i=function(n){for(var e=0;e<n.childNodes.length;e++){var t=fe.fromDom(n.childNodes[e]);if(r(t))return mn.some(t);var o=i(n.childNodes[e]);if(o.isSome())return o}return mn.none()})(o.dom))}),t(o),c.each(function(e){zo(r).filter(function(n){return un(n,e)}).fold(function(){Ho(e)},Y)})},contents:zd})}),Ld=function(t,o,r,n){return _e(r,n).bind(function(n){return _e(t,n).bind(function(n){var e=Ld(t,o,r,n);return mn.some([n].concat(e))})}).getOr([])},$d=function(){function c(u){return function(n){for(var e=st(n),t=0,o=e.length;t<o;t++){var r=e[t],i=n[r];if(i===u)return mn.some(i)}return mn.none()}(i.get())}function a(n){return e(n).bind(Yl)}function t(n){return _e(i.get(),n)}var i=No({}),u=No({}),s=No({}),f=cu(),l=No({}),e=function(n){return _e(u.get(),n)};return{setMenuBuilt:function(n,e){var t;u.set(y(y({},u.get()),((t={})[n]={type:"prepared",menu:e},t)))},setContents:function(n,e,t,o){f.set(n),i.set(t),u.set(e),l.set(o);var r=function(n,e){var t={};Ee(n,function(n,e){M(n,function(n){t[n]=e})});var o=e,r=lt(e,function(n,e){return{k:n,v:e}}),i=De(r,function(n,e){return[e].concat(Ld(t,o,r,e))});return De(t,function(n){return _e(i,n).getOr([n])})}(o,t);s.set(r)},expand:function(t){return _e(i.get(),t).map(function(n){var e=_e(s.get(),t).getOr([]);return[n].concat(e)})},refresh:function(n){return _e(s.get(),n)},collapse:function(n){return _e(s.get(),n).bind(function(n){return 1<n.length?mn.some(n.slice(1)):mn.none()})},lookupMenu:e,lookupItem:t,otherMenus:function(n){var e=l.get();return H(st(e),n)},getPrimary:function(){return f.get().bind(a)},getMenus:function(){return u.get()},clear:function(){i.set({}),u.set({}),s.set({}),f.clear()},isClear:function(){return f.get().isNone()},getTriggeringPath:function(n,u){var e=E(t(n).toArray(),function(n){return a(n).isSome()});return _e(s.get(),n).bind(function(n){var i=N(e.concat(n));return function(n){for(var e=[],t=0;t<n.length;t++){var o=n[t];if(!o.isSome())return mn.none();e.push(o.getOrDie())}return mn.some(e)}(B(i,function(n,e){return t=n,o=u,r=i.slice(0,e+1),a(t).bind(function(e){return c(t).bind(function(n){return o(n).map(function(n){return{triggeredMenu:e,triggeringItem:n,triggeringPath:r}})})}).fold(function(){return wo(f.get(),n)?[]:[mn.none()]},function(n){return[mn.some(n)]});var t,o,r}))})}}},Gd=Yl,Ud=w("collapse-item"),Wd=wa({name:"TieredMenu",configFields:[Er("onExecute"),Er("onEscape"),Cr("onOpenMenu"),Cr("onOpenSubmenu"),kr("onRepositionMenu"),kr("onCollapseMenu"),Yt("highlightImmediately",!0),Gt("data",[Lt("primary"),Lt("menus"),Lt("expansions")]),Yt("fakeFocus",!1),kr("onHighlight"),kr("onHover"),Gt("markers",[Lt("backgroundMenu")].concat(wr()).concat(Sr())),Lt("dom"),Yt("navigateOnHover",!0),Yt("stayInDom",!1),ju("tmenuBehaviours",[jc,Qi,ed,jd]),Yt("eventOrder",{})],apis:{collapseMenu:function(n,e){n.collapseMenu(e)},highlightPrimary:function(n,e){n.highlightPrimary(e)},repositionMenus:function(n,e){n.repositionMenus(e)}},factory:function(c,n){function t(n){var o,r,e=(o=n,r=c.data.primary,De(c.data.menus,function(n,e){function t(){return Pd.sketch(y(y({},n),{value:e,markers:c.markers,fakeFocus:c.fakeFocus,onHighlight:c.onHighlight,focusManager:(c.fakeFocus?Vi:Ii)()}))}return e===r?{type:"prepared",menu:o.getSystem().build(t())}:{type:"notbuilt",nbMenu:t}})),t=De(c.data.menus,function(n,e){return B(n.items,function(n){return"separator"===n.type?[]:[n.data.value]})});return m.setContents(c.data.primary,e,c.data.expansions,t),m.getPrimary()}function a(n){return hf.getValue(n).value}function i(e,n){Qi.highlight(e,n),Qi.getHighlighted(n).orThunk(function(){return Qi.getFirst(n)}).each(function(n){nn(e,n.element,ne())})}function u(e,n){return So(Z(n,function(n){return e.lookupMenu(n).bind(function(n){return"prepared"===n.type?mn.some(n.menu):mn.none()})}))}function s(e,n,t){M(u(n,n.otherMenus(t)),function(n){hl(n.element,[c.markers.backgroundMenu]),c.stayInDom||jd.remove(e,n)})}function f(n,o){var e;Ee((e=n,r.get().getOrThunk(function(){var t={};return M(E(Jr(e.element,"."+c.markers.item),function(n){return"true"===Be(n,"aria-haspopup")}),function(n){e.getSystem().getByDom(n).each(function(n){var e=a(n);t[e]=n})}),r.set(t),t})),function(n,e){var t=T(o,e);Ie(n.element,"aria-expanded",t)})}function l(t,o,r){return mn.from(r[0]).bind(function(n){return o.lookupMenu(n).bind(function(n){if("notbuilt"===n.type)return mn.none();var e=n.menu;return M(u(o,r.slice(1)),function(n){je(n.element,c.markers.backgroundMenu)}),rt(e.element)||jd.append(t,Cd(e)),hl(e.element,[c.markers.backgroundMenu]),i(t,e),s(t,o,r),mn.some(e)})})}var d,e,r=cu(),m=$d();function g(r,i,u){if(void 0===u&&(u=d.HighlightSubmenu),i.hasConfigured(md)&&md.isDisabled(i))return mn.some(i);var n=a(i);return m.expand(n).bind(function(o){return f(r,o),mn.from(o[0]).bind(function(t){return m.lookupMenu(t).bind(function(n){var e=function(n,e,t){if("notbuilt"!==t.type)return t.menu;var o=n.getSystem().build(t.nbMenu());return m.setMenuBuilt(e,o),o}(r,t,n);return rt(e.element)||jd.append(r,Cd(e)),c.onOpenSubmenu(r,i,e,N(o)),u===d.HighlightSubmenu?(Qi.highlightFirst(e),l(r,m,o)):(Qi.dehighlightAll(e),mn.some(i))})})})}function o(e,t){var n=a(t);return m.collapse(n).bind(function(n){return f(e,n),l(e,m,n).map(function(n){return c.onCollapseMenu(e,t,n),n})})}function p(t){return function(e,n){return vi(n.getSource(),"."+c.markers.item).bind(function(n){return e.getSystem().getByDom(n).toOptional().bind(function(n){return t(e,n).map(x)})})}}function h(n){return Qi.getHighlighted(n).bind(Qi.getHighlighted)}(e=d={})[e.HighlightSubmenu=0]="HighlightSubmenu",e[e.HighlightParent=1]="HighlightParent";var v=qo([Eo(Hd(),function(t,o){var n=o.event.item;m.lookupItem(a(n)).each(function(){var n=o.event.menu;Qi.highlight(t,n);var e=a(o.event.item);m.refresh(e).each(function(n){return s(t,m,n)})})}),Qo(function(e,n){var t=n.event.target;e.getSystem().getByDom(t).each(function(n){0===a(n).indexOf("collapse-item")&&o(e,n),g(e,n,d.HighlightSubmenu).fold(function(){c.onExecute(e,n)},Y)})}),Yo(function(e,n){t(e).each(function(n){jd.append(e,Cd(n)),c.onOpenMenu(e,n),c.highlightImmediately&&i(e,n)})})].concat(c.navigateOnHover?[Eo(Md(),function(n,e){var t=e.event.item,o=n,r=a(t);m.refresh(r).bind(function(n){return f(o,n),l(o,m,n)}),g(n,t,d.HighlightParent),c.onHover(n,t)})]:[])),b={collapseMenu:function(e){h(e).each(function(n){o(e,n)})},highlightPrimary:function(e){m.getPrimary().each(function(n){i(e,n)})},repositionMenus:function(o){m.getPrimary().bind(function(e){return h(o).bind(function(n){var e=a(n),t=So(Z(Me(m.getMenus(),K),Gd));return m.getTriggeringPath(e,function(n){return e=n,z(t,function(n){return n.getSystem().isConnected()?F(Qi.getCandidates(n),function(n){return a(n)===e}):mn.none()});var e})}).map(function(n){return{primary:e,triggeringPath:n}})}).fold(function(){mn.from(o.components()[0]).filter(function(n){return"menu"===Be(n.element,"role")}).each(function(n){c.onRepositionMenu(o,n,[])})},function(n){var e=n.primary,t=n.triggeringPath;c.onRepositionMenu(o,e,t)})}};return{uid:c.uid,dom:c.dom,markers:c.markers,behaviours:Lu(c.tmenuBehaviours,[jc.config({mode:"special",onRight:p(function(n,e){return eu(e.element)?mn.none():g(n,e,d.HighlightSubmenu)}),onLeft:p(function(n,e){return eu(e.element)?mn.none():o(n,e)}),onEscape:p(function(n,e){return o(n,e).orThunk(function(){return c.onEscape(n,e).map(function(){return n})})}),focusIn:function(e,n){m.getPrimary().each(function(n){nn(e,n.element,ne())})}}),Qi.config({highlightClass:c.markers.selectedMenu,itemClass:c.markers.menu}),ed.config({find:function(n){return Qi.getHighlighted(n)}}),jd.config({})]),eventOrder:c.eventOrder,apis:b,events:v}},extraApis:{tieredData:function(n,e,t){return{primary:n,menus:e,expansions:t}},singleData:function(n,e){return{primary:n,menus:yo(n,e),expansions:{}}},collapseItem:function(n){return{value:Gu(Ud()),meta:{text:n}}}}}),Xd=function(n,e,t,o){return El(0,e,0,o).bind(function(e){return e.transition.map(function(n){return{transition:n,route:e}})})},qd=function(e,t,n){return Ae(e.element,t.destinationAttr).map(function(n){return{start:Be(e.element,t.stateAttr),destination:n}})},Yd=Object.freeze({__proto__:null,findRoute:El,disableTransition:Dl,getCurrentRoute:qd,jumpTo:Ml,progressTo:function(t,o,r,i){var e,u=o;Ne((e=t).element,u.destinationAttr)&&(Ae(e.element,u.destinationAttr).each(function(n){Ie(e.element,u.stateAttr,n)}),He(e.element,u.destinationAttr));var n,c=(n=i,{start:Be(t.element,o.stateAttr),destination:n});Xd(t,o,r,c).fold(function(){Ml(t,o,r,i)},function(n){Dl(t,o,r);var e=n.transition;je(t.element,e.transitionClass),Ie(t.element,o.destinationAttr,i)})},getState:function(n,e,t){return Ae(n.element,e.stateAttr)}}),Kd=Object.freeze({__proto__:null,events:function(r,i){return qo([Eo(Wn(),function(t,n){var o=n.event.raw;qd(t,r).each(function(e){El(0,r,0,e).each(function(n){n.transition.each(function(n){o.propertyName===n.property&&(Ml(t,r,i,e.destination),r.onTransition(t,e))})})})}),Yo(function(n,e){Ml(n,r,i,r.initialState)})])}}),Jd=Ao({fields:[Yt("destinationAttr","data-transitioning-destination"),Yt("stateAttr","data-transitioning-state"),Lt("initialState"),kr("onTransition"),kr("onFinish"),$t("routes",Nt(ht.value,Nt(ht.value,It([qt("transition",[Lt("property"),Lt("transitionClass")])]))))],name:"transitioning",active:Kd,apis:Yd,extra:{createRoutes:function(n){var o={};return Ee(n,function(n,e){var t=e.split("<->");o[t[0]]=yo(t[1],n),o[t[1]]=yo(t[0],n)}),o},createBistate:function(n,e,t){return xo([{key:n,value:yo(e,t)},{key:e,value:yo(n,t)}])},createTristate:function(n,e,t,o){return xo([{key:n,value:xo([{key:e,value:o},{key:t,value:o}])},{key:e,value:xo([{key:n,value:o},{key:t,value:o}])},{key:t,value:xo([{key:n,value:o},{key:e,value:o}])}])}}}),Qd=ci("scrollable"),Zd=Qd,nm=function(n,e,t,o,r){return{data:{value:n,text:e},type:"item",dom:{tag:"div",classes:r?[ci("styles-item-is-menu")]:[]},toggling:{toggleOnExecute:!1,toggleClass:ci("format-matches"),selected:t},itemBehaviours:or(r?[]:[Ar(n,function(n,e){(e?ii.on:ii.off)(n)})]),components:[{dom:{tag:"div",attributes:{style:o},innerHtml:e}}]}},em=function(n,e,t,o){return{value:n,dom:{tag:"div"},components:[Qs.sketch({dom:{tag:"div",classes:[ci("styles-collapser")]},components:o?[{dom:{tag:"span",classes:[ci("styles-collapse-icon")]}},wl(n)]:[wl(n)],action:function(n){var e;o&&(e=t().get(n),Wd.collapseMenu(e))}}),{dom:{tag:"div",classes:[ci("styles-menu-items-container")]},components:[Pd.parts.items({})],behaviours:or([el("adhoc-scrollable-menu",[Yo(function(n,e){$r(n.element,"overflow-y","auto"),$r(n.element,"-webkit-overflow-scrolling","touch"),_l(n.element)}),Ko(function(n){Xr(n.element,"overflow-y"),Xr(n.element,"-webkit-overflow-scrolling"),Rl(n.element)})])])}],items:e,menuBehaviours:or([Jd.config({initialState:"after",routes:Jd.createTristate("before","current","after",{transition:{property:"transform",transitionClass:"transitioning"}})})])}},tm=function(n){return _(n,function(n,e){var t=Il(e);return{menus:co(n.menus,t.menus),items:[t.item].concat(n.items),expansions:co(n.expansions,t.expansions)}},{menus:{},expansions:{},items:[]})},om=function(n){return B(n,function(n){return(D(n)?om:Bl)(n)})},rm=function(n,e,t,o){n.dom.removeEventListener(e,t,o)},im=x,um=tinymce.util.Tools.resolve("tinymce.util.Delay"),cm=Jt([{ltr:["start","soffset","finish","foffset"]},{rtl:["start","soffset","finish","foffset"]}]);function am(n,e){var t=le(n);return"input"===t?mg.after(n):T(["br","img"],t)?0===e?mg.before(n):mg.after(n):mg.on(n,e)}function sm(n){return mn.from(n.getSelection())}function fm(n,e,t,o,r){var i=Gl(n,e,t,o,r);sm(n).each(function(n){n.removeAllRanges(),n.addRange(i)})}function lm(n,e,t,o,r){var i,u,c,a,s,f=(i=o,u=r,c=am(e,t),a=am(i,u),pg.relative(c,a));Xl(s=n,f).match({ltr:function(n,e,t,o){fm(s,n,e,t,o)},rtl:function(r,i,u,c){sm(s).each(function(n){if(n.setBaseAndExtent)n.setBaseAndExtent(r.dom,i,u.dom,c);else if(n.extend)try{t=u,o=c,(e=n).collapse(r.dom,i),e.extend(t.dom,o)}catch(n){fm(s,u,c,r,i)}else fm(s,u,c,r,i);var e,t,o})}})}function dm(n){if(0<n.rangeCount){var e=n.getRangeAt(0),t=n.getRangeAt(n.rangeCount-1);return mn.some(fg(fe.fromDom(e.startContainer),e.startOffset,fe.fromDom(t.endContainer),t.endOffset))}return mn.none()}function mm(n){if(null===n.anchorNode||null===n.focusNode)return dm(n);var e,t,o,r,i,u,c,a,s,f,l,d=fe.fromDom(n.anchorNode),m=fe.fromDom(n.focusNode);return e=d,t=n.anchorOffset,o=m,r=n.focusOffset,u=t,c=o,a=r,(s=me(i=e).dom.createRange()).setStart(i.dom,u),s.setEnd(c.dom,a),f=s,l=un(e,o)&&t===r,f.collapsed&&!l?mn.some(fg(d,n.anchorOffset,m,n.focusOffset)):dm(n)}function gm(n){return sm(n).filter(function(n){return 0<n.rangeCount}).bind(mm)}function pm(n,e){var i,t,o,r=(t=Xl(i=n,e).match({ltr:function(n,e,t,o){var r=i.document.createRange();return r.setStart(n.dom,e),r.setEnd(t.dom,o),r},rtl:function(n,e,t,o){var r=i.document.createRange();return r.setStart(t.dom,o),r.setEnd(n.dom,e),r}})).getClientRects();return 0<(o=0<r.length?r[0]:t.getBoundingClientRect()).width||0<o.height?mn.some(o).map(Ul):mn.none()}function hm(n){return mn.from(n.dom.contentWindow)}function vm(n){return hm(n).bind(gm)}function bm(n){return n.getFrame()}function ym(n,e,t,o){return n[t].getOrThunk(function(){return function(n){return Pl(e,o,n)}})}function xm(c){var a=bm(c);return mn.some(fe.fromDom(a.dom.contentWindow.document.body)).bind(function(u){return mn.some(fe.fromDom(a.dom.contentWindow.document)).bind(function(i){return hm(a).map(function(r){var n=fe.fromDom(i.dom.documentElement),e=c.getCursorBox.getOrThunk(function(){return function(){return gm(r).map(function(n){return pg.exact(n.start,n.soffset,n.finish,n.foffset)}).bind(function(n){return pm(r,n).orThunk(function(){return gm(r).filter(function(n){return un(n.start,n.finish)&&n.soffset===n.foffset}).bind(function(n){var e=n.start.dom.getBoundingClientRect();return 0<e.width||0<e.height?mn.some(e):mn.none()})})})}}),t=c.setSelection.getOrThunk(function(){return function(n,e,t,o){lm(r,n,e,t,o)}}),o=c.clearSelection.getOrThunk(function(){return function(){sm(r).each(function(n){return n.removeAllRanges()})}});return{body:u,doc:i,win:r,html:n,getSelection:J(vm,a),setSelection:t,clearSelection:o,frame:a,onKeyup:ym(c,i,"onKeyup","keyup"),onNodeChanged:ym(c,i,"onNodeChanged","SelectionChange"),onDomChanged:c.onDomChanged,onScrollToCursor:c.onScrollToCursor,onScrollToElement:c.onScrollToElement,onToReading:c.onToReading,onToEditing:c.onToEditing,onToolbarScrollStart:c.onToolbarScrollStart,onTouchContent:c.onTouchContent,onTapContent:c.onTapContent,onTouchToolstrip:c.onTouchToolstrip,getCursorBox:e}})})})}function wm(){var e=rn("head").getOrDie(),n=rn('meta[name="viewport"]').getOrThunk(function(){var n=fe.fromTag("meta");return Ie(n,"name","viewport"),Qe(e,n),n}),t=Be(n,"content");return{maximize:function(){Ie(n,"content","width=device-width, initial-scale=1.0, user-scalable=no, maximum-scale=1.0")},restore:function(){null!=t&&0<t.length?Ie(n,"content",t):Ie(n,"content","user-scalable=yes")}}}function Sm(n,e){function t(o){return function(n){var e=Be(n,"style"),t=void 0===e?"no-styles":e.trim();t===o||(Ie(n,vg,t),Ie(n,"style",o))}}var o,r,i=(r=function(n){return en(n,"*")},E(function(n,e){for(var t=m(e)?e:S,o=n.dom,r=[];null!==o.parentNode&&void 0!==o.parentNode;){var i=o.parentNode,u=fe.fromDom(i);if(r.push(u),!0===t(u))break;o=i}return r}(n,void 0),r)),u=B(i,function(n){return e=function(n){return en(n,"*")},E(pe(t=n).map(Je).map(function(n){return E(n,function(n){return!un(t,n)})}).getOr([]),e);var e,t}),c=void 0!==(o=Ur(e,"background-color"))&&""!==o?"background-color:"+o+"!important":"background-color:rgb(255,255,255)!important;";M(u,t("display:none!important;")),M(i,t(bg+yg+c)),t((!0===xg?"":bg)+yg+c)(n)}function Om(){M(on("["+vg+"]"),function(n){var e=Be(n,vg);"no-styles"!==e?Ie(n,"style",e):He(n,"style"),He(n,vg)})}function km(n){var e=n.raw;return void 0===e.touches||1!==e.touches.length?mn.none():mn.some(e.touches[0])}function Tm(t){var o,r,u=cu(),i=No(!1),c=(o=function(n){t.triggerEvent(te(),n),i.set(!0)},r=null,{cancel:function(){null!==r&&(clearTimeout(r),r=null)},schedule:function(){for(var n=[],e=0;e<arguments.length;e++)n[e]=arguments[e];r=setTimeout(function(){o.apply(null,n),r=null},400)}}),a=xo([{key:Vn(),value:function(t){return km(t).each(function(n){c.cancel();var e={x:n.clientX,y:n.clientY,target:t.target};c.schedule(t),i.set(!1),u.set(e)}),mn.none()}},{key:Bn(),value:function(n){return c.cancel(),km(n).each(function(i){u.on(function(n){var e=i,t=n,o=Math.abs(e.clientX-t.x),r=Math.abs(e.clientY-t.y);(5<o||5<r)&&u.clear()})}),mn.none()}},{key:An(),value:function(e){return c.cancel(),u.get().filter(function(n){return un(n.target,e.target)}).map(function(n){return i.get()?(e.prevent(),!1):t.triggerEvent(ee(),e)})}}]);return{fireIfReady:function(e,n){return _e(a,n).bind(function(n){return n(e)})}}}function Cm(t){var e=Tm({triggerEvent:function(n,e){t.onTapContent(e)}});return{fireTouchstart:function(n){e.fireIfReady(n,"touchstart")},onTouchend:function(){return Pl(t.body,"touchend",function(n){e.fireIfReady(n,"touchend")})},onTouchmove:function(){return Pl(t.body,"touchmove",function(n){e.fireIfReady(n,"touchmove")})}}}function Em(n,e){var t=parseInt(Be(n,e),10);return isNaN(t)?0:t}function Dm(n){return y(y({},n),{width:2})}function Mm(n){return{left:n.left,top:n.top,right:n.right,bottom:n.bottom,width:n.width,height:n.height}}function _m(n){var e=n.getSelection();return void 0!==e&&0<e.rangeCount?function(o){if(o.collapsed){var r=fe.fromDom(o.startContainer);return pe(r).bind(function(n){var e,t=pg.exact(r,o.startOffset,n,"img"===le(e=n)?1:lg.getOption(e).fold(function(){return Je(e).length},function(n){return n.length}));return pm(o.startContainer.ownerDocument.defaultView,t).map(Dm).map(P)}).getOr([])}return Z(o.getClientRects(),Mm)}(e.getRangeAt(0)):[]}function Rm(n,e){Ie(n,Sg,e)}function Fm(n){return{top:n.top,bottom:n.top+n.height}}function Im(o,r){var i=fe.fromDom(r.document.body),n=Pl(fe.fromDom(o),"resize",function(){var n,e,t;n=o,e=Em(i,Sg),((t=n.innerHeight)<e?mn.some(e-t):mn.none()).each(function(t){var n;(0<(n=_m(r)).length?mn.some(n[0]).map(Fm):mn.none()).each(function(n){var e=n.top>r.innerHeight||n.bottom>r.innerHeight?Math.min(t,n.bottom-r.innerHeight+50):0;0!==e&&r.scrollTo(r.pageXOffset,r.pageYOffset+e)})}),Rm(i,o.innerHeight)});return Rm(i,o.innerHeight),{toEditing:function(){!function(n){n.focus();var e=fe.fromDom(n.document.body);(zo().exists(function(n){return T(["input","textarea"],le(n))})?function(n){um.setTimeout(function(){n()},0)}:p)(function(){zo().each(Po),Ho(e)})}(r)},destroy:function(){n.unbind()}}}function Vm(t,o){function r(){s(i)||(clearTimeout(i),i=null)}var i=null;return{cancel:r,throttle:function(){for(var n=[],e=0;e<arguments.length;e++)n[e]=arguments[e];r(),i=setTimeout(function(){i=null,t.apply(null,n)},o)}}}function Bm(n){var t,o,e=Ns(td.sketch({dom:Oa('<div aria-hidden="true" class="${prefix}-mask-tap-icon"></div>'),containerBehaviours:or([ii.config({toggleClass:ci("mask-tap-icon-selected"),toggleOnExecute:!1})])})),r=(t=n,o=null,{cancel:function(){s(o)||(clearTimeout(o),o=null)},throttle:function(){for(var n=[],e=0;e<arguments.length;e++)n[e]=arguments[e];s(o)&&(o=setTimeout(function(){o=null,t.apply(null,n)},200))}});return td.sketch({dom:Oa('<div class="${prefix}-disabled-mask"></div>'),components:[td.sketch({dom:Oa('<div class="${prefix}-content-container"></div>'),components:[Qs.sketch({dom:Oa('<div class="${prefix}-content-tap-section"></div>'),components:[e.asSpec()],action:function(n){r.throttle()},buttonBehaviours:or([ii.config({toggleClass:ci("mask-tap-icon-selected")})])})]})]})}function Am(n){var e=zt("Getting AndroidWebapp schema",kg,n);$r(e.toolstrip,"width","100%");var t=Td(Bm(function(){e.setReadOnly(e.readOnlyOnInit()),c.enter()},e.translate));e.alloy.add(t);var o={show:function(){e.alloy.add(t)},hide:function(){e.alloy.remove(t)}};Qe(e.container,t.element);var s,r,i,u,f,c=(s=e,r=o,i=wm(),u=uu(),f=uu(),{enter:function(){r.hide(),je(s.container,ci("fullscreen-maximized")),je(s.container,ci("android-maximized")),i.maximize(),je(s.body,ci("android-scroll-reload")),u.set(Im(s.win,hg(s.editor).getOrDie("no"))),xm(s.editor).each(function(n){function e(n){return!un(n.start,n.finish)||n.soffset!==n.foffset}function t(){var n=o.doc.dom.hasFocus()&&o.getSelection().exists(e);i.getByDom(r).each(!0===(n||zo(c).filter(function(n){return"input"===le(n)}).exists(function(n){return n.dom.selectionStart!==n.dom.selectionEnd}))?ii.on:ii.off)}var o,r,i,u,c,a;Sm(s.container,n.body),f.set((o=n,r=s.toolstrip,i=s.alloy,u=Cm(o),c=me(r),a=[Pl(o.body,"touchstart",function(n){o.onTouchContent(),u.fireTouchstart(n)}),u.onTouchmove(),u.onTouchend(),Pl(r,"touchstart",function(n){o.onTouchToolstrip()}),o.onToReading(function(){Po(o.body)}),o.onToEditing(Y),o.onScrollToCursor(function(n){n.preventDefault(),o.getCursorBox().each(function(n){var e=o.win,t=n.top>e.innerHeight||n.bottom>e.innerHeight?n.bottom-e.innerHeight+50:0;0!=t&&e.scrollTo(e.pageXOffset,e.pageYOffset+t)})})].concat(1==wg?[]:[Pl(fe.fromDom(o.win),"blur",function(){i.getByDom(r).each(ii.off)}),Pl(c,"select",t),Pl(o.doc,"selectionchange",t)]),{destroy:function(){M(a,function(n){n.unbind()})}}))})},exit:function(){i.restore(),r.show(),Le(s.container,ci("fullscreen-maximized")),Le(s.container,ci("android-maximized")),Om(),Le(s.body,ci("android-scroll-reload")),f.clear(),u.clear()}});return{setReadOnly:e.setReadOnly,refreshStructure:Y,enter:c.enter,exit:c.exit,destroy:Y}}function Nm(n){return"true"===Be(n,Rg)?0<n.dom.scrollLeft||function(n){n.dom.scrollLeft=1;var e=0!==n.dom.scrollLeft;return n.dom.scrollLeft=0,e}(n):0<n.dom.scrollTop||function(n){n.dom.scrollTop=1;var e=0!==n.dom.scrollTop;return n.dom.scrollTop=0,e}(n)}function Hm(){function e(n){var e=!0===n.scrollable?"${prefix}-toolbar-scrollable-group":"";return{dom:Oa('<div aria-label="'+n.label+'" class="${prefix}-toolbar-group '+e+'"></div>'),tgroupBehaviours:or([el("adhoc-scrollable-toolbar",!0===n.scrollable?[Jo(function(n,e){$r(n.element,"overflow-x","auto"),Ie(n.element,Rg,"true"),_l(n.element)})]:[])]),components:[td.sketch({components:[_g.parts.items({})]})],markers:{itemSelector:"."+ci("toolbar-group-item")},items:n.items}}function t(){Eg.setGroups(o,r.get()),ii.off(o)}var o=Td(Eg.sketch({dom:Oa('<div class="${prefix}-toolbar"></div>'),components:[Eg.parts.groups({})],toolbarBehaviours:or([ii.config({toggleClass:ci("context-toolbar"),toggleOnExecute:!1,aria:{mode:"none"}}),jc.config({mode:"cyclic"})]),shell:!0})),n=Td(td.sketch({dom:{classes:[ci("toolstrip")]},components:[Cd(o)],containerBehaviours:or([ii.config({toggleClass:ci("android-selection-context-toolbar"),toggleOnExecute:!1})])})),r=No([]);return{wrapper:n,toolbar:o,createGroups:function(n){return Z(n,i(_g.sketch,e))},setGroups:function(n){r.set(n),t()},setContextToolbar:function(n){ii.on(o),Eg.setGroups(o,n)},restoreToolbar:function(){ii.isOn(o)&&t()},refresh:function(){},focus:function(){jc.focusIn(o)}}}function Pm(n){return Td(Qs.sketch({dom:Oa('<div class="${prefix}-mask-edit-icon ${prefix}-icon"></div>'),action:function(){n.run(function(n){n.setReadOnly(!1)})}}))}function zm(){return Td(td.sketch({dom:Oa('<div class="${prefix}-editor-socket"></div>'),components:[],containerBehaviours:or([jd.config({})])}))}function jm(n,e,t,o){(!0===t?cr.toAlpha:cr.toOmega)(o),(t?function(n,e){jd.append(n,Cd(e))}:function(n,e){jd.remove(n,e)})(n,e)}function Lm(e,n){return n.getAnimationRoot.fold(function(){return e.element},function(n){return n(e)})}function $m(n){return n.dimension.property}function Gm(n,e){return n.dimension.getDimension(e)}function Um(n,e){hl(Lm(n,e),[e.shrinkingClass,e.growingClass])}function Wm(n,e){Le(n.element,e.openClass),je(n.element,e.closedClass),$r(n.element,$m(e),"0px"),qr(n.element)}function Xm(n,e){Le(n.element,e.closedClass),je(n.element,e.openClass),Xr(n.element,$m(e))}function qm(n,e,t,o){t.setCollapsed(),$r(n.element,$m(e),Gm(e,n.element)),qr(n.element),Um(n,e),Wm(n,e),e.onStartShrink(n),e.onShrunk(n)}function Ym(n,e,t){var o=Gm(e,n.element);("0px"===o?qm:function(n,e,t,o){var r=o.getOrThunk(function(){return Gm(e,n.element)});t.setCollapsed(),$r(n.element,$m(e),r),qr(n.element);var i=Lm(n,e);Le(i,e.growingClass),je(i,e.shrinkingClass),Wm(n,e),e.onStartShrink(n)})(n,e,t,mn.some(o))}function Km(n,e,t){var o=Lm(n,e),r=$e(o,e.shrinkingClass),i=Gm(e,n.element);Xm(n,e);var u=Gm(e,n.element);(r?function(){$r(n.element,$m(e),i),qr(n.element)}:function(){Wm(n,e)})(),Le(o,e.shrinkingClass),je(o,e.growingClass),Xm(n,e),$r(n.element,$m(e),u),t.setExpanded(),e.onStartGrow(n)}function Jm(n,e,t){return!0===$e(Lm(n,e),e.growingClass)}function Qm(n,e,t){return!0===$e(Lm(n,e),e.shrinkingClass)}function Zm(e,t){var o=Td(td.sketch({dom:{tag:"div",classes:[ci("dropup")]},components:[],containerBehaviours:or([jd.config({}),Vg.config({closedClass:ci("dropup-closed"),openClass:ci("dropup-open"),shrinkingClass:ci("dropup-shrinking"),growingClass:ci("dropup-growing"),dimension:{property:"height"},onShrunk:function(n){e(),t(),jd.set(n,[])},onGrown:function(n){e(),t()}}),Nr(function(n,e){r(Y)})])})),r=function(n){window.requestAnimationFrame(function(){n(),Vg.shrink(o)})};return{appear:function(n,e,t){!0===Vg.hasShrunk(o)&&!1===Vg.isTransitioning(o)&&window.requestAnimationFrame(function(){e(t),jd.set(o,[n()]),Vg.grow(o)})},disappear:r,component:o,element:o.element}}function ng(){return Fn().browser.isFirefox()}function eg(e,n){var t,o,r,i,u=y({stopBackspace:!0},n),c=Tm(u),a=Z(["touchstart","touchmove","touchend","touchcancel","gesturestart","mousedown","mouseup","mouseover","mousemove","mouseout","click"].concat(["selectstart","input","contextmenu","change","transitionend","transitioncancel","drag","dragstart","dragend","dragenter","dragleave","dragover","drop","keyup"]),function(n){return Pl(e,n,function(e){c.fireIfReady(e,n).each(function(n){n&&e.kill()}),u.triggerEvent(n,e)&&e.kill()})}),s=cu(),f=Pl(e,"paste",function(e){c.fireIfReady(e,"paste").each(function(n){n&&e.kill()}),u.triggerEvent("paste",e)&&e.kill(),s.set(setTimeout(function(){u.triggerEvent(Jn(),e)},0))}),l=Pl(e,"keydown",function(n){var e;u.triggerEvent("keydown",n)?n.kill():!u.stopBackspace||((e=n).raw.which!==ji[0]||T(["input","textarea"],le(e.target))||vi(e.target,'[contenteditable="true"]',void 0).isSome())||n.prevent()}),d=(t=e,o=function(n){u.triggerEvent("focusin",n)&&n.kill()},ng()?zl(t,"focus",o):Pl(t,"focusin",o)),m=cu(),g=(r=e,i=function(n){u.triggerEvent("focusout",n)&&n.kill(),m.set(setTimeout(function(){u.triggerEvent(Kn(),n)},0))},ng()?zl(r,"blur",i):Pl(r,"focusout",i));return{unbind:function(){M(a,function(n){n.unbind()}),l.unbind(),d.unbind(),g.unbind(),f.unbind(),s.on(clearTimeout),m.on(clearTimeout)}}}function tg(n,e){return No(_e(n,"target").getOr(e))}function og(n,o,e,t,r,i){var u,c,a=n(o,t),s=(u=No(!1),c=No(!1),{stop:function(){u.set(!0)},cut:function(){c.set(!0)},isStopped:u.get,isCut:c.get,event:e,setSource:r.set,getSource:r.get});return a.fold(function(){return i.logEventNoHandlers(o,t),Bg.complete()},function(e){var t=e.descHandler;return dl(t)(s),s.isStopped()?(i.logEventStopped(o,e.element,t.purpose),Bg.stopped()):s.isCut()?(i.logEventCut(o,e.element,t.purpose),Bg.complete()):pe(e.element).fold(function(){return i.logNoParent(o,e.element,t.purpose),Bg.complete()},function(n){return i.logEventResponse(o,e.element,t.purpose),Bg.resume(n)})})}function rg(){var u={};return{registerId:function(r,i,n){Ee(n,function(n,e){var t,o=void 0!==u[e]?u[e]:{};o[i]={cHandler:J.apply(void 0,[(t=n).handler].concat(r)),purpose:t.purpose},u[e]=o})},unregisterId:function(t){Ee(u,function(n,e){dt(n,t)&&delete n[t]})},filterByType:function(n){return _e(u,n).map(function(n){return Me(n,function(n,e){return{id:e,descHandler:n}})}).getOr([])},find:function(r,n,c){return _e(u,n).bind(function(o){return e=r,t=(n=function(n){return e=o,ba(t=n).bind(function(n){return _e(e,n)}).map(function(n){return{element:t,descHandler:n}});var e,t})(i=c),u=Oo(e),t.orThunk(function(){return u(i)?mn.none():function(n){for(var e=i.dom,t=Oo(u);e.parentNode;){var e=e.parentNode,o=fe.fromDom(e),r=n(o);if(r.isSome())return r;if(t(o))break}return mn.none()}(n)});var i,n,e,t,u})}}}function ig(){function r(n){ba(n.element).each(function(n){delete u[n],i.unregisterId(n)})}var i=rg(),u={};return{find:function(n,e,t){return i.find(n,e,t)},filter:function(n){return i.filterByType(n)},register:function(n){var t,o=ba((t=n).element).getOrThunk(function(){return n=t.element,e=Gu(Us+"uid-"),Xs(n,e),e;var n,e});Re(u,o)&&function(n){var e=u[o];if(e!==n)throw new Error('The tagId "'+o+'" is already used by: '+$o(e.element)+"\nCannot use it for: "+$o(n.element)+"\nThe conflicting element is"+(rt(e.element)?" ":" not ")+"already in the DOM");r(n)}(n),i.registerId([n],o,n.events),u[o]=n},unregister:r,getById:function(n){return _e(u,n)}}}cm.ltr,cm.rtl;function ug(n,e,t,o,r){var i=tg(t,o);return Ag(n,e,t,o,i,r)}var cg,ag,sg,fg=function(n,e,t,o){return{start:n,soffset:e,finish:t,foffset:o}},lg=(cg=qe,{get:function(n){if(!cg(n))throw new Error("Can only get text value of a text node");return ag(n).getOr("")},getOption:ag=function(n){return cg(n)?mn.from(n.dom.nodeValue):mn.none()},set:function(n,e){if(!cg(n))throw new Error("Can only set raw text value of a text node");n.dom.nodeValue=e}}),dg=Jt([{before:["element"]},{on:["element","offset"]},{after:["element"]}]),mg={before:dg.before,on:dg.on,after:dg.after,cata:function(n,e,t,o){return n.fold(e,t,o)},getStart:function(n){return n.fold(K,K,K)}},gg=Jt([{domRange:["rng"]},{relative:["startSitu","finishSitu"]},{exact:["start","soffset","finish","foffset"]}]),pg={domRange:gg.domRange,relative:gg.relative,exact:gg.exact,exactFromRange:function(n){return gg.exact(n.start,n.soffset,n.finish,n.foffset)},getWin:function(n){var e=n.match({domRange:function(n){return fe.fromDom(n.startContainer)},relative:function(n,e){return mg.getStart(n)},exact:function(n,e,t,o){return n}});return fe.fromDom(ge(e).dom.defaultView)},range:fg},hg=(sg=hm,function(e){return e.getWin.getOrThunk(function(){var n=bm(e);return function(){return sg(n)}})()}),vg="data-ephox-mobile-fullscreen-style",bg="position:absolute!important;",yg="top:0!important;left:0!important;margin:0!important;padding:0!important;width:100%!important;height:100%!important;overflow:visible!important;",xg=Fn().os.isAndroid(),wg=6<=Fn().os.version.major,Sg="data-"+ci("last-outer-height"),Og=w({unbind:Y}),kg=lo([Gt("editor",[Lt("getFrame"),Ut("getBody"),Ut("getDoc"),Ut("getWin"),Ut("getSelection"),Ut("setSelection"),Ut("clearSelection"),Ut("cursorSaver"),Ut("onKeyup"),Ut("onNodeChanged"),Ut("getCursorBox"),Lt("onDomChanged"),Yt("onTouchContent",Y),Yt("onTapContent",Y),Yt("onTouchToolstrip",Y),Yt("onScrollToCursor",Og),Yt("onScrollToElement",Og),Yt("onToEditing",Og),Yt("onToReading",Og),Yt("onToolbarScrollStart",K)]),Lt("socket"),Lt("toolstrip"),Lt("dropup"),Lt("toolbar"),Lt("container"),Lt("alloy"),vo("win",function(n){return me(n.socket).dom.defaultView}),vo("body",function(n){return fe.fromDom(n.socket.dom.ownerDocument.body)}),Yt("translate",K),Yt("setReadOnly",Y),Yt("readOnlyOnInit",x)]),Tg=w([Lt("dom"),Yt("shell",!0),ju("toolbarBehaviours",[jd])]),Cg=w([Hs({name:"groups",overrides:function(){return{behaviours:or([jd.config({})])}}})]),Eg=Sa({name:"Toolbar",configFields:Tg(),partFields:Cg(),factory:function(o,n,e,t){var r=o.shell?{behaviours:[jd.config({})],components:[]}:{behaviours:[],components:n};return{uid:o.uid,dom:o.dom,components:r.components,behaviours:Lu(o.toolbarBehaviours,r.behaviours),apis:{setGroups:function(n,e){var t;t=n,(o.shell?mn.some(t):ma(t,o,"groups")).fold(function(){throw console.error("Toolbar was defined to not be a shell, but no groups container was specified in components"),new Error("Toolbar was defined to not be a shell, but no groups container was specified in components")},function(n){jd.set(n,e)})}},domModification:{attributes:{role:"group"}}}},apis:{setGroups:function(n,e,t){n.setGroups(e,t)}}}),Dg=w([Lt("items"),Gt("markers",Z(["itemSelector"],Lt)),ju("tgroupBehaviours",[jc])]),Mg=w([Ps({name:"items",unit:"item"})]),_g=Sa({name:"ToolbarGroup",configFields:Dg(),partFields:Mg(),factory:function(n,e,t,o){return{uid:n.uid,dom:n.dom,components:e,behaviours:Lu(n.tgroupBehaviours,[jc.config({mode:"flow",selector:n.markers.itemSelector})]),domModification:{attributes:{role:"toolbar"}}}}}),Rg="data-"+ci("horizontal-scroll"),Fg=Object.freeze({__proto__:null,refresh:function(n,e,t){var o;t.isExpanded()&&(Xr(n.element,$m(e)),o=Gm(e,n.element),$r(n.element,$m(e),o))},grow:function(n,e,t){t.isExpanded()||Km(n,e,t)},shrink:function(n,e,t){t.isExpanded()&&Ym(n,e,t)},immediateShrink:function(n,e,t){t.isExpanded()&&qm(n,e,t)},hasGrown:function(n,e,t){return t.isExpanded()},hasShrunk:function(n,e,t){return t.isCollapsed()},isGrowing:Jm,isShrinking:Qm,isTransitioning:function(n,e,t){return Jm(n,e)||Qm(n,e)},toggleGrow:function(n,e,t){(t.isExpanded()?Ym:Km)(n,e,t)},disableTransitions:Um}),Ig=Object.freeze({__proto__:null,exhibit:function(n,e,t){return Io(e.expanded?{classes:[e.openClass],styles:{}}:{classes:[e.closedClass],styles:yo(e.dimension.property,"0px")})},events:function(t,o){return qo([Mo(Wn())(function(n,e){e.event.raw.propertyName===t.dimension.property&&(Um(n,t),o.isExpanded()&&Xr(n.element,t.dimension.property),(o.isExpanded()?t.onGrown:t.onShrunk)(n))})])}}),Vg=Ao({fields:[Lt("closedClass"),Lt("openClass"),Lt("shrinkingClass"),Lt("growingClass"),Ut("getAnimationRoot"),kr("onShrunk"),kr("onStartShrink"),kr("onGrown"),kr("onStartGrow"),Yt("expanded",!1),$t("dimension",jt("property",{width:[Dr("property","width"),Dr("getDimension",function(n){return Ba(n)+"px"})],height:[Dr("property","height"),Dr("getDimension",function(n){return Kr(n)+"px"})]}))],name:"sliding",active:Ig,apis:Fg,state:Object.freeze({__proto__:null,init:function(n){var e=No(n.expanded);return tr({isExpanded:function(){return!0===e.get()},isCollapsed:function(){return!1===e.get()},setCollapsed:J(e.set,!1),setExpanded:J(e.set,!0),readState:function(){return"expanded: "+e.get()}})}})}),Bg=Jt([{stopped:[]},{resume:["element"]},{complete:[]}]),Ag=function(e,t,o,n,r,i){return og(e,t,o,n,r,i).fold(x,function(n){return Ag(e,t,o,n,r,i)},S)},Ng=function(t){function o(e){return pe(t.element).fold(x,function(n){return un(e,n)})}function s(n,e){return i.find(o,n,e)}function r(e){M(i.filter(Qn()),function(n){dl(n.descHandler)(e)})}var i=ig(),n=eg(t.element,{triggerEvent:function(e,t){return vr(e,t.target,function(n){return ug(s,e,t,t.target,n)})}}),u={debugInfo:w("real"),triggerEvent:function(e,t,o){vr(e,t,function(n){return ug(s,e,o,t,n)})},triggerFocus:function(c,a){ba(c).fold(function(){Ho(c)},function(n){vr(Yn(),c,function(n){var e,t,o=s,r=Yn(),i=n,u=tg(e={originator:a,kill:Y,prevent:Y,target:c},t=c);return og(o,r,e,t,u,i),!1})})},triggerEscape:function(n,e){u.triggerEvent("keydown",n.element,e.event)},getByUid:function(n){return g(n)},getByDom:function(n){return p(n)},build:Td,addToGui:function(n){a(n)},removeFromGui:function(n){f(n)},addToWorld:function(n){e(n)},removeFromWorld:function(n){c(n)},broadcast:function(n){l(n)},broadcastOn:function(n,e){d(n,e)},broadcastEvent:function(n,e){m(n,e)},isConnected:x},e=function(n){n.connect(u),qe(n.element)||(i.register(n),M(n.components(),e),u.triggerEvent(oe(),n.element,{target:n.element}))},c=function(n){qe(n.element)||(M(n.components(),c),i.unregister(n)),n.disconnect()},a=function(n){at(t,n,Qe)},f=function(n){Ce(n)},l=function(n){r({universal:!0,data:n})},d=function(n,e){r({universal:!1,channels:n,data:e})},m=function(n,e){var t,o,r=i.filter(n);return o={stop:function(){t.set(!0)},cut:Y,isStopped:(t=No(!1)).get,isCut:S,event:e,setSource:h("Cannot set source of a broadcasted event"),getSource:h("Cannot get source of a broadcasted event")},M(r,function(n){dl(n.descHandler)(o)}),o.isStopped()},g=function(n){return i.getById(n).fold(function(){return ht.error(new Error('Could not find component with uid: "'+n+'" in system.'))},ht.value)},p=function(n){var e=ba(n).getOr("not found");return g(e)};return e(t),{root:t,element:t.element,destroy:function(){n.unbind(),Ze(t.element)},add:a,remove:f,getByUid:g,getByDom:p,addToWorld:e,removeFromWorld:c,broadcast:l,broadcastOn:d,broadcastEvent:m}},Hg=ci("readonly-mode"),Pg=ci("edit-mode");function zg(n){var e=Td(td.sketch({dom:{classes:[ci("outer-container")].concat(n.classes)},containerBehaviours:or([cr.config({alpha:Hg,omega:Pg})])}));return Ng(e)}function jg(n,e){var t=fe.fromTag("input");Gr(t,{opacity:"0",position:"absolute",top:"-1000px",left:"-1000px"}),Qe(n,t),Ho(t),e(t),Ze(t)}function Lg(n){var e,t,o=n.getSelection();0<o.rangeCount&&(e=o.getRangeAt(0),(t=n.document.createRange()).setStart(e.startContainer,e.startOffset),t.setEnd(e.endContainer,e.endOffset),o.removeAllRanges(),o.addRange(t))}function $g(n,e){zo().each(function(n){un(n,e)||Po(n)}),n.focus(),Ho(fe.fromDom(n.document.body)),Lg(n)}function Gg(n,e,t,o){function r(){$g(e,o)}var i=Pl(t,"keydown",function(n){T(["input","textarea"],le(n.target))||r()});return{toReading:function(){jg(n,Po)},toEditing:r,onToolbarTouch:Y,destroy:function(){i.unbind()}}}function Ug(n){setTimeout(function(){throw n},0)}function Wg(n){var o,r,e=jl(n).isPortrait(),t=(o=n.screen.width,r=n.screen.height,z([{width:320,height:480,keyboard:{portrait:300,landscape:240}},{width:320,height:568,keyboard:{portrait:300,landscape:240}},{width:375,height:667,keyboard:{portrait:305,landscape:240}},{width:414,height:736,keyboard:{portrait:320,landscape:240}},{width:768,height:1024,keyboard:{portrait:320,landscape:400}},{width:1024,height:1366,keyboard:{portrait:380,landscape:460}}],function(n){return e=o<=n.width&&r<=n.height,t=n.keyboard,e?mn.some(t):mn.none();var e,t}).getOr({portrait:r/5,landscape:o/4})),i=e?t.portrait:t.landscape;return(e?n.screen.height:n.screen.width)-n.innerHeight>i?0:i}function Xg(n,e){var t=me(n).dom.defaultView;return Kr(n)+Kr(e)-Wg(t)}function qg(n,e,t){var o=Xg(e,t);$r(n,"padding-bottom",Kr(e)+Kr(t)-o+"px")}function Yg(n){return Em(n,lp)}function Kg(n,e){var t=Be(n,dp);return fp.fixed(n,t,e)}function Jg(n,e){return fp.scroller(n,e)}function Qg(n){var e=Yg(n);return("true"===Be(n,mp)?Jg:Kg)(n,e)}function Zg(n,e,t){var o=me(n).dom.defaultView.innerHeight;return Ie(n,gp,o+"px"),o-e-t}function np(n){var e=Wr(n,"top").getOr("0");return parseInt(e,10)}function ep(n){return parseInt(n.dom.scrollTop,10)}function tp(r,i){return ap(function(n){var e=J(ep,r);Ie(r,hp,e());var t=Math.abs(i-e()),o=Math.ceil(t/10);pp.animate(e,i,o,function(n,e){Em(r,hp)!==r.dom.scrollTop?e(r.dom.scrollTop):(r.dom.scrollTop=n,Ie(r,hp,n))},function(){r.dom.scrollTop=i,Ie(r,hp,i),n(i)},10)})}function op(n,e){$r(n,"top",e+Yg(n)+"px")}var rp,ip=function(n){function o(n){r()?i(n):e.push(n)}var t=mn.none(),e=[],r=function(){return t.isSome()},i=function(e){t.each(function(n){setTimeout(function(){e(n)},0)})};return n(function(n){r()||(t=mn.some(n),M(e,i),e=[])}),{get:o,map:function(t){return ip(function(e){o(function(n){e(t(n))})})},isReady:r}},up={nu:ip,pure:function(e){return ip(function(n){n(e)})}},cp=function(t){function n(n){t().then(n,Ug)}return{map:function(n){return cp(function(){return t().then(n)})},bind:function(e){return cp(function(){return t().then(function(n){return e(n).toPromise()})})},anonBind:function(n){return cp(function(){return t().then(function(){return n.toPromise()})})},toLazy:function(){return up.nu(n)},toCached:function(){var n=null;return cp(function(){return n=null===n?t():n})},toPromise:t,get:n}},ap=function(n){return cp(function(){return new Jl(n)})},sp=function(n){return cp(function(){return Jl.resolve(n)})},fp=Jt([{fixed:["element","property","offsetY"]},{scroller:["element","offsetY"]}]),lp="data-"+ci("position-y-fixed"),dp="data-"+ci("y-property"),mp="data-"+ci("scrolling"),gp="data-"+ci("last-window-height"),pp=(rp=null,{animate:function(r,i,u,c,e,n){function a(n){s=!0,e(n)}var s=!1;function f(n){um.clearInterval(rp),a(n)}um.clearInterval(rp),rp=um.setInterval(function(){var t=r(),n=t,e=i,o=u;(Math.abs(n-e)<=o?mn.none():n<e?mn.some(n+o):mn.some(n-o)).fold(function(){um.clearInterval(rp),a(i)},function(n){var e;c(n,f),s||((e=r())!==n||Math.abs(e-i)>Math.abs(t-i))&&(um.clearInterval(rp),a(i))})},n)}}),hp="data-"+ci("last-scroll-top");function vp(n,l){return n.fold(function(n,e,t){return $r(n,e,l+(o=t)+"px"),sp(o);var o},function(n,e){return r=l+(o=e),i=Wr(t=n,"top").getOr(o),u=r-parseInt(i,10),c=t.dom.scrollTop+u,a=t,s=c,f=r,ap(function(n){var e=J(ep,a);pp.animate(e,s,15,function(n){a.dom.scrollTop=n,$r(a,"top",np(a)+15+"px")},function(){a.dom.scrollTop=s,$r(a,"top",f+"px"),n(s)},10)});var t,o,r,i,u,c,a,s,f})}function bp(n,e){var u,t=Z(Jr(n,"["+lp+"]"),Qg),o=Z(t,function(n){return vp(n,e)});return u=o,ap(function(o){var r=[],i=0;0===u.length?o([]):M(u,function(n,e){var t;n.get((t=e,function(n){r[t]=n,++i>=u.length&&o(r)}))})})}function yp(n){var o,r,i,u,e,t,c,a,s,f,l,d,m,g,p,h,v,b,y,x=n.cWin,w=n.ceBody,S=n.socket,O=n.toolstrip,k=n.contentElement,T=n.keyboardType,C=n.outerWindow,E=n.dropup,D=n.outerBody,M=(r=w,i=O,u=E,m=me(o=S).dom.defaultView,d=Be(l=i,"style"),Gr(l,{position:"absolute",top:"0px"}),Ie(l,lp,"0px"),Ie(l,dp,"top"),g={restore:function(){Ie(l,"style",d||""),He(l,lp),He(l,dp)}},p=Kr(i),h=Kr(u),a=Zg(o,c=p,h),f=Be(s=o,"style"),_l(s),Gr(s,{position:"absolute",height:a+"px",width:"100%",top:c+"px"}),Ie(s,lp,c+"px"),Ie(s,mp,"true"),Ie(s,dp,"top"),v={restore:function(){Rl(s),Ie(s,"style",f||""),He(s,lp),He(s,mp),He(s,dp)}},t=Be(e=u,"style"),Gr(e,{position:"absolute",bottom:"0px"}),Ie(e,lp,"0px"),Ie(e,dp,"bottom"),b={restore:function(){Ie(e,"style",t||""),He(e,lp),He(e,dp)}},y=!0,qg(r,o,u),{setViewportOffset:function(n){Ie(o,lp,n+"px"),I()},isExpanding:F,isShrinking:Q(F),refresh:I,restore:function(){y=!1,g.restore(),v.restore(),b.restore()}}),_=T(D,x,ke(),k),R=Ll(C,{onChange:Y,onReady:M.refresh});function F(){var n=m.innerHeight;return Em(o,gp)<n}function I(){var n,e,t;y&&(n=Kr(i),e=Kr(u),t=Zg(o,n,e),Ie(o,lp,n+"px"),$r(o,"height",t+"px"),qg(r,o,u))}R.onAdjustment(function(){M.refresh()});function V(){q.clear()}var B,A,N,H,P,z,j,L,$,G,U,W=Pl(fe.fromDom(C),"resize",function(){M.isExpanding()&&M.refresh()}),X=(B=O,A=S,N=D,H=C,P=M,z=x,j=function(n){return t=A,o=n,r=me(e=B).dom.defaultView,ap(function(n){op(e,o),op(t,o),r.scrollTo(0,o),n(o)});var e,t,o,r},L=No(up.pure({})),$={start:function(e){var n=up.nu(function(n){return j(e).get(n)});L.set(n)},idle:function(n){L.get().get(function(){n()})}},G=Vm(function(){$.idle(function(){bp(N,H.pageYOffset).get(function(){var n=_m(z);mn.from(n[0]).bind(function(n){var e=n.top-A.dom.scrollTop;return e>H.innerHeight+5||e<-5?mn.some({top:e,bottom:e+n.height}):mn.none()}).each(function(n){A.dom.scrollTop=A.dom.scrollTop+n.top}),$.start(0),P.refresh()})})},1e3),U=Pl(fe.fromDom(H),"scroll",function(){H.pageYOffset<0||G.throttle()}),bp(N,H.pageYOffset).get(K),{unbind:U.unbind}),q=function(e,t){var n=e.document,o=fe.fromTag("div");function r(n){var e=fe.fromTag("span");return pl(e,[ci("layer-editor"),ci("unfocused-selection")]),Gr(e,{left:n.left+"px",top:n.top+"px",width:n.width+"px",height:n.height+"px"}),e}je(o,ci("unfocused-selections")),Qe(fe.fromDom(n.documentElement),o);var i=Pl(o,"touchstart",function(n){n.prevent(),$g(e,t),u()}),u=function(){we(o)};return{update:function(){u();var n=Z(_m(e),r);xe(o,n)},isActive:function(){return 0<Je(o).length},destroy:function(){i.unbind(),Ze(o)},clear:u}}(x,k);return{toEditing:function(){_.toEditing(),V()},toReading:function(){_.toReading()},onToolbarTouch:function(n){_.onToolbarTouch()},refreshSelection:function(){q.isActive()&&q.update()},clearSelection:V,highlightSelection:function(){q.update()},scrollIntoView:function(n,e){var t,o=x,r=n,i=e,u=Xg(t=S,E),c=J(Lg,o);u<r||u<i?tp(t,t.dom.scrollTop-u+i).get(c):r<0&&tp(t,t.dom.scrollTop+r).get(c)},updateToolbarPadding:Y,setViewportOffset:function(n){var i,u;M.setViewportOffset(n),i=S,u=n,ap(function(n){function e(n){$r(i,"top",n+"px")}var t=J(np,i),o=Math.abs(u-t()),r=Math.ceil(o/10);pp.animate(t,u,r,e,function(){e(u),n(u)},10)}).get(K)},syncHeight:function(){$r(k,"height",k.dom.contentWindow.document.body.scrollHeight+"px")},refreshStructure:M.refresh,destroy:function(){M.restore(),R.destroy(),X.unbind(),W.unbind(),_.destroy(),q.destroy(),jg(ke(),Po)}}}function xp(g,n){var p=wm(),h=cu(),v=cu(),b=uu(),y=uu();return{enter:function(){n.hide();var m=fe.fromDom(document);xm(g.editor).each(function(n){var e,t,o,r,i,u,c,a;function s(){o.run(function(n){n.refreshSelection()})}function f(n,e){var t=n-i.dom.scrollTop;o.run(function(n){n.scrollIntoView(t,t+e)})}function l(){o.run(function(n){n.clearSelection()})}function d(){t.getCursorBox().each(function(n){f(n.top,n.height)}),o.run(function(n){n.syncHeight()})}h.set({socketHeight:Wr(g.socket,"height"),iframeHeight:Wr(n.frame,"height"),outerScroll:document.body.scrollTop}),v.set({exclusives:(e="."+Zd,Pl(m,"touchmove",function(n){vi(n.target,e).filter(Nm).fold(function(){n.prevent()},Y)}))}),je(g.container,ci("fullscreen-maximized")),Sm(g.container,n.body),p.maximize(),$r(g.socket,"overflow","scroll"),$r(g.socket,"-webkit-overflow-scrolling","touch"),Ho(n.body),b.set(yp({cWin:n.win,ceBody:n.body,socket:g.socket,toolstrip:g.toolstrip,dropup:g.dropup.element,contentElement:n.frame,outerBody:g.body,outerWindow:g.win,keyboardType:Gg})),b.run(function(n){n.syncHeight()}),y.set((t=n,o=b,r=g.toolstrip,i=g.socket,g.dropup,u=Cm(t),c=Vm(d,300),a=[t.onKeyup(function(){l(),c.throttle()}),t.onNodeChanged(s),t.onDomChanged(c.throttle),t.onDomChanged(s),t.onScrollToCursor(function(n){n.preventDefault(),c.throttle()}),t.onScrollToElement(function(n){n.element,f(o,i)}),t.onToEditing(function(){o.run(function(n){n.toEditing()})}),t.onToReading(function(){o.run(function(n){n.toReading()})}),Pl(t.doc,"touchend",function(n){un(t.html,n.target)||un(t.body,n.target)}),Pl(r,"transitionend",function(n){var e;"height"===n.raw.propertyName&&(e=Kr(r),o.run(function(n){n.setViewportOffset(e)}),s(),d())}),zl(r,"touchstart",function(n){var e;o.run(function(n){n.highlightSelection()}),e=n,o.run(function(n){n.onToolbarTouch(e)}),t.onTouchToolstrip()}),Pl(t.body,"touchstart",function(n){l(),t.onTouchContent(),u.fireTouchstart(n)}),u.onTouchmove(),u.onTouchend(),Pl(t.body,"click",function(n){n.kill()}),Pl(r,"touchmove",function(){t.onToolbarScrollStart()})],{destroy:function(){M(a,function(n){n.unbind()})}}))})},refreshStructure:function(){b.run(function(n){n.refreshStructure()})},exit:function(){p.restore(),y.clear(),b.clear(),n.show(),h.on(function(n){n.socketHeight.each(function(n){$r(g.socket,"height",n)}),n.iframeHeight.each(function(n){$r(g.editor.getFrame(),"height",n)}),document.body.scrollTop=n.scrollTop}),h.clear(),v.on(function(n){n.exclusives.unbind()}),v.clear(),Le(g.container,ci("fullscreen-maximized")),Om(),Rl(g.toolbar),Xr(g.socket,"overflow"),Xr(g.socket,"-webkit-overflow-scrolling"),Po(g.editor.getFrame()),xm(g.editor).each(function(n){n.clearSelection()})}}}function wp(n,e,t){n.system.broadcastOn([dr],{command:e,state:t})}function Sp(e){return function(){function n(){e._skinLoaded=!0,e.fire("SkinLoaded")}e.initialized?n():e.on("init",n)}}var Op=tinymce.util.Tools.resolve("tinymce.EditorManager"),kp="toReading",Tp="toEditing";sr.add("mobile",function(E){return{getNotificationManagerImpl:function(){return{open:w({progressBar:{value:Y},close:Y,text:Y,getEl:w(null),moveTo:Y,moveRel:Y,settings:{}}),close:Y,reposition:Y,getArgs:w({})}},renderUI:function(){var n,e,t=E.getElement(),o={content:(n=mn.from(E.getParam("skin_url")).getOrThunk(function(){return Op.baseURL+"/skins/ui/oxide"}))+"/content.mobile.min.css",ui:n+"/skin.mobile.min.css"};function r(){E.fire("ScrollIntoView")}!1===E.getParam("skin")==0?(e=ar.DOM.styleSheetLoader,E.contentCSS.push(o.content),e.load(o.ui,Sp(E)),E.on("remove",function(){return e.unload(o.ui)})):Sp(E)();var i,u,c,a,s,f,l,d,m,g,p,h,v,b,y,x,w=Fn().os.isAndroid()?(i=r,u=zg({classes:[ci("android-container")]}),c=Hm(),a=uu(),s=Pm(a),f=zm(),l=Zm(Y,i),u.add(c.wrapper),u.add(f),u.add(l.component),{system:u,element:u.element,init:function(n){a.set(Am(n))},exit:function(){a.run(function(n){n.exit(),jd.remove(f,s)})},setToolbarGroups:function(n){var e=c.createGroups(n);c.setGroups(e)},setContextToolbar:function(n){var e=c.createGroups(n);c.setContextToolbar(e)},focusToolbar:function(){c.focus()},restoreToolbar:function(){c.restoreToolbar()},updateMode:function(n){jm(f,s,n,u.root)},socket:f,dropup:l}):(m=r,g=zg({classes:[ci("ios-container")]}),p=Hm(),h=uu(),v=Pm(h),b=zm(),y=Zm(function(){h.run(function(n){n.refreshStructure()})},m),g.add(p.wrapper),g.add(b),g.add(y.component),{system:g,element:g.element,init:function(r){h.set(function(){var n=zt("Getting IosWebapp schema",kg,r);$r(n.toolstrip,"width","100%"),$r(n.container,"position","relative");var e=Td(Bm(function(){n.setReadOnly(n.readOnlyOnInit()),o.enter()},n.translate));n.alloy.add(e);var t={show:function(){n.alloy.add(e)},hide:function(){n.alloy.remove(e)}},o=xp(n,t);return{setReadOnly:n.setReadOnly,refreshStructure:o.refreshStructure,enter:o.enter,exit:o.exit,destroy:Y}}())},exit:function(){h.run(function(n){jd.remove(b,v),n.exit()})},setToolbarGroups:function(n){var e=p.createGroups(n);p.setGroups(e)},setContextToolbar:function(n){var e=p.createGroups(n);p.setContextToolbar(e)},focusToolbar:function(){p.focus()},restoreToolbar:function(){p.restoreToolbar()},updateMode:function(n){jm(b,v,n,g.root)},socket:b,dropup:y}),S=fe.fromDom(t);function O(n,e,t,o){!1===o&&E.selection.collapse();var r,i,u,c=(r=e,i=t,{readOnly:(u=n.get()).backToMask.concat(r.get()),main:u.backToMask.concat(i.get())});w.setToolbarGroups(!0===o?c.readOnly:c.main),E.setMode(!0===o?"readonly":"design"),E.fire(!0===o?kp:Tp),w.updateMode(o)}function k(n,e){return E.on(n,e),{unbind:function(){E.off(n)}}}d=w.system,be(S,(x=d).element),M(Je(x.element),function(n){x.getByDom(n).each(ct)});var T=t.ownerDocument.defaultView,C=Ll(T,{onChange:function(){var n,e,t;w.system.broadcastOn([mr],{width:(n=T,e=Fn().os.isiOS(),t=jl(n).isPortrait(),e&&!t?n.screen.height:n.screen.width)})},onReady:Y});return E.on("init",function(){w.init({editor:{getFrame:function(){return fe.fromDom(E.contentAreaContainer.querySelector("iframe"))},onDomChanged:function(){return{unbind:Y}},onToReading:function(n){return k(kp,n)},onToEditing:function(n){return k(Tp,n)},onScrollToCursor:function(e){return E.on("ScrollIntoView",function(n){e(n)}),{unbind:function(){E.off("ScrollIntoView"),C.destroy()}}},onTouchToolstrip:function(){i()},onTouchContent:function(){jo(fe.fromDom(E.editorContainer.querySelector("."+ci("toolbar")))).bind(function(n){return w.system.getByDom(n).toOptional()}).each(q),w.restoreToolbar(),i()},onTapContent:function(n){var e=n.target;"img"===le(e)?(E.selection.select(e.dom),n.kill()):"a"===le(e)&&w.system.getByDom(fe.fromDom(E.editorContainer)).each(function(n){cr.isAlpha(n)&&function(n){var e=document.createElement("a");e.target="_blank",e.href=n.href,e.rel="noreferrer noopener";var t=document.createEvent("MouseEvents");t.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),document.body.appendChild(e),e.dispatchEvent(t),document.body.removeChild(e)}(e.dom)})}},container:fe.fromDom(E.editorContainer),socket:fe.fromDom(E.contentAreaContainer),toolstrip:fe.fromDom(E.editorContainer.querySelector("."+ci("toolstrip"))),toolbar:fe.fromDom(E.editorContainer.querySelector("."+ci("toolbar"))),dropup:w.dropup,alloy:w.system,translate:Y,setReadOnly:function(n){O(d,l,f,n)},readOnlyOnInit:function(){return!1}});var t,n,o,r,e,i=function(){w.dropup.disappear(function(){w.system.broadcastOn([gr],{})})},u={label:"The first group",scrollable:!1,items:[nf("back",function(){E.selection.collapse(),w.exit()},{},E)]},c={label:"Back to read only",scrollable:!1,items:[nf("readonly-back",function(){O(d,l,f,!0)},{},E)]},a=Al(w,E),s={label:"The extra group",scrollable:!1,items:[]},f=No([{label:"the action group",scrollable:!0,items:(t=a,e=E.getParam("toolbar",lr,"array"),n=(D(e)?om:Bl)(e),o={},B(n,function(n){var e=!Re(o,n)&&Re(t,n)&&t[n].isSupported()?[t[n].sketch()]:[];return o[n]=!0,e}))},s]),l=No([{label:"The read only mode group",scrollable:!0,items:[]},s]),d=No({backToMask:[u],backToReadOnly:[c]}),m=w;M(st((r=E).formatter.get()),function(e){r.formatter.formatChanged(e,function(n){wp(m,e,n)})}),M(["ul","ol"],function(t){r.selection.selectorChanged(t,function(n,e){wp(m,t,n)})})}),E.on("remove",function(){w.exit()}),E.on("detach",function(){var e=w.system;M(Je(e.element),function(n){e.getByDom(n).each(ut)}),Ze(e.element),w.system.destroy()}),{iframeContainer:w.socket.element.dom,editorContainer:w.element.dom}}}})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/themes/silver/theme.min.js b/public/static/assets/gougu/module/tinymce/themes/silver/theme.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..4579cb758f27341820f198439a67a47d2eb78db3
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/themes/silver/theme.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function t(o){return function(t){return e=typeof(n=t),(null===n?"null":"object"==e&&(Array.prototype.isPrototypeOf(n)||n.constructor&&"Array"===n.constructor.name)?"array":"object"==e&&(String.prototype.isPrototypeOf(n)||n.constructor&&"String"===n.constructor.name)?"string":e)===o;var n,e}}function n(n){return function(t){return typeof t===n}}function e(n){return function(t){return n===t}}function g(t){return null==t}function f(t,n){if(c(t)){for(var e=0,o=t.length;e<o;++e)if(!n(t[e]))return;return 1}}function st(){}function r(e,o){return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e(o.apply(null,t))}}function rt(t){return function(){return t}}function h(t){return t}function v(t,n){return t===n}var y=t("string"),x=t("object"),c=t("array"),b=e(null),w=n("boolean"),E=e(void 0),d=function(t){return!g(t)},m=n("function"),u=n("number");function S(o){for(var r=[],t=1;t<arguments.length;t++)r[t-1]=arguments[t];return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var e=r.concat(t);return o.apply(null,e)}}function C(n){return function(t){return!n(t)}}function k(t){return function(){throw new Error(t)}}var O=rt(!1),_=rt(!0),o=tinymce.util.Tools.resolve("tinymce.ThemeManager"),lt=function(){return(lt=Object.assign||function(t){for(var n,e=1,o=arguments.length;e<o;e++)for(var r in n=arguments[e])Object.prototype.hasOwnProperty.call(n,r)&&(t[r]=n[r]);return t}).apply(this,arguments)};function s(t,n){var e={};for(r in t)Object.prototype.hasOwnProperty.call(t,r)&&n.indexOf(r)<0&&(e[r]=t[r]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(t);o<r.length;o++)n.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(t,r[o])&&(e[r[o]]=t[r[o]]);return e}function H(t,n,e){if(e||2===arguments.length)for(var o,r=0,i=n.length;r<i;r++)!o&&r in n||((o=o||Array.prototype.slice.call(n,0,r))[r]=n[r]);return t.concat(o||Array.prototype.slice.call(n))}function i(){return a}var a={fold:function(t,n){return t()},isSome:O,isNone:_,getOr:h,getOrThunk:l,getOrDie:function(t){throw new Error(t||"error: getOrDie called on none.")},getOrNull:rt(null),getOrUndefined:rt(void 0),or:h,orThunk:l,map:i,each:st,bind:i,exists:O,forall:_,filter:function(){return a},toArray:function(){return[]},toString:rt("none()")};function l(t){return t()}function p(t,n){return yt.call(t,n)}function T(t,n){for(var e=0,o=t.length;e<o;e++)if(n(t[e],e))return!0;return!1}function D(t,n){for(var e=[],o=0;o<t;o++)e.push(n(o));return e}function B(t,n){for(var e=[],o=0;o<t.length;o+=n){var r=bt.call(t,o,o+n);e.push(r)}return e}function M(t,n){for(var e=t.length,o=new Array(e),r=0;r<e;r++){var i=t[r];o[r]=n(i,r)}return o}function A(t,n){for(var e=[],o=[],r=0,i=t.length;r<i;r++){var u=t[r];(n(u,r)?e:o).push(u)}return{pass:e,fail:o}}function F(t,n){for(var e=[],o=0,r=t.length;o<r;o++){var i=t[o];n(i,o)&&e.push(i)}return e}function I(t,o,r){return function(t){for(var n,e=t.length-1;0<=e;e--)n=t[e],r=o(r,n,e)}(t),r}function R(t,e,o){return St(t,function(t,n){o=e(o,t,n)}),o}function V(t,n){return function(t,n,e){for(var o=0,r=t.length;o<r;o++){var i=t[o];if(n(i,o))return vt.some(i);if(e(i,o))break}return vt.none()}(t,n,O)}function P(t,n){for(var e=0,o=t.length;e<o;e++)if(n(t[e],e))return vt.some(e);return vt.none()}function ft(t){for(var n=[],e=0,o=t.length;e<o;++e){if(!c(t[e]))throw new Error("Arr.flatten item "+e+" was not an array, input: "+t);xt.apply(n,t[e])}return n}function z(t,n){return ft(M(t,n))}function N(t,n){for(var e=0,o=t.length;e<o;++e)if(!0!==n(t[e],e))return!1;return!0}function L(t){var n=bt.call(t,0);return n.reverse(),n}function W(t,n){return F(t,function(t){return!wt(n,t)})}function U(t,n){for(var e={},o=0,r=t.length;o<r;o++){var i=t[o];e[String(i)]=n(i,o)}return e}function j(t){return[t]}function G(t,n){var e=bt.call(t,0);return e.sort(n),e}function X(t,n){return 0<=n&&n<t.length?vt.some(t[n]):vt.none()}function Y(t){return X(t,0)}function q(t){return X(t,t.length-1)}function K(t,n){for(var e=0;e<t.length;e++){var o=n(t[e],e);if(o.isSome())return o}return vt.none()}function J(t,n){for(var e=kt(t),o=0,r=e.length;o<r;o++){var i=e[o];n(t[i],i)}}function dt(t,e){return _t(t,function(t,n){return{k:n,v:e(t,n)}})}function $(t,e){var o=[];return J(t,function(t,n){o.push(e(t,n))}),o}function Q(t,n){for(var e=kt(t),o=0,r=e.length;o<r;o++){var i=e[o],u=t[i];if(n(u,i,t))return vt.some(u)}return vt.none()}function Z(t){return $(t,h)}function tt(t,n){return Tt(t,n)?vt.from(t[n]):vt.none()}function nt(t,n){return Tt(t,n)&&void 0!==t[n]&&null!==t[n]}function mt(t,n,e){return void 0===e&&(e=v),t.exists(function(t){return e(t,n)})}function et(t){for(var n=[],e=function(t){n.push(t)},o=0;o<t.length;o++)t[o].each(e);return n}function ot(t,n){return t?vt.some(n):vt.none()}function it(t,n,e){return""===n||t.length>=n.length&&t.substr(e,e+n.length)===n}function ut(t,n){return-1!==t.indexOf(n)}function at(t){return 0<t.length}function ct(t){return void 0!==t.style&&m(t.style.getPropertyValue)}function gt(t){if(null==t)throw new Error("Node cannot be null or undefined");return{dom:t}}var pt,ht=function(e){function t(){return r}function n(t){return t(e)}var o=rt(e),r={fold:function(t,n){return n(e)},isSome:_,isNone:O,getOr:o,getOrThunk:o,getOrDie:o,getOrNull:o,getOrUndefined:o,or:t,orThunk:t,map:function(t){return ht(t(e))},each:function(t){t(e)},bind:n,exists:n,forall:n,filter:function(t){return t(e)?r:a},toArray:function(){return[e]},toString:function(){return"some("+e+")"}};return r},vt={some:ht,none:i,from:function(t){return null==t?a:ht(t)}},bt=Array.prototype.slice,yt=Array.prototype.indexOf,xt=Array.prototype.push,wt=function(t,n){return-1<p(t,n)},St=function(t,n){for(var e=0,o=t.length;e<o;e++)n(t[e],e)},Ct=m(Array.from)?Array.from:function(t){return bt.call(t)},kt=Object.keys,Ot=Object.hasOwnProperty,_t=function(t,o){var r={};return J(t,function(t,n){var e=o(t,n);r[e.k]=e.v}),r},Tt=function(t,n){return Ot.call(t,n)},Et=function(t,n,e){return t.isSome()&&n.isSome()?vt.some(e(t.getOrDie(),n.getOrDie())):vt.none()},Dt=function(t,n){return it(t,n,0)},Bt=function(t,n){return it(t,n,t.length-n.length)},Mt=(pt=/^\s+|\s+$/g,function(t){return t.replace(pt,"")}),At={fromHtml:function(t,n){var e=(n||document).createElement("div");if(e.innerHTML=t,!e.hasChildNodes()||1<e.childNodes.length)throw console.error("HTML does not have a single root node",t),new Error("HTML must have a single root node");return gt(e.childNodes[0])},fromTag:function(t,n){var e=(n||document).createElement(t);return gt(e)},fromText:function(t,n){var e=(n||document).createTextNode(t);return gt(e)},fromDom:gt,fromPoint:function(t,n,e){return vt.from(t.dom.elementFromPoint(n,e)).map(gt)}};function Ft(t){return t.dom.nodeName.toLowerCase()}function It(n){return function(t){return t.dom.nodeType===n}}function Rt(e){var o,r=!1;return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return r||(r=!0,o=e.apply(null,t)),o}}function Vt(t,n){var e=String(n).toLowerCase();return V(t,function(t){return t.search(e)})}function Pt(n){return function(t){return ut(t,n)}}function Ht(t){return window.matchMedia(t).matches}function zt(t,n){var e=t.dom;if(1!==e.nodeType)return!1;var o=e;if(void 0!==o.matches)return o.matches(n);if(void 0!==o.msMatchesSelector)return o.msMatchesSelector(n);if(void 0!==o.webkitMatchesSelector)return o.webkitMatchesSelector(n);if(void 0!==o.mozMatchesSelector)return o.mozMatchesSelector(n);throw new Error("Browser lacks native selectors")}function Nt(t){return 1!==t.nodeType&&9!==t.nodeType&&11!==t.nodeType||0===t.childElementCount}function Lt(t,n){return t.dom===n.dom}function Wt(t,n){return se().browser.isIE()?(e=t.dom,o=n.dom,r=Node.DOCUMENT_POSITION_CONTAINED_BY,0!=(e.compareDocumentPosition(o)&r)):(i=t.dom)!==(u=n.dom)&&i.contains(u);var e,o,r,i,u}function Ut(t){return At.fromDom(t.dom.ownerDocument)}function jt(t){return Yn(t)?t:Ut(t)}function Gt(t){return At.fromDom(jt(t).dom.documentElement)}function Xt(t){return At.fromDom(jt(t).dom.defaultView)}function Yt(t){return vt.from(t.dom.parentNode).map(At.fromDom)}function qt(t){return vt.from(t.dom.offsetParent).map(At.fromDom)}function Kt(t){return M(t.dom.childNodes,At.fromDom)}function Jt(t,n){var e=t.dom.childNodes;return vt.from(e[n]).map(At.fromDom)}function $t(t,n){return{element:t,offset:n}}function Qt(t,n){var e=Kt(t);return 0<e.length&&n<e.length?$t(e[n],0):$t(t,n)}function Zt(t){return qn(t)&&d(t.dom.host)}function tn(t){return Zt(t)?t:At.fromDom(jt(t).dom.body)}function nn(t){return At.fromDom(t.dom.host)}function en(t,n,e){if(!(y(e)||w(e)||u(e)))throw console.error("Invalid call to Attribute.set. Key ",n,":: Value ",e,":: Element ",t),new Error("Attribute value was not simple");t.setAttribute(n,e+"")}function on(t,n,e){en(t.dom,n,e)}function rn(t,n){var e=t.dom.getAttribute(n);return null===e?void 0:e}function un(t,n){return vt.from(rn(t,n))}function an(t,n){var e=t.dom;return!(!e||!e.hasAttribute)&&e.hasAttribute(n)}function cn(t,n){t.dom.removeAttribute(n)}function sn(t,n,e){if(!y(e))throw console.error("Invalid call to CSS.set. Property ",n,":: Value ",e,":: Element ",t),new Error("CSS value must be a string: "+e);ct(t)&&t.style.setProperty(n,e)}function ln(t,n){ct(t)&&t.style.removeProperty(n)}function fn(t,n,e){sn(t.dom,n,e)}function dn(t,n){var e=t.dom;J(n,function(t,n){sn(e,n,t)})}function mn(t,n){var e=t.dom;J(n,function(t,n){t.fold(function(){ln(e,n)},function(t){sn(e,n,t)})})}function gn(t,n){var e=t.dom,o=window.getComputedStyle(e).getPropertyValue(n);return""!==o||he(t)?o:ye(e,n)}function pn(t,n){var e=t.dom,o=ye(e,n);return vt.from(o).filter(function(t){return 0<t.length})}function hn(t,n,e){var o=At.fromTag(t);return fn(o,n,e),pn(o,n).isSome()}function vn(t,n){ln(t.dom,n),mt(un(t,"style").map(Mt),"")&&cn(t,"style")}function bn(t){return t.dom.offsetWidth}function yn(o,r){function t(t){var n=r(t);if(n<=0||null===n){var e=gn(t,o);return parseFloat(e)||0}return n}function i(r,t){return R(t,function(t,n){var e=gn(r,n),o=void 0===e?0:parseInt(e,10);return isNaN(o)?t:t+o},0)}return{set:function(t,n){if(!u(n)&&!n.match(/^[0-9]+$/))throw new Error(o+".set accepts only positive integer values. Value was "+n);var e=t.dom;ct(e)&&(e.style[o]=n+"px")},get:t,getOuter:t,aggregate:i,max:function(t,n,e){var o=i(t,e);return o<n?n-o:0}}}function xn(t){return xe.get(t)}function wn(t){return xe.getOuter(t)}function Sn(t,n){return void 0!==t?t:void 0!==n?n:0}function Cn(t){var n=t.dom.ownerDocument,e=n.body,o=n.defaultView,r=n.documentElement;if(e===t.dom)return Se(e.offsetLeft,e.offsetTop);var i=Sn(null==o?void 0:o.pageYOffset,r.scrollTop),u=Sn(null==o?void 0:o.pageXOffset,r.scrollLeft),a=Sn(r.clientTop,e.clientTop),c=Sn(r.clientLeft,e.clientLeft);return Ce(t).translate(u-c,i-a)}function kn(t){return ke.get(t)}function On(t){return ke.getOuter(t)}function _n(t){function n(){return t.stopPropagation()}function e(){return t.preventDefault()}var o=r(e,n);return{target:At.fromDom(function(t){if(de()&&d(t.target)){var n=At.fromDom(t.target);if(Gn(n)&&pe(n)&&t.composed&&t.composedPath){var e=t.composedPath();if(e)return Y(e)}}return vt.from(t.target)}(t).getOr(t.target)),x:t.clientX,y:t.clientY,stop:n,prevent:e,kill:o,raw:t}}function Tn(t,n,e,o,r){var i,u,a=(i=e,u=o,function(t){i(t)&&u(_n(t))});return t.dom.addEventListener(n,a,r),{unbind:S(Oe,t,n,a,r)}}function En(n,e){Yt(n).each(function(t){t.dom.insertBefore(e.dom,n.dom)})}function Dn(t,n){vt.from(t.dom.nextSibling).map(At.fromDom).fold(function(){Yt(t).each(function(t){_e(t,n)})},function(t){En(t,n)})}function Bn(n,e){Jt(n,0).fold(function(){_e(n,e)},function(t){n.dom.insertBefore(e.dom,t.dom)})}function Mn(n,t){St(t,function(t){_e(n,t)})}function An(t){t.dom.textContent="",St(Kt(t),function(t){Te(t)})}function Fn(t){var n,e=Kt(t);0<e.length&&(n=t,St(e,function(t){En(n,t)})),Te(t)}function In(t){var n=void 0!==t?t.dom:document,e=n.body.scrollLeft||n.documentElement.scrollLeft,o=n.body.scrollTop||n.documentElement.scrollTop;return Se(e,o)}function Rn(t,n,e){var o=(void 0!==e?e.dom:document).defaultView;o&&o.scrollTo(t,n)}function Vn(t,n,e,o){return{x:t,y:n,width:e,height:o,right:t+e,bottom:n+o}}function Pn(t){var o=void 0===t?window:t,n=o.document,r=In(At.fromDom(n)),e=void 0===o?window:o;return(se().browser.isFirefox()?vt.none():vt.from(e.visualViewport)).fold(function(){var t=o.document.documentElement,n=t.clientWidth,e=t.clientHeight;return Vn(r.left,r.top,n,e)},function(t){return Vn(Math.max(t.pageLeft,r.left),Math.max(t.pageTop,r.top),t.width,t.height)})}function Hn(o){var t,r=In(At.fromDom(document)),n=(t=De).owner(o),e=Ee(t,n);return vt.some(e).fold(S(Cn,o),function(t){var n=Ce(o),e=I(t,function(t,n){var e=Ce(n);return{left:t.left+e.left,top:t.top+e.top}},{left:0,top:0});return Se(e.left+n.left+r.left,e.top+n.top+r.top)})}function zn(t){var n=Hn(t),e=On(t),o=wn(t);return Be(n.left,n.top,e,o)}"undefined"!=typeof window||Function("return this;")();function Nn(){return Kn(0,0)}function Ln(t){function n(t){return function(){return e===t}}var e=t.current,o=t.version;return{current:e,version:o,isEdge:n("Edge"),isChrome:n("Chrome"),isIE:n("IE"),isOpera:n("Opera"),isFirefox:n(Zn),isSafari:n("Safari")}}function Wn(t){function n(t){return function(){return e===t}}var e=t.current,o=t.version;return{current:e,version:o,isWindows:n(ee),isiOS:n("iOS"),isAndroid:n(oe),isOSX:n("OSX"),isLinux:n("Linux"),isSolaris:n(re),isFreeBSD:n(ie),isChromeOS:n(ue)}}var Un,jn,Gn=It(1),Xn=It(3),Yn=It(9),qn=It(11),Kn=function(t,n){return{major:t,minor:n}},Jn={nu:Kn,detect:function(t,n){var e,o,r=String(n).toLowerCase();return 0===t.length?Nn():(o=function(t,n){for(var e=0;e<t.length;e++){var o=t[e];if(o.test(n))return o}}(t,e=r))?Kn(i(1),i(2)):{major:0,minor:0};function i(t){return Number(e.replace(o,"$"+t))}},unknown:Nn},$n=/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,Qn={browsers:rt([{name:"Edge",versionRegexes:[/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],search:function(t){return ut(t,"edge/")&&ut(t,"chrome")&&ut(t,"safari")&&ut(t,"applewebkit")}},{name:"Chrome",brand:"Chromium",versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/,$n],search:function(t){return ut(t,"chrome")&&!ut(t,"chromeframe")}},{name:"IE",versionRegexes:[/.*?msie\ ?([0-9]+)\.([0-9]+).*/,/.*?rv:([0-9]+)\.([0-9]+).*/],search:function(t){return ut(t,"msie")||ut(t,"trident")}},{name:"Opera",versionRegexes:[$n,/.*?opera\/([0-9]+)\.([0-9]+).*/],search:Pt("opera")},{name:"Firefox",versionRegexes:[/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],search:Pt("firefox")},{name:"Safari",versionRegexes:[$n,/.*?cpu os ([0-9]+)_([0-9]+).*/],search:function(t){return(ut(t,"safari")||ut(t,"mobile/"))&&ut(t,"applewebkit")}}]),oses:rt([{name:"Windows",search:Pt("win"),versionRegexes:[/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]},{name:"iOS",search:function(t){return ut(t,"iphone")||ut(t,"ipad")},versionRegexes:[/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,/.*cpu os ([0-9]+)_([0-9]+).*/,/.*cpu iphone os ([0-9]+)_([0-9]+).*/]},{name:"Android",search:Pt("android"),versionRegexes:[/.*?android\ ?([0-9]+)\.([0-9]+).*/]},{name:"OSX",search:Pt("mac os x"),versionRegexes:[/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]},{name:"Linux",search:Pt("linux"),versionRegexes:[]},{name:"Solaris",search:Pt("sunos"),versionRegexes:[]},{name:"FreeBSD",search:Pt("freebsd"),versionRegexes:[]},{name:"ChromeOS",search:Pt("cros"),versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/]}])},Zn="Firefox",te=function(){return Ln({current:void 0,version:Jn.unknown()})},ne=Ln,ee=(rt("Edge"),rt("Chrome"),rt("IE"),rt("Opera"),rt(Zn),rt("Safari"),"Windows"),oe="Android",re="Solaris",ie="FreeBSD",ue="ChromeOS",ae=function(){return Wn({current:void 0,version:Jn.unknown()})},ce=Wn,se=(rt(ee),rt("iOS"),rt(oe),rt("Linux"),rt("OSX"),rt(re),rt(ie),rt(ue),Rt(function(){return t=navigator.userAgent,n=vt.from(navigator.userAgentData),e=Ht,p=Qn.browsers(),h=Qn.oses(),v=n.bind(function(t){return o=p,K(t.brands,function(n){var e=n.brand.toLowerCase();return V(o,function(t){var n;return e===(null===(n=t.brand)||void 0===n?void 0:n.toLowerCase())}).map(function(t){return{current:t.name,version:Jn.nu(parseInt(n.version,10),0)}})});var o}).orThunk(function(){return Vt(p,e=t).map(function(t){var n=Jn.detect(t.versionRegexes,e);return{current:t.name,version:n}});var e}).fold(te,ne),b=Vt(h,o=t).map(function(t){var n=Jn.detect(t.versionRegexes,o);return{current:t.name,version:n}}).fold(ae,ce),{browser:v,os:b,deviceType:(i=v,u=t,a=e,c=(r=b).isiOS()&&!0===/ipad/i.test(u),s=r.isiOS()&&!c,f=(l=r.isiOS()||r.isAndroid())||a("(pointer:coarse)"),d=c||!s&&l&&a("(min-device-width:768px)"),m=s||l&&!d,g=i.isSafari()&&r.isiOS()&&!1===/safari/i.test(u),{isiPad:rt(c),isiPhone:rt(s),isTablet:rt(d),isPhone:rt(m),isTouch:rt(f),isAndroid:r.isAndroid,isiOS:r.isiOS,isWebView:rt(g),isDesktop:rt(!m&&!d&&!g)})};var t,n,e,o,r,i,u,a,c,s,l,f,d,m,g,p,h,v,b})),le=Yt,fe=m(Element.prototype.attachShadow)&&m(Node.prototype.getRootNode),de=rt(fe),me=fe?function(t){return At.fromDom(t.dom.getRootNode())}:jt,ge=function(t){var n=me(t);return Zt(n)?vt.some(n):vt.none()},pe=function(t){return d(t.dom.shadowRoot)},he=function(t){var n=Xn(t)?t.dom.parentNode:t.dom;if(null==n||null===n.ownerDocument)return!1;var e,o,r=n.ownerDocument;return ge(At.fromDom(n)).fold(function(){return r.body.contains(n)},(e=he,o=nn,function(t){return e(o(t))}))},ve=function(){return be(At.fromDom(document))},be=function(t){var n=t.dom.body;if(null==n)throw new Error("Body is not available yet");return At.fromDom(n)},ye=function(t,n){return ct(t)?t.style.getPropertyValue(n):""},xe=yn("height",function(t){var n=t.dom;return he(t)?n.getBoundingClientRect().height:n.offsetHeight}),we=function(e,o){return{left:e,top:o,translate:function(t,n){return we(e+t,o+n)}}},Se=we,Ce=function(t){var n,e=t.dom,o=e.ownerDocument.body;return o===e?Se(o.offsetLeft,o.offsetTop):he(t)?(n=e.getBoundingClientRect(),Se(n.left,n.top)):Se(0,0)},ke=yn("width",function(t){return t.dom.offsetWidth}),Oe=function(t,n,e,o){t.dom.removeEventListener(n,e,o)},_e=function(t,n){t.dom.appendChild(n.dom)},Te=function(t){var n=t.dom;null!==n.parentNode&&n.parentNode.removeChild(n)},Ee=function(o,t){return o.view(t).fold(rt([]),function(t){var n=o.owner(t),e=Ee(o,n);return[t].concat(e)})},De=Object.freeze({__proto__:null,view:function(t){var n;return(t.dom===document?vt.none():vt.from(null===(n=t.dom.defaultView)||void 0===n?void 0:n.frameElement)).map(At.fromDom)},owner:Ut}),Be=function(t,n,e,o){return{x:t,y:n,width:e,height:o,right:t+e,bottom:n+o}},Me=function(t){var n=Cn(t),e=On(t),o=wn(t);return Be(n.left,n.top,e,o)},Ae=function(){return Pn(window)},Fe=function(e){return{isValue:_,isError:O,getOr:rt(e),getOrThunk:rt(e),getOrDie:rt(e),or:function(t){return Fe(e)},orThunk:function(t){return Fe(e)},fold:function(t,n){return n(e)},map:function(t){return Fe(t(e))},mapError:function(t){return Fe(e)},each:function(t){t(e)},bind:function(t){return t(e)},exists:function(t){return t(e)},forall:function(t){return t(e)},toOptional:function(){return vt.some(e)}}},Ie=function(e){return{isValue:O,isError:_,getOr:h,getOrThunk:function(t){return t()},getOrDie:function(){return k(String(e))()},or:h,orThunk:function(t){return t()},fold:function(t,n){return t(e)},map:function(t){return Ie(e)},mapError:function(t){return Ie(t(e))},each:st,bind:function(t){return Ie(e)},exists:O,forall:_,toOptional:vt.none}},Re={value:Fe,error:Ie,fromOption:function(t,n){return t.fold(function(){return Ie(n)},Fe)}};function Ve(t,n,e){return t.stype===Un.Error?n(t.serror):e(t.svalue)}function Pe(t){return{stype:Un.Value,svalue:t}}function He(t){return{stype:Un.Error,serror:t}}function ze(t,n,e,o){return{tag:"field",key:t,newKey:n,presence:e,prop:o}}function Ne(t,n,e){switch(t.tag){case"field":return n(t.key,t.newKey,t.presence,t.prop);case"custom":return e(t.newKey,t.instantiator)}}function Le(u){return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];if(0===t.length)throw new Error("Can't merge zero objects");for(var e={},o=0;o<t.length;o++){var r,i=t[o];for(r in i)Tt(i,r)&&(e[r]=u(e[r],i[r]))}return e}}function We(){return{tag:"required",process:{}}}function Ue(t){return{tag:"defaultedThunk",process:t}}function je(t){return Ue(rt(t))}function Ge(){return{tag:"option",process:{}}}function Xe(t){return{tag:"mergeWithThunk",process:t}}function Ye(t){return x(t)&&100<kt(t).length?" removed due to size":JSON.stringify(t,null,2)}function qe(t,n){return No([{path:t,getErrorInfo:n}])}function Ke(e){return{extract:function(n,t){return Wo(e(t),function(t){return qe(n,rt(t))})},toString:rt("val")}}function Je(t,n,e,o){return o(tt(t,n).getOrThunk(function(){return e(t)}))}function $e(n,e,o,r,i){function u(t){return i.extract(e.concat([r]),t)}function t(t){return t.fold(function(){return zo(vt.none())},function(t){var n=i.extract(e.concat([r]),t);return Uo(n,vt.some)})}var a,c,s,l,f,d;switch(n.tag){case"required":return s=e,d=u,tt(l=o,f=r).fold(function(){return t=f,n=l,qe(s,function(){return'Could not find valid *required* value for "'+t+'" in '+Ye(n)});var t,n},d);case"defaultedThunk":return Je(o,r,n.process,u);case"option":return t(tt(o,r));case"defaultedOptionThunk":return c=n.process,t(tt(a=o,r).map(function(t){return!0===t?c(a):t}));case"mergeWithThunk":return Je(o,r,rt({}),function(t){return u(Xo(n.process(o),t))})}}function Qe(e){return{extract:function(t,n){return e().extract(t,n)},toString:function(){return e().toString()}}}function Ze(t){var s=Jo(t),l=I(t,function(e,t){return Ne(t,function(t){var n;return Xo(e,((n={})[t]=!0,n))},rt(e))},{});return{extract:function(t,n){var e,o,r,i,u,a,c=F(w(n)?[]:kt((r=d,i=o={},u=function(t,n){i[n]=t},a=st,J(n,function(t,n){(r(t,n)?u:a)(t,n)}),o)),function(t){return!nt(l,t)});return 0===c.length?s.extract(t,n):(e=c,qe(t,function(){return"There are unsupported fields: ["+e.join(", ")+"] specified"}))},toString:s.toString}}function to(o){return{extract:function(e,t){var n=M(t,function(t,n){return o.extract(e.concat(["["+n+"]"]),t)});return qo(n)},toString:function(){return"array("+o.toString()+")"}}}function no(u){return{extract:function(t,n){for(var e=[],o=0,r=u;o<r.length;o++){var i=r[o].extract(t,n);if(i.stype===Un.Value)return i;e.push(i)}return qo(e)},toString:function(){return"oneOf("+M(u,function(t){return t.toString()}).join(", ")+")"}}}function eo(e,o){return Ke(function(t){var n=typeof t;return e(t)?zo(t):No("Expected type: "+o+" but got: "+n)})}function oo(n,a){return{extract:function(i,u){return tt(u,n).fold(function(){return t=n,qe(i,function(){return'Choice schema did not contain choice key: "'+t+'"'});var t},function(t){return e=i,n=u,tt(o=a,r=t).fold(function(){return t=o,n=r,qe(e,function(){return'The chosen schema: "'+n+'" did not exist in branches: '+Ye(t)});var t,n},function(t){return t.extract(e.concat(["branch: "+r]),n)});var e,n,o,r})},toString:function(){return"chooseOn("+n+"). Possible values: "+kt(a)}}}function ro(n){return Ke(function(t){return n(t).fold(No,zo)})}function io(n,t){return r=function(t){return n(t).fold(He,Pe)},i=t,{extract:function(e,o){var t=kt(o),n=to(Ke(r)).extract(e,t);return Lo(n,function(t){var n=M(t,function(t){return ze(t,t,We(),i)});return Jo(n).extract(e,o)})},toString:function(){return"setOf("+i.toString()+")"}};var r,i}function uo(t,n,e){return Ho((r=n.extract([t],o=e),jo(r,function(t){return{input:o,errors:t}})));var o,r}function ao(t){return t.fold(function(t){throw new Error(ir(t))},h)}function co(t,n,e){return ao(uo(t,n,e))}function so(t,n){return oo(t,dt(n,Jo))}function lo(n){return ro(function(t){return wt(n,t)?Re.value(t):Re.error('Unsupported value: "'+t+'", choose one of "'+n.join(", ")+'".')})}function fo(t){return ur(t,t,We(),Qo())}function mo(t,n){return ur(t,t,We(),n)}function go(t){return mo(t,tr)}function po(t,n){return ur(t,t,We(),lo(n))}function ho(t){return mo(t,er)}function vo(t,n){return ur(t,t,We(),Jo(n))}function bo(t,n){return ur(t,t,We(),$o(n))}function yo(t,n){return ur(t,t,We(),to(n))}function xo(t){return ur(t,t,Ge(),Qo())}function wo(t,n){return ur(t,t,Ge(),n)}function So(t){return wo(t,Zo)}function Co(t){return wo(t,tr)}function ko(t){return wo(t,er)}function Oo(t,n){return wo(t,to(n))}function _o(t,n){return wo(t,Jo(n))}function To(t,n){return ur(t,t,je(n),Qo())}function Eo(t,n,e){return ur(t,t,je(n),e)}function Do(t,n){return Eo(t,n,Zo)}function Bo(t,n){return Eo(t,n,tr)}function Mo(t,n,e){return Eo(t,n,lo(e))}function Ao(t,n){return Eo(t,n,nr)}function Fo(t,n){return Eo(t,n,er)}function Io(t,n,e){return Eo(t,n,to(e))}function Ro(t,n,e){return Eo(t,n,Jo(e))}function Vo(t){var n=t;return{get:function(){return n},set:function(t){n=t}}}(jn=Un={})[jn.Error=0]="Error",jn[jn.Value=1]="Value";function Po(u){if(!c(u))throw new Error("cases must be an array");if(0===u.length)throw new Error("there must be at least one case");var a=[],e={};return St(u,function(t,o){var n=kt(t);if(1!==n.length)throw new Error("one and only one name per case");var r=n[0],i=t[r];if(void 0!==e[r])throw new Error("duplicate key detected:"+r);if("cata"===r)throw new Error("cannot have a case named cata (sorry)");if(!c(i))throw new Error("case arguments must be an array");a.push(r),e[r]=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var n=e.length;if(n!==i.length)throw new Error("Wrong number of arguments to case "+r+". Expected "+i.length+" ("+i+"), got "+n);return{fold:function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];if(t.length!==u.length)throw new Error("Wrong number of arguments to fold. Expected "+u.length+", got "+t.length);return t[o].apply(null,e)},match:function(t){var n=kt(t);if(a.length!==n.length)throw new Error("Wrong number of arguments to match. Expected: "+a.join(",")+"\nActual: "+n.join(","));if(!N(a,function(t){return wt(n,t)}))throw new Error("Not all branches were specified when using match. Specified: "+n.join(", ")+"\nRequired: "+a.join(", "));return t[r].apply(null,e)},log:function(t){console.log(t,{constructors:a,constructor:r,params:e})}}}}),e}var Ho=function(t){return Ve(t,Re.error,Re.value)},zo=Pe,No=He,Lo=function(t,n){return t.stype===Un.Value?n(t.svalue):t},Wo=function(t,n){return t.stype===Un.Error?n(t.serror):t},Uo=function(t,n){return t.stype===Un.Value?{stype:Un.Value,svalue:n(t.svalue)}:t},jo=function(t,n){return t.stype===Un.Error?{stype:Un.Error,serror:n(t.serror)}:t},Go=Ve,Xo=Le(function(t,n){return x(t)&&x(n)?Xo(t,n):n}),Yo=Le(function(t,n){return n}),qo=function(t){var n,e,o=(n=[],e=[],St(t,function(t){Ve(t,function(t){return e.push(t)},function(t){return n.push(t)})}),{values:n,errors:e});return 0<o.errors.length?r(No,ft)(o.errors):zo(o.values)},Ko=Ke(zo),Jo=function(e){return{extract:function(i,u){for(var a={},c=[],t=0,n=e;t<n.length;t++)Ne(n[t],function(t,n,e,o){var r=$e(e,i,u,t,o);Go(r,function(t){c.push.apply(c,t)},function(t){a[n]=t})},function(t,n){a[t]=n(u)});return 0<c.length?No(c):zo(a)},toString:function(){return"obj{\n"+M(e,function(t){return Ne(t,function(t,n,e,o){return t+" -> "+o.toString()},function(t,n){return"state("+t+")"})}).join("\n")+"}"}}},$o=r(to,Jo),Qo=rt(Ko),Zo=eo(u,"number"),tr=eo(y,"string"),nr=eo(w,"boolean"),er=eo(m,"function"),or=function(n){if(Object(n)!==n)return!0;switch({}.toString.call(n).slice(8,-1)){case"Boolean":case"Number":case"String":case"Date":case"RegExp":case"Blob":case"FileList":case"ImageData":case"ImageBitmap":case"ArrayBuffer":return!0;case"Array":case"Object":return Object.keys(n).every(function(t){return or(n[t])});default:return!1}},rr=Ke(function(t){return or(t)?zo(t):No("Expected value to be acceptable for sending via postMessage")}),ir=function(t){return"Errors: \n"+M(10<(n=t.errors).length?n.slice(0,10).concat([{path:[],getErrorInfo:rt("... (only showing first ten failures)")}]):n,function(t){return"Failed path: ("+t.path.join(" > ")+")\n"+t.getErrorInfo()}).join("\n")+"\n\nInput object: "+Ye(t.input);var n},ur=ze,ar=function(t,n){return{tag:"custom",newKey:t,instantiator:n}};function cr(t,n){return(e={})[t]=n,e;var e}function sr(t){return n={},St(t,function(t){n[t.key]=t.value}),n;var n}function lr(t){return m(t)?t:O}function fr(t,n,e){for(var o=t.dom,r=lr(e);o.parentNode;){var o=o.parentNode,i=At.fromDom(o),u=n(i);if(u.isSome())return u;if(r(i))break}return vt.none()}function dr(t,n,e){var o=n(t),r=lr(e);return o.orThunk(function(){return r(t)?vt.none():fr(t,n,r)})}function mr(t,n){return Lt(t.element,n.event.target)}function gr(t){if(!nt(t,"can")&&!nt(t,"abort")&&!nt(t,"run"))throw new Error("EventHandler defined by: "+JSON.stringify(t,null,2)+" does not have can, abort, or run!");return lt(lt({},ui),t)}function pr(t){return rt("alloy."+t)}function hr(t,n){tu(t,t.element,n,{})}function vr(t,n,e){tu(t,t.element,n,e)}function br(t){hr(t,Fi())}function yr(t,n,e){tu(t,n,e,{})}function xr(t,n,e,o){t.getSystem().triggerEvent(e,n,o.event)}function wr(t,n){return{key:t,value:gr({abort:n})}}function Sr(t){return{key:t,value:gr({run:function(t,n){n.event.prevent()}})}}function Cr(t,n){return{key:t,value:gr({run:n})}}function kr(t,e,o){return{key:t,value:gr({run:function(t,n){e.apply(void 0,[t,n].concat(o))}})}}function Or(t){return function(e){return{key:t,value:gr({run:function(t,n){mr(t,n)&&e(t,n)}})}}}function _r(t,n,e){var o,r=n.partUids[e];return Cr(o=t,function(t,n){t.getSystem().getByUid(r).each(function(t){xr(t,t.element,o,n)})})}function Tr(t,r){return Cr(t,function(n,t){var e=t.event,o=n.getSystem().getByDom(e.target).getOrThunk(function(){return dr(e.target,function(t){return n.getSystem().getByDom(t).toOptional()},O).getOr(n)});r(n,o,t)})}function Er(t){return Cr(t,function(t,n){n.cut()})}function Dr(t,n){return Or(t)(n)}function Br(t){return t.dom.innerHTML}function Mr(t,n){var e,o,r=Ut(t).dom,i=At.fromDom(r.createDocumentFragment());Mn(i,(e=n,(o=(r||document).createElement("div")).innerHTML=e,Kt(At.fromDom(o)))),An(t),_e(t,i)}function Ar(t){if(Zt(t))return"#shadow-root";var n=At.fromDom(t.dom.cloneNode(!1)),e=At.fromTag("div"),o=At.fromDom(n.dom.cloneNode(!0));return _e(e,o),Br(e)}function Fr(t){var n=(new Date).getTime();return t+"_"+Math.floor(1e9*Math.random())+ ++cu+String(n)}function Ir(t){var n=Gn(t)?t.dom[du]:null;return vt.from(n)}function Rr(n){function e(t){return"The component must be in a context to execute: "+t+(n?"\n"+Ar(n().element)+" is not in context.":"")}function t(t){return function(){throw new Error(e(t))}}function o(t){return function(){console.warn(e(t))}}return{debugInfo:rt("fake"),triggerEvent:o("triggerEvent"),triggerFocus:o("triggerFocus"),triggerEscape:o("triggerEscape"),broadcast:o("broadcast"),broadcastOn:o("broadcastOn"),broadcastEvent:o("broadcastEvent"),build:t("build"),addToWorld:t("addToWorld"),removeFromWorld:t("removeFromWorld"),addToGui:t("addToGui"),removeFromGui:t("removeFromGui"),getByUid:t("getByUid"),getByDom:t("getByDom"),isConnected:O}}function Vr(t,n){var e=t.toString(),o=e.indexOf(")")+1,r=e.indexOf("("),i=e.substring(r+1,o-1).split(/,\s*/);return t.toFunctionAnnotation=function(){return{name:n,parameters:vu(i)}},t}function Pr(t){return cr(bu,t)}function Hr(o){return t=function(t){for(var n=[],e=1;e<arguments.length;e++)n[e-1]=arguments[e];return o.apply(void 0,H([t.getApis(),t],n,!1))},e=(n=o.toString()).indexOf(")")+1,r=n.indexOf("("),i=n.substring(r+1,e-1).split(/,\s*/),t.toFunctionAnnotation=function(){return{name:"OVERRIDE",parameters:vu(i.slice(1))}},t;var t,n,e,r,i}function zr(t,r){var i={};return J(t,function(t,o){J(t,function(t,n){var e=tt(i,n).getOr([]);i[n]=e.concat([r(o,t)])})}),i}function Nr(t){return{classes:E(t.classes)?[]:t.classes,attributes:E(t.attributes)?{}:t.attributes,styles:E(t.styles)?{}:t.styles}}function Lr(t){return t.cHandler}function Wr(t,n){return{name:t,handler:n}}function Ur(t,n,e){var o=n[e];return o?function(u,t,a){try{var n=G(t,function(t,n){var e=t.name,o=n.name,r=a.indexOf(e),i=a.indexOf(o);if(-1===r)throw new Error("The ordering for "+u+" does not have an entry for "+e+".\nOrder specified: "+JSON.stringify(a,null,2));if(-1===i)throw new Error("The ordering for "+u+" does not have an entry for "+o+".\nOrder specified: "+JSON.stringify(a,null,2));return r<i?-1:i<r?1:0});return Re.value(n)}catch(t){return Re.error([t])}}("Event: "+e,t,o).map(function(t){var e,n,o,r,i=M(t,function(t){return t.handler});return{can:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return R(n,function(t,n){return t&&n.can.apply(void 0,e)},!0)},abort:(o=n=e=i,r=function(t){return t.abort},function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return R(o,function(t,n){return t||r(n).apply(void 0,e)},!1)}),run:function(){for(var n=[],t=0;t<arguments.length;t++)n[t]=arguments[t];St(e,function(t){t.run.apply(void 0,n)})}}}):Re.error(["The event ("+e+') has more than one behaviour that listens to it.\nWhen this occurs, you must specify an event ordering for the behaviours in your spec (e.g. [ "listing", "toggling" ]).\nThe behaviours that can trigger it are: '+JSON.stringify(M(t,function(t){return t.name}),null,2)])}function jr(t,n){var e=rn(t,n);return void 0===e||""===e?[]:e.split(" ")}function Gr(t){return void 0!==t.dom.classList}function Xr(t,n){var e,o,r;Gr(t)?t.dom.classList.add(n):(o=n,r=jr(e=t,"class").concat([o]),on(e,"class",r.join(" ")))}function Yr(t,n){var e,o,r,i;Gr(t)?t.dom.classList.remove(n):(r=n,0<(i=F(jr(o=t,"class"),function(t){return t!==r})).length?on(o,"class",i.join(" ")):cn(o,"class")),0===(Gr(e=t)?e.dom.classList:jr(e,"class")).length&&cn(e,"class")}function qr(t,n){return Gr(t)&&t.dom.classList.contains(n)}function Kr(n,t){St(t,function(t){Xr(n,t)})}function Jr(n,t){St(t,function(t){Yr(n,t)})}function $r(t){return t.dom.value}function Qr(t,n){if(void 0===n)throw new Error("Value.set was undefined");t.dom.value=n}function Zr(t){var e,n,o,r,i=(e=tt(t,"behaviours").getOr({}),z(kt(e),function(t){var n=e[t];return d(n)?[n.me]:[]}));return n=t,r=M(o=i,function(t){return _o(t.name(),[fo("config"),To("state",yu)])}),{list:o,data:dt(uo("component.behaviours",Jo(r),n.behaviours).fold(function(t){throw new Error(ir(t)+"\nComplete spec:\n"+JSON.stringify(n,null,2))},h),function(t){return rt(t.map(function(t){return{config:t.config,state:t.state.init(t.config)}}))})}}function ti(t,n,e){var o,r,i=lt(lt({},(o=t).dom),{uid:o.uid,domChildren:M(o.components,function(t){return t.element})}),u=t.domModification.fold(function(){return Nr({})},Nr),a=0<n.length?function(n,t,e,o){var r=lt({},t);function i(t){return I(t,function(t,n){return lt(lt({},n.modification),t)},{})}St(e,function(t){r[t.name()]=t.exhibit(n,o)});var u=zr(r,function(t,n){return{name:t,modification:n}});return Nr({classes:I(u.classes,function(t,n){return n.modification.concat(t)},[]),attributes:i(u.attributes),styles:i(u.styles)})}(e,{"alloy.base.modification":u},n,i):u;return lt(lt({},r=i),{attributes:lt(lt({},r.attributes),a.attributes),styles:lt(lt({},r.styles),a.styles),classes:r.classes.concat(a.classes)})}function ni(t,n,e){var o,r,i,u,a,c={"alloy.base.behaviour":t.events},s=t.eventOrder;return r=e,i=n,o=zr(lt(lt({},c),(u=r,a={},St(i,function(t){a[t.name()]=t.handlers(u)}),a)),Wr),wu(o,s).getOrDie()}function ei(e){function t(){return l}var n=Vo(hu),o=ao(uo("custom.definition",Cu,e)),r=Zr(e),i=r.list,u=r.data,a=function(t){var n=At.fromTag(t.tag),e=t.attributes,o=n.dom;J(e,function(t,n){en(o,n,t)}),Kr(n,t.classes),dn(n,t.styles),t.innerHtml.each(function(t){return Mr(n,t)});var r=t.domChildren;return Mn(n,r),t.value.each(function(t){Qr(n,t)}),t.uid,mu(n,t.uid),n}(ti(o,i,u)),c=ni(o,i,u),s=Vo(o.components),l={uid:e.uid,getSystem:n.get,config:function(t){var n=u;return(m(n[t.name()])?n[t.name()]:function(){throw new Error("Could not find "+t.name()+" in "+JSON.stringify(e,null,2))})()},hasConfigured:function(t){return m(u[t.name()])},spec:e,readState:function(t){return u[t]().map(function(t){return t.state.readState()}).getOr("not enabled")},getApis:function(){return o.apis},connect:function(t){n.set(t)},disconnect:function(){n.set(Rr(t))},element:a,syncComponents:function(){var t=z(Kt(a),function(t){return n.get().getByDom(t).fold(function(){return[]},j)});s.set(t)},components:s.get,events:c};return l}function oi(t){var n=At.fromText(t);return ku({element:n})}Po([{bothErrors:["error1","error2"]},{firstError:["error1","value2"]},{secondError:["value1","error2"]},{bothValues:["value1","value2"]}]);var ri,ii,ui={can:_,abort:O,run:st},ai=rt,ci=ai("touchstart"),si=ai("touchmove"),li=ai("touchend"),fi=ai("touchcancel"),di=ai("mousedown"),mi=ai("mousemove"),gi=ai("mouseout"),pi=ai("mouseup"),hi=ai("mouseover"),vi=ai("focusin"),bi=ai("focusout"),yi=ai("keydown"),xi=ai("keyup"),wi=ai("input"),Si=ai("change"),Ci=ai("click"),ki=ai("transitioncancel"),Oi=ai("transitionend"),_i=ai("transitionstart"),Ti=ai("selectstart"),Ei={tap:pr("tap")},Di=pr("focus"),Bi=pr("blur.post"),Mi=pr("paste.post"),Ai=pr("receive"),Fi=pr("execute"),Ii=pr("focus.item"),Ri=Ei.tap,Vi=pr("longpress"),Pi=pr("sandbox.close"),Hi=pr("typeahead.cancel"),zi=pr("system.init"),Ni=pr("system.touchmove"),Li=pr("system.touchend"),Wi=pr("system.scroll"),Ui=pr("system.resize"),ji=pr("system.attached"),Gi=pr("system.detached"),Xi=pr("system.dismissRequested"),Yi=pr("system.repositionRequested"),qi=pr("focusmanager.shifted"),Ki=pr("slotcontainer.visibility"),Ji=pr("change.tab"),$i=pr("dismiss.tab"),Qi=pr("highlight"),Zi=pr("dehighlight"),tu=function(t,n,e,o){var r=lt({target:n},o);t.getSystem().triggerEvent(e,n,r)},nu=sr,eu=Or(ji()),ou=Or(Gi()),ru=Or(zi()),iu=(ri=Fi(),function(t){return Cr(ri,t)}),uu=nu([{key:Di(),value:gr({can:function(t,n){var e,o=n.event,r=o.originator,i=o.target;return!(Lt(e=r,t.element)&&!Lt(e,i)&&(console.warn(Di()+" did not get interpreted by the desired target. \nOriginator: "+Ar(r)+"\nTarget: "+Ar(i)+"\nCheck the "+Di()+" event handlers"),1))}})}]),au=Object.freeze({__proto__:null,events:uu}),cu=0,su=rt("alloy-id-"),lu=rt("data-alloy-id"),fu=su(),du=lu(),mu=function(t,n){Object.defineProperty(t.dom,du,{value:n,writable:!0})},gu=Fr,pu=h,hu=Rr(),vu=function(t){return M(t,function(t){return Bt(t,"/*")?t.substring(0,t.length-"/*".length):t})},bu=Fr("alloy-premade"),yu={init:function(){return xu({readState:rt("No State required")})}},xu=function(t){return t},wu=function(t,a){var n,e,o,r,i,u,c=$(t,function(r,u){return(1===r.length?Re.value(r[0].handler):Ur(r,a,u)).map(function(t){var n,i,e=(i=m(n=t)?{can:_,abort:O,run:n}:n,function(t,n){for(var e=[],o=2;o<arguments.length;o++)e[o-2]=arguments[o];var r=[t,n].concat(e);i.abort.apply(void 0,r)?n.stop():i.can.apply(void 0,r)&&i.run.apply(void 0,r)}),o=1<r.length?F(a[u],function(n){return T(r,function(t){return t.name===n})}).join(" > "):r[0].name;return cr(u,{handler:e,purpose:o})})});return n={},e=[],o=[],St(c,function(t){t.fold(function(t){e.push(t)},function(t){o.push(t)})}),0<(u={errors:e,values:o}).errors.length?Re.error(ft(u.errors)):(i=n,0===(r=u.values).length?Re.value(i):Re.value(Xo(i,Yo.apply(void 0,r))))},Su="alloy.base.behaviour",Cu=Jo([ur("dom","dom",We(),Jo([fo("tag"),To("styles",{}),To("classes",[]),To("attributes",{}),xo("value"),xo("innerHtml")])),fo("components"),fo("uid"),To("events",{}),To("apis",{}),ur("eventOrder","eventOrder",((ii={})[Fi()]=["disabling",Su,"toggling","typeaheadevents"],ii[Di()]=[Su,"focusing","keying"],ii[zi()]=[Su,"disabling","toggling","representing"],ii[wi()]=[Su,"representing","streaming","invalidating"],ii[Gi()]=[Su,"representing","item-events","tooltipping"],ii[di()]=["focusing",Su,"item-type-events"],ii[ci()]=["focusing",Su,"item-type-events"],ii[hi()]=["item-type-events","tooltipping"],ii[Ai()]=["receiving","reflecting","tooltipping"],Xe(rt(ii))),Qo()),xo("domModification")]),ku=function(t){var n=co("external.component",Ze([fo("element"),xo("uid")]),t),e=Vo(Rr()),o=n.uid.getOrThunk(function(){return gu("external")});mu(n.element,o);var r={uid:o,getSystem:e.get,config:vt.none,hasConfigured:O,connect:function(t){e.set(t)},disconnect:function(){e.set(Rr(function(){return r}))},getApis:function(){return{}},element:n.element,spec:t,readState:rt("No state"),syncComponents:st,components:rt([]),events:{}};return Pr(r)},Ou=gu,_u=function(u){return tt(u,bu).getOrThunk(function(){var t,n,e,o,r,i=Tt(u,"uid")?u:lt({uid:Ou("")},u);return t=pu(i),n=t.events,e=s(t,["events"]),o=M(tt(e,"components").getOr([]),_u),r=lt(lt({},e),{events:lt(lt({},au),n),components:o}),Re.value(ei(r)).getOrDie()})},Tu=Pr;function Eu(t,n,e,o,r){return t(e,o)?vt.some(e):m(r)&&r(e)?vt.none():n(e,o,r)}function Du(t,n,e){for(var o=t.dom,r=m(e)?e:O;o.parentNode;){var o=o.parentNode,i=At.fromDom(o);if(n(i))return vt.some(i);if(r(i))break}return vt.none()}function Bu(t,n,e){return Eu(function(t,n){return n(t)},Du,t,n,e)}function Mu(t,n,e){return Bu(t,n,e).isSome()}function Au(t,n,e){return Du(t,function(t){return zt(t,n)},e)}function Fu(t,n){return e=n,Nt(o=void 0===t?document:t.dom)?vt.none():vt.from(o.querySelector(e)).map(At.fromDom);var e,o}function Iu(t,n,e){return Eu(zt,Au,t,n,e)}function Ru(){var n=Fr("aria-owns");return{id:n,link:function(t){on(t,"aria-owns",n)},unlink:function(t){cn(t,"aria-owns")}}}var Vu,Pu,Hu=function(n,t){return Mu(t,function(t){return Lt(t,n.element)},O)||(e=n,Bu(t,function(t){if(!Gn(t))return!1;var n=rn(t,"id");return void 0!==n&&-1<n.indexOf("aria-owns")}).bind(function(t){var n=rn(t,"id");return Fu(me(t),'[aria-owns="'+n+'"]')}).exists(function(t){return Hu(e,t)}));var e},zu="unknown";function Nu(n,t,e){var o,r,i,u;switch(tt(Lu.get(),n).orThunk(function(){return K(kt(Lu.get()),function(t){return-1<n.indexOf(t)?vt.some(Lu.get()[t]):vt.none()})}).getOr(Vu.NORMAL)){case Vu.NORMAL:return e(Uu());case Vu.LOGGING:var a=(o=n,r=t,i=[],u=(new Date).getTime(),{logEventCut:function(t,n,e){i.push({outcome:"cut",target:n,purpose:e})},logEventStopped:function(t,n,e){i.push({outcome:"stopped",target:n,purpose:e})},logNoParent:function(t,n,e){i.push({outcome:"no-parent",target:n,purpose:e})},logEventNoHandlers:function(t,n){i.push({outcome:"no-handlers-left",target:n})},logEventResponse:function(t,n,e){i.push({outcome:"response",purpose:e,target:n})},write:function(){var t=(new Date).getTime();wt(["mousemove","mouseover","mouseout",zi()],o)||console.log(o,{event:o,time:t-u,target:r.dom,sequence:M(i,function(t){return wt(["cut","stopped","response"],t.outcome)?"{"+t.purpose+"} "+t.outcome+" at ("+Ar(t.target)+")":t.outcome})})}}),c=e(a);return a.write(),c;case Vu.STOP:return!0}}(Pu=Vu=Vu||{})[Pu.STOP=0]="STOP",Pu[Pu.NORMAL=1]="NORMAL",Pu[Pu.LOGGING=2]="LOGGING";var Lu=Vo({}),Wu=["alloy/data/Fields","alloy/debugging/Debugging"],Uu=rt({logEventCut:st,logEventStopped:st,logNoParent:st,logEventNoHandlers:st,logEventResponse:st,write:st}),ju=rt([fo("menu"),fo("selectedMenu")]),Gu=rt([fo("item"),fo("selectedItem")]);function Xu(){return vo("markers",[fo("backgroundMenu")].concat(ju()).concat(Gu()))}function Yu(t){return vo("markers",M(t,fo))}function qu(t,n,e){return void 0!==(o=new Error).stack&&V(o.stack.split("\n"),function(n){return 0<n.indexOf("alloy")&&!T(Wu,function(t){return-1<n.indexOf(t)})}).getOr(zu),ur(n,n,e,ro(function(e){return Re.value(function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.apply(void 0,t)})}));var o}function Ku(t){return qu(0,t,je(st))}function Ju(t){return qu(0,t,je(vt.none))}function $u(t){return qu(0,t,We())}function Qu(t){return qu(0,t,We())}function Zu(t,n){return ar(t,rt(n))}function ta(t){return ar(t,h)}function na(t,n,e,o,r,i,u,a){return{x:t,y:n,bubble:e,direction:o,placement:r,restriction:i,label:u+"-"+r,alwaysFit:a=void 0!==a&&a}}function ea(t,n,e,o){var r=t+n;return o<r?e:r<e?o:r}function oa(e,n){return U(["left","right","top","bottom"],function(t){return tt(n,t).map(function(n){return function(t){switch(n){case 1:return t.x;case 0:return t.x+t.width;case 2:return t.y;case 3:return t.y+t.height}}(e)})})}function ra(t,n){return t.x+t.width/2-n.width/2}function ia(t,n){return t.x+t.width-n.width}function ua(t,n){return t.y-n.height}function aa(t){return t.y+t.height}function ca(t,n){return t.y+t.height/2-n.height/2}function sa(t,n,e){return na(t.x+t.width,ca(t,n),e.east(),La(),"east",oa(t,{left:0}),ja)}function la(t,n,e){return na(t.x-n.width,ca(t,n),e.west(),Wa(),"west",oa(t,{right:1}),ja)}function fa(){return[Ga,Xa,Ya,qa,Ja,Ka,sa,la]}function da(){return[Xa,Ga,qa,Ya,Ja,Ka,sa,la]}function ma(){return[Ya,qa,Ga,Xa,Ka,Ja]}function ga(){return[qa,Ya,Xa,Ga,Ka,Ja]}function pa(){return[Ga,Xa,Ya,qa,Ja,Ka]}function ha(){return[Xa,Ga,qa,Ya,Ja,Ka]}function va(e,o,r){return ru(function(t,n){r(t,e,o)})}function ba(t){return{key:t,value:void 0}}function ya(t){var n,e,o,r,i,u,a,c,s=co("Creating behaviour: "+t.name,nc,t);return n=s.fields,e=s.name,o=s.active,r=s.apis,i=s.extra,u=s.state,a=Ze(n),c=_o(e,[wo("config",Ze(n))]),Za(a,c,e,o,r,i,u)}function xa(t){var n,e=co("Creating behaviour: "+t.name,ec,t),o=so(e.branchKey,e.branches),r=e.name,i=e.active,u=e.apis,a=e.extra,c=e.state,s=_o(r,[wo("config",n=o)]);return Za(n,s,r,i,u,a,c)}function wa(){return At.fromDom(document)}function Sa(t){return t.dom.focus()}function Ca(t){var n=me(t).dom;return t.dom===n.activeElement}function ka(t){return void 0===t&&(t=wa()),vt.from(t.dom.activeElement).map(At.fromDom)}function Oa(n){return ka(me(n)).filter(function(t){return n.dom.contains(t.dom)})}function _a(t,e){var o=me(e),n=ka(o).bind(function(n){function t(t){return Lt(n,t)}var r,i;return t(e)?vt.some(e):(r=t,(i=function(t){for(var n=0;n<t.childNodes.length;n++){var e=At.fromDom(t.childNodes[n]);if(r(e))return vt.some(e);var o=i(t.childNodes[n]);if(o.isSome())return o}return vt.none()})(e.dom))}),r=t(e);return n.each(function(n){ka(o).filter(function(t){return Lt(t,n)}).fold(function(){Sa(n)},st)}),r}function Ta(t,n,e,o,r){function i(t){return t+"px"}return{position:t,left:n.map(i),top:e.map(i),right:o.map(i),bottom:r.map(i)}}function Ea(t,n){var e;mn(t,lt(lt({},e=n),{position:vt.some(e.position)}))}function Da(t,n,e,o,r,i){var u=n.rect,a=u.x-e,c=u.y-o,s=r-(a+u.width),l=i-(c+u.height),f=vt.some(a),d=vt.some(c),m=vt.some(s),g=vt.some(l),p=vt.none();return n.direction.fold(function(){return Ta(t,f,d,p,p)},function(){return Ta(t,p,d,m,p)},function(){return Ta(t,f,p,p,g)},function(){return Ta(t,p,p,m,g)},function(){return Ta(t,f,d,p,p)},function(){return Ta(t,f,p,p,g)},function(){return Ta(t,f,d,p,p)},function(){return Ta(t,p,d,m,p)})}function Ba(t,r){return t.fold(function(){var t=r.rect;return Ta("absolute",vt.some(t.x),vt.some(t.y),vt.none(),vt.none())},function(t,n,e,o){return Da("absolute",r,t,n,e,o)},function(t,n,e,o){return Da("fixed",r,t,n,e,o)})}function Ma(t,n){var e=S(Hn,n),o=t.fold(e,e,function(){var t=In();return Hn(n).translate(-t.left,-t.top)}),r=On(n),i=wn(n);return Be(o.left,o.top,r,i)}rt(Jo(Gu().concat(ju())));var Aa=rt(Jo(Gu())),Fa=rt(vo("initSize",[fo("numColumns"),fo("numRows")])),Ia=Po([{southeast:[]},{southwest:[]},{northeast:[]},{northwest:[]},{south:[]},{north:[]},{east:[]},{west:[]}]),Ra=Ia.southeast,Va=Ia.southwest,Pa=Ia.northeast,Ha=Ia.northwest,za=Ia.south,Na=Ia.north,La=Ia.east,Wa=Ia.west,Ua=function(t,n,e){return Math.min(Math.max(t,n),e)},ja="layout",Ga=function(t,n,e){return na(t.x,aa(t),e.southeast(),Ra(),"southeast",oa(t,{left:1,top:3}),ja)},Xa=function(t,n,e){return na(ia(t,n),aa(t),e.southwest(),Va(),"southwest",oa(t,{right:0,top:3}),ja)},Ya=function(t,n,e){return na(t.x,ua(t,n),e.northeast(),Pa(),"northeast",oa(t,{left:1,bottom:2}),ja)},qa=function(t,n,e){return na(ia(t,n),ua(t,n),e.northwest(),Ha(),"northwest",oa(t,{right:0,bottom:2}),ja)},Ka=function(t,n,e){return na(ra(t,n),ua(t,n),e.north(),Na(),"north",oa(t,{bottom:2}),ja)},Ja=function(t,n,e){return na(ra(t,n),aa(t),e.south(),za(),"south",oa(t,{top:3}),ja)},$a=Object.freeze({__proto__:null,events:function(a){return nu([Cr(Ai(),function(r,t){var n,i=a.channels,e=kt(i),u=t,o=(n=u).universal?e:F(e,function(t){return wt(n.channels,t)});St(o,function(t){var n=i[t],e=n.schema,o=co("channel["+t+"] data\nReceiver: "+Ar(r.element),e,u.data);n.onReceive(r,o)})})])}}),Qa=[mo("channels",io(Re.value,Ze([$u("onReceive"),To("schema",Qo())])))],Za=function(e,t,f,n,o,r,i){function u(t){return nt(t,f)?t[f]():vt.none()}var a=dt(o,function(t,n){return r=f,e=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];var o=[e].concat(t);return e.config({name:rt(r)}).fold(function(){throw new Error("We could not find any behaviour configuration for: "+r+". Using API: "+u)},function(t){var n=Array.prototype.slice.call(o,1);return i.apply(void 0,[e,t.config,t.state].concat(n))})},o=u=n,a=(i=t).toString(),c=a.indexOf(")")+1,s=a.indexOf("("),l=a.substring(s+1,c-1).split(/,\s*/),e.toFunctionAnnotation=function(){return{name:o,parameters:vu(l.slice(0,1).concat(l.slice(3)))}},e;var r,i,u,e,o,a,c,s,l}),c=dt(r,Vr),s=lt(lt(lt({},c),a),{revoke:S(ba,f),config:function(t){var n=co(f+"-config",e,t);return{key:f,value:{config:n,me:s,configAsRaw:Rt(function(){return co(f+"-config",e,t)}),initialConfig:t,state:i}}},schema:rt(t),exhibit:function(t,e){return Et(u(t),tt(n,"exhibit"),function(t,n){return n(e,t.config,t.state)}).getOrThunk(function(){return Nr({})})},name:rt(f),handlers:function(t){return u(t).map(function(t){return tt(n,"events").getOr(function(){return{}})(t.config,t.state)}).getOr({})}});return s},tc=sr,nc=Ze([fo("fields"),fo("name"),To("active",{}),To("apis",{}),To("state",yu),To("extra",{})]),ec=Ze([fo("branchKey"),fo("branches"),fo("name"),To("active",{}),To("apis",{}),To("state",yu),To("extra",{})]),oc=rt(void 0),rc=ya({fields:Qa,name:"receiving",active:$a}),ic=Object.freeze({__proto__:null,exhibit:function(t,n){return Nr({classes:[],styles:n.useFixed()?{}:{position:"relative"}})}}),uc=Po([{none:[]},{relative:["x","y","width","height"]},{fixed:["x","y","width","height"]}]),ac=function(t,n,e){var o=Se(n,e);return t.fold(rt(o),rt(o),function(){var t=In();return o.translate(-t.left,-t.top)})};function cc(t){return un(t,Tc)}function sc(t,n,e,o){var r,i,u,a,c,s,l,f,d,m,g,p,h,v,b,y,x,w,S,C,k,O,_,T,E,D,B,M,A,F,I,R,V,P,H,z,N,L,W,U=t.bubble,j=U.offset,G=(V=o,P=t.restriction,H=j,z=ot("left",V.x),N=ot("top",V.y),L=ot("right",V.right),W=ot("bottom",V.bottom),Be(z,N,L-z,W-N)),X=t.x+j.left,Y=t.y+j.top,q=Be(X,Y,n,e),K=(r=G.x,i=G.y,u=G.right,a=G.bottom,c=q.x,s=q.y,l=q.right,f=q.bottom,d=q.width,m=q.height,{originInBounds:r<=c&&c<=u&&i<=s&&s<=a,sizeInBounds:l<=u&&r<=l&&f<=a&&i<=f,visibleW:Math.min(d,r<=c?u-c:l-r),visibleH:Math.min(m,i<=s?a-s:f-i)}),J=K.visibleW,$=K.visibleH,Q=K.originInBounds&&K.sizeInBounds,Z=Q?q:(g=G.x,p=G.y,h=G.right,v=G.bottom,b=q.x,y=q.y,x=q.width,w=q.height,S=Math.max(g,h-x),C=Math.max(p,v-w),k=Ua(b,g,S),O=Ua(y,p,C),_=Math.min(k+x,h)-k,T=Math.min(O+w,v)-O,Be(k,O,_,T)),tt=0<Z.width&&0<Z.height,nt=(E=t.direction,M=rt((D=Z).bottom-(B=o).y),A=rt(B.bottom-D.y),F=E.fold(A,A,M,M,A,M,A,A),I=rt(D.right-B.x),R=rt(B.right-D.x),{maxWidth:E.fold(R,I,R,I,R,R,R,I),maxHeight:F}),et={rect:Z,maxHeight:nt.maxHeight,maxWidth:nt.maxWidth,direction:t.direction,placement:t.placement,classes:{on:U.classesOn,off:U.classesOff},layout:t.label,testY:Y};function ot(r,i){return P[r].map(function(t){var n="top"===r||"bottom"===r,e=n?H.top:H.left,o=("left"===r||"top"===r?Math.max:Math.min)(t,i)+e;return n?Ua(o,V.y,V.bottom):Ua(o,V.x,V.right)}).getOr(i)}return Q||t.alwaysFit?Ec.fit(et):Ec.nofit(et,J,$,tt)}function lc(t){function n(){return e.get().each(t)}var e=Vo(vt.none());return{clear:function(){n(),e.set(vt.none())},isSet:function(){return e.get().isSome()},get:function(){return e.get()},set:function(t){n(),e.set(vt.some(t))}}}function fc(){return lc(function(t){return t.unbind()})}function dc(){var n=lc(st);return lt(lt({},n),{on:function(t){return n.get().each(t)}})}function mc(t,n,e){return Tn(t,n,Dc,e,!1)}function gc(t,n,e){return Tn(t,n,Dc,e,!0)}function pc(o,e){function r(t){var n,e=null!==(n=t.raw.pseudoElement)&&void 0!==n?n:"";return Lt(t.target,o)&&!at(e)&&wt(Mc,t.raw.propertyName)}function t(t){var n;(g(t)||r(t))&&(a.clear(),c.clear(),!g(n=null==t?void 0:t.raw.type)&&n!==Oi()||(clearTimeout(i),cn(o,Ac),Jr(o,e.classes)))}function n(){a.set(mc(o,Oi(),t)),c.set(mc(o,ki(),t))}var i,u,a=fc(),c=fc();"ontransitionstart"in o.dom?u=mc(o,_i(),function(t){r(t)&&(u.unbind(),n())}):n();var s,l,f=(s=o,l=d("transition-delay"),R(d("transition-duration"),function(t,n,e){var o=m(l[e])+m(n);return Math.max(t,o)},0));function d(t){var n=gn(s,t);return F(y(n)?n.split(/\s*,\s*/):[],at)}function m(t){if(y(t)&&/^[\d.]+/.test(t)){var n=parseFloat(t);return Bt(t,"ms")?n:1e3*n}return 0}requestAnimationFrame(function(){i=setTimeout(t,f+17),on(o,Ac,i)})}function hc(t,n,e,o,r,i){var u,a,c,s,l,f,d,m,g,p=(u=o,a=r,i.exists(function(t){var n=u.mode;return"all"===n||t[n]!==a[n]}));function h(t){return parseFloat(t).toFixed(3)}p||(g=t,N(o.classes,function(t){return qr(g,t)}))?(fn(t,"position",e.position),c=Ma(n,t),s=Ba(n,lt(lt({},r),{rect:c})),l=U(Mc,function(t){return s[t]}),m=e,Q(l,function(t,n){var e,o,r,i=m[n].map(h),u=t.map(h);return!Et(e=i,o=u,r=void 0===r?v:r).getOr(e.isNone()&&o.isNone())}).isSome()&&(mn(t,l),p&&(Kr(f=t,(d=o).classes),un(f,Ac).each(function(t){clearTimeout(parseInt(t,10)),cn(f,Ac)}),pc(f,d)),bn(t))):Jr(t,o.classes)}function vc(t,n,e,o){vn(n,"max-height"),vn(n,"max-width");var r,s,i,l,f,d,m,g,p,u={width:On(r=n),height:wn(r)};return s=n,i=o.preference,l=t,f=u,d=e,m=o.bounds,g=f.width,p=f.height,R(i,function(t,n){var e=S(a,n);return t.fold(rt(t),e)},Ec.nofit({rect:l,maxHeight:f.height,maxWidth:f.width,direction:Ra(),placement:"southeast",classes:{on:[],off:[]},layout:"none",testY:l.y},-1,-1,!1)).fold(h,h);function a(t,r,i,u,a){var c=sc(t(l,f,d,s,m),g,p,m);return c.fold(rt(c),function(t,n,e,o){return(a===o?u<e||i<n:!a&&o)?c:Ec.nofit(r,i,u,a)})}}function bc(t,n){var e=t,o=Math.floor(n);fn(e,"max-height",xe.max(e,o,["margin-top","border-top-width","padding-top","padding-bottom","border-bottom-width","margin-bottom"])+"px")}function yc(t,n,e){return void 0===t[n]?e:t[n]}function xc(t,n,e,o){function r(t){return tt(e,t).getOr([])}function i(t,n,e){var o=W(Vc,e);return{offset:Se(t,n),classesOn:z(e,r),classesOff:z(o,r)}}var u=t*(o=void 0===o?1:o),a=n*o;return{southeast:function(){return i(-t,n,["top","alignLeft"])},southwest:function(){return i(t,n,["top","alignRight"])},south:function(){return i(-t/2,n,["top","alignCentre"])},northeast:function(){return i(-t,-n,["bottom","alignLeft"])},northwest:function(){return i(t,-n,["bottom","alignRight"])},north:function(){return i(-t/2,-n,["bottom","alignCentre"])},east:function(){return i(t,-n/2,["valignCentre","left"])},west:function(){return i(-t,-n/2,["valignCentre","right"])},insetNortheast:function(){return i(u,a,["top","alignLeft","inset"])},insetNorthwest:function(){return i(-u,a,["top","alignRight","inset"])},insetNorth:function(){return i(-u/2,a,["top","alignCentre","inset"])},insetSoutheast:function(){return i(u,-a,["bottom","alignLeft","inset"])},insetSouthwest:function(){return i(-u,-a,["bottom","alignRight","inset"])},insetSouth:function(){return i(-u/2,-a,["bottom","alignCentre","inset"])},insetEast:function(){return i(-u,-a/2,["valignCentre","right","inset"])},insetWest:function(){return i(u,-a/2,["valignCentre","left","inset"])}}}function wc(){return xc(0,0,{})}function Sc(n,e){return function(t){return"rtl"===Hc(t)?e:n}}uc.none;var Cc,kc,Oc=uc.relative,_c=uc.fixed,Tc="data-alloy-placement",Ec=Po([{fit:["reposition"]},{nofit:["reposition","visibleW","visibleH","isVisible"]}]),Dc=_,Bc=_n,Mc=["top","bottom","right","left"],Ac="data-alloy-transition-timer",Fc=rt(function(t,n){bc(t,n),dn(t,{"overflow-x":"hidden","overflow-y":"auto"})}),Ic=rt(function(t,n){bc(t,n)}),Rc=function(t,n,e,o){var r,i,u,a,c=vc(t,n,e,o),s=n,l=c,f=Ba((r=o).origin,l);return r.transition.each(function(t){hc(s,r.origin,f,t,l,r.lastPlacement)}),Ea(s,f),a=c.placement,on(n,Tc,a),Jr(i=n,(u=c.classes).off),Kr(i,u.on),(0,o.maxHeightFunction)(n,c.maxHeight),(0,o.maxWidthFunction)(n,c.maxWidth),{layout:c.layout,placement:c.placement}},Vc=["valignCentre","alignLeft","alignRight","alignCentre","top","bottom","left","right","inset"],Pc=h,Hc=function(t){return"rtl"===gn(t,"direction")?"rtl":"ltr"};function zc(t){return Mu(t,function(t){return Gn(t)&&rn(t,"data-alloy-vertical-dir")===Cc.BottomToTop})}function Nc(){return _o("layouts",[fo("onLtr"),fo("onRtl"),xo("onBottomLtr"),xo("onBottomRtl")])}function Lc(n,t,e,o,r,i,u){var a=u.map(zc).getOr(!1),c=t.layouts.map(function(t){return t.onLtr(n)}),s=t.layouts.map(function(t){return t.onRtl(n)});return Sc(a?t.layouts.bind(function(t){return t.onBottomLtr.map(function(t){return t(n)})}).or(c).getOr(r):c.getOr(e),a?t.layouts.bind(function(t){return t.onBottomRtl.map(function(t){return t(n)})}).or(s).getOr(i):s.getOr(o))(n)}function Wc(t){return t.fold(h,function(t,n,e){return t.translate(-n,-e)})}function Uc(t){return t.fold(h,h)}function jc(t){return R(t,function(t,n){return t.translate(n.left,n.top)},Se(0,0))}function Gc(t){return jc(M(t,Uc))}function Xc(t,n,e){var o,r,i=In(Ut(t.element)),u=(o=t,r=Xt(e.root).dom,vt.from(r.frameElement).map(At.fromDom).filter(function(t){return Lt(Ut(t),Ut(o.element))}).map(Cn).getOr(i));return is(u,i.left,i.top)}function Yc(t,n,e,o){var r=rs(Se(t,n));return vt.some({point:r,width:e,height:o})}function qc(t,a,c,s,l){return t.map(function(t){var n=[a,t.point],e=s.fold(function(){return Gc(n)},function(){return Gc(n)},function(){return jc(M(n,Wc))}),o={x:e.left,y:e.top,width:t.width,height:t.height},r=(c.showAbove?ma:pa)(),i=(c.showAbove?ga:ha)(),u=Lc(l,c,r,i,r,i,vt.none());return Pc({anchorBox:o,bubble:c.bubble.getOr(wc()),overrides:c.overrides,layouts:u,placer:vt.none()})})}function Kc(t,n,e){var o,r=t.document.createRange(),i=r;return n.fold(function(t){i.setStartBefore(t.dom)},function(t,n){i.setStart(t.dom,n)},function(t){i.setStartAfter(t.dom)}),o=r,e.fold(function(t){o.setEndBefore(t.dom)},function(t,n){o.setEnd(t.dom,n)},function(t){o.setEndAfter(t.dom)}),r}function Jc(t,n,e,o,r){var i=t.document.createRange();return i.setStart(n.dom,e),i.setEnd(o.dom,r),i}function $c(t){return{left:t.left,top:t.top,right:t.right,bottom:t.bottom,width:t.width,height:t.height}}function Qc(t,n,e){return n(At.fromDom(e.startContainer),e.startOffset,At.fromDom(e.endContainer),e.endOffset)}function Zc(i,t){return r=i,o=t.match({domRange:function(t){return{ltr:rt(t),rtl:vt.none}},relative:function(t,n){return{ltr:Rt(function(){return Kc(r,t,n)}),rtl:Rt(function(){return vt.some(Kc(r,n,t))})}},exact:function(t,n,e,o){return{ltr:Rt(function(){return Jc(r,t,n,e,o)}),rtl:Rt(function(){return vt.some(Jc(r,e,o,t,n))})}}}),((e=(n=o).ltr()).collapsed?n.rtl().filter(function(t){return!1===t.collapsed}).map(function(t){return ds.rtl(At.fromDom(t.endContainer),t.endOffset,At.fromDom(t.startContainer),t.startOffset)}).getOrThunk(function(){return Qc(0,ds.ltr,e)}):Qc(0,ds.ltr,e)).match({ltr:function(t,n,e,o){var r=i.document.createRange();return r.setStart(t.dom,n),r.setEnd(e.dom,o),r},rtl:function(t,n,e,o){var r=i.document.createRange();return r.setStart(e.dom,o),r.setEnd(t.dom,n),r}});var r,n,e,o}(Cc=Cc||{}).TopToBottom="toptobottom",Cc.BottomToTop="bottomtotop";var ts="data-alloy-vertical-dir",ns=[fo("hotspot"),xo("bubble"),To("overrides",{}),Nc(),Zu("placement",function(t,n,e){var o=Ma(e,n.hotspot.element),r=Lc(t.element,n,pa(),ha(),ma(),ga(),vt.some(n.hotspot.element));return vt.some(Pc({anchorBox:o,bubble:n.bubble.getOr(wc()),overrides:n.overrides,layouts:r,placer:vt.none()}))})],es=[fo("x"),fo("y"),To("height",0),To("width",0),To("bubble",wc()),To("overrides",{}),Nc(),Zu("placement",function(t,n,e){var o=ac(e,n.x,n.y),r=Be(o.left,o.top,n.width,n.height),i=Lc(t.element,n,fa(),da(),fa(),da(),vt.none());return vt.some(Pc({anchorBox:r,bubble:n.bubble,overrides:n.overrides,layouts:i,placer:vt.none()}))})],os=Po([{screen:["point"]},{absolute:["point","scrollLeft","scrollTop"]}]),rs=os.screen,is=os.absolute,us=[fo("node"),fo("root"),xo("bubble"),Nc(),To("overrides",{}),To("showAbove",!1),Zu("placement",function(r,i,u){var a=Xc(r,0,i);return i.node.filter(he).bind(function(t){var n=t.dom.getBoundingClientRect(),e=Yc(n.left,n.top,n.width,n.height),o=i.node.getOr(r.element);return qc(e,a,i,u,o)})})],as=function(t,n,e,o){return{start:t,soffset:n,finish:e,foffset:o}},cs=Po([{before:["element"]},{on:["element","offset"]},{after:["element"]}]),ss=(cs.before,cs.on,cs.after,function(t){return t.fold(h,h,h)}),ls=Po([{domRange:["rng"]},{relative:["startSitu","finishSitu"]},{exact:["start","soffset","finish","foffset"]}]),fs={domRange:ls.domRange,relative:ls.relative,exact:ls.exact,exactFromRange:function(t){return ls.exact(t.start,t.soffset,t.finish,t.foffset)},getWin:function(t){return Xt(t.match({domRange:function(t){return At.fromDom(t.startContainer)},relative:function(t,n){return ss(t)},exact:function(t,n,e,o){return t}}))},range:as},ds=Po([{ltr:["start","soffset","finish","foffset"]},{rtl:["start","soffset","finish","foffset"]}]);function ms(t){return Zl.getOption(t)}function gs(t){return ms(t).filter(function(t){return 0!==t.trim().length||-1<t.indexOf("\xa0")}).isSome()||wt(tf,Ft(t))}function ps(t,n){return Nt(e=void 0===t?document:t.dom)?[]:M(e.querySelectorAll(n),At.fromDom);var e}function hs(t){if(0<t.rangeCount){var n=t.getRangeAt(0),e=t.getRangeAt(t.rangeCount-1);return vt.some(as(At.fromDom(n.startContainer),n.startOffset,At.fromDom(e.endContainer),e.endOffset))}return vt.none()}function vs(t){if(null===t.anchorNode||null===t.focusNode)return hs(t);var n,e,o,r,i,u,a,c,s,l,f,d=At.fromDom(t.anchorNode),m=At.fromDom(t.focusNode);return n=d,e=t.anchorOffset,o=m,r=t.focusOffset,u=e,a=o,c=r,(s=Ut(i=n).dom.createRange()).setStart(i.dom,u),s.setEnd(a.dom,c),l=s,f=Lt(n,o)&&e===r,l.collapsed&&!f?vt.some(as(d,t.anchorOffset,m,t.focusOffset)):hs(t)}function bs(t,n){var e,o,r=(e=Zc(t,n)).getClientRects();return 0<(o=0<r.length?r[0]:e.getBoundingClientRect()).width||0<o.height?vt.some(o).map($c):vt.none()}function ys(t,n){return{element:t,offset:n}}function xs(t,n){return(Xn(t)?ys:function(t,n){var e=Kt(t);if(0===e.length)return ys(t,n);if(n<e.length)return ys(e[n],0);var o=e[e.length-1];return ys(o,(Xn(o)?Zl.get(o):Kt(o)).length)})(t,n)}function ws(t,n){return n.getSelection.getOrThunk(function(){return function(){return vt.from(t.getSelection()).filter(function(t){return 0<t.rangeCount}).bind(vs)}})().map(function(t){var n=xs(t.start,t.soffset),e=xs(t.finish,t.foffset);return fs.range(n.element,n.offset,e.element,e.offset)})}function Ss(t){return t.x+t.width}function Cs(t,n){return t.x-n.width}function ks(t,n){return t.y-n.height+t.height}function Os(t,n,e){return na(Ss(t),t.y,e.southeast(),Ra(),"southeast",oa(t,{left:0,top:2}),ef)}function _s(t,n,e){return na(Cs(t,n),t.y,e.southwest(),Va(),"southwest",oa(t,{right:1,top:2}),ef)}function Ts(t,n,e){return na(Ss(t),ks(t,n),e.northeast(),Pa(),"northeast",oa(t,{left:0,bottom:3}),ef)}function Es(t,n,e){return na(Cs(t,n),ks(t,n),e.northwest(),Ha(),"northwest",oa(t,{right:1,bottom:3}),ef)}function Ds(){return[Os,_s,Ts,Es]}function Bs(){return[_s,Os,Es,Ts]}function Ms(t,n,e,o,r,i,u){var a,c,s,l,f,d,m,g,p,h,v,b,y,x,w={anchorBox:e.anchorBox,origin:n};return a=w,c=r.element,s=e.bubble,l=e.layouts,f=i,d=o,m=e.overrides,g=u,h=yc(m,"maxHeightFunction",Fc()),v=yc(m,"maxWidthFunction",st),b=a.anchorBox,y=a.origin,x={bounds:(p=y,d.fold(function(){return p.fold(Ae,Ae,Be)},function(e){return p.fold(e,e,function(){var t=e(),n=ac(p,t.x,t.y);return Be(n.left,n.top,t.width,t.height)})})),origin:y,preference:l,maxHeightFunction:h,maxWidthFunction:v,lastPlacement:f,transition:g},Rc(b,c,s,x)}function As(t,n){_e(t.element,n.element)}function Fs(n,t){var e,o=n.components();St((e=n).components(),function(t){return Te(t.element)}),An(e.element),e.syncComponents();var r=W(o,t);St(r,function(t){lf(t),n.getSystem().removeFromWorld(t)}),St(t,function(t){t.getSystem().isConnected()?As(n,t):(n.getSystem().addToWorld(t),As(n,t),he(n.element)&&ff(t)),n.syncComponents()})}function Is(t,n){df(t,n,_e)}function Rs(t){lf(t),Te(t.element),t.getSystem().removeFromWorld(t)}function Vs(n){var t=Yt(n.element).bind(function(t){return n.getSystem().getByDom(t).toOptional()});Rs(n),t.each(function(t){t.syncComponents()})}function Ps(t){var n=t.components();St(n,Rs),An(t.element),t.syncComponents()}function Hs(t,n){mf(t,n,_e)}function zs(n){var t=Kt(n.element);St(t,function(t){n.getByDom(t).each(lf)}),Te(n.element)}function Ns(n,t,e,o){e.get().each(function(t){Ps(n)}),Is(t.getAttachPoint(n),n);var r=n.getSystem().build(o);return Is(n,r),e.set(r),r}function Ls(t,n,e,o){var r=Ns(t,n,e,o);return n.onOpen(t,r),r}function Ws(n,e,o){o.get().each(function(t){Ps(n),Vs(n),e.onClose(n,t),o.clear()})}function Us(t,n,e){return e.isOpen()}function js(t){var e=co("Dismissal",xf,t),n={};return n[vf()]={schema:Ze([fo("target")]),onReceive:function(n,t){hf.isOpen(n)&&(hf.isPartOf(n,t.target)||e.isExtraPart(n,t.target)||e.fireEventInstead.fold(function(){return hf.close(n)},function(t){return hr(n,t.event)}))}},n}function Gs(t){var e=co("Reposition",wf,t),n={};return n[bf()]={onReceive:function(n){hf.isOpen(n)&&e.fireEventInstead.fold(function(){return e.doReposition(n)},function(t){return hr(n,t.event)})}},n}function Xs(t,n,e){n.store.manager.onLoad(t,n,e)}function Ys(t,n,e){n.store.manager.onUnload(t,n,e)}function qs(){var t=Vo(null);return xu({set:t.set,get:t.get,isNotSet:function(){return null===t.get()},clear:function(){t.set(null)},readState:function(){return{mode:"memory",value:t.get()}}})}function Ks(){var i=Vo({}),u=Vo({});return xu({readState:function(){return{mode:"dataset",dataByValue:i.get(),dataByText:u.get()}},lookup:function(t){return tt(i.get(),t).orThunk(function(){return tt(u.get(),t)})},update:function(t){var n=i.get(),e=u.get(),o={},r={};St(t,function(n){tt(o[n.value]=n,"meta").each(function(t){tt(t,"text").each(function(t){r[t]=n})})}),i.set(lt(lt({},n),o)),u.set(lt(lt({},e),r))},clear:function(){i.set({}),u.set({})}})}function Js(t,n,e,o){var r=n.store;e.update([o]),r.setValue(t,o),n.onSetValue(t,o)}function $s(o,t){return Ro(o,{},M(t,function(t){return n=t.name(),e="Cannot configure "+t.name()+" for "+o,ur(n,n,Ge(),Ke(function(t){return No("The field: "+n+" is forbidden. "+e)}));var n,e}).concat([ar("dump",h)]))}function Qs(t){return t.dump}function Zs(t,n){return lt(lt({},tc(n)),t.dump)}function tl(t){return Tt(t,"uiType")}function nl(t){return t.fold(vt.some,vt.none,vt.some,vt.some)}function el(t){function n(t){return t.name}return t.fold(n,n,n,n)}function ol(e,o){return function(t){var n=co("Converting part type",o,t);return e(n)}}function rl(t,n,e,o){return Xo(n.defaults(t,e,o),e,{uid:t.partUids[n.name]},n.overrides(t,e,o))}function il(r,t){var n={};return St(t,function(t){nl(t).each(function(e){var o=td(r,e.pname);n[e.name]=function(t){var n=co("Part: "+e.name+" in "+r,Jo(e.schema),t);return lt(lt({},o),{config:t,validated:n})}})}),n}function ul(t,n,e){return{uiType:Rf(),owner:t,name:n,config:e,validated:{}}}function al(t){return z(t,function(t){return t.fold(vt.none,vt.some,vt.none,vt.none).map(function(t){return vo(t.name,t.schema.concat([ta(Qf())]))}).toArray()})}function cl(t){return M(t,el)}function sl(t,n,e){return o=n,r={},i={},St(e,function(t){t.fold(function(o){r[o.pname]=Ff(!0,function(t,n,e){return o.factory.sketch(rl(t,o,n,e))})},function(t){var n=o.parts[t.name];i[t.name]=rt(t.factory.sketch(rl(o,t,n[Qf()]),n))},function(o){r[o.pname]=Ff(!1,function(t,n,e){return o.factory.sketch(rl(t,o,n,e))})},function(o){r[o.pname]=If(!0,function(n,t,e){return M(n[o.name],function(t){return o.factory.sketch(Xo(o.defaults(n,t,e),t,o.overrides(n,t)))})})})}),{internals:rt(r),externals:rt(i)};var o,r,i}function ll(t,n,e){return o=vt.some(t),i=(r=n).components,s=dt(e,function(t,n){return o=t,r=!1,{name:rt(e=n),required:function(){return o.fold(function(t,n){return t},function(t,n){return t})},used:function(){return r},replace:function(){if(r)throw new Error("Trying to use the same placeholder more than once: "+e);return r=!0,o}};var e,o,r}),u=o,a=r,c=s,l=z(i,function(t){return Af(u,a,t,c)}),J(s,function(t){if(!1===t.used()&&t.required())throw new Error("Placeholder: "+t.name()+" was not found in components list\nNamespace: "+o.getOr("none")+"\nComponents: "+JSON.stringify(r.components,null,2))}),l;var o,r,i,u,a,c,s,l}function fl(t,n,e){var o=n.partUids[e];return t.getSystem().getByUid(o).toOptional()}function dl(t,n,e){return fl(t,n,e).getOrDie("Could not find part: "+e)}function ml(t,n,e){var o={},r=n.partUids,i=t.getSystem();return St(e,function(t){o[t]=rt(i.getByUid(r[t]))}),o}function gl(t,n){var e=t.getSystem();return dt(n.partUids,function(t,n){return rt(e.getByUid(t))})}function pl(t){return kt(t.partUids)}function hl(t,n,e){var o={},r=n.partUids,i=t.getSystem();return St(e,function(t){o[t]=rt(i.getByUid(r[t]).getOrDie())}),o}function vl(n,t){return sr(M(cl(t),function(t){return{key:t,value:n+"-"+t}}))}function bl(n){return ur("partUids","partUids",Xe(function(t){return vl(t.uid,n)}),Qo())}function yl(t,n,e,o,r){var i;return co(t+" [SpecSchema]",Ze((i=r,(0<o.length?[vo("parts",o)]:[]).concat([fo("uid"),To("dom",{}),To("components",[]),ta("originalSpec"),To("debug.sketcher",{})]).concat(i)).concat(n)),e)}function xl(t,n,e,o,r){var i=ed(r),u=yl(t,n,i,al(e),[bl(e)]),a=sl(0,u,e);return o(u,ll(t,u,a.internals()),i,a.externals())}function wl(t){var r=co("Sketcher for "+t.name,od,t),n=dt(r.apis,Hr),e=dt(r.extraApis,Vr);return lt(lt({name:r.name,configFields:r.configFields,sketch:function(t){return n=r.name,e=r.configFields,(0,r.factory)(yl(n,e,o=ed(t),[],[]),o);var n,e,o}},n),e)}function Sl(t){var n=co("Sketcher for "+t.name,rd,t),e=il(n.name,n.partFields),o=dt(n.apis,Hr),r=dt(n.extraApis,Vr);return lt(lt({name:n.name,partFields:n.partFields,configFields:n.configFields,sketch:function(t){return xl(n.name,n.configFields,n.partFields,n.factory,t)},parts:e},o),r)}function Cl(t){return"input"===Ft(t)&&"radio"!==rn(t,"type")||"textarea"===Ft(t)}function kl(t,n,e){(n.disabled()?cd:sd)(t,n)}function Ol(t,n){return!0===n.useNative&&wt(ad,Ft(t.element))}function _l(t,n){return Ol(t,n)?an(t.element,"disabled"):"true"===rn(t.element,"aria-disabled")}function Tl(e,o,t,r){var n=ps(e.element,"."+o.highlightClass);St(n,function(n){T(r,function(t){return t.element===n})||(Yr(n,o.highlightClass),e.getSystem().getByDom(n).each(function(t){o.onDehighlight(e,t),hr(t,Zi())}))})}function El(t,n,e,o){Tl(t,n,0,[o]),Gl(0,n,0,o)||(Xr(o.element,n.highlightClass),n.onHighlight(t,o),hr(o,Qi()))}function Dl(e,n,t,o){var r=ps(e.element,"."+n.itemClass);return P(r,function(t){return qr(t,n.highlightClass)}).bind(function(t){var n=ea(t,o,0,r.length-1);return e.getSystem().getByDom(r[n]).toOptional()})}function Bl(t,n,e){var o=L(t.slice(0,n)),r=L(t.slice(n+1));return V(o.concat(r),e)}function Ml(t,n,e){return V(L(t.slice(0,n)),e)}function Al(t,n,e){var o=t.slice(0,n);return V(t.slice(n+1).concat(o),e)}function Fl(t,n,e){return V(t.slice(n+1),e)}function Il(e){return function(t){var n=t.raw;return wt(e,n.which)}}function Rl(t){return function(n){return N(t,function(t){return t(n)})}}function Vl(t){return!0===t.raw.shiftKey}function Pl(t){return!0===t.raw.ctrlKey}function Hl(t,n){return{matches:t,classification:n}}function zl(t,n,e){n.exists(function(n){return e.exists(function(t){return Lt(t,n)})})||vr(t,qi(),{prevFocus:n,newFocus:e})}function Nl(){function o(t){return Oa(t.element)}return{get:o,set:function(t,n){var e=o(t);t.getSystem().triggerFocus(n,t.element),zl(t,e,o(t))}}}function Ll(){function r(t){return gd.getHighlighted(t).map(function(t){return t.element})}return{get:r,set:function(n,t){var e=r(n);n.getSystem().getByDom(t).fold(st,function(t){gd.highlight(n,t)});var o=r(n);zl(n,e,o)}}}ds.ltr,ds.rtl;function Wl(t,n,e,o,r,i){var u=i.map(Me);return cf(t,n,e,o,r,u)}function Ul(t,n,e){var o,r,i,u=n.getAttachPoint(t);fn(t.element,"position",sf.getMode(u)),i=n.cloakVisibilityAttr,pn((o=t).element,r="visibility").fold(function(){cn(o.element,i)},function(t){on(o.element,i,t)}),fn(o.element,r,"hidden")}function jl(t,n,e){var o,r,i,u=t.element;T(["top","left","right","bottom"],function(t){return pn(u,t).isSome()})||vn(t.element,"position"),r="visibility",i=n.cloakVisibilityAttr,un((o=t).element,i).fold(function(){return vn(o.element,r)},function(t){return fn(o.element,r,t)})}function Gl(t,n,e,o){return qr(o.element,n.highlightClass)}function Xl(n,t,e){return Fu(n.element,"."+t.itemClass).bind(function(t){return n.getSystem().getByDom(t).toOptional()})}function Yl(n,t,e){var o=ps(n.element,"."+t.itemClass);return(0<o.length?vt.some(o[o.length-1]):vt.none()).bind(function(t){return n.getSystem().getByDom(t).toOptional()})}function ql(n,t,e){return et(M(ps(n.element,"."+t.itemClass),function(t){return n.getSystem().getByDom(t).toOptional()}))}var Kl,Jl,$l,Ql,Zl=(Kl=Xn,{get:function(t){if(!Kl(t))throw new Error("Can only get text value of a text node");return Jl(t).getOr("")},getOption:Jl=function(t){return Kl(t)?vt.from(t.dom.nodeValue):vt.none()},set:function(t,n){if(!Kl(t))throw new Error("Can only set raw text value of a text node");t.dom.nodeValue=n}}),tf=["img","br"],nf=[xo("getSelection"),fo("root"),xo("bubble"),Nc(),To("overrides",{}),To("showAbove",!1),Zu("placement",function(t,n,e){var r=Xt(n.root).dom,o=Xc(t,0,n);return qc(ws(r,n).bind(function(e){return t=r,n=fs.exactFromRange(e),(0<(o=Zc(t,n).getBoundingClientRect()).width||0<o.height?vt.some(o).map($c):vt.none()).orThunk(function(){var t=At.fromText("\ufeff");En(e.start,t);var n=bs(r,fs.exact(t,0,t,1));return Te(t),n}).bind(function(t){return Yc(t.left,t.top,t.width,t.height)});var t,n,o}),o,n,e,ws(r,n).bind(function(t){return Gn(t.start)?vt.some(t.start):le(t.start)}).getOr(t.element))})],ef="link-layout",of=so("type",{selection:nf,node:us,hotspot:ns,submenu:[fo("item"),Nc(),To("overrides",{}),Zu("placement",function(t,n,e){var o=Ma(e,n.item.element),r=Lc(t.element,n,Ds(),Bs(),Ds(),Bs(),vt.none());return vt.some(Pc({anchorBox:o,bubble:wc(),overrides:n.overrides,layouts:r,placer:vt.none()}))})],makeshift:es}),rf=[yo("classes",tr),Mo("mode","all",["all","layout","placement"])],uf=[To("useFixed",O),xo("getBounds")],af=[mo("anchor",of),_o("transition",rf)],cf=function(c,s,l,f,t,d){var m=co("placement.info",Jo(af),t),g=m.anchor,p=f.element,h=l.get(f.uid);_a(function(){fn(p,"position","fixed");var t=pn(p,"visibility");fn(p,"visibility","hidden");var n,e,o,r,i=s.useFixed()?(r=document.documentElement,_c(0,0,r.clientWidth,r.clientHeight)):(e=Cn((n=c).element),o=n.element.dom.getBoundingClientRect(),Oc(e.left,e.top,o.width,o.height)),u=g.placement,a=d.map(rt).or(s.getBounds);u(c,g,i).each(function(t){var n=t.placer.getOr(Ms)(c,i,t,a,f,h,m.transition);l.set(f.uid,n)}),t.fold(function(){vn(p,"visibility")},function(t){fn(p,"visibility",t)}),pn(p,"left").isNone()&&pn(p,"top").isNone()&&pn(p,"right").isNone()&&pn(p,"bottom").isNone()&&mt(pn(p,"position"),"fixed")&&vn(p,"position")},p)},sf=ya({fields:uf,name:"positioning",active:ic,apis:Object.freeze({__proto__:null,position:function(t,n,e,o,r){Wl(t,n,e,o,r,vt.none())},positionWithin:Wl,positionWithinBounds:cf,getMode:function(t,n,e){return n.useFixed()?"fixed":"absolute"},reset:function(t,n,e,o){var r=o.element;St(["position","left","right","top","bottom"],function(t){return vn(r,t)}),cn(r,Tc),e.clear(o.uid)}}),state:Object.freeze({__proto__:null,init:function(){var e={};return xu({readState:function(){return e},clear:function(t){d(t)?delete e[t]:e={}},set:function(t,n){e[t]=n},get:function(t){return tt(e,t)}})}})}),lf=function(t){hr(t,Gi());var n=t.components();St(n,lf)},ff=function(t){var n=t.components();St(n,ff),hr(t,ji())},df=function(t,n,e){t.getSystem().addToWorld(n),e(t.element,n.element),he(t.element)&&ff(n),t.syncComponents()},mf=function(t,n,e){e(t,n.element);var o=Kt(n.element);St(o,function(t){n.getByDom(t).each(ff)})},gf=Object.freeze({__proto__:null,cloak:Ul,decloak:jl,open:Ls,openWhileCloaked:function(t,n,e,o,r){Ul(t,n),Ls(t,n,e,o),r(),jl(t,n)},close:Ws,isOpen:Us,isPartOf:function(n,e,t,o){return Us(0,0,t)&&t.get().exists(function(t){return e.isPartOf(n,t,o)})},getState:function(t,n,e){return e.get()},setContent:function(t,n,e,o){return e.get().map(function(){return Ns(t,n,e,o)})}}),pf=Object.freeze({__proto__:null,events:function(e,o){return nu([Cr(Pi(),function(t,n){Ws(t,e,o)})])}}),hf=ya({fields:[Ku("onOpen"),Ku("onClose"),fo("isPartOf"),fo("getAttachPoint"),To("cloakVisibilityAttr","data-precloak-visibility")],name:"sandboxing",active:pf,apis:gf,state:Object.freeze({__proto__:null,init:function(){var t=dc(),n=rt("not-implemented");return xu({readState:n,isOpen:t.isSet,clear:t.clear,set:t.set,get:t.get})}})}),vf=rt("dismiss.popups"),bf=rt("reposition.popups"),yf=rt("mouse.released"),xf=Ze([To("isExtraPart",O),_o("fireEventInstead",[To("event",Xi())])]),wf=Ze([_o("fireEventInstead",[To("event",Yi())]),ho("doReposition")]),Sf=Object.freeze({__proto__:null,onLoad:Xs,onUnload:Ys,setValue:function(t,n,e,o){n.store.manager.setValue(t,n,e,o)},getValue:function(t,n,e){return n.store.manager.getValue(t,n,e)},getState:function(t,n,e){return e}}),Cf=Object.freeze({__proto__:null,events:function(e,o){var t=e.resetOnDom?[eu(function(t,n){Xs(t,e,o)}),ou(function(t,n){Ys(t,e,o)})]:[va(e,o,Xs)];return nu(t)}}),kf=Object.freeze({__proto__:null,memory:qs,dataset:Ks,manual:function(){return xu({readState:st})},init:function(t){return t.store.manager.state(t)}}),Of=[xo("initialValue"),fo("getFallbackEntry"),fo("getDataKey"),fo("setValue"),Zu("manager",{setValue:Js,getValue:function(t,n,e){var o=n.store,r=o.getDataKey(t);return e.lookup(r).getOrThunk(function(){return o.getFallbackEntry(r)})},onLoad:function(n,e,o){e.store.initialValue.each(function(t){Js(n,e,o,t)})},onUnload:function(t,n,e){e.clear()},state:Ks})],_f=[fo("getValue"),To("setValue",st),xo("initialValue"),Zu("manager",{setValue:function(t,n,e,o){n.store.setValue(t,o),n.onSetValue(t,o)},getValue:function(t,n,e){return n.store.getValue(t)},onLoad:function(n,e,t){e.store.initialValue.each(function(t){e.store.setValue(n,t)})},onUnload:st,state:yu.init})],Tf=ya({fields:[Eo("store",{mode:"memory"},so("mode",{memory:[xo("initialValue"),Zu("manager",{setValue:function(t,n,e,o){e.set(o),n.onSetValue(t,o)},getValue:function(t,n,e){return e.get()},onLoad:function(t,n,e){n.store.initialValue.each(function(t){e.isNotSet()&&e.set(t)})},onUnload:function(t,n,e){e.clear()},state:qs})],manual:_f,dataset:Of})),Ku("onSetValue"),To("resetOnDom",!1)],name:"representing",active:Cf,apis:Sf,extra:{setValueFrom:function(t,n){var e=Tf.getValue(n);Tf.setValue(t,e)}},state:kf}),Ef=$s,Df=Zs,Bf="placeholder",Mf=Po([{single:["required","valueThunk"]},{multiple:["required","valueThunks"]}]),Af=function(r,i,u,a){return t=r,e=a,(tl(n=u)&&n.uiType===Bf?(c=n,s=e,(o=t).exists(function(t){return t!==c.owner})?Mf.single(!0,rt(c)):tt(s,c.name).fold(function(){throw new Error("Unknown placeholder component: "+c.name+"\nKnown: ["+kt(s)+"]\nNamespace: "+o.getOr("none")+"\nSpec: "+JSON.stringify(c,null,2))},function(t){return t.replace()})):Mf.single(!1,rt(n))).fold(function(t,n){var e=tl(u)?n(i,u.config,u.validated):n(i),o=z(tt(e,"components").getOr([]),function(t){return Af(r,i,t,a)});return[lt(lt({},e),{components:o})]},function(t,n){if(tl(u)){var e=n(i,u.config,u.validated);return u.validated.preprocess.getOr(h)(e)}return n(i)});var t,n,e,o,c,s},Ff=Mf.single,If=Mf.multiple,Rf=rt(Bf),Vf=Po([{required:["data"]},{external:["data"]},{optional:["data"]},{group:["data"]}]),Pf=To("factory",{sketch:h}),Hf=To("schema",[]),zf=fo("name"),Nf=ur("pname","pname",Ue(function(t){return"<alloy."+Fr(t.name)+">"}),Qo()),Lf=ar("schema",function(){return[xo("preprocess")]}),Wf=To("defaults",rt({})),Uf=To("overrides",rt({})),jf=Jo([Pf,Hf,zf,Nf,Wf,Uf]),Gf=Jo([Pf,Hf,zf,Wf,Uf]),Xf=Jo([Pf,Hf,zf,Nf,Wf,Uf]),Yf=Jo([Pf,Lf,zf,fo("unit"),Nf,Wf,Uf]),qf=ol(Vf.required,jf),Kf=ol(Vf.external,Gf),Jf=ol(Vf.optional,Xf),$f=ol(Vf.group,Yf),Qf=rt("entirety"),Zf=Object.freeze({__proto__:null,required:qf,external:Kf,optional:Jf,group:$f,asNamedPart:nl,name:el,asCommon:function(t){return t.fold(h,h,h,h)},original:Qf}),td=function(t,n){return{uiType:Rf(),owner:t,name:n}},nd=Object.freeze({__proto__:null,generate:il,generateOne:ul,schemas:al,names:cl,substitutes:sl,components:ll,defaultUids:vl,defaultUidsSchema:bl,getAllParts:gl,getAllPartNames:pl,getPart:fl,getPartOrDie:dl,getParts:ml,getPartsOrDie:hl}),ed=function(t){return Tt(t,"uid")?t:lt(lt({},t),{uid:gu("uid")})},od=Ze([fo("name"),fo("factory"),fo("configFields"),To("apis",{}),To("extraApis",{})]),rd=Ze([fo("name"),fo("factory"),fo("configFields"),fo("partFields"),To("apis",{}),To("extraApis",{})]),id=Object.freeze({__proto__:null,getCurrent:function(t,n,e){return n.find(t)}}),ud=ya({fields:[fo("find")],name:"composing",apis:id}),ad=["input","button","textarea","select"],cd=function(n,t,e){t.disableClass.each(function(t){Xr(n.element,t)}),(Ol(n,t)?function(t){on(t.element,"disabled","disabled")}:function(t){on(t.element,"aria-disabled","true")})(n),t.onDisabled(n)},sd=function(n,t,e){t.disableClass.each(function(t){Yr(n.element,t)}),(Ol(n,t)?function(t){cn(t.element,"disabled")}:function(t){on(t.element,"aria-disabled","false")})(n),t.onEnabled(n)},ld=Object.freeze({__proto__:null,enable:sd,disable:cd,isDisabled:_l,onLoad:kl,set:function(t,n,e,o){(o?cd:sd)(t,n)}}),fd=Object.freeze({__proto__:null,exhibit:function(t,n){return Nr({classes:n.disabled()?n.disableClass.toArray():[]})},events:function(e,t){return nu([wr(Fi(),function(t,n){return _l(t,e)}),va(e,t,kl)])}}),dd=ya({fields:[Fo("disabled",O),To("useNative",!0),xo("disableClass"),Ku("onDisabled"),Ku("onEnabled")],name:"disabling",active:fd,apis:ld}),md=Object.freeze({__proto__:null,dehighlightAll:function(t,n,e){return Tl(t,n,0,[])},dehighlight:function(t,n,e,o){Gl(0,n,0,o)&&(Yr(o.element,n.highlightClass),n.onDehighlight(t,o),hr(o,Zi()))},highlight:El,highlightFirst:function(n,e,t){Xl(n,e).each(function(t){El(n,e,0,t)})},highlightLast:function(n,e,t){Yl(n,e).each(function(t){El(n,e,0,t)})},highlightAt:function(n,e,t,o){var r,i,u;i=o,u=ps((r=n).element,"."+e.itemClass),vt.from(u[i]).fold(function(){return Re.error(new Error("No element found with index "+i))},r.getSystem().getByDom).fold(function(t){throw t},function(t){El(n,e,0,t)})},highlightBy:function(n,e,t,o){V(ql(n,e),o).each(function(t){El(n,e,0,t)})},isHighlighted:Gl,getHighlighted:function(n,t,e){return Fu(n.element,"."+t.highlightClass).bind(function(t){return n.getSystem().getByDom(t).toOptional()})},getFirst:Xl,getLast:Yl,getPrevious:function(t,n,e){return Dl(t,n,0,-1)},getNext:function(t,n,e){return Dl(t,n,0,1)},getCandidates:ql}),gd=ya({fields:[fo("highlightClass"),fo("itemClass"),Ku("onHighlight"),Ku("onDehighlight")],name:"highlighting",apis:md}),pd=[8],hd=[9],vd=[13],bd=[27],yd=[32],xd=[37],wd=[38],Sd=[39],Cd=[40],kd=C(Vl);function Od(t,n,e,o,a){function c(n,e,t,o,r){var i=t(n,e,o,r),u=e.event;return V(i,function(t){return t.matches(u)}).map(function(t){return t.classification}).bind(function(t){return t(n,e,o,r)})}var r={schema:function(){return t.concat([To("focusManager",Nl()),Eo("focusInside","onFocus",ro(function(t){return wt(["onFocus","onEnterOrSpace","onApi"],t)?Re.value(t):Re.error("Invalid value for focusInside")})),Zu("handler",r),Zu("state",n),Zu("sendFocusIn",a)])},processKey:c,toEvents:function(i,u){var t=i.focusInside!==$l.OnFocusMode?vt.none():a(i).map(function(e){return Cr(Di(),function(t,n){e(t,i,u),n.stop()})}),n=[Cr(yi(),function(o,r){c(o,r,e,i,u).fold(function(){var n=o,e=r,t=Il(yd.concat(vd))(e.event);i.focusInside===$l.OnEnterOrSpaceMode&&t&&mr(n,e)&&a(i).each(function(t){t(n,i,u),e.stop()})},function(t){r.stop()})}),Cr(xi(),function(t,n){c(t,n,o,i,u).each(function(t){n.stop()})})];return nu(t.toArray().concat(n))}};return r}function _d(t){function a(t,n){return 0<xn(t.visibilitySelector.bind(function(t){return Iu(n,t)}).getOr(n))}function n(n,e,t){var o=e,r=F(ps(n.element,o.selector),function(t){return a(o,t)});vt.from(r[o.firstTabstop]).each(function(t){e.focusManager.set(n,t)})}function o(e,t,r,i){var n,u=ps(e.element,r.selector);return(n=r).focusManager.get(e).bind(function(t){return Iu(t,n.selector)}).bind(function(t){return P(u,S(Lt,t)).bind(function(t){return n=e,o=r,i(u,t,function(t){return a(n=o,e=t)&&n.useTabstopAt(e);var n,e}).fold(function(){return o.cyclic?vt.some(!0):vt.none()},function(t){return o.focusManager.set(n,t),vt.some(!0)});var n,o})})}var e=[xo("onEscape"),xo("onEnter"),To("selector",'[data-alloy-tabstop="true"]:not(:disabled)'),To("firstTabstop",0),To("useTabstopAt",_),xo("visibilitySelector")].concat([t]),r=rt([Hl(Rl([Vl,Il(hd)]),function(t,n,e){return o(t,0,e,e.cyclic?Bl:Ml)}),Hl(Il(hd),function(t,n,e){return o(t,0,e,e.cyclic?Al:Fl)}),Hl(Il(bd),function(n,e,t){return t.onEscape.bind(function(t){return t(n,e)})}),Hl(Rl([kd,Il(vd)]),function(n,e,t){return t.onEnter.bind(function(t){return t(n,e)})})]),i=rt([]);return Od(e,yu.init,r,i,function(){return vt.some(n)})}function Td(t,n,e){return Cl(e)&&Il(yd)(n.event)?vt.none():(yr(t,e,Fi()),vt.some(!0))}function Ed(t,n){return vt.some(!0)}function Dd(t,n,e){return e.execute(t,n,t.element)}function Bd(){var e=dc();return xu({readState:function(){return e.get().map(function(t){return{numRows:String(t.numRows),numColumns:String(t.numColumns)}}).getOr({numRows:"?",numColumns:"?"})},setGridSize:function(t,n){e.set({numRows:t,numColumns:n})},getNumRows:function(){return e.get().map(function(t){return t.numRows})},getNumColumns:function(){return e.get().map(function(t){return t.numColumns})}})}function Md(i){return function(t,n,e,o){var r=i(t.element);return Qm(r,t,n,e,o)}}function Ad(t,n){return Md(Sc(t,n))}function Fd(t,n){return Md(Sc(n,t))}function Id(r){return function(t,n,e,o){return Qm(r,t,n,e,o)}}function Rd(t){return!((n=t.dom).offsetWidth<=0&&n.offsetHeight<=0);var n}function Vd(t,n,e){var o,r=F(ps(t,e),Rd);return P(o=r,function(t){return Lt(t,n)}).map(function(t){return{index:t,candidates:o}})}function Pd(t,n){return P(t,function(t){return Lt(n,t)})}function Hd(e,t,o,n){return n(Math.floor(t/o),t%o).bind(function(t){var n=t.row*o+t.column;return 0<=n&&n<e.length?vt.some(e[n]):vt.none()})}function zd(r,t,i,u,a){return Hd(r,t,u,function(t,n){var e=t===i-1?r.length-t*u:u,o=ea(n,a,0,e-1);return vt.some({row:t,column:o})})}function Nd(i,t,u,a,c){return Hd(i,t,a,function(t,n){var e=ea(t,c,0,u-1),o=e===u-1?i.length-e*a:a,r=Ua(n,0,o-1);return vt.some({row:e,column:r})})}function Ld(n,e,t){Fu(n.element,e.selector).each(function(t){e.focusManager.set(n,t)})}function Wd(r){return function(t,n,e,o){return Vd(t,n,e.selector).bind(function(t){return r(t.candidates,t.index,o.getNumRows().getOr(e.initSize.numRows),o.getNumColumns().getOr(e.initSize.numColumns))})}}function Ud(t,n,e){return e.captureTab?vt.some(!0):vt.none()}function jd(t,n,e,i){var u=function(t,n,e){var o,r=ea(n,i,0,e.length-1);return r===t?vt.none():"button"===Ft(o=e[r])&&"disabled"===rn(o,"disabled")?u(t,r,e):vt.from(e[r])};return Vd(t,e,n).bind(function(t){var n=t.index,e=t.candidates;return u(n,n,e)})}function Gd(n,e,o){return(r=o).focusManager.get(n).bind(function(t){return Iu(t,r.selector)}).bind(function(t){return o.execute(n,e,t)});var r}function Xd(n,e,t){e.getInitial(n).orThunk(function(){return Fu(n.element,e.selector)}).each(function(t){e.focusManager.set(n,t)})}function Yd(t,n,e){return jd(t,e.selector,n,-1)}function qd(t,n,e){return jd(t,e.selector,n,1)}function Kd(r){return function(t,n,e,o){return r(t,n,e,o).bind(function(){return e.executeOnMove?Gd(t,n,e):vt.some(!0)})}}function Jd(t,n,e){return e.onEscape(t,n)}function $d(t,n,e){return vt.from(t[n]).bind(function(t){return vt.from(t[e]).map(function(t){return{rowIndex:n,columnIndex:e,cell:t}})})}function Qd(t,n,e,o){return $d(t,n,ea(e,o,0,t[n].length-1))}function Zd(t,n,e,o){var r=ea(e,o,0,t.length-1),i=t[r].length;return $d(t,r,Ua(n,0,i-1))}function tm(t,n,e,o){var r=t[n].length;return $d(t,n,Ua(e+o,0,r-1))}function nm(t,n,e,o){var r=Ua(e+o,0,t.length-1),i=t[r].length;return $d(t,r,Ua(n,0,i-1))}function em(n,e,t){e.previousSelector(n).orThunk(function(){var t=e.selectors;return Fu(n.element,t.cell)}).each(function(t){e.focusManager.set(n,t)})}function om(t,o){return function(n,e,i){var u=i.cycles?t:o;return Iu(e,i.selectors.row).bind(function(t){return Pd(ps(t,i.selectors.cell),e).bind(function(o){var r=ps(n,i.selectors.row);return Pd(r,t).bind(function(t){var n,e=(n=i,M(r,function(t){return ps(t,n.selectors.cell)}));return u(e,t,o).map(function(t){return t.cell})})})})}}function rm(n,e,o){return o.focusManager.get(n).bind(function(t){return o.execute(n,e,t)})}function im(n,e,t){Fu(n.element,e.selector).each(function(t){e.focusManager.set(n,t)})}function um(t,n,e){return jd(t,e.selector,n,-1)}function am(t,n,e){return jd(t,e.selector,n,1)}function cm(t,n,e,o){var r=t.getSystem().build(o);df(t,r,e)}function sm(t,n,e,o){V(Ag(t),function(t){return Lt(o.element,t.element)}).each(Vs)}function lm(n,t,e,r,o){var i=Ag(n);return vt.from(i[r]).map(function(t){return sm(n,0,0,t),o.each(function(t){cm(n,0,function(t,n){var e,o=n;Jt(e=t,r).fold(function(){_e(e,o)},function(t){En(t,o)})},t)}),t})}function fm(t,n){var e,o;return{key:t,value:{config:{},me:(e=t,o=nu(n),ya({fields:[fo("enabled")],name:e,active:{events:rt(o)}})),configAsRaw:rt({}),initialConfig:{},state:yu}}}function dm(t,n){n.ignore||(Sa(t.element),n.onFocus(t))}function mm(t,n,e){var o=n.aria;o.update(t,o,e.get())}function gm(n,t,e){t.toggleClass.each(function(t){(e.get()?Xr:Yr)(n.element,t)})}function pm(t,n,e){Gm(t,n,e,!e.get())}function hm(t,n,e){e.set(!0),gm(t,n,e),mm(t,n,e)}function vm(t,n,e){e.set(!1),gm(t,n,e),mm(t,n,e)}function bm(t,n,e){Gm(t,n,e,n.selected)}function ym(){function t(t,n){n.stop(),br(t)}return[Cr(Ci(),t),Cr(Ri(),t),Er(ci()),Er(di())]}function xm(t){return nu(ft([t.map(function(e){return iu(function(t,n){e(t),n.stop()})}).toArray(),ym()]))}function wm(t){(Oa(t.element).isNone()||Vg.isFocused(t))&&(Vg.isFocused(t)||Vg.focus(t),vr(t,Ng,{item:t}))}function Sm(t){vr(t,Lg,{item:t})}function Cm(t,n){return t.x+t.width/2-n.width/2}function km(t,n){return t.x+t.width-n.width}function Om(t,n){return t.y+t.height-n.height}function _m(t,n){return t.y+t.height/2-n.height/2}function Tm(t,n,e){return na(km(t,n),Om(t,n),e.insetSouthwest(),Ha(),"southwest",oa(t,{right:0,bottom:3}),ip)}function Em(t,n,e){return na(t.x,Om(t,n),e.insetSoutheast(),Pa(),"southeast",oa(t,{left:1,bottom:3}),ip)}function Dm(t,n,e){return na(km(t,n),t.y,e.insetNorthwest(),Va(),"northwest",oa(t,{right:0,top:2}),ip)}function Bm(t,n,e){return na(t.x,t.y,e.insetNortheast(),Ra(),"northeast",oa(t,{left:1,top:2}),ip)}function Mm(t,n,e){return na(km(t,n),_m(t,n),e.insetEast(),Wa(),"east",oa(t,{right:0}),ip)}function Am(t,n,e){return na(t.x,_m(t,n),e.insetWest(),La(),"west",oa(t,{left:1}),ip)}function Fm(t){switch(t){case"north":return up;case"northeast":return Bm;case"northwest":return Dm;case"south":return ap;case"southeast":return Em;case"southwest":return Tm;case"east":return Mm;case"west":return Am}}function Im(t,n,e,o,r){return cc(o).map(Fm).getOr(up)(t,n,e,o,r)}function Rm(t){switch(t){case"north":return ap;case"northeast":return Em;case"northwest":return Tm;case"south":return up;case"southeast":return Bm;case"southwest":return Dm;case"east":return Am;case"west":return Mm}}function Vm(t,n,e,o,r){return cc(o).map(Rm).getOr(up)(t,n,e,o,r)}function Pm(t){var n=void 0!==t.uid&&nt(t,"uid")?t.uid:gu("memento");return{get:function(t){return t.getSystem().getByUid(n).getOrDie()},getOpt:function(t){return t.getSystem().getByUid(n).toOptional()},asSpec:function(){return lt(lt({},t),{uid:n})}}}function Hm(t){return function(){return tt(t,dp).getOr("!not found!")}}function zm(t,n){var e,o=t.toLowerCase();if(lp.isRtl()){var r=Bt(e=o,"-rtl")?e:e+"-rtl";return Tt(n,r)?r:o}return o}function Nm(t,n){return tt(n,zm(t,n))}function Lm(t,n){var e=n();return Nm(t,e).getOrThunk(Hm(e))}function Wm(){return fm("add-focusable",[eu(function(t){var n,e,o;n=t.element,e="svg",o=function(t){return zt(t,e)},V(n.dom.childNodes,function(t){return o(At.fromDom(t))}).map(At.fromDom).each(function(t){return on(t,"focusable","false")})})])}function Um(t,n,e,o){var r,i,u,a=(u=n,lp.isRtl()&&Tt(fp,u)?["tox-icon--flip"]:[]),c=tt(e,zm(n,e)).or(o).getOrThunk(Hm(e));return{dom:{tag:t.tag,attributes:null!==(r=t.attributes)&&void 0!==r?r:{},classes:t.classes.concat(a),innerHtml:c},behaviours:tc(H(H([],null!==(i=t.behaviours)&&void 0!==i?i:[],!0),[Wm()],!1))}}function jm(t,n,e,o){return void 0===o&&(o=vt.none()),Um(n,t,e(),o)}(Ql=$l=$l||{}).OnFocusMode="onFocus",Ql.OnEnterOrSpaceMode="onEnterOrSpace",Ql.OnApiMode="onApi";function Gm(t,n,e,o){(o?hm:vm)(t,n,e)}function Xm(t,n,e){on(t.element,"aria-expanded",e)}function Ym(t){return"prepared"===t.type?vt.some(t.menu):vt.none()}var qm=_d(ar("cyclic",O)),Km=_d(ar("cyclic",_)),Jm=Od([To("execute",Td),To("useSpace",!1),To("useEnter",!0),To("useControlEnter",!1),To("useDown",!1)],yu.init,function(t,n,e,o){var r=e.useSpace&&!Cl(t.element)?yd:[],i=e.useEnter?vd:[],u=e.useDown?Cd:[];return[Hl(Il(r.concat(i).concat(u)),Dd)].concat(e.useControlEnter?[Hl(Rl([Pl,Il(vd)]),Dd)]:[])},function(t,n,e,o){return e.useSpace&&!Cl(t.element)?[Hl(Il(yd),Ed)]:[]},function(){return vt.none()}),$m=Object.freeze({__proto__:null,flatgrid:Bd,init:function(t){return t.state(t)}}),Qm=function(n,e,t,o,r){return o.focusManager.get(e).bind(function(t){return n(e.element,t,o,r)}).map(function(t){return o.focusManager.set(e,t),!0})},Zm=Id,tg=Id,ng=Id,eg=Wd(function(t,n,e,o){return zd(t,n,e,o,-1)}),og=Wd(function(t,n,e,o){return zd(t,n,e,o,1)}),rg=Wd(function(t,n,e,o){return Nd(t,n,e,o,-1)}),ig=Wd(function(t,n,e,o){return Nd(t,n,e,o,1)}),ug=Od([fo("selector"),To("execute",Td),Ju("onEscape"),To("captureTab",!1),Fa()],Bd,rt([Hl(Il(xd),Ad(eg,og)),Hl(Il(Sd),Fd(eg,og)),Hl(Il(wd),Zm(rg)),Hl(Il(Cd),tg(ig)),Hl(Rl([Vl,Il(hd)]),Ud),Hl(Rl([kd,Il(hd)]),Ud),Hl(Il(bd),function(t,n,e){return e.onEscape(t,n)}),Hl(Il(yd.concat(vd)),function(n,e,o,t){return(r=o).focusManager.get(n).bind(function(t){return Iu(t,r.selector)}).bind(function(t){return o.execute(n,e,t)});var r})]),rt([Hl(Il(yd),Ed)]),function(){return vt.some(Ld)}),ag=[fo("selector"),To("getInitial",vt.none),To("execute",Td),Ju("onEscape"),To("executeOnMove",!1),To("allowVertical",!0)],cg=rt([Hl(Il(yd),Ed)]),sg=Od(ag,yu.init,function(t,n,e,o){var r=xd.concat(e.allowVertical?wd:[]),i=Sd.concat(e.allowVertical?Cd:[]);return[Hl(Il(r),Kd(Ad(Yd,qd))),Hl(Il(i),Kd(Fd(Yd,qd))),Hl(Il(vd),Gd),Hl(Il(yd),Gd),Hl(Il(bd),Jd)]},cg,function(){return vt.some(Xd)}),lg=[vo("selectors",[fo("row"),fo("cell")]),To("cycles",!0),To("previousSelector",vt.none),To("execute",Td)],fg=om(function(t,n,e){return Qd(t,n,e,-1)},function(t,n,e){return tm(t,n,e,-1)}),dg=om(function(t,n,e){return Qd(t,n,e,1)},function(t,n,e){return tm(t,n,e,1)}),mg=om(function(t,n,e){return Zd(t,e,n,-1)},function(t,n,e){return nm(t,e,n,-1)}),gg=om(function(t,n,e){return Zd(t,e,n,1)},function(t,n,e){return nm(t,e,n,1)}),pg=rt([Hl(Il(xd),Ad(fg,dg)),Hl(Il(Sd),Fd(fg,dg)),Hl(Il(wd),Zm(mg)),Hl(Il(Cd),tg(gg)),Hl(Il(yd.concat(vd)),function(n,e,o){return Oa(n.element).bind(function(t){return o.execute(n,e,t)})})]),hg=rt([Hl(Il(yd),Ed)]),vg=Od(lg,yu.init,pg,hg,function(){return vt.some(em)}),bg=[fo("selector"),To("execute",Td),To("moveOnTab",!1)],yg=rt([Hl(Il(wd),ng(um)),Hl(Il(Cd),ng(am)),Hl(Rl([Vl,Il(hd)]),function(t,n,e,o){return e.moveOnTab?ng(um)(t,n,e,o):vt.none()}),Hl(Rl([kd,Il(hd)]),function(t,n,e,o){return e.moveOnTab?ng(am)(t,n,e,o):vt.none()}),Hl(Il(vd),rm),Hl(Il(yd),rm)]),xg=rt([Hl(Il(yd),Ed)]),wg=Od(bg,yu.init,yg,xg,function(){return vt.some(im)}),Sg=Od([Ju("onSpace"),Ju("onEnter"),Ju("onShiftEnter"),Ju("onLeft"),Ju("onRight"),Ju("onTab"),Ju("onShiftTab"),Ju("onUp"),Ju("onDown"),Ju("onEscape"),To("stopSpaceKeyup",!1),xo("focusIn")],yu.init,function(t,n,e){return[Hl(Il(yd),e.onSpace),Hl(Rl([kd,Il(vd)]),e.onEnter),Hl(Rl([Vl,Il(vd)]),e.onShiftEnter),Hl(Rl([Vl,Il(hd)]),e.onShiftTab),Hl(Rl([kd,Il(hd)]),e.onTab),Hl(Il(wd),e.onUp),Hl(Il(Cd),e.onDown),Hl(Il(xd),e.onLeft),Hl(Il(Sd),e.onRight),Hl(Il(yd),e.onSpace),Hl(Il(bd),e.onEscape)]},function(t,n,e){return e.stopSpaceKeyup?[Hl(Il(yd),Ed)]:[]},function(t){return t.focusIn}),Cg=qm.schema(),kg=Km.schema(),Og=sg.schema(),_g=ug.schema(),Tg=vg.schema(),Eg=Jm.schema(),Dg=wg.schema(),Bg=Sg.schema(),Mg=xa({branchKey:"mode",branches:Object.freeze({__proto__:null,acyclic:Cg,cyclic:kg,flow:Og,flatgrid:_g,matrix:Tg,execution:Eg,menu:Dg,special:Bg}),name:"keying",active:{events:function(t,n){return t.handler.toEvents(t,n)}},apis:{focusIn:function(n,e,o){e.sendFocusIn(e).fold(function(){n.getSystem().triggerFocus(n.element,n.element)},function(t){t(n,e,o)})},setGridSize:function(t,n,e,o,r){nt(e,"setGridSize")?e.setGridSize(o,r):console.error("Layout does not support setGridSize")}},state:$m}),Ag=function(t,n){return t.components()},Fg=ya({fields:[],name:"replacing",apis:Object.freeze({__proto__:null,append:function(t,n,e,o){cm(t,0,_e,o)},prepend:function(t,n,e,o){cm(t,0,Bn,o)},remove:sm,replaceAt:lm,replaceBy:function(n,t,e,o,r){return P(Ag(n),o).bind(function(t){return lm(n,0,0,t,r)})},set:function(n,t,e,o){_a(function(){var t=M(o,n.getSystem().build);Fs(n,t)},n.element)},contents:Ag})}),Ig=Object.freeze({__proto__:null,focus:dm,blur:function(t,n){n.ignore||t.element.dom.blur()},isFocused:function(t){return Ca(t.element)}}),Rg=Object.freeze({__proto__:null,exhibit:function(t,n){return Nr(n.ignore?{}:{attributes:{tabindex:"-1"}})},events:function(e){return nu([Cr(Di(),function(t,n){dm(t,e),n.stop()})].concat(e.stopMousedown?[Cr(di(),function(t,n){n.event.prevent()})]:[]))}}),Vg=ya({fields:[Ku("onFocus"),To("stopMousedown",!1),To("ignore",!1)],name:"focusing",active:Rg,apis:Ig}),Pg=Object.freeze({__proto__:null,onLoad:bm,toggle:pm,isOn:function(t,n,e){return e.get()},on:hm,off:vm,set:Gm}),Hg=Object.freeze({__proto__:null,exhibit:function(){return Nr({})},events:function(t,n){var e,o,r,i=(e=t,o=n,r=pm,iu(function(t){r(t,e,o)})),u=va(t,n,bm);return nu(ft([t.toggleOnExecute?[i]:[],[u]]))}}),zg=ya({fields:[To("selected",!1),xo("toggleClass"),To("toggleOnExecute",!0),Eo("aria",{mode:"none"},so("mode",{pressed:[To("syncWithExpanded",!1),Zu("update",function(t,n,e){on(t.element,"aria-pressed",e),n.syncWithExpanded&&Xm(t,0,e)})],checked:[Zu("update",function(t,n,e){on(t.element,"aria-checked",e)})],expanded:[Zu("update",Xm)],selected:[Zu("update",function(t,n,e){on(t.element,"aria-selected",e)})],none:[Zu("update",st)]}))],name:"toggling",active:Hg,apis:Pg,state:{init:function(){var n=Vo(!1);return{get:function(){return n.get()},set:function(t){return n.set(t)},clear:function(){return n.set(!1)},readState:function(){return n.get()}}}}}),Ng="alloy.item-hover",Lg="alloy.item-focus",Wg=rt(Ng),Ug=rt(Lg),jg=[fo("data"),fo("components"),fo("dom"),To("hasSubmenu",!1),xo("toggling"),Ef("itemBehaviours",[zg,Vg,Mg,Tf]),To("ignoreFocus",!1),To("domModification",{}),Zu("builder",function(t){return{dom:t.dom,domModification:lt(lt({},t.domModification),{attributes:lt(lt(lt({role:t.toggling.isSome()?"menuitemcheckbox":"menuitem"},t.domModification.attributes),{"aria-haspopup":t.hasSubmenu}),t.hasSubmenu?{"aria-expanded":!1}:{})}),behaviours:Df(t.itemBehaviours,[t.toggling.fold(zg.revoke,function(t){return zg.config(lt({aria:{mode:"checked"}},t))}),Vg.config({ignore:t.ignoreFocus,stopMousedown:t.ignoreFocus,onFocus:function(t){Sm(t)}}),Mg.config({mode:"execution"}),Tf.config({store:{mode:"memory",initialValue:t.data}}),fm("item-type-events",H(H([],ym(),!0),[Cr(hi(),wm),Cr(Ii(),Vg.focus)],!1))]),components:t.components,eventOrder:t.eventOrder}}),To("eventOrder",{})],Gg=[fo("dom"),fo("components"),Zu("builder",function(t){return{dom:t.dom,components:t.components,events:nu([Cr(Ii(),function(t,n){n.stop()})])}})],Xg=rt("item-widget"),Yg=rt([qf({name:"widget",overrides:function(n){return{behaviours:tc([Tf.config({store:{mode:"manual",getValue:function(t){return n.data},setValue:st}})])}}})]),qg=so("type",{widget:[fo("uid"),fo("data"),fo("components"),fo("dom"),To("autofocus",!1),To("ignoreFocus",!1),Ef("widgetBehaviours",[Tf,Vg,Mg]),To("domModification",{}),bl(Yg()),Zu("builder",function(e){function o(t){return fl(t,e,"widget").map(function(t){return Mg.focusIn(t),t})}function t(t,n){return Cl(n.event.target)||e.autofocus&&n.setSource(t.element),vt.none()}var n=sl(Xg(),e,Yg()),r=ll(Xg(),e,n.internals());return{dom:e.dom,components:r,domModification:e.domModification,events:nu([iu(function(t,n){o(t).each(function(t){n.stop()})}),Cr(hi(),wm),Cr(Ii(),function(t,n){e.autofocus?o(t):Vg.focus(t)})]),behaviours:Df(e.widgetBehaviours,[Tf.config({store:{mode:"memory",initialValue:e.data}}),Vg.config({ignore:e.ignoreFocus,onFocus:function(t){Sm(t)}}),Mg.config({mode:"special",focusIn:e.autofocus?function(t){o(t)}:oc(),onLeft:t,onRight:t,onEscape:function(t,n){return Vg.isFocused(t)||e.autofocus?(e.autofocus&&n.setSource(t.element),vt.none()):(Vg.focus(t),vt.some(!0))}})])}})],item:jg,separator:Gg}),Kg=rt([$f({factory:{sketch:function(t){var n=co("menu.spec item",qg,t);return n.builder(n)}},name:"items",unit:"item",defaults:function(t,n){return Tt(n,"uid")?n:lt(lt({},n),{uid:gu("item")})},overrides:function(t,n){return{type:n.type,ignoreFocus:t.fakeFocus,domModification:{classes:[t.markers.item]}}}})]),Jg=rt([fo("value"),fo("items"),fo("dom"),fo("components"),To("eventOrder",{}),$s("menuBehaviours",[gd,Tf,ud,Mg]),Eo("movement",{mode:"menu",moveOnTab:!0},so("mode",{grid:[Fa(),Zu("config",function(t,n){return{mode:"flatgrid",selector:"."+t.markers.item,initSize:{numColumns:n.initSize.numColumns,numRows:n.initSize.numRows},focusManager:t.focusManager}})],matrix:[Zu("config",function(t,n){return{mode:"matrix",selectors:{row:n.rowSelector,cell:"."+t.markers.item},focusManager:t.focusManager}}),fo("rowSelector")],menu:[To("moveOnTab",!0),Zu("config",function(t,n){return{mode:"menu",selector:"."+t.markers.item,moveOnTab:n.moveOnTab,focusManager:t.focusManager}})]})),mo("markers",Aa()),To("fakeFocus",!1),To("focusManager",Nl()),Ku("onHighlight")]),$g=rt("alloy.menu-focus"),Qg=Sl({name:"Menu",configFields:Jg(),partFields:Kg(),factory:function(t,n,e,o){return{uid:t.uid,dom:t.dom,markers:t.markers,behaviours:Zs(t.menuBehaviours,[gd.config({highlightClass:t.markers.selectedItem,itemClass:t.markers.item,onHighlight:t.onHighlight}),Tf.config({store:{mode:"memory",initialValue:t.value}}),ud.config({find:vt.some}),Mg.config(t.movement.config(t,t.movement))]),events:nu([Cr(Ug(),function(n,e){var t=e.event;n.getSystem().getByDom(t.target).each(function(t){gd.highlight(n,t),e.stop(),vr(n,$g(),{menu:n,item:t})})}),Cr(Wg(),function(t,n){var e=n.event.item;gd.highlight(t,e)})]),components:n,eventOrder:t.eventOrder,domModification:{attributes:{role:"menu"}}}}}),Zg=function(e,o,r,t){return tt(r,t).bind(function(t){return tt(e,t).bind(function(t){var n=Zg(e,o,r,t);return vt.some([t].concat(n))})}).getOr([])},tp=function(){function a(t){return n(t).bind(Ym)}function e(t){return tt(c.get(),t)}var c=Vo({}),i=Vo({}),s=Vo({}),l=dc(),u=Vo({}),n=function(t){return tt(i.get(),t)};return{setMenuBuilt:function(t,n){var e;i.set(lt(lt({},i.get()),((e={})[t]={type:"prepared",menu:n},e)))},setContents:function(t,n,e,o){l.set(t),c.set(e),i.set(n),u.set(o);var r=function(t,n){var e={};J(t,function(t,n){St(t,function(t){e[t]=n})});var o=n,r=_t(n,function(t,n){return{k:t,v:n}}),i=dt(r,function(t,n){return[n].concat(Zg(e,o,r,n))});return dt(e,function(t){return tt(i,t).getOr([t])})}(o,e);s.set(r)},expand:function(e){return tt(c.get(),e).map(function(t){var n=tt(s.get(),e).getOr([]);return[t].concat(n)})},refresh:function(t){return tt(s.get(),t)},collapse:function(t){return tt(s.get(),t).bind(function(t){return 1<t.length?vt.some(t.slice(1)):vt.none()})},lookupMenu:n,lookupItem:e,otherMenus:function(t){var n=u.get();return W(kt(n),t)},getPrimary:function(){return l.get().bind(a)},getMenus:function(){return i.get()},clear:function(){c.set({}),i.set({}),s.set({}),l.clear()},isClear:function(){return l.get().isNone()},getTriggeringPath:function(t,u){var n=F(e(t).toArray(),function(t){return a(t).isSome()});return tt(s.get(),t).bind(function(t){var e=L(n.concat(t));return function(t){for(var n=[],e=0;e<t.length;e++){var o=t[e];if(!o.isSome())return vt.none();n.push(o.getOrDie())}return vt.some(n)}(z(e,function(t,n){return o=t,r=u,i=e.slice(0,n+1),a(o).bind(function(n){return e=o,Q(c.get(),function(t,n){return t===e}).bind(function(t){return r(t).map(function(t){return{triggeredMenu:n,triggeringItem:t,triggeringPath:i}})});var e}).fold(function(){return mt(l.get(),t)?[]:[vt.none()]},function(t){return[vt.some(t)]});var o,r,i}))})}}},np=Ym,ep=rt("collapse-item"),op=wl({name:"TieredMenu",configFields:[Qu("onExecute"),Qu("onEscape"),$u("onOpenMenu"),$u("onOpenSubmenu"),Ku("onRepositionMenu"),Ku("onCollapseMenu"),To("highlightImmediately",!0),vo("data",[fo("primary"),fo("menus"),fo("expansions")]),To("fakeFocus",!1),Ku("onHighlight"),Ku("onHover"),Xu(),fo("dom"),To("navigateOnHover",!0),To("stayInDom",!1),$s("tmenuBehaviours",[Mg,gd,ud,Fg]),To("eventOrder",{})],apis:{collapseMenu:function(t,n){t.collapseMenu(n)},highlightPrimary:function(t,n){t.highlightPrimary(n)},repositionMenus:function(t,n){t.repositionMenus(n)}},factory:function(a,t){function e(t){var o,r,n=(o=t,r=a.data.primary,dt(a.data.menus,function(t,n){function e(){return Qg.sketch(lt(lt({},t),{value:n,markers:a.markers,fakeFocus:a.fakeFocus,onHighlight:a.onHighlight,focusManager:(a.fakeFocus?Ll:Nl)()}))}return n===r?{type:"prepared",menu:o.getSystem().build(e())}:{type:"notbuilt",nbMenu:e}})),e=dt(a.data.menus,function(t,n){return z(t.items,function(t){return"separator"===t.type?[]:[t.data.value]})});return g.setContents(a.data.primary,n,a.data.expansions,e),g.getPrimary()}function c(t){return Tf.getValue(t).value}function u(n,t){gd.highlight(n,t),gd.getHighlighted(t).orThunk(function(){return gd.getFirst(t)}).each(function(t){yr(n,t.element,Ii())})}function s(n,t){return et(M(t,function(t){return n.lookupMenu(t).bind(function(t){return"prepared"===t.type?vt.some(t.menu):vt.none()})}))}function l(n,t,e){var o=s(t,t.otherMenus(e));St(o,function(t){Jr(t.element,[a.markers.backgroundMenu]),a.stayInDom||Fg.remove(n,t)})}function f(t,o){var n;J((n=t,r.get().getOrThunk(function(){var e={},t=F(ps(n.element,"."+a.markers.item),function(t){return"true"===rn(t,"aria-haspopup")});return St(t,function(t){n.getSystem().getByDom(t).each(function(t){var n=c(t);e[n]=t})}),r.set(e),e})),function(t,n){var e=wt(o,n);on(t.element,"aria-expanded",e)})}function d(o,r,i){return vt.from(i[0]).bind(function(t){return r.lookupMenu(t).bind(function(t){if("notbuilt"===t.type)return vt.none();var n=t.menu,e=s(r,i.slice(1));return St(e,function(t){Xr(t.element,a.markers.backgroundMenu)}),he(n.element)||Fg.append(o,Tu(n)),Jr(n.element,[a.markers.backgroundMenu]),u(o,n),l(o,r,i),vt.some(n)})})}var m,n,r=dc(),g=tp();function i(r,i,u){if(void 0===u&&(u=m.HighlightSubmenu),i.hasConfigured(dd)&&dd.isDisabled(i))return vt.some(i);var t=c(i);return g.expand(t).bind(function(o){return f(r,o),vt.from(o[0]).bind(function(e){return g.lookupMenu(e).bind(function(t){var n=function(t,n,e){if("notbuilt"!==e.type)return e.menu;var o=t.getSystem().build(e.nbMenu());return g.setMenuBuilt(n,o),o}(r,e,t);return he(n.element)||Fg.append(r,Tu(n)),a.onOpenSubmenu(r,i,n,L(o)),u===m.HighlightSubmenu?(gd.highlightFirst(n),d(r,g,o)):(gd.dehighlightAll(n),vt.some(i))})})})}function o(n,e){var t=c(e);return g.collapse(t).bind(function(t){return f(n,t),d(n,g,t).map(function(t){return a.onCollapseMenu(n,e,t),t})})}function p(e){return function(n,t){return Iu(t.getSource(),"."+a.markers.item).bind(function(t){return n.getSystem().getByDom(t).toOptional().bind(function(t){return e(n,t).map(_)})})}}function h(t){return gd.getHighlighted(t).bind(gd.getHighlighted)}(n=m={})[n.HighlightSubmenu=0]="HighlightSubmenu",n[n.HighlightParent=1]="HighlightParent";var v=nu([Cr($g(),function(e,o){var t=o.event.item;g.lookupItem(c(t)).each(function(){var t=o.event.menu;gd.highlight(e,t);var n=c(o.event.item);g.refresh(n).each(function(t){return l(e,g,t)})})}),iu(function(n,t){var e=t.event.target;n.getSystem().getByDom(e).each(function(t){0===c(t).indexOf("collapse-item")&&o(n,t),i(n,t,m.HighlightSubmenu).fold(function(){a.onExecute(n,t)},st)})}),eu(function(n,t){e(n).each(function(t){Fg.append(n,Tu(t)),a.onOpenMenu(n,t),a.highlightImmediately&&u(n,t)})})].concat(a.navigateOnHover?[Cr(Wg(),function(t,n){var e=n.event.item,o=t,r=c(e);g.refresh(r).bind(function(t){return f(o,t),d(o,g,t)}),i(t,e,m.HighlightParent),a.onHover(t,e)})]:[])),b={collapseMenu:function(n){h(n).each(function(t){o(n,t)})},highlightPrimary:function(n){g.getPrimary().each(function(t){u(n,t)})},repositionMenus:function(o){g.getPrimary().bind(function(n){return h(o).bind(function(t){var n=c(t),e=et(M(Z(g.getMenus()),np));return g.getTriggeringPath(n,function(t){return n=t,K(e,function(t){return t.getSystem().isConnected()?V(gd.getCandidates(t),function(t){return c(t)===n}):vt.none()});var n})}).map(function(t){return{primary:n,triggeringPath:t}})}).fold(function(){vt.from(o.components()[0]).filter(function(t){return"menu"===rn(t.element,"role")}).each(function(t){a.onRepositionMenu(o,t,[])})},function(t){var n=t.primary,e=t.triggeringPath;a.onRepositionMenu(o,n,e)})}};return{uid:a.uid,dom:a.dom,markers:a.markers,behaviours:Zs(a.tmenuBehaviours,[Mg.config({mode:"special",onRight:p(function(t,n){return Cl(n.element)?vt.none():i(t,n,m.HighlightSubmenu)}),onLeft:p(function(t,n){return Cl(n.element)?vt.none():o(t,n)}),onEscape:p(function(t,n){return o(t,n).orThunk(function(){return a.onEscape(t,n).map(function(){return t})})}),focusIn:function(n,t){g.getPrimary().each(function(t){yr(n,t.element,Ii())})}}),gd.config({highlightClass:a.markers.selectedMenu,itemClass:a.markers.menu}),ud.config({find:function(t){return gd.getHighlighted(t)}}),Fg.config({})]),eventOrder:a.eventOrder,apis:b,events:v}},extraApis:{tieredData:function(t,n,e){return{primary:t,menus:n,expansions:e}},singleData:function(t,n){return{primary:t,menus:cr(t,n),expansions:{}}},collapseItem:function(t){return{value:Fr(ep()),meta:{text:t}}}}}),rp=wl({name:"InlineView",configFields:[fo("lazySink"),Ku("onShow"),Ku("onHide"),ko("onEscape"),$s("inlineBehaviours",[hf,Tf,rc]),_o("fireDismissalEventInstead",[To("event",Xi())]),_o("fireRepositionEventInstead",[To("event",Yi())]),To("getRelated",vt.none),To("isExtraPart",O),To("eventOrder",vt.none)],factory:function(d,t){function n(e){hf.isOpen(e)&&Tf.getValue(e).each(function(t){switch(t.mode){case"menu":hf.getState(e).each(op.repositionMenus);break;case"position":var n=d.lazySink(e).getOrDie();sf.positionWithinBounds(n,e,t.config,t.getBounds())}})}function o(t,n,e,o){i(t,n,e,function(){return o.map(function(t){return Me(t)})})}function r(t,n,e,o){var r,i,u,a,c,s=(r=d,i=t,u=n,a=o,c="horizontal"===e.type?{layouts:{onLtr:pa,onRtl:ha}}:{},op.sketch({dom:{tag:"div"},data:e.data,markers:e.menu.markers,highlightImmediately:e.menu.highlightImmediately,onEscape:function(){return hf.close(i),r.onEscape.map(function(t){return t(i)}),vt.some(!0)},onExecute:function(){return vt.some(!0)},onOpenMenu:function(t,n){sf.positionWithinBounds(l().getOrDie(),n,u,a())},onOpenSubmenu:function(t,n,e,o){var r=l().getOrDie();sf.position(r,e,{anchor:lt({type:"submenu",item:n},f(o))})},onRepositionMenu:function(t,n,e){var o=l().getOrDie();sf.positionWithinBounds(o,n,u,a()),St(e,function(t){var n=f(t.triggeringPath);sf.position(o,t.triggeredMenu,{anchor:lt({type:"submenu",item:t.triggeringItem},n)})})}}));function l(){return r.lazySink(i)}function f(t){return 2===t.length?c:{}}hf.open(t,s),Tf.setValue(t,vt.some({mode:"menu",menu:s}))}var i=function(t,n,e,o){var r=d.lazySink(t).getOrDie();hf.openWhileCloaked(t,n,function(){return sf.positionWithinBounds(r,t,e,o())}),Tf.setValue(t,vt.some({mode:"position",config:e,getBounds:o}))},e={setContent:function(t,n){hf.setContent(t,n)},showAt:function(t,n,e){o(t,n,e,vt.none())},showWithin:o,showWithinBounds:i,showMenuAt:function(t,n,e){r(t,n,e,vt.none)},showMenuWithinBounds:r,hide:function(t){hf.isOpen(t)&&(Tf.setValue(t,vt.none()),hf.close(t))},getContent:function(t){return hf.getState(t)},reposition:n,isOpen:hf.isOpen};return{uid:d.uid,dom:d.dom,behaviours:Zs(d.inlineBehaviours,[hf.config({isPartOf:function(t,n,e){return Hu(n,e)||(o=e,d.getRelated(t).exists(function(t){return Hu(t,o)}));var o},getAttachPoint:function(t){return d.lazySink(t).getOrDie()},onOpen:function(t){d.onShow(t)},onClose:function(t){d.onHide(t)}}),Tf.config({store:{mode:"memory",initialValue:vt.none()}}),rc.config({channels:lt(lt({},js(lt({isExtraPart:t.isExtraPart},d.fireDismissalEventInstead.map(function(t){return{fireEventInstead:{event:t.event}}}).getOr({})))),Gs(lt(lt({},d.fireRepositionEventInstead.map(function(t){return{fireEventInstead:{event:t.event}}}).getOr({})),{doReposition:n})))})]),eventOrder:d.eventOrder,apis:e}},apis:{showAt:function(t,n,e,o){t.showAt(n,e,o)},showWithin:function(t,n,e,o,r){t.showWithin(n,e,o,r)},showWithinBounds:function(t,n,e,o,r){t.showWithinBounds(n,e,o,r)},showMenuAt:function(t,n,e,o){t.showMenuAt(n,e,o)},showMenuWithinBounds:function(t,n,e,o,r){t.showMenuWithinBounds(n,e,o,r)},hide:function(t,n){t.hide(n)},isOpen:function(t,n){return t.isOpen(n)},getContent:function(t,n){return t.getContent(n)},setContent:function(t,n,e){t.setContent(n,e)},reposition:function(t,n){t.reposition(n)}}}),ip="layout-inset",up=function(t,n,e){return na(Cm(t,n),t.y,e.insetNorth(),za(),"north",oa(t,{top:2}),ip)},ap=function(t,n,e){return na(Cm(t,n),Om(t,n),e.insetSouth(),Na(),"south",oa(t,{bottom:3}),ip)},cp=tinymce.util.Tools.resolve("tinymce.util.Delay"),sp=wl({name:"Button",factory:function(t){function e(n){return tt(t.dom,"attributes").bind(function(t){return tt(t,n)})}var n=xm(t.action),o=t.dom.tag;return{uid:t.uid,dom:t.dom,components:t.components,events:n,behaviours:Df(t.buttonBehaviours,[Vg.config({}),Mg.config({mode:"execution",useSpace:!0,useEnter:!0})]),domModification:{attributes:function(){if("button"!==o)return{role:e("role").getOr("button")};var t=e("type").getOr("button"),n=e("role").map(function(t){return{role:t}}).getOr({});return lt({type:t},n)}()},eventOrder:t.eventOrder}},configFields:[To("uid",void 0),fo("dom"),To("components",[]),Ef("buttonBehaviours",[Vg,Mg]),xo("action"),xo("role"),To("eventOrder",{})]}),lp=tinymce.util.Tools.resolve("tinymce.util.I18n"),fp={indent:!0,outdent:!0,"table-insert-column-after":!0,"table-insert-column-before":!0,"paste-column-after":!0,"paste-column-before":!0,"unordered-list":!0,"list-bull-circle":!0,"list-bull-default":!0,"list-bull-square":!0},dp="temporary-placeholder",mp={success:"checkmark",error:"warning",err:"error",warning:"warning",warn:"warning",info:"info"},gp=wl({name:"Notification",factory:function(n){function e(t){return{dom:{tag:"div",classes:["tox-bar"],attributes:{style:"width: "+t+"%"}}}}function o(t){return{dom:{tag:"div",classes:["tox-text"],innerHtml:t+"%"}}}var t,r,i,u,a=Pm({dom:{tag:"p",innerHtml:n.translationProvider(n.text)},behaviours:tc([Fg.config({})])}),c=Pm({dom:{tag:"div",classes:n.progress?["tox-progress-bar","tox-progress-indicator"]:["tox-progress-bar"]},components:[{dom:{tag:"div",classes:["tox-bar-container"]},components:[e(0)]},o(0)],behaviours:tc([Fg.config({})])}),s={updateProgress:function(t,n){t.getSystem().isConnected()&&c.getOpt(t).each(function(t){Fg.set(t,[{dom:{tag:"div",classes:["tox-bar-container"]},components:[e(n)]},o(n)])})},updateText:function(t,n){var e;t.getSystem().isConnected()&&(e=a.get(t),Fg.set(e,[oi(n)]))}},l=ft([n.icon.toArray(),n.level.toArray(),n.level.bind(function(t){return vt.from(mp[t])}).toArray()]),f=Pm(sp.sketch({dom:{tag:"button",classes:["tox-notification__dismiss","tox-button","tox-button--naked","tox-button--icon"]},components:[jm("close",{tag:"div",classes:["tox-icon"],attributes:{"aria-label":n.translationProvider("Close")}},n.iconProvider)],action:function(t){n.onAction(t)}})),d=[(t=l,r={tag:"div",classes:["tox-notification__icon"]},i=n.iconProvider,u=i(),Um(r,V(t,function(t){return Tt(u,zm(t,u))}).getOr(dp),u,vt.none())),{dom:{tag:"div",classes:["tox-notification__body"]},components:[a.asSpec()],behaviours:tc([Fg.config({})])}];return{uid:n.uid,dom:{tag:"div",attributes:{role:"alert"},classes:n.level.map(function(t){return["tox-notification","tox-notification--in","tox-notification--"+t]}).getOr(["tox-notification","tox-notification--in"])},behaviours:tc([Vg.config({}),fm("notification-events",[Cr(vi(),function(t){f.getOpt(t).each(Vg.focus)})])]),components:d.concat(n.progress?[c.asSpec()]:[]).concat(n.closeButton?[f.asSpec()]:[]),apis:s}},configFields:[xo("level"),fo("progress"),fo("icon"),fo("onAction"),fo("text"),fo("iconProvider"),fo("translationProvider"),Ao("closeButton",!0)],apis:{updateProgress:function(t,n,e){t.updateProgress(n,e)},updateText:function(t,n,e){t.updateText(n,e)}}});function pp(e,o){function r(){b(i)||(clearTimeout(i),i=null)}var i=null;return{cancel:r,throttle:function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];r(),i=setTimeout(function(){i=null,e.apply(null,t)},o)}}}function hp(o,t,n,e,r){var i=Ep(o,function(t){return(n=o).isBlock(e=t)||wt(["BR","IMG","HR","INPUT"],e.nodeName)||"false"===n.getContentEditable(e);var n,e});return vt.from(i.backwards(t,n,e,r))}function vp(e,n){return Dp(At.fromDom(e.selection.getNode())).getOrThunk(function(){var i,u,t=At.fromHtml('<span data-mce-autocompleter="1" data-mce-bogus="1"></span>',e.getDoc());return _e(t,At.fromDom(n.extractContents())),n.insertNode(t.dom),Yt(t).each(function(t){return t.dom.normalize()}),i=gs,(u=function(t){for(var n=Kt(t),e=n.length-1;0<=e;e--){var o=n[e];if(i(o))return vt.some(o);var r=u(o);if(r.isSome())return r}return vt.none()})(t).map(function(t){var n;e.selection.setCursorLocation(t.dom,"img"===Ft(n=t)?1:ms(n).fold(function(){return Kt(n).length},function(t){return t.length}))}),t})}function bp(t){return t.toString().replace(/\u00A0/g," ").replace(/\uFEFF/g,"")}function yp(t){return""!==t&&-1!==" \xa0\f\n\r\t\v".indexOf(t)}function xp(t,n){return t.substring(n.length)}function wp(o,t,r,n){return void 0===n&&(n=0),Dp(At.fromDom(t.startContainer)).fold(function(){return function(t,o,i,r){if(void 0===r&&(r=0),!o.collapsed||3!==o.startContainer.nodeType)return vt.none();var n=t.getParent(o.startContainer,t.isBlock)||t.getRoot();return hp(t,o.startContainer,o.startOffset,function(t,r,n){return function(t,n){for(var e=r-1;0<=e;e--){var o=t.charAt(e);if(yp(o))return vt.none();if(o===n)break}return vt.some(e)}(n,i).getOr(r)},n).bind(function(t){var n=o.cloneRange();if(n.setStart(t.container,t.offset),n.setEnd(o.endContainer,o.endOffset),n.collapsed)return vt.none();var e=bp(n);return 0!==e.lastIndexOf(i)||xp(e,i).length<r?vt.none():vt.some({text:xp(e,i),range:n,triggerChar:i})})}(o,t,r,n)},function(t){var n=o.createRng();n.selectNode(t.dom);var e=bp(n);return vt.some({range:n,text:xp(e,r),triggerChar:r})})}function Sp(t,n){return{container:t,offset:n}}function Cp(t){return uo("toolbarbutton",Pp,t)}function kp(t){return uo("ToggleButton",zp,t)}function Op(n,t,e,o){void 0===o&&(o={});var r=t(),i=n.selection.getRng().startContainer.nodeValue,u=F(r.lookupByChar(e.triggerChar),function(t){return e.text.length>=t.minChars&&t.matches.getOrThunk(function(){return e=n.dom,function(t){var n=Ap(t.startContainer,t.startOffset);return!hp(e,n.container,n.offset,function(t,n){return 0===n?-1:n},e.getRoot()).filter(function(t){return!yp(t.container.data.charAt(t.offset-1))}).isSome()};var e})(e.range,i,e.text)});if(0===u.length)return vt.none();var a=Bp.all(M(u,function(n){return n.fetch(e.text,n.maxResults,o).then(function(t){return{matchText:e.text,items:t,columns:n.columns,onAction:n.onAction,highlightOn:n.highlightOn}})}));return vt.some({lookupData:a,context:e})}var _p,Tp,Ep=tinymce.util.Tools.resolve("tinymce.dom.TextSeeker"),Dp=function(t){return Iu(t,"[data-mce-autocompleter]")},Bp=tinymce.util.Tools.resolve("tinymce.util.Promise"),Mp=function(t){if(3===t.nodeType)return Sp(t,t.data.length);var n=t.childNodes;return 0<n.length?Mp(n[n.length-1]):Sp(t,n.length)},Ap=function(t,n){var e=t.childNodes;return 0<e.length&&n<e.length?Ap(e[n],0):0<e.length&&1===t.nodeType&&e.length===n?Mp(e[e.length-1]):Sp(t,n)},Fp=Jo([go("type"),Co("text")]),Ip=Jo([To("type","autocompleteitem"),To("active",!1),To("disabled",!1),To("meta",{}),go("value"),Co("text"),Co("icon")]),Rp=Jo([go("type"),go("ch"),Do("minChars",1),To("columns",1),Do("maxResults",10),ko("matches"),ho("fetch"),ho("onAction"),Io("highlightOn",[],tr)]),Vp=[Ao("disabled",!1),Co("tooltip"),Co("icon"),Co("text"),Fo("onSetup",function(){return st})],Pp=Jo([go("type"),ho("onAction")].concat(Vp)),Hp=[Ao("active",!1)].concat(Vp),zp=Jo(Hp.concat([go("type"),ho("onAction")])),Np=[Fo("predicate",O),Mo("scope","node",["node","editor"]),Mo("position","selection",["node","selection","line"])],Lp=Vp.concat([To("type","contextformbutton"),To("primary",!1),ho("onAction"),ar("original",h)]),Wp=Hp.concat([To("type","contextformbutton"),To("primary",!1),ho("onAction"),ar("original",h)]),Up=Vp.concat([To("type","contextformbutton")]),jp=Hp.concat([To("type","contextformtogglebutton")]),Gp=so("type",{contextformbutton:Lp,contextformtogglebutton:Wp}),Xp=Jo([To("type","contextform"),Fo("initValue",rt("")),Co("label"),yo("commands",Gp),wo("launch",so("type",{contextformbutton:Up,contextformtogglebutton:jp}))].concat(Np)),Yp=Jo([To("type","contexttoolbar"),go("items")].concat(Np));function qp(t){return tt(kh,t).getOr(wh)}function Kp(t){return{backgroundMenu:"tox-background-menu",selectedMenu:"tox-selected-menu",selectedItem:"tox-collection__item--active",hasIcons:"tox-menu--has-icons",menu:"color"===t?"tox-swatches":"tox-menu",tieredMenu:"tox-tiered-menu"}}function Jp(t){var n=Kp(t);return{backgroundMenu:n.backgroundMenu,selectedMenu:n.selectedMenu,menu:n.menu,selectedItem:n.selectedItem,item:qp(t)}}function $p(t,n,e){return{dom:{tag:"div",classes:ft([[Kp(e).tieredMenu]])},markers:Jp(e)}}function Qp(n,e){return function(t){return M(B(t,e),function(t){return{dom:n,components:t}})}}function Zp(t,e){var o=[],r=[];return St(t,function(t,n){e(t,n)?(0<r.length&&o.push(r),r=[],Tt(t.dom,"innerHtml")&&r.push(t)):r.push(t)}),0<r.length&&o.push(r),M(o,function(t){return{dom:{tag:"div",classes:["tox-collection__group"]},components:t}})}function th(n,e){return{dom:{tag:"div",classes:["tox-menu","tox-collection"].concat(1===n?["tox-collection--list"]:["tox-collection--grid"])},components:[Qg.parts.items({preprocess:function(t){return"auto"!==n&&1<n?Qp({tag:"div",classes:["tox-collection__group"]},n)(t):Zp(t,function(t,n){return"separator"===e[n].type})}})]}}function nh(t){return T(t,function(t){return"icon"in t&&void 0!==t.icon})}function eh(t){return console.error(ir(t)),console.log(t),vt.none()}function oh(t,n,e,o,r){var i,u=(i=e,{dom:{tag:"div",classes:["tox-collection","tox-collection--horizontal"]},components:[Qg.parts.items({preprocess:function(t){return Zp(t,function(t,n){return"separator"===i[n].type})}})]});return{value:t,dom:u.dom,components:u.components,items:e}}function rh(t,n,e,o,r){var i,u;return"color"===r?{value:t,dom:(i={dom:{tag:"div",classes:["tox-menu","tox-swatches-menu"]},components:[{dom:{tag:"div",classes:["tox-swatches"]},components:[Qg.parts.items({preprocess:"auto"!==o?Qp({tag:"div",classes:["tox-swatches__row"]},o):h})]}]}).dom,components:i.components,items:e}:"normal"===r&&"auto"===o?{value:t,dom:(i=th(o,e)).dom,components:i.components,items:e}:"normal"===r&&1===o?{value:t,dom:(i=th(1,e)).dom,components:i.components,items:e}:"normal"===r?{value:t,dom:(i=th(o,e)).dom,components:i.components,items:e}:"listpreview"!==r||"auto"===o?{value:t,dom:{tag:"div",classes:ft([[(u=Kp(r)).menu,"tox-menu-"+o+"-column"],n?[u.hasIcons]:[]])},components:Ah,items:e}:{value:t,dom:(i={dom:{tag:"div",classes:["tox-menu","tox-collection","tox-collection--toolbar","tox-collection--toolbar-lg"]},components:[Qg.parts.items({preprocess:Qp({tag:"div",classes:["tox-collection__group"]},o)})]}).dom,components:i.components,items:e}}function ih(t,o,n){var r=ps(t.element,"."+n);if(0<r.length){var e=P(r,function(t){var n=t.dom.getBoundingClientRect().top,e=r[0].dom.getBoundingClientRect().top;return Math.abs(n-e)>o}).getOr(r.length);return vt.some({numColumns:e,numRows:Math.ceil(r.length/e)})}return vt.none()}function uh(t,n,e){t.getSystem().broadcastOn([qh],{})}function ah(t){return t.getParam("height",Math.max(t.getElement().offsetHeight,200))}function ch(t){return t.getParam("width",tv.DOM.getStyle(t.getElement(),"width"))}function sh(t){return vt.from(t.getParam("min_width")).filter(u)}function lh(t){return vt.from(t.getParam("min_height")).filter(u)}function fh(t){return vt.from(t.getParam("max_width")).filter(u)}function dh(t){return vt.from(t.getParam("max_height")).filter(u)}function mh(t){return!1!==t.getParam("menubar",!0,"boolean")}function gh(t){var n=t.getParam("toolbar",!0),e=!0===n,o=y(n),r=c(n)&&0<n.length;return!ev(t)&&(r||o||e)}function ph(n){var t=F(D(9,function(t){return n.getParam("toolbar"+(t+1),!1,"string")}),function(t){return"string"==typeof t});return 0<t.length?vt.some(t):vt.none()}(Tp=_p={})[Tp.CLOSE_ON_EXECUTE=0]="CLOSE_ON_EXECUTE",Tp[Tp.BUBBLE_TO_SANDBOX=1]="BUBBLE_TO_SANDBOX";var hh,vh,bh,yh,xh=_p,wh="tox-menu-nav__js",Sh="tox-collection__item",Ch="tox-swatch",kh={normal:wh,color:Ch},Oh="tox-collection__item--enabled",_h="tox-collection__item-icon",Th="tox-collection__item-label",Eh="tox-collection__item-caret",Dh="tox-collection__item--active",Bh="tox-collection__item-container",Mh="tox-collection__item-container--row",Ah=[Qg.parts.items({})],Fh=[go("type"),go("src"),Co("alt"),Io("classes",[],tr)],Ih=Jo(Fh),Rh=[go("type"),go("text"),Co("name"),Io("classes",["tox-collection__item-label"],tr)],Vh=Jo(Rh),Ph=Qe(function(){return oo("type",{cardimage:Ih,cardtext:Vh,cardcontainer:Hh})}),Hh=Jo([go("type"),Bo("direction","horizontal"),Bo("align","left"),Bo("valign","middle"),yo("items",Ph)]),zh=[Ao("disabled",!1),Co("text"),Co("shortcut"),ur("value","value",Ue(function(){return Fr("menuitem-value")}),Qo()),To("meta",{})],Nh=Jo([go("type"),Co("label"),yo("items",Ph),Fo("onSetup",function(){return st}),Fo("onAction",st)].concat(zh)),Lh=Jo([go("type"),Ao("active",!1),Co("icon")].concat(zh)),Wh=[go("type"),go("fancytype"),Fo("onAction",st)],Uh=so("fancytype",{inserttable:[To("initData",{})].concat(Wh),colorswatch:[Ro("initData",{},[Ao("allowCustomColors",!0),Oo("colors",Qo())])].concat(Wh)}),jh=Jo([go("type"),Fo("onSetup",function(){return st}),Fo("onAction",st),Co("icon")].concat(zh)),Gh=Jo([go("type"),ho("getSubmenuItems"),Fo("onSetup",function(){return st}),Co("icon")].concat(zh)),Xh=Jo([go("type"),Co("icon"),Ao("active",!1),Fo("onSetup",function(){return st}),ho("onAction")].concat(zh)),Yh=function(t){return n=Fr("unnamed-events"),tc([fm(n,t)]);var n},qh=Fr("tooltip.exclusive"),Kh=Fr("tooltip.show"),Jh=Fr("tooltip.hide"),$h=Object.freeze({__proto__:null,hideAllExclusive:uh,setComponents:function(t,n,e,o){e.getTooltip().each(function(t){t.getSystem().isConnected()&&Fg.set(t,o)})}}),Qh=Object.freeze({__proto__:null,events:function(r,i){function e(n){i.getTooltip().each(function(t){Vs(t),r.onHide(n,t),i.clearTooltip()}),i.clearTimer()}return nu(ft([[Cr(Kh,function(o){i.resetTimer(function(){var t,n,e=o;i.isShowing()||(uh(e),t=r.lazySink(e).getOrDie(),n=e.getSystem().build({dom:r.tooltipDom,components:r.tooltipComponents,events:nu("normal"===r.mode?[Cr(hi(),function(t){hr(e,Kh)}),Cr(gi(),function(t){hr(e,Jh)})]:[]),behaviours:tc([Fg.config({})])}),i.setTooltip(n),Is(t,n),r.onShow(e,n),sf.position(t,n,{anchor:r.anchor(e)}))},r.delay)}),Cr(Jh,function(t){i.resetTimer(function(){e(t)},r.delay)}),Cr(Ai(),function(t,n){n.universal||wt(n.channels,qh)&&e(t)}),ou(function(t){e(t)})],"normal"===r.mode?[Cr(vi(),function(t){hr(t,Kh)}),Cr(Bi(),function(t){hr(t,Jh)}),Cr(hi(),function(t){hr(t,Kh)}),Cr(gi(),function(t){hr(t,Jh)})]:[Cr(Qi(),function(t,n){hr(t,Kh)}),Cr(Zi(),function(t){hr(t,Jh)})]]))}}),Zh=ya({fields:[fo("lazySink"),fo("tooltipDom"),To("exclusive",!0),To("tooltipComponents",[]),To("delay",300),Mo("mode","normal",["normal","follow-highlight"]),To("anchor",function(t){return{type:"hotspot",hotspot:t,layouts:{onLtr:rt([Ja,Ka,Ga,Ya,Xa,qa]),onRtl:rt([Ja,Ka,Ga,Ya,Xa,qa])}}}),Ku("onHide"),Ku("onShow")],name:"tooltipping",active:Qh,state:Object.freeze({__proto__:null,init:function(){function e(){o.on(clearTimeout)}var o=dc(),t=dc(),n=rt("not-implemented");return xu({getTooltip:t.get,isShowing:t.isSet,setTooltip:t.set,clearTooltip:t.clear,clearTimer:e,resetTimer:function(t,n){e(),o.set(setTimeout(t,n))},readState:n})}}),apis:$h}),tv=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),nv=tinymce.util.Tools.resolve("tinymce.EditorManager"),ev=function(t){return ph(t).fold(function(){return 0<t.getParam("toolbar",[],"string[]").length},_)};function ov(t){return t.getParam("toolbar_mode","","string")}function rv(t){return t.getParam("toolbar_location",bh.auto,"string")}function iv(t){return rv(t)===bh.bottom}function uv(t){if(!t.inline)return vt.none();var n=t.getParam("fixed_toolbar_container","","string");if(0<n.length)return Fu(ve(),n);var e=t.getParam("fixed_toolbar_container_target");return d(e)?vt.some(At.fromDom(e)):vt.none()}function av(t){return t.inline&&uv(t).isSome()}function cv(t){return uv(t).getOrThunk(function(){return tn(me(At.fromDom(t.getElement())))})}function sv(t){return t.inline&&!mh(t)&&!gh(t)&&!ev(t)}function lv(t){return(t.getParam("toolbar_sticky",!1,"boolean")||t.inline)&&!av(t)&&!sv(t)}function fv(t,n){var e=t.outerContainer.element;n&&(t.mothership.broadcastOn([vf()],{target:e}),t.uiMothership.broadcastOn([vf()],{target:e})),t.mothership.broadcastOn([Yv],{readonly:n}),t.uiMothership.broadcastOn([Yv],{readonly:n})}function dv(t,n){t.on("init",function(){t.mode.isReadOnly()&&fv(n,!0)}),t.on("SwitchMode",function(){return fv(n,t.mode.isReadOnly())}),t.getParam("readonly",!1,"boolean")&&t.setMode("readonly")}function mv(){var t;return rc.config({channels:((t={})[Yv]={schema:qv,onReceive:function(t,n){dd.set(t,n.readonly)}},t)})}function gv(t,n){var e=t.getApi(n);return function(t){t(e)}}function pv(e,o){return eu(function(t){gv(e,t)(function(t){var n=e.onSetup(t);m(n)&&o.set(n)})})}function hv(n,e){return ou(function(t){return gv(n,t)(e.get())})}function vv(t,n,e,o){var r,i,u=Vo(st);return{type:"item",dom:n.dom,components:Qv(n.optComponents),data:t.data,eventOrder:$v,hasSubmenu:t.triggersSubmenu,itemBehaviours:tc([fm("item-events",[(r=t,i=e,iu(function(t,n){gv(r,t)(r.onAction),r.triggersSubmenu||i!==xh.CLOSE_ON_EXECUTE||(hr(t,Pi()),n.stop())})),pv(t,u),hv(t,u)]),dd.config({disabled:function(){return t.disabled||o.isDisabled()},disableClass:"tox-collection__item--state-disabled"}),mv(),Fg.config({})].concat(t.itemBehaviours))}}function bv(t){return{value:t.value,meta:lt({text:t.text.getOr("")},t.meta)}}function yv(t,n,e){return jm(t,{tag:"div",classes:e=void 0===e?[_h]:e},n)}function xv(t){return{dom:{tag:"div",classes:[Th]},components:[oi(lp.translate(t))]}}function wv(t,n){return{dom:{tag:"div",classes:n,innerHtml:t}}}function Sv(t,n){return{dom:{tag:"div",classes:[Th]},components:[{dom:{tag:t.tag,styles:t.styles},components:[oi(lp.translate(n))]}]}}function Cv(t){return{dom:{tag:"div",classes:["tox-collection__item-accessory"],innerHtml:(e=Zv.mac?{alt:"&#x2325;",ctrl:"&#x2303;",shift:"&#x21E7;",meta:"&#x2318;",access:"&#x2303;&#x2325;"}:{meta:"Ctrl",access:"Shift+Alt"},n=M(t.split("+"),function(t){var n=t.toLowerCase().trim();return Tt(e,n)?e[n]:t}),Zv.mac?n.join(""):n.join("+"))}};var e,n}function kv(t){return yv("checkmark",t,["tox-collection__item-checkmark"])}function Ov(t){var n=t.map(function(t){return{attributes:{title:lp.translate(t)}}}).getOr({});return lt({tag:"div",classes:[wh,Sh]},n)}function _v(t,n,e,o){return void 0===o&&(o=vt.none()),"color"===t.presets?(r=n,i=o,c=t.ariaLabel,s=t.value,{dom:(u=t.iconContent.map(function(t){return n=r.icons,e=i,Nm(t,o=n()).or(e).getOrThunk(Hm(o));var n,e,o}).getOr(""),a={tag:"div",attributes:c.map(function(t){return{title:r.translate(t)}}).getOr({}),classes:["tox-swatch"]},lt(lt({},a),"custom"===s?{tag:"button",classes:H(H([],a.classes,!0),["tox-swatches__picker-btn"],!1),innerHtml:u}:"remove"===s?{classes:H(H([],a.classes,!0),["tox-swatch--remove"],!1),innerHtml:u}:{attributes:lt(lt({},a.attributes),{"data-mce-color":s}),styles:{"background-color":s}})),optComponents:[]}):(l=t,f=n,d=o,m={tag:"div",classes:[_h]},g=e?l.iconContent.map(function(t){return jm(t,m,f.icons,d)}).orThunk(function(){return vt.some({dom:m})}):vt.none(),p=l.checkMark,h=vt.from(l.meta).fold(function(){return xv},function(t){return Tt(t,"style")?S(Sv,t.style):xv}),v=l.htmlContent.fold(function(){return l.textContent.map(h)},function(t){return vt.some(wv(t,[Th]))}),{dom:Ov(l.ariaLabel),optComponents:[g,v,l.shortcutContent.map(Cv),p,l.caret]});var r,i,u,a,c,s,l,f,d,m,g,p,h,v}function Tv(t,n){return tt(t,"tooltipWorker").map(function(e){return[Zh.config({lazySink:n.getSink,tooltipDom:{tag:"div",classes:["tox-tooltip-worker-container"]},tooltipComponents:[],anchor:function(t){return{type:"submenu",item:t,overrides:{maxHeightFunction:Ic}}},mode:"follow-highlight",onShow:function(n,t){e(function(t){Zh.setComponents(n,[ku({element:At.fromDom(t)})])})}})]}).getOr([])}function Ev(t,n){var e=lp.translate(t),o=tv.DOM.encode(e);if(0<n.length){var r=new RegExp(n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"gi");return o.replace(r,function(t){return'<span class="tox-autocompleter-highlight">'+t+"</span>"})}return o}function Dv(t){return{value:t}}function Bv(t){return eb.test(t)||ob.test(t)}function Mv(t){var n=t.toString(16);return(1===n.length?"0"+n:n).toUpperCase()}function Av(t){return Dv(Mv(t.red)+Mv(t.green)+Mv(t.blue))}function Fv(t,n,e,o){return{red:t,green:n,blue:e,alpha:o}}function Iv(t){var n=parseInt(t,10);return n.toString()===t&&0<=n&&n<=255}function Rv(t){var n,e,o,r=(t.hue||0)%360,i=t.saturation/100,u=t.value/100,i=ib(0,rb(i,1)),u=ib(0,rb(u,1));if(0===i)return Fv(n=e=o=ub(255*u),e,o,1);var a=r/60,c=u*i,s=c*(1-Math.abs(a%2-1)),l=u-c;switch(Math.floor(a)){case 0:n=c,e=s,o=0;break;case 1:n=s,e=c,o=0;break;case 2:n=0,e=c,o=s;break;case 3:n=0,e=s,o=c;break;case 4:n=s,e=0,o=c;break;case 5:n=c,e=0,o=s;break;default:n=e=o=0}return Fv(n=ub(255*(n+l)),e=ub(255*(e+l)),o=ub(255*(o+l)),1)}function Vv(t){var n,e,o=(n={value:t.value.replace(eb,function(t,n,e,o){return n+n+e+e+o+o})},null===(e=ob.exec(n.value))?["FFFFFF","FF","FF","FF"]:e);return Fv(parseInt(o[1],16),parseInt(o[2],16),parseInt(o[3],16),1)}function Pv(t,n,e,o){return Fv(parseInt(t,10),parseInt(n,10),parseInt(e,10),parseFloat(o))}function Hv(t){if("transparent"===t)return vt.some(Fv(0,0,0,0));var n=ab.exec(t);if(null!==n)return vt.some(Pv(n[1],n[2],n[3],"1"));var e=cb.exec(t);return null!==e?vt.some(Pv(e[1],e[2],e[3],e[4])):vt.none()}function zv(t){return"rgba("+t.red+","+t.green+","+t.blue+","+t.alpha+")"}function Nv(t,n){return t.fire("ResizeContent",n)}function Lv(t,n,e){return{hue:t,saturation:n,value:e}}function Wv(t){var n,e,o=0,r=t.red/255,i=t.green/255,u=t.blue/255,a=Math.min(r,Math.min(i,u)),c=Math.max(r,Math.max(i,u));return a===c?Lv(0,0,100*(o=a)):(e=60*((r===a?3:u===a?1:5)-(r===a?i-u:u===a?r-i:u-r)/(c-a)),n=(c-a)/c,o=c,Lv(Math.round(e),Math.round(100*n),Math.round(100*o)))}function Uv(t){return Av(Rv(t))}function jv(o){return(Bv(n=o)?vt.some({value:(Dt(t=n,"#")?t.substring("#".length):t).toUpperCase()}):vt.none()).orThunk(function(){return Hv(o).map(Av)}).getOrThunk(function(){var t=document.createElement("canvas");t.height=1,t.width=1;var n=t.getContext("2d");n.clearRect(0,0,t.width,t.height),n.fillStyle="#FFFFFF",n.fillStyle=o,n.fillRect(0,0,1,1);var e=n.getImageData(0,0,1,1).data;return Av(Fv(e[0],e[1],e[2],e[3]))});var t,n}(vh=hh=hh||{}).default="wrap",vh.floating="floating",vh.sliding="sliding",vh.scrolling="scrolling",(yh=bh=bh||{}).auto="auto",yh.top="top",yh.bottom="bottom";function Gv(t){return dd.config({disabled:t,disableClass:"tox-tbtn--disabled"})}var Xv,Yv="silver.readonly",qv=Jo([mo("readonly",nr)]),Kv=function(t){return dd.config({disabled:t})},Jv=function(t){return dd.config({disabled:t,disableClass:"tox-tbtn--disabled",useNative:!1})},$v=((Xv={})[Fi()]=["disabling","alloy.base.behaviour","toggling","item-events"],Xv),Qv=et,Zv=tinymce.util.Tools.resolve("tinymce.Env"),tb=function(t,a){return M(t,function(t){switch(t.type){case"cardcontainer":return r=tb((o=t).items,a),i="vertical"===o.direction?"tox-collection__item-container--column":Mh,u="left"===o.align?"tox-collection__item-container--align-left":"tox-collection__item-container--align-right",{dom:{tag:"div",classes:[Bh,i,u,function(){switch(o.valign){case"top":return"tox-collection__item-container--valign-top";case"middle":return"tox-collection__item-container--valign-middle";case"bottom":return"tox-collection__item-container--valign-bottom"}}()]},components:r};case"cardimage":return e=t.src,{dom:{tag:"img",classes:t.classes,attributes:{src:e,alt:t.alt.getOr("")}}};case"cardtext":var n=t.name.exists(function(t){return wt(a.cardText.highlightOn,t)})?vt.from(a.cardText.matchText).getOr(""):"";return wv(Ev(t.text,n),t.classes)}var e,o,r,i,u})},nb=il(Xg(),Yg()),eb=/^#?([a-f\d])([a-f\d])([a-f\d])$/i,ob=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i,rb=Math.min,ib=Math.max,ub=Math.round,ab=/^rgb\((\d+),\s*(\d+),\s*(\d+)\)/,cb=/^rgba\((\d+),\s*(\d+),\s*(\d+),\s*(\d?(?:\.\d+)?)\)/,sb=Fv(255,0,0,1),lb=tinymce.util.Tools.resolve("tinymce.util.LocalStorage"),fb="tinymce-custom-colors";function db(t){return!1!==t.getParam("custom_colors")}function mb(t){var n=t.getParam("color_map");return void 0!==n?function(t){for(var n=[],e=0;e<t.length;e+=2)n.push({text:t[e+1],value:"#"+jv(t[e]).value,type:"choiceitem"});return n}(n):Eb}function gb(t){Db.add(t)}function pb(t){var n,e=(n=mb(t).length,Math.max(5,Math.ceil(Math.sqrt(n))));return t.getParam("color_cols",e,"number")}function hb(t){var n="choiceitem",e={type:n,text:"Remove color",icon:"color-swatch-remove-color",value:"remove"};return t?[e,{type:n,text:"Custom color",icon:"color-picker",value:"custom"}]:[e]}function vb(n,e,t,o){"custom"===t?Bb(n)(function(t){t.each(function(t){gb(t),n.execCommand("mceApplyTextcolor",e,t),o(t)})},"#000000"):"remove"===t?(o(""),n.execCommand("mceRemoveTextcolor",e)):(o(t),n.execCommand("mceApplyTextcolor",e,t))}function bb(t,n){return t.concat(M(Db.state(),function(t){return{type:Tb,text:t,value:t}}).concat(hb(n)))}function yb(n,e){return function(t){t(bb(n,e))}}function xb(t,n,e){t.setIconFill("forecolor"===n?"tox-icon-text-color__color":"tox-icon-highlight-bg-color__color",e)}function wb(i,e,u,t,o){i.ui.registry.addSplitButton(e,{tooltip:t,presets:"color",icon:"forecolor"===e?"text-color":"highlight-bg-color",select:function(e){var o,r;return vt.from((o=u,i.dom.getParents(i.selection.getStart(),function(t){var n;(n=t.style["forecolor"===o?"color":"background-color"])&&(r=r||n)}),r)).bind(function(t){return Hv(t).map(function(t){var n=Av(t).value;return ut(e.toLowerCase(),n)})}).getOr(!1)},columns:pb(i),fetch:yb(mb(i),db(i)),onAction:function(t){null!==o.get()&&vb(i,u,o.get(),st)},onItemAction:function(t,n){vb(i,u,n,function(t){o.set(t),i.fire("TextColorChange",{name:e,color:t})})},onSetup:function(n){function t(t){t.name===e&&xb(n,t.name,t.color)}return null!==o.get()&&xb(n,e,o.get()),i.on("TextColorChange",t),function(){i.off("TextColorChange",t)}}})}function Sb(n,t,e,o){n.ui.registry.addNestedMenuItem(t,{text:o,icon:"forecolor"===t?"text-color":"highlight-bg-color",getSubmenuItems:function(){return[{type:"fancymenuitem",fancytype:"colorswatch",onAction:function(t){vb(n,e,t.value,st)}}]}})}function Cb(t,n,e,o,r,i,u,a){return rh(t,nh(n),Mb(n,e,o,"color"!==r?"normal":"color",i,u,a),o,r)}function kb(t,n){var e=Jp(n);return 1===t?{mode:"menu",moveOnTab:!0}:"auto"===t?{mode:"grid",selector:"."+e.item,initSize:{numColumns:1,numRows:1}}:{mode:"matrix",rowSelector:"."+("color"===n?"tox-swatches__row":"tox-collection__group")}}var Ob,_b,Tb="choiceitem",Eb=[{type:Tb,text:"Light Green",value:"#BFEDD2"},{type:Tb,text:"Light Yellow",value:"#FBEEB8"},{type:Tb,text:"Light Red",value:"#F8CAC6"},{type:Tb,text:"Light Purple",value:"#ECCAFA"},{type:Tb,text:"Light Blue",value:"#C2E0F4"},{type:Tb,text:"Green",value:"#2DC26B"},{type:Tb,text:"Yellow",value:"#F1C40F"},{type:Tb,text:"Red",value:"#E03E2D"},{type:Tb,text:"Purple",value:"#B96AD9"},{type:Tb,text:"Blue",value:"#3598DB"},{type:Tb,text:"Dark Turquoise",value:"#169179"},{type:Tb,text:"Orange",value:"#E67E23"},{type:Tb,text:"Dark Red",value:"#BA372A"},{type:Tb,text:"Dark Purple",value:"#843FA1"},{type:Tb,text:"Dark Blue",value:"#236FA1"},{type:Tb,text:"Light Gray",value:"#ECF0F1"},{type:Tb,text:"Medium Gray",value:"#CED4D9"},{type:Tb,text:"Gray",value:"#95A5A6"},{type:Tb,text:"Dark Gray",value:"#7E8C8D"},{type:Tb,text:"Navy Blue",value:"#34495E"},{type:Tb,text:"Black",value:"#000000"},{type:Tb,text:"White",value:"#ffffff"}],Db=function(e){void 0===e&&(e=10);function o(t){i.splice(t,1)}var t,n=lb.getItem(fb),r=y(n)?JSON.parse(n):[],i=e-(t=r).length<0?t.slice(0,e):t;return{add:function(t){var n;(-1===(n=p(i,t))?vt.none():vt.some(n)).each(o),i.unshift(t),i.length>e&&i.pop(),lb.setItem(fb,JSON.stringify(i))},state:function(){return i.slice(0)}}}(10),Bb=function(r){return function(e,t){var o=!1;r.windowManager.open({title:"Color Picker",size:"normal",body:{type:"panel",items:[{type:"colorpicker",name:"colorpicker",label:"Color"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{colorpicker:t},onAction:function(t,n){"hex-valid"===n.name&&(o=n.value)},onSubmit:function(t){var n=t.getData().colorpicker;o?(e(vt.from(n)),t.close()):r.windowManager.alert(r.translate(["Invalid hex color code: {0}",n]))},onClose:st,onCancel:function(){e(vt.none())}})}},Mb=function(e,o,r,i,u,a,c){return et(M(e,function(n){return"choiceitem"===n.type?uo("choicemenuitem",Lh,n).fold(eh,function(t){return vt.some(function(n,t,e,o,r,i,u,a){void 0===a&&(a=!0);var c=_v({presets:e,textContent:t?n.text:vt.none(),htmlContent:vt.none(),ariaLabel:n.text,iconContent:n.icon,shortcutContent:t?n.shortcut:vt.none(),checkMark:t?vt.some(kv(u.icons)):vt.none(),caret:vt.none(),value:n.value},u,a);return Xo(vv({data:bv(n),disabled:n.disabled,getApi:function(n){return{setActive:function(t){zg.set(n,t)},isActive:function(){return zg.isOn(n)},isDisabled:function(){return dd.isDisabled(n)},setDisabled:function(t){return dd.set(n,t)}}},onAction:function(t){return o(n.value)},onSetup:function(t){return t.setActive(r),st},triggersSubmenu:!1,itemBehaviours:[]},c,i,u),{toggling:{toggleClass:Oh,toggleOnExecute:!1,selected:n.active}})}(t,1===r,i,o,a(n.value),u,c,nh(e)))}):vt.none()}))},Ab=Fr("cell-over"),Fb=Fr("cell-execute"),Ib={inserttable:function(o){var t=Fr("size-label"),i=function(t){for(var n=[],e=0;e<10;e++){for(var o=[],r=0;r<10;r++)o.push(function(n,e,t){function o(t){return vr(t,Fb,{row:n,col:e})}function r(t,n){n.stop(),o(t)}var i;return _u({dom:{tag:"div",attributes:((i={role:"button"})["aria-labelledby"]=t,i)},behaviours:tc([fm("insert-table-picker-cell",[Cr(hi(),Vg.focus),Cr(Fi(),o),Cr(Ci(),r),Cr(Ri(),r)]),zg.config({toggleClass:"tox-insert-table-picker__selected",toggleOnExecute:!1}),Vg.config({onFocus:function(t){return vr(t,Ab,{row:n,col:e})}})])})}(e,r,t));n.push(o)}return n}(t),u=Pm({dom:{tag:"span",classes:["tox-insert-table-picker__label"],attributes:{id:t}},components:[oi("0x0")],behaviours:tc([Fg.config({})])});return{type:"widget",data:{value:Fr("widget-id")},dom:{tag:"div",classes:["tox-fancymenuitem"]},autofocus:!0,components:[nb.widget({dom:{tag:"div",classes:["tox-insert-table-picker"]},components:z(i,function(t){return M(t,Tu)}).concat(u.asSpec()),behaviours:tc([fm("insert-table-picker",[Tr(Ab,function(t,n,e){var o=e.event.row,r=e.event.col;!function(t,n,e){for(var o=0;o<10;o++)for(var r=0;r<10;r++)zg.set(t[o][r],o<=n&&r<=e)}(i,o,r),Fg.set(u.get(t),[oi(r+1+"x"+(o+1))])}),Tr(Fb,function(t,n,e){o.onAction({numRows:e.event.row+1,numColumns:e.event.col+1}),hr(t,Pi())})]),Mg.config({initSize:{numRows:10,numColumns:10},mode:"flatgrid",selector:'[role="button"]'})])})]}},colorswatch:function(n,t){var e,o,r,i=(o=t,r=(e=n).initData.allowCustomColors&&o.colorinput.hasCustomColors(),e.initData.colors.fold(function(){return bb(o.colorinput.getColors(),r)},function(t){return t.concat(hb(r))})),u=t.colorinput.getColorCols(),a=Cb(Fr("menu-value"),i,function(t){n.onAction({value:t})},u,"color",xh.CLOSE_ON_EXECUTE,O,t.shared.providers),c=lt(lt({},a),{markers:Jp("color"),movement:kb(u,"color")});return{type:"widget",data:{value:Fr("widget-id")},dom:{tag:"div",classes:["tox-fancymenuitem"]},autofocus:!0,components:[nb.widget(Qg.sketch(c))]}}},Rb=function(t){var n=t.text.fold(function(){return{}},function(t){return{innerHtml:t}});return{type:"separator",dom:lt({tag:"div",classes:[Sh,"tox-collection__group-heading"]},n),components:[]}},Vb=function(t,n,e,o){void 0===o&&(o=!0);var r=_v({presets:"normal",iconContent:t.icon,textContent:t.text,htmlContent:vt.none(),ariaLabel:t.text,caret:vt.none(),checkMark:vt.none(),shortcutContent:t.shortcut},e,o);return vv({data:bv(t),getApi:function(n){return{isDisabled:function(){return dd.isDisabled(n)},setDisabled:function(t){return dd.set(n,t)}}},disabled:t.disabled,onAction:t.onAction,onSetup:t.onSetup,triggersSubmenu:!1,itemBehaviours:[]},r,n,e)},Pb=function(t,n,e,o,r){void 0===o&&(o=!0);var i=(r=void 0!==r&&r)?yv("chevron-down",e.icons,[Eh]):yv("chevron-right",e.icons,[Eh]),u=_v({presets:"normal",iconContent:t.icon,textContent:t.text,htmlContent:vt.none(),ariaLabel:t.text,caret:vt.some(i),checkMark:vt.none(),shortcutContent:t.shortcut},e,o);return vv({data:bv(t),getApi:function(n){return{isDisabled:function(){return dd.isDisabled(n)},setDisabled:function(t){return dd.set(n,t)}}},disabled:t.disabled,onAction:st,onSetup:t.onSetup,triggersSubmenu:!0,itemBehaviours:[]},u,n,e)},Hb=function(t,n,e,o){void 0===o&&(o=!0);var r=_v({iconContent:t.icon,textContent:t.text,htmlContent:vt.none(),ariaLabel:t.text,checkMark:vt.some(kv(e.icons)),caret:vt.none(),shortcutContent:t.shortcut,presets:"normal",meta:t.meta},e,o);return Xo(vv({data:bv(t),disabled:t.disabled,getApi:function(n){return{setActive:function(t){zg.set(n,t)},isActive:function(){return zg.isOn(n)},isDisabled:function(){return dd.isDisabled(n)},setDisabled:function(t){return dd.set(n,t)}}},onAction:t.onAction,onSetup:t.onSetup,triggersSubmenu:!1,itemBehaviours:[]},r,n,e),{toggling:{toggleClass:Oh,toggleOnExecute:!1,selected:t.active}})},zb=function(n,e){return tt(Ib,n.fancytype).map(function(t){return t(n,e)})};function Nb(t,u,a,n,c,s,l){var e=1===n,o=!e||nh(t);return et(M(t,function(t){switch(t.type){case"separator":return uo("Autocompleter.Separator",Fp,t).fold(eh,function(t){return vt.some(Rb(t))});case"cardmenuitem":return uo("cardmenuitem",Nh,t).fold(eh,function(n){return vt.some((t=lt(lt({},n),{onAction:function(t){n.onAction(t),a(n.value,n.meta)}}),e=c,o=s,r={itemBehaviours:Tv(n.meta,s),cardText:{matchText:u,highlightOn:l}},i={dom:Ov(t.label),optComponents:[vt.some({dom:{tag:"div",classes:[Bh,Mh]},components:tb(t.items,r)})]},vv({data:bv(lt({text:vt.none()},t)),disabled:t.disabled,getApi:function(e){return{isDisabled:function(){return dd.isDisabled(e)},setDisabled:function(n){dd.set(e,n),St(ps(e.element,"*"),function(t){e.getSystem().getByDom(t).each(function(t){t.hasConfigured(dd)&&dd.set(t,n)})})}}},onAction:t.onAction,onSetup:t.onSetup,triggersSubmenu:!1,itemBehaviours:vt.from(r.itemBehaviours).getOr([])},i,e,o.providers)));var t,e,o,r,i});default:return uo("Autocompleter.Item",Ip,t).fold(eh,function(t){return vt.some(function(n,e,t,o,r,i,u,a){void 0===a&&(a=!0);var c=_v({presets:o,textContent:vt.none(),htmlContent:t?n.text.map(function(t){return Ev(t,e)}):vt.none(),ariaLabel:n.text,iconContent:n.icon,shortcutContent:vt.none(),checkMark:vt.none(),caret:vt.none(),value:n.value},u.providers,a,n.icon);return vv({data:bv(n),disabled:n.disabled,getApi:rt({}),onAction:function(t){return r(n.value,n.meta)},onSetup:rt(st),triggersSubmenu:!1,itemBehaviours:Tv(n.meta,u)},c,i,u.providers)}(t,u,e,"normal",a,c,s,o))})}}))}function Lb(t,n,e,o,r){var i=nh(n),u=et(M(n,function(t){function n(t){return function(t,n,e,o,r){function i(t){return r?lt(lt({},t),{shortcut:vt.none(),icon:t.text.isSome()?vt.none():t.icon}):t}var u=e.shared.providers;switch(t.type){case"menuitem":return uo("menuitem",jh,t).fold(eh,function(t){return vt.some(Vb(i(t),n,u,o))});case"nestedmenuitem":return uo("nestedmenuitem",Gh,t).fold(eh,function(t){return vt.some(Pb(i(t),n,u,o,r))});case"togglemenuitem":return uo("togglemenuitem",Xh,t).fold(eh,function(t){return vt.some(Hb(i(t),n,u,o))});case"separator":return uo("separatormenuitem",Fp,t).fold(eh,function(t){return vt.some(Rb(t))});case"fancymenuitem":return uo("fancymenuitem",Uh,t).fold(eh,function(t){return zb(i(t),e)});default:return console.error("Unknown item in general menu",t),vt.none()}}(t,e,o,r?!Tt(t,"text"):i,r)}return"nestedmenuitem"===t.type&&t.getSubmenuItems().length<=0?n(lt(lt({},t),{disabled:!0})):n(t)}));return(r?oh:rh)(t,i,u,1,"normal")}function Wb(t){return op.singleData(t.value,t)}function Ub(t,n,e){return Iu(t,n,e).isSome()}function jb(e,o){var r=null;return{cancel:function(){null!==r&&(clearTimeout(r),r=null)},schedule:function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];r=setTimeout(function(){e.apply(null,t),r=null},o)}}}function Gb(t){var n=t.raw;return void 0===n.touches||1!==n.touches.length?vt.none():vt.some(n.touches[0])}function Xb(){return se().browser.isFirefox()}function Yb(n,t){var e,o,r,i,u,a,c,s,l,f=lt({stopBackspace:!0},t),d=(u=f,a=dc(),c=Vo(!1),s=jb(function(t){u.triggerEvent(Vi(),t),c.set(!0)},400),l=sr([{key:ci(),value:function(e){return Gb(e).each(function(t){s.cancel();var n={x:t.clientX,y:t.clientY,target:e.target};s.schedule(e),c.set(!1),a.set(n)}),vt.none()}},{key:si(),value:function(t){return s.cancel(),Gb(t).each(function(i){a.on(function(t){var n=i,e=t,o=Math.abs(n.clientX-e.x),r=Math.abs(n.clientY-e.y);(5<o||5<r)&&a.clear()})}),vt.none()}},{key:li(),value:function(n){return s.cancel(),a.get().filter(function(t){return Lt(t.target,n.target)}).map(function(t){return c.get()?(n.prevent(),!1):u.triggerEvent(Ri(),n)})}}]),{fireIfReady:function(n,t){return tt(l,t).bind(function(t){return t(n)})}}),m=M(["touchstart","touchmove","touchend","touchcancel","gesturestart","mousedown","mouseup","mouseover","mousemove","mouseout","click"].concat(["selectstart","input","contextmenu","change","transitionend","transitioncancel","drag","dragstart","dragend","dragenter","dragleave","dragover","drop","keyup"]),function(t){return mc(n,t,function(n){d.fireIfReady(n,t).each(function(t){t&&n.kill()}),f.triggerEvent(t,n)&&n.kill()})}),g=dc(),p=mc(n,"paste",function(n){d.fireIfReady(n,"paste").each(function(t){t&&n.kill()}),f.triggerEvent("paste",n)&&n.kill(),g.set(setTimeout(function(){f.triggerEvent(Mi(),n)},0))}),h=mc(n,"keydown",function(t){var n;f.triggerEvent("keydown",t)?t.kill():!f.stopBackspace||(n=t).raw.which!==pd[0]||wt(["input","textarea"],Ft(n.target))||Ub(n.target,'[contenteditable="true"]')||t.prevent()}),v=(e=n,o=function(t){f.triggerEvent("focusin",t)&&t.kill()},Xb()?gc(e,"focus",o):mc(e,"focusin",o)),b=dc(),y=(r=n,i=function(t){f.triggerEvent("focusout",t)&&t.kill(),b.set(setTimeout(function(){f.triggerEvent(Bi(),t)},0))},Xb()?gc(r,"blur",i):mc(r,"focusout",i));return{unbind:function(){St(m,function(t){t.unbind()}),h.unbind(),v.unbind(),y.unbind(),p.unbind(),g.on(clearTimeout),b.on(clearTimeout)}}}function qb(t,n){return Vo(tt(t,"target").getOr(n))}function Kb(t,o,n,e,r,i){var u,a,c=t(o,e),s=(u=Vo(!1),a=Vo(!1),{stop:function(){u.set(!0)},cut:function(){a.set(!0)},isStopped:u.get,isCut:a.get,event:n,setSource:r.set,getSource:r.get});return c.fold(function(){return i.logEventNoHandlers(o,e),oy.complete()},function(n){var e=n.descHandler;return Lr(e)(s),s.isStopped()?(i.logEventStopped(o,n.element,e.purpose),oy.stopped()):s.isCut()?(i.logEventCut(o,n.element,e.purpose),oy.complete()):Yt(n.element).fold(function(){return i.logNoParent(o,n.element,e.purpose),oy.complete()},function(t){return i.logEventResponse(o,n.element,e.purpose),oy.resume(t)})})}function Jb(){function r(t){Ir(t.element).each(function(t){delete a[t],i.unregisterId(t)})}var u,i=(u={},{registerId:function(r,i,t){J(t,function(t,n){var e,o=void 0!==u[n]?u[n]:{};o[i]={cHandler:S.apply(void 0,[(e=t).handler].concat(r)),purpose:e.purpose},u[n]=o})},unregisterId:function(e){J(u,function(t,n){Tt(t,e)&&delete t[e]})},filterByType:function(t){return tt(u,t).map(function(t){return $(t,function(t,n){return{id:n,descHandler:t}})}).getOr([])},find:function(t,n,e){return tt(u,n).bind(function(o){return dr(e,function(t){return n=o,Ir(e=t).bind(function(t){return tt(n,t)}).map(function(t){return{element:e,descHandler:t}});var n,e},t)})}}),a={};return{find:function(t,n,e){return i.find(t,n,e)},filter:function(t){return i.filterByType(t)},register:function(t){var e,o=Ir((e=t).element).getOrThunk(function(){return t=e.element,n=Fr(fu+"uid-"),mu(t,n),n;var t,n});nt(a,o)&&function(t){var n=a[o];if(n!==t)throw new Error('The tagId "'+o+'" is already used by: '+Ar(n.element)+"\nCannot use it for: "+Ar(t.element)+"\nThe conflicting element is"+(he(n.element)?" ":" not ")+"already in the DOM");r(t)}(t),i.registerId([t],o,t.events),a[o]=t},unregister:r,getById:function(t){return tt(a,t)}}}function $b(e){function o(n){return Yt(e.element).fold(_,function(t){return Lt(n,t)})}function s(t,n){return i.find(o,t,n)}function r(n){var t=i.filter(Ai());St(t,function(t){Lr(t.descHandler)(n)})}var i=Jb(),t=Yb(e.element,{triggerEvent:function(n,e){return Nu(n,e.target,function(t){return iy(s,n,e,e.target,t)})}}),u={debugInfo:rt("real"),triggerEvent:function(n,e,o){Nu(n,e,function(t){return iy(s,n,o,e,t)})},triggerFocus:function(a,c){Ir(a).fold(function(){Sa(a)},function(t){Nu(Di(),a,function(t){var n,e,o=s,r=Di(),i=t,u=qb(n={originator:c,kill:st,prevent:st,target:a},e=a);return Kb(o,r,n,e,u,i),!1})})},triggerEscape:function(t,n){u.triggerEvent("keydown",t.element,n.event)},getByUid:function(t){return g(t)},getByDom:function(t){return p(t)},build:_u,addToGui:function(t){c(t)},removeFromGui:function(t){l(t)},addToWorld:function(t){n(t)},removeFromWorld:function(t){a(t)},broadcast:function(t){f(t)},broadcastOn:function(t,n){d(t,n)},broadcastEvent:function(t,n){m(t,n)},isConnected:_},n=function(t){t.connect(u),Xn(t.element)||(i.register(t),St(t.components(),n),u.triggerEvent(zi(),t.element,{target:t.element}))},a=function(t){Xn(t.element)||(St(t.components(),a),i.unregister(t)),t.disconnect()},c=function(t){Is(e,t)},l=function(t){Vs(t)},f=function(t){r({universal:!0,data:t})},d=function(t,n){r({universal:!1,channels:t,data:n})},m=function(t,n){var e,o,r=i.filter(t);return o={stop:function(){e.set(!0)},cut:st,isStopped:(e=Vo(!1)).get,isCut:O,event:n,setSource:k("Cannot set source of a broadcasted event"),getSource:k("Cannot get source of a broadcasted event")},St(r,function(t){Lr(t.descHandler)(o)}),o.isStopped()},g=function(t){return i.getById(t).fold(function(){return Re.error(new Error('Could not find component with uid: "'+t+'" in system.'))},Re.value)},p=function(t){var n=Ir(t).getOr("not found");return g(n)};return n(e),{root:e,element:e.element,destroy:function(){t.unbind(),Te(e.element)},add:c,remove:l,getByUid:g,getByDom:p,addToWorld:n,removeFromWorld:a,broadcast:f,broadcastOn:d,broadcastEvent:m}}function Qb(t,n,e,o){var r=my(t,n,e,o);return sy.sketch(r)}function Zb(t,n){return sy.parts.label({dom:{tag:"label",classes:["tox-label"],innerHtml:n.translate(t)}})}function ty(t){return tc([Vg.config({onFocus:t.selectOnFocus?function(t){var n=t.element,e=$r(n);n.dom.setSelectionRange(0,e.length)}:st})])}function ny(t){return{tag:t.tag,attributes:lt({type:"text"},t.inputAttributes),styles:t.inputStyles,classes:t.inputClasses}}(_b=Ob={})[_b.ContentFocus=0]="ContentFocus",_b[_b.UiFocus=1]="UiFocus";function ey(f,c){function e(){return r.get().isSome()}function s(){e()&&rp.hide(d)}var o,t,r=dc(),l=Vo(!1),d=_u(rp.sketch({dom:{tag:"div",classes:["tox-autocompleter"]},components:[],fireDismissalEventInstead:{},inlineBehaviours:tc([fm("dismissAutocompleter",[Cr(Xi(),function(){return m()})])]),lazySink:c.getSink})),m=function(){var t;e()&&(t=r.get().map(function(t){return t.element}),Dp(t.getOr(At.fromDom(f.selection.getNode()))).each(Fn),s(),r.clear(),l.set(!1))},u=Rt(function(){return e=dt(f.ui.registry.getAll().popups,function(t){return uo("Autocompleter",Rp,t).fold(function(t){throw new Error(ir(t))},h)}),t=$(e,function(t){return t.ch}),n={},St(t,function(t){n[t]={}}),o=kt(n),r=Z(e),{dataset:e,triggerChars:o,lookupByChar:function(n){return F(r,function(t){return t.ch===n})}};var t,n,e,o,r}),g=function(t){var n=t;r.get().map(function(t){return wp(f.dom,f.selection.getRng(),t.triggerChar).bind(function(t){return Op(f,u,t,n)})}).getOrThunk(function(){return n=f,t=(e=u)(),o=n.selection.getRng(),r=n.dom,i=o,K(t.triggerChars,function(t){return wp(r,i,t)}).bind(function(t){return Op(n,e,t)});var n,e,t,o,r,i}).fold(m,function(a){var t,n=a.context;e()||(t=vp(f,n.range),r.set({triggerChar:n.triggerChar,element:t,matchLength:n.text.length}),l.set(!1)),a.lookupData.then(function(u){r.get().map(function(t){var n,e,o,r,i=a.context;t.triggerChar===i.triggerChar&&(e=i.triggerChar,r=K(o=u,function(t){return vt.from(t.columns)}).getOr(1),0<(n=z(o,function(i){return Nb(i.items,i.matchText,function(o,r){var t=f.selection.getRng();wp(f.dom,t,e).fold(function(){return console.error("Lost context. Cursor probably moved")},function(t){var n=t.range,e={hide:function(){m()},reload:function(t){s(),g(t)}};l.set(!0),i.onAction(e,n,o,r),l.set(!1)})},r,xh.BUBBLE_TO_SANDBOX,c,i.highlightOn)})).length?function(t,n,e,o){t.matchLength=n.text.length;var r,i,u,a,c,s,l=K(e,function(t){return vt.from(t.columns)}).getOr(1);rp.showAt(d,Qg.sketch((r=rh("autocompleter-value",!0,o,l,"normal"),i=l,a=((u=Ob.ContentFocus)===Ob.ContentFocus?Ll:Nl)(),c=kb(i,"normal"),s=Jp("normal"),{dom:r.dom,components:r.components,items:r.items,value:r.value,markers:{selectedItem:s.selectedItem,item:s.item},movement:c,fakeFocus:u===Ob.ContentFocus,focusManager:a,menuBehaviours:Yh("auto"!==i?[]:[eu(function(o,t){ih(o,4,s.item).each(function(t){var n=t.numColumns,e=t.numRows;Mg.setGridSize(o,e,n)})})])})),{anchor:{type:"node",root:At.fromDom(f.getBody()),node:vt.from(t.element)}}),rp.getContent(d).each(gd.highlightFirst)}(t,i,u,n):(10<=i.text.length-t.matchLength?m:s)())})})})},n={onKeypress:pp(function(t){27!==t.which&&g()},50),cancelIfNecessary:m,isMenuOpen:function(){return rp.isOpen(d)},isActive:e,isProcessingAction:l.get,getView:function(){return rp.getContent(d)}};function i(t,n){vr(t,yi(),{raw:n})}!1===f.hasPlugin("rtc")&&(o=n,(t=f).on("keypress compositionend",o.onKeypress.throttle),t.on("remove",o.onKeypress.cancel),t.on("keydown",function(n){function t(){return o.getView().bind(gd.getHighlighted)}8===n.which&&o.onKeypress.throttle(n),o.isActive()&&(27===n.which&&o.cancelIfNecessary(),o.isMenuOpen()?13===n.which?(t().each(br),n.preventDefault()):40===n.which?(t().fold(function(){o.getView().each(gd.highlightFirst)},function(t){i(t,n)}),n.preventDefault(),n.stopImmediatePropagation()):37!==n.which&&38!==n.which&&39!==n.which||t().each(function(t){i(t,n),n.preventDefault(),n.stopImmediatePropagation()}):13!==n.which&&38!==n.which&&40!==n.which||o.cancelIfNecessary())}),t.on("NodeChange",function(t){o.isActive()&&!o.isProcessingAction()&&Dp(At.fromDom(t.element)).isNone()&&o.cancelIfNecessary()}))}var oy=Po([{stopped:[]},{resume:["element"]},{complete:[]}]),ry=function(n,e,o,t,r,i){return Kb(n,e,o,t,r,i).fold(_,function(t){return ry(n,e,o,t,r,i)},O)},iy=function(t,n,e,o,r){var i=qb(e,o);return ry(t,n,e,o,i,r)},uy=wl({name:"Container",factory:function(t){var n=t.dom,e=n.attributes,o=s(n,["attributes"]);return{uid:t.uid,dom:lt({tag:"div",attributes:lt({role:"presentation"},e)},o),components:t.components,behaviours:Qs(t.containerBehaviours),events:t.events,domModification:t.domModification,eventOrder:t.eventOrder}},configFields:[To("components",[]),$s("containerBehaviours",[]),To("events",{}),To("domModification",{}),To("eventOrder",{})]}),ay=rt([To("prefix","form-field"),$s("fieldBehaviours",[ud,Tf])]),cy=rt([Jf({schema:[fo("dom")],name:"label"}),Jf({factory:{sketch:function(t){return{uid:t.uid,dom:{tag:"span",styles:{display:"none"},attributes:{"aria-hidden":"true"},innerHtml:t.text}}}},schema:[fo("text")],name:"aria-descriptor"}),qf({factory:{sketch:function(t){var e,o,n=(e=["factory"],o={},J(t,function(t,n){wt(e,n)||(o[n]=t)}),o);return t.factory.sketch(n)}},schema:[fo("factory")],name:"field"})]),sy=Sl({name:"FormField",configFields:ay(),partFields:cy(),factory:function(r,t,n,e){var o=Zs(r.fieldBehaviours,[ud.config({find:function(t){return fl(t,r,"field")}}),Tf.config({store:{mode:"manual",getValue:function(t){return ud.getCurrent(t).bind(Tf.getValue)},setValue:function(t,n){ud.getCurrent(t).each(function(t){Tf.setValue(t,n)})}}})]),i=nu([eu(function(t,n){var o=ml(t,r,["label","field","aria-descriptor"]);o.field().each(function(e){var n=Fr(r.prefix);o.label().each(function(t){on(t.element,"for",n),on(e.element,"id",n)}),o["aria-descriptor"]().each(function(t){var n=Fr(r.prefix);on(t.element,"id",n),on(e.element,"aria-describedby",n)})})})]);return{uid:r.uid,dom:r.dom,components:t,behaviours:o,events:i,apis:{getField:function(t){return fl(t,r,"field")},getLabel:function(t){return fl(t,r,"label")}}}},apis:{getField:function(t,n){return t.getField(n)},getLabel:function(t,n){return t.getLabel(n)}}}),ly=Object.freeze({__proto__:null,exhibit:function(t,n){return Nr({attributes:sr([{key:n.tabAttr,value:"true"}])})}}),fy=ya({fields:[To("tabAttr","data-alloy-tabstop")],name:"tabstopping",active:ly}),dy=tinymce.util.Tools.resolve("tinymce.html.Entities"),my=function(t,n,e,o){return{dom:gy(e),components:t.toArray().concat([n]),fieldBehaviours:tc(o)}},gy=function(t){return{tag:"div",classes:["tox-form__group"].concat(t)}},py=Fr("form-component-change"),hy=Fr("form-close"),vy=Fr("form-cancel"),by=Fr("form-action"),yy=Fr("form-submit"),xy=Fr("form-block"),wy=Fr("form-unblock"),Sy=Fr("form-tabchange"),Cy=Fr("form-resize"),ky=rt([xo("data"),To("inputAttributes",{}),To("inputStyles",{}),To("tag","input"),To("inputClasses",[]),Ku("onSetValue"),To("styles",{}),To("eventOrder",{}),$s("inputBehaviours",[Tf,Vg]),To("selectOnFocus",!0)]),Oy=wl({name:"Input",configFields:ky(),factory:function(t,n){return{uid:t.uid,dom:ny(t),components:[],behaviours:lt(lt({},ty(e=t)),Zs(e.inputBehaviours,[Tf.config({store:lt(lt({mode:"manual"},e.data.map(function(t){return{initialValue:t}}).getOr({})),{getValue:function(t){return $r(t.element)},setValue:function(t,n){$r(t.element)!==n&&Qr(t.element,n)}}),onSetValue:e.onSetValue})])),eventOrder:t.eventOrder};var e}}),_y={},Ty={exports:_y};function Ey(t){setTimeout(function(){throw t},0)}function Dy(t){var n=Ft(t);return wt(Wy,n)}function By(t,n){Yr(n.getRoot(t).getOr(t.element),n.invalidClass),n.notify.each(function(n){Dy(t.element)&&on(t.element,"aria-invalid",!1),n.getContainer(t).each(function(t){Mr(t,n.validHtml)}),n.onValid(t)})}function My(n,t,e,o){Xr(t.getRoot(n).getOr(n.element),t.invalidClass),t.notify.each(function(t){Dy(n.element)&&on(n.element,"aria-invalid",!0),t.getContainer(n).each(function(t){Mr(t,o)}),t.onInvalid(n,o)})}function Ay(n,t,e){return t.validator.fold(function(){return Ly(Re.value(!0))},function(t){return t.validate(n)})}function Fy(n,e,t){return e.notify.each(function(t){t.onValidate(n)}),Ay(n,e).map(function(t){return n.getSystem().isConnected()?t.fold(function(t){return My(n,e,0,t),Re.error(t)},function(t){return By(n,e),Re.value(t)}):Re.error("No longer in system")})}!function(){var t=this,n=function(){var t,n,e,o={exports:{}};function r(){}function i(t){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof t)throw new TypeError("not a function");this._state=0,this._handled=!1,this._value=void 0,this._deferreds=[],f(t,this)}function u(e,o){for(;3===e._state;)e=e._value;0!==e._state?(e._handled=!0,i._immediateFn(function(){var t,n=1===e._state?o.onFulfilled:o.onRejected;if(null!==n){try{t=n(e._value)}catch(t){return void c(o.promise,t)}a(o.promise,t)}else(1===e._state?a:c)(o.promise,e._value)})):e._deferreds.push(o)}function a(n,t){try{if(t===n)throw new TypeError("A promise cannot be resolved with itself.");if(t&&("object"==typeof t||"function"==typeof t)){var e=t.then;if(t instanceof i)return n._state=3,n._value=t,void s(n);if("function"==typeof e)return void f((o=e,r=t,function(){o.apply(r,arguments)}),n)}n._state=1,n._value=t,s(n)}catch(t){c(n,t)}var o,r}function c(t,n){t._state=2,t._value=n,s(t)}function s(t){2===t._state&&0===t._deferreds.length&&i._immediateFn(function(){t._handled||i._unhandledRejectionFn(t._value)});for(var n=0,e=t._deferreds.length;n<e;n++)u(t,t._deferreds[n]);t._deferreds=null}function l(t,n,e){this.onFulfilled="function"==typeof t?t:null,this.onRejected="function"==typeof n?n:null,this.promise=e}function f(t,n){var e=!1;try{t(function(t){e||(e=!0,a(n,t))},function(t){e||(e=!0,c(n,t))})}catch(t){if(e)return;e=!0,c(n,t)}}t=o,n="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},e=setTimeout,i.prototype.catch=function(t){return this.then(null,t)},i.prototype.then=function(t,n){var e=new this.constructor(r);return u(this,new l(t,n,e)),e},i.all=function(t){var a=Array.prototype.slice.call(t);return new i(function(r,i){if(0===a.length)return r([]);for(var u=a.length,t=0;t<a.length;t++)!function n(e,t){try{if(t&&("object"==typeof t||"function"==typeof t)){var o=t.then;if("function"==typeof o)return o.call(t,function(t){n(e,t)},i),0}a[e]=t,0==--u&&r(a)}catch(t){i(t)}}(t,a[t])})},i.resolve=function(n){return n&&"object"==typeof n&&n.constructor===i?n:new i(function(t){t(n)})},i.reject=function(e){return new i(function(t,n){n(e)})},i.race=function(r){return new i(function(t,n){for(var e=0,o=r.length;e<o;e++)r[e].then(t,n)})},i._immediateFn="function"==typeof setImmediate?function(t){setImmediate(t)}:function(t){e(t,0)},i._unhandledRejectionFn=function(t){"undefined"!=typeof console&&console&&console.warn("Possible Unhandled Promise Rejection:",t)},i._setImmediateFn=function(t){i._immediateFn=t},i._setUnhandledRejectionFn=function(t){i._unhandledRejectionFn=t},t.exports?t.exports=i:n.Promise||(n.Promise=i);var d=o.exports;return{boltExport:("undefined"!=typeof window?window:Function("return this;")()).Promise||d}};"object"==typeof _y&&void 0!==Ty?Ty.exports=n():(t="undefined"!=typeof globalThis?globalThis:t||self).EphoxContactWrapper=n()}();var Iy,Ry,Vy=Ty.exports.boltExport,Py=function(t){function o(t){r()?i(t):n.push(t)}var e=vt.none(),n=[],r=function(){return e.isSome()},i=function(n){e.each(function(t){setTimeout(function(){n(t)},0)})};return t(function(t){r()||(e=vt.some(t),St(n,i),n=[])}),{get:o,map:function(e){return Py(function(n){o(function(t){n(e(t))})})},isReady:r}},Hy={nu:Py,pure:function(n){return Py(function(t){t(n)})}},zy=function(e){function t(t){e().then(t,Ey)}return{map:function(t){return zy(function(){return e().then(t)})},bind:function(n){return zy(function(){return e().then(function(t){return n(t).toPromise()})})},anonBind:function(t){return zy(function(){return e().then(function(){return t.toPromise()})})},toLazy:function(){return Hy.nu(t)},toCached:function(){var t=null;return zy(function(){return t=null===t?e():t})},toPromise:e,get:t}},Ny=function(t){return zy(function(){return new Vy(t)})},Ly=function(t){return zy(function(){return Vy.resolve(t)})},Wy=["input","textarea"],Uy=Object.freeze({__proto__:null,markValid:By,markInvalid:My,query:Ay,run:Fy,isInvalid:function(t,n){return qr(n.getRoot(t).getOr(t.element),n.invalidClass)}}),jy=Object.freeze({__proto__:null,events:function(n,t){return n.validator.map(function(t){return nu([Cr(t.onEvent,function(t){Fy(t,n).get(h)})].concat(t.validateOnLoad?[eu(function(t){Fy(t,n).get(st)})]:[]))}).getOr({})}}),Gy=ya({fields:[fo("invalidClass"),To("getRoot",vt.none),_o("notify",[To("aria","alert"),To("getContainer",vt.none),To("validHtml",""),Ku("onValid"),Ku("onInvalid"),Ku("onValidate")]),_o("validator",[fo("validate"),To("onEvent","input"),To("validateOnLoad",!0)])],name:"invalidating",active:jy,apis:Uy,extra:{validation:function(e){return function(t){var n=Tf.getValue(t);return Ly(e(n))}}}}),Xy=Object.freeze({__proto__:null,getCoupled:function(t,n,e,o){return e.getOrCreate(t,n,o)}}),Yy=ya({fields:[mo("others",io(Re.value,Qo()))],name:"coupling",apis:Xy,state:Object.freeze({__proto__:null,init:function(){var i={},t=rt({});return xu({readState:t,getOrCreate:function(e,o,r){var t=kt(o.others);if(t)return tt(i,r).getOrThunk(function(){var t=tt(o.others,r).getOrDie("No information found for coupled component: "+r)(e),n=e.getSystem().build(t);return i[r]=n});throw new Error("Cannot find coupled component: "+r+". Known coupled components: "+JSON.stringify(t,null,2))}})}})}),qy=rt("sink"),Ky=rt(Jf({name:qy(),overrides:rt({dom:{tag:"div"},behaviours:tc([sf.config({useFixed:_})]),events:nu([Er(yi()),Er(di()),Er(Ci())])})}));function Jy(t,n){var e=t.getHotspot(n).getOr(n),o=t.getAnchorOverrides();return t.layouts.fold(function(){return{type:"hotspot",hotspot:e,overrides:o}},function(t){return{type:"hotspot",hotspot:e,overrides:o,layouts:t}})}function $y(t,n,e,o,r,i,u){var a,c=Jy(t,e),s=e,l=o,f=r,d=u,m=n,g=(0,(a=t).fetch)(s).map(m),p=sw(s,a);return g.map(function(t){return t.bind(function(t){return vt.from(op.sketch(lt(lt({},f.menu()),{uid:gu(""),data:t,highlightImmediately:d===Iy.HighlightFirst,onOpenMenu:function(t,n){var e=p().getOrDie();sf.position(e,n,{anchor:c}),hf.decloak(l)},onOpenSubmenu:function(t,n,e){var o=p().getOrDie();sf.position(o,e,{anchor:{type:"submenu",item:n}}),hf.decloak(l)},onRepositionMenu:function(t,n,e){var o=p().getOrDie();sf.position(o,n,{anchor:c}),St(e,function(t){sf.position(o,t.triggeredMenu,{anchor:{type:"submenu",item:t.triggeringItem}})})},onEscape:function(){return Vg.focus(s),hf.close(l),vt.some(!0)}})))})}).map(function(t){return t.fold(function(){hf.isOpen(o)&&hf.close(o)},function(t){hf.cloak(o),hf.open(o,t),i(o)}),o})}function Qy(t,n,e,o,r,i){var u=Yy.getCoupled(e,"sandbox");return(hf.isOpen(u)?function(t,n,e,o,r,i,u){return hf.close(o),Ly(o)}:$y)(t,n,e,u,o,r,i)}function Zy(t){hf.getState(t).each(function(t){op.repositionMenus(t)})}function tx(s,l,f){var d=Ru(),t=sw(l,s);return{dom:{tag:"div",classes:s.sandboxClasses,attributes:{id:d.id,role:"listbox"}},behaviours:Df(s.sandboxBehaviours,[Tf.config({store:{mode:"memory",initialValue:l}}),hf.config({onOpen:function(t,n){var e,o,r,i,u,a,c=Jy(s,l);d.link(l.element),s.matchWidth&&(e=c.hotspot,o=n,r=s.useMinWidth,u=ud.getCurrent(o).getOr(o),a=kn(e.element),r?fn(u.element,"min-width",a+"px"):(i=u.element,ke.set(i,a))),s.onOpen(c,t,n),void 0!==f&&void 0!==f.onOpen&&f.onOpen(t,n)},onClose:function(t,n){d.unlink(l.element),void 0!==f&&void 0!==f.onClose&&f.onClose(t,n)},isPartOf:function(t,n,e){return Hu(n,e)||Hu(l,e)},getAttachPoint:function(){return t().getOrDie()}}),ud.config({find:function(t){return hf.getState(t).bind(function(t){return ud.getCurrent(t)})}}),rc.config({channels:lt(lt({},js({isExtraPart:O})),Gs({doReposition:Zy}))})])}}function nx(t){Zy(Yy.getCoupled(t,"sandbox"))}function ex(){return[To("sandboxClasses",[]),Ef("sandboxBehaviours",[ud,rc,hf,Tf])]}function ox(n){return Jf({name:n+"-edge",overrides:function(t){return t.model.manager.edgeActions[n].fold(function(){return{}},function(o){return{events:nu([kr(ci(),function(t,n,e){return o(t,e)},[t]),kr(di(),function(t,n,e){return o(t,e)},[t]),kr(mi(),function(t,n,e){e.mouseIsDown.get()&&o(t,e)},[t])])}})}})}function rx(t){var n=t.event.raw;return-1===n.type.indexOf("touch")?void 0!==n.clientX?vt.some(n).map(function(t){return Se(t.clientX,t.clientY)}):vt.none():void 0!==n.touches&&1===n.touches.length?vt.some(n.touches[0]).map(function(t){return Se(t.clientX,t.clientY)}):vt.none()}function ix(t){return t.model.minX}function ux(t){return t.model.minY}function ax(t){return t.model.minX-1}function cx(t){return t.model.minY-1}function sx(t){return t.model.maxX}function lx(t){return t.model.maxY}function fx(t){return t.model.maxX+1}function dx(t){return t.model.maxY+1}function mx(t,n,e){return n(t)-e(t)}function gx(t){return mx(t,sx,ix)}function px(t){return mx(t,lx,ux)}function hx(t){return gx(t)/2}function vx(t){return px(t)/2}function bx(t){return t.stepSize}function yx(t){return t.snapToGrid}function xx(t){return t.snapStart}function wx(t){return t.rounded}function Sx(t,n){return void 0!==t[n+"-edge"]}function Cx(t){return Sx(t,"left")}function kx(t){return Sx(t,"right")}function Ox(t){return Sx(t,"top")}function _x(t){return Sx(t,"bottom")}function Tx(t){return t.model.value.get()}function Ex(t,n){return{x:t,y:n}}function Dx(t,n){vr(t,_w(),{value:n})}function Bx(t,n,e,o){return t<n?t:e<t?e:t===n?n-1:Math.max(n,t-o)}function Mx(t,n,e,o){return e<t?t:t<n?n:t===e?e+1:Math.min(e,t+o)}function Ax(t,n,e){return Math.max(n,Math.min(e,t))}function Fx(t){var n=t.min,e=t.max,o=t.range,r=t.value,i=t.step,u=t.snap,a=t.snapStart,c=t.rounded,s=t.hasMinEdge,l=t.hasMaxEdge,f=t.minBound,d=t.maxBound,m=t.screenRange,g=s?n-1:n,p=l?e+1:e;if(r<f)return g;if(d<r)return p;var h,v,b,y,x,w=Ax((x=f,Math.min(d,Math.max(r,x))-x)/m*o+n,g,p);return u&&n<=w&&w<=e?(h=w,v=n,b=e,y=i,a.fold(function(){var t=Math.round((h-v)/y)*y;return Ax(v+t,v-1,b+1)},function(t){var n=Math.round((h-t)%y/y),e=Math.floor((h-t)/y),o=Math.floor((b-t)/y),r=Math.min(o,e+n);return Math.max(t,t+r*y)})):c?Math.round(w):w}function Ix(t){var n=t.min,e=t.max,o=t.range,r=t.value,i=t.hasMinEdge,u=t.hasMaxEdge,a=t.maxBound,c=t.maxOffset,s=t.centerMinEdge,l=t.centerMaxEdge;return r<n?i?0:s:e<r?u?a:l:(r-n)/o*c}function Rx(t){return t.element.dom.getBoundingClientRect()}function Vx(t){return Rx(t)[Tw]}function Px(t){return Rx(t).right}function Hx(t){return Rx(t).top}function zx(t){return Rx(t).bottom}function Nx(t){return Rx(t).width}function Lx(t){return Rx(t).height}function Wx(t,n){var e=Rx(t),o=Rx(n);return(e[Tw]+e.right)/2-o[Tw]}function Ux(t,n){var e=Rx(t),o=Rx(n);return(e.top+e.bottom)/2-o.top}function jx(t,n){vr(t,_w(),{value:n})}function Gx(t,n,e){return Fx({min:ix(n),max:sx(n),range:gx(n),value:e,step:bx(n),snap:yx(n),snapStart:xx(n),rounded:wx(n),hasMinEdge:Cx(n),hasMaxEdge:kx(n),minBound:Vx(t),maxBound:Px(t),screenRange:Nx(t)})}function Xx(r){return function(t,n){return jx(t,{x:o=(0<r?Mx:Bx)(Tx(e=n).x,ix(e),sx(e),bx(e))}),vt.some(o).map(_);var e,o}}function Yx(t,n,e,o,r,i){var u,a,c,s,l,f,d,m,g=(a=i,c=e,s=o,l=r,f=Nx(u=n),d=s.bind(function(t){return vt.some(Wx(t,u))}).getOr(0),m=l.bind(function(t){return vt.some(Wx(t,u))}).getOr(f),Ix({min:ix(a),max:sx(a),range:gx(a),value:c,hasMinEdge:Cx(a),hasMaxEdge:kx(a),minBound:Vx(u),minOffset:0,maxBound:Px(u),maxOffset:f,centerMinEdge:d,centerMaxEdge:m}));return Vx(n)-Vx(t)+g}function qx(t,n){vr(t,_w(),{value:n})}function Kx(t,n,e){return Fx({min:ux(n),max:lx(n),range:px(n),value:e,step:bx(n),snap:yx(n),snapStart:xx(n),rounded:wx(n),hasMinEdge:Ox(n),hasMaxEdge:_x(n),minBound:Hx(t),maxBound:zx(t),screenRange:Lx(t)})}function Jx(r){return function(t,n){return qx(t,{y:o=(0<r?Mx:Bx)(Tx(e=n).y,ux(e),lx(e),bx(e))}),vt.some(o).map(_);var e,o}}function $x(t,n,e,o,r,i){var u,a,c,s,l,f,d,m,g=(a=i,c=e,s=o,l=r,f=Lx(u=n),d=s.bind(function(t){return vt.some(Ux(t,u))}).getOr(0),m=l.bind(function(t){return vt.some(Ux(t,u))}).getOr(f),Ix({min:ux(a),max:lx(a),range:px(a),value:c,hasMinEdge:Ox(a),hasMaxEdge:_x(a),minBound:Hx(u),minOffset:0,maxBound:zx(u),maxOffset:f,centerMinEdge:d,centerMaxEdge:m}));return Hx(n)-Hx(t)+g}function Qx(t,n){vr(t,_w(),{value:n})}function Zx(t,n){return{x:t,y:n}}function t0(u,a){return function(t,n){return o=n,r=0<u?Mx:Bx,Qx(t,Zx(i=(e=a)?Tx(o).x:r(Tx(o).x,ix(o),sx(o),bx(o)),e?r(Tx(o).y,ux(o),lx(o),bx(o)):Tx(o).y)),vt.some(i).map(_);var e,o,r,i}}function n0(t){return"<alloy.field."+t+">"}function e0(f,d,m,g){function p(t,n,e,o,r){var i,u,a=f(eS+"range"),c=[sy.parts.label({dom:{tag:"label",innerHtml:e,attributes:{"aria-label":o}}}),sy.parts.field({data:r,factory:Oy,inputAttributes:lt({type:"text"},"hex"===n?{"aria-live":"polite"}:{}),inputClasses:[d("textfield")],inputBehaviours:tc([(i=n,u=t,Gy.config({invalidClass:d("invalid"),notify:{onValidate:function(t){vr(t,nS,{type:i})},onValid:function(t){vr(t,Zw,{type:i,value:Tf.getValue(t)})},onInvalid:function(t){vr(t,tS,{type:i,value:Tf.getValue(t)})}},validator:{validate:function(t){var n=Tf.getValue(t),e=u(n)?Re.value(!0):Re.error(f("aria.input.invalid"));return Ly(e)},validateOnLoad:!1}})),fy.config({})]),onSetValue:function(t){Gy.isInvalid(t)&&Gy.run(t).get(st)}})],s="hex"!==n?[sy.parts["aria-descriptor"]({text:a})]:[];return{dom:{tag:"div",attributes:{role:"presentation"}},components:c.concat(s)}}function h(t,n){var e=n.red,o=n.green,r=n.blue;Tf.setValue(t,{red:e,green:o,blue:r})}function v(t,n){b.getOpt(t).each(function(t){fn(t.element,"background-color","#"+n.value)})}var b=Pm({dom:{tag:"div",classes:[d("rgba-preview")],styles:{"background-color":"white"},attributes:{role:"presentation"}}});return wl({factory:function(){function a(t){return o[t].get()}function c(t,n){o[t].set(n)}function n(t,n){var e=n.event;"hex"!==e.type?c(e.type,vt.none()):g(t)}function e(t,n){var r,e,o,i,u=n.event;"hex"===u.type?function(t,n){m(t);var e=Dv(n);c("hex",vt.some(n));var o=Vv(e);h(t,o),s(o),vr(t,qw,{hex:e}),v(t,e)}(t,u.value):(r=t,e=u.type,o=u.value,i=parseInt(o,10),c(e,vt.some(i)),a("red").bind(function(e){return a("green").bind(function(n){return a("blue").map(function(t){return Fv(e,n,t,1)})})}).each(function(t){var n,e,o=(n=r,e=Av(t),Qw.getField(n,"hex").each(function(t){Vg.isFocused(t)||Tf.setValue(n,{hex:e.value})}),e);vr(r,qw,{hex:o}),v(r,o)}))}function t(t){return{label:f(eS+t+".label"),description:f(eS+t+".description")}}function s(t){var n=t.red,e=t.green,o=t.blue;c("red",vt.some(n)),c("green",vt.some(e)),c("blue",vt.some(o))}var o={red:Vo(vt.some(255)),green:Vo(vt.some(255)),blue:Vo(vt.some(255)),hex:Vo(vt.some("ffffff"))},r=t("red"),i=t("green"),u=t("blue"),l=t("hex");return Xo(Qw.sketch(function(t){return{dom:{tag:"form",classes:[d("rgb-form")],attributes:{"aria-label":f("aria.color.picker")}},components:[t.field("red",sy.sketch(p(Iv,"red",r.label,r.description,255))),t.field("green",sy.sketch(p(Iv,"green",i.label,i.description,255))),t.field("blue",sy.sketch(p(Iv,"blue",u.label,u.description,255))),t.field("hex",sy.sketch(p(Bv,"hex",l.label,l.description,"ffffff"))),b.asSpec()],formBehaviours:tc([Gy.config({invalidClass:d("form-invalid")}),fm("rgb-form-events",[Cr(Zw,e),Cr(tS,n),Cr(nS,n)])])}}),{apis:{updateHex:function(t,n){var e;Tf.setValue(t,{hex:n.value}),h(t,e=Vv(n)),s(e),v(t,n)}}})},name:"RgbForm",configFields:[],apis:{updateHex:function(t,n,e){t.updateHex(n,e)}},extraApis:{}})}function o0(x,w){return wl({name:"ColourPicker",configFields:[fo("dom"),To("onValidHex",st),To("onInvalidHex",st)],factory:function(t){function n(t,n,e){v.getOpt(t).each(function(t){g.setHue(t,e)})}function e(t,n){b.getOpt(t).each(function(t){m.updateHex(t,n)})}function r(n,e,o,t){var r=o,i=Vv(e);p.paletteRgba.set(i),p.paletteHue.set(r),St(t,function(t){t(n,e,o)})}var o,i,u,a,c,s,l,f,d,m=e0(x,w,t.onValidHex,t.onInvalidHex),g=(l=w,f=Yw.parts.spectrum({dom:{tag:"canvas",attributes:{role:"presentation"},classes:[l("sv-palette-spectrum")]}}),d=Yw.parts.thumb({dom:{tag:"div",attributes:{role:"presentation"},classes:[l("sv-palette-thumb")],innerHtml:"<div class="+l("sv-palette-inner-thumb")+' role="presentation"></div>'}}),wl({factory:function(t){var n=rt({x:0,y:0}),e=tc([ud.config({find:vt.some}),Vg.config({})]);return Yw.sketch({dom:{tag:"div",attributes:{role:"presentation"},classes:[l("sv-palette")]},model:{mode:"xy",getInitialValue:n},rounded:!1,components:[f,d],onChange:function(t,n,e){vr(t,Jw,{value:e})},onInit:function(t,n,e,o){y(e.element.dom,zv(sb))},sliderBehaviours:e})},name:"SaturationBrightnessPalette",configFields:[],apis:{setHue:function(t,n,e){var o=e;y(n.components()[0].element.dom,zv(Rv(Lv(o,100,100))))},setThumb:function(t,n,e){var o=n,r=Wv(Vv(e));Yw.setValue(o,{x:r.saturation,y:100-r.value})}},extraApis:{}})),p={paletteRgba:Vo(sb),paletteHue:Vo(0)},h=Pm((i=Yw.parts.spectrum({dom:{tag:"div",classes:[(o=w)("hue-slider-spectrum")],attributes:{role:"presentation"}}}),u=Yw.parts.thumb({dom:{tag:"div",classes:[o("hue-slider-thumb")],attributes:{role:"presentation"}}}),Yw.sketch({dom:{tag:"div",classes:[o("hue-slider")],attributes:{role:"presentation"}},rounded:!1,model:{mode:"y",getInitialValue:rt({y:0})},components:[i,u],sliderBehaviours:tc([Vg.config({})]),onChange:function(t,n,e){vr(t,Kw,{value:e})}}))),v=Pm(g.sketch({})),b=Pm(m.sketch({}));function y(t,n){var e,o,r=t.width,i=t.height,u=t.getContext("2d");null!==u&&(u.fillStyle=n,u.fillRect(0,0,r,i),(e=u.createLinearGradient(0,0,r,0)).addColorStop(0,"rgba(255,255,255,1)"),e.addColorStop(1,"rgba(255,255,255,0)"),u.fillStyle=e,u.fillRect(0,0,r,i),(o=u.createLinearGradient(0,0,0,i)).addColorStop(0,"rgba(0,0,0,0)"),o.addColorStop(1,"rgba(0,0,0,1)"),u.fillStyle=o,u.fillRect(0,0,r,i))}return{uid:t.uid,dom:t.dom,components:[v.asSpec(),h.asSpec(),b.asSpec()],behaviours:tc([fm("colour-picker-events",[Cr(qw,(s=[n,function(t,n,e){h.getOpt(t).each(function(t){Yw.setValue(t,{y:100-e/360*100})})},function(t,n){v.getOpt(t).each(function(t){g.setThumb(t,n)})}],function(t,n){var e=n.event.hex;r(t,e,Wv(Vv(e)).hue,s)})),Cr(Jw,(c=[e],function(t,n){var e=n.event.value,o=p.paletteHue.get();r(t,Uv(Lv(o,e.x,100-e.y)),o,c)})),Cr(Kw,(a=[n,e],function(t,n){var e=(100-n.event.value.y)/100*360,o=Wv(p.paletteRgba.get());r(t,Uv(Lv(e,o.saturation,o.value)),e,a)}))]),ud.config({find:function(t){return b.getOpt(t)}}),Mg.config({mode:"acyclic"})])}}})}function r0(t){return iS[t]}function i0(t,n,e){return Tf.config(Xo({store:{mode:"manual",getValue:n,setValue:e}},t.map(function(t){return{store:{initialValue:t}}}).getOr({})))}function u0(r,i){function n(t,n){n.stop()}function e(t){return function(n,e){St(t,function(t){t(n,e)})}}function o(t,n){var e;dd.isDisabled(t)||(e=n.event.raw,a(t,e.dataTransfer.files))}function u(t,n){var e=n.event.raw.target;a(t,e.files)}function a(t,n){var e,o;Tf.setValue(t,(e=n,o=aS.explode(i.getSetting("images_file_types","jpeg,jpg,jpe,jfi,jif,jfif,png,gif,bmp,webp","string")),F(Ct(e),function(n){return T(o,function(t){return Bt(n.name.toLowerCase(),"."+t.toLowerCase())})}))),vr(t,py,{name:r.name})}var c=Pm({dom:{tag:"input",attributes:{type:"file",accept:"image/*"},styles:{display:"none"}},behaviours:tc([fm("input-file-events",[Er(Ci()),Er(Ri())])])});return Qb(r.label.map(function(t){return Zb(t,i)}),sy.parts.field({factory:{sketch:function(t){return{uid:t.uid,dom:{tag:"div",classes:["tox-dropzone-container"]},behaviours:tc([fS([]),ow(),dd.config({}),zg.config({toggleClass:"dragenter",toggleOnExecute:!1}),fm("dropzone-events",[Cr("dragenter",e([n,zg.toggle])),Cr("dragleave",e([n,zg.toggle])),Cr("dragover",n),Cr("drop",e([n,o])),Cr(Si(),u)])]),components:[{dom:{tag:"div",classes:["tox-dropzone"],styles:{}},components:[{dom:{tag:"p",innerHtml:i.translate("Drop an image here")}},sp.sketch({dom:{tag:"button",innerHtml:i.translate("Browse for an image"),styles:{position:"relative"},classes:["tox-button","tox-button--secondary"]},components:[c.asSpec()],action:function(t){c.get(t).element.dom.click()},buttonBehaviours:tc([fy.config({}),Kv(i.isDisabled),mv()])})]}]}}}}),["tox-form__group--stretched"],[])}function a0(t){return{dom:{tag:"div",styles:{width:"1px",height:"1px",outline:"none"},attributes:{tabindex:"0"},classes:t},behaviours:tc([Vg.config({ignore:!0}),fy.config({})])}}function c0(t){return{dom:{tag:"div",classes:["tox-navobj"]},components:[a0([dS]),t,a0([mS])],behaviours:tc([rS(1)])}}function s0(t,n){vr(t,yi(),{raw:{which:9,shiftKey:n}})}function l0(t,n){var e=n.element;qr(e,dS)?s0(t,!0):qr(e,mS)&&s0(t,!1)}function f0(t){return Ub(t,["."+dS,"."+mS].join(","),O)}function d0(t,n){return hS(document.createElement("canvas"),t,n)}function m0(t){var n=d0(t.width,t.height);return pS(n).drawImage(t,0,0),n}function g0(t){return t.naturalWidth||t.width}function p0(t){return t.naturalHeight||t.height}function h0(t,o,r){return o=o||"image/png",m(HTMLCanvasElement.prototype.toBlob)?new Vy(function(n,e){t.toBlob(function(t){t?n(t):e()},o,r)}):(g=t.toDataURL(o,r),new Vy(function(t,n){!function(){var t=g.split(","),n=/data:([^;]+)/.exec(t[0]);if(!n)return vt.none();for(var e=n[1],o=t[1],r=atob(o),i=r.length,u=Math.ceil(i/1024),a=new Array(u),c=0;c<u;++c){for(var s=1024*c,l=Math.min(1024+s,i),f=new Array(l-s),d=s,m=0;d<l;++m,++d)f[m]=r[d].charCodeAt(0);a[c]=new Uint8Array(f)}return vt.some(new Blob(a,{type:e}))}().fold(function(){n("uri is not base64: "+g)},t)}));var g}function v0(t,n,e){function o(n,e){return t.then(function(t){return t.toDataURL(n||"image/png",e)})}return{getType:rt(n.type),toBlob:function(){return Vy.resolve(n)},toDataURL:rt(e),toBase64:function(){return e.split(",")[1]},toAdjustedBlob:function(n,e){return t.then(function(t){return h0(t,n,e)})},toAdjustedDataURL:o,toAdjustedBase64:function(t,n){return o(t,n).then(function(t){return t.split(",")[1]})},toCanvas:function(){return t.then(m0)}}}function b0(n,t){return h0(n,t).then(function(t){return v0(Vy.resolve(n),t,n.toDataURL())})}function y0(n){return e=n,new Vy(function(t){var n=new FileReader;n.onloadend=function(){t(n.result)},n.readAsDataURL(e)}).then(function(t){return v0((a=n,new Vy(function(t,n){function e(){r.removeEventListener("load",i),r.removeEventListener("error",u)}var o=URL.createObjectURL(a),r=new Image,i=function(){e(),t(r)},u=function(){e(),n("Unable to load data of type "+a.type+": "+o)};r.addEventListener("load",i),r.addEventListener("error",u),r.src=o,r.complete&&setTimeout(i,0)}).then(function(t){vS(t);var n=d0(g0(t),p0(t));return pS(n).drawImage(t,0,0),n})),n,t);var a});var e}function x0(t,n,e){var o="string"==typeof t?parseFloat(t):t;return e<o?o=e:o<n&&(o=n),o}function w0(){return[1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1]}function S0(t,n){for(var e=[],o=new Array(25),r=0;r<5;r++){for(var i=0;i<5;i++)e[i]=n[i+5*r];for(i=0;i<5;i++){for(var u=0,a=0;a<5;a++)u+=t[i+5*a]*e[a];o[i+5*r]=u}}return o}function C0(n,e){return n.toCanvas().then(function(t){return yS(t,n.getType(),e)})}function k0(e){return function(t,n){return C0(t,e(w0(),n))}}function O0(t,n){void 0===n&&(n=2);var e=Math.pow(10,n),o=Math.round(t*e);return Math.ceil(o/e)}function _0(t){return xS(t)}function T0(t){return CS(t)}function E0(t,n){return kS(t,n)}function D0(t,n){return wS(t,n)}function B0(t,n){return SS(t,n)}function M0(t,n){return o=n,(e=t).toCanvas().then(function(t){return ES(t,e.getType(),o)});var e,o}function A0(t,n){return o=n,(e=t).toCanvas().then(function(t){return TS(t,e.getType(),o)});var e,o}function F0(t,n,e){return jm(t,{tag:"span",classes:["tox-icon","tox-tbtn__icon-wrap"],behaviours:e},n)}function I0(t,n){return F0(t,n,[])}function R0(t,n){return F0(t,n,[Fg.config({})])}function V0(t,n,e){return{dom:{tag:"span",innerHtml:e.translate(t),classes:[n+"__select-label"]},behaviours:tc([Fg.config({})])}}function P0(n,e,o){function t(t,n){var e=Tf.getValue(t);return Vg.focus(e),vr(e,"keydown",{raw:n.event.raw}),dw.close(e),vt.some(!0)}var r=Vo(st),i=n.text.map(function(t){return Pm(V0(t,e,o.providers))}),u=n.icon.map(function(t){return Pm(R0(t,o.providers.icons))}),a=n.role.fold(function(){return{}},function(t){return{role:t}}),c=n.tooltip.fold(function(){return{}},function(t){var n=o.providers.translate(t);return{title:n,"aria-label":n}}),s=jm("chevron-down",{tag:"div",classes:[e+"__select-chevron"]},o.providers.icons);return Pm(dw.sketch(lt(lt(lt({},n.uid?{uid:n.uid}:{}),a),{dom:{tag:"button",classes:[e,e+"--select"].concat(M(n.classes,function(t){return e+"--"+t})),attributes:lt({},c)},components:Qv([u.map(function(t){return t.asSpec()}),i.map(function(t){return t.asSpec()}),vt.some(s)]),matchWidth:!0,useMinWidth:!0,dropdownBehaviours:tc(H(H([],n.dropdownBehaviours,!0),[Kv(function(){return n.disabled||o.providers.isDisabled()}),mv(),mw.config({}),Fg.config({}),fm("dropdown-events",[pv(n,r),hv(n,r)]),fm("menubutton-update-display-text",[Cr(AS,function(n,e){i.bind(function(t){return t.getOpt(n)}).each(function(t){Fg.set(t,[oi(o.providers.translate(e.event.text))])})}),Cr(FS,function(n,e){u.bind(function(t){return t.getOpt(n)}).each(function(t){Fg.set(t,[R0(e.event.icon,o.providers.icons)])})})])],!1)),eventOrder:Xo(MS,{mousedown:["focusing","alloy.base.behaviour","item-type-events","normal-dropdown-events"]}),sandboxBehaviours:tc([Mg.config({mode:"special",onLeft:t,onRight:t})]),lazySink:o.getSink,toggleClass:e+"--active",parts:{menu:$p(0,n.columns,n.presets)},fetch:function(t){return Ny(S(n.fetch,t))}}))).asSpec()}function H0(t){return"separator"===t.type}function z0(t,e,o,n){var r=Fr("primary-menu"),i=RS(t,o.shared.providers.menuItems());if(0===i.items.length)return vt.none();var u=Lb(r,i.items,e,o,n),a=dt(i.menus,function(t,n){return Lb(n,t,e,o,!1)}),c=Xo(a,cr(r,u));return vt.from(op.tieredData(r,c,i.expansions))}function N0(e){return{isDisabled:function(){return dd.isDisabled(e)},setDisabled:function(t){return dd.set(e,t)},setActive:function(t){var n=e.element;t?(Xr(n,"tox-tbtn--enabled"),on(n,"aria-pressed",!0)):(Yr(n,"tox-tbtn--enabled"),cn(n,"aria-pressed"))},isActive:function(){return qr(e.element,"tox-tbtn--enabled")}}}function L0(e,t,o,n){return P0({text:e.text,icon:e.icon,tooltip:e.tooltip,role:n,fetch:function(t,n){e.fetch(function(t){n(z0(t,xh.CLOSE_ON_EXECUTE,o,!1))})},onSetup:e.onSetup,getApi:N0,columns:1,presets:"normal",classes:[],dropdownBehaviours:[fy.config({})]},t,o.shared)}function W0(t,n,e,o,r,i){void 0===e&&(e=[]);var u=n.fold(function(){return{}},function(t){return{action:t}}),a=lt({buttonBehaviours:tc([Kv(function(){return t.disabled||i.isDisabled()}),mv(),fy.config({}),fm("button press",[Sr("click"),Sr("mousedown")])].concat(e)),eventOrder:{click:["button press","alloy.base.behaviour"],mousedown:["button press","alloy.base.behaviour"]}},u),c=Xo(a,{dom:o});return Xo(c,{components:r})}function U0(t,n,e,o){void 0===o&&(o=[]);var r={tag:"button",classes:["tox-tbtn"],attributes:t.tooltip.map(function(t){return{"aria-label":e.translate(t),title:e.translate(t)}}).getOr({})},i=t.icon.map(function(t){return I0(t,e.icons)});return W0(t,n,o,r,Qv([i]),e)}function j0(t,n,e,o){void 0===o&&(o=[]);var r=U0(t,vt.some(n),e,o);return sp.sketch(r)}function G0(t,n,e,o,r){void 0===o&&(o=[]),void 0===r&&(r=[]);var i=e.translate(t.text),u=t.icon?t.icon.map(function(t){return I0(t,e.icons)}):vt.none(),a=u.isSome()?Qv([u]):[],c=u.isSome()?{}:{innerHtml:i},s=H(H(H(H([],t.primary||t.borderless?["tox-button"]:["tox-button","tox-button--secondary"],!0),u.isSome()?["tox-button--icon"]:[],!0),t.borderless?["tox-button--naked"]:[],!0),r,!0);return W0(t,n,o,lt(lt({tag:"button",classes:s},c),{attributes:{title:i}}),a,e)}function X0(t,n,e,o,r){void 0===o&&(o=[]),void 0===r&&(r=[]);var i=G0(t,vt.some(n),e,o,r);return sp.sketch(i)}function Y0(n,e){return function(t){"custom"===e?vr(t,by,{name:n,value:{}}):"submit"===e?hr(t,yy):"cancel"===e?hr(t,vy):console.error("Unknown button type: ",e)}}function q0(n,t,e){if("menu"===t){var o=n,r=Pm(L0(lt(lt({},n),{onSetup:function(t){return t.setDisabled(n.disabled),st},fetch:(i=o.items,u=function(){return r},a=e,function(t){t(M(i,function(t){var n,e,o=t.text.fold(function(){return{}},function(t){return{text:t}});return lt(lt({type:t.type,active:!1},o),{onAction:function(t){var n=!t.isActive();t.setActive(n),e.storage.set(n),a.shared.getSink().each(function(t){u().getOpt(t).each(function(t){Sa(t.element),vr(t,by,{name:e.name,value:e.storage.get()})})})},onSetup:(n=e=t,function(t){t.setActive(n.storage.get())})})}))})}),"tox-tbtn",e,vt.none()));return r.asSpec()}var i,u,a;if("custom"===t||"cancel"===t||"submit"===t){var c=Y0(n.name,t);return X0(lt(lt({},n),{borderless:!1}),c,e.shared.providers,[])}console.error("Unknown footer button type: ",t)}function K0(t,n){return qf({factory:sy,name:t,overrides:function(o){return{fieldBehaviours:tc([fm("coupled-input-behaviour",[Cr(wi(),function(e){fl(e,o,n).bind(ud.getCurrent).each(function(n){fl(e,o,"lock").each(function(t){zg.isOn(t)&&o.onLockedChange(e,n,t)})})})])])}}})}function J0(t){var n=/^\s*(\d+(?:\.\d+)?)\s*(|cm|mm|in|px|pt|pc|em|ex|ch|rem|vw|vh|vmin|vmax|%)\s*$/.exec(t);if(null===n)return Re.error(t);var e=parseFloat(n[1]),o=n[2];return Re.value({value:e,unit:o})}function $0(t,n){function e(t){return Tt(o,t)}var o={"":96,px:96,pt:72,cm:2.54,pc:12,mm:25.4,in:1};return t.unit===n?vt.some(t.value):e(t.unit)&&e(n)?o[t.unit]===o[n]?vt.some(t.value):vt.some(t.value/o[t.unit]*o[n]):vt.none()}function Q0(t){return vt.none()}function Z0(o,n){function t(t){return jm(t,{tag:"span",classes:["tox-icon","tox-lock-icon__"+t]},n.icons)}function e(t){return{dom:{tag:"div",classes:["tox-form__group"]},components:t}}function r(e){return sy.parts.field({factory:Oy,inputClasses:["tox-textfield"],inputBehaviours:tc([dd.config({disabled:function(){return o.disabled||n.isDisabled()}}),mv(),fy.config({}),fm("size-input-events",[Cr(vi(),function(t,n){vr(t,u,{isField1:e})}),Cr(Si(),function(t,n){vr(t,py,{name:o.name})})])]),selectOnFocus:!1})}function i(t){return{dom:{tag:"label",classes:["tox-label"],innerHtml:n.translate(t)}}}var l=Q0,u=Fr("ratio-event"),a=HS.parts.lock({dom:{tag:"button",classes:["tox-lock","tox-button","tox-button--naked","tox-button--icon"],attributes:{title:n.translate(o.label.getOr("Constrain proportions"))}},components:[t("lock"),t("unlock")],buttonBehaviours:tc([dd.config({disabled:function(){return o.disabled||n.isDisabled()}}),mv(),fy.config({})])}),c=HS.parts.field1(e([sy.parts.label(i("Width")),r(!0)])),s=HS.parts.field2(e([sy.parts.label(i("Height")),r(!1)]));return HS.sketch({dom:{tag:"div",classes:["tox-form__group"]},components:[{dom:{tag:"div",classes:["tox-form__controls-h-stack"]},components:[c,s,e([i("&nbsp;"),a])]}],field1Name:"width",field2Name:"height",locked:!0,markers:{lockClass:"tox-locked"},onLockedChange:function(t,i,n){J0(Tf.getValue(t)).each(function(t){l(t).each(function(t){var n,e,o,r;Tf.setValue(i,(r=-1!==(r=(n=t).value.toFixed((e=n.unit)in(o={"":0,px:0,pt:1,mm:1,pc:2,ex:2,em:2,ch:2,rem:2,cm:3,in:4,"%":4})?o[e]:1)).indexOf(".")?r.replace(/\.?0*$/,""):r)+n.unit)})})},coupledFieldBehaviours:tc([dd.config({disabled:function(){return o.disabled||n.isDisabled()},onDisabled:function(t){HS.getField1(t).bind(sy.getField).each(dd.disable),HS.getField2(t).bind(sy.getField).each(dd.disable),HS.getLock(t).each(dd.disable)},onEnabled:function(t){HS.getField1(t).bind(sy.getField).each(dd.enable),HS.getField2(t).bind(sy.getField).each(dd.enable),HS.getLock(t).each(dd.enable)}}),mv(),fm("size-input-events2",[Cr(u,function(t,n){var e,o,r,i=n.event.isField1,u=i?HS.getField1(t):HS.getField2(t),a=i?HS.getField2(t):HS.getField1(t),c=u.map(Tf.getValue).getOr(""),s=a.map(Tf.getValue).getOr("");e=s,o=J0(c).toOptional(),r=J0(e).toOptional(),l=Et(o,r,function(t,o){return $0(t,o.unit).map(function(t){return o.value/t}).map(function(t){return n=t,e=o.unit,function(t){return $0(t,e).map(function(t){return{value:t*n,unit:e}})};var n,e}).getOr(Q0)}).getOr(Q0)})])])})}function tw(f,c){function t(t,n,e,o){return Pm(X0({name:t,text:t,disabled:e,primary:o,icon:vt.none(),borderless:!1},n,c))}function n(t,n,e,o){return Pm(j0({name:t,icon:vt.some(t),tooltip:vt.some(n),disabled:o,primary:!1,borderless:!1},e,c))}function d(t,e){t.map(function(t){var n=t.get(e);n.hasConfigured(dd)&&dd.disable(n)})}function m(t,e){t.map(function(t){var n=t.get(e);n.hasConfigured(dd)&&dd.enable(n)})}function r(t,n,e){vr(t,n,e)}function i(t){return hr(t,US.disable()),0}function u(t){return hr(t,US.enable()),0}function g(t,n){i(t),r(t,zS.transform(),{transform:n}),u(t)}function e(t){return function(){q.getOpt(t).each(function(t){Fg.set(t,[Y])})}}function s(t,n){i(t),r(t,zS.transformApply(),{transform:n,swap:e(t)}),u(t)}function p(){return t("Back",function(t){return r(t,zS.back(),{swap:e(t)})},!1,!1)}function o(){return Pm({dom:{tag:"div",classes:["tox-spacer"]},behaviours:tc([dd.config({})])})}function h(){return t("Apply",function(t){return r(t,zS.apply(),{swap:e(t)})},!0,!0)}function v(n,e){return function(t){return n(t,e)}}function a(t,n){var e,o=n;i(e=t),r(e,zS.tempTransform(),{transform:o}),u(e)}function b(t,n,e,o,r){var i=Yw.parts.label({dom:{tag:"label",classes:["tox-label"],innerHtml:c.translate(t)}}),u=Yw.parts.spectrum({dom:{tag:"div",classes:["tox-slider__rail"],attributes:{role:"presentation"}}}),a=Yw.parts.thumb({dom:{tag:"div",classes:["tox-slider__handle"],attributes:{role:"presentation"}}});return Pm(Yw.sketch({dom:{tag:"div",classes:["tox-slider"],attributes:{role:"presentation"}},model:{mode:"x",minX:e,maxX:r,getInitialValue:rt({x:o})},components:[i,u,a],sliderBehaviours:tc([Vg.config({})]),onChoose:n}))}function l(t,n,e,o,r){var i,u,a,c,s,l,f=(i=t,u=n,a=e,c=o,s=r,[p(),(l=u,b(i,function(t,n,e){g(t,v(l,e.x/100))},a,c,s)),h()]);return uy.sketch({dom:w,components:f.map(function(t){return t.asSpec()}),containerBehaviours:tc([fm("image-tools-filter-panel-buttons-events",[Cr(US.disable(),function(t,n){d(f,t)}),Cr(US.enable(),function(t,n){m(f,t)})])])})}function y(t){return b(t,function(l,t,n){var e=z.getOpt(l),o=L.getOpt(l),r=N.getOpt(l);e.each(function(s){o.each(function(c){r.each(function(t){var o,r,i,n=Tf.getValue(s).x/100,e=Tf.getValue(t).x/100,u=Tf.getValue(c).x/100,a=(o=n,r=e,i=u,function(t){return C0(t,(n=r,e=i,S0(w0(),[x0(o,0,2),0,0,0,0,0,x0(n,0,2),0,0,0,0,0,x0(e,0,2),0,0,0,0,0,1,0,0,0,0,0,1])));var n,e});g(l,a)})})})},0,100,200)}function x(n,e,o){return function(t){r(t,zS.swap(),{transform:e,swap:function(){q.getOpt(t).each(function(t){Fg.set(t,[n]),o(t)})}})}}var w={tag:"div",classes:["tox-image-tools__toolbar","tox-image-tools-edit-panel"]},S=st,C=[p(),o(),t("Apply",function(t){s(t,function(t){var n,e,o,r,i,u,a,c,s,l=f.getRect();return n=l.x,e=l.y,o=l.w,r=l.h,u=n,a=e,c=o,s=r,(i=t).toCanvas().then(function(t){return DS(t,i.getType(),u,a,c,s)})}),f.hideCrop()},!1,!0)],k=uy.sketch({dom:w,components:C.map(function(t){return t.asSpec()}),containerBehaviours:tc([fm("image-tools-crop-buttons-events",[Cr(US.disable(),function(t,n){d(C,t)}),Cr(US.enable(),function(t,n){m(C,t)})])])}),O=Pm(Z0({name:"size",label:vt.none(),constrain:!0,disabled:!1},c)),_=[p(),o(),O,o(),t("Apply",function(a){O.getOpt(a).each(function(t){var r,i,n=Tf.getValue(t),e=parseInt(n.width,10),o=parseInt(n.height,10),u=(r=e,i=o,function(t){return e=r,o=i,(n=t).toCanvas().then(function(t){return OS(t,e,o).then(function(t){return b0(t,n.getType())})});var n,e,o});s(a,u)})},!1,!0)],T=uy.sketch({dom:w,components:_.map(function(t){return t.asSpec()}),containerBehaviours:tc([fm("image-tools-resize-buttons-events",[Cr(US.disable(),function(t,n){d(_,t)}),Cr(US.enable(),function(t,n){m(_,t)})])])}),E=v(M0,"h"),D=v(M0,"v"),B=v(A0,-90),M=v(A0,90),A=[p(),o(),n("flip-horizontally","Flip horizontally",function(t){a(t,E)},!1),n("flip-vertically","Flip vertically",function(t){a(t,D)},!1),n("rotate-left","Rotate counterclockwise",function(t){a(t,B)},!1),n("rotate-right","Rotate clockwise",function(t){a(t,M)},!1),o(),h()],F=uy.sketch({dom:w,components:A.map(function(t){return t.asSpec()}),containerBehaviours:tc([fm("image-tools-fliprotate-buttons-events",[Cr(US.disable(),function(t,n){d(A,t)}),Cr(US.enable(),function(t,n){m(A,t)})])])}),I=[p(),o(),h()],R=uy.sketch({dom:w,components:I.map(function(t){return t.asSpec()})}),V=l("Brightness",D0,-100,0,100),P=l("Contrast",B0,-100,0,100),H=l("Gamma",E0,-100,0,100),z=y("R"),N=y("G"),L=y("B"),W=[p(),z,N,L,h()],U=uy.sketch({dom:w,components:W.map(function(t){return t.asSpec()})}),j=vt.some(T0),G=vt.some(_0),X=[n("crop","Crop",x(k,vt.none(),function(t){f.showCrop()}),!1),n("resize","Resize",x(T,vt.none(),function(t){O.getOpt(t).each(function(t){var n=f.getMeasurements(),e=n.width,o=n.height;Tf.setValue(t,{width:e,height:o})})}),!1),n("orientation","Orientation",x(F,vt.none(),S),!1),n("brightness","Brightness",x(V,vt.none(),S),!1),n("sharpen","Sharpen",x(R,j,S),!1),n("contrast","Contrast",x(P,vt.none(),S),!1),n("color-levels","Color levels",x(U,vt.none(),S),!1),n("gamma","Gamma",x(H,vt.none(),S),!1),n("invert","Invert",x(R,G,S),!1)],Y=uy.sketch({dom:w,components:X.map(function(t){return t.asSpec()})}),q=Pm(uy.sketch({dom:{tag:"div"},components:[Y],containerBehaviours:tc([Fg.config({})])}));return{memContainer:q,getApplyButton:function(t){return q.getOpt(t).map(function(t){var n=t.components()[0];return n.components()[n.components().length-1]})}}}function nw(t){var n,e;if(t.changedTouches)for(n="screenX screenY pageX pageY clientX clientY".split(" "),e=0;e<n.length;e++)t[n[e]]=t.changedTouches[0][n[e]]}(Ry=Iy=Iy||{})[Ry.HighlightFirst=0]="HighlightFirst",Ry[Ry.HighlightNone=1]="HighlightNone";function ew(o,t){return{uid:o.uid,dom:o.dom,components:t,behaviours:Zs(o.formBehaviours,[Tf.config({store:{mode:"manual",getValue:function(t){return dt(gl(t,o),function(t,o){return t().bind(function(t){var n=ud.getCurrent(t),e=new Error("Cannot find a current component to extract the value from for form part '"+o+"': "+Ar(t.element));return n.fold(function(){return Re.error(e)},Re.value)}).map(Tf.getValue)})},setValue:function(e,t){J(t,function(n,t){fl(e,o,t).each(function(t){ud.getCurrent(t).each(function(t){Tf.setValue(t,n)})})})}}})]),apis:{getField:function(t,n){return fl(t,o,n).bind(ud.getCurrent)}}}}function ow(){return ud.config({find:vt.some})}function rw(t){return n=Br,e=Mr,i0(t,function(t){return n(t.element)},function(t,n){return e(t.element,n)});var n,e}var iw,uw,aw,cw,sw=function(n,t){return n.getSystem().getByUid(t.uid+"-"+qy()).map(function(t){return function(){return Re.value(t)}}).getOrThunk(function(){return t.lazySink.fold(function(){return function(){return Re.error(new Error("No internal sink is specified, nor could an external sink be found"))}},function(t){return function(){return t(n)}})})},lw=rt([fo("dom"),fo("fetch"),Ku("onOpen"),Ju("onExecute"),To("getHotspot",vt.some),To("getAnchorOverrides",rt({})),Nc(),$s("dropdownBehaviours",[zg,Yy,Mg,Vg]),fo("toggleClass"),To("eventOrder",{}),xo("lazySink"),To("matchWidth",!1),To("useMinWidth",!1),xo("role")].concat(ex())),fw=rt([Kf({schema:[Xu()],name:"menu",defaults:function(t){return{onExecute:t.onExecute}}}),Ky()]),dw=Sl({name:"Dropdown",configFields:lw(),partFields:fw(),factory:function(n,t,e,o){function r(t){hf.getState(t).each(function(t){op.highlightPrimary(t)})}function i(t,n){return br(t),vt.some(!0)}var u,a={expand:function(t){zg.isOn(t)||Qy(n,h,t,o,st,Iy.HighlightNone).get(st)},open:function(t){zg.isOn(t)||Qy(n,h,t,o,st,Iy.HighlightFirst).get(st)},isOpen:zg.isOn,close:function(t){zg.isOn(t)&&Qy(n,h,t,o,st,Iy.HighlightFirst).get(st)},repositionMenus:function(t){zg.isOn(t)&&nx(t)}};return{uid:n.uid,dom:n.dom,components:t,behaviours:Zs(n.dropdownBehaviours,[zg.config({toggleClass:n.toggleClass,aria:{mode:"expanded"}}),Yy.config({others:{sandbox:function(t){return tx(n,t,{onOpen:function(){return zg.on(t)},onClose:function(){return zg.off(t)}})}}}),Mg.config({mode:"special",onSpace:i,onEnter:i,onDown:function(t,n){return dw.isOpen(t)?r(Yy.getCoupled(t,"sandbox")):dw.open(t),vt.some(!0)},onEscape:function(t,n){return dw.isOpen(t)?(dw.close(t),vt.some(!0)):vt.none()}}),Vg.config({})]),events:xm(vt.some(function(t){Qy(n,h,t,o,r,Iy.HighlightFirst).get(st)})),eventOrder:lt(lt({},n.eventOrder),((u={})[Fi()]=["disabling","toggling","alloy.base.behaviour"],u)),apis:a,domModification:{attributes:lt(lt({"aria-haspopup":"true"},n.role.fold(function(){return{}},function(t){return{role:t}})),"button"===n.dom.tag?{type:tt(n.dom,"attributes").bind(function(t){return tt(t,"type")}).getOr("button")}:{})}}},apis:{open:function(t,n){return t.open(n)},expand:function(t,n){return t.expand(n)},close:function(t,n){return t.close(n)},isOpen:function(t,n){return t.isOpen(n)},repositionMenus:function(t,n){return t.repositionMenus(n)}}}),mw=ya({fields:[],name:"unselecting",active:Object.freeze({__proto__:null,events:function(){return nu([wr(Ti(),_)])},exhibit:function(){return Nr({styles:{"-webkit-user-select":"none","user-select":"none","-ms-user-select":"none","-moz-user-select":"-moz-none"},attributes:{unselectable:"on"}})}})}),gw=Fr("color-input-change"),pw=Fr("color-swatch-change"),hw=Fr("color-picker-cancel"),vw=Jf({schema:[fo("dom")],name:"label"}),bw=ox("top-left"),yw=ox("top"),xw=ox("top-right"),ww=ox("right"),Sw=ox("bottom-right"),Cw=ox("bottom"),kw=ox("bottom-left"),Ow=[vw,ox("left"),ww,yw,Cw,bw,xw,kw,Sw,qf({name:"thumb",defaults:rt({dom:{styles:{position:"absolute"}}}),overrides:function(t){return{events:nu([_r(ci(),t,"spectrum"),_r(si(),t,"spectrum"),_r(li(),t,"spectrum"),_r(di(),t,"spectrum"),_r(mi(),t,"spectrum"),_r(pi(),t,"spectrum")])}}}),qf({schema:[ar("mouseIsDown",function(){return Vo(!1)})],name:"spectrum",overrides:function(e){function o(n,t){return r.getValueFromEvent(t).map(function(t){return r.setValueFrom(n,e,t)})}var r=e.model.manager;return{behaviours:tc([Mg.config({mode:"special",onLeft:function(t){return r.onLeft(t,e)},onRight:function(t){return r.onRight(t,e)},onUp:function(t){return r.onUp(t,e)},onDown:function(t){return r.onDown(t,e)}}),Vg.config({})]),events:nu([Cr(ci(),o),Cr(si(),o),Cr(di(),o),Cr(mi(),function(t,n){e.mouseIsDown.get()&&o(t,n)})])}}})],_w=rt("slider.change.value"),Tw="left",Ew=Xx(-1),Dw=Xx(1),Bw=vt.none,Mw=vt.none,Aw={"top-left":vt.none(),top:vt.none(),"top-right":vt.none(),right:vt.some(function(t,n){Dx(t,{x:fx(n)})}),"bottom-right":vt.none(),bottom:vt.none(),"bottom-left":vt.none(),left:vt.some(function(t,n){Dx(t,{x:ax(n)})})},Fw=Object.freeze({__proto__:null,setValueFrom:function(t,n,e){var o=Gx(t,n,e);return jx(t,{x:o}),o},setToMin:function(t,n){jx(t,{x:ix(n)})},setToMax:function(t,n){jx(t,{x:sx(n)})},findValueOfOffset:Gx,getValueFromEvent:function(t){return rx(t).map(function(t){return t.left})},findPositionOfValue:Yx,setPositionFromValue:function(t,n,e,o){var r=Tx(e),i=Yx(t,o.getSpectrum(t),r.x,o.getLeftEdge(t),o.getRightEdge(t),e),u=kn(n.element)/2;fn(n.element,"left",i-u+"px")},onLeft:Ew,onRight:Dw,onUp:Bw,onDown:Mw,edgeActions:Aw}),Iw=vt.none,Rw=vt.none,Vw=Jx(-1),Pw=Jx(1),Hw={"top-left":vt.none(),top:vt.some(function(t,n){Dx(t,{y:cx(n)})}),"top-right":vt.none(),right:vt.none(),"bottom-right":vt.none(),bottom:vt.some(function(t,n){Dx(t,{y:dx(n)})}),"bottom-left":vt.none(),left:vt.none()},zw=Object.freeze({__proto__:null,setValueFrom:function(t,n,e){var o=Kx(t,n,e);return qx(t,{y:o}),o},setToMin:function(t,n){qx(t,{y:ux(n)})},setToMax:function(t,n){qx(t,{y:lx(n)})},findValueOfOffset:Kx,getValueFromEvent:function(t){return rx(t).map(function(t){return t.top})},findPositionOfValue:$x,setPositionFromValue:function(t,n,e,o){var r=Tx(e),i=$x(t,o.getSpectrum(t),r.y,o.getTopEdge(t),o.getBottomEdge(t),e),u=xn(n.element)/2;fn(n.element,"top",i-u+"px")},onLeft:Iw,onRight:Rw,onUp:Vw,onDown:Pw,edgeActions:Hw}),Nw=rx,Lw=t0(-1,!1),Ww=t0(1,!1),Uw=t0(-1,!0),jw=t0(1,!0),Gw={"top-left":vt.some(function(t,n){Dx(t,Ex(ax(n),cx(n)))}),top:vt.some(function(t,n){Dx(t,Ex(hx(n),cx(n)))}),"top-right":vt.some(function(t,n){Dx(t,Ex(fx(n),cx(n)))}),right:vt.some(function(t,n){Dx(t,Ex(fx(n),vx(n)))}),"bottom-right":vt.some(function(t,n){Dx(t,Ex(fx(n),dx(n)))}),bottom:vt.some(function(t,n){Dx(t,Ex(hx(n),dx(n)))}),"bottom-left":vt.some(function(t,n){Dx(t,Ex(ax(n),dx(n)))}),left:vt.some(function(t,n){Dx(t,Ex(ax(n),vx(n)))})},Xw=Object.freeze({__proto__:null,setValueFrom:function(t,n,e){var o=Zx(Gx(t,n,e.left),Kx(t,n,e.top));return Qx(t,o),o},setToMin:function(t,n){Qx(t,Zx(ix(n),ux(n)))},setToMax:function(t,n){Qx(t,Zx(sx(n),lx(n)))},getValueFromEvent:Nw,setPositionFromValue:function(t,n,e,o){var r=Tx(e),i=Yx(t,o.getSpectrum(t),r.x,o.getLeftEdge(t),o.getRightEdge(t),e),u=$x(t,o.getSpectrum(t),r.y,o.getTopEdge(t),o.getBottomEdge(t),e),a=kn(n.element)/2,c=xn(n.element)/2;fn(n.element,"left",i-a+"px"),fn(n.element,"top",u-c+"px")},onLeft:Lw,onRight:Ww,onUp:Uw,onDown:jw,edgeActions:Gw}),Yw=Sl({name:"Slider",configFields:[To("stepSize",1),To("onChange",st),To("onChoose",st),To("onInit",st),To("onDragStart",st),To("onDragEnd",st),To("snapToGrid",!1),To("rounded",!0),xo("snapStart"),mo("model",so("mode",{x:[To("minX",0),To("maxX",100),ar("value",function(t){return Vo(t.mode.minX)}),fo("getInitialValue"),Zu("manager",Fw)],y:[To("minY",0),To("maxY",100),ar("value",function(t){return Vo(t.mode.minY)}),fo("getInitialValue"),Zu("manager",zw)],xy:[To("minX",0),To("maxX",100),To("minY",0),To("maxY",100),ar("value",function(t){return Vo({x:t.mode.minX,y:t.mode.minY})}),fo("getInitialValue"),Zu("manager",Xw)]})),$s("sliderBehaviours",[Mg,Tf]),ar("mouseIsDown",function(){return Vo(!1)})],partFields:Ow,factory:function(i,t,n,e){function u(t){return dl(t,i,"thumb")}function a(t){return dl(t,i,"spectrum")}function o(t){return fl(t,i,"left-edge")}function r(t){return fl(t,i,"right-edge")}function c(t){return fl(t,i,"top-edge")}function s(t){return fl(t,i,"bottom-edge")}function l(t,n){v.setPositionFromValue(t,n,i,{getLeftEdge:o,getRightEdge:r,getTopEdge:c,getBottomEdge:s,getSpectrum:a})}function f(t,n){h.value.set(n),l(t,u(t))}function d(e){var t=i.mouseIsDown.get();i.mouseIsDown.set(!1),t&&fl(e,i,"thumb").each(function(t){var n=h.value.get();i.onChoose(e,t,n)})}function m(t,n){n.stop(),i.mouseIsDown.set(!0),i.onDragStart(t,u(t))}function g(t,n){n.stop(),i.onDragEnd(t,u(t)),d(t)}var p,h=i.model,v=h.manager;return{uid:i.uid,dom:i.dom,components:t,behaviours:Zs(i.sliderBehaviours,[Mg.config({mode:"special",focusIn:function(t){return fl(t,i,"spectrum").map(Mg.focusIn).map(_)}}),Tf.config({store:{mode:"manual",getValue:function(t){return h.value.get()}}}),rc.config({channels:((p={})[yf()]={onReceive:d},p)})]),events:nu([Cr(_w(),function(t,n){!function(t,n){f(t,n);var e=u(t);i.onChange(t,e,n),vt.some(!0)}(t,n.event.value)}),eu(function(t,n){var e=h.getInitialValue();h.value.set(e);var o=u(t);l(t,o);var r=a(t);i.onInit(t,o,r,h.value.get())}),Cr(ci(),m),Cr(li(),g),Cr(di(),m),Cr(pi(),g)]),apis:{resetToMin:function(t){v.setToMin(t,i)},resetToMax:function(t){v.setToMax(t,i)},setValue:f,refresh:l},domModification:{styles:{position:"relative"}}}},apis:{setValue:function(t,n,e){t.setValue(n,e)},resetToMin:function(t,n){t.resetToMin(n)},resetToMax:function(t,n){t.resetToMax(n)},refresh:function(t,n){t.refresh(n)}}}),qw=Fr("rgb-hex-update"),Kw=Fr("slider-update"),Jw=Fr("palette-update"),$w=[$s("formBehaviours",[Tf])],Qw={getField:Hr(function(t,n,e){return t.getField(n,e)}),sketch:function(t){var e,n={field:function(t,n){return e.push(t),ul("form",n0(t),n)},record:rt(e=[])},o=t(n),r=M(n.record(),function(t){return qf({name:t,pname:n0(t)})});return xl("form",$w,r,ew,o)}},Zw=Fr("valid-input"),tS=Fr("invalid-input"),nS=Fr("validating-input"),eS="colorcustom.rgb.",oS=function(t){return ud.config({find:t.getOpt})},rS=function(t){return ud.config({find:function(n){return Jt(n.element,t).bind(function(t){return n.getSystem().getByDom(t).toOptional()})}})},iS={"colorcustom.rgb.red.label":"R","colorcustom.rgb.red.description":"Red component","colorcustom.rgb.green.label":"G","colorcustom.rgb.green.description":"Green component","colorcustom.rgb.blue.label":"B","colorcustom.rgb.blue.description":"Blue component","colorcustom.rgb.hex.label":"#","colorcustom.rgb.hex.description":"Hex color code","colorcustom.rgb.range":"Range 0 to 255","colorcustom.sb.saturation":"Saturation","colorcustom.sb.brightness":"Brightness","colorcustom.sb.picker":"Saturation and Brightness Picker","colorcustom.sb.palette":"Saturation and Brightness Palette","colorcustom.sb.instructions":"Use arrow keys to select saturation and brightness, on x and y axes","colorcustom.hue.hue":"Hue","colorcustom.hue.slider":"Hue Slider","colorcustom.hue.palette":"Hue Palette","colorcustom.hue.instructions":"Use arrow keys to select a hue","aria.color.picker":"Color Picker","aria.input.invalid":"Invalid input"},uS=tinymce.util.Tools.resolve("tinymce.Resource"),aS=tinymce.util.Tools.resolve("tinymce.util.Tools"),cS=Jo([To("preprocess",h),To("postprocess",h)]),sS=function(r,t){var i=co("RepresentingConfigs.memento processors",cS,t);return Tf.config({store:{mode:"manual",getValue:function(t){var n=r.get(t),e=Tf.getValue(n);return i.postprocess(e)},setValue:function(t,n){var e=i.preprocess(n),o=r.get(t);Tf.setValue(o,e)}}})},lS=i0,fS=function(t){return Tf.config({store:{mode:"memory",initialValue:t}})},dS=Fr("alloy-fake-before-tabstop"),mS=Fr("alloy-fake-after-tabstop"),gS=!(se().browser.isIE()||se().browser.isEdge()),pS=function(t){return t.getContext("2d")},hS=function(t,n,e){return t.width=n,t.height=e,t},vS=function(t){URL.revokeObjectURL(t.src)},bS=[0,.01,.02,.04,.05,.06,.07,.08,.1,.11,.12,.14,.15,.16,.17,.18,.2,.21,.22,.24,.25,.27,.28,.3,.32,.34,.36,.38,.4,.42,.44,.46,.48,.5,.53,.56,.59,.62,.65,.68,.71,.74,.77,.8,.83,.86,.89,.92,.95,.98,1,1.06,1.12,1.18,1.24,1.3,1.36,1.42,1.48,1.54,1.6,1.66,1.72,1.78,1.84,1.9,1.96,2,2.12,2.25,2.37,2.5,2.62,2.75,2.87,3,3.2,3.4,3.6,3.8,4,4.3,4.7,4.9,5,5.5,6,6.5,6.8,7,7.3,7.5,7.8,8,8.4,8.7,9,9.4,9.6,9.8,10],yS=function(t,n,T){var e=pS(t),o=function(t){for(var n,e,o,r,i=t.data,u=T[0],a=T[1],c=T[2],s=T[3],l=T[4],f=T[5],d=T[6],m=T[7],g=T[8],p=T[9],h=T[10],v=T[11],b=T[12],y=T[13],x=T[14],w=T[15],S=T[16],C=T[17],k=T[18],O=T[19],_=0;_<i.length;_+=4)n=i[_],e=i[_+1],o=i[_+2],r=i[_+3],i[_]=n*u+e*a+o*c+r*s+l,i[_+1]=n*f+e*d+o*m+r*g+p,i[_+2]=n*h+e*v+o*b+r*y+x,i[_+3]=n*w+e*S+o*C+r*k+O;return t}(e.getImageData(0,0,t.width,t.height));return e.putImageData(o,0,0),b0(t,n)},xS=(iw=[-1,0,0,0,255,0,-1,0,0,255,0,0,-1,0,255,0,0,0,1,0,0,0,0,0,1],function(t){return C0(t,iw)}),wS=k0(function(t,n){return S0(t,[1,0,0,0,n=x0(255*n,-255,255),0,1,0,0,n,0,0,1,0,n,0,0,0,1,0,0,0,0,0,1])}),SS=k0(function(t,n){var e;return n=x0(n,-1,1),S0(t,[(e=(n*=100)<0?127+n/100*127:127*(0==(e=n%1)?bS[n]:bS[Math.floor(n)]*(1-e)+bS[Math.floor(n)+1]*e)+127)/127,0,0,0,.5*(127-e),0,e/127,0,0,.5*(127-e),0,0,e/127,0,.5*(127-e),0,0,0,1,0,0,0,0,0,1])}),CS=(uw=[0,-1,0,-1,5,-1,0,-1,0],function(t){return a=uw,(u=t).toCanvas().then(function(t){return n=t,e=u.getType(),o=a,r=pS(n),i=function(t,n,e){for(var o=function(t,n,e){return e<t?t=e:t<n&&(t=n),t},r=Math.round(Math.sqrt(e.length)),i=Math.floor(r/2),u=t.data,a=n.data,c=t.width,s=t.height,l=0;l<s;l++)for(var f=0;f<c;f++){for(var d=0,m=0,g=0,p=0;p<r;p++)for(var h=0;h<r;h++){var v=o(f+h-i,0,c-1),b=4*(o(l+p-i,0,s-1)*c+v),y=e[p*r+h];d+=u[b]*y,m+=u[1+b]*y,g+=u[2+b]*y}var x=4*(l*c+f);a[x]=o(d,0,255),a[1+x]=o(m,0,255),a[2+x]=o(g,0,255)}return n}(r.getImageData(0,0,n.width,n.height),r.getImageData(0,0,n.width,n.height),o),r.putImageData(i,0,0),b0(n,e);var n,e,o,r,i});var u,a}),kS=(aw=function(t,n){return 255*Math.pow(t/255,1-n)},function(n,e){return n.toCanvas().then(function(t){return function(t,n,e){for(var o=pS(t),r=new Array(256),i=0;i<r.length;i++)r[i]=aw(i,e);var u=function(t,n){for(var e=t.data,o=0;o<e.length;o+=4)e[o]=n[e[o]],e[o+1]=n[e[o+1]],e[o+2]=n[e[o+2]];return t}(o.getImageData(0,0,t.width,t.height),r);return o.putImageData(u,0,0),b0(t,n)}(t,n.getType(),e)})}),OS=function(t,n,e){var o=g0(t),r=p0(t),i=n/o,u=e/r,a=!1;(i<.5||2<i)&&(i=i<.5?.5:2,a=!0),(u<.5||2<u)&&(u=u<.5?.5:2,a=!0);var c=_S(t,i,u);return a?c.then(function(t){return OS(t,n,e)}):c},_S=function(u,a,c){return new Vy(function(t){var n=g0(u),e=p0(u),o=Math.floor(n*a),r=Math.floor(e*c),i=d0(o,r);pS(i).drawImage(u,0,0,n,e,0,0,o,r),t(i)})},TS=function(t,n,e){var o=(e<0?360+e:e)*Math.PI/180,r=t.width,i=t.height,u=Math.sin(o),a=Math.cos(o),c=O0(Math.abs(r*a)+Math.abs(i*u)),s=O0(Math.abs(r*u)+Math.abs(i*a)),l=d0(c,s),f=pS(l);return f.translate(c/2,s/2),f.rotate(o),f.drawImage(t,-r/2,-i/2),b0(l,n)},ES=function(t,n,e){var o=d0(t.width,t.height),r=pS(o);return"v"===e?(r.scale(1,-1),r.drawImage(t,0,-o.height)):(r.scale(-1,1),r.drawImage(t,-o.width,0)),b0(o,n)},DS=function(t,n,e,o,r,i){var u=d0(r,i);return pS(u).drawImage(t,-e,-o),b0(u,n)},BS=Fr("toolbar.button.execute"),MS=((cw={})[Fi()]=["disabling","alloy.base.behaviour","toggling","toolbar-button-events"],cw),AS=Fr("update-menu-text"),FS=Fr("update-menu-icon"),IS={type:"separator"},RS=function(t,l){var n,e,o;return I((n=y(t)?t.split(" "):t,e=l,0<(o=R(n,function(t,n){return y(n)?""===n?t:"|"===n?0<t.length&&!H0(t[t.length-1])?t.concat([IS]):t:Tt(e,n.toLowerCase())?t.concat([e[n.toLowerCase()]]):t:t.concat([n])},[])).length&&H0(o[o.length-1])&&o.pop(),o),function(t,n){var e,o,r,i,u,a,c=function(t){if(H0(t))return t;var n=tt(t,"value").getOrThunk(function(){return Fr("generated-menu-item")});return Xo({value:n},t)}(n),s=(o=l,Tt(e=c,"getSubmenuItems")?(i=o,u=(r=e).getSubmenuItems(),a=RS(u,i),{item:r,menus:Xo(a.menus,cr(r.value,a.items)),expansions:Xo(a.expansions,cr(r.value,r.value))}):{item:e,menus:{},expansions:{}});return{menus:Xo(t.menus,s.menus),items:[s.item].concat(t.items),expansions:Xo(t.expansions,s.expansions)}},{menus:{},expansions:{},items:[]})},VS=rt([To("field1Name","field1"),To("field2Name","field2"),$u("onLockedChange"),Yu(["lockClass"]),To("locked",!1),Ef("coupledFieldBehaviours",[ud,Tf])]),PS=rt([K0("field1","field2"),K0("field2","field1"),qf({factory:sp,schema:[fo("dom")],name:"lock",overrides:function(t){return{buttonBehaviours:tc([zg.config({selected:t.locked,toggleClass:t.markers.lockClass,aria:{mode:"pressed"}})])}}})]),HS=Sl({name:"FormCoupledInputs",configFields:VS(),partFields:PS(),factory:function(o,t,n,e){return{uid:o.uid,dom:o.dom,components:t,behaviours:Df(o.coupledFieldBehaviours,[ud.config({find:vt.some}),Tf.config({store:{mode:"manual",getValue:function(t){var n=hl(t,o,["field1","field2"]),e={};return e[o.field1Name]=Tf.getValue(n.field1()),e[o.field2Name]=Tf.getValue(n.field2()),e},setValue:function(t,n){var e=hl(t,o,["field1","field2"]);nt(n,o.field1Name)&&Tf.setValue(e.field1(),n[o.field1Name]),nt(n,o.field2Name)&&Tf.setValue(e.field2(),n[o.field2Name])}}})]),apis:{getField1:function(t){return fl(t,o,"field1")},getField2:function(t){return fl(t,o,"field2")},getLock:function(t){return fl(t,o,"lock")}}}},apis:{getField1:function(t,n){return t.getField1(n)},getField2:function(t,n){return t.getField2(n)},getLock:function(t,n){return t.getLock(n)}}}),zS={undo:rt(Fr("undo")),redo:rt(Fr("redo")),zoom:rt(Fr("zoom")),back:rt(Fr("back")),apply:rt(Fr("apply")),swap:rt(Fr("swap")),transform:rt(Fr("transform")),tempTransform:rt(Fr("temp-transform")),transformApply:rt(Fr("transform-apply"))},NS=rt("save-state"),LS=rt("disable"),WS=rt("enable"),US={formActionEvent:by,saveState:NS,disable:LS,enable:WS},jS=tinymce.util.Tools.resolve("tinymce.geom.Rect"),GS=tinymce.util.Tools.resolve("tinymce.dom.DomQuery"),XS=tinymce.util.Tools.resolve("tinymce.util.Observable"),YS=tinymce.util.Tools.resolve("tinymce.util.VK");function qS(t,d){function m(t){if(nw(t),t.button!==p)return x(t);t.deltaX=t.screenX-h,t.deltaY=t.screenY-v,t.preventDefault(),d.drag(t)}var g,p,h,v,b=d.document||document,y=b.getElementById(d.handle||t),x=function(t){nw(t),GS(b).off("mousemove touchmove",m).off("mouseup touchend",x),g.remove(),d.stop&&d.stop(t)};return GS(y).on("mousedown touchstart",function(t){var n,e,o,r,i,u,a,c,s,l=(n=Math.max,e=b.documentElement,o=b.body,r=n(e.scrollWidth,o.scrollWidth),i=n(e.clientWidth,o.clientWidth),u=n(e.offsetWidth,o.offsetWidth),a=n(e.scrollHeight,o.scrollHeight),c=n(e.clientHeight,o.clientHeight),{width:r<u?i:r,height:a<n(e.offsetHeight,o.offsetHeight)?c:a});nw(t),t.preventDefault(),p=t.button;var f=y;h=t.screenX,v=t.screenY,s=window.getComputedStyle?window.getComputedStyle(f,null).getPropertyValue("cursor"):f.runtimeStyle.cursor,g=GS("<div></div>").css({position:"absolute",top:0,left:0,width:l.width,height:l.height,zIndex:2147483647,opacity:1e-4,cursor:s}).appendTo(b.body),GS(b).on("mousemove touchmove",m).on("mouseup touchend",x),d.start(t)}),{destroy:function(){GS(y).off()}}}function KS(t,n,e,o,r){return j0({name:t,icon:vt.some(n),disabled:e,tooltip:vt.some(t),primary:!1,borderless:!1},o,r)}function JS(t,n){n?dd.enable(t):dd.disable(t)}var $S=0,QS=function(s,e,l,o,r){function f(t,n){return{x:n.x-t.x,y:n.y-t.y,w:n.w,h:n.h}}function u(t,n,e,o){var r,i=n.x,u=n.y,a=n.w,c=n.h;i+=e*t.deltaX,u+=o*t.deltaY,a+=e*t.deltaW,c+=o*t.deltaH,s=jS.clamp({x:i,y:u,w:a=a<20?20:a,h:c=c<20?20:c},l,"move"===t.name),r=f(l,s),p.fire("updateRect",{rect:r}),g(r)}function i(t){n(s=t)}function n(n){function t(t,n){n.h<0&&(n.h=0),n.w<0&&(n.w=0),GS("#"+c+"-"+t,o).css({left:n.x,top:n.y,width:n.w,height:n.h})}aS.each(d,function(t){GS("#"+c+"-"+t.name,o).css({left:n.w*t.xMul+n.x,top:n.h*t.yMul+n.y})}),t("top",{x:e.x,y:e.y,w:e.w,h:n.y-e.y}),t("right",{x:n.x+n.w,y:n.y,w:e.w-n.x-n.w+e.x,h:n.h}),t("bottom",{x:e.x,y:n.y+n.h,w:e.w,h:e.h-n.y-n.h+e.y}),t("left",{x:e.x,y:n.y,w:n.x-e.x,h:n.h}),t("move",n)}var t,a="tox-",c="tox-crid-"+$S++,d=[{name:"move",xMul:0,yMul:0,deltaX:1,deltaY:1,deltaW:0,deltaH:0,label:"Crop Mask"},{name:"nw",xMul:0,yMul:0,deltaX:1,deltaY:1,deltaW:-1,deltaH:-1,label:"Top Left Crop Handle"},{name:"ne",xMul:1,yMul:0,deltaX:0,deltaY:1,deltaW:1,deltaH:-1,label:"Top Right Crop Handle"},{name:"sw",xMul:0,yMul:1,deltaX:1,deltaY:0,deltaW:-1,deltaH:1,label:"Bottom Left Crop Handle"},{name:"se",xMul:1,yMul:1,deltaX:0,deltaY:0,deltaW:1,deltaH:1,label:"Bottom Right Crop Handle"}],m=["top","right","bottom","left"],g=function(t){var n;i((n=l,{x:t.x+n.x,y:t.y+n.y,w:t.w,h:t.h}))};GS('<div id="'+c+'" class="'+a+'croprect-container" role="grid" aria-dropeffect="execute">').appendTo(o),aS.each(m,function(t){GS("#"+c,o).append('<div id="'+c+"-"+t+'"class="'+a+'croprect-block" style="display: none" data-mce-bogus="all">')}),aS.each(d,function(t){GS("#"+c,o).append('<div id="'+c+"-"+t.name+'" class="'+a+"croprect-handle "+a+"croprect-handle-"+t.name+'"style="display: none" data-mce-bogus="all" role="gridcell" tabindex="-1" aria-label="'+t.label+'" aria-grabbed="false" title="'+t.label+'">')}),t=aS.map(d,function(n){var e;return qS(c,{document:o.ownerDocument,handle:c+"-"+n.name,start:function(){e=s},drag:function(t){u(n,e,t.deltaX,t.deltaY)}})}),n(s),GS(o).on("focusin focusout",function(t){GS(t.target).attr("aria-grabbed","focus"===t.type?"true":"false")}),GS(o).on("keydown",function(n){var i;function t(t,n,e,o,r){t.stopPropagation(),t.preventDefault(),u(i,e,o,r)}switch(aS.each(d,function(t){if(n.target.id===c+"-"+t.name)return i=t,!1}),n.keyCode){case YS.LEFT:t(n,0,s,-10,0);break;case YS.RIGHT:t(n,0,s,10,0);break;case YS.UP:t(n,0,s,0,-10);break;case YS.DOWN:t(n,0,s,0,10);break;case YS.ENTER:case YS.SPACEBAR:n.preventDefault(),r()}});var p=aS.extend({toggleVisibility:function(t){var n=aS.map(d,function(t){return"#"+c+"-"+t.name}).concat(aS.map(m,function(t){return"#"+c+"-"+t})).join(",");t?GS(n,o).show():GS(n,o).hide()},setClampRect:function(t){l=t,n(s)},setRect:i,getInnerRect:function(){return f(l,s)},setInnerRect:g,setViewPortRect:function(t){e=t,n(s)},destroy:function(){aS.each(t,function(t){t.destroy()}),t=[]}},XS);return p};function ZS(t){var e,o,n,r,i=Vo(t),u=dc(),a=(o=-1,{data:e=[],add:function(t){var n=e.splice(++o);return e.push(t),{state:t,removed:n}},undo:function(){if(n())return e[--o]},redo:function(){if(r())return e[++o]},canUndo:n=function(){return 0<o},canRedo:r=function(){return-1!==o&&o<e.length-1}});function c(t){i.set(t)}function s(t){URL.revokeObjectURL(t.url)}function l(t){var n=f(t);c(n);var e=a.add(n).removed;return aS.each(e,s),n.url}a.add(t);function f(t){return{blob:t,url:URL.createObjectURL(t)}}function d(){u.on(s),u.clear()}return{getBlobState:function(){return i.get()},setBlobState:c,addBlobState:l,getTempState:function(){return u.get().getOrThunk(i.get)},updateTempState:function(t){var n=f(t);return d(),u.set(n),n.url},addTempState:function(t){var n=f(t);return u.set(n),n.url},applyTempState:function(n){return u.get().fold(st,function(t){l(t.blob),n()})},destroyTempState:d,undo:function(){var t=a.undo();return c(t),t.url},redo:function(){var t=a.redo();return c(t),t.url},getHistoryStates:function(){return{undoEnabled:a.canUndo(),redoEnabled:a.canRedo()}}}}function tC(t,n){function i(t){var n=b.getHistoryStates();S.updateButtonUndoStates(t,n.undoEnabled,n.redoEnabled),vr(t,US.formActionEvent,{name:US.saveState(),value:n.undoEnabled})}function u(t){return t.toBlob()}function a(t){vr(t,US.formActionEvent,{name:US.disable(),value:{}})}function c(n,t,e,o,r){a(n),y0(t).then(e).then(u).then(o).then(function(t){return x(n,t)}).then(function(){i(n),r(),y(n)}).catch(function(t){console.log(t),n.getSystem().isConnected()&&y(n)})}function r(t,n,e){c(t,b.getBlobState().blob,n,function(t){return b.updateTempState(t)},e)}function s(t){var n=b.getBlobState().url;return b.destroyTempState(),i(t),n}var e,o,l,f,d,m,g,p,h,v,b=ZS(t.currentState),y=function(t){C.getApplyButton(t).each(function(t){dd.enable(t)}),vr(t,US.formActionEvent,{name:US.enable(),value:{}})},x=function(t,n){return a(t),w.updateSrc(t,n)},w=(f=t.currentState.url,d=Pm({dom:{tag:"div",classes:["tox-image-tools__image-bg"],attributes:{role:"presentation"}}}),m=Vo(1),g=dc(),p=Vo({x:0,y:0,w:1,h:1}),h=Vo({x:0,y:0,w:1,h:1}),{memContainer:v=Pm(uy.sketch({dom:{tag:"div",classes:["tox-image-tools__image"]},components:[d.asSpec(),{dom:{tag:"img",attributes:{src:f}}},{dom:{tag:"div"},behaviours:tc([fm("image-panel-crop-events",[eu(function(t){v.getOpt(t).each(function(t){var n=t.element.dom,e=QS({x:10,y:10,w:100,h:100},{x:0,y:0,w:200,h:200},{x:0,y:0,w:200,h:200},n,st);e.toggleVisibility(!1),e.on("updateRect",function(t){var n=t.rect,e=m.get(),o={x:Math.round(n.x/e),y:Math.round(n.y/e),w:Math.round(n.w/e),h:Math.round(n.h/e)};p.set(o)}),g.set(e)})})])])}],containerBehaviours:tc([Fg.config({}),fm("image-panel-events",[eu(function(t){O(t,f)})])])})),updateSrc:O,zoom:function(t,n){var e=m.get(),o=0<n?Math.min(2,e+.1):Math.max(.1,e-.1);m.set(o),v.getOpt(t).each(function(t){var n=t.components()[1].element;k(t,n)})},showCrop:function(){g.on(function(t){t.toggleVisibility(!0)})},hideCrop:function(){g.on(function(t){t.toggleVisibility(!1)})},getRect:function(){return p.get()},getMeasurements:function(){var t=h.get();return{width:t.w,height:t.h}}}),S=(o=Pm(KS("Undo","undo",!0,function(t){vr(t,zS.undo(),{direction:1})},e=n)),l=Pm(KS("Redo","redo",!0,function(t){vr(t,zS.redo(),{direction:1})},e)),{container:uy.sketch({dom:{tag:"div",classes:["tox-image-tools__toolbar","tox-image-tools__sidebar"]},components:[o.asSpec(),l.asSpec(),KS("Zoom in","zoom-in",!1,function(t){vr(t,zS.zoom(),{direction:1})},e),KS("Zoom out","zoom-out",!1,function(t){vr(t,zS.zoom(),{direction:-1})},e)]}),updateButtonUndoStates:function(t,n,e){o.getOpt(t).each(function(t){JS(t,n)}),l.getOpt(t).each(function(t){JS(t,e)})}}),C=tw(w,n);function k(t,s){v.getOpt(t).each(function(t){var e=m.get(),o=kn(t.element),r=xn(t.element),i=s.dom.naturalWidth*e,u=s.dom.naturalHeight*e,a=Math.max(0,o/2-i/2),c=Math.max(0,r/2-u/2),n={left:a.toString()+"px",top:c.toString()+"px",width:i.toString()+"px",height:u.toString()+"px",position:"absolute"};dn(s,n),d.getOpt(t).each(function(t){dn(t.element,n)}),g.on(function(t){var n=p.get();t.setRect({x:n.x*e+a,y:n.y*e+c,w:n.w*e,h:n.h*e}),t.setClampRect({x:a,y:c,w:i,h:u}),t.setViewPortRect({x:0,y:0,w:o,h:r})})})}function O(t,n){var e,i=At.fromTag("img");return on(i,"src",n),e=i.dom,new Bp(function(t){var n=function(){e.removeEventListener("load",n),t(e)};e.complete?t(e):e.addEventListener("load",n)}).then(function(){t.getSystem().isConnected()&&v.getOpt(t).map(function(t){var n=ku({element:i});Fg.replaceAt(t,1,vt.some(n));var e=h.get(),o={x:0,y:0,w:i.dom.naturalWidth,h:i.dom.naturalHeight};h.set(o);var u,r=jS.inflate(o,-20,-20);p.set(r),e.w===o.w&&e.h===o.h||(u=i,v.getOpt(t).each(function(t){var n=kn(t.element),e=xn(t.element),o=u.dom.naturalWidth,r=u.dom.naturalHeight,i=Math.min(n/o,e/r);1<=i?m.set(1):m.set(i)})),k(t,i)})})}return{dom:{tag:"div",attributes:{role:"presentation"}},components:[C.memContainer.asSpec(),w.memContainer.asSpec(),S.container],behaviours:tc([Tf.config({store:{mode:"manual",getValue:function(){return b.getBlobState()}}}),fm("image-tools-events",[Cr(zS.undo(),function(n,t){var e=b.undo();x(n,e).then(function(t){y(n),i(n)})}),Cr(zS.redo(),function(n,t){var e=b.redo();x(n,e).then(function(t){y(n),i(n)})}),Cr(zS.zoom(),function(t,n){var e=n.event.direction;w.zoom(t,e)}),Cr(zS.back(),function(t,n){var e,o=s(e=t);x(e,o).then(function(t){y(e)}),(0,n.event.swap)(),w.hideCrop()}),Cr(zS.apply(),function(t,n){b.applyTempState(function(){s(t),(0,n.event.swap)()})}),Cr(zS.transform(),function(t,n){return r(t,n.event.transform,st)}),Cr(zS.tempTransform(),function(t,n){var e=n.event.transform;c(t,b.getTempState().blob,e,function(t){return b.addTempState(t)},st)}),Cr(zS.transformApply(),function(t,n){var e=t,o=n.event.transform,r=n.event.swap,i=b.getBlobState().blob;c(e,i,o,function(t){var n=b.addBlobState(t);return s(e),n},r)}),Cr(zS.swap(),function(n,t){S.updateButtonUndoStates(n,!1,!1);var e=t.event.transform,o=t.event.swap;e.fold(function(){o()},function(t){r(n,t,o)})})]),ow()])}}function nC(t){return!Tt(t,"items")}function eC(t,n){function e(t){return{dom:{tag:"td",innerHtml:n.translate(t)}}}return{dom:{tag:"table",classes:["tox-dialog__table"]},components:[{dom:{tag:"thead"},components:[{dom:{tag:"tr"},components:M(t.header,function(t){return{dom:{tag:"th",innerHtml:n.translate(t)}}})}]},{dom:{tag:"tbody"},components:M(t.cells,function(t){return{dom:{tag:"tr"},components:M(t,e)}})}],behaviours:tc([fy.config({}),Vg.config({})])}}function oC(e,n){var t=e.label.map(function(t){return Zb(t,n)}),o=[dd.config({disabled:function(){return e.disabled||n.isDisabled()}}),mv(),Mg.config({mode:"execution",useEnter:!0!==e.multiline,useControlEnter:!0===e.multiline,execute:function(t){return hr(t,yy),vt.some(!0)}}),fm("textfield-change",[Cr(wi(),function(t,n){vr(t,py,{name:e.name})}),Cr(Mi(),function(t,n){vr(t,py,{name:e.name})})]),fy.config({})],r=e.validation.map(function(o){return Gy.config({getRoot:function(t){return Yt(t.element)},invalidClass:"tox-invalid",validator:{validate:function(t){var n=Tf.getValue(t),e=o.validator(n);return Ly(!0===e?Re.value(n):Re.error(e))},validateOnLoad:o.validateOnLoad}})}).toArray(),i=e.placeholder.fold(rt({}),function(t){return{placeholder:n.translate(t)}}),u=e.inputMode.fold(rt({}),function(t){return{inputmode:t}}),a=lt(lt({},i),u);return Qb(t,sy.parts.field({tag:!0===e.multiline?"textarea":"input",inputAttributes:a,inputClasses:[e.classname],inputBehaviours:tc(ft([o,r])),selectOnFocus:!1,factory:Oy}),(e.flex?["tox-form__group--stretched"]:[]).concat(e.maximized?["tox-form-group--maximize"]:[]),[dd.config({disabled:function(){return e.disabled||n.isDisabled()},onDisabled:function(t){sy.getField(t).each(dd.disable)},onEnabled:function(t){sy.getField(t).each(dd.enable)}}),mv()])}function rC(t){var n=Vo(null);return xu({readState:function(){return{timer:null!==n.get()?"set":"unset"}},setTimer:function(t){n.set(t)},cancel:function(){var t=n.get();null!==t&&t.cancel()}})}function iC(t,n,e){var o=Tf.getValue(e);Tf.setValue(n,o),u1(n)}function uC(t,n){var e=t.element,o=$r(e),r=e.dom;"number"!==rn(e,"type")&&n(r,o)}function aC(t){return{type:"menuitem",value:t.url,text:t.title,meta:{attach:t.attach},onAction:st}}function cC(t,n){return{type:"menuitem",value:n,text:t,meta:{attach:void 0},onAction:st}}function sC(t,n){return e=t,M(F(n,function(t){return t.type===e}),aC);var e}function lC(t,n){var e=t.toLowerCase();return F(n,function(t){return ut((void 0!==t.meta&&void 0!==t.meta.text?t.meta:t).text.toLowerCase(),e)||ut(t.value.toLowerCase(),e)})}function fC(u,a,c){function r(t){var n=Tf.getValue(t);c.addToHistory(n.value,u.filetype)}var t,n,e,o,i=a.shared.providers,s=sy.parts.field({factory:l1,dismissOnBlur:!0,inputClasses:["tox-textfield"],sandboxClasses:["tox-dialog__popups"],inputAttributes:{"aria-errormessage":g1,type:"url"},minChars:0,responseTime:0,fetch:function(t){var e,o,n,r,i=z0((e=u.filetype,o=c,n=Tf.getValue(t),r=void 0!==n.meta.text?n.meta.text:n.value,o.getLinkInformation().fold(function(){return[]},function(t){var n=lC(r,M(o.getHistory(e),function(t){return cC(t,t)}));return"file"===e?R([n,lC(r,sC("header",t.targets)),lC(r,ft([vt.from(t.anchorTop).map(function(t){return cC("<top>",t)}).toArray(),sC("anchor",t.targets),vt.from(t.anchorBottom).map(function(t){return cC("<bottom>",t)}).toArray()]))],function(t,n){return 0===t.length||0===n.length?t.concat(n):t.concat(m1,n)},[]):n})),xh.BUBBLE_TO_SANDBOX,a,!1);return Ly(i)},getHotspot:function(t){return p.getOpt(t)},onSetValue:function(t,n){t.hasConfigured(Gy)&&Gy.run(t).get(st)},typeaheadBehaviours:tc(ft([c.getValidationHandler().map(function(e){return Gy.config({getRoot:function(t){return Yt(t.element)},invalidClass:"tox-control-wrap--status-invalid",notify:{onInvalid:function(t,n){f.getOpt(t).each(function(t){on(t.element,"title",i.translate(n))})}},validator:{validate:function(t){var n=Tf.getValue(t);return d1(function(o){e({type:u.filetype,url:n.value},function(t){var n,e;"invalid"===t.status?(n=Re.error(t.message),o(n)):(e=Re.value(t.message),o(e))})})},validateOnLoad:!1}})}).toArray(),[dd.config({disabled:function(){return u.disabled||i.isDisabled()}}),fy.config({}),fm("urlinput-events",ft(["file"===u.filetype?[Cr(wi(),function(t){vr(t,py,{name:u.name})})]:[],[Cr(Si(),function(t){vr(t,py,{name:u.name}),r(t)}),Cr(Mi(),function(t){vr(t,py,{name:u.name}),r(t)})]]))]])),eventOrder:((t={})[wi()]=["streaming","urlinput-events","invalidating"],t),model:{getDisplayText:function(t){return t.value},selectsOver:!1,populateFromBrowse:!1},markers:{openClass:"tox-textfield--popup-open"},lazySink:a.shared.getSink,parts:{menu:$p(0,0,"normal")},onExecute:function(t,n,e){vr(n,yy,{})},onItemExecute:function(t,n,e,o){r(t),vr(t,py,{name:u.name})}}),l=u.label.map(function(t){return Zb(t,i)}),f=Pm((n="invalid",e=vt.some(g1),jm("warning",{tag:"div",classes:["tox-icon","tox-control-wrap__status-icon-"+n],attributes:lt({title:i.translate(o=void 0===o?n:o),"aria-live":"polite"},e.fold(function(){return{}},function(t){return{id:t}}))},i.icons))),d=Pm({dom:{tag:"div",classes:["tox-control-wrap__status-icon-wrap"]},components:[f.asSpec()]}),m=c.getUrlPicker(u.filetype),g=Fr("browser.url.event"),p=Pm({dom:{tag:"div",classes:["tox-control-wrap"]},components:[s,d.asSpec()],behaviours:tc([dd.config({disabled:function(){return u.disabled||i.isDisabled()}})])}),h=Pm(X0({name:u.name,icon:vt.some("browse"),text:u.label.getOr(""),disabled:u.disabled,primary:!1,borderless:!0},function(t){return hr(t,g)},i,[],["tox-browse-url"]));return sy.sketch({dom:gy([]),components:l.toArray().concat([{dom:{tag:"div",classes:["tox-form__controls-h-stack"]},components:ft([[p.asSpec()],m.map(function(){return h.asSpec()}).toArray()])}]),fieldBehaviours:tc([dd.config({disabled:function(){return u.disabled||i.isDisabled()},onDisabled:function(t){sy.getField(t).each(dd.disable),h.getOpt(t).each(dd.disable)},onEnabled:function(t){sy.getField(t).each(dd.enable),h.getOpt(t).each(dd.enable)}}),mv(),fm("url-input-events",[Cr(g,function(o){ud.getCurrent(o).each(function(n){var t=Tf.getValue(n),e=lt({fieldname:u.name},t);m.each(function(t){t(e).get(function(t){Tf.setValue(n,t),vr(o,py,{name:u.name})})})})})])])})}function dC(r){return function(n,e,o){return tt(e,"name").fold(function(){return r(e,o)},function(t){return n.field(t,r(e,o))})}}function mC(n,t,e){var o=Xo(e,{shared:{interpreter:function(t){return v1(n,t,o)}}});return v1(n,t,o)}function gC(t,n,e){function o(){return At.fromDom(t.getContentAreaContainer())}function r(){return p||!e()}var i,u,a,c,s,l,f,d,m,g,p=av(t);return{inlineDialog:(f=o,d=n,m=r,g={maxHeightFunction:Ic()},function(){return m()?{type:"node",root:tn(f()),node:vt.from(f()),bubble:xc(12,12,b1),layouts:{onRtl:function(){return[Bm]},onLtr:function(){return[Dm]}},overrides:g}:{type:"hotspot",hotspot:d(),bubble:xc(-12,12,b1),layouts:{onRtl:function(){return[Ga]},onLtr:function(){return[Xa]}},overrides:g}}),banner:(c=o,s=n,l=r,function(){return l()?{type:"node",root:tn(c()),node:vt.from(c()),layouts:{onRtl:function(){return[up]},onLtr:function(){return[up]}}}:{type:"hotspot",hotspot:s(),layouts:{onRtl:function(){return[Ja]},onLtr:function(){return[Ja]}}}}),cursor:(u=t,function(){return{type:"selection",root:a(),getSelection:function(){var t=u.selection.getRng();return vt.some(fs.range(At.fromDom(t.startContainer),t.startOffset,At.fromDom(t.endContainer),t.endOffset))}}}),node:(i=a=function(){return At.fromDom(t.getBody())},function(t){return{type:"node",root:i(),node:t}})}}function pC(i){return vt.from(i.getParam("style_formats")).filter(c).map(function(t){var n,e,o=(n=i,e=x1(t),n.formatter?r(e.customFormats):n.on("init",function(){r(e.customFormats)}),e.formats);function r(t){St(t,function(t){n.formatter.has(t.name)||n.formatter.register(t.name,t.format)})}return i.getParam("style_formats_merge",!1,"boolean")?y1.concat(o):o}).getOr(y1)}function hC(t,n,e){var o={type:"formatter",isSelected:n(t.format),getStylePreview:e(t.format)};return Xo(t,o)}function vC(c,t,s,l){var f=function(t){return M(t,function(t){var n,e,o,r,i,u=kt(t);if(nt(t,"items")){var a=f(t.items);return Xo(Xo(t,{type:"submenu"}),{getStyleItems:rt(a)})}return nt(t,"format")?hC(t,s,l):1===u.length&&wt(u,"title")?Xo(t,{type:"separator"}):(r={type:"formatter",format:o="custom-"+(e=y((n=t).name)?n.name:Fr(n.title)),isSelected:s(o),getStylePreview:l(o)},i=Xo(n,r),c.formatter.register(e,i),i)})};return f(t)}function bC(e){return function(t){if(d(n=t)&&1===n.nodeType){if(t.contentEditable===e)return!0;if(t.getAttribute("data-mce-contenteditable")===e)return!0}var n;return!1}}function yC(t,n,e,o,r){return{type:t,title:n,url:e,level:o,attach:r}}function xC(t){return t.innerText||t.textContent}function wC(t){return t&&"A"===t.nodeName&&void 0!==(t.id||t.name)&&Yk(t)}function SC(t){return t&&/^(H[1-6])$/.test(t.nodeName)}function CC(t){return SC(t)&&Yk(t)}function kC(t){var n,e=t.id||Fr("h");return yC("header",xC(t),"#"+e,SC(n=t)?parseInt(n.nodeName.substr(1),10):0,function(){t.id=e})}function OC(t){var n=t.id||t.name;return yC("anchor",xC(t)||"#"+n,"#"+n,0,st)}function _C(t){return 0<w1(t.title).length}function TC(t){return y(t)&&/^https?/.test(t)}function EC(t){return x(t)&&Q(t,function(t){return!(c(n=t)&&n.length<=5&&N(n,TC));var n}).isNone()}function DC(){var t,n=lb.getItem(O1);if(null===n)return{};try{t=JSON.parse(n)}catch(t){if(t instanceof SyntaxError)return console.log("Local storage "+O1+" was not valid JSON",t),{};throw t}return EC(t)?t:(console.log("Local storage "+O1+" was not valid format",t),{})}function BC(t){return tt(DC(),t).getOr([])}function MC(n,t){var e,o;TC(n)&&(o=F(tt(e=DC(),t).getOr([]),function(t){return t!==n}),e[t]=[n].concat(o).slice(0,5),function(t){if(!EC(t))throw new Error("Bad format for history:\n"+JSON.stringify(t));lb.setItem(O1,JSON.stringify(t))}(e))}function AC(t){return!!t}function FC(t){return dt(aS.makeMap(t,/[, ]/),AC)}function IC(t){return vt.from(t.getParam("file_picker_callback")).filter(m)}function RC(t){return vt.from(t).filter(y).getOrUndefined()}function VC(l){return{getHistory:BC,addToHistory:MC,getLinkInformation:function(){return!1===(t=l).getParam("typeahead_urls")?vt.none():vt.some({targets:k1(t.getBody()),anchorTop:RC(t.getParam("anchor_top","#top")),anchorBottom:RC(t.getParam("anchor_bottom","#bottom"))});var t},getValidationHandler:function(){return vt.from(void 0===(n=(t=l).getParam("file_picker_validator_handler",void 0,"function"))?t.getParam("filepicker_validator_handler",void 0,"function"):n);var t,n},getUrlPicker:function(t){return n=c=l,e=s=t,r=vt.some((o=n).getParam("file_picker_types")).filter(AC),i=vt.some(o.getParam("file_browser_callback_types")).filter(AC),u=r.or(i).map(FC),a=IC(o).fold(O,function(t){return u.fold(_,function(t){return 0<kt(t).length&&t})}),(w(a)?a?IC(n):vt.none():a[e]?IC(n):vt.none()).map(function(o){return function(n){return Ny(function(e){var t=lt({filetype:s,fieldname:n.fieldname},vt.from(n.meta).getOr({}));o.call(c,function(t,n){if(!y(t))throw new Error("Expected value to be string");if(void 0!==n&&!x(n))throw new Error("Expected meta to be a object");e({value:t,meta:n})},n.value,t)})}});var n,e,o,r,i,u,a,c,s}}}function PC(t,n,e){var o,r,i,u,a,c,s,l,f,d,m,g,p,h=Vo(!1),v={isPositionedAtTop:function(){return"top"===o.get()},getDockingMode:(o=Vo(iv(n)?"bottom":"top")).get,setDockingMode:o.set},b={shared:{providers:{icons:function(){return n.ui.registry.getAll().icons},menuItems:function(){return n.ui.registry.getAll().menuItems},translate:lp.translate,isDisabled:function(){return n.mode.isReadOnly()||n.ui.isDisabled()},getSetting:n.getParam.bind(n)},interpreter:function(t){return v1(h1,t,b)},anchors:gC(n,e,v.isPositionedAtTop),header:v,getSink:function(){return Re.value(t)}},urlinput:VC(n),styleselect:(f=Vo([]),d=Vo([]),m=Vo([]),g=Vo([]),p=Vo(!(l=function(t){var n=t.items;return void 0!==n&&0<n.length?z(n,l):[t.format]})),(s=n).on("PreInit",function(t){var n=pC(s),e=vC(s,n,y,x);f.set(e),d.set(z(e,l))}),s.on("addStyleModifications",function(t){var n=vC(s,t.items,y,x);m.set(n),p.set(t.replace),g.set(z(n,l))}),{getData:function(){var t=p.get()?[]:f.get(),n=m.get();return t.concat(n)},getFlattenedKeys:function(){var t=p.get()?[]:d.get(),n=g.get();return t.concat(n)}}),colorinput:{colorPicker:function(t,n){Bb(c)(t,n)},hasCustomColors:function(){return db(a)},getColors:function(){return mb(u)},getColorCols:(i=u=a=c=n,function(){return pb(i)})},dialog:{isDraggableModal:(r=n,function(){return r.getParam("draggable_modal",!1,"boolean")})},isContextMenuOpen:function(){return h.get()},setContextMenuState:function(t){return h.set(t)}};function y(t){return function(){return s.formatter.match(t)}}function x(n){return function(){var t=s.formatter.get(n);return void 0!==t?vt.some({tag:0<t.length&&(t[0].inline||t[0].block)||"div",styles:s.dom.parseStyle(s.formatter.getCssText(n))}):vt.none()}}return b}function HC(t){return(mt(pn(t,"position"),"fixed")?vt.none():qt(t)).orThunk(function(){var e=At.fromTag("span");return Yt(t).bind(function(t){_e(t,e);var n=qt(e);return Te(e),n})})}function zC(t){return HC(t).map(Cn).getOrThunk(function(){return Se(0,0)})}function NC(t,n){var e=t.element;Xr(e,n.transitionClass),Yr(e,n.fadeOutClass),Xr(e,n.fadeInClass),n.onShow(t)}function LC(t,n){var e=t.element;Xr(e,n.transitionClass),Yr(e,n.fadeInClass),Xr(e,n.fadeOutClass),n.onHide(t)}function WC(t,n,e){return N(t,function(t){switch(t){case"bottom":return n.bottom<=e.bottom;case"top":return n.y>=e.y}})}function UC(n,t){return t.getInitialPos().map(function(t){return Be(t.bounds.x,t.bounds.y,kn(n),xn(n))})}function jC(e,o,r){return r.getInitialPos().bind(function(t){switch(r.clearInitialPos(),t.position){case"static":return vt.some(V1.static());case"absolute":var n=HC(e).map(Me).getOrThunk(function(){return Me(ve())});return vt.some(V1.absolute(Ta("absolute",tt(t.style,"left").map(function(t){return o.x-n.x}),tt(t.style,"top").map(function(t){return o.y-n.y}),tt(t.style,"right").map(function(t){return n.right-o.right}),tt(t.style,"bottom").map(function(t){return n.bottom-o.bottom}))));default:return vt.none()}})}function GC(t,n,e){var o,r,i,u=t.element;return mt(pn(u,"position"),"fixed")?(r=n,UC(o=u,i=e).filter(function(t){return WC(i.getModes(),t,r)}).bind(function(t){return jC(o,t,i)})):function(t,n,e){var r,o,i=Me(t);if(WC(e.getModes(),i,n))return vt.none();r=t,o=i,e.setInitialPos({style:function(){var t={},n=r.dom;if(ct(n))for(var e=0;e<n.style.length;e++){var o=n.style.item(e);t[o]=n.style[o]}return t}(),position:gn(r,"position")||"static",bounds:o});var u=Ae(),a=i.x-u.x,c=n.y-u.y,s=u.bottom-n.bottom,l=i.y<=n.y;return vt.some(V1.fixed(Ta("fixed",vt.some(a),l?vt.some(c):vt.none(),vt.none(),l?vt.none():vt.some(s))))}(u,n,e)}function XC(n,t,e){e.setDocked(!1),St(["left","right","top","bottom","position"],function(t){return vn(n.element,t)}),t.onUndocked(n)}function YC(t,n,e,o){var r="fixed"===o.position;e.setDocked(r),Ea(t.element,o),(r?n.onDocked:n.onUndocked)(t)}function qC(o,t,r,i,u){void 0===u&&(u=!1),t.contextual.each(function(e){e.lazyContext(o).each(function(t){var n=t.y<i.bottom&&t.bottom>i.y;n!==r.isVisible()&&(r.setVisible(n),u&&!n?(Kr(o.element,[e.fadeOutClass]),e.onHide(o)):(n?NC:LC)(o,e))})})}function KC(t,n,e){var o,r,i,u,a,c;e.isDocked()&&(r=n,i=e,c=(o=t).element,i.setDocked(!1),UC(a=o.element,u=i).bind(function(t){return jC(a,t,u)}).each(function(t){t.fold(function(){return XC(o,r,i)},function(t){return YC(o,r,i,t)},st)}),i.setVisible(!0),r.contextual.each(function(t){Jr(c,[t.fadeInClass,t.fadeOutClass,t.transitionClass]),t.onShow(o)}),P1(o,r,i))}function JC(t,n){return wt(N1.getModes(t),n)}function $C(r){var i=r.element;Yt(i).each(function(t){var n,e,o="padding-"+N1.getModes(r)[0];N1.isDocked(r)?(n=kn(t),fn(i,"width",n+"px"),fn(t,o,wn(e=i)+(parseInt(gn(e,"margin-top"),10)||0)+(parseInt(gn(e,"margin-bottom"),10)||0)+"px")):(vn(i,"width"),vn(t,o))})}function QC(t,n){n?(Yr(t,W1.fadeOutClass),Kr(t,[W1.transitionClass,W1.fadeInClass])):(Yr(t,W1.fadeInClass),Kr(t,[W1.fadeOutClass,W1.transitionClass]))}function ZC(t,n){var e=At.fromDom(t.getContainer());n?(Xr(e,U1),Yr(e,j1)):(Xr(e,j1),Yr(e,U1))}function tk(u,t){function o(n){r().each(function(t){return n(t.element)})}function n(t){u.inline||$C(t),ZC(u,N1.isDocked(t)),t.getSystem().broadcastOn([bf()],{}),r().each(function(t){return t.getSystem().broadcastOn([bf()],{})})}var e,i=dc(),r=t.getSink,a=u.inline?[]:[rc.config({channels:((e={})[L1()]={onReceive:$C},e)})];return H([Vg.config({}),N1.config({contextual:lt({lazyContext:function(t){var n=wn(t.element),e=u.inline?u.getContentAreaContainer():u.getContainer(),o=Me(At.fromDom(e)),r=o.height-n,i=o.y+(JC(t,"top")?0:n);return vt.some(Be(o.x,i,o.width,r))},onShow:function(){o(function(t){return QC(t,!0)})},onShown:function(r){o(function(t){return Jr(t,[W1.transitionClass,W1.fadeInClass])}),i.get().each(function(t){var n,e=r.element,o=Ut(n=t);ka(o).filter(function(t){return!Lt(n,t)}).filter(function(t){return Lt(t,At.fromDom(o.dom.body))||Wt(e,t)}).each(function(){return Sa(n)}),i.clear()})},onHide:function(t){var n=t.element,e=r;Oa(n).orThunk(function(){return e().toOptional().bind(function(t){return Oa(t.element)})}).fold(i.clear,i.set),o(function(t){return QC(t,!1)})},onHidden:function(){o(function(t){return Jr(t,[W1.transitionClass])})}},W1),lazyViewport:function(t){var n=Ae(),e=u.getParam("toolbar_sticky_offset",0,"number"),o=n.y+(JC(t,"top")?e:0),r=n.height-(JC(t,"bottom")?e:0);return Be(n.x,o,n.width,r)},modes:[t.header.getDockingMode()],onDocked:n,onUndocked:n})],a,!0)}function nk(t){return uo("menubutton",q1,t)}function ek(n,t){return t.getAnimationRoot.fold(function(){return n.element},function(t){return t(n)})}function ok(t){return t.dimension.property}function rk(t,n){return t.dimension.getDimension(n)}function ik(t,n){Jr(ek(t,n),[n.shrinkingClass,n.growingClass])}function uk(t,n){Yr(t.element,n.openClass),Xr(t.element,n.closedClass),fn(t.element,ok(n),"0px"),bn(t.element)}function ak(t,n){Yr(t.element,n.closedClass),Xr(t.element,n.openClass),vn(t.element,ok(n))}function ck(t,n,e,o){e.setCollapsed(),fn(t.element,ok(n),rk(n,t.element)),bn(t.element),ik(t,n),uk(t,n),n.onStartShrink(t),n.onShrunk(t)}function sk(t,n,e){var o=rk(n,t.element);("0px"===o?ck:function(t,n,e,o){var r=o.getOrThunk(function(){return rk(n,t.element)});e.setCollapsed(),fn(t.element,ok(n),r),bn(t.element);var i=ek(t,n);Yr(i,n.growingClass),Xr(i,n.shrinkingClass),uk(t,n),n.onStartShrink(t)})(t,n,e,vt.some(o))}function lk(t,n,e){var o=ek(t,n),r=qr(o,n.shrinkingClass),i=rk(n,t.element);ak(t,n);var u=rk(n,t.element);(r?function(){fn(t.element,ok(n),i),bn(t.element)}:function(){uk(t,n)})(),Yr(o,n.shrinkingClass),Xr(o,n.growingClass),ak(t,n),fn(t.element,ok(n),u),e.setExpanded(),n.onStartGrow(t)}function fk(t,n,e){return!0===qr(ek(t,n),n.growingClass)}function dk(t,n,e){return!0===qr(ek(t,n),n.shrinkingClass)}function mk(t){return"<alloy.field."+t+">"}function gk(t){return{element:function(){return t.element.dom}}}function pk(t,e){ud.getCurrent(t).each(function(t){return Fg.set(t,[(n=e,oO.sketch(function(t){return{dom:{tag:"div",classes:["tox-sidebar__pane-container"]},components:(e=t,r=M(kt(o=n),function(t){var n=o[t],e=ao(uo("sidebar",rO,n));return{name:t,getApi:gk,onSetup:e.onSetup,onShow:e.onShow,onHide:e.onHide}}),M(r,function(t){var n=Vo(st);return e.slot(t.name,{dom:{tag:"div",classes:["tox-sidebar__pane"]},behaviours:Yh([pv(t,n),hv(t,n),Cr(Ki(),function(n,t){var e=t.event;V(r,function(t){return t.name===e.name}).each(function(t){(e.visible?t.onShow:t.onHide)(t.getApi(n))})})])})})),slotBehaviours:Yh([eu(function(t){return oO.hideAllSlots(t)})])};var e,o,r}))]);var n})}function hk(t){return ud.getCurrent(t).bind(function(t){return Z1.isGrowing(t)||Z1.hasGrown(t)?ud.getCurrent(t).bind(function(n){return V(oO.getSlotNames(n),function(t){return oO.isShowing(n,t)})}):vt.none()})}function vk(t){var n=At.fromHtml(t),e=Kt(n),o=R(void 0!==n.dom.attributes?n.dom.attributes:[],function(t,n){var e;return"class"===n.name?t:lt(lt({},t),((e={})[n.name]=n.value,e))},{}),r=Array.prototype.slice.call(n.dom.classList,0),i=0===e.length?{}:{innerHtml:Br(n)};return lt({tag:Ft(n),classes:r,attributes:o},i)}function bk(t){return ud.getCurrent(t).each(function(t){return Sa(t.element)})}function yk(f,d,m){function n(t){var n;!g.get()||"focusin"===(n=t).type&&(n.composed?Y(n.composedPath()):vt.from(n.target)).map(At.fromDom).filter(Gn).exists(function(t){return qr(t,"mce-pastebin")})||(t.preventDefault(),bk(d()),f.editorManager.setActive(f))}var g=Vo(!1),e=dc();function o(t){var n,e,o,r,i,u,a,c,s,l;t!==g.get()&&(g.set(t),n=f,e=d(),o=t,r=m.providers,c=e.element,s=o,l="data-mce-"+(i="tabindex"),vt.from(n.iframeElement).map(At.fromDom).each(function(n){s?(un(n,i).each(function(t){return on(n,l,t)}),on(n,i,-1)):(cn(n,i),un(n,l).each(function(t){on(n,i,t),cn(n,l)}))}),o?(cO.block(e,(a=r,function(t,n){return{dom:{tag:"div",attributes:{"aria-label":a.translate("Loading..."),tabindex:"0"},classes:["tox-throbber__busy-spinner"]},components:[{dom:vk('<div class="tox-spinner"><div></div><div></div><div></div></div>')}]}})),vn(c,"display"),cn(c,"aria-hidden"),n.hasFocus()&&bk(e)):(u=ud.getCurrent(e).exists(function(t){return Ca(t.element)}),cO.unblock(e),fn(c,"display","none"),on(c,"aria-hidden","true"),u&&n.focus()),f.fire("AfterProgressState",{state:t}))}f.inline||f.on("PreInit",function(){f.dom.bind(f.getWin(),"focusin",n),f.on("BeforeExecCommand",function(t){"mcefocus"===t.command.toLowerCase()&&!0!==t.value&&n(t)})}),f.on("ProgressState",function(t){var n;e.on(cp.clearTimeout),u(t.time)?(n=cp.setEditorTimeout(f,function(){return o(t.state)},t.time),e.set(n)):(o(t.state),e.clear())})}function xk(t,n,e){return{within:t,extra:n,withinWidth:e}}function wk(t,n,o){var e,r=(e=function(t,n){var e=o(t);return vt.some({element:t,start:n,finish:n+e,width:e})},R(t,function(n,t){return e(t,n.len).fold(rt(n),function(t){return{len:t.finish,list:n.list.concat([t])}})},{len:0,list:[]}).list),i=F(r,function(t){return t.finish<=n}),u=I(i,function(t,n){return t+n.width},0);return{within:i,extra:r.slice(i.length),withinWidth:u}}function Sk(t){return M(t,function(t){return t.element})}function Ck(t,n){var e=M(n,function(t){return Tu(t)});F1.setGroups(t,e)}function kk(t,n,e){var o,r,i,u,a,c,s,l,f,d,m,g,p,h,v,b,y,x,w,S,C=n.builtGroups.get();0!==C.length&&(o=dl(t,n,"primary"),r=Yy.getCoupled(t,"overflowGroup"),fn(o.element,"visibility","hidden"),u=K(i=C.concat([r]),function(n){return Oa(n.element).bind(function(t){return n.getSystem().getByDom(t).toOptional()})}),e([]),Ck(o,i),a=kn(o.element),0===(s=a,l=n.builtGroups.get(),d=r,y=(0===(m=wk(l,s,f=function(t){return kn(t.element)})).extra.length?vt.some(m):vt.none()).getOrThunk(function(){return wk(l,s-f(d),f)}),x=y.within,w=y.extra,S=y.withinWidth,(c=1===w.length&&w[0].width<=f(d)?(b=S,xk(Sk(x.concat(w)),[],b)):1<=w.length?(p=w,h=d,v=S,xk(Sk(x).concat([h]),Sk(p),v)):(g=S,xk(Sk(x),[],g))).extra.length)?(Fg.remove(o,r),e([])):(Ck(o,c.within),e(c.extra)),vn(o.element,"visibility"),bn(o.element),u.each(Vg.focus))}function Ok(t,n){var e=Yy.getCoupled(t,"toolbarSandbox");hf.isOpen(e)?hf.close(e):hf.open(e,n.toolbar())}function _k(t,n,e,o){var r=e.getBounds.map(function(t){return t()}),i=e.lazySink(t).getOrDie();sf.positionWithinBounds(i,n,{anchor:{type:"hotspot",hotspot:t,layouts:o,overrides:{maxWidthFunction:dO()}}},r)}function Tk(t,n,e,o,r){F1.setGroups(n,r),_k(t,n,e,o),zg.on(t)}function Ek(t){return M(t,function(t){return Tu(t)})}function Dk(t,e,o){kk(t,o,function(n){o.overflowGroups.set(n),e.getOpt(t).each(function(t){pO.setGroups(t,Ek(n))})})}function Bk(n,e){fl(n,e,"overflow-button").bind(function(){return fl(n,e,"overflow")}).each(function(t){Kk(n,e),Z1.toggleGrow(t)})}function Mk(t){var n=t.title.fold(function(){return{}},function(t){return{attributes:{title:t}}});return{dom:lt({tag:"div",classes:["tox-toolbar__group"]},n),components:[bO.parts.items({})],items:t.items,markers:{itemSelector:"*:not(.tox-split-button) > .tox-tbtn:not([disabled]), .tox-split-button:not([disabled]), .tox-toolbar-nav-js:not([disabled])"},tgroupBehaviours:tc([fy.config({}),Vg.config({})])}}function Ak(t){return bO.sketch(Mk(t))}function Fk(e,t){var n=eu(function(t){var n=M(e.initGroups,Ak);F1.setGroups(t,n)});return tc([Jv(e.providers.isDisabled),mv(),Mg.config({mode:t,onEscape:e.onEscape,selector:".tox-toolbar__group"}),fm("toolbar-events",[n])])}function Ik(t){var n=t.cyclicKeying?"cyclic":"acyclic";return{uid:t.uid,dom:{tag:"div",classes:["tox-toolbar-overlord"]},parts:{"overflow-group":Mk({title:vt.none(),items:[]}),"overflow-button":U0({name:"more",icon:vt.some("more-drawer"),disabled:!1,tooltip:vt.some("More..."),primary:!1,borderless:!1},vt.none(),t.providers)},splitToolbarBehaviours:Fk(t,n)}}function Rk(t){var n=t.cyclicKeying?"cyclic":"acyclic";return F1.sketch({uid:t.uid,dom:{tag:"div",classes:["tox-toolbar"].concat(t.type===hh.scrolling?["tox-toolbar--scrolling"]:[])},components:[F1.parts.groups({})],toolbarBehaviours:Fk(t,n)})}function Vk(t){return"string"==typeof t?t.split(" "):t}function Pk(i,u){var a=lt(lt({},MO),u.menus),e=0<kt(u.menus).length,t=F(void 0===u.menubar||!0===u.menubar?Vk("file edit view insert format tools table help"):Vk(!1===u.menubar?"":u.menubar),function(t){var n=Tt(MO,t);return e?n||tt(u.menus,t).exists(function(t){return Tt(t,"items")}):n});return F(M(t,function(t){var n=a[t],e={title:n.title,items:Vk(n.items)},o=u,r=i.getParam("removed_menuitems","").split(/[ ,]/);return{text:e.title,getItems:function(){return z(e.items,function(t){var n=t.toLowerCase();return 0===n.trim().length||T(r,function(t){return t===n})?[]:"separator"===n||"|"===n?[{type:"separator"}]:o.menuItems[n]?[o.menuItems[n]]:[]})}}}),function(t){return 0<t.getItems().length&&T(t.getItems(),function(t){return"separator"!==t.type})})}function Hk(t){function n(){t._skinLoaded=!0,t.fire("SkinLoaded")}return function(){t.initialized?n():t.on("init",n)}}function zk(e,o,r){return new Bp(function(t,n){r.load(o,t,n),e.on("remove",function(){return r.unload(o)})})}function Nk(t,n){var e,o,r,i,u,a,c,s,l,f=(r=(e=n).getParam("skin"),i=e.getParam("skin_url"),!1!==r&&(o=r||"oxide",i=i?e.documentBaseURI.toAbsolute(i):nv.baseURL+"/skins/ui/"+o),i);f&&n.contentCSS.push(f+(t?"/content.inline":"/content")+".min.css"),!1===n.getParam("skin")==0&&y(f)?Bp.all([zk(n,f+"/skin.min.css",n.ui.styleSheetLoader),(c=n,s=f,l=At.fromDom(c.getElement()),ge(l).isSome()?zk(c,s+"/skin.shadowdom.min.css",tv.DOM.styleSheetLoader):Bp.resolve())]).then(Hk(n),(u=n,a="Skin could not be loaded",function(){return u.fire("SkinLoadError",{message:a})})):Hk(n)()}function Lk(o,r){return function(n){function t(){n.setActive(o.formatter.match(r));var t=o.formatter.formatChanged(r,n.setActive);e.set(t)}var e=fc();return o.initialized?t():o.once("init",t),function(){o.off("init",t),e.clear()}}}function Wk(o,r,i){return function(t){function n(){return i(t)}function e(){i(t),o.on(r,n)}return o.initialized?e():o.once("init",e),function(){o.off("init",e),o.off(r,n)}}}function Uk(n){return function(t){return function(){n.undoManager.transact(function(){n.focus(),n.execCommand("mceToggleFormat",!1,t.format)})}}}function jk(t,n){return function(){return t.execCommand(n)}}function Gk(t,n,e){var u,a,c,o=e.dataset,r="basic"===o.type?function(){return M(o.data,function(t){return hC(t,e.isSelectedFor,e.getPreviewFor)})}:o.getData;return{items:(u=n,a=e,c=function(t,n,e){var o="formatter"===t.type&&a.isInvalid(t);return 0===n?o?[]:i(t,n,!1,e).toArray():i(t,n,o,e).toArray()},{validateItems:s,getFetch:function(e,o){return function(t,n){n(z0(s(o()),xh.CLOSE_ON_EXECUTE,e,!1))}}}),getStyleItems:r};function i(t,n,e,o){var r=u.shared.providers.translate(t.title);if("separator"===t.type)return vt.some({type:"separator",text:r});if("submenu"!==t.type)return vt.some(lt({type:"togglemenuitem",text:r,icon:t.icon,active:t.isSelected(o),disabled:e,onAction:a.onAction(t)},t.getStylePreview().fold(function(){return{}},function(t){return{meta:{style:t}}})));var i=z(t.getStyleItems(),function(t){return c(t,n,o)});return 0===n&&i.length<=0?vt.none():vt.some({type:"nestedmenuitem",text:r,disabled:i.length<=0,getSubmenuItems:function(){return z(t.getStyleItems(),function(t){return c(t,n,o)})}})}function s(t){var n=a.getCurrentValue(),e=a.shouldHide?0:1;return z(t,function(t){return c(t,e,n)})}}function Xk(t,n,e){var o=Gk(0,n,e),r=o.items,i=o.getStyleItems,u=Wk(t,"NodeChange",function(t){var n=t.getComponent();e.updateText(n)});return P0({text:e.icon.isSome()?vt.none():e.text,icon:e.icon,tooltip:vt.from(e.tooltip),role:vt.none(),fetch:r.getFetch(n,i),onSetup:u,getApi:function(t){return{getComponent:rt(t)}},columns:1,presets:"normal",classes:e.icon.isSome()?[]:["bespoke"],dropdownBehaviours:[]},"tox-tbtn",n.shared)}function Yk(t){return function(t){for(;t=t.parentNode;){var n=t.contentEditable;if(n&&"inherit"!==n)return S1(t)}return!1}(t)&&!C1(t)}function qk(r,t){function n(t){return pl(r)}function e(e,o){return function(t,n){return fl(t,r,n).map(function(t){return e(t,n)}).getOr(o)}}function o(t,n){return"true"!==rn(t.element,"aria-hidden")}var i,u=e(o,!1),a=e(function(t,n){var e;o(t)&&(fn(e=t.element,"display","none"),on(e,"aria-hidden","true"),vr(t,Ki(),{name:n,visible:!1}))}),c=(i=a,function(n,t){St(t,function(t){return i(n,t)})}),s=e(function(t,n){var e;o(t)||(vn(e=t.element,"display"),cn(e,"aria-hidden"),vr(t,Ki(),{name:n,visible:!0}))});return{uid:r.uid,dom:r.dom,components:t,behaviours:Qs(r.slotBehaviours),apis:{getSlotNames:n,getSlot:function(t,n){return fl(t,r,n)},isShowing:u,hideSlot:a,hideAllSlots:function(t){return c(t,n())},showSlot:s}}}function Kk(t,n){fl(t,n,"overflow").each(function(e){kk(t,n,function(t){var n=M(t,function(t){return Tu(t)});F1.setGroups(e,n)}),fl(t,n,"overflow-button").each(function(t){Z1.hasGrown(e)&&zg.on(t)}),Z1.refresh(e)})}var Jk,$k,Qk,Zk="data-value",t1=function(n,e,t,o){return M(t,function(t){return nC(t)?{type:"togglemenuitem",text:t.text,value:t.value,active:t.value===o,onAction:function(){Tf.setValue(n,t.value),vr(n,py,{name:e}),Vg.focus(n)}}:{type:"nestedmenuitem",text:t.text,getSubmenuItems:function(){return t1(n,e,t.items,o)}}})},n1=function(t,n){return K(t,function(t){return nC(t)?ot(t.value===n,t):n1(t.items,n)})},e1=wl({name:"HtmlSelect",configFields:[fo("options"),$s("selectBehaviours",[Vg,Tf]),To("selectClasses",[]),To("selectAttributes",{}),xo("data")],factory:function(e,t){var n=M(e.options,function(t){return{dom:{tag:"option",value:t.value,innerHtml:t.text}}}),o=e.data.map(function(t){return cr("initialValue",t)}).getOr({});return{uid:e.uid,dom:{tag:"select",classes:e.selectClasses,attributes:e.selectAttributes},components:n,behaviours:Zs(e.selectBehaviours,[Vg.config({}),Tf.config({store:lt({mode:"manual",getValue:function(t){return $r(t.element)},setValue:function(t,n){V(e.options,function(t){return t.value===n}).isSome()&&Qr(t.element,n)}},o)})])}}}),o1=Object.freeze({__proto__:null,events:function(t,n){var e=t.stream.streams.setup(t,n);return nu([Cr(t.event,e),ou(function(){return n.cancel()})].concat(t.cancelEvent.map(function(t){return[Cr(t,function(){return n.cancel()})]}).getOr([])))}}),r1=Object.freeze({__proto__:null,throttle:rC,init:function(t){return t.stream.streams.state(t)}}),i1=ya({fields:[mo("stream",so("mode",{throttle:[fo("delay"),To("stopEvent",!0),Zu("streams",{setup:function(t,n){var e=t.stream,o=pp(t.onStream,e.delay);return n.setTimer(o),function(t,n){o.throttle(t,n),e.stopEvent&&n.stop()}},state:rC})]})),To("event","input"),xo("cancelEvent"),$u("onStream")],name:"streaming",active:o1,state:r1}),u1=function(t){uC(t,function(t,n){return t.setSelectionRange(n.length,n.length)})},a1=rt("alloy.typeahead.itemexecute"),c1=rt([xo("lazySink"),fo("fetch"),To("minChars",5),To("responseTime",1e3),Ku("onOpen"),To("getHotspot",vt.some),To("getAnchorOverrides",rt({})),To("layouts",vt.none()),To("eventOrder",{}),Ro("model",{},[To("getDisplayText",function(t){return void 0!==t.meta&&void 0!==t.meta.text?t.meta.text:t.value}),To("selectsOver",!0),To("populateFromBrowse",!0)]),Ku("onSetValue"),Ju("onExecute"),Ku("onItemExecute"),To("inputClasses",[]),To("inputAttributes",{}),To("inputStyles",{}),To("matchWidth",!0),To("useMinWidth",!1),To("dismissOnBlur",!0),Yu(["openClass"]),xo("initialData"),$s("typeaheadBehaviours",[Vg,Tf,i1,Mg,zg,Yy]),ar("previewing",function(){return Vo(!0)})].concat(ky()).concat(ex())),s1=rt([Kf({schema:[Xu()],name:"menu",overrides:function(o){return{fakeFocus:!0,onHighlight:function(n,e){o.previewing.get()?n.getSystem().getByUid(o.uid).each(function(t){!function(t,n,o){if(t.selectsOver){var e=Tf.getValue(n),r=t.getDisplayText(e),i=Tf.getValue(o);return 0===t.getDisplayText(i).indexOf(r)?vt.some(function(){var e;iC(0,n,o),e=r.length,uC(n,function(t,n){return t.setSelectionRange(e,n.length)})}):vt.none()}return vt.none()}(o.model,t,e).fold(function(){return gd.dehighlight(n,e)},function(t){return t()})}):n.getSystem().getByUid(o.uid).each(function(t){o.model.populateFromBrowse&&iC(o.model,t,e)}),o.previewing.set(!1)},onExecute:function(t,n){return t.getSystem().getByUid(o.uid).toOptional().map(function(t){return vr(t,a1(),{item:n}),!0})},onHover:function(t,n){o.previewing.set(!1),t.getSystem().getByUid(o.uid).each(function(t){o.model.populateFromBrowse&&iC(o.model,t,n)})}}}})]),l1=Sl({name:"Typeahead",configFields:c1(),partFields:s1(),factory:function(r,t,n,i){function e(t,n,e){r.previewing.set(!1);var o=Yy.getCoupled(t,"sandbox");hf.isOpen(o)?ud.getCurrent(o).each(function(t){gd.getHighlighted(t).fold(function(){e(t)},function(){xr(o,t.element,"keydown",n)})}):$y(r,u(t),t,o,i,function(t){ud.getCurrent(t).each(e)},Iy.HighlightFirst).get(st)}function u(e){return function(t){return t.map(function(t){var n=z(Z(t.menus),function(t){return F(t.items,function(t){return"item"===t.type})});return Tf.getState(e).update(M(n,function(t){return t.data})),t})}}var o=ty(r),a=[Vg.config({}),Tf.config({onSetValue:r.onSetValue,store:lt({mode:"dataset",getDataKey:function(t){return $r(t.element)},getFallbackEntry:function(t){return{value:t,meta:{}}},setValue:function(t,n){Qr(t.element,r.model.getDisplayText(n))}},r.initialData.map(function(t){return cr("initialValue",t)}).getOr({}))}),i1.config({stream:{mode:"throttle",delay:r.responseTime,stopEvent:!1},onStream:function(t,n){var e,o=Yy.getCoupled(t,"sandbox");Vg.isFocused(t)&&$r(t.element).length>=r.minChars&&(e=ud.getCurrent(o).bind(function(t){return gd.getHighlighted(t).map(Tf.getValue)}),r.previewing.set(!0),$y(r,u(t),t,o,i,function(t){ud.getCurrent(o).each(function(t){e.fold(function(){r.model.selectsOver&&gd.highlightFirst(t)},function(n){gd.highlightBy(t,function(t){return Tf.getValue(t).value===n.value}),gd.getHighlighted(t).orThunk(function(){return gd.highlightFirst(t),vt.none()})})})},Iy.HighlightFirst).get(st))},cancelEvent:Hi()}),Mg.config({mode:"special",onDown:function(t,n){return e(t,n,gd.highlightFirst),vt.some(!0)},onEscape:function(t){var n=Yy.getCoupled(t,"sandbox");return hf.isOpen(n)?(hf.close(n),vt.some(!0)):vt.none()},onUp:function(t,n){return e(t,n,gd.highlightLast),vt.some(!0)},onEnter:function(n){var t=Yy.getCoupled(n,"sandbox"),e=hf.isOpen(t);if(e&&!r.previewing.get())return ud.getCurrent(t).bind(function(t){return gd.getHighlighted(t)}).map(function(t){return vr(n,a1(),{item:t}),!0});var o=Tf.getValue(n);return hr(n,Hi()),r.onExecute(t,n,o),e&&hf.close(t),vt.some(!0)}}),zg.config({toggleClass:r.markers.openClass,aria:{mode:"expanded"}}),Yy.config({others:{sandbox:function(t){return tx(r,t,{onOpen:function(){return zg.on(t)},onClose:function(){return zg.off(t)}})}}}),fm("typeaheadevents",[iu(function(t){Qy(r,u(t),t,i,st,Iy.HighlightFirst).get(st)}),Cr(a1(),function(t,n){var e=Yy.getCoupled(t,"sandbox");iC(r.model,t,n.event.item),hr(t,Hi()),r.onItemExecute(t,e,n.event.item,Tf.getValue(t)),hf.close(e),u1(t)})].concat(r.dismissOnBlur?[Cr(Bi(),function(t){var n=Yy.getCoupled(t,"sandbox");Oa(n.element).isNone()&&hf.close(n)})]:[]))];return{uid:r.uid,dom:ny(Xo(r,{inputAttributes:{role:"combobox","aria-autocomplete":"list","aria-haspopup":"true"}})),behaviours:lt(lt({},o),Zs(r.typeaheadBehaviours,a)),eventOrder:r.eventOrder}}}),f1=function(i){return lt(lt({},i),{toCached:function(){return f1(i.toCached())},bindFuture:function(n){return f1(i.bind(function(t){return t.fold(function(t){return Ly(Re.error(t))},function(t){return n(t)})}))},bindResult:function(n){return f1(i.map(function(t){return t.bind(n)}))},mapResult:function(n){return f1(i.map(function(t){return t.map(n)}))},mapError:function(n){return f1(i.map(function(t){return t.mapError(n)}))},foldResult:function(n,e){return i.map(function(t){return t.fold(n,e)})},withTimeout:function(t,r){return f1(Ny(function(n){var e=!1,o=setTimeout(function(){e=!0,n(Re.error(r()))},t);i.get(function(t){e||(clearTimeout(o),n(t))})}))}})},d1=function(t){return f1(Ny(t))},m1={type:"separator"},g1=Fr("aria-invalid"),p1={bar:dC(function(t,n){return e=n.shared,{dom:{tag:"div",classes:["tox-bar","tox-form__controls-h-stack"]},components:M(t.items,e.interpreter)};var e}),collection:dC(function(t,n){return u=t,a=n.shared.providers,c=u.label.map(function(t){return Zb(t,a)}),s=e(function(t,n,e,o){n.stop(),a.isDisabled()||vr(t,by,{name:u.name,value:o})}),l=[Cr(hi(),e(function(t,n,e){Sa(e)})),Cr(Ci(),s),Cr(Ri(),s),Cr(vi(),e(function(t,n,e){Fu(t.element,"."+Dh).each(function(t){Yr(t,Dh)}),Xr(e,Dh)})),Cr(bi(),e(function(t){Fu(t.element,"."+Dh).each(function(t){Yr(t,Dh)})})),iu(e(function(t,n,e,o){vr(t,by,{name:u.name,value:o})}))],Qb(c,sy.parts.field({dom:{tag:"div",classes:["tox-collection"].concat(1!==u.columns?["tox-collection--grid"]:["tox-collection--list"])},components:[],factory:{sketch:h},behaviours:tc([dd.config({disabled:a.isDisabled,onDisabled:function(t){o(t,function(t){Xr(t,"tox-collection__item--state-disabled"),on(t,"aria-disabled",!0)})},onEnabled:function(t){o(t,function(t){Yr(t,"tox-collection__item--state-disabled"),cn(t,"aria-disabled")})}}),mv(),Fg.config({}),Tf.config({store:{mode:"memory",initialValue:[]},onSetValue:function(o,t){var n=o,e=M(t,function(t){var n=lp.translate(t.text),e=1===u.columns?'<div class="tox-collection__item-label">'+n+"</div>":"",o='<div class="tox-collection__item-icon">'+t.icon+"</div>",r={_:" "," - ":" ","-":" "},i=n.replace(/\_| \- |\-/g,function(t){return r[t]});return'<div class="tox-collection__item'+(a.isDisabled()?" tox-collection__item--state-disabled":"")+'" tabindex="-1" data-collection-item-value="'+dy.encodeAllRaw(t.value)+'" title="'+i+'" aria-label="'+i+'">'+o+e+"</div>"}),r=M("auto"!==u.columns&&1<u.columns?B(e,u.columns):[e],function(t){return'<div class="tox-collection__group">'+t.join("")+"</div>"});Mr(n.element,r.join("")),"auto"===u.columns&&ih(o,5,"tox-collection__item").each(function(t){var n=t.numRows,e=t.numColumns;Mg.setGridSize(o,n,e)}),hr(o,Cy)}}),fy.config({}),Mg.config(1===(i=u.columns)?{mode:"menu",moveOnTab:!1,selector:".tox-collection__item"}:"auto"===i?{mode:"flatgrid",selector:".tox-collection__item",initSize:{numColumns:1,numRows:1}}:{mode:"matrix",selectors:{row:".tox-collection__group",cell:"."+Sh}}),fm("collection-events",l)]),eventOrder:((r={})[Fi()]=["disabling","alloy.base.behaviour","collection-events"],r)}),["tox-form__group--collection"],[]);function e(o){return function(n,e){Iu(e.event.target,"[data-collection-item-value]").each(function(t){o(n,e,t,rn(t,"data-collection-item-value"))})}}function o(t,n){return M(ps(t.element,".tox-collection__item"),n)}var u,a,r,i,c,s,l}),alertbanner:dC(function(t,n){return o=n.shared.providers,uy.sketch({dom:{tag:"div",attributes:{role:"alert"},classes:["tox-notification","tox-notification--in","tox-notification--"+(e=t).level]},components:[{dom:{tag:"div",classes:["tox-notification__icon"]},components:[sp.sketch({dom:{tag:"button",classes:["tox-button","tox-button--naked","tox-button--icon"],innerHtml:Lm(e.icon,o.icons),attributes:{title:o.translate(e.iconTooltip)}},action:function(t){vr(t,by,{name:"alert-banner",value:e.url})},buttonBehaviours:tc([Wm()])})]},{dom:{tag:"div",classes:["tox-notification__body"],innerHtml:o.translate(e.text)}}]});var e,o}),input:dC(function(t,n){return o=n.shared.providers,oC({name:(e=t).name,multiline:!1,label:e.label,inputMode:e.inputMode,placeholder:e.placeholder,flex:!1,disabled:e.disabled,classname:"tox-textfield",validation:vt.none(),maximized:e.maximized},o);var e,o}),textarea:dC(function(t,n){return o=n.shared.providers,oC({name:(e=t).name,multiline:!0,label:e.label,inputMode:vt.none(),placeholder:e.placeholder,flex:!0,disabled:e.disabled,classname:"tox-textarea",validation:vt.none(),maximized:e.maximized},o);var e,o}),label:dC(function(t,n){return r={dom:{tag:"label",innerHtml:(o=n.shared).providers.translate((e=t).label),classes:["tox-label"]}},i=M(e.items,o.interpreter),{dom:{tag:"div",classes:["tox-form__group"]},components:[r].concat(i),behaviours:tc([ow(),Fg.config({}),rw(vt.none()),Mg.config({mode:"acyclic"})])};var e,o,r,i}),iframe:(Jk=function(t,n){return e=t,o=n.shared.providers,u=gS&&e.sandboxed,a=lt(lt({},e.label.map(function(t){return{title:t}}).getOr({})),u?{sandbox:"allow-scripts allow-same-origin"}:{}),r=u,i=Vo(""),c={getValue:function(t){return i.get()},setValue:function(t,n){var e;r?on(t.element,"srcdoc",n):(on(t.element,"src","javascript:''"),(e=t.element.dom.contentWindow.document).open(),e.write(n),e.close()),i.set(n)}},Qb(e.label.map(function(t){return Zb(t,o)}),sy.parts.field({factory:{sketch:function(t){return c0({uid:t.uid,dom:{tag:"iframe",attributes:a},behaviours:tc([fy.config({}),Vg.config({}),lS(vt.none(),c.getValue,c.setValue)])})}}}),["tox-form__group--stretched"],[]);var e,o,r,i,u,a,c},function(t,n,e){var o=Xo(n,{source:"dynamic"});return dC(Jk)(t,o,e)}),button:dC(function(t,n){return e=t,o=n.shared.providers,r=Y0(e.name,"custom"),Qb(vt.none(),sy.parts.field(lt({factory:sp},G0(e,vt.some(r),o,[fS(""),ow()]))),[],[]);var e,o,r}),checkbox:dC(function(t,n){return r=t,i=n.shared.providers,u=Tf.config({store:{mode:"manual",getValue:function(t){return t.element.dom.checked},setValue:function(t,n){t.element.dom.checked=n}}}),a=sy.parts.field({factory:{sketch:h},dom:{tag:"input",classes:["tox-checkbox__input"],attributes:{type:"checkbox"}},behaviours:tc([ow(),dd.config({disabled:function(){return r.disabled||i.isDisabled()}}),fy.config({}),Vg.config({}),u,Mg.config({mode:"special",onEnter:e,onSpace:e,stopSpaceKeyup:!0}),fm("checkbox-events",[Cr(Si(),function(t,n){vr(t,py,{name:r.name})})])])}),c=sy.parts.label({dom:{tag:"span",classes:["tox-checkbox__label"],innerHtml:i.translate(r.label)},behaviours:tc([mw.config({})])}),s=Pm({dom:{tag:"div",classes:["tox-checkbox__icons"]},components:[o("checked"),o("unchecked")]}),sy.sketch({dom:{tag:"label",classes:["tox-checkbox"]},components:[a,s.asSpec(),c],fieldBehaviours:tc([dd.config({disabled:function(){return r.disabled||i.isDisabled()},disableClass:"tox-checkbox--disabled",onDisabled:function(t){sy.getField(t).each(dd.disable)},onEnabled:function(t){sy.getField(t).each(dd.enable)}}),mv()])});function e(t){return t.element.dom.click(),vt.some(!0)}function o(t){return jm("checked"===t?"selected":"unselected",{tag:"span",classes:["tox-icon","tox-checkbox-icon__"+t]},i.icons)}var r,i,u,a,c,s}),colorinput:dC(function(t,n){return e=t,r=n.shared,i=n.colorinput,c=sy.parts.field({factory:Oy,inputClasses:["tox-textfield"],onSetValue:function(t){return Gy.run(t).get(st)},inputBehaviours:tc([dd.config({disabled:r.providers.isDisabled}),mv(),fy.config({}),Gy.config({invalidClass:"tox-textbox-field-invalid",getRoot:function(t){return Yt(t.element)},notify:{onValid:function(t){var n=Tf.getValue(t);vr(t,gw,{color:n})}},validator:{validateOnLoad:!1,validate:function(t){var n=Tf.getValue(t);if(0===n.length)return Ly(Re.value(!0));var e=At.fromTag("span");fn(e,"background-color",n);var o=pn(e,"background-color").fold(function(){return Re.error("blah")},function(t){return Re.value(n)});return Ly(o)}}})]),selectOnFocus:!1}),s=e.label.map(function(t){return Zb(t,r.providers)}),l=Pm((u={dom:{tag:"span",attributes:{"aria-label":r.providers.translate("Color swatch")}},layouts:{onRtl:function(){return[Xa,Ga,Ja]},onLtr:function(){return[Ga,Xa,Ja]}},components:[],fetch:yb(i.getColors(),i.hasCustomColors()),columns:i.getColorCols(),presets:"color",onItemAction:function(t,e){l.getOpt(t).each(function(n){"custom"===e?i.colorPicker(function(t){t.fold(function(){return hr(n,hw)},function(t){o(n,t),gb(t)})},"#ffffff"):o(n,"remove"===e?"":e)})}},dw.sketch({dom:u.dom,components:u.components,toggleClass:"mce-active",dropdownBehaviours:tc([Kv((a=r).providers.isDisabled),mv(),mw.config({}),fy.config({})]),layouts:u.layouts,sandboxClasses:["tox-dialog__popups"],lazySink:a.getSink,fetch:function(n){return Ny(function(t){return u.fetch(t)}).map(function(t){return vt.from(Wb(Xo(Cb(Fr("menu-value"),t,function(t){u.onItemAction(n,t)},u.columns,u.presets,xh.CLOSE_ON_EXECUTE,O,a.providers),{movement:kb(u.columns,u.presets)})))})},parts:{menu:$p(0,0,u.presets)}}))),sy.sketch({dom:{tag:"div",classes:["tox-form__group"]},components:s.toArray().concat([{dom:{tag:"div",classes:["tox-color-input"]},components:[c,l.asSpec()]}]),fieldBehaviours:tc([fm("form-field-events",[Cr(gw,function(t,n){l.getOpt(t).each(function(t){fn(t.element,"background-color",n.event.color)}),vr(t,py,{name:e.name})}),Cr(pw,function(n,e){sy.getField(n).each(function(t){Tf.setValue(t,e.event.value),ud.getCurrent(n).each(Vg.focus)})}),Cr(hw,function(n,t){sy.getField(n).each(function(t){ud.getCurrent(n).each(Vg.focus)})})])])});function o(t,n){vr(t,pw,{value:n})}var e,r,i,u,a,c,s,l}),colorpicker:dC(function(t){var r=Pm(o0(r0,function(t){return"tox-"+t}).sketch({dom:{tag:"div",classes:["tox-color-picker-container"],attributes:{role:"presentation"}},onValidHex:function(t){vr(t,by,{name:"hex-valid",value:!0})},onInvalidHex:function(t){vr(t,by,{name:"hex-valid",value:!1})}}));return{dom:{tag:"div"},components:[r.asSpec()],behaviours:tc([Tf.config({store:{mode:"manual",getValue:function(t){var n=r.get(t);return ud.getCurrent(n).bind(function(t){return Tf.getValue(t).hex}).map(function(t){return"#"+t}).getOr("")},setValue:function(t,n){var e=/^#([a-fA-F0-9]{3}(?:[a-fA-F0-9]{3})?)/.exec(n),o=r.get(t);ud.getCurrent(o).fold(function(){console.log("Can not find form")},function(t){Tf.setValue(t,{hex:vt.from(e[1]).getOr("")}),Qw.getField(t,"hex").each(function(t){hr(t,wi())})})}}}),ow()])}}),dropzone:dC(function(t,n){return u0(t,n.shared.providers)}),grid:dC(function(t,n){return e=n.shared,{dom:{tag:"div",classes:["tox-form__grid","tox-form__grid--"+t.columns+"col"]},components:M(t.items,e.interpreter)};var e}),listbox:dC(function(t,n){return e=t,r=(o=n).shared.providers,i=Y(e.items).filter(nC),u=e.label.map(function(t){return Zb(t,r)}),a={dom:{tag:"div",classes:["tox-listboxfield"]},components:[sy.parts.field({dom:{},factory:{sketch:function(t){return P0({uid:t.uid,text:i.map(function(t){return t.text}),icon:vt.none(),tooltip:e.label,role:vt.none(),fetch:function(t,n){n(z0(t1(t,e.name,e.items,Tf.getValue(t)),xh.CLOSE_ON_EXECUTE,o,!1))},onSetup:rt(st),getApi:rt({}),columns:1,presets:"normal",classes:[],dropdownBehaviours:[fy.config({}),Tf.config({store:{mode:"manual",initialValue:i.map(function(t){return t.value}).getOr(""),getValue:function(t){return rn(t.element,Zk)},setValue:function(n,t){n1(e.items,t).each(function(t){on(n.element,Zk,t.value),vr(n,AS,{text:t.text})})}}})]},"tox-listbox",o.shared)}}})]},sy.sketch({dom:{tag:"div",classes:["tox-form__group"]},components:ft([u.toArray(),[a]]),fieldBehaviours:tc([dd.config({disabled:rt(e.disabled),onDisabled:function(t){sy.getField(t).each(dd.disable)},onEnabled:function(t){sy.getField(t).each(dd.enable)}})])});var e,o,r,i,u,a}),selectbox:dC(function(t,n){return e=t,o=n.shared.providers,r=M(e.items,function(t){return{text:o.translate(t.text),value:t.value}}),i=e.label.map(function(t){return Zb(t,o)}),u={dom:{tag:"div",classes:["tox-selectfield"]},components:ft([[sy.parts.field({dom:{},selectAttributes:{size:e.size},options:r,factory:e1,selectBehaviours:tc([dd.config({disabled:function(){return e.disabled||o.isDisabled()}}),fy.config({}),fm("selectbox-change",[Cr(Si(),function(t,n){vr(t,py,{name:e.name})})])])})],(1<e.size?vt.none():vt.some(jm("chevron-down",{tag:"div",classes:["tox-selectfield__icon-js"]},o.icons))).toArray()])},sy.sketch({dom:{tag:"div",classes:["tox-form__group"]},components:ft([i.toArray(),[u]]),fieldBehaviours:tc([dd.config({disabled:function(){return e.disabled||o.isDisabled()},onDisabled:function(t){sy.getField(t).each(dd.disable)},onEnabled:function(t){sy.getField(t).each(dd.enable)}}),mv()])});var e,o,r,i,u}),sizeinput:dC(function(t,n){return Z0(t,n.shared.providers)}),urlinput:dC(function(t,n){return fC(t,n,n.urlinput)}),customeditor:dC(function(e){var o=dc(),n=Pm({dom:{tag:e.tag}}),r=dc();return{dom:{tag:"div",classes:["tox-custom-editor"]},behaviours:tc([fm("custom-editor-events",[eu(function(t){n.getOpt(t).each(function(n){(Tt(e,"init")?e.init(n.element.dom):uS.load(e.scriptId,e.scriptUrl).then(function(t){return t(n.element.dom,e.settings)})).then(function(n){r.on(function(t){n.setValue(t)}),r.clear(),o.set(n)})})})]),Tf.config({store:{mode:"manual",getValue:function(){return o.get().fold(function(){return r.get().getOr("")},function(t){return t.getValue()})},setValue:function(t,n){o.get().fold(function(){r.set(n)},function(t){return t.setValue(n)})}}}),ow()]),components:[n.asSpec()]}}),htmlpanel:dC(function(t){return"presentation"===t.presets?uy.sketch({dom:{tag:"div",classes:["tox-form__group"],innerHtml:t.html}}):uy.sketch({dom:{tag:"div",classes:["tox-form__group"],innerHtml:t.html,attributes:{role:"document"}},containerBehaviours:tc([fy.config({}),Vg.config({})])})}),imagetools:dC(function(t,n){return tC(t,n.shared.providers)}),table:dC(function(t,n){return eC(t,n.shared.providers)}),panel:dC(function(t,n){return{dom:{tag:"div",classes:t.classes},components:M(t.items,n.shared.interpreter)}})},h1={field:function(t,n){return n}},v1=function(n,e,o){return tt(p1,e.type).fold(function(){return console.error('Unknown factory type "'+e.type+'", defaulting to container: ',e),e},function(t){return t(n,e,o)})},b1={valignCentre:[],alignCentre:[],alignLeft:[],alignRight:[],right:[],left:[],bottom:[],top:[]},y1=[{title:"Headings",items:[{title:"Heading 1",format:"h1"},{title:"Heading 2",format:"h2"},{title:"Heading 3",format:"h3"},{title:"Heading 4",format:"h4"},{title:"Heading 5",format:"h5"},{title:"Heading 6",format:"h6"}]},{title:"Inline",items:[{title:"Bold",format:"bold"},{title:"Italic",format:"italic"},{title:"Underline",format:"underline"},{title:"Strikethrough",format:"strikethrough"},{title:"Superscript",format:"superscript"},{title:"Subscript",format:"subscript"},{title:"Code",format:"code"}]},{title:"Blocks",items:[{title:"Paragraph",format:"p"},{title:"Blockquote",format:"blockquote"},{title:"Div",format:"div"},{title:"Pre",format:"pre"}]},{title:"Align",items:[{title:"Left",format:"alignleft"},{title:"Center",format:"aligncenter"},{title:"Right",format:"alignright"},{title:"Justify",format:"alignjustify"}]}],x1=function(t){return R(t,function(t,n){if(Tt(n,"items")){var e=x1(n.items);return{customFormats:t.customFormats.concat(e.customFormats),formats:t.formats.concat([{title:n.title,items:e.formats}])}}if(Tt(n,"inline")||Tt(n,"block")||Tt(n,"selector")){var o="custom-"+(y(n.name)?n.name:n.title.toLowerCase());return{customFormats:t.customFormats.concat([{name:o,format:n}]),formats:t.formats.concat([{title:n.title,format:o,icon:n.icon}])}}return lt(lt({},t),{formats:t.formats.concat(n)})},{customFormats:[],formats:[]})},w1=aS.trim,S1=bC("true"),C1=bC("false"),k1=function(t){var n=M(ps(At.fromDom(t),"h1,h2,h3,h4,h5,h6,a:not([href])"),function(t){return t.dom});return F(M(F(n,CC),kC).concat(M(F(n,wC),OC)),_C)},O1="tinymce-url-history",_1=nd,T1=Zf,E1=rt([To("shell",!1),fo("makeItem"),To("setupItem",st),Ef("listBehaviours",[Fg])]),D1=rt([Jf({name:"items",overrides:function(){return{behaviours:tc([Fg.config({})])}}})]),B1=Sl({name:rt("CustomList")(),configFields:E1(),partFields:D1(),factory:function(s,t,n,e){var o=s.shell?{behaviours:[Fg.config({})],components:[]}:{behaviours:[],components:t};return{uid:s.uid,dom:s.dom,components:o.components,behaviours:Zs(s.listBehaviours,o.behaviours),apis:{setItems:function(a,c){var t;t=a,(s.shell?vt.some(t):fl(t,s,"items")).fold(function(){throw console.error("Custom List was defined to not be a shell, but no item container was specified in components"),new Error("Custom List was defined to not be a shell, but no item container was specified in components")},function(n){var t=Fg.contents(n),e=c.length,o=e-t.length,r=0<o?D(o,function(){return s.makeItem()}):[],i=t.slice(e);St(i,function(t){return Fg.remove(n,t)}),St(r,function(t){return Fg.append(n,t)});var u=Fg.contents(n);St(u,function(t,n){s.setupItem(a,t,c[n],n)})})}}}},apis:{setItems:function(t,n,e){t.setItems(n,e)}}}),M1=rt([fo("dom"),To("shell",!0),$s("toolbarBehaviours",[Fg])]),A1=rt([Jf({name:"groups",overrides:function(){return{behaviours:tc([Fg.config({})])}}})]),F1=Sl({name:"Toolbar",configFields:M1(),partFields:A1(),factory:function(o,t,n,e){var r=o.shell?{behaviours:[Fg.config({})],components:[]}:{behaviours:[],components:t};return{uid:o.uid,dom:o.dom,components:r.components,behaviours:Zs(o.toolbarBehaviours,r.behaviours),apis:{setGroups:function(t,n){var e;e=t,(o.shell?vt.some(e):fl(e,o,"groups")).fold(function(){throw console.error("Toolbar was defined to not be a shell, but no groups container was specified in components"),new Error("Toolbar was defined to not be a shell, but no groups container was specified in components")},function(t){Fg.set(t,n)})}},domModification:{attributes:{role:"group"}}}},apis:{setGroups:function(t,n,e){t.setGroups(n,e)}}}),I1=rt([]),R1=Object.freeze({__proto__:null,setup:st,isDocked:O,getBehaviours:I1}),V1=Po([{static:[]},{absolute:["positionCss"]},{fixed:["positionCss"]}]),P1=function(t,n,e){var o,r,i,u;t.getSystem().isConnected()&&(i=e,u=(r=n).lazyViewport(o=t),i.isDocked()&&qC(o,r,i,u),GC(o,u,i).each(function(t){t.fold(function(){return XC(o,r,i)},function(t){return YC(o,r,i,t)},function(t){qC(o,r,i,u,!0),YC(o,r,i,t)})}))},H1=Object.freeze({__proto__:null,refresh:P1,reset:KC,isDocked:function(t,n,e){return e.isDocked()},getModes:function(t,n,e){return e.getModes()},setModes:function(t,n,e,o){return e.setModes(o)}}),z1=Object.freeze({__proto__:null,events:function(o,r){return nu([Dr(Oi(),function(n,e){o.contextual.each(function(t){qr(n.element,t.transitionClass)&&(Jr(n.element,[t.transitionClass,t.fadeInClass]),(r.isVisible()?t.onShown:t.onHidden)(n)),e.stop()})}),Cr(Wi(),function(t,n){P1(t,o,r)}),Cr(Ui(),function(t,n){KC(t,o,r)})])}}),N1=ya({fields:[_o("contextual",[go("fadeInClass"),go("fadeOutClass"),go("transitionClass"),ho("lazyContext"),Ku("onShow"),Ku("onShown"),Ku("onHide"),Ku("onHidden")]),Fo("lazyViewport",Ae),Io("modes",["top","bottom"],tr),Ku("onDocked"),Ku("onUndocked")],name:"docking",active:z1,apis:H1,state:Object.freeze({__proto__:null,init:function(t){var n=Vo(!1),e=Vo(!0),o=dc(),r=Vo(t.modes);return xu({isDocked:n.get,setDocked:n.set,getInitialPos:o.get,setInitialPos:o.set,clearInitialPos:o.clear,isVisible:e.get,setVisible:e.set,getModes:r.get,setModes:r.set,readState:function(){return"docked:  "+n.get()+", visible: "+e.get()+", modes: "+r.get().join(",")}})}})}),L1=rt(Fr("toolbar-height-change")),W1={fadeInClass:"tox-editor-dock-fadein",fadeOutClass:"tox-editor-dock-fadeout",transitionClass:"tox-editor-dock-transition"},U1="tox-tinymce--toolbar-sticky-on",j1="tox-tinymce--toolbar-sticky-off",G1=Object.freeze({__proto__:null,setup:function(t,n,e){t.inline||(n.header.isPositionedAtTop()||t.on("ResizeEditor",function(){e().each(N1.reset)}),t.on("ResizeWindow ResizeEditor",function(){e().each($C)}),t.on("SkinLoaded",function(){e().each(function(t){N1.isDocked(t)?N1.reset(t):N1.refresh(t)})}),t.on("FullscreenStateChanged",function(){e().each(N1.reset)})),t.on("AfterScrollIntoView",function(b){e().each(function(t){N1.refresh(t);var n,e,o,r,i,u,a,c,s,l,f,d,m,g,p,h,v=t.element;Rd(v)&&(n=b,r=(o=Ut(e=v)).dom.defaultView.innerHeight,i=In(o),a=zn(u=At.fromDom(n.elm)),c=xn(u),l=(s=a.y)+c,f=Cn(e),d=xn(e),g=(m=f.top)+d,p=Math.abs(m-i.top)<2,h=Math.abs(g-(i.top+r))<2,p&&s<g?Rn(i.left,s-d,o):h&&m<l&&Rn(i.left,s-r+c+d,o))})}),t.on("PostRender",function(){ZC(t,!1)})},isDocked:function(t){return t().map(N1.isDocked).getOr(!1)},getBehaviours:tk}),X1=Jo([go("type"),mo("items",no([$o([go("name"),yo("items",tr)]),tr]))].concat(Vp)),Y1=[Co("text"),Co("tooltip"),Co("icon"),ho("fetch"),Fo("onSetup",function(){return st})],q1=Jo(H([go("type")],Y1,!0)),K1=Jo([go("type"),Co("tooltip"),Co("icon"),Co("text"),ko("select"),ho("fetch"),Fo("onSetup",function(){return st}),Mo("presets","normal",["normal","color","listpreview"]),To("columns",1),ho("onAction"),ho("onItemAction")]),J1=wl({factory:function(n,o){var t={focus:Mg.focusIn,setMenus:function(t,n){var e=M(n,function(n){return L0(nk({type:"menubutton",text:n.text,fetch:function(t){t(n.getItems())}}).mapError(function(t){return ir(t)}).getOrDie(),"tox-mbtn",o.backstage,vt.some("menuitem"))});Fg.set(t,e)}};return{uid:n.uid,dom:n.dom,components:[],behaviours:tc([Fg.config({}),fm("menubar-events",[eu(function(t){n.onSetup(t)}),Cr(hi(),function(e,t){Fu(e.element,".tox-mbtn--active").each(function(n){Iu(t.event.target,".tox-mbtn").each(function(t){Lt(n,t)||e.getSystem().getByDom(n).each(function(n){e.getSystem().getByDom(t).each(function(t){dw.expand(t),dw.close(n),Vg.focus(t)})})})})}),Cr(qi(),function(e,t){t.event.prevFocus.bind(function(t){return e.getSystem().getByDom(t).toOptional()}).each(function(n){t.event.newFocus.bind(function(t){return e.getSystem().getByDom(t).toOptional()}).each(function(t){dw.isOpen(n)&&(dw.expand(t),dw.close(n))})})})]),Mg.config({mode:"flow",selector:".tox-mbtn",onEscape:function(t){return n.onEscape(t),vt.some(!0)}}),fy.config({})]),apis:t,domModification:{attributes:{role:"menubar"}}}},name:"silver.Menubar",configFields:[fo("dom"),fo("uid"),fo("onEscape"),fo("backstage"),To("onSetup",st)],apis:{focus:function(t,n){t.focus(n)},setMenus:function(t,n,e){t.setMenus(n,e)}}}),$1=Object.freeze({__proto__:null,refresh:function(t,n,e){var o;e.isExpanded()&&(vn(t.element,ok(n)),o=rk(n,t.element),fn(t.element,ok(n),o))},grow:function(t,n,e){e.isExpanded()||lk(t,n,e)},shrink:function(t,n,e){e.isExpanded()&&sk(t,n,e)},immediateShrink:function(t,n,e){e.isExpanded()&&ck(t,n,e)},hasGrown:function(t,n,e){return e.isExpanded()},hasShrunk:function(t,n,e){return e.isCollapsed()},isGrowing:fk,isShrinking:dk,isTransitioning:function(t,n,e){return fk(t,n)||dk(t,n)},toggleGrow:function(t,n,e){(e.isExpanded()?sk:lk)(t,n,e)},disableTransitions:ik}),Q1=Object.freeze({__proto__:null,exhibit:function(t,n,e){return Nr(n.expanded?{classes:[n.openClass],styles:{}}:{classes:[n.closedClass],styles:cr(n.dimension.property,"0px")})},events:function(e,o){return nu([Dr(Oi(),function(t,n){n.event.raw.propertyName===e.dimension.property&&(ik(t,e),o.isExpanded()&&vn(t.element,e.dimension.property),(o.isExpanded()?e.onGrown:e.onShrunk)(t))})])}}),Z1=ya({fields:[fo("closedClass"),fo("openClass"),fo("shrinkingClass"),fo("growingClass"),xo("getAnimationRoot"),Ku("onShrunk"),Ku("onStartShrink"),Ku("onGrown"),Ku("onStartGrow"),To("expanded",!1),mo("dimension",so("property",{width:[Zu("property","width"),Zu("getDimension",function(t){return kn(t)+"px"})],height:[Zu("property","height"),Zu("getDimension",function(t){return xn(t)+"px"})]}))],name:"sliding",active:Q1,apis:$1,state:Object.freeze({__proto__:null,init:function(t){var n=Vo(t.expanded);return xu({isExpanded:function(){return!0===n.get()},isCollapsed:function(){return!1===n.get()},setCollapsed:S(n.set,!1),setExpanded:S(n.set,!0),readState:function(){return"expanded: "+n.get()}})}})}),tO="container",nO=[$s("slotBehaviours",[])],eO=dt({getSlotNames:function(t,n){return t.getSlotNames(n)},getSlot:function(t,n,e){return t.getSlot(n,e)},isShowing:function(t,n,e){return t.isShowing(n,e)},hideSlot:function(t,n,e){return t.hideSlot(n,e)},hideAllSlots:function(t,n){return t.hideAllSlots(n)},showSlot:function(t,n,e){return t.showSlot(n,e)}},Hr),oO=lt(lt({},eO),{sketch:function(t){var e,n={slot:function(t,n){return e.push(t),ul(tO,mk(t),n)},record:rt(e=[])},o=t(n),r=M(n.record(),function(t){return qf({name:t,pname:mk(t)})});return xl(tO,nO,r,qk,o)}}),rO=Jo([Co("icon"),Co("tooltip"),Fo("onShow",st),Fo("onHide",st),Fo("onSetup",function(){return st})]),iO=Fr("FixSizeEvent"),uO=Fr("AutoSizeEvent"),aO=Object.freeze({__proto__:null,block:function(t,n,e,o){on(t.element,"aria-busy",!0);var r=n.getRoot(t).getOr(t),i=tc([Mg.config({mode:"special",onTab:function(){return vt.some(!0)},onShiftTab:function(){return vt.some(!0)}}),Vg.config({})]),u=o(r,i),a=r.getSystem().build(u);Fg.append(r,Tu(a)),a.hasConfigured(Mg)&&n.focus&&Mg.focusIn(a),e.isBlocked()||n.onBlock(t),e.blockWith(function(){return Fg.remove(r,a)})},unblock:function(t,n,e){cn(t.element,"aria-busy"),e.isBlocked()&&n.onUnblock(t),e.clear()}}),cO=ya({fields:[Fo("getRoot",vt.none),Ao("focus",!0),Ku("onBlock"),Ku("onUnblock")],name:"blocking",apis:aO,state:Object.freeze({__proto__:null,init:function(){var n=lc(function(t){return t.destroy()});return xu({readState:n.isSet,blockWith:function(t){n.set({destroy:t})},clear:n.clear,isBlocked:n.isSet})}})}),sO=rt([$s("splitToolbarBehaviours",[Yy]),ar("builtGroups",function(){return Vo([])})]),lO=rt([Yu(["overflowToggledClass"]),ko("getOverflowBounds"),fo("lazySink"),ar("overflowGroups",function(){return Vo([])})].concat(sO())),fO=rt([qf({factory:F1,schema:M1(),name:"primary"}),Kf({schema:M1(),name:"overflow"}),Kf({name:"overflow-button"}),Kf({name:"overflow-group"})]),dO=rt(function(t,n){var e=t,o=Math.floor(n);fn(e,"max-width",ke.max(e,o,["margin-left","border-left-width","padding-left","padding-right","border-right-width","margin-right"])+"px")}),mO=rt([Yu(["toggledClass"]),fo("lazySink"),ho("fetch"),ko("getBounds"),_o("fireDismissalEventInstead",[To("event",Xi())]),Nc()]),gO=rt([Kf({name:"button",overrides:function(t){return{dom:{attributes:{"aria-haspopup":"true"}},buttonBehaviours:tc([zg.config({toggleClass:t.markers.toggledClass,aria:{mode:"expanded"},toggleOnExecute:!1})])}}}),Kf({factory:F1,schema:M1(),name:"toolbar",overrides:function(n){return{toolbarBehaviours:tc([Mg.config({mode:"cyclic",onEscape:function(t){return fl(t,n,"button").each(Vg.focus),vt.none()}})])}}})]),pO=Sl({name:"FloatingToolbarButton",factory:function(u,t,a,n){return lt(lt({},sp.sketch(lt(lt({},n.button()),{action:function(t){Ok(t,n)},buttonBehaviours:Df({dump:n.button().buttonBehaviours},[Yy.config({others:{toolbarSandbox:function(t){return o=t,e=a,r=u,{dom:{tag:"div",attributes:{id:(i=Ru()).id}},behaviours:tc([Mg.config({mode:"special",onEscape:function(t){return hf.close(t),vt.some(!0)}}),hf.config({onOpen:function(t,n){r.fetch().get(function(t){Tk(o,n,r,e.layouts,t),i.link(o.element),Mg.focusIn(n)})},onClose:function(){zg.off(o),Vg.focus(o),i.unlink(o.element)},isPartOf:function(t,n,e){return Hu(n,e)||Hu(o,e)},getAttachPoint:function(){return r.lazySink(o).getOrDie()}}),rc.config({channels:lt(lt({},js(lt({isExtraPart:O},r.fireDismissalEventInstead.map(function(t){return{fireEventInstead:{event:t.event}}}).getOr({})))),Gs({doReposition:function(){hf.getState(Yy.getCoupled(o,"toolbarSandbox")).each(function(t){_k(o,t,r,e.layouts)})}}))})])};var o,e,r,i}}})])}))),{apis:{setGroups:function(n,e){hf.getState(Yy.getCoupled(n,"toolbarSandbox")).each(function(t){Tk(n,t,u,a.layouts,e)})},reposition:function(n){hf.getState(Yy.getCoupled(n,"toolbarSandbox")).each(function(t){_k(n,t,u,a.layouts)})},toggle:function(t){Ok(t,n)},getToolbar:function(t){return hf.getState(Yy.getCoupled(t,"toolbarSandbox"))},isOpen:function(t){return hf.isOpen(Yy.getCoupled(t,"toolbarSandbox"))}}})},configFields:mO(),partFields:gO(),apis:{setGroups:function(t,n,e){t.setGroups(n,e)},reposition:function(t,n){t.reposition(n)},toggle:function(t,n){t.toggle(n)},getToolbar:function(t,n){return t.getToolbar(n)},isOpen:function(t,n){return t.isOpen(n)}}}),hO=rt([fo("items"),Yu(["itemSelector"]),$s("tgroupBehaviours",[Mg])]),vO=rt([$f({name:"items",unit:"item"})]),bO=Sl({name:"ToolbarGroup",configFields:hO(),partFields:vO(),factory:function(t,n,e,o){return{uid:t.uid,dom:t.dom,components:n,behaviours:Zs(t.tgroupBehaviours,[Mg.config({mode:"flow",selector:t.markers.itemSelector})]),domModification:{attributes:{role:"toolbar"}}}}}),yO=Sl({name:"SplitFloatingToolbar",configFields:lO(),partFields:fO(),factory:function(e,t,n,o){var r=Pm(pO.sketch({fetch:function(){return Ny(function(t){t(Ek(e.overflowGroups.get()))})},layouts:{onLtr:function(){return[Xa,Ga]},onRtl:function(){return[Ga,Xa]},onBottomLtr:function(){return[qa,Ya]},onBottomRtl:function(){return[Ya,qa]}},getBounds:n.getOverflowBounds,lazySink:e.lazySink,fireDismissalEventInstead:{},markers:{toggledClass:e.markers.overflowToggledClass},parts:{button:o["overflow-button"](),toolbar:o.overflow()}}));return{uid:e.uid,dom:e.dom,components:t,behaviours:Zs(e.splitToolbarBehaviours,[Yy.config({others:{overflowGroup:function(){return bO.sketch(lt(lt({},o["overflow-group"]()),{items:[r.asSpec()]}))}}})]),apis:{setGroups:function(t,n){e.builtGroups.set(M(n,t.getSystem().build)),Dk(t,r,e)},refresh:function(t){return Dk(t,r,e)},toggle:function(t){r.getOpt(t).each(function(t){pO.toggle(t)})},isOpen:function(t){return r.getOpt(t).map(pO.isOpen).getOr(!1)},reposition:function(t){r.getOpt(t).each(function(t){pO.reposition(t)})},getOverflow:function(t){return r.getOpt(t).bind(pO.getToolbar)}},domModification:{attributes:{role:"group"}}}},apis:{setGroups:function(t,n,e){t.setGroups(n,e)},refresh:function(t,n){t.refresh(n)},reposition:function(t,n){t.reposition(n)},toggle:function(t,n){t.toggle(n)},isOpen:function(t,n){return t.isOpen(n)},getOverflow:function(t,n){return t.getOverflow(n)}}}),xO=rt([Yu(["closedClass","openClass","shrinkingClass","growingClass","overflowToggledClass"]),Ku("onOpened"),Ku("onClosed")].concat(sO())),wO=rt([qf({factory:F1,schema:M1(),name:"primary"}),qf({factory:F1,schema:M1(),name:"overflow",overrides:function(n){return{toolbarBehaviours:tc([Z1.config({dimension:{property:"height"},closedClass:n.markers.closedClass,openClass:n.markers.openClass,shrinkingClass:n.markers.shrinkingClass,growingClass:n.markers.growingClass,onShrunk:function(t){fl(t,n,"overflow-button").each(function(t){zg.off(t),Vg.focus(t)}),n.onClosed(t)},onGrown:function(t){Mg.focusIn(t),n.onOpened(t)},onStartGrow:function(t){fl(t,n,"overflow-button").each(zg.on)}}),Mg.config({mode:"acyclic",onEscape:function(t){return fl(t,n,"overflow-button").each(Vg.focus),vt.some(!0)}})])}}}),Kf({name:"overflow-button",overrides:function(t){return{buttonBehaviours:tc([zg.config({toggleClass:t.markers.overflowToggledClass,aria:{mode:"pressed"},toggleOnExecute:!1})])}}}),Kf({name:"overflow-group"})]),SO=Sl({name:"SplitSlidingToolbar",configFields:xO(),partFields:wO(),factory:function(o,t,n,e){var r="alloy.toolbar.toggle";return{uid:o.uid,dom:o.dom,components:t,behaviours:Zs(o.splitToolbarBehaviours,[Yy.config({others:{overflowGroup:function(n){return bO.sketch(lt(lt({},e["overflow-group"]()),{items:[sp.sketch(lt(lt({},e["overflow-button"]()),{action:function(t){hr(n,r)}}))]}))}}}),fm("toolbar-toggle-events",[Cr(r,function(t){Bk(t,o)})])]),apis:{setGroups:function(t,n){var e=M(n,t.getSystem().build);o.builtGroups.set(e),Kk(t,o)},refresh:function(t){return Kk(t,o)},toggle:function(t){return Bk(t,o)},isOpen:function(t){return fl(t,o,"overflow").map(Z1.hasGrown).getOr(!1)}},domModification:{attributes:{role:"group"}}}},apis:{setGroups:function(t,n,e){t.setGroups(n,e)},refresh:function(t,n){t.refresh(n)},toggle:function(t,n){t.toggle(n)},isOpen:function(t,n){return t.isOpen(n)}}}),CO=T1.optional({factory:J1,name:"menubar",schema:[fo("backstage")]}),kO=T1.optional({factory:{sketch:function(t){return B1.sketch({uid:t.uid,dom:t.dom,listBehaviours:tc([Mg.config({mode:"acyclic",selector:".tox-toolbar"})]),makeItem:function(){return Rk({type:t.type,uid:Fr("multiple-toolbar-item"),cyclicKeying:!1,initGroups:[],providers:t.providers,onEscape:function(){return t.onEscape(),vt.some(!0)}})},setupItem:function(t,n,e,o){F1.setGroups(n,e)},shell:!0})}},name:"multiple-toolbar",schema:[fo("dom"),fo("onEscape")]}),OO=T1.optional({factory:{sketch:function(t){return(t.type===hh.sliding?function(t){var n=SO.parts.primary({dom:{tag:"div",classes:["tox-toolbar__primary"]}}),e=SO.parts.overflow({dom:{tag:"div",classes:["tox-toolbar__overflow"]}}),o=Ik(t);return SO.sketch(lt(lt({},o),{components:[n,e],markers:{openClass:"tox-toolbar__overflow--open",closedClass:"tox-toolbar__overflow--closed",growingClass:"tox-toolbar__overflow--growing",shrinkingClass:"tox-toolbar__overflow--shrinking",overflowToggledClass:"tox-tbtn--enabled"},onOpened:function(t){t.getSystem().broadcastOn([L1()],{type:"opened"})},onClosed:function(t){t.getSystem().broadcastOn([L1()],{type:"closed"})}}))}:t.type===hh.floating?function(i){var t=Ik(i),n=yO.parts.primary({dom:{tag:"div",classes:["tox-toolbar__primary"]}});return yO.sketch(lt(lt({},t),{lazySink:i.getSink,getOverflowBounds:function(){var t=i.moreDrawerData.lazyHeader().element,n=zn(t),e=Gt(t),o=zn(e),r=Math.max(e.dom.scrollHeight,o.height);return Be(n.x+4,o.y,n.width-8,r)},parts:lt(lt({},t.parts),{overflow:{dom:{tag:"div",classes:["tox-toolbar__overflow"],attributes:i.attributes}}}),components:[n],markers:{overflowToggledClass:"tox-tbtn--enabled"}}))}:Rk)({type:t.type,uid:t.uid,onEscape:function(){return t.onEscape(),vt.some(!0)},cyclicKeying:!1,initGroups:[],getSink:t.getSink,providers:t.providers,moreDrawerData:{lazyToolbar:t.lazyToolbar,lazyMoreButton:t.lazyMoreButton,lazyHeader:t.lazyHeader},attributes:t.attributes})}},name:"toolbar",schema:[fo("dom"),fo("onEscape"),fo("getSink")]}),_O=T1.optional({factory:{sketch:function(t){var n=t.editor,e=t.sticky?tk:I1;return{uid:t.uid,dom:t.dom,components:t.components,behaviours:tc(e(n,t.sharedBackstage))}}},name:"header",schema:[fo("dom")]}),TO=T1.optional({name:"socket",schema:[fo("dom")]}),EO=T1.optional({factory:{sketch:function(t){return{uid:t.uid,dom:{tag:"div",classes:["tox-sidebar"],attributes:{role:"complementary"}},components:[{dom:{tag:"div",classes:["tox-sidebar__slider"]},components:[],behaviours:tc([fy.config({}),Vg.config({}),Z1.config({dimension:{property:"width"},closedClass:"tox-sidebar--sliding-closed",openClass:"tox-sidebar--sliding-open",shrinkingClass:"tox-sidebar--sliding-shrinking",growingClass:"tox-sidebar--sliding-growing",onShrunk:function(t){ud.getCurrent(t).each(oO.hideAllSlots),hr(t,uO)},onGrown:function(t){hr(t,uO)},onStartGrow:function(t){vr(t,iO,{width:pn(t.element,"width").getOr("")})},onStartShrink:function(t){vr(t,iO,{width:kn(t.element)+"px"})}}),Fg.config({}),ud.config({find:function(t){return Y(Fg.contents(t))}})])}],behaviours:tc([rS(0),fm("sidebar-sliding-events",[Cr(iO,function(t,n){fn(t.element,"width",n.event.width)}),Cr(uO,function(t,n){vn(t.element,"width")})])])}}},name:"sidebar",schema:[fo("dom")]}),DO=T1.optional({factory:{sketch:function(t){return{uid:t.uid,dom:{tag:"div",attributes:{"aria-hidden":"true"},classes:["tox-throbber"],styles:{display:"none"}},behaviours:tc([Fg.config({}),cO.config({focus:!1}),ud.config({find:function(t){return Y(t.components())}})]),components:[]}}},name:"throbber",schema:[fo("dom")]}),BO=Sl({name:"OuterContainer",factory:function(e,t,n){return{uid:e.uid,dom:e.dom,components:t,apis:{getSocket:function(t){return _1.getPart(t,e,"socket")},setSidebar:function(t,n){_1.getPart(t,e,"sidebar").each(function(t){return pk(t,n)})},toggleSidebar:function(t,n){_1.getPart(t,e,"sidebar").each(function(t){var e=n;ud.getCurrent(t).each(function(n){ud.getCurrent(n).each(function(t){Z1.hasGrown(n)?oO.isShowing(t,e)?Z1.shrink(n):(oO.hideAllSlots(t),oO.showSlot(t,e)):(oO.hideAllSlots(t),oO.showSlot(t,e),Z1.grow(n))})})})},whichSidebar:function(t){return _1.getPart(t,e,"sidebar").bind(hk).getOrNull()},getHeader:function(t){return _1.getPart(t,e,"header")},getToolbar:function(t){return _1.getPart(t,e,"toolbar")},setToolbar:function(t,n){_1.getPart(t,e,"toolbar").each(function(t){t.getApis().setGroups(t,n)})},setToolbars:function(t,n){_1.getPart(t,e,"multiple-toolbar").each(function(t){B1.setItems(t,n)})},refreshToolbar:function(t){_1.getPart(t,e,"toolbar").each(function(t){return t.getApis().refresh(t)})},toggleToolbarDrawer:function(t){_1.getPart(t,e,"toolbar").each(function(n){var t=n.getApis().toggle;null!=t?vt.some(function(t){return t(n)}(t)):vt.none()})},isToolbarDrawerToggled:function(t){return _1.getPart(t,e,"toolbar").bind(function(n){return vt.from(n.getApis().isOpen).map(function(t){return t(n)})}).getOr(!1)},getThrobber:function(t){return _1.getPart(t,e,"throbber")},focusToolbar:function(t){_1.getPart(t,e,"toolbar").orThunk(function(){return _1.getPart(t,e,"multiple-toolbar")}).each(function(t){Mg.focusIn(t)})},setMenubar:function(t,n){_1.getPart(t,e,"menubar").each(function(t){J1.setMenus(t,n)})},focusMenubar:function(t){_1.getPart(t,e,"menubar").each(function(t){J1.focus(t)})}},behaviours:e.behaviours}},configFields:[fo("dom"),fo("behaviours")],partFields:[_O,CO,OO,kO,TO,EO,DO],apis:{getSocket:function(t,n){return t.getSocket(n)},setSidebar:function(t,n,e){t.setSidebar(n,e)},toggleSidebar:function(t,n,e){t.toggleSidebar(n,e)},whichSidebar:function(t,n){return t.whichSidebar(n)},getHeader:function(t,n){return t.getHeader(n)},getToolbar:function(t,n){return t.getToolbar(n)},setToolbar:function(t,n,e){var o=M(e,Ak);t.setToolbar(n,o)},setToolbars:function(t,n,e){var o=M(e,function(t){return M(t,Ak)});t.setToolbars(n,o)},refreshToolbar:function(t,n){return t.refreshToolbar(n)},toggleToolbarDrawer:function(t,n){t.toggleToolbarDrawer(n)},isToolbarDrawerToggled:function(t,n){return t.isToolbarDrawerToggled(n)},getThrobber:function(t,n){return t.getThrobber(n)},setMenubar:function(t,n,e){t.setMenubar(n,e)},focusMenubar:function(t,n){t.focusMenubar(n)},focusToolbar:function(t,n){t.focusToolbar(n)}}}),MO={file:{title:"File",items:"newdocument restoredraft | preview | export print | deleteallconversations"},edit:{title:"Edit",items:"undo redo | cut copy paste pastetext | selectall | searchreplace"},view:{title:"View",items:"code | visualaid visualchars visualblocks | spellchecker | preview fullscreen | showcomments"},insert:{title:"Insert",items:"image link media addcomment pageembed template codesample inserttable | charmap emoticons hr | pagebreak nonbreaking anchor toc | insertdatetime"},format:{title:"Format",items:"bold italic underline strikethrough superscript subscript codeformat | formats blockformats fontformats fontsizes align lineheight | forecolor backcolor | language | removeformat"},tools:{title:"Tools",items:"spellchecker spellcheckerlanguage | a11ycheck code wordcount"},table:{title:"Table",items:"inserttable | cell row column | advtablesort | tableprops deletetable"},help:{title:"Help",items:"help"}},AO=S(Nk,!1),FO=S(Nk,!0);function IO(t,n,e,o){var r;return{type:"basic",data:(r=t.getParam(n,e,"string"),M(o===$k.SemiColon?r.replace(/;$/,"").split(";"):r.split(" "),function(t){var n=t,e=t,o=t.split("=");return 1<o.length&&(n=o[0],e=o[1]),{title:n,format:e}}))}}function RO(e){var t={type:"basic",data:g_};return{tooltip:"Align",text:vt.none(),icon:vt.some("align-left"),isSelectedFor:function(t){return function(){return e.formatter.match(t)}},getCurrentValue:vt.none,getPreviewFor:function(t){return vt.none},onAction:function(n){return function(){return V(g_,function(t){return t.format===n.format}).each(function(t){return e.execCommand(t.command)})}},updateText:function(t){var n=V(g_,function(t){return e.formatter.match(t.format)}).fold(rt("left"),function(t){return t.title.toLowerCase()});vr(t,FS,{icon:"align-"+n})},dataset:t,shouldHide:!1,isInvalid:function(t){return!e.formatter.canApply(t.format)}}}function VO(t){return M(t.split(/\s*,\s*/),function(t){return t.replace(/^['"]+|['"]+$/g,"")})}function PO(r){function i(){function e(t){return t?VO(t)[0]:""}var t=r.queryCommandValue("FontName"),n=a.data,o=t?t.toLowerCase():"";return{matchOpt:V(n,function(t){var n=t.format;return n.toLowerCase()===o||e(n).toLowerCase()===e(o).toLowerCase()}).orThunk(function(){return ot(0===(t=o).indexOf("-apple-system")&&(n=VO(t.toLowerCase()),N(p_,function(t){return-1<n.indexOf(t.toLowerCase())})),{title:u,format:o});var t,n}),font:t}}var u="System Font",a=IO(r,"font_formats","Andale Mono=andale mono,monospace;Arial=arial,helvetica,sans-serif;Arial Black=arial black,sans-serif;Book Antiqua=book antiqua,palatino,serif;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,palatino,serif;Helvetica=helvetica,arial,sans-serif;Impact=impact,sans-serif;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco,monospace;Times New Roman=times new roman,times,serif;Trebuchet MS=trebuchet ms,geneva,sans-serif;Verdana=verdana,geneva,sans-serif;Webdings=webdings;Wingdings=wingdings,zapf dingbats",$k.SemiColon);return{tooltip:"Fonts",text:vt.some(u),icon:vt.none(),isSelectedFor:function(n){return function(t){return t.exists(function(t){return t.format===n})}},getCurrentValue:function(){return i().matchOpt},getPreviewFor:function(t){return function(){return vt.some({tag:"div",styles:-1===t.indexOf("dings")?{"font-family":t}:{}})}},onAction:function(t){return function(){r.undoManager.transact(function(){r.focus(),r.execCommand("FontName",!1,t.format)})}},updateText:function(t){var n=i(),e=n.matchOpt,o=n.font,r=e.fold(rt(o),function(t){return t.title});vr(t,AS,{text:r})},dataset:a,shouldHide:!1,isInvalid:O}}function HO(e){function i(){var a=vt.none(),c=o.data,s=e.queryCommandValue("FontSize");if(s)for(var t=function(t){var n,e,o,r,i=(e=t,/[0-9.]+px$/.test(n=s)?(o=72*parseInt(n,10)/96,r=Math.pow(10,e||0),Math.round(o*r)/r+"pt"):tt(v_,n).getOr(n)),u=tt(h_,i).getOr("");a=V(c,function(t){return t.format===s||t.format===i||t.format===u})},n=3;a.isNone()&&0<=n;n--)t(n);return{matchOpt:a,size:s}}var t=rt(vt.none),o=IO(e,"fontsize_formats","8pt 10pt 12pt 14pt 18pt 24pt 36pt",$k.Space);return{tooltip:"Font sizes",text:vt.some("12pt"),icon:vt.none(),isSelectedFor:function(n){return function(t){return t.exists(function(t){return t.format===n})}},getPreviewFor:t,getCurrentValue:function(){return i().matchOpt},onAction:function(t){return function(){e.undoManager.transact(function(){e.focus(),e.execCommand("FontSize",!1,t.format)})}},updateText:function(t){var n=i(),e=n.matchOpt,o=n.size,r=e.fold(rt(o),function(t){return t.title});vr(t,AS,{text:r})},dataset:o,shouldHide:!1,isInvalid:O}}function zO(t,n){var e=n(),o=M(e,function(t){return t.format});return vt.from(t.formatter.closest(o)).bind(function(n){return V(e,function(t){return t.format===n})}).orThunk(function(){return ot(t.formatter.match("p"),{title:"Paragraph",format:"p"})})}function NO(e){var o=IO(e,"block_formats","Paragraph=p;Heading 1=h1;Heading 2=h2;Heading 3=h3;Heading 4=h4;Heading 5=h5;Heading 6=h6;Preformatted=pre",$k.SemiColon);return{tooltip:"Blocks",text:vt.some("Paragraph"),icon:vt.none(),isSelectedFor:function(t){return function(){return e.formatter.match(t)}},getCurrentValue:vt.none,getPreviewFor:function(n){return function(){var t=e.formatter.get(n);return vt.some({tag:0<t.length&&(t[0].inline||t[0].block)||"div",styles:e.dom.parseStyle(e.formatter.getCssText(n))})}},onAction:Uk(e),updateText:function(t){var n=zO(e,function(){return o.data}).fold(rt("Paragraph"),function(t){return t.title});vr(t,AS,{text:n})},dataset:o,shouldHide:!1,isInvalid:function(t){return!e.formatter.canApply(t.format)}}}function LO(r,t){return{tooltip:"Formats",text:vt.some("Paragraph"),icon:vt.none(),isSelectedFor:function(t){return function(){return r.formatter.match(t)}},getCurrentValue:vt.none,getPreviewFor:function(n){return function(){var t=r.formatter.get(n);return void 0!==t?vt.some({tag:0<t.length&&(t[0].inline||t[0].block)||"div",styles:r.dom.parseStyle(r.formatter.getCssText(n))}):vt.none()}},onAction:Uk(r),updateText:function(t){var e=function(t){var n=t.items;return void 0!==n&&0<n.length?z(n,e):[{title:t.title,format:t.format}]},n=z(pC(r),e),o=zO(r,rt(n)).fold(rt("Paragraph"),function(t){return t.title});vr(t,AS,{text:o})},shouldHide:r.getParam("style_formats_autohide",!1,"boolean"),isInvalid:function(t){return!r.formatter.canApply(t.format)},dataset:t}}function WO(n){return{isDisabled:function(){return dd.isDisabled(n)},setDisabled:function(t){return dd.set(n,t)}}}function UO(n){return{setActive:function(t){zg.set(n,t)},isActive:function(){return zg.isOn(n)},isDisabled:function(){return dd.isDisabled(n)},setDisabled:function(t){return dd.set(n,t)}}}function jO(t,n){return t.map(function(t){return{"aria-label":n.translate(t),title:n.translate(t)}}).getOr({})}function GO(n,e,t,o,r,i){var u;return{dom:{tag:"button",classes:["tox-tbtn"].concat(e.isSome()?["tox-tbtn--select"]:[]),attributes:jO(t,i)},components:Qv([n.map(function(t){return I0(t,i.icons)}),e.map(function(t){return V0(t,"tox-tbtn",i)})]),eventOrder:((u={})[di()]=["focusing","alloy.base.behaviour","common-button-display-events"],u),buttonBehaviours:tc([Jv(i.isDisabled),mv(),fm("common-button-display-events",[Cr(di(),function(t,n){n.event.prevent(),hr(t,k_)})])].concat(o.map(function(t){return x_.config({channel:t,initialData:{icon:n,text:e},renderComponents:function(t,n){return Qv([t.icon.map(function(t){return I0(t,i.icons)}),t.text.map(function(t){return V0(t,"tox-tbtn",i)})])}})}).toArray()).concat(r.getOr([])))}}function XO(t,n,e){var o,r=Vo(st),i=GO(t.icon,t.text,t.tooltip,vt.none(),vt.none(),e);return sp.sketch({dom:i.dom,components:i.components,eventOrder:MS,buttonBehaviours:tc([fm("toolbar-button-events",[(o={onAction:t.onAction,getApi:n.getApi},iu(function(n,t){gv(o,n)(function(t){vr(n,BS,{buttonApi:t}),o.onAction(t)})})),pv(n,r),hv(n,r)]),Jv(function(){return t.disabled||e.isDisabled()}),mv()].concat(n.toolbarButtonBehaviours))})}function YO(r,i){return function(t,n,e){var o=r(t).mapError(function(t){return ir(t)}).getOrDie();return i(o,n,e)}}function qO(e,t,o,r){var n,i=t.outerContainer,u=o.toolbar,a=o.buttons;f(u,y)?(n=u.map(function(t){var n={toolbar:t,buttons:a,allowToolbarGroups:o.allowToolbarGroups};return B_(e,n,{backstage:r},vt.none())}),BO.setToolbars(i,n)):BO.setToolbar(i,B_(e,o,{backstage:r},vt.none()))}function KO(t){return/^[0-9\.]+(|px)$/i.test(""+t)?vt.some(parseInt(""+t,10)):vt.none()}function JO(t){return u(t)?t+"px":t}function $O(n,t,e){var o=t.filter(function(t){return n<t}),r=e.filter(function(t){return t<n});return o.or(r).getOr(n)}function QO(t){var n=ch(t),e=sh(t),o=fh(t);return KO(n).map(function(t){return $O(t,e,o)})}function ZO(u,a,t,n,c){function s(){return x.get()&&!u.removed}function l(t){return y?t.fold(rt(0),function(t){return 1<t.components().length?xn(t.components()[1].element):0}):0}function f(){r.broadcastOn([bf()],{})}function o(t){var n,e,o,r,i;void 0===t&&(t=!1),s()&&(m||(n=p.getOrThunk(function(){var t=KO(gn(ve(),"margin-left")).getOr(0);return kn(ve())-Cn(a).left+t}),fn(c.get().element,"max-width",n+"px")),y&&BO.refreshToolbar(d),m||(e=l(BO.getToolbar(d)),o=Me(a),r=v()?Math.max(o.y-xn(c.get().element)+e,0):o.bottom,dn(d.element,{position:"absolute",top:Math.round(r)+"px",left:Math.round(o.x)+"px"})),g&&(i=c.get(),t?N1.reset(i):N1.refresh(i)),f())}function e(t){var n,e;void 0===t&&(t=!0),!m&&g&&s()&&(n=h.getDockingMode(),(e=function(t){switch(rv(u)){case bh.auto:var n=l(BO.getToolbar(d)),e=xn(t.element)-n,o=Me(a);if(o.y>e)return"top";var r=Gt(a),i=Math.max(r.dom.scrollHeight,xn(r));return o.bottom<i-e||Ae().bottom<o.bottom-e?"bottom":"top";case bh.bottom:return"bottom";default:return bh.top,"top"}}(c.get()))!==n&&(function(t){var n=c.get();N1.setModes(n,[t]),h.setDockingMode(t);var e=v()?Cc.TopToBottom:Cc.BottomToTop;on(n.element,ts,e)}(e),t&&o(!0)))}var r=t.uiMothership,d=t.outerContainer,i=tv.DOM,m=av(u),g=lv(u),p=fh(u).or(QO(u)),h=n.shared.header,v=h.isPositionedAtTop,b=ov(u),y=b===hh.sliding||b===hh.floating,x=Vo(!1);return{isVisible:s,isPositionedAtTop:v,show:function(){x.set(!0),fn(d.element,"display","flex"),i.addClass(u.getBody(),"mce-edit-focus"),vn(r.element,"display"),e(!1),o()},hide:function(){x.set(!1),t.outerContainer&&(fn(d.element,"display","none"),i.removeClass(u.getBody(),"mce-edit-focus")),fn(r.element,"display","none")},update:o,updateMode:e,repositionPopups:f}}function t_(t,n){var e=Me(t);return{pos:n?e.y:e.bottom,bounds:e}}function n_(i,u){return Cr(BS,function(t,n){var e,o=i.get(t),r=(e=o,{hide:function(){return hr(e,Pi())},getValue:function(){return Tf.getValue(e)}});u.onAction(r,n.event.buttonApi)})}function e_(t,n,e){return n.bottom-t.y>=(e=void 0===e?.01:e)&&t.bottom-n.y>=e}function o_(t){var n=function(t){var n=t.getBoundingClientRect();if(n.height<=0&&n.width<=0){var e=Qt(At.fromDom(t.startContainer),t.startOffset).element;return(Xn(e)?Yt(e):vt.some(e)).filter(Gn).map(function(t){return t.dom.getBoundingClientRect()}).getOr(n)}return n}(t.selection.getRng());if(t.inline){var e=In();return Be(e.left+n.left,e.top+n.top,n.width,n.height)}var o=zn(At.fromDom(t.getBody()));return Be(o.x+n.left,o.y+n.top,n.width,n.height)}function r_(t,n,e,o){void 0===o&&(o=0);var r,i,u,a,c=Pn(window),s=Me(At.fromDom(t.getContentAreaContainer())),l=mh(t)||gh(t)||ev(t),f=(r=s,i=c,u=o,{x:a=Math.max(r.x+u,i.x),width:Math.min(r.right-u,i.right)-a}),d=f.x,m=f.width;if(t.inline&&!l)return Be(d,c.y,m,c.height);var g=function(t,n,e,o,r,i){var u=At.fromDom(t.getContainer()),a=Fu(u,".tox-editor-header").getOr(u),c=Me(a),s=c.y>=n.bottom,l=o&&!s;if(t.inline&&l)return{y:Math.max(c.bottom+i,e.y),bottom:e.bottom};if(t.inline&&!l)return{y:e.y,bottom:Math.min(c.y-i,e.bottom)};var f="line"===r?Me(u):n;return l?{y:Math.max(c.bottom+i,e.y),bottom:Math.min(f.bottom-i,e.bottom)}:{y:Math.max(f.y+i,e.y),bottom:Math.min(c.y-i,e.bottom)}}(t,s,c,n.header.isPositionedAtTop(),e,o),p=g.y,h=g.bottom;return Be(d,p,m,h-p)}function i_(t){return"node"===t}function u_(t,r,n,i,e){var u=o_(t),o=i.lastElement().exists(function(t){return Lt(n,t)}),a=n,c=t.selection.getRng(),s=Qt(At.fromDom(c.startContainer),c.startOffset);return c.startContainer===c.endContainer&&c.startOffset===c.endOffset-1&&Lt(s.element,a)?o?Im:up:o?function(n,t){var e=pn(n,"position");fn(n,"position",t);var o=e_(u,Me(r))&&!i.isReposition()?Vm:Im;return e.each(function(t){return fn(n,"position",t)}),o}(r,i.getMode()):("fixed"===i.getMode()?e.y+In().top:e.y)+(xn(r)+12)<=u.y?up:ap}function a_(n,t){var e=A(F(t,function(t){return t.predicate(n.dom)}),function(t){return"contexttoolbar"===t.type});return{contextToolbars:e.pass,contextForms:e.fail}}function c_(e,t){function o(t){return Lt(t,r)}var n,r=At.fromDom(t.getBody()),i=At.fromDom(t.selection.getNode());return o(n=i)||Wt(r,n)?function(t,n,e){var o=a_(t,n);if(0<o.contextForms.length)return vt.some({elem:t,toolbars:[o.contextForms[0]]});var r=a_(t,e);if(0<r.contextForms.length)return vt.some({elem:t,toolbars:[r.contextForms[0]]});if(0<o.contextToolbars.length||0<r.contextToolbars.length){var i=function(t){if(t.length<=1)return t;function n(n){return T(t,function(t){return t.position===n})}function e(n){return F(t,function(t){return t.position===n})}var o=n("selection"),r=n("node");if(o||r){if(r&&o){var i=e("node"),u=M(e("selection"),function(t){return lt(lt({},t),{position:"node"})});return i.concat(u)}return e(o?"selection":"node")}return e("line")}(o.contextToolbars.concat(r.contextToolbars));return vt.some({elem:t,toolbars:i})}return vt.none()}(i,e.inNodeScope,e.inEditorScope).orThunk(function(){return a=e,(t=o)(n=i)?vt.none():fr(n,function(t){if(Gn(t)){var n=a_(t,a.inNodeScope),e=n.contextToolbars,o=n.contextForms,r=0<o.length?o:(u=e).length<=1?u:i("selection").orThunk(function(){return i("node")}).orThunk(function(){return i("line")}).map(function(t){return t.position}).fold(function(){return[]},function(n){return F(u,function(t){return t.position===n})});return 0<r.length?vt.some({elem:t,toolbars:r}):vt.none()}function i(n){return V(u,function(t){return t.position===n})}var u;return vt.none()},t);var t,n,a}):vt.none()}function s_(a,c){var s={},l=[],f=[],d={},m={},t=kt(a);return St(t,function(t){var n,e,o,r,i,u=a[t];"contextform"===u.type?(o=t,i=ao(uo("ContextForm",Xp,r=u)),(s[o]=i).launch.map(function(t){d["form:"+o]=lt(lt({},r.launch),{type:"contextformtogglebutton"===t.type?"togglebutton":"button",onAction:function(){c(i)}})}),("editor"===i.scope?f:l).push(i),m[o]=i):"contexttoolbar"===u.type&&(n=t,uo("ContextToolbar",Yp,e=u).each(function(t){("editor"===e.scope?f:l).push(t),m[n]=t}))}),{forms:s,inNodeScope:l,inEditorScope:f,lookupTable:m,formNavigators:d}}function l_(d,t,m,u){function a(){var t=y.get().getOr("node"),n=i_(t)?1:0;return r_(d,p,t,n)}function c(){return!(d.removed||h()&&g.isContextMenuOpen())}function s(){if(c()){var t=a(),n=mt(y.get(),"node")?(e=d,v.get().filter(he).map(zn).getOrThunk(function(){return o_(e)})):o_(d);return t.height<=0||!e_(n,t)}return 1;var e}function n(){v.clear(),b.clear(),y.clear(),rp.hide(x)}function e(){var t;rp.isOpen(x)&&(vn(t=x.element,"display"),s()?fn(t,"display","none"):(b.set(0),rp.reposition(x)))}function l(t){return{dom:{tag:"div",classes:["tox-pop__dialog"]},components:[t],behaviours:tc([Mg.config({mode:"acyclic"}),fm("pop-dialog-wrap-events",[eu(function(t){d.shortcuts.add("ctrl+F9","focus statusbar",function(){return Mg.focusIn(t)})}),ou(function(t){d.shortcuts.remove("ctrl+F9")})])])}}function f(t,n){var e,o,r,i,c,s,u,a="node"===t?p.anchors.node(n):p.anchors.cursor(),l=(e=d,o=t,r=h(),i={lastElement:v.get,isReposition:function(){return mt(b.get(),0)},getMode:function(){return sf.getMode(m)}},"line"===o?{bubble:xc(12,0,P_),layouts:{onLtr:function(){return[sa]},onRtl:function(){return[la]}},overrides:H_}:{bubble:xc(0,12,P_,1/12),layouts:(c=e,s=i,u=o,r?{onLtr:function(t){return[Ja,Ga,Xa,Ya,qa,Ka].concat(f(t))},onRtl:function(t){return[Ja,Xa,Ga,qa,Ya,Ka].concat(f(t))}}:{onLtr:function(t){return[Ka,Ja,Ya,Ga,qa,Xa].concat(f(t))},onRtl:function(t){return[Ka,Ja,qa,Xa,Ya,Ga].concat(f(t))}}),overrides:H_});function f(t){return i_(u)?[(a=t,function(t,n,e,o,r){var i=u_(c,o,a,s,r),u=lt(lt({},t),{y:r.y,height:r.height});return lt(lt({},i(u,n,e,o,r)),{alwaysFit:!0})})]:[];var a}return Xo(a,l)}function o(t,n){var e,o,r,i;C.cancel(),c()&&(e=S(t),r=f(o=t[0].position,n),y.set(o),b.set(1),vn(i=x.element,"display"),mt(Et(n,v.get(),Lt),!0)||(Yr(i,U_),sf.reset(m,x)),rp.showWithinBounds(x,l(e),{anchor:r,transition:{classes:[U_],mode:"placement"}},function(){return vt.some(a())}),n.fold(v.clear,v.set),s()&&fn(i,"display","none"))}var r,i,g=u.backstage,p=g.shared,h=se().deviceType.isTouch,v=dc(),b=dc(),y=dc(),x=_u((r={sink:m,onEscape:function(){return d.focus(),vt.some(!0)}},i=Vo([]),rp.sketch({dom:{tag:"div",classes:["tox-pop"]},fireDismissalEventInstead:{event:"doNotDismissYet"},onShow:function(t){i.set([]),rp.getContent(t).each(function(t){vn(t.element,"visibility")}),Yr(t.element,W_),vn(t.element,"width")},inlineBehaviours:tc([fm("context-toolbar-events",[Dr(Oi(),function(t,n){"width"===n.event.raw.propertyName&&(Yr(t.element,W_),vn(t.element,"width"))}),Cr(L_,function(t,n){var e=t.element;vn(e,"width");var o=kn(e);rp.setContent(t,n.event.contents),Xr(e,W_);var r=kn(e);fn(e,"width",o+"px"),rp.getContent(t).each(function(t){n.event.focus.bind(function(t){return Sa(t),Oa(e)}).orThunk(function(){return Mg.focusIn(t),ka(me(e))})}),cp.setTimeout(function(){fn(t.element,"width",r+"px")},0)}),Cr(z_,function(n,t){rp.getContent(n).each(function(t){i.set(i.get().concat([{bar:t,focus:ka(me(n.element))}]))}),vr(n,L_,{contents:t.event.forwardContents,focus:vt.none()})}),Cr(N_,function(n,t){q(i.get()).each(function(t){i.set(i.get().slice(0,i.get().length-1)),vr(n,L_,{contents:Tu(t.bar),focus:t.focus})})})]),Mg.config({mode:"special",onEscape:function(n){return q(i.get()).fold(function(){return r.onEscape()},function(t){return hr(n,N_),vt.some(!0)})}})]),lazySink:function(){return Re.value(r.sink)}}))),w=Rt(function(){return s_(t,function(t){var n=S([t]);vr(x,z_,{forwardContents:l(n)})})}),S=function(t){var n=d.ui.registry.getAll().buttons,e=w(),o=lt(lt({},n),e.formNavigators),r=ov(d)===hh.scrolling?hh.scrolling:hh.default,i=ft(M(t,function(t){return"contexttoolbar"===t.type?B_(d,{buttons:o,toolbar:t.items,allowToolbarGroups:!1},u,vt.some(["form:"])):(n=p.providers,V_(t,n));var n}));return Rk({type:r,uid:Fr("context-toolbar"),initGroups:i,onEscape:vt.none,cyclicKeying:!0,providers:p.providers})},C=pp(function(){d.hasFocus()&&!d.removed&&(qr(x.element,U_)?C.throttle():c_(w(),d).fold(n,function(t){o(t.toolbars,vt.some(t.elem))}))},17);d.on("init",function(){d.on("remove",n),d.on("ScrollContent ScrollWindow ObjectResized ResizeEditor longpress",e),d.on("click keyup focus SetContent",C.throttle),d.on(R_,n),d.on("contexttoolbar-show",function(n){tt(w().lookupTable,n.toolbarKey).each(function(t){o([t],ot(n.target!==d,n.target)),rp.getContent(x).each(Mg.focusIn)})}),d.on("focusout",function(t){cp.setEditorTimeout(d,function(){Oa(m.element).isNone()&&Oa(x.element).isNone()&&n()},0)}),d.on("SwitchMode",function(){d.mode.isReadOnly()&&n()}),d.on("AfterProgressState",function(t){t.state?n():d.hasFocus()&&C.throttle()}),d.on("NodeChange",function(t){Oa(x.element).fold(C.throttle,st)})})}(Qk=$k=$k||{})[Qk.SemiColon=0]="SemiColon",Qk[Qk.Space=1]="Space";var f_,d_,m_,g_=[{title:"Left",icon:"align-left",format:"alignleft",command:"JustifyLeft"},{title:"Center",icon:"align-center",format:"aligncenter",command:"JustifyCenter"},{title:"Right",icon:"align-right",format:"alignright",command:"JustifyRight"},{title:"Justify",icon:"align-justify",format:"alignjustify",command:"JustifyFull"}],p_=["-apple-system","Segoe UI","Roboto","Helvetica Neue","sans-serif"],h_={"8pt":"1","10pt":"2","12pt":"3","14pt":"4","18pt":"5","24pt":"6","36pt":"7"},v_={"xx-small":"7pt","x-small":"8pt",small:"10pt",medium:"12pt",large:"14pt","x-large":"18pt","xx-large":"24pt"},b_=Object.freeze({__proto__:null,events:function(r,i){function u(e,o){r.updateState.each(function(t){var n=t(e,o);i.set(n)}),r.renderComponents.each(function(t){var n=M(t(o,i.get()),e.getSystem().build);Fs(e,n)})}return nu([Cr(Ai(),function(t,n){var e,o=n;o.universal||(e=r.channel,wt(o.channels,e)&&u(t,o.data))}),eu(function(n,t){r.initialData.each(function(t){u(n,t)})})])}}),y_=Object.freeze({__proto__:null,getState:function(t,n,e){return e}}),x_=ya({fields:[fo("channel"),xo("renderComponents"),xo("updateState"),xo("initialData")],name:"reflecting",active:b_,apis:y_,state:Object.freeze({__proto__:null,init:function(){var t=Vo(vt.none());return{readState:function(){return t.get().getOr("none")},get:t.get,set:t.set,clear:function(){return t.set(vt.none())}}}})}),w_=rt([fo("toggleClass"),fo("fetch"),$u("onExecute"),To("getHotspot",vt.some),To("getAnchorOverrides",rt({})),Nc(),$u("onItemExecute"),xo("lazySink"),fo("dom"),Ku("onOpen"),$s("splitDropdownBehaviours",[Yy,Mg,Vg]),To("matchWidth",!1),To("useMinWidth",!1),To("eventOrder",{}),xo("role")].concat(ex())),S_=rt([qf({factory:sp,schema:[fo("dom")],name:"arrow",defaults:function(){return{buttonBehaviours:tc([Vg.revoke()])}},overrides:function(n){return{dom:{tag:"span",attributes:{role:"presentation"}},action:function(t){t.getSystem().getByUid(n.uid).each(br)},buttonBehaviours:tc([zg.config({toggleOnExecute:!1,toggleClass:n.toggleClass})])}}}),qf({factory:sp,schema:[fo("dom")],name:"button",defaults:function(){return{buttonBehaviours:tc([Vg.revoke()])}},overrides:function(e){return{dom:{tag:"span",attributes:{role:"presentation"}},action:function(n){n.getSystem().getByUid(e.uid).each(function(t){e.onExecute(t,n)})}}}}),Jf({factory:{sketch:function(t){return{uid:t.uid,dom:{tag:"span",styles:{display:"none"},attributes:{"aria-hidden":"true"},innerHtml:t.text}}}},schema:[fo("text")],name:"aria-descriptor"}),Kf({schema:[Xu()],name:"menu",defaults:function(o){return{onExecute:function(n,e){n.getSystem().getByUid(o.uid).each(function(t){o.onItemExecute(t,n,e)})}}}}),Ky()]),C_=Sl({name:"SplitDropdown",configFields:w_(),partFields:S_(),factory:function(o,t,n,e){function r(t){ud.getCurrent(t).each(function(t){gd.highlightFirst(t),Mg.focusIn(t)})}function i(t){Qy(o,h,t,e,r,Iy.HighlightFirst).get(st)}function u(t){return br(dl(t,o,"button")),vt.some(!0)}var a,c=lt(lt({},nu([eu(function(e,t){fl(e,o,"aria-descriptor").each(function(t){var n=Fr("aria");on(t.element,"id",n),on(e.element,"aria-describedby",n)})})])),xm(vt.some(i))),s={repositionMenus:function(t){zg.isOn(t)&&nx(t)}};return{uid:o.uid,dom:o.dom,components:t,apis:s,eventOrder:lt(lt({},o.eventOrder),((a={})[Fi()]=["disabling","toggling","alloy.base.behaviour"],a)),events:c,behaviours:Zs(o.splitDropdownBehaviours,[Yy.config({others:{sandbox:function(t){var n=dl(t,o,"arrow");return tx(o,t,{onOpen:function(){zg.on(n),zg.on(t)},onClose:function(){zg.off(n),zg.off(t)}})}}}),Mg.config({mode:"special",onSpace:u,onEnter:u,onDown:function(t){return i(t),vt.some(!0)}}),Vg.config({}),zg.config({toggleOnExecute:!1,aria:{mode:"expanded"}})]),domModification:{attributes:{role:o.role.getOr("button"),"aria-haspopup":!0}}}},apis:{repositionMenus:function(t,n){return t.repositionMenus(n)}}}),k_=Fr("focus-button"),O_=function(t,n,e){return XO(t,{toolbarButtonBehaviours:[].concat(0<e.length?[fm("toolbarButtonWith",e)]:[]),getApi:WO,onSetup:t.onSetup},n)},__=function(t,n,e){return Xo(XO(t,{toolbarButtonBehaviours:[Fg.config({}),zg.config({toggleClass:"tox-tbtn--enabled",aria:{mode:"pressed"},toggleOnExecute:!1})].concat(0<e.length?[fm("toolbarToggleButtonWith",e)]:[]),getApi:UO,onSetup:t.onSetup},n))},T_=[{name:"history",items:["undo","redo"]},{name:"styles",items:["styleselect"]},{name:"formatting",items:["bold","italic"]},{name:"alignment",items:["alignleft","aligncenter","alignright","alignjustify"]},{name:"indentation",items:["outdent","indent"]},{name:"permanent pen",items:["permanentpen"]},{name:"comments",items:["addcomment"]}],E_={button:YO(Cp,function(t,n){return e=n.backstage.shared.providers,O_(t,e,[]);var e}),togglebutton:YO(kp,function(t,n){return e=n.backstage.shared.providers,__(t,e,[]);var e}),menubutton:YO(nk,function(t,n){return L0(t,"tox-tbtn",n.backstage,vt.none())}),splitbutton:YO(function(t){return uo("SplitButton",K1,t)},function(t,n){return o=t,r=n.backstage.shared,s=Fr("channel-update-split-dropdown-display"),l=Vo(st),f={getApi:e,onSetup:o.onSetup},C_.sketch({dom:{tag:"div",classes:["tox-split-button"],attributes:lt({"aria-pressed":!1},jO(o.tooltip,r.providers))},onExecute:function(t){o.onAction(e(t))},onItemExecute:function(t,n,e){},splitDropdownBehaviours:tc([Gv(r.providers.isDisabled),mv(),fm("split-dropdown-events",[Cr(k_,Vg.focus),pv(f,l),hv(f,l)]),mw.config({})]),eventOrder:((i={})[ji()]=["alloy.base.behaviour","split-dropdown-events"],i),toggleClass:"tox-tbtn--enabled",lazySink:r.getSink,fetch:(u=e,a=o,c=r.providers,function(n){return Ny(function(t){return a.fetch(t)}).map(function(t){return vt.from(Wb(Xo(Cb(Fr("menu-value"),t,function(t){a.onItemAction(u(n),t)},a.columns,a.presets,xh.CLOSE_ON_EXECUTE,a.select.getOr(O),c),{movement:kb(a.columns,a.presets),menuBehaviours:Yh("auto"!==a.columns?[]:[eu(function(o,t){ih(o,4,qp(a.presets)).each(function(t){var n=t.numRows,e=t.numColumns;Mg.setGridSize(o,n,e)})})])})))})}),parts:{menu:$p(0,o.columns,o.presets)},components:[C_.parts.button(GO(o.icon,o.text,vt.none(),vt.some(s),vt.some([zg.config({toggleClass:"tox-tbtn--enabled",toggleOnExecute:!1})]),r.providers)),C_.parts.arrow({dom:{tag:"button",classes:["tox-tbtn","tox-split-button__chevron"],innerHtml:Lm("chevron-down",r.providers.icons)},buttonBehaviours:tc([Gv(r.providers.isDisabled),mv(),Wm()])}),C_.parts["aria-descriptor"]({text:r.providers.translate("To open the popup, press Shift+Enter")})]});function e(e){return{isDisabled:function(){return dd.isDisabled(e)},setDisabled:function(t){return dd.set(e,t)},setIconFill:function(t,n){Fu(e.element,'svg path[id="'+t+'"], rect[id="'+t+'"]').each(function(t){on(t,"fill",n)})},setIconStroke:function(t,n){Fu(e.element,'svg path[id="'+t+'"], rect[id="'+t+'"]').each(function(t){on(t,"stroke",n)})},setActive:function(n){on(e.element,"aria-pressed",n),Fu(e.element,"span").each(function(t){e.getSystem().getByDom(t).each(function(t){return zg.set(t,n)})})},isActive:function(){return Fu(e.element,"span").exists(function(t){return e.getSystem().getByDom(t).exists(zg.isOn)})}}}var o,r,i,u,a,c,s,l,f}),grouptoolbarbutton:YO(function(t){return uo("GroupToolbarButton",X1,t)},function(t,n,e){var o,r,i,u,a,c,s=e.ui.registry.getAll().buttons,l=((o={})[ts]=n.backstage.shared.header.isPositionedAtTop()?Cc.TopToBottom:Cc.BottomToTop,o);if(ov(e)!==hh.floating)throw new Error("Toolbar groups are only supported when using floating toolbar mode");return i=n.backstage,u=function(t){return B_(e,{buttons:s,toolbar:t,allowToolbarGroups:!1},n,vt.none())},a=l,c=i.shared,pO.sketch({lazySink:c.getSink,fetch:function(){return Ny(function(t){t(M(u(r.items),Ak))})},markers:{toggledClass:"tox-tbtn--enabled"},parts:{button:GO((r=t).icon,r.text,r.tooltip,vt.none(),vt.none(),c.providers),toolbar:{dom:{tag:"div",classes:["tox-toolbar__overflow"],attributes:a}}}})}),styleSelectButton:function(t,n){return Xk(t,e=n.backstage,LO(t,lt({type:"advanced"},e.styleselect)));var e},fontsizeSelectButton:function(t,n){return Xk(t,n.backstage,HO(t))},fontSelectButton:function(t,n){return Xk(t,n.backstage,PO(t))},formatButton:function(t,n){return Xk(t,n.backstage,NO(t))},alignMenuButton:function(t,n){return Xk(t,n.backstage,RO(t))}},D_={styleselect:E_.styleSelectButton,fontsizeselect:E_.fontsizeSelectButton,fontselect:E_.fontSelectButton,formatselect:E_.formatButton,align:E_.alignMenuButton},B_=function(o,c,s,l){var e,t,n,r,i=(n=c.toolbar,r=c.buttons,!1===n?[]:void 0===n||!0===n?(e=r,t=M(T_,function(t){var n=F(t.items,function(t){return Tt(e,t)||Tt(D_,t)});return{name:t.name,items:n}}),F(t,function(t){return 0<t.items.length})):y(n)?M(n.split("|"),function(t){return{items:t.trim().split(" ")}}):f(n,function(t){return Tt(t,"name")&&Tt(t,"items")})?n:(console.error("Toolbar type should be string, string[], boolean or ToolbarGroup[]"),[]));return F(M(i,function(t){var n=z(t.items,function(t){return 0===t.trim().length?[]:(r=o,n=c.buttons,i=t,u=c.allowToolbarGroups,a=s,e=l,tt(n,i.toLowerCase()).orThunk(function(){return e.bind(function(t){return K(t,function(t){return tt(n,t+i.toLowerCase())})})}).fold(function(){return tt(D_,i.toLowerCase()).map(function(t){return t(r,a)}).orThunk(function(){return vt.none()})},function(t){return"grouptoolbarbutton"!==t.type||u?(e=a,o=r,tt(E_,(n=t).type).fold(function(){return console.error("skipping button defined by",n),vt.none()},function(t){return vt.some(t(n,e,o))})):(console.warn("Ignoring the '"+i+"' toolbar button. Group toolbar buttons are only supported when using floating toolbar mode and cannot be nested."),vt.none());var n,e,o}).toArray());var r,n,i,u,a,e});return{title:vt.from(o.translate(t.name)),items:n}}),function(t){return 0<t.items.length})},M_=se(),A_=M_.os.isiOS()&&M_.os.version.major<=12,F_=Object.freeze({__proto__:null,render:function(e,n,t,o,r){var i=Vo(0),u=n.outerContainer;AO(e);var a=At.fromDom(r.targetNode),c=tn(me(a)),s=n.mothership;mf(a,s,Dn),Hs(c,n.uiMothership),e.on("PostRender",function(){qO(e,n,t,o),i.set(e.getWin().innerWidth),BO.setMenubar(u,Pk(e,t)),BO.setSidebar(u,t.sidebar),function(e,t){function n(){var t=c.get();t.left===u.innerWidth&&t.top===u.innerHeight||(c.set(Se(u.innerWidth,u.innerHeight)),Nv(e))}function o(){var t=e.getDoc().documentElement,n=s.get();n.left===t.offsetWidth&&n.top===t.offsetHeight||(s.set(Se(t.offsetWidth,t.offsetHeight)),Nv(e))}function r(t){return e.fire("ScrollContent",t)}var i=e.dom,u=e.getWin(),a=e.getDoc().documentElement,c=Vo(Se(u.innerWidth,u.innerHeight)),s=Vo(Se(a.offsetWidth,a.offsetHeight));i.bind(u,"resize",n),i.bind(u,"scroll",r);var l=gc(At.fromDom(e.getBody()),"load",o),f=t.uiMothership.element;e.on("hide",function(){fn(f,"display","none")}),e.on("show",function(){vn(f,"display")}),e.on("NodeChange",o),e.on("remove",function(){l.unbind(),i.unbind(u,"resize",n),i.unbind(u,"scroll",r),u=null})}(e,n)});var l,f,d,m,g=BO.getSocket(u).getOrDie("Could not find expected socket element");A_&&(dn(g.element,{overflow:"scroll","-webkit-overflow-scrolling":"touch"}),f=function(){e.fire("ScrollContent")},d=null,m=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];b(d)&&(d=setTimeout(function(){d=null,f.apply(null,t)},20))},l=mc(g.element,"scroll",m),e.on("remove",l.unbind)),dv(e,n),e.addCommand("ToggleSidebar",function(t,n){BO.toggleSidebar(u,n),e.fire("ToggleSidebar")}),e.addQueryValueHandler("ToggleSidebar",function(){return BO.whichSidebar(u)});var p=ov(e);p!==hh.sliding&&p!==hh.floating||e.on("ResizeWindow ResizeEditor ResizeContent",function(){var t=e.getWin().innerWidth;t!==i.get()&&(BO.refreshToolbar(n.outerContainer),i.set(t))});var h={enable:function(){fv(n,!1)},disable:function(){fv(n,!0)},isDisabled:function(){return dd.isDisabled(u)}};return{iframeContainer:g.element.dom,editorContainer:u.element.dom,api:h}}}),I_=Object.freeze({__proto__:null,render:function(n,e,o,r,t){var i=e.mothership,u=e.uiMothership,a=e.outerContainer,c=Vo(null),s=At.fromDom(t.targetNode),l=ZO(n,s,e,r,c),f=n.getParam("toolbar_persist",!1,"boolean");function d(){var t;c.get()?l.show():(c.set(BO.getHeader(a).getOrDie()),Hs(t=cv(n),i),Hs(t,u),qO(n,e,o,r),BO.setMenubar(a,Pk(n,o)),l.show(),function(c,s,l,t){function n(t){var n=t_(s,l.isPositionedAtTop()),e=n.pos,o=n.bounds,r=f.get(),i=r.pos,u=r.bounds,a=o.height!==u.height||o.width!==u.width;f.set({pos:e,bounds:o}),a&&Nv(c,t),l.isVisible()&&(i!==e?l.update(!0):a&&(l.updateMode(),l.repositionPopups()))}var f=Vo(t_(s,l.isPositionedAtTop()));t||(c.on("activate",l.show),c.on("deactivate",l.hide)),c.on("SkinLoaded ResizeWindow",function(){return l.update(!0)}),c.on("NodeChange keydown",function(t){cp.requestAnimationFrame(function(){return n(t)})}),c.on("ScrollWindow",function(){return l.updateMode()});var e=fc();e.set(gc(At.fromDom(c.getBody()),"load",n)),c.on("remove",function(){e.clear()})}(n,s,l,f),n.nodeChanged())}function m(){return cp.setEditorTimeout(n,d,0)}FO(n),n.on("show",d),n.on("hide",l.hide),f||(n.on("focus",m),n.on("blur",l.hide)),n.on("init",function(){(n.hasFocus()||f)&&m()}),dv(n,e);var g={show:function(){l.show()},hide:function(){l.hide()},enable:function(){fv(e,!1)},disable:function(){fv(e,!0)},isDisabled:function(){return dd.isDisabled(a)}};return{editorContainer:a.element.dom,api:g}}}),R_="contexttoolbar-hide",V_=function(t,n){var e,o,r,i,u=t.label.fold(function(){return{}},function(t){return{"aria-label":t}}),a=Pm(Oy.sketch({inputClasses:["tox-toolbar-textfield","tox-toolbar-nav-js"],data:t.initValue(),inputAttributes:u,selectOnFocus:!0,inputBehaviours:tc([Mg.config({mode:"special",onEnter:function(t){return c.findPrimary(t).map(function(t){return br(t),!0})},onLeft:function(t,n){return n.cut(),vt.none()},onRight:function(t,n){return n.cut(),vt.none()}})])})),c=(e=a,o=t.commands,r=n,i=M(o,function(t){return Pm(("contextformtogglebutton"===t.type?function(t,n,e){var o=n.original;o.primary;var r=s(o,["primary"]),i=ao(kp(lt(lt({},r),{type:"togglebutton",onAction:st})));return __(i,e.backstage.shared.providers,[n_(t,n)])}:function(t,n,e){var o=n.original;o.primary;var r=s(o,["primary"]),i=ao(Cp(lt(lt({},r),{type:"button",onAction:st})));return O_(i,e.backstage.shared.providers,[n_(t,n)])})(e,t,{backstage:{shared:{providers:r}}}))}),{asSpecs:function(){return M(i,function(t){return t.asSpec()})},findPrimary:function(e){return K(o,function(t,n){return t.primary?vt.from(i[n]).bind(function(t){return t.getOpt(e)}).filter(C(dd.isDisabled)):vt.none()})}});return[{title:vt.none(),items:[a.asSpec()]},{title:vt.none(),items:c.asSpecs()}]},P_={valignCentre:[],alignCentre:[],alignLeft:["tox-pop--align-left"],alignRight:["tox-pop--align-right"],right:["tox-pop--right"],left:["tox-pop--left"],bottom:["tox-pop--bottom"],top:["tox-pop--top"],inset:["tox-pop--inset"]},H_={maxHeightFunction:Ic(),maxWidthFunction:dO()},z_=Fr("forward-slide"),N_=Fr("backward-slide"),L_=Fr("change-slide-event"),W_="tox-pop--resizing",U_="tox-pop--transition",j_={unsupportedLength:["em","ex","cap","ch","ic","rem","lh","rlh","vw","vh","vi","vb","vmin","vmax","cm","mm","Q","in","pc","pt","px"],fixed:["px","pt"],relative:["%"],empty:[""]},G_=(m_=["Infinity",(f_="[0-9]+")+"\\."+X_(f_)+X_(d_="[eE][+-]?[0-9]+"),"\\."+f_+X_(d_),f_+X_(d_)].join("|"),new RegExp("^([+-]?(?:"+m_+"))(.*)$"));function X_(t){return"(?:"+t+")?"}function Y_(u,a){function n(){var t=a.getOptions(u),r=a.getCurrent(u).map(a.hash),i=dc();return M(t,function(o){return{type:"togglemenuitem",text:a.display(o),onSetup:function(n){function t(t){t&&(i.on(function(t){return t.setActive(!1)}),i.set(n)),n.setActive(t)}t(mt(r,a.hash(o)));var e=a.watcher(u,o,t);return function(){i.clear(),e()}},onAction:function(){return a.setCurrent(u,o)}}})}u.ui.registry.addMenuButton(a.name,{tooltip:a.text,icon:a.icon,fetch:function(t){return t(n())},onSetup:a.onToolbarSetup}),u.ui.registry.addNestedMenuItem(a.name,{type:"nestedmenuitem",text:a.text,getSubmenuItems:n,onSetup:a.onMenuSetup})}function q_(t,n){return function(){t.execCommand("mceToggleFormat",!1,n)}}function K_(t){var n,e;!function(e){aS.each([{name:"bold",text:"Bold",icon:"bold"},{name:"italic",text:"Italic",icon:"italic"},{name:"underline",text:"Underline",icon:"underline"},{name:"strikethrough",text:"Strikethrough",icon:"strike-through"},{name:"subscript",text:"Subscript",icon:"subscript"},{name:"superscript",text:"Superscript",icon:"superscript"}],function(t,n){e.ui.registry.addToggleButton(t.name,{tooltip:t.text,icon:t.icon,onSetup:Lk(e,t.name),onAction:q_(e,t.name)})});for(var t=1;t<=6;t++){var n="h"+t;e.ui.registry.addToggleButton(n,{text:n.toUpperCase(),tooltip:"Heading "+t,onSetup:Lk(e,n),onAction:q_(e,n)})}}(t),n=t,aS.each([{name:"cut",text:"Cut",action:"Cut",icon:"cut"},{name:"copy",text:"Copy",action:"Copy",icon:"copy"},{name:"paste",text:"Paste",action:"Paste",icon:"paste"},{name:"help",text:"Help",action:"mceHelp",icon:"help"},{name:"selectall",text:"Select all",action:"SelectAll",icon:"select-all"},{name:"newdocument",text:"New document",action:"mceNewDocument",icon:"new-document"},{name:"removeformat",text:"Clear formatting",action:"RemoveFormat",icon:"remove-formatting"},{name:"remove",text:"Remove",action:"Delete",icon:"remove"}],function(t){n.ui.registry.addButton(t.name,{tooltip:t.text,icon:t.icon,onAction:jk(n,t.action)})}),e=t,aS.each([{name:"blockquote",text:"Blockquote",action:"mceBlockQuote",icon:"quote"}],function(t){e.ui.registry.addToggleButton(t.name,{tooltip:t.text,icon:t.icon,onAction:jk(e,t.action),onSetup:Lk(e,t.name)})})}function J_(n,e){return Wk(n,"Undo Redo AddUndo TypingUndo ClearUndos SwitchMode",function(t){t.setDisabled(n.mode.isReadOnly()||!n.undoManager[e]())})}function $_(t){var n;t.ui.registry.addButton("visualaid",{tooltip:"Visual aids",text:"Visual aids",onAction:jk(t,"mceToggleVisualAid")}),t.ui.registry.addToggleMenuItem("visualaid",{text:"Visual aids",onSetup:Wk(n=t,"VisualAid",function(t){t.setActive(n.hasVisual)}),onAction:jk(t,"mceToggleVisualAid")})}function Q_(t,n){var e,o,r,i,u,a,c,s,l,f,d,m,g,p,h,v,b,y,x,w,S,C,k,O,_,T=t;St([{name:"alignleft",text:"Align left",cmd:"JustifyLeft",icon:"align-left"},{name:"aligncenter",text:"Align center",cmd:"JustifyCenter",icon:"align-center"},{name:"alignright",text:"Align right",cmd:"JustifyRight",icon:"align-right"},{name:"alignjustify",text:"Justify",cmd:"JustifyFull",icon:"align-justify"}],function(t){T.ui.registry.addToggleButton(t.name,{tooltip:t.text,icon:t.icon,onAction:jk(T,t.cmd),onSetup:Lk(T,t.name)})}),T.ui.registry.addButton("alignnone",{tooltip:"No alignment",icon:"align-none",onAction:jk(T,"JustifyNone")}),K_(O=t),_=O,aS.each([{name:"bold",text:"Bold",action:"Bold",icon:"bold",shortcut:"Meta+B"},{name:"italic",text:"Italic",action:"Italic",icon:"italic",shortcut:"Meta+I"},{name:"underline",text:"Underline",action:"Underline",icon:"underline",shortcut:"Meta+U"},{name:"strikethrough",text:"Strikethrough",action:"Strikethrough",icon:"strike-through",shortcut:""},{name:"subscript",text:"Subscript",action:"Subscript",icon:"subscript",shortcut:""},{name:"superscript",text:"Superscript",action:"Superscript",icon:"superscript",shortcut:""},{name:"removeformat",text:"Clear formatting",action:"RemoveFormat",icon:"remove-formatting",shortcut:""},{name:"newdocument",text:"New document",action:"mceNewDocument",icon:"new-document",shortcut:""},{name:"cut",text:"Cut",action:"Cut",icon:"cut",shortcut:"Meta+X"},{name:"copy",text:"Copy",action:"Copy",icon:"copy",shortcut:"Meta+C"},{name:"paste",text:"Paste",action:"Paste",icon:"paste",shortcut:"Meta+V"},{name:"selectall",text:"Select all",action:"SelectAll",icon:"select-all",shortcut:"Meta+A"}],function(t){_.ui.registry.addMenuItem(t.name,{text:t.text,icon:t.icon,shortcut:t.shortcut,onAction:jk(_,t.action)})}),_.ui.registry.addMenuItem("codeformat",{text:"Code",icon:"sourcecode",onAction:q_(_,"code")}),k=Gk(0,d=l=n,RO(f=s=t)),f.ui.registry.addNestedMenuItem("align",{text:d.shared.providers.translate("Align"),getSubmenuItems:function(){return k.items.validateItems(k.getStyleItems())}}),p=Gk(0,g=l,PO(m=s)),m.ui.registry.addNestedMenuItem("fontformats",{text:g.shared.providers.translate("Fonts"),getSubmenuItems:function(){return p.items.validateItems(p.getStyleItems())}}),h=s,b=lt({type:"advanced"},(v=l).styleselect),y=Gk(0,v,LO(h,b)),h.ui.registry.addNestedMenuItem("formats",{text:"Formats",getSubmenuItems:function(){return y.items.validateItems(y.getStyleItems())}}),w=Gk(0,l,NO(x=s)),x.ui.registry.addNestedMenuItem("blockformats",{text:"Blocks",getSubmenuItems:function(){return w.items.validateItems(w.getStyleItems())}}),C=Gk(0,l,HO(S=s)),S.ui.registry.addNestedMenuItem("fontsizes",{text:"Font sizes",getSubmenuItems:function(){return C.items.validateItems(C.getStyleItems())}}),(a=u=t).ui.registry.addMenuItem("undo",{text:"Undo",icon:"undo",shortcut:"Meta+Z",onSetup:J_(a,"hasUndo"),onAction:jk(a,"undo")}),a.ui.registry.addMenuItem("redo",{text:"Redo",icon:"redo",shortcut:"Meta+Y",onSetup:J_(a,"hasRedo"),onAction:jk(a,"redo")}),(c=u).ui.registry.addButton("undo",{tooltip:"Undo",icon:"undo",disabled:!0,onSetup:J_(c,"hasUndo"),onAction:jk(c,"undo")}),c.ui.registry.addButton("redo",{tooltip:"Redo",icon:"redo",disabled:!0,onSetup:J_(c,"hasRedo"),onAction:jk(c,"redo")}),function(t){var i;(i=t).addCommand("mceApplyTextcolor",function(t,n){var e,o=t,r=n;(e=i).undoManager.transact(function(){e.focus(),e.formatter.apply(o,{value:r}),e.nodeChanged()})}),i.addCommand("mceRemoveTextcolor",function(t){var n,e=t;(n=i).undoManager.transact(function(){n.focus(),n.formatter.remove(e,{value:null},null,!0),n.nodeChanged()})});var n=Vo(null),e=Vo(null);wb(t,"forecolor","forecolor","Text color",n),wb(t,"backcolor","hilitecolor","Background color",e),Sb(t,"forecolor","forecolor","Text color"),Sb(t,"backcolor","hilitecolor","Background color")}(t),$_(t),(r=t).ui.registry.addButton("outdent",{tooltip:"Decrease indent",icon:"outdent",onSetup:Wk(i=r,"NodeChange",function(t){t.setDisabled(!i.queryCommandState("outdent"))}),onAction:jk(r,"outdent")}),r.ui.registry.addButton("indent",{tooltip:"Increase indent",icon:"indent",onAction:jk(r,"indent")}),Y_(e=t,PT),o=e,vt.from(o.getParam("content_langs",void 0,"array")).map(function(t){return{name:"language",text:"Language",icon:"language",getOptions:rt(t),hash:function(t){return E(t.customCode)?t.code:t.code+"/"+t.customCode},display:function(t){return t.title},watcher:function(t,n,e){return t.formatter.formatChanged("lang",e,!1,{value:n.code,customValue:n.customCode}).unbind},getCurrent:function(t){return dr(At.fromDom(t.selection.getNode()),function(t){return vt.some(t).filter(Gn).bind(function(n){return un(n,"lang").map(function(t){return{code:t,customCode:un(n,"data-mce-lang").getOrUndefined(),title:""}})})})},setCurrent:function(t,n){return t.execCommand("Lang",!1,n)},onToolbarSetup:function(t){var n=fc();return t.setActive(o.formatter.match("lang",{},void 0,!0)),n.set(o.formatter.formatChanged("lang",t.setActive,!0)),n.clear}}}).each(function(t){return Y_(e,t)})}function Z_(t,n){return{type:"makeshift",x:t,y:n}}function tT(t){return"longpress"===t.type||0===t.type.indexOf("touch")}function nT(t,n){return"contextmenu"===n.type||"longpress"===n.type?t.inline?function(t){if(tT(t)){var n=t.touches[0];return Z_(n.pageX,n.pageY)}return Z_(t.pageX,t.pageY)}(n):(e=t.getContentAreaContainer(),o=function(t){if(tT(t)){var n=t.touches[0];return Z_(n.clientX,n.clientY)}return Z_(t.clientX,t.clientY)}(n),r=tv.DOM.getPos(e),i=r.x,u=r.y,Z_(o.x+i,o.y+u)):HT(t);var e,o,r,i,u}function eT(t,n,e){switch(e){case"node":return{type:"node",node:vt.some(At.fromDom((o=t).selection.getNode())),root:At.fromDom(o.getBody())};case"point":return nT(t,n);case"selection":return HT(t)}var o}function oT(f,d,m,g,p,h){function t(){var n,e,t,o,r,i,u,a,c,s,l=m();t=l,o=g,r=p,u=!(y||v||b&&x),c=eT(n=f,e=d,a=i=h),s=lt({bubble:xc(0,"point"===a?12:0,NT),layouts:zT,overrides:{maxWidthFunction:dO(),maxHeightFunction:Ic()}},c),z0(t,xh.CLOSE_ON_EXECUTE,o,!0).map(function(t){e.preventDefault(),rp.showMenuWithinBounds(r,{anchor:s},{menu:{markers:Jp("normal"),highlightImmediately:u},data:t,type:"horizontal"},function(){return vt.some(r_(n,o.shared,"node"===i?"node":"selection"))}),n.fire(R_)})}var n,e=se(),v=e.os.isiOS(),b=e.os.isOSX(),y=e.os.isAndroid(),x=e.deviceType.isTouch();(b||v)&&"node"!==h?(n=function(){(function(t){function n(){cp.setEditorTimeout(t,function(){t.selection.setRng(e)},10),i()}var e=t.selection.getRng();function o(t){t.preventDefault(),t.stopImmediatePropagation()}function r(){return i()}t.once("touchend",n),t.on("mousedown",o,!0),t.once("longpresscancel",r);var i=function(){t.off("touchend",n),t.off("longpresscancel",r),t.off("mousedown",o)}})(f),t()},function(t,n){var e=t.selection;if(!(e.isCollapsed()||n.touches.length<1)){var o=n.touches[0],r=e.getRng();return bs(t.getWin(),fs.domRange(r)).exists(function(t){return t.left<=o.clientX&&t.right>=o.clientX&&t.top<=o.clientY&&t.bottom>=o.clientY})}}(f,d)?n():(f.once("selectionchange",n),f.once("touchend",function(){return f.off("selectionchange",n)}))):t()}function rT(t){return"string"==typeof t?t.split(/[ ,]/):t}function iT(t){return t.getParam("contextmenu_never_use_native",!1,"boolean")}function uT(t){return y(t)?"|"===t:"separator"===t.type}function aT(t,n){if(0===n.length)return t;var e=q(t).filter(function(t){return!uT(t)}).fold(function(){return[]},function(t){return[LT]});return t.concat(e).concat(n).concat([LT])}function cT(t,n){return"longpress"!==n.type&&(2!==n.button||n.target===t.getBody()&&""===n.pointerType)}function sT(t,n){return cT(t,n)?t.selection.getStart(!0):n.target}function lT(s,t,n){function e(t){return rp.hide(i)}function o(c){var t;iT(s)&&c.preventDefault(),c.ctrlKey&&!iT(s)||!1===s.getParam("contextmenu")||(t=function(t,n){var e=t.getParam("contextmenu_avoid_overlap","","string"),o=cT(t,n)?"selection":"point";if(at(e)){var r=sT(t,n);return Ub(At.fromDom(r),e)?"node":o}return o}(s,c),(r()?oT:function(t,n,e,o,r,i){var u=e(),a=eT(t,n,i);z0(u,xh.CLOSE_ON_EXECUTE,o,!1).map(function(t){n.preventDefault(),rp.showMenuAt(r,{anchor:a},{menu:{markers:Jp("normal")},data:t})})})(s,c,function(){var t,n,e,o=sT(s,c),r=s.ui.registry.getAll(),i=(e=(n=s).ui.registry.getAll().contextMenus,vt.from(n.getParam("contextmenu")).map(rT).getOrThunk(function(){return F(rT("link linkchecker image imagetools table spellchecker configurepermanentpen"),function(t){return Tt(e,t)})})),u=r.contextMenus,a=o;return 0<(t=R(i,function(o,t){return tt(u,t.toLowerCase()).map(function(t){var n=t.update(a);if(y(n))return aT(o,n.split(" "));if(0<n.length){var e=M(n,WT);return aT(o,e)}return o}).getOrThunk(function(){return o.concat([t])})},[])).length&&uT(t[t.length-1])&&t.pop(),t},n,i,t))}var r=se().deviceType.isTouch,i=_u(rp.sketch({dom:{tag:"div"},lazySink:t,onEscape:function(){return s.focus()},onShow:function(){return n.setContextMenuState(!0)},onHide:function(){return n.setContextMenuState(!1)},fireDismissalEventInstead:{},inlineBehaviours:tc([fm("dismissContextMenu",[Cr(Xi(),function(t,n){hf.close(t),s.focus()})])])}));s.on("init",function(){var t="ResizeEditor ScrollContent ScrollWindow longpresscancel"+(r()?"":" ResizeWindow");s.on(t,e),s.on("longpress contextmenu",o)})}function fT(n){return function(t){return t.translate(-n.left,-n.top)}}function dT(n){return function(t){return t.translate(n.left,n.top)}}function mT(e){return function(t,n){return R(e,function(t,n){return n(t)},Se(t,n))}}function gT(t,n,e){return t.fold(mT([dT(e),fT(n)]),mT([fT(n)]),mT([]))}function pT(t,n,e){return t.fold(mT([dT(e)]),mT([]),mT([dT(n)]))}function hT(t,n,e){return t.fold(mT([]),mT([fT(e)]),mT([dT(n),fT(e)]))}function vT(t,n,e){var o=t.fold(function(t,n){return{position:vt.some("absolute"),left:vt.some(t+"px"),top:vt.some(n+"px")}},function(t,n){return{position:vt.some("absolute"),left:vt.some(t-e.left+"px"),top:vt.some(n-e.top+"px")}},function(t,n){return{position:vt.some("fixed"),left:vt.some(t+"px"),top:vt.some(n+"px")}});return lt({right:vt.none(),bottom:vt.none()},o)}function bT(t,i,u,a){function n(o,r){return function(t,n){var e=o(i,u,a);return r(t.getOr(e.left),n.getOr(e.top))}}return t.fold(n(hT,jT),n(pT,GT),n(gT,XT))}function yT(t,n){var e=rn(t,n);return E(e)?NaN:parseInt(e,10)}function xT(t,n,e,o,r,i){var u,a,c,s,l,f,d=(u=e,a=o,l=yT(s=t.element,(c=n).leftAttr),f=yT(s,c.topAttr),(isNaN(l)||isNaN(f)?vt.none():vt.some(Se(l,f))).fold(function(){return u},function(t){return XT(t.left+a.left,t.top+a.top)})),m=(n.mustSnap?YT:qT)(t,n,d,r,i),g=gT(d,r,i),p=n,h=g,v=t.element;return on(v,p.leftAttr,h.left+"px"),on(v,p.topAttr,h.top+"px"),m.fold(function(){return{coord:XT(g.left,g.top),extra:vt.none()}},function(t){return{coord:t.output,extra:t.extra}})}function wT(t,c,s,l){return K(t,function(t){var n,e,o=t.sensor,r=t.range.left,i=t.range.top,u=pT(c,n=s,e=l),a=pT(o,n,e);return Math.abs(u.left-a.left)<=r&&Math.abs(u.top-a.top)<=i?vt.some({output:bT(t.output,c,s,l),extra:t.extra}):vt.none()})}function ST(t,n){var e;t.getSystem().addToGui(n),Yt((e=n).element).filter(Gn).each(function(n){pn(n,"z-index").each(function(t){on(n,JT,t)}),fn(n,"z-index",gn(e.element,"z-index"))})}function CT(t){Yt(t.element).filter(Gn).each(function(n){un(n,JT).fold(function(){return vn(n,"z-index")},function(t){return fn(n,"z-index",t)}),cn(n,JT)}),t.getSystem().removeFromGui(t)}function kT(t,n,e){return t.getSystem().build(uy.sketch({dom:{styles:{left:"0px",top:"0px",width:"100%",height:"100%",position:"fixed","z-index":"1000000000000000"},classes:[n]},events:e}))}function OT(t,n){return{bounds:t.getBounds(),height:wn(n.element),width:On(n.element)}}function _T(B,M,t,n,e){var o=t.update(n,e),A=t.getStartData().getOrThunk(function(){return OT(M,B)});o.each(function(t){var n,e,o,r,i,u,a,c,s,l,f,d,m,g,p,h,v,b,y,x,w,S,C,k,O,_=B,T=A,E=t,D=(n=M).getTarget(_.element);n.repositionTarget&&(e=In(Ut(_.element)),o=zC(D),S=pn(w=D,"left"),C=pn(w,"top"),k=pn(w,"position"),O=function(t,n,e){return("fixed"===e?XT:jT)(parseInt(t,10),parseInt(n,10))},r=(S.isSome()&&C.isSome()&&k.isSome()?vt.some(O(S.getOrDie(),C.getOrDie(),k.getOrDie())):vt.none()).getOrThunk(function(){var t=Cn(w);return GT(t.left,t.top)}),i=_,u=n.snaps,a=r,c=e,s=o,l=E,f=T,m=u.fold(function(){var e,o,t=gT((e=l.left,o=l.top,a.fold(function(t,n){return jT(t+e,n+o)},function(t,n){return GT(t+e,n+o)},function(t,n){return XT(t+e,n+o)})),c,s);return XT(t.left,t.top)},function(n){var t=xT(i,n,a,l,c,s);return t.extra.each(function(t){n.onSensor(i,t)}),t.coord}),g=c,p=s,h=(d=f).bounds,v=pT(m,g,p),b=Ua(v.left,h.x,h.x+h.width-d.width),y=Ua(v.top,h.y,h.y+h.height-d.height),x=GT(b,y),mn(D,vT(m.fold(function(){var t=hT(x,g,p);return jT(t.left,t.top)},rt(x),function(){var t=gT(x,g,p);return XT(t.left,t.top)}),0,o))),n.onDrag(_,D,E)})}function TT(o,t,n,e){t.each(CT),n.snaps.each(function(t){var n,e;n=t,cn(e=o.element,n.leftAttr),cn(e,n.topAttr)});var r=n.getTarget(o.element);e.reset(),n.onDrop(o,r)}function ET(t){return function(n,e){function o(t){e.setStartData(OT(n,t))}return nu(H([Cr(Wi(),function(t){e.getStartData().each(function(){return o(t)})})],t(n,e,o),!0))}}function DT(a,c,s){return[Cr(di(),function(n,t){var e,o,r,i,u;0===t.event.raw.button&&(t.stop(),r={drop:e=function(){return TT(n,vt.some(i),a,c)},delayDrop:(o=jb(e,200)).schedule,forceDrop:e,move:function(t){o.cancel(),_T(n,a,c,ZT,t)}},i=kT(n,a.blockerClass,(u=r,nu([Cr(di(),u.forceDrop),Cr(pi(),u.drop),Cr(mi(),function(t,n){u.move(n.event)}),Cr(gi(),u.delayDrop)]))),s(n),ST(n,i))})]}function BT(a,c,s){function l(t){TT(t,f.get(),a,c),f.clear()}var f=dc();return[Cr(ci(),function(n,t){function e(){return l(n)}t.stop();var o,r,i,u=kT(n,a.blockerClass,(r=o=e,i=function(t){_T(n,a,c,nE,t)},nu([Cr(ci(),r),Cr(li(),o),Cr(fi(),o),Cr(si(),function(t,n){i(n.event)})])));f.set(u),s(n),ST(n,u)}),Cr(si(),function(t,n){n.stop(),_T(t,a,c,nE,n.event)}),Cr(li(),function(t,n){n.stop(),l(t)}),Cr(fi(),l)]}function MT(t,r,i,u,n,e){return t.fold(function(){return rE.snap({sensor:GT(i-20,u-20),range:Se(n,e),output:GT(vt.some(i),vt.some(u)),extra:{td:r}})},function(t){var n=i-20,e=u-20,o=t.element.dom.getBoundingClientRect();return rE.snap({sensor:GT(n,e),range:Se(40,40),output:GT(vt.some(i-o.width/2),vt.some(u-o.height/2)),extra:{td:r}})})}function AT(t,i,u){return{getSnapPoints:t,leftAttr:"data-drag-left",topAttr:"data-drag-top",onSensor:function(t,n){var e=n.td,o=i.get(),r=e;o.exists(function(t){return Lt(t,r)})||(i.set(e),u(e))},mustSnap:!0}}function FT(t){return Pm(sp.sketch({dom:{tag:"div",classes:["tox-selector"]},buttonBehaviours:tc([rE.config({mode:"mouseOrTouch",blockerClass:"blocker",snaps:t}),mw.config({})]),eventOrder:{mousedown:["dragging","alloy.base.behaviour"],touchstart:["dragging","alloy.base.behaviour"]}}))}function IT(a,e){function n(t){var n=zn(t);return MT(g.getOpt(e),t,n.x,n.y,n.width,n.height)}function o(t){var n=zn(t);return MT(p.getOpt(e),t,n.right,n.bottom,n.width,n.height)}function r(t,i,n,u){var e=n(i);rE.snapTo(t,e),function(t){var n=i.dom.getBoundingClientRect();vn(t.element,"display");var e=Xt(At.fromDom(a.getBody())).dom.innerHeight,o=n[u]<0,r=n[u]>e;(o||r)&&fn(t.element,"display","none")}(t)}function i(t){return r(h,t,n,"top")}function u(t){return r(v,t,o,"bottom")}var c=Vo([]),s=Vo([]),t=Vo(!1),l=dc(),f=dc(),d=AT(function(){return M(c.get(),n)},l,function(n){f.get().each(function(t){a.fire("TableSelectorChange",{start:n,finish:t})})}),m=AT(function(){return M(s.get(),o)},f,function(n){l.get().each(function(t){a.fire("TableSelectorChange",{start:t,finish:n})})}),g=FT(d),p=FT(m),h=_u(g.asSpec()),v=_u(p.asSpec());se().deviceType.isTouch()&&(a.on("TableSelectionChange",function(n){t.get()||(Is(e,h),Is(e,v),t.set(!0)),l.set(n.start),f.set(n.finish),n.otherCells.each(function(t){c.set(t.upOrLeftCells),s.set(t.downOrRightCells),i(n.start),u(n.finish)})}),a.on("ResizeEditor ResizeWindow ScrollContent",function(){l.get().each(i),f.get().each(u)}),a.on("TableSelectionClear",function(){t.get()&&(Vs(h),Vs(v),t.set(!1)),l.clear(),f.clear()}))}var RT,VT,PT={name:"lineheight",text:"Line height",icon:"line-height",getOptions:function(t){return t.getParam("lineheight_formats","1 1.1 1.2 1.3 1.4 1.5 2","string").split(" ")},hash:function(t){return r=["fixed","relative","empty"],vt.from(G_.exec(t)).bind(function(t){var n=Number(t[1]),e=t[2],o=e;return T(r,function(t){return T(j_[t],function(t){return o===t})})?vt.some({value:n,unit:e}):vt.none()}).map(function(t){return t.value+t.unit}).getOr(t);var r},display:h,watcher:function(t,n,e){return t.formatter.formatChanged("lineheight",e,!1,{value:n}).unbind},getCurrent:function(t){return vt.from(t.queryCommandValue("LineHeight"))},setCurrent:function(t,n){return t.execCommand("LineHeight",!1,n)}},HT=function(t){return{type:"selection",root:At.fromDom(t.selection.getNode())}},zT={onLtr:function(){return[Ja,Ga,Xa,Ya,qa,Ka,up,ap,Bm,Em,Dm,Tm]},onRtl:function(){return[Ja,Xa,Ga,qa,Ya,Ka,up,ap,Dm,Tm,Bm,Em]}},NT={valignCentre:[],alignCentre:[],alignLeft:["tox-pop--align-left"],alignRight:["tox-pop--align-right"],right:["tox-pop--right"],left:["tox-pop--left"],bottom:["tox-pop--bottom"],top:["tox-pop--top"]},LT={type:"separator"},WT=function(n){function t(t){return{text:t.text,icon:t.icon,disabled:t.disabled,shortcut:t.shortcut}}var e;if(y(n))return n;switch(n.type){case"separator":return LT;case"submenu":return lt(lt({type:"nestedmenuitem"},t(n)),{getSubmenuItems:function(){var t=n.getSubmenuItems();return y(t)?t:M(t,WT)}});default:return lt(lt({type:"menuitem"},t(n)),{onAction:(e=n.onAction,function(){return e()})})}},UT=Po([{offset:["x","y"]},{absolute:["x","y"]},{fixed:["x","y"]}]),jT=UT.offset,GT=UT.absolute,XT=UT.fixed,YT=function(t,n,l,f,d){var e=n.getSnapPoints(t);return wT(e,l,f,d).orThunk(function(){return R(e,function(n,e){var t,o,r,i,u,a,c,s=(t=e.sensor,e.range.left,e.range.top,i=pT(l,o=f,r=d),u=pT(t,o,r),a=Math.abs(i.left-u.left),c=Math.abs(i.top-u.top),Se(a,c));return n.deltas.fold(function(){return{deltas:vt.some(s),snap:vt.some(e)}},function(t){return(s.left+s.top)/2<=(t.left+t.top)/2?{deltas:vt.some(s),snap:vt.some(e)}:n})},{deltas:vt.none(),snap:vt.none()}).snap.map(function(t){return{output:bT(t.output,l,f,d),extra:t.extra}})})},qT=function(t,n,e,o,r){return wT(n.getSnapPoints(t),e,o,r)},KT=Object.freeze({__proto__:null,snapTo:function(t,n,e,o){var r,i,u,a=n.getTarget(t.element);n.repositionTarget&&(r=In(Ut(t.element)),i=zC(a),mn(a,vT({coord:bT((u=o).output,u.output,r,i),extra:u.extra}.coord,0,i)))}}),JT="data-initial-z-index",$T=_o("snaps",[fo("getSnapPoints"),Ku("onSensor"),fo("leftAttr"),fo("topAttr"),To("lazyViewport",Ae),To("mustSnap",!1)]),QT=[To("useFixed",O),fo("blockerClass"),To("getTarget",h),To("onDrag",st),To("repositionTarget",!0),To("onDrop",st),Fo("getBounds",Ae),$T],ZT=Object.freeze({__proto__:null,getData:function(t){return vt.from(Se(t.x,t.y))},getDelta:function(t,n){return Se(n.left-t.left,n.top-t.top)}}),tE=H(H([],QT,!0),[Zu("dragger",{handlers:ET(DT)})],!1),nE=Object.freeze({__proto__:null,getData:function(t){var n,e=t.raw.touches;return 1===e.length?(n=e[0],vt.some(Se(n.clientX,n.clientY))):vt.none()},getDelta:function(t,n){return Se(n.left-t.left,n.top-t.top)}}),eE=H(H([],QT,!0),[Zu("dragger",{handlers:ET(BT)})],!1),oE=H(H([],QT,!0),[Zu("dragger",{handlers:ET(function(t,n,e){return H(H([],DT(t,n,e),!0),BT(t,n,e),!0)})})],!1),rE=xa({branchKey:"mode",branches:Object.freeze({__proto__:null,mouse:tE,touch:eE,mouseOrTouch:oE}),name:"dragging",active:{events:function(t,n){return t.dragger.handlers(t,n)}},extra:{snap:function(t){return{sensor:t.sensor,range:t.range,output:t.output,extra:vt.from(t.extra)}}},state:Object.freeze({__proto__:null,init:function(){var i=vt.none(),n=vt.none(),t=rt({});return xu({readState:t,reset:function(){i=vt.none(),n=vt.none()},update:function(r,t){return r.getData(t).bind(function(t){return n=r,e=t,o=i.map(function(t){return n.getDelta(t,e)}),i=vt.some(e),o;var n,e,o})},getStartData:function(){return n},setStartData:function(t){n=vt.some(t)}})}}),apis:KT});function iE(t,n,e){var o,r,i,u,a,c,s=At.fromDom(t.getContainer());J((o=t,r=n,i=e,u=xn(s),a=kn(s),(c={}).height=$O(u+r.top,lh(o),dh(o)),i===RT.Both&&(c.width=$O(a+r.left,sh(o),fh(o))),c),function(t,n){return fn(s,n,JO(t)),0}),t.fire("ResizeEditor")}function uE(t,n,e,o){return iE(t,Se(20*e,20*o),n),vt.some(!0)}function aE(t,n){var e,o,r,i,u,a,c,s,l,f,d,m,g,p,h,v;return{dom:{tag:"div",classes:["tox-statusbar"]},components:(v=[],t.getParam("elementpath",!0,"boolean")&&v.push((g=t,h=n,(p={}).delimiter||(p.delimiter="\xbb"),{dom:{tag:"div",classes:["tox-statusbar__path"],attributes:{role:"navigation"}},behaviours:tc([Mg.config({mode:"flow",selector:"div[role=button]"}),dd.config({disabled:h.isDisabled}),mv(),fy.config({}),Fg.config({}),fm("elementPathEvents",[eu(function(r,t){g.shortcuts.add("alt+F11","focus statusbar elementpath",function(){return Mg.focusIn(r)}),g.on("NodeChange",function(t){var n,o,e=function(t){for(var n=[],e=t.length;0<e--;){var o=t[e];if(1===o.nodeType&&!function(t){if(1===t.nodeType){if("BR"===t.nodeName||t.getAttribute("data-mce-bogus"))return 1;if("bookmark"===t.getAttribute("data-mce-type"))return 1}}(o)){var r=g.fire("ResolveName",{name:o.nodeName.toLowerCase(),target:o});if(r.isDefaultPrevented()||n.push({name:r.name,element:o}),r.isPropagationStopped())break}}return n}(t.parents);0<e.length?Fg.set(r,(n=M(e||[],function(n,t){return sp.sketch({dom:{tag:"div",classes:["tox-statusbar__path-item"],attributes:{role:"button","data-index":t,"tab-index":-1,"aria-level":t+1},innerHtml:n.name},action:function(t){g.focus(),g.selection.select(n.element),g.nodeChanged()},buttonBehaviours:tc([Kv(h.isDisabled),mv()])})}),o={dom:{tag:"div",classes:["tox-statusbar__path-divider"],attributes:{"aria-hidden":!0},innerHtml:" "+p.delimiter+" "}},R(n.slice(1),function(t,n){var e=t;return e.push(o),e.push(n),e},[n[0]]))):Fg.set(r,[])})})])]),components:[]})),t.hasPlugin("wordcount")&&v.push((f=t,d=n,sp.sketch({dom:{tag:"button",classes:["tox-statusbar__wordcount"]},components:[],buttonBehaviours:tc([Kv(d.isDisabled),mv(),fy.config({}),Fg.config({}),Tf.config({store:{mode:"memory",initialValue:{mode:"words",count:{words:0,characters:0}}}}),fm("wordcount-events",[iu(function(t){var n=Tf.getValue(t),e="words"===n.mode?"characters":"words";Tf.setValue(t,{mode:e,count:n.count}),b(t,n.count,e)}),eu(function(e){f.on("wordCountUpdate",function(t){var n=Tf.getValue(e).mode;Tf.setValue(e,{mode:n,count:t.wordCount}),b(e,t.wordCount,n)})})])]),eventOrder:((m={})[Fi()]=["disabling","alloy.base.behaviour","wordcount-events"],m)}))),t.getParam("branding",!0,"boolean")&&v.push({dom:{tag:"span",classes:["tox-statusbar__branding"],innerHtml:'<a href="https://www.tiny.cloud/?utm_campaign=editor_referral&amp;utm_medium=poweredby&amp;utm_source=tinymce&amp;utm_content=v5" rel="noopener" target="_blank" tabindex="-1" aria-label="'+(l=lp.translate(["Powered by {0}","Tiny"]))+'">'+l+"</a>"}}),e=0<v.length?[{dom:{tag:"div",classes:["tox-statusbar__text-container"]},components:v}]:[],i=n,a=!(u=r=t).hasPlugin("autoresize"),o=(s=!1===(c=u.getParam("resize",a))?RT.None:"both"===c?RT.Both:RT.Vertical)===RT.None?vt.none():vt.some(jm("resize-handle",{tag:"div",classes:["tox-statusbar__resize-handle"],attributes:{title:i.translate("Resize")},behaviours:[rE.config({mode:"mouse",repositionTarget:!1,onDrag:function(t,n,e){return iE(r,e,s)},blockerClass:"tox-blocker"}),Mg.config({mode:"special",onLeft:function(){return uE(r,s,-1,0)},onRight:function(){return uE(r,s,1,0)},onUp:function(){return uE(r,s,0,-1)},onDown:function(){return uE(r,s,0,1)}}),fy.config({}),Vg.config({})]},i.icons)),e.concat(o.toArray()))};function b(t,n,e){return Fg.set(t,[oi(d.translate(["{0} "+e,n[e]]))])}}function cE(d){function m(){return i.bind(BO.getHeader)}function g(){return Re.value(y)}function p(){return i.bind(function(t){return BO.getThrobber(t)}).getOrDie("Could not find throbber element")}var t,n,e,o,r=d.inline,h=r?I_:F_,v=lv(d)?G1:R1,i=vt.none(),u=se(),a=u.browser.isIE()?["tox-platform-ie"]:[],c=u.deviceType.isTouch()?["tox-platform-touch"]:[],s=iv(d),l=cv(d),f=lp.isRtl()?{attributes:{dir:"rtl"}}:{},b={attributes:((t={})[ts]=s?Cc.BottomToTop:Cc.TopToBottom,t)},y=_u((n=Lt(ve(),l)&&"grid"===gn(l,"display"),e={dom:lt({tag:"div",classes:["tox","tox-silver-sink","tox-tinymce-aux"].concat(a).concat(c)},f),behaviours:tc([sf.config({useFixed:function(){return v.isDocked(m)}})])},o={dom:{styles:{width:document.body.clientWidth+"px"}},events:nu([Cr(Ui(),function(){fn(J.element,"width",document.body.clientWidth+"px")})])},Xo(e,n?o:{}))),x=Pm({dom:{tag:"div",classes:["tox-anchorbar"]}}),w=PC(y,d,function(){return i.bind(function(t){return x.getOpt(t)}).getOrDie("Could not find a anchor bar element")}),S=BO.parts.menubar({dom:{tag:"div",classes:["tox-menubar"]},backstage:w,onEscape:function(){d.focus()}}),C=ov(d),k=BO.parts.toolbar(lt({dom:{tag:"div",classes:["tox-toolbar"]},getSink:g,providers:w.shared.providers,onEscape:function(){d.focus()},type:C,lazyToolbar:function(){return i.bind(function(t){return BO.getToolbar(t)}).getOrDie("Could not find more toolbar element")},lazyHeader:function(){return m().getOrDie("Could not find header element")}},b)),O=BO.parts["multiple-toolbar"]({dom:{tag:"div",classes:["tox-toolbar-overlord"]},providers:w.shared.providers,onEscape:function(){d.focus()},type:C}),_=BO.parts.socket({dom:{tag:"div",classes:["tox-edit-area"]}}),T=BO.parts.sidebar({dom:{tag:"div",classes:["tox-sidebar"]}}),E=BO.parts.throbber({dom:{tag:"div",classes:["tox-throbber"]},backstage:w}),D=d.getParam("statusbar",!0,"boolean")&&!r?vt.some(aE(d,w.shared.providers)):vt.none(),B={dom:{tag:"div",classes:["tox-sidebar-wrap"]},components:[_,T]},M=ev(d),A=gh(d),F=mh(d),I=BO.parts.header({dom:lt({tag:"div",classes:["tox-editor-header"]},b),components:ft([F?[S]:[],M?[O]:A?[k]:[],av(d)?[]:[x.asSpec()]]),sticky:lv(d),editor:d,sharedBackstage:w.shared}),R=ft([s?[]:[I],r?[]:[B],s?[I]:[]]),V=ft([[{dom:{tag:"div",classes:["tox-editor-container"]},components:R}],r?[]:D.toArray(),[E]]),P=sv(d),H=lt(lt({role:"application"},lp.isRtl()?{dir:"rtl"}:{}),P?{"aria-hidden":"true"}:{}),z=_u(BO.sketch({dom:{tag:"div",classes:["tox","tox-tinymce"].concat(r?["tox-tinymce-inline"]:[]).concat(s?["tox-tinymce--toolbar-bottom"]:[]).concat(c).concat(a),styles:lt({visibility:"hidden"},P?{opacity:"0",border:"0"}:{}),attributes:H},components:V,behaviours:tc([mv(),dd.config({disableClass:"tox-tinymce--disabled"}),Mg.config({mode:"cyclic",selector:".tox-menubar, .tox-toolbar, .tox-toolbar__primary, .tox-toolbar__overflow--open, .tox-sidebar__overflow--open, .tox-statusbar__path, .tox-statusbar__wordcount, .tox-statusbar__branding a, .tox-statusbar__resize-handle"})])})),i=vt.some(z);d.shortcuts.add("alt+F9","focus menubar",function(){BO.focusMenubar(z)}),d.shortcuts.add("alt+F10","focus toolbar",function(){BO.focusToolbar(z)}),d.addCommand("ToggleToolbarDrawer",function(){BO.toggleToolbarDrawer(z)}),d.addQueryStateHandler("ToggleToolbarDrawer",function(){return BO.isToolbarDrawerToggled(z)});var N,L,W,U,j,G,X,Y,q,K=$b(z),J=$b(y);function $(){var t,n,e,o,r,i,u=JO((o=ah(e=n=d),r=lh(e),i=dh(e),KO(o).map(function(t){return $O(t,r,i)}).getOr(ah(n)))),a=JO(QO(t=d).getOr(ch(t)));return d.inline||(hn("div","width",a)&&fn(z.element,"width",a),hn("div","height",u)?fn(z.element,"height",u):fn(z.element,"height","200px")),u}return N=d,L=K,W=J,U=wa(),j=mc(U,"touchstart",tt),G=mc(U,"touchmove",function(t){return Q(Ni(),t)}),X=mc(U,"touchend",function(t){return Q(Li(),t)}),Y=mc(U,"mousedown",tt),q=mc(U,"mouseup",function(t){0===t.raw.button&&Z(yf(),{target:t.target})}),N.on("PostRender",function(){N.on("click",nt),N.on("tap",nt),N.on("mouseup",et),N.on("mousedown",ot),N.on("ScrollWindow",rt),N.on("ResizeWindow",it),N.on("ResizeEditor",ut),N.on("AfterProgressState",at),N.on("DismissPopups",ct)}),N.on("remove",function(){N.off("click",nt),N.off("tap",nt),N.off("mouseup",et),N.off("mousedown",ot),N.off("ScrollWindow",rt),N.off("ResizeWindow",it),N.off("ResizeEditor",ut),N.off("AfterProgressState",at),N.off("DismissPopups",ct),Y.unbind(),j.unbind(),G.unbind(),X.unbind(),q.unbind()}),N.on("detach",function(){zs(L),zs(W),L.destroy(),W.destroy()}),{mothership:K,uiMothership:J,backstage:w,renderUI:function(){var o,r;v.setup(d,w.shared,m),Q_(d,w),lT(d,g,w),r=(o=d).ui.registry.getAll().sidebars,St(kt(r),function(n){function e(){return mt(vt.from(o.queryCommandValue("ToggleSidebar")),n)}var t=r[n];o.ui.registry.addToggleButton(n,{icon:t.icon,tooltip:t.tooltip,onAction:function(t){o.execCommand("ToggleSidebar",!1,n),t.setActive(e())},onSetup:function(t){function n(){return t.setActive(e())}return o.on("ToggleSidebar",n),function(){o.off("ToggleSidebar",n)}}})}),yk(d,p,w.shared),dt(d.getParam("toolbar_groups",{},"object"),function(t,n){d.ui.registry.addGroupToolbarButton(n,t)});var t,n=d.ui.registry.getAll(),e=n.buttons,i=n.menuItems,u=n.contextToolbars,a=n.sidebars,c=ph(d),s={menuItems:i,menus:(t=d.getParam("menu"))?dt(t,function(t){return lt(lt({},t),{items:t.items})}):{},menubar:d.getParam("menubar"),toolbar:c.getOrThunk(function(){return d.getParam("toolbar",!0)}),allowToolbarGroups:C===hh.floating,buttons:e,sidebar:a};l_(d,u,y,{backstage:w}),IT(d,y);var l=d.getElement(),f=$();return h.render(d,{mothership:K,uiMothership:J,outerContainer:z},s,w,{targetNode:l,height:f})},getUi:function(){return{channels:{broadcastAll:J.broadcast,broadcastOn:J.broadcastOn,register:st}}}};function Q(n,e){St([L,W],function(t){t.broadcastEvent(n,e)})}function Z(n,e){St([L,W],function(t){t.broadcastOn([n],e)})}function tt(t){return Z(vf(),{target:t.target})}function nt(t){return Z(vf(),{target:At.fromDom(t.target)})}function et(t){0===t.button&&Z(yf(),{target:At.fromDom(t.target)})}function ot(){St(N.editorManager.get(),function(t){N!==t&&t.fire("DismissPopups",{relatedTarget:N})})}function rt(t){return Q(Wi(),Bc(t))}function it(t){Z(bf(),{}),Q(Ui(),Bc(t))}function ut(){return Z(bf(),{})}function at(t){t.state&&Z(vf(),{target:At.fromDom(N.getContainer())})}function ct(t){Z(vf(),{target:At.fromDom(t.relatedTarget.getContainer())})}}function sE(n){return ur("items","items",We(),to(ro(function(t){return uo("Checking item of "+n,QD,t).fold(function(t){return Re.error(ir(t))},function(t){return Re.value(t)})})))}function lE(t){return y(t.type)&&y(t.name)}function fE(t){return{internalDialog:ao(uo("dialog",uB,t)),dataValidator:(n=z(F(sB(t),lE),function(n){return vt.from(lB[n.type]).fold(function(){return[]},function(t){return[mo(n.name,t)]})}),Jo(n)),initialData:t.initialData};var n}function dE(t){var e=[],o={};return J(t,function(t,n){t.fold(function(){e.push(n)},function(t){o[n]=t})}),0<e.length?Re.error(e):Re.value(o)}function mE(t,n){fn(t,"height",n+"px"),se().browser.isIE()?vn(t,"flex-basis"):fn(t,"flex-basis",n+"px")}function gE(t,d,n){Au(t,'[role="dialog"]').each(function(f){Fu(f,'[role="tablist"]').each(function(l){n.get().map(function(t){return fn(d,"height","0"),fn(d,"flex-basis","0"),Math.min(t,(e=d,o=l,r=Gt(n=f).dom,i="fixed"===gn(Au(n,".tox-dialog-wrap").getOr(n),"position")?Math.max(r.clientHeight,window.innerHeight):Math.max(r.offsetHeight,r.scrollHeight),u=xn(e),a=e.dom.offsetLeft>=o.dom.offsetLeft+kn(o)?Math.max(xn(o),u):u,c=parseInt(gn(n,"margin-top"),10)||0,s=parseInt(gn(n,"margin-bottom"),10)||0,i-(xn(n)+c+s-a)));var n,e,o,r,i,u,a,c,s}).each(function(t){mE(d,t)})})})}function pE(t){return Fu(t,'[role="tabpanel"]')}function hE(t,e){function o(t){var n=dE(Tf.getValue(t)).getOr({}),e=i.get(),o=Xo(e,n);i.set(o)}function r(t){var n=i.get();Tf.setValue(t,n)}var u,a,i=Vo({}),c=Vo(null),n=M(t.tabs,function(t){return{value:t.name,dom:{tag:"div",classes:["tox-dialog__body-nav-item"],innerHtml:e.shared.providers.translate(t.title)},view:function(){return[Qw.sketch(function(n){return{dom:{tag:"div",classes:["tox-form"]},components:M(t.items,function(t){return mC(n,t,e)}),formBehaviours:tc([Mg.config({mode:"acyclic",useTabstopAt:C(f0)}),fm("TabView.form.events",[eu(r),ou(o)]),rc.config({channels:sr([{key:xB,value:{onReceive:o}},{key:wB,value:{onReceive:r}}])})])}})]}}}),s=(u=n,a=dc(),{extraEvents:[eu(function(t){var o=t.element;pE(o).each(function(n){var e;fn(n,"visibility","hidden"),t.getSystem().getByDom(n).toOptional().each(function(t){var o,r,i;Y(G((r=n,i=t,M(o=u,function(t,n){Fg.set(i,o[n].view());var e=r.dom.getBoundingClientRect();return Fg.set(i,[]),e.height})),function(t,n){return n<t?-1:t<n?1:0})).fold(a.clear,a.set)}),gE(o,n,a),vn(n,"visibility"),e=t,Y(u).each(function(t){return yB.showTab(e,t.value)}),cp.requestAnimationFrame(function(){gE(o,n,a)})})}),Cr(Ui(),function(t){var n=t.element;pE(n).each(function(t){gE(n,t,a)})}),Cr(Cy,function(t,n){var r=t.element;pE(r).each(function(n){var t=ka(me(n));fn(n,"visibility","hidden");var e=pn(n,"height").map(function(t){return parseInt(t,10)});vn(n,"height"),vn(n,"flex-basis");var o=n.dom.getBoundingClientRect().height;e.forall(function(t){return t<o})?(a.set(o),gE(r,n,a)):e.each(function(t){mE(n,t)}),vn(n,"visibility"),t.each(Sa)})})],selectFirst:!1});return yB.sketch({dom:{tag:"div",classes:["tox-dialog__body"]},onChangeTab:function(t,n,e){var o=Tf.getValue(n);vr(t,Sy,{name:o,oldName:c.get()}),c.set(o)},tabs:n,components:[yB.parts.tabbar({dom:{tag:"div",classes:["tox-dialog__body-nav"]},components:[pB.parts.tabs({})],markers:{tabClass:"tox-tab",selectedClass:"tox-dialog__body-nav-item--active"},tabbarBehaviours:tc([fy.config({})])}),yB.parts.tabview({dom:{tag:"div",classes:["tox-dialog__body-content"]}})],selectFirst:s.selectFirst,tabSectionBehaviours:tc([fm("tabpanel",s.extraEvents),Mg.config({mode:"acyclic"}),ud.config({find:function(t){return Y(yB.getViewItems(t))}}),Tf.config({store:{mode:"manual",getValue:function(t){return t.getSystem().broadcastOn([xB],{}),i.get()},setValue:function(t,n){i.set(n),t.getSystem().broadcastOn([wB],{})}}})])})}function vE(t,n,r,e){return{dom:{tag:"div",classes:["tox-dialog__content-js"],attributes:lt(lt({},n.map(function(t){return{id:t}}).getOr({})),e?{"aria-live":"polite"}:{})},components:[],behaviours:tc([rS(0),x_.config({channel:kB,updateState:function(t,n){return vt.some({isTabPanel:function(){return"tabpanel"===n.body.type}})},renderComponents:function(t){return"tabpanel"!==t.body.type?[(e=t.body,o=r,{dom:{tag:"div",classes:["tox-dialog__body"]},components:[{dom:{tag:"div",classes:["tox-dialog__body-content"]},components:[(n=Pm(Qw.sketch(function(n){return{dom:{tag:"div",classes:["tox-form"].concat(e.classes)},components:M(e.items,function(t){return mC(n,t,o)})}}))).asSpec()]}],behaviours:tc([Mg.config({mode:"acyclic",useTabstopAt:C(f0)}),oS(n),sS(n,{postprocess:function(t){return dE(t).fold(function(t){return console.error(t),{}},h)}})])})]:[hE(t.body,r)];var e,o,n},initialData:t})])}}function bE(t,n){return{dom:{tag:"div",styles:{display:"none"},classes:["tox-dialog__header"]},components:[t,n]}}function yE(t,n){return YE.parts.close(sp.sketch({dom:{tag:"button",classes:["tox-button","tox-button--icon","tox-button--naked"],attributes:{type:"button","aria-label":n.translate("Close")}},action:t,buttonBehaviours:tc([fy.config({})])}))}function xE(){return YE.parts.title({dom:{tag:"div",classes:["tox-dialog__title"],innerHtml:"",styles:{display:"none"}}})}function wE(t,n){return YE.parts.body({dom:{tag:"div",classes:["tox-dialog__body"]},components:[{dom:{tag:"div",classes:["tox-dialog__body-content"]},components:[{dom:vk("<p>"+n.translate(t)+"</p>")}]}]})}function SE(t){return YE.parts.footer({dom:{tag:"div",classes:["tox-dialog__footer"]},components:t})}function CE(t,n){return[uy.sketch({dom:{tag:"div",classes:["tox-dialog__footer-start"]},components:t}),uy.sketch({dom:{tag:"div",classes:["tox-dialog__footer-end"]},components:n})]}function kE(n){var t,e="tox-dialog",o=e+"-wrap",r=o+"__backdrop",i=e+"__disable-scroll";return YE.sketch({lazySink:n.lazySink,onEscape:function(t){return n.onEscape(t),vt.some(!0)},useTabstopAt:function(t){return!f0(t)},dom:{tag:"div",classes:[e].concat(n.extraClasses),styles:lt({position:"relative"},n.extraStyles)},components:H([n.header,n.body],n.footer.toArray(),!0),parts:{blocker:{dom:vk('<div class="'+o+'"></div>'),components:[{dom:{tag:"div",classes:TB?[r,r+"--opaque"]:[r]}}]}},dragBlockClass:o,modalBehaviours:tc(H([Vg.config({}),fm("dialog-events",n.dialogEvents.concat([Dr(vi(),function(t,n){Mg.focusIn(t)})])),fm("scroll-lock",[eu(function(){Xr(ve(),i)}),ou(function(){Yr(ve(),i)})])],n.extraBehaviours,!0)),eventOrder:lt(((t={})[Fi()]=["dialog-events"],t[ji()]=["scroll-lock","dialog-events","alloy.base.behaviour"],t[Gi()]=["alloy.base.behaviour","dialog-events","scroll-lock"],t),n.eventOrder)})}function OE(t){return sp.sketch({dom:{tag:"button",classes:["tox-button","tox-button--icon","tox-button--naked"],attributes:{type:"button","aria-label":t.translate("Close"),title:t.translate("Close")}},components:[jm("close",{tag:"div",classes:["tox-icon"]},t.icons)],action:function(t){hr(t,vy)}})}function _E(t,n,e){function o(t){return[oi(e.translate(t.title))]}return{dom:{tag:"div",classes:["tox-dialog__title"],attributes:lt({},n.map(function(t){return{id:t}}).getOr({}))},components:o(t),behaviours:tc([x_.config({channel:CB,renderComponents:o})])}}function TE(){return{dom:vk('<div class="tox-dialog__draghandle"></div>')}}function EE(t,n){return e={title:n.shared.providers.translate(t),draggable:n.dialog.isDraggableModal()},o=n.shared.providers,r=YE.parts.title(_E(e,vt.none(),o)),i=YE.parts.draghandle(TE()),u=YE.parts.close(OE(o)),a=[r].concat(e.draggable?[i]:[]).concat([u]),uy.sketch({dom:vk('<div class="tox-dialog__header"></div>'),components:a});var e,o,r,i,u,a}function DE(t,n,e){return{dom:{tag:"div",classes:["tox-dialog__busy-spinner"],attributes:{"aria-label":e.translate(t)},styles:{left:"0px",right:"0px",bottom:"0px",top:"0px",position:"absolute"}},behaviours:n,components:[{dom:vk('<div class="tox-spinner"><div></div><div></div><div></div></div>')}]}}function BE(t,o,n){return{onClose:function(){return n.closeWindow()},onBlock:function(e){YE.setBusy(t(),function(t,n){return DE(e.message,n,o)})},onUnblock:function(){YE.setIdle(t())}}}function ME(t,n,e,o){var r;return _u(kE(lt(lt({},t),{lazySink:o.shared.getSink,extraBehaviours:H([x_.config({channel:SB,updateState:function(t,n){return vt.some(n)},initialData:n}),fS({})],t.extraBehaviours,!0),onEscape:function(t){hr(t,vy)},dialogEvents:e,eventOrder:((r={})[Ai()]=[x_.name(),rc.name()],r[ji()]=["scroll-lock",x_.name(),"messages","dialog-events","alloy.base.behaviour"],r[Gi()]=["alloy.base.behaviour","dialog-events","messages",x_.name(),"scroll-lock"],r)})))}function AE(t){return M(t,function(t){return"menu"===t.type?(e=M((n=t).items,function(t){var n=Vo(!1);return lt(lt({},t),{storage:n})}),lt(lt({},n),{items:e})):t;var n,e})}function FE(t){return R(t,function(t,n){return"menu"!==n.type?t:R(n.items,function(t,n){return t[n.name]=n.storage,t},t)},{})}function IE(t,e){return[Tr(vi(),l0),t(hy,function(t,n){e.onClose(),n.onClose()}),t(vy,function(t,n,e,o){n.onCancel(t),hr(o,hy)}),Cr(wy,function(t,n){return e.onUnblock()}),Cr(xy,function(t,n){return e.onBlock(n.event)})]}function RE(t,n){function e(t,n){return uy.sketch({dom:{tag:"div",classes:["tox-dialog__footer-"+t]},components:M(n,function(t){return t.memento.asSpec()})})}var o=A(n.map(function(t){return t.footerButtons}).getOr([]),function(t){return"start"===t.align});return[e("start",o.pass),e("end",o.fail)]}function VE(t,e){return{dom:vk('<div class="tox-dialog__footer"></div>'),components:[],behaviours:tc([x_.config({channel:OB,initialData:t,updateState:function(t,n){var r=M(n.buttons,function(t){var n=Pm(q0(t,t.type,e));return{name:t.name,align:t.align,memento:n}});return vt.some({lookupByName:function(t,n){return e=t,o=n,V(r,function(t){return t.name===o}).bind(function(t){return t.memento.getOpt(e)});var e,o},footerButtons:r})},renderComponents:RE})])}}function PE(t,n){return YE.parts.footer(VE(t,n))}function HE(n,e){if(n.getRoot().getSystem().isConnected()){var o=ud.getCurrent(n.getFormWrapper()).getOr(n.getFormWrapper());return Qw.getField(o,e).fold(function(){var t=n.getFooter();return x_.getState(t).get().bind(function(t){return t.lookupByName(o,e)})},function(t){return vt.some(t)})}return vt.none()}function zE(c,o,s){function t(t){var n=c.getRoot();n.getSystem().isConnected()&&t(n)}var l={getData:function(){var t=c.getRoot(),n=t.getSystem().isConnected()?c.getFormWrapper():t,e=Tf.getValue(n),o=dt(s,function(t){return t.get()});return lt(lt({},e),o)},setData:function(a){t(function(t){var n,e,o=l.getData(),r=lt(lt({},o),a),i=(n=r,e=c.getRoot(),x_.getState(e).get().map(function(t){return ao(uo("data",t.dataValidator,n))}).getOr(n)),u=c.getFormWrapper();Tf.setValue(u,i),J(s,function(t,n){Tt(r,n)&&t.set(r[n])})})},disable:function(t){HE(c,t).each(dd.disable)},enable:function(t){HE(c,t).each(dd.enable)},focus:function(t){HE(c,t).each(Vg.focus)},block:function(n){if(!y(n))throw new Error("The dialogInstanceAPI.block function should be passed a blocking message of type string as an argument");t(function(t){vr(t,xy,{message:n})})},unblock:function(){t(function(t){hr(t,wy)})},showTab:function(e){t(function(t){var n=c.getBody();x_.getState(n).get().exists(function(t){return t.isTabPanel()})&&ud.getCurrent(n).each(function(t){yB.showTab(t,e)})})},redial:function(e){t(function(t){var n=o(e);t.getSystem().broadcastOn([SB],n),t.getSystem().broadcastOn([CB],n.internalDialog),t.getSystem().broadcastOn([kB],n.internalDialog),t.getSystem().broadcastOn([OB],n.internalDialog),l.setData(n.initialData)})},close:function(){t(function(t){hr(t,hy)})}};return l}function NE(t){return x(t)&&-1!==AB.indexOf(t.mceAction)}function LE(o,t,r,n){var e,i,u,a=EE(o.title,n),c=(i={dom:{tag:"div",classes:["tox-dialog__content-js"]},components:[{dom:{tag:"div",classes:["tox-dialog__body-iframe"]},components:[c0({dom:{tag:"iframe",attributes:{src:o.url}},behaviours:tc([fy.config({}),Vg.config({})])})]}],behaviours:tc([Mg.config({mode:"acyclic",useTabstopAt:C(f0)})])},YE.parts.body(i)),s=o.buttons.bind(function(t){return 0===t.length?vt.none():vt.some(PE({buttons:t},n))}),l=EB(function(){return v},BE(function(){return h},n.shared.providers,t)),f=lt(lt({},o.height.fold(function(){return{}},function(t){return{height:t+"px","max-height":t+"px"}})),o.width.fold(function(){return{}},function(t){return{width:t+"px","max-width":t+"px"}})),d=o.width.isNone()&&o.height.isNone()?["tox-dialog--width-lg"]:[],m=new MB(o.url,{base_uri:new MB(window.location.href)}),g=m.protocol+"://"+m.host+(m.port?":"+m.port:""),p=fc(),h=ME({header:a,body:c,footer:s,extraClasses:d,extraBehaviours:[fm("messages",[eu(function(){var t=mc(At.fromDom(window),"message",function(t){var n,e;m.isSameOrigin(new MB(t.raw.origin))&&(NE(n=t.raw.data)?function(t,n,e){switch(e.mceAction){case"insertContent":t.insertContent(e.content);break;case"setContent":t.setContent(e.content);break;case"execCommand":var o=!!w(e.ui)&&e.ui;t.execCommand(e.cmd,o,e.value);break;case"close":n.close();break;case"block":n.block(e.message);break;case"unblock":n.unblock()}}(r,v,n):!NE(e=n)&&x(e)&&Tt(e,"mceAction")&&o.onMessage(v,n))});p.set(t)}),ou(p.clear)]),rc.config({channels:((e={})[_B]={onReceive:function(t,n){Fu(t.element,"iframe").each(function(t){t.dom.contentWindow.postMessage(n,g)})}},e)})],extraStyles:f},o,l,n),v={block:function(n){if(!y(n))throw new Error("The urlDialogInstanceAPI.block function should be passed a blocking message of type string as an argument");b(function(t){vr(t,xy,{message:n})})},unblock:function(){b(function(t){hr(t,wy)})},close:function(){b(function(t){hr(t,hy)})},sendMessage:function(n){b(function(t){t.getSystem().broadcastOn([_B],n)})}};function b(t){u.getSystem().isConnected()&&t(u)}return{dialog:u=h,instanceApi:v}}function WE(t){function o(t,y){return fB.open(function(t,n,e){var o,r,i,u,a,c,s,l,f,d,m,g,p,h,v=n,b=(r={redial:fB.redial,closeWindow:function(){YE.hide(b.dialog),y(b.instanceApi)}},i=R,c=EE((o={dataValidator:e,initialData:v,internalDialog:t}).internalDialog.title,i),u=i,a=vE({body:o.internalDialog.body},vt.none(),u,!1),s=YE.parts.body(a),l=AE(o.internalDialog.buttons),f=FE(l),d=PE({buttons:l},i),m=DB(function(){return h},BE(function(){return p},i.shared.providers,r),i.shared.getSink),g=function(){switch(o.internalDialog.size){case"large":return["tox-dialog--width-lg"];case"medium":return["tox-dialog--width-md"];default:return[]}}(),p=ME({header:c,body:s,footer:vt.some(d),extraClasses:g,extraBehaviours:[],extraStyles:{}},o,m,i),h=zE({getRoot:rt(p),getBody:function(){return YE.getBody(p)},getFooter:function(){return YE.getFooter(p)},getFormWrapper:function(){var t=YE.getBody(p);return ud.getCurrent(t).getOr(t)}},r.redial,f),{dialog:p,instanceApi:h});return YE.show(b.dialog),b.instanceApi.setData(v),b.instanceApi},t)}function r(t,A,F,I){return fB.open(function(t,n,e){function o(){return E.on(function(t){rp.reposition(t),N1.refresh(t)})}var r,i,u,a,c,s,l,f,d,m,g,p,h,v,b,y,x,w,S,C,k,O,_,T=ao(uo("data",e,n)),E=dc(),D=R.shared.header.isPositionedAtTop(),B=(i={dataValidator:e,initialData:T,internalDialog:t},u={redial:fB.redial,closeWindow:function(){E.on(rp.hide),V.off("ResizeEditor",o),E.clear(),F(B.instanceApi)}},a=R,c=I,v=Fr("dialog-label"),b=Fr("dialog-content"),y=Pm((f={title:i.internalDialog.title,draggable:!0},d=v,m=a.shared.providers,uy.sketch({dom:vk('<div class="tox-dialog__header"></div>'),components:[_E(f,vt.some(d),m),TE(),OE(m)],containerBehaviours:tc([rE.config({mode:"mouse",blockerClass:"blocker",getTarget:function(t){return Iu(t,'[role="dialog"]').getOrDie()},snaps:{getSnapPoints:function(){return[]},leftAttr:"data-drag-left",topAttr:"data-drag-top"}})])}))),x=Pm((g={body:i.internalDialog.body},p=a,h=c,vE(g,vt.some(b),p,h))),w=AE(i.internalDialog.buttons),S=FE(w),C=Pm(BB({buttons:w},a)),k=DB(function(){return _},{onBlock:function(e){cO.block(O,function(t,n){return DE(e.message,n,a.shared.providers)})},onUnblock:function(){cO.unblock(O)},onClose:function(){return u.closeWindow()}},a.shared.getSink),O=_u({dom:{tag:"div",classes:["tox-dialog","tox-dialog-inline"],attributes:((s={role:"dialog"})["aria-labelledby"]=v,s["aria-describedby"]=b,s)},eventOrder:((l={})[Ai()]=[x_.name(),rc.name()],l[Fi()]=["execute-on-form"],l[ji()]=["reflecting","execute-on-form"],l),behaviours:tc([Mg.config({mode:"cyclic",onEscape:function(t){return hr(t,hy),vt.some(!0)},useTabstopAt:function(t){return!f0(t)&&("button"!==Ft(t)||"disabled"!==rn(t,"disabled"))}}),x_.config({channel:SB,updateState:function(t,n){return vt.some(n)},initialData:i}),Vg.config({}),fm("execute-on-form",k.concat([Dr(vi(),function(t,n){Mg.focusIn(t)})])),cO.config({getRoot:function(){return vt.some(O)}}),Fg.config({}),fS({})]),components:[y.asSpec(),x.asSpec(),C.asSpec()]}),_=zE({getRoot:rt(O),getFooter:function(){return C.get(O)},getBody:function(){return x.get(O)},getFormWrapper:function(){var t=x.get(O);return ud.getCurrent(t).getOr(t)}},u.redial,S),{dialog:O,instanceApi:_}),M=_u(rp.sketch(lt(lt({lazySink:R.shared.getSink,dom:{tag:"div",classes:[]},fireDismissalEventInstead:{}},D?{}:{fireRepositionEventInstead:{}}),{inlineBehaviours:tc(H([fm("window-manager-inline-events",[Cr(Xi(),function(t,n){hr(B.dialog,vy)})])],(r=V,P&&D?[]:[N1.config({contextual:{lazyContext:function(){return vt.some(Me(At.fromDom(r.getContentAreaContainer())))},fadeInClass:"tox-dialog-dock-fadein",fadeOutClass:"tox-dialog-dock-fadeout",transitionClass:"tox-dialog-dock-transition"},modes:["top"]})]),!0)),isExtraPart:function(t,n){return Ub(e=n,".tox-alert-dialog")||Ub(e,".tox-confirm-dialog");var e}})));return E.set(M),rp.showWithin(M,Tu(B.dialog),{anchor:A},vt.some(ve())),P&&D||(N1.refresh(M),V.on("ResizeEditor",o)),B.instanceApi.setData(T),Mg.focusIn(B.dialog),B.instanceApi},t)}var c,s,l,f,R=t.backstage,V=t.editor,P=lv(V),e=(s=(c=t).backstage.shared,{open:function(t,n){function e(){YE.hide(u),n()}var o=Pm(q0({name:"close-alert",text:"OK",primary:!0,align:"end",disabled:!1,icon:vt.none()},"cancel",c.backstage)),r=xE(),i=yE(e,s.providers),u=_u(kE({lazySink:function(){return s.getSink()},header:bE(r,i),body:wE(t,s.providers),footer:vt.some(SE(CE([],[o.asSpec()]))),onEscape:e,extraClasses:["tox-alert-dialog"],extraBehaviours:[],extraStyles:{},dialogEvents:[Cr(vy,e)],eventOrder:{}}));YE.show(u);var a=o.get(u);Vg.focus(a)}}),i=(f=(l=t).backstage.shared,{open:function(t,n){function e(t){YE.hide(a),n(t)}var o=Pm(q0({name:"yes",text:"Yes",primary:!0,align:"end",disabled:!1,icon:vt.none()},"submit",l.backstage)),r=q0({name:"no",text:"No",primary:!1,align:"end",disabled:!1,icon:vt.none()},"cancel",l.backstage),i=xE(),u=yE(function(){return e(!1)},f.providers),a=_u(kE({lazySink:function(){return f.getSink()},header:bE(i,u),body:wE(t,f.providers),footer:vt.some(SE(CE([],[r,o.asSpec()]))),onEscape:function(){return e(!1)},extraClasses:["tox-confirm-dialog"],extraBehaviours:[],extraStyles:{},dialogEvents:[Cr(vy,function(){return e(!1)}),Cr(yy,function(){return e(!0)})],eventOrder:{}}));YE.show(a);var c=o.get(a);Vg.focus(c)}});return{open:function(t,n,e){return void 0!==n&&"toolbar"===n.inline?r(t,R.shared.anchors.inlineDialog(),e,n.ariaAttrs):void 0!==n&&"cursor"===n.inline?r(t,R.shared.anchors.cursor(),e,n.ariaAttrs):o(t,e)},openUrl:function(t,n){return e=n,fB.openUrl(function(t){var n=LE(t,{closeWindow:function(){YE.hide(n.dialog),e(n.instanceApi)}},V,R);return YE.show(n.dialog),n.instanceApi},t);var e},alert:function(t,n){e.open(t,function(){n()})},close:function(t){t.close()},confirm:function(t,n){i.open(t,function(t){n(t)})}}}(VT=RT=RT||{})[VT.None=0]="None",VT[VT.Both=1]="Both",VT[VT.Vertical=2]="Vertical";var UE,jE=rt([fo("lazySink"),xo("dragBlockClass"),Fo("getBounds",Ae),To("useTabstopAt",_),To("eventOrder",{}),$s("modalBehaviours",[Mg]),Ju("onExecute"),Qu("onEscape")]),GE={sketch:h},XE=rt([Jf({name:"draghandle",overrides:function(t,n){return{behaviours:tc([rE.config({mode:"mouse",getTarget:function(t){return Au(t,'[role="dialog"]').getOr(t)},blockerClass:t.dragBlockClass.getOrDie(new Error("The drag blocker class was not specified for a dialog with a drag handle: \n"+JSON.stringify(n,null,2)).message),getBounds:t.getDragBounds})])}}}),qf({schema:[fo("dom")],name:"title"}),qf({factory:GE,schema:[fo("dom")],name:"close"}),qf({factory:GE,schema:[fo("dom")],name:"body"}),Jf({factory:GE,schema:[fo("dom")],name:"footer"}),Kf({factory:{sketch:function(t,n){return lt(lt({},t),{dom:n.dom,components:n.components})}},schema:[To("dom",{tag:"div",styles:{position:"fixed",left:"0px",top:"0px",right:"0px",bottom:"0px"}}),To("components",[])],name:"blocker"})]),YE=Sl({name:"ModalDialog",configFields:jE(),partFields:XE(),factory:function(a,t,n,r){var e,i=dc(),o=Fr("modal-events"),u=lt(lt({},a.eventOrder),((e={})[ji()]=[o].concat(a.eventOrder["alloy.system.attached"]||[]),e));return{uid:a.uid,dom:a.dom,components:t,apis:{show:function(t){i.set(t);var n=a.lazySink(t).getOrDie(),e=r.blocker(),o=n.getSystem().build(lt(lt({},e),{components:e.components.concat([Tu(t)]),behaviours:tc([Vg.config({}),fm("dialog-blocker-events",[Dr(vi(),function(){Mg.focusIn(t)})])])}));Is(n,o),Mg.focusIn(t)},hide:function(n){i.clear(),Yt(n.element).each(function(t){n.getSystem().getByDom(t).each(function(t){Vs(t)})})},getBody:function(t){return dl(t,a,"body")},getFooter:function(t){return dl(t,a,"footer")},setIdle:function(t){cO.unblock(t)},setBusy:function(t,n){cO.block(t,n)}},eventOrder:u,domModification:{attributes:{role:"dialog","aria-modal":"true"}},behaviours:Zs(a.modalBehaviours,[Fg.config({}),Mg.config({mode:"cyclic",onEnter:a.onExecute,onEscape:a.onEscape,useTabstopAt:a.useTabstopAt}),cO.config({getRoot:i.get}),fm(o,[eu(function(t){var n,e,o,r=t.element,i=dl(t,a,"title").element,u=un(r,"id").fold(function(){var t=Fr("dialog-label");return on(i,"id",t),t},h);on(r,"aria-labelledby",u),n=t.element,e=dl(t,a,"body").element,o=vt.from(rn(n,"id")).fold(function(){var t=Fr("dialog-describe");return on(e,"id",t),t},h),on(n,"aria-describedby",o)})])])}},apis:{show:function(t,n){t.show(n)},hide:function(t,n){t.hide(n)},getBody:function(t,n){return t.getBody(n)},getFooter:function(t,n){return t.getFooter(n)},setBusy:function(t,n,e){t.setBusy(n,e)},setIdle:function(t,n){t.setIdle(n)}}}),qE=Jo([go("type"),go("name")].concat(zh)),KE=nr,JE=[ur("name","name",Ue(function(){return Fr("button-name")}),tr),Co("icon"),Mo("align","end",["start","end"]),Ao("primary",!1),Ao("disabled",!1)],$E=H(H([],JE,!0),[go("text")],!1),QE=H([po("type",["submit","cancel","custom"])],$E,!0),ZE=so("type",{submit:QE,cancel:QE,custom:QE,menu:H([po("type",["menu"]),Co("text"),Co("tooltip"),Co("icon"),yo("items",qE)],JE,!0)}),tD=[go("type"),go("text"),po("level",["info","warn","error","success"]),go("icon"),To("url","")],nD=Jo(tD),eD=[go("type"),go("text"),Ao("disabled",!1),Ao("primary",!1),ur("name","name",Ue(function(){return Fr("button-name")}),tr),Co("icon"),Ao("borderless",!1)],oD=Jo(eD),rD=[go("type"),go("name"),go("label"),Ao("disabled",!1)],iD=Jo(rD),uD=nr,aD=[go("type"),go("name")],cD=aD.concat([Co("label")]),sD=cD.concat([To("columns","auto")]),lD=Jo(sD),fD=$o([go("value"),go("text"),go("icon")]),dD=Jo(cD),mD=tr,gD=Jo(cD),pD=tr,hD=aD.concat([Bo("tag","textarea"),go("scriptId"),go("scriptUrl"),Eo("settings",void 0,rr)]),vD=aD.concat([Bo("tag","textarea"),ho("init")]),bD=ro(function(t){return uo("customeditor.old",Ze(vD),t).orThunk(function(){return uo("customeditor.new",Ze(hD),t)})}),yD=tr,xD=Jo(cD),wD=to(Ko),SD=[go("type"),go("html"),Mo("presets","presentation",["presentation","document"])],CD=Jo(SD),kD=cD.concat([Ao("sandboxed",!0)]),OD=Jo(kD),_D=tr,TD=cD.concat([mo("currentState",Jo([fo("blob"),go("url")]))]),ED=Jo(TD),DD=cD.concat([Co("inputMode"),Co("placeholder"),Ao("maximized",!1),Ao("disabled",!1)]),BD=Jo(DD),MD=tr,AD=[go("text"),go("value")],FD=[go("text"),yo("items",(UE=Rt(function(){return ID}),{extract:function(t,n){return UE().extract(t,n)},toString:function(){return UE().toString()}}))],ID=no([Jo(AD),Jo(FD)]),RD=cD.concat([yo("items",ID),Ao("disabled",!1)]),VD=Jo(RD),PD=tr,HD=cD.concat([bo("items",[go("text"),go("value")]),Do("size",1),Ao("disabled",!1)]),zD=Jo(HD),ND=tr,LD=cD.concat([Ao("constrain",!0),Ao("disabled",!1)]),WD=Jo(LD),UD=Jo([go("width"),go("height")]),jD=[go("type"),yo("header",tr),yo("cells",to(tr))],GD=Jo(jD),XD=cD.concat([Co("placeholder"),Ao("maximized",!1),Ao("disabled",!1)]),YD=Jo(XD),qD=tr,KD=cD.concat([Mo("filetype","file",["image","media","file"]),To("disabled",!1)]),JD=Jo(KD),$D=Jo([go("value"),To("meta",{})]),QD=Qe(function(){return oo("type",{alertbanner:nD,bar:Jo((e=sE("bar"),[go("type"),e])),button:oD,checkbox:iD,colorinput:dD,colorpicker:gD,dropzone:xD,grid:Jo((t=sE("grid"),[go("type"),mo("columns",Zo),t])),iframe:OD,input:BD,listbox:VD,selectbox:zD,sizeinput:WD,textarea:YD,urlinput:JD,customeditor:bD,htmlpanel:CD,imagetools:ED,collection:lD,label:Jo((n=sE("label"),[go("type"),go("label"),n])),table:GD,panel:tB});var t,n,e}),ZD=[go("type"),To("classes",[]),yo("items",QD)],tB=Jo(ZD),nB=[ur("name","name",Ue(function(){return Fr("tab-name")}),tr),go("title"),yo("items",QD)],eB=[go("type"),bo("tabs",nB)],oB=Jo(eB),rB=$E,iB=ZE,uB=Jo([go("title"),mo("body",oo("type",{panel:tB,tabpanel:oB})),Bo("size","normal"),yo("buttons",iB),To("initialData",{}),Fo("onAction",st),Fo("onChange",st),Fo("onSubmit",st),Fo("onClose",st),Fo("onCancel",st),To("onTabChange",st)]),aB=Jo(H([po("type",["cancel","custom"])],rB,!0)),cB=Jo([go("title"),go("url"),So("height"),So("width"),Oo("buttons",aB),Fo("onAction",st),Fo("onCancel",st),Fo("onClose",st),Fo("onMessage",st)]),sB=function(t){return x(t)?[t].concat(z(Z(t),sB)):c(t)?z(t,sB):[]},lB={checkbox:uD,colorinput:mD,colorpicker:pD,dropzone:wD,input:MD,iframe:_D,sizeinput:UD,selectbox:ND,listbox:PD,size:UD,textarea:qD,urlinput:$D,customeditor:yD,collection:fD,togglemenuitem:KE},fB={open:function(t,n){var e=fE(n);return t(e.internalDialog,e.initialData,e.dataValidator)},openUrl:function(t,n){return t(ao(uo("dialog",cB,n)))},redial:fE},dB=wl({name:"TabButton",configFields:[To("uid",void 0),fo("value"),ur("dom","dom",Xe(function(){return{attributes:{role:"tab",id:Fr("aria"),"aria-selected":"false"}}}),Qo()),xo("action"),To("domModification",{}),$s("tabButtonBehaviours",[Vg,Mg,Tf]),fo("view")],factory:function(t,n){return{uid:t.uid,dom:t.dom,components:t.components,events:xm(t.action),behaviours:Zs(t.tabButtonBehaviours,[Vg.config({}),Mg.config({mode:"execution",useSpace:!0,useEnter:!0}),Tf.config({store:{mode:"memory",initialValue:t.value}})]),domModification:t.domModification}}}),mB=rt([fo("tabs"),fo("dom"),To("clickToDismiss",!1),$s("tabbarBehaviours",[gd,Mg]),Yu(["tabClass","selectedClass"])]),gB=rt([$f({factory:dB,name:"tabs",unit:"tab",overrides:function(o){return{action:function(t){var n=t.getSystem().getByUid(o.uid).getOrDie(),e=gd.isHighlighted(n,t);(e&&o.clickToDismiss?function(t,n){gd.dehighlight(t,n),vr(t,$i(),{tabbar:t,button:n})}:e?st:function(t,n){gd.highlight(t,n),vr(t,Ji(),{tabbar:t,button:n})})(n,t)},domModification:{classes:[o.markers.tabClass]}}}})]),pB=Sl({name:"Tabbar",configFields:mB(),partFields:gB(),factory:function(t,n,e,o){return{uid:t.uid,dom:t.dom,components:n,"debug.sketcher":"Tabbar",domModification:{attributes:{role:"tablist"}},behaviours:Zs(t.tabbarBehaviours,[gd.config({highlightClass:t.markers.selectedClass,itemClass:t.markers.tabClass,onHighlight:function(t,n){on(n.element,"aria-selected","true")},onDehighlight:function(t,n){on(n.element,"aria-selected","false")}}),Mg.config({mode:"flow",getInitial:function(t){return gd.getHighlighted(t).map(function(t){return t.element})},selector:"."+t.markers.tabClass,executeOnMove:!0})])}}}),hB=wl({name:"Tabview",configFields:[$s("tabviewBehaviours",[Fg])],factory:function(t,n){return{uid:t.uid,dom:t.dom,behaviours:Zs(t.tabviewBehaviours,[Fg.config({})]),domModification:{attributes:{role:"tabpanel"}}}}}),vB=rt([To("selectFirst",!0),Ku("onChangeTab"),Ku("onDismissTab"),To("tabs",[]),$s("tabSectionBehaviours",[])]),bB=rt([qf({factory:pB,schema:[fo("dom"),vo("markers",[fo("tabClass"),fo("selectedClass")])],name:"tabbar",defaults:function(t){return{tabs:t.tabs}}}),qf({factory:hB,name:"tabview"})]),yB=Sl({name:"TabSection",configFields:vB(),partFields:bB(),factory:function(i,t,n,e){function o(t,n){fl(t,i,"tabbar").each(function(t){n(t).each(br)})}return{uid:i.uid,dom:i.dom,components:t,behaviours:Qs(i.tabSectionBehaviours),events:nu(ft([i.selectFirst?[eu(function(t,n){o(t,gd.getFirst)})]:[],[Cr(Ji(),function(t,n){var o=n.event.button,r=Tf.getValue(o);fl(o,i,"tabview").each(function(e){V(i.tabs,function(t){return t.value===r}).each(function(t){var n=t.view();un(o.element,"id").each(function(t){on(e.element,"aria-labelledby",t)}),Fg.set(e,n),i.onChangeTab(e,o,n)})})}),Cr($i(),function(t,n){var e=n.event.button;i.onDismissTab(t,e)})]])),apis:{getViewItems:function(t){return fl(t,i,"tabview").map(function(t){return Fg.contents(t)}).getOr([])},showTab:function(t,e){o(t,function(n){return V(gd.getCandidates(n),function(t){return Tf.getValue(t)===e}).filter(function(t){return!gd.isHighlighted(n,t)})})}}}},apis:{getViewItems:function(t,n){return t.getViewItems(n)},showTab:function(t,n,e){t.showTab(n,e)}}}),xB="send-data-to-section",wB="send-data-to-view",SB=Fr("update-dialog"),CB=Fr("update-title"),kB=Fr("update-body"),OB=Fr("update-footer"),_B=Fr("body-send-message"),TB=Zv.deviceType.isTouch(),EB=function(u,t){function n(t,i){return Cr(t,function(e,o){var n,r;n=e,r=function(t,n){i(u(),t,o.event,e)},x_.getState(n).get().each(function(t){r(t,n)})})}return H(H([],IE(n,t),!0),[n(by,function(t,n,e){n.onAction(t,{name:e.name})})],!1)},DB=function(u,t,c){function n(t,i){return Cr(t,function(e,o){var n,r;n=e,r=function(t,n){i(u(),t,o.event,e)},x_.getState(n).get().each(function(t){r(t.internalDialog,n)})})}return H(H([],IE(n,t),!0),[n(yy,function(t,n){return n.onSubmit(t)}),n(py,function(t,n,e){n.onChange(t,{name:e.name})}),n(by,function(t,n,e,o){function r(){return Mg.focusIn(o)}function i(t){return an(t,"disabled")||un(t,"aria-disabled").exists(function(t){return"true"===t})}var u=me(o.element),a=ka(u);n.onAction(t,{name:e.name,value:e.value}),ka(u).fold(r,function(n){i(n)||a.exists(function(t){return Wt(n,t)&&i(t)})?r():c().toOptional().filter(function(t){return!Wt(t.element,n)}).each(r)})}),n(Sy,function(t,n,e){n.onTabChange(t,{newTabName:e.name,oldTabName:e.oldName})}),ou(function(t){var n=u();Tf.setValue(t,n.getData())})],!1)},BB=VE,MB=tinymce.util.Tools.resolve("tinymce.util.URI"),AB=["insertContent","setContent","execCommand","close","block","unblock"];o.add("silver",function(t){var n=cE(t),e=n.uiMothership,o=n.backstage,r=n.renderUI,i=n.getUi;return ey(t,o.shared),{renderUI:r,getWindowManagerImpl:rt(WE({editor:t,backstage:o})),getNotificationManagerImpl:function(){return u=t,r=e,l={backstage:o}.backstage.shared,{open:function(t,n){function e(){n(),rp.hide(c)}var o=!t.closeButton&&t.timeout&&(0<t.timeout||t.timeout<0),a=_u(gp.sketch({text:t.text,level:wt(["success","error","warning","warn","info"],t.type)?t.type:void 0,progress:!0===t.progressBar,icon:vt.from(t.icon),closeButton:!o,onAction:e,iconProvider:l.providers.icons,translationProvider:l.providers.translate})),c=_u(rp.sketch(lt({dom:{tag:"div",classes:["tox-notifications-container"]},lazySink:l.getSink,fireDismissalEventInstead:{}},l.header.isPositionedAtTop()?{}:{fireRepositionEventInstead:{}})));function s(){var t=Me(At.fromDom(u.getContentAreaContainer())),n=Ae(),e=Ua(n.x,t.x,t.right),o=Ua(n.y,t.y,t.bottom),r=Math.max(t.right,n.right),i=Math.max(t.bottom,n.bottom);return vt.some(Be(e,o,r-e,i-o))}return r.add(c),0<t.timeout&&cp.setTimeout(function(){e()},t.timeout),{close:e,moveTo:function(t,n){rp.showAt(c,Tu(a),{anchor:{type:"makeshift",x:t,y:n}})},moveRel:function(t,n){var e,o,r,i=Tu(a),u={maxHeightFunction:Ic()};"banner"!==n&&d(t)?(e=function(){switch(n){case"bc-bc":return ap;case"tc-tc":return up;case"tc-bc":return Ka;default:return Ja}}(),o={type:"node",root:ve(),node:vt.some(At.fromDom(t)),overrides:u,layouts:{onRtl:function(){return[e]},onLtr:function(){return[e]}}},rp.showWithinBounds(c,i,{anchor:o},s)):(r=lt(lt({},l.anchors.banner()),{overrides:u}),rp.showWithinBounds(c,i,{anchor:r},s))},text:function(t){gp.updateText(a,t)},settings:t,getEl:function(){return a.element.dom},progressBar:{value:function(t){gp.updateProgress(a,t)}}}},close:function(t){t.close()},reposition:function(e){0<e.length&&St(e,function(t,n){0===n?t.moveRel(null,"banner"):t.moveRel(e[n-1].getEl(),"bc-tc")})},getArgs:function(t){return t.settings}};var u,r,l},ui:i()}})}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tinymce/tinymce.d.ts b/public/static/assets/gougu/module/tinymce/tinymce.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ad402b6c333989fc6a97d978a8e5e82aa18f7d27
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/tinymce.d.ts
@@ -0,0 +1,3036 @@
+interface StringPathBookmark {
+    start: string;
+    end?: string;
+}
+interface RangeBookmark {
+    rng: Range;
+}
+interface IdBookmark {
+    id: string;
+    keep?: boolean;
+}
+interface IndexBookmark {
+    name: string;
+    index: number;
+}
+interface PathBookmark {
+    start: number[];
+    end?: number[];
+    isFakeCaret?: boolean;
+}
+declare type Bookmark = StringPathBookmark | RangeBookmark | IdBookmark | IndexBookmark | PathBookmark;
+declare type NormalizedEvent<E, T = any> = E & {
+    readonly type: string;
+    readonly target: T;
+    readonly isDefaultPrevented: () => boolean;
+    readonly preventDefault: () => void;
+    readonly isPropagationStopped: () => boolean;
+    readonly stopPropagation: () => void;
+    readonly isImmediatePropagationStopped: () => boolean;
+    readonly stopImmediatePropagation: () => void;
+};
+declare type MappedEvent<T, K extends string> = K extends keyof T ? T[K] : any;
+interface NativeEventMap {
+    'beforepaste': Event;
+    'blur': FocusEvent;
+    'beforeinput': InputEvent;
+    'click': MouseEvent;
+    'compositionend': Event;
+    'compositionstart': Event;
+    'compositionupdate': Event;
+    'contextmenu': PointerEvent;
+    'copy': ClipboardEvent;
+    'cut': ClipboardEvent;
+    'dblclick': MouseEvent;
+    'drag': DragEvent;
+    'dragdrop': DragEvent;
+    'dragend': DragEvent;
+    'draggesture': DragEvent;
+    'dragover': DragEvent;
+    'dragstart': DragEvent;
+    'drop': DragEvent;
+    'focus': FocusEvent;
+    'focusin': FocusEvent;
+    'focusout': FocusEvent;
+    'input': InputEvent;
+    'keydown': KeyboardEvent;
+    'keypress': KeyboardEvent;
+    'keyup': KeyboardEvent;
+    'mousedown': MouseEvent;
+    'mouseenter': MouseEvent;
+    'mouseleave': MouseEvent;
+    'mousemove': MouseEvent;
+    'mouseout': MouseEvent;
+    'mouseover': MouseEvent;
+    'mouseup': MouseEvent;
+    'paste': ClipboardEvent;
+    'selectionchange': Event;
+    'submit': Event;
+    'touchend': TouchEvent;
+    'touchmove': TouchEvent;
+    'touchstart': TouchEvent;
+    'touchcancel': TouchEvent;
+    'wheel': WheelEvent;
+}
+declare type EditorEvent<T> = NormalizedEvent<T>;
+interface EventDispatcherSettings {
+    scope?: any;
+    toggleEvent?: (name: string, state: boolean) => void | boolean;
+    beforeFire?: <T>(args: EditorEvent<T>) => void;
+}
+interface EventDispatcherConstructor<T extends NativeEventMap> {
+    readonly prototype: EventDispatcher<T>;
+    new (settings?: EventDispatcherSettings): EventDispatcher<T>;
+    isNative: (name: string) => boolean;
+}
+declare class EventDispatcher<T> {
+    static isNative(name: string): boolean;
+    private readonly settings;
+    private readonly scope;
+    private readonly toggleEvent;
+    private bindings;
+    constructor(settings?: Record<string, any>);
+    fire<K extends string, U extends MappedEvent<T, K>>(name: K, args?: U): EditorEvent<U>;
+    on<K extends string>(name: K, callback: false | ((event: EditorEvent<MappedEvent<T, K>>) => void), prepend?: boolean, extra?: {}): this;
+    off<K extends string>(name?: K, callback?: (event: EditorEvent<MappedEvent<T, K>>) => void): this;
+    once<K extends string>(name: K, callback: (event: EditorEvent<MappedEvent<T, K>>) => void, prepend?: boolean): this;
+    has(name: string): boolean;
+}
+declare const enum UndoLevelType {
+    Fragmented = "fragmented",
+    Complete = "complete"
+}
+interface UndoLevel {
+    type: UndoLevelType;
+    fragments: string[];
+    content: string;
+    bookmark: Bookmark;
+    beforeBookmark: Bookmark;
+}
+interface UndoManager {
+    data: UndoLevel[];
+    typing: boolean;
+    add: (level?: UndoLevel, event?: EditorEvent<any>) => UndoLevel;
+    beforeChange: () => void;
+    undo: () => UndoLevel;
+    redo: () => UndoLevel;
+    clear: () => void;
+    reset: () => void;
+    hasUndo: () => boolean;
+    hasRedo: () => boolean;
+    transact: (callback: () => void) => UndoLevel;
+    ignore: (callback: () => void) => void;
+    extra: (callback1: () => void, callback2: () => void) => void;
+}
+declare type ArrayCallback$1<T, R> = (x: T, i: number, xs: ReadonlyArray<T>) => R;
+declare type ObjCallback$1<T, R> = (value: T, key: string, obj: Record<string, T>) => R;
+declare type ArrayCallback<T, R> = ArrayCallback$1<T, R>;
+declare type ObjCallback<T, R> = ObjCallback$1<T, R>;
+interface Tools {
+    is: (obj: any, type: string) => boolean;
+    isArray: <T>(arr: any) => arr is Array<T>;
+    inArray: <T>(arr: ArrayLike<T>, value: T) => number;
+    grep: {
+        <T>(arr: ArrayLike<T> | null | undefined, pred?: ArrayCallback<T, boolean>): T[];
+        <T>(arr: Record<string, T> | null | undefined, pred?: ObjCallback<T, boolean>): T[];
+    };
+    trim: (str: string) => string;
+    toArray: <T>(obj: ArrayLike<T>) => T[];
+    hasOwn: (obj: any, name: string) => boolean;
+    makeMap: <T>(items: ArrayLike<T> | string, delim?: string | RegExp, map?: Record<string, T | string>) => Record<string, T | string>;
+    each: {
+        <T>(arr: ArrayLike<T> | null | undefined, cb: ArrayCallback<T, void | boolean>, scope?: any): boolean;
+        <T>(obj: Record<string, T> | null | undefined, cb: ObjCallback<T, void | boolean>, scope?: any): boolean;
+    };
+    map: {
+        <T, R>(arr: ArrayLike<T> | null | undefined, cb: ArrayCallback<T, R>): R[];
+        <T, R>(obj: Record<string, T> | null | undefined, cb: ObjCallback<T, R>): R[];
+    };
+    extend: (obj: Object, ext: Object, ...objs: Object[]) => any;
+    create: (name: string, p: Object, root?: Object) => void;
+    walk: <T = any>(obj: T, f: Function, n?: keyof T, scope?: any) => void;
+    createNS: (name: string, o?: Object) => any;
+    resolve: (path: string, o?: Object) => any;
+    explode: (s: string, d?: string | RegExp) => string[];
+    _addCacheSuffix: (url: string) => string;
+}
+declare type EventUtilsCallback<T> = (event: EventUtilsEvent<T>) => void;
+declare type EventUtilsEvent<T> = NormalizedEvent<T> & {
+    metaKey: boolean;
+};
+interface EventUtilsConstructor {
+    readonly prototype: EventUtils;
+    new (): EventUtils;
+    Event: EventUtils;
+}
+declare class EventUtils {
+    static Event: EventUtils;
+    domLoaded: boolean;
+    events: Record<string, any>;
+    private readonly expando;
+    private hasFocusIn;
+    private hasMouseEnterLeave;
+    private mouseEnterLeave;
+    private count;
+    constructor();
+    bind<K extends keyof HTMLElementEventMap>(target: any, name: K, callback: EventUtilsCallback<HTMLElementEventMap[K]>, scope?: any): EventUtilsCallback<HTMLElementEventMap[K]>;
+    bind<T = any>(target: any, names: string, callback: EventUtilsCallback<T>, scope?: any): EventUtilsCallback<T>;
+    unbind<K extends keyof HTMLElementEventMap>(target: any, name: K, callback?: EventUtilsCallback<HTMLElementEventMap[K]>): this;
+    unbind<T = any>(target: any, names: string, callback?: EventUtilsCallback<T>): this;
+    unbind(target: any): this;
+    fire(target: any, name: string, args?: {}): this;
+    clean(target: any): this;
+    destroy(): void;
+    cancel<T = any>(e: EventUtilsEvent<T>): boolean;
+    private executeHandlers;
+}
+declare type DomQuerySelector<T extends Node> = string | T | T[] | DomQuery<T>;
+declare type DomQueryInitSelector<T extends Node> = DomQuerySelector<T> | Window;
+interface Hook {
+    get: <T extends Node>(elm: T) => string;
+    set: <T extends Node>($elm: DomQuery<T>, value: string | null) => void;
+}
+interface DomQueryConstructor {
+    readonly prototype: DomQuery;
+    attrHooks: Record<string, Hook>;
+    cssHooks: Record<string, Hook>;
+    fn: DomQuery;
+    find: any;
+    expr: {
+        cacheLength: number;
+        createPseudo: Function;
+        match: Record<string, RegExp>;
+        attrHandle: {};
+        find: Record<string, Function>;
+        relative: Record<string, {
+            dir: string;
+            first?: boolean;
+        }>;
+        preFilter: Record<string, Function>;
+        filter: Record<string, Function>;
+        pseudos: Record<string, Function>;
+    };
+    extend: Tools['extend'];
+    isArray: Tools['isArray'];
+    new <T extends Node = Node>(selector?: DomQueryInitSelector<T>, context?: Node): DomQuery<T>;
+    <T extends Node = Node>(selector?: DomQueryInitSelector<T>, context?: Node): DomQuery<T>;
+    overrideDefaults(callback: () => {
+        context: Node;
+        element: Element;
+    }): DomQueryConstructor;
+    makeArray<T>(object: T): T[];
+    inArray<T>(item: {}, array: T[]): number;
+    each<T>(obj: T[], callback: (i: number, value: T) => void): void;
+    each<T>(obj: T, callback: (key: string, obj: T[keyof T]) => void): void;
+    trim(str: string): string;
+    grep<T>(array: T[], callback: (item: any, i: number) => boolean): T[];
+    unique<T>(results: T[]): T[];
+    text(elem: Node): string;
+    contains(context: any, elem: Node): boolean;
+    filter(expr: string, elems: Node[], not?: boolean): any;
+}
+interface DomQuery<T extends Node = Node> extends ArrayLike<T> {
+    init: (selector?: DomQueryInitSelector<T>, context?: Node) => void;
+    context: T;
+    length: number;
+    selector: string;
+    add(items: Array<string | T> | DomQuery<T>, sort?: boolean): this;
+    addClass(className: string): this;
+    after(content: DomQuerySelector<T>): this;
+    append(content: DomQuerySelector<T>): this;
+    appendTo(val: DomQuerySelector<T>): this;
+    attr(name: string, value: string | boolean | number | null): this;
+    attr(attrs: Record<string, string | boolean | number | null>): this;
+    attr(name: string): string;
+    before(content: DomQuerySelector<T>): this;
+    children(selector?: string): DomQuery<Node & ChildNode>;
+    clone(): this;
+    closest(selector: DomQuerySelector<T>): this;
+    contents(selector?: string): DomQuery<Node & ChildNode>;
+    css(name: string, value: string | number | null): this;
+    css(styles: Record<string, string | number | null>): this;
+    css(name: string): string;
+    each(callback: (i: number, value: T) => void): this;
+    empty(): this;
+    eq(index: number): this;
+    filter(selector: string | ((i: number, item: any) => boolean)): this;
+    find<K extends keyof HTMLElementTagNameMap>(selector: K): DomQuery<HTMLElementTagNameMap[K]>;
+    find<T extends Node>(selector: string): DomQuery<T>;
+    first(): this;
+    hasClass(className: string): boolean;
+    hide(): this;
+    html(value: string): this;
+    html(): string;
+    is(selector: string | ((i: number, item: any) => boolean)): boolean;
+    last(): this;
+    next(selector?: string): DomQuery<Node & ChildNode>;
+    nextUntil(selector: DomQuerySelector<T>, until?: string): DomQuery<Node & ChildNode>;
+    off<K extends keyof HTMLElementEventMap>(name: K, callback?: EventUtilsCallback<HTMLElementEventMap[K]>): this;
+    off<U>(name?: string, callback?: EventUtilsCallback<U>): this;
+    offset(offset?: {}): {} | this;
+    on<K extends keyof HTMLElementEventMap>(name: K, callback: EventUtilsCallback<HTMLElementEventMap[K]>): this;
+    on<U>(name: string, callback: EventUtilsCallback<U>): this;
+    parent(selector?: string): DomQuery<Node>;
+    parents(selector?: string): DomQuery<Node>;
+    parentsUntil(selector: DomQuerySelector<T>, filter?: string): DomQuery<Node>;
+    prepend(content: DomQuerySelector<T>): this;
+    prependTo(val: DomQuerySelector<T>): this;
+    prev(selector?: string): DomQuery<Node & ChildNode>;
+    prevUntil(selector: DomQuerySelector<T>, filter?: string): DomQuery<Node & ChildNode>;
+    prop(name: string, value: string): this;
+    prop(props: Record<string, string | number>): this;
+    prop(name: string): string;
+    push(...items: T[]): number;
+    remove(): this;
+    removeAttr(name: string): this;
+    removeClass(className: string): this;
+    replaceWith(content: DomQuerySelector<T>): this;
+    show(): this;
+    slice(start: number, end?: number): this;
+    splice(start: number, deleteCount?: number): T[];
+    sort(compareFn?: (a: T, b: T) => number): T[];
+    text(value: string): DomQuery;
+    text(): string;
+    toArray(): T[];
+    toggleClass(className: string, state?: boolean): this;
+    trigger(name: string | {
+        type: string;
+    }): this;
+    unwrap(): this;
+    wrap(content: DomQuerySelector<T>): this;
+    wrapAll(content: DomQuerySelector<T>): this;
+    wrapInner(content: string): this;
+}
+declare type SchemaType = 'html4' | 'html5' | 'html5-strict';
+interface SchemaSettings {
+    block_elements?: string;
+    boolean_attributes?: string;
+    custom_elements?: string;
+    extended_valid_elements?: string;
+    invalid_elements?: string;
+    invalid_styles?: string | Record<string, string>;
+    move_caret_before_on_enter_elements?: string;
+    non_empty_elements?: string;
+    schema?: SchemaType;
+    self_closing_elements?: string;
+    short_ended_elements?: string;
+    special?: string;
+    text_block_elements?: string;
+    text_inline_elements?: string;
+    valid_children?: string;
+    valid_classes?: string | Record<string, string>;
+    valid_elements?: string;
+    valid_styles?: string | Record<string, string>;
+    verify_html?: boolean;
+    whitespace_elements?: string;
+}
+interface Attribute {
+    required?: boolean;
+    defaultValue?: string;
+    forcedValue?: string;
+    validValues?: any;
+}
+interface DefaultAttribute {
+    name: string;
+    value: string;
+}
+interface AttributePattern {
+    defaultValue?: string;
+    forcedValue?: string;
+    pattern: RegExp;
+    required?: boolean;
+    validValues?: Record<string, string>;
+}
+interface ElementRule {
+    attributes: Record<string, Attribute>;
+    attributesDefault?: DefaultAttribute[];
+    attributesForced?: DefaultAttribute[];
+    attributesOrder: string[];
+    attributePatterns?: AttributePattern[];
+    attributesRequired?: string[];
+    paddEmpty?: boolean;
+    removeEmpty?: boolean;
+    removeEmptyAttrs?: boolean;
+}
+interface SchemaElement extends ElementRule {
+    outputName?: string;
+    parentsRequired?: string[];
+    pattern?: RegExp;
+}
+interface SchemaMap {
+    [name: string]: {};
+}
+interface SchemaRegExpMap {
+    [name: string]: RegExp;
+}
+interface Schema {
+    children: Record<string, SchemaMap>;
+    elements: Record<string, SchemaElement>;
+    getValidStyles: () => Record<string, string[]> | undefined;
+    getValidClasses: () => Record<string, SchemaMap> | undefined;
+    getBlockElements: () => SchemaMap;
+    getInvalidStyles: () => Record<string, SchemaMap> | undefined;
+    getShortEndedElements: () => SchemaMap;
+    getTextBlockElements: () => SchemaMap;
+    getTextInlineElements: () => SchemaMap;
+    getBoolAttrs: () => SchemaMap;
+    getElementRule: (name: string) => SchemaElement | undefined;
+    getSelfClosingElements: () => SchemaMap;
+    getNonEmptyElements: () => SchemaMap;
+    getMoveCaretBeforeOnEnterElements: () => SchemaMap;
+    getWhiteSpaceElements: () => SchemaMap;
+    getSpecialElements: () => SchemaRegExpMap;
+    isValidChild: (name: string, child: string) => boolean;
+    isValid: (name: string, attr?: string) => boolean;
+    getCustomElements: () => SchemaMap;
+    addValidElements: (validElements: string) => void;
+    setValidElements: (validElements: string) => void;
+    addCustomElements: (customElements: string) => void;
+    addValidChildren: (validChildren: any) => void;
+}
+declare type Attributes$1 = Array<{
+    name: string;
+    value: string;
+}> & {
+    map: Record<string, string>;
+};
+interface AstNodeConstructor {
+    readonly prototype: AstNode;
+    new (name: string, type: number): AstNode;
+    create(name: string, attrs?: Record<string, string>): AstNode;
+}
+declare class AstNode {
+    static create(name: string, attrs?: Record<string, string>): AstNode;
+    name: string;
+    type: number;
+    attributes?: Attributes$1;
+    value?: string;
+    shortEnded?: boolean;
+    parent?: AstNode;
+    firstChild?: AstNode;
+    lastChild?: AstNode;
+    next?: AstNode;
+    prev?: AstNode;
+    raw?: boolean;
+    fixed?: boolean;
+    constructor(name: string, type: number);
+    replace(node: AstNode): AstNode;
+    attr(name: string, value: string | null): AstNode | undefined;
+    attr(name: Record<string, string | null>): AstNode | undefined;
+    attr(name: string): string | undefined;
+    clone(): AstNode;
+    wrap(wrapper: AstNode): AstNode;
+    unwrap(): void;
+    remove(): AstNode;
+    append(node: AstNode): AstNode;
+    insert(node: AstNode, refNode: AstNode, before?: boolean): AstNode;
+    getAll(name: string): AstNode[];
+    children(): AstNode[];
+    empty(): AstNode;
+    isEmpty(elements: SchemaMap, whitespace?: SchemaMap, predicate?: (node: AstNode) => boolean): boolean;
+    walk(prev?: boolean): AstNode;
+}
+declare type Content = string | AstNode;
+declare type ContentFormat = 'raw' | 'text' | 'html' | 'tree';
+interface GetContentArgs {
+    format?: ContentFormat;
+    get?: boolean;
+    content?: string;
+    getInner?: boolean;
+    no_events?: boolean;
+    [key: string]: any;
+}
+interface SetContentArgs {
+    format?: string;
+    set?: boolean;
+    content?: string;
+    no_events?: boolean;
+    no_selection?: boolean;
+}
+interface BlobInfoData {
+    id?: string;
+    name?: string;
+    filename?: string;
+    blob: Blob;
+    base64: string;
+    blobUri?: string;
+    uri?: string;
+}
+interface BlobInfo {
+    id: () => string;
+    name: () => string;
+    filename: () => string;
+    blob: () => Blob;
+    base64: () => string;
+    blobUri: () => string;
+    uri: () => string | undefined;
+}
+interface BlobCache {
+    create: (o: string | BlobInfoData, blob?: Blob, base64?: string, name?: string, filename?: string) => BlobInfo;
+    add: (blobInfo: BlobInfo) => void;
+    get: (id: string) => BlobInfo | undefined;
+    getByUri: (blobUri: string) => BlobInfo | undefined;
+    getByData: (base64: string, type: string) => BlobInfo | undefined;
+    findFirst: (predicate: (blobInfo: BlobInfo) => boolean) => BlobInfo | undefined;
+    removeByUri: (blobUri: string) => void;
+    destroy: () => void;
+}
+interface NotificationManagerImpl {
+    open: (spec: NotificationSpec, closeCallback?: () => void) => NotificationApi;
+    close: <T extends NotificationApi>(notification: T) => void;
+    reposition: <T extends NotificationApi>(notifications: T[]) => void;
+    getArgs: <T extends NotificationApi>(notification: T) => NotificationSpec;
+}
+interface NotificationSpec {
+    type?: 'info' | 'warning' | 'error' | 'success';
+    text: string;
+    icon?: string;
+    progressBar?: boolean;
+    timeout?: number;
+    closeButton?: boolean;
+}
+interface NotificationApi {
+    close: () => void;
+    progressBar: {
+        value: (percent: number) => void;
+    };
+    text: (text: string) => void;
+    moveTo: (x: number, y: number) => void;
+    moveRel: (element: Element, rel: 'tc-tc' | 'bc-bc' | 'bc-tc' | 'tc-bc' | 'banner') => void;
+    getEl: () => HTMLElement;
+    settings: NotificationSpec;
+}
+interface NotificationManager {
+    open: (spec: NotificationSpec) => NotificationApi;
+    close: () => void;
+    getNotifications: () => NotificationApi[];
+}
+interface UploadFailureOptions {
+    remove?: boolean;
+}
+declare type UploadHandler = (blobInfo: BlobInfo, success: (url: string) => void, failure: (err: string, options?: UploadFailureOptions) => void, progress?: (percent: number) => void) => void;
+interface UploadResult$2 {
+    url: string;
+    blobInfo: BlobInfo;
+    status: boolean;
+    error?: {
+        options: UploadFailureOptions;
+        message: string;
+    };
+}
+interface RangeLikeObject {
+    startContainer: Node;
+    startOffset: number;
+    endContainer: Node;
+    endOffset: number;
+}
+declare type ApplyFormat = BlockFormat | InlineFormat | SelectorFormat;
+declare type RemoveFormat = RemoveBlockFormat | RemoveInlineFormat | RemoveSelectorFormat;
+declare type Format = ApplyFormat | RemoveFormat;
+declare type Formats = Record<string, Format | Format[]>;
+declare type FormatAttrOrStyleValue = string | ((vars?: FormatVars) => string);
+declare type FormatVars = Record<string, string | null>;
+interface BaseFormat<T> {
+    ceFalseOverride?: boolean;
+    classes?: string | string[];
+    collapsed?: boolean;
+    exact?: boolean;
+    expand?: boolean;
+    links?: boolean;
+    mixed?: boolean;
+    block_expand?: boolean;
+    onmatch?: (node: Node, fmt: T, itemName: string) => boolean;
+    remove?: 'none' | 'empty' | 'all';
+    remove_similar?: boolean;
+    split?: boolean;
+    deep?: boolean;
+    preserve_attributes?: string[];
+}
+interface Block {
+    block: string;
+    list_block?: string;
+    wrapper?: boolean;
+}
+interface Inline {
+    inline: string;
+}
+interface Selector {
+    selector: string;
+    inherit?: boolean;
+}
+interface CommonFormat<T> extends BaseFormat<T> {
+    attributes?: Record<string, FormatAttrOrStyleValue>;
+    styles?: Record<string, FormatAttrOrStyleValue>;
+    toggle?: boolean;
+    preview?: string | false;
+    onformat?: (elm: Node, fmt: T, vars?: FormatVars, node?: Node | RangeLikeObject) => void;
+    clear_child_styles?: boolean;
+    merge_siblings?: boolean;
+    merge_with_parents?: boolean;
+    defaultBlock?: string;
+}
+interface BlockFormat extends Block, CommonFormat<BlockFormat> {
+}
+interface InlineFormat extends Inline, CommonFormat<InlineFormat> {
+}
+interface SelectorFormat extends Selector, CommonFormat<SelectorFormat> {
+}
+interface CommonRemoveFormat<T> extends BaseFormat<T> {
+    attributes?: string[] | Record<string, FormatAttrOrStyleValue>;
+    styles?: string[] | Record<string, FormatAttrOrStyleValue>;
+}
+interface RemoveBlockFormat extends Block, CommonRemoveFormat<RemoveBlockFormat> {
+}
+interface RemoveInlineFormat extends Inline, CommonRemoveFormat<RemoveInlineFormat> {
+}
+interface RemoveSelectorFormat extends Selector, CommonRemoveFormat<RemoveSelectorFormat> {
+}
+type Format_d_Formats = Formats;
+type Format_d_Format = Format;
+type Format_d_ApplyFormat = ApplyFormat;
+type Format_d_BlockFormat = BlockFormat;
+type Format_d_InlineFormat = InlineFormat;
+type Format_d_SelectorFormat = SelectorFormat;
+type Format_d_RemoveFormat = RemoveFormat;
+type Format_d_RemoveBlockFormat = RemoveBlockFormat;
+type Format_d_RemoveInlineFormat = RemoveInlineFormat;
+type Format_d_RemoveSelectorFormat = RemoveSelectorFormat;
+declare namespace Format_d {
+    export { Format_d_Formats as Formats, Format_d_Format as Format, Format_d_ApplyFormat as ApplyFormat, Format_d_BlockFormat as BlockFormat, Format_d_InlineFormat as InlineFormat, Format_d_SelectorFormat as SelectorFormat, Format_d_RemoveFormat as RemoveFormat, Format_d_RemoveBlockFormat as RemoveBlockFormat, Format_d_RemoveInlineFormat as RemoveInlineFormat, Format_d_RemoveSelectorFormat as RemoveSelectorFormat, };
+}
+declare type StyleFormat = BlockStyleFormat | InlineStyleFormat | SelectorStyleFormat;
+declare type AllowedFormat = Separator | FormatReference | StyleFormat | NestedFormatting;
+interface Separator {
+    title: string;
+}
+interface FormatReference {
+    title: string;
+    format: string;
+    icon?: string;
+}
+interface NestedFormatting {
+    title: string;
+    items: Array<FormatReference | StyleFormat>;
+}
+interface CommonStyleFormat {
+    name?: string;
+    title: string;
+    icon?: string;
+}
+interface BlockStyleFormat extends BlockFormat, CommonStyleFormat {
+}
+interface InlineStyleFormat extends InlineFormat, CommonStyleFormat {
+}
+interface SelectorStyleFormat extends SelectorFormat, CommonStyleFormat {
+}
+interface AlertBannerSpec {
+    type: 'alertbanner';
+    level: 'info' | 'warn' | 'error' | 'success';
+    text: string;
+    icon: string;
+    url?: string;
+}
+interface ButtonSpec {
+    type: 'button';
+    text: string;
+    disabled?: boolean;
+    primary?: boolean;
+    name?: string;
+    icon?: string;
+    borderless?: boolean;
+}
+interface CheckboxSpec {
+    name: string;
+    type: 'checkbox';
+    label: string;
+    disabled?: boolean;
+}
+interface FormComponentSpec {
+    type: string;
+    name: string;
+}
+interface FormComponentWithLabelSpec extends FormComponentSpec {
+    label?: string;
+}
+interface CollectionSpec extends FormComponentWithLabelSpec {
+    type: 'collection';
+}
+interface ColorInputSpec extends FormComponentWithLabelSpec {
+    type: 'colorinput';
+}
+interface ColorPickerSpec extends FormComponentWithLabelSpec {
+    type: 'colorpicker';
+}
+interface CustomEditorInit {
+    setValue: (value: string) => void;
+    getValue: () => string;
+    destroy: () => void;
+}
+declare type CustomEditorInitFn = (elm: HTMLElement, settings: any) => Promise<CustomEditorInit>;
+interface CustomEditorOldSpec extends FormComponentSpec {
+    type: 'customeditor';
+    tag?: string;
+    init: (e: HTMLElement) => Promise<CustomEditorInit>;
+}
+interface CustomEditorNewSpec extends FormComponentSpec {
+    type: 'customeditor';
+    tag?: string;
+    scriptId: string;
+    scriptUrl: string;
+    settings?: any;
+}
+declare type CustomEditorSpec = CustomEditorOldSpec | CustomEditorNewSpec;
+interface DropZoneSpec extends FormComponentWithLabelSpec {
+    type: 'dropzone';
+}
+interface GridSpec {
+    type: 'grid';
+    columns: number;
+    items: BodyComponentSpec[];
+}
+interface HtmlPanelSpec {
+    type: 'htmlpanel';
+    html: string;
+    presets?: 'presentation' | 'document';
+}
+interface IframeSpec extends FormComponentWithLabelSpec {
+    type: 'iframe';
+    sandboxed?: boolean;
+}
+interface ImageToolsState {
+    blob: Blob;
+    url: string;
+}
+interface ImageToolsSpec extends FormComponentWithLabelSpec {
+    type: 'imagetools';
+    currentState: ImageToolsState;
+}
+interface InputSpec extends FormComponentWithLabelSpec {
+    type: 'input';
+    inputMode?: string;
+    placeholder?: string;
+    maximized?: boolean;
+    disabled?: boolean;
+}
+interface LabelSpec {
+    type: 'label';
+    label: string;
+    items: BodyComponentSpec[];
+}
+interface ListBoxSingleItemSpec {
+    text: string;
+    value: string;
+}
+interface ListBoxNestedItemSpec {
+    text: string;
+    items: ListBoxItemSpec[];
+}
+declare type ListBoxItemSpec = ListBoxNestedItemSpec | ListBoxSingleItemSpec;
+interface ListBoxSpec extends FormComponentWithLabelSpec {
+    type: 'listbox';
+    items: ListBoxItemSpec[];
+    disabled?: boolean;
+}
+interface PanelSpec {
+    type: 'panel';
+    classes?: string[];
+    items: BodyComponentSpec[];
+}
+interface SelectBoxItemSpec {
+    text: string;
+    value: string;
+}
+interface SelectBoxSpec extends FormComponentWithLabelSpec {
+    type: 'selectbox';
+    items: SelectBoxItemSpec[];
+    size?: number;
+    disabled?: boolean;
+}
+interface SizeInputSpec extends FormComponentWithLabelSpec {
+    type: 'sizeinput';
+    constrain?: boolean;
+    disabled?: boolean;
+}
+interface TableSpec {
+    type: 'table';
+    header: string[];
+    cells: string[][];
+}
+interface TextAreaSpec extends FormComponentWithLabelSpec {
+    type: 'textarea';
+    placeholder?: string;
+    maximized?: boolean;
+    disabled?: boolean;
+}
+interface UrlInputSpec extends FormComponentWithLabelSpec {
+    type: 'urlinput';
+    filetype?: 'image' | 'media' | 'file';
+    disabled?: boolean;
+}
+declare type BodyComponentSpec = BarSpec | ButtonSpec | CheckboxSpec | TextAreaSpec | InputSpec | ListBoxSpec | SelectBoxSpec | SizeInputSpec | IframeSpec | HtmlPanelSpec | UrlInputSpec | DropZoneSpec | ColorInputSpec | GridSpec | ColorPickerSpec | ImageToolsSpec | AlertBannerSpec | CollectionSpec | LabelSpec | TableSpec | PanelSpec | CustomEditorSpec;
+interface BarSpec {
+    type: 'bar';
+    items: BodyComponentSpec[];
+}
+interface CommonMenuItemSpec {
+    disabled?: boolean;
+    text?: string;
+    value?: string;
+    meta?: Record<string, any>;
+    shortcut?: string;
+}
+interface CommonMenuItemInstanceApi {
+    isDisabled: () => boolean;
+    setDisabled: (state: boolean) => void;
+}
+interface DialogToggleMenuItemSpec extends CommonMenuItemSpec {
+    type?: 'togglemenuitem';
+    name: string;
+}
+declare type DialogFooterMenuButtonItemSpec = DialogToggleMenuItemSpec;
+interface BaseDialogFooterButtonSpec {
+    name?: string;
+    align?: 'start' | 'end';
+    primary?: boolean;
+    disabled?: boolean;
+    icon?: string;
+}
+interface DialogFooterNormalButtonSpec extends BaseDialogFooterButtonSpec {
+    type: 'submit' | 'cancel' | 'custom';
+    text: string;
+}
+interface DialogFooterMenuButtonSpec extends BaseDialogFooterButtonSpec {
+    type: 'menu';
+    text?: string;
+    tooltip?: string;
+    icon?: string;
+    items: DialogFooterMenuButtonItemSpec[];
+}
+declare type DialogFooterButtonSpec = DialogFooterNormalButtonSpec | DialogFooterMenuButtonSpec;
+interface TabSpec {
+    name?: string;
+    title: string;
+    items: BodyComponentSpec[];
+}
+interface TabPanelSpec {
+    type: 'tabpanel';
+    tabs: TabSpec[];
+}
+declare type DialogDataItem = any;
+declare type DialogData = Record<string, DialogDataItem>;
+interface DialogInstanceApi<T extends DialogData> {
+    getData: () => T;
+    setData: (data: Partial<T>) => void;
+    disable: (name: string) => void;
+    focus: (name: string) => void;
+    showTab: (name: string) => void;
+    redial: (nu: DialogSpec<T>) => void;
+    enable: (name: string) => void;
+    block: (msg: string) => void;
+    unblock: () => void;
+    close: () => void;
+}
+interface DialogActionDetails {
+    name: string;
+    value?: any;
+}
+interface DialogChangeDetails<T> {
+    name: keyof T;
+}
+interface DialogTabChangeDetails {
+    newTabName: string;
+    oldTabName: string;
+}
+declare type DialogActionHandler<T> = (api: DialogInstanceApi<T>, details: DialogActionDetails) => void;
+declare type DialogChangeHandler<T> = (api: DialogInstanceApi<T>, details: DialogChangeDetails<T>) => void;
+declare type DialogSubmitHandler<T> = (api: DialogInstanceApi<T>) => void;
+declare type DialogCloseHandler = () => void;
+declare type DialogCancelHandler<T> = (api: DialogInstanceApi<T>) => void;
+declare type DialogTabChangeHandler<T> = (api: DialogInstanceApi<T>, details: DialogTabChangeDetails) => void;
+declare type DialogSize = 'normal' | 'medium' | 'large';
+interface DialogSpec<T extends DialogData> {
+    title: string;
+    size?: DialogSize;
+    body: TabPanelSpec | PanelSpec;
+    buttons: DialogFooterButtonSpec[];
+    initialData?: T;
+    onAction?: DialogActionHandler<T>;
+    onChange?: DialogChangeHandler<T>;
+    onSubmit?: DialogSubmitHandler<T>;
+    onClose?: DialogCloseHandler;
+    onCancel?: DialogCancelHandler<T>;
+    onTabChange?: DialogTabChangeHandler<T>;
+}
+interface UrlDialogInstanceApi {
+    block: (msg: string) => void;
+    unblock: () => void;
+    close: () => void;
+    sendMessage: (msg: any) => void;
+}
+interface UrlDialogActionDetails {
+    name: string;
+    value?: any;
+}
+interface UrlDialogMessage {
+    mceAction: string;
+    [key: string]: any;
+}
+declare type UrlDialogActionHandler = (api: UrlDialogInstanceApi, actions: UrlDialogActionDetails) => void;
+declare type UrlDialogCloseHandler = () => void;
+declare type UrlDialogCancelHandler = (api: UrlDialogInstanceApi) => void;
+declare type UrlDialogMessageHandler = (api: UrlDialogInstanceApi, message: UrlDialogMessage) => void;
+interface UrlDialogFooterButtonSpec extends DialogFooterNormalButtonSpec {
+    type: 'cancel' | 'custom';
+}
+interface UrlDialogSpec {
+    title: string;
+    url: string;
+    height?: number;
+    width?: number;
+    buttons?: UrlDialogFooterButtonSpec[];
+    onAction?: UrlDialogActionHandler;
+    onClose?: UrlDialogCloseHandler;
+    onCancel?: UrlDialogCancelHandler;
+    onMessage?: UrlDialogMessageHandler;
+}
+declare type CardContainerDirection = 'vertical' | 'horizontal';
+declare type CardContainerAlign = 'left' | 'right';
+declare type CardContainerValign = 'top' | 'middle' | 'bottom';
+interface CardContainerSpec {
+    type: 'cardcontainer';
+    items: CardItemSpec[];
+    direction?: CardContainerDirection;
+    align?: CardContainerAlign;
+    valign?: CardContainerValign;
+}
+interface CardImageSpec {
+    type: 'cardimage';
+    src: string;
+    alt?: string;
+    classes?: string[];
+}
+interface CardTextSpec {
+    type: 'cardtext';
+    text: string;
+    name?: string;
+    classes?: string[];
+}
+declare type CardItemSpec = CardContainerSpec | CardImageSpec | CardTextSpec;
+interface CardMenuItemInstanceApi extends CommonMenuItemInstanceApi {
+}
+interface CardMenuItemSpec extends Omit<CommonMenuItemSpec, 'text' | 'shortcut'> {
+    type: 'cardmenuitem';
+    label?: string;
+    items: CardItemSpec[];
+    onSetup?: (api: CardMenuItemInstanceApi) => (api: CardMenuItemInstanceApi) => void;
+    onAction?: (api: CardMenuItemInstanceApi) => void;
+}
+interface SeparatorMenuItemSpec {
+    type?: 'separator';
+    text?: string;
+}
+declare type ColumnTypes$1 = number | 'auto';
+declare type SeparatorItemSpec = SeparatorMenuItemSpec;
+interface AutocompleterItemSpec {
+    type?: 'autocompleteitem';
+    value: string;
+    text?: string;
+    icon?: string;
+    meta?: Record<string, any>;
+}
+declare type AutocompleterContents = SeparatorItemSpec | AutocompleterItemSpec | CardMenuItemSpec;
+interface AutocompleterSpec {
+    type?: 'autocompleter';
+    ch: string;
+    minChars?: number;
+    columns?: ColumnTypes$1;
+    matches?: (rng: Range, text: string, pattern: string) => boolean;
+    fetch: (pattern: string, maxResults: number, fetchOptions: Record<string, any>) => Promise<AutocompleterContents[]>;
+    onAction: (autocompleterApi: AutocompleterInstanceApi, rng: Range, value: string, meta: Record<string, any>) => void;
+    maxResults?: number;
+    highlightOn?: string[];
+}
+interface AutocompleterInstanceApi {
+    hide: () => void;
+    reload: (fetchOptions: Record<string, any>) => void;
+}
+declare type ContextPosition = 'node' | 'selection' | 'line';
+declare type ContextScope = 'node' | 'editor';
+interface ContextBarSpec {
+    predicate?: (elem: Element) => boolean;
+    position?: ContextPosition;
+    scope?: ContextScope;
+}
+interface BaseToolbarButtonSpec<I extends BaseToolbarButtonInstanceApi> {
+    disabled?: boolean;
+    tooltip?: string;
+    icon?: string;
+    text?: string;
+    onSetup?: (api: I) => (api: I) => void;
+}
+interface BaseToolbarButtonInstanceApi {
+    isDisabled: () => boolean;
+    setDisabled: (state: boolean) => void;
+}
+interface ToolbarButtonSpec extends BaseToolbarButtonSpec<ToolbarButtonInstanceApi> {
+    type?: 'button';
+    onAction: (api: ToolbarButtonInstanceApi) => void;
+}
+interface ToolbarButtonInstanceApi extends BaseToolbarButtonInstanceApi {
+}
+interface BaseToolbarToggleButtonSpec<I extends BaseToolbarButtonInstanceApi> extends BaseToolbarButtonSpec<I> {
+    active?: boolean;
+}
+interface BaseToolbarToggleButtonInstanceApi extends BaseToolbarButtonInstanceApi {
+    isActive: () => boolean;
+    setActive: (state: boolean) => void;
+}
+interface ToolbarToggleButtonSpec extends BaseToolbarToggleButtonSpec<ToolbarToggleButtonInstanceApi> {
+    type?: 'togglebutton';
+    onAction: (api: ToolbarToggleButtonInstanceApi) => void;
+}
+interface ToolbarToggleButtonInstanceApi extends BaseToolbarToggleButtonInstanceApi {
+}
+interface ContextFormLaunchButtonApi extends BaseToolbarButtonSpec<BaseToolbarButtonInstanceApi> {
+    type: 'contextformbutton';
+}
+interface ContextFormLaunchToggleButtonSpec extends BaseToolbarToggleButtonSpec<BaseToolbarToggleButtonInstanceApi> {
+    type: 'contextformtogglebutton';
+}
+interface ContextFormButtonInstanceApi extends BaseToolbarButtonInstanceApi {
+}
+interface ContextFormToggleButtonInstanceApi extends BaseToolbarToggleButtonInstanceApi {
+}
+interface ContextFormButtonSpec extends BaseToolbarButtonSpec<ContextFormButtonInstanceApi> {
+    type?: 'contextformbutton';
+    primary?: boolean;
+    onAction: (formApi: ContextFormInstanceApi, api: ContextFormButtonInstanceApi) => void;
+}
+interface ContextFormToggleButtonSpec extends BaseToolbarToggleButtonSpec<ContextFormToggleButtonInstanceApi> {
+    type?: 'contextformtogglebutton';
+    onAction: (formApi: ContextFormInstanceApi, buttonApi: ContextFormToggleButtonInstanceApi) => void;
+    primary?: boolean;
+}
+interface ContextFormInstanceApi {
+    hide: () => void;
+    getValue: () => string;
+}
+interface ContextFormSpec extends ContextBarSpec {
+    type?: 'contextform';
+    initValue?: () => string;
+    label?: string;
+    launch?: ContextFormLaunchButtonApi | ContextFormLaunchToggleButtonSpec;
+    commands: Array<ContextFormToggleButtonSpec | ContextFormButtonSpec>;
+}
+interface ContextToolbarSpec extends ContextBarSpec {
+    type?: 'contexttoolbar';
+    items: string;
+}
+interface ChoiceMenuItemSpec extends CommonMenuItemSpec {
+    type?: 'choiceitem';
+    icon?: string;
+}
+interface ChoiceMenuItemInstanceApi extends CommonMenuItemInstanceApi {
+    isActive: () => boolean;
+    setActive: (state: boolean) => void;
+}
+interface ContextMenuItem extends CommonMenuItemSpec {
+    text: string;
+    icon?: string;
+    type?: 'item';
+    onAction: () => void;
+}
+interface ContextSubMenu extends CommonMenuItemSpec {
+    type: 'submenu';
+    text: string;
+    icon?: string;
+    getSubmenuItems: () => string | Array<ContextMenuContents>;
+}
+declare type ContextMenuContents = string | ContextMenuItem | SeparatorMenuItemSpec | ContextSubMenu;
+interface ContextMenuApi {
+    update: (element: Element) => string | Array<ContextMenuContents>;
+}
+interface FancyActionArgsMap {
+    'inserttable': {
+        numRows: number;
+        numColumns: number;
+    };
+    'colorswatch': {
+        value: string;
+    };
+}
+interface BaseFancyMenuItemSpec<T extends keyof FancyActionArgsMap> {
+    type: 'fancymenuitem';
+    fancytype: T;
+    initData?: Record<string, unknown>;
+    onAction?: (data: FancyActionArgsMap[T]) => void;
+}
+interface InsertTableMenuItemSpec extends BaseFancyMenuItemSpec<'inserttable'> {
+    fancytype: 'inserttable';
+    initData?: {};
+}
+interface ColorSwatchMenuItemSpec extends BaseFancyMenuItemSpec<'colorswatch'> {
+    fancytype: 'colorswatch';
+    initData?: {
+        allowCustomColors?: boolean;
+        colors: ChoiceMenuItemSpec[];
+    };
+}
+declare type FancyMenuItemSpec = InsertTableMenuItemSpec | ColorSwatchMenuItemSpec;
+interface MenuItemSpec extends CommonMenuItemSpec {
+    type?: 'menuitem';
+    icon?: string;
+    onSetup?: (api: MenuItemInstanceApi) => (api: MenuItemInstanceApi) => void;
+    onAction?: (api: MenuItemInstanceApi) => void;
+}
+interface MenuItemInstanceApi extends CommonMenuItemInstanceApi {
+}
+declare type NestedMenuItemContents = string | MenuItemSpec | NestedMenuItemSpec | ToggleMenuItemSpec | SeparatorMenuItemSpec | FancyMenuItemSpec;
+interface NestedMenuItemSpec extends CommonMenuItemSpec {
+    type?: 'nestedmenuitem';
+    icon?: string;
+    getSubmenuItems: () => string | Array<NestedMenuItemContents>;
+    onSetup?: (api: NestedMenuItemInstanceApi) => (api: NestedMenuItemInstanceApi) => void;
+}
+interface NestedMenuItemInstanceApi extends CommonMenuItemInstanceApi {
+}
+interface ToggleMenuItemSpec extends CommonMenuItemSpec {
+    type?: 'togglemenuitem';
+    icon?: string;
+    active?: boolean;
+    onSetup?: (api: ToggleMenuItemInstanceApi) => void;
+    onAction: (api: ToggleMenuItemInstanceApi) => void;
+}
+interface ToggleMenuItemInstanceApi extends CommonMenuItemInstanceApi {
+    isActive: () => boolean;
+    setActive: (state: boolean) => void;
+}
+type PublicDialog_d_AlertBannerSpec = AlertBannerSpec;
+type PublicDialog_d_BarSpec = BarSpec;
+type PublicDialog_d_BodyComponentSpec = BodyComponentSpec;
+type PublicDialog_d_ButtonSpec = ButtonSpec;
+type PublicDialog_d_CheckboxSpec = CheckboxSpec;
+type PublicDialog_d_CollectionSpec = CollectionSpec;
+type PublicDialog_d_ColorInputSpec = ColorInputSpec;
+type PublicDialog_d_ColorPickerSpec = ColorPickerSpec;
+type PublicDialog_d_CustomEditorSpec = CustomEditorSpec;
+type PublicDialog_d_CustomEditorInit = CustomEditorInit;
+type PublicDialog_d_CustomEditorInitFn = CustomEditorInitFn;
+type PublicDialog_d_DialogData = DialogData;
+type PublicDialog_d_DialogSize = DialogSize;
+type PublicDialog_d_DialogSpec<_0> = DialogSpec<_0>;
+type PublicDialog_d_DialogInstanceApi<_0> = DialogInstanceApi<_0>;
+type PublicDialog_d_DialogFooterButtonSpec = DialogFooterButtonSpec;
+type PublicDialog_d_DialogActionDetails = DialogActionDetails;
+type PublicDialog_d_DialogChangeDetails<_0> = DialogChangeDetails<_0>;
+type PublicDialog_d_DialogTabChangeDetails = DialogTabChangeDetails;
+type PublicDialog_d_DropZoneSpec = DropZoneSpec;
+type PublicDialog_d_GridSpec = GridSpec;
+type PublicDialog_d_HtmlPanelSpec = HtmlPanelSpec;
+type PublicDialog_d_IframeSpec = IframeSpec;
+type PublicDialog_d_ImageToolsSpec = ImageToolsSpec;
+type PublicDialog_d_InputSpec = InputSpec;
+type PublicDialog_d_LabelSpec = LabelSpec;
+type PublicDialog_d_ListBoxSpec = ListBoxSpec;
+type PublicDialog_d_ListBoxItemSpec = ListBoxItemSpec;
+type PublicDialog_d_ListBoxNestedItemSpec = ListBoxNestedItemSpec;
+type PublicDialog_d_ListBoxSingleItemSpec = ListBoxSingleItemSpec;
+type PublicDialog_d_PanelSpec = PanelSpec;
+type PublicDialog_d_SelectBoxSpec = SelectBoxSpec;
+type PublicDialog_d_SelectBoxItemSpec = SelectBoxItemSpec;
+type PublicDialog_d_SizeInputSpec = SizeInputSpec;
+type PublicDialog_d_TableSpec = TableSpec;
+type PublicDialog_d_TabSpec = TabSpec;
+type PublicDialog_d_TabPanelSpec = TabPanelSpec;
+type PublicDialog_d_TextAreaSpec = TextAreaSpec;
+type PublicDialog_d_UrlInputSpec = UrlInputSpec;
+type PublicDialog_d_UrlDialogSpec = UrlDialogSpec;
+type PublicDialog_d_UrlDialogFooterButtonSpec = UrlDialogFooterButtonSpec;
+type PublicDialog_d_UrlDialogInstanceApi = UrlDialogInstanceApi;
+type PublicDialog_d_UrlDialogActionDetails = UrlDialogActionDetails;
+type PublicDialog_d_UrlDialogMessage = UrlDialogMessage;
+declare namespace PublicDialog_d {
+    export { PublicDialog_d_AlertBannerSpec as AlertBannerSpec, PublicDialog_d_BarSpec as BarSpec, PublicDialog_d_BodyComponentSpec as BodyComponentSpec, PublicDialog_d_ButtonSpec as ButtonSpec, PublicDialog_d_CheckboxSpec as CheckboxSpec, PublicDialog_d_CollectionSpec as CollectionSpec, PublicDialog_d_ColorInputSpec as ColorInputSpec, PublicDialog_d_ColorPickerSpec as ColorPickerSpec, PublicDialog_d_CustomEditorSpec as CustomEditorSpec, PublicDialog_d_CustomEditorInit as CustomEditorInit, PublicDialog_d_CustomEditorInitFn as CustomEditorInitFn, PublicDialog_d_DialogData as DialogData, PublicDialog_d_DialogSize as DialogSize, PublicDialog_d_DialogSpec as DialogSpec, PublicDialog_d_DialogInstanceApi as DialogInstanceApi, PublicDialog_d_DialogFooterButtonSpec as DialogFooterButtonSpec, PublicDialog_d_DialogActionDetails as DialogActionDetails, PublicDialog_d_DialogChangeDetails as DialogChangeDetails, PublicDialog_d_DialogTabChangeDetails as DialogTabChangeDetails, PublicDialog_d_DropZoneSpec as DropZoneSpec, PublicDialog_d_GridSpec as GridSpec, PublicDialog_d_HtmlPanelSpec as HtmlPanelSpec, PublicDialog_d_IframeSpec as IframeSpec, PublicDialog_d_ImageToolsSpec as ImageToolsSpec, PublicDialog_d_InputSpec as InputSpec, PublicDialog_d_LabelSpec as LabelSpec, PublicDialog_d_ListBoxSpec as ListBoxSpec, PublicDialog_d_ListBoxItemSpec as ListBoxItemSpec, PublicDialog_d_ListBoxNestedItemSpec as ListBoxNestedItemSpec, PublicDialog_d_ListBoxSingleItemSpec as ListBoxSingleItemSpec, PublicDialog_d_PanelSpec as PanelSpec, PublicDialog_d_SelectBoxSpec as SelectBoxSpec, PublicDialog_d_SelectBoxItemSpec as SelectBoxItemSpec, PublicDialog_d_SizeInputSpec as SizeInputSpec, PublicDialog_d_TableSpec as TableSpec, PublicDialog_d_TabSpec as TabSpec, PublicDialog_d_TabPanelSpec as TabPanelSpec, PublicDialog_d_TextAreaSpec as TextAreaSpec, PublicDialog_d_UrlInputSpec as UrlInputSpec, PublicDialog_d_UrlDialogSpec as UrlDialogSpec, PublicDialog_d_UrlDialogFooterButtonSpec as UrlDialogFooterButtonSpec, PublicDialog_d_UrlDialogInstanceApi as UrlDialogInstanceApi, PublicDialog_d_UrlDialogActionDetails as UrlDialogActionDetails, PublicDialog_d_UrlDialogMessage as UrlDialogMessage, };
+}
+type PublicInlineContent_d_AutocompleterSpec = AutocompleterSpec;
+type PublicInlineContent_d_AutocompleterItemSpec = AutocompleterItemSpec;
+type PublicInlineContent_d_AutocompleterContents = AutocompleterContents;
+type PublicInlineContent_d_AutocompleterInstanceApi = AutocompleterInstanceApi;
+type PublicInlineContent_d_ContextPosition = ContextPosition;
+type PublicInlineContent_d_ContextScope = ContextScope;
+type PublicInlineContent_d_ContextFormSpec = ContextFormSpec;
+type PublicInlineContent_d_ContextFormInstanceApi = ContextFormInstanceApi;
+type PublicInlineContent_d_ContextFormButtonSpec = ContextFormButtonSpec;
+type PublicInlineContent_d_ContextFormButtonInstanceApi = ContextFormButtonInstanceApi;
+type PublicInlineContent_d_ContextFormToggleButtonSpec = ContextFormToggleButtonSpec;
+type PublicInlineContent_d_ContextFormToggleButtonInstanceApi = ContextFormToggleButtonInstanceApi;
+type PublicInlineContent_d_ContextToolbarSpec = ContextToolbarSpec;
+type PublicInlineContent_d_SeparatorItemSpec = SeparatorItemSpec;
+declare namespace PublicInlineContent_d {
+    export { PublicInlineContent_d_AutocompleterSpec as AutocompleterSpec, PublicInlineContent_d_AutocompleterItemSpec as AutocompleterItemSpec, PublicInlineContent_d_AutocompleterContents as AutocompleterContents, PublicInlineContent_d_AutocompleterInstanceApi as AutocompleterInstanceApi, PublicInlineContent_d_ContextPosition as ContextPosition, PublicInlineContent_d_ContextScope as ContextScope, PublicInlineContent_d_ContextFormSpec as ContextFormSpec, PublicInlineContent_d_ContextFormInstanceApi as ContextFormInstanceApi, PublicInlineContent_d_ContextFormButtonSpec as ContextFormButtonSpec, PublicInlineContent_d_ContextFormButtonInstanceApi as ContextFormButtonInstanceApi, PublicInlineContent_d_ContextFormToggleButtonSpec as ContextFormToggleButtonSpec, PublicInlineContent_d_ContextFormToggleButtonInstanceApi as ContextFormToggleButtonInstanceApi, PublicInlineContent_d_ContextToolbarSpec as ContextToolbarSpec, PublicInlineContent_d_SeparatorItemSpec as SeparatorItemSpec, };
+}
+type PublicMenu_d_MenuItemSpec = MenuItemSpec;
+type PublicMenu_d_MenuItemInstanceApi = MenuItemInstanceApi;
+type PublicMenu_d_NestedMenuItemContents = NestedMenuItemContents;
+type PublicMenu_d_NestedMenuItemSpec = NestedMenuItemSpec;
+type PublicMenu_d_NestedMenuItemInstanceApi = NestedMenuItemInstanceApi;
+type PublicMenu_d_FancyMenuItemSpec = FancyMenuItemSpec;
+type PublicMenu_d_ColorSwatchMenuItemSpec = ColorSwatchMenuItemSpec;
+type PublicMenu_d_InsertTableMenuItemSpec = InsertTableMenuItemSpec;
+type PublicMenu_d_ToggleMenuItemSpec = ToggleMenuItemSpec;
+type PublicMenu_d_ToggleMenuItemInstanceApi = ToggleMenuItemInstanceApi;
+type PublicMenu_d_ChoiceMenuItemSpec = ChoiceMenuItemSpec;
+type PublicMenu_d_ChoiceMenuItemInstanceApi = ChoiceMenuItemInstanceApi;
+type PublicMenu_d_SeparatorMenuItemSpec = SeparatorMenuItemSpec;
+type PublicMenu_d_ContextMenuApi = ContextMenuApi;
+type PublicMenu_d_ContextMenuContents = ContextMenuContents;
+type PublicMenu_d_ContextMenuItem = ContextMenuItem;
+type PublicMenu_d_ContextSubMenu = ContextSubMenu;
+type PublicMenu_d_CardMenuItemSpec = CardMenuItemSpec;
+type PublicMenu_d_CardMenuItemInstanceApi = CardMenuItemInstanceApi;
+type PublicMenu_d_CardItemSpec = CardItemSpec;
+type PublicMenu_d_CardContainerSpec = CardContainerSpec;
+type PublicMenu_d_CardImageSpec = CardImageSpec;
+type PublicMenu_d_CardTextSpec = CardTextSpec;
+declare namespace PublicMenu_d {
+    export { PublicMenu_d_MenuItemSpec as MenuItemSpec, PublicMenu_d_MenuItemInstanceApi as MenuItemInstanceApi, PublicMenu_d_NestedMenuItemContents as NestedMenuItemContents, PublicMenu_d_NestedMenuItemSpec as NestedMenuItemSpec, PublicMenu_d_NestedMenuItemInstanceApi as NestedMenuItemInstanceApi, PublicMenu_d_FancyMenuItemSpec as FancyMenuItemSpec, PublicMenu_d_ColorSwatchMenuItemSpec as ColorSwatchMenuItemSpec, PublicMenu_d_InsertTableMenuItemSpec as InsertTableMenuItemSpec, PublicMenu_d_ToggleMenuItemSpec as ToggleMenuItemSpec, PublicMenu_d_ToggleMenuItemInstanceApi as ToggleMenuItemInstanceApi, PublicMenu_d_ChoiceMenuItemSpec as ChoiceMenuItemSpec, PublicMenu_d_ChoiceMenuItemInstanceApi as ChoiceMenuItemInstanceApi, PublicMenu_d_SeparatorMenuItemSpec as SeparatorMenuItemSpec, PublicMenu_d_ContextMenuApi as ContextMenuApi, PublicMenu_d_ContextMenuContents as ContextMenuContents, PublicMenu_d_ContextMenuItem as ContextMenuItem, PublicMenu_d_ContextSubMenu as ContextSubMenu, PublicMenu_d_CardMenuItemSpec as CardMenuItemSpec, PublicMenu_d_CardMenuItemInstanceApi as CardMenuItemInstanceApi, PublicMenu_d_CardItemSpec as CardItemSpec, PublicMenu_d_CardContainerSpec as CardContainerSpec, PublicMenu_d_CardImageSpec as CardImageSpec, PublicMenu_d_CardTextSpec as CardTextSpec, };
+}
+interface SidebarInstanceApi {
+    element: () => HTMLElement;
+}
+interface SidebarSpec {
+    icon?: string;
+    tooltip?: string;
+    onShow?: (api: SidebarInstanceApi) => void;
+    onSetup?: (api: SidebarInstanceApi) => (api: SidebarInstanceApi) => void;
+    onHide?: (api: SidebarInstanceApi) => void;
+}
+type PublicSidebar_d_SidebarSpec = SidebarSpec;
+type PublicSidebar_d_SidebarInstanceApi = SidebarInstanceApi;
+declare namespace PublicSidebar_d {
+    export { PublicSidebar_d_SidebarSpec as SidebarSpec, PublicSidebar_d_SidebarInstanceApi as SidebarInstanceApi, };
+}
+interface ToolbarGroupSetting {
+    name: string;
+    items: string[];
+}
+declare type ToolbarConfig = string | ToolbarGroupSetting[];
+interface GroupToolbarButtonInstanceApi extends BaseToolbarButtonInstanceApi {
+}
+interface GroupToolbarButtonSpec extends BaseToolbarButtonSpec<GroupToolbarButtonInstanceApi> {
+    type?: 'grouptoolbarbutton';
+    items?: ToolbarConfig;
+}
+declare type MenuButtonItemTypes = NestedMenuItemContents;
+declare type SuccessCallback$1 = (menu: string | MenuButtonItemTypes[]) => void;
+interface BaseMenuButtonSpec {
+    text?: string;
+    tooltip?: string;
+    icon?: string;
+    fetch: (success: SuccessCallback$1) => void;
+    onSetup?: (api: BaseMenuButtonInstanceApi) => (api: BaseMenuButtonInstanceApi) => void;
+}
+interface BaseMenuButtonInstanceApi {
+    isDisabled: () => boolean;
+    setDisabled: (state: boolean) => void;
+    isActive: () => boolean;
+    setActive: (state: boolean) => void;
+}
+interface ToolbarMenuButtonSpec extends BaseMenuButtonSpec {
+    type?: 'menubutton';
+    onSetup?: (api: ToolbarMenuButtonInstanceApi) => (api: ToolbarMenuButtonInstanceApi) => void;
+}
+interface ToolbarMenuButtonInstanceApi extends BaseMenuButtonInstanceApi {
+}
+declare type ToolbarSplitButtonItemTypes = ChoiceMenuItemSpec | SeparatorMenuItemSpec;
+declare type SuccessCallback = (menu: ToolbarSplitButtonItemTypes[]) => void;
+declare type SelectPredicate = (value: string) => boolean;
+declare type PresetTypes = 'color' | 'normal' | 'listpreview';
+declare type ColumnTypes = number | 'auto';
+interface ToolbarSplitButtonSpec {
+    type?: 'splitbutton';
+    tooltip?: string;
+    icon?: string;
+    text?: string;
+    select?: SelectPredicate;
+    presets?: PresetTypes;
+    columns?: ColumnTypes;
+    fetch: (success: SuccessCallback) => void;
+    onSetup?: (api: ToolbarSplitButtonInstanceApi) => (api: ToolbarSplitButtonInstanceApi) => void;
+    onAction: (api: ToolbarSplitButtonInstanceApi) => void;
+    onItemAction: (api: ToolbarSplitButtonInstanceApi, value: string) => void;
+}
+interface ToolbarSplitButtonInstanceApi {
+    isDisabled: () => boolean;
+    setDisabled: (state: boolean) => void;
+    setIconFill: (id: string, value: string) => void;
+    setIconStroke: (id: string, value: string) => void;
+    isActive: () => boolean;
+    setActive: (state: boolean) => void;
+}
+type PublicToolbar_d_ToolbarButtonSpec = ToolbarButtonSpec;
+type PublicToolbar_d_ToolbarButtonInstanceApi = ToolbarButtonInstanceApi;
+type PublicToolbar_d_ToolbarSplitButtonSpec = ToolbarSplitButtonSpec;
+type PublicToolbar_d_ToolbarSplitButtonInstanceApi = ToolbarSplitButtonInstanceApi;
+type PublicToolbar_d_ToolbarMenuButtonSpec = ToolbarMenuButtonSpec;
+type PublicToolbar_d_ToolbarMenuButtonInstanceApi = ToolbarMenuButtonInstanceApi;
+type PublicToolbar_d_ToolbarToggleButtonSpec = ToolbarToggleButtonSpec;
+type PublicToolbar_d_ToolbarToggleButtonInstanceApi = ToolbarToggleButtonInstanceApi;
+type PublicToolbar_d_GroupToolbarButtonSpec = GroupToolbarButtonSpec;
+type PublicToolbar_d_GroupToolbarButtonInstanceApi = GroupToolbarButtonInstanceApi;
+declare namespace PublicToolbar_d {
+    export { PublicToolbar_d_ToolbarButtonSpec as ToolbarButtonSpec, PublicToolbar_d_ToolbarButtonInstanceApi as ToolbarButtonInstanceApi, PublicToolbar_d_ToolbarSplitButtonSpec as ToolbarSplitButtonSpec, PublicToolbar_d_ToolbarSplitButtonInstanceApi as ToolbarSplitButtonInstanceApi, PublicToolbar_d_ToolbarMenuButtonSpec as ToolbarMenuButtonSpec, PublicToolbar_d_ToolbarMenuButtonInstanceApi as ToolbarMenuButtonInstanceApi, PublicToolbar_d_ToolbarToggleButtonSpec as ToolbarToggleButtonSpec, PublicToolbar_d_ToolbarToggleButtonInstanceApi as ToolbarToggleButtonInstanceApi, PublicToolbar_d_GroupToolbarButtonSpec as GroupToolbarButtonSpec, PublicToolbar_d_GroupToolbarButtonInstanceApi as GroupToolbarButtonInstanceApi, };
+}
+interface Registry$1 {
+    addButton: (name: string, spec: ToolbarButtonSpec) => void;
+    addGroupToolbarButton: (name: string, spec: GroupToolbarButtonSpec) => void;
+    addToggleButton: (name: string, spec: ToolbarToggleButtonSpec) => void;
+    addMenuButton: (name: string, spec: ToolbarMenuButtonSpec) => void;
+    addSplitButton: (name: string, spec: ToolbarSplitButtonSpec) => void;
+    addMenuItem: (name: string, spec: MenuItemSpec) => void;
+    addNestedMenuItem: (name: string, spec: NestedMenuItemSpec) => void;
+    addToggleMenuItem: (name: string, spec: ToggleMenuItemSpec) => void;
+    addContextMenu: (name: string, spec: ContextMenuApi) => void;
+    addContextToolbar: (name: string, spec: ContextToolbarSpec) => void;
+    addContextForm: (name: string, spec: ContextFormSpec) => void;
+    addIcon: (name: string, svgData: string) => void;
+    addAutocompleter: (name: string, spec: AutocompleterSpec) => void;
+    addSidebar: (name: string, spec: SidebarSpec) => void;
+    getAll: () => {
+        buttons: Record<string, ToolbarButtonSpec | GroupToolbarButtonSpec | ToolbarMenuButtonSpec | ToolbarSplitButtonSpec | ToolbarToggleButtonSpec>;
+        menuItems: Record<string, MenuItemSpec | NestedMenuItemSpec | ToggleMenuItemSpec>;
+        popups: Record<string, AutocompleterSpec>;
+        contextMenus: Record<string, ContextMenuApi>;
+        contextToolbars: Record<string, ContextToolbarSpec | ContextFormSpec>;
+        icons: Record<string, string>;
+        sidebars: Record<string, SidebarSpec>;
+    };
+}
+interface StyleSheetLoaderSettings {
+    maxLoadTime?: number;
+    contentCssCors?: boolean;
+    referrerPolicy?: ReferrerPolicy;
+}
+interface StyleSheetLoader {
+    load: (url: string, success: () => void, failure?: () => void) => void;
+    loadAll: (urls: string[], success: (urls: string[]) => void, failure: (urls: string[]) => void) => void;
+    unload: (url: string) => void;
+    unloadAll: (urls: string[]) => void;
+    _setReferrerPolicy: (referrerPolicy: ReferrerPolicy) => void;
+}
+declare type Registry = Registry$1;
+interface EditorUiApi {
+    show: () => void;
+    hide: () => void;
+    enable: () => void;
+    disable: () => void;
+    isDisabled: () => boolean;
+}
+interface EditorUi extends EditorUiApi {
+    registry: Registry;
+    styleSheetLoader: StyleSheetLoader;
+}
+type Ui_d_Registry = Registry;
+type Ui_d_EditorUiApi = EditorUiApi;
+type Ui_d_EditorUi = EditorUi;
+declare namespace Ui_d {
+    export { Ui_d_Registry as Registry, PublicDialog_d as Dialog, PublicInlineContent_d as InlineContent, PublicMenu_d as Menu, PublicSidebar_d as Sidebar, PublicToolbar_d as Toolbar, Ui_d_EditorUiApi as EditorUiApi, Ui_d_EditorUi as EditorUi, };
+}
+declare type EntityEncoding = 'named' | 'numeric' | 'raw' | 'named,numeric' | 'named+numeric' | 'numeric,named' | 'numeric+named';
+interface ContentLanguage {
+    readonly title: string;
+    readonly code: string;
+    readonly customCode?: string;
+}
+declare type ThemeInitFunc = (editor: Editor, elm: HTMLElement) => {
+    editorContainer: HTMLElement;
+    iframeContainer: HTMLElement;
+    height?: number;
+    iframeHeight?: number;
+    api?: EditorUiApi;
+};
+declare type SetupCallback = (editor: Editor) => void;
+declare type FilePickerCallback = (callback: Function, value: any, meta: Record<string, any>) => void;
+declare type FilePickerValidationStatus = 'valid' | 'unknown' | 'invalid' | 'none';
+declare type FilePickerValidationCallback = (info: {
+    type: string;
+    url: string;
+}, callback: (validation: {
+    status: FilePickerValidationStatus;
+    message: string;
+}) => void) => void;
+declare type URLConverter = (url: string, name: string, elm?: HTMLElement) => string;
+declare type URLConverterCallback = (url: string, node: Node, on_save: boolean, name: string) => void;
+interface ToolbarGroup {
+    name?: string;
+    items: string[];
+}
+declare type ToolbarMode = 'floating' | 'sliding' | 'scrolling' | 'wrap';
+interface BaseEditorSettings {
+    add_form_submit_trigger?: boolean;
+    add_unload_trigger?: boolean;
+    allow_conditional_comments?: boolean;
+    allow_html_data_urls?: boolean;
+    allow_html_in_named_anchor?: boolean;
+    allow_script_urls?: boolean;
+    allow_svg_data_urls?: boolean;
+    allow_unsafe_link_target?: boolean;
+    anchor_bottom?: false | string;
+    anchor_top?: false | string;
+    auto_focus?: string | true;
+    automatic_uploads?: boolean;
+    base_url?: string;
+    block_formats?: string;
+    block_unsupported_drop?: boolean;
+    body_id?: string;
+    body_class?: string;
+    br_in_pre?: boolean;
+    br_newline_selector?: string;
+    browser_spellcheck?: boolean;
+    branding?: boolean;
+    cache_suffix?: string;
+    color_cols?: number;
+    color_map?: string[];
+    content_css?: boolean | string | string[];
+    content_css_cors?: boolean;
+    content_security_policy?: string;
+    content_style?: string;
+    deprecation_warnings?: boolean;
+    font_css?: string | string[];
+    content_langs?: ContentLanguage[];
+    contextmenu?: string | false;
+    contextmenu_never_use_native?: boolean;
+    convert_fonts_to_spans?: boolean;
+    convert_urls?: boolean;
+    custom_colors?: boolean;
+    custom_elements?: string;
+    custom_ui_selector?: string;
+    custom_undo_redo_levels?: number;
+    directionality?: 'ltr' | 'rtl';
+    doctype?: string;
+    document_base_url?: string;
+    element_format?: 'xhtml' | 'html';
+    elementpath?: boolean;
+    encoding?: string;
+    end_container_on_empty_block?: boolean;
+    entities?: string;
+    entity_encoding?: EntityEncoding;
+    extended_valid_elements?: string;
+    event_root?: string;
+    file_picker_callback?: FilePickerCallback;
+    file_picker_types?: string;
+    file_picker_validator_handler?: FilePickerValidationCallback;
+    fix_list_elements?: boolean;
+    fixed_toolbar_container?: string;
+    fixed_toolbar_container_target?: HTMLElement;
+    font_formats?: string;
+    font_size_classes?: string;
+    font_size_legacy_values?: string;
+    font_size_style_values?: string;
+    fontsize_formats?: string;
+    force_hex_style_colors?: boolean;
+    forced_root_block?: boolean | string;
+    forced_root_block_attrs?: Record<string, string>;
+    formats?: Formats;
+    gecko_spellcheck?: boolean;
+    height?: number | string;
+    hidden_input?: boolean;
+    icons?: string;
+    icons_url?: string;
+    id?: string;
+    iframe_aria_text?: string;
+    images_dataimg_filter?: (imgElm: HTMLImageElement) => boolean;
+    images_file_types?: string;
+    images_replace_blob_uris?: boolean;
+    images_reuse_filename?: boolean;
+    images_upload_base_path?: string;
+    images_upload_credentials?: boolean;
+    images_upload_handler?: UploadHandler;
+    images_upload_url?: string;
+    indent?: boolean;
+    indent_after?: string;
+    indent_before?: string;
+    indent_use_margin?: boolean;
+    indentation?: string;
+    init_instance_callback?: SetupCallback;
+    inline?: boolean;
+    inline_boundaries?: boolean;
+    inline_boundaries_selector?: string;
+    inline_styles?: boolean;
+    invalid_elements?: string;
+    invalid_styles?: string | Record<string, string>;
+    keep_styles?: boolean;
+    language?: string;
+    language_load?: boolean;
+    language_url?: string;
+    lineheight_formats?: string;
+    max_height?: number;
+    max_width?: number;
+    menu?: Record<string, {
+        title: string;
+        items: string;
+    }>;
+    menubar?: boolean | string;
+    min_height?: number;
+    min_width?: number;
+    no_newline_selector?: string;
+    nowrap?: boolean;
+    object_resizing?: boolean | string;
+    padd_empty_with_br?: boolean;
+    placeholder?: string;
+    preserve_cdata?: boolean;
+    preview_styles?: boolean | string;
+    protect?: RegExp[];
+    readonly?: boolean;
+    referrer_policy?: ReferrerPolicy;
+    relative_urls?: boolean;
+    remove_script_host?: boolean;
+    remove_trailing_brs?: boolean;
+    removed_menuitems?: string;
+    resize?: boolean | 'both';
+    resize_img_proportional?: boolean;
+    root_name?: string;
+    schema?: SchemaType;
+    selector?: string;
+    setup?: SetupCallback;
+    skin?: boolean | string;
+    skin_url?: string;
+    statusbar?: boolean;
+    style_formats?: AllowedFormat[];
+    style_formats_autohide?: boolean;
+    style_formats_merge?: boolean;
+    submit_patch?: boolean;
+    suffix?: string;
+    target?: HTMLElement;
+    theme?: string | ThemeInitFunc;
+    theme_url?: string;
+    toolbar?: boolean | string | string[] | Array<ToolbarGroup>;
+    toolbar1?: string;
+    toolbar2?: string;
+    toolbar3?: string;
+    toolbar4?: string;
+    toolbar5?: string;
+    toolbar6?: string;
+    toolbar7?: string;
+    toolbar8?: string;
+    toolbar9?: string;
+    toolbar_mode?: ToolbarMode;
+    typeahead_urls?: boolean;
+    url_converter?: URLConverter;
+    url_converter_scope?: any;
+    urlconverter_callback?: string | URLConverterCallback;
+    valid_children?: string;
+    valid_classes?: string | Record<string, string>;
+    valid_elements?: string;
+    valid_styles?: string | Record<string, string>;
+    verify_html?: boolean;
+    visual?: boolean;
+    visual_anchor_class?: string;
+    visual_table_class?: string;
+    width?: number | string;
+    toolbar_drawer?: false | 'floating' | 'sliding' | 'scrolling';
+    editor_deselector?: string;
+    editor_selector?: string;
+    elements?: string;
+    filepicker_validator_handler?: FilePickerValidationCallback;
+    mode?: 'exact' | 'textareas' | 'specific_textareas';
+    types?: Record<string, any>[];
+    block_elements?: string;
+    boolean_attributes?: string;
+    move_caret_before_on_enter_elements?: string;
+    non_empty_elements?: string;
+    self_closing_elements?: string;
+    short_ended_elements?: string;
+    text_block_elements?: string;
+    text_inline_elements?: string;
+    whitespace_elements?: string;
+    special?: string;
+    disable_nodechange?: boolean;
+    forced_plugins?: string | string[];
+    plugin_base_urls?: Record<string, string>;
+    service_message?: string;
+    validate?: boolean;
+    [key: string]: any;
+}
+interface RawEditorSettings extends BaseEditorSettings {
+    external_plugins?: Record<string, string>;
+    mobile?: RawEditorSettings;
+    plugins?: string | string[];
+}
+interface EditorSettings extends BaseEditorSettings {
+    external_plugins: Record<string, string>;
+    plugins: string;
+}
+interface ParamTypeMap {
+    'hash': Record<string, string>;
+    'string': string;
+    'number': number;
+    'boolean': boolean;
+    'string[]': string[];
+    'array': any[];
+}
+interface BlobInfoImagePair {
+    image: HTMLImageElement;
+    blobInfo: BlobInfo;
+}
+declare class NodeChange {
+    private readonly editor;
+    private lastPath;
+    constructor(editor: Editor);
+    nodeChanged(args?: any): void;
+    private isSameElementPath;
+}
+interface SelectionOverrides {
+    showCaret: (direction: number, node: Element, before: boolean, scrollIntoView?: boolean) => Range | null;
+    showBlockCaretContainer: (blockCaretContainer: Element) => void;
+    hideFakeCaret: () => void;
+    destroy: () => void;
+}
+interface Quirks {
+    refreshContentEditable(): void;
+    isHidden(): boolean;
+}
+declare type DecoratorData = Record<string, any>;
+declare type Decorator = (uid: string, data: DecoratorData) => {
+    attributes?: {};
+    classes?: string[];
+};
+declare type AnnotationListener = (state: boolean, name: string, data?: {
+    uid: string;
+    nodes: any[];
+}) => void;
+declare type AnnotationListenerApi = AnnotationListener;
+interface AnnotatorSettings {
+    decorate: Decorator;
+    persistent?: boolean;
+}
+interface Annotator {
+    register: (name: string, settings: AnnotatorSettings) => void;
+    annotate: (name: string, data: DecoratorData) => void;
+    annotationChanged: (name: string, f: AnnotationListenerApi) => void;
+    remove: (name: string) => void;
+    getAll: (name: string) => Record<string, Element[]>;
+}
+interface GeomRect {
+    readonly x: number;
+    readonly y: number;
+    readonly w: number;
+    readonly h: number;
+}
+interface Rect {
+    inflate: (rect: GeomRect, w: number, h: number) => GeomRect;
+    relativePosition: (rect: GeomRect, targetRect: GeomRect, rel: string) => GeomRect;
+    findBestRelativePosition: (rect: GeomRect, targetRect: GeomRect, constrainRect: GeomRect, rels: string[]) => string | null;
+    intersect: (rect: GeomRect, cropRect: GeomRect) => GeomRect | null;
+    clamp: (rect: GeomRect, clampRect: GeomRect, fixedSize?: boolean) => GeomRect;
+    create: (x: number, y: number, w: number, h: number) => GeomRect;
+    fromClientRect: (clientRect: DOMRect) => GeomRect;
+}
+interface StyleMap {
+    [s: string]: string | number;
+}
+interface StylesSettings {
+    allow_script_urls?: boolean;
+    allow_svg_data_urls?: boolean;
+    url_converter?: URLConverter;
+    url_converter_scope?: any;
+}
+interface Styles {
+    toHex: (color: string) => string;
+    parse: (css: string) => Record<string, string>;
+    serialize: (styles: StyleMap, elementName?: string) => string;
+}
+interface DOMUtilsSettings {
+    schema: Schema;
+    url_converter: URLConverter;
+    url_converter_scope: any;
+    ownEvents: boolean;
+    keep_values: boolean;
+    hex_colors: boolean;
+    update_styles: boolean;
+    root_element: HTMLElement;
+    collect: Function;
+    onSetAttrib: Function;
+    contentCssCors: boolean;
+    referrerPolicy: ReferrerPolicy;
+}
+declare type Target = Node | Window;
+declare type RunArguments<T extends Node = Node> = string | T | Array<string | T>;
+declare type BoundEvent = [
+    Target,
+    string,
+    EventUtilsCallback<any>,
+    any
+];
+declare type Callback<K extends string> = EventUtilsCallback<MappedEvent<HTMLElementEventMap, K>>;
+interface DOMUtils {
+    doc: Document;
+    settings: Partial<DOMUtilsSettings>;
+    win: Window;
+    files: Record<string, boolean>;
+    stdMode: boolean;
+    boxModel: boolean;
+    styleSheetLoader: StyleSheetLoader;
+    boundEvents: BoundEvent[];
+    styles: Styles;
+    schema: Schema;
+    events: EventUtils;
+    root: Node;
+    $: DomQueryConstructor;
+    $$: {
+        <T extends Node>(elm: T | T[] | DomQuery<T>): DomQuery<T>;
+        (elm: string): DomQuery<Node>;
+    };
+    isBlock: (node: string | Node) => boolean;
+    clone: (node: Node, deep: boolean) => Node;
+    getRoot: () => HTMLElement;
+    getViewPort: (argWin?: Window) => GeomRect;
+    getRect: (elm: string | HTMLElement) => GeomRect;
+    getSize: (elm: string | HTMLElement) => {
+        w: number;
+        h: number;
+    };
+    getParent: {
+        <K extends keyof HTMLElementTagNameMap>(node: string | Node, selector: K, root?: Node): HTMLElementTagNameMap[K] | null;
+        <T extends HTMLElement>(node: string | Node, selector: (node: HTMLElement) => node is T, root?: Node): T | null;
+        <T extends Element = Element>(node: string | Node, selector?: string | ((node: HTMLElement) => boolean | void), root?: Node): T | null;
+    };
+    getParents: {
+        <K extends keyof HTMLElementTagNameMap>(elm: string | Node, selector: K, root?: Node, collect?: boolean): Array<HTMLElementTagNameMap[K]>;
+        <T extends HTMLElement>(node: string | Node, selector: (node: HTMLElement) => node is T, root?: Node): T[];
+        <T extends Element = Element>(elm: string | Node, selector?: string | ((node: HTMLElement) => boolean | void), root?: Node, collect?: boolean): T[];
+    };
+    get: (elm: string | Node) => HTMLElement | null;
+    getNext: (node: Node, selector: string | ((node: Node) => boolean)) => Node | null;
+    getPrev: (node: Node, selector: string | ((node: Node) => boolean)) => Node | null;
+    select: {
+        <K extends keyof HTMLElementTagNameMap>(selector: K, scope?: string | Node): Array<HTMLElementTagNameMap[K]>;
+        <T extends HTMLElement = HTMLElement>(selector: string, scope?: string | Node): T[];
+    };
+    is: (elm: Node | Node[], selector: string) => boolean;
+    add: (parentElm: RunArguments, name: string | Node, attrs?: Record<string, string | boolean | number>, html?: string | Node, create?: boolean) => HTMLElement;
+    create: {
+        <K extends keyof HTMLElementTagNameMap>(name: K, attrs?: Record<string, string | boolean | number>, html?: string | Node): HTMLElementTagNameMap[K];
+        (name: string, attrs?: Record<string, string | boolean | number>, html?: string | Node): HTMLElement;
+    };
+    createHTML: (name: string, attrs?: Record<string, string>, html?: string) => string;
+    createFragment: (html?: string) => DocumentFragment;
+    remove: <T extends Node>(node: string | T | T[] | DomQuery<T>, keepChildren?: boolean) => T | T[];
+    setStyle: {
+        (elm: string | Node | Node[], name: string, value: string | number | null): void;
+        (elm: string | Node | Node[], styles: StyleMap): void;
+    };
+    getStyle: (elm: string | Node, name: string, computed?: boolean) => string;
+    setStyles: (elm: string | Node | Node[], stylesArg: StyleMap) => void;
+    removeAllAttribs: (e: RunArguments<Element>) => void;
+    setAttrib: (elm: string | Node | Node[], name: string, value: string | boolean | number | null) => void;
+    setAttribs: (elm: string | Node | Node[], attrs: Record<string, string | boolean | number | null>) => void;
+    getAttrib: (elm: string | Node, name: string, defaultVal?: string) => string;
+    getPos: (elm: string | Node, rootElm?: Node) => {
+        x: number;
+        y: number;
+    };
+    parseStyle: (cssText: string) => Record<string, string>;
+    serializeStyle: (stylesArg: StyleMap, name?: string) => string;
+    addStyle: (cssText: string) => void;
+    loadCSS: (url: string) => void;
+    addClass: (elm: string | Node | Node[], cls: string) => void;
+    removeClass: (elm: string | Node | Node[], cls: string) => void;
+    hasClass: (elm: string | Node, cls: string) => boolean;
+    toggleClass: (elm: string | Node | Node[], cls: string, state?: boolean) => void;
+    show: (elm: string | Node | Node[]) => void;
+    hide: (elm: string | Node | Node[]) => void;
+    isHidden: (elm: string | Node) => boolean;
+    uniqueId: (prefix?: string) => string;
+    setHTML: (elm: string | Node | Node[], html: string) => void;
+    getOuterHTML: (elm: string | Node) => string;
+    setOuterHTML: (elm: string | Node | Node[], html: string) => void;
+    decode: (text: string) => string;
+    encode: (text: string) => string;
+    insertAfter: {
+        <T extends Node>(node: T | T[], reference: string | Node): T;
+        <T extends Node>(node: RunArguments<T>, reference: string | Node): false | T;
+    };
+    replace: {
+        <T extends Node>(newElm: Node, oldElm: T | T[], keepChildren?: boolean): T;
+        <T extends Node>(newElm: Node, oldElm: RunArguments<T>, keepChildren?: boolean): false | T;
+    };
+    rename: {
+        <K extends keyof HTMLElementTagNameMap>(elm: Element, name: K): HTMLElementTagNameMap[K];
+        (elm: Element, name: string): Element;
+    };
+    findCommonAncestor: (a: Node, b: Node) => Node;
+    toHex: (rgbVal: string) => string;
+    run<R, T extends Node>(this: DOMUtils, elm: T | T[], func: (node: T) => R, scope?: any): R;
+    run<R, T extends Node>(this: DOMUtils, elm: RunArguments<T>, func: (node: T) => R, scope?: any): false | R;
+    getAttribs: (elm: string | Node) => NamedNodeMap | Attr[];
+    isEmpty: (node: Node, elements?: Record<string, any>) => boolean;
+    createRng: () => Range;
+    nodeIndex: (node: Node, normalized?: boolean) => number;
+    split: {
+        <T extends Node>(parentElm: Node, splitElm: Node, replacementElm: T): T;
+        <T extends Node>(parentElm: Node, splitElm: T): T;
+    };
+    bind: {
+        <K extends string>(target: Target, name: K, func: Callback<K>, scope?: any): Callback<K>;
+        <K extends string>(target: Target[], name: K, func: Callback<K>, scope?: any): Callback<K>[];
+    };
+    unbind: {
+        <K extends string>(target: Target, name?: K, func?: EventUtilsCallback<MappedEvent<HTMLElementEventMap, K>>): EventUtils;
+        <K extends string>(target: Target[], name?: K, func?: EventUtilsCallback<MappedEvent<HTMLElementEventMap, K>>): EventUtils[];
+    };
+    fire: (target: Node | Window, name: string, evt?: {}) => EventUtils;
+    getContentEditable: (node: Node) => string | null;
+    getContentEditableParent: (node: Node) => string | null;
+    destroy: () => void;
+    isChildOf: (node: Node, parent: Node) => boolean;
+    dumpRng: (r: Range) => string;
+}
+interface ClientRect {
+    left: number;
+    top: number;
+    bottom: number;
+    right: number;
+    width: number;
+    height: number;
+}
+interface GetSelectionContentArgs extends GetContentArgs {
+    selection?: boolean;
+    contextual?: boolean;
+}
+interface SelectionSetContentArgs extends SetContentArgs {
+    selection?: boolean;
+}
+interface BookmarkManager {
+    getBookmark: (type: number, normalized?: boolean) => Bookmark;
+    moveToBookmark: (bookmark: Bookmark) => void;
+}
+interface ControlSelection {
+    isResizable: (elm: Element) => boolean;
+    showResizeRect: (elm: Element) => void;
+    hideResizeRect: () => void;
+    updateResizeRect: (evt: EditorEvent<any>) => void;
+    destroy: () => void;
+}
+interface ParserArgs {
+    getInner?: boolean | number;
+    forced_root_block?: boolean | string;
+    context?: string;
+    isRootContent?: boolean;
+    format?: string;
+    invalid?: boolean;
+    no_events?: boolean;
+    [key: string]: any;
+}
+declare type ParserFilterCallback = (nodes: AstNode[], name: string, args: ParserArgs) => void;
+interface ParserFilter {
+    name: string;
+    callbacks: ParserFilterCallback[];
+}
+interface DomParserSettings {
+    allow_html_data_urls?: boolean;
+    allow_svg_data_urls?: boolean;
+    allow_conditional_comments?: boolean;
+    allow_html_in_named_anchor?: boolean;
+    allow_script_urls?: boolean;
+    allow_unsafe_link_target?: boolean;
+    convert_fonts_to_spans?: boolean;
+    fix_list_elements?: boolean;
+    font_size_legacy_values?: string;
+    forced_root_block?: boolean | string;
+    forced_root_block_attrs?: Record<string, string>;
+    padd_empty_with_br?: boolean;
+    preserve_cdata?: boolean;
+    remove_trailing_brs?: boolean;
+    root_name?: string;
+    validate?: boolean;
+    inline_styles?: boolean;
+    blob_cache?: BlobCache;
+    document?: Document;
+    images_dataimg_filter?: (img: HTMLImageElement) => boolean;
+}
+interface DomParser {
+    schema: Schema;
+    addAttributeFilter: (name: string, callback: (nodes: AstNode[], name: string, args: ParserArgs) => void) => void;
+    getAttributeFilters: () => ParserFilter[];
+    addNodeFilter: (name: string, callback: (nodes: AstNode[], name: string, args: ParserArgs) => void) => void;
+    getNodeFilters: () => ParserFilter[];
+    filterNode: (node: AstNode) => AstNode;
+    parse: (html: string, args?: ParserArgs) => AstNode;
+}
+interface WriterSettings {
+    element_format?: 'xhtml' | 'html';
+    entities?: string;
+    entity_encoding?: EntityEncoding;
+    indent?: boolean;
+    indent_after?: string;
+    indent_before?: string;
+}
+declare type Attributes = Array<{
+    name: string;
+    value: string;
+}>;
+interface Writer {
+    cdata: (text: string) => void;
+    comment: (text: string) => void;
+    doctype: (text: string) => void;
+    end: (name: string) => void;
+    getContent: () => string;
+    pi: (name: string, text?: string) => void;
+    reset: () => void;
+    start: (name: string, attrs?: Attributes, empty?: boolean) => void;
+    text: (text: string, raw?: boolean) => void;
+}
+interface HtmlSerializerSettings extends WriterSettings {
+    inner?: boolean;
+    validate?: boolean;
+}
+interface HtmlSerializer {
+    serialize: (node: AstNode) => string;
+}
+interface DomSerializerSettings extends DomParserSettings, WriterSettings, SchemaSettings, HtmlSerializerSettings {
+    url_converter?: URLConverter;
+    url_converter_scope?: {};
+}
+interface DomSerializerImpl {
+    schema: Schema;
+    addNodeFilter: (name: string, callback: (nodes: AstNode[], name: string, args: ParserArgs) => void) => void;
+    addAttributeFilter: (name: string, callback: (nodes: AstNode[], name: string, args: ParserArgs) => void) => void;
+    getNodeFilters: () => ParserFilter[];
+    getAttributeFilters: () => ParserFilter[];
+    serialize: {
+        (node: Element, parserArgs: {
+            format: 'tree';
+        } & ParserArgs): AstNode;
+        (node: Element, parserArgs?: ParserArgs): string;
+    };
+    addRules: (rules: string) => void;
+    setRules: (rules: string) => void;
+    addTempAttr: (name: string) => void;
+    getTempAttrs: () => string[];
+}
+interface DomSerializer extends DomSerializerImpl {
+}
+interface EditorSelection {
+    bookmarkManager: BookmarkManager;
+    controlSelection: ControlSelection;
+    dom: DOMUtils;
+    win: Window;
+    serializer: DomSerializer;
+    editor: Editor;
+    collapse: (toStart?: boolean) => void;
+    setCursorLocation: {
+        (node: Node, offset: number): void;
+        (): void;
+    };
+    getContent: {
+        (args: {
+            format: 'tree';
+        } & GetSelectionContentArgs): AstNode;
+        (args?: GetSelectionContentArgs): string;
+    };
+    setContent: (content: string, args?: SelectionSetContentArgs) => void;
+    getBookmark: (type?: number, normalized?: boolean) => Bookmark;
+    moveToBookmark: (bookmark: Bookmark) => void;
+    select: (node: Node, content?: boolean) => Node;
+    isCollapsed: () => boolean;
+    isForward: () => boolean;
+    setNode: (elm: Element) => Element;
+    getNode: () => Element;
+    getSel: () => Selection | null;
+    setRng: (rng: Range, forward?: boolean) => void;
+    getRng: () => Range;
+    getStart: (real?: boolean) => Element;
+    getEnd: (real?: boolean) => Element;
+    getSelectedBlocks: (startElm?: Element, endElm?: Element) => Element[];
+    normalize: () => Range;
+    selectorChanged: (selector: string, callback: (active: boolean, args: {
+        node: Node;
+        selector: String;
+        parents: Element[];
+    }) => void) => EditorSelection;
+    selectorChangedWithUnbind: (selector: string, callback: (active: boolean, args: {
+        node: Node;
+        selector: String;
+        parents: Element[];
+    }) => void) => {
+        unbind: () => void;
+    };
+    getScrollContainer: () => HTMLElement;
+    scrollIntoView: (elm?: HTMLElement, alignToTop?: boolean) => void;
+    placeCaretAt: (clientX: number, clientY: number) => void;
+    getBoundingClientRect: () => ClientRect | DOMRect;
+    destroy: () => void;
+}
+declare type EditorCommandCallback = (ui: boolean, value: any, args: any) => void;
+declare type EditorCommandsCallback = (command: string, ui: boolean, value: any, args: any) => void;
+interface Commands {
+    state: Record<string, (command: string) => boolean>;
+    exec: Record<string, EditorCommandsCallback>;
+    value: Record<string, (command: string) => string>;
+}
+interface EditorCommandsConstructor {
+    readonly prototype: EditorCommands;
+    new (editor: Editor): EditorCommands;
+}
+declare class EditorCommands {
+    private readonly editor;
+    private selectionBookmark;
+    private commands;
+    constructor(editor: Editor);
+    execCommand(command: string, ui?: boolean, value?: any, args?: any): boolean;
+    queryCommandState(command: string): boolean;
+    queryCommandValue(command: string): string;
+    addCommands<K extends keyof Commands>(commandList: Commands[K], type: K): void;
+    addCommands(commandList: Record<string, EditorCommandsCallback>): void;
+    addCommand(command: string, callback: EditorCommandCallback, scope?: any): void;
+    queryCommandSupported(command: string): boolean;
+    addQueryStateHandler(command: string, callback: () => boolean, scope?: any): void;
+    addQueryValueHandler(command: string, callback: () => string, scope?: any): void;
+    hasCustomCommand(command: string): boolean;
+    private execNativeCommand;
+    private isFormatMatch;
+    private toggleFormat;
+    private storeSelection;
+    private restoreSelection;
+    private setupCommands;
+}
+interface WindowParams {
+    readonly inline?: 'cursor' | 'toolbar';
+    readonly ariaAttrs?: boolean;
+}
+declare type InstanceApi<T> = UrlDialogInstanceApi | DialogInstanceApi<T>;
+interface WindowManagerImpl {
+    open: <T>(config: DialogSpec<T>, params: WindowParams, closeWindow: (dialog: DialogInstanceApi<T>) => void) => DialogInstanceApi<T>;
+    openUrl: (config: UrlDialogSpec, closeWindow: (dialog: UrlDialogInstanceApi) => void) => UrlDialogInstanceApi;
+    alert: (message: string, callback: () => void) => void;
+    confirm: (message: string, callback: (state: boolean) => void) => void;
+    close: (dialog: InstanceApi<any>) => void;
+}
+interface WindowManager {
+    open: <T>(config: DialogSpec<T>, params?: WindowParams) => DialogInstanceApi<T>;
+    openUrl: (config: UrlDialogSpec) => UrlDialogInstanceApi;
+    alert: (message: string, callback?: () => void, scope?: any) => void;
+    confirm: (message: string, callback?: (state: boolean) => void, scope?: any) => void;
+    close: () => void;
+}
+interface ExecCommandEvent {
+    command: string;
+    ui?: boolean;
+    value?: any;
+}
+declare type GetContentEvent = GetContentArgs & {
+    source_view?: boolean;
+    selection?: boolean;
+    save?: boolean;
+};
+declare type SetContentEvent = SetContentArgs & {
+    source_view?: boolean;
+    paste?: boolean;
+    selection?: boolean;
+};
+interface NewBlockEvent {
+    newBlock: Element;
+}
+interface NodeChangeEvent {
+    element: Element;
+    parents: Node[];
+    selectionChange?: boolean;
+    initial?: boolean;
+}
+interface FormatEvent {
+    format: string;
+    vars?: FormatVars;
+    node?: Node | RangeLikeObject;
+}
+interface ObjectResizeEvent {
+    target: HTMLElement;
+    width: number;
+    height: number;
+    origin: string;
+}
+interface ObjectSelectedEvent {
+    target: Node;
+    targetClone?: Node;
+}
+interface ScrollIntoViewEvent {
+    elm: HTMLElement;
+    alignToTop: boolean;
+}
+interface SetSelectionRangeEvent {
+    range: Range;
+    forward: boolean;
+}
+interface ShowCaretEvent {
+    target: Node;
+    direction: number;
+    before: boolean;
+}
+interface SwitchModeEvent {
+    mode: string;
+}
+interface AddUndoEvent {
+    level: UndoLevel;
+    lastLevel: UndoLevel;
+    originalEvent: Event;
+}
+interface UndoRedoEvent {
+    level: UndoLevel;
+}
+interface WindowEvent<T extends DialogData> {
+    dialog: InstanceApi<T>;
+}
+interface ProgressStateEvent {
+    state: boolean;
+    time?: number;
+}
+interface AfterProgressStateEvent {
+    state: boolean;
+}
+interface PlaceholderToggleEvent {
+    state: boolean;
+}
+interface LoadErrorEvent {
+    message: string;
+}
+interface PreProcessEvent extends ParserArgs {
+    node: Element;
+}
+interface PostProcessEvent extends ParserArgs {
+    content: string;
+}
+interface EditorEventMap extends Omit<NativeEventMap, 'blur' | 'focus'> {
+    'activate': {
+        relatedTarget: Editor;
+    };
+    'deactivate': {
+        relatedTarget: Editor;
+    };
+    'focus': {
+        blurredEditor: Editor;
+    };
+    'blur': {
+        focusedEditor: Editor;
+    };
+    'resize': UIEvent;
+    'scroll': UIEvent;
+    'detach': {};
+    'remove': {};
+    'init': {};
+    'ScrollIntoView': ScrollIntoViewEvent;
+    'AfterScrollIntoView': ScrollIntoViewEvent;
+    'ObjectResized': ObjectResizeEvent;
+    'ObjectResizeStart': ObjectResizeEvent;
+    'SwitchMode': SwitchModeEvent;
+    'ScrollWindow': UIEvent;
+    'ResizeWindow': UIEvent;
+    'SkinLoaded': {};
+    'SkinLoadError': LoadErrorEvent;
+    'PluginLoadError': LoadErrorEvent;
+    'IconsLoadError': LoadErrorEvent;
+    'LanguageLoadError': LoadErrorEvent;
+    'BeforeExecCommand': ExecCommandEvent;
+    'ExecCommand': ExecCommandEvent;
+    'NodeChange': NodeChangeEvent;
+    'FormatApply': FormatEvent;
+    'FormatRemove': FormatEvent;
+    'ShowCaret': ShowCaretEvent;
+    'SelectionChange': {};
+    'ObjectSelected': ObjectSelectedEvent;
+    'BeforeObjectSelected': ObjectSelectedEvent;
+    'GetSelectionRange': {
+        range: Range;
+    };
+    'SetSelectionRange': SetSelectionRangeEvent;
+    'AfterSetSelectionRange': SetSelectionRangeEvent;
+    'BeforeGetContent': GetContentEvent;
+    'GetContent': GetContentEvent;
+    'BeforeSetContent': SetContentEvent;
+    'SetContent': SetContentEvent;
+    'LoadContent': {};
+    'PreviewFormats': {};
+    'AfterPreviewFormats': {};
+    'ScriptsLoaded': {};
+    'PreInit': {};
+    'PostRender': {};
+    'NewBlock': NewBlockEvent;
+    'ClearUndos': {};
+    'TypingUndo': {};
+    'Redo': UndoRedoEvent;
+    'Undo': UndoRedoEvent;
+    'BeforeAddUndo': AddUndoEvent;
+    'AddUndo': AddUndoEvent;
+    'CloseWindow': WindowEvent<any>;
+    'OpenWindow': WindowEvent<any>;
+    'ProgressState': ProgressStateEvent;
+    'AfterProgressState': AfterProgressStateEvent;
+    'PlaceholderToggle': PlaceholderToggleEvent;
+    'tap': TouchEvent;
+    'longpress': TouchEvent;
+    'longpresscancel': {};
+    'PreProcess': PreProcessEvent;
+    'PostProcess': PostProcessEvent;
+}
+interface EditorManagerEventMap {
+    'AddEditor': {
+        editor: Editor;
+    };
+    'RemoveEditor': {
+        editor: Editor;
+    };
+    'BeforeUnload': {
+        returnValue: any;
+    };
+}
+type EventTypes_d_ExecCommandEvent = ExecCommandEvent;
+type EventTypes_d_GetContentEvent = GetContentEvent;
+type EventTypes_d_SetContentEvent = SetContentEvent;
+type EventTypes_d_NewBlockEvent = NewBlockEvent;
+type EventTypes_d_NodeChangeEvent = NodeChangeEvent;
+type EventTypes_d_FormatEvent = FormatEvent;
+type EventTypes_d_ObjectResizeEvent = ObjectResizeEvent;
+type EventTypes_d_ObjectSelectedEvent = ObjectSelectedEvent;
+type EventTypes_d_ScrollIntoViewEvent = ScrollIntoViewEvent;
+type EventTypes_d_SetSelectionRangeEvent = SetSelectionRangeEvent;
+type EventTypes_d_ShowCaretEvent = ShowCaretEvent;
+type EventTypes_d_SwitchModeEvent = SwitchModeEvent;
+type EventTypes_d_AddUndoEvent = AddUndoEvent;
+type EventTypes_d_UndoRedoEvent = UndoRedoEvent;
+type EventTypes_d_WindowEvent<_0> = WindowEvent<_0>;
+type EventTypes_d_ProgressStateEvent = ProgressStateEvent;
+type EventTypes_d_AfterProgressStateEvent = AfterProgressStateEvent;
+type EventTypes_d_PlaceholderToggleEvent = PlaceholderToggleEvent;
+type EventTypes_d_LoadErrorEvent = LoadErrorEvent;
+type EventTypes_d_PreProcessEvent = PreProcessEvent;
+type EventTypes_d_PostProcessEvent = PostProcessEvent;
+type EventTypes_d_EditorEventMap = EditorEventMap;
+type EventTypes_d_EditorManagerEventMap = EditorManagerEventMap;
+declare namespace EventTypes_d {
+    export { EventTypes_d_ExecCommandEvent as ExecCommandEvent, EventTypes_d_GetContentEvent as GetContentEvent, EventTypes_d_SetContentEvent as SetContentEvent, EventTypes_d_NewBlockEvent as NewBlockEvent, EventTypes_d_NodeChangeEvent as NodeChangeEvent, EventTypes_d_FormatEvent as FormatEvent, EventTypes_d_ObjectResizeEvent as ObjectResizeEvent, EventTypes_d_ObjectSelectedEvent as ObjectSelectedEvent, EventTypes_d_ScrollIntoViewEvent as ScrollIntoViewEvent, EventTypes_d_SetSelectionRangeEvent as SetSelectionRangeEvent, EventTypes_d_ShowCaretEvent as ShowCaretEvent, EventTypes_d_SwitchModeEvent as SwitchModeEvent, EventTypes_d_AddUndoEvent as AddUndoEvent, EventTypes_d_UndoRedoEvent as UndoRedoEvent, EventTypes_d_WindowEvent as WindowEvent, EventTypes_d_ProgressStateEvent as ProgressStateEvent, EventTypes_d_AfterProgressStateEvent as AfterProgressStateEvent, EventTypes_d_PlaceholderToggleEvent as PlaceholderToggleEvent, EventTypes_d_LoadErrorEvent as LoadErrorEvent, EventTypes_d_PreProcessEvent as PreProcessEvent, EventTypes_d_PostProcessEvent as PostProcessEvent, EventTypes_d_EditorEventMap as EditorEventMap, EventTypes_d_EditorManagerEventMap as EditorManagerEventMap, };
+}
+interface RawString {
+    raw: string;
+}
+declare type Primitive = string | number | boolean | Record<string | number, any> | Function;
+declare type TokenisedString = [
+    string,
+    ...Primitive[]
+];
+declare type Untranslated = Primitive | TokenisedString | RawString;
+declare type TranslatedString = string;
+interface I18n {
+    getData: () => Record<string, Record<string, string>>;
+    setCode: (newCode: string) => void;
+    getCode: () => string;
+    add: (code: string, items: Record<string, string>) => void;
+    translate: (text: Untranslated) => TranslatedString;
+    isRtl: () => boolean;
+    hasCode: (code: string) => boolean;
+}
+interface Observable<T> {
+    fire<K extends string, U extends MappedEvent<T, K>>(name: K, args?: U, bubble?: boolean): EditorEvent<U>;
+    on<K extends string>(name: K, callback: (event: EditorEvent<MappedEvent<T, K>>) => void, prepend?: boolean): EventDispatcher<T>;
+    off<K extends string>(name?: K, callback?: (event: EditorEvent<MappedEvent<T, K>>) => void): EventDispatcher<T>;
+    once<K extends string>(name: K, callback: (event: EditorEvent<MappedEvent<T, K>>) => void): EventDispatcher<T>;
+    hasEventListeners(name: string): boolean;
+}
+interface URISettings {
+    base_uri?: URI;
+}
+interface URIConstructor {
+    readonly prototype: URI;
+    new (url: string, settings?: URISettings): URI;
+    getDocumentBaseUrl: (loc: {
+        protocol: string;
+        host?: string;
+        href?: string;
+        pathname?: string;
+    }) => string;
+    parseDataUri: (uri: string) => {
+        type: string;
+        data: string;
+    };
+}
+interface SafeUriOptions {
+    readonly allow_html_data_urls?: boolean;
+    readonly allow_script_urls?: boolean;
+    readonly allow_svg_data_urls?: boolean;
+}
+declare class URI {
+    static parseDataUri(uri: string): {
+        type: string;
+        data: string;
+    };
+    static isDomSafe(uri: string, context?: string, options?: SafeUriOptions): boolean;
+    static getDocumentBaseUrl(loc: {
+        protocol: string;
+        host?: string;
+        href?: string;
+        pathname?: string;
+    }): string;
+    source: string;
+    protocol: string;
+    authority: string;
+    userInfo: string;
+    user: string;
+    password: string;
+    host: string;
+    port: string;
+    relative: string;
+    path: string;
+    directory: string;
+    file: string;
+    query: string;
+    anchor: string;
+    settings: URISettings;
+    constructor(url: string, settings?: URISettings);
+    setPath(path: string): void;
+    toRelative(uri: string): string;
+    toAbsolute(uri: string, noHost?: boolean): string;
+    isSameOrigin(uri: URI): boolean;
+    toRelPath(base: string, path: string): string;
+    toAbsPath(base: string, path: string): string;
+    getURI(noProtoHost?: boolean): string;
+}
+interface EditorManager extends Observable<EditorManagerEventMap> {
+    $: DomQueryConstructor;
+    defaultSettings: RawEditorSettings;
+    majorVersion: string;
+    minorVersion: string;
+    releaseDate: string;
+    editors: Editor[];
+    activeEditor: Editor;
+    focusedEditor: Editor;
+    settings: RawEditorSettings;
+    baseURI: URI;
+    baseURL: string;
+    documentBaseURL: string;
+    i18n: I18n;
+    suffix: string;
+    add(this: EditorManager, editor: Editor): Editor;
+    addI18n: (code: string, item: Record<string, string>) => void;
+    createEditor(this: EditorManager, id: string, settings: RawEditorSettings): Editor;
+    execCommand(this: EditorManager, cmd: string, ui: boolean, value: any): boolean;
+    get(this: EditorManager): Editor[];
+    get(this: EditorManager, id: number | string): Editor;
+    init(this: EditorManager, settings: RawEditorSettings): Promise<Editor[]>;
+    overrideDefaults(this: EditorManager, defaultSettings: Partial<RawEditorSettings>): void;
+    remove(this: EditorManager): void;
+    remove(this: EditorManager, selector: string | Editor): Editor | void;
+    setActive(this: EditorManager, editor: Editor): void;
+    setup(this: EditorManager): void;
+    translate: (text: Untranslated) => TranslatedString;
+    triggerSave: () => void;
+    _setBaseUrl(this: EditorManager, baseUrl: string): void;
+}
+interface EditorObservable extends Observable<EditorEventMap> {
+    bindPendingEventDelegates(this: Editor): void;
+    toggleNativeEvent(this: Editor, name: string, state: boolean): any;
+    unbindAllNativeEvents(this: Editor): void;
+}
+interface UploadResult$1 {
+    element: HTMLImageElement;
+    status: boolean;
+    blobInfo: BlobInfo;
+    uploadUri: string;
+}
+declare type UploadCallback = (results: UploadResult$1[]) => void;
+interface EditorUpload {
+    blobCache: BlobCache;
+    addFilter: (filter: (img: HTMLImageElement) => boolean) => void;
+    uploadImages: (callback?: UploadCallback) => Promise<UploadResult$1[]>;
+    uploadImagesAuto: (callback?: UploadCallback) => void | Promise<UploadResult$1[]>;
+    scanForImages: () => Promise<BlobInfoImagePair[]>;
+    destroy: () => void;
+}
+declare type FormatChangeCallback = (state: boolean, data: {
+    node: Node;
+    format: string;
+    parents: any;
+}) => void;
+interface FormatRegistry {
+    get: {
+        (name: string): Format[] | undefined;
+        (): Record<string, Format[]>;
+    };
+    has: (name: string) => boolean;
+    register: (name: string | Formats, format?: Format[] | Format) => void;
+    unregister: (name: string) => Formats;
+}
+interface Formatter extends FormatRegistry {
+    apply: (name: string, vars?: FormatVars, node?: Node | RangeLikeObject) => void;
+    remove: (name: string, vars?: FormatVars, node?: Node | Range, similar?: boolean) => void;
+    toggle: (name: string, vars?: FormatVars, node?: Node) => void;
+    match: (name: string, vars?: FormatVars, node?: Node, similar?: boolean) => boolean;
+    closest: (names: string[]) => string | null;
+    matchAll: (names: string[], vars?: FormatVars) => string[];
+    matchNode: (node: Node, name: string, vars?: FormatVars, similar?: boolean) => Format | undefined;
+    canApply: (name: string) => boolean;
+    formatChanged: (names: string, callback: FormatChangeCallback, similar?: boolean, vars?: FormatVars) => {
+        unbind: () => void;
+    };
+    getCssText: (format: string | Format) => string;
+}
+interface EditorMode {
+    isReadOnly: () => boolean;
+    set: (mode: string) => void;
+    get: () => string;
+    register: (mode: string, api: EditorModeApi) => void;
+}
+interface EditorModeApi {
+    activate: () => void;
+    deactivate: () => void;
+    editorReadOnly: boolean;
+}
+interface Plugin {
+    getMetadata?: () => {
+        name: string;
+        url: string;
+    };
+    [key: string]: any;
+}
+declare type PluginManager = AddOnManager<Plugin>;
+interface ShortcutsConstructor {
+    readonly prototype: Shortcuts;
+    new (editor: Editor): Shortcuts;
+}
+declare type CommandFunc = string | [
+    string,
+    boolean,
+    any
+] | (() => void);
+declare class Shortcuts {
+    private readonly editor;
+    private readonly shortcuts;
+    private pendingPatterns;
+    constructor(editor: Editor);
+    add(pattern: string, desc: string, cmdFunc: CommandFunc, scope?: any): boolean;
+    remove(pattern: string): boolean;
+    private normalizeCommandFunc;
+    private createShortcut;
+    private hasModifier;
+    private isFunctionKey;
+    private matchShortcut;
+    private executeShortcutAction;
+}
+interface Theme {
+    ui?: any;
+    inline?: any;
+    execCommand?: (command: string, ui?: boolean, value?: any) => boolean;
+    destroy?: () => void;
+    init?: (editor: Editor, url: string, $: DomQueryConstructor) => void;
+    renderUI?: () => {
+        iframeContainer?: HTMLIFrameElement;
+        editorContainer: HTMLElement;
+        api?: Partial<EditorUiApi>;
+    };
+    getNotificationManagerImpl?: () => NotificationManagerImpl;
+    getWindowManagerImpl?: () => WindowManagerImpl;
+}
+declare type ThemeManager = AddOnManager<Theme>;
+interface EditorConstructor {
+    readonly prototype: Editor;
+    new (id: string, settings: RawEditorSettings, editorManager: EditorManager): Editor;
+}
+declare class Editor implements EditorObservable {
+    documentBaseUrl: string;
+    baseUri: URI;
+    settings: EditorSettings;
+    id: string;
+    plugins: Record<string, Plugin>;
+    documentBaseURI: URI;
+    baseURI: URI;
+    contentCSS: string[];
+    contentStyles: string[];
+    ui: EditorUi;
+    mode: EditorMode;
+    setMode: (mode: string) => void;
+    $: DomQueryConstructor;
+    shortcuts: Shortcuts;
+    loadedCSS: Record<string, any>;
+    editorCommands: EditorCommands;
+    suffix: string;
+    editorManager: EditorManager;
+    inline: boolean;
+    isNotDirty: boolean;
+    callbackLookup: any;
+    _nodeChangeDispatcher: NodeChange;
+    editorUpload: EditorUpload;
+    annotator: Annotator;
+    bodyElement: HTMLElement;
+    bookmark: any;
+    composing: boolean;
+    container: HTMLElement;
+    contentAreaContainer: HTMLElement;
+    contentDocument: Document;
+    contentWindow: Window;
+    delegates: Record<string, (event: any) => void>;
+    destroyed: boolean;
+    dom: DOMUtils;
+    editorContainer: HTMLElement;
+    eventRoot?: Element;
+    formatter: Formatter;
+    formElement: HTMLElement;
+    formEventDelegate: (e: Event) => void;
+    hasHiddenInput: boolean;
+    hasVisual: boolean;
+    hidden: boolean;
+    iframeElement: HTMLIFrameElement | null;
+    iframeHTML: string;
+    initialized: boolean;
+    notificationManager: NotificationManager;
+    orgDisplay: string;
+    orgVisibility: string;
+    parser: DomParser;
+    quirks: Quirks;
+    readonly: boolean;
+    removed: boolean;
+    schema: Schema;
+    selection: EditorSelection;
+    serializer: DomSerializer;
+    startContent: string;
+    targetElm: HTMLElement;
+    theme: Theme;
+    undoManager: UndoManager;
+    validate: boolean;
+    windowManager: WindowManager;
+    _beforeUnload: () => void;
+    _eventDispatcher: EventDispatcher<NativeEventMap>;
+    _mceOldSubmit: any;
+    _pendingNativeEvents: string[];
+    _selectionOverrides: SelectionOverrides;
+    _skinLoaded: boolean;
+    bindPendingEventDelegates: EditorObservable['bindPendingEventDelegates'];
+    toggleNativeEvent: EditorObservable['toggleNativeEvent'];
+    unbindAllNativeEvents: EditorObservable['unbindAllNativeEvents'];
+    fire: EditorObservable['fire'];
+    on: EditorObservable['on'];
+    off: EditorObservable['off'];
+    once: EditorObservable['once'];
+    hasEventListeners: EditorObservable['hasEventListeners'];
+    constructor(id: string, settings: RawEditorSettings, editorManager: EditorManager);
+    render(): void;
+    focus(skipFocus?: boolean): void;
+    hasFocus(): boolean;
+    execCallback(name: string, ...x: any[]): any;
+    translate(text: Untranslated): TranslatedString;
+    getParam<K extends keyof ParamTypeMap>(name: string, defaultVal: ParamTypeMap[K], type: K): ParamTypeMap[K];
+    getParam<K extends keyof EditorSettings>(name: K, defaultVal?: EditorSettings[K], type?: string): EditorSettings[K];
+    getParam<T>(name: string, defaultVal: T, type?: string): T;
+    hasPlugin(name: string, loaded?: boolean): boolean;
+    nodeChanged(args?: any): void;
+    addCommand(name: string, callback: EditorCommandCallback, scope?: object): void;
+    addQueryStateHandler(name: string, callback: () => boolean, scope?: any): void;
+    addQueryValueHandler(name: string, callback: () => string, scope?: any): void;
+    addShortcut(pattern: string, desc: string, cmdFunc: string | [
+        string,
+        boolean,
+        any
+    ] | (() => void), scope?: any): void;
+    execCommand(cmd: string, ui?: boolean, value?: any, args?: any): boolean;
+    queryCommandState(cmd: string): boolean;
+    queryCommandValue(cmd: string): string;
+    queryCommandSupported(cmd: string): boolean;
+    show(): void;
+    hide(): void;
+    isHidden(): boolean;
+    setProgressState(state: boolean, time?: number): void;
+    load(args?: any): string;
+    save(args?: any): string;
+    setContent(content: string, args?: SetContentArgs): string;
+    setContent(content: AstNode, args?: SetContentArgs): AstNode;
+    setContent(content: Content, args?: SetContentArgs): Content;
+    getContent(args: {
+        format: 'tree';
+    } & GetContentArgs): AstNode;
+    getContent(args?: GetContentArgs): string;
+    insertContent(content: string, args?: any): void;
+    resetContent(initialContent?: string): void;
+    isDirty(): boolean;
+    setDirty(state: boolean): void;
+    getContainer(): HTMLElement;
+    getContentAreaContainer(): HTMLElement;
+    getElement(): HTMLElement;
+    getWin(): Window;
+    getDoc(): Document;
+    getBody(): HTMLElement;
+    convertURL(url: string, name: string, elm?: any): string;
+    addVisual(elm?: HTMLElement): void;
+    remove(): void;
+    destroy(automatic?: boolean): void;
+    uploadImages(callback?: UploadCallback): Promise<UploadResult$1[]>;
+    _scanForImages(): Promise<BlobInfoImagePair[]>;
+    addButton(): void;
+    addSidebar(): void;
+    addMenuItem(): void;
+    addContextToolbar(): void;
+}
+interface UrlObject {
+    prefix: string;
+    resource: string;
+    suffix: string;
+}
+declare type WaitState = 'added' | 'loaded';
+declare type AddOnCallback<T> = (editor: Editor, url: string, $?: DomQueryConstructor) => void | T;
+declare type AddOnConstructor<T> = new (editor: Editor, url: string, $?: DomQueryConstructor) => T;
+interface AddOnManager<T> {
+    items: AddOnConstructor<T>[];
+    urls: Record<string, string>;
+    lookup: Record<string, {
+        instance: AddOnConstructor<T>;
+        dependencies?: string[];
+    }>;
+    _listeners: {
+        name: string;
+        state: WaitState;
+        callback: () => void;
+    }[];
+    get: (name: string) => AddOnConstructor<T>;
+    dependencies: (name: string) => string[];
+    requireLangPack: (name: string, languages: string) => void;
+    add: (id: string, addOn: AddOnCallback<T>, dependencies?: string[]) => AddOnConstructor<T>;
+    remove: (name: string) => void;
+    createUrl: (baseUrl: UrlObject, dep: string | UrlObject) => UrlObject;
+    addComponents: (pluginName: string, scripts: string[]) => void;
+    load: (name: string, addOnUrl: string | UrlObject, success?: () => void, scope?: any, failure?: () => void) => void;
+    waitFor: (name: string, callback: () => void, state?: WaitState) => void;
+}
+interface RangeUtils {
+    walk: (rng: Range, callback: (nodes: Node[]) => void) => void;
+    split: (rng: Range) => RangeLikeObject;
+    normalize: (rng: Range) => boolean;
+}
+interface ScriptLoaderSettings {
+    referrerPolicy?: ReferrerPolicy;
+}
+interface ScriptLoaderConstructor {
+    readonly prototype: ScriptLoader;
+    new (): ScriptLoader;
+    ScriptLoader: ScriptLoader;
+}
+declare class ScriptLoader {
+    static ScriptLoader: ScriptLoader;
+    private settings;
+    private states;
+    private queue;
+    private scriptLoadedCallbacks;
+    private queueLoadedCallbacks;
+    private loading;
+    constructor(settings?: ScriptLoaderSettings);
+    _setReferrerPolicy(referrerPolicy: ReferrerPolicy): void;
+    loadScript(url: string, success?: () => void, failure?: () => void): void;
+    isDone(url: string): boolean;
+    markDone(url: string): void;
+    add(url: string, success?: () => void, scope?: any, failure?: () => void): void;
+    load(url: string, success?: () => void, scope?: any, failure?: () => void): void;
+    remove(url: string): void;
+    loadQueue(success?: () => void, scope?: any, failure?: (urls: string[]) => void): void;
+    loadScripts(scripts: string[], success?: () => void, scope?: any, failure?: (urls: string[]) => void): void;
+}
+declare type TextProcessCallback = (node: Text, offset: number, text: string) => number;
+interface Spot {
+    container: Text;
+    offset: number;
+}
+interface TextSeeker {
+    backwards: (node: Node, offset: number, process: TextProcessCallback, root?: Node) => Spot | null;
+    forwards: (node: Node, offset: number, process: TextProcessCallback, root?: Node) => Spot | null;
+}
+interface DomTreeWalkerConstructor {
+    readonly prototype: DomTreeWalker;
+    new (startNode: Node, rootNode: Node): DomTreeWalker;
+}
+declare class DomTreeWalker {
+    private readonly rootNode;
+    private node;
+    constructor(startNode: Node, rootNode: Node);
+    current(): Node;
+    next(shallow?: boolean): Node;
+    prev(shallow?: boolean): Node;
+    prev2(shallow?: boolean): Node;
+    private findSibling;
+    private findPreviousNode;
+}
+interface Version {
+    major: number;
+    minor: number;
+}
+interface Env {
+    opera: boolean;
+    webkit: boolean;
+    ie: false | number;
+    gecko: boolean;
+    mac: boolean;
+    iOS: boolean;
+    android: boolean;
+    contentEditable: boolean;
+    transparentSrc: string;
+    caretAfter: boolean;
+    range: boolean;
+    documentMode: number;
+    fileApi: boolean;
+    ceFalse: boolean;
+    cacheSuffix: any;
+    container: any;
+    experimentalShadowDom: boolean;
+    canHaveCSP: boolean;
+    desktop: boolean;
+    windowsPhone: boolean;
+    browser: {
+        current: string | undefined;
+        version: Version;
+        isEdge: () => boolean;
+        isChrome: () => boolean;
+        isIE: () => boolean;
+        isOpera: () => boolean;
+        isFirefox: () => boolean;
+        isSafari: () => boolean;
+    };
+    os: {
+        current: string | undefined;
+        version: Version;
+        isWindows: () => boolean;
+        isiOS: () => boolean;
+        isAndroid: () => boolean;
+        isOSX: () => boolean;
+        isLinux: () => boolean;
+        isSolaris: () => boolean;
+        isFreeBSD: () => boolean;
+        isChromeOS: () => boolean;
+    };
+    deviceType: {
+        isiPad: () => boolean;
+        isiPhone: () => boolean;
+        isTablet: () => boolean;
+        isPhone: () => boolean;
+        isTouch: () => boolean;
+        isWebView: () => boolean;
+        isDesktop: () => boolean;
+    };
+}
+interface FocusManager {
+    isEditorUIElement: (elm: Element) => boolean;
+}
+interface EntitiesMap {
+    [name: string]: string;
+}
+interface Entities {
+    encodeRaw: (text: string, attr?: boolean) => string;
+    encodeAllRaw: (text: string) => string;
+    encodeNumeric: (text: string, attr?: boolean) => string;
+    encodeNamed: (text: string, attr?: boolean, entities?: EntitiesMap) => string;
+    getEncodeFunc: (name: string, entities?: EntitiesMap | string) => (text: string, attr?: boolean) => string;
+    decode: (text: string) => string;
+}
+declare type AttrList = Array<{
+    name: string;
+    value: string;
+}> & {
+    map: Record<string, string>;
+};
+interface SaxParserSettings {
+    allow_conditional_comments?: boolean;
+    allow_html_data_urls?: boolean;
+    allow_script_urls?: boolean;
+    allow_svg_data_urls?: boolean;
+    fix_self_closing?: boolean;
+    preserve_cdata?: boolean;
+    remove_internals?: boolean;
+    self_closing_elements?: Record<string, {}>;
+    validate?: boolean;
+    document?: Document;
+    cdata?: (text: string) => void;
+    comment?: (text: string) => void;
+    doctype?: (text: string) => void;
+    end?: (name: string) => void;
+    pi?: (name: string, text: string) => void;
+    start?: (name: string, attrs: AttrList, empty: boolean) => void;
+    text?: (text: string, raw?: boolean) => void;
+}
+declare type ParserFormat = 'html' | 'xhtml' | 'xml';
+interface SaxParser {
+    parse: (html: string, format?: ParserFormat) => void;
+}
+interface IconPack {
+    icons: Record<string, string>;
+}
+interface IconManager {
+    add: (id: string, iconPack: IconPack) => void;
+    get: (id: string) => IconPack;
+    has: (id: string) => boolean;
+}
+interface Resource {
+    load: <T = any>(id: string, url: string) => Promise<T>;
+    add: (id: string, data: any) => void;
+}
+declare type WithSubItems<T, K extends keyof T> = T[K] extends Array<any> ? (T & T[K][number]) : T;
+interface Props<A extends any[] = any[]> {
+    Mixins?: Array<Record<string, any>>;
+    Methods?: string;
+    Properties?: string;
+    Statics?: Record<string, any>;
+    Defaults?: Record<string, any>;
+    init?: (...args: A) => void;
+}
+declare type ExtendedClass<T extends Props<A>, A extends any[]> = WithSubItems<T, 'Mixins'>;
+interface ExtendedClassConstructor<T extends Props<A>, A extends any[] = any[]> extends Class {
+    readonly prototype: ExtendedClass<T, A>;
+    new (...args: A): ExtendedClass<T, A>;
+    [key: string]: T['Statics'];
+}
+interface Class {
+    extend<T extends Props<A>, A extends any[] = any[]>(props: T): ExtendedClassConstructor<T, A>;
+}
+interface RGB {
+    r: number;
+    g: number;
+    b: number;
+}
+interface HSV {
+    h: number;
+    s: number;
+    v: number;
+}
+declare type ColorConstructor = new (value?: string | RGB | HSV) => Color;
+interface Color {
+    toRgb: () => RGB;
+    toHsv: () => HSV;
+    toHex: () => string;
+    parse: (value: string | RGB | HSV) => Color;
+}
+interface DebounceFunc<T extends (...args: any[]) => void> {
+    (...args: Parameters<T>): void;
+    stop: () => void;
+}
+interface Delay {
+    requestAnimationFrame: (callback: () => void, element?: HTMLElement) => void;
+    setEditorInterval: (editor: Editor, callback: () => void, time?: number) => number;
+    setEditorTimeout: (editor: Editor, callback: () => void, time?: number) => number;
+    setInterval: (callback: () => void, time?: number) => number;
+    setTimeout: (callback: () => void, time?: number) => number;
+    clearInterval: (id?: number) => void;
+    clearTimeout: (id?: number) => void;
+    debounce: <T extends (...args: any[]) => any>(callback: T, time?: number) => DebounceFunc<T>;
+    throttle: <T extends (...args: any[]) => any>(callback: T, time?: number) => DebounceFunc<T>;
+}
+declare type UploadResult = UploadResult$2;
+interface ImageUploader {
+    upload: (blobInfos: BlobInfo[], showNotification?: boolean) => Promise<UploadResult[]>;
+}
+interface JSONUtils {
+    serialize: (obj: any) => string;
+    parse: (text: string) => any;
+}
+interface JSONPSettings {
+    count?: number;
+    url: string;
+    callback: (json: string) => void;
+}
+interface JSONP {
+    callbacks: {};
+    count: number;
+    send(this: JSONP, settings: JSONPSettings): void;
+}
+interface JSONRequestSettings {
+    crossDomain?: boolean;
+    requestheaders?: Record<string, {
+        key: string;
+        value: string;
+    }>;
+    type?: string;
+    url?: string;
+    error_scope?: any;
+    success_scope?: any;
+    success?: (data: any) => void;
+    error?: (error: any, xhr: XMLHttpRequest) => void;
+}
+interface JSONRequestArgs extends JSONRequestSettings {
+    id?: string;
+    method?: string;
+    params?: string;
+}
+interface JSONRequestConstructor {
+    readonly prototype: JSONRequest;
+    new (settings?: JSONRequestSettings): JSONRequest;
+    sendRPC: (o: JSONRequestArgs) => void;
+}
+declare class JSONRequest {
+    static sendRPC(o: JSONRequestArgs): void;
+    settings: JSONRequestSettings;
+    count: number;
+    constructor(settings?: JSONRequestSettings);
+    send(args: JSONRequestArgs): void;
+}
+interface KeyboardLikeEvent {
+    shiftKey: boolean;
+    ctrlKey: boolean;
+    altKey: boolean;
+    metaKey: boolean;
+}
+interface VK {
+    BACKSPACE: number;
+    DELETE: number;
+    DOWN: number;
+    ENTER: number;
+    ESC: number;
+    LEFT: number;
+    RIGHT: number;
+    SPACEBAR: number;
+    TAB: number;
+    UP: number;
+    PAGE_UP: number;
+    PAGE_DOWN: number;
+    END: number;
+    HOME: number;
+    modifierPressed: (e: KeyboardLikeEvent) => boolean;
+    metaKeyPressed: (e: KeyboardLikeEvent) => boolean;
+}
+interface XHRSettings {
+    async?: boolean;
+    content_type?: string;
+    crossDomain?: boolean;
+    data?: Document | BodyInit;
+    requestheaders?: Record<string, {
+        key: string;
+        value: string;
+    }>;
+    scope?: any;
+    type?: string;
+    url: string;
+    error_scope?: any;
+    success_scope?: any;
+    error?: (message: 'TIMED_OUT' | 'GENERAL', xhr: XMLHttpRequest, settings: XHRSettings) => void;
+    success?: (text: string, xhr: XMLHttpRequest, settings: XHRSettings) => void;
+}
+interface XHREventMap {
+    beforeInitialize: {
+        settings: XHRSettings;
+    };
+    beforeSend: {
+        xhr: XMLHttpRequest;
+        settings: XHRSettings;
+    };
+}
+interface XHR extends Observable<XHREventMap> {
+    send(this: XHR, settings: XHRSettings): void;
+}
+interface DOMUtilsNamespace {
+    new (doc: Document, settings: Partial<DOMUtilsSettings>): DOMUtils;
+    DOM: DOMUtils;
+    nodeIndex: (node: Node, normalized?: boolean) => number;
+}
+interface RangeUtilsNamespace {
+    new (dom: DOMUtils): RangeUtils;
+    compareRanges: (rng1: RangeLikeObject, rng2: RangeLikeObject) => boolean;
+    getCaretRangeFromPoint: (clientX: number, clientY: number, doc: Document) => Range;
+    getSelectedNode: (range: Range) => Node;
+    getNode: (container: Node, offset: number) => Node;
+}
+interface AddOnManagerNamespace {
+    new <T>(): AddOnManager<T>;
+    language: string | undefined;
+    languageLoad: boolean;
+    baseURL: string;
+    PluginManager: PluginManager;
+    ThemeManager: ThemeManager;
+}
+interface BookmarkManagerNamespace {
+    (selection: EditorSelection): BookmarkManager;
+    isBookmarkNode: (node: Node) => boolean;
+}
+interface SaxParserNamespace {
+    new (settings?: SaxParserSettings, schema?: Schema): SaxParser;
+    findEndTag: (schema: Schema, html: string, startIndex: number) => number;
+}
+interface TinyMCE extends EditorManager {
+    geom: {
+        Rect: Rect;
+    };
+    util: {
+        Promise: PromiseConstructor;
+        Delay: Delay;
+        Tools: Tools;
+        VK: VK;
+        URI: URIConstructor;
+        Class: Class;
+        EventDispatcher: EventDispatcherConstructor<any>;
+        Observable: Observable<any>;
+        I18n: I18n;
+        XHR: XHR;
+        JSON: JSONUtils;
+        JSONRequest: JSONRequestConstructor;
+        JSONP: JSONP;
+        LocalStorage: Storage;
+        Color: ColorConstructor;
+        ImageUploader: ImageUploader;
+    };
+    dom: {
+        EventUtils: EventUtilsConstructor;
+        Sizzle: any;
+        DomQuery: DomQueryConstructor;
+        TreeWalker: DomTreeWalkerConstructor;
+        TextSeeker: new (dom: DOMUtils, isBlockBoundary?: (node: Node) => boolean) => TextSeeker;
+        DOMUtils: DOMUtilsNamespace;
+        ScriptLoader: ScriptLoaderConstructor;
+        RangeUtils: RangeUtilsNamespace;
+        Serializer: new (settings: DomSerializerSettings, editor?: Editor) => DomSerializer;
+        ControlSelection: (selection: EditorSelection, editor: Editor) => ControlSelection;
+        BookmarkManager: BookmarkManagerNamespace;
+        Selection: new (dom: DOMUtils, win: Window, serializer: DomSerializer, editor: Editor) => EditorSelection;
+        StyleSheetLoader: new (documentOrShadowRoot: Document | ShadowRoot, settings: StyleSheetLoaderSettings) => StyleSheetLoader;
+        Event: EventUtils;
+    };
+    html: {
+        Styles: new (settings?: StylesSettings, schema?: Schema) => Styles;
+        Entities: Entities;
+        Node: AstNodeConstructor;
+        Schema: new (settings?: SchemaSettings) => Schema;
+        SaxParser: SaxParserNamespace;
+        DomParser: new (settings?: DomParserSettings, schema?: Schema) => DomParser;
+        Writer: new (settings?: WriterSettings) => Writer;
+        Serializer: new (settings?: HtmlSerializerSettings, schema?: Schema) => HtmlSerializer;
+    };
+    AddOnManager: AddOnManagerNamespace;
+    Annotator: new (editor: Editor) => Annotator;
+    Editor: EditorConstructor;
+    EditorCommands: EditorCommandsConstructor;
+    EditorManager: EditorManager;
+    EditorObservable: EditorObservable;
+    Env: Env;
+    FocusManager: FocusManager;
+    Formatter: new (editor: Editor) => Formatter;
+    NotificationManager: new (editor: Editor) => NotificationManager;
+    Shortcuts: ShortcutsConstructor;
+    UndoManager: new (editor: Editor) => UndoManager;
+    WindowManager: new (editor: Editor) => WindowManager;
+    DOM: DOMUtils;
+    ScriptLoader: ScriptLoader;
+    PluginManager: PluginManager;
+    ThemeManager: ThemeManager;
+    IconManager: IconManager;
+    Resource: Resource;
+    trim: Tools['trim'];
+    isArray: Tools['isArray'];
+    is: Tools['is'];
+    toArray: Tools['toArray'];
+    makeMap: Tools['makeMap'];
+    each: Tools['each'];
+    map: Tools['map'];
+    grep: Tools['grep'];
+    inArray: Tools['inArray'];
+    extend: Tools['extend'];
+    create: Tools['create'];
+    walk: Tools['walk'];
+    createNS: Tools['createNS'];
+    resolve: Tools['resolve'];
+    explode: Tools['explode'];
+    _addCacheSuffix: Tools['_addCacheSuffix'];
+    isOpera: boolean;
+    isWebKit: boolean;
+    isIE: false | number;
+    isGecko: boolean;
+    isMac: boolean;
+}
+declare const tinymce: TinyMCE;
+export default tinymce;
+export { AddOnManager, Annotator, AstNode, Bookmark, BookmarkManager, Class, Color, ControlSelection, DOMUtils, Delay, DomParser, DomParserSettings, DomQuery, DomSerializer, DomSerializerSettings, DomTreeWalker, Editor, EditorCommands, EditorEvent, EditorManager, EditorModeApi, EditorObservable, EditorSelection, EditorSettings, Entities, Env, EventDispatcher, EventUtils, EventTypes_d as Events, FocusManager, Format_d as Formats, Formatter, GeomRect, HtmlSerializer, HtmlSerializerSettings, I18n, IconManager, JSONUtils as JSON, JSONP, JSONRequest, JSONRequestArgs, JSONRequestSettings, NotificationApi, NotificationManager, NotificationSpec, Observable, Plugin, PluginManager, RangeUtils, RawEditorSettings, Rect, Resource, SaxParser, SaxParserSettings, Schema, SchemaSettings, ScriptLoader, Shortcuts, StyleSheetLoader, Styles, TextSeeker, Theme, ThemeManager, TinyMCE, Tools, URI, Ui_d as Ui, UndoManager, VK, WindowManager, Writer, WriterSettings, XHR, XHRSettings };
diff --git a/public/static/assets/gougu/module/tinymce/tinymce.min.js b/public/static/assets/gougu/module/tinymce/tinymce.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..74c72a73ce2a71152616b27a804507ba2bb1fb1f
--- /dev/null
+++ b/public/static/assets/gougu/module/tinymce/tinymce.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.10.0 (2021-10-11)
+ */
+!function(){"use strict";function r(e){if(null===e)return"null";if(void 0===e)return"undefined";var t=typeof e;return"object"==t&&(Array.prototype.isPrototypeOf(e)||e.constructor&&"Array"===e.constructor.name)?"array":"object"==t&&(String.prototype.isPrototypeOf(e)||e.constructor&&"String"===e.constructor.name)?"string":t}function f(o){return m(function(e,t){if(e.length!==t.length)return!1;for(var n=e.length,r=0;r<n;r++)if(!o.eq(e[r],t[r]))return!1;return!0})}function d(l){return m(function(e,t){var n,r,o,i=Object.keys(e),a=Object.keys(t);if(r=f(g),o=function(e){return t=n,Array.prototype.slice.call(e).sort(t);var t},!m(function(e,t){return r.eq(o(e),o(t))}).eq(i,a))return!1;for(var u=i.length,s=0;s<u;s++){var c=i[s];if(!l.eq(e[c],t[c]))return!1}return!0})}function e(r){return function(e){return n=typeof(t=e),(null===t?"null":"object"==n&&(Array.prototype.isPrototypeOf(t)||t.constructor&&"Array"===t.constructor.name)?"array":"object"==n&&(String.prototype.isPrototypeOf(t)||t.constructor&&"String"===t.constructor.name)?"string":n)===r;var t,n}}function t(t){return function(e){return typeof e===t}}function n(t){return function(e){return t===e}}function K(e){return null==e}function V(e){return!K(e)}function te(){}function i(n,r){return function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return n(r.apply(null,e))}}function a(t,n){return function(e){return t(n(e))}}function J(e){return function(){return e}}function u(e){return e}function o(e,t){return e===t}var m=function(e){return{eq:e}},g=m(function(e,t){return e===t}),p=m(function(e,t){if(e===t)return!0;var n=r(e);return n===r(t)&&(-1!==["undefined","boolean","number","string","function","xml","null"].indexOf(n)?e===t:"array"===n?f(p).eq(e,t):"object"===n&&d(p).eq(e,t))}),X=e("string"),h=e("object"),S=e("array"),l=n(null),v=t("boolean"),b=n(void 0),y=t("function"),E=t("number");function A(r){for(var o=[],e=1;e<arguments.length;e++)o[e-1]=arguments[e];return function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var n=o.concat(e);return r.apply(null,n)}}function s(t){return function(e){return!t(e)}}function C(e){return e()}function x(e){e()}function c(){return N}var R=J(!1),w=J(!0),N={fold:function(e,t){return e()},isSome:R,isNone:w,getOr:u,getOrThunk:k,getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:J(null),getOrUndefined:J(void 0),or:u,orThunk:k,map:c,each:te,bind:c,exists:R,forall:w,filter:function(){return N},toArray:function(){return[]},toString:J("none()")};function k(e){return e()}function _(e,t){return ye.call(e,t)}function D(e,t){return-1<_(e,t)}function F(e,t){for(var n=0,r=e.length;n<r;n++)if(t(e[n],n))return!0;return!1}function T(e,t){for(var n=e.length,r=new Array(n),o=0;o<n;o++){var i=e[o];r[o]=t(i,o)}return r}function Y(e,t){for(var n=0,r=e.length;n<r;n++)t(e[n],n)}function O(e,t){for(var n=e.length-1;0<=n;n--)t(e[n],n)}function B(e,t){for(var n=[],r=[],o=0,i=e.length;o<i;o++){var a=e[o];(t(a,o)?n:r).push(a)}return{pass:n,fail:r}}function U(e,t){for(var n=[],r=0,o=e.length;r<o;r++){var i=e[r];t(i,r)&&n.push(i)}return n}function P(e,n,r){return O(e,function(e,t){r=n(r,e,t)}),r}function L(e,n,r){return Y(e,function(e,t){r=n(r,e,t)}),r}function I(e,t,n){for(var r=0,o=e.length;r<o;r++){var i=e[r];if(t(i,r))return ve.some(i);if(n(i,r))break}return ve.none()}function M(e,t){return I(e,t,R)}function z(e,t){for(var n=0,r=e.length;n<r;n++)if(t(e[n],n))return ve.some(n);return ve.none()}function H(e,t){return function(e){for(var t=[],n=0,r=e.length;n<r;++n){if(!S(e[n]))throw new Error("Arr.flatten item "+n+" was not an array, input: "+e);Ce.apply(t,e[n])}return t}(T(e,t))}function j(e,t){for(var n=0,r=e.length;n<r;++n)if(!0!==t(e[n],n))return!1;return!0}function q(e){var t=be.call(e,0);return t.reverse(),t}function $(e,t){return U(e,function(e){return!D(t,e)})}function W(e,t){var n=be.call(e,0);return n.sort(t),n}function G(e,t){return 0<=t&&t<e.length?ve.some(e[t]):ve.none()}function Q(e){return G(e,0)}function Z(e){return G(e,e.length-1)}function ee(e,t){for(var n=0;n<e.length;n++){var r=t(e[n],n);if(r.isSome())return r}return ve.none()}function ne(e,t){for(var n=we(e),r=0,o=n.length;r<o;r++){var i=n[r];t(e[i],i)}}function re(e,n){return Ee(e,function(e,t){return{k:t,v:n(e,t)}})}function oe(n){return function(e,t){n[t]=e}}function ie(e,n,r,o){return ne(e,function(e,t){(n(e,t)?r:o)(e,t)}),1}function ae(e,t){var n={};return ie(e,t,oe(n),te),n}function ue(e,t){return Ne(e,t)?ve.from(e[t]):ve.none()}function se(e,t){return Ne(e,t)&&void 0!==e[t]&&null!==e[t]}function ce(e,t,n){var r,o;if(!e)return!1;if(n=n||e,void 0!==e.length){for(r=0,o=e.length;r<o;r++)if(!1===t.call(n,e[r],r,e))return!1}else for(r in e)if(Ne(e,r)&&!1===t.call(n,e[r],r,e))return!1;return!0}function le(n,r){var o=[];return ce(n,function(e,t){o.push(r(e,t,n))}),o}function fe(n,r){var o=[];return ce(n,function(e,t){r&&!r(e,t,n)||o.push(e)}),o}function de(e,t){if(e)for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1}function me(e,t,n,r){for(var o=b(n)?e[0]:n,i=0;i<e.length;i++)o=t.call(r,o,e[i],i);return o}function ge(e,t,n){for(var r=0,o=e.length;r<o;r++)if(t.call(n,e[r],r,e))return r;return-1}function pe(e){return e[e.length-1]}var he=function(n){function e(){return o}function t(e){return e(n)}var r=J(n),o={fold:function(e,t){return t(n)},isSome:w,isNone:R,getOr:r,getOrThunk:r,getOrDie:r,getOrNull:r,getOrUndefined:r,or:e,orThunk:e,map:function(e){return he(e(n))},each:function(e){e(n)},bind:t,exists:t,forall:t,filter:function(e){return e(n)?o:N},toArray:function(){return[n]},toString:function(){return"some("+n+")"}};return o},ve={some:he,none:c,from:function(e){return null==e?N:he(e)}},be=Array.prototype.slice,ye=Array.prototype.indexOf,Ce=Array.prototype.push,xe=y(Array.from)?Array.from:function(e){return be.call(e)},we=Object.keys,Se=Object.hasOwnProperty,Ee=function(e,r){var o={};return ne(e,function(e,t){var n=r(e,t);o[n.k]=n.v}),o},Ne=function(e,t){return Se.call(e,t)},ke=Array.isArray,_e=function(){return(_e=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e}).apply(this,arguments)};function Ae(e,t,n){if(n||2===arguments.length)for(var r,o=0,i=t.length;o<i;o++)!r&&o in t||((r=r||Array.prototype.slice.call(t,0,o))[o]=t[o]);return e.concat(r||Array.prototype.slice.call(t))}function Re(n){var r,o=!1;return function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return o||(o=!0,r=n.apply(null,e)),r}}function De(e,t){var n=String(t).toLowerCase();return M(e,function(e){return e.search(n)})}function Te(e,t){return-1!==e.indexOf(t)}function Oe(t){return function(e){return e.replace(t,"")}}function Be(e){return 0<e.length}function Pe(e){return!Be(e)}function Le(t){return function(e){return Te(e,t)}}function Ie(e){return window.matchMedia(e).matches}function Me(e){return null==e?"":(""+e).replace(wt,"")}function Fe(e,t){return t?!("array"!==t||!ke(e))||typeof e===t:void 0!==e}function Ue(e,t){for(var n=[],r=function(e){return n.push(e),t(e)},o=t(e);(o=o.bind(r)).isSome(););return n}function ze(e,t){var n=e.dom;if(1!==n.nodeType)return!1;var r=n;if(void 0!==r.matches)return r.matches(t);if(void 0!==r.msMatchesSelector)return r.msMatchesSelector(t);if(void 0!==r.webkitMatchesSelector)return r.webkitMatchesSelector(t);if(void 0!==r.mozMatchesSelector)return r.mozMatchesSelector(t);throw new Error("Browser lacks native selectors")}function He(e){return 1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType||0===e.childElementCount}function je(e,t){return e.dom===t.dom}function Ve(e,t){return dt().browser.isIE()?(n=e.dom,r=t.dom,o=Node.DOCUMENT_POSITION_CONTAINED_BY,0!=(n.compareDocumentPosition(r)&o)):(i=e.dom)!==(a=t.dom)&&i.contains(a);var n,r,o,i,a}function qe(){return Xe(0,0)}function $e(e){function t(e){return function(){return n===e}}var n=e.current,r=e.version;return{current:n,version:r,isEdge:t("Edge"),isChrome:t("Chrome"),isIE:t("IE"),isOpera:t("Opera"),isFirefox:t(nt),isSafari:t("Safari")}}function We(e){function t(e){return function(){return n===e}}var n=e.current,r=e.version;return{current:n,version:r,isWindows:t(it),isiOS:t("iOS"),isAndroid:t(at),isOSX:t("OSX"),isLinux:t("Linux"),isSolaris:t(ut),isFreeBSD:t(st),isChromeOS:t(ct)}}function Ke(e){if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}}var Xe=function(e,t){return{major:e,minor:t}},Ye={nu:Xe,detect:function(e,t){var n,r,o=String(t).toLowerCase();return 0===e.length?qe():(r=function(e,t){for(var n=0;n<e.length;n++){var r=e[n];if(r.test(t))return r}}(e,n=o))?Xe(i(1),i(2)):{major:0,minor:0};function i(e){return Number(n.replace(r,"$"+e))}},unknown:qe},Ge=function(e,t){return""===(n=t)||e.length>=n.length&&e.substr(0,0+n.length)===n;var n},Je=Oe(/^\s+|\s+$/g),Qe=Oe(/^\s+/g),Ze=Oe(/\s+$/g),et=/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,tt={browsers:J([{name:"Edge",versionRegexes:[/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],search:function(e){return Te(e,"edge/")&&Te(e,"chrome")&&Te(e,"safari")&&Te(e,"applewebkit")}},{name:"Chrome",brand:"Chromium",versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/,et],search:function(e){return Te(e,"chrome")&&!Te(e,"chromeframe")}},{name:"IE",versionRegexes:[/.*?msie\ ?([0-9]+)\.([0-9]+).*/,/.*?rv:([0-9]+)\.([0-9]+).*/],search:function(e){return Te(e,"msie")||Te(e,"trident")}},{name:"Opera",versionRegexes:[et,/.*?opera\/([0-9]+)\.([0-9]+).*/],search:Le("opera")},{name:"Firefox",versionRegexes:[/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],search:Le("firefox")},{name:"Safari",versionRegexes:[et,/.*?cpu os ([0-9]+)_([0-9]+).*/],search:function(e){return(Te(e,"safari")||Te(e,"mobile/"))&&Te(e,"applewebkit")}}]),oses:J([{name:"Windows",search:Le("win"),versionRegexes:[/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]},{name:"iOS",search:function(e){return Te(e,"iphone")||Te(e,"ipad")},versionRegexes:[/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,/.*cpu os ([0-9]+)_([0-9]+).*/,/.*cpu iphone os ([0-9]+)_([0-9]+).*/]},{name:"Android",search:Le("android"),versionRegexes:[/.*?android\ ?([0-9]+)\.([0-9]+).*/]},{name:"OSX",search:Le("mac os x"),versionRegexes:[/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]},{name:"Linux",search:Le("linux"),versionRegexes:[]},{name:"Solaris",search:Le("sunos"),versionRegexes:[]},{name:"FreeBSD",search:Le("freebsd"),versionRegexes:[]},{name:"ChromeOS",search:Le("cros"),versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/]}])},nt="Firefox",rt=function(){return $e({current:void 0,version:Ye.unknown()})},ot=$e,it=(J("Edge"),J("Chrome"),J("IE"),J("Opera"),J(nt),J("Safari"),"Windows"),at="Android",ut="Solaris",st="FreeBSD",ct="ChromeOS",lt=function(){return We({current:void 0,version:Ye.unknown()})},ft=We,dt=(J(it),J("iOS"),J(at),J("Linux"),J("OSX"),J(ut),J(st),J(ct),Re(function(){return e=navigator.userAgent,t=ve.from(navigator.userAgentData),n=Ie,p=tt.browsers(),h=tt.oses(),v=t.bind(function(e){return r=p,ee(e.brands,function(t){var n=t.brand.toLowerCase();return M(r,function(e){var t;return n===(null===(t=e.brand)||void 0===t?void 0:t.toLowerCase())}).map(function(e){return{current:e.name,version:Ye.nu(parseInt(t.version,10),0)}})});var r}).orThunk(function(){return De(p,n=e).map(function(e){var t=Ye.detect(e.versionRegexes,n);return{current:e.name,version:t}});var n}).fold(rt,ot),b=De(h,r=e).map(function(e){var t=Ye.detect(e.versionRegexes,r);return{current:e.name,version:t}}).fold(lt,ft),{browser:v,os:b,deviceType:(i=v,a=e,u=n,s=(o=b).isiOS()&&!0===/ipad/i.test(a),c=o.isiOS()&&!s,f=(l=o.isiOS()||o.isAndroid())||u("(pointer:coarse)"),d=s||!c&&l&&u("(min-device-width:768px)"),m=c||l&&!d,g=i.isSafari()&&o.isiOS()&&!1===/safari/i.test(a),{isiPad:J(s),isiPhone:J(c),isTablet:J(d),isPhone:J(m),isTouch:J(f),isAndroid:o.isAndroid,isiOS:o.isiOS,isWebView:J(g),isDesktop:J(!m&&!d&&!g)})};var e,t,n,r,o,i,a,u,s,c,l,f,d,m,g,p,h,v,b})),mt=navigator.userAgent,gt=dt(),pt=gt.browser,ht=gt.os,vt=gt.deviceType,bt=/WebKit/.test(mt)&&!pt.isEdge(),yt="FormData"in window&&"FileReader"in window&&"URL"in window&&!!URL.createObjectURL,Ct=-1!==mt.indexOf("Windows Phone"),xt={opera:pt.isOpera(),webkit:bt,ie:!(!pt.isIE()&&!pt.isEdge())&&pt.version.major,gecko:pt.isFirefox(),mac:ht.isOSX()||ht.isiOS(),iOS:vt.isiPad()||vt.isiPhone(),android:ht.isAndroid(),contentEditable:!0,transparentSrc:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",caretAfter:!0,range:window.getSelection&&"Range"in window,documentMode:pt.isIE()?document.documentMode||7:10,fileApi:yt,ceFalse:!0,cacheSuffix:null,container:null,experimentalShadowDom:!1,canHaveCSP:!pt.isIE(),desktop:vt.isDesktop(),windowsPhone:Ct,browser:{current:pt.current,version:pt.version,isChrome:pt.isChrome,isEdge:pt.isEdge,isFirefox:pt.isFirefox,isIE:pt.isIE,isOpera:pt.isOpera,isSafari:pt.isSafari},os:{current:ht.current,version:ht.version,isAndroid:ht.isAndroid,isChromeOS:ht.isChromeOS,isFreeBSD:ht.isFreeBSD,isiOS:ht.isiOS,isLinux:ht.isLinux,isOSX:ht.isOSX,isSolaris:ht.isSolaris,isWindows:ht.isWindows},deviceType:{isDesktop:vt.isDesktop,isiPad:vt.isiPad,isiPhone:vt.isiPhone,isPhone:vt.isPhone,isTablet:vt.isTablet,isTouch:vt.isTouch,isWebView:vt.isWebView}},wt=/^\s*|\s*$/g,St=function(e,n,r,o){o=o||this,e&&ce(e=r?e[r]:e,function(e,t){return!1!==n.call(o,e,t,r)&&void St(e,n,r,o)})},Et={trim:Me,isArray:ke,is:Fe,toArray:function(e){if(ke(e))return e;for(var t=[],n=0,r=e.length;n<r;n++)t[n]=e[n];return t},makeMap:function(e,t,n){var r;for(t=t||",",n=n||{},r=(e="string"==typeof(e=e||[])?e.split(t):e).length;r--;)n[e[r]]={};return n},each:ce,map:le,grep:fe,inArray:de,hasOwn:Ne,extend:function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];for(var r=0;r<t.length;r++){var o,i,a=t[r];for(o in a)!Ne(a,o)||void 0!==(i=a[o])&&(e[o]=i)}return e},create:function(e,t,n){var r,o,i,a=this,u=0,s=(e=/^((static) )?([\w.]+)(:([\w.]+))?/.exec(e))[3].match(/(^|\.)(\w+)$/i)[2],c=a.createNS(e[3].replace(/\.\w+$/,""),n);if(!c[s]){if("static"===e[2])return c[s]=t,void(this.onCreate&&this.onCreate(e[2],e[3],c[s]));t[s]||(t[s]=function(){},u=1),c[s]=t[s],a.extend(c[s].prototype,t),e[5]&&(r=a.resolve(e[5]).prototype,o=e[5].match(/\.(\w+)$/i)[1],i=c[s],c[s]=u?function(){return r[o].apply(this,arguments)}:function(){return this.parent=r[o],i.apply(this,arguments)},c[s].prototype[s]=c[s],a.each(r,function(e,t){c[s].prototype[t]=r[t]}),a.each(t,function(e,t){r[t]?c[s].prototype[t]=function(){return this.parent=r[t],e.apply(this,arguments)}:t!==s&&(c[s].prototype[t]=e)})),a.each(t.static,function(e,t){c[s][t]=e})}},walk:St,createNS:function(e,t){var n,r;for(t=t||window,e=e.split("."),n=0;n<e.length;n++)t[r=e[n]]||(t[r]={}),t=t[r];return t},resolve:function(e,t){var n,r;for(t=t||window,n=0,r=(e=e.split(".")).length;n<r&&(t=t[e[n]]);n++);return t},explode:function(e,t){return!e||Fe(e,"array")?e:le(e.split(t||","),Me)},_addCacheSuffix:function(e){var t=xt.cacheSuffix;return t&&(e+=(-1===e.indexOf("?")?"?":"&")+t),e}},Nt={fromHtml:function(e,t){var n=(t||document).createElement("div");if(n.innerHTML=e,!n.hasChildNodes()||1<n.childNodes.length)throw console.error("HTML does not have a single root node",e),new Error("HTML must have a single root node");return Ke(n.childNodes[0])},fromTag:function(e,t){var n=(t||document).createElement(e);return Ke(n)},fromText:function(e,t){var n=(t||document).createTextNode(e);return Ke(n)},fromDom:Ke,fromPoint:function(e,t,n){return ve.from(e.dom.elementFromPoint(t,n)).map(Ke)}};function kt(e){return e.dom.nodeName.toLowerCase()}function _t(e){return e.dom.nodeType}function At(t){return function(e){return _t(e)===t}}function Rt(e){return Nt.fromDom(e.dom.ownerDocument)}function Dt(e){return An(e)?e:Rt(e)}function Tt(e){return Nt.fromDom(Dt(e).dom.defaultView)}function Ot(e){return ve.from(e.dom.parentNode).map(Nt.fromDom)}function Bt(e){return ve.from(e.dom.previousSibling).map(Nt.fromDom)}function Pt(e){return ve.from(e.dom.nextSibling).map(Nt.fromDom)}function Lt(e){return q(Ue(e,Bt))}function It(e){return Ue(e,Pt)}function Mt(e,t){var n=e.dom.childNodes;return ve.from(n[t]).map(Nt.fromDom)}function Ft(e){return Mt(e,0)}function Ut(e){return Mt(e,e.dom.childNodes.length-1)}function zt(e){return e.dom.childNodes.length}function Ht(e){return Rn(e)&&V(e.dom.host)}function jt(t){return Ht(t)?t:function(){var e=Dt(t).dom.head;if(null==e)throw new Error("Head is not available yet");return Nt.fromDom(e)}()}function Vt(e){return Nt.fromDom(e.dom.host)}function qt(t,n){Ot(t).each(function(e){e.dom.insertBefore(n.dom,t.dom)})}function $t(e,t){Pt(e).fold(function(){Ot(e).each(function(e){Pn(e,t)})},function(e){qt(e,t)})}function Wt(t,n){Ft(t).fold(function(){Pn(t,n)},function(e){t.dom.insertBefore(n.dom,e.dom)})}function Kt(t,e){Y(e,function(e){Pn(t,e)})}function Xt(e){e.dom.textContent="",Y(Dn(e),function(e){Ln(e)})}function Yt(e){var t,n=Dn(e);0<n.length&&(t=e,Y(n,function(e){qt(t,e)})),Ln(e)}function Gt(e,t){return void 0!==e?e:void 0!==t?t:0}function Jt(e){var t=void 0!==e?e.dom:document,n=t.body.scrollLeft||t.documentElement.scrollLeft,r=t.body.scrollTop||t.documentElement.scrollTop;return Fn(n,r)}function Qt(e,t,n){var r=(void 0!==n?n.dom:document).defaultView;r&&r.scrollTo(e,t)}function Zt(e,t){dt().browser.isSafari()&&y(e.dom.scrollIntoViewIfNeeded)?e.dom.scrollIntoViewIfNeeded(!1):e.dom.scrollIntoView(t)}function en(e,t,n,r){return{x:e,y:t,width:n,height:r,right:e+n,bottom:t+r}}function tn(e){var r=void 0===e?window:e,t=r.document,o=Jt(Nt.fromDom(t)),n=void 0===r?window:r;return(dt().browser.isFirefox()?ve.none():ve.from(n.visualViewport)).fold(function(){var e=r.document.documentElement,t=e.clientWidth,n=e.clientHeight;return en(o.left,o.top,t,n)},function(e){return en(Math.max(e.pageLeft,o.left),Math.max(e.pageTop,o.top),e.width,e.height)})}function nn(t){return function(e){return!!e&&e.nodeType===t}}function rn(e){return e&&!Object.getPrototypeOf(e)}function on(e){var n=e.map(function(e){return e.toLowerCase()});return function(e){if(e&&e.nodeName){var t=e.nodeName.toLowerCase();return D(n,t)}return!1}}function an(r,e){var o=e.toLowerCase().split(" ");return function(e){if(zn(e))for(var t=0;t<o.length;t++){var n=e.ownerDocument.defaultView.getComputedStyle(e,null);if((n?n.getPropertyValue(r):null)===o[t])return!0}return!1}}function un(t){return function(e){return zn(e)&&e.hasAttribute(t)}}function sn(e){return zn(e)&&e.hasAttribute("data-mce-bogus")}function cn(e){return zn(e)&&"TABLE"===e.tagName}function ln(t){return function(e){if(zn(e)){if(e.contentEditable===t)return!0;if(e.getAttribute("data-mce-contenteditable")===t)return!0}return!1}}function fn(e,t,n){return void 0===n&&(n=o),e.exists(function(e){return n(e,t)})}function dn(e,t,n){return e.isSome()&&t.isSome()?ve.some(n(e.getOrDie(),t.getOrDie())):ve.none()}function mn(e){return void 0!==e.style&&y(e.style.getPropertyValue)}function gn(e,t,n){if(!(X(n)||v(n)||E(n)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",n,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,n+"")}function pn(e,t,n){gn(e.dom,t,n)}function hn(e,t){var n=e.dom;ne(t,function(e,t){gn(n,t,e)})}function vn(e,t){var n=e.dom.getAttribute(t);return null===n?void 0:n}function bn(e,t){return ve.from(vn(e,t))}function yn(e,t){e.dom.removeAttribute(t)}function Cn(e,t){var n=e.dom;ne(t,function(e,t){!function(e,t,n){if(!X(n))throw console.error("Invalid call to CSS.set. Property ",t,":: Value ",n,":: Element ",e),new Error("CSS value must be a string: "+n);mn(e)&&e.style.setProperty(t,n)}(n,t,e)})}function xn(e,t){var n=e.dom,r=window.getComputedStyle(n).getPropertyValue(t);return""!==r||In(e)?r:Qn(n,t)}function wn(e,t){var n=e.dom,r=Qn(n,t);return ve.from(r).filter(function(e){return 0<e.length})}function Sn(e){var t={},n=e.dom;if(mn(n))for(var r=0;r<n.style.length;r++){var o=n.style.item(r);t[o]=n.style[o]}return t}function En(e){return M(e,kn)}function Nn(e,t){return e.children&&D(e.children,t)}"undefined"!=typeof window||Function("return this;")();var kn=At(1),_n=At(3),An=At(9),Rn=At(11),Dn=function(e){return T(e.dom.childNodes,Nt.fromDom)},Tn=y(Element.prototype.attachShadow)&&y(Node.prototype.getRootNode),On=J(Tn),Bn=Tn?function(e){return Nt.fromDom(e.dom.getRootNode())}:Dt,Pn=function(e,t){e.dom.appendChild(t.dom)},Ln=function(e){var t=e.dom;null!==t.parentNode&&t.parentNode.removeChild(t)},In=function(e){var t=_n(e)?e.dom.parentNode:e.dom;if(null==t||null===t.ownerDocument)return!1;var n=t.ownerDocument,r=Nt.fromDom(t),o=Bn(r);return(Ht(o)?ve.some(o):ve.none()).fold(function(){return n.body.contains(t)},a(In,Vt))},Mn=function(n,r){return{left:n,top:r,translate:function(e,t){return Mn(n+e,r+t)}}},Fn=Mn,Un=function(e){var t,n=e.dom,r=n.ownerDocument.body;return r===n?Fn(r.offsetLeft,r.offsetTop):In(e)?(t=n.getBoundingClientRect(),Fn(t.left,t.top)):Fn(0,0)},zn=nn(1),Hn=on(["textarea","input"]),jn=nn(3),Vn=nn(8),qn=nn(9),$n=nn(11),Wn=on(["br"]),Kn=on(["img"]),Xn=ln("true"),Yn=ln("false"),Gn=on(["td","th"]),Jn=on(["video","audio","object","embed"]),Qn=function(e,t){return mn(e)?e.style.getPropertyValue(t):""},Zn=dt().browser,er={},tr={exports:er};function nr(e){setTimeout(function(){throw e},0)}!function(){var e=this,t=function(){var e,t,n,r={exports:{}};function o(){}function i(e){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof e)throw new TypeError("not a function");this._state=0,this._handled=!1,this._value=void 0,this._deferreds=[],f(e,this)}function a(n,r){for(;3===n._state;)n=n._value;0!==n._state?(n._handled=!0,i._immediateFn(function(){var e,t=1===n._state?r.onFulfilled:r.onRejected;if(null!==t){try{e=t(n._value)}catch(e){return void s(r.promise,e)}u(r.promise,e)}else(1===n._state?u:s)(r.promise,n._value)})):n._deferreds.push(r)}function u(t,e){try{if(e===t)throw new TypeError("A promise cannot be resolved with itself.");if(e&&("object"==typeof e||"function"==typeof e)){var n=e.then;if(e instanceof i)return t._state=3,t._value=e,void c(t);if("function"==typeof n)return void f((r=n,o=e,function(){r.apply(o,arguments)}),t)}t._state=1,t._value=e,c(t)}catch(e){s(t,e)}var r,o}function s(e,t){e._state=2,e._value=t,c(e)}function c(e){2===e._state&&0===e._deferreds.length&&i._immediateFn(function(){e._handled||i._unhandledRejectionFn(e._value)});for(var t=0,n=e._deferreds.length;t<n;t++)a(e,e._deferreds[t]);e._deferreds=null}function l(e,t,n){this.onFulfilled="function"==typeof e?e:null,this.onRejected="function"==typeof t?t:null,this.promise=n}function f(e,t){var n=!1;try{e(function(e){n||(n=!0,u(t,e))},function(e){n||(n=!0,s(t,e))})}catch(e){if(n)return;n=!0,s(t,e)}}e=r,t="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=setTimeout,i.prototype.catch=function(e){return this.then(null,e)},i.prototype.then=function(e,t){var n=new this.constructor(o);return a(this,new l(e,t,n)),n},i.all=function(e){var u=Array.prototype.slice.call(e);return new i(function(o,i){if(0===u.length)return o([]);for(var a=u.length,e=0;e<u.length;e++)!function t(n,e){try{if(e&&("object"==typeof e||"function"==typeof e)){var r=e.then;if("function"==typeof r)return r.call(e,function(e){t(n,e)},i),0}u[n]=e,0==--a&&o(u)}catch(e){i(e)}}(e,u[e])})},i.resolve=function(t){return t&&"object"==typeof t&&t.constructor===i?t:new i(function(e){e(t)})},i.reject=function(n){return new i(function(e,t){t(n)})},i.race=function(o){return new i(function(e,t){for(var n=0,r=o.length;n<r;n++)o[n].then(e,t)})},i._immediateFn="function"==typeof setImmediate?function(e){setImmediate(e)}:function(e){n(e,0)},i._unhandledRejectionFn=function(e){"undefined"!=typeof console&&console&&console.warn("Possible Unhandled Promise Rejection:",e)},i._setImmediateFn=function(e){i._immediateFn=e},i._setUnhandledRejectionFn=function(e){i._unhandledRejectionFn=e},e.exports?e.exports=i:t.Promise||(t.Promise=i);var d=r.exports;return{boltExport:("undefined"!=typeof window?window:Function("return this;")()).Promise||d}};"object"==typeof er&&void 0!==tr?tr.exports=t():(e="undefined"!=typeof globalThis?globalThis:e||self).EphoxContactWrapper=t()}();function rr(e){return sr(function(){return new ir(e)})}function or(a){if(!S(a))throw new Error("cases must be an array");if(0===a.length)throw new Error("there must be at least one case");var u=[],n={};return Y(a,function(e,r){var t=we(e);if(1!==t.length)throw new Error("one and only one name per case");var o=t[0],i=e[o];if(void 0!==n[o])throw new Error("duplicate key detected:"+o);if("cata"===o)throw new Error("cannot have a case named cata (sorry)");if(!S(i))throw new Error("case arguments must be an array");u.push(o),n[o]=function(){for(var n=[],e=0;e<arguments.length;e++)n[e]=arguments[e];var t=n.length;if(t!==i.length)throw new Error("Wrong number of arguments to case "+o+". Expected "+i.length+" ("+i+"), got "+t);return{fold:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];if(e.length!==a.length)throw new Error("Wrong number of arguments to fold. Expected "+a.length+", got "+e.length);return e[r].apply(null,n)},match:function(e){var t=we(e);if(u.length!==t.length)throw new Error("Wrong number of arguments to match. Expected: "+u.join(",")+"\nActual: "+t.join(","));if(!j(u,function(e){return D(t,e)}))throw new Error("Not all branches were specified when using match. Specified: "+t.join(", ")+"\nRequired: "+u.join(", "));return e[o].apply(null,n)},log:function(e){console.log(e,{constructors:u,constructor:o,params:n})}}}}),n}var ir=tr.exports.boltExport,ar=function(e){function r(e){o()?i(e):t.push(e)}var n=ve.none(),t=[],o=function(){return n.isSome()},i=function(t){n.each(function(e){setTimeout(function(){t(e)},0)})};return e(function(e){o()||(n=ve.some(e),Y(t,i),t=[])}),{get:r,map:function(n){return ar(function(t){r(function(e){t(n(e))})})},isReady:o}},ur={nu:ar,pure:function(t){return ar(function(e){e(t)})}},sr=function(n){function e(e){n().then(e,nr)}return{map:function(e){return sr(function(){return n().then(e)})},bind:function(t){return sr(function(){return n().then(function(e){return t(e).toPromise()})})},anonBind:function(e){return sr(function(){return n().then(function(){return e.toPromise()})})},toLazy:function(){return ur.nu(e)},toCached:function(){var e=null;return sr(function(){return e=null===e?n():e})},toPromise:n,get:e}},cr=function(n){return{isValue:w,isError:R,getOr:J(n),getOrThunk:J(n),getOrDie:J(n),or:function(e){return cr(n)},orThunk:function(e){return cr(n)},fold:function(e,t){return t(n)},map:function(e){return cr(e(n))},mapError:function(e){return cr(n)},each:function(e){e(n)},bind:function(e){return e(n)},exists:function(e){return e(n)},forall:function(e){return e(n)},toOptional:function(){return ve.some(n)}}},lr=function(n){return{isValue:R,isError:w,getOr:u,getOrThunk:function(e){return e()},getOrDie:function(){return e=String(n),function(){throw new Error(e)}();var e},or:u,orThunk:function(e){return e()},fold:function(e,t){return e(n)},map:function(e){return lr(n)},mapError:function(e){return lr(e(n))},each:te,bind:function(e){return lr(n)},exists:R,forall:w,toOptional:ve.none}},fr={value:cr,error:lr,fromOption:function(e,t){return e.fold(function(){return lr(t)},cr)}};function dr(e){return e.fold(u,u)}function mr(e,t,n,r,o){return e(n,r)?ve.some(n):y(o)&&o(n)?ve.none():t(n,r,o)}function gr(e,t,n){for(var r=e.dom,o=y(n)?n:R;r.parentNode;){var r=r.parentNode,i=Nt.fromDom(r);if(t(i))return ve.some(i);if(o(i))break}return ve.none()}function pr(e,t,n){return mr(function(e,t){return t(e)},gr,e,t,n)}function hr(e,t,n){return gr(e,function(e){return ze(e,t)},n)}function vr(e,t){return n=t,He(r=void 0===e?document:e.dom)?ve.none():ve.from(r.querySelector(n)).map(Nt.fromDom);var n,r}function br(e,t,n){return mr(ze,hr,e,t,n)}function yr(e,t){return"number"!=typeof t&&(t=0),setTimeout(e,t)}function Cr(e,t){return"number"!=typeof t&&(t=1),setInterval(e,t)}function xr(n,r){function e(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];clearTimeout(o),o=yr(function(){n.apply(this,e)},r)}var o;return e.stop=function(){clearTimeout(o)},e}function wr(m,g){function n(e,t,n){var r,o=Et._addCacheSuffix(e),i=ue(h,o).getOrThunk(function(){return{id:"mce-u"+p++,passed:[],failed:[],count:0}});function a(e,t){for(var n=e.length;n--;)e[n]();i.status=t,i.passed=[],i.failed=[],r&&(r.onload=null,r.onerror=null,r=null)}function u(){return a(i.passed,2),0}function s(){return a(i.failed,3)}(h[o]=i).count++;var c,l,f,d=function(){var e=d;!function(){for(var e=m.styleSheets,t=e.length;t--;){var n=e[t].ownerNode;if(n&&n.id===r.id)return u(),1}}()&&(Date.now()-l<y?_r.setTimeout(e):s())};t&&i.passed.push(t),n&&i.failed.push(n),1!==i.status&&(2!==i.status?3!==i.status?(i.status=1,hn(c=Nt.fromTag("link",b.dom),{rel:"stylesheet",type:"text/css",id:i.id}),l=Date.now(),g.contentCssCors&&pn(c,"crossOrigin","anonymous"),g.referrerPolicy&&pn(c,"referrerpolicy",g.referrerPolicy),(r=c.dom).onload=d,r.onerror=s,f=c,Pn(jt(v),f),pn(c,"href",o)):s():u())}function o(t){return rr(function(e){n(t,i(e,J(fr.value(t))),i(e,J(fr.error(t))))})}function t(e){var n=Et._addCacheSuffix(e);ue(h,n).each(function(e){var t;0==--e.count&&(delete h[n],t=e.id,vr(jt(v),"#"+t).each(Ln))})}void 0===g&&(g={});var p=0,h={},v=Nt.fromDom(m),b=Dt(v),y=g.maxLoadTime||5e3;return{load:n,loadAll:function(e,n,r){var a,t=T(e,o);a=t,rr(function(r){var o=[],i=0;0===a.length?r([]):Y(a,function(e,t){var n;e.get((n=t,function(e){o[n]=e,++i>=a.length&&r(o)}))})}).get(function(e){var t=B(e,function(e){return e.isValue()});0<t.fail.length?r(t.fail.map(dr)):n(t.pass.map(dr))})},unload:t,unloadAll:function(e){Y(e,function(e){t(e)})},_setReferrerPolicy:function(e){g.referrerPolicy=e}}}or([{bothErrors:["error1","error2"]},{firstError:["error1","value2"]},{secondError:["value1","error2"]},{bothValues:["value1","value2"]}]);var Sr,Er,Nr=function(e,t){return M(e.dom.childNodes,function(e){return t(Nt.fromDom(e))}).map(Nt.fromDom)},kr=window.Promise||ir,_r={requestAnimationFrame:function(e,t){Sr?Sr.then(e):Sr=new kr(function(e){(function(e,t){for(var n=window.requestAnimationFrame,r=["ms","moz","webkit"],o=0;o<r.length&&!n;o++)n=window[r[o]+"RequestAnimationFrame"];(n=n||function(e){window.setTimeout(e,0)})(e,t)})(e,t=t||document.body)}).then(e)},setTimeout:yr,setInterval:Cr,setEditorTimeout:function(e,t,n){return yr(function(){e.removed||t()},n)},setEditorInterval:function(e,t,n){var r=Cr(function(){e.removed?clearInterval(r):t()},n);return r},debounce:xr,throttle:xr,clearInterval:function(e){return clearInterval(e)},clearTimeout:function(e){return clearTimeout(e)}},Ar=(Er=new WeakMap,{forElement:function(e,t){var n=Bn(e).dom;return ve.from(Er.get(n)).getOrThunk(function(){var e=wr(n,t);return Er.set(n,e),e})}}),Rr=(Dr.prototype.current=function(){return this.node},Dr.prototype.next=function(e){return this.node=this.findSibling(this.node,"firstChild","nextSibling",e),this.node},Dr.prototype.prev=function(e){return this.node=this.findSibling(this.node,"lastChild","previousSibling",e),this.node},Dr.prototype.prev2=function(e){return this.node=this.findPreviousNode(this.node,"lastChild","previousSibling",e),this.node},Dr.prototype.findSibling=function(e,t,n,r){var o,i;if(e){if(!r&&e[t])return e[t];if(e!==this.rootNode){if(o=e[n])return o;for(i=e.parentNode;i&&i!==this.rootNode;i=i.parentNode)if(o=i[n])return o}}},Dr.prototype.findPreviousNode=function(e,t,n,r){var o,i,a;if(e&&(o=e[n],!this.rootNode||o!==this.rootNode)){if(o){if(!r)for(a=o[t];a;a=a[t])if(!a[t])return a;return o}return(i=e.parentNode)&&i!==this.rootNode?i:void 0}},Dr);function Dr(e,t){this.node=e,this.rootNode=t,this.current=this.current.bind(this),this.next=this.next.bind(this),this.prev=this.prev.bind(this),this.prev2=this.prev2.bind(this)}function Tr(t){var n;return function(e){return n=n||function(e,t){for(var n={},r=0,o=e.length;r<o;r++){var i=e[r];n[String(i)]=t(i,r)}return n}(t,w),Ne(n,kt(e))}}function Or(e){return kn(e)&&!lo(e)}function Br(e){return kn(e)&&"br"===kt(e)}function Pr(e){return Eo(e)&&(e=e.parentNode),So(e)&&e.hasAttribute("data-mce-caret")}function Lr(e){return Eo(e)&&xo(e.data)}function Ir(e){return Pr(e)||Lr(e)}function Mr(e){return e.firstChild!==e.lastChild||!Wn(e.firstChild)}function Fr(e){var t=e.container();return!!jn(t)&&(t.data.charAt(e.offset())===Co||e.isAtStart()&&Lr(t.previousSibling))}function Ur(e){var t=e.container();return!!jn(t)&&(t.data.charAt(e.offset()-1)===Co||e.isAtEnd()&&Lr(t.nextSibling))}function zr(e){return e&&e.hasAttribute("data-mce-caret")?(sn(n=(t=e.getElementsByTagName("br"))[t.length-1])&&n.parentNode.removeChild(n),e.removeAttribute("data-mce-caret"),e.removeAttribute("data-mce-bogus"),e.removeAttribute("style"),e.removeAttribute("_moz_abspos"),e):null;var t,n}function Hr(e){return Pr(e.startContainer)}function jr(e){return!Po(e)&&(Do(e)?!To(e.parentNode):Oo(e)||Ro(e)||Bo(e)||Lo(e))}function Vr(e,t){return jr(e)&&function(e,t){for(e=e.parentNode;e&&e!==t;e=e.parentNode){if(Lo(e))return!1;if(_o(e))return!0}return!0}(e,t)}function qr(e){return Io.test(e)}function $r(e,t){return jr(e)&&!1===(a=t,jn(i=e)&&qr(i.data)&&!1===(n=i,r=Nt.fromDom(a),hr(Nt.fromDom(n),"pre,code",A(je,r)).isSome()))||zn(o=e)&&"A"===o.nodeName&&!o.hasAttribute("href")&&(o.hasAttribute("name")||o.hasAttribute("id"))||Mo(e);var n,r,o,i,a}function Wr(e,t){return function(e,t){var n=0;if($r(e,e))return!1;var r=e.firstChild;if(!r)return!0;var o=new Rr(r,e);do{if(t){if(Uo(r)){r=o.next(!0);continue}if(Fo(r)){r=o.next();continue}}if(Wn(r))n++,r=o.next();else{if($r(r,e))return!1;r=o.next()}}while(r);return n<=1}(e.dom,t=void 0===t||t)}function Kr(e,t){return V(e)&&($r(e,t)||Or(Nt.fromDom(e)))}function Xr(e){return"span"===e.nodeName.toLowerCase()&&"bookmark"===e.getAttribute("data-mce-type")}function Yr(e,t){var n,r,o,i={};if(e){for(e=e.split(","),t=t||10,n=0;n<e.length;n+=2)r=String.fromCharCode(parseInt(e[n],t)),Ko[r]||(o="&"+e[n+1]+";",i[r]=o,i[o]=r);return i}}function Gr(e,t){return e.replace(t?jo:Vo,function(e){return Ko[e]||e})}function Jr(e,t){return e.replace(t?jo:Vo,function(e){return 1<e.length?"&#"+(1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320)+65536)+";":Ko[e]||"&#"+e.charCodeAt(0)+";"})}function Qr(e,t,n){return n=n||Yo,e.replace(t?jo:Vo,function(e){return Ko[e]||n[e]||e})}function Zr(e,t){return(e=Et.trim(e))?e.split(t||" "):[]}function eo(e,n){var r;return e&&(r={},ei(e="string"==typeof e?{"*":e}:e,function(e,t){r[t]=r[t.toUpperCase()]=("map"===n?Zo:ni)(e,/[, ]/)})),r}function to(i){function e(e,t,n){var r=i[e];return r?r=Zo(r,/[, ]/,Zo(r.toUpperCase(),/[, ]/)):(r=Jo[e])||(r=Zo(t," ",Zo(t.toUpperCase()," ")),r=ti(r,n),Jo[e]=r),r}var t,s,n,r,o,a,u,c,S={},l={},E=[],f={},d={},m=(t=(i=i||{}).schema,c={},Jo[t]||(s="id accesskey class dir lang style tabindex title role",n="address blockquote div dl fieldset form h1 h2 h3 h4 h5 h6 hr menu ol p pre table ul",r="a abbr b bdo br button cite code del dfn em embed i iframe img input ins kbd label map noscript object q s samp script select small span strong sub sup textarea u var #text #comment","html4"!==t&&(s+=" contenteditable contextmenu draggable dropzone hidden spellcheck translate",n+=" article aside details dialog figure main header footer hgroup section nav",r+=" audio canvas command datalist mark meter output picture progress time wbr video ruby bdi keygen"),"html5-strict"!==t&&(s+=" xml:lang",r=[r,u="acronym applet basefont big font strike tt"].join(" "),ei(Zr(u),function(e){g(e,"",r)}),n=[n,a="center dir isindex noframes"].join(" "),o=[n,r].join(" "),ei(Zr(a),function(e){g(e,"",o)})),o=o||[n,r].join(" "),g("html","manifest","head body"),g("head","","base command link meta noscript script style title"),g("title hr noscript br"),g("base","href target"),g("link","href rel media hreflang type sizes hreflang"),g("meta","name http-equiv content charset"),g("style","media type scoped"),g("script","src async defer type charset"),g("body","onafterprint onbeforeprint onbeforeunload onblur onerror onfocus onhashchange onload onmessage onoffline ononline onpagehide onpageshow onpopstate onresize onscroll onstorage onunload",o),g("address dt dd div caption","",o),g("h1 h2 h3 h4 h5 h6 pre p abbr code var samp kbd sub sup i b u bdo span legend em strong small s cite dfn","",r),g("blockquote","cite",o),g("ol","reversed start type","li"),g("ul","","li"),g("li","value",o),g("dl","","dt dd"),g("a","href target rel media hreflang type",r),g("q","cite",r),g("ins del","cite datetime",o),g("img","src sizes srcset alt usemap ismap width height"),g("iframe","src name width height",o),g("embed","src type width height"),g("object","data type typemustmatch name usemap form width height",[o,"param"].join(" ")),g("param","name value"),g("map","name",[o,"area"].join(" ")),g("area","alt coords shape href target rel media hreflang type"),g("table","border","caption colgroup thead tfoot tbody tr"+("html4"===t?" col":"")),g("colgroup","span","col"),g("col","span"),g("tbody thead tfoot","","tr"),g("tr","","td th"),g("td","colspan rowspan headers",o),g("th","colspan rowspan headers scope abbr",o),g("form","accept-charset action autocomplete enctype method name novalidate target",o),g("fieldset","disabled form name",[o,"legend"].join(" ")),g("label","form for",r),g("input","accept alt autocomplete checked dirname disabled form formaction formenctype formmethod formnovalidate formtarget height list max maxlength min multiple name pattern readonly required size src step type value width"),g("button","disabled form formaction formenctype formmethod formnovalidate formtarget name type value","html4"===t?o:r),g("select","disabled form multiple name required size","option optgroup"),g("optgroup","disabled label","option"),g("option","disabled label selected value"),g("textarea","cols dirname disabled form maxlength name readonly required rows wrap"),g("menu","type label",[o,"li"].join(" ")),g("noscript","",o),"html4"!==t&&(g("wbr"),g("ruby","",[r,"rt rp"].join(" ")),g("figcaption","",o),g("mark rt rp summary bdi","",r),g("canvas","width height",o),g("video","src crossorigin poster preload autoplay mediagroup loop muted controls width height buffered",[o,"track source"].join(" ")),g("audio","src crossorigin preload autoplay mediagroup loop muted controls buffered volume",[o,"track source"].join(" ")),g("picture","","img source"),g("source","src srcset type media sizes"),g("track","kind src srclang label default"),g("datalist","",[r,"option"].join(" ")),g("article section nav aside main header footer","",o),g("hgroup","","h1 h2 h3 h4 h5 h6"),g("figure","",[o,"figcaption"].join(" ")),g("time","datetime",r),g("dialog","open",o),g("command","type label icon disabled checked radiogroup command"),g("output","for form name",r),g("progress","value max",r),g("meter","value min max low high optimum",r),g("details","open",[o,"summary"].join(" ")),g("keygen","autofocus challenge disabled form keytype name")),"html5-strict"!==t&&(p("script","language xml:space"),p("style","xml:space"),p("object","declare classid code codebase codetype archive standby align border hspace vspace"),p("embed","align name hspace vspace"),p("param","valuetype type"),p("a","charset name rev shape coords"),p("br","clear"),p("applet","codebase archive code object alt name width height align hspace vspace"),p("img","name longdesc align border hspace vspace"),p("iframe","longdesc frameborder marginwidth marginheight scrolling align"),p("font basefont","size color face"),p("input","usemap align"),p("select"),p("textarea"),p("h1 h2 h3 h4 h5 h6 div p legend caption","align"),p("ul","type compact"),p("li","type"),p("ol dl menu dir","compact"),p("pre","width xml:space"),p("hr","align noshade size width"),p("isindex","prompt"),p("table","summary width frame rules cellspacing cellpadding align bgcolor"),p("col","width align char charoff valign"),p("colgroup","width align char charoff valign"),p("thead","align char charoff valign"),p("tr","align char charoff valign bgcolor"),p("th","axis align char charoff valign nowrap bgcolor width height"),p("form","accept"),p("td","abbr axis scope align char charoff valign nowrap bgcolor width height"),p("tfoot","align char charoff valign"),p("tbody","align char charoff valign"),p("area","nohref"),p("body","background bgcolor text link vlink alink")),"html4"!==t&&(p("input button select textarea","autofocus"),p("input textarea","placeholder"),p("a","download"),p("link script img","crossorigin"),p("img","loading"),p("iframe","sandbox seamless allowfullscreen loading")),ei(Zr("a form meter progress dfn"),function(e){c[e]&&delete c[e].children[e]}),delete c.caption.children.table,delete c.script,Jo[t]=c));function g(e,t,n){function r(e,t){for(var n={},r=0,o=e.length;r<o;r++)n[e[r]]=t||{};return n}var o,i;t=t||"","string"==typeof(n=n||[])&&(n=Zr(n));for(var a=Zr(e),u=a.length;u--;)i={attributes:r(o=Zr([s,t].join(" "))),attributesOrder:o,children:r(n,Qo)},c[a[u]]=i}function p(e,t){for(var n,r,o,i=Zr(e),a=i.length,u=Zr(t);a--;)for(n=c[i[a]],r=0,o=u.length;r<o;r++)n.attributes[u[r]]={},n.attributesOrder.push(u[r])}!1===i.verify_html&&(i.valid_elements="*[*]");var h=eo(i.valid_styles),v=eo(i.invalid_styles,"map"),b=eo(i.valid_classes,"map"),y=e("whitespace_elements","pre script noscript style textarea video audio iframe object code"),C=e("self_closing_elements","colgroup dd dt li option p td tfoot th thead tr"),x=e("short_ended_elements","area base basefont br col frame hr img input isindex link meta param embed source wbr track"),w=e("boolean_attributes","checked compact declare defer disabled ismap multiple nohref noresize noshade nowrap readonly selected autoplay loop controls"),N="td th iframe video audio object script code",k=e("non_empty_elements",N+" pre",x),_=e("move_caret_before_on_enter_elements",N+" table",x),A=e("text_block_elements","h1 h2 h3 h4 h5 h6 p div address pre form blockquote center dir fieldset header footer article section hgroup aside main nav figure"),R=e("block_elements","hr table tbody thead tfoot th tr td li ol ul caption dl dt dd noscript menu isindex option datalist select optgroup figcaption details summary",A),D=e("text_inline_elements","span strong b em i font strike u var cite dfn code mark q sup sub samp");function T(e){return new RegExp("^"+e.replace(/([?+*])/g,".$1")+"$")}function O(e){var t,n,r,o,i,a,u,s,c,l,f,d,m,g,p,h,v,b,y=/^([#+\-])?([^\[!\/]+)(?:\/([^\[!]+))?(?:(!?)\[([^\]]+)])?$/,C=/^([!\-])?(\w+[\\:]:\w+|[^=:<]+)?(?:([=:<])(.*))?$/,x=/[*?+]/;if(e){var w=Zr(e,",");for(S["@"]&&(h=S["@"].attributes,v=S["@"].attributesOrder),t=0,n=w.length;t<n;t++)if(i=y.exec(w[t])){if(g=i[1],c=i[2],p=i[3],s=i[5],a={attributes:d={},attributesOrder:m=[]},"#"===g&&(a.paddEmpty=!0),"-"===g&&(a.removeEmpty=!0),"!"===i[4]&&(a.removeEmptyAttrs=!0),h&&(ne(h,function(e,t){d[t]=e}),m.push.apply(m,v)),s)for(r=0,o=(s=Zr(s,"|")).length;r<o;r++)(i=C.exec(s[r]))&&(u={},f=i[1],l=i[2].replace(/[\\:]:/g,":"),g=i[3],b=i[4],"!"===f&&(a.attributesRequired=a.attributesRequired||[],a.attributesRequired.push(l),u.required=!0),"-"!==f?(g&&("="===g&&(a.attributesDefault=a.attributesDefault||[],a.attributesDefault.push({name:l,value:b}),u.defaultValue=b),":"===g&&(a.attributesForced=a.attributesForced||[],a.attributesForced.push({name:l,value:b}),u.forcedValue=b),"<"===g&&(u.validValues=Zo(b,"?"))),x.test(l)?(a.attributePatterns=a.attributePatterns||[],u.pattern=T(l),a.attributePatterns.push(u)):(d[l]||m.push(l),d[l]=u)):(delete d[l],m.splice(ri(m,l),1)));h||"@"!==c||(h=d,v=m),p&&(a.outputName=c,S[p]=a),x.test(c)?(a.pattern=T(c),E.push(a)):S[c]=a}}}function B(e){S={},E=[],O(e),ei(m,function(e,t){l[t]=e.children})}function P(e){var a=/^(~)?(.+)$/;e&&(Jo.text_block_elements=Jo.block_elements=null,ei(Zr(e,","),function(e){var t,n=a.exec(e),r="~"===n[1],o=r?"span":"div",i=n[2];l[i]=l[o],f[i]=o,r||(R[i.toUpperCase()]={},R[i]={}),S[i]||(t=S[o],delete(t=ti({},t)).removeEmptyAttrs,delete t.removeEmpty,S[i]=t),ei(l,function(e,t){e[o]&&(l[t]=e=ti({},l[t]),e[i]=e[o])})}))}function L(e){var o=/^([+\-]?)([A-Za-z0-9_\-.\u00b7\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u037d\u037f-\u1fff\u200c-\u200d\u203f-\u2040\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd]+)\[([^\]]+)]$/;Jo[i.schema]=null,e&&ei(Zr(e,","),function(e){var t,n,r=o.exec(e);r&&(n=r[1],t=n?l[r[2]]:l[r[2]]={"#comment":{}},t=l[r[2]],ei(Zr(r[3],"|"),function(e){"-"===n?delete t[e]:t[e]={}}))})}function I(e){var t,n=S[e];if(n)return n;for(t=E.length;t--;)if((n=E[t]).pattern.test(e))return n}ei((i.special||"script noscript iframe noframes noembed title style textarea xmp").split(" "),function(e){d[e]=new RegExp("</"+e+"[^>]*>","gi")}),i.valid_elements?B(i.valid_elements):(ei(m,function(e,t){S[t]={attributes:e.attributes,attributesOrder:e.attributesOrder},l[t]=e.children}),"html5"!==i.schema&&ei(Zr("strong/b em/i"),function(e){var t=Zr(e,"/");S[t[1]].outputName=t[0]}),ei(Zr("ol ul sub sup blockquote span font a table tbody strong em b i"),function(e){S[e]&&(S[e].removeEmpty=!0)}),ei(Zr("p h1 h2 h3 h4 h5 h6 th td pre div address caption li"),function(e){S[e].paddEmpty=!0}),ei(Zr("span"),function(e){S[e].removeEmptyAttrs=!0})),P(i.custom_elements),L(i.valid_children),O(i.extended_valid_elements),L("+ol[ul|ol],+ul[ul|ol]"),ei({dd:"dl",dt:"dl",li:"ul ol",td:"tr",th:"tr",tr:"tbody thead tfoot",tbody:"table",thead:"table",tfoot:"table",legend:"fieldset",area:"map",param:"video audio object"},function(e,t){S[t]&&(S[t].parentsRequired=Zr(e))}),i.invalid_elements&&ei(ni(i.invalid_elements),function(e){S[e]&&delete S[e]}),I("span")||O("span[!data-mce-type|*]");var M=J(h),F=J(v),U=J(b),z=J(w),H=J(R),j=J(A),V=J(D),q=J(x),$=J(C),W=J(k),K=J(_),X=J(y),Y=J(d),G=J(f);return{children:l,elements:S,getValidStyles:M,getValidClasses:U,getBlockElements:H,getInvalidStyles:F,getShortEndedElements:q,getTextBlockElements:j,getTextInlineElements:V,getBoolAttrs:z,getElementRule:I,getSelfClosingElements:$,getNonEmptyElements:W,getMoveCaretBeforeOnEnterElements:K,getWhiteSpaceElements:X,getSpecialElements:Y,isValidChild:function(e,t){var n=l[e.toLowerCase()];return!(!n||!n[t.toLowerCase()])},isValid:function(e,t){var n,r,o=I(e);if(o){if(!t)return!0;if(o.attributes[t])return!0;if(n=o.attributePatterns)for(r=n.length;r--;)if(n[r].pattern.test(e))return!0}return!1},getCustomElements:G,addValidElements:O,setValidElements:B,addCustomElements:P,addValidChildren:L}}function no(e,t,n,r){function o(e){return 1<(e=parseInt(e,10).toString(16)).length?e:"0"+e}return"#"+o(t)+o(n)+o(r)}function ro(b,e){var u,o,y=this,C=/rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/gi,x=/(?:url(?:(?:\(\s*\"([^\"]+)\"\s*\))|(?:\(\s*\'([^\']+)\'\s*\))|(?:\(\s*([^)\s]+)\s*\))))|(?:\'([^\']+)\')|(?:\"([^\"]+)\")/gi,w=/\s*([^:]+):\s*([^;]+);?/g,S=/\s+$/,E={},N=bo;b=b||{},e&&(u=e.getValidStyles(),o=e.getInvalidStyles());for(var t=("\\\" \\' \\; \\: ; : "+N).split(" "),k=0;k<t.length;k++)E[t[k]]=N+k,E[N+k]=t[k];return{toHex:function(e){return e.replace(C,no)},parse:function(e){function t(e,t,n){var r=p[e+"-top"+t];if(r){var o=p[e+"-right"+t];if(o){var i=p[e+"-bottom"+t];if(i){var a=p[e+"-left"+t];if(a){var u=[r,o,i,a];for(k=u.length-1;k--&&u[k]===u[k+1];);-1<k&&n||(p[e+t]=-1===k?u[0]:u.join(" "),delete p[e+"-top"+t],delete p[e+"-right"+t],delete p[e+"-bottom"+t],delete p[e+"-left"+t])}}}}}function n(e){var t,n=p[e];if(n){for(t=(n=n.split(" ")).length;t--;)if(n[t]!==n[0])return;return p[e]=n[0],1}}function r(e){return f=!0,E[e]}function u(e,t){return f&&(e=e.replace(/\uFEFF[0-9]/g,function(e){return E[e]})),t?e:e.replace(/\\([\'\";:])/g,"$1")}function o(e){return String.fromCharCode(parseInt(e.slice(1),16))}function i(e){return e.replace(/\\[0-9a-f]+/gi,o)}function a(e,t,n,r,o,i){if(o=o||i)return"'"+(o=u(o)).replace(/\'/g,"\\'")+"'";if(t=u(t||n||r),!b.allow_script_urls){var a=t.replace(/[\s\r\n]+/g,"");if(/(java|vb)script:/i.test(a))return"";if(!b.allow_svg_data_urls&&/^data:image\/svg/i.test(a))return""}return"url('"+(t=h?h.call(v,t,"style"):t).replace(/\'/g,"\\'")+"')"}var s,c,l,f,d,m,g,p={},h=b.url_converter,v=b.url_converter_scope||y;if(e){for(e=(e=e.replace(/[\u0000-\u001F]/g,"")).replace(/\\[\"\';:\uFEFF]/g,r).replace(/\"[^\"]+\"|\'[^\']+\'/g,function(e){return e.replace(/[;:]/g,r)});s=w.exec(e);)w.lastIndex=s.index+s[0].length,c=s[1].replace(S,"").toLowerCase(),l=s[2].replace(S,""),c&&l&&(c=i(c),l=i(l),-1===c.indexOf(N)&&-1===c.indexOf('"')&&(b.allow_script_urls||"behavior"!==c&&!/expression\s*\(|\/\*|\*\//.test(l))&&("font-weight"===c&&"700"===l?l="bold":"color"!==c&&"background-color"!==c||(l=l.toLowerCase()),l=(l=l.replace(C,no)).replace(x,a),p[c]=f?u(l,!0):l));t("border","",!0),t("border","-width"),t("border","-color"),t("border","-style"),t("padding",""),t("margin",""),m="border-style",g="border-color",n(d="border-width")&&n(m)&&n(g)&&(p.border=p[d]+" "+p[m]+" "+p[g],delete p[d],delete p[m],delete p[g]),"medium none"===p.border&&delete p.border,"none"===p["border-image"]&&delete p["border-image"]}return p},serialize:function(i,r){function e(e){var t,n=u[e];if(n)for(var r=0,o=n.length;r<o;r++)e=n[r],(t=i[e])&&(a+=(0<a.length?" ":"")+e+": "+t+";")}var a="";return r&&u?(e("*"),e(r)):ne(i,function(e,t){var n;!e||o&&((n=o["*"])&&n[t]||(n=o[r])&&n[t])||(a+=(0<a.length?" ":"")+t+": "+e+";")}),a}}}function oo(e){return e instanceof Event||y(e.initEvent)}function io(e,t,n,r){var o,i,a=function(e){var t,n=null!=r?r:{};for(t in e)Ne(oi,t)||(n[t]=e[t]);return V(n.composedPath)&&(n.composedPath=function(){return e.composedPath()}),n}(t);return a.type=e,K(a.target)&&(a.target=null!==(o=a.srcElement)&&void 0!==o?o:n),(K((i=t).preventDefault)||oo(i))&&(a.preventDefault=function(){a.defaultPrevented=!0,a.isDefaultPrevented=w,y(t.preventDefault)?t.preventDefault():oo(t)&&(t.returnValue=!1)},a.stopPropagation=function(){a.cancelBubble=!0,a.isPropagationStopped=w,y(t.stopPropagation)?t.stopPropagation():oo(t)&&(t.cancelBubble=!0)},a.stopImmediatePropagation=function(){a.isImmediatePropagationStopped=w,a.stopPropagation()},a.isDefaultPrevented!==w&&a.isDefaultPrevented!==R&&(a.isDefaultPrevented=!0===a.defaultPrevented?w:R,a.isPropagationStopped=!0===a.cancelBubble?w:R,a.isImmediatePropagationStopped=R)),a}function ao(e,t,n,r){e.addEventListener?e.addEventListener(t,n,r||!1):e.attachEvent&&e.attachEvent("on"+t,n)}function uo(e,t,n,r){e.removeEventListener?e.removeEventListener(t,n,r||!1):e.detachEvent&&e.detachEvent("on"+t,n)}function so(e,t){var n,r,o,i,a=io(e.type,e,document,t);return V(i=e)&&ii.test(i.type)&&b(e.pageX)&&!b(e.clientX)&&(r=(n=a.target.ownerDocument||document).documentElement,o=n.body,a.pageX=e.clientX+(r&&r.scrollLeft||o&&o.scrollLeft||0)-(r&&r.clientLeft||o&&o.clientLeft||0),a.pageY=e.clientY+(r&&r.scrollTop||o&&o.scrollTop||0)-(r&&r.clientTop||o&&o.clientTop||0)),b(a.metaKey)&&(a.metaKey=!1),a}var co=Tr(["h1","h2","h3","h4","h5","h6"]),lo=Tr(["article","aside","details","div","dt","figcaption","footer","form","fieldset","header","hgroup","html","main","nav","section","summary","body","p","dl","multicol","dd","figure","address","center","blockquote","h1","h2","h3","h4","h5","h6","listing","xmp","pre","plaintext","menu","dir","ul","ol","li","hr","table","tbody","thead","tfoot","th","tr","td","caption"]),fo=Tr(["h1","h2","h3","h4","h5","h6","p","div","address","pre","form","blockquote","center","dir","fieldset","header","footer","article","section","hgroup","aside","nav","figure"]),mo=Tr(["ul","ol","dl"]),go=Tr(["li","dd","dt"]),po=Tr(["thead","tbody","tfoot"]),ho=Tr(["td","th"]),vo=Tr(["pre","script","textarea","style"]),bo="\ufeff",yo="\xa0",Co=bo,xo=function(e){return e===bo},wo=function(e){return e.replace(/\uFEFF/g,"")},So=zn,Eo=jn,No=function(e){return Eo(e)&&e.data[0]===Co},ko=function(e){return Eo(e)&&e.data[e.data.length-1]===Co},_o=Xn,Ao=Yn,Ro=Wn,Do=jn,To=on(["script","style","textarea"]),Oo=on(["img","input","textarea","hr","iframe","video","audio","object","embed"]),Bo=on(["table"]),Po=Ir,Lo=function(e){return!1===(zn(t=e)&&"true"===t.getAttribute("unselectable"))&&Ao(e);var t},Io=/^[ \t\r\n]*$/,Mo=un("data-mce-bookmark"),Fo=un("data-mce-bogus"),Uo=function(e){return zn(e)&&"all"===e.getAttribute("data-mce-bogus")},zo=function(e,t,n){var r=n||t;if(zn(t)&&Xr(t))return t;for(var o,i,a,u,s,c,l,f,d,m,g,p=t.childNodes,h=p.length-1;0<=h;h--)zo(e,p[h],r);return!zn(t)||1===(o=t.childNodes).length&&Xr(o[0])&&t.parentNode.insertBefore(o[0],t),$n(a=t)||qn(a)||$r(t,r)||zn(i=t)&&0<i.childNodes.length||(s=r,jn(u=t)&&0<u.data.length&&(f=new Rr(c=u,l=s).prev(!1),d=new Rr(c,l).next(!1),m=b(f)||Kr(f,l),g=b(d)||Kr(d,l),m&&g))||e.remove(t),t},Ho=Et.makeMap,jo=/[&<>\"\u0060\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,Vo=/[<>&\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,qo=/[<>&\"\']/g,$o=/&#([a-z0-9]+);?|&([a-z0-9]+);/gi,Wo={128:"\u20ac",130:"\u201a",131:"\u0192",132:"\u201e",133:"\u2026",134:"\u2020",135:"\u2021",136:"\u02c6",137:"\u2030",138:"\u0160",139:"\u2039",140:"\u0152",142:"\u017d",145:"\u2018",146:"\u2019",147:"\u201c",148:"\u201d",149:"\u2022",150:"\u2013",151:"\u2014",152:"\u02dc",153:"\u2122",154:"\u0161",155:"\u203a",156:"\u0153",158:"\u017e",159:"\u0178"},Ko={'"':"&quot;","'":"&#39;","<":"&lt;",">":"&gt;","&":"&amp;","`":"&#96;"},Xo={"&lt;":"<","&gt;":">","&amp;":"&","&quot;":'"',"&apos;":"'"},Yo=Yr("50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,58,uml,59,copy,5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2,5j,sup3,5k,acute,5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14,5t,frac12,5u,frac34,5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,AElig,67,Ccedil,68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,Iuml,6g,ETH,6h,Ntilde,6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,Ugrave,6q,Uacute,6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,acirc,73,atilde,74,auml,75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,igrave,7d,iacute,7e,icirc,7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,ouml,7n,divide,7o,oslash,7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fnof,sh,Alpha,si,Beta,sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,sr,Lambda,ss,Mu,st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,t7,Chi,t8,Psi,t9,Omega,th,alpha,ti,beta,tj,gamma,tk,delta,tl,epsilon,tm,zeta,tn,eta,to,theta,tp,iota,tq,kappa,tr,lambda,ts,mu,tt,nu,tu,xi,tv,omicron,u0,pi,u1,rho,u2,sigmaf,u3,sigma,u4,tau,u5,upsilon,u6,phi,u7,chi,u8,psi,u9,omega,uh,thetasym,ui,upsih,um,piv,812,bull,816,hellip,81i,prime,81j,Prime,81u,oline,824,frasl,88o,weierp,88h,image,88s,real,892,trade,89l,alefsym,8cg,larr,8ch,uarr,8ci,rarr,8cj,darr,8ck,harr,8dl,crarr,8eg,lArr,8eh,uArr,8ei,rArr,8ej,dArr,8ek,hArr,8g0,forall,8g2,part,8g3,exist,8g5,empty,8g7,nabla,8g8,isin,8g9,notin,8gb,ni,8gf,prod,8gh,sum,8gi,minus,8gn,lowast,8gq,radic,8gt,prop,8gu,infin,8h0,ang,8h7,and,8h8,or,8h9,cap,8ha,cup,8hb,int,8hk,there4,8hs,sim,8i5,cong,8i8,asymp,8j0,ne,8j1,equiv,8j4,le,8j5,ge,8k2,sub,8k3,sup,8k4,nsub,8k6,sube,8k7,supe,8kl,oplus,8kn,otimes,8l5,perp,8m5,sdot,8o8,lceil,8o9,rceil,8oa,lfloor,8ob,rfloor,8p9,lang,8pa,rang,9ea,loz,9j0,spades,9j3,clubs,9j5,hearts,9j6,diams,ai,OElig,aj,oelig,b0,Scaron,b1,scaron,bo,Yuml,m6,circ,ms,tilde,802,ensp,803,emsp,809,thinsp,80c,zwnj,80d,zwj,80e,lrm,80f,rlm,80j,ndash,80k,mdash,80o,lsquo,80p,rsquo,80q,sbquo,80s,ldquo,80t,rdquo,80u,bdquo,810,dagger,811,Dagger,81g,permil,81p,lsaquo,81q,rsaquo,85c,euro",32),Go={encodeRaw:Gr,encodeAllRaw:function(e){return(""+e).replace(qo,function(e){return Ko[e]||e})},encodeNumeric:Jr,encodeNamed:Qr,getEncodeFunc:function(e,t){var n=Yr(t)||Yo,r=Ho(e.replace(/\+/g,","));return r.named&&r.numeric?function(e,t){return e.replace(t?jo:Vo,function(e){return void 0!==Ko[e]?Ko[e]:void 0!==n[e]?n[e]:1<e.length?"&#"+(1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320)+65536)+";":"&#"+e.charCodeAt(0)+";"})}:r.named?t?function(e,t){return Qr(e,t,n)}:Qr:r.numeric?Jr:Gr},decode:function(e){return e.replace($o,function(e,t){return t?65535<(t="x"===t.charAt(0).toLowerCase()?parseInt(t.substr(1),16):parseInt(t,10))?(t-=65536,String.fromCharCode(55296+(t>>10),56320+(1023&t))):Wo[t]||String.fromCharCode(t):Xo[e]||Yo[e]||(n=e,(r=Nt.fromTag("div").dom).innerHTML=n,r.textContent||r.innerText||n);var n,r})}},Jo={},Qo={},Zo=Et.makeMap,ei=Et.each,ti=Et.extend,ni=Et.explode,ri=Et.inArray,oi={keyLocation:!0,layerX:!0,layerY:!0,returnValue:!0,webkitMovementX:!0,webkitMovementY:!0,keyIdentifier:!0,mozPressure:!0},ii=/^(?:mouse|contextmenu)|click/,ai=(ui.prototype.bind=function(e,t,n,r){function o(e){f.executeHandlers(so(e||d.event),i)}var i,a,u,s,c,l,f=this,d=window;if(e&&3!==e.nodeType&&8!==e.nodeType){e[f.expando]?i=e[f.expando]:(i=f.count++,e[f.expando]=i,f.events[i]={}),r=r||e;for(var m=t.split(" "),g=m.length;g--;)c=o,s=l=!1,"DOMContentLoaded"===(u=m[g])&&(u="ready"),f.domLoaded&&"ready"===u&&"complete"===e.readyState?n.call(r,so({type:u})):(f.hasMouseEnterLeave||(s=f.mouseEnterLeave[u])&&(c=function(e){var t=e.currentTarget,n=e.relatedTarget;if(n&&t.contains)n=t.contains(n);else for(;n&&n!==t;)n=n.parentNode;n||((e=so(e||d.event)).type="mouseout"===e.type?"mouseleave":"mouseenter",e.target=t,f.executeHandlers(e,i))}),f.hasFocusIn||"focusin"!==u&&"focusout"!==u||(l=!0,s="focusin"===u?"focus":"blur",c=function(e){(e=so(e||d.event)).type="focus"===e.type?"focusin":"focusout",f.executeHandlers(e,i)}),(a=f.events[i][u])?"ready"===u&&f.domLoaded?n(so({type:u})):a.push({func:n,scope:r}):(f.events[i][u]=a=[{func:n,scope:r}],a.fakeName=s,a.capture=l,a.nativeHandler=c,"ready"===u?function(e,t,n){var r,o=e.document,i={type:"ready"};n.domLoaded?t(i):(r=function(){uo(e,"DOMContentLoaded",r),uo(e,"load",r),n.domLoaded||(n.domLoaded=!0,t(i)),e=null},"complete"===o.readyState||"interactive"===o.readyState&&o.body?r():ao(e,"DOMContentLoaded",r),n.domLoaded||ao(e,"load",r))}(e,c,f):ao(e,s||u,c,l)));return e=a=null,n}},ui.prototype.unbind=function(n,e,t){var r,o,i;if(!n||3===n.nodeType||8===n.nodeType)return this;var a=n[this.expando];if(a){if(i=this.events[a],e){for(var u,s,c,l,f=e.split(" "),d=f.length;d--;)if(l=i[o=f[d]]){if(t)for(r=l.length;r--;)l[r].func===t&&(u=l.nativeHandler,s=l.fakeName,c=l.capture,(l=l.slice(0,r).concat(l.slice(r+1))).nativeHandler=u,l.fakeName=s,l.capture=c,i[o]=l);t&&0!==l.length||(delete i[o],uo(n,l.fakeName||o,l.nativeHandler,l.capture))}}else ne(i,function(e,t){uo(n,e.fakeName||t,e.nativeHandler,e.capture)}),i={};for(o in i)if(Ne(i,o))return this;delete this.events[a];try{delete n[this.expando]}catch(e){n[this.expando]=null}}return this},ui.prototype.fire=function(e,t,n){var r;if(!e||3===e.nodeType||8===e.nodeType)return this;for(var o=so({type:t,target:e},n);(r=e[this.expando])&&this.executeHandlers(o,r),(e=e.parentNode||e.ownerDocument||e.defaultView||e.parentWindow)&&!o.isPropagationStopped(););return this},ui.prototype.clean=function(e){var t,n;if(!e||3===e.nodeType||8===e.nodeType)return this;if(e[this.expando]&&this.unbind(e),(e=e.getElementsByTagName?e:e.document)&&e.getElementsByTagName)for(this.unbind(e),t=(n=e.getElementsByTagName("*")).length;t--;)(e=n[t])[this.expando]&&this.unbind(e);return this},ui.prototype.destroy=function(){this.events={}},ui.prototype.cancel=function(e){return e&&(e.preventDefault(),e.stopImmediatePropagation()),!1},ui.prototype.executeHandlers=function(e,t){var n=this.events[t],r=n&&n[e.type];if(r)for(var o=0,i=r.length;o<i;o++){var a=r[o];if(a&&!1===a.func.call(a.scope,e)&&e.preventDefault(),e.isImmediatePropagationStopped())return}},ui.Event=new ui,ui);function ui(){this.domLoaded=!1,this.events={},this.count=1,this.expando="mce-data-"+(+new Date).toString(32),this.hasMouseEnterLeave="onmouseenter"in document.documentElement,this.hasFocusIn="onfocusin"in document.documentElement,this.count=1}function si(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(65536+r):String.fromCharCode(r>>10|55296,1023&r|56320)}var ci,li,fi,di,mi,gi,pi,hi,vi,bi,yi,Ci,xi,wi,Si,Ei,Ni,ki="sizzle"+-new Date,_i=window.document,Ai=0,Ri=0,Di=ua(),Ti=ua(),Oi=ua(),Bi=function(e,t){return e===t&&(bi=!0),0},Pi="undefined",Li={}.hasOwnProperty,Ii=[],Mi=Ii.pop,Fi=Ii.push,Ui=Ii.push,zi=Ii.slice,Hi=Ii.indexOf||function(e){for(var t=0,n=this.length;t<n;t++)if(this[t]===e)return t;return-1},ji="[\\x20\\t\\r\\n\\f]",Vi="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",qi="\\["+ji+"*("+Vi+")(?:"+ji+"*([*^$|!~]?=)"+ji+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+Vi+"))|)"+ji+"*\\]",$i=":("+Vi+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+qi+")*)|.*)\\)|)",Wi=new RegExp("^"+ji+"+|((?:^|[^\\\\])(?:\\\\.)*)"+ji+"+$","g"),Ki=new RegExp("^"+ji+"*,"+ji+"*"),Xi=new RegExp("^"+ji+"*([>+~]|"+ji+")"+ji+"*"),Yi=new RegExp("="+ji+"*([^\\]'\"]*?)"+ji+"*\\]","g"),Gi=new RegExp($i),Ji=new RegExp("^"+Vi+"$"),Qi={ID:new RegExp("^#("+Vi+")"),CLASS:new RegExp("^\\.("+Vi+")"),TAG:new RegExp("^("+Vi+"|[*])"),ATTR:new RegExp("^"+qi),PSEUDO:new RegExp("^"+$i),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ji+"*(even|odd|(([+-]|)(\\d*)n|)"+ji+"*(?:([+-]|)"+ji+"*(\\d+)|))"+ji+"*\\)|)","i"),bool:new RegExp("^(?:checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped)$","i"),needsContext:new RegExp("^"+ji+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ji+"*((?:-\\d)?\\d*)"+ji+"*\\)|)(?=[^-]|$)","i")},Zi=/^(?:input|select|textarea|button)$/i,ea=/^h\d$/i,ta=/^[^{]+\{\s*\[native \w/,na=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ra=/[+~]/,oa=/'|\\/g,ia=new RegExp("\\\\([\\da-f]{1,6}"+ji+"?|("+ji+")|.)","ig");try{Ui.apply(Ii=zi.call(_i.childNodes),_i.childNodes),Ii[_i.childNodes.length].nodeType}catch(e){Ui={apply:Ii.length?function(e,t){Fi.apply(e,zi.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}var aa=function(e,t,n,r){var o,i,a,u,s,c,l,f,d,m;if((t?t.ownerDocument||t:_i)!==Ci&&yi(t),n=n||[],!e||"string"!=typeof e)return n;if(1!==(u=(t=t||Ci).nodeType)&&9!==u)return[];if(wi&&!r){if(o=na.exec(e))if(a=o[1]){if(9===u){if(!(i=t.getElementById(a))||!i.parentNode)return n;if(i.id===a)return n.push(i),n}else if(t.ownerDocument&&(i=t.ownerDocument.getElementById(a))&&Ni(t,i)&&i.id===a)return n.push(i),n}else{if(o[2])return Ui.apply(n,t.getElementsByTagName(e)),n;if((a=o[3])&&ci.getElementsByClassName)return Ui.apply(n,t.getElementsByClassName(a)),n}if(ci.qsa&&(!Si||!Si.test(e))){if(f=l=ki,d=t,m=9===u&&e,1===u&&"object"!==t.nodeName.toLowerCase()){for(c=mi(e),(l=t.getAttribute("id"))?f=l.replace(oa,"\\$&"):t.setAttribute("id",f),f="[id='"+f+"'] ",s=c.length;s--;)c[s]=f+ma(c[s]);d=ra.test(e)&&fa(t.parentNode)||t,m=c.join(",")}if(m)try{return Ui.apply(n,d.querySelectorAll(m)),n}catch(e){}finally{l||t.removeAttribute("id")}}}return pi(e.replace(Wi,"$1"),t,n,r)};function ua(){var n=[];function r(e,t){return n.push(e+" ")>li.cacheLength&&delete r[n.shift()],r[e+" "]=t}return r}function sa(e){return e[ki]=!0,e}function ca(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||1<<31)-(~e.sourceIndex||1<<31);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function la(a){return sa(function(i){return i=+i,sa(function(e,t){for(var n,r=a([],e.length,i),o=r.length;o--;)e[n=r[o]]&&(e[n]=!(t[n]=e[n]))})})}function fa(e){return e&&typeof e.getElementsByTagName!=Pi&&e}function da(){}function ma(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function ga(a,e,t){var u=e.dir,s=t&&"parentNode"===u,c=Ri++;return e.first?function(e,t,n){for(;e=e[u];)if(1===e.nodeType||s)return a(e,t,n)}:function(e,t,n){var r,o,i=[Ai,c];if(n){for(;e=e[u];)if((1===e.nodeType||s)&&a(e,t,n))return!0}else for(;e=e[u];)if(1===e.nodeType||s){if((r=(o=e[ki]||(e[ki]={}))[u])&&r[0]===Ai&&r[1]===c)return i[2]=r[2];if((o[u]=i)[2]=a(e,t,n))return!0}}}function pa(o){return 1<o.length?function(e,t,n){for(var r=o.length;r--;)if(!o[r](e,t,n))return!1;return!0}:o[0]}function ha(e,t,n,r,o){for(var i,a=[],u=0,s=e.length,c=null!=t;u<s;u++)(i=e[u])&&(n&&!n(i,r,o)||(a.push(i),c&&t.push(u)));return a}function va(e){return void 0!==e}function ba(e){return"string"==typeof e}function ya(e,t){var n,r=(t=t||ka).createElement("div"),o=t.createDocumentFragment();for(r.innerHTML=e;n=r.firstChild;)o.appendChild(n);return o}function Ca(e,t){return e&&t&&-1!==(" "+e.className+" ").indexOf(" "+t+" ")}function xa(e,t,n){var r,o;return t=Wa(t)[0],e.each(function(){n&&r===this.parentNode||(r=this.parentNode,o=t.cloneNode(!1),this.parentNode.insertBefore(o,this)),o.appendChild(this)}),e}function wa(e,t){return new Wa.fn.init(e,t)}function Sa(e){return null==e?"":(""+e).replace(Ua,"")}function Ea(e,t){var n,r,o,i;if(e)if(void 0===(n=e.length)){for(r in e)if(e.hasOwnProperty(r)&&(i=e[r],!1===t.call(i,r,i)))break}else for(o=0;o<n&&(i=e[o],!1!==t.call(i,o,i));o++);return e}function Na(e,n){var r=[];return Ea(e,function(e,t){n(t,e)&&r.push(t)}),r}ci=aa.support={},di=aa.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},yi=aa.setDocument=function(e){var t,s=e?e.ownerDocument||e:_i,n=s.defaultView;return s!==Ci&&9===s.nodeType&&s.documentElement?(xi=(Ci=s).documentElement,wi=!di(s),n&&n!==function(e){try{return e.top}catch(e){}return null}(n)&&(n.addEventListener?n.addEventListener("unload",function(){yi()},!1):n.attachEvent&&n.attachEvent("onunload",function(){yi()})),ci.attributes=!0,ci.getElementsByTagName=!0,ci.getElementsByClassName=ta.test(s.getElementsByClassName),ci.getById=!0,li.find.ID=function(e,t){if(typeof t.getElementById!=Pi&&wi){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},li.filter.ID=function(e){var t=e.replace(ia,si);return function(e){return e.getAttribute("id")===t}},li.find.TAG=ci.getElementsByTagName?function(e,t){if(typeof t.getElementsByTagName!=Pi)return t.getElementsByTagName(e)}:function(e,t){var n,r=[],o=0,i=t.getElementsByTagName(e);if("*"!==e)return i;for(;n=i[o++];)1===n.nodeType&&r.push(n);return r},li.find.CLASS=ci.getElementsByClassName&&function(e,t){if(wi)return t.getElementsByClassName(e)},Ei=[],Si=[],ci.disconnectedMatch=!0,Si=Si.length&&new RegExp(Si.join("|")),Ei=Ei.length&&new RegExp(Ei.join("|")),t=ta.test(xi.compareDocumentPosition),Ni=t||ta.test(xi.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)for(;t=t.parentNode;)if(t===e)return!0;return!1},Bi=t?function(e,t){return e===t?(bi=!0,0):(n=!e.compareDocumentPosition-!t.compareDocumentPosition)||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!ci.sortDetached&&t.compareDocumentPosition(e)===n?e===s||e.ownerDocument===_i&&Ni(_i,e)?-1:t===s||t.ownerDocument===_i&&Ni(_i,t)?1:vi?Hi.call(vi,e)-Hi.call(vi,t):0:4&n?-1:1);var n}:function(e,t){if(e===t)return bi=!0,0;var n,r=0,o=e.parentNode,i=t.parentNode,a=[e],u=[t];if(!o||!i)return e===s?-1:t===s?1:o?-1:i?1:vi?Hi.call(vi,e)-Hi.call(vi,t):0;if(o===i)return ca(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;a[r]===u[r];)r++;return r?ca(a[r],u[r]):a[r]===_i?-1:u[r]===_i?1:0},s):Ci},aa.matches=function(e,t){return aa(e,null,null,t)},aa.matchesSelector=function(e,t){if((e.ownerDocument||e)!==Ci&&yi(e),t=t.replace(Yi,"='$1']"),ci.matchesSelector&&wi&&(!Ei||!Ei.test(t))&&(!Si||!Si.test(t)))try{var n=(void 0).call(e,t);if(n||ci.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){}return 0<aa(t,Ci,null,[e]).length},aa.contains=function(e,t){return(e.ownerDocument||e)!==Ci&&yi(e),Ni(e,t)},aa.attr=function(e,t){(e.ownerDocument||e)!==Ci&&yi(e);var n=li.attrHandle[t.toLowerCase()],r=n&&Li.call(li.attrHandle,t.toLowerCase())?n(e,t,!wi):void 0;return void 0!==r?r:ci.attributes||!wi?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},aa.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},aa.uniqueSort=function(e){var t,n=[],r=0,o=0;if(bi=!ci.detectDuplicates,vi=!ci.sortStable&&e.slice(0),e.sort(Bi),bi){for(;t=e[o++];)t===e[o]&&(r=n.push(o));for(;r--;)e.splice(n[r],1)}return vi=null,e},fi=aa.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=fi(e)}else if(3===o||4===o)return e.nodeValue}else for(;t=e[r++];)n+=fi(t);return n},(li=aa.selectors={cacheLength:50,createPseudo:sa,match:Qi,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(ia,si),e[3]=(e[3]||e[4]||e[5]||"").replace(ia,si),"~="===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]||aa.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]&&aa.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return Qi.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&Gi.test(n)&&(t=mi(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(ia,si).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=Di[e+" "];return t||(t=new RegExp("(^|"+ji+")"+e+"("+ji+"|$)"))&&Di(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!=Pi&&e.getAttribute("class")||"")})},ATTR:function(n,r,o){return function(e){var t=aa.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===o:"!="===r?t!==o:"^="===r?o&&0===t.indexOf(o):"*="===r?o&&-1<t.indexOf(o):"$="===r?o&&t.slice(-o.length)===o:"~="===r?-1<(" "+t+" ").indexOf(o):"|="===r&&(t===o||t.slice(0,o.length+1)===o+"-"))}},CHILD:function(m,e,t,g,p){var h="nth"!==m.slice(0,3),v="last"!==m.slice(-4),b="of-type"===e;return 1===g&&0===p?function(e){return!!e.parentNode}:function(e,t,n){var r,o,i,a,u,s,c=h!=v?"nextSibling":"previousSibling",l=e.parentNode,f=b&&e.nodeName.toLowerCase(),d=!n&&!b;if(l){if(h){for(;c;){for(i=e;i=i[c];)if(b?i.nodeName.toLowerCase()===f:1===i.nodeType)return!1;s=c="only"===m&&!s&&"nextSibling"}return!0}if(s=[v?l.firstChild:l.lastChild],v&&d){for(u=(r=(o=l[ki]||(l[ki]={}))[m]||[])[0]===Ai&&r[1],a=r[0]===Ai&&r[2],i=u&&l.childNodes[u];i=++u&&i&&i[c]||(a=u=0)||s.pop();)if(1===i.nodeType&&++a&&i===e){o[m]=[Ai,u,a];break}}else if(d&&(r=(e[ki]||(e[ki]={}))[m])&&r[0]===Ai)a=r[1];else for(;(i=++u&&i&&i[c]||(a=u=0)||s.pop())&&((b?i.nodeName.toLowerCase()!==f:1!==i.nodeType)||!++a||(d&&((i[ki]||(i[ki]={}))[m]=[Ai,a]),i!==e)););return(a-=p)===g||a%g==0&&0<=a/g}}},PSEUDO:function(e,i){var t,a=li.pseudos[e]||li.setFilters[e.toLowerCase()]||aa.error("unsupported pseudo: "+e);return a[ki]?a(i):1<a.length?(t=[e,e,"",i],li.setFilters.hasOwnProperty(e.toLowerCase())?sa(function(e,t){for(var n,r=a(e,i),o=r.length;o--;)e[n=Hi.call(e,r[o])]=!(t[n]=r[o])}):function(e){return a(e,0,t)}):a}},pseudos:{not:sa(function(e){var r=[],o=[],u=gi(e.replace(Wi,"$1"));return u[ki]?sa(function(e,t,n,r){for(var o,i=u(e,null,r,[]),a=e.length;a--;)(o=i[a])&&(e[a]=!(t[a]=o))}):function(e,t,n){return r[0]=e,u(r,null,n,o),r[0]=null,!o.pop()}}),has:sa(function(t){return function(e){return 0<aa(t,e).length}}),contains:sa(function(t){return t=t.replace(ia,si),function(e){return-1<(e.textContent||e.innerText||fi(e)).indexOf(t)}}),lang:sa(function(n){return Ji.test(n||"")||aa.error("unsupported lang: "+n),n=n.replace(ia,si).toLowerCase(),function(e){var t;do{if(t=wi?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=window.location&&window.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===xi},focus:function(e){return e===Ci.activeElement&&(!Ci.hasFocus||Ci.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return!1===e.disabled},disabled:function(e){return!0===e.disabled},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!li.pseudos.empty(e)},header:function(e){return ea.test(e.nodeName)},input:function(e){return Zi.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:la(function(){return[0]}),last:la(function(e,t){return[t-1]}),eq:la(function(e,t,n){return[n<0?n+t:n]}),even:la(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:la(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:la(function(e,t,n){for(var r=n<0?n+t:n;0<=--r;)e.push(r);return e}),gt:la(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=li.pseudos.eq,Y(["radio","checkbox","file","password","image"],function(e){var t;li.pseudos[e]=(t=e,function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t})}),Y(["submit","reset"],function(e){var n;li.pseudos[e]=(n=e,function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n})}),da.prototype=li.filters=li.pseudos,li.setFilters=new da,mi=aa.tokenize=function(e,t){var n,r,o,i,a,u,s,c=Ti[e+" "];if(c)return t?0:c.slice(0);for(a=e,u=[],s=li.preFilter;a;){for(i in n&&!(r=Ki.exec(a))||(r&&(a=a.slice(r[0].length)||a),u.push(o=[])),n=!1,(r=Xi.exec(a))&&(n=r.shift(),o.push({value:n,type:r[0].replace(Wi," ")}),a=a.slice(n.length)),li.filter)li.filter.hasOwnProperty(i)&&(!(r=Qi[i].exec(a))||s[i]&&!(r=s[i](r))||(n=r.shift(),o.push({value:n,type:i,matches:r}),a=a.slice(n.length)));if(!n)break}return t?a.length:a?aa.error(e):Ti(e,u).slice(0)},gi=aa.compile=function(e,t){var n,h,v,b,y,r=[],o=[],i=Oi[e+" "];if(!i){for(n=(t=t||mi(e)).length;n--;)((i=function e(t){for(var o,n,r,i=t.length,a=li.relative[t[0].type],u=a||li.relative[" "],s=a?1:0,c=ga(function(e){return e===o},u,!0),l=ga(function(e){return-1<Hi.call(o,e)},u,!0),f=[function(e,t,n){var r=!a&&(n||t!==hi)||((o=t).nodeType?c:l)(e,t,n);return o=null,r}];s<i;s++)if(n=li.relative[t[s].type])f=[ga(pa(f),n)];else{if((n=li.filter[t[s].type].apply(null,t[s].matches))[ki]){for(r=++s;r<i&&!li.relative[t[r].type];r++);return function e(m,g,p,h,v,t){return h&&!h[ki]&&(h=e(h)),v&&!v[ki]&&(v=e(v,t)),sa(function(e,t,n,r){var o,i,a,u=[],s=[],c=t.length,l=e||function(e,t,n){for(var r=0,o=t.length;r<o;r++)aa(e,t[r],n);return n}(g||"*",n.nodeType?[n]:n,[]),f=!m||!e&&g?l:ha(l,u,m,n,r),d=p?v||(e?m:c||h)?[]:t:f;if(p&&p(f,d,n,r),h)for(o=ha(d,s),h(o,[],n,r),i=o.length;i--;)(a=o[i])&&(d[s[i]]=!(f[s[i]]=a));if(e){if(v||m){if(v){for(o=[],i=d.length;i--;)(a=d[i])&&o.push(f[i]=a);v(null,d=[],o,r)}for(i=d.length;i--;)(a=d[i])&&-1<(o=v?Hi.call(e,a):u[i])&&(e[o]=!(t[o]=a))}}else d=ha(d===t?d.splice(c,d.length):d),v?v(null,t,d,r):Ui.apply(t,d)})}(1<s&&pa(f),1<s&&ma(t.slice(0,s-1).concat({value:" "===t[s-2].type?"*":""})).replace(Wi,"$1"),n,s<r&&e(t.slice(s,r)),r<i&&e(t=t.slice(r)),r<i&&ma(t))}f.push(n)}return pa(f)}(t[n]))[ki]?r:o).push(i);(i=Oi(e,(h=o,b=0<(v=r).length,y=0<h.length,b?sa(a):a))).selector=e}function a(e,t,n,r,o){var i,a,u,s=0,c="0",l=e&&[],f=[],d=hi,m=e||y&&li.find.TAG("*",o),g=Ai+=null==d?1:Math.random()||.1,p=m.length;for(o&&(hi=t!==Ci&&t);c!==p&&null!=(i=m[c]);c++){if(y&&i){for(a=0;u=h[a++];)if(u(i,t,n)){r.push(i);break}o&&(Ai=g)}b&&((i=!u&&i)&&s--,e&&l.push(i))}if(s+=c,b&&c!==s){for(a=0;u=v[a++];)u(l,f,t,n);if(e){if(0<s)for(;c--;)l[c]||f[c]||(f[c]=Mi.call(r));f=ha(f)}Ui.apply(r,f),o&&!e&&0<f.length&&1<s+v.length&&aa.uniqueSort(r)}return o&&(Ai=g,hi=d),l}return i},pi=aa.select=function(e,t,n,r){var o,i,a,u,s,c="function"==typeof e&&e,l=!r&&mi(e=c.selector||e);if(n=n||[],1===l.length){if(2<(i=l[0]=l[0].slice(0)).length&&"ID"===(a=i[0]).type&&ci.getById&&9===t.nodeType&&wi&&li.relative[i[1].type]){if(!(t=(li.find.ID(a.matches[0].replace(ia,si),t)||[])[0]))return n;c&&(t=t.parentNode),e=e.slice(i.shift().value.length)}for(o=Qi.needsContext.test(e)?0:i.length;o--&&(a=i[o],!li.relative[u=a.type]);)if((s=li.find[u])&&(r=s(a.matches[0].replace(ia,si),ra.test(i[0].type)&&fa(t.parentNode)||t))){if(i.splice(o,1),!(e=r.length&&ma(i)))return Ui.apply(n,r),n;break}}return(c||gi(e,l))(r,t,!wi,n,ra.test(e)&&fa(t.parentNode)||t),n},ci.sortStable=ki.split("").sort(Bi).join("")===ki,ci.detectDuplicates=!!bi,yi(),ci.sortDetached=!0;var ka=document,_a=Array.prototype.push,Aa=Array.prototype.slice,Ra=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,Da=ai.Event,Ta=Et.makeMap("children,contents,next,prev"),Oa=function(e,t,n,r){var o;if(ba(t))t=ya(t,za(e[0]));else if(t.length&&!t.nodeType){if(t=Wa.makeArray(t),r)for(o=t.length-1;0<=o;o--)Oa(e,t[o],n,r);else for(o=0;o<t.length;o++)Oa(e,t[o],n,r);return e}if(t.nodeType)for(o=e.length;o--;)n.call(e[o],t);return e},Ba=Et.makeMap("fillOpacity fontWeight lineHeight opacity orphans widows zIndex zoom"," "),Pa=Et.makeMap("checked compact declare defer disabled ismap multiple nohref noshade nowrap readonly selected"," "),La={for:"htmlFor",class:"className",readonly:"readOnly"},Ia={float:"cssFloat"},Ma={},Fa={},Ua=/^\s*|\s*$/g,za=function(e){return e?9===e.nodeType?e:e.ownerDocument:ka};function Ha(e,t,n){var r=[],o=e[t];for("string"!=typeof n&&n instanceof Wa&&(n=n[0]);o&&9!==o.nodeType;){if(void 0!==n){if(o===n)break;if("string"==typeof n&&Wa(o).is(n))break}1===o.nodeType&&r.push(o),o=o[t]}return r}function ja(e,t,n,r){var o=[];for(r instanceof Wa&&(r=r[0]);e;e=e[t])if(!n||e.nodeType===n){if(void 0!==r){if(e===r)break;if("string"==typeof r&&Wa(e).is(r))break}o.push(e)}return o}function Va(e,t,n){for(e=e[t];e;e=e[t])if(e.nodeType===n)return e;return null}function qa(e,t){var n=t.attr("style"),r=e.serialize(e.parse(n),t[0].nodeName)||null;t.attr("data-mce-style",r)}function $a(e,t){var n,r,o=0;if(e)for(n=e.nodeType,e=e.previousSibling;e;e=e.previousSibling)r=e.nodeType,(!t||3!==r||r!==n&&e.nodeValue.length)&&(o++,n=r);return o}wa.fn=wa.prototype={constructor:wa,selector:"",context:null,length:0,init:function(e,t){var n,r,o=this;if(!e)return o;if(e.nodeType)return o.context=o[0]=e,o.length=1,o;if(t&&t.nodeType)o.context=t;else{if(t)return Wa(e).attr(t);o.context=t=document}if(ba(e)){if(!(n="<"===(o.selector=e).charAt(0)&&">"===e.charAt(e.length-1)&&3<=e.length?[null,e,null]:Ra.exec(e)))return Wa(t).find(e);if(n[1])for(r=ya(e,za(t)).firstChild;r;)_a.call(o,r),r=r.nextSibling;else{if(!(r=za(t).getElementById(n[2])))return o;if(r.id!==n[2])return o.find(e);o.length=1,o[0]=r}}else this.add(e,!1);return o},toArray:function(){return Et.toArray(this)},add:function(e,t){var n,r;if(ba(e))return this.add(Wa(e));if(!1!==t)for(n=Wa.unique(this.toArray().concat(Wa.makeArray(e))),this.length=n.length,r=0;r<n.length;r++)this[r]=n[r];else _a.apply(this,Wa.makeArray(e));return this},attr:function(t,n){var e,r=this;if("object"==typeof t)Ea(t,function(e,t){r.attr(e,t)});else{if(!va(n)){if(r[0]&&1===r[0].nodeType){if((e=Ma[t])&&e.get)return e.get(r[0],t);if(Pa[t])return r.prop(t)?t:void 0;null===(n=r[0].getAttribute(t,2))&&(n=void 0)}return n}this.each(function(){var e;1===this.nodeType&&((e=Ma[t])&&e.set?e.set(this,n):null===n?this.removeAttribute(t,2):this.setAttribute(t,n,2))})}return r},removeAttr:function(e){return this.attr(e,null)},prop:function(e,t){var n=this;if("object"==typeof(e=La[e]||e))Ea(e,function(e,t){n.prop(e,t)});else{if(!va(t))return n[0]&&n[0].nodeType&&e in n[0]?n[0][e]:t;this.each(function(){1===this.nodeType&&(this[e]=t)})}return n},css:function(t,n){function e(e){return e.replace(/-(\D)/g,function(e,t){return t.toUpperCase()})}function r(e){return e.replace(/[A-Z]/g,function(e){return"-"+e})}var o,i,a=this;if("object"==typeof t)Ea(t,function(e,t){a.css(e,t)});else if(va(n))t=e(t),"number"!=typeof n||Ba[t]||(n=n.toString()+"px"),a.each(function(){var e=this.style;if((i=Fa[t])&&i.set)i.set(this,n);else{try{this.style[Ia[t]||t]=n}catch(e){}null!==n&&""!==n||(e.removeProperty?e.removeProperty(r(t)):e.removeAttribute(t))}});else{if(o=a[0],(i=Fa[t])&&i.get)return i.get(o);if(!o.ownerDocument.defaultView)return o.currentStyle?o.currentStyle[e(t)]:"";try{return o.ownerDocument.defaultView.getComputedStyle(o,null).getPropertyValue(r(t))}catch(e){return}}return a},remove:function(){for(var e,t=this.length;t--;)e=this[t],Da.clean(e),e.parentNode&&e.parentNode.removeChild(e);return this},empty:function(){for(var e,t=this.length;t--;)for(e=this[t];e.firstChild;)e.removeChild(e.firstChild);return this},html:function(t){var n;if(va(t)){n=this.length;try{for(;n--;)this[n].innerHTML=t}catch(e){Wa(this[n]).empty().append(t)}return this}return this[0]?this[0].innerHTML:""},text:function(e){var t;if(va(e)){for(t=this.length;t--;)"innerText"in this[t]?this[t].innerText=e:this[0].textContent=e;return this}return this[0]?this[0].innerText||this[0].textContent:""},append:function(){return Oa(this,arguments,function(e){(1===this.nodeType||this.host&&1===this.host.nodeType)&&this.appendChild(e)})},prepend:function(){return Oa(this,arguments,function(e){(1===this.nodeType||this.host&&1===this.host.nodeType)&&this.insertBefore(e,this.firstChild)},!0)},before:function(){return this[0]&&this[0].parentNode?Oa(this,arguments,function(e){this.parentNode.insertBefore(e,this)}):this},after:function(){return this[0]&&this[0].parentNode?Oa(this,arguments,function(e){this.parentNode.insertBefore(e,this.nextSibling)},!0):this},appendTo:function(e){return Wa(e).append(this),this},prependTo:function(e){return Wa(e).prepend(this),this},replaceWith:function(e){return this.before(e).remove()},wrap:function(e){return xa(this,e)},wrapAll:function(e){return xa(this,e,!0)},wrapInner:function(e){return this.each(function(){Wa(this).contents().wrapAll(e)}),this},unwrap:function(){return this.parent().each(function(){Wa(this).replaceWith(this.childNodes)})},clone:function(){var e=[];return this.each(function(){e.push(this.cloneNode(!0))}),Wa(e)},addClass:function(e){return this.toggleClass(e,!0)},removeClass:function(e){return this.toggleClass(e,!1)},toggleClass:function(o,i){var e=this;return"string"!=typeof o||(-1!==o.indexOf(" ")?Ea(o.split(" "),function(){e.toggleClass(this,i)}):e.each(function(e,t){var n,r=Ca(t,o);r!==i&&(n=t.className,r?t.className=Sa((" "+n+" ").replace(" "+o+" "," ")):t.className+=n?" "+o:o)})),e},hasClass:function(e){return Ca(this[0],e)},each:function(e){return Ea(this,e)},on:function(e,t){return this.each(function(){Da.bind(this,e,t)})},off:function(e,t){return this.each(function(){Da.unbind(this,e,t)})},trigger:function(e){return this.each(function(){"object"==typeof e?Da.fire(this,e.type,e):Da.fire(this,e)})},show:function(){return this.css("display","")},hide:function(){return this.css("display","none")},slice:function(){return Wa(Aa.apply(this,arguments))},eq:function(e){return-1===e?this.slice(e):this.slice(e,+e+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},find:function(e){for(var t=[],n=0,r=this.length;n<r;n++)Wa.find(e,this[n],t);return Wa(t)},filter:function(n){return Wa("function"==typeof n?Na(this.toArray(),function(e,t){return n(t,e)}):Wa.filter(n,this.toArray()))},closest:function(n){var r=[];return n instanceof Wa&&(n=n[0]),this.each(function(e,t){for(;t;){if("string"==typeof n&&Wa(t).is(n)){r.push(t);break}if(t===n){r.push(t);break}t=t.parentNode}}),Wa(r)},offset:function(e){var t,n,r,o,i=0,a=0;return e?this.css(e):((t=this[0])&&(r=(n=t.ownerDocument).documentElement,t.getBoundingClientRect&&(i=(o=t.getBoundingClientRect()).left+(r.scrollLeft||n.body.scrollLeft)-r.clientLeft,a=o.top+(r.scrollTop||n.body.scrollTop)-r.clientTop)),{left:i,top:a})},push:_a,sort:Array.prototype.sort,splice:Array.prototype.splice},Et.extend(wa,{extend:Et.extend,makeArray:function(e){return e&&e===e.window||e.nodeType?[e]:Et.toArray(e)},inArray:function(e,t){var n;if(t.indexOf)return t.indexOf(e);for(n=t.length;n--;)if(t[n]===e)return n;return-1},isArray:Et.isArray,each:Ea,trim:Sa,grep:Na,find:aa,expr:aa.selectors,unique:aa.uniqueSort,text:aa.getText,contains:aa.contains,filter:function(e,t,n){var r=t.length;for(n&&(e=":not("+e+")");r--;)1!==t[r].nodeType&&t.splice(r,1);return 1===t.length?Wa.find.matchesSelector(t[0],e)?[t[0]]:[]:Wa.find.matches(e,t)}}),Ea({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return Ha(e,"parentNode")},next:function(e){return Va(e,"nextSibling",1)},prev:function(e){return Va(e,"previousSibling",1)},children:function(e){return ja(e.firstChild,"nextSibling",1)},contents:function(e){return Et.toArray(("iframe"===e.nodeName?e.contentDocument||e.contentWindow.document:e).childNodes)}},function(r,o){wa.fn[r]=function(t){var n=[];this.each(function(){var e=o.call(n,this,t,n);e&&(Wa.isArray(e)?n.push.apply(n,e):n.push(e))}),1<this.length&&(Ta[r]||(n=Wa.unique(n)),0===r.indexOf("parents")&&(n=n.reverse()));var e=Wa(n);return t?e.filter(t):e}}),Ea({parentsUntil:function(e,t){return Ha(e,"parentNode",t)},nextUntil:function(e,t){return ja(e,"nextSibling",1,t).slice(1)},prevUntil:function(e,t){return ja(e,"previousSibling",1,t).slice(1)}},function(o,i){wa.fn[o]=function(t,e){var n=[];this.each(function(){var e=i.call(n,this,t,n);e&&(Wa.isArray(e)?n.push.apply(n,e):n.push(e))}),1<this.length&&(n=Wa.unique(n),0!==o.indexOf("parents")&&"prevUntil"!==o||(n=n.reverse()));var r=Wa(n);return e?r.filter(e):r}}),wa.fn.is=function(e){return!!e&&0<this.filter(e).length},wa.fn.init.prototype=wa.fn,wa.overrideDefaults=function(n){var r,o=function(e,t){return r=r||n(),0===arguments.length&&(e=r.element),t=t||r.context,new o.fn.init(e,t)};return Wa.extend(o,this),o},wa.attrHooks=Ma,wa.cssHooks=Fa;var Wa=wa,Ka=Et.each,Xa=Et.grep,Ya=xt.ie,Ga=/^([a-z0-9],?)+$/i,Ja=function(a,u){function s(e){return e&&a&&X(e)?a.getElementById(e):e}function c(e){return H("string"==typeof e?s(e):e)}function r(e,t,n){var r,o,i=c(e);return void 0===(o=i.length?(r=W[t])&&r.get?r.get(i,t):i.attr(t):o)?n||"":o}function o(e){var t=s(e);return t?t.attributes:[]}function i(e,t,n){""===n&&(n=null);var r,o=c(e),i=o.attr(t);o.length&&((r=W[t])&&r.set?r.set(o,n,t):o.attr(t,n),i!==n&&u.onSetAttrib&&u.onSetAttrib({attrElm:o,attrName:t,attrValue:n}))}function l(){return u.root_element||a.body}function f(e,t){return function(e,t,n){var r,o=0,i=0,a=e.ownerDocument;if(n=n||e,t){if(n===e&&t.getBoundingClientRect&&"static"===xn(Nt.fromDom(e),"position")){var u=t.getBoundingClientRect();return{x:o=u.left+(a.documentElement.scrollLeft||e.scrollLeft)-a.documentElement.clientLeft,y:i=u.top+(a.documentElement.scrollTop||e.scrollTop)-a.documentElement.clientTop}}for(var s=t;s&&s!==n&&s.nodeType&&!Nn(s,n);){var c=s;o+=c.offsetLeft||0,i+=c.offsetTop||0,s=c.offsetParent}for(s=t.parentNode;s&&s!==n&&s.nodeType&&!Nn(s,n);)o-=s.scrollLeft||0,i-=s.scrollTop||0,s=s.parentNode;i+=(r=Nt.fromDom(t),Zn.isFirefox()&&"table"===kt(r)?En(Dn(r)).filter(function(e){return"caption"===kt(e)}).bind(function(o){return En(It(o)).map(function(e){var t=e.dom.offsetTop,n=o.dom.offsetTop,r=o.dom.offsetHeight;return t<=n?-r:0})}).getOr(0):0)}return{x:o,y:i}}(a.body,s(e),t)}function d(e,t,n){var r=c(e);return n?r.css(t):("float"===(t=t.replace(/-(\D)/g,function(e,t){return t.toUpperCase()}))&&(t=xt.browser.isIE()?"styleFloat":"cssFloat"),r[0]&&r[0].style?r[0].style[t]:void 0)}function m(e){var t=d(e=s(e),"width"),n=d(e,"height");return-1===t.indexOf("px")&&(t=0),-1===n.indexOf("px")&&(n=0),{w:parseInt(t,10)||e.offsetWidth||e.clientWidth,h:parseInt(n,10)||e.offsetHeight||e.clientHeight}}function g(e,t){if(!e)return!1;if(!Array.isArray(e)){if("*"===t)return 1===e.nodeType;if(Ga.test(t)){for(var n=t.toLowerCase().split(/,/),r=e.nodeName.toLowerCase(),o=n.length-1;0<=o;o--)if(n[o]===r)return!0;return!1}if(e.nodeType&&1!==e.nodeType)return!1}var i=Array.isArray(e)?e:[e];return 0<aa(t,i[0].ownerDocument||i[0],null,i).length}function p(e,t,n,r){var o,i=[],a=s(e);for(r=void 0===r,n=n||("BODY"!==l().nodeName?l().parentNode:null),Et.is(t,"string")&&(t="*"===(o=t)?function(e){return 1===e.nodeType}:function(e){return g(e,o)});a&&!(a===n||K(a.nodeType)||qn(a)||$n(a));){if(!t||"function"==typeof t&&t(a)){if(!r)return[a];i.push(a)}a=a.parentNode}return r?i:null}function n(e,t,n){var r=t;if(e)for("string"==typeof t&&(r=function(e){return g(e,t)}),e=e[n];e;e=e[n])if("function"==typeof r&&r(e))return e;return null}function h(e,n,r){var o,t="string"==typeof e?s(e):e;return!!t&&(Et.isArray(t)&&(t.length||0===t.length)?(o=[],Ka(t,function(e,t){e&&o.push(n.call(r,"string"==typeof e?s(e):e,t))}),o):n.call(r||this,t))}function v(e,t){c(e).each(function(e,n){Ka(t,function(e,t){i(n,t,e)})})}function b(e,n){var t=c(e);Ya?t.each(function(e,t){if(!1!==t.canHaveHTML){for(;t.firstChild;)t.removeChild(t.firstChild);try{t.innerHTML="<br>"+n,t.removeChild(t.firstChild)}catch(e){Wa("<div></div>").html("<br>"+n).contents().slice(1).appendTo(t)}return n}}):t.html(n)}function y(e,n,r,o,i){return h(e,function(e){var t="string"==typeof n?a.createElement(n):n;return v(t,r),o&&("string"!=typeof o&&o.nodeType?t.appendChild(o):"string"==typeof o&&b(t,o)),i?t:e.appendChild(t)})}function C(e,t,n){return y(a.createElement(e),e,t,n,!0)}function x(e,t){var n=c(e);return(t?n.each(function(){for(var e;e=this.firstChild;)3===e.nodeType&&0===e.data.length?this.removeChild(e):this.parentNode.insertBefore(e,this)}):n).remove(),1<n.length?n.toArray():n[0]}function w(e,t,n){c(e).toggleClass(t,n).each(function(){""===this.className&&Wa(this).attr("class",null)})}function S(t,e,n){return h(e,function(e){return Et.is(e,"array")&&(t=t.cloneNode(!0)),n&&Ka(Xa(e.childNodes),function(e){t.appendChild(e)}),e.parentNode.replaceChild(t,e)})}function E(e){if(zn(e)){var t="a"===e.nodeName.toLowerCase()&&!r(e,"href")&&r(e,"id");return r(e,"name")||r(e,"data-mce-bookmark")||t?1:void 0}}function N(){return a.createRange()}function k(e){if(e&&zn(e)){var t=e.getAttribute("data-mce-contenteditable");return t&&"inherit"!==t?t:"inherit"!==e.contentEditable?e.contentEditable:null}return null}void 0===u&&(u={});var _,A,R,D,e,t,T={},O=window,B={},P=0,L=Ar.forElement(Nt.fromDom(a),{contentCssCors:u.contentCssCors,referrerPolicy:u.referrerPolicy}),I=[],M=u.schema||to({}),F=ro({url_converter:u.url_converter,url_converter_scope:u.url_converter_scope},u.schema),U=u.ownEvents?new ai:ai.Event,z=M.getBlockElements(),H=Wa.overrideDefaults(function(){return{context:a,element:$.getRoot()}}),j=Go.encodeAllRaw,V=function(e,t,n,r){if(Et.isArray(e)){for(var o=e.length,i=[];o--;)i[o]=V(e[o],t,n,r);return i}return!u.collect||e!==a&&e!==O||I.push([e,t,n,r]),U.bind(e,t,n,r||$)},q=function(e,t,n){if(Et.isArray(e)){for(var r=e.length,o=[];r--;)o[r]=q(e[r],t,n);return o}if(0<I.length&&(e===a||e===O))for(r=I.length;r--;){var i=I[r];e!==i[0]||t&&t!==i[1]||n&&n!==i[2]||U.unbind(i[0],i[1],i[2])}return U.unbind(e,t,n)},$={doc:a,settings:u,win:O,files:B,stdMode:!0,boxModel:!0,styleSheetLoader:L,boundEvents:I,styles:F,schema:M,events:U,isBlock:function(e){if("string"==typeof e)return!!z[e];if(e){var t=e.nodeType;if(t)return!(1!==t||!z[e.nodeName])}return!1},$:H,$$:c,root:null,clone:function(t,e){if(!Ya||1!==t.nodeType||e)return t.cloneNode(e);var n=a.createElement(t.nodeName);return Ka(o(t),function(e){i(n,e.nodeName,r(t,e.nodeName))}),n},getRoot:l,getViewPort:function(e){var t=tn(e);return{x:t.x,y:t.y,w:t.width,h:t.height}},getRect:function(e){var t=f(e=s(e)),n=m(e);return{x:t.x,y:t.y,w:n.w,h:n.h}},getSize:m,getParent:function(e,t,n){var r=p(e,t,n,!1);return r&&0<r.length?r[0]:null},getParents:p,get:s,getNext:function(e,t){return n(e,t,"nextSibling")},getPrev:function(e,t){return n(e,t,"previousSibling")},select:function(e,t){return aa(e,s(t)||u.root_element||a,[])},is:g,add:y,create:C,createHTML:function(e,t,n){var r,o="";for(r in o+="<"+e,t)se(t,r)&&(o+=" "+r+'="'+j(t[r])+'"');return void 0!==n?o+">"+n+"</"+e+">":o+" />"},createFragment:function(e){var t,n=a.createElement("div"),r=a.createDocumentFragment();for(r.appendChild(n),e&&(n.innerHTML=e);t=n.firstChild;)r.appendChild(t);return r.removeChild(n),r},remove:x,setStyle:function(e,t,n){var r=X(t)?c(e).css(t,n):c(e).css(t);u.update_styles&&qa(F,r)},getStyle:d,setStyles:function(e,t){var n=c(e).css(t);u.update_styles&&qa(F,n)},removeAllAttribs:function(e){return h(e,function(e){for(var t=e.attributes,n=t.length-1;0<=n;n--)e.removeAttributeNode(t.item(n))})},setAttrib:i,setAttribs:v,getAttrib:r,getPos:f,parseStyle:function(e){return F.parse(e)},serializeStyle:function(e,t){return F.serialize(e,t)},addStyle:function(e){var t,n;if($!==Ja.DOM&&a===document){if(T[e])return;T[e]=!0}(n=a.getElementById("mceDefaultStyles"))||((n=a.createElement("style")).id="mceDefaultStyles",n.type="text/css",(t=a.getElementsByTagName("head")[0]).firstChild?t.insertBefore(n,t.firstChild):t.appendChild(n)),n.styleSheet?n.styleSheet.cssText+=e:n.appendChild(a.createTextNode(e))},loadCSS:function(e){Y((e=e||"").split(","),function(e){B[e]=!0,L.load(e,te)})},addClass:function(e,t){c(e).addClass(t)},removeClass:function(e,t){w(e,t,!1)},hasClass:function(e,t){return c(e).hasClass(t)},toggleClass:w,show:function(e){c(e).show()},hide:function(e){c(e).hide()},isHidden:function(e){return"none"===c(e).css("display")},uniqueId:function(e){return(e||"mce_")+P++},setHTML:b,getOuterHTML:function(e){var t="string"==typeof e?s(e):e;return zn(t)?t.outerHTML:Wa("<div></div>").append(Wa(t).clone()).html()},setOuterHTML:function(e,t){c(e).each(function(){try{if("outerHTML"in this)return void(this.outerHTML=t)}catch(e){}x(Wa(this).html(t),!0)})},decode:Go.decode,encode:j,insertAfter:function(e,t){var r=s(t);return h(e,function(e){var t=r.parentNode,n=r.nextSibling;return n?t.insertBefore(e,n):t.appendChild(e),e})},replace:S,rename:function(t,e){var n;return t.nodeName!==e.toUpperCase()&&(n=C(e),Ka(o(t),function(e){i(n,e.nodeName,r(t,e.nodeName))}),S(n,t,!0)),n||t},findCommonAncestor:function(e,t){for(var n,r=e;r;){for(n=t;n&&r!==n;)n=n.parentNode;if(r===n)break;r=r.parentNode}return!r&&e.ownerDocument?e.ownerDocument.documentElement:r},toHex:function(e){return F.toHex(Et.trim(e))},run:h,getAttribs:o,isEmpty:function(e,t){var n,r,o=0;if(E(e))return!1;if(e=e.firstChild){var i=new Rr(e,e.parentNode),a=M?M.getWhiteSpaceElements():{};t=t||(M?M.getNonEmptyElements():null);do{if(n=e.nodeType,zn(e)){var u=e.getAttribute("data-mce-bogus");if(u){e=i.next("all"===u);continue}if(r=e.nodeName.toLowerCase(),t&&t[r]){if("br"!==r)return!1;o++,e=i.next();continue}if(E(e))return!1}if(8===n)return!1;if(3===n&&!qr(e.nodeValue))return!1;if(3===n&&e.parentNode&&a[e.parentNode.nodeName]&&qr(e.nodeValue))return!1;e=i.next()}while(e)}return o<=1},createRng:N,nodeIndex:$a,split:function(e,t,n){var r,o,i,a=N();if(e&&t)return a.setStart(e.parentNode,$a(e)),a.setEnd(t.parentNode,$a(t)),r=a.extractContents(),(a=N()).setStart(t.parentNode,$a(t)+1),a.setEnd(e.parentNode,$a(e)+1),o=a.extractContents(),(i=e.parentNode).insertBefore(zo($,r),e),n?i.insertBefore(n,e):i.insertBefore(t,e),i.insertBefore(zo($,o),e),x(e),n||t},bind:V,unbind:q,fire:function(e,t,n){return U.fire(e,t,n)},getContentEditable:k,getContentEditableParent:function(e){for(var t=l(),n=null;e&&e!==t&&null===(n=k(e));e=e.parentNode);return n},destroy:function(){if(0<I.length)for(var e=I.length;e--;){var t=I[e];U.unbind(t[0],t[1],t[2])}ne(B,function(e,t){L.unload(t),delete B[t]}),aa.setDocument&&aa.setDocument()},isChildOf:function(e,t){if(Ya){for(;e;){if(t===e)return!0;e=e.parentNode}return!1}return e===t||t.contains(e)},dumpRng:function(e){return"startContainer: "+e.startContainer.nodeName+", startOffset: "+e.startOffset+", endContainer: "+e.endContainer.nodeName+", endOffset: "+e.endOffset}},W=(_=F,R=J($),e={set:function(e,t,n){A.url_converter&&null!==t&&(t=A.url_converter.call(A.url_converter_scope||R(),t,n,e[0])),e.attr("data-mce-"+n,t).attr(n,t)},get:function(e,t){return e.attr("data-mce-"+t)||e.attr(t)}},t={style:{set:function(e,t){null===t||"object"!=typeof t?(D&&e.attr("data-mce-style",t),null!==t&&"string"==typeof t?(e.removeAttr("style"),e.css(_.parse(t))):e.attr("style",t)):e.css(t)},get:function(e){var t=e.attr("data-mce-style")||e.attr("style");return _.serialize(_.parse(t),e[0].nodeName)}}},(D=(A=u).keep_values)&&(t.href=t.src=e),t);return $};Ja.DOM=Ja(document),Ja.nodeIndex=$a;var Qa=Ja.DOM,Za=Et.each,eu=Et.grep,tu=(nu.prototype._setReferrerPolicy=function(e){this.settings.referrerPolicy=e},nu.prototype.loadScript=function(e,t,n){function r(){o.remove(i),a&&(a.onerror=a.onload=a=null)}var o=Qa,i=o.uniqueId(),a=document.createElement("script");a.id=i,a.type="text/javascript",a.src=Et._addCacheSuffix(e),this.settings.referrerPolicy&&o.setAttrib(a,"referrerpolicy",this.settings.referrerPolicy),a.onload=function(){r(),t()},a.onerror=function(){r(),y(n)?n():"undefined"!=typeof console&&console.log&&console.log("Failed to load script: "+e)},(document.getElementsByTagName("head")[0]||document.body).appendChild(a)},nu.prototype.isDone=function(e){return 2===this.states[e]},nu.prototype.markDone=function(e){this.states[e]=2},nu.prototype.add=function(e,t,n,r){var o=this.states[e];this.queue.push(e),void 0===o&&(this.states[e]=0),t&&(this.scriptLoadedCallbacks[e]||(this.scriptLoadedCallbacks[e]=[]),this.scriptLoadedCallbacks[e].push({success:t,failure:r,scope:n||this}))},nu.prototype.load=function(e,t,n,r){return this.add(e,t,n,r)},nu.prototype.remove=function(e){delete this.states[e],delete this.scriptLoadedCallbacks[e]},nu.prototype.loadQueue=function(e,t,n){this.loadScripts(this.queue,e,t,n)},nu.prototype.loadScripts=function(n,e,t,r){function o(t,e){Za(i.scriptLoadedCallbacks[e],function(e){y(e[t])&&e[t].call(e.scope)}),i.scriptLoadedCallbacks[e]=void 0}var i=this,a=[];i.queueLoadedCallbacks.push({success:e,failure:r,scope:t||this});var u=function(){var e,t=eu(n);n.length=0,Za(t,function(e){2!==i.states[e]?3!==i.states[e]?1!==i.states[e]&&(i.states[e]=1,i.loading++,i.loadScript(e,function(){i.states[e]=2,i.loading--,o("success",e),u()},function(){i.states[e]=3,i.loading--,a.push(e),o("failure",e),u()})):o("failure",e):o("success",e)}),i.loading||(e=i.queueLoadedCallbacks.slice(0),i.queueLoadedCallbacks.length=0,Za(e,function(e){0===a.length?y(e.success)&&e.success.call(e.scope):y(e.failure)&&e.failure.call(e.scope,a)}))};u()},nu.ScriptLoader=new nu,nu);function nu(e){void 0===e&&(e={}),this.states={},this.queue=[],this.scriptLoadedCallbacks={},this.queueLoadedCallbacks=[],this.loading=0,this.settings=e}function ru(e){var t=e;return{get:function(){return t},set:function(e){t=e}}}function ou(){return ue(iu,au.get())}var iu={},au=ru("en"),uu={getData:function(){return re(iu,function(e){return _e({},e)})},setCode:function(e){e&&au.set(e)},getCode:function(){return au.get()},add:function(e,t){var n=iu[e];n||(iu[e]=n={}),ne(t,function(e,t){n[t.toLowerCase()]=e})},translate:function(e){function n(e){return y(e)?Object.prototype.toString.call(e):u(e)?"":""+e}function t(e){var t=n(e);return ue(a,t.toLowerCase()).map(n).getOr(t)}function r(e){return e.replace(/{context:\w+}$/,"")}var o,i,a=ou().getOr({}),u=function(e){return""===e||null==e};if(u(e))return"";if(h(o=e)&&Ne(o,"raw"))return n(e.raw);if(S(i=e)&&1<i.length){var s=e.slice(1);return r(t(e[0]).replace(/\{([0-9]+)\}/g,function(e,t){return Ne(s,t)?n(s[t]):e}))}return r(t(e))},isRtl:function(){return ou().bind(function(e){return ue(e,"_dir")}).exists(function(e){return"rtl"===e})},hasCode:function(e){return Ne(iu,e)}},su=function(){function u(t,n){Y(U(r,function(e){return e.name===t&&e.state===n}),function(e){return e.callback()})}function s(e){var t;return(f[e]?f[e].dependencies:t)||[]}function c(e,t){return"object"==typeof t?t:"string"==typeof e?{prefix:"",resource:t,suffix:""}:{prefix:e.prefix,resource:t,suffix:e.suffix}}function e(e,t,n){void 0===n&&(n="added"),Ne(f,e)&&"added"===n||Ne(l,e)&&"loaded"===n?t():r.push({name:e,state:n,callback:t})}var o=[],l={},f={},r=[],d=function(r,o,i,a,e){var t,n;l[r]||(0!==(t="string"==typeof o?o:o.prefix+o.resource+o.suffix).indexOf("/")&&-1===t.indexOf("://")&&(t=su.baseURL+"/"+t),l[r]=t.substring(0,t.lastIndexOf("/")),n=function(){var n,e,t;u(r,"loaded"),n=o,e=i,t=a,Y(s(r),function(e){var t=c(n,e);d(t.resource,t,void 0,void 0)}),e&&(t?e.call(t):e.call(tu))},f[r]?n():tu.ScriptLoader.add(t,n,a,e))};return{items:o,urls:l,lookup:f,_listeners:r,get:function(e){if(f[e])return f[e].instance},dependencies:s,requireLangPack:function(t,n){!1!==su.languageLoad&&e(t,function(){var e=uu.getCode();!e||n&&-1===(","+(n||"")+",").indexOf(","+e+",")||tu.ScriptLoader.add(l[t]+"/langs/"+e+".js")},"loaded")},add:function(e,t,n){var r=t;return o.push(r),f[e]={instance:r,dependencies:n},u(e,"added"),r},remove:function(e){delete l[e],delete f[e]},createUrl:c,addComponents:function(e,t){var n=l[e];Y(t,function(e){tu.ScriptLoader.add(n+"/"+e)})},load:d,waitFor:e}};function cu(){var e,t,n=(e=te,t=ru(ve.none()),{clear:function(){r(),t.set(ve.none())},isSet:function(){return t.get().isSome()},get:function(){return t.get()},set:function(e){r(),t.set(ve.some(e))}});function r(){return t.get().each(e)}return _e(_e({},n),{on:function(e){return n.get().each(e)}})}function lu(n,r){var o=null;return{cancel:function(){l(o)||(clearTimeout(o),o=null)},throttle:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];l(o)&&(o=setTimeout(function(){o=null,n.apply(null,e)},r))}}}function fu(n,r){function o(){l(i)||(clearTimeout(i),i=null)}var i=null;return{cancel:o,throttle:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];o(),i=setTimeout(function(){i=null,n.apply(null,e)},r)}}}function du(e,t){var n=vn(e,t);return void 0===n||""===n?[]:n.split(" ")}function mu(e){return void 0!==e.dom.classList}function gu(e,t){var n,r,o;mu(e)?e.dom.classList.add(t):(r=t,o=du(n=e,"class").concat([r]),pn(n,"class",o.join(" ")))}function pu(e,t){return mu(e)&&e.dom.classList.contains(t)}function hu(e,t){return He(n=void 0===e?document:e.dom)?[]:T(n.querySelectorAll(t),Nt.fromDom);var n}function vu(r,e){function t(e,t){return(n=e.dom)&&n.hasAttribute&&n.hasAttribute(t)?ve.some(vn(e,t)):ve.none();var n}var n=r.selection.getRng(),o=Nt.fromDom(n.startContainer),i=Nt.fromDom(r.getBody()),a=e.fold(function(){return"."+ju()},function(e){return"["+Vu()+'="'+e+'"]'});return br(Mt(o,n.startOffset).getOr(o),a,function(e){return je(e,i)}).bind(function(e){return t(e,""+qu()).bind(function(n){return t(e,""+Vu()).map(function(e){var t=$u(r,n);return{uid:n,name:e,elements:t}})})})}function bu(t){function o(){return{listeners:[],previous:cu()}}function c(e,t){n(e,function(e){return t(e),e})}function n(e,t){var n=i.get(),r=t(ue(n,e).getOrThunk(o));n[e]=r,i.set(n)}var i=ru({}),e=fu(function(){var e=i.get();Y(W(we(e)),function(e){n(e,function(u){var s=u.previous.get();return vu(t,ve.some(e)).fold(function(){var t;s.isSome()&&(c(t=e,function(e){Y(e.listeners,function(e){return e(!1,t)})}),u.previous.clear())},function(e){var t,n,r,o=e.uid,i=e.name,a=e.elements;fn(s,o)||(n=o,r=a,c(t=i,function(e){Y(e.listeners,function(e){return e(!0,t,{uid:n,nodes:T(r,function(e){return e.dom})})})}),u.previous.set(o))}),{previous:u.previous,listeners:u.listeners}})})},30);return t.on("remove",function(){e.cancel()}),t.on("NodeChange",function(){e.throttle()}),{addListener:function(e,t){n(e,function(e){return{previous:e.previous,listeners:e.listeners.concat([t])}})}}}function yu(e){var t=(new Date).getTime();return e+"_"+Math.floor(1e9*Math.random())+ ++Wu+String(t)}function Cu(e,t){var n,r,o=Rt(e).dom,i=Nt.fromDom(o.createDocumentFragment());Kt(i,(n=t,(r=(o||document).createElement("div")).innerHTML=n,Dn(Nt.fromDom(r)))),Xt(e),Pn(e,i)}function xu(e,t){return Nt.fromDom(e.dom.cloneNode(t))}function wu(e){return xu(e,!1)}function Su(e){return xu(e,!0)}function Eu(e,t,n){function r(e){for(var t;(t=o[e]())&&!jn(t)&&!n(t););return ve.from(t).filter(jn)}void 0===n&&(n=R);var o=new Rr(e,t);return{current:function(){return ve.from(o.current()).filter(jn)},next:function(){return r("next")},prev:function(){return r("prev")},prev2:function(){return r("prev2")}}}function Nu(t,e){var i=e||function(e){return t.isBlock(e)||Wn(e)||Yn(e)},a=function(e,t,n,r){if(jn(e)){var o=r(e,t,e.data);if(-1!==o)return ve.some({container:e,offset:o})}return n().bind(function(e){return a(e.container,e.offset,n,r)})};return{backwards:function(e,t,n,r){var o=Eu(e,r,i);return a(e,t,function(){return o.prev().map(function(e){return{container:e,offset:e.length}})},n).getOrNull()},forwards:function(e,t,n,r){var o=Eu(e,r,i);return a(e,t,function(){return o.next().map(function(e){return{container:e,offset:0}})},n).getOrNull()}}}function ku(e){return e?{left:Ku(e.left),top:Ku(e.top),bottom:Ku(e.bottom),right:Ku(e.right),width:Ku(e.width),height:Ku(e.height)}:{left:0,top:0,bottom:0,right:0,width:0,height:0}}function _u(e,t){return e=ku(e),t||(e.left=e.left+e.width),e.right=e.left,e.width=0,e}function Au(e,t,n){return 0<=e&&e<=Math.min(t.height,n.height)/2}function Ru(e,t){var n=Math.min(t.height/2,e.height/2);return e.bottom-n<t.top||!(e.top>t.bottom)&&Au(t.top-e.bottom,e,t)}function Du(e,t){return e.top>t.bottom||!(e.bottom<t.top)&&Au(t.bottom-e.top,e,t)}function Tu(e,t,n){return t>=e.left&&t<=e.right&&n>=e.top&&n<=e.bottom}function Ou(e){var t=e.startContainer,n=e.startOffset;return t.hasChildNodes()&&e.endOffset===n+1?t.childNodes[n]:null}function Bu(e,t){if(zn(e)&&e.hasChildNodes()){var n=e.childNodes;return n[r=n.length-1,Math.min(Math.max(t,0),r)]}return e;var r}function Pu(e){return"string"==typeof e&&768<=e.charCodeAt(0)&&Xu.test(e)}function Lu(e){return"createRange"in e?e.createRange():Ja.DOM.createRng()}function Iu(e){return e&&/[\r\n\t ]/.test(e)}function Mu(e){return e.setStart&&e.setEnd}function Fu(e){var t=e.startContainer,n=e.startOffset;if(Iu(e.toString())&&es(t.parentNode)&&jn(t)){var r=t.data;return Iu(r[n-1])||Iu(r[n+1])?1:void 0}}function Uu(e){return 0===e.left&&0===e.right&&0===e.top&&0===e.bottom}function zu(e,t){var n=_u(e,t);return n.width=1,n.right=n.left+1,n}su.languageLoad=!0,su.baseURL="",su.PluginManager=su(),su.ThemeManager=su();var Hu=function(e,t){var n=[];return Y(Dn(e),function(e){n=(n=t(e)?n.concat([e]):n).concat(Hu(e,t))}),n},ju=J("mce-annotation"),Vu=J("data-mce-annotation"),qu=J("data-mce-annotation-uid"),$u=function(e,t){return hu(Nt.fromDom(e.getBody()),"["+qu()+'="'+t+'"]')},Wu=0,Ku=Math.round,Xu=new RegExp("[\u0300-\u036f\u0483-\u0487\u0488-\u0489\u0591-\u05bd\u05bf\u05c1-\u05c2\u05c4-\u05c5\u05c7\u0610-\u061a\u064b-\u065f\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7-\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08e3-\u0902\u093a\u093c\u0941-\u0948\u094d\u0951-\u0957\u0962-\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2-\u09e3\u0a01-\u0a02\u0a3c\u0a41-\u0a42\u0a47-\u0a48\u0a4b-\u0a4d\u0a51\u0a70-\u0a71\u0a75\u0a81-\u0a82\u0abc\u0ac1-\u0ac5\u0ac7-\u0ac8\u0acd\u0ae2-\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62-\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c00\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55-\u0c56\u0c62-\u0c63\u0c81\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc-\u0ccd\u0cd5-\u0cd6\u0ce2-\u0ce3\u0d01\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62-\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb-\u0ebc\u0ec8-\u0ecd\u0f18-\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86-\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039-\u103a\u103d-\u103e\u1058-\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085-\u1086\u108d\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752-\u1753\u1772-\u1773\u17b4-\u17b5\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927-\u1928\u1932\u1939-\u193b\u1a17-\u1a18\u1a1b\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1ab0-\u1abd\u1abe\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80-\u1b81\u1ba2-\u1ba5\u1ba8-\u1ba9\u1bab-\u1bad\u1be6\u1be8-\u1be9\u1bed\u1bef-\u1bf1\u1c2c-\u1c33\u1c36-\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1cf8-\u1cf9\u1dc0-\u1df5\u1dfc-\u1dff\u200c-\u200d\u20d0-\u20dc\u20dd-\u20e0\u20e1\u20e2-\u20e4\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302d\u302e-\u302f\u3099-\u309a\ua66f\ua670-\ua672\ua674-\ua67d\ua69e-\ua69f\ua6f0-\ua6f1\ua802\ua806\ua80b\ua825-\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\ua9e5\uaa29-\uaa2e\uaa31-\uaa32\uaa35-\uaa36\uaa43\uaa4c\uaa7c\uaab0\uaab2-\uaab4\uaab7-\uaab8\uaabe-\uaabf\uaac1\uaaec-\uaaed\uaaf6\uabe5\uabe8\uabed\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\uff9e-\uff9f]"),Yu=zn,Gu=jr,Ju=an("display","block table"),Qu=an("float","left right"),Zu=function(){for(var n=[],e=0;e<arguments.length;e++)n[e]=arguments[e];return function(e){for(var t=0;t<n.length;t++)if(!n[t](e))return!1;return!0}}(Yu,Gu,s(Qu)),es=s(an("white-space","pre pre-line pre-wrap")),ts=jn,ns=Wn,rs=Ja.nodeIndex,os=function(e,t){if(!(t<0&&zn(e)&&e.hasChildNodes()))return Bu(e,t)},is=function(e){var t=e.getClientRects(),n=0<t.length?ku(t[0]):ku(e.getBoundingClientRect());return!Mu(e)&&ns(e)&&Uu(n)?function(e){var t=e.ownerDocument,n=Lu(t),r=t.createTextNode(yo),o=e.parentNode;o.insertBefore(r,e),n.setStart(r,0),n.setEnd(r,1);var i=ku(n.getBoundingClientRect());return o.removeChild(r),i}(e):Uu(n)&&Mu(e)?function(e){var t=e.startContainer,n=e.endContainer,r=e.startOffset,o=e.endOffset;if(t===n&&jn(n)&&0===r&&1===o){var i=e.cloneRange();return i.setEndAfter(n),is(i)}return null}(e):n},as=function(t,n,e){function r(){return e=e||function(e){function r(e){var t;0!==e.height&&(0<o.length&&(t=o[o.length-1],e.left===t.left&&e.top===t.top&&e.bottom===t.bottom&&e.right===t.right)||o.push(e))}function t(e,t){var n=Lu(e.ownerDocument);if(t<e.data.length){if(Pu(e.data[t]))return o;if(Pu(e.data[t-1])&&(n.setStart(e,t),n.setEnd(e,t+1),!Fu(n)))return r(zu(is(n),!1)),o}0<t&&(n.setStart(e,t-1),n.setEnd(e,t),Fu(n)||r(zu(is(n),!1))),t<e.data.length&&(n.setStart(e,t),n.setEnd(e,t+1),Fu(n)||r(zu(is(n),!0)))}var o=[],n=e.container(),i=e.offset();if(ts(n))return t(n,i),o;if(Yu(n))if(e.isAtEnd()){var a=os(n,i);ts(a)&&t(a,a.data.length),Zu(a)&&!ns(a)&&r(zu(is(a),!1))}else{if(a=os(n,i),ts(a)&&t(a,0),Zu(a)&&e.isAtEnd())return r(zu(is(a),!1)),o;var u=os(e.container(),e.offset()-1);Zu(u)&&!ns(u)&&(!Ju(u)&&!Ju(a)&&Zu(a)||r(zu(is(u),!1))),Zu(a)&&r(zu(is(a),!0))}return o}(as(t,n))}return{container:J(t),offset:J(n),toRange:function(){var e=Lu(t.ownerDocument);return e.setStart(t,n),e.setEnd(t,n),e},getClientRects:r,isVisible:function(){return 0<r().length},isAtStart:function(){return ts(t),0===n},isAtEnd:function(){return ts(t)?n>=t.data.length:n>=t.childNodes.length},isEqual:function(e){return e&&t===e.container()&&n===e.offset()},getNode:function(e){return os(t,e?n-1:n)}}};function us(e,t){jn(t)&&0===t.data.length&&e.remove(t)}function ss(e,t,n){var r,o,i,a,u,s,c;$n(n)?(i=e,a=t,s=ve.from((u=n).firstChild),c=ve.from(u.lastChild),a.insertNode(u),s.each(function(e){return us(i,e.previousSibling)}),c.each(function(e){return us(i,e.nextSibling)})):(r=e,t.insertNode(o=n),us(r,o.previousSibling),us(r,o.nextSibling))}function cs(t){return function(e){return t===e}}function ls(e){var t,r,n,o;return(uc(e)?"text()":e.nodeName.toLowerCase())+"["+(r=fc(lc(t=e)),n=ge(r,cs(t),t),o=me(r=r.slice(0,n+1),function(e,t,n){return uc(t)&&uc(r[n-1])&&e++,e},0),ge(r=fe(r,on([t.nodeName])),cs(t),t)-o)+"]"}function fs(e,t){var n,r,o,i=[],a=t.container(),u=t.offset();return uc(a)?n=function(e,t){for(;(e=e.previousSibling)&&uc(e);)t+=e.data.length;return t}(a,u):(u>=(r=a.childNodes).length?(n="after",u=r.length-1):n="before",a=r[u]),i.push(ls(a)),o=fe(function(e,t){var n=[];for(t=t.parentNode;t!==e;t=t.parentNode)n.push(t);return n}(e,a),s(sn)),(i=i.concat(le(o,ls))).reverse().join("/")+","+n}function ds(e,t){if(!t)return null;var n=t.split(","),r=n[0].split("/"),o=1<n.length?n[1]:"before",i=me(r,function(e,t){var n,r,o,i,a=/([\w\-\(\)]+)\[([0-9]+)\]/.exec(t);return a?("text()"===a[1]&&(a[1]="#text"),n=e,r=a[1],o=parseInt(a[2],10),i=fe(i=fc(n),function(e,t){return!uc(e)||!uc(i[t-1])}),(i=fe(i,on([r])))[o]):null},e);return i?uc(i)?function(e,t){for(var n,r=e,o=0;uc(r);){if(n=r.data.length,o<=t&&t<=o+n){e=r,t-=o;break}if(!uc(r.nextSibling)){e=r,t=n;break}o+=n,r=r.nextSibling}return uc(e)&&t>e.data.length&&(t=e.data.length),as(e,t)}(i,parseInt(o,10)):(o="after"===o?cc(i)+1:cc(i),as(i.parentNode,o)):null}function ms(e,t,n,r,o){var i,a=r[o?"startContainer":"endContainer"],u=r[o?"startOffset":"endOffset"],s=[],c=0,l=e.getRoot();for(jn(a)?s.push(n?function(e,t,n){for(var r=e(t.data.slice(0,n)).length,o=t.previousSibling;o&&jn(o);o=o.previousSibling)r+=e(o.data).length;return r}(t,a,u):u):(u>=(i=a.childNodes).length&&i.length&&(c=1,u=Math.max(0,i.length-1)),s.push(e.nodeIndex(i[u],n)+c));a&&a!==l;a=a.parentNode)s.push(e.nodeIndex(a,n));return s}function gs(e,t,n){var r=0;return Et.each(e.select(t),function(e){if("all"!==e.getAttribute("data-mce-bogus"))return e!==n&&void r++}),r}function ps(e,t){var n,r=t?"start":"end",o=e[r+"Container"],i=e[r+"Offset"];zn(o)&&"TR"===o.nodeName&&(o=(n=o.childNodes)[Math.min(t?i:i-1,n.length-1)])&&(i=t?0:o.childNodes.length,e["set"+(t?"Start":"End")](o,i))}function hs(e){return ps(e,!0),ps(e,!1),e}function vs(e,t){var n;return zn(e)&&(e=Bu(e,t),dc(e))?e:Ir(e)?(n=(e=jn(e)&&Pr(e)?e.parentNode:e).previousSibling,dc(n)?n:(n=e.nextSibling,dc(n)?n:void 0)):void 0}function bs(e,t,n){var r=n.getNode(),o=r?r.nodeName:null,i=n.getRng();if(dc(r)||"IMG"===o)return{name:o,index:gs(n.dom,o,r)};var a,u,s,c,l,f,d,m=vs((a=i).startContainer,a.startOffset)||vs(a.endContainer,a.endOffset);return m?{name:o=m.tagName,index:gs(n.dom,o,m)}:(f=(s=n).dom,(d={}).start=ms(f,u=e,c=t,l=i,!0),s.isCollapsed()||(d.end=ms(f,u,c,l,!1)),Hr(l)&&(d.isFakeCaret=!0),d)}function ys(e,t,n){var r={"data-mce-type":"bookmark",id:t,style:"overflow:hidden;line-height:0px"};return n?e.create("span",r,"&#xFEFF;"):e.create("span",r)}function Cs(e,t){var n=e.dom,r=e.getRng(),o=n.uniqueId(),i=e.isCollapsed(),a=e.getNode(),u=a.nodeName;if("IMG"===u)return{name:u,index:gs(n,u,a)};var s=hs(r.cloneRange());return i||(s.collapse(!1),ss(n,s,ys(n,o+"_end",t))),(r=hs(r)).collapse(!0),ss(n,r,ys(n,o+"_start",t)),e.moveToBookmark({id:o,keep:!0}),{id:o}}function xs(e,t,n){var r=e.getParam(t,n);return-1===r.indexOf("=")?r:ue(e.getParam(t,"","hash"),e.id).getOr(n)}function ws(e){return e.getParam("content_security_policy","")}function Ss(e){if(e.getParam("force_p_newlines",!1))return"p";var t=e.getParam("forced_root_block","p");return!1===t?"":!0===t?"p":t}function Es(e){return e.getParam("forced_root_block_attrs",{})}function Ns(e){return e.getParam("automatic_uploads",!0,"boolean")}function ks(e){return e.getParam("icons","","string")}function _s(e){return e.getParam("referrer_policy","","string")}function As(e){return e.getParam("language","en","string")}function Rs(e){return e.getParam("indent_use_margin",!1)}function Ds(e){var t=e.getParam("font_css",[]);return S(t)?t:T(t.split(","),Je)}function Ts(e){var t=e.getParam("object_resizing");return!1!==t&&!xt.iOS&&(X(t)?t:"table,img,figure.image,div,video,iframe")}function Os(e){return e.getParam("event_root")}function Bs(e){return e.getParam("theme")}function Ps(e){return!1!==e.getParam("inline_boundaries")}function Ls(e){return e.getParam("plugins","","string")}function Is(e){var t=e.parentNode;t&&t.removeChild(e)}function Ms(e){var t=wo(e);return{count:e.length-t.length,text:t}}function Fs(e){for(var t;-1!==(t=e.data.lastIndexOf(Co));)e.deleteData(t,1)}function Us(e,t){return vc(e),t}function zs(e,t){var n,r=t.container(),o=(-1===(n=_(xe(r.childNodes),e))?ve.none():ve.some(n)).map(function(e){return e<t.offset()?as(r,t.offset()-1):t}).getOr(t);return vc(e),o}function Hs(e,t){return as.isTextPosition(t)?(r=t,hc(n=e)&&r.container()===n?(a=Ms((o=n).data.substr(0,(i=r).offset())),u=Ms(o.data.substr(i.offset())),0<(a.text+u.text).length?(Fs(o),as(o,i.offset()-a.count)):i):Us(n,r)):(s=e,((c=t).container()===s.parentNode?zs:Us)(s,c));var n,r,o,i,a,u,s,c}function js(e,t,n){var r,o,i,a=_u(t.getBoundingClientRect(),n),u="BODY"===e.tagName?(r=e.ownerDocument.documentElement,o=e.scrollLeft||r.scrollLeft,e.scrollTop||r.scrollTop):(i=e.getBoundingClientRect(),o=e.scrollLeft-i.left,e.scrollTop-i.top);a.left+=o,a.right+=o,a.top+=u,a.bottom+=u,a.width=1;var s=t.offsetWidth-t.clientWidth;return 0<s&&(n&&(s*=-1),a.left+=s,a.right+=s),a}function Vs(e,i,a,u){function s(){!function(){for(var e=hu(Nt.fromDom(i),"*[contentEditable=false],video,audio,embed,object"),t=0;t<e.length;t++){var n,r=e[t].dom,o=r.previousSibling;ko(o)&&(1===(n=o.data).length?o.parentNode.removeChild(o):o.deleteData(n.length-1,1)),o=r.nextSibling,No(o)&&(1===(n=o.data).length?o.parentNode.removeChild(o):o.deleteData(0,1))}}(),l&&(vc(l),l=null),f.on(function(e){Wa(e.caret).remove(),f.clear()}),c&&(_r.clearInterval(c),c=void 0)}var c,l,f=cu(),t=Ss(e),d=0<t.length?t:"p";return{show:function(e,t){var n;if(s(),xc(t))return null;if(!a(t))return l=function(e,t){var n=e.ownerDocument.createTextNode(Co),r=e.parentNode;if(t){if(o=e.previousSibling,Eo(o)){if(Ir(o))return o;if(ko(o))return o.splitText(o.data.length-1)}r.insertBefore(n,e)}else{var o=e.nextSibling;if(Eo(o)){if(Ir(o))return o;if(No(o))return o.splitText(1),o}e.nextSibling?r.insertBefore(n,e.nextSibling):r.appendChild(n)}return n}(t,e),n=t.ownerDocument.createRange(),wc(l.nextSibling)?(n.setStart(l,0),n.setEnd(l,0)):(n.setStart(l,1),n.setEnd(l,1)),n;l=function(e,t,n){var r,o=t.ownerDocument.createElement(e);o.setAttribute("data-mce-caret",n?"before":"after"),o.setAttribute("data-mce-bogus","all"),o.appendChild(((r=document.createElement("br")).setAttribute("data-mce-bogus","1"),r));var i=t.parentNode;return n?i.insertBefore(o,t):t.nextSibling?i.insertBefore(o,t.nextSibling):i.appendChild(o),o}(d,t,e);var r=js(i,t,e);Wa(l).css("top",r.top);var o=Wa('<div class="mce-visual-caret" data-mce-bogus="all"></div>').css(_e({},r)).appendTo(i)[0];return f.set({caret:o,element:t,before:e}),e&&Wa(o).addClass("mce-visual-caret-before"),c=_r.setInterval(function(){u()?Wa("div.mce-visual-caret",i).toggleClass("mce-visual-caret-hidden"):Wa("div.mce-visual-caret",i).addClass("mce-visual-caret-hidden")},500),(n=t.ownerDocument.createRange()).setStart(l,0),n.setEnd(l,0),n},hide:s,getCss:function(){return".mce-visual-caret {position: absolute;background-color: black;background-color: currentcolor;}.mce-visual-caret-hidden {display: none;}*[data-mce-caret] {position: absolute;left: -1000px;right: auto;top: 0;margin: 0;padding: 0;}"},reposition:function(){f.on(function(e){var t=js(i,e.element,e.before);Wa(e.caret).css(_e({},t))})},destroy:function(){return _r.clearInterval(c)}}}function qs(){return bc.isIE()||bc.isEdge()||bc.isFirefox()}function $s(e){return wc(e)||cn(e)&&qs()}function Ws(e,t){for(var n;n=e(t);)if(!_c(n))return n;return null}function Ks(e,t,n,r,o){var i=new Rr(e,r),a=Sc(e)||_c(e);if(t<0){if(a&&n(e=Ws(i.prev.bind(i),!0)))return e;for(;e=Ws(i.prev.bind(i),o);)if(n(e))return e}if(0<t){if(a&&n(e=Ws(i.next.bind(i),!0)))return e;for(;e=Ws(i.next.bind(i),o);)if(n(e))return e}return null}function Xs(e,t){for(;e&&e!==t;){if(Nc(e))return e;e=e.parentNode}return null}function Ys(e,t,n){return Xs(e.container(),n)===Xs(t.container(),n)}function Gs(e,t){if(!t)return null;var n=t.container(),r=t.offset();return Ac(n)?n.childNodes[r+e]:null}function Js(e,t){var n=t.ownerDocument.createRange();return e?(n.setStartBefore(t),n.setEndBefore(t)):(n.setStartAfter(t),n.setEndAfter(t)),n}function Qs(e,t,n){for(var r,o,i=e?"previousSibling":"nextSibling";n&&n!==t;){var a=n[i];if(kc(a)&&(a=a[i]),Sc(a)||Ec(a)){if(o=n,Xs(a,r=t)===Xs(o,r))return a;break}if(Rc(a))break;n=n.parentNode}return null}function Zs(e,t,n){var r,o=A(Qs,!0,t),i=A(Qs,!1,t),a=n.startContainer,u=n.startOffset;if(Pr(a)){var s=(a=Ac(a)?a:a.parentNode).getAttribute("data-mce-caret");if("before"===s&&$s(r=a.nextSibling))return Dc(r);if("after"===s&&$s(r=a.previousSibling))return Tc(r)}if(!n.collapsed)return n;if(jn(a)){if(kc(a)){if(1===e){if(r=i(a))return Dc(r);if(r=o(a))return Tc(r)}if(-1===e){if(r=o(a))return Tc(r);if(r=i(a))return Dc(r)}return n}if(ko(a)&&u>=a.data.length-1)return 1===e&&(r=i(a))?Dc(r):n;if(No(a)&&u<=1)return-1===e&&(r=o(a))?Tc(r):n;if(u===a.data.length)return(r=i(a))?Dc(r):n;if(0===u)return(r=o(a))?Tc(r):n}return n}function ec(e,t){return ve.from(Gs(e?0:-1,t)).filter(Sc)}function tc(e,t,n){var r=Zs(e,t,n);return-1===e?as.fromRangeStart(r):as.fromRangeEnd(r)}function nc(e){return ve.from(e.getNode()).map(Nt.fromDom)}function rc(e,t){for(;t=e(t);)if(t.isVisible())return t;return t}function oc(e,t){var n=Ys(e,t);return!(n||!Wn(e.getNode()))||n}as.fromRangeStart=function(e){return as(e.startContainer,e.startOffset)},as.fromRangeEnd=function(e){return as(e.endContainer,e.endOffset)},as.after=function(e){return as(e.parentNode,rs(e)+1)},as.before=function(e){return as(e.parentNode,rs(e))},as.isAbove=function(e,t){return dn(Q(t.getClientRects()),Z(e.getClientRects()),Ru).getOr(!1)},as.isBelow=function(e,t){return dn(Z(t.getClientRects()),Q(e.getClientRects()),Du).getOr(!1)},as.isAtStart=function(e){return!!e&&e.isAtStart()},as.isAtEnd=function(e){return!!e&&e.isAtEnd()},as.isTextPosition=function(e){return!!e&&jn(e.container())},as.isElementPosition=function(e){return!1===as.isTextPosition(e)};var ic,ac,uc=jn,sc=sn,cc=Ja.nodeIndex,lc=function(e){var t=e.parentNode;return sc(t)?lc(t):t},fc=function(e){return e?me(e.childNodes,function(e,t){return sc(t)&&"BR"!==t.nodeName?e=e.concat(fc(t)):e.push(t),e},[]):[]},dc=Yn,mc=A(bs,u,!0),gc=Ja.DOM,pc=zn,hc=jn,vc=function(e){pc(e)&&Ir(e)&&(Mr(e)?e.removeAttribute("data-mce-caret"):Is(e)),hc(e)&&(Fs(e),0===e.data.length&&Is(e))},bc=dt().browser,yc=Yn,Cc=Jn,xc=Gn,wc=function(e){return yc(e)||Cc(e)},Sc=Yn,Ec=Jn,Nc=an("display","block table table-cell table-caption list-item"),kc=Ir,_c=Pr,Ac=zn,Rc=jr,Dc=A(Js,!0),Tc=A(Js,!1);function Oc(e,t){return e.hasChildNodes()&&t<e.childNodes.length?e.childNodes[t]:null}function Bc(e,t){if(0<e){if(Kl(t.previousSibling)&&!ql(t.previousSibling))return as.before(t);if(ql(t))return as(t,0)}if(e<0){if(Kl(t.nextSibling)&&!ql(t.nextSibling))return as.after(t);if(ql(t))return as(t,t.data.length)}return e<0&&!Wl(t)?as.after(t):as.before(t)}function Pc(t){return{next:function(e){return Yl(ic.Forwards,e,t)},prev:function(e){return Yl(ic.Backwards,e,t)}}}function Lc(e){return as.isTextPosition(e)?0===e.offset():jr(e.getNode())}function Ic(e){if(as.isTextPosition(e)){var t=e.container();return e.offset()===t.data.length}return jr(e.getNode(!0))}function Mc(e,t){return!as.isTextPosition(e)&&!as.isTextPosition(t)&&e.getNode()===t.getNode(!0)}function Fc(o,i,a){return Gl(o,i,a).bind(function(e){return Ys(a,e,i)&&(t=a,n=e,o?!Mc(t,n)&&(as.isTextPosition(r=t)||!Wn(r.getNode()))&&Ic(t)&&Lc(n):!Mc(n,t)&&Lc(t)&&Ic(n))?Gl(o,i,e):ve.some(e);var t,n,r})}function Uc(e,t){var n,r,o,i,a,u=e?t.firstChild:t.lastChild;return jn(u)?ve.some(as(u,e?0:u.data.length)):u?jr(u)?ve.some(e?as.before(u):Wn(a=u)?as.before(a):as.after(a)):(r=t,o=u,i=(n=e)?as.before(o):as.after(o),Gl(n,r,i)):ve.none()}function zc(e){return zn(e)&&e.id===nf}function Hc(e,t){for(;t&&t!==e;){if(t.id===nf)return t;t=t.parentNode}return null}function jc(e){return Et.isArray(e.start)}function Vc(e,t){return zn(t)&&e.isBlock(t)&&!t.innerHTML&&!xt.ie&&(t.innerHTML='<br data-mce-bogus="1" />'),t}function qc(e,t,n){return!1===t.hasChildNodes()&&Hc(e,t)&&(o=n,i=(r=t).ownerDocument.createTextNode(Co),r.appendChild(i),o.setStart(i,0),o.setEnd(i,0),1);var r,o,i}function $c(e,t,n,r){var o,i,a,u,s=n[t?"start":"end"],c=e.getRoot();if(s){for(a=s[0],i=c,o=s.length-1;1<=o;o--){if(u=i.childNodes,qc(c,i,r))return 1;if(s[o]>u.length-1)return qc(c,i,r)||function(t){return tf(i).fold(R,function(e){return t.setStart(e.container(),e.offset()),t.setEnd(e.container(),e.offset()),!0})}(r);i=u[s[o]]}3===i.nodeType&&(a=Math.min(s[0],i.nodeValue.length)),1===i.nodeType&&(a=Math.min(s[0],i.childNodes.length)),t?r.setStart(i,a):r.setEnd(i,a)}return 1}function Wc(e){return jn(e)&&0<e.data.length}function Kc(e,t,n){var r,o,i,a,u,s,c=e.get(n.id+"_"+t),l=n.keep;if(c){if(r=c.parentNode,o="start"===t?l?c.hasChildNodes()?(r=c.firstChild,1):Wc(c.nextSibling)?(r=c.nextSibling,0):Wc(c.previousSibling)?(r=c.previousSibling,c.previousSibling.data.length):(r=c.parentNode,e.nodeIndex(c)+1):e.nodeIndex(c):l?c.hasChildNodes()?(r=c.firstChild,1):Wc(c.previousSibling)?(r=c.previousSibling,c.previousSibling.data.length):(r=c.parentNode,e.nodeIndex(c)):e.nodeIndex(c),u=r,s=o,!l){for(a=c.previousSibling,i=c.nextSibling,Et.each(Et.grep(c.childNodes),function(e){jn(e)&&(e.nodeValue=e.nodeValue.replace(/\uFEFF/g,""))});c=e.get(n.id+"_"+t);)e.remove(c,!0);a&&i&&a.nodeType===i.nodeType&&jn(a)&&!xt.opera&&(o=a.nodeValue.length,a.appendData(i.nodeValue),e.remove(i),u=a,s=o)}return ve.some(as(u,s))}return ve.none()}function Xc(t,e){!function(e,t){var n,r,o,i,a,u,s,c,l,f,d,m,g=e.dom;if(t){if(jc(t))return d=t,m=(f=g).createRng(),$c(f,!0,d,m)&&$c(f,!1,d,m)?ve.some(m):ve.none();if(X(t.start))return ve.some((s=t,c=(u=g).createRng(),l=ds(u.getRoot(),s.start),c.setStart(l.container(),l.offset()),l=ds(u.getRoot(),s.end),c.setEnd(l.container(),l.offset()),c));if(Ne(t,"id"))return dn(a=Kc(o=g,"start",i=t),Kc(o,"end",i).or(a),function(e,t){var n=o.createRng();return n.setStart(Vc(o,e.container()),e.offset()),n.setEnd(Vc(o,t.container()),t.offset()),n});if(Ne(t,"name"))return n=g,ve.from(n.select((r=t).name)[r.index]).map(function(e){var t=n.createRng();return t.selectNode(e),t});if(Ne(t,"rng"))return ve.some(t.rng)}return ve.none()}(t,e).each(function(e){t.setRng(e)})}function Yc(e){return zn(e)&&"SPAN"===e.tagName&&"bookmark"===e.getAttribute("data-mce-type")}function Gc(e){return""!==e&&-1!==" \f\n\r\t\v".indexOf(e)}function Jc(e){return!Gc(e)&&!of(e)}function Qc(e){return e.nodeType}function Zc(e,t,n){var r,o=n.startOffset,i=n.startContainer;if((i!==n.endContainer||!(r=i.childNodes[o])||!/^(IMG)$/.test(r.nodeName))&&zn(i)){var a=i.childNodes,u=void 0;o<a.length?(i=a[o],u=new Rr(i,e.getParent(i,e.isBlock))):(i=a[a.length-1],(u=new Rr(i,e.getParent(i,e.isBlock))).next(!0));for(var s=u.current();s;s=u.next())if(jn(s)&&!af(s))return n.setStart(s,0),t.setRng(n),0}}function el(e,t,n){if(e){var r=t?"nextSibling":"previousSibling";for(e=n?e:e[r];e;e=e[r])if(zn(e)||!af(e))return e}}function tl(e,t){return Qc(t)&&(t=t.nodeName),!!e.schema.getTextBlockElements()[t.toLowerCase()]}function nl(e,t,n){return e.schema.isValidChild(t,n)}function rl(e,n){return y(e)?e=e(n):V(n)&&(e=e.replace(/%(\w+)/g,function(e,t){return n[t]||e})),e}function ol(e,t){return e=""+((e=e||"").nodeName||e),t=""+((t=t||"").nodeName||t),e.toLowerCase()===t.toLowerCase()}function il(e,t,n){return"color"!==n&&"backgroundColor"!==n||(t=e.toHex(t)),"fontWeight"===n&&700===t&&(t="bold"),""+("fontFamily"===n?t.replace(/[\'\"]/g,"").replace(/,\s+/g,","):t)}function al(e,t,n){return il(e,e.getStyle(t,n),n)}function ul(t,e){var n;return t.getParent(e,function(e){return(n=t.getStyle(e,"text-decoration"))&&"none"!==n}),n}function sl(e,t,n){return e.getParents(t,n,e.getRoot())}function cl(e,t){return F(e.formatter.get(t),function(t){function o(e){return 1<e.length&&"%"===e.charAt(0)}return F(["styles","attributes"],function(e){return ue(t,e).exists(function(e){var n,r;return F(S(e)?e:(n=u,r=[],ne(e,function(e,t){r.push(n(e,t))}),r),o)})})})}function ll(e){return se(e,"block")}function fl(e){return se(e,"selector")}function dl(e){return se(e,"inline")}function ml(e){return fl(e)&&!1!==e.expand&&!dl(e)}function gl(e,t){for(var n=t;n;){if(zn(n)&&e.getContentEditable(n))return"false"===e.getContentEditable(n)?n:t;n=n.parentNode}return t}function pl(e,t,n,r){for(var o=t.data,i=n;e?0<=i:i<o.length;e?i--:i++)if(r(o.charAt(i)))return e?i+1:i;return-1}function hl(e,t,n){return pl(e,t,n,function(e){return of(e)||Gc(e)})}function vl(e,t,n){return pl(e,t,n,Jc)}function bl(i,e,t,n,a,r){function o(e,t,n){var r=Nu(i),o=a?r.backwards:r.forwards;return ve.from(o(e,t,function(e,t){return uf(e.parentNode)?-1:n(a,u=e,t)},s))}var u,s=i.getParent(t,i.isBlock)||e;return o(t,n,hl).bind(function(e){return r?o(e.container,e.offset+(a?-1:0),vl):ve.some(e)}).orThunk(function(){return u?ve.some({container:u,offset:a?0:u.length}):ve.none()})}function yl(e,t,n,r,o){jn(r)&&Pe(r.data)&&r[o]&&(r=r[o]);for(var i=sf(e,r),a=0;a<i.length;a++)for(var u=0;u<t.length;u++){var s=t[u];if((!V(s.collapsed)||s.collapsed===n.collapsed)&&fl(s)&&e.is(i[a],s.selector))return i[a]}return r}function Cl(t,e,n,r){var o,i=n,a=t.dom,u=a.getRoot(),s=e[0];if((i=ll(s)?s.wrapper?null:a.getParent(n,s.block,u):i)||(o=a.getParent(n,"LI,TD,TH"),i=a.getParent(jn(n)?n.parentNode:n,function(e){return e!==u&&lf(t,e)},o)),!(i=i&&ll(s)&&s.wrapper&&sf(a,i,"ul,ol").reverse()[0]||i))for(i=n;i[r]&&!a.isBlock(i[r])&&!ol(i=i[r],"br"););return i||n}function xl(e,t,n,r,o){var i,a=n,u=o?"previousSibling":"nextSibling",s=e.getRoot();if(jn(n)&&!cf(n)&&(o?0<r:r<n.data.length))return n;for(;;){if(!t[0].block_expand&&e.isBlock(a))return a;for(var c=a[u];c;c=c[u]){var l=jn(c)&&!ff(e,s,c,u);if(!uf(c)&&(!Wn(i=c)||!i.getAttribute("data-mce-bogus")||i.nextSibling)&&!cf(c,l))return a}if(a===s||a.parentNode===s){n=a;break}a=a.parentNode}return n}function wl(e){return uf(e.parentNode)||uf(e)}function Sl(e,t,n,r){void 0===r&&(r=!1);var o=t.startContainer,i=t.startOffset,a=t.endContainer,u=t.endOffset,s=e.dom,c=n[0];return zn(o)&&o.hasChildNodes()&&(o=Bu(o,i),jn(o)&&(i=0)),zn(a)&&a.hasChildNodes()&&(a=Bu(a,t.collapsed?u:u-1),jn(a)&&(u=a.nodeValue.length)),o=gl(s,o),a=gl(s,a),wl(o)&&(o=uf(o)?o:o.parentNode,o=t.collapsed?o.previousSibling||o:o.nextSibling||o,jn(o)&&(i=t.collapsed?o.length:0)),wl(a)&&(a=uf(a)?a:a.parentNode,a=t.collapsed?a.nextSibling||a:a.previousSibling||a,jn(a)&&(u=t.collapsed?0:a.length)),t.collapsed&&(bl(s,e.getBody(),o,i,!0,r).each(function(e){var t=e.container,n=e.offset;o=t,i=n}),bl(s,e.getBody(),a,u,!1,r).each(function(e){var t=e.container,n=e.offset;a=t,u=n})),(dl(c)||c.block_expand)&&(dl(c)&&jn(o)&&0!==i||(o=xl(s,n,o,i,!0)),dl(c)&&jn(a)&&u!==a.nodeValue.length||(a=xl(s,n,a,u,!1))),ml(c)&&(o=yl(s,n,t,o,"previousSibling"),a=yl(s,n,t,a,"nextSibling")),(ll(c)||fl(c))&&(o=Cl(e,n,o,"previousSibling"),a=Cl(e,n,a,"nextSibling"),ll(c)&&(s.isBlock(o)||(o=xl(s,n,o,i,!0)),s.isBlock(a)||(a=xl(s,n,a,u,!1)))),zn(o)&&(i=s.nodeIndex(o),o=o.parentNode),zn(a)&&(u=s.nodeIndex(a)+1,a=a.parentNode),{startContainer:o,startOffset:i,endContainer:a,endOffset:u}}function El(n,e,u){function s(e){var t=e[0];jn(t)&&t===i&&o>=t.data.length&&e.splice(0,1);var n=e[e.length-1];return 0===a&&0<e.length&&n===l&&jn(n)&&e.splice(e.length-1,1),e}function c(e,t,n){for(var r=[];e&&e!==n;e=e[t])r.push(e);return r}function t(e,t){return n.getParent(e,function(e){return e.parentNode===t},t)}function r(e,t,n){var r=n?"nextSibling":"previousSibling",o=e;for(o.parentNode;o&&o!==t;o=i){var i=o.parentNode,a=c(o===e?o:o[r],r);a.length&&(n||a.reverse(),u(s(a)))}}var o=e.startOffset,i=Bu(e.startContainer,o),a=e.endOffset,l=Bu(e.endContainer,a-1);if(i===l)return u(s([i]));var f=n.findCommonAncestor(i,l);if(n.isChildOf(i,l))return r(i,f,!0);if(n.isChildOf(l,i))return r(l,f);var d=t(i,f)||i,m=t(l,f)||l;r(i,d,!0);var g=c(d===i?d:d.nextSibling,"nextSibling",m===l?m.nextSibling:m);g.length&&u(s(g)),r(l,m)}function Nl(e){var t=[];if(e)for(var n=0;n<e.rangeCount;n++)t.push(e.getRangeAt(n));return t}function kl(e,t){var n=hu(t,"td[data-mce-selected],th[data-mce-selected]");return 0<n.length?n:U(H(e,function(e){var t=Ou(e);return t?[Nt.fromDom(t)]:[]}),ho)}function _l(e){return kl(Nl(e.selection.getSel()),Nt.fromDom(e.getBody()))}function Al(e,t){return hr(e,"table",t)}function Rl(o,e){return dn((r=e.startContainer,i=e.startOffset,jn(r)?0===i?ve.some(Nt.fromDom(r)):ve.none():ve.from(r.childNodes[i]).map(Nt.fromDom)),(t=e.endContainer,n=e.endOffset,jn(t)?n===t.data.length?ve.some(Nt.fromDom(t)):ve.none():ve.from(t.childNodes[n-1]).map(Nt.fromDom)),function(e,t){var n=M(df(o),A(je,e)),r=M(mf(o),A(je,t));return n.isSome()&&r.isSome()}).getOr(!1);var t,n,r,i}function Dl(e,t,n,r){var o=n,i=new Rr(n,o),a=ae(e.schema.getMoveCaretBeforeOnEnterElements(),function(e,t){return!D(["td","th","table"],t.toLowerCase())});do{if(jn(n)&&0!==Et.trim(n.nodeValue).length)return r?t.setStart(n,0):t.setEnd(n,n.nodeValue.length),0;if(a[n.nodeName])return r?t.setStartBefore(n):"BR"===n.nodeName?t.setEndBefore(n):t.setEndAfter(n),0}while(n=r?i.next():i.prev());"BODY"===o.nodeName&&(r?t.setStart(o,0):t.setEnd(o,o.childNodes.length))}function Tl(e){var t=e.selection.getSel();return t&&0<t.rangeCount}function Ol(r,o){var e=_l(r);0<e.length?Y(e,function(e){var t=e.dom,n=r.dom.createRng();n.setStartBefore(t),n.setEndAfter(t),o(n,!0)}):o(r.selection.getRng(),!1)}function Bl(e,t,n){var r=Cs(e,t);n(r),e.moveToBookmark(r)}function Pl(e){return gf.get(e)}function Ll(e,t,n,r){var o=t.uid,i=void 0===o?yu("mce-annotation"):o,a=function(e,t){var n={};for(o in e)Object.prototype.hasOwnProperty.call(e,o)&&t.indexOf(o)<0&&(n[o]=e[o]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var r=0,o=Object.getOwnPropertySymbols(e);r<o.length;r++)t.indexOf(o[r])<0&&Object.prototype.propertyIsEnumerable.call(e,o[r])&&(n[o[r]]=e[o[r]]);return n}(t,["uid"]),u=Nt.fromTag("span",e);gu(u,ju()),pn(u,""+qu(),i),pn(u,""+Vu(),n);var s,c=r(i,a),l=c.attributes,f=c.classes,d=void 0===f?[]:f;return hn(u,void 0===l?{}:l),s=u,Y(d,function(e){gu(s,e)}),u}function Il(u,e,t,n,r){function s(){d.clear()}function c(e){Y(e,o)}var l=[],f=Ll(u.getDoc(),r,t,n),d=cu(),o=function(e){var t,n,r,o,i,a;switch(r=u,i="span",a=kt(o=e),Ot(o).fold(function(){return"skipping"},function(e){return"br"===a||_n(n=o)&&Pl(n)===Co?"valid":kn(t=o)&&pu(t,ju())?"existing":zc(o.dom)?"caret":nl(r,i,a)&&nl(r,kt(e),i)?"valid":"invalid-child";var t,n})){case"invalid-child":s(),c(Dn(e)),s();break;case"valid":qt(t=e,n=d.get().getOrThunk(function(){var e=wu(f);return l.push(e),d.set(e),e})),Pn(n,t)}};return El(u.dom,e,function(e){s(),c(T(e,Nt.fromDom))}),l}function Ml(o){var n,e,r,i=(n={},{register:function(e,t){n[e]={name:e,settings:t}},lookup:function(e){return ue(n,e).map(function(e){return e.settings})}});r=i,(e=o).on("init",function(){e.serializer.addNodeFilter("span",function(e){Y(e,function(t){ve.from(t.attr(Vu())).bind(r.lookup).each(function(e){!1===e.persistent&&t.unwrap()})})})});var a=bu(o);return{register:function(e,t){i.register(e,t)},annotate:function(t,n){i.lookup(t).each(function(e){var u,s,c,l;s=t,c=e,l=n,(u=o).undoManager.transact(function(){var e,t,n,r,o=u.selection,i=o.getRng(),a=0<_l(u).length;i.collapsed&&!a&&(n=Sl(e=u,t=i,[{inline:"span"}]),t.setStart(n.startContainer,n.startOffset),t.setEnd(n.endContainer,n.endOffset),e.selection.setRng(t)),o.getRng().collapsed&&!a?(Cu(r=Ll(u.getDoc(),l,s,c.decorate),yo),o.getRng().insertNode(r.dom),o.select(r.dom)):Bl(o,!1,function(){Ol(u,function(e){Il(u,e,s,c.decorate,l)})})})})},annotationChanged:function(e,t){a.addListener(e,t)},remove:function(e){vu(o,ve.some(e)).each(function(e){Y(e.elements,Yt)})},getAll:function(e){var t,n,r;return re((t=e,n=hu(Nt.fromDom(o.getBody()),"["+Vu()+'="'+t+'"]'),r={},Y(n,function(e){var t=vn(e,qu()),n=ue(r,t).getOr([]);r[t]=n.concat([e])}),r),function(e){return T(e,function(e){return e.dom})})}}}function Fl(e){return{getBookmark:A(rf,e),moveToBookmark:A(Xc,e)}}(ac=ic=ic||{})[ac.Backwards=-1]="Backwards",ac[ac.Forwards=1]="Forwards";function Ul(e){return Oo(e)||!!Lo(t=e)&&!0!==L(xe(t.getElementsByTagName("*")),function(e,t){return e||_o(t)},!1);var t}var zl,Hl,jl,Vl=Yn,ql=jn,$l=zn,Wl=Wn,Kl=jr,Xl=Vr,Yl=function(e,t,n){var r,o,i;if(!$l(n)||!t)return null;if(t.isEqual(as.after(n))&&n.lastChild){if(i=as.after(n.lastChild),e<0&&Kl(n.lastChild)&&$l(n.lastChild))return Wl(n.lastChild)?as.before(n.lastChild):i}else i=t;var a,u,s,c=i.container(),l=i.offset();if(ql(c)){if(e<0&&0<l)return as(c,--l);if(0<e&&l<c.length)return as(c,++l);r=c}else{if(e<0&&0<l&&(f=Oc(c,l-1),Kl(f)))return!Ul(f)&&(o=Ks(f,e,Xl,f))?ql(o)?as(o,o.data.length):as.after(o):ql(f)?as(f,f.data.length):as.before(f);if(0<e&&l<c.childNodes.length&&(f=Oc(c,l),Kl(f)))return Wl(f)?(a=n,(s=(u=f).nextSibling)&&Kl(s)?ql(s)?as(s,0):as.before(s):Yl(ic.Forwards,as.after(u),a)):!Ul(f)&&(o=Ks(f,e,Xl,f))?ql(o)?as(o,0):as.before(o):ql(f)?as(f,0):as.after(f);r=f||i.getNode()}if((0<e&&i.isAtEnd()||e<0&&i.isAtStart())&&(r=Ks(r,e,w,n,!0),Xl(r,n)))return Bc(e,r);var f=Ks(r,e,Xl,n),d=pe(U(function(e,t){for(var n=[];e&&e!==t;)n.push(e),e=e.parentNode;return n}(c,n),Vl));return!d||f&&d.contains(f)?f?Bc(e,f):null:0<e?as.after(d):as.before(d)},Gl=function(e,t,n){var r=Pc(t);return ve.from(e?r.next(n):r.prev(n))},Jl=function(t,n,e,r){return Fc(t,n,e).bind(function(e){return r(e)?Jl(t,n,e,r):ve.some(e)})},Ql=A(Gl,!0),Zl=A(Gl,!1),ef=A(Uc,!0),tf=A(Uc,!1),nf="_mce_caret",rf=function(e,t,n){return 2===t?bs(wo,n,e):3===t?(o=(r=e).getRng(),{start:fs(r.dom.getRoot(),as.fromRangeStart(o)),end:fs(r.dom.getRoot(),as.fromRangeEnd(o))}):t?{rng:e.getRng()}:Cs(e,!1);var r,o},of=(zl=yo,function(e){return zl===e}),af=function(e,t){return void 0===t&&(t=!1),!(!V(e)||!jn(e))&&qr(t?e.data.replace(/ /g,"\xa0"):e.data)},uf=Yc,sf=sl,cf=af,lf=tl,ff=function(e,t,n,r){var o=n.parentNode;return!V(n[r])&&(!(o!==t&&!K(o)&&!e.isBlock(o))||ff(e,t,o,r))},df=function(t){return Ft(t).fold(J([t]),function(e){return[t].concat(df(e))})},mf=function(t){return Ut(t).fold(J([t]),function(e){return"br"===kt(e)?Bt(e).map(function(e){return[t].concat(mf(e))}).getOr([]):[t].concat(mf(e))})},gf=(Hl=_n,{get:function(e){if(!Hl(e))throw new Error("Can only get text value of a text node");return jl(e).getOr("")},getOption:jl=function(e){return Hl(e)?ve.from(e.dom.nodeValue):ve.none()},set:function(e,t){if(!Hl(e))throw new Error("Can only set raw text value of a text node");e.dom.nodeValue=t}});function pf(e,t){for(;t&&t!==e;){if(Xn(t)||Yn(t))return t;t=t.parentNode}return null}function hf(t,n,e){if(!e.collapsed){if(xt.browser.isIE()&&e.startOffset===e.endOffset-1&&e.startContainer===e.endContainer){var r=e.startContainer.childNodes[e.startOffset];if(zn(r))return F(r.getClientRects(),function(e){return Tu(e,t,n)})}return F(e.getClientRects(),function(e){return Tu(e,t,n)})}}function vf(e,t,n){return e.fire(t,n)}function bf(e,t,n,r){return e.fire("FormatApply",{format:t,node:n,vars:r})}function yf(e,t,n,r){return e.fire("FormatRemove",{format:t,node:n,vars:r})}function Cf(r,l){function c(e){return e&&("IMG"===e.nodeName||l.dom.is(e,"figure.image"))}function f(e){return Jn(e)||T.hasClass(e,"mce-preview-object")}function n(e){var t=e.target;!function(e,t){if("longpress"!==e.type&&0!==e.type.indexOf("touch"))return c(e.target)&&!hf(e.clientX,e.clientY,t);var n=e.touches[0];return c(e.target)&&!hf(n.clientX,n.clientY,t)}(e,l.selection.getRng())||e.isDefaultPrevented()||l.selection.select(t)}function d(e){return T.is(e,"figure.image")?[e.querySelector("img")]:T.hasClass(e,"mce-preview-object")&&V(e.firstElementChild)?[e,e.firstElementChild]:[e]}function i(e){var t=Ts(l);return!!t&&"false"!==e.getAttribute("data-mce-resize")&&e!==l.getBody()&&(T.hasClass(e,"mce-preview-object")?ze(Nt.fromDom(e.firstElementChild),t):ze(Nt.fromDom(e),t))}function a(e,t,n){V(n)&&Y(d(e),function(e){e.style[t]||!l.schema.isValid(e.nodeName.toLowerCase(),t)?T.setStyle(e,t,n):T.setAttrib(e,t,""+n)})}function m(e,t,n){a(e,"width",t),a(e,"height",n)}function g(e){var t,n,r,o,i,a,u=e.screenX-C,s=e.screenY-x;k=u*b[2]+w,_=s*b[3]+S,k=k<5?5:k,_=_<5?5:_,((c(p)||f(p))&&!1!==l.getParam("resize_img_proportional",!0,"boolean")?!Bf.modifierPressed(e):Bf.modifierPressed(e))&&(L(u)>L(s)?(_=I(k*E),k=I(_/E)):(k=I(_/E),_=I(k*E))),m(h,k,_),t=b.startPos.x+u,n=b.startPos.y+s,T.setStyles(v,{left:t=0<t?t:0,top:n=0<n?n:0,display:"block"}),v.innerHTML=k+" &times; "+_,b[2]<0&&h.clientWidth<=k&&T.setStyle(h,"left",void 0+(w-k)),b[3]<0&&h.clientHeight<=_&&T.setStyle(h,"top",void 0+(S-_)),(u=M.scrollWidth-A)+(s=M.scrollHeight-R)!=0&&T.setStyles(v,{left:t-u,top:n-s}),N||(r=p,o=w,i=S,a="corner-"+b.name,l.fire("ObjectResizeStart",{target:r,width:o,height:i,origin:a}),N=!0)}function o(e){function t(e,t){if(e)do{if(e===t)return 1}while(e=e.parentNode)}var n;N||l.removed||(O(T.select("img[data-mce-selected],hr[data-mce-selected]"),function(e){e.removeAttribute(D)}),n="mousedown"===e.type?e.target:r.getNode(),t(n=T.$(n).closest("table,img,figure.image,hr,video,span.mce-preview-object")[0],M)&&(s(),t(r.getStart(!0),n)&&t(r.getEnd(!0),n))?z(n):H())}function u(e){return Pf(pf(l.getBody(),e))}function s(){try{l.getDoc().execCommand("enableObjectResizing",!1,"false")}catch(e){}}var p,h,v,b,y,C,x,w,S,E,N,k,_,A,R,D="data-mce-selected",T=l.dom,O=Et.each,B=l.getDoc(),P=document,L=Math.abs,I=Math.round,M=l.getBody(),F={nw:[0,0,-1,-1],ne:[1,0,1,-1],se:[1,1,1,1],sw:[0,1,-1,1]},U=function(){var e,t,n,r,o=N;N=!1,o&&(a(p,"width",k),a(p,"height",_)),T.unbind(B,"mousemove",g),T.unbind(B,"mouseup",U),P!==B&&(T.unbind(P,"mousemove",g),T.unbind(P,"mouseup",U)),T.remove(h),T.remove(v),T.remove(y),z(p),o&&(e=p,t=k,n=_,r="corner-"+b.name,l.fire("ObjectResized",{target:e,width:t,height:n,origin:r}),T.setAttrib(p,"style",T.getAttrib(p,"style"))),l.nodeChanged()},z=function(e){j();var t=T.getPos(e,M),a=t.x,u=t.y,n=e.getBoundingClientRect(),s=n.width||n.right-n.left,c=n.height||n.bottom-n.top;p!==e&&(H(),p=e,k=_=0);var r=l.fire("ObjectSelected",{target:e}),o=T.getAttrib(p,D,"1");i(e)&&!r.isDefaultPrevented()?O(F,function(o,i){var e=T.get("mceResizeHandle"+i);e&&T.remove(e),e=T.add(M,"div",{id:"mceResizeHandle"+i,"data-mce-bogus":"all",class:"mce-resizehandle",unselectable:!0,style:"cursor:"+i+"-resize; margin:0; padding:0"}),11===xt.ie&&(e.contentEditable=!1),T.bind(e,"mousedown",function(e){var t,n,r;e.stopImmediatePropagation(),e.preventDefault(),t=e,r=d(p)[0],C=t.screenX,x=t.screenY,w=r.clientWidth,S=r.clientHeight,E=S/w,(b=o).name=i,b.startPos={x:s*o[0]+a,y:c*o[1]+u},A=M.scrollWidth,R=M.scrollHeight,y=T.add(M,"div",{class:"mce-resize-backdrop","data-mce-bogus":"all"}),T.setStyles(y,{position:"fixed",left:"0",top:"0",width:"100%",height:"100%"}),h=f(n=p)?T.create("img",{src:xt.transparentSrc}):n.cloneNode(!0),T.addClass(h,"mce-clonedresizable"),T.setAttrib(h,"data-mce-bogus","all"),h.contentEditable="false",T.setStyles(h,{left:a,top:u,margin:0}),m(h,s,c),h.removeAttribute(D),M.appendChild(h),T.bind(B,"mousemove",g),T.bind(B,"mouseup",U),P!==B&&(T.bind(P,"mousemove",g),T.bind(P,"mouseup",U)),v=T.add(M,"div",{class:"mce-resize-helper","data-mce-bogus":"all"},w+" &times; "+S)}),o.elm=e,T.setStyles(e,{left:s*o[0]+a-e.offsetWidth/2,top:c*o[1]+u-e.offsetHeight/2})}):H(),T.getAttrib(p,D)||p.setAttribute(D,o)},H=function(){j(),p&&p.removeAttribute(D),ne(F,function(e,t){var n=T.get("mceResizeHandle"+t);n&&(T.unbind(n),T.remove(n))})},j=function(){ne(F,function(e){e.elm&&(T.unbind(e.elm),delete e.elm)})};return l.on("init",function(){var e;s(),(xt.browser.isIE()||xt.browser.isEdge())&&(l.on("mousedown click",function(e){var t=e.target,n=t.nodeName;N||!/^(TABLE|IMG|HR)$/.test(n)||u(t)||(2!==e.button&&l.selection.select(t,"TABLE"===n),"mousedown"===e.type&&l.nodeChanged())}),T.bind(M,"mscontrolselect",e=function(e){function t(e){_r.setEditorTimeout(l,function(){return l.selection.select(e)})}if(u(e.target)||Jn(e.target))return e.preventDefault(),void t(e.target);/^(TABLE|IMG|HR)$/.test(e.target.nodeName)&&(e.preventDefault(),"IMG"===e.target.tagName&&t(e.target))}),l.on("remove",function(){return T.unbind(M,"mscontrolselect",e)}));var t=_r.throttle(function(e){l.composing||o(e)});l.on("nodechange ResizeEditor ResizeWindow ResizeContent drop FullscreenStateChanged",t),l.on("keyup compositionend",function(e){p&&"TABLE"===p.nodeName&&t(e)}),l.on("hide blur",H),l.on("contextmenu longpress",n,!0)}),l.on("remove",j),{isResizable:i,showResizeRect:z,hideResizeRect:H,updateResizeRect:o,destroy:function(){p=h=y=null}}}function xf(e){return Xn(e)||Yn(e)}function wf(t,n,r){var o,e,i,a,u,s=r;if(s.caretPositionFromPoint)(e=s.caretPositionFromPoint(t,n))&&((o=r.createRange()).setStart(e.offsetNode,e.offset),o.collapse(!0));else if(s.caretRangeFromPoint)o=s.caretRangeFromPoint(t,n);else if(s.body.createTextRange){o=s.body.createTextRange();try{o.moveToPoint(t,n),o.collapse(!0)}catch(e){o=function(e,n,t){var r,o=t.elementFromPoint(e,n),i=t.body.createTextRange();if(o&&"HTML"!==o.tagName||(o=t.body),i.moveToElementText(o),0<(r=(r=Et.toArray(i.getClientRects())).sort(function(e,t){return(e=Math.abs(Math.max(e.top-n,e.bottom-n)))-Math.abs(Math.max(t.top-n,t.bottom-n))})).length){n=(r[0].bottom+r[0].top)/2;try{return i.moveToPoint(e,n),i.collapse(!0),i}catch(e){}}return null}(t,n,r)}return i=o,a=r.body,u=i&&i.parentElement?i.parentElement():null,Yn(function(e,t,n){for(;e&&e!==t;){if(n(e))return e;e=e.parentNode}return null}(u,a,xf))?null:i}return o}function Sf(e,t){return e&&t&&e.startContainer===t.startContainer&&e.startOffset===t.startOffset&&e.endContainer===t.endContainer&&e.endOffset===t.endOffset}function Ef(e,t,n){return null!==function(e,t,n){for(;e&&e!==t;){if(n(e))return e;e=e.parentNode}return null}(e,t,n)}function Nf(e){return e&&"TABLE"===e.nodeName}function kf(e,t,n){for(var r=new Rr(t,e.getParent(t.parentNode,e.isBlock)||e.getRoot());t=r[n?"prev":"next"]();)if(Wn(t))return 1}function _f(e,t,n,r,o){var i,a,u=e.getRoot(),s=e.schema.getNonEmptyElements(),c=e.getParent(o.parentNode,e.isBlock)||u;if(r&&Wn(o)&&t&&e.isEmpty(c))return ve.some(as(o.parentNode,e.nodeIndex(o)));for(var l,f,d=new Rr(o,c);a=d[r?"prev":"next"]();){if("false"===e.getContentEditableParent(a)||(f=u,Ir(l=a)&&!1===Ef(l,f,zc)))return ve.none();if(jn(a)&&0<a.nodeValue.length)return!1===Ef(a,u,function(e){return"A"===e.nodeName})?ve.some(as(a,r?a.nodeValue.length:0)):ve.none();if(e.isBlock(a)||s[a.nodeName.toLowerCase()])return ve.none();i=a}return n&&i?ve.some(as(i,0)):ve.none()}function Af(e,t,n,r){var o,i=e.getRoot(),a=!1,u=r[(n?"start":"end")+"Container"],s=r[(n?"start":"end")+"Offset"],c=zn(u)&&s===u.childNodes.length,l=e.schema.getNonEmptyElements(),f=n;if(Ir(u))return ve.none();if(zn(u)&&s>u.childNodes.length-1&&(f=!1),qn(u)&&(u=i,s=0),u===i){if(f&&(d=u.childNodes[0<s?s-1:0])){if(Ir(d))return ve.none();if(l[d.nodeName]||Nf(d))return ve.none()}if(u.hasChildNodes()){if(s=Math.min(!f&&0<s?s-1:s,u.childNodes.length-1),u=u.childNodes[s],s=jn(u)&&c?u.data.length:0,!t&&u===i.lastChild&&Nf(u))return ve.none();if(function(e,t){for(;t&&t!==e;){if(Yn(t))return 1;t=t.parentNode}}(i,u)||Ir(u))return ve.none();if(u.hasChildNodes()&&!1===Nf(u)){var d=u,m=new Rr(u,i);do{if(Yn(d)||Ir(d)){a=!1;break}if(jn(d)&&0<d.nodeValue.length){s=f?0:d.nodeValue.length,u=d,a=!0;break}if(l[d.nodeName.toLowerCase()]&&(!(o=d)||!/^(TD|TH|CAPTION)$/.test(o.nodeName))){s=e.nodeIndex(d),u=d.parentNode,f||s++,a=!0;break}}while(d=f?m.next():m.prev())}}}return t&&(jn(u)&&0===s&&_f(e,c,t,!0,u).each(function(e){u=e.container(),s=e.offset(),a=!0}),zn(u)&&(!(d=(d=u.childNodes[s])||u.childNodes[s-1])||!Wn(d)||d.previousSibling&&"A"===d.previousSibling.nodeName||kf(e,d,!1)||kf(e,d,!0)||_f(e,c,t,!0,d).each(function(e){u=e.container(),s=e.offset(),a=!0}))),f&&!t&&jn(u)&&s===u.nodeValue.length&&_f(e,c,t,!1,u).each(function(e){u=e.container(),s=e.offset(),a=!0}),a?ve.some(as(u,s)):ve.none()}function Rf(e,t){var n=t.collapsed,r=t.cloneRange(),o=as.fromRangeStart(t);return Af(e,n,!0,r).each(function(e){n&&as.isAbove(o,e)||r.setStart(e.container(),e.offset())}),n||Af(e,n,!1,r).each(function(e){r.setEnd(e.container(),e.offset())}),n&&r.collapse(!0),Sf(t,r)?ve.none():ve.some(r)}function Df(e,t){return e.splitText(t)}function Tf(e){var t=e.startContainer,n=e.startOffset,r=e.endContainer,o=e.endOffset;return t===r&&jn(t)?0<n&&n<t.nodeValue.length&&(t=(r=Df(t,n)).previousSibling,n<o?(t=r=Df(r,o-=n).previousSibling,o=r.nodeValue.length,n=0):o=0):(jn(t)&&0<n&&n<t.nodeValue.length&&(t=Df(t,n),n=0),jn(r)&&0<o&&o<r.nodeValue.length&&(o=(r=Df(r,o).previousSibling).nodeValue.length)),{startContainer:t,startOffset:n,endContainer:r,endOffset:o}}function Of(n){return{walk:function(e,t){return El(n,e,t)},split:Tf,normalize:function(t){return Rf(n,t).fold(R,function(e){return t.setStart(e.startContainer,e.startOffset),t.setEnd(e.endContainer,e.endOffset),!0})}}}Fl.isBookmarkNode=Yc;var Bf={BACKSPACE:8,DELETE:46,DOWN:40,ENTER:13,ESC:27,LEFT:37,RIGHT:39,SPACEBAR:32,TAB:9,UP:38,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,modifierPressed:function(e){return e.shiftKey||e.ctrlKey||e.altKey||Bf.metaKeyPressed(e)},metaKeyPressed:function(e){return xt.mac?e.metaKey:e.ctrlKey&&!e.altKey}},Pf=Yn;Of.compareRanges=Sf,Of.getCaretRangeFromPoint=wf,Of.getSelectedNode=Ou,Of.getNode=Bu;var Lf,If,Mf=(Lf="height",If=function(e){var t=e.dom;return In(e)?t.getBoundingClientRect().height:t.offsetHeight},{set:function(e,t){if(!E(t)&&!t.match(/^[0-9]+$/))throw new Error(Lf+".set accepts only positive integer values. Value was "+t);var n=e.dom;mn(n)&&(n.style[Lf]=t+"px")},get:Ff,getOuter:Ff,aggregate:Uf,max:function(e,t,n){var r=Uf(e,n);return r<t?t-r:0}});function Ff(e){var t=If(e);if(t<=0||null===t){var n=xn(e,Lf);return parseFloat(n)||0}return t}function Uf(o,e){return L(e,function(e,t){var n=xn(o,t),r=void 0===n?0:parseInt(n,10);return isNaN(r)?e:e+r},0)}function zf(e){return"textarea"===kt(e)}function Hf(e,t){var n=function(e){var t=e.dom.ownerDocument,n=t.body,r=t.defaultView,o=t.documentElement;if(n===e.dom)return Fn(n.offsetLeft,n.offsetTop);var i=Gt(null==r?void 0:r.pageYOffset,o.scrollTop),a=Gt(null==r?void 0:r.pageXOffset,o.scrollLeft),u=Gt(o.clientTop,n.clientTop),s=Gt(o.clientLeft,n.clientLeft);return Un(e).translate(a-s,i-u)}(e),r=Mf.get(e);return{element:e,bottom:n.top+r,height:r,pos:n,cleanup:t}}function jf(n,r,o,i){Rd(n,function(e,t){return Ad(n,r,o,i)},o)}function Vf(e,t,n,r,o){var i={elm:r.element.dom,alignToTop:o};e.fire("ScrollIntoView",i).isDefaultPrevented()||(n(t,Jt(t).top,r,o),e.fire("AfterScrollIntoView",i))}function qf(e,t,n,r){var o=Nt.fromDom(e.getDoc());Vf(e,o,n,Hf(Nt.fromDom(t),te),r)}function $f(e,t,n,r){var o,i=e.pos;n?Qt(i.left,i.top,r):(o=i.top-t+e.height,Qt(i.left,o,r))}function Wf(e,t,n,r,o){var i=n+t,a=r.pos.top,u=r.bottom,s=n<=u-a;a<t?$f(r,n,!1!==o,e):i<a?$f(r,n,s?!1!==o:!0===o,e):i<u&&!s&&$f(r,n,!0===o,e)}function Kf(e,t,n,r){Wf(e,t,e.dom.defaultView.innerHeight,n,r)}function Xf(e,t,n,r){Wf(e,t,e.dom.defaultView.innerHeight,n,r);var o,i,a,u,s,c,l,f=(o=n.element,u=Jt(Nt.fromDom(document)),a=(i=_d).owner(o),s=kd(i,a),c=Un(o),l=P(s,function(e,t){var n=Un(t);return{left:e.left+n.left,top:e.top+n.top}},{left:0,top:0}),Fn(l.left+c.left+u.left,l.top+c.top+u.top)),d=tn(window);f.top<d.y?Zt(n.element,!1!==r):f.top>d.bottom&&Zt(n.element,!0===r)}function Yf(e,t,n){return jf(e,Kf,t,n)}function Gf(e,t,n){return qf(e,t,Kf,n)}function Jf(e,t,n){return jf(e,Xf,t,n)}function Qf(e,t,n){return qf(e,t,Xf,n)}function Zf(e,t,n){(e.inline?Yf:Jf)(e,t,n)}function ed(e){var t=Bn(e).dom;return e.dom===t.activeElement}function td(e){return void 0===e&&(e=Nt.fromDom(document)),ve.from(e.dom.activeElement).map(Nt.fromDom)}function nd(e,t){var n=_n(t)?Pl(t).length:Dn(t).length+1;return n<e?n:e<0?0:e}function rd(e){return Bd.range(e.start,nd(e.soffset,e.start),e.finish,nd(e.foffset,e.finish))}function od(e,t){return!rn(t.dom)&&(Ve(e,t)||je(e,t))}function id(t){return function(e){return od(t,e.start)&&od(t,e.finish)}}function ad(e){return!0===e.inline||Pd.isIE()}function ud(e){return Bd.range(Nt.fromDom(e.startContainer),e.startOffset,Nt.fromDom(e.endContainer),e.endOffset)}function sd(e){var t=document.createRange();try{return t.setStart(e.start.dom,e.soffset),t.setEnd(e.finish.dom,e.foffset),ve.some(t)}catch(e){return ve.none()}}function cd(e){var t,n,r=ad(e)?(t=Nt.fromDom(e.getBody()),((n=Tt(t).dom.getSelection())&&0!==n.rangeCount?ve.from(n.getRangeAt(0)):ve.none()).map(ud).filter(id(t))):ve.none();e.bookmark=r.isSome()?r:e.bookmark}function ld(n){return(n.bookmark||ve.none()).bind(function(e){return t=Nt.fromDom(n.getBody()),ve.from(e).filter(id(t)).map(rd);var t}).bind(sd)}function fd(u){var s=lu(function(){cd(u)},0);u.on("init",function(){function e(){n.throttle()}var t,n,r,o,i,a;u.inline&&(t=u,n=s,Ja.DOM.bind(document,"mouseup",e),t.on("remove",function(){Ja.DOM.unbind(document,"mouseup",e)})),r=u,o=s,dt().browser.isIE()?(a=r).on("focusout",function(){cd(a)}):(i=o,r.on("mouseup touchend",function(e){i.throttle()})),r.on("keyup NodeChange",function(e){"nodechange"===e.type&&e.selectionChange||cd(r)})}),u.on("remove",function(){s.cancel()})}function dd(t,e){var n=t.getParam("custom_ui_selector","","string");return null!==Id.getParent(e,function(e){return Ld.isEditorUIElement(e)||!!n&&t.dom.is(e,n)})}function md(n,e){var t=e.editor;fd(t),t.on("focusin",function(){var e=n.focusedEditor;e!==t&&(e&&e.fire("blur",{focusedEditor:t}),n.setActive(t),(n.focusedEditor=t).fire("focus",{blurredEditor:e}),t.focus(!0))}),t.on("focusout",function(){_r.setEditorTimeout(t,function(){var e=n.focusedEditor;dd(t,function(e){try{return td(Bn(Nt.fromDom(e.getElement()))).fold(function(){return document.body},function(e){return e.dom})}catch(e){return document.body}}(t))||e!==t||(t.fire("blur",{focusedEditor:null}),n.focusedEditor=null)})}),Nd||(Nd=function(e){var t=n.activeEditor;t&&!function(e){if(On()&&V(e.target)){var t=Nt.fromDom(e.target);if(kn(t)&&V(t.dom.shadowRoot)&&e.composed&&e.composedPath){var n=e.composedPath();if(n)return Q(n)}}return ve.from(e.target)}(e).each(function(e){e.ownerDocument===document&&(e===document.body||dd(t,e)||n.focusedEditor!==t||(t.fire("blur",{focusedEditor:null}),n.focusedEditor=null))})},Id.bind(document,"focusin",Nd))}function gd(e,t){e.focusedEditor===t.editor&&(e.focusedEditor=null),e.activeEditor||(Id.unbind(document,"focusin",Nd),Nd=null)}function pd(t,e){var n,r;n=Nt.fromDom(t.getBody()),((r=e).collapsed?ve.from(Bu(r.startContainer,r.startOffset)).map(Nt.fromDom):ve.none()).bind(function(e){return po(e)?ve.some(e):!1===Ve(n,e)?ve.some(n):ve.none()}).bind(function(e){return ef(e.dom)}).fold(function(){t.selection.normalize()},function(e){return t.selection.setRng(e.toRange())})}function hd(t){if(t.setActive)try{t.setActive()}catch(e){t.focus()}else t.focus()}function vd(e){return e.inline?(r=e.getBody())&&(ed(t=Nt.fromDom(r))||td(Bn(n=t)).filter(function(e){return n.dom.contains(e.dom)}).isSome()):e.iframeElement&&ed(Nt.fromDom(e.iframeElement));var t,n,r}function bd(e,t,n,r,o){var i=n?t.startContainer:t.endContainer,a=n?t.startOffset:t.endOffset;return ve.from(i).map(Nt.fromDom).map(function(e){return r&&t.collapsed?e:Mt(e,o(e,a)).getOr(e)}).bind(function(e){return kn(e)?ve.some(e):Ot(e).filter(kn)}).map(function(e){return e.dom}).getOr(e)}function yd(e,t,n){return bd(e,t,!0,n,function(e,t){return Math.min(zt(e),t)})}function Cd(e,t,n){return bd(e,t,!1,n,function(e,t){return 0<t?t-1:t})}function xd(e,t){for(var n=e;e&&jn(e)&&0===e.length;)e=t?e.nextSibling:e.previousSibling;return e||n}function wd(n,e){return T(e,function(e){var t=n.fire("GetSelectionRange",{range:e});return t.range!==e?t.range:e})}function Sd(e,t,n){var r=n?"lastChild":"firstChild",o=n?"prev":"next";if(e[r])return e[r];if(e!==t){var i=e[o];if(i)return i;for(var a=e.parent;a&&a!==t;a=a.parent)if(i=a[o])return i}}function Ed(e){var t="a"===e.name&&!e.attr("href")&&e.attr("id");return e.attr("name")||e.attr("id")&&!e.firstChild||e.attr("data-mce-bookmark")||t}var Nd,kd=function(r,e){return r.view(e).fold(J([]),function(e){var t=r.owner(e),n=kd(r,t);return[e].concat(n)})},_d=Object.freeze({__proto__:null,view:function(e){var t;return(e.dom===document?ve.none():ve.from(null===(t=e.dom.defaultView)||void 0===t?void 0:t.frameElement)).map(Nt.fromDom)},owner:Dt}),Ad=function(e,t,n,r){var o=Nt.fromDom(e.getBody()),i=Nt.fromDom(e.getDoc());o.dom.offsetWidth;var a,u,s,c,l=(a=Nt.fromDom(n.startContainer),u=n.startOffset,s=function(e,t){var n=Dn(e);if(0===n.length||zf(e))return{element:e,offset:t};if(t<n.length&&!zf(n[t]))return{element:n[t],offset:0};var r=n[n.length-1];return zf(r)?{element:e,offset:t}:"img"===kt(r)?{element:r,offset:1}:_n(r)?{element:r,offset:Pl(r).length}:{element:r,offset:Dn(r).length}}(a,u),c=Nt.fromHtml('<span data-mce-bogus="all" style="display: inline-block;">\ufeff</span>'),qt(s.element,c),Hf(c,function(){return Ln(c)}));Vf(e,i,t,l,r),l.cleanup()},Rd=function(e,t,n){var r=n.startContainer,o=n.startOffset,i=n.endContainer,a=n.endOffset;t(Nt.fromDom(r),Nt.fromDom(i));var u=e.dom.createRng();u.setStart(r,o),u.setEnd(i,a),e.selection.setRng(n)},Dd=or([{before:["element"]},{on:["element","offset"]},{after:["element"]}]),Td=(Dd.before,Dd.on,Dd.after,function(e){return e.fold(u,u,u)}),Od=or([{domRange:["rng"]},{relative:["startSitu","finishSitu"]},{exact:["start","soffset","finish","foffset"]}]),Bd={domRange:Od.domRange,relative:Od.relative,exact:Od.exact,exactFromRange:function(e){return Od.exact(e.start,e.soffset,e.finish,e.foffset)},getWin:function(e){return Tt(e.match({domRange:function(e){return Nt.fromDom(e.startContainer)},relative:function(e,t){return Td(e)},exact:function(e,t,n,r){return e}}))},range:function(e,t,n,r){return{start:e,soffset:t,finish:n,foffset:r}}},Pd=dt().browser,Ld={isEditorUIElement:function(e){var t=e.className.toString();return-1!==t.indexOf("tox-")||-1!==t.indexOf("mce-")}},Id=Ja.DOM,Md=function(e){return e.editorManager.setActive(e)},Fd={"#text":3,"#comment":8,"#cdata":4,"#pi":7,"#doctype":10,"#document-fragment":11},Ud=(zd.create=function(e,t){var n=new zd(e,Fd[e]||1);return t&&ne(t,function(e,t){n.attr(t,e)}),n},zd.prototype.replace=function(e){return e.parent&&e.remove(),this.insert(e,this),this.remove(),this},zd.prototype.attr=function(e,t){var n,r=this;if("string"!=typeof e)return null!=e&&ne(e,function(e,t){r.attr(t,e)}),r;if(n=r.attributes){if(void 0===t)return n.map[e];if(null===t){if(e in n.map){delete n.map[e];for(var o=n.length;o--;)if(n[o].name===e)return n.splice(o,1),r}return r}if(e in n.map){for(o=n.length;o--;)if(n[o].name===e){n[o].value=t;break}}else n.push({name:e,value:t});return n.map[e]=t,r}},zd.prototype.clone=function(){var e,t=new zd(this.name,this.type);if(e=this.attributes){var n=[];n.map={};for(var r=0,o=e.length;r<o;r++){var i=e[r];"id"!==i.name&&(n[n.length]={name:i.name,value:i.value},n.map[i.name]=i.value)}t.attributes=n}return t.value=this.value,t.shortEnded=this.shortEnded,t},zd.prototype.wrap=function(e){return this.parent.insert(e,this),e.append(this),this},zd.prototype.unwrap=function(){for(var e=this.firstChild;e;){var t=e.next;this.insert(e,this,!0),e=t}this.remove()},zd.prototype.remove=function(){var e=this.parent,t=this.next,n=this.prev;return e&&(e.firstChild===this?(e.firstChild=t)&&(t.prev=null):n.next=t,e.lastChild===this?(e.lastChild=n)&&(n.next=null):t.prev=n,this.parent=this.next=this.prev=null),this},zd.prototype.append=function(e){e.parent&&e.remove();var t=this.lastChild;return t?((t.next=e).prev=t,this.lastChild=e):this.lastChild=this.firstChild=e,e.parent=this,e},zd.prototype.insert=function(e,t,n){e.parent&&e.remove();var r=t.parent||this;return n?(t===r.firstChild?r.firstChild=e:t.prev.next=e,e.prev=t.prev,(e.next=t).prev=e):(t===r.lastChild?r.lastChild=e:t.next.prev=e,e.next=t.next,(e.prev=t).next=e),e.parent=r,e},zd.prototype.getAll=function(e){for(var t=[],n=this.firstChild;n;n=Sd(n,this))n.name===e&&t.push(n);return t},zd.prototype.children=function(){for(var e=[],t=this.firstChild;t;t=t.next)e.push(t);return e},zd.prototype.empty=function(){if(this.firstChild){for(var e=[],t=this.firstChild;t;t=Sd(t,this))e.push(t);for(var n=e.length;n--;)(t=e[n]).parent=t.firstChild=t.lastChild=t.next=t.prev=null}return this.firstChild=this.lastChild=null,this},zd.prototype.isEmpty=function(e,t,n){void 0===t&&(t={});var r=this.firstChild;if(Ed(this))return!1;if(r)do{if(1===r.type){if(r.attr("data-mce-bogus"))continue;if(e[r.name])return!1;if(Ed(r))return!1}if(8===r.type)return!1;if(3===r.type&&!function(e){if(qr(e.value)){var t=e.parent;return!t||"span"===t.name&&!t.attr("style")||!/^[ ]+$/.test(e.value)}}(r))return!1;if(3===r.type&&r.parent&&t[r.parent.name]&&qr(r.value))return!1;if(n&&n(r))return!1}while(r=Sd(r,this));return!0},zd.prototype.walk=function(e){return Sd(this,null,e)},zd);function zd(e,t){this.name=e,1===(this.type=t)&&(this.attributes=[],this.attributes.map={})}function Hd(e,t){return e.replace(t.re,function(e){return ue(t.uris,e).getOr(e)})}var jd=Et.each,Vd=Et.trim,qd="source protocol authority userInfo user password host port relative path directory file query anchor".split(" "),$d={ftp:21,http:80,https:443,mailto:25},Wd=["img","video"],Kd=(Xd.parseDataUri=function(e){var t,n=decodeURIComponent(e).split(","),r=/data:([^;]+)/.exec(n[0]);return{type:t=r?r[1]:t,data:n[1]}},Xd.isDomSafe=function(e,t,n){if((n=void 0===n?{}:n).allow_script_urls)return!0;var r,o,i,a,u=Go.decode(e).replace(/[\s\u0000-\u001F]+/g,"");try{u=decodeURIComponent(u)}catch(e){u=unescape(u)}return!(/((java|vb)script|mhtml):/i.test(u)||(o=u,i=t,!(r=n).allow_html_data_urls&&(/^data:image\//i.test(o)?(V(a=r.allow_svg_data_urls)?!a:!V(i)||!D(Wd,i))&&/^data:image\/svg\+xml/i.test(o):/^data:/i.test(o))))},Xd.getDocumentBaseUrl=function(e){var t=0!==e.protocol.indexOf("http")&&"file:"!==e.protocol?e.href:e.protocol+"//"+e.host+e.pathname;return/^[^:]+:\/\/\/?[^\/]+\//.test(t)&&(t=t.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,""),/[\/\\]$/.test(t)||(t+="/")),t},Xd.prototype.setPath=function(e){var t=/^(.*?)\/?(\w+)?$/.exec(e);this.path=t[0],this.directory=t[1],this.file=t[2],this.source="",this.getURI()},Xd.prototype.toRelative=function(e){var t;if("./"===e)return e;var n=new Xd(e,{base_uri:this});if("mce_host"!==n.host&&this.host!==n.host&&n.host||this.port!==n.port||this.protocol!==n.protocol&&""!==n.protocol)return n.getURI();var r=this.getURI(),o=n.getURI();return r===o||"/"===r.charAt(r.length-1)&&r.substr(0,r.length-1)===o?r:(t=this.toRelPath(this.path,n.path),n.query&&(t+="?"+n.query),n.anchor&&(t+="#"+n.anchor),t)},Xd.prototype.toAbsolute=function(e,t){var n=new Xd(e,{base_uri:this});return n.getURI(t&&this.isSameOrigin(n))},Xd.prototype.isSameOrigin=function(e){if(this.host==e.host&&this.protocol==e.protocol){if(this.port==e.port)return!0;var t=$d[this.protocol];if(t&&(this.port||t)==(e.port||t))return!0}return!1},Xd.prototype.toRelPath=function(e,t){var n,r,o=0,i="",a=e.substring(0,e.lastIndexOf("/")).split("/"),u=t.split("/");if(a.length>=u.length)for(n=0,r=a.length;n<r;n++)if(n>=u.length||a[n]!==u[n]){o=n+1;break}if(a.length<u.length)for(n=0,r=u.length;n<r;n++)if(n>=a.length||a[n]!==u[n]){o=n+1;break}if(1===o)return t;for(n=0,r=a.length-(o-1);n<r;n++)i+="../";for(n=o-1,r=u.length;n<r;n++)i+=n!==o-1?"/"+u[n]:u[n];return i},Xd.prototype.toAbsPath=function(e,t){var n,r,o=0,i=[],a=/\/$/.test(t)?"/":"",u=e.split("/"),s=t.split("/");for(jd(u,function(e){e&&i.push(e)}),u=i,n=s.length-1,i=[];0<=n;n--)0!==s[n].length&&"."!==s[n]&&(".."!==s[n]?0<o?o--:i.push(s[n]):o++);return 0!==(r=(n=u.length-o)<=0?q(i).join("/"):u.slice(0,n).join("/")+"/"+q(i).join("/")).indexOf("/")&&(r="/"+r),a&&r.lastIndexOf("/")!==r.length-1&&(r+=a),r},Xd.prototype.getURI=function(e){var t;return void 0===e&&(e=!1),this.source&&!e||(t="",e||(this.protocol?t+=this.protocol+"://":t+="//",this.userInfo&&(t+=this.userInfo+"@"),this.host&&(t+=this.host),this.port&&(t+=":"+this.port)),this.path&&(t+=this.path),this.query&&(t+="?"+this.query),this.anchor&&(t+="#"+this.anchor),this.source=t),this.source},Xd);function Xd(e,t){e=Vd(e),this.settings=t||{};var n,r,o,i,a=this.settings.base_uri,u=this;/^([\w\-]+):([^\/]{2})/i.test(e)||/^\s*#/.test(e)?u.source=e:(n=0===e.indexOf("//"),0!==e.indexOf("/")||n||(e=(a&&a.protocol||"http")+"://mce_host"+e),/^[\w\-]*:?\/\//.test(e)||(r=this.settings.base_uri?this.settings.base_uri.path:new Xd(document.location.href).directory,e=this.settings.base_uri&&""==this.settings.base_uri.protocol?"//mce_host"+u.toAbsPath(r,e):(o=/([^#?]*)([#?]?.*)/.exec(e),(a&&a.protocol||"http")+"://mce_host"+u.toAbsPath(r,o[1])+o[2])),e=e.replace(/@@/g,"(mce_at)"),i=/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@\/]*):?([^:@\/]*))?@)?(\[[a-zA-Z0-9:.%]+\]|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(e),jd(qd,function(e,t){var n=(n=i[t])&&n.replace(/\(mce_at\)/g,"@@");u[e]=n}),a&&(u.protocol||(u.protocol=a.protocol),u.userInfo||(u.userInfo=a.userInfo),u.port||"mce_host"!==u.host||(u.port=a.port),u.host&&"mce_host"!==u.host||(u.host=a.host),u.source=""),n&&(u.protocol=""))}function Yd(e,t,n){for(var r=/<([!?\/])?([A-Za-z0-9\-_:.]+)/g,o=/(?:\s(?:[^'">]+(?:"[^"]*"|'[^']*'))*[^"'>]*(?:"[^">]*|'[^'>]*)?|\s*|\/)>/g,i=e.getShortEndedElements(),a=1,u=n;0!==a;)for(r.lastIndex=u;;){var s=r.exec(t);if(null===s)return u;if("!"===s[1]){u=Ge(s[2],"--")?Qd(t,!1,s.index+"!--".length):Qd(t,!0,s.index+1);break}o.lastIndex=r.lastIndex;var c=o.exec(t);if(!l(c)&&c.index===r.lastIndex){"/"===s[1]?--a:Ne(i,s[2])||(a+=1),u=r.lastIndex+c[0].length;break}}return u}function Gd(q,$){var e;void 0===$&&($=to());var W=null!==(e=(q=q||{}).document)&&void 0!==e?e:document,K=W.createElement("form");function n(s,e){void 0===e&&(e="html");for(var t,i,n,c,r,o,a,l,u,f,d,m,g,p,h,v,b,y,C,x=s.html,w=0,S=[],E=0,N=Go.decode,k=Et.makeMap("src,href,data,background,action,formaction,poster,xlink:href"),_="html"===e?0:1,A=function(e){for(var t,n=S.length;n--&&S[n].name!==e;);if(0<=n){for(t=S.length-1;n<=t;t--)(e=S[t]).valid&&Q(e.name);S.length=n}},R=function(e,t){return G(Hd(e,s),t)},D=function(e){""!==e&&(">"===e.charAt(0)&&(e=" "+e),q.allow_conditional_comments||"[if"!==e.substr(0,3).toLowerCase()||(e=" "+e),X(Hd(e,s)))},T=function(e,t){var n=e||"",r=!Ge(n,"--"),o=Qd(x,r,t);return e=x.substr(t,o-t),D(r?n+e:e),o+1},O=new RegExp("<(?:(?:!--([\\w\\W]*?)--!?>)|(?:!\\[CDATA\\[([\\w\\W]*?)\\]\\]>)|(?:![Dd][Oo][Cc][Tt][Yy][Pp][Ee]([\\w\\W]*?)>)|(?:!(--)?)|(?:\\?([^\\s\\/<>]+) ?([\\w\\W]*?)[?/]>)|(?:\\/([A-Za-z][A-Za-z0-9\\-_\\:\\.]*)>)|(?:([A-Za-z][A-Za-z0-9\\-_:.]*)(\\s(?:[^'\">]+(?:\"[^\"]*\"|'[^']*'))*[^\"'>]*(?:\"[^\">]*|'[^'>]*)?|\\s*|\\/)>))","g"),B=/([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:[^\"])*)\")|(?:\'((?:[^\'])*)\')|([^>\s]+)))?/g,P=$.getShortEndedElements(),L=q.self_closing_elements||$.getSelfClosingElements(),I=$.getBoolAttrs(),M=q.validate,F=q.remove_internals,U=q.fix_self_closing,z=$.getSpecialElements(),H=x+">";t=O.exec(H);){var j=t[0];if(w<t.index&&R(N(x.substr(w,t.index-w))),i=t[7])A(i=":"===(i=i.toLowerCase()).charAt(0)?i.substr(1):i);else if(i=t[8]){if(t.index+j.length>x.length){R(N(x.substr(t.index))),w=t.index+j.length;continue}u=(i=":"===(i=i.toLowerCase()).charAt(0)?i.substr(1):i)in P,U&&L[i]&&0<S.length&&S[S.length-1].name===i&&A(i);var V=function(e,t){var n=e.exec(t);if(n){var r=n[1],o=n[2];return"string"==typeof r&&"data-mce-bogus"===r.toLowerCase()?o:null}return null}(B,t[9]);if(null!==V){if("all"===V){w=Yd($,x,O.lastIndex),O.lastIndex=w;continue}d=!1}if(!M||(f=$.getElementRule(i))){if(d=!0,M&&(p=f.attributes,h=f.attributePatterns),(g=t[9])?((l=-1!==g.indexOf("data-mce-type"))&&F&&(d=!1),(c=[]).map={},g.replace(B,function(e,t,n,r,o){return function(e,t,n,r,o){var i;if(n=Hd((t=t.toLowerCase())in I?t:N(n||r||o||""),s),M&&!l&&0==(0===(i=t).indexOf("data-")||0===i.indexOf("aria-"))){var a=p[t];if(!a&&h){for(var u=h.length;u--&&!(a=h[u]).pattern.test(t););-1===u&&(a=null)}if(!a)return;if(a.validValues&&!(n in a.validValues))return}("name"===t||"id"===t)&&e in Jd&&(n in W||n in K)||k[t]&&!Kd.isDomSafe(n,e,q)||l&&(t in k||0===t.indexOf("on"))||(c.map[t]=n,c.push({name:t,value:n}))}(i,t,n,r,o),""})):(c=[]).map={},M&&!l){if(v=f.attributesRequired,b=f.attributesDefault,y=f.attributesForced,f.removeEmptyAttrs&&!c.length&&(d=!1),y)for(r=y.length;r--;)a=(m=y[r]).name,"{$uid}"===(C=m.value)&&(C="mce_"+E++),c.map[a]=C,c.push({name:a,value:C});if(b)for(r=b.length;r--;)(a=(m=b[r]).name)in c.map||("{$uid}"===(C=m.value)&&(C="mce_"+E++),c.map[a]=C,c.push({name:a,value:C}));if(v){for(r=v.length;r--&&!(v[r]in c.map););-1===r&&(d=!1)}if(m=c.map["data-mce-bogus"]){if("all"===m){w=Yd($,x,O.lastIndex),O.lastIndex=w;continue}d=!1}}d&&J(i,c,u)}else d=!1;if(n=z[i]){n.lastIndex=w=t.index+j.length,w=(t=n.exec(x))?(d&&(o=x.substr(w,t.index-w)),t.index+t[0].length):(o=x.substr(w),x.length),d&&(0<o.length&&R(o,!0),Q(i)),O.lastIndex=w;continue}u||(g&&g.indexOf("/")===g.length-1?d&&Q(i):S.push({name:i,valid:d}))}else if(i=t[1])D(i);else if(i=t[2]){if(!(1==_||q.preserve_cdata||0<S.length&&$.isValidChild(S[S.length-1].name,"#cdata"))){w=T("",t.index+2),O.lastIndex=w;continue}Y(i)}else if(i=t[3])ee(i);else{if((i=t[4])||"<!"===j){w=T(i,t.index+j.length),O.lastIndex=w;continue}if(i=t[5]){if(1!=_){w=T("?",t.index+2),O.lastIndex=w;continue}Z(i,t[6])}}w=t.index+j.length}for(w<x.length&&R(N(x.substr(w))),r=S.length-1;0<=r;r--)(i=S[r]).valid&&Q(i.name)}!1!==q.fix_self_closing&&(q.fix_self_closing=!0);var X=q.comment||te,Y=q.cdata||te,G=q.text||te,J=q.start||te,Q=q.end||te,Z=q.pi||te,ee=q.doctype||te;return{parse:function(e,t){void 0===t&&(t="html"),n(function(e){for(var t,n=/data:[^;]+;base64,([a-z0-9\+\/=\s]+)/gi,r=[],o={},i=yu("img"),a=0,u=0;t=n.exec(e);){var s=t[0],c=i+"_"+u++;o[c]=s,a<t.index&&r.push(e.substr(a,t.index-a)),r.push(c),a=t.index+s.length}var l=new RegExp(i+"_[0-9]+","g");return 0===a?{prefix:i,uris:o,html:e,re:l}:(a<e.length&&r.push(e.substr(a)),{prefix:i,uris:o,html:r.join(""),re:l})}(e),t)}}}var Jd=Et.makeMap("button,fieldset,form,iframe,img,image,input,object,output,select,textarea"),Qd=function(e,t,n){void 0===n&&(n=0);var r=e.toLowerCase();if(-1!==r.indexOf("[if ",n)&&(u=n,/^\s*\[if [\w\W]+\]>.*<!\[endif\](--!?)?>/.test(r.substr(u)))){var o=r.indexOf("[endif]",n);return r.indexOf(">",o)}if(t){var i=r.indexOf(">",n);return-1!==i?i:r.length}var a=/--!?>/g;a.lastIndex=n;var u,s=a.exec(e);return s?s.index+s[0].length:r.length};function Zd(e,t){for(var n,r,o,i,a=/<(\w+) [^>]*data-mce-bogus="all"[^>]*>/g,u=e.schema,s=(n=e.getTempAttrs(),r=t,o=new RegExp(["\\s?("+n.join("|")+')="[^"]+"'].join("|"),"gi"),r.replace(o,"")),c=u.getShortEndedElements();i=a.exec(s);){var l=a.lastIndex,f=i[0].length,d=c[i[1]]?l:Gd.findEndTag(u,s,l),s=s.substring(0,l-f)+s.substring(d);a.lastIndex=l-f}return wo(s)}function em(o){return{compare:function(e,t){return e.nodeName===t.nodeName&&!(!r(n(e),n(t))||!r(o.parseStyle(o.getAttrib(e,"style")),o.parseStyle(o.getAttrib(t,"style")))||Yc(e)||Yc(t));function n(n){var r={};return om(o.getAttribs(n),function(e){var t=e.nodeName.toLowerCase();0!==t.indexOf("_")&&"style"!==t&&0!==t.indexOf("data-")&&(r[t]=o.getAttrib(n,t))}),r}function r(e,t){var n,r;for(r in e)if(Ne(e,r)){if(void 0===(n=t[r]))return;if(e[r]!==n)return;delete t[r]}for(r in t)if(Ne(t,r))return;return 1}}}}function tm(e){var u=[],s=(e=e||{}).indent,c=im(e.indent_before||""),l=im(e.indent_after||""),f=Go.getEncodeFunc(e.entity_encoding||"raw",e.entities),d="html"===e.element_format;return{start:function(e,t,n){var r,o,i,a;if(s&&c[e]&&0<u.length&&0<(a=u[u.length-1]).length&&"\n"!==a&&u.push("\n"),u.push("<",e),t)for(r=0,o=t.length;r<o;r++)i=t[r],u.push(" ",i.name,'="',f(i.value,!0),'"');u[u.length]=!n||d?">":" />",n&&s&&l[e]&&0<u.length&&0<(a=u[u.length-1]).length&&"\n"!==a&&u.push("\n")},end:function(e){var t;u.push("</",e,">"),s&&l[e]&&0<u.length&&0<(t=u[u.length-1]).length&&"\n"!==t&&u.push("\n")},text:function(e,t){0<e.length&&(u[u.length]=t?e:f(e))},cdata:function(e){u.push("<![CDATA[",e,"]]>")},comment:function(e){u.push("\x3c!--",e,"--\x3e")},pi:function(e,t){t?u.push("<?",e," ",f(t),"?>"):u.push("<?",e,"?>"),s&&u.push("\n")},doctype:function(e){u.push("<!DOCTYPE",e,">",s?"\n":"")},reset:function(){u.length=0},getContent:function(){return u.join("").replace(/\n$/,"")}}}function nm(t,g){void 0===g&&(g=to());var p=tm(t);return(t=t||{}).validate=!("validate"in t)||t.validate,{serialize:function(e){var f=t.validate,d={3:function(e){p.text(e.value,e.raw)},8:function(e){p.comment(e.value)},7:function(e){p.pi(e.name,e.value)},10:function(e){p.doctype(e.value)},4:function(e){p.cdata(e.value)},11:function(e){if(e=e.firstChild)for(;m(e),e=e.next;);}};p.reset();var m=function(e){var t=d[e.type];if(t)t(e);else{var n=e.name,r=e.shortEnded,o=e.attributes;if(f&&o&&1<o.length){var i=[];i.map={};var a=g.getElementRule(e.name);if(a){for(var u=0,s=a.attributesOrder.length;u<s;u++)(c=a.attributesOrder[u])in o.map&&(l=o.map[c],i.map[c]=l,i.push({name:c,value:l}));for(var c,l,u=0,s=o.length;u<s;u++)(c=o[u].name)in i.map||(l=o.map[c],i.map[c]=l,i.push({name:c,value:l}));o=i}}if(p.start(e.name,o,r),!r){if(e=e.firstChild)for(;m(e),e=e.next;);p.end(n)}}};return 1!==e.type||t.inner?d[11](e):m(e),p.getContent()}}}Gd.findEndTag=Yd;var rm=Zd,om=Et.each,im=Et.makeMap,am=new Set;function um(e,t){return we(e.parseStyle(e.getAttrib(t,"style")))}function sm(n,r,o){return ve.from(o.container()).filter(jn).exists(function(e){var t=n?0:-1;return r(e.data.charAt(o.offset()+t))})}function cm(e){var t=e.container();return jn(t)&&(0===t.data.length||xo(t.data)&&Fl.isBookmarkNode(t.parentNode))}function lm(t,n){return function(e){return ve.from(Gs(t?0:-1,e)).filter(n).isSome()}}function fm(e){return Kn(e)&&"block"===xn(Nt.fromDom(e),"display")}function dm(e){return Yn(e)&&!(zn(t=e)&&"all"===t.getAttribute("data-mce-bogus"));var t}function mm(e){Xt(e),Pn(e,Nt.fromHtml('<br data-mce-bogus="1">'))}function gm(n){Ut(n).each(function(t){Bt(t).each(function(e){lo(n)&&Br(t)&&lo(e)&&Ln(t)})})}function pm(e,t){return o=R,Ve(r=t,n=e)?function(e,t){for(var n=y(t)?t:R,r=e.dom,o=[];null!==r.parentNode&&void 0!==r.parentNode;){var i=r.parentNode,a=Nt.fromDom(i);if(o.push(a),!0===n(a))break;r=i}return o}(n,function(e){return o(e)||je(e,r)}).slice(0,-1):[];var n,r,o}function hm(e,t){return[e].concat(pm(e,t))}function vm(e,t,n){return Jl(e,t,n,cm)}function bm(e,t){return M(hm(Nt.fromDom(t.container()),e),lo)}function ym(e,n,r){return vm(e,n.dom,r).forall(function(t){return bm(n,r).fold(function(){return!1===Ys(t,r,n.dom)},function(e){return!1===Ys(t,r,n.dom)&&Ve(e,Nt.fromDom(t.container()))})})}function Cm(t,n,r){return bm(n,r).fold(function(){return vm(t,n.dom,r).forall(function(e){return!1===Ys(e,r,n.dom)})},function(e){return vm(t,e.dom,r).isNone()})}function xm(e){return nc(e).exists(Br)}function wm(e,t,n){var r=Q(U(hm(Nt.fromDom(n.container()),t),lo)).getOr(t);return Gl(e,r.dom,n).filter(xm)}function Sm(e,t){return nc(t).exists(Br)||wm(!0,e,t).isSome()}function Em(e,t){return ve.from(t.getNode(!0)).map(Nt.fromDom).exists(Br)||wm(!1,e,t).isSome()}function Nm(e){return as.isTextPosition(e)&&!e.isAtStart()&&!e.isAtEnd()}function km(e,t){return Q(U(hm(Nt.fromDom(t.container()),e),lo)).getOr(e)}function _m(e,t){return Nm(t)?Kg(t):Kg(t)||Zl(km(e,t).dom,t).exists(Kg)}function Am(e,t){return Nm(t)?Wg(t):Wg(t)||Ql(km(e,t).dom,t).exists(Wg)}function Rm(e){return nc(e).bind(function(e){return pr(e,kn)}).exists(function(e){return D(["pre","pre-wrap"],xn(e,"white-space"))})}function Dm(e,t){return!Rm(t)&&(np(e,t)||op(e,t)||Em(e,t)||_m(e,t))}function Tm(e,t){return!Rm(t)&&(rp(e,t)||ip(e,t)||Sm(e,t)||Am(e,t))}function Om(e,t){return Dm(e,t)||Tm(e,(r=(n=t).container(),o=n.offset(),jn(r)&&o<r.data.length?as(r,o+1):n));var n,r,o}function Bm(e,t){return of(e.charAt(t))}function Pm(e){var t=e.container();return jn(t)&&Te(t.data,yo)}function Lm(g,e){return ve.some(e).filter(Pm).bind(function(e){var t,n,r,o,i,a,u,s,c,l=e.container(),f=g,d=(i=l).data,m=as(i,0);return(!Bm(d,0)||Om(f,m)?(s=(a=l).data,(c=T(u=s.split(""),function(e,t){return of(e)&&0<t&&t<u.length-1&&Jc(u[t-1])&&Jc(u[t+1])?" ":e}).join(""))!==s&&(a.data=c,1)):(i.data=" "+d.slice(1),1))||(t=g,r=(n=l).data,o=as(n,r.length-1),Bm(r,r.length-1)&&!Om(t,o)&&(n.data=r.slice(0,-1)+" ",1))?ve.some(e):ve.none()})}function Im(t){var e=Nt.fromDom(t.getBody());t.selection.isCollapsed()&&Lm(e,as.fromRangeStart(t.selection.getRng())).each(function(e){t.selection.setRng(e.toRange())})}function Mm(e,t,n){var r,o,i,a,u,s,c,l;0!==n&&(o=gr(r=Nt.fromDom(e),lo).getOr(r),i=e.data.slice(t,t+n),a=t+n>=e.data.length&&Tm(o,as(e,e.data.length)),u=0===t&&Dm(o,as(e,0)),e.replaceData(t,n,(c=u,l=a,L(s=i,function(e,t){return Gc(t)||of(t)?e.previousCharIsSpace||""===e.str&&c||e.str.length===s.length-1&&l?{previousCharIsSpace:!1,str:e.str+yo}:{previousCharIsSpace:!0,str:e.str+" "}:{previousCharIsSpace:!1,str:e.str+t}},{previousCharIsSpace:!1,str:""}).str)))}function Fm(e,t){var n=e.data.slice(t);Mm(e,t,n.length-Qe(n).length)}function Um(e,t){var n=e.data.slice(0,t),r=n.length-Ze(n).length;Mm(e,t-r,r)}function zm(e,t,n,r){void 0===r&&(r=!0);var o=Ze(e.data).length,i=r?e:t,a=r?t:e;return r?i.appendData(a.data):i.insertData(0,a.data),Ln(Nt.fromDom(a)),n&&Fm(i,o),i}function Hm(e,t){return r=e,o=(n=t).container(),i=n.offset(),!1===as.isTextPosition(n)&&o===r.parentNode&&i>as.before(r).offset()?as(t.container(),t.offset()-1):t;var n,r,o,i}function jm(e){return jr(e.previousSibling)?ve.some((t=e.previousSibling,jn(t)?as(t,t.data.length):as.after(t))):e.previousSibling?tf(e.previousSibling):ve.none();var t}function Vm(e){return jr(e.nextSibling)?ve.some((t=e.nextSibling,jn(t)?as(t,0):as.before(t))):e.nextSibling?ef(e.nextSibling):ve.none();var t}function qm(r,o){return jm(o).orThunk(function(){return Vm(o)}).orThunk(function(){return e=r,n=as.before((t=o).previousSibling||t.parentNode),Zl(e,n).fold(function(){return Ql(e,as.after(t))},ve.some);var e,t,n})}function $m(n,r){return Vm(r).orThunk(function(){return jm(r)}).orThunk(function(){return Ql(e=n,as.after(t=r)).fold(function(){return Zl(e,as.before(t))},ve.some);var e,t})}function Wm(t,n,e){e.fold(function(){t.focus()},function(e){t.selection.setRng(e.toRange(),n)})}function Km(e,t){return t&&Ne(e.schema.getBlockElements(),kt(t))}function Xm(e){if(Wr(e)){var t=Nt.fromHtml('<br data-mce-bogus="1">');return Xt(e),Pn(e,t),ve.some(as.before(t.dom))}return ve.none()}function Ym(t,n,e,r){void 0===r&&(r=!0);var o,i,a,u,s,c,l,f,d,m,g,p,h,v,b=(p=n,h=t.getBody(),v=e.dom,(p?$m:qm)(h,v).map(A(Hm,v))),y=gr(e,A(Km,t),(o=t.getBody(),function(e){return e.dom===o})),C=(u=b,i=a=e,s=Ne(t.schema.getTextInlineElements(),kt(i)),m=Bt(a).filter(_n),g=Pt(a).filter(_n),Ln(a),l=g,f=u,d=function(e,t,n){var r=e.dom,o=t.dom,i=r.data.length;return zm(r,o,s),n.container()===o?as(r,i):n},((c=m).isSome()&&l.isSome()&&f.isSome()?ve.some(d(c.getOrDie(),l.getOrDie(),f.getOrDie())):ve.none()).orThunk(function(){return s&&(m.each(function(e){return Um(e.dom,e.dom.length)}),g.each(function(e){return Fm(e.dom,0)})),u}));t.dom.isEmpty(t.getBody())?(t.setContent(""),t.selection.setCursorLocation()):y.bind(Xm).fold(function(){r&&Wm(t,n,C)},function(e){r&&Wm(t,n,ve.some(e))})}function Gm(e){return hu(e,"td,th")}function Jm(e,t){return{start:e,end:t}}function Qm(e,t){return br(Nt.fromDom(e),"td,th",t)}function Zm(e){return!je(e.start,e.end)}function eg(e,n){return Al(e.start,n).bind(function(t){return Al(e.end,n).bind(function(e){return je(t,e)?ve.some(t):ve.none()})})}function tg(e){return function(t){return eg(t,e).map(function(e){return{rng:t,table:e,cells:Gm(e)}})}}function ng(e,t,n,r){if(n.collapsed||!e.forall(Zm))return ve.none();if(t.isSameTable){var o=e.bind(tg(r));return ve.some({start:o,end:o})}var i,a,u=Qm(n.startContainer,r),s=Qm(n.endContainer,r),c=u.bind((a=r,function(t){return Al(t,a).bind(function(e){return Z(Gm(e)).map(function(e){return Jm(t,e)})})})).bind(tg(r)),l=s.bind((i=r,function(t){return Al(t,i).bind(function(e){return Q(Gm(e)).map(function(e){return Jm(e,t)})})})).bind(tg(r));return ve.some({start:c,end:l})}function rg(e,t){return z(e,function(e){return je(e,t)})}function og(n){return dn(rg(n.cells,n.rng.start),rg(n.cells,n.rng.end),function(e,t){return n.cells.slice(e,t+1)})}function ig(e,t){var n=t.startTable,r=t.endTable,o=e.cloneRange();return n.each(function(e){return o.setStartAfter(e.dom)}),r.each(function(e){return o.setEndBefore(e.dom)}),o}function ag(e,t){var n,r,o,i,a,u,s,c,l,f,d,m,g,p,h,v,b=(n=e,function(e){return je(n,e)}),y=dn(Qm((r=t).startContainer,o=b),Qm(r.endContainer,o),Jm),C=(l=b,f=x((c=t).startContainer),d=x(c.endContainer),m=f.isSome(),g=d.isSome(),p=dn(f,d,je).getOr(!1),{startTable:f,endTable:d,isStartInTable:m,isEndInTable:g,isSameTable:p,isMultiTable:!p&&m&&g});function x(e){return Al(Nt.fromDom(e),l)}return h=t,v=b,y.exists(function(e){return!Zm(t=e)&&eg(t,v).exists(function(e){var t=e.dom.rows;return 1===t.length&&1===t[0].cells.length})&&Rl(e.start,h);var t})?y.map(function(e){return sp.singleCellTable(t,e.start)}):C.isMultiTable?ng(y,u=C,s=t,b).bind(function(e){var t=e.start,n=e.end,r=t.bind(og).getOr([]),o=n.bind(og).getOr([]);if(0<r.length&&0<o.length){var i=ig(s,u);return ve.some(sp.multiTable(r,o,i))}return ve.none()}):ng(y,i=C,a=t,b).bind(function(e){var t=e.start,n=e.end;return t.or(n)}).bind(function(e){var t=i.isSameTable,n=og(e).getOr([]);if(t&&e.cells.length===n.length)return ve.some(sp.fullTable(e.table));if(0<n.length){if(t)return ve.some(sp.partialTable(n,ve.none()));var r=ig(a,i);return ve.some(sp.partialTable(n,ve.some(_e(_e({},i),{rng:r}))))}return ve.none()})}function ug(e){return Y(e,function(e){yn(e,"contenteditable"),mm(e)}),0}function sg(e,t,n,r){var o=n.cloneRange();r?(o.setStart(n.startContainer,n.startOffset),o.setEndAfter(t.dom.lastChild)):(o.setStartBefore(t.dom.firstChild),o.setEnd(n.endContainer,n.endOffset)),lp(e,o,t,!1)}function cg(e){var t=_l(e),n=Nt.fromDom(e.selection.getNode());Gn(n.dom)&&Wr(n)?e.selection.setCursorLocation(n.dom,0):e.selection.collapse(!0),1<t.length&&F(t,function(e){return je(e,n)})&&pn(n,"data-mce-selected","1")}function lg(s,c,e){var l=s.selection.getRng();return ug(e.bind(function(e){var t,n,r,o=e.rng,i=e.isStartInTable,a=(t=i?o.endContainer:o.startContainer,ve.from(s.dom.getParent(t,s.dom.isBlock)).map(Nt.fromDom));o.deleteContents(),n=s,r=i,a.filter(Wr).each(function(e){r?Ln(e):(mm(e),n.selection.setCursorLocation(e.dom,0))});var u=i?c[0]:c[c.length-1];return sg(s,u,l,i),Wr(u)?ve.none():ve.some(i?c.slice(1):c.slice(0,-1))}).getOr(c)),cg(s),!0}function fg(e,t,n,r){var o=e.selection.getRng(),i=t[0],a=n[n.length-1];sg(e,i,o,!0),sg(e,a,o,!1);var u=Wr(i)?t:t.slice(1),s=Wr(a)?n:n.slice(0,-1);return ug(u.concat(s)),r.deleteContents(),cg(e),!0}function dg(e,t){return Ym(e,!1,t),!0}function mg(e,t){return M(hm(t,e),ho)}function gg(e,t){return(e?Qg:Zg)(t)}function pg(f,d,s){var m=Nt.fromDom(f.getBody());return fp(m,s).fold(function(){return o=f,i=d,a=m,e=s,u=as.fromRangeStart(o.selection.getRng()),mg(a,e).bind(function(e){return Wr(e)?dp(o,e):(t=a,n=e,r=u,Fc(i,o.getBody(),r).bind(function(e){return mg(t,Nt.fromDom(e.getNode())).map(function(e){return!1===je(e,n)})}));var t,n,r}).getOr(!1)||(n=d,r=as.fromRangeStart((t=f).selection.getRng()),gg(n,r)||Gl(n,t.getBody(),r).exists(function(e){return gg(n,e)}));var o,i,a,e,u,t,n,r},function(e){return n=d,r=m,o=e,i=as.fromRangeStart((t=f).selection.getRng()),(Wr(o)?dp(t,o):(u=r,c=o,l=i,Fc(s=n,(a=t).getBody(),l).bind(function(e){return r=s,o=l,i=e,ef((n=c).dom).bind(function(t){return tf(n.dom).map(function(e){return r?o.isEqual(t)&&i.isEqual(e):o.isEqual(e)&&i.isEqual(t)})}).getOr(!0)?dp(a,c):(t=c,fp(u,Nt.fromDom(e.getNode())).map(function(e){return!1===je(e,t)}));var t,n,r,o,i}).or(ve.some(!0)))).getOr(!1);var a,u,s,c,l,t,n,r,o,i})}function hg(e,t){var n,r,o,i,a,u,s,c,l=Nt.fromDom(e.selection.getStart(!0)),f=_l(e);return e.selection.isCollapsed()&&0===f.length?pg(e,t,l):(r=l,o=f,i=Nt.fromDom((n=e).getBody()),a=n.selection.getRng(),0!==o.length?lg(n,o,ve.none()):(u=n,c=a,fp(s=i,r).fold(function(){return t=u,ag(s,c).map(function(e){return e.fold(A(lp,t),A(dg,t),A(lg,t),A(fg,t))});var t},function(e){return dp(u,e)}).getOr(!1)))}function vg(e){return e.collapsed?e:(a=e,u=as.fromRangeStart(a),s=as.fromRangeEnd(a),c=a.commonAncestorContainer,Gl(!1,c,s).map(function(e){return!Ys(u,s,c)&&Ys(u,e,c)?(t=u.container(),n=u.offset(),r=e.container(),o=e.offset(),(i=document.createRange()).setStart(t,n),i.setEnd(r,o),i):a;var t,n,r,o,i}).getOr(a));var a,u,s,c}function bg(e,t){var n,r,o,i,a,u=t.firstChild,s=t.lastChild;return u&&"meta"===u.name&&(u=u.next),r=s=s&&"mce_marker"===s.attr("id")?s.prev:s,o=(n=e).getNonEmptyElements(),r&&(r.isEmpty(o)||(i=r,n.getBlockElements()[i.name]&&i.firstChild&&i.firstChild===i.lastChild&&("br"===(a=i.firstChild).name||a.value===yo)))&&(s=s.prev),u&&u===s&&("ul"===u.name||"ol"===u.name)}function yg(e){return 0<e.length&&(!(r=e[e.length-1]).firstChild||(t=r)&&t.firstChild&&t.firstChild===t.lastChild&&((n=t.firstChild).data===yo||Wn(n)))?e.slice(0,-1):e;var t,n,r}function Cg(e,t){var n=e.getParent(t,e.isBlock);return n&&"LI"===n.nodeName?n:null}function xg(e,t){var n=as.after(e),r=Pc(t).prev(n);return r?r.toRange():null}function wg(e,o,i,t){function n(e){var t=as.fromRangeStart(i),n=Pc(o.getRoot()),r=1===e?n.prev(t):n.next(t);return!r||Cg(o,r.getNode())!==R}var r,a,u,s,c,l,f,d,m,g,p,h,v,b,y,C,x,w,S,E,N,k,_,A=(r=o,c=e.serialize(t),u=(a=r.createFragment(c)).firstChild,s=a.lastChild,u&&"META"===u.nodeName&&u.parentNode.removeChild(u),s&&"mce_marker"===s.id&&s.parentNode.removeChild(s),a),R=Cg(o,i.startContainer),D=yg(U(A.firstChild.childNodes,function(e){return"LI"===e.nodeName})),T=o.getRoot();return n(1)?(S=T,_=(w=R).parentNode,Et.each(D,function(e){_.insertBefore(e,w)}),E=S,N=as.before(w),(k=Pc(E).next(N))?k.toRange():null):n(2)?(l=R,d=T,o.insertAfter((f=D).reverse(),l),xg(f[0],d)):(g=D,p=T,h=m=R,b=(v=i).cloneRange(),y=v.cloneRange(),b.setStartBefore(h),y.setEndAfter(h),C=[b.cloneContents(),y.cloneContents()],(x=m.parentNode).insertBefore(C[0],m),Et.each(g,function(e){x.insertBefore(e,m)}),x.insertBefore(C[1],m),x.removeChild(m),xg(g[g.length-1],p))}function Sg(e,t,n){var r,o,i,a,u=e.selection,s=e.dom;/^ | $/.test(t)&&(r=s,o=u.getRng(),i=t,i=Dm(a=Nt.fromDom(r.getRoot()),as.fromRangeStart(o))?i.replace(/^ /,"&nbsp;"):i.replace(/^&nbsp;/," "),t=i=Tm(a,as.fromRangeEnd(o))?i.replace(/(&nbsp;| )(<br( \/)>)?$/,"&nbsp;"):i.replace(/&nbsp;(<br( \/)?>)?$/," "));var c=e.parser,l=n.merge,f=nm({validate:e.getParam("validate")},e.schema),d='<span id="mce_marker" data-mce-type="bookmark">&#xFEFF;</span>',m=e.fire("BeforeSetContent",{content:t,format:"html",selection:!0,paste:n.paste});if(m.isDefaultPrevented())e.fire("SetContent",{content:m.content,format:"html",selection:!0,paste:n.paste});else{-1===(t=m.content).indexOf("{$caret}")&&(t+="{$caret}"),t=t.replace(/\{\$caret\}/,d);var g,p,h=(g=u.getRng()).startContainer||(g.parentElement?g.parentElement():null),v=e.getBody();h===v&&u.isCollapsed()&&s.isBlock(v.firstChild)&&((p=v.firstChild)&&!e.schema.getShortEndedElements()[p.nodeName])&&s.isEmpty(v.firstChild)&&((g=s.createRng()).setStart(v.firstChild,0),g.setEnd(v.firstChild,0),u.setRng(g)),u.isCollapsed()||function(e){var t=e.dom,n=vg(e.selection.getRng());e.selection.setRng(n);var r,o=t.getParent(n.startContainer,mp),i=n;null!==(r=o)&&r===t.getParent(i.endContainer,mp)&&Rl(Nt.fromDom(r),i)?lp(e,n,Nt.fromDom(o)):e.getDoc().execCommand("Delete",!1,null)}(e);var b,y,C,x,w,S,E,N,k,_,A,R,D,T,O={context:(I=u.getNode()).nodeName.toLowerCase(),data:n.data,insert:!0},B=c.parse(t,O);if(!0===n.paste&&bg(e.schema,B)&&Cg(s,I))return g=wg(f,s,u.getRng(),B),u.setRng(g),void e.fire("SetContent",m);if(function(){for(var e=B;e=e.walk();)1===e.type&&e.attr("data-mce-fragment","1")}(),"mce_marker"===(L=B.lastChild).attr("id"))for(var P=L,L=L.prev;L;L=L.walk(!0))if(3===L.type||!s.isBlock(L.name)){e.schema.isValidChild(L.parent.name,"span")&&L.parent.insert(P,L,"br"===L.name);break}if(e._selectionOverrides.showBlockCaretContainer(I),O.invalid){e.selection.setContent(d);var I=u.getNode(),M=e.getBody();for(9===I.nodeType?I=L=M:L=I;L!==M;)L=(I=L).parentNode;t=I===M?M.innerHTML:s.getOuterHTML(I),t=f.serialize(c.parse(t.replace(/<span (id="mce_marker"|id=mce_marker).+?<\/span>/i,function(){return f.serialize(B)}))),I===M?s.setHTML(M,t):s.setOuterHTML(I,t)}else b=e,y=t=f.serialize(B),"all"===(C=I).getAttribute("data-mce-bogus")?C.parentNode.insertBefore(b.dom.createFragment(y),C):(x=C.firstChild,w=C.lastChild,!x||x===w&&"BR"===x.nodeName?b.dom.setHTML(C,y):b.selection.setContent(y));E=l,_=(S=e).schema.getTextInlineElements(),A=S.dom,E&&(N=S.getBody(),k=em(A),Et.each(A.select("*[data-mce-fragment]"),function(e){if(V(_[e.nodeName.toLowerCase()])&&j(um(A,e),function(e){return!am.has(e)}))for(var t=e.parentNode;V(t)&&t!==N&&!function(r,o,i){function a(e){var t=r.getStyle(o,e),n=r.getStyle(i,e);return Be(t)&&Be(n)&&t!==n}var e=um(r,o),u=um(r,i);return F(e,function(t){function e(e){return F(e,function(e){return e===t})}if(e(u)||!e($g))return a(t);var n=U(u,function(t){return F($g,function(e){return Ge(t,e)})});return F(n,a)})}(A,e,t);t=t.parentNode)if(k.compare(t,e)){A.remove(e,!0);break}})),function(n,e){var t,r=n.dom,o=n.selection;if(e){o.scrollIntoView(e);var i=pf(n.getBody(),e);if("false"===r.getContentEditable(i))return r.remove(e),o.select(i);var a,u=r.createRng(),s=e.previousSibling;jn(s)?(u.setStart(s,s.nodeValue.length),xt.ie||(a=e.nextSibling,jn(a)&&(s.appendData(a.data),a.parentNode.removeChild(a)))):(u.setStartBefore(e),u.setEndBefore(e));var c=r.getParent(e,r.isBlock);r.remove(e),c&&r.isEmpty(c)&&(n.$(c).empty(),u.setStart(c,0),u.setEnd(c,0),mp(c)||c.getAttribute("data-mce-fragment")||!(t=function(e){var t=as.fromRangeStart(e);if(t=Pc(n.getBody()).next(t))return t.toRange()}(u))?r.add(c,r.create("br",{"data-mce-bogus":"1"})):(u=t,r.remove(c))),o.setRng(u)}}(e,s.get("mce_marker")),R=e.getBody(),Et.each(R.getElementsByTagName("*"),function(e){e.removeAttribute("data-mce-fragment")}),D=s,T=u.getStart(),ve.from(D.getParent(T,"td,th")).map(Nt.fromDom).each(gm),e.fire("SetContent",m),e.addVisual()}}function Eg(e){return e instanceof Ud}function Ng(e,t,n){var r;e.dom.setHTML(e.getBody(),t),!0!==n&&vd(r=e)&&ef(r.getBody()).each(function(e){var t=e.getNode(),n=cn(t)?ef(t).getOr(e):e;r.selection.setRng(n.toRange())})}function kg(u,s,e){var t,n=(t=s,_e(_e({format:"html"},e),{set:!0,content:Eg(t)?"":t})),c=e.no_events?n:u.fire("BeforeSetContent",n);return Eg(s)||(s=c.content),ve.from(u.getBody()).fold(J(s),function(e){return Eg(s)?function(e,t,n,r){var o,i,u,a;o=e.parser.getNodeFilters(),i=e.parser.getAttributeFilters(),u=n,a=function(e,n){var t,r,o={},i={},a=[];for(t in u.firstChild&&gp(u.firstChild,function(t){Y(e,function(e){e.name===t.name&&(o[e.name]?o[e.name].nodes.push(t):o[e.name]={filter:e,nodes:[t]})}),Y(n,function(e){"string"==typeof t.attr(e.name)&&(i[e.name]?i[e.name].nodes.push(t):i[e.name]={filter:e,nodes:[t]})})}),o)Ne(o,t)&&a.push(o[t]);for(r in i)Ne(i,r)&&a.push(i[r]);return a}(o,i),Y(a,function(t){Y(t.filter.callbacks,function(e){e(t.nodes,t.filter.name,{})})});var s=nm({validate:e.validate},e.schema).serialize(n);return r.content=vo(Nt.fromDom(t))?s:Et.trim(s),Ng(e,r.content,r.no_selection),r.no_events||e.fire("SetContent",r),n}(u,e,s,c):(t=u,n=e,o=c,0===(r=s).length||/^\s+$/.test(r)?(i='<br data-mce-bogus="1">',"TABLE"===n.nodeName?r="<tr><td>"+i+"</td></tr>":/^(UL|OL)$/.test(n.nodeName)&&(r="<li>"+i+"</li>"),r=(a=Ss(t))&&t.schema.isValidChild(n.nodeName.toLowerCase(),a.toLowerCase())?(r=i,t.dom.createHTML(a,Es(t),r)):r||'<br data-mce-bogus="1">',Ng(t,r,o.no_selection),t.fire("SetContent",o)):("raw"!==o.format&&(r=nm({validate:t.validate},t.schema).serialize(t.parser.parse(r,{isRootContent:!0,insert:!0}))),o.content=vo(Nt.fromDom(n))?r:Et.trim(r),Ng(t,o.content,o.no_selection),o.no_events||t.fire("SetContent",o)),o.content);var t,n,r,o,i,a})}function _g(e){return y(e)?e:R}function Ag(i,e,t){var n=e(i),a=_g(t);return n.orThunk(function(){return a(i)?ve.none():function(e){for(var t=i.dom,n=_g(a);t.parentNode;){var t=t.parentNode,r=Nt.fromDom(t),o=e(r);if(o.isSome())return o;if(n(r))break}return ve.none()}(e)})}function Rg(e,t,n){var r=e.formatter.get(n);if(r)for(var o=0;o<r.length;o++){var i=r[o];if(fl(i)&&!1===i.inherit&&e.dom.is(t,i.selector))return 1}}function Dg(t,e,n,r,o){var i=t.dom.getRoot();return e!==i&&(e=t.dom.getParent(e,function(e){return!!Rg(t,e,n)||e.parentNode===i||!!hp(t,e,n,r,!0)}),!!hp(t,e,n,r,o))}function Tg(e,t,n){return!!pp(t,n.inline)||!!pp(t,n.block)||(n.selector?1===t.nodeType&&e.is(t,n.selector):void 0)}function Og(e,t,n,r,o,i){var a=n[r];if(y(n.onmatch))return n.onmatch(t,n,r);if(a)if(b(a.length)){for(var u in a)if(Ne(a,u)){var s="attributes"===r?e.getAttrib(t,u):al(e,t,u),c=rl(a[u],i),l=K(s)||Pe(s);if(!l||!K(c)){if(o&&l&&!n.exact)return;if((!o||n.exact)&&!pp(s,il(e,c,u)))return}}}else for(var f=0;f<a.length;f++)if("attributes"===r?e.getAttrib(t,a[f]):al(e,t,a[f]))return 1;return 1}function Bg(e,t,n,r,o){if(r)return Dg(e,r,t,n,o);if(r=e.selection.getNode(),Dg(e,r,t,n,o))return!0;var i=e.selection.getStart();return!(i===r||!Dg(e,i,t,n,o))}function Pg(e){return 0<function(e){for(var t=[];e;){if(3===e.nodeType&&e.nodeValue!==vp||1<e.childNodes.length)return[];1===e.nodeType&&t.push(e),e=e.firstChild}return t}(e).length}function Lg(e){if(e){var t=new Rr(e,e);for(e=t.current();e;e=t.next())if(jn(e))return e}return null}function Ig(e){var t=Nt.fromTag("span");return hn(t,{id:bp,"data-mce-bogus":"1","data-mce-type":"format-caret"}),e&&Pn(t,Nt.fromText(vp)),t}function Mg(e,t,n){void 0===n&&(n=!0);var r,o,i,a,u,s,c,l,f=e.dom,d=e.selection;Pg(t)?Ym(e,!1,Nt.fromDom(t),n):(r=d.getRng(),o=f.getParent(t,f.isBlock),i=r.startContainer,a=r.startOffset,u=r.endContainer,s=r.endOffset,(l=Lg(t))&&l.nodeValue.charAt(0)===vp&&l.deleteData(0,1),c=l,f.remove(t,!0),i===c&&0<a&&r.setStart(c,a-1),u===c&&0<s&&r.setEnd(c,s-1),o&&f.isEmpty(o)&&mm(Nt.fromDom(o)),d.setRng(r))}function Fg(e,t,n){void 0===n&&(n=!0);var r=e.dom,o=e.selection;if(t)Mg(e,t,n);else if(!(t=Hc(e.getBody(),o.getStart())))for(;t=r.get(bp);)Mg(e,t,!1)}function Ug(e,t){return e.appendChild(t),t}function zg(e,t){var n=P(e,function(e,t){return Ug(e,t.cloneNode(!1))},t);return Ug(n,n.ownerDocument.createTextNode(vp))}function Hg(o,e,t,i,n,r){var a,u,s=o.formatter,c=o.dom,l=U(we(s.get()),function(e){return e!==i&&!Te(e,"removeformat")});if(0<U((a=o,u=t,L(l,function(e,t){var n=cl(a,t);return a.formatter.matchNode(u,t,{},n)?e.concat([t]):e},[])),function(e){return n=i,r=["inline","block","selector","attributes","styles","classes"],!F((t=o).formatter.get(e),function(e){var i=a(e);return F(t.formatter.get(n),function(e){var t,n=a(e),r=i,o=n;return d(t=void 0===t?p:t).eq(r,o)})});function a(e){return ae(e,function(e,t){return F(r,function(e){return e===t})})}var t,n,r}).length){var f=t.cloneNode(!1);return c.add(e,f),s.remove(i,n,f,r),c.remove(f),ve.some(f)}return ve.none()}function jg(e,t,n,r){var o,i,a,u,s,c,l,f,d,m,g,p,h,v,b,y=e.dom,C=e.selection,x=[],w=C.getRng(),S=w.startContainer,E=w.startOffset,N=S;for(3===S.nodeType&&(E!==S.nodeValue.length&&(o=!0),N=N.parentNode);N;){if(hp(e,N,t,n,r)){i=N;break}N.nextSibling&&(o=!0),x.push(N),N=N.parentNode}i&&(o?(a=C.getBookmark(),w.collapse(!0),u=Tf(Sl(e,w,e.formatter.get(t),!0)),e.formatter.remove(t,n,u,r),C.moveToBookmark(a)):(s=Hc(e.getBody(),i),d=c=Ig(!1).dom,(p=(g=e.dom).getParent(m=null!==s?s:i,A(tl,e)))&&g.isEmpty(p)?m.parentNode.replaceChild(d,m):(h=Nt.fromDom(m),v=hu(h,"br"),b=U(function(){for(var e=[],t=h.dom;t;)e.push(Nt.fromDom(t)),t=t.lastChild;return e}().slice(-1),Br),v.length===b.length&&Y(b,Ln),g.isEmpty(m)?m.parentNode.replaceChild(d,m):g.insertAfter(d,m)),l=Hg(e,c,i,t,n,r),f=zg(x.concat(l.toArray()),c),Mg(e,s,!1),C.setCursorLocation(f,1),y.isEmpty(i)&&y.remove(i)))}function Vg(e,t){var n=e.schema.getTextInlineElements();return Ne(n,kt(t))&&!zc(t.dom)&&!sn(t.dom)}Y(["margin","margin-left","margin-right","margin-top","margin-bottom","padding","padding-left","padding-right","padding-top","padding-bottom","border","border-width","border-style","border-color","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","float","position","left","right","top","bottom","z-index","display","transform","width","max-width","min-width","height","max-height","min-height","overflow","overflow-x","overflow-y","text-overflow","vertical-align","transition","transition-delay","transition-duration","transition-property","transition-timing-function"],function(e){am.add(e)});var qg,$g=["font","text-decoration","text-emphasis"],Wg=A(sm,!0,Gc),Kg=A(sm,!1,Gc),Xg=lm(!0,fm),Yg=lm(!1,fm),Gg=lm(!0,Jn),Jg=lm(!1,Jn),Qg=lm(!0,cn),Zg=lm(!1,cn),ep=lm(!0,dm),tp=lm(!1,dm),np=A(Cm,!1),rp=A(Cm,!0),op=A(ym,!1),ip=A(ym,!0),ap=A(wm,!1),up=A(wm,!0),sp=or([{singleCellTable:["rng","cell"]},{fullTable:["table"]},{partialTable:["cells","outsideDetails"]},{multiTable:["startTableCells","endTableCells","betweenRng"]}]),cp=function(e){var t;return(8===_t(t=e)||"#comment"===kt(t)?Bt:Ut)(e).bind(cp).orThunk(function(){return ve.some(e)})},lp=function(e,t,n,r){void 0===r&&(r=!0),t.deleteContents();var o,i=cp(n).getOr(n),a=Nt.fromDom(e.dom.getParent(i.dom,e.dom.isBlock));return Wr(a)&&(mm(a),r&&e.selection.setCursorLocation(a.dom,0)),je(n,a)||Y((fn(Ot(a),n)?[]:Ot(o=a).map(Dn).map(function(e){return U(e,function(e){return!je(o,e)})}).getOr([])).concat(Dn(n)),function(e){je(e,a)||Ve(e,a)||!Wr(e)||Ln(e)}),!0},fp=function(e,t){return M(hm(t,e),function(e){return kn(e)&&"caption"===kt(e)})},dp=function(e,t){return mm(t),e.selection.setCursorLocation(t.dom,0),ve.some(!0)},mp=Gn,gp=function(e,t){t(e),e.firstChild&&gp(e.firstChild,t),e.next&&gp(e.next,t)},pp=ol,hp=function(e,t,n,r,o){var i=e.formatter.get(n),a=e.dom;if(i&&t)for(var u=0;u<i.length;u++){var s=i[u];if(Tg(e.dom,t,s)&&Og(a,t,s,"attributes",o,r)&&Og(a,t,s,"styles",o,r)){var c=s.classes;if(c)for(var l=0;l<c.length;l++)if(!e.dom.hasClass(t,rl(c[l],r)))return;return s}}},vp=Co,bp="_mce_caret",yp={},Cp=fe,xp=ce;function wp(e){return zn(e)&&!Yc(e)&&!zc(e)&&!sn(e)}function Sp(e,t){for(var n=e;n;n=n[t]){if(jn(n)&&Be(n.data))return e;if(zn(n)&&!Yc(n))return n}return e}function Ep(e,t,n){var r=em(e);if(t&&n&&(t=Sp(t,"previousSibling"),n=Sp(n,"nextSibling"),r.compare(t,n))){for(var o=t.nextSibling;o&&o!==n;){var i=o,o=o.nextSibling;t.appendChild(i)}return e.remove(n),Et.each(Et.grep(n.childNodes),function(e){t.appendChild(e)}),t}return n}function Np(e,t,n,r){var o;r&&!1!==t.merge_siblings&&(o=Ep(e,el(r),r),Ep(e,o,el(o,!0)))}function kp(t,n){return function(e){return!(!e||!al(t,e,n))}}function _p(r,o,i){return function(e){var t,n;r.setStyle(e,o,i),""===e.getAttribute("style")&&e.removeAttribute("style"),t=r,"SPAN"===(n=e).nodeName&&0===t.getAttribs(n).length&&t.remove(n,!0)}}function Ap(e,t,n){return e.isChildOf(t,n)&&t!==n&&!e.isBlock(n)}function Rp(e,t,n){var r,o=t[n?"startContainer":"endContainer"],i=t[n?"startOffset":"endOffset"];return zn(o)&&(r=o.childNodes.length-1,!n&&i&&i--,o=o.childNodes[r<i?r:i]),jn(o)&&n&&i>=o.nodeValue.length&&(o=new Rr(o,e.getBody()).next()||o),jn(o)&&!n&&0===i&&new Rr(o,e.getBody()).prev()||o}function Dp(e,t){var n=t?"firstChild":"lastChild";if(/^(TR|TH|TD)$/.test(e.nodeName)&&e[n]){var r=e[n];return"TR"===e.nodeName&&r[n]||r}return e}function Tp(e,t,n,r){var o=e.create(n,r);return t.parentNode.insertBefore(o,t),o.appendChild(t),o}function Op(e,t,n,r,o){var i=Nt.fromDom(t),a=Nt.fromDom(e.create(r,o));return Kt(a,(n?It:Lt)(i)),n?(qt(i,a),Wt(a,i)):($t(i,a),Pn(a,i)),a.dom}function Bp(e,t,n,r){var o=el(t,n,r);return K(o)||"BR"===o.nodeName||e.isBlock(o)}function Pp(e,r,o,t,i){var n,a,u=e.dom,s=u,c=t;if(!(dl(a=r)&&kh(c,a.inline)||ll(a)&&kh(c,a.block)||fl(a)&&(zn(c)&&s.is(c,a.selector))||r.links&&"A"===t.nodeName))return Sh.keep();var l,f,d,m,g,p,h,v,b=t;if(dl(r)&&"all"===r.remove&&S(r.preserve_attributes)){var y=U(u.getAttribs(b),function(e){return D(r.preserve_attributes,e.name.toLowerCase())});if(u.removeAllAttribs(b),Y(y,function(e){return u.setAttrib(b,e.name,e.value)}),0<y.length)return Sh.rename("span")}if("all"!==r.remove){Nh(r.styles,function(e,t){e=il(u,rl(e,o),t+""),E(t)&&(t=e,i=null),!r.remove_similar&&i&&!kh(al(u,i,t),e)||u.setStyle(b,t,""),n=!0}),n&&""===u.getAttrib(b,"style")&&(b.removeAttribute("style"),b.removeAttribute("data-mce-style")),Nh(r.attributes,function(e,t){var n;if(e=rl(e,o),E(t)&&(t=e,i=null),r.remove_similar||!i||kh(u.getAttrib(i,t),e))if("class"===t&&(e=u.getAttrib(b,t))&&(n="",Y(e.split(/\s+/),function(e){/mce\-\w+/.test(e)&&(n+=(n?" ":"")+e)}),n))u.setAttrib(b,t,n);else{if(Eh.test(t)&&b.removeAttribute("data-mce-"+t),"style"===t&&on(["li"])(b)&&"none"===u.getStyle(b,"list-style-type"))return b.removeAttribute(t),void u.setStyle(b,"list-style-type","none");"class"===t&&b.removeAttribute("className"),b.removeAttribute(t)}}),Nh(r.classes,function(e){e=rl(e,o),i&&!u.hasClass(i,e)||u.removeClass(b,e)});for(var C=u.getAttribs(b),x=0;x<C.length;x++){var w=C[x].nodeName;if(0!==w.indexOf("_")&&0!==w.indexOf("data-"))return Sh.keep()}}return"none"!==r.remove?(l=e,d=r,p=(f=b).parentNode,h=l.dom,v=Ss(l),ll(d)&&(v?p===h.getRoot()&&(d.list_block&&kh(f,d.list_block)||Y(xe(f.childNodes),function(e){nl(l,v,e.nodeName.toLowerCase())?m?m.appendChild(e):(m=Tp(h,e,v),h.setAttribs(m,l.settings.forced_root_block_attrs)):m=null})):h.isBlock(f)&&!h.isBlock(p)&&(Bp(h,f,!1)||Bp(h,f.firstChild,!0,!0)||f.insertBefore(h.create("br"),f.firstChild),Bp(h,f,!0)||Bp(h,f.lastChild,!1,!0)||f.appendChild(h.create("br")))),fl(g=d)&&dl(g)&&fn(ue(g,"mixed"),!0)&&!kh(d.inline,f)||h.remove(f,!0),Sh.removed()):Sh.keep()}function Lp(t,e,n,r,o){return Pp(t,e,n,r,o).fold(R,function(e){return t.dom.rename(r,e),!0},w)}function Ip(u,s,c,e,l){function a(e){var n,r,o,i,a,t=(r=s,o=c,i=l,Y(sl((n=u).dom,e.parentNode).reverse(),function(e){var t;a||"_start"===e.id||"_end"===e.id||(t=hp(n,e,r,o,i))&&!1!==t.split&&(a=e)}),a);return function(e,t,n,r,o,i,a,u){var s,c,l=e.dom;if(n){for(var f=n.parentNode,d=r.parentNode;d&&d!==f;d=d.parentNode){for(var m=l.clone(d,!1),g=0;g<t.length&&null!==(m=function(t,e,n){return Pp(t,e,u,n,n).fold(J(n),function(e){return t.dom.createFragment().appendChild(n),t.dom.rename(n,e)},J(null))}(e,t[g],m));g++);m&&(s&&m.appendChild(s),c=c||m,s=m)}!i||a.mixed&&l.isBlock(n)||(r=l.split(n,r)),s&&(o.parentNode.insertBefore(s,o),c.appendChild(o),dl(a)&&Np(l,a,0,s))}return r}(u,m,t,e,e,!0,g,c)}function f(t){return F(m,function(e){return Lp(u,e,c,t,t)})}function d(e){var t,n=h.get(e?"_start":"_end"),r=n[e?"firstChild":"lastChild"];return Yc(t=r)&&zn(t)&&("_start"===t.id||"_end"===t.id)&&(r=r[e?"firstChild":"lastChild"]),jn(r)&&0===r.data.length&&(r=e?n.previousSibling||n.nextSibling:n.nextSibling||n.previousSibling),h.remove(n,!0),r}function t(e){var t=Sl(u,e,m,e.collapsed);if(g.split){if(t=Tf(t),(r=Rp(u,t,!0))!==(o=Rp(u,t))){if(r=Dp(r,!0),o=Dp(o,!1),Ap(h,r,o)){var n=ve.from(r.firstChild).getOr(r);return a(Op(h,n,!0,"span",{id:"_start","data-mce-type":"bookmark"})),void d(!0)}if(Ap(h,o,r))return n=ve.from(o.lastChild).getOr(o),a(Op(h,n,!1,"span",{id:"_end","data-mce-type":"bookmark"})),void d(!1);var r=Tp(h,r,"span",{id:"_start","data-mce-type":"bookmark"}),o=Tp(h,o,"span",{id:"_end","data-mce-type":"bookmark"}),i=h.createRng();i.setStartAfter(r),i.setEndBefore(o),El(h,i,function(e){Y(e,function(e){Yc(e)||Yc(e.parentNode)||a(e)})}),a(r),a(o),r=d(!0),o=d()}else r=o=a(r);t.startContainer=r.parentNode||r,t.startOffset=h.nodeIndex(r),t.endContainer=o.parentNode||o,t.endOffset=h.nodeIndex(o)+1}El(h,t,function(e){Y(e,v)})}var n,m=u.formatter.get(s),g=m[0],p=!0,h=u.dom,r=u.selection,v=function(t){var e=!0,n=!1;zn(t)&&h.getContentEditable(t)&&(e=p,p="true"===h.getContentEditable(t),n=!0);var r,o,i=xe(t.childNodes);if(p&&!n&&(r=f(t),o=t.parentNode,!r&&V(o)&&ml(g)&&f(o)),g.deep&&i.length){for(var a=0;a<i.length;a++)v(i[a]);n&&(p=e)}Y(["underline","line-through","overline"],function(e){zn(t)&&u.dom.getStyle(t,"text-decoration")===e&&t.parentNode&&ul(h,t.parentNode)===e&&Lp(u,{deep:!1,exact:!0,inline:"span",styles:{textDecoration:e}},null,t)})};if(e)return Qc(e)?((n=h.createRng()).setStartBefore(e),n.setEndAfter(e),t(n)):t(e),void yf(u,s,e,c);if("false"!==h.getContentEditable(r.getNode()))r.isCollapsed()&&dl(g)&&!_l(u).length?jg(u,s,c,l):(Bl(r,!0,function(){Ol(u,t)}),dl(g)&&Bg(u,s,c,r.getStart())&&Zc(h,r,r.getRng()),u.nodeChanged()),yf(u,s,e,c);else{e=r.getNode();for(var o=0;o<m.length&&(!m[o].ceFalseOverride||!Lp(u,m[o],c,e,e));o++);yf(u,s,e,c)}}function Mp(e){return zn(e)&&!Yc(e)&&!zc(e)&&!sn(e)}function Fp(e){return Ne(e,"vars")}function Up(n,e,r,o,i){return I(e,function(e){var t=n.formatter.matchNode(e,r,null!=i?i:{},o);return!b(t)},function(e){return Rg(n,e,r)||!o&&V(n.formatter.matchNode(e,r,i,!0))})}function zp(e,t){var n=null!=t?t:Dh(e);return U(sl(e.dom,n),function(e){return zn(e)&&!sn(e)})}function Hp(e,o,i,a,t,n){var r,u,s,c,l,f,d,m,g;return null===o.get()&&(u=e,(r=o).set({}),u.on("NodeChange",function(e){Th(u,e.element,r.get())}),u.on("FormatApply FormatRemove",function(e){var t=ve.from(e.node).map(function(e){return Qc(e)?e:e.startContainer}).bind(function(e){return zn(e)?ve.some(e):ve.from(e.parentElement)}).getOrThunk(function(){return Dh(u)});Th(u,t,r.get())})),s=e,l=i,f=a,d=t,m=n,g=(c=o).get(),Y(l.split(","),function(t){function e(){var e=zp(s);return Up(s,e,t,d,m).isSome()}var n,r=ue(g,t).getOrThunk(function(){var e={withSimilar:{state:ru(!1),similar:!0,callbacks:[]},withoutSimilar:{state:ru(!1),similar:!1,callbacks:[]},withVars:[]};return g[t]=e});b(m)?((n=d?r.withSimilar:r.withoutSimilar).callbacks.push(f),1===n.callbacks.length&&n.state.set(e())):r.withVars.push({state:ru(e()),similar:d,vars:m,callback:f})}),c.set(g),{unbind:function(){var e,t=i,n=a,r=(e=o).get();Y(t.split(","),function(t){return ue(r,t).each(function(e){r[t]={withSimilar:_e(_e({},e.withSimilar),{callbacks:U(e.withSimilar.callbacks,function(e){return e!==n})}),withoutSimilar:_e(_e({},e.withoutSimilar),{callbacks:U(e.withoutSimilar.callbacks,function(e){return e!==n})}),withVars:U(e.withVars,function(e){return e.callback!==n})}})}),e.set(r)}}}function jp(e,t){var n=(t||document).createDocumentFragment();return Y(e,function(e){n.appendChild(e.dom)}),Nt.fromDom(n)}function Vp(e,t,n){return{element:e,width:t,rows:n}}function qp(e,t){return{element:e,cells:t}}function $p(e,t){var n=parseInt(vn(e,t),10);return isNaN(n)?1:n}function Wp(e){return L(e,function(e,t){return t.cells.length>e?t.cells.length:e},0)}function Kp(e,t){for(var n=e.rows,r=0;r<n.length;r++)for(var o=n[r].cells,i=0;i<o.length;i++)if(je(o[i],t))return ve.some({x:i,y:r});return ve.none()}function Xp(e,t,n,r,o){for(var i=[],a=e.rows,u=n;u<=o;u++){var s=a[u].cells,c=t<r?s.slice(t,r+1):s.slice(r,t+1);i.push(qp(a[u].element,c))}return i}function Yp(e){var o=Vp(wu(e),0,[]);return Y(hu(e,"tr"),function(n,r){Y(hu(n,"td,th"),function(e,t){!function(e,t,n,r,o){for(var i=$p(o,"rowspan"),a=$p(o,"colspan"),u=e.rows,s=n;s<n+i;s++){u[s]||(u[s]=qp(Su(r),[]));for(var c=t;c<t+a;c++)u[s].cells[c]=s===n&&c===t?o:wu(o)}}(o,function(e,t,n){for(;r=t,((o=e.rows)[n]?o[n].cells:[])[r];)t++;var r,o;return t}(o,t,r),r,n,e)})}),Vp(o.element,Wp(o.rows),o.rows)}function Gp(e,t){var n,r,o,i=Nt.fromDom(t.commonAncestorContainer),a=hm(i,e),u=U(a,function(e){return Or(e)||co(e)}),s=(o=t,M(r=a,function(e){return"li"===kt(e)&&Rl(e,o)}).fold(J([]),function(e){return M(r,function(e){return"ul"===kt(e)||"ol"===kt(e)}).map(function(e){var t=Nt.fromTag(kt(e));return Cn(t,ae(Sn(e),function(e,t){return Ge(t,"list-style")})),[Nt.fromTag("li"),t]}).getOr([])}));return T(u.concat(s.length?s:go(n=i)?Ot(n).filter(mo).fold(J([]),function(e){return[n,e]}):mo(n)?[n]:[]),wu)}function Jp(){return jp([])}function Qp(e,i){return hr(i[0],"table",A(je,e)).bind(function(e){var s,t,n=i[0],r=i[i.length-1],o=Yp(e);return t=r,Kp(s=o,n).bind(function(u){return Kp(s,t).map(function(e){return t=s,n=u.x,r=u.y,o=e.x,a=r<(i=e.y)?Xp(t,n,r,o,i):Xp(t,n,i,o,r),Vp(t.element,Wp(a),a);var t,n,r,o,i,a})}).map(function(e){return jp([(n=T((t=e).rows,function(e){var t=T(e.cells,function(e){var t=Su(e);return yn(t,"colspan"),yn(t,"rowspan"),t}),n=wu(e.element);return Kt(n,t),n}),r=wu(t.element),Kt(o=Nt.fromTag("tbody"),n),Pn(r,o),r)]);var t,n,r,o})}).getOrThunk(Jp)}function Zp(e,t){var n,r,o,i,a,u,s,c=kl(t,e);return 0<c.length?Qp(e,c):(n=e,0<(r=t).length&&r[0].collapsed?Jp():(o=n,i=r[0],a=Nt.fromDom(i.cloneContents()),s=L(u=Gp(o,i),function(e,t){return Pn(t,e),t},a),0<u.length?jp([s]):s))}function eh(e,t){return 0<=t&&t<e.length&&Gc(e.charAt(t))}function th(e,t){var n=wo(e.innerText);return t?n.replace(/^[ \f\n\r\t\v]+/,""):n}function nh(e){return zn(e)?e.outerHTML:jn(e)?Go.encodeRaw(e.data,!1):Vn(e)?"\x3c!--"+e.data+"--\x3e":""}function rh(e,c){var l=0;Y(e,function(e){var t,n,r,o,i,a,u,s;0===e[0]?l++:1===e[0]?(o=c,i=e[1],a=l,s=function(e){var t,n=document.createElement("div"),r=document.createDocumentFragment();for(e&&(n.innerHTML=e);t=n.firstChild;)r.appendChild(t);return r}(i),o.hasChildNodes()&&a<o.childNodes.length?(u=o.childNodes[a]).parentNode.insertBefore(s,u):o.appendChild(s),l++):2===e[0]&&(n=l,(t=c).hasChildNodes()&&n<t.childNodes.length&&(r=t.childNodes[n]).parentNode.removeChild(r))})}function oh(n){var e,t=H((e=n.getBody(),U(T(xe(e.childNodes),nh),function(e){return 0<e.length})),function(e){var t=Zd(n.serializer,e);return 0<t.length?[t]:[]}),r=t.join("");return-1!==r.indexOf("</iframe>")?{type:"fragmented",fragments:t,content:"",bookmark:null,beforeBookmark:null}:{type:"complete",fragments:null,content:r,bookmark:null,beforeBookmark:null}}function ih(e,t,n){var r,o,i,g,p,a,h,v,c,l,u,s=n?t.beforeBookmark:t.bookmark;function b(e,t,n,r){for(var o=e;o-t<r&&o<n&&g[o]===p[o-t];)++o;return{start:e,end:o,diag:t}}"fragmented"===t.type?(r=t.fragments,o=e.getBody(),i=T(xe(o.childNodes),nh),rh((p=r,a=(g=i).length+p.length+2,h=new Array(a),v=new Array(a),c=function(e,t,n,r,o){var i=l(e,t,n,r);if(null===i||i.start===t&&i.diag===t-r||i.end===e&&i.diag===e-n)for(var a=e,u=n;a<t||u<r;)a<t&&u<r&&g[a]===p[u]?(o.push([0,g[a]]),++a,++u):r-n<t-e?(o.push([2,g[a]]),++a):(o.push([1,p[u]]),++u);else{c(e,i.start,n,i.start-i.diag,o);for(var s=i.start;s<i.end;++s)o.push([0,g[s]]);c(i.end,t,i.end-i.diag,r,o)}},l=function(e,t,n,r){var o=t-e,i=r-n;if(0==o||0==i)return null;var a,u,s,c,l,f=o-i,d=i+o,m=(d%2==0?d:1+d)/2;for(h[1+m]=e,v[1+m]=t+1,a=0;a<=m;++a){for(u=-a;u<=a;u+=2){for(s=u+m,u===-a||u!==a&&h[s-1]<h[s+1]?h[s]=h[s+1]:h[s]=h[s-1]+1,l=(c=h[s])-e+n-u;c<t&&l<r&&g[c]===p[l];)h[s]=++c,++l;if(f%2!=0&&f-a<=u&&u<=f+a&&v[s-f]<=h[s])return b(v[s-f],u+e-n,t,r)}for(u=f-a;u<=f+a;u+=2){for(s=u+m-f,u===f-a||u!==f+a&&v[s+1]<=v[s-1]?v[s]=v[s+1]-1:v[s]=v[s-1],l=(c=v[s]-1)-e+n-u;e<=c&&n<=l&&g[c]===p[l];)v[s]=c--,l--;if(f%2==0&&-a<=u&&u<=a&&v[s]<=h[s+f])return b(v[s],u+e-n,t,r)}}},u=[],c(0,g.length,0,p.length,u),u),o)):e.setContent(t.content,{format:"raw",no_selection:!V(s)||!jc(s)||!s.isFakeCaret}),e.selection.moveToBookmark(s)}function ah(e){return"fragmented"===e.type?e.fragments.join(""):e.content}function uh(e){var t=Nt.fromTag("body",Oh());return Cu(t,ah(e)),Y(hu(t,"*[data-mce-bogus]"),Yt),t.dom.innerHTML}function sh(e,t){return!(!e||!t)&&(r=t,ah(e)===ah(r)||(n=t,uh(e)===uh(n)));var n,r}function ch(e){return 0===e.get()}function lh(e,t,n){ch(n)&&(e.typing=t)}function fh(e,t){e.typing&&(lh(e,!1,t),e.add())}function dh(c){return{undoManager:{beforeChange:function(e,t){var n=c,r=t;ch(e)&&r.set(mc(n.selection))},add:function(e,t,n,r,o,i){return function(e,t,n,r,o,i,a){var u=oh(e);if(i=Et.extend(i=i||{},u),!1===ch(r)||e.removed)return null;var s=t.data[n.get()];if(e.fire("BeforeAddUndo",{level:i,lastLevel:s,originalEvent:a}).isDefaultPrevented())return null;if(s&&sh(s,i))return null;t.data[n.get()]&&o.get().each(function(e){t.data[n.get()].beforeBookmark=e});var c=e.getParam("custom_undo_redo_levels",0,"number");if(c&&t.data.length>c){for(var l=0;l<t.data.length-1;l++)t.data[l]=t.data[l+1];t.data.length--,n.set(t.data.length)}i.bookmark=mc(e.selection),n.get()<t.data.length-1&&(t.data.length=n.get()+1),t.data.push(i),n.set(t.data.length-1);var f={level:i,lastLevel:s,originalEvent:a};return 0<n.get()?(e.setDirty(!0),e.fire("AddUndo",f),e.fire("change",f)):e.fire("AddUndo",f),i}(c,e,t,n,r,o,i)},undo:function(e,t,n){return r=c,i=t,a=n,(o=e).typing&&(o.add(),o.typing=!1,lh(o,!1,i)),0<a.get()&&(a.set(a.get()-1),ih(r,u=o.data[a.get()],!0),r.setDirty(!0),r.fire("Undo",{level:u})),u;var r,o,i,a,u},redo:function(e,t){return n=c,o=t,(r=e).get()<o.length-1&&(r.set(r.get()+1),ih(n,i=o[r.get()],!1),n.setDirty(!0),n.fire("Redo",{level:i})),i;var n,r,o,i},clear:function(e,t){var n,r=c,o=t;(n=e).data=[],o.set(0),n.typing=!1,r.fire("ClearUndos")},reset:function(e){var t;(t=e).clear(),t.add()},hasUndo:function(e,t){return n=c,r=e,0<t.get()||r.typing&&r.data[0]&&!sh(oh(n),r.data[0]);var n,r},hasRedo:function(e,t){return n=e,t.get()<n.data.length-1&&!n.typing;var n},transact:function(e,t,n){return o=n,fh(r=e,t),r.beforeChange(),r.ignore(o),r.add();var r,o},ignore:function(e,t){try{e.set(e.get()+1),t()}finally{e.set(e.get()-1)}},extra:function(e,t,n,r){var o,i,a=c,u=t,s=r;(o=e).transact(n)&&(i=o.data[u.get()].bookmark,ih(a,o.data[u.get()-1],!0),o.transact(s)&&(o.data[u.get()-1].beforeBookmark=i))}},formatter:{match:function(e,t,n,r){return Bg(c,e,t,n,r)},matchAll:function(e,t){return o=e,i=t,a=[],u={},n=(r=c).selection.getStart(),r.dom.getParent(n,function(e){for(var t=0;t<o.length;t++){var n=o[t];!u[n]&&hp(r,e,n,i)&&(u[n]=!0,a.push(n))}},r.dom.getRoot()),a;var r,o,i,a,u,n},matchNode:function(e,t,n,r){return hp(c,e,t,n,r)},canApply:function(u){return function(e){var t=e.formatter.get(u),n=e.dom;if(t)for(var r=sl(n,e.selection.getStart()),o=t.length-1;0<=o;o--){var i=t[o];if(!fl(i)||V(i.defaultBlock))return!0;for(var a=r.length-1;0<=a;a--)if(n.is(r[a],i.selector))return!0}return!1}(c)},closest:function(e){return r=c,o=e,ve.from(r.selection.getStart(!0)).bind(function(e){return Ag(Nt.fromDom(e),function(n){return ee(o,function(e){return hp(r,n.dom,t=e)?ve.some(t):ve.none();var t})},t)}).getOrNull();function t(e){return je(e,Nt.fromDom(r.getBody()))}var r,o},apply:function(e,t,n){return Rh(c,e,t,n)},remove:function(e,t,n,r){return Ip(c,e,t,n,r)},toggle:function(e,t,n){var r,o=e,i=t,a=n,u=(r=c).formatter.get(o);(!Bg(r,o,i,a)||"toggle"in u[0]&&!u[0].toggle?Rh:Ip)(r,o,i,a)},formatChanged:function(e,t,n,r,o){return Hp(c,e,t,n,r,o)}},editor:{getContent:function(e,t){return d=c,m=e,g=t,ve.from(d.getBody()).fold(J("tree"===m.format?new Ud("body",11):""),function(e){return t=d,r=e,o=g,c=_e(_e({},n=m),{format:o,get:!0,getInner:!0}),l=n.no_events?c:t.fire("BeforeGetContent",c),f="raw"===l.format?Et.trim(rm(t.serializer,r.innerHTML)):"text"===l.format?t.dom.isEmpty(r)?"":wo(r.innerText||r.textContent):"tree"===l.format?t.serializer.serialize(r,l):(a=(i=t).serializer.serialize(r,l),u=Ss(i),s=new RegExp("^(<"+u+"[^>]*>(&nbsp;|&#160;|\\s|\xa0|<br \\/>|)<\\/"+u+">[\r\n]*|<br \\/>[\r\n]*)$"),a.replace(s,"")),D(["text","tree"],l.format)||vo(Nt.fromDom(r))?l.content=f:l.content=Et.trim(f),(l.no_events?l:t.fire("GetContent",l)).content;var t,n,r,o,i,a,u,s,c,l,f});var d,m,g},setContent:function(e,t){return kg(c,e,t)},insertContent:function(e,t){return Sg(c,e,t)},addVisual:function(e){var i,t=e,a=(i=c).dom,n=V(t)?t:i.getBody();b(i.hasVisual)&&(i.hasVisual=i.getParam("visual",!0,"boolean")),Y(a.select("table,a",n),function(e){switch(e.nodeName){case"TABLE":var t=i.getParam("visual_table_class","mce-item-table","string"),n=a.getAttrib(e,"border");n&&"0"!==n||!i.hasVisual?a.removeClass(e,t):a.addClass(e,t);break;case"A":var r,o;a.getAttrib(e,"href")||(r=a.getAttrib(e,"name")||e.id,o=i.getParam("visual_anchor_class","mce-item-anchor","string"),r&&i.hasVisual?a.addClass(e,o):a.removeClass(e,o))}}),i.fire("VisualAid",{element:t,hasVisual:i.hasVisual})}},selection:{getContent:function(e,t){return function(e,t,n){var r,o=(r=t,_e(_e({},n=void 0===n?{}:n),{format:r,get:!0,selection:!0})),i=e.fire("BeforeGetContent",o);if(i.isDefaultPrevented())return e.fire("GetContent",i),i.content;if("text"===i.format)return m=e,ve.from(m.selection.getRng()).map(function(e){var t=ve.from(m.dom.getParent(e.commonAncestorContainer,m.dom.isBlock)),n=m.getBody(),r=t.map(function(e){return e.nodeName}).getOr("div").toLowerCase(),o=xt.browser.isIE()&&"pre"!==r,i=m.dom.add(n,r,{"data-mce-bogus":"all",style:"overflow: hidden; opacity: 0;"},e.cloneContents()),a=th(i,o),u=wo(i.textContent);if(m.dom.remove(i),eh(u,0)||eh(u,u.length-1)){var s=th(t.getOr(n),o),c=s.indexOf(a);return-1===c?a:(eh(s,c-1)?" ":"")+a+(eh(s,c+a.length)?" ":"")}return a}).getOr("");i.getInner=!0;var a,u,s,c,l,f,d,m,g=(u=i,s=(a=e).selection.getRng(),c=a.dom.create("body"),l=a.selection.getSel(),f=wd(a,Nl(l)),(d=u.contextual?Zp(Nt.fromDom(a.getBody()),f).dom:s.cloneContents())&&c.appendChild(d),a.selection.serializer.serialize(c,u));return"tree"===i.format?g:(i.content=e.selection.isCollapsed()?"":g,e.fire("GetContent",i),i.content)}(c,e,t)}},raw:{getModel:function(){return ve.none()}}}}function mh(e){return Ne(e.plugins,"rtc")}function gh(e){var u=e;return ue(e.plugins,"rtc").bind(function(e){return ve.from(e.setup)}).fold(function(){return u.rtcInstance=dh(e),ve.none()},function(e){var t,n;return u.rtcInstance=(t=J(null),n=J(""),{undoManager:{beforeChange:te,add:t,undo:t,redo:t,clear:te,reset:te,hasUndo:R,hasRedo:R,transact:t,ignore:te,extra:te},formatter:{match:R,matchAll:J([]),matchNode:J(void 0),canApply:R,closest:n,apply:te,remove:te,toggle:te,formatChanged:J({unbind:te})},editor:{getContent:n,setContent:n,insertContent:te,addVisual:te},selection:{getContent:n},raw:{getModel:J(ve.none())}}),ve.some(function(){return e().then(function(e){return u.rtcInstance=(i=e.undoManager,a=e.formatter,n=e.editor,r=e.selection,t=e.raw,{undoManager:{beforeChange:i.beforeChange,add:i.add,undo:i.undo,redo:i.redo,clear:i.clear,reset:i.reset,hasUndo:i.hasUndo,hasRedo:i.hasRedo,transact:function(e,t,n){return i.transact(n)},ignore:function(e,t){return i.ignore(t)},extra:function(e,t,n,r){return i.extra(n,r)}},formatter:{match:function(e,t,n,r){return a.match(e,o(t),r)},matchAll:a.matchAll,matchNode:a.matchNode,canApply:function(e){return a.canApply(e)},closest:function(e){return a.closest(e)},apply:function(e,t,n){return a.apply(e,o(t))},remove:function(e,t,n,r){return a.remove(e,o(t))},toggle:function(e,t,n){return a.toggle(e,o(t))},formatChanged:function(e,t,n,r,o){return a.formatChanged(t,n,r,o)}},editor:{getContent:function(e,t){return n.getContent(e)},setContent:function(e,t){return n.setContent(e,t)},insertContent:function(e,t){return n.insertContent(e)},addVisual:n.addVisual},selection:{getContent:function(e,t){return r.getContent(t)}},raw:{getModel:function(){return ve.some(t.getRawModel())}}}),e.rtc.isRemote;function o(e){return h(e)?e:{}}var i,a,n,r,t})})})}function ph(e){return e.rtcInstance||dh(e)}function hh(e){var t=e.rtcInstance;if(t)return t;throw new Error("Failed to get RTC instance not yet initialized.")}function vh(e){return 0===e.dom.length?(Ln(e),ve.none()):ve.some(e)}function bh(e,t,u,s){e.bind(function(a){return(s?Um:Fm)(a.dom,s?a.dom.length:0),t.filter(_n).map(function(e){var t=u,n=s,r=a.dom,o=e.dom,i=(n?r:o).length;n?(zm(r,o,!1,!n),t.setStart(o,i)):(zm(o,r,!1,!n),t.setEnd(o,i))})}).orThunk(function(){var e=s;return t.filter(function(e){return Fl.isBookmarkNode(e.dom)}).bind(e?Pt:Bt).or(t).filter(_n).map(function(e){var n,r=s;Ot(n=e).each(function(e){var t=n.dom;r&&Dm(e,as(t,0))?Fm(t,0):!r&&Tm(e,as(t,t.length))&&Um(t,t.length)})})})}function yh(e,t,n){var r,o=(r=t,_e(_e({format:"html"},n=void 0===n?{}:n),{set:!0,selection:!0,content:r})),i=o;if(!o.no_events){var a=e.fire("BeforeSetContent",o);if(a.isDefaultPrevented())return void e.fire("SetContent",a);i=a}i.content=function(e,t){if("raw"===t.format)return t.content;var n=e.selection.getRng(),r=e.dom.getParent(n.commonAncestorContainer,e.dom.isBlock),o=r?{context:r.nodeName.toLowerCase()}:{},i=e.parser.parse(t.content,_e(_e({isRootContent:!0,forced_root_block:!1},o),t));return nm({validate:e.validate},e.schema).serialize(i)}(e,i);var u=e.selection.getRng();!function(e,t){var n=ve.from(t.firstChild).map(Nt.fromDom),r=ve.from(t.lastChild).map(Nt.fromDom);e.deleteContents(),e.insertNode(t);var o=n.bind(Bt).filter(_n).bind(vh),i=r.bind(Pt).filter(_n).bind(vh);bh(o,n,e,!0),bh(i,r,e,!1),e.collapse(!1)}(u,u.createContextualFragment(i.content)),e.selection.setRng(u),Zf(e,u),i.no_events||e.fire("SetContent",i)}function Ch(e,t,n){var r;e&&Ne(e,t)&&(0===(r=U(e[t],function(e){return e!==n})).length?delete e[t]:e[t]=r)}qg=function(e){var t,n=e.selection.getRng(),r=on(["pre"]);n.collapsed||(t=e.selection.getSelectedBlocks(),xp(Cp(Cp(t,r),function(e){return r(e.previousSibling)&&-1!==de(t,e.previousSibling)}),function(e){var t,n=e.previousSibling;Wa(t=e).remove(),Wa(n).append("<br><br>").append(t.childNodes)}))},yp["pre"]||(yp.pre=[]),yp.pre.push(qg);var xh=Et.each,wh=function(e,t,n){xh(e.childNodes,function(e){wp(e)&&(t(e)&&n(e),e.hasChildNodes()&&wh(e,t,n))})},Sh=or([{keep:[]},{rename:["name"]},{removed:[]}]),Eh=/^(src|href|style)$/,Nh=Et.each,kh=ol,_h=Et.each,Ah=Et.each,Rh=function(S,E,N,r){function k(n,e){var t;y((e=void 0===e?A:e).onformat)&&e.onformat(n,e,N,r),Ah(e.styles,function(e,t){u.setStyle(n,t,rl(e,N))}),!e.styles||(t=u.getAttrib(n,"style"))&&u.setAttrib(n,"data-mce-style",t),Ah(e.attributes,function(e,t){u.setAttrib(n,t,rl(e,N))}),Ah(e.classes,function(e){e=rl(e,N),u.hasClass(n,e)||u.addClass(n,e)})}function g(e,t){var n=!1;return Ah(e,function(e){return!!fl(e)&&(V(e.collapsed)&&e.collapsed!==a||!u.is(t,e.selector)||zc(t)?void 0:(k(t,e),!(n=!0)))}),n}function o(x,e,l){var w=[],f=!0,d=A.inline||A.block,m=function(e){if(X(e)){var t=u.create(e);return k(t),t}return null}(d);El(x,e,function(e){var s,c=function(e){var t=!1,n=f,r=e.nodeName.toLowerCase(),o=e.parentNode,i=o.nodeName.toLowerCase();if(zn(e)&&x.getContentEditable(e)&&(n=f,f="true"===x.getContentEditable(e),t=!0),Wn(e)&&!function(e,t,n,r){if(e.getParam("format_empty_lines",!1,"boolean")&&dl(t)){var o=_e(_e({},e.schema.getTextBlockElements()),{td:{},th:{},li:{},dt:{},dd:{},figcaption:{},caption:{},details:{},summary:{}}),i=(a=Nt.fromDom(n),s=function(e){return zc(e.dom)},((c=(u=a).dom).parentNode?Nr(Nt.fromDom(c.parentNode),function(e){return!je(u,e)&&s(e)}):ve.none()).isSome());return se(o,r)&&Wr(Nt.fromDom(n.parentNode),!1)&&!i}var a,u,s,c}(S,A,e,i))return s=null,void(ll(A)&&x.remove(e));if(ll(A)&&A.wrapper&&hp(S,e,E,N))s=null;else{if(f&&!t&&ll(A)&&!A.wrapper&&tl(S,r)&&nl(S,i,d)){var a=x.rename(e,d);return k(a),w.push(a),void(s=null)}if(fl(A)){var u=g(_,e);if(!u&&V(o)&&ml(A)&&(u=g(_,o)),!dl(A)||u)return void(s=null)}!f||t||!nl(S,d,r)||!nl(S,i,d)||!l&&jn(e)&&xo(e.data)||zc(e)||dl(A)&&x.isBlock(e)?(s=null,Y(xe(e.childNodes),c),t&&(f=n),s=null):(s||(s=x.clone(m,!1),e.parentNode.insertBefore(s,e),w.push(s)),s.appendChild(e))}};Y(e,c)}),!0===A.links&&Y(w,function(e){var t=function(e){"A"===e.nodeName&&k(e,A),Y(xe(e.childNodes),t)};t(e)}),Y(w,function(e){var n,t,r,o,i,a,u,s,c,l,f,d,m,g,p,h,v,b,y=(n=0,Y(e.childNodes,function(e){var t;V(t=e)&&jn(t)&&0===t.length||Yc(e)||n++}),n);function C(e){var t;1===e.nodeType&&e.parentNode&&1===e.parentNode.nodeType&&(t=ul(m,e.parentNode),m.getStyle(e,"color")&&t?m.setStyle(e,"text-decoration",t):m.getStyle(e,"text-decoration")===t&&m.setStyle(e,"text-decoration",null))}!(1<w.length)&&x.isBlock(e)||0!==y?(dl(A)||ll(A)&&A.wrapper)&&(A.exact||1!==y||(e=M((d=e).childNodes,Mp).filter(function(e){return Tg(x,e,A)}).map(function(e){var t=x.clone(e,!1);return k(t),x.replace(t,d,!0),x.remove(e,!0),t}).getOr(d)),h=S,v=N,b=e,_h(_,function(t){var r,e,n;dl(t)&&_h(h.dom.select(t.inline,b),function(e){wp(e)&&Lp(h,t,v,e,t.exact?e:null)}),r=h.dom,(e=t).clear_child_styles&&(n=e.links?"*:not(a)":"*",xh(r.select(n,b),function(n){wp(n)&&xh(e.styles,function(e,t){r.setStyle(n,t,"")})}))}),s=A,hp(u=S,(f=e).parentNode,c=E,l=N)&&Lp(u,s,l,f)||s.merge_with_parents&&u.dom.getParent(f.parentNode,function(e){if(hp(u,e,c,l))return Lp(u,s,l,f),!0}),a=e,(i=A).styles&&i.styles.backgroundColor&&wh(a,kp(x,"fontSize"),_p(x,"backgroundColor",rl(i.styles.backgroundColor,N))),m=x,p=e,(g=A).styles&&(g.styles.color||g.styles.textDecoration)&&(Et.walk(p,C,"childNodes"),C(p)),t=x,o=e,!dl(r=A)||"sub"!==r.inline&&"sup"!==r.inline||(wh(o,kp(t,"fontSize"),_p(t,"fontSize","")),t.remove(t.select("sup"===r.inline?"sub":"sup",o),!0)),Np(x,A,0,e)):x.remove(e,!0)})}var e,t,n,i,_=S.formatter.get(E),A=_[0],a=!r&&S.selection.isCollapsed(),u=S.dom,s=S.selection;if("false"!==u.getContentEditable(s.getNode()))A&&(r?Qc(r)?g(_,r)||((e=u.createRng()).setStartBefore(r),e.setEndAfter(r),o(u,Sl(S,e,_),!0)):o(u,r,!0):a&&dl(A)&&!_l(S).length?function(e,t,n){var r,o=e.selection,i=o.getRng(),a=i.startOffset,u=i.startContainer.nodeValue,s=Hc(e.getBody(),o.getStart());s&&(r=Lg(s));var c,l,f,d,m=/[^\s\u00a0\u00ad\u200b\ufeff]/;u&&0<a&&a<u.length&&m.test(u.charAt(a))&&m.test(u.charAt(a-1))?(c=o.getBookmark(),i.collapse(!0),l=Tf(Sl(e,i,e.formatter.get(t))),e.formatter.apply(t,n,l),o.moveToBookmark(c)):(s&&r.nodeValue===vp||(f=e.getDoc(),d=Ig(!0).dom,r=(s=f.importNode(d,!0)).firstChild,i.insertNode(s),a=1),e.formatter.apply(t,n,s),o.setCursorLocation(r,a))}(S,E,N):(t=s.getNode(),n=_[0],S.settings.forced_root_block||!n.defaultBlock||u.getParent(t,u.isBlock)||Rh(S,n.defaultBlock),s.setRng(vg(s.getRng())),Bl(s,!0,function(){Ol(S,function(e,t){var n=t?e:Sl(S,e,_);o(u,n,!1)})}),Zc(u,s,s.getRng()),S.nodeChanged()),i=S,xp(yp[E],function(e){e(i)})),bf(S,E,r,N);else{r=s.getNode();for(var c=0,l=_.length;c<l;c++){var f=_[c];if(f.ceFalseOverride&&fl(f)&&u.is(r,f.selector)){k(r,f);break}}bf(S,E,r,N)}},Dh=function(e){return e.selection.getStart()},Th=function(i,a,e){var u=zp(i,a);ne(e,function(e,o){function t(e){var t,n=Up(i,u,o,e.similar,Fp(e)?e.vars:void 0),r=n.isSome();e.state.get()!==r&&(e.state.set(r),t=n.getOr(a),Fp(e)?e.callback(r,{node:t,format:o,parents:u}):Y(e.callbacks,function(e){return e(r,{node:t,format:o,parents:u})}))}Y([e.withSimilar,e.withoutSimilar],t),Y(e.withVars,t)})},Oh=Re(function(){return document.implementation.createHTMLDocument("undo")});function Bh(e){return e.select}function Ph(e){return e&&e.ownerDocument&&Ve(Nt.fromDom(e.ownerDocument),Nt.fromDom(e))}function Lh(a,u,e,s){function t(e,t){return yh(s,e,t)}function n(){var e=c(),t=null==e?void 0:e.anchorNode,n=null==e?void 0:e.focusNode;if(!e||!t||!n||rn(t)||rn(n))return!0;var r=a.createRng();r.setStart(t,e.anchorOffset),r.collapse(!0);var o=a.createRng();return o.setStart(n,e.focusOffset),o.collapse(!0),r.compareBoundaryPoints(r.START_TO_START,o)<=0}function r(e){var t=p();t.collapse(!!e),h(t)}function c(){return u.getSelection?u.getSelection():u.document.selection}var l,f,o,i,d,m,g=function(e,t){return d||(d={},m={},i.on("NodeChange",function(e){var n=e.element,r=x(n),o={};Et.each(d,function(e,n){C(n,r).each(function(t){m[n]||(Y(e,function(e){e(!0,{node:t,selector:n,parents:r})}),m[n]=e),o[n]=e})}),Et.each(m,function(e,t){o[t]||(delete m[t],Et.each(e,function(e){e(!1,{node:n,selector:t,parents:r})}))})})),d[e]||(d[e]=[]),d[e].push(t),C(e,x(i.selection.getStart())).each(function(){m[e]=d[e]}),{unbind:function(){Ch(d,e,t),Ch(m,e,t)}}},p=function(){function e(e,t,n){try{return t.compareBoundaryPoints(e,n)}catch(e){return-1}}var t,n,r,o=u.document;if(void 0!==s.bookmark&&!1===vd(s)){var i=ld(s);if(i.isSome())return i.map(function(e){return wd(s,[e])[0]}).getOr(o.createRange())}try{(t=c())&&!rn(t.anchorNode)&&(n=0<t.rangeCount?t.getRangeAt(0):(t.createRange?t:o).createRange(),n=wd(s,[n])[0])}catch(e){}return(n=n||(o.createRange?o.createRange():o.body.createTextRange())).setStart&&9===n.startContainer.nodeType&&n.collapsed&&(r=a.getRoot(),n.setStart(r,0),n.setEnd(r,0)),l&&f&&(0===e(n.START_TO_START,n,l)&&0===e(n.END_TO_END,n,l)?n=f:f=l=null),n},h=function(e,t){var n;if((r=e)&&(Bh(r)||Ph(r.startContainer)&&Ph(r.endContainer))){var r,o=Bh(e)?e:null;if(o){f=null;try{o.select()}catch(e){}}else{var i=c();if(e=s.fire("SetSelectionRange",{range:e,forward:t}).range,i){f=e;try{i.removeAllRanges(),i.addRange(e)}catch(e){}!1===t&&i.extend&&(i.collapse(e.endContainer,e.endOffset),i.extend(e.startContainer,e.startOffset)),l=0<i.rangeCount?i.getRangeAt(0):null}e.collapsed||e.startContainer!==e.endContainer||!i.setBaseAndExtent||xt.ie||e.endOffset-e.startOffset<2&&e.startContainer.hasChildNodes()&&(n=e.startContainer.childNodes[e.startOffset])&&"IMG"===n.tagName&&(i.setBaseAndExtent(e.startContainer,e.startOffset,e.endContainer,e.endOffset),i.anchorNode===e.startContainer&&i.focusNode===e.endContainer||i.setBaseAndExtent(n,0,n,1)),s.fire("AfterSetSelectionRange",{range:e,forward:t})}}},v={bookmarkManager:null,controlSelection:null,dom:o=a,win:u,serializer:e,editor:i=s,collapse:r,setCursorLocation:function(e,t){var n=a.createRng();V(e)&&V(t)?(n.setStart(e,t),n.setEnd(e,t),h(n),r(!1)):(Dl(a,n,s.getBody(),!0),h(n))},getContent:function(e){return n=(t=void 0===(t=e)?{}:t).format||"html",r=t,hh(s).selection.getContent(n,r);var t,n,r},setContent:t,getBookmark:function(e,t){return b.getBookmark(e,t)},moveToBookmark:function(e){return b.moveToBookmark(e)},select:function(e,t){var r=a,o=t;return ve.from(e).map(function(e){var t=r.nodeIndex(e),n=r.createRng();return n.setStart(e.parentNode,t),n.setEnd(e.parentNode,t+1),o&&(Dl(r,n,e,!0),Dl(r,n,e,!1)),n}).each(h),e},isCollapsed:function(){var e=p(),t=c();return!(!e||e.item)&&(e.compareEndPoints?0===e.compareEndPoints("StartToEnd",e):!t||e.collapsed)},isForward:n,setNode:function(e){return t(a.getOuterHTML(e)),e},getNode:function(){return function(e,t){if(!t)return e;var n=t.startContainer,r=t.endContainer,o=t.startOffset,i=t.endOffset,a=t.commonAncestorContainer;return!t.collapsed&&(n===r&&i-o<2&&n.hasChildNodes()&&(a=n.childNodes[o]),3===n.nodeType&&3===r.nodeType&&(n=n.length===o?xd(n.nextSibling,!0):n.parentNode,r=0===i?xd(r.previousSibling,!1):r.parentNode,n&&n===r))?n:a&&3===a.nodeType?a.parentNode:a}(s.getBody(),p())},getSel:c,setRng:h,getRng:p,getStart:function(e){return yd(s.getBody(),p(),e)},getEnd:function(e){return Cd(s.getBody(),p(),e)},getSelectedBlocks:function(e,t){return function(e,t,n,r){var o=[],i=e.getRoot();if(n=e.getParent(n||yd(i,t,t.collapsed),e.isBlock),r=e.getParent(r||Cd(i,t,t.collapsed),e.isBlock),n&&n!==i&&o.push(n),n&&r&&n!==r)for(var a,u=new Rr(n,i);(a=u.next())&&a!==r;)e.isBlock(a)&&o.push(a);return r&&n!==r&&r!==i&&o.push(r),o}(a,p(),e,t)},normalize:function(){var e=p();if(1<Nl(c()).length||!Tl(s))return e;var t=Rf(a,e);return t.each(function(e){h(e,n())}),t.getOr(e)},selectorChanged:function(e,t){return g(e,t),v},selectorChangedWithUnbind:g,getScrollContainer:function(){for(var e,t=a.getRoot();t&&"BODY"!==t.nodeName;){if(t.scrollHeight>t.clientHeight){e=t;break}t=t.parentNode}return e},scrollIntoView:function(e,t){V(e)?(s.inline?Gf:Qf)(s,e,t):Zf(s,p(),t)},placeCaretAt:function(e,t){return h(wf(e,t,s.getDoc()))},getBoundingClientRect:function(){var e=p();return e.collapsed?as.fromRangeStart(e).getClientRects()[0]:e.getBoundingClientRect()},destroy:function(){u=l=f=null,y.destroy()}},b=Fl(v),y=Cf(v,s);function C(t,e){return M(e,function(e){return o.is(e,t)})}function x(e){return o.getParents(e,null,o.getRoot())}return v.bookmarkManager=b,v.controlSelection=y,v}function Ih(e,t){var n,r,a,u,o=ro();t.convert_fonts_to_spans&&(r=e,a=o,u=Et.explode(t.font_size_legacy_values),r.addNodeFilter("font",function(e){Y(e,function(e){var t,n=a.parse(e.attr("style")),r=e.attr("color"),o=e.attr("face"),i=e.attr("size");r&&(n.color=r),o&&(n["font-family"]=o),i&&(n["font-size"]=u[parseInt(e.attr("size"),10)-1]),e.name="span",e.attr("style",a.serialize(n)),t=e,Y(["color","face","size"],function(e){t.attr(e,null)})})})),n=o,e.addNodeFilter("strike",function(e){Y(e,function(e){var t=n.parse(e.attr("style"));t["text-decoration"]="line-through",e.name="span",e.attr("style",n.serialize(t))})})}function Mh(e){var t,n=decodeURIComponent(e).split(","),r=/data:([^;]+)/.exec(n[0]);return{type:t=r?r[1]:t,data:n[1]}}function Fh(e,t){var n;try{n=atob(t)}catch(e){return ve.none()}for(var r=new Uint8Array(n.length),o=0;o<r.length;o++)r[o]=n.charCodeAt(o);return ve.some(new Blob([r],{type:e}))}function Uh(e){return 0===e.indexOf("blob:")?(o=e,new kr(function(e,t){function n(){t("Cannot convert "+o+" to Blob. Resource might not exist or is inaccessible.")}try{var r=new XMLHttpRequest;r.open("GET",o,!0),r.responseType="blob",r.onload=function(){200===r.status?e(r.response):n()},r.onerror=n,r.send()}catch(e){n()}})):0===e.indexOf("data:")?(n=e,new kr(function(e){var t=Mh(n);Fh(t.type,t.data).fold(function(){return e(new Blob([]))},e)})):null;var o,n}function zh(e){return(e||"blobid")+lv++}function Hh(r,d){var o={};return{findAll:function(e,n){n=n||w;var t=T(U(e?xe(e.getElementsByTagName("img")):[],function(e){var t=e.src;return xt.fileApi&&!e.hasAttribute("data-mce-bogus")&&!e.hasAttribute("data-mce-placeholder")&&t&&t!==xt.transparentSrc&&(0===t.indexOf("blob:")?!r.isUploaded(t)&&n(e):0===t.indexOf("data:")&&n(e))}),function(f){if(void 0!==o[f.src])return new kr(function(t){o[f.src].then(function(e){return"string"==typeof e?e:void t({image:f,blobInfo:e.blobInfo})})});var e=new kr(function(e,t){var r,o,i,n,a,u,s,c,l;r=d,i=e,n=t,0!==(o=f).src.indexOf("blob:")?(u=(a=Mh(o.src)).data,s=a.type,c=u,(l=r.getByData(c,s))?i({image:o,blobInfo:l}):Uh(o.src).then(function(e){l=r.create(zh(),e,c),r.add(l),i({image:o,blobInfo:l})},function(e){n(e)})):(l=r.getByUri(o.src))?i({image:o,blobInfo:l}):Uh(o.src).then(function(t){var n=t;new kr(function(e){var t=new FileReader;t.onloadend=function(){e(t.result)},t.readAsDataURL(n)}).then(function(e){c=Mh(e).data,l=r.create(zh(),t,c),r.add(l),i({image:o,blobInfo:l})})},function(e){n(e)})}).then(function(e){return delete o[e.image.src],e}).catch(function(e){return delete o[f.src],e});return o[f.src]=e});return kr.all(t)}}}function jh(e,t,n,r){(e.padd_empty_with_br||t.insert)&&n[r.name]?r.empty().append(new Ud("br",1)).shortEnded=!0:r.empty().append(new Ud("#text",3)).value=yo}function Vh(n,e,t,r){return r.isEmpty(e,t,function(e){return(t=n.getElementRule(e.name))&&t.paddEmpty;var t})}function qh(e,p){var t,o,i,h=e.schema;function n(t){var e,n,r=t.attr("src");(e=t).attr("src")===xt.transparentSrc||V(e.attr("data-mce-placeholder"))||V(t.attr("data-mce-bogus"))||((n=/data:([^;]+);base64,([a-z0-9\+\/=\s]+)/i.exec(r))?ve.some({type:n[1],data:decodeURIComponent(n[2])}):ve.none()).filter(function(){return function(e,t){if(t.images_dataimg_filter){var n=new Image;return n.src=e.attr("src"),ne(e.attributes.map,function(e,t){n.setAttribute(t,e)}),t.images_dataimg_filter(n)}return!0}(t,o)}).bind(function(e){var t=e.type,n=e.data;return ve.from(i.getByData(n,t)).orThunk(function(){return Fh(t,n).map(function(e){var t=i.create(zh(),e,n);return i.add(t),t})})}).each(function(e){t.attr("src",e.blobUri())})}p.remove_trailing_brs&&e.addNodeFilter("br",function(e,t,n){var r,o,i,a,u,s,c,l,f=e.length,d=Et.extend({},h.getBlockElements()),m=h.getNonEmptyElements(),g=h.getWhiteSpaceElements();for(d.body=1,r=0;r<f;r++)if(i=(o=e[r]).parent,d[o.parent.name]&&o===i.lastChild){for(u=o.prev;u;){if("span"!==(s=u.name)||"bookmark"!==u.attr("data-mce-type")){"br"===s&&(o=null);break}u=u.prev}o&&(o.remove(),Vh(h,m,g,i)&&(c=h.getElementRule(i.name))&&(c.removeEmpty?i.remove():c.paddEmpty&&jh(p,n,d,i)))}else{for(a=o;i&&i.firstChild===a&&i.lastChild===a&&!d[(a=i).name];)i=i.parent;a===i&&!0!==p.padd_empty_with_br&&((l=new Ud("#text",3)).value=yo,o.replace(l))}}),e.addAttributeFilter("href",function(e){var t,n,r=e.length;if(!p.allow_unsafe_link_target)for(;r--;){var o=e[r];"a"===o.name&&"_blank"===o.attr("target")&&o.attr("rel",(n=void 0,n=(t=o.attr("rel"))?Et.trim(t):"",/\b(noopener)\b/g.test(n)?n:n.split(" ").filter(function(e){return 0<e.length}).concat(["noopener"]).sort().join(" ")))}}),p.allow_html_in_named_anchor||e.addAttributeFilter("id,name",function(e){for(var t,n,r,o,i=e.length;i--;)if("a"===(o=e[i]).name&&o.firstChild&&!o.attr("href"))for(r=o.parent,t=o.lastChild;n=t.prev,r.insert(t,o),t=n;);}),p.fix_list_elements&&e.addNodeFilter("ul,ol",function(e){for(var t,n,r,o=e.length;o--;)"ul"!==(r=(n=e[o]).parent).name&&"ol"!==r.name||(n.prev&&"li"===n.prev.name?n.prev.append(n):((t=new Ud("li",1)).attr("style","list-style-type: none"),n.wrap(t)))}),p.validate&&h.getValidClasses()&&e.addAttributeFilter("class",function(e){for(var t=h.getValidClasses(),n=e.length;n--;){for(var r=e[n],o=r.attr("class").split(" "),i="",a=0;a<o.length;a++){var u=o[a],s=!1,c=t["*"];c&&c[u]&&(s=!0),c=t[r.name],(s=!(s||!c||!c[u])||s)&&(i&&(i+=" "),i+=u)}i.length||(i=null),r.attr("class",i)}}),t=e,(i=(o=p).blob_cache)&&t.addAttributeFilter("src",function(e){return Y(e,n)})}function $h(_,A){void 0===A&&(A=to());var R={},D=[],T={},O={};(_=_||{}).validate=!("validate"in _)||_.validate,_.root_name=_.root_name||"body";function B(e){var t=e.name;t in R&&((r=T[t])?r.push(e):T[t]=[e]);for(var n=D.length;n--;){var r,o=D[n].name;o in e.attributes.map&&((r=O[o])?r.push(e):O[o]=[e])}return e}var e={schema:A,addAttributeFilter:function(e,n){mv(gv(e),function(e){for(var t=0;t<D.length;t++)if(D[t].name===e)return void D[t].callbacks.push(n);D.push({name:e,callbacks:[n]})})},getAttributeFilters:function(){return[].concat(D)},addNodeFilter:function(e,n){mv(gv(e),function(e){var t=R[e];t||(R[e]=t=[]),t.push(n)})},getNodeFilters:function(){var e,t=[];for(e in R)Ne(R,e)&&t.push({name:e,callbacks:R[e]});return t},filterNode:B,parse:function(e,u){var t,n,r,o,i,s,a,c,l=[];function f(e){for(var t=A.getBlockElements(),n=e.prev;n&&3===n.type;){var r=n.value.replace(x,"");if(0<r.length)return n.value=r,0;var o=n.next;if(o){if(3===o.type&&o.value.length){n=n.prev;continue}if(!t[o.name]&&"script"!==o.name&&"style"!==o.name){n=n.prev;continue}}var i=n.prev;n.remove(),n=i}}u=u||{},T={},O={};function d(e,t){var n,r=new Ud(e,t);return e in R&&((n=T[e])?n.push(r):T[e]=[r]),r}var m=pv(dv("script,style,head,html,body,title,meta,param"),A.getBlockElements()),g=A.getNonEmptyElements(),p=A.children,h=_.validate,v=("forced_root_block"in u?u:_).forced_root_block,b=!1===v?"":!0===v?"p":v,y=A.getWhiteSpaceElements(),C=/^[ \t\r\n]+/,x=/[ \t\r\n]+$/,w=/[ \t\r\n]+/g,S=/^[ \t\r\n]+$/,E=Ne(y,u.context)||Ne(y,_.root_name),N=Gd({validate:h,document:_.document,allow_html_data_urls:_.allow_html_data_urls,allow_svg_data_urls:_.allow_svg_data_urls,allow_script_urls:_.allow_script_urls,allow_conditional_comments:_.allow_conditional_comments,preserve_cdata:_.preserve_cdata,self_closing_elements:function(e){var t,n={};for(t in e)"li"!==t&&"p"!==t&&(n[t]=e[t]);return n}(A.getSelfClosingElements()),cdata:function(e){c.append(d("#cdata",4)).value=e},text:function(e,t){var n,r;E||(e=e.replace(w," "),(r=c.lastChild)&&(Ne(m,r.name)||"br"===r.name)&&(e=e.replace(C,""))),0!==e.length&&((n=d("#text",3)).raw=!!t,c.append(n).value=e)},comment:function(e){c.append(d("#comment",8)).value=e},pi:function(e,t){c.append(d(e,7)).value=t,f(c)},doctype:function(e){c.append(d("#doctype",10)).value=e,f(c)},start:function(e,t,n){var r=h?A.getElementRule(e):{};if(r){var o=d(r.outputName||e,1);o.attributes=t,o.shortEnded=n,c.append(o);var i=p[c.name];i&&p[o.name]&&!i[o.name]&&l.push(o);for(var a=D.length;a--;){var u=D[a].name;u in t.map&&((s=O[u])?s.push(o):O[u]=[o])}m[e]&&f(o),n||(c=o),!E&&y[e]&&(E=!0)}},end:function(e){var t,n,r,o,i,a=h?A.getElementRule(e):{};if(a){if(m[e]&&!E){if((t=c.firstChild)&&3===t.type)if(0<(n=t.value.replace(C,"")).length)t.value=n,t=t.next;else for(r=t.next,t.remove(),t=r;t&&3===t.type;)n=t.value,r=t.next,0!==n.length&&!S.test(n)||(t.remove(),t=r),t=r;if((t=c.lastChild)&&3===t.type)if(0<(n=t.value.replace(x,"")).length)t.value=n,t=t.prev;else for(r=t.prev,t.remove(),t=r;t&&3===t.type;)n=t.value,r=t.prev,0!==n.length&&!S.test(n)||(t.remove(),t=r),t=r}if(E&&y[e]&&(E=!1),a.removeEmpty&&Vh(A,g,y,c))return o=c.parent,m[c.name]?c.empty().remove():c.unwrap(),void(c=o);a.paddEmpty&&(fv(i=c,"#text")&&i.firstChild.value===yo||Vh(A,g,y,c))&&jh(_,u,m,c),c=c.parent}}},A),k=c=new Ud(u.context||_.root_name,11);if(N.parse(e,u.format),h&&l.length&&(u.context?u.invalid=!0:function(e){for(var t=dv("tr,td,th,tbody,thead,tfoot,table"),n=A.getNonEmptyElements(),r=A.getWhiteSpaceElements(),o=A.getTextBlockElements(),i=A.getSpecialElements(),a=function(e,t){if(void 0===t&&(t=e.parent),i[e.name])e.empty().remove();else{for(var n=0,r=e.children();n<r.length;n++){var o=r[n];A.isValidChild(t.name,o.name)||a(o,t)}e.unwrap()}},u=0;u<e.length;u++){var s,c=e[u],l=void 0,f=void 0;if(c.parent&&!c.fixed)if(o[c.name]&&"li"===c.parent.name){for(var d=c.next;d&&o[d.name];)d.name="li",d.fixed=!0,c.parent.insert(d,c.parent),d=d.next;c.unwrap()}else{for(var m=[c],l=c.parent;l&&!A.isValidChild(l.name,c.name)&&!t[l.name];l=l.parent)m.push(l);if(l&&1<m.length)if(A.isValidChild(l.name,c.name)){m.reverse();for(var g=s=B(m[0].clone()),p=0;p<m.length-1;p++){A.isValidChild(g.name,m[p].name)?(f=B(m[p].clone()),g.append(f)):f=g;for(var h=m[p].firstChild;h&&h!==m[p+1];){var v=h.next;f.append(h),h=v}g=f}Vh(A,n,r,s)?l.insert(c,m[0],!0):(l.insert(s,m[0],!0),l.insert(c,s)),l=m[0],(Vh(A,n,r,l)||fv(l,"br"))&&l.empty().remove()}else a(c);else c.parent&&("li"!==c.name?A.isValidChild(c.parent.name,"div")&&A.isValidChild("div",c.name)?c.wrap(B(new Ud("div",1))):a(c):!(d=c.prev)||"ul"!==d.name&&"ol"!==d.name?!(d=c.next)||"ul"!==d.name&&"ol"!==d.name?c.wrap(B(new Ud("ul",1))):d.insert(c,d.firstChild,!0):d.append(c))}}}(l)),b&&("body"===k.name||u.isRootContent)&&function(){function e(e){e&&((t=e.firstChild)&&3===t.type&&(t.value=t.value.replace(C,"")),(t=e.lastChild)&&3===t.type&&(t.value=t.value.replace(x,"")))}var t=k.firstChild,n=null;if(A.isValidChild(k.name,b.toLowerCase())){for(;t;){var r=t.next;3===t.type||1===t.type&&"p"!==t.name&&!m[t.name]&&!t.attr("data-mce-type")?(n||((n=d(b,1)).attr(_.forced_root_block_attrs),k.insert(n,t)),n.append(t)):(e(n),n=null),t=r}e(n)}}(),!u.invalid){for(a in T)if(Ne(T,a)){for(s=R[a],o=(t=T[a]).length;o--;)t[o].parent||t.splice(o,1);for(n=0,r=s.length;n<r;n++)s[n](t,a,u)}for(n=0,r=D.length;n<r;n++)if((s=D[n]).name in O){for(o=(t=O[s.name]).length;o--;)t[o].parent||t.splice(o,1);for(o=0,i=s.callbacks.length;o<i;o++)s.callbacks[o](t,s.name,u)}}return k}};return qh(e,_),_.inline_styles&&Ih(e,_),e}function Wh(e,t,n){-1===Et.inArray(t,n)&&(e.addAttributeFilter(n,function(e,t){for(var n=e.length;n--;)e[n].attr(t,null)}),t.push(n))}function Kh(L,I){var e=["data-mce-selected"],M=I&&I.dom?I.dom:Ja.DOM,F=I&&I.schema?I.schema:to(L);L.entity_encoding=L.entity_encoding||"named",L.remove_trailing_brs=!("remove_trailing_brs"in L)||L.remove_trailing_brs;var t,U=$h(L,F),s=L,c=M;return(t=U).addAttributeFilter("data-mce-tabindex",function(e,t){for(var n=e.length;n--;){var r=e[n];r.attr("tabindex",r.attr("data-mce-tabindex")),r.attr(t,null)}}),t.addAttributeFilter("src,href,style",function(e,t){for(var n="data-mce-"+t,r=s.url_converter,o=s.url_converter_scope,i=e.length;i--;){var a=e[i],u=a.attr(n);void 0!==u?(a.attr(t,0<u.length?u:null),a.attr(n,null)):(u=a.attr(t),"style"===t?u=c.serializeStyle(c.parseStyle(u),a.name):r&&(u=r.call(o,u,t,a.name)),a.attr(t,0<u.length?u:null))}}),t.addAttributeFilter("class",function(e){for(var t=e.length;t--;){var n,r=e[t];r.attr("class")&&(n=r.attr("class").replace(/(?:^|\s)mce-item-\w+(?!\S)/g,""),r.attr("class",0<n.length?n:null))}}),t.addAttributeFilter("data-mce-type",function(e,t,n){for(var r=e.length;r--;){var o=e[r];"bookmark"!==o.attr("data-mce-type")||n.cleanup||(ve.from(o.firstChild).exists(function(e){return!xo(e.value)})?o.unwrap():o.remove())}}),t.addNodeFilter("noscript",function(e){for(var t=e.length;t--;){var n=e[t].firstChild;n&&(n.value=Go.decode(n.value))}}),t.addNodeFilter("script,style",function(e,t){for(var n=function(e){return e.replace(/(<!--\[CDATA\[|\]\]-->)/g,"\n").replace(/^[\r\n]*|[\r\n]*$/g,"").replace(/^\s*((<!--)?(\s*\/\/)?\s*<!\[CDATA\[|(<!--\s*)?\/\*\s*<!\[CDATA\[\s*\*\/|(\/\/)?\s*<!--|\/\*\s*<!--\s*\*\/)\s*[\r\n]*/gi,"").replace(/\s*(\/\*\s*\]\]>\s*\*\/(-->)?|\s*\/\/\s*\]\]>(-->)?|\/\/\s*(-->)?|\]\]>|\/\*\s*-->\s*\*\/|\s*-->\s*)\s*$/g,"")},r=e.length;r--;){var o,i=e[r],a=i.firstChild?i.firstChild.value:"";"script"===t?((o=i.attr("type"))&&i.attr("type","mce-no/type"===o?null:o.replace(/^mce\-/,"")),"xhtml"===s.element_format&&0<a.length&&(i.firstChild.value="// <![CDATA[\n"+n(a)+"\n// ]]>")):"xhtml"===s.element_format&&0<a.length&&(i.firstChild.value="\x3c!--\n"+n(a)+"\n--\x3e")}}),t.addNodeFilter("#comment",function(e){for(var t=e.length;t--;){var n=e[t];s.preserve_cdata&&0===n.value.indexOf("[CDATA[")?(n.name="#cdata",n.type=4,n.value=c.decode(n.value.replace(/^\[CDATA\[|\]\]$/g,""))):0===n.value.indexOf("mce:protected ")&&(n.name="#text",n.type=3,n.raw=!0,n.value=unescape(n.value).substr(14))}}),t.addNodeFilter("xml:namespace,input",function(e,t){for(var n=e.length;n--;){var r=e[n];7===r.type?r.remove():1===r.type&&("input"!==t||r.attr("type")||r.attr("type","text"))}}),t.addAttributeFilter("data-mce-type",function(e){Y(e,function(e){"format-caret"===e.attr("data-mce-type")&&(e.isEmpty(t.schema.getNonEmptyElements())?e.remove():e.unwrap())})}),t.addAttributeFilter("data-mce-src,data-mce-href,data-mce-style,data-mce-selected,data-mce-expando,data-mce-type,data-mce-resize,data-mce-placeholder",function(e,t){for(var n=e.length;n--;)e[n].attr(t,null)}),{schema:F,addNodeFilter:U.addNodeFilter,addAttributeFilter:U.addAttributeFilter,serialize:function(e,t){var n,r,o,i,a,u,s,c,l,f,d,m,g,p,h,v,b,y,C,x,w,S,E,N,k,_,A,R,D,T=_e({format:"html"},t=void 0===t?{}:t),O=(n=(m=e,E=g=T,(d=I)&&d.hasEventListeners("PreProcess")&&!E.no_events?(h=g,x=(p=d).dom,w=m.cloneNode(!0),(S=document.implementation).createHTMLDocument&&(b=S.createHTMLDocument(""),Et.each("BODY"===w.nodeName?w.childNodes:[w],function(e){b.body.appendChild(b.importNode(e,!0))}),w="BODY"!==w.nodeName?b.body.firstChild:b.body,v=x.doc,x.doc=b),y=p,C=_e(_e({},h),{node:w}),y.fire("PreProcess",C),v&&(x.doc=v),w):m),o=wo((r=T).getInner?n.innerHTML:M.getOuterHTML(n)),r.selection||vo(Nt.fromDom(n))?o:Et.trim(o)),B=(i=U,a=O,s=(u=T).selection?_e({forced_root_block:!1},u):u,c=i.parse(a,s),!P(f=c.lastChild)||P(l=f.prev)&&(f.remove(),l.remove()),c);function P(e){return e&&"br"===e.name}return"tree"===T.format?B:(N=I,k=T,_=B,D=nm(L,F).serialize(_),k.no_events||!N?D:(A=N,R=_e(_e({},k),{content:D}),A.fire("PostProcess",R).content))},addRules:F.addValidElements,setRules:F.setValidElements,addTempAttr:A(Wh,U,e),getTempAttrs:J(e),getNodeFilters:U.getNodeFilters,getAttributeFilters:U.getAttributeFilters}}function Xh(e,t){var n=Kh(e,t);return{schema:n.schema,addNodeFilter:n.addNodeFilter,addAttributeFilter:n.addAttributeFilter,serialize:n.serialize,addRules:n.addRules,setRules:n.setRules,addTempAttr:n.addTempAttr,getTempAttrs:n.getTempAttrs,getNodeFilters:n.getNodeFilters,getAttributeFilters:n.getAttributeFilters}}function Yh(e,t,n){return r=n=void 0===n?{}:n,ph(e).editor.setContent(t,r);var r}function Gh(e){return ve.from(e).each(function(e){return e.destroy()})}function Jh(e,t){var n,r,o,i,a,u,s,c=(n=e,r=U(bv,function(e){return Ne(n,e)}),!1!==(o=n.forced_root_block)&&""!==o||r.push("forced_root_block (false only)"),W(r)),l=(s=Et.makeMap(t.plugins," "),W(Ae(Ae([],U(yv,g),!0),H(Cv,function(e){return g(e)?[e+" (moving to premium)"]:[]}),!0))),f=0<l.length,d=0<c.length,m="mobile"===t.theme;function g(e){return Ne(s,e)}(f||d||m)&&(i=m?"\n\nThemes:\n- mobile":"",a=f?"\n\nPlugins:\n- "+l.join("\n- "):"",u=d?"\n\nSettings:\n- "+c.join("\n- "):"",console.warn("The following deprecated features are currently enabled, these will be removed in TinyMCE 6.0. See https://www.tiny.cloud/docs/release-notes/6.0-upcoming-changes/ for more information."+i+a+u))}function Qh(e){var t=S(e)?e.join(" "):e;return U(T(X(t)?t.split(" "):[],Je),function(e){return 0<e.length})}function Zh(e,t){return Ne(e.sections(),t)}function ev(e,t){return ue(e,"toolbar_mode").orThunk(function(){return ue(e,"toolbar_drawer").map(function(e){return!1===e?"wrap":e})}).getOr(t)}function tv(e,t,n,r){var o,i,a,u,s,c,l,f,d=Qh(n.forced_plugins),m=Qh(r.plugins),g=Zh(o=t,"mobile")?o.sections().mobile:{},p=g.plugins?Qh(g.plugins):m,h=(i=(u=t,s=m,c=p,(a=e)&&(0,f=(l=u).sections(),Zh(l,"mobile")&&"mobile"===f.mobile.theme)?U(c,A(D,Nv)):a&&Zh(u,"mobile")?c:s),[].concat(Qh(d)).concat(Qh(i)));if(xt.browser.isIE()&&D(h,"rtc"))throw new Error("RTC plugin is not supported on IE 11.");return Et.extend(r,{plugins:h.join(" ")})}function nv(e,t,n,r,o){var i,a,u,s,c,l,f,d,m=e?{mobile:(i=t,a={resize:!1,toolbar_mode:ev(o.mobile||{},"scrolling"),toolbar_sticky:!1},_e(_e(_e({},kv),a),i?{menubar:!1}:{}))}:{},g=(c=["mobile"],ie(vv(m,o),function(e,t){return D(c,t)},oe(l={}),oe(f={})),{sections:J((d={t:l,f:f}).t),settings:J(d.f)}),p=Et.extend(n,r,g.settings(),e&&Zh(g,"mobile")?function(e){void 0===e&&(e={});var t=ue(g.sections(),"mobile").getOr({});return Et.extend({},e,t)}():{},{validate:!0,external_plugins:(u=r,s=g.settings().external_plugins||{},u&&u.external_plugins?Et.extend({},u.external_plugins,s):s)});return tv(e,g,r,p)}function rv(e,t,n){return ve.from(t.settings[n]).filter(e)}function ov(e,t){return t.dom[e]}function iv(e,t){return parseInt(xn(t,e),10)}function av(e,t,n){var r,o,i,a,u,s,c=Nt.fromDom(e.getBody()),l=e.inline?c:Nt.fromDom(Dt(c).dom.documentElement),f=(r=e.inline,i=t,a=n,u=(o=l).dom.getBoundingClientRect(),{x:i-(r?u.left+o.dom.clientLeft+Tv(o):0),y:a-(r?u.top+o.dom.clientTop+Dv(o):0)}),d=f.x,m=f.y,g=Av(s=l),p=Rv(s);return 0<=d&&0<=m&&d<=g&&m<=p}function uv(o){function i(){var e=o.theme;return e&&e.getNotificationManagerImpl?e.getNotificationManagerImpl():{open:t,close:t,reposition:t,getArgs:t};function t(){throw new Error("Theme did not provide a NotificationManager implementation.")}}function a(){return ve.from(c[0])}function u(){0<c.length&&i().reposition(c)}function s(t){z(c,function(e){return e===t}).each(function(e){c.splice(e,1)})}function t(n,e){if(void 0===e&&(e=!0),!o.removed&&(r=(t=o).inline?t.getBody():t.getContentAreaContainer(),ve.from(r).map(Nt.fromDom).map(In).getOr(!1)))return e&&o.fire("BeforeOpenNotification",{notification:n}),M(c,function(e){return!((t=i().getArgs(e)).type!==n.type||t.text!==n.text||t.progressBar||t.timeout||n.progressBar||n.timeout);var t}).getOrThunk(function(){o.editorManager.setActive(o);var e=i().open(n,function(){s(e),u(),a().fold(function(){return o.focus()},function(e){return Nt.fromDom(e.getEl()).dom.focus()})});return c.push(e),u(),o.fire("OpenNotification",{notification:_e({},e)}),e});var t,r}var n,c=[],e=J(c);return(n=o).on("SkinLoaded",function(){var e=n.getParam("service_message");e&&t({text:e,type:"warning",timeout:0},!1),u()}),n.on("show ResizeEditor ResizeWindow NodeChange",function(){_r.requestAnimationFrame(u)}),n.on("remove",function(){Y(c.slice(),function(e){i().close(e)})}),{open:t,close:function(){a().each(function(e){i().close(e),s(e),u()})},getNotifications:e}}var sv,cv,lv=0,fv=function(e,t){return e&&e.firstChild&&e.firstChild===e.lastChild&&e.firstChild.name===t},dv=Et.makeMap,mv=Et.each,gv=Et.explode,pv=Et.extend,hv=Ja.DOM,vv=(sv=function(e,t){return h(e)&&h(t)?vv(e,t):t},function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];if(0===e.length)throw new Error("Can't merge zero objects");for(var n={},r=0;r<e.length;r++){var o,i=e[r];for(o in i)Ne(i,o)&&(n[o]=sv(n[o],i[o]))}return n}),bv="autoresize_on_init,content_editable_state,convert_fonts_to_spans,inline_styles,padd_empty_with_br,block_elements,boolean_attributes,editor_deselector,editor_selector,elements,file_browser_callback_types,filepicker_validator_handler,force_hex_style_colors,force_p_newlines,gecko_spellcheck,images_dataimg_filter,media_scripts,mode,move_caret_before_on_enter_elements,non_empty_elements,self_closing_elements,short_ended_elements,special,spellchecker_select_languages,spellchecker_whitelist,tab_focus,table_responsive_width,text_block_elements,text_inline_elements,toolbar_drawer,types,validate,whitespace_elements,paste_word_valid_elements,paste_retain_style_properties,paste_convert_word_fake_lists".split(","),yv="bbcode,colorpicker,contextmenu,fullpage,legacyoutput,spellchecker,textcolor".split(","),Cv="imagetools,toc".split(","),xv=dt().deviceType,wv=xv.isTouch(),Sv=xv.isPhone(),Ev=xv.isTablet(),Nv=["lists","autolink","autosave"],kv={table_grid:!1,object_resizing:!1,resize:!1},_v=(cv={},{add:function(e,t){cv[e]=t},get:function(e){return cv[e]||{icons:{}}},has:function(e){return Ne(cv,e)}}),Av=A(ov,"clientWidth"),Rv=A(ov,"clientHeight"),Dv=A(iv,"margin-top"),Tv=A(iv,"margin-left"),Ov=su.PluginManager,Bv=su.ThemeManager;function Pv(r){function o(){var e=r.theme;return e&&e.getWindowManagerImpl?e.getWindowManagerImpl():{open:t,openUrl:t,alert:t,confirm:t,close:t,getParams:t,setParams:t};function t(){throw new Error("Theme did not provide a WindowManager implementation.")}}function i(n,r){return function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return r?r.apply(n,e):void 0}}function n(t){r.fire("CloseWindow",{dialog:t}),0===(u=U(u,function(e){return e!==t})).length&&r.focus()}function a(e){r.editorManager.setActive(r),cd(r);var t,n=e();return t=n,u.push(t),r.fire("OpenWindow",{dialog:t}),n}var u=[];return r.on("remove",function(){Y(u,function(e){o().close(e)})}),{open:function(e,t){return a(function(){return o().open(e,t,n)})},openUrl:function(e){return a(function(){return o().openUrl(e,n)})},alert:function(e,t,n){var r=o();r.alert(e,i(n||r,t))},confirm:function(e,t,n){var r=o();r.confirm(e,i(n||r,t))},close:function(){ve.from(u[u.length-1]).each(function(e){o().close(e),n(e)})}}}function Lv(e,t){e.notificationManager.open({type:"error",text:t})}function Iv(e,t){e._skinLoaded?Lv(e,t):e.on("SkinLoaded",function(){Lv(e,t)})}function Mv(e,t,n){vf(e,t,{message:n}),console.error(n)}function Fv(e,t,n){return n?"Failed to load "+e+": "+n+" from url "+t:"Failed to load "+e+" url: "+t}function Uv(e,t,n){Mv(e,"PluginLoadError",Fv("plugin",t,n))}function zv(e){var t,n;e.contentCSS=e.contentCSS.concat(cy(e,(n=(t=e).getParam("content_css"),X(n)?T(n.split(","),Je):S(n)?n:!1===n||t.inline?[]:["default"])),cy(e,Ds(e)))}function Hv(){function n(e,t){return{status:e,resultUri:t}}function t(e){return e in r}var r={};return{hasBlobUri:t,getResultUri:function(e){var t=r[e];return t?t.resultUri:null},isPending:function(e){return!!t(e)&&1===r[e].status},isUploaded:function(e){return!!t(e)&&2===r[e].status},markPending:function(e){r[e]=n(1,null)},markUploaded:function(e,t){r[e]=n(2,t)},removeFailed:function(e){delete r[e]},destroy:function(){r={}}}}function jv(e){return e+ly+++("s"+(new Date).getTime().toString(36)+t()+t()+t());function t(){return Math.round(4294967295*Math.random()).toString(36)}}function Vv(){function e(e){return M(n,e).getOrUndefined()}function i(e){if(!e.blob||!e.base64)throw new Error("blob and base64 representations of the image are required for BlobInfo to be created");var t=e.id||jv("blobid"),n=e.name||t,r=e.blob;return{id:J(t),name:J(n),filename:J(e.filename||n+"."+({"image/jpeg":"jpg","image/jpg":"jpg","image/gif":"gif","image/png":"png","image/apng":"apng","image/avif":"avif","image/svg+xml":"svg","image/webp":"webp","image/bmp":"bmp","image/tiff":"tiff"}[r.type.toLowerCase()]||"dat")),blob:J(r),base64:J(e.base64),blobUri:J(e.blobUri||URL.createObjectURL(r)),uri:J(e.uri)}}function t(t){return e(function(e){return e.id()===t})}var n=[];return{create:function(e,t,n,r,o){if(X(e))return i({id:e,name:r,filename:o,blob:t,base64:n});if(h(e))return i(e);throw new Error("Unknown input type")},add:function(e){t(e.id())||n.push(e)},get:t,getByUri:function(t){return e(function(e){return e.blobUri()===t})},getByData:function(t,n){return e(function(e){return e.base64()===t&&e.blob().type===n})},findFirst:e,removeByUri:function(t){n=U(n,function(e){return e.blobUri()!==t||void URL.revokeObjectURL(e.blobUri())})},destroy:function(){Y(n,function(e){URL.revokeObjectURL(e.blobUri())}),n=[]}}}function qv(u,s){function o(e,r,o,t){var i=new XMLHttpRequest;i.open("POST",s.url),i.withCredentials=s.credentials,i.upload.onprogress=function(e){t(e.loaded/e.total*100)},i.onerror=function(){o("Image upload failed due to a XHR Transport error. Code: "+i.status)},i.onload=function(){var e,t,n;i.status<200||300<=i.status?o("HTTP Error: "+i.status):(e=JSON.parse(i.responseText))&&"string"==typeof e.location?r((t=s.basePath,n=e.location,t?t.replace(/\/$/,"")+"/"+n.replace(/^\//,""):n)):o("Invalid JSON: "+i.responseText)};var n=new FormData;n.append("file",e.blob(),e.filename()),i.send(n)}function c(e,t){return{url:t,blobInfo:e,status:!0}}function l(e,t,n){return{url:"",blobInfo:e,status:!1,error:{message:t,options:n}}}function f(e,t){Et.each(d[e],function(e){e(t)}),delete d[e]}var d={};return!1===y(s.handler)&&(s.handler=o),{upload:function(e,t){return s.url||s.handler!==o?(n=e,r=t,n=Et.grep(e,function(e){return!u.isUploaded(e.blobUri())}),kr.all(Et.map(n,function(e){return u.isPending(e.blobUri())?(n=e.blobUri(),new kr(function(e){d[n]=d[n]||[],d[n].push(e)})):(i=e,t=s.handler,a=r,u.markPending(i.blobUri()),new kr(function(r){var n;try{var o=function(){n&&n.close()};t(i,function(e){o(),u.markUploaded(i.blobUri(),e),f(i.blobUri(),c(i,e)),r(c(i,e))},function(e,t){var n=t||{};o(),u.removeFailed(i.blobUri()),f(i.blobUri(),l(i,e,n)),r(l(i,e,n))},function(t){t<0||100<t||ve.from(n).orThunk(function(){return ve.from(a).map(C)}).each(function(e){(n=e).progressBar.value(t)})})}catch(e){r(l(i,e.message,{}))}}));var i,t,a,n}))):new kr(function(e){e([])});var n,r}}}function $v(e){return function(){return e.notificationManager.open({text:e.translate("Image uploading..."),type:"info",timeout:-1,progressBar:!0})}}function Wv(e,t){return qv(t,{url:e.getParam("images_upload_url","","string"),basePath:e.getParam("images_upload_base_path","","string"),credentials:e.getParam("images_upload_credentials",!1,"boolean"),handler:e.getParam("images_upload_handler",null,"function")})}function Kv(l){function t(t){return function(e){return l.selection?t(e):[]}}function r(e,t,n){for(var r=0;-1!==(r=e.indexOf(t,r))&&(e=e.substring(0,r)+n+e.substr(r+t.length),r+=n.length-t.length+1),-1!==r;);return e}function o(e,t,n){return e=r(e,'src="'+t+'"','src="'+n+'"'+(n===xt.transparentSrc?' data-mce-placeholder="1"':"")),r(e,'data-mce-src="'+t+'"','data-mce-src="'+n+'"')}function f(t,n){Y(l.undoManager.data,function(e){"fragmented"===e.type?e.fragments=T(e.fragments,function(e){return o(e,t,n)}):e.content=o(e.content,t,n)})}function n(n){return u=u||Wv(l,g),v().then(t(function(c){var e=T(c,function(e){return e.blobInfo});return u.upload(e,$v(l)).then(t(function(e){var s=[],t=T(e,function(e,t){var n,r,o,i,a=c[t].blobInfo,u=c[t].image;return e.status&&l.getParam("images_replace_blob_uris",!0,"boolean")?(m.removeByUri(u.src),mh(l)||(r=u,o=e.url,i=l.convertURL(o,"src"),f(r.src,o),l.$(r).attr({src:l.getParam("images_reuse_filename",!1,"boolean")?o+(-1===o.indexOf("?")?"?":"&")+(new Date).getTime():o,"data-mce-src":i}))):e.error&&(e.error.options.remove&&(f(u.getAttribute("src"),xt.transparentSrc),s.push(u)),n=e.error.message,Iv(l,uu.translate(["Failed to upload image: {0}",n]))),{element:u,status:e.status,uploadUri:e.url,blobInfo:a}});return 0<t.length&&h.fireIfChanged(),0<s.length&&(mh(l)?console.error("Removing images on failed uploads is currently unsupported for RTC"):l.undoManager.transact(function(){Y(s,function(e){l.dom.remove(e),m.removeByUri(e.src)})})),n&&n(t),t}))}))}function e(e){if(Ns(l))return n(e)}function i(t){return!1!==j(p,function(e){return e(t)})&&(0!==t.getAttribute("src").indexOf("data:")||l.getParam("images_dataimg_filter",w,"function")(t))}function a(e){return e.replace(/src="(blob:[^"]+)"/g,function(e,n){var t=g.getResultUri(n);if(t)return'src="'+t+'"';var r=(r=m.getByUri(n))||L(l.editorManager.get(),function(e,t){return e||t.editorUpload&&t.editorUpload.blobCache.getByUri(n)},null);return r?'src="data:'+r.blob().type+";base64,"+r.base64()+'"':e})}var u,s,c,d,m=Vv(),g=Hv(),p=[],h=(d=ru(null),(c=l).on("change AddUndo",function(e){d.set(_e({},e.level))}),{fireIfChanged:function(){var t=c.undoManager.data;Z(t).filter(function(e){return!sh(d.get(),e)}).each(function(e){c.setDirty(!0),c.fire("change",{level:e,lastLevel:G(t,t.length-2).getOrNull()})})}}),v=function(){return(s=s||Hh(g,m)).findAll(l.getBody(),i).then(t(function(e){return e=U(e,function(e){return"string"!=typeof e||void Iv(l,e)}),mh(l)||Y(e,function(e){f(e.image.src,e.blobInfo.blobUri()),e.image.src=e.blobInfo.blobUri(),e.image.removeAttribute("data-mce-src")}),e}))};return l.on("SetContent",function(){(Ns(l)?e:v)()}),l.on("RawSaveContent",function(e){e.content=a(e.content)}),l.on("GetContent",function(e){e.source_view||"raw"===e.format||"tree"===e.format||(e.content=a(e.content))}),l.on("PostRender",function(){l.parser.addNodeFilter("img",function(e){Y(e,function(e){var t,n=e.attr("src");m.getByUri(n)||(t=g.getResultUri(n))&&e.attr("src",t)})})}),{blobCache:m,addFilter:function(e){p.push(e)},uploadImages:n,uploadImagesAuto:e,scanForImages:v,destroy:function(){m.destroy(),g.destroy(),s=u=null}}}function Xv(e,t){function m(e){o="string"==typeof e?{name:e,classes:[],attrs:{}}:e;var t,n=dy.create(o.name),r=n;return(t=o).classes.length&&dy.addClass(r,t.classes.join(" ")),dy.setAttribs(r,t.attrs),n}var n,o,r,g=t&&t.schema||to({}),p=function(n,e,t){var r,o,i,a,u,s,c,l=0<e.length&&e[0],f=l&&l.name,d=(a=f,u="string"!=typeof(i=n)?i.nodeName.toLowerCase():i,!(!(c=(s=g.getElementRule(u))&&s.parentsRequired)||!c.length)&&(a&&-1!==Et.inArray(c,a)?a:c[0]));if(d)f===d?(o=e[0],e=e.slice(1)):o=d;else if(l)o=e[0],e=e.slice(1);else if(!t)return n;return o&&(r=m(o)).appendChild(n),t&&(r||(r=dy.create("div")).appendChild(n),Et.each(t,function(e){var t=m(e);r.insertBefore(t,n)})),p(r,e,o&&o.siblings)};return e&&e.length?(n=m(o=e[0]),(r=dy.create("div")).appendChild(p(n,e.slice(1),o.siblings)),r):""}function Yv(e){var t,a={classes:[],attrs:{}};return"*"!==(e=a.selector=Et.trim(e))&&(t=e.replace(/(?:([#\.]|::?)([\w\-]+)|(\[)([^\]]+)\]?)/g,function(e,t,n,r,o){switch(t){case"#":a.attrs.id=n;break;case".":a.classes.push(n);break;case":":-1!==Et.inArray("checked disabled enabled read-only required".split(" "),n)&&(a.attrs[n]=n)}var i;return"["!==r||(i=o.match(/([\w\-]+)(?:\=\"([^\"]+))?/))&&(a.attrs[i[1]]=i[2]),""})),a.name=t||"div",a}function Gv(n,e){var r,t,o="",i=(t=n.getParam("preview_styles","font-family font-size font-weight font-style text-decoration text-transform color background-color border border-radius outline text-shadow"),X(t)?t:"");if(""===i)return"";function a(e){return e.replace(/%(\w+)/g,"")}if("string"==typeof e){if(!(e=n.formatter.get(e)))return;e=e[0]}if("preview"in e){var u=ue(e,"preview");if(fn(u,!1))return"";i=u.getOr(i)}var s,c=e.block||e.inline||"span",l=(s=e.selector)&&"string"==typeof s?(s=(s=s.split(/\s*,\s*/)[0]).replace(/\s*(~\+|~|\+|>)\s*/g,"$1"),Et.map(s.split(/(?:>|\s+(?![^\[\]]+\]))/),function(e){var t=Et.map(e.split(/(?:~\+|~|\+)/),Yv),n=t.pop();return t.length&&(n.siblings=t),n}).reverse()):[],f=l.length?(l[0].name||(l[0].name=c),c=e.selector,Xv(l,n)):Xv([c],n),d=dy.select(c,f)[0]||f.firstChild;return fy(e.styles,function(e,t){var n=a(e);n&&dy.setStyle(d,t,n)}),fy(e.attributes,function(e,t){var n=a(e);n&&dy.setAttrib(d,t,n)}),fy(e.classes,function(e){var t=a(e);dy.hasClass(d,t)||dy.addClass(d,t)}),n.fire("PreviewFormats"),dy.setStyles(f,{position:"absolute",left:-65535}),n.getBody().appendChild(f),r=dy.getStyle(n.getBody(),"fontSize",!0),r=/px$/.test(r)?parseInt(r,10):0,fy(i.split(" "),function(e){var t=dy.getStyle(d,e,!0);if(!("background-color"===e&&/transparent|rgba\s*\([^)]+,\s*0\)/.test(t)&&(t=dy.getStyle(n.getBody(),e,!0),"#ffffff"===dy.toHex(t).toLowerCase())||"color"===e&&"#000000"===dy.toHex(t).toLowerCase())){if("font-size"===e&&/em|%$/.test(t)){if(0===r)return;t=parseFloat(t)/(/%$/.test(t)?100:1)*r+"px"}"border"===e&&t&&(o+="padding:0 2px;"),o+=e+":"+t+";"}}),n.fire("AfterPreviewFormats"),dy.remove(f),o}function Jv(c){var e,r,t,n,o,i,a=(n={},(o=function(e,t){e&&(X(e)?(Y(t=!S(t)?[t]:t,function(e){b(e.deep)&&(e.deep=!fl(e)),b(e.split)&&(e.split=!fl(e)||dl(e)),b(e.remove)&&fl(e)&&!dl(e)&&(e.remove="none"),fl(e)&&dl(e)&&(e.mixed=!0,e.block_expand=!0),X(e.classes)&&(e.classes=e.classes.split(/\s+/))}),n[e]=t):ne(e,function(e,t){o(t,e)}))})((r=(e=c).dom,t={valigntop:[{selector:"td,th",styles:{verticalAlign:"top"}}],valignmiddle:[{selector:"td,th",styles:{verticalAlign:"middle"}}],valignbottom:[{selector:"td,th",styles:{verticalAlign:"bottom"}}],alignleft:[{selector:"figure.image",collapsed:!1,classes:"align-left",ceFalseOverride:!0,preview:"font-family font-size"},{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li",styles:{textAlign:"left"},inherit:!1,preview:!1,defaultBlock:"div"},{selector:"img,table,audio,video",collapsed:!1,styles:{float:"left"},preview:"font-family font-size"}],aligncenter:[{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li",styles:{textAlign:"center"},inherit:!1,preview:"font-family font-size",defaultBlock:"div"},{selector:"figure.image",collapsed:!1,classes:"align-center",ceFalseOverride:!0,preview:"font-family font-size"},{selector:"img,audio,video",collapsed:!1,styles:{display:"block",marginLeft:"auto",marginRight:"auto"},preview:!1},{selector:"table",collapsed:!1,styles:{marginLeft:"auto",marginRight:"auto"},preview:"font-family font-size"}],alignright:[{selector:"figure.image",collapsed:!1,classes:"align-right",ceFalseOverride:!0,preview:"font-family font-size"},{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li",styles:{textAlign:"right"},inherit:!1,preview:"font-family font-size",defaultBlock:"div"},{selector:"img,table,audio,video",collapsed:!1,styles:{float:"right"},preview:"font-family font-size"}],alignjustify:[{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li",styles:{textAlign:"justify"},inherit:!1,defaultBlock:"div",preview:"font-family font-size"}],bold:[{inline:"strong",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{fontWeight:"bold"}},{inline:"b",remove:"all",preserve_attributes:["class","style"]}],italic:[{inline:"em",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{fontStyle:"italic"}},{inline:"i",remove:"all",preserve_attributes:["class","style"]}],underline:[{inline:"span",styles:{textDecoration:"underline"},exact:!0},{inline:"u",remove:"all",preserve_attributes:["class","style"]}],strikethrough:[{inline:"span",styles:{textDecoration:"line-through"},exact:!0},{inline:"strike",remove:"all",preserve_attributes:["class","style"]},{inline:"s",remove:"all",preserve_attributes:["class","style"]}],forecolor:{inline:"span",styles:{color:"%value"},links:!0,remove_similar:!0,clear_child_styles:!0},hilitecolor:{inline:"span",styles:{backgroundColor:"%value"},links:!0,remove_similar:!0,clear_child_styles:!0},fontname:{inline:"span",toggle:!1,styles:{fontFamily:"%value"},clear_child_styles:!0},fontsize:{inline:"span",toggle:!1,styles:{fontSize:"%value"},clear_child_styles:!0},lineheight:{selector:"h1,h2,h3,h4,h5,h6,p,li,td,th,div",defaultBlock:"p",styles:{lineHeight:"%value"}},fontsize_class:{inline:"span",attributes:{class:"%value"}},blockquote:{block:"blockquote",wrapper:!0,remove:"all"},subscript:{inline:"sub"},superscript:{inline:"sup"},code:{inline:"code"},link:{inline:"a",selector:"a",remove:"all",split:!0,deep:!0,onmatch:function(e,t,n){return zn(e)&&e.hasAttribute("href")},onformat:function(n,e,t){Et.each(t,function(e,t){r.setAttrib(n,t,e)})}},lang:{inline:"span",clear_child_styles:!0,remove_similar:!0,attributes:{lang:"%value","data-mce-lang":function(e){var t;return null!==(t=null==e?void 0:e.customValue)&&void 0!==t?t:null}}},removeformat:[{selector:"b,strong,em,i,font,u,strike,s,sub,sup,dfn,code,samp,kbd,var,cite,mark,q,del,ins,small",remove:"all",split:!0,expand:!1,block_expand:!0,deep:!0},{selector:"span",attributes:["style","class"],remove:"empty",split:!0,expand:!1,deep:!0},{selector:"*",attributes:["style","class"],split:!1,expand:!1,deep:!0}]},Et.each("p h1 h2 h3 h4 h5 h6 div address pre dt dd samp".split(/\s/),function(e){t[e]={block:e,remove:"all"}}),t)),o(e.getParam("formats")),{get:function(e){return V(e)?n[e]:n},has:function(e){return Ne(n,e)},register:o,unregister:function(e){return e&&n[e]&&delete n[e],n}}),l=ru(null);return function(e){e.addShortcut("meta+b","","Bold"),e.addShortcut("meta+i","","Italic"),e.addShortcut("meta+u","","Underline");for(var t=1;t<=6;t++)e.addShortcut("access+"+t,"",["FormatBlock",!1,"h"+t]);e.addShortcut("access+7","",["FormatBlock",!1,"p"]),e.addShortcut("access+8","",["FormatBlock",!1,"div"]),e.addShortcut("access+9","",["FormatBlock",!1,"address"])}(c),(i=c).on("mouseup keydown",function(e){var t=i,n=e.keyCode,r=t.selection,o=t.getBody();Fg(t,null,!1),8!==n&&46!==n||!r.isCollapsed()||r.getStart().innerHTML!==vp||Fg(t,Hc(o,r.getStart())),37!==n&&39!==n||Fg(t,Hc(o,r.getStart()))}),{get:a.get,has:a.has,register:a.register,unregister:a.unregister,apply:function(e,t,n){var r=e,o=t,i=n;hh(c).formatter.apply(r,o,i)},remove:function(e,t,n,r){var o=e,i=t,a=n,u=r;hh(c).formatter.remove(o,i,a,u)},toggle:function(e,t,n){var r=e,o=t,i=n;hh(c).formatter.toggle(r,o,i)},match:function(e,t,n,r){return o=e,i=t,a=n,u=r,hh(c).formatter.match(o,i,a,u);var o,i,a,u},closest:function(e){return t=e,hh(c).formatter.closest(t);var t},matchAll:function(e,t){return n=e,r=t,hh(c).formatter.matchAll(n,r);var n,r},matchNode:function(e,t,n,r){return o=e,i=t,a=n,u=r,hh(c).formatter.matchNode(o,i,a,u);var o,i,a,u},canApply:function(e){return t=e,hh(c).formatter.canApply(t);var t},formatChanged:function(e,t,n,r){return o=l,i=e,a=t,u=n,s=r,hh(c).formatter.formatChanged(o,i,a,u,s);var o,i,a,u,s},getCssText:A(Gv,c)}}function Qv(e){switch(e.toLowerCase()){case"undo":case"redo":case"mcerepaint":case"mcefocus":return 1;default:return}}function Zv(s){var e,n,r,o,i,c=cu(),l=ru(0),f=ru(0),d={data:[],typing:!1,beforeChange:function(){var e=l,t=c;hh(s).undoManager.beforeChange(e,t)},add:function(e,t){return n=d,r=f,o=l,i=c,a=e,u=t,hh(s).undoManager.add(n,r,o,i,a,u);var n,r,o,i,a,u},undo:function(){return e=d,t=l,n=f,hh(s).undoManager.undo(e,t,n);var e,t,n},redo:function(){return e=f,t=d.data,hh(s).undoManager.redo(e,t);var e,t},clear:function(){var e=d,t=f;hh(s).undoManager.clear(e,t)},reset:function(){var e=d;hh(s).undoManager.reset(e)},hasUndo:function(){return e=d,t=f,hh(s).undoManager.hasUndo(e,t);var e,t},hasRedo:function(){return e=d,t=f,hh(s).undoManager.hasRedo(e,t);var e,t},transact:function(e){return t=d,n=l,r=e,hh(s).undoManager.transact(t,n,r);var t,n,r},ignore:function(e){var t=l,n=e;hh(s).undoManager.ignore(t,n)},extra:function(e,t){var n=d,r=f,o=e,i=t;hh(s).undoManager.extra(n,r,o,i)}};return mh(s)||(r=d,o=l,i=ru(!1),(n=s).on("init",function(){r.add()}),n.on("BeforeExecCommand",function(e){Qv(e.command)||(fh(r,o),r.beforeChange())}),n.on("ExecCommand",function(e){Qv(e.command)||a(e)}),n.on("ObjectResizeStart cut",function(){r.beforeChange()}),n.on("SaveContent ObjectResized blur",a),n.on("dragend",a),n.on("keyup",function(e){var t=e.keyCode;e.isDefaultPrevented()||((33<=t&&t<=36||37<=t&&t<=40||45===t||e.ctrlKey)&&(a(),n.nodeChanged()),46!==t&&8!==t||n.nodeChanged(),i.get()&&r.typing&&!1===sh(oh(n),r.data[0])&&(!1===n.isDirty()&&(n.setDirty(!0),n.fire("change",{level:r.data[0],lastLevel:null})),n.fire("TypingUndo"),i.set(!1),n.nodeChanged()))}),n.on("keydown",function(e){var t,n=e.keyCode;e.isDefaultPrevented()||(33<=n&&n<=36||37<=n&&n<=40||45===n?r.typing&&a(e):(t=e.ctrlKey&&!e.altKey||e.metaKey,!(n<16||20<n)||224===n||91===n||r.typing||t||(r.beforeChange(),lh(r,!0,o),r.add({},e),i.set(!0))))}),n.on("mousedown",function(e){r.typing&&a(e)}),n.on("input",function(e){e.inputType&&("insertReplacementText"===e.inputType||"insertText"===e.inputType&&null===e.data||"insertFromPaste"===e.inputType||"insertFromDrop"===e.inputType)&&a(e)}),n.on("AddUndo Undo Redo ClearUndos",function(e){e.isDefaultPrevented()||n.nodeChanged()})),(e=s).addShortcut("meta+z","","Undo"),e.addShortcut("meta+y,meta+shift+z","","Redo"),d;function a(e){lh(r,!1,o),r.add({},e)}}function eb(e){return"keydown"===e.type||"keyup"===e.type}function tb(e){var t=e.keyCode;return t===Bf.BACKSPACE||t===Bf.DELETE}function nb(e,t){return ze(Nt.fromDom(t),e.getParam("inline_boundaries_selector","a[href],code,.mce-annotation","string"))}function rb(e,t,n){var r,o,i=(r=e,o=t,U(Ja.DOM.getParents(n.container(),"*",o),r));return ve.from(i[i.length-1])}function ob(e,t){if(!t)return t;var n=t.container(),r=t.offset();return e?Lr(n)?jn(n.nextSibling)?as(n.nextSibling,0):as.after(n):Fr(t)?as(n,r+1):t:Lr(n)?jn(n.previousSibling)?as(n.previousSibling,n.previousSibling.data.length):as.before(n):Ur(t)?as(n,r-1):t}function ib(e){return fo(e)||go(e)}function ab(e,t){return Ve(e,t)?pr(t,ib,(n=e,function(e){return je(n,Nt.fromDom(e.dom.parentNode))})):ve.none();var n}function ub(e){var t,n,r;e.dom.isEmpty(e.getBody())&&(e.setContent(""),r=(n=(t=e).getBody()).firstChild&&t.dom.isBlock(n.firstChild)?n.firstChild:n,t.selection.setCursorLocation(r,0))}function sb(e,t){return{from:e,to:t}}function cb(e,t){return ab(Nt.fromDom(e),Nt.fromDom(t.container())).map(function(e){return{block:e,position:t}})}function lb(e){var t,n=z(t=Dn(e),lo).fold(J(t),function(e){return t.slice(0,e)});return Y(n,Ln),n}function fb(e,t){return M(hm(t,e).reverse(),function(e){return Wr(e)}).each(Ln)}function db(e,t,n,r){if(Wr(n))return mm(n),ef(n.dom);0===U(Lt(r),function(e){return!Wr(e)}).length&&Wr(t)&&qt(r,Nt.fromTag("br"));var o=Zl(n.dom,as.before(r.dom));return Y(lb(t),function(e){qt(r,e)}),fb(e,t),o}function mb(e,t,n){if(Wr(n))return Ln(n),Wr(t)&&mm(t),ef(t.dom);var r=tf(n.dom);return Y(lb(t),function(e){Pn(n,e)}),fb(e,t),r}function gb(e,t){Uc(e,t.dom).map(function(e){return e.getNode()}).map(Nt.fromDom).filter(Br).each(Ln)}function pb(e,t,n){return gb(!0,t),gb(!1,n),(Ve(o=n,r=t)?(i=hm(r,o),ve.from(i[i.length-1])):ve.none()).fold(A(mb,e,t,n),A(db,e,t,n));var r,o,i}function hb(e,t,n,r){return t?pb(e,r,n):pb(e,n,r)}function vb(t,n){var e,r,o,i,a,u,s,c=Nt.fromDom(t.getBody()),l=(e=c.dom,r=n,((o=t.selection.getRng()).collapsed?(a=r,u=cb(i=e,as.fromRangeStart(o)),s=u.bind(function(e){return Gl(a,i,e.position).bind(function(e){return cb(i,e).map(function(e){return t=i,n=a,Wn((r=e).position.getNode())&&!1===Wr(r.block)?Uc(!1,r.block.dom).bind(function(e){return e.isEqual(r.position)?Gl(n,t,e).bind(function(e){return cb(t,e)}):ve.some(r)}).getOr(r):r;var t,n,r})})}),dn(u,s,sb).filter(function(e){return!1===je(e.from.block,e.to.block)&&Ot((n=e).from.block).bind(function(t){return Ot(n.to.block).filter(function(e){return je(t,e)})}).isSome()&&!1===Yn((t=e).from.block.dom)&&!1===Yn(t.to.block.dom);var t,n})):ve.none()).bind(function(e){return hb(c,n,e.from.block,e.to.block)}));return l.each(function(e){t.selection.setRng(e.toRange())}),l.isSome()}function bb(e,t){var n=Nt.fromDom(t),r=A(je,e);return gr(n,ho,r).isSome()}function yb(e){var n,r,o,t,i,a,u,s,c,l,f=Nt.fromDom(e.getBody()),d=e.selection.getRng();return a=d,c=Zl((i=f).dom,as.fromRangeStart(a)).isNone(),l=Ql(i.dom,as.fromRangeEnd(a)).isNone(),!bb(u=i,(s=a).startContainer)&&!bb(u,s.endContainer)&&c&&l?((t=e).setContent(""),t.selection.setCursorLocation(),!0):(n=f,r=e.selection,o=r.getRng(),dn(ab(n,Nt.fromDom(o.startContainer)),ab(n,Nt.fromDom(o.endContainer)),function(e,t){return!1===je(e,t)&&(o.deleteContents(),hb(n,!0,e,t).each(function(e){r.setRng(e.toRange())}),!0)}).getOr(!1))}function Cb(e,t){return!e.selection.isCollapsed()&&yb(e)}function xb(e,t,n,r,o){return ve.from(t._selectionOverrides.showCaret(e,n,r,o))}function wb(e,t){var n,r;return e.fire("BeforeObjectSelected",{target:t}).isDefaultPrevented()?ve.none():ve.some(((r=(n=t).ownerDocument.createRange()).selectNode(n),r))}function Sb(e,t,n){var r=Zs(1,e.getBody(),t),o=as.fromRangeStart(r),i=o.getNode();if(wc(i))return xb(1,e,i,!o.isAtEnd(),!1);var a=o.getNode(!0);if(wc(a))return xb(1,e,a,!1,!1);var u=e.dom.getParent(o.getNode(),function(e){return yy(e)||by(e)});return wc(u)?xb(1,e,u,!1,n):ve.none()}function Eb(e,t,n){return t.collapsed?Sb(e,t,n).getOr(t):t}function Nb(e){return ep(e)||Gg(e)}function kb(e){return tp(e)||Jg(e)}function _b(n,r,e,t,o,i){var a,u;return xb(t,n,i.getNode(!o),o,!0).each(function(e){var t;r.collapsed?(t=r.cloneRange(),o?t.setEnd(e.startContainer,e.startOffset):t.setStart(e.endContainer,e.endOffset),t.deleteContents()):r.deleteContents(),n.selection.setRng(e)}),a=n.dom,jn(u=e)&&0===u.data.length&&a.remove(u),!0}function Ab(e,t){var n=e.selection.getRng();if(!jn(n.commonAncestorContainer))return!1;var r=t?ic.Forwards:ic.Backwards,o=Pc(e.getBody()),i=A(rc,t?o.next:o.prev),a=t?Nb:kb,u=tc(r,e.getBody(),n),s=ob(t,i(u));if(!s||!oc(u,s))return!1;if(a(s))return _b(e,n,u.getNode(),r,t,s);var c=i(s);return!!(c&&a(c)&&oc(s,c))&&_b(e,n,u.getNode(),r,t,c)}function Rb(l,f,d){return Gl(f,l,d).bind(function(e){return s=e.getNode(),ho(Nt.fromDom(s))||go(Nt.fromDom(s))||(o=l,u=e,ec(!(i=f),a=d).fold(function(){return ec(i,u).fold(R,c)},c))?ve.none():f&&Yn(e.getNode())||!1===f&&Yn(e.getNode(!0))?(t=l,n=d,r=e.getNode(!1===f),ab(Nt.fromDom(t),Nt.fromDom(n.getNode())).map(function(e){return Wr(e)?Cy.remove(e.dom):Cy.moveToElement(r)}).orThunk(function(){return ve.some(Cy.moveToElement(r))})):f&&tp(d)||!1===f&&ep(d)?ve.some(Cy.moveToPosition(e)):ve.none();var t,n,r,o,i,a,u,s;function c(e){return Or(Nt.fromDom(e))&&!Ys(a,u,o)}})}function Db(e,t){return ve.from(pf(e.getBody(),t))}function Tb(m,g){var e=m.selection.getNode();return Db(m,e).filter(Yn).fold(function(){return s=m.getBody(),l=Zs((c=g)?1:-1,s,m.selection.getRng()),f=as.fromRangeStart(l),d=Nt.fromDom(s),(!1===c&&tp(f)?ve.some(Cy.remove(f.getNode(!0))):c&&ep(f)?ve.some(Cy.remove(f.getNode())):!1===c&&ep(f)&&Em(d,f)?ap(d,f).map(function(e){return Cy.remove(e.getNode())}):c&&tp(f)&&Sm(d,f)?up(d,f).map(function(e){return Cy.remove(e.getNode())}):(r=s,e=c,a=(o=f).getNode(!1===(i=e)),u=i?"after":"before",zn(a)&&a.getAttribute("data-mce-caret")===u?(n=o.getNode(!1===(t=e)),(t&&Yn(n.nextSibling)?ve.some(Cy.moveToElement(n.nextSibling)):!1===t&&Yn(n.previousSibling)?ve.some(Cy.moveToElement(n.previousSibling)):ve.none()).fold(function(){return Rb(r,e,o)},ve.some)):Rb(r,e,o).bind(function(e){return t=r,n=o,e.fold(function(e){return ve.some(Cy.remove(e))},function(e){return ve.some(Cy.moveToElement(e))},function(e){return Ys(n,e,t)?ve.none():ve.some(Cy.moveToPosition(e))});var t,n}))).exists(function(e){return e.fold(function(e){return o._selectionOverrides.hideFakeCaret(),Ym(o,i,Nt.fromDom(e)),!0},(r=i=g,function(e){var t=r?as.before(e):as.after(e);return n.selection.setRng(t.toRange()),!0}),(t=n=o=m,function(e){return t.selection.setRng(e.toRange()),!0}));var t,n,r,o,i});var r,e,o,t,n,i,a,u,s,c,l,f,d},w)}function Ob(e,t){var n=e.selection.getNode();return!(!Yn(n)||Gn(n))&&Db(e,n.parentNode).filter(Yn).fold(function(){return Y(hu(Nt.fromDom(e.getBody()),".mce-offscreen-selection"),Ln),Ym(e,t,Nt.fromDom(e.selection.getNode())),ub(e),!0},w)}function Bb(e){var t,n=e.dom,r=e.selection,o=pf(e.getBody(),r.getNode());return Xn(o)&&n.isBlock(o)&&n.isEmpty(o)&&(t=n.create("br",{"data-mce-bogus":"1"}),n.setHTML(o,""),o.appendChild(t),r.setRng(as.before(t).toRange())),!0}function Pb(e,t){return(e.selection.isCollapsed()?Tb:Ob)(e,t)}function Lb(e,t){return!!e.selection.isCollapsed()&&(n=e,r=t,o=as.fromRangeStart(n.selection.getRng()),Gl(r,n.getBody(),o).filter(function(e){return(r?Xg:Yg)(e)}).bind(function(e){return ve.from(Gs(r?0:-1,e))}).exists(function(e){return n.selection.select(e),!0}));var n,r,o}function Ib(e){return xy(e)&&e.data[0]===Co}function Mb(e){return xy(e)&&e.data[e.data.length-1]===Co}function Fb(e){return e.ownerDocument.createTextNode(Co)}function Ub(e,t){return(e?function(e){if(xy(e.previousSibling))return Mb(e.previousSibling)||e.previousSibling.appendData(Co),e.previousSibling;if(xy(e))return Ib(e)||e.insertData(0,Co),e;var t=Fb(e);return e.parentNode.insertBefore(t,e),t}:function(e){if(xy(e.nextSibling))return Ib(e.nextSibling)||e.nextSibling.insertData(0,Co),e.nextSibling;if(xy(e))return Mb(e)||e.appendData(Co),e;var t=Fb(e);return e.nextSibling?e.parentNode.insertBefore(t,e.nextSibling):e.parentNode.appendChild(t),t})(t)}function zb(e,t){return jn(e.container())?Ub(t,e.container()):Ub(t,e.getNode())}function Hb(e,t){var n=t.get();return n&&e.container()===n&&Lr(n)}function jb(n,e){return e.fold(function(e){vc(n.get());var t=wy(e);return n.set(t),ve.some(as(t,t.length-1))},function(e){return ef(e).map(function(e){if(Hb(e,n))return as(n.get(),1);vc(n.get());var t=zb(e,!0);return n.set(t),as(t,1)})},function(e){return tf(e).map(function(e){if(Hb(e,n))return as(n.get(),n.get().length-1);vc(n.get());var t=zb(e,!1);return n.set(t),as(t,t.length-1)})},function(e){vc(n.get());var t=Sy(e);return n.set(t),ve.some(as(t,1))})}function Vb(e,t){for(var n=0;n<e.length;n++){var r=e[n].apply(null,t);if(r.isSome())return r}return ve.none()}function qb(e,t){return Xs(t,e)||e}function $b(e,t,n){var r=hy(n),o=qb(t,r.container());return rb(e,o,r).fold(function(){return Ql(o,r).bind(A(rb,e,o)).map(function(e){return Ey.before(e)})},ve.none)}function Wb(e,t){return null===Hc(e,t)}function Kb(e,t,n){return rb(e,t,n).filter(A(Wb,t))}function Xb(e,t,n){var r=vy(n);return Kb(e,t,r).bind(function(e){return Zl(e,r).isNone()?ve.some(Ey.start(e)):ve.none()})}function Yb(e,t,n){var r=hy(n);return Kb(e,t,r).bind(function(e){return Ql(e,r).isNone()?ve.some(Ey.end(e)):ve.none()})}function Gb(e,t,n){var r=vy(n),o=qb(t,r.container());return rb(e,o,r).fold(function(){return Zl(o,r).bind(A(rb,e,o)).map(function(e){return Ey.after(e)})},ve.none)}function Jb(e){return!1===(t=Ny(e),"rtl"===Ja.DOM.getStyle(t,"direction",!0)||(n=t.textContent,py.test(n)));var t,n}function Qb(e,t,n){return Vb([$b,Xb,Yb,Gb],[e,t,n]).filter(Jb)}function Zb(e){return e.fold(J("before"),J("start"),J("end"),J("after"))}function ey(e){return e.fold(Ey.before,Ey.before,Ey.after,Ey.after)}function ty(e){return e.fold(Ey.start,Ey.start,Ey.end,Ey.end)}function ny(a,e,u,t,n,s){return dn(rb(e,u,t),rb(e,u,n),function(e,t){return e!==t&&(r=t,o=Xs(e,n=u),i=Xs(r,n),o&&o===i)?Ey.after(a?e:t):s;var n,r,o,i}).getOr(s)}function ry(e,r){return e.fold(w,function(e){return n=r,!(Zb(t=e)===Zb(n)&&Ny(t)===Ny(n));var t,n})}function oy(e,t){return e?t.fold(i(ve.some,Ey.start),ve.none,i(ve.some,Ey.after),ve.none):t.fold(ve.none,i(ve.some,Ey.before),ve.none,i(ve.some,Ey.end))}function iy(e,a,u,s){var t=ob(e,s),c=Qb(a,u,t);return Qb(a,u,t).bind(A(oy,e)).orThunk(function(){return n=a,r=u,o=c,i=ob(t=e,s),Gl(t,r,i).map(A(ob,t)).fold(function(){return o.map(ey)},function(e){return Qb(n,r,e).map(A(ny,t,n,r,i,e)).filter(A(ry,o))}).filter(Jb);var t,n,r,o,i})}function ay(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];var r=window.console;r&&(r.error||r.log).apply(r,Ae([e],t,!1))}var uy,sy,cy=function(t,e){var n=t.editorManager.baseURL+"/skins/content",r="content"+t.editorManager.suffix+".css",o=!0===t.inline;return T(e,function(e){return/^[a-z0-9\-]+$/i.test(e)&&!o?n+"/"+e+"/"+r:t.documentBaseURI.toAbsolute(e)})},ly=0,fy=Et.each,dy=Ja.DOM,my=[9,27,Bf.HOME,Bf.END,19,20,44,144,145,33,34,45,16,17,18,91,92,93,Bf.DOWN,Bf.UP,Bf.LEFT,Bf.RIGHT].concat(xt.browser.isFirefox()?[224]:[]),gy="data-mce-placeholder",py=/[\u0591-\u07FF\uFB1D-\uFDFF\uFE70-\uFEFC]/,hy=A(ob,!0),vy=A(ob,!1),by=Xn,yy=Yn,Cy=or([{remove:["element"]},{moveToElement:["element"]},{moveToPosition:["position"]}]),xy=jn,wy=A(Ub,!0),Sy=A(Ub,!1),Ey=or([{before:["element"]},{start:["element"]},{end:["element"]},{after:["element"]}]),Ny=function(e){return e.fold(u,u,u,u)};function ky(e,t,n){var r=e?1:-1;return t.setRng(as(n.container(),n.offset()+r).toRange()),t.getSel().modify("move",e?"forward":"backward","word"),!0}function _y(e,t){return e===ic.Backwards?q(t):t}function Ay(e,t,n,r){for(var o,i,a,u,s=Pc(n),c=r,l=[];c;){var f=(a=s,u=c,t===ic.Forwards?a.next(u):a.prev(u));if(!f)break;if(Wn(f.getNode(!1)))return t===ic.Forwards?{positions:_y(t,l).concat([f]),breakType:uy.Br,breakAt:ve.some(f)}:{positions:_y(t,l),breakType:uy.Br,breakAt:ve.some(f)};if(f.isVisible()){if(e(c,f)){var d=(o=c,Wn((i=f).getNode(t===ic.Forwards))?uy.Br:!1===Ys(o,i)?uy.Block:uy.Wrap);return{positions:_y(t,l),breakType:d,breakAt:ve.some(f)}}l.push(f),c=f}else c=f}return{positions:_y(t,l),breakType:uy.Eol,breakAt:ve.none()}}function Ry(n,r,o,e){return r(o,e).breakAt.map(function(e){var t=r(o,e).positions;return n===ic.Backwards?t.concat(e):[e].concat(t)}).getOr([])}function Dy(e,i){return L(e,function(e,o){return e.fold(function(){return ve.some(o)},function(r){return dn(Q(r.getClientRects()),Q(o.getClientRects()),function(e,t){var n=Math.abs(i-e.left);return Math.abs(i-t.left)<=n?o:r}).or(e)})},ve.none())}function Ty(t,e){return Q(e.getClientRects()).bind(function(e){return Dy(t,e.left)})}function Oy(n){function e(e){return T(e,function(e){var t=ku(e);return t.node=n,t})}if(zn(n))return e(n.getClientRects());if(jn(n)){var t=n.ownerDocument.createRange();return t.setStart(n,0),t.setEnd(n,n.data.length),e(t.getClientRects())}}function By(e){return H(e,Oy)}A(iy,!1),A(iy,!0),(sy=uy={})[sy.Br=0]="Br",sy[sy.Block=1]="Block",sy[sy.Wrap=2]="Wrap",sy[sy.Eol=3]="Eol";var Py,Ly,Iy=A(Ay,as.isAbove,-1),My=A(Ay,as.isBelow,1),Fy=A(Ry,-1,Iy),Uy=A(Ry,1,My);function zy(o,i,a,e,u,t){function n(e){var t=By([e]);-1===o&&(t=t.reverse());for(var n=0;n<t.length;n++){var r=t[n];if(!a(r,l)){if(0<c.length&&i(r,pe(c))&&s++,r.line=s,u(r))return!0;c.push(r)}}}var s=0,c=[],l=pe(t.getClientRects());if(!l)return c;var r=t.getNode();return n(r),function(e,t,n,r){for(;r=Ks(r,e,Vr,t);)if(n(r))return}(o,e,n,r),c}function Hy(t){return function(e){return e.line>t}}function jy(t){return function(e){return e.line===t}}function Vy(e,t){return Math.abs(e.left-t)}function qy(e,t){return Math.abs(e.right-t)}function $y(e,t){return e>=t.left&&e<=t.right}function Wy(e,t){return e>=t.top&&e<=t.bottom}function Ky(e,o,i){return void 0===i&&(i=w),me(e,function(e,t){if($y(o,t))return i(t)?t:e;if($y(o,e))return i(e)?e:t;var n=Math.min(Vy(e,o),qy(e,o)),r=Math.min(Vy(t,o),qy(t,o));return r===n&&se(t,"node")&&MC(t.node)||r<n?t:e})}function Xy(e,t,n,r,o){var i=FC(r,e,Vr,t,!o);do{if(!i||n(i))return}while(i=FC(i,e,Vr,t))}function Yy(e,t,n){function r(e){return!cn(e.node)&&!Jn(e.node)}var o,i,a,u=By(U(xe(e.getElementsByTagName("*")),$s)),s=U(u,A(Wy,n));if((a=Ky(s,t,r))&&((a=Ky(function(e,r,t){function n(t,e){var n=U(By([e]),function(e){return!t(e,r)});return o=o.concat(n),0===n.length}void 0===t&&(t=!0);var o=[];return o.push(r),Xy(Py.Up,e,A(n,Ru),r.node,t),Xy(Py.Down,e,A(n,Du),r.node,t),o}(e,a,r(a)),t,r))&&$s(a.node)))return{node:(o=a).node,before:Vy(o,i=t)<qy(o,i)};return null}function Gy(e,t){e.selection.setRng(t),Zf(e,e.selection.getRng())}function Jy(e,t,n){return ve.some(Eb(e,t,n))}function Qy(e,t,n,r,o,i){var a=t===ic.Forwards,u=Pc(e.getBody()),s=A(rc,a?u.next:u.prev),c=a?r:o;if(!n.collapsed){var l=Ou(n);if(i(l))return xb(t,e,l,t===ic.Backwards,!1)}var f=tc(t,e.getBody(),n);if(c(f))return wb(e,f.getNode(!a));var d=ob(a,s(f)),m=Hr(n);if(!d)return m?ve.some(n):ve.none();if(c(d))return xb(t,e,d.getNode(!a),a,!1);var g=s(d);return g&&c(g)&&oc(d,g)?xb(t,e,g.getNode(!a),a,!1):m?Jy(e,d.toRange(),!1):ve.none()}function Zy(t,e,n,r,o,i){var a=tc(e,t.getBody(),n),u=pe(a.getClientRects()),s=e===Py.Down;if(!u)return ve.none();var c,l=U((s?IC:LC)(t.getBody(),Hy(1),a),jy(1)),f=u.left,d=Ky(l,f);if(d&&i(d.node)){var m=Math.abs(f-d.left),g=Math.abs(f-d.right);return xb(e,t,d.node,m<g,!1)}if(c=r(a)?a.getNode():o(a)?a.getNode(!0):Ou(n)){var p=function(e,t,n,r){function o(e){return pe(e.getClientRects())}var i,a,u,s=Pc(t),c=[],l=0,f=1===e?(i=s.next,a=Du,u=Ru,as.after(r)):(i=s.prev,a=Ru,u=Du,as.before(r)),d=o(f);do{if(f.isVisible()){var m=o(f);if(!u(m,d)){0<c.length&&a(m,pe(c))&&l++;var g=ku(m);if(g.position=f,g.line=l,n(g))return c;c.push(g)}}}while(f=i(f));return c}(e,t.getBody(),Hy(1),c),h=Ky(U(p,jy(1)),f);if(h)return Jy(t,h.position.toRange(),!1);if(h=pe(U(p,jy(0))))return Jy(t,h.position.toRange(),!1)}return 0===l.length?UC(t,s).filter(s?o:r).map(function(e){return Eb(t,e.toRange(),!1)}):ve.none()}function e0(t,e,n){return UC(t,e).filter(n).exists(function(e){return t.selection.setRng(e.toRange()),!0})}function t0(e,t){var n=e.dom.createRng();n.setStart(t.container(),t.offset()),n.setEnd(t.container(),t.offset()),e.selection.setRng(n)}function n0(e,t){e?t.setAttribute("data-mce-selected","inline-boundary"):t.removeAttribute("data-mce-selected")}function r0(t,e,n){return jb(e,n).map(function(e){return t0(t,e),n})}function o0(e,t,n){return!!Ps(e)&&(o=t,i=n,a=(r=e).getBody(),u=as.fromRangeStart(r.selection.getRng()),iy(i,A(nb,r),a,u).bind(function(e){return r0(r,o,e)}).isSome());var r,o,i,a,u}function i0(e,t,n){return!!Ps(t)&&(r=e,i=(o=t).selection.getRng(),a=r?as.fromRangeEnd(i):as.fromRangeStart(i),!!y(o.selection.getSel().modify)&&(r&&Fr(a)?ky(!0,o.selection,a):!(r||!Ur(a))&&ky(!1,o.selection,a)));var r,o,i,a}function a0(g){var p=ru(null),h=A(nb,g);return g.on("NodeChange",function(e){var n,r,o,t,i,a,u,s,c,l,f,d,m;!Ps(g)||xt.browser.isIE()&&e.initial||(i=h,a=g.dom,u=e.parents,Y($(s=U(T(hu(Nt.fromDom(a.getRoot()),'*[data-mce-selected="inline-boundary"]'),function(e){return e.dom}),i),c=U(u,i)),A(n0,!1)),Y($(c,s),A(n0,!0)),f=p,(l=g).selection.isCollapsed()&&!0!==l.composing&&f.get()&&(d=as.fromRangeStart(l.selection.getRng()),as.isTextPosition(d)&&!1===(Fr(m=d)||Ur(m))&&(t0(l,Hs(f.get(),d)),f.set(null))),n=h,r=g,o=p,t=e.parents,r.selection.isCollapsed()&&Y(U(t,n),function(e){var t=as.fromRangeStart(r.selection.getRng());Qb(n,r.getBody(),t).bind(function(e){return r0(r,o,e)})}))}),p}function u0(n,t,r){if(Ps(n)){var e=UC(n,t).getOrThunk(function(){var e=n.selection.getRng();return t?as.fromRangeEnd(e):as.fromRangeStart(e)});return Qb(A(nb,n),n.getBody(),e).exists(function(e){var t=ey(e);return jb(r,t).exists(function(e){return t0(n,e),!0})})}return!1}function s0(t,n){return function(e){return jb(n,e).exists(function(e){return t0(t,e),!0})}}function c0(r,o,i,a){var u=r.getBody(),s=A(nb,r);r.undoManager.ignore(function(){var e,t,n;r.selection.setRng((e=i,t=a,(n=document.createRange()).setStart(e.container(),e.offset()),n.setEnd(t.container(),t.offset()),n)),r.execCommand("Delete"),Qb(s,u,as.fromRangeStart(r.selection.getRng())).map(ty).map(s0(r,o))}),r.nodeChanged()}function l0(e,t,n){if(e.selection.isCollapsed()&&Ps(e)){var r=as.fromRangeStart(e.selection.getRng());return o=t,a=n,u=r,s=(i=e).getBody(),c=Xs(u.container(),s)||s,l=A(nb,i),(f=Qb(l,c,u)).bind(function(e){return a?e.fold(J(ve.some(ty(e))),ve.none,J(ve.some(ey(e))),ve.none):e.fold(ve.none,J(ve.some(ey(e))),ve.none,J(ve.some(ty(e))))}).map(s0(i,o)).getOrThunk(function(){var t=Fc(a,c,u),e=t.bind(function(e){return Qb(l,c,e)});return dn(f,e,function(){return rb(l,c,u).exists(function(e){return!!dn(ef(o=e),tf(o),function(e,t){var n=ob(!0,e),r=ob(!1,t);return Ql(o,n).forall(function(e){return e.isEqual(r)})}).getOr(!0)&&(Ym(i,a,Nt.fromDom(e)),!0);var o})}).orThunk(function(){return e.bind(function(e){return t.map(function(e){return a?c0(i,o,u,e):c0(i,o,e,u),!0})})}).getOr(!1)})}var i,o,a,u,s,c,l,f;return!1}function f0(e){return 1===zt(e)}function d0(g,p){var t,e=Nt.fromDom(g.getBody()),n=Nt.fromDom(g.selection.getStart()),h=U(z(t=hm(n,e),lo).fold(J(t),function(e){return t.slice(0,e)}),f0);return Z(h).exists(function(e){var t,n,r,o,i,a,u,s,c,l=as.fromRangeStart(g.selection.getRng()),f=p,d=l,m=e.dom;return!(!dn(ef(m),tf(m),function(e,t){var n=ob(!0,e),r=ob(!1,t),o=ob(!1,d);return f?Ql(m,o).exists(function(e){return e.isEqual(r)&&d.isEqual(n)}):Zl(m,o).exists(function(e){return e.isEqual(n)&&d.isEqual(r)})}).getOr(!0)||zc((t=e).dom)&&Pg(t.dom)||(n=p,o=e,0===(c=T(U(h,A(Vg,r=g)),function(e){return e.dom})).length?Ym(r,n,o):(a=o.dom,s=zg(c,(u=Ig(!1)).dom),qt(Nt.fromDom(a),u),Ln(Nt.fromDom(a)),i=as(s,0),r.selection.setRng(i.toRange())),0))})}function m0(e,t){return!!e.selection.isCollapsed()&&d0(e,t)}function g0(e,t,n){return e._selectionOverrides.hideFakeCaret(),Ym(e,t,Nt.fromDom(n)),!0}function p0(e,t){return e.selection.isCollapsed()?(i=e,u=(a=t)?Gg:Jg,s=a?ic.Forwards:ic.Backwards,c=tc(s,i.getBody(),i.selection.getRng()),u(c)?g0(i,a,c.getNode(!a)):ve.from(ob(a,c)).filter(function(e){return u(e)&&oc(c,e)}).exists(function(e){return g0(i,a,e.getNode(!a))})):(r=t,o=(n=e).selection.getNode(),!!Jn(o)&&g0(n,r,o));var n,r,o,i,a,u,s,c}function h0(e){var t=parseInt(e,10);return isNaN(t)?0:t}function v0(e,t){return(e||"table"===kt(t)?"margin":"padding")+("rtl"===xn(t,"direction")?"-right":"-left")}function b0(e){var n,t=jC(e);return!e.mode.isReadOnly()&&(1<t.length||(n=e,j(t,function(e){var t=wn(e,v0(Rs(n),e)).map(h0).getOr(0);return"false"!==n.dom.getContentEditable(e.dom)&&0<t})))}function y0(e){return mo(e)||go(e)}function C0(e,s){var c=e.dom,t=e.selection,n=e.formatter,r=e.getParam("indentation","40px","string"),l=/[a-z%]+$/i.exec(r)[0],f=parseInt(r,10),d=Rs(e),o=Ss(e);e.queryCommandState("InsertUnorderedList")||e.queryCommandState("InsertOrderedList")||""!==o||c.getParent(t.getNode(),c.isBlock)||n.apply("div"),Y(jC(e),function(e){var t,n=c,r=s,o=f,i=l,a=e.dom,u=v0(d,Nt.fromDom(a));"outdent"===r?(t=Math.max(0,h0(a.style[u])-o),n.setStyle(a,u,t?t+i:"")):(t=h0(a.style[u])+o+i,n.setStyle(a,u,t))})}function x0(e,t){if(e.selection.isCollapsed()&&b0(e)){var n=e.dom,r=e.selection.getRng(),o=as.fromRangeStart(r),i=n.getParent(r.startContainer,n.isBlock);if(null!==i&&np(Nt.fromDom(i),o))return C0(e,"outdent"),!0}return!1}function w0(e,t){e.getDoc().execCommand(t,!1,null)}function S0(e){return void 0===e.touches||1!==e.touches.length?ve.none():ve.some(e.touches[0])}function E0(e,t){return Ne(e,t.nodeName)}function N0(e){var t,n,r,o=e.dom,i=e.selection,a=e.schema,u=a.getBlockElements(),s=i.getStart(),c=e.getBody(),l=Ss(e);if(s&&zn(s)&&l){var f=c.nodeName.toLowerCase();if(a.isValidChild(f,l.toLowerCase())&&(d=u,m=c,g=s,!F(pm(Nt.fromDom(g),Nt.fromDom(m)),function(e){return E0(d,e.dom)}))){for(var d,m,g,p,h,v=i.getRng(),b=v.startContainer,y=v.startOffset,C=v.endContainer,x=v.endOffset,w=vd(e),s=c.firstChild;s;)p=u,jn(h=s)||zn(h)&&!E0(p,h)&&!Yc(h)?function(e,t){if(jn(t)){if(0===t.nodeValue.length)return 1;if(/^\s+$/.test(t.nodeValue)&&(!t.nextSibling||E0(e,t.nextSibling)))return 1}}(u,s)?(s=(n=s).nextSibling,o.remove(n)):(t||(t=o.create(l,Es(e)),s.parentNode.insertBefore(t,s),r=!0),s=(n=s).nextSibling,t.appendChild(n)):(t=null,s=s.nextSibling);r&&w&&(v.setStart(b,y),v.setEnd(C,x),i.setRng(v),e.nodeChanged())}}}function k0(e,t){t.hasAttribute("data-mce-caret")&&(zr(t),e.selection.setRng(e.selection.getRng()),e.selection.scrollIntoView(t))}function _0(e,t){var n=vr(Nt.fromDom(e.getBody()),"*[data-mce-caret]").map(function(e){return e.dom}).getOrNull();if(n)return"compositionstart"===t.type?(t.preventDefault(),t.stopPropagation(),void k0(e,n)):void(Mr(n)&&(k0(e,n),e.undoManager.add()))}function A0(e,t,n){var r,o,i,a=Pc(e.getBody()),u=A(rc,1===t?a.next:a.prev);!n.collapsed||""===Ss(e)||(r=e.dom.getParent(n.startContainer,"PRE"))&&(u(as.fromRangeStart(n))||(i=e.dom.create(Ss(e)),(!xt.ie||11<=xt.ie)&&(i.innerHTML='<br data-mce-bogus="1">'),o=i,1===t?e.$(r).after(o):e.$(r).before(o),e.selection.select(o,!0),e.selection.collapse()))}function R0(t,e){return n=t,r=e?ic.Forwards:ic.Backwards,o=n.selection.getRng(),Qy(n,r,o,ep,tp,VC).orThunk(function(){return A0(n,r,o),ve.none()}).exists(function(e){return Gy(t,e),!0});var n,r,o}function D0(t,e){return r=e?1:-1,o=(n=t).selection.getRng(),Zy(n,r,o,function(e){return ep(e)||Qg(e)},function(e){return tp(e)||Zg(e)},VC).orThunk(function(){return A0(n,r,o),ve.none()}).exists(function(e){return Gy(t,e),!0});var n,r,o}function T0(e,t){return e0(e,t,t?tp:ep)}function O0(e){return D(["figcaption"],kt(e))}function B0(e){var t=document.createRange();return t.setStartBefore(e.dom),t.setEndBefore(e.dom),t}function P0(e,t,n){(n?Pn:Wt)(e,t)}function L0(h,v){var b=Nt.fromDom(h.getBody()),y=as.fromRangeStart(h.selection.getRng()),C=Ss(h),x=Es(h),e=y,t=A(je,b);return pr(Nt.fromDom(e.container()),lo,t).filter(O0).exists(function(){if(d=b,m=y,v?(p=d.dom,My(p,m).breakAt.isNone()):(g=d.dom,Iy(g,m).breakAt.isNone())){var e=(t=b,r=x,o=v,""===(n=C)?(l=o,P0(t,f=Nt.fromTag("br"),l),B0(f)):(i=t,a=o,u=r,s=Nt.fromTag(n),c=Nt.fromTag("br"),hn(s,u),Pn(s,c),P0(i,s,a),B0(c)));return h.selection.setRng(e),!0}var t,n,r,o,i,a,u,s,c,l,f,d,m,g,p;return!1})}function I0(e,t){return!!e.selection.isCollapsed()&&L0(e,t)}function M0(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];return function(){return e.apply(null,t)}}function F0(e,t){return M((n=t,H(T(e,function(e){return _e({shiftKey:!1,altKey:!1,ctrlKey:!1,metaKey:!1,keyCode:0,action:te},e)}),function(e){return n.keyCode===e.keyCode&&n.shiftKey===e.shiftKey&&n.altKey===e.altKey&&n.ctrlKey===e.ctrlKey&&n.metaKey===e.metaKey?[e]:[]})),function(e){return e.action()});var n}function U0(t,e){var n=e?ic.Forwards:ic.Backwards,r=t.selection.getRng();return Qy(t,n,r,Gg,Jg,Jn).exists(function(e){return Gy(t,e),!0})}function z0(t,e){var n=e?1:-1,r=t.selection.getRng();return Zy(t,n,r,Gg,Jg,Jn).exists(function(e){return Gy(t,e),!0})}function H0(e,t){return e0(e,t,t?Jg:Gg)}function j0(e,t,n,r,o){var i,a=hu(Nt.fromDom(n),"td,th,caption").map(function(e){return e.dom}),u=U((i=e,H(a,function(e){var t,n={left:(t=ku(e.getBoundingClientRect())).left- -1,top:t.top- -1,right:t.right+-2,bottom:t.bottom+-2,width:t.width+-1,height:t.height+-1};return[{x:n.left,y:i(n),cell:e},{x:n.right,y:i(n),cell:e}]})),function(e){return t(e,o)}),s=r,c=o;return L(u,function(e,r){return e.fold(function(){return ve.some(r)},function(e){var t=Math.sqrt(Math.abs(e.x-s)+Math.abs(e.y-c)),n=Math.sqrt(Math.abs(r.x-s)+Math.abs(r.y-c));return ve.some(n<t?r:e)})},ve.none()).map(function(e){return e.cell})}function V0(e,t,n){var r,o,i=e(t,n);return i.breakType===uy.Wrap&&0===i.positions.length||!Wn(n.getNode())&&i.breakType===uy.Br&&1===i.positions.length?(r=e,o=t,!i.breakAt.exists(function(e){return r(o,e).breakAt.isSome()})):i.breakAt.isNone()}function q0(t,e,n,r){var o,i,a,u=t.selection.getRng(),s=e?1:-1;return!(!qs()||(o=e,i=n,a=as.fromRangeStart(u),!Uc(!o,i).exists(function(e){return e.isEqual(a)}))||(xb(s,t,n,!e,!1).each(function(e){Gy(t,e)}),0))}function $0(u,s,c){var e,t,n=(e=!!s,t=c.getNode(e),zn(t)&&"TABLE"===t.nodeName?ve.some(t):ve.none()),r=!1===s;n.fold(function(){return Gy(u,c.toRange())},function(a){return Uc(r,u.getBody()).filter(function(e){return e.isEqual(c)}).fold(function(){return Gy(u,c.toRange())},function(e){var n,r,o=s,i=a,t=c;(r=Ss(n=u))?n.undoManager.transact(function(){var e=Nt.fromTag(r);hn(e,Es(n)),Pn(e,Nt.fromTag("br")),(o?$t:qt)(Nt.fromDom(i),e);var t=n.dom.createRng();t.setStart(e.dom,0),t.setEnd(e.dom,0),Gy(n,t)}):Gy(n,t.toRange())})})}function W0(e,t,n,r){var o,i,a,u,s,c,l,f,d,m,g=e.selection.getRng(),p=as.fromRangeStart(g),h=e.getBody();if(t||!WC(r,p))return!(!t||!KC(r,p))&&(o=h,d=i=n,$0(e,t,v=Z((m=a=p).getClientRects()).bind(function(e){return $C(d,e.left,e.top)}).bind(function(e){return Ty(ef(t=e).map(function(e){return[e].concat(My(t,e).positions)}).getOr([]),m);var t}).orThunk(function(){return Q(a.getClientRects()).bind(function(e){return Dy(Uy(o,as.after(i)),e.left)})}).getOr(as.after(i))),!0);var v=(u=h,l=s=n,Q((f=c=p).getClientRects()).bind(function(e){return qC(l,e.left,e.top)}).bind(function(e){return Ty(tf(t=e).map(function(e){return Iy(t,e).positions.concat(e)}).getOr([]),f);var t}).orThunk(function(){return Q(c.getClientRects()).bind(function(e){return Dy(Fy(u,as.before(s)),e.left)})}).getOr(as.before(s)));return $0(e,t,v),!0}function K0(n,r,o){return ve.from(n.dom.getParent(n.selection.getNode(),"td,th")).bind(function(t){return ve.from(n.dom.getParent(t,"table")).map(function(e){return o(n,r,e,t)})}).getOr(!1)}function X0(e,t){return K0(e,t,q0)}function Y0(e,t){return K0(e,t,W0)}function G0(e,t){var n,r,o=t,i=e.dom,a=e.schema.getMoveCaretBeforeOnEnterElements();if(t){!/^(LI|DT|DD)$/.test(t.nodeName)||(r=function(e){for(;e;){if(1===e.nodeType||3===e.nodeType&&e.data&&/[\r\n\s]/.test(e.data))return e;e=e.nextSibling}}(t.firstChild))&&/^(UL|OL|DL)$/.test(r.nodeName)&&t.insertBefore(i.doc.createTextNode(yo),t.firstChild);var u=i.createRng();if(t.normalize(),t.hasChildNodes()){for(var s=new Rr(t,t);n=s.current();){if(jn(n)){u.setStart(n,0),u.setEnd(n,0);break}if(a[n.nodeName.toLowerCase()]){u.setStartBefore(n),u.setEndBefore(n);break}o=n,n=s.next()}n||(u.setStart(o,0),u.setEnd(o,0))}else Wn(t)?t.nextSibling&&i.isBlock(t.nextSibling)?(u.setStartBefore(t),u.setEndBefore(t)):(u.setStartAfter(t),u.setEndAfter(t)):(u.setStart(t,0),u.setEnd(t,0));e.selection.setRng(u),Zf(e,u)}}function J0(e){return ve.from(e.dom.getParent(e.selection.getStart(!0),e.dom.isBlock))}function Q0(e,t){return e&&e.parentNode&&e.parentNode.nodeName===t}function Z0(e){return e&&/^(OL|UL|LI)$/.test(e.nodeName)}function eC(e){var t=e.parentNode;return/^(LI|DT|DD)$/.test(t.nodeName)?t:e}function tC(e,t,n){for(var r=e[n?"firstChild":"lastChild"];r&&!zn(r);)r=r[n?"nextSibling":"previousSibling"];return r===t}function nC(e){e.innerHTML='<br data-mce-bogus="1">'}function rC(e,t){return e.nodeName===t||e.previousSibling&&e.previousSibling.nodeName===t}function oC(e,t){return t&&e.isBlock(t)&&!/^(TD|TH|CAPTION|FORM)$/.test(t.nodeName)&&!/^(fixed|absolute)/i.test(t.style.position)&&"true"!==e.getContentEditable(t)}function iC(e,t,n){return!1===jn(t)?n:e?1===n&&t.data.charAt(n-1)===Co?0:n:n===t.data.length-1&&t.data.charAt(n)===Co?t.data.length:n}function aC(e,t){for(var n,r=e.getRoot(),o=t;o!==r&&"false"!==e.getContentEditable(o);)"true"===e.getContentEditable(o)&&(n=o),o=o.parentNode;return o!==r?n:r}function uC(e,t){var n=Ss(e);n&&n.toLowerCase()===t.tagName.toLowerCase()&&function(e,o,t){var i=e.dom;ve.from(t.style).map(i.parseStyle).each(function(e){var t=Sn(Nt.fromDom(o)),n=_e(_e({},t),e);i.setStyles(o,n)}),dn(ve.from(t.class).map(function(e){return e.split(/\s+/)}),ve.from(o.className).map(function(e){return U(e.split(/\s+/),function(e){return""!==e})}),function(t,e){var n=U(e,function(e){return!D(t,e)}),r=Ae(Ae([],t,!0),n,!0);i.setAttrib(o,"class",r.join(" "))});var n=["style","class"],r=ae(t,function(e,t){return!D(n,t)});i.setAttribs(o,r)}(e,t,Es(e))}function sC(a,e){function t(e){var t,n=m,r=l.getTextInlineElements(),o=e||"TABLE"===C||"HR"===C?c.create(e||p):b.cloneNode(!1),i=o;if(!1===a.getParam("keep_styles",!0))c.setAttrib(o,"style",null),c.setAttrib(o,"class",null);else for(;r[n.nodeName]&&(zc(n)||Yc(n)||(t=n.cloneNode(!1),c.setAttrib(t,"id",""),o.hasChildNodes()?t.appendChild(o.firstChild):i=t,o.appendChild(t))),(n=n.parentNode)&&n!==F;);return uC(a,o),nC(i),o}function n(e){var t,n,r=iC(e,m,g);if(!jn(m)||!(e?0<r:r<m.nodeValue.length)){if(m.parentNode===b&&s&&!e)return 1;if(e&&zn(m)&&m===b.firstChild)return 1;if(rC(m,"TABLE")||rC(m,"HR"))return s&&!e||!s&&e;var o=new Rr(m,b);for(jn(m)&&(e&&0===r?o.prev():e||r!==m.nodeValue.length||o.next());t=o.current();){if(zn(t)){if(!t.getAttribute("data-mce-bogus")&&(n=t.nodeName.toLowerCase(),f[n]&&"br"!==n))return}else if(jn(t)&&!qr(t.nodeValue))return;e?o.prev():o.next()}return 1}}function r(){u=/^(H[1-6]|PRE|FIGURE)$/.test(C)&&"HGROUP"!==x?t(p):t(),a.getParam("end_container_on_empty_block",!1)&&oC(c,y)&&c.isEmpty(b)?u=c.split(y,b):c.insertAfter(u,b),G0(a,u)}var o,u,i,s,c=a.dom,l=a.schema,f=l.getNonEmptyElements(),d=a.selection.getRng();Rf(c,d).each(function(e){d.setStart(e.startContainer,e.startOffset),d.setEnd(e.endContainer,e.endOffset)});var m=d.startContainer,g=d.startOffset,p=Ss(a),h=!(!e||!e.shiftKey),v=!(!e||!e.ctrlKey);zn(m)&&m.hasChildNodes()&&(s=g>m.childNodes.length-1,m=m.childNodes[Math.min(g,m.childNodes.length-1)]||m,g=s&&jn(m)?m.nodeValue.length:0);var b,y,C,x,w,S,p,E,N,k,_,A,R,D,T,O,B,P,L,I,M,F=aC(c,m);F&&((p&&!h||!p&&h)&&(m=function(e,t,n,r){var o,i,a,u,s,c,l=p||"P",f=e.dom,d=aC(f,n),m=f.getParent(n,f.isBlock);if(!m||!oC(f,m)){if(s=((m=m||d)===e.getBody()||(c=m)&&/^(TD|TH|CAPTION)$/.test(c.nodeName)?m:m.parentNode).nodeName.toLowerCase(),!m.hasChildNodes())return uC(e,o=f.create(l)),m.appendChild(o),t.setStart(o,0),t.setEnd(o,0),o;for(a=n;a.parentNode!==m;)a=a.parentNode;for(;a&&!f.isBlock(a);)a=(i=a).previousSibling;if(i&&e.schema.isValidChild(s,l.toLowerCase())){for(uC(e,o=f.create(l)),i.parentNode.insertBefore(o,i),a=i;a&&!f.isBlock(a);)u=a.nextSibling,o.appendChild(a),a=u;t.setStart(n,r),t.setEnd(n,r)}}return n}(a,d,m,g)),y=(b=c.getParent(m,c.isBlock))?c.getParent(b.parentNode,c.isBlock):null,C=b?b.nodeName.toUpperCase():"","LI"!==(x=y?y.nodeName.toUpperCase():"")||v||(y=(b=y).parentNode,C=x),/^(LI|DT|DD)$/.test(C)&&c.isEmpty(b)?(N=t,k=y,_=b,A=p,I=(E=a).dom,M=E.selection.getRng(),k!==E.getBody()&&(D=(A=Z0(R=k)&&Z0(R.parentNode)?"LI":A)?N(A):I.create("BR"),tC(k,_,!0)&&tC(k,_,!1)?Q0(k,"LI")?(T=eC(k),I.insertAfter(D,T),(null===(L=(P=k).parentNode)||void 0===L?void 0:L.firstChild)===P?I.remove(T):I.remove(k)):I.replace(D,k):(tC(k,_,!0)?Q0(k,"LI")?(I.insertAfter(D,eC(k)),D.appendChild(I.doc.createTextNode(" ")),D.appendChild(k)):k.parentNode.insertBefore(D,k):tC(k,_,!1)?I.insertAfter(D,eC(k)):(k=eC(k),(O=M.cloneRange()).setStartAfter(_),O.setEndAfter(k),B=O.extractContents(),"LI"===A&&(B.firstChild&&"LI"===B.firstChild.nodeName)?(D=B.firstChild,I.insertAfter(B,k)):(I.insertAfter(B,k),I.insertAfter(D,k))),I.remove(_)),G0(E,D))):p&&b===a.getBody()||(p=p||"P",Pr(b)?(u=zr(b),c.isEmpty(b)&&nC(b),uC(a,u),G0(a,u)):n()?r():n(!0)?(u=b.parentNode.insertBefore(t(),b),G0(a,rC(b,"HR")?u:b)):((S=(w=d).cloneRange()).setStart(w.startContainer,iC(!0,w.startContainer,w.startOffset)),S.setEnd(w.endContainer,iC(!1,w.endContainer,w.endOffset)),(o=S.cloneRange()).setEndAfter(b),i=o.extractContents(),Y(Hu(Nt.fromDom(i),_n),function(e){var t=e.dom;t.nodeValue=wo(t.nodeValue)}),function(e){for(;jn(e)&&(e.nodeValue=e.nodeValue.replace(/^[\r\n]+/,"")),e=e.firstChild;);}(i),u=i.firstChild,c.insertAfter(i,b),function(e,t){var n,r,o=u,i=[];if(o){for(;o=o.firstChild;){if(e.isBlock(o))return;zn(o)&&!t[o.nodeName.toLowerCase()]&&i.push(o)}for(n=i.length;n--;)!(o=i[n]).hasChildNodes()||o.firstChild===o.lastChild&&""===o.firstChild.nodeValue?e.remove(o):(r=o)&&"A"===r.nodeName&&e.isEmpty(r)&&e.remove(o)}}(c,f),function(e,t){t.normalize();var n=t.lastChild;n&&!/^(left|right)$/gi.test(e.getStyle(n,"float",!0))||e.add(t,"br")}(c,b),c.isEmpty(b)&&nC(b),u.normalize(),c.isEmpty(u)?(c.remove(u),r()):(uC(a,u),G0(a,u))),c.setAttrib(u,"id",""),a.fire("NewBlock",{newBlock:u})))}function cC(e,t,n){var r=e.dom.createRng();n?(r.setStartBefore(t),r.setEndBefore(t)):(r.setStartAfter(t),r.setEndAfter(t)),e.selection.setRng(r),Zf(e,r)}function lC(e,t){var n=Nt.fromTag("br");qt(Nt.fromDom(t),n),e.undoManager.add()}function fC(e,t){XC(e.getBody(),t)||$t(Nt.fromDom(t),Nt.fromTag("br"));var n=Nt.fromTag("br");$t(Nt.fromDom(t),n),cC(e,n.dom,!1),e.undoManager.add()}function dC(e){return e&&"A"===e.nodeName&&"href"in e}function mC(e){return e.fold(R,dC,dC,R)}function gC(e,t){t.fold(te,A(lC,e),A(fC,e),te)}function pC(e,t){var n,r,o,i=(r=A(nb,n=e),o=as.fromRangeStart(n.selection.getRng()),Qb(r,n.getBody(),o).filter(mC));i.isSome()?i.each(A(gC,e)):function(e,t){var n,r,o=e.selection,i=e.dom,a=o.getRng();Rf(i,a).each(function(e){a.setStart(e.startContainer,e.startOffset),a.setEnd(e.endContainer,e.endOffset)});var u,s=a.startOffset,c=a.startContainer;1===c.nodeType&&c.hasChildNodes()&&(u=s>c.childNodes.length-1,c=c.childNodes[Math.min(s,c.childNodes.length-1)]||c,s=u&&3===c.nodeType?c.nodeValue.length:0);var l=i.getParent(c,i.isBlock),f=l?i.getParent(l.parentNode,i.isBlock):null,d=f?f.nodeName.toUpperCase():"",m=!(!t||!t.ctrlKey);"LI"!==d||m||(l=f),c&&3===c.nodeType&&s>=c.nodeValue.length&&!function(e){for(var t,n=new Rr(c,l),r=e.getNonEmptyElements();t=n.next();)if(r[t.nodeName.toLowerCase()]||0<t.length)return 1}(e.schema)&&(n=i.create("br"),a.insertNode(n),a.setStartAfter(n),a.setEndAfter(n),r=!0),n=i.create("br"),ss(i,a,n),cC(e,n,r),e.undoManager.add()}(e,t)}function hC(e,t){return J0(e).filter(function(e){return 0<t.length&&ze(Nt.fromDom(e),t)}).isSome()}function vC(e,t){return hC(e,e.getParam("no_newline_selector",""))}function bC(n){return function(e,t){return""===Ss(e)===n}}function yC(n){return function(e,t){return J0(e).filter(function(e){return go(Nt.fromDom(e))}).isSome()===n}}function CC(n,r){return function(e,t){return J0(e).fold(J(""),function(e){return e.nodeName.toUpperCase()})===n.toUpperCase()===r}}function xC(e){return CC("pre",e)}function wC(n){return function(e,t){return e.getParam("br_in_pre",!0)===n}}function SC(e,t){return hC(e,e.getParam("br_newline_selector",".mce-toc h2,figcaption,caption"))}function EC(e,t){return t}function NC(e){var t=Ss(e),n=function(e,t){for(var n,r=e.getRoot(),o=t;o!==r&&"false"!==e.getContentEditable(o);)"true"===e.getContentEditable(o)&&(n=o),o=o.parentNode;return o!==r?n:r}(e.dom,e.selection.getStart());return n&&e.schema.isValidChild(n.nodeName,t||"P")}function kC(e,t){return function(n,r){return L(e,function(e,t){return e&&t(n,r)},!0)?ve.some(t):ve.none()}}function _C(e,t){var n,r;n=e,r=t,Vb([kC([vC],YC.none()),kC([CC("summary",!0)],YC.br()),kC([xC(!0),wC(!1),EC],YC.br()),kC([xC(!0),wC(!1)],YC.block()),kC([xC(!0),wC(!0),EC],YC.block()),kC([xC(!0),wC(!0)],YC.br()),kC([yC(!0),EC],YC.br()),kC([yC(!0)],YC.block()),kC([bC(!0),EC,NC],YC.block()),kC([bC(!0)],YC.br()),kC([SC],YC.br()),kC([bC(!1),EC],YC.br()),kC([NC],YC.block())],[n,!(!r||!r.shiftKey)]).getOr(YC.none()).fold(function(){pC(e,t)},function(){sC(e,t)},te)}function AC(e){return e.stopImmediatePropagation()}function RC(e){return e.keyCode===Bf.PAGE_UP||e.keyCode===Bf.PAGE_DOWN}function DC(e,t,n){n&&!e.get()?t.on("NodeChange",AC,!0):!n&&e.get()&&t.off("NodeChange",AC),e.set(n)}function TC(n,r){var e=r.container(),t=r.offset();return jn(e)?(e.insertData(t,n),ve.some(as(e,t+n.length))):nc(r).map(function(e){var t=Nt.fromText(n);return(r.isAtEnd()?$t:qt)(e,t),as(t.dom,n.length)})}function OC(i,a){return function(e){return r=i,(!Rm(o=e)&&(n=o,Zl((t=r).dom,n).isNone()||Ql(t.dom,n).isNone()||np(t,n)||rp(t,n)||Em(t,n)||Sm(t,n)||_m(r,o)||Am(r,o))?QC:ZC)(a);var t,n,r,o}}function BC(e){var t,n,r=as.fromRangeStart(e.selection.getRng()),o=Nt.fromDom(e.getBody());if(e.selection.isCollapsed()){var i=A(nb,e),a=as.fromRangeStart(e.selection.getRng());return Qb(i,e.getBody(),a).bind((n=o,function(e){return e.fold(function(e){return Zl(n.dom,as.before(e))},function(e){return ef(e)},function(e){return tf(e)},function(e){return Ql(n.dom,as.after(e))})})).bind(OC(o,r)).exists((t=e,function(e){return t.selection.setRng(e.toRange()),t.nodeChanged(),!0}))}return!1}function PC(e){var o,i,a,u,s,t,n,r,c,l,f,d,m,g,p=a0(e);return e.on("keyup compositionstart",A(_0,e)),g=p,(m=e).on("keydown",function(e){var t,n,r,o;!1===e.isDefaultPrevented()&&(t=m,n=g,r=e,o=dt().os,F0([{keyCode:Bf.RIGHT,action:M0(R0,t,!0)},{keyCode:Bf.LEFT,action:M0(R0,t,!1)},{keyCode:Bf.UP,action:M0(D0,t,!1)},{keyCode:Bf.DOWN,action:M0(D0,t,!0)},{keyCode:Bf.RIGHT,action:M0(X0,t,!0)},{keyCode:Bf.LEFT,action:M0(X0,t,!1)},{keyCode:Bf.UP,action:M0(Y0,t,!1)},{keyCode:Bf.DOWN,action:M0(Y0,t,!0)},{keyCode:Bf.RIGHT,action:M0(U0,t,!0)},{keyCode:Bf.LEFT,action:M0(U0,t,!1)},{keyCode:Bf.UP,action:M0(z0,t,!1)},{keyCode:Bf.DOWN,action:M0(z0,t,!0)},{keyCode:Bf.RIGHT,action:M0(o0,t,n,!0)},{keyCode:Bf.LEFT,action:M0(o0,t,n,!1)},{keyCode:Bf.RIGHT,ctrlKey:!o.isOSX(),altKey:o.isOSX(),action:M0(zC,t,n)},{keyCode:Bf.LEFT,ctrlKey:!o.isOSX(),altKey:o.isOSX(),action:M0(HC,t,n)},{keyCode:Bf.UP,action:M0(I0,t,!1)},{keyCode:Bf.DOWN,action:M0(I0,t,!0)}],r).each(function(e){r.preventDefault()}))}),d=p,(f=e).on("keydown",function(e){var t,n,r;!1===e.isDefaultPrevented()&&(n=d,r=e,F0([{keyCode:Bf.BACKSPACE,action:M0(x0,t=f,!1)},{keyCode:Bf.BACKSPACE,action:M0(Pb,t,!1)},{keyCode:Bf.DELETE,action:M0(Pb,t,!0)},{keyCode:Bf.BACKSPACE,action:M0(Ab,t,!1)},{keyCode:Bf.DELETE,action:M0(Ab,t,!0)},{keyCode:Bf.BACKSPACE,action:M0(l0,t,n,!1)},{keyCode:Bf.DELETE,action:M0(l0,t,n,!0)},{keyCode:Bf.BACKSPACE,action:M0(hg,t,!1)},{keyCode:Bf.DELETE,action:M0(hg,t,!0)},{keyCode:Bf.BACKSPACE,action:M0(Lb,t,!1)},{keyCode:Bf.DELETE,action:M0(Lb,t,!0)},{keyCode:Bf.BACKSPACE,action:M0(p0,t,!1)},{keyCode:Bf.DELETE,action:M0(p0,t,!0)},{keyCode:Bf.BACKSPACE,action:M0(Cb,t,!1)},{keyCode:Bf.DELETE,action:M0(Cb,t,!0)},{keyCode:Bf.BACKSPACE,action:M0(vb,t,!1)},{keyCode:Bf.DELETE,action:M0(vb,t,!0)},{keyCode:Bf.BACKSPACE,action:M0(m0,t,!1)},{keyCode:Bf.DELETE,action:M0(m0,t,!0)}],r).each(function(e){r.preventDefault()}))}),f.on("keyup",function(e){var t,n;!1===e.isDefaultPrevented()&&(n=e,F0([{keyCode:Bf.BACKSPACE,action:M0(Bb,t=f)},{keyCode:Bf.DELETE,action:M0(Bb,t)}],n))}),(l=e).on("keydown",function(e){var t,n,r;e.keyCode===Bf.ENTER&&(t=l,(n=e).isDefaultPrevented()||(n.preventDefault(),(r=t.undoManager).typing&&(r.typing=!1,r.add()),t.undoManager.transact(function(){!1===t.selection.isCollapsed()&&t.execCommand("Delete"),_C(t,n)})))}),(c=e).on("keydown",function(e){var t;!1===e.isDefaultPrevented()&&(t=e,F0([{keyCode:Bf.SPACEBAR,action:M0(BC,c)}],t).each(function(e){t.preventDefault()}))}),n=t=e,r=lu(function(){n.composing||Im(n)},0),GC.isIE()&&(n.on("keypress",function(e){r.throttle()}),n.on("remove",function(e){r.cancel()})),t.on("input",function(e){!1===e.isComposing&&Im(t)}),s=p,(u=e).on("keydown",function(e){var t,n,r;!1===e.isDefaultPrevented()&&(n=s,r=e,F0([{keyCode:Bf.END,action:M0(T0,t=u,!0)},{keyCode:Bf.HOME,action:M0(T0,t,!1)},{keyCode:Bf.END,action:M0(H0,t,!0)},{keyCode:Bf.HOME,action:M0(H0,t,!1)},{keyCode:Bf.END,action:M0(u0,t,!0,n)},{keyCode:Bf.HOME,action:M0(u0,t,!1,n)}],r).each(function(e){r.preventDefault()}))}),o=e,i=p,JC.os.isOSX()||(a=ru(!1),o.on("keydown",function(e){RC(e)&&DC(a,o,!0)}),o.on("keyup",function(e){var t,n,r;!1===e.isDefaultPrevented()&&(r=e,F0([{keyCode:Bf.PAGE_UP,action:M0(u0,t=o,!1,n=i)},{keyCode:Bf.PAGE_DOWN,action:M0(u0,t,!0,n)}],r)),RC(e)&&a.get()&&(DC(a,o,!1),o.nodeChanged())})),p}(Ly=Py=Py||{})[Ly.Up=-1]="Up",Ly[Ly.Down=1]="Down";var LC=A(zy,Py.Up,Ru,Du),IC=A(zy,Py.Down,Du,Ru),MC=Yn,FC=Ks,UC=function(e,t){var n=e.selection.getRng(),r=e.getBody();if(t){var o=as.fromRangeEnd(n),i=My(r,o);return Z(i.positions)}return o=as.fromRangeStart(n),Q((i=Iy(r,o)).positions)},zC=A(i0,!0),HC=A(i0,!1),jC=function(e){return U(T(e.selection.getSelectedBlocks(),Nt.fromDom),function(e){return!y0(e)&&!Ot(e).exists(y0)&&pr(e,function(e){return Xn(e.dom)||Yn(e.dom)}).exists(function(e){return Xn(e.dom)})})},VC=Yn,qC=A(j0,function(e){return e.bottom},function(e,t){return e.y<t}),$C=A(j0,function(e){return e.top},function(e,t){return e.y>t}),WC=A(V0,Iy),KC=A(V0,My),XC=function(e,t){return n=as.after(t),!!Wn(n.getNode())||Ql(e,as.after(t)).map(function(e){return Wn(e.getNode())}).getOr(!1);var n},YC=or([{br:[]},{block:[]},{none:[]}]),GC=dt().browser,JC=dt(),QC=A(TC,yo),ZC=A(TC," "),e1=(t1.prototype.nodeChanged=function(e){var t,n,r,o=this.editor.selection;this.editor.initialized&&o&&!this.editor.getParam("disable_nodechange")&&!this.editor.mode.isReadOnly()&&(r=this.editor.getBody(),(t=o.getStart(!0)||r).ownerDocument===this.editor.getDoc()&&this.editor.dom.isChildOf(t,r)||(t=r),n=[],this.editor.dom.getParent(t,function(e){return e===r||void n.push(e)}),(e=e||{}).element=t,e.parents=n,this.editor.fire("NodeChange",e))},t1.prototype.isSameElementPath=function(e){var t,n=this.editor.$(e).parentsUntil(this.editor.getBody()).add(e);if(n.length===this.lastPath.length){for(t=n.length;0<=t&&n[t]===this.lastPath[t];t--);if(-1===t)return this.lastPath=n,!0}return this.lastPath=n,!1},t1);function t1(r){var o;this.lastPath=[],this.editor=r;var t=this;"onselectionchange"in r.getDoc()||r.on("NodeChange click mouseup keyup focus",function(e){var t=r.selection.getRng(),n={startContainer:t.startContainer,startOffset:t.startOffset,endContainer:t.endContainer,endOffset:t.endOffset};"nodechange"!==e.type&&Sf(n,o)||r.fire("SelectionChange"),o=n}),r.on("contextmenu",function(){r.fire("SelectionChange")}),r.on("SelectionChange",function(){var e=r.selection.getStart(!0);!e||!xt.range&&r.selection.isCollapsed()||Tl(r)&&!t.isSameElementPath(e)&&r.dom.isChildOf(e,r.getBody())&&r.nodeChanged({selectionChange:!0})}),r.on("mouseup",function(e){!e.isDefaultPrevented()&&Tl(r)&&("IMG"===r.selection.getNode().nodeName?_r.setEditorTimeout(r,function(){r.nodeChanged()}):r.nodeChanged())})}function n1(e){return zn(e)&&fo(Nt.fromDom(e))}function r1(e){var t=e.getBoundingClientRect(),n=e.ownerDocument,r=n.documentElement,o=n.defaultView;return{top:t.top+o.pageYOffset-r.clientTop,left:t.left+o.pageXOffset-r.clientLeft}}function o1(e){e&&e.parentNode&&e.parentNode.removeChild(e)}function i1(e,S){var E=_r.throttle(function(e,t){S._selectionOverrides.hideFakeCaret(),S.selection.placeCaretAt(e,t)},0);return S.on("remove",E.stop),function(w){return e.on(function(e){var t,n,r,o,i,a,u,s,c,l,f,d,m,g,p,h,v,b,y,C,x=Math.max(Math.abs(w.screenX-e.screenX),Math.abs(w.screenY-e.screenY));if(!e.dragging&&10<x){if(S.fire("dragstart",{target:e.element}).isDefaultPrevented())return;e.dragging=!0,S.focus()}e.dragging&&(d=e,t={pageX:(p=w,h=(g=S).inline?r1(g.getBody()):{left:0,top:0},C=(y=g).getBody(),v=y.inline?{left:C.scrollLeft,top:C.scrollTop}:{left:0,top:0},(m={pageX:(b=function(e,t){if(t.target.ownerDocument===e.getDoc())return{left:t.pageX,top:t.pageY};var n,r,o,i,a,u=r1(e.getContentAreaContainer()),s=(r=(n=e).getBody(),o=n.getDoc().documentElement,i={left:r.scrollLeft,top:r.scrollTop},a={left:r.scrollLeft||o.scrollLeft,top:r.scrollTop||o.scrollTop},n.inline?i:a);return{left:t.pageX-u.left+s.left,top:t.pageY-u.top+s.top}}(g,p)).left-h.left+v.left,pageY:b.top-h.top+v.top}).pageX-d.relX),pageY:m.pageY+5},l=e.ghost,f=S.getBody(),l.parentNode!==f&&f.appendChild(l),n=e.ghost,o=e.width,i=e.height,a=e.maxX,u=e.maxY,c=s=0,n.style.left=(r=t).pageX+"px",n.style.top=r.pageY+"px",u<r.pageY+i&&(c=r.pageY+i-u),n.style.width=o-(s=a<r.pageX+o?r.pageX+o-a:s)+"px",n.style.height=i-c+"px",E(w.clientX,w.clientY))})}}function a1(e){function t(e){var t,n,r,o,i,a;0===e.button&&(t=M(c.dom.getParents(e.target),function(){for(var n=[],e=0;e<arguments.length;e++)n[e]=arguments[e];return function(e){for(var t=0;t<n.length;t++)if(n[t](e))return!0;return!1}}(D1,T1)).getOr(null),i=c.getBody(),D1(a=t)&&a!==i&&(n=c.dom.getPos(t),r=c.getBody(),o=c.getDoc().documentElement,u.set({element:t,dragging:!1,screenX:e.screenX,screenY:e.screenY,maxX:(c.inline?r.scrollWidth:o.offsetWidth)-2,maxY:(c.inline?r.scrollHeight:o.offsetHeight)-2,relX:e.pageX-n.x,relY:e.pageY-n.y,width:t.offsetWidth,height:t.offsetHeight,ghost:function(e,t,n){var r=c.dom,o=e.cloneNode(!0);r.setStyles(o,{width:t,height:n}),r.setAttrib(o,"data-mce-selected",null);var i=r.create("div",{class:"mce-drag-container","data-mce-bogus":"all",unselectable:"on",contenteditable:"false"});return r.setStyles(i,{position:"absolute",opacity:.5,overflow:"hidden",border:0,padding:0,margin:0,width:t,height:n}),r.setStyles(o,{margin:0,boxSizing:"border-box"}),i.appendChild(o),i}(t,t.offsetWidth,t.offsetHeight)})))}function n(u){i.on(function(e){var t,n,r,o,i,a;e.dragging&&((o=3===(a=(r=s).selection.getSel().getRangeAt(0).startContainer).nodeType?a.parentNode:a)===(i=e.element)||r.dom.isChildOf(o,i)||D1(o)||((n=e.element.cloneNode(!0)).removeAttribute("data-mce-selected"),t=n,s.fire("drop",{clientX:u.clientX,clientY:u.clientY}).isDefaultPrevented()||s.undoManager.transact(function(){o1(e.element),s.insertContent(s.dom.getOuterHTML(t)),s._selectionOverrides.hideFakeCaret()})),s.fire("dragend"))}),O1(i)}var r,o,i,s,u,c,a=cu(),l=Ja.DOM,f=document,d=i1(u=a,c=e),m=(r=i=a,function(){r.on(function(e){e.dragging&&o.fire("dragend")}),O1(r)});(o=s=e).on("mousedown",t),e.on("mousemove",d),e.on("mouseup",n),l.bind(f,"mousemove",d),l.bind(f,"mouseup",m),e.on("remove",function(){l.unbind(f,"mousemove",d),l.unbind(f,"mouseup",m)}),e.on("keydown",function(e){e.keyCode===Bf.ESC&&m()})}function u1(e){var n,i;function a(e){var t;e.isDefaultPrevented()||(t=e.dataTransfer)&&(D(t.types,"Files")||0<t.files.length)&&(e.preventDefault(),"drop"===e.type&&Iv(i,"Dropped file type is not supported"))}function u(e){dd(i,e.target)&&a(e)}function t(){var t=Ja.DOM,n=i.dom,r=document,o=i.inline?i.getBody():i.getDoc(),e=["drop","dragover"];Y(e,function(e){t.bind(r,e,u),n.bind(o,e,a)}),i.on("remove",function(){Y(e,function(e){t.unbind(r,e,u),n.unbind(o,e,a)})})}a1(e),(n=e).on("drop",function(e){var t=void 0!==e.clientX?n.getDoc().elementFromPoint(e.clientX,e.clientY):null;!D1(t)&&"false"!==n.dom.getContentEditableParent(t)||e.preventDefault()}),e.getParam("block_unsupported_drop",!0,"boolean")&&(i=e).on("init",function(){_r.setEditorTimeout(i,t,0)})}function s1(e,t){return pf(e.getBody(),t)}function c1(l){function f(e){return e!==x&&(P1(e)||Jn(e))&&y.isChildOf(e,x)}function c(e){return ep(e)||tp(e)||Gg(e)||Jg(e)}function d(e){e&&b.setRng(e)}function m(e,t,n,r){return void 0===r&&(r=!0),l.fire("ShowCaret",{target:t,direction:e,before:n}).isDefaultPrevented()?null:(r&&b.scrollIntoView(t,-1===e),i.show(n,t))}function t(e){return Ir(e)||No(e)||ko(e)}function g(e){return t(e.startContainer)||t(e.endContainer)}function p(e,t){if(!e)return null;if(e.collapsed){if(!g(e)){var n=t?1:-1,r=tc(n,x,e),o=r.getNode(!t);if($s(o))return m(n,o,!!t&&!r.isAtEnd(),!1);var i=r.getNode(t);if($s(i))return m(n,i,!t&&!r.isAtEnd(),!1)}return null}var a=e.startContainer,u=e.startOffset,s=e.endOffset;if(3===a.nodeType&&0===u&&P1(a.parentNode)&&(a=a.parentNode,u=y.nodeIndex(a),a=a.parentNode),1!==a.nodeType)return null;if(s===u+1&&a===e.endContainer){var c=a.childNodes[u];if(f(c))return function(e){var t=e.cloneNode(!0),n=l.fire("ObjectSelected",{target:e,targetClone:t});if(n.isDefaultPrevented())return null;var r=function(e,t,n){var r=l.$,o=vr(Nt.fromDom(l.getBody()),"#"+w).fold(function(){return r([])},function(e){return r([e.dom])});0===o.length&&(o=r('<div data-mce-bogus="all" class="mce-offscreen-selection"></div>').attr("id",w)).appendTo(l.getBody());var i=y.createRng();t===n&&xt.ie?(o.empty().append('<p style="font-size: 0" data-mce-bogus="all">\xa0</p>').append(t),i.setStartAfter(o[0].firstChild.firstChild),i.setEndAfter(t)):(o.empty().append(yo).append(t).append(yo),i.setStart(o[0].firstChild,1),i.setEnd(o[0].lastChild,0)),o.css({top:y.getPos(e,l.getBody()).y}),o[0].focus();var a=b.getSel();return a.removeAllRanges(),a.addRange(i),i}(e,n.targetClone,t),o=Nt.fromDom(e);return Y(hu(Nt.fromDom(l.getBody()),"*[data-mce-selected]"),function(e){je(o,e)||yn(e,S)}),y.getAttrib(e,S)||e.setAttribute(S,"1"),v=e,E(),r}(c)}return null}function h(){v&&v.removeAttribute(S),vr(Nt.fromDom(l.getBody()),"#"+w).each(Ln),v=null}var v,n,e,o,b=l.selection,y=l.dom,C=y.isBlock,x=l.getBody(),i=Vs(l,x,C,function(){return vd(l)}),w="sel-"+y.uniqueId(),S="data-mce-selected",r=b.getRng,E=function(){i.hide()};return xt.ceFalse&&!mh(l)&&(l.on("mouseup",function(e){var t=r();t.collapsed&&av(l,e.clientX,e.clientY)&&Sb(l,t,!1).each(d)}),l.on("click",function(e){var t=s1(l,e.target);t&&(P1(t)&&(e.preventDefault(),l.focus()),B1(t)&&y.isChildOf(t,b.getNode())&&h())}),l.on("blur NewBlock",h),l.on("ResizeWindow FullscreenStateChanged",i.reposition),l.on("tap",function(e){var t=e.target,n=s1(l,t);P1(n)?(e.preventDefault(),wb(l,n).each(p)):f(t)&&wb(l,t).each(p)},!0),l.on("mousedown",function(e){var t,n,r,o,i,a,u,s=e.target;s!==x&&"HTML"!==s.nodeName&&!y.isChildOf(s,x)||!1===av(l,e.clientX,e.clientY)||((t=s1(l,s))?P1(t)?(e.preventDefault(),wb(l,t).each(p)):(h(),B1(t)&&e.shiftKey||hf(e.clientX,e.clientY,b.getRng())||(E(),b.placeCaretAt(e.clientX,e.clientY))):f(s)?wb(l,s).each(p):!1===$s(s)&&(h(),E(),(n=Yy(x,e.clientX,e.clientY))&&(r=s,o=n.node,a=y.getParent(r,C),u=y.getParent(o,C),!K(a)&&(r!==u&&y.isChildOf(a,u)&&!1===P1(s1(l,a))||!y.isChildOf(u,a)&&(i=u,y.getParent(a,C)!==y.getParent(i,C))&&function(e){var t=e.firstChild;if(!K(t)){var n=as.before(t);if(Wn(n.getNode())&&1===e.childNodes.length)return!c(n);var r=Pc(e).next(n);return r&&!c(r)}}(a))||(e.preventDefault(),d(m(1,n.node,n.before,!1)),l.getBody().focus()))))}),l.on("keypress",function(e){Bf.modifierPressed(e)||P1(b.getNode())&&e.preventDefault()}),l.on("GetSelectionRange",function(e){var t=e.range;v&&(v.parentNode?((t=t.cloneRange()).selectNode(v),e.range=t):v=null)}),l.on("SetSelectionRange",function(e){var t,n,r,o,i,a,u;e.range=(t=e.range,n=l.schema.getShortEndedElements(),r=y.createRng(),o=t.startContainer,i=t.startOffset,a=t.endContainer,u=t.endOffset,Ne(n,o.nodeName.toLowerCase())?0===i?r.setStartBefore(o):r.setStartAfter(o):r.setStart(o,i),Ne(n,a.nodeName.toLowerCase())?0===u?r.setEndBefore(a):r.setEndAfter(a):r.setEnd(a,u),r);var s=p(e.range,e.forward);s&&(e.range=s)}),l.on("AfterSetSelectionRange",function(e){var t=e.range,n=t.startContainer.parentNode;g(t)||"mcepastebin"===n.id||E(),y.hasClass(n,"mce-offscreen-selection")||h()}),l.on("copy",function(e){var t,n,r=e.clipboardData;e.isDefaultPrevented()||!e.clipboardData||xt.ie||(t=(n=y.get(w))&&n.getElementsByTagName("*")[0])&&(e.preventDefault(),r.clearData(),r.setData("text/html",t.outerHTML),r.setData("text/plain",t.outerText||t.innerText))}),u1(l),e=lu(function(){var e,t;n.removed||!n.getBody().contains(document.activeElement)||(e=n.selection.getRng()).collapsed&&(t=Eb(n,e,!1),n.selection.setRng(t))},0),(n=l).on("focus",function(){e.throttle()}),n.on("blur",function(){e.cancel()}),(o=l).on("init",function(){o.on("focusin",function(e){var t,n,r=e.target;Jn(r)&&(t=pf(o.getBody(),r),n=Yn(t)?t:r,o.selection.getNode()!==n&&wb(o,n).each(function(e){return o.selection.setRng(e)}))})})),{showCaret:m,showBlockCaretContainer:function(e){e.hasAttribute("data-mce-caret")&&(zr(e),d(r()),b.scrollIntoView(e))},hideFakeCaret:E,destroy:function(){i.destroy(),v=null}}}function l1(a){function e(e,t){try{a.getDoc().execCommand(e,!1,t)}catch(e){}}function u(e){return e.isDefaultPrevented()}function t(){a.shortcuts.add("meta+a",null,"SelectAll")}function n(){a.inline||b.bind(a.getDoc(),"mousedown mouseup",function(e){var t;e.target===a.getDoc().documentElement&&(t=y.getRng(),a.getBody().focus(),"mousedown"===e.type?Ir(t.startContainer)||y.placeCaretAt(e.clientX,e.clientY):y.setRng(t))})}function r(){Range.prototype.getClientRects||a.on("mousedown",function(e){var t;u(e)||"HTML"!==e.target.nodeName||((t=a.getBody()).blur(),_r.setEditorTimeout(a,function(){t.focus()}))})}function o(){a.on("click",function(e){var t=e.target;/^(IMG|HR)$/.test(t.nodeName)&&"false"!==b.getContentEditableParent(t)&&(e.preventDefault(),a.selection.select(t),a.nodeChanged()),"A"===t.nodeName&&b.hasClass(t,"mce-item-anchor")&&(e.preventDefault(),y.select(t))})}function i(){a.on("keydown",function(e){if(!u(e)&&e.keyCode===h&&y.isCollapsed()&&0===y.getRng().startOffset){var t=y.getNode().previousSibling;if(t&&t.nodeName&&"table"===t.nodeName.toLowerCase())return e.preventDefault(),!1}})}function s(){a.getParam("readonly")||a.on("BeforeExecCommand mousedown",function(){e("StyleWithCSS",!1),e("enableInlineTableEditing",!1),Ts(a)||e("enableObjectResizing",!1)})}function c(){a.contentStyles.push("img:-moz-broken {-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}")}function l(){a.inline||a.on("keydown",function(){document.activeElement===document.body&&a.getWin().focus()})}function f(){a.inline||(a.contentStyles.push("body {min-height: 150px}"),a.on("click",function(e){var t;"HTML"===e.target.nodeName&&(11<xt.ie?a.getBody().focus():(t=a.selection.getRng(),a.getBody().focus(),a.selection.setRng(t),a.selection.normalize(),a.nodeChanged()))}))}function d(){xt.mac&&a.on("keydown",function(e){!Bf.metaKeyPressed(e)||e.shiftKey||37!==e.keyCode&&39!==e.keyCode||(e.preventDefault(),a.selection.getSel().modify("move",37===e.keyCode?"backward":"forward","lineboundary"))})}function m(){a.on("click",function(e){var t=e.target;do{if("A"===t.tagName)return void e.preventDefault()}while(t=t.parentNode)}),a.contentStyles.push(".mce-content-body {-webkit-touch-callout: none}")}function g(){a.on("init",function(){a.dom.bind(a.getBody(),"submit",function(e){e.preventDefault()})})}var p=Et.each,h=Bf.BACKSPACE,v=Bf.DELETE,b=a.dom,y=a.selection,C=a.parser,x=xt.gecko,w=xt.ie,S=xt.webkit,E="data:text/mce-internal,",N=w?"Text":"URL",k=te;return mh(a)?(S&&(n(),o(),g(),t(),xt.iOS&&(l(),f(),m())),x&&(r(),s(),c(),d())):(a.on("keydown",function(e){if(!u(e)&&e.keyCode===Bf.BACKSPACE){var t,n=(t=y.getRng()).startContainer,r=t.startOffset,o=b.getRoot(),i=n;if(t.collapsed&&0===r){for(;i&&i.parentNode&&i.parentNode.firstChild===i&&i.parentNode!==o;)i=i.parentNode;"BLOCKQUOTE"===i.tagName&&(a.formatter.toggle("blockquote",null,i),(t=b.createRng()).setStart(n,0),t.setEnd(n,0),y.setRng(t))}}}),a.on("keydown",function(e){var t,n,r,o,i=e.keyCode;u(e)||i!==v&&i!==h||(t=a.selection.isCollapsed(),n=a.getBody(),t&&!b.isEmpty(n)||!t&&(r=R(a.selection.getRng()),(o=b.createRng()).selectNode(a.getBody()),r!==R(o))||(e.preventDefault(),a.setContent(""),n.firstChild&&b.isBlock(n.firstChild)?a.selection.setCursorLocation(n.firstChild,0):a.selection.setCursorLocation(n,0),a.nodeChanged()))}),xt.windowsPhone||a.on("keyup focusin mouseup",function(e){Bf.modifierPressed(e)||y.normalize()},!0),S&&(n(),o(),Ss(a)&&a.on("init",function(){e("DefaultParagraphSeparator",Ss(a))}),g(),i(),C.addNodeFilter("br",function(e){for(var t=e.length;t--;)"Apple-interchange-newline"===e[t].attr("class")&&e[t].remove()}),xt.iOS?(l(),f(),m()):t()),11<=xt.ie&&(f(),i()),xt.ie&&(t(),e("AutoUrlDetect",!1),a.on("dragstart",function(e){var t,n,r;(t=e).dataTransfer&&(a.selection.isCollapsed()&&"IMG"===t.target.tagName&&y.select(t.target),0<(n=a.selection.getContent()).length&&(r=E+escape(a.id)+","+escape(n),t.dataTransfer.setData(N,r)))}),a.on("drop",function(e){var t,n,r,o;u(e)||(t=e.dataTransfer&&(o=e.dataTransfer.getData(N))&&0<=o.indexOf(E)?(o=o.substr(E.length).split(","),{id:unescape(o[0]),html:unescape(o[1])}):null)&&t.id!==a.id&&(e.preventDefault(),n=wf(e.x,e.y,a.getDoc()),y.setRng(n),r=t.html,a.queryCommandSupported("mceInsertClipboardContent")?a.execCommand("mceInsertClipboardContent",!1,{content:r,internal:!0}):a.execCommand("mceInsertContent",!1,r))})),x&&(a.on("keydown",function(e){if(!u(e)&&e.keyCode===h&&a.getBody().getElementsByTagName("hr").length&&y.isCollapsed()&&0===y.getRng().startOffset){var t=y.getNode(),n=t.previousSibling;if("HR"===t.nodeName)return b.remove(t),void e.preventDefault();n&&n.nodeName&&"hr"===n.nodeName.toLowerCase()&&(b.remove(n),e.preventDefault())}}),r(),a.on("keypress",function(e){var t;if(!u(e)&&(8===e.keyCode||46===e.keyCode)&&A())return t=_(),a.getDoc().execCommand("delete",!1,null),t(),e.preventDefault(),!1}),b.bind(a.getDoc(),"cut",function(e){var t;!u(e)&&A()&&(t=_(),_r.setEditorTimeout(a,function(){t()}))}),s(),a.on("SetContent ExecCommand",function(e){"setcontent"!==e.type&&"mceInsertLink"!==e.command||p(b.select("a"),function(e){var t=e.parentNode,n=b.getRoot();if(t.lastChild===e){for(;t&&!b.isBlock(t);){if(t.parentNode.lastChild!==t||t===n)return;t=t.parentNode}b.add(t,"br",{"data-mce-bogus":1})}})}),c(),d(),i())),{refreshContentEditable:k,isHidden:function(){if(!x||a.removed)return!1;var e=a.selection.getSel();return!e||!e.rangeCount||0===e.rangeCount}};function _(){var e=b.getAttribs(y.getStart().cloneNode(!1));return function(){var t=y.getStart();t!==a.getBody()&&(b.setAttrib(t,"style",null),p(e,function(e){t.setAttributeNode(e.cloneNode(!0))}))}}function A(){return!y.isCollapsed()&&b.getParent(y.getStart(),b.isBlock)!==b.getParent(y.getEnd(),b.isBlock)}function R(e){var t=b.create("body"),n=e.cloneContents();return t.appendChild(n),y.serializer.serialize(t,{format:"html"})}}function f1(e){return ae(e,function(e){return!1===b(e)})}function d1(e){var t=e.settings,n=e.editorUpload.blobCache;return f1({allow_conditional_comments:t.allow_conditional_comments,allow_html_data_urls:t.allow_html_data_urls,allow_svg_data_urls:t.allow_svg_data_urls,allow_html_in_named_anchor:t.allow_html_in_named_anchor,allow_script_urls:t.allow_script_urls,allow_unsafe_link_target:t.allow_unsafe_link_target,convert_fonts_to_spans:t.convert_fonts_to_spans,fix_list_elements:t.fix_list_elements,font_size_legacy_values:t.font_size_legacy_values,forced_root_block:t.forced_root_block,forced_root_block_attrs:t.forced_root_block_attrs,padd_empty_with_br:t.padd_empty_with_br,preserve_cdata:t.preserve_cdata,remove_trailing_brs:t.remove_trailing_brs,inline_styles:t.inline_styles,root_name:e.inline?e.getElement().nodeName.toLowerCase():void 0,validate:!0,blob_cache:n,document:e.getDoc(),images_dataimg_filter:t.images_dataimg_filter})}function m1(e){var t,u,n;e.bindPendingEventDelegates(),e.initialized=!0,e.fire("Init"),e.focus(!0),n=(u=e).dom.getRoot(),u.inline||Tl(u)&&u.selection.getStart(!0)!==n||ef(n).each(function(e){var t,n,r,o,i=e.getNode(),a=cn(i)?ef(i).getOr(e):e;xt.browser.isIE()?(t=u,n=a.toRange(),r=Nt.fromDom(t.getBody()),o=(ad(t)?ve.from(n):ve.none()).map(ud).filter(id(r)),t.bookmark=o.isSome()?o:t.bookmark):u.selection.setRng(a.toRange())}),e.nodeChanged({initial:!0}),e.execCallback("init_instance_callback",e),(t=e).settings.auto_focus&&_r.setEditorTimeout(t,function(){var e=!0===t.settings.auto_focus?t:t.editorManager.get(t.settings.auto_focus);e.destroyed||e.focus()},100)}function g1(e){return(e.inline?e.ui:e.dom).styleSheetLoader}function p1(e){function t(){o.unloadAll(a),e.inline||e.ui.styleSheetLoader.unloadAll(i)}function n(){e.removed?t():e.on("remove",t)}var r,o=g1(e),i=Ds(e),a=e.contentCSS;0<e.contentStyles.length&&(r="",Et.each(e.contentStyles,function(e){r+=e+"\r\n"}),e.dom.addStyle(r));var u,s,c,l,f,d,m,g,p,h=kr.all((u=e,s=a,c=i,l=[new kr(function(e,t){return g1(u).loadAll(s,e,t)})],u.inline?l:l.concat([new kr(function(e,t){return u.ui.styleSheetLoader.loadAll(c,e,t)})]))).then(n).catch(n);return e.settings.content_style&&(d=(f=e).settings.content_style,m=Nt.fromDom(f.getBody()),g=jt(Bn(m)),pn(p=Nt.fromTag("style"),"type","text/css"),Pn(p,Nt.fromText(d)),Pn(g,p),f.on("remove",function(){Ln(p)})),h}function h1(e){var t;!0!==e.removed&&(mh(t=e)||t.load({initial:!0,format:"html"}),t.startContent=t.getContent({format:"raw"}),m1(e))}function v1(t,e){var n=t.settings,r=t.getElement(),o=t.getDoc();n.inline||(t.getElement().style.visibility=t.orgVisibility),e||t.inline||(o.open(),o.write(t.iframeHTML),o.close()),t.inline&&(L1.addClass(r,"mce-content-body"),t.contentDocument=o=document,t.contentWindow=window,t.bodyElement=r,t.contentAreaContainer=r);var u,i,a,s,c,l,f,d,m,g,p,h=t.getBody();h.disabled=!0,t.readonly=!!n.readonly,t.readonly||(t.inline&&"static"===L1.getStyle(h,"position",!0)&&(h.style.position="relative"),h.contentEditable=t.getParam("content_editable_state",!0)),h.disabled=!1,t.editorUpload=Kv(t),t.schema=to(n),t.dom=Ja(o,{keep_values:!0,url_converter:t.convertURL,url_converter_scope:t,hex_colors:n.force_hex_style_colors,update_styles:!0,root_element:t.inline?t.getBody():null,collect:function(){return t.inline},schema:t.schema,contentCssCors:t.getParam("content_css_cors",!1,"boolean"),referrerPolicy:_s(t),onSetAttrib:function(e){t.fire("SetAttrib",e)}}),t.parser=((i=$h(d1(u=t),u.schema)).addAttributeFilter("src,href,style,tabindex",function(e,t){for(var n,r,o=e.length,i=u.dom,a="data-mce-"+t;o--;)(r=(n=e[o]).attr(t))&&!n.attr(a)&&0!==r.indexOf("data:")&&0!==r.indexOf("blob:")&&("style"===t?((r=i.serializeStyle(i.parseStyle(r),n.name)).length||(r=null),n.attr(a,r),n.attr(t,r)):"tabindex"===t?(n.attr(a,r),n.attr(t,null)):n.attr(a,u.convertURL(r,t,n.name)))}),i.addNodeFilter("script",function(e){for(var t=e.length;t--;){var n=e[t],r=n.attr("type")||"no/type";0!==r.indexOf("mce-")&&n.attr("type","mce-"+r)}}),u.settings.preserve_cdata&&i.addNodeFilter("#cdata",function(e){for(var t=e.length;t--;){var n=e[t];n.type=8,n.name="#comment",n.value="[CDATA["+u.dom.encode(n.value)+"]]"}}),i.addNodeFilter("p,h1,h2,h3,h4,h5,h6,div",function(e){for(var t=e.length,n=u.schema.getNonEmptyElements();t--;){var r=e[t];r.isEmpty(n)&&0===r.getAll("br").length&&(r.append(new Ud("br",1)).shortEnded=!0)}}),i),t.serializer=Xh((a=t.settings,_e(_e({},d1(t)),f1({url_converter:a.url_converter,url_converter_scope:a.url_converter_scope,element_format:a.element_format,entities:a.entities,entity_encoding:a.entity_encoding,indent:a.indent,indent_after:a.indent_after,indent_before:a.indent_before,block_elements:a.block_elements,boolean_attributes:a.boolean_attributes,custom_elements:a.custom_elements,extended_valid_elements:a.extended_valid_elements,invalid_elements:a.invalid_elements,invalid_styles:a.invalid_styles,move_caret_before_on_enter_elements:a.move_caret_before_on_enter_elements,non_empty_elements:a.non_empty_elements,schema:a.schema,self_closing_elements:a.self_closing_elements,short_ended_elements:a.short_ended_elements,special:a.special,text_block_elements:a.text_block_elements,text_inline_elements:a.text_inline_elements,valid_children:a.valid_children,valid_classes:a.valid_classes,valid_elements:a.valid_elements,valid_styles:a.valid_styles,verify_html:a.verify_html,whitespace_elements:a.whitespace_elements}))),t),t.selection=Lh(t.dom,t.getWin(),t.serializer,t),t.annotator=Ml(t),t.formatter=Jv(t),t.undoManager=Zv(t),t._nodeChangeDispatcher=new e1(t),t._selectionOverrides=c1(t),d=t,m=cu(),g=ru(!1),p=fu(function(e){d.fire("longpress",_e(_e({},e),{type:"longpress"})),g.set(!0)},400),d.on("touchstart",function(n){S0(n).each(function(e){p.cancel();var t={x:e.clientX,y:e.clientY,target:n.target};p.throttle(n),g.set(!1),m.set(t)})},!0),d.on("touchmove",function(e){p.cancel(),S0(e).each(function(i){m.on(function(e){var t=i,n=e,r=Math.abs(t.clientX-n.x),o=Math.abs(t.clientY-n.y);(5<r||5<o)&&(m.clear(),g.set(!1),d.fire("longpresscancel"))})})},!0),d.on("touchend touchcancel",function(t){p.cancel(),"touchcancel"!==t.type&&m.get().filter(function(e){return e.target.isEqualNode(t.target)}).each(function(){g.get()?t.preventDefault():d.fire("tap",_e(_e({},t),{type:"tap"}))})},!0),(l=c=t).on("click",function(e){l.dom.getParent(e.target,"details")&&e.preventDefault()}),(f=c).parser.addNodeFilter("details",function(e){Y(e,function(e){e.attr("data-mce-open",e.attr("open")),e.attr("open","open")})}),f.serializer.addNodeFilter("details",function(e){Y(e,function(e){var t=e.attr("data-mce-open");e.attr("open",X(t)?t:null),e.attr("data-mce-open",null)})}),mh(t)||(s=t).on("click",function(e){var t,n,r,o,i;3<=e.detail&&(r=(t=s).selection.getRng(),o=as.fromRangeStart(r),i=as.fromRangeEnd(r),!as.isElementPosition(o)||n1(n=o.container())&&ef(n).each(function(e){return r.setStart(e.container(),e.offset())}),!as.isElementPosition(i)||n1(n=o.container())&&tf(n).each(function(e){return r.setEnd(e.container(),e.offset())}),t.selection.setRng(vg(r)))});var v,b,y,C,x,w,S,E,N,k=mh(v=t)?ru(null):PC(v);N=k,(E=t).addCommand("delete",function(){var e,t=N;x0(e=E)||Pb(e,!1)||Ab(e,!1)||l0(e,t,!1)||vb(e,!1)||hg(e)||Lb(e,!1)||p0(e,!1)||Cb(e)||m0(e,!1)||(w0(e,"Delete"),ub(e))}),E.addCommand("forwardDelete",function(){var e,t=N;Pb(e=E,!0)||Ab(e,!0)||l0(e,t,!0)||vb(e,!0)||hg(e)||Lb(e,!0)||p0(e,!0)||Cb(e)||m0(e,!0)||w0(e,"ForwardDelete")}),Ss(b=t)&&b.on("NodeChange",A(N0,b)),C=(y=t).dom,x=Ss(y),w=y.getParam("placeholder",gc.getAttrib(y.getElement(),"placeholder"),"string"),S=function(e,t){var n,r,o;!function(e){if(eb(e)){var t=e.keyCode;return!tb(e)&&(Bf.metaKeyPressed(e)||e.altKey||112<=t&&t<=123||D(my,t))}}(e)&&(n=y.getBody(),r=!(eb(o=e)&&!(tb(o)||"keyup"===o.type&&229===o.keyCode))&&function(e,t,n){if(Wr(Nt.fromDom(t),!1)){var r=""===n,o=t.firstElementChild;return!o||!e.getStyle(t.firstElementChild,"padding-left")&&!e.getStyle(t.firstElementChild,"padding-right")&&(r?!e.isBlock(o):n===o.nodeName.toLowerCase())}return!1}(C,n,x),""!==C.getAttrib(n,gy)===r&&!t||(C.setAttrib(n,gy,r?w:null),C.setAttrib(n,"aria-placeholder",r?w:null),y.fire("PlaceholderToggle",{state:r}),y.on(r?"keydown":"keyup",S),y.off(r?"keyup":"keydown",S)))},w&&y.on("init",function(e){S(e,!0),y.on("change SetContent ExecCommand",S),y.on("paste",function(e){return _r.setEditorTimeout(y,function(){return S(e)})})});var _=gh(t);(function(t){var e=t.settings,n=t.getDoc(),r=t.getBody();t.fire("PreInit"),e.browser_spellcheck||e.gecko_spellcheck||(n.body.spellcheck=!1,L1.setAttrib(r,"spellcheck","false")),t.quirks=l1(t),t.fire("PostRender");var o=t.getParam("directionality",uu.isRtl()?"rtl":void 0);void 0!==o&&(r.dir=o),e.protect&&t.on("BeforeSetContent",function(t){Et.each(e.protect,function(e){t.content=t.content.replace(e,function(e){return"\x3c!--mce:protected "+escape(e)+"--\x3e"})})}),t.on("SetContent",function(){t.addVisual(t.getBody())}),t.on("compositionstart compositionend",function(e){t.composing="compositionstart"===e.type})})(t),_.fold(function(){p1(t).then(function(){return h1(t)})},function(e){t.setProgressState(!0),p1(t).then(function(){e().then(function(e){t.setProgressState(!1),h1(t)},function(e){t.notificationManager.open({type:"error",text:String(e)}),h1(t)})})})}function b1(e,t){var n,r,o,i,a=e.translate(e.getParam("iframe_aria_text","Rich Text Area. Press ALT-0 for help.","string")),u=(n=e.id,r=a,t.height,o=e.getParam("iframe_attrs",{}),hn(i=Nt.fromTag("iframe"),o),hn(i,{id:n+"_ifr",frameBorder:"0",allowTransparency:"true",title:r}),gu(i,"tox-edit-area__iframe"),i.dom);u.onload=function(){u.onload=null,e.fire("load")};var s=function(e,t){if(document.domain!==window.location.hostname&&xt.browser.isIE()){var n=jv("mce");e[n]=function(){v1(e)};var r='javascript:(function(){document.open();document.domain="'+document.domain+'";var ed = window.parent.tinymce.get("'+e.id+'");document.write(ed.iframeHTML);document.close();ed.'+n+"(true);})()";return I1.setAttrib(t,"src",r),!0}return!1}(e,u);return e.contentAreaContainer=t.iframeContainer,e.iframeElement=u,e.iframeHTML=function(e){var t=e.getParam("doctype","<!DOCTYPE html>")+"<html><head>";e.getParam("document_base_url","")!==e.documentBaseUrl&&(t+='<base href="'+e.documentBaseURI.getURI()+'" />'),t+='<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';var n=xs(e,"body_id","tinymce"),r=xs(e,"body_class","");return ws(e)&&(t+='<meta http-equiv="Content-Security-Policy" content="'+ws(e)+'" />'),t+('</head><body id="'+n+'" class="mce-content-body '+r+'" data-id="'+e.id)+'"><br></body></html>'}(e),I1.add(t.iframeContainer,u),s}function y1(e){return e.replace(/^\-/,"")}function C1(e){return{editorContainer:e,iframeContainer:e,api:{}}}function x1(e){var t,n,r,o,i,a,u,s=e.getElement();return e.orgDisplay=s.style.display,X(Bs(e))?e.theme.renderUI():y(Bs(e))?(n=(t=e).getElement(),(r=Bs(t)(t,n)).editorContainer.nodeType&&(r.editorContainer.id=r.editorContainer.id||t.id+"_parent"),r.iframeContainer&&r.iframeContainer.nodeType&&(r.iframeContainer.id=r.iframeContainer.id||t.id+"_iframecontainer"),r.height=r.iframeHeight||n.offsetHeight,r):(u=(o=e).getElement(),o.inline?C1(null):(i=u,a=M1.create("div"),M1.insertAfter(a,i),C1(a)))}function w1(e){var n,t,r,o,i,a,u,s;e.fire("ScriptsLoaded"),n=e,t=Et.trim(ks(n)),r=n.ui.registry.getAll().icons,ne(_e(_e({},_v.get("default").icons),_v.get(t).icons),function(e,t){Ne(r,t)||n.ui.registry.addIcon(t,e)}),a=Bs(o=e),X(a)?(o.settings.theme=y1(a),i=Bv.get(a),o.theme=new i(o,Bv.urls[a]),o.theme.init&&o.theme.init(o,Bv.urls[a]||o.documentBaseUrl.replace(/\/$/,""),o.$)):o.theme={},s=[],Et.each(Ls(u=e).split(/[ ,]/),function(e){F1(u,s,y1(e))});var c=x1(e),l=e,f=ve.from(c.api).getOr({}),d={show:ve.from(f.show).getOr(te),hide:ve.from(f.hide).getOr(te),disable:ve.from(f.disable).getOr(te),isDisabled:ve.from(f.isDisabled).getOr(R),enable:function(){l.mode.isReadOnly()||ve.from(f.enable).map(x)}};l.ui=_e(_e({},l.ui),d);var m,g,p,h={editorContainer:c.editorContainer,iframeContainer:c.iframeContainer};return e.editorContainer=h.editorContainer||null,zv(e),e.inline?v1(e):(p=b1(m=e,g=h),g.editorContainer&&(I1.get(g.editorContainer).style.display=m.orgDisplay,m.hidden=I1.isHidden(g.editorContainer)),m.getElement().style.display="none",I1.setAttrib(m.id,"aria-hidden","true"),void(p||v1(m)))}function S1(e){return"-"===e.charAt(0)}function E1(t,e,n){return ve.from(e).filter(function(e){return 0<e.length&&!_v.has(e)}).map(function(e){return{url:t.editorManager.baseURL+"/icons/"+e+"/icons"+n+".js",name:ve.some(e)}})}function N1(c,l){var e,t,f=tu.ScriptLoader,n=f,r=l,o=function(){var r,o,t,n,e,i,a,u,s;e=f,u=As(i=c),s=i.getParam("language_url","","string"),!1===uu.hasCode(u)&&"en"!==u&&(a=""!==s?s:i.editorManager.baseURL+"/langs/"+u+".js",e.add(a,te,void 0,function(){Mv(i,"LanguageLoadError",Fv("language",a,u))})),t=f,Y(function(e){for(var t=[],n=function(e){t.push(e)},r=0;r<e.length;r++)e[r].each(n);return t}([E1(n=c,"default",l),ve.from(n.getParam("icons_url","","string")).filter(function(e){return 0<e.length}).map(function(e){return{url:e,name:ve.none()}}).orThunk(function(){return E1(n,ks(n),"")})]),function(e){t.add(e.url,te,void 0,function(){Mv(n,"IconsLoadError",Fv("icons",e.url,e.name.getOrUndefined()))})}),r=c,o=l,Et.each(r.getParam("external_plugins"),function(e,t){Ov.load(t,e,te,void 0,function(){Uv(r,e,t)}),r.settings.plugins+=" "+t}),Et.each(Ls(r).split(/[ ,]/),function(e){var t,n;(e=Et.trim(e))&&!Ov.urls[e]&&(S1(e)?(e=e.substr(1,e.length),t=Ov.dependencies(e),Et.each(t,function(e){var t=Ov.createUrl({prefix:"plugins/",resource:e,suffix:"/plugin"+o+".js"},e);Ov.load(t.resource,t,te,void 0,function(){Uv(r,t.prefix+t.resource+t.suffix,t.resource)})})):(n={prefix:"plugins/",resource:e,suffix:"/plugin"+o+".js"},Ov.load(e,n,te,void 0,function(){Uv(r,n.prefix+n.resource+n.suffix,e)})))}),f.loadQueue(function(){c.removed||w1(c)},c,function(){c.removed||w1(c)})},i=Bs(e=c);X(i)?(S1(i)||Ne(Bv.urls,i)||((t=e.getParam("theme_url"))?Bv.load(i,e.documentBaseURI.toAbsolute(t)):Bv.load(i,"themes/"+i+"/theme"+r+".js")),n.loadQueue(function(){Bv.waitFor(i,o)})):o()}function k1(a){return function(i,e){return ve.from(e).map(Nt.fromDom).filter(kn).bind(function(e){return n=a,t=i,r=e.dom,Ag(Nt.fromDom(r),function(e){return wn(t=e,n).orThunk(function(){return"font"===kt(t)?ue(z1,n).bind(function(e){return bn(t,e)}):ve.none()});var t},function(e){return je(Nt.fromDom(t),e)}).or((o=e.dom,ve.from(Ja.DOM.getStyle(o,a,!0))));var n,t,r,o}).getOr("")}}function _1(e){return ef(e.getBody()).map(function(e){var t=e.container();return jn(t)?t.parentNode:t})}function A1(e,t){return n=e,r=a(ve.some,t),o=n,ve.from(o.selection.getRng()).bind(function(e){var t=o.getBody();return e.startContainer===t&&0===e.startOffset?ve.none():ve.from(o.selection.getStart(!0))}).orThunk(A(_1,n)).map(Nt.fromDom).filter(kn).bind(r);var n,r,o}function R1(e,t){if(/^[0-9.]+$/.test(t)){var n=parseInt(t,10);if(1<=n&&n<=7){var r=Et.explode(e.getParam("font_size_style_values","xx-small,x-small,small,medium,large,x-large,xx-large")),o=Et.explode(e.getParam("font_size_classes",""));return o?o[n-1]||t:r[n-1]||t}return t}return t}var D1=Yn,T1=Xn,O1=function(e){e.on(function(e){o1(e.ghost)}),e.clear()},B1=Xn,P1=Yn,L1=Ja.DOM,I1=Ja.DOM,M1=Ja.DOM,F1=function(t,n,r){var o,i,a,u,e=Ov.get(r),s=Ov.urls[r]||t.documentBaseUrl.replace(/\/$/,"");if(r=Et.trim(r),e&&-1===Et.inArray(n,r)&&(Et.each(Ov.dependencies(r),function(e){F1(t,n,e)}),!t.plugins[r]))try{var c=new e(t,s,t.$);(t.plugins[r]=c).init&&(c.init(t,s),n.push(r))}catch(e){i=r,a=e,vf(o=t,"PluginLoadError",{message:u=uu.translate(["Failed to initialize plugin: {0}",i])}),ay(u,a),Iv(o,u)}},U1=Ja.DOM,z1={"font-size":"size","font-family":"face"},H1=k1("font-size"),j1=i(function(e){return e.replace(/[\'\"\\]/g,"").replace(/,\s+/g,",")},k1("font-family")),V1=Et.each,q1=Et.map,$1=Et.inArray,W1=(K1.prototype.execCommand=function(t,n,r,e){var o,i,a=!1,u=this;if(!u.editor.removed){if("mcefocus"!==t.toLowerCase()&&(/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint)$/.test(t)||e&&e.skip_focus?ld(i=u.editor).each(function(e){return i.selection.setRng(e)}):u.editor.focus()),(e=u.editor.fire("BeforeExecCommand",{command:t,ui:n,value:r})).isDefaultPrevented())return!1;var s=t.toLowerCase();if(o=u.commands.exec[s])return o(s,n,r),u.editor.fire("ExecCommand",{command:t,ui:n,value:r}),!0;if(V1(this.editor.plugins,function(e){if(e.execCommand&&e.execCommand(t,n,r))return u.editor.fire("ExecCommand",{command:t,ui:n,value:r}),!(a=!0)}),a)return a;if(u.editor.theme&&u.editor.theme.execCommand&&u.editor.theme.execCommand(t,n,r))return u.editor.fire("ExecCommand",{command:t,ui:n,value:r}),!0;try{a=u.editor.getDoc().execCommand(t,n,r)}catch(e){}return!!a&&(u.editor.fire("ExecCommand",{command:t,ui:n,value:r}),!0)}},K1.prototype.queryCommandState=function(e){var t;if(!this.editor.quirks.isHidden()&&!this.editor.removed){if(e=e.toLowerCase(),t=this.commands.state[e])return t(e);try{return this.editor.getDoc().queryCommandState(e)}catch(e){}return!1}},K1.prototype.queryCommandValue=function(e){var t;if(!this.editor.quirks.isHidden()&&!this.editor.removed){if(e=e.toLowerCase(),t=this.commands.value[e])return t(e);try{return this.editor.getDoc().queryCommandValue(e)}catch(e){}}},K1.prototype.addCommands=function(e,n){void 0===n&&(n="exec");var r=this;V1(e,function(t,e){V1(e.toLowerCase().split(","),function(e){r.commands[n][e]=t})})},K1.prototype.addCommand=function(e,o,i){var a=this;e=e.toLowerCase(),this.commands.exec[e]=function(e,t,n,r){return o.call(i||a.editor,t,n,r)}},K1.prototype.queryCommandSupported=function(e){if(e=e.toLowerCase(),this.commands.exec[e])return!0;try{return this.editor.getDoc().queryCommandSupported(e)}catch(e){}return!1},K1.prototype.addQueryStateHandler=function(e,t,n){var r=this;e=e.toLowerCase(),this.commands.state[e]=function(){return t.call(n||r.editor)}},K1.prototype.addQueryValueHandler=function(e,t,n){var r=this;e=e.toLowerCase(),this.commands.value[e]=function(){return t.call(n||r.editor)}},K1.prototype.hasCustomCommand=function(e){return e=e.toLowerCase(),!!this.commands.exec[e]},K1.prototype.execNativeCommand=function(e,t,n){return void 0===t&&(t=!1),void 0===n&&(n=null),this.editor.getDoc().execCommand(e,t,n)},K1.prototype.isFormatMatch=function(e){return this.editor.formatter.match(e)},K1.prototype.toggleFormat=function(e,t){this.editor.formatter.toggle(e,t),this.editor.nodeChanged()},K1.prototype.storeSelection=function(e){this.selectionBookmark=this.editor.selection.getBookmark(e)},K1.prototype.restoreSelection=function(){this.editor.selection.moveToBookmark(this.selectionBookmark)},K1.prototype.setupCommands=function(u){var o=this;function e(r){return function(){var e=u.selection,t=e.isCollapsed()?[u.dom.getParent(e.getNode(),u.dom.isBlock)]:e.getSelectedBlocks(),n=q1(t,function(e){return!!u.formatter.matchNode(e,r)});return-1!==$1(n,!0)}}this.addCommands({"mceResetDesignMode,mceBeginUndoLevel":te,"mceEndUndoLevel,mceAddUndoLevel":function(){u.undoManager.add()},mceFocus:function(e,t,n){var r,o;o=n,(r=u).removed||(o?Md:function(t){var e=t.selection,n=t.getBody(),r=e.getRng();t.quirks.refreshContentEditable(),void 0!==t.bookmark&&!1===vd(t)&&ld(t).each(function(e){t.selection.setRng(e),r=e});var o,i,a=(o=t,i=e.getNode(),o.dom.getParent(i,function(e){return"true"===o.dom.getContentEditable(e)}));if(t.$.contains(n,a))return hd(a),pd(t,r),Md(t);t.inline||(xt.opera||hd(n),t.getWin().focus()),(xt.gecko||t.inline)&&(hd(n),pd(t,r)),Md(t)})(r)},"Cut,Copy,Paste":function(e){var t,n,r=u.getDoc();try{o.execNativeCommand(e)}catch(e){t=!0}!(t="paste"===e&&!r.queryCommandEnabled(e)||t)&&r.queryCommandSupported(e)||(n=u.translate("Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X/C/V keyboard shortcuts instead."),xt.mac&&(n=n.replace(/Ctrl\+/g,"\u2318+")),u.notificationManager.open({text:n,type:"error"}))},unlink:function(){var e;u.selection.isCollapsed()?(e=u.dom.getParent(u.selection.getStart(),"a"))&&u.dom.remove(e,!0):u.formatter.remove("link")},"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull,JustifyNone":function(e){var t=e.substring(7);"full"===t&&(t="justify"),V1("left,center,right,justify".split(","),function(e){t!==e&&u.formatter.remove("align"+e)}),"none"!==t&&o.toggleFormat("align"+t)},"InsertUnorderedList,InsertOrderedList":function(e){var t;o.execNativeCommand(e);var n=u.dom.getParent(u.selection.getNode(),"ol,ul");n&&(t=n.parentNode,/^(H[1-6]|P|ADDRESS|PRE)$/.test(t.nodeName)&&(o.storeSelection(),u.dom.split(t,n),o.restoreSelection()))},"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(e){o.toggleFormat(e)},"ForeColor,HiliteColor":function(e,t,n){o.toggleFormat(e,{value:n})},FontName:function(e,t,n){var r,o;o=R1(r=u,n),r.formatter.toggle("fontname",{value:T(o.split(/\s*,\s*/),function(e){return-1===e.indexOf(" ")||Ge(e,'"')||Ge(e,"'")?e:"'"+e+"'"}).join(",")}),r.nodeChanged()},FontSize:function(e,t,n){var r;(r=u).formatter.toggle("fontsize",{value:R1(r,n)}),r.nodeChanged()},LineHeight:function(e,t,n){var r;(r=u).formatter.toggle("lineheight",{value:String(n)}),r.nodeChanged()},Lang:function(e,t,n){o.toggleFormat(e,{value:n.code,customValue:n.customCode})},RemoveFormat:function(e){u.formatter.remove(e)},mceBlockQuote:function(){o.toggleFormat("blockquote")},FormatBlock:function(e,t,n){return o.toggleFormat(n||"p")},mceCleanup:function(){var e=u.selection.getBookmark();u.setContent(u.getContent()),u.selection.moveToBookmark(e)},mceRemoveNode:function(e,t,n){var r=n||u.selection.getNode();r!==u.getBody()&&(o.storeSelection(),u.dom.remove(r,!0),o.restoreSelection())},mceSelectNodeDepth:function(e,t,n){var r=0;u.dom.getParent(u.selection.getNode(),function(e){if(1===e.nodeType&&r++===n)return u.selection.select(e),!1},u.getBody())},mceSelectNode:function(e,t,n){u.selection.select(n)},mceInsertContent:function(e,t,n){var r,o,i,a;r=u,o=function(e){if("string"==typeof e)return{content:e,details:{}};var t=Et.extend({paste:e.paste,data:{paste:e.paste}},e);return{content:e.content,details:t}}(n),i=o.content,a=o.details,ph(r).editor.insertContent(i,a)},mceInsertRawHTML:function(e,t,n){u.selection.setContent("tiny_mce_marker");var r=u.getContent();u.setContent(r.replace(/tiny_mce_marker/g,function(){return n}))},mceInsertNewLine:function(e,t,n){_C(u,n)},mceToggleFormat:function(e,t,n){o.toggleFormat(n)},mceSetContent:function(e,t,n){u.setContent(n)},"Indent,Outdent":function(e){C0(u,e)},mceRepaint:te,InsertHorizontalRule:function(){u.execCommand("mceInsertContent",!1,"<hr />")},mceToggleVisualAid:function(){u.hasVisual=!u.hasVisual,u.addVisual()},mceReplaceContent:function(e,t,n){u.execCommand("mceInsertContent",!1,n.replace(/\{\$selection\}/g,u.selection.getContent({format:"text"})))},mceInsertLink:function(e,t,n){"string"==typeof n&&(n={href:n});var r=u.dom.getParent(u.selection.getNode(),"a");n.href=n.href.replace(/ /g,"%20"),r&&n.href||u.formatter.remove("link"),n.href&&u.formatter.apply("link",n,r)},selectAll:function(){var e,t=u.dom.getParent(u.selection.getStart(),Xn);t&&((e=u.dom.createRng()).selectNodeContents(t),u.selection.setRng(e))},mceNewDocument:function(){u.setContent("")},InsertLineBreak:function(e,t,n){return pC(u,n),!0}}),o.addCommands({JustifyLeft:e("alignleft"),JustifyCenter:e("aligncenter"),JustifyRight:e("alignright"),JustifyFull:e("alignjustify"),"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(e){return o.isFormatMatch(e)},mceBlockQuote:function(){return o.isFormatMatch("blockquote")},Outdent:function(){return b0(u)},"InsertUnorderedList,InsertOrderedList":function(e){var t=u.dom.getParent(u.selection.getNode(),"ul,ol");return t&&("insertunorderedlist"===e&&"UL"===t.tagName||"insertorderedlist"===e&&"OL"===t.tagName)}},"state"),o.addCommands({Undo:function(){u.undoManager.undo()},Redo:function(){u.undoManager.redo()}}),o.addQueryValueHandler("FontName",function(){return A1(t=u,function(e){return j1(t.getBody(),e.dom)}).getOr("");var t},this),o.addQueryValueHandler("FontSize",function(){return A1(t=u,function(e){return H1(t.getBody(),e.dom)}).getOr("");var t},this),o.addQueryValueHandler("LineHeight",function(){return A1(t=u,function(n){var e=Nt.fromDom(t.getBody());return Ag(n,function(e){return wn(e,"line-height")},A(je,e)).getOrThunk(function(){var e=parseFloat(xn(n,"line-height")),t=parseFloat(xn(n,"font-size"));return String(e/t)})}).getOr("");var t},this)},K1);function K1(e){this.commands={state:{},exec:{},value:{}},this.editor=e,this.setupCommands(e)}function X1(e,t,n){var r,o,i,a,u,s;pu(e,t)&&!1===n?(o=t,mu(r=e)?r.dom.classList.remove(o):(u=o,0<(s=U(du(a=r,"class"),function(e){return e!==u})).length?pn(a,"class",s.join(" ")):yn(a,"class")),0===(mu(i=r)?i.dom.classList:du(i,"class")).length&&yn(i,"class")):n&&gu(e,t)}function Y1(e,t,n){try{e.getDoc().execCommand(t,!1,String(n))}catch(e){}}function G1(e,t){e.dom.contentEditable=t?"true":"false"}function J1(e,t){var n,r,o=Nt.fromDom(e.getBody());X1(o,"mce-content-readonly",t),t?(e.selection.controlSelection.hideResizeRect(),e._selectionOverrides.hideFakeCaret(),ve.from(e.selection.getNode()).each(function(e){e.removeAttribute("data-mce-selected")}),G1(o,!(e.readonly=!0)),Y(hu(o,'*[contenteditable="true"]'),function(e){pn(e,ex,"true"),G1(e,!1)})):(G1(o,!(e.readonly=!1)),Y(hu(o,"*["+ex+'="true"]'),function(e){yn(e,ex),G1(e,!0)}),Y1(e,"StyleWithCSS",!1),Y1(e,"enableInlineTableEditing",!1),Y1(e,"enableObjectResizing",!1),(vd(n=e)||(r=n,td(Bn(Nt.fromDom(r.getElement()))).filter(function(e){return!(void 0!==(t=e.dom.classList)&&(t.contains("tox-edit-area")||t.contains("tox-edit-area__iframe")||t.contains("mce-content-body")))&&dd(r,e.dom);var t}).isSome()))&&e.focus(),e.selection.setRng(e.selection.getRng()),e.nodeChanged())}function Q1(e){return e.readonly}function Z1(t){t.parser.addAttributeFilter("contenteditable",function(e){Q1(t)&&Y(e,function(e){e.attr(ex,e.attr("contenteditable")),e.attr("contenteditable","false")})}),t.serializer.addAttributeFilter(ex,function(e){Q1(t)&&Y(e,function(e){e.attr("contenteditable",e.attr(ex))})}),t.serializer.addTempAttr(ex)}var ex="data-mce-contenteditable",tx=Et.makeMap("focus blur focusin focusout click dblclick mousedown mouseup mousemove mouseover beforepaste paste cut copy selectionchange mouseout mouseenter mouseleave wheel keydown keypress keyup input beforeinput contextmenu dragstart dragend dragover draggesture dragdrop drop drag submit compositionstart compositionend compositionupdate touchstart touchmove touchend touchcancel"," "),nx=(rx.isNative=function(e){return!!tx[e.toLowerCase()]},rx.prototype.fire=function(e,t){var n=e.toLowerCase(),r=io(n,t||{},this.scope);this.settings.beforeFire&&this.settings.beforeFire(r);var o=this.bindings[n];if(o)for(var i=0,a=o.length;i<a;i++){var u=o[i];if(!u.removed){if(u.once&&this.off(n,u.func),r.isImmediatePropagationStopped())return r;if(!1===u.func.call(this.scope,r))return r.preventDefault(),r}}return r},rx.prototype.on=function(e,t,n,r){if(t=!1===t?R:t){var o={func:t,removed:!1};r&&Et.extend(o,r);for(var i=e.toLowerCase().split(" "),a=i.length;a--;){var u=i[a],s=this.bindings[u];s||(s=[],this.toggleEvent(u,!0)),s=n?Ae([o],s,!0):Ae(Ae([],s,!0),[o],!1),this.bindings[u]=s}}return this},rx.prototype.off=function(e,t){var n=this;if(e)for(var r=e.toLowerCase().split(" "),o=r.length;o--;){var i,a=r[o],u=this.bindings[a];if(!a)return ne(this.bindings,function(e,t){n.toggleEvent(t,!1),delete n.bindings[t]}),this;u&&(t?(u=(i=B(u,function(e){return e.func===t})).fail,this.bindings[a]=u,Y(i.pass,function(e){e.removed=!0})):u.length=0,u.length||(this.toggleEvent(e,!1),delete this.bindings[a]))}else ne(this.bindings,function(e,t){n.toggleEvent(t,!1)}),this.bindings={};return this},rx.prototype.once=function(e,t,n){return this.on(e,t,n,{once:!0})},rx.prototype.has=function(e){return e=e.toLowerCase(),!(!this.bindings[e]||0===this.bindings[e].length)},rx);function rx(e){this.bindings={},this.settings=e||{},this.scope=this.settings.scope||this,this.toggleEvent=this.settings.toggleEvent||R}function ox(n){return n._eventDispatcher||(n._eventDispatcher=new nx({scope:n,toggleEvent:function(e,t){nx.isNative(e)&&n.toggleNativeEvent&&n.toggleNativeEvent(e,t)}})),n._eventDispatcher}function ix(e,t){if("selectionchange"===t)return e.getDoc();if(!e.inline&&/^mouse|touch|click|contextmenu|drop|dragover|dragend/.test(t))return e.getDoc().documentElement;var n=Os(e);return n?(e.eventRoot||(e.eventRoot=dx.select(n)[0]),e.eventRoot):e.getBody()}function ax(e,t,n){var r,o,i,a;e.hidden||Q1(e)?Q1(e)&&(r=e,"click"!==(o=n).type||Bf.metaKeyPressed(o)||(i=Nt.fromDom(o.target),a=r,br(i,"a",function(e){return je(e,Nt.fromDom(a.getBody()))}).bind(function(e){return bn(e,"href")}).each(function(e){var t,n;o.preventDefault(),/^#/.test(e)?(t=r.dom.select(e+',[name="'+(Ge(n=e,"#")?n.substring("#".length):n)+'"]')).length&&r.selection.scrollIntoView(t[0],!0):window.open(e,"_blank","rel=noopener noreferrer,menubar=yes,toolbar=yes,location=yes,status=yes,resizable=yes,scrollbars=yes")}))):e.fire(t,n)}function ux(i,a){var e,t;i.delegates||(i.delegates={}),i.delegates[a]||i.removed||(t=ix(i,a),Os(i)?(lx||(lx={},i.editorManager.on("removeEditor",function(){i.editorManager.activeEditor||lx&&(ne(lx,function(e,t){i.dom.unbind(ix(i,t))}),lx=null)})),lx[a]||(lx[a]=e=function(e){for(var t=e.target,n=i.editorManager.get(),r=n.length;r--;){var o=n[r].getBody();o!==t&&!dx.isChildOf(t,o)||ax(n[r],a,e)}},dx.bind(t,a,e))):(dx.bind(t,a,e=function(e){ax(i,a,e)}),i.delegates[a]=e))}function sx(e,t,n,r){var o=n[t.get()],i=n[r];try{i.activate()}catch(e){return void console.error("problem while activating editor mode "+r+":",e)}o.deactivate(),o.editorReadOnly!==i.editorReadOnly&&J1(e,i.editorReadOnly),t.set(r),e.fire("SwitchMode",{mode:r})}function cx(e){var t,n={};px(hx(e.toLowerCase(),"+"),function(e){e in bx?n[e]=!0:/^[0-9]{2,}$/.test(e)?n.keyCode=parseInt(e,10):(n.charCode=e.charCodeAt(0),n.keyCode=vx[e]||e.toUpperCase().charCodeAt(0))});var r=[n.keyCode];for(t in bx)n[t]?r.push(t):n[t]=!1;return n.id=r.join(","),n.access&&(n.alt=!0,xt.mac?n.ctrl=!0:n.shift=!0),n.meta&&(xt.mac?n.meta=!0:(n.ctrl=!0,n.meta=!1)),n}var lx,fx={fire:function(e,t,n){if(this.removed&&"remove"!==e&&"detach"!==e)return t;var r=ox(this).fire(e,t);if(!1!==n&&this.parent)for(var o=this.parent();o&&!r.isPropagationStopped();)o.fire(e,r,!1),o=o.parent();return r},on:function(e,t,n){return ox(this).on(e,t,n)},off:function(e,t){return ox(this).off(e,t)},once:function(e,t){return ox(this).once(e,t)},hasEventListeners:function(e){return ox(this).has(e)}},dx=Ja.DOM,mx=_e(_e({},fx),{bindPendingEventDelegates:function(){var t=this;Et.each(t._pendingNativeEvents,function(e){ux(t,e)})},toggleNativeEvent:function(e,t){var n=this;"focus"!==e&&"blur"!==e&&(n.removed||(t?n.initialized?ux(n,e):n._pendingNativeEvents?n._pendingNativeEvents.push(e):n._pendingNativeEvents=[e]:n.initialized&&(n.dom.unbind(ix(n,e),e,n.delegates[e]),delete n.delegates[e])))},unbindAllNativeEvents:function(){var n=this,e=n.getBody(),t=n.dom;n.delegates&&(ne(n.delegates,function(e,t){n.dom.unbind(ix(n,t),t,e)}),delete n.delegates),!n.inline&&e&&t&&(e.onload=null,t.unbind(n.getWin()),t.unbind(n.getDoc())),t&&(t.unbind(e),t.unbind(n.getContainer()))}}),gx=["design","readonly"],px=Et.each,hx=Et.explode,vx={f1:112,f2:113,f3:114,f4:115,f5:116,f6:117,f7:118,f8:119,f9:120,f10:121,f11:122,f12:123},bx=Et.makeMap("alt,ctrl,shift,meta,access"),yx=(Cx.prototype.add=function(e,n,t,r){var o=this,i=o.normalizeCommandFunc(t);return px(hx(Et.trim(e)),function(e){var t=o.createShortcut(e,n,i,r);o.shortcuts[t.id]=t}),!0},Cx.prototype.remove=function(e){var t=this.createShortcut(e);return!!this.shortcuts[t.id]&&(delete this.shortcuts[t.id],!0)},Cx.prototype.normalizeCommandFunc=function(e){var t=this,n=e;return"string"==typeof n?function(){t.editor.execCommand(n,!1,null)}:Et.isArray(n)?function(){t.editor.execCommand(n[0],n[1],n[2])}:n},Cx.prototype.createShortcut=function(e,t,n,r){var o=Et.map(hx(e,">"),cx);return o[o.length-1]=Et.extend(o[o.length-1],{func:n,scope:r||this.editor}),Et.extend(o[0],{desc:this.editor.translate(t),subpatterns:o.slice(1)})},Cx.prototype.hasModifier=function(e){return e.altKey||e.ctrlKey||e.metaKey},Cx.prototype.isFunctionKey=function(e){return"keydown"===e.type&&112<=e.keyCode&&e.keyCode<=123},Cx.prototype.matchShortcut=function(e,t){return!!t&&t.ctrl===e.ctrlKey&&t.meta===e.metaKey&&t.alt===e.altKey&&t.shift===e.shiftKey&&!!(e.keyCode===t.keyCode||e.charCode&&e.charCode===t.charCode)&&(e.preventDefault(),!0)},Cx.prototype.executeShortcutAction=function(e){return e.func?e.func.call(e.scope):null},Cx);function Cx(e){this.shortcuts={},this.pendingPatterns=[],this.editor=e;var n=this;e.on("keyup keypress keydown",function(t){!n.hasModifier(t)&&!n.isFunctionKey(t)||t.isDefaultPrevented()||(px(n.shortcuts,function(e){if(n.matchShortcut(t,e))return n.pendingPatterns=e.subpatterns.slice(0),"keydown"===t.type&&n.executeShortcutAction(e),!0}),n.matchShortcut(t,n.pendingPatterns[0])&&(1===n.pendingPatterns.length&&"keydown"===t.type&&n.executeShortcutAction(n.pendingPatterns[0]),n.pendingPatterns.shift()))})}var xx=Ja.DOM,wx=Et.extend,Sx=Et.each,Ex=Et.resolve,Nx=xt.ie,kx=(_x.prototype.render=function(){!function(t){var e=t.id;uu.setCode(As(t));var n,r,o,i,a=function(){U1.unbind(window,"ready",a),t.render()};ai.Event.domLoaded?t.getElement()&&xt.contentEditable&&(n=Nt.fromDom(t.getElement()),r=L(n.dom.attributes,function(e,t){return e[t.name]=t.value,e},{}),t.on("remove",function(){O(n.dom.attributes,function(e){return yn(n,e.name),0}),hn(n,r)}),t.ui.styleSheetLoader=Ar.forElement(n,{contentCssCors:(o=t).getParam("content_css_cors"),referrerPolicy:_s(o)}),t.getParam("inline")?t.inline=!0:(t.orgVisibility=t.getElement().style.visibility,t.getElement().style.visibility="hidden"),(i=t.getElement().form||U1.getParent(e,"form"))&&(t.formElement=i,t.getParam("hidden_input")&&!Hn(t.getElement())&&(U1.insertAfter(U1.create("input",{type:"hidden",name:e}),e),t.hasHiddenInput=!0),t.formEventDelegate=function(e){t.fire(e.type,e)},U1.bind(i,"submit reset",t.formEventDelegate),t.on("reset",function(){t.resetContent()}),!t.getParam("submit_patch")||i.submit.nodeType||i.submit.length||i._mceOldSubmit||(i._mceOldSubmit=i.submit,i.submit=function(){return t.editorManager.triggerSave(),t.setDirty(!1),i._mceOldSubmit(i)})),t.windowManager=Pv(t),t.notificationManager=uv(t),"xml"===t.getParam("encoding")&&t.on("GetContent",function(e){e.save&&(e.content=U1.encode(e.content))}),t.getParam("add_form_submit_trigger")&&t.on("submit",function(){t.initialized&&t.save()}),t.getParam("add_unload_trigger")&&(t._beforeUnload=function(){!t.initialized||t.destroyed||t.isHidden()||t.save({format:"raw",no_events:!0,set_dirty:!1})},t.editorManager.on("BeforeUnload",t._beforeUnload)),t.editorManager.add(t),N1(t,t.suffix)):U1.bind(window,"ready",a)}(this)},_x.prototype.focus=function(e){this.execCommand("mceFocus",!1,e)},_x.prototype.hasFocus=function(){return vd(this)},_x.prototype.execCallback=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];var r,o=this.settings[e];if(o)return this.callbackLookup&&(r=this.callbackLookup[e])&&(o=r.func,r=r.scope),"string"==typeof o&&(r=(r=o.replace(/\.\w+$/,""))?Ex(r):0,o=Ex(o),this.callbackLookup=this.callbackLookup||{},this.callbackLookup[e]={func:o,scope:r}),o.apply(r||this,t)},_x.prototype.translate=function(e){return uu.translate(e)},_x.prototype.getParam=function(e,t,n){return i=t,a=n,l=(o=e)in(r=this).settings?r.settings[o]:i,"hash"===a?(c={},"string"==typeof(s=l)?Y(0<s.indexOf("=")?s.split(/[;,](?![^=;,]*(?:[;,]|$))/):s.split(","),function(e){var t=e.split("=");1<t.length?c[Et.trim(t[0])]=Et.trim(t[1]):c[Et.trim(t[0])]=Et.trim(t[0])}):c=s,c):"string"===a?rv(X,r,o).getOr(i):"number"===a?rv(E,r,o).getOr(i):"boolean"===a?rv(v,r,o).getOr(i):"object"===a?rv(h,r,o).getOr(i):"array"===a?rv(S,r,o).getOr(i):"string[]"===a?rv((u=X,function(e){return S(e)&&j(e,u)}),r,o).getOr(i):"function"===a?rv(y,r,o).getOr(i):l;var r,o,i,a,u,s,c,l},_x.prototype.hasPlugin=function(e,t){return!(!D(Ls(this).split(/[ ,]/),e)||t&&void 0===Ov.get(e))},_x.prototype.nodeChanged=function(e){this._nodeChangeDispatcher.nodeChanged(e)},_x.prototype.addCommand=function(e,t,n){this.editorCommands.addCommand(e,t,n)},_x.prototype.addQueryStateHandler=function(e,t,n){this.editorCommands.addQueryStateHandler(e,t,n)},_x.prototype.addQueryValueHandler=function(e,t,n){this.editorCommands.addQueryValueHandler(e,t,n)},_x.prototype.addShortcut=function(e,t,n,r){this.shortcuts.add(e,t,n,r)},_x.prototype.execCommand=function(e,t,n,r){return this.editorCommands.execCommand(e,t,n,r)},_x.prototype.queryCommandState=function(e){return this.editorCommands.queryCommandState(e)},_x.prototype.queryCommandValue=function(e){return this.editorCommands.queryCommandValue(e)},_x.prototype.queryCommandSupported=function(e){return this.editorCommands.queryCommandSupported(e)},_x.prototype.show=function(){this.hidden&&(this.hidden=!1,this.inline?this.getBody().contentEditable="true":(xx.show(this.getContainer()),xx.hide(this.id)),this.load(),this.fire("show"))},_x.prototype.hide=function(){var e=this,t=e.getDoc();e.hidden||(Nx&&t&&!e.inline&&t.execCommand("SelectAll"),e.save(),e.inline?(e.getBody().contentEditable="false",e===e.editorManager.focusedEditor&&(e.editorManager.focusedEditor=null)):(xx.hide(e.getContainer()),xx.setStyle(e.id,"display",e.orgDisplay)),e.hidden=!0,e.fire("hide"))},_x.prototype.isHidden=function(){return!!this.hidden},_x.prototype.setProgressState=function(e,t){this.fire("ProgressState",{state:e,time:t})},_x.prototype.load=function(e){var t=this.getElement();if(this.removed)return"";if(t){(e=e||{}).load=!0;var n=Hn(t)?t.value:t.innerHTML,r=this.setContent(n,e);return e.element=t,e.no_events||this.fire("LoadContent",e),e.element=t=null,r}},_x.prototype.save=function(e){var t,n,r=this,o=r.getElement();if(o&&r.initialized&&!r.removed)return(e=e||{}).save=!0,e.element=o,e.content=r.getContent(e),e.no_events||r.fire("SaveContent",e),"raw"===e.format&&r.fire("RawSaveContent",e),t=e.content,Hn(o)?o.value=t:(!e.is_removing&&r.inline||(o.innerHTML=t),(n=xx.getParent(r.id,"form"))&&Sx(n.elements,function(e){if(e.name===r.id)return e.value=t,!1})),e.element=o=null,!1!==e.set_dirty&&r.setDirty(!1),t},_x.prototype.setContent=function(e,t){return Yh(this,e,t)},_x.prototype.getContent=function(e){return t=this,r=(n=void 0===(n=e)?{}:n).format||"html",o=n,ph(t).editor.getContent(o,r);var t,n,r,o},_x.prototype.insertContent=function(e,t){t&&(e=wx({content:e},t)),this.execCommand("mceInsertContent",!1,e)},_x.prototype.resetContent=function(e){void 0===e?Yh(this,this.startContent,{format:"raw"}):Yh(this,e),this.undoManager.reset(),this.setDirty(!1),this.nodeChanged()},_x.prototype.isDirty=function(){return!this.isNotDirty},_x.prototype.setDirty=function(e){var t=!this.isNotDirty;this.isNotDirty=!e,e&&e!==t&&this.fire("dirty")},_x.prototype.getContainer=function(){return this.container||(this.container=xx.get(this.editorContainer||this.id+"_parent")),this.container},_x.prototype.getContentAreaContainer=function(){return this.contentAreaContainer},_x.prototype.getElement=function(){return this.targetElm||(this.targetElm=xx.get(this.id)),this.targetElm},_x.prototype.getWin=function(){var e;return this.contentWindow||(e=this.iframeElement)&&(this.contentWindow=e.contentWindow),this.contentWindow},_x.prototype.getDoc=function(){var e;return this.contentDocument||(e=this.getWin())&&(this.contentDocument=e.document),this.contentDocument},_x.prototype.getBody=function(){var e=this.getDoc();return this.bodyElement||(e?e.body:null)},_x.prototype.convertURL=function(e,t,n){var r=this.settings;return r.urlconverter_callback?this.execCallback("urlconverter_callback",e,n,!0,t):!r.convert_urls||n&&"LINK"===n.nodeName||0===e.indexOf("file:")||0===e.length?e:r.relative_urls?this.documentBaseURI.toRelative(e):this.documentBaseURI.toAbsolute(e,r.remove_script_host)},_x.prototype.addVisual=function(e){var t;t=e,hh(this).editor.addVisual(t)},_x.prototype.remove=function(){var e,t,n,r,o;(e=this).removed||(t=e._selectionOverrides,n=e.editorUpload,r=e.getBody(),o=e.getElement(),r&&e.save({is_removing:!0}),e.removed=!0,e.unbindAllNativeEvents(),e.hasHiddenInput&&o&&hv.remove(o.nextSibling),e.fire("remove"),e.editorManager.remove(e),!e.inline&&r&&hv.setStyle(e.id,"display",e.orgDisplay),e.fire("detach"),hv.remove(e.getContainer()),Gh(t),Gh(n),e.destroy())},_x.prototype.destroy=function(e){var t,n,r,o,i,a,u;n=e,a=(t=this).selection,u=t.dom,t.destroyed||(n||t.removed?(n||(t.editorManager.off("beforeunload",t._beforeUnload),t.theme&&t.theme.destroy&&t.theme.destroy(),Gh(a),Gh(u)),(o=(r=t).formElement)&&(o._mceOldSubmit&&(o.submit=o._mceOldSubmit,o._mceOldSubmit=null),hv.unbind(o,"submit reset",r.formEventDelegate)),(i=t).contentAreaContainer=i.formElement=i.container=i.editorContainer=null,i.bodyElement=i.contentDocument=i.contentWindow=null,i.iframeElement=i.targetElm=null,i.selection&&(i.selection=i.selection.win=i.selection.dom=i.selection.dom.doc=null),t.destroyed=!0):t.remove())},_x.prototype.uploadImages=function(e){return this.editorUpload.uploadImages(e)},_x.prototype._scanForImages=function(){return this.editorUpload.scanForImages()},_x.prototype.addButton=function(){throw new Error("editor.addButton has been removed in tinymce 5x, use editor.ui.registry.addButton or editor.ui.registry.addToggleButton or editor.ui.registry.addSplitButton instead")},_x.prototype.addSidebar=function(){throw new Error("editor.addSidebar has been removed in tinymce 5x, use editor.ui.registry.addSidebar instead")},_x.prototype.addMenuItem=function(){throw new Error("editor.addMenuItem has been removed in tinymce 5x, use editor.ui.registry.addMenuItem instead")},_x.prototype.addContextToolbar=function(){throw new Error("editor.addContextToolbar has been removed in tinymce 5x, use editor.ui.registry.addContextToolbar instead")},_x);function _x(e,t,n){var r,o,i,a,u,s,c,l,f,d,m,g,p,h,v,b,y,C,x=this;function w(n,r){return function(e,t){return n[e.toLowerCase()]=_e(_e({},t),{type:r})}}this.plugins={},this.contentCSS=[],this.contentStyles=[],this.loadedCSS={},this.isNotDirty=!1,this.editorManager=n,this.documentBaseUrl=n.documentBaseURL,wx(this,mx),this.settings=(d=(f=this).documentBaseUrl,m=n.defaultSettings,p=d,h=wv,v=f,b={id:e,theme:"silver",toolbar_mode:ev(g=t,"floating"),plugins:"",document_base_url:p,add_form_submit_trigger:!0,submit_patch:!0,add_unload_trigger:!0,convert_urls:!0,relative_urls:!0,remove_script_host:!0,object_resizing:!0,doctype:"<!DOCTYPE html>",visual:!0,font_size_legacy_values:"xx-small,small,medium,large,x-large,xx-large,300%",forced_root_block:"p",hidden_input:!0,inline_styles:!0,convert_fonts_to_spans:!0,indent:!0,indent_before:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,tfoot,tbody,tr,section,summary,article,hgroup,aside,figure,figcaption,option,optgroup,datalist",indent_after:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,tfoot,tbody,tr,section,summary,article,hgroup,aside,figure,figcaption,option,optgroup,datalist",entity_encoding:"named",url_converter:v.convertURL,url_converter_scope:v},y=_e(_e({},b),h?kv:{}),!1!==(C=nv(Sv||Ev,Sv,y,m,g)).deprecation_warnings&&Jh(g,C),C),this.settings.suffix&&(n.suffix=this.settings.suffix),this.suffix=n.suffix,this.settings.base_url&&n._setBaseUrl(this.settings.base_url),this.baseUri=n.baseURI,this.settings.referrer_policy&&(tu.ScriptLoader._setReferrerPolicy(this.settings.referrer_policy),Ja.DOM.styleSheetLoader._setReferrerPolicy(this.settings.referrer_policy)),su.languageLoad=this.settings.language_load,su.baseURL=n.baseURL,this.id=e,this.setDirty(!1),this.documentBaseURI=new Kd(this.settings.document_base_url,{base_uri:this.baseUri}),this.baseURI=this.baseUri,this.inline=!!this.settings.inline,this.shortcuts=new yx(this),this.editorCommands=new W1(this),this.settings.cache_suffix&&(xt.cacheSuffix=this.settings.cache_suffix.replace(/^[\?\&]+/,"")),this.ui={registry:{addAutocompleter:(u={},(r={addButton:w(o={},"button"),addGroupToolbarButton:w(o,"grouptoolbarbutton"),addToggleButton:w(o,"togglebutton"),addMenuButton:w(o,"menubutton"),addSplitButton:w(o,"splitbutton"),addMenuItem:w(i={},"menuitem"),addNestedMenuItem:w(i,"nestedmenuitem"),addToggleMenuItem:w(i,"togglemenuitem"),addAutocompleter:w(a={},"autocompleter"),addContextMenu:w(s={},"contextmenu"),addContextToolbar:w(c={},"contexttoolbar"),addContextForm:w(c,"contextform"),addSidebar:w(l={},"sidebar"),addIcon:function(e,t){return u[e.toLowerCase()]=t},getAll:function(){return{buttons:o,menuItems:i,icons:u,popups:a,contextMenus:s,contextToolbars:c,sidebars:l}}}).addAutocompleter),addButton:r.addButton,addContextForm:r.addContextForm,addContextMenu:r.addContextMenu,addContextToolbar:r.addContextToolbar,addIcon:r.addIcon,addMenuButton:r.addMenuButton,addMenuItem:r.addMenuItem,addNestedMenuItem:r.addNestedMenuItem,addSidebar:r.addSidebar,addSplitButton:r.addSplitButton,addToggleButton:r.addToggleButton,addGroupToolbarButton:r.addGroupToolbarButton,addToggleMenuItem:r.addToggleMenuItem,getAll:r.getAll},styleSheetLoader:void 0,show:te,hide:te,enable:te,disable:te,isDisabled:R};var S,E,N,k,_,A=(k=ru("design"),_=ru({design:{activate:te,deactivate:te,editorReadOnly:!1},readonly:{activate:te,deactivate:te,editorReadOnly:!0}}),(E=S=this).serializer?Z1(E):E.on("PreInit",function(){Z1(E)}),(N=S).on("ShowCaret",function(e){Q1(N)&&e.preventDefault()}),N.on("ObjectSelected",function(e){Q1(N)&&e.preventDefault()}),{isReadOnly:function(){return Q1(S)},set:function(e){return function(e,t,n,r){if(r!==n.get()){if(!Ne(t,r))throw new Error("Editor mode '"+r+"' is invalid");e.initialized?sx(e,n,t,r):e.on("init",function(){return sx(e,n,t,r)})}}(S,_.get(),k,e)},get:function(){return k.get()},register:function(e,t){_.set(function(e,t,n){var r;if(D(gx,t))throw new Error("Cannot override default mode "+t);return _e(_e({},e),((r={})[t]=_e(_e({},n),{deactivate:function(){try{n.deactivate()}catch(e){console.error("problem while deactivating editor mode "+t+":",e)}}}),r))}(_.get(),e,t))}});this.mode=A,this.setMode=A.set,n.fire("SetupEditor",{editor:this}),this.execCallback("setup",this),this.$=Wa.overrideDefaults(function(){return{context:x.inline?x.getBody():x.getDoc(),element:x.getBody()}})}function Ax(t){var n=t.type;Px(Hx.get(),function(e){switch(n){case"scroll":e.fire("ScrollWindow",t);break;case"resize":e.fire("ResizeWindow",t)}})}function Rx(e){e!==Mx&&(e?Wa(window).on("resize scroll",Ax):Wa(window).off("resize scroll",Ax),Mx=e)}function Dx(t){var e=Ux;delete Fx[t.id];for(var n=0;n<Fx.length;n++)if(Fx[n]===t){Fx.splice(n,1);break}return Ux=U(Ux,function(e){return t!==e}),Hx.activeEditor===t&&(Hx.activeEditor=0<Ux.length?Ux[0]:null),Hx.focusedEditor===t&&(Hx.focusedEditor=null),e.length!==Ux.length}var Tx,Ox=Ja.DOM,Bx=Et.explode,Px=Et.each,Lx=Et.extend,Ix=0,Mx=!1,Fx=[],Ux=[],zx="CSS1Compat"!==document.compatMode,Hx=_e(_e({},fx),{baseURI:null,baseURL:null,defaultSettings:{},documentBaseURL:null,suffix:null,$:Wa,majorVersion:"5",minorVersion:"10.0",releaseDate:"2021-10-11",editors:Fx,i18n:uu,activeEditor:null,focusedEditor:null,settings:{},setup:function(){var e,t="",n=Kd.getDocumentBaseUrl(document.location);/^[^:]+:\/\/\/?[^\/]+\//.test(n)&&(n=n.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,""),/[\/\\]$/.test(n)||(n+="/"));var r=window.tinymce||window.tinyMCEPreInit;if(r)e=r.base||r.baseURL,t=r.suffix;else{for(var o,i=document.getElementsByTagName("script"),a=0;a<i.length;a++)if(""!==(o=i[a].src||"")){var u=o.substring(o.lastIndexOf("/"));if(/tinymce(\.full|\.jquery|)(\.min|\.dev|)\.js/.test(o)){-1!==u.indexOf(".min")&&(t=".min"),e=o.substring(0,o.lastIndexOf("/"));break}}!e&&document.currentScript&&(-1!==(o=document.currentScript.src).indexOf(".min")&&(t=".min"),e=o.substring(0,o.lastIndexOf("/")))}this.baseURL=new Kd(n).toAbsolute(e),this.documentBaseURL=n,this.baseURI=new Kd(this.baseURL),this.suffix=t,this.on("AddEditor",A(md,this)),this.on("RemoveEditor",A(gd,this))},overrideDefaults:function(e){var t=e.base_url;t&&this._setBaseUrl(t);var n=e.suffix;e.suffix&&(this.suffix=n);var r=(this.defaultSettings=e).plugin_base_urls;void 0!==r&&ne(r,function(e,t){su.PluginManager.urls[t]=e})},init:function(r){function u(e){var t=e.id;return t||(t=ue(e,"name").filter(function(e){return!Ox.get(e)}).getOrThunk(Ox.uniqueId),e.setAttribute("id",t)),t}function s(e,t){return t.constructor===RegExp?t.test(e.className):Ox.hasClass(e,t)}var n,c=this,l=Et.makeMap("area base basefont br col frame hr img input isindex link meta param embed source wbr track colgroup option table tbody tfoot thead tr th td script noscript style textarea video audio iframe object menu"," "),f=function(e){n=e},t=function(){function n(e,t,n){var r=new kx(e,t,c);a.push(r),r.on("init",function(){++i===o.length&&f(a)}),r.targetElm=r.targetElm||n,r.render()}var o,e,i=0,a=[];Ox.unbind(window,"ready",t),(e=r.onpageload)&&e.apply(c,[]),o=Wa.unique(function(t){var n=[];if(xt.browser.isIE()&&xt.browser.version.major<11)return ay("TinyMCE does not support the browser you are using. For a list of supported browsers please see: https://www.tinymce.com/docs/get-started/system-requirements/"),[];if(zx)return ay("Failed to initialize the editor as the document is not in standards mode. TinyMCE requires standards mode."),[];if(t.types)return Px(t.types,function(e){n=n.concat(Ox.select(e.selector))}),n;if(t.selector)return Ox.select(t.selector);if(t.target)return[t.target];switch(t.mode){case"exact":var e=t.elements||"";0<e.length&&Px(Bx(e),function(t){var e=Ox.get(t);e?n.push(e):Px(document.forms,function(e){Px(e.elements,function(e){e.name===t&&(t="mce_editor_"+Ix++,Ox.setAttrib(e,"id",t),n.push(e))})})});break;case"textareas":case"specific_textareas":Px(Ox.select("textarea"),function(e){t.editor_deselector&&s(e,t.editor_deselector)||t.editor_selector&&!s(e,t.editor_selector)||n.push(e)})}return n}(r)),r.types?Px(r.types,function(t){Et.each(o,function(e){return!Ox.is(e,t.selector)||(n(u(e),Lx({},r,t),e),!1)})}):(Et.each(o,function(e){var t;(t=c.get(e.id))&&t.initialized&&!(t.getContainer()||t.getBody()).parentNode&&(Dx(t),t.unbindAllNativeEvents(),t.destroy(!0),t.removed=!0)}),0===(o=Et.grep(o,function(e){return!c.get(e.id)})).length?f([]):Px(o,function(e){var t=e;r.inline&&t.tagName.toLowerCase()in l?ay("Could not initialize inline editor on invalid inline target element",e):n(u(e),r,e)}))};return c.settings=r,Ox.bind(window,"ready",t),new kr(function(t){n?t(n):f=function(e){t(e)}})},get:function(t){return 0===arguments.length?Ux.slice(0):X(t)?M(Ux,function(e){return e.id===t}).getOr(null):E(t)&&Ux[t]||null},add:function(e){var n=this;return Fx[e.id]===e||(null===n.get(e.id)&&("length"!==e.id&&(Fx[e.id]=e),Fx.push(e),Ux.push(e)),Rx(!0),n.activeEditor=e,n.fire("AddEditor",{editor:e}),Tx||(Tx=function(e){var t=n.fire("BeforeUnload");if(t.returnValue)return e.preventDefault(),e.returnValue=t.returnValue,t.returnValue},window.addEventListener("beforeunload",Tx))),e},createEditor:function(e,t){return this.add(new kx(e,t,this))},remove:function(e){var t,n,r=this;if(e){if(!X(e))return n=e,l(r.get(n.id))?null:(Dx(n)&&r.fire("RemoveEditor",{editor:n}),0===Ux.length&&window.removeEventListener("beforeunload",Tx),n.remove(),Rx(0<Ux.length),n);Px(Ox.select(e),function(e){(n=r.get(e.id))&&r.remove(n)})}else for(t=Ux.length-1;0<=t;t--)r.remove(Ux[t])},execCommand:function(e,t,n){var r=this.get(n);switch(e){case"mceAddEditor":return this.get(n)||new kx(n,this.settings,this).render(),!0;case"mceRemoveEditor":return r&&r.remove(),!0;case"mceToggleEditor":return r?r.isHidden()?r.show():r.hide():this.execCommand("mceAddEditor",!1,n),!0}return!!this.activeEditor&&this.activeEditor.execCommand(e,t,n)},triggerSave:function(){Px(Ux,function(e){e.save()})},addI18n:function(e,t){uu.add(e,t)},translate:function(e){return uu.translate(e)},setActive:function(e){var t=this.activeEditor;this.activeEditor!==e&&(t&&t.fire("deactivate",{relatedTarget:e}),e.fire("activate",{relatedTarget:t})),this.activeEditor=e},_setBaseUrl:function(e){this.baseURL=new Kd(this.documentBaseURL).toAbsolute(e.replace(/\/+$/,"")),this.baseURI=new Kd(this.baseURL)}});function jx(e,t,n){var r=t.x,o=t.y,i=e.w,a=e.h,u=t.w,s=t.h,c=(n||"").split("");return"b"===c[0]&&(o+=s),"r"===c[1]&&(r+=u),"c"===c[0]&&(o+=Jx(s/2)),"c"===c[1]&&(r+=Jx(u/2)),"b"===c[3]&&(o-=a),"r"===c[4]&&(r-=i),"c"===c[3]&&(o-=Jx(a/2)),"c"===c[4]&&(r-=Jx(i/2)),qx(r,o,i,a)}function Vx(){}Hx.setup();function qx(e,t,n,r){return{x:e,y:t,w:n,h:r}}var $x,Wx,Kx,Xx,Yx=Math.min,Gx=Math.max,Jx=Math.round,Qx={inflate:function(e,t,n){return qx(e.x-t,e.y-n,e.w+2*t,e.h+2*n)},relativePosition:jx,findBestRelativePosition:function(e,t,n,r){for(var o,i=0;i<r.length;i++)if((o=jx(e,t,r[i])).x>=n.x&&o.x+o.w<=n.w+n.x&&o.y>=n.y&&o.y+o.h<=n.h+n.y)return r[i];return null},intersect:function(e,t){var n=Gx(e.x,t.x),r=Gx(e.y,t.y),o=Yx(e.x+e.w,t.x+t.w),i=Yx(e.y+e.h,t.y+t.h);return o-n<0||i-r<0?null:qx(n,r,o-n,i-r)},clamp:function(e,t,n){var r=e.x,o=e.y,i=e.x+e.w,a=e.y+e.h,u=t.x+t.w,s=t.y+t.h,c=Gx(0,t.x-r),l=Gx(0,t.y-o),f=Gx(0,i-u),d=Gx(0,a-s);return r+=c,o+=l,n&&(i+=c,a+=l,r-=f,o-=d),qx(r,o,(i-=f)-r,(a-=d)-o)},create:qx,fromClientRect:function(e){return qx(e.left,e.top,e.width,e.height)}},Zx=($x={},Wx={},{load:function(r,o){var i='Script at URL "'+o+'" failed to load',a='Script at URL "'+o+"\" did not call `tinymce.Resource.add('"+r+"', data)` within 1 second";if(void 0!==$x[r])return $x[r];var e=new kr(function(e,t){var n=function(e,t,n){function r(n){return function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];o||(o=!0,null!==i&&(clearTimeout(i),i=null),n.apply(null,e))}}void 0===n&&(n=1e3);var o=!1,i=null,a=r(e),u=r(t);return{start:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];o||null!==i||(i=setTimeout(function(){return u.apply(null,e)},n))},resolve:a,reject:u}}(e,t);Wx[r]=n.resolve,tu.ScriptLoader.loadScript(o,function(){return n.start(a)},function(){return n.reject(i)})});return $x[r]=e},add:function(e,t){void 0!==Wx[e]&&(Wx[e](t),delete Wx[e]),$x[e]=kr.resolve(t)}}),ew=Et.each,tw=Et.extend;Vx.extend=Kx=function(n){function r(){var e,t,n;if(!Xx&&(this.init&&this.init.apply(this,arguments),t=this.Mixins))for(e=t.length;e--;)(n=t[e]).init&&n.init.apply(this,arguments)}function t(){return this}var o=this.prototype;Xx=!0;var i=new this;return Xx=!1,n.Mixins&&(ew(n.Mixins,function(e){for(var t in e)"init"!==t&&(n[t]=e[t])}),o.Mixins&&(n.Mixins=o.Mixins.concat(n.Mixins))),n.Methods&&ew(n.Methods.split(","),function(e){n[e]=t}),n.Properties&&ew(n.Properties.split(","),function(e){var t="_"+e;n[e]=function(e){return void 0!==e?(this[t]=e,this):this[t]}}),n.Statics&&ew(n.Statics,function(e,t){r[t]=e}),n.Defaults&&o.Defaults&&(n.Defaults=tw({},o.Defaults,n.Defaults)),ne(n,function(e,t){var n,r;"function"==typeof e&&o[t]?i[t]=(n=t,r=e,function(){var e=this._super;this._super=o[n];var t=r.apply(this,arguments);return this._super=e,t}):i[t]=e}),r.prototype=i,(r.constructor=r).extend=Kx,r};var nw,rw,ow,iw=Math.min,aw=Math.max,uw=Math.round,sw={serialize:function(e){var t=JSON.stringify(e);return X(t)?t.replace(/[\u0080-\uFFFF]/g,function(e){var t=e.charCodeAt(0).toString(16);return"\\u"+"0000".substring(t.length)+t}):t},parse:function(e){try{return JSON.parse(e)}catch(e){}}},cw={callbacks:{},count:0,send:function(t){var n=this,r=Ja.DOM,o=(void 0!==t.count?t:n).count,i="tinymce_jsonp_"+o;n.callbacks[o]=function(e){r.remove(i),delete n.callbacks[o],t.callback(e)},r.add(r.doc.body,"script",{id:i,src:t.url,type:"text/javascript"}),n.count++}},lw=_e(_e({},fx),{send:function(e){var t,n=0,r=function(){!e.async||4===t.readyState||1e4<n++?(e.success&&n<1e4&&200===t.status?e.success.call(e.success_scope,""+t.responseText,t,e):e.error&&e.error.call(e.error_scope,1e4<n?"TIMED_OUT":"GENERAL",t,e),t=null):_r.setTimeout(r,10)};if(e.scope=e.scope||this,e.success_scope=e.success_scope||e.scope,e.error_scope=e.error_scope||e.scope,e.async=!1!==e.async,e.data=e.data||"",lw.fire("beforeInitialize",{settings:e}),(t=new XMLHttpRequest).overrideMimeType&&t.overrideMimeType(e.content_type),t.open(e.type||(e.data?"POST":"GET"),e.url,e.async),e.crossDomain&&(t.withCredentials=!0),e.content_type&&t.setRequestHeader("Content-Type",e.content_type),e.requestheaders&&Et.each(e.requestheaders,function(e){t.setRequestHeader(e.key,e.value)}),t.setRequestHeader("X-Requested-With","XMLHttpRequest"),(t=lw.fire("beforeSend",{xhr:t,settings:e}).xhr).send(e.data),!e.async)return r();_r.setTimeout(r,10)}}),fw=Et.extend,dw=(mw.sendRPC=function(e){return(new mw).send(e)},mw.prototype.send=function(e){var n=e.error,r=e.success,o=fw(this.settings,e);o.success=function(e,t){(e=void 0===(e=sw.parse(e))?{error:"JSON Parse error."}:e).error?n.call(o.error_scope||o.scope,e.error,t):r.call(o.success_scope||o.scope,e.result)},o.error=function(e,t){n&&n.call(o.error_scope||o.scope,e,t)},o.data=sw.serialize({id:e.id||"c"+this.count++,method:e.method,params:e.params}),o.content_type="application/json",lw.send(o)},mw);function mw(e){this.settings=fw({},e),this.count=0}try{var gw,pw="__storage_test__";(gw=window.localStorage).setItem(pw,pw),gw.removeItem(pw)}catch(e){nw={},rw=[],ow={getItem:function(e){return nw[e]||null},setItem:function(e,t){rw.push(e),nw[e]=String(t)},key:function(e){return rw[e]},removeItem:function(t){rw=rw.filter(function(e){return e===t}),delete nw[t]},clear:function(){rw=[],nw={}},length:0},Object.defineProperty(ow,"length",{get:function(){return rw.length},configurable:!1,enumerable:!1}),gw=ow}var hw={geom:{Rect:Qx},util:{Promise:kr,Delay:_r,Tools:Et,VK:Bf,URI:Kd,Class:Vx,EventDispatcher:nx,Observable:fx,I18n:uu,XHR:lw,JSON:sw,JSONRequest:dw,JSONP:cw,LocalStorage:gw,Color:function(e){function t(e){var t;return"object"==typeof e?"r"in e?(u=e.r,s=e.g,c=e.b):"v"in e&&function(e,t,n){if(e=(parseInt(e,10)||0)%360,t=parseInt(t,10)/100,n=parseInt(n,10)/100,t=aw(0,iw(t,1)),n=aw(0,iw(n,1)),0!==t){var r=e/60,o=n*t,i=o*(1-Math.abs(r%2-1)),a=n-o;switch(Math.floor(r)){case 0:u=o,s=i,c=0;break;case 1:u=i,s=o,c=0;break;case 2:u=0,s=o,c=i;break;case 3:u=0,s=i,c=o;break;case 4:u=i,s=0,c=o;break;case 5:u=o,s=0,c=i;break;default:u=s=c=0}u=uw(255*(u+a)),s=uw(255*(s+a)),c=uw(255*(c+a))}else u=s=c=uw(255*n)}(e.h,e.s,e.v):(t=/rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)[^\)]*\)/gi.exec(e))?(u=parseInt(t[1],10),s=parseInt(t[2],10),c=parseInt(t[3],10)):(t=/#([0-F]{2})([0-F]{2})([0-F]{2})/gi.exec(e))?(u=parseInt(t[1],16),s=parseInt(t[2],16),c=parseInt(t[3],16)):(t=/#([0-F])([0-F])([0-F])/gi.exec(e))&&(u=parseInt(t[1]+t[1],16),s=parseInt(t[2]+t[2],16),c=parseInt(t[3]+t[3],16)),u=u<0?0:255<u?255:u,s=s<0?0:255<s?255:s,c=c<0?0:255<c?255:c,n}var n={},u=0,s=0,c=0;return e&&t(e),n.toRgb=function(){return{r:u,g:s,b:c}},n.toHsv=function(){return e=u,t=s,n=c,o=0,(i=iw(e/=255,iw(t/=255,n/=255)))===(a=aw(e,aw(t,n)))?{h:0,s:0,v:100*(o=i)}:(r=(a-i)/a,{h:uw(60*((e===i?3:n===i?1:5)-(e===i?t-n:n===i?e-t:n-e)/((o=a)-i))),s:uw(100*r),v:uw(100*o)});var e,t,n,r,o,i,a},n.toHex=function(){function e(e){return 1<(e=parseInt(e,10).toString(16)).length?e:"0"+e}return"#"+e(u)+e(s)+e(c)},n.parse=t,n},ImageUploader:function(n){var e=Hv(),r=Wv(n,e);return{upload:function(e,t){return r.upload(e,(t=void 0===t||t)?$v(n):void 0)}}}},dom:{EventUtils:ai,Sizzle:aa,DomQuery:Wa,TreeWalker:Rr,TextSeeker:Nu,DOMUtils:Ja,ScriptLoader:tu,RangeUtils:Of,Serializer:Xh,StyleSheetLoader:wr,ControlSelection:Cf,BookmarkManager:Fl,Selection:Lh,Event:ai.Event},html:{Styles:ro,Entities:Go,Node:Ud,Schema:to,SaxParser:Gd,DomParser:$h,Writer:tm,Serializer:nm},Env:xt,AddOnManager:su,Annotator:Ml,Formatter:Jv,UndoManager:Zv,EditorCommands:W1,WindowManager:Pv,NotificationManager:uv,EditorObservable:mx,Shortcuts:yx,Editor:kx,FocusManager:Ld,EditorManager:Hx,DOM:Ja.DOM,ScriptLoader:tu.ScriptLoader,PluginManager:Ov,ThemeManager:Bv,IconManager:_v,Resource:Zx,trim:Et.trim,isArray:Et.isArray,is:Et.is,toArray:Et.toArray,makeMap:Et.makeMap,each:Et.each,map:Et.map,grep:Et.grep,inArray:Et.inArray,extend:Et.extend,create:Et.create,walk:Et.walk,createNS:Et.createNS,resolve:Et.resolve,explode:Et.explode,_addCacheSuffix:Et._addCacheSuffix,isOpera:xt.opera,isWebKit:xt.webkit,isIE:xt.ie,isGecko:xt.gecko,isMac:xt.mac},vw=Et.extend(Hx,hw),bw=vw;window.tinymce=bw,window.tinyMCE=bw,function(e){if("object"==typeof module)try{module.exports=e}catch(e){}}(vw)}();
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/tool.js b/public/static/assets/gougu/module/tool.js
new file mode 100644
index 0000000000000000000000000000000000000000..ce72df35cdbd9b6a21dfc23b179a838ae6140768
--- /dev/null
+++ b/public/static/assets/gougu/module/tool.js
@@ -0,0 +1,646 @@
+layui.define(function (exports) {
+	let MOD_NAME = 'tool',dropdown=layui.dropdown;
+	let tool = {
+		loading: false,
+		expressClose:function(index){return '<div class="express-close" data-index="'+index+'" title="关闭">\
+			<div class="express-container">\
+				<div class="express-bar">\
+					<svg viewBox="0 0 202.9 45.5" >\
+					  <clipPath id="menu" clipPathUnits="objectBoundingBox" transform="scale(0.0049285362247413 0.021978021978022)">\
+						<path  d="M6.7,45.5c5.7,0.1,14.1-0.4,23.3-4c5.7-2.3,9.9-5,18.1-10.5c10.7-7.1,11.8-9.2,20.6-14.3c5-2.9,9.2-5.2,15.2-7c7.1-2.1,13.3-2.3,17.6-2.1c4.2-0.2,10.5,0.1,17.6,2.1c6.1,1.8,10.2,4.1,15.2,7c8.8,5,9.9,7.1,20.6,14.3c8.3,5.5,12.4,8.2,18.1,10.5c9.2,3.6,17.6,4.2,23.3,4H6.7z"/>\
+					  </clipPath>\
+					</svg>\
+				</div>\
+				<div class="express-btn">\
+					<svg class="express-icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M463.787 512l-253.44-253.44a34.133 34.133 0 0 1 48.213-48.213L512 463.787l253.44-253.44a34.133 34.133 0 1 1 48.213 48.213L560.213 512l253.44 253.44a34.133 34.133 0 1 1-48.213 48.213L512 560.213l-253.44 253.44a34.133 34.133 0 0 1-48.213-48.213z" fill="#ffffff"></path></svg>\
+				</div>\
+			</div>\
+		</div>'
+		},
+		side: function (url, width) {
+			let that = this;
+			if (that.loading == true) {
+				return false;
+			}
+			that.loading = true;
+			sideWidth = '80%';
+			if(window.innerWidth>1366 && window.innerWidth<=1600){
+				sideWidth = '86%';
+			}
+			if(window.innerWidth>1000 && window.innerWidth<=1440){
+				sideWidth = '93%';
+			}
+			if(window.innerWidth<=1000){
+				sideWidth = '95%';
+			}
+			$(parent.$('.express-close')).addClass('parent-colse');
+			layer.open({
+				type: 2,
+				title: false,
+				offset: 'r',
+				anim: 'slideLeft',
+				closeBtn: 0,
+				content: url,
+				area: [sideWidth, '100%'],
+				skin:'layui-layer-gougu-admin',
+				end: function(){
+					$('body').removeClass('right-open');
+					$(parent.$('.express-close')).removeClass('parent-colse');
+					if (layui.pageTable && layui.pageTable.resize) {
+						layui.pageTable.resize();
+					}
+				},
+				success: function (obj, index) {
+					$('body').addClass('right-open');
+					obj.append(that.expressClose(index));
+					that.loading = false;
+					obj.on('click','.express-close', function () {					
+						layer.close(index);
+					})
+				}
+			})
+		},
+		box: function (url,title="内容", width=720,height=405) {
+			let that = this;
+			if (that.loading == true) {
+				return false;
+			}
+			that.loading = true;
+			layer.open({
+				type: 2,
+				title: title,
+				content: url,
+				area: [width+'px', height+'px'],
+				maxmin: true,
+				end: function(){
+					if (layui.pageTable && layui.pageTable.resize) {
+						layui.pageTable.resize();
+					}
+				},
+				success: function (obj, index) {
+					let btn = '<div data-index="'+index+'" class="express-close" style="display:none;" title="关闭">关闭</div>';
+					obj.append(btn);
+					that.loading = false;
+					obj.on('click','.express-close', function () {					
+						layer.close(index);
+					})
+				}
+			})
+		},
+		//右侧ajax请求的方式打开页面参考勾股DEV
+		open: function (url, width) {
+			let that = this;
+			if (that.loading == true) {
+				return false;
+			}
+			that.loading = true;
+			let countWidth = window.innerWidth-(window.innerWidth*0.5)+456;
+			if(window.innerWidth<=1000){
+				countWidth = 750;
+			}
+			if (width && width > 0) {
+				sideWidth = width + 'px';
+			}
+			else{
+				sideWidth = countWidth + 'px';
+			}
+			$.ajax({
+				url: url,
+				type: "GET",
+				timeout: 10000,
+				success: function (res) {
+					if (res['code'] && res['code'] > 0) {
+						layer.msg(res.msg);
+						return false;
+					}
+					let index = timestamp = new Date().getTime();
+					let express = '<section id="expressLayer" class="express-box" style="width:' + sideWidth + '"><article id="articleLayer">' + res + '</article>'+that.expressClose(index)+'</section><div id="expressMask" class="express-mask"></div>';
+
+					$('body').append(express).addClass('right-open');
+					$('#expressMask').fadeIn(200);
+					$('#expressLayer').animate({ 'right': 0 }, 200, 'linear', function () {
+						if (typeof (openInit) == "function") {
+							openInit();
+						}						
+					});					
+					that.loading = false;					
+					//关闭
+					$('body').on('click','.express-close', function () {
+						$('#expressMask').fadeOut(100);
+						$('body').removeClass('right-open');
+						let op_width = $('#expressLayer').outerWidth();
+						$('#expressLayer').animate({ left: '+=' + op_width + 'px' }, 200, 'linear', function () {
+							$('#expressLayer').remove();
+							$('#expressMask').remove();
+							if (layui.pageTable) {
+								layui.pageTable.resize();
+							}
+						})
+					})
+					$(window).resize(function () {
+						let resizeWidth = window.innerWidth-(window.innerWidth*0.5)+456;
+						if(window.innerWidth<=1000){
+							resizeWidth = 750;
+						}
+						$('#expressLayer').width(resizeWidth);
+					})
+				},
+				error: function (xhr, textstatus, thrown) {
+					console.log('错误');
+				},
+				complete: function () {
+					that.loading = false;
+				}
+			});
+		},
+		load: function (url) {
+			let that = this;
+			if (that.loading == true) {
+				return false;
+			}
+			that.loading = true;
+			$.ajax({
+				url: url,
+				type: "GET",
+				timeout: 10000,
+				success: function (res) {
+					if (res['code'] && res['code'] > 0) {
+						layer.msg(res.msg);
+						return false;
+					}
+					$('#articleLayer').html(res);
+					openInit();
+				}
+				, error: function (xhr, textstatus, thrown) {
+					console.log('错误');
+				},
+				complete: function () {
+					that.loading = false;
+				}
+			});
+		},
+		page: function (url) {
+			let that = this;
+			if (that.loading == true) {
+				return false;
+			}
+			that.loading = true;
+			$.ajax({
+				url: url,
+				type: "GET",
+				timeout: 10000,
+				success: function (res) {
+					if (res['code'] && res['code'] > 0) {
+						layer.msg(res.msg);
+						return false;
+					}
+					$('#pageBox').html(res);
+					pageInit();
+				},
+				error: function (xhr, textstatus, thrown) {
+					console.log('错误');
+				},
+				complete: function () {
+					that.loading = false;
+				}
+			});
+		},
+		reload: function (delay) {
+			//延迟刷新，一般是在编辑完页面数据后需要自动关闭页面用到
+			if(delay && delay>0){
+				setTimeout(function () {
+					location.reload();
+				}, delay);
+			}else{
+				location.reload();
+			}
+		},
+		ask:function(tips,yes,cancel){
+			layer.confirm(tips, {
+				icon: 3,
+				title: '提示',
+				success:function(){
+					$(parent.$('.express-close')).addClass('parent-colse');
+				},
+				end:function(){
+					$(parent.$('.express-close')).removeClass('parent-colse');
+				}
+			}, function (index) {
+				if (yes && typeof yes === 'function') {
+					yes();
+				}
+				layer.close(index);
+			}, function (index) {
+				if (cancel && typeof cancel === 'function') {
+					cancel();
+				}
+				layer.close(index);
+			});
+		},
+		close: function (delay,table) {
+			//延迟关闭，一般是在编辑完页面数据后需要自动关闭页面用到
+			if(delay && delay>0){
+				setTimeout(function () {
+					$('.express-close').last().click();
+				}, delay);
+			}else{
+				$('.express-close').last().click();
+			}
+			if (typeof(table) == "undefined" || table == '') {
+				table = 'pageTable';
+			}
+			if (layui[table]) {
+				layui[table].reload();
+			}
+			else{
+				tool.reload(delay);
+			}
+		},
+		ajax: function (options, callback, clickbtn) {
+			let format = 'json';
+			if (options.hasOwnProperty('data')) {
+				format = options.data.hasOwnProperty('format') ? options.data.format : 'json';
+			}
+			callback = callback || options.success;
+			callback && delete options.success;
+			let optsetting = { timeout: 10000 };
+			if (format == 'jsonp') {
+				optsetting = { timeout: 10000, dataType: 'jsonp', jsonp: 'callback' }
+			}
+			let opts = $.extend({}, optsetting, {
+				success: function (res) {
+					if (callback && typeof callback === 'function') {
+						callback(res);
+					}
+				},
+				beforeSend:function(){
+					if (clickbtn && typeof clickbtn === 'object') {
+						clickbtn.attr('disabled',true).html('提交中 ...');
+					}					
+				},
+				complete: function () {
+					if (clickbtn && typeof clickbtn === 'object') {
+						setTimeout(function(){
+							clickbtn.removeAttr('disabled').html('立即提交');
+						},1000);					
+					}					
+				}
+			}, options);
+			$.ajax(opts);
+		},
+		get: function (url, data, callback) {
+			this.ajax({url: url,type: "GET",data: data}, callback);
+		},
+		post: function (url, data, callback, clickbtn) {
+			this.ajax({url: url,type: "POST",data: data}, callback, clickbtn);
+		},
+		put: function (url, data, callback) {
+			this.ajax({url: url,type: "PUT",data: data}, callback);
+		},
+		delete: function (url, data, callback) {
+			this.ajax({url: url,type: "DELETE",data: data}, callback);
+		},
+		parentAdmin:function () {
+			if(parent.layui.admin){
+				return parent.layui.admin;
+			}
+			else{
+				if(parent.parent.layui.admin){
+					return parent.parent.layui.admin;
+				}
+				else{
+					if(parent.parent.parent.layui.admin){
+						return parent.parent.parent.layui.admin;
+					}
+					else{
+						return false;
+					}
+				}
+			}
+		},
+		sideClose(delay,table){
+			if(parent.layui.tool){
+				parent.layui.tool.close(delay,table);
+			}
+			else{
+				console.log('父页面没引用tool模块');
+			}		
+		},
+		tabAdd:function(url,title,id){
+			let parentAdmin = this.parentAdmin();
+			if(parentAdmin){
+				parentAdmin.sonAdd(url,title,id);
+			}		
+		},
+		tabClose:function(){
+			let parentAdmin = this.parentAdmin();
+			if(parentAdmin){
+				parentAdmin.sonClose();
+			}
+		},
+		tabDelete:function(id){
+			let parentAdmin = this.parentAdmin();
+			if(parentAdmin){
+				parentAdmin.tabDelete(id);
+			}
+		},
+		tabChange:function(id){
+			let parentAdmin = this.parentAdmin();
+			if(parentAdmin){
+				parentAdmin.tabChange(id);
+			}
+		},
+		tabRefresh:function(id){
+			let parentAdmin = this.parentAdmin();
+			if(parentAdmin){
+				parentAdmin.refresh(id);
+			}			
+		},
+		officeView:function(id,mode){
+			let parentAdmin = this.parentAdmin();
+			if(parentAdmin){
+				parentAdmin.officeView(id,mode);
+			}			
+		},
+		pdfView:function(href){
+			let parentAdmin = this.parentAdmin();
+			if(parentAdmin){
+				parentAdmin.pdfView(href);
+			}			
+		},
+		photoView:function(href){
+			let parentAdmin = this.parentAdmin();
+			if(parentAdmin){
+				parentAdmin.photoView(href);
+			}		
+		},
+		videoView:function(href){
+			let parentAdmin = this.parentAdmin();
+			if(parentAdmin){
+				parentAdmin.videoView(href);
+			}		
+		},
+		audioView:function(href){
+			let parentAdmin = this.parentAdmin();
+			if(parentAdmin){
+				parentAdmin.audioView(href);
+			}		
+		},
+		articleView:function(fileid) {
+			tool.side('/disk/index/view_article?id='+fileid);
+		},
+		articleEdit:function(fileid) {
+			tool.side('/disk/index/add_article?id='+fileid);
+		},
+		downloadFile:function(url, fileName) {
+			let link = document.createElement("a");
+			link.href = url;
+			link.download = fileName;
+			link.click();
+			layer.msg('文件下载中...', {time: 2000});
+		},
+		copyCtrl:function(content) {
+			var save = function(e){
+				e.clipboardData.setData('text/plain', content);
+				e.preventDefault();
+			}
+			document.addEventListener('copy', save);
+			document.execCommand('copy');
+			document.removeEventListener('copy',save);
+			if (content != '') {
+				layer.msg('复制成功');
+			}
+		}
+	};
+	//时间选择快捷操作
+	$('body').on('click', '.tool-time', function () {
+		let that = $(this);
+        let type = that.data('type');
+        let range = that.data('range');
+        let min = that.data('min');
+        let max = that.data('max');
+        let format = that.data('format');
+		if (typeof(type) == "undefined" || type === '') {
+			type = 'date';
+		}
+		if (typeof(range) == "undefined" || type === '') {
+			range = false;
+		}
+		if (typeof(min) == "undefined" || min === '') {
+			min = '1900-1-1';
+		}
+		if (typeof(max) == "undefined" || max === '') {
+			max = '2099-1-1';
+		}
+		if (typeof(format) == "undefined" || format === '') {
+			layui.laydate.render({ 
+				elem: that,
+				show: true,
+				type: type,
+				range: range,
+				min: min,
+				max: max,
+				fullPanel: true
+			});
+		}else{
+			layui.laydate.render({ 
+				elem: that,
+				show: true,
+				type: type,
+				range: range,
+				min: min,
+				max: max,
+				format:format,
+				fullPanel: true
+			});
+		}
+
+		return false;
+	});
+
+	//附件操作	
+	const ctrlBtn=function(ctrl){
+			//操作按钮'0下载','1查看','2编辑','3重命名','4删除','5移动','6分享','7取消分享','8标星','9取消标星','10还原','11清除'
+		let ctrl_types = ['下载','查看','编辑','重命名','删除','移动','分享','取消分享','标星','取消标星','还原','清除'];
+		let	ctrls=[];
+		for(let i=0;i<ctrl.length;i++){
+			ctrls.push({"id":ctrl[i]+'',"title":ctrl_types[ctrl[i]]});
+		}
+		return ctrls;
+	}
+	
+	$('body').on('click','.file-ctrl',function () {
+		let that = $(this);
+		let ctrl = $(this).data('ctrl');
+		let fileid = $(this).data('fileid');
+		let filename = $(this).data('filename');
+		let type = $(this).data('type');
+		let ext = $(this).data('ext');
+		let href = $(this).data('href');
+		let actionid=0;
+		let file_menu = ctrlBtn([0]);
+		//type:0下载+重命名+删除，1下载+查看+重命名+删除，2下载+查看+编辑+重命名+删除
+		if(ctrl=='edit'){
+			let types=[
+				[0,1,3,4],//下载+查看+重命名+删除
+				[0,1,3,4],//下载+查看+重命名+删除
+				[0,1,2,3,4]//下载+查看+编辑+重命名+删除
+			];
+			file_menu = ctrlBtn(types[type]);
+		}
+		if(ctrl=='view'){
+			if(type==0){
+				file_menu = ctrlBtn([0]);
+			}
+			else{
+				file_menu = ctrlBtn([0,1]);
+			}
+		}
+		if(ctrl=='disk'){
+			if(type!=''){
+				actionid = $(this).data('actionid');
+				file_menu = ctrlBtn((type+'').split(","));
+			}
+		}
+		console.log(actionid);
+		dropdown.render({
+			elem: that,
+			className:'file-menu',
+			align: 'right',
+			show: true, // 外部事件触发即显示
+			data: file_menu,
+			click: function(obj){
+				let click_t = obj.id;
+				switch (click_t) {
+				  case '0':
+					tool.downloadFile(href,filename);
+					break;
+				  case '1':
+					if(ext=='image'){
+						tool.photoView(href);
+					}
+					if(ext=='pdf'){
+						tool.pdfView(href);
+					}
+					if(ext=='video'){
+						tool.videoView(href);
+					}
+					if(ext=='audio'){
+						tool.audioView(href);
+					}
+					if(ext=='office'){
+						if(ctrl=='disk'){
+							tool.officeView(actionid,'view');
+						}
+						else{
+							tool.officeView(fileid,'view');
+						}
+					}
+					if(ext=='article'){
+						tool.articleView(fileid);
+					}
+					break;
+				  case '2':
+					if(ext=='office'){
+						if(ctrl=='disk'){
+							tool.officeView(actionid,'view');
+						}
+						else{
+							tool.officeView(fileid,'view');
+						}
+					}
+					if(ext=='article'){
+						tool.articleEdit(fileid);
+					}
+					break;
+				  case '3'://编辑
+					$('#fileEdit'+fileid).click();
+					break;
+				  case '4'://删除
+					$('#fileDel'+fileid).click();
+					break;
+				  case '5'://移动
+					$('#fileMove'+fileid).click();
+					break;
+				  case '6'://分享
+					$('#fileShare'+fileid).click();
+					break;
+				  case '7'://取消分享
+					$('#fileShareno'+fileid).click();
+					break;
+				 case '8'://标星
+					$('#fileStar'+fileid).click();
+					break;
+				  case '9'://取消标星
+					$('#fileStarno'+fileid).click();
+					break;
+				  case '10'://还原
+					$('#fileBack'+fileid).click();
+					break;
+				  case '11'://清除
+					$('#fileClear'+fileid).click();
+					break;
+				  default:
+					return false;
+					break;
+				}				
+			}
+		});
+	});
+	
+	//搜索表单重置快捷操作
+	$('body').on('click', '[lay-filter="reset"]', function () {
+		let that = $(this);
+        let prev = that.prev();
+		if (typeof(prev) != "undefined") {
+			setTimeout(function () {
+				prev.click();
+			}, 10)
+		}
+	});
+	
+	//新建按钮快捷操作
+	$('body').on('click', '.tool-add', function () {
+		let href = $(this).data('href');
+		if (typeof(href) == "undefined" || href == '') {
+			return false;
+		}
+		tool.side(href);	
+		return false;
+	});
+	
+	$('body').on('click', '.tab-a', function () {
+        let id = $(this).data('id');
+		let url = $(this).data('href');
+		let title = $(this).data('title');
+		if (url && url !== '') {
+			if (typeof(id) == "undefined" || id == '') {
+				id = Date.now();
+			}
+			tool.tabAdd(url,title,id);
+		}
+		return false;
+	});
+	$('body').on('click', '.side-a', function () {
+		let url = $(this).data('href');
+		if (url && url !== '') {
+			tool.side(url);
+		}
+		return false;
+	});
+	$('body').on('click', '.open-a', function () {
+		let url = $(this).data('href');
+		if (url && url !== '') {
+			tool.open(url);
+		}
+		return false;
+	});
+	$('body').on('click', '.link-a', function () {
+		let url = $(this).data('href');
+		if (url && url !== '') {
+			window.location.href=url;
+		}
+		return false;
+	});
+	exports(MOD_NAME, tool);
+});  
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/uploadPlus.js b/public/static/assets/gougu/module/uploadPlus.js
new file mode 100644
index 0000000000000000000000000000000000000000..414802c0cf3366b597aff29a0efe9cb1c094c0a1
--- /dev/null
+++ b/public/static/assets/gougu/module/uploadPlus.js
@@ -0,0 +1,581 @@
+layui.define(['tool'],function(exports){
+	let layer = layui.layer,element = layui.element,tool=layui.tool,form = layui.form,upload = layui.upload,uploadIndex=0;
+	// 查找指定的元素在数组中的位置
+	Array.prototype.indexOf = function (val) {
+		for (var i = 0; i < this.length; i++) {
+			if (this[i] == val) {
+				return i;
+			}
+		}
+		return -1;
+	};
+	// 通过索引删除数组元素
+	Array.prototype.remove = function (val) {
+		var index = this.indexOf(val);
+		if (index > -1) {
+			this.splice(index, 1);
+		}
+	};	
+	//格式化文件大小
+	function renderSize(value){
+		if(null==value||value==''){
+			 return "0 Bytes";
+		}
+		var unitArr = new Array("Bytes","KB","MB","GB","TB","PB","EB","ZB","YB");
+		var index=0;
+		var srcsize = parseFloat(value);
+		index=Math.floor(Math.log(srcsize)/Math.log(1024));
+		var size =srcsize/Math.pow(1024,index);
+		size=size.toFixed(2);//保留的小数位数
+		return size+unitArr[index];
+	}	
+	//是否是对象
+	let isObject = function(obj) {
+		return Object.prototype.toString.call(obj) === '[object Object]';
+	}
+	const opts={
+		"title":'上传文件',
+		"url":'/api/index/upload',
+		"target":'uploadBtn',
+		"targetBox":'uploadBox',
+		"use":'attachment',//attachment(附件上传),shard(大文件分片上传),single(单图上传),multi(多图上传),import(excel导入上传)
+		"attachment":{
+			"type":0,//0ajax多文件模式，1ajax单文件单记录模式
+			"exts": 'png|jpg|gif|jpeg|doc|docx|ppt|pptx|xls|xlsx|pdf|zip|rar|7z|txt|wps|avi|wmv|mpg|mov|rm|flv|mp4|mp3|wav|wma|flac|midi|dwg|dxf|dwt|xmind', //只允许上传文件格式
+			"colmd":4,
+			"uidDelete":false,//是否开启只有上传人自己才能删除自己的附件
+			"ajaxSave":null,
+			"ajaxDelete":null
+		},
+		"shard":{
+			"exts": 'png|jpg|gif|jpeg|doc|docx|ppt|pptx|xls|xlsx|pdf|zip|rar|7z|txt|wps|avi|wmv|mpg|mov|rm|flv|mp4|mp3|wav|wma|flac|midi|dwg|dxf|dwt|xmind', //只允许上传文件格式
+		},
+		"single":{
+			"exts": 'png|jpg|gif|jpeg',
+		},
+		"multi":{
+			"exts": 'png|jpg|gif|jpeg',
+			"type":1,
+			"max":31,
+		},
+		"import":{
+			"exts": 'xls|xlsx',
+			"template":null,
+			"tips":'如果导入失败，请根据提示注意检查表格数据。'
+		},
+		"callback": null
+	};
+	var uploadPlus = function(options){
+		this.settings = $.extend(true,{},opts, options);
+		this.settings.index = uploadIndex;
+		uploadIndex++;
+		let me=this;
+		switch (me.settings.use) {
+			case "shard":
+				//分片上传
+				me.shardUpload();
+				break;
+			case "single":
+				me.singleImage();
+				break;
+			case "multi":
+				if(isObject(me.settings.target)){
+					me.multiImage();
+				}
+				else{
+					$('#'+me.settings.target).click(function(){
+						me.multiImage();
+					});
+				}
+				break;
+			case "import":
+				me.excelImport();
+				break;
+			default:
+				me.attachment();
+		}
+	};    
+	uploadPlus.prototype = {
+		attachment: function () {
+			let me = this;
+			let box = $('#'+me.settings.targetBox);
+			let boxInput = box.find('[data-type="file"]');
+			let attachment = me.settings.attachment;
+			//删除附件
+			box.on('click', '.file-delete', function () {
+				let id = $(this).data('id'),file_id = $(this).data('fileid'),uid = $(this).data('uid');
+				if (uid != login_admin && attachment.uidDelete==true) {
+					layer.msg('你不是该文件的上传人，无权限删除');
+					return false;
+				}
+				let idsStr = boxInput.val(),idsArray = [];
+				if (typeof idsStr !== 'undefined' && idsStr != '') {
+					idsArray = idsStr.split(",");
+					idsArray.remove(file_id);
+				}
+				tool.ask('确定删除该附件吗？', function(index) {
+					if (typeof (attachment.ajaxDelete) === "function") {
+						if(attachment.type==1){
+							//单文件，单记录删除
+							attachment.ajaxDelete(id,file_id);
+						}
+						else{
+							attachment.ajaxDelete(idsArray.join(','));
+						}						
+					}
+					else{
+						//虚拟删除
+						boxInput.val(idsArray.join(','));
+						$('#uploadImg' + id).remove();
+					}
+					layer.close(index);
+				});
+			})
+			
+			//重命名附件
+			box.on('click','.name-edit',function(){
+				let file_id = $(this).data('fileid');
+				let uid = $(this).data('uid');
+				if (uid != login_admin && me.settings.uidDelete==true) {
+					layer.msg('你不是该文件的上传人，无权限修改');
+					return false;
+				}
+				let name = $(this).data('name');
+				let fileext = $(this).data('fileext');
+				layer.prompt({
+					title: '重命名',
+					value: name.replace(/\.[^.]+$/, ""),
+					yes: function(index, layero) {
+						// 获取文本框输入的值
+						var value = layero.find(".layui-layer-input").val();
+						if (value!='') {
+							let new_title = value+'.'+fileext;
+							let callback = function (e) {
+								layer.msg(e.msg);
+								$('#fileItem'+file_id).find('.file-title').html(new_title).attr('title',new_title);
+							}
+							tool.post("/api/index/file_edit", {id:file_id,title:new_title}, callback);
+							layer.close(index);
+						} else {
+							layer.msg('请填写文件名称');
+						}
+					}
+				})
+			})
+			//多附件上传
+			upload.render({
+				elem: '#'+me.settings.target,
+				url: me.settings.url,
+				accept: 'file',
+				exts: attachment.exts,
+				multiple: true,
+				before: function(obj){
+					layer.msg('上传中...', {icon: 16, time: 0});
+				},
+				done: function(res){
+					if (res.code == 0) {
+						//上传成功
+						if(attachment.type==0){
+							let image=['jpg','jpeg','png','gif'],office=['doc','docx','xls','xlsx','ppt','pptx'];
+							let idsStr = boxInput.val(),idsArray = [];
+							if (typeof idsStr !== 'undefined' && idsStr != '') {
+								idsArray = idsStr.split(",");
+							}
+							idsArray.push(res.data.id);
+							let filesize = renderSize(res.data.filesize),type=0,type_icon = 'icon-xiangmuguanli',ext = 'zip';
+							if(res.data.fileext == 'pdf'){
+								type=1;
+								type_icon = 'icon-kejian';								
+								ext = 'pdf';
+							}
+							if (image.indexOf(res.data.fileext) !== -1) {
+								type=1;
+								type_icon = 'icon-sucaiguanli';
+								ext = 'image';
+							}
+							if (office.indexOf(res.data.fileext) !== -1) {
+								type=2;
+								type_icon = 'icon-shenbao';
+								ext = 'office';
+							}
+							
+							let view_btn = '<span class="file-ctrl blue" data-ctrl="edit" data-type="'+type+'" data-fileid="'+res.data.id+'" data-ext="'+ext+'" data-filename="'+res.data.name+'" data-href="'+res.data.filepath+'" data-id="'+res.data.id+'" data-uid="'+res.data.uid+'" title="附件操作"><i class="iconfont icon-gengduo1"></i></span>';
+							
+							let temp = `<div class="layui-col-md${attachment.colmd}" id="uploadImg${res.data.id}">
+									<div class="file-card" id="fileItem${res.data.id}">
+										<i class="file-icon iconfont ${type_icon}"></i>
+										<div class="file-info">
+											<div class="file-title" title="${res.data.name}">${res.data.name}</div>
+											<div class="file-ops">${filesize}，一分钟前</div>
+										</div>
+										<div class="file-tool">${view_btn}<span class="name-edit green" style="display:none;" data-id="${res.data.id}" data-fileid="${res.data.id}" id="fileEdit${res.data.id}" data-name="${res.data.name}" data-fileext="${res.data.fileext}" title="重命名"></span><span class="file-delete red" style="display:none;" data-id="${res.data.id}" data-fileid="${res.data.id}" id="fileDel${res.data.id}" title="删除"><i class="iconfont icon-shanchu"></i></span></div>
+									</div>
+								</div>`;
+							boxInput.val(idsArray.join(','));	
+							box.append(temp);					
+							if (typeof (attachment.ajaxSave) === "function") {
+								attachment.ajaxSave(idsArray.join(','));
+							}
+							else{
+								layer.msg(res.msg);
+							}
+						}
+						if(attachment.type==1){
+							//单文件，单记录保存
+							if (typeof (attachment.ajaxSave) === "function") {
+								attachment.ajaxSave(res);
+							}
+						}
+					}else{
+						layer.msg(res.msg);
+					}
+				}
+			});
+		},
+		//单图
+		singleImage: function () {
+			let me = this;
+			let single = upload.render({
+				elem: "#"+me.settings.target,
+				url: me.settings.url,
+				accept: 'images',
+				acceptMime:'image/*',
+				done: function (res) {
+					me.settings.callback(res);
+				}
+			});
+		},
+		//多图
+		multiImage: function () {
+			let me = this;
+			let area =[[],['640px','360px'],['928px','610px']];
+			$(parent.$('.express-close')).addClass('parent-colse');
+			this.layerindex = layer.open({
+				'title':me.settings.title,
+				'area':area[me.settings.multi.type],
+				'content':me.multiRender(),
+				end: function(){
+					$(parent.$('.express-close')).removeClass('parent-colse');
+				},
+				'type':1,
+				'success':function(){
+					if(me.settings.multi.type==1){
+						me.uploadOne();	
+					}else{
+						me.uploadMore();	
+					}							
+				}
+			});
+		},
+		multiRender: function (){
+			let me = this;
+			let template_one = '<div class="layui-form p-3">\
+						<div class="layui-form-item">\
+							<label class="layui-form-label">来源：</label>\
+							<div class="layui-input-block">\
+								<input type="radio" name="uploadtype" lay-filter="type" value="1" title="本地上传" checked>\
+								<input type="radio" name="uploadtype" lay-filter="type" value="2" title="网络图片">\
+							</div>\
+						</div>\
+						<div id="uploadType1">\
+							<div class="layui-form-item">\
+								<label class="layui-form-label">文件：</label>\
+								<div class="layui-input-block">\
+									<span class="gougu-upload-files">.jpg、.jpeg、.gif、.png、.bmp</span><button type="button" class="layui-btn layui-btn-normal" id="gouguUploadBtn'+me.settings.index+'">选择文件</button>\
+								</div>\
+							</div>\
+							<div class="layui-form-item">\
+								<label class="layui-form-label"></label>\
+								<div class="layui-input-block">\
+									<span class="gougu-upload-tips">只能上传 .jpg、.jpeg、.gif、.png、.bmp 文件</span>\
+								</div>\
+							</div>\
+							<div class="layui-form-item">\
+								<label class="layui-form-label"></label>\
+								<div class="layui-input-block" id="gouguUploadChoosed'+me.settings.index+'"></div>\
+							</div>\
+							<div class="layui-progress upload-progress" lay-showpercent="yes" lay-filter="upload-progress-'+me.settings.index+'" style="margin-bottom:12px; margin-left:100px; width:320px; display:none;">\
+							  <div class="layui-progress-bar layui-bg-blue" lay-percent=""><span class="layui-progress-text"></span></div>\
+							</div>\
+							<div class="layui-form-item layui-form-item-sm">\
+								<label class="layui-form-label"></label>\
+								<div class="layui-input-block">\
+									<button type="button" class="layui-btn" id="uploadNow'+me.settings.index+'">开始上传</button>\
+								</div>\
+							</div>\
+						</div>\
+						<div id="uploadType2" style="display:none; width:480px;">\
+							<div class="layui-form-item">\
+								<label class="layui-form-label">URL地址：</label>\
+								<div class="layui-input-block">\
+									<input type="text" name="img_url" placeholder="" autocomplete="off" class="layui-input">\
+								</div>\
+							</div>\
+							<div class="layui-form-item">\
+								<label class="layui-form-label">图片名称：</label>\
+								<div class="layui-input-block">\
+									<input type="text" name="img_name" placeholder="" autocomplete="off" class="layui-input">\
+								</div>\
+							</div>\
+							<div class="layui-form-item layui-form-item-sm">\
+								<label class="layui-form-label"></label>\
+								<div class="layui-input-block">\
+									<span class="layui-btn" id="uploadSave'+me.settings.index+'">确定保存</span>\
+								</div>\
+							</div>\
+						</div>\
+				</div>';
+			let template_more = '<div class="layui-form p-3">\
+							<div id="gouguUploadBox'+me.settings.index+'" class="gougu-upload-box select">\
+								<div id="gouguUploadBtn'+me.settings.index+'" class="gougu-upload-btn"><div class="gougu-upload-btn-box"><i class="layui-icon layui-icon-addition"></i><br/>点击上传图片</div></div>\
+							</div>\
+							<div class="layui-progress upload-progress" lay-showpercent="yes" lay-filter="progress-'+me.settings.index+'" style="margin:12px 0; width:900px;">\
+								<div class="layui-progress-bar layui-bg-blue" lay-percent=""><span class="layui-progress-text"></span></div>\
+							</div>\
+							<div class="layui-form-item layui-form-item-sm">\
+								<span class="gougu-upload-tips">注：只能上传 jpg、.jpeg、.gif、.png、.bmp 文件，单次最多上传 '+me.settings.max+' 张图片，单张图片最大不要超过10M。</span>\
+								<button type="button" class="layui-btn" id="uploadNow'+me.settings.index+'">开始上传</button>\
+								<button type="button" class="layui-btn layui-btn-primary" id="uploadClear'+me.settings.index+'">清空列表</button>\
+								<button type="button" class="layui-btn layui-btn-normal" id="uploadOk'+me.settings.index+'">提交</button>\
+							</div>\
+						</div>';
+			return me.settings.multi.type==1?template_one:template_more;
+		},
+		uploadOne:function(){
+			let me = this;
+			form.render();					
+			form.on('radio(type)', function(data){
+				if(data.value==1){
+					$('#uploadType1').show();
+					$('#uploadType2').hide();
+				}
+				else{
+					$('#uploadType1').hide();
+					$('#uploadType2').show();
+				}
+			}); 					
+			//选文件
+			let uploadOne = upload.render({
+				elem: '#gouguUploadBtn'+me.settings.index
+				,url: me.settings.url
+				,auto: false
+				,accept: 'images'
+				,acceptMime:'image/*'
+				,bindAction: '#uploadNow'+me.settings.index
+				,choose: function(obj){
+					obj.preview(function(index, file, result){
+						$('#gouguUploadChoosed'+me.settings.index).html('已选择：'+file.name);
+					});
+				}
+				,before: function(obj){
+					$('.upload-progress').show();
+					element.progress('upload-progress-'+me.settings.index, '0%');
+				}
+				,progress: function(n, elem, e){
+					console.log(n);
+					element.progress('upload-progress-'+me.settings.index, n + '%');
+				}
+				,done: function(res){
+					layer.msg(res.msg);
+					if(res.code==0){
+						me.settings.callback(res.data);
+						layer.close(me.layerindex);
+					}							
+				}
+			});
+					
+			$('#uploadSave'+me.settings.index).on('click',function(){
+				let url=$('[name="img_url"]').val();
+				let name=$('[name="img_name"]').val();
+				if(url == ''){
+					layer.msg('请输入图片URL');
+					return false;
+				}
+				if(name == ''){
+					layer.msg('请输入图片名称');
+					return false;
+				}
+				let res={
+					filepath:url,
+					name:name,
+					id:0
+				}
+				me.settings.callback(res);
+				layer.close(me.layerindex);
+			})
+		},
+		uploadMore:function(){
+			let me = this,file_lists=[];
+			console.log(file_lists);
+			let uploadList = upload.render({
+				elem: '#gouguUploadBtn'+me.settings.index
+				,elemList: $('#gouguUploadBox'+me.settings.index) //列表元素对象
+				,url: me.settings.url
+				,accept: 'images'
+				,acceptMime:'image/*'
+				,multiple: true
+				,number: me.settings.max
+				,auto: false
+				,bindAction: '#uploadNow'+me.settings.index
+				,choose: function(obj){
+					let that = this;
+					let files = this.files = obj.pushFile(); //将每次选择的文件追加到文件队列
+					that.elemList.removeClass('select').addClass('selected');
+					//读取本地文件
+					obj.preview(function(index, file, result){
+						let card = $('<div class="gougu-upload-card" id="gouguUploadCard'+index+'">\
+												<div class="gougu-upload-card-box">\
+													<img alt="'+ file.name +'" class="gougu-upload-card-img" src="'+ result +'">\
+													<div class="gougu-upload-card-bar"><div class="layui-progress" lay-filter="progress-card-'+ index +'"><div class="layui-progress-bar" lay-percent=""></div></div></div>\
+													<div class="gougu-upload-card-text">'+ file.name +'</div>\
+													<div class="gougu-upload-card-reload"><button type="button" class="layui-btn layui-btn-xs">重新上传</button></div>\
+													<div class="gougu-upload-card-del" data-index="'+index+'"><button type="button" class="layui-btn layui-btn-xs layui-btn-radius layui-btn-danger"><i class="layui-icon layui-icon-close"></i></button></div>\
+												</div>\
+											</div>');					
+						//单个重传
+						card.find('.gougu-upload-card-reload').on('click', function(){
+							obj.upload(index, file);
+						});
+					
+						//删除
+						card.find('.gougu-upload-card-del').on('click', function(){
+							delete files[index]; //删除对应的文件
+							card.remove();
+							uploadList.config.elem.next()[0].value = ''; //清空 input file 值，以免删除后出现同名文件不可选
+						});
+					
+						that.elemList.append(card);
+						element.render('progress'); //渲染新加的进度条组件
+					});
+				}
+				,done: function(res, index, upload){ //成功的回调
+					let that = this;
+					if(res.code==0){
+						delete this.files[index]; //删除文件队列已经上传成功的文件
+						that.elemList.find('#gouguUploadCard'+ index).addClass('uploadok');
+						file_lists.push(res.data);
+					}
+					else{
+						layer.msg(res.msg);
+						this.error(index, upload);
+					}
+				}
+				,allDone: function(obj){ //多文件上传完毕后的状态回调
+					//console.log(obj);
+					layer.msg('上传成功');
+					me.settings.callback(file_lists,obj);
+					layer.close(me.layerindex);
+				}
+				,error: function(index, upload){ //错误回调
+				  let that = this;
+				  let tr = that.elemList.find('#gouguUploadCard'+ index).addClass('reload'); //显示重传
+				}
+				,progress: function(n, elem, e, index){
+					element.progress('progress-card-'+ index, n + '%'); //执行进度条。n 即为返回的进度百分比
+				}
+			});
+			
+			$('#uploadClear'+me.settings.index).click(function(){
+				$('#gouguUploadBox'+me.settings.index).find('.gougu-upload-card-del').click();						
+			})
+			$('#uploadOk'+me.settings.index).click(function(){
+				if(me.settings.files.length>0){
+					me.settings.callback(me.settings.files);
+					layer.close(me.layerindex);
+				}
+				else{
+					layer.msg('请先点击开始上传按钮上传');
+				}
+			})
+		},
+		//批量导入
+		excelImport:function(){
+			let me = this;
+			$(parent.$('.express-close')).addClass('parent-colse');
+			layer.open({
+				'title':me.settings.title,
+				'type':1,
+				'area': ['640px', '320px'],
+				'content':'<div class="layui-form layui-import">\
+								<div class="mt-4">\
+									<div class="layui-form-item">\
+										<label class="layui-form-label">选择文件：</label>\
+										<div class="layui-input-block">\
+											<div class="layui-input-inline" style="width:286px;"><input type="text" id="inputImport'+me.settings.index+'" placeholder=".xls,.xlsx" class="layui-input" readonly></div><button type="button" class="layui-btn layui-btn-normal" id="importSelect'+me.settings.index+'">选择文件</button><a href="'+me.settings.import.template+'" target="_blank" class="layui-btn ml-2">Excel模板下载</a>\
+										</div>\
+									</div>\
+								</div>\
+								<div class="layui-form-item py-2">\
+									<label class="layui-form-label"></label>\
+									<div class="layui-input-block gougu-import-tips">\
+										1、只能上传 .xls、.xlsx文件，文件大小 3MB 以内，每次导入不能超过3000条；<br>2、Excel表格数据请勿放在合并的单元格中，格式务必按照模版样本填写；<br>3、'+me.settings.import.tips+'\
+									</div>\
+								</div>\
+								<div class="layui-form-item">\
+									<label class="layui-form-label"></label>\
+									<div class="layui-input-block">\
+										<button type="button" class="layui-btn layui-bg-red" id="btnImport'+me.settings.index+'">上传并导入</button>\
+										<span class="red ml-3" id="noteImport'+me.settings.index+'"></span>\
+									</div>\
+								</div>\
+						</div>',
+				end: function(){
+					$(parent.$('.express-close')).removeClass('parent-colse');
+				},
+				success: function(layero, idx){
+					form.render();
+					let noteImport = $('#noteImport'+me.settings.index);
+					//选文件
+					let uploadImport = upload.render({
+						elem: '#importSelect'+me.settings.index
+						,url: me.settings.url
+						,auto: false
+						,accept: 'file' //普通文件
+						,acceptMime: 'application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' // 此处设置上传的文件格式
+						,exts: 'xls|xlsx' //只允许上传文件格式
+						,bindAction: '#btnImport'+me.settings.index
+						,choose: function(obj){
+							obj.preview(function(index, file, result){
+								$('#importSelect'+me.settings.index).html('重新选择');
+								$('#inputImport'+me.settings.index).val(file.name);
+							});
+						}
+						,before: function(obj){
+							if($('#inputImport'+me.settings.index).val()==''){
+								layer.msg('请选择文件');
+								return false;
+							}
+						}
+						,progress: function(n, elem, e){
+							noteImport.html('文件上转中...');
+							if(n==100){
+								noteImport.html('数据导入中...');
+							}
+						}
+						,error: function(index, upload){
+							uploadImport.reload();
+							$('#importSelect'+me.settings.index).html('选择文件');
+							$('#inputImport'+me.settings.index).val('');
+							noteImport.html('数据导入失败，请重新选择文件或关闭弹层重试');
+						}
+						,done: function(res, index, upload){
+							uploadImport.reload();
+							noteImport.html(res.msg);
+							layer.msg(res.msg);
+							if(res.code==0){
+								layer.close(idx);
+								me.settings.callback(res);			
+							}
+							else{
+								$('#importSelect'+me.settings.index).html('选择文件');
+								$('#inputImport'+me.settings.index).val('');
+							}
+						}
+					});
+				}
+			});	
+		}
+	}
+	//输出接口
+	exports('uploadPlus', uploadPlus);
+});   
\ No newline at end of file
diff --git a/public/static/assets/gougu/module/xlsx.js b/public/static/assets/gougu/module/xlsx.js
new file mode 100644
index 0000000000000000000000000000000000000000..09a2b73bbd6941fb082e8ddf5dad6c2a3c2b6fa9
--- /dev/null
+++ b/public/static/assets/gougu/module/xlsx.js
@@ -0,0 +1,263 @@
+layui.define(['jquery','layer','table'], function(exports) {
+	var $ = layui.$,
+	layer = layui.layer,
+	table = layui.table;
+	
+   	var MOD_NAME = 'xlsx';
+	var modFile = layui.cache.modules['xlsx'];
+	var modPath = modFile.substr(0, modFile.lastIndexOf('.'));
+	
+    var tableXlsx=$.extend({},table);
+	
+    tableXlsx._render = tableXlsx.render;
+
+	tableXlsx.excel = function(data,page_size,obj,filter,merge){
+		//表头工具栏导出按钮
+		$('[lay-id="'+obj.id+'"]').find('[lay-event="LAYTABLE_EXCEL"]').off().on('click',function(){
+			if(data.count==0){
+				layer.msg('暂无数据');
+				return false;
+			}
+			else{
+				let _page = parseInt(data.count/page_size);
+				let page = data.count%page_size>0?(_page+1):_page;
+				let pageHtml='<p style="padding:16px 10px 0; text-align:center; color:red">由于导出数据比较消耗服务器资源，建议使用搜索功能筛选好数据再导出</p><p style="padding:5px 10px 10px; text-align:center; color:red">如果点击导出后，没有立即导出文件，请耐心等待一下，30秒内请勿重复点击。</p><p style="padding:0 10px; text-align:center;">共查询到<strong> '+data.count+' </strong>条数据，每次最多导出<strong>'+page_size+'</strong>条，共<strong>'+page+'</strong>页，请点击下面的页码导出</p><div id="exportPage" class="layui-box layui-laypage" style="padding:10px 0; width:100%;text-align:center;">';
+				for (i = 1; i <= page; i++) {
+					pageHtml += '<a href="javascript:;" data-page="'+i+'">'+i+'</a>';
+				}
+				pageHtml+='</div>';							
+				layer.open({
+					  type: 1,
+					  title: '导出数据',
+					  area:['580px','240px'],
+					  content: pageHtml,
+					  success:function(res){
+							var tableWhere = JSON.parse(JSON.stringify(obj.where));
+							tableWhere.limit=page_size;										
+							$('#exportPage').on('click','a',function(){
+								tableWhere.page=$(this).data('page');
+								let msg = layer.msg('正在导出数据...', {time:5000});
+								$.ajax({
+									url: obj.url,
+									data: tableWhere,
+									success:function(res){
+										//table.exportFile(obj.id, res.data,'xls');
+										//console.log(res.data);
+										tableXlsx.xsls(res.data,obj.cols[0],obj.title,filter,merge);
+										layer.close(msg);
+									}
+								});
+							})
+						}
+					});
+				return false;
+			}
+		});
+	}
+	
+	tableXlsx.xsls = function(jsonData,field,name,filter,merge){
+		let new_jsonData;
+		//数据过滤
+		if(filter.length>0){
+			new_jsonData = jsonData.map((item, index) => {
+				const newProps = {}; // 创建一个空对象，用于存放新增的属性和对应的计算值
+				filter.forEach((obj) => {
+				for (const [key, func] of Object.entries(obj)) {
+					newProps[key] = func(item); // 调用函数计算属性值，并赋给新的属性
+				}
+			});
+			return { ...item, ...newProps }; // 创建新对象，将原有的属性展开并新增 newProps 中的属性
+			});
+		}
+		else{
+			new_jsonData = jsonData;
+		}
+		console.log("===========打印初始化后的json数据============");
+		console.log(new_jsonData);
+
+		//需要显示的表格字段,及表头文字描述
+		let field_array =[],customHeaders = [];
+		for (var f=0; f<field.length;f++){
+			if(!field[f]['ignoreExport']){
+				field_array.push(field[f].field);
+				customHeaders.push(field[f].title);
+			}
+		}
+		console.log("===========打印需要显示的表格字段及表头文字描述============");
+		console.log(field_array);
+		console.log(customHeaders);
+		
+		const desiredOrder = field_array; // 按照这个顺序重新排序
+		const desiredProps = field_array; // 只保留这些属性
+		
+		// 对 JSON 数据集进行排序和过滤
+		const sortedAndFilteredData = new_jsonData.map(entry => {
+			const sortedAndFilteredEntry = {};
+			desiredOrder.forEach(key => {
+				if (desiredProps.includes(key) && entry.hasOwnProperty(key)) {
+					sortedAndFilteredEntry[key] = entry[key];
+				}
+			});
+			return sortedAndFilteredEntry;
+		});
+		console.log("===========打印排序和过滤处理过的JSON 数据集============");
+		console.log(sortedAndFilteredData);
+		
+		//设置表头
+		const worksheet = XLSX.utils.json_to_sheet(sortedAndFilteredData);
+		const headerRowIndex = 0;
+		customHeaders.forEach((header, columnIndex) => {
+			const address = XLSX.utils.encode_cell({ r: headerRowIndex, c: columnIndex });
+			if (worksheet[address]) {
+				worksheet[address].v = header;
+			}
+		});
+
+		//设置需要合并的单元格
+		var mergeCells = [];
+		if(!isObjectEmpty(merge)){
+			for (var i = 1; i < sortedAndFilteredData.length; i++) {
+				if (sortedAndFilteredData[i][merge.target] === sortedAndFilteredData[i - 1][merge.target]) {
+					// 数据相同，合并单元格
+					let sons = getSonIndex(sortedAndFilteredData,merge);
+					//console.log(sons);
+					for(var m=0; m<sons.length;m++){
+						mergeCells.push({
+							s:{r: i, c: sons[m]},e:{r: i+1, c: sons[m]}
+						});
+					}          
+				}
+			}
+		}
+		console.log("===========打印需要合并的单元格集合============");
+		console.log(mergeCells);
+		if (mergeCells.length > 0) {
+			worksheet['!merges'] = mergeCells;
+		}
+		const workbook = XLSX.utils.book_new();
+		XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');
+		setTimeout(function(){
+			layer.msg('导出完成');			
+		},3000)		
+		// Export to Excel file
+		XLSX.writeFile(workbook, name+'.xlsx');		
+	}
+	
+	//重写渲染方法
+    tableXlsx.render=function(params){
+		let is_excel = params.is_excel||false;
+		let excel_limit = params.excel_limit||1000;
+		let filter = params.xlsx_filter||[];
+		let merge = params.xlsx_merge||{};
+		if(is_excel){
+			let toolbar = ['filter', {title:'导出EXCEL',layEvent: 'LAYTABLE_EXCEL',icon: 'layui-icon-export'}];
+			if(!params.defaultToolbar){
+				params.defaultToolbar = toolbar;
+			}	
+			else{
+				let _toolbar = params.defaultToolbar;
+				params.defaultToolbar = _toolbar.concat(toolbar);
+			}
+			if(typeof params.done === "function"){
+				let _done = params.done;
+				params.done = function(data, curr, count){
+					let obj = this;
+					_done(data, curr, count);
+					if(!isObjectEmpty(merge)){
+						tableMerge (obj);
+					}
+					tableXlsx.excel(data,excel_limit,obj,filter,merge);
+				}
+			}
+			else{
+				params.done = function(data){
+					let obj = this;
+					if(!isObjectEmpty(merge)){
+						tableMerge (obj);
+					}
+					tableXlsx.excel(data,excel_limit,obj,filter,merge);
+				}
+			}
+		}
+		var init = tableXlsx._render(params);
+		return init;
+		//console.log(params);
+    };
+	
+	function tableMerge (myTable) {
+		var tableBox = $(myTable.elem).next().children('.layui-table-box'),
+			$main = $(tableBox.children('.layui-table-body').children('table').children('tbody').children('tr').toArray().reverse()),
+			$fixLeft = $(tableBox.children('.layui-table-fixed-l').children('.layui-table-body').children('table').children('tbody').children('tr').toArray().reverse()),
+			$fixRight = $(tableBox.children('.layui-table-fixed-r').children('.layui-table-body').children('table').children('tbody').children('tr').toArray().reverse()),
+			mergeRecord = {},cols = myTable.cols[0];
+
+		for (let i = 0; i < cols.length; i++) {
+			var item3 = cols[i], field=item3.field;
+			if (item3.merge) {
+				var mergeField = [field];
+				if (item3.merge !== true) {
+					if (typeof item3.merge == 'string') {
+						mergeField = [item3.merge]
+					} else {
+						mergeField = item3.merge
+					}
+				}
+				mergeRecord[i] = {mergeField: mergeField, rowspan:1}
+			}
+		}
+		//console.log(myTable);
+		$main.each(function (i) {
+			for (var item in mergeRecord) {
+				if (i==$main.length-1 || isMaster(i, item)) {
+					$(this).children('[data-key$="-'+item+'"]').attr('rowspan', mergeRecord[item].rowspan).css('position','static');
+					$fixLeft.eq(i).children('[data-key$="-'+item+'"]').attr('rowspan', mergeRecord[item].rowspan).css('position','static');
+					$fixRight.eq(i).children('[data-key$="-'+item+'"]').attr('rowspan', mergeRecord[item].rowspan).css('position','static');
+					mergeRecord[item].rowspan = 1;
+				} else {
+					$(this).children('[data-key$="-'+item+'"]').remove();
+					$fixLeft.eq(i).children('[data-key$="-'+item+'"]').remove();
+					$fixRight.eq(i).children('[data-key$="-'+item+'"]').remove();
+					mergeRecord[item].rowspan +=1;
+				}
+			}
+		})
+		function isMaster (index, item) {
+			var mergeField = mergeRecord[item].mergeField;
+			var dataLength = layui.table.cache[myTable.id].length;
+			for (var i=0; i<mergeField.length; i++) {
+
+				if (layui.table.cache[myTable.id][dataLength-2-index][mergeField[i]]
+					!== layui.table.cache[myTable.id][dataLength-1-index][mergeField[i]]) {
+					return true;
+				}
+			}
+			return false;
+		}
+    }
+	
+	function getSonIndex(targetData,mergeField){
+		let index=[];
+		index.push(Object.keys(targetData[0]).indexOf(mergeField.target));
+		if(mergeField.son.length>0){
+			for(var a=0; a<mergeField.son.length;a++){
+				index.push(Object.keys(targetData[0]).indexOf(mergeField.son[a]));
+			}
+		}
+		return index;
+	}
+	function isObjectEmpty(obj) {
+		return JSON.stringify(obj) === '{}';
+	}
+	function loadScript() {
+		if (typeof XLSX == 'undefined') {
+			$.ajax({ //获取插件
+				url: modPath + '/xlsx.full.min.js' ,
+				dataType: 'script',
+				cache: true,
+				async: false
+			});
+		}
+	}
+	loadScript();
+    exports(MOD_NAME, tableXlsx);
+});
\ No newline at end of file
diff --git a/public/static/assets/icon/demo.css b/public/static/assets/icon/demo.css
new file mode 100644
index 0000000000000000000000000000000000000000..a67054a0a030993643b8cbe9f344b34706efa134
--- /dev/null
+++ b/public/static/assets/icon/demo.css
@@ -0,0 +1,539 @@
+/* Logo 字体 */
+@font-face {
+  font-family: "iconfont logo";
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
+}
+
+.logo {
+  font-family: "iconfont logo";
+  font-size: 160px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+/* tabs */
+.nav-tabs {
+  position: relative;
+}
+
+.nav-tabs .nav-more {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  height: 42px;
+  line-height: 42px;
+  color: #666;
+}
+
+#tabs {
+  border-bottom: 1px solid #eee;
+}
+
+#tabs li {
+  cursor: pointer;
+  width: 100px;
+  height: 40px;
+  line-height: 40px;
+  text-align: center;
+  font-size: 16px;
+  border-bottom: 2px solid transparent;
+  position: relative;
+  z-index: 1;
+  margin-bottom: -1px;
+  color: #666;
+}
+
+
+#tabs .active {
+  border-bottom-color: #f00;
+  color: #222;
+}
+
+.tab-container .content {
+  display: none;
+}
+
+/* 页面布局 */
+.main {
+  padding: 30px 100px;
+  width: 960px;
+  margin: 0 auto;
+}
+
+.main .logo {
+  color: #333;
+  text-align: left;
+  margin-bottom: 30px;
+  line-height: 1;
+  height: 110px;
+  margin-top: -50px;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.main .logo a {
+  font-size: 160px;
+  color: #333;
+}
+
+.helps {
+  margin-top: 40px;
+}
+
+.helps pre {
+  padding: 20px;
+  margin: 10px 0;
+  border: solid 1px #e7e1cd;
+  background-color: #fffdef;
+  overflow: auto;
+}
+
+.icon_lists {
+  width: 100% !important;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.icon_lists li {
+  width: 100px;
+  margin-bottom: 10px;
+  margin-right: 20px;
+  text-align: center;
+  list-style: none !important;
+  cursor: default;
+}
+
+.icon_lists li .code-name {
+  line-height: 1.2;
+}
+
+.icon_lists .icon {
+  display: block;
+  height: 100px;
+  line-height: 100px;
+  font-size: 42px;
+  margin: 10px auto;
+  color: #333;
+  -webkit-transition: font-size 0.25s linear, width 0.25s linear;
+  -moz-transition: font-size 0.25s linear, width 0.25s linear;
+  transition: font-size 0.25s linear, width 0.25s linear;
+}
+
+.icon_lists .icon:hover {
+  font-size: 100px;
+}
+
+.icon_lists .svg-icon {
+  /* 通过设置 font-size 来改变图标大小 */
+  width: 1em;
+  /* 图标和文字相邻时，垂直对齐 */
+  vertical-align: -0.15em;
+  /* 通过设置 color 来改变 SVG 的颜色/fill */
+  fill: currentColor;
+  /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
+      normalize.css 中也包含这行 */
+  overflow: hidden;
+}
+
+.icon_lists li .name,
+.icon_lists li .code-name {
+  color: #666;
+}
+
+/* markdown 样式 */
+.markdown {
+  color: #666;
+  font-size: 14px;
+  line-height: 1.8;
+}
+
+.highlight {
+  line-height: 1.5;
+}
+
+.markdown img {
+  vertical-align: middle;
+  max-width: 100%;
+}
+
+.markdown h1 {
+  color: #404040;
+  font-weight: 500;
+  line-height: 40px;
+  margin-bottom: 24px;
+}
+
+.markdown h2,
+.markdown h3,
+.markdown h4,
+.markdown h5,
+.markdown h6 {
+  color: #404040;
+  margin: 1.6em 0 0.6em 0;
+  font-weight: 500;
+  clear: both;
+}
+
+.markdown h1 {
+  font-size: 28px;
+}
+
+.markdown h2 {
+  font-size: 22px;
+}
+
+.markdown h3 {
+  font-size: 16px;
+}
+
+.markdown h4 {
+  font-size: 14px;
+}
+
+.markdown h5 {
+  font-size: 12px;
+}
+
+.markdown h6 {
+  font-size: 12px;
+}
+
+.markdown hr {
+  height: 1px;
+  border: 0;
+  background: #e9e9e9;
+  margin: 16px 0;
+  clear: both;
+}
+
+.markdown p {
+  margin: 1em 0;
+}
+
+.markdown>p,
+.markdown>blockquote,
+.markdown>.highlight,
+.markdown>ol,
+.markdown>ul {
+  width: 80%;
+}
+
+.markdown ul>li {
+  list-style: circle;
+}
+
+.markdown>ul li,
+.markdown blockquote ul>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown>ul li p,
+.markdown>ol li p {
+  margin: 0.6em 0;
+}
+
+.markdown ol>li {
+  list-style: decimal;
+}
+
+.markdown>ol li,
+.markdown blockquote ol>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown code {
+  margin: 0 3px;
+  padding: 0 5px;
+  background: #eee;
+  border-radius: 3px;
+}
+
+.markdown strong,
+.markdown b {
+  font-weight: 600;
+}
+
+.markdown>table {
+  border-collapse: collapse;
+  border-spacing: 0px;
+  empty-cells: show;
+  border: 1px solid #e9e9e9;
+  width: 95%;
+  margin-bottom: 24px;
+}
+
+.markdown>table th {
+  white-space: nowrap;
+  color: #333;
+  font-weight: 600;
+}
+
+.markdown>table th,
+.markdown>table td {
+  border: 1px solid #e9e9e9;
+  padding: 8px 16px;
+  text-align: left;
+}
+
+.markdown>table th {
+  background: #F7F7F7;
+}
+
+.markdown blockquote {
+  font-size: 90%;
+  color: #999;
+  border-left: 4px solid #e9e9e9;
+  padding-left: 0.8em;
+  margin: 1em 0;
+}
+
+.markdown blockquote p {
+  margin: 0;
+}
+
+.markdown .anchor {
+  opacity: 0;
+  transition: opacity 0.3s ease;
+  margin-left: 8px;
+}
+
+.markdown .waiting {
+  color: #ccc;
+}
+
+.markdown h1:hover .anchor,
+.markdown h2:hover .anchor,
+.markdown h3:hover .anchor,
+.markdown h4:hover .anchor,
+.markdown h5:hover .anchor,
+.markdown h6:hover .anchor {
+  opacity: 1;
+  display: inline-block;
+}
+
+.markdown>br,
+.markdown>p>br {
+  clear: both;
+}
+
+
+.hljs {
+  display: block;
+  background: white;
+  padding: 0.5em;
+  color: #333333;
+  overflow-x: auto;
+}
+
+.hljs-comment,
+.hljs-meta {
+  color: #969896;
+}
+
+.hljs-string,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-strong,
+.hljs-emphasis,
+.hljs-quote {
+  color: #df5000;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-type {
+  color: #a71d5d;
+}
+
+.hljs-literal,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-attribute {
+  color: #0086b3;
+}
+
+.hljs-section,
+.hljs-name {
+  color: #63a35c;
+}
+
+.hljs-tag {
+  color: #333333;
+}
+
+.hljs-title,
+.hljs-attr,
+.hljs-selector-id,
+.hljs-selector-class,
+.hljs-selector-attr,
+.hljs-selector-pseudo {
+  color: #795da3;
+}
+
+.hljs-addition {
+  color: #55a532;
+  background-color: #eaffea;
+}
+
+.hljs-deletion {
+  color: #bd2c00;
+  background-color: #ffecec;
+}
+
+.hljs-link {
+  text-decoration: underline;
+}
+
+/* 代码高亮 */
+/* PrismJS 1.15.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+  color: black;
+  background: none;
+  text-shadow: 0 1px white;
+  font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+  text-align: left;
+  white-space: pre;
+  word-spacing: normal;
+  word-break: normal;
+  word-wrap: normal;
+  line-height: 1.5;
+
+  -moz-tab-size: 4;
+  -o-tab-size: 4;
+  tab-size: 4;
+
+  -webkit-hyphens: none;
+  -moz-hyphens: none;
+  -ms-hyphens: none;
+  hyphens: none;
+}
+
+pre[class*="language-"]::-moz-selection,
+pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection,
+code[class*="language-"] ::-moz-selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+pre[class*="language-"]::selection,
+pre[class*="language-"] ::selection,
+code[class*="language-"]::selection,
+code[class*="language-"] ::selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+@media print {
+
+  code[class*="language-"],
+  pre[class*="language-"] {
+    text-shadow: none;
+  }
+}
+
+/* Code blocks */
+pre[class*="language-"] {
+  padding: 1em;
+  margin: .5em 0;
+  overflow: auto;
+}
+
+:not(pre)>code[class*="language-"],
+pre[class*="language-"] {
+  background: #f5f2f0;
+}
+
+/* Inline code */
+:not(pre)>code[class*="language-"] {
+  padding: .1em;
+  border-radius: .3em;
+  white-space: normal;
+}
+
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+  color: slategray;
+}
+
+.token.punctuation {
+  color: #999;
+}
+
+.namespace {
+  opacity: .7;
+}
+
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+  color: #905;
+}
+
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+  color: #690;
+}
+
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+  color: #9a6e3a;
+  background: hsla(0, 0%, 100%, .5);
+}
+
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+  color: #07a;
+}
+
+.token.function,
+.token.class-name {
+  color: #DD4A68;
+}
+
+.token.regex,
+.token.important,
+.token.variable {
+  color: #e90;
+}
+
+.token.important,
+.token.bold {
+  font-weight: bold;
+}
+
+.token.italic {
+  font-style: italic;
+}
+
+.token.entity {
+  cursor: help;
+}
diff --git a/public/static/assets/icon/iconfont.css b/public/static/assets/icon/iconfont.css
new file mode 100644
index 0000000000000000000000000000000000000000..1d2c46792b4fb78b25965641d53c253f37932fbe
--- /dev/null
+++ b/public/static/assets/icon/iconfont.css
@@ -0,0 +1,1553 @@
+@font-face {
+  font-family: "iconfont"; /* Project id 4700657 */
+  src: url('iconfont.woff2?t=1731513780902') format('woff2');
+}
+
+.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-xiangmuwendang:before {
+  content: "\e614";
+}
+
+.icon-renwupinglun:before {
+  content: "\e617";
+}
+
+.icon-xiangmurenwu:before {
+  content: "\e62e";
+}
+
+.icon-renwugongshi:before {
+  content: "\e6c1";
+}
+
+.icon-xiangmupinglun:before {
+  content: "\e740";
+}
+
+.icon-zhongzhigongdan:before {
+  content: "\e60f";
+}
+
+.icon-zhongzhihetong:before {
+  content: "\e612";
+}
+
+.icon-shoukuanzuofei:before {
+  content: "\e627";
+}
+
+.icon-zuofeikehu:before {
+  content: "\e872";
+}
+
+.icon-zuofeibaoming:before {
+  content: "\e6b7";
+}
+
+.icon-zuofeihetong:before {
+  content: "\e808";
+}
+
+.icon-guidanghetong:before {
+  content: "\e609";
+}
+
+.icon-guidang:before {
+  content: "\e60d";
+}
+
+.icon-dailiren:before {
+  content: "\e747";
+}
+
+.icon-genjinjilu1:before {
+  content: "\e607";
+}
+
+.icon-kehulianxiren:before {
+  content: "\e650";
+}
+
+.icon-jihuixiansuo:before {
+  content: "\e61b";
+}
+
+.icon-kehushezhi:before {
+  content: "\e70d";
+}
+
+.icon-qiangke:before {
+  content: "\e613";
+}
+
+.icon-feiqikehu:before {
+  content: "\e73f";
+}
+
+.icon-huiyi:before {
+  content: "\e6da";
+}
+
+.icon-gongyingshang:before {
+  content: "\e606";
+}
+
+.icon-gonghaikehu:before {
+  content: "\e61d";
+}
+
+.icon-fukuan:before {
+  content: "\e604";
+}
+
+.icon-kaipiaoguanli:before {
+  content: "\e739";
+}
+
+.icon-kaipiao:before {
+  content: "\e7c0";
+}
+
+.icon-fukuanshenqing:before {
+  content: "\e6c9";
+}
+
+.icon-a-baoxiao:before {
+  content: "\e605";
+}
+
+.icon-huikuan:before {
+  content: "\e6ba";
+}
+
+.icon-baoxiao1:before {
+  content: "\ebcc";
+}
+
+.icon-shoupiao:before {
+  content: "\e6b6";
+}
+
+.icon-a-baoxiao2:before {
+  content: "\e7ca";
+}
+
+.icon-a-baoxiao3:before {
+  content: "\e7cb";
+}
+
+.icon-richeng:before {
+  content: "\e60e";
+}
+
+.icon-chulishenpi:before {
+  content: "\e619";
+}
+
+.icon-wodeshenpi1:before {
+  content: "\e722";
+}
+
+.icon-huibao:before {
+  content: "\e636";
+}
+
+.icon-fuwutai:before {
+  content: "\e821";
+}
+
+.icon-fuwutai1:before {
+  content: "\e822";
+}
+
+.icon-chaosong:before {
+  content: "\e71f";
+}
+
+.icon-shenpi:before {
+  content: "\e68e";
+}
+
+.icon-daishenpi:before {
+  content: "\eca3";
+}
+
+.icon-yishenpi:before {
+  content: "\ecad";
+}
+
+.icon-jilu:before {
+  content: "\e602";
+}
+
+.icon-gongzuojilu:before {
+  content: "\e663";
+}
+
+.icon-xiaoxi1:before {
+  content: "\e601";
+}
+
+.icon-hetong2:before {
+  content: "\e611";
+}
+
+.icon-gongzuotai1:before {
+  content: "\e7be";
+}
+
+.icon-xiangmu1:before {
+  content: "\e661";
+}
+
+.icon-kehu:before {
+  content: "\e60c";
+}
+
+.icon-addnew:before {
+  content: "\e615";
+}
+
+.icon-chengji:before {
+  content: "\e6ec";
+}
+
+.icon-yuedu:before {
+  content: "\e6ed";
+}
+
+.icon-kaohe:before {
+  content: "\e6ee";
+}
+
+.icon-lunwenguanli:before {
+  content: "\e6ef";
+}
+
+.icon-shenbao:before {
+  content: "\e6f0";
+}
+
+.icon-kecheng:before {
+  content: "\e6f1";
+}
+
+.icon-tiku:before {
+  content: "\e6f2";
+}
+
+.icon-jiangshishezhi:before {
+  content: "\e6f3";
+}
+
+.icon-xinzeng:before {
+  content: "\e6f4";
+}
+
+.icon-chaojitongji:before {
+  content: "\e6f5";
+}
+
+.icon-yuanogtongji:before {
+  content: "\e6f6";
+}
+
+.icon-tuiguangtongji:before {
+  content: "\e6f7";
+}
+
+.icon-yuangongtongji2:before {
+  content: "\e6f8";
+}
+
+.icon-shujutongji:before {
+  content: "\e6f9";
+}
+
+.icon-shujudaoru:before {
+  content: "\e6fa";
+}
+
+.icon-jixiao:before {
+  content: "\e6fb";
+}
+
+.icon-yuancheng:before {
+  content: "\e6fe";
+}
+
+.icon-shuji:before {
+  content: "\e6ff";
+}
+
+.icon-zhishiku:before {
+  content: "\e700";
+}
+
+.icon-pingfen:before {
+  content: "\e701";
+}
+
+.icon-dingdan:before {
+  content: "\e702";
+}
+
+.icon-wentifankui:before {
+  content: "\e703";
+}
+
+.icon-zichan:before {
+  content: "\e704";
+}
+
+.icon-kai:before {
+  content: "\e705";
+}
+
+.icon-xiangmuguanli:before {
+  content: "\e706";
+}
+
+.icon-gongzhonghao:before {
+  content: "\e707";
+}
+
+.icon-anquanshezhi:before {
+  content: "\e708";
+}
+
+.icon-fuwuzhongxin:before {
+  content: "\e709";
+}
+
+.icon-qiyefuwu:before {
+  content: "\e70e";
+}
+
+.icon-wangke:before {
+  content: "\e710";
+}
+
+.icon-shoufei:before {
+  content: "\e715";
+}
+
+.icon-quanxianshezhi:before {
+  content: "\e716";
+}
+
+.icon-tongjirili:before {
+  content: "\e717";
+}
+
+.icon-shoufeitongji:before {
+  content: "\e718";
+}
+
+.icon-bingtutongji:before {
+  content: "\e719";
+}
+
+.icon-zhuzhuangtongji:before {
+  content: "\e71a";
+}
+
+.icon-youxuliebiao:before {
+  content: "\e71b";
+}
+
+.icon-huoyuedu:before {
+  content: "\e71c";
+}
+
+.icon-baoming:before {
+  content: "\e71d";
+}
+
+.icon-luyong:before {
+  content: "\e720";
+}
+
+.icon-zhuce:before {
+  content: "\e721";
+}
+
+.icon-yuangong:before {
+  content: "\e723";
+}
+
+.icon-huamingce:before {
+  content: "\e724";
+}
+
+.icon-fenleiguanli:before {
+  content: "\e725";
+}
+
+.icon-dangan:before {
+  content: "\e726";
+}
+
+.icon-fenlei:before {
+  content: "\e727";
+}
+
+.icon-tongzhi:before {
+  content: "\e728";
+}
+
+.icon-jihua:before {
+  content: "\e729";
+}
+
+.icon-wancheng:before {
+  content: "\e72c";
+}
+
+.icon-xueshengchengji:before {
+  content: "\e72d";
+}
+
+.icon-tupianguanli:before {
+  content: "\e72e";
+}
+
+.icon-richengguanli:before {
+  content: "\e72f";
+}
+
+.icon-bianji:before {
+  content: "\e730";
+}
+
+.icon-neirongguanli:before {
+  content: "\e731";
+}
+
+.icon-kaoheguanli:before {
+  content: "\e732";
+}
+
+.icon-jiaoshiguanli:before {
+  content: "\e734";
+}
+
+.icon-wangkeguanli:before {
+  content: "\e735";
+}
+
+.icon-bulujiesuan:before {
+  content: "\e736";
+}
+
+.icon-mingpian:before {
+  content: "\e737";
+}
+
+.icon-kaohezhibiao:before {
+  content: "\e738";
+}
+
+.icon-qiyeguanli:before {
+  content: "\e77e";
+}
+
+.icon-chubuguanli:before {
+  content: "\e77f";
+}
+
+.icon-saomiaodianjing:before {
+  content: "\e781";
+}
+
+.icon-jiezhang:before {
+  content: "\e782";
+}
+
+.icon-xiaoshoubaobiao:before {
+  content: "\e783";
+}
+
+.icon-pingzheng:before {
+  content: "\e784";
+}
+
+.icon-hetong:before {
+  content: "\e785";
+}
+
+.icon-xiaoshoupin:before {
+  content: "\e787";
+}
+
+.icon-xueshuguanli:before {
+  content: "\e788";
+}
+
+.icon-renwuguanli:before {
+  content: "\e78a";
+}
+
+.icon-dianshang:before {
+  content: "\e78b";
+}
+
+.icon-gudingzichan:before {
+  content: "\e78d";
+}
+
+.icon-dongtai:before {
+  content: "\e78e";
+}
+
+.icon-jichupeizhi:before {
+  content: "\e78f";
+}
+
+.icon-dashuju:before {
+  content: "\e792";
+}
+
+.icon-hujiaoshezhi:before {
+  content: "\e794";
+}
+
+.icon-fenxiao:before {
+  content: "\e795";
+}
+
+.icon-chengjitongji:before {
+  content: "\e796";
+}
+
+.icon-tuiguangshezhi:before {
+  content: "\e797";
+}
+
+.icon-banjiguanli:before {
+  content: "\e798";
+}
+
+.icon-hetongyidong:before {
+  content: "\e799";
+}
+
+.icon-kechengbao:before {
+  content: "\e79a";
+}
+
+.icon-yonghuguanli:before {
+  content: "\e79b";
+}
+
+.icon-yonghuhuaxiang:before {
+  content: "\e79c";
+}
+
+.icon-zhanghaoguanli:before {
+  content: "\e79d";
+}
+
+.icon-yusuan:before {
+  content: "\e79f";
+}
+
+.icon-mingpianbaobiao:before {
+  content: "\e7a0";
+}
+
+.icon-dingdanguanli:before {
+  content: "\e7a1";
+}
+
+.icon-tuiguangguanli:before {
+  content: "\e7a2";
+}
+
+.icon-zhuantiguanli:before {
+  content: "\e7a3";
+}
+
+.icon-xiaoshoushezhi:before {
+  content: "\e7a5";
+}
+
+.icon-sucaiguanli:before {
+  content: "\e7a9";
+}
+
+.icon-yuangongdaoru:before {
+  content: "\e7aa";
+}
+
+.icon-shangpinguanli:before {
+  content: "\e7ab";
+}
+
+.icon-paikeguanli:before {
+  content: "\e7ac";
+}
+
+.icon-xinxidaoru:before {
+  content: "\e7ad";
+}
+
+.icon-shoufeipeizhi:before {
+  content: "\e7ae";
+}
+
+.icon-yonghuquanxian:before {
+  content: "\e7af";
+}
+
+.icon-yuangongguanli:before {
+  content: "\e7b0";
+}
+
+.icon-gonghao:before {
+  content: "\e7b1";
+}
+
+.icon-ziliaoguidang:before {
+  content: "\e7b2";
+}
+
+.icon-jiaoxue:before {
+  content: "\e7b4";
+}
+
+.icon-zhangfang:before {
+  content: "\e7b5";
+}
+
+.icon-ziliaoshezhi:before {
+  content: "\e7b6";
+}
+
+.icon-jixiaotongji:before {
+  content: "\e7b7";
+}
+
+.icon-zhaopin:before {
+  content: "\e7b8";
+}
+
+.icon-kaoshijihua:before {
+  content: "\e7ba";
+}
+
+.icon-jingpinketang:before {
+  content: "\e7bb";
+}
+
+.icon-yuangongtidian:before {
+  content: "\e7bc";
+}
+
+.icon-kaoshi:before {
+  content: "\e7bd";
+}
+
+.icon-jiaoxueanpai:before {
+  content: "\e7bf";
+}
+
+.icon-mianshoujiaoxue:before {
+  content: "\e7c6";
+}
+
+.icon-xuetangguanli:before {
+  content: "\e7c7";
+}
+
+.icon-chengjiliebiao:before {
+  content: "\e7c9";
+}
+
+.icon-kejian:before {
+  content: "\e7cc";
+}
+
+.icon-waibukejian:before {
+  content: "\e7cd";
+}
+
+.icon-rizhiguanli:before {
+  content: "\e7ce";
+}
+
+.icon-mobanguanli:before {
+  content: "\e7cf";
+}
+
+.icon-yiyichuli:before {
+  content: "\e7d2";
+}
+
+.icon-gongwenshenbao:before {
+  content: "\e7d3";
+}
+
+.icon-gongwen:before {
+  content: "\e7d4";
+}
+
+.icon-gongwenbianji:before {
+  content: "\e7d5";
+}
+
+.icon-gongwenxinzeng:before {
+  content: "\e7d6";
+}
+
+.icon-mokuaishezhi:before {
+  content: "\e7d7";
+}
+
+.icon-ziliaoguanli:before {
+  content: "\e7d8";
+}
+
+.icon-yingyongguanli1:before {
+  content: "\e7da";
+}
+
+.icon-wenjuan:before {
+  content: "\e7db";
+}
+
+.icon-wodekecheng:before {
+  content: "\e7dc";
+}
+
+.icon-daimaguanli:before {
+  content: "\e7dd";
+}
+
+.icon-yuangongjixiao:before {
+  content: "\e7df";
+}
+
+.icon-fuwuguanli:before {
+  content: "\e7e2";
+}
+
+.icon-yinjinshoufei:before {
+  content: "\e7e5";
+}
+
+.icon-yingjiaoqingdan:before {
+  content: "\e7e6";
+}
+
+.icon-duizhangdan:before {
+  content: "\e7e7";
+}
+
+.icon-shangjiguanli:before {
+  content: "\e7e8";
+}
+
+.icon-yonghushezhi:before {
+  content: "\e7ea";
+}
+
+.icon-xiaoxishezhi:before {
+  content: "\e7ec";
+}
+
+.icon-yingxiaoshezhi:before {
+  content: "\e7ed";
+}
+
+.icon-fuwushichang:before {
+  content: "\e7ee";
+}
+
+.icon-sucaiziyuan:before {
+  content: "\e7ef";
+}
+
+.icon-yingxiaotongji:before {
+  content: "\e7f0";
+}
+
+.icon-tuiguang:before {
+  content: "\e7f1";
+}
+
+.icon-yonghuliebiao:before {
+  content: "\e7f2";
+}
+
+.icon-chakanxiangqing:before {
+  content: "\e603";
+}
+
+.icon-lianjie:before {
+  content: "\e67b";
+}
+
+.icon-quanxian:before {
+  content: "\e610";
+}
+
+.icon-cuowu:before {
+  content: "\e642";
+}
+
+.icon-suozhu:before {
+  content: "\e65f";
+}
+
+.icon-jiesuo:before {
+  content: "\e660";
+}
+
+.icon-weixin:before {
+  content: "\e62b";
+}
+
+.icon-qq:before {
+  content: "\e651";
+}
+
+.icon-shangchuan:before {
+  content: "\e658";
+}
+
+.icon-xiazai:before {
+  content: "\e659";
+}
+
+.icon-daochu:before {
+  content: "\e60a";
+}
+
+.icon-daoru:before {
+  content: "\e60b";
+}
+
+.icon-working:before {
+  content: "\e639";
+}
+
+.icon-gengduo1:before {
+  content: "\e638";
+}
+
+.icon-gengduo2:before {
+  content: "\e626";
+}
+
+.icon-gengduo3:before {
+  content: "\e608";
+}
+
+.icon-fenxiang:before {
+  content: "\e8b0";
+}
+
+.icon-shanchu:before {
+  content: "\e616";
+}
+
+.icon-ziyuanguanli:before {
+  content: "\e692";
+}
+
+.icon-hetongshezhi:before {
+  content: "\e693";
+}
+
+.icon-wenjianhe:before {
+  content: "\e694";
+}
+
+.icon-tikuguanli:before {
+  content: "\e695";
+}
+
+.icon-wangkeshichang:before {
+  content: "\e696";
+}
+
+.icon-gongdan1:before {
+  content: "\e698";
+}
+
+.icon-fangke:before {
+  content: "\e699";
+}
+
+.icon-xiansuoguanli:before {
+  content: "\e69a";
+}
+
+.icon-kehuguanli:before {
+  content: "\e69b";
+}
+
+.icon-jituankehu:before {
+  content: "\e69c";
+}
+
+.icon-genjinjilu:before {
+  content: "\e69d";
+}
+
+.icon-gongzuotai:before {
+  content: "\e69e";
+}
+
+.icon-shujubaobiao:before {
+  content: "\e69f";
+}
+
+.icon-fangkebaobiao:before {
+  content: "\e6a0";
+}
+
+.icon-zhangbuguanli:before {
+  content: "\e6a1";
+}
+
+.icon-zhangbu:before {
+  content: "\e6a2";
+}
+
+.icon-zhangbuzhongxin:before {
+  content: "\e6a3";
+}
+
+.icon-hetongguanli:before {
+  content: "\e6a4";
+}
+
+.icon-yunyingzhe:before {
+  content: "\e6a5";
+}
+
+.icon-zhaopinguanli:before {
+  content: "\e6a6";
+}
+
+.icon-gongziguanli:before {
+  content: "\e6a7";
+}
+
+.icon-wodeshenpi:before {
+  content: "\e6a8";
+}
+
+.icon-mobanshezhi:before {
+  content: "\e6a9";
+}
+
+.icon-jichushezhi:before {
+  content: "\e6aa";
+}
+
+.icon-caiwushezhi:before {
+  content: "\e6ab";
+}
+
+.icon-chanpinshezhi:before {
+  content: "\e6ac";
+}
+
+.icon-shenpishezhi:before {
+  content: "\e6ad";
+}
+
+.icon-mubiaoguanli:before {
+  content: "\e6ae";
+}
+
+.icon-zhandianshezhi:before {
+  content: "\e6af";
+}
+
+.icon-renshishezhi:before {
+  content: "\e6b1";
+}
+
+.icon-mingpianshezhi:before {
+  content: "\e6b2";
+}
+
+.icon-kechengshezhi:before {
+  content: "\e6b3";
+}
+
+.icon-wodedianping:before {
+  content: "\e6b4";
+}
+
+.icon-biaoxingyuangong:before {
+  content: "\e6b5";
+}
+
+.icon-lianxijilu:before {
+  content: "\e6b8";
+}
+
+.icon-tousutiwen:before {
+  content: "\e6b9";
+}
+
+.icon-feiyongchaxun:before {
+  content: "\e6bb";
+}
+
+.icon-jiaofei:before {
+  content: "\e6bc";
+}
+
+.icon-jizhang:before {
+  content: "\e6bd";
+}
+
+.icon-chaxun1:before {
+  content: "\e6be";
+}
+
+.icon-chazhang:before {
+  content: "\e6bf";
+}
+
+.icon-baobiao:before {
+  content: "\e6c0";
+}
+
+.icon-shezhi2:before {
+  content: "\e6c2";
+}
+
+.icon-daqiajilu:before {
+  content: "\e6ce";
+}
+
+.icon-kechengziyuanguanli:before {
+  content: "\e6d3";
+}
+
+.icon-ziliaozhongxin:before {
+  content: "\e6d6";
+}
+
+.icon-houtaishezhi:before {
+  content: "\e6d8";
+}
+
+.icon-zhaoshengshezhi:before {
+  content: "\e6db";
+}
+
+.icon-xinzengyuangong:before {
+  content: "\e6df";
+}
+
+.icon-zhaoshengbaobiao:before {
+  content: "\e6e1";
+}
+
+.icon-caidanguanli:before {
+  content: "\e6e2";
+}
+
+.icon-chuangjianxitong:before {
+  content: "\e6e6";
+}
+
+.icon-gongdanguanli:before {
+  content: "\e6e7";
+}
+
+.icon-duanxin:before {
+  content: "\e6e8";
+}
+
+.icon-bangzhuzhongxin:before {
+  content: "\e6e9";
+}
+
+.icon-yuangongbiandong:before {
+  content: "\e6ea";
+}
+
+.icon-bianjiwendang:before {
+  content: "\e6eb";
+}
+
+.icon-none:before {
+  content: "\e6b0";
+}
+
+.icon-changjingguanli:before {
+  content: "\eb61";
+}
+
+.icon-shezhi:before {
+  content: "\eb62";
+}
+
+.icon-gongnengdingyi:before {
+  content: "\eb63";
+}
+
+.icon-jichuguanli:before {
+  content: "\eb64";
+}
+
+.icon-jishufuwu:before {
+  content: "\eb65";
+}
+
+.icon-ceshishenqing:before {
+  content: "\eb66";
+}
+
+.icon-jinggao:before {
+  content: "\eb67";
+}
+
+.icon-peiwangyindao:before {
+  content: "\eb68";
+}
+
+.icon-renjijiaohu:before {
+  content: "\eb69";
+}
+
+.icon-quanxianshenpi:before {
+  content: "\eb6b";
+}
+
+.icon-yishouquan:before {
+  content: "\eb6c";
+}
+
+.icon-tianshenpi:before {
+  content: "\eb6d";
+}
+
+.icon-shujukanban:before {
+  content: "\eb6e";
+}
+
+.icon-yingyongguanli:before {
+  content: "\eb6f";
+}
+
+.icon-zhanghaoquanxiang:before {
+  content: "\eb70";
+}
+
+.icon-yuanquyunwei:before {
+  content: "\eb71";
+}
+
+.icon-zidingyi:before {
+  content: "\eb73";
+}
+
+.icon-tianjia:before {
+  content: "\eb89";
+}
+
+.icon-wangye:before {
+  content: "\eb8c";
+}
+
+.icon-shezhi1:before {
+  content: "\eb8d";
+}
+
+.icon-yingyong:before {
+  content: "\eb8f";
+}
+
+.icon-wendang:before {
+  content: "\eb91";
+}
+
+.icon-bingtu:before {
+  content: "\eb95";
+}
+
+.icon-guize:before {
+  content: "\ebb7";
+}
+
+.icon-shebeiguanli:before {
+  content: "\ebb8";
+}
+
+.icon-gongnengdingyi1:before {
+  content: "\ebb9";
+}
+
+.icon-jishufuwu1:before {
+  content: "\ebce";
+}
+
+.icon-zuzhiqunzu:before {
+  content: "\ebda";
+}
+
+.icon-dakai:before {
+  content: "\ebdf";
+}
+
+.icon-kongxinduigou:before {
+  content: "\ebe5";
+}
+
+.icon-kongjianxuanzhong:before {
+  content: "\ebef";
+}
+
+.icon-kongjianweixuan:before {
+  content: "\ebf0";
+}
+
+.icon-kongjianyixuan:before {
+  content: "\ebf1";
+}
+
+.icon-shuaxin:before {
+  content: "\ec08";
+}
+
+.icon-baocun:before {
+  content: "\ec09";
+}
+
+.icon-fabu:before {
+  content: "\ec0a";
+}
+
+.icon-tupianjiazaishibai:before {
+  content: "\ec0d";
+}
+
+.icon-suoxiao:before {
+  content: "\ec13";
+}
+
+.icon-fangda:before {
+  content: "\ec14";
+}
+
+.icon-huanyuanhuabu:before {
+  content: "\ec15";
+}
+
+.icon-quanping:before {
+  content: "\ec16";
+}
+
+.icon-APIshuchu:before {
+  content: "\ec17";
+}
+
+.icon-APIjieru:before {
+  content: "\ec18";
+}
+
+.icon-wenjianjia:before {
+  content: "\ec19";
+}
+
+.icon-DOC:before {
+  content: "\ec1a";
+}
+
+.icon-weizhigeshi:before {
+  content: "\ec1f";
+}
+
+.icon-gengduo:before {
+  content: "\ec20";
+}
+
+.icon-dian:before {
+  content: "\ec23";
+}
+
+.icon-shebeizhuangtai:before {
+  content: "\ec24";
+}
+
+.icon-fenzuguanli:before {
+  content: "\ec25";
+}
+
+.icon-kuaisubianpai:before {
+  content: "\ec26";
+}
+
+.icon-app:before {
+  content: "\ec27";
+}
+
+.icon-wentijieda:before {
+  content: "\ec2e";
+}
+
+.icon-kefu:before {
+  content: "\ec2f";
+}
+
+.icon-ruanjiankaifabao:before {
+  content: "\ec30";
+}
+
+.icon-dingwei:before {
+  content: "\ec34";
+}
+
+.icon-renwujincheng:before {
+  content: "\ec35";
+}
+
+.icon-xiaoxitongzhi1:before {
+  content: "\ec36";
+}
+
+.icon-gaojing:before {
+  content: "\ec37";
+}
+
+.icon-zhihangfankui:before {
+  content: "\ec38";
+}
+
+.icon-gongdanqueren:before {
+  content: "\ec39";
+}
+
+.icon-gongdan:before {
+  content: "\ec3b";
+}
+
+.icon-xiaoxi:before {
+  content: "\ec3c";
+}
+
+.icon-chaxun:before {
+  content: "\ec4c";
+}
+
+.icon-anquan:before {
+  content: "\ec4d";
+}
+
+.icon-daibanshixiang:before {
+  content: "\ec4e";
+}
+
+.icon-huowudui:before {
+  content: "\ec54";
+}
+
+.icon-chucun:before {
+  content: "\ec5e";
+}
+
+.icon-zhexiantu:before {
+  content: "\ec66";
+}
+
+.icon-liebiao:before {
+  content: "\ec6b";
+}
+
+.icon-qiche:before {
+  content: "\ec6d";
+}
+
+.icon-fuzhi:before {
+  content: "\ec7a";
+}
+
+.icon-iframetianjia:before {
+  content: "\ec7d";
+}
+
+.icon-tupiantianjia:before {
+  content: "\ec7e";
+}
+
+.icon-dianzan:before {
+  content: "\ec7f";
+}
+
+.icon-charulianjie:before {
+  content: "\ec80";
+}
+
+.icon-charutupian:before {
+  content: "\ec81";
+}
+
+.icon-duigoux:before {
+  content: "\ec9e";
+}
+
+.icon-guanbi1:before {
+  content: "\eca0";
+}
+
+.icon-aixin:before {
+  content: "\eca1";
+}
+
+.icon-shexiangtou_shiti:before {
+  content: "\eca5";
+}
+
+.icon-shexiangtou_guanbi:before {
+  content: "\eca6";
+}
+
+.icon-shexiangtou:before {
+  content: "\eca7";
+}
+
+.icon-shengyin_shiti:before {
+  content: "\eca8";
+}
+
+.icon-shengyinkai:before {
+  content: "\eca9";
+}
+
+.icon-shoucang_shixin:before {
+  content: "\ecaa";
+}
+
+.icon-shoucang:before {
+  content: "\ecab";
+}
+
+.icon-shebeikaifa:before {
+  content: "\ecac";
+}
+
+.icon-kongxinwenhao:before {
+  content: "\ed19";
+}
+
+.icon-cuowukongxin:before {
+  content: "\ed1a";
+}
+
+.icon-fangkuai1:before {
+  content: "\ed1b";
+}
+
+.icon-fangkuai2:before {
+  content: "\ed1c";
+}
+
+.icon-kongxinduigou1:before {
+  content: "\ed1d";
+}
+
+.icon-xinxikongxin:before {
+  content: "\ed1e";
+}
+
+.icon-kongjian:before {
+  content: "\ed1f";
+}
+
+.icon-gaojingkongxin:before {
+  content: "\ed20";
+}
+
+.icon-add:before {
+  content: "\e70a";
+}
+
+.icon-arrow:before {
+  content: "\e70b";
+}
+
+.icon-arrow-left:before {
+  content: "\e70c";
+}
+
+.icon-clock:before {
+  content: "\e711";
+}
+
+.icon-completed:before {
+  content: "\e713";
+}
+
+.icon-contact:before {
+  content: "\e714";
+}
+
+.icon-location:before {
+  content: "\e71e";
+}
+
+.icon-question:before {
+  content: "\e72a";
+}
+
+.icon-search:before {
+  content: "\e72b";
+}
+
+.icon-nav:before {
+  content: "\e733";
+}
+
+.icon-fujian:before {
+  content: "\e65c";
+}
+
+.icon-ferengongzi:before {
+  content: "\e65a";
+}
+
+.icon-huiyijiyao:before {
+  content: "\e670";
+}
+
+.icon-gonggaotongzhi:before {
+  content: "\e6e5";
+}
+
+.icon-gerenjixiao:before {
+  content: "\e600";
+}
+
+.icon-gongsixinwen:before {
+  content: "\e697";
+}
+
+.icon-gerenkaoqin:before {
+  content: "\e624";
+}
+
+.icon-richangbangong:before {
+  content: "\e7b3";
+}
+
+.icon-bangongshenpi:before {
+  content: "\e63a";
+}
+
diff --git a/public/static/assets/icon/iconfont.js b/public/static/assets/icon/iconfont.js
new file mode 100644
index 0000000000000000000000000000000000000000..bea669c59aae7eb7252835fcdf21a39b871b7159
--- /dev/null
+++ b/public/static/assets/icon/iconfont.js
@@ -0,0 +1 @@
+window._iconfont_svg_string_4700657='<svg><symbol id="icon-addnew" viewBox="0 0 1024 1024"><path d="M990 478H546V34c0-18.78-15.22-34-34-34s-34 15.22-34 34v444H34c-18.78 0-34 15.22-34 34s15.22 34 34 34h444v444c0 18.78 15.22 34 34 34s34-15.22 34-34V546h444c18.78 0 34-15.22 34-34s-15.22-34-34-34z" fill="#2c2c2c" ></path></symbol><symbol id="icon-chengji" viewBox="0 0 1024 1024"><path d="M937.6 243.2c12.4 0 22.4-10 22.4-22.4v-112c0-24.6-20.2-44.8-44.8-44.8H108.8C84.2 64 64 84.2 64 108.8v806.4c0 24.6 20.2 44.8 44.8 44.8h806.4c24.6 0 44.8-20.2 44.8-44.8V400c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v492.8c0 12.3-10.1 22.4-22.4 22.4H131.2c-12.3 0-22.4-10.1-22.4-22.4V131.2c0-12.3 10.1-22.4 22.4-22.4h761.6c12.3 0 22.4 10.1 22.4 22.4v89.6c0 12.4 10 22.4 22.4 22.4zM475.9 369c-0.6-1.4-1.5-2.5-2.3-3.7-0.8-1.2-1.5-2.5-2.5-3.5-0.9-0.9-2-1.5-3-2.2-1.4-1-2.7-1.9-4.2-2.6-0.3-0.1-0.5-0.4-0.8-0.5-1-0.4-2-0.2-3-0.4-1.6-0.3-3.1-0.7-4.7-0.7s-3.1 0.4-4.7 0.7c-1 0.2-2 0.1-3 0.4-0.3 0.1-0.5 0.4-0.8 0.5-1.6 0.6-2.9 1.6-4.2 2.6-1 0.7-2.1 1.3-3 2.2-1 1-1.7 2.3-2.6 3.5-0.8 1.2-1.7 2.4-2.3 3.7-0.1 0.3-0.4 0.6-0.6 0.9L311.8 706.7c-4.2 11.6 1.8 24.5 13.4 28.7 11.6 4.2 24.5-1.8 28.7-13.4l27.5-75.7h148l27.5 75.7c4.2 11.6 17.1 17.6 28.7 13.4 11.6-4.2 17.6-17.1 13.4-28.7L476.5 369.9c-0.2-0.3-0.4-0.5-0.6-0.9z m-78.2 232.6l57.7-158.5 57.7 158.5H397.7zM680 489.8c12.4 0 22.4-10 22.4-22.4v-56h56c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4h-56v-56c0-12.4-10-22.4-22.4-22.4s-22.4 10-22.4 22.4v56h-56c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h56v56c0 12.4 10 22.4 22.4 22.4z" fill="#2c2c2c" ></path></symbol><symbol id="icon-yuedu" viewBox="0 0 1024 1024"><path d="M937.6 243.2c12.4 0 22.4-10 22.4-22.4v-112c0-24.6-20.2-44.8-44.8-44.8H108.8C84.2 64 64 84.2 64 108.8v806.4c0 24.6 20.2 44.8 44.8 44.8h806.4c24.6 0 44.8-20.2 44.8-44.8V400c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v492.8c0 12.3-10.1 22.4-22.4 22.4H131.2c-12.3 0-22.4-10.1-22.4-22.4V131.2c0-12.3 10.1-22.4 22.4-22.4h761.6c12.3 0 22.4 10.1 22.4 22.4v89.6c0 12.4 10 22.4 22.4 22.4zM747.7 408.4C716.8 369.9 623 265.6 512 265.6c-111 0-204.9 104.4-235.7 142.8-6.6 8.2-6.6 19.8 0 28C307.1 474.8 401 579.2 512 579.2c111 0 204.8-104.3 235.7-142.8 6.6-8.2 6.6-19.8 0-28zM512 534.4c-80.7 0-154.6-72.3-189.2-112.2C362.1 377 436.3 310.4 512 310.4c80.7 0 154.6 72.3 189.2 112.2-39.3 45.2-113.4 111.8-189.2 111.8z m0-156.8c-24.7 0-44.8 20.1-44.8 44.8 0 24.7 20.1 44.8 44.8 44.8s44.8-20.1 44.8-44.8c0-24.7-20.1-44.8-44.8-44.8zM310.4 691.2c-12.3 0-22.4 10.1-22.4 22.4 0 12.3 10.1 22.4 22.4 22.4h403.2c12.3 0 22.4-10.1 22.4-22.4 0-12.3-10.1-22.4-22.4-22.4H310.4z" fill="#2c2c2c" ></path></symbol><symbol id="icon-kaohe" viewBox="0 0 1024 1024"><path d="M731.9 353.6L462.7 622.8 336.9 497c-8.7-8.7-23-8.7-31.7 0s-8.7 23 0 31.7L446.6 670c0.1 0.1 0.1 0.3 0.2 0.4 4.4 4.4 10.1 6.5 15.9 6.5 5.8 0 11.5-2.2 15.9-6.5 0.1-0.1 0.1-0.3 0.2-0.4l284.7-284.7c8.7-8.7 8.7-23 0-31.7-8.6-8.7-22.9-8.7-31.6 0z m205.7-110.4c12.4 0 22.4-10 22.4-22.4v-112c0-24.6-20.2-44.8-44.8-44.8H108.8C84.2 64 64 84.2 64 108.8v806.4c0 24.6 20.2 44.8 44.8 44.8h806.4c24.6 0 44.8-20.2 44.8-44.8V400c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v492.8c0 12.3-10.1 22.4-22.4 22.4H131.2c-12.3 0-22.4-10.1-22.4-22.4V131.2c0-12.3 10.1-22.4 22.4-22.4h761.6c12.3 0 22.4 10.1 22.4 22.4v89.6c0 12.4 10 22.4 22.4 22.4z" fill="#2c2c2c" ></path></symbol><symbol id="icon-lunwenguanli" viewBox="0 0 1024 1024"><path d="M937.6 243.2c12.4 0 22.4-10 22.4-22.4v-112c0-24.6-20.2-44.8-44.8-44.8H108.8C84.2 64 64 84.2 64 108.8v806.4c0 24.6 20.2 44.8 44.8 44.8h806.4c24.6 0 44.8-20.2 44.8-44.8V400c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v492.8c0 12.4-10 22.4-22.4 22.4H131.2c-12.4 0-22.4-10-22.4-22.4V131.2c0-12.4 10-22.4 22.4-22.4h761.6c12.4 0 22.4 10 22.4 22.4v89.6c0 12.4 10 22.4 22.4 22.4z" fill="#2c2c2c" ></path><path d="M758.4 601.6c0-12.3-10.1-22.4-22.4-22.4H288c-12.3 0-22.4 10.1-22.4 22.4 0 12.3 10.1 22.4 22.4 22.4h448c12.3 0 22.4-10.1 22.4-22.4zM736 444.8H556.8c-12.3 0-22.4 10.1-22.4 22.4 0 12.3 10.1 22.4 22.4 22.4H736c12.3 0 22.4-10.1 22.4-22.4 0-12.3-10.1-22.4-22.4-22.4zM288 713.6c-12.3 0-22.4 10.1-22.4 22.4s10.1 22.4 22.4 22.4h268.8c12.3 0 22.4-10.1 22.4-22.4s-10.1-22.4-22.4-22.4H288zM400 489.6c12.3 0 22.4-10.1 22.4-22.4V310.4H512c12.3 0 22.4-10.1 22.4-22.4s-10.1-22.4-22.4-22.4H288c-12.3 0-22.4 10.1-22.4 22.4s10.1 22.4 22.4 22.4h89.6v156.8c0 12.3 10.1 22.4 22.4 22.4z" fill="#2c2c2c" ></path></symbol><symbol id="icon-shenbao" viewBox="0 0 1024 1024"><path d="M937.6 243.2c12.4 0 22.4-10 22.4-22.4v-112c0-24.6-20.2-44.8-44.8-44.8H108.8C84.2 64 64 84.2 64 108.8v806.4c0 24.6 20.2 44.8 44.8 44.8h806.4c24.6 0 44.8-20.2 44.8-44.8V400c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v492.8c0 12.4-10 22.4-22.4 22.4H131.2c-12.4 0-22.4-10-22.4-22.4V131.2c0-12.4 10-22.4 22.4-22.4h761.6c12.4 0 22.4 10 22.4 22.4v89.6c0 12.4 10 22.4 22.4 22.4zM609.3 758.4c12.3 0 22.4-10.1 22.4-22.4V521.3l88.5 88.5c8.7 8.7 23 8.7 31.7 0s8.7-23 0-31.7L625.2 451.4v-0.1c-1.5-1.5-3.3-2.3-5-3.3-0.8-0.4-1.4-1.1-2.2-1.5-2.8-1.1-5.7-1.7-8.6-1.7-2.9 0-5.9 0.6-8.6 1.8-0.8 0.3-1.3 1-2.1 1.4-1.8 1-3.6 1.9-5.2 3.4v0.1L466.8 578c-8.7 8.7-8.7 23 0 31.7s23 8.7 31.7 0l88.5-88.5V736c-0.1 12.3 10 22.4 22.3 22.4zM288 691.2c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h112c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H288z m448-402H288c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h448c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4z m-268.8 178c0-12.4-10-22.4-22.4-22.4H288c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h156.8c12.4 0 22.4-10 22.4-22.4z" fill="#2c2c2c" ></path></symbol><symbol id="icon-kecheng" viewBox="0 0 1024 1024"><path d="M896 234.7c11.8 0 21.3-9.6 21.3-21.3V106.7c0-23.6-19.1-42.7-42.7-42.7H149.3c-23.6 0-42.7 19.1-42.7 42.7v746.7c0 58.7 48 106.7 106.7 106.7H896c11.8 0 21.3-9.6 21.3-21.3V384c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3v362.7H213.3c-24.1 0-46.1 8.4-64 22V128c0-11.8 9.6-21.3 21.3-21.3h682.7c11.8 0 21.3 9.6 21.3 21.3v85.3c0.1 11.8 9.6 21.4 21.4 21.4zM213.3 789.3h661.3v128H213.3c-35.3 0-64-28.7-64-64s28.7-64 64-64z m512-512c0-11.8-9.6-21.3-21.3-21.3H320c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h384c11.8 0.1 21.3-9.5 21.3-21.3zM320 405.3c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h213.3c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H320z" fill="#2c2c2c" ></path></symbol><symbol id="icon-tiku" viewBox="0 0 1024 1024"><path d="M896 234.7c11.8 0 21.3-9.6 21.3-21.3V106.7c0-23.6-19.1-42.7-42.7-42.7H149.3c-23.6 0-42.7 19.1-42.7 42.7v810.7c0 23.6 19.1 42.7 42.7 42.7h725.3c23.6 0 42.7-19.1 42.7-42.7V384c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3v512c0 11.8-9.6 21.3-21.3 21.3H170.7c-11.8 0-21.3-9.6-21.3-21.3V128c0-11.8 9.6-21.3 21.3-21.3h682.7c11.8 0 21.3 9.6 21.3 21.3v85.3c0 11.8 9.5 21.4 21.3 21.4z m-234.7 42.6c0-11.8-9.6-21.3-21.3-21.3H384c-11.8 0-21.3 9.6-21.3 21.3v325.9c0 16.4 17.7 26.6 31.9 18.5l117.4-67 117.4 67.1c14.2 8.1 31.9-2.1 31.9-18.5v-326zM618.7 576l-101.2-60.7c-3.4-2-7.6-2-11 0L405.3 576V298.7h213.3V576zM384 725.3c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h256c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H384z" fill="#2c2c2c" ></path></symbol><symbol id="icon-jiangshishezhi" viewBox="0 0 1024 1024"><path d="M937.6 243.2c12.4 0 22.4-10 22.4-22.4v-112c0-24.6-20.2-44.8-44.8-44.8H108.8C84.2 64 64 84.2 64 108.8v806.4c0 24.6 20.2 44.8 44.8 44.8h806.4c24.6 0 44.8-20.2 44.8-44.8V400c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v492.8c0 12.3-10.1 22.4-22.4 22.4H131.2c-12.3 0-22.4-10.1-22.4-22.4V131.2c0-12.3 10.1-22.4 22.4-22.4h761.6c12.3 0 22.4 10.1 22.4 22.4v89.6c0 12.4 10 22.4 22.4 22.4z" fill="#2c2c2c" ></path><path d="M264.5 710.9c-1.5 13.3 8.9 25.1 22.4 25.1 11.2 0 20.9-8.3 22.1-19.4 9.7-89.8 85.7-159.8 178.2-159.8s168.5 70 178.2 159.8c0.1 0.6 0.4 1 0.5 1.6 0.3 1.6 0.7 3.1 1.4 4.6 0.6 1.4 1.4 2.5 2.3 3.7 0.7 1 1.4 1.9 2.2 2.8 1.3 1.3 2.7 2.2 4.3 3.2 0.7 0.4 1.2 1.1 1.9 1.4 0.2 0.1 0.5 0.1 0.7 0.2 1.7 0.7 3.6 1 5.5 1.3 1 0.1 1.9 0.5 2.9 0.5 0.2 0 0.3 0.1 0.4 0.1 0.9 0 1.6-0.4 2.5-0.5 2-0.2 4-0.5 5.9-1.3 1.3-0.5 2.3-1.3 3.5-2.1 1.3-0.9 2.7-1.7 3.8-2.8 1.1-1.1 2-2.5 2.8-3.8 0.5-0.8 1.3-1.4 1.7-2.3l94.7-203c5.2-11.2 0.4-24.5-10.8-29.8-11.2-5.2-24.5-0.4-29.8 10.8l-68.6 147.2c-23.5-54.8-67.7-98.4-123-120.4 31.2-24.6 51.4-62.7 51.4-105.6 0-74.2-60.2-134.4-134.4-134.4s-134.4 60.2-134.4 134.4c0 42.9 20.1 80.9 51.4 105.6-75.2 30-130.4 99.5-139.7 182.9z m133-288.5c0-49.5 40.1-89.6 89.6-89.6s89.6 40.1 89.6 89.6c0 49.5-40.1 89.6-89.6 89.6s-89.6-40.1-89.6-89.6z" fill="#2c2c2c" ></path></symbol><symbol id="icon-xinzeng" viewBox="0 0 1024 1024"><path d="M937.6 243.2c12.4 0 22.4-10 22.4-22.4v-112c0-24.7-20.1-44.8-44.8-44.8H108.8C84.1 64 64 84.1 64 108.8v806.4c0 24.7 20.1 44.8 44.8 44.8h806.4c24.7 0 44.8-20.1 44.8-44.8V400c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v492.8c0 12.4-10 22.4-22.4 22.4H131.2c-12.4 0-22.4-10-22.4-22.4V131.2c0-12.4 10-22.4 22.4-22.4h761.6c12.4 0 22.4 10 22.4 22.4v89.6c0 12.4 10 22.4 22.4 22.4zM512 736c12.4 0 22.4-10 22.4-22.4V534.4h179.2c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H534.4V310.4c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v179.2H310.4c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h179.2v179.2c0 12.4 10 22.4 22.4 22.4z" fill="#2c2c2c" ></path></symbol><symbol id="icon-chaojitongji" viewBox="0 0 1024 1024"><path d="M713.6 825.6h156.8c12.4 0 22.4-10 22.4-22.4V220.8c0-12.4-10-22.4-22.4-22.4H713.6c-12.4 0-22.4 10-22.4 22.4v582.4c0 12.4 10 22.4 22.4 22.4zM736 243.2h112v537.6H736V243.2zM153.6 825.6h156.8c12.4 0 22.4-10 22.4-22.4V86.4c0-12.4-10-22.4-22.4-22.4H153.6c-12.4 0-22.4 10-22.4 22.4v716.8c0 12.4 10 22.4 22.4 22.4zM176 108.8h112v672H176v-672z m257.6 716.8h156.8c12.4 0 22.4-10 22.4-22.4v-448c0-12.4-10-22.4-22.4-22.4H433.6c-12.4 0-22.4 10-22.4 22.4v448c0 12.4 10 22.4 22.4 22.4z m22.4-448h112v403.2H456V377.6z m481.6 537.6H86.4c-12.4 0-22.4 10-22.4 22.4C64 950 74 960 86.4 960h851.2c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4z" fill="#2c2c2c" ></path></symbol><symbol id="icon-yuanogtongji" viewBox="0 0 1024 1024"><path d="M554.7 746.7c-11.8 0-21.3 9.6-21.3 21.3v170.7c0 11.8 9.6 21.3 21.3 21.3s21.3-9.6 21.3-21.3V768c0-11.8-9.6-21.3-21.3-21.3zM668.4 704c-11.8 0-21.3 9.6-21.3 21.3v213.3c0 11.8 9.6 21.3 21.3 21.3 11.8 0 21.3-9.6 21.3-21.3V725.3c0.1-11.7-9.5-21.3-21.3-21.3zM538.7 65.5c-141.6-15.6-261.4 94.8-261.4 233.2 0 90 50.7 168 125 207.4C231.9 553.9 106.7 710.2 106.7 896c0 15.5 1.1 30.7 2.9 45.7 1.3 10.5 10.5 18.3 21.1 18.3 12.5 0 22.6-10.8 21.1-23.3-1.6-13.4-2.5-26.9-2.5-40.7 0-200.3 162.4-362.7 362.7-362.7 138.4 0 248.8-119.8 233.2-261.4-11.9-107.3-99.1-194.6-206.5-206.4zM479.5 488c-79.6-13.1-143.8-77.2-156.8-156.8-21.6-131.4 90.4-243.4 221.8-221.8 79.6 13.1 143.8 77.2 156.8 156.8 21.6 131.3-90.4 243.4-221.8 221.8zM896 661.3c-11.8 0-21.3 9.6-21.3 21.3v256c0 11.8 9.6 21.3 21.3 21.3 11.8 0 21.3-9.6 21.3-21.3v-256c0-11.7-9.5-21.3-21.3-21.3zM782.2 576c-11.8 0-21.3 9.6-21.3 21.3v341.3c0 11.8 9.6 21.3 21.3 21.3 11.8 0 21.3-9.6 21.3-21.3V597.3c0.1-11.7-9.5-21.3-21.3-21.3z" fill="#2c2c2c" ></path></symbol><symbol id="icon-tuiguangtongji" viewBox="0 0 1024 1024"><path d="M896 234.7c11.8 0 21.3-9.6 21.3-21.3V106.7c0-23.5-19.2-42.7-42.7-42.7H149.3c-23.5 0-42.7 19.2-42.7 42.7v810.7c0 23.5 19.2 42.7 42.7 42.7h725.3c23.5 0 42.7-19.2 42.7-42.7V384c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3v512c0 11.8-9.6 21.3-21.3 21.3H170.7c-11.8 0-21.3-9.6-21.3-21.3V128c0-11.8 9.6-21.3 21.3-21.3h682.7c11.8 0 21.3 9.6 21.3 21.3v85.3c0 11.8 9.5 21.4 21.3 21.4zM725.3 576c0-11.7-9.6-21.3-21.3-21.3H320c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3h384c11.7 0 21.3-9.6 21.3-21.3zM320 704c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3h213.3c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3H320z m405-441c-8.3-8.3-21.8-8.3-30.2 0L561.4 396.5 455.8 290.9c-4.2-4.2-9.6-6.2-15.1-6.2s-11 2.1-15.1 6.2L304.9 411.6c-8.3 8.3-8.3 21.9 0 30.2s21.9 8.3 30.2 0l105.6-105.6 105.6 105.6v0.1c6.3 6.3 15.4 7.8 23.1 4.7 2.6-1 5-2.6 7.1-4.7v-0.1L725 293.2c8.3-8.3 8.3-21.8 0-30.2z" fill="#2c2c2c" ></path></symbol><symbol id="icon-yuangongtongji2" viewBox="0 0 1024 1024"><path d="M917.3 727.5c0-2.8-0.6-5.6-1.7-8.2-0.2-0.5-0.7-0.9-0.9-1.4-1-1.9-2-3.8-3.6-5.4-1.6-1.6-3.5-2.6-5.5-3.6-0.5-0.3-0.9-0.7-1.4-0.9-2.6-1.1-5.4-1.7-8.2-1.7H768c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3h76.5L684.9 908.5 549.3 772.8v-0.1c-4.2-4.2-9.6-6.2-15.1-6.2s-10.9 2.1-15.1 6.2v0.1L368.2 923.6c-8.3 8.3-8.3 21.9 0 30.2s21.9 8.3 30.2 0L534.1 818l135.4 135.4c0.1 0.1 0.1 0.2 0.2 0.3 4.2 4.2 9.7 6.2 15.1 6.2 5.5 0 11-2 15.1-6.2 0.1-0.1 0.1-0.2 0.2-0.3L874.7 779v76.5c0 11.7 9.6 21.3 21.3 21.3 11.7 0 21.3-9.6 21.3-21.3v-128zM512 533.3c86.3 0 165.5 30.3 227.7 80.6 3.7 3 8.3 4.7 13.1 4.7 20 0 28.9-25.3 13.4-37.9-42.1-34.1-91.2-59.8-144.7-74.8 81.6-43.2 134.8-132.9 123.7-234-11.9-107.3-99.1-194.6-206.5-206.4-141.6-15.6-261.4 94.8-261.4 233.2 0 90 50.7 168 125 207.4-9.9 2.8-19.6 6-29.3 9.5-1.3 0.5-2.6 0.9-3.8 1.4-9.3 3.5-18.5 7.3-27.4 11.5-1.1 0.5-2.1 1-3.2 1.5-36.8 17.5-70.5 40.3-100.2 67.5-2 1.9-4.1 3.7-6.1 5.6-5.7 5.4-11.1 11.1-16.5 16.8-2.8 3-5.6 6.1-8.3 9.2-4.8 5.4-9.4 10.9-13.9 16.6-3.1 3.9-6 7.9-8.9 11.9-3.9 5.4-7.9 10.7-11.6 16.3-3.5 5.4-6.8 11-10 16.5-4 6.7-7.8 13.5-11.4 20.4-4.1 8-8.1 16-11.7 24.3-1.9 4.4-3.5 8.9-5.2 13.3-2.8 7-5.4 14.1-7.8 21.3-1.5 4.7-2.9 9.4-4.3 14.2-2.1 7.3-4 14.8-5.7 22.3-1.1 4.7-2.1 9.4-3 14.1-1.6 8.3-2.8 16.6-3.8 25.1-0.5 4.1-1.2 8.2-1.6 12.3-1.2 12.6-1.9 25.4-1.9 38.3 0 15.5 1.1 30.7 2.9 45.7 1.3 10.5 10.5 18.3 21.1 18.3 12.5 0 22.6-10.8 21.1-23.3-1.6-13.4-2.5-26.9-2.5-40.7 0-200.3 162.4-362.7 362.7-362.7zM322.7 331.2c-21.6-131.4 90.4-243.4 221.8-221.8 79.6 13.1 143.8 77.2 156.8 156.8 21.6 131.4-90.4 243.4-221.8 221.9-79.6-13.2-143.8-77.3-156.8-156.9z" fill="#2c2c2c" ></path></symbol><symbol id="icon-shujutongji" viewBox="0 0 1024 1024"><path d="M256 682.7c0 11.7 9.6 21.3 21.3 21.3h469.3c11.7 0 21.3-9.6 21.3-21.3s-9.6-21.3-21.3-21.3H277.3c-11.7-0.1-21.3 9.5-21.3 21.3z m629.8-417.3c-3.9-5.9-10.7-9.4-17.8-9.4-17.1 0-26.8 18.9-17.4 33.2 50 75.7 75.3 169.1 64.3 268.8-20.7 187.8-173.4 338.6-361.4 357.3-256 25.4-469.4-187.7-444.8-443.5 17.9-185.7 165-337.8 350.1-361.6 111.5-14.3 215.2 17.1 295.9 77.6 3.7 2.7 8.1 4.3 12.6 4.3 20.5 0 29.5-26.3 13.1-38.6-87.2-65.4-199-99.8-319.1-86.6C253.9 89.7 87.5 257.5 66.4 465c-28.9 283.6 207 520.3 490.4 492.9 211.9-20.5 382.6-193.1 401.4-405.1 9.5-106.7-18.7-206.2-72.4-287.4zM341.3 576V405.3c0-11.7-9.6-21.3-21.3-21.3-11.7 0-21.3 9.6-21.3 21.3V576c0 11.7 9.6 21.3 21.3 21.3 11.7 0 21.3-9.6 21.3-21.3z m128 0V277.3c0-11.7-9.6-21.3-21.3-21.3-11.7 0-21.3 9.6-21.3 21.3V576c0 11.7 9.6 21.3 21.3 21.3 11.7 0 21.3-9.6 21.3-21.3z m256 0v-85.3c0-11.7-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3V576c0 11.7 9.6 21.3 21.3 21.3s21.3-9.6 21.3-21.3z m-128 0V362.7c0-11.7-9.6-21.3-21.3-21.3-11.7 0-21.3 9.6-21.3 21.3V576c0 11.7 9.6 21.3 21.3 21.3 11.7 0 21.3-9.6 21.3-21.3z" fill="#2c2c2c" ></path></symbol><symbol id="icon-shujudaoru" viewBox="0 0 1024 1024"><path d="M496.2 774.2c2.1 2.1 4.5 3.7 7.3 4.8 2.7 1.1 5.5 1.7 8.4 1.7h0.4c2.9 0 5.7-0.6 8.4-1.7s5.2-2.8 7.3-4.8l221.7-221.7c8.7-8.7 8.7-22.9 0-31.7-8.7-8.7-22.9-8.7-31.7 0L534.4 704.3V86.4c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v617.9L306.1 520.8c-8.7-8.7-22.9-8.7-31.7 0-8.7 8.7-8.7 22.9 0 31.7l221.8 221.7z m441.4-217.4c-12.4 0-22.4 10-22.4 22.4v336H108.8v-336c0-12.4-10-22.4-22.4-22.4S64 566.8 64 579.2v358.4C64 950 74 960 86.4 960h851.2c12.4 0 22.4-10 22.4-22.4V579.2c0-12.4-10-22.4-22.4-22.4z" fill="#2c2c2c" ></path></symbol><symbol id="icon-jixiao" viewBox="0 0 1024 1024"><path d="M533.3 448H298.7c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h234.7c11.8 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.4-21.3z m245.4 85.3C702.1 533.3 640 595.4 640 672c0 39.3 16.4 74.9 42.7 100.1v166.6c0 17.1 19 27.1 33.1 17.7l62.9-41.8 62.9 41.8c14.1 9.4 33.1-0.6 33.1-17.7V772.1c26.2-25.2 42.7-60.8 42.7-100.1-0.1-76.6-62.1-138.7-138.7-138.7zM832 906.7l-41.6-27.3c-7.3-4.5-16.2-4.5-23.5 0l-41.6 27.3V800c16.4 6.8 34.3 10.7 53.3 10.7s36.9-3.8 53.3-10.7v106.7z m28.2-184.1c-13 21.1-33.9 36.7-58.7 42.7-7.3 1.9-14.9 2.8-22.8 2.8s-15.6-0.9-22.8-2.8c-24.7-6-45.7-21.5-58.7-42.7-9.2-14.7-14.5-32-14.5-50.6 0-53.1 42.9-96 96-96s96 42.9 96 96c0 18.6-5.4 35.8-14.5 50.6zM874.7 64H149.3c-23.5 0-42.7 19.2-42.7 42.7v810.7c0 23.5 19.2 42.7 42.7 42.7h448v-42.7H170.7c-11.8 0-21.3-9.6-21.3-21.3V128c0-11.8 9.6-21.3 21.3-21.3h682.7c11.8 0 21.3 9.6 21.3 21.3v362.7h42.7v-384c-0.1-23.5-19.3-42.7-42.7-42.7zM533.3 597.3H298.7c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h234.7c11.8 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.4-21.3zM746.7 320c0-11.7-9.6-21.3-21.3-21.3H298.7c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3h426.7c11.7 0 21.3-9.6 21.3-21.3z" fill="#2c2c2c" ></path></symbol><symbol id="icon-yuancheng" viewBox="0 0 1024 1024"><path d="M853.3 874.7H170.7c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3h682.7c11.7 0 21.3-9.6 21.3-21.3s-9.6-21.3-21.4-21.3zM726.4 343.5c0-11.7-9.6-21.3-21.3-21.3H534.4c-2.8 0-5.6 0.6-8.2 1.7-0.5 0.2-0.9 0.7-1.4 0.9-1.9 1-3.8 2-5.4 3.6-1.6 1.6-2.6 3.5-3.6 5.5-0.3 0.5-0.7 0.9-0.9 1.4-1.1 2.6-1.7 5.4-1.7 8.2v170.7c0 11.7 9.6 21.3 21.3 21.3 11.7 0 21.3-9.6 21.3-21.3V395l174.7 174.7c8.3 8.3 21.9 8.3 30.2 0s8.3-21.9 0-30.2L585.9 364.9h119.2c11.7 0 21.3-9.6 21.3-21.4z m212.3-66.2c11.8 0 21.3-9.6 21.3-21.3V149.3c0-23.6-19.1-42.7-42.7-42.7H106.7c-23.6 0-42.7 19.1-42.7 42.7V704c0 23.6 19.1 42.7 42.7 42.7h810.7c23.6 0 42.7-19.1 42.7-42.7V426.7c0-11.8-9.6-21.3-21.3-21.3-11.8 0-21.3 9.6-21.3 21.3v256c0 11.8-9.6 21.3-21.3 21.3H128c-11.8 0-21.3-9.6-21.3-21.3v-512c0-11.8 9.6-21.3 21.3-21.3h768c11.8 0 21.3 9.6 21.3 21.3V256c0 11.8 9.6 21.3 21.4 21.3z" fill="#2c2c2c" ></path></symbol><symbol id="icon-shuji" viewBox="0 0 1024 1024"><path d="M896 234.7c11.8 0 21.3-9.6 21.3-21.3V106.7c0-23.6-19.1-42.7-42.7-42.7H149.3c-23.6 0-42.7 19.1-42.7 42.7v704h0.5c-0.3 3.5-0.5 7.1-0.5 10.7 0 76.6 62.1 138.7 138.7 138.7H896c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H249.5c-50.1 0-94.9-36.7-99.7-86.6-5.5-57.3 39.4-105.4 95.5-105.4H896c11.8 0 21.3-9.6 21.3-21.3V384c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3v298.7H245.3c-37.3 0-71.1 14.8-96 38.8V128c0-11.8 9.6-21.3 21.3-21.3h682.7c11.8 0 21.3 9.6 21.3 21.3v85.3c0.1 11.8 9.6 21.4 21.4 21.4z m0 565.3H256c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h640c11.8 0 21.3-9.6 21.3-21.3 0-11.7-9.5-21.3-21.3-21.3z" fill="#2c2c2c" ></path></symbol><symbol id="icon-zhishiku" viewBox="0 0 1024 1024"><path d="M405.3 320h-192c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3h192c11.7 0 21.3-9.6 21.3-21.3 0.1-11.7-9.5-21.3-21.3-21.3z m533.4 0c11.8 0 21.3-9.6 21.3-21.3V174.2c0-7.8-4.2-15.2-11.2-18.8-10.1-5.3-20.6-10.1-31.5-14.4-53.3-22-115.2-34.3-181.3-34.3-84.7 0-162.3 20.7-224 54.8-61.7-34.1-139.3-54.8-224-54.8-66.1 0-128 12.4-181.3 34.3-10.9 4.3-21.4 9.1-31.5 14.4-7 3.6-11.2 11-11.2 18.8v712.6c0 16.1 16.9 26 31.3 18.8 18.7-9.4 39-17.5 60.4-23.9 40.3-12.4 85.1-19.2 132.3-19.2 46.1 0 90.5 6.6 131.4 19.2 25.4 7.7 49.5 17.9 71.9 30.3 6.4 3.6 13.7 5.3 20.7 5.3s14.3-1.7 20.7-5.3c22.4-12.4 46.5-22.6 71.9-30.3 41-12.6 85.3-19.2 131.4-19.2 47.1 0 91.9 6.8 132.3 19.2 21.5 6.4 41.8 14.5 60.4 23.9 14.4 7.3 31.3-2.7 31.3-18.8V469.3c0-11.8-9.6-21.3-21.3-21.3-11.8 0-21.3 9.6-21.3 21.3v384.9c-53.3-22-115.2-34.3-181.3-34.3-84.7 0-162.3 20.7-224 54.8-61.7-34.1-139.3-54.8-224-54.8-66.1 0-128 12.4-181.3 34.3V187.1c51.6-23.9 113.9-37.8 181.3-37.8 74.7 0 144.9 17.1 203.3 49.5 6.4 3.6 13.7 5.3 20.7 5.3s14.3-1.7 20.7-5.3c58.5-32.4 128.6-49.5 203.3-49.5 67.4 0 129.7 13.9 181.3 37.8v111.6c-0.1 11.7 9.5 21.3 21.3 21.3z m-341.4-21.3c-11.8 0-21.3 9.6-21.3 21.3v341.3c0 15.9 16.7 26.2 30.9 19.1l97.1-48.6 97.1 48.6c14.2 7.1 30.9-3.2 30.9-19.1V320c0-11.8-9.6-21.3-21.3-21.3H597.3z m192 333.1l-75.8-37.9c-6-3-13.1-3-19.1 0l-75.8 37.9V341.3h170.7v290.5z m-384-13.1h-192c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3h192c11.7 0 21.3-9.6 21.3-21.3s-9.5-21.3-21.3-21.3z m0-149.4h-192c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3h192c11.7 0 21.3-9.6 21.3-21.3 0.1-11.7-9.5-21.3-21.3-21.3z" fill="#2c2c2c" ></path></symbol><symbol id="icon-pingfen" viewBox="0 0 1024 1024"><path d="M941.8 395.3L658 354.1l-21.5-43.5c-3.6-7.3-11-11.9-19.1-11.9-15.8 0-26.1 16.6-19.1 30.8l21.5 43.5c6.2 12.6 18.2 21.3 32.1 23.3l240.8 35-174.2 169.6c-10.1 9.8-14.7 23.9-12.3 37.8l41.1 239.6-215.5-113.2c-6.2-3.3-13-4.9-19.8-4.9-6.8 0-13.6 1.6-19.8 4.9L276.7 878.3l41.1-239.6c2.4-13.9-2.2-28-12.3-37.8L131.3 431.2l240.8-35c13.9-2 25.9-10.7 32.1-23.3l107.8-218 33.5 67.9c3.6 7.3 11 11.9 19.1 11.9 15.8 0 26.1-16.6 19.1-30.8L531.1 97.2c-3.9-7.9-11.5-11.8-19.1-11.8-7.6 0-15.2 3.9-19.1 11.8L366 354.1 82.2 395.3c-17.5 2.5-24.4 24-11.8 36.3l205.3 199.9-48.5 282.3c-2.4 13.7 8.6 24.9 21 24.9 3.3 0 6.6-0.8 9.9-2.5L512 802.9l253.8 133.3c3.3 1.7 6.6 2.5 9.9 2.5 12.4 0 23.3-11.2 21-24.9l-48.5-282.3 205.3-199.9c12.7-12.4 5.7-33.8-11.7-36.3zM579.7 593.7c8.3 8.3 21.9 8.3 30.2 0l90.5-90.5c8.3-8.3 8.3-21.9 0-30.2s-21.9-8.3-30.2 0l-90.5 90.5c-8.3 8.3-8.3 21.9 0 30.2z" fill="#000000" ></path></symbol><symbol id="icon-dingdan" viewBox="0 0 1024 1024"><path d="M725.3 490.7H448c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h277.3c11.8 0 21.3-9.6 21.3-21.3 0.1-11.8-9.5-21.3-21.3-21.3z m0-170.7H448c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h277.3c11.8 0 21.3-9.6 21.3-21.3 0.1-11.7-9.5-21.3-21.3-21.3zM896 234.7c11.8 0 21.3-9.6 21.3-21.3V106.7c0-23.6-19.1-42.7-42.7-42.7H149.3c-23.6 0-42.7 19.1-42.7 42.7v810.7c0 23.6 19.1 42.7 42.7 42.7H704c117.8 0 213.3-95.5 213.3-213.3V384c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3v341.3c0 106-86 192-192 192h-512c-11.8 0-21.3-9.6-21.3-21.3V128c0-11.8 9.6-21.3 21.3-21.3h682.7c11.8 0 21.3 9.6 21.3 21.3v85.3c0 11.8 9.5 21.4 21.3 21.4zM725.3 661.3H448c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h277.3c11.8 0 21.3-9.6 21.3-21.3 0.1-11.7-9.5-21.3-21.3-21.3zM341.3 320h-42.7c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h42.7c11.8 0 21.3-9.6 21.3-21.3 0.1-11.7-9.5-21.3-21.3-21.3z m0 341.3h-42.7c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h42.7c11.8 0 21.3-9.6 21.3-21.3 0.1-11.7-9.5-21.3-21.3-21.3z m0-170.6h-42.7c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h42.7c11.8 0 21.3-9.6 21.3-21.3 0.1-11.8-9.5-21.3-21.3-21.3z" fill="#2c2c2c" ></path></symbol><symbol id="icon-wentifankui" viewBox="0 0 1024 1024"><path d="M704 512H320c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h384c11.8 0 21.3-9.6 21.3-21.3 0-11.7-9.5-21.3-21.3-21.3z m0 170.7H320c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h384c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.5-21.3-21.3-21.3zM565.2 415.1l1 1c8 8 21.1 8 29.1 0l315.9-315.9c8-8 8-21.1 0-29.1l-1-1c-8-8-21.1-8-29.1 0L565.2 385.9c-8 8.1-8 21.1 0 29.2zM896 320c-11.8 0-21.3 9.6-21.3 21.3V896c0 11.8-9.6 21.3-21.3 21.3H170.7c-11.8 0-21.3-9.6-21.3-21.3V128c0-11.8 9.6-21.3 21.3-21.3H640c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H149.3c-23.6 0-42.7 19.1-42.7 42.7v810.7c0 23.6 19.1 42.7 42.7 42.7h725.3c23.6 0 42.7-19.1 42.7-42.7v-576c0-11.9-9.5-21.5-21.3-21.5z m-576 64h128c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H320c-11.8 0-21.3 9.6-21.3 21.3 0 11.7 9.5 21.3 21.3 21.3z" fill="#2c2c2c" ></path></symbol><symbol id="icon-zichan" viewBox="0 0 1024 1024"><path d="M576 512c0 47.1 38.2 85.3 85.3 85.3s85.3-38.2 85.3-85.3c0-47.1-38.2-85.3-85.3-85.3S576 464.9 576 512z m128 0c0 23.6-19.1 42.7-42.7 42.7s-42.7-19.1-42.7-42.7 19.1-42.7 42.7-42.7S704 488.4 704 512z m256-170.7v-192c0-23.6-19.1-42.7-42.7-42.7H106.7c-23.6 0-42.7 19.1-42.7 42.7v725.3c0 23.6 19.1 42.7 42.7 42.7h810.7c23.6 0 42.7-19.1 42.7-42.7V512c0-11.8-9.6-21.3-21.3-21.3-11.8 0-21.3 9.6-21.3 21.3v149.3H490.7V362.7h448c11.7 0 21.3-9.6 21.3-21.4zM917.3 320h-448c-11.8 0-21.3 9.6-21.3 21.3v341.3c0 11.8 9.6 21.3 21.3 21.3h448v149.3c0 11.8-9.6 21.3-21.3 21.3H128c-11.8 0-21.3-9.6-21.3-21.3V170.7c0-11.8 9.6-21.3 21.3-21.3h768c11.8 0 21.3 9.6 21.3 21.3V320z" fill="#2c2c2c" ></path></symbol><symbol id="icon-kai" viewBox="0 0 1024 1024"><path d="M937.6 243.3c12.4 0 22.4-10 22.4-22.4V108.8c0-24.7-20.1-44.8-44.8-44.8H108.8C84.1 64 64 84.1 64 108.8v806.4c0 24.7 20.1 44.8 44.8 44.8h806.4c24.7 0 44.8-20.1 44.8-44.8V400.1c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v492.7c0 12.4-10 22.4-22.4 22.4H131.2c-12.4 0-22.4-10-22.4-22.4V131.2c0-12.4 10-22.4 22.4-22.4h761.6c12.4 0 22.4 10 22.4 22.4v89.7c0 12.4 10 22.4 22.4 22.4z" fill="#2c2c2c" ></path><path d="M288 691.2c-12.3 0-22.4 10.1-22.4 22.4 0 12.3 10.1 22.4 22.4 22.4h448c12.3 0 22.4-10.1 22.4-22.4 0-12.3-10.1-22.4-22.4-22.4H288zM768.1 483.3V310.4c0-2.9-0.6-5.9-1.7-8.6-0.5-1.3-1.5-2.3-2.3-3.5-0.8-1.3-1.4-2.6-2.5-3.7s-2.5-1.6-3.7-2.5c-1.2-0.8-2.2-1.8-3.5-2.3-2.8-1.1-5.7-1.7-8.6-1.7H611.3c-12.3 0-22.4 10.1-22.4 22.4s10.1 22.4 22.4 22.4h80.3L531.8 492.6 420.9 381.7c-4.4-4.4-10.1-6.5-15.9-6.5-5.8 0-11.5 2.2-15.9 6.5L262.5 508.4c-8.7 8.7-8.7 23 0 31.7s23 8.7 31.7 0L405 429.2l111 110.9c4.4 4.4 10.1 6.5 15.8 6.5 5.7 0 11.5-2.2 15.8-6.5l175.6-175.6v118.8c0 12.4 10 22.4 22.4 22.4 12.4 0 22.5-10 22.5-22.4z" fill="#2c2c2c" ></path></symbol><symbol id="icon-xiangmuguanli" viewBox="0 0 1024 1024"><path d="M937.6 377.6c12.4 0 22.4-10 22.4-22.4v-112c0-24.7-20.1-44.8-44.8-44.8H512L413.4 80.1A44.77 44.77 0 0 0 379 64H108.8C84.1 64 64 84.1 64 108.8v806.4c0 24.7 20.1 44.8 44.8 44.8h806.4c24.7 0 44.8-20.1 44.8-44.8V534.4c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v358.4c0 12.4-10 22.4-22.4 22.4H131.2c-12.4 0-22.4-10-22.4-22.4V131.2c0-12.4 10-22.4 22.4-22.4h235.9c6.6 0 13 3 17.2 8.1l98.6 118.3c4.3 5.1 10.6 8.1 17.2 8.1h392.7c12.4 0 22.4 10 22.4 22.4v89.6c0 12.3 10 22.3 22.4 22.3z" fill="#2c2c2c" ></path><path d="M758.4 467.2H444.8c-12.3 0-22.4 10.1-22.4 22.4s10.1 22.4 22.4 22.4h313.6c12.3 0 22.4-10.1 22.4-22.4s-10.1-22.4-22.4-22.4zM332.8 467.2h-67.2c-12.3 0-22.4 10.1-22.4 22.4s10.1 22.4 22.4 22.4h67.2c12.3 0 22.4-10.1 22.4-22.4s-10.1-22.4-22.4-22.4zM758.4 646.4H444.8c-12.3 0-22.4 10.1-22.4 22.4 0 12.3 10.1 22.4 22.4 22.4h313.6c12.3 0 22.4-10.1 22.4-22.4 0-12.3-10.1-22.4-22.4-22.4zM332.8 646.4h-67.2c-12.3 0-22.4 10.1-22.4 22.4 0 12.3 10.1 22.4 22.4 22.4h67.2c12.3 0 22.4-10.1 22.4-22.4 0-12.3-10.1-22.4-22.4-22.4z" fill="#2c2c2c" ></path></symbol><symbol id="icon-gongzhonghao" viewBox="0 0 1024 1024"><path d="M947 480.6l-62.9-62.9c-4.2-4.2-9.8-6.5-15.7-6.5-19.8 0-29.7 23.9-15.7 37.9l47.2 47.2c8.7 8.7 8.7 22.7 0 31.4L797.4 630.2v145c0 12.3-9.9 22.2-22.2 22.2h-145L527.7 899.9c-8.7 8.7-22.7 8.7-31.4 0l-89.5-89.5-13-13h-145c-12.3 0-22.2-9.9-22.2-22.2v-145L124.1 527.7c-8.7-8.7-8.7-22.7 0-31.4l102.5-102.5v-145c0-12.3 9.9-22.2 22.2-22.2h145l102.5-102.5c8.7-8.7 22.7-8.7 31.4 0l89.5 89.5 13 13h145c12.3 0 22.2 9.9 22.2 22.2V277c0 12.3 9.9 22.2 22.2 22.2 12.3 0 22.2-9.9 22.2-22.2v-50.4c0-24.5-19.9-44.4-44.4-44.4H648.6L543.4 77c-17.3-17.3-45.5-17.3-62.8 0L375.4 182.2H226.6c-24.5 0-44.4 19.9-44.4 44.4v148.8L77 480.6c-17.3 17.3-17.3 45.5 0 62.8l105.2 105.2v148.8c0 24.5 19.9 44.4 44.4 44.4h148.8L480.6 947c17.3 17.3 45.5 17.3 62.8 0l105.2-105.2h148.8c24.5 0 44.4-19.9 44.4-44.4V648.6L947 543.4c17.3-17.3 17.3-45.5 0-62.8z m-276.6-95.3L464.5 591.2 353.6 480.3c-8.7-8.7-23-8.7-31.7 0s-8.7 23 0 31.7l126.7 126.7c4.4 4.4 10.1 6.5 15.8 6.5 5.7 0 11.5-2.2 15.8-6.5L702.1 417c8.7-8.7 8.7-23 0-31.7s-23-8.7-31.7 0z" fill="#2c2c2c" ></path></symbol><symbol id="icon-anquanshezhi" viewBox="0 0 1024 1024"><path d="M699.2 354.9L473 581.1 367.4 475.6c-8.3-8.3-21.8-8.3-30.2 0-8.3 8.3-8.3 21.8 0 30.2l120.5 120.5c0.1 0.1 0.1 0.2 0.2 0.2 4.2 4.2 9.7 6.3 15.1 6.2 5.5 0 10.9-2.1 15.1-6.2 0.1-0.1 0.1-0.2 0.2-0.2l241.1-241.1c8.3-8.3 8.3-21.8 0-30.2-8.3-8.4-21.8-8.4-30.2-0.1z" fill="#000000" ></path><path d="M896 448c-11.8 0-21.3 9.6-21.3 21.3v97.8c0.9 175.6-290 319.3-362.7 347.8-72.7-28.4-363.6-172.2-362.7-348V193.2c175.6-12.8 238.2-35.8 362.5-86.5H512.1c124.3 50.7 187 73.7 362.6 86.5v105.5c0 11.8 9.6 21.3 21.3 21.3 11.8 0 21.3-9.6 21.3-21.3V173.3c0-11.3-8.9-20.5-20.1-21.3-188.6-12.4-247-35.1-369-84.8C523 65 517.5 64 512 64s-11 1-16.2 3.1c-122 49.7-180.4 72.4-369 84.8-11.2 0.7-20.1 10-20.1 21.3v393.7C105.5 797.8 503.6 960 511.9 960c0.1 0 0.1 0 0.1-0.1 0 0 0 0.1 0.1 0.1 8.3 0 406.4-162.2 405.2-393.1v-97.6c0-11.7-9.5-21.3-21.3-21.3z" fill="#000000" ></path></symbol><symbol id="icon-fuwuzhongxin" viewBox="0 0 1024 1024"><path d="M880.7 184.1c-85.4-83.3-213.6-99.3-315.3-48.3l-0.6 0.3c-0.8 0.4-1.6 1-2.5 1.4-23.1 12-44.2 27.4-62.6 45.8l-4.6 4.6-13.4 13.4-150.3 150.4c-8.3 8.3-8.3 21.9 0 30.2s21.9 8.3 30.2 0l180.7-180.8c90.2-73.6 225.1-67.9 308.5 13.4 43 41.8 66.5 97.3 66.5 156.5 0 52.8-19.3 103.8-54.9 144.2-2.9 3.2-5.9 6.5-9.1 9.7l-2.4 2.4L512 857.9 173 527.3c-4.5-4.5-7.8-8.1-10.4-11.3l-0.8-0.8-0.5-0.8c-77.2-87.2-72.9-215.3 9.7-297.8l2.1-2.1c43-42.1 100.6-65.3 161.9-65.3 11.1 0 22.2 0.9 33.1 2.5 6.7 1 13.5-1.1 18.3-5.9 12.1-12.1 5.8-33.5-11.2-36.1-13.3-2-26.8-3-40.2-3-69.2-0.2-138.8 25.6-191.7 77.4l-2.4 2.4C42.4 285 38.6 440 129.2 542.7c4.4 5.3 9.1 10.3 14 15.2L512 917.3l368.7-359.4 2.9-2.9c4.1-4.1 7.7-8 11.3-12.2 43.4-49.2 65.2-110.7 65.2-172-0.1-67.5-26.5-135.3-79.4-186.7zM783.1 381l1.6 1.6c12 12 33.2 5.8 35.8-10.9 6-38.9-6-79.9-35.9-109.8-20.5-20.5-46.1-32.4-72.7-36-20-2.7-31.5 22.4-17.2 36.6 3.4 3.4 7.9 5.3 12.6 6 17.2 2.5 33.8 10.3 47.1 23.5 19.8 19.8 27.5 46.8 23.7 72.5-0.9 6.1 0.7 12.2 5 16.5z" fill="#000000" ></path></symbol><symbol id="icon-qiyefuwu" viewBox="0 0 1024 1024"><path d="M263.1 433.5c-8.3-8.3-21.9-8.3-30.2 0s-8.3 21.9 0 30.2l120.7 120.7c8.3 8.3 21.9 8.3 30.2 0s8.3-21.9 0-30.2L263.1 433.5z" fill="#000000" ></path><path d="M947.8 405.7l-118.2-118c-8.2-8.1-21.4-8.1-29.5 0-8.2 8.1-8.2 21.4 0 29.5l103.4 103.3c8.2 8.1 8.2 21.4 0 29.5L800 553.2l-14.8-14.8-14.8-14.8-14.7-14.6-132.9-132.8 14.8-14.8c8.2-8.1 8.2-21.4 0-29.5-8.2-8.1-21.4-8.1-29.5 0l-29.5 29.5c-32.6 32.6-85.5 32.6-118.2 0l44.3-44.3 14.8-14.8 14.8-14.8 7.4-7.4 7.4-7.4 29.5-29.5 59.1-59c8.2-8.1 21.4-8.1 29.5 0l29.5 29.5c8.2 8.1 21.4 8.1 29.5 0 8.2-8.1 8.2-21.4 0-29.5l-44.3-44.3c-16.3-16.3-42.8-16.3-59.1 0L548.9 214l-44.3 44.3L401.2 155c-16.3-16.3-42.8-16.3-59.1 0L76.2 420.5c-16.3 16.3-16.3 42.7 0 59L475 877.8c24.4 24.3 64.3 24.3 88.6 0 11.2-11.2 17.4-26 18.2-40.9 14.9-0.7 29.7-6.9 40.9-18.1 11.3-11.3 17.2-26 18-40.9h0.2c14.9-0.7 29.7-6.9 40.9-18.1 11.3-11.3 17.2-26 18-40.9h0.2c14.9-0.7 29.7-6.9 40.9-18.1 11.3-11.3 17.2-26 18-40.9h0.2c14.9-0.7 29.7-6.9 40.9-18.1 13-13 18.8-30.4 18-47.5l129.7-129.6c16.4-16.3 16.4-42.7 0.1-59zM770.5 612.2c-8.1 8.1-21.4 8.1-29.5 0l-14.8-14.8-14.8-14.8-14.8-14.6c-8.1-8.1-21.4-8.1-29.5 0-8.1 8.1-8.1 21.4 0 29.5l14.8 14.8 14.8 14.8 14.8 14.8c8.1 8.1 8.1 21.4 0 29.5-8.1 8.1-21.4 8.1-29.5 0l-14.8-14.8-14.8-14.8-14.8-14.8c-8.1-8.1-21.4-8.1-29.5 0-8.1 8.1-8.1 21.4 0 29.5l14.8 14.8 14.8 14.8 14.8 14.8c8.1 8.1 8.1 21.4 0 29.5-8.1 8.1-21.4 8.1-29.5 0l-15-14.9-14.8-14.8-14.7-14.7c-8.1-8.1-21.4-8.1-29.5 0-8.1 8.1-8.1 21.4 0 29.5l14.8 14.8 14.8 14.8 14.8 14.8c8.1 8.1 8.1 21.4 0 29.5-8.1 8.1-21.4 8.1-29.5 0l-14.8-14.8-14.8-14.8-14.9-14.8c-8.1-8.1-21.4-8.1-29.5 0-8.1 8.1-8.1 21.4 0 29.5l29.5 29.5 14.8 14.8c8.1 8.1 8.1 21.4 0 29.5-8.1 8.1-21.4 8.1-29.5 0L120.6 464.7c-8.2-8.1-8.2-21.4 0-29.5l236.3-236c8.2-8.1 21.4-8.1 29.5 0l88.6 88.5-44.2 44.3c-16.5 16.5-16 43.2 0.6 59.6 44 43.4 112.1 47.5 160.9 12.6 0.4 0.5 0.6 1.1 1 1.5l132.9 132.8 14.8 14.8 14.8 14.8 14.8 14.8c8 7.9 8 21.2-0.1 29.3z" fill="#000000" ></path></symbol><symbol id="icon-wangke" viewBox="0 0 1024 1024"><path d="M435.1 316.4c-6.2-3.9-13.3-6-20.4-6-7.3 0-14.5 2.2-20.5 6.9-10.1 7.9-16.7 20.1-16.7 33.6v322.7c0 12 5.1 22.9 13.4 30.8 6.5 6.2 15.1 9.3 23.7 9.3 7.3 0 14.7-2.2 21.1-6.5L695.3 532c8.4-5.7 13.4-15 13.4-24.9 0-10.2-5.3-19.8-14.1-25.4L435.1 316.4z m-12.7 345.7V361.4l229.2 146.1-229.2 154.6z" fill="#2c2c2c" ></path><path d="M937.6 243.2c12.4 0 22.4-10 22.4-22.4v-112c0-24.6-20.2-44.8-44.8-44.8H108.8C84.2 64 64 84.2 64 108.8v806.4c0 24.6 20.2 44.8 44.8 44.8h806.4c24.6 0 44.8-20.2 44.8-44.8V400c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v492.8c0 12.4-10 22.4-22.4 22.4H131.2c-12.4 0-22.4-10-22.4-22.4V131.2c0-12.4 10-22.4 22.4-22.4h761.6c12.4 0 22.4 10 22.4 22.4v89.6c0 12.4 10 22.4 22.4 22.4z" fill="#2c2c2c" ></path></symbol><symbol id="icon-shoufei" viewBox="0 0 1024 1024"><path d="M896 234.7c11.8 0 21.3-9.6 21.3-21.3V106.7c0-23.5-19.2-42.7-42.7-42.7H149.3c-23.5 0-42.7 19.2-42.7 42.7v810.7c0 23.5 19.2 42.7 42.7 42.7h725.3c23.5 0 42.7-19.2 42.7-42.7V384c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3v512c0 11.8-9.6 21.3-21.3 21.3H170.7c-11.8 0-21.3-9.6-21.3-21.3V128c0-11.8 9.6-21.3 21.3-21.3h682.7c11.8 0 21.3 9.6 21.3 21.3v85.3c0 11.8 9.5 21.4 21.3 21.4z m-236.5-21.4c-7.8 0-14.7 4.5-18.7 11.3C615 268.9 567 298.7 512 298.7s-103-29.8-128.8-74.1c-4-6.8-10.9-11.3-18.7-11.3-16.4 0-26.6 17.9-18.4 32.1 33.2 57.3 94.9 95.9 165.9 95.9s132.8-38.6 165.9-95.9c8.3-14.2-2-32.1-18.4-32.1z m-5.3 227.6c-8.3-8.3-21.9-8.3-30.2 0L512 553 399.9 440.9c-8.3-8.3-21.9-8.3-30.2 0s-8.3 21.9 0 30.2l83.6 83.6h-58.7c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3h96v64h-96c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3h96v85.3c0 11.7 9.6 21.3 21.3 21.3 11.7 0 21.3-9.6 21.3-21.3V704h96c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3h-96v-64h96c11.7 0 21.3-9.6 21.3-21.3s-9.6-21.3-21.3-21.3h-58.7l83.6-83.6c8.4-8.4 8.4-22 0.1-30.3z" fill="#2c2c2c" ></path></symbol><symbol id="icon-quanxianshezhi" viewBox="0 0 1024 1024"><path d="M512 704c11.7 0 21.3-9.6 21.3-21.3V531.4C593.8 521.2 640 468.7 640 405.3c0-70.7-57.3-128-128-128s-128 57.3-128 128c0 63.4 46.2 115.9 106.7 126.1v151.3c0 11.7 9.6 21.3 21.3 21.3z m-85.3-298.7c0-47.1 38.2-85.3 85.3-85.3s85.3 38.2 85.3 85.3c0 47.1-38.2 85.3-85.3 85.3s-85.3-38.1-85.3-85.3z" fill="#000000" ></path><path d="M896 448c-11.8 0-21.3 9.6-21.3 21.3v97.8c0.9 175.6-290 319.3-362.7 347.8-72.7-28.4-363.6-172.2-362.7-348V193.2c175.6-12.8 238.2-35.8 362.5-86.5H512.1c124.3 50.7 187 73.7 362.6 86.5v105.5c0 11.8 9.6 21.3 21.3 21.3 11.8 0 21.3-9.6 21.3-21.3V173.3c0-11.3-8.9-20.5-20.1-21.3-188.6-12.4-247-35.1-369-84.8C523 65 517.5 64 512 64s-11 1-16.2 3.1c-122 49.7-180.4 72.4-369 84.8-11.2 0.7-20.1 10-20.1 21.3v393.7C105.5 797.8 503.6 960 511.9 960c0.1 0 0.1 0 0.1-0.1 0 0 0 0.1 0.1 0.1 8.3 0 406.4-162.2 405.2-393.1v-97.6c0-11.7-9.5-21.3-21.3-21.3z" fill="#000000" ></path></symbol><symbol id="icon-tongjirili" viewBox="0 0 1024 1024"><path d="M355.2 243.2c12.3 0 22.4-10.1 22.4-22.4V86.4c0-12.3-10.1-22.4-22.4-22.4-12.3 0-22.4 10.1-22.4 22.4v134.4c0 12.3 10.1 22.4 22.4 22.4z m156.8 0c12.3 0 22.4-10.1 22.4-22.4V86.4c0-12.3-10.1-22.4-22.4-22.4-12.3 0-22.4 10.1-22.4 22.4v134.4c0 12.3 10.1 22.4 22.4 22.4z m156.8 0c12.3 0 22.4-10.1 22.4-22.4V86.4c0-12.3-10.1-22.4-22.4-22.4-12.3 0-22.4 10.1-22.4 22.4v134.4c0 12.3 10.1 22.4 22.4 22.4z m246.4-112H780.8c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h112c12.4 0 22.4 10 22.4 22.4v134.4H108.8V198.4c0-12.4 10-22.4 22.4-22.4h112c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H108.8C84.1 131.2 64 151.3 64 176v739.2c0 24.7 20.1 44.8 44.8 44.8h806.4c24.7 0 44.8-20.1 44.8-44.8V176c0-24.7-20.1-44.8-44.8-44.8z m0 761.6c0 12.4-10 22.4-22.4 22.4H131.2c-12.4 0-22.4-10-22.4-22.4V377.6h806.4v515.2z m-642.1-112c5.7 0 11.5-2.2 15.8-6.6l164.7-164.7 118.7 98.9c9 7.5 22.3 6.8 30.4-1.6L767 536.9c8.6-8.9 8.4-23.1-0.5-31.7-8.9-8.6-23.1-8.4-31.7 0.5L585 660.7 466.6 562c-8.9-7.4-22-6.8-30.2 1.4L257.2 742.6c-8.8 8.8-8.8 22.9 0 31.7 4.4 4.3 10.1 6.5 15.9 6.5z" fill="#2c2c2c" ></path></symbol><symbol id="icon-shoufeitongji" viewBox="0 0 1024 1024"><path d="M931.2 728.8l-60.8 27.4V400c0-12.4-10-22.4-22.4-22.4s-22.4 10-22.4 22.4v376.3L516.9 915.2l-4.9 2.2-313.6-141.1V131.2c0-12.3 10.1-22.4 22.4-22.4h582.4c12.3 0 22.4 10.1 22.4 22.4v89.6c0 12.4 10 22.4 22.4 22.4s22.4-10 22.4-22.4v-112c0-24.6-20.2-44.8-44.8-44.8H198.4c-24.6 0-44.8 20.2-44.8 44.8v647.4l-60.8-27.4c-13.5-6.1-28.8 3.8-28.8 18.6 0 8 4.7 15.3 12 18.6l77.6 34.9 44.8 20.2 209.2 94.1 95.2 42.8c2.9 1.3 6 2 9.2 2 3.1 0 6.3-0.7 9.2-2l95.2-42.8 209.2-94.1 44.8-20.2L948 766c7.3-3.3 12-10.6 12-18.6 0-14.8-15.3-24.7-28.8-18.6zM661.4 303c-8.7-8.7-23-8.7-31.7 0L512 420.6 394.3 303c-8.7-8.7-23-8.7-31.7 0s-8.7 23 0 31.7l87.8 87.8h-61.6c-12.3 0-22.4 10.1-22.4 22.4 0 12.3 10.1 22.4 22.4 22.4h100.8v67.2H388.8c-12.3 0-22.4 10.1-22.4 22.4 0 12.3 10.1 22.4 22.4 22.4h100.8v89.6c0 12.3 10.1 22.4 22.4 22.4 12.3 0 22.4-10.1 22.4-22.4v-89.6h100.8c12.3 0 22.4-10.1 22.4-22.4 0-12.3-10.1-22.4-22.4-22.4H534.4v-67.2h100.8c12.3 0 22.4-10.1 22.4-22.4 0-12.3-10.1-22.4-22.4-22.4h-61.6l87.8-87.8c8.7-8.8 8.7-23 0-31.7z" fill="#000000" ></path></symbol><symbol id="icon-bingtutongji" viewBox="0 0 1024 1024"><path d="M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448H512V64z m403 490.7c-21.4 203.5-194 362.7-403 362.7-223.5 0-405.3-181.8-405.3-405.3 0-209.1 159.2-381.6 362.7-403v445.7H915zM597.3 64v362.7H960C960 226.4 797.6 64 597.3 64zM640 384V109.5C782.4 128.6 895.4 241.6 914.5 384H640z" fill="#2c2c2c" ></path></symbol><symbol id="icon-zhuzhuangtongji" viewBox="0 0 1024 1024"><path d="M736 265.6V400c0 12.4 10 22.4 22.4 22.4 12.4 0 22.4-10 22.4-22.4V265.6c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4z m-164.3 0v313.6c0 12.4 10 22.4 22.4 22.4 12.4 0 22.4-10 22.4-22.4V265.6c0-12.4-10-22.4-22.4-22.4-12.3 0-22.4 10-22.4 22.4z m365.9-22.4c12.4 0 22.4-10 22.4-22.4v-112c0-24.6-20.2-44.8-44.8-44.8H108.8C84.2 64 64 84.2 64 108.8v806.4c0 24.6 20.2 44.8 44.8 44.8h806.4c24.6 0 44.8-20.2 44.8-44.8V400c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v492.8c0 12.4-10 22.4-22.4 22.4H131.2c-12.4 0-22.4-10-22.4-22.4V131.2c0-12.4 10-22.4 22.4-22.4h761.6c12.4 0 22.4 10 22.4 22.4v89.6c0 12.4 10 22.4 22.4 22.4z m-694.4 22.4v492.8c0 12.3 10.1 22.4 22.4 22.4s22.4-10.1 22.4-22.4V265.6c0-12.3-10.1-22.4-22.4-22.4s-22.4 10.1-22.4 22.4z m164.3 0v224c0 12.4 10 22.4 22.4 22.4 12.4 0 22.4-10 22.4-22.4v-224c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4z" fill="#2c2c2c" ></path></symbol><symbol id="icon-youxuliebiao" viewBox="0 0 1024 1024"><path d="M469.3 746.7h277.3V704H469.3v42.7zM746.7 576H469.3v42.7h277.3V576zM896 234.7c11.8 0 21.3-9.6 21.3-21.3V106.7c0-23.6-19.1-42.7-42.7-42.7H149.3c-23.6 0-42.7 19.1-42.7 42.7v810.7c0 23.6 19.1 42.7 42.7 42.7h725.3c23.6 0 42.7-19.1 42.7-42.7V384c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3v512c0 11.8-9.6 21.3-21.3 21.3H170.7c-11.8 0-21.3-9.6-21.3-21.3V128c0-11.8 9.6-21.3 21.3-21.3h682.7c11.8 0 21.3 9.6 21.3 21.3v85.3c0 11.8 9.5 21.4 21.3 21.4zM746.7 405.3H469.3V448h277.3v-42.7z m-341.4 21.4h-42.7V256h-85.3v42.7H320v128h-42.7v42.7h128v-42.7z m-42.6 170.6V640h42.7v-85.3h-128V640H320v-42.7h42.7z m0 42.7H320v42.7h42.7V640z m384-362.7H469.3V320h277.3v-42.7zM277.3 682.7V768h128v-42.7H320v-42.7h-42.7z" fill="#2c2c2c" ></path></symbol><symbol id="icon-huoyuedu" viewBox="0 0 1024 1024"><path d="M847.3 564.4H744.9L682.1 410c-3.4-8.4-11.7-13.7-20.7-13.3-9 0.4-16.8 6.4-19.5 15l-61.3 199.1-97.4-240.3c-3.4-8.3-11.8-14-20.6-13.3-9 0.4-16.8 6.3-19.5 14.9l-66.4 211.6-44.7-73.2c-3.5-5.7-9.5-9.5-16.2-10.1-6.7-0.6-13.3 2-17.8 7l-51.5 57h-69.8c-11.8 0-21.3 9.5-21.3 21.3s9.5 21.3 21.3 21.3H256c6 0 11.8-2.6 15.8-7l38.7-42.8 54.3 88.9c4.4 7.2 12.6 11.3 20.8 10 8.3-1 15.3-6.8 17.8-14.8l62.7-199.7 97.6 240.8c3.3 8.1 11.1 13.3 19.8 13.3h0.9c9-0.4 16.8-6.4 19.5-15l61.3-199.2 45.7 112.2c3.3 8 11.1 13.3 19.8 13.3h116.7c11.8 0 21.3-9.5 21.3-21.3-0.1-11.8-9.6-21.3-21.4-21.3z m-121.9 96.9c-5.7 0-11.1 2.3-15.1 6.3L512 866 313.7 667.6c-4-4-9.4-6.3-15.1-6.3-19 0-28.5 23-15.1 36.4l213 213.2c4.3 4.3 9.9 6.4 15.5 6.4s11.2-2.1 15.5-6.4l213-213.2c13.4-13.4 3.9-36.4-15.1-36.4z m157.8-477.7c-51.3-51.3-118.4-76.9-185.6-76.9-67.2 0-134.3 25.6-185.6 76.9-51.3-51.3-118.4-76.9-185.6-76.9s-134.3 25.6-185.6 76.9C54.7 269.7 41 400.8 99.6 501.3c3.9 6.7 11.3 10.7 19.1 10.7 16.6 0 27.5-17.8 19.3-32.3-45.9-81.5-39.8-186.1 25.4-258 47.4-52.2 115-78.3 185.7-71.2 52.2 5.2 100.3 30.9 137.5 68.1l10.3 10.3c8.3 8.3 21.9 8.3 30.2 0L538 218c36.5-36.5 83.8-61.8 135.1-67.3 70.4-7.6 137.8 17.7 185.4 68.8 66.9 71.8 73.7 177.7 27.4 260.2-8.1 14.5 2.8 32.3 19.4 32.3 7.8 0 15.2-4 19.1-10.7 58.6-100.5 44.9-231.6-41.2-317.7z" fill="#2c2c2c" ></path></symbol><symbol id="icon-baoming" viewBox="0 0 1024 1024"><path d="M361.9 467.1c0-14.1-8.7-26.6-21.8-31.9-72.7-29.8-120.5-108.2-102.3-194.7 13.7-65 62.5-114.7 127.3-129.3 65.7-14.8 126.9 8.6 166.2 52.2 4.1 4.6 9.8 7.4 16 7.4 18.2 0 28.5-21.6 16.4-35.2-48.6-54.5-124.6-84-206.5-66.4C271.4 87.6 208 155.4 194.1 242c-15.4 96.1 33.4 182.6 110.3 223.6-108.9 38.9-188.8 138.9-197.6 258.9-0.9 11.9 8.3 22.1 20.2 22.1h2.2c10.9 0 19.4-8.6 20.2-19.4 8.2-109 85.1-199 187.4-227.1 14.8-4.1 25.1-17.6 25.1-33zM896 810.7h-85.3v-85.3c0-11.7-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3v85.3h-85.3c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3H768v85.3c0 11.7 9.6 21.3 21.3 21.3s21.3-9.6 21.3-21.3v-85.3H896c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3z m-46.5-321.8C876.7 343 755 217 610.1 236.7c-97 13.2-173.8 94-182.5 191.5-8.1 89.8 39.5 169.3 112.2 208.1C431.2 675 351.5 774.5 342.2 894c-1 12.5 8.7 23.4 21.3 23.4 10.9 0 20.4-8.2 21.2-19.1 9.7-130.5 117.6-234.1 249.9-236.8 103.5-2.3 196-70.8 214.9-172.6z m-176 126.6c-120 22.9-223.9-80.9-200.9-200.9 12.8-67.1 66.9-121.2 134-134 120-22.9 223.8 80.9 200.9 200.9-12.8 67-67 121.1-134 134z" fill="#2c2c2c" ></path></symbol><symbol id="icon-luyong" viewBox="0 0 1024 1024"><path d="M576.3 437.5c-8.7-8.7-22.9-8.7-31.7 0-8.7 8.7-8.7 22.9 0 31.7l47.5 47.5c4.4 4.4 10.1 6.6 15.9 6.6 5.8 0 11.5-2.2 15.9-6.5l79.2-79.2c8.7-8.7 8.7-23 0-31.7s-23-8.7-31.7 0L608 469.2l-31.7-31.7z" fill="#2c2c2c" ></path><path d="M915.2 758.4v134.4c0 12.4-10 22.4-22.4 22.4H131.2c-12.4 0-22.4-10-22.4-22.4V494.6c0-8.9 9.9-14.2 17.3-9.4l72.3 47 44.8 29.1 256.6 166.8c7.4 4.8 17 4.8 24.4 0l256.6-166.8 44.8-29.1 72.3-47c7.5-4.8 17.3 0.5 17.3 9.4v84.6c0 12.4 10 22.4 22.4 22.4 12.4 0 22.4-10 22.4-22.4v-96.6c0-35.5-39.4-56.9-69.2-37.6l-65.2 42.4V108.8c0-24.7-20.1-44.8-44.8-44.8H243.2c-24.7 0-44.8 20.1-44.8 44.8v378.6L133.2 445c-29.8-19.4-69.2 2-69.2 37.6v432.6c0 24.7 20.1 44.8 44.8 44.8h806.4c24.7 0 44.8-20.1 44.8-44.8V758.4c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4z m-672-627.2c0-12.4 10-22.4 22.4-22.4h492.8c12.4 0 22.4 10 22.4 22.4v385.3L512 691.2 243.2 516.5V131.2z" fill="#2c2c2c" ></path><path d="M620 288c0-61.9-50.1-112-112-112s-112 50.1-112 112c0 33.7 15.2 63.5 38.6 84-48.7 23.7-84.3 70.2-92.7 125.7-2 13.4 8.8 25.5 22.3 25.5 11.1 0 20.3-8.1 22-19.1 9.2-59 60.2-104.1 121.7-104.1 62 0 112.1-50.1 112.1-112z m-112 67.2c-37.1 0-67.2-30.1-67.2-67.2s30.1-67.2 67.2-67.2 67.2 30.1 67.2 67.2-30.1 67.2-67.2 67.2z" fill="#2c2c2c" ></path></symbol><symbol id="icon-zhuce" viewBox="0 0 1024 1024"><path d="M752.9 618.7c20 0 29-25.3 13.4-37.9-42-34-91-59.7-144.5-74.8 74.3-39.4 124.9-117.4 124.9-207.3C746.7 169.1 641.6 64 512 64S277.3 169.1 277.3 298.7c0 90 50.7 168 125 207.4C231.9 553.9 106.7 710.2 106.7 896c0 15.5 1.1 30.7 2.9 45.7 1.3 10.5 10.5 18.3 21.1 18.3 12.5 0 22.6-10.8 21.1-23.3-1.6-13.4-2.5-26.9-2.5-40.7 0-200.3 162.4-362.7 362.7-362.7 86.3 0 165.5 30.3 227.7 80.6 3.8 3.1 8.4 4.8 13.2 4.8zM320 298.7c0-106 86-192 192-192s192 86 192 192-86 192-192 192-192-86-192-192z m576 512h-85.3v-85.3c0-11.7-9.6-21.3-21.3-21.3-11.7 0-21.3 9.6-21.3 21.3v85.3h-85.3c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3H768v85.3c0 11.7 9.6 21.3 21.3 21.3 11.7 0 21.3-9.6 21.3-21.3v-85.3H896c11.7 0 21.3-9.6 21.3-21.3s-9.6-21.3-21.3-21.3z" fill="#2c2c2c" ></path></symbol><symbol id="icon-yuangong" viewBox="0 0 1024 1024"><path d="M621.6 506.1c50.2-26.6 89.5-70.6 109.7-124.2 5.3-13.4 9.2-27.3 11.7-41.6 0-0.6 0.2-1.1 0.2-1.7 2.1-12.6 3.4-25.6 3.4-38.6v-1.3C746.7 169 641.7 64 512 64c-107.1 0-197.1 71.5-225.5 169.4-3.8 13.4-6.6 27.3-7.9 41.6-0.9 7.9-1.3 15.8-1.3 23.7 0 6.4 0.2 12.6 0.9 18.8 1.1 16.4 4.1 32.4 8.7 47.6 18 61.1 60.1 111.8 115.3 141.1C231.8 554 106.7 710.2 106.7 896c0 15.5 1.1 30.7 2.9 45.7 1.3 10.5 10.5 18.3 21.1 18.3 12.5 0 22.6-10.8 21.1-23.3-1.6-13.4-2.5-26.9-2.5-40.7 0-200.3 162.4-362.7 362.7-362.7S874.7 695.7 874.7 896c0 13.8-0.9 27.4-2.5 40.7-1.5 12.5 8.6 23.3 21.1 23.3 10.6 0 19.8-7.8 21.1-18.3 1.8-15 2.9-30.2 2.9-45.7 0-185.8-125.1-342-295.7-389.9zM512 106.7c106 0 192 86 192 192v0.6c-56.1-7.3-98.6-76.2-99-77-3.6-6-9.6-9.8-16.4-10.2-6.8-0.6-13.4 1.9-17.9 7-41.8 47.8-87 72.7-134.4 74.5-48 1.9-88.5-20.3-111.8-36.7 19.2-86 95.8-150.2 187.5-150.2zM334.7 372.1c-6-13.9-10-28.6-12.6-43.9-1.1-7.7-1.7-15.6-1.9-23.5 27.5 16.2 66.1 31.8 110.7 31.8 2.1 0 4.3 0 6.4-0.2 52.5-1.7 102-25 147-69.3 21.1 26.7 62.1 68.7 114.8 74.9-2.6 11.1-6 22-10.7 32.2-29 68.7-97.1 116.7-176.4 116.7-80-0.1-148.7-49-177.3-118.7z" fill="#2c2c2c" ></path></symbol><symbol id="icon-huamingce" viewBox="0 0 1024 1024"><path d="M277.3 661.3c0-11.7-9.6-21.3-21.3-21.3H128c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3h128c11.7 0.1 21.3-9.5 21.3-21.3zM128 384h128c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3H128c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3z m0 149.3h128c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3H128c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3zM874.7 64H213.3c-23.6 0-42.7 19.1-42.7 42.7v106.7c0 11.8 9.6 21.3 21.3 21.3s21.3-9.6 21.3-21.3V128c0-11.8 9.6-21.3 21.3-21.3h618.7c11.8 0 21.3 9.6 21.3 21.3v768c0 11.8-9.6 21.3-21.3 21.3H234.7c-11.8 0-21.3-9.6-21.3-21.3v-85.3c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3v106.7c0 23.6 19.1 42.7 42.7 42.7h661.3c23.6 0 42.7-19.1 42.7-42.7V106.7c-0.2-23.6-19.3-42.7-42.8-42.7zM363 700.2c-4.1 12.3 5.3 25.1 18.3 25.1h4.8c8.4 0 15.5-5.6 18.3-13.6 23.2-66.6 86.4-114.4 161-114.4s137.7 47.8 161 114.4c2.8 7.9 9.9 13.6 18.3 13.6h4.8c13 0 22.4-12.8 18.3-25.1-19.4-57.9-62.9-104.7-118.7-128.5 39.6-26.9 65.7-72.2 65.7-123.7 0-82.5-66.9-149.3-149.3-149.3S416 365.5 416 448c0 51.5 26.1 96.9 65.7 123.7-55.7 23.8-99.3 70.6-118.7 128.5zM458.7 448c0-58.9 47.8-106.7 106.7-106.7S672 389.1 672 448s-47.8 106.7-106.7 106.7S458.7 506.9 458.7 448z" fill="#2c2c2c" ></path></symbol><symbol id="icon-fenleiguanli" viewBox="0 0 1024 1024"><path d="M752.8 545.6H545.6v207.2c0 114.4 92.8 207.2 207.2 207.2S960 867.2 960 752.8s-92.8-207.2-207.2-207.2z m0 369.6c-89.5 0-162.4-72.9-162.4-162.4V590.4h162.4c89.5 0 162.4 72.9 162.4 162.4s-72.9 162.4-162.4 162.4z m207.2-644C960 156.8 867.2 64 752.8 64s-207.2 92.8-207.2 207.2v207.2h207.2c114.4 0 207.2-92.8 207.2-207.2z m-369.6 0c0-89.5 72.9-162.4 162.4-162.4s162.4 72.9 162.4 162.4-72.9 162.4-162.4 162.4H590.4V271.2zM64.4 739c-7.8 120.7 87.8 221 206.8 221 72.5 0 136.3-37.3 173.3-93.7 9.9-15-0.6-35.1-18.6-35.1-7.8 0-14.8 4.2-19.1 10.7-34.1 51.7-96.9 82.9-165.5 70.6C176.9 901 124.6 849.6 112 785.4c-20.3-103.8 59-195 159.2-195h162.4v56c0 12.4 10 22.4 22.4 22.4 12.4 0 22.4-10 22.4-22.4V545.6H278.3c-110.4 0-206.7 83.3-213.9 193.4zM271.2 64C156.8 64 64 156.8 64 271.2s92.8 207.2 207.2 207.2h207.2V271.2C478.4 156.8 385.6 64 271.2 64z m162.4 369.6H271.2c-89.5 0-162.4-72.9-162.4-162.4s72.9-162.4 162.4-162.4 162.4 72.9 162.4 162.4v162.4z m22.4 280c-12.4 0-22.4 10-22.4 22.4v16.8c0 6.5-0.4 12.9-1.2 19.2-1.7 13.6 8.4 25.6 22 25.6 11.4 0 21-8.5 22.4-19.8 1-8.2 1.6-16.5 1.6-25V736c0-12.4-10-22.4-22.4-22.4z" fill="#2c2c2c" ></path></symbol><symbol id="icon-dangan" viewBox="0 0 1024 1024"><path d="M277.3 576h341.3c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3H277.3c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3zM896 234.7c11.8 0 21.3-9.6 21.3-21.3V106.7c0-23.5-19.2-42.7-42.7-42.7H149.3c-23.5 0-42.7 19.2-42.7 42.7v810.7c0 23.5 19.2 42.7 42.7 42.7h725.3c23.5 0 42.7-19.2 42.7-42.7V384c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3v512c0 11.8-9.6 21.3-21.3 21.3H170.7c-11.8 0-21.3-9.6-21.3-21.3V128c0-11.8 9.6-21.3 21.3-21.3h682.7c11.8 0 21.3 9.6 21.3 21.3v85.3c0 11.8 9.5 21.4 21.3 21.4z m-618.7 512h469.3c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3H277.3c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3zM576 341.3c0-35.3-28.7-64-64-64s-64 28.7-64 64 28.7 64 64 64 64-28.6 64-64z m-85.3 0c0-11.8 9.6-21.3 21.3-21.3 11.8 0 21.3 9.6 21.3 21.3 0 11.8-9.6 21.3-21.3 21.3-11.8 0.1-21.3-9.5-21.3-21.3z m213.3-64c-35.3 0-64 28.7-64 64s28.7 64 64 64 64-28.7 64-64-28.7-64-64-64z m0 85.4c-11.8 0-21.3-9.6-21.3-21.3 0-11.8 9.6-21.3 21.3-21.3s21.3 9.6 21.3 21.3c0 11.7-9.5 21.3-21.3 21.3z m-384 42.6c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64z m0-85.3c11.8 0 21.3 9.6 21.3 21.3 0 11.8-9.6 21.3-21.3 21.3s-21.3-9.6-21.3-21.3c0-11.7 9.5-21.3 21.3-21.3z" fill="#2c2c2c" ></path></symbol><symbol id="icon-fenlei" viewBox="0 0 1024 1024"><path d="M917.3 693.3H106.7C83.1 693.3 64 712.4 64 736v138.7c0 23.6 19.1 42.7 42.7 42.7h810.7c23.6 0 42.7-19.1 42.7-42.7V736c-0.1-23.6-19.2-42.7-42.8-42.7z m0 160c0 11.8-9.6 21.3-21.3 21.3H128c-11.8 0-21.3-9.6-21.3-21.3v-96c0-11.8 9.6-21.3 21.3-21.3h768c11.8 0 21.3 9.6 21.3 21.3v96z m42.7-432c0-11.8-9.6-21.3-21.3-21.3h-832C83.1 400 64 419.1 64 442.7v138.7c0 23.6 19.1 42.7 42.7 42.7h832c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H128c-11.8 0-21.3-9.6-21.3-21.3v-96c0-11.8 9.6-21.3 21.3-21.3h810.7c11.7-0.2 21.3-9.8 21.3-21.6zM842.7 778.7h-32c-5.9 0-10.7 4.8-10.7 10.7v32c0 5.9 4.8 10.7 10.7 10.7h32c5.9 0 10.7-4.8 10.7-10.7v-32c-0.1-6-4.8-10.7-10.7-10.7z m74.6-672H106.7c-23.6 0-42.7 19.1-42.7 42.7V288c0 23.6 19.1 42.7 42.7 42.7h810.7c23.6 0 42.7-19.1 42.7-42.7V149.3c-0.1-23.5-19.2-42.6-42.8-42.6z m0 160c0 11.8-9.6 21.3-21.3 21.3H128c-11.8 0-21.3-9.6-21.3-21.3v-96c0-11.8 9.6-21.3 21.3-21.3h768c11.8 0 21.3 9.6 21.3 21.3v96z m-736 218.6c-5.9 0-10.7 4.8-10.7 10.7v32c0 5.9 4.8 10.7 10.7 10.7h32c5.9 0 10.7-4.8 10.7-10.7v-32c0-5.9-4.8-10.7-10.7-10.7h-32zM842.7 192h-32c-5.9 0-10.7 4.8-10.7 10.7v32c0 5.9 4.8 10.7 10.7 10.7h32c5.9 0 10.7-4.8 10.7-10.7v-32c-0.1-5.9-4.8-10.7-10.7-10.7z" fill="#2c2c2c" ></path></symbol><symbol id="icon-tongzhi" viewBox="0 0 1024 1024"><path d="M789.3 554.7h-192c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3h192c11.7 0 21.3-9.6 21.3-21.3s-9.5-21.3-21.3-21.3z m149.4-277.4c11.8 0 21.3-9.6 21.3-21.3V149.3c0-23.6-19.1-42.7-42.7-42.7H106.7c-23.6 0-42.7 19.1-42.7 42.7V704c0 23.6 19.1 42.7 42.7 42.7h282.6L475 895.9c8.2 14.3 22.6 21.4 37 21.4s28.8-7.1 37-21.4l85.7-149.3h282.6c23.6 0 42.7-19.1 42.7-42.7V426.7c0-11.8-9.6-21.3-21.3-21.3-11.8 0-21.3 9.6-21.3 21.3v256c0 11.8-9.6 21.3-21.3 21.3H634.7c-15.3 0-29.4 8.2-37 21.4L512 874.7l-85.7-149.3c-7.6-13.2-21.7-21.4-37-21.4H128c-11.8 0-21.3-9.6-21.3-21.3v-512c0-11.8 9.6-21.3 21.3-21.3h768c11.8 0 21.3 9.6 21.3 21.3V256c0 11.8 9.6 21.3 21.4 21.3zM789.3 256H384c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3h405.3c11.7 0 21.3-9.6 21.3-21.3 0.1-11.7-9.5-21.3-21.3-21.3z m0 149.3H490.7c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3h298.7c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.4-21.3zM256 234.7c-23.6 0-42.7 19.1-42.7 42.7s19.1 42.7 42.7 42.7 42.7-19.1 42.7-42.7-19.1-42.7-42.7-42.7z m0 149.3c-23.6 0-42.7 19.1-42.7 42.7s19.1 42.7 42.7 42.7 42.7-19.1 42.7-42.7S279.6 384 256 384z m0 149.3c-23.6 0-42.7 19.1-42.7 42.7s19.1 42.7 42.7 42.7 42.7-19.1 42.7-42.7-19.1-42.7-42.7-42.7z" fill="#2c2c2c" ></path></symbol><symbol id="icon-jihua" viewBox="0 0 1024 1024"><path d="M937.6 243.2c12.4 0 22.4-10 22.4-22.4v-112c0-24.7-20.1-44.8-44.8-44.8H108.8C84.1 64 64 84.1 64 108.8v806.4c0 24.7 20.1 44.8 44.8 44.8h806.4c24.7 0 44.8-20.1 44.8-44.8V400c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v492.8c0 12.4-10 22.4-22.4 22.4H131.2c-12.4 0-22.4-10-22.4-22.4V131.2c0-12.4 10-22.4 22.4-22.4h761.6c12.4 0 22.4 10 22.4 22.4v89.6c0 12.4 10 22.4 22.4 22.4zM736 556.8H288c-12.3 0-22.4 10.1-22.4 22.4 0 12.3 10.1 22.4 22.4 22.4h448c12.3 0 22.4-10.1 22.4-22.4 0-12.3-10.1-22.4-22.4-22.4z m0-179.2H621.7c-10.5-51-55.8-89.6-109.7-89.6s-99.3 38.6-109.7 89.6H288c-12.3 0-22.4 10.1-22.4 22.4s10.1 22.4 22.4 22.4h156.8V400c0-37.1 30.1-67.2 67.2-67.2s67.2 30.1 67.2 67.2v22.4H736c12.3 0 22.4-10.1 22.4-22.4s-10.1-22.4-22.4-22.4z m0 336H288c-12.3 0-22.4 10.1-22.4 22.4s10.1 22.4 22.4 22.4h448c12.3 0 22.4-10.1 22.4-22.4s-10.1-22.4-22.4-22.4z" fill="#2c2c2c" ></path></symbol><symbol id="icon-wancheng" viewBox="0 0 1024 1024"><path d="M896 234.7c11.8 0 21.3-9.6 21.3-21.3V106.7c0-23.6-19.1-42.7-42.7-42.7H149.3c-23.6 0-42.7 19.1-42.7 42.7v746.7c0 58.7 48 106.7 106.7 106.7H896c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H215.9c-31 0-59.4-20.9-65.3-51.2-7.9-40.9 23.3-76.8 62.8-76.8H896c11.8 0 21.3-9.6 21.3-21.3V384c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3v362.7H213.3c-24.1 0-46.1 8.4-64 22V128c0-11.8 9.6-21.3 21.3-21.3h682.7c11.8 0 21.3 9.6 21.3 21.3v85.3c0.1 11.8 9.6 21.4 21.4 21.4zM684.2 306L488.1 502.1 382.5 396.5c-8.3-8.3-21.8-8.3-30.2 0-8.3 8.3-8.3 21.8 0 30.2L473 547.3h0.1c2.1 2 4.4 3.6 7 4.6 0.3 0.1 0.7 0.1 1 0.2 2.3 0.8 4.6 1.4 7 1.4 5.5 0 11-2.1 15.1-6.2l211.2-211.2c8.3-8.3 8.3-21.9 0-30.2-8.3-8.2-21.9-8.2-30.2 0.1z" fill="#2c2c2c" ></path></symbol><symbol id="icon-xueshengchengji" viewBox="0 0 1024 1024"><path d="M758.4 601.6H265.6c-12.3 0-22.4 10.1-22.4 22.4s10.1 22.4 22.4 22.4h492.8c12.3 0 22.4-10.1 22.4-22.4s-10.1-22.4-22.4-22.4z m179.2-358.4c12.4 0 22.4-10 22.4-22.4v-112c0-24.7-20.1-44.8-44.8-44.8H108.8C84.1 64 64 84.1 64 108.8v806.4c0 24.7 20.1 44.8 44.8 44.8h806.4c24.7 0 44.8-20.1 44.8-44.8V400c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v492.8c0 12.4-10 22.4-22.4 22.4H131.2c-12.4 0-22.4-10-22.4-22.4V131.2c0-12.4 10-22.4 22.4-22.4h761.6c12.4 0 22.4 10 22.4 22.4v89.6c0 12.4 10 22.4 22.4 22.4zM257.9 518c11.6 4.2 24.5-1.8 28.7-13.4l20.5-56.2h85.5l20.5 56.2c4.2 11.6 17.1 17.6 28.7 13.4 11.6-4.2 17.6-17.1 13.4-28.7l-84.3-231.5c-0.1-0.3-0.3-0.5-0.5-0.8-0.7-1.6-1.7-3-2.7-4.4-0.7-1-1.2-2-2.1-2.9-1.1-1.1-2.4-1.9-3.8-2.7-1.1-0.7-2.2-1.6-3.4-2.1-0.3-0.1-0.6-0.4-0.9-0.6-1.1-0.4-2.2-0.3-3.3-0.5-1.5-0.3-2.8-0.6-4.3-0.7-1.5 0-2.9 0.4-4.3 0.7-1.1 0.2-2.2 0.1-3.3 0.5-0.4 0.1-0.6 0.4-0.9 0.6-1.3 0.5-2.3 1.4-3.4 2.1-1.3 0.9-2.7 1.6-3.8 2.7-0.8 0.8-1.4 1.9-2.1 2.9-1 1.4-2 2.8-2.7 4.4-0.1 0.3-0.4 0.5-0.5 0.8l-84.3 231.5c-4.3 11.6 1.8 24.5 13.3 28.7z m91.9-187l26.4 72.6h-52.9l26.5-72.6z m408.6 405H265.6c-12.3 0-22.4 10.1-22.4 22.4 0 12.3 10.1 22.4 22.4 22.4h492.8c12.3 0 22.4-10.1 22.4-22.4 0-12.3-10.1-22.4-22.4-22.4zM579.2 243.2c-12.3 0-22.4 10.1-22.4 22.4v44.8H512c-12.3 0-22.4 10.1-22.4 22.4 0 12.3 10.1 22.4 22.4 22.4h44.8V400c0 12.3 10.1 22.4 22.4 22.4 12.3 0 22.4-10.1 22.4-22.4v-44.8h44.8c12.3 0 22.4-10.1 22.4-22.4 0-12.3-10.1-22.4-22.4-22.4h-44.8v-44.8c0-12.3-10.1-22.4-22.4-22.4z" fill="#000000" ></path></symbol><symbol id="icon-tupianguanli" viewBox="0 0 1024 1024"><path d="M265.6 344c0 55.7 45.1 100.8 100.8 100.8S467.2 399.7 467.2 344s-45.1-100.8-100.8-100.8S265.6 288.3 265.6 344z m156.8 0c0 30.9-25.1 56-56 56s-56-25.1-56-56 25.1-56 56-56 56 25.1 56 56z m515.2 280c12.4 0 22.4-10 22.4-22.4V108.8c0-24.7-20.1-44.8-44.8-44.8H108.8C84.1 64 64 84.1 64 108.8v806.4c0 24.7 20.1 44.8 44.8 44.8h806.4c24.7 0 44.8-20.1 44.8-44.8V765.3c0-7.2-3.4-13.9-9.2-18.1l-35.6-25.8L700 565c-0.3-0.2-0.7-0.3-1-0.5-1.2-0.8-2.4-1.2-3.7-1.7-1.4-0.6-2.8-1.3-4.3-1.6-1.4-0.3-2.8-0.1-4.2-0.1-1.4 0-2.8-0.1-4.2 0.1-1.5 0.3-2.8 1-4.3 1.6-1.3 0.5-2.5 0.9-3.7 1.7-0.3 0.2-0.7 0.2-1 0.5L505.5 687.1 301.1 538.7c-10-7.2-24-5-31.3 5-7.2 10-5 24 5 31.3l217.5 158c0.3 0.2 0.7 0.3 1 0.5 1.2 0.8 2.4 1.1 3.7 1.7 1.4 0.6 2.8 1.3 4.3 1.6 1.4 0.3 2.8 0.1 4.2 0.1 1.4 0 2.8 0.1 4.2-0.1 1.5-0.3 2.9-1 4.3-1.6 1.3-0.5 2.5-0.9 3.7-1.7 0.3-0.2 0.7-0.2 1-0.5l168.1-122.1 228.4 166V893c0 12.4-10 22.4-22.4 22.4H131.2c-12.4 0-22.4-10-22.4-22.4V131.2c0-12.4 10-22.4 22.4-22.4h761.6c12.4 0 22.4 10 22.4 22.4v470.4c0 12.4 10 22.4 22.4 22.4z" fill="#000000" ></path></symbol><symbol id="icon-richengguanli" viewBox="0 0 1024 1024"><path d="M896 554.7c11.8 0 21.3-9.6 21.3-21.3V192c0-23.5-19.2-42.7-42.7-42.7h-192v-64c0-11.7-9.6-21.3-21.3-21.3-11.7 0-21.3 9.6-21.3 21.3v64H384v-64c0-11.7-9.6-21.3-21.3-21.3-11.7 0-21.3 9.6-21.3 21.3v64h-192c-23.5 0-42.7 19.2-42.7 42.7v725.3c0 23.5 19.2 42.7 42.7 42.7h725.3c23.5 0 42.7-19.2 42.7-42.7V704c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3v192c0 11.7-9.6 21.3-21.3 21.3H170.7c-11.7 0-21.3-9.6-21.3-21.3V426.7h725.3v106.7c0 11.7 9.5 21.3 21.3 21.3zM149.3 384V213.3c0-11.7 9.6-21.3 21.3-21.3h170.7v64c0 11.7 9.6 21.3 21.3 21.3 11.7 0 21.3-9.6 21.3-21.3v-64h256v64c0 11.7 9.6 21.3 21.3 21.3 11.7 0 21.3-9.6 21.3-21.3v-64h170.7c11.7 0 21.3 9.6 21.3 21.3V384H149.3z m314.5 200.1L331.4 716.5l-60.3-60.3c-8.3-8.3-21.9-8.3-30.2 0s-8.3 21.9 0 30.2l75.4 75.4c4.1 4.1 9.6 6.2 15.1 6.2s10.9-2.1 15.1-6.2L494 614.3c8.3-8.3 8.3-21.9 0-30.2s-21.9-8.3-30.2 0zM768 725.3H576c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3h192c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3z m0-149.3H576c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3h192c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3z" fill="#2c2c2c" ></path></symbol><symbol id="icon-bianji" viewBox="0 0 1024 1024"><path d="M896 405.3H725.3c-11.8 0-21.3 9.6-21.3 21.3v417.2c0 5.6 2.2 11 6.2 15L810.7 960l100.5-101.1c4-4 6.2-9.4 6.2-15V426.7c-0.1-11.8-9.6-21.4-21.4-21.4z m-21.3 425.8l-64 64.9-64-64.9V597.3h128v233.8z m0-276.4h-128V448h128v106.7z m0-490.7H149.3c-23.6 0-42.7 19.1-42.7 42.7v810.7c0 23.6 19.1 42.7 42.7 42.7H640c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H170.7c-11.8 0-21.3-9.6-21.3-21.3V128c0-11.8 9.6-21.3 21.3-21.3h682.7c11.8 0 21.3 9.6 21.3 21.3v170.7c0 11.8 9.6 21.3 21.3 21.3s21.3-9.6 21.3-21.3v-192c0-23.6-19.1-42.7-42.6-42.7zM533.3 512c0-11.8-9.6-21.3-21.3-21.3H298.7c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3H512c11.8 0 21.3-9.5 21.3-21.3z m85.4-170.7c0-11.7-9.6-21.3-21.3-21.3H298.7c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3h298.7c11.7 0.1 21.3-9.5 21.3-21.3z m-320 320c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3h128c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3h-128z" fill="#2c2c2c" ></path></symbol><symbol id="icon-neirongguanli" viewBox="0 0 1024 1024"><path d="M896 234.7c11.8 0 21.3-9.6 21.3-21.3V106.7c0-23.6-19.1-42.7-42.7-42.7H149.3c-23.6 0-42.7 19.1-42.7 42.7v746.7c0 58.7 48 106.7 106.7 106.7H896c11.8 0 21.3-9.6 21.3-21.3V384c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3v362.7H213.3c-24.1 0-46.1 8.4-64 22V128c0-11.8 9.6-21.3 21.3-21.3H320v320c0 15.9 16.7 26.2 30.9 19.1l97.1-48.6 97.1 48.6c14.2 7.1 30.9-3.2 30.9-19.1v-320h277.3c11.8 0 21.3 9.6 21.3 21.3v85.3c0.1 11.8 9.6 21.4 21.4 21.4zM213.3 789.3h661.3v128H213.3c-35.3 0-64-28.7-64-64s28.7-64 64-64z m320-392.1l-75.8-37.9c-6-3-13.1-3-19.1 0l-75.8 37.9V106.7h170.7v290.5z" fill="#2c2c2c" ></path></symbol><symbol id="icon-kaoheguanli" viewBox="0 0 1024 1024"><path d="M469.3 640c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3H640c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3H469.3z m277.4-149.3c0-11.7-9.6-21.3-21.3-21.3h-256c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3h256c11.7 0 21.3-9.6 21.3-21.3zM469.3 917.3H170.7c-11.8 0-21.3-9.6-21.3-21.3V128c0-11.8 9.6-21.3 21.3-21.3h682.7c11.8 0 21.3 9.6 21.3 21.3v469.3c0 11.8 9.6 21.3 21.3 21.3 11.8 0 21.3-9.6 21.3-21.3V106.7c0-23.6-19.1-42.7-42.7-42.7H149.3c-23.6 0-42.7 19.1-42.7 42.7v810.7c0 23.6 19.1 42.7 42.7 42.7h320c11.8 0 21.3-9.6 21.3-21.3 0.1-11.9-9.5-21.5-21.3-21.5z m256-618.6h-256c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3h256c11.7 0 21.3-9.6 21.3-21.3s-9.5-21.3-21.3-21.3z m185.8 413.7c-8.3-8.3-21.8-8.3-30.2 0L684.8 908.5l-75.4-75.4c-8.3-8.3-21.8-8.3-30.2 0-8.3 8.3-8.3 21.8 0 30.2l90.4 90.4v0.1c4.2 4.2 9.6 6.2 15.1 6.2s10.9-2.1 15.1-6.2v-0.1l211.1-211.1c8.5-8.4 8.5-21.9 0.2-30.2zM362.7 469.3h-64c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3h64c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3z m0-170.6h-64c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3h64c11.7 0 21.3-9.6 21.3-21.3s-9.6-21.3-21.3-21.3z m0 341.3h-64c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3h64c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3z" fill="#000000" ></path></symbol><symbol id="icon-jiaoshiguanli" viewBox="0 0 1024 1024"><path d="M512 533.3c129.6 0 234.7-105.1 234.7-234.7S641.6 64 512 64 277.3 169.1 277.3 298.7c0 90 50.7 168 125 207.4C231.9 553.9 106.7 710.2 106.7 896c0 15.5 1.1 30.7 2.9 45.7 1.3 10.5 10.5 18.3 21.1 18.3 12.6 0 22.6-10.8 21.1-23.3-1.6-13.4-2.5-26.9-2.5-40.7 0-200 162.7-362.7 362.7-362.7zM320 298.7c0-105.9 86.1-192 192-192s192 86.1 192 192-86.1 192-192 192-192-86.2-192-192z m211.4 314.8c-3.8-8.3-11.6-12.5-19.4-12.5-7.8 0-15.6 4.2-19.4 12.5l-85.3 188.2c-3.7 8.1-1.9 17.6 4.3 23.9l85.3 85.5c4.2 4.2 9.6 6.3 15.1 6.3s10.9-2.1 15.1-6.3l85.3-85.5c6.3-6.3 8-15.8 4.3-23.9l-85.3-188.2zM512 865.8l-59.8-59.9L512 674l59.8 131.9-59.8 59.9z m194.3-325.1c-8.2-4.5-18.5-2.8-25.2 3.9-10 10-7.6 26.8 4.8 33.6C798.2 639.8 874.7 759 874.7 896c0 13.8-0.9 27.3-2.5 40.7-1.5 12.5 8.6 23.3 21.1 23.3 10.6 0 19.8-7.8 21.1-18.3 1.8-15 2.9-30.2 2.9-45.7 0-153.4-85.4-286.5-211-355.3z" fill="#2c2c2c" ></path></symbol><symbol id="icon-wangkeguanli" viewBox="0 0 1024 1024"><path d="M896 234.7c11.8 0 21.3-9.6 21.3-21.3V106.7c0-23.6-19.1-42.7-42.7-42.7H149.3c-23.6 0-42.7 19.1-42.7 42.7v746.7c0 58.7 48 106.7 106.7 106.7H896c11.8 0 21.3-9.6 21.3-21.3V384c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3v362.7H213.3c-24.1 0-46.1 8.4-64 22V128c0-11.8 9.6-21.3 21.3-21.3h682.7c11.8 0 21.3 9.6 21.3 21.3v85.3c0.1 11.8 9.6 21.4 21.4 21.4zM213.3 789.3h661.3v128H213.3c-35.3 0-64-28.7-64-64s28.7-64 64-64z m230.2-548.9c-5.9-3.7-12.7-5.7-19.4-5.7-7 0-13.8 2.1-19.5 6.5-9.7 7.5-15.9 19.1-15.9 32v307.3c0 11.5 4.9 21.9 12.7 29.3 6.2 5.9 14.4 8.8 22.6 8.8 7 0 14-2.1 20.1-6.2l247.2-166.8c8-5.4 12.8-14.3 12.8-23.7 0-9.7-5-18.8-13.4-24.2L443.5 240.4z m-12.2 329.2V283.2l218.3 139.1-218.3 147.3z" fill="#2c2c2c" ></path></symbol><symbol id="icon-bulujiesuan" viewBox="0 0 1024 1024"><path d="M629.5 518.5c-8.7-8.7-23-8.7-31.7 0L512 604.3l-85.8-85.8c-8.7-8.7-23-8.7-31.7 0s-8.7 23 0 31.7l73.8 73.8h-46c-12.3 0-22.4 10.1-22.4 22.4 0 12.3 10.1 22.4 22.4 22.4h67.2v44.8h-67.2c-12.3 0-22.4 10.1-22.4 22.4 0 12.3 10.1 22.4 22.4 22.4h67.2v44.8c0 12.3 10.1 22.4 22.4 22.4s22.4-10.1 22.4-22.4v-44.8h67.2c12.3 0 22.4-10.1 22.4-22.4 0-12.3-10.1-22.4-22.4-22.4h-67.2v-44.8h67.2c12.3 0 22.4-10.1 22.4-22.4 0-12.3-10.1-22.4-22.4-22.4h-45.8l73.8-73.8c8.7-8.7 8.7-23 0-31.7z" fill="#000000" ></path><path d="M915.2 691.3v201.5c0 12.3-10.1 22.4-22.4 22.4H131.2c-12.3 0-22.4-10.1-22.4-22.4v-448c0-12.3 10.1-22.4 22.4-22.4h761.6c12.3 0 22.4 10.1 22.4 22.4v67.3c0 12.4 10 22.4 22.4 22.4 12.4 0 22.4-10 22.4-22.4v-89.7c0-24.6-20.2-44.8-44.8-44.8h-82.6l2.2-2.2c17.7-17.5 17.7-45.9 0-63.4l-190-190c-17.5-17.7-45.9-17.7-63.4 0L564 139.5h-0.1L443.5 70c-21.5-12.3-48.8-5.2-61.2 16.4L214.1 377.6H108.8c-24.6 0-44.8 20.2-44.8 44.8v492.8c0 24.6 20.2 44.8 44.8 44.8h806.4c24.6 0 44.8-20.2 44.8-44.8V691.3c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10.1-22.4 22.4zM597.3 169.6c2.5-2.5 5.6-4.3 9-5.4 7.6-2.7 16.6-0.7 22.6 5.4L787.3 328c8.7 8.7 8.7 22.9 0 31.6l-18.1 18.1H389.1l208.2-208.1z m-331.5 208l144-249.3c6-10.8 19.9-14.6 30.5-8.3l90.7 52.4h0.1l-0.1 0.1-205.1 205.1h-60.1z" fill="#000000" ></path></symbol><symbol id="icon-mingpian" viewBox="0 0 1024 1024"><path d="M234.7 555.3c0 7.3 3.8 14.5 10.7 18.6 10.2 5.8 23.3 2.3 29.2-7.9l35-60.6c3.4 1.3 6.8 2.3 10.5 3.2 8.5 2.3 17.5 3.4 26.7 3.4s18.1-1.1 26.7-3.4c3.6-0.9 7-1.9 10.5-3.2l35 60.6c6 10.2 19 13.7 29.2 7.9 6.8-4.1 10.7-11.3 10.7-18.6 0-3.6-0.9-7.3-2.8-10.7l-35.8-62.1c20.5-19.4 33.3-46.7 33.3-77.2 0-58.9-47.8-106.7-106.7-106.7S240 346.5 240 405.3c0 30.5 12.8 57.8 33.3 77.2l-35.8 62.1c-2 3.5-2.8 7.1-2.8 10.7z m112-214c35.2 0 64 28.8 64 64 0 14.3-4.9 27.7-13 38.4-2.1 3-4.7 5.8-7.5 8.3-7.9 7.3-17.5 12.8-28.4 15.4-3.6 0.9-7.5 1.5-11.3 1.7-1.3 0.2-2.6 0.2-3.8 0.2-1.3 0-2.6 0-3.8-0.2-3.8-0.2-7.7-0.9-11.3-1.7-10.9-2.6-20.5-8.1-28.4-15.4-2.8-2.6-5.3-5.3-7.5-8.3-8.1-10.7-13-24.1-13-38.4 0-35.2 28.8-64 64-64z m592-64c11.8 0 21.3-9.6 21.3-21.3V149.3c0-23.6-19.1-42.7-42.7-42.7H106.7c-23.6 0-42.7 19.1-42.7 42.7v725.3c0 23.6 19.1 42.7 42.7 42.7h810.7c23.6 0 42.7-19.1 42.7-42.7v-448c0-11.8-9.6-21.3-21.3-21.3-11.8 0-21.3 9.6-21.3 21.3v426.7c0 11.8-9.6 21.3-21.3 21.3H128c-11.8 0-21.3-9.6-21.3-21.3V170.7c0-11.8 9.6-21.3 21.3-21.3h768c11.8 0 21.3 9.6 21.3 21.3V256c0 11.8 9.6 21.3 21.4 21.3z m-384 149.4h128c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3h-128c-11.8 0-21.3 9.6-21.3 21.3-0.1 11.7 9.5 21.3 21.3 21.3zM256 725.3h512c11.7 0 21.3-9.6 21.3-21.3s-9.6-21.3-21.3-21.3H256c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3zM768 512H554.7c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3H768c11.8 0 21.3-9.6 21.3-21.3 0-11.7-9.5-21.3-21.3-21.3z" fill="#2c2c2c" ></path></symbol><symbol id="icon-kaohezhibiao" viewBox="0 0 1024 1024"><path d="M298.7 490.7h64c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3h-64c-11.7 0-21.3 9.6-21.3 21.3-0.1 11.7 9.5 21.3 21.3 21.3z m0-149.4h64c11.7 0 21.3-9.6 21.3-21.3s-9.6-21.3-21.3-21.3h-64c-11.7 0-21.3 9.6-21.3 21.3s9.5 21.3 21.3 21.3zM896 234.7c11.8 0 21.3-9.6 21.3-21.3V106.7c0-23.5-19.2-42.7-42.7-42.7H149.3c-23.5 0-42.7 19.2-42.7 42.7v810.7c0 23.5 19.2 42.7 42.7 42.7h725.3c23.5 0 42.7-19.2 42.7-42.7V384c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3v512c0 11.8-9.6 21.3-21.3 21.3H170.7c-11.8 0-21.3-9.6-21.3-21.3V128c0-11.8 9.6-21.3 21.3-21.3h682.7c11.8 0 21.3 9.6 21.3 21.3v85.3c0 11.8 9.5 21.4 21.3 21.4zM238.3 779.9c4.1 6.1 10.9 9.4 17.7 9.4 4.1 0 8.2-1.2 11.9-3.6l178.8-120.3L552 730.2c5.8 3.6 12.9 4.1 19.2 1.6L691.6 683l63.5 48.6c9.3 7.2 22.7 5.4 29.9-4 7.2-9.4 5.4-22.7-4-29.9l-73.1-56c-6-4.6-13.9-5.6-21-2.8l-121.6 49.3-107.8-66.4c-7.1-4.4-16.1-4.2-23.1 0.5l-190.2 128c-9.9 6.6-12.5 19.8-5.9 29.6z m231-438.6h256c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3h-256c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3z m0 149.4h256c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3h-256c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3z" fill="#000000" ></path></symbol><symbol id="icon-qiyeguanli" viewBox="0 0 1024 1024"><path d="M111.2 451.6C138.4 270.8 287 128 468.9 108.9c119.2-12.5 229 27.5 310.3 99.1 3.9 3.4 8.8 5.3 13.9 5.3h0.5c0.7 0 1.2-0.3 1.9-0.4 1.8-0.2 3.6-0.5 5.2-1 1.4-0.5 2.6-1.2 3.8-2 0.7-0.4 1.3-0.8 1.9-1.3 5.1-3.9 8.6-9.7 8.6-16.6V85.3c0-11.8-9.6-21.3-21.3-21.3-11.8 0-21.3 9.6-21.3 21.3v62.5c-85.4-61.3-193-93.4-308.6-81.3C273.5 86.5 115.4 230 74.4 416.9c-17.9 81.6-11.7 159.3 10.7 229.9 2.8 8.8 11.1 14.6 20.3 14.6 14.4 0 24.6-13.9 20.2-27.6-17.9-56.4-24-118-14.4-182.2zM938.9 377.3c-2.8-8.8-11.1-14.6-20.3-14.6-14.4 0-24.6 13.9-20.2 27.6 20.6 64.7 25.7 136.3 9.1 210.8-36.2 163-172.6 289.2-338 312.3-124.7 17.4-240-22.9-324.6-97.3-3.9-3.4-8.8-5.3-13.9-5.3h-0.5c-0.7 0-1.2 0.3-1.9 0.4-1.8 0.2-3.6 0.5-5.1 1-1.4 0.5-2.6 1.2-3.8 2-0.7 0.4-1.3 0.8-1.9 1.3-5.1 3.9-8.6 9.8-8.6 16.6v106.7c0 11.8 9.6 21.3 21.3 21.3 11.8 0 21.3-9.6 21.3-21.3v-62.5c84.8 60.9 191.5 93 306.4 81.5C745.2 938.9 902.1 801 947 618.4c21-85.6 15.3-167.3-8.1-241.1z" fill="#000000" ></path><path d="M308.1 445.7c68.1-33.3 136.2-73.4 204.3-119.9 58.6 39.7 125.9 79.3 203 119 11.5 5.9 25 2.4 29.6-7.8 4.7-10.2-1.1-23.2-12.2-29.1-80.8-42.7-150.9-85.3-210.4-128-1.6-1.1-3.4-1.6-5.2-2.1-0.3-0.1-3-0.4-4.1-0.4-4.1-0.2-8.3 0.6-12.2 3.4-71.1 50.5-142.3 93.9-213.4 130.1-9.8 5-13.2 16.5-7.5 26 5.8 9.4 18.3 13.6 28.1 8.8z" fill="#000000" ></path><path d="M298.7 704h426.7c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3h-192V554.7h149.3c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H533.3v-85.3c0-11.8-9.6-21.3-21.3-21.3-11.8 0-21.3 9.6-21.3 21.3v234.7h-85.3V512c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3v149.3h-64c-11.8 0-21.3 9.6-21.3 21.3-0.2 11.8 9.4 21.4 21.2 21.4z" fill="#000000" ></path></symbol><symbol id="icon-chubuguanli" viewBox="0 0 1024 1024"><path d="M917.3 106.7H362.7c-23.6 0-42.7 19.1-42.7 42.7V704c0 23.6 19.1 42.7 42.7 42.7h554.7c23.6 0 42.7-19.1 42.7-42.7V149.3c-0.1-23.5-19.2-42.6-42.8-42.6z m0 576c0 11.8-9.6 21.3-21.3 21.3H384c-11.8 0-21.3-9.6-21.3-21.3v-512c0-11.8 9.6-21.3 21.3-21.3h512c11.8 0 21.3 9.6 21.3 21.3v512z" fill="#000000" ></path><path d="M682.7 810.7c-11.8 0-21.3 9.6-21.3 21.3v21.3c0 11.8-9.6 21.3-21.3 21.3H128c-11.8 0-21.3-9.6-21.3-21.3v-512c0-11.8 9.6-21.3 21.3-21.3h106.7c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3h-128c-23.6-0.1-42.7 19-42.7 42.6v554.7c0 23.6 19.1 42.7 42.7 42.7h554.7c23.6 0 42.7-19.1 42.7-42.7V832c-0.1-11.8-9.7-21.3-21.4-21.3zM797.1 307.1L600.8 503.3 495.1 397.6c-8.3-8.3-21.8-8.3-30.2 0-8.3 8.3-8.3 21.8 0 30.2l120.7 120.7c4.2 4.2 9.7 6.3 15.2 6.2 5.5 0 11-2 15.2-6.2l211.2-211.2c8.3-8.3 8.3-21.8 0-30.2-8.3-8.4-21.8-8.4-30.1 0z" fill="#000000" ></path></symbol><symbol id="icon-saomiaodianjing" viewBox="0 0 1024 1024"><path d="M938.7 490.7H874c-1.2-20.8-4-41.9-8.8-63.2-35.2-156.8-172.6-268-331.8-277.2v-65c0-11.8-9.6-21.3-21.3-21.3-11.8 0-21.3 9.6-21.3 21.3v65.1C307.9 161 161.2 307.1 150.4 490.7H85.3c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h64.8c8.8 150.9 110 277.3 248.3 322.9 13.9 4.6 28.2-5.8 28.2-20.4 0-9.4-6.2-17.4-15.1-20.3-121-40.1-209.7-150.5-218.4-282.1h41.5c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3h-41.5c2.6-40.5 12.4-82.4 31.6-124.5C272.1 262.1 377 197 490.7 192.4v42.3c0 11.8 9.6 21.3 21.3 21.3 11.8 0 21.3-9.6 21.3-21.3v-41.3c151 13.5 278.5 128 296.4 280.5 0.7 5.7 0.7 11.2 1 16.8h-41.5c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h41.5C820 692.4 691.9 820.2 533.2 830.8v-41.5c0-11.8-9.6-21.3-21.3-21.3-11.8 0-21.3 9.6-21.3 21.3v149.3c0 11.8 9.6 21.3 21.3 21.3 11.8 0 21.3-9.6 21.3-21.3V874c182.9-10.6 330-157 340.6-340.7h64.7c11.8 0 21.3-9.6 21.3-21.3 0.2-11.8-9.4-21.3-21.1-21.3z" fill="#000000" ></path><path d="M384 512c0 70.7 57.3 128 128 128s128-57.3 128-128-57.3-128-128-128-128 57.3-128 128z m213.3 0c0 47.1-38.3 85.3-85.3 85.3-47.1 0-85.3-38.3-85.3-85.3 0-47.1 38.3-85.3 85.3-85.3 47.1 0 85.3 38.2 85.3 85.3zM657.4 422.7c6 9.8 10.6 19.9 14.2 30.3 2.3 6.4 7.4 11.4 14 13l4.3 1c15.2 3.6 28-11 23-25.8-4.8-14-11.1-27.7-19.2-40.9-26.3-42.8-65.3-73-109.1-88.9-12-4.3-25.2 2.8-28.1 15.2-2.5 10.5 3.1 21.2 13.2 24.8 35.3 12.7 66.7 37 87.7 71.3z" fill="#000000" ></path></symbol><symbol id="icon-jiezhang" viewBox="0 0 1024 1024"><path d="M677.9 303.4c-8.3-8.3-21.9-8.3-30.2 0L512 439.2 376.3 303.4c-8.3-8.3-21.9-8.3-30.2 0s-8.3 21.9 0 30.2L460.5 448h-87.2c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3h117.3v64H373.3c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3h117.3v128c0 11.7 9.6 21.3 21.3 21.3s21.3-9.6 21.3-21.3v-128h117.3c11.7 0 21.3-9.6 21.3-21.3s-9.6-21.3-21.3-21.3H533.3v-64h117.3c11.7 0 21.3-9.6 21.3-21.3s-9.6-21.3-21.3-21.3h-87.2l114.4-114.4c8.4-8.3 8.4-21.9 0.1-30.2zM903.6 641.1l-75.3 75.3-45.2-45.2c-8.3-8.3-21.8-8.3-30.2 0-8.3 8.3-8.3 21.8 0 30.2l59.8 59.8c0.2 0.2 0.2 0.4 0.4 0.5 4.2 4.2 9.7 6.3 15.2 6.2 5.5 0 11-2 15.2-6.2 0.2-0.2 0.2-0.4 0.4-0.5l90-90c8.3-8.3 8.3-21.8 0-30.2-8.5-8.2-22-8.2-30.3 0.1z" fill="#000000" ></path><path d="M487.9 64.6C261.7 76.5 76.5 261.7 64.6 487.9 51.1 746.2 256.6 960 512 960c100.5 0 193.2-33.2 267.9-89.1 16.6-12.4 7.7-38.9-13-38.9-4.6 0-9 1.5-12.7 4.3-80.6 60.4-184.1 92-295.3 77.6-183.2-23.6-329.8-173-349.8-356.6C82.6 313.6 273.6 106.7 512 106.7c223.5 0 405.3 181.8 405.3 405.3 0 13.8-0.9 27.4-2.4 40.8-1.4 12.5 8.6 23.2 21.2 23.2 10.7 0 20-8 21.2-18.6 1.7-14.9 2.7-30 2.7-45.4 0-255.4-213.7-460.9-472.1-447.4z" fill="#000000" ></path></symbol><symbol id="icon-xiaoshoubaobiao" viewBox="0 0 1024 1024"><path d="M746.9 211.4L551.3 385.3 449.1 283.1c-8.7-8.7-22.5-9.3-31.8-1.4l-171 143.5c-10 8.4-11.3 23.2-2.9 33.2 4.7 5.6 11.3 8.4 18.1 8.4 5.3 0 10.7-1.8 15.1-5.5L431 331.8l102.6 102.6c8.8 8.8 23 9.3 32.3 0.9l212.2-188.6c9.7-8.6 10.6-23.6 2-33.3-8.6-9.7-23.5-10.6-33.2-2z" fill="#000000" ></path><path d="M936.4 229.1c13 0 23.6-10.6 23.6-23.6v-94.3c0-25.9-21.2-47.2-47.2-47.2H111.2C85.2 64 64 85.2 64 111.2v801.7c0 25.9 21.2 47.2 47.2 47.2h801.7c25.9 0 47.2-21.2 47.2-47.2V394.1c0-13-10.6-23.6-23.6-23.6-13 0-23.6 10.6-23.6 23.6v377.3H111.2V134.7c0-13 10.6-23.6 23.6-23.6h754.5c13 0 23.6 10.6 23.6 23.6v70.7c-0.1 13.1 10.5 23.7 23.5 23.7z m-23.6 589.4v70.7c0 13-10.6 23.6-23.6 23.6H134.7c-13 0-23.6-10.6-23.6-23.6v-70.7h801.7z" fill="#000000" ></path><path d="M298.8 677.1h-45.2c-0.6 0-1-0.4-1-1V536.6c0-0.6 0.4-1 1-1h45.2c0.6 0 1 0.4 1 1v139.5c0 0.5-0.5 1-1 1zM463.8 677.1h-45.2c-0.6 0-1-0.4-1-1V442.3c0-0.6 0.4-1 1-1h45.2c0.6 0 1 0.4 1 1v233.8c0 0.5-0.4 1-1 1zM628.9 677.1h-45.2c-0.6 0-1-0.4-1-1V536.6c0-0.6 0.4-1 1-1h45.2c0.6 0 1 0.4 1 1v139.5c0 0.5-0.5 1-1 1zM770.4 677.1h-45.2c-0.6 0-1-0.4-1-1V418.7c0-0.6 0.4-1 1-1h45.2c0.6 0 1 0.4 1 1v257.4c0 0.5-0.5 1-1 1z" fill="#000000" ></path></symbol><symbol id="icon-pingzheng" viewBox="0 0 1024 1024"><path d="M931 921.8L819.4 810.1c72.1-88 67.1-218-15-300.1-87.5-87.5-229.3-87.5-316.8 0s-87.5 229.3 0 316.8c82.1 82.1 212.2 87.1 300.1 15l111.7 111.7c8.7 8.7 22.9 8.7 31.7 0 8.7-8.8 8.7-23-0.1-31.7zM772.6 795c-69.9 69.9-183.6 69.9-253.4 0-69.9-69.9-69.9-183.6 0-253.4 69.9-69.9 183.6-69.9 253.4 0 69.9 69.9 69.9 183.6 0 253.4z" fill="#000000" ></path><path d="M310.4 825.6H153.6c-12.4 0-22.4-10-22.4-22.4v-672c0-12.4 10-22.4 22.4-22.4H736c12.4 0 22.4 10 22.4 22.4v224c0 12.4 10 22.4 22.4 22.4 12.4 0 22.4-10 22.4-22.4V108.8c0-24.7-20.1-44.8-44.8-44.8H131.2c-24.7 0-44.8 20.1-44.8 44.8v716.8c0 24.7 20.1 44.8 44.8 44.8h179.2c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4z" fill="#000000" ></path><path d="M265.6 243.2c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4H624c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H265.6zM400 377.6H265.6c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4H400c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4z" fill="#000000" ></path></symbol><symbol id="icon-hetong" viewBox="0 0 1024 1024"><path d="M874.7 64H149.3c-23.5 0-42.7 19.2-42.7 42.7v810.7c0 23.5 19.2 42.7 42.7 42.7H480c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H170.7c-11.7 0-21.3-9.6-21.3-21.3V128c0-11.7 9.6-21.3 21.3-21.3h682.7c11.7 0 21.3 9.6 21.3 21.3v384c0 11.8 9.6 21.3 21.3 21.3 11.8 0 21.3-9.6 21.3-21.3V106.7c0-23.5-19.2-42.7-42.6-42.7z" fill="#2c2c2c" ></path><path d="M512 298.7h213.3c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3H512c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3zM405.3 554.7H298.7c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3h106.7c11.7 0 21.3-9.6 21.3-21.3s-9.6-21.3-21.4-21.3zM899.1 694.6l-108.4-15.8c-7-1-13-5.4-16.1-11.7l-48.4-98.5c-3.9-7.9-11.5-11.9-19.1-11.9-7.6 0-15.2 4-19.1 11.9l-48.4 98.5a21.3 21.3 0 0 1-16.1 11.7L515 694.6c-17.5 2.5-24.5 24-11.8 36.4l78.5 76.8c5 4.9 7.3 11.9 6.1 18.8L569.3 935c-2.4 13.8 8.6 25 21 25 3.3 0 6.7-0.8 10-2.5l96.8-51.1c3.1-1.6 6.5-2.5 10-2.5 3.4 0 6.8 0.8 10 2.5l96.8 51.1c3.3 1.7 6.7 2.5 10 2.5 12.4 0 23.4-11.2 21-25l-18.5-108.4c-1.2-6.9 1.1-13.9 6.1-18.8L911 731c12.5-12.4 5.5-33.9-11.9-36.4z m-96.6 82.7c-15 14.7-21.9 35.8-18.3 56.5l11.2 65.8-58.5-30.9c-9.2-4.8-19.5-7.4-29.9-7.4-10.4 0-20.7 2.6-29.9 7.4l-58.5 30.9 11.2-65.8c3.5-20.7-3.3-41.8-18.3-56.5l-47.7-46.7 65.7-9.6c20.9-3 38.9-16.2 48.2-35.1l29.3-59.5 29.3 59.5c9.3 18.9 27.3 32 48.2 35.1l65.7 9.6-47.7 46.7zM405.3 256H298.7c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h106.7c11.8 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.4-21.3zM512 448h213.3c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3H512c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3zM405.3 405.3H298.7c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h106.7c11.8 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.4-21.3z" fill="#2c2c2c" ></path></symbol><symbol id="icon-xiaoshoupin" viewBox="0 0 1024 1024"><path d="M874.2 257.1l-320-181.9C541.1 67.7 526.5 64 512 64c-14.5 0-29.1 3.7-42.2 11.1L149.8 257c-26.7 15.2-43.2 43.5-43.2 74.2v361.5c0 30.7 16.5 59 43.2 74.2l320 181.9c13.1 7.4 27.6 11.1 42.2 11.1 14.5 0 29.1-3.7 42.2-11.1l320-181.9c26.7-15.2 43.2-43.5 43.2-74.2V331.2c-0.1-30.7-16.5-59-43.2-74.1zM490.9 112.2c6.4-3.6 13.7-5.6 21.1-5.6s14.7 1.9 21.1 5.6l317.7 180.6-146.5 84.6L367 182.7l123.9-70.5z m-0.2 437.9v361.6L170.9 729.9c-13.3-7.6-21.6-21.7-21.6-37.1v-360l149.3 86.3v165.5c0 8.1 4.6 15.5 11.8 19.1l30.9 15.4V443.8l124.2 71.7 25.2 14.5v20.1z m17.5-59.4l-17.5-10-319.8-184.6v-1.9l153.1-87 337.7 195-128.4 74.1-25.1 14.4z m366.5 202.1c0 15.3-8.2 29.5-21.6 37.1L533.3 911.6V525.5l17.3-10 321.5-185.7c1.1 0.6 1.4 0.8 2.5 1.5v361.5z" fill="#000000" ></path></symbol><symbol id="icon-xueshuguanli" viewBox="0 0 1024 1024"><path d="M305.9 460.3c7.6-9 6.4-22.5-2.6-30.1-9-7.6-22.5-6.4-30.1 2.6l-54.9 65.4c-0.7 0.8-0.9 1.7-1.4 2.6-0.8 1.3-1.6 2.5-2.1 3.9s-0.7 2.9-0.9 4.4c-0.1 1-0.6 1.9-0.6 2.9v170.7c0 11.8 9.6 21.3 21.3 21.3H384v106.7c0 11.8 9.6 21.3 21.3 21.3h213.3c11.8 0 21.3-9.6 21.3-21.3V704h149.3c11.8 0 21.3-9.6 21.3-21.3V512c0-1-0.4-1.9-0.6-2.9-0.2-1.5-0.4-2.9-0.9-4.3s-1.3-2.6-2.1-3.9c-0.5-0.8-0.7-1.8-1.4-2.6l-54.9-65.4c-7.6-9-21-10.2-30.1-2.6-9 7.6-10.2 21-2.6 30.1l49.9 59.4v34.9h-69.3c-14-61.5-57.1-111.9-114.5-135.2 21.1-19.5 34.5-47.1 34.5-78.1 0-58.9-47.8-106.7-106.7-106.7s-106.7 47.8-106.7 106.7c0 31 13.4 58.6 34.5 78.1-57.4 23.3-100.5 73.7-114.5 135.2H256v-34.9l49.9-59.5z m291.4 329H426.7V704h170.7v85.3z m-85.3-512c35.3 0 64 28.7 64 64s-28.7 64-64 64-64-28.7-64-64 28.7-64 64-64z m0 170.7c67.5 0 124.6 45.1 143 106.7H369C387.4 493.1 444.5 448 512 448zM320 597.3h448v64H256v-64h64z" fill="#2c2c2c" ></path><path d="M958.9 481.3c-15-217.4-215.4-410.6-433.2-417.1C272 56.6 64 260 64 512c0 38.8 5.1 76.4 14.4 112.2 2.4 9.4 11.1 15.8 20.8 15.8 13.9 0 24.2-13 20.6-26.4-13.1-50.1-17.1-103.8-8.9-159.7C138 269.4 291 123.9 476.8 108.2 716.1 87.8 917.3 276.9 917.3 512c0 35.1-4.7 69-13.1 101.4-3.5 13.5 6.7 26.6 20.7 26.6 9.7 0 18.3-6.4 20.7-15.7 11.7-45.3 16.8-93.3 13.3-143zM815.7 789.3c-5.7 0-11.1 2.4-15.1 6.4C727 870.6 625 917.3 512 917.3s-215-46.7-288.6-121.6c-4-4.1-9.4-6.4-15.1-6.4-18.8 0-28.9 22.8-15.8 36.2C273.7 908.4 386.8 960 512 960s238.3-51.6 319.5-134.4c13.2-13.5 3.1-36.3-15.8-36.3z" fill="#2c2c2c" ></path></symbol><symbol id="icon-renwuguanli" viewBox="0 0 1024 1024"><path d="M874.7 64H149.3c-23.6 0-42.7 19.1-42.7 42.7v810.7c0 23.6 19.1 42.7 42.7 42.7h725.3c23.6 0 42.7-19.1 42.7-42.7V106.7c0-23.6-19.1-42.7-42.6-42.7z m-320 42.7h170.7v222.5l-58-48.3c-7.9-6.6-17.6-9.9-27.3-9.9s-19.4 3.3-27.3 9.9l-58 48.3V106.7z m320 789.3c0 11.8-9.6 21.3-21.3 21.3H170.7c-11.8 0-21.3-9.6-21.3-21.3V128c0-11.8 9.6-21.3 21.3-21.3H512V352c0 19.1 15.6 32.1 32.2 32.1 7 0 14.1-2.3 20.3-7.5l75.5-62.9 75.5 62.9c6.2 5.2 13.3 7.5 20.3 7.5 16.5 0 32.2-13 32.2-32.1V106.7h85.3c11.8 0 21.3 9.6 21.3 21.3v768z" fill="#000000" ></path><path d="M298.7 597.3h170.7c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H298.7c-11.8 0-21.3 9.6-21.3 21.3-0.1 11.8 9.5 21.3 21.3 21.3zM725.3 704H298.7c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h426.7c11.8 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.4-21.3z" fill="#000000" ></path></symbol><symbol id="icon-dianshang" viewBox="0 0 1024 1024"><path d="M909.1 910.3l-92.4-554.7c-3.4-20.6-21.2-35.7-42.1-35.7h-91.9v-85.3C682.7 140.4 606.3 64 512 64s-170.7 76.4-170.7 170.7V320h-91.9c-20.9 0-38.7 15.1-42.1 35.7l-92.4 554.7c-4.3 26 15.7 49.7 42.1 49.7h710c26.3-0.1 46.4-23.8 42.1-49.8zM384 234.7c0-70.6 57.4-128 128-128s128 57.4 128 128V320H384v-85.3z m457.8 682.6H182.2c-13.2 0-23.2-11.8-21-24.8l85.3-512c1.7-10.3 10.6-17.8 21-17.8h489c10.4 0 19.3 7.5 21 17.8l85.3 512c2.2 13-7.8 24.8-21 24.8z" fill="#000000" ></path><path d="M627.5 647.9c-5.5 3.2-9.2 8.8-10.6 15-8.1 37.2-35.5 70-78.9 81-35 8.9-73.4-1.7-98.9-27.1-59.1-58.8-33.9-156 45-179.4 34.5-10.3 73-1.5 99.7 22.5 3.4 2.9 6.5 6.1 9.4 9.4l-90.5 52.3c-10.2 5.9-13.7 19-7.8 29.1 5.9 10.2 19 13.7 29.1 7.8l90.5-52.3 20.3-11.7c10.2-5.9 13.7-19 7.8-29.1-41.6-72.1-134.1-96.2-205.8-53.6-68.2 40.6-92.6 131.8-53.9 201.1 40.8 72.8 133 98.1 205.1 56.5 37.9-21.9 62.4-57.9 71.1-97.5 4-18.6-15.4-33.3-31.6-24z" fill="#000000" ></path></symbol><symbol id="icon-gudingzichan" viewBox="0 0 1024 1024"><path d="M938.7 362.7c11.8 0 21.3-9.6 21.3-21.3v-192c0-23.6-19.1-42.7-42.7-42.7H106.7c-23.6 0-42.7 19.1-42.7 42.7v725.3c0 23.6 19.1 42.7 42.7 42.7h810.7c23.6 0 42.7-19.1 42.7-42.7V512c0-11.8-9.6-21.3-21.3-21.3-11.8 0-21.3 9.6-21.3 21.3v341.3c0 11.8-9.6 21.3-21.3 21.3H128c-11.8 0-21.3-9.6-21.3-21.3V170.7c0-11.8 9.6-21.3 21.3-21.3h768c11.8 0 21.3 9.6 21.3 21.3v170.7c0 11.7 9.6 21.3 21.4 21.3z" fill="#000000" ></path><path d="M661.3 533.3v128c0 11.8 9.6 21.3 21.3 21.3 11.8 0 21.3-9.6 21.3-21.3v-128h85.3c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H704V448c0-62.4-53.5-112.2-117.1-106.2-55.5 5.3-96.2 55-96.2 110.8v120.9c0 31-20.9 59.4-51.2 65.3-40.9 7.9-76.8-23.3-76.8-62.8V362.6c0-11.8-9.6-21.3-21.3-21.3-11.8 0-21.3 9.6-21.3 21.3v128h-85.3c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3H320v38.1c0 55.7 40.7 105.5 96.2 110.8 63.6 6.1 117.1-43.8 117.1-106.2V450.5c0-31 20.9-59.4 51.2-65.3 40.9-7.9 76.8 23.3 76.8 62.8V533.3z" fill="#000000" ></path></symbol><symbol id="icon-dongtai" viewBox="0 0 1024 1024"><path d="M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64z m0 853.3c-223.5 0-405.3-181.8-405.3-405.3S288.5 106.7 512 106.7 917.3 288.5 917.3 512 735.5 917.3 512 917.3z" fill="#2c2c2c" ></path><path d="M704.1 298.7c-1.5 0-3 0.2-4.5 0.5l-332 70.3a21.2 21.2 0 0 0-16.6 17.4l-52 313.7c-2.2 13.3 8.2 24.8 21 24.8 1.5 0 3-0.2 4.5-0.5l332-70.3a21.2 21.2 0 0 0 16.6-17.4l52-313.7c2.1-13.3-8.3-24.8-21-24.8z m-70.8 317.2l-287.2 60.8 44.5-268.5 287.2-60.8-44.5 268.5z" fill="#2c2c2c" ></path><path d="M512 512m-53.3 0a53.3 53.3 0 1 0 106.6 0 53.3 53.3 0 1 0-106.6 0Z" fill="#2c2c2c" ></path></symbol><symbol id="icon-jichupeizhi" viewBox="0 0 1024 1024"><path d="M954 371.3l-93.9-162.6c-8.2-14.3-23.3-22.4-38.8-22.4-6.2 0-12.4 1.3-18.4 4l-53.6 24.2c-26.8-21.4-56.2-38.7-87.2-52l-5.8-58.2C653.9 81.4 634.6 64 611.6 64H423.9c-23 0-42.3 17.4-44.6 40.3l-5.3 53.3c-17.8 6.9-35.3 14.8-52.4 24.7-15.8 9.1-30.3 19.5-44.2 30.4l-56.3-25.4c-6-2.7-12.2-4-18.4-4-15.6 0-30.6 8.1-38.8 22.4L70 368.2c-11.5 19.9-6 45.3 12.6 58.8l52 37.4c-4 31.8-4.4 64.2-0.3 96.4L82.7 598C64 611.4 58.5 636.9 70 656.8l93.9 162.6c8.2 14.3 23.3 22.4 38.8 22.4 6.2 0 12.4-1.3 18.4-4l56.9-25.7c29.4 22.9 61.8 41.2 96.1 54.5l5.3 53c2.3 22.9 21.6 40.3 44.6 40.3h65.7c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H424l-5.3-53c-1.7-16.7-12.4-31.1-28-37.2-30.6-11.8-59.2-28.1-85.1-48.2-8-6.2-17.7-9.5-27.5-9.5-6.2 0-12.5 1.3-18.4 4l-56.9 25.7-93.9-162.6 51.7-37.2c13.1-9.4 20.5-25.2 18.4-41.3-3.7-27.9-3.6-57.1 0.3-87 2.1-15.9-5.4-31.6-18.4-40.9l-52-37.4 93.9-162.6 56.3 25.4c5.9 2.7 12.2 4 18.4 4 9.8 0 19.6-3.2 27.6-9.5 14.4-11.3 26.8-19.8 39-26.9 13.2-7.6 27.8-14.5 45.8-21.6 15.8-6.2 27-20.6 28.7-37.4l5.3-53.3h187.7l5.8 58.2c1.6 15.9 11.3 30.1 25.9 36.3 28.2 12 54.4 27.6 78 46.3 8.1 6.4 18 9.8 27.9 9.8 6.2 0 12.5-1.3 18.4-4l53.6-24.2 93.9 162.6-46.8 33.6c-12.8 9.2-20.4 17.4-20.4 39.8v112c0 12.4 10 22.4 22.4 22.4s22.4-10 22.4-22.4V467l48.5-37.1c18.8-13.2 24.3-38.6 12.8-58.6z" fill="#000000" ></path><path d="M892.8 691.2H624c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h268.8c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4zM892.8 915.2H624c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h268.8c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4zM892.8 803.2H624c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h268.8c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4zM483 380.6c86.7-18.2 163.4 47.8 163.4 131.4 0 20.8-4.8 40.5-13.3 58.1-7.1 14.6 4.1 31.5 20.4 31.5 8.3 0 16.3-4.5 19.9-12 15.2-31.4 21.6-67.8 15.6-106.2-12.3-78.7-78-141.1-157.1-149.6-107.9-11.6-199 72.6-199 178.1 0 90.3 66.8 165 153.7 177.4 13.4 1.9 25.5-8.8 25.5-22.4 0-11.1-8.2-20.4-19.2-22-75.4-10.8-130.8-84.6-111.2-166.2 12-50.1 50.7-87.4 101.3-98.1z" fill="#000000" ></path></symbol><symbol id="icon-dashuju" viewBox="0 0 1024 1024"><path d="M512 832c-26.8 0-49.7 16.5-59.2 39.8-161.1-24.1-290.2-144-324.3-298.6-2.2-10-10.9-17.3-21.3-17.3-14.1 0-24.3 12.9-21.3 26.4C124.1 756 269.6 890.1 451.2 915c8.1 26 32.1 45 60.8 45 35.3 0 64-28.7 64-64s-28.7-64-64-64z m0 85.3c-11.8 0-21.3-9.6-21.3-21.3s9.6-21.3 21.3-21.3c11.8 0 21.3 9.6 21.3 21.3s-9.5 21.3-21.3 21.3zM512 663.6c94.3 0 170.7-76.4 170.7-170.7S606.3 322.2 512 322.2s-170.7 76.4-170.7 170.7S417.7 663.6 512 663.6z m0-298.7c70.6 0 128 57.4 128 128s-57.4 128-128 128-128-57.4-128-128 57.4-128 128-128z" fill="#000000" ></path><path d="M512 789.3c132.8 0 245.2-86.7 284-206.5 4.5-13.9-5.9-28.2-20.5-28.2-9.5 0-17.5 6.3-20.4 15.3C721.6 672.4 625.5 746.7 512 746.7S302.4 672.4 268.9 570c-2.9-9-11-15.3-20.4-15.3-14.6 0-25 14.3-20.5 28.2 38.9 119.8 151.2 206.4 284 206.4zM796 398.5C763.4 298 678.9 221 574.2 198.8c-6.6-28.3-31.9-49.5-62.2-49.5-35.3 0-64 28.7-64 64s28.7 64 64 64c25.3 0 46.9-14.8 57.3-36.1 87.6 20.2 158.1 85.5 185.8 170.1 2.9 9 11 15.3 20.4 15.3 14.6 0.1 25-14.2 20.5-28.1zM512 234.7c-11.8 0-21.3-9.6-21.3-21.3 0-11.8 9.6-21.3 21.3-21.3 11.8 0 21.3 9.6 21.3 21.3 0 11.7-9.5 21.3-21.3 21.3zM351.4 239c-57.7 36.9-101.9 93.1-123.4 159.6-4.5 13.8 5.9 28.1 20.5 28.1 9.5 0 17.5-6.3 20.5-15.3 18.5-56.4 56-104.2 105-135.8 6.2-4 10.1-10.7 10.1-18.1-0.1-16.8-18.6-27.5-32.7-18.5z" fill="#000000" ></path><path d="M107.2 427.6c10.4 0 19.1-7.3 21.3-17.2C166.7 237.1 323.9 106.8 512 106.8s345.3 130.3 383.5 303.6c2.2 10 10.9 17.2 21.3 17.2 14 0 24.3-12.8 21.3-26.2C895.8 208.6 721.4 64 512 64 302.6 64 128.2 208.6 85.8 401.4c-2.9 13.4 7.3 26.2 21.4 26.2zM916.8 556c-10.4 0-19.1 7.3-21.3 17.2-28.9 130.9-125.8 237.1-252.6 281.3v45.1C791 853.9 904.9 733 938.1 582.4c3-13.5-7.2-26.4-21.3-26.4zM85.3 469.3H128V512H85.3zM170.7 469.3h42.7V512h-42.7zM256 469.3h42.7V512H256zM725.3 469.3H768V512h-42.7zM810.7 469.3h42.7V512h-42.7zM896 469.3h42.7V512H896z" fill="#000000" ></path></symbol><symbol id="icon-hujiaoshezhi" viewBox="0 0 1024 1024"><path d="M490.7 256v512c0 11.7 9.6 21.3 21.3 21.3 11.7 0 21.3-9.6 21.3-21.3V256c0-11.7-9.6-21.3-21.3-21.3-11.7 0-21.3 9.6-21.3 21.3zM362.7 362.7v298.7c0 11.7 9.6 21.3 21.3 21.3 11.7 0 21.3-9.6 21.3-21.3V362.7c0-11.7-9.6-21.3-21.3-21.3-11.7-0.1-21.3 9.5-21.3 21.3zM618.7 362.7v298.7c0 11.7 9.6 21.3 21.3 21.3s21.3-9.6 21.3-21.3V362.7c0-11.7-9.6-21.3-21.3-21.3s-21.3 9.5-21.3 21.3zM234.7 469.3v85.3c0 11.7 9.6 21.3 21.3 21.3s21.3-9.6 21.3-21.3v-85.3c0-11.7-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3zM768 448c-11.7 0-21.3 9.6-21.3 21.3v85.3c0 11.7 9.6 21.3 21.3 21.3s21.3-9.6 21.3-21.3v-85.3c0-11.7-9.6-21.3-21.3-21.3z" fill="#000000" ></path><path d="M885.8 265.4c-3.9-5.9-10.7-9.4-17.8-9.4-17.1 0-26.8 18.9-17.4 33.2 49.2 74.6 74.5 166.3 64.7 264.4C896.4 743.2 743 896.5 553.4 915.3 297.4 940.7 84 727.6 108.6 471.8c18-186.8 166.7-339.3 353-362 110.4-13.4 213 18 293 78 3.7 2.7 8.1 4.3 12.6 4.3 20.5 0 29.5-26.3 13.1-38.6-86.4-64.8-197-99.2-315.9-86.9C255.5 88.1 87 257.3 66.3 466.3c-28 283 207.6 519 490.5 491.5 210-20.4 379.9-190 400.9-399.9 10.9-108.6-17.4-210-71.9-292.5z" fill="#000000" ></path></symbol><symbol id="icon-fenxiao" viewBox="0 0 1024 1024"><path d="M803.2 377.6c86.6 0 156.8-70.2 156.8-156.8C960 134.2 889.8 64 803.2 64c-86.6 0-156.8 70.2-156.8 156.8 0 21.1 4.2 41.2 11.8 59.6l-126.9 73.2c-49.2-54-119.8-88-198.5-88C184.3 265.6 64 385.9 64 534.4s120.3 268.8 268.8 268.8c75.7 0 144-31.4 192.8-81.7l133 76.8c-7.5 15.1-12.2 31.8-12.2 49.8 0 25.3 8.7 48.4 22.9 67.2H489.6c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h268.8c61.9 0 112-50.1 112-112s-50.1-112-112-112c-27.5 0-52.3 10.3-71.8 26.7l-132.2-76.3c29.7-43.2 47.2-95.5 47.2-152 0-53.4-15.8-103.1-42.7-145L681 318.9c28.7 35.8 72.8 58.7 122.2 58.7z m0-268.8c61.8 0 112 50.2 112 112s-50.2 112-112 112-112-50.2-112-112 50.2-112 112-112z m-44.8 672c37.1 0 67.2 30.1 67.2 67.2s-30.1 67.2-67.2 67.2-67.2-30.1-67.2-67.2 30.1-67.2 67.2-67.2z m-425.6-22.4c-123.5 0-224-100.5-224-224s100.5-224 224-224 224 100.5 224 224-100.5 224-224 224z" fill="#2c2c2c" ></path><path d="M422.4 531.7c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H383l48.6-48.6c8.7-8.7 8.7-22.9 0-31.7-8.7-8.7-22.9-8.7-31.7 0l-67.2 67.2-67.2-67.2c-8.7-8.7-22.9-8.7-31.7 0-8.7 8.7-8.7 22.9 0 31.7l48.6 48.6H243c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h67.2v44.8H243c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h67.2v44.8c0 12.4 10 22.4 22.4 22.4 12.4 0 22.4-10 22.4-22.4v-44.8h67.2c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H355v-44.8h67.4z" fill="#2c2c2c" ></path></symbol><symbol id="icon-chengjitongji" viewBox="0 0 1024 1024"><path d="M796.6 272.2c-8.8-8.8-22.9-8.8-31.7 0L554.4 482.7 392.2 366.3c-9.2-6.6-22-5.3-29.7 3.1L226.6 519.3c-8.3 9.2-7.6 23.3 1.5 31.6 4.3 3.9 9.7 5.8 15.1 5.8 6.1 0 12.2-2.5 16.6-7.4l122.5-135.1 161.4 115.9c8.9 6.4 21.1 5.4 28.9-2.4l224-224c8.8-8.6 8.8-22.8 0-31.5z" fill="#000000" ></path><path d="M915.2 64H108.8C84.1 64 64 84.1 64 108.8v806.4c0 24.7 20.1 44.8 44.8 44.8H512c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H131.2c-12.4 0-22.4-10-22.4-22.4V131.2c0-12.4 10-22.4 22.4-22.4h761.6c12.4 0 22.4 10 22.4 22.4v358.4c0 12.4 10 22.4 22.4 22.4 12.4 0 22.4-10 22.4-22.4V108.8c0-24.7-20.1-44.8-44.8-44.8z" fill="#000000" ></path><path d="M734.5 638.3c-3.3-8.6-11.6-14.3-20.9-14.3-9.3 0-17.6 5.7-20.9 14.3l-112 291.2c-4.4 11.5 1.3 24.5 12.9 29 11.6 4.4 24.5-1.3 29-12.9l28.9-75.3h124.3l28.9 75.3c3.4 8.9 11.9 14.3 20.9 14.3 2.7 0 5.4-0.5 8.1-1.5 11.5-4.4 17.3-17.4 12.9-29L734.5 638.3z m-65.8 187.3l44.9-116.8 44.9 116.8h-89.8zM937.6 624h-44.8v-44.8c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4V624h-44.8c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4H848v44.8c0 12.4 10 22.4 22.4 22.4 12.4 0 22.4-10 22.4-22.4v-44.8h44.8c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4z" fill="#000000" ></path></symbol><symbol id="icon-tuiguangshezhi" viewBox="0 0 1024 1024"><path d="M740.7 538.4c-4.3-3.5-9.3-5.1-14.2-5.1-11.6 0-22.5 8.8-22.5 21.7v149H469.3c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3H704v149c0 12.9 10.9 21.7 22.5 21.7 4.9 0 9.9-1.6 14.2-5.1L951.9 742c10.7-8.7 10.7-24.6 0-33.3L740.7 538.4z m6 314.3V598l157.9 127.3-157.9 127.4z" fill="#000000" ></path><path d="M917.3 106.7H106.7c-23.6 0-42.7 19.1-42.7 42.7v725.3c0 23.6 19.1 42.7 42.7 42.7h320c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H128c-11.8 0-21.3-9.6-21.3-21.3V170.7c0-11.8 9.6-21.3 21.3-21.3h768c11.8 0 21.3 9.6 21.3 21.3v256c0 11.8 9.6 21.3 21.3 21.3 11.8 0 21.3-9.6 21.3-21.3V149.3c0.1-23.5-19-42.6-42.6-42.6z" fill="#000000" ></path><path d="M277.3 341.3h469.3c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H277.3c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3zM277.3 490.7H448c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H277.3c-11.8 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3z" fill="#000000" ></path></symbol><symbol id="icon-banjiguanli" viewBox="0 0 1024 1024"><path d="M704.2 661.3c0-11.8-9.6-21.3-21.3-21.3h-384c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h384c11.8 0.1 21.3-9.5 21.3-21.3zM298.9 746.7c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h213.3c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H298.9zM298.9 554.7h128c11.8 0 21.3-9.6 21.3-21.3v-128c0-11.8-9.6-21.3-21.3-21.3h-128c-11.8 0-21.3 9.6-21.3 21.3v128c-0.1 11.7 9.5 21.3 21.3 21.3z m21.3-128h85.3V512h-85.3v-85.3z" fill="#000000" ></path><path d="M896.2 618.7c11.8 0 21.3-9.6 21.3-21.3V106.7c0-23.6-19.1-42.7-42.7-42.7H213.5c-58.9 0-106.7 47.8-106.7 106.7v746.7c0 23.6 19.1 42.7 42.7 42.7h725.3c23.6 0 42.7-19.1 42.7-42.7V768c0-11.8-9.6-21.3-21.3-21.3-11.8 0-21.3 9.6-21.3 21.3v128c0 11.8-9.6 21.3-21.3 21.3H170.9c-11.8 0-21.3-9.6-21.3-21.3V255.5c17.9 13.5 39.9 21.8 64 21.8h661.3v320c0 11.8 9.5 21.4 21.3 21.4z m-682.7-384c-35.3 0-64-28.7-64-64s28.7-64 64-64h640c11.8 0 21.3 9.6 21.3 21.3v106.7H213.5z" fill="#000000" ></path></symbol><symbol id="icon-hetongyidong" viewBox="0 0 1024 1024"><path d="M512 298.7h213.3c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3H512c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3zM405.3 554.7H298.7c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3h106.7c11.7 0 21.3-9.6 21.3-21.3s-9.6-21.3-21.4-21.3zM405.3 256H298.7c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h106.7c11.8 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.4-21.3zM512 448h213.3c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3H512c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3zM405.3 405.3H298.7c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h106.7c11.8 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.4-21.3zM781.8 737.3l-45.4-6.6-20.3-41.1c-4.6-9.2-19.7-9.2-24.3 0l-20.3 41.1-45.4 6.6c-5.1 0.7-9.3 4.3-10.9 9.2-1.6 4.9-0.3 10.3 3.4 13.9l32.8 32-7.8 45.2c-0.9 5.1 1.2 10.2 5.4 13.2 4.1 3 9.7 3.4 14.2 1l40.6-21.3 40.6 21.3c2 1 4.1 1.5 6.3 1.5 2.8 0 5.6-0.9 7.9-2.6 4.2-3 6.3-8.2 5.4-13.2l-7.8-45.2 32.8-32c3.7-3.6 5-9 3.4-13.9-1.3-4.8-5.5-8.4-10.6-9.1z m-49.3 40.6c-3.2 3.1-4.6 7.6-3.9 12l4.3 25.2-22.6-11.9c-2-1-4.1-1.5-6.3-1.5s-4.3 0.5-6.3 1.5l-22.6 11.9 4.3-25.2c0.8-4.4-0.7-8.9-3.9-12l-18.3-17.8 25.3-3.7c4.4-0.6 8.2-3.4 10.2-7.4l11.3-22.9 11.3 22.9c2 4 5.8 6.8 10.2 7.4l25.3 3.7-18.3 17.8z" fill="#000000" ></path><path d="M826.2 597.5c-7.6-13.3-21.7-21.5-37-21.5H618.8c-15.3 0-29.4 8.2-37 21.5l-85.5 149.3c-7.5 13.1-7.5 29.3 0 42.4l85.5 149.3c7.6 13.3 21.7 21.5 37 21.5h170.4c15.3 0 29.4-8.2 37-21.5l85.5-149.3c7.5-13.1 7.5-29.3 0-42.4l-85.5-149.3z m-37 319.8H618.8L533.3 768l85.5-149.3h170.4L874.7 768l-85.5 149.3z" fill="#000000" ></path><path d="M874.7 64H149.3c-23.5 0-42.7 19.2-42.7 42.7v810.7c0 23.5 19.2 42.7 42.7 42.7H448c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H170.7c-11.7 0-21.3-9.6-21.3-21.3V128c0-11.7 9.6-21.3 21.3-21.3h682.7c11.7 0 21.3 9.6 21.3 21.3v384c0 11.8 9.6 21.3 21.3 21.3s21.3-9.6 21.3-21.3V106.7c0-23.5-19.2-42.7-42.6-42.7z" fill="#000000" ></path></symbol><symbol id="icon-kechengbao" viewBox="0 0 1024 1024"><path d="M456.2 384.9c-8.4-5-17.3-7.3-25.9-7.3-27.4 0-52.5 22.8-52.5 54.7v248.9c0 31.9 25.1 54.7 52.5 54.7 8.7 0 17.5-2.3 25.9-7.3L665 604.3c35.2-21 35.2-73.9 0-94.9L456.2 384.9z m185.9 180.9L433.3 690.2c-1.5 0.9-2.4 1-3 1-2.4 0-7.7-2.5-7.7-9.9v-249c0-7.4 5.3-9.9 7.7-9.9 0.6 0 1.5 0.1 3 1l208.8 124.5c4 2.4 4.5 6.6 4.5 9s-0.6 6.5-4.5 8.9z" fill="#2c2c2c" ></path><path d="M915.4 131.2H613l-21.2-42.4C584.2 73.6 568.7 64 551.7 64H109c-24.7 0-44.8 20.1-44.8 44.8v806.4c0 24.7 20.1 44.8 44.8 44.8h806.4c24.7 0 44.8-20.1 44.8-44.8V556.8c0-12.4-10-22.4-22.4-22.4s-22.4 10-22.4 22.4v336c0 12.4-10 22.4-22.4 22.4H131.4c-12.4 0-22.4-10-22.4-22.4V131.2c0-12.4 10-22.4 22.4-22.4h420.3L639 283.3c15.2 30.4 46.2 49.5 80.1 49.5h196.3v89.6c0 12.4 10 22.4 22.4 22.4s22.4-10 22.4-22.4V176c0-24.7-20-44.8-44.8-44.8z m0 156.8H719.1c-17 0-32.5-9.6-40.1-24.8L635.4 176H893c12.4 0 22.4 10 22.4 22.4V288z" fill="#2c2c2c" ></path></symbol><symbol id="icon-yonghuguanli" viewBox="0 0 1024 1024"><path d="M243.4 758.4H781c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H243.4c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4zM781 579.2H669c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h112c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4zM781 467.2H669c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h112c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4zM222.8 598.5c-1.9 13.4 8.8 25.5 22.4 25.5 11.1 0 20.4-8.1 22-19.1 9.3-65.1 65.4-115.3 133.1-115.3s123.7 50.2 133 115.3c1.6 11 10.9 19.1 22 19.1 13.6 0 24.3-12 22.4-25.5-8.7-61.4-48.7-112.7-103.3-137.6 23.1-20.5 37.9-50.1 37.9-83.4 0-61.9-50.1-112-112-112s-112 50.1-112 112c0 33.3 14.8 62.9 37.9 83.4-54.7 24.9-94.7 76.2-103.4 137.6z m177.4-288.1c37.1 0 67.2 30.1 67.2 67.2 0 19.1-8.1 36.8-22.8 49.9-6.2 5.5-10.6 12.5-13 20.1-10.2-1.8-20.7-2.8-31.4-2.8s-21.2 1-31.4 2.8c-2.4-7.6-6.8-14.6-13-20.1-14.7-13.1-22.8-30.8-22.8-49.9 0-37.1 30.2-67.2 67.2-67.2z" fill="#000000" ></path><path d="M937.8 646.4c12.4 0 22.4-10 22.4-22.4V108.8c0-24.7-20.1-44.8-44.8-44.8H109c-24.7 0-44.8 20.1-44.8 44.8v806.4c0 24.7 20.1 44.8 44.8 44.8h806.4c24.7 0 44.8-20.1 44.8-44.8V780.8c0-12.4-10-22.4-22.4-22.4s-22.4 10-22.4 22.4v112c0 12.4-10 22.4-22.4 22.4H131.4c-12.4 0-22.4-10-22.4-22.4V131.2c0-12.4 10-22.4 22.4-22.4H893c12.4 0 22.4 10 22.4 22.4V624c0 12.4 10 22.4 22.4 22.4z" fill="#000000" ></path></symbol><symbol id="icon-yonghuhuaxiang" viewBox="0 0 1024 1024"><path d="M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64z m0 853.3c-223.5 0-405.3-181.8-405.3-405.3S288.5 106.7 512 106.7 917.3 288.5 917.3 512 735.5 917.3 512 917.3z" fill="#000000" ></path><path d="M813.4 352.4c-3.7-6.9-11-11.1-18.8-11.1-16.3 0-26.1 17.4-18.5 31.8 29.2 55.2 41.7 120.5 30.3 189.4-10.2 61.7-40.2 117-82.6 159.6-9.1-79.2-61.4-145-132.9-173.5 29.8-23.4 49-59.7 49-100.6 0-70.7-57.3-128-128-128s-128 57.3-128 128c0 40.9 19.2 77.2 49 100.6-71.3 28.5-123.6 94.2-132.8 173.2-53.6-53.9-86.9-127.9-86.9-209.8 0-50.2 12.5-97.5 34.5-139 7.6-14.4-2.2-31.7-18.5-31.7-7.8 0-15.2 4.2-18.8 11.1-27.2 51.2-42 109.9-39.6 172.5 4.7 126.4 91.3 243.9 205.4 297.7 13.5 6.3 29-3.7 29-18.5 0-8.2-5-15.3-12.5-18.6-18-7.8-34.9-17.5-50.8-28.6-0.2-3.4-0.7-6.7-0.7-10.2 0-94.1 76.6-170.7 170.7-170.7s170.7 76.6 170.7 170.7c0 3.4-0.5 6.7-0.7 10.1-15.9 11-32.5 21-50.3 28.9-7.8 3.4-13 10.9-13 19.4 0 15.3 15.7 25.6 29.7 19.5 120.6-52.7 205-172.6 205-312.6 0-57.7-14.5-112-39.9-159.6zM512 533.3c-47.1 0-85.3-38.3-85.3-85.3 0-47.1 38.3-85.3 85.3-85.3s85.3 38.3 85.3 85.3c0 47.1-38.2 85.3-85.3 85.3z" fill="#000000" ></path><path d="M552.4 807.9c-20 2.7-61.7 1.8-61.7 1.8-6.4-0.4-12.8-1-19.1-1.8-12.6-1.7-23.6 8.2-23.6 20.9 0 10.6 7.8 19.3 18.2 21 10.3 1.6 20.7 2.8 31.2 3.2 3.6 0.1 7.1 0.1 10.7 0.1h3.8c4.8 0.1 9.6 0.1 14.5-0.1 10.5-0.4 20.9-1.6 31.2-3.2 10.4-1.7 18.2-10.4 18.2-21 0.2-12.7-10.9-22.6-23.4-20.9z" fill="#000000" ></path></symbol><symbol id="icon-zhanghaoguanli" viewBox="0 0 1024 1024"><path d="M512.2 64c-247.4 0-448 200.6-448 448s200.6 448 448 448 448-200.6 448-448-200.6-448-448-448z m0 853.3c-223.5 0-405.3-181.8-405.3-405.3s181.8-405.3 405.3-405.3S917.5 288.5 917.5 512 735.7 917.3 512.2 917.3z" fill="#000000" ></path><path d="M512.2 576c82.5 0 149.3-66.9 149.3-149.3 0-82.5-66.9-149.3-149.3-149.3-82.5 0-149.3 66.9-149.3 149.3S429.7 576 512.2 576z m0-256c58.8 0 106.7 47.9 106.7 106.7S571 533.3 512.2 533.3s-106.7-47.9-106.7-106.7S453.4 320 512.2 320zM512.2 618.7c-79.2 0-149.9 36.1-196.8 92.6-11.7 14.1-1.9 35.4 16.4 35.4 6.4 0 12.4-3 16.5-8 39.1-47.2 98-77.4 163.9-77.4s124.8 30.2 163.9 77.4c4.1 5 10 8 16.5 8 18.3 0 28-21.3 16.4-35.4-46.9-56.6-117.6-92.6-196.8-92.6z" fill="#000000" ></path></symbol><symbol id="icon-yusuan" viewBox="0 0 1024 1024"><path d="M874.7 64H149.3c-23.6 0-42.7 19.1-42.7 42.7v810.7c0 23.6 19.1 42.7 42.7 42.7h725.3c23.6 0 42.7-19.1 42.7-42.7V106.7c0-23.6-19.1-42.7-42.6-42.7z m0 832c0 11.8-9.6 21.3-21.3 21.3H170.7c-11.8 0-21.3-9.6-21.3-21.3V128c0-11.8 9.6-21.3 21.3-21.3h682.7c11.8 0 21.3 9.6 21.3 21.3v768z" fill="#000000" ></path><path d="M725.3 234.7H298.7c-11.8 0-21.3 9.6-21.3 21.3v170.7c0 11.8 9.6 21.3 21.3 21.3h426.7c11.8 0 21.3-9.6 21.3-21.3V256c0-11.8-9.6-21.3-21.4-21.3zM704 405.3H320v-128h384v128zM405.3 533.3H298.7c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h106.7c11.8 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.4-21.3zM405.3 640H298.7c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h106.7c11.8 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.4-21.3zM405.3 746.7H298.7c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h106.7c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.4-21.3zM704 640c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3h-37.5l46.3-46.3c8.3-8.3 8.3-21.8 0-30.2-8.3-8.3-21.8-8.3-30.2 0l-64 64-64-64c-8.3-8.3-21.8-8.3-30.2 0-8.3 8.3-8.3 21.8 0 30.2l46.3 46.3h-37.5c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h64v42.7h-64c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h64v64c0 11.8 9.6 21.3 21.3 21.3 11.8 0 21.3-9.6 21.3-21.3v-64h64c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3h-64V640H704z" fill="#000000" ></path></symbol><symbol id="icon-mingpianbaobiao" viewBox="0 0 1024 1024"><path d="M938.7 277.3c11.8 0 21.3-9.6 21.3-21.3V149.3c0-23.5-19.2-42.7-42.7-42.7H746.7c-11.8 0-21.3 9.6-21.3 21.3v40c0 21.3-14.4 41.1-35.4 44.7-26.6 4.5-50-16.2-50-42.1V128c0-11.8-9.6-21.3-21.3-21.3H405.4c-11.8 0-21.3 9.6-21.3 21.3v40c0 21.3-14.4 41.1-35.4 44.7-26.6 4.5-50-16.2-50-42.1V128c0-11.8-9.6-21.3-21.3-21.3H106.7c-23.5 0-42.7 19.2-42.7 42.7v725.3c0 23.5 19.2 42.7 42.7 42.7h810.7c23.5 0 42.7-19.2 42.7-42.7v-448c0-11.8-9.6-21.3-21.3-21.3-11.8 0-21.3 9.6-21.3 21.3v426.7c0 11.7-9.6 21.3-21.3 21.3H128c-11.7 0-21.3-9.6-21.3-21.3V170.7c0-11.7 9.6-21.3 21.3-21.3h128v17.3c0 44.5 32.3 84.4 76.6 88.9 50.8 5.1 94.1-35.1 94.1-84.9v-21.3h170.7v17.3c0 44.5 32.3 84.4 76.6 88.9 50.8 5.1 94.1-35.1 94.1-84.9v-21.3h128c11.7 0 21.3 9.6 21.3 21.3V256c-0.1 11.8 9.5 21.3 21.3 21.3z" fill="#000000" ></path><path d="M234.7 597.3V768c0 11.8 9.6 21.3 21.3 21.3 11.8 0 21.3-9.6 21.3-21.3V597.3c0-11.8-9.6-21.3-21.3-21.3-11.8 0-21.3 9.6-21.3 21.3zM490.7 597.3V768c0 11.8 9.6 21.3 21.3 21.3 11.8 0 21.3-9.6 21.3-21.3V597.3c0-11.8-9.6-21.3-21.3-21.3-11.8 0-21.3 9.6-21.3 21.3zM768 789.3c11.8 0 21.3-9.6 21.3-21.3V597.3c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3V768c0 11.8 9.5 21.3 21.3 21.3zM362.7 682.7V768c0 11.8 9.6 21.3 21.3 21.3s21.3-9.6 21.3-21.3v-85.3c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.5-21.3 21.3zM618.7 682.7V768c0 11.8 9.6 21.3 21.3 21.3s21.3-9.6 21.3-21.3v-85.3c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.5-21.3 21.3zM752.7 454.4c8.3 8.3 21.8 8.3 30.2 0 8.3-8.3 8.3-21.8 0-30.2l-92.6-92.6c-0.7-0.7-1.6-1-2.3-1.5-1.1-0.9-2.2-1.7-3.5-2.3-1.3-0.6-2.5-1-3.8-1.3-1.3-0.4-2.6-0.7-3.9-0.8-1.4-0.1-2.7 0-4.1 0.2-1.3 0.2-2.6 0.3-3.9 0.8-1.4 0.5-2.7 1.2-4 1.9-0.8 0.4-1.6 0.6-2.3 1.1L504.8 447.9l-108-81c-0.5-0.4-1.1-0.4-1.6-0.8-1.3-0.8-2.5-1.3-3.9-1.8-1.3-0.5-2.5-0.9-3.8-1.1-1.4-0.2-2.7-0.2-4-0.2-1.4 0-2.7 0.1-4 0.4-1.3 0.3-2.5 0.8-3.8 1.3-1.3 0.6-2.6 1.2-3.8 2-0.5 0.4-1.1 0.5-1.6 0.9l-128 106.7c-9 7.5-10.3 21-2.7 30 4.2 5.1 10.3 7.7 16.4 7.7 4.8 0 9.6-1.6 13.6-4.9l115-95.9 107.5 80.6c0.4 0.3 0.8 0.4 1.2 0.6 1.2 0.8 2.3 1.4 3.7 1.9 2.2 0.9 4.4 1.4 6.6 1.5 0.3 0 0.6 0.2 0.9 0.2h0.4c0.3 0 0.6-0.2 0.9-0.2 2.3-0.1 4.5-0.7 6.6-1.5 1.3-0.5 2.5-1.2 3.7-1.9 0.4-0.2 0.8-0.3 1.2-0.6l155.9-116.9 79.5 79.5z" fill="#000000" ></path></symbol><symbol id="icon-dingdanguanli" viewBox="0 0 1024 1024"><path d="M405.5 106.7h213.3c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H405.5c-11.8 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3z" fill="#000000" ></path><path d="M874.9 64H768.2c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h85.3c11.8 0 21.3 9.6 21.3 21.3v768c0 11.8-9.6 21.3-21.3 21.3H170.9c-11.8 0-21.3-9.6-21.3-21.3V128c0-11.8 9.6-21.3 21.3-21.3h85.3c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H149.5c-23.6 0-42.7 19.1-42.7 42.7v810.7c0 23.6 19.1 42.7 42.7 42.7h725.3c23.6 0 42.7-19.1 42.7-42.7V106.7c0-23.6-19.1-42.7-42.6-42.7z" fill="#000000" ></path><path d="M298.9 362.7h85.3c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3h-85.3c-11.8 0-21.3 9.6-21.3 21.3-0.1 11.7 9.5 21.3 21.3 21.3zM469.5 341.3c0 11.8 9.6 21.3 21.3 21.3h234.7c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H490.9c-11.8 0-21.4 9.6-21.4 21.3zM384.2 490.7h-85.3c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h85.3c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.5-21.3-21.3-21.3zM725.5 490.7H490.9c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h234.7c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.4-21.3zM384.2 661.3h-85.3c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h85.3c11.8 0 21.3-9.6 21.3-21.3 0-11.7-9.5-21.3-21.3-21.3zM725.5 661.3H490.9c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h234.7c11.8 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.4-21.3z" fill="#000000" ></path></symbol><symbol id="icon-tuiguangguanli" viewBox="0 0 1024 1024"><path d="M917.5 106.7H106.9c-23.6 0-42.7 19.1-42.7 42.7v725.3c0 23.6 19.1 42.7 42.7 42.7h362.7c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H128.2c-11.8 0-21.3-9.6-21.3-21.3V170.7c0-11.8 9.6-21.3 21.3-21.3h768c11.8 0 21.3 9.6 21.3 21.3v256c0 11.8 9.6 21.3 21.3 21.3 11.8 0 21.3-9.6 21.3-21.3V149.3c0.1-23.5-19-42.6-42.6-42.6z" fill="#000000" ></path><path d="M768.2 320c0-11.8-9.6-21.3-21.3-21.3H277.5c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h469.3c11.9 0 21.4-9.5 21.4-21.3zM277.5 448c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h170.7c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H277.5zM869.1 554.8c-7.6-13.3-21.7-21.5-37-21.5H661.7c-15.3 0-29.4 8.2-37 21.5l-85.5 149.3c-7.5 13.1-7.5 29.3 0 42.4l85.5 149.3c7.6 13.3 21.7 21.5 37 21.5h170.4c15.3 0 29.4-8.2 37-21.5l85.5-149.3c7.5-13.1 7.5-29.3 0-42.4l-85.5-149.3z m-37 319.9H661.7l-85.5-149.3L661.7 576h170.4l85.5 149.3-85.5 149.4z" fill="#000000" ></path><path d="M756.8 649.9c-8.3 8.3-8.3 21.8 0 30.2l23.9 23.9H661.5c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h119.2l-23.9 23.9c-8.3 8.3-8.3 21.8 0 30.2 8.3 8.3 21.8 8.3 30.2 0l60.3-60.3c2-2 3.5-4.3 4.6-6.9 1.1-2.6 1.6-5.4 1.6-8.1 0-2.8-0.6-5.5-1.6-8.2-1.1-2.6-2.6-4.9-4.5-6.8 0 0 0-0.1-0.1-0.1L787 650c-8.4-8.4-21.9-8.4-30.2-0.1z" fill="#000000" ></path></symbol><symbol id="icon-zhuantiguanli" viewBox="0 0 1024 1024"><path d="M874.9 64H149.5c-23.6 0-42.7 19.1-42.7 42.7v810.7c0 23.6 19.1 42.7 42.7 42.7h725.3c23.6 0 42.7-19.1 42.7-42.7V106.7c0-23.6-19.1-42.7-42.6-42.7z m0 832c0 11.8-9.6 21.3-21.3 21.3H170.9c-11.8 0-21.3-9.6-21.3-21.3V640h215c10.2 72.5 72.3 128 147.6 128s137.4-55.5 147.6-128h215v256z m0-298.7H639.2c-11.8 0-21.4 9.6-21.3 21.4 0 8.9-0.3 17.9-1 21.3-9.8 48.6-52.9 85.3-104.5 85.3s-94.7-36.7-104.5-85.3c-0.7-3.4-1.1-12.3-1-21.3 0-11.8-9.5-21.4-21.3-21.4H149.9V128c0-11.8 9.6-21.3 21.3-21.3h682.7c11.8 0 21.3 9.6 21.3 21.3v469.3z" fill="#000000" ></path><path d="M640.2 277.3h-256c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h256c11.8 0 21.3-9.6 21.3-21.3 0-11.7-9.5-21.3-21.3-21.3zM640.2 405.3h-256c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h256c11.8 0 21.3-9.6 21.3-21.3 0-11.7-9.5-21.3-21.3-21.3z" fill="#000000" ></path></symbol><symbol id="icon-xiaoshoushezhi" viewBox="0 0 1024 1024"><path d="M746.7 192H149.3c-23.6 0-42.7 19.1-42.7 42.7v682.7c0 23.6 19.1 42.7 42.7 42.7h597.3c23.6 0 42.7-19.1 42.7-42.7V234.7c0-23.6-19.1-42.7-42.6-42.7z m0 704c0 11.8-9.6 21.3-21.3 21.3H170.7c-11.8 0-21.3-9.6-21.3-21.3V256c0-11.8 9.6-21.3 21.3-21.3h554.7c11.8 0 21.3 9.6 21.3 21.3v640z" fill="#333333" ></path><path d="M874.7 64H256c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h597.3c11.8 0 21.3 9.6 21.3 21.3v682.7c0 11.8 9.6 21.3 21.3 21.3s21.3-9.6 21.3-21.3v-704c0.1-23.5-19-42.6-42.5-42.6zM277.3 618.7c-11.8 0-21.3 9.6-21.3 21.3v170.7c0 11.8 9.6 21.3 21.3 21.3 11.8 0 21.3-9.6 21.3-21.3V640c0.1-11.8-9.5-21.3-21.3-21.3zM448 704c-11.8 0-21.3 9.6-21.3 21.3v85.3c0 11.8 9.6 21.3 21.3 21.3s21.3-9.6 21.3-21.3v-85.3c0-11.7-9.5-21.3-21.3-21.3z" fill="#333333" ></path><path d="M618.7 533.3c-11.8 0-21.3 9.6-21.3 21.3v256c0 11.8 9.6 21.3 21.3 21.3 11.8 0 21.3-9.6 21.3-21.3v-256c0-11.7-9.6-21.3-21.3-21.3zM609.8 346.7L475.5 461.4 404.4 369c-7.8-7.8-20.3-8.4-28.8-1.3L242.3 476.1c-9 7.6-10.2 21-2.6 30 4.2 5 10.3 7.6 16.4 7.6 4.8 0 9.7-1.6 13.7-5l118.4-95.9 71.5 92.8c8 8 20.8 8.4 29.3 0.9l149.3-128c8.8-7.8 9.6-21.3 1.8-30.1-8-8.7-21.5-9.5-30.3-1.7z" fill="#333333" ></path></symbol><symbol id="icon-sucaiguanli" viewBox="0 0 1024 1024"><path d="M917.3 106.7H106.7c-23.6 0-42.7 19.1-42.7 42.7v725.3c0 23.6 19.1 42.7 42.7 42.7h810.7c23.6 0 42.7-19.1 42.7-42.7V149.3c-0.1-23.5-19.2-42.6-42.8-42.6z m0 746.6c0 11.8-9.6 21.3-21.3 21.3H128c-11.8 0-21.3-9.6-21.3-21.3V170.7c0-11.8 9.6-21.3 21.3-21.3h768c11.8 0 21.3 9.6 21.3 21.3v682.6z" fill="#333333" ></path><path d="M704 256c-58.9 0-106.7 47.8-106.7 106.7S645.1 469.3 704 469.3s106.7-47.8 106.7-106.7S762.9 256 704 256z m0 170.7c-35.3 0-64-28.7-64-64s28.7-64 64-64 64 28.7 64 64-28.7 64-64 64zM605 555.3c-20.3-7.9-41.2-11.6-61.6-11.6-38.5 0-75.7 13.2-105.5 36.6-7-53.5-42.7-101.4-96.9-121.1-16.9-6.1-34.1-9-51.1-9-32.4 0-63.5 10.8-89 29.9-12.3 9.2-11.6 27.9 1.7 35.6l0.2 0.1c7.1 4.1 16.1 3.9 22.6-1 18.2-13.8 40.7-21.9 64.5-21.9 30.2 0 59.6 12.9 83.4 37.9 14 14.7 19.8 34.6 22.3 54.8 1.9 15.4 11.9 28.5 26.2 34.4 5.2 2.1 10.7 3.2 16.1 3.2 9.4 0 18.7-3.1 26.3-9.1 22.6-17.7 50.8-27.5 79.2-27.5 21.2 0 42.1 5.3 61.5 15.8 22.4 12.1 39.5 32.4 50.4 55.5 19.1 40.5 18.2 74.3 7.4 102.3-3.8 9.9-0.2 21.1 9 26.4h0.1c11.1 6.4 25.7 1.8 30.3-10.1 6.7-17.1 10.8-35.9 11.1-56.9 1-71.3-41.9-138.6-108.2-164.3z" fill="#333333" ></path></symbol><symbol id="icon-yuangongdaoru" viewBox="0 0 1024 1024"><path d="M750.4 653.7c4.1 4.8 10 7.7 16.3 7.7 18.1 0 28.5-21.3 16.8-35.1-47.7-56.2-111.3-98.4-183.8-119.8 74.7-39.3 125.7-117.5 125.7-207.8C725.3 169.1 620.3 64 490.7 64S256 169.1 256 298.7c0 90.3 51.1 168.6 126 207.9-159.1 46.9-275.3 193.9-275.3 368.1 0 23.3 2.3 46.1 6.3 68.2 1.8 10 10.8 17.1 21 17.1h0.1c13.3 0 23.3-12 20.9-25.1-10.2-54.7-7.8-113.7 16.4-175.8 51.3-131.8 176-225 317.5-225.8 104.6-0.5 198.5 46.4 261.5 120.4z m-451.7-355c0-105.9 86.1-192 192-192s192 86.1 192 192-86.1 192-192 192-192-86.2-192-192z" fill="#2c2c2c" ></path><path d="M896 788.4H606.2l54.1-54.1c8.3-8.3 8.3-21.8 0-30.2-8.3-8.3-21.8-8.3-30.2 0l-90.5 90.5c-2 2-3.5 4.3-4.6 6.9-2.2 5.2-2.2 11.1 0 16.3 1.1 2.6 2.6 5 4.6 6.9l90.5 90.5c8.3 8.3 21.8 8.3 30.2 0 8.3-8.3 8.3-21.8 0-30.2l-54.1-54.1H896c11.8 0 21.3-9.6 21.3-21.3 0-11.6-9.5-21.2-21.3-21.2z" fill="#2c2c2c" ></path></symbol><symbol id="icon-shangpinguanli" viewBox="0 0 1024 1024"><path d="M355.2 243.2c-12.4 0-22.4 10-22.4 22.4v105.9c0 95.4 72 178.8 167.3 185 104.4 6.8 191.1-75.9 191.1-178.8v-112c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4V373c0 68.3-49 129.2-116.7 137.9-82 10.5-152.1-53.3-152.1-133.3v-112c0-12.4-10-22.4-22.4-22.4zM803.2 691.2c-61.9 0-112 50.1-112 112s50.1 112 112 112 112-50.1 112-112-50.1-112-112-112z m0 179.2c-37.1 0-67.2-30.1-67.2-67.2s30.1-67.2 67.2-67.2 67.2 30.1 67.2 67.2-30.1 67.2-67.2 67.2z" fill="#333333" ></path><path d="M915.2 64H108.8C84.1 64 64 84.1 64 108.8v806.4c0 24.7 20.1 44.8 44.8 44.8h492.8c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H131.2c-12.4 0-22.4-10-22.4-22.4V131.2c0-12.4 10-22.4 22.4-22.4h761.6c12.4 0 22.4 10 22.4 22.4v470.4c0 12.4 10 22.4 22.4 22.4 12.4 0 22.4-10 22.4-22.4V108.8c0-24.7-20.1-44.8-44.8-44.8z" fill="#333333" ></path></symbol><symbol id="icon-paikeguanli" viewBox="0 0 1024 1024"><path d="M915.2 64H108.8C84.1 64 64 84.1 64 108.8v806.4c0 24.7 20.1 44.8 44.8 44.8h806.4c24.7 0 44.8-20.1 44.8-44.8V108.8c0-24.7-20.1-44.8-44.8-44.8z m-672 851.2h-112c-12.4 0-22.4-10-22.4-22.4V288h134.4v627.2z m672-448h-112c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h112v179.2H534.4c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h380.8v156.8c0 12.4-10 22.4-22.4 22.4H288V736h112c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H288V512h380.8c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H288V288h627.2v179.2z m0-224H108.8v-112c0-12.4 10-22.4 22.4-22.4h761.6c12.4 0 22.4 10 22.4 22.4v112z" fill="#333333" ></path></symbol><symbol id="icon-xinxidaoru" viewBox="0 0 1024 1024"><path d="M554.7 426.7h-256c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h256c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3zM298.7 576c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h128c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3h-128zM298.7 320h426.7c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H298.7c-11.8 0-21.3 9.6-21.3 21.3-0.1 11.7 9.5 21.3 21.3 21.3zM896 707.7H648.8l23.9-23.9c8.3-8.3 8.3-21.8 0-30.2-8.3-8.3-21.8-8.3-30.2 0l-60.3 60.3s0 0.1-0.1 0.1c-1.9 2-3.5 4.3-4.5 6.8-2.2 5.2-2.2 11.1 0 16.3 2.2 5.2 6.3 9.4 11.5 11.5 2.6 1.1 5.3 1.6 8 1.6H896c11.8 0 21.3-9.6 21.3-21.3 0-11.7-9.5-21.2-21.3-21.2zM911.1 820.6s-0.1 0-0.1-0.1c-1.9-1.9-4.2-3.5-6.8-4.5-2.6-1.1-5.4-1.6-8.2-1.6H597.3c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h247.2l-23.9 23.9c-8.3 8.3-8.3 21.8 0 30.2 8.3 8.3 21.8 8.3 30.2 0l60.3-60.3c2-2 3.5-4.3 4.6-6.9 2.2-5.2 2.2-11.1 0-16.3-1.1-2.7-2.6-5.1-4.6-7z" fill="#333333" ></path><path d="M874.7 64H149.3c-23.6 0-42.7 19.1-42.7 42.7v810.7c0 23.6 19.1 42.7 42.7 42.7h341.3c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3h-320c-11.8 0-21.3-9.6-21.3-21.3V128c0-11.8 9.6-21.3 21.3-21.3h682.7c11.8 0 21.3 9.6 21.3 21.3v448c0 11.8 9.6 21.3 21.3 21.3s21.3-9.6 21.3-21.3V106.7c0.1-23.6-19-42.7-42.5-42.7z" fill="#333333" ></path></symbol><symbol id="icon-shoufeipeizhi" viewBox="0 0 1024 1024"><path d="M689.1 246.7c9.5-14.2-0.7-33.4-17.9-33.4-7.3 0-13.9 3.9-17.9 9.9-30.7 45.4-82.5 75.4-141.3 75.4-58.8 0-110.7-30-141.3-75.4-4.1-6-10.6-9.9-17.9-9.9-17.1 0-27.4 19.2-17.9 33.4 38.3 57 103.3 94.6 177.1 94.6s138.9-37.5 177.1-94.6zM704 533.3c-117.8 0-213.3 95.5-213.3 213.3S586.2 960 704 960c117.8 0 213.3-95.5 213.3-213.3S821.8 533.3 704 533.3z m0 384c-94.1 0-170.7-76.6-170.7-170.7S609.9 576 704 576s170.7 76.6 170.7 170.7S798.1 917.3 704 917.3z" fill="#333333" ></path><path d="M768 746.7c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3h-16.2l27.6-27.6c8.3-8.3 8.3-21.8 0-30.2-8.3-8.3-21.8-8.3-30.2 0L704 691.5l-45.3-45.3c-8.3-8.3-21.8-8.3-30.2 0-8.3 8.3-8.3 21.8 0 30.2l27.6 27.6H640c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h42.7V768H640c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h42.7v42.7c0 11.8 9.6 21.3 21.3 21.3s21.3-9.6 21.3-21.3v-42.7H768c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3h-42.7v-21.3H768z" fill="#333333" ></path><path d="M874.7 64H149.3c-23.6 0-42.7 19.1-42.7 42.7v810.7c0 23.6 19.1 42.7 42.7 42.7h277.3c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3h-256c-11.8 0-21.3-9.6-21.3-21.3V128c0-11.8 9.6-21.3 21.3-21.3h682.7c11.8 0 21.3 9.6 21.3 21.3v341.3c0 11.8 9.6 21.3 21.3 21.3s21.3-9.6 21.3-21.3V106.7c0.1-23.6-19-42.7-42.5-42.7z" fill="#333333" ></path><path d="M405.3 469.3h213.3c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H405.3c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3z" fill="#333333" ></path></symbol><symbol id="icon-yonghuquanxian" viewBox="0 0 1024 1024"><path d="M665.4 532.8c-20.9-10.8-42.9-19.6-65.8-26.4 85.1-44.7 139.5-140 122.7-246C706.1 158 620.8 77.1 517.8 65.5 376.1 49.6 256 160.1 256 298.7c0 90.3 51.1 168.6 126 207.9-159.1 46.9-275.3 193.9-275.3 368.1 0 23.3 2.3 46.1 6.3 68.2 1.8 10 10.8 17.1 21 17.1h0.1c13.3 0 23.3-12 20.9-25.1-10.8-58-7.4-120.9 21.1-187.2 50.3-117 158.4-202.2 285.3-213.1 70.5-6.1 136.6 10.1 193.3 41.4 23.7 0 31.9-32.3 10.7-43.2zM458.1 488c-79.5-13.1-143.6-77.3-156.7-156.7C279.7 200 392 87.7 523.2 109.4c79.5 13.1 143.6 77.2 156.7 156.7 21.8 131.2-90.6 243.6-221.8 221.9zM896 768h-42.7v-42.7c0-58.9-47.8-106.7-106.7-106.7S640 666.4 640 725.3V768h-42.7c-11.8 0-21.3 9.6-21.3 21.3v149.3c0 11.8 9.6 21.3 21.3 21.3H896c11.8 0 21.3-9.6 21.3-21.3V789.3c0-11.7-9.5-21.3-21.3-21.3z m-213.3-42.7c0-35.3 28.7-64 64-64s64 28.7 64 64V768h-128v-42.7z m192 192h-256V810.7h256v106.6z" fill="#333333" ></path></symbol><symbol id="icon-yuangongguanli" viewBox="0 0 1024 1024"><path d="M913.3 752.5l-88.9-160c-5.6-10.2-16.4-16.5-28-16.5H620.8c-11.6 0-22.3 6.3-28 16.5l-88.9 160c-5.4 9.7-5.4 21.4 0 31.1l88.9 160c5.6 10.2 16.4 16.5 28 16.5h175.7c11.6 0 22.3-6.3 28-16.5l88.9-160c5.3-9.7 5.3-21.5-0.1-31.1zM793.9 917.3H623.3L537.9 768l85.3-149.3h170.7L879.3 768l-85.4 149.3z" fill="#2c2c2c" ></path><path d="M708.6 682.7c-47.1 0-85.3 38.2-85.3 85.3 0 47.1 38.2 85.3 85.3 85.3s85.3-38.2 85.3-85.3c0-47.1-38.2-85.3-85.3-85.3z m0 128c-23.6 0-42.7-19.1-42.7-42.7s19.1-42.7 42.7-42.7 42.7 19.1 42.7 42.7-19.1 42.7-42.7 42.7zM512 533.3c129.6 0 234.7-105.1 234.7-234.7S641.6 64 512 64 277.3 169.1 277.3 298.7c0 90 50.7 168 125 207.4C231.9 553.9 106.7 710.2 106.7 896c0 15.5 1.1 30.7 2.9 45.7 1.3 10.5 10.5 18.3 21.1 18.3 12.6 0 22.6-10.8 21.1-23.3-1.6-13.4-2.5-26.9-2.5-40.7 0-200 162.7-362.7 362.7-362.7z m0-426.6c105.9 0 192 86.1 192 192v0.6c-56.1-7.3-98.5-76.2-99-77-3.6-6-9.6-9.8-16.4-10.2-6.8-0.6-13.4 1.9-17.9 7-41.8 47.8-87 72.7-134.4 74.5-47.9 1.9-88.3-20.1-111.6-36.6 19.1-85.9 95.8-150.3 187.3-150.3z m-191.7 198c27.5 16.2 66.1 31.7 110.6 31.7 2.1 0 4.3 0 6.4-0.2 52.5-1.7 102-25 147-69.3 21.1 26.6 62 68.6 114.6 74.9-19.6 85.2-95.9 148.9-187 148.9-103.7 0-188.4-82.9-191.6-186z" fill="#2c2c2c" ></path></symbol><symbol id="icon-gonghao" viewBox="0 0 1024 1024"><path d="M512 490.7c117.8 0 213.3-95.5 213.3-213.3C725.3 159.5 629.8 64 512 64c-117.8 0-213.3 95.5-213.3 213.3 0 117.9 95.5 213.4 213.3 213.4z m0-384c94.1 0 170.7 76.6 170.7 170.7S606.1 448.1 512 448.1s-170.7-76.6-170.7-170.7c0-94.2 76.6-170.7 170.7-170.7zM896 554.7H128c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h247.7c-20.3 21.6-33.3 49.8-34.3 81.4-2.2 72.5 55.9 131.9 127.9 131.9H704c35.2 0 64 28.8 64 64 0 18.8-8.3 35.6-21.3 47.4-4.9 4.1-7.9 10-7.9 16.6 0 11.7 9.6 21.3 21.3 21.3 2.3 0 4.5-0.4 6.6-1.1 1.5-0.4 3-1.1 4.3-1.9 1.9-1.3 3.6-2.8 5.3-4.5 0-0.2 0.2-0.2 0.4-0.4 20.9-19.4 33.9-46.7 33.9-77.4 0-58.9-47.8-106.7-106.7-106.7H473.1c-44.5 0-84.4-32.5-88.7-76.8-5-50.9 35.1-93.9 84.9-93.9H896c11.8 0 21.3-9.6 21.3-21.3 0-11.7-9.5-21.2-21.3-21.2z" fill="#2c2c2c" ></path></symbol><symbol id="icon-ziliaoguidang" viewBox="0 0 1024 1024"><path d="M266.7 202.7m-32 0a32 32 0 1 0 64 0 32 32 0 1 0-64 0Z" fill="#2c2c2c" ></path><path d="M394.7 202.7m-32 0a32 32 0 1 0 64 0 32 32 0 1 0-64 0Z" fill="#2c2c2c" ></path><path d="M522.7 202.7m-32 0a32 32 0 1 0 64 0 32 32 0 1 0-64 0Z" fill="#2c2c2c" ></path><path d="M277.3 512h192c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3h-192c-11.8 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3zM277.3 640h192c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3h-192c-11.8 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3zM768 554.7c0-58.9-47.8-106.7-106.7-106.7s-106.7 47.8-106.7 106.7 47.8 106.7 106.7 106.7S768 613.6 768 554.7z m-106.7 64c-35.3 0-64-28.7-64-64s28.7-64 64-64 64 28.7 64 64-28.7 64-64 64zM277.3 789.3H704c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H277.3c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3z" fill="#2c2c2c" ></path><path d="M896 704c11.8 0 21.3-9.6 21.3-21.3v-576c0-23.6-19.1-42.7-42.7-42.7H149.3c-23.6 0-42.7 19.1-42.7 42.7v810.7c0 23.6 19.1 42.7 42.7 42.7h725.3c23.6 0 42.7-19.1 42.7-42.7V810.7c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3V896c0 11.8-9.6 21.3-21.3 21.3H170.7c-11.8 0-21.3-9.6-21.3-21.3V341.3h725.3v341.3c0 11.8 9.5 21.4 21.3 21.4zM149.3 298.7V128c0-11.8 9.6-21.3 21.3-21.3h682.7c11.8 0 21.3 9.6 21.3 21.3v170.7H149.3z" fill="#2c2c2c" ></path></symbol><symbol id="icon-jiaoxue" viewBox="0 0 1024 1024"><path d="M803.2 243.2H489.6c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h313.6c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4zM803.2 377.6H668.8c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h134.4c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4z" fill="#2c2c2c" ></path><path d="M915.2 64H108.8C84.1 64 64 84.1 64 108.8v224c0 12.4 10 22.4 22.4 22.4s22.4-10 22.4-22.4v-224h806.4v806.4H758.4c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h156.8c24.7 0 44.8-20.1 44.8-44.8V108.8c0-24.7-20.1-44.8-44.8-44.8z" fill="#2c2c2c" ></path><path d="M709.8 613c-11.9-3.2-24.2 3.9-27.4 15.8l-58.7 219c-32.3-77.2-96.8-137.5-176.9-164 39.4-28.5 65.1-74.7 65.1-127 0-86.6-70.2-156.8-156.8-156.8-86.6 0-156.8 70.2-156.8 156.8 0 52.3 25.7 98.5 65.1 127C155.2 719.8 74.9 817.4 65 935.3c-1.1 13.2 9.1 24.7 22.4 24.7 11.5 0 21.3-8.7 22.2-20.1 10.3-126.5 116.5-226.3 245.6-226.3 129 0 235.2 99.7 245.6 226 0.2 2.2 0.9 4.2 1.7 6.2 0.3 0.8 0.4 1.6 0.8 2.3 0.7 1.3 1.7 2.2 2.6 3.4 0.9 1.1 1.6 2.2 2.7 3.1 0.9 0.8 2.1 1.3 3.2 2 1.4 0.8 2.7 1.6 4.3 2.1 0.4 0.1 0.7 0.4 1.1 0.5 0.9 0.2 1.8 0 2.7 0.2 1.1 0.2 2.1 0.6 3.2 0.6 0.5 0 0.9-0.3 1.4-0.3 1.7-0.1 3.3-0.6 4.9-1.1 1.3-0.4 2.6-0.7 3.8-1.3 1.3-0.7 2.4-1.7 3.6-2.6 1.1-0.9 2.3-1.7 3.3-2.8 0.8-1 1.3-2.2 2-3.3 0.9-1.5 1.8-3 2.3-4.7 0-0.2 0.2-0.3 0.2-0.4l81.2-302.9c3.1-12.1-4-24.4-16-27.6z m-354.6 55.8c-61.8 0-112-50.2-112-112s50.2-112 112-112 112 50.2 112 112-50.2 112-112 112z" fill="#2c2c2c" ></path></symbol><symbol id="icon-zhangfang" viewBox="0 0 1024 1024"><path d="M618.7 192h42.7v64h-42.7zM704 192h42.7v64H704zM789.3 192H832v64h-42.7zM789.3 469.3c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H234.7c-11.8 0-21.3 9.6-21.3 21.3v256c0 11.8 9.6 21.3 21.3 21.3h170.7c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H256V469.3h533.3z" fill="#333333" ></path><path d="M804.4 539.6c-8.3-8.3-21.8-8.3-30.2 0L698.8 615l-75.4-75.4c-8.3-8.3-21.8-8.3-30.2 0-8.3 8.3-8.3 21.8 0 30.2l48.9 48.9h-28.7c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h64V704h-64c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h64v64c0 11.8 9.6 21.3 21.3 21.3s21.3-9.6 21.3-21.3v-64h64c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3h-64v-42.7h64c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3h-28.7l48.9-48.9c8.6-8.4 8.6-21.9 0.2-30.2z" fill="#333333" ></path><path d="M938.7 426.7c11.8 0 21.3-9.6 21.3-21.3v-256c0-23.6-19.1-42.7-42.7-42.7H106.7c-23.6 0-42.7 19.1-42.7 42.7v725.3c0 23.6 19.1 42.7 42.7 42.7h810.7c23.6 0 42.7-19.1 42.7-42.7V512c0-11.8-9.6-21.3-21.3-21.3-11.8 0-21.3 9.6-21.3 21.3v341.3c0 11.8-9.6 21.3-21.3 21.3H128c-11.8 0-21.3-9.6-21.3-21.3v-512h810.7v64c-0.1 11.8 9.5 21.4 21.3 21.4z m-832-128v-128c0-11.8 9.6-21.3 21.3-21.3h768c11.8 0 21.3 9.6 21.3 21.3v128H106.7z" fill="#333333" ></path></symbol><symbol id="icon-ziliaoshezhi" viewBox="0 0 1024 1024"><path d="M874.7 64H217.9c-55.7 0-105.5 40.7-110.8 96.2-0.3 3.5-0.4 7-0.4 10.5h-0.1v746.7c0 23.6 19.1 42.7 42.7 42.7h256c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H170.7c-11.8 0-21.3-9.6-21.3-21.3V255.9c17.8 13.4 40 21.4 64 21.4h661.3V512c0 11.8 9.6 21.3 21.3 21.3s21.3-9.6 21.3-21.3V106.7c0-23.6-19.1-42.7-42.6-42.7z m0 106.7v64H215.9c-31 0-59.4-20.9-65.3-51.2-7.9-40.9 23.3-76.8 62.8-76.8h640c11.8 0 21.3 9.6 21.3 21.3v42.7z" fill="#2c2c2c" ></path><path d="M277.3 426.7h384c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3h-384c-11.8 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3zM277.3 554.7h213.3c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H277.3c-11.8 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3zM826.2 597.5c-7.6-13.3-21.7-21.5-37-21.5H618.8c-15.3 0-29.4 8.2-37 21.5l-85.5 149.3c-7.5 13.1-7.5 29.3 0 42.4l85.5 149.3c7.6 13.3 21.7 21.5 37 21.5h170.4c15.3 0 29.4-8.2 37-21.5l85.5-149.3c7.5-13.1 7.5-29.3 0-42.4l-85.5-149.3z m-37 319.8H618.8L533.3 768l85.5-149.3h170.4L874.7 768l-85.5 149.3z" fill="#2c2c2c" ></path><path d="M746.7 704h-85.3c-11.8 0-21.3 9.6-21.3 21.3v85.3c0 11.8 9.6 21.3 21.3 21.3h85.3c11.8 0 21.3-9.6 21.3-21.3v-85.3c0-11.7-9.6-21.3-21.3-21.3z m-21.4 85.3h-42.7v-42.7h42.7v42.7z" fill="#2c2c2c" ></path></symbol><symbol id="icon-jixiaotongji" viewBox="0 0 1024 1024"><path d="M676.1 823.3c20.5-19.4 33.3-46.7 33.3-77.2 0-58.8-47.8-106.6-106.7-106.6-58.9 0-106.7 47.7-106.7 106.6 0 30.5 12.8 57.8 33.3 77.2l-35.8 62c-1.9 3.4-2.8 7-2.8 10.7 0 7.2 3.8 14.5 10.7 18.5 10.2 5.8 23.3 2.3 29.2-7.9l35-60.5c3.4 1.3 6.8 2.3 10.5 3.2 8.5 2.3 17.5 3.4 26.7 3.4s18.1-1.1 26.7-3.4c3.6-0.9 7-1.9 10.5-3.2l35 60.5c6 10.2 19 13.6 29.2 7.9 6.8-4.1 10.7-11.3 10.7-18.5 0-3.6-0.9-7.2-2.8-10.7l-36-62z m-22.4-38.8c-2.1 3-4.7 5.8-7.5 8.3-7.9 7.2-17.5 12.8-28.4 15.3-3.6 0.9-7.5 1.5-11.3 1.7-1.3 0.2-2.6 0.2-3.8 0.2-1.3 0-2.6 0-3.8-0.2-3.8-0.2-7.7-0.9-11.3-1.7-10.9-2.6-20.5-8.1-28.4-15.3-2.8-2.6-5.3-5.3-7.5-8.3-8.1-10.7-13-24.1-13-38.4 0-35.2 28.8-63.9 64-63.9s64 28.8 64 63.9c0 14.3-4.9 27.8-13 38.4zM768 746.1c0 11.8 9.6 21.3 21.3 21.3h85.3c11.8 0 21.3-9.5 21.3-21.3s-9.6-21.3-21.3-21.3h-85.3c-11.7 0-21.3 9.6-21.3 21.3zM938.7 852.7H789.3c-11.8 0-21.3 9.5-21.3 21.3s9.6 21.3 21.3 21.3h149.3c11.8 0 21.3-9.5 21.3-21.3 0.1-11.7-9.5-21.3-21.2-21.3zM779.8 366l-128-85.3c-9.1-6.1-21.2-4.3-28.2 4.1L529.2 398l-112-74.6c-8.7-5.8-20.3-4.5-27.4 3.2L240.4 486.5c-8 8.6-7.6 22.1 1 30.1 4.1 3.8 9.4 5.7 14.6 5.7 5.7 0 11.4-2.3 15.6-6.8l137-146.7L521.5 444c9.1 6.1 21.2 4.3 28.2-4.1l94.4-113.2 112 74.6c9.8 6.5 23 3.9 29.6-5.9 6.6-9.6 3.9-22.8-5.9-29.4z" fill="#2c2c2c" ></path><path d="M917.3 106.7H106.7c-23.6 0-42.7 19.1-42.7 42.6V874c0 23.5 19.1 42.6 42.7 42.6h298.7c11.8 0 21.3-9.5 21.3-21.3s-9.6-21.3-21.3-21.3H128c-11.8 0-21.3-9.5-21.3-21.3V170.6c0-11.8 9.6-21.3 21.3-21.3h768c11.8 0 21.3 9.5 21.3 21.3v426.3c0 11.8 9.6 21.3 21.3 21.3 11.8 0 21.3-9.5 21.3-21.3V149.3c0.1-23.5-19-42.6-42.6-42.6z" fill="#2c2c2c" ></path></symbol><symbol id="icon-zhaopin" viewBox="0 0 1024 1024"><path d="M760.5 683.8c39.4-28.5 65.1-74.7 65.1-127 0-86.6-70.2-156.8-156.8-156.8-86.6 0-156.8 70.2-156.8 156.8 0 52.3 25.7 98.5 65.1 127-108.4 36-188.6 133.6-198.5 251.5-1.1 13.2 9.1 24.7 22.4 24.7 11.5 0 21.3-8.7 22.2-20.1 10.3-126.5 116.5-226.3 245.6-226.3s235.3 99.8 245.6 226.3c0.9 11.5 10.7 20.1 22.2 20.1 13.3 0 23.5-11.5 22.4-24.7-9.9-117.9-90.2-215.5-198.5-251.5z m-91.7-15c-61.8 0-112-50.2-112-112s50.2-112 112-112 112 50.2 112 112-50.2 112-112 112zM243.2 288h358.4c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H243.2c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4zM243.2 422.4h134.4c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H243.2c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4z" fill="#2c2c2c" ></path><path d="M915.2 64H108.8C84.1 64 64 84.1 64 108.8v806.4c0 24.7 20.1 44.8 44.8 44.8h156.8c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H131.2c-12.4 0-22.4-10-22.4-22.4V131.2c0-12.4 10-22.4 22.4-22.4h761.6c12.4 0 22.4 10 22.4 22.4v201.6c0 12.4 10 22.4 22.4 22.4 12.4 0 22.4-10 22.4-22.4v-224c0-24.7-20.1-44.8-44.8-44.8zM742.2 795.1l-88.5 88.5-47.5-47.6c-8.7-8.7-22.9-8.7-31.7 0-8.7 8.7-8.7 22.9 0 31.7l63.3 63.3v0.1c4.4 4.4 10.1 6.6 15.9 6.6 5.7 0 11.5-2.2 15.8-6.6v-0.1l104.2-104.2c8.7-8.7 8.7-22.9 0-31.7-8.6-8.8-22.7-8.8-31.5 0z" fill="#2c2c2c" ></path></symbol><symbol id="icon-kaoshijihua" viewBox="0 0 1024 1024"><path d="M748.5 719.1c38.2-27.1 63.1-71.5 63.1-121.8 0-82.5-66.9-149.3-149.3-149.3-82.5 0-149.3 66.9-149.3 149.3 0 50.3 25 94.8 63.1 121.8-91.9 32.9-159.6 116.6-168.7 217.4-1.1 12.6 8.7 23.5 21.3 23.5 10.8 0 20.2-8 21.1-18.7 9.5-108.9 101.2-194.6 212.5-194.6s203 85.7 212.5 194.6c0.9 10.7 10.3 18.7 21.1 18.7 12.6 0 22.5-10.9 21.3-23.5-9.1-100.8-76.8-184.5-168.7-217.4zM662.3 704c-58.8 0-106.7-47.9-106.7-106.7s47.9-106.7 106.7-106.7S769 538.5 769 597.3 721.1 704 662.3 704z" fill="#2c2c2c" ></path><path d="M874.7 64H149.3c-23.6 0-42.7 19.1-42.7 42.7v810.7c0 23.6 19.1 42.7 42.7 42.7h149.3c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3h-128c-11.8 0-21.3-9.6-21.3-21.3V128c0-11.8 9.6-21.3 21.3-21.3h682.7c11.8 0 21.3 9.6 21.3 21.3v256c0 11.8 9.6 21.3 21.3 21.3 11.8 0 21.3-9.6 21.3-21.3V106.7c0.1-23.6-19-42.7-42.5-42.7z" fill="#2c2c2c" ></path><path d="M277.3 277.3h469.3c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H277.3c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3zM277.3 405.3H448c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H277.3c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3z" fill="#2c2c2c" ></path></symbol><symbol id="icon-jingpinketang" viewBox="0 0 1024 1024"><path d="M917.3 106.7H106.7c-23.6 0-42.7 19.1-42.7 42.7v725.3c0 23.6 19.1 42.7 42.7 42.7h810.7c23.6 0 42.7-19.1 42.7-42.7V149.3c-0.1-23.5-19.2-42.6-42.8-42.6z m0 746.6c0 11.8-9.6 21.3-21.3 21.3H128c-11.8 0-21.3-9.6-21.3-21.3V746.7h515c9.5 36.7 42.6 64 82.3 64 39.7 0 72.8-27.3 82.3-64h131v106.6z m-256-128c0-23.5 19.1-42.7 42.7-42.7s42.7 19.1 42.7 42.7c0 23.5-19.1 42.7-42.7 42.7s-42.7-19.1-42.7-42.7z m256-21.3h-131c-9.5-36.7-42.6-64-82.3-64-39.7 0-72.8 27.3-82.3 64h-515V170.7c0-11.8 9.6-21.3 21.3-21.3h768c11.8 0 21.3 9.6 21.3 21.3V704z" fill="#333333" ></path><path d="M671.6 402.2L437.3 268.3c-3.4-2-7-2.8-10.6-2.8-11.1 0-21.4 8.9-21.4 21.4v267.8c0 12.4 10.2 21.4 21.4 21.4 3.5 0 7.1-0.9 10.6-2.8l234.3-133.9c14.3-8.3 14.3-29 0-37.2zM448 517.9V323.6l170 97.1-170 97.2z" fill="#333333" ></path></symbol><symbol id="icon-yuangongtidian" viewBox="0 0 1024 1024"><path d="M469.3 512c-192.4 0-320-64.2-320-106.7V283.6c61 47.1 181.4 79.1 320 79.1s259-32 320-79.1v143.1c0 11.8 9.6 21.3 21.3 21.3 11.8 0 21.3-9.6 21.3-21.3V213.3C832 130.9 669.6 64 469.3 64s-362.7 66.9-362.7 149.3v597.3c0 78.8 148.5 143.2 336.5 148.8-6.5-14.1-12.4-28.5-17.3-43.4-167.8-8.7-276.5-66.3-276.5-105.4v-143c51.8 39.9 146.4 69 258.6 76.9 1.6-14.4 4-28.5 7-42.4-161.6-10.6-265.7-66.4-265.7-104.7V475.6c62.7 48.3 187.9 80.8 331.2 79 0.1 0 0.1-0.1 0.2-0.1 11.1-15.5 23.2-30.2 36.3-44-15.4 0.9-31.1 1.5-47.6 1.5z m0-405.3c192.4 0 320 64.2 320 106.7S661.7 320 469.3 320s-320-64.2-320-106.7 127.7-106.6 320-106.6z" fill="#2c2c2c" ></path><path d="M704 533.3c-117.8 0-213.3 95.5-213.3 213.3S586.2 960 704 960c117.8 0 213.3-95.5 213.3-213.3S821.8 533.3 704 533.3z m0 384c-94.1 0-170.7-76.6-170.7-170.7S609.9 576 704 576s170.7 76.6 170.7 170.7S798.1 917.3 704 917.3z" fill="#2c2c2c" ></path><path d="M768 746.7c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3h-16.2l27.6-27.6c8.3-8.3 8.3-21.8 0-30.2-8.3-8.3-21.8-8.3-30.2 0L704 691.5l-45.3-45.3c-8.3-8.3-21.8-8.3-30.2 0-8.3 8.3-8.3 21.8 0 30.2l27.6 27.6H640c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h42.7V768H640c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h42.7v42.7c0 11.8 9.6 21.3 21.3 21.3s21.3-9.6 21.3-21.3v-42.7H768c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3h-42.7v-21.3H768z" fill="#2c2c2c" ></path></symbol><symbol id="icon-kaoshi" viewBox="0 0 1024 1024"><path d="M927.2 330.7c-43.7-43.7-114.7-43.7-158.4 0L515.4 584.2c-38.3 38.3-43.1 97.5-14.2 141l-17.4 17.4c-8.7 8.7-8.7 22.9 0 31.7 8.7 8.7 22.9 8.7 31.7 0l17.4-17.4c43.5 28.8 102.6 24.1 141-14.2l253.4-253.4c43.6-43.9 43.6-114.8-0.1-158.6zM642.1 710.9c-26.2 26.2-68.8 26.2-95 0-26.2-26.2-26.2-68.8 0-95l126.7-126.7 95 95-126.7 126.7z m253.4-253.4l-95 95-95-95 95-95c26.2-26.2 68.8-26.2 95 0 26.2 26.1 26.2 68.8 0 95z" fill="#2c2c2c" ></path><path d="M736 892.8c0 12.4-10 22.4-22.4 22.4H131.2c-12.4 0-22.4-10-22.4-22.4V131.2c0-12.4 10-22.4 22.4-22.4h582.4c12.4 0 22.4 10 22.4 22.4V288l44.8-44.8V108.8c0-24.7-20.1-44.8-44.8-44.8H108.8C84.1 64 64 84.1 64 108.8v806.4c0 24.7 20.1 44.8 44.8 44.8H736c24.7 0 44.8-20.1 44.8-44.8V736L736 780.8v112z" fill="#2c2c2c" ></path><path d="M556.8 288c0-12.4-10-22.4-22.4-22.4H220.8c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h313.6c12.4 0 22.4-10 22.4-22.4zM220.8 400c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4H400c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H220.8z" fill="#2c2c2c" ></path></symbol><symbol id="icon-jiaoxueanpai" viewBox="0 0 1024 1024"><path d="M461.3 246.9c-4.2-2.5-8.8-3.7-13.2-3.7-13.4 0-25.7 10.7-25.7 25.7v217.4c0 15 12.3 25.7 25.7 25.7 4.4 0 8.9-1.2 13.2-3.7l181.1-108.7c16.6-10 16.6-34.1 0-44L461.3 246.9z m5.9 205.6V302.7L592 377.6l-124.8 74.9z" fill="#2c2c2c" ></path><path d="M937.6 243.2c12.4 0 22.4-10 22.4-22.4v-112c0-24.7-20.1-44.8-44.8-44.8H108.8C84.1 64 64 84.1 64 108.8v537.6c0 24.7 20.1 44.8 44.8 44.8H382L246.2 926.4c-6.2 10.7-2.5 24.4 8.2 30.6 10.7 6.2 24.4 2.5 30.6-8.2l145.6-252.2c1-1.7 1.3-3.6 1.8-5.4h159.2c0.5 1.8 0.8 3.7 1.8 5.4L739 948.8c6.2 10.7 19.9 14.4 30.6 8.2 10.7-6.2 14.4-19.9 8.2-30.6L642 691.2h273.2c24.7 0 44.8-20.1 44.8-44.8V400c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v246.4H108.8V243.2h156.8c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H108.8v-89.6h806.4v112c0 12.4 10 22.4 22.4 22.4z" fill="#2c2c2c" ></path></symbol><symbol id="icon-mianshoujiaoxue" viewBox="0 0 1024 1024"><path d="M725.3 384H298.7c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h426.7c11.8 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.4-21.3zM725.3 512H298.7c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h426.7c11.8 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.4-21.3z" fill="#333333" ></path><path d="M896 341.3c11.8 0 21.3-9.6 21.3-21.3v-85.3c0-23.6-19.1-42.7-42.7-42.7H533.3V85.3c0-11.8-9.6-21.3-21.3-21.3-11.8 0-21.3 9.6-21.3 21.3V192H149.3c-23.6 0-42.7 19.1-42.7 42.7V704c0 23.6 19.1 42.7 42.7 42.7h238.4L283 928c-5.9 10.2-2.4 23.3 7.8 29.1 10.2 5.9 23.3 2.4 29.1-7.8l117-202.7h152.8l117 202.7c5.9 10.2 18.9 13.7 29.1 7.8 10.2-5.9 13.7-18.9 7.8-29.1L639.1 746.7h235.6c23.6 0 42.7-19.1 42.7-42.7V490.7c0-11.8-9.6-21.3-21.3-21.3-11.8 0-21.3 9.6-21.3 21.3V704H149.3V234.7h725.3V320c0.1 11.8 9.6 21.3 21.4 21.3z" fill="#333333" ></path></symbol><symbol id="icon-xuetangguanli" viewBox="0 0 1024 1024"><path d="M725.3 405.3c0-23.6-19.1-42.7-42.7-42.7H341.3c-23.6 0-42.7 19.1-42.7 42.7V576c0 23.6 19.1 42.7 42.7 42.7h341.3c23.6 0 42.7-19.1 42.7-42.7V405.3zM682.7 576H341.3V405.3h341.3V576zM320 704c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h384c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H320z" fill="#2c2c2c" ></path><path d="M938.7 277.3c11.8 0 21.3-9.6 21.3-21.3V149.3c0-23.6-19.1-42.7-42.7-42.7H106.7c-23.6 0-42.7 19.1-42.7 42.7v725.3c0 23.6 19.1 42.7 42.7 42.7h810.7c23.6 0 42.7-19.1 42.7-42.7v-448c0-11.8-9.6-21.3-21.3-21.3-11.8 0-21.3 9.6-21.3 21.3v448H106.7V149.3h810.7V256c-0.1 11.8 9.5 21.3 21.3 21.3z" fill="#2c2c2c" ></path></symbol><symbol id="icon-chengjiliebiao" viewBox="0 0 1024 1024"><path d="M758.4 355.2H624c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h134.4c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4zM758.4 489.6H624c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h134.4c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4zM265.6 758.4h492.8c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H265.6c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4zM286.2 588l42.2-98.4h143.3l42.2 98.4c3.6 8.5 11.9 13.6 20.6 13.6 3 0 5.9-0.6 8.8-1.8 11.4-4.9 16.6-18 11.8-29.4L420.6 256.8c-3.5-8.2-11.6-13.6-20.6-13.6s-17.1 5.3-20.6 13.6L245 570.4c-4.9 11.4 0.4 24.5 11.8 29.4 11.3 4.9 24.5-0.4 29.4-11.8zM400 322.5l52.4 122.3H347.6L400 322.5z" fill="#2c2c2c" ></path><path d="M937.6 220.8c12.4 0 22.4-10 22.4-22.4v-89.6c0-24.7-20.1-44.8-44.8-44.8H108.8C84.1 64 64 84.1 64 108.8v806.4c0 24.7 20.1 44.8 44.8 44.8h806.4c24.7 0 44.8-20.1 44.8-44.8v-560c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v560H108.8V108.8h806.4v89.6c0 12.4 10 22.4 22.4 22.4z" fill="#2c2c2c" ></path></symbol><symbol id="icon-kejian" viewBox="0 0 1024 1024"><path d="M601.6 355.2c0-61.9-50.1-112-112-112h-224c-12.4 0-22.4 10-22.4 22.4v425.6c0 12.4 10 22.4 22.4 22.4 12.4 0 22.4-10 22.4-22.4v-224h201.6c61.9 0 112-50.1 112-112zM288 288h201.6c37.1 0 67.2 30.1 67.2 67.2s-30.1 67.2-67.2 67.2H288V288zM758.4 624H579.2c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h179.2c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4zM400 780.8h358.4c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H400c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4z" fill="#333333" ></path><path d="M937.6 265.6c12.4 0 22.4-10 22.4-22.4V108.8c0-24.7-20.1-44.8-44.8-44.8H108.8C84.1 64 64 84.1 64 108.8v806.4c0 24.7 20.1 44.8 44.8 44.8h806.4c24.7 0 44.8-20.1 44.8-44.8V422.4c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v492.8H108.8V108.8h806.4v134.4c0 12.4 10 22.4 22.4 22.4z" fill="#333333" ></path></symbol><symbol id="icon-waibukejian" viewBox="0 0 1024 1024"><path d="M265.6 780.8h492.8c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H265.6c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4zM265.6 668.8h224c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4h-224c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4z" fill="#333333" ></path><path d="M937.6 489.6c12.4 0 22.4-10 22.4-22.4V332.8c0-24.7-20.1-44.8-44.8-44.8H646.4V108.8c0-24.7-20.1-44.8-44.8-44.8H108.8C84.1 64 64 84.1 64 108.8v806.4c0 24.7 20.1 44.8 44.8 44.8h806.4c24.7 0 44.8-20.1 44.8-44.8V624c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v291.2H108.8V108.8h492.8V288c0 11.9 4.7 23.3 13.1 31.7 8.4 8.4 19.8 13.1 31.7 13.1h268.8v134.4c0 12.4 10 22.4 22.4 22.4z" fill="#333333" ></path><path d="M265.6 556.8c12.4 0 22.4-10 22.4-22.4v-112h89.6c49.5 0 89.6-40.1 89.6-89.6s-40.1-89.6-89.6-89.6h-112c-12.4 0-22.4 10-22.4 22.4v268.8c0 12.4 10 22.4 22.4 22.4zM288 288h89.6c24.7 0 44.8 20.1 44.8 44.8 0 24.7-20.1 44.8-44.8 44.8H288V288z" fill="#333333" ></path></symbol><symbol id="icon-rizhiguanli" viewBox="0 0 1024 1024"><path d="M265.6 624h179.2c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H265.6c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4zM265.6 758.4h492.8c12.4 0 22.4-10 22.4-22.4s-10-22.4-22.4-22.4H265.6c-12.4 0-22.4 10-22.4 22.4s10 22.4 22.4 22.4z" fill="#333333" ></path><path d="M937.6 556.8c12.4 0 22.4-10 22.4-22.4V176c0-12.4-10-22.4-22.4-22.4H736V86.4C736 74 726 64 713.6 64c-12.4 0-22.4 10-22.4 22.4v67.2H332.8V86.4c0-12.4-10-22.4-22.4-22.4S288 74 288 86.4v67.2H86.4C74 153.6 64 163.6 64 176v761.6C64 950 74 960 86.4 960h851.2c12.4 0 22.4-10 22.4-22.4V691.2c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v224H108.8V444.8h806.4v89.6c0 12.4 10 22.4 22.4 22.4zM108.8 400V198.4H288v67.2c0 12.4 10 22.4 22.4 22.4s22.4-10 22.4-22.4v-67.2h358.4v67.2c0 12.4 10 22.4 22.4 22.4 12.4 0 22.4-10 22.4-22.4v-67.2h179.2V400H108.8z" fill="#333333" ></path></symbol><symbol id="icon-mobanguanli" viewBox="0 0 1024 1024"><path d="M469.3 640h128c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3h-128c-11.8 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3zM469.3 746.7H768c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H469.3c-11.8 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3z" fill="#333333" ></path><path d="M938.7 277.3c11.8 0 21.3-9.6 21.3-21.3V149.3c0-23.6-19.1-42.7-42.7-42.7H106.7c-23.6 0-42.7 19.1-42.7 42.7v725.3c0 23.6 19.1 42.7 42.7 42.7h810.7c23.6 0 42.7-19.1 42.7-42.7V384c0-11.8-9.6-21.3-21.3-21.3-11.8 0-21.3 9.6-21.3 21.3v64H362.7V149.3h554.7V256c-0.1 11.8 9.5 21.3 21.3 21.3zM320 874.7H106.7V149.3H320v725.4z m597.3-384v384H362.7v-384h554.6z" fill="#333333" ></path></symbol><symbol id="icon-yiyichuli" viewBox="0 0 1024 1024"><path d="M377.6 288H512c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H377.6c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4zM377.6 400h224c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4h-224c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4z" fill="#333333" ></path><path d="M803.2 270.1V108.8c0-24.7-20.1-44.8-44.8-44.8H265.6c-24.7 0-44.8 20.1-44.8 44.8v161.3L64 332.8v582.4c0 24.7 20.1 44.8 44.8 44.8h806.4c24.7 0 44.8-20.1 44.8-44.8V758.4c0-12.4-10-22.4-22.4-22.4s-22.4 10-22.4 22.4v156.8H108.8V415.4l354.4 230.3c14.6 9.5 31.5 14.5 48.8 14.5 17.4 0 34.3-5 48.8-14.5l354.4-230.3V624c0 12.4 10 22.4 22.4 22.4s22.4-10 22.4-22.4V332.8l-156.8-62.7zM220.8 434.7l-110.8-72 110.8-44.3v116.3z m537.6-182.5v211.7l-222 144.3c-7.4 4.8-15.9 7.2-24.4 7.2-8.5 0-17-2.4-24.4-7.2l-222-144.3V108.8h492.8v143.4z m44.8 182.5V318.3L914 362.7l-110.8 72z" fill="#333333" ></path></symbol><symbol id="icon-gongwenshenbao" viewBox="0 0 1024 1024"><path d="M489.6 422.4c0-12.4-10-22.4-22.4-22.4H288c-12.4 0-22.4 10-22.4 22.4s10 22.4 22.4 22.4h67.2v156.8c0 12.4 10 22.4 22.4 22.4 12.4 0 22.4-10 22.4-22.4V444.8h67.2c12.4 0 22.4-10 22.4-22.4zM288 713.6c-12.4 0-22.4 10-22.4 22.4s10 22.4 22.4 22.4h179.2c12.4 0 22.4-10 22.4-22.4s-10-22.4-22.4-22.4H288zM758.4 288c0-12.4-10-22.4-22.4-22.4H288c-12.4 0-22.4 10-22.4 22.4s10 22.4 22.4 22.4h448c12.4 0 22.4-10 22.4-22.4zM646.4 758.4c12.4 0 22.4-10 22.4-22.4V484.3l72.4 86.9c4.4 5.3 10.8 8 17.2 8 5.1 0 10.1-1.7 14.3-5.2 9.5-7.9 10.8-22 2.9-31.6L663.6 408c-8.5-10.2-25.9-10.2-34.4 0l-112 134.4c-7.9 9.5-6.6 23.6 2.9 31.6 9.5 7.9 23.6 6.6 31.6-2.9l72.4-86.9V736c-0.1 12.4 9.9 22.4 22.3 22.4z" fill="#2c2c2c" ></path><path d="M937.6 579.2c12.4 0 22.4-10 22.4-22.4V377.6C960 204.4 819.6 64 646.4 64H108.8C84.1 64 64 84.1 64 108.8v806.4c0 24.7 20.1 44.8 44.8 44.8h806.4c24.7 0 44.8-20.1 44.8-44.8V713.6c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v201.6H108.8V108.8h537.6c148.5 0 268.8 120.3 268.8 268.8v179.2c0 12.4 10 22.4 22.4 22.4z" fill="#2c2c2c" ></path></symbol><symbol id="icon-gongwen" viewBox="0 0 1024 1024"><path d="M400 512c12.4 0 22.4-10 22.4-22.4V332.8H512c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H288c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h89.6v156.8c0 12.4 10 22.4 22.4 22.4zM736 467.2H556.8c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4H736c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4zM758.4 624c0-12.4-10-22.4-22.4-22.4H288c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h448c12.4 0 22.4-10 22.4-22.4zM288 713.6c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h224c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H288z" fill="#2c2c2c" ></path><path d="M937.6 220.8c12.4 0 22.4-10 22.4-22.4v-89.6c0-24.7-20.1-44.8-44.8-44.8H108.8C84.1 64 64 84.1 64 108.8v806.4c0 24.7 20.1 44.8 44.8 44.8h806.4c24.7 0 44.8-20.1 44.8-44.8V377.6c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v537.6H108.8V108.8h806.4v89.6c0 12.4 10 22.4 22.4 22.4z" fill="#2c2c2c" ></path></symbol><symbol id="icon-gongwenbianji" viewBox="0 0 1024 1024"><path d="M797.1 460.2c8.7-8.7 8.7-22.9 0-31.7-8.7-8.7-22.9-8.7-31.7 0L512 681.9v31.7h31.7l253.4-253.4zM288 355.2h358.4c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H288c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4zM534.4 467.2c0-12.4-10-22.4-22.4-22.4H288c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h224c12.4 0 22.4-10 22.4-22.4z" fill="#2c2c2c" ></path><path d="M937.6 624c12.4 0 22.4-10 22.4-22.4V108.8c0-24.7-20.1-44.8-44.8-44.8H108.8C84.1 64 64 84.1 64 108.8v806.4c0 24.7 20.1 44.8 44.8 44.8h806.4c24.7 0 44.8-20.1 44.8-44.8V758.4c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v156.8H108.8V108.8h806.4v492.8c0 12.4 10 22.4 22.4 22.4z" fill="#2c2c2c" ></path><path d="M288 601.6c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h89.6c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H288z" fill="#2c2c2c" ></path></symbol><symbol id="icon-gongwenxinzeng" viewBox="0 0 1024 1024"><path d="M725.3 341.3c0-11.8-9.6-21.3-21.3-21.3H320c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h384c11.8 0.1 21.3-9.5 21.3-21.3zM554.7 469.3c0-11.8-9.6-21.3-21.3-21.3H320c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h213.3c11.8 0.1 21.4-9.5 21.4-21.3zM320 576c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h128c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H320z" fill="#2c2c2c" ></path><path d="M874.7 64H149.3c-23.6 0-42.7 19.1-42.7 42.7v810.7c0 23.6 19.1 42.7 42.7 42.7h405.3c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H149.3V106.7h725.3v512c0 11.8 9.6 21.3 21.3 21.3s21.3-9.6 21.3-21.3v-512c0.1-23.6-19-42.7-42.5-42.7z" fill="#2c2c2c" ></path><path d="M853.3 746.7H746.7V640c0-11.8-9.6-21.3-21.3-21.3-11.8 0-21.3 9.6-21.3 21.3v106.7H597.3c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3H704V896c0 11.8 9.6 21.3 21.3 21.3 11.8 0 21.3-9.6 21.3-21.3V789.3h106.7c11.8 0 21.3-9.6 21.3-21.3 0.1-11.8-9.5-21.3-21.3-21.3z" fill="#2c2c2c" ></path></symbol><symbol id="icon-mokuaishezhi" viewBox="0 0 1024 1024"><path d="M422.4 64H108.8C84.1 64 64 84.1 64 108.8v313.6c0 24.7 20.1 44.8 44.8 44.8h313.6c24.7 0 44.8-20.1 44.8-44.8V108.8c0-24.7-20.1-44.8-44.8-44.8z m0 358.4H108.8V108.8h313.6v313.6zM422.4 556.8H108.8c-24.7 0-44.8 20.1-44.8 44.8v313.6c0 24.7 20.1 44.8 44.8 44.8h313.6c24.7 0 44.8-20.1 44.8-44.8V601.6c0-24.7-20.1-44.8-44.8-44.8z m0 358.4H108.8V601.6h313.6v313.6zM915.2 64H601.6c-24.7 0-44.8 20.1-44.8 44.8v313.6c0 24.7 20.1 44.8 44.8 44.8h313.6c24.7 0 44.8-20.1 44.8-44.8V108.8c0-24.7-20.1-44.8-44.8-44.8z m0 358.4H601.6V108.8h313.6v313.6zM601.6 736c-12.4 0-22.4 10-22.4 22.4v179.2c0 12.4 10 22.4 22.4 22.4 12.4 0 22.4-10 22.4-22.4V758.4c0-12.4-10-22.4-22.4-22.4zM713.6 736c-12.4 0-22.4 10-22.4 22.4v179.2c0 12.4 10 22.4 22.4 22.4 12.4 0 22.4-10 22.4-22.4V758.4c0-12.4-10-22.4-22.4-22.4zM825.6 646.4c-12.4 0-22.4 10-22.4 22.4v268.8c0 12.4 10 22.4 22.4 22.4 12.4 0 22.4-10 22.4-22.4V668.8c0-12.4-10-22.4-22.4-22.4zM937.6 601.6c-12.4 0-22.4 10-22.4 22.4v313.6c0 12.4 10 22.4 22.4 22.4 12.4 0 22.4-10 22.4-22.4V624c0-12.4-10-22.4-22.4-22.4z" fill="#333333" ></path></symbol><symbol id="icon-ziliaoguanli" viewBox="0 0 1024 1024"><path d="M309.3 309.3m-32 0a32 32 0 1 0 64 0 32 32 0 1 0-64 0Z" fill="#333333" ></path><path d="M437.3 309.3m-32 0a32 32 0 1 0 64 0 32 32 0 1 0-64 0Z" fill="#333333" ></path><path d="M565.3 309.3m-32 0a32 32 0 1 0 64 0 32 32 0 1 0-64 0Z" fill="#333333" ></path><path d="M298.7 490.7h256c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3h-256c-11.8 0-21.3 9.6-21.3 21.3-0.1 11.7 9.5 21.3 21.3 21.3zM298.7 597.3h256c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3h-256c-11.8 0-21.3 9.6-21.3 21.3-0.1 11.8 9.5 21.3 21.3 21.3zM298.7 725.3h426.7c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H298.7c-11.8 0-21.3 9.6-21.3 21.3-0.1 11.8 9.5 21.3 21.3 21.3z" fill="#333333" ></path><path d="M896 362.7c11.8 0 21.3-9.6 21.3-21.3V106.7c0-23.6-19.1-42.7-42.7-42.7H149.3c-23.6 0-42.7 19.1-42.7 42.7v810.7c0 23.6 19.1 42.7 42.7 42.7h725.3c23.6 0 42.7-19.1 42.7-42.7V512c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3v405.3H149.3V106.7h725.3v234.7c0.1 11.7 9.6 21.3 21.4 21.3z" fill="#333333" ></path></symbol><symbol id="icon-yingyongguanli1" viewBox="0 0 1024 1024"><path d="M896 490.7c11.8 0 21.3-9.6 21.3-21.3V309.9c0-2-0.5-3.9-0.8-5.8 1.3-5.1 0.9-10.8-1.9-15.8-2.3-4.1-5.9-6.9-9.9-8.7-2.7-2.7-5.8-5-9.2-6.9L532.9 69.4c-6.5-3.6-13.7-5.4-20.9-5.4s-14.4 1.8-20.9 5.4L128.5 272.7c-3.4 1.9-6.5 4.3-9.2 6.9-4 1.8-7.6 4.6-9.9 8.7-2.8 5-3.3 10.6-1.9 15.8-0.3 1.9-0.8 3.8-0.8 5.8v404.2c0 15.4 8.3 29.7 21.8 37.2l362.7 203.2c6.5 3.6 13.7 5.4 20.9 5.4s14.4-1.8 20.9-5.4l362.7-203.2c13.5-7.5 21.8-21.8 21.8-37.2V597.3c0-11.8-9.6-21.3-21.3-21.3-11.8 0-21.3 9.6-21.3 21.3v116.8L533.3 905.4V524.6L874.6 335v134.4c0.1 11.7 9.6 21.3 21.4 21.3z m-384-384l155.6 87.2L332 387.6 170.7 298 512 106.7z m-21.3 798.7L149.3 714.1V334.9l341.3 189.6v380.9zM512 487.6l-136.5-75.9 335.4-193.6 142.5 79.8L512 487.6z" fill="#333333" ></path></symbol><symbol id="icon-wenjuan" viewBox="0 0 1024 1024"><path d="M725.3 277.3c0-23.6-19.1-42.7-42.7-42.7H341.3c-23.6 0-42.7 19.1-42.7 42.7v85.3c0 23.6 19.1 42.7 42.7 42.7h341.3c23.6 0 42.7-19.1 42.7-42.7v-85.3z m-42.6 85.4H341.3v-85.3h341.3v85.3zM704 469.3H320c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h384c11.8 0 21.3-9.6 21.3-21.3 0-11.7-9.5-21.3-21.3-21.3zM320 576c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h298.7c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H320z" fill="#2c2c2c" ></path><path d="M704 597.3m-21.3 0a21.3 21.3 0 1 0 42.6 0 21.3 21.3 0 1 0-42.6 0Z" fill="#2c2c2c" ></path><path d="M896 234.7c11.8 0 21.3-9.6 21.3-21.3V106.7c0-23.6-19.1-42.7-42.7-42.7H149.3c-23.6 0-42.7 19.1-42.7 42.7V729c0 11.3 4.5 22.2 12.5 30.2l188.3 188.3c8 8 18.9 12.5 30.2 12.5h537c23.6 0 42.7-19.1 42.7-42.7V362.7c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3v554.7h-512V746.7c0-23.6-19.1-42.7-42.7-42.7H149.3V106.7h725.3v106.7c0.1 11.7 9.6 21.3 21.4 21.3zM320 768v131.7l-153-153h131.7c11.7 0 21.3 9.5 21.3 21.3z" fill="#2c2c2c" ></path></symbol><symbol id="icon-wodekecheng" viewBox="0 0 1024 1024"><path d="M664.8 442.1L456 317.7c-8.4-5-17.3-7.3-25.9-7.3-27.4 0-52.5 22.8-52.5 54.7V614c0 31.9 25.1 54.7 52.5 54.7 8.7 0 17.5-2.3 25.9-7.3l208.8-124.5c35.2-20.8 35.2-73.8 0-94.8z m-22.9 56.5L433.1 623c-1.5 0.9-2.4 1-3 1-2.4 0-7.7-2.5-7.7-9.9v-249c0-7.4 5.3-9.9 7.7-9.9 0.6 0 1.5 0.1 3 1l208.8 124.5c4 2.4 4.5 6.6 4.5 9 0 2.2-0.6 6.5-4.5 8.9z" fill="#2c2c2c" ></path><path d="M937.6 243.2c12.4 0 22.4-10 22.4-22.4v-112c0-24.7-20.1-44.8-44.8-44.8H108.8C84.1 64 64 84.1 64 108.8v806.4c0 24.7 20.1 44.8 44.8 44.8h806.4c24.7 0 44.8-20.1 44.8-44.8V400c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v515.2H108.8V108.8h806.4v112c0 12.4 10 22.4 22.4 22.4z" fill="#2c2c2c" ></path><path d="M534.4 691.2c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h134.4c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H534.4z" fill="#2c2c2c" ></path></symbol><symbol id="icon-daimaguanli" viewBox="0 0 1024 1024"><path d="M198.4 198.4h67.2v67.2h-67.2zM332.8 198.4H400v67.2h-67.2zM467.2 198.4h67.2v67.2h-67.2zM293.2 772.8c4.4 5.3 10.8 8 17.2 8 5.1 0 10.1-1.7 14.3-5.2l134.4-112c5.1-4.3 8.1-10.6 8.1-17.2 0-6.7-3-13-8.1-17.2l-134.4-112c-9.5-7.9-23.6-6.6-31.6 2.9-7.9 9.5-6.6 23.6 2.9 31.6l113.7 94.8L296 741.2c-9.4 7.9-10.7 22-2.8 31.6zM601.6 624c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4H736c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H601.6z" fill="#2c2c2c" ></path><path d="M937.6 691.2c12.4 0 22.4-10 22.4-22.4v-560c0-24.7-20.1-44.8-44.8-44.8H108.8C84.1 64 64 84.1 64 108.8v806.4c0 24.7 20.1 44.8 44.8 44.8h806.4c24.7 0 44.8-20.1 44.8-44.8v-112c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v112H108.8V377.6h806.4v291.2c0 12.4 10 22.4 22.4 22.4zM108.8 332.8v-224h806.4v224H108.8z" fill="#2c2c2c" ></path></symbol><symbol id="icon-yuangongjixiao" viewBox="0 0 1024 1024"><path d="M659.1 715.8c-7.3-14.5-30.9-14.5-38.2 0L514.3 929.1c-5.3 10.5-1 23.4 9.5 28.6 10.5 5.2 23.4 1 28.6-9.5l26.1-52.2h123l26.1 52.2c3.8 7.5 11.3 11.8 19.1 11.8 3.2 0 6.5-0.7 9.5-2.3 10.5-5.3 14.8-18.1 9.5-28.6L659.1 715.8z m-59.2 137.5L640 773l40.1 80.3h-80.2zM896 704h-42.7v-42.7c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3V704H768c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h42.7v42.7c0 11.8 9.6 21.3 21.3 21.3s21.3-9.6 21.3-21.3v-42.7H896c11.8 0 21.3-9.6 21.3-21.3 0-11.7-9.5-21.3-21.3-21.3zM723.6 597.3c21 0 29.4-27.4 12-39-34.6-23-72.9-40.7-113.8-52.2 74.3-39.4 125-117.4 125-207.4C746.7 169.1 641.6 64 512 64S277.3 169.1 277.3 298.7c0 90 50.7 168 125 207.4C231.9 553.9 106.7 710.2 106.7 896c0 15.5 1.1 30.7 2.9 45.7 1.3 10.5 10.5 18.3 21.1 18.3 12.6 0 22.6-10.8 21.1-23.3-1.6-13.4-2.5-26.9-2.5-40.7 0-200 162.7-362.7 362.7-362.7 73.9 0 142.7 22.3 200.1 60.5 3.4 2.3 7.4 3.5 11.5 3.5zM320 298.7c0-105.9 86.1-192 192-192s192 86.1 192 192-86.1 192-192 192-192-86.2-192-192z" fill="#2c2c2c" ></path></symbol><symbol id="icon-fuwuguanli" viewBox="0 0 1024 1024"><path d="M346.9 254H677c13 0 23.6-10.5 23.6-23.5S690 207 677 207H346.9c-13 0-23.6 10.5-23.6 23.5 0.1 13 10.6 23.5 23.6 23.5zM528.9 367.2h0.1-0.1m-16.9 34l12.4 25c11 22.2 32.2 37.6 56.8 41.1l27.2 3.9-19.5 18.8c-17.9 17.3-26 42.3-21.8 66.8l4.7 27-24.8-12.9c-10.8-5.6-22.9-8.6-35-8.6-12.2 0-24.3 3-35 8.6l-24.7 12.9 4.7-27c4.2-24.5-3.9-49.5-21.8-66.8l-19.5-18.9 27.2-3.9c24.6-3.5 45.8-18.9 56.8-41.1l12.3-24.9m0-70.7c-10.1 0-20.2 5.2-25.4 15.7l-29.2 59c-4.1 8.3-12.1 14.1-21.3 15.4l-65.4 9.5c-23.2 3.4-32.5 31.7-15.7 48l47.3 45.9c6.7 6.5 9.7 15.8 8.1 24.9l-11.2 64.8c-3.1 18.2 11.4 33 27.9 33 4.4 0 8.8-1 13.2-3.3l58.5-30.6c4.1-2.2 8.6-3.2 13.2-3.2 4.5 0 9 1.1 13.2 3.2l58.5 30.6c4.3 2.3 8.8 3.3 13.2 3.3 16.5 0 31-14.8 27.9-33l-11.2-64.8c-1.6-9.1 1.5-18.4 8.1-24.9l47.3-46c16.8-16.3 7.5-44.7-15.7-48l-65.4-9.5c-9.2-1.3-17.2-7.1-21.3-15.4l-29.2-59c-5.2-10.4-15.3-15.6-25.4-15.6z" fill="#333333" ></path><path d="M865.7 392.4c-13 0-23.6 10.5-23.6 23.5v493.8c-0.5-0.4-1.1-0.8-1.6-1.1L566 725.4c-16.1-11.4-35-17.5-54.8-17.5-19.2 0-37.6 5.7-53.4 16.5L181.9 913V110.9h660.2v117.3c0 13 10.6 23.5 23.6 23.5 13 0 23.6-10.5 23.6-23.5V110.9c0-25.9-21.1-46.9-47.2-46.9H181.9c-26 0-47.2 21-47.2 46.9V913c0 27.6 22.8 47 47.3 47 9 0 18.2-2.6 26.6-8.3l275.8-188.6c8.1-5.5 17.4-8.3 26.7-8.3 9.8 0 19.6 3 27.9 9.1l275.2 183.6c8.7 6.3 18.3 9.2 27.7 9.2 24.4 0 47.3-19.3 47.3-47V415.8c0.1-12.9-10.5-23.4-23.5-23.4z" fill="#333333" ></path></symbol><symbol id="icon-yinjinshoufei" viewBox="0 0 1024 1024"><path d="M677.9 303.4c-8.3-8.3-21.9-8.3-30.2 0L512 439.2 376.3 303.4c-8.3-8.3-21.9-8.3-30.2 0s-8.3 21.9 0 30.2L460.5 448h-87.2c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3h117.3v64H373.3c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3h117.3v128c0 11.7 9.6 21.3 21.3 21.3s21.3-9.6 21.3-21.3v-128h117.3c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3H533.3v-64h117.3c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3h-87.2l114.4-114.4c8.4-8.3 8.4-21.9 0.1-30.2z" fill="#333333" ></path><path d="M487.9 64.6C261.7 76.5 76.5 261.7 64.6 487.9 51.1 746.2 256.6 960 512 960c100.5 0 193.2-33.2 267.9-89.1 16.6-12.4 7.7-38.9-13-38.9-4.6 0-9 1.5-12.7 4.3-80.6 60.4-184.1 92-295.3 77.6-183.2-23.6-329.8-173-349.8-356.6C82.6 313.6 273.6 106.7 512 106.7c223.5 0 405.3 181.8 405.3 405.3 0 13.8-0.9 27.4-2.4 40.8-1.4 12.5 8.6 23.2 21.2 23.2 10.7 0 20-8 21.2-18.6 1.7-14.9 2.7-30 2.7-45.4 0-255.4-213.7-460.9-472.1-447.4z" fill="#333333" ></path><path d="M938.7 682.7h-53.3v-53.3c0-11.8-9.6-21.3-21.3-21.3-11.8 0-21.3 9.6-21.3 21.3v53.3h-53.3c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h53.3v53.3c0 11.8 9.6 21.3 21.3 21.3 11.8 0 21.3-9.6 21.3-21.3v-53.3h53.3c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3z" fill="#333333" ></path></symbol><symbol id="icon-yingjiaoqingdan" viewBox="0 0 1024 1024"><path d="M682.7 320H256c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h426.7c11.8 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3zM512 512H256c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h256c11.8 0 21.3-9.6 21.3-21.3 0-11.7-9.5-21.3-21.3-21.3zM512 661.3H256c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h256c11.8 0 21.3-9.6 21.3-21.3 0-11.7-9.5-21.3-21.3-21.3zM768 597.3c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3h-16.2l27.6-27.6c8.3-8.3 8.3-21.8 0-30.2-8.3-8.3-21.8-8.3-30.2 0L704 542.2l-45.3-45.3c-8.3-8.3-21.8-8.3-30.2 0-8.3 8.3-8.3 21.8 0 30.2l27.6 27.6H640c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h42.7v21.3H640c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h42.7V704c0 11.8 9.6 21.3 21.3 21.3s21.3-9.6 21.3-21.3v-42.7H768c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3h-42.7v-21.3H768z" fill="#333333" ></path><path d="M874.7 554.7v362.7H149.3V106.7h494.3l231 231v89c0 11.8 9.6 21.3 21.3 21.3 11.8 0 21.3-9.6 21.3-21.3v-89c0-11.3-4.5-22.2-12.5-30.2l-231-231c-8-8-18.9-12.5-30.2-12.5H149.3c-23.6 0-42.7 19.1-42.7 42.7v810.7c0 23.6 19.1 42.7 42.7 42.7h725.3c23.6 0 42.7-19.1 42.7-42.7V554.7c0-11.8-9.6-21.3-21.3-21.3-11.8-0.1-21.3 9.5-21.3 21.3z" fill="#333333" ></path></symbol><symbol id="icon-duizhangdan" viewBox="0 0 1024 1024"><path d="M892.8 64H108.9C95.5 64 84.8 68 77 75.9c-13.2 13.3-13 31.7-12.9 49.5v812.2c0 12.4 10 22.4 22.4 22.4 0.2 0 0.4-0.1 0.6-0.1 5.9 0.2 11.9-1.9 16.4-6.5l95-95 95 95c4.4 4.4 10.1 6.6 15.8 6.6 0.4 0 0.7-0.2 1.1-0.2 6.1 0.3 12.3-1.7 17-6.3l95-95 95 95c4.4 4.4 10.1 6.6 15.8 6.6 0.4 0 0.7-0.2 1.1-0.2 6.1 0.3 12.3-1.7 17-6.3l95-95 95 95c4.4 4.4 10.1 6.6 15.8 6.6 5.7 0 11.5-2.2 15.8-6.6 8.7-8.8 8.7-22.9 0-31.7l-110.6-111c-8.4-8.4-23.3-8.4-31.7 0l-96.2 96.2-96.2-96.2c-8.4-8.4-23.3-8.4-31.7 0l-96.2 96.2-96.2-96.2c-8.4-8.4-23.3-8.4-31.7 0l-73.8 73.8V125.1c0-5-0.1-12.1 0.4-16.3h783.6c12.3 0 22.4 10 22.4 22.4v806.4c0 12.4 10 22.4 22.4 22.4s22.4-10 22.4-22.4V131.2c0.2-37.1-29.9-67.2-67-67.2z" fill="#333333" ></path><path d="M220.9 310.4h582.4c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H220.9c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4zM803.3 512c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4h-39.4l48.6-48.6c8.7-8.7 8.7-22.9 0-31.7-8.7-8.7-22.9-8.7-31.7 0l-67.2 67.2-67.2-67.2c-8.7-8.7-22.9-8.7-31.7 0-8.7 8.7-8.7 22.9 0 31.7l48.6 48.6h-39.4c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h67.2v44.8h-67.2c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h67.2v67.2c0 12.4 10 22.4 22.4 22.4s22.4-10 22.4-22.4v-67.2h67.2c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4h-67.2V512h67.4zM220.9 489.6h268.8c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H220.9c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4zM220.9 668.8h268.8c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H220.9c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4z" fill="#333333" ></path></symbol><symbol id="icon-shangjiguanli" viewBox="0 0 1024 1024"><path d="M917.3 704v170.7H106.7V512h300.8c-1.5 6.8-2.1 14.1-2.1 21.3 0 58.9 47.8 106.7 106.7 106.7s106.7-47.8 106.7-106.7c0-7.3-0.6-14.5-2.1-21.3h300.8v64c0 11.8 9.6 21.3 21.3 21.3 11.8 0 21.3-9.6 21.3-21.3V277.3c0-23.6-19.1-42.7-42.7-42.7H704v-85.3c0-23.6-19.1-42.7-42.7-42.7H362.7c-23.6 0-42.7 19.1-42.7 42.7v85.3H106.7c-23.6 0-42.7 19.1-42.7 42.7v597.3c0 23.6 19.1 42.7 42.7 42.7h810.7c23.6 0 42.7-19.1 42.7-42.7V704c0-11.8-9.6-21.3-21.3-21.3-11.9 0-21.5 9.5-21.5 21.3zM490 593.6c-25.8-8.7-42-33.1-42-60.3 0-4.6 0.4-8.8 1.3-12.8 0.6-2.9 1.4-5.7 2.3-8.5h120.8c1 2.9 1.8 5.9 2.5 9.1 0.8 3.4 1.1 7.7 1.1 12.2 0 42.5-41.5 75.4-86 60.3zM362.7 149.3h298.7v85.3H362.7v-85.3z m-256 128h810.7v192H106.7v-192z" fill="#333333" ></path></symbol><symbol id="icon-yonghushezhi" viewBox="0 0 1024 1024"><path d="M724.5 279.7c-0.2-4.7-0.9-9.2-1.5-13.9 0-0.9-0.2-1.9-0.4-3 0-0.9 0-1.5-0.2-2.3-0.2-1.7-0.6-3.2-1.1-4.9-0.2-2.6-0.9-5.1-1.5-7.7-1.1-6-2.6-11.7-4.5-17.5-0.2-0.6-0.4-1.3-0.6-1.9-2.1-7.3-4.7-14.3-7.7-21.1-1.1-2.6-2.3-5.1-3.4-7.7-1.1-2.1-1.9-4.1-3-6-1.1-2.3-2.3-4.7-3.6-7-0.4-0.6-0.6-1.3-1.3-2.1-1.9-3.6-4.1-7.3-6.4-10.9-1.3-2.1-2.6-4.3-4.1-6.2-2.3-3.6-4.9-7.3-7.7-10.7-3.6-4.9-7.7-9.8-11.9-14.5-0.2-0.4-0.9-1.1-1.3-1.5-3.8-4.1-7.7-8.1-11.7-11.9-4.5-4.3-9.2-8.5-14.1-12.4-4.9-4.1-9.8-7.7-15.1-11.3-0.4-0.4-0.9-0.9-1.5-1.1-4.7-3.2-9.4-6.2-14.3-9s-10-5.5-15.1-8.1c-0.4-0.2-0.9-0.4-1.5-0.6-4.7-2.1-9.2-4.3-13.9-6-1.9-0.9-3.8-1.5-5.8-2.1-1.1-0.4-2.3-0.9-3.6-1.3-3-1.3-6.2-2.3-9.4-3.2-2.8-0.9-5.5-1.5-8.3-2.1-8.7-2.3-17.7-4.3-26.7-5.3-1.7-0.4-3.6-0.6-5.5-0.9-1.1-0.2-1.9-0.2-3-0.2-3.6-0.4-7.3-0.6-10.7-0.9-4.3-0.2-8.7-0.4-13-0.4h-0.4c-28.4 0-55.5 5.1-80.6 14.3-10.7 3.8-21.1 8.5-31.1 14.1-6.6 3.4-13.2 7.5-19.4 11.7-6.2 4.3-12.2 8.7-17.9 13.4-11.7 9.6-22.4 20.3-32 32-4.7 5.8-9.2 11.7-13.4 17.9-4.3 6.2-8.3 12.8-11.7 19.4-5.5 10-10.2 20.3-14.1 31.1-2.8 7.3-4.9 14.5-6.8 22-4.9 18.8-7.5 38.4-7.5 58.7 0 5.5 0.2 11.3 0.6 16.9 1.1 16.9 4.1 33.1 8.5 48.6 1.3 3.6 2.3 7.3 3.6 10.9 2.1 6.6 4.7 13 7.5 19.2 2.1 4.7 4.5 9.2 6.8 13.9 9.8 18.6 22.2 35.6 36.5 51 3.6 3.8 7.3 7.5 11.1 11.1 7.7 7 15.8 13.7 24.3 19.8 8.5 6 17.5 11.5 26.7 16.4-158.7 47.1-275 193.9-275 368.2 0 23.3 2.3 46.1 6.4 68.3 1.7 10 10.7 17.1 20.9 17.1h0.2c13.2 0 23.3-11.9 20.9-25-10.9-58.2-7.5-121 20.9-187.3 50.3-116.9 158.5-202.2 285.4-213.1 9.8-0.9 19.6-1.3 29.2-1.3h0.4c39.3 0 76.2-9.8 108.6-26.9 9.4-4.9 18.3-10.5 26.9-16.6 8.5-6 16.6-12.6 24.3-19.8 3.8-3.6 7.5-7.3 11.1-11.1 7-7.5 13.7-15.6 19.8-23.9 3-4.3 6-8.7 8.7-13.4 5.5-9 10.5-18.3 14.7-27.9 1.9-4.3 3.6-8.5 5.1-12.8 0.6-1.1 1.1-2.3 1.5-3.8 1.5-4.5 3-9 4.3-13.4 3.4-11.3 5.8-23 7.3-35 0.6-4.3 1.1-8.7 1.3-13.2 0.4-5.5 0.6-11.1 0.6-16.6v-0.4c0-6.4-0.2-12.6-0.8-18.8zM458 487.9c-79.4-13-143.6-77.2-156.6-156.6-21.8-131.2 90.7-243.6 221.9-221.9 79.4 13 143.6 77.2 156.6 156.6 21.8 131.2-90.7 243.7-221.9 221.9zM896.1 867.9c13.2-7.7 21.3-21.9 21.2-37.2l-1-170.4c-0.1-15.3-8.3-29.4-21.6-36.9l-149.4-84.6c-13.1-7.4-29.2-7.3-42.3 0.3l-148.4 86.4c-13.2 7.7-21.3 21.9-21.2 37.2l1 170.4c0.1 15.3 8.3 29.4 21.6 36.9l149.4 84.6c13.1 7.4 29.2 7.3 42.3-0.3l148.4-86.4z m-319.2-35.2l-1-170.4L724.3 576l149.4 84.6 1 170.4-148.4 86.4-149.4-84.7z" fill="#333333" ></path><path d="M725.3 704c23.5 0 42.7 19.1 42.7 42.7 0 23.5-19.1 42.7-42.7 42.7s-42.7-19.1-42.7-42.7c0.1-23.6 19.2-42.7 42.7-42.7m0-42.7c-47.1 0-85.3 38.2-85.3 85.3s38.2 85.3 85.3 85.3c47.1 0 85.3-38.2 85.3-85.3s-38.1-85.3-85.3-85.3z" fill="#333333" ></path></symbol><symbol id="icon-xiaoxishezhi" viewBox="0 0 1024 1024"><path d="M917.3 106.7H106.7c-23.5 0-42.7 19.2-42.7 42.7v640c0 23.5 19.2 42.7 42.7 42.7h384c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3H128c-11.7 0-21.3-9.6-21.3-21.3V211.4l380.2 271.3c15 10.7 35.3 10.7 50.3 0l380.2-271.3v215.3c0 11.7 9.6 21.3 21.3 21.3 11.7 0 21.3-9.6 21.3-21.3V149.4c0-23.5-19.2-42.7-42.7-42.7zM524.6 439.9c-7.5 5.4-17.7 5.4-25.2 0L108.9 161.2c3.5-7 10.7-11.9 19.1-11.9h768c8.3 0 15.6 4.9 19.1 11.9L524.6 439.9z" fill="#333333" ></path><path d="M937.4 580.8L788 496.2c-13.1-7.4-29.2-7.3-42.3 0.3l-148.4 86.4c-13.2 7.7-21.3 21.9-21.2 37.2l1 170.4c0.1 15.3 8.3 29.4 21.6 36.9L748.1 912c13.1 7.4 29.2 7.3 42.3-0.3l148.4-86.4c13.2-7.7 21.3-21.9 21.2-37.2l-1-170.4c-0.1-15.3-8.4-29.4-21.6-36.9z m-20 207.5L769 874.7l-149.4-84.6-1-170.4L767 533.3l149.4 84.6 1 170.4z" fill="#333333" ></path><path d="M768 618.7c-47.1 0-85.3 38.2-85.3 85.3 0 47.1 38.2 85.3 85.3 85.3s85.3-38.2 85.3-85.3c0-47.1-38.2-85.3-85.3-85.3z m0 128c-23.5 0-42.7-19.1-42.7-42.7 0-23.5 19.1-42.7 42.7-42.7s42.7 19.1 42.7 42.7c0 23.5-19.2 42.7-42.7 42.7z" fill="#333333" ></path></symbol><symbol id="icon-yingxiaoshezhi" viewBox="0 0 1024 1024"><path d="M783.1 251.6c-8.3-8.3-21.8-8.3-30.2 0L552.4 452.1 397.9 341.2c-8.8-6.3-20.9-5-28.3 3L240.2 487c-7.9 8.7-7.3 22.2 1.5 30.1 4.1 3.7 9.2 5.5 14.3 5.5 5.8 0 11.6-2.4 15.8-7L388.5 387l153.7 110.3c8.5 6.1 20.1 5.1 27.5-2.3L783 281.7c8.4-8.3 8.4-21.8 0.1-30.1z" fill="#333333" ></path><path d="M917.3 106.7H106.7c-23.6 0-42.7 19.1-42.7 42.7v640c0 23.6 19.1 42.7 42.7 42.7h362.7c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H128c-11.8 0-21.3-9.6-21.3-21.3V170.7c0-11.8 9.6-21.3 21.3-21.3h768c11.8 0 21.3 9.6 21.3 21.3v256c0 11.8 9.6 21.3 21.3 21.3 11.8 0 21.3-9.6 21.3-21.3V149.3c0.1-23.5-19-42.6-42.6-42.6z" fill="#333333" ></path><path d="M917.5 825.2c13.2-7.7 21.3-21.9 21.2-37.2l-1-170.4c-0.1-15.3-8.3-29.4-21.6-36.9l-149.4-84.6c-13.1-7.4-29.2-7.3-42.3 0.3L576 582.8c-13.2 7.7-21.3 21.9-21.2 37.2l1 170.4c0.1 15.3 8.3 29.4 21.6 36.9l149.4 84.6c13.1 7.4 29.2 7.3 42.3-0.3l148.4-86.4z m-319.2-35.1l-1-170.4 148.8-86.4L896 617.9l1 170.4-148.8 86.4-149.9-84.6z" fill="#333333" ></path><path d="M746.7 661.3c23.5 0 42.7 19.1 42.7 42.7s-19.1 42.7-42.7 42.7c-23.5 0-42.7-19.1-42.7-42.7s19.1-42.7 42.7-42.7m0-42.6c-47.1 0-85.3 38.2-85.3 85.3s38.2 85.3 85.3 85.3S832 751.1 832 704s-38.2-85.3-85.3-85.3z" fill="#333333" ></path></symbol><symbol id="icon-fuwushichang" viewBox="0 0 1024 1024"><path d="M512 725.3c-87.9 0-160.4-66.7-169.7-152.2-1.1-10.6-10.4-18.5-21-18.5-12.8 0-22.7 11.2-21.3 23.9C311.9 685.2 402.3 768 512 768s200.1-82.8 212-189.4c1.4-12.7-8.5-23.9-21.3-23.9-10.7 0-19.9 7.9-21 18.5-9.3 85.4-81.8 152.1-169.7 152.1z" fill="#333333" ></path><path d="M874.2 768c-13.5 0-23.7 12.1-21.4 25.4l16.8 99.1c2.2 13-8 24.8-21.5 24.8H175.8c-13.4 0-23.7-11.8-21.5-24.8l86.9-511.7c1.8-10.5 10.9-18.2 21.5-18.2h498.9c10.4 0 19.4 7.5 21.1 17.8L831 664.5c1.8 10.4 10.8 18.1 21.4 18.1 13.5 0 23.7-12.1 21.4-25.4l-51.2-301.6c-3.5-20.6-21.6-35.7-42.9-35.7H686v-85.3C686 140.4 608.1 64 512 64s-174 76.4-174 170.7V320h-93.6c-21.3 0-39.4 15.1-42.9 35.7l-94.2 554.7c-4.4 26 16 49.7 42.9 49.7h723.7c26.9 0 47.3-23.7 42.9-49.7l-21.1-124.2c-1.8-10.6-10.9-18.2-21.5-18.2zM381.5 234.7c0-70.6 58.5-128 130.5-128s130.5 57.4 130.5 128V320h-261v-85.3z" fill="#333333" ></path></symbol><symbol id="icon-sucaiziyuan" viewBox="0 0 1024 1024"><path d="M915.2 131.2H612.8l-21.2-42.4C584 73.6 568.5 64 551.5 64H108.8C84.1 64 64 84.1 64 108.8v806.4c0 24.7 20.1 44.8 44.8 44.8h806.4c24.7 0 44.8-20.1 44.8-44.8V556.8c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v336c0 12.4-10 22.4-22.4 22.4H131.2c-12.4 0-22.4-10-22.4-22.4V131.2c0-12.4 10-22.4 22.4-22.4h420.3l87.2 174.5c15.2 30.4 46.2 49.5 80.1 49.5h196.3v89.6c0 12.4 10 22.4 22.4 22.4 12.4 0 22.4-10 22.4-22.4V176c0.1-24.7-20-44.8-44.7-44.8z m0 156.8H718.9c-17 0-32.5-9.6-40.1-24.8L635.2 176h257.6c12.4 0 22.4 10 22.4 22.4V288z" fill="#333333" ></path><path d="M355.2 456h-44.8c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h44.8c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4zM713.6 456H467.2c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h246.4c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4zM355.2 612.8h-44.8c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h44.8c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4zM713.6 612.8H467.2c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4h246.4c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4z" fill="#333333" ></path></symbol><symbol id="icon-yingxiaotongji" viewBox="0 0 1024 1024"><path d="M796.6 305.8c-8.8-8.8-22.9-8.8-31.7 0L554.4 516.3 392.2 399.9c-9.2-6.6-22-5.3-29.7 3.1L226.6 552.9c-8.3 9.2-7.6 23.3 1.5 31.6 4.3 3.9 9.7 5.8 15.1 5.8 6.1 0 12.2-2.5 16.6-7.4l122.5-135.1 161.4 115.9c8.9 6.4 21.1 5.4 28.9-2.4l224-224c8.8-8.6 8.8-22.8 0-31.5zM220.8 960h582.4c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H220.8c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4z" fill="#2c2c2c" ></path><path d="M915.2 400v380.8H108.8v-672h806.4v112c0 12.4 10 22.4 22.4 22.4 12.4 0 22.4-10 22.4-22.4v-112c0-24.7-20.1-44.8-44.8-44.8H108.8C84.1 64 64 84.1 64 108.8v672c0 24.7 20.1 44.8 44.8 44.8h806.4c24.7 0 44.8-20.1 44.8-44.8V400c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4z" fill="#2c2c2c" ></path></symbol><symbol id="icon-tuiguang" viewBox="0 0 1024 1024"><path d="M490.7 192.4v0.3l0.2 639-238-155.7c-1.2-0.8-2.5-1.5-3.8-2.2-12-6.2-25.5-9.5-39-9.5l-103.5-0.7v-304h103.5c13.5 0 27-3.3 39-9.5 1.3-0.7 2.5-1.4 3.8-2.2l237.8-155.5m-0.1-43.1c-6.4 0-13 1.5-19.3 4.8L229.6 312.3c-6 3.1-12.6 4.7-19.4 4.7H106.7C83.1 317 64 336.4 64 360.3v303.3c0 23.9 19.1 43.3 42.7 43.3h103.5c6.7 0 13.4 1.6 19.4 4.7l241.7 158.2c6.3 3.3 12.9 4.8 19.3 4.8 22.4 0 42.7-18.3 42.7-43.4V192.7c0-25.1-20.3-43.4-42.7-43.4zM640 304.5c0 7 3.5 13.3 9.1 17.4 59 42.7 97.5 111.9 97.5 190.1s-38.5 147.5-97.5 190.1c-5.6 4.1-9.1 10.4-9.1 17.4 0 17.7 20 27.5 34.4 17.1 69.6-50.4 115-132.1 115-224.6s-45.3-174.3-115-224.6C660 277 640 286.8 640 304.5zM810.7 222.9c0 5 1.8 9.9 5.1 13.7C878.9 311 917.3 407 917.3 512s-38.4 201-101.6 275.4c-3.3 3.8-5.1 8.7-5.1 13.7 0 20.2 25.2 29.4 38.3 13.9 69.2-81.8 111-187.5 111-303s-41.8-221.3-111-303c-13-15.4-38.2-6.3-38.2 13.9z" fill="#333333" ></path></symbol><symbol id="icon-yonghuliebiao" viewBox="0 0 1024 1024"><path d="M665.4 532.8c-20.9-10.8-42.9-19.6-65.8-26.4 85.1-44.7 139.5-140 122.7-246C706.1 158 620.8 77.1 517.8 65.5 376.1 49.6 256 160.1 256 298.7c0 90.3 51.1 168.6 126 207.9-159.1 46.9-275.3 193.9-275.3 368.1 0 23.3 2.3 46.1 6.3 68.2 1.8 10 10.8 17.1 21 17.1h0.1c13.3 0 23.3-12 20.9-25.1-10.8-58-7.4-120.9 21.1-187.2 50.3-117 158.4-202.2 285.3-213.1 70.5-6.1 136.6 10.1 193.3 41.4 23.7 0 31.9-32.3 10.7-43.2zM458.1 488c-79.5-13.1-143.6-77.3-156.7-156.7C279.7 200 392 87.7 523.2 109.4c79.5 13.1 143.6 77.2 156.7 156.7 21.8 131.2-90.6 243.6-221.8 221.9zM640 704h256c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H640c-11.8 0-21.3 9.6-21.3 21.3 0 11.7 9.5 21.3 21.3 21.3zM640 810.7h256c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H640c-11.8 0-21.3 9.6-21.3 21.3 0 11.7 9.5 21.3 21.3 21.3zM640 917.3h256c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H640c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.5 21.3 21.3 21.3z" fill="#333333" ></path></symbol><symbol id="icon-chakanxiangqing" viewBox="0 0 1389 1024"><path d="M1232.8797879 526.57404266l-1.8669254 9.51529835-0.60223482 1.3249149-0.24089309 0.72268095a32.52063894 32.52063894 0 0 1-2.58960635 6.50412762l-0.18067045 0.3011174-0.12044695 0.30111658a682.03007063 682.03007063 0 0 1-234.50994197 281.48419886c-102.01844944 70.28071491-216.26225051 107.49877954-330.2049342 107.49877953-232.52256958 0-459.98637341-157.36375937-565.85912063-391.63280822a47.51626739 47.51626739 0 0 1-1.32491492-3.61340469l-0.18067044-0.66245747-0.2408931-0.60223398a27.28120276 27.28120276 0 0 1-1.44536188-4.09519171l-0.30111739-1.44536105a57.81446933 57.81446933 0 0 1-1.14424448-6.92569198v-1.14424448l-0.30111657-0.90335138a147.18600357 147.18600357 0 0 1-1.08402183-8.19038342 28.96745857 28.96745857 0 0 1 0-5.60077625s0.42156354-4.33608481 0.96357486-8.25060691l0.18066963-0.06022347 0.42156436-3.37251078 0.06022348-0.42156353v-0.60223398l0.24089309-1.86692542c0.06022348-0.42156354 0.36134006-2.83050027 1.44536187-6.14278756l0.18067045-0.48178702 0.60223397-1.50558535 0.12044696-0.42156436 0.12044697-0.42156355a26.25740525 26.25740525 0 0 1 2.04759586-5.23943618l0.1806696-0.36134006C202.69820822 246.95677004 429.92111814 90.19524465 662.56413467 90.19524465c232.70324002 0 460.16704386 157.30353589 565.91934412 391.51236045l0.06022348 0.18067044c0.5420105 1.14424447 1.20446797 3.13161685 1.3851384 3.91452127l0.12044695 0.42156437 0.48178702 1.08402099a61.36765054 61.36765054 0 0 1 2.52938288 12.04468122l0.18067044 1.92714889 0.42156436 0.90335138c0.24089392 1.44536188 0.90335137 5.35988315 0.90335056 10.11753149 0 5.78144668-0.96357486 10.7197663-1.68625499 14.27294751z m-56.67022485-16.26031988a10.23797928 10.23797928 0 0 1-0.24089391-1.68625498l-0.36134006-2.52938287-0.36134089-0.8431279-0.18067044-0.60223398-0.06022265-0.18067044-0.18067045-0.66245745-0.48178701-1.14424449C1077.5034009 290.98007889 871.84046973 148.73239493 662.56413467 148.73239493c-195.00338754 0-388.26029746 123.5182055-492.32634192 314.78774222l-11.68334116 22.88489364h-0.12044613l-2.7702768 5.60077707-5.11899004 10.84021326-0.2408931 0.48178701-0.12044696 0.48178703-0.42156354 1.26469144-0.12044695 0.36134087-0.36134089 1.084021-0.12044696 1.20446796a3.01116989 3.01116989 0 0 1-0.18066962 1.02379833l-0.36134088 1.32491492v2.40893591l0.12044696 0.60223399 0.24089392 1.92714889 0.12044696 0.78290441 0.12044615 1.44536188 0.48178784 1.32491492a7.58814944 7.58814944 0 0 1 0.18066961 0.60223398l0.36134088 1.14424447 0.18067044 0.54201133 0.2408931 0.54201049a635.4171546 635.4171546 0 0 0 214.03398422 256.67215549c92.20203452 63.89703342 195.18405799 97.62214114 297.86496487 97.62214032 209.09566461 0 414.81881928-142.24768478 511.83872561-353.99317923l0.48178785-0.96357403 0.2408931-1.08402182 0.12044696-0.5420105 0.48178701-1.44536188 0.12044697-0.48178702 0.06022348-0.48178701 0.12044696-0.84312791 0.90335138-2.83050027-0.72268095-2.71005331z m-513.64542838 188.25836682C561.08769657 698.5720896 478.46118305 614.98200205 478.46118305 512.18064902c0-102.74113037 82.62651269-186.3312171 184.10295162-186.33121793 101.53666241 0 184.10295163 83.59008756 184.10295163 186.33121793 0 102.80135385-82.56628921 186.39144058-184.10295163 186.39144058z m0-314.18550825c-69.61825745 0-126.2884823 57.33268232-126.28848147 127.79406767 0 70.52160801 56.67022485 127.85429032 126.28848147 127.85429031 69.61825745 0 126.2884823-57.33268232 126.2884823-127.85429031 0-70.46138452-56.67022485-127.79406682-126.2884823-127.79406767z" fill="#2c2c2c" ></path></symbol><symbol id="icon-lianjie" viewBox="0 0 1024 1024"><path d="M347.4 932.6c-68.4 0-132.7-26.6-181-75s-75-112.6-75-181 26.6-132.7 75-181l99.2-99.2c9.1-9.1 23.8-9.1 32.9 0 9.1 9.1 9.1 23.8 0 32.9l-99.2 99.2c-81.7 81.7-81.7 214.6 0 296.2 81.7 81.7 214.6 81.7 296.2 0l98.5-98.5c9.1-9.1 23.8-9.1 32.9 0 9.1 9.1 9.1 23.8 0 32.9l-98.5 98.5c-48.3 48.3-112.6 75-181 75z m37.2-261.4c-6 0-11.9-2.3-16.5-6.8-9.1-9.1-9.1-23.8 0-32.9l65.9-65.9 0.1-0.1 197.4-197.4c9.1-9.1 23.8-9.1 32.9 0 9.1 9.1 9.1 23.8 0 32.9L401.1 664.4c-4.6 4.5-10.5 6.8-16.5 6.8z m358.6-38c-6 0-11.9-2.3-16.5-6.8-9.1-9.1-9.1-23.8 0-32.9l97.9-97.9c81.7-81.7 81.7-214.6 0-296.2-81.7-81.7-214.6-81.7-296.2 0L430 297.8c-9.1 9.1-23.8 9.1-32.9 0-9.1-9.1-9.1-23.8 0-32.9l98.5-98.5c48.4-48.4 112.6-75 181-75s132.7 26.6 181 75 75 112.6 75 181-26.6 132.7-75 181l-97.9 97.9c-4.6 4.6-10.6 6.9-16.5 6.9z" fill="#000000" ></path></symbol><symbol id="icon-quanxian" viewBox="0 0 1024 1024"><path d="M513.169577 0L115.983092 126.164413c-14.864629 4.708299-24.960981 18.503314-24.980974 34.09768l2.04926 496.120737 0.46983 5.667952a347.046602 347.046602 0 0 0 98.244502 166.21994c62.43744 61.587747 215.662075 142.098656 281.048449 176.456242 10.276287 5.408046 17.943517 9.416598 22.331931 11.84572l7.457305 4.048537a17.468688 17.468688 0 0 0 16.324102 0.209924l10.866074-5.537999c38.366137-18.753224 232.545975-115.808155 304.749885-186.982438 47.872702-44.953757 81.970382-102.602927 98.284487-166.21994l2.299169-501.618751a35.791068 35.791068 0 0 0-24.980973-34.307604L513.169577 0z m355.171667 652.834113a295.624183 295.624183 0 0 1-79.791169 130.632798c-57.239318 56.469596-212.38326 137.110458-268.772885 165.540186a17.403712 17.403712 0 0 1-16.064196 0C446.21377 918.837998 293.628904 838.666966 237.969015 783.726817a294.415619 294.415619 0 0 1-79.831155-130.632798L156.128586 192.140574a15.91425 15.91425 0 0 1 11.036013-15.174517L502.383475 70.414557a35.401209 35.401209 0 0 1 21.312299 0l335.218876 106.5515a15.902254 15.902254 0 0 1 11.12598 15.174517l-1.919307 460.703535h0.219921zM519.227389 239.413493c38.805978-0.079971 76.062516 15.254488 103.562579 42.614602a142.950348 142.950348 0 0 1 42.624599 102.273046 142.968342 142.968342 0 0 1-43.224382 102.01314 146.032234 146.032234 0 0 1-67.215713 37.126585l-0.419848 60.478148h60.6081c9.646514-0.079971 18.933159 3.688667 25.800678 10.476214a36.234907 36.234907 0 0 1 10.776106 25.670725 35.860043 35.860043 0 0 1-10.826088 25.57076A36.746722 36.746722 0 0 1 614.962797 656.212892h-60.608101l-0.259906 100.93353a35.877037 35.877037 0 0 1-10.826088 25.57076 36.677747 36.677747 0 0 1-25.950624 10.566182c-9.646514 0.079971-18.933159-3.688667-25.800677-10.476214a36.251901 36.251901 0 0 1-10.776106-25.670725l0.899675-233.905483a145.674364 145.674364 0 0 1-66.955807-37.336509 143.0843 143.0843 0 0 1 0.46983-204.586078 146.827947 146.827947 0 0 1 103.912453-42.114782l0.159943 0.21992z m88.138153 143.158273a83.41486 83.41486 0 0 0-25.100931-60.13827c-33.84777-33.217997-88.038189-33.337954-122.025908-0.24991a83.175946 83.175946 0 0 0-25.570761 59.878364 84.142597 84.142597 0 0 0 25.100931 60.218242 85.863975 85.863975 0 0 0 60.868006 24.891006c46.973027-0.459834 85.209212-37.906303 86.648692-84.859338l0.079971 0.259906z m0 0" fill="#000000" ></path></symbol><symbol id="icon-cuowu" viewBox="0 0 1024 1024"><path d="M870.4 919.466667H153.6c-53.333333 0-96-42.666667-96-96 0-17.066667 4.266667-34.133333 12.8-49.066667L428.8 153.6c25.6-46.933333 85.333333-61.866667 130.133333-36.266667 14.933333 8.533333 27.733333 21.333333 36.266667 36.266667l358.4 620.8c17.066667 29.866667 17.066667 66.133333 0 96s-49.066667 49.066667-83.2 49.066667zM484.266667 185.6L125.866667 806.4c-8.533333 14.933333-4.266667 34.133333 10.666666 42.666667 4.266667 2.133333 10.666667 4.266667 17.066667 4.266666h716.8c17.066667 0 32-14.933333 32-32 0-6.4-2.133333-10.666667-4.266667-17.066666l-358.4-618.666667c-8.533333-14.933333-27.733333-21.333333-42.666666-12.8-6.4 4.266667-10.666667 8.533333-12.8 12.8z" fill="#000000" ></path><path d="M512 657.066667c-17.066667 0-32-14.933333-32-32v-256c0-17.066667 14.933333-32 32-32s32 14.933333 32 32v256c0 17.066667-14.933333 32-32 32z" fill="#000000" ></path><path d="M512 750.933333m-32 0a32 32 0 1 0 64 0 32 32 0 1 0-64 0Z" fill="#000000" ></path></symbol><symbol id="icon-suozhu" viewBox="0 0 1024 1024"><path d="M224 448a31.168 31.168 0 0 0-23.04 8.96 31.168 31.168 0 0 0-8.96 23.04v384c0 9.344 3.008 17.024 8.96 23.04 6.016 5.952 13.696 8.96 23.04 8.96h576a31.168 31.168 0 0 0 23.04-8.96 31.168 31.168 0 0 0 8.96-23.04v-384a31.168 31.168 0 0 0-8.96-23.04 31.168 31.168 0 0 0-23.04-8.96h-576z m0-64h576c27.328 0.64 49.984 9.984 68.032 28.032 17.92 17.92 27.328 40.64 27.968 67.968v384c-0.64 27.328-9.984 49.984-28.032 68.032-17.92 17.92-40.64 27.328-67.968 27.968h-576c-27.328-0.64-49.984-9.984-68.032-28.032-17.92-17.92-27.328-40.64-27.968-67.968v-384c0.64-27.328 9.984-49.984 28.032-68.032 17.92-17.92 40.64-27.328 67.968-27.968zM512 544c9.344 0 17.024 3.008 23.04 8.96 5.952 6.016 8.96 13.696 8.96 23.04v192a31.168 31.168 0 0 1-8.96 23.04 31.168 31.168 0 0 1-23.04 8.96 31.168 31.168 0 0 1-23.04-8.96 31.168 31.168 0 0 1-8.96-23.04V576c0-9.344 3.008-17.024 8.96-23.04A31.168 31.168 0 0 1 512 544zM704 384V320c-1.344-54.656-20.032-100.032-56-136S566.72 129.344 512 128c-54.656 1.344-100.032 20.032-136 56S321.344 265.28 320 320v64h384zM512 64c72.64 1.984 132.992 27.008 180.992 75.008S765.952 247.36 768 320v128H256V320c1.984-72.64 27.008-132.992 75.008-180.992S439.36 66.048 512 64z" fill="#2c2c2c" ></path></symbol><symbol id="icon-jiesuo" viewBox="0 0 1024 1024"><path d="M224 448a31.168 31.168 0 0 0-23.04 9.024 31.168 31.168 0 0 0-8.96 23.04v384c0 9.344 3.008 17.024 8.96 23.04 6.016 5.952 13.696 8.96 23.04 8.96h576a31.168 31.168 0 0 0 23.04-8.96 31.168 31.168 0 0 0 8.96-23.04v-384a31.168 31.168 0 0 0-8.96-23.04 31.168 31.168 0 0 0-23.04-8.96h-576z m0-64h576c27.328 0.704 49.984 10.048 68.032 28.032 17.92 18.048 27.328 40.704 27.968 68.032v384c-0.64 27.328-9.984 49.984-28.032 67.968-17.92 18.048-40.64 27.392-67.968 28.032h-576c-27.328-0.64-49.984-9.984-68.032-28.032-17.92-17.984-27.328-40.64-27.968-67.968v-384c0.64-27.328 9.984-49.984 28.032-68.032 17.92-17.92 40.64-27.328 67.968-27.968zM512 544c9.344 0 17.024 3.072 23.04 9.024 5.952 6.016 8.96 13.696 8.96 23.04v192a31.168 31.168 0 0 1-8.96 23.04 31.168 31.168 0 0 1-23.04 8.96 31.168 31.168 0 0 1-23.04-8.96 31.168 31.168 0 0 1-8.96-23.04V576c0-9.344 3.008-17.024 8.96-23.04a31.168 31.168 0 0 1 23.04-8.96z m177.984-294.976c-17.92-43.328-46.656-75.648-86.016-96.96a192 192 0 0 0-128-20.032c-45.952 9.344-83.264 31.232-112 65.536C335.36 231.872 320.64 272.64 320 320v64h352l96 38.016V448H256v-128c1.344-62.656 20.864-116.992 58.496-163.008 37.632-45.952 87.488-75.648 149.504-88.96 61.312-10.688 118.144-1.664 170.496 27.008 52.352 28.672 90.88 72 115.52 129.984l-60.032 23.936z" fill="#2c2c2c" ></path></symbol><symbol id="icon-weixin" viewBox="0 0 1024 1024"><path d="M692.699238 336.887706c11.619123 0 23.117414 0.831898 34.517504 2.108006C696.19497 194.549965 541.769728 87.227597 365.488742 87.227597 168.405197 87.227597 6.977229 221.535539 6.977229 392.107418c0 98.493235 53.707366 179.306803 143.459123 242.033357l-35.857101 107.840102 125.329408-62.837146c44.84311 8.861798 80.827085 18.002022 125.578138 18.002022 11.250688 0 22.40215-0.561766 33.469645-1.428582-7.001702-23.95351-11.06647-49.054208-11.06647-75.120947C387.891917 463.976243 522.3936 336.887706 692.699238 336.887706zM497.405542 232.406118c30.611456 0 55.425536 24.815206 55.425536 55.427379s-24.814182 55.426355-55.425536 55.426355c-30.613504 0-55.427584-24.815206-55.427584-55.426355S466.794086 232.406118 497.405542 232.406118zM246.567526 344.377344c-30.611456 0-55.427584-24.815206-55.427584-55.426355 0-30.611149 24.81623-55.426355 55.427584-55.426355 30.613504 0 55.428608 24.815206 55.428608 55.426355C301.996134 319.561114 277.18103 344.377344 246.567526 344.377344zM1017.379942 617.455821c0-143.330406-143.423283-260.165325-304.515686-260.165325-170.58089 0-304.924979 116.834918-304.924979 260.165325 0 143.57801 134.34409 260.158157 304.924979 260.158157 35.697459 0 71.712154-9.0112 107.569254-17.99895l98.340659 53.861683-26.969293-89.592525C963.769856 769.897677 1017.379942 698.309222 1017.379942 617.455821zM619.184947 577.275699c-21.799322 0-39.469466-17.673523-39.469466-39.471002 0-21.799526 17.671168-39.468954 39.469466-39.468954s39.469466 17.670451 39.469466 39.468954C658.656563 559.6032 640.983347 577.275699 619.184947 577.275699zM816.270541 579.514675c-21.80137 0-39.47049-17.672499-39.47049-39.468954 0-21.80055 17.670144-39.468954 39.47049-39.468954 21.798298 0 39.469466 17.669427 39.469466 39.468954C855.741133 561.842176 838.068941 579.514675 816.270541 579.514675z" fill="#000000" ></path></symbol><symbol id="icon-qq" viewBox="0 0 1024 1024"><path d="M785.066667 725.333333c-4.266667 55.466667-29.866667 106.666667-72.533334 140.8 38.4 17.066667 93.866667 34.133333 93.866667 72.533334H217.6c0-34.133333 55.466667-55.466667 89.6-72.533334-38.4-38.4-64-89.6-72.533333-140.8v-17.066666l-72.533334 72.533333c-17.066667 17.066667-34.133333 17.066667-34.133333-38.4 0-34.133333 110.933333-302.933333 110.933333-302.933333v-85.333334c4.266667-153.6 128-273.066667 281.6-268.8 145.066667 4.266667 260.266667 119.466667 264.533334 264.533334v89.6s110.933333 268.8 110.933333 302.933333c0 55.466667-17.066667 55.466667-38.4 34.133333-55.466667-51.2-72.533333-72.533333-72.533333-72.533333v21.333333z" fill="#000000" ></path></symbol><symbol id="icon-shangchuan" viewBox="0 0 1024 1024"><path d="M768.35456 416a256 256 0 1 0-512 0 192 192 0 1 0 0 384v64a256 256 0 0 1-58.88-505.216 320.128 320.128 0 0 1 629.76 0A256.128 256.128 0 0 1 768.35456 864v-64a192 192 0 0 0 0-384z m-512 384h128v64H256.35456v-64z m384 0h128v64h-128v-64z" fill="#000000" ></path><path d="M539.04256 589.184v333.056a32.448 32.448 0 0 1-32 32.192 32.448 32.448 0 0 1-32-32.192V589.184l-36.096 36.096a32.192 32.192 0 0 1-45.056-0.192 31.616 31.616 0 0 1-0.192-45.056l90.88-90.88a31.36 31.36 0 0 1 22.528-9.152 30.08 30.08 0 0 1 22.4 9.088l90.88 90.944a32.192 32.192 0 0 1-0.192 45.056 31.616 31.616 0 0 1-45.056 0.192l-36.096-36.096z" fill="#000000" ></path></symbol><symbol id="icon-xiazai" viewBox="0 0 1024 1024"><path d="M768.35456 416a256 256 0 1 0-512 0 192 192 0 1 0 0 384v64a256 256 0 0 1-58.88-505.216 320.128 320.128 0 0 1 629.76 0A256.128 256.128 0 0 1 768.35456 864v-64a192 192 0 0 0 0-384z m-512 384h64v64H256.35456v-64z m448 0h64v64h-64v-64z" fill="#000000" ></path><path d="M539.04256 845.248V512.192a32.448 32.448 0 0 0-32-32.192c-17.664 0-32 14.912-32 32.192v333.056l-36.096-36.096a32.192 32.192 0 0 0-45.056 0.192 31.616 31.616 0 0 0-0.192 45.056l90.88 90.944a31.36 31.36 0 0 0 22.528 9.088 30.08 30.08 0 0 0 22.4-9.088l90.88-90.88a32.192 32.192 0 0 0-0.192-45.12 31.616 31.616 0 0 0-45.056-0.192l-36.096 36.096z" fill="#000000" ></path></symbol><symbol id="icon-daochu" viewBox="0 0 1024 1024"><path d="M909.5 671.4h-625c-17.7 0-32-14.3-32-32s14.3-32 32-32h625c17.7 0 32 14.3 32 32s-14.3 32-32 32z" fill="#000000" ></path><path d="M904.8 662.7c-8.2 0-16.4-3.1-22.6-9.4l-225-225c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l225 225c12.5 12.5 12.5 32.8 0 45.3-6.3 6.3-14.5 9.4-22.7 9.4z" fill="#000000" ></path><path d="M679.5 905.2c-8.2 0-16.4-3.1-22.6-9.4-12.5-12.5-12.5-32.8 0-45.3l225-225c12.5-12.5 32.8-12.5 45.3 0s12.5 32.8 0 45.3l-225 225c-6.3 6.3-14.5 9.4-22.7 9.4z" fill="#000000" ></path><path d="M448.2 958.3H229.7c-89.3 0-162-72.7-162-162V228.2c0-89.3 72.7-162 162-162h568.1c89.3 0 162 72.7 162 162v208.1c0 17.7-14.3 32-32 32s-32-14.3-32-32V228.2c0-54-44-98-98-98H229.7c-54 0-98 44-98 98v568.1c0 54 44 98 98 98h218.5c17.7 0 32 14.3 32 32s-14.3 32-32 32z" fill="#000000" ></path></symbol><symbol id="icon-daoru" viewBox="0 0 1024 1024"><path d="M926.4 637.7H299c-17.7 0-32-14.3-32-32s14.3-32 32-32h627.4c17.7 0 32 14.3 32 32s-14.3 32-32 32z" fill="#000000" ></path><path d="M529.6 872.2c-8.2 0-16.4-3.1-22.6-9.4L281.2 637c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l225.8 225.8c12.5 12.5 12.5 32.8 0 45.3-6.3 6.3-14.5 9.4-22.7 9.4z" fill="#000000" ></path><path d="M304.1 628.8c-8.2 0-16.4-3.1-22.6-9.4-12.5-12.5-12.5-32.8 0-45.3l225.8-225.8c12.5-12.5 32.8-12.5 45.3 0s12.5 32.8 0 45.3L326.7 619.4c-6.2 6.3-14.4 9.4-22.6 9.4z" fill="#000000" ></path><path d="M447.6 958.3H229.1c-89.3 0-162-72.7-162-162V228.2c0-89.3 72.7-162 162-162h568.1c89.3 0 162 72.7 162 162v208.1c0 17.7-14.3 32-32 32s-32-14.3-32-32V228.2c0-54-44-98-98-98H229.1c-54 0-98 44-98 98v568.1c0 54 44 98 98 98h218.5c17.7 0 32 14.3 32 32s-14.3 32-32 32z" fill="#000000" ></path></symbol><symbol id="icon-working" viewBox="0 0 1024 1024"><path d="M364 482.4c-107.8 0-195.4-87.7-195.4-195.4S256.2 91.5 364 91.5c107.8 0 195.4 87.7 195.4 195.4S471.7 482.4 364 482.4z m0-350.9c-85.7 0-155.4 69.7-155.4 155.4S278.3 442.4 364 442.4 519.4 372.7 519.4 287 449.7 131.5 364 131.5zM482.8 925.2c-8.9 0-17.7-1.1-26.3-3.2l-275.7-67.5c-5.5-1.3-10.2-5-12.9-10-2.7-5-3.1-10.9-1.2-16.2l47-131.3c3.6-10 14.3-15.4 24.5-12.4l147.7 43.6V588c0-23.2 10.5-44.8 29.7-60.9 18.1-15.2 42-23.5 67.2-23.5 25.2 0 49.1 8.4 67.2 23.5 19.1 16 29.7 37.6 29.7 60.9 0 0.6 0.1 66-0.2 131.7-0.7 136.2-2.4 141.1-4 145.8-6.3 18-18.9 33.3-36.4 44.2-16.6 10.1-36.1 15.5-56.3 15.5zM211.9 821L466 883.2c5.5 1.3 11.1 2 16.8 2 24.9 0 47-12.9 54.3-31.6 2.1-19.9 2.7-172.3 2.5-265.7 0-24.5-25.5-44.4-56.8-44.4S426 563.4 426 587.9v167c0 6.3-3 12.2-8 16-5.1 3.8-11.6 4.9-17.6 3.2L245 728.4 211.9 821zM69.5 871c-2.5 0-5-0.5-7.4-1.4-10.3-4.1-15.2-15.7-11.1-26l83.5-208.9c4.1-10.3 15.7-15.2 26-11.1s15.2 15.7 11.1 26L88.1 858.4C85 866.3 77.4 871 69.5 871zM247.9 921H39c-11 0-20-9-20-20s9-20 20-20h208.9c11 0 20 9 20 20s-8.9 20-20 20zM656.5 875.2c-11 0-20-9-20-20s9-20 20-20c174.8 0 317.1-142.2 317.1-317.1 0-174.8-142.2-317.1-317.1-317.1-11 0-20-9-20-20s9-20 20-20c48.2 0 95 9.4 139 28.1 42.5 18 80.7 43.7 113.5 76.5s58.5 71 76.5 113.5c18.6 44 28.1 90.8 28.1 139s-9.4 95-28.1 139c-18 42.5-43.7 80.7-76.5 113.5s-71 58.5-113.5 76.5c-44 18.7-90.8 28.1-139 28.1z" fill="#2c2c2c" ></path><path d="M857.9 565h-174c-11 0-20-9-20-20V301c0-11 9-20 20-20s20 9 20 20v224h154c11 0 20 9 20 20s-8.9 20-20 20z" fill="#2c2c2c" ></path></symbol><symbol id="icon-gengduo1" viewBox="0 0 1024 1024"><path d="M284.444444 568.888889c-31.288889 0-56.888889-25.6-56.888888-56.888889s25.6-56.888889 56.888888-56.888889 56.888889 25.6 56.888889 56.888889-25.6 56.888889-56.888889 56.888889z m227.555556 0c-31.288889 0-56.888889-25.6-56.888889-56.888889s25.6-56.888889 56.888889-56.888889 56.888889 25.6 56.888889 56.888889-25.6 56.888889-56.888889 56.888889z m227.555556 0c-31.288889 0-56.888889-25.6-56.888889-56.888889s25.6-56.888889 56.888889-56.888889 56.888889 25.6 56.888888 56.888889-25.6 56.888889-56.888888 56.888889z" fill="#000000" ></path><path d="M512 0C230.4 0 0 230.4 0 512s230.4 512 512 512 512-230.4 512-512S793.6 0 512 0z m0 967.111111C261.688889 967.111111 56.888889 762.311111 56.888889 512S261.688889 56.888889 512 56.888889s455.111111 204.8 455.111111 455.111111-204.8 455.111111-455.111111 455.111111z" fill="#000000" ></path></symbol><symbol id="icon-gengduo2" viewBox="0 0 1024 1024"><path d="M508.56 64.01l2.97-0.01c76.97-0.35 136.74-0.63 184.48 3.48 48.45 4.17 87.39 13.02 121.81 32.68a280.425 280.425 0 0 1 103.11 102.16c19.98 34.25 29.19 73.1 33.8 121.51 4.55 47.7 4.82 107.47 5.17 184.44l0.01 2.96c0.35 76.98 0.63 136.74-3.48 184.49-4.17 48.45-13.02 87.39-32.68 121.81a280.5 280.5 0 0 1-102.16 103.11c-34.24 19.98-73.1 29.19-121.51 33.8-47.7 4.54-107.47 4.82-184.44 5.17l-2.96 0.01c-76.98 0.35-136.74 0.63-184.48-3.48-48.45-4.17-87.39-13.02-121.82-32.68A280.5 280.5 0 0 1 103.27 821.3c-19.98-34.25-29.19-73.1-33.8-121.51-4.54-47.7-4.82-107.47-5.17-184.44l-0.01-2.97c-0.35-76.97-0.63-136.74 3.48-184.48 4.17-48.45 13.02-87.39 32.68-121.81a280.5 280.5 0 0 1 102.16-103.11c34.25-19.98 73.1-29.19 121.51-33.8 47.7-4.54 107.47-4.81 184.44-5.17z m-178.88 63.5c-44.35 4.22-73.67 12.15-97.54 26.08a221.845 221.845 0 0 0-80.82 81.56c-13.71 24-21.37 53.39-25.18 97.77-3.85 44.79-3.62 101.91-3.26 180.67 0.36 78.77 0.65 135.89 4.91 180.64 4.22 44.35 12.15 73.67 26.08 97.54a221.845 221.845 0 0 0 81.56 80.82c24 13.71 53.39 21.37 97.77 25.18 44.79 3.85 101.91 3.62 180.67 3.26 78.77-0.36 135.89-0.65 180.64-4.91 44.35-4.23 73.67-12.15 97.54-26.08a221.845 221.845 0 0 0 80.82-81.56c13.71-24 21.37-53.39 25.18-97.77 3.85-44.79 3.62-101.91 3.26-180.67-0.36-78.77-0.65-135.89-4.92-180.64-4.22-44.35-12.15-73.67-26.08-97.54a221.845 221.845 0 0 0-81.56-80.82c-23.99-13.71-53.39-21.37-97.77-25.18-44.79-3.85-101.91-3.62-180.68-3.26-78.75 0.36-135.87 0.65-180.62 4.91z" fill="#2c2c2c" ></path><path d="M372.59 512.46c0.12 25.68-20.6 46.6-46.29 46.72-25.68 0.12-46.6-20.61-46.72-46.29-0.12-25.68 20.61-46.6 46.29-46.72 25.69-0.12 46.61 20.61 46.72 46.29zM558.6 511.6c0.12 25.68-20.61 46.6-46.29 46.72-25.68 0.12-46.6-20.6-46.71-46.29-0.12-25.68 20.6-46.6 46.29-46.71 25.68-0.12 46.59 20.6 46.71 46.28zM744.61 510.75c0.12 25.68-20.61 46.6-46.29 46.72-25.68 0.12-46.6-20.61-46.72-46.29-0.12-25.68 20.61-46.6 46.29-46.71 25.68-0.13 46.6 20.6 46.72 46.28z" fill="#2c2c2c" ></path></symbol><symbol id="icon-gengduo3" viewBox="0 0 1024 1024"><path d="M263.333647 517.240471m-57.750588 0a57.750588 57.750588 0 1 0 115.501176 0 57.750588 57.750588 0 1 0-115.501176 0Z" fill="#000000" ></path><path d="M519.077647 517.240471m-57.750588 0a57.750588 57.750588 0 1 0 115.501176 0 57.750588 57.750588 0 1 0-115.501176 0Z" fill="#000000" ></path><path d="M774.806588 517.240471m-57.750588 0a57.750588 57.750588 0 1 0 115.501176 0 57.750588 57.750588 0 1 0-115.501176 0Z" fill="#000000" ></path><path d="M754.703059 953.645176H277.413647c-142.185412 0-257.867294-115.681882-257.867294-257.882352V338.703059c0-142.185412 115.681882-257.867294 257.867294-257.867294h477.289412c137.667765 0 250.804706 107.625412 257.551059 245.037176 0.903529 18.401882-13.281882 34.048-31.683765 34.95153-18.401882 0.903529-34.048-13.281882-34.951529-31.683765-4.999529-101.827765-88.862118-181.594353-190.915765-181.594353H277.413647c-105.411765 0-191.156706 85.76-191.156706 191.156706v357.074823c0 105.411765 85.76 191.156706 191.156706 191.156706h477.289412c105.411765 0 191.156706-85.76 191.156706-191.156706V504.274824c0-18.416941 14.938353-33.355294 33.355294-33.355295s33.355294 14.938353 33.355294 33.355295v191.503058c0 142.185412-115.681882 257.867294-257.867294 257.867294z" fill="#000000" ></path></symbol><symbol id="icon-fenxiang" viewBox="0 0 1024 1024"><path d="M853.333333 533.333333a32 32 0 0 1 64 0v266.666667c0 64.8-52.533333 117.333333-117.333333 117.333333H224c-64.8 0-117.333333-52.533333-117.333333-117.333333V256c0-64.8 52.533333-117.333333 117.333333-117.333333h277.333333a32 32 0 0 1 0 64H224a53.333333 53.333333 0 0 0-53.333333 53.333333v544a53.333333 53.333333 0 0 0 53.333333 53.333333h576a53.333333 53.333333 0 0 0 53.333333-53.333333V533.333333z m-42.058666-277.333333l-89.792-95.402667a32 32 0 0 1 46.613333-43.861333l140.544 149.333333C927.861333 286.485333 913.376 320 885.333333 320H724.704C643.029333 320 576 391.210667 576 480v192a32 32 0 1 1-64 0V480c0-123.296 94.784-224 212.704-224h86.570667z" fill="#000000" ></path></symbol><symbol id="icon-shanchu" viewBox="0 0 1024 1024"><path d="M416 384c-17.67 0-32 14.33-32 32v288c0 17.67 14.33 32 32 32s32-14.33 32-32V416c0-17.67-14.33-32-32-32zM576 416v288c0 17.67 14.33 32 32 32s32-14.33 32-32V416c0-17.67-14.33-32-32-32s-32 14.33-32 32z" fill="#2c2c2c" ></path><path d="M864 224H671.78c0.03-0.75 0.22-1.45 0.22-2.2v-59.6c0-36.5-29.7-66.2-66.2-66.2H418.2c-36.5 0-66.2 29.7-66.2 66.2v59.59c0 0.75 0.2 1.46 0.22 2.2H160c-17.67 0-32 14.33-32 32s14.33 32 32 32h32v576c0 17.67 14.33 32 32 32h576c17.67 0 32-14.33 32-32V288h32c17.67 0 32-14.33 32-32s-14.33-32-32-32z m-448-2.2l2.2-61.8 189.8 2.2v59.59c0 1.22-0.98 2.2-2.2 2.2L416 221.8zM768 832H256V288H768v544z" fill="#2c2c2c" ></path></symbol><symbol id="icon-ziyuanguanli" viewBox="0 0 1024 1024"><path d="M824.4 592.5c-5.6-10.2-16.4-16.5-28-16.5H620.8c-11.6 0-22.3 6.3-28 16.5l-88.9 160c-5.4 9.7-5.4 21.4 0 31.1l88.9 160c5.6 10.2 16.4 16.5 28 16.5h175.7c11.6 0 22.3-6.3 28-16.5l88.9-160c5.4-9.7 5.4-21.4 0-31.1l-89-160z m-30.5 324.8H623.3L537.9 768l85.3-149.3h170.7L879.3 768l-85.4 149.3z" fill="#000000" ></path><path d="M708.6 682.7c-47.1 0-85.3 38.2-85.3 85.3 0 47.1 38.2 85.3 85.3 85.3s85.3-38.2 85.3-85.3c0-47.1-38.2-85.3-85.3-85.3z m0 128c-23.6 0-42.7-19.1-42.7-42.7s19.1-42.7 42.7-42.7 42.7 19.1 42.7 42.7-19.1 42.7-42.7 42.7z" fill="#000000" ></path><path d="M874.7 64H149.3c-23.6 0-42.7 19.1-42.7 42.7v810.7c0 23.6 19.1 42.7 42.7 42.7H448c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H170.7c-11.8 0-21.3-9.6-21.3-21.3V128c0-11.8 9.6-21.3 21.3-21.3h682.7c11.8 0 21.3 9.6 21.3 21.3v384c0 11.8 9.6 21.3 21.3 21.3s21.3-9.6 21.3-21.3V106.7c0-23.6-19.1-42.7-42.6-42.7z" fill="#000000" ></path><path d="M318.1 362.7H706c10.7 0 19.4-9.6 19.4-21.3 0-11.7-8.7-21.3-19.4-21.3H318.1c-10.7 0-19.4 9.6-19.4 21.3 0 11.7 8.7 21.3 19.4 21.3zM313.9 533.3h182.8c8.4 0 15.2-9.6 15.2-21.3 0-11.7-6.9-21.3-15.2-21.3H313.8c-8.4 0-15.2 9.6-15.2 21.3 0.1 11.7 6.9 21.3 15.3 21.3z" fill="#000000" ></path></symbol><symbol id="icon-hetongshezhi" viewBox="0 0 1024 1024"><path d="M824.4 592.5c-5.6-10.2-16.4-16.5-28-16.5H620.8c-11.6 0-22.3 6.3-28 16.5l-88.9 160c-5.4 9.7-5.4 21.4 0 31.1l88.9 160c5.6 10.2 16.4 16.5 28 16.5h175.7c11.6 0 22.3-6.3 28-16.5l88.9-160c5.4-9.7 5.4-21.4 0-31.1l-89-160z m-30.5 324.8H623.3L537.9 768l85.3-149.3h170.7L879.3 768l-85.4 149.3z" fill="#000000" ></path><path d="M708.6 682.7c-47.1 0-85.3 38.2-85.3 85.3 0 47.1 38.2 85.3 85.3 85.3s85.3-38.2 85.3-85.3c0-47.1-38.2-85.3-85.3-85.3z m0 128c-23.6 0-42.7-19.1-42.7-42.7s19.1-42.7 42.7-42.7 42.7 19.1 42.7 42.7-19.1 42.7-42.7 42.7zM298.7 277.3h426.7c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3H298.7c-11.7 0-21.3 9.6-21.3 21.3-0.1 11.7 9.5 21.3 21.3 21.3zM298.7 426.7h298.7c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3H298.7c-11.7 0-21.3 9.6-21.3 21.3-0.1 11.7 9.5 21.3 21.3 21.3z" fill="#000000" ></path><path d="M874.7 64H149.3c-23.5 0-42.7 19.2-42.7 42.7v704h0.6c-6.1 81 58.3 149.3 138 149.3H448c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H249.9c-50.1 0-95-36.3-100-86.2-5.8-57.2 39.5-105.8 95.5-105.8H448c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H250.5c-38.5 0-74.7 15.1-101.2 40.1V128c0-11.7 9.6-21.3 21.3-21.3h682.7c11.7 0 21.3 9.6 21.3 21.3v405.3h42.7V106.7c0-23.5-19.2-42.7-42.6-42.7z" fill="#000000" ></path></symbol><symbol id="icon-wenjianhe" viewBox="0 0 1024 1024"><path d="M243.2 243.2c-12.4 0-22.4 10-22.4 22.4v380.8c0 12.4 10 22.4 22.4 22.4h89.6c12.4 0 22.4-10 22.4-22.4V265.6c0-12.4-10-22.4-22.4-22.4h-89.6zM310.4 624h-44.8V288h44.8v336zM467.2 400c-12.4 0-22.4 10-22.4 22.4v224c0 12.4 10 22.4 22.4 22.4h89.6c12.4 0 22.4-10 22.4-22.4v-224c0-12.4-10-22.4-22.4-22.4h-89.6z m67.2 224h-44.8V444.8h44.8V624zM691.2 467.2c-12.4 0-22.4 10-22.4 22.4v156.8c0 12.4 10 22.4 22.4 22.4h89.6c12.4 0 22.4-10 22.4-22.4V489.6c0-12.4-10-22.4-22.4-22.4h-89.6zM758.4 624h-44.8V512h44.8v112z" fill="#2c2c2c" ></path><path d="M937.6 422.4c12.4 0 22.4-10 22.4-22.4v-67.2c0-24.7-20.1-44.8-44.8-44.8H601.6V108.8c0-24.7-20.1-44.8-44.8-44.8h-448C84.2 64 64 84.2 64 108.8v806.4c0 24.6 20.2 44.8 44.8 44.8h806.4c24.6 0 44.8-20.2 44.8-44.8v-336c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4V736H108.8V131.2c0-12.3 10.1-22.4 22.4-22.4h403.2c12.4 0 22.4 10 22.4 22.4v179.2c0 12.4 10 22.4 22.4 22.4h313.6c12.4 0 22.4 10 22.4 22.4V400c0 12.4 10 22.4 22.4 22.4z m-22.4 358.4v112c0 12.3-10.1 22.4-22.4 22.4H131.2c-12.3 0-22.4-10.1-22.4-22.4v-112h806.4z" fill="#2c2c2c" ></path></symbol><symbol id="icon-tikuguanli" viewBox="0 0 1024 1024"><path d="M896 234.7c11.8 0 21.3-9.6 21.3-21.3V106.7c0-23.6-19.1-42.7-42.7-42.7H149.3c-23.6 0-42.7 19.1-42.7 42.7v810.7c0 23.6 19.1 42.7 42.7 42.7h725.3c23.6 0 42.7-19.1 42.7-42.7V384c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3v362.7H149.3V128c0-11.8 9.6-21.3 21.3-21.3h682.7c11.8 0 21.3 9.6 21.3 21.3v85.3c0.1 11.8 9.6 21.4 21.4 21.4z m-21.3 554.6V896c0 11.8-9.6 21.3-21.3 21.3H170.7c-11.8 0-21.3-9.6-21.3-21.3V789.3h725.3z" fill="#000000" ></path><path d="M277.3 234.7c-11.8 0-21.3 9.6-21.3 21.3v298.7c0 11.8 9.6 21.3 21.3 21.3h213.3c11.8 0 21.3-9.6 21.3-21.3V256c0-11.8-9.6-21.3-21.3-21.3H277.3z m192 298.6H298.7v-256h170.7v256z" fill="#000000" ></path></symbol><symbol id="icon-wangkeshichang" viewBox="0 0 1024 1024"><path d="M896 234.7c11.8 0 21.3-9.6 21.3-21.3V106.7c0-23.6-19.1-42.7-42.7-42.7H149.3c-23.6 0-42.7 19.1-42.7 42.7v810.7c0 23.6 19.1 42.7 42.7 42.7h725.3c23.6 0 42.7-19.1 42.7-42.7V384c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3v362.7H149.3V128c0-11.8 9.6-21.3 21.3-21.3h682.7c11.8 0 21.3 9.6 21.3 21.3v85.3c0.1 11.8 9.6 21.4 21.4 21.4z m-21.3 554.6V896c0 11.8-9.6 21.3-21.3 21.3H170.7c-11.8 0-21.3-9.6-21.3-21.3V789.3h725.3z" fill="#000000" ></path><path d="M443.5 240.4c-5.9-3.7-12.7-5.7-19.4-5.7-7 0-13.8 2.1-19.5 6.5-9.7 7.5-15.9 19.1-15.9 32v307.3c0 11.5 4.9 21.9 12.7 29.3 6.2 5.9 14.4 8.8 22.6 8.8 7 0 14-2.1 20.1-6.2l247.2-166.8c8-5.4 12.8-14.3 12.8-23.7 0-9.7-5-18.8-13.4-24.2L443.5 240.4z m-12.2 329.2V283.2l218.3 139.1-218.3 147.3z" fill="#000000" ></path></symbol><symbol id="icon-gongdan1" viewBox="0 0 1024 1024"><path d="M704 320H320c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h384c11.8 0 21.3-9.6 21.3-21.3 0-11.7-9.5-21.3-21.3-21.3zM725.3 512c0-11.8-9.6-21.3-21.3-21.3H320c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h384c11.8 0 21.3-9.5 21.3-21.3zM320 661.3c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3h170.7c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H320z" fill="#000000" ></path><path d="M896 234.7c11.8 0 21.3-9.6 21.3-21.3V106.7c0-23.6-19.1-42.7-42.7-42.7H149.3c-23.6 0-42.7 19.1-42.7 42.7v810.7c0 23.6 19.1 42.7 64 42.7h512l234.7-234.7V384c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3v298.7H661.3c-11.8 0-21.3 9.6-21.3 21.3v213.3H170.7c-11.8 0-21.3-9.6-21.3-21.3V128c0-11.8 9.6-21.3 21.3-21.3h682.7c11.8 0 21.3 9.6 21.3 21.3v85.3c0 11.8 9.5 21.4 21.3 21.4zM682.7 725.3h170.7L682.7 896V725.3z" fill="#000000" ></path></symbol><symbol id="icon-fangke" viewBox="0 0 1024 1024"><path d="M512 534.4c86.6 0 156.8-70.2 156.8-156.8 0-86.6-70.2-156.8-156.8-156.8S355.2 291 355.2 377.6c0 86.6 70.2 156.8 156.8 156.8z m0-268.8c61.9 0 112 50.1 112 112s-50.1 112-112 112-112-50.1-112-112 50.1-112 112-112zM349.5 598L246.3 770c-8.8 14.6 1.8 33.3 18.8 33.3h493.6c17.1 0 27.6-18.6 18.8-33.3l-103-172c-5.1-8.5-15.3-12.6-24.9-9.8l-23.1 6.6c-74.8 21.4-154.2 21.4-229 0l-23.1-6.6c-9.5-2.8-19.7 1.2-24.9 9.8z m30.7 29.4c85.6 28.5 178.1 28.5 263.6 0l76.9 131.8H303.3l76.9-131.8z" fill="#2c2c2c" ></path><path d="M937.6 243.2c12.4 0 22.4-10 22.4-22.4v-112c0-24.7-20.1-44.8-44.8-44.8H108.8C84.1 64 64 84.1 64 108.8v806.4c0 24.7 20.1 44.8 44.8 44.8h806.4c24.7 0 44.8-20.1 44.8-44.8V400c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v492.8c0 12.4-10 22.4-22.4 22.4H131.2c-12.4 0-22.4-10-22.4-22.4V131.2c0-12.4 10-22.4 22.4-22.4h761.6c12.4 0 22.4 10 22.4 22.4v89.6c0 12.4 10 22.4 22.4 22.4z" fill="#2c2c2c" ></path></symbol><symbol id="icon-xiansuoguanli" viewBox="0 0 1024 1024"><path d="M362.7 448c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3h298.7c11.7 0 21.3-9.6 21.3-21.3s-9.6-21.3-21.3-21.3H362.7z" fill="#000000" ></path><path d="M896 405.3c11.8 0 21.3-9.6 21.3-21.3v-64c0-23.5-19.2-42.7-42.7-42.7H677.3c7.9-31.1 7.9-65.7-5.1-101.1-21.5-59.1-75.5-103-138-110.7-104.3-13.2-192.9 67.6-192.9 169.2 0 14.7 1.9 29 5.3 42.7H149.3c-23.5 0-42.7 19.2-42.7 42.7v597.4c0 23.5 19.2 42.7 42.7 42.7h228c15.9 0 25.3-16.5 18.7-31-1.7-3.8-3.3-7.7-4.6-11.7-4.4-12.1-6.9-24.8-7.4-38.1-2.2-64 45.1-121.8 108.5-131.1C571.8 736.4 640 797.7 640 874.7c0 14.9-2.6 29.2-7.5 42.7-1.3 4-2.9 7.9-4.6 11.7-6.6 14.4 2.8 31 18.7 31h228c23.5 0 42.7-19.2 42.7-42.7V554.6c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3V896c0 11.7-9.6 21.3-21.3 21.3h-176c7.8-31.2 7.8-65.7-5.1-101-21.6-59.3-75.5-103.1-138.1-110.9-104.2-13.1-192.9 67.7-192.9 169.3 0 14.7 1.9 29 5.3 42.7h-176c-11.7 0-21.3-9.6-21.3-21.3V341.3c0-11.7 9.6-21.3 21.3-21.3h207c16 0 25.5-16.8 18.4-31.2-1.9-3.8-3.3-7.5-4.6-11.5-4.5-12.2-6.8-24.7-7.5-38.2-2.1-64 45.2-121.6 108.6-131C571.7 96.4 640 157.6 640 234.6c0 14.9-2.6 29.2-7.5 42.7-1.3 4-2.7 7.7-4.6 11.5-7.1 14.3 2.4 31.2 18.4 31.2h207c11.7 0 21.3 9.6 21.3 21.3V384c0.1 11.7 9.6 21.3 21.4 21.3z" fill="#000000" ></path></symbol><symbol id="icon-kehuguanli" viewBox="0 0 1024 1024"><path d="M693.3 405.3c0-70.6-57.4-128-128-128s-128 57.4-128 128c0 40.3 18.8 76.2 47.8 99.6-90 32.9-154.5 119-154.5 220.4 0 11.7 9.6 21.3 21.3 21.3s21.3-9.6 21.3-21.3c0-106 86-192 192-192 70.7 0 128.1-57.4 128.1-128z m-128 85.4c-47.1 0-85.3-38.2-85.3-85.3 0-47.1 38.2-85.3 85.3-85.3 47.1 0 85.3 38.2 85.3 85.3 0.1 47.1-38.1 85.3-85.3 85.3zM701.7 590.3c34.3 34.8 55.7 82.3 55.7 135 0 11.7 9.6 21.3 21.3 21.3 11.7 0 21.3-9.6 21.3-21.3 0-64.2-25.8-122.2-67.6-164.5-4.1-4.1-9.4-6.2-15.1-6.2-18.6 0.1-28.7 22.7-15.6 35.7z" fill="#000000" ></path><path d="M896 234.7c11.8 0 21.3-9.6 21.3-21.3V106.7c0-23.5-19.2-42.7-42.7-42.7H149.3c-23.5 0-42.7 19.2-42.7 42.7v810.7c0 23.5 19.2 42.7 42.7 42.7h725.3c23.5 0 42.7-19.2 42.7-42.7V384c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3v512c0 11.7-9.6 21.3-21.3 21.3H170.7c-11.7 0-21.3-9.6-21.3-21.3V128c0-11.7 9.6-21.3 21.3-21.3h682.7c11.7 0 21.3 9.6 21.3 21.3v85.3c0 11.8 9.5 21.4 21.3 21.4z" fill="#000000" ></path><path d="M650.7 640c0-11.7-9.6-21.3-21.3-21.3h-128c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3h128c11.7 0 21.3-9.6 21.3-21.3zM522.7 704c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3H608c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3h-85.3zM224 675.8c0 9.6 7.9 17.5 17.5 17.5s17.5-7.9 17.5-17.5c0-81.4 61.7-148.5 140.9-156.9 9.6-1 16.9-9.2 16.9-18.9 0-9.3-6.8-16.8-15.9-18.8-31.1-7.2-54.3-35-54.3-68.3 0-33.7 23.8-61.9 55.6-68.6 8.3-1.8 14.6-8.7 14.6-17.2 0-10.8-9.7-19.5-20.2-17.4-48.4 9.4-85 52.1-85 103.2 0 33.1 15.4 62.6 39.3 81.9-74 26.9-126.9 97.7-126.9 181z" fill="#000000" ></path></symbol><symbol id="icon-jituankehu" viewBox="0 0 1024 1024"><path d="M915.2 624h-89.6V512c0-24.7-20.1-44.8-44.8-44.8H534.4V400h156.8c24.7 0 44.8-20.1 44.8-44.8v-44.8c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v22.4c0 12.4-10 22.4-22.4 22.4H355.2c-12.4 0-22.4-10-22.4-22.4V131.2c0-12.4 10-22.4 22.4-22.4h313.6c12.4 0 22.4 10 22.4 22.4v22.4c0 12.4 10 22.4 22.4 22.4 12.4 0 22.4-10 22.4-22.4v-44.8c0-24.7-20.1-44.8-44.8-44.8H332.8c-24.7 0-44.8 20.1-44.8 44.8v246.4c0 24.7 20.1 44.8 44.8 44.8h156.8v67.2H243.2c-24.7 0-44.8 20.1-44.8 44.8v112h-89.6C84.2 624 64 644.2 64 668.8v246.4c0 24.6 20.2 44.8 44.8 44.8h246.4c24.6 0 44.8-20.2 44.8-44.8V668.8c0-24.6-20.2-44.8-44.8-44.8h-112v-89.6c0-12.4 10-22.4 22.4-22.4h492.8c12.4 0 22.4 10 22.4 22.4V624h-112c-24.6 0-44.8 20.2-44.8 44.8v246.4c0 24.6 20.2 44.8 44.8 44.8h246.4c24.6 0 44.8-20.2 44.8-44.8V668.8c0-24.6-20.2-44.8-44.8-44.8z m-582.4 44.8c12.3 0 22.4 10.1 22.4 22.4v201.6c0 12.3-10.1 22.4-22.4 22.4H131.2c-12.3 0-22.4-10.1-22.4-22.4V691.2c0-12.3 10.1-22.4 22.4-22.4h201.6z m582.4 224c0 12.3-10.1 22.4-22.4 22.4H691.2c-12.3 0-22.4-10.1-22.4-22.4V691.2c0-12.3 10.1-22.4 22.4-22.4h201.6c12.3 0 22.4 10.1 22.4 22.4v201.6z" fill="#000000" ></path><path d="M422.4 176c-12.3 0-22.4 10.1-22.4 22.4 0 12.3 10.1 22.4 22.4 22.4h112c12.3 0 22.4-10.1 22.4-22.4 0-12.3-10.1-22.4-22.4-22.4h-112z" fill="#000000" ></path></symbol><symbol id="icon-genjinjilu" viewBox="0 0 1024 1024"><path d="M725.3 576c-106 0-192 86-192 192s86 192 192 192 192-86 192-192-85.9-192-192-192z m0 341.3C642.9 917.3 576 850.5 576 768c0-82.5 66.9-149.3 149.3-149.3S874.7 685.5 874.7 768c0 82.5-66.9 149.3-149.4 149.3z" fill="#000000" ></path><path d="M874.7 64H149.3c-23.5 0-42.7 19.2-42.7 42.7v810.7c0 23.5 19.2 42.7 42.7 42.7H480c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H170.7c-11.7 0-21.3-9.6-21.3-21.3V128c0-11.7 9.6-21.3 21.3-21.3h682.7c11.7 0 21.3 9.6 21.3 21.3v384c0 11.8 9.6 21.3 21.3 21.3s21.3-9.6 21.3-21.3V106.7c0-23.5-19.2-42.7-42.6-42.7z" fill="#000000" ></path><path d="M746.7 780.5V704c0-11.7-9.6-21.3-21.3-21.3-11.7 0-21.3 9.6-21.3 21.3v85.3c0 0.2 0.1 0.3 0.1 0.5 0.1 2.6 0.5 5.2 1.6 7.6 0.6 1.5 1.7 2.7 2.7 4 0.7 0.9 1.1 2 1.9 2.9l38.3 38.3c8.3 8.3 21.9 8.3 30.2 0s8.3-21.9 0-30.2l-32.2-31.9zM298.7 320h426.7c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3H298.7c-11.7 0-21.3 9.6-21.3 21.3-0.1 11.7 9.5 21.3 21.3 21.3zM746.7 448c0-11.7-9.6-21.3-21.3-21.3H298.7c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3h426.7c11.7 0 21.3-9.6 21.3-21.3zM298.7 576c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3h170.7c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3H298.7z" fill="#000000" ></path></symbol><symbol id="icon-gongzuotai" viewBox="0 0 1024 1024"><path d="M937.6 915.2H86.4c-12.3 0-22.4 10.1-22.4 22.4 0 12.3 10.1 22.4 22.4 22.4h851.2c12.3 0 22.4-10.1 22.4-22.4 0-12.3-10.1-22.4-22.4-22.4zM220.8 198.4c-12.3 0-22.4 10.1-22.4 22.4V624c0 12.3 10.1 22.4 22.4 22.4h134.4c12.3 0 22.4-10.1 22.4-22.4V220.8c0-12.3-10.1-22.4-22.4-22.4H220.8z m112 403.2h-89.6V243.2h89.6v358.4zM825.6 220.8c0-12.3-9.5-22.4-21.2-22.4H466c-11.6 0-21.2 10.1-21.2 22.4v134.4c0 12.3 9.5 22.4 21.2 22.4h338.5c11.6 0 21.2-10.1 21.2-22.4V220.8z m-44.8 112H489.6v-89.6h291.2v89.6zM467.2 444.8c-12.3 0-22.4 11.3-22.4 25.2v151.2c0 13.9 10.1 25.2 22.4 25.2h112c12.3 0 22.4-11.3 22.4-25.2V470c0-13.9-10.1-25.2-22.4-25.2h-112z m89.6 156.8h-67.2v-112h67.2v112zM803.2 444.8h-112c-12.3 0-22.4 11.3-22.4 25.2v151.2c0 13.9 10.1 25.2 22.4 25.2h112c12.3 0 22.4-11.3 22.4-25.2V470c0-13.9-10.1-25.2-22.4-25.2z m-22.4 156.8h-67.2v-112h67.2v112z" fill="#000000" ></path><path d="M937.6 243.2c12.4 0 22.4-10 22.4-22.4v-112c0-24.6-20.2-44.8-44.8-44.8H108.8C84.2 64 64 84.2 64 108.8V736c0 24.6 20.2 44.8 44.8 44.8h806.4c24.6 0 44.8-20.2 44.8-44.8V400c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v313.6c0 12.3-10.1 22.4-22.4 22.4H131.2c-12.3 0-22.4-10.1-22.4-22.4V131.2c0-12.3 10.1-22.4 22.4-22.4h761.6c12.3 0 22.4 10.1 22.4 22.4v89.6c0 12.4 10 22.4 22.4 22.4z" fill="#000000" ></path></symbol><symbol id="icon-shujubaobiao" viewBox="0 0 1024 1024"><path d="M735.1 293.7L549.3 458.8l-97.1-97.1c-8.2-8.2-21.4-8.8-30.2-1.3L259.6 496.7c-9.5 7.9-10.7 22.1-2.8 31.5 4.4 5.3 10.8 8 17.2 8 5.1 0 10.2-1.7 14.4-5.3l146.7-123 97.5 97.5c8.4 8.4 21.9 8.8 30.7 0.9l201.6-179.2c9.3-8.2 10.1-22.4 1.9-31.6-8.3-9.2-22.5-10.1-31.7-1.8z" fill="#000000" ></path><path d="M937.6 243.2c12.4 0 22.4-10 22.4-22.4v-112c0-24.6-20.2-44.8-44.8-44.8H108.8C84.2 64 64 84.2 64 108.8v806.4c0 24.6 20.2 44.8 44.8 44.8h806.4c24.6 0 44.8-20.2 44.8-44.8V400c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v336H108.8V131.2c0-12.3 10.1-22.4 22.4-22.4h761.6c12.3 0 22.4 10.1 22.4 22.4v89.6c0 12.4 10 22.4 22.4 22.4z m-22.4 537.6v112c0 12.3-10.1 22.4-22.4 22.4H131.2c-12.3 0-22.4-10.1-22.4-22.4v-112h806.4z" fill="#000000" ></path></symbol><symbol id="icon-fangkebaobiao" viewBox="0 0 1024 1024"><path d="M937.6 243.2c12.4 0 22.4-10 22.4-22.4v-112c0-24.7-20.1-44.8-44.8-44.8H108.8C84.1 64 64 84.1 64 108.8v806.4c0 24.7 20.1 44.8 44.8 44.8h806.4c24.7 0 44.8-20.1 44.8-44.8V400c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v336H108.8V131.2c0-12.4 10-22.4 22.4-22.4h761.6c12.4 0 22.4 10 22.4 22.4v89.6c0 12.4 10 22.4 22.4 22.4z m-22.4 537.6v112c0 12.4-10 22.4-22.4 22.4H131.2c-12.4 0-22.4-10-22.4-22.4v-112h806.4z" fill="#000000" ></path><path d="M681.7 533.6L531.4 275.9c-8-13.8-30.7-13.8-38.7 0L342.3 533.6H220.8c-12.4 0-22.4 10-22.4 22.4s10 22.4 22.4 22.4h134.4c8 0 15.3-4.2 19.4-11.1L512 331.7l137.4 235.6c4 6.9 11.4 11.1 19.4 11.1h134.4c12.4 0 22.4-10 22.4-22.4s-10-22.4-22.4-22.4H681.7z" fill="#000000" ></path></symbol><symbol id="icon-zhangbuguanli" viewBox="0 0 1024 1024"><path d="M633.4 490.5c-8.3-8.3-21.9-8.3-30.2 0L512 581.7l-91.2-91.2c-8.3-8.3-21.9-8.3-30.2 0s-8.3 21.9 0 30.2l61.8 61.8H416c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3h74.7v64H416c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3h74.7V817c0 11.7 9.6 21.3 21.3 21.3 11.7 0 21.3-9.6 21.3-21.3v-85.3H608c11.7 0 21.3-9.6 21.3-21.3s-9.6-21.3-21.3-21.3h-74.7v-64H608c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3h-36.4l61.8-61.8c8.3-8.4 8.3-21.9 0-30.2z" fill="#000000" ></path><path d="M874.7 192H661.3V85.3c0-11.7-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3V192H384V85.3c0-11.7-9.6-21.3-21.3-21.3-11.7 0-21.3 9.6-21.3 21.3V192h-192c-23.5 0-42.7 19.2-42.7 42.7v682.7c0 23.5 19.2 42.7 42.7 42.7h725.3c23.5 0 42.7-19.2 42.7-42.7V640c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3v256c0 11.8-9.6 21.3-21.3 21.3H170.7c-11.8 0-21.3-9.6-21.3-21.3V405.3h725.3v64c0 11.8 9.6 21.3 21.3 21.3s21.3-9.6 21.3-21.3V234.6c0-23.4-19.2-42.6-42.6-42.6z m0 170.7H149.3V256c0-11.8 9.6-21.3 21.3-21.3h682.7c11.8 0 21.3 9.6 21.3 21.3v106.7z" fill="#000000" ></path></symbol><symbol id="icon-zhangbu" viewBox="0 0 1024 1024"><path d="M661.4 410.7c-8.7-8.7-23-8.7-31.7 0L512 528.4 394.3 410.7c-8.7-8.7-23-8.7-31.7 0s-8.7 23 0 31.7l87.8 87.8h-61.6c-12.3 0-22.4 10.1-22.4 22.4 0 12.3 10.1 22.4 22.4 22.4h100.8v67.2H388.8c-12.3 0-22.4 10.1-22.4 22.4 0 12.3 10.1 22.4 22.4 22.4h100.8v89.6c0 12.3 10.1 22.4 22.4 22.4 12.3 0 22.4-10.1 22.4-22.4V687h100.8c12.3 0 22.4-10.1 22.4-22.4 0-12.3-10.1-22.4-22.4-22.4H534.4V575h100.8c12.3 0 22.4-10.1 22.4-22.4 0-12.3-10.1-22.4-22.4-22.4h-61.6l87.8-87.8c8.7-8.7 8.7-22.9 0-31.7z" fill="#2c2c2c" ></path><path d="M915.2 64H108.8C84.2 64 64 84.2 64 108.8V915.2c0 24.6 20.2 44.8 44.8 44.8h806.4c24.6 0 44.8-20.2 44.8-44.8V534.4c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v358.4c0 12.3-10.1 22.4-22.4 22.4H131.2c-12.3 0-22.4-10.1-22.4-22.4V288h806.4v67.2c0 12.4 10 22.4 22.4 22.4 12.4 0 22.4-10 22.4-22.4V108.8c0-24.6-20.2-44.8-44.8-44.8z m0 179.2H108.8v-112c0-12.3 10.1-22.4 22.4-22.4h761.6c12.3 0 22.4 10.1 22.4 22.4v112z" fill="#2c2c2c" ></path></symbol><symbol id="icon-zhangbuzhongxin" viewBox="0 0 1024 1024"><path d="M654.2 383.6c-8.3-8.3-21.9-8.3-30.2 0l-112 112-112.1-112c-8.3-8.3-21.9-8.3-30.2 0s-8.3 21.9 0 30.2l83.6 83.6h-58.7c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3h96v64h-96c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3h96V732c0 11.7 9.6 21.3 21.3 21.3 11.7 0 21.3-9.6 21.3-21.3v-85.3h96c11.7 0 21.3-9.6 21.3-21.3s-9.6-21.3-21.3-21.3h-96v-64h96c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3h-58.7l83.6-83.6c8.4-8.5 8.4-22 0.1-30.3z" fill="#2c2c2c" ></path><path d="M896 298.7c11.8 0 21.3-9.6 21.3-21.3V170.7c0-23.5-19.2-42.7-42.7-42.7H725.3V85.3c0-11.7-9.6-21.3-21.3-21.3H320c-11.7 0-21.3 9.6-21.3 21.3V128H149.3c-23.5 0-42.7 19.2-42.7 42.7v746.7c0 23.5 19.2 42.7 42.7 42.7h725.3c23.5 0 42.7-19.2 42.7-42.7V448c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3v448c0 11.7-9.6 21.3-21.3 21.3H170.7c-11.7 0-21.3-9.6-21.3-21.3V192c0-11.7 9.6-21.3 21.3-21.3h128v42.7c0 11.7 9.6 21.3 21.3 21.3h384c11.7 0 21.3-9.6 21.3-21.3v-42.7h128c11.7 0 21.3 9.6 21.3 21.3v85.3c0.1 11.8 9.6 21.4 21.4 21.4zM682.7 128v64H341.3v-85.3h341.3V128z" fill="#2c2c2c" ></path></symbol><symbol id="icon-hetongguanli" viewBox="0 0 1024 1024"><path d="M725.3 576c-106 0-192 86-192 192s86 192 192 192 192-86 192-192-85.9-192-192-192z m0 341.3C642.9 917.3 576 850.5 576 768c0-82.5 66.9-149.3 149.3-149.3S874.7 685.5 874.7 768c0 82.5-66.9 149.3-149.4 149.3z" fill="#000000" ></path><path d="M874.7 64H149.3c-23.5 0-42.7 19.2-42.7 42.7v810.7c0 23.5 19.2 42.7 42.7 42.7H480c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H170.7c-11.7 0-21.3-9.6-21.3-21.3V128c0-11.7 9.6-21.3 21.3-21.3h682.7c11.7 0 21.3 9.6 21.3 21.3v384c0 11.8 9.6 21.3 21.3 21.3s21.3-9.6 21.3-21.3V106.7c0-23.5-19.2-42.7-42.6-42.7z" fill="#000000" ></path><path d="M298.7 320h426.7c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3H298.7c-11.7 0-21.3 9.6-21.3 21.3-0.1 11.7 9.5 21.3 21.3 21.3zM746.7 448c0-11.7-9.6-21.3-21.3-21.3H298.7c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3h426.7c11.7 0 21.3-9.6 21.3-21.3zM298.7 576c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3h170.7c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3H298.7zM803.1 737.3l-45.4-6.6-20.3-41.1c-4.6-9.2-19.7-9.2-24.3 0l-20.3 41.1-45.4 6.6c-5.1 0.7-9.3 4.3-10.9 9.2-1.6 4.9-0.3 10.3 3.4 13.9l32.8 32-7.8 45.2c-0.9 5.1 1.2 10.2 5.4 13.2 4.1 3 9.7 3.4 14.2 1l40.6-21.3 40.6 21.3c2 1 4.1 1.5 6.3 1.5 2.8 0 5.6-0.9 7.9-2.6 4.2-3 6.3-8.2 5.4-13.2l-7.8-45.2 32.8-32c3.7-3.6 5-9 3.4-13.9-1.3-4.8-5.5-8.4-10.6-9.1z m-49.3 40.6c-3.2 3.1-4.6 7.6-3.9 12l4.3 25.2-22.6-11.9c-2-1-4.1-1.5-6.3-1.5s-4.3 0.5-6.3 1.5l-22.6 11.9 4.3-25.2c0.8-4.4-0.7-8.9-3.9-12l-18.3-17.8 25.3-3.7c4.4-0.6 8.2-3.4 10.2-7.4l11.3-22.9 11.3 22.9c2 4 5.8 6.8 10.2 7.4l25.3 3.7-18.3 17.8z" fill="#000000" ></path></symbol><symbol id="icon-yunyingzhe" viewBox="0 0 1024 1024"><path d="M872.5 615.1c4.7-45.2 1.1-89.2-9.4-129.9-2.3-9.4-11.1-15.8-20.9-15.8-12.2 0-21.3 9.8-21.3 21.1 0 1.9 0.4 3.8 0.9 5.8 8.5 32.9 12.2 67.8 9.2 104.1-10-1.9-20.3-3-30.9-3-88.3 0-160 71.7-160 160 0 35.8 11.7 68.9 32 95.6-39 22.8-83.2 37.5-129.9 41.8C472.5 901 407 885.2 352 853c20.3-26.7 32-59.7 32-95.6 0-88.3-71.7-160-160-160-10.7 0-20.9 1.1-30.9 3-1.9-22.2-1.3-45.2 1.9-68.5 13.7-102 77-190.1 164.7-237.9 20.5 64.6 81.1 111.4 152.3 111.4 71 0 131.4-46.5 152.1-110.7 29.9 16 56.7 36.9 79.8 61.2 4.1 4.3 9.4 6.8 15.4 6.8 12.8 0 21.3-10.5 21.3-21.5 0-5.1-1.9-10.5-6-14.7-29.4-30.9-64.2-56.8-102.8-76 0.2-1.7 0.2-3.4 0.2-5.1 0-88.3-71.7-160-160-160s-160 71.7-160 160c0 1.7 0 3.6 0.2 5.3-112.9 56.1-193.3 169.6-202 300.2-1.5 21.8-1.1 43.3 1.3 64.2C99.4 641.3 64 695.3 64 757.4c0 88.3 71.7 160 160 160 36.5 0 70-12.2 96.9-33.1C388.1 926.1 470 946.4 557 936c52.9-6.4 102.6-24.5 146.1-51.6 26.9 20.9 60.4 33.1 96.9 33.1 88.3 0 160-71.7 160-160 0-62.2-35.4-116.2-87.5-142.4zM395.3 232.8C401.7 173.9 451.4 128 512 128s110.3 45.7 116.5 104.5c0.6 4.1 0.9 8.5 0.9 12.8 0 10.9-1.5 21.3-4.3 31.1-13.4 49.7-59.1 86.2-113.1 86.2-54.2 0-99.6-36.5-113.1-86.4-2.8-9.8-4.3-20.3-4.3-30.9 0.1-4.2 0.3-8.5 0.7-12.5z m-78.9 596.7c-8.7 11.5-19.8 21.3-32.4 28.6-17.5 10.7-38 16.6-59.9 16.6-64.9 0-117.3-52.5-117.3-117.3 0-41 20.9-76.8 52.5-97.7 11.9-7.9 25.2-13.7 39.7-16.9 8.1-1.9 16.4-2.8 25.2-2.8 64.9 0 117.3 52.5 117.3 117.3-0.2 27.4-9.6 52.3-25.1 72.2zM800 874.7c-22 0-42.5-6-59.9-16.6-12.8-7.3-23.9-17.3-32.6-29-15.6-19.6-24.7-44.6-24.7-71.7 0-64.9 52.5-117.3 117.3-117.3 8.5 0 16.9 0.9 24.7 2.6 14.7 3.2 28.4 9.2 40.3 17.1 31.6 20.9 52.3 57 52.3 97.7-0.1 64.7-52.5 117.2-117.4 117.2z" fill="#2c2c2c" ></path><path d="M405.3 576c0 58.9 47.8 106.7 106.7 106.7S618.7 634.9 618.7 576 570.9 469.4 512 469.4 405.3 517.1 405.3 576z m170.7 0c0 35.3-28.7 64-64 64s-64-28.7-64-64 28.7-64 64-64 64 28.7 64 64z" fill="#2c2c2c" ></path></symbol><symbol id="icon-zhaopinguanli" viewBox="0 0 1024 1024"><path d="M896 405.3c11.8 0 21.3-9.6 21.3-21.3v-76.5c0-5.7-2.2-11.1-6.2-15.1L688.9 70.2c-4-4-9.4-6.2-15.1-6.2H149.3c-23.5 0-42.7 19.2-42.7 42.7v810.7c0 23.5 19.2 42.7 42.7 42.7h725.3c23.5 0 42.7-19.2 42.7-42.7V554.7c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3V896c0 11.7-9.6 21.3-21.3 21.3H170.7c-11.7 0-21.3-9.6-21.3-21.3V128c0-11.7 9.6-21.3 21.3-21.3H660L874.7 320v64c0 11.8 9.5 21.3 21.3 21.3z" fill="#000000" ></path><path d="M704 682.7c0-11.7-9.6-21.3-21.3-21.3H341.3c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3h341.3c11.8 0 21.4-9.6 21.4-21.3zM341.3 768c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3h213.3c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3H341.3zM584.1 398.1c21.1-19.5 34.5-47.1 34.5-78.1 0-58.9-47.8-106.7-106.7-106.7S405.3 261.1 405.3 320c0 31 13.4 58.6 34.5 78.1C369.6 426.7 320 495.5 320 576c0 11.7 9.6 21.3 21.3 21.3 11.7 0 21.3-9.6 21.3-21.3 0-82.5 66.9-149.3 149.3-149.3S661.3 493.5 661.3 576c0 11.7 9.6 21.3 21.3 21.3 11.7 0 21.3-9.6 21.3-21.3 0.1-80.5-49.5-149.3-119.8-177.9zM512 384c-35.3 0-64-28.7-64-64s28.7-64 64-64 64 28.7 64 64-28.7 64-64 64z" fill="#000000" ></path></symbol><symbol id="icon-gongziguanli" viewBox="0 0 1024 1024"><path d="M937.6 556.8c12.4 0 22.4-10 22.4-22.4v-67.2c0-24.6-20.2-44.8-44.8-44.8h-89.6V108.8c0-24.6-20.2-44.8-44.8-44.8H243.2c-24.6 0-44.8 20.2-44.8 44.8v313.6h-89.6c-24.6 0-44.8 20.2-44.8 44.8v448c0 24.6 20.2 44.8 44.8 44.8h806.4c24.6 0 44.8-20.2 44.8-44.8V713.6c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v179.2c0 12.3-10.1 22.4-22.4 22.4H131.2c-12.3 0-22.4-10.1-22.4-22.4V489.6c0-12.3 10.1-22.4 22.4-22.4H310l105.3 126.3c4.3 5.1 10.6 8.1 17.2 8.1h158.3c6.6 0 12.9-2.9 17.2-8l106-126.4h201.2v67.2c0 12.4 10 22.4 22.4 22.4zM780.8 422.4H702.1c-6.6 0-12.9 2.9-17.2 8l-30.7 36.8-75 89.6h-134L370 467.2l-30.9-36.8c-4.3-5.1-10.5-8-17.2-8H243.2V131.2c0-12.3 10.1-22.4 22.4-22.4h492.8c12.3 0 22.4 10.1 22.4 22.4v291.2z" fill="#000000" ></path><path d="M332.8 691.2c-12.3 0-22.4 10.1-22.4 22.4 0 12.3 10.1 22.4 22.4 22.4h358.4c12.3 0 22.4-10.1 22.4-22.4 0-12.3-10.1-22.4-22.4-22.4H332.8zM597.8 182.5L512 268.3l-85.8-85.8c-8.7-8.7-23-8.7-31.7 0s-8.7 23 0 31.7l73.8 73.8h-46c-12.3 0-22.4 10.1-22.4 22.4s10.1 22.4 22.4 22.4h67.2v44.8h-67.2c-12.3 0-22.4 10.1-22.4 22.4s10.1 22.4 22.4 22.4h67.2v44.8c0 12.3 10.1 22.4 22.4 22.4s22.4-10.1 22.4-22.4v-44.8h67.2c12.3 0 22.4-10.1 22.4-22.4s-10.1-22.4-22.4-22.4h-67.2v-44.8h67.2c12.3 0 22.4-10.1 22.4-22.4S613.8 288 601.5 288h-45.8l73.8-73.8c8.7-8.7 8.7-23 0-31.7s-23-8.7-31.7 0z" fill="#000000" ></path></symbol><symbol id="icon-wodeshenpi" viewBox="0 0 1024 1024"><path d="M725.3 576c-106 0-192 86-192 192s86 192 192 192 192-86 192-192-85.9-192-192-192z m0 341.3C642.9 917.3 576 850.5 576 768c0-82.5 66.9-149.3 149.3-149.3S874.7 685.5 874.7 768c0 82.5-66.9 149.3-149.4 149.3z" fill="#000000" ></path><path d="M512 533.3c138.5 0 248.7-119.9 233.2-261.3-12-107.3-99.2-194.6-206.5-206.5-141.4-15.6-261.3 94.7-261.3 233.2 0 90 50.8 168.1 125 207.4-170.5 48-295.7 204.2-295.7 390 0 11.5 0.6 22.8 1.9 33.9 0.2 4.1 0.6 7.9 1.1 11.7 1.3 10.5 10.5 18.3 21.1 18.3H384c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3H150c-0.4-7-0.6-14.1-0.6-21.3-0.1-200.4 162.3-362.8 362.6-362.8zM322.8 331.1C301 199.7 413 87.7 544.4 109.4c79.6 13 143.8 77.2 156.8 156.8C723 397.6 611 509.6 479.6 487.9c-79.6-13-143.8-77.2-156.8-156.8zM780.6 709.3l-71 71-28.8-28.8c-4.1-4.1-9.6-6.2-15.1-6.2s-11.1 2.1-15.1 6.2c-8.3 8.3-8.3 22 0 30.3l38 38v0.2l7.3 7c3.6 3.6 8.7 5.8 13.9 6 5.1-0.2 9.8-2.3 13.7-6l7.7-7.7 80-80c4.1-4.3 6.2-9.6 6.2-14.9 0-5.5-2.1-11.1-6.2-15.1-8.6-8.4-22.3-8.4-30.6 0z" fill="#000000" ></path></symbol><symbol id="icon-mobanshezhi" viewBox="0 0 1024 1024"><path d="M938.7 277.3c11.8 0 21.3-9.6 21.3-21.3V149.3c0-23.5-19.2-42.7-42.7-42.7H106.7c-23.5 0-42.7 19.2-42.7 42.7v725.3c0 23.5 19.2 42.7 42.7 42.7h810.7c23.5 0 42.7-19.2 42.7-42.7v-448c0-11.8-9.6-21.3-21.3-21.3-11.8 0-21.3 9.6-21.3 21.3v64h-512V149.3H896c11.7 0 21.3 9.6 21.3 21.3V256c0 11.8 9.6 21.3 21.4 21.3z m-576 597.4H128c-11.7 0-21.3-9.6-21.3-21.3V170.7c0-11.7 9.6-21.3 21.3-21.3h234.7v725.3z m554.6-341.4v320c0 11.7-9.6 21.3-21.3 21.3H405.3V533.3h512z" fill="#2c2c2c" ></path></symbol><symbol id="icon-jichushezhi" viewBox="0 0 1024 1024"><path d="M758.4 265.6H377.6v-44.8c0-12.3-10.1-22.4-22.4-22.4-12.3 0-22.4 10.1-22.4 22.4v44.8h-67.2c-12.3 0-22.4 10.1-22.4 22.4s10.1 22.4 22.4 22.4h67.2v44.8c0 12.3 10.1 22.4 22.4 22.4 12.3 0 22.4-10.1 22.4-22.4v-44.8h380.8c12.3 0 22.4-10.1 22.4-22.4s-10.1-22.4-22.4-22.4zM355.2 825.6c12.3 0 22.4-10.1 22.4-22.4v-44.8h380.8c12.3 0 22.4-10.1 22.4-22.4s-10.1-22.4-22.4-22.4H377.6v-44.8c0-12.3-10.1-22.4-22.4-22.4-12.3 0-22.4 10.1-22.4 22.4v44.8h-67.2c-12.3 0-22.4 10.1-22.4 22.4s10.1 22.4 22.4 22.4h67.2v44.8c0 12.3 10.1 22.4 22.4 22.4zM265.6 534.4H512c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4H265.6c-12.3 0-22.4 10.1-22.4 22.4 0 12.3 10.1 22.4 22.4 22.4zM758.4 489.6h-112v-44.8c0-12.3-10.1-22.4-22.4-22.4s-22.4 10.1-22.4 22.4V579.2c0 12.3 10.1 22.4 22.4 22.4s22.4-10.1 22.4-22.4v-44.8h112c12.3 0 22.4-10.1 22.4-22.4 0-12.3-10.1-22.4-22.4-22.4z" fill="#000000" ></path><path d="M937.6 243.2c12.4 0 22.4-10 22.4-22.4v-112c0-24.7-20.1-44.8-44.8-44.8H108.8C84.1 64 64 84.1 64 108.8v806.4c0 24.7 20.1 44.8 44.8 44.8h806.4c24.7 0 44.8-20.1 44.8-44.8V400c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v492.8c0 12.4-10 22.4-22.4 22.4H131.2c-12.4 0-22.4-10-22.4-22.4V131.2c0-12.4 10-22.4 22.4-22.4h761.6c12.4 0 22.4 10 22.4 22.4v89.6c0 12.4 10 22.4 22.4 22.4z" fill="#000000" ></path></symbol><symbol id="icon-caiwushezhi" viewBox="0 0 1024 1024"><path d="M677.9 293.5c-8.3-8.3-21.9-8.3-30.2 0L512 429.2 376.3 293.5c-8.3-8.3-21.9-8.3-30.2 0s-8.3 21.9 0 30.2l114.4 114.4h-87.2c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3h117.3v64H373.3c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3h117.3v128c0 11.7 9.6 21.3 21.3 21.3 11.7 0 21.3-9.6 21.3-21.3v-128h117.3c11.7 0 21.3-9.6 21.3-21.3s-9.6-21.3-21.3-21.3H533.3v-64h117.3c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3h-87.2l114.4-114.4c8.4-8.3 8.4-21.9 0.1-30.2z" fill="#000000" ></path><path d="M885.8 265.4c-3.9-5.9-10.7-9.4-17.8-9.4-17.1 0-26.8 18.9-17.4 33.2 50 75.7 75.3 169.1 64.3 268.8-20.7 187.8-173.4 338.6-361.4 357.3-256 25.4-469.4-187.7-444.8-443.5 17.9-185.7 165-337.8 350.1-361.6 111.5-14.3 215.2 17.1 295.9 77.6 3.7 2.7 8.1 4.3 12.6 4.3 20.5 0 29.5-26.3 13.1-38.6-87.2-65.4-199-99.8-319.1-86.6C253.9 89.7 87.5 257.5 66.4 465c-28.9 283.6 207 520.3 490.4 492.9 211.9-20.5 382.6-193.1 401.4-405.1 9.5-106.7-18.7-206.2-72.4-287.4z" fill="#000000" ></path></symbol><symbol id="icon-chanpinshezhi" viewBox="0 0 1024 1024"><path d="M915.2 545.6H590.4c-24.7 0-44.8 20.1-44.8 44.8v324.8c0 24.7 20.1 44.8 44.8 44.8h324.8c24.7 0 44.8-20.1 44.8-44.8V590.4c0-24.7-20.1-44.8-44.8-44.8z m0 347.2c0 12.4-10 22.4-22.4 22.4h-280c-12.4 0-22.4-10-22.4-22.4v-280c0-12.4 10-22.4 22.4-22.4h280c12.4 0 22.4 10 22.4 22.4v280zM433.6 64H108.8C84.1 64 64 84.1 64 108.8v324.8c0 24.7 20.1 44.8 44.8 44.8h324.8c24.7 0 44.8-20.1 44.8-44.8V108.8c0-24.7-20.1-44.8-44.8-44.8z m0 347.2c0 12.4-10 22.4-22.4 22.4h-280c-12.4 0-22.4-10-22.4-22.4v-280c0-12.4 10-22.4 22.4-22.4h280c12.4 0 22.4 10 22.4 22.4v280zM433.6 545.6H108.8c-24.7 0-44.8 20.1-44.8 44.8v324.8c0 24.7 20.1 44.8 44.8 44.8h324.8c24.7 0 44.8-20.1 44.8-44.8V590.4c0-24.7-20.1-44.8-44.8-44.8z m0 347.2c0 12.4-10 22.4-22.4 22.4h-280c-12.4 0-22.4-10-22.4-22.4v-280c0-12.4 10-22.4 22.4-22.4h280c12.4 0 22.4 10 22.4 22.4v280zM937.6 176c12.4 0 22.4-10 22.4-22.4v-44.8c0-24.7-20.1-44.8-44.8-44.8H590.4c-24.7 0-44.8 20.1-44.8 44.8v324.8c0 24.7 20.1 44.8 44.8 44.8h324.8c24.7 0 44.8-20.1 44.8-44.8v-78.4c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v56c0 12.4-10 22.4-22.4 22.4h-280c-12.4 0-22.4-10-22.4-22.4v-280c0-12.4 10-22.4 22.4-22.4h280c12.4 0 22.4 10 22.4 22.4v22.4c0 12.4 10 22.4 22.4 22.4z" fill="#000000" ></path><path d="M332.8 176H198.4c-12.3 0-22.4 10.1-22.4 22.4 0 12.3 10.1 22.4 22.4 22.4h134.4c12.3 0 22.4-10.1 22.4-22.4 0-12.3-10.1-22.4-22.4-22.4z" fill="#000000" ></path></symbol><symbol id="icon-shenpishezhi" viewBox="0 0 1024 1024"><path d="M937.6 243.2c12.4 0 22.4-10 22.4-22.4v-112c0-24.6-20.2-44.8-44.8-44.8H108.8C84.2 64 64 84.2 64 108.8v806.4c0 24.6 20.2 44.8 44.8 44.8h156.8c12.4 0 22.4-10 22.4-22.4V803.2c0-12.3 10.1-22.4 22.4-22.4h403.2c12.3 0 22.4 10.1 22.4 22.4v134.4c0 12.4 10 22.4 22.4 22.4h156.8c24.6 0 44.8-20.2 44.8-44.8V400c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v492.8c0 12.3-10.1 22.4-22.4 22.4h-112V780.8c0-24.6-20.2-44.8-44.8-44.8h-55.5l-88.6-153.4c66.5-33.2 109.5-106.4 97.2-188.2-11.9-78.4-76.8-140.8-155.6-150-108.6-12.6-200.7 71.9-200.7 177.9 0 70.2 40.5 130.8 99.3 160.2L343.5 736H288c-24.6 0-44.8 20.2-44.8 44.8v134.4h-112c-12.3 0-22.4-10.1-22.4-22.4V131.2c0-12.3 10.1-22.4 22.4-22.4h761.6c12.3 0 22.4 10.1 22.4 22.4v89.6c0 12.4 10 22.4 22.4 22.4z m-560 179.2c0-74.2 60.2-134.4 134.4-134.4s134.4 60.2 134.4 134.4S586.2 556.8 512 556.8s-134.4-60.2-134.4-134.4z m97.5 175.3c11.9 2.5 24.3 3.9 36.9 3.9 12.7 0 25-1.4 36.9-3.8L628.7 736H395.2l79.9-138.3z" fill="#000000" ></path></symbol><symbol id="icon-mubiaoguanli" viewBox="0 0 1024 1024"><path d="M255.6 511.8c0-11.7-9.6-21.3-21.3-21.3-11.7 0-21.3 9.6-21.3 21.3 0 157 121.2 285.9 275.2 297.8 12.6 0.9 23.5-8.7 23.5-21.3 0-10.9-8.3-20.5-19.2-21.1-132.5-9.8-236.9-120.6-236.9-255.4z" fill="#000000" ></path><path d="M944.7 396c-4.2-15.7-24-21-35.5-9.5-5.4 5.3-7.3 13.1-5.3 20.4 40.2 150.6-7.7 319.8-143.9 425.9-146 113.8-355.7 112.4-500.4-3C66.7 676 55.1 394.3 224.5 225.1 330.8 118.9 481.3 84 616.7 120.1c7.3 1.9 15 0 20.4-5.3 11.5-11.5 6.2-31.3-9.5-35.5-152.6-40.7-322.3-0.2-440 122.5C26.9 369.2 22.3 638.6 177.5 811 350.9 1003.6 648 1009.5 829 828.7 946.4 711.4 984.7 545.4 944.7 396z" fill="#000000" ></path><path d="M611.8 239l35.6 107-92.3 92.2c-41.5-27.4-97.9-22.9-134.5 13.6-41.7 41.7-41.7 109.2 0 150.9s109.4 41.7 151.1 0c36.6-36.5 41.1-92.9 13.6-134.3l92.5-92.4 107 35.7c3.8 1.3 8.1 0.3 10.9-2.6l111.8-111.7c9-9 5.4-24.2-6.6-28.3l-110.3-37L754.5 123c-4-12.1-19.3-15.7-28.3-6.7L614.4 228.1c-2.9 2.9-3.9 7.1-2.6 10.9z m-70.3 333.5c-25 25-65.6 25-90.7 0-25-25-25-65.5 0-90.5s65.6-25 90.7 0c25 25 25 65.5 0 90.5z m189.1-400.1l29.7 90.1 91.1 30.7-75.6 75.5-91.1-30.7-29.7-90.2 75.6-75.4z" fill="#000000" ></path></symbol><symbol id="icon-zhandianshezhi" viewBox="0 0 1024 1024"><path d="M736 780.8l0 134.4c0 24.70000001 20.1 44.8 44.8 44.8L915.2 960c24.70000001 0 44.8-20.1 44.8-44.8L960 780.8c0-24.70000001-20.1-44.8-44.8-44.8l-44.8 0L870.4 534.4c0-12.4-10-22.4-22.4-22.4l-313.6 0L534.4 400 691.2 400c24.6 0 44.8-20.2 44.80000001-44.8l-1e-8-44.8c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4l0 22.4c0 12.4-10 22.4-22.4 22.4l-313.6 0c-12.4 0-22.4-10-22.4-22.4L332.80000001 131.2c0-12.4 10-22.4 22.39999999-22.39999999L668.8 108.80000001c12.4 0 22.4 10 22.39999999 22.39999999l1e-8 22.4c0 12.4 10 22.4 22.4 22.4 12.4 0 22.4-10 22.4-22.4l0-44.8C736 84.2 715.8 64 691.2 64l-358.4 0c-24.6 0-44.8 20.2-44.8 44.8l-1e-8 246.4c0 24.6 20.2 44.8 44.80000001 44.8L489.6 400l0 112L176 512c-12.4 0-22.4 10-22.4 22.4L153.6 736l-44.8 0c-24.70000001 0-44.8 20.1-44.8 44.8l0 134.4c0 24.70000001 20.1 44.8 44.8 44.8L243.2 960c24.70000001 0 44.8-20.1 44.8-44.8L288 780.8c0-24.70000001-20.1-44.8-44.8-44.8l-44.8 1e-8L198.4 556.8 489.6 556.8 489.60000001 736l-44.80000001 0c-24.70000001 0-44.8 20.1-44.8 44.8l0 134.4c0 24.70000001 20.1 44.8 44.8 44.8L579.2 960c24.70000001 0 44.8-20.1 44.8-44.8L624 780.8c0-24.70000001-20.1-44.8-44.8-44.8l-44.80000001 0L534.4 556.8 825.6 556.8 825.6 736.00000001l-44.8-1e-8c-24.70000001 0-44.8 20.1-44.8 44.8z m156.8 0c12.4 0 22.4 10 22.4 22.4l0 89.6c0 12.4-10 22.4-22.4 22.4l-89.6 0c-12.4 0-22.4-10-22.4-22.4l0-89.6c0-12.4 10-22.4 22.4-22.4l89.6 0z m-672 0c12.4 0 22.4 10 22.4 22.4l0 89.6c0 12.4-10 22.4-22.4 22.4l-89.6 0c-12.4 0-22.4-10-22.4-22.4l0-89.6c0-12.4 10-22.4 22.4-22.4l89.6 0z m336 0c12.4 0 22.4 10 22.4 22.4l0 89.6c0 12.4-10 22.4-22.4 22.4l-89.6 0c-12.4 0-22.4-10-22.4-22.4l0-89.6c0-12.4 10-22.4 22.4-22.4l89.6 0z" fill="#000000" ></path><path d="M422.4 176.00000001c-12.4 0-22.4 10-22.4 22.39999999 0 12.4 10 22.4 22.4 22.4l112 0c12.4 0 22.4-10 22.4-22.4 0-12.4-10-22.4-22.4-22.4l-112 1e-8z" fill="#000000" ></path></symbol><symbol id="icon-renshishezhi" viewBox="0 0 1024 1024"><path d="M681.7 664.2c1.1 10.6 10.4 18.5 21 18.5 12.8 0 22.7-11.2 21.3-23.9-8.9-79.4-61.4-145.6-132.9-174.2C620.8 461.1 640 424.8 640 384c0-70.7-57.3-128-128-128s-128 57.3-128 128c0 40.8 19.2 77.1 48.9 100.5-71.6 28.6-124.1 94.8-132.9 174.2-1.4 12.7 8.5 23.9 21.3 23.9 10.7 0 19.9-7.9 21-18.5C351.5 578.6 424 512 512 512s160.5 66.6 169.7 152.2zM512 469.3c-47.1 0-85.3-38.2-85.3-85.3 0-47.1 38.2-85.3 85.3-85.3s85.3 38.2 85.3 85.3c0 47.1-38.2 85.3-85.3 85.3z" fill="#000000" ></path><path d="M577.5 624.6l-91.9 91.9-39.2-39.2c-8.3-8.3-21.9-8.3-30.2 0s-8.3 21.9 0 30.2l54 54c0.1 0.1 0.1 0.2 0.2 0.4 4.2 4.2 9.7 6.2 15.1 6.2 5.5 0 11-2 15.1-6.2 0.1-0.1 0.1-0.2 0.2-0.4l106.7-106.7c8.3-8.3 8.3-21.9 0-30.2s-21.7-8.3-30 0z" fill="#000000" ></path><path d="M896 234.7c11.8 0 21.3-9.6 21.3-21.3V106.7c0-23.5-19.2-42.7-42.7-42.7H149.3c-23.5 0-42.7 19.2-42.7 42.7v810.7c0 23.5 19.2 42.7 42.7 42.7h725.3c23.5 0 42.7-19.2 42.7-42.7V384c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3v512c0 11.7-9.6 21.3-21.3 21.3H170.7c-11.7 0-21.3-9.6-21.3-21.3V128c0-11.7 9.6-21.3 21.3-21.3h682.7c11.7 0 21.3 9.6 21.3 21.3v85.3c0 11.8 9.5 21.4 21.3 21.4z" fill="#000000" ></path></symbol><symbol id="icon-mingpianshezhi" viewBox="0 0 1024 1024"><path d="M640 469.3h85.3c11.7 0 21.3-9.6 21.3-21.3s-9.6-21.3-21.3-21.3H640c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3zM640 576h128c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3H640c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3zM640 704h170.7c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3H640c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3zM213.3 725.3c0 11.8 9.6 21.3 21.3 21.3 11.8 0 21.3-9.6 21.3-21.3 0-70.7 57.3-128 128-128s128 57.3 128 128c0 11.8 9.6 21.3 21.3 21.3 11.8 0 21.3-9.6 21.3-21.3 0-69.1-41.1-128.4-100.1-155.3 22-19.5 36.1-47.7 36.1-79.4 0-58.9-47.8-106.7-106.7-106.7s-106.7 47.8-106.7 106.7c0 31.7 14.1 59.9 36.1 79.4-58.8 27-99.9 86.3-99.9 155.3zM384 426.7c35.3 0 64 28.7 64 64s-28.7 64-64 64-64-28.7-64-64 28.7-64 64-64z" fill="#000000" ></path><path d="M938.7 277.3c11.8 0 21.3-9.6 21.3-21.3V149.3c0-23.5-19.2-42.7-42.7-42.7H746.7c-11.8 0-21.3 9.6-21.3 21.3v40c0 21.3-14.4 41.1-35.4 44.7-26.6 4.5-50-16.2-50-42.1V128c0-11.8-9.6-21.3-21.3-21.3H405.4c-11.8 0-21.3 9.6-21.3 21.3v40c0 21.3-14.4 41.1-35.4 44.7-26.6 4.5-50-16.2-50-42.1V128c0-11.8-9.6-21.3-21.3-21.3H106.7c-23.5 0-42.7 19.2-42.7 42.7v725.3c0 23.5 19.2 42.7 42.7 42.7h810.7c23.5 0 42.7-19.2 42.7-42.7v-448c0-11.8-9.6-21.3-21.3-21.3-11.8 0-21.3 9.6-21.3 21.3v426.7c0 11.7-9.6 21.3-21.3 21.3H128c-11.7 0-21.3-9.6-21.3-21.3V170.7c0-11.7 9.6-21.3 21.3-21.3h128v17.3c0 44.5 32.3 84.4 76.6 88.9 50.8 5.1 94.1-35.1 94.1-84.9v-21.3h170.7v17.3c0 44.5 32.3 84.4 76.6 88.9 50.8 5.1 94.1-35.1 94.1-84.9v-21.3h128c11.7 0 21.3 9.6 21.3 21.3V256c-0.1 11.8 9.5 21.3 21.3 21.3z" fill="#000000" ></path></symbol><symbol id="icon-kechengshezhi" viewBox="0 0 1024 1024"><path d="M440 406c-6.2-3.9-13.3-6-20.4-6-7.3 0-14.5 2.2-20.5 6.9-10.1 7.9-16.7 20.1-16.7 33.6v322.7c0 12 5.1 22.9 13.4 30.8 6.5 6.2 15.1 9.3 23.7 9.3 7.3 0 14.7-2.2 21.1-6.5l259.5-175.1c8.4-5.7 13.4-15 13.4-24.9 0-10.2-5.3-19.8-14.1-25.4L440 406z m-12.7 345.7V451l229.2 146.1-229.2 154.6z" fill="#2c2c2c" ></path><path d="M937.6 377.6c12.4 0 22.4-10 22.4-22.4V108.8c0-24.6-20.2-44.8-44.8-44.8H108.8C84.2 64 64 84.2 64 108.8v806.4c0 24.6 20.2 44.8 44.8 44.8h806.4c24.6 0 44.8-20.2 44.8-44.8V534.4c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v358.4c0 12.3-10.1 22.4-22.4 22.4H131.2c-12.3 0-22.4-10.1-22.4-22.4V288h806.4v67.2c0 12.4 10 22.4 22.4 22.4zM108.8 243.2v-112c0-12.3 10.1-22.4 22.4-22.4h761.6c12.3 0 22.4 10.1 22.4 22.4v112H108.8z" fill="#2c2c2c" ></path></symbol><symbol id="icon-wodedianping" viewBox="0 0 1024 1024"><path d="M585.4 249.6L303 532.1c-6.9 6.9-11.3 15.7-12.7 25.3l-27 189.2c-1.3 8.9 6.3 16.5 15.2 15.2l189.2-27c9.6-1.4 18.5-5.8 25.3-12.7l282.5-282.5c17.4-17.4 17.4-45.9 0-63.4L648.8 249.6c-17.4-17.4-46-17.4-63.4 0zM308.2 716.9L332 566.4l126.7 126.7-150.5 23.8z m182.2-55.5L363.7 534.7l158.4-158.4L648.8 503 490.4 661.4zM728 423.9l-47.5 47.5-126.8-126.7 47.5-47.5c8.7-8.7 23-8.7 31.7 0l95 95c8.8 8.7 8.8 22.9 0.1 31.7z" fill="#000000" ></path><path d="M937.6 243.2c12.4 0 22.4-10 22.4-22.4v-112c0-24.6-20.2-44.8-44.8-44.8H108.8C84.2 64 64 84.2 64 108.8v806.4c0 24.6 20.2 44.8 44.8 44.8h806.4c24.6 0 44.8-20.2 44.8-44.8V400c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v492.8c0 12.3-10.1 22.4-22.4 22.4H131.2c-12.3 0-22.4-10.1-22.4-22.4V131.2c0-12.3 10.1-22.4 22.4-22.4h761.6c12.3 0 22.4 10.1 22.4 22.4v89.6c0 12.4 10 22.4 22.4 22.4z" fill="#000000" ></path></symbol><symbol id="icon-biaoxingyuangong" viewBox="0 0 1024 1024"><path d="M512 533.3c138.5 0 248.7-119.9 233.2-261.3-12-107.3-99.2-194.6-206.5-206.5-141.4-15.6-261.3 94.7-261.3 233.2 0 90 50.8 168.1 125 207.4-170.5 48-295.7 204.2-295.7 390 0 11.5 0.6 22.8 1.9 33.9 0.2 4.1 0.6 7.9 1.1 11.7 1.3 10.5 10.5 18.3 21.1 18.3H384c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3H150c-0.4-7-0.6-14.1-0.6-21.3-0.1-200.4 162.3-362.8 362.6-362.8zM322.8 331.1C301 199.7 413 87.7 544.4 109.4c79.6 13 143.8 77.2 156.8 156.8C723 397.6 611 509.6 479.6 487.9c-79.6-13-143.8-77.2-156.8-156.8z m431.6 354.1h-0.9c-10.1 0.1-19.9 3.1-28.2 8.5-8.5-5.5-18.5-8.4-29.5-8.5-17 0.1-33.4 6.9-44.9 18.7-10.6 10.9-16.4 24.9-16.2 39.6 0.2 16.7 7.5 32.1 21.2 44.6l68.9 62.8 69-62.9c15.2-14.2 22.3-28.6 22.3-45.1-0.1-31.9-27.7-57.7-61.7-57.7z m17.6 79.2l-47.3 43.1-47.3-43.1c-7.1-6.5-10.6-13.5-10.7-21.4-0.1-6.1 2.4-12.1 7.1-16.8 5.6-5.7 13.7-9 22.9-9.1 5.2 0 10.2 2 13.9 5.3l14.8 13.6 14.9-13.6c3.6-3.3 8.6-5.2 13.5-5.3h0.7c16.3 0 29.6 11.5 29.6 25.6-0.1 5.5-1.6 11.8-12.1 21.7zM725.3 576c-106 0-192 86-192 192s86 192 192 192 192-86 192-192c0-106.1-85.9-192-192-192z m0 341.3C642.9 917.3 576 850.5 576 768c0-82.5 66.9-149.3 149.3-149.3S874.7 685.5 874.7 768c0 82.5-66.9 149.3-149.4 149.3z" fill="#2c2c2c" ></path></symbol><symbol id="icon-lianxijilu" viewBox="0 0 1024 1024"><path d="M488.9 449.2l-30.5-131.7c-2.5-15.1-12.9-28.3-28.1-33.5-12.8-4.4-26.2-6.6-39.9-6.6-3.8 0-7.6 0.2-11.5 0.5-64 5.9-113.3 62.8-112.2 129.5 3.4 198.8 161.7 357.2 360.5 360.5h2.2c65.6 0 121.5-49.3 127.3-112.2 1.6-17.6-0.4-34.9-6.1-51.4-5.5-16.1-19.7-26.9-35.7-28.6l-129.6-30c-3.2-0.7-6.4-1.1-9.6-1.1-11.3 0-22.2 4.5-30.3 12.7-4.9 5-13.3 14.3-21.7 24.7-9.5-5.4-18.7-11.7-27.2-18.8L471.4 538c-7.1-8.5-13.4-17.7-18.8-27.2 10.4-8.3 19.7-16.7 24.7-21.7 10.5-10.4 14.9-25.5 11.6-39.9z m-21.1 145.6c11.7 9.8 24.3 18.5 37.8 25.9 6.1 3.3 12.7 5 19.2 5 11.6 0 22.9-5.1 30.6-14.8 7.7-9.8 16.1-19.2 20.5-23.6l133.9 31 0.6-0.2c3.6 10.4 5.1 21.8 4 33.7-3.9 42.5-42.2 73.4-84.8 73.4h-1.5c-174.6-3-315.6-144-318.6-318.6-0.7-43.2 30.4-82.4 73.4-86.3 2.6-0.2 5.1-0.4 7.6-0.4 9.1 0 17.9 1.5 26.1 4.3l-0.2 0.6 31 133.9c-4.4 4.3-13.8 12.7-23.6 20.5-15.1 11.9-19.1 32.9-9.8 49.8 7.4 13.5 16.1 26.1 25.9 37.8l27.9 28zM597.3 352h128c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3h-128c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3z" fill="#000000" ></path><path d="M597.3 458.7h128c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3h-128c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3z" fill="#000000" ></path><path d="M896 234.7c11.8 0 21.3-9.6 21.3-21.3V106.7c0-23.5-19.2-42.7-42.7-42.7H149.3c-23.5 0-42.7 19.2-42.7 42.7v810.7c0 23.5 19.2 42.7 42.7 42.7h725.3c23.5 0 42.7-19.2 42.7-42.7V384c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3v512c0 11.7-9.6 21.3-21.3 21.3H170.7c-11.7 0-21.3-9.6-21.3-21.3V128c0-11.7 9.6-21.3 21.3-21.3h682.7c11.7 0 21.3 9.6 21.3 21.3v85.3c0 11.8 9.5 21.4 21.3 21.4z" fill="#000000" ></path></symbol><symbol id="icon-tousutiwen" viewBox="0 0 1024 1024"><path d="M705.9 362.7c10.7 0 19.4-9.6 19.4-21.3 0-11.7-8.7-21.3-19.4-21.3H318.1c-10.7 0-19.4 9.6-19.4 21.3 0 11.7 8.7 21.3 19.4 21.3h387.8zM490.7 490.7H320c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3h170.7c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3zM745.8 588.7c-8.4-16.9-32.5-17-40.9-0.1-58.6 117.3-169.1 338.2-169.1 338.2-7.6 15.2 3.5 33.1 20.5 33.1h338.1c17 0 28.1-17.9 20.5-33.1L745.8 588.7zM593.3 914.2l132-274.2 132 274.2h-264z" fill="#000000" ></path><path d="M704 757.3v32c0 11.7 9.6 21.3 21.3 21.3 11.7 0 21.3-9.6 21.3-21.3v-32c0-11.7-9.6-21.3-21.3-21.3-11.7 0-21.3 9.6-21.3 21.3z" fill="#000000" ></path><path d="M725.3 853.3m-21.3 0a21.3 21.3 0 1 0 42.6 0 21.3 21.3 0 1 0-42.6 0Z" fill="#000000" ></path><path d="M874.7 64H149.3c-23.5 0-42.7 19.2-42.7 42.7v810.7c0 23.5 19.2 42.7 42.7 42.7h320c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3H170.7c-11.7 0-21.3-9.6-21.3-21.3V128c0-11.7 9.6-21.3 21.3-21.3h682.7c11.7 0 21.3 9.6 21.3 21.3v384c0 11.8 9.6 21.3 21.3 21.3s21.3-9.6 21.3-21.3V106.7c0-23.5-19.2-42.7-42.6-42.7z" fill="#000000" ></path></symbol><symbol id="icon-feiyongchaxun" viewBox="0 0 1024 1024"><path d="M953.5 921.8L767.4 735.7C838 657 878.2 550.8 869.1 434.8 854.1 243 701 85.7 509.6 66.2 256 40.3 44.1 249.6 65.5 502.3c15.8 187 163.3 340.5 349.4 364.7 69.3 9 135.4-0.3 194.8-23 15-5.7 19.1-25.2 7.7-36.6-6.2-6.2-15.5-8-23.7-4.9-47.9 18.1-100.8 26.2-156 21.8-175.2-14-317.1-158.4-328.2-333.8C95.3 266.2 287.6 82.7 514.7 111.9 673.9 132.3 802 260.6 822.5 419.8c15.2 117.8-27.1 225.8-102.4 300.8-8.7 8.7-8.2 23 0.5 31.7l201.2 201.2c8.7 8.7 23 8.7 31.7 0s8.7-23 0-31.7z" fill="#000000" ></path><path d="M594.7 287.8c-8.7-8.7-23-8.7-31.7 0l-95.8 95.8-95.8-95.8c-8.7-8.7-23-8.7-31.7 0s-8.7 23 0 31.7l64.9 64.9h-38.2c-12.3 0-22.4 10.1-22.4 22.4 0 12.3 10.1 22.4 22.4 22.4h78.4v67.2h-78.4c-12.3 0-22.4 10.1-22.4 22.4 0 12.3 10.1 22.4 22.4 22.4h78.4v89.6c0 12.3 10.1 22.4 22.4 22.4 12.3 0 22.4-10.1 22.4-22.4v-89.6H568c12.3 0 22.4-10.1 22.4-22.4 0-12.3-10.1-22.4-22.4-22.4h-78.4v-67.2H568c12.3 0 22.4-10.1 22.4-22.4 0-12.3-10.1-22.4-22.4-22.4h-38.2l64.9-64.9c8.7-8.7 8.7-23 0-31.7z" fill="#000000" ></path></symbol><symbol id="icon-jiaofei" viewBox="0 0 1024 1024"><path d="M805.9 320c-18.8 0-28.9 21.7-17.2 36.5 49.6 62.2 85.9 130.7 85.9 198.2 0 200.3-162.4 362.7-362.7 362.7-200.3 0-362.7-162.4-362.7-362.7 0-214.2 360.9-438.2 360.9-438.2s87.3 53.7 176.4 133.6c4.2 3.8 9.7 5.9 15.4 5.9 21.2 0 31.1-26.2 15.3-40.4C615.2 123.6 512 64 512 64S106.7 297.8 106.7 554.7C106.7 778.5 288.1 960 512 960s405.3-181.5 405.3-405.3c0-79.7-39.1-157.2-93-226.1-4.2-5.4-10.8-8.5-17.6-8.5h-0.8z" fill="#2c2c2c" ></path><path d="M512 731.8c11.7 0 21.3-9.6 21.3-21.3v-85.3H608c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3h-74.7v-64H608c11.7 0 21.3-9.6 21.3-21.3S619.7 476 608 476h-36.4l61.8-61.8c8.3-8.3 8.3-21.9 0-30.2s-21.9-8.3-30.2 0L512 475l-91.2-91.2c-8.3-8.3-21.9-8.3-30.2 0s-8.3 21.9 0 30.2l61.8 61.8H416c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3h74.7v64H416c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3h74.7v85.3c0 11.9 9.6 21.5 21.3 21.5zM606 816.8c93.8-33.1 164.4-115 181.2-215.3 2.1-12.8-7.6-24.7-20.6-24.7h-0.9c-10.5 0-18.9 7.8-20.6 18.1-14.3 84.4-73.7 153.3-152.5 181.4-8.7 3.1-14.8 11-14.8 20.2 0 14.7 14.5 25.2 28.2 20.3z" fill="#2c2c2c" ></path></symbol><symbol id="icon-jizhang" viewBox="0 0 1024 1024"><path d="M682.7 256.5c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3H768c11.7 0 21.3-9.6 21.3-21.3s-9.6-21.3-21.3-21.3h-85.3zM896 235.1c11.8 0 21.3-9.6 21.3-21.3V106.7c0-23.6-19.1-42.7-42.7-42.7H149.3c-23.6 0-42.7 19.1-42.7 42.7v811.5c0 19.3 12.8 35.7 30.4 40.9 6.9 2.1 14.4 0.3 20.3-3.6l119.9-80L393.5 953c7.2 4.8 16.5 4.8 23.7 0l116.2-77.5 115 76.8c7.7 5.2 17.9 4.7 25.2-1.1l94.5-75.7 97.9 78.4c6.2 5 14.5 7.4 22.1 4.9 17-5.6 29.3-21.7 29.3-40.6V384.5c0-11.8-9.6-21.3-21.3-21.3-11.8 0-21.3 9.6-21.3 21.3v533.7L768 832.8l-107.3 85.4-127.3-85.4-128 85.4-128.7-85.4-127.3 85.4V128c0-11.8 9.6-21.3 21.3-21.3h682.7c11.8 0 21.3 9.6 21.3 21.3v85.7c0 11.9 9.5 21.4 21.3 21.4z m-384 128c47.1 0 85.3-38.2 85.3-85.3 0-47.1-38.2-85.3-85.3-85.3s-85.3 38.2-85.3 85.3c0 47.1 38.2 85.3 85.3 85.3z m0-128c23.6 0 42.7 19.1 42.7 42.7s-19.1 42.7-42.7 42.7-42.7-19.1-42.7-42.7 19.1-42.7 42.7-42.7z m111.9 219.6c-8.3-8.3-21.9-8.3-30.2 0L512 536.4l-81.7-81.7c-8.3-8.3-21.9-8.3-30.2 0s-8.3 21.9 0 30.2l70.3 70.3h-43.8c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3h64v42.7h-64c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3h64v42.7c0 11.7 9.6 21.3 21.3 21.3s21.3-9.6 21.3-21.3v-42.7h64c11.7 0 21.3-9.6 21.3-21.3s-9.6-21.3-21.3-21.3h-64v-42.7h64c11.7 0 21.3-9.6 21.3-21.3s-9.6-21.3-21.3-21.3h-43.6l70.3-70.3c8.3-8.4 8.3-21.9 0-30.2zM256 256.5c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3h85.3c11.7 0 21.3-9.6 21.3-21.3s-9.6-21.3-21.3-21.3H256z" fill="#000000" ></path></symbol><symbol id="icon-chaxun1" viewBox="0 0 1024 1024"><path d="M298.7 320h426.7c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3H298.7c-11.7 0-21.3 9.6-21.3 21.3-0.1 11.7 9.5 21.3 21.3 21.3zM512 448H298.7c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3H512c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3z" fill="#000000" ></path><path d="M874.7 64H149.3c-23.5 0-42.7 19.2-42.7 42.7v810.7c0 23.5 19.2 42.7 42.7 42.7H480c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.6-21.3-21.3-21.3H170.7c-11.7 0-21.3-9.6-21.3-21.3V128c0-11.7 9.6-21.3 21.3-21.3h682.7c11.7 0 21.3 9.6 21.3 21.3v384c0 11.8 9.6 21.3 21.3 21.3s21.3-9.6 21.3-21.3V106.7c0-23.5-19.2-42.7-42.6-42.7z" fill="#000000" ></path><path d="M840.8 853.3c-0.7-0.7-1.7-1-2.5-1.6 22.7-29 36.3-65.4 36.3-105 0-94.3-76.4-170.7-170.7-170.7s-170.7 76.4-170.7 170.7S609.7 917.3 704 917.3c39.6 0 76-13.6 105-36.3 0.6 0.8 0.9 1.8 1.6 2.5l70.3 70.3c8.3 8.3 21.9 8.3 30.2 0s8.3-21.9 0-30.2l-70.3-70.3zM704 874.7c-70.7 0-128-57.3-128-128s57.3-128 128-128 128 57.3 128 128-57.3 128-128 128z" fill="#000000" ></path></symbol><symbol id="icon-chazhang" viewBox="0 0 1024 1024"><path d="M896 320c11.8 0 21.3-9.6 21.3-21.3V192c0-23.5-19.2-42.7-42.7-42.7h-192v-64c0-11.7-9.6-21.3-21.3-21.3-11.7 0-21.3 9.6-21.3 21.3v64H384v-64c0-11.7-9.6-21.3-21.3-21.3-11.7 0-21.3 9.6-21.3 21.3v64h-192c-23.5 0-42.7 19.2-42.7 42.7v725.3c0 23.5 19.2 42.7 42.7 42.7h725.3c23.5 0 42.7-19.2 42.7-42.7v-448c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3V896c0 11.7-9.6 21.3-21.3 21.3H170.7c-11.7 0-21.3-9.6-21.3-21.3V213.3c0-11.7 9.6-21.3 21.3-21.3h170.7v64c0 11.7 9.6 21.3 21.3 21.3 11.7 0 21.3-9.6 21.3-21.3v-64h256v64c0 11.7 9.6 21.3 21.3 21.3 11.7 0 21.3-9.6 21.3-21.3v-64h170.7c11.7 0 21.3 9.6 21.3 21.3v85.3c0.1 11.8 9.6 21.4 21.4 21.4z m-241.8 78.2c-8.3-8.3-21.9-8.3-30.2 0L512 510.3 399.9 398.2c-8.3-8.3-21.9-8.3-30.2 0s-8.3 21.9 0 30.2l83.6 83.6h-58.7c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3h96v64h-96c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3h96v85.3c0 11.7 9.6 21.3 21.3 21.3 11.7 0 21.3-9.6 21.3-21.3v-85.3h96c11.7 0 21.3-9.6 21.3-21.3s-9.6-21.3-21.3-21.3h-96v-64h96c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3h-58.7l83.6-83.6c8.4-8.3 8.4-21.9 0.1-30.2z" fill="#000000" ></path></symbol><symbol id="icon-baobiao" viewBox="0 0 1024 1024"><path d="M937.6 243.2c12.4 0 22.4-10 22.4-22.4v-112c0-24.7-20.1-44.8-44.8-44.8H108.8C84.1 64 64 84.1 64 108.8v806.4c0 24.7 20.1 44.8 44.8 44.8h806.4c24.7 0 44.8-20.1 44.8-44.8V400c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v336H108.8V131.2c0-12.4 10-22.4 22.4-22.4h761.6c12.4 0 22.4 10 22.4 22.4v89.6c0 12.4 10 22.4 22.4 22.4z m-22.4 537.6v112c0 12.4-10 22.4-22.4 22.4H131.2c-12.4 0-22.4-10-22.4-22.4v-112h806.4z m-649.6-336v134.4c0 12.3 10.1 22.4 22.4 22.4s22.4-10.1 22.4-22.4V444.8c0-12.3-10.1-22.4-22.4-22.4s-22.4 10.1-22.4 22.4z m448-44.8v179.2c0 12.4 10 22.4 22.4 22.4s22.4-10 22.4-22.4V400c0-12.4-10-22.4-22.4-22.4s-22.4 10-22.4 22.4z m-224-134.4v313.6c0 12.3 10.1 22.4 22.4 22.4 12.3 0 22.4-10.1 22.4-22.4V265.6c0-12.3-10.1-22.4-22.4-22.4-12.3 0-22.4 10.1-22.4 22.4z" fill="#000000" ></path></symbol><symbol id="icon-shezhi2" viewBox="0 0 1024 1024"><path d="M952.6 431.9c-2.6-14.3-11.9-26.5-25.1-32.3l-50.6-22.3c-44.2-19.5-70.8-65.8-65.5-114.3l6.1-56.2C819 193 814 179 803.6 170c-40.7-35.3-87.6-63.4-139-82.3-12.9-4.7-27.4-2.2-38.6 6l-49.2 36c-19.3 14.1-42.1 21.2-64.9 21.2-22.8 0-45.5-7.1-64.9-21.2l-49.2-36c-11.2-8.2-25.6-10.7-38.6-6-51.4 18.8-98.3 47-139 82.3-10.4 9-15.4 23-13.9 36.8l6.1 56.5c5.3 48.4-21.2 94.5-65.3 114l-50.8 22.4c-13.2 5.8-22.5 18-25.1 32.3-4.8 26-7.4 52.7-7.4 80.1 0 27.4 2.7 54.1 7.4 80.1 2.6 14.3 11.9 26.5 25.1 32.3l50.8 22.4c44.1 19.4 70.6 65.6 65.3 114l-6.1 56.5C205 831 210 845 220.4 854c40.7 35.3 87.6 63.4 139 82.2 12.9 4.7 27.4 2.2 38.6-6l49.2-36c19.3-14.1 42.1-21.2 64.9-21.2 22.8 0 45.5 7.1 64.9 21.2l49.2 36c11.2 8.2 25.6 10.7 38.6 6 51.4-18.8 98.3-47 139-82.3 10.4-9 15.4-23 13.9-36.8l-6.1-56.2c-5.3-48.5 21.3-94.8 65.5-114.3l50.6-22.3c13.2-5.8 22.5-18 25.1-32.3 4.8-26 7.4-52.7 7.4-80.1-0.2-27.3-2.9-54-7.6-80z m-42.1 153l-50.6 22.3c-61.4 27-98.2 91.3-90.9 158.6l6.1 56.2c-36.9 31.8-79.2 56.8-124 73.4l-45.1-33c-22.6-16.5-48.7-28.3-76.5-31.4-38.7-4.3-76.3 5.8-107.3 28.4l-49.2 36c-44.8-16.6-87.1-41.6-124-73.4l6.1-56.2c7.3-67.3-29.5-131.5-90.9-158.6l-50.7-22.3c-4.5-24.7-6.8-49.1-6.8-72.9 0-23.7 2.3-48.2 6.8-72.9l50.7-22.3c61.4-27 98.2-91.3 90.9-158.6L249 202c36.9-31.8 79.2-56.8 124-73.4l45.1 33c22.6 16.5 48.7 28.3 76.5 31.4 38.7 4.3 76.3-5.8 107.3-28.4l49.2-36c44.8 16.6 87.1 41.6 124 73.4l-6.1 56.2c-7.3 67.3 29.5 131.5 90.9 158.6l50.7 22.3c4.5 24.7 6.8 49.1 6.8 72.9-0.1 23.7-2.4 48.2-6.9 72.9zM512 341.3c-94.3 0-170.7 76.4-170.7 170.7S417.7 682.7 512 682.7 682.7 606.3 682.7 512 606.3 341.3 512 341.3z m0 298.7c-70.7 0-128-57.3-128-128s57.3-128 128-128 128 57.3 128 128-57.3 128-128 128z" fill="#000000" ></path></symbol><symbol id="icon-daqiajilu" viewBox="0 0 1024 1024"><path d="M896 234.7c11.8 0 21.3-9.6 21.3-21.3V106.7c0-23.5-19.2-42.7-42.7-42.7H149.3c-23.5 0-42.7 19.2-42.7 42.7v810.7c0 23.5 19.2 42.7 42.7 42.7h725.3c23.5 0 42.7-19.2 42.7-42.7V384c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3v512c0 11.7-9.6 21.3-21.3 21.3H170.7c-11.7 0-21.3-9.6-21.3-21.3V128c0-11.7 9.6-21.3 21.3-21.3h682.7c11.7 0 21.3 9.6 21.3 21.3v85.3c0 11.8 9.5 21.4 21.3 21.4zM682.7 661.3H341.3c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3h341.3c11.7 0 21.3-9.6 21.3-21.3 0.1-11.7-9.5-21.3-21.2-21.3z m0 106.7H341.3c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3h341.3c11.7 0 21.3-9.6 21.3-21.3 0.1-11.7-9.5-21.3-21.2-21.3z m-98.6-369.9c21.1-19.5 34.5-47.1 34.5-78.1 0-58.9-47.8-106.7-106.7-106.7S405.3 261.1 405.3 320c0 31 13.4 58.6 34.5 78.1C369.6 426.7 320 495.5 320 576c0 11.7 9.6 21.3 21.3 21.3 11.7 0 21.3-9.6 21.3-21.3 0-82.5 66.9-149.3 149.3-149.3S661.3 493.5 661.3 576c0 11.7 9.6 21.3 21.3 21.3 11.7 0 21.3-9.6 21.3-21.3 0.1-80.5-49.5-149.3-119.8-177.9zM512 384c-35.3 0-64-28.7-64-64s28.7-64 64-64 64 28.7 64 64-28.7 64-64 64z" fill="#000000" ></path></symbol><symbol id="icon-kechengziyuanguanli" viewBox="0 0 1024 1024"><path d="M896 490.7c11.8 0 21.3-9.6 21.3-21.3V234.7c0-23.5-19.2-42.7-42.7-42.7H661.3V85.3c0-11.7-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3V192H384V85.3c0-11.7-9.6-21.3-21.3-21.3-11.7 0-21.3 9.6-21.3 21.3V192h-192c-23.5 0-42.7 19.2-42.7 42.7v682.7c0 23.5 19.2 42.7 42.7 42.7h725.3c23.5 0 42.7-19.2 42.7-42.7V640c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3v256c0 11.8-9.6 21.3-21.3 21.3H170.7c-11.8 0-21.3-9.6-21.3-21.3V405.3h725.3v64c0 11.8 9.5 21.4 21.3 21.4z m-746.7-128V256c0-11.8 9.6-21.3 21.3-21.3h682.7c11.8 0 21.3 9.6 21.3 21.3v106.7H149.3z m519.8 156.6L473 715.5 397.5 640c-8.3-8.3-21.9-8.3-30.2 0s-8.3 21.9 0 30.2l90.5 90.5c4.2 4.2 9.6 6.2 15.1 6.2s11-2.1 15.1-6.2l211.2-211.2c8.3-8.3 8.3-21.9 0-30.2-8.2-8.3-21.8-8.3-30.1 0z" fill="#000000" ></path></symbol><symbol id="icon-ziliaozhongxin" viewBox="0 0 1024 1024"><path d="M768 704H554.7c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3H768c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3zM768 426.7H554.7c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3H768c11.7 0 21.3-9.6 21.3-21.3s-9.6-21.3-21.3-21.3zM768 576H554.7c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3H768c11.8 0 21.3-9.6 21.3-21.3 0-11.7-9.5-21.3-21.3-21.3z" fill="#2c2c2c" ></path><path d="M960 256V149.3c0-23.5-19.2-42.7-42.7-42.7H106.7c-23.5 0-42.7 19.2-42.7 42.7v725.3c0 23.5 19.2 42.7 42.7 42.7h810.7c23.5 0 42.7-19.2 42.7-42.7v-448c0-11.8-9.6-21.3-21.3-21.3-11.8 0-21.3 9.6-21.3 21.3v426.7c0 11.8-9.6 21.3-21.3 21.3H128c-11.8 0-21.3-9.6-21.3-21.3V170.7c0-11.8 9.6-21.3 21.3-21.3h768c11.8 0 21.3 9.6 21.3 21.3V256c0 11.8 9.6 21.3 21.3 21.3 11.8 0 21.4-9.5 21.4-21.3z" fill="#2c2c2c" ></path><path d="M426.7 554.7H256c-11.8 0-21.3 9.6-21.3 21.3v170.7c0 11.8 9.6 21.3 21.3 21.3h170.7c11.8 0 21.3-9.6 21.3-21.3V576c0-11.8-9.6-21.3-21.3-21.3z m-21.4 170.6h-128v-128h128v128zM448 298.7c0-11.8-9.6-21.3-21.3-21.3H256c-11.8 0-21.3 9.6-21.3 21.3v170.7c0 11.8 9.6 21.3 21.3 21.3h170.7c11.8 0 21.3-9.6 21.3-21.3V298.7zM405.3 448h-128V320h128v128zM768 298.7H554.7c-11.8 0-21.3 9.6-21.3 21.3 0 11.8 9.6 21.3 21.3 21.3H768c11.8 0 21.3-9.6 21.3-21.3 0-11.8-9.5-21.3-21.3-21.3z" fill="#2c2c2c" ></path></symbol><symbol id="icon-houtaishezhi" viewBox="0 0 1024 1024"><path d="M885.8 265.4c-3.9-5.9-10.7-9.4-17.8-9.4-17.1 0-26.8 18.9-17.4 33.2 50 75.7 75.3 169.1 64.3 268.8-20.7 187.8-173.4 338.6-361.4 357.3-256 25.4-469.4-187.7-444.8-443.5 17.9-185.7 165-337.8 350.1-361.6 111.5-14.3 215.2 17.1 295.9 77.6 3.7 2.7 8.1 4.3 12.6 4.3 20.5 0 29.5-26.3 13.1-38.6-87.2-65.4-199-99.8-319.1-86.6C253.9 89.7 87.5 257.5 66.4 465c-28.9 283.6 207 520.3 490.4 492.9 211.9-20.5 382.6-193.1 401.4-405.1 9.5-106.7-18.7-206.2-72.4-287.4zM639.6 488.7c-16 4.1-21.5 23.8-9.8 35.5 5 5 12.3 7.5 19.3 5.8 32.2-7.9 62-28.1 81-62.4 22.6-40.6 20.7-91.8-4.8-130.6-46.3-70.3-142-77.3-198.2-21.1-5.4 5.4-10.3 11.2-14.3 17-15.4 22-23.2 47.7-23.1 73.5l1.1 115.1 0.9 94.1v3.6c-0.5 21.3-8.7 42.5-24.9 58.7-38 38-103 32.7-133.4-16.1-16.6-26.6-16.6-61.7 0-88.4 12.6-20.3 31.1-32.9 51.1-38.1 16-4.1 21.5-23.8 9.8-35.5-5-5-12.3-7.5-19.3-5.8-32.2 7.9-62 28.1-81 62.4-22.6 40.6-20.7 91.8 4.8 130.6 45.2 68.6 137.3 76.7 194 24.9v0.2c1.5-1.2 2.9-2.6 4.2-3.9 4.9-4.9 9.2-10.2 13.1-15.6 0.3-0.5 0.9-0.9 1.2-1.4 0.2-0.3 0.4-0.7 0.6-1 3.4-5 6.4-10.1 9.1-15.4 0.4-0.7 0.7-1.5 1-2.2 2.4-5.1 4.5-10.3 6.2-15.6 0.2-0.5 0.4-1.1 0.6-1.6 1.7-5.5 2.9-11.1 3.8-16.7 0.2-1.3 0.4-2.6 0.5-3.8 0.7-5.7 1.3-11.4 1.2-17.1l-1.1-115.1-0.9-93.5V405c0.5-21.3 8.7-42.5 24.9-58.7 38-38 103-32.7 133.4 16.1 16.6 26.6 16.6 61.7 0 88.4-12.5 20.2-31 32.8-51 37.9z" fill="#000000" ></path></symbol><symbol id="icon-zhaoshengshezhi" viewBox="0 0 1024 1024"><path d="M937.6 243.2c12.4 0 22.4-10 22.4-22.4v-112c0-24.6-20.2-44.8-44.8-44.8H108.8C84.2 64 64 84.2 64 108.8v806.4c0 24.6 20.2 44.8 44.8 44.8H400c12.4 0 22.4-10 22.4-22.4V660.1c0-8.1-4.5-15.3-11.5-19.5-59.2-35.1-99.9-99.6-100.5-171.7-0.6-70.6 35.2-132.9 89.6-169.2v142.9c0 12.4 10 22.4 22.4 22.4h179.2c12.4 0 22.4-10 22.4-22.4v-143c54 36.1 89.6 97.7 89.6 167.6 0 74.4-40.4 139.2-100.3 174.2-7.1 4.1-11.7 11.4-11.7 19.6v276.7c0 12.4 10 22.4 22.4 22.4h291.2c24.6 0 44.8-20.2 44.8-44.8V400c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v492.8c0 12.4-10 22.4-22.4 22.4H646.4V673.3c67.4-43.9 112-119.6 112-206.1 0-86.1-44.1-161.7-110.8-205.7-13.4-8.9-29.2-13.6-45.3-13.8-12.6-0.1-23.1 9.8-23.1 22.4v144.5H444.8V270.1c0-12.4-10-22.4-22.4-22.4-16.3 0-32.3 4.7-45.9 13.7-76.7 50.6-123.5 142.9-107.9 245 10.7 69.6 52.1 129.4 109 166.7v242.2H131.2c-12.4 0-22.4-10-22.4-22.4V131.2c0-12.4 10-22.4 22.4-22.4h761.6c12.4 0 22.4 10 22.4 22.4v89.6c0 12.4 10 22.4 22.4 22.4zM624 556.8c0-12.3-10.1-22.4-22.4-22.4H422.4c-12.3 0-22.4 10.1-22.4 22.4 0 12.3 10.1 22.4 22.4 22.4h179.2c12.3 0 22.4-10.1 22.4-22.4z" fill="#000000" ></path></symbol><symbol id="icon-xinzengyuangong" viewBox="0 0 1024 1024"><path d="M512 533.3c138.5 0 248.7-119.9 233.2-261.3-12-107.3-99.2-194.6-206.5-206.5-141.4-15.6-261.3 94.7-261.3 233.2 0 90 50.8 168.1 125 207.4-170.5 48-295.7 204.2-295.7 390 0 11.5 0.6 22.8 1.9 33.9 0.2 4.1 0.6 7.9 1.1 11.7 1.3 10.5 10.5 18.3 21.1 18.3H384c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3H150c-0.4-7-0.6-14.1-0.6-21.3-0.1-200.4 162.3-362.8 362.6-362.8zM322.8 331.1C301 199.7 413 87.7 544.4 109.4c79.6 13 143.8 77.2 156.8 156.8C723 397.6 611 509.6 479.6 487.9c-79.6-13-143.8-77.2-156.8-156.8z" fill="#2c2c2c" ></path><path d="M725.3 576c-106 0-192 86-192 192s86 192 192 192 192-86 192-192c0-106.1-85.9-192-192-192z m0 341.3C642.9 917.3 576 850.4 576 768c0-82.5 66.9-149.3 149.3-149.3S874.7 685.5 874.7 768c0 82.4-66.9 149.3-149.4 149.3z" fill="#2c2c2c" ></path><path d="M789.3 746.6h-42.7v-43.9c0-11.1-9.1-20.1-20.1-20.1h-2.4c-11.1 0-20.1 9.1-20.1 20.1v43.9h-42.7c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3H704v43.9c0 11.1 9.1 20.1 20.1 20.1h2.4c11.1 0 20.1-9.1 20.1-20.1v-43.9h42.7c11.7 0 21.3-9.6 21.3-21.3 0.1-11.7-9.5-21.3-21.3-21.3z" fill="#2c2c2c" ></path></symbol><symbol id="icon-zhaoshengbaobiao" viewBox="0 0 1024 1024"><path d="M895.9 768H168.3l79.3-79.1c4-4 6.3-9.4 6.3-15.1V498.7c0-133 98.4-249.7 231.2-262.7 152.7-15 282.4 105.5 282.4 254.7V640c0 11.8 9.6 21.3 21.4 21.3 11.8 0 21.4-9.6 21.4-21.3V498.6c0-140.8-95.1-265.5-229.2-298 10.8-14.3 17.5-31.9 17.5-51.2 0-47.1-38.2-85.3-85.3-85.3S428 102.3 428 149.4c0 18.9 6.3 36.1 16.7 50.3C311.5 230 211.2 349.2 211.2 490.8v170.7l-95 94.7c-20.2 20.2-5.9 54.6 22.7 54.6H364c0 82.5 66.9 149.3 149.3 149.3s149.3-66.9 149.3-149.3h233.3c11.8 0 21.4-9.6 21.4-21.3 0-11.9-9.5-21.5-21.4-21.5zM513.3 106.7c23.6 0 42.7 19.1 42.7 42.7s-19.1 42.7-42.7 42.7-42.7-19.1-42.7-42.7 19.1-42.7 42.7-42.7z m0 810.6c-58.9 0-106.7-47.8-106.7-106.7h213.3c0 59-47.7 106.7-106.6 106.7z" fill="#000000" ></path></symbol><symbol id="icon-caidanguanli" viewBox="0 0 1024 1024"><path d="M704 341.3H469.3c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3H704c11.7 0 21.3-9.6 21.3-21.3s-9.6-21.3-21.3-21.3z m0 298.7H469.3c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3H704c11.7 0 21.3-9.6 21.3-21.3S715.7 640 704 640z m0-149.3H469.3c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3H704c11.7 0 21.3-9.6 21.3-21.3s-9.6-21.3-21.3-21.3z m181.8-225.3c-3.9-5.9-10.7-9.4-17.8-9.4-17.1 0-26.8 18.9-17.4 33.2 50 75.7 75.3 169.1 64.3 268.8-20.7 187.8-173.4 338.6-361.4 357.3-256 25.4-469.4-187.7-444.8-443.5 17.9-185.7 165-337.8 350.1-361.6 111.5-14.3 215.2 17.1 295.9 77.6 3.7 2.7 8.1 4.3 12.6 4.3 20.5 0 29.5-26.3 13.1-38.6-87.2-65.4-199-99.8-319.1-86.6C253.9 89.7 87.5 257.5 66.4 465c-28.9 283.6 207 520.3 490.4 492.9 211.9-20.5 382.6-193.1 401.4-405.1 9.5-106.7-18.7-206.2-72.4-287.4z m-523.1 75.9H320c-11.7 0-21.3 9.6-21.3 21.3S308.3 384 320 384h42.7c11.7 0 21.3-9.6 21.3-21.3s-9.6-21.4-21.3-21.4z m0 298.7H320c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3h42.7c11.7 0 21.3-9.6 21.3-21.3s-9.6-21.3-21.3-21.3z m0-149.3H320c-11.7 0-21.3 9.6-21.3 21.3s9.6 21.3 21.3 21.3h42.7c11.7 0 21.3-9.6 21.3-21.3s-9.6-21.3-21.3-21.3z" fill="#000000" ></path></symbol><symbol id="icon-chuangjianxitong" viewBox="0 0 1024 1024"><path d="M108.1 471.3c10.6-84.8 48.3-166.9 113.4-232 45.1-45.1 98.3-76.7 154.9-95.6 3.1-1 6-2.8 8.3-5.1 16.5-16.5-0.5-44.1-22.7-36.7C299.2 122.8 240.2 158 190.2 208 117.9 280.3 76 371.4 64.2 465.5c-2.6 20.9 22.8 33.4 37.7 18.5 3.5-3.4 5.6-7.9 6.2-12.7z m777.1 168c-2.3 2.3-4.1 5.2-5.1 8.3-18.9 56.6-50.5 109.9-95.5 154.9-65.1 65.1-147.2 102.8-231.9 113.4-4.8 0.6-9.3 2.7-12.7 6.1-14.9 14.9-2.5 40.4 18.5 37.7 94.1-11.8 185.2-53.7 257.5-126 50-50 85.2-109 106.1-171.9 7.2-22-20.4-39-36.9-22.5zM218.9 805.1c34.6 34.6 90.6 34.6 125.1 0 34.6-34.6 34.6-90.6 0-125.2s-90.6-34.6-125.1 0-34.5 90.6 0 125.2z m31.3-93.9c17.3-17.3 45.3-17.3 62.6 0 17.3 17.3 17.3 45.3 0 62.6-17.3 17.3-45.3 17.3-62.6 0-17.3-17.3-17.3-45.3 0-62.6z m625.7-156.5c84.6-84.6 105.3-208.6 62.4-312.8l0.1-0.1-0.4-0.4-5.4-13.1c-6-14.6-24.9-18.3-36.1-7.2l-36.3 36.3-78.2 78.2-93.9-93.9 103-103 11.5-11.5c11.2-11.2 7.4-30.1-7.2-36.1l-13-5.4-0.5-0.5-0.2 0.2C691.1 48.5 584 59 502.9 119c-89.2 65.9-127.8 169.4-115.7 267.4l-35.4 35.4c-8.6 8.6-8.6 22.6 0 31.3s22.6 8.6 31.3 0l43.1-43.1c5.1-5.1 7.2-12.4 6-19.6-2.5-15.2-3.5-30.8-3-46 1.7-59.9 25.5-119.4 71.2-165.1 66.9-66.9 162.9-86.6 247-59.3L641.3 226.2c-8.6 8.6-8.6 22.6 0 31.3l125.1 125.2c8.6 8.6 22.6 8.6 31.3 0l105.8-105.8c24.1 76 11.1 162.3-41.1 226.8-47.4 58.6-114.8 89-182.8 90.9-15.2 0.5-30.8-0.5-46-3-7.2-1.2-14.5 0.9-19.6 6L363.2 848.5c-47.6 47.7-124.3 56.3-177.8 15.3-64.7-49.6-69.2-143.8-13.4-199.5l101.7-101.7c8.6-8.6 8.6-22.7 0-31.3-8.6-8.6-22.6-8.6-31.3 0l-97.9 97.9c-62.2 62.2-74 161.7-22.1 232.8 65.4 89.6 193.2 96.7 268.5 21.4l246.5-246.6c84.8 10.4 173.5-17 238.5-82.1z" fill="#000000" ></path></symbol><symbol id="icon-gongdanguanli" viewBox="0 0 1024 1024"><path d="M896 234.7c11.8 0 21.3-9.6 21.3-21.3V106.7c0-23.5-19.2-42.7-42.7-42.7H149.3c-23.5 0-42.7 19.2-42.7 42.7v810.7c0 23.5 19.2 42.7 42.7 42.7h725.3c23.5 0 42.7-19.2 42.7-42.7V384c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3v512c0 11.7-9.6 21.3-21.3 21.3H170.7c-11.7 0-21.3-9.6-21.3-21.3V128c0-11.7 9.6-21.3 21.3-21.3h682.7c11.7 0 21.3 9.6 21.3 21.3v85.3c0 11.8 9.5 21.4 21.3 21.4zM554.7 512c0-11.7-9.6-21.3-21.3-21.3H320c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3h213.3c11.8 0 21.4-9.6 21.4-21.3z m-52.9 224.5c8.2 8.2 21.6 8.2 29.8 0l209.1-209.1c8.2-8.2 8.2-21.6 0-29.8l-0.4-0.4c-8.2-8.2-21.6-8.2-29.8 0L501.4 706.3c-8.2 8.2-8.2 21.6 0 29.8l0.4 0.4zM320 362.7h384c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3H320c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3z m0 298.6c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3h85.3c11.7 0 21.3-9.6 21.3-21.3 0-11.7-9.6-21.3-21.3-21.3H320z" fill="#000000" ></path></symbol><symbol id="icon-duanxin" viewBox="0 0 1024 1024"><path d="M512 583.7L271.8 417.5c-9.6-6.8-22.8-4.3-29.7 5.3-2.6 3.6-3.8 7.9-3.8 12.2 0 6.8 3.2 13.4 9.2 17.5l227.4 157.2 25 17.5c7.3 5.1 17 5.1 24.3 0l25-17.5 368.2-279 34.2-25.8c5.3-4 8.5-10.3 8.5-17V170.7c0-23.5-19.2-42.7-42.7-42.7H106.7C83.2 128 64 147.2 64 170.7v682.7c0 23.5 19.2 42.7 42.7 42.7h810.7c23.5 0 42.7-19.2 42.7-42.7V512c0-11.8-9.6-21.3-21.3-21.3-11.8 0-21.3 9.6-21.3 21.3v320c0 11.7-9.6 21.3-21.3 21.3H128c-11.7 0-21.3-9.6-21.3-21.3V192c0-11.7 9.6-21.3 21.3-21.3h768c11.7 0 21.3 9.6 21.3 21.3v86L512 583.7z" fill="#000000" ></path></symbol><symbol id="icon-bangzhuzhongxin" viewBox="0 0 1024 1024"><path d="M556.1 455.3c0-10.3 5.8-19.7 14.8-24.2 38.6-19 64.3-56 64.3-98.3 0-61.8-55.2-112-123.3-112-46.2 0-86.3 23.1-107.4 57.1-9.2 14.6-14.6 31.4-15.7 49.1v17c0 2.9 0.7 5.8 1.8 8.5 3.4 8.1 11.2 13.9 20.6 13.9 9.4 0 17.5-5.8 20.9-13.9 1.1-2.5 1.6-4.9 1.8-7.6V327c3.6-34.3 37-61.4 78-61.4 43.5 0 78.5 30.2 78.5 67.2 0 23.7-14.1 44.6-35.9 56.4l-6.1 3.4c-22.9 12.5-37.2 36.7-37.2 62.9v34c0 12.3 10.1 22.4 22.4 22.4 12.3 0 22.4-10.1 22.4-22.4v-34.2z m381.5-212.1c12.4 0 22.4-10 22.4-22.4v-112c0-24.6-20.2-44.8-44.8-44.8H108.8C84.2 64 64 84.2 64 108.8v806.4c0 24.6 20.2 44.8 44.8 44.8h806.4c24.6 0 44.8-20.2 44.8-44.8V400c0-12.4-10-22.4-22.4-22.4-12.4 0-22.4 10-22.4 22.4v336H288c-12.3 0-22.4 10.1-22.4 22.4 0 12.3 10.1 22.4 22.4 22.4h627.2v112c0 12.3-10.1 22.4-22.4 22.4H131.2c-12.3 0-22.4-10.1-22.4-22.4V131.2c0-12.3 10.1-22.4 22.4-22.4h761.6c12.3 0 22.4 10.1 22.4 22.4v89.6c0 12.4 10 22.4 22.4 22.4z m-404 336c-12.4 0-22.4 10-22.4 22.4 0 12.4 10 22.4 22.4 22.4s22.4-10 22.4-22.4c0-12.4-10-22.4-22.4-22.4z" fill="#000000" ></path></symbol><symbol id="icon-yuangongbiandong" viewBox="0 0 1024 1024"><path d="M844.5 682.7H554.7c-11.7 0-21.3 9.6-21.3 21.3 0 11.7 9.6 21.3 21.3 21.3H896c2.8 0 5.6-0.6 8.2-1.7 0.5-0.2 0.9-0.7 1.4-0.9 1.9-1 3.8-2 5.4-3.6 1.6-1.6 2.6-3.5 3.6-5.4 0.3-0.5 0.7-0.9 0.9-1.4 1.1-2.6 1.7-5.4 1.7-8.2 0-0.2-0.1-0.3-0.1-0.5-0.1-2.6-0.5-5.2-1.6-7.7-0.6-1.5-1.7-2.7-2.7-4-0.7-0.9-1.1-2-1.9-2.9L805.5 583.3c-8.3-8.3-21.9-8.3-30.2 0s-8.3 21.9 0 30.2l69.2 69.2z m-99.3-410.8C733.3 164.6 646.1 77.3 538.7 65.5c-141.6-15.6-261.4 94.8-261.4 233.2 0 90 50.7 168 125 207.4C231.9 553.9 106.7 710.2 106.7 896c0 15.5 1.1 30.7 2.9 45.7 1.3 10.5 10.5 18.3 21.1 18.3 12.5 0 22.6-10.8 21.1-23.3-1.6-13.4-2.5-26.9-2.5-40.7 0-200.3 162.4-362.7 362.7-362.7 138.4 0 248.8-119.8 233.2-261.4zM479.5 488c-79.6-13.1-143.8-77.2-156.8-156.8-21.6-131.4 90.4-243.4 221.8-221.8 79.6 13.1 143.8 77.2 156.8 156.8 21.6 131.3-90.4 243.4-221.8 221.8zM896 811.8H554.7c-2.8 0-5.6 0.6-8.2 1.7-0.5 0.2-0.9 0.7-1.4 0.9-1.9 1-3.8 2-5.4 3.6-1.6 1.6-2.6 3.5-3.6 5.5-0.3 0.5-0.7 0.9-0.9 1.4-1.1 2.6-1.7 5.4-1.7 8.2 0 0.2 0.1 0.3 0.1 0.5 0.1 2.6 0.5 5.2 1.6 7.6 0.6 1.5 1.7 2.7 2.7 4 0.7 0.9 1.1 2 1.9 2.9l105.6 105.6c8.3 8.3 21.9 8.3 30.2 0s8.3-21.9 0-30.2l-69.2-69.1H896c11.7 0 21.3-9.6 21.3-21.3s-9.6-21.3-21.3-21.3z" fill="#2c2c2c" ></path></symbol><symbol id="icon-bianjiwendang" viewBox="0 0 1024 1024"><path d="M298.7 213.3c-11.8 0-21.3 9.6-21.3 21.3v417.2c0 5.6 2.2 11 6.2 15L384 768l100.5-101.1c4-4 6.2-9.4 6.2-15V234.7c0-11.8-9.6-21.3-21.3-21.3H298.7zM448 639.1L384 704l-64-64.9V405.3h128v233.8z m0-276.4H320V256h128v106.7z m448 106.6c11.8 0 21.3-9.6 21.3-21.3V307.5c0-5.7-2.2-11.1-6.2-15.1L688.9 70.2c-4-4-9.4-6.2-15.1-6.2H149.3c-23.5 0-42.7 19.2-42.7 42.7v810.7c0 23.5 19.2 42.7 42.7 42.7h725.3c23.5 0 42.7-19.2 42.7-42.7V618.7c0-11.8-9.6-21.3-21.3-21.3s-21.3 9.6-21.3 21.3V896c0 11.8-9.6 21.3-21.3 21.3H170.7c-11.8 0-21.3-9.6-21.3-21.3V128c0-11.8 9.6-21.3 21.3-21.3H640V320c0 11.8 9.6 21.3 21.3 21.3h213.3V448c0.1 11.8 9.6 21.3 21.4 21.3zM682.7 298.7V128l170.7 170.7H682.7z" fill="#2c2c2c" ></path></symbol><symbol id="icon-none" viewBox="0 0 3638 1024"><path d="M367.839159 676.939243l-2.152824-0.036489a54.732811 54.732811 0 0 1-52.561743-56.812658c2.919083-75.367081-16.529309-136.156991-57.816093-180.654766-75.038684-80.91334-201.270792-87.681964-202.529647-87.736697a54.732811 54.732811 0 0 1-52.707697-56.684948 54.969987 54.969987 0 0 1 56.684948-52.707698c6.969311 0.25542 172.006982 7.534884 278.808941 122.656231 61.7751 66.609831 91.03891 153.853933 86.933949 259.342305a54.732811 54.732811 0 0 1-54.659834 52.63472zM1048.131516 671.028099c-6.330762 0-12.734501-0.12771-19.211217-0.383129a54.732811 54.732811 0 0 1-52.561743-56.812659c1.185878-30.194268 26.490681-53.382735 56.812658-52.579987 107.440509 3.940762 182.004842-35.083732 228.053381-119.992567 36.780449-67.795709 40.283349-139.805845 40.301594-140.535616 1.295343-30.121291 27.074497-53.802354 56.867391-52.415789a54.64159 54.64159 0 0 1 52.525254 56.575483c-0.25542 6.969311-7.534884 172.006982-122.65623 278.808941-62.523115 58.01678-143.235767 87.335323-240.131088 87.335323zM878.678732 1023.981756a54.605102 54.605102 0 0 1-43.384875-21.327552c-393.565403-510.894306-2.207557-978.823355 1.787938-983.493889a54.714567 54.714567 0 0 1 83.175629 71.170899c-14.321752 16.87595-336.47908 406.464102 1.75145 845.512471a54.732811 54.732811 0 0 1-43.330142 88.138071zM3270.046484 676.939243a54.732811 54.732811 0 0 1-54.659834-52.616476c-4.086717-105.488372 25.177093-192.732473 86.952193-259.342305 106.801959-115.121347 271.821386-122.400811 278.790697-122.65623a54.842277 54.842277 0 0 1 56.684948 52.707697 54.732811 54.732811 0 0 1-52.543499 56.666704c-1.386565 0.054733-73.031815 3.721831-140.499127 40.301594-84.908835 46.048539-124.170505 120.649361-119.992567 228.071625a54.7693 54.7693 0 0 1-54.732811 56.867391zM2589.754127 671.028099c-96.913565 0-177.589729-29.318543-240.112844-87.317078-115.139591-106.783715-122.419055-271.821386-122.674475-278.808942a54.714567 54.714567 0 0 1 109.392646-4.141449c0.054733 1.423053 3.703587 73.050059 40.301593 140.517371 46.048539 84.927079 120.813559 124.462413 228.071626 119.992567 30.230756-0.766259 55.663269 22.38572 56.812658 52.579988s-22.38572 55.645025-52.579988 56.812658a523.610563 523.610563 0 0 1-19.211216 0.364885zM2759.206911 1023.981756a54.7693 54.7693 0 0 1-43.330143-88.138071c338.467706-439.358521 15.617096-829.165604 1.733206-845.548959a54.787544 54.787544 0 0 1 6.166563-77.118531 54.659834 54.659834 0 0 1 77.045555 5.98412c3.995495 4.670533 395.353341 472.599582 1.806182 983.493889a54.714567 54.714567 0 0 1-43.421363 21.327552zM2067.548373 947.720705h-474.351032a54.732811 54.732811 0 1 1 0-109.465623h474.351032a54.732811 54.732811 0 1 1 0 109.465623z" fill="#2c2c2c" ></path></symbol><symbol id="icon-changjingguanli" viewBox="0 0 1024 1024"><path d="M592 336h-416c-52.928 0-96 43.072-96 96v416c0 52.928 43.072 96 96 96h416c52.928 0 96-43.072 96-96v-416c0-52.928-43.072-96-96-96z m32 512a32 32 0 0 1-32 32h-416c-17.632 0-32-14.336-32-32v-416c0-17.632 14.368-32 32-32h416c17.664 0 32 14.368 32 32v416z" fill="#2c2c2c" ></path><path d="M720 208h-416a32 32 0 0 0 0 64h416c17.664 0 32 14.368 32 32v416a32 32 0 1 0 64 0v-416c0-52.928-43.072-96-96-96zM528 752h-288a32 32 0 1 0 0 64h288a32 32 0 1 0 0-64z" fill="#2c2c2c" ></path><path d="M848 80h-416a32 32 0 0 0 0 64h416c17.664 0 32 14.368 32 32v416a32 32 0 1 0 64 0v-416c0-52.928-43.072-96-96-96z" fill="#2c2c2c" ></path></symbol><symbol id="icon-shezhi" viewBox="0 0 1024 1024"><path d="M880.288 232.48L560.192 45.12a95.648 95.648 0 0 0-96.64 0L143.68 232.48A96.64 96.64 0 0 0 96 315.904v397.664c0 34.784 18.624 66.88 48.736 84l320 181.92a95.52 95.52 0 0 0 94.496 0l320-181.92A96.576 96.576 0 0 0 928 713.568V315.904a96.64 96.64 0 0 0-47.712-83.424zM864 713.568c0 11.584-6.208 22.304-16.256 28l-320 181.92a31.776 31.776 0 0 1-31.488 0l-320-181.92A32.192 32.192 0 0 1 160 713.568V315.904c0-11.456 6.048-22.048 15.904-27.808l319.872-187.36a31.84 31.84 0 0 1 32.192 0l320.128 187.392c9.856 5.728 15.904 16.32 15.904 27.776v397.664z" fill="#2c2c2c" ></path><path d="M512 320a192 192 0 1 0 0 384 192 192 0 0 0 0-384z m0 320a128 128 0 1 1 0-256 128 128 0 0 1 0 256z" fill="#2c2c2c" ></path></symbol><symbol id="icon-gongnengdingyi" viewBox="0 0 1024 1024"><path d="M418.496 645.344l-159.456-90.752a32 32 0 0 0-31.68 55.616l159.456 90.752a32 32 0 0 0 31.68-55.616z" fill="#2c2c2c" ></path><path d="M790.208 379.808a32 32 0 0 0-31.616-55.648L508.8 466.336l-249.76-142.144a32 32 0 0 0-31.68 55.616l253.344 144.16V832a32 32 0 1 0 64 0v-309.312c0-0.992-0.48-1.856-0.576-2.848l246.08-140.032z" fill="#2c2c2c" ></path><path d="M880.288 232.48L560.192 45.12a95.648 95.648 0 0 0-96.64 0L143.68 232.48A96.64 96.64 0 0 0 96 315.904v397.664c0 34.784 18.624 66.88 48.736 84l320 181.92a95.52 95.52 0 0 0 94.496 0l320-181.92A96.576 96.576 0 0 0 928 713.568V315.904a96.64 96.64 0 0 0-47.712-83.424zM864 713.568c0 11.584-6.208 22.304-16.256 28l-320 181.92a31.776 31.776 0 0 1-31.488 0l-320-181.92A32.192 32.192 0 0 1 160 713.568V315.904c0-11.456 6.048-22.048 15.904-27.808l319.872-187.36a31.84 31.84 0 0 1 32.192 0l320.128 187.392c9.856 5.728 15.904 16.32 15.904 27.776v397.664z" fill="#2c2c2c" ></path><path d="M778.656 453.952l-149.344 88.128c-20.608 12.16-37.344 38.944-37.344 59.808v176.416c0 20.864 16.704 27.904 37.344 15.744l149.344-88.128c20.608-12.16 37.344-38.944 37.344-59.808v-176.416c0-20.864-16.704-27.904-37.344-15.744z" fill="#2c2c2c" ></path></symbol><symbol id="icon-jichuguanli" viewBox="0 0 1024 1024"><path d="M941.44 865.472a447.808 447.808 0 0 0-397.44-320V352h128a32 32 0 0 0 32-32V192a32 32 0 0 0-32-32H352a32 32 0 0 0-32 32v128a32 32 0 0 0 32 32h128v193.472a447.84 447.84 0 0 0-397.504 320A64 64 0 1 0 160 928c0-16.48-6.4-31.36-16.64-42.688A384 384 0 0 1 480 609.504v263.392c-19.04 11.072-32 31.488-32 55.136a64 64 0 0 0 128 0c0-23.616-12.96-44.032-32-55.136v-263.392a383.936 383.936 0 0 1 336.608 275.872A63.36 63.36 0 0 0 864 928a64 64 0 0 0 128 0 64 64 0 0 0-50.56-62.528z" fill="#2c2c2c" ></path><path d="M288 480h77.472a32 32 0 0 0 0-64H288a32 32 0 0 1-32-32V128a32 32 0 0 1 32-32h448a32 32 0 0 1 32 32v256a32 32 0 0 1-32 32h-90.624a32 32 0 0 0 0 64H736a96 96 0 0 0 96-96V128a96 96 0 0 0-96-96H288a96 96 0 0 0-96 96v256a96 96 0 0 0 96 96z" fill="#2c2c2c" ></path></symbol><symbol id="icon-jishufuwu" viewBox="0 0 1024 1024"><path d="M435.2 326.4a32 32 0 0 0-44.8 6.4l-96 128a31.968 31.968 0 0 0 0 38.4l96 128a32 32 0 0 0 51.2-38.4L360 480l81.6-108.8a32 32 0 0 0-6.4-44.8zM748.8 633.6a32 32 0 0 0 44.8-6.4l96-128a31.968 31.968 0 0 0 0-38.4l-96-128a32 32 0 0 0-51.2 38.4l81.6 108.8-81.6 108.8a32 32 0 0 0 6.4 44.8zM592.768 313.056l-64 288a32 32 0 1 0 62.464 13.888l64-288a32 32 0 1 0-62.464-13.888z" fill="#2c2c2c" ></path><path d="M864 636.384a32 32 0 0 0-32 32V736h-96a96 96 0 0 0-96 96v96H227.04C207.712 928 192 911.424 192 891.072V132.928C192 112.576 207.712 96 227.04 96h569.888C816.288 96 832 112.576 832 132.928v124.448a32 32 0 1 0 64 0V132.928C896 77.28 851.552 32 796.928 32H227.04C172.448 32 128 77.28 128 132.928v758.144C128 946.72 172.448 992 227.04 992h435.008c1.568 0 2.912-0.672 4.416-0.896 8.96 1.6 18.464-0.256 25.984-6.528l192-160a32 32 0 0 0 10.144-33.888c0.544-2.272 1.408-4.416 1.408-6.848v-115.456a32 32 0 0 0-32-32zM736 800h78.016L704 891.68V832a32 32 0 0 1 32-32z" fill="#2c2c2c" ></path></symbol><symbol id="icon-ceshishenqing" viewBox="0 0 1024 1024"><path d="M607.232 896a32 32 0 1 1 0 64H192a96 96 0 0 1-96-96V160a96 96 0 0 1 96-96h544a96 96 0 0 1 96 96 32 32 0 0 1-64 0 32 32 0 0 0-32-32H192a32 32 0 0 0-32 32v704a32 32 0 0 0 32 32h415.232zM832 585.76v146.656c0 42.656-64 42.656-64 0v-146.656c0-42.688 64-42.688 64 0z" fill="#2c2c2c" ></path><path d="M288 320a32 32 0 1 1 0-64h224a32 32 0 0 1 0 64H288zM288 480a32 32 0 0 1 0-64h128a32 32 0 0 1 0 64H288zM639.424 926.592a32 32 0 1 1-64 0L576 800a96 96 0 0 1 96-96l127.744 1.152a32 32 0 1 1 0 64L672 768a32 32 0 0 0-32 32l-0.576 126.592z" fill="#2c2c2c" ></path><path d="M637.92 947.648a32 32 0 1 1-44.32-46.208l180.384-172.992a32 32 0 1 1 44.288 46.176l-180.352 173.024zM880.896 334.528a31.424 31.424 0 0 0 3.328-44.416l-0.416-0.512a32 32 0 0 0-44.896-3.36L408.32 652.288l-15.2 51.84 58.336-4.544 429.44-365.056z m51.616-86.4a95.36 95.36 0 0 1-9.408 134.496l-438.08 372.448a32 32 0 0 1-18.24 7.52l-114.944 8.896a32 32 0 0 1-33.184-40.928l30.944-105.472a32 32 0 0 1 9.984-15.36L797.408 237.504a96 96 0 0 1 134.688 10.112l0.416 0.512z" fill="#2c2c2c" ></path></symbol><symbol id="icon-jinggao" viewBox="0 0 1024 1024"><path d="M512 32C246.912 32 32 246.912 32 512c0 265.088 214.912 480 480 480 265.088 0 480-214.912 480-480 0-265.088-214.912-480-480-480z m0 896C282.24 928 96 741.76 96 512S282.24 96 512 96s416 186.24 416 416-186.24 416-416 416z" fill="#2c2c2c" ></path><path d="M512 384a32 32 0 0 0-32 32v352a32 32 0 0 0 64 0V416a32 32 0 0 0-32-32z" fill="#2c2c2c" ></path><path d="M512 272m-48 0a48 48 0 1 0 96 0 48 48 0 1 0-96 0Z" fill="#2c2c2c" ></path></symbol><symbol id="icon-peiwangyindao" viewBox="0 0 1024 1024"><path d="M224 756.928h224a32 32 0 0 1 31.52 26.432c3.168 18.304 18.272 26.944 32.992 26.304 14.144 0.64 28.672-7.392 32.672-24.512 3.968-16.992 16.928-28.224 30.816-28.224h224a96 96 0 0 0 96-96V224a96 96 0 0 0-96-96h-224c-24.448 0-46.24 9.952-63.008 25.728A95.36 95.36 0 0 0 448 128H224a96 96 0 0 0-96 96v436.928a96 96 0 0 0 96 96zM576 192h224a32 32 0 0 1 32 32v436.928a32 32 0 0 1-32 32h-224c-11.2 0-21.984 2.048-32 5.824V230.624C544 208.64 559.072 192 576 192zM192 224a32 32 0 0 1 32-32h224a32 32 0 0 1 32 32v474.432a95.872 95.872 0 0 0-32-5.472H224a32 32 0 0 1-32-32V224z" fill="#2c2c2c" ></path><path d="M957.984 288a32 32 0 0 0-32 32v448a32 32 0 0 1-32 32h-224a96.096 96.096 0 0 0-83.168 48h-151.648A96.096 96.096 0 0 0 352 800H128a32 32 0 0 1-32-32V320a32 32 0 0 0-64 0v448a96 96 0 0 0 96 96h224c14.688 0 27.392 9.984 31.008 23.968a32 32 0 0 0 31.008 24.032H608c14.592 0 27.36-9.888 31.008-24.032a32 32 0 0 1 30.976-23.968h224a96 96 0 0 0 96-96V320a32 32 0 0 0-32-32z" fill="#2c2c2c" ></path><path d="M272 336h113.152a32 32 0 0 0 0-64H272a32 32 0 0 0 0 64zM272 464h113.152a32 32 0 0 0 0-64H272a32 32 0 0 0 0 64z" fill="#2c2c2c" ></path></symbol><symbol id="icon-renjijiaohu" viewBox="0 0 1024 1024"><path d="M948.448 535.488c-25.856-119.584-111.008-238.24-182.272-217.632-25.504 7.36-45.088 20.832-57.728 39.424-22.976-10.656-46.496-11.68-69.504-1.536a86.112 86.112 0 0 0-40.256 35.52c-26.496-13.408-56.96-13.12-88.896 1.856a107.2 107.2 0 0 0-19.232 11.456c-77.824-109.984-141.408-159.616-198.72-146.624-81.152 18.368-81.152 89.152-19.584 181.856l118.208 182.784c-64.864-12.192-111.776-1.728-139.584 35.424-45.472 60.8 2.656 116.96 114.4 167.232l215.968 96.064a32 32 0 0 0 26.016-58.464l-215.84-96c-43.552-19.584-72.32-37.952-85.568-53.44-7.68-8.96-7.904-11.456-3.712-17.056 15.808-21.12 64.928-21.12 150.56 10.816 28.864 10.784 54.784-21.472 38.048-47.36l-164.96-255.072C284.8 343.008 284.8 325.184 305.984 320.384c28.064-6.336 87.104 49.408 165.536 170.56 5.888 13.888 15.072 28.352 27.392 42.976 25.472 30.272 72.416-3.552 51.776-37.312a2035.2 2035.2 0 0 0-23.04-36.832c0.544-3.744 3.872-6.144 9.312-8.704 22.464-10.528 36.48-6.528 52.192 15.68 17.472 24.64 56.224 13.6 58.048-16.576 1.28-21.184 7.136-31.296 17.536-35.872 8.96-3.936 20.096-0.544 37.472 16a32 32 0 0 0 53.952-20.32c1.472-16.544 9.024-25.248 27.808-30.688 19.712-5.696 83.136 82.688 101.952 169.696 13.536 62.592 13.536 136.992-0.32 223.136a32 32 0 1 0 63.2 10.144c15.008-93.504 15.008-175.776-0.352-246.784z" fill="#2c2c2c" ></path><path d="M300.8 896H164.256C144.352 896 128 879.392 128 858.656V165.344C128 144.608 144.352 128 164.256 128h375.456C559.648 128 576 144.608 576 165.344a32 32 0 0 0 64 0C640 109.472 595.232 64 539.744 64H164.256C108.768 64 64 109.472 64 165.344v693.344C64 914.528 108.768 960 164.256 960H300.8a32 32 0 0 0 0-64z" fill="#2c2c2c" ></path></symbol><symbol id="icon-quanxianshenpi" viewBox="0 0 1024 1024"><path d="M509.088 588.992v-23.872c35.936-22.816 70.656-62.88 89.536-112.064 13.408-5.696 23.04-21.824 30.816-50.56 6.016-22.304-3.648-36.992-16.672-45.12C606.368 252.384 543.808 192 448 192c-97.184 0-162.688 62.144-167.744 169.92-11.808 9.568-19.392 24.864-13.472 46.688 8.416 31.136 18.752 48.992 33.056 55.84 20.224 44.192 53.248 80.032 87.072 101.024v23.52C292.896 598.912 224 631.136 224 669.376c0 46.144 448 46.144 448 0 0-38.24-68.896-70.464-162.912-80.384z" fill="#2c2c2c" ></path><path d="M864 768V160a96 96 0 0 0-96-96H160a96 96 0 0 0-96 96v608a96 96 0 0 0 96 96h608a96 96 0 0 0 96-96zM128 768V160a32 32 0 0 1 32-32h608a32 32 0 0 1 32 32v608a32 32 0 0 1-32 32H160a32 32 0 0 1-32-32z" fill="#2c2c2c" ></path><path d="M944.896 165.856a32 32 0 0 0-32 32v679.104c0 19.84-16.064 35.904-35.904 35.904h-611.2a32 32 0 0 0 0 64h611.2a99.904 99.904 0 0 0 99.904-99.904V197.856a32 32 0 0 0-32-32z" fill="#2c2c2c" ></path></symbol><symbol id="icon-yishouquan" viewBox="0 0 1024 1024"><path d="M864 576h-250.144A204.288 204.288 0 0 1 608 530.016c0-77.088 43.2-146.56 110.752-181.632a31.104 31.104 0 0 0 11.584-11.072C771.52 316.064 800 273.568 800 224a128 128 0 0 0-128-128H352a128 128 0 0 0-128 128c0 49.568 28.48 92.064 69.664 113.312a31.104 31.104 0 0 0 11.584 11.072A204.544 204.544 0 0 1 416 530.016c0 15.712-2.4 30.976-5.888 45.984H160a96 96 0 0 0-96 96v64a96 96 0 0 0 96 96c0 54.272 49.088 96 107.296 96h489.408C814.912 928 864 886.272 864 832a96 96 0 0 0 96-96v-64a96 96 0 0 0-96-96z m-452.384-224h37.024a32 32 0 0 0 0-64H352a64 64 0 0 1 0-128h320a64 64 0 0 1 0 128h-102.112a32 32 0 0 0 0 64h42.496a267.04 267.04 0 0 0-64.416 224h-71.936a267.04 267.04 0 0 0-64.416-224zM896 736a32 32 0 0 1-32 32h-55.712a32 32 0 0 0-32 32c0 14.72 10.144 26.592 23.712 30.336V832c0 16.416-18.336 32-43.296 32H267.296C242.336 864 224 848.416 224 832h456.128a32 32 0 0 0 0-64H160a32 32 0 0 1-32-32v-64a32 32 0 0 1 32-32h704a32 32 0 0 1 32 32v64z" fill="#2c2c2c" ></path></symbol><symbol id="icon-tianshenpi" viewBox="0 0 1024 1024"><path d="M575.232 896H160a32 32 0 0 1-32-32V160a32 32 0 0 1 32-32h544c17.664 0 32 14.336 32 32a32 32 0 0 0 64 0 96 96 0 0 0-96-96H160a96 96 0 0 0-96 96v704a96 96 0 0 0 96 96h415.232a32 32 0 0 0 0-64z" fill="#2c2c2c" ></path><path d="M512 288a32 32 0 0 0-32-32H224a32 32 0 0 0 0 64h256a32 32 0 0 0 32-32zM480 480a32 32 0 0 0-32-32H224a32 32 0 0 0 0 64h224a32 32 0 0 0 32-32zM224 672a32 32 0 0 0 0 64h128a32 32 0 0 0 0-64H224zM864 624h-66.176C822.08 556.288 864 431.648 864 416a160 160 0 0 0-320 0c0 20.064 39.84 139.744 65.696 208H544a96 96 0 0 0-96 96v32a96 96 0 0 0 96 96h320a96 96 0 0 0 96-96v-32a96 96 0 0 0-96-96z m-221.536-98.464C623.104 469.76 608 420.608 608 416a96 96 0 1 1 192 0c0 6.304-52.192 158.464-70.336 208h-51.2c-8-20.16-22.4-59.264-36-98.464zM896 752a32 32 0 0 1-32 32H544a32 32 0 0 1-32-32v-32a32 32 0 0 1 32-32h320a32 32 0 0 1 32 32v32z" fill="#2c2c2c" ></path></symbol><symbol id="icon-shujukanban" viewBox="0 0 1024 1024"><path d="M979.2 158.848a32 32 0 0 0-38.4-23.936l-166.848 38.656a32 32 0 0 0-15.808 53.408L794.56 264.64l-194.56 173.568-101.024-95.68a32 32 0 0 0-45.152 1.152l-216.736 227.264A64 64 0 1 0 288 633.6c0-6.944-1.376-13.472-3.424-19.712l193.536-202.944 99.232 93.952a32 32 0 0 0 43.296 0.64L839.04 310.72l41.504 42.976a32 32 0 0 0 53.92-13.92l44.448-165.408a31.84 31.84 0 0 0 0.288-15.52z" fill="#2c2c2c" ></path><path d="M928 450.464a32 32 0 0 0-32 32V736a32 32 0 0 1-32 32H160a32 32 0 0 1-32-32V160a32 32 0 0 1 32-32h530.656a32 32 0 0 0 0-64H160a96 96 0 0 0-96 96v576a96 96 0 0 0 96 96h704a96 96 0 0 0 96-96v-253.536a32 32 0 0 0-32-32zM912 896h-800a32 32 0 0 0 0 64h800a32 32 0 0 0 0-64z" fill="#2c2c2c" ></path></symbol><symbol id="icon-yingyongguanli" viewBox="0 0 1024 1024"><path d="M384 96H192a96 96 0 0 0-96 96v192a96 96 0 0 0 96 96h192a96 96 0 0 0 96-96V192a96 96 0 0 0-96-96z m32 288a32 32 0 0 1-32 32H192a32 32 0 0 1-32-32V192a32 32 0 0 1 32-32h192a32 32 0 0 1 32 32v192zM384 544H192a96 96 0 0 0-96 96v192a96 96 0 0 0 96 96h192a96 96 0 0 0 96-96v-192a96 96 0 0 0-96-96z m32 288a32 32 0 0 1-32 32H192a32 32 0 0 1-32-32v-192a32 32 0 0 1 32-32h192a32 32 0 0 1 32 32v192zM832 544h-192a96 96 0 0 0-96 96v192a96 96 0 0 0 96 96h192a96 96 0 0 0 96-96v-192a96 96 0 0 0-96-96z m32 288a32 32 0 0 1-32 32h-192a32 32 0 0 1-32-32v-192a32 32 0 0 1 32-32h192a32 32 0 0 1 32 32v192z" fill="#2c2c2c" ></path><path d="M736 288m-192 0a192 192 0 1 0 384 0 192 192 0 1 0-384 0Z" fill="#2c2c2c" ></path></symbol><symbol id="icon-zhanghaoquanxiang" viewBox="0 0 1024 1024"><path d="M832 405.344h-224a32 32 0 0 0 0 64h224a32 32 0 0 0 0-64zM832 565.344h-224a32 32 0 0 0 0 64h224a32 32 0 0 0 0-64zM404.352 635.36v-20.864c30.816-19.968 60.544-55.04 76.768-98.048 11.488-4.992 19.744-19.104 26.4-44.256 5.152-19.488-3.104-32.352-14.272-39.488C487.744 340.832 434.144 288 352 288c-83.296 0-139.456 54.368-143.776 148.672-10.112 8.352-16.608 21.76-11.552 40.864 7.2 27.232 16.096 42.88 28.352 48.864 17.312 38.656 45.664 70.016 74.624 88.384v20.576C219.04 644.032 160 672.256 160 705.728c0 40.384 384 40.384 384 0 0-33.472-59.04-61.696-139.648-70.368z" fill="#2c2c2c" ></path><path d="M896 128H128a96 96 0 0 0-96 96v576a96 96 0 0 0 96 96h768a96 96 0 0 0 96-96V224a96 96 0 0 0-96-96z m32 672a32 32 0 0 1-32 32H128a32 32 0 0 1-32-32V224a32 32 0 0 1 32-32h768a32 32 0 0 1 32 32v576z" fill="#2c2c2c" ></path></symbol><symbol id="icon-yuanquyunwei" viewBox="0 0 1024 1024"><path d="M662.624 671.776a31.968 31.968 0 1 0-45.248 45.248l112 112a31.968 31.968 0 1 0 45.248-45.248l-112-112z" fill="#2c2c2c" ></path><path d="M712.896 571.616a247.36 247.36 0 0 0-334.112-269.568 31.968 31.968 0 0 0-11.008 52.448l97.824 97.824a31.968 31.968 0 0 1 0 45.248l-31.328 31.328a31.968 31.968 0 0 1-45.248 0L290.88 430.752a32 32 0 0 0-52.384 10.848 247.36 247.36 0 0 0 268 335.456l145.824 145.824a145.6 145.6 0 1 0 205.92-205.92l-145.344-145.344z m100.096 306.016a81.6 81.6 0 0 1-115.392 0l-170.336-170.336-17.28 4a183.36 183.36 0 0 1-224.032-194.944l57.824 57.824a96 96 0 0 0 135.776 0l31.328-31.328a96 96 0 0 0 0-135.776l-57.248-57.248a183.36 183.36 0 0 1 193.472 225.024l-4.096 17.376 170.016 170.016c31.808 31.872 31.808 83.52-0.032 115.392z" fill="#2c2c2c" ></path><path d="M944.672 423.328l-363.2-363.2a96.096 96.096 0 0 0-135.776 0l-363.2 363.2a96.032 96.032 0 0 0 15.104 148.064V896c0 52.928 43.072 96 96 96h320a32 32 0 1 0 0-64h-320c-17.632 0-32-14.336-32-32V551.744c0-13.664-8.672-25.824-21.6-30.272a32 32 0 0 1-12.256-52.896l363.2-363.2a32.064 32.064 0 0 1 45.28 0l363.2 363.232c6.048 6.016 9.376 14.048 9.376 22.624a31.808 31.808 0 0 1-21.6 30.24 32.032 32.032 0 0 0-21.632 30.272v76.544a32 32 0 1 0 64 0v-56.864a95.456 95.456 0 0 0 43.232-80.192c0-25.664-9.984-49.792-28.128-67.904z" fill="#2c2c2c" ></path></symbol><symbol id="icon-zidingyi" viewBox="0 0 1024 1024"><path d="M727.008 487.232l194.016-184.32a99.2 99.2 0 0 0 0-140.288l-48.416-48.416a99.2 99.2 0 0 0-138.464-1.76L544.64 292.384l-184.064-196.64-1.504-1.568a64.832 64.832 0 0 0-91.712-0.384L129.184 231.968a64.8 64.8 0 0 0-1.12 90.144l181.344 193.728-171.456 162.88a99.264 99.264 0 0 0-28.256 49.28l-28.992 123.744a65.632 65.632 0 0 0 82.4 77.92l119.296-35.136a99.744 99.744 0 0 0 40.32-23.232l169.056-160.608 203.616 217.536 1.504 1.568a64.832 64.832 0 0 0 91.712 0.384l138.176-138.176a64.8 64.8 0 0 0 1.12-90.144l-200.896-214.624zM319.424 786.176l-90.112-90.112a31.488 31.488 0 0 0-9.792-6.496L667.104 264.352l94.272 94.272c1.408 1.408 3.168 2.08 4.768 3.168L319.424 786.176zM778.208 158.784a35.2 35.2 0 0 1 49.12 0.64l48.416 48.416c13.76 13.76 13.76 36.032-0.64 50.4l-64.448 61.216c-1.28-2.08-2.24-4.288-4.064-6.112l-93.12-93.12 64.736-61.44zM288.512 399.904c8-0.128 16-3.168 22.112-9.28l48-48a31.968 31.968 0 1 0-45.248-45.248l-48 48a31.68 31.68 0 0 0-8.928 20.256L174.816 278.4c-0.512-0.512-0.512-1.024-0.352-1.152L312.64 139.04c0.128-0.128 0.672-0.128 1.248 0.416l184.384 196.992-142.432 135.328-67.328-71.872zM145.024 868.288a1.6 1.6 0 0 1-2.016-1.92l28.992-123.744c0.992-4.16 2.944-7.968 5.312-11.488a31.808 31.808 0 0 0 6.752 10.144l88.288 88.288a35.072 35.072 0 0 1-8 3.552l-119.328 35.168z m598.336 16.672c-0.128 0.128-0.672 0.128-1.248-0.416l-125.6-134.176a31.232 31.232 0 0 0 14.08-7.712l48-48a31.968 31.968 0 1 0-45.248-45.248l-48 48a31.68 31.68 0 0 0-7.296 11.904l-39.904-42.656 142.432-135.328 200.576 214.304c0.48 0.512 0.48 1.024 0.352 1.152l-138.144 138.176z" fill="#2c2c2c" ></path></symbol><symbol id="icon-tianjia" viewBox="0 0 1024 1024"><path d="M512 992C246.912 992 32 777.088 32 512 32 246.912 246.912 32 512 32c265.088 0 480 214.912 480 480 0 265.088-214.912 480-480 480z m0-64c229.76 0 416-186.24 416-416S741.76 96 512 96 96 282.24 96 512s186.24 416 416 416z" fill="#2c2c2c" ></path><path d="M256 544a32 32 0 0 1 0-64h512a32 32 0 0 1 0 64H256z" fill="#2c2c2c" ></path><path d="M480 256a32 32 0 0 1 64 0v512a32 32 0 0 1-64 0V256z" fill="#2c2c2c" ></path></symbol><symbol id="icon-wangye" viewBox="0 0 1024 1024"><path d="M896 64H128a64 64 0 0 0-64 64v768a64 64 0 0 0 64 64h768a64 64 0 0 0 64-64V128a64 64 0 0 0-64-64zM128 128h768v192H128V128z m768 768H128V384h768v512z" fill="#2c2c2c" ></path><path d="M256 576h512a32 32 0 0 0 0-64H256a32 32 0 0 0 0 64zM256 736h512a32 32 0 0 0 0-64H256a32 32 0 0 0 0 64zM768 192h-64a32 32 0 0 0 0 64h64a32 32 0 0 0 0-64z" fill="#2c2c2c" ></path></symbol><symbol id="icon-shezhi1" viewBox="0 0 1024 1024"><path d="M482.88 112l-17.28 90.688-20.64 4.512a309.696 309.696 0 0 0-99.776 41.088l-18.688 11.84-73.28-55.04-44.64 44.64 51.904 76.416-11.392 17.76a310.016 310.016 0 0 0-41.568 99.584l-4.8 21.6-90.72 12.896v63.104l90.688 17.312 4.512 20.64a309.984 309.984 0 0 0 41.088 99.776l11.84 18.688-55.04 73.28 44.64 44.64 76.416-51.904 17.76 11.392a310.016 310.016 0 0 0 99.584 41.568l21.6 4.8 12.896 90.72h63.104l17.312-90.688 20.64-4.512a309.984 309.984 0 0 0 99.776-41.088l18.688-11.84 73.28 55.04 44.64-44.64-51.904-76.416 11.392-17.76a310.016 310.016 0 0 0 41.568-99.584l4.8-21.6 90.72-12.896V482.88l-90.688-17.312-4.512-20.64a309.984 309.984 0 0 0-41.088-99.776l-11.84-18.688 55.04-73.28-44.64-44.64-76.416 51.904-17.76-11.392a310.144 310.144 0 0 0-99.584-41.568l-21.6-4.8-12.896-90.72H482.88zM410.56 149.856l19.424-101.856h171.584l14.624 102.624c28 8.064 54.848 19.328 80.128 33.568l85.792-58.304 121.344 121.344-62.272 82.88c14.08 25.408 25.152 52.352 32.96 80.416l101.888 19.424v171.584l-102.624 14.624a373.92 373.92 0 0 1-33.568 80.128l58.304 85.792-121.344 121.344-82.88-62.272c-25.408 14.08-52.352 25.152-80.416 32.96l-19.424 101.888h-171.584l-14.624-102.624a373.92 373.92 0 0 1-80.128-33.568L241.92 898.112l-121.344-121.344 62.272-82.88a373.824 373.824 0 0 1-32.96-80.416L48 594.048v-171.584l102.624-14.624c8.064-27.968 19.328-54.848 33.568-80.128L125.888 241.92l121.344-121.344 82.88 62.272a373.856 373.856 0 0 1 80.416-32.96z" fill="#2c2c2c" ></path><path d="M512 704a192 192 0 1 1 0-384 192 192 0 0 1 0 384z m0-64a128 128 0 1 0 0-256 128 128 0 0 0 0 256z" fill="#2c2c2c" ></path></symbol><symbol id="icon-yingyong" viewBox="0 0 1024 1024"><path d="M192 160a32 32 0 0 0-32 32v192a32 32 0 0 0 32 32h192a32 32 0 0 0 32-32V192a32 32 0 0 0-32-32H192z m0-64h192a96 96 0 0 1 96 96v192a96 96 0 0 1-96 96H192a96 96 0 0 1-96-96V192a96 96 0 0 1 96-96zM192 608a32 32 0 0 0-32 32v192a32 32 0 0 0 32 32h192a32 32 0 0 0 32-32v-192a32 32 0 0 0-32-32H192z m0-64h192a96 96 0 0 1 96 96v192a96 96 0 0 1-96 96H192a96 96 0 0 1-96-96v-192a96 96 0 0 1 96-96zM640 608a32 32 0 0 0-32 32v192a32 32 0 0 0 32 32h192a32 32 0 0 0 32-32v-192a32 32 0 0 0-32-32h-192z m0-64h192a96 96 0 0 1 96 96v192a96 96 0 0 1-96 96h-192a96 96 0 0 1-96-96v-192a96 96 0 0 1 96-96zM602.272 266.272a32 32 0 0 0 0 45.28l112 112a32 32 0 0 0 45.28 0l112-112a32 32 0 0 0 0-45.28l-112-112a32 32 0 0 0-45.28 0l-112 112z m-45.248-45.248l112-112a96 96 0 0 1 135.776 0l112 112a96 96 0 0 1 0 135.776l-112 112a96 96 0 0 1-135.776 0l-112-112a96 96 0 0 1 0-135.776z" fill="#2c2c2c" ></path></symbol><symbol id="icon-wendang" viewBox="0 0 1024 1024"><path d="M288 320a32 32 0 1 1 0-64h448a32 32 0 0 1 0 64H288zM288 544a32 32 0 0 1 0-64h448a32 32 0 0 1 0 64H288zM288 768a32 32 0 0 1 0-64h128a32 32 0 0 1 0 64H288z" fill="#2c2c2c" ></path><path d="M807.968 802.24a32 32 0 0 1 41.984 48.32l-153.856 133.6a32 32 0 0 1-20.992 7.84H195.04C140.16 992 96 946.624 96 891.072V132.928C96 77.376 140.16 32 195.04 32h633.92C883.84 32 928 77.376 928 132.928v564.32a32 32 0 1 1-64 0V132.928C864 112.32 848.096 96 828.96 96H195.04C175.904 96 160 112.32 160 132.928v758.144C160 911.68 175.904 928 195.04 928h468.096l144.832-125.76z" fill="#2c2c2c" ></path><path d="M704 959.136a32 32 0 1 1-64 0v-186.24C640 717.408 684.16 672 739.04 672h157.632a32 32 0 0 1 0 64h-157.632c-19.136 0-35.04 16.32-35.04 36.928v186.24z" fill="#2c2c2c" ></path></symbol><symbol id="icon-bingtu" viewBox="0 0 1024 1024"><path d="M896 480c-1.344 0-2.464 0.608-3.744 0.768-1.28-0.16-2.432-0.768-3.744-0.768H544V132c0-0.704-0.352-1.312-0.416-2.016 0.064-0.672 0.416-1.28 0.416-1.984a32 32 0 0 0-32-32C282.624 96 96 282.624 96 512s186.624 416 416 416 416-186.624 416-416a32 32 0 0 0-32-32zM512 864C317.92 864 160 706.08 160 512 160 328.704 300.864 177.856 480 161.632V512a32 32 0 0 0 32 32h350.368C846.144 723.136 695.296 864 512 864zM625.664 178.72a355.36 355.36 0 0 1 216.832 211.84 32 32 0 1 0 60.064-22.048 414.24 414.24 0 0 0-256.224-250.336 31.968 31.968 0 1 0-20.672 60.544z" fill="#2c2c2c" ></path></symbol><symbol id="icon-guize" viewBox="0 0 1024 1024"><path d="M864 160h-164.512A127.712 127.712 0 0 0 576 64a128 128 0 0 0 0 256 127.712 127.712 0 0 0 123.488-96H864a32 32 0 0 1 32 32v288a32 32 0 0 1-32 32h-304a32 32 0 0 0 0 64H864a96 96 0 0 0 96-96V256a96 96 0 0 0-96-96z m-288 96a64 64 0 1 1 0.032-128.032A64 64 0 0 1 576 256z" fill="#2c2c2c" ></path><path d="M832 704c-57.376 0-105.376 38.016-121.632 90.048H384a31.872 31.872 0 0 1-31.744-30.656A127.68 127.68 0 0 0 320 512c-47.264 0-88.064 25.888-110.24 64H160a32 32 0 0 1-32-32V256a32 32 0 0 1 32-32h208a32 32 0 0 0 0-64H160a96 96 0 0 0-96 96v288a96 96 0 0 0 96 96h32a127.68 127.68 0 0 0 96.16 123.52A95.936 95.936 0 0 0 384 858.08h322.688A128 128 0 1 0 832 704zM256 640a64 64 0 1 1 128.032 0.032A64 64 0 0 1 256 640z m576 256a64 64 0 1 1 0.032-128.032A64 64 0 0 1 832 896z" fill="#2c2c2c" ></path></symbol><symbol id="icon-shebeiguanli" viewBox="0 0 1024 1024"><path d="M800 736H448a32 32 0 0 0 0 64h352a32 32 0 0 0 0-64zM800 480H448a32 32 0 0 0 0 64h352a32 32 0 0 0 0-64zM800 224H448a32 32 0 0 0 0 64h352a32 32 0 0 0 0-64zM304 736h-64a32 32 0 0 0 0 64h64a32 32 0 0 0 0-64zM304 480h-64a32 32 0 0 0 0 64h64a32 32 0 0 0 0-64zM304 224h-64a32 32 0 0 0 0 64h64a32 32 0 0 0 0-64z" fill="#2c2c2c" ></path><path d="M864 96H160a96 96 0 0 0-96 96v640a96 96 0 0 0 96 96h704a96 96 0 0 0 96-96V192a96 96 0 0 0-96-96z m32 736a32 32 0 0 1-32 32H160a32 32 0 0 1-32-32v-160h672a32 32 0 0 0 0-64H128v-192h672a32 32 0 0 0 0-64H128V192a32 32 0 0 1 32-32h704a32 32 0 0 1 32 32v640z" fill="#2c2c2c" ></path></symbol><symbol id="icon-gongnengdingyi1" viewBox="0 0 1024 1024"><path d="M707.2 350.976l-198.496 115.264-195.072-111.712c-37.088-21.12-68.736 34.528-31.648 55.616l198.72 113.792v256.736a32 32 0 0 0 64 0v-258.016c0-1.056-0.512-1.952-0.608-3.008l194.752-113.088c37.088-21.056 5.44-76.704-31.648-55.584z" fill="#2c2c2c" ></path><path d="M880.288 232.48L560.192 45.12a95.648 95.648 0 0 0-96.64 0L143.68 232.48A96.64 96.64 0 0 0 96 315.904v397.664c0 34.784 18.624 66.88 48.736 84l320 181.92a95.52 95.52 0 0 0 94.496 0l320-181.92A96.576 96.576 0 0 0 928 713.568V315.904a96.64 96.64 0 0 0-47.712-83.424zM864 713.568c0 11.584-6.208 22.304-16.256 28l-320 181.92a31.776 31.776 0 0 1-31.488 0l-320-181.92A32.192 32.192 0 0 1 160 713.568V315.904c0-11.456 6.048-22.016 15.904-27.808l319.872-187.36a31.84 31.84 0 0 1 32.192 0l320.128 187.392c9.856 5.728 15.904 16.32 15.904 27.776v397.664z" fill="#2c2c2c" ></path></symbol><symbol id="icon-jishufuwu1" viewBox="0 0 1024 1024"><path d="M328 512l81.6 108.8a32 32 0 0 1-51.2 38.4l-96-128a32 32 0 0 1 0-38.4l96-128a32 32 0 1 1 51.2 38.4L328 512zM710.4 620.8a32 32 0 0 0 51.2 38.4l96-128a32 32 0 0 0 0-38.4l-96-128a32 32 0 1 0-51.2 38.4l81.6 108.8-81.6 108.8zM559.232 646.944a32 32 0 0 1-62.464-13.888l64-288a32 32 0 0 1 62.464 13.888l-64 288z" fill="#000000" ></path><path d="M874.56 739.904a32 32 0 1 1 41.984 48.32l-220.48 195.936a32 32 0 0 1-20.96 7.84H195.04C140.16 992 96 946.624 96 891.072V132.928C96 77.376 140.16 32 195.04 32h633.92C883.84 32 928 77.376 928 132.928v134.976a32 32 0 0 1-64 0V132.928C864 112.32 848.096 96 828.96 96H195.04C175.904 96 160 112.32 160 132.928v758.144C160 911.68 175.904 928 195.04 928h468.096l211.456-188.096z" fill="#000000" ></path><path d="M928 763.2a32 32 0 0 1-64 0V672a32 32 0 0 1 64 0v91.2z" fill="#000000" ></path></symbol><symbol id="icon-zuzhiqunzu" viewBox="0 0 1024 1024"><path d="M960 704h-63.616v-167.392a32 32 0 0 0-32-32H544V416h160a32 32 0 0 0 32-32V96a32 32 0 0 0-32-32H320a32 32 0 0 0-32 32v288a32 32 0 0 0 32 32h160v88.608H161.984a32 32 0 0 0-32 31.968L129.792 704H64a32 32 0 0 0-32 32v192a32 32 0 0 0 32 32h192a32 32 0 0 0 32-32v-192a32 32 0 0 0-32-32H193.792l0.16-135.392H480V704h-64a32 32 0 0 0-32 32v192a32 32 0 0 0 32 32h192a32 32 0 0 0 32-32v-192a32 32 0 0 0-32-32h-64v-135.392h288.384V704H768a32 32 0 0 0-32 32v192a32 32 0 0 0 32 32h192a32 32 0 0 0 32-32v-192a32 32 0 0 0-32-32zM352 128h320v224H352V128zM224 896H96v-128h128v128z m352 0h-128v-128h128v128z m352 0h-128v-128h128v128z" fill="#2c2c2c" ></path></symbol><symbol id="icon-dakai" viewBox="0 0 1024 1024"><path d="M275.84 160H124.192l1.824 580.096a32 32 0 0 1-64 0L60.16 160a64 64 0 0 1 64-64h177.92l97.28 96h498.272a32 32 0 1 1 0 64H373.152l-97.28-96z" fill="#000000" ></path><path d="M127.52 735.616a32 32 0 0 1-63.04-10.944l54.624-314.144C127.904 359.936 174.784 320 225.76 320h668.864c55.36 0 93.92 46.72 84.384 101.472l-72.32 416C897.824 888.064 850.976 928 800 928H160a32 32 0 0 1 0-64h640c19.712 0 40.096-17.376 43.616-37.472l72.32-416c2.784-15.904-5.984-26.528-21.312-26.528H225.76c-19.68 0-40.096 17.376-43.584 37.472l-54.656 314.144z" fill="#000000" ></path></symbol><symbol id="icon-kongxinduigou" viewBox="0 0 1024 1024"><path d="M512 992C246.912 992 32 777.088 32 512 32 246.912 246.912 32 512 32c265.088 0 480 214.912 480 480 0 265.088-214.912 480-480 480z m0-64c229.76 0 416-186.24 416-416S741.76 96 512 96 96 282.24 96 512s186.24 416 416 416z" fill="#000000" ></path><path d="M741.216 344a32 32 0 0 1 46.816 43.616l-315.296 338.208a32 32 0 0 1-43.968 2.688l-193.344-162.368a32 32 0 1 1 41.152-48.992l170.08 142.816 294.56-316z" fill="#000000" ></path></symbol><symbol id="icon-kongjianxuanzhong" viewBox="0 0 1024 1024"><path d="M96 64h832a32 32 0 0 1 32 32v832a32 32 0 0 1-32 32H96a32 32 0 0 1-32-32V96a32 32 0 0 1 32-32z m648.64 244.032l-310.368 331.296-157.696-132.48a32 32 0 1 0-41.152 48.992l180.896 152a32 32 0 0 0 43.936-2.624L791.36 351.776a32 32 0 1 0-46.72-43.744z" fill="#000000" ></path></symbol><symbol id="icon-kongjianweixuan" viewBox="0 0 1024 1024"><path d="M896 64H128c-35.296 0-64 28.704-64 64v768c0 35.296 28.704 64 64 64h768c35.296 0 64-28.704 64-64V128c0-35.296-28.704-64-64-64zM128 896V128h768l0.064 768H128z" fill="#020202" ></path></symbol><symbol id="icon-kongjianyixuan" viewBox="0 0 1024 1024"><path d="M896 64H128c-35.296 0-64 28.704-64 64v768c0 35.296 28.704 64 64 64h768c35.296 0 64-28.704 64-64V128c0-35.296-28.704-64-64-64zM128 896V128h768l0.064 768H128z" fill="#2c2c2c" ></path><path d="M744.64 308.032l-310.368 331.296-157.696-132.48a32 32 0 0 0-41.184 49.024l180.896 152a32 32 0 0 0 43.936-2.624L791.36 351.776a32 32 0 1 0-46.72-43.744z" fill="#2c2c2c" ></path></symbol><symbol id="icon-shuaxin" viewBox="0 0 1024 1024"><path d="M960 416V192l-73.056 73.056a447.712 447.712 0 0 0-373.6-201.088C265.92 63.968 65.312 264.544 65.312 512S265.92 960.032 513.344 960.032a448.064 448.064 0 0 0 415.232-279.488 38.368 38.368 0 1 0-71.136-28.896 371.36 371.36 0 0 1-344.096 231.584C308.32 883.232 142.112 717.024 142.112 512S308.32 140.768 513.344 140.768c132.448 0 251.936 70.08 318.016 179.84L736 416h224z" fill="#2c2c2c" ></path></symbol><symbol id="icon-baocun" viewBox="0 0 1024 1024"><path d="M925.248 356.928l-258.176-258.176a64 64 0 0 0-45.248-18.752H144a64 64 0 0 0-64 64v736a64 64 0 0 0 64 64h736a64 64 0 0 0 64-64V402.176a64 64 0 0 0-18.752-45.248zM288 144h192V256H288V144z m448 736H288V736h448v144z m144 0H800V704a32 32 0 0 0-32-32H256a32 32 0 0 0-32 32v176H144v-736H224V288a32 32 0 0 0 32 32h256a32 32 0 0 0 32-32V144h77.824l258.176 258.176V880z" fill="#2c2c2c" ></path></symbol><symbol id="icon-fabu" viewBox="0 0 1024 1024"><path d="M864 128h-56.64a32 32 0 0 0 0 64H864a32 32 0 0 1 32 32v640a32 32 0 0 1-32 32H160a32 32 0 0 1-32-32V224a32 32 0 0 1 32-32h62.272a32 32 0 0 0 0-64H160a96 96 0 0 0-96 96v640a96 96 0 0 0 96 96h704a96 96 0 0 0 96-96V224a96 96 0 0 0-96-96z" fill="#2c2c2c" ></path><path d="M341.216 308.32L480 185.312V688a32 32 0 0 0 64 0V185.312l138.784 123.008a32.032 32.032 0 0 0 42.464-47.904l-192-170.208a32 32 0 0 0-42.464 0l-192 170.208a32 32 0 1 0 42.432 47.904z" fill="#2c2c2c" ></path></symbol><symbol id="icon-tupianjiazaishibai" viewBox="0 0 1024 1024"><path d="M776 328m-72 0a72 72 0 1 0 144 0 72 72 0 1 0-144 0Z" fill="#2c2c2c" ></path><path d="M999.904 116.608a32 32 0 0 0-21.952-10.912l-456.192-31.904a31.552 31.552 0 0 0-27.2 11.904l-92.192 114.848a32 32 0 0 0 0.672 40.896l146.144 169.952-147.456 194.656 36.48-173.376a32 32 0 0 0-11.136-31.424L235.616 245.504l79.616-125.696a32 32 0 0 0-29.28-49.024l-240.192 16.768a32 32 0 0 0-29.696 34.176l55.808 798.016a32.064 32.064 0 0 0 34.304 29.696l176.512-13.184c17.632-1.312 30.848-16.672 29.504-34.272s-16.576-31.04-34.304-29.536l-144.448 10.784-6.432-92.512 125.312-12.576a32 32 0 0 0 28.672-35.04 32.16 32.16 0 0 0-35.04-28.672l-123.392 12.416L82.144 149.184l145.152-10.144-60.96 96.224a32 32 0 0 0 6.848 41.952l198.4 161.344-58.752 279.296a30.912 30.912 0 0 0 0.736 14.752 31.68 31.68 0 0 0 1.408 11.04l51.52 154.56a31.968 31.968 0 0 0 27.456 21.76l523.104 47.552a32.064 32.064 0 0 0 34.848-29.632L1007.68 139.84a32.064 32.064 0 0 0-7.776-23.232z m-98.912 630.848l-412.576-39.648a31.52 31.52 0 0 0-34.912 28.768 32 32 0 0 0 28.8 34.912l414.24 39.808-6.272 89.536-469.728-42.72-39.584-118.72 234.816-310.016a31.936 31.936 0 0 0-1.248-40.192L468.896 219.84l65.088-81.056 407.584 28.48-40.576 580.192z" fill="#2c2c2c" ></path></symbol><symbol id="icon-suoxiao" viewBox="0 0 1024 1024"><path d="M919.264 905.984l-138.912-138.912C851.808 692.32 896 591.328 896 480c0-229.376-186.624-416-416-416S64 250.624 64 480s186.624 416 416 416c95.008 0 182.432-32.384 252.544-86.208l141.44 141.44a31.904 31.904 0 0 0 45.248 0 32 32 0 0 0 0.032-45.248zM128 480C128 285.92 285.92 128 480 128s352 157.92 352 352-157.92 352-352 352S128 674.08 128 480z" fill="#2c2c2c" ></path><path d="M625.792 448H336a32 32 0 0 0 0 64h289.792a32 32 0 1 0 0-64z" fill="#2c2c2c" ></path></symbol><symbol id="icon-fangda" viewBox="0 0 1024 1024"><path d="M919.264 905.984l-138.912-138.912C851.808 692.32 896 591.328 896 480c0-229.376-186.624-416-416-416S64 250.624 64 480s186.624 416 416 416c95.008 0 182.432-32.384 252.544-86.208l141.44 141.44a31.904 31.904 0 0 0 45.248 0 32 32 0 0 0 0.032-45.248zM128 480C128 285.92 285.92 128 480 128s352 157.92 352 352-157.92 352-352 352S128 674.08 128 480z" fill="#2c2c2c" ></path><path d="M625.792 448H512v-112a32 32 0 0 0-64 0V448h-112a32 32 0 0 0 0 64H448v112a32 32 0 1 0 64 0V512h113.792a32 32 0 1 0 0-64z" fill="#2c2c2c" ></path></symbol><symbol id="icon-huanyuanhuabu" viewBox="0 0 1024 1024"><path d="M912 48h-800c-35.296 0-64 28.704-64 64v800c0 35.296 28.704 64 64 64h800c35.296 0 64-28.704 64-64v-800c0-35.296-28.704-64-64-64z m-800 864v-800h800l0.064 800H112z" fill="#2c2c2c" ></path><path d="M368.896 192a32 32 0 0 0-32 32v105.888H224a32 32 0 0 0 0 64h144.896a32 32 0 0 0 32-32V224a32 32 0 0 0-32-32zM784.864 329.888H672V224a32 32 0 1 0-64 0v137.888a32 32 0 0 0 32 32h144.864a32 32 0 1 0 0-64zM368.896 640H224a32 32 0 1 0 0 64h112.896v105.92a32 32 0 1 0 64 0V672a32 32 0 0 0-32-32zM784.864 640H640a32 32 0 0 0-32 32v137.92a32 32 0 1 0 64 0V704h112.864a32 32 0 1 0 0-64z" fill="#2c2c2c" ></path></symbol><symbol id="icon-quanping" viewBox="0 0 1024 1024"><path d="M368.896 192H224a32 32 0 0 0-32 32v137.888a32 32 0 0 0 64 0V256h112.896a32 32 0 0 0 0-64zM784.864 192H640a32 32 0 1 0 0 64h112.864v105.888a32 32 0 1 0 64 0V224a32 32 0 0 0-32-32zM368.896 777.92H256V672a32 32 0 1 0-64 0v137.92a32 32 0 0 0 32 32h144.896a32 32 0 1 0 0-64zM784.864 640a32 32 0 0 0-32 32v105.92H640a32 32 0 1 0 0 64h144.864a32 32 0 0 0 32-32V672a32 32 0 0 0-32-32z" fill="#020202" ></path><path d="M912 48h-800c-35.296 0-64 28.704-64 64v800c0 35.296 28.704 64 64 64h800c35.296 0 64-28.704 64-64v-800c0-35.296-28.704-64-64-64z m-800 864v-800h800l0.064 800H112z" fill="#020202" ></path></symbol><symbol id="icon-APIshuchu" viewBox="0 0 1024 1024"><path d="M512 640a32 32 0 0 0-32 32v96a32 32 0 1 0 64 0v-96a32 32 0 0 0-32-32zM333.312 317.888a12.8 12.8 0 0 0 9.056 3.744H480V544a32 32 0 1 0 64 0v-222.368h139.904a12.8 12.8 0 0 0 9.056-21.856l-170.752-170.752a12.8 12.8 0 0 0-18.112 0l-170.752 170.752a12.8 12.8 0 0 0-0.032 18.112z" fill="#2c2c2c" ></path><path d="M892.384 186.496l-174.176-86.08a32.032 32.032 0 0 0-28.384 57.376L864 243.872v502.848l-352 147.52-352-147.52V243.872l174.176-86.08a32 32 0 0 0-28.32-57.376l-174.208 86.08A63.648 63.648 0 0 0 96 243.872v502.848c0 25.888 15.424 49.056 39.264 59.008l364.384 152.704a31.936 31.936 0 0 0 24.768 0l364.352-152.672A63.84 63.84 0 0 0 928 746.72V243.872a63.68 63.68 0 0 0-35.616-57.376z" fill="#2c2c2c" ></path></symbol><symbol id="icon-APIjieru" viewBox="0 0 1024 1024"><path d="M512 256a32 32 0 0 0 32-32V127.04a32 32 0 1 0-64 0V224a32 32 0 0 0 32 32zM342.368 616.032a12.8 12.8 0 0 0-9.056 21.856l170.752 170.752a12.8 12.8 0 0 0 18.112 0l170.752-170.752a12.8 12.8 0 0 0-9.056-21.856H544V352a32 32 0 1 0-64 0v264.032h-137.632z" fill="#2c2c2c" ></path><path d="M892.384 186.496l-174.176-86.08a32.032 32.032 0 0 0-28.384 57.376L864 243.872v502.848l-352 147.52-352-147.52V243.872l174.176-86.08a32 32 0 0 0-28.32-57.376l-174.208 86.08A63.648 63.648 0 0 0 96 243.872v502.848c0 25.888 15.424 49.056 39.264 59.008l364.384 152.704a31.936 31.936 0 0 0 24.768 0l364.352-152.672A63.84 63.84 0 0 0 928 746.72V243.872a63.68 63.68 0 0 0-35.616-57.376z" fill="#2c2c2c" ></path></symbol><symbol id="icon-wenjianjia" viewBox="0 0 1024 1024"><path d="M912 208H427.872l-50.368-94.176A63.936 63.936 0 0 0 321.056 80H112c-35.296 0-64 28.704-64 64v736c0 35.296 28.704 64 64 64h800c35.296 0 64-28.704 64-64v-608c0-35.296-28.704-64-64-64z m-800-64h209.056l68.448 128H912v97.984c-0.416 0-0.8-0.128-1.216-0.128H113.248c-0.416 0-0.8 0.128-1.248 0.128V144z m0 736v-96l1.248-350.144 798.752 1.216V784h0.064v96H112z" fill="#020202" ></path></symbol><symbol id="icon-DOC" viewBox="0 0 1024 1024"><path d="M927.68 698.912c0-0.576 0.32-1.056 0.32-1.664V132.928C928 77.28 883.552 32 828.928 32H195.04C140.448 32 96 77.28 96 132.928v758.144C96 946.72 140.448 992 195.04 992h480.032a31.872 31.872 0 0 0 20.96-7.84l153.856-133.632a32 32 0 1 0-41.92-48.32L704 892.512v-119.552c0-20.384 15.712-36.96 35.072-36.96h157.632a32 32 0 0 0 32-32c-0.032-1.792-0.768-3.36-1.024-5.088zM640 772.928V928H195.04C175.712 928 160 911.424 160 891.072V132.928C160 112.576 175.712 96 195.04 96h633.888C848.288 96 864 112.576 864 132.928V672h-124.928C684.448 672 640 717.28 640 772.928z" fill="#2c2c2c" ></path><path d="M731.36 288h-5.216c-9.536 0-17.504 4.192-23.84 12.576-22.56 40.768-50.464 95.296-83.712 163.52l-70.272-141.376C539.968 299.552 528.384 288 513.632 288h-7.808c-10.112 0-18.656 5.056-25.6 15.168-36.736 69.408-64.032 123.04-81.984 160.928l-70.272-141.376C319.904 299.552 308.32 288 293.312 288h-6.944l-6.528 1.728c-15.872 8.096-23.84 17.632-23.84 28.64v7.808l0.864 5.216c43.68 92.256 77.792 162.208 102.368 209.92 9.824 23.136 21.408 34.688 34.688 34.688h6.08c8.96 0 17.344-4.192 25.152-12.576l83.264-164.384h0.864c30.368 63.904 51.776 107.712 64.192 131.424 12.736 30.368 26.336 45.536 40.8 45.536h6.08c9.824 0 18.784-5.056 26.88-15.168l116.256-231.168v-10.432l-0.864-3.456c-9.856-18.528-20.256-27.776-31.264-27.776z" fill="#2c2c2c" ></path></symbol><symbol id="icon-weizhigeshi" viewBox="0 0 1024 1024"><path d="M842.4 655.264C827.808 556.576 741.664 480 639.52 480a203.648 203.648 0 0 0-163.424 81.152 197.024 197.024 0 0 0-204.768 196.64c0 108.512 88.288 196.832 197.344 196.832h320.512c94.208 0 170.848-68.864 170.848-153.504-0.032-67.52-48.16-125.664-117.632-145.856z m-53.248 235.392H468.16a132.992 132.992 0 0 1-132.832-132.832 132.96 132.96 0 0 1 152-131.456l20.832 3.04 11.008-17.952A140.32 140.32 0 0 1 639.52 544c76.192 0 139.456 61.952 141.024 138.048l0.576 27.04 26.752 3.968C858.944 720.64 896 757.696 896 801.152c0 49.344-47.936 89.504-106.848 89.504z" fill="#2c2c2c" ></path><path d="M253.856 928H195.04C175.712 928 160 911.424 160 891.072V132.928C160 112.576 175.712 96 195.04 96h633.888C848.288 96 864 112.576 864 132.928v410.944a32 32 0 1 0 64 0V132.928C928 77.28 883.552 32 828.928 32H195.04C140.448 32 96 77.28 96 132.928v758.144C96 946.72 140.448 992 195.04 992h58.784a32 32 0 0 0 0.032-64z" fill="#2c2c2c" ></path><path d="M672 224a32 32 0 0 0-32-32H288a32 32 0 0 0 0 64h352a32 32 0 0 0 32-32zM288 352a32 32 0 0 0 0 64h192a32 32 0 0 0 0-64H288z" fill="#2c2c2c" ></path></symbol><symbol id="icon-gengduo" viewBox="0 0 1024 1024"><path d="M224 512m-80 0a80 80 0 1 0 160 0 80 80 0 1 0-160 0Z" fill="#000000" ></path><path d="M512 512m-80 0a80 80 0 1 0 160 0 80 80 0 1 0-160 0Z" fill="#000000" ></path><path d="M800 512m-80 0a80 80 0 1 0 160 0 80 80 0 1 0-160 0Z" fill="#000000" ></path></symbol><symbol id="icon-dian" viewBox="0 0 1024 1024"><path d="M512 624a112 112 0 1 0 0-224 112 112 0 0 0 0 224z" fill="#2c2c2c" ></path></symbol><symbol id="icon-shebeizhuangtai" viewBox="0 0 1024 1024"><path d="M864 64H160a96 96 0 0 0-96 96v576a96 96 0 0 0 96 96h320v64H256a32 32 0 0 0 0 64h512a32 32 0 0 0 0-64h-224v-64h320a96 96 0 0 0 96-96V160a96 96 0 0 0-96-96zM160 128h704a32 32 0 0 1 32 32v448H128V160a32 32 0 0 1 32-32z m736 608a32 32 0 0 1-32 32H160a32 32 0 0 1-32-32v-64h768v64z" fill="#2c2c2c" ></path></symbol><symbol id="icon-fenzuguanli" viewBox="0 0 1024 1024"><path d="M863.008 384C916.576 384 960 341.024 960 288V160c0-53.024-43.424-96-96.992-96H160.992C107.424 64 64 106.976 64 160v128c0 53.024 43.424 96 96.992 96H320v128a32 32 0 0 0 32 32h288v96H160.992C107.424 640 64 682.976 64 736v128c0 53.024 43.424 96 96.992 96h702.016C916.576 960 960 917.024 960 864v-128c0-53.024-43.424-96-96.992-96H704v-128a32 32 0 0 0-32-32h-288v-96h479.008z m0 320c17.856 0 32.32 14.336 32.32 32v128c0 17.664-14.464 32-32.32 32H160.992c-17.856 0-32.32-14.336-32.32-32v-128c0-17.664 14.464-32 32.32-32h702.016zM128.672 288V160c0-17.664 14.464-32 32.32-32h702.016c17.856 0 32.32 14.336 32.32 32v128c0 17.664-14.464 32-32.32 32H160.992c-17.856 0-32.32-14.336-32.32-32z" fill="#2c2c2c" ></path><path d="M320 832h384a32 32 0 0 0 0-64H320a32 32 0 0 0 0 64zM736 224a32 32 0 0 0-32-32H320a32 32 0 0 0 0 64h384a32 32 0 0 0 32-32z" fill="#2c2c2c" ></path></symbol><symbol id="icon-kuaisubianpai" viewBox="0 0 1024 1024"><path d="M320 800a32 32 0 0 1 0-64h384a32 32 0 0 1 0 64H320zM510.08 551.424c-0.032 0-0.032 0 0 0a95.584 95.584 0 0 1-74.208-35.072l-251.84-306.56a96.128 96.128 0 0 1-21.824-60.928c0-52.928 43.072-96 96-96h503.648c22.176 0 43.84 7.744 60.928 21.824a96.096 96.096 0 0 1 13.248 135.104l-251.808 306.56a95.968 95.968 0 0 1-74.144 35.072zM258.208 116.864a32.064 32.064 0 0 0-24.704 52.32l251.84 306.56c6.08 7.424 15.136 11.68 24.736 11.68a31.68 31.68 0 0 0 24.736-11.744l251.776-306.496a32.064 32.064 0 0 0-24.768-52.32H258.208z" fill="#2c2c2c" ></path><path d="M864 960H160c-52.928 0-96-43.072-96-96V416c0-52.928 43.072-96 96-96h12.512v64H160c-17.632 0-32 14.368-32 32v448c0 17.664 14.368 32 32 32h704a32 32 0 0 0 32-32V416c0-17.632-14.336-32-32-32h-22.88v-64H864c52.928 0 96 43.072 96 96v448c0 52.928-43.072 96-96 96z" fill="#2c2c2c" ></path></symbol><symbol id="icon-app" viewBox="0 0 1024 1024"><path d="M512 832m-64 0a64 64 0 1 0 128 0 64 64 0 1 0-128 0Z" fill="#2c2c2c" ></path><path d="M790.4 32H233.6C182.72 32 144 78.336 144 132.928v758.144C144 945.664 182.72 992 233.6 992h556.8c50.88 0 89.6-46.336 89.6-100.928V132.928C880 78.336 841.28 32 790.4 32zM233.6 96h556.8c12.736 0 25.6 15.392 25.6 36.928V160h-608v-27.072C208 111.392 220.864 96 233.6 96z m556.8 832H233.6c-12.736 0-25.6-15.392-25.6-36.928V224h608v667.072c0 21.536-12.864 36.928-25.6 36.928z" fill="#2c2c2c" ></path><path d="M704 560H320a32 32 0 1 0 0 64h384a32 32 0 1 0 0-64zM320 432h256.576a32 32 0 1 0 0-64H320a32 32 0 0 0 0 64z" fill="#2c2c2c" ></path></symbol><symbol id="icon-wentijieda" viewBox="0 0 1024 1024"><path d="M927.68 698.912c0-0.576 0.32-1.056 0.32-1.664V132.928C928 77.28 883.552 32 828.928 32H195.04C140.448 32 96 77.28 96 132.928v758.144C96 946.72 140.448 992 195.04 992h480.032a31.872 31.872 0 0 0 20.96-7.84l153.856-133.632a32 32 0 1 0-41.92-48.32L704 892.512v-119.552c0-20.384 15.712-36.96 35.072-36.96h157.632a32 32 0 0 0 32-32c-0.032-1.792-0.768-3.36-1.024-5.088zM640 772.928V928H195.04C175.712 928 160 911.424 160 891.072V132.928C160 112.576 175.712 96 195.04 96h633.888C848.288 96 864 112.576 864 132.928V672h-124.928C684.448 672 640 717.28 640 772.928z" fill="#2c2c2c" ></path><path d="M496 752m-48 0a48 48 0 1 0 96 0 48 48 0 1 0-96 0Z" fill="#2c2c2c" ></path><path d="M490.432 192a181.568 181.568 0 0 0-181.568 181.568 32 32 0 0 0 64 0 117.6 117.6 0 0 1 235.136 0c0 64.928-52.64 125.472-117.568 125.472a32 32 0 0 0-32 32v62.816a32 32 0 0 0 64 0v-33.632C607.456 545.088 672 462.912 672 373.568A181.568 181.568 0 0 0 490.432 192z" fill="#2c2c2c" ></path></symbol><symbol id="icon-kefu" viewBox="0 0 1024 1024"><path d="M927.616 465.6C923.328 236.704 745.888 51.808 528 51.808h-32c-217.888 0-395.328 184.896-399.616 413.76C58.112 487.744 32 528.672 32 576v64c0 70.592 57.408 128 128 128s128-57.408 128-128v-64a128.064 128.064 0 0 0-126.784-127.872C173.728 262.688 318.912 115.808 496 115.808h32c177.12 0 322.272 146.88 334.784 332.32A128.064 128.064 0 0 0 736 576v64c0 57.792 38.72 106.176 91.392 122.016a337.504 337.504 0 0 1-191.936 124.48A79.712 79.712 0 0 0 560 832a80 80 0 1 0 0 160 79.68 79.68 0 0 0 67.872-38.112 402.432 402.432 0 0 0 278.24-193.6C955.968 742.816 992 695.776 992 640v-64c0-47.328-26.112-88.256-64.384-110.4zM224 576v64c0 35.296-28.704 64-64 64s-64-28.704-64-64v-64c0-35.296 28.704-64 64-64s64 28.704 64 64z m704 64c0 34.304-27.2 62.176-61.12 63.712l-2.496-1.184c-0.224 0.512-0.576 0.928-0.8 1.408A64 64 0 0 1 800 640v-64c0-35.296 28.704-64 64-64s64 28.704 64 64v64z" fill="#2c2c2c" ></path></symbol><symbol id="icon-ruanjiankaifabao" viewBox="0 0 1024 1024"><path d="M256 512l81.6 108.8a32 32 0 0 1-51.2 38.4l-96-128a31.968 31.968 0 0 1 0-38.4l96-128a32 32 0 0 1 51.2 38.4L256 512zM670.4 620.8a32 32 0 0 0 51.2 38.4l96-128a31.968 31.968 0 0 0 0-38.4l-96-128a32 32 0 0 0-51.2 38.4L752 512l-81.6 108.8zM503.232 646.944a32 32 0 1 1-62.464-13.888l64-288a32 32 0 1 1 62.464 13.888l-64 288z" fill="#2c2c2c" ></path><path d="M160 144a32 32 0 0 0-32 32V864a32 32 0 0 0 32 32h688a32 32 0 0 0 32-32V176a32 32 0 0 0-32-32H160z m0-64h688a96 96 0 0 1 96 96V864a96 96 0 0 1-96 96H160a96 96 0 0 1-96-96V176a96 96 0 0 1 96-96z" fill="#2c2c2c" ></path></symbol><symbol id="icon-dingwei" viewBox="0 0 1024 1024"><path d="M512 512m-80 0a80 80 0 1 0 160 0 80 80 0 1 0-160 0Z" fill="#2c2c2c" ></path><path d="M960 480h-33.632C910.752 276.16 747.84 113.248 544 97.632V64a32 32 0 1 0-64 0v33.632C276.16 113.248 113.248 276.16 97.632 480H64a32 32 0 0 0 0 64h33.632C113.248 747.84 276.16 910.752 480 926.368V960a32 32 0 1 0 64 0v-33.632C747.84 910.752 910.752 747.84 926.368 544H960a32 32 0 1 0 0-64zM544 862.368V800a32 32 0 1 0-64 0v62.368C311.424 847.104 176.896 712.576 161.632 544H224a32 32 0 1 0 0-64H161.632C176.896 311.424 311.424 176.896 480 161.632V224a32 32 0 0 0 64 0V161.632c168.576 15.296 303.104 149.792 318.368 318.368H800a32 32 0 1 0 0 64h62.368c-15.264 168.576-149.792 303.104-318.368 318.368z" fill="#2c2c2c" ></path></symbol><symbol id="icon-renwujincheng" viewBox="0 0 1024 1024"><path d="M448 896H163.04C143.904 896 128 879.68 128 859.072V164.928C128 144.32 143.904 128 163.04 128h569.92C752.096 128 768 144.32 768 164.928v182.464a32 32 0 0 0 64 0V164.928C832 109.376 787.84 64 732.96 64H163.04C108.16 64 64 109.376 64 164.928v694.144C64 914.624 108.16 960 163.04 960H448a32 32 0 0 0 0-64z" fill="#2c2c2c" ></path><path d="M736 448a256 256 0 1 0 0 512 256 256 0 0 0 0-512z m0 448a192 192 0 1 1 0-384 192 192 0 0 1 0 384z" fill="#2c2c2c" ></path><path d="M831.456 688H752v-64a32 32 0 0 0-64 0v96a32 32 0 0 0 32 32h111.456a32 32 0 0 0 0-64zM640 320a32 32 0 0 0-32-32H288a32 32 0 0 0 0 64h320a32 32 0 0 0 32-32zM288 544a32 32 0 0 0 0 64h80.288a32 32 0 0 0 0-64H288z" fill="#2c2c2c" ></path></symbol><symbol id="icon-xiaoxitongzhi1" viewBox="0 0 1024 1024"><path d="M896 128H128a64 64 0 0 0-64 64v672a64 64 0 0 0 64 64h768a64 64 0 0 0 64-64V192a64 64 0 0 0-64-64z m0 64v117.664l-377.44 255.296L128 300.768V192h768zM128 864V378.048l372.64 252.032a31.968 31.968 0 0 0 35.84 0L896 386.912V864H128z" fill="#2c2c2c" ></path></symbol><symbol id="icon-gaojing" viewBox="0 0 1024 1024"><path d="M512 176a32 32 0 0 0 32-32v-64a32 32 0 0 0-64 0v64a32 32 0 0 0 32 32zM131.872 289.152a32 32 0 0 0 45.248-45.248L131.872 198.624a32 32 0 0 0-45.248 45.248l45.248 45.28zM945.152 230.624a32 32 0 0 0-45.248 0l-45.248 45.248a32 32 0 0 0 45.248 45.248l45.248-45.248a32 32 0 0 0 0-45.248zM912 912H864v-352c0-194.4-157.6-352-352-352s-352 157.6-352 352v352H112a32 32 0 0 0 0 64h800a32 32 0 0 0 0-64z m-368 0v-128a32 32 0 0 0-64 0v128H224v-352c0-159.072 128.928-288 288-288s288 128.928 288 288v352h-256z" fill="#2c2c2c" ></path><path d="M512 464a128 128 0 1 0 0 256 128 128 0 0 0 0-256z m0 192a64 64 0 1 1 0.032-128.032A64 64 0 0 1 512 656z" fill="#2c2c2c" ></path></symbol><symbol id="icon-zhihangfankui" viewBox="0 0 1024 1024"><path d="M992.544 595.296a31.968 31.968 0 0 0-45.248 0l-201.376 201.376-95.04-95.04a31.968 31.968 0 1 0-45.248 45.248l117.664 117.664a31.968 31.968 0 0 0 45.248 0l224-224a31.968 31.968 0 0 0 0-45.248zM800 352a32 32 0 0 0-32-32H256a32 32 0 0 0 0 64h512a32 32 0 0 0 32-32zM256 544a32 32 0 0 0 0 64h288a32 32 0 0 0 0-64H256z" fill="#2c2c2c" ></path><path d="M771.104 928H195.04C175.904 928 160 911.68 160 891.072V132.928C160 112.32 175.904 96 195.04 96h633.92C848.096 96 864 112.32 864 132.928v350.528a32 32 0 0 0 64 0V132.928C928 77.376 883.84 32 828.96 32H195.04C140.16 32 96 77.376 96 132.928v758.144C96 946.624 140.16 992 195.04 992h576.064a32 32 0 0 0 0-64z" fill="#2c2c2c" ></path></symbol><symbol id="icon-gongdanqueren" viewBox="0 0 1024 1024"><path d="M832 32H192C139.072 32 96 75.072 96 128v768c0 52.928 43.072 96 96 96h640c52.928 0 96-43.072 96-96V128c0-52.928-43.072-96-96-96zM320 96h384v96H320V96z m544 800a32 32 0 0 1-32 32H192c-17.632 0-32-14.336-32-32V128c0-17.632 14.368-32 32-32h64v96c0 35.296 28.704 64 64 64h384c35.296 0 64-28.704 64-64V96h64c17.664 0 32 14.368 32 32v768z" fill="#2c2c2c" ></path><path d="M719.072 367.04l-249.376 249.376-120.256-120.288a31.968 31.968 0 1 0-45.248 45.248l142.88 142.912a32 32 0 0 0 45.248 0l272-272a31.968 31.968 0 1 0-45.248-45.248z" fill="#2c2c2c" ></path></symbol><symbol id="icon-gongdan" viewBox="0 0 1024 1024"><path d="M704 416H320a32 32 0 0 0 0 64h384a32 32 0 0 0 0-64zM704 608H320a32 32 0 0 0 0 64h384a32 32 0 0 0 0-64z" fill="#2c2c2c" ></path><path d="M832 32H192C139.072 32 96 75.072 96 128v768c0 52.928 43.072 96 96 96h640c52.928 0 96-43.072 96-96V128c0-52.928-43.072-96-96-96zM320 96h384v96H320V96z m544 800a32 32 0 0 1-32 32H192c-17.632 0-32-14.336-32-32V128c0-17.632 14.368-32 32-32h64v96c0 35.296 28.704 64 64 64h384c35.296 0 64-28.704 64-64V96h64c17.664 0 32 14.368 32 32v768z" fill="#2c2c2c" ></path></symbol><symbol id="icon-xiaoxi" viewBox="0 0 1024 1024"><path d="M864 64H160C107.072 64 64 107.072 64 160v608c0 52.928 43.072 96 96 96h61.92v123.232L443.84 864H864c52.928 0 96-43.072 96-96V160c0-52.928-43.072-96-96-96z m32 704a32 32 0 0 1-32 32H443.84c-10.912 0-21.664 2.816-31.072 8.064l-126.88 70.4V864c0-35.296-28.704-64-64-64H160c-17.632 0-32-14.336-32-32V160c0-17.632 14.368-32 32-32h704c17.664 0 32 14.368 32 32v608z" fill="#2c2c2c" ></path><path d="M640 520H256a32 32 0 1 0 0 64h384a32 32 0 1 0 0-64zM768 296H256a32 32 0 0 0 0 64h512a32 32 0 1 0 0-64z" fill="#2c2c2c" ></path></symbol><symbol id="icon-chaxun" viewBox="0 0 1024 1024"><path d="M896 64H128c-35.296 0-64 28.704-64 64v768c0 35.296 28.704 64 64 64h592a32 32 0 1 0 0-64H128V128h768v592a32 32 0 1 0 64 0V128c0-35.296-28.704-64-64-64z" fill="#2c2c2c" ></path><path d="M791.744 746.496A206.752 206.752 0 0 0 832 624c0-114.688-93.312-208-208-208S416 509.312 416 624s93.312 208 208 208a206.752 206.752 0 0 0 122.496-40.256l110.88 110.88a31.904 31.904 0 0 0 45.248 0 31.968 31.968 0 0 0 0-45.248l-110.88-110.88zM480 624c0-79.392 64.608-144 144-144s144 64.608 144 144-64.608 144-144 144-144-64.608-144-144zM800 264a32 32 0 0 0-32-32H256a32 32 0 0 0 0 64h512a32 32 0 0 0 32-32zM256 422.656a32 32 0 0 0 0 64h96a32 32 0 0 0 0-64H256z" fill="#2c2c2c" ></path></symbol><symbol id="icon-anquan" viewBox="0 0 1024 1024"><path d="M867.584 160.192c-149.632-16.928-262.208-57.408-334.592-120.352l-19.04-16.544-20.544 14.656C379.968 118.944 267.776 160 160 160H128v448c0 137.344 121.088 261.92 370.208 380.864l13.088 6.24 13.344-5.728C771.072 883.52 896 755.232 896 608V163.424l-28.416-3.232zM832 608c0 116.8-107.392 223.36-319.328 316.8C299.872 821.024 192 714.464 192 608V222.976c104.672-6.784 211.584-46.688 318.496-118.944C587.232 162.528 695.168 201.536 832 220.256V608z" fill="#2c2c2c" ></path><path d="M359.776 468.672a32 32 0 1 0-47.968 42.4l121.792 137.824c12.608 14.24 30.176 21.568 47.904 21.568a64.384 64.384 0 0 0 49.696-23.52l197.6-242.72a32 32 0 0 0-49.632-40.416l-197.6 242.688-121.792-137.824z" fill="#2c2c2c" ></path></symbol><symbol id="icon-daibanshixiang" viewBox="0 0 1024 1024"><path d="M336 544C256.608 544 192 608.608 192 688S256.608 832 336 832s144-64.608 144-144-64.608-144-144-144z m0 224C291.904 768 256 732.128 256 688S291.904 608 336 608s80 35.872 80 80-35.904 80-80 80zM800 256h-211.424a32 32 0 1 0 0 64H800a32 32 0 1 0 0-64zM800 576h-211.424a32 32 0 1 0 0 64H800a32 32 0 1 0 0-64zM800 384h-211.424a32 32 0 1 0 0 64H800a32 32 0 1 0 0-64zM800 712h-211.424a32 32 0 1 0 0 64H800a32 32 0 1 0 0-64zM440 235.808l-120.992 148.608-71.04-80.352a32 32 0 0 0-47.936 42.4l71.008 80.352a63.648 63.648 0 0 0 48.032 21.632 63.36 63.36 0 0 0 49.536-23.584L489.6 276.192a32 32 0 0 0-49.6-40.384z" fill="#2c2c2c" ></path><path d="M896 64H128c-35.296 0-64 28.704-64 64v768c0 35.296 28.704 64 64 64h768c35.296 0 64-28.704 64-64V128c0-35.296-28.704-64-64-64zM128 896V128h768l0.064 768H128z" fill="#2c2c2c" ></path></symbol><symbol id="icon-huowudui" viewBox="0 0 1024 1024"><path d="M960 253.184l-448-192-448 192v547.392l448 190.72 38.688-16.48h8.192v-3.488L960 800.608V253.184z m-448 163.424l-113.536-48.32 318.944-147.2c0.736-0.352 1.216-0.992 1.92-1.408l127.232 54.528L512 416.608z m128.704-230.624l-321.696 148.48-141.568-60.288L512 130.816l128.704 55.168zM128 322.688l128 54.496V576a32 32 0 1 0 64 0v-171.52l0.064-0.032 174.816 74.432v435.584L128 758.272V322.688z m430.88 579.104V466.208L896 322.688v435.616l-337.12 143.488z" fill="#2c2c2c" ></path></symbol><symbol id="icon-chucun" viewBox="0 0 1024 1024"><path d="M512 64C357.472 64 96 90.944 96 192v634.528c0 101.024 261.472 128 416 128 154.496 0 416-26.976 416-128V192c0-101.056-261.504-128-416-128zM160 457.728C247.328 499.072 405.184 512 512 512c106.88 0 264.864-12.96 352.16-54.368l0.096 148.256C852.352 629.728 725.056 672 512 672c-212.096 0-339.136-41.888-352-65.76v-148.512zM512 448c-212.096 0-339.136-41.888-352-65.76v-116.48C247.328 307.072 405.184 320 512 320c106.848 0 264.736-12.928 352.032-54.304l0.064 116.384C851.648 405.952 724.512 448 512 448z m0-320c206.88 0 332.96 39.872 351.008 64-18.048 24.128-144.128 64-351.008 64S179.04 216.128 161.024 192C179.04 167.872 305.12 128 512 128z m0 762.528c-213.568 0-341.056-42.496-352-64v-144.8C247.328 723.072 405.184 736 512 736c106.944 0 265.056-12.992 352.32-54.432l0.096 142.688c-11.392 23.776-138.848 66.272-352.416 66.272z" fill="#2c2c2c" ></path></symbol><symbol id="icon-zhexiantu" viewBox="0 0 1024 1024"><path d="M896 832H128V224a32 32 0 0 0-64 0v640a32 32 0 0 0 32 32h800a32 32 0 1 0 0-64z" fill="#2c2c2c" ></path><path d="M247.008 640c7.424 0 14.88-2.56 20.96-7.808l179.744-155.84 174.56 155.52a31.968 31.968 0 0 0 44.704-2.08l250.432-269.216a32 32 0 1 0-46.88-43.616l-229.088 246.304-172.128-153.44a32.064 32.064 0 0 0-42.272-0.288l-200.992 174.24A32 32 0 0 0 247.008 640z" fill="#2c2c2c" ></path></symbol><symbol id="icon-liebiao" viewBox="0 0 1024 1024"><path d="M64 480h352V128H64v352z m64-288h224v224H128V192zM64 928h352V576H64v352z m64-288h224v224H128v-224zM526.848 224H928a32 32 0 1 0 0-64H526.848a32 32 0 0 0 0 64zM928 608H526.848a32 32 0 1 0 0 64H928a32 32 0 1 0 0-64zM928 384H526.848a32 32 0 0 0 0 64H928a32 32 0 1 0 0-64zM928 832H526.848a32 32 0 1 0 0 64H928a32 32 0 1 0 0-64z" fill="#2c2c2c" ></path></symbol><symbol id="icon-qiche" viewBox="0 0 1024 1024"><path d="M912.832 467.104h-22.272l-6.624-22.464h60.928a32 32 0 1 0 0-64h-79.808l-35.584-120.544C815.168 221.28 771.52 192 728 192H302.592c-43.52 0-87.136 29.28-102.112 70.112l-34.944 118.528H96a32 32 0 0 0 0 64h50.624l-6.624 22.464H128c-35.296 0-64 28.704-64 64v282.944h51.104v34.816a32 32 0 1 0 64 0v-34.816h690.528v34.816a32 32 0 1 0 64 0v-34.816h43.232v-282.944a64.128 64.128 0 0 0-64.032-64zM128 750.016v-104.96h73.792c26.464 0 50.528-16.672 59.872-41.408l24.064-63.712c1.088-2.912 1.216-5.888 1.44-8.832h450.528c0.224 2.944 0.352 5.92 1.44 8.832l24.064 63.648a64.256 64.256 0 0 0 59.872 41.472h89.76v104.96H128z m784.832-168.96l-89.76-0.032-18.848-49.952h108.608v49.984zM218.528 426.944a30.944 30.944 0 0 0 2.816-9.568L261.184 282.24c4.48-12.16 23.52-26.24 41.408-26.24H728c17.888 0 36.928 14.08 40.736 24.192l55.104 186.88H206.72l11.808-40.128z m2.144 104.16l-18.88 49.984H128v-49.984h92.672z" fill="#2c2c2c" ></path><path d="M614.752 626.24h-188.64a32 32 0 1 0 0 64h188.64a32 32 0 1 0 0-64z" fill="#2c2c2c" ></path></symbol><symbol id="icon-fuzhi" viewBox="0 0 1024 1024"><path d="M720 192h-544A80.096 80.096 0 0 0 96 272v608C96 924.128 131.904 960 176 960h544c44.128 0 80-35.872 80-80v-608C800 227.904 764.128 192 720 192z m16 688c0 8.8-7.2 16-16 16h-544a16 16 0 0 1-16-16v-608a16 16 0 0 1 16-16h544a16 16 0 0 1 16 16v608z" fill="#2c2c2c" ></path><path d="M848 64h-544a32 32 0 0 0 0 64h544a16 16 0 0 1 16 16v608a32 32 0 1 0 64 0v-608C928 99.904 892.128 64 848 64z" fill="#2c2c2c" ></path><path d="M608 360H288a32 32 0 0 0 0 64h320a32 32 0 1 0 0-64zM608 520H288a32 32 0 1 0 0 64h320a32 32 0 1 0 0-64zM480 678.656H288a32 32 0 1 0 0 64h192a32 32 0 1 0 0-64z" fill="#2c2c2c" ></path></symbol><symbol id="icon-iframetianjia" viewBox="0 0 1024 1024"><path d="M856.32 428.064a32 32 0 0 0-32 32v163.328H372.48c-0.896 0-1.664 0.448-2.56 0.512v-177.696h244.48a32 32 0 1 0 0-64H130.56c-0.896 0-1.664 0.448-2.56 0.512V231.68h488.16a32 32 0 1 0 0-64H96a32 32 0 0 0-32 32v701.824a32 32 0 0 0 32 32h760.32a32 32 0 0 0 32-32V460.064a32 32 0 0 0-32-32zM128 445.728c0.896 0.064 1.664 0.512 2.56 0.512h175.36v423.264H128V445.728z m241.92 423.776v-182.624c0.896 0.064 1.664 0.512 2.56 0.512h451.84v182.08h-454.4zM960 174.656h-61.376V113.28a32 32 0 1 0-64 0v61.344H752.64a32 32 0 1 0 0 64h81.984v81.984a32 32 0 1 0 64 0V238.656H960a32 32 0 1 0 0-64z" fill="#2c2c2c" ></path></symbol><symbol id="icon-tupiantianjia" viewBox="0 0 1024 1024"><path d="M856.32 428.064c-94.816 0-144.928 90.656-185.184 163.52-25.824 46.688-52.512 94.944-78.72 97.568-28.544-5.664-48.096-23.2-70.656-43.36-31.744-28.448-67.488-60.288-130.464-57.952-76.8 3.328-146.24 57.696-206.4 161.696a32 32 0 0 0 55.392 32.064c48.48-83.84 100.224-127.488 153.728-129.824 36.928-1.44 56.96 16.576 84.992 41.664 26.88 24.096 57.344 51.36 105.888 59.392a31.584 31.584 0 0 0 5.216 0.448c64.704 0 101.44-66.464 136.96-130.72 28.352-51.328 57.504-104 97.184-123.072v369.984H128V231.68h488.16a32 32 0 1 0 0-64H96a32 32 0 0 0-32 32v701.824a32 32 0 0 0 32 32h760.32a32 32 0 0 0 32-32V460.064a32 32 0 0 0-32-32z" fill="#2c2c2c" ></path><path d="M180.96 424.32c0 57.952 47.168 105.12 105.12 105.12s105.12-47.168 105.12-105.12-47.168-105.088-105.12-105.088-105.12 47.136-105.12 105.088z m146.24 0a41.152 41.152 0 0 1-82.24 0 41.152 41.152 0 0 1 82.24 0zM960 174.656h-61.376V113.28a32 32 0 1 0-64 0v61.344H752.64a32 32 0 1 0 0 64h81.984v81.984a32 32 0 1 0 64 0V238.656H960a32 32 0 1 0 0-64z" fill="#2c2c2c" ></path></symbol><symbol id="icon-dianzan" viewBox="0 0 1024 1024"><path d="M857.28 344.992h-264.832c12.576-44.256 18.944-83.584 18.944-118.208 0-78.56-71.808-153.792-140.544-143.808-60.608 8.8-89.536 59.904-89.536 125.536v59.296c0 76.064-58.208 140.928-132.224 148.064l-117.728-0.192A67.36 67.36 0 0 0 64 483.04V872c0 37.216 30.144 67.36 67.36 67.36h652.192a102.72 102.72 0 0 0 100.928-83.584l73.728-388.96a102.72 102.72 0 0 0-100.928-121.824zM128 872V483.04c0-1.856 1.504-3.36 3.36-3.36H208v395.68H131.36A3.36 3.36 0 0 1 128 872z m767.328-417.088l-73.728 388.96a38.72 38.72 0 0 1-38.048 31.488H272V476.864a213.312 213.312 0 0 0 173.312-209.088V208.512c0-37.568 12.064-58.912 34.72-62.176 27.04-3.936 67.36 38.336 67.36 80.48 0 37.312-9.504 84-28.864 139.712a32 32 0 0 0 30.24 42.496h308.512a38.72 38.72 0 0 1 38.048 45.888z" fill="#2c2c2c" ></path></symbol><symbol id="icon-charulianjie" viewBox="0 0 1024 1024"><path d="M910.496 213.536C804.16 82.208 611.488 61.952 480.128 168.32l-100.768 81.6 50.336 62.176 100.768-81.6a225.984 225.984 0 1 1 284.448 351.264l-107.968 87.424 50.336 62.176 107.968-87.424a305.984 305.984 0 0 0 45.248-430.4zM516.352 823.552a225.984 225.984 0 1 1-284.448-351.264l110.976-89.856-50.336-62.176-110.976 89.856C50.24 516.448 29.984 709.152 136.32 840.48c106.336 131.328 299.04 151.584 430.368 45.248l105.12-85.12-50.336-62.176-105.12 85.12z" fill="#2c2c2c" ></path><path d="M676.16 353.28l51.232 61.44-343.552 286.304-51.2-61.44z" fill="#2c2c2c" ></path></symbol><symbol id="icon-charutupian" viewBox="0 0 1024 1024"><path d="M896 626.592a16 16 0 0 0-7.68-13.664l-172.448-105.088a16 16 0 0 0-20.704 3.52l-76 92.608-1.024 1.152a16 16 0 0 1-22.624 0.032l-252.832-252.064a16.032 16.032 0 0 0-22.08-0.512l-187.36 170.656a15.936 15.936 0 0 0-5.248 11.84V800h768v-173.408z"  ></path><path d="M800 320m-64 0a64 64 0 1 0 128 0 64 64 0 1 0-128 0Z"  ></path><path d="M32 128v768h960V128H32z m896 704H96V192h832v640z"  ></path></symbol><symbol id="icon-duigoux" viewBox="0 0 1024 1024"><path d="M939.36 218.912a32 32 0 0 1 45.856 44.672l-538.016 552a32 32 0 0 1-43.776 1.92L63.872 526.048a32 32 0 1 1 41.696-48.544l316.768 271.936L939.36 218.88z" fill="#000000" ></path></symbol><symbol id="icon-guanbi1" viewBox="0 0 1024 1024"><path d="M550.848 502.496l308.64-308.896a31.968 31.968 0 1 0-45.248-45.248l-308.608 308.896-308.64-308.928a31.968 31.968 0 1 0-45.248 45.248l308.64 308.896-308.64 308.896a31.968 31.968 0 1 0 45.248 45.248l308.64-308.896 308.608 308.896a31.968 31.968 0 1 0 45.248-45.248l-308.64-308.864z" fill="#2c2c2c" ></path></symbol><symbol id="icon-aixin" viewBox="0 0 1024 1024"><path d="M171.712 571.648l0.352 0.32 287.904 252.8a64 64 0 0 0 82.912 1.344l296.832-244.544a215.584 215.584 0 1 0-301.824-300.576L512 316.672l-25.888-35.616a215.584 215.584 0 1 0-314.4 290.624zM32 407.584a279.584 279.584 0 0 1 480-194.944 279.584 279.584 0 0 1 480 194.944 278.144 278.144 0 0 1-113.024 224.512l-295.36 243.392a128 128 0 0 1-165.888-2.592L129.984 620.16A278.976 278.976 0 0 1 32 407.584z" fill="#000000" ></path></symbol><symbol id="icon-shexiangtou_shiti" viewBox="0 0 1024 1024"><path d="M868.032 287.808a64 64 0 0 1 101.056 51.648l2.624 302.592a64 64 0 0 1-102.752 51.456l-206.912-157.536a64 64 0 0 1 1.728-103.104l204.256-145.056z" fill="#000000" ></path><path d="M144 192h456.32a96 96 0 0 1 96 96v417.376a96 96 0 0 1-96 96H144a96 96 0 0 1-96-96V288a96 96 0 0 1 96-96z" fill="#000000" ></path></symbol><symbol id="icon-shexiangtou_guanbi" viewBox="0 0 1024 1024"><path d="M106.912 152.096A32 32 0 1 1 149.12 103.904l768 672a32 32 0 0 1-42.176 48.192l-768-672z" fill="#000000" ></path><path d="M732.672 462.4l-37.056-52.16 172.416-122.432a64 64 0 0 1 101.056 51.648l2.624 302.592a63.904 63.904 0 0 1-20.16 47.2l-43.84-46.656-2.624-302.592-172.416 122.432z m-34.72-54.016l35.616 53.184c-10.752 7.2-24.32 12.16-37.216 12.16a64 64 0 0 1-64-64V288a32 32 0 0 0-32-32h-205.952V192h205.952a96 96 0 0 1 96 96v121.28c0.416-0.224 1.088-0.544 1.6-0.896zM632.32 608h64v97.376a96 96 0 0 1-96 96H144a96 96 0 0 1-96-96V288a96 96 0 0 1 96-96h96v64h-96a32 32 0 0 0-32 32v417.376a32 32 0 0 0 32 32h456.32a32 32 0 0 0 32-32V608z" fill="#000000" ></path></symbol><symbol id="icon-shexiangtou" viewBox="0 0 1024 1024"><path d="M907.712 642.592l-2.624-302.592-204.256 145.056 206.88 157.536z m-39.68-354.784a64 64 0 0 1 101.056 51.648l2.624 302.592a64 64 0 0 1-102.752 51.456l-206.912-157.536a64 64 0 0 1 1.728-103.104l204.256-145.056z" fill="#000000" ></path><path d="M144 256a32 32 0 0 0-32 32v417.376a32 32 0 0 0 32 32h456.32a32 32 0 0 0 32-32V288a32 32 0 0 0-32-32H144z m0-64h456.32a96 96 0 0 1 96 96v417.376a96 96 0 0 1-96 96H144a96 96 0 0 1-96-96V288a96 96 0 0 1 96-96z" fill="#000000" ></path></symbol><symbol id="icon-shengyin_shiti" viewBox="0 0 1024 1024"><path d="M260.256 356.576l204.288-163.968a32 32 0 0 1 52.032 24.96v610.432a32 32 0 0 1-51.968 24.992l-209.92-167.552H96a32 32 0 0 1-32-32v-264.864a32 32 0 0 1 32-32h164.256zM670.784 720.128a32 32 0 0 1-44.832-45.664 214.08 214.08 0 0 0 64.32-153.312 213.92 213.92 0 0 0-55.776-144.448 32 32 0 1 1 47.36-43.04 277.92 277.92 0 0 1 72.416 187.488 278.08 278.08 0 0 1-83.488 198.976zM822.912 858.88a32 32 0 1 1-45.888-44.608A419.008 419.008 0 0 0 896 521.152c0-108.704-41.376-210.848-114.432-288.384a32 32 0 0 1 46.592-43.872c84.16 89.28 131.84 207.04 131.84 332.256 0 127.84-49.76 247.904-137.088 337.728z" fill="#000000" ></path></symbol><symbol id="icon-shengyinkai" viewBox="0 0 1024 1024"><path d="M128 420.576v200.864h149.12l175.456 140.064V284.288l-169.792 136.288H128z m132.256-64l204.288-163.968a32 32 0 0 1 52.032 24.96v610.432a32 32 0 0 1-51.968 24.992l-209.92-167.552H96a32 32 0 0 1-32-32v-264.864a32 32 0 0 1 32-32h164.256zM670.784 720.128a32 32 0 0 1-44.832-45.664 214.08 214.08 0 0 0 64.32-153.312 213.92 213.92 0 0 0-55.776-144.448 32 32 0 1 1 47.36-43.04 277.92 277.92 0 0 1 72.416 187.488 278.08 278.08 0 0 1-83.488 198.976zM822.912 858.88a32 32 0 1 1-45.888-44.608A419.008 419.008 0 0 0 896 521.152c0-108.704-41.376-210.848-114.432-288.384a32 32 0 0 1 46.592-43.872c84.16 89.28 131.84 207.04 131.84 332.256 0 127.84-49.76 247.904-137.088 337.728z" fill="#000000" ></path></symbol><symbol id="icon-shoucang_shixin" viewBox="0 0 1024 1024"><path d="M512 760.224L298.944 918.08c-22.08 16.32-53.536 12.16-70.272-9.376a47.904 47.904 0 0 1-8-43.968l82.144-259.936-219.136-163.328a48.096 48.096 0 0 1-9.376-68.544c9.472-12.096 24.192-19.2 39.776-19.2l268.64-0.448 81.408-254.88c8.224-25.792 36.32-40.16 62.784-32.16 15.744 4.8 28.064 16.8 32.96 32.16l81.408 254.88 268.64 0.448c27.712 0.032 50.112 21.952 50.08 48.96 0 15.2-7.296 29.536-19.68 38.784l-219.136 163.328 82.144 259.936c8.16 25.792-6.688 53.184-33.152 61.12a51.2 51.2 0 0 1-45.12-7.776L512 760.224z" fill="#000000" ></path></symbol><symbol id="icon-shoucang" viewBox="0 0 1024 1024"><path d="M512 720.416l232.096 171.904a19.2 19.2 0 0 0 16.864 2.88c9.536-2.88 14.592-12.224 11.84-20.864l-88.96-281.6 237.344-176.96a16.48 16.48 0 0 0 6.816-13.152c0-9.152-7.904-16.928-18.112-16.96l-292-0.448-88.48-277.12a17.568 17.568 0 0 0-11.776-11.264c-9.856-2.976-20.16 2.304-23.04 11.264l-88.48 277.12-292 0.48a18.624 18.624 0 0 0-14.624 6.944 16.096 16.096 0 0 0 3.328 23.136l237.376 176.96-88.992 281.6a15.904 15.904 0 0 0 2.72 14.688c6.048 7.744 17.856 9.312 25.984 3.296L512 720.416z m-194.016 223.36a83.008 83.008 0 0 1-114.56-15.424 79.904 79.904 0 0 1-13.28-73.28l75.296-238.24-200.864-149.76a80.096 80.096 0 0 1-15.424-113.92 82.624 82.624 0 0 1 64.864-31.456l245.312-0.384 74.304-232.672c13.6-42.56 59.52-66.112 102.56-53.024A81.536 81.536 0 0 1 590.4 88.64l74.304 232.64 245.312 0.416c45.184 0.064 82.08 36.16 82.016 81.024a80.48 80.48 0 0 1-32.576 64.352l-200.864 149.76 75.296 238.24c13.568 42.976-11.072 88.352-54.496 101.408a83.2 83.2 0 0 1-73.344-12.736L512 800.064l-194.016 143.68z" fill="#000000" ></path></symbol><symbol id="icon-shebeikaifa" viewBox="0 0 1024 1024"><path d="M864 280.224V192a32 32 0 0 0-32-32H160a32 32 0 0 0-32 32v88.224h736z m-736 64V864a32 32 0 0 0 32 32h672a32 32 0 0 0 32-32v-86.592a32 32 0 1 1 64 0V864a96 96 0 0 1-96 96H160a96 96 0 0 1-96-96V192a96 96 0 0 1 96-96h672a96 96 0 0 1 96 96v120.224a32 32 0 0 1-32 32H128z" fill="#000000" ></path><path d="M595.84 437.088a32 32 0 0 1 60.16 21.856l-109.44 288a32 32 0 0 1-60.16-21.856l109.44-288zM744.192 469.408a32 32 0 1 1 47.616-42.816l126.432 140.64a32 32 0 0 1 0 42.784l-126.432 140.64a32 32 0 0 1-47.616-42.784l107.232-119.232-107.2-119.232zM406.24 469.408a32 32 0 1 0-47.584-42.816l-126.464 140.64a32 32 0 0 0 0 42.784l126.464 140.64a32 32 0 0 0 47.584-42.784l-107.2-119.232 107.2-119.232z" fill="#000000" ></path></symbol><symbol id="icon-kongxinwenhao" viewBox="0 0 1024 1024"><path d="M512 992C246.912 992 32 777.088 32 512 32 246.912 246.912 32 512 32c265.088 0 480 214.912 480 480 0 265.088-214.912 480-480 480z m0-64c229.76 0 416-186.24 416-416S741.76 96 512 96 96 282.24 96 512s186.24 416 416 416z" fill="#000000" ></path><path d="M552 601.696v22.432h-80v-22.432c0-51.296 24.192-99.808 58.816-136.704 26.464-28.224 25.728-27.424 33.28-36.384 19.968-23.776 27.904-40.768 27.904-60.608a80 80 0 1 0-160 0H352a160 160 0 0 1 320 0c0 41.664-15.68 75.2-46.656 112.064-5.216 6.208-10.88 12.576-17.856 20.096-2.688 2.88-5.44 5.888-9.152 9.792l-9.152 9.76c-21.952 23.36-37.184 53.92-37.184 81.984zM545.856 717.984c9.44 9.312 14.144 20.672 14.144 34.016 0 13.6-4.704 24.992-14.144 34.208A46.784 46.784 0 0 1 512 800c-13.12 0-24.448-4.608-33.856-13.792A45.856 45.856 0 0 1 464 752c0-13.344 4.704-24.704 14.144-34.016A46.464 46.464 0 0 1 512 704c13.12 0 24.448 4.672 33.856 13.984z" fill="#000000" ></path></symbol><symbol id="icon-cuowukongxin" viewBox="0 0 1024 1024"><path d="M512 992C246.912 992 32 777.088 32 512 32 246.912 246.912 32 512 32c265.088 0 480 214.912 480 480 0 265.088-214.912 480-480 480z m0-64c229.76 0 416-186.24 416-416S741.76 96 512 96 96 282.24 96 512s186.24 416 416 416z" fill="#000000" ></path><path d="M572.512 512l161.696 161.664-60.544 60.544L512 572.48l-161.664 161.696-60.544-60.544L451.52 512 288 348.512 348.512 288 512 451.488 675.488 288 736 348.512 572.512 512z" fill="#000000" ></path></symbol><symbol id="icon-fangkuai1" viewBox="0 0 1024 1024"><path d="M128 128v768h768V128H128zM96 64h832a32 32 0 0 1 32 32v832a32 32 0 0 1-32 32H96a32 32 0 0 1-32-32V96a32 32 0 0 1 32-32z" fill="#020202" ></path><path d="M239.936 554.56v-85.632h545.408v85.6z" fill="#000000" ></path></symbol><symbol id="icon-fangkuai2" viewBox="0 0 1024 1024"><path d="M128 128v768h768V128H128zM96 64h832a32 32 0 0 1 32 32v832a32 32 0 0 1-32 32H96a32 32 0 0 1-32-32V96a32 32 0 0 1 32-32z" fill="#020202" ></path><path d="M554.144 554.56v228.608h-85.568V554.56H239.936v-85.6h228.64V237.76h85.568v231.168h231.2v85.6h-231.2z" fill="#000000" ></path></symbol><symbol id="icon-kongxinduigou1" viewBox="0 0 1024 1024"><path d="M512 992C246.912 992 32 777.088 32 512 32 246.912 246.912 32 512 32c265.088 0 480 214.912 480 480 0 265.088-214.912 480-480 480z m0-64c229.76 0 416-186.24 416-416S741.76 96 512 96 96 282.24 96 512s186.24 416 416 416z m187.168-608L768 390.528 432.128 718.4 256 550.176l68.064-71.296 107.328 102.464L699.168 320z" fill="#000000" ></path></symbol><symbol id="icon-xinxikongxin" viewBox="0 0 1024 1024"><path d="M560 800l-10.464-416h-75.072L464 800h96z m-14.144-493.984c9.44-9.312 14.144-20.672 14.144-34.016 0-13.6-4.704-24.992-14.144-34.208A46.784 46.784 0 0 0 512 224c-13.12 0-24.448 4.608-33.856 13.792A45.856 45.856 0 0 0 464 272c0 13.344 4.704 24.704 14.144 34.016 9.408 9.312 20.704 13.984 33.856 13.984 13.12 0 24.448-4.672 33.856-13.984zM512 32C246.912 32 32 246.912 32 512c0 265.088 214.912 480 480 480 265.088 0 480-214.912 480-480 0-265.088-214.912-480-480-480z m0 64c229.76 0 416 186.24 416 416s-186.24 416-416 416S96 741.76 96 512 282.24 96 512 96z" fill="#000000" ></path></symbol><symbol id="icon-kongjian" viewBox="0 0 1024 1024"><path d="M128 128v768h768V128H128zM96 64h832a32 32 0 0 1 32 32v832a32 32 0 0 1-32 32H96a32 32 0 0 1-32-32V96a32 32 0 0 1 32-32z" fill="#020202" ></path><path d="M699.168 320L768 390.528 432.128 718.4 256 550.176l68.064-71.296 107.328 102.464z" fill="#020202" ></path></symbol><symbol id="icon-gaojingkongxin" viewBox="0 0 1024 1024"><path d="M560 224h-96l10.464 416h75.072L560 224z m-14.144 493.984A46.464 46.464 0 0 0 512 704c-13.12 0-24.448 4.672-33.856 13.984A46.048 46.048 0 0 0 464 752c0 13.6 4.704 24.992 14.144 34.208 9.408 9.184 20.704 13.792 33.856 13.792 13.12 0 24.448-4.608 33.856-13.792 9.44-9.216 14.144-20.608 14.144-34.208 0-13.344-4.704-24.704-14.144-34.016zM512 32C246.912 32 32 246.912 32 512c0 265.088 214.912 480 480 480 265.088 0 480-214.912 480-480 0-265.088-214.912-480-480-480z m0 64c229.76 0 416 186.24 416 416s-186.24 416-416 416S96 741.76 96 512 282.24 96 512 96z" fill="#000000" ></path></symbol><symbol id="icon-add" viewBox="0 0 1024 1024"><path d="M471.04 471.04V268.288c0-22.621184 18.338816-40.96 40.96-40.96s40.96 18.338816 40.96 40.96v202.752h202.297344c22.62016 0 40.96 18.338816 40.96 40.96s-18.33984 40.96-40.96 40.96H552.96v202.297344c0 22.62016-18.338816 40.96-40.96 40.96s-40.96-18.33984-40.96-40.96V552.96H268.288c-22.621184 0-40.96-18.338816-40.96-40.96s18.338816-40.96 40.96-40.96h202.752z m40.96 552.96C229.230592 1024 0 794.769408 0 512S229.230592 0 512 0s512 229.230592 512 512-229.230592 512-512 512z m0-51.2c254.492672 0 460.8-206.307328 460.8-460.8S766.492672 51.2 512 51.2 51.2 257.507328 51.2 512s206.307328 460.8 460.8 460.8z" fill="#2c2c2c" ></path></symbol><symbol id="icon-arrow" viewBox="0 0 1024 1024"><path d="M857.766234 511.488511L345.623017 0 297.174825 49.348412 759.846873 511.488511 297.174825 974.651588 345.623017 1022.977023z" fill="#2c2c2c" ></path></symbol><symbol id="icon-arrow-left" viewBox="0 0 1024 1024"><path d="M231.424 512l512.65536 512L792.576 974.60224 329.44128 512 792.576 48.37376 744.07936 0z" fill="#2c2c2c" ></path></symbol><symbol id="icon-clock" viewBox="0 0 1024 1024"><path d="M512 1024C229.230592 1024 0 794.769408 0 512S229.230592 0 512 0s512 229.230592 512 512-229.230592 512-512 512z m0.44544-51.24608c254.492672 0 460.8-206.286848 460.8-460.75392s-206.307328-460.75392-460.8-460.75392-460.8 206.286848-460.8 460.75392 206.307328 460.75392 460.8 460.75392z m2.854912-683.58144h-51.38432v301.069312h300.967936v-49.613824H515.300352V289.17248z" fill="#2c2c2c" ></path></symbol><symbol id="icon-completed" viewBox="0 0 1024 1024"><path d="M708.926464 36.75648c0-13.48096 11.0592-24.410112 24.701952-24.410112 13.641728 0 24.701952 10.929152 24.701952 24.410112v146.460672c0 40.332288-33.291264 73.229312-74.105856 73.229312h-345.82528c-40.813568 0-74.104832-32.897024-74.104832-73.229312V36.75648c0-13.48096 11.0592-24.410112 24.701952-24.410112s24.701952 10.929152 24.701952 24.410112v146.460672c0 13.369344 11.17184 24.409088 24.701952 24.409088h345.82528c13.529088 0 24.700928-11.039744 24.700928-24.409088V36.75648z m-270.523392 702.86336l321.28512-317.4912c9.647104-9.531392 25.28768-9.531392 34.93376 0a24.20736 24.20736 0 0 1 0 34.522112L453.82144 793.42592c-10.409984 10.287104-27.557888 9.34912-36.755456-2.01216L269.692928 609.373184c-8.522752-10.52672-6.795264-25.887744 3.857408-34.30912 10.653696-8.4224 26.198016-6.715392 34.720768 3.811328l130.131968 160.745472z m443.242496-690.80064H140.988416c-27.743232 0-49.600512 21.669888-49.600512 48.869376v828.622848c0 27.19232 22.04672 48.868352 49.600512 48.868352h740.657152c27.744256 0 49.60256-21.66784 49.60256-48.868352V97.688576c0-27.172864-22.07744-48.868352-49.60256-48.868352z m0-48.8192c54.74816 0 99.00544 43.492352 99.00544 97.6896v828.6208c0 54.12864-43.93984 97.6896-99.00544 97.6896H140.988416C86.20544 1024 41.984 980.52096 41.984 926.3104V97.6896C41.984 43.56096 85.92384 0 140.988416 0h740.657152z" fill="#2c2c2c" ></path></symbol><symbol id="icon-contact" viewBox="0 0 1026 1024"><path d="M512.512 446.208c106.25024 0 192.384-85.61664 192.384-191.232S618.76224 63.744 512.512 63.744 320.128 149.36064 320.128 254.976 406.26176 446.208 512.512 446.208z m0 63.744C370.844672 509.952 256 395.795456 256 254.976S370.844672 0 512.512 0C654.179328 0 769.024 114.156544 769.024 254.976S654.179328 509.952 512.512 509.952zM2.048 896.439296C2.048 705.09568 258.048 577.536 514.048 577.536s512 127.560704 512 318.903296V1024H2.048V896.439296z m64 62.198784v1.581056h896V896.44032c0-136.296448-204.402688-255.122432-448-255.122432S66.048 760.142848 66.048 896.439296v62.198784z" fill="#2c2c2c" ></path></symbol><symbol id="icon-location" viewBox="0 0 1024 1024"><path d="M550.291456 934.541312c46.087168-25.862144 92.204032-57.53856 135.008256-95.010816 119.266304-104.408064 189.268992-231.686144 189.268992-384.41984C874.568704 238.882816 712.256512 64 512.512 64c-199.744512 0-362.056704 174.882816-362.056704 391.110656 0 152.733696 70.002688 280.011776 189.268992 384.41984 42.804224 37.472256 88.921088 69.148672 135.008256 95.010816 14.618624 8.203264 27.38176 14.831616 37.779456 19.905536 10.397696-5.07392 23.160832-11.702272 37.779456-19.905536zM512.512 1024S90.112 853.332992 90.112 455.110656C90.112 203.759616 279.227392 0 512.512 0S934.912 203.76064 934.912 455.110656C934.912 853.334016 512.512 1024 512.512 1024z" fill="#2c2c2c" ></path><path d="M509.952 573.611008c65.979392 0 119.467008-56.696832 119.467008-126.635008 0-69.9392-53.487616-126.635008-119.467008-126.635008-65.979392 0-119.467008 56.696832-119.467008 126.635008 0 69.9392 53.487616 126.635008 119.467008 126.635008zM509.952 636.928c-98.9696 0-179.2-85.044224-179.2-189.952S410.9824 257.024 509.952 257.024s179.2 85.044224 179.2 189.952S608.9216 636.928 509.952 636.928z" fill="#2c2c2c" ></path></symbol><symbol id="icon-question" viewBox="0 0 1024 1024"><path d="M512 0C229.236 0 0 229.236 0 512s229.236 512 512 512 512-229.236 512-512S794.764 0 512 0z m0 963.765C262.499 963.765 60.235 761.5 60.235 512S262.5 60.235 512 60.235 963.764 262.5 963.764 512 761.5 963.765 512 963.765z m-30.117-180.706h60.234v-60.235h-60.234v60.235zM512 240.94c-92.325 2.383-150.589 69.617-150.589 180.705h60.236c0-65.382 19.633-120.47 90.353-120.47 71.058 0 90.353 42.97 90.353 90.353 0 49.588-20.676 59.382-60.237 90.352-43.941 36.148-61.705 68.853-60.235 120.472v60.235h60.235v-60.235c-2.968-29.236 7.5-37.177 36.824-59.56 57.147-46.47 83.648-86 83.648-151.265 0-92.94-56.323-150.587-150.588-150.587z" fill="#2c2c2c" ></path></symbol><symbol id="icon-search" viewBox="0 0 1024 1024"><path d="M757.372928 734.871552l260.227072 218.35776a0.512 0.512 0 0 1 0.063488 0.720896l-38.887424 46.343168a0.512 0.512 0 0 1-0.720896 0.063488L713.900032 778.704896c-75.71456 66.17088-174.798848 106.26048-283.246592 106.26048C192.809984 884.9664 0 692.13184 0 454.259712 0 216.38656 192.809984 23.552 430.65344 23.552s430.65344 192.83456 430.65344 430.706688c0 107.191296-39.15264 205.236224-103.933952 280.612864z m-326.719488 88.56576c203.866112 0 369.13152-165.286912 369.13152-369.178624 0-203.890688-165.265408-369.1776-369.13152-369.1776-203.866112 0-369.13152 165.286912-369.13152 369.1776 0 203.891712 165.265408 369.1776 369.13152 369.1776z" fill="#2c2c2c" ></path></symbol><symbol id="icon-nav" viewBox="0 0 1024 1024"><path d="M0 123.904h1024v110.592H0V123.904z m0 332.8h1024v110.592H0V456.704z m0 332.8h1024v110.592H0V789.504z" fill="#2c2c2c" ></path></symbol><symbol id="icon-fujian" viewBox="0 0 1024 1024"><path d="M863.358166 1024.010035 143.668686 1024.010035c-39.708388 0-71.968243-32.333354-71.968243-71.96925L71.700443 88.413813c0-39.781886 32.260862-71.96925 71.968243-71.96925l215.906743 0 0 71.96925-71.96925 0 0 71.968243 71.96925 0 0 71.968243-71.96925 0 0 71.96925 71.96925 0 0 71.968243-71.96925 0 0 71.96925 71.96925 0 0 71.968243-71.96925 0 0 71.96925 71.96925 0 0 0.140956 143.937494 0 0-0.140956-71.968243 0 0-71.96925 71.968243 0 0-71.968243-71.968243 0L431.544679 376.288799l71.968243 0 0-71.968243-71.968243 0 0-71.96925 71.968243 0 0-71.968243-71.968243 0 0-71.968243 0-71.96925 143.9385 0L575.483179 376.288799l359.844236 0 0 575.750979C935.327416 991.675674 903.140052 1024.010035 863.358166 1024.010035zM287.606179 880.072542l71.96925 0 71.968243 0 71.968243 0L503.511915 664.163785 287.606179 664.163785 287.606179 880.072542zM359.57543 736.133035l71.968243 0 0 71.96925-71.968243 0L359.57543 736.133035zM647.451423 16.444562 935.327416 304.320555 647.451423 304.320555 647.451423 16.444562z" fill="#2c2c2c" ></path></symbol><symbol id="icon-gongzuohuibao" viewBox="0 0 1024 1024"><path d="M164.698 413.509c-26.299 1.228-46.97 22.717-46.97 49.015v394.68c0 26.606 22.104 49.016 49.323 49.016h689.796c27.424 0 49.322-22 49.322-49.015v-394.68c0-25.788-20.773-47.686-46.867-49.016l-17.6 14.326-301.46 246.407L512 697.368l-28.243-23.126-301.459-246.407-17.6-14.326z" fill="#2c2c2c" ></path><path d="M216.373 167.512c0-27.424 22.41-49.732 49.425-49.732h492.506c27.322 0 49.425 22.205 49.425 49.732v221.336L512 635.152 216.373 388.848V167.512z m116.45 98.132h376.261v-49.322H314.916v49.322h17.907z m0 98.543h376.261v-49.323H314.916v49.323h17.907z" fill="#2c2c2c" ></path></symbol><symbol id="icon-ferengongzi" viewBox="0 0 1024 1024"><path d="M387.017 261.155h242.129c74.925 0 132.079-162.482 132.079-162.482 0-48.66-4.872-85.474-88.07-88.068-83.172-2.62-103.098 58.158-162.872 58.158-61.266 0-91.91-47.78-167.301-58.158-75.365-10.427-88.044 39.408-88.044 88.068 0 0.001 57.129 162.482 132.079 162.482z m255.346 50.227H387.017c-282.762 0-352.204 555.51-352.204 555.51 0 72.967 59.138 146.253 132.08 146.253h695.57c72.942 0 132.078-73.286 132.078-146.253 0 0-69.465-555.51-352.178-555.51z m28.982 426.93c17.036 0 30.842 13.83 30.842 30.867 0 17.035-13.805 30.865-30.842 30.865H546.143v80.971c0 17.035-13.805 30.867-30.817 30.867-17.036 0-30.84-13.832-30.84-30.867v-80.97h-126.01c-17.035 0-30.84-13.83-30.84-30.866 0-17.037 13.805-30.867 30.84-30.867h126.01V699.15h-126.01c-17.035 0-30.84-13.806-30.84-30.842s13.805-30.89 30.84-30.89h85.181l-87.212-154.99c-8.518-14.785-3.452-33.633 11.284-42.15 14.759-8.519 33.607-3.476 42.125 11.259l105.008 185.88h5.31l105.008-185.88c8.517-14.735 27.365-19.779 42.101-11.258 14.76 8.516 19.828 27.364 11.309 42.148l-87.213 154.99h79.968c17.036 0 30.842 13.854 30.842 30.891 0 17.035-13.805 30.842-30.842 30.842H546.143v39.162h125.202z" fill="#2c2c2c" ></path></symbol><symbol id="icon-huiyijiyao" viewBox="0 0 1024 1024"><path d="M949.76 140.288h-157.696v-37.376c0-8.192 7.168-15.36 15.36-15.36h126.976c8.192 0 15.36 7.168 15.36 15.36v37.376zM792.064 163.328h157.696v623.104h-157.696zM949.76 807.936L880.64 927.744c-0.512 0.512-0.512 1.024-1.024 2.048-2.048 2.56-5.12 4.608-8.704 4.608s-6.656-2.048-8.704-4.608c0-0.512-0.512-0.512-0.512-1.024l-69.632-120.32h157.696z" fill="#2c2c2c" ></path><path d="M881.152 923.648c0 1.536-0.512 3.072-1.024 4.096-0.512 0.512-0.512 1.024-1.024 2.048-2.048 2.56-5.12 4.608-8.704 4.608s-6.656-2.048-8.704-4.608c0-0.512-0.512-0.512-0.512-1.024-1.024-1.536-1.536-3.072-1.536-5.12 0-5.632 4.608-10.752 10.752-10.752 6.144 0 10.752 5.12 10.752 10.752zM670.72 87.552H138.752c-35.328 0-64.512 29.184-64.512 64.512v719.36c0 35.328 29.184 64.512 64.512 64.512H670.72c35.328 0 64.512-29.184 64.512-64.512V152.064c0-35.328-29.184-64.512-64.512-64.512zM499.712 602.112c0 17.92-12.288 32.256-27.648 32.256H196.096c-15.36 0-27.648-14.336-27.648-32.256s12.288-32.256 27.648-32.256h275.456c15.36 0 28.16 14.336 28.16 32.256z m113.664-152.064H196.096c-15.36 0-27.648-14.336-27.648-32.256s12.288-32.256 27.648-32.256h416.768c15.36 0 27.648 14.336 27.648 32.256 0.512 17.408-12.288 32.256-27.136 32.256z m0-184.32H196.096c-15.36 0-27.648-14.336-27.648-32.256s12.288-32.256 27.648-32.256h416.768c15.36 0 27.648 14.336 27.648 32.256s-12.288 32.256-27.136 32.256z" fill="#2c2c2c" ></path></symbol><symbol id="icon-gonggaotongzhi" viewBox="0 0 1030 1024"><path d="M460.316261 993.882718q-52.522056-47.367964-111.216602-98.859201t-109.154965-94.748348q-58.682126-49.429601-117.389091-97.828382-11.326582 1.030818-22.653164 1.030818a177.660914 177.660914 0 0 1-19.573128 1.030818h-17.511492q-27.807255 0-45.306327-16.989873T0 646.844696V387.351712h1.030818l-1.030818-1.030818q0-28.838074 18.020691-47.367964T62.817819 320.423039h58.694546q94.735928-80.316891 171.972784-144.165528 32.948927-27.794836 64.867036-54.062074T416.053171 74.318274q25.758038-21.622345 43.244691-36.016543t21.622345-17.499072Q511.819917-1.850505 530.859007 0.211131t29.868892 18.529891q10.804963 16.480673 14.903397 40.152236a253.829693 253.829693 0 0 1 4.135693 43.26953v834.031364a134.9751 134.9751 0 0 1-7.203309 41.704673q-7.215728 22.131545-22.143964 35.010564t-37.593819 10.780124q-22.653164-2.049217-52.509636-29.806795z m332.618985-611.660259a307.345308 307.345308 0 0 1 34.501365 60.234564q12.8666 30.378091 12.866599 73.635201 0 41.183054-13.388218 74.131982a254.227117 254.227117 0 0 1-33.979746 59.725364 143.668749 143.668749 0 0 1-17.499072 20.082328q-9.264945 8.693648-23.683982 8.693648a41.915805 41.915805 0 0 1-31.421329-13.33854 44.461802 44.461802 0 0 1-12.866599-31.930529 46.660053 46.660053 0 0 1 3.092455-16.468254h-1.030819a134.937842 134.937842 0 0 1 12.419498-21.622345q7.215728-10.308183 13.897418-21.113146a116.817795 116.817795 0 0 0 11.326582-24.7148q4.644892-13.897418 4.644892-33.470547 0-18.54231-4.644892-32.439727a130.131496 130.131496 0 0 0-11.326582-25.224q-6.694109-11.326582-13.897418-21.622345a93.20833 93.20833 0 0 1-11.388679-21.647185 41.419025 41.419025 0 0 1-3.092455-16.480673A44.436963 44.436963 0 0 1 720.330863 366.760185a41.890966 41.890966 0 0 1 31.40891-13.388219q14.419037 0 23.683982 8.693649a143.010515 143.010515 0 0 1 17.511491 20.082327z m57.676147 462.340639a46.73457 46.73457 0 0 1-28.838073 9.264945A50.994457 50.994457 0 0 1 771.250804 803.367624q0-22.653164 17.511491-38.090599a8.010576 8.010576 0 0 1 2.049217-1.552437 7.998156 7.998156 0 0 0 2.061637-1.540018l1.030818-1.030818a308.425804 308.425804 0 0 0 53.540455-46.337146 341.635541 341.635541 0 0 0 43.25711-58.185346 289.722041 289.722041 0 0 0 28.825654-66.928673 262.958024 262.958024 0 0 0 10.295763-73.622782q0-77.224436-39.121417-141.073074t-97.828383-105.031691q-21.560248-15.449855-21.622345-41.195474a50.994457 50.994457 0 0 1 50.460418-50.460419 46.436502 46.436502 0 0 1 30.899711 11.326582 448.70403 448.70403 0 0 1 71.051946 62.30862 413.569271 413.569271 0 0 1 56.632909 77.224436 399.435883 399.435883 0 0 1 37.059781 89.072637A357.780888 357.780888 0 0 1 1030.818304 516.067385a361.618513 361.618513 0 0 1-13.388218 98.859202A395.80939 395.80939 0 0 1 979.898364 704.508423a428.348474 428.348474 0 0 1-129.29939 140.042256z m0 0" fill="#2c2c2c" ></path></symbol><symbol id="icon-gerenjixiao" viewBox="0 0 1024 1024"><path d="M916.8 0H107.2C48 0 0 48 0 107.2v809.6C0 976 48 1024 107.2 1024h809.6c59.2 0 107.2-48 107.2-107.2V107.2C1024 48 976 0 916.8 0z m-73.6 825.6H180.8c-28.8 0-52.8-24-52.8-52.8 0-28.8 24-52.8 52.8-52.8h662.4c28.8 0 52.8 24 52.8 52.8 0 30.4-24 52.8-52.8 52.8z m0-300.8c-28.8 0-52.8-24-52.8-52.8v-83.2L548.8 657.6 350.4 472 220.8 616c-9.6 11.2-24 17.6-38.4 17.6-12.8 0-25.6-4.8-35.2-14.4-9.6-9.6-16-22.4-17.6-36.8 0-14.4 4.8-27.2 12.8-38.4L344 320l198.4 184 182.4-200h-80c-28.8 0-52.8-24-52.8-52.8 0-28.8 24-52.8 52.8-52.8h198.4c3.2 0 6.4 0 9.6 1.6 1.6 0 4.8 1.6 9.6 3.2s6.4 3.2 9.6 4.8c1.6 1.6 4.8 3.2 8 4.8l1.6 1.6c3.2 3.2 4.8 4.8 6.4 8 1.6 1.6 3.2 4.8 4.8 8 1.6 3.2 1.6 6.4 3.2 8 0 3.2 1.6 6.4 1.6 11.2V472c-1.6 28.8-25.6 52.8-54.4 52.8z m0 0" fill="#2c2c2c" ></path></symbol><symbol id="icon-gongsixinwen" viewBox="0 0 1024 1024"><path d="M928 224h-57.6v646.4H601.6c0 38.4 25.6 70.4 57.6 70.4H928c32 0 57.6-32 57.6-70.4v-576c0-38.4-25.6-70.4-57.6-70.4z" fill="#2c2c2c" ></path><path d="M768 76.8H166.4c-32 0-57.6 32-57.6 70.4v723.2c0 38.4 25.6 70.4 57.6 70.4H768c32 0 57.6-32 57.6-70.4V153.6c-6.4-44.8-32-76.8-57.6-76.8zM224 262.4h217.6V480H224V262.4z m435.2 499.2H224v-70.4h435.2v70.4z m0-140.8H224v-70.4h435.2v70.4z m0-147.2H492.8v-70.4h160l6.4 70.4z m0-140.8H492.8v-70.4h160l6.4 70.4z" fill="#2c2c2c" ></path></symbol><symbol id="icon-gerenkaoqin" viewBox="0 0 1073 1024"><path d="M394.795181 555.717129H151.266632c-16.628601 0-28.965951-15.019382-28.965951-28.96595 0-16.628601 15.019382-28.965951 28.965951-28.965951h243.528549c16.628601 0 28.965951 15.019382 28.96595 28.965951 0.536406 17.165008-11.800943 28.965951-28.96595 28.96595m-31.111577 182.914615H151.266632c-16.628601 0-28.965951-15.019382-28.965951-28.96595 0-16.628601 15.019382-28.965951 28.965951-28.965951h212.416972c16.628601 0 28.965951 15.019382 28.965951 28.965951 2.145626 16.628601-12.337349 28.965951-28.965951 28.96595m113.718177 2.682033c0-170.577266 138.929282-312.18858 312.18858-312.188581 19.310634 0 41.3033 2.682032 61.150341 5.364065V317.016239H0v575.56417c0 50.958617 41.3033 92.798324 92.798324 92.798323h504.758512C524.069146 928.519644 477.401781 841.085385 477.401781 741.313777m158.776323-619.549503c0 12.337349-9.655317 24.674699-24.674699 24.674699-12.337349 0-24.674699-9.655317-24.674699-24.674699V48.812991c0-12.337349 9.655317-24.674699 24.674699-24.674699 12.337349 0 24.674699 9.655317 24.674699 24.674699v72.951283z m-363.147198 0c0 12.337349-9.655317 24.674699-24.674699 24.674699-12.337349 0-24.674699-9.655317-24.674698-24.674699V48.812991c0-12.337349 9.655317-24.674699 24.674698-24.674699 12.337349 0 24.674699 9.655317 24.674699 24.674699v72.951283z m484.911472-53.640649h-99.771608V48.812991c0-26.820325-21.992666-46.130959-46.130959-46.130959-26.820325 0-46.130959 21.992666-46.130958 46.130959v19.310634H295.023573V48.812991c0-26.820325-21.992666-46.130959-46.130959-46.130959-26.820325 0-46.130959 19.310634-46.130959 46.130959v19.310634H92.798324C41.3033 68.123625 0 109.426925 0 160.921949v92.798323h848.058669V160.921949c0-51.495024-41.3033-92.798324-90.116291-92.798324z" fill="#2c2c2c" ></path><path d="M801.391304 473.110529c-150.193819 0-271.958093 121.227868-271.958093 271.958093s121.227868 271.958093 271.958093 271.958094 271.958093-121.227868 271.958094-271.958094-122.300681-271.958093-271.958094-271.958093z m-79.388161 166.82242c4.291252-10.191723 10.191723-19.84704 18.237821-27.893138s17.165008-14.482975 27.356731-18.23782c10.191723-4.291252 21.45626-5.900471 31.647983-5.900472 11.264536 0 22.529073 2.682032 31.647984 5.900472 10.191723 4.291252 19.84704 10.191723 27.356731 18.23782 8.046097 8.046097 14.482975 17.165008 18.237821 27.893138 4.291252 10.191723 5.900471 21.45626 5.900471 32.720796 0 11.264536-2.682032 22.529073-5.900471 32.720797-4.291252 10.191723-10.191723 19.84704-18.237821 27.893137s-17.165008 14.482975-27.356731 18.237821c-10.191723 4.291252-21.45626 5.900471-31.647984 5.900472-11.264536 0-22.529073-2.682032-31.647983-5.900472-10.191723-4.291252-19.84704-10.191723-27.356731-18.237821-8.046097-8.046097-14.482975-17.165008-18.237821-27.893137-4.291252-10.191723-5.900471-21.45626-5.900471-32.720797-1.072813-11.800943 1.609219-23.065479 5.900471-32.720796z m211.880566 242.992143c-3.218439 8.582504-9.655317 13.946569-18.237821 18.237821-8.046097 4.827658-18.774227 5.900471-31.111577 5.900471h-167.895233c-11.800943 0-22.529073-2.682032-31.111577-6.973284-8.582504-4.827658-15.555788-11.800943-18.237821-19.847041-3.218439-8.582504-3.218439-21.45626 0-31.111577 1.609219-4.291252 2.682032-8.582504 4.827659-12.873755 24.138292-46.667365 72.951283-78.315348 128.737559-78.315349 40.766894 0 77.242535 16.092195 104.06286 42.91252 11.264536 11.800943 17.165008 20.919853 24.138292 33.793609 2.682032 4.291252 4.827658 8.046097 5.364065 12.873756 1.609219 4.827658 3.218439 11.800943 3.218439 18.237821-1.072813 6.973284-2.145626 12.873756-3.754845 17.165008z" fill="#2c2c2c" ></path></symbol><symbol id="icon-gongzuojilu" viewBox="0 0 1024 1024"><path d="M706.56 655.36l-76.8 30.72c-20.48 5.12-40.96-5.12-46.08-25.6l-15.36-81.92c0-15.36 0-30.72 5.12-40.96l256-455.68c-15.36-40.96-51.2-71.68-97.28-71.68H230.4c-56.32 0-107.52 46.08-107.52 102.4v614.4c0 56.32 46.08 102.4 107.52 102.4h506.88c56.32 0 107.52-46.08 107.52-102.4V450.56l-102.4 179.2c-10.24 10.24-20.48 20.48-35.84 25.6zM281.6 179.2h348.16c20.48 0 35.84 15.36 35.84 35.84 0 20.48-15.36 35.84-35.84 35.84H281.6c-20.48 0-35.84-15.36-35.84-35.84 0-20.48 15.36-35.84 35.84-35.84z m184.32 460.8H281.6c-20.48 0-35.84-15.36-35.84-35.84s15.36-35.84 35.84-35.84h184.32c20.48 0 35.84 15.36 35.84 35.84s-15.36 35.84-35.84 35.84zM281.6 445.44c-20.48 0-35.84-15.36-35.84-35.84s15.36-35.84 35.84-35.84H563.2c20.48 0 35.84 15.36 35.84 35.84s-20.48 35.84-35.84 35.84H281.6z m0 0" fill="#2c2c2c" ></path><path d="M936.96 189.44l-76.8-40.96c-5.12-5.12-15.36 0-20.48 5.12l-15.36 25.6c-5.12 5.12 0 15.36 5.12 20.48l76.8 40.96c5.12 5.12 15.36 0 20.48-5.12l15.36-30.72c5.12-5.12 0-15.36-5.12-15.36zM865.28 256l-30.72-15.36c-15.36-10.24-40.96-5.12-51.2 15.36L614.4 547.84c-5.12 10.24-5.12 15.36-5.12 25.6l10.24 51.2c0 10.24 15.36 20.48 25.6 15.36l46.08-20.48c10.24-5.12 15.36-10.24 20.48-15.36l163.84-291.84c20.48-20.48 10.24-46.08-10.24-56.32z" fill="#2c2c2c" ></path></symbol><symbol id="icon-richenganpai" viewBox="0 0 1024 1024"><path d="M115.2 428.8v404.864c0 39.36 28.7296 71.552 68.224 75.136h649.9648c39.5008 0 71.8208-28.6272 75.4112-67.9872V428.8H115.2z m272.9152 233.1072v75.136H262.432v-75.136h125.6832z m183.136 0v75.136H449.152v-75.136h122.0928z m186.7264 0v75.136H635.8848v-75.136h122.0928zM388.1152 515.2v75.136H262.432V515.2h125.6832z m183.136 0v75.136H449.152V515.2h122.0928z m186.7264 0v75.136H635.8848V515.2h122.0928z m-495.552-343.5072H190.6176C151.104 171.6928 118.784 200.32 115.2 239.68v128.8128h790.0096V243.264c0-39.36-28.7296-71.5648-68.224-75.136h-68.2304v121.6512h-161.6v-118.08H420.4352v121.664H262.432v-121.664zM725.664 121.6h-75.4048v121.664h75.4112V121.6zM377.344 121.6H301.9264v121.664H377.344V121.6z" fill="#000000" ></path></symbol><symbol id="icon-xiaoxitongzhi" viewBox="0 0 1024 1024"><path d="M512.4 65.4C266 65.4 66.3 240.2 66.3 455.7c0 123.2 65.4 233 167.3 304.5v197.4L429 839.1c27 4.4 54.8 7.1 83.4 7.1 246.4 0 446.1-174.8 446.1-390.4 0.1-215.6-199.7-390.4-446.1-390.4z m-223 446.1c-30.8 0-55.7-25-55.7-55.8 0-30.8 25-55.7 55.7-55.7 30.8 0 55.8 25 55.8 55.7-0.1 30.8-25 55.8-55.8 55.8z m223 0c-30.8 0-55.8-25-55.8-55.8 0-30.8 25-55.7 55.8-55.7 30.8 0 55.8 25 55.8 55.7 0 30.8-25 55.8-55.8 55.8z m223.1 0c-30.8 0-55.8-25-55.8-55.8 0-30.8 25-55.7 55.8-55.7 30.8 0 55.7 25 55.7 55.7 0.1 30.8-24.9 55.8-55.7 55.8z" fill="#2c2c2c" ></path></symbol><symbol id="icon-richangbangong" viewBox="0 0 1024 1024"><path d="M896.512 637.44c-17.92-70.144-82.432-120.32-155.648-120.32-58.368 0-111.104 30.72-137.728 80.384-64.512 10.752-111.104 64-111.104 128.512 0 71.68 58.368 129.536 129.536 129.536h258.56c61.44 0 109.568-48.128 109.568-109.568 0.512-53.248-40.96-100.352-93.184-108.544z m-16.384 158.208h-258.56c-38.4 0-69.12-31.232-69.12-69.12 0-38.4 31.232-69.12 69.12-69.12h21.504l2.048-7.168c13.312-43.008 51.712-72.192 95.744-72.192 53.76 0 99.328 45.568 99.328 99.328v19.968h39.936c28.16 0 49.664 21.504 49.664 49.664s-21.504 48.64-49.664 48.64zM950.784 329.216c0-40.448-32.768-73.216-73.216-73.216h-91.648V182.784c0-60.416-49.152-109.568-109.568-109.568H347.648c-60.416 0-109.568 49.152-109.568 109.568V256H146.432c-40.448 0-73.216 32.768-73.216 73.216v109.568h877.568V329.216zM713.216 256H310.784V182.784c0-19.968 16.384-36.352 36.352-36.352h329.216c19.968 0 36.352 16.384 36.352 36.352V256z" fill="#2c2c2c" ></path><path d="M433.664 727.04c0-96.256 47.616-181.248 120.32-233.472H73.216v365.568c0 40.448 32.768 73.216 73.216 73.216h374.272c-53.248-51.712-87.04-124.928-87.04-205.312z" fill="#2c2c2c" ></path></symbol><symbol id="icon-bangongshenpi" viewBox="0 0 1024 1024"><path d="M691.2 790.186667v-64.853334c-49.493333-20.48-83.626667-69.973333-83.626667-126.293333 0-75.093333 63.146667-136.533333 139.946667-136.533333s139.946667 61.44 139.946667 136.533333c0 56.32-34.133333 105.813333-83.626667 126.293333v64.853334h124.586667c39.253333 0 69.973333 29.013333 69.973333 69.973333v66.56H496.64v-69.973333c0-37.546667 30.72-66.56 69.973333-66.56h124.586667z m-165.546667 163.84h443.733334v54.613333h-443.733334v-54.613333z" fill="#2c2c2c" ></path><path d="M672.426667 0h-546.133334C66.56 0 18.773333 46.08 18.773333 105.813333v776.533334c0 58.026667 47.786667 105.813333 109.226667 105.813333h291.84v-129.706667c0-78.506667 64.853333-143.36 146.773333-145.066666-22.186667-34.133333-34.133333-73.386667-34.133333-116.053334 0-117.76 97.28-211.626667 218.453333-211.626666 10.24 0 22.186667 1.706667 32.426667 1.706666V105.813333c-3.413333-59.733333-51.2-105.813333-110.933333-105.813333zM476.16 462.506667H192.853333c-23.893333 0-44.373333-18.773333-44.373333-42.666667s18.773333-42.666667 44.373333-42.666667h283.306667c23.893333 0 44.373333 18.773333 44.373333 42.666667-1.706667 23.893333-20.48 42.666667-44.373333 42.666667zM628.053333 273.066667H192.853333c-23.893333 0-44.373333-18.773333-44.373333-42.666667S167.253333 187.733333 192.853333 187.733333h435.2c23.893333 0 44.373333 18.773333 44.373334 42.666667S651.946667 273.066667 628.053333 273.066667z" fill="#2c2c2c" ></path></symbol><symbol id="icon-xiangmu" viewBox="0 0 1024 1024"><path d="M874.667 618.667H672C637.867 669.867 578.133 704 512 704s-125.867-34.133-160-85.333H149.333c-23.466 0-42.666 19.2-42.666 42.666v213.334c0 23.466 19.2 42.666 42.666 42.666h725.334c23.466 0 42.666-19.2 42.666-42.666V661.333c0-23.466-19.2-42.666-42.666-42.666zM320 192H213.333c-23.466 0-42.666 19.2-42.666 42.667v320H320V192z" fill="#2c2c2c" ></path><path d="M405.333 582.4C428.8 618.667 469.333 640 512 640s83.2-21.333 106.667-57.6l19.2-27.733h215.466V149.333c0-23.466-19.2-42.666-42.666-42.666h-384c-23.467 0-42.667 19.2-42.667 42.666v405.334h2.133l19.2 27.733z m96-390.4H736c17.067 0 32 14.933 32 32s-14.933 32-32 32H501.333c-17.066 0-32-14.933-32-32s14.934-32 32-32z m0 128H736c17.067 0 32 14.933 32 32s-14.933 32-32 32H501.333c-17.066 0-32-14.933-32-32s14.934-32 32-32z m0 128H736c17.067 0 32 14.933 32 32s-14.933 32-32 32H501.333c-17.066 0-32-14.933-32-32s14.934-32 32-32z" fill="#2c2c2c" ></path></symbol></svg>',(h=>{var c=(l=(l=document.getElementsByTagName("script"))[l.length-1]).getAttribute("data-injectcss"),l=l.getAttribute("data-disable-injectsvg");if(!l){var a,i,v,o,z,t=function(c,l){l.parentNode.insertBefore(c,l)};if(c&&!h.__iconfont__svg__cssinject__){h.__iconfont__svg__cssinject__=!0;try{document.write("<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>")}catch(c){console&&console.log(c)}}a=function(){var c,l=document.createElement("div");l.innerHTML=h._iconfont_svg_string_4700657,(l=l.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",l=l,(c=document.body).firstChild?t(l,c.firstChild):c.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(a,0):(i=function(){document.removeEventListener("DOMContentLoaded",i,!1),a()},document.addEventListener("DOMContentLoaded",i,!1)):document.attachEvent&&(v=a,o=h.document,z=!1,p(),o.onreadystatechange=function(){"complete"==o.readyState&&(o.onreadystatechange=null,s())})}function s(){z||(z=!0,v())}function p(){try{o.documentElement.doScroll("left")}catch(c){return void setTimeout(p,50)}s()}})(window);
\ No newline at end of file
diff --git a/public/static/assets/icon/iconfont.json b/public/static/assets/icon/iconfont.json
new file mode 100644
index 0000000000000000000000000000000000000000..44378629db6e9ffbfda4b81d9ebc8e41c5478e2a
--- /dev/null
+++ b/public/static/assets/icon/iconfont.json
@@ -0,0 +1,2704 @@
+{
+  "id": "4700657",
+  "name": "oamobile",
+  "font_family": "iconfont",
+  "css_prefix_text": "icon-",
+  "description": "",
+  "glyphs": [
+    {
+      "icon_id": "3476740",
+      "name": "项目文档",
+      "font_class": "xiangmuwendang",
+      "unicode": "e614",
+      "unicode_decimal": 58900
+    },
+    {
+      "icon_id": "8230553",
+      "name": "任务评论",
+      "font_class": "renwupinglun",
+      "unicode": "e617",
+      "unicode_decimal": 58903
+    },
+    {
+      "icon_id": "9059906",
+      "name": "项目任务",
+      "font_class": "xiangmurenwu",
+      "unicode": "e62e",
+      "unicode_decimal": 58926
+    },
+    {
+      "icon_id": "10123711",
+      "name": "任务工时",
+      "font_class": "renwugongshi",
+      "unicode": "e6c1",
+      "unicode_decimal": 59073
+    },
+    {
+      "icon_id": "41498732",
+      "name": "项目评论",
+      "font_class": "xiangmupinglun",
+      "unicode": "e740",
+      "unicode_decimal": 59200
+    },
+    {
+      "icon_id": "12616683",
+      "name": "中止工单",
+      "font_class": "zhongzhigongdan",
+      "unicode": "e60f",
+      "unicode_decimal": 58895
+    },
+    {
+      "icon_id": "12643407",
+      "name": "中止合同",
+      "font_class": "zhongzhihetong",
+      "unicode": "e612",
+      "unicode_decimal": 58898
+    },
+    {
+      "icon_id": "15366390",
+      "name": "收款作废",
+      "font_class": "shoukuanzuofei",
+      "unicode": "e627",
+      "unicode_decimal": 58919
+    },
+    {
+      "icon_id": "31197439",
+      "name": "作废客户",
+      "font_class": "zuofeikehu",
+      "unicode": "e872",
+      "unicode_decimal": 59506
+    },
+    {
+      "icon_id": "41876259",
+      "name": "作废报名",
+      "font_class": "zuofeibaoming",
+      "unicode": "e6b7",
+      "unicode_decimal": 59063
+    },
+    {
+      "icon_id": "42431829",
+      "name": "作废合同",
+      "font_class": "zuofeihetong",
+      "unicode": "e808",
+      "unicode_decimal": 59400
+    },
+    {
+      "icon_id": "8899529",
+      "name": "归档合同",
+      "font_class": "guidanghetong",
+      "unicode": "e609",
+      "unicode_decimal": 58889
+    },
+    {
+      "icon_id": "9213874",
+      "name": "归档",
+      "font_class": "guidang",
+      "unicode": "e60d",
+      "unicode_decimal": 58893
+    },
+    {
+      "icon_id": "3567584",
+      "name": "代理人",
+      "font_class": "dailiren",
+      "unicode": "e747",
+      "unicode_decimal": 59207
+    },
+    {
+      "icon_id": "5899541",
+      "name": "跟进记录",
+      "font_class": "genjinjilu1",
+      "unicode": "e607",
+      "unicode_decimal": 58887
+    },
+    {
+      "icon_id": "7942757",
+      "name": "客户联系人",
+      "font_class": "kehulianxiren",
+      "unicode": "e650",
+      "unicode_decimal": 58960
+    },
+    {
+      "icon_id": "10979425",
+      "name": "机会线索",
+      "font_class": "jihuixiansuo",
+      "unicode": "e61b",
+      "unicode_decimal": 58907
+    },
+    {
+      "icon_id": "10981438",
+      "name": "客户设置",
+      "font_class": "kehushezhi",
+      "unicode": "e70d",
+      "unicode_decimal": 59149
+    },
+    {
+      "icon_id": "12787344",
+      "name": "抢客",
+      "font_class": "qiangke",
+      "unicode": "e613",
+      "unicode_decimal": 58899
+    },
+    {
+      "icon_id": "17760423",
+      "name": "废弃客户",
+      "font_class": "feiqikehu",
+      "unicode": "e73f",
+      "unicode_decimal": 59199
+    },
+    {
+      "icon_id": "18203617",
+      "name": "会议",
+      "font_class": "huiyi",
+      "unicode": "e6da",
+      "unicode_decimal": 59098
+    },
+    {
+      "icon_id": "21679496",
+      "name": "供应商",
+      "font_class": "gongyingshang",
+      "unicode": "e606",
+      "unicode_decimal": 58886
+    },
+    {
+      "icon_id": "33636281",
+      "name": "公海客户",
+      "font_class": "gonghaikehu",
+      "unicode": "e61d",
+      "unicode_decimal": 58909
+    },
+    {
+      "icon_id": "2797368",
+      "name": "付款",
+      "font_class": "fukuan",
+      "unicode": "e604",
+      "unicode_decimal": 58884
+    },
+    {
+      "icon_id": "10830580",
+      "name": "开票管理",
+      "font_class": "kaipiaoguanli",
+      "unicode": "e739",
+      "unicode_decimal": 59193
+    },
+    {
+      "icon_id": "11829029",
+      "name": "开票",
+      "font_class": "kaipiao",
+      "unicode": "e7c0",
+      "unicode_decimal": 59328
+    },
+    {
+      "icon_id": "24080662",
+      "name": "付款申请",
+      "font_class": "fukuanshenqing",
+      "unicode": "e6c9",
+      "unicode_decimal": 59081
+    },
+    {
+      "icon_id": "27598302",
+      "name": "报销",
+      "font_class": "a-baoxiao",
+      "unicode": "e605",
+      "unicode_decimal": 58885
+    },
+    {
+      "icon_id": "34811424",
+      "name": "回款",
+      "font_class": "huikuan",
+      "unicode": "e6ba",
+      "unicode_decimal": 59066
+    },
+    {
+      "icon_id": "36157587",
+      "name": "报销",
+      "font_class": "baoxiao1",
+      "unicode": "ebcc",
+      "unicode_decimal": 60364
+    },
+    {
+      "icon_id": "38107527",
+      "name": "收票",
+      "font_class": "shoupiao",
+      "unicode": "e6b6",
+      "unicode_decimal": 59062
+    },
+    {
+      "icon_id": "42308056",
+      "name": "报销",
+      "font_class": "a-baoxiao2",
+      "unicode": "e7ca",
+      "unicode_decimal": 59338
+    },
+    {
+      "icon_id": "42308059",
+      "name": "报销",
+      "font_class": "a-baoxiao3",
+      "unicode": "e7cb",
+      "unicode_decimal": 59339
+    },
+    {
+      "icon_id": "1017358",
+      "name": "日程",
+      "font_class": "richeng",
+      "unicode": "e60e",
+      "unicode_decimal": 58894
+    },
+    {
+      "icon_id": "9443727",
+      "name": "处理的审批",
+      "font_class": "chulishenpi",
+      "unicode": "e619",
+      "unicode_decimal": 58905
+    },
+    {
+      "icon_id": "14936436",
+      "name": "我的审批",
+      "font_class": "wodeshenpi1",
+      "unicode": "e722",
+      "unicode_decimal": 59170
+    },
+    {
+      "icon_id": "23453853",
+      "name": "汇报",
+      "font_class": "huibao",
+      "unicode": "e636",
+      "unicode_decimal": 58934
+    },
+    {
+      "icon_id": "5907238",
+      "name": "服务台",
+      "font_class": "fuwutai",
+      "unicode": "e821",
+      "unicode_decimal": 59425
+    },
+    {
+      "icon_id": "5907257",
+      "name": "服务台",
+      "font_class": "fuwutai1",
+      "unicode": "e822",
+      "unicode_decimal": 59426
+    },
+    {
+      "icon_id": "14936374",
+      "name": "抄送",
+      "font_class": "chaosong",
+      "unicode": "e71f",
+      "unicode_decimal": 59167
+    },
+    {
+      "icon_id": "23905553",
+      "name": "审批",
+      "font_class": "shenpi",
+      "unicode": "e68e",
+      "unicode_decimal": 59022
+    },
+    {
+      "icon_id": "34026716",
+      "name": "待审批",
+      "font_class": "daishenpi",
+      "unicode": "eca3",
+      "unicode_decimal": 60579
+    },
+    {
+      "icon_id": "34026745",
+      "name": "已审批",
+      "font_class": "yishenpi",
+      "unicode": "ecad",
+      "unicode_decimal": 60589
+    },
+    {
+      "icon_id": "10399648",
+      "name": "记录",
+      "font_class": "jilu",
+      "unicode": "e602",
+      "unicode_decimal": 58882
+    },
+    {
+      "icon_id": "18474503",
+      "name": "工作记录",
+      "font_class": "gongzuojilu",
+      "unicode": "e663",
+      "unicode_decimal": 58979
+    },
+    {
+      "icon_id": "1114848",
+      "name": "消息",
+      "font_class": "xiaoxi1",
+      "unicode": "e601",
+      "unicode_decimal": 58881
+    },
+    {
+      "icon_id": "5492128",
+      "name": "合同管理",
+      "font_class": "hetong2",
+      "unicode": "e611",
+      "unicode_decimal": 58897
+    },
+    {
+      "icon_id": "8610692",
+      "name": "工作台",
+      "font_class": "gongzuotai1",
+      "unicode": "e7be",
+      "unicode_decimal": 59326
+    },
+    {
+      "icon_id": "10595390",
+      "name": "项目",
+      "font_class": "xiangmu1",
+      "unicode": "e661",
+      "unicode_decimal": 58977
+    },
+    {
+      "icon_id": "17832790",
+      "name": "客户",
+      "font_class": "kehu",
+      "unicode": "e60c",
+      "unicode_decimal": 58892
+    },
+    {
+      "icon_id": "20733759",
+      "name": "新增",
+      "font_class": "addnew",
+      "unicode": "e615",
+      "unicode_decimal": 58901
+    },
+    {
+      "icon_id": "8574211",
+      "name": "成绩",
+      "font_class": "chengji",
+      "unicode": "e6ec",
+      "unicode_decimal": 59116
+    },
+    {
+      "icon_id": "8574212",
+      "name": "阅读",
+      "font_class": "yuedu",
+      "unicode": "e6ed",
+      "unicode_decimal": 59117
+    },
+    {
+      "icon_id": "8574213",
+      "name": "考核",
+      "font_class": "kaohe",
+      "unicode": "e6ee",
+      "unicode_decimal": 59118
+    },
+    {
+      "icon_id": "8574233",
+      "name": "文档",
+      "font_class": "lunwenguanli",
+      "unicode": "e6ef",
+      "unicode_decimal": 59119
+    },
+    {
+      "icon_id": "8574234",
+      "name": "申报",
+      "font_class": "shenbao",
+      "unicode": "e6f0",
+      "unicode_decimal": 59120
+    },
+    {
+      "icon_id": "8574236",
+      "name": "课程",
+      "font_class": "kecheng",
+      "unicode": "e6f1",
+      "unicode_decimal": 59121
+    },
+    {
+      "icon_id": "8574237",
+      "name": "题库",
+      "font_class": "tiku",
+      "unicode": "e6f2",
+      "unicode_decimal": 59122
+    },
+    {
+      "icon_id": "8574241",
+      "name": "讲师设置",
+      "font_class": "jiangshishezhi",
+      "unicode": "e6f3",
+      "unicode_decimal": 59123
+    },
+    {
+      "icon_id": "8574242",
+      "name": "新增",
+      "font_class": "xinzeng",
+      "unicode": "e6f4",
+      "unicode_decimal": 59124
+    },
+    {
+      "icon_id": "8710313",
+      "name": "超级统计",
+      "font_class": "chaojitongji",
+      "unicode": "e6f5",
+      "unicode_decimal": 59125
+    },
+    {
+      "icon_id": "8710316",
+      "name": "员工统计",
+      "font_class": "yuanogtongji",
+      "unicode": "e6f6",
+      "unicode_decimal": 59126
+    },
+    {
+      "icon_id": "8710320",
+      "name": "推广统计",
+      "font_class": "tuiguangtongji",
+      "unicode": "e6f7",
+      "unicode_decimal": 59127
+    },
+    {
+      "icon_id": "8710324",
+      "name": "员工统计2",
+      "font_class": "yuangongtongji2",
+      "unicode": "e6f8",
+      "unicode_decimal": 59128
+    },
+    {
+      "icon_id": "8710326",
+      "name": "数据统计",
+      "font_class": "shujutongji",
+      "unicode": "e6f9",
+      "unicode_decimal": 59129
+    },
+    {
+      "icon_id": "8710329",
+      "name": "数据导入",
+      "font_class": "shujudaoru",
+      "unicode": "e6fa",
+      "unicode_decimal": 59130
+    },
+    {
+      "icon_id": "8710363",
+      "name": "绩效",
+      "font_class": "jixiao",
+      "unicode": "e6fb",
+      "unicode_decimal": 59131
+    },
+    {
+      "icon_id": "8710444",
+      "name": "远程",
+      "font_class": "yuancheng",
+      "unicode": "e6fe",
+      "unicode_decimal": 59134
+    },
+    {
+      "icon_id": "8710455",
+      "name": "书籍",
+      "font_class": "shuji",
+      "unicode": "e6ff",
+      "unicode_decimal": 59135
+    },
+    {
+      "icon_id": "8710489",
+      "name": "知识库",
+      "font_class": "zhishiku",
+      "unicode": "e700",
+      "unicode_decimal": 59136
+    },
+    {
+      "icon_id": "8710519",
+      "name": "评分",
+      "font_class": "pingfen",
+      "unicode": "e701",
+      "unicode_decimal": 59137
+    },
+    {
+      "icon_id": "8710528",
+      "name": "订单",
+      "font_class": "dingdan",
+      "unicode": "e702",
+      "unicode_decimal": 59138
+    },
+    {
+      "icon_id": "8710536",
+      "name": "问题反馈",
+      "font_class": "wentifankui",
+      "unicode": "e703",
+      "unicode_decimal": 59139
+    },
+    {
+      "icon_id": "8710538",
+      "name": "资产",
+      "font_class": "zichan",
+      "unicode": "e704",
+      "unicode_decimal": 59140
+    },
+    {
+      "icon_id": "8710540",
+      "name": "KPI管理",
+      "font_class": "kai",
+      "unicode": "e705",
+      "unicode_decimal": 59141
+    },
+    {
+      "icon_id": "8710547",
+      "name": "项目",
+      "font_class": "xiangmuguanli",
+      "unicode": "e706",
+      "unicode_decimal": 59142
+    },
+    {
+      "icon_id": "8710560",
+      "name": "微信公众号",
+      "font_class": "gongzhonghao",
+      "unicode": "e707",
+      "unicode_decimal": 59143
+    },
+    {
+      "icon_id": "8710565",
+      "name": "安全设置",
+      "font_class": "anquanshezhi",
+      "unicode": "e708",
+      "unicode_decimal": 59144
+    },
+    {
+      "icon_id": "8710642",
+      "name": "服务中心",
+      "font_class": "fuwuzhongxin",
+      "unicode": "e709",
+      "unicode_decimal": 59145
+    },
+    {
+      "icon_id": "8710650",
+      "name": "企业服务",
+      "font_class": "qiyefuwu",
+      "unicode": "e70e",
+      "unicode_decimal": 59150
+    },
+    {
+      "icon_id": "8710673",
+      "name": "网课",
+      "font_class": "wangke",
+      "unicode": "e710",
+      "unicode_decimal": 59152
+    },
+    {
+      "icon_id": "8710677",
+      "name": "收费",
+      "font_class": "shoufei",
+      "unicode": "e715",
+      "unicode_decimal": 59157
+    },
+    {
+      "icon_id": "8710679",
+      "name": "权限设置",
+      "font_class": "quanxianshezhi",
+      "unicode": "e716",
+      "unicode_decimal": 59158
+    },
+    {
+      "icon_id": "8827474",
+      "name": "统计日历",
+      "font_class": "tongjirili",
+      "unicode": "e717",
+      "unicode_decimal": 59159
+    },
+    {
+      "icon_id": "8827479",
+      "name": "收费统计",
+      "font_class": "shoufeitongji",
+      "unicode": "e718",
+      "unicode_decimal": 59160
+    },
+    {
+      "icon_id": "8827489",
+      "name": "饼图统计",
+      "font_class": "bingtutongji",
+      "unicode": "e719",
+      "unicode_decimal": 59161
+    },
+    {
+      "icon_id": "8827490",
+      "name": "柱状统计",
+      "font_class": "zhuzhuangtongji",
+      "unicode": "e71a",
+      "unicode_decimal": 59162
+    },
+    {
+      "icon_id": "8827501",
+      "name": "有序列表",
+      "font_class": "youxuliebiao",
+      "unicode": "e71b",
+      "unicode_decimal": 59163
+    },
+    {
+      "icon_id": "8827503",
+      "name": "活跃度",
+      "font_class": "huoyuedu",
+      "unicode": "e71c",
+      "unicode_decimal": 59164
+    },
+    {
+      "icon_id": "8827511",
+      "name": "报名",
+      "font_class": "baoming",
+      "unicode": "e71d",
+      "unicode_decimal": 59165
+    },
+    {
+      "icon_id": "8827513",
+      "name": "录用",
+      "font_class": "luyong",
+      "unicode": "e720",
+      "unicode_decimal": 59168
+    },
+    {
+      "icon_id": "8827518",
+      "name": "注册",
+      "font_class": "zhuce",
+      "unicode": "e721",
+      "unicode_decimal": 59169
+    },
+    {
+      "icon_id": "8827519",
+      "name": "员工",
+      "font_class": "yuangong",
+      "unicode": "e723",
+      "unicode_decimal": 59171
+    },
+    {
+      "icon_id": "8827523",
+      "name": "花名册",
+      "font_class": "huamingce",
+      "unicode": "e724",
+      "unicode_decimal": 59172
+    },
+    {
+      "icon_id": "8827524",
+      "name": "分类管理",
+      "font_class": "fenleiguanli",
+      "unicode": "e725",
+      "unicode_decimal": 59173
+    },
+    {
+      "icon_id": "8827680",
+      "name": "档案",
+      "font_class": "dangan",
+      "unicode": "e726",
+      "unicode_decimal": 59174
+    },
+    {
+      "icon_id": "8827692",
+      "name": "文件分类",
+      "font_class": "fenlei",
+      "unicode": "e727",
+      "unicode_decimal": 59175
+    },
+    {
+      "icon_id": "8827697",
+      "name": "通知",
+      "font_class": "tongzhi",
+      "unicode": "e728",
+      "unicode_decimal": 59176
+    },
+    {
+      "icon_id": "8827700",
+      "name": "计划",
+      "font_class": "jihua",
+      "unicode": "e729",
+      "unicode_decimal": 59177
+    },
+    {
+      "icon_id": "8827702",
+      "name": "完成事项",
+      "font_class": "wancheng",
+      "unicode": "e72c",
+      "unicode_decimal": 59180
+    },
+    {
+      "icon_id": "8827704",
+      "name": "成绩管理",
+      "font_class": "xueshengchengji",
+      "unicode": "e72d",
+      "unicode_decimal": 59181
+    },
+    {
+      "icon_id": "8827714",
+      "name": "图片管理",
+      "font_class": "tupianguanli",
+      "unicode": "e72e",
+      "unicode_decimal": 59182
+    },
+    {
+      "icon_id": "8827722",
+      "name": "日程管理",
+      "font_class": "richengguanli",
+      "unicode": "e72f",
+      "unicode_decimal": 59183
+    },
+    {
+      "icon_id": "8827726",
+      "name": "编辑",
+      "font_class": "bianji",
+      "unicode": "e730",
+      "unicode_decimal": 59184
+    },
+    {
+      "icon_id": "8827732",
+      "name": "内容管理",
+      "font_class": "neirongguanli",
+      "unicode": "e731",
+      "unicode_decimal": 59185
+    },
+    {
+      "icon_id": "8827763",
+      "name": "考核管理",
+      "font_class": "kaoheguanli",
+      "unicode": "e732",
+      "unicode_decimal": 59186
+    },
+    {
+      "icon_id": "8827768",
+      "name": "客户",
+      "font_class": "jiaoshiguanli",
+      "unicode": "e734",
+      "unicode_decimal": 59188
+    },
+    {
+      "icon_id": "8827784",
+      "name": "网课管理",
+      "font_class": "wangkeguanli",
+      "unicode": "e735",
+      "unicode_decimal": 59189
+    },
+    {
+      "icon_id": "8827789",
+      "name": "补录结算",
+      "font_class": "bulujiesuan",
+      "unicode": "e736",
+      "unicode_decimal": 59190
+    },
+    {
+      "icon_id": "8827791",
+      "name": "名片",
+      "font_class": "mingpian",
+      "unicode": "e737",
+      "unicode_decimal": 59191
+    },
+    {
+      "icon_id": "8827794",
+      "name": "考核指标",
+      "font_class": "kaohezhibiao",
+      "unicode": "e738",
+      "unicode_decimal": 59192
+    },
+    {
+      "icon_id": "15562222",
+      "name": "企业管理",
+      "font_class": "qiyeguanli",
+      "unicode": "e77e",
+      "unicode_decimal": 59262
+    },
+    {
+      "icon_id": "15562223",
+      "name": "初步管理",
+      "font_class": "chubuguanli",
+      "unicode": "e77f",
+      "unicode_decimal": 59263
+    },
+    {
+      "icon_id": "15562225",
+      "name": "扫描电镜",
+      "font_class": "saomiaodianjing",
+      "unicode": "e781",
+      "unicode_decimal": 59265
+    },
+    {
+      "icon_id": "15562226",
+      "name": "结账",
+      "font_class": "jiezhang",
+      "unicode": "e782",
+      "unicode_decimal": 59266
+    },
+    {
+      "icon_id": "15562227",
+      "name": "销售报表",
+      "font_class": "xiaoshoubaobiao",
+      "unicode": "e783",
+      "unicode_decimal": 59267
+    },
+    {
+      "icon_id": "15562228",
+      "name": "凭证",
+      "font_class": "pingzheng",
+      "unicode": "e784",
+      "unicode_decimal": 59268
+    },
+    {
+      "icon_id": "15562229",
+      "name": "合同",
+      "font_class": "hetong",
+      "unicode": "e785",
+      "unicode_decimal": 59269
+    },
+    {
+      "icon_id": "15562231",
+      "name": "销售品",
+      "font_class": "xiaoshoupin",
+      "unicode": "e787",
+      "unicode_decimal": 59271
+    },
+    {
+      "icon_id": "15562232",
+      "name": "工作台",
+      "font_class": "xueshuguanli",
+      "unicode": "e788",
+      "unicode_decimal": 59272
+    },
+    {
+      "icon_id": "15562234",
+      "name": "任务管理",
+      "font_class": "renwuguanli",
+      "unicode": "e78a",
+      "unicode_decimal": 59274
+    },
+    {
+      "icon_id": "15562235",
+      "name": "电商",
+      "font_class": "dianshang",
+      "unicode": "e78b",
+      "unicode_decimal": 59275
+    },
+    {
+      "icon_id": "15562237",
+      "name": "固定资产",
+      "font_class": "gudingzichan",
+      "unicode": "e78d",
+      "unicode_decimal": 59277
+    },
+    {
+      "icon_id": "15562238",
+      "name": "动态",
+      "font_class": "dongtai",
+      "unicode": "e78e",
+      "unicode_decimal": 59278
+    },
+    {
+      "icon_id": "15562239",
+      "name": "基础配置",
+      "font_class": "jichupeizhi",
+      "unicode": "e78f",
+      "unicode_decimal": 59279
+    },
+    {
+      "icon_id": "15562242",
+      "name": "大数据",
+      "font_class": "dashuju",
+      "unicode": "e792",
+      "unicode_decimal": 59282
+    },
+    {
+      "icon_id": "15562244",
+      "name": "呼叫设置",
+      "font_class": "hujiaoshezhi",
+      "unicode": "e794",
+      "unicode_decimal": 59284
+    },
+    {
+      "icon_id": "15562245",
+      "name": "分销",
+      "font_class": "fenxiao",
+      "unicode": "e795",
+      "unicode_decimal": 59285
+    },
+    {
+      "icon_id": "15562246",
+      "name": "成绩统计",
+      "font_class": "chengjitongji",
+      "unicode": "e796",
+      "unicode_decimal": 59286
+    },
+    {
+      "icon_id": "15562247",
+      "name": "推广设置",
+      "font_class": "tuiguangshezhi",
+      "unicode": "e797",
+      "unicode_decimal": 59287
+    },
+    {
+      "icon_id": "15562248",
+      "name": "课程中心",
+      "font_class": "banjiguanli",
+      "unicode": "e798",
+      "unicode_decimal": 59288
+    },
+    {
+      "icon_id": "15562249",
+      "name": "合同设置",
+      "font_class": "hetongyidong",
+      "unicode": "e799",
+      "unicode_decimal": 59289
+    },
+    {
+      "icon_id": "15562250",
+      "name": "课程包",
+      "font_class": "kechengbao",
+      "unicode": "e79a",
+      "unicode_decimal": 59290
+    },
+    {
+      "icon_id": "15562251",
+      "name": "用户管理",
+      "font_class": "yonghuguanli",
+      "unicode": "e79b",
+      "unicode_decimal": 59291
+    },
+    {
+      "icon_id": "15562252",
+      "name": "用户画像",
+      "font_class": "yonghuhuaxiang",
+      "unicode": "e79c",
+      "unicode_decimal": 59292
+    },
+    {
+      "icon_id": "15562253",
+      "name": "帐号管理",
+      "font_class": "zhanghaoguanli",
+      "unicode": "e79d",
+      "unicode_decimal": 59293
+    },
+    {
+      "icon_id": "15562255",
+      "name": "预算",
+      "font_class": "yusuan",
+      "unicode": "e79f",
+      "unicode_decimal": 59295
+    },
+    {
+      "icon_id": "15562256",
+      "name": "名片报表",
+      "font_class": "mingpianbaobiao",
+      "unicode": "e7a0",
+      "unicode_decimal": 59296
+    },
+    {
+      "icon_id": "15562257",
+      "name": "订单管理",
+      "font_class": "dingdanguanli",
+      "unicode": "e7a1",
+      "unicode_decimal": 59297
+    },
+    {
+      "icon_id": "15562258",
+      "name": "推广管理",
+      "font_class": "tuiguangguanli",
+      "unicode": "e7a2",
+      "unicode_decimal": 59298
+    },
+    {
+      "icon_id": "15562259",
+      "name": "专题管理",
+      "font_class": "zhuantiguanli",
+      "unicode": "e7a3",
+      "unicode_decimal": 59299
+    },
+    {
+      "icon_id": "15562261",
+      "name": "销售设置",
+      "font_class": "xiaoshoushezhi",
+      "unicode": "e7a5",
+      "unicode_decimal": 59301
+    },
+    {
+      "icon_id": "18486333",
+      "name": "素材管理",
+      "font_class": "sucaiguanli",
+      "unicode": "e7a9",
+      "unicode_decimal": 59305
+    },
+    {
+      "icon_id": "18486347",
+      "name": "员工导入",
+      "font_class": "yuangongdaoru",
+      "unicode": "e7aa",
+      "unicode_decimal": 59306
+    },
+    {
+      "icon_id": "18486348",
+      "name": "商品管理",
+      "font_class": "shangpinguanli",
+      "unicode": "e7ab",
+      "unicode_decimal": 59307
+    },
+    {
+      "icon_id": "18486365",
+      "name": "排课管理",
+      "font_class": "paikeguanli",
+      "unicode": "e7ac",
+      "unicode_decimal": 59308
+    },
+    {
+      "icon_id": "18486366",
+      "name": "信息导入",
+      "font_class": "xinxidaoru",
+      "unicode": "e7ad",
+      "unicode_decimal": 59309
+    },
+    {
+      "icon_id": "18486367",
+      "name": "收费配置",
+      "font_class": "shoufeipeizhi",
+      "unicode": "e7ae",
+      "unicode_decimal": 59310
+    },
+    {
+      "icon_id": "18486368",
+      "name": "用户权限",
+      "font_class": "yonghuquanxian",
+      "unicode": "e7af",
+      "unicode_decimal": 59311
+    },
+    {
+      "icon_id": "18486369",
+      "name": "员工管理",
+      "font_class": "yuangongguanli",
+      "unicode": "e7b0",
+      "unicode_decimal": 59312
+    },
+    {
+      "icon_id": "18486370",
+      "name": "工号",
+      "font_class": "gonghao",
+      "unicode": "e7b1",
+      "unicode_decimal": 59313
+    },
+    {
+      "icon_id": "18486371",
+      "name": "资料归档",
+      "font_class": "ziliaoguidang",
+      "unicode": "e7b2",
+      "unicode_decimal": 59314
+    },
+    {
+      "icon_id": "18486372",
+      "name": "面授教学",
+      "font_class": "jiaoxue",
+      "unicode": "e7b4",
+      "unicode_decimal": 59316
+    },
+    {
+      "icon_id": "18486373",
+      "name": "账房",
+      "font_class": "zhangfang",
+      "unicode": "e7b5",
+      "unicode_decimal": 59317
+    },
+    {
+      "icon_id": "18486374",
+      "name": "资料设置",
+      "font_class": "ziliaoshezhi",
+      "unicode": "e7b6",
+      "unicode_decimal": 59318
+    },
+    {
+      "icon_id": "18486375",
+      "name": "绩效统计",
+      "font_class": "jixiaotongji",
+      "unicode": "e7b7",
+      "unicode_decimal": 59319
+    },
+    {
+      "icon_id": "18486377",
+      "name": "招聘",
+      "font_class": "zhaopin",
+      "unicode": "e7b8",
+      "unicode_decimal": 59320
+    },
+    {
+      "icon_id": "18486380",
+      "name": "员工资料",
+      "font_class": "kaoshijihua",
+      "unicode": "e7ba",
+      "unicode_decimal": 59322
+    },
+    {
+      "icon_id": "18486382",
+      "name": "精品课堂",
+      "font_class": "jingpinketang",
+      "unicode": "e7bb",
+      "unicode_decimal": 59323
+    },
+    {
+      "icon_id": "18486383",
+      "name": "员工提成",
+      "font_class": "yuangongtidian",
+      "unicode": "e7bc",
+      "unicode_decimal": 59324
+    },
+    {
+      "icon_id": "18486384",
+      "name": "考试",
+      "font_class": "kaoshi",
+      "unicode": "e7bd",
+      "unicode_decimal": 59325
+    },
+    {
+      "icon_id": "18486551",
+      "name": "教学安排",
+      "font_class": "jiaoxueanpai",
+      "unicode": "e7bf",
+      "unicode_decimal": 59327
+    },
+    {
+      "icon_id": "18493065",
+      "name": "面授教学",
+      "font_class": "mianshoujiaoxue",
+      "unicode": "e7c6",
+      "unicode_decimal": 59334
+    },
+    {
+      "icon_id": "18493071",
+      "name": "学堂管理",
+      "font_class": "xuetangguanli",
+      "unicode": "e7c7",
+      "unicode_decimal": 59335
+    },
+    {
+      "icon_id": "18493075",
+      "name": "成绩列表",
+      "font_class": "chengjiliebiao",
+      "unicode": "e7c9",
+      "unicode_decimal": 59337
+    },
+    {
+      "icon_id": "18493083",
+      "name": "课件",
+      "font_class": "kejian",
+      "unicode": "e7cc",
+      "unicode_decimal": 59340
+    },
+    {
+      "icon_id": "18493085",
+      "name": "外部课件",
+      "font_class": "waibukejian",
+      "unicode": "e7cd",
+      "unicode_decimal": 59341
+    },
+    {
+      "icon_id": "18493087",
+      "name": "日志管理",
+      "font_class": "rizhiguanli",
+      "unicode": "e7ce",
+      "unicode_decimal": 59342
+    },
+    {
+      "icon_id": "18493091",
+      "name": "模版管理",
+      "font_class": "mobanguanli",
+      "unicode": "e7cf",
+      "unicode_decimal": 59343
+    },
+    {
+      "icon_id": "18493306",
+      "name": "异议处理",
+      "font_class": "yiyichuli",
+      "unicode": "e7d2",
+      "unicode_decimal": 59346
+    },
+    {
+      "icon_id": "18493315",
+      "name": "公文申报",
+      "font_class": "gongwenshenbao",
+      "unicode": "e7d3",
+      "unicode_decimal": 59347
+    },
+    {
+      "icon_id": "18493322",
+      "name": "公文",
+      "font_class": "gongwen",
+      "unicode": "e7d4",
+      "unicode_decimal": 59348
+    },
+    {
+      "icon_id": "18493393",
+      "name": "公文编辑",
+      "font_class": "gongwenbianji",
+      "unicode": "e7d5",
+      "unicode_decimal": 59349
+    },
+    {
+      "icon_id": "18493447",
+      "name": "公文新增",
+      "font_class": "gongwenxinzeng",
+      "unicode": "e7d6",
+      "unicode_decimal": 59350
+    },
+    {
+      "icon_id": "18493458",
+      "name": "模块设置",
+      "font_class": "mokuaishezhi",
+      "unicode": "e7d7",
+      "unicode_decimal": 59351
+    },
+    {
+      "icon_id": "18493462",
+      "name": "资料管理",
+      "font_class": "ziliaoguanli",
+      "unicode": "e7d8",
+      "unicode_decimal": 59352
+    },
+    {
+      "icon_id": "18493465",
+      "name": "应用管理",
+      "font_class": "yingyongguanli1",
+      "unicode": "e7da",
+      "unicode_decimal": 59354
+    },
+    {
+      "icon_id": "18493468",
+      "name": "问卷",
+      "font_class": "wenjuan",
+      "unicode": "e7db",
+      "unicode_decimal": 59355
+    },
+    {
+      "icon_id": "18493471",
+      "name": "我的课程",
+      "font_class": "wodekecheng",
+      "unicode": "e7dc",
+      "unicode_decimal": 59356
+    },
+    {
+      "icon_id": "18493474",
+      "name": "代码管理",
+      "font_class": "daimaguanli",
+      "unicode": "e7dd",
+      "unicode_decimal": 59357
+    },
+    {
+      "icon_id": "18493480",
+      "name": "员工绩效",
+      "font_class": "yuangongjixiao",
+      "unicode": "e7df",
+      "unicode_decimal": 59359
+    },
+    {
+      "icon_id": "18494025",
+      "name": "服务管理",
+      "font_class": "fuwuguanli",
+      "unicode": "e7e2",
+      "unicode_decimal": 59362
+    },
+    {
+      "icon_id": "18494031",
+      "name": "引进收费",
+      "font_class": "yinjinshoufei",
+      "unicode": "e7e5",
+      "unicode_decimal": 59365
+    },
+    {
+      "icon_id": "18494033",
+      "name": "应缴清单",
+      "font_class": "yingjiaoqingdan",
+      "unicode": "e7e6",
+      "unicode_decimal": 59366
+    },
+    {
+      "icon_id": "18494034",
+      "name": "对账单",
+      "font_class": "duizhangdan",
+      "unicode": "e7e7",
+      "unicode_decimal": 59367
+    },
+    {
+      "icon_id": "18494036",
+      "name": "商机管理",
+      "font_class": "shangjiguanli",
+      "unicode": "e7e8",
+      "unicode_decimal": 59368
+    },
+    {
+      "icon_id": "18494048",
+      "name": "用户设置",
+      "font_class": "yonghushezhi",
+      "unicode": "e7ea",
+      "unicode_decimal": 59370
+    },
+    {
+      "icon_id": "18494050",
+      "name": "消息设置",
+      "font_class": "xiaoxishezhi",
+      "unicode": "e7ec",
+      "unicode_decimal": 59372
+    },
+    {
+      "icon_id": "18494051",
+      "name": "营销设置",
+      "font_class": "yingxiaoshezhi",
+      "unicode": "e7ed",
+      "unicode_decimal": 59373
+    },
+    {
+      "icon_id": "18494056",
+      "name": "服务市场",
+      "font_class": "fuwushichang",
+      "unicode": "e7ee",
+      "unicode_decimal": 59374
+    },
+    {
+      "icon_id": "18494060",
+      "name": "素材资源",
+      "font_class": "sucaiziyuan",
+      "unicode": "e7ef",
+      "unicode_decimal": 59375
+    },
+    {
+      "icon_id": "18494089",
+      "name": "营销统计",
+      "font_class": "yingxiaotongji",
+      "unicode": "e7f0",
+      "unicode_decimal": 59376
+    },
+    {
+      "icon_id": "18494111",
+      "name": "推广",
+      "font_class": "tuiguang",
+      "unicode": "e7f1",
+      "unicode_decimal": 59377
+    },
+    {
+      "icon_id": "18494112",
+      "name": "用户列表",
+      "font_class": "yonghuliebiao",
+      "unicode": "e7f2",
+      "unicode_decimal": 59378
+    },
+    {
+      "icon_id": "9922129",
+      "name": "查看详情",
+      "font_class": "chakanxiangqing",
+      "unicode": "e603",
+      "unicode_decimal": 58883
+    },
+    {
+      "icon_id": "7007278",
+      "name": "插入链接",
+      "font_class": "lianjie",
+      "unicode": "e67b",
+      "unicode_decimal": 59003
+    },
+    {
+      "icon_id": "15014204",
+      "name": "权限",
+      "font_class": "quanxian",
+      "unicode": "e610",
+      "unicode_decimal": 58896
+    },
+    {
+      "icon_id": "26954351",
+      "name": "错误",
+      "font_class": "cuowu",
+      "unicode": "e642",
+      "unicode_decimal": 58946
+    },
+    {
+      "icon_id": "26672775",
+      "name": "锁定",
+      "font_class": "suozhu",
+      "unicode": "e65f",
+      "unicode_decimal": 58975
+    },
+    {
+      "icon_id": "26672776",
+      "name": "解锁",
+      "font_class": "jiesuo",
+      "unicode": "e660",
+      "unicode_decimal": 58976
+    },
+    {
+      "icon_id": "1110447",
+      "name": "微信",
+      "font_class": "weixin",
+      "unicode": "e62b",
+      "unicode_decimal": 58923
+    },
+    {
+      "icon_id": "11349237",
+      "name": "QQ",
+      "font_class": "qq",
+      "unicode": "e651",
+      "unicode_decimal": 58961
+    },
+    {
+      "icon_id": "1504340",
+      "name": "上传",
+      "font_class": "shangchuan",
+      "unicode": "e658",
+      "unicode_decimal": 58968
+    },
+    {
+      "icon_id": "1504355",
+      "name": "下载",
+      "font_class": "xiazai",
+      "unicode": "e659",
+      "unicode_decimal": 58969
+    },
+    {
+      "icon_id": "11833364",
+      "name": "导出",
+      "font_class": "daochu",
+      "unicode": "e60a",
+      "unicode_decimal": 58890
+    },
+    {
+      "icon_id": "11833498",
+      "name": "导入",
+      "font_class": "daoru",
+      "unicode": "e60b",
+      "unicode_decimal": 58891
+    },
+    {
+      "icon_id": "12557244",
+      "name": "考试模式",
+      "font_class": "working",
+      "unicode": "e639",
+      "unicode_decimal": 58937
+    },
+    {
+      "icon_id": "10157356",
+      "name": "更多",
+      "font_class": "gengduo1",
+      "unicode": "e638",
+      "unicode_decimal": 58936
+    },
+    {
+      "icon_id": "24056343",
+      "name": "更多",
+      "font_class": "gengduo2",
+      "unicode": "e626",
+      "unicode_decimal": 58918
+    },
+    {
+      "icon_id": "31461117",
+      "name": "更多",
+      "font_class": "gengduo3",
+      "unicode": "e608",
+      "unicode_decimal": 58888
+    },
+    {
+      "icon_id": "11372666",
+      "name": "分享",
+      "font_class": "fenxiang",
+      "unicode": "e8b0",
+      "unicode_decimal": 59568
+    },
+    {
+      "icon_id": "12752070",
+      "name": "删除",
+      "font_class": "shanchu",
+      "unicode": "e616",
+      "unicode_decimal": 58902
+    },
+    {
+      "icon_id": "8387574",
+      "name": "资源管理",
+      "font_class": "ziyuanguanli",
+      "unicode": "e692",
+      "unicode_decimal": 59026
+    },
+    {
+      "icon_id": "8387603",
+      "name": "合同设置",
+      "font_class": "hetongshezhi",
+      "unicode": "e693",
+      "unicode_decimal": 59027
+    },
+    {
+      "icon_id": "8387606",
+      "name": "文件盒",
+      "font_class": "wenjianhe",
+      "unicode": "e694",
+      "unicode_decimal": 59028
+    },
+    {
+      "icon_id": "8387646",
+      "name": "题库管理",
+      "font_class": "tikuguanli",
+      "unicode": "e695",
+      "unicode_decimal": 59029
+    },
+    {
+      "icon_id": "8387654",
+      "name": "网课市场",
+      "font_class": "wangkeshichang",
+      "unicode": "e696",
+      "unicode_decimal": 59030
+    },
+    {
+      "icon_id": "8387659",
+      "name": "工单",
+      "font_class": "gongdan1",
+      "unicode": "e698",
+      "unicode_decimal": 59032
+    },
+    {
+      "icon_id": "8387662",
+      "name": "访客",
+      "font_class": "fangke",
+      "unicode": "e699",
+      "unicode_decimal": 59033
+    },
+    {
+      "icon_id": "8387718",
+      "name": "线索管理",
+      "font_class": "xiansuoguanli",
+      "unicode": "e69a",
+      "unicode_decimal": 59034
+    },
+    {
+      "icon_id": "8387737",
+      "name": "客户管理",
+      "font_class": "kehuguanli",
+      "unicode": "e69b",
+      "unicode_decimal": 59035
+    },
+    {
+      "icon_id": "8387740",
+      "name": "集团客户",
+      "font_class": "jituankehu",
+      "unicode": "e69c",
+      "unicode_decimal": 59036
+    },
+    {
+      "icon_id": "8387742",
+      "name": "跟进记录",
+      "font_class": "genjinjilu",
+      "unicode": "e69d",
+      "unicode_decimal": 59037
+    },
+    {
+      "icon_id": "8387803",
+      "name": "工作台",
+      "font_class": "gongzuotai",
+      "unicode": "e69e",
+      "unicode_decimal": 59038
+    },
+    {
+      "icon_id": "8387806",
+      "name": "数据报表",
+      "font_class": "shujubaobiao",
+      "unicode": "e69f",
+      "unicode_decimal": 59039
+    },
+    {
+      "icon_id": "8387807",
+      "name": "访客报表",
+      "font_class": "fangkebaobiao",
+      "unicode": "e6a0",
+      "unicode_decimal": 59040
+    },
+    {
+      "icon_id": "8387808",
+      "name": "账簿管理",
+      "font_class": "zhangbuguanli",
+      "unicode": "e6a1",
+      "unicode_decimal": 59041
+    },
+    {
+      "icon_id": "8387809",
+      "name": "账簿",
+      "font_class": "zhangbu",
+      "unicode": "e6a2",
+      "unicode_decimal": 59042
+    },
+    {
+      "icon_id": "8387811",
+      "name": "账簿中心",
+      "font_class": "zhangbuzhongxin",
+      "unicode": "e6a3",
+      "unicode_decimal": 59043
+    },
+    {
+      "icon_id": "8387812",
+      "name": "合同管理",
+      "font_class": "hetongguanli",
+      "unicode": "e6a4",
+      "unicode_decimal": 59044
+    },
+    {
+      "icon_id": "8387816",
+      "name": "运营者",
+      "font_class": "yunyingzhe",
+      "unicode": "e6a5",
+      "unicode_decimal": 59045
+    },
+    {
+      "icon_id": "8387819",
+      "name": "招聘管理",
+      "font_class": "zhaopinguanli",
+      "unicode": "e6a6",
+      "unicode_decimal": 59046
+    },
+    {
+      "icon_id": "8387821",
+      "name": "工资管理",
+      "font_class": "gongziguanli",
+      "unicode": "e6a7",
+      "unicode_decimal": 59047
+    },
+    {
+      "icon_id": "8387824",
+      "name": "我的审批",
+      "font_class": "wodeshenpi",
+      "unicode": "e6a8",
+      "unicode_decimal": 59048
+    },
+    {
+      "icon_id": "8387827",
+      "name": "模版设置",
+      "font_class": "mobanshezhi",
+      "unicode": "e6a9",
+      "unicode_decimal": 59049
+    },
+    {
+      "icon_id": "8387829",
+      "name": "基础设置",
+      "font_class": "jichushezhi",
+      "unicode": "e6aa",
+      "unicode_decimal": 59050
+    },
+    {
+      "icon_id": "8387835",
+      "name": "财务设置",
+      "font_class": "caiwushezhi",
+      "unicode": "e6ab",
+      "unicode_decimal": 59051
+    },
+    {
+      "icon_id": "8387838",
+      "name": "产品设置",
+      "font_class": "chanpinshezhi",
+      "unicode": "e6ac",
+      "unicode_decimal": 59052
+    },
+    {
+      "icon_id": "8387841",
+      "name": "审批设置",
+      "font_class": "shenpishezhi",
+      "unicode": "e6ad",
+      "unicode_decimal": 59053
+    },
+    {
+      "icon_id": "8387842",
+      "name": "目标管理",
+      "font_class": "mubiaoguanli",
+      "unicode": "e6ae",
+      "unicode_decimal": 59054
+    },
+    {
+      "icon_id": "8387843",
+      "name": "站点设置",
+      "font_class": "zhandianshezhi",
+      "unicode": "e6af",
+      "unicode_decimal": 59055
+    },
+    {
+      "icon_id": "8387856",
+      "name": "人事设置",
+      "font_class": "renshishezhi",
+      "unicode": "e6b1",
+      "unicode_decimal": 59057
+    },
+    {
+      "icon_id": "8387868",
+      "name": "名片设置",
+      "font_class": "mingpianshezhi",
+      "unicode": "e6b2",
+      "unicode_decimal": 59058
+    },
+    {
+      "icon_id": "8387869",
+      "name": "课程设置",
+      "font_class": "kechengshezhi",
+      "unicode": "e6b3",
+      "unicode_decimal": 59059
+    },
+    {
+      "icon_id": "8471135",
+      "name": "我的点评",
+      "font_class": "wodedianping",
+      "unicode": "e6b4",
+      "unicode_decimal": 59060
+    },
+    {
+      "icon_id": "8471145",
+      "name": "标星员工",
+      "font_class": "biaoxingyuangong",
+      "unicode": "e6b5",
+      "unicode_decimal": 59061
+    },
+    {
+      "icon_id": "8471169",
+      "name": "联系记录",
+      "font_class": "lianxijilu",
+      "unicode": "e6b8",
+      "unicode_decimal": 59064
+    },
+    {
+      "icon_id": "8471181",
+      "name": "投诉提问",
+      "font_class": "tousutiwen",
+      "unicode": "e6b9",
+      "unicode_decimal": 59065
+    },
+    {
+      "icon_id": "8471193",
+      "name": "费用查询",
+      "font_class": "feiyongchaxun",
+      "unicode": "e6bb",
+      "unicode_decimal": 59067
+    },
+    {
+      "icon_id": "8471198",
+      "name": "缴费",
+      "font_class": "jiaofei",
+      "unicode": "e6bc",
+      "unicode_decimal": 59068
+    },
+    {
+      "icon_id": "8471207",
+      "name": "记账",
+      "font_class": "jizhang",
+      "unicode": "e6bd",
+      "unicode_decimal": 59069
+    },
+    {
+      "icon_id": "8471221",
+      "name": "查账",
+      "font_class": "chaxun1",
+      "unicode": "e6be",
+      "unicode_decimal": 59070
+    },
+    {
+      "icon_id": "8471233",
+      "name": "查账",
+      "font_class": "chazhang",
+      "unicode": "e6bf",
+      "unicode_decimal": 59071
+    },
+    {
+      "icon_id": "8471236",
+      "name": "报表",
+      "font_class": "baobiao",
+      "unicode": "e6c0",
+      "unicode_decimal": 59072
+    },
+    {
+      "icon_id": "8471255",
+      "name": "设置",
+      "font_class": "shezhi2",
+      "unicode": "e6c2",
+      "unicode_decimal": 59074
+    },
+    {
+      "icon_id": "8471320",
+      "name": "招生报表",
+      "font_class": "daqiajilu",
+      "unicode": "e6ce",
+      "unicode_decimal": 59086
+    },
+    {
+      "icon_id": "8471348",
+      "name": "考勤打卡",
+      "font_class": "kechengziyuanguanli",
+      "unicode": "e6d3",
+      "unicode_decimal": 59091
+    },
+    {
+      "icon_id": "8471363",
+      "name": "资料中心",
+      "font_class": "ziliaozhongxin",
+      "unicode": "e6d6",
+      "unicode_decimal": 59094
+    },
+    {
+      "icon_id": "8471373",
+      "name": "小程序",
+      "font_class": "houtaishezhi",
+      "unicode": "e6d8",
+      "unicode_decimal": 59096
+    },
+    {
+      "icon_id": "8471401",
+      "name": "后台设置",
+      "font_class": "zhaoshengshezhi",
+      "unicode": "e6db",
+      "unicode_decimal": 59099
+    },
+    {
+      "icon_id": "8471419",
+      "name": "新增员工",
+      "font_class": "xinzengyuangong",
+      "unicode": "e6df",
+      "unicode_decimal": 59103
+    },
+    {
+      "icon_id": "8471685",
+      "name": "消息中心",
+      "font_class": "zhaoshengbaobiao",
+      "unicode": "e6e1",
+      "unicode_decimal": 59105
+    },
+    {
+      "icon_id": "8524999",
+      "name": "菜单管理",
+      "font_class": "caidanguanli",
+      "unicode": "e6e2",
+      "unicode_decimal": 59106
+    },
+    {
+      "icon_id": "8525013",
+      "name": "创建系统",
+      "font_class": "chuangjianxitong",
+      "unicode": "e6e6",
+      "unicode_decimal": 59110
+    },
+    {
+      "icon_id": "8525045",
+      "name": "工单管理",
+      "font_class": "gongdanguanli",
+      "unicode": "e6e7",
+      "unicode_decimal": 59111
+    },
+    {
+      "icon_id": "8525057",
+      "name": "短信",
+      "font_class": "duanxin",
+      "unicode": "e6e8",
+      "unicode_decimal": 59112
+    },
+    {
+      "icon_id": "8525060",
+      "name": "帮助中心",
+      "font_class": "bangzhuzhongxin",
+      "unicode": "e6e9",
+      "unicode_decimal": 59113
+    },
+    {
+      "icon_id": "8574208",
+      "name": "员工变动",
+      "font_class": "yuangongbiandong",
+      "unicode": "e6ea",
+      "unicode_decimal": 59114
+    },
+    {
+      "icon_id": "8574209",
+      "name": "编辑文档",
+      "font_class": "bianjiwendang",
+      "unicode": "e6eb",
+      "unicode_decimal": 59115
+    },
+    {
+      "icon_id": "1289926",
+      "name": "暂无数据",
+      "font_class": "none",
+      "unicode": "e6b0",
+      "unicode_decimal": 59056
+    },
+    {
+      "icon_id": "3868258",
+      "name": "场景管理",
+      "font_class": "changjingguanli",
+      "unicode": "eb61",
+      "unicode_decimal": 60257
+    },
+    {
+      "icon_id": "3868263",
+      "name": "设置",
+      "font_class": "shezhi",
+      "unicode": "eb62",
+      "unicode_decimal": 60258
+    },
+    {
+      "icon_id": "3868266",
+      "name": "功能定义",
+      "font_class": "gongnengdingyi",
+      "unicode": "eb63",
+      "unicode_decimal": 60259
+    },
+    {
+      "icon_id": "3868267",
+      "name": "基础管理",
+      "font_class": "jichuguanli",
+      "unicode": "eb64",
+      "unicode_decimal": 60260
+    },
+    {
+      "icon_id": "3868269",
+      "name": "技术服务",
+      "font_class": "jishufuwu",
+      "unicode": "eb65",
+      "unicode_decimal": 60261
+    },
+    {
+      "icon_id": "3868271",
+      "name": "测试申请",
+      "font_class": "ceshishenqing",
+      "unicode": "eb66",
+      "unicode_decimal": 60262
+    },
+    {
+      "icon_id": "3868273",
+      "name": "警告",
+      "font_class": "jinggao",
+      "unicode": "eb67",
+      "unicode_decimal": 60263
+    },
+    {
+      "icon_id": "3868274",
+      "name": "配网引导",
+      "font_class": "peiwangyindao",
+      "unicode": "eb68",
+      "unicode_decimal": 60264
+    },
+    {
+      "icon_id": "3868275",
+      "name": "人机交互",
+      "font_class": "renjijiaohu",
+      "unicode": "eb69",
+      "unicode_decimal": 60265
+    },
+    {
+      "icon_id": "3868278",
+      "name": "权限审批",
+      "font_class": "quanxianshenpi",
+      "unicode": "eb6b",
+      "unicode_decimal": 60267
+    },
+    {
+      "icon_id": "3868279",
+      "name": "已授权",
+      "font_class": "yishouquan",
+      "unicode": "eb6c",
+      "unicode_decimal": 60268
+    },
+    {
+      "icon_id": "3868280",
+      "name": "提案审批",
+      "font_class": "tianshenpi",
+      "unicode": "eb6d",
+      "unicode_decimal": 60269
+    },
+    {
+      "icon_id": "3868281",
+      "name": "数据看板",
+      "font_class": "shujukanban",
+      "unicode": "eb6e",
+      "unicode_decimal": 60270
+    },
+    {
+      "icon_id": "3868282",
+      "name": "应用管理",
+      "font_class": "yingyongguanli",
+      "unicode": "eb6f",
+      "unicode_decimal": 60271
+    },
+    {
+      "icon_id": "3868287",
+      "name": "账号权限",
+      "font_class": "zhanghaoquanxiang",
+      "unicode": "eb70",
+      "unicode_decimal": 60272
+    },
+    {
+      "icon_id": "3868288",
+      "name": "园区运维",
+      "font_class": "yuanquyunwei",
+      "unicode": "eb71",
+      "unicode_decimal": 60273
+    },
+    {
+      "icon_id": "4118040",
+      "name": "自定义",
+      "font_class": "zidingyi",
+      "unicode": "eb73",
+      "unicode_decimal": 60275
+    },
+    {
+      "icon_id": "4347520",
+      "name": "添加",
+      "font_class": "tianjia",
+      "unicode": "eb89",
+      "unicode_decimal": 60297
+    },
+    {
+      "icon_id": "4347539",
+      "name": "网页",
+      "font_class": "wangye",
+      "unicode": "eb8c",
+      "unicode_decimal": 60300
+    },
+    {
+      "icon_id": "4347549",
+      "name": "设置1",
+      "font_class": "shezhi1",
+      "unicode": "eb8d",
+      "unicode_decimal": 60301
+    },
+    {
+      "icon_id": "4347582",
+      "name": "应用",
+      "font_class": "yingyong",
+      "unicode": "eb8f",
+      "unicode_decimal": 60303
+    },
+    {
+      "icon_id": "4347599",
+      "name": "文档",
+      "font_class": "wendang",
+      "unicode": "eb91",
+      "unicode_decimal": 60305
+    },
+    {
+      "icon_id": "4354243",
+      "name": "饼图",
+      "font_class": "bingtu",
+      "unicode": "eb95",
+      "unicode_decimal": 60309
+    },
+    {
+      "icon_id": "4506835",
+      "name": "规则",
+      "font_class": "guize",
+      "unicode": "ebb7",
+      "unicode_decimal": 60343
+    },
+    {
+      "icon_id": "4506836",
+      "name": "设备管理",
+      "font_class": "shebeiguanli",
+      "unicode": "ebb8",
+      "unicode_decimal": 60344
+    },
+    {
+      "icon_id": "4506837",
+      "name": "功能定义",
+      "font_class": "gongnengdingyi1",
+      "unicode": "ebb9",
+      "unicode_decimal": 60345
+    },
+    {
+      "icon_id": "4518043",
+      "name": "技术服务",
+      "font_class": "jishufuwu1",
+      "unicode": "ebce",
+      "unicode_decimal": 60366
+    },
+    {
+      "icon_id": "4521283",
+      "name": "组织群组",
+      "font_class": "zuzhiqunzu",
+      "unicode": "ebda",
+      "unicode_decimal": 60378
+    },
+    {
+      "icon_id": "4570294",
+      "name": "打开",
+      "font_class": "dakai",
+      "unicode": "ebdf",
+      "unicode_decimal": 60383
+    },
+    {
+      "icon_id": "4583613",
+      "name": "空心对勾",
+      "font_class": "kongxinduigou",
+      "unicode": "ebe5",
+      "unicode_decimal": 60389
+    },
+    {
+      "icon_id": "4624187",
+      "name": "控件选中",
+      "font_class": "kongjianxuanzhong",
+      "unicode": "ebef",
+      "unicode_decimal": 60399
+    },
+    {
+      "icon_id": "4624217",
+      "name": "控件未选",
+      "font_class": "kongjianweixuan",
+      "unicode": "ebf0",
+      "unicode_decimal": 60400
+    },
+    {
+      "icon_id": "4624218",
+      "name": "控件已选",
+      "font_class": "kongjianyixuan",
+      "unicode": "ebf1",
+      "unicode_decimal": 60401
+    },
+    {
+      "icon_id": "4686545",
+      "name": "刷新",
+      "font_class": "shuaxin",
+      "unicode": "ec08",
+      "unicode_decimal": 60424
+    },
+    {
+      "icon_id": "4686546",
+      "name": "保存",
+      "font_class": "baocun",
+      "unicode": "ec09",
+      "unicode_decimal": 60425
+    },
+    {
+      "icon_id": "4686547",
+      "name": "发布",
+      "font_class": "fabu",
+      "unicode": "ec0a",
+      "unicode_decimal": 60426
+    },
+    {
+      "icon_id": "4723191",
+      "name": "图片加载失败",
+      "font_class": "tupianjiazaishibai",
+      "unicode": "ec0d",
+      "unicode_decimal": 60429
+    },
+    {
+      "icon_id": "4777227",
+      "name": "缩小",
+      "font_class": "suoxiao",
+      "unicode": "ec13",
+      "unicode_decimal": 60435
+    },
+    {
+      "icon_id": "4777229",
+      "name": "放大",
+      "font_class": "fangda",
+      "unicode": "ec14",
+      "unicode_decimal": 60436
+    },
+    {
+      "icon_id": "4777231",
+      "name": "还原画布",
+      "font_class": "huanyuanhuabu",
+      "unicode": "ec15",
+      "unicode_decimal": 60437
+    },
+    {
+      "icon_id": "4777232",
+      "name": "全屏",
+      "font_class": "quanping",
+      "unicode": "ec16",
+      "unicode_decimal": 60438
+    },
+    {
+      "icon_id": "4780412",
+      "name": "API输出",
+      "font_class": "APIshuchu",
+      "unicode": "ec17",
+      "unicode_decimal": 60439
+    },
+    {
+      "icon_id": "4780413",
+      "name": "API接入",
+      "font_class": "APIjieru",
+      "unicode": "ec18",
+      "unicode_decimal": 60440
+    },
+    {
+      "icon_id": "4893191",
+      "name": "文件夹",
+      "font_class": "wenjianjia",
+      "unicode": "ec19",
+      "unicode_decimal": 60441
+    },
+    {
+      "icon_id": "4893192",
+      "name": "DOC",
+      "font_class": "DOC",
+      "unicode": "ec1a",
+      "unicode_decimal": 60442
+    },
+    {
+      "icon_id": "4893199",
+      "name": "未知格式",
+      "font_class": "weizhigeshi",
+      "unicode": "ec1f",
+      "unicode_decimal": 60447
+    },
+    {
+      "icon_id": "4896380",
+      "name": "更多",
+      "font_class": "gengduo",
+      "unicode": "ec20",
+      "unicode_decimal": 60448
+    },
+    {
+      "icon_id": "4933869",
+      "name": "点",
+      "font_class": "dian",
+      "unicode": "ec23",
+      "unicode_decimal": 60451
+    },
+    {
+      "icon_id": "5401578",
+      "name": "设备状态",
+      "font_class": "shebeizhuangtai",
+      "unicode": "ec24",
+      "unicode_decimal": 60452
+    },
+    {
+      "icon_id": "5401579",
+      "name": "分组管理",
+      "font_class": "fenzuguanli",
+      "unicode": "ec25",
+      "unicode_decimal": 60453
+    },
+    {
+      "icon_id": "5401580",
+      "name": "快速编排",
+      "font_class": "kuaisubianpai",
+      "unicode": "ec26",
+      "unicode_decimal": 60454
+    },
+    {
+      "icon_id": "5401581",
+      "name": "APP开发",
+      "font_class": "app",
+      "unicode": "ec27",
+      "unicode_decimal": 60455
+    },
+    {
+      "icon_id": "5460559",
+      "name": "问题解答",
+      "font_class": "wentijieda",
+      "unicode": "ec2e",
+      "unicode_decimal": 60462
+    },
+    {
+      "icon_id": "5460560",
+      "name": "客服",
+      "font_class": "kefu",
+      "unicode": "ec2f",
+      "unicode_decimal": 60463
+    },
+    {
+      "icon_id": "5460561",
+      "name": "软件开发包",
+      "font_class": "ruanjiankaifabao",
+      "unicode": "ec30",
+      "unicode_decimal": 60464
+    },
+    {
+      "icon_id": "5732759",
+      "name": "定位",
+      "font_class": "dingwei",
+      "unicode": "ec34",
+      "unicode_decimal": 60468
+    },
+    {
+      "icon_id": "5767874",
+      "name": "任务进程",
+      "font_class": "renwujincheng",
+      "unicode": "ec35",
+      "unicode_decimal": 60469
+    },
+    {
+      "icon_id": "5767876",
+      "name": "消息通知",
+      "font_class": "xiaoxitongzhi1",
+      "unicode": "ec36",
+      "unicode_decimal": 60470
+    },
+    {
+      "icon_id": "5767878",
+      "name": "告警",
+      "font_class": "gaojing",
+      "unicode": "ec37",
+      "unicode_decimal": 60471
+    },
+    {
+      "icon_id": "5767879",
+      "name": "执行反馈",
+      "font_class": "zhihangfankui",
+      "unicode": "ec38",
+      "unicode_decimal": 60472
+    },
+    {
+      "icon_id": "5769241",
+      "name": "工单确认",
+      "font_class": "gongdanqueren",
+      "unicode": "ec39",
+      "unicode_decimal": 60473
+    },
+    {
+      "icon_id": "5769243",
+      "name": "工单",
+      "font_class": "gongdan",
+      "unicode": "ec3b",
+      "unicode_decimal": 60475
+    },
+    {
+      "icon_id": "5882682",
+      "name": "消息",
+      "font_class": "xiaoxi",
+      "unicode": "ec3c",
+      "unicode_decimal": 60476
+    },
+    {
+      "icon_id": "5961297",
+      "name": "查询",
+      "font_class": "chaxun",
+      "unicode": "ec4c",
+      "unicode_decimal": 60492
+    },
+    {
+      "icon_id": "5961299",
+      "name": "安全",
+      "font_class": "anquan",
+      "unicode": "ec4d",
+      "unicode_decimal": 60493
+    },
+    {
+      "icon_id": "5961300",
+      "name": "待办事项",
+      "font_class": "daibanshixiang",
+      "unicode": "ec4e",
+      "unicode_decimal": 60494
+    },
+    {
+      "icon_id": "5961307",
+      "name": "货物堆",
+      "font_class": "huowudui",
+      "unicode": "ec54",
+      "unicode_decimal": 60500
+    },
+    {
+      "icon_id": "5961320",
+      "name": "储存",
+      "font_class": "chucun",
+      "unicode": "ec5e",
+      "unicode_decimal": 60510
+    },
+    {
+      "icon_id": "5961328",
+      "name": "折线图",
+      "font_class": "zhexiantu",
+      "unicode": "ec66",
+      "unicode_decimal": 60518
+    },
+    {
+      "icon_id": "5961366",
+      "name": "列表",
+      "font_class": "liebiao",
+      "unicode": "ec6b",
+      "unicode_decimal": 60523
+    },
+    {
+      "icon_id": "5961393",
+      "name": "汽车",
+      "font_class": "qiche",
+      "unicode": "ec6d",
+      "unicode_decimal": 60525
+    },
+    {
+      "icon_id": "5993150",
+      "name": "复制",
+      "font_class": "fuzhi",
+      "unicode": "ec7a",
+      "unicode_decimal": 60538
+    },
+    {
+      "icon_id": "6195943",
+      "name": "iframe添加",
+      "font_class": "iframetianjia",
+      "unicode": "ec7d",
+      "unicode_decimal": 60541
+    },
+    {
+      "icon_id": "6195944",
+      "name": "图片添加",
+      "font_class": "tupiantianjia",
+      "unicode": "ec7e",
+      "unicode_decimal": 60542
+    },
+    {
+      "icon_id": "6337455",
+      "name": "点赞",
+      "font_class": "dianzan",
+      "unicode": "ec7f",
+      "unicode_decimal": 60543
+    },
+    {
+      "icon_id": "6337456",
+      "name": "插入链接",
+      "font_class": "charulianjie",
+      "unicode": "ec80",
+      "unicode_decimal": 60544
+    },
+    {
+      "icon_id": "6337457",
+      "name": "插入图片",
+      "font_class": "charutupian",
+      "unicode": "ec81",
+      "unicode_decimal": 60545
+    },
+    {
+      "icon_id": "6616926",
+      "name": "对勾",
+      "font_class": "duigoux",
+      "unicode": "ec9e",
+      "unicode_decimal": 60574
+    },
+    {
+      "icon_id": "6616997",
+      "name": "关闭",
+      "font_class": "guanbi1",
+      "unicode": "eca0",
+      "unicode_decimal": 60576
+    },
+    {
+      "icon_id": "6775644",
+      "name": "爱心",
+      "font_class": "aixin",
+      "unicode": "eca1",
+      "unicode_decimal": 60577
+    },
+    {
+      "icon_id": "6776381",
+      "name": "摄像头_实体",
+      "font_class": "shexiangtou_shiti",
+      "unicode": "eca5",
+      "unicode_decimal": 60581
+    },
+    {
+      "icon_id": "6776383",
+      "name": "摄像头_关闭",
+      "font_class": "shexiangtou_guanbi",
+      "unicode": "eca6",
+      "unicode_decimal": 60582
+    },
+    {
+      "icon_id": "6776384",
+      "name": "摄像头",
+      "font_class": "shexiangtou",
+      "unicode": "eca7",
+      "unicode_decimal": 60583
+    },
+    {
+      "icon_id": "6776386",
+      "name": "声音_实体",
+      "font_class": "shengyin_shiti",
+      "unicode": "eca8",
+      "unicode_decimal": 60584
+    },
+    {
+      "icon_id": "6776387",
+      "name": "声音开",
+      "font_class": "shengyinkai",
+      "unicode": "eca9",
+      "unicode_decimal": 60585
+    },
+    {
+      "icon_id": "6776388",
+      "name": "收藏_实心",
+      "font_class": "shoucang_shixin",
+      "unicode": "ecaa",
+      "unicode_decimal": 60586
+    },
+    {
+      "icon_id": "6776389",
+      "name": "收藏",
+      "font_class": "shoucang",
+      "unicode": "ecab",
+      "unicode_decimal": 60587
+    },
+    {
+      "icon_id": "6909428",
+      "name": "设备开发",
+      "font_class": "shebeikaifa",
+      "unicode": "ecac",
+      "unicode_decimal": 60588
+    },
+    {
+      "icon_id": "7947379",
+      "name": "空心问号",
+      "font_class": "kongxinwenhao",
+      "unicode": "ed19",
+      "unicode_decimal": 60697
+    },
+    {
+      "icon_id": "7947748",
+      "name": "错误空心",
+      "font_class": "cuowukongxin",
+      "unicode": "ed1a",
+      "unicode_decimal": 60698
+    },
+    {
+      "icon_id": "7947749",
+      "name": "方块",
+      "font_class": "fangkuai1",
+      "unicode": "ed1b",
+      "unicode_decimal": 60699
+    },
+    {
+      "icon_id": "7947750",
+      "name": "方块+",
+      "font_class": "fangkuai2",
+      "unicode": "ed1c",
+      "unicode_decimal": 60700
+    },
+    {
+      "icon_id": "7947752",
+      "name": "空心对勾",
+      "font_class": "kongxinduigou1",
+      "unicode": "ed1d",
+      "unicode_decimal": 60701
+    },
+    {
+      "icon_id": "7947753",
+      "name": "信息空心",
+      "font_class": "xinxikongxin",
+      "unicode": "ed1e",
+      "unicode_decimal": 60702
+    },
+    {
+      "icon_id": "7947754",
+      "name": "控件",
+      "font_class": "kongjian",
+      "unicode": "ed1f",
+      "unicode_decimal": 60703
+    },
+    {
+      "icon_id": "7947755",
+      "name": "告警空心",
+      "font_class": "gaojingkongxin",
+      "unicode": "ed20",
+      "unicode_decimal": 60704
+    },
+    {
+      "icon_id": "5466006",
+      "name": "新增",
+      "font_class": "add",
+      "unicode": "e70a",
+      "unicode_decimal": 59146
+    },
+    {
+      "icon_id": "5466007",
+      "name": "arrow",
+      "font_class": "arrow",
+      "unicode": "e70b",
+      "unicode_decimal": 59147
+    },
+    {
+      "icon_id": "5466009",
+      "name": "arrow-left",
+      "font_class": "arrow-left",
+      "unicode": "e70c",
+      "unicode_decimal": 59148
+    },
+    {
+      "icon_id": "5466021",
+      "name": "时钟",
+      "font_class": "clock",
+      "unicode": "e711",
+      "unicode_decimal": 59153
+    },
+    {
+      "icon_id": "5466023",
+      "name": "已完成",
+      "font_class": "completed",
+      "unicode": "e713",
+      "unicode_decimal": 59155
+    },
+    {
+      "icon_id": "5466024",
+      "name": "联系人",
+      "font_class": "contact",
+      "unicode": "e714",
+      "unicode_decimal": 59156
+    },
+    {
+      "icon_id": "5466049",
+      "name": "地图",
+      "font_class": "location",
+      "unicode": "e71e",
+      "unicode_decimal": 59166
+    },
+    {
+      "icon_id": "5466076",
+      "name": "问题",
+      "font_class": "question",
+      "unicode": "e72a",
+      "unicode_decimal": 59178
+    },
+    {
+      "icon_id": "5466079",
+      "name": "搜索",
+      "font_class": "search",
+      "unicode": "e72b",
+      "unicode_decimal": 59179
+    },
+    {
+      "icon_id": "5466092",
+      "name": "菜单",
+      "font_class": "nav",
+      "unicode": "e733",
+      "unicode_decimal": 59187
+    },
+    {
+      "icon_id": "883115",
+      "name": "附件",
+      "font_class": "fujian",
+      "unicode": "e65c",
+      "unicode_decimal": 58972
+    },
+    {
+      "icon_id": "4784126",
+      "name": "个人工资",
+      "font_class": "ferengongzi",
+      "unicode": "e65a",
+      "unicode_decimal": 58970
+    },
+    {
+      "icon_id": "5062697",
+      "name": "会议纪要",
+      "font_class": "huiyijiyao",
+      "unicode": "e670",
+      "unicode_decimal": 58992
+    },
+    {
+      "icon_id": "5364514",
+      "name": "公告通知",
+      "font_class": "gonggaotongzhi",
+      "unicode": "e6e5",
+      "unicode_decimal": 59109
+    },
+    {
+      "icon_id": "6930093",
+      "name": "个人绩效",
+      "font_class": "gerenjixiao",
+      "unicode": "e600",
+      "unicode_decimal": 58880
+    },
+    {
+      "icon_id": "9743596",
+      "name": "公司新闻",
+      "font_class": "gongsixinwen",
+      "unicode": "e697",
+      "unicode_decimal": 59031
+    },
+    {
+      "icon_id": "12874128",
+      "name": "个人考勤",
+      "font_class": "gerenkaoqin",
+      "unicode": "e624",
+      "unicode_decimal": 58916
+    },
+    {
+      "icon_id": "9363032",
+      "name": "日常办公",
+      "font_class": "richangbangong",
+      "unicode": "e7b3",
+      "unicode_decimal": 59315
+    },
+    {
+      "icon_id": "12703484",
+      "name": "办公审批",
+      "font_class": "bangongshenpi",
+      "unicode": "e63a",
+      "unicode_decimal": 58938
+    }
+  ]
+}
diff --git a/public/static/assets/icon/iconfont.woff2 b/public/static/assets/icon/iconfont.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..880058e14086afaa53d99ad118c20a123be30cdb
Binary files /dev/null and b/public/static/assets/icon/iconfont.woff2 differ
diff --git a/public/static/assets/icon/index.html b/public/static/assets/icon/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..7fec91b6e5f64eaee3c1ced448ee261f4643f55a
--- /dev/null
+++ b/public/static/assets/icon/index.html
@@ -0,0 +1,115 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8"/>
+  <title>iconfont</title>
+  <link rel="stylesheet" href="demo.css">
+  <link rel="stylesheet" href="iconfont.css">
+  <script src="/static/jquery.min.js"></script> 
+  <style>
+    .main .logo {
+      margin-top: 0;
+      height: auto;
+    }
+
+    .main .logo a {
+      display: flex;
+      align-items: center;
+    }
+
+    .main .logo .sub-title {
+      margin-left: 0.5em;
+      font-size: 22px;
+      color: #fff;
+      background: linear-gradient(-45deg, #3967FF, #B500FE);
+      -webkit-background-clip: text;
+      -webkit-text-fill-color: transparent;
+    }
+	
+	.icon_lists li {
+  width: 100px;
+  margin-bottom: 10px;
+  margin-right: 20px;
+  text-align: center;
+  list-style: none !important;
+  cursor: default;
+  display: inline-block;
+      vertical-align: top;
+    font-size: 12px;
+    letter-spacing: normal;
+    word-spacing: normal;
+    line-height: inherit;
+	  cursor:pointer;
+}
+  </style>
+</head>
+<body>
+  <div class="main">
+    <div class="tab-container">
+	<div class="font-class">
+        <ul id="iconLists" class="icon_lists dib-box"></ul>
+        <div class="article markdown">
+        <h2 id="font-class-">font-class 引用</h2>
+        <hr>
+        <p>使用步骤如下：</p>
+        <h3 id="-fontclass-">第一步：引入项目下面生成的 fontclass 代码：</h3>
+<pre><code class="language-html">&lt;link rel="stylesheet" href="./iconfont.css"&gt;
+</code></pre>
+        <h3 id="-">第二步：挑选相应图标并获取类名，应用于页面：</h3>
+<pre><code class="language-html">&lt;span class="iconfont icon-xxx"&gt;&lt;/span&gt;
+</code></pre>
+        <blockquote>
+          <p>"
+            iconfont" 是你项目下的 font-family。可以通过编辑项目查看，默认是 "iconfont"。</p>
+        </blockquote>
+      </div>
+      </div>
+     
+    </div>
+  </div>
+
+<script>
+
+ $.ajax({
+	url: "iconfont.json",
+	type:'get',
+	success: function (res) {
+		let item='',data = res.glyphs;
+				console.log(data);
+		for(var i=0;i<data.length;i++){
+			item+='<li class="dib">\
+            <span class="icon iconfont icon-'+data[i].font_class+'"></span>\
+            <div class="name">'+data[i].name+'</div>\
+            <div class="code-name">icon-'+data[i].font_class+'</div>\
+          </li>';
+		}
+		$('#iconLists').html(item);
+	}
+})
+
+    $('#iconLists').on('click','.dib', function(){
+		var iconclass = $(this).find('.code-name').text();
+		var copied = copy(iconclass);
+		if(copied){
+			alert('已复制图标名称 '+ iconclass);
+		}
+    });
+    function copy(text){
+		var textarea = document.createElement('textarea');
+		textarea.value = text;
+		textarea.style.position = 'absolute';
+		textarea.style.opacity = '0';
+		document.body.appendChild(textarea);
+		textarea.select();
+		var copied = false;
+		try{
+			copied = document.execCommand('copy');
+		}catch(err){
+			console.log('error', err);
+		}
+		textarea.remove();
+		return copied;
+    }
+</script>
+</body>
+</html>
diff --git a/public/static/assets/layui/css/layui.css b/public/static/assets/layui/css/layui.css
new file mode 100644
index 0000000000000000000000000000000000000000..9207576106d0a9952754abcdc75c0f7d8e6c6e92
--- /dev/null
+++ b/public/static/assets/layui/css/layui.css
@@ -0,0 +1 @@
+blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,li,ol,p,pre,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}a:active,a:hover{outline:0}img{display:inline-block;border:none;vertical-align:middle}li{list-style:none}table{border-collapse:collapse;border-spacing:0}h1,h2,h3,h4,h5,h6{font-weight:700}h5,h6{font-size:100%}button,input,select,textarea{font-size:100%}button,input,optgroup,option,select,textarea{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;outline:0}pre{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}body{line-height:1.6;color:#333;color:rgba(0,0,0,.85);font:14px Helvetica Neue,Helvetica,PingFang SC,Tahoma,Arial,sans-serif}hr{height:0;line-height:0;margin:10px 0;padding:0;border:none;border-bottom:1px solid #eee;clear:both;overflow:hidden;background:0 0}a{color:#333;text-decoration:none}a:hover{color:#777}a cite{font-style:normal;*cursor:pointer}.layui-border-box,.layui-border-box *{box-sizing:border-box}.layui-box,.layui-box *{box-sizing:content-box}.layui-clear{clear:both;*zoom:1}.layui-clear:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-clear-space{word-spacing:-5px}.layui-inline{position:relative;display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.layui-edge{position:relative;display:inline-block;vertical-align:middle;width:0;height:0;border-width:6px;border-style:dashed;border-color:transparent;overflow:hidden}.layui-edge-top{top:-4px;border-bottom-color:#999;border-bottom-style:solid}.layui-edge-right{border-left-color:#999;border-left-style:solid}.layui-edge-bottom{top:2px;border-top-color:#999;border-top-style:solid}.layui-edge-left{border-right-color:#999;border-right-style:solid}.layui-elip{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-disabled,.layui-icon,.layui-unselect{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-disabled,.layui-disabled:hover{color:#d2d2d2!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}.layui-show-v{visibility:visible!important}.layui-hide-v{visibility:hidden!important}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=282);src:url(../font/iconfont.eot?v=282#iefix) format('embedded-opentype'),url(../font/iconfont.woff2?v=282) format('woff2'),url(../font/iconfont.woff?v=282) format('woff'),url(../font/iconfont.ttf?v=282) format('truetype'),url(../font/iconfont.svg?v=282#layui-icon) format('svg')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-icon-leaf:before{content:"\e701"}.layui-icon-folder:before{content:"\eabe"}.layui-icon-folder-open:before{content:"\eac1"}.layui-icon-gitee:before{content:"\e69b"}.layui-icon-github:before{content:"\e6a7"}.layui-icon-disabled:before{content:"\e6cc"}.layui-icon-moon:before{content:"\e6c2"}.layui-icon-error:before{content:"\e693"}.layui-icon-success:before{content:"\e697"}.layui-icon-question:before{content:"\e699"}.layui-icon-lock:before{content:"\e69a"}.layui-icon-eye:before{content:"\e695"}.layui-icon-eye-invisible:before{content:"\e696"}.layui-icon-backspace:before{content:"\e694"}.layui-icon-tips-fill:before{content:"\eb2e"}.layui-icon-test:before{content:"\e692"}.layui-icon-clear:before{content:"\e788"}.layui-icon-heart-fill:before{content:"\e68f"}.layui-icon-light:before{content:"\e748"}.layui-icon-music:before{content:"\e690"}.layui-icon-time:before{content:"\e68d"}.layui-icon-ie:before{content:"\e7bb"}.layui-icon-firefox:before{content:"\e686"}.layui-icon-at:before{content:"\e687"}.layui-icon-bluetooth:before{content:"\e689"}.layui-icon-chrome:before{content:"\e68a"}.layui-icon-edge:before{content:"\e68b"}.layui-icon-heart:before{content:"\e68c"}.layui-icon-key:before{content:"\e683"}.layui-icon-android:before{content:"\e684"}.layui-icon-mike:before{content:"\e6dc"}.layui-icon-mute:before{content:"\e685"}.layui-icon-gift:before{content:"\e627"}.layui-icon-windows:before{content:"\e67f"}.layui-icon-ios:before{content:"\e680"}.layui-icon-logout:before{content:"\e682"}.layui-icon-wifi:before{content:"\e7e0"}.layui-icon-rss:before{content:"\e808"}.layui-icon-email:before{content:"\e618"}.layui-icon-reduce-circle:before{content:"\e616"}.layui-icon-transfer:before{content:"\e691"}.layui-icon-service:before{content:"\e626"}.layui-icon-addition:before{content:"\e624"}.layui-icon-subtraction:before{content:"\e67e"}.layui-icon-slider:before{content:"\e714"}.layui-icon-print:before{content:"\e66d"}.layui-icon-export:before{content:"\e67d"}.layui-icon-cols:before{content:"\e610"}.layui-icon-screen-full:before{content:"\e622"}.layui-icon-screen-restore:before{content:"\e758"}.layui-icon-rate-half:before{content:"\e6c9"}.layui-icon-rate-solid:before{content:"\e67a"}.layui-icon-rate:before{content:"\e67b"}.layui-icon-cellphone:before{content:"\e678"}.layui-icon-vercode:before{content:"\e679"}.layui-icon-login-weibo:before{content:"\e675"}.layui-icon-login-qq:before{content:"\e676"}.layui-icon-login-wechat:before{content:"\e677"}.layui-icon-username:before{content:"\e66f"}.layui-icon-password:before{content:"\e673"}.layui-icon-refresh-3:before{content:"\e9aa"}.layui-icon-auz:before{content:"\e672"}.layui-icon-shrink-right:before{content:"\e668"}.layui-icon-spread-left:before{content:"\e66b"}.layui-icon-snowflake:before{content:"\e6b1"}.layui-icon-tips:before{content:"\e702"}.layui-icon-note:before{content:"\e66e"}.layui-icon-senior:before{content:"\e674"}.layui-icon-refresh-1:before{content:"\e666"}.layui-icon-refresh:before{content:"\e669"}.layui-icon-flag:before{content:"\e66c"}.layui-icon-theme:before{content:"\e66a"}.layui-icon-notice:before{content:"\e667"}.layui-icon-console:before{content:"\e665"}.layui-icon-website:before{content:"\e7ae"}.layui-icon-face-surprised:before{content:"\e664"}.layui-icon-set:before{content:"\e716"}.layui-icon-template:before{content:"\e663"}.layui-icon-app:before{content:"\e653"}.layui-icon-template-1:before{content:"\e656"}.layui-icon-home:before{content:"\e68e"}.layui-icon-female:before{content:"\e661"}.layui-icon-male:before{content:"\e662"}.layui-icon-tread:before{content:"\e6c5"}.layui-icon-praise:before{content:"\e6c6"}.layui-icon-rmb:before{content:"\e65e"}.layui-icon-more:before{content:"\e65f"}.layui-icon-camera:before{content:"\e660"}.layui-icon-cart-simple:before{content:"\e698"}.layui-icon-face-cry:before{content:"\e69c"}.layui-icon-face-smile:before{content:"\e6af"}.layui-icon-survey:before{content:"\e6b2"}.layui-icon-read:before{content:"\e705"}.layui-icon-location:before{content:"\e715"}.layui-icon-dollar:before{content:"\e659"}.layui-icon-diamond:before{content:"\e735"}.layui-icon-return:before{content:"\e65c"}.layui-icon-camera-fill:before{content:"\e65d"}.layui-icon-fire:before{content:"\e756"}.layui-icon-more-vertical:before{content:"\e671"}.layui-icon-cart:before{content:"\e657"}.layui-icon-star-fill:before{content:"\e658"}.layui-icon-prev:before{content:"\e65a"}.layui-icon-next:before{content:"\e65b"}.layui-icon-upload:before{content:"\e67c"}.layui-icon-upload-drag:before{content:"\e681"}.layui-icon-user:before{content:"\e770"}.layui-icon-file-b:before{content:"\e655"}.layui-icon-component:before{content:"\e857"}.layui-icon-find-fill:before{content:"\e670"}.layui-icon-loading:before{content:"\e63d"}.layui-icon-loading-1:before{content:"\e63e"}.layui-icon-add-1:before{content:"\e654"}.layui-icon-pause:before{content:"\e651"}.layui-icon-play:before{content:"\e652"}.layui-icon-video:before{content:"\e6ed"}.layui-icon-headset:before{content:"\e6fc"}.layui-icon-voice:before{content:"\e688"}.layui-icon-speaker:before{content:"\e645"}.layui-icon-fonts-del:before{content:"\e64f"}.layui-icon-fonts-html:before{content:"\e64b"}.layui-icon-fonts-code:before{content:"\e64e"}.layui-icon-fonts-strong:before{content:"\e62b"}.layui-icon-unlink:before{content:"\e64d"}.layui-icon-picture:before{content:"\e64a"}.layui-icon-link:before{content:"\e64c"}.layui-icon-face-smile-b:before{content:"\e650"}.layui-icon-align-center:before{content:"\e647"}.layui-icon-align-right:before{content:"\e648"}.layui-icon-align-left:before{content:"\e649"}.layui-icon-fonts-u:before{content:"\e646"}.layui-icon-fonts-i:before{content:"\e644"}.layui-icon-tabs:before{content:"\e62a"}.layui-icon-circle:before{content:"\e63f"}.layui-icon-radio:before{content:"\e643"}.layui-icon-share:before{content:"\e641"}.layui-icon-edit:before{content:"\e642"}.layui-icon-delete:before{content:"\e640"}.layui-icon-engine:before{content:"\e628"}.layui-icon-chart-screen:before{content:"\e629"}.layui-icon-chart:before{content:"\e62c"}.layui-icon-table:before{content:"\e62d"}.layui-icon-tree:before{content:"\e62e"}.layui-icon-upload-circle:before{content:"\e62f"}.layui-icon-templeate-1:before{content:"\e630"}.layui-icon-util:before{content:"\e631"}.layui-icon-layouts:before{content:"\e632"}.layui-icon-prev-circle:before{content:"\e633"}.layui-icon-carousel:before{content:"\e634"}.layui-icon-code-circle:before{content:"\e635"}.layui-icon-water:before{content:"\e636"}.layui-icon-date:before{content:"\e637"}.layui-icon-layer:before{content:"\e638"}.layui-icon-fonts-clear:before{content:"\e639"}.layui-icon-dialogue:before{content:"\e63a"}.layui-icon-cellphone-fine:before{content:"\e63b"}.layui-icon-form:before{content:"\e63c"}.layui-icon-file:before{content:"\e621"}.layui-icon-triangle-r:before{content:"\e623"}.layui-icon-triangle-d:before{content:"\e625"}.layui-icon-set-sm:before{content:"\e620"}.layui-icon-add-circle:before{content:"\e61f"}.layui-icon-layim-download:before{content:"\e61e"}.layui-icon-layim-uploadfile:before{content:"\e61d"}.layui-icon-404:before{content:"\e61c"}.layui-icon-about:before{content:"\e60b"}.layui-icon-layim-theme:before{content:"\e61b"}.layui-icon-down:before{content:"\e61a"}.layui-icon-up:before{content:"\e619"}.layui-icon-circle-dot:before{content:"\e617"}.layui-icon-set-fill:before{content:"\e614"}.layui-icon-search:before{content:"\e615"}.layui-icon-friends:before{content:"\e612"}.layui-icon-group:before{content:"\e613"}.layui-icon-reply-fill:before{content:"\e611"}.layui-icon-menu-fill:before{content:"\e60f"}.layui-icon-face-smile-fine:before{content:"\e60c"}.layui-icon-picture-fine:before{content:"\e60d"}.layui-icon-log:before{content:"\e60e"}.layui-icon-list:before{content:"\e60a"}.layui-icon-release:before{content:"\e609"}.layui-icon-add-circle-fine:before{content:"\e608"}.layui-icon-ok:before{content:"\e605"}.layui-icon-help:before{content:"\e607"}.layui-icon-chat:before{content:"\e606"}.layui-icon-top:before{content:"\e604"}.layui-icon-right:before{content:"\e602"}.layui-icon-left:before{content:"\e603"}.layui-icon-star:before{content:"\e600"}.layui-icon-download-circle:before{content:"\e601"}.layui-icon-close:before{content:"\1006"}.layui-icon-close-fill:before{content:"\1007"}.layui-icon-ok-circle:before{content:"\1005"}.layui-main{position:relative;width:1160px;margin:0 auto}.layui-header{position:relative;z-index:1000;height:60px}.layui-header a:hover{transition:all .5s;-webkit-transition:all .5s}.layui-side{position:fixed;left:0;top:0;bottom:0;z-index:999;width:200px;overflow-x:hidden}.layui-side-scroll{position:relative;width:220px;height:100%;overflow-x:hidden}.layui-body{position:relative;left:200px;right:0;top:0;bottom:0;width:auto;box-sizing:border-box}.layui-layout-body{overflow-x:hidden}.layui-layout-admin .layui-header{position:fixed;top:0;left:0;right:0;background-color:#23292e}.layui-layout-admin .layui-side{top:60px;width:200px;overflow-x:hidden}.layui-layout-admin .layui-body{position:absolute;top:60px;padding-bottom:44px}.layui-layout-admin .layui-main{width:auto;margin:0 15px}.layui-layout-admin .layui-footer{position:fixed;left:200px;right:0;bottom:0;z-index:990;height:44px;line-height:44px;padding:0 15px;box-shadow:-1px 0 4px rgb(0 0 0 / 12%);background-color:#fafafa}.layui-layout-admin .layui-logo{position:absolute;left:0;top:0;width:200px;height:100%;line-height:60px;text-align:center;color:#16baaa;font-size:16px;box-shadow:0 1px 2px 0 rgb(0 0 0 / 15%)}.layui-layout-admin .layui-header .layui-nav{background:0 0}.layui-layout-left{position:absolute!important;left:200px;top:0}.layui-layout-right{position:absolute!important;right:0;top:0}.layui-container{position:relative;margin:0 auto;box-sizing:border-box}.layui-fluid{position:relative;margin:0 auto;padding:0 15px}.layui-row:after,.layui-row:before{content:"";display:block;clear:both}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9,.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9,.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9,.layui-col-xl1,.layui-col-xl10,.layui-col-xl11,.layui-col-xl12,.layui-col-xl2,.layui-col-xl3,.layui-col-xl4,.layui-col-xl5,.layui-col-xl6,.layui-col-xl7,.layui-col-xl8,.layui-col-xl9,.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{position:relative;display:block;box-sizing:border-box}.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{float:left}.layui-col-xs1{width:8.33333333%}.layui-col-xs2{width:16.66666667%}.layui-col-xs3{width:25%}.layui-col-xs4{width:33.33333333%}.layui-col-xs5{width:41.66666667%}.layui-col-xs6{width:50%}.layui-col-xs7{width:58.33333333%}.layui-col-xs8{width:66.66666667%}.layui-col-xs9{width:75%}.layui-col-xs10{width:83.33333333%}.layui-col-xs11{width:91.66666667%}.layui-col-xs12{width:100%}.layui-col-xs-offset1{margin-left:8.33333333%}.layui-col-xs-offset2{margin-left:16.66666667%}.layui-col-xs-offset3{margin-left:25%}.layui-col-xs-offset4{margin-left:33.33333333%}.layui-col-xs-offset5{margin-left:41.66666667%}.layui-col-xs-offset6{margin-left:50%}.layui-col-xs-offset7{margin-left:58.33333333%}.layui-col-xs-offset8{margin-left:66.66666667%}.layui-col-xs-offset9{margin-left:75%}.layui-col-xs-offset10{margin-left:83.33333333%}.layui-col-xs-offset11{margin-left:91.66666667%}.layui-col-xs-offset12{margin-left:100%}@media screen and (max-width:767.98px){.layui-container{padding:0 15px}.layui-hide-xs{display:none!important}.layui-show-xs-block{display:block!important}.layui-show-xs-inline{display:inline!important}.layui-show-xs-inline-block{display:inline-block!important}}@media screen and (min-width:768px){.layui-container{width:720px}.layui-hide-sm{display:none!important}.layui-show-sm-block{display:block!important}.layui-show-sm-inline{display:inline!important}.layui-show-sm-inline-block{display:inline-block!important}.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9{float:left}.layui-col-sm1{width:8.33333333%}.layui-col-sm2{width:16.66666667%}.layui-col-sm3{width:25%}.layui-col-sm4{width:33.33333333%}.layui-col-sm5{width:41.66666667%}.layui-col-sm6{width:50%}.layui-col-sm7{width:58.33333333%}.layui-col-sm8{width:66.66666667%}.layui-col-sm9{width:75%}.layui-col-sm10{width:83.33333333%}.layui-col-sm11{width:91.66666667%}.layui-col-sm12{width:100%}.layui-col-sm-offset1{margin-left:8.33333333%}.layui-col-sm-offset2{margin-left:16.66666667%}.layui-col-sm-offset3{margin-left:25%}.layui-col-sm-offset4{margin-left:33.33333333%}.layui-col-sm-offset5{margin-left:41.66666667%}.layui-col-sm-offset6{margin-left:50%}.layui-col-sm-offset7{margin-left:58.33333333%}.layui-col-sm-offset8{margin-left:66.66666667%}.layui-col-sm-offset9{margin-left:75%}.layui-col-sm-offset10{margin-left:83.33333333%}.layui-col-sm-offset11{margin-left:91.66666667%}.layui-col-sm-offset12{margin-left:100%}}@media screen and (min-width:992px){.layui-container{width:960px}.layui-hide-md{display:none!important}.layui-show-md-block{display:block!important}.layui-show-md-inline{display:inline!important}.layui-show-md-inline-block{display:inline-block!important}.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9{float:left}.layui-col-md1{width:8.33333333%}.layui-col-md2{width:16.66666667%}.layui-col-md3{width:25%}.layui-col-md4{width:33.33333333%}.layui-col-md5{width:41.66666667%}.layui-col-md6{width:50%}.layui-col-md7{width:58.33333333%}.layui-col-md8{width:66.66666667%}.layui-col-md9{width:75%}.layui-col-md10{width:83.33333333%}.layui-col-md11{width:91.66666667%}.layui-col-md12{width:100%}.layui-col-md-offset1{margin-left:8.33333333%}.layui-col-md-offset2{margin-left:16.66666667%}.layui-col-md-offset3{margin-left:25%}.layui-col-md-offset4{margin-left:33.33333333%}.layui-col-md-offset5{margin-left:41.66666667%}.layui-col-md-offset6{margin-left:50%}.layui-col-md-offset7{margin-left:58.33333333%}.layui-col-md-offset8{margin-left:66.66666667%}.layui-col-md-offset9{margin-left:75%}.layui-col-md-offset10{margin-left:83.33333333%}.layui-col-md-offset11{margin-left:91.66666667%}.layui-col-md-offset12{margin-left:100%}}@media screen and (min-width:1200px){.layui-container{width:1150px}.layui-hide-lg{display:none!important}.layui-show-lg-block{display:block!important}.layui-show-lg-inline{display:inline!important}.layui-show-lg-inline-block{display:inline-block!important}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9{float:left}.layui-col-lg1{width:8.33333333%}.layui-col-lg2{width:16.66666667%}.layui-col-lg3{width:25%}.layui-col-lg4{width:33.33333333%}.layui-col-lg5{width:41.66666667%}.layui-col-lg6{width:50%}.layui-col-lg7{width:58.33333333%}.layui-col-lg8{width:66.66666667%}.layui-col-lg9{width:75%}.layui-col-lg10{width:83.33333333%}.layui-col-lg11{width:91.66666667%}.layui-col-lg12{width:100%}.layui-col-lg-offset1{margin-left:8.33333333%}.layui-col-lg-offset2{margin-left:16.66666667%}.layui-col-lg-offset3{margin-left:25%}.layui-col-lg-offset4{margin-left:33.33333333%}.layui-col-lg-offset5{margin-left:41.66666667%}.layui-col-lg-offset6{margin-left:50%}.layui-col-lg-offset7{margin-left:58.33333333%}.layui-col-lg-offset8{margin-left:66.66666667%}.layui-col-lg-offset9{margin-left:75%}.layui-col-lg-offset10{margin-left:83.33333333%}.layui-col-lg-offset11{margin-left:91.66666667%}.layui-col-lg-offset12{margin-left:100%}}@media screen and (min-width:1400px){.layui-container{width:1330px}.layui-hide-xl{display:none!important}.layui-show-xl-block{display:block!important}.layui-show-xl-inline{display:inline!important}.layui-show-xl-inline-block{display:inline-block!important}.layui-col-xl1,.layui-col-xl10,.layui-col-xl11,.layui-col-xl12,.layui-col-xl2,.layui-col-xl3,.layui-col-xl4,.layui-col-xl5,.layui-col-xl6,.layui-col-xl7,.layui-col-xl8,.layui-col-xl9{float:left}.layui-col-xl1{width:8.33333333%}.layui-col-xl2{width:16.66666667%}.layui-col-xl3{width:25%}.layui-col-xl4{width:33.33333333%}.layui-col-xl5{width:41.66666667%}.layui-col-xl6{width:50%}.layui-col-xl7{width:58.33333333%}.layui-col-xl8{width:66.66666667%}.layui-col-xl9{width:75%}.layui-col-xl10{width:83.33333333%}.layui-col-xl11{width:91.66666667%}.layui-col-xl12{width:100%}.layui-col-xl-offset1{margin-left:8.33333333%}.layui-col-xl-offset2{margin-left:16.66666667%}.layui-col-xl-offset3{margin-left:25%}.layui-col-xl-offset4{margin-left:33.33333333%}.layui-col-xl-offset5{margin-left:41.66666667%}.layui-col-xl-offset6{margin-left:50%}.layui-col-xl-offset7{margin-left:58.33333333%}.layui-col-xl-offset8{margin-left:66.66666667%}.layui-col-xl-offset9{margin-left:75%}.layui-col-xl-offset10{margin-left:83.33333333%}.layui-col-xl-offset11{margin-left:91.66666667%}.layui-col-xl-offset12{margin-left:100%}}.layui-col-space1{margin:-.5px}.layui-col-space1>*{padding:.5px}.layui-col-space2{margin:-1px}.layui-col-space2>*{padding:1px}.layui-col-space4{margin:-2px}.layui-col-space4>*{padding:2px}.layui-col-space5{margin:-2.5px}.layui-col-space5>*{padding:2.5px}.layui-col-space6{margin:-3px}.layui-col-space6>*{padding:3px}.layui-col-space8{margin:-4px}.layui-col-space8>*{padding:4px}.layui-col-space10{margin:-5px}.layui-col-space10>*{padding:5px}.layui-col-space12{margin:-6px}.layui-col-space12>*{padding:6px}.layui-col-space14{margin:-7px}.layui-col-space14>*{padding:7px}.layui-col-space15{margin:-7.5px}.layui-col-space15>*{padding:7.5px}.layui-col-space16{margin:-8px}.layui-col-space16>*{padding:8px}.layui-col-space18{margin:-9px}.layui-col-space18>*{padding:9px}.layui-col-space20{margin:-10px}.layui-col-space20>*{padding:10px}.layui-col-space22{margin:-11px}.layui-col-space22>*{padding:11px}.layui-col-space24{margin:-12px}.layui-col-space24>*{padding:12px}.layui-col-space25{margin:-12.5px}.layui-col-space25>*{padding:12.5px}.layui-col-space26{margin:-13px}.layui-col-space26>*{padding:13px}.layui-col-space28{margin:-14px}.layui-col-space28>*{padding:14px}.layui-col-space30{margin:-15px}.layui-col-space30>*{padding:15px}.layui-col-space32{margin:-16px}.layui-col-space32>*{padding:16px}.layui-padding-1{padding:4px!important}.layui-padding-2{padding:8px!important}.layui-padding-3{padding:16px!important}.layui-padding-4{padding:32px!important}.layui-padding-5{padding:48px!important}.layui-margin-1{margin:4px!important}.layui-margin-2{margin:8px!important}.layui-margin-3{margin:16px!important}.layui-margin-4{margin:32px!important}.layui-margin-5{margin:48px!important}.layui-btn,.layui-input,.layui-select,.layui-textarea,.layui-upload-button{outline:0;-webkit-appearance:none;transition:all .3s;-webkit-transition:all .3s;box-sizing:border-box}.layui-elem-quote{margin-bottom:10px;padding:15px;line-height:1.8;border-left:5px solid #16b777;border-radius:0 2px 2px 0;background-color:#fafafa}.layui-quote-nm{border-style:solid;border-width:1px;border-left-width:5px;background:0 0}.layui-elem-field{margin-bottom:10px;padding:0;border-width:1px;border-style:solid}.layui-elem-field legend{margin-left:20px;padding:0 10px;font-size:20px}.layui-field-title{margin:16px 0;border-width:0;border-top-width:1px}.layui-field-box{padding:15px}.layui-field-title .layui-field-box{padding:10px 0}.layui-progress{position:relative;height:6px;border-radius:20px;background-color:#eee}.layui-progress-bar{position:absolute;left:0;top:0;width:0;max-width:100%;height:6px;border-radius:20px;text-align:right;background-color:#16b777;transition:all .3s;-webkit-transition:all .3s}.layui-progress-big,.layui-progress-big .layui-progress-bar{height:18px;line-height:18px}.layui-progress-text{position:relative;top:-20px;line-height:18px;font-size:12px;color:#5f5f5f}.layui-progress-big .layui-progress-text{position:static;padding:0 10px;color:#fff}.layui-collapse{border-width:1px;border-style:solid;border-radius:2px}.layui-colla-content,.layui-colla-item{border-top-width:1px;border-top-style:solid}.layui-colla-item:first-child{border-top:none}.layui-colla-title{position:relative;height:42px;line-height:42px;padding:0 15px 0 35px;color:#333;background-color:#fafafa;cursor:pointer;font-size:14px;overflow:hidden}.layui-colla-content{display:none;padding:10px 15px;line-height:1.6;color:#5f5f5f}.layui-colla-icon{position:absolute;left:15px;top:0;font-size:14px}.layui-card{margin-bottom:15px;border-radius:2px;background-color:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.layui-card:last-child{margin-bottom:0}.layui-card-header{position:relative;height:42px;line-height:42px;padding:0 15px;border-bottom:1px solid #f8f8f8;color:#333;border-radius:2px 2px 0 0;font-size:14px}.layui-card-body{position:relative;padding:10px 15px;line-height:24px}.layui-card-body[pad15]{padding:15px}.layui-card-body[pad20]{padding:20px}.layui-card-body .layui-table{margin:5px 0}.layui-card .layui-tab{margin:0}.layui-panel{position:relative;border-width:1px;border-style:solid;border-radius:2px;box-shadow:1px 1px 4px rgb(0 0 0 / 8%);background-color:#fff;color:#5f5f5f}.layui-panel-window{position:relative;padding:15px;border-radius:0;border-top:5px solid #eee;background-color:#fff}.layui-auxiliar-moving{position:fixed;left:0;right:0;top:0;bottom:0;width:100%;height:100%;background:0 0;z-index:9999999999;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.layui-scrollbar-hide{overflow:hidden!important}.layui-bg-red{background-color:#ff5722!important;color:#fff!important}.layui-bg-orange{background-color:#ffb800!important;color:#fff!important}.layui-bg-green{background-color:#16baaa!important;color:#fff!important}.layui-bg-cyan{background-color:#2f4056!important;color:#fff!important}.layui-bg-blue{background-color:#1e9fff!important;color:#fff!important}.layui-bg-purple{background-color:#a233c6!important;color:#fff!important}.layui-bg-black{background-color:#2f363c!important;color:#fff!important}.layui-bg-gray{background-color:#fafafa!important;color:#5f5f5f!important}.layui-badge-rim,.layui-border,.layui-colla-content,.layui-colla-item,.layui-collapse,.layui-elem-field,.layui-form-pane .layui-form-item[pane],.layui-form-pane .layui-form-label,.layui-input,.layui-input-split,.layui-panel,.layui-quote-nm,.layui-select,.layui-tab-bar,.layui-tab-card,.layui-tab-title,.layui-tab-title .layui-this:after,.layui-textarea{border-color:#eee}.layui-border{border-width:1px;border-style:solid;color:#5f5f5f!important}.layui-border-red{border-width:1px;border-style:solid;border-color:#ff5722!important;color:#ff5722!important}.layui-border-orange{border-width:1px;border-style:solid;border-color:#ffb800!important;color:#ffb800!important}.layui-border-green{border-width:1px;border-style:solid;border-color:#16baaa!important;color:#16baaa!important}.layui-border-cyan{border-width:1px;border-style:solid;border-color:#2f4056!important;color:#2f4056!important}.layui-border-blue{border-width:1px;border-style:solid;border-color:#1e9fff!important;color:#1e9fff!important}.layui-border-purple{border-width:1px;border-style:solid;border-color:#a233c6!important;color:#a233c6!important}.layui-border-black{border-width:1px;border-style:solid;border-color:#2f363c!important;color:#2f363c!important}hr.layui-border-black,hr.layui-border-blue,hr.layui-border-cyan,hr.layui-border-green,hr.layui-border-orange,hr.layui-border-purple,hr.layui-border-red{border-width:0 0 1px}.layui-timeline-item:before{background-color:#eee}.layui-text{line-height:1.8;font-size:14px}.layui-text h1{margin:32px 0;font-size:32px}.layui-text h2{margin:24px 0;font-size:24px}.layui-text h3{margin:16px 0;font-size:18px}.layui-text h4{margin:11px 0;font-size:16px}.layui-text h5{margin:11px 0;font-size:14px}.layui-text h6{margin:11px 0;font-size:13px}.layui-text ol,.layui-text ul{padding-left:15px}.layui-text ul li{margin-top:5px;list-style-type:disc}.layui-text ol li{margin-top:5px;list-style-type:decimal}.layui-text-em,.layui-word-aux{color:#999!important;padding-left:5px!important;padding-right:5px!important}.layui-text p{margin:15px 0}.layui-text p:first-child{margin-top:0}.layui-text p:last-child{margin-bottom:0}.layui-text a:not(.layui-btn){color:#01aaed}.layui-text a:not(.layui-btn):hover{text-decoration:underline}.layui-text blockquote:not(.layui-elem-quote){margin:15px 0;padding:5px 15px;border-left:5px solid #eee}.layui-text pre>code:not(.layui-code){display:block;padding:15px;font-family:"Courier New",Consolas,"Lucida Console"}.layui-font-12{font-size:12px!important}.layui-font-13{font-size:13px!important}.layui-font-14{font-size:14px!important}.layui-font-16{font-size:16px!important}.layui-font-18{font-size:18px!important}.layui-font-20{font-size:20px!important}.layui-font-22{font-size:22px!important}.layui-font-24{font-size:24px!important}.layui-font-26{font-size:26px!important}.layui-font-28{font-size:28px!important}.layui-font-30{font-size:30px!important}.layui-font-32{font-size:32px!important}.layui-font-red{color:#ff5722!important}.layui-font-orange{color:#ffb800!important}.layui-font-green{color:#16baaa!important}.layui-font-cyan{color:#2f4056!important}.layui-font-blue{color:#01aaed!important}.layui-font-purple{color:#a233c6!important}.layui-font-black{color:#000!important}.layui-font-gray{color:#c2c2c2!important}.layui-btn{display:inline-block;vertical-align:middle;height:38px;line-height:38px;border:1px solid transparent;padding:0 18px;background-color:#16baaa;color:#fff;white-space:nowrap;text-align:center;font-size:14px;border-radius:2px;cursor:pointer;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-btn:hover{opacity:.8;filter:alpha(opacity=80);color:#fff}.layui-btn:active{opacity:1;filter:alpha(opacity=100)}.layui-btn+.layui-btn{margin-left:10px}.layui-btn-container{word-spacing:-5px}.layui-btn-container .layui-btn{margin-right:10px;margin-bottom:10px;word-spacing:normal}.layui-btn-container .layui-btn+.layui-btn{margin-left:0}.layui-table .layui-btn-container .layui-btn{margin-bottom:9px}.layui-btn-radius{border-radius:100px}.layui-btn .layui-icon{padding:0 2px;vertical-align:middle\0;vertical-align:bottom}.layui-btn-primary{border-color:#d2d2d2;background:0 0;color:#5f5f5f}.layui-btn-primary:hover{border-color:#16baaa;color:#333}.layui-btn-normal{background-color:#1e9fff}.layui-btn-warm{background-color:#ffb800}.layui-btn-danger{background-color:#ff5722}.layui-btn-checked{background-color:#16b777}.layui-btn-disabled,.layui-btn-disabled:active,.layui-btn-disabled:hover{border-color:#eee!important;background-color:#fbfbfb!important;color:#d2d2d2!important;cursor:not-allowed!important;opacity:1}.layui-btn-lg{height:44px;line-height:44px;padding:0 25px;font-size:16px}.layui-btn-sm{height:30px;line-height:30px;padding:0 10px;font-size:12px}.layui-btn-xs{height:22px;line-height:22px;padding:0 5px;font-size:12px}.layui-btn-xs i{font-size:12px!important}.layui-btn-group{display:inline-block;vertical-align:middle;font-size:0}.layui-btn-group .layui-btn{margin-left:0!important;margin-right:0!important;border-left:1px solid rgba(255,255,255,.5);border-radius:0}.layui-btn-group .layui-btn-primary{border-left:none}.layui-btn-group .layui-btn-primary:hover{border-color:#d2d2d2;color:#16baaa}.layui-btn-group .layui-btn:first-child{border-left:none;border-radius:2px 0 0 2px}.layui-btn-group .layui-btn-primary:first-child{border-left:1px solid #d2d2d2}.layui-btn-group .layui-btn:last-child{border-radius:0 2px 2px 0}.layui-btn-group .layui-btn+.layui-btn{margin-left:0}.layui-btn-group+.layui-btn-group{margin-left:10px}.layui-btn-fluid{width:100%}.layui-input,.layui-select,.layui-textarea{height:38px;line-height:1.3;line-height:38px\9;border-width:1px;border-style:solid;background-color:#fff;color:rgba(0,0,0,.85);border-radius:2px}.layui-input::-webkit-input-placeholder,.layui-select::-webkit-input-placeholder,.layui-textarea::-webkit-input-placeholder{line-height:1.3}.layui-input,.layui-textarea{display:block;width:100%;padding-left:10px}.layui-input:hover,.layui-textarea:hover{border-color:#d2d2d2!important}.layui-input:focus,.layui-textarea:focus{border-color:#16b777!important;box-shadow:0 0 0 3px rgba(22,183,119,.08)}.layui-textarea{position:relative;min-height:100px;height:auto;line-height:20px;padding:6px 10px;resize:vertical}.layui-input[disabled],.layui-textarea[disabled]{background-color:#fafafa}.layui-select{padding:0 10px}.layui-form input[type=checkbox],.layui-form input[type=radio],.layui-form select{display:none}.layui-form [lay-ignore]{display:initial}.layui-form-item{position:relative;margin-bottom:15px;clear:both;*zoom:1}.layui-form-item:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-form-label{position:relative;float:left;display:block;padding:9px 15px;width:80px;font-weight:400;line-height:20px;text-align:right}.layui-form-label-col{display:block;float:none;padding:9px 0;line-height:20px;text-align:left}.layui-form-item .layui-inline{margin-bottom:5px;margin-right:10px}.layui-input-block,.layui-input-inline{position:relative}.layui-input-block{margin-left:110px;min-height:36px}.layui-input-inline{display:inline-block;vertical-align:middle}.layui-form-item .layui-input-inline{float:left;width:190px;margin-right:10px}.layui-form-text .layui-input-inline{width:auto}.layui-form-mid{position:relative;float:left;display:block;padding:9px 0!important;line-height:20px;margin-right:10px}.layui-form-danger+.layui-form-select .layui-input,.layui-form-danger:focus{border-color:#ff5722!important;box-shadow:0 0 0 3px rgba(255,87,34,.08)}.layui-input-prefix,.layui-input-split,.layui-input-suffix,.layui-input-suffix .layui-input-affix{position:absolute;right:0;top:0;padding:0 10px;width:35px;height:100%;text-align:center;transition:all .3s;box-sizing:border-box}.layui-input-prefix{left:0;border-radius:2px 0 0 2px}.layui-input-suffix{right:0;border-radius:0 2px 2px 0}.layui-input-split{border-width:1px;border-style:solid}.layui-input-prefix .layui-icon,.layui-input-split .layui-icon,.layui-input-suffix .layui-icon{position:relative;font-size:16px;color:#5f5f5f;transition:all .3s}.layui-input-group{position:relative;display:table;box-sizing:border-box}.layui-input-group>*{display:table-cell;vertical-align:middle;position:relative}.layui-input-group .layui-input{padding-right:15px}.layui-input-group>.layui-input-prefix{width:auto;border-right:0}.layui-input-group>.layui-input-suffix{width:auto;border-left:0}.layui-input-group .layui-input-split{white-space:nowrap}.layui-input-wrap{position:relative;line-height:38px}.layui-input-wrap .layui-input{padding-right:35px}.layui-input-wrap .layui-input::-ms-clear,.layui-input-wrap .layui-input::-ms-reveal{display:none}.layui-input-wrap .layui-input-prefix+.layui-input,.layui-input-wrap .layui-input-prefix~* .layui-input{padding-left:35px}.layui-input-wrap .layui-input-split+.layui-input,.layui-input-wrap .layui-input-split~* .layui-input{padding-left:45px}.layui-input-wrap .layui-input-prefix~.layui-form-select{position:static}.layui-input-wrap .layui-input-prefix,.layui-input-wrap .layui-input-split,.layui-input-wrap .layui-input-suffix{pointer-events:none}.layui-input-wrap .layui-input:hover+.layui-input-split{border-color:#d2d2d2}.layui-input-wrap .layui-input:focus+.layui-input-split{border-color:#16b777}.layui-input-wrap .layui-input.layui-form-danger:focus+.layui-input-split{border-color:#ff5722}.layui-input-wrap .layui-input-prefix.layui-input-split{border-width:0;border-right-width:1px}.layui-input-wrap .layui-input-suffix.layui-input-split{border-width:0;border-left-width:1px}.layui-input-affix{line-height:38px}.layui-input-suffix .layui-input-affix{right:auto;left:-35px}.layui-input-affix .layui-icon{color:rgba(0,0,0,.8);pointer-events:auto!important;cursor:pointer}.layui-input-affix .layui-icon-clear{color:rgba(0,0,0,.3)}.layui-input-affix .layui-icon:hover{color:rgba(0,0,0,.6)}.layui-input-wrap .layui-input-number{width:24px;padding:0}.layui-input-wrap .layui-input-number .layui-icon{position:absolute;right:0;width:100%;height:50%;line-height:normal;font-size:12px}.layui-input-wrap .layui-input-number .layui-icon:before{position:absolute;left:50%;top:50%;margin-top:-6px;margin-left:-6px}.layui-input-wrap .layui-input-number .layui-icon-up{top:0;border-bottom:1px solid #eee}.layui-input-wrap .layui-input-number .layui-icon-down{bottom:0}.layui-input-wrap .layui-input-number .layui-icon:hover{font-weight:700}.layui-input-wrap .layui-input[type=number]::-webkit-inner-spin-button,.layui-input-wrap .layui-input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none!important}.layui-input-wrap .layui-input[type=number]{-moz-appearance:textfield}.layui-input-wrap .layui-input[type=number].layui-input-number-out-of-range{color:#ff5722}.layui-form-select{position:relative;color:#5f5f5f}.layui-form-select .layui-input{padding-right:30px;cursor:pointer}.layui-form-select .layui-edge{position:absolute;right:10px;top:50%;margin-top:-3px;cursor:pointer;border-width:6px;border-top-color:#c2c2c2;border-top-style:solid;transition:all .3s;-webkit-transition:all .3s}.layui-form-select dl{display:none;position:absolute;left:0;top:42px;padding:5px 0;z-index:899;min-width:100%;border:1px solid #eee;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;box-shadow:1px 1px 4px rgb(0 0 0 / 8%);box-sizing:border-box}.layui-form-select dl dd,.layui-form-select dl dt{padding:0 10px;line-height:36px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.layui-form-select dl dt{font-size:12px;color:#999}.layui-form-select dl dd{cursor:pointer}.layui-form-select dl dd:hover{background-color:#f8f8f8;-webkit-transition:.5s all;transition:.5s all}.layui-form-select .layui-select-group dd{padding-left:20px}.layui-form-select dl dd.layui-select-tips{padding-left:10px!important;color:#999}.layui-form-select dl dd.layui-this{background-color:#f8f8f8;color:#16b777;font-weight:700}.layui-form-select dl dd.layui-disabled{background-color:#fff}.layui-form-selected dl{display:block}.layui-form-selected .layui-edge{margin-top:-9px;-webkit-transform:rotate(180deg);transform:rotate(180deg)}.layui-form-selected .layui-edge{margin-top:-3px\0}:root .layui-form-selected .layui-edge{margin-top:-9px\0/IE9}.layui-form-selectup dl{top:auto;bottom:42px}.layui-select-none{margin:5px 0;text-align:center;color:#999}.layui-select-panel-wrap{position:absolute;z-index:99999999}.layui-select-panel-wrap dl{position:relative;display:block;top:0}.layui-select-disabled .layui-disabled{border-color:#eee!important}.layui-select-disabled .layui-edge{border-top-color:#d2d2d2}.layui-form-checkbox{position:relative;display:inline-block;vertical-align:middle;height:30px;line-height:30px;margin-right:10px;padding-right:30px;background-color:#fff;cursor:pointer;font-size:0;-webkit-transition:.1s linear;transition:.1s linear;box-sizing:border-box}.layui-form-checkbox>*{display:inline-block;vertical-align:middle}.layui-form-checkbox>div{padding:0 11px;font-size:14px;border-radius:2px 0 0 2px;background-color:#d2d2d2;color:#fff;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.layui-form-checkbox>div>.layui-icon{line-height:normal}.layui-form-checkbox:hover>div{background-color:#c2c2c2}.layui-form-checkbox>i{position:absolute;right:0;top:0;width:30px;height:100%;border:1px solid #d2d2d2;border-left:none;border-radius:0 2px 2px 0;color:#fff;color:rgba(255,255,255,0);font-size:20px;text-align:center;box-sizing:border-box}.layui-form-checkbox:hover>i{border-color:#c2c2c2;color:#c2c2c2}.layui-form-checked,.layui-form-checked:hover{border-color:#16b777}.layui-form-checked:hover>div,.layui-form-checked>div{background-color:#16b777}.layui-form-checked:hover>i,.layui-form-checked>i{color:#16b777}.layui-form-item .layui-form-checkbox{margin-top:4px}.layui-form-checkbox.layui-checkbox-disabled>div{background-color:#eee!important}.layui-form [lay-checkbox]{display:none}.layui-form-checkbox[lay-skin=primary]{height:auto!important;line-height:normal!important;min-width:18px;min-height:18px;border:none!important;margin-right:0;padding-left:24px;padding-right:0;background:0 0}.layui-form-checkbox[lay-skin=primary]>div{margin-top:-1px;padding-left:0;padding-right:15px;line-height:18px;background:0 0;color:#5f5f5f}.layui-form-checkbox[lay-skin=primary]>i{right:auto;left:0;width:16px;height:16px;line-height:14px;border:1px solid #d2d2d2;font-size:12px;border-radius:2px;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-checkbox[lay-skin=primary]:hover>i{border-color:#16b777;color:#fff}.layui-form-checked[lay-skin=primary]>i{border-color:#16b777!important;background-color:#16b777;color:#fff}.layui-checkbox-disabled[lay-skin=primary]>div{background:0 0!important}.layui-form-checked.layui-checkbox-disabled[lay-skin=primary]>i{background:#eee!important;border-color:#eee!important}.layui-checkbox-disabled[lay-skin=primary]:hover>i{border-color:#d2d2d2}.layui-form-item .layui-form-checkbox[lay-skin=primary]{margin-top:10px}.layui-form-checkbox[lay-skin=primary]>.layui-icon-indeterminate{border-color:#16b777}.layui-form-checkbox[lay-skin=primary]>.layui-icon-indeterminate:before{content:'';display:inline-block;vertical-align:middle;position:relative;width:50%;height:1px;margin:-1px auto 0;background-color:#16b777}.layui-form-switch{position:relative;display:inline-block;vertical-align:middle;height:24px;line-height:22px;min-width:44px;padding:0 5px;margin-top:8px;border:1px solid #d2d2d2;border-radius:20px;cursor:pointer;box-sizing:border-box;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch>i{position:absolute;left:5px;top:3px;width:16px;height:16px;border-radius:20px;background-color:#d2d2d2;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch>div{position:relative;top:0;margin-left:21px;padding:0!important;text-align:center!important;color:#999!important;font-style:normal!important;font-size:12px}.layui-form-onswitch{border-color:#16b777;background-color:#16b777}.layui-form-onswitch>i{left:100%;margin-left:-21px;background-color:#fff}.layui-form-onswitch>div{margin-left:0;margin-right:21px;color:#fff!important}.layui-form-checkbox[lay-skin=none] *,.layui-form-radio[lay-skin=none] *{box-sizing:border-box}.layui-form-checkbox[lay-skin=none],.layui-form-radio[lay-skin=none]{position:relative;min-height:20px;margin:0;padding:0;height:auto;line-height:normal}.layui-form-checkbox[lay-skin=none]>div,.layui-form-radio[lay-skin=none]>div{position:relative;top:0;left:0;cursor:pointer;z-index:10;color:inherit;background-color:inherit}.layui-form-checkbox[lay-skin=none]>i,.layui-form-radio[lay-skin=none]>i{display:none}.layui-form-checkbox[lay-skin=none].layui-checkbox-disabled>div,.layui-form-radio[lay-skin=none].layui-radio-disabled>div{cursor:not-allowed}.layui-checkbox-disabled{border-color:#eee!important}.layui-checkbox-disabled>div{color:#c2c2c2!important}.layui-checkbox-disabled>i{border-color:#eee!important}.layui-checkbox-disabled:hover>i{color:#fff!important}.layui-form-radio{display:inline-block;vertical-align:middle;line-height:28px;margin:6px 10px 0 0;padding-right:10px;cursor:pointer;font-size:0}.layui-form-radio>*{display:inline-block;vertical-align:middle;font-size:14px}.layui-form-radio>i{margin-right:8px;font-size:22px;color:#c2c2c2}.layui-form-radio:hover>*,.layui-form-radioed,.layui-form-radioed>i{color:#16b777}.layui-radio-disabled>i{color:#eee!important}.layui-radio-disabled>*{color:#c2c2c2!important}.layui-form [lay-radio]{display:none}.layui-form-pane .layui-form-label{width:110px;padding:8px 15px;height:38px;line-height:20px;border-width:1px;border-style:solid;border-radius:2px 0 0 2px;text-align:center;background-color:#fafafa;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;box-sizing:border-box}.layui-form-pane .layui-input-inline{margin-left:-1px}.layui-form-pane .layui-input-block{margin-left:110px;left:-1px}.layui-form-pane .layui-input{border-radius:0 2px 2px 0}.layui-form-pane .layui-form-text .layui-form-label{float:none;width:100%;border-radius:2px;box-sizing:border-box;text-align:left}.layui-form-pane .layui-form-text .layui-input-inline{display:block;margin:0;top:-1px;clear:both}.layui-form-pane .layui-form-text .layui-input-block{margin:0;left:0;top:-1px}.layui-form-pane .layui-form-text .layui-textarea{min-height:100px;border-radius:0 0 2px 2px}.layui-form-pane .layui-form-checkbox{margin:4px 0 4px 10px}.layui-form-pane .layui-form-radio,.layui-form-pane .layui-form-switch{margin-top:6px;margin-left:10px}.layui-form-pane .layui-form-item[pane]{position:relative;border-width:1px;border-style:solid}.layui-form-pane .layui-form-item[pane] .layui-form-label{position:absolute;left:0;top:0;height:100%;border-width:0;border-right-width:1px}.layui-form-pane .layui-form-item[pane] .layui-input-inline{margin-left:110px}@media screen and (max-width:450px){.layui-form-item .layui-form-label{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-form-item .layui-inline{display:block;margin-right:0;margin-bottom:20px;clear:both}.layui-form-item .layui-inline:after{content:'\20';clear:both;display:block;height:0}.layui-form-item .layui-input-inline{display:block;float:none;left:-3px;width:auto!important;margin:0 0 10px 112px}.layui-form-item .layui-input-inline+.layui-form-mid{margin-left:110px;top:-5px;padding:0}.layui-form-item .layui-form-checkbox{margin-right:5px;margin-bottom:5px}}.layui-laypage{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;margin:10px 0;font-size:0}.layui-laypage>a:first-child,.layui-laypage>a:first-child em{border-radius:2px 0 0 2px}.layui-laypage>a:last-child,.layui-laypage>a:last-child em{border-radius:0 2px 2px 0}.layui-laypage>:first-child{margin-left:0!important}.layui-laypage>:last-child{margin-right:0!important}.layui-laypage a,.layui-laypage button,.layui-laypage input,.layui-laypage select,.layui-laypage span{border:1px solid #eee}.layui-laypage a,.layui-laypage span{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding:0 15px;height:28px;line-height:28px;margin:0 -1px 5px 0;background-color:#fff;color:#333;font-size:12px}.layui-laypage a[data-page]{color:#333}.layui-laypage a{text-decoration:none!important;cursor:pointer}.layui-laypage a:hover{color:#16baaa}.layui-laypage em{font-style:normal}.layui-laypage .layui-laypage-spr{color:#999;font-weight:700}.layui-laypage .layui-laypage-curr{position:relative}.layui-laypage .layui-laypage-curr em{position:relative;color:#fff}.layui-laypage .layui-laypage-curr .layui-laypage-em{position:absolute;left:-1px;top:-1px;padding:1px;width:100%;height:100%;background-color:#16baaa}.layui-laypage-em{border-radius:2px}.layui-laypage-next em,.layui-laypage-prev em{font-family:Sim sun;font-size:16px}.layui-laypage .layui-laypage-count,.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh,.layui-laypage .layui-laypage-skip{margin-left:10px;margin-right:10px;padding:0;border:none}.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh{vertical-align:top}.layui-laypage .layui-laypage-refresh i{font-size:18px;cursor:pointer}.layui-laypage select{height:22px;padding:3px;border-radius:2px;cursor:pointer}.layui-laypage .layui-laypage-skip{height:30px;line-height:30px;color:#999}.layui-laypage button,.layui-laypage input{height:30px;line-height:30px;border-radius:2px;vertical-align:top;background-color:#fff;box-sizing:border-box}.layui-laypage input{display:inline-block;width:40px;margin:0 10px;padding:0 3px;text-align:center}.layui-laypage input:focus,.layui-laypage select:focus{border-color:#16baaa!important}.layui-laypage button{margin-left:10px;padding:0 10px;cursor:pointer}.layui-flow-more{margin:10px 0;text-align:center;color:#999;font-size:14px;clear:both}.layui-flow-more a{height:32px;line-height:32px}.layui-flow-more a *{display:inline-block;vertical-align:top}.layui-flow-more a cite{padding:0 20px;border-radius:3px;background-color:#eee;color:#333;font-style:normal}.layui-flow-more a cite:hover{opacity:.8}.layui-flow-more a i{font-size:30px;color:#737383}.layui-table{width:100%;margin:10px 0;background-color:#fff;color:#5f5f5f}.layui-table tr{transition:all .3s;-webkit-transition:all .3s}.layui-table th{text-align:left;font-weight:600}.layui-table-mend{background-color:#fff}.layui-table-click,.layui-table-hover,.layui-table[lay-even] tbody tr:nth-child(even){background-color:#f8f8f8}.layui-table-checked{background-color:#dbfbf0}.layui-table-checked.layui-table-click,.layui-table-checked.layui-table-hover{background-color:#abf8dd}.layui-table-disabled-transition *,.layui-table-disabled-transition :after,.layui-table-disabled-transition :before{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}.layui-table td,.layui-table th,.layui-table-col-set,.layui-table-fixed-r,.layui-table-grid-down,.layui-table-header,.layui-table-mend,.layui-table-page,.layui-table-tips-main,.layui-table-tool,.layui-table-total,.layui-table-view,.layui-table[lay-skin=line],.layui-table[lay-skin=row]{border-width:1px;border-style:solid;border-color:#eee}.layui-table td,.layui-table th{position:relative;padding:9px 15px;min-height:20px;line-height:20px;font-size:14px}.layui-table[lay-skin=line] td,.layui-table[lay-skin=line] th{border-width:0;border-bottom-width:1px}.layui-table[lay-skin=row] td,.layui-table[lay-skin=row] th{border-width:0;border-right-width:1px}.layui-table[lay-skin=nob] td,.layui-table[lay-skin=nob] th{border:none}.layui-table img{max-width:100px}.layui-table[lay-size=lg] td,.layui-table[lay-size=lg] th{padding-top:15px;padding-right:30px;padding-bottom:15px;padding-left:30px}.layui-table-view .layui-table[lay-size=lg] .layui-table-cell{height:50px;line-height:40px}.layui-table[lay-size=sm] td,.layui-table[lay-size=sm] th{padding-top:5px;padding-right:10px;padding-bottom:5px;padding-left:10px;font-size:12px}.layui-table-view .layui-table[lay-size=sm] .layui-table-cell{height:30px;line-height:20px;padding-top:5px;padding-left:11px;padding-right:11px}.layui-table[lay-data],.layui-table[lay-options]{display:none}.layui-table-box{position:relative;overflow:hidden}.layui-table-view{clear:both;position:relative;border-right:none}.layui-table-view:after{content:"";position:absolute;top:0;right:0;width:1px;height:100%;background-color:#eee;z-index:101}.layui-table-view .layui-table{position:relative;width:auto;margin:0;border:0;border-collapse:separate}.layui-table-view .layui-table[lay-skin=line]{border-width:0;border-right-width:1px}.layui-table-view .layui-table[lay-skin=row]{border-width:0;border-bottom-width:1px}.layui-table-view .layui-table td,.layui-table-view .layui-table th{padding:0;border-top:none;border-left:none}.layui-table-view .layui-table th [lay-event],.layui-table-view .layui-table th.layui-unselect .layui-table-cell span{cursor:pointer}.layui-table-view .layui-table td,.layui-table-view .layui-table th span{cursor:default}.layui-table-view .layui-table td[data-edit]{cursor:text}.layui-table-view .layui-table td[data-edit]:hover:after{position:absolute;left:0;top:0;width:100%;height:100%;box-sizing:border-box;border:1px solid #16b777;pointer-events:none;content:""}.layui-table-view .layui-form-checkbox[lay-skin=primary] i{width:18px;height:18px;line-height:16px}.layui-table-view .layui-form-radio{line-height:0;padding:0}.layui-table-view .layui-form-radio>i{margin:0;font-size:20px}.layui-table-init{position:absolute;left:0;top:0;right:0;bottom:0;margin:0;z-index:199;transition:opacity .1s;user-select:none}.layui-table-loading-icon{position:absolute;width:100%\0;left:50%;left:auto\0;top:50%;margin-top:-15px\0;transform:translate(-50%,-50%);transform:none\0;text-align:center}.layui-table-loading-icon .layui-icon{font-size:30px;color:#c2c2c2}.layui-table-header{border-width:0;border-bottom-width:1px;overflow:hidden}.layui-table-header .layui-table{margin-bottom:-1px}.layui-table-column{position:relative;width:100%;min-height:41px;padding:8px 16px;border-width:0;border-bottom-width:1px}.layui-table-column .layui-btn-container{margin-bottom:-8px}.layui-table-column .layui-btn-container .layui-btn{margin-right:8px;margin-bottom:8px}.layui-table-tool .layui-inline[lay-event]{position:relative;width:26px;height:26px;padding:5px;line-height:16px;margin-right:10px;text-align:center;color:#333;border:1px solid #ccc;cursor:pointer;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool .layui-inline[lay-event]:hover{border:1px solid #999}.layui-table-tool-temp{padding-right:120px}.layui-table-tool-self{position:absolute;right:17px;top:10px}.layui-table-tool .layui-table-tool-self .layui-inline[lay-event]{margin:0 0 0 10px}.layui-table-tool-panel{position:absolute;top:29px;left:-1px;z-index:399;padding:5px 0!important;min-width:150px;min-height:40px;border:1px solid #d2d2d2;text-align:left;overflow-y:auto;background-color:#fff;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-table-tool-panel li{padding:0 10px;margin:0!important;line-height:30px;list-style-type:none!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary]{width:100%}.layui-table-tool-panel li:hover{background-color:#f8f8f8}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary]{padding-left:28px}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] i{position:absolute;left:0;top:0}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] span{padding:0}.layui-table-tool .layui-table-tool-self .layui-table-tool-panel{left:auto;right:-1px}.layui-table-col-set{position:absolute;right:0;top:0;width:20px;height:100%;border-width:0;border-left-width:1px;background-color:#fff}.layui-table-sort{width:10px;height:20px;margin-left:5px;cursor:pointer!important}.layui-table-sort .layui-edge{position:absolute;left:5px;border-width:5px}.layui-table-sort .layui-table-sort-asc{top:3px;border-top:none;border-bottom-style:solid;border-bottom-color:#b2b2b2}.layui-table-sort .layui-table-sort-asc:hover{border-bottom-color:#5f5f5f}.layui-table-sort .layui-table-sort-desc{bottom:5px;border-bottom:none;border-top-style:solid;border-top-color:#b2b2b2}.layui-table-sort .layui-table-sort-desc:hover{border-top-color:#5f5f5f}.layui-table-sort[lay-sort=asc] .layui-table-sort-asc{border-bottom-color:#000}.layui-table-sort[lay-sort=desc] .layui-table-sort-desc{border-top-color:#000}.layui-table-cell{height:38px;line-height:28px;padding:6px 15px;position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;box-sizing:border-box}.layui-table-cell .layui-form-checkbox[lay-skin=primary]{top:-1px;padding:0}.layui-table-cell .layui-form-checkbox[lay-skin=primary]>div{padding-left:24px}.layui-table-cell .layui-table-link{color:#01aaed}.layui-table-cell .layui-btn{vertical-align:inherit}.layui-table-cell[align=center]{-webkit-box-pack:center}.layui-table-cell[align=right]{-webkit-box-pack:end}.laytable-cell-checkbox,.laytable-cell-numbers,.laytable-cell-radio,.laytable-cell-space{text-align:center;-webkit-box-pack:center}.layui-table-body{position:relative;overflow:auto;margin-bottom:-1px}.layui-table-body .layui-none{line-height:26px;padding:30px 15px;text-align:center;color:#999}.layui-table-fixed{position:absolute;left:0;top:0;z-index:101}.layui-table-fixed .layui-table-body{overflow:hidden}.layui-table-fixed-l{box-shadow:1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r{left:auto;right:0;border-width:0;border-left-width:1px;box-shadow:-1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r .layui-table-header{position:relative;overflow:visible}.layui-table-mend{position:absolute;right:-49px;top:0;height:100%;width:50px;border-width:0;border-left-width:1px}.layui-table-tool{position:relative;width:100%;min-height:50px;line-height:30px;padding:10px 15px;border-width:0;border-bottom-width:1px}.layui-table-tool .layui-btn-container{margin-bottom:-10px}.layui-table-total{margin-bottom:-1px;border-width:0;border-top-width:1px;overflow:hidden}.layui-table-page{border-width:0;border-top-width:1px;margin-bottom:-1px;white-space:nowrap;overflow:hidden}.layui-table-page>div{height:26px}.layui-table-page .layui-laypage{margin:0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span{height:26px;line-height:26px;margin-bottom:10px;border:none;background:0 0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span.layui-laypage-curr{padding:0 12px}.layui-table-page .layui-laypage span{margin-left:0;padding:0}.layui-table-page .layui-laypage .layui-laypage-prev{margin-left:-11px!important}.layui-table-page .layui-laypage .layui-laypage-curr .layui-laypage-em{left:0;top:0;padding:0}.layui-table-page .layui-laypage button,.layui-table-page .layui-laypage input{height:26px;line-height:26px}.layui-table-page .layui-laypage input{width:40px}.layui-table-page .layui-laypage button{padding:0 10px}.layui-table-page select{height:18px}.layui-table-pagebar{float:right;line-height:23px}.layui-table-pagebar .layui-btn-sm{margin-top:-1px}.layui-table-pagebar .layui-btn-xs{margin-top:2px}.layui-table-view select[lay-ignore]{display:inline-block}.layui-table-patch .layui-table-cell{padding:0;width:30px}.layui-table-edit{position:absolute;left:0;top:0;z-index:189;min-width:100%;min-height:100%;padding:5px 14px;border-radius:0;box-shadow:1px 1px 20px rgba(0,0,0,.15);background-color:#fff}.layui-table-edit:focus{border-color:#16b777!important}input.layui-input.layui-table-edit{height:100%}select.layui-table-edit{padding:0 0 0 10px;border-color:#d2d2d2}.layui-table-view .layui-form-checkbox,.layui-table-view .layui-form-radio,.layui-table-view .layui-form-switch{top:0;margin:0}.layui-table-view .layui-form-checkbox{top:-1px;height:26px;line-height:26px}.layui-table-view .layui-form-checkbox i{height:26px}.layui-table-grid .layui-table-cell{overflow:visible}.layui-table-grid-down{position:absolute;top:0;right:0;width:24px;height:100%;padding:5px 0;border-width:0;border-left-width:1px;text-align:center;background-color:#fff;color:#999;cursor:pointer}.layui-table-grid-down .layui-icon{position:absolute;top:50%;left:50%;margin:-8px 0 0 -8px;font-size:14px}.layui-table-grid-down:hover{background-color:#fbfbfb}.layui-table-expanded{height:95px}.layui-table-expanded .layui-table-cell,.layui-table-view .layui-table[lay-size=lg] .layui-table-expanded .layui-table-cell,.layui-table-view .layui-table[lay-size=sm] .layui-table-expanded .layui-table-cell{height:auto;max-height:94px;white-space:normal;text-overflow:clip}.layui-table-cell-c{position:absolute;bottom:-10px;right:50%;margin-right:-9px;width:20px;height:20px;line-height:18px;cursor:pointer;text-align:center;background-color:#fff;border:1px solid #eee;border-radius:50%;z-index:1000;transition:.3s all;font-size:14px}.layui-table-cell-c:hover{border-color:#16b777}.layui-table-expanded td:hover .layui-table-cell{overflow:auto}.layui-table-main>.layui-table>tbody>tr:last-child>td>.layui-table-cell-c{bottom:0}body .layui-table-tips .layui-layer-content{background:0 0;padding:0;box-shadow:0 1px 6px rgba(0,0,0,.12)}.layui-table-tips-main{margin:-49px 0 0 -1px;max-height:150px;padding:8px 15px;font-size:14px;overflow-y:scroll;background-color:#fff;color:#5f5f5f}.layui-table-tips-c{position:absolute;right:-3px;top:-13px;width:20px;height:20px;padding:3px;cursor:pointer;background-color:#5f5f5f;border-radius:50%;color:#fff}.layui-table-tips-c:hover{background-color:#777}.layui-table-tips-c:before{position:relative;right:-2px}.layui-table-tree-nodeIcon{max-width:20px}.layui-table-tree-nodeIcon>*{width:100%}.layui-table-tree-flexIcon,.layui-table-tree-nodeIcon{margin-right:2px}.layui-table-tree-flexIcon{cursor:pointer}.layui-upload-file{display:none!important;opacity:.01;filter:Alpha(opacity=1)}.layui-upload-list{margin:11px 0}.layui-upload-choose{max-width:200px;padding:0 10px;color:#999;font-size:14px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-upload-drag{position:relative;display:inline-block;padding:30px;border:1px dashed #e2e2e2;background-color:#fff;text-align:center;cursor:pointer;color:#999}.layui-upload-drag .layui-icon{font-size:50px;color:#16baaa}.layui-upload-drag[lay-over]{border-color:#16baaa}.layui-upload-form{display:inline-block}.layui-upload-iframe{position:absolute;width:0;height:0;border:0;visibility:hidden}.layui-upload-wrap{position:relative;display:inline-block;vertical-align:middle}.layui-upload-wrap .layui-upload-file{display:block!important;position:absolute;left:0;top:0;z-index:10;font-size:100px;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-btn-container .layui-upload-choose{padding-left:0}.layui-menu{position:relative;margin:5px 0;background-color:#fff;box-sizing:border-box}.layui-menu *{box-sizing:border-box}.layui-menu li,.layui-menu-body-title,.layui-menu-body-title a{padding:5px 15px;color:initial}.layui-menu li{position:relative;margin:0 0 1px;line-height:26px;color:rgba(0,0,0,.8);font-size:14px;white-space:nowrap;cursor:pointer;transition:all .3s}.layui-menu li:hover{background-color:#f8f8f8}.layui-menu li.layui-disabled,.layui-menu li.layui-disabled *{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important}.layui-menu-item-parent:hover>.layui-menu-body-panel{display:block;animation-name:layui-fadein;animation-duration:.3s;animation-fill-mode:both;animation-delay:.2s}.layui-menu-item-group>.layui-menu-body-title,.layui-menu-item-parent>.layui-menu-body-title{padding-right:38px}.layui-menu .layui-menu-item-divider:hover,.layui-menu .layui-menu-item-group:hover,.layui-menu .layui-menu-item-none:hover{background:0 0;cursor:default}.layui-menu .layui-menu-item-group>ul{margin:5px 0 -5px}.layui-menu .layui-menu-item-group>.layui-menu-body-title{color:rgba(0,0,0,.35);user-select:none}.layui-menu .layui-menu-item-none{color:rgba(0,0,0,.35);cursor:default}.layui-menu .layui-menu-item-none{text-align:center}.layui-menu .layui-menu-item-divider{margin:5px 0;padding:0;height:0;line-height:0;border-bottom:1px solid #eee;overflow:hidden}.layui-menu .layui-menu-item-down:hover,.layui-menu .layui-menu-item-up:hover{cursor:pointer}.layui-menu .layui-menu-item-up>.layui-menu-body-title{color:rgba(0,0,0,.8)}.layui-menu .layui-menu-item-up>ul{visibility:hidden;height:0;overflow:hidden}.layui-menu .layui-menu-item-down>.layui-menu-body-title>.layui-icon-down{transform:rotate(180deg)}.layui-menu .layui-menu-item-up>.layui-menu-body-title>.layui-icon-up{transform:rotate(-180deg)}.layui-menu .layui-menu-item-down:hover>.layui-menu-body-title>.layui-icon,.layui-menu .layui-menu-item-up>.layui-menu-body-title:hover>.layui-icon{color:#000}.layui-menu .layui-menu-item-down>ul{visibility:visible;height:auto}.layui-menu .layui-menu-item-checked,.layui-menu .layui-menu-item-checked2{background-color:#f8f8f8!important;color:#16b777}.layui-menu .layui-menu-item-checked a,.layui-menu .layui-menu-item-checked2 a{color:#16b777}.layui-menu .layui-menu-item-checked:after{position:absolute;right:-1px;top:0;bottom:0;border-right:3px solid #16b777;content:""}.layui-menu-body-title{position:relative;margin:-5px -15px;overflow:hidden;text-overflow:ellipsis}.layui-menu-body-title a{display:block;margin:-5px -15px;color:rgba(0,0,0,.8)}.layui-menu-body-title a:hover{transition:all .3s}.layui-menu-body-title>.layui-icon{position:absolute;right:15px;top:50%;margin-top:-6px;line-height:normal;font-size:14px;transition:all .2s;-webkit-transition:all .2s}.layui-menu-body-title>.layui-icon:hover{transition:all .3s}.layui-menu-body-title>.layui-icon-right{right:14px}.layui-menu-body-panel{display:none;position:absolute;top:-7px;left:100%;z-index:1000;margin-left:13px;padding:5px 0}.layui-menu-body-panel:before{content:"";position:absolute;width:20px;left:-16px;top:0;bottom:0}.layui-menu-body-panel-left{left:auto;right:100%;margin:0 13px 0}.layui-menu-body-panel-left:before{left:auto;right:-16px}.layui-menu-lg li{line-height:32px}.layui-menu-lg .layui-menu-body-title a:hover,.layui-menu-lg li:hover{background:0 0;color:#16b777}.layui-menu-lg li .layui-menu-body-panel{margin-left:14px}.layui-menu-lg li .layui-menu-body-panel-left{margin:0 15px 0}.layui-dropdown{position:absolute;left:-999999px;top:-999999px;z-index:77777777;margin:5px 0;min-width:100px}.layui-dropdown:before{content:"";position:absolute;width:100%;height:6px;left:0;top:-6px}.layui-dropdown-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px");position:fixed;_position:absolute;pointer-events:auto}.layui-nav{position:relative;padding:0 15px;background-color:#2f363c;color:#fff;border-radius:2px;font-size:0;box-sizing:border-box}.layui-nav *{font-size:14px}.layui-nav .layui-nav-item{position:relative;display:inline-block;*display:inline;*zoom:1;margin-top:0;list-style:none;vertical-align:middle;line-height:60px}.layui-nav .layui-nav-item a{display:block;padding:0 20px;color:#fff;color:rgba(255,255,255,.7);transition:all .3s;-webkit-transition:all .3s}.layui-nav .layui-this:after,.layui-nav-bar{content:"";position:absolute;left:0;top:0;width:0;height:3px;background-color:#16b777;transition:all .2s;-webkit-transition:all .2s;pointer-events:none}.layui-nav-bar{z-index:1000}.layui-nav[lay-bar=disabled] .layui-nav-bar{display:none}.layui-nav .layui-nav-item a:hover,.layui-nav .layui-this a{color:#fff;text-decoration:none}.layui-nav .layui-this:after{top:auto;bottom:0;width:100%}.layui-nav-img{width:30px;height:30px;margin-right:10px;border-radius:50%}.layui-nav .layui-nav-more{position:absolute;top:0;right:3px;left:auto!important;margin-top:0;font-size:12px;cursor:pointer;transition:all .2s;-webkit-transition:all .2s}.layui-nav .layui-nav-mored,.layui-nav-itemed>a .layui-nav-more{transform:rotate(180deg)}.layui-nav-child{display:none;position:absolute;left:0;top:65px;min-width:100%;line-height:36px;padding:5px 0;box-shadow:0 2px 4px rgba(0,0,0,.12);border:1px solid #eee;background-color:#fff;z-index:100;border-radius:2px;white-space:nowrap;box-sizing:border-box}.layui-nav .layui-nav-child a{color:#5f5f5f;color:rgba(0,0,0,.8)}.layui-nav .layui-nav-child a:hover{background-color:#f8f8f8;color:rgba(0,0,0,.8)}.layui-nav-child dd{margin:1px 0;position:relative}.layui-nav-child dd.layui-this{background-color:#f8f8f8;color:#000}.layui-nav-child dd.layui-this:after{display:none}.layui-nav-child-r{left:auto;right:0}.layui-nav-child-c{text-align:center}.layui-nav.layui-nav-tree{width:200px;padding:0}.layui-nav-tree .layui-nav-item{display:block;width:100%;line-height:40px}.layui-nav-tree .layui-nav-item a{position:relative;height:40px;line-height:40px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-nav-tree .layui-nav-item>a{padding-top:5px;padding-bottom:5px}.layui-nav-tree .layui-nav-more{right:15px}.layui-nav-tree .layui-nav-item>a .layui-nav-more{padding:5px 0}.layui-nav-tree .layui-nav-bar{width:5px;height:0}.layui-side .layui-nav-tree .layui-nav-bar{width:2px}.layui-nav-tree .layui-nav-child dd.layui-this,.layui-nav-tree .layui-nav-child dd.layui-this a,.layui-nav-tree .layui-this,.layui-nav-tree .layui-this>a,.layui-nav-tree .layui-this>a:hover{background-color:#16baaa;color:#fff}.layui-nav-tree .layui-this:after{display:none}.layui-nav-itemed>a,.layui-nav-tree .layui-nav-title a,.layui-nav-tree .layui-nav-title a:hover{color:#fff!important}.layui-nav-tree .layui-nav-bar{background-color:#16baaa}.layui-nav-tree .layui-nav-child{position:relative;z-index:0;top:0;border:none;background:0 0;background-color:rgba(0,0,0,.3);box-shadow:none}.layui-nav-tree .layui-nav-child dd{margin:0}.layui-nav-tree .layui-nav-child a{color:#fff;color:rgba(255,255,255,.7)}.layui-nav-tree .layui-nav-child a:hover{background:0 0;color:#fff}.layui-nav-itemed>.layui-nav-child,.layui-nav-itemed>.layui-nav-child>.layui-this>.layui-nav-child{display:block}.layui-nav-side{position:fixed;top:0;bottom:0;left:0;overflow-x:hidden;z-index:999}.layui-nav-tree.layui-bg-gray a,.layui-nav.layui-bg-gray .layui-nav-item a{color:#373737;color:rgba(0,0,0,.8)}.layui-nav-tree.layui-bg-gray .layui-nav-itemed>a{color:#000!important}.layui-nav.layui-bg-gray .layui-this a{color:#16b777}.layui-nav-tree.layui-bg-gray .layui-nav-child{padding-left:11px;background:0 0}.layui-nav-tree.layui-bg-gray .layui-nav-child dd.layui-this,.layui-nav-tree.layui-bg-gray .layui-nav-child dd.layui-this a,.layui-nav-tree.layui-bg-gray .layui-this,.layui-nav-tree.layui-bg-gray .layui-this>a{background:0 0!important;color:#16b777!important;font-weight:700}.layui-nav-tree.layui-bg-gray .layui-nav-bar{background-color:#16b777}.layui-breadcrumb{visibility:hidden;font-size:0}.layui-breadcrumb>*{font-size:14px}.layui-breadcrumb a{color:#999!important}.layui-breadcrumb a:hover{color:#16b777!important}.layui-breadcrumb a cite{color:#5f5f5f;font-style:normal}.layui-breadcrumb span[lay-separator]{margin:0 10px;color:#999}.layui-tab{margin:10px 0;text-align:left!important}.layui-tab[overflow]>.layui-tab-title{overflow:hidden}.layui-tab .layui-tab-title{position:relative;left:0;height:40px;white-space:nowrap;font-size:0;transition:all .2s;-webkit-transition:all .2s}.layui-tab .layui-tab-title:after{content:"";border-bottom-color:#eee;border-bottom-width:1px;border-style:none none solid;bottom:0;left:0;right:auto;top:auto;pointer-events:none;position:absolute;width:100%;z-index:8}.layui-tab .layui-tab-title li{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;font-size:14px;transition:all .2s;-webkit-transition:all .2s}.layui-tab .layui-tab-title li{position:relative;line-height:40px;min-width:65px;margin:0;padding:0 15px;text-align:center;cursor:pointer}.layui-tab .layui-tab-title li a{display:block;padding:0 15px;margin:0 -15px}.layui-tab-title .layui-this{color:#000}.layui-tab-title .layui-this:after{position:absolute;left:0;top:0;content:"";width:100%;height:40px;border-width:1px;border-bottom-width:1px;border-style:solid;border-bottom-color:#fff;border-radius:2px 2px 0 0;box-sizing:border-box;pointer-events:none;z-index:9}.layui-tab-bar{box-sizing:border-box;position:absolute;right:0;top:0;z-index:10;width:30px;height:40px;line-height:40px;border-width:1px;border-style:solid;border-radius:2px;text-align:center;background-color:#fff;cursor:pointer}.layui-tab-bar .layui-icon{position:relative;display:inline-block;top:3px;transition:all .3s;-webkit-transition:all .3s}.layui-tab-item{display:none}.layui-tab-more{padding-right:30px;height:auto!important;white-space:normal!important}.layui-tab-more li.layui-this:after{border-bottom-color:#eee;border-radius:2px}.layui-tab-more .layui-tab-bar .layui-icon{top:-2px;top:3px\0;-webkit-transform:rotate(180deg);transform:rotate(180deg)}:root .layui-tab-more .layui-tab-bar .layui-icon{top:-2px\0/IE9}.layui-tab-content{padding:15px 0}.layui-tab-title li .layui-tab-close{position:relative;display:inline-block;width:18px;height:18px;line-height:20px;margin-left:8px;top:1px;text-align:center;font-size:14px;color:#c2c2c2;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li .layui-tab-close:hover{border-radius:2px;background-color:#ff5722;color:#fff}.layui-tab-brief>.layui-tab-title .layui-this{color:#16baaa}.layui-tab-brief>.layui-tab-more li.layui-this:after,.layui-tab-brief>.layui-tab-title .layui-this:after{border:none;border-radius:0;border-bottom:2px solid #16b777}.layui-tab-card{border-width:1px;border-style:solid;border-radius:2px;box-shadow:0 2px 5px 0 rgba(0,0,0,.1)}.layui-tab-card>.layui-tab-title{background-color:#fafafa}.layui-tab-card>.layui-tab-title li{margin-right:-1px;margin-left:-1px}.layui-tab-card>.layui-tab-title .layui-this{background-color:#fff}.layui-tab-card>.layui-tab-title .layui-this:after{border-top:none;border-width:1px;border-bottom-color:#fff}.layui-tab-card>.layui-tab-title .layui-tab-bar{height:40px;line-height:40px;border-radius:0;border-top:none;border-right:none}.layui-tab-card>.layui-tab-more .layui-this{background:0 0;color:#16b777}.layui-tab-card>.layui-tab-more .layui-this:after{border:none}.layui-timeline{padding-left:5px}.layui-timeline-item{position:relative;padding-bottom:20px}.layui-timeline-axis{position:absolute;left:-5px;top:0;z-index:10;width:20px;height:20px;line-height:20px;background-color:#fff;color:#16b777;border-radius:50%;text-align:center;cursor:pointer}.layui-timeline-axis:hover{color:#ff5722}.layui-timeline-item:before{content:"";position:absolute;left:5px;top:0;z-index:0;width:1px;height:100%}.layui-timeline-item:first-child:before{display:block}.layui-timeline-item:last-child:before{display:none}.layui-timeline-content{padding-left:25px}.layui-timeline-title{position:relative;margin-bottom:10px;line-height:22px}.layui-badge,.layui-badge-dot,.layui-badge-rim{position:relative;display:inline-block;padding:0 6px;font-size:12px;text-align:center;background-color:#ff5722;color:#fff;border-radius:2px}.layui-badge{height:18px;line-height:18px}.layui-badge-dot{width:8px;height:8px;padding:0;border-radius:50%}.layui-badge-rim{height:18px;line-height:18px;border-width:1px;border-style:solid;background-color:#fff;color:#5f5f5f}.layui-btn .layui-badge,.layui-btn .layui-badge-dot{margin-left:5px}.layui-nav .layui-badge,.layui-nav .layui-badge-dot{position:absolute;top:50%;margin:-5px 6px 0}.layui-nav .layui-badge{margin-top:-10px}.layui-tab-title .layui-badge,.layui-tab-title .layui-badge-dot{left:5px;top:-2px}.layui-carousel{position:relative;left:0;top:0;background-color:#f8f8f8}.layui-carousel>[carousel-item]{position:relative;width:100%;height:100%;overflow:hidden}.layui-carousel>[carousel-item]:before{position:absolute;content:'\e63d';left:50%;top:50%;width:100px;line-height:20px;margin:-10px 0 0 -50px;text-align:center;color:#c2c2c2;font-family:layui-icon!important;font-size:30px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-carousel>[carousel-item]>*{display:none;position:absolute;left:0;top:0;width:100%;height:100%;background-color:#f8f8f8;transition-duration:.3s;-webkit-transition-duration:.3s}.layui-carousel-updown>*{-webkit-transition:.3s ease-in-out up;transition:.3s ease-in-out up}.layui-carousel-arrow{display:none\0;opacity:0;position:absolute;left:10px;top:50%;margin-top:-18px;width:36px;height:36px;line-height:36px;text-align:center;font-size:20px;border:none 0;border-radius:50%;background-color:rgba(0,0,0,.2);color:#fff;-webkit-transition-duration:.3s;transition-duration:.3s;cursor:pointer}.layui-carousel-arrow[lay-type=add]{left:auto!important;right:10px}.layui-carousel[lay-arrow=always] .layui-carousel-arrow{opacity:1;left:20px}.layui-carousel[lay-arrow=always] .layui-carousel-arrow[lay-type=add]{right:20px}.layui-carousel[lay-arrow=none] .layui-carousel-arrow{display:none}.layui-carousel-arrow:hover,.layui-carousel-ind ul:hover{background-color:rgba(0,0,0,.35)}.layui-carousel:hover .layui-carousel-arrow{display:block\0;opacity:1;left:20px}.layui-carousel:hover .layui-carousel-arrow[lay-type=add]{right:20px}.layui-carousel-ind{position:relative;top:-35px;width:100%;line-height:0!important;text-align:center;font-size:0}.layui-carousel[lay-indicator=outside]{margin-bottom:30px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind{top:10px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind ul{background-color:rgba(0,0,0,.5)}.layui-carousel[lay-indicator=none] .layui-carousel-ind{display:none}.layui-carousel-ind ul{display:inline-block;padding:5px;background-color:rgba(0,0,0,.2);border-radius:10px;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind ul li{display:inline-block;width:10px;height:10px;margin:0 3px;font-size:14px;background-color:#eee;background-color:rgba(255,255,255,.5);border-radius:50%;cursor:pointer;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind ul li:hover{background-color:rgba(255,255,255,.7)}.layui-carousel-ind ul li.layui-this{background-color:#fff}.layui-carousel>[carousel-item]>.layui-carousel-next,.layui-carousel>[carousel-item]>.layui-carousel-prev,.layui-carousel>[carousel-item]>.layui-this{display:block}.layui-carousel>[carousel-item]>.layui-this{left:0}.layui-carousel>[carousel-item]>.layui-carousel-prev{left:-100%}.layui-carousel>[carousel-item]>.layui-carousel-next{left:100%}.layui-carousel>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel>[carousel-item]>.layui-carousel-prev.layui-carousel-right{left:0}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-left{left:-100%}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-right{left:100%}.layui-carousel[lay-anim=updown] .layui-carousel-arrow{left:50%!important;top:20px;margin:0 0 0 -18px}.layui-carousel[lay-anim=updown] .layui-carousel-arrow[lay-type=add]{top:auto!important;bottom:20px}.layui-carousel[lay-anim=updown] .layui-carousel-ind{position:absolute;top:50%;right:20px;width:auto;height:auto}.layui-carousel[lay-anim=updown] .layui-carousel-ind ul{padding:3px 5px}.layui-carousel[lay-anim=updown] .layui-carousel-ind li{display:block;margin:6px 0}.layui-carousel[lay-anim=updown]>[carousel-item]>*{left:0!important}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next{top:100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-left{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-right{top:100%}.layui-carousel[lay-anim=fade]>[carousel-item]>*{left:0!important}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev{opacity:0}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{opacity:1}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-right{opacity:0}.layui-fixbar{position:fixed;right:16px;bottom:16px;z-index:999999}.layui-fixbar li{width:50px;height:50px;line-height:50px;margin-bottom:1px;text-align:center;cursor:pointer;font-size:30px;background-color:#9f9f9f;color:#fff;border-radius:2px;opacity:.95}.layui-fixbar li:hover{opacity:.85}.layui-fixbar li:active{opacity:1}.layui-fixbar .layui-fixbar-top{display:none;font-size:40px}body .layui-util-face{border:none;background:0 0}body .layui-util-face .layui-layer-content{padding:0;background-color:#fff;color:#5f5f5f;box-shadow:none}.layui-util-face .layui-layer-TipsG{display:none}.layui-util-face ul{position:relative;width:372px;padding:10px;border:1px solid #d9d9d9;background-color:#fff;box-shadow:0 0 20px rgba(0,0,0,.2)}.layui-util-face ul li{cursor:pointer;float:left;border:1px solid #e8e8e8;height:22px;width:26px;overflow:hidden;margin:-1px 0 0 -1px;padding:4px 2px;text-align:center}.layui-util-face ul li:hover{position:relative;z-index:2;border:1px solid #eb7350;background:#fff9ec}.layui-code{display:block;position:relative;padding:15px;line-height:20px;border:1px solid #eee;border-left-width:6px;background-color:#fff;color:#333;font-family:"Courier New",Consolas,"Lucida Console";font-size:12px}.layui-transfer-box,.layui-transfer-header,.layui-transfer-search{border-width:0;border-style:solid;border-color:#eee}.layui-transfer-box{position:relative;display:inline-block;vertical-align:middle;border-width:1px;width:200px;height:360px;border-radius:2px;background-color:#fff}.layui-transfer-box .layui-form-checkbox{width:100%;margin:0!important}.layui-transfer-header{height:38px;line-height:38px;padding:0 11px;border-bottom-width:1px}.layui-transfer-search{position:relative;padding:11px;border-bottom-width:1px}.layui-transfer-search .layui-input{height:32px;padding-left:30px;font-size:12px}.layui-transfer-search .layui-icon-search{position:absolute;left:20px;top:50%;line-height:normal;margin-top:-8px;color:#5f5f5f}.layui-transfer-active{margin:0 15px;display:inline-block;vertical-align:middle}.layui-transfer-active .layui-btn{display:block;margin:0;padding:0 15px;background-color:#16b777;border-color:#16b777;color:#fff}.layui-transfer-active .layui-btn-disabled{background-color:#fbfbfb;border-color:#eee;color:#d2d2d2}.layui-transfer-active .layui-btn:first-child{margin-bottom:15px}.layui-transfer-active .layui-btn .layui-icon{margin:0;font-size:14px!important}.layui-transfer-data{padding:5px 0;overflow:auto}.layui-transfer-data li{height:32px;line-height:32px;margin-top:0!important;padding:0 11px;list-style-type:none!important}.layui-transfer-data li:hover{background-color:#f8f8f8;transition:.5s all}.layui-transfer-data .layui-none{padding:15px 11px;text-align:center;color:#999}.layui-rate,.layui-rate *{display:inline-block;vertical-align:middle}.layui-rate{padding:11px 6px 11px 0;font-size:0}.layui-rate li{margin-top:0!important}.layui-rate li i.layui-icon{font-size:20px;color:#ffb800}.layui-rate li i.layui-icon{margin-right:5px;transition:all .3s;-webkit-transition:all .3s}.layui-rate li i:hover,.layui-rate-hover{cursor:pointer;transform:scale(1.12);-webkit-transform:scale(1.12)}.layui-rate[readonly] li i:hover{cursor:default;transform:scale(1)}.layui-colorpicker{width:38px;height:38px;border:1px solid #eee;padding:5px;border-radius:2px;line-height:24px;display:inline-block;cursor:pointer;transition:all .3s;-webkit-transition:all .3s;box-sizing:border-box}.layui-colorpicker:hover{border-color:#d2d2d2}.layui-colorpicker.layui-colorpicker-lg{width:44px;height:44px;line-height:30px}.layui-colorpicker.layui-colorpicker-sm{width:30px;height:30px;line-height:20px;padding:3px}.layui-colorpicker.layui-colorpicker-xs{width:22px;height:22px;line-height:16px;padding:1px}.layui-colorpicker-trigger-bgcolor{display:block;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);border-radius:2px}.layui-colorpicker-trigger-span{display:block;height:100%;box-sizing:border-box;border:1px solid rgba(0,0,0,.15);border-radius:2px;text-align:center}.layui-colorpicker-trigger-i{display:inline-block;color:#fff;font-size:12px}.layui-colorpicker-trigger-i.layui-icon-close{color:#999}.layui-colorpicker-main{position:absolute;left:-999999px;top:-999999px;z-index:77777777;width:280px;margin:5px 0;padding:7px;background:#fff;border:1px solid #d2d2d2;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-colorpicker-main-wrapper{height:180px;position:relative}.layui-colorpicker-basis{width:260px;height:100%;position:relative;overflow:hidden}.layui-colorpicker-basis-white{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(90deg,#fff,hsla(0,0%,100%,0))}.layui-colorpicker-basis-black{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(0deg,#000,transparent)}.layui-colorpicker-basis-cursor{width:10px;height:10px;border:1px solid #fff;border-radius:50%;position:absolute;top:0;right:100%;cursor:pointer;transform:translate(-50%,-50%)}.layui-colorpicker-side{position:absolute;top:0;right:0;width:12px;height:100%;background:linear-gradient(red,#ff0,#0f0,#0ff,#00f,#f0f,red)}.layui-colorpicker-side-slider{width:100%;height:5px;box-shadow:0 0 1px #888;box-sizing:border-box;background:#fff;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;left:0}.layui-colorpicker-main-alpha{display:none;height:12px;margin-top:7px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-alpha-bgcolor{height:100%;position:relative}.layui-colorpicker-alpha-slider{width:5px;height:100%;box-shadow:0 0 1px #888;box-sizing:border-box;background:#fff;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;top:0}.layui-colorpicker-main-pre{padding-top:7px;font-size:0}.layui-colorpicker-pre{width:20px;height:20px;border-radius:2px;display:inline-block;margin-left:6px;margin-bottom:7px;cursor:pointer}.layui-colorpicker-pre:nth-child(11n+1){margin-left:0}.layui-colorpicker-pre-isalpha{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-pre.layui-this{box-shadow:0 0 3px 2px rgba(0,0,0,.15)}.layui-colorpicker-pre>div{height:100%;border-radius:2px}.layui-colorpicker-main-input{text-align:right;padding-top:7px}.layui-colorpicker-main-input .layui-btn-container .layui-btn{margin:0 0 0 10px}.layui-colorpicker-main-input div.layui-inline{float:left;font-size:14px}.layui-colorpicker-main-input input.layui-input{width:168px;height:30px;color:#5f5f5f;padding-left:5px}.layui-slider{height:4px;background:#eee;border-radius:3px;position:relative;cursor:pointer}.layui-slider-bar{border-radius:3px;position:absolute;height:100%}.layui-slider-step{position:absolute;top:0;width:4px;height:4px;border-radius:50%;background:#fff;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.layui-slider-wrap{width:36px;height:36px;position:absolute;top:-16px;-webkit-transform:translateX(-50%);transform:translateX(-50%);z-index:10;text-align:center}.layui-slider-wrap-btn{width:12px;height:12px;border-radius:50%;background:#fff;display:inline-block;vertical-align:middle;cursor:pointer;transition:.3s}.layui-slider-wrap:after{content:"";height:100%;display:inline-block;vertical-align:middle}.layui-slider-wrap-btn.layui-slider-hover,.layui-slider-wrap-btn:hover{transform:scale(1.2)}.layui-slider-wrap-btn.layui-disabled:hover{transform:scale(1)!important}.layui-slider-tips{position:absolute;top:-42px;z-index:77777777;white-space:nowrap;-webkit-transform:translateX(-50%);transform:translateX(-50%);color:#fff;background:#000;border-radius:3px;height:25px;line-height:25px;padding:0 10px}.layui-slider-tips:after{content:"";position:absolute;bottom:-12px;left:50%;margin-left:-6px;width:0;height:0;border-width:6px;border-style:solid;border-color:#000 transparent transparent transparent}.layui-slider-input{width:70px;height:32px;border:1px solid #eee;border-radius:3px;font-size:16px;line-height:32px;position:absolute;right:0;top:-14px;box-sizing:border-box}.layui-slider-input-btn{position:absolute;top:0;right:0;width:20px;height:100%;border-left:1px solid #eee}.layui-slider-input-btn i{cursor:pointer;position:absolute;right:0;bottom:0;width:20px;height:50%;font-size:12px;line-height:16px;text-align:center;color:#999}.layui-slider-input-btn i:first-child{top:0;border-bottom:1px solid #eee}.layui-slider-input-txt{height:100%;font-size:14px}.layui-slider-input-txt input{height:100%;border:none;padding-right:21px}.layui-slider-input-btn i:hover{color:#16baaa}.layui-slider-vertical{width:4px;margin-left:33px}.layui-slider-vertical .layui-slider-bar{width:4px}.layui-slider-vertical .layui-slider-step{top:auto;left:0;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-wrap{top:auto;left:-16px;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-tips{top:auto;left:2px}@media \0screen{.layui-slider-wrap-btn{margin-left:-20px}.layui-slider-vertical .layui-slider-wrap-btn{margin-left:0;margin-bottom:-20px}.layui-slider-vertical .layui-slider-tips{margin-left:-8px}.layui-slider>span{margin-left:8px}}.layui-tree{line-height:22px}.layui-tree .layui-form-checkbox{margin:0!important}.layui-tree-set{width:100%;position:relative}.layui-tree-pack{display:none;padding-left:20px;position:relative}.layui-tree-line .layui-tree-pack{padding-left:27px}.layui-tree-line .layui-tree-set .layui-tree-set:after{content:"";position:absolute;top:14px;left:-9px;width:17px;height:0;border-top:1px dotted #c0c4cc}.layui-tree-entry{position:relative;padding:3px 0;height:26px;white-space:nowrap}.layui-tree-entry:hover{background-color:#eee}.layui-tree-line .layui-tree-entry:hover{background-color:rgba(0,0,0,0)}.layui-tree-line .layui-tree-entry:hover .layui-tree-txt{color:#999;text-decoration:underline;transition:.3s}.layui-tree-main{display:inline-block;vertical-align:middle;cursor:pointer;padding-right:10px}.layui-tree-line .layui-tree-set:before{content:"";position:absolute;top:0;left:-9px;width:0;height:100%;border-left:1px dotted #c0c4cc}.layui-tree-line .layui-tree-set.layui-tree-setLineShort:before{height:13px}.layui-tree-line .layui-tree-set.layui-tree-setHide:before{height:0}.layui-tree-iconClick{display:inline-block;vertical-align:middle;position:relative;height:20px;line-height:20px;margin:0 10px;color:#c0c4cc}.layui-tree-icon{height:14px;line-height:12px;width:14px;text-align:center;border:1px solid #c0c4cc}.layui-tree-iconClick .layui-icon{font-size:18px}.layui-tree-icon .layui-icon{font-size:12px;color:#5f5f5f}.layui-tree-iconArrow{padding:0 5px}.layui-tree-iconArrow:after{content:"";position:absolute;left:4px;top:3px;z-index:100;width:0;height:0;border-width:5px;border-style:solid;border-color:transparent transparent transparent #c0c4cc;transition:.5s}.layui-tree-spread>.layui-tree-entry .layui-tree-iconClick>.layui-tree-iconArrow:after{transform:rotate(90deg) translate(3px,4px)}.layui-tree-txt{display:inline-block;vertical-align:middle;color:#555}.layui-tree-search{margin-bottom:15px;color:#5f5f5f}.layui-tree-btnGroup{visibility:hidden;display:inline-block;vertical-align:middle;position:relative}.layui-tree-btnGroup .layui-icon{display:inline-block;vertical-align:middle;padding:0 2px;cursor:pointer}.layui-tree-btnGroup .layui-icon:hover{color:#999;transition:.3s}.layui-tree-entry:hover .layui-tree-btnGroup{visibility:visible}.layui-tree-editInput{position:relative;display:inline-block;vertical-align:middle;height:20px;line-height:20px;padding:0;border:none;background-color:rgba(0,0,0,.05)}.layui-tree-emptyText{text-align:center;color:#999}.layui-anim{-webkit-animation-duration:.3s;-webkit-animation-fill-mode:both;animation-duration:.3s;animation-fill-mode:both}.layui-anim.layui-icon{display:inline-block}.layui-anim-loop{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.layui-trans,.layui-trans a{transition:all .2s;-webkit-transition:all .2s}@-webkit-keyframes layui-rotate{from{-webkit-transform:rotate(0)}to{-webkit-transform:rotate(360deg)}}@keyframes layui-rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}.layui-anim-rotate{-webkit-animation-name:layui-rotate;animation-name:layui-rotate;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-timing-function:linear;animation-timing-function:linear}@-webkit-keyframes layui-up{from{-webkit-transform:translate3d(0,100%,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-up{from{transform:translate3d(0,100%,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-up{-webkit-animation-name:layui-up;animation-name:layui-up}@-webkit-keyframes layui-upbit{from{-webkit-transform:translate3d(0,15px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-upbit{from{transform:translate3d(0,15px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-upbit{-webkit-animation-name:layui-upbit;animation-name:layui-upbit}@keyframes layui-down{0%{opacity:.3;transform:translate3d(0,-100%,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-anim-down{animation-name:layui-down}@keyframes layui-downbit{0%{opacity:.3;transform:translate3d(0,-5px,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-anim-downbit{animation-name:layui-downbit}@-webkit-keyframes layui-scale{0%{opacity:.3;-webkit-transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale{0%{opacity:.3;-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-ms-transform:scale(1);transform:scale(1)}}.layui-anim-scale{-webkit-animation-name:layui-scale;animation-name:layui-scale}@-webkit-keyframes layui-scale-spring{0%{opacity:.5;-webkit-transform:scale(.5)}80%{opacity:.8;-webkit-transform:scale(1.1)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale-spring{0%{opacity:.5;transform:scale(.5)}80%{opacity:.8;transform:scale(1.1)}100%{opacity:1;transform:scale(1)}}.layui-anim-scaleSpring{-webkit-animation-name:layui-scale-spring;animation-name:layui-scale-spring}@keyframes layui-scalesmall{0%{opacity:.3;transform:scale(1.5)}100%{opacity:1;transform:scale(1)}}.layui-anim-scalesmall{animation-name:layui-scalesmall}@keyframes layui-scalesmall-spring{0%{opacity:.3;transform:scale(1.5)}80%{opacity:.8;transform:scale(.9)}100%{opacity:1;transform:scale(1)}}.layui-anim-scalesmall-spring{animation-name:layui-scalesmall-spring}@-webkit-keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}@keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}.layui-anim-fadein{-webkit-animation-name:layui-fadein;animation-name:layui-fadein}@-webkit-keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}@keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}.layui-anim-fadeout{-webkit-animation-name:layui-fadeout;animation-name:layui-fadeout}html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-wrap{font-size:13px;font-family:"Courier New",Consolas,"Lucida Console"}.layui-code-view{display:block;position:relative;padding:0!important;border:1px solid #eee;border-left-width:6px;background-color:#fff;color:#333}.layui-code-view pre{margin:0!important}.layui-code-header{position:relative;z-index:3;padding:0 11px;height:40px;line-height:40px;border-bottom:1px solid #eee;background-color:#fafafa;font-size:12px}.layui-code-header>.layui-code-header-about{position:absolute;right:11px;top:0;color:#b7b7b7}.layui-code-header-about>a{padding-left:10px}.layui-code-wrap{position:relative;display:block;z-index:1;margin:0!important;padding:11px 0!important;overflow-x:hidden;overflow-y:auto}.layui-code-line{position:relative;line-height:19px;margin:0!important}.layui-code-line-number{position:absolute;left:0;top:0;padding:0 8px;min-width:45px;height:100%;text-align:right;user-select:none;white-space:nowrap;overflow:hidden}.layui-code-line-content{padding:0 11px;word-wrap:break-word;white-space:pre-wrap}.layui-code-ln-mode>.layui-code-wrap>.layui-code-line{padding-left:45px}.layui-code-ln-side{position:absolute;left:0;top:0;bottom:0;z-index:0;width:45px;border-right:1px solid #eee;border-color:rgb(126 122 122 / 15%);background-color:#fafafa;pointer-events:none}.layui-code-nowrap>.layui-code-wrap{overflow:auto}.layui-code-nowrap>.layui-code-wrap>.layui-code-line>.layui-code-line-content{white-space:pre;word-wrap:normal}.layui-code-nowrap>.layui-code-ln-side{border-right-width:0!important;background:0 0!important}.layui-code-fixbar{position:absolute;top:8px;right:11px;padding-right:45px;z-index:5}.layui-code-fixbar>span{position:absolute;right:0;top:0;padding:0 8px;color:#777;transition:all .3s}.layui-code-fixbar>span:hover{color:#16b777}.layui-code-copy{display:none;cursor:pointer}.layui-code-preview>.layui-code-view>.layui-code-fixbar .layui-code-copy{display:none!important}.layui-code-view:hover>.layui-code-fixbar .layui-code-copy{display:block}.layui-code-view:hover>.layui-code-fixbar .layui-code-lang-marker{display:none}.layui-code-theme-dark,.layui-code-theme-dark>.layui-code-header{border-color:rgb(126 122 122 / 15%);background-color:#1f1f1f}.layui-code-theme-dark{border-width:1px;color:#ccc}.layui-code-theme-dark>.layui-code-ln-side{border-right-color:#2a2a2a;background:0 0;color:#6e7681}.layui-code textarea{display:none}.layui-code-preview>.layui-code,.layui-code-preview>.layui-code-view{margin:0}.layui-code-preview>.layui-tab{position:relative;z-index:1;margin-bottom:0}.layui-code-preview>.layui-tab>.layui-tab-title{border-width:0}.layui-code-preview .layui-code-item{display:none}.layui-code-item-preview{position:relative;padding:16px}.layui-code-item-preview>iframe{position:absolute;top:0;left:0;width:100%;height:100%;border:none}.layui-code-tools{position:absolute;right:11px;top:8px;line-height:normal}.layui-code-tools>i{display:inline-block;margin-left:6px;padding:3px;cursor:pointer}.layui-code-tools>i.layui-icon-file-b{color:#999}.layui-code-tools>i:hover{color:#16b777}.layui-code-full{position:fixed;left:0;top:0;z-index:1111111;width:100%;height:100%;background-color:#fff}.layui-code-full .layui-code-item{width:100%!important;border-width:0!important;border-top-width:1px!important}.layui-code-full .layui-code-item,.layui-code-full .layui-code-view,.layui-code-full .layui-code-wrap{height:calc(100vh - 51px)!important;box-sizing:border-box}.layui-code-full .layui-code-item-preview{overflow:auto}.layui-code-view.layui-code-hl{line-height:20px!important;border-left-width:1px}.layui-code-view.layui-code-hl>.layui-code-ln-side{background-color:transparent}.layui-code-theme-dark.layui-code-hl,.layui-code-theme-dark.layui-code-hl>.layui-code-ln-side{border-color:rgb(126 122 122 / 15%)}html #layuicss-laydate{display:none;position:absolute;width:1989px}.layui-laydate *{margin:0;padding:0}.layui-laydate,.layui-laydate *{box-sizing:border-box}.layui-laydate{position:absolute;z-index:99999999;margin:5px 0;border-radius:2px;font-size:14px;line-height:normal;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-laydate-main{width:272px}.layui-laydate-content td,.layui-laydate-header *,.layui-laydate-list li{transition-duration:.3s;-webkit-transition-duration:.3s}.layui-laydate-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px");position:fixed;_position:absolute;pointer-events:auto}@keyframes laydate-downbit{0%{opacity:.3;transform:translate3d(0,-5px,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-laydate{animation-name:laydate-downbit}.layui-laydate-static{position:relative;z-index:0;display:inline-block;margin:0;-webkit-animation:none;animation:none}.laydate-ym-show .laydate-next-m,.laydate-ym-show .laydate-prev-m{display:none!important}.laydate-ym-show .laydate-next-y,.laydate-ym-show .laydate-prev-y{display:inline-block!important}.laydate-ym-show .laydate-set-ym span[lay-type=month]{display:none!important}.laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-time-show .layui-laydate-header .layui-icon{display:none!important}.layui-laydate-header{position:relative;line-height:30px;padding:10px 70px 5px}.layui-laydate-header *{display:inline-block;vertical-align:bottom}.layui-laydate-header i{position:absolute;top:10px;padding:0 5px;color:#999;font-size:18px;cursor:pointer}.layui-laydate-header i.laydate-prev-y{left:15px}.layui-laydate-header i.laydate-prev-m{left:45px}.layui-laydate-header i.laydate-next-y{right:15px}.layui-laydate-header i.laydate-next-m{right:45px}.laydate-set-ym{width:100%;text-align:center;box-sizing:border-box;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.laydate-set-ym span{padding:0 10px;cursor:pointer}.laydate-time-text{cursor:default!important}.layui-laydate-content{position:relative;padding:10px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-laydate-content table{border-collapse:collapse;border-spacing:0}.layui-laydate-content td,.layui-laydate-content th{width:36px;height:30px;padding:0;text-align:center}.layui-laydate-content th{font-weight:400}.layui-laydate-content td{position:relative;cursor:pointer}.laydate-day-mark{position:absolute;left:0;top:0;width:100%;line-height:30px;font-size:12px;overflow:hidden}.laydate-day-mark::after{position:absolute;content:'';right:2px;top:2px;width:5px;height:5px;border-radius:50%}.laydate-day-holidays:before{position:absolute;left:0;top:0;font-size:12px;transform:scale(.7)}.laydate-day-holidays:before{content:'\4F11';color:#ff5722}.laydate-day-holidays[type=workdays]:before{content:'\73ED';color:inherit}.layui-laydate .layui-this .laydate-day-holidays:before{color:#fff}.layui-laydate-footer{position:relative;height:46px;line-height:26px;padding:10px}.layui-laydate-footer span{display:inline-block;vertical-align:top;height:26px;line-height:24px;padding:0 10px;border:1px solid #c9c9c9;border-radius:2px;background-color:#fff;font-size:12px;cursor:pointer;white-space:nowrap;transition:all .3s}.layui-laydate-footer span:hover{color:#16b777}.layui-laydate-footer span.layui-laydate-preview{cursor:default;border-color:transparent!important}.layui-laydate-footer span.layui-laydate-preview:hover{color:#777}.layui-laydate-footer span:first-child.layui-laydate-preview{padding-left:0}.laydate-footer-btns{position:absolute;right:10px;top:10px}.laydate-footer-btns span{margin:0 0 0 -1px;border-radius:0}.laydate-footer-btns span:first-child{border-radius:2px 0 0 2px}.laydate-footer-btns span:last-child{border-radius:0 2px 2px 0}.layui-laydate-shortcut{width:80px;padding:6px 0;display:inline-block;vertical-align:top;overflow:auto;max-height:276px;text-align:center}.layui-laydate-shortcut+.layui-laydate-main{display:inline-block;border-left:1px solid #e2e2e2}.layui-laydate-shortcut>li{padding:5px 8px;cursor:pointer;line-height:18px}.layui-laydate .layui-laydate-list{position:absolute;left:0;top:0;width:100%;height:100%;padding:10px;box-sizing:border-box;background-color:#fff}.layui-laydate .layui-laydate-list>li{position:relative;display:inline-block;width:33.3%;height:36px;line-height:36px;margin:3px 0;vertical-align:middle;text-align:center;cursor:pointer;list-style:none}.layui-laydate .laydate-month-list>li{width:25%;margin:17px 0}.laydate-time-list{display:table}.layui-laydate .laydate-time-list>li{display:table-cell;height:100%;margin:0;line-height:normal;cursor:default}.layui-laydate .laydate-time-list p{position:relative;top:-4px;margin:0;line-height:29px}.layui-laydate .laydate-time-list ol{height:181px;overflow:hidden}.layui-laydate .laydate-time-list>li:hover ol{overflow-y:auto}.layui-laydate .laydate-time-list ol li{width:130%;padding-left:33px;height:30px;line-height:30px;text-align:left;cursor:pointer}.layui-laydate .laydate-time-list-hide-1 ol li{padding-left:53px}.layui-laydate .laydate-time-list-hide-2 ol li{padding-left:117px}.layui-laydate-hint{position:absolute;top:115px;left:50%;width:250px;margin-left:-125px;line-height:20px;padding:15px;text-align:center;font-size:12px;color:#ff5722}.layui-laydate-range{width:546px}.layui-laydate-range .layui-laydate-main{display:inline-block;vertical-align:middle;max-width:50%}.layui-laydate-range .laydate-main-list-1 .layui-laydate-content,.layui-laydate-range .laydate-main-list-1 .layui-laydate-header{border-left:1px solid #e2e2e2}.layui-laydate-range.layui-laydate-linkage .laydate-main-list-0 .laydate-next-m,.layui-laydate-range.layui-laydate-linkage .laydate-main-list-0 .laydate-next-y,.layui-laydate-range.layui-laydate-linkage .laydate-main-list-1 .laydate-prev-m,.layui-laydate-range.layui-laydate-linkage .laydate-main-list-1 .laydate-prev-y{display:none}.layui-laydate-range.layui-laydate-linkage .laydate-main-list-1 .layui-laydate-content,.layui-laydate-range.layui-laydate-linkage .laydate-main-list-1 .layui-laydate-header{border-left-style:dashed}.layui-laydate,.layui-laydate-hint{border:1px solid #d2d2d2;box-shadow:0 2px 4px rgba(0,0,0,.12);background-color:#fff;color:#777}.layui-laydate-header{border-bottom:1px solid #e2e2e2}.layui-laydate-header i:hover,.layui-laydate-header span:hover{color:#16b777}.layui-laydate-content{border-top:none 0;border-bottom:none 0}.layui-laydate-content th{color:#333}.layui-laydate-content td{color:#777}.layui-laydate-content td.laydate-day-now{color:#16b777}.layui-laydate-content td.laydate-day-now:after{content:'';position:absolute;width:100%;height:30px;left:0;top:0;border:1px solid #16b777;box-sizing:border-box}.layui-laydate-linkage .layui-laydate-content td.laydate-selected>div{background-color:#cffae9;transition:all .3s}.layui-laydate-linkage .laydate-selected:hover>div{background-color:#cffae9!important}.layui-laydate-content td.laydate-selected:after,.layui-laydate-content td:hover:after{content:none}.layui-laydate-content td>div:hover,.layui-laydate-list li:hover,.layui-laydate-shortcut>li:hover{background-color:#eee;color:#333;transition:all .3s}.laydate-time-list li ol{margin:0;padding:0;border:1px solid #e2e2e2;border-left-width:0}.laydate-time-list li:first-child ol{border-left-width:1px}.laydate-time-list>li:hover{background:0 0}.layui-laydate-content .laydate-day-next,.layui-laydate-content .laydate-day-prev{color:#d2d2d2}.layui-laydate-linkage .laydate-selected.laydate-day-next>div,.layui-laydate-linkage .laydate-selected.laydate-day-prev>div{background:0 0!important}.layui-laydate-footer{border-top:1px solid #e2e2e2}.layui-laydate-hint{color:#ff5722}.laydate-day-mark::after{background-color:#16b777}.layui-laydate-content td.layui-this .laydate-day-mark::after{display:none}.layui-laydate-footer span[lay-type=date]{color:#16b777}.layui-laydate .layui-this,.layui-laydate .layui-this>div{background-color:#16b777!important;color:#fff!important}.layui-laydate .laydate-disabled,.layui-laydate .laydate-disabled:hover{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-laydate .layui-this.laydate-disabled,.layui-laydate .layui-this.laydate-disabled>div{background-color:#eee!important}.layui-laydate-content td>div{padding:7px 0;height:100%}.laydate-theme-molv{border:none}.laydate-theme-molv.layui-laydate-range{width:548px}.laydate-theme-molv .layui-laydate-main{width:274px}.laydate-theme-molv .layui-laydate-header{border:none;background-color:#16baaa}.laydate-theme-molv .layui-laydate-header i,.laydate-theme-molv .layui-laydate-header span{color:#f6f6f6}.laydate-theme-molv .layui-laydate-header i:hover,.laydate-theme-molv .layui-laydate-header span:hover{color:#fff}.laydate-theme-molv .layui-laydate-content{border:1px solid #e2e2e2;border-top:none;border-bottom:none}.laydate-theme-molv .laydate-main-list-1 .layui-laydate-content{border-left:none}.laydate-theme-molv .layui-this,.laydate-theme-molv .layui-this>div{background-color:#16baaa!important}.laydate-theme-molv .layui-laydate-footer{border:1px solid #e2e2e2}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li,.laydate-theme-grid .layui-laydate-content td,.laydate-theme-grid .layui-laydate-content thead{border:1px solid #e2e2e2}.layui-laydate-linkage.laydate-theme-grid .laydate-selected,.layui-laydate-linkage.laydate-theme-grid .laydate-selected:hover{background-color:#f2f2f2!important;color:#16baaa!important}.layui-laydate-linkage.laydate-theme-grid .laydate-selected.laydate-day-next,.layui-laydate-linkage.laydate-theme-grid .laydate-selected.laydate-day-prev{color:#d2d2d2!important}.laydate-theme-grid .laydate-month-list,.laydate-theme-grid .laydate-year-list{margin:1px 0 0 1px}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li{margin:0 -1px -1px 0}.laydate-theme-grid .laydate-year-list>li{height:43px;line-height:43px}.laydate-theme-grid .laydate-month-list>li{height:71px;line-height:71px}.laydate-theme-grid .layui-laydate-content td>div{height:29px;margin-top:-1px}.laydate-theme-circle .layui-laydate-content td.layui-this>div,.laydate-theme-circle .layui-laydate-content td>div{width:28px;height:28px;line-height:28px;border-radius:14px;margin:0 4px;padding:0}.layui-laydate.laydate-theme-circle .layui-laydate-content table td.layui-this{background-color:transparent!important}.laydate-theme-grid.laydate-theme-circle .layui-laydate-content td>div{margin:0 3.5px}.laydate-theme-fullpanel .layui-laydate-main{width:526px}.laydate-theme-fullpanel .layui-laydate-list{width:252px;left:272px}.laydate-theme-fullpanel .laydate-set-ym span{display:none}.laydate-theme-fullpanel .laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-theme-fullpanel .laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-theme-fullpanel .laydate-time-show .layui-laydate-header .layui-icon{display:inline-block!important}.laydate-theme-fullpanel .laydate-btns-time{display:none}.laydate-theme-fullpanel .laydate-time-list-hide-1 ol li{padding-left:49px}.laydate-theme-fullpanel .laydate-time-list-hide-2 ol li{padding-left:107px}html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{opacity:0;transition:opacity .35s cubic-bezier(.34,.69,.1,1);top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{-webkit-overflow-scrolling:touch}.layui-layer{top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #b2b2b2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(data:image/gif;base64,R0lGODlhJQAlAJECAL3L2AYrTv///wAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgACACwAAAAAJQAlAAACi5SPqcvtDyGYIFpF690i8xUw3qJBwUlSadmcLqYmGQu6KDIeM13beGzYWWy3DlB4IYaMk+Dso2RWkFCfLPcRvFbZxFLUDTt21BW56TyjRep1e20+i+eYMR145W2eefj+6VFmgTQi+ECVY8iGxcg35phGo/iDFwlTyXWphwlm1imGRdcnuqhHeop6UAAAIfkEBQoAAgAsEAACAAQACwAAAgWMj6nLXAAh+QQFCgACACwVAAUACgALAAACFZQvgRi92dyJcVJlLobUdi8x4bIhBQAh+QQFCgACACwXABEADAADAAACBYyPqcsFACH5BAUKAAIALBUAFQAKAAsAAAITlGKZwWoMHYxqtmplxlNT7ixGAQAh+QQFCgACACwQABgABAALAAACBYyPqctcACH5BAUKAAIALAUAFQAKAAsAAAIVlC+BGL3Z3IlxUmUuhtR2LzHhsiEFACH5BAUKAAIALAEAEQAMAAMAAAIFjI+pywUAIfkEBQoAAgAsBQAFAAoACwAAAhOUYJnAagwdjGq2amXGU1PuLEYBACH5BAUKAAIALBAAAgAEAAsAAAIFhI+py1wAIfkEBQoAAgAsFQAFAAoACwAAAhWUL4AIvdnciXFSZS6G1HYvMeGyIQUAIfkEBQoAAgAsFwARAAwAAwAAAgWEj6nLBQAh+QQFCgACACwVABUACgALAAACE5RgmcBqDB2MarZqZcZTU+4sRgEAIfkEBQoAAgAsEAAYAAQACwAAAgWEj6nLXAAh+QQFCgACACwFABUACgALAAACFZQvgAi92dyJcVJlLobUdi8x4bIhBQAh+QQFCgACACwBABEADAADAAACBYSPqcsFADs=) #fff center center no-repeat}.layui-layer-btn a,.layui-layer-setwin span{display:inline-block;vertical-align:middle;*display:inline;*zoom:1}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes layer-slide-down{from{transform:translate3d(0,-100%,0)}to{transform:translate3d(0,0,0)}}@keyframes layer-slide-down-out{from{transform:translate3d(0,0,0)}to{transform:translate3d(0,-100%,0)}}.layer-anim-slide-down{animation-name:layer-slide-down}.layer-anim-slide-down-out{animation-name:layer-slide-down-out}@keyframes layer-slide-left{from{transform:translate3d(100%,0,0)}to{transform:translate3d(0,0,0)}}@keyframes layer-slide-left-out{from{transform:translate3d(0,0,0)}to{transform:translate3d(100%,0,0)}}.layer-anim-slide-left{animation-name:layer-slide-left}.layer-anim-slide-left-out{animation-name:layer-slide-left-out}@keyframes layer-slide-up{from{transform:translate3d(0,100%,0)}to{transform:translate3d(0,0,0)}}@keyframes layer-slide-up-out{from{transform:translate3d(0,0,0)}to{transform:translate3d(0,100%,0)}}.layer-anim-slide-up{animation-name:layer-slide-up}.layer-anim-slide-up-out{animation-name:layer-slide-up-out}@keyframes layer-slide-right{from{transform:translate3d(-100%,0,0)}to{transform:translate3d(0,0,0)}}@keyframes layer-slide-right-out{from{transform:translate3d(0,0,0)}to{transform:translate3d(-100%,0,0)}}.layer-anim-slide-right{animation-name:layer-slide-right}.layer-anim-slide-right-out{animation-name:layer-slide-right-out}.layui-layer-title{padding:0 81px 0 16px;height:50px;line-height:50px;border-bottom:1px solid #f0f0f0;font-size:14px;color:#333;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:16px;font-size:0;line-height:initial}.layui-layer-setwin span{position:relative;width:16px;height:16px;line-height:18px;margin-left:10px;text-align:center;font-size:16px;cursor:pointer;color:#000;_overflow:hidden;box-sizing:border-box}.layui-layer-setwin .layui-layer-min:before{content:'';position:absolute;width:12px;border-bottom:1px solid #2e2d3c;left:50%;top:50%;margin:-.5px 0 0 -6px;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover:before{background-color:#2d93ca}.layui-layer-setwin .layui-layer-max:after,.layui-layer-setwin .layui-layer-max:before{content:'';position:absolute;left:50%;top:50%;z-index:1;width:9px;height:9px;margin:-5px 0 0 -5px;border:1px solid #2e2d3c}.layui-layer-setwin .layui-layer-max:hover:after,.layui-layer-setwin .layui-layer-max:hover:before{border-color:#2d93ca}.layui-layer-setwin .layui-layer-min:hover:before{background-color:#2d93ca}.layui-layer-setwin .layui-layer-maxmin:after,.layui-layer-setwin .layui-layer-maxmin:before{width:7px;height:7px;margin:-3px 0 0 -3px;background-color:#fff}.layui-layer-setwin .layui-layer-maxmin:after{z-index:0;margin:-5px 0 0 -1px}.layui-layer-setwin .layui-layer-close{cursor:pointer}.layui-layer-setwin .layui-layer-close:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;color:#fff;background-color:#787878;padding:3px;border:3px solid;width:28px;height:28px;font-size:16px;font-weight:bolder;border-radius:50%;margin-left:0;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{opacity:unset;background-color:#3888f6}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:30px;line-height:30px;margin:5px 5px 0;padding:0 16px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none;box-sizing:border-box}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:transparent;background-color:#1e9fff;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-btn-is-loading{opacity:.5!important;cursor:not-allowed!important;cursor:wait!important;overflow:hidden;white-space:nowrap;-webkit-user-select:none;-ms-user-select:none;user-select:none}.layui-layer-btn-is-loading .layui-layer-btn-loading-icon{margin-right:8px;font-size:14px}.layui-layer-dialog{min-width:240px}.layui-layer-dialog .layui-layer-content{position:relative;padding:16px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-face{position:absolute;top:18px;left:16px;color:#959595;font-size:32px;_left:-40px}.layui-layer-dialog .layui-layer-content .layui-icon-tips{color:#f39b12}.layui-layer-dialog .layui-layer-content .layui-icon-success{color:#16b777}.layui-layer-dialog .layui-layer-content .layui-icon-error{top:19px;color:#ff5722}.layui-layer-dialog .layui-layer-content .layui-icon-question{color:#ffb800}.layui-layer-dialog .layui-layer-content .layui-icon-lock{color:#787878}.layui-layer-dialog .layui-layer-content .layui-icon-face-cry{color:#ff5722}.layui-layer-dialog .layui-layer-content .layui-icon-face-smile{color:#16b777}.layui-layer-rim{border:6px solid #8d8d8d;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #d3d4d3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-close{color:#fff}.layui-layer-hui .layui-layer-content{padding:11px 24px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:18px 24px 18px 58px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:76px;height:38px;line-height:38px;text-align:center}.layui-layer-loading-icon{font-size:38px;color:#959595}.layui-layer-loading2{text-align:center}.layui-layer-loading-2{position:relative;height:38px}.layui-layer-loading-2:after,.layui-layer-loading-2:before{content:'';position:absolute;left:50%;top:50%;width:38px;height:38px;margin:-19px 0 0 -19px;border-radius:50%;border:3px solid #d2d2d2;box-sizing:border-box}.layui-layer-loading-2:after{border-color:transparent;border-left-color:#1e9fff}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan .layui-layer-title{background:#4476a7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;border-top:1px solid #e9e7e7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#e9e7e7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#c9c5c5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92b8b1}.layui-layer-lan .layui-layer-setwin .layui-icon,.layui-layer-molv .layui-layer-setwin .layui-icon{color:#fff}.layui-layer-win10{border:1px solid #aaa;box-shadow:1px 1px 6px rgba(0,0,0,.3);border-radius:none}.layui-layer-win10 .layui-layer-title{height:32px;line-height:32px;padding-left:8px;border-bottom:none;font-size:12px}.layui-layer-win10 .layui-layer-setwin{right:0;top:0}.layui-layer-win10 .layui-layer-setwin span{margin-left:0;width:32px;height:32px;padding:8px}.layui-layer-win10.layui-layer-page .layui-layer-setwin span{width:38px}.layui-layer-win10 .layui-layer-setwin span:hover{background-color:#e5e5e5}.layui-layer-win10 .layui-layer-setwin span.layui-icon-close:hover{background-color:#e81123;color:#fff}.layui-layer-win10.layui-layer-dialog .layui-layer-content{padding:8px 16px 32px;color:#0033bc}.layui-layer-win10.layui-layer-dialog .layui-layer-padding{padding-top:18px;padding-left:58px}.layui-layer-win10 .layui-layer-btn{padding:5px 5px 10px;border-top:1px solid #dfdfdf;background-color:#f0f0f0}.layui-layer-win10 .layui-layer-btn a{height:20px;line-height:18px;background-color:#e1e1e1;border-color:#adadad;color:#000;font-size:12px;transition:all .3s}.layui-layer-win10 .layui-layer-btn a:hover{border-color:#2a8edd;background-color:#e5f1fb}.layui-layer-win10 .layui-layer-btn .layui-layer-btn0{border-color:#0078d7}.layui-layer-prompt .layui-layer-input{display:block;width:260px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:16px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;display:inline-block;vertical-align:top;border-left:1px solid transparent;border-right:1px solid transparent;min-width:80px;max-width:300px;padding:0 16px;text-align:center;cursor:default;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:51px;border-left-color:#eee;border-right-color:#eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left-color:transparent}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{background:0 0;box-shadow:none}.layui-layer-photos .layui-layer-content{overflow:visible;text-align:center}.layui-layer-photos .layer-layer-photos-main img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-photos-next,.layui-layer-photos-prev{position:fixed;top:50%;width:52px;height:52px;line-height:52px;margin-top:-26px;cursor:pointer;font-size:52px;color:#717171}.layui-layer-photos-prev{left:32px}.layui-layer-photos-next{right:32px}.layui-layer-photos-next:hover,.layui-layer-photos-prev:hover{color:#959595}.layui-layer-photos-toolbar{position:fixed;left:0;right:0;bottom:0;width:100%;height:52px;line-height:52px;background-color:#000\9;filter:Alpha(opacity=60);background-color:rgba(0,0,0,.32);color:#fff;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;font-size:0}.layui-layer-photos-toolbar>*{display:inline-block;vertical-align:top;padding:0 16px;font-size:12px;color:#fff;*display:inline;*zoom:1}.layui-layer-photos-toolbar *{font-size:12px}.layui-layer-photos-header{top:0;bottom:auto}.layui-layer-photos-header>span{cursor:pointer}.layui-layer-photos-header>span:hover{background-color:rgba(51,51,51,.32)}.layui-layer-photos-header .layui-icon{font-size:18px}.layui-layer-photos-footer>h3{max-width:65%;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-layer-photos-footer a:hover{text-decoration:underline}.layui-layer-photos-footer em{font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}
\ No newline at end of file
diff --git a/public/static/assets/layui/css/modules/code.css b/public/static/assets/layui/css/modules/code.css
new file mode 100644
index 0000000000000000000000000000000000000000..a2ff92ae3b3521060ff121ab42871255c40de313
--- /dev/null
+++ b/public/static/assets/layui/css/modules/code.css
@@ -0,0 +1 @@
+html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-view{display:block;position:relative;margin:10px 0;padding:0;border:1px solid #eee;border-left-width:6px;background-color:#fafafa;color:#333;font-family:Courier New;font-size:13px}.layui-code-title{position:relative;padding:0 10px;height:40px;line-height:40px;border-bottom:1px solid #eee;font-size:12px}.layui-code-title>.layui-code-about{position:absolute;right:10px;top:0;color:#b7b7b7}.layui-code-about>a{padding-left:10px}.layui-code-view>.layui-code-ol,.layui-code-view>.layui-code-ul{position:relative;overflow:auto}.layui-code-view>.layui-code-ol>li{position:relative;margin-left:45px;line-height:20px;padding:0 10px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view>.layui-code-ol>li:first-child,.layui-code-view>.layui-code-ul>li:first-child{padding-top:10px}.layui-code-view>.layui-code-ol>li:last-child,.layui-code-view>.layui-code-ul>li:last-child{padding-bottom:10px}.layui-code-view>.layui-code-ul>li{position:relative;line-height:20px;padding:0 10px;list-style-type:none;*list-style-type:none;background-color:#fff}.layui-code-view pre{margin:0}.layui-code-dark{border:1px solid #0c0c0c;border-left-color:#3f3f3f;background-color:#0c0c0c;color:#c2be9e}.layui-code-dark>.layui-code-title{border-bottom:none}.layui-code-dark>.layui-code-ol>li,.layui-code-dark>.layui-code-ul>li{background-color:#3f3f3f;border-left:none}.layui-code-dark>.layui-code-ul>li{margin-left:6px}.layui-code-demo .layui-code{visibility:visible!important;margin:-15px;border-top:none;border-right:none;border-bottom:none}.layui-code-demo .layui-tab-content{padding:15px;border-top:none}
\ No newline at end of file
diff --git a/public/static/assets/layui/css/modules/laydate/default/laydate.css b/public/static/assets/layui/css/modules/laydate/default/laydate.css
new file mode 100644
index 0000000000000000000000000000000000000000..549ccb8081cdc7deef28d1e75506fb8bffead211
--- /dev/null
+++ b/public/static/assets/layui/css/modules/laydate/default/laydate.css
@@ -0,0 +1 @@
+html #layuicss-laydate{display:none;position:absolute;width:1989px}.layui-laydate *{margin:0;padding:0}.layui-laydate,.layui-laydate *{box-sizing:border-box}.layui-laydate{position:absolute;z-index:66666666;margin:5px 0;border-radius:2px;font-size:14px;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-laydate-main{width:272px}.layui-laydate-content td,.layui-laydate-header *,.layui-laydate-list li{transition-duration:.3s;-webkit-transition-duration:.3s}@keyframes laydate-downbit{0%{opacity:.3;transform:translate3d(0,-5px,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-laydate{animation-name:laydate-downbit}.layui-laydate-static{position:relative;z-index:0;display:inline-block;margin:0;-webkit-animation:none;animation:none}.laydate-ym-show .laydate-next-m,.laydate-ym-show .laydate-prev-m{display:none!important}.laydate-ym-show .laydate-next-y,.laydate-ym-show .laydate-prev-y{display:inline-block!important}.laydate-ym-show .laydate-set-ym span[lay-type=month]{display:none!important}.laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-time-show .layui-laydate-header .layui-icon{display:none!important}.layui-laydate-header{position:relative;line-height:30px;padding:10px 70px 5px}.layui-laydate-header *{display:inline-block;vertical-align:bottom}.layui-laydate-header i{position:absolute;top:10px;padding:0 5px;color:#999;font-size:18px;cursor:pointer}.layui-laydate-header i.laydate-prev-y{left:15px}.layui-laydate-header i.laydate-prev-m{left:45px}.layui-laydate-header i.laydate-next-y{right:15px}.layui-laydate-header i.laydate-next-m{right:45px}.laydate-set-ym{width:100%;text-align:center;box-sizing:border-box;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.laydate-set-ym span{padding:0 10px;cursor:pointer}.laydate-time-text{cursor:default!important}.layui-laydate-content{position:relative;padding:10px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-laydate-content table{border-collapse:collapse;border-spacing:0}.layui-laydate-content td,.layui-laydate-content th{width:36px;height:30px;padding:5px;text-align:center}.layui-laydate-content th{font-weight:400}.layui-laydate-content td{position:relative;cursor:pointer}.laydate-day-mark{position:absolute;left:0;top:0;width:100%;line-height:30px;font-size:12px;overflow:hidden}.laydate-day-mark::after{position:absolute;content:'';right:2px;top:2px;width:5px;height:5px;border-radius:50%}.laydate-day-holidays:before{position:absolute;left:0;top:0;font-size:12px;transform:scale(.7)}.laydate-day-holidays:before{content:'\4F11';color:#ff5722}.laydate-day-holidays[type=work]:before{content:'\73ED';color:inherit}.layui-laydate .layui-this .laydate-day-holidays:before{color:#fff}.layui-laydate-footer{position:relative;height:46px;line-height:26px;padding:10px}.layui-laydate-footer span{display:inline-block;vertical-align:top;height:26px;line-height:24px;padding:0 10px;border:1px solid #c9c9c9;border-radius:2px;background-color:#fff;font-size:12px;cursor:pointer;white-space:nowrap;transition:all .3s}.layui-laydate-footer span:hover{color:#5fb878}.layui-laydate-footer span.layui-laydate-preview{cursor:default;border-color:transparent!important}.layui-laydate-footer span.layui-laydate-preview:hover{color:#666}.layui-laydate-footer span:first-child.layui-laydate-preview{padding-left:0}.laydate-footer-btns{position:absolute;right:10px;top:10px}.laydate-footer-btns span{margin:0 0 0 -1px}.layui-laydate-list{position:absolute;left:0;top:0;width:100%;height:100%;padding:10px;box-sizing:border-box;background-color:#fff}.layui-laydate-list>li{position:relative;display:inline-block;width:33.3%;height:36px;line-height:36px;margin:3px 0;vertical-align:middle;text-align:center;cursor:pointer}.laydate-month-list>li{width:25%;margin:17px 0}.laydate-time-list>li{height:100%;margin:0;line-height:normal;cursor:default}.laydate-time-list p{position:relative;top:-4px;line-height:29px}.laydate-time-list ol{height:181px;overflow:hidden}.laydate-time-list>li:hover ol{overflow-y:auto}.laydate-time-list ol li{width:130%;padding-left:33px;height:30px;line-height:30px;text-align:left;cursor:pointer}.layui-laydate-hint{position:absolute;top:115px;left:50%;width:250px;margin-left:-125px;line-height:20px;padding:15px;text-align:center;font-size:12px;color:#ff5722}.layui-laydate-range{width:546px}.layui-laydate-range .layui-laydate-main{display:inline-block;vertical-align:middle}.layui-laydate-range .laydate-main-list-1 .layui-laydate-content,.layui-laydate-range .laydate-main-list-1 .layui-laydate-header{border-left:1px solid #e2e2e2}.layui-laydate,.layui-laydate-hint{border:1px solid #d2d2d2;box-shadow:0 2px 4px rgba(0,0,0,.12);background-color:#fff;color:#666}.layui-laydate-header{border-bottom:1px solid #e2e2e2}.layui-laydate-header i:hover,.layui-laydate-header span:hover{color:#5fb878}.layui-laydate-content{border-top:none 0;border-bottom:none 0}.layui-laydate-content th{color:#333}.layui-laydate-content td{color:#666}.layui-laydate-content td.laydate-selected{background-color:#b5fff8}.laydate-selected:hover{background-color:#00f7de!important}.layui-laydate-content td:hover,.layui-laydate-list li:hover{background-color:#eee;color:#333}.laydate-time-list li ol{margin:0;padding:0;border:1px solid #e2e2e2;border-left-width:0}.laydate-time-list li:first-child ol{border-left-width:1px}.laydate-time-list>li:hover{background:0 0}.layui-laydate-content .laydate-day-next,.layui-laydate-content .laydate-day-prev{color:#d2d2d2}.laydate-selected.laydate-day-next,.laydate-selected.laydate-day-prev{background-color:#f8f8f8!important}.layui-laydate-footer{border-top:1px solid #e2e2e2}.layui-laydate-hint{color:#ff5722}.laydate-day-mark::after{background-color:#5fb878}.layui-laydate-content td.layui-this .laydate-day-mark::after{display:none}.layui-laydate-footer span[lay-type=date]{color:#5fb878}.layui-laydate .layui-this{background-color:#009688!important;color:#fff!important}.layui-laydate .laydate-disabled,.layui-laydate .laydate-disabled:hover{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.laydate-theme-molv{border:none}.laydate-theme-molv.layui-laydate-range{width:548px}.laydate-theme-molv .layui-laydate-main{width:274px}.laydate-theme-molv .layui-laydate-header{border:none;background-color:#009688}.laydate-theme-molv .layui-laydate-header i,.laydate-theme-molv .layui-laydate-header span{color:#f6f6f6}.laydate-theme-molv .layui-laydate-header i:hover,.laydate-theme-molv .layui-laydate-header span:hover{color:#fff}.laydate-theme-molv .layui-laydate-content{border:1px solid #e2e2e2;border-top:none;border-bottom:none}.laydate-theme-molv .laydate-main-list-1 .layui-laydate-content{border-left:none}.laydate-theme-molv .layui-laydate-footer{border:1px solid #e2e2e2}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li,.laydate-theme-grid .layui-laydate-content td,.laydate-theme-grid .layui-laydate-content thead{border:1px solid #e2e2e2}.laydate-theme-grid .laydate-selected,.laydate-theme-grid .laydate-selected:hover{background-color:#f2f2f2!important;color:#009688!important}.laydate-theme-grid .laydate-selected.laydate-day-next,.laydate-theme-grid .laydate-selected.laydate-day-prev{color:#d2d2d2!important}.laydate-theme-grid .laydate-month-list,.laydate-theme-grid .laydate-year-list{margin:1px 0 0 1px}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li{margin:0 -1px -1px 0}.laydate-theme-grid .laydate-year-list>li{height:43px;line-height:43px}.laydate-theme-grid .laydate-month-list>li{height:71px;line-height:71px}
\ No newline at end of file
diff --git a/public/static/assets/layui/css/modules/layer/default/icon-ext.png b/public/static/assets/layui/css/modules/layer/default/icon-ext.png
new file mode 100644
index 0000000000000000000000000000000000000000..bbbb669bb311514baa5db3a6a00b4644d0e280f1
Binary files /dev/null and b/public/static/assets/layui/css/modules/layer/default/icon-ext.png differ
diff --git a/public/static/assets/layui/css/modules/layer/default/icon.png b/public/static/assets/layui/css/modules/layer/default/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..3e17da8b1aaae2935e19ac97d9015f0fe24e8770
Binary files /dev/null and b/public/static/assets/layui/css/modules/layer/default/icon.png differ
diff --git a/public/static/assets/layui/css/modules/layer/default/layer.css b/public/static/assets/layui/css/modules/layer/default/layer.css
new file mode 100644
index 0000000000000000000000000000000000000000..d5122e368fd27961ad58dd639a7f0b32b59dc294
--- /dev/null
+++ b/public/static/assets/layui/css/modules/layer/default/layer.css
@@ -0,0 +1 @@
+html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{-webkit-overflow-scrolling:touch}.layui-layer{top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #b2b2b2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(loading-1.gif) #eee center center no-repeat}.layui-layer-ico{background:url(icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:50px;line-height:50px;border-bottom:1px solid #f0f0f0;font-size:14px;color:#333;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:17px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2e2d3c;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2d93ca}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:1px -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:5px 5px 0;padding:0 15px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:#1e9fff;background-color:#1e9fff;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:300px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8d8d8d;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #d3d4d3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476a7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;text-align:right;border-top:1px solid #e9e7e7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#e9e7e7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#c9c5c5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92b8b1}.layui-layer-iconext{background:url(icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:260px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:20px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:300px;padding:0 20px;text-align:center;cursor:default;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:51px;border-left:1px solid #eee;border-right:1px solid #eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{background:0 0;box-shadow:none}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgnext,.layui-layer-imgprev{position:fixed;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:30px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:30px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:fixed;left:0;right:0;bottom:0;width:100%;height:40px;line-height:40px;background-color:#000\9;filter:Alpha(opacity=60);background-color:rgba(2,0,0,.35);color:#fff;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@media screen and (max-width:1100px){.layui-layer-iframe{overflow-y:auto;-webkit-overflow-scrolling:touch}}
\ No newline at end of file
diff --git a/public/static/assets/layui/css/modules/layer/default/loading-0.gif b/public/static/assets/layui/css/modules/layer/default/loading-0.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6f3c9539a22171cc2f12639492e346d97a9078e8
Binary files /dev/null and b/public/static/assets/layui/css/modules/layer/default/loading-0.gif differ
diff --git a/public/static/assets/layui/css/modules/layer/default/loading-1.gif b/public/static/assets/layui/css/modules/layer/default/loading-1.gif
new file mode 100644
index 0000000000000000000000000000000000000000..db3a483e4b74971fbfb1cc0fb6499852cedfe650
Binary files /dev/null and b/public/static/assets/layui/css/modules/layer/default/loading-1.gif differ
diff --git a/public/static/assets/layui/css/modules/layer/default/loading-2.gif b/public/static/assets/layui/css/modules/layer/default/loading-2.gif
new file mode 100644
index 0000000000000000000000000000000000000000..5bb90fd6a49107a321c35b9cee4a7b810314b51f
Binary files /dev/null and b/public/static/assets/layui/css/modules/layer/default/loading-2.gif differ
diff --git a/public/static/assets/layui/font/iconfont.eot b/public/static/assets/layui/font/iconfont.eot
new file mode 100644
index 0000000000000000000000000000000000000000..3f5e98bb584b80ae0ce0d39b598fb37423ea8220
Binary files /dev/null and b/public/static/assets/layui/font/iconfont.eot differ
diff --git a/public/static/assets/layui/font/iconfont.svg b/public/static/assets/layui/font/iconfont.svg
new file mode 100644
index 0000000000000000000000000000000000000000..4f1920deddba24bdb57bdc74a8abcc160f4d960f
--- /dev/null
+++ b/public/static/assets/layui/font/iconfont.svg
@@ -0,0 +1,405 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+  <metadata>Created by iconfont</metadata>
+  <defs>
+  <font id="layui-icon" horiz-adv-x="1024">
+    <font-face
+      font-family="layui-icon"
+      font-weight="400"
+      font-stretch="normal"
+      units-per-em="1024"
+      ascent="896"
+      descent="-128"
+    />
+      <missing-glyph />
+      
+      <glyph glyph-name="edge" unicode="&#59019;" d="M240.185509 821.062741C322.180562 871.479699 415.37494 897.48813 509.969233 895.934224 845.948962 895.934224 1023.938224 648.353161 1023.938224 456.964708c-0.199988-65.396055-25.998431-127.79229-71.795669-174.389479-45.797237-46.397201-107.993485-72.995596-173.389539-73.995536-150.390927 0-182.98896 46.197213-182.98896 63.996139 0 7.599542 2.399855 12.399252 9.599421 18.798866l1.99988 2.399855 0.799951 3.199807c20.998733 22.998612 31.798082 52.396839 31.798082 83.194981 0 157.390504-164.390082 285.382782-367.977799 285.382782-75.075471 0.599964-149.071006-17.798926-215.027027-53.796754 53.996742 115.03306 165.430019 195.188224 182.628981 207.627473 1.599903 1.099934 0.599964 1.679899 0.599964 1.679899z m31.198118-636.081624c-2.799831-59.99638 9.199445-119.992761 32.798021-174.389479 27.198359-52.796815 65.396055-101.993847 112.993183-138.591638-118.992821 22.998612-222.966548 87.794703-298.781974 178.589225C42.237452 143.383627 0 259.176641 0 380.169341c0 102.393822 124.792471 188.78861 271.983591 188.78861 73.195584 1.199928 144.791264-21.798685 203.587717-65.396054l-7.199566-2.399856c-102.993786-35.197876-196.988115-181.389056-196.988115-316.180924zM939.543315 95.986486l-1.399915-0.199987c-23.598576-37.597732-51.796875-70.195765-84.394908-98.994028-61.596284-55.996622-136.191783-90.99451-217.586873-99.793979-37.197756-0.599964-73.59556 6.399614-107.593509 22.798624-51.196911 20.598757-94.194317 59.99638-123.192567 105.993605-28.798263 47.797116-42.197454 103.393762-37.997708 159.190396-1.199928 40.197575 10.799348 80.595138 29.99819 116.392978 27.798323-66.196006 74.995475-122.592604 135.191844-161.590251 60.196368-38.997647 130.992097-58.996441 202.787766-57.196549 61.99626-0.599964 124.192507 13.399192 180.389116 40.997526l3.799771 1.799892c7.799529 4.599722 15.399071 7.799529 23.1986 0 8.999457-9.799409 3.599783-18.39889-2.399855-27.998311-0.399976-0.399976-0.599964-0.99994-0.799952-1.399916z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="leaf" unicode="&#59137;" d="M1017.948269 886.876437c-4.863707 5.785251-12.031275 9.113051-19.557222 9.113051l-26.110427 0c-258.032454 0.102394-461.847374 0.153591-611.905533-35.735447-80.635142-19.301237-142.992985-48.432282-190.606116-89.031436-51.401703-43.82456-86.420393-101.216302-107.155144-175.554223-13.77197-49.353826-20.222782-138.487656 6.96278-227.160714 10.034595-32.766026 25.700852-63.688963 46.589193-92.103251-62.255449-97.530124-116.063407-225.983185-116.063407-378.805977 0-14.130349 11.468109-25.598458 25.598458-25.598458s25.598458 11.468109 25.598458 25.598458c0 235.761795 139.665185 410.650458 222.91137 493.845446 59.7468 59.7468 127.275532 110.175762 195.367429 145.808815 63.381781 33.175601 123.947732 51.4529 170.536925 51.4529 14.130349 0 25.598458 11.468109 25.598458 25.598458s-11.468109 25.598458-25.598458 25.598458c-55.497456 0-122.667809-19.813206-194.241097-57.340545-72.597226-38.039308-144.477695-91.591282-207.80828-154.973063-26.72479-26.72479-58.876453-62.357843-90.823328-105.977615-12.389654 19.506025-22.014674 40.189579-28.619076 61.794677-25.598458 83.553366-16.178225 164.034917-6.604402 198.388047 73.211589 262.384191 351.313233 263.049751 855.858835 262.896161-60.156376-321.926204-172.328817-530.29765-333.599101-619.533873-149.597387-82.785412-297.966048-37.629733-354.845821-14.335136-11.980078 4.914904-24.06255 10.95614-35.786644 17.91892-12.133669 7.218765-27.851122 3.225406-35.069887-8.908263s-3.225406-27.851122 8.908263-35.069887c13.925561-8.2939 28.260697-15.461468 42.595834-21.349114 31.844481-13.004017 83.143791-29.694211 146.679163-35.172281 14.027955-1.228726 27.902319-1.791892 41.674289-1.791892 75.208269 0 145.860012 18.072511 210.675307 53.910352 82.375837 45.565255 153.641943 119.749585 211.904033 220.351524 68.296685 118.00889 119.698388 274.51786 152.720399 465.175173 1.279923 7.423553-0.767954 15.051893-5.631661 20.837145z"  horiz-adv-x="1025" />
+      
+      <glyph glyph-name="folder" unicode="&#60094;" d="M970.666667 682.666667H542.173333L429.793333 795.046667A52.986667 52.986667 0 0 1 392.08 810.666667H96a53.393333 53.393333 0 0 1-53.333333-53.333334v-704a53.393333 53.393333 0 0 1 53.333333-53.333333h874.666667a53.393333 53.393333 0 0 1 53.333333 53.333333V629.333333a53.393333 53.393333 0 0 1-53.333333 53.333334zM96 768h296.08a10.573333 10.573333 0 0 0 7.54-3.126667L481.826667 682.666667H96a53.546667 53.546667 0 0 1-10.666667-1.073334V757.333333a10.666667 10.666667 0 0 0 10.666667 10.666667z m885.333333-714.666667a10.666667 10.666667 0 0 0-10.666666-10.666666H96a10.666667 10.666667 0 0 0-10.666667 10.666666V629.333333a10.666667 10.666667 0 0 0 10.666667 10.666667h874.666667a10.666667 10.666667 0 0 0 10.666666-10.666667z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="folder-open" unicode="&#60097;" d="M1003.153333 491.04a52.933333 52.933333 0 0 1-42.38 20.96H896V629.333333a53.393333 53.393333 0 0 1-53.333333 53.333334H461.253333a10.573333 10.573333 0 0 0-7.54 3.126666L344.46 795.046667A52.986667 52.986667 0 0 1 306.746667 810.666667H53.333333a53.393333 53.393333 0 0 1-53.333333-53.333334v-704a53.393333 53.393333 0 0 1 53.333333-53.333333h796.893334a53.453333 53.453333 0 0 1 51.453333 39.333333l110.546667 405.333334a52.953333 52.953333 0 0 1-9.073334 46.373333zM53.333333 768h253.413334a10.573333 10.573333 0 0 0 7.54-3.126667l109.253333-109.253333A52.986667 52.986667 0 0 1 461.253333 640H842.666667a10.666667 10.666667 0 0 0 10.666666-10.666667v-117.333333H173.773333a53.453333 53.453333 0 0 1-51.453333-39.333333L42.666667 180.633333V757.333333a10.666667 10.666667 0 0 0 10.666666 10.666667z m917.726667-312.14l-110.546667-405.333333a10.666667 10.666667 0 0 0-10.286666-7.86H63.226667a10.666667 10.666667 0 0 0-10.286667 13.473333l110.546667 405.333333A10.666667 10.666667 0 0 0 173.773333 469.333333h787a10.666667 10.666667 0 0 0 10.286667-13.473333z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="gitee" unicode="&#59035;" d="M512-128C229.222-128 0 101.222 0 384S229.222 896 512 896s512-229.222 512-512-229.222-512-512-512z m259.149 568.883h-290.74a25.293 25.293 0 0 1-25.292-25.293l-0.026-63.206c0-13.952 11.315-25.293 25.267-25.293h177.024c13.978 0 25.293-11.315 25.293-25.267v-12.646a75.853 75.853 0 0 0-75.853-75.853h-240.23a25.293 25.293 0 0 0-25.267 25.293V478.797a75.853 75.853 0 0 0 75.827 75.853h353.946a25.293 25.293 0 0 1 25.267 25.292l0.077 63.207a25.293 25.293 0 0 1-25.268 25.293H417.152a189.62 189.62 0 0 1-189.62-189.645V124.85c0-13.977 11.316-25.293 25.294-25.293h372.94a170.65 170.65 0 0 1 170.65 170.65V415.616a25.293 25.293 0 0 1-25.293 25.267z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="github" unicode="&#59047;" d="M512 883.32190493c275.66730126 0 499.32190493-223.65460366 499.32190493-499.32190493 0-220.40901063-143.01411555-407.65472541-341.32813256-473.98131826-25.34058667-4.53550763-34.45321159 11.06830222-34.45321159 24.05067207 0 16.26957255 0.6657627 70.19633778 0.66576271 137.18869334 0 46.81142841-15.60380985 76.72913237-33.7874489 92.33294222 111.18234397 12.35821682 228.19011015 54.63413874 228.1901113 246.41536 0 54.63413874-19.51516445 98.82412715-51.34693604 133.9431003 5.20127033 13.02397952 22.09499477 63.70515285-5.20127033 132.61157604-41.61015922 13.02397952-137.18869333-51.34693603-137.18869333-51.34693604a469.36259015 469.36259015 0 0 1-249.6609519 0S291.63259904 689.58500523 250.02244096 676.56102571c-27.29626397-68.90642318-10.40253952-119.62920619-5.20127033-132.61157604-31.87338126-35.11897429-51.34693603-79.3089627-51.34693604-133.9431003 0-191.15706937 116.38361429-234.05714318 227.56595826-246.41536-14.31389411-13.02397952-27.29626397-35.11897429-31.87338126-66.95074588-28.62778937-13.02397952-101.44556715-35.11897429-144.96979285 41.61015921-27.29626397 47.47719111-76.72913237 51.34693603-76.72913351 51.34693604-48.76710571 0.6657627-3.24559189-30.54185699-3.2455919-30.541857 32.49753429-14.93804715 55.25829063-72.81777778 55.25829064-72.81777777 29.25194126-89.08735033 168.39631189-59.16964523 168.39631302-59.16964523 0-41.61015922 0.6657627-80.5988773 0.66576157-92.95709525 0-13.02397952-9.11262493-28.62778937-34.45321045-24.05067094C155.77543111-23.61311459000001 12.76131555 163.63259903999995 12.76131555 384.04160967c0 275.66730126 223.65460366 499.32190493 499.32190493 499.32190492zM201.87948715 166.21242937c1.28991459 2.62144-0.6657627 5.86703189-4.53550763 7.78109952-3.91135459 1.28991459-7.15694763 0.6657627-8.44686222-1.2899146-1.28991459-2.62144 0.6657627-5.86703189 4.53550763-7.78109952 3.24559189-1.9556773 7.15694763-1.28991459 8.44686222 1.2899146z m20.13931634-22.13660444c2.62144 1.9556773 1.9556773 6.49118493-1.2899146 10.40253952-3.24559189 3.24559189-7.78109952 4.53550763-10.40253952 1.95567729-2.62144-1.9556773-1.9556773-6.49118493 1.2899146-10.40253952 3.24559189-3.24559189 7.78109952-4.53550763 10.40253952-1.95567729z m19.51516444-29.25194127c3.24559189 2.62144 3.24559189 7.78109952 0 12.35821682-2.62144 4.53550763-7.78109952 6.49118493-11.06830222 3.91135459-3.24559189-1.9556773-3.24559189-7.15694763 0-11.69245411s8.44686222-6.49118493 11.06830222-4.53550763z m27.29626396-27.2962651c2.62144 2.62144 1.28991459 8.44686222-2.62144 12.35821795-4.53550763 4.53550763-10.40253952 5.20127033-13.02397952 1.9556773-3.24559189-2.62144-1.9556773-8.44686222 2.62144-12.35821682 4.53550763-4.53550763 10.40253952-5.20127033 13.02397952-1.95567843z m37.0746516-16.26957141c1.28991459 3.91135459-2.62144 8.44686222-8.44686223 10.40253952-5.20127033 1.28991459-11.06830222-0.6657627-12.35821681-4.53550763s2.62144-8.44686222 8.44686222-9.73677682c5.20127033-1.9556773 11.06830222 0 12.35821682 3.9113546z m40.94439651-3.24559304c0 4.53550763-5.20127033 7.78109952-11.06830222 7.15694763-5.86703189 0-10.40253952-3.24559189-10.40253952-7.15694763 0-4.53550763 4.53550763-7.78109952 11.06830222-7.15694648 5.86703189 0 10.40253952 3.24559189 10.40253952 7.15694648z m37.69880349 6.49118493c-0.6657627 3.91135459-5.86703189 6.49118493-11.69245412 5.86703303-5.86703189-1.28991459-9.73677682-5.20127033-9.11262492-9.73677796 0.6657627-3.91135459 5.86703189-6.49118493 11.69245411-5.20126918s9.73677682 5.20127033 9.11262493 9.11262492z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="disabled" unicode="&#59084;" d="M509.20496914 834c-245.9627332 0-447.20496914-201.24223594-447.20496914-447.20496914s201.24223594-447.20496914 447.20496914-447.20496914 447.20496914 201.24223594 447.20496914 447.20496914-201.24223594 447.20496914-447.20496914 447.20496914zM509.20496914-10.09937930000001C291.19254628-10.09937930000001 112.31055898 168.78260888 112.31055898 386.79503086c0 95.03105625 33.54037295 184.4720499 95.03105625 257.14285752l553.41614883-553.41614883C693.67701904 23.440993649999996 604.23602451-10.09937930000001 509.20496914-10.09937930000001z m296.27329131 134.16149092l-559.00621055 553.41614883C319.14285752 738.96894375 408.58385117 778.0993793 509.20496914 778.0993793c218.01242197 0 396.89441016-178.8819873 396.89441016-396.89441016 0-95.03105625-39.13043467-190.06211162-100.62111885-257.14285752z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="moon" unicode="&#59074;" d="M696.832 680.448c98.816-62.976 162.304-173.056 162.304-294.912 0-192.512-156.672-349.184-349.184-349.184-121.856 0-232.448 63.488-294.912 162.816h5.12c263.168 0 477.184 214.016 477.184 477.184-0.512 1.536-0.512 3.072-0.512 4.096m-78.336 103.936c9.216-34.304 14.336-70.656 14.336-108.032 0-228.352-184.832-413.184-413.184-413.184-37.376 0-73.728 5.12-108.544 14.336 47.616-175.616 207.872-305.152 398.848-305.152 228.352 0 413.184 184.832 413.184 413.184 0 190.976-129.024 351.232-304.64 398.848z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="error" unicode="&#59027;" d="M512-60.09287109000002c-245.26845703 0-444.09550781 198.82880859-444.09550781 444.09550781s198.82705078 444.09287109 444.09550781 444.09287109c245.26669922 0 444.09550781-198.82880859 444.09550781-444.09550781s-198.82880859-444.09287109-444.09550781-444.09287109zM512 772.58378906c-214.60166016 0-388.58378906-173.97861328-388.58378906-388.58378906s173.98125-388.58115234 388.58378906-388.58115234c214.60166016 0 388.58115234 173.97861328 388.58115234 388.58115234s-173.97861328 388.58378906-388.58115234 388.58378906zM551.41103516 383.85585937999997l117.60029297-117.62138672c10.84306641-10.82460938 10.84306641-28.40625 0-39.24580079-10.83955078-10.84306641-28.42119141-10.84306641-39.24580079 0l-117.62138671 117.60029297-118.39570313-118.39570312c-10.93271484-10.93095703-28.64091797-10.93095703-39.55517578 0-10.93271484 10.93095703-10.93271484 28.64091797 0 39.55693359l118.39570312 118.41240235-117.60292968 117.60292968c-10.84130859 10.84130859-10.84130859 28.40625 0 39.24931641 10.84306641 10.83955078 28.40625 10.83955078 39.2493164 0l117.60292969-117.60292969 119.28164063 119.28164063c10.93095703 10.91513672 28.64091797 10.91513672 39.55693359 0 10.93095703-10.93095703 10.93095703-28.64091797 0-39.57363281l-119.26757813-119.26582032z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="success" unicode="&#59031;" d="M661.31818174 521.04545479c10.22727305 12.27272695 30.68181826 14.31818174 42.95454521 4.09090868 12.27272695-10.22727305 14.31818174-30.68181826 4.09090957-42.95454521l-204.54545478-243.40909131c-10.22727305-12.27272695-30.68181826-14.31818174-42.95454522-4.09090869L327.90909131 345.13636347c-12.27272695 10.22727305-14.31818174 30.68181826-4.09090957 42.95454522 10.22727305 12.27272695 30.68181826 14.31818174 42.95454521 4.09090957l110.4545461-92.04545478 184.09090869 220.90909131zM512-66C262.45454521-66 62 134.45454521 62 384S262.45454521 834 512 834s450-200.45454521 450-450-200.45454521-450-450-450z m0 40.90909131c225 0 409.09090869 184.09090869 409.09090869 409.09090869S737 793.09090869 512 793.09090869 102.90909131 609 102.90909131 384s184.09090869-409.09090869 409.09090869-409.09090869z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="question" unicode="&#59033;" d="M468.125 159a37.50000029 37.50000029 0 1 1 37.50000029 37.50000029 37.50000029 37.50000029 0 0 1-37.50000029-37.50000029z m37.50000029 92.62500029h-3.00000058a31.5 31.5 0 0 0-28.49999942 34.49999971A203.24999971 203.24999971 0 0 0 549.50000029 400.12500029c56.62500029 56.62500029 57.75000029 74.99999971 58.5 93.74999942a81.37500029 81.37500029 0 0 1-23.25000058 60.75A98.62499971 98.62499971 0 0 1 512 584.99999971a94.5 94.5 0 0 1-94.5-94.5 31.5 31.5 0 1 0-63.37500029 0A157.5 157.5 0 0 0 512 646.50000029a162.37500029 162.37500029 0 0 0 117.74999971-50.25000058 144.37500029 144.37500029 0 0 0 39.75000029-105.75c-2.25-40.87500029-14.625-72.74999971-77.24999971-135-31.5-31.5-51.75-55.50000029-53.62500058-74.99999971a31.5 31.5 0 0 0-31.12499971-29.99999971z m277.875-139.87500029A386.62499971 386.62499971 0 1 0 361.99999971 740.24999971a386.62499971 386.62499971 0 0 0 423.37500029-629.62499971zM512 834a450 450 0 1 1 450-450A450 450 0 0 1 512 834z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="lock" unicode="&#59034;" d="M512-66A450 450 0 1 0 962 384 450.39130401 450.39130401 0 0 0 512-66z m0 860.86956533A410.86956533 410.86956533 0 1 1 922.86956533 384 411.26086934 411.26086934 0 0 1 512 794.86956533zM665.78260888 398.86956533h-14.47826132v78.26086934a139.69565244 139.69565244 0 0 1-279-7.82608711v-70.04347823h-11.73912979a19.95652177 19.95652177 0 0 1-19.95652178-20.34782577v-199.56521778a19.95652177 19.95652177 0 0 1 19.95652178-20.34782578h302.86956445a19.95652177 19.95652177 0 0 1 19.95652179 20.34782578v199.56521778a20.73913067 20.73913067 0 0 1-17.60869513 19.95652177z m-254.34782665 70.43478223a100.56521777 100.56521777 0 0 0 200.73913066 4.69565244v-74.73913067H411.43478223z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="eye" unicode="&#59029;" d="M513.92 449.493333a64 64 0 1 0-64-64 64 64 0 0 0 64 64m0 64a128 128 0 1 1 128-128 128 128 0 0 1-128 128zM512 606.2933330000001c128 0 257.706667-67.84 397.226667-207.146666a21.333333 21.333333 0 0 0 0-30.08C770.133333 229.54666699999996 640 161.70666700000004 512 161.70666700000004s-257.28 67.84-396.8 207.146666a21.333333 21.333333 0 0 0 0 30.08c139.52 139.52 268.8 207.36 396.8 207.36m0 64c-145.92 0-291.84-75.306667-442.453333-225.92a85.333333 85.333333 0 0 1 0-120.746666C220.586667 173.013333 366.506667 97.70666700000004 512 97.70666700000004s292.266667 75.306667 442.666667 225.92a85.333333 85.333333 0 0 1 0 120.746666C804.266667 594.986667 658.346667 670.293333 512 670.293333z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="eye-invisible" unicode="&#59030;" d="M386.346667 391.466667l121.813333 121.813333a128 128 0 0 1-121.813333-121.813333z m238.72 57.6L576 400.213333a64 64 0 0 0-76.8-76.8l-48.853333-48.853333a128 128 0 0 1 174.506666 174.506667zM109.013333 384a21.333333 21.333333 0 0 0 6.186667 15.146667c139.52 139.306667 268.8 207.146667 396.8 207.146666a372.266667 372.266667 0 0 0 79.786667-8.96l52.266666 52.266667a443.52 443.52 0 0 1-132.053333 21.333333c-145.92 0-291.84-75.306667-442.453333-225.92a85.333333 85.333333 0 0 1 0-120.746666 1063.04 1063.04 0 0 1 134.186666-115.2l45.866667 45.866666a985.813333 985.813333 0 0 0-134.4 114.133334 21.333333 21.333333 0 0 0-6.186667 14.933333z m845.653334 60.373333a966.613333 966.613333 0 0 1-185.813334 149.333334l-46.72-46.72a877.653333 877.653333 0 0 0 187.306667-147.2 21.333333 21.333333 0 0 0 0-30.08C770.133333 229.54666699999996 640 161.70666700000004 512 161.70666700000004a393.386667 393.386667 0 0 0-145.706667 29.013333l-48.64-48.64A466.133333 466.133333 0 0 1 512 97.70666700000004c145.92 0 291.84 75.306667 442.453333 225.92a85.333333 85.333333 0 0 1 0.213334 120.746666zM777.267604 692.049287m22.627417-22.627417l0 0q22.627417-22.627417 0-45.254834l-527.973064-527.973063q-22.627417-22.627417-45.254834 0l0 0q-22.627417 22.627417 0 45.254834l527.973064 527.973063q22.627417 22.627417 45.254834 0Z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="backspace" unicode="&#59028;" d="M484.46100645 268.09861505000003a28.76779355 28.76779355 0 0 0-20.34016344 49.107957l174.2671828 174.27268816a28.76779355 28.76779355 0 0 0 40.68473118-40.68032687l-174.2671828-174.27819355a28.6940215 28.6940215 0 0 0-20.34456774-8.42322581zM658.72708818 268.09861505000003a28.68301076 28.68301076 0 0 0-20.34016345 8.42322581l-174.26718279 174.27709248a28.76228818 28.76228818 0 0 0 0 40.68032687 28.75127742 28.75127742 0 0 0 40.68142795 0l174.2671828-174.27268816a28.77990537 28.77990537 0 0 0-20.34126451-49.107957zM834.5379785 74.81145805999995H340.57028818c-28.46940215 0-55.25305806 12.53684301-73.49016775 34.39428818L75.75838279 339.01887310999996c-10.54830108 13.06205592-16.20232258 28.91974194-16.1968172 44.98663226 0.00660645 15.39083011 4.67406452 29.85015053 13.50248602 41.81333334 0.33803011 0.45694624 0.68266666 0.90288172 1.04822366 1.33009892L266.70685592 658.36593548a95.32449032 95.32449032 0 0 0 73.86233118 34.82921291H834.5379785c51.98286452 0 94.27516559-42.28789677 94.27516558-94.27076129v-429.83776344c0-51.98286452-42.29230108-94.27516559-94.27516558-94.2751656zM119.01522581 391.16579785c-0.90728602-1.35872689-1.91587097-3.52344086-1.91587097-7.17680861 0-2.92005161 1.14952258-6.01517419 3.15568172-8.50140214l191.02114409-229.45307528a38.55965592 38.55965592 0 0 1 29.29300645-13.69297203H834.5379785a36.78472258 36.78472258 0 0 1 36.74508387 36.74508387v429.83776344a36.78472258 36.78472258 0 0 1-36.74508387 36.73957849H340.5691871a38.60590108 38.60590108 0 0 1-29.53524302-13.96934193L119.01522581 391.16579785z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="tips-fill" unicode="&#60206;" d="M512 832C264.6 832 64 631.4 64 384s200.6-448 448-448 448 200.6 448 448S759.4 832 512 832z m-32-232c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-272c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8V600z m32-440c-26.5 0-48 21.5-48 48s21.5 48 48 48 48-21.5 48-48-21.5-48-48-48z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="test" unicode="&#59026;" d="M513.058-31.072000000000003c-56.004 0-110.35 10.976-161.528 32.622-49.416 20.901-93.789 50.816-131.887 88.914-38.098 38.099-68.013 82.472-88.915 131.888-21.646 51.178-32.622 105.524-32.622 161.528s10.976 110.35 32.622 161.528c20.901 49.416 50.816 93.789 88.915 131.887s82.471 68.013 131.887 88.915c51.178 21.646 105.524 32.622 161.528 32.622 64.817 0 126.912-14.538 184.56-43.209 54.937-27.323 104.055-67.35 142.042-115.754 10.911-13.903 8.486-34.019-5.417-44.93-13.903-10.91-34.018-8.485-44.929 5.417-67.071 85.461-167.763 134.476-276.256 134.476-193.516 0-350.952-157.436-350.952-350.952s157.436-350.952 350.952-350.952c200.075 0 350.952 141.419 350.952 328.952 0 17.673 14.327 32 32 32s32-14.327 32-32c0-109.988-43.501-210.61-122.49-283.33-76.785-70.692-180.65-109.622-292.462-109.622zM636.555 275.40700000000004c-5.39 0-10.85 1.362-15.862 4.23-15.34 8.776-20.66 28.327-11.884 43.667L781.3 624.79c8.776 15.341 28.33 20.661 43.667 11.884 15.34-8.777 20.66-28.327 11.884-43.667L664.359 291.52099999999996c-5.908-10.327-16.703-16.114-27.804-16.114zM628.023 263.38199999999995a31.856 31.856 0 0 0-19.204 6.424L403.383 424.242c-14.127 10.62-16.97 30.681-6.35 44.807 10.62 14.127 30.68 16.97 44.807 6.35l205.437-154.438c14.127-10.619 16.97-30.68 6.35-44.807-6.289-8.363-15.888-12.772-25.604-12.772zM219.079 140.418a31.849 31.849 0 0 0-18.931 6.222c-14.238 10.47-17.293 30.499-6.823 44.737l202.489 275.372c10.468 14.239 30.499 17.294 44.737 6.823 14.238-10.47 17.293-30.499 6.823-44.737L244.885 153.46299999999997c-6.271-8.528-15.974-13.045-25.806-13.045z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="clear" unicode="&#59272;" d="M508.412288-59.874413000000004c-246.585071 0-447.224718 200.684672-447.224718 447.441659 0 246.738567 200.639646 447.448822 447.224718 447.448822 246.622934 0 447.2503-200.710254 447.2503-447.448822C955.661565 140.81025899999997 755.035222-59.874413000000004 508.412288-59.874413000000004zM685.286672 527.07151l-45.177945 45.215808L504.588193 436.690036 369.06766 572.287317l-45.184085-45.215808 135.520533-135.591141L323.883575 255.88411099999996l45.184085-45.184085 135.520533 135.583978 135.520533-135.583978 45.177945 45.184085L549.766139 391.480368 685.286672 527.07151z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="heart-fill" unicode="&#59023;" d="M729.068827 776.44202c-94.686523 0-176.905082-48.314379-217.069851-118.640074-40.163745 70.325695-122.382305 118.640074-217.044268 118.640074-143.767358 0-229.665727-123.660414-229.665727-243.219417 0-283.128359 415.870616-527.841803 433.576883-538.126031 4.062526-2.363837 8.584516-3.538593 13.132088-3.538593 4.547573 0 9.070586 1.174756 13.132088 3.538593 17.706267 10.283204 433.576883 254.997672 433.576883 538.126031C958.708971 652.781606 872.811626 776.44202 729.068827 776.44202z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="light" unicode="&#59208;" d="M512 72c-172.313 0-312 139.687-312 312s139.687 312 312 312 312-139.687 312-312-139.687-312-312-312z m0 64c136.967 0 248 111.033 248 248 0 136.967-111.033 248-248 248-136.967 0-248-111.033-248-248 0-136.967 111.033-248 248-248z m0 696c17.673 0 32-14.327 32-32v-51c0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32V800c0 17.673 14.327 32 32 32z m0-785c17.673 0 32-14.327 32-32v-51c0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32v51c0 17.673 14.327 32 32 32z m325.945 11.055c-12.497-12.496-32.758-12.496-45.255 0l-36.063 36.063c-12.496 12.497-12.496 32.758 0 45.255 12.497 12.496 32.758 12.496 45.255 0l36.063-36.063c12.496-12.497 12.496-32.758 0-45.255z m-568 565c-12.497-12.496-32.758-12.496-45.255 0l-36.063 36.063c-12.496 12.497-12.496 32.758 0 45.255 12.497 12.496 32.758 12.496 45.255 0l36.063-36.063c12.496-12.497 12.496-32.758 0-45.255z m561 81.318c12.496-12.497 12.496-32.758 0-45.255l-36.063-36.063c-12.497-12.496-32.758-12.496-45.255 0-12.496 12.497-12.496 32.758 0 45.255l36.063 36.063c12.497 12.496 32.758 12.496 45.255 0z m-563.572-565c12.496-12.497 12.496-32.758 0-45.255l-36.063-36.063c-12.497-12.496-32.758-12.496-45.255 0-12.496 12.497-12.496 32.758 0 45.255l36.063 36.063c12.497 12.496 32.758 12.496 45.255 0zM960 384c0-17.673-14.327-32-32-32h-51c-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32h51c17.673 0 32-14.327 32-32z m-781 0c0-17.673-14.327-32-32-32H96c-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32h51c17.673 0 32-14.327 32-32z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="music" unicode="&#59024;" d="M575.4 832h-74.5v-633.5C385 251.20000000000005 249.3 180.70000000000005 226.8 76c-7.3-34.1 7.9-70.9 21.9-87.8 79.3-94.6 252.2-50.5 331.6 51.3 35.2 45.2 32.3 84.6 32.3 181.3V608.5c48.8-36.3 103.9-70.1 123.7-135 12.2-40.3-4.1-107.3-17-141.5-3.9-10.3-14.7-18.9-9.7-29.2 34.2-25.4 51.1 28.6 60.9 51.2 10.6 24.5 20.8 54.7 24.4 75.6C833.2 653.2 595.5 661.7 575.4 832z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="time" unicode="&#59021;" d="M511.98464 829.44c-118.97856 0-230.83008-46.35136-314.95168-130.4832C112.90624 614.84032 66.56 502.95808 66.56 384.00512c0-118.9632 46.34624-230.84544 130.47296-314.9568C281.15456-15.093759999999975 393.00608-61.440000000000055 511.98464-61.440000000000055c118.98368 0 230.84032 46.34624 314.9824 130.48832C911.09376 153.15967999999998 957.44 265.02144 957.44 384.00512c0 118.97856-46.34624 230.8352-130.47296 314.95168C742.82496 783.0886399999999 630.96832 829.44 511.98464 829.44z m275.58912-721.02912c-73.61024-73.63584-171.47904-114.18624-275.58912-114.18624s-201.97376 40.5504-275.57888 114.18624c-73.63584 73.61024-114.16064 171.47904-114.16064 275.59424 0 104.11008 40.54528 201.97376 114.18112 275.58912 73.60512 73.63072 171.47392 114.176 275.584 114.176s201.97376-40.54528 275.584-114.176c73.63584-73.61536 114.18112-171.47904 114.18112-275.58912 0-104.1152-40.56576-201.984-114.2016-275.59424zM519.1168 340.20863999999995V628.08064a27.8528 27.8528 0 0 1-27.84256 27.84768 27.8528 27.8528 0 0 1-27.84256-27.84768v-306.23232a27.81184 27.81184 0 0 1 16.88064-25.58976M734.70464 321.84831999999994a31.0784 31.0784 0 0 0-31.07328-31.0784H496.44544a31.08864 31.08864 0 0 0-31.07328 31.0784 31.09376 31.09376 0 0 0 31.07328 31.0784h207.18592a31.08864 31.08864 0 0 0 31.07328-31.0784z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="ie" unicode="&#59323;" d="M740.32 314.46399999000005l221.2992 0c1.7088 15.3408 2.3808 31.0272 2.3808 47.0592 0 75.2064-20.1792 145.7472-55.4304 206.496 36.4416 96.8448 35.1552 179.0592-13.6512 228.1728-46.4064 46.1952-170.8992 38.7072-311.6352-23.616-10.4064 0.7872-20.928 1.1904-31.5264 1.1904-193.1712 0-355.2384-132.9408-400.032-312.0384 60.5952 77.5872 124.3392 133.824 209.5104 174.7968-7.7376-7.2576-52.9344-52.1664-60.5184-59.7696-224.5824-224.5056-295.392-517.7856-219.1872-594.0096 57.9264-57.9072 162.8928-48.1344 283.4688 10.9248 56.064-28.5504 119.5392-44.6592 186.7584-44.6592 181.056 0 334.5024 116.544 390.0864 278.8608l-223.008 0c-30.6816-56.6016-90.7008-95.136-159.5712-95.136s-128.8896 38.5344-159.5712 95.136c-13.632 25.5744-21.4848 54.8928-21.4848 85.92l0 0.672 362.112 0zM378.5344 423.25119999c5.1072 91.0464 80.8128 163.68 173.2224 163.68s168.096-72.6336 173.2224-163.68l-346.4448 0zM892.9024 750.43839999c31.4304-31.7568 30.6432-90.2016 3.7632-163.1424-46.0608 70.2336-112.992 125.568-192 157.1712 84.48 36.2304 153.1968 41.0304 188.2368 5.9904zM139.648-2.79680000999997c-40.1088 40.128-28.0128 124.32 23.6544 225.7728 32.16-90.2592 94.8288-166.0224 175.6224-214.8288-89.472-40.608-162.6816-47.5008-199.2768-10.944z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="firefox" unicode="&#59014;" d="M515.52500029-47.25q-142.12500029 0-253.36874971 75.58125029t-165.4875 200.1375q-29.1375 65.79375029-33.6562497 151.18125029t13.05 166.98750029 55.74375 156.6937503 89.9062497 121.7999997l-5.5312497-141.13125q5.53124971 7.03125 34.14375 7.78124971t35.15625-7.78124971q21.09375 40.68749971 80.60625 69.3t117.76875029 29.6250003q-27.1125-22.59375029-60.01875-74.5875t-29.38124971-82.1062503q12.56249971-4.01249971 31.3875-6.78750029t31.65000029-3.76875 34.14375-2.00625029 25.36875-1.50000029q7.5375-2.51250029 4.7625003-22.85624971t-15.31874971-37.9125q-2.51250029-3.52500029-8.28749971-9.29999971t-28.36874971-17.83125-50.71875029-17.08125029l7.5375-94.93125029-69.80625 33.6562497q-9.03750029-21.6-3.76875-40.93125029t18.07499971-33.39375029 32.88750029-20.85000029 40.68749971-3.2625q25.61249971 4.51874971 49.21875 17.325t41.94375029 22.59375029 36.91874971 8.79374971q30.63750029-2.00625029 44.94375-16.5750003t9.7875-32.6437497q-0.50625-1.0125-1.25624971-2.75625t-4.275-6.2812503-9.03750029-7.7812497-15.82499971-5.2687503-23.3624997-0.50625q-30.13125029-47.71874971-72.5812497-68.04375029t-105.2250003-14.81249971q37.16250029-30.63750029 81.61875-41.43750029t84.6187497-3.01875029 77.58749971 26.11874971 64.29375 43.9499997 40.42500029 52.2375003q21.6 45.71250029 19.59374971 96.67500029t-18.82500029 94.66875-39.43125 62.775q43.68750029-19.08749971 68.8124997-39.91875029t38.6812503-56.49374971q7.5375 85.3875-28.87499971 172.27500029t-105.22500029 142.63125029q133.0875-38.68125029 206.92500029-140.38125029t75.84374971-259.91250029q1.0125-63.7875-20.3437503-128.06250029t-62.02500029-119.53125-94.93125029-98.4375-124.29375029-68.0437503-144.9-24.8625z"  horiz-adv-x="1025" />
+      
+      <glyph glyph-name="at" unicode="&#59015;" d="M514.162246 831.556269c-246.201331 0-446.51045-200.783932-446.51045-447.571618 0-246.772336 201.037712-447.539896 448.157973-447.539896 50.29857 0 99.615788 8.224312 146.523121 24.436552 18.414395 6.370081 31.060413 12.423961 31.472805 12.630668 7.194866 3.217275 12.614296 9.049097 15.213493 16.401552 2.63092 7.305383 2.155083 15.133675-1.299599 22.043039l-2.883677 5.831822c-7.131421 14.262842-24.974811 20.569478-40.156582 13.850449-0.031722-0.031722-5.8001-3.02694-20.094664-8.082072-41.075511-14.627139-84.21196-22.059412-128.235616-22.059412-210.92592 0-382.487298 171.57775-382.487298 382.487298S305.423131 766.487298 516.349051 766.487298c210.894198 0 382.455575-171.5931 382.455575-382.423853-0.887206-51.868321-13.882172-100.486622-36.606733-136.855948-20.664645-33.104979-46.939055-51.994188-72.199369-51.994188-0.317225 0-0.601704 0-0.887206 0-45.829791 0.792039-75.433016 68.586075-75.433016 172.718737l0 185.269587c0 5.53097-1.426489 9.635451-4.373611 12.550851-4.944616 4.944616-12.360516 4.817726-21.267373 4.864798l-2.472308-0.016373-9.223059 0.016373c-7.701402-0.031722-13.469779 0.063445-17.495466-3.945869-3.645017-3.613294-4.119831-9.096169-4.119831-13.469779l0-31.060413c-45.196365 36.100196-80.440054 59.474556-131.9758 60.378136-1.045819 0.016373-2.059915 0.031722-3.074012 0.031722-108.74368 0-198.470237-99.218746-200.657043-222.779899-2.155083-124.701117 84.845387-227.723491 193.969737-229.625818 1.045819-0.01535 2.059915-0.031722 3.074012-0.031722 63.293535 0 122.276904 34.087353 159.992901 92.103698 24.373107-60.251246 61.519122-91.216491 110.48637-92.071975 0.697895-0.01535 1.394766-0.01535 2.060939-0.01535 33.945113 0 66.716494 14.610766 94.924953 42.328038 47.63695 46.796816 76.066443 124.796284 76.066443 208.643947l0 2.883677C959.595154 630.772336 759.761873 831.556269 514.162246 831.556269zM646.73975 354.651578c0-92.230588-58.475809-167.282934-130.390699-167.282934s-130.390699 75.052347-130.390699 167.282934c0 92.246961 58.475809 167.298284 130.390699 167.298284S646.73975 446.897515 646.73975 354.651578z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="bluetooth" unicode="&#59017;" d="M844.799642 221.19607699999995L538.533306 374.84141l307.696917 177.029926c10.583033 5.006014 17.398252 15.59621 17.569144 27.302833s-6.332219 22.491247-16.764825 27.804253L475.584626 830.045869c-9.517771 4.846378-20.869307 4.39817-29.974685-1.181919-9.105379-5.581112-14.656815-15.493879-14.656815-26.174126l0-288.760636L210.662931 699.284733c-12.974499 10.915607-32.339546 9.248641-43.255153-3.724835-10.915607-12.973476-9.248641-32.339546 3.724835-43.255153L430.953126 433.687656l0-102.83511L171.558307 120.428046c-13.166881-10.68127-15.181771-30.013571-4.500501-43.180452 6.068206-7.480368 14.924921-11.360745 23.859407-11.360745 6.794753 0 13.634532 2.245134 19.322068 6.859221l220.714867 179.046862 0-283.065937c0-10.689457 5.561669-20.61041 14.680351-26.188452 4.903683-2.99931 10.455119-4.510734 16.019859-4.510734 4.78498 0 9.580193 1.118474 13.980409 3.368724l371.449917 224.085638c10.664897 5.456269 17.182334 16.618493 16.691147 28.589129C863.284645 206.04091200000005 855.875908 216.63110800000004 844.799642 221.19607699999995zM763.458055 580.639542L492.351498 420.917818l0 21.60711c0.563842 3.368724 0.558725 6.801916 0 10.153244L492.351498 752.604102 763.458055 580.639542zM492.351498 18.915047999999956L492.351498 311.51001199999996c0.558725 3.347235 0.562818 6.777357 0 10.146081l0 5.809309 267.472797-137.65822L492.351498 18.915047999999956z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="chrome" unicode="&#59018;" d="M515.436 583.685H914.285C840.842 730.955 688.748 832.132 513 832.132c-141.284 0-267.274-65.395-349.42-167.546l151.66-262.682c8.535 102.325 95.704 181.781 200.196 181.781zM514.218 550.803c-91.476 0-165.631-74.155-165.631-165.631s74.155-165.631 165.631-165.631c52.7 0 99.615 24.642 129.95 62.999l1.428 2.474 0.355-0.205c21.252 27.852 33.898 62.624 33.898 100.363 0 84.774-63.702 154.626-145.841 164.413l-6.393 0.632c-4.424 0.354-8.882 0.586-13.397 0.586zM929.561 549.585H627.443c52.209-36.066 86.506-96.297 86.506-164.413 0-45.547-18.268-81.598-41.12-121.192L483.898-63.257c9.624-0.617 19.322-0.966 29.102-0.966 247.521 0 448.177 200.656 448.177 448.177 0 58.508-11.225 114.391-31.616 165.631zM514.218 185.441c-83.583 0-144.927 54.804-185.034 124.651l-0.235-0.136-187.482 324.727C93.081 563.124 64.823 476.84 64.823 383.954c0-225.02 165.839-411.288 381.958-443.298l152.278 263.752c-25.769-12.143-54.518-18.967-84.841-18.967z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="heart" unicode="&#59020;" d="M512 4.100000000000023c-108.9 0-447.3 277.5-447.3 522.2 0 131 106.6 237.6 237.6 237.6 94.9 0 174.8-50.2 209.7-76.1 34.9 25.9 114.8 76.1 209.7 76.1 131 0 237.6-106.6 237.6-237.6 0-244.7-338.4-522.2-447.3-522.2zM302.3 708c-100.2 0-181.7-81.5-181.7-181.7 0-221 326.8-466.3 391.4-466.3s391.4 245.3 391.4 466.3c0 100.2-81.5 181.7-181.7 181.7-103.9 0-190.2-76-191.1-76.8-10.6-9.5-26.7-9.5-37.3 0-0.8 0.8-87.7 76.8-191 76.8z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="key" unicode="&#59011;" d="M819.2 588.8c0-172.8-140.8-307.2-307.2-307.2-172.8 0-307.2 140.8-307.2 307.2C204.8 755.2 339.2 896 512 896S819.2 755.2 819.2 588.8L819.2 588.8zM512 838.4c-140.8 0-249.6-115.2-249.6-249.6 0-134.4 108.8-256 249.6-256s256 115.2 256 249.6S652.8 838.4 512 838.4L512 838.4zM480 300.79999999999995l64 0L544-128l-64 0L480 300.79999999999995 480 300.79999999999995zM512 192l192 0 0-64L512 128 512 192 512 192zM512 64l192 0 0-64L512 0 512 64 512 64z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="android" unicode="&#59012;" d="M391.405714 662.66209566a22.308571 22.308571 0 0 1 0 44.544c-11.995429 0-21.723429-10.276571-21.723428-22.272s9.728-22.272 21.723428-22.272z m241.152 0c11.995429 0 21.723429 10.276571 21.723429 22.272s-9.728 22.272-21.723429 22.272a22.308571 22.308571 0 0 1 0-44.544zM168.539429 557.51923766a58.514286 58.514286 0 0 0 58.294857-58.294857v-245.723428c0-32.585143-25.709714-58.843429-58.294857-58.843429S109.696 220.95238066000002 109.696 253.50095266000005v245.723428c0 32 26.294857 58.294857 58.843429 58.294857z m605.732571-10.861714v-380.562286c0-34.852571-28.013714-62.866286-62.281143-62.866285h-42.861714v-129.718857c0-32.585143-26.294857-58.843429-58.843429-58.843429s-58.843429 26.294857-58.843428 58.843429v129.718857H472.594286v-129.718857c0-32.585143-26.294857-58.843429-58.843429-58.843429a58.660571 58.660571 0 0 0-58.294857 58.843429l-0.585143 129.718857H312.594286a62.683429 62.683429 0 0 0-62.866286 62.866285V546.6575236599999h524.580571z m-132.571429 231.424c80.018286-41.142857 134.290286-119.990857 134.290286-210.870857H247.424c0 90.843429 54.272 169.728 134.838857 210.870857L341.705143 852.94323766a8.338286 8.338286 0 0 0 2.852571 11.446858c3.986286 1.718857 9.142857 0.585143 11.446857-3.437715L397.147429 785.50552366c34.852571 15.433143 73.728 23.990857 114.870857 23.990857s80.018286-8.557714 114.870857-23.990857l41.142857 75.446857c2.304 3.986286 7.424 5.156571 11.446857 3.437715a8.338286 8.338286 0 0 0 2.852572-11.446858zM914.267429 499.22438066v-245.723428c0-32.585143-26.294857-58.843429-58.843429-58.843429a58.660571 58.660571 0 0 0-58.294857 58.843429v245.723428a58.148571 58.148571 0 0 0 58.294857 58.294857c32.585143 0 58.843429-25.709714 58.843429-58.294857z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="mike" unicode="&#59100;" d="M512 256c115.2 0 208 92.8 208 208V624c0 115.2-92.8 208-208 208s-208-92.8-208-208v-160c0-115.2 92.8-208 208-208zM368 624c0 80 64 144 144 144s144-64 144-144v-160c0-80-64-144-144-144s-144 64-144 144V624zM844.8 416c0 17.6-14.4 32-32 32-16 0-30.4-12.8-32-28.8C758.4 289.6 646.4 192 512 192s-246.4 97.6-268.8 227.2c-1.6 16-16 28.8-32 28.8-17.6 0-32-14.4-32-32v-4.8C204.8 260.79999999999995 328 144 480 129.60000000000002V-32c0-17.6 14.4-32 32-32s32 14.4 32 32V129.60000000000002c152 14.4 275.2 131.2 299.2 280 0 1.6 1.6 4.8 1.6 6.4z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="mute" unicode="&#59013;" d="M739 294.4l180.2 180.2M735.391 297.9l180.24 180.24 7.07-7.07-180.239-180.24zM631.4-29.700000000000045c-5.1 0-10.1 1.3-14.5 3.7L277.1 162.20000000000005H116.8c-16 0-28.9 13-28.9 28.9v384c0 16 13 28.9 28.9 28.9h160.3l339.7 189.9c4.5 2.5 9.5 3.8 14.6 3.8 5.3 0 10.6-1.4 15.1-4.1 9.1-5.3 14.8-15.2 14.8-25.8v-767.6c0-10.5-5.6-20.4-14.7-25.8-4.6-2.7-9.9-4.1-15.2-4.1zM305.8 551.5v-336.7L601.4 51V716.8L305.8 551.5zM145.7 220.10000000000002h102.2v326H145.7v-326zM913.2 258.9c-9.3 0-18.1 3.6-24.7 10.3l-63.4 63.4-63.4-63.4c-6.6-6.6-15.4-10.3-24.7-10.3s-18.1 3.6-24.7 10.3c-13.6 13.6-13.6 35.9 0 49.5l63.4 63.4-67.4 67.4c-6.6 6.6-10.3 15.4-10.3 24.7 0 9.3 3.6 18.1 10.3 24.7 6.6 6.6 15.4 10.3 24.7 10.3s18.1-3.6 24.7-10.3l67.4-67.4 67.4 67.4c6.6 6.6 15.4 10.3 24.7 10.3s18.1-3.6 24.7-10.3c6.6-6.6 10.3-15.4 10.3-24.7 0-9.3-3.6-18.1-10.3-24.7L874.6 382l63.4-63.4c13.6-13.6 13.6-35.9 0-49.5-6.7-6.6-15.5-10.2-24.8-10.2z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="gift" unicode="&#58919;" d="M796.3 600h-6.7c5.1 6.7 9.6 13.4 13.4 20.1 18.3 32.2 20.8 63.1 7 87.1-9.1 15.7-33 41.2-91.9 36-35.4-3.2-76.1-17.2-114.7-39.4-37.9-21.9-68.9-49.3-89-77.5-4.5 6.4-9.5 12.8-15.1 19.1-19.8 22.3-45.4 42.8-74.1 59.4-38.4 22.2-79.3 35.9-115.1 38.5-43.3 3.2-75.8-10-91.4-37-13.8-24-11.3-54.8 7-86.7 3.7-6.5 8.1-13 13.1-19.5H236c-21.3 0-41.6-7.2-57.4-20.2-17.8-14.9-27.6-35.4-27.6-58v-50.8c0-34.4 23-64.6 55-76.6v-283.9c0-23.3 10.9-47.1 30.1-65.3 18.3-17.4 41.4-27.3 63.4-27.3h434.3c22 0 44.9 10 63 27.6 18.7 18.1 29.3 41.8 29.3 65.1V395c11 4.3 19.6 10.9 27.2 19.5 13.3 15.1 20.8 35.2 20.8 56.6v50.8c-0.1 45.3-32.8 78.1-77.8 78.1z m17.7-78.1v-50.8c0-7.7-3.2-20.3-15-22-0.9 0.1-1.7 0.1-2.6 0.1-1.5 0-2.9-0.1-4.3-0.3H543v91h253.3c11.9 0.1 17.7-5.8 17.7-18zM633.4 651.8c30.7 17.7 63.5 29.2 90 31.6 21.5 1.9 32.6-2.8 34.6-6.3 4.2-7.3-6.3-41.2-52.9-77.2H569.8c14 17 35.3 35.6 63.6 51.9z m-362.8 24.4c2.2 3.7 13.3 8.7 35 7.1 26.6-1.9 59.2-13.1 89.5-30.6 27.7-16 49.4-35.1 63.9-52.8H323.5c-20.3 15.6-36.4 32.9-45.8 49.4-8.9 15.6-8.5 24.4-7.1 26.9zM211 521.9c0 11.2 12.9 18.1 24.9 18.1H483v-91H240.1c-1.4 0.2-2.8 0.3-4.3 0.3-0.9 0-1.8 0-2.7-0.1-11.5 1.5-22.1 11.6-22.1 22v50.7z m55-411.3V389h217v-311H299.4c-13.2 0-33.4 17.5-33.4 32.6zM733.7 78H543V389h223v-278.4c0-15.5-19.1-32.6-32.3-32.6z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="windows" unicode="&#59007;" d="M437 329l0-325.5-341 47 0 278.5 341 0zm0 371.5l0-329.5-341 0 0 282.5zm491-371.5l0-393-453.5 62.5 0 330.5 453.5 0zm0 439l0-397-453.5 0 0 334.5z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="ios" unicode="&#59008;" d="M821.235026 351.984884c-1.287001 129.729651 105.791442 191.891776 110.553344 194.980577-60.102924 88.030835-153.796561 100.12864-187.258574 101.54434-79.794032 7.979403-155.598362-46.975519-196.010178-46.975519-40.411816 0-102.831341 45.688518-168.983167 44.530218-86.872534-1.287001-167.052666-50.57912-211.840284-128.442651-90.347436-156.756662-23.166009-388.931554 64.864826-515.958505 42.985817-62.162125 94.337137-132.046252 161.647264-129.600951 64.864826 2.574001 89.317835 41.956217 167.696167 41.956217s100.38604-41.956217 169.111867-40.669216c69.755428 1.287001 114.028245 63.449125 156.756662 125.86865 49.42082 72.200729 69.755428 142.084856 70.913728 145.559758C957.14228 145.550002 822.522026 197.030023 821.235026 351.984884L821.235026 351.984884 821.235026 351.984884zM692.277575 732.550935c35.778614 43.371917 59.845524 103.474841 53.281821 163.449065-51.48002-2.059201-113.899545-34.234214-150.83646-77.477431C561.647023 780.041254 532.560811 718.78003 540.411514 660.092806 597.811737 655.588305 656.49896 689.307718 692.277575 732.550935L692.277575 732.550935 692.277575 732.550935z"  horiz-adv-x="1084" />
+      
+      <glyph glyph-name="logout" unicode="&#59010;" d="M512 832a32 32 0 0 1-32-32v-416a32 32 0 0 1 64 0V800a32 32 0 0 1-32 32zM683.34 798.06a32 32 0 0 1-24.48-59.15C798.07 681.24 896 544.06 896 384c0-212.08-171.92-384-384-384S128 171.91999999999996 128 384c0 160.06 97.93 297.24 237.14 354.91a32 32 0 0 1-24.48 59.15C178.25 730.78 64 570.74 64 384c0-247.42 200.58-448 448-448s448 200.58 448 448c0 186.74-114.25 346.78-276.66 414.06z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="wifi" unicode="&#59360;" d="M723 275.5C666.8 324.4 593.4 354 513 354s-153.8-29.6-210.1-78.6c-3.2-2.8-3.6-7.8-0.8-11.2l36-42.9c2.9-3.4 8-3.8 11.4-0.9C393.1 258.8 450.3 282 513 282s119.9-23.2 163.5-61.5c3.4-2.9 8.5-2.5 11.4 0.9l36 42.9c2.8 3.3 2.4 8.3-0.9 11.2zM840.4 415.6C751.7 489.5 637.6 534 513 534s-238.7-44.5-327.5-118.4c-3.4-2.8-3.8-7.9-1-11.3l36-42.9c2.8-3.4 7.9-3.8 11.2-1C308 423.8 406.1 462 513 462s205-38.2 281.2-101.6c3.4-2.8 8.4-2.4 11.2 1l36 42.9c2.8 3.4 2.4 8.5-1 11.3zM957.1 554.6C835.7 654.2 680.3 714 511 714c-168.2 0-322.6-59-443.7-157.4-3.5-2.8-4-7.9-1.1-11.4l36-42.9c2.8-3.3 7.8-3.8 11.1-1.1C222 589.3 360.3 642 511 642c151.8 0 291-53.5 400-142.7 3.4-2.8 8.4-2.3 11.2 1.1l36 42.9c2.9 3.4 2.4 8.5-1.1 11.3zM512 118m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0Z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="rss" unicode="&#59400;" d="M810.666667 63.95733332999998C810.666667 416.89600033 523.562667 704.00000033 170.666667 704.00000033v-85.333334c305.834667 0 554.666667-248.832 554.666666-554.709333h85.333334zM512 63.95733332999998h85.333333C597.333333 299.26400033000004 405.930667 490.66666633 170.666667 490.66666633v-85.333333c188.202667 0 341.333333-153.130667 341.333333-341.376zM256 149.33333332999996m-85.333333 0a85.333333 85.333333 0 1 1 170.666666 0 85.333333 85.333333 0 1 1-170.666666 0Z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="email" unicode="&#58904;" d="M834.446 682.553H194.105c-50.176 0-91.022-40.846-91.022-91.022v-423.026c0-50.176 40.846-91.022 91.022-91.022h640.341c50.176 0 91.022 40.846 91.022 91.022V591.531c0 50.176-40.846 91.022-91.022 91.022z m36.409-514.048c0-20.025-16.384-36.409-36.409-36.409H194.105c-20.025 0-36.409 16.384-36.409 36.409V591.531c0 20.025 16.384 36.409 36.409 36.409h640.341c20.025 0 36.409-16.384 36.409-36.409v-423.026zM786.773 537.941L514.275 366.023 241.777 537.941c-12.743 8.078-29.582 4.21-37.661-8.533-8.078-12.743-4.21-29.582 8.533-37.661l286.72-180.907c4.551-2.845 9.557-4.21 14.563-4.21h0.91c5.006 0 10.013 1.365 14.563 4.21l286.72 180.907c12.743 8.078 16.611 24.917 8.533 37.661-8.306 12.857-25.145 16.611-37.888 8.533z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="reduce-circle" unicode="&#58902;" d="M512-65.5c-60.6 0-119.4 11.9-174.8 35.3-53.5 22.6-101.5 55-142.7 96.2-41.2 41.2-73.6 89.2-96.2 142.7C74.9 264.1 63 322.9 63 383.5s11.9 119.4 35.3 174.8c22.6 53.5 55 101.5 96.2 142.7 41.2 41.2 89.2 73.6 142.7 96.2C392.6 820.6 451.4 832.5 512 832.5s119.4-11.9 174.8-35.3c53.5-22.6 101.5-55 142.7-96.2 41.2-41.2 73.6-89.2 96.2-142.7 23.4-55.4 35.3-114.2 35.3-174.8s-11.9-119.4-35.3-174.8c-22.6-53.5-55-101.5-96.2-142.7s-89.2-73.6-142.7-96.2c-55.4-23.4-114.2-35.3-174.8-35.3z m0 848c-220 0-399-179-399-399s179-399 399-399 399 179 399 399-179 399-399 399zM772 359H252c-13.8 0-25 11.2-25 25s11.2 25 25 25h520c13.8 0 25-11.2 25-25s-11.2-25-25-25z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="transfer" unicode="&#59025;" d="M320 768H128c-35.2 0-64-28.8-64-64v-640c0-35.2 28.8-64 64-64h192c35.2 0 64 28.8 64 64V704c0 35.2-28.8 64-64 64z m0-672c0-16-16-32-32-32H160c-16 0-32 16-32 32V672c0 16 16 32 32 32h128c16 0 32-16 32-32v-576z m256 544h-64c-19.2 0-32-12.8-32-32s16-32 32-32h64c19.2 0 32 12.8 32 32s-16 32-32 32z m-64-448h-64c-19.2 0-32-12.8-32-32s16-32 32-32h64c19.2 0 32 12.8 32 32s-16 32-32 32z m384 576H704c-35.2 0-64-28.8-64-64v-640c0-35.2 28.8-64 64-64h192c35.2 0 64 28.8 64 64V704c0 35.2-28.8 64-64 64z m0-672c0-16-16-32-32-32H736c-16 0-32 16-32 32V672c0 16 16 32 32 32h128c16 0 32-16 32-32v-576z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="service" unicode="&#58918;" d="M849.00812012 487.71642715A27.54528398 27.54528398 0 0 1 849.00812012 496.71080566 337.28919434 337.28919434 0 0 1 174.42973145 496.71080566a27.54528398 27.54528398 0 0 1-1e-8-8.99437852 147.28294776 147.28294776 0 0 1-112.42973144-140.53716386V328.06620849a148.40724551 148.40724551 0 0 1 123.67270459-143.34790781A308.6196126 308.6196126 0 0 1 414.4672083-9.222985839999978h5.05933769a84.32229815 84.32229815 0 1 1 0 56.21486573 252.40474688 252.40474688 0 0 0-172.01748955 137.16427235h31.48032481A35.41536562 35.41536562 0 0 1 314.96689531 215.63647705000005V458.48469697a35.41536562 35.41536562 0 0 1-35.97751406 34.29106787H230.64459717A26.42098711 26.42098711 0 0 1 230.64459717 496.71080566a281.07432862 281.07432862 0 0 0 562.14865723 0 26.42098711 26.42098711 0 0 1 0-3.3728915h-48.34478497a35.41536562 35.41536562 0 0 1-35.97751406-34.29106875V215.63647705000005a35.41536562 35.41536562 0 0 1 35.97751406-34.29106787h63.52279893A150.0936917 150.0936917 0 0 1 961.43785156 328.06620849v19.11305479a147.28294776 147.28294776 0 0 1-112.42973144 140.53716386zM498.22735801 46.991879880000056a28.10743242 28.10743242 0 1 0-28.1074333-28.10743242 28.10743242 28.10743242 0 0 0 28.10743329 28.10743242zM258.75202959 240.37101797000003h-43.28544639A93.87882598 93.87882598 0 0 0 118.21486572 328.06620849v19.11305479a93.87882598 93.87882598 0 0 0 97.25171748 89.94378516h43.28544639zM905.22298584 328.06620849a93.87882598 93.87882598 0 0 0-97.25171748-89.94378515h-43.28544727V437.12304844h43.28544727A93.87882598 93.87882598 0 0 0 905.22298584 347.17926328zM633.70518418 705.83010615l-20.7995001 7.30793232a28.10743242 28.10743242 0 0 1-17.42660859-56.21486571l16.30231084-6.18363458a28.10743242 28.10743242 0 1 1 21.92379785 51.71767646zM330.14490928 639.49656503A28.10743242 28.10743242 0 0 1 376.80324805 609.14053711 177.63897568 177.63897568 0 0 0 511.71892578 676.59837597a28.10743242 28.10743242 0 0 1 0 56.21486573 231.60524678 231.60524678 0 0 1-181.57401651-93.31667667z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="addition" unicode="&#58916;" d="M544 768L480 768 480 416 128 416 128 352 480 352 480 0 544 0 544 352 895.936 352 895.936 416 544 416Z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="subtraction" unicode="&#59006;" d="M785 348H239c-19.8 0-36 16.2-36 36s16.2 36 36 36h546c19.8 0 36-16.2 36-36s-16.2-36-36-36z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="slider" unicode="&#59156;" d="M228.7 683.9v-66.7H112v66.7h116.7z m333.2-266.6v-66.7H112v66.7h449.9zM295.4 150.60000000000002V84H112v66.7h183.4v-0.1z m116.6 600c9 0 16.8-3.3 23.5-9.9 6.5-6.5 9.9-14.5 9.9-23.5v-133.3c0-9-3.3-16.8-9.9-23.5-6.5-6.5-14.5-9.9-23.5-9.9H278.8c-9 0-16.8 3.3-23.5 9.9-6.5 6.5-9.9 14.3-9.9 23.5V717.1c0 9 3.3 16.8 9.9 23.5 6.5 6.5 14.3 9.9 23.5 9.9h133.3v0.1h-0.1z m66.7-533.3c9 0 16.8-3.3 23.5-9.9 6.5-6.5 9.9-14.5 9.9-23.5v-133.3c0-9-3.3-16.8-9.9-23.5-6.5-6.5-14.5-9.9-23.5-9.9H345.3c-9 0-16.8 3.3-23.5 9.9-6.5 6.5-9.9 14.5-9.9 23.5V183.89999999999998c0 9 3.3 16.8 9.9 23.5 6.5 6.5 14.3 9.9 23.5 9.9h133.4v0.1zM912 683.9v-66.7H462.1v66.7H912z m0-533.3V84H528.6v66.7h383.3v-0.1h0.1zM745.2 483.9c9 0 16.8-3.3 23.5-9.9 6.5-6.5 9.9-14.5 9.9-23.5v-133.3c0-9-3.3-16.8-9.9-23.5-6.5-6.5-14.5-9.9-23.5-9.9H612c-9 0-16.8 3.3-23.5 9.9-6.5 6.5-9.9 14.3-9.9 23.5V450.6c0 9 3.3 16.8 9.9 23.5 6.5 6.5 14.5 9.9 23.5 9.9l133.2-0.1zM912 417.3v-66.7H795.3v66.7H912z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="print" unicode="&#58989;" d="M843.946667 603.733333h-47.36V725.333333a90.026667 90.026667 0 0 1-94.72 85.333334H312.32a81.493333 81.493333 0 0 1-85.333333-85.333334v-121.6H170.666667a81.493333 81.493333 0 0 1-85.333334-85.333333v-325.12a89.173333 89.173333 0 0 1 85.333334-93.866667h56.746666v-52.48a89.6 89.6 0 0 1 89.6-89.6h389.973334a89.6 89.6 0 0 1 89.6 89.6v52.48h47.36a97.706667 97.706667 0 0 1 94.72 93.866667V518.4a90.026667 90.026667 0 0 1-94.72 85.333333zM279.466667 725.333333a30.72 30.72 0 0 0 32.853333 33.706667h389.546667c18.773333 0 42.666667-11.52 42.666666-33.706667v-121.6H279.466667z m465.066666-678.4a37.546667 37.546667 0 0 0-37.546666-37.973333H317.013333a37.546667 37.546667 0 0 0-37.546666 37.973333v170.666667a37.546667 37.546667 0 0 0 37.546666 38.4h389.973334a37.546667 37.546667 0 0 0 37.546666-37.973333z m142.506667 146.346667a45.653333 45.653333 0 0 0-42.666667-42.666667h-47.786666v66.133334a89.6 89.6 0 0 1-89.6 89.6H317.013333a89.6 89.6 0 0 1-89.6-89.6v-65.28H170.666667a37.546667 37.546667 0 0 0-33.28 42.666666v324.266667A31.146667 31.146667 0 0 0 170.666667 552.106667h673.28c19.2 0 42.666667-11.52 42.666666-33.706667z m-640 281.173333h-37.546667a13.226667 13.226667 0 0 0 0 26.026667h38.826667a13.226667 13.226667 0 1 0 0-26.026667z m94.293333 0H298.666667a13.226667 13.226667 0 1 0 0 26.026667h42.666666a13.226667 13.226667 0 0 0 0-26.026667z m426.666667-116.48H248.32a13.226667 13.226667 0 0 0 0 26.026667H768a13.226667 13.226667 0 0 0 0-26.026667z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="export" unicode="&#59005;" d="M896.4374528 479.830016c0 26.673152-21.6236032 48.2967552-48.2967552 48.2967552H630.8069376c-26.673152 0-48.2967552-21.6236032-48.2967552-48.2967552v-83.04831147H384.69522773l-2.71428266 5.36849067c-41.336832 87.44686933-35.95195733 204.128256 150.601728 199.94487467v-108.91537067l172.19037866 164.757504L532.58267307 822.7110912v-106.57245867c-228.64418133 5.70709333-263.651328-183.517184-157.433856-314.01028266l4.6891008-5.34664534h-88.46595414c-26.673152 0-48.2967552-21.6236032-48.2967552-48.2967552v-66.78882986h-98.43616426c-26.673152 0-40.4258816-21.6236032-30.71781547-48.2967552l79.10304427-217.33485227c9.70806613-26.673152 39.20145067-48.2967552 65.87460266-48.2967552h603.70670934c23.75898453 0 37.2506624 17.16169387 33.05745066 39.76178347 0.4980736 2.77108053 0.77441707 5.619712 0.77441707 8.53497173v463.765504z m-60.37067093-306.4528896l-21.8464256 60.02223787c-9.70806613 26.673152-39.20145067 48.2967552-65.87460267 48.2967552H303.44697173v30.56708266c0 13.336576 10.81125547 24.14783147 24.14783147 24.14783147h315.28605013v107.1972352c0 13.336576 10.81125547 24.14783147 24.14783147 24.14783147h144.88917333c13.336576 0 24.14783147-10.81125547 24.14783147-24.14783147v-270.2311424z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="cols" unicode="&#58896;" d="M128 426.66666667h384V810.66666667H128z m64 320h256v-256H192zM576 810.66666667v-384h384V810.66666667z m320-320H640V746.66666667h256zM192 362.66666667000004h64v-384H192zM384 362.66666667000004h64v-384H384zM640 362.66666667000004h64v-384H640zM832 362.66666667000004h64v-384h-64z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="screen-full" unicode="&#58914;" d="M641.750109 511.899972l205.227128 204.519-0.704035-115.89966c-0.282433-9.611915 7.489578-18.09103 17.101493-17.808598l12.297071 0c9.611915 0.283456 17.667382 5.936199 17.808598 15.689331l0.565888 172.57752c0 0.14224 0.282433 9.187243 0.282433 9.187243 0.14224 4.804423-0.99056 9.187243-4.100388 12.297071-3.109828 3.109828-7.347339 5.086855-12.297071 4.946662l-8.763594-0.14224c-0.141216 0-0.278339 0-0.420579-0.14224L697.581696 797.833213c-9.611915-0.283456-17.667382-8.200776-17.808598-17.950837l0-12.297071c1.416256-11.44875 10.458189-18.092054 20.070104-17.808598l112.789832-0.283456-204.66124-203.814965c-9.329483-9.329483-9.329483-24.449855 0-33.778314 9.329483-9.470699 24.452925-9.470699 33.782408 0L641.750109 511.899972zM383.095141 319.11010699999997L177.726797 115.29411900000002l0.707105 115.338888c0.283456 9.607822-7.492648 18.086937-17.104563 17.808598l-13.001105 0c-9.611915-0.283456-17.667382-5.937223-17.808598-15.690354l-0.565888-172.718737c0-0.14224-0.282433-9.187243-0.282433-9.187243-0.14224-4.808516 0.99056-9.187243 4.096295-12.297071 3.109828-3.109828 7.351432-5.086855 12.297071-4.946662l8.762571 0.14224c0.14224 0 0.283456 0 0.425695 0.14224l171.873486-0.708128c9.607822 0.283456 17.667382 8.196683 17.808598 17.950837L344.93503 63.42477399999996c-1.415232 11.44875-10.461259 18.092054-20.074198 17.808598L212.069977 81.51682800000003 416.59 285.32872299999997c9.329483 9.329483 9.329483 24.453948 0 33.782408C407.40685 328.58182999999997 392.424624 328.58182999999997 383.095141 319.11010699999997L383.095141 319.11010699999997zM894.047276 60.03251399999999l-0.424672 172.718737c-0.283456 9.612938-8.200776 15.406898-17.809621 15.690354l-12.296047 0c-9.612938 0.278339-17.243733-8.200776-17.105586-17.808598l0.708128-115.903753L641.750109 319.11010699999997c-9.329483 9.329483-24.452925 9.329483-33.782408 0-9.325389-9.328459-9.325389-24.452925 0-33.782408L812.490795 81.51682800000003l-112.789832-0.283456c-9.611915 0.283456-18.515702-6.502088-20.073174-17.808598l0-12.297071c0.282433-9.611915 8.200776-17.667382 17.808598-17.950837l171.166381 0.708128c0.141216 0 0.282433-0.14224 0.424672-0.14224l8.763594-0.14224c4.803399-0.141216 9.187243 1.694595 12.296047 4.946662 3.109828 3.109828 4.238534 7.488555 4.097318 12.297071 0 0-0.14224 9.046027-0.14224 9.187243L894.047276 60.03149099999996zM212.216309 749.493252l112.789832 0.283456c9.607822-0.283456 18.512632 6.502088 20.070104 17.808598L345.076246 779.883399c-0.283456 9.611915-8.196683 17.667382-17.808598 17.950837l-172.011632-0.708128c-0.14224 0-0.283456 0.14224-0.425695 0.14224l-8.761548 0.14224c-4.808516 0.141216-9.187243-1.694595-12.297071-4.946662-3.109828-3.109828-4.242627-7.488555-4.096295-12.297071 0 0 0.282433-9.046027 0.282433-9.187243l0.420579-172.718737c0.14224-9.608845 8.200776-15.406898 17.808598-15.686261l13.005198 0c9.611915-0.282433 17.242709 8.196683 17.10047 17.808598l-0.564865 115.334795 205.231221-203.958228c9.324366-9.329483 24.448832-9.329483 33.777291 0 9.329483 9.329483 9.329483 24.452925 0 33.782408L212.216309 749.493252 212.216309 749.493252zM212.216309 749.493252"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="screen-restore" unicode="&#59224;" d="M582.6 454.6v320h50V540l274 274 35.4-35.4-274-274h234.6v-50h-320zM117.4-46l274 274v-234.6h50v320h-320v-50H356l-274-274 35.4-35.4zM132 764h302V814H82v-352h50V764z m760-760H590v-50h352V306h-50v-302z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="rate-half" unicode="&#59081;" d="M1012.064 504l-359.552 31.008-140.512 331.04-140.512-331.552-359.552-30.496 273.024-236.544-82.016-351.552 309.056 186.528 309.056-186.528-81.504 351.552 272.544 236.544zM512 195.96799999999996l0 465.056 85.504-202.016 219.04-19.008-166.016-144.032 50.016-214.016-188.512 114.016z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="rate-solid" unicode="&#59002;" d="M957.111079 492.519576c-3.927449 11.669784-14.447037 19.86442-26.723641 20.816095L647.68068 535.250796 540.183388 811.873997c-4.586458 11.803837-15.951297 19.579941-28.614711 19.579941s-24.02723-7.776104-28.614711-19.579941L375.458719 535.250796l-282.708803-21.915126c-12.276604-0.951675-22.796192-9.146311-26.723641-20.816095-3.927449-11.669784-0.50142-24.557302 8.701173-32.737612l217.547735-193.358823-67.980277-291.298436c-2.848884-12.20702 2.009773-24.919553 12.273535-32.114418 10.264784-7.195889 23.87271-7.42818 34.375925-0.586354l240.624313 156.709111 240.625336-156.709111c5.099135-3.320629 10.92891-4.974291 16.752546-4.974291 6.173606 0 12.342096 1.858324 17.623379 5.561669 10.263761 7.194866 15.122419 19.907399 12.273535 32.114418l-67.980277 291.299459L948.409906 459.781964C957.613522 467.962274 961.037505 480.849792 957.111079 492.519576z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="rate" unicode="&#59003;" d="M959.008 489.984l-308 47.008L512 832 372.992 536.992l-308-47.008 223.008-228-52.992-324L512 90.976l276.992-152.992-52.992 324zM512 156L304 39.00800000000004l40 235.008-179.008 182.016 242.016 32 104.992 224 104-224 240.992-34.016L680 273.024l36.992-235.008z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="cellphone" unicode="&#59000;" d="M785.066667 896H238.933333a102.4 102.4 0 0 1-102.4-102.4v-819.2a102.4 102.4 0 0 1 102.4-102.4h546.133334a102.4 102.4 0 0 1 102.4 102.4V793.6a102.4 102.4 0 0 1-102.4 102.4zM238.933333 827.733333h546.133334a34.133333 34.133333 0 0 0 34.133333-34.133333v-648.533333H204.8V793.6a34.133333 34.133333 0 0 0 34.133333 34.133333z m546.133334-887.466666H238.933333a34.133333 34.133333 0 0 0-34.133333 34.133333v102.4h614.4v-102.4a34.133333 34.133333 0 0 0-34.133333-34.133333zM512 8.53333299999997m-34.133333 0a34.133333 34.133333 0 1 1 68.266666 0 34.133333 34.133333 0 1 1-68.266666 0ZM426.666667 725.333333h170.666666a17.066667 17.066667 0 0 1 0 34.133334h-170.666666a17.066667 17.066667 0 0 1 0-34.133334z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="vercode" unicode="&#59001;" d="M513.807059-128C351.171765-128 58.428235 126.19294100000002 54.211765 376.16941199999997V662.287059a93.364706 93.364706 0 0 0 81.317647 88.545882 570.428235 570.428235 0 0 1 163.237647 40.357647A393.336471 393.336471 0 0 1 446.945882 872.508235a101.797647 101.797647 0 0 0 120.470589 5.421177A629.458824 629.458824 0 0 1 716.8 792.395294a1255.303529 1255.303529 0 0 1 169.863529-38.550588 98.785882 98.785882 0 0 0 79.510589-90.955294 2911.171765 2911.171765 0 0 0-3.011765-291.538824C924.611765 49.09176500000001 672.828235-128 513.807059-128z m0 963.764706a39.152941 39.152941 0 0 1-24.696471-7.830588A438.512941 438.512941 0 0 0 319.247059 734.569412a608.376471 608.376471 0 0 0-180.705883-43.369412 33.731765 33.731765 0 0 1-24.094117-30.117647v-283.708235C118.663529 155.10588199999995 389.722353-67.76470600000005 513.807059-67.76470600000005s354.183529 148.178824 391.529412 444.536471c9.035294 175.887059 0 281.901176 0 283.105882a38.550588 38.550588 0 0 1-29.515295 33.731765 1287.830588 1287.830588 0 0 0-180.705882 41.562353A676.442353 676.442353 0 0 0 536.094118 829.741176a37.345882 37.345882 0 0 1-24.094118 6.02353zM784.865882 479.171765L487.905882 198.47529399999996a40.357647 40.357647 0 0 0-49.392941-4.818823l-7.830588 6.625882-161.430588 171.068235a40.357647 40.357647 0 1 0 60.235294 55.416471l133.722353-141.552941 267.444706 252.988235a40.357647 40.357647 0 1 0 55.41647-60.235294"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="login-weibo" unicode="&#58997;" d="M411.270737 288.350316c-17.973895 7.504842-41.189053-0.229053-52.264421-17.542737-11.223579-17.394526-5.955368-38.103579 11.870316-46.201263 18.108632-8.232421 42.132211-0.417684 53.342316 17.421474C435.253895 260.05557899999997 429.446737 280.62989500000003 411.270737 288.350316zM455.545263 306.64757899999995c-6.885053 2.721684-15.508211-0.579368-19.550316-7.329684-3.920842-6.790737-1.751579-14.524632 5.146947-17.367579 7.019789-2.883368 16.006737 0.458105 20.048842 7.370105C465.071158 296.259368 462.551579 304.087579 455.545263 306.64757899999995zM427.52 426.684632c-115.968-11.439158-203.924211-82.216421-196.378947-158.073263 7.531789-75.910737 107.654737-128.161684 223.649684-116.749474 115.994947 11.439158 203.924211 82.216421 196.392421 158.140632C643.664842 385.859368 543.541895 438.110316 427.52 426.684632zM529.300211 247.70021099999997c-23.673263-53.355789-91.769263-81.798737-149.530947-63.232-55.754105 17.933474-79.373474 72.811789-54.945684 122.246737 23.956211 48.464842 86.352842 75.870316 141.541053 61.561263C523.506526 353.562947 552.663579 299.85684200000003 529.300211 247.70021099999997zM512 896C229.241263 896 0 666.772211 0 384c0-282.758737 229.241263-512 512-512 282.772211 0 512 229.241263 512 512C1024 666.772211 794.772211 896 512 896zM455.531789 101.02568399999996c-145.354105 0-293.941895 70.197895-293.941895 185.667368 0 60.362105 38.386526 130.182737 104.474947 196.069053 88.252632 87.929263 191.164632 127.986526 229.874526 89.397895 17.084632-17.003789 18.741895-46.457263 7.760842-81.623579-5.726316-17.690947 16.666947-7.895579 16.666947-7.936 71.343158 29.763368 133.564632 31.514947 156.321684-0.862316 12.139789-17.246316 10.954105-41.472-0.215579-69.510737-5.173895-12.921263 1.589895-14.928842 11.466105-17.879579 40.178526-12.422737 84.924632-42.455579 84.924632-95.380211C772.837053 211.36168399999997 646.090105 101.02568399999996 455.531789 101.02568399999996zM718.672842 468.197053c4.715789 14.457263 1.765053 30.962526-9.202526 43.061895-10.954105 12.072421-27.136 16.666947-42.037895 13.527579l0 0.026947c-12.463158-2.694737-24.724211 5.268211-27.392 17.664-2.667789 12.463158 5.281684 24.697263 17.744842 27.338105 30.531368 6.467368 63.595789-2.937263 85.989053-27.715368 22.447158-24.764632 28.456421-58.489263 18.849684-88.064-3.907368-12.099368-16.936421-18.728421-29.062737-14.848-12.139789 3.920842-18.782316 16.922947-14.874947 28.995368L718.672842 468.183579zM853.261474 424.865684c-0.013474-0.013474-0.013474-0.080842-0.013474-0.107789-4.567579-14.026105-19.712-21.706105-33.778526-17.165474-14.133895 4.554105-21.854316 19.590737-17.300211 33.670737l0 0.013474c13.999158 43.169684 5.12 92.429474-27.567158 128.565895-32.714105 36.122947-80.949895 49.92-125.507368 40.488421-14.484211-3.085474-28.752842 6.130526-31.838316 20.574316-3.098947 14.403368 6.144 28.631579 20.641684 31.717053l0.026947 0c62.625684 13.271579 130.519579-6.117053 176.545684-56.966737C860.483368 554.886737 872.892632 485.618526 853.261474 424.865684z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="login-qq" unicode="&#58998;" d="M512 896C229.227789 896 0 666.772211 0 384c0-282.745263 229.227789-512 512-512s512 229.254737 512 512C1024 666.772211 794.772211 896 512 896L512 896zM738.856421 258.93726300000003c0 0-16.208842-44.220632-45.945263-83.941053 0 0 53.126737-18.054737 48.64-64.983579 0 0 1.778526-52.345263-113.461895-48.734316 0 0-81.071158 6.319158-105.377684 40.609684l-21.423158 0c-24.306526-34.304-105.350737-40.609684-105.350737-40.609684-115.280842-3.610947-113.475368 48.734316-113.475368 48.734316-4.500211 46.928842 48.626526 64.983579 48.626526 64.983579-29.709474 39.720421-45.918316 83.941053-45.918316 83.941053-72.057263-116.439579-64.848842 16.249263-64.848842 16.249263 13.527579 78.524632 70.238316 129.967158 70.238316 129.967158-8.111158 71.316211 21.611789 83.941053 21.611789 83.941053C318.410105 709.712842 508.025263 705.859368 512 705.751579c3.988211 0.107789 193.576421 3.961263 199.828211-216.643368 0 0 29.709474-12.638316 21.611789-83.941053 0 0 56.737684-51.442526 70.238316-129.967158l0 0C803.678316 275.18652599999996 810.873263 142.49768400000005 738.856421 258.93726300000003L738.856421 258.93726300000003zM738.856421 258.93726300000003"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="login-wechat" unicode="&#58999;" d="M516.464646 896C233.714646 896 4.464646 666.75 4.464646 384S233.714646-128 516.464646-128s512 229.25 512 512S799.214646 896 516.464646 896z m-74-523.375c-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.5-1.875-0.25-0.75-0.5-1.125-0.5-1.875-0.25-0.75-0.5-1.125-0.5-1.875-0.25-0.75-0.25-1.125-0.5-1.875s-0.5-1.125-0.5-1.875c-0.25-0.75-0.25-1.125-0.5-1.875s-0.25-1.125-0.5-1.875-0.25-1.125-0.5-1.875-0.25-1.125-0.5-1.875-0.25-1.125-0.5-1.875-0.25-1.125-0.5-1.875-0.25-1.125-0.5-1.875-0.25-1.125-0.5-1.875c0-0.75-0.25-1.125-0.25-1.875s-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875 0-1.125-0.25-1.875c0-0.75-0.25-1.125-0.25-1.875s0-1.125-0.25-1.875c0-0.75 0-1.125-0.25-1.875 0-0.75 0-1.125-0.25-1.875v-22.5c0-0.75 0-1.125 0.25-1.875 0-0.75 0-1.125 0.25-1.875 0-0.75 0-1.125 0.25-1.875 0-0.75 0-1.125 0.25-1.875 0-0.75 0.25-1.125 0.25-1.875s0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875l0.25-0.875c-4.25-0.25-8.625-0.75-12.75-0.75-3.75-0.25-7.25-0.25-11-0.25-3.5 0-7 0-10.5 0.25-7.25 0.25-14 0.875-20.75 1.875-4.25 0.5-8.125 1.125-12.375 1.875-3.5 0.5-6.75 1.125-10.25 1.875-3 0.5-6.25 1.125-9.25 1.875-3 0.75-5.875 1.125-8.875 1.875-2.75 0.75-5.875 1.125-8.875 1.875-2.75 0.5-5.625 1.125-8.375 1.625l-3.25-1.625-3.75-1.875-4 1.375-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-2.75-1.375-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-2.5-1.375 0.5 1.375 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.5 1.125c-0.5 0.25-0.75 0.5-1.125 0.75-0.875 0.75-1.625 1.125-2.5 1.875s-1.625 1.125-2.5 1.875-1.625 1.125-2.5 1.875c-0.75 0.75-1.625 1.125-2.375 1.875-0.75 0.75-1.625 1.125-2.375 1.875-0.75 0.75-1.625 1.125-2.375 1.875-0.75 0.75-1.625 1.125-2.375 1.875-0.75 0.75-1.375 1.125-2.375 1.875-0.75 0.75-1.375 1.125-2.125 1.875-0.75 0.75-1.375 1.125-2.125 1.875-0.75 0.75-1.375 1.125-2.125 1.875-0.75 0.75-1.375 1.125-2.125 1.875-0.75 0.75-1.375 1.125-2.125 1.875-0.75 0.75-1.375 1.125-2.125 1.875-0.75 0.75-1.375 1.125-1.875 1.875-0.75 0.75-1.375 1.125-1.875 1.875l-1.875 1.875-1.875 1.875-1.875 1.875-1.875 1.875c-0.75 0.75-1.125 1.125-1.625 1.875s-1.125 1.125-1.625 1.875-1.125 1.125-1.625 1.875-1.125 1.125-1.625 1.875-1.125 1.125-1.625 1.875-1.125 1.125-1.625 1.875-0.875 1.125-1.625 1.875c-0.5 0.75-0.875 1.125-1.625 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.125 1.875-0.5 0.75-0.875 1.125-1.125 1.875-0.5 0.75-0.75 1.125-1.125 1.875-0.5 0.75-0.75 1.125-1.125 1.875-0.5 0.75-0.75 1.125-1.125 1.875-0.5 0.75-0.75 1.125-1.125 1.875-0.5 0.75-0.75 1.125-1.125 1.875-0.5 0.75-0.75 1.125-1.125 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.5 1.125-0.875 1.875-0.25 0.75-0.5 1.125-0.875 1.875-0.25 0.75-0.5 1.125-0.875 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.5 1.875-0.25 0.75-0.5 1.125-0.5 1.875-0.25 0.75-0.5 1.125-0.5 1.875-0.25 0.75-0.25 1.125-0.5 1.875s-0.25 1.125-0.5 1.875-0.25 1.125-0.5 1.875-0.25 1.125-0.5 1.875-0.25 1.125-0.5 1.875-0.25 1.125-0.5 1.875-0.25 1.125-0.5 1.875-0.25 1.125-0.5 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875 0 1.125-0.25 1.875c0 0.75 0 1.125-0.25 1.875 0 0.75 0 1.125-0.25 1.875 0 0.75 0 1.125-0.25 1.875V457.25v1.875 1.875 1.875 1.875 1.875 0.875 0.875 1.875 1.875 1.875 1.875 1.875 1.875c0 0.75 0 1.125 0.25 1.875 0 0.75 0 1.125 0.25 1.875 0 0.75 0 1.125 0.25 1.875 0 0.75 0.25 1.125 0.25 1.875s0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.5 1.875c0 0.75 0.25 1.125 0.5 1.875s0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.5 1.125 0.5 1.875c0.25 0.75 0.5 1.125 0.5 1.875 0.25 0.75 0.5 1.125 0.5 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.875 1.875 0.25 0.75 0.5 1.125 0.875 1.875 0.25 0.75 0.5 1.125 0.875 1.875 0.25 0.75 0.75 1.125 0.875 1.875 0.25 0.75 0.75 1.125 0.875 1.875 0.25 0.75 0.75 1.125 0.875 1.875 0.25 0.75 0.75 1.125 0.875 1.875 0.25 0.75 0.75 1.125 0.875 1.875 0.25 0.75 0.75 1.125 0.875 1.875 0.25 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.875 1.125 1.125 1.875 0.5 0.75 0.875 1.125 1.125 1.875 0.5 0.75 0.875 1.125 1.125 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.625 1.875 0.5 0.75 0.875 1.125 1.625 1.875 0.5 0.75 1.125 1.125 1.625 1.875s1.125 1.125 1.625 1.875 1.125 1.125 1.625 1.875 1.125 1.125 1.625 1.875 1.125 1.125 1.625 1.875l1.875 1.875 1.875 1.875 1.875 1.875 1.875 1.875c0.75 0.75 1.375 1.125 1.875 1.875 0.75 0.75 1.375 1.125 2.125 1.875 0.75 0.75 1.375 1.125 2.125 1.875 0.75 0.75 1.375 1.125 2.125 1.875 0.75 0.75 1.375 1.125 2.125 1.875 0.75 0.75 1.375 1.125 2.125 1.875 0.75 0.75 1.375 1.125 2.375 1.875 0.75 0.75 1.625 1.125 2.375 1.875 0.75 0.75 1.625 1.125 2.375 1.875 0.75 0.75 1.625 1.125 2.375 1.875 0.875 0.75 1.625 1.125 2.5 1.875s1.625 1.125 2.5 1.875 1.875 1.125 2.5 1.875c0.875 0.75 1.875 1.125 2.75 1.875 0.875 0.75 1.875 1.125 2.75 1.875 0.875 0.75 1.875 1.125 2.75 1.875 0.875 0.75 1.875 1.125 3 1.875 0.875 0.75 2.125 1.125 3 1.875s2.125 1.125 3 1.875c1.125 0.75 2.125 1.125 3.25 1.875 1.125 0.75 2.375 1.125 3.25 1.875 1.125 0.75 2.375 1.125 3.5 1.875 1.125 0.75 2.375 1.125 3.75 1.875 1.125 0.75 2.5 1.125 3.75 1.875 1.375 0.75 2.5 1.125 4 1.875 1.375 0.75 2.75 1.125 4.25 1.875 1.375 0.75 2.75 1.125 4.25 1.875 1.375 0.75 3 1.125 4.375 1.875 1.625 0.75 3 1.125 4.625 1.875 1.625 0.75 3.25 1.125 4.875 1.875 1.875 0.75 3.5 1.125 5.375 1.875s3.75 1.125 5.625 1.875c2.125 0.75 4.25 1.125 6 1.875 2.375 0.75 4.375 1.125 6.75 1.875 2.5 0.75 4.875 1.125 7.5 1.875 2.75 0.75 5.625 1.125 8.625 1.875 3.5 0.75 6.75 1.125 10.25 1.875 4.375 0.75 8.875 1.375 13.25 1.875 11 1.125 22.125 1.875 33.25 1.875h2.5c11.125 0 22.375-0.75 33.5-1.875 4.375-0.5 8.875-1.125 13.25-1.875 3.5-0.5 7-1.125 10.25-1.875 2.75-0.5 5.875-1.125 8.625-1.875 2.5-0.5 5.125-1.125 7.625-1.875 2.375-0.5 4.625-1.125 6.75-1.875 2.125-0.5 4.25-1.125 6.25-1.875 1.875-0.75 4-1.125 5.875-1.875s3.75-1.125 5.375-1.875c1.625-0.75 3.5-1.125 5.125-1.875 1.625-0.75 3.25-1.125 4.875-1.875 1.625-0.75 3-1.125 4.625-1.875 1.375-0.75 3-1.125 4.375-1.875s2.75-1.125 4.25-1.875c1.375-0.75 2.75-1.125 4-1.875 1.375-0.75 2.5-1.125 3.75-1.875 1.125-0.75 2.5-1.125 3.75-1.875 1.125-0.75 2.375-1.125 3.5-1.875 1.125-0.75 2.375-1.125 3.5-1.875 1.125-0.75 2.375-1.125 3.25-1.875 1.125-0.75 2.125-1.125 3.25-1.875 1.125-0.75 2.125-1.125 3-1.875s2.125-1.125 3-1.875 1.875-1.125 3-1.875c0.875-0.75 1.875-1.125 2.75-1.875 0.875-0.75 1.875-1.125 2.75-1.875 0.875-0.75 1.875-1.125 2.75-1.875 0.875-0.75 1.875-1.125 2.5-1.875 0.875-0.75 1.625-1.125 2.5-1.875s1.625-1.125 2.5-1.875 1.625-1.125 2.375-1.875c0.75-0.75 1.625-1.125 2.375-1.875 0.75-0.75 1.625-1.125 2.375-1.875 0.75-0.75 1.375-1.125 2.375-1.875 0.75-0.75 1.375-1.125 2.375-1.875 0.75-0.75 1.375-1.125 2.125-1.875 0.75-0.75 1.375-1.125 2.125-1.875 0.75-0.75 1.375-1.125 2.125-1.875 0.75-0.75 1.375-1.125 2.125-1.875 0.75-0.75 1.375-1.125 1.875-1.875 0.75-0.75 1.375-1.125 1.875-1.875l1.875-1.875 1.875-1.875 1.875-1.875 1.875-1.875c0.75-0.75 1.125-1.125 1.625-1.875s1.125-1.125 1.625-1.875 1.125-1.125 1.625-1.875 1.125-1.125 1.625-1.875 1.125-1.125 1.625-1.875 0.875-1.125 1.625-1.875c0.5-0.75 0.875-1.125 1.625-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.125-1.875 0.5-0.75 0.875-1.125 1.125-1.875 0.5-0.75 0.875-1.125 1.125-1.875 0.5-0.75 0.75-1.125 1.125-1.875 0.5-0.75 0.75-1.125 1.125-1.875 0.5-0.75 0.75-1.125 1.125-1.875 0.5-0.75 0.75-1.125 1.125-1.875 0.5-0.75 0.75-1.125 1.125-1.875 0.5-0.75 0.75-1.125 1.125-1.875 0.5-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.5-1.125 0.875-1.875 0.25-0.75 0.5-1.125 0.875-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.5-1.875 0.25-0.75 0.5-1.125 0.5-1.875 0.25-0.75 0.25-1.125 0.5-1.875s0.5-1.125 0.5-1.875c0.25-0.75 0.25-1.125 0.5-1.875s0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875c0-0.5 0.25-0.75 0.25-1.125-4.625 0.5-9.25 0.875-14 1.125-3.5 0.25-7 0.25-10.75 0.25-4 0-8.125 0-12.125-0.25-6.75-0.25-13.25-0.875-19.5-1.875-3.75-0.5-7.625-1.125-11.375-1.875-3-0.5-5.875-1.125-8.875-1.875-2.5-0.5-5.125-1.125-7.5-1.875-2.125-0.5-4.375-1.125-6.5-1.875-1.875-0.5-4-1.125-5.875-1.875-1.875-0.5-3.5-1.125-5.375-1.875-1.625-0.75-3.25-1.125-4.875-1.875-1.625-0.75-3-1.125-4.625-1.875-1.375-0.75-3-1.125-4.375-1.875s-2.75-1.125-4.25-1.875c-1.375-0.75-2.5-1.125-4-1.875-1.125-0.75-2.5-1.125-3.75-1.875-1.125-0.75-2.375-1.125-3.5-1.875-1.125-0.75-2.375-1.125-3.5-1.875-1.125-0.75-2.125-1.125-3.25-1.875-0.875-0.75-2.125-1.125-3-1.875s-2.125-1.125-3-1.875-1.875-1.125-3-1.875c-0.875-0.75-1.875-1.125-2.75-1.875-0.875-0.75-1.875-1.125-2.75-1.875-0.875-0.75-1.875-1.125-2.5-1.875-0.875-0.75-1.625-1.125-2.5-1.875s-1.625-1.125-2.5-1.875c-0.75-0.75-1.625-1.125-2.375-1.875-0.75-0.75-1.625-1.125-2.375-1.875-0.75-0.75-1.625-1.125-2.375-1.875-0.75-0.75-1.375-1.125-2.125-1.875-0.75-0.75-1.375-1.125-2.125-1.875-0.75-0.75-1.375-1.125-2.125-1.875-0.75-0.75-1.375-1.125-2.125-1.875-0.75-0.75-1.375-1.125-2.125-1.875-0.75-0.75-1.375-1.125-1.875-1.875l-1.875-1.875-1.875-1.875-1.875-1.875c-0.75-0.75-1.125-1.125-1.625-1.875s-1.125-1.125-1.625-1.875-1.125-1.125-1.625-1.875-1.125-1.125-1.625-1.875-1.125-1.125-1.625-1.875-0.875-1.125-1.625-1.875c-0.5-0.75-0.875-1.125-1.625-1.875-0.5-0.75-0.875-1.125-1.375-1.875-0.5-0.75-0.875-1.125-1.375-1.875-0.5-0.75-0.875-1.125-1.375-1.875-0.5-0.75-0.875-1.125-1.375-1.875-0.5-0.75-0.875-1.125-1.375-1.875-0.5-0.75-0.875-1.125-1.375-1.875-0.5-0.75-0.875-1.125-1.125-1.875-0.5-0.75-0.875-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.5-1.125-0.875-1.875-0.25-0.75-0.5-1.125-0.875-1.875-0.25-0.75-0.5-1.125-0.875-1.875-0.25-0.75-0.5-1.125-0.75-1.875-3.125-4.625-3.375-5.125-3.625-5.75z m433.625-71.25v-11.375c0-0.5 0-0.875-0.25-1.625 0-0.5 0-0.875-0.25-1.625 0-0.5 0-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.5-0.875-0.5-1.625-0.25-0.5-0.5-0.875-0.5-1.625-0.25-0.5-0.5-0.875-0.5-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.875-1.625-0.25-0.5-0.5-0.875-0.875-1.625-0.25-0.5-0.5-0.875-0.875-1.625-0.25-0.5-0.5-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.875-0.875-1.125-1.625-0.5-0.5-0.875-0.875-1.125-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625l-1.625-1.625-1.625-1.625c-0.5-0.5-1.125-0.875-1.625-1.625-0.5-0.5-1.125-0.875-1.625-1.625-0.5-0.5-1.125-0.875-1.625-1.625-0.5-0.5-1.125-0.875-1.625-1.625-0.5-0.5-1.125-0.875-1.625-1.625-0.5-0.5-1.125-0.875-1.625-1.625-0.5-0.5-1.125-0.875-1.625-1.625-0.75-0.5-1.125-0.875-1.875-1.625-0.75-0.5-1.125-0.875-1.875-1.625-0.75-0.5-1.125-0.875-1.875-1.625-0.75-0.5-1.125-0.875-1.875-1.625-0.75-0.5-1.125-0.875-1.875-1.625-0.75-0.5-1.125-0.875-1.875-1.625-0.75-0.5-1.375-0.875-1.875-1.625-0.75-0.5-1.375-0.875-1.875-1.625-0.75-0.5-1.375-0.875-2.125-1.625-0.75-0.5-1.375-0.875-2.125-1.625l-0.75-0.5 0.25-0.875 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.25-1.125-2.125 1.125-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-0.5 0.25-0.875-0.25c-2.125-0.5-4.25-0.875-6-1.625-2.125-0.5-4.25-0.875-6.25-1.625-2.125-0.5-4.25-0.875-6.5-1.625-2.375-0.5-4.375-0.875-6.75-1.625-2.375-0.5-4.875-1.125-7.25-1.625-2.75-0.5-5.375-1.125-8.125-1.625-3.25-0.5-6.5-1.125-9.75-1.625-5.375-0.75-10.75-1.125-15.875-1.625-2.75-0.25-5.875-0.25-8.625-0.25-3.75 0-7.5 0-11.125 0.25-6.5 0.25-12.75 0.75-19.125 1.625-3.75 0.5-7.5 0.875-11 1.625-2.75 0.5-5.875 0.875-8.625 1.625-2.375 0.5-4.875 0.875-7.25 1.625-2.125 0.5-4.25 0.875-6.25 1.625-1.875 0.5-3.75 0.875-5.625 1.625-1.875 0.5-3.5 0.875-5.125 1.625-1.625 0.5-3.25 0.875-4.875 1.625-1.375 0.5-3 0.875-4.375 1.625-1.375 0.5-2.75 0.875-4.25 1.625-1.375 0.5-2.5 0.875-4 1.625-1.125 0.5-2.5 0.875-3.75 1.625-1.125 0.5-2.375 0.875-3.75 1.625-1.125 0.5-2.375 0.875-3.5 1.625-1.125 0.5-2.125 0.875-3.25 1.625-1.125 0.5-2.125 0.875-3.25 1.625-0.875 0.5-2.125 0.875-3 1.625-0.875 0.5-1.875 0.875-3 1.625-0.875 0.5-1.875 0.875-2.75 1.625-0.875 0.5-1.875 0.875-2.75 1.625-0.875 0.5-1.875 0.875-2.5 1.625-0.875 0.5-1.625 0.875-2.5 1.625-0.875 0.5-1.625 0.875-2.5 1.625-0.75 0.5-1.625 0.875-2.375 1.625-0.75 0.5-1.625 0.875-2.375 1.625-0.75 0.5-1.625 0.875-2.375 1.625-0.75 0.5-1.375 0.875-2.375 1.625-0.75 0.5-1.375 0.875-2.125 1.625-0.75 0.5-1.375 0.875-2.125 1.625-0.75 0.5-1.375 0.875-2.125 1.625-0.75 0.5-1.375 0.875-2.125 1.625-0.75 0.5-1.375 0.875-1.875 1.625-0.75 0.5-1.375 0.875-1.875 1.625-0.75 0.5-1.125 0.875-1.875 1.625-0.75 0.5-1.125 0.875-1.875 1.625-0.75 0.5-1.125 0.875-1.875 1.625-0.75 0.5-1.125 0.875-1.875 1.625-0.5 0.5-1.125 0.875-1.625 1.625-0.5 0.5-1.125 0.875-1.625 1.625-0.5 0.5-1.125 0.875-1.625 1.625-0.5 0.5-1.125 0.875-1.625 1.625l-1.625 1.625-1.625 1.625c-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.125 1.625-0.5 0.5-0.875 0.875-1.125 1.625-0.5 0.5-0.875 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.5 0.875-0.875 1.625-0.25 0.5-0.5 0.875-0.875 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.5 1.625-0.25 0.5-0.5 0.875-0.5 1.625-0.25 0.5-0.5 0.875-0.5 1.625-0.25 0.5-0.5 0.875-0.5 1.625-0.25 0.5-0.5 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5 0 0.875-0.25 1.625 0 0.5 0 0.875-0.25 1.625 0 0.5 0 0.875-0.25 1.625v1.625 1.625 1.625 3.25 1.625 3.25 1.375 1.625 1.625 1.625 1.625 1.625 1.625 1.625 1.625 1.625c0 0.5 0 0.875 0.25 1.625 0 0.5 0 0.875 0.25 1.625 0 0.5 0 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.5 0.875 0.5 1.625 0.25 0.5 0.5 0.875 0.5 1.625 0.25 0.5 0.5 0.875 0.5 1.625 0.25 0.5 0.5 0.875 0.5 1.625 0.25 0.5 0.5 0.875 0.5 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.875 1.625 0.25 0.5 0.5 0.875 0.875 1.625 0.25 0.5 0.5 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.875 0.875 1.125 1.625 0.5 0.5 0.875 0.875 1.125 1.625 0.5 0.5 0.875 0.875 1.125 1.625 0.5 0.5 0.875 0.875 1.375 1.625 0.5 0.5 0.875 0.875 1.375 1.625 0.5 0.5 0.875 0.875 1.375 1.625 0.5 0.5 0.875 0.875 1.375 1.625 0.5 0.5 0.875 0.875 1.375 1.625 0.5 0.5 0.875 0.875 1.375 1.625 0.5 0.5 0.875 0.875 1.375 1.625l1.625 1.625 1.625 1.625c0.5 0.5 1.125 0.875 1.625 1.625 0.5 0.5 1.125 0.875 1.625 1.625 0.5 0.5 1.125 0.875 1.625 1.625 0.5 0.5 1.125 0.875 1.625 1.625 0.5 0.5 1.125 0.875 1.875 1.625 0.75 0.5 1.125 0.875 1.875 1.625 0.75 0.5 1.125 0.875 1.875 1.625 0.75 0.5 1.125 0.875 1.875 1.625 0.75 0.5 1.375 0.875 1.875 1.625 0.75 0.5 1.375 0.875 1.875 1.625 0.75 0.5 1.375 0.875 2.125 1.625 0.75 0.5 1.375 0.875 2.125 1.625 0.75 0.5 1.375 0.875 2.125 1.625 0.75 0.5 1.375 0.875 2.125 1.625 0.75 0.5 1.375 0.875 2.375 1.625 0.75 0.5 1.625 0.875 2.375 1.625 0.75 0.5 1.625 0.875 2.375 1.625 0.75 0.5 1.625 0.875 2.375 1.625 0.875 0.5 1.625 0.875 2.5 1.625 0.875 0.5 1.625 0.875 2.5 1.625 0.875 0.5 1.875 0.875 2.5 1.625 0.875 0.5 1.875 0.875 2.75 1.625 0.875 0.5 1.875 0.875 2.75 1.625 0.875 0.5 1.875 0.875 3 1.625 0.875 0.5 2.125 0.875 3 1.625 1.125 0.5 2.125 0.875 3.25 1.625 1.125 0.5 2.125 0.875 3.25 1.625 1.125 0.5 2.375 0.875 3.5 1.625 1.125 0.5 2.375 0.875 3.75 1.625 1.125 0.5 2.5 0.875 3.75 1.625 1.375 0.5 2.5 0.875 4 1.625 1.375 0.5 2.75 0.875 4.25 1.625 1.375 0.5 3 0.875 4.375 1.625 1.625 0.5 3.25 0.875 4.875 1.625 1.625 0.5 3.5 0.875 5.125 1.625 1.875 0.5 3.75 0.875 5.875 1.625 2.125 0.5 4.25 1.125 6.25 1.625 2.375 0.5 4.875 1.125 7.25 1.625 2.75 0.5 5.875 1.125 8.625 1.625 3.75 0.75 7.5 1.125 11.125 1.625 9.25 1.125 19.125 1.625 28.875 1.625h1.375c9.25 0 18.375-0.75 27.5-1.625 3.75-0.5 7.25-0.875 10.75-1.625 2.75-0.5 5.625-0.875 8.375-1.625 2.375-0.5 4.625-0.875 7-1.625 2.125-0.5 4.25-0.875 6.25-1.625 1.875-0.5 3.75-0.875 5.625-1.625 1.625-0.5 3.5-0.875 5.125-1.625 1.625-0.5 3.25-0.875 4.625-1.625 1.375-0.5 3-0.875 4.375-1.625 1.375-0.5 2.75-0.875 4.25-1.625 1.375-0.5 2.5-0.875 4-1.625 1.125-0.5 2.5-0.875 3.75-1.625 1.125-0.5 2.375-0.875 3.5-1.625 1.125-0.5 2.375-0.875 3.5-1.625 1.125-0.5 2.125-0.875 3.25-1.625 1.125-0.5 2.125-0.875 3.25-1.625 0.875-0.5 2.125-0.875 3-1.625 0.875-0.5 1.875-0.875 3-1.625 0.875-0.5 1.875-0.875 2.75-1.625 0.875-0.5 1.875-0.875 2.75-1.625 0.875-0.5 1.875-0.875 2.5-1.625 0.875-0.5 1.625-0.875 2.5-1.625 0.875-0.5 1.625-0.875 2.5-1.625 0.875-0.5 1.625-0.875 2.5-1.625 0.75-0.5 1.625-0.875 2.375-1.625 0.75-0.5 1.625-0.875 2.375-1.625 0.75-0.5 1.375-0.875 2.375-1.625 0.75-0.5 1.375-0.875 2.125-1.625 0.75-0.5 1.375-0.875 2.125-1.625 0.75-0.5 1.375-0.875 2.125-1.625 0.75-0.5 1.375-0.875 2.125-1.625 0.75-0.5 1.375-0.875 1.875-1.625 0.75-0.5 1.375-0.875 1.875-1.625 0.75-0.5 1.125-0.875 1.875-1.625 0.75-0.5 1.125-0.875 1.875-1.625 0.75-0.5 1.125-0.875 1.875-1.625 0.75-0.5 1.125-0.875 1.875-1.625 0.5-0.5 1.125-0.875 1.625-1.625 0.5-0.5 1.125-0.875 1.625-1.625 0.5-0.5 1.125-0.875 1.625-1.625 0.5-0.5 1.125-0.875 1.625-1.625 0.5-0.5 1.125-0.875 1.625-1.625l1.625-1.625 1.625-1.625c0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.875-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.5-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.5-0.875 0.875-1.625 0.25-0.5 0.5-0.875 0.875-1.625 0.25-0.5 0.5-0.875 0.875-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.5-1.625 0.25-0.5 0.5-0.875 0.5-1.625 0.25-0.5 0.5-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0-0.875 0.25-1.625 0-0.5 0-0.875 0.25-1.625 0-0.5 0-0.875 0.25-1.625 0-0.5 0-0.875 0.25-1.625 0-0.5 0-0.875 0.25-1.625v-11.375h-3.125zM589.714646 384c-12.625 0-25.375-12.75-25.375-25.375 0-12.75 12.75-25.375 25.375-25.375 19.375 0 31.875 12.625 31.875 25.375-0.125 12.625-12.75 25.375-31.875 25.375zM729.589646 384c-12.625 0-25.375-12.75-25.375-25.375 0-12.75 12.75-25.375 25.375-25.375 19.125 0 31.875 12.625 31.875 25.375 0 12.625-12.75 25.375-31.875 25.375zM328.714646 568.75c-19.125 0-38.375-12.625-38.375-31.625 0-19.125 19.375-31.875 38.375-31.875s31.875 12.75 31.875 31.875-12.875 31.625-31.875 31.625zM506.964646 568.75c-19.125 0-38.125-12.625-38.125-31.625 0-19.125 19.125-31.875 38.125-31.875 19.125 0 31.875 12.75 31.875 31.875s-12.875 31.625-31.875 31.625z"  horiz-adv-x="1059" />
+      
+      <glyph glyph-name="username" unicode="&#58991;" d="M514.594 824.888c-144.11 0-260.979-118.46-260.979-264.558 0-88.783 43.497-166.928 109.711-214.898-135.361-59.354-230.159-195.858-230.159-354.931h0.894c1.541-21.375 18.641-38.377 40.117-38.377s38.575 17.051 40.117 38.377h0.645c0 0.944-0.099 1.79-0.099 2.734 0 0.05 0 0.099 0 0.149 0 0.099-0.05 0.149-0.05 0.199 0.05 159.967 120 291.054 273.009 304.924 8.948-0.944 17.598-2.734 26.844-2.734 144.11 0 260.979 118.46 260.979 264.558s-116.919 264.558-261.029 264.558zM514.594 377.54499999999996c-99.769 0-180.698 81.972-180.698 183.183s80.879 183.183 180.698 183.183c99.719 0 180.647-81.972 180.647-183.183s-80.879-183.183-180.647-183.183zM896.021-6.615000000000009c0 0.348-0.199 0.645-0.199 0.994-1.043 105.038-43.397 200.034-111.35 269.131v0c-7.157 7.357-17.001 11.98-27.986 11.98-21.574 0-39.122-17.747-39.122-39.668 0-11.135 4.573-21.127 11.83-28.334l-0.099-0.05c52.742-55.229 85.302-130.589 85.302-213.853 0-1.043-0.149-1.987-0.149-3.034h0.994c1.491-21.375 18.691-38.377 40.117-38.377 21.475 0 38.575 17.051 40.117 38.377h0.597c0 0.796-0.099 1.491-0.099 2.287-0.05 0.149 0.05 0.348 0.05 0.547z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="password" unicode="&#58995;" d="M519.2 343.29999999999995c-41.1 0-74.4-33.3-74.4-74.4 0-29.7 17.5-55 42.5-67.1v-81.9c0-17.6 14.3-31.9 31.9-31.9 17.6 0 31.9 14.3 31.9 31.9v81.9c25.1 12 42.5 37.4 42.5 66.9 0 41.3-33.2 74.6-74.4 74.6zM827.6-62.10000000000002H189.4c-35.9 0-65.1 29.2-65.1 65.1V428.4c0 35.9 29.2 65.1 65.1 65.1h638.2c17.3 0 33.7-6.7 46-19.1 12.3-12.3 19.1-28.7 19.1-46V3c0-35.9-29.2-65.1-65.1-65.1zM231.9 427.2c-34.8 0-41.3-6.6-41.3-41.3v-340.4c0-34.8 6.6-41.3 41.3-41.3h553.2c34.8 0 41.3 6.6 41.3 41.3V385.9c0 34.8-6.6 41.3-41.3 41.3H231.9zM519.2 86.70000000000005c-18.3 0-33.2 14.8-33.2 33.2V201c-26.3 12.8-42.6 38.8-42.6 67.8 0 41.8 33.9 75.7 75.7 75.7s75.7-33.9 75.7-75.7c0-29-16.3-55-42.5-67.8v-81.1c0.1-18.2-14.9-33.2-33.1-33.2zM519.2 342c-40.4 0-73.2-32.9-73.2-73.2 0-28.3 16.1-53.6 41.9-65.8l0.7-0.4V120c0-17 13.7-30.7 30.7-30.7S550 103.10000000000002 550 120v82.6l0.7 0.4c25.8 12.3 41.9 37.5 41.9 65.8-0.2 40.4-33.1 73.2-73.4 73.2zM207 523.1c-9.1 0-17.6 3.5-23.9 10-6.4 6.4-10 15-10 23.9v2h-0.2l0.2 1.4c0.1 0.5 0.1 0.9 0.2 1.4l0.2 1c0.1 0.6 0.2 1.4 0.4 2 15.3 75.7 57 144.2 117.2 193 29.9 24.2 63.4 43 99.8 56 37.5 13.3 77 20.2 117.5 20.2 61 0 120.8-16.3 173-47.2 50.6-29.9 93-72.8 122.5-123.8 4-5.6 6.1-12.2 6.1-19.2 0-18.3-15-33.3-33.3-33.3-13.2 0-25.1 7.7-30.4 19.8-49.2 84.6-140.4 137.4-238 137.4-128.1 0-238.2-87.1-267.6-211.8v-0.2c-0.7-18.4-15.4-32.6-33.7-32.6z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="refresh-3" unicode="&#59818;" d="M820.376904 697.14807C740.637816 774.519228 631.884926 822.157201 511.999488 822.157201c-244.621347 0-442.925808-198.305485-442.925808-442.926832 0-244.6193 198.304462-442.925808 442.925808-442.925808 206.075449 0 379.271046 140.739395 428.740738 331.337337L822.859445 267.64189899999997c-45.759183-127.45381-167.656441-218.623229-310.859957-218.623229-182.371584 0-330.210677 147.842163-330.210677 330.210677 0 182.371584 147.840116 330.2117 330.210677 330.2117 88.762603 0 169.32443-35.035958 228.655723-92.015693L557.051567 433.822732l280.641725 0 113.880677 0 3.351328 0L954.925297 831.695438 820.376904 697.14807z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="auz" unicode="&#58994;" d="M324.266667 435.2c-17.066667 17.066667-39.822222 17.066667-51.2 0-17.066667-17.066667-17.066667-39.822222 0-51.2l153.6-159.288889c5.688889-5.688889 17.066667-11.377778 28.444444-11.377778s17.066667 5.688889 28.444445 11.377778l295.822222 290.133333c17.066667 17.066667 17.066667 39.822222 0 51.2-17.066667 17.066667-39.822222 17.066667-51.2 0L455.111111 304.355556 324.266667 435.2zM927.288889 753.777778L523.377778 896h-22.755556L96.711111 753.777778c-17.066667-5.688889-28.444444-17.066667-28.444444-34.133334v-432.355555c11.377778-250.311111 409.6-409.6 426.666666-415.288889h22.755556c17.066667 5.688889 415.288889 159.288889 426.666667 415.288889V719.644444c11.377778 17.066667 0 28.444444-17.066667 34.133334z m-45.511111-460.8c-5.688889-182.044444-301.511111-312.888889-369.777778-341.333334-113.777778 45.511111-358.4 182.044444-369.777778 341.333334v398.222222L512 822.044444l369.777778-125.155555v-403.911111z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="shrink-right" unicode="&#58984;" d="M52.294-28.71900000000005h899.793c16.546 0 29.999 13.405 29.999 29.999v59.974c-0.013 16.562-13.436 29.985-29.998 29.999h-899.795c-16.57 0-29.999-13.429-29.999-29.999v-59.974c0-16.617 13.429-29.999 29.999-29.999zM952.087 451.165h-479.884c-16.57 0-29.999-13.405-29.999-29.999v-59.974c0 0 0 0 0 0 0-16.572 13.428-30.01 29.997-30.022h479.885c16.571 0.013 29.999 13.448 29.999 30.022 0 0 0 0 0 0v59.974c0 16.593-13.429 29.999-29.999 29.999zM52.294 691.0840000000001h899.793c16.554 0.013 29.972 13.423 29.999 29.974v59.999c0 16.57-13.429 29.999-29.999 29.999h-899.793c-16.57 0-29.999-13.429-29.999-29.999v-59.997c0-16.546 13.429-29.975 29.999-29.975zM45.183 383.53499999999997l239.919-150.598v301.196l-239.919-150.598z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="spread-left" unicode="&#58987;" d="M942.974 770.924h-843.556c-15.513 0-28.124-12.567-28.124-28.124v-56.226c0.012-15.527 12.596-28.111 28.123-28.124h843.559c15.534 0 28.124 12.59 28.124 28.124v56.226c0 15.578-12.59 28.124-28.124 28.124zM99.418 321.033h449.891c15.534 0 28.124 12.567 28.124 28.124v56.226c0 0 0 0 0 0 0 15.537-12.589 28.134-28.122 28.146h-449.892c-15.534-0.012-28.124-12.608-28.124-28.146 0 0 0 0 0 0v-56.226c0-15.556 12.59-28.124 28.124-28.124zM942.974 96.10900000000004h-843.556c-15.519-0.012-28.099-12.584-28.124-28.101v-56.249c0-15.534 12.59-28.124 28.124-28.124h843.556c15.534 0 28.124 12.59 28.124 28.124v56.248c0 15.513-12.59 28.103-28.124 28.102zM949.641 384.436l-224.924 141.186v-282.37l224.924 141.186z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="snowflake" unicode="&#59057;" d="M480.695-64h63.725V59.291000000000054l68.854-68.242 44.945 44.546-113.798 112.79v180.02l177.271-102.44 41.67-155.652 60.725 16.284-25.398 94.872 85.259-49.266 31.87 55.246-84.726 48.961 94.497 25.343-16.495 61.622-156.068-41.855-176.934 102.245 177.667 102.667 155.513-41.709 16.274 60.793-94.78 25.418 85.255 49.264-31.869 55.247-84.733-48.965 25.326 94.594-61.557 16.51-41.817-156.206-176.948-102.251V644.461l113.849 113.951-44.459 44.496-69.392-69.454V832h-63.725v-97.935l-69.188 69.249-45.068-45.107 114.256-114.355V438.89l-156.557 90.469L283.45 684.39l-60.188-16.458 24.84-94.632-107.544 62.145-31.868-55.247 106.667-61.639-93.463-25.557 16.074-61.237 154.482 42.243 156.169-90.243-156.138-90.226-154.485 42.243-15.855-60.409 94.289-25.784-107.534-62.14 31.868-55.247 106.672 61.642-24.621-93.801 61.012-16.685 40.69 155.028 156.179 90.25v-180.455l-113.801-112.79 44.338-43.944 69.463 68.845V-64z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="tips" unicode="&#59138;" d="M967.280184 578.537671c-24.915459 58.887178-60.544935 111.76755-105.96745 157.161413-45.393863 45.393863-98.273211 81.051991-157.160389 105.96745-60.988026 25.803689-125.735679 38.853913-192.494129 38.853913-66.729797 0-131.504056-13.0799-192.494129-38.853913-58.887178-24.916483-111.766526-60.544935-157.160389-105.96745-45.393863-45.393863-81.051991-98.274234-105.96745-157.161413-25.803689-60.988026-38.884612-125.734656-38.884612-192.464453s13.0799-131.50508 38.884612-192.464453c24.915459-58.887178 60.544935-111.737874 105.96745-157.161413 45.393863-45.393863 98.273211-81.051991 157.160389-105.96745 60.988026-25.803689 125.735679-38.853913 192.494129-38.853913 66.729797 0 131.504056 13.0799 192.494129 38.853913 58.887178 24.916483 111.766526 60.544935 157.160389 105.96745 45.393863 45.393863 81.051991 98.274234 105.96745 157.161413 25.803689 60.988026 38.853913 125.734656 38.853913 192.464453S993.084896 517.549645 967.280184 578.537671zM511.687892-55.138552000000004c-243.302305 0-441.241446 197.909465-441.241446 441.21177S268.385587 827.284989 511.687892 827.284989c243.273652-0.029676 441.210747-197.938118 441.210747-441.21177S754.990197-55.138552000000004 511.687892-55.138552000000004zM511.657192 573.565427m-45.511543 0a44.475 44.475 0 1 1 91.023086 0 44.475 44.475 0 1 1-91.023086 0ZM542.729885 184.14011300000004c0-17.162892-13.906731-31.071669-31.070646-31.071669l0 0c-17.163915 0-31.070646 13.907755-31.070646 31.071669L480.588593 426.998303c0 17.162892 13.906731 31.071669 31.070646 31.071669l0 0c17.163915 0 31.070646-13.907755 31.070646-31.071669L542.729885 184.14011300000004z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="note" unicode="&#58990;" d="M987.2 384.36L512.43 859.13a84.75 84.75 0 0 1-65 24.71L111.55 864.09a84.83 84.83 0 0 1-79.65-79.65L12.15 448.57a84.57 84.57 0 0 1 24.69-65l474.8-474.8a84.91 84.91 0 0 1 119.93 0L987.2 264.41999999999996a84.9 84.9 0 0 1 0 119.94z m-39.28-80.66L592.29-51.91999999999996a29.31 29.31 0 0 0-41.37 0L76.1 422.9a29.22 29.22 0 0 0-8.49 22.38l19.74 335.88a29.29 29.29 0 0 0 27.48 27.48l335.9 19.75a29.32 29.32 0 0 0 22.38-8.52l474.8-474.8a29.31 29.31 0 0 0 0.01-41.37zM236.86 659.14c-50.92-50.95-50.92-133.8 0-184.72a130.61 130.61 0 1 1 184.71 184.72c-50.89 50.86-133.77 50.86-184.71 0zM382.29 513.7c-28.38-28.38-77.78-28.38-106.15 0a75.08 75.08 0 1 0 106.15 0z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="senior" unicode="&#58996;" d="M719.9 292.06666666L514.7 422.16666666V527.76666666C615.6 461.66666666 731.5 386.66666666 731.5 386.66666666s139.2-45.6 139.2 106.5c0 93-172.5 112.1-197.2 11.8l-69.6 47.3s24.2 101.5 162.4 106.5c138.2 4.9 192-94.6 190.9-199.6-1.2-104.7-136-198.3-237.3-167.1zM561 456.66666666c-4-19-23-33.7-47.6-33.7l-6.9 4.3-217.3 137.8S171 597.86666666 160.8 481.66666666c-10.2-116.1 147.4-129.5 186.8-23.8l81.7-47.6s-65.1-119.1-198.5-119.1C97.3 291.16666666000003 0.6 466.46666666 114 588.96666666c113.5 122.4 218.6 64.6 257 35.7 16.4-12.4 85.3-57.9 158.6-105.9l3.1-2.4c28.3-18.2 33.4-35.6 28.3-59.7zM434.1 192.36666665999996h212c16.7 0 30.3-13.6 30.3-30.3v-15.1c0-16.7-13.6-30.3-30.3-30.3h-212c-16.7 0-30.3 13.6-30.3 30.3v15.1c0 16.8 13.6 30.3 30.3 30.3z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="refresh-1" unicode="&#58982;" d="M688.146 736l-192 128v-256l192 128.001zM496.146 767.7090000000001c-231.174-8.416-416-198.479-416-431.709 0-238.587 193.413-432 432-432 233.23 0 423.293 184.826 431.709 416h-64.05c-8.377-195.817-169.778-352-367.658-352-203.241 0-368 164.759-368 368 0 197.88 156.183 359.282 352 367.658v64.051z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="refresh" unicode="&#58985;" d="M928 810.666667c-18.133333 0-32-13.866667-32-32v-164.266667C816 747.733333 669.866667 832 512 832 264.533333 832 64 631.4666669999999 64 384s200.533333-448 448-448c230.4 0 422.4 172.8 445.866667 402.133333 2.133333 17.066667-10.666667 33.066667-28.8 35.2-17.066667 2.133333-33.066667-10.666667-35.2-28.8C873.6 148.26666699999998 709.333333 0 512 0c-212.266667 0-384 171.733333-384 384s171.733333 384 384 384c137.6 0 264.533333-74.666667 332.8-192H693.333333c-18.133333 0-32-13.866667-32-32s13.866667-32 32-32h266.666667V778.666667c0 18.133333-14.933333 32-32 32z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="flag" unicode="&#58988;" d="M878.368178 798.272211c-11.363815 4.799306-24.470321 2.360767-33.31578-6.245238-0.36532-0.350994-37.162388-35.304064-95.163383-56.05262-75.462692-26.993794-150.763702-18.409279-223.812415 25.517163-38.347376 23.060205-81.875752 40.665165-129.376603 52.327786-37.582967 9.228175-77.742619 14.777565-119.363552 16.496719-70.805626 2.925632-121.493052-6.224772-123.615389-6.615675-14.56574-2.682086-25.140587-15.380292-25.140587-30.191626L128.58047-31.312913999999978c0-16.954137 13.745049-30.699186 30.699186-30.699186s30.699186 13.745049 30.699186 30.699186L189.978842 266.68306099999995c15.562441 5.250584 47.994084 14.447037 91.40171 17.48728 35.985586 2.51938 72.440869 0.378623 108.35073-6.363941 44.847417-8.420787 89.059362-24.102954 131.409912-46.611597 46.26879-24.591071 93.776803-41.069371 141.203976-48.977481 38.270629-6.380314 76.541257-7.219425 113.740484-2.491751 64.277956 8.16803 103.877859 30.461779 105.532545 31.406291 9.56689 5.464455 15.471366 15.637142 15.471366 26.656103L897.089565 769.958352C897.091612 782.298402 889.73711 793.470859 878.368178 798.272211zM835.69324 257.496841c-14.58416-5.755074-38.82526-13.530155-70.319555-17.225313-30.990828-3.635807-62.940494-2.676969-94.952582 2.851954-40.201607 6.943133-80.731696 21.171182-120.464629 42.289152-48.455595 25.753547-99.208513 43.61945-150.848637 53.101405-29.29214 5.378497-58.896388 8.079002-88.407516 8.079002-12.228509 0-24.443715-0.464581-36.609803-1.39272-34.879392-2.663666-63.618946-8.741082-84.111676-14.355963L189.978842 766.569162c19.971867 2.003634 50.446949 3.910053 86.392626 2.334161 58.186214-2.554172 143.250588-15.041578 218.064504-60.029188 61.32674-36.877909 119.196753-49.491181 169.691797-49.488111 42.293245 0.002047 79.416747 8.854669 109.019972 19.711947 24.269753 8.901741 45.327348 19.747763 62.544475 30.179346L835.692217 257.496841z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="theme" unicode="&#58986;" d="M512 800C229.696 800 0 570.304 0 288c0-90.368 30.304-174.496 85.344-236.896 55.264-62.624 129.152-97.12 208.128-97.12 81.568 0 161.536 36.832 231.264 106.592l2.272 2.496c65.792 81.472 132.896 121.056 205.088 121.056 46.72 0 89.216-15.872 126.688-29.92 30.336-11.328 56.576-21.12 81.216-21.12C1024 133.08799999999997 1024 241.664 1024 288c0 282.304-229.696 512-512 512z m428-602.912c-13.088 0-35.296 8.288-58.784 17.088-40.48 15.136-90.848 33.952-149.12 33.952-92.352 0-175.328-46.944-253.76-143.456-57.184-56.704-121.056-86.688-184.832-86.688-60.352 0-117.216 26.784-160.128 75.456C88.64 144.12800000000004 64 213.216 64 288 64 535.04 264.96 736 512 736s448-200.96 448-448c0-27.328-1.952-90.912-20-90.912zM800.704 379.93600000000004m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM457.024 582.624m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM672.704 555.9359999999999m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM291.392 443.936m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM278.4 197.24800000000005m-96 0a96 96 0 1 1 192 0 96 96 0 1 1-192 0Z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="notice" unicode="&#58983;" d="M544 798.976V864h-64v-65.024C289.536 786.304 160 658.624 160 416v-288h64V416c0 192 115.456 320 288 320 180.544 0 288-128 288-320v-288h64V416c0 242.88-122.496 370.56-320 382.976zM672 64a160 160 0 1 0-320 0h64a96 96 0 0 1 192 0h64zM64 128h896v-64H64v64z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="console" unicode="&#58981;" d="M30.552 104.72699999999998c4.654-16.29 23.272-23.272 37.236-18.618 16.291 4.655 23.273 23.273 18.618 37.236C16.588 314.182 84.08 521.31 237.68 640c11.636 9.31 23.273 16.29 37.236 25.6 25.6 16.29 53.528 30.255 83.782 39.564 58.182 20.945 118.691 30.254 176.873 27.927h25.6c6.982 0 11.636 0 18.618-2.327 30.255-4.655 58.182-11.637 88.436-23.273 235.055-86.11 356.073-346.764 269.964-581.818-4.654-16.291 2.327-32.582 18.618-37.237 16.291-4.654 32.582 2.328 37.237 18.619 41.89 116.363 39.563 239.709 0 349.09h2.327C921.897 656.2909999999999 738.043 784.2909999999999 537.897 793.6h-48.873c-200.145-9.31-384-137.31-458.472-337.455-39.564-109.381-41.891-232.727 0-351.418z m707.49 386.328a29.498 29.498 0 0 1-41.89 0L521.606 316.509c-4.654 2.327-9.309 2.327-13.963 2.327-32.582 0-58.182-25.6-58.182-58.181s25.6-58.182 58.182-58.182 58.181 25.6 58.181 58.182c0 4.654 0 9.309-2.327 16.29l174.546 174.546c11.636 11.636 11.636 30.254 0 39.564z m228.073-458.473H58.48c-16.29 0-30.255-13.964-30.255-30.255 0-16.29 13.964-30.254 30.255-30.254h907.636c16.291 0 30.255 13.963 30.255 30.254 0 16.291-13.964 30.255-30.255 30.255z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="website" unicode="&#59310;" d="M777.073418 147.443038c-30.460759 21.387342-40.83038 40.182278-76.47595 53.792405 25.275949 60.273418 40.182278 83.605063 42.126583 154.896203H887.898734c-3.888608-99.159494-45.367089-143.878481-110.825316-208.688608zM136.101266 356.13164600000005h167.210126c1.944304-71.291139 16.850633-94.622785 42.126583-154.896203-34.997468-13.610127-68.050633-31.756962-98.511393-53.792405C181.468354 212.25316499999997 139.989873 256.97215200000005 136.101266 356.13164600000005z m103.048101 259.888607c29.164557-23.979747 61.56962-42.774684 96.567089-57.681012-19.443038-53.792405-30.460759-90.734177-31.756962-152.951899H136.101266c3.240506 90.734177 46.663291 147.767089 103.048101 210.632911z m309.144304-209.98481V523.989873c47.311392 1.296203 71.291139 10.36962 114.065823 25.27595 18.146835-51.2 28.516456-84.901266 30.460759-143.23038H548.293671z m104.344304-195.078481c-40.182278 12.962025-60.273418 20.091139-104.344304 21.387342V356.13164600000005h144.526582c-1.944304-68.050633-16.202532-88.141772-40.182278-145.174684z m36.941772-57.681013c31.756962-12.313924 39.534177-28.516456 66.75443-47.311392-51.848101-44.718987-114.713924-73.883544-182.116455-84.901266 36.941772 37.589873 90.734177 82.308861 115.362025 132.212658z m-163.321519-137.397468l22.035443 165.913924c40.182278-1.296203 56.38481-7.777215 92.678481-18.794937-27.220253-56.38481-66.106329-106.288608-113.417722-147.118987h-1.296202z m-75.827848 5.18481c-67.402532 11.017722-130.268354 40.83038-182.764557 84.901266 27.868354 19.443038 57.681013 34.997468 88.789873 47.311392 23.331646-48.607595 55.088608-93.326582 93.974684-132.212658z m47.311392 335.068355v-123.787342c-44.070886-1.296203-64.162025-8.425316-104.344304-21.387342-23.979747 57.681013-38.237975 77.124051-40.182278 145.174684h144.526582zM383.675949 549.265823c42.774684-14.906329 66.75443-23.331646 114.065823-25.27595v-117.95443H353.21519c1.944304 58.329114 12.313924 92.03038 30.460759 143.23038z m-37.589873 57.032911c-31.756962 12.962025-60.921519 30.460759-88.141772 51.848101 53.792405 51.848101 115.362025 91.382278 192.486076 104.344304-44.718987-44.718987-80.364557-97.863291-104.344304-156.192405z m151.655696 161.377215v-193.782278c-44.070886 1.296203-64.162025 9.073418-103.696202 22.683544 29.164557 68.698734 49.903797 127.027848 102.4 171.098734h1.296202z m75.827848-4.536708c77.772152-13.610127 149.711392-49.903797 206.744304-104.344304-29.164557-22.035443-46.01519-37.589873-80.364557-51.848102-25.275949 59.625316-82.956962 112.76962-126.379747 156.192406z m-46.01519 4.536708c54.440506-46.01519 97.21519-104.992405 124.435443-171.098734-39.534177-13.610127-59.625316-21.387342-103.696202-22.683544l-22.035443 193.782278h1.296202z m-31.10886-751.149367c-46.663291 38.886076-62.865823 88.789873-91.382279 147.118988 36.293671 11.665823 53.144304 17.498734 93.326582 18.794936v-165.913924h-1.944303zM887.898734 406.035443h-145.174683c-1.296203 61.56962-12.313924 98.511392-31.756962 152.303798 37.589873 15.55443 57.032911 33.053165 88.789873 57.681012 56.38481-62.865823 84.901266-119.898734 88.141772-209.98481z m-375.898734 427.746835c-244.334177 0-442.005063-197.670886-442.005063-442.005063S267.665823-50.227847999999994 512-50.227847999999994s442.005063 197.670886 442.005063 442.005063S756.334177 833.782278 512 833.782278z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="face-surprised" unicode="&#58980;" d="M485.656116-128C221.592397-128 6.762016 86.81718000000001 6.762016 350.87649799999997s214.830381 478.867697 478.8941 478.867697c264.041716 0 478.854495-214.812779 478.854495-478.867697S749.697832-128 485.656116-128zM485.656116 798.834741c-247.024795 0-447.975846-200.959852-447.975846-447.962644 0-247.002792 200.951051-447.962644 447.975846-447.962644 247.002792 0 447.953843 200.959852 447.953843 447.962644C933.609959 597.8748889999999 732.658908 798.834741 485.656116 798.834741zM352.033458 447.380528c0-30.469398-24.682677-55.147675-55.143274-55.147675-30.451796 0-55.143274 24.678276-55.143274 55.147675 0 30.460597 24.691478 55.138874 55.143274 55.138874C327.350781 502.519402 352.033458 477.845526 352.033458 447.380528zM674.417647 502.519402c-30.460597 0-55.156476-24.678276-55.156476-55.138874 0-30.469398 24.695879-55.147675 55.156476-55.147675 30.451796 0 55.143274 24.678276 55.143274 55.147675C729.560922 477.845526 704.869444 502.519402 674.417647 502.519402zM562.005634 165.30976499999997c0-59.733046-34.192262-108.165484-76.349518-108.165484-42.166057 0-76.36272 48.432438-76.36272 108.165484 0 59.724245 34.196663 108.152282 76.36272 108.152282C527.813371 273.45764699999995 562.005634 225.03400999999997 562.005634 165.30976499999997zM835.631745 793.712503c0 0 12.871605 56.819883 41.959231 85.925112 29.083226 29.096427 69.915916 15.124685 78.492585-8.801097 9.461179-26.385689-2.033053-50.069442-29.092027-56.164202C899.404495 808.463141 874.880237 826.192952 835.631745 793.712503zM916.698651 757.570797c0 0 35.767659 20.576965 64.877288 19.393218 29.136032-1.174946 41.431165-29.144833 33.109728-45.110024-9.192746-17.588993-27.054573-22.966463-43.217788-11.797871C954.979023 731.44034 952.453108 752.721393 916.698651 757.570797z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="set" unicode="&#59158;" d="M466.496-126.62400000000002l-1.056 0.064c-25.184 2.08-47.456 22.368-51.744 47.232l-17.344 102.4c-0.672 4.064-6.624 11.04-10.56 12.416l-30.336 12.416c-5.44 2.496-15.424 0.8-17.472-0.64l-84.992-60.16c-19.584-14.016-51.456-12.736-70.08 3.168l-64.288 64c-17.952 20.48-19.488 50.592-4.736 71.296l60.416 84.672c2.176 3.072 2.784 11.52 1.024 15.04l0 0c0 0-1.664 3.104-7.264 16.608-6.176 14.848-6.816 17.44-6.816 17.44-0.992 3.04-7.456 8.672-11.36 9.376l-102.56 17.248c-25.152 4.288-45.44 26.624-47.168 52L0 428.288c2.112 27.36 22.496 49.6 47.52 53.728l102.528 17.344c4.128 0.672 11.008 6.56 12.416 10.496l12.608 30.336c2.368 4.992 1.6 14.112-0.8 17.504L113.984 642.24C99.36 662.88 100.704 692.896 117.056 712.192l64.416 64.224c20.672 18.208 51.296 18.784 71.36 4.64l84.992-60.16c1.952-1.376 13.28-2.016 15.04-1.056 0.384 0.192 2.528 1.344 16.704 7.168 14.24 5.92 16.576 6.592 16.576 6.592 3.84 1.184 9.504 7.648 10.144 11.424l17.44 102.4c4.32 25.152 26.752 45.376 52.128 47.104l90.528 0.064c27.328-2.112 49.632-22.368 53.952-47.232l17.344-102.432c0.672-4.064 6.656-11.04 10.624-12.48l30.304-12.352c6.24-2.784 15.456-0.8 17.44 0.608l85.024 60.16c19.52 14.016 51.392 12.704 70.08-3.136l64.288-64.032c17.952-20.48 19.456-50.56 4.736-71.264l-60.416-84.672c-2.208-3.136-2.848-11.616-1.056-15.04 0.16-0.352 1.376-2.56 7.232-16.672 5.856-14.112 6.592-16.512 6.592-16.512 1.248-4.032 7.712-9.6 11.648-10.304l102.56-17.248c25.152-4.224 45.44-26.592 47.168-52l0.096-90.304c-2.112-27.392-22.528-49.6-47.552-53.728l-102.528-17.376c-4.128-0.672-10.944-6.496-12.32-10.432l-12.736-30.432c-2.336-4.928-1.568-14.112 0.832-17.472l60.288-84.512c14.624-20.736 13.216-50.816-3.232-70.048l-64.192-64.096c-11.328-9.92-24.64-14.72-38.784-14.72l0 0c-11.904 0-23.52 3.552-32.704 10.016l-84.992 60.16c-1.952 1.408-13.312 2.016-15.072 1.056-0.288-0.16-2.432-1.312-16.608-7.2-14.08-5.792-16.384-6.496-16.384-6.496-4.16-1.28-9.792-7.776-10.432-11.52l-17.408-102.4c-4.352-25.152-26.72-45.344-52.032-47.104L466.496-126.62400000000002zM347.84 100.60799999999995c10.368 0 20.192-2.112 28.48-6.112l27.648-11.296c20.416-7.072 38.976-28.992 42.848-51.584l17.344-102.336c0.288-1.6 3.136-4.32 5.056-4.832l87.296 0.064c-0.032 0.064 3.04 2.944 3.328 4.672l17.408 102.368c3.872 22.656 23.328 44.832 45.28 51.584 0 0 0 0 0 0-0.096 0 2.976 1.152 12.448 5.056 9.472 3.936 12.384 5.248 13.12 5.568 18.208 9.6 49.44 8.032 67.776-4.96l84.928-60.16c0.192-0.128 1.312-0.64 3.104-0.64l0 0c2.048 0 3.52 0.672 3.872 0.96l61.536 61.408 0 0c-0.16 0 0.064 4.416-0.992 5.952l-60.224 84.448c-13.248 18.624-15.68 47.168-5.792 67.872l11.648 27.84c6.944 19.968 29.408 38.912 51.68 42.496l102.464 17.376c1.824 0.384 4.736 3.648 4.864 5.408L972.8 428.288l0 0c-0.096 0-2.88 3.072-4.576 3.424l-102.72 17.28c-23.168 4.032-44.896 22.976-51.776 45.056l0 0c-0.032 0-1.216 3.04-5.12 12.512-3.968 9.568-5.28 12.512-5.632 13.248-10.24 19.36-8.288 48.736 4.96 67.456L868.448 672c0.96 1.408 0.736 5.6-0.384 6.912l-61.408 61.184c0.704-0.8-0.768-0.192-2.848-0.192-1.728 0-2.784-0.416-3.008-0.576l-85.024-60.16c-17.824-12.8-47.776-15.36-68-5.664l-27.712 11.296c-20.512 7.2-39.04 29.088-42.88 51.584l-17.344 102.336c-0.288 1.76-3.616 4.704-5.504 4.864L467.616 843.52c0-0.064-3.104-2.944-3.392-4.672l-17.408-102.336c-3.84-22.624-23.264-44.8-45.216-51.584 0-0.032-3.008-1.184-12.416-5.088-9.568-3.936-12.512-5.248-13.248-5.568-17.984-9.568-49.344-8.032-67.744 4.992L223.264 739.36c-0.416 0.32-6.176 0.288-6.848-0.224L154.688 677.6320000000001c0 0 0 0 0 0 0.224 0 0.032-4.384 1.056-5.856L216 587.264c13.312-18.752 15.744-47.296 5.76-67.968l-11.52-27.648c-6.976-20.032-29.472-38.944-51.776-42.624L55.968 431.68c-1.824-0.384-4.704-3.648-4.832-5.408l0.096-86.56 0 0c0.096 0 2.912-3.104 4.608-3.424l102.656-17.28c23.04-4 44.704-22.912 51.712-44.928 0.256-0.736 1.44-3.84 5.088-12.64 3.68-8.832 5.024-11.84 5.472-12.736 10.592-20.288 8.672-48.96-4.672-67.904l-60.512-84.768c-0.96-1.408-0.736-5.632 0.384-6.912l61.408-61.184c-0.736 0.8 0.736 0.224 2.816 0.192 1.728 0 2.784 0.416 3.008 0.576l84.992 60.16C318.624 96.32000000000005 333.088 100.60799999999995 347.84 100.60799999999995zM512.032 133.856c-138.336 0-250.848 112.224-250.848 250.176 0 137.92 112.544 250.144 250.848 250.144s250.848-112.224 250.848-250.144C762.88 246.08000000000004 650.336 133.856 512.032 133.856zM512.032 583.136c-110.08 0-199.648-89.312-199.648-199.104s89.568-199.136 199.648-199.136 199.648 89.344 199.648 199.136S622.112 583.136 512.032 583.136z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="template" unicode="&#58979;" d="M734 172.89999999999998v82.8h-59.9v-37l-35.7-9.7 15.7-57.8zM674.1 419.3H734v-81.8h-59.9zM734 600.2l-95.6-26 15.7-57.8 20 5.4v-20.7H734zM866.1 131.29999999999995v-37l-35.7-9.7 7.9-28.9 7.8-28.9 79.9 21.7v82.8h-29.9zM740.9 60.299999999999955L651.4 36l7.9-28.9 7.8-29 89.5 24.4-7.8 28.9zM740.9 781.7l-89.5-24.3 7.9-28.9 7.8-28.9 89.5 24.3-7.8 28.9zM830.4 806l7.9-28.9 7.8-28.9 20 5.5v-20.8H926V832zM866.1 612.6v-120.3H926V612.6h-29.9zM866.1 371.9v-120.3H926V371.9h-29.9zM541.9 665.6l35.7 9.7-7.8 28.9-7.8 28.9-50-13.6L98 832v-783.5l384.1-104.3L512-64l29.9 8.1 35.7 9.7-7.8 28.9-7.8 28.9-20-5.4V120.79999999999995l35.7 9.7-15.7 57.8-20-5.4V486l35.7 9.7-15.7 57.8-20-5.4V665.6z m-59.8-659.4l-324.2 88.1V753.7l324.2-88.1V548l-192 52.2v-427.3l192-52.2v-114.5z m0 360.9V182.79999999999995l-132.2 35.9V521.8l132.2-35.9v-118.8z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="app" unicode="&#58963;" d="M432.022 818.946h-376.324c-6.627 0-12.078-5.45-12.078-12.078v-376.324c0-6.627 5.45-12.078 12.078-12.078h376.324c6.627 0 12.078 5.45 12.078 12.078v376.473c0 6.627-5.45 11.93-12.078 11.93zM391.517 471.196h-295.169v295.169h295.021v-295.169zM976.847 635.717l-211.95 211.95c-8.837 8.837-23.124 8.837-31.963 0l-211.95-211.95c-8.837-8.837-8.837-23.124 0-31.963l211.95-212.098c8.837-8.837 23.124-8.837 31.963 0l211.95 211.95c8.837 8.987 8.837 23.271 0 32.109zM432.022 313.45000000000005h-376.324c-6.627 0-12.078-5.45-12.078-12.078v-376.324c0-6.627 5.45-12.078 12.078-12.078h376.324c6.627 0 12.078 5.45 12.078 12.078v376.473c0 6.627-5.45 11.93-12.078 11.93zM391.517-34.15499999999997h-295.169v295.021h295.021v-295.021zM932.511 313.45000000000005h-376.324c-6.627 0-12.078-5.45-12.078-12.078v-376.324c0-6.627 5.45-12.078 12.078-12.078h376.324c6.627 0 12.078 5.45 12.078 12.078v376.473c0 6.627-5.45 11.93-12.078 11.93zM891.859-34.15499999999997h-295.021v295.021h295.021v-295.021z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="template-1" unicode="&#58966;" d="M512 384zM43.52 601.6l409.6-176.64c58.88-30.72 110.08 0 110.08 0l414.72 174.08 2.56 2.56c10.24 5.12 15.36 15.36 15.36 28.16 0 15.36-10.24 28.16-23.04 30.72L563.2 837.12c-56.32 23.04-97.28 0-97.28 0L46.08 660.48c-12.8-5.12-20.48-17.92-20.48-30.72s7.68-23.04 17.92-28.16z m0 0M512 222.72000000000003c-2.56 0-7.68 0-10.24 2.56l-486.4 215.04c-12.8 5.12-17.92 20.48-12.8 33.28 5.12 12.8 20.48 17.92 33.28 12.8L512 276.48 988.16 486.4c12.8 5.12 28.16 0 33.28-12.8 5.12-12.8 0-28.16-12.8-33.28l-486.4-215.04c-2.56-2.56-7.68-2.56-10.24-2.56zM512 71.67999999999995c-2.56 0-7.68 0-10.24 2.56l-486.4 215.04c-12.8 5.12-17.92 20.48-12.8 33.28 5.12 10.24 20.48 17.92 33.28 10.24L512 125.44000000000005 988.16 332.79999999999995c12.8 5.12 28.16 0 33.28-12.8 5.12-12.8 0-28.16-12.8-33.28l-486.4-215.04H512zM512-79.36000000000001c-2.56 0-7.68 0-10.24 2.56l-486.4 215.04c-12.8 5.12-17.92 20.48-12.8 33.28 5.12 12.8 20.48 17.92 33.28 12.8L512-25.600000000000023l476.16 209.92c12.8 5.12 28.16 0 33.28-12.8 5.12-12.8 0-28.16-12.8-33.28l-486.4-215.04c-2.56-2.56-7.68-2.56-10.24-2.56z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="home" unicode="&#59022;" d="M824.084343-40.42033900000001H232.898863c-74.604138 0-85.85232 28.334325-85.852321 49.997718l-0.584307 5.314029V447.645552h48.806589v-402.916582c0-25.547863 13.548574-36.343743 37.629015-36.343743h568.020898c25.928532 0 27.978215 6.220678 27.978215 37.84391V447.585177l48.806589 0.118704c0.022513-14.346753 0-382.76666 0-433.098999 0-38.130436-12.726859-54.765301-51.858088-54.765301l-1.76111-0.25992zM1012.470921 493.103884C849.773422 615.120868 687.101505 737.137853 524.404006 859.153814c-6.207375 4.659113-18.433838 4.659113-24.641213 0C337.077573 737.137853 174.393377 615.120868 11.696902 493.103884c-24.856108-18.635429-0.572028-61.044308 24.642236-42.13361A15995638.709915 15995638.709915 0 0 1 512.025071 807.737794c0.988514-0.715291 1.644453-1.144056 2.823302-2.037403 18.040888-13.524015 36.057217-27.036773 54.073546-40.560788 58.291614-43.718711 116.583229-87.437421 174.874843-131.143852 81.33647-61.008492 162.696476-122.015961 244.033969-183.024454 25.212218-18.911722 49.496298 23.497157 24.64019 42.132587z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="female" unicode="&#58977;" d="M774.4 800c-48 35.2-108.8 51.2-172.8 51.2-105.6 0-208-51.2-268.8-150.4-89.6-134.4-57.6-313.6 60.8-416l-32-51.2-188.8 121.6S128 384 108.8 352c-22.4-35.2 22.4-64 22.4-64l188.8-121.6-105.6-163.2s-19.2-32 16-51.2c38.4-22.4 57.6 12.8 57.6 12.8l102.4 160 185.6-121.6s48-28.8 70.4 6.4c19.2 28.8-25.6 57.6-25.6 57.6L432 192l32 48c44.8-22.4 92.8-32 137.6-32 105.6 0 208 51.2 268.8 150.4 96 147.2 51.2 345.6-96 441.6z m35.2-400c-44.8-67.2-118.4-108.8-201.6-108.8-44.8 0-92.8 12.8-131.2 38.4-112 73.6-147.2 220.8-73.6 332.8 44.8 64 121.6 105.6 201.6 108.8 44.8 0 92.8-12.8 131.2-38.4 112-73.6 147.2-220.8 73.6-332.8z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="male" unicode="&#58978;" d="M889.6 800h-240s-35.2 0-38.4-41.6c0-19.2 16-38.4 38.4-38.4h140.8l-179.2-179.2C556.8 582.4 489.6 608 416 608 240 608 96 464 96 288s144-320 320-320 320 144 320 320c0 73.6-25.6 140.8-67.2 195.2l179.2 179.2v-140.8c0-22.4 19.2-38.4 38.4-38.4 22.4 0 38.4 19.2 38.4 41.6V764.8h3.2C924.8 800 889.6 800 889.6 800zM416 48c-131.2 0-236.8 105.6-236.8 236.8 0 131.2 105.6 236.8 236.8 236.8s236.8-105.6 236.8-236.8c0-131.2-105.6-236.8-236.8-236.8z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="tread" unicode="&#59077;" d="M860.8 172.79999999999995l6.4-57.6-6.4 57.6c12.8 0 25.6 3.2 35.2 12.8 6.4 9.6 6.4 22.4 3.2 32l57.6 12.8-57.6-12.8L800 553.6c-6.4 28.8-25.6 51.2-48 64-9.6 6.4-22.4 9.6-32 9.6H182.4c-22.4 3.2-41.6-6.4-51.2-25.6-6.4-9.6-6.4-19.2-9.6-28.8v-342.4c0-19.2 9.6-38.4 28.8-48 6.4-3.2 12.8-6.4 19.2-6.4h192l19.2-25.6 147.2-188.8c6.4-9.6 19.2-12.8 28.8-9.6 16 3.2 25.6 19.2 22.4 35.2l-9.6 118.4-6.4 67.2h297.6z m-233.6-57.6l9.6-128c3.2-28.8-9.6-54.4-28.8-73.6-35.2-32-92.8-28.8-124.8 6.4l-156.8 195.2H179.2c-19.2 0-38.4 6.4-57.6 16-35.2 19.2-57.6 57.6-57.6 99.2V572.8c0 19.2 6.4 38.4 16 57.6 19.2 38.4 57.6 60.8 99.2 54.4h537.6c67.2-3.2 121.6-48 137.6-112l102.4-339.2c6.4-28.8 3.2-57.6-12.8-80-19.2-22.4-48-38.4-76.8-38.4h-240zM304 627.2v-451.2h57.6V627.2H304z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="praise" unicode="&#59078;" d="M860.8 595.2h-297.6l6.4 67.2 9.6 118.4c3.2 16-6.4 32-22.4 35.2-9.6 3.2-22.4 0-28.8-9.6l-147.2-188.8-19.2-25.6h-192c-6.4 0-12.8-3.2-19.2-6.4-19.2-9.6-28.8-28.8-28.8-48v-342.4c0-9.6 3.2-22.4 9.6-28.8 9.6-19.2 28.8-28.8 48-25.6h537.6c12.8 0 22.4 3.2 32 9.6 25.6 12.8 44.8 35.2 48 64l102.4 336 57.6-12.8-57.6 12.8c3.2 9.6 0 22.4-3.2 32-9.6 6.4-22.4 12.8-35.2 12.8l6.4 57.6-6.4-57.6z m-233.6 57.6h240c28.8 0 57.6-12.8 76.8-38.4 16-22.4 19.2-54.4 12.8-80l-102.4-339.2c-16-64-70.4-108.8-137.6-112H179.2c-41.6-3.2-80 19.2-99.2 54.4-9.6 19.2-16 38.4-16 57.6V537.6c0 41.6 22.4 80 57.6 99.2 19.2 9.6 38.4 12.8 57.6 16h144L480 848c32 35.2 89.6 38.4 124.8 6.4 19.2-19.2 32-44.8 28.8-73.6l-6.4-128z m-323.2-512h57.6V592H304v-451.2z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="rmb" unicode="&#58974;" d="M511.998465 896C229.23338 896 0.004605 666.769178 0.004605 384.001023c0-282.773272 229.227752-512.001023 511.99386-512.001023 282.769178 0 511.994883 229.227752 511.994883 512.001023C1023.994372 666.769178 794.767644 896 511.998465 896zM511.998465-91.59690499999999c-262.660188 0-475.589742 212.930577-475.589742 475.597929 0 262.663258 212.929554 475.594859 475.589742 475.594859 262.663258 0 475.590765-212.9316 475.590765-475.594859C987.590254 121.33469500000001 774.662747-91.59690499999999 511.998465-91.59690499999999zM738.742652 301.137781L544.432155 301.137781l0 69.780273 194.310497 0c17.835204 0 32.249495 14.43885 32.249495 32.220842 0 17.784038-14.414291 32.19526-32.249495 32.19526L589.7462 435.334155l149.620669 209.579249c8.916067 15.397688 3.63069 35.099403-11.82021 43.988864-15.398712 8.891508-35.097356 3.629667-44.017516-11.793604L512.187777 437.098335 340.84334 677.108664c-8.864902 15.423271-28.617781 20.685111-44.016493 11.793604-15.395642-8.889461-20.685111-28.590152-11.82021-43.988864l149.622716-209.579249L285.628808 435.334155c-17.781992 0-32.245402-14.411221-32.245402-32.19526 0-17.781992 14.46341-32.220842 32.245402-32.220842l194.310497 0 0-69.780273L285.628808 301.137781c-17.781992 0-32.245402-14.413268-32.245402-32.19526s14.46341-32.220842 32.245402-32.220842l194.310497 0 0-132.435265c0-17.780969 14.46341-32.19526 32.248472-32.19526 17.835204 0 32.245402 14.414291 32.245402 32.19526L544.433178 236.72065499999997l194.310497 0c17.835204 0 32.249495 14.43885 32.249495 32.220842S756.577856 301.137781 738.742652 301.137781"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="more" unicode="&#58975;" d="M224 288c-52.928 0-96 43.072-96 96s43.072 96 96 96 96-43.072 96-96-43.072-96-96-96z m288 0c-52.928 0-96 43.072-96 96s43.072 96 96 96 96-43.072 96-96-43.072-96-96-96z m288 0c-52.928 0-96 43.072-96 96s43.072 96 96 96 96-43.072 96-96-43.072-96-96-96z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="camera" unicode="&#58976;" d="M884.3 648.6H704.2L679.5 698l-0.2 0.4c-1.9 3.6-3.6 6.9-5.1 9.9-12 23.4-21.5 41.9-54.1 41.9H416.7c-32.9 0-43.7-21.3-55.1-43.8-1.3-2.6-2.7-5.3-4.2-8.1l-24.8-49.7H152.4c-34 0-61.7-27.7-61.7-61.7v-488c0-34 27.7-61.7 61.7-61.7h731.9c34 0 61.7 27.7 61.7 61.7v488c0 34-27.7 61.7-61.7 61.7zM904 98.89999999999998c0-10.8-8.8-19.7-19.7-19.7H152.4c-10.8 0-19.7 8.8-19.7 19.7v488c0 10.8 8.8 19.7 19.7 19.7h206.1l36.2 72.5c1.5 2.9 2.9 5.7 4.3 8.3 10.6 20.8 11.1 20.8 17.7 20.8H620c4.6 0 5.8-0.6 5.8-0.6 2-1.2 7.2-11.2 10.9-18.5 1.6-3.1 3.3-6.5 5.3-10.1l36.2-72.4h206.1c10.8 0 19.7-8.8 19.7-19.7v-488zM525.5 565.5c-123.5 0-223.6-100.1-223.6-223.6S402 118.20000000000005 525.5 118.20000000000005s223.7 100.1 223.7 223.7c0 123.5-100.2 223.6-223.7 223.6z m0-402.5c-98.8 0-178.9 80.1-178.9 178.9 0 98.8 80.1 178.9 178.9 178.9 98.8 0 178.9-80.1 178.9-178.9 0-98.8-80.1-178.9-178.9-178.9z m246 402.5v-44.7H861v44.7h-89.5z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="cart-simple" unicode="&#59032;" d="M235.097303 196.866982C247.384597 160.417152 286.382106 132.37606800000003 324.772759 132.37606800000003L861.658537 132.37606800000003 880.429732 132.37606800000003 885.649214 150.54185399999994 1009.08775 580.154957C1021.388907 622.967661 993.187631 660.786325 949.051586 660.786325L424.585365 660.786325C410.791718 660.786325 399.609756 649.5207379999999 399.609756 635.623932 399.609756 621.727125 410.791718 610.461538 424.585365 610.461538L949.051586 610.461538C959.924 610.461538 964.161052 604.779539 961.106394 594.148171L837.667859 164.53506800000002 861.658537 182.70085500000005 324.772759 182.70085500000005C307.742153 182.70085500000005 287.789837 197.04752900000005 282.395194 213.05054900000005L73.600164 832.433664C69.16437 845.592294 54.980454 852.636656 41.919502 848.167687 28.858551 843.698719 21.86648 829.408727 26.302275 816.250097L235.097303 196.866982ZM399.609756-6.017094000000043C399.609756 49.57012899999995 354.881911 94.63247799999999 299.707317 94.63247799999999 244.532723 94.63247799999999 199.804878 49.57012899999995 199.804878-6.017094000000043 199.804878-61.604318000000035 244.532723-106.66666699999996 299.707317-106.66666699999996 354.881911-106.66666699999996 399.609756-61.604318000000035 399.609756-6.017094000000043ZM249.756098-6.017094000000043C249.756098 21.77651800000001 272.120021 44.30769299999997 299.707317 44.30769299999997 327.294613 44.30769299999997 349.658537 21.77651800000001 349.658537-6.017094000000043 349.658537-33.810704999999984 327.294613-56.34187899999995 299.707317-56.34187899999995 272.120021-56.34187899999995 249.756098-33.810704999999984 249.756098-6.017094000000043ZM924.097562-6.017094000000043C924.097562 49.57012899999995 879.369715 94.63247799999999 824.195121 94.63247799999999 769.020529 94.63247799999999 724.292683 49.57012899999995 724.292683-6.017094000000043 724.292683-61.604318000000035 769.020529-106.66666699999996 824.195121-106.66666699999996 879.369715-106.66666699999996 924.097562-61.604318000000035 924.097562-6.017094000000043ZM774.243902-6.017094000000043C774.243902 21.77651800000001 796.607825 44.30769299999997 824.195121 44.30769299999997 851.782419 44.30769299999997 874.146342 21.77651800000001 874.146342-6.017094000000043 874.146342-33.810704999999984 851.782419-56.34187899999995 824.195121-56.34187899999995 796.607825-56.34187899999995 774.243902-33.810704999999984 774.243902-6.017094000000043Z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="face-cry" unicode="&#59036;" d="M1024 384C1024 666.769792 794.769792 896 512 896 229.230208 896 0 666.769792 0 384 0 101.23020799999995 229.230208-128 512-128 629.410831-128 740.826187-88.33104600000001 830.768465-16.686661999999956 841.557579-8.092490999999995 843.33693 7.620766000000003 834.742758 18.409879000000046 826.148587 29.198990999999978 810.43533 30.978341999999998 799.646219 22.384173000000033 718.470035-42.277495000000044 618.001779-78.04878099999996 512-78.04878099999996 256.817504-78.04878099999996 49.951219 128.81750399999999 49.951219 384 49.951219 639.182496 256.817504 846.048781 512 846.048781 767.182496 846.048781 974.048781 639.182496 974.048781 384 974.048781 296.507166 949.714859 212.66323599999998 904.470807 140.039307 897.177109 128.33175700000004 900.755245 112.92820300000005 912.462793 105.63450699999999 924.170342 98.34080900000004 939.573897 101.91894200000002 946.867595 113.62649199999998 997.013826 194.11920399999997 1024 287.101621 1024 384ZM337.170731 396.487806C371.654852 396.487806 399.609756 424.442709 399.609756 458.926829 399.609756 493.41095 371.654852 521.365854 337.170731 521.365854 302.686611 521.365854 274.731708 493.41095 274.731708 458.926829 274.731708 424.442709 302.686611 396.487806 337.170731 396.487806ZM711.804879 396.487806C746.288998 396.487806 774.243902 424.442709 774.243902 458.926829 774.243902 493.41095 746.288998 521.365854 711.804879 521.365854 677.320757 521.365854 649.365854 493.41095 649.365854 458.926829 649.365854 424.442709 677.320757 396.487806 711.804879 396.487806ZM352.788105 191.21547499999997C396.165222 225.91716899999994 453.151987 246.639629 524.487806 246.639629 595.823622 246.639629 652.810387 225.91716899999994 696.187505 191.21547499999997 722.700531 170.00505399999997 738.882517 148.42907300000002 746.631548 132.931012 752.800254 120.59359800000004 747.799529 105.59142399999996 735.462114 99.42271600000004 723.124702 93.25401 708.122526 98.25473499999998 701.953818 110.59214899999995 701.03616 112.42746499999998 698.492224 116.61747600000001 694.165854 122.38597100000004 686.602473 132.47047699999996 676.927317 142.654852 664.983226 152.21012499999995 630.311565 179.947456 584.273939 196.68840999999998 524.487806 196.68840999999998 464.70167 196.68840999999998 418.664045 179.947456 383.992384 152.21012499999995 372.048292 142.654852 362.373137 132.47047699999996 354.809756 122.38597100000004 350.483386 116.61747600000001 347.93945 112.42746499999998 347.021792 110.59214899999995 340.853084 98.25473499999998 325.850908 93.25401 313.513495 99.42271600000004 301.176081 105.59142399999996 296.175356 120.59359800000004 302.344062 132.931012 310.093092 148.42907300000002 326.275078 170.00505399999997 352.788105 191.21547499999997Z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="face-smile" unicode="&#59055;" d="M1024 384C1024 666.769792 794.769792 896 512 896 229.230208 896 0 666.769792 0 384 0 101.23020799999995 229.230208-128 512-128 629.410831-128 740.826187-88.33104600000001 830.768465-16.686661999999956 841.557579-8.092490999999995 843.33693 7.620766000000003 834.742758 18.409879000000046 826.148587 29.198990999999978 810.43533 30.978341999999998 799.646219 22.384173000000033 718.470035-42.277495000000044 618.001779-78.04878099999996 512-78.04878099999996 256.817504-78.04878099999996 49.951219 128.81750399999999 49.951219 384 49.951219 639.182496 256.817504 846.048781 512 846.048781 767.182496 846.048781 974.048781 639.182496 974.048781 384 974.048781 296.507166 949.714859 212.66323599999998 904.470807 140.039307 897.177109 128.33175700000004 900.755245 112.92820300000005 912.462793 105.63450699999999 924.170342 98.34080900000004 939.573897 101.91894200000002 946.867595 113.62649199999998 997.013826 194.11920399999997 1024 287.101621 1024 384ZM337.170731 396.487806C371.654852 396.487806 399.609756 424.442709 399.609756 458.926829 399.609756 493.41095 371.654852 521.365854 337.170731 521.365854 302.686611 521.365854 274.731708 493.41095 274.731708 458.926829 274.731708 424.442709 302.686611 396.487806 337.170731 396.487806ZM711.804879 396.487806C746.288998 396.487806 774.243902 424.442709 774.243902 458.926829 774.243902 493.41095 746.288998 521.365854 711.804879 521.365854 677.320757 521.365854 649.365854 493.41095 649.365854 458.926829 649.365854 424.442709 677.320757 396.487806 711.804879 396.487806ZM352.788105 127.22903299999996C396.165222 92.52733899999998 453.151987 71.80487900000003 524.487806 71.80487900000003 595.823622 71.80487900000003 652.810387 92.52733899999998 696.187505 127.22903299999996 722.700531 148.43945399999996 738.882517 170.01543500000002 746.631548 185.51349500000003 752.800254 197.850908 747.799529 212.85308399999997 735.462114 219.021792 723.124702 225.19049800000005 708.122526 220.18977299999995 701.953818 207.85235799999998 701.03616 206.01704299999994 698.492224 201.82703100000003 694.165854 196.058537 686.602473 185.97402899999997 676.927317 175.78965500000004 664.983226 166.23438299999998 630.311565 138.49705200000005 584.273939 121.75609799999995 524.487806 121.75609799999995 464.70167 121.75609799999995 418.664045 138.49705200000005 383.992384 166.23438299999998 372.048292 175.78965500000004 362.373137 185.97402899999997 354.809756 196.058537 350.483386 201.82703100000003 347.93945 206.01704299999994 347.021792 207.85235799999998 340.853084 220.18977299999995 325.850908 225.19049800000005 313.513495 219.021792 301.176081 212.85308399999997 296.175356 197.850908 302.344062 185.51349500000003 310.093092 170.01543500000002 326.275078 148.43945399999996 352.788105 127.22903299999996Z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="survey" unicode="&#59058;" d="M722.355804 849.454545C761.006291 849.454545 792.380951 818.166023 792.380951 779.627344L792.380951 437.500928 799.081094 453.813218 401.874746 51.22138 418.539682 58.181818 138.070006 58.181818C99.387643 58.181818 68.063492 89.328555 68.063492 127.771428L68.063492 872.727273 44.698413 849.454545 722.355804 849.454545ZM21.333333 896 21.333333 872.727273 21.333333 127.771428C21.333333 63.604277 73.59726 11.636363 138.070006 11.636363L418.539682 11.636363 428.337293 11.636363 435.204619 18.596802 832.410967 421.18864 839.11111 427.979625 839.11111 437.500928 839.11111 779.627344C839.11111 843.859757 786.827324 896 722.355804 896L44.698413 896 21.333333 896ZM775.859347 307.365395 759.337741 290.90909 775.859347 274.452787 869.319663 181.361879 885.841269 164.905574 902.362876 181.361879 972.458114 251.18006 988.979721 267.636363 972.458114 284.092668 878.997796 377.183575 862.47619 393.639878 845.954583 377.183575 775.859347 307.365395ZM845.954583 344.27097 939.414901 251.18006 939.414901 284.092668 869.319663 214.274485 902.362876 214.274485 808.902558 307.365395 808.902558 274.452787 878.997796 344.27097 845.954583 344.27097ZM518.843473 51.365395 513.841133 46.382827 512.453734 39.473248 489.088655-76.890387 482.215251-111.121568 516.58227-104.275332 633.407665-81.002605 640.344663-79.620689 645.347004-74.638121 902.362876 181.361879 918.884482 197.818182 902.362876 214.274485 808.902558 307.365395 792.380951 323.821698 775.859347 307.365395 518.843473 51.365395ZM775.859347 274.452787 869.319663 181.361879 869.319663 214.274485 612.303791-41.725515 624.243127-35.361033 507.41773-58.633758 534.911345-86.018703 558.276425 30.344934 551.886686 18.452787 808.902558 274.452787 775.859347 274.452787ZM426.576706 298.269073C444.201086 298.269073 458.488469 284.053815 458.488469 266.500753L458.488469 258.086116C458.488469 240.540958 444.323959 226.317797 426.576706 226.317797L426.576706 226.317797C408.952326 226.317797 394.664943 240.533054 394.664943 258.086116L394.664943 266.500753C394.664943 284.045911 408.829453 298.269073 426.576706 298.269073L426.576706 298.269073ZM278.349205 552.435127C278.349205 552.435127 280.851125 530.485568 305.477133 530.485568 330.103138 530.485568 331.559155 552.435127 331.559155 552.435127 329.927383 623.508937 362.988497 657.25782 430.67155 653.905282 475.722639 648.839223 499.06407 623.508937 500.624896 577.839917 497.503245 557.501184 480.405116 531.202385 449.969026 499.092521 409.671358 458.489557 389.522524 422.133143 389.522524 390.023279L389.522524 357.093903C389.522524 357.093903 392.614705 337.454532 414.885933 337.454532 437.157161 337.454532 440.249342 357.093903 440.249342 357.093903L440.249342 379.965664C440.249342 406.785969 459.546816 439.044836 498.21271 476.369762 538.652271 513.471183 558.730159 547.369069 558.730159 577.839917 555.395669 662.323878 511.195938 706.353877 425.776235 709.780917 327.515198 711.419936 278.349205 658.971339 278.349205 552.435127Z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="read" unicode="&#59141;" d="M335.282306 712.495464C399.587328 713.451107 442.778899 696.882717 470.183494 669.3706540000001 479.127332 660.39174 485.691302 650.857363 490.241971 641.442689 492.795622 636.159553 494.049041 632.438701 494.358795 631.0740940000001L493.723712 636.7409230000001 493.723706 196.90019600000005C493.723706 199.018106 495.816045 203.920655 503.591595 207.36436700000002 511.039185 210.66283299999998 515.68422 209.16527399999995 517.176538 207.906613L500.671543 188.33763 521.297207 203.50146800000005C514.140179 213.23636899999997 499.631258 225.71450900000002 476.134074 237.35914000000002 439.577969 255.475456 390.86048 266.10507900000005 328.491925 266.10508200000004 265.860796 266.10508200000004 219.424582 255.71817999999996 186.827162 237.741581 164.977332 225.69198700000004 152.538132 212.28117299999997 147.220271 201.30886999999996L170.257196 190.14374199999997 151.035786 207.05224299999998C152.884078 209.15336100000002 158.307299 211.80336599999998 167.849005 208.050434 177.092077 204.41496099999995 179.2 199.20011699999998 179.2 196.66445199999998L179.2 497.049743 179.2 636.7409230000001 175.817447 624.023021C177.078908 626.226721 180.088681 630.807811 184.828724 636.965629 192.95423 647.521524 202.792594 658.127492 214.297641 668.007961 247.526453 696.544681 287.381649 713.209056 334.514421 712.495571L335.282306 712.495464ZM335.289387 763.689705C274.661039 764.607483 223.081402 743.04085 180.940156 706.850184 156.32698 685.712527 139.975514 664.470237 131.382553 649.4588249999999L128 643.549699 128 636.7409230000001 128 497.049743 128 196.66445199999998C128 159.26104999999995 164.542545 144.88818300000003 189.478606 173.23524099999997L191.776657 175.84764199999995 193.294121 178.978613C194.07832 180.59664399999997 199.156367 186.07133399999998 211.552092 192.907243 236.030601 206.40648099999999 274.024879 214.905082 328.491925 214.905082 383.221547 214.905079 424.163878 205.97190999999998 453.399258 191.483569 469.376966 183.56540600000005 477.614626 176.48075300000005 480.045882 173.17379000000005L481.844905 170.72677999999996 484.166551 168.768644C511.279708 145.90070000000003 544.923706 160.801293 544.923706 196.90019600000005L544.923712 636.740922 544.288627 642.407751C540.427211 659.419023 529.175531 682.697124 506.45814 705.503602 468.987716 743.1209699999999 412.352271 764.846461 334.521502 763.689812L335.289387 763.689705ZM0 506.026694L0 27.856867999999963C0-8.875636999999983 34.793167-23.40043300000002 61.4635 1.2485080000000153L63.46242 3.315859000000046C65.301149 5.444836000000009 69.655573 9.862312999999972 76.498228 15.820363000000043 88.306297 26.101906999999983 102.566352 36.46294 119.251411 46.17438500000003 167.295691 74.13829099999998 224.90855 90.95018200000004 292.337329 90.95018200000004 358.378978 90.95018000000005 409.459345 71.66956600000003 448.125308 39.64774 461.506042 28.56627400000002 472.380655 16.734758000000056 480.912593 4.997000999999955 485.832384-1.7713730000000396 488.762874-6.741985999999997 489.872527-9.02252199999998 496.058545-21.73590200000001 511.379537-27.027375000000006 524.092917-20.84135500000002 536.806298-14.655337000000031 542.097771 0.6656550000000152 535.91175 13.379036000000042 527.471002 30.726293000000055 509.777717 55.06771800000001 480.782336 79.08069999999998 433.134118 118.54132300000003 370.586889 142.15017999999998 292.337329 142.15018199999997 215.474895 142.15018499999996 149.074727 122.77408400000002 93.495781 90.424668 59.761154 70.78961500000003 36.872315 50.859801999999945 24.713677 36.78188399999999L44.088049 20.048869999999965 26.712598 38.84923500000002C28.162783 40.189508000000046 32.877261 41.946117999999956 40.792576 38.64178100000004 49.035365 35.200736000000006 51.2 30.12989200000004 51.2 27.856867999999963L51.2 506.026694C51.2 520.165184 39.73849 531.626694 25.6 531.626694 11.46151 531.626694 0 520.165184 0 506.026694L0 506.026694ZM696.80221 763.689812C618.971441 764.846461 562.335996 743.1209699999999 524.86557 705.503602 502.148181 682.697124 490.896501 659.419023 487.035083 642.407751L486.4 636.740922 486.400004 196.90019600000005C486.400006 160.801293 520.044004 145.90070000000003 547.157161 168.768644L549.478807 170.72677999999996 551.27783 173.17379000000005C553.709086 176.48075300000005 561.946746 183.56540600000005 577.924452 191.483569 607.159834 205.97190999999998 648.102165 214.905079 702.831787 214.905082 757.298833 214.905082 795.293111 206.40648099999999 819.77162 192.907243 832.167345 186.07133399999998 837.245391 180.59664399999997 838.029591 178.978613L839.547055 175.84764199999995 841.845105 173.23524099999997C866.781167 144.88818300000003 903.323712 159.26104999999995 903.323712 196.66445199999998L903.323712 497.049743 903.323712 636.7409230000001 903.323712 643.549699 899.941158 649.4588249999999C891.348196 664.470237 874.996732 685.712527 850.383556 706.850184 808.24231 743.04085 756.662673 764.607483 696.034325 763.689705L696.80221 763.689812ZM696.809291 712.495571C743.942063 713.209056 783.797257 696.544681 817.026071 668.007961 828.531119 658.127492 838.369481 647.521524 846.494989 636.965629 851.235031 630.807811 854.244804 626.226721 855.506263 624.023021L852.123712 636.7409230000001 852.123712 497.049743 852.123712 196.66445199999998C852.123712 199.20011699999998 854.231635 204.41496099999995 863.474707 208.050434 873.016412 211.80336599999998 878.439633 209.15336100000002 880.287925 207.05224299999998L861.066515 190.14374199999997 884.103441 201.30886999999996C878.785579 212.28117299999997 866.346381 225.69198700000004 844.49655 237.741581 811.89913 255.71817999999996 765.462916 266.10508200000004 702.831785 266.10508200000004 640.463232 266.10507900000005 591.745741 255.475456 555.189638 237.35914000000002 531.692454 225.71450900000002 517.183533 213.23636899999997 510.026502 203.50146800000005L530.652166 188.33763 514.147172 207.906613C515.63949 209.16527399999995 520.284527 210.66283299999998 527.732117 207.36436700000002 535.507665 203.920655 537.600004 199.018106 537.600004 196.90019600000005L537.6 636.7409230000001 536.964917 631.0740940000001C537.274671 632.438701 538.52809 636.159553 541.081741 641.442689 545.63241 650.857363 552.196378 660.39174 561.140218 669.3706540000001 588.544813 696.882717 631.736384 713.451107 696.041406 712.495464L696.809291 712.495571ZM972.799998 506.026694L972.799998 27.856867999999963C972.799998 30.12989200000004 974.964631 35.200736000000006 983.207422 38.64178100000004 991.122737 41.946117999999956 995.837214 40.189508000000046 997.287401 38.84923500000002L979.911949 20.048869999999965 999.286321 36.78188399999999C987.127682 50.859801999999945 964.238844 70.78961500000003 930.504218 90.424668 874.925269 122.77408400000002 808.525103 142.15018499999996 731.662669 142.15018199999997 653.132708 142.15017999999998 590.55104 117.26282200000003 543.127755 75.73800100000005 514.370099 50.55719499999998 496.945662 25.10259599999995 488.705389 7.022771000000034 482.841769-5.842485000000011 488.517717-21.02524200000005 501.382974-26.888862000000017 514.248233-32.752481999999986 529.430987-27.07653300000004 535.294607-14.211275 536.420563-11.740835999999945 539.350332-6.450639000000024 544.25735 0.7178109999999833 552.731727 13.097653000000037 563.54464 25.561581000000047 576.856734 37.21792900000003 615.190044 70.78337499999998 665.901421 90.95018000000005 731.662669 90.95018200000004 799.091447 90.95018200000004 856.704307 74.13829099999998 904.748587 46.17438500000003 921.433645 36.46294 935.6937 26.101906999999983 947.501771 15.820363000000043 954.344425 9.862312999999972 958.698848 5.444836000000009 960.537577 3.315859000000046L962.536497 1.2485080000000153C989.206831-23.40043300000002 1023.999998-8.875636999999983 1023.999998 27.856867999999963L1023.999998 506.026694C1023.999998 520.165184 1012.538487 531.626694 998.399998 531.626694 984.261508 531.626694 972.799998 520.165184 972.799998 506.026694L972.799998 506.026694Z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="location" unicode="&#59157;" d="M451.673935-98.39569900000004C478.883834-129.01914699999998 524.254807-128.8089789999999 551.400292-97.92885100000001 553.755808-95.38790800000004 558.821323-89.79676199999994 565.872444-81.84834999999998 577.572838-68.65901699999995 590.597131-53.62432000000001 604.615947-36.99831500000005 644.662065 10.495494000000008 684.708678 61.282182000000034 722.129538 113.35355300000003 759.658524 165.575381 792.492213 216.29072599999995 819.314991 264.54153799999995 868.685946 353.35368300000005 896 430.456574 896 493.714285 896 715.890551 719.301715 896 501.333333 896 283.364952 896 106.666667 715.890551 106.666667 493.714285 106.666667 430.401284 134.05152 353.19426999999996 183.54613 264.23737800000004 210.371803 216.02347099999997 243.193308 165.34812399999998 280.699364 113.16684599999996 318.155192 61.05544999999995 358.239268 10.22578999999996 398.322835-37.31103099999996 412.354743-53.95207300000004 425.391185-69.00072999999998 437.102468-82.20257900000001 444.160087-90.15846599999998 449.230214-95.75492099999997 451.982775-98.73670600000003L451.673935-98.39569900000004ZM486.822684-65.32134799999994C484.281231-62.568254000000024 479.425084-57.207989 472.585916-49.49835900000005 461.135889-36.591016999999965 448.364015-21.84776099999999 434.602351-5.527214999999956 395.275714 41.11192700000004 355.949587 90.98045200000001 319.289224 141.985137 282.808749 192.739548 250.983685 241.87642200000005 225.158316 288.29247799999996 179.388826 370.55419500000005 154.50505 440.709839 154.50505 493.714285 154.50505 688.960095 309.785362 847.238095 501.333333 847.238095 692.881306 847.238095 848.161617 688.960095 848.161617 493.714285 848.161617 440.753978 823.345286 370.701737 777.693969 288.58074899999997 751.873483 242.13293399999998 720.038415 192.96007499999996 683.537446 142.16873799999996 646.912604 91.20503299999996 607.624538 41.38032599999997 568.335977-5.21503800000005 554.587654-21.52024300000005 541.828177-36.24924999999996 530.389289-49.14379699999995 523.556841-56.84571100000005 518.705521-62.20043499999997 516.166694-64.95052599999997 507.543772-74.74891100000002 495.255793-74.80583000000001 487.131524-65.66235300000005L486.822684-65.32134799999994ZM714.955981 428.971194C723.919106 453.372045 728.565658 479.331002 728.565658 505.904762 728.565658 627.091817 632.184774 725.333333 513.29293 725.333333 394.401086 725.333333 298.020202 627.091817 298.020202 505.904762 298.020202 384.717709 394.401086 286.47619 513.29293 286.47619 549.003859 286.47619 583.510052 295.36805300000003 614.373097 312.125591 626.032316 318.456132 630.449257 333.22218 624.238611 345.10648100000003 618.027966 356.99078199999997 603.541579 361.49299399999995 591.882359 355.16245100000003 567.900883 342.14136099999996 541.111735 335.23809500000004 513.29293 335.23809500000004 420.821495 335.23809500000004 345.858586 411.648164 345.858586 505.904762 345.858586 600.161359 420.821495 676.571428 513.29293 676.571428 605.764365 676.571428 680.727273 600.161359 680.727273 505.904762 680.727273 485.192019 677.117041 465.022684 670.154965 446.069408 665.522846 433.459117 671.796821 419.408892 684.168282 414.687349 696.53974 409.965809 710.323861 416.360905 714.955981 428.971194L714.955981 428.971194Z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="dollar" unicode="&#58969;" d="M517.565-65.45399999999995c-244.263 0-442.299 198.014-442.299 442.299s198.014 442.299 442.299 442.299c244.263 0 442.299-198.014 442.299-442.299 0-244.263-198.014-442.299-442.299-442.299zM517.565 863.383c-268.751 0-486.564-217.834-486.564-486.564s217.834-486.564 486.564-486.564c268.751 0 486.564 217.834 486.564 486.564 0 268.751-217.834 486.564-486.564 486.564zM497.036 425.349c-18.443 6.957-33.605 16.314-45.238 27.617-11.581 11.306-20.059 23.465-25.468 36.742-5.423 13.177-8.178 26.235-8.178 39.172-0.004 18.194 2.564 34.357 7.846 48.514 5.327 14.231 13.748 25.85 25.468 35.02 11.581 9.167 26.798 15.204 45.482 18.295v-205.52zM534.455 356.13199999999995c16.937-6.756 32.277-14.997 46.035-24.855 13.748-9.678 24.613-21.601 32.929-35.57 8.204-13.909 12.436-30.734 12.622-50.307 0-14.231-1.859-27.907-5.785-40.833-3.858-12.866-9.542-24.531-17.271-34.804-7.691-10.211-17.271-18.443-28.678-24.613-11.328-6.318-24.613-9.678-39.76-10.341v221.377zM534.455 94.18299999999999c29.037 3.318 53.978 11.306 74.785 24.134 20.985 12.866 37.018 30.15 48.281 51.734 11.125 21.535 16.876 46.832 16.937 76.196 0 16.08-1.67 30.377-5.033 42.985-3.318 12.622-8.204 24.15-14.836 34.357-6.739 10.341-14.836 20.189-24.613 29.326-8.853 8.204-19.107 15.957-30.659 23.041-11.328 7.197-22.836 13.706-34.281 19.261-11.581 5.694-21.601 10.516-30.659 14.231v221.377c14.527-3.318 26.662-8.594 36.62-16.192 9.859-7.395 17.766-16.192 23.776-26.384 5.941-10.211 10.341-20.985 12.972-32.345 2.666-11.328 4.026-22.836 3.858-34.097h46.155c0.004 16.314-1.566 32.345-5.327 48.281-3.543 15.957-9.938 30.909-19.107 44.969-8.996 13.909-21.601 26.235-37.684 36.742-16.192 10.521-36.62 18.295-61.318 23.562v49.426h-37.441v-53.316c-23.465-2.624-42.985-8.178-58.595-16.314-15.633-8.204-28.279-18.194-37.684-29.562-9.441-11.328-16.523-23.302-21.226-35.317-4.59-12.062-7.846-23.302-9.316-33.326-1.566-10.211-2.256-18.194-2.115-24.029 0.004-21.601 3.452-40.612 9.863-57.238 6.479-16.523 15.58-30.909 27.178-43.441 11.659-12.436 25.361-23.562 40.833-33.204 15.633-9.678 32.649-18.443 51.098-26.235v-237.329c-18.194 1.984-33.326 7.197-45.094 15.633-11.97 8.369-21.074 19.107-27.714 31.902-6.739 12.972-11.011 27.178-13.363 42.701-2.256 15.58-3.034 31.313-2.115 47.367h-47.803c-1.183-23.776 0.397-46.035 5.033-66.676s12.357-39.03 23.376-55.019c10.892-16.08 25.361-29.037 43.142-39.03 17.847-9.863 39.472-16.08 64.586-18.295v-65.283h37.441v65.283z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="diamond" unicode="&#59189;" d="M998.4 526.933333L797.866667 802.133333c-4.266667 6.4-12.8 10.666667-19.2 10.666667L243.2 812.8c0 0-14.933333-2.133333-23.466667-17.066667C194.133333 753.066667 32 512 32 512L21.333333 494.933333l12.8-14.933333L469.333333-27.733333000000016c4.266667-4.266667 6.4-6.4 10.666667-8.533333 6.4-4.266667 32-10.666667 46.933333 0 4.266667 2.133333 6.4 6.4 10.666667 8.533333l409.6 420.266667c10.666667 8.533333 10.666667 25.6 0 34.133333-8.533333 10.666667-23.466667 10.666667-32 0L561.066667 61.86666700000001l153.6 422.4 0 0 251.733333 0c2.133333 0 19.2 0 23.466667 4.266667l2.133333 2.133333C1004.8 497.066667 1006.933333 512 998.4 526.933333zM782.933333 763.733333l-96-226.133333L341.333333 537.6l-85.333333 226.133333L782.933333 763.733333zM221.866667 714.666667l72.533333-179.2-192 0L221.866667 714.666667zM91.733333 488.533333l215.466667 0 138.666667-416L91.733333 488.533333zM503.466667 44.799999999999955l-147.2 443.733333 307.2 0L503.466667 44.799999999999955zM736 535.4666669999999L810.666667 701.866667l119.466667-168.533333L736 533.333333z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="return" unicode="&#58972;" d="M927.858848 417.938973L168.863431 417.938973l308.721247 308.86758c11.685133 11.69025 11.435447 30.881334-0.557702 42.868343-11.992125 11.985986-31.18321 12.226462-42.868343 0.536212L75.199191 411.071565c-1.994424-1.662873-3.773953-3.583618-5.294586-5.713119-4.047176-5.373381-6.013971-11.839653-5.9055-18.328437-0.12996-7.794523 2.725064-15.561417 8.595772-21.432125l361.565802-361.744881c11.685133-11.691273 30.876218-11.449773 42.868343 0.535189 11.993149 11.985986 12.242835 31.17707 0.557702 42.868343L168.441828 356.54571799999997l759.417019 0c16.527418 0 29.925566 13.738909 29.925566 30.694069S944.386266 417.938973 927.858848 417.938973z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="camera-fill" unicode="&#58973;" d="M512 480C436.515555 480 375.111111 419.712 375.111111 345.6 375.111111 271.48800000000006 436.515555 211.20000000000005 512 211.20000000000005 587.484446 211.20000000000005 648.888887 271.48800000000006 648.888887 345.6 648.888887 419.712 587.484446 480 512 480M512 172.79999999999995C414.808889 172.79999999999995 336 250.15679999999998 336 345.6 336 441.0432 414.808889 518.4 512 518.4 609.210667 518.4 688 441.0432 688 345.6 688 250.15679999999998 609.210667 172.79999999999995 512 172.79999999999995M903.111113 691.2L723.767113 691.2C713.383113 691.2 703.448887 695.2512 696.115554 702.4512L640.792887 756.7488C633.459554 763.9488 623.505779 768 613.141333 768L512 768 410.878222 768C400.494222 768 390.56 763.9488 383.226667 756.7488L327.904 702.4512C320.570667 695.2512 310.616889 691.2 300.252445 691.2L120.888889 691.2C77.866667 691.2 42.666667 656.64 42.666667 614.4L42.666667 76.79999999999995C42.666667 34.559999999999945 77.866667 0 120.888889 0L903.111113 0C946.133333 0 981.333333 34.559999999999945 981.333333 76.79999999999995L981.333333 614.4C981.333333 656.64 946.133333 691.2 903.111113 691.2"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="fire" unicode="&#59222;" d="M890.059904 352.19948999999997C845.890699 458.956706 840.554889 548.4951550000001 857.396326 618.42714 859.144623 625.686731 860.991676 631.9776790000001 862.858846 637.425182 863.763607 640.064841 865.906573 645.659889 866.16406 646.532651L880.890349 696.448108 833.062903 675.9309969999999C832.106692 675.5208 830.618069 674.894716 827.426684 673.550492 824.667648 672.380966 822.310677 671.354022 819.868514 670.244809 813.291441 667.2575449999999 807.049466 664.090938 800.697749 660.4128450000001 784.089623 650.795565 768.486253 638.656896 753.86285 623.033596 727.630498 595.007563 706.526618 557.766355 691.78157 509.713231 675.041103 455.157161 671.516484 411.46006 673.004574 347.939834 673.477918 327.73476900000003 673.463923 322.197583 672.83965 318.324215 673.779618 324.156339 684.455526 333.67819899999995 696.104608 329.19567600000005 693.056849 330.36844199999996 685.695898 339.012828 676.314007 361.368339 660.550914 398.92921 646.834249 460.170272 636.817284 549.350468 625.445924 650.588768 630.103925 734.7280519999999 644.646978 801.338628 647.677924 815.221065 650.899934 827.082435 654.086773 836.904609 655.91465 842.538316 657.254607 846.094657 657.880284 847.554385L678.645286 896 628.243642 880.578031C617.409833 877.263087 599.94569 869.52239 578.105438 855.845223 542.547644 833.577626 507.199569 802.385036 474.400401 760.836776 447.596676 726.883228 423.611383 687.30061 403.118547 641.7016189999999 378.907516 587.829195 363.003277 542.798944 353.158029 503.238462 349.274261 487.632585 346.433259 473.323627 344.1945 458.925156 343.334411 453.39353 342.592734 448.063234 341.804612 441.911844 341.502524 439.553997 340.356619 430.329551 340.073506 428.145504 337.596047 409.033293 335.848224 404.35337 329.235273 398.312868 336.081933 404.566848 343.232634 404.098227 346.608002 402.086756 344.852318 403.133013 341.598345 406.493651 337.991853 411.887149 327.030897 428.279226 317.980358 454.883162 313.690598 489.339595 311.250185 508.941598 310.203772 539.08627 310.370048 576.545325 310.480474 601.422138 311.113088 628.122479 312.099068 654.977888 312.481453 665.393013 312.891081 675.105466 313.30045 683.8491750000001 313.545346 689.079919 313.735044 692.813105 313.84201 694.783403L317.55517 763.179488 271.360516 712.604139C270.467691 711.626645 268.852992 709.837042 266.618705 707.326295 262.927895 703.178805 258.823678 698.493751 254.407949 693.3614689999999 241.78797 678.693606 229.164348 663.340425 217.341267 648.004036 211.724185 640.717803 206.411389 633.591345 201.450577 626.6638379999999 176.017063 591.147305 156.617347 555.4025280000001 138.122768 512.155497 90.841957 401.595812 76.97672 299.64870599999995 99.261816 188.13489300000003 126.80821 50.29373899999996 188.553235-37.64422200000001 278.8297-84.690336 344.19104-118.75233700000001 408.837235-128 507.940695-128 525.713007-128 557.977207-125.567138 590.857378-120.46215900000004 641.152493-112.65333099999998 687.496192-99.78932299999997 726.063273-80.59104400000001 738.155853-74.57148800000004 743.07901-59.88870199999997 737.059454-47.79612199999997 731.039898-35.70354299999997 716.357111-30.780384000000026 704.264531-36.79993999999999 670.855859-53.43041900000003 629.092954-65.02289699999994 583.352478-72.12456999999995 552.984316-76.83953499999996 523.228215-79.08327499999996 507.940695-79.08327499999996 416.16215-79.08327499999996 357.934257-70.75375399999996 301.436271-41.310745999999995 224.830174-1.3887230000000272 171.977796 73.88423 147.230072 197.72094500000003 126.99711 298.965952 139.514783 391.004811 183.099329 492.921284 200.282663 533.1021499999999 218.020237 565.784358 241.22153 598.183718 245.831691 604.6215589999999 250.802959 611.289899 256.082244 618.137961 267.31885 632.713596 279.402035 647.409487 291.488864 661.457681 298.732051 669.8762429999999 304.338773 676.1767130000001 307.478705 679.614406L264.997214 697.435142C264.883874 695.347445 264.688038 691.493511 264.43725 686.13688 264.020474 677.234965 263.603959 667.359281 263.215279 656.7726250000001 262.21142 629.430212 261.566827 602.224414 261.453805 576.7624579999999 261.278897 537.3588179999999 262.385015 505.49418 265.148621 483.296209 276.058157 395.668083 322.627019 326.024497 362.226031 362.19561799999997 379.341732 377.829698 384.756649 392.328523 388.584361 421.857186 397.932742 493.974714 407.332926 531.746825 447.736538 621.64966 466.587287 663.594818 488.484326 699.731218 512.795234 730.526996 542.034492 767.565749 573.156162 795.028785 604.068111 814.386984 614.696751 821.043029 624.472062 826.201428 633.124687 830.036563 638.02329 832.207788 641.258688 833.404991 642.556233 833.802016L612.91959 866.825663C608.658554 856.884484 602.686705 838.478616 596.856038 811.772799 581.186705 740.003594 576.231674 650.498985 588.206246 543.890345 607.295279 373.94226100000003 638.819345 298.82556999999997 678.537329 283.542234 701.302332 274.78234499999996 717.731637 289.43566899999996 721.133156 310.5407 722.475759 318.870999 722.489387 324.26340300000004 721.907881 349.08549100000005 720.532565 407.791853 723.691247 446.952173 738.546223 495.36355 751.151827 536.44438 768.544047 567.135763 789.576147 589.605967 809.230566 610.60429 821.725461 617.839716 852.347733 630.9761169999999L842.705318 653.453557 819.246577 660.374464C822.235501 670.505564 813.450321 644.87463 809.839253 629.8801189999999 790.647573 550.1890470000001 796.611315 450.1135 844.8591 333.498332 883.105728 241.056017 874.587669 126.06492400000002 824.002925 61.39712899999995 815.680378 50.75754500000005 817.558709 35.38570000000004 828.198295 27.063153000000057 838.837879 18.740607999999952 854.209724 20.618939999999952 862.532269 31.258523999999966 924.762731 110.81426299999998 934.658528 244.404363 890.059904 352.19948999999997Z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="more-vertical" unicode="&#58993;" d="M511.998465 623.681848c40.525995 0 73.386404 35.771715 73.386404 79.892585s-32.860409 79.892585-73.386404 79.892585c-40.524972 0-73.384357-35.771715-73.384357-79.892585S471.47247 623.681848 511.998465 623.681848L511.998465 623.681848zM511.998465 463.893608c-40.524972 0-73.384357-35.772738-73.384357-79.893608 0-44.12087 32.859385-79.892585 73.384357-79.892585 40.525995 0 73.386404 35.772738 73.386404 79.892585C585.384869 428.12087 552.52446 463.893608 511.998465 463.893608L511.998465 463.893608zM511.998465 144.320199c-40.524972 0-73.384357-35.733852-73.384357-79.894631 0-44.119847 32.859385-79.893608 73.384357-79.893608 40.525995 0 73.386404 35.772738 73.386404 79.893608C585.383846 108.58634600000005 552.52446 144.320199 511.998465 144.320199L511.998465 144.320199z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="cart" unicode="&#58967;" d="M365.920994 84.618469c-39.030945 0-70.78516-31.754215-70.78516-70.78516s31.754215-70.784136 70.78516-70.784136c39.030945 0 70.784136 31.753191 70.784136 70.784136S404.951939 84.618469 365.920994 84.618469zM365.920994-5.784493999999995c-10.818393 0-19.61985 8.801457-19.61985 19.618826 0 10.818393 8.801457 19.61985 19.61985 19.61985s19.618826-8.801457 19.618826-19.61985C385.540843 3.015939000000003 376.739387-5.784493999999995 365.920994-5.784493999999995zM808.821219 84.618469c-39.030945 0-70.784136-31.754215-70.784136-70.78516s31.753191-70.784136 70.784136-70.784136 70.78516 31.753191 70.78516 70.784136S847.852164 84.618469 808.821219 84.618469zM808.821219-5.784493999999995c-10.81737 0-19.618826 8.801457-19.618826 19.618826 0 10.818393 8.801457 19.61985 19.618826 19.61985 10.818393 0 19.61985-8.801457 19.61985-19.61985C828.441069 3.015939000000003 819.640636-5.784493999999995 808.821219-5.784493999999995zM443.99107 305.940157c-14.057157-1.416256-24.305569-13.959943-22.890336-28.0171 1.328251-13.187347 12.446473-23.02132 25.423019-23.02132 0.856507 0 1.723248 0.042979 2.594081 0.130983l439.314561 44.245713c0.088004 0.007163 0.174985 0.01842 0.261966 0.026606l0.180102 0.01842c0.50449 0.051165 1.001817 0.119727 1.496074 0.198521 0.222057 0.035816 0.443092 0.076748 0.663102 0.11768 0.552585 0.103354 1.100054 0.217964 1.638313 0.355087 0.085958 0.022513 0.169869 0.047072 0.254803 0.069585 0.586354 0.156566 1.161453 0.334621 1.728364 0.530073 0.077771 0.026606 0.155543 0.051165 0.233314 0.078795 0.626263 0.222057 1.239224 0.469698 1.840928 0.737804 0.039909 0.017396 0.078795 0.035816 0.118704 0.054235 1.277086 0.577145 2.496867 1.252527 3.647063 2.020006 0.001023 0.001023 0.002047 0.001023 0.00307 0.002047 0.553609 0.369414 1.088798 0.76134 1.609661 1.170662 0.069585 0.054235 0.137123 0.10847 0.205685 0.163729 0.48607 0.38988 0.958838 0.795109 1.413186 1.218758 0.092098 0.084934 0.180102 0.173962 0.270153 0.25992 0.394996 0.378623 0.778736 0.76748 1.14815 1.169639 0.11154 0.121773 0.222057 0.243547 0.331551 0.367367 0.333598 0.3776 0.653893 0.766456 0.964978 1.163499 0.12382 0.158612 0.249687 0.314155 0.370437 0.475837 0.322341 0.432859 0.629333 0.876973 0.925069 1.329275 0.113587 0.173962 0.224104 0.348947 0.333598 0.525979 0.296759 0.479931 0.580215 0.968048 0.845251 1.467421 0.069585 0.130983 0.134053 0.265036 0.201591 0.397043 0.289596 0.568958 0.563842 1.147126 0.811482 1.738597 0.00307 0.007163 0.005117 0.014326 0.008186 0.021489 0.569982 1.369184 1.019213 2.796696 1.345648 4.26514 0 0.001023 0 0.002047 0.001023 0.00307l0.00307 0.013303c0.035816 0.162706 0.075725 0.323365 0.10847 0.487094l56.17951 252.734118c0.895393 4.030803 0.780783 8.04728-0.165776 11.794627 0.50449 2.003634 0.774643 4.101411 0.774643 6.261611 0 14.128789-11.452843 25.582655-25.582655 25.582655L195.47502 616.098125l-52.358485 159.553902c-3.631714 11.067057-14.093996 17.972327-25.177426 17.590634-0.207731 0.005117-0.413416 0.01535-0.62217 0.01535L54.663994 793.258011c-14.128789 0-25.582655-11.453866-25.582655-25.582655s11.453866-25.582655 25.582655-25.582655l45.614897 0 197.955514-603.235934c3.536546-10.776438 13.546527-17.613146 24.303522-17.613146 2.067079 0 4.16281 0.26299 6.245238 0.788969l567.583946 0c14.129812 0 25.582655 11.453866 25.582655 25.582655s-11.452843 25.582655-25.582655 25.582655L340.816223 173.1979 212.265428 564.933839l701.224666 0-48.137347-216.557174L443.99107 305.940157z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="star-fill" unicode="&#58968;" d="M752-43.200000000000045c-9.6 0-20.8 3.2-30.4 8l-208 104-209.6-104c-20.8-11.2-48-9.6-67.2 4.8-19.2 14.4-30.4 40-25.6 64l43.2 224L89.6 411.2C72 428.8 65.6 456 72 478.4c8 24 27.2 41.6 52.8 44.8l228.8 41.6 102.4 208c11.2 22.4 33.6 36.8 57.6 36.8s48-14.4 57.6-36.8l102.4-208 228.8-40c24-3.2 44.8-20.8 51.2-44.8 8-24 1.6-49.6-16-67.2L772.8 257.6l41.6-224c4.8-25.6-6.4-49.6-25.6-64-9.6-8-22.4-12.8-36.8-12.8z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="prev" unicode="&#58970;" d="M62.573 384.103l423.401 423.662c18.985 18.985 49.757 18.985 68.727 0 18.982-18.972 18.985-49.746 0-68.729l-355.058-355.067 356.796-356.796c18.977-18.971 18.976-49.746 0-68.727-18.982-18.976-49.751-18.976-68.727 0l-39.753 39.753 0.269 0.246-385.655 385.661zM451.365 384.103l423.407 423.662c18.985 18.985 49.757 18.985 68.727 0 18.982-18.972 18.985-49.746 0-68.729l-355.058-355.067 356.796-356.796c18.977-18.971 18.976-49.746 0-68.727-18.982-18.976-49.757-18.977-68.727 0l-39.762 39.754 0.273 0.249-385.662 385.661zM451.365 384.103z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="next" unicode="&#58971;" d="M948.066926 382.958838l-411.990051-412.24426c-18.47333-18.47333-48.417689-18.47333-66.875207 0-18.47333 18.461167-18.47333 48.405526 0 66.875207L814.691135 383.088983 467.512212 730.269123c-18.466032 18.458735-18.466032 48.405526 0 66.873991 18.468465 18.464816 48.410391 18.464816 66.872774 0l38.682336-38.682336-0.261507-0.239614 375.259894-375.265975v0.003649m-378.312834 0L157.756743-29.28542200000004c-18.47333-18.47333-48.415256-18.47333-66.872775 0-18.47333 18.461167-18.47333 48.405526 0 66.875207L436.369787 383.088983 89.19208 730.269123c-18.4636 18.458735-18.4636 48.405526 0 66.873991 18.470898 18.464816 48.415256 18.464816 66.872774 0l38.692067-38.682336-0.266372-0.239614 375.267191-375.265975-0.004865 0.003649m0 0z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="upload" unicode="&#59004;" d="M831.488 478.208C831.488 478.208 831.488 478.208 831.488 478.208c0 143.36-114.688 258.048-253.952 258.048-98.304 0-184.32-57.344-225.28-139.264C327.68 605.184 307.2 609.28 286.72 609.28c-90.112 0-159.744-73.728-159.744-159.744 0-16.384 4.096-28.672 8.192-40.96C57.344 379.904 0 310.27200000000005 0 224.25599999999997c0-106.496 86.016-192.512 192.512-192.512l192.512 0 0 192.512L258.048 224.25599999999997l258.048 258.048 258.048-258.048-126.976 0 0-192.512 192.512 0L839.68 35.84000000000003c106.496 16.384 192.512 110.592 192.512 221.184C1024 371.712 937.984 465.92 831.488 478.208z"  horiz-adv-x="1033" />
+      
+      <glyph glyph-name="upload-drag" unicode="&#59009;" d="M666.931 445.918l-124.245 99.362c-7.221 5.639-16.428 9.042-26.429 9.042-9.963 0-19.136-3.376-26.438-9.047l-124.215-99.391c-9.615-7.772-15.713-19.565-15.713-32.782 0-9.946 3.453-19.084 9.223-26.284 13.828-17.359 41.51-20.465 58.918-6.505l56.252 45.022v-261.12c0-23.177 18.842-41.984 41.95-41.984s41.95 18.842 41.95 41.984v261.12l56.286-45.056c17.545-13.892 45.09-10.718 58.914 6.554 5.754 7.137 9.236 16.316 9.236 26.308 0 13.211-6.086 24.999-15.609 32.716zM235.827 142.95000000000005c-85.026 0-152.542 31.71-188.655 89.839-36.113 58.095-34.406 134.724 4.335 195.174 37.342 58.334 102.366 92.023 178.995 94.549-19.866 130.492 42.667 202.377 84.753 235.008 90.112 69.871 234.257 79.053 335.565 21.367 58.982-33.587 94.037-85.675 100.454-146.978 113.937 18.978 177.562-33.826 206.814-69.905 63.317-78.131 71.27-204.39 18.91-300.203-46.524-85.06-130.389-127.317-229.82-116.497-18.739 2.116-32.222 18.978-30.174 37.683s19.285 32.017 37.683 30.174c96.7-10.718 143.258 46.353 162.406 81.408 39.014 71.373 33.826 167.868-12.049 224.495-38.673 47.684-100.352 60.518-178.483 37.069-2.94-0.916-6.319-1.443-9.822-1.443-18.851 0-34.133 15.282-34.133 34.133 0 1.495 0.096 2.969 0.283 4.414 8.549 68.506-31.114 106.53-65.93 126.362-77.346 44.066-191.522 37.035-259.925-15.974-58.266-45.193-75.947-117.18-51.132-208.179 0.761-2.688 1.198-5.775 1.198-8.963 0-18.851-15.282-34.133-34.133-34.133-1.481 0-2.94 0.094-4.371 0.277-70.759 8.822-128.991-13.535-159.677-61.424-24.61-38.434-26.146-86.46-3.823-122.368 27.716-44.578 86.05-64.375 164.147-55.637 1.132 0.133 2.443 0.209 3.772 0.209 18.853 0 34.138-15.284 34.138-34.138 0-17.525-13.205-31.965-30.208-33.914-14.153-1.653-27.874-2.404-41.118-2.404z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="user" unicode="&#59248;" d="M611.2 342.4c70.4 54.4 115.2 140.8 115.2 230.4 0 156.8-128 288-284.8 288s-284.8-128-284.8-284.8c0-92.8 44.8-182.4 115.2-236.8C108.8 272 0 105.60000000000002 0-80c0-9.6 9.6-19.2 19.2-19.2h848c9.6 0 19.2 9.6 19.2 19.2 0 188.8-112 355.2-275.2 422.4z m-576-396.8C44.8 115.20000000000005 156.8 268.79999999999995 320 320c6.4 3.2 12.8 9.6 12.8 16s-3.2 16-9.6 19.2c-76.8 41.6-128 131.2-128 224 0 134.4 112 246.4 246.4 246.4s246.4-112 246.4-249.6c0-89.6-51.2-176-128-220.8-6.4-3.2-9.6-9.6-9.6-19.2 0-6.4 6.4-12.8 12.8-16 160-51.2 275.2-204.8 281.6-377.6H35.2zM812.8 361.6c54.4 41.6 86.4 108.8 86.4 176 0 89.6-54.4 172.8-134.4 208-9.6 3.2-22.4 0-25.6-9.6-3.2-9.6 0-22.4 9.6-25.6 67.2-28.8 112-99.2 112-172.8 0-67.2-38.4-131.2-96-163.2-6.4-3.2-9.6-9.6-9.6-19.2 0-6.4 6.4-12.8 12.8-16 131.2-41.6 217.6-160 217.6-297.6 0-9.6 9.6-19.2 19.2-19.2s19.2 9.6 19.2 19.2c-3.2 140.8-86.4 262.4-211.2 320z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="file-b" unicode="&#58965;" d="M790.08 177.91999999999996l-138.112-119.232V177.91999999999996h138.112zM198.848 763.008h627.328v-516.16H617.088a34.56 34.56 0 0 1-34.816-34.432v-206.528H198.848V763.008z m662.208 68.8H164.032a34.56 34.56 0 0 1-34.816-34.432v-825.92a34.56 34.56 0 0 1 34.816-34.432h453.056l278.784 240.896V797.376a34.56 34.56 0 0 1-34.816 34.432z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="component" unicode="&#59479;" d="M917.376 652.544L500.8 891.2a34.304 34.304 0 0 1-34.176 0L50.112 652.48a33.92 33.92 0 0 1-17.088-29.376v-477.44c0-12.16 6.528-23.296 17.088-29.44l416.512-238.72a35.136 35.136 0 0 1 34.176 0l416.576 238.72a33.92 33.92 0 0 1 17.088 29.44v477.44a33.92 33.92 0 0 1-17.088 29.44z m-51.264-487.36l-382.4-219.136-382.336 219.136V603.52l382.336 219.136 382.4-219.136v-438.272zM198.784 535.488a33.792 33.792 0 0 1 12.544-46.4l237.824-136.32V83.20000000000005c0-18.816 15.232-33.92 34.176-33.92a33.92 33.92 0 0 1 34.176 33.92V352.384l238.656 136.832a33.856 33.856 0 0 1 12.544 46.4 34.368 34.368 0 0 1-46.72 12.416L483.712 411.52 245.504 548.0319999999999a34.432 34.432 0 0 1-46.72-12.544z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="find-fill" unicode="&#58992;" d="M512 896C229.236364 896 0 666.763636 0 384c0-282.786909 229.236364-512 512-512s512 229.213091 512 512C1024 666.763636 794.763636 896 512 896zM657.291636 383.976727c0-77.195636-60.392727-139.729455-136.424727-144.407273l-175.732364-151.714909-22.877091 13.242182 58.228364 222.021818c-8.634182 18.548364-13.800727 39.074909-13.800727 60.858182 0 77.195636 60.369455 139.729455 136.378182 144.430545l175.802182 151.714909 22.877091-13.172364-58.251636-222.068364C652.125091 426.309818 657.291636 405.806545 657.291636 383.976727zM512 384m-66.048 0a2.838 2.838 0 1 1 132.096 0 2.838 2.838 0 1 1-132.096 0Z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="loading" unicode="&#58941;" d="M511.999488 756.654348m-70.608128 0a69 69 0 1 1 141.216255 0 69 69 0 1 1-141.216255 0ZM236.047576 639.997442m-68.561515 0a67 67 0 1 1 137.123031 0 67 67 0 1 1-137.123031 0ZM125.530506 382.12428m-62.421678 0a61 61 0 1 1 124.843356 0 61 61 0 1 1-124.843356 0ZM227.861126 100.71507499999996m-54.235229 0a53 53 0 1 1 108.470457 0 53 53 0 1 1-108.470457 0ZM514.166851-16.84438799999998m-47.192835 0a46.118 46.118 0 1 1 94.385671 0 46.118 46.118 0 1 1-94.385671 0ZM804.730553 91.450061m-33.834596 0a33.064 33.064 0 1 1 67.669192 0 33.064 33.064 0 1 1-67.669192 0ZM935.55411 383.395226m-23.969924 0a23.424 23.424 0 1 1 47.939849 0 23.424 23.424 0 1 1-47.939849 0ZM856.723717 634.80007m-17.135262 0a16.745 16.745 0 1 1 34.270525 0 16.745 16.745 0 1 1-34.270525 0Z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="loading-1" unicode="&#58942;" d="M537.574469 831.696462c-14.123672 0-25.574469-11.447726-25.574469-25.574469 0-14.123672 11.450796-25.574469 25.574469-25.574469 204.495464 0 370.82877-166.358889 370.82877-370.82877 0-14.123672 11.450796-25.574469 25.574469-25.574469 14.123672 0 25.574469 11.450796 25.574469 25.574469C959.551152 642.385838 770.241552 831.696462 537.574469 831.696462z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="add-1" unicode="&#58964;" d="M566.935 78.97233332999997c0-30.366-24.612-54.972-54.935-54.972v0c-30.384 0-54.996 24.612-54.996 54.972v610.057c0 30.361 24.612 54.972 54.996 54.972v0c30.33 0 54.935-24.612 54.935-54.972v-610.057zM817.004 438.96633333c30.384 0 54.996-24.606 54.996-54.966v0c0-30.354-24.612-54.966-54.996-54.966h-610.062c-30.33 0-54.942 24.612-54.942 54.966v0c0 30.359 24.612 54.966 54.942 54.966h610.062zM817.004 438.96633333z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="pause" unicode="&#58961;" d="M512-128c-282.714 0-511.893 229.232-511.893 512 0 282.768 229.179 512 511.893 512 282.714 0 511.893-229.232 511.893-512 0-282.768-229.179-512-511.893-512zM512 863.996c-265.043 0-479.9-214.91-479.9-479.996 0-265.097 214.857-479.996 479.9-479.996 265.043 0 479.9 214.899 479.9 479.996 0 265.086-214.857 479.996-479.9 479.996zM639.973 181.32299999999998h-21.329c-23.558 0-42.658 19.1-42.658 42.658v319.933c0 23.558 19.1 42.658 42.658 42.658h21.329c23.558 0 42.658-19.1 42.658-42.658v-319.933c0-23.558-19.1-42.658-42.658-42.658zM405.356 181.32299999999998h-21.329c-23.558 0-42.658 19.1-42.658 42.658v319.933c0 23.558 19.1 42.658 42.658 42.658h21.329c23.558 0 42.658-19.1 42.658-42.658v-319.933c0-23.558-19.1-42.658-42.658-42.658z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="play" unicode="&#58962;" d="M512 896C229.376 896 0 666.624 0 384 0 101.37599999999998 229.376-128 512-128 794.624-128 1024 101.37599999999998 1024 384 1024 666.624 794.624 896 512 896L512 896 512 896zM512-95.23199999999997C245.76-95.23199999999997 32.768 117.75999999999999 32.768 384 32.768 650.24 245.76 863.232 512 863.232S991.232 650.24 991.232 384C991.232 117.75999999999999 778.24-95.23199999999997 512-95.23199999999997L512-95.23199999999997 512-95.23199999999997zM733.184 392.192L393.216 588.8c-4.096 4.096-8.192 4.096-12.288 0C376.832 588.8 372.736 584.704 372.736 580.608l0-393.216c0-4.096 4.096-8.192 4.096-8.192 4.096-4.096 8.192-4.096 12.288 0l344.064 196.608c4.096 4.096 4.096 4.096 4.096 8.192C741.376 388.096 737.28 392.192 733.184 392.192L733.184 392.192 733.184 392.192zM733.184 392.192"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="video" unicode="&#59117;" d="M952.523633 599.2477269999999L952.523633 599.2477269999999 952.523633 599.2477269999999zM100.53762400000005 661.054062C100.53762400000005 661.054062 100.53762400000005 661.054062 100.53762400000005 661.054062 100.53762400000005 661.054062 100.53762400000005 661.054062 100.53762400000005 661.054062zM100.74228 720.404517L100.74228 720.404517 100.74228 720.404517zM660.990107 739.9449716666666c8.697911 0 17.498151-0.511642 25.684421-2.353553 12.279404-2.865194 23.22854-8.18627 34.382332-16.679524 15.144599-11.460777 26.196063-29.572899 32.02878-52.187469 3.479165-13.405016 2.967523-28.651944 2.558209-42.05696-0.102328-4.195463-0.204657-8.083941-0.204657-11.665434l0-37.759169 101.407415 70.401919 25.479764 17.60048c0.511642 0.306985 1.330269 1.023284 2.148896 1.637254 4.40012 3.376836 11.051464 8.595583 20.977316 11.051464 3.274508 0.818627 6.549016 1.22794 10.02818 1.22794 9.618867 0 19.44239-3.274508 27.730987999999996-9.311882 18.82842-13.916657999999998 18.726092-35.405616 18.726092-51.061857 0-1.023284 0-2.148896 0-3.172179l0-409.620466c0-15.963226 0.102328-37.963825-19.647047-51.982812-6.753672-4.809433-16.679524-8.390926-27.219346-8.390926-5.01409 0-10.130509 0.818627-15.144599 2.762866-7.162986 2.762866-12.279404 6.856000999999999-16.065554 9.823524-0.920955 0.716299-1.841911 1.432597-2.353553 1.841911l-24.968122 17.395823-101.10043 70.094934 0-37.963825c0-3.581493 0.102328-7.367643 0.204657-11.460777 0.409313-14.735285 0.818627-29.982212-2.865194-43.796542-5.62806-21.488957999999997-16.679524-39.396423-31.107825-50.447886-7.879285-6.037374-18.930748-13.405016-34.075347-16.986509-7.776956-1.841911-16.167882-2.353553-24.45648-2.353553-4.297792 0-8.595583 0.102328-12.688718 0.204657-3.683821 0.102328-7.162986 0.204657-10.232837 0.204657L167.15339300000005 84.94107466666674c-1.944239 0-3.888478 0-5.832717 0-1.944239 0-3.990806 0-5.935045 0-16.577196 0-33.461377 0.61397-47.787349 6.549016-27.935644999999997 11.563106-46.764065 37.759169-53.006096 73.574098l-0.409313 2.251224 0 2.353553c-0.102328 18.930748-0.204657 37.861497-0.306985 56.792245l0 0.511642L53.87588699999998 598.0155226666666c0 4.40012-0.102328 8.902568-0.102328 13.712001999999998-0.306985 27.01469-0.716299 54.950335 9.311882 76.643949 9.823524 21.284300999999996 27.526331999999996 38.066154 48.708304 45.945438 5.730389 2.148896 11.051464 2.762866 15.04227 3.172179 1.023284 0.102328 2.353553 0.306985 3.069851 0.409313l4.093135 1.534926 500.9997 0c3.581493 0 7.572299 0.102328 11.767763 0.306985C651.166583 739.7403146666667 656.078345 739.9449716666666 660.990107 739.9449716666666M304.273409 266.7785886666668L559.889677 394.2797376666667l0 33.973019L304.273409 555.9585626666667 304.273409 266.7785886666668M660.990107 780.8763196666666c-5.62806 0-10.949136-0.204657-15.758569-0.306985-3.888478-0.102328-7.469971-0.204657-10.437494-0.204657L133.79434400000002 780.3646776666667l-7.265314 0-6.446687-2.353553c-5.3210749999999996-0.61397-13.609673-1.841911-22.716898-5.218747-31.210153-11.665434-57.303887-36.121915-71.629859-67.229739-13.814329999999998-30.084541-13.405016-64.159888-12.995703-94.244429 0.102328-4.604777 0.102328-9.004897 0.102328-13.20036l0-371.349655 0-0.102328 0-0.102328 0-0.511642c0.102328-18.930748 0.204657-37.861497 0.306985-56.792245l0-2.251224 0-3.479165 0.61397-3.376836 0.409313-2.251224c4.195463-23.944839 12.791046-45.126811 25.479764-62.727291 13.609673-18.82842 31.107825-32.847407 52.08514-41.545318 21.488957999999997-8.902568 44.001199-9.618867 63.443589-9.618867 2.046567 0 4.093135 0 6.139702 0 1.841911 0 3.78615 0 5.62806 0l473.166384 0c2.558209 0 5.62806-0.102328 9.004897-0.204657 4.195463-0.102328 8.902568-0.306985 13.916657999999998-0.306985 13.302688 0 24.149495 1.125612 33.973019 3.479165 22.819227 5.423404 39.089437 16.474868 49.322274 24.251824 21.693613999999997 16.577196 37.963825 42.363944999999994 45.84311 72.653143 2.251224 8.595583 3.376836 17.088838 3.990806 25.377436l36.838213-25.582093 24.558809-17.088838c0.306985-0.204657 0.61397-0.511642 0.920955-0.716299 4.809433-3.683821 13.609673-10.642149999999999 26.400719-15.656241 9.516538-3.683821 19.647047-5.62806 30.084541-5.62806 18.009793 0 36.53122799999999 5.832717 50.8572 15.963226 16.577196 11.767763 27.730987999999996 27.935644999999997 33.052064 48.094334 3.78615 14.4283 3.78615 27.628659999999996 3.78615 37.34985499999999l0 409.518137c0 0.920955 0 1.739582 0 2.660538l0 0.409313c0 9.41421 0.102328 22.409913-3.479165 36.53122799999999-5.116419 19.749375-15.758569 35.81493-31.721795 47.68502-15.144599 11.153792-33.666034 17.293495-52.08514 17.293495-6.753672 0-13.507345-0.818627-19.954032-2.455881-18.21445-4.604777-30.289198-13.916657999999998-36.019586-18.419107l0 0c-0.204657-0.204657-0.511642-0.409313-0.716299-0.511642l-25.172779-17.293495-0.102328 0-0.102328 0-37.14519799999999-25.786749c-0.511642 7.674628-1.637254 15.553912-3.683821 23.433197-8.18627 31.721795-24.354152 57.508544-46.866394 74.597382-15.758569 11.972419-32.02878 19.851704-49.833916 23.944839C685.8559009999999 779.7507076666667 674.702109 780.8763196666666 660.990107 780.8763196666666L660.990107 780.8763196666666zM345.204757 332.9850436666668L345.204757 489.75210666666663l157.074048-78.48586L345.204757 332.9850436666668 345.204757 332.9850436666668zM347.455981 429.177975L347.455981 308.02118499999995 347.455981 429.177975Z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="headset" unicode="&#59132;" d="M356.285031 2.1522690000000466L356.396571 2.1522690000000466 356.396571 285.236626 253.462201 285.236626 253.462201 2.1522690000000466ZM665.076886 285.236626l103.042841 0 0-283.08538-103.042841 0 0 283.08538ZM63.809793 301.950286c0-38.758746-3.195785-112.220874 5.457292-148.208507l65.735144 0c-10.112312 35.644825-7.747451 109.176538-7.747451 148.208507 0 219.937155 172.264389 398.231887 384.763131 398.231887 212.498742 0 384.763131-178.294732 384.763131-398.231887 0-39.031968 2.266623-112.563682-7.845689-148.208507l65.735144 0c8.653077 35.987632 5.555529 109.449761 5.555529 148.208507 0 256.20415-200.670346 463.898469-448.208115 463.898469C264.479115 765.848755 63.809793 558.1544349999999 63.809793 301.950286z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="voice" unicode="&#59016;" d="M463.380164 644.0568969999999v-0.003069c-4.550643 4.549619-10.484795 7.02295-16.913205 7.02295s-12.365632-2.473331-16.915251-7.02295c-4.549619-4.551666-7.020904-10.485819-7.020904-16.914229s2.471284-12.365632 7.020904-16.915251c60.437487-60.438511 93.675496-140.756791 93.675496-226.222301 0-85.464487-33.238009-165.783791-93.675496-226.220255-4.549619-4.551666-7.020904-10.487865-7.020904-16.915252 0-6.429433 2.471284-12.365632 7.020904-16.914228 4.550643-4.549619 10.486842-7.02295 16.915251-7.02295s12.364609 2.473331 16.913205 7.02295c35.114752 35.116799 62.317301 76.06849 80.814584 121.668037 17.904789 44.018539 26.90579 90.608647 26.90579 138.384768s-9.101285 94.26799-26.90579 138.384767c-18.59552 45.697785-45.698808 86.550215-80.814584 121.667013zM781.892405 618.929614v-0.002047c-31.358195 77.452-77.550237 146.990772-137.098471 206.539007-4.550643 4.549619-10.485819 7.02295-16.915252 7.02295-6.42841 0-12.363585-2.473331-16.914228-7.02295-9.29776-9.299807-9.29776-24.531719 0-33.82948 54.997592-54.998615 97.631598-119.195729 126.613676-190.71153 27.993564-69.044516 42.237987-142.045133 42.237987-216.924541s-14.244422-147.882072-42.237987-216.923518c-28.982078-71.517847-71.616084-135.616724-126.613676-190.711529-9.29776-9.298783-9.29776-24.531719 0-33.82948 4.551666-4.551666 10.485819-7.02295 16.914228-7.02295 6.429433 0 12.366655 2.471284 16.915252 7.02295 59.547211 59.547211 105.740276 129.085984 137.098471 206.53696 30.369681 74.78117 45.699832 153.817248 45.699831 234.928591 0 81.111343-15.331173 160.146397-45.699831 234.927567zM299.474141 427.621497c-11.670807 11.573593-27.103288 18.004049-43.522236 18.004049-16.419971 0-31.852452-6.429433-43.52326-18.004049-11.57257-11.57257-18.003026-27.104311-18.003026-43.522236 0-16.420995 6.42841-31.851429 18.003026-43.52326 11.574616-11.57257 27.103288-18.003026 43.52326-18.003025s31.852452 6.429433 43.522236 18.003025c11.573593 11.573593 18.003026 27.104311 18.003025 43.52326 0 16.419971-6.427386 31.852452-18.003025 43.522236z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="speaker" unicode="&#58949;" d="M587.182306 754.7203c-6.003737 2.705622-13.043061 1.642406-17.984606-2.721994l-259.223926-229.293243-148.246369 0c-9.253758 0-16.752546-7.498788-16.752546-16.756639l0-267.886213c0-9.249665 7.498788-16.756639 16.752546-16.756639l144.050814 0c9.253758 0 16.752546 7.506974 16.752546 16.756639L322.530764 490.391099c1.774413 0.704035 3.433192 1.719154 4.892427 3.010567l236.127905 208.861912 0-653.332912-160.751171 137.64287c-2.12643 1.824555-90.300632 78.69941-93.927229 76.162634-4.427846-3.097548-15.768125-17.59882-18.419512-22.512736-0.953721-1.768273-2.196015-1.334391 15.413038-16.379039 25.674753-21.936615 73.780377-61.548798 75.144444-62.717414l10.007935-8.570189 178.388876-152.761196c3.093455-2.653433 6.978948-4.028757 10.900258-4.028757 2.369977 0 4.756327 0.503467 7.003508 1.534959 5.939269 2.738367 9.749038 8.677637 9.749038 15.217586L597.060281 739.446431C597.060281 746.034477 593.190137 752.013655 587.182306 754.7203L587.182306 754.7203zM290.453185 254.814756l-115.040083 0L175.413102 489.195877l115.03906 0 0-234.381122L290.453185 254.814756zM747.742119 375.98444300000006c0-51.55212-34.83232-96.658434-84.702124-109.693308-1.415232-0.375553-2.846838-0.551562-4.245697-0.551562-7.438413 0-14.234189 4.992711-16.200984 12.523221-2.338255 8.949836 3.021823 18.104333 11.967566 20.442588 35.136242 9.18929 59.672054 40.96397 59.672054 77.279061 0 36.307927-24.535813 68.090794-59.672054 77.271898-8.945743 2.346441-14.305821 11.492752-11.967566 20.450774 2.342348 8.953929 11.499915 14.305821 20.446681 11.967566C712.909799 472.643899 747.742119 427.530422 747.742119 375.98444300000006L747.742119 375.98444300000006zM864.950588 375.793084c0-88.87619-48.554856-170.44495-126.718053-212.883505-2.537799-1.375324-5.276167-2.02717-7.982812-2.02717-5.939269 0-11.69946 3.166109-14.733563 8.762571-4.417613 8.134261-1.39886 18.303878 6.727215 22.720468 67.350944 36.566824 109.198028 106.851587 109.198028 183.427636 0 76.844156-42.055838 147.272181-109.741403 183.78784-8.154727 4.396123-11.192923 14.557554-6.795776 22.700001 4.38896 8.142447 14.558577 11.184737 22.701025 6.795776C816.151162 546.697499 864.950588 464.976266 864.950588 375.793084L864.950588 375.793084z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="fonts-del" unicode="&#58959;" d="M928 448l-143.616 0c-3.456 55.616-14.272 106.56-29.504 144.96C725.504 666.816 617.344 768 464.32 768L256 768l0-320L96 448C78.336 448 64 433.664 64 416S78.336 384 96 384L256 384l0-320 229.632 0c156.288 0 240.768 97.856 267.904 167.488C772.736 280.96000000000004 782.272 333.312 784.96 384L928 384C945.664 384 960 398.336 960 416S945.664 448 928 448zM349.376 711.488l63.936 0c35.712 0 251.84 27.968 266.944-263.488l-330.88 0L349.376 711.488zM439.296 120.51199999999994L349.376 120.51199999999994 349.376 382.528 349.376 384l330.88 0C665.344 113.98400000000004 467.968 120.51199999999994 439.296 120.51199999999994z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="fonts-html" unicode="&#58955;" d="M194.33 416.235h-101.295v101.28h-46.035v-267.03h46.035v119.7h101.28v-119.7h46.035v267.03h-46.035v-101.28zM277.205 480.69h73.665v-230.205h46.035v230.205h73.665v36.825h-193.365v-36.825zM627.815 335.58000000000004l-46.755 181.935h-73.665v-267.03h46.035v211.785l46.035-211.785h55.245l46.83 213.93-0.795-213.93h46.035v267.03h-73.665l-45.3-181.935zM848.09 287.30999999999995v230.205h-46.035v-267.03h174.945v36.825h-128.91z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="fonts-code" unicode="&#58958;" d="M270 626c-12 12-32 12-44 0L9 409c-12-12-12-32 0-44l217-217c6-6 14-9 22-9s16 3 22 9c12 12 12 32 0 44L75 387 270 582C282 595 282 614 270 626zM1015 409L798 626c-12 12-32 12-44 0-12-12-12-32 0-44l195-195L754 192c-12-12-12-32 0-44 6-6 14-9 22-9s16 3 22 9l217 217C1027 377 1027 397 1015 409zM624 696L624 696c-16 6-34-3-40-19L382 119c-6-16 2-34 19-40l0 0c16-6 34 3 40 19l202 558C648 672 640 690 624 696z"  horiz-adv-x="1025" />
+      
+      <glyph glyph-name="fonts-strong" unicode="&#58923;" d="M199.092919 848.487893l355.326704 0c70.335928 0 122.780371-2.942005 157.349701-8.809643 34.568307-5.884011 65.491597-18.131963 92.78522-36.759205 27.27725-18.627243 50.01409-43.427068 68.209498-74.397431 18.195408-30.986735 27.293623-65.699328 27.293623-104.169501 0-41.7161-11.17655-79.977519-33.496905-114.802676s-52.604078-60.951187-90.818425-78.362742c54.075593-15.765055 95.647407-42.626843 124.715443-80.585363s43.602054-82.58388 43.602054-133.877103c0-40.388872-9.417487-79.673597-28.220738-117.839849-18.803251-38.182624-44.482097-68.673056-77.035514-91.489714-32.55444-22.833031-72.702835-36.855396-120.414487-42.09984-29.931706-3.229554-102.122889-5.260817-216.572524-6.060019L199.092919-40.765192999999954 199.092919 848.487893zM378.171504 700.1084940000001l0-205.684546 117.64849 0c69.935816 0 113.410979 1.006933 130.390699 3.038196 30.730908 3.629667 54.891168 14.246469 72.478731 31.850405 17.588587 17.588587 26.381857 40.756239 26.381857 69.473281 0 27.501354-7.594979 49.838082-22.75219 67.042929-15.158235 17.188474-37.702694 27.597545-67.618027 31.242562-17.796318 2.01489-68.945255 3.038196-153.431461 3.038196L378.171504 700.109518zM378.171504 346.04454999999996l0-236.383732 166.622902 0c64.85203 0 106.008382 1.807159 123.43631 5.420453 26.750247 4.828982 48.543599 16.58063 65.363683 35.272341s25.247011 43.714617 25.247011 75.085092c0 26.526143-6.491855 49.03888-19.459191 67.538209-12.983709 18.48398-31.722492 31.961946-56.250118 40.404222s-77.739549 12.663414-159.619394 12.663414L378.171504 346.04454999999996z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="unlink" unicode="&#58957;" d="M150.336 767.6800000000001C133.44 762.304 124.16 744.3199999999999 129.472 727.488 131.2 722.1759999999999 134.208 717.44 138.304 713.664l122.624-122.432C270.208 576.192 289.92 571.52 304.96 580.736 320 590.0799999999999 324.672 609.7280000000001 315.456 624.832 312.832 629.056 309.184 632.64 304.96 635.264L182.336 757.696C175.168 765.44 164.672 769.216 154.304 767.6800000000001 152.96 767.808 151.552 767.808 150.336 767.6800000000001L150.336 767.6800000000001zM406.08 831.424c-13.696-4.48-22.72-17.6-22.016-32L384.064 672c0-17.664 14.336-32 32-32s31.872 14.336 31.872 32L447.936 799.424C448.256 817.088 434.304 831.6800000000001 416.64 832 414.464 832.064 412.16 831.808 410.048 831.424 408.704 831.552 407.296 831.552 406.08 831.424L406.08 831.424zM91.392 511.872C73.728 509.12 61.632 492.544 64.384 474.88 67.136 457.28 83.712 445.248 101.376 448L224 448C241.664 448 256 462.208 256 479.872s-14.336 32-32 32L101.376 511.872c-1.984 0.192-3.968 0.192-6.016 0C94.016 512 92.608 512 91.392 511.872L91.392 511.872zM795.456 320c-17.728-2.752-29.824-14.08-27.072-31.744 2.752-17.6 19.328-35.008 36.992-32.256L928 256c17.664 0 32 19.584 32 37.248S945.664 320 928 320l-122.624 0c-1.984 0.192-3.968 0.192-6.016 0-1.344 0.128-2.688 0.128-4.032 0L795.456 320zM598.272 127.42399999999998c-13.76-4.48-22.72-17.6-22.08-32L576.192-32c0-17.664 14.336-32 32-32S640-49.66399999999999 640-32l0 127.424c0.32 17.6-13.568 32.256-31.232 32.576-2.176 0.064-4.352-0.192-6.592-0.576-1.344 0.128-2.688 0.128-4.032 0L598.272 127.42399999999998zM726.272 191.67999999999995c-16.896-5.376-26.24-23.36-20.864-40.192 1.664-5.312 4.736-10.048 8.832-13.824l122.56-122.432c9.28-15.04 28.928-19.776 44.032-10.496 14.976 9.344 19.712 28.992 10.368 44.032-2.624 4.224-6.144 7.808-10.368 10.432l-122.56 122.432c-7.168 7.744-17.6 11.52-28.032 9.984-1.344 0.128-2.688 0.128-4.032 0L726.272 191.61599999999999zM339.968 28.03200000000004c-49.152 0-98.304 18.688-135.744 56.128-74.816 74.88-74.816 196.608 0 271.488l87.744 87.744c12.48 12.48 32.768 12.48 45.248 0s12.48-32.768 0-45.248L249.408 310.46400000000006c-49.92-49.856-49.92-131.136 0-180.992 49.856-49.856 131.136-49.856 180.992 0l87.744 87.744c12.48 12.48 32.768 12.48 45.248 0s12.48-32.768 0-45.248l-87.744-87.744C438.272 46.72000000000003 389.12 28.03200000000004 339.968 28.03200000000004zM702.144 323.712c-8.192 0-16.384 3.136-22.656 9.344-12.48 12.48-12.48 32.768 0 45.248l87.744 87.744c49.856 49.92 49.856 131.072 0 180.992-49.856 49.856-131.136 49.856-180.992 0L498.496 559.296c-12.48-12.48-32.768-12.48-45.248 0s-12.48 32.768 0 45.248l87.744 87.744c74.88 74.88 196.608 74.88 271.488 0 74.88-74.816 74.88-196.672 0-271.488l-87.744-87.744C718.528 326.784 710.336 323.712 702.144 323.712z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="picture" unicode="&#58954;" d="M765.376 615.424c0 0 103.04 1.024 103.04-100.992 0 0 9.536-98.752-103.04-100.928 0 0-100.864-2.176-99.84 100.928C665.536 514.496 664.448 605.8879999999999 765.376 615.424ZM968.32 770.56c0 0 54.208-4.224 54.208-52.032l0-712.832c0 0-3.2-51.008-54.208-52.096L968.32 770.56ZM1.472 5.631999999999948c0 0 2.176-52.096 52.096-52.096L968.32-46.464000000000055l0 150.848-99.712 0-203.072 206.144-153.024-153.984L304.32 413.568l-205.056-307.072-45.632-1.024L52.48 718.4639999999999 1.472 718.4639999999999 1.472 5.631999999999948ZM968.32 770.56L53.568 770.56c0 0-52.096 1.088-52.096-52.032L968.32 718.528 968.32 770.56Z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="link" unicode="&#58956;" d="M262.4-121.60000000000002c-64 0-128 25.6-179.2 76.8-102.4 102.4-102.4 262.4 0 364.8l134.4 134.4 89.6-89.6-134.4-134.4c-51.2-51.2-51.2-128 0-179.2 51.2-51.2 128-51.2 179.2 0l179.2 179.2c25.6 25.6 38.4 57.6 38.4 89.6S556.8 384 537.6 409.6L467.2 473.6l89.6 89.6 70.4-70.4C672 448 697.6 384 697.6 313.6c0-70.4-25.6-134.4-76.8-179.2l-179.2-179.2C396.8-96 326.4-121.60000000000002 262.4-121.60000000000002zM467.2 204.79999999999995L396.8 268.79999999999995c-102.4 102.4-102.4 262.4 0 364.8l179.2 179.2c102.4 102.4 262.4 102.4 364.8 0 102.4-102.4 102.4-262.4 0-364.8l-134.4-134.4-89.6 89.6 134.4 134.4c51.2 51.2 51.2 128 0 179.2-51.2 51.2-134.4 51.2-179.2 0L486.4 544c-51.2-51.2-51.2-128 0-179.2l70.4-70.4L467.2 204.79999999999995z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="face-smile-b" unicode="&#58960;" d="M511.931733-128c-136.738133 0-265.284267 53.213867-361.984 149.879467C53.282133 118.51093300000002 0 247.09119999999996 0 384c0 136.738133 53.282133 265.3184 150.050133 362.0864C246.749867 842.683733 375.296 896 512.136533 896s265.4208-53.316267 362.1888-149.9136c199.645867-199.714133 199.543467-524.5952 0-724.206933C777.454933-74.71786699999996 648.772267-128 511.931733-128L511.931733-128 511.931733-128 511.931733-128 511.931733-128 511.931733-128zM512.034133 829.303467c-118.920533 0-230.741333-46.2848-314.914133-130.389333C113.083733 614.8778669999999 66.7648 502.8864 66.7648 384c0-118.9888 46.2848-230.912 130.3552-315.016533 84.0704-84.0704 195.857067-130.321067 314.811733-130.321067 119.022933 0 230.946133 46.318933 315.016533 130.423467 173.704533 173.636267 173.704533 456.157867 0 629.794133C742.877867 782.984533 631.057067 829.303467 512.034133 829.303467L512.034133 829.303467 512.034133 829.303467 512.034133 829.303467 512.034133 829.303467 512.034133 829.303467zM330.103467 244.25813300000004c0 0 59.904-95.9488 181.828267-95.9488s201.8304 95.9488 201.8304 95.9488 45.294933 0.136533 45.192533-47.957333c0 0-78.506667-111.8208-247.022933-111.8208s-223.368533 111.8208-223.368533 111.8208S286.856533 244.25813300000004 330.103467 244.25813300000004L330.103467 244.25813300000004 330.103467 244.25813300000004 330.103467 244.25813300000004 330.103467 244.25813300000004zM363.2128 548.590933c-34.5088 0-62.702933-28.091733-62.702933-62.737067 0-34.679467 28.194133-62.6688 62.702933-62.6688 34.679467 0 62.702933 28.091733 62.702933 62.6688C425.915733 520.4992 397.858133 548.590933 363.2128 548.590933L363.2128 548.590933 363.2128 548.590933 363.2128 548.590933 363.2128 548.590933 363.2128 548.590933zM684.544 548.590933c-34.679467 0-62.702933-28.091733-62.702933-62.737067 0-34.679467 28.023467-62.6688 62.702933-62.6688 34.6112 0 62.600533 28.091733 62.600533 62.6688C747.144533 520.4992 719.121067 548.590933 684.544 548.590933L684.544 548.590933 684.544 548.590933 684.544 548.590933 684.544 548.590933 684.544 548.590933zM684.544 548.590933"  horiz-adv-x="1025" />
+      
+      <glyph glyph-name="align-center" unicode="&#58951;" d="M992 448L32 448C14.32 448 0 462.336 0 480 0 497.664 14.32 512 32 512L992 512C1009.68 512 1024 497.664 1024 480 1024 462.336 1009.68 448 992 448ZM800 704C817.664 704 832 689.664 832 672 832 654.336 817.664 640 800 640L224 640C206.32 640 192 654.336 192 672 192 689.664 206.32 704 224 704L800 704ZM992 832L32 832C14.32 832 0 846.336 0 864 0 881.664 14.32 896 32 896L992 896C1009.68 896 1024 881.664 1024 864 1024 846.336 1009.68 832 992 832ZM224 256C206.32 256 192 270.336 192 288 192 305.664 206.32 320 224 320L800 320C817.664 320 832 305.664 832 288 832 270.336 817.664 256 800 256L224 256ZM32 128L992 128C1009.68 128 1024 113.66399999999999 1024 96 1024 78.33600000000001 1009.68 64 992 64L32 64C14.32 64 0 78.33600000000001 0 96 0 113.66399999999999 14.32 128 32 128ZM224-64L800-64C817.664-64 832-78.33600000000001 832-96 832-113.66399999999999 817.664-128 800-128L224-128C206.32-128 192-113.66399999999999 192-96 192-78.33600000000001 206.32-64 224-64Z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="align-right" unicode="&#58952;" d="M992 64L32 64C14.32 64 0 78.33600000000001 0 96 0 113.66399999999999 14.32 128 32 128L992 128C1009.68 128 1024 113.66399999999999 1024 96 1024 78.33600000000001 1009.68 64 992 64ZM992 256L288 256C270.32 256 256 270.336 256 288 256 305.664 270.32 320 288 320L992 320C1009.68 320 1024 305.664 1024 288 1024 270.336 1009.68 256 992 256ZM992 448L32 448C14.32 448 0 462.336 0 480 0 497.664 14.32 512 32 512L992 512C1009.68 512 1024 497.664 1024 480 1024 462.336 1009.68 448 992 448ZM992 640L288 640C270.32 640 256 654.336 256 672 256 689.664 270.32 704 288 704L992 704C1009.68 704 1024 689.664 1024 672 1024 654.336 1009.68 640 992 640ZM992 832L32 832C14.32 832 0 846.336 0 864 0 881.664 14.32 896 32 896L992 896C1009.68 896 1024 881.664 1024 864 1024 846.336 1009.68 832 992 832ZM288-64L992-64C1009.68-64 1024-78.33600000000001 1024-96 1024-113.66399999999999 1009.68-128 992-128L288-128C270.32-128 256-113.66399999999999 256-96 256-78.33600000000001 270.32-64 288-64Z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="align-left" unicode="&#58953;" d="M992 448L32 448C14.336 448 0 462.336 0 480 0 497.664 14.336 512 32 512L992 512C1009.664 512 1024 497.664 1024 480 1024 462.336 1009.664 448 992 448ZM32 704L736 704C753.68 704 768 689.664 768 672 768 654.336 753.68 640 736 640L32 640C14.336 640 0 654.336 0 672 0 689.664 14.336 704 32 704ZM992 832L32 832C14.336 832 0 846.336 0 864 0 881.664 14.336 896 32 896L992 896C1009.664 896 1024 881.664 1024 864 1024 846.336 1009.664 832 992 832ZM32 320L736 320C753.68 320 768 305.664 768 288 768 270.336 753.68 256 736 256L32 256C14.336 256 0 270.336 0 288 0 305.664 14.336 320 32 320ZM32 128L992 128C1009.664 128 1024 113.66399999999999 1024 96 1024 78.33600000000001 1009.664 64 992 64L32 64C14.336 64 0 78.33600000000001 0 96 0 113.66399999999999 14.336 128 32 128ZM32-64L736-64C753.68-64 768-78.33600000000001 768-96 768-113.66399999999999 753.68-128 736-128L32-128C14.336-128 0-113.66399999999999 0-96 0-78.33600000000001 14.336-64 32-64Z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="fonts-u" unicode="&#58950;" d="M0-49.23076900000001L945.230769-49.23076900000001 945.230769-128 0-128 0-49.23076900000001ZM0 896L407.076943 896 407.076943 834.065644 319.153861 827.872177 299.076923 809.911217 299.076923 365.841959C299.076923 281.19796199999996 317.076716 220.709337 353.076933 184.37435100000005 389.077071 148.03936499999998 448.153442 129.87210800000003 530.307702 129.87210800000003 606.000364 129.87210800000003 660.807522 149.17482299999995 694.730752 187.78072599999996 728.653982 226.38662899999997 745.61536 289.66226700000004 745.61536 377.60953099999995L745.61536 804.956475 724.153817 826.633531 633.461524 834.065644 633.461524 896 955.384596 896 955.384596 834.065644 868.846119 826.633531 849.461563 804.956475 849.461563 364.60331299999996C849.461563 246.92743900000005 819.923338 161.66533900000002 760.846178 108.81441500000005 701.76894 55.96348999999998 606.462188 29.53846199999998 474.923087 29.53846199999998 406.153531 29.53846199999998 345.807951 38.51886300000001 293.884613 56.47990200000004 241.961275 74.44093999999996 201.230887 100.143419 171.692347 133.58820400000002 149.076834 160.01362700000004 133.038474 190.25793999999996 123.57695 224.32200899999998 114.115348 258.386078 109.384625 307.21047599999997 109.384625 370.796702L109.384625 809.911217 89.307687 827.872177 0 834.065644 0 896Z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="fonts-i" unicode="&#58948;" d="M897.948 834.255l0-64.322-128.65 0L447.674-1.9329999999999927l128.65 0 0-64.32L126.052-66.25300000000004l0 64.32 128.65 0 321.622 771.866-128.65 0L447.674 834.255 897.948 834.255z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="tabs" unicode="&#58922;" d="M310.30303 523.636364L124.121212 523.636364c-17.128727 0-31.030303-13.901576-31.030303-31.030303l0-186.181818c0-17.128727 13.901576-31.030303 31.030303-31.030303l186.181818 0c17.128727 0 31.030303 13.901576 31.030303 31.030303L341.333333 492.606061C341.333333 509.734788 327.431758 523.636364 310.30303 523.636364zM294.787879 306.42424200000005L139.636364 306.42424200000005c-17.128727 0-15.515152-1.613576-15.515152 15.515152L124.121212 477.090909c0 17.128727-1.613576 15.515152 15.515152 15.515152l155.151515 0c17.128727 0 15.515152 1.613576 15.515152-15.515152l0-155.151515C310.30303 304.81066699999997 311.916606 306.42424200000005 294.787879 306.42424200000005zM418.909091 352.969697l480.969697 0 0 31.030303L418.909091 384 418.909091 352.969697zM418.909091 228.84848499999998l480.969697 0 0 31.030303L418.909091 259.878788 418.909091 228.84848499999998zM418.909091 89.21212100000002l480.969697 0 0 31.030303L418.909091 120.24242400000003 418.909091 89.21212100000002zM418.909091 492.606061l480.969697 0 0 31.030303L418.909091 523.636364 418.909091 492.606061zM992.969697 725.333333l-15.515152 0L977.454545 849.454545c0 17.128727-13.901576 31.030303-31.030303 31.030303L775.757576 880.484848c-17.128727 0-31.030303-13.901576-31.030303-31.030303l0-124.121212-139.636364 0L605.090909 849.454545c0 17.128727-13.901576 31.030303-31.030303 31.030303L403.393939 880.484848c-17.128727 0-31.030303-13.901576-31.030303-31.030303l0-124.121212-124.121212 0L248.242424 849.454545c0 17.128727-13.901576 31.030303-31.030303 31.030303L31.030303 880.484848C13.901576 880.484848 0 866.583273 0 849.454545l0-946.424242c0-17.128727 13.901576-31.030303 31.030303-31.030303l961.939394 0c17.128727 0 31.030303 13.901576 31.030303 31.030303L1024 694.30303C1024 711.431758 1010.098424 725.333333 992.969697 725.333333zM992.969697-65.939394c0-17.128727-13.901576-31.030303-31.030303-31.030303L62.060606-96.969697c-17.128727 0-31.030303 13.901576-31.030303 31.030303L31.030303 818.424242c0 17.128727 13.901576 31.030303 31.030303 31.030303l124.121212 0c17.128727 0 31.030303-13.901576 31.030303-31.030303l0-124.121212 744.727273 0c17.128727 0 31.030303-13.901576 31.030303-31.030303L992.969697-65.939394z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="circle" unicode="&#58943;" d="M511.998 847.999C255.739 847.999 48 640.26 48 383.999c0-256.258 207.739-463.998 463.998-463.998C768.261-79.99900000000002 976 127.74199999999996 976 383.999 976 640.26 768.261 847.999 511.998 847.999zM512.002-16.000999999999976c-220.915 0-400.002 179.088-400.002 400 0 220.917 179.086 400 400.002 400 220.912 0 399.998-179.083 399.998-400C912 163.087 732.914-16.000999999999976 512.002-16.000999999999976z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="radio" unicode="&#58947;" d="M512.5 383.5m-192 0a192 192 0 1 1 384 0 192 192 0 1 1-384 0ZM511.998 847.999C255.739 847.999 48 640.26 48 383.999c0-256.258 207.739-463.998 463.998-463.998C768.261-79.99900000000002 976 127.74199999999996 976 383.999 976 640.26 768.261 847.999 511.998 847.999zM512.002-16.000999999999976c-220.915 0-400.002 179.088-400.002 400 0 220.917 179.086 400 400.002 400 220.912 0 399.998-179.083 399.998-400C912 163.087 732.914-16.000999999999976 512.002-16.000999999999976z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="share" unicode="&#58945;" d="M769.714 306.453c-51.754 0-97.702-24.851-126.571-63.269L394.479 367.94100000000003c3.93 13.798 6.034 28.364 6.034 43.424 0 16.496-2.527 32.399-7.211 47.35l247.724 124.288c28.71-40.052 75.647-66.151 128.687-66.151 87.388 0 158.229 70.84 158.229 158.229 0 87.388-70.841 158.229-158.229 158.229-87.389 0-158.229-70.841-158.229-158.229 0-6.046 0.352-12.009 1.011-17.88L351.22 526.116c-28.371 26.943-66.723 43.479-108.938 43.479-87.388 0-158.229-70.84-158.229-158.229s70.84-158.229 158.229-158.229c43.752 0 83.354 17.758 111.997 46.459l258.676-129.779c-0.964-7.062-1.474-14.266-1.474-21.592 0-87.389 70.84-158.229 158.229-158.229s158.229 70.84 158.229 158.229C927.938 235.61199999999997 857.103 306.453 769.714 306.453L769.714 306.453z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="edit" unicode="&#58946;" d="M769.089 516.251l-125.896 125.89 62.974 62.947c20.866 20.838 54.652 20.838 75.517 0l50.353-50.351c20.865-20.865 20.865-54.703 0-75.567L769.089 516.251zM403.349 150.52700000000004L277.453 276.418 619.706 615.982 745.601 490.09ZM176.314 47.283000000000015L252.912 251.87699999999995 377.753 127.01199999999994Z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="delete" unicode="&#58944;" d="M724.7403125 66.76999999999998h-423.70875c-25.5 0-46.2440625 20.2528125-46.2440625 45.1471875v391.8909375c0 24.88875 20.7459375 45.1378125 46.2440625 45.1378125h423.70875c25.5 0 46.2440625-20.248125 46.2440625-45.1378125v-391.8909375c0-24.8953125-20.7459375-45.1471875-46.2440625-45.1471875zM301.030625 507.6378125c-4.1690625 0-6.72-2.47875-6.72-3.82875v-391.8909375c0-1.3528125 2.551875-3.8371875 6.72-3.8371875h423.70875c4.17 0 6.72 2.4853125 6.72 3.8371875v391.8909375c0 1.35-2.551875 3.82875-6.72 3.82875h-423.70875zM812.1865625 509.283125h-600.3759375c-25.5009375 0-46.2440625 18.8728125-46.2440625 42.07125v57.2296875c0 23.19375 20.745 42.0628125 46.2440625 42.0628125h600.3759375c25.5 0 46.2440625-18.8690625 46.2440625-42.0628125v-57.2296875c0-23.1975-20.7459375-42.07125-46.2440625-42.07125zM205.0915625 551.4940624999999c0.3628125-0.6871875 2.551875-2.686875 6.72-2.686875h600.3759375c4.1671875 0 6.358125 1.99875 6.72 2.6878125v56.9446875c-0.3684375 0.69-2.5621875 2.6840625-6.72 2.6840625h-600.3759375c-4.1596875 0-6.3525-1.995-6.72-2.6840625v-56.945625zM595.20125 611.5193750000001h-163.636875c-25.5009375 0-46.2440625 18.871875-46.2440625 42.07125v10.065c0 23.19375 20.745 42.0628125 46.2440625 42.0628125h163.636875c25.5 0 46.2440625-18.868125 46.2440625-42.0628125v-10.065c0-23.1984375-20.745-42.07125-46.2440625-42.07125zM424.844375 653.729375c0.3628125-0.6871875 2.551875-2.6859375 6.72-2.6859375h163.636875c4.168125 0 6.358125 1.9978125 6.72 2.6859375v9.78c-0.3684375 0.69-2.563125 2.683125-6.72 2.683125h-163.636875c-4.1596875 0-6.3525-1.993125-6.72-2.683125v-9.78zM410.8428125 447.9059375h-28.2159375c-6.8409375 0-12.3871875-5.54625-12.3871875-12.3871875v-255.31875c0-6.8409375 5.54625-12.38625 12.3871875-12.38625h28.216875c6.8409375 0 12.38625 5.54625 12.38625 12.38625v255.3196875c0 6.8409375-5.54625 12.3871875-12.38625 12.3871875zM650.3590625 447.9059375h-28.2159375c-6.841875 0-12.3871875-5.54625-12.3871875-12.3871875v-255.31875c0-6.8409375 5.5471875-12.38625 12.3871875-12.38625h28.2159375c6.8409375 0 12.38625 5.54625 12.38625 12.38625v255.3196875c0 6.8409375-5.54625 12.3871875-12.38625 12.3871875zM530.6009375 447.9059375h-28.216875c-6.8409375 0-12.3871875-5.54625-12.3871875-12.3871875v-255.31875c0-6.8409375 5.5471875-12.38625 12.3871875-12.38625h28.216875c6.8409375 0 12.38625 5.54625 12.38625 12.38625v255.3196875c0 6.8409375-5.54625 12.3871875-12.38625 12.3871875z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="engine" unicode="&#58920;" d="M422.214332 360.70413299999996L186.183684 360.70413299999996l0 46.568461 236.030648 0c10.379577 40.075407 46.47537 69.794509 89.785668 69.794509 51.432433 0 93.067103-41.657943 93.067103-93.067103C605.067103 332.56756700000005 563.40916 290.909624 512 290.909624 468.689703 290.909624 432.593909 320.65199900000005 422.214332 360.70413299999996L422.214332 360.70413299999996zM512 779.634098c-218.529658 0-395.634098-177.10444-395.634098-395.634098 0-218.529658 177.10444-395.634098 395.634098-395.634098 154.76275 0 288.417257 89.064217 353.440885 218.55293l101.398692-59.112389-23.063141-39.959044-62.161099 35.909613c-33.745261-51.595341-77.42792-96.115813-129.093079-129.744711l35.653614-61.765464-40.308133-23.295867-35.653614 61.765464c-53.620057-27.345298-113.360805-44.404109-176.894987-47.73209L535.319139-127.99706800000001l-46.568461 0 0 70.981412c-63.534182 3.327981-123.27493 20.386792-176.894987 47.73209l-35.653614-61.765464-40.308133 23.295867 35.653614 61.765464c-51.665159 33.628898-95.347818 78.149371-129.093079 129.744711l-62.161099-35.909613-23.295867 40.308133 62.114553 35.863067c-27.415116 53.550239-44.799743 113.104807-48.127724 176.685534L0.002932 360.70413299999996l0 46.568461 70.958139 0c3.327981 63.580727 20.712609 123.135295 48.127724 176.685534l-62.114553 35.863067 23.295867 40.308133 62.161099-35.909613c33.745261 51.595341 77.42792 96.115813 129.093079 129.744711l-35.653614 61.765464 40.308133 23.295867 35.653614-61.765464c53.620057 27.345298 113.360805 44.404109 176.894987 47.73209L488.727406 895.997068l46.568461 0 0-70.981412c63.534182-3.327981 123.27493-20.386792 176.894987-47.73209l35.653614 61.765464 40.308133-23.295867-35.653614-61.765464c51.665159-33.628898 95.347818-78.149371 129.093079-129.744711l62.161099 35.909613 23.063141-39.959044-101.398692-59.112389C800.417257 690.569881 666.76275 779.634098 512 779.634098L512 779.634098z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="chart-screen" unicode="&#58921;" d="M963.930903 179.21903299999997l0 34.824133-37.354769-2.675946L926.576133 694.8538169999999 691.413206 694.8538169999999l0 70.462818L330.260819 765.316635l0-70.462818L95.690386 694.8538169999999l0-480.809627-35.621289 0 0-34.824133 432.583253 0 0-141.228535-90.313935 0 0-35.307134 216.753649 0 0 35.307134-90.313935 0L528.778128 179.21903299999997 963.930903 179.21903299999997zM366.212636 730.008478L655.216819 730.008478l0-35.307134L366.212636 694.7013440000001 366.212636 730.008478zM364.817869 332.73133600000006L222.224244 406.252817l14.295588 27.736715 123.238812-63.523779 173.928285 159.755494 127.5807-92.634794 93.13826 122.414027 12.420891-9.449209 12.420891-9.449209L667.639756 394.365068l-131.636063 95.621824L364.817869 332.73133600000006z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="chart" unicode="&#58924;" d="M953.440991 315.668729L784.061302 315.668729 681.06451 437.392024c-0.312108 0.373507-0.635473 0.737804-0.969071 1.094938-0.013303 0.014326-0.026606 0.027629-0.039909 0.041956-0.276293 0.293689-0.559748 0.582261-0.851391 0.86367-0.053212 0.051165-0.107447 0.099261-0.160659 0.150426-0.249687 0.237407-0.50142 0.470721-0.76134 0.697895-0.089028 0.078795-0.181125 0.153496-0.272199 0.230244-0.225127 0.191358-0.451278 0.381693-0.683569 0.565888-0.124843 0.099261-0.251733 0.192382-0.3776 0.288572-0.200568 0.153496-0.402159 0.306992-0.607844 0.454348-0.159636 0.11461-0.322341 0.224104-0.485047 0.334621-0.177032 0.12075-0.354064 0.242524-0.535189 0.35918-0.195451 0.12689-0.394996 0.246617-0.593518 0.367367-0.152473 0.092098-0.302899 0.186242-0.457418 0.275269-0.237407 0.137123-0.477884 0.268106-0.718361 0.397043-0.121773 0.065492-0.2415 0.132006-0.364297 0.195451-0.283456 0.146333-0.571005 0.285502-0.859577 0.420579-0.085958 0.040932-0.170892 0.082888-0.257873 0.122797-0.337691 0.154519-0.679475 0.298805-1.022283 0.437975-0.044002 0.017396-0.086981 0.036839-0.130983 0.055259-1.604544 0.638543-3.2623 1.113357-4.948709 1.416256-0.343831 0.062422-0.687662 0.112564-1.031493 0.160659-0.055259 0.008186-0.110517 0.01842-0.165776 0.025583-1.633197 0.216941-3.25923 0.26913-4.861728 0.173962-0.013303-0.001023-0.026606-0.001023-0.040932-0.002047-0.363274-0.022513-0.724501-0.054235-1.085728-0.091074-0.060375-0.00614-0.119727-0.011256-0.180102-0.017396-0.310062-0.034792-0.618077-0.077771-0.926092-0.122797-0.116657-0.017396-0.232291-0.032746-0.348947-0.051165-0.24764-0.040932-0.494257-0.086981-0.740874-0.135076-0.178055-0.033769-0.355087-0.067538-0.532119-0.105401-0.183172-0.039909-0.36532-0.083911-0.547469-0.127913-0.237407-0.056282-0.474814-0.113587-0.710175-0.176009-0.12075-0.032746-0.240477-0.068562-0.360204-0.102331-0.292666-0.082888-0.584308-0.168846-0.874927-0.26299-0.063445-0.020466-0.125867-0.042979-0.188288-0.063445-0.338714-0.112564-0.675382-0.230244-1.010003-0.357134-0.019443-0.007163-0.038886-0.01535-0.058328-0.022513-1.493004-0.571005-2.948145-1.284249-4.340865-2.149966-0.067538-0.041956-0.13303-0.088004-0.200568-0.12996-0.273223-0.172939-0.545422-0.346901-0.813528-0.531096-1.416256-0.971118-2.734274-2.089591-3.936659-3.333932-0.025583-0.026606-0.049119-0.053212-0.074701-0.079818-0.26299-0.275269-0.521886-0.555655-0.773619-0.843204-0.058328-0.066515-0.112564-0.134053-0.169869-0.200568-0.211824-0.246617-0.420579-0.496304-0.62217-0.751107-0.083911-0.106424-0.164752-0.214894-0.246617-0.322341-0.167822-0.218988-0.334621-0.437975-0.49528-0.663102-0.102331-0.14224-0.199545-0.287549-0.298805-0.431835-0.13303-0.194428-0.26606-0.387833-0.393973-0.586354-0.115634-0.179079-0.225127-0.360204-0.335644-0.541329-0.103354-0.168846-0.207731-0.336668-0.306992-0.508583-0.12689-0.220011-0.24764-0.443092-0.36839-0.666172-0.074701-0.138146-0.151449-0.275269-0.223081-0.416486-0.137123-0.265036-0.265036-0.533143-0.39295-0.802272-0.050142-0.105401-0.101307-0.209778-0.150426-0.316202-0.144286-0.317225-0.279363-0.63752-0.410346-0.958838-0.026606-0.064468-0.055259-0.127913-0.080841-0.193405-0.150426-0.378623-0.291642-0.760317-0.423649-1.14508-0.005117-0.016373-0.011256-0.031722-0.017396-0.048095-0.157589-0.463558-0.303922-0.930185-0.434905-1.400906l-97.897657-342.642824L435.093423 811.832042c-0.071631 0.569982-0.165776 1.13587-0.275269 1.696642-0.008186 0.040932-0.017396 0.081864-0.025583 0.12382-0.071631 0.356111-0.148379 0.709151-0.234337 1.061169-0.031722 0.128937-0.065492 0.255827-0.099261 0.38374-0.066515 0.254803-0.135076 0.508583-0.208754 0.760317-0.060375 0.206708-0.124843 0.411369-0.190335 0.615007-0.053212 0.166799-0.107447 0.332575-0.164752 0.49835-0.092098 0.26913-0.190335 0.535189-0.290619 0.800225-0.037862 0.098237-0.074701 0.196475-0.113587 0.293689-0.12382 0.313132-0.25378 0.623193-0.38988 0.930185-0.022513 0.050142-0.044002 0.100284-0.066515 0.150426-0.152473 0.338714-0.311085 0.672312-0.477884 1.00284-0.01228 0.024559-0.024559 0.049119-0.037862 0.074701-0.173962 0.343831-0.356111 0.682545-0.545422 1.017166-0.011256 0.019443-0.022513 0.039909-0.033769 0.059352-0.188288 0.330528-0.382717 0.654916-0.584308 0.975211-0.021489 0.034792-0.044002 0.068562-0.065492 0.103354-0.190335 0.298805-0.385786 0.592494-0.587378 0.88209-0.045025 0.065492-0.091074 0.12996-0.137123 0.194428-0.180102 0.252757-0.363274 0.502443-0.551562 0.74906-0.079818 0.105401-0.162706 0.208754-0.24457 0.312108-0.157589 0.199545-0.317225 0.396019-0.480954 0.590448-0.124843 0.149403-0.252757 0.295735-0.381693 0.442068-0.125867 0.14224-0.251733 0.284479-0.38067 0.424672-0.174985 0.191358-0.355087 0.378623-0.536212 0.563842-0.088004 0.090051-0.176009 0.180102-0.26606 0.26913-0.224104 0.222057-0.452301 0.440022-0.684592 0.653893-0.054235 0.050142-0.10847 0.100284-0.163729 0.150426-0.265036 0.240477-0.535189 0.474814-0.810459 0.704035-0.028653 0.023536-0.056282 0.047072-0.084934 0.070608-0.294712 0.243547-0.595564 0.479931-0.902556 0.711198-0.01535 0.011256-0.029676 0.022513-0.045025 0.033769-0.311085 0.232291-0.627287 0.458441-0.949628 0.677429-0.019443 0.013303-0.037862 0.025583-0.057305 0.038886-0.309038 0.208754-0.623193 0.411369-0.942465 0.606821-0.045025 0.027629-0.090051 0.054235-0.134053 0.081864-0.288572 0.174985-0.581238 0.343831-0.877997 0.50756-0.090051 0.050142-0.181125 0.098237-0.272199 0.147356-0.25071 0.134053-0.502443 0.265036-0.759293 0.391926-0.156566 0.077771-0.314155 0.151449-0.472767 0.226151-0.194428 0.091074-0.38988 0.182149-0.587378 0.268106-0.239454 0.105401-0.481977 0.204661-0.724501 0.302899-0.12382 0.049119-0.246617 0.100284-0.37146 0.148379-0.334621 0.128937-0.673335 0.249687-1.014096 0.36532-0.042979 0.014326-0.085958 0.029676-0.128937 0.044002-1.6158 0.536212-3.296069 0.915859-5.02034 1.119497-0.01535 0.002047-0.029676 0.004093-0.044002 0.00614-0.309038 0.035816-0.620124 0.062422-0.931209 0.086981-0.132006 0.010233-0.265036 0.025583-0.397043 0.033769-0.174985 0.011256-0.349971 0.01535-0.525979 0.022513-0.270153 0.01228-0.539282 0.024559-0.808412 0.027629-0.054235 0.001023-0.10847-0.001023-0.162706-0.001023-1.696642 0.010233-3.371794-0.149403-5.006014-0.466628-0.065492-0.01228-0.12996-0.027629-0.195451-0.039909-0.331551-0.067538-0.662079-0.13917-0.989537-0.218988-0.148379-0.035816-0.295735-0.075725-0.443092-0.11461-0.234337-0.061398-0.468674-0.124843-0.700965-0.192382-0.224104-0.065492-0.445138-0.135076-0.666172-0.206708-0.149403-0.048095-0.297782-0.096191-0.446162-0.147356-0.286526-0.098237-0.568958-0.201591-0.850367-0.309038-0.079818-0.030699-0.160659-0.061398-0.240477-0.093121-0.330528-0.12996-0.655939-0.267083-0.979304-0.410346-0.033769-0.01535-0.067538-0.029676-0.101307-0.045025-0.355087-0.159636-0.705058-0.325411-1.050935-0.500397-0.008186-0.004093-0.016373-0.008186-0.023536-0.01228-0.360204-0.182149-0.714268-0.372483-1.064238-0.569982-0.004093-0.002047-0.008186-0.005117-0.013303-0.007163-0.344854-0.196475-0.684592-0.399089-1.019213-0.610914-0.020466-0.013303-0.040932-0.025583-0.060375-0.038886-0.313132-0.199545-0.621147-0.404206-0.925069-0.61603-0.050142-0.034792-0.099261-0.070608-0.149403-0.105401-0.268106-0.190335-0.532119-0.38374-0.791016-0.583285-0.091074-0.069585-0.181125-0.141216-0.271176-0.212848-0.212848-0.167822-0.422625-0.337691-0.629333-0.512676-0.137123-0.11461-0.271176-0.232291-0.406253-0.349971-0.154519-0.1361-0.308015-0.272199-0.459464-0.412392-0.179079-0.164752-0.354064-0.332575-0.528026-0.502443-0.102331-0.100284-0.204661-0.199545-0.304945-0.301875-0.211824-0.212848-0.418532-0.430812-0.623193-0.651846-0.059352-0.064468-0.119727-0.128937-0.179079-0.194428-0.231267-0.254803-0.456395-0.515746-0.678452-0.780783-0.031722-0.037862-0.063445-0.075725-0.095167-0.11461-0.23536-0.285502-0.465604-0.577145-0.688685-0.874927-0.01842-0.024559-0.036839-0.048095-0.055259-0.072655-0.226151-0.301875-0.445138-0.60989-0.657986-0.923022-0.019443-0.028653-0.038886-0.057305-0.058328-0.084934-0.202615-0.300852-0.400113-0.606821-0.590448-0.916882-0.032746-0.053212-0.064468-0.105401-0.096191-0.158612-0.169869-0.282433-0.335644-0.567935-0.49528-0.857531-0.053212-0.097214-0.105401-0.194428-0.158612-0.292666-0.130983-0.24457-0.258896-0.490164-0.381693-0.73985-0.080841-0.162706-0.157589-0.326435-0.234337-0.491187-0.088004-0.189312-0.177032-0.378623-0.260943-0.571005-0.107447-0.245593-0.209778-0.493234-0.310062-0.741897-0.047072-0.11768-0.095167-0.234337-0.141216-0.354064-0.130983-0.340761-0.25378-0.684592-0.370437-1.030469-0.013303-0.037862-0.026606-0.075725-0.038886-0.113587-0.180102-0.543376-0.345877-1.092891-0.48914-1.650593L244.22942 305.59939599999996 67.355037 305.59939599999996c-14.128789 0-25.582655-11.453866-25.582655-25.582655s11.453866-25.582655 25.582655-25.582655l191.314257 0c0.867764 0 1.725294 0.044002 2.570545 0.128937 0.828878-0.080841 1.656733-0.1361 2.478448-0.1361 11.218506 0 21.512966 7.439436 24.644283 18.779715l113.358791 410.43686 103.412254-723.884758c0.00921-0.072655 0.021489-0.145309 0.030699-0.217964l0.046049-0.320295c0.002047-0.011256 0.005117-0.021489 0.00614-0.032746 0.109494-0.7552 0.25071-1.502213 0.425695-2.238994 0.01535-0.064468 0.031722-0.12689 0.047072-0.191358 0.166799-0.679475 0.358157-1.350764 0.579191-2.01182 0.041956-0.124843 0.088004-0.24764 0.130983-0.37146 0.210801-0.600681 0.437975-1.194198 0.692778-1.77646 0.068562-0.156566 0.144286-0.309038 0.215918-0.464581 0.223081-0.484024 0.460488-0.961908 0.713244-1.431605 0.106424-0.196475 0.213871-0.390903 0.325411-0.584308 0.265036-0.462534 0.545422-0.914836 0.838088-1.359974 0.088004-0.13303 0.170892-0.268106 0.260943-0.399089 0.354064-0.51677 0.732687-1.016143 1.12359-1.506307 0.078795-0.099261 0.156566-0.198521 0.237407-0.296759 0.420579-0.511653 0.864694-1.004887 1.325182-1.482771 0.051165-0.052189 0.101307-0.105401 0.152473-0.157589 0.494257-0.50449 1.010003-0.989537 1.548262-1.454118 0.00921-0.007163 0.017396-0.014326 0.026606-0.022513 1.636267-1.408069 3.466961-2.620687 5.466502-3.592828 0.075725-0.036839 0.151449-0.074701 0.228197-0.11154 0.576121-0.273223 1.165546-0.525979 1.768273-0.75827 0.158612-0.061398 0.319272-0.118704 0.478907-0.177032 0.558725-0.202615 1.124614-0.393973 1.704828-0.559748 0.005117-0.001023 0.010233-0.002047 0.01535-0.004093 0.278339-0.079818 0.562818-0.13917 0.844228-0.209778 0.394996-0.098237 0.789992-0.194428 1.184989-0.274246 0.283456-0.056282 0.568958-0.103354 0.854461-0.149403 0.445138-0.073678 0.889253-0.134053 1.333368-0.183172 0.229221-0.024559 0.456395-0.052189 0.686638-0.071631 0.710175-0.059352 1.418302-0.099261 2.122337-0.099261 0.337691 0 0.671289 0.027629 1.007957 0.040932 0.276293 0.011256 0.550539 0.013303 0.828878 0.033769 0.401136 0.029676 0.799202 0.079818 1.196245 0.127913 0.191358 0.022513 0.38067 0.033769 0.572028 0.061398 0.069585 0.010233 0.1361 0.024559 0.205685 0.034792 0.232291 0.034792 0.462534 0.075725 0.692778 0.116657 0.463558 0.082888 0.921999 0.176009 1.3743 0.283456 0.109494 0.025583 0.218988 0.047072 0.327458 0.074701 0.582261 0.145309 1.152243 0.316202 1.716084 0.499373 0.098237 0.031722 0.196475 0.063445 0.293689 0.097214 1.90335 0.644683 3.694135 1.50119 5.351891 2.540869 0.014326 0.00921 0.028653 0.01842 0.042979 0.027629 1.089821 0.686638 2.121314 1.452071 3.087315 2.287089 0.083911 0.071631 0.167822 0.143263 0.25071 0.215918 0.424672 0.3776 0.837064 0.76748 1.235131 1.170662 0.12382 0.124843 0.243547 0.254803 0.36532 0.382717 0.317225 0.334621 0.626263 0.677429 0.925069 1.028423 0.155543 0.183172 0.308015 0.36839 0.458441 0.556679 0.26606 0.331551 0.523933 0.670266 0.773619 1.01512 0.130983 0.180102 0.261966 0.35918 0.387833 0.543376 0.294712 0.429789 0.575098 0.86981 0.843204 1.316995 0.099261 0.165776 0.195451 0.334621 0.290619 0.503467 0.283456 0.499373 0.555655 1.004887 0.806365 1.52268 0.031722 0.065492 0.060375 0.13303 0.091074 0.199545 0.276293 0.584308 0.530073 1.178849 0.762363 1.784646 0.00614 0.017396 0.014326 0.034792 0.020466 0.051165 0.251733 0.661056 0.472767 1.336438 0.669242 2.020006 0.002047 0.008186 0.00614 0.016373 0.008186 0.024559l0.061398 0.215918c0.029676 0.106424 0.062422 0.210801 0.090051 0.317225l117.579929 411.527704 79.800487-94.308923c0.070608-0.083911 0.146333-0.161682 0.217964-0.243547 0.190335-0.220011 0.38374-0.436952 0.581238-0.649799 0.134053-0.144286 0.26913-0.285502 0.405229-0.425695 0.164752-0.168846 0.331551-0.335644 0.50142-0.500397 0.164752-0.159636 0.329505-0.319272 0.496304-0.473791 0.138146-0.12689 0.279363-0.25071 0.419556-0.37453 0.198521-0.174985 0.397043-0.350994 0.599657-0.518816 0.081864-0.067538 0.166799-0.132006 0.249687-0.198521 0.817622-0.661056 1.667989-1.264806 2.545986-1.811252 0.098237-0.061398 0.195451-0.125867 0.294712-0.185218 0.228197-0.138146 0.459464-0.267083 0.691755-0.398066 0.157589-0.089028 0.315178-0.178055 0.474814-0.264013 0.200568-0.107447 0.403183-0.208754 0.606821-0.311085 0.202615-0.101307 0.406253-0.201591 0.611937-0.297782 0.173962-0.080841 0.348947-0.159636 0.523933-0.237407 0.245593-0.10847 0.494257-0.212848 0.743944-0.313132 0.144286-0.058328 0.289596-0.115634 0.434905-0.171915 0.291642-0.11154 0.586354-0.216941 0.883113-0.317225 0.11154-0.037862 0.223081-0.076748 0.334621-0.113587 0.337691-0.109494 0.677429-0.210801 1.02126-0.305969 0.078795-0.021489 0.157589-0.046049 0.236384-0.066515 0.376577-0.101307 0.757247-0.193405 1.140986-0.277316 0.050142-0.011256 0.100284-0.023536 0.150426-0.034792 0.405229-0.085958 0.813528-0.162706 1.225921-0.229221 0.031722-0.005117 0.063445-0.01228 0.096191-0.017396 0.412392-0.065492 0.828878-0.12075 1.24741-0.165776 0.032746-0.004093 0.064468-0.00921 0.097214-0.01228 0.382717-0.039909 0.768503-0.068562 1.155313-0.092098 0.068562-0.004093 0.1361-0.01228 0.204661-0.01535 0.25992-0.013303 0.521886-0.01535 0.782829-0.020466 0.188288-0.004093 0.376577-0.01535 0.564865-0.01535 0.008186 0 0.01535 0.001023 0.023536 0.001023l181.208085 0c14.129812 0 25.582655 11.453866 25.582655 25.582655S967.56978 315.668729 953.440991 315.668729z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="table" unicode="&#58925;" d="M304.738028 343.684806M729.544153 511.153982M595.52788 637.723655M143.806755 686.614156l0-601.704045L881.172549 84.91011100000003l0 601.704045L143.806755 686.614156zM420.318416 299.80441299999995l0 128.936581 184.341448 0 0-128.936581L420.318416 299.80441299999995zM604.659865 256.825552l0-128.936581L420.318416 127.88897099999997l0 128.936581L604.659865 256.825552zM604.659865 600.656435l0-128.936581L420.318416 471.719854l0 128.936581L604.659865 600.656435zM374.232798 600.656435l0-128.936581L189.89135 471.719854l0 128.936581L374.232798 600.656435zM189.89135 428.740994L374.232798 428.740994l0-128.936581L189.89135 299.80441299999995 189.89135 428.740994zM650.745483 428.740994l184.341448 0 0-128.936581L650.745483 299.80441299999995 650.745483 428.740994zM650.745483 471.719854l0 128.936581 184.341448 0 0-128.936581L650.745483 471.719854zM189.89135 256.825552L374.232798 256.825552l0-128.936581L189.89135 127.88897099999997 189.89135 256.825552zM650.745483 127.88897099999997l0 128.936581 184.341448 0 0-128.936581L650.745483 127.88897099999997z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="tree" unicode="&#58926;" d="M962.691679 258.53447400000005c-8.721639 54.163597-34.298154 97.584526-73.089645 133.8638-44.721551 41.825594-99.282191 65.724911-156.512636 84.432994-26.935466 8.80555-54.079686 16.971533-81.129762 25.427112 41.188074 7.485485 81.495082 10.991332 121.872698 12.269441 39.906895 1.26276 79.885422 0.276293 120.633475 0.276293-30.644951 44.233434-74.588789 71.110571-127.260405 84.384899-53.004191 13.357216-103.742782 9.715269-152.261822-32.081673 18.715247 66.336848 12.464893 120.18936-38.810934 160.830989-32.450063 25.719778-77.127611 31.000038-111.319341 14.916734 58.583257-31.127951 82.051761-84.265172 94.304829-145.102772-44.638663 69.056795-110.067838 96.432283-187.710173 86.487793-56.123228-7.187703-110.723777-26.270317-166.003801-40.048111 15.677051-14.358009 31.136138-24.116257 47.932686-27.839045 51.427276-11.399631 103.405091-20.301372 155.098427-30.524201 37.036521-7.323802 75.163887-12.144598 104.448864-40.879036-78.096682 23.458271-155.928329 30.034037-235.541551 9.092076C186.718589 530.20385 104.838743 479.821369 81.996502 429.437865c46.955428 23.955598 95.807043 18.776645 144.606469 17.139356 37.737486-1.266853 76.089979-3.461845 113.238041 1.594311 52.683896 7.170307 104.513332 20.624736 159.209048 31.909757-91.88164-62.077847-186.516997-122.342396-159.194722-259.889075 58.852386 100.205213 163.392324 150.107763 229.951229 238.105956-16.239869-91.498924 6.980995-169.376619 66.432015-237.83785 41.815361-48.152696 89.979314-92.010577 110.706381-156.013263 12.758582 141.877311-25.823132 270.789333-97.911984 396.334677C755.996107 391.809873 858.199837 325.909977 962.691679 258.53447400000005zM513.476631 320.10169099999996c-27.767414-14.065344-39.008432-35.954887-42.252313-64.998363-6.078439-54.437843-15.162328-108.532879-21.799492-162.916487-3.90903-32.026414-5.519714-64.333214-8.16496-96.53052 30.078039 0 55.507198 0 79.961146 0 9.912767 78.200036 19.732413 154.247037 28.913517 230.369761 0.883113 7.322779-0.756223 15.746636-3.705392 22.591531C536.246217 272.25086999999996 524.967336 295.41135899999995 513.476631 320.10169099999996z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="upload-circle" unicode="&#58927;" d="M512-128c282.768 0 512 229.216 512 512C1024 666.768 794.768 896 512 896 229.216 896 0 666.768 0 384 0 101.21600000000001 229.216-128 512-128zM512 848c256.272 0 464-207.744 464-464 0-256.272-207.728-464-464-464S48 127.72799999999995 48 384C48 640.256 255.728 848 512 848zM377.728 534.544L480 534.544l0-478c0-17.664 14.336-32 32-32s32 14.336 32 32L544 534.544l102.272 0c17.616 0 23.424 11.568 12.944 25.68l-128.128 172.624c-10.496 14.128-27.664 14.128-38.16 0L364.8 560.24C354.32 546.1120000000001 360.128 534.544 377.728 534.544z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="templeate-1" unicode="&#58928;" d="M320 384L106.666667 384c-35.349333 0-64-28.650667-64-64l0-213.333333c0-35.349333 28.650667-64 64-64l213.333333 0c35.349333 0 64 28.650667 64 64L384 320C384 355.349333 355.349333 384 320 384zM256 341.33333300000004l0-256L170.666667 85.33333300000004 170.666667 341.33333300000004 256 341.33333300000004zM85.333333 106.66666699999996L85.333333 320c0 11.754667 9.578667 21.333333 21.333333 21.333333l42.666667 0 0-256L106.666667 85.33333300000004C94.912 85.33333300000004 85.333333 94.91200000000003 85.333333 106.66666699999996zM341.333333 106.66666699999996c0-11.754667-9.578667-21.333333-21.333333-21.333333l-42.666667 0L277.333333 341.33333300000004l42.666667 0c11.754667 0 21.333333-9.578667 21.333333-21.333333L341.333333 106.66666699999996zM576 554.666667L234.666667 554.666667c-47.061333 0-85.333333-38.272-85.333333-85.333333l0-42.666667 42.666667 0 0 42.666667c0 23.530667 19.136 42.666667 42.666667 42.666667l42.666667 0 0-96 21.333333 0L298.666667 512l213.333333 0 0-426.666667-85.333333 0-21.333333-42.666667 170.666667 0c47.061333 0 85.333333 38.272 85.333333 85.333333L661.333333 469.333333C661.333333 516.394667 623.061333 554.666667 576 554.666667zM618.666667 128c0-23.530667-19.136-42.666667-42.666667-42.666667l-42.666667 0L533.333333 512l42.666667 0c23.530667 0 42.666667-19.136 42.666667-42.666667L618.666667 128zM853.333333 42.66666699999996c47.061333 0 85.333333 38.272 85.333333 85.333333L938.666667 640c0 47.061333-38.272 85.333333-85.333333 85.333333L341.333333 725.333333c-47.061333 0-85.333333-38.272-85.333333-85.333333l0-42.666667 42.666667 0 0 42.666667c0 23.530667 19.136 42.666667 42.666667 42.666667l85.333333 0 0-85.333333 21.333333 0 0 85.333333 298.666667 0 0-597.333333-42.666667 0-21.333333-42.666667L853.333333 42.66666699999996zM896 128c0-23.530667-19.136-42.666667-42.666667-42.666667l-85.333333 0L768 682.666667l85.333333 0c23.530667 0 42.666667-19.136 42.666667-42.666667L896 128z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="util" unicode="&#58929;" d="M282.127566 639.0826059999999c-13.120832-13.221116-30.625508-20.50808-49.278333-20.50808-18.618033 0-36.157501 7.286963-49.311079 20.50808l-32.885991 33.019021 98.623181 99.027387 32.885991-33.019021c13.186324-13.221116 20.473287-30.829146 20.473287-49.548486C302.599829 669.8769589999999 295.347658 652.26893 282.127566 639.0826059999999L282.127566 639.0826059999999zM249.308089 705.0899489999999l-0.032746 0-32.884968-32.987299c4.418636-4.417613 10.252505-6.845918 16.458857-6.845918 6.206352 0 12.041244 2.428306 16.426111 6.813173 4.418636 4.452405 6.845918 10.288321 6.845918 16.493649C256.121262 694.802652 253.693979 700.671313 249.308089 705.0899489999999L249.308089 705.0899489999999zM396.703067 496.343671L249.578242 638.778684l32.278147 33.626865 147.157571-142.468782L396.703067 496.343671 396.703067 496.343671zM751.45979 133.92852400000004L618.131179 274.071332l32.884968 32.985252 133.330658-140.141784L751.45979 133.92852400000004 751.45979 133.92852400000004zM850.184279 67.95597399999997c-22.700001-22.766516-52.481282-34.168194-82.264609-34.168194-29.714765 0-59.395762 11.333116-81.994456 34.033118L538.194592 222.398462l32.884968 33.021068L718.811206 100.806149c27.117614-27.183106 71.269183-27.116591 98.488105 0.169869 27.186176 27.287483 27.117614 71.773673-0.135076 99.196233l-147.426701 154.273642 32.851199 33.021068 147.461493-154.308435C895.447159 187.557956 895.514697 113.421468 850.184279 67.95597399999997L850.184279 67.95597399999997zM801.716404 468.380806c-30.726815-30.860868-71.605851-47.861054-115.082038-47.861054-43.442418 0-84.321454 16.999163-115.082038 47.861054-30.760584 30.861892-47.692209 71.877027-47.692209 115.521037s16.931624 84.691891 47.692209 115.554806l42.497906 42.666752 32.885991-32.986275-42.497906-42.667775c-21.99085-22.090111-34.099632-51.367925-34.065863-82.566484 0-31.163767 12.108782-60.441581 34.065863-82.499969 21.956058-22.058388 51.16531-34.20094 82.196047-34.20094 31.064506 0 60.239989 12.142551 82.196047 34.20094l42.49893 42.665729 32.884968-33.019021L801.716404 468.380806 801.716404 468.380806zM844.214311 511.049604l-49.311079 49.51267-16.45988-16.493649c-17.538445-17.638729-40.879036-27.352975-65.73719-27.352975l-0.032746 0c-24.824385 0-48.198745 9.713222-65.73719 27.352975-17.539468 17.607006-27.252691 41.082674-27.252691 66.007343 0 24.925692 9.679453 48.400337 27.252691 66.040089l16.458857 16.495696-49.344848 49.51267 32.885991 33.021068 82.196047-82.533738-49.311079-49.482995c-8.769734-8.835226-13.626345-20.571525-13.626345-33.051767 0-12.446473 4.856611-24.183795 13.626345-32.987299 8.768711-8.835226 20.439518-13.69286 32.884968-13.69286 12.411681 0 24.082488 4.857635 32.852222 13.69286l49.344848 49.514717 82.196047-82.534761L844.214311 511.049604 844.214311 511.049604zM233.591129 129.139451l0 46.681182 46.512337 0 0-46.681182L233.591129 129.139451 233.591129 129.139451zM538.160823 356.538555l-92.247984 91.572602 32.717146 33.18889 92.214215-91.539856L538.160823 356.538555 538.160823 356.538555zM304.2187 101.04355599999997l173.634596 239.842507 37.641295-27.454282L338.318332 69.23715300000003c-21.923312-22.057365-51.132564-34.20094-82.19707-34.20094-31.028691 0-60.237943 12.143575-82.196047 34.168194-21.958104 22.057365-34.065863 51.335179-34.065863 82.533738 0 31.198559 12.107759 60.476373 34.065863 82.533738l2.765997 2.360767L417.243893 412.054963l27.353998-37.742603L205.596542 200.00340600000004c-12.411681-13.053294-19.224854-30.119995-19.224854-48.26526 0-18.71934 7.252171-36.291554 20.438495-49.513694C232.747925 76.15265599999998 277.775444 75.71263499999998 304.2187 101.04355599999997L304.2187 101.04355599999997z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="layouts" unicode="&#58930;" d="M917.213-103.239h-810.426c-23.151 0-41.918 18.766-41.918 41.917l0 698.644c0 23.148 18.767 41.917 41.918 41.917h810.426c23.149 0 41.918-18.769 41.918-41.917v-698.643c0-23.151-18.769-41.918-41.918-41.918zM316.38-61.321h600.833v363.294h-600.833v-363.294zM106.787-61.321h167.674v363.294h-167.674v-363.294zM148.705 637.322c-23.151 0-41.918-18.769-41.918-41.92s18.767-41.92 41.918-41.92 41.92 18.768 41.92 41.92-18.769 41.92-41.92 41.92zM274.461 637.322c-23.151 0-41.918-18.769-41.918-41.92s18.767-41.92 41.918-41.92c23.151 0 41.92 18.768 41.92 41.92s-18.77 41.92-41.92 41.92zM400.216 637.322c-23.15 0-41.918-18.769-41.918-41.92s18.769-41.92 41.918-41.92c23.152 0 41.92 18.768 41.92 41.92s-18.768 41.92-41.92 41.92zM875.293 511.566h-768.506v-167.675h810.426l0 167.675h-41.921z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="prev-circle" unicode="&#58931;" d="M508.638018 827.97307c-246.403458 0-446.845649-200.463469-446.845649-446.845649 0-246.382179 200.442191-446.845649 446.845649-446.845649 246.382179 0 446.845649 200.463469 446.845649 446.845649C955.483667 627.5096 755.041476 827.97307 508.638018 827.97307zM508.638018-23.16149900000005c-222.933422 0-404.28892 181.355498-404.28892 404.28892 0 222.933422 181.355498 404.28892 404.28892 404.28892 222.912144 0 404.28892-181.355498 404.28892-404.28892C912.926939 158.19399899999996 731.57144-23.16149900000005 508.638018-23.16149900000005zM252.87208 485.1999c8.639016 26.129831-32.470784 37.215859-41.067243 11.32009-27.810822-83.730363-22.321004-168.545923 14.086277-248.573851 11.362646-24.938243 48.025268-3.298146 36.747735 21.491148C230.976644 339.081373 228.806251 412.853462 252.87208 485.1999zM599.262572 247.73335499999996l-127.627629 133.394065 127.47868 133.223838c9.043305 9.064583 9.022026 23.789211-0.021278 32.832516-8.809243 8.830521-24.087108 8.766686-32.832516 0l-148.310199-148.310199c-4.617405-4.638683-6.979303-11.064749-6.553736-17.746156-0.404289-6.702685 1.936331-13.107472 6.575015-17.788712l148.310199-148.28892c4.383343-4.383343 10.213615-6.787798 16.405619-6.787798 6.170726 0 12.000997 2.404455 16.405619 6.787798C608.156928 224.114371 608.156928 238.83899899999994 599.262572 247.73335499999996z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="carousel" unicode="&#58932;" d="M1002.069333 144.38400000000001L1002.069333 611.6906670000001c0 24.213333-16.917333 49.578667-42.069333 49.578667l-64 0 1.152 6.4c0 31.338667-26.005333 57.6-58.538667 57.6L186.432 725.269333c-31.936 0-58.410667-31.957333-58.410667-64l-0.213333 0.96L67.178667 662.229333c-25.152 0-45.226667-20.288-45.226667-44.501333l0-467.328L21.354667 150.39999999999998c0-24.789333 20.629333-44.693333 45.312-44.693333L127.786667 105.70666700000004l0-5.184C127.786667 69.03466700000001 153.792 42.66666699999996 186.432 42.66666699999996l652.842667 0c31.658667 0 56.277333 10.901333 56.725333 42.602667l64 0c24.661333 0 42.666667 34.325333 42.666667 59.114667L1002.069333 144.38400000000001zM128 149.26933299999996L64 149.26933299999996l0 469.333333 64 0L128 149.26933299999996zM853.333333 106.602667c0-6.421333-14.848-21.333333-21.333333-21.333333l-640 0c-6.485333 0-21.333333 14.848-21.333333 21.333333l0 554.666667c0 6.378667 9.258667 18.56 15.744 18.56l5.589333 2.773333 640 0c6.442667 0 21.333333-14.954667 21.333333-21.333333L853.333333 106.602667zM960 127.93600000000004l-64 0 0 490.666667 60.842667 1.984c4.970667 0 3.157333 2.944 3.157333-1.984l0-469.333333C960 144.29866700000002 965.013333 127.93600000000004 960 127.93600000000004zM412.458667 399.829333c43.925333 0 79.637333 34.773333 79.637333 77.482667 0 42.752-35.712 77.482667-79.637333 77.482667-43.925333 0-79.637333-34.730667-79.637333-77.482667C332.8 434.602667 368.533333 399.829333 412.458667 399.829333zM412.458667 516.0533330000001c21.952 0 39.829333-17.365333 39.829333-38.741333 0-21.333333-17.877333-38.741333-39.829333-38.741333-21.952 0-39.829333 17.408-39.829333 38.741333C372.629333 498.709333 390.506667 516.0533330000001 412.458667 516.0533330000001zM785.92 457.386667c-95.914667-23.338667-137.728-87.765333-168.256-134.805333-24.213333-37.269333-39.082667-58.346667-65.109333-58.346667l-0.042667 0c-35.456 0-57.109333 14.272-80.042667 28.16-24.362667 14.741333-49.536 29.952-88.64 29.952-75.648 0-156.906667-93.269333-165.930667-103.893333L213.333333 167.38133300000004c0-10.709333 8.917333-18.112 19.925333-18.112l557.504 0c10.986667 0 19.904 7.402667 19.904 18.112L810.666667 438.570667c0 5.973333-2.837333 11.626667-7.658667 15.296C798.186667 457.536 791.872 458.858667 785.92 457.386667zM770.858667 188.52266699999996L253.162667 188.52266699999996c24.874667 27.733333 85.290667 95.082667 130.666667 95.082667 27.733333 0 46.229333-11.157333 67.605333-24.128 25.152-15.168 53.632-32.426667 99.712-33.941333l2.944-0.064c47.637333 0 71.722667 37.12 97.237333 76.416 26.645333 41.088 56.469333 79.104 119.530667 102.485333L770.858667 188.52266699999996z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="code-circle" unicode="&#58933;" d="M513.544163 893.525741c-282.101629 0-510.78094-228.679311-510.78094-510.76288 0-282.083569 228.679311-510.76288 510.78094-510.76288s510.76288 228.679311 510.76288 510.76288C1024.325103 664.8464309999999 795.645793 893.525741 513.544163 893.525741zM513.544163-83.46335899999997c-257.503523 0-466.22622 208.740757-466.22622 466.22622S256.0587 848.989082 513.544163 848.989082s466.22622-208.740757 466.22622-466.22622S771.047686-83.46335899999997 513.544163-83.46335899999997zM171.771357 359.77212099999997L414.357086 256.088033 414.357086 300.805295 221.978945 380.50532599999997 414.357086 459.464886 414.357086 504.182148 171.771357 401.76228ZM442.585309 193.38272800000004L478.814238 193.38272800000004 584.737801 572.1429949999999 548.743656 572.1429949999999ZM612.749301 504.182148L612.749301 459.464886 804.874598 380.50532599999997 612.749301 300.805295 612.749301 256.088033 855.33503 359.77212099999997 855.33503 401.76228Z"  horiz-adv-x="1025" />
+      
+      <glyph glyph-name="water" unicode="&#58934;" d="M862.315763 33.684211000000005C802.869868 33.684211000000005 754.526289 82.94399999999996 754.526289 143.50371900000005 754.526289 162.33094700000004 759.35885 180.96056099999998 768.520956 197.43438600000002 768.64671 197.79368399999998 768.808394 198.15298199999995 769.006008 198.49431600000003L849.075622 334.542596 849.057657 334.542596 862.315763 357.052632 875.573868 334.542596 875.573868 334.542596 955.140464 199.356632C955.715341 198.67396499999995 956.164464 197.865544 956.380043 196.96729800000003 965.380464 180.60126300000002 970.123201 162.151298 970.105236 143.50371900000005 970.105236 82.94399999999996 921.761657 33.684211000000005 862.315763 33.684211000000005L862.315763 33.684211000000005ZM924.33064 188.57768399999998C924.204885 188.79326300000002 924.115061 189.02680699999996 924.025236 189.27831600000002L862.315763 302.996211 800.606289 189.260351C800.516464 189.02680699999996 800.42664 188.79326300000002 800.300885 188.57768399999998 793.977236 176.505263 790.635763 162.81600000000003 790.635763 148.965053 790.635763 105.29235100000005 822.792956 69.75775399999998 862.333727 69.75775399999998 901.856534 69.75775399999998 933.995763 105.29235100000005 933.995763 148.98301800000002 933.995763 162.81600000000003 930.654289 176.52322800000002 924.33064 188.57768399999998L924.33064 188.57768399999998ZM682.684605 392.982456C593.50678 392.982456 520.982429 469.602807 520.982429 563.8108070000001 520.982429 593.093614 528.240254 622.071018 541.965447 647.706947 542.163061 648.281825 542.396605 648.820772 542.684043 649.341754L662.815412 860.968421 662.797447 860.968421 682.684605 896 702.571763 860.968421 702.535833 860.968421 821.89471 650.689123C822.774991 649.647158 823.439692 648.3716489999999 823.781026 646.970386 837.25471 621.514105 844.368815 592.8241399999999 844.35085 563.8108070000001 844.35085 469.602807 771.844464 392.982456 682.684605 392.982456L682.684605 392.982456ZM791.408254 630.1192980000001C791.21064 630.4965609999999 791.030991 630.891789 790.887271 631.322947L682.684605 823.924772 574.446008 631.287018C574.320254 630.891789 574.140605 630.4965609999999 573.942991 630.1013330000001 562.840675 609.6931930000001 556.912254 596.075789 556.912254 572.631579 556.912254 498.634105 613.375973 428.876351 682.684605 428.876351 751.993236 428.876351 808.367131 489.058807 808.367131 563.056281 808.367131 586.500491 802.492605 609.6931930000001 791.408254 630.1192980000001L791.408254 630.1192980000001ZM538.695833 276.983018C540.115061 275.330246 541.174991 273.33614 541.713938 271.12645599999996 563.433517 231.11859600000003 574.895131 186.02666699999997 574.895131 140.43171900000004 574.895131-7.581192999999985 458.051341-128 314.403903-128 170.738499-128 53.89471-7.581192999999985 53.89471 140.43171900000004 53.89471 186.47578899999996 65.589868 231.998877 87.704675 272.294175 88.010078 273.17445599999996 88.387341 274.01880700000004 88.872394 274.863158L282.408394 607.411649 282.372464 607.411649 314.403903 662.45614 346.453306 607.411649 346.399412 607.411649 538.695833 276.983018 538.695833 276.983018ZM314.403903 590.614456L119.807973 257.79649099999995C119.556464 257.113825 119.251061 256.449123 118.873798 255.78442099999995 98.932745 220.48336800000004 88.387341 180.42161399999998 88.387341 139.91073700000004 88.387341 12.072420999999963 189.799271-91.89052600000002 314.421868-91.89052600000002 439.026499-91.89052600000002 540.420464 12.072420999999963 540.402499 139.91073700000004 540.402499 180.42161399999998 529.857096 220.50133300000005 509.916043 255.78442099999995 509.53878 256.449123 509.233377 257.131789 508.963903 257.86835099999996L314.403903 590.614456 314.403903 590.614456Z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="date" unicode="&#58935;" d="M933.185668 758.3591759999999l-167.054737 0 0 56.506968L732.333174 814.866145l0-56.506968L539.505447 758.3591759999999l0 56.506968-33.796734 0 0-56.506968-216.255299 0 0 56.506968-33.796734 0 0-56.506968L88.005356 758.3591759999999c-12.255115 0-22.224164-9.970072-22.224164-22.224164l0-706.60521c0-12.255115 9.970072-22.225187 22.224164-22.225187l845.179288 0c12.255115 0 22.225187 9.970072 22.225187 22.225187L955.409832 736.135012C955.409832 748.389104 945.43976 758.3591759999999 933.185668 758.3591759999999zM939.036933 29.528778999999986c0-3.226484-2.62478-5.852288-5.852288-5.852288l-845.179288 0c-3.226484 0-5.851265 2.62478-5.851265 5.852288L82.154092 736.135012c0 3.226484 2.62478 5.851265 5.851265 5.851265l167.650301 0 0-55.657624 33.796734 0 0 55.657624 216.255299 0 0-55.657624 33.796734 0 0 55.657624L732.333174 741.986277l0-55.657624 33.796734 0 0 55.657624 167.054737 0c3.226484 0 5.852288-2.62478 5.852288-5.851265L939.036933 29.528778999999986zM206.835765 608.260623l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM458.879152 608.260623l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM684.827207 608.260623l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM206.835765 433.345871l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM458.879152 433.345871l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM684.827207 433.345871l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM206.835765 257.877511l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM458.879152 257.877511l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM684.827207 257.877511l129.098263 0 0-94.008071-129.098263 0 0 94.008071Z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="layer" unicode="&#58936;" d="M96.089 724.318l0-684.236 831.822 0L927.911 724.318 96.089 724.318zM884.178 84.457L140.464 84.457 140.464 489.559l743.714 0L884.178 84.457z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="fonts-clear" unicode="&#58937;" d="M944.787709 197.20939699999997L857.081297 197.20939699999997 741.092979-127.73993700000005 815.146059-127.73993700000005 832.440281-65.58476199999996 966.82809-65.58476199999996 984.512408-127.73993700000005 1062.011328-127.73993700000005 944.787709 197.20939699999997 944.787709 197.20939699999997ZM848.04409 1.1865400000000363L898.951519 153.25866699999995 949.923963 1.1865400000000363 848.04409 1.1865400000000363 848.04409 1.1865400000000363ZM210.238376 489.910857L183.386821 513.121524 12.46009 313.522794C-5.874386 292.652698-3.728862 260.989968 17.271265 242.720508 38.401424 224.45104800000001 70.454249 226.66158700000005 88.853741 247.53168300000004L100.361551 260.599873C106.603075 267.55657099999996 117.200662 268.20673 124.287392 262.22527 131.309106 256.048762 132.024281 245.51619000000005 125.912789 238.55949199999998 107.448281 217.62438099999997 98.085995 173.08850800000005 119.216154 154.81904799999995 140.281297 136.614603 183.841932 151.76330199999995 202.371455 172.69841299999996 208.417932 179.525079 219.145551 180.30526999999995 226.167265 174.19377799999995 233.188979 168.14730199999997 233.904154 157.61473 227.792662 150.65803200000005 209.328154 129.85295199999996 199.965868 85.05701599999998 221.096027 66.91758700000003 242.16117 48.648127000000045 285.656789 63.86184100000003 304.186313 84.666921 310.362821 91.62361899999996 321.025424 92.40381000000002 327.982122 86.29231700000003 335.068852 80.18082500000003 335.784027 69.71326999999997 329.672535 62.75657100000001 311.143011 41.82146 301.845741-2.9094599999999673 322.910884-20.983873000000017 344.041043-39.253333 387.601678-24.039619000000016 406.00117-3.234540000000038 412.177678 3.7221590000000333 422.840281 4.437332999999967 429.927011-1.6091430000000173 436.948725-7.720635000000016 437.598884-18.31822199999999 431.487392-25.144889000000035 413.022884-46.08000000000004 403.725614-90.81092100000001 424.790757-109.01536499999997 445.920916-127.15479400000004 477.973741-125.00927000000001 496.373233-104.20419000000004L667.299963 95.52457100000004 658.652852 132.90869799999996 210.238376 489.910857 210.238376 489.910857ZM844.013106 329.516698L680.10809 471.12127 929.639011 715.190857C933.2799 718.376635 936.725741 721.562413 939.976535 725.203302 977.815773 768.048762 973.524725 833.129651 930.28917 870.513778 887.183646 907.702857 821.58263 903.281778 783.808408 860.631365L783.483328 860.761397 564.249805 571.3107299999999 399.824662 713.56546C385.391138 726.113524 363.480789 724.553143 350.867709 710.249651L248.14263 593.871238 225.322059 567.994921 251.393424 545.434413 695.7119 161.25561900000002 726.26936 136.679619 847.328916 281.014857C859.941995 295.318349 858.44663 316.96863499999995 844.013106 329.516698L844.013106 329.516698ZM817.941741 830.724063C839.136916 854.779937 876.000916 857.315556 900.186821 836.250413 924.372725 815.380317 926.908344 778.906413 905.648154 754.85054 884.452979 730.924698 847.588979 728.389079 823.403075 749.3892060000001 799.21717 770.324317 796.811582 806.798222 817.941741 830.724063L817.941741 830.724063ZM765.473932 758.491429C768.919773 741.522286 777.6319 725.593397 791.80536 713.305397 806.043836 701.017397 823.533106 694.580825 841.087392 693.540571L643.634186 494.526984 593.116852 538.2176509999999 765.473932 758.491429 765.473932 758.491429ZM776.006503 299.739429L709.755328 219.314794 307.502122 566.369524 376.809043 645.03873C382.920535 651.865397 393.38809 652.5155560000001 400.409805 646.534095L774.381106 323.01511100000005C781.337805 317.098667 782.117995 306.69612700000005 776.006503 299.739429L776.006503 299.739429Z"  horiz-adv-x="1063" />
+      
+      <glyph glyph-name="dialogue" unicode="&#58938;" d="M998.4 500.992C998.4 682.24 811.392 829.696 581.632 829.696c-121.216 0-235.904-41.472-315.264-114.048 37.504 8.192 76.416 13.056 115.456 14.464 59.264 30.592 128.256 46.72 199.808 46.72 198.144 0 359.296-123.776 359.296-275.968 0-31.872-7.04-63.232-20.992-93.056 7.552-28.16 11.264-57.344 11.008-86.528C975.104 374.784 998.4 436.736 998.4 500.992L998.4 500.992zM442.368 398.72c-30.72 0-55.808-23.04-55.808-51.328s25.088-51.328 55.808-51.328 55.808 23.04 55.808 51.328S473.088 398.72 442.368 398.72zM243.328 398.72c-30.72 0-55.808-23.04-55.808-51.328s25.088-51.328 55.808-51.328 55.808 23.04 55.808 51.328C299.264 375.67999999999995 274.176 398.72 243.328 398.72zM641.28 398.72c-30.72 0-55.808-23.04-55.808-51.328s25.088-51.328 55.808-51.328 55.808 23.04 55.808 51.328S672.128 398.72 641.28 398.72zM442.368 677.888C212.608 677.888 25.6 530.432 25.6 349.312c0-179.968 173.696-296.192 332.544-321.664l60.8-78.336c5.632-7.424 14.464-11.008 23.296-11.008 8.832 0 17.792 3.712 23.424 11.008l60.8 78.464C685.312 53.24800000000005 859.008 169.47199999999998 859.008 349.44000000000005 859.136 530.432 672.128 677.888 442.368 677.888zM714.88 173.82399999999996c-52.224-45.184-124.288-77.952-197.376-89.6C503.168 81.91999999999996 490.112 74.24000000000001 481.28 62.72000000000003l-38.784-49.92-38.912 49.92c-8.96 11.52-21.888 19.2-36.224 21.504-73.216 11.776-145.152 44.416-197.376 89.728-39.68 34.304-86.912 92.544-86.912 175.36 0 69.76 35.584 136.192 100.352 187.264 68.736 54.144 160.768 84.096 258.944 84.096 98.304 0 190.336-29.824 259.072-84.096 64.768-51.072 100.352-117.504 100.352-187.264C801.664 266.36800000000005 754.56 208.12800000000004 714.88 173.82399999999996z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="cellphone-fine" unicode="&#58939;" d="M731.514252 896L292.485748 896C195.323702 896 116.154627 816.830925 116.154627 719.6688790000001l0-671.337759c0-97.162046 79.169075-176.331121 176.331121-176.331121l438.628661 0c97.162046 0 176.331121 79.169075 176.331121 176.331121L907.445529 719.6688790000001C907.845373 816.830925 828.676298 896 731.514252 896zM292.485748 853.216712l438.628661 0c70.772355 0 128.349863-55.178446 133.147989-124.751269L159.737602 728.465443C164.135884 798.038266 222.113237 853.216712 292.485748 853.216712zM865.062085 48.73096399999997c0-73.571261-59.976572-133.547833-133.547833-133.547833L292.485748-84.816868c-73.571261 0-133.547833 59.976572-133.547833 133.547833l0 45.582194 705.724326 0L864.662241 48.73096399999997zM865.062085 137.096447L158.937915 137.096447 158.937915 685.682155l705.724326 0L864.662241 137.096447zM512-54.82858299999998c13.59469 0 26.789535 5.597813 36.385787 15.194065 9.596251 9.596251 15.194065 22.791097 15.194065 36.385787 0 13.59469-5.597813 26.789535-15.194065 36.385787-9.596251 9.596251-22.791097 15.194065-36.385787 15.194065-13.59469 0-26.789535-5.597813-36.385787-15.194065-9.596251-9.596251-15.194065-22.791097-15.194065-36.385787 0-13.59469 5.597813-26.789535 15.194065-36.385787C485.210465-49.23076900000001 498.40531-54.82858299999998 512-54.82858299999998z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="form" unicode="&#58940;" d="M314.278111 437.019389l395.439892 0 0-30.297458-395.439892 0L314.278111 437.019389zM314.278111 315.83495200000004l395.439892 0 0-30.297458-395.439892 0L314.278111 315.83495200000004zM314.278111 194.62833l263.626661 0 0-30.297458L314.278111 164.330872 314.278111 194.62833zM609.376235 739.9931730000001c-7.849678 42.966669-48.394988 75.742447-97.378777 75.742447-48.961604 0-89.51311-32.775778-97.380776-75.742447L116.55177 739.9931730000001l0-787.725922 790.893774 0 0 787.725922L609.376235 739.9931730000001zM446.091342 670.440529l0 17.613058 0 36.791056c0 33.410348 29.57295 60.594317 65.906116 60.594317 36.352353 0 65.907115-27.183969 65.907115-60.594317l0-36.791056 0-17.621053 16.672696-8.712493c32.358061-16.929922 57.169039-42.663874 71.406386-73.213161L358.043239 588.50688c14.240345 30.555683 39.051523 56.281241 71.408385 73.213161L446.091342 670.440529zM874.489888-17.436289999999985L149.505227-17.436289999999985 149.505227 709.694715 413.138884 709.694715l0-21.641327c-51.44492-26.923746-88.727643-74.124144-98.86377-129.845165l395.44289 0c-10.102151 55.730615-47.40466 102.921419-98.859773 129.845165l0 21.641327 263.631658 0L874.489888-17.436289999999985z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="file" unicode="&#58913;" d="M887.443911 598.6304l0-44.578133 0-45.511111 0-477.866667c0-37.705956-30.560711-68.266667-68.266667-68.266667l-614.4 0c-37.705956 0-68.266667 30.560711-68.266667 68.266667l0 705.422222c0 37.6832 30.560711 68.266667 68.266667 68.266667l386.844444 0 45.511111 0 38.024533 0c7.805156 2.594133 16.566044 1.2288 22.778311-5.006222l183.136711-183.159467C885.919289 611.373511 887.876267 604.9564439999999 887.443911 598.6304zM659.888356 531.296711c-12.583822 0-22.755556 10.171733-22.755556 22.755556l0 204.8-45.511111 0-364.088889 0c-25.122133 0-45.511111-20.388978-45.511111-45.511111l0-659.911111c0-25.122133 20.388978-45.511111 45.511111-45.511111l568.888889 0c25.122133 0 45.511111 20.388978 45.511111 45.511111l0 455.111111 0 22.755556L659.888356 531.296711zM682.643911 750.273422l0-173.4656 159.288889 0 0 14.176711L682.643911 750.273422z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="triangle-r" unicode="&#58915;" d="M293.291 728.256l426.88-355.456-426.88-355.52z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="triangle-d" unicode="&#58917;" d="M773.128299 88.65234199999998M889.696178 575.195553L158.862147 575.195553 524.357446 209.64704300000005 889.696178 575.195553Z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="set-sm" unicode="&#58912;" d="M946.367 405.895c0.02 21.85-13.04 38.49-31.74 41.57-18.69 3.07-79.05 13.01-85.99 14.14-6.95 1.15-14.09 8.07-15.4 11.45-1.32 3.37-8.94 22.2-11.87 29.46-2.95 7.27-1.92 16.58 4.39 25.52 6.3 8.93 39.9 55.87 48.38 67.72 8.49 11.87 8.65 34.61-4.84 48.39-13.48 13.78-47.75 47.09-56.73 55.86-8.99 8.76-31.08 8.64-42.67 0.43-11.58-8.2-71.69-51.01-71.69-51.01s-9.97-6.89-20.67-2.64c-10.7 4.24-33.43 14.07-33.43 14.07s-7.19 5.43-9.68 19.79c-2.5 14.37-11.11 65.28-14.07 82.7-2.97 17.42-20.67 29.62-37.83 29.46-17.16-0.14-57.91 0-74.33 0s-32.26-15.68-34.75-29.46c-2.49-13.79-11.56-69.16-14.07-84.45-2.52-15.3-11.44-18.48-11.44-18.48s-19.56-8.06-29.91-12.31c-10.34-4.26-15.39-2.64-30.35 7.48-14.95 10.11-44.74 31.03-63.04 43.83-18.3 12.81-38.12 7.92-49.26-3.52s-36.06-35.77-51.02-50.43c-14.95-14.66-12.61-37.54 0.58-55.71 13.2-18.18 32.34-45.43 41.35-58.21 9.01-12.78 10.84-19.5 8.36-26.82-2.49-7.34-6.64-16.58-11.43-27.72-4.81-11.13-9.69-13.64-27.86-17.01-17.36-3.21-58.42-9.92-77.4-13.31-18.99-3.37-30.66-21.43-30.66-41.81l0-64.66c0-24.34 13.2-37.24 38.42-41.93 25.22-4.69 62.66-10.66 74.77-12.61 12.1-1.95 17.67-6.6 21.41-15.54 3.73-8.94 5.13-10.12 9.37-22.57 4.26-12.47 6.46-15.55-4.98-31.67-11.44-16.13-34.31-48.11-46.03-64.51-11.74-16.4-6.45-37.83 4.98-49.85 11.44-12.03 35.47-35.64 48.97-48.97 13.49-13.33 35.19-16.28 53.36-3.52 18.19 12.75 54.98 38.99 65.69 46.62 10.7 7.63 21.91 5.28 27.85 2.94 5.94-2.35 11.25-4.6 22-9.1 10.73-4.48 13.85-11.2 16.41-23.45 2.57-12.24 10.19-56.85 13.93-78.59 3.75-21.72 18.91-33.43 40.62-33.72 21.7-0.29 33.27-0.12 61.57 0 28.29 0.13 41.86 12.61 45.45 31.38 3.59 18.76 12.45 72.94 14.22 83.72 1.78 10.76 5.94 14.73 13.63 18.47 7.7 3.74 14.32 6.47 26.84 11.88 12.51 5.4 18.91 0.66 27.7-5.72 8.8-6.39 47.51-33.78 63.78-45.31 16.28-11.53 36.73-10.33 51.9 4.4 15.18 14.73 31.62 30.99 49.27 48.38 17.64 17.4 12.16 39.59 4.4 51.46-7.77 11.88-44.49 62.95-49.71 70.23-5.21 7.28-4.4 18.62-1.75 24.63 2.64 6.01 8.44 18.24 11.72 25.22 3.29 6.97 9.6 11.22 18.18 12.9 8.58 1.69 62.72 11 83.75 14.61 21.03 3.64 31.11 19.92 31.26 39.92C946.427 359.93499999999995 946.347 388.525 946.367 405.895zM908.587 338.615c0.21-5.76-4.66-10.65-8.82-11.38-4.17-0.73-63.26-11.38-81.48-14.29-18.21-2.92-33.23-15.07-38.72-28.06-3.98-9.44-5.47-13.51-10.59-26.96-5.12-13.44-4.64-32.19 2.56-42.26 7.2-10.08 46.82-64.9 50.38-70.45s4.27-11.95-1.28-17.5-40.99-41.2-47.39-47.39c-6.41-6.19-11.83-4.8-18.79 0-6.95 4.8-39.61 26.39-64.44 44.36-16.96 12.28-32.82 12.43-48.7 6.02-15.87-6.42 1.28 0.28-22.2-8.97-23.48-9.25-30.23-27.62-33.73-48.24-3.5-20.63-10.67-62.98-11.95-70.45-1.28-7.47-5.55-11.1-13.66-11.1l-64.9 0c-8.11 0-11.74 2.99-14.52 11.95-2.77 8.97-10.03 54.87-12.8 74.29-2.78 19.43-13.82 36.12-24.77 40.56-10.94 4.45-4.98 2.14-27.32 11.1-22.34 8.97-39.63 4.5-51.23-3.84-11.61-8.34-58.64-42.69-65.33-46.96-6.68-4.28-14.65-3.28-18.35 0.42-3.7 3.7-40.56 40.56-46.54 46.54-5.98 5.98-5.36 12.92 0 20.49 5.36 7.58 28.39 40.76 40.99 57.95 12.59 17.2 17.93 34.74 9.82 53.49-8.12 18.74-4.42 10.24-12.39 28.6-7.96 18.36-24.28 24.46-38.42 26.9-14.14 2.43-68.88 11.53-76.85 13.23-7.97 1.71-11.95 7.26-11.95 14.09l0 66.18c0 9.53 7.67 12.44 12.38 13.23 4.7 0.8 54.22 9.18 73 12.39 18.79 3.2 36.36 11.32 43.55 29.03 7.19 17.7 4.27 11.1 11.1 27.32 6.83 16.23 3.8 33.94-7.68 49.96-11.49 16.01-38.85 54-44.4 61.9-5.55 7.9-5.77 12.6 0.85 19.21 6.62 6.62 42.05 42.48 46.96 46.97 4.91 4.48 12.07 5.4 18.36 0.85 6.3-4.55 49.31-35.65 64.04-46.11 14.73-10.46 32.35-12.56 49.1-5.55 16.75 7.02 10.25 4.48 26.9 11.1s24.84 19.09 28.18 39.71c3.33 20.61 11.95 74.14 12.81 77.7 0.85 3.55 5.55 10.46 11.74 10.46s65.82-0.07 69.8 0c3.99 0.07 10.3-3.29 11.32-9.18 1.02-5.9 13.02-74.29 14.94-86.25 1.92-11.95 15.58-28.57 25.54-32.73 9.96-4.16 21.35-8.75 31.31-13.09 9.97-4.34 30.13-1.91 36.15 2.28 6.03 4.18 70.52 48.81 75.43 52.37 4.91 3.56 11.52 3.27 17.64-2.85s43.34-43.19 47.54-47.53c4.19-4.34 4.66-8.66 1.14-13.66-3.53-5.01-36.72-51.8-47.54-67.46-10.81-15.65-11.73-33.73-5.41-48.96 6.33-15.22 3.99-9.39 9.11-21.91 5.13-12.53 16.28-29.03 33.59-31.88 17.31-2.85 76.92-12.74 84.82-13.95 7.9-1.21 11.1-7.18 11.1-13.37S908.377 344.385 908.587 338.615zM526.833 573.1949999999999c-110.45 0-200-89.54-200-200s89.55-200 200-200c110.46 0 200 89.54 200 200S637.293 573.1949999999999 526.833 573.1949999999999zM526.833 208.19500000000005c-91.12 0-165 73.87-165 165s73.88 165 165 165c91.13 0 165-73.87 165-165S617.963 208.19500000000005 526.833 208.19500000000005z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="add-circle" unicode="&#58911;" d="M675.04 412.736l-127.04 0 0 127.264c0 20.064-16.288 36.32-36.32 36.32-20.064 0-36.32-16.192-36.32-36.32l0-127.232-127.072 0c-20.064 0-36.352-16.32-36.352-36.352 0-20.064 16.224-36.352 36.352-36.352l127.072 0 0-127.232c0-20 16.256-36.384 36.32-36.384 20.032 0 36.32 16.256 36.32 36.384l0 127.136 127.04 0c19.968 0 36.352 16.256 36.352 36.384C711.36 396.448 695.136 412.736 675.04 412.736L675.04 412.736zM511.328 830.56c-250.24 0-453.952-203.616-453.952-453.952 0-250.336 203.712-453.952 453.952-453.952 250.336 0 453.984 203.584 453.984 453.952C965.312 626.944 761.696 830.56 511.328 830.56L511.328 830.56zM511.328-20.576000000000022c-219.04 0-397.184 178.176-397.184 397.152 0 219.104 178.144 397.216 397.184 397.216s397.216-178.112 397.216-397.216C908.576 157.63199999999995 730.368-20.576000000000022 511.328-20.576000000000022L511.328-20.576000000000022zM511.328-20.576000000000022"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="layim-download" unicode="&#58910;" d="M186.888458 77.07363199999998l0 581.729108c14.85022-14.450107 35.050284-23.436782 57.359382-23.436782l560.03604 0 0-151.561881 25.029046 0 0 176.591951-585.065086 0c-31.191396 0-57.359382 26.166963-57.359382 57.359382 0 31.191396 26.165939 57.359382 57.359382 57.359382l572.551074 0L816.798914 800.143838 244.24784 800.143838c-45.431725 0-82.388429-36.957727-82.388429-82.388429l0-640.681778c0-41.796942 34.000372-75.789127 75.789127-75.789127l225.950102 0 0 25.029046L237.648538 26.31355099999996C209.661114 26.31355099999996 186.888458 49.078021000000035 186.888458 77.07363199999998zM236.947574 730.269421l560.38601 0 0-25.029046-560.38601 0 0 25.029046ZM686.086897 428.171012c-85.917812 0-164.908864-55.248302-194.553021-135.882783-30.013571-81.641415-4.269233-175.567621 62.624293-230.942813 67.00302-55.465243 164.474982-62.808488 238.931764-17.720593 74.094532 44.868907 113.272833 133.533272 96.080266 218.517829C869.882923 357.47283300000004 783.297916 428.171012 686.086897 428.171012zM686.086897 38.82858599999997c-75.595722 0-145.060817 48.634674-171.092703 119.595842-26.354228 71.839165-3.63069 154.438395 55.287187 203.074092 59.017138 48.718585 144.762011 55.029314 210.191186 15.237029 65.11195-39.59888 99.396801-117.681236 84.064604-192.408171C847.384513 100.72940100000005 771.387655 38.82858599999997 686.086897 38.82858599999997zM698.600909 152.23547199999996L698.600909 311.02496499999995 673.571862 311.02496499999995 673.571862 152.28459099999998 604.675726 221.17254100000002 586.978668 203.47548400000005 686.111456 104.35190499999999 785.185916 203.42738799999995 767.489882 221.123422Z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="layim-uploadfile" unicode="&#58909;" d="M914.7359263333336 663.0359498888887c-20.806884999999987 20.806885000000012-48.471967999999976 32.265868000000026-77.89816099999994 32.265868000000054l-352.221993 2.2737367544323206e-13-120.26099099999992 95.03035300000005-11.157106999999995 8.816806000000007-14.220886 9.769962616701378e-15L197.09333633333344 799.148976888889c-51.69538300000001 2.1316282072803006e-14-93.75224400000005-42.88778599999995-93.75224400000006-95.60442799999993l-1.5631940186722204e-13-255.13888799999998c-1.7763568394002505e-15-2.302439 0.08391099999999785-4.716417999999999 0.24968699999999489-7.196911999999999l-1.9895196601282805e-13-340.692403c-1.9539925233402755e-14-29.426192999999998 11.458982999999954-57.09127599999999 32.26586799999994-77.89816100000002 20.806884999999987-20.806885000000012 48.471967999999976-32.265868000000026 77.89816099999994-32.265868000000054l623.083981-3.410605131648481e-13c29.426192999999998-1.9539925233402755e-14 57.09127599999999 11.458982999999954 77.89816100000002 32.26586799999994 20.806885000000012 20.806884999999987 32.265868000000026 48.471967999999976 32.265868000000054 77.89816099999994L947.0028173333335 585.1377888888885C947.0017943333336 614.5639818888885 935.5428113333334 642.2280418888886 914.7359263333336 663.0359498888887zM197.09333633333372 758.2167298888891l141.88345099999998-8.526512829121202e-14L470.3948853333333 654.369569888889l366.44287999999995-2.2737367544323206e-13c38.236859-2.1316282072803006e-14 69.23178099999997-30.99492100000004 69.23178099999994-69.23178100000004L906.0695463333333 465.9195468888886 144.27334033333327 465.91954688888893 144.2733403333336 703.5445488888892C144.2733403333336 733.7361748888891 167.92296933333355 758.2167298888891 197.09333633333372 758.2167298888891zM836.8377653333331 31.28558888888881L213.75480733333322 31.28558888888915c-38.236859 2.1316282072803006e-14-69.23178099999997 30.99492100000004-69.23178099999994 69.23178100000004L144.52302633333338 424.4776928888892l761.546519-6.252776074688882e-13-2.2737367544323206e-13-323.96134599999993C906.0695463333333 62.28050988888867 875.0746243333334 31.285588888888583 836.8377653333331 31.28558888888881z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="404" unicode="&#58908;" d="M300.197309 299.705317l4.427931 1.803972c1.147982-2.787956 10.167841-7.543882 26.89558-14.267777l5.411915-12.955798c10.659833-24.927611 23.123639-62.483024 37.555413-112.66624 14.431775 5.575913 34.439462 0.983985 60.351057-13.611787l1.803972-4.427931L389.575913 107.828315l18.203716-42.639334c2.459962-5.575913-12.463805-15.579757-44.7713-29.847534-11.151826 7.215887-19.84369 9.675849-26.403587 7.05189l-0.983985 2.131967c-10.823831 25.419603-16.235746 42.311339-16.399744 50.675208l-4.427931-1.803972 6.3959-14.923767-11.151826-4.263933c-41.655349-16.235746-71.830878-18.695708-90.690583-7.871877l-4.427931-1.803972-1.803972 4.263933c-7.05189 16.727739 3.607944 77.406791 32.307495 182.037156 11.479821 4.427931 19.1877 14.923767 22.959641 31.323511C281.337604 290.685458 291.83344 296.425368 300.197309 299.705317L300.197309 299.705317zM216.230621 80.276746c28.371557 19.515695 40.999359 32.799488 38.047406 39.68738-0.983985 2.131967-0.65599 5.575913 0.65599 10.167841l-0.983985 2.131967c-25.5836-21.483664-38.047406-32.963485-37.391416-34.439462C215.246637 88.804612 215.082639 83.064702 216.230621 80.276746L216.230621 80.276746zM216.722614 72.896861l0.983985-2.131967c11.643818 1.147982 21.155669 3.279949 28.699552 6.231903 0.819987 0.327995 7.379885 5.411915 19.84369 15.251762l-0.983985 2.131967c-7.543882-2.951954-12.7918-0.983985-15.743754 6.067905C226.398463 85.032671 215.574632 75.848815 216.722614 72.896861L216.722614 72.896861zM225.90647 143.743754l11.151826 4.263933c-1.147982-2.623959-6.3959-8.691864-15.579757-18.53171-2.295964-10.823831-2.787956-17.547726-1.639974-20.335682 27.715567 20.663677 40.34337 33.783472 37.883408 39.523382l0.819987 10.331839-3.443946-3.935939-9.019859-3.443946-0.983985 2.131967c11.151826 4.263933 17.875721 16.891736 20.49968 37.719411l-0.983985 2.131967C239.35426 172.443306 227.21845 160.307495 227.874439 157.027546L225.90647 143.743754 225.90647 143.743754zM231.646381 173.42729l0.983985-2.131967 2.131967 0.819987c28.371557 23.123639 40.179372 40.179372 35.423447 51.331198 1.475977 0.65599 1.967969 1.639974 1.475977 2.951954l-2.295964-0.819987c-28.863549-21.647662-40.999359-38.047406-36.407431-49.035234C231.482383 175.723254 230.990391 174.73927 231.646381 173.42729L231.646381 173.42729zM240.994234 211.966688l0.983985-2.131967c13.775785 10.331839 35.915439 29.847534 66.418962 58.21909l2.131967 0.819987-6.3959 14.923767 0.491992 5.083921-2.295964-0.819987c-36.571429-32.963485-55.431134-51.82319-56.579116-56.743113L240.994234 211.966688 240.994234 211.966688zM311.67713 107.336323l-35.751441-13.939782c-1.475977-0.491992-6.887892-4.263933-16.235746-11.315823l0.819987-1.967969 12.299808 2.131967 20.007687 7.871877c11.643818 4.591928 32.143498 19.84369 61.171044 46.08328l-6.3959 14.923767-2.131967-0.819987c-24.107623-16.891736-34.439462-29.191544-31.159513-36.899423C315.449071 110.616272 314.629084 108.484305 311.67713 107.336323L311.67713 107.336323zM267.889814 264.773863l0.819987-1.967969c17.875721 16.891736 27.387572 25.419603 28.207559 25.747598l-0.983985 2.131967-8.855862-3.443946C274.941704 282.485586 268.545804 274.941704 267.889814 264.773863L267.889814 264.773863zM275.597694 222.954516c16.071749-37.883408 20.007687-67.894939 11.971813-90.034593l-3.443946-28.863549 26.89558 10.495836c-7.543882 30.011531-18.367713 65.598975-32.471493 106.926329l-0.983985 2.131967L275.597694 222.954516 275.597694 222.954516zM279.369635 231.810378l6.3959-14.923767c13.44779 15.087764 24.435618 24.271621 32.63549 27.55157l-3.607944 8.527867-2.459962 11.643818-2.131967-0.819987C289.045484 247.06214 278.713645 236.566304 279.369635 231.810378L279.369635 231.810378zM292.817425 194.58296c23.943626 17.219731 33.619475 30.995516 29.191544 41.491352l-2.787956 6.3959-2.295964-0.819987c-21.483664-18.859705-30.667521-31.651505-27.879564-38.3754L292.817425 194.58296 292.817425 194.58296zM294.457399 190.483024l2.787956-6.3959 2.295964-11.807816 2.295964 0.819987-0.491992-5.083921 6.3959-14.923767 32.471493 27.387572-6.3959 15.087764c-9.347854-10.331839-16.235746-16.399744-20.827675-18.203716l-2.295964-0.983985c-0.65599 1.639974 6.067905 10.167841 20.335682 25.419603l-3.115951 13.611787-0.983985 2.131967L294.457399 190.483024 294.457399 190.483024zM307.413197 148.171685l2.787956-6.3959 2.295964-11.643818c23.943626 17.219731 35.259449 27.387572 33.94747 30.503523l-5.411915 12.955798C329.224856 165.719411 318.07303 157.191544 307.413197 148.171685L307.413197 148.171685zM355.792441 131.935939c-23.779628-17.711723-34.111467-30.011531-30.995516-37.227418l1.475977-9.347854c25.255605 18.039718 36.899423 29.355541 34.931454 33.783472 24.435618 21.155669 38.703395 32.471493 42.803331 33.94747l-0.819987 1.967969c-1.803972 2.787956-6.723895 4.099936-14.595772 4.427931l-30.831518-31.9795L355.792441 131.935939 355.792441 131.935939zM327.912876 81.26073l4.591928-10.659833-0.491992-5.083921 2.295964 0.819987c23.451634 14.595772 34.275464 23.615631 32.63549 27.55157l-5.411915 12.955798L327.912876 81.26073 327.912876 81.26073zM333.816784 61.253043l5.411915-12.7918c25.747598 13.283792 37.719411 22.139654 35.915439 26.403587l-4.591928 10.659833C348.412556 70.272902 336.112748 62.237028 333.816784 61.253043L333.816784 61.253043zM357.596413 139.971813l1.803972-4.099936c4.919923 1.967969 8.527867 9.839846 10.823831 23.943626l-2.295964-0.819987C364.648302 147.679693 361.204356 141.44779 357.596413 139.971813L357.596413 139.971813zM731.674568 256.081999l3.935939-0.163997c-0.163997-2.459962 4.755926-9.019859 14.759769-19.515695l-0.65599-11.315823c-1.147982-21.975657-5.411915-53.955157-12.955798-95.774504 12.627803-0.65599 25.911595-10.659833 39.68738-30.175529l-0.163997-3.935939-47.887252-10.823831-1.967969-37.719411c-0.327995-4.919923-14.923767-7.379885-43.951313-7.379885-5.575913 9.019859-11.151826 13.775785-16.891736 13.939782l0.163997 1.967969c1.147982 22.467649 3.279949 36.735426 6.231903 42.967329l-3.935939 0.163997-0.65599-13.119795-9.839846 0.491992c-36.571429 1.803972-60.023062 9.839846-70.026906 24.271621l-3.935939 0.163997 0.163997 3.771941c0.819987 14.759769 30.667521 56.087124 89.706598 124.14606 10.167841-0.491992 19.515695 4.755926 28.371557 15.579757C714.290839 255.754004 724.294683 256.573991 731.674568 256.081999L731.674568 256.081999zM587.848815 115.86419l-0.163997-1.967969c9.019859-2.951954 16.891736-4.591928 23.615631-4.919923 0.65599 0 7.379885 1.475977 20.171685 4.755926l0.163997 1.967969c-6.723895 0.327995-9.839846 3.607944-9.511851 9.675849C599.328635 121.6041 588.012812 118.324151 587.848815 115.86419L587.848815 115.86419zM590.144779 121.440102c28.043562 5.083921 42.147341 10.659833 42.475336 16.727739 0.163997 1.803972 1.475977 4.263933 4.099936 7.215887l0.163997 1.967969c-26.731582-7.379885-40.015375-11.807816-40.179372-13.119795C592.440743 128.163997 590.308776 123.900064 590.144779 121.440102L590.144779 121.440102zM620.15631 165.227418l9.839846-0.491992c-1.803972-1.475977-7.871877-4.427931-18.367713-8.527867-5.575913-7.215887-8.527867-12.13581-8.527867-14.595772 28.043562 6.067905 42.147341 11.643818 42.311339 16.727739l4.263933 7.379885-3.935939-1.803972-8.035874 0.327995 0.163997 1.967969c9.839846-0.491992 19.351698 6.559898 28.863549 21.155669l0.163997 1.967969c-26.23959-7.379885-39.68738-12.463805-40.34337-14.923767L620.15631 165.227418 620.15631 165.227418zM670.667521 109.960282l-31.487508 1.475977c-1.31198 0-6.559898-0.983985-16.071749-2.951954l-0.163997-1.803972 9.839846-2.459962 17.711723-0.819987c10.331839-0.491992 30.995516 4.099936 61.991031 13.939782l0.65599 13.119795-1.803972 0.163997c-23.943626-4.591928-36.079436-10.167841-36.407431-16.891736C674.603459 110.944266 673.29148 109.796284 670.667521 109.960282L670.667521 109.960282zM635.244074 185.399103l-0.163997-1.967969 1.803972-0.163997c29.355541 7.70788 44.279308 16.563741 44.7713 26.23959 1.31198 0 2.131967 0.491992 2.131967 1.639974l-1.967969 0.163997c-29.191544-6.3959-44.115311-14.595772-44.607303-24.271621C635.900064 187.039078 635.244074 186.547085 635.244074 185.399103L635.244074 185.399103zM685.755285 207.37476c-1.803972-33.29148-9.675849-56.907111-23.615631-70.682896l-12.955798-20.171685 23.779628-1.147982c5.247918 24.763613 10.167841 54.611147 14.595772 89.870596l0.163997 1.967969L685.755285 207.37476 685.755285 207.37476zM656.071749 210.818706l-0.163997-1.967969c13.939782 3.115951 37.391416 10.167841 70.354901 21.155669l1.803972-0.163997 0.65599 13.119795 2.295964 3.607944-1.967969 0.163997c-39.03139-12.299808-59.859065-20.007687-62.483024-23.287636L656.071749 210.818706 656.071749 210.818706zM670.339526 68.46893l-0.65599-11.315823c23.943626 1.31198 35.915439 3.935939 36.079436 7.70788l0.491992 9.347854C684.443306 70.272902 672.471493 68.304933 670.339526 68.46893L670.339526 68.46893zM673.29148 85.196669l-0.491992-9.347854-2.295964-3.607944 1.967969-0.163997c22.631646 2.951954 33.94747 6.231903 34.111467 9.511851l0.65599 11.315823L673.29148 85.196669 673.29148 85.196669zM712.158873 113.568225c-23.943626-5.247918-36.079436-10.987828-36.407431-17.219731l-2.295964-7.379885c25.255605 5.083921 37.883408 9.511851 38.211403 13.44779 25.747598 7.543882 40.34337 11.151826 43.951313 10.987828l0.163997 1.803972c-0.327995 2.623959-3.443946 5.247918-9.347854 8.035874l-34.439462-13.44779L712.158873 113.568225 712.158873 113.568225zM682.147341 141.611787l-0.327995-5.73991-2.459962-9.347854c23.943626 4.755926 36.079436 8.691864 36.079436 11.479821l0.65599 11.315823C704.778988 147.351698 693.463165 144.727739 682.147341 141.611787L682.147341 141.611787zM688.051249 177.199231l-0.327995-5.73991-2.623959-9.511851 1.967969-0.163997-2.295964-3.607944-0.65599-13.119795 33.94747 9.511851 0.65599 13.283792c-10.659833-4.591928-18.039718-6.723895-21.975657-6.559898l-1.967969 0.163997c0 1.475977 8.199872 5.411915 24.271621 12.13581l2.623959 11.151826 0.163997 1.967969L688.051249 177.199231 688.051249 177.199231zM688.215247 180.807175c23.943626 4.755926 36.243434 11.807816 36.735426 20.991672l0.327995 5.73991-1.967969 0.163997c-22.631646-6.887892-34.275464-13.283792-34.603459-19.1877L688.215247 180.807175 688.215247 180.807175zM691.82319 212.786675l-0.65599-13.119795c15.415759 6.723895 26.89558 10.003844 34.111467 9.511851l0.327995 7.543882 2.459962 9.511851-1.803972 0.163997C704.450993 220.986547 692.971172 216.558616 691.82319 212.786675L691.82319 212.786675zM695.103139 240.994234l-0.163997-1.803972c19.351698 6.559898 29.355541 9.839846 30.339526 9.839846l0.163997 1.967969-7.871877 0.327995C706.746957 251.818065 699.367072 248.374119 695.103139 240.994234L695.103139 240.994234zM716.422806 118.980141l-0.163997-3.607944c4.427931-0.163997 10.003844 4.427931 16.727739 14.10378l-1.967969 0.163997C724.45868 122.26009 719.538757 118.816143 716.422806 118.980141L716.422806 118.980141zM479.118514 382.196028c53.627162 10.167841 89.870596 1.967969 109.222293-24.599616 9.675849-18.695708 15.579757-33.455477 17.875721-44.279308 11.807816-56.743113-5.903908-103.154388-53.299167-138.741832-12.463805-5.083921-22.631646-8.363869-30.339526-10.003844-31.651505-6.067905-63.631006 5.083921-95.938501 33.455477-9.347854 16.399744-15.251762 31.159513-18.039718 44.279308-13.283792 63.795003 1.967969 108.238309 45.919283 133.165919L479.118514 382.196028 479.118514 382.196028zM410.075593 265.429853c6.231903 5.247918 11.479821 8.199872 15.579757 9.019859-9.675849-9.347854-14.431775-15.087764-13.939782-17.219731-0.327995-5.411915-0.163997-10.167841 0.819987-14.267777l2.131967 0.327995c24.271621 15.743754 35.915439 25.5836 35.095452 29.519539l-2.131967 10.003844c-4.099936-3.607944-8.035874-5.73991-11.643818-6.559898l-0.819987 4.099936c10.823831 2.131967 15.251762 11.971813 13.44779 29.519539l-1.967969-0.327995c-22.467649-16.399744-34.603459-27.715567-36.407431-33.94747C409.255605 273.30173 409.255605 269.857783 410.075593 265.429853L410.075593 265.429853zM410.23959 286.257527c33.127482 21.647662 47.887252 40.34337 44.607303 56.251121-29.683536-23.615631-44.443306-36.079436-44.279308-37.555413C409.747598 295.769379 409.5836 289.537476 410.23959 286.257527L410.23959 286.257527zM412.699552 315.777066l0.491992-2.131967c27.059577 20.663677 44.607303 37.227418 52.643177 49.527226 10.331839 1.967969 17.055734 7.379885 20.49968 16.235746l-2.131967-0.491992C447.303011 372.028187 423.523382 350.872518 412.699552 315.777066L412.699552 315.777066zM414.339526 234.926329c2.459962-4.919923 4.263933-9.347854 5.083921-13.44779 18.859705 14.759769 30.339526 22.467649 34.111467 23.123639l-3.771941 18.039718C444.18706 261.493914 432.379244 252.310058 414.339526 234.926329L414.339526 234.926329zM421.883408 220.002562c2.131967-9.839846 5.247918-14.759769 9.675849-14.759769l27.879564 21.975657c-0.327995 1.147982-2.131967 6.231903-5.411915 15.415759C437.299167 228.530429 426.639334 220.986547 421.883408 220.002562L421.883408 220.002562zM432.707239 199.174888c5.083921-5.903908 8.527867-8.691864 10.495836-8.363869l3.935939 0.819987c10.987828 10.495836 19.1877 16.235746 24.599616 17.219731-0.819987 3.935939-3.935939 8.855862-9.511851 14.759769C442.21909 209.014734 432.379244 200.814862 432.707239 199.174888L432.707239 199.174888zM448.450993 185.563101l0.491992-2.131967c2.459962 0.491992 6.3959-0.819987 11.807816-3.771941 18.859705 10.003844 28.207559 16.727739 28.207559 19.84369-6.067905 1.639974-9.511851 4.427931-10.331839 8.363869C466.818706 202.946829 456.814862 195.566944 448.450993 185.563101L448.450993 185.563101zM469.442665 179.331198l0.491992-2.131967 14.923767 0.65599 12.627803 2.459962c2.459962 0.491992 8.199872 3.771941 17.547726 9.839846l-0.491992 2.131967c-6.887892-1.31198-13.611787 0.163997-20.49968 4.263933L469.442665 179.331198 469.442665 179.331198zM476.494555 249.030109l4.591928-21.811659c2.951954-14.431775 12.463805-25.091608 28.535554-31.9795l4.099936 0.819987c24.599616 34.275464 32.143498 73.798847 22.795644 118.570147l-2.459962 11.971813-6.231903 19.515695-6.067905-1.147982c-3.935939-0.819987-14.267777 0-30.831518 2.295964C473.870596 316.597053 469.278668 283.961563 476.494555 249.030109L476.494555 249.030109zM476.494555 363.172325l0.327995-1.967969c10.823831-2.131967 17.547726-3.115951 20.007687-2.623959 13.939782 10.167841 21.647662 17.875721 23.287636 23.287636l-21.319667-1.967969C496.174247 379.408072 488.630365 373.832159 476.494555 363.172325L476.494555 363.172325zM508.966047 363.172325l3.771941 2.787956c1.147982 0.163997 6.231903-2.951954 15.087764-9.675849 10.331839 13.119795 18.203716 20.171685 23.779628 21.155669-0.65599 2.951954-8.199872 4.263933-22.467649 4.099936C515.361947 370.716208 508.638053 364.648302 508.966047 363.172325L508.966047 363.172325zM511.590006 185.235106l0.491992-2.131967 4.099936 0.819987c19.84369 3.771941 35.751441 17.219731 47.723254 40.34337C554.557335 214.754644 537.173607 201.634849 511.590006 185.235106L511.590006 185.235106zM521.921845 197.534914c38.211403 24.271621 56.087124 42.311339 53.79116 53.79116 1.967969 4.919923 2.623959 8.527867 2.295964 10.823831-35.095452-26.567585-51.495195-44.935298-49.363229-54.939142C526.349776 206.71877 524.217809 203.602819 521.921845 197.534914L521.921845 197.534914zM528.64574 352.348495l7.543882-15.251762 2.131967 0.491992c4.263933 5.73991 13.283792 14.431775 27.059577 25.911595l-0.491992 2.131967c-5.411915 5.247918-8.363869 8.855862-8.855862 10.823831l-4.099936-0.819987L528.64574 352.348495 528.64574 352.348495zM536.845612 333.324792l4.263933-9.675849-0.491992-8.363869 4.099936 0.819987c19.515695 17.711723 29.027546 27.059577 28.863549 28.371557l-0.491992 2.131967c-1.967969 9.347854-4.263933 13.611787-7.05189 13.119795C548.817425 342.508648 539.141576 333.652787 536.845612 333.324792L536.845612 333.324792zM539.797566 236.402306c27.715567 19.84369 40.999359 32.63549 39.68738 38.703395 1.31198 7.215887 1.803972 12.13581 1.147982 14.759769l-1.967969-0.327995-35.095452-29.519539C540.78155 245.586163 539.469571 237.714286 539.797566 236.402306L539.797566 236.402306zM542.257527 307.413197l2.459962-11.971813 10.003844 3.935939c-7.05189-7.871877-10.331839-12.627803-10.003844-14.267777-0.65599-10.495836-0.819987-16.727739-0.327995-18.695708 18.695708 13.611787 30.831518 24.927611 36.243434 33.94747l-2.459962 11.971813c-7.05189-7.05189-12.7918-10.987828-16.727739-11.807816 8.035874 11.315823 13.939782 17.383728 17.711723 18.039718l-4.099936 19.84369C554.557335 320.532992 543.733504 310.201153 542.257527 307.413197L542.257527 307.413197zM307.249199 569.153107c-9.675849 0-17.711723-6.887892-19.84369-16.071749-4.263933-12.463805 1.639974-28.863549 29.519539-35.751441 1.31198 35.587444 0 49.527226 0 49.527226C313.809097 568.33312 310.693145 569.153107 307.249199 569.153107L307.249199 569.153107zM709.862908 537.173607c0-1.147982 0-2.131967-0.163997-3.115951 2.131967 3.279949 3.279949 7.215887 3.279949 11.479821 0 11.643818-9.183857 21.155669-20.49968 21.155669-3.443946 0-6.723895-0.819987-9.511851-2.459962C697.891095 563.905189 709.862908 551.933376 709.862908 537.173607L709.862908 537.173607zM531.761691 520.281871c0.65599 15.743754-32.963485 49.199231-32.963485 49.199231 0-18.203716 9.347854-42.803331 12.463805-48.707239-8.035874-11.643818-13.283792-32.307495-13.283792-32.307495S531.105701 504.374119 531.761691 520.281871L531.761691 520.281871zM488.794363 507.326073c2.459962 0 4.427931 1.967969 4.427931 4.427931 0 2.459962-1.967969 4.427931-4.427931 4.427931-2.459962 0-4.427931-1.967969-4.427931-4.427931C484.366432 509.294042 486.334401 507.326073 488.794363 507.326073L488.794363 507.326073zM445.335042 629.668161c-0.819987 8.855862-2.131967 16.235746-2.131967 16.235746s-53.627162 7.05189-63.959001-30.503523C395.151826 632.94811 427.623318 631.144138 445.335042 629.668161L445.335042 629.668161zM620.648302 614.908392c-9.675849 37.719411-63.303011 31.651505-63.303011 31.651505s-1.475977-7.379885-2.459962-16.235746C572.597053 631.636131 605.232543 632.784113 620.648302 614.908392L620.648302 614.908392zM419.587444 518.313901c29.847534 0 53.955157 21.975657 53.955157 49.035234 0 27.059577-24.271621 49.035234-53.955157 49.035234-29.847534 0-53.955157-21.975657-53.955157-49.035234C365.632287 540.289558 389.903908 518.313901 419.587444 518.313901L419.587444 518.313901zM419.587444 613.76041c28.371557 0 51.331198-20.827675 51.331198-46.411275 0-25.5836-22.959641-46.411275-51.331198-46.411275-28.207559 0-51.331198 20.827675-51.331198 46.411275C368.256246 592.932735 391.379885 613.76041 419.587444 613.76041L419.587444 613.76041zM419.587444 534.38565c20.007687 0 36.243434 14.759769 36.243434 32.799488 0 18.203716-16.235746 32.799488-36.243434 32.799488s-36.243434-14.759769-36.243434-32.799488C383.34401 549.14542 399.579757 534.38565 419.587444 534.38565L419.587444 534.38565zM435.331198 552.261371c1.967969 2.131967 4.919923 2.623959 6.559898 1.147982 1.639974-1.475977 1.475977-4.263933-0.491992-6.3959-1.967969-2.131967-4.919923-2.623959-6.559898-1.147982C433.035234 547.341448 433.199231 550.129404 435.331198 552.261371L435.331198 552.261371zM395.971813 585.880846c5.411915 5.73991 13.283792 7.05189 17.875721 3.115951 4.591928-3.935939 3.935939-11.807816-1.475977-17.547726-5.411915-5.73991-13.283792-7.05189-17.875721-3.115951C389.903908 572.433056 390.559898 580.304933 395.971813 585.880846L395.971813 585.880846zM584.240871 518.313901c29.847534 0 53.955157 21.975657 53.955157 49.035234 0 27.059577-24.271621 49.035234-53.955157 49.035234-29.847534 0-53.955157-21.975657-53.955157-49.035234C530.121717 540.289558 554.393338 518.313901 584.240871 518.313901L584.240871 518.313901zM584.240871 613.76041c28.371557 0 51.331198-20.827675 51.331198-46.411275 0-25.5836-22.959641-46.411275-51.331198-46.411275-28.207559 0-51.331198 20.827675-51.331198 46.411275C532.909673 592.932735 555.869315 613.76041 584.240871 613.76041L584.240871 613.76041zM584.240871 534.38565c20.007687 0 36.243434 14.759769 36.243434 32.799488 0 18.203716-16.235746 32.799488-36.243434 32.799488-20.007687 0-36.243434-14.759769-36.243434-32.799488C547.997438 549.14542 564.233184 534.38565 584.240871 534.38565L584.240871 534.38565zM599.820628 552.261371c1.967969 2.131967 4.919923 2.623959 6.559898 1.147982 1.639974-1.475977 1.475977-4.263933-0.491992-6.3959-1.967969-2.131967-4.919923-2.623959-6.559898-1.147982C597.688661 547.341448 597.852659 550.129404 599.820628 552.261371L599.820628 552.261371zM560.62524 585.880846c5.411915 5.73991 13.283792 7.05189 17.875721 3.115951 4.591928-3.935939 3.935939-11.807816-1.475977-17.547726-5.411915-5.73991-13.283792-7.05189-17.875721-3.115951C554.557335 572.433056 555.213325 580.304933 560.62524 585.880846L560.62524 585.880846zM957.171044 381.540038C957.171044 381.540038 957.171044 381.540038 957.171044 381.540038c-0.65599 0.983985-1.31198 1.803972-1.967969 2.951954-0.327995 0.327995-0.491992 0.65599-0.819987 0.983985-0.327995 0.327995-1.967969 0.65599-2.295964 0.983985-11.315823 14.759769-29.355541 40.34337-62.975016 46.247277l0 34.931454c0 4.263933-0.819987 8.691864-5.083921 8.691864L685.919283 476.330557c-0.163997 10.331839-0.327995 18.203716-0.65599 27.879564 24.435618 1.803972 43.295324 19.351698 43.295324 41.491352 0 22.467649-19.84369 40.671365-45.263293 41.819347-1.967969 78.226778-5.903908 143.98975-7.70788 150.549648l-0.491992 0.983985c-1.967969 2.295964-9.511851 5.247918-21.155669 8.363869 0.327995 13.939782-3.279949 29.355541-11.643818 46.08328 3.443946-21.647662-22.795644-36.079436-26.567585-38.047406-0.163997 0-0.327995 0-0.491992 0 0.163997 4.427931 0 57.727098-88.230621 97.90647-1.475977-44.115311-14.10378-70.682896-31.9795-86.754644L494.534273 766.606022l-5.411915-0.327995 0-0.163997 0 0 0 0 0.327995 0 0.327995-0.163997c-0.819987-0.163997-0.983985-0.491992-1.147982-1.147982-10.331839-8.035874-28.043562-18.203716-64.450993-18.203716-13.283792 0-28.207559 1.31198-44.607303 3.935939-4.099936 0.819987-7.70788 1.147982-11.151826 1.147982-5.575913 0-10.003844-0.983985-16.071749-2.295964l-0.327995 0-0.327995-0.163997c-17.547726-4.099936-27.55157-7.70788-30.011531-10.659833l-0.491992-0.983985c-0.491992-2.131967-2.295964-8.363869-5.73991-150.549648-25.255605-0.983985-45.263293-19.351698-45.263293-41.983344 0-22.139654 18.859705-39.523382 43.459321-41.163357-0.163997-9.675849-0.327995-17.547726-0.65599-27.879564L132.099936 476.002562c-4.427931 0-10.495836-4.591928-10.495836-8.691864l0-97.414478c-11.807816-0.65599-19.679693-2.295964-26.731582-4.755926-29.027546-10.495836-35.751441-35.915439-35.587444-60.023062 0-1.475977 0.491992-2.787956 0.983985-3.771941-6.723895-11.643818-6.231903-25.5836-5.083921-35.587444 0.983985-8.035874 2.623959-12.13581 4.427931-13.939782-4.263933-8.855862-0.983985-18.859705 1.967969-26.731582 3.771941-10.167841 12.13581-11.971813 22.139654-10.003844-4.755926-9.019859-2.459962-17.219731 11.643818-28.699552 4.427931-3.607944 14.267777 7.05189 26.075593 16.071749l0-267.151826c0-4.263933 6.067905-6.067905 10.331839-6.067905l751.928251 0c4.427931 0 5.083921 1.803972 5.083921 6.067905L888.784113 248.374119c16.727739 0.983985 29.355541 7.70788 38.539398 19.84369 4.591928 6.231903 7.871877 11.807816 8.691864 16.891736C977.670724 313.153107 982.262652 344.640615 957.171044 381.540038L957.171044 381.540038zM316.433056 508.638053c-22.959641 0.491992-40.835362 16.727739-40.835362 36.735426 0 20.335682 18.859705 36.899423 41.983344 36.899423l0 2.623959 0.163997-0.65599c0-0.819987 0-1.475977 0-2.295964 0.491992 0.163997 0.983985 0.163997 1.475977 0.327995l1.803972 0 0 0.491992c5.247918 1.31198 12.7918 2.951954 19.351698 3.771941 10.003844 35.095452 34.111467 64.122998 34.111467 64.122998s-9.839846 28.863549-13.939782 67.238949c51.167201-85.11467 229.268418-81.178732 280.107623-10.823831-4.591928-32.799488-12.627803-56.415119-12.627803-56.415119s24.107623-28.863549 34.111467-64.122998c6.559898-0.819987 13.939782-1.147982 19.023703-2.295964 0 0.491992 0 2.623959 0 2.623959l0.491992 0c23.123639 0 41.983344-18.695708 41.983344-39.03139 0-9.347854-3.935939-18.695708-10.495836-25.419603-10.167841-6.723895-25.091608-10.331839-40.835362-10.331839 0-6.723895 0.983985-19.351698 1.803972-35.423447L318.401025 476.658552c0.163997 10.331839 0.491992 19.84369 0.65599 30.175529l0 2.131967L316.433056 508.638053 316.433056 508.638053zM126.524023 462.554773c0 4.099936 6.3959 9.183857 10.823831 9.183857l741.432415 0c4.263933 0 5.575913-4.919923 5.575913-9.183857l0-29.027546c0 0.491992-6.723895 1.475977-10.823831 1.147982-22.795644-2.295964-44.443306-3.607944-60.679052-9.183857L176.215247 425.491352l-1.31198-2.787956 0-60.18706c-10.823831 5.903908-25.5836 8.363869-48.215247 7.871877L126.68802 462.554773 126.524023 462.554773zM821.381166-13.693786 180.807175-13.693786 180.807175 282.649584c10.823831 4.263933 15.579757 10.987828 15.087764 21.975657-0.491992 8.363869-4.263933 13.611787-15.087764 16.727739l0 7.379885c5.903908 1.967969 3.935939 4.263933 5.247918 6.723895 5.411915 10.495836 5.575913 18.203716-5.247918 23.779628l0 55.759129 615.318386 0c-2.787956-5.575913-4.755926-7.871877-5.575913-12.299808-1.475977-8.035874-1.639974-18.367713-1.147982-28.207559L697.891095 315.449071c0 0-28.371557-15.251762-16.727739-32.799488 11.643818-17.383728 32.307495-11.479821 50.511211-0.327995 12.13581 7.379885 39.68738 23.287636 63.959001 40.179372 0.163997-0.163997 0.327995-0.163997 0.491992-0.327995-1.803972-1.31198-2.951954-2.295964-2.951954-2.295964-11.151826-7.543882-6.887892-36.899423 15.415759-41.327354 3.115951-0.65599 9.675849 0 9.675849 1.147982l0-293.391416L821.381166-13.693786 821.381166-13.693786zM177.855221 271.169763c0 3.443946-2.131967 6.231903-4.755926 8.035874 1.639974 0.491992 3.771941 0.983985 4.755926 1.475977L177.855221 271.169763 177.855221 271.169763zM177.855221 322.828956c-0.983985 0.163997-1.639974 0.327995-2.459962 0.491992 0.819987 0.491992 1.475977 0.983985 2.459962 1.475977L177.855221 322.828956 177.855221 322.828956zM878.780269-65.516976 137.347854-65.516976c-4.263933 0-10.823831 2.131967-10.823831 6.3959L126.524023 206.882767c5.903908 1.147982 4.919923 2.295964 6.723895 3.279949 19.679693 8.035874 38.047406 25.255605 25.747598 33.127482-0.163997 0-1.475977 0.163997-1.639974 0.163997 9.511851 3.771941 17.547726 9.839846 17.547726 20.663677l0-289.29148 655.169763 2.459962 0 291.915439c9.839846-9.675849 21.647662-14.595772 34.603459-10.331839 3.279949-6.559898 13.611787-9.839846 19.515695-10.331839l0-307.495195C884.192184-63.38501 883.044202-65.516976 878.780269-65.516976L878.780269-65.516976zM878.780269-65.516976"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="about" unicode="&#58891;" d="M514.27174 834.607768c-249.516844 0-451.789687-202.272843-451.789687-451.789687s202.272843-451.789687 451.789687-451.789687 451.789687 202.272843 451.789687 451.789687S763.788583 834.607768 514.27174 834.607768zM514.27174-20.12919999999997c-222.541469 0-402.947282 180.405813-402.947282 402.947282s180.405813 402.947282 402.947282 402.947282 402.947282-180.405813 402.947282-402.947282S736.814232-20.12919999999997 514.27174-20.12919999999997zM514.295276 593.979362c-9.44614-10.360975-14.307867-22.951735-14.307867-37.483706 0-11.960403 3.886517-22.396079 11.534707-30.457686 7.783267-8.211009 17.853623-12.450567 29.313629-12.450567 9.312086 0 23.139 2.849908 35.782971 16.900925 9.865695 10.641361 14.866592 23.437805 14.866592 37.693484 0 11.68104-4.031826 21.900799-11.744485 29.832446C562.925856 615.325529 532.358677 613.449809 514.295276 593.979362zM549.461193 293.282882c-12.110829-11.541871-20.589944-18.759249-26.236548-23.316032 2.77009 14.953573 9.976212 44.614104 27.330462 103.023398 17.297968 57.890478 18.799158 67.991534 18.799158 72.955592 0 8.65717-3.63683 16.335037-9.921977 21.642926-14.124695 11.661597-39.035038 9.349949-69.131497-7.677866-16.779152-9.408277-34.595936-24.759917-54.493102-46.576805l-10.377348-11.541871 34.425044-26.548656 8.818853 8.715499c9.573029 9.292644 16.086373 15.35164 20.411889 19.393699-26.294876-86.460164-39.093367-140.190903-39.093367-164.262134 0-10.907421 3.172249-19.970844 9.573029-26.839275 6.460132-7.039323 15.510252-10.736529 25.891693-10.736529 10.146081 0 21.792329 3.926426 35.922141 11.949146 12.741185 7.212262 31.883151 23.029506 58.641585 48.190559l10.837836 10.391674-31.30703 30.475082L549.461193 293.282882z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="layim-theme" unicode="&#58907;" d="M958.830745 538.643056L740.659817 692.753993l-100.539834 0-3.977591-9.332553c-0.37146-0.871857-38.021965-86.8613-124.772748-88.667435-35.691897 0.76441-67.206658 15.500019-93.680613 43.828204-20.658506 22.106484-30.374798 44.584428-30.456662 44.776809l-3.955078 9.393951-100.587929 0L64.518433 538.643056 169.320337 379.756349l89.956801 65.019853-19.016099-368.05254 268.86654 0 4.093225 0 269.866311 0-19.016099 368.051517 89.956801-65.018829L958.830745 538.643056zM730.105437 507.20402l20.655436-399.781172-237.540068 0-4.093225 0L272.587282 107.42284700000005l20.656459 399.781172-115.938546-83.797521-36.3243 55.070246 159.440315 111.641683-19.276019 30.638811L121.066333 508.667348l-14.548344 22.056342 185.921433 131.330094 71.077825 0c5.332449-10.04375 15.433504-26.779923 30.951943-43.580564 32.047904-34.69622 72.256674-53.486168 116.345822-54.411237l0-0.031722c0.203638 0.00307 0.406253 0.01228 0.60989 0.016373 0.203638-0.00307 0.406253-0.013303 0.60989-0.016373l0 0.031722c44.073798 0.925069 84.359316 19.703761 116.566856 54.379515 15.623839 16.821107 25.814945 33.579793 31.188326 43.612287l71.120804 0 185.921433-131.330094-14.548344-22.056342L742.203986 620.7551920000001l-19.276019-30.638811 159.440315-111.641683-36.3243-55.070246L730.105437 507.20402z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="down" unicode="&#58906;" d="M842.73769531 591.36914063c13.72412109 13.72587891 35.97363281 13.72587891 49.69775391-1e-8v0c13.72587891-13.72412109 13.72587891-35.97363281 0-49.6977539l-356.60126953-356.60214844c-13.72412109-13.72587891-35.971875-13.72587891-49.69775391 0v0c-13.72412109 13.72412109-13.72412109 35.97363281 0 49.69775391l356.60126953 356.60214844zM535.39560547 234.76699219c13.72587891-13.72412109 13.72587891-35.97363281 0-49.69775391v0c-13.72412109-13.72587891-35.971875-13.72587891-49.69775391 0l-356.60214844 356.60214844c-13.72412109 13.72412109-13.72412109 35.97363281 1e-8 49.69775391v0c13.72587891 13.72587891 35.97363281 13.72587891 49.69951171 0l356.60039063-356.60214844zM535.39560547 234.76699219z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="up" unicode="&#58905;" d="M513.40625 520.40625l337.5-337.5c11.25-11.25 28.125-11.25 39.375 0 11.25087891 11.25 11.25087891 28.125 0 39.375l-354.375 354.375C530.28125 582.28125 519.03125 587.90625 513.40625 587.90625c-5.625 0-16.875 0-22.49912109-5.625L130.90537109 222.28125c-11.25-11.25-11.25-28.125 0-39.375s28.125-11.25 39.375 0L513.40625 520.40625z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="circle-dot" unicode="&#58903;" d="M513.133312 830.6731560000001c-247.538793 0-448.208115-200.669322-448.208115-448.207092 0-247.538793 200.670346-448.208115 448.208115-448.208115 247.538793 0 448.208115 200.670346 448.208115 448.208115C961.341427 630.004857 760.673128 830.6731560000001 513.133312 830.6731560000001zM513.132288-6.649187999999981c-214.901465 0-389.113205 174.212764-389.113205 389.114229 0 214.902488 174.21174 389.115252 389.113205 389.115252 214.903511 0 389.115252-174.212764 389.115252-389.115252C902.24754 167.563576 728.0358-6.649187999999981 513.132288-6.649187999999981zM513.133312 382.46504100000004m-344.602456 0a336.754 336.754 0 1 1 689.204911 0 336.754 336.754 0 1 1-689.204911 0Z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="set-fill" unicode="&#58900;" d="M916.9398 445.2101l-69.9664 10.7833c-18.6619 2.863-38.1388 17.826-43.3424 33.2487-5.1618 15.3809-15.0883 65.4524-3.9288 80.6661l41.9004 57.135c11.1595 15.2346 9.3832 38.5985-3.9706 51.9314l-30.6364 30.6573c-13.3538 13.3538-36.7177 15.151-51.9314 3.9497l-57.135-41.8795c-15.2346-11.1804-39.4344-14.3987-53.7704-7.168-14.3569 7.2307-57.3022 35.7773-60.1652 54.4183l-10.7833 69.9664C570.3471 807.6016 552.542 822.8571 533.6712 822.8571h-43.34236734693877c-18.8709 0-36.6759-15.2555-39.5389-33.9174l-10.7833-69.9664c-2.863-18.6619-17.826-38.1388-33.2487-43.3424-15.4018-5.1827-65.4524-15.1092-80.687-3.9288L268.9567 713.5817c-15.2346 11.1804-38.6194 9.3832-51.9523-3.9497l-30.6364-30.6573c-13.3747-13.3538-15.151-36.7177-3.9706-51.9314l41.9004-57.135c11.1595-15.2346 14.3778-39.4136 7.168-53.7704-7.2307-14.3569-35.7773-57.2813-54.4183-60.1443l-69.9664-10.7833C88.3984 442.3471 73.1429 424.542 73.1429 405.6712v-43.34236734693877c0-18.8709 15.2555-36.6759 33.9174-39.5389l69.9664-10.7833c18.6619-2.863 38.1388-17.8469 43.3424-33.2487 5.1618-15.4018 15.0883-65.4733 3.9288-80.687l-41.9004-57.135c-11.1595-15.2346-9.3832-38.6194 3.9706-51.9314l30.6364-30.6573c13.3538-13.3538 36.7177-15.151 51.9523-3.9706l57.135 41.9213c15.2346 11.1386 39.4136 14.3778 53.7704 7.168 14.3569-7.2307 57.2813-35.7773 60.1443-54.4183l10.7833-69.9664c2.863-18.6619 20.6472-33.9174 39.5389-33.9174h43.34236734693877c18.8709 0 36.6759 15.2555 39.5389 33.9174l10.7833 69.9664c2.863 18.6619 17.826 38.1388 33.2487 43.3215 15.4018 5.1827 65.4524 15.0883 80.6661 3.9288l57.1559-41.9213c15.2346-11.1595 38.5985-9.3623 51.9314 3.9706l30.6364 30.6573c13.3747 13.3329 15.151 36.7177 3.9706 51.9314l-41.9004 57.135c-11.1595 15.2346-14.3778 39.4136-7.168 53.7496 7.2307 14.3778 35.7773 57.3231 54.4183 60.1861l69.9664 10.7833c18.6619 2.863 33.9174 20.6472 33.9174 39.5389v43.34236734693877C950.8571 424.542 935.6016 442.3471 916.9398 445.2101zM512 210.4633c-95.838 0-173.5367 77.6986-173.5367 173.5367s77.6986 173.5367 173.5367 173.5367 173.5367-77.6986 173.5367-173.5367S607.838 210.4633 512 210.4633zM512 384m-104.7824 0a5.014 5.014 0 1 1 209.5647 0 5.014 5.014 0 1 1-209.5647 0Z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="search" unicode="&#58901;" d="M439.323351 120.52219c-49.280352 0-97.09834 9.656941-142.126681 28.699646-43.480015 18.388812-82.522793 44.706201-116.043584 78.225619s-59.841305 72.560596-78.230871 116.03883C83.878729 388.513804 74.222416 436.330856 74.222416 485.609189c0 49.284473 9.656313 97.104595 28.699798 142.133138 18.388542 43.479257 44.71008 82.520435 78.231894 116.03883 33.518745 33.515325 72.562546 59.832713 116.043584 78.219479 45.027318 19.039635 92.846329 28.694529 142.125658 28.694529 49.280352 0 97.099364-9.653871 142.126681-28.694529 43.481039-18.385742 82.525863-44.704155 116.044608-78.220502 33.520791-33.518395 59.842328-72.559573 78.230871-116.03883 19.042462-45.028543 28.699798-92.848665 28.699798-142.133138 0-49.278333-9.657336-97.095385-28.701845-142.122905-18.388542-43.47721-44.708033-82.520435-78.228824-116.03883s-72.563569-59.838853-116.043584-78.226642C536.422715 130.177084 488.603703 120.52219 439.323351 120.52219zM439.323351 797.483242c-171.975699 0-311.887855-139.906423-311.887855-311.875077S267.347652 173.734112 439.323351 173.734112s311.887855 139.907447 311.887855 311.874053S611.299051 797.483242 439.323351 797.483242zM890.678206-48.734702c-22.121716 0-42.90387 8.562003-58.541653 24.115234L674.672953 128.025071l37.039062 38.20616 157.888289-153.058978c5.606924-5.606695 13.091693-8.692986 21.077901-8.692986 7.983139 0 15.464837 3.087315 21.070738 8.69094 5.616135 5.622044 8.715856 13.126972 8.715856 21.123087 0 7.980765-3.091535 15.46318-8.702552 21.067828l-0.301888 0.306992L758.714395 213.230662l38.207726 37.035498 152.611906-157.427472c15.571265-15.638165 24.144876-36.422538 24.144876-58.549487 0-22.195511-8.625801-43.054585-24.287121-58.735729C933.723298-40.112324 912.876674-48.734702 890.678206-48.734702zM281.015489 327.245392c-42.340005 42.320874-65.652899 98.584296-65.643689 158.421102 0.008187 59.818387 23.319034 116.074645 65.637549 158.4078l37.634651-37.619806c-66.60666-66.629513-66.60973-175.00071-0.007163-241.577011L281.015489 327.245392z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="friends" unicode="&#58898;" d="M672.02974 765.933689c7.66047-32.266891 8.420787-62.237483 7.713682-95.365998-0.283456-12.778024-7.291057-71.832002-5.3918-89.926102 1.561565-14.936177 5.132904-16.128329 10.759041-28.436656 9.803273-21.422915 6.51846-50.970882 2.76088-72.566736-2.056845-11.816117-6.404873-28.64541-13.017478-38.287001-7.291057-10.645454-21.864984-10.711969-28.319999-23.12365-9.29469-17.848507-4.045129-42.930765-9.903557-62.21497-6.65763-21.883403-23.599488-23.420409-24.877597-52.040237 8.316409-1.243317 16.59598-2.479471 24.877597-3.722788 8.316409-18.498306 23.533996-55.70265 39.08518-66.900689 13.024641-3.728928 26.048259-7.448646 39.07904-11.156084 45.641503-19.593244 96.365768-43.032072 142.108578-63.215764 41.656749-18.381649 91.51325-24.937972 106.575294-70.629617 0-31.026644 2.795673-104.309694 2.025123-144.978952L58.155515-56.631556000000046c-0.757247 40.669258 2.029216 113.952308 2.029216 144.978952 15.065114 45.691645 64.928778 52.247968 106.578364 70.629617 45.74281 20.182668 96.467075 43.62252 142.098345 63.215764 13.027711 3.707438 26.054399 7.427156 39.08211 11.156084 15.554254 11.197016 30.78105 48.402383 39.09439 66.900689l18.492166 4.710278c-4.196579 24.429389-18.658965 26.322505-24.682146 43.62559-2.356674 26.013467-4.729721 52.052516-7.095605 78.079286 0.107447-1.234107-17.006326 3.246951-19.252483 4.716418-24.130583 15.838733-24.618701 80.075757-26.941606 106.793258-1.063215 12.222369 15.163351 22.240537 10.654664 44.62536-26.433022 131.125433 11.437493 219.776496 71.330582 240.123916 41.564651 17.633612 119.167077 50.323129 191.563944 3.716648l17.971303-17.428951 29.061896-5.237281C662.71663 795.172617 672.02974 765.933689 672.02974 765.933689z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="group" unicode="&#58899;" d="M1328.72893437-13.274022189999982L1325.7954575 10.932401249999998 1319.19311938 40.27361905999999 1309.65730438 68.14729219000003 1296.45423969 96.75473719000001 1283.25117594 118.75984405999998 1264.91331781 140.03117906 1244.37414312 156.90310406000003 1215.76669813 173.03964562 1195.22913594 182.57546062999995 1168.08923563 189.17779874999997 1140.94772187 195.77852437 1117.47507031 204.58056750000003 1088.13546594 218.51740312000004 1064.66281438 229.52076375000001 1036.05536844 242.72382749999997 1014.0502625 255.19473187999995 1014.0502625 332.94718406000004 1023.58446406 343.95054469 1032.38811969 358.61954062999996 1038.98884531 373.29014906 1044.12363969 391.62800719 1049.992205 413.63472656 1052.19191 430.50504 1055.370515 429.77126719 1061.727725 430.75016813 1066.61900281 434.662545 1071.99731188 443.46458812 1075.42104594 453.7325625 1077.37723437 466.4469825 1079.82206656 489.43099031 1080.799355 508.991265 1079.82206656 525.61806187 1076.39833344 535.88764969 1069.55247969 539.80002656 1065.64010188 538.82112656 1069.06383594 560.82623344 1071.99731188 587.2339743800001 1072.97621281 611.19526969 1072.48595656 630.26689969 1069.55247969 647.870985 1064.17255719 664.98642656 1056.83805969 680.63432344 1046.56847188 698.24002125 1034.83295281 712.91063063 1021.13963187 724.15750594 1003.53554656 735.40438125 981.53043969 745.67396812 962.94745344 750.56363437 940.45370281 754.47601125 918.4469825 754.964655 895.95323188 751.05227812 874.43676969 743.71777969 855.36513875 735.893025 838.73834188 725.1347934400001 823.33396063 711.44308594 808.66335125 695.30493188 795.4602875 676.23330187 785.9244725 655.69573969 780.05751875 632.22308813 779.32374687 602.14809844 782.25722375 574.27442531 785.9244725 538.3324818799999 777.85620219 538.3324818799999 772.72140875 531.73014375 771.25547656 519.99462469 772.72140875 492.12095156 776.3886575 459.84625688 779.32374687 443.70810375 784.45854031 434.90606063 793.99435531 429.77126719 799.86130906 430.50504 803.53017031 404.83268344 807.19742 389.42830219 813.06598531 372.55637719000003 821.13425656 355.68606375 830.67007156 342.48299999999995 838.00456906 332.94718406000004 837.27079719 253.72718719 845.06329813 250.99690875 855.81346625 248.0392425 867.37158969 243.73981969 878.39107625 239.43878530999996 888.6058325 235.67638781000005 897.74331406 231.10603405999996 908.76441312 226.53729375 920.85956187 219.54952313 932.95471062 212.56014000000005 942.898535 205.30305094000005 955.80002656 195.62693156 966.82112656 185.41378874999998 977.30358781 172.51229719000003 988.32307531 158.26743750000003 1000.01505219 141.87125344000003 1010.0943425 122.51901655999995 1018.69641219 101.55409219 1026.22120719 82.20185436999998 1031.46243781 64.05913219000001 1035.09098281 45.110066250000045 1038.71952688 23.741970000000038 1041.13855625-1.2546703100000514 1041.54172812-18.187877810000032 1040.73538531-33.30681374999995 1037.30842625-44.99879062000002 1030.79156-57.83254968999995 1023.19742-66.36688593999997 1009.28799875-73.42238906 1298.65555719-73.42238906 1311.85862094-66.82005093999999 1322.12820875-56.552076560000046 1328.72893437-45.54871687000002 1330.19647906-31.611880309999947ZM443.23504906 789.36487031L427.10818437 771.62531906 412.59400625 750.66039469 402.11154406 728.08278469 395.66079781 702.27980156 394.854455 669.21972844 398.07982813 638.57868562 402.11154406 599.06786719 393.24176844 599.06786719 387.59736594 591.81077812 385.98467938 578.90928656 387.59736594 548.26824375 391.62908187 512.7891412500001 394.854455 495.04959 400.4988575 485.37347156 410.98131969 479.72906906 417.43206594 480.53541188 421.46378187 452.31339844 425.49549781 435.38019094 431.94624406 416.83429687 440.81601969 398.28840187 451.29848094 383.77422375000003 459.36191375 373.29176156000005 458.55557094 286.20669281000005 444.84773562 277.33691719 412.59400625 262.01639531 379.53393406 247.50221719 352.92460719 234.60072562000005 331.95968281 225.73095 308.57572906 218.47386094 284.3854325 213.63580125 261.00147875 207.99139875000003 236.81118125 197.50893656000005 214.23357031 186.22013156000003 194.07498969 171.70595344000003 171.49737969 149.12834250000003 155.370515 125.74438874999998 143.27536625 103.16677875000005 133.59924781 78.97648125 123.92312844 51.56081156000005 119.08506875 29.789544370000044 115.05335281 11.243650310000021 112.63432344-10.527616869999974 112.63432344-29.879854690000002 115.85969656-49.23209250000002 125.535815-62.133584059999976 140.04999313-71.80970344000002 158.59588719-73.42238906 965.74546437-73.42238906 980.2596425-66.1653 991.5484475-54.87649499999998 998.80553656-42.781346249999956 1000.41822312-27.46082531000002 998.80553656-7.302244689999952 995.58016438 19.30708218999996 988.32307531 51.56081156000005 977.84061313 82.20185436999998 963.326435 113.64924094000003 948.81225688 137.8395375 928.65367531 161.22349125000005 906.07606531 179.76938625000003 874.62867875 197.50893656000005 852.05106875 207.99139875000003 822.21636875 215.24848781000003 792.38166875 222.50557688000004 766.57868562 232.18169624999996 734.32495625 247.50221719 708.52197312 259.59736594000003 677.07458656 274.11154406 652.88429 287.81937937 652.88429 373.29176156000005 663.36675219 385.38691031 673.04287063 401.513775 680.29995969 417.64063969 685.94436219 437.79922031 692.39510844 461.98951781 694.81413781 480.53541188 698.30882938 479.72906906 705.2966 480.80473031 710.67168406 485.10415312 716.585405 494.78027156 720.3478025 506.06907656 722.49912688 520.04623031 725.18586219 545.31218906 726.26152437 566.8141378099999 725.18586219 585.09071344 721.42346469 596.3795184400001 713.89705719 600.68055375 709.59763438 599.6048915599999 713.36003188 623.79518906 716.585405 652.82354531 717.66106719 679.16516625 717.12242937 700.13008969 713.89705719 719.4823275 707.98494781 738.2959275000001 699.92151594 755.49845437 688.63271094 774.85069219 675.73121937 790.97755688 660.67840344 803.34202406 641.32616563 815.70487875 617.13586906 826.99368375 596.7095825 832.37038031 571.98064812 836.66980219 547.79035063 837.20844 523.06302875 832.90740469 499.40975656 824.84397281 478.44483313 816.24351562 460.16825656 804.4160728100001Z"  horiz-adv-x="1449" />
+      
+      <glyph glyph-name="reply-fill" unicode="&#58897;" d="M507.904 835.5840000000001q93.184 1.024 175.104-33.792t143.872-94.72 97.792-141.312 36.864-174.592q1.024-88.064-30.208-165.888t-87.04-137.728-131.072-98.816-162.304-48.128q-22.528-3.072-48.128-5.12t-56.832-3.072-69.632 0-86.528 6.144q-106.496 10.24-158.208 26.624t-41.472 18.432q54.272 9.216 93.184 29.696 20.48 11.264 16.896 32.256t-19.968 39.424q-52.224 57.344-84.48 133.632t-34.304 164.352q-1.024 93.184 33.792 175.104t95.232 143.36 142.336 97.28 175.104 36.864zM707.584 385.024q0-26.624 18.432-45.568t45.056-18.944 45.568 18.944 18.944 45.568-18.944 45.056-45.568 18.432-45.056-18.432-18.432-45.056zM450.56 385.024q0-26.624 19.456-46.08t46.08-19.456q27.648 0 46.592 19.456t18.944 46.08q0 27.648-18.944 46.592t-46.592 18.944q-26.624 0-46.08-18.944t-19.456-46.592zM196.608 386.048q0-26.624 18.944-46.08t45.568-19.456q27.648 0 46.592 19.456t18.944 46.08-18.944 45.568-46.592 18.944q-26.624 0-45.568-18.944t-18.944-45.568z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="menu-fill" unicode="&#58895;" d="M511.999488 834.254727c-248.678712 0-450.273176-201.585181-450.273176-450.254727s201.594464-450.254727 450.273176-450.254727 450.273176 201.585181 450.273176 450.254727S760.6782 834.254727 511.999488 834.254727zM266.371377 589.705012l491.256222 0 0-33.772174L266.371377 555.932838 266.371377 589.705012zM757.627599 178.29396499999996L266.371377 178.29396499999996l0 33.773198 491.256222 0L757.627599 178.29396499999996zM140.487278 367.11340099999995l0 33.771151 743.024421 0 0-33.771151L140.487278 367.11340099999995z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="face-smile-fine" unicode="&#58892;" d="M511.558443 852.9315573333333c-246.787686 0-447.597201-200.783932-447.597201-447.598224 0-246.815315 200.783932-447.598224 447.597201-447.598224 246.841921 0 447.64939 200.782909 447.64939 447.598224C959.207833 652.1476253333334 758.400365 852.9315573333333 511.558443 852.9315573333333zM511.558443-4.962310666666667c-226.247884 0-410.295644 184.046736-410.295644 410.295644 0 226.249931 184.072319 410.296667 410.295644 410.296667 226.27449 0 410.346809-184.046736 410.346809-410.296667C921.905252 179.08442633333334 737.832933-4.962310666666667 511.558443-4.962310666666667zM724.38055 303.5726953333334c-9.698896 3.457752-20.366863-1.566682-23.848151-11.264555-28.500101-79.45461-104.372116-132.844587-188.82353-132.844587-84.798315 0-160.770614 53.689806-189.070146 133.590578-3.432169 9.723455-14.075577 14.772448-23.823592 11.364839-9.699919-3.432169-14.797008-14.100136-11.364839-23.823592 33.547047-94.77248 123.668601-158.434405 224.234017-158.434405 100.142791 0 190.140525 63.314001 223.935212 157.564595C739.125369 289.3978573333334 734.102982 300.0903843333334 724.38055 303.5726953333334zM302.49494 515.3479593333334c0-24.653493 19.98517-44.638663 44.638663-44.638663 24.653493 0 44.638663 19.98517 44.638663 44.638663s-19.98517 44.63764-44.638663 44.63764C322.48011 559.9855993333333 302.49494 540.0014523333333 302.49494 515.3479593333334L302.49494 515.3479593333334zM631.398856 515.3479593333334c0-24.653493 19.98517-44.638663 44.63764-44.638663 24.653493 0 44.63764 19.98517 44.63764 44.638663s-19.984147 44.63764-44.63764 44.63764C651.384026 559.9855993333333 631.398856 540.0014523333333 631.398856 515.3479593333334L631.398856 515.3479593333334z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="picture-fine" unicode="&#58893;" d="M958.648085 84.30682933333333L65.772494 84.30682933333333 65.772494 721.9115253333333l892.87559 0L958.648085 84.30682933333333zM97.660762 116.20328333333339l829.099055 0L926.759817 690.0570263333334 97.660762 690.0570263333334 97.660762 116.20328333333339zM648.731616 419.05893933333334l-1.991354 0c-47.801702 0-86.696548 38.900985-86.696548 86.695524l0 1.978051c0 47.809889 38.894845 86.671988 86.696548 86.671988l1.991354 0c47.801702 0 86.698594-38.862099 86.698594-86.671988l0-1.978051C735.43021 457.95992433333333 696.533318 419.05893933333334 648.731616 419.05893933333334zM646.740262 562.5193053333333c-30.224372 0-54.810327-24.582885-54.810327-54.787814l0-1.978051c0-30.230512 24.584931-54.803163 54.810327-54.803163l1.991354 0c30.222325 0 54.810327 24.572652 54.810327 54.803163l0 1.978051c0 30.203906-24.586978 54.787814-54.810327 54.787814L646.740262 562.5193053333333zM91.097276 181.7900473333334l-22.748097 22.338774 274.373974 279.332916 22.750143-22.351054L91.097276 181.7900473333334zM604.886015 215.92242633333342L339.999113 480.74793033333333l22.548552 22.525016L627.433544 238.4638153333334 604.886015 215.92242633333342zM619.007641 202.70744933333333l-22.763446 22.337751 167.989015 171.035398 22.765493-22.350031L619.007641 202.70744933333333zM925.622924 222.7939273333334L758.534418 389.8343373333333l22.548552 22.529109 167.086459-167.044504L925.622924 222.7939273333334z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="log" unicode="&#58894;" d="M828.01742 700.357158C743.476979 784.899646 631.076002 831.458031 511.516999 831.458031c-119.55798 0-231.959979-46.558385-316.500421-131.09985C110.47716 615.81774 63.918775 503.41574 63.918775 383.85776c0-87.103824 25.045419-171.548074 72.429613-244.204861 9.393951-14.402011 28.685319-18.46249 43.087331-9.071609 14.404058 9.393951 18.46556 28.685319 9.072633 43.089377-40.768519 62.511729-62.317301 135.194098-62.317301 210.187093 0 212.469066 172.85586 385.326972 385.325949 385.326972s385.325949-172.857906 385.325949-385.326972-172.85586-385.326972-385.325949-385.326972c-70.357418 0-139.188062 19.131733-199.052498 55.323003-14.71412 8.900717-33.856086 4.180206-42.753733-10.534937-8.896624-14.71719-4.180206-33.856086 10.534937-42.753733 69.584821-42.070164 149.556201-64.307631 231.271294-64.307631 119.559003 0 231.959979 46.558385 316.500421 131.09985 84.539418 84.539418 131.097804 196.941418 131.097804 316.499397S912.556838 615.81774 828.01742 700.357158zM494.28964 690.216193c-21.782096 0-39.397289-17.658172-39.397289-39.439244l0-283.524378c0-1.360997 0.358157-2.706645 0.493234-4.03285 2.020006-19.886933 18.959817-34.573423 39.379892-34.573423l0 0 0.146333 0.832971 223.590358 0c21.782096 0 39.438221 17.616216 39.438221 39.397289s-17.658172 39.397289-39.439244 39.397289L533.686928 408.273846l0 242.503103C533.686928 672.5580219999999 516.071735 690.216193 494.28964 690.216193z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="list" unicode="&#58890;" d="M618.04471 733.97072l-397.175835 0c-16.927531 0-30.699186-13.771655-30.699186-30.699186l0-638.543068c0-16.927531 13.771655-30.699186 30.699186-30.699186l582.261227 0c16.927531 0 30.699186 13.771655 30.699186 30.699186l-0.726547 476.760404L618.04471 733.97072zM803.771715 541.488871 619.537713 541.488871 619.537713 705.552483 803.771715 541.488871zM813.363164 64.728466c0-5.64251-4.590552-10.233062-10.233062-10.233062l-582.261227 0c-5.64251 0-10.233062 4.590552-10.233062 10.233062l0 638.543068c0 5.64251 4.590552 10.233062 10.233062 10.233062l378.202715 0 0-192.481849 214.291574 0L813.363164 64.728466zM298.129516 482.495268l55.258535 0 0-55.258535-55.258535 0 0 55.258535ZM399.777591 468.168981l323.364759 0 0-26.605961-323.364759 0 0 26.605961ZM298.129516 342.044446l55.258535 0 0-55.258535-55.258535 0 0 55.258535ZM399.777591 327.718159l323.364759 0 0-26.605961-323.364759 0 0 26.605961ZM298.129516 199.804884l55.258535 0 0-55.258535-55.258535 0 0 55.258535ZM399.777591 185.478598l323.364759 0 0-26.605961-323.364759 0 0 26.605961ZM881.315812 53.053566"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="release" unicode="&#58889;" d="M990.78144 828.5388800000001c-3.35872 1.59744-7.04512 2.37568-11.01824 2.37568-14.45888 0-27.60704-10.81344-27.40224-10.81344-8.8064-4.42368-880.59904-443.22816-911.44192-459.44832-17.408-9.13408-27.36128-24.73984-25.92768-40.71424 1.10592-13.14816 9.78944-23.51104 23.10144-27.77088 26.17344-8.27392 290.24256-91.58656 290.24256-91.58656l4.83328-1.47456 16.67072 50.05312-254.32064 79.54432 780.73856 406.28224c-82.82112-93.88032-420.53632-476.32384-436.10112-493.93664-20.11136-22.48704-29.4912-45.09696-29.40928-70.98368l0.28672-153.27232-0.08192 0c0 0 0.08192-53.49376 0.08192-53.6576l0-1.96608 0 0c1.18784-13.5168 12.73856-24.24832 26.54208-24.24832s25.51808 10.73152 26.74688 24.24832l0 0c0 0 0.53248 191.03744 0 205.08672-0.49152 12.4928 5.07904 26.54208 10.69056 33.05472 5.65248 6.38976 390.63552 442.61376 465.75616 527.81056-21.38112-106.41408-126.68928-629.76-128.24576-637.41952-0.8192-4.05504-2.58048-4.05504-3.35872-4.05504-0.6144 0-1.31072 0.12288-2.048 0.36864-7.45472 2.37568-268.82048 81.55136-279.92064 84.91008l-4.7104 1.4336-17.16224-50.50368 5.07904-1.59744c2.58048-0.77824 258.90816-79.09376 284.38528-86.46656 5.07904-1.47456 10.24-2.2528 15.44192-2.2528 26.99264 0 49.5616 19.37408 54.8864 46.98112 2.08896 10.93632 27.0336 134.67648 55.9104 277.99552 39.77216 197.14048 84.7872 420.61824 85.93408 427.6224l0.6144 3.31776C1009.70496 798.96576 1013.26848 817.9712 990.78144 828.5388800000001z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="add-circle-fine" unicode="&#58888;" d="M509.989715-60.972421000000054c-246.734474 0-446.75195 200.023616-446.75195 446.75809 0 246.732427 200.017476 446.75195 446.75195 446.75195 246.733451 0 446.757067-200.019523 446.757067-446.75195C956.746782 139.051195 756.723166-60.972421000000054 509.989715-60.972421000000054L509.989715-60.972421000000054zM509.989715 812.433746c-235.633648 0-426.650123-191.014428-426.650123-426.648077 0-235.639788 191.016475-426.654216 426.650123-426.654216 235.638765 0 426.654216 191.014428 426.654216 426.654216C936.643931 621.419318 745.62848 812.433746 509.989715 812.433746L509.989715 812.433746zM527.863804 153.46957999999995l-35.741016 0L492.122789 367.909533 277.678742 367.909533 277.678742 403.653619l214.443024 0L492.121765 618.0956189999999l35.741016 0L527.862781 403.653619l214.442 0 0-35.744086L527.863804 367.909533 527.863804 153.46957999999995 527.863804 153.46957999999995zM527.863804 153.46957999999995"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="ok" unicode="&#58885;" d="M960 640L915.2 684.8 371.2 172.79999999999995 108.8 454.4 64 409.6 358.4 83.20000000000005 364.8 89.60000000000002 371.2 83.20000000000005Z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="help" unicode="&#58887;" d="M690.2 741.8C635.2 783.6 573.2 798 494.6 798c-59.6 0-110.6-12.2-151-39.4C284 718 256 649.8 256 542l153.6 0c0 28.8-2.8 59.8 14 86.4 16.8 26.6 40.2 47 80.4 47 40.8 0 61.8-11.8 81.6-36.2 16.8-20.8 23.2-45.6 23.2-72 0-22.8-11.6-43.8-25.4-62.8-7.6-11.2-17.6-21.2-30.2-30.8 0 0-83-49.4-112.2-96.2-21.8-34.8-29.6-78.4-31.4-130.6-0.2-3.8 1.2-11.6 14.4-11.6 13 0 112 0 123.6 0 11.6 0 14 8.8 14.2 12.4 0.8 19 3.2 48.2 6.6 59.2 6.6 20.8 19.4 39 39.4 54.6l41.4 28.6c37.4 29.2 67.2 53 80.4 71.8 22.6 30.8 38.4 68.8 38.4 113.8C768 649 741 703.2 690.2 741.8zM484 155.6c-51.8 1.6-94.6-34.4-96.4-90.6-1.6-56.4 39-93.4 91-95 54-1.6 95.8 33.2 97.4 89.4C577.6 115.6 538 154 484 155.6z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="chat" unicode="&#58886;" d="M132.682393 414.567179c0 208.287837 166.471452 377.143593 379.317095 377.143593s385.380184-168.855756 385.380184-377.143593c0-177.196725-122.197086-325.812507-290.49821-366.259708l-116.291586-51.04763 0 41.126676C290.570353 52.175568999999996 132.682393 215.31206599999996 132.682393 414.567179zM83.799056 414.567179c0-211.946157 160.764474-387.135154 369.469819-415.152255-3.2623-20.458961-10.036587-65.024969-7.286963-65.024969 2.384303 0 114.89068 47.294143 189.700503 78.865185 176.193885 51.91437 304.518528 211.946157 304.518528 401.312038 0 231.432976-191.70823 419.042865-428.200432 419.042865S83.799056 646.0001560000001 83.799056 414.567179zM340.71952 276.63573699999995c22.935362-41.481763 89.831958-75.102489 170.391738-75.102489 79.650061 0 148.489916 32.909527 172.168198 73.681116-12.701277 5.979178-19.068288 8.02886-28.131711 12.21009-19.894096-31.257911-75.425853-59.661821-142.729725-59.661821-66.969251 0-122.836653 28.40391-143.598512 61.083194L340.71952 276.63573699999995z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="top" unicode="&#58884;" d="M812 153.4l-300 172.8-300-172.8 300 604L812 153.4zM264.5 209.2l247.5 142.5 247.5-142.5L512 707.5 264.5 209.2zM371.7 138.3l0-126.2-15.9 0 0 126.2-45.9 0L309.9 153l107.4 0 0-14.8L371.7 138.2zM506.6 154.5c26.6 0 43.3-3.9 50-11.7 6.7-7.8 10-27.2 10-58.3 0-33.5-3.2-54.2-9.6-62-6.4-7.8-23.2-11.8-50.4-11.8-27 0-43.8 3.9-50.3 11.7-6.5 7.8-9.8 27.9-9.8 60.3l0 9.9 0.2 13.3c0 18.7 4.2 31.5 12.6 38.4C467.8 151 483.5 154.5 506.6 154.5zM506.5 141c-22.3 0-35.3-2.5-39.1-7.4-3.8-5-5.7-22-5.7-51 0-29.1 1.9-46.1 5.7-51.1 3.8-5 16.8-7.4 39.1-7.4 22.4 0 35.4 2.5 39.2 7.4 3.8 5 5.7 22 5.7 51.1l0 9.2-0.1 13.3c0 15.6-2.6 25.4-7.8 29.6S525.9 141 506.5 141zM608.4 12.1 608.4 153l59.2 0 5.4 0c15.9 0 26.7-3.1 32.5-9.2 5.8-6.1 8.7-17.6 8.7-34.4 0-16.1-3-27.1-9-32.9-6-5.9-17.3-8.8-33.9-8.8l-6.2-0.1-40.7 0 0-55.5L608.4 12.1zM624.3 81.1l37.7 0c15.8 0 25.9 1.6 30.3 4.9 4.4 3.2 6.7 10.7 6.7 22.3 0 13.6-1.5 22.2-4.5 25.9-3 3.6-10.1 5.4-21.3 5.4l-6.1 0.1-42.7 0L624.4 81.1z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="right" unicode="&#58882;" d="M283.648 721.9189759999999L340.873216 780.926976 740.352 383.99795200000005 340.876288-12.925952000000052 283.648 46.07795199999998 619.52 383.99795200000005Z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="left" unicode="&#58883;" d="M740.352 721.9189759999999L683.126784 780.926976 283.648 383.99795200000005 683.123712-12.925952000000052 740.352 46.07795199999998 404.48 383.99795200000005Z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="star" unicode="&#58880;" d="M749.624889-84.152889c-15.672889 0-31.246222 3.882667-45.084444 11.306667l-192.526222 103.637333L319.544889-72.817778c-31.203556-16.64-70.314667-14.392889-99.043556 5.304889-29.511111 20.337778-44.743111 55.921778-38.840889 90.695111l37.703111 225.251556L56.661333 410.908444c-25.002667 24.888889-33.464889 60.984889-22.058667 94.193778 11.349333 32.910222 40.064 56.576 74.965333 61.752889l221.326222 32.896 96.128 199.580444c15.488 32.085333 48.853333 52.807111 84.992 52.807111 36.167111 0 69.518222-20.736 84.963556-52.807111l96.156444-199.580444 221.297778-32.910222c34.872889-5.162667 63.616-28.8 74.979556-61.696 11.392-33.28 2.944-69.361778-22.030222-94.250667L804.622222 248.433778l37.745778-225.28c5.845333-34.773333-9.386667-70.357333-38.812444-90.638222C787.569778-78.392889 768.938667-84.152889 749.624889-84.152889zM512.014222 91.548444c4.636444 0 9.272889-1.137778 13.482667-3.384889l205.937778-110.862222c12.373333-6.641778 28.316444-5.802667 39.936 2.133333 11.392 7.836444 17.123556 21.006222 14.890667 34.304L746.097778 253.496889c-1.507556 9.088 1.450667 18.332444 7.964444 24.832l173.141333 172.842667c9.457778 9.429333 12.686222 23.025778 8.405333 35.484444-4.380444 12.672-15.701333 21.873778-29.525333 23.921778L669.866667 545.706667c-9.315556 1.379556-17.365333 7.296-21.447111 15.786667L545.720889 774.641778c-6.030222 12.529778-19.256889 20.608-33.706667 20.608s-27.690667-8.092444-33.763556-20.622222L375.608889 561.493333c-4.081778-8.490667-12.131556-14.407111-21.447111-15.786667L117.930667 510.577778c-13.624889-2.033778-25.201778-11.434667-29.539556-23.992889-4.266667-12.416-1.024-25.984 8.433778-35.399111L269.937778 278.328889c6.513778-6.499556 9.472-15.744 7.964444-24.832l-40.135111-239.744c-2.247111-13.312 3.484444-26.439111 14.976-34.360889 11.434667-7.836444 27.349333-8.775111 39.950222-2.062222l205.852444 110.833778C502.741333 90.410667 507.377778 91.548444 512.014222 91.548444zM200.32 439.210667c-6.840889 0-12.885333 4.963556-14.023111 11.946667-1.251556 7.751111 4.010667 15.061333 11.761778 16.312889l9.443556 1.536c7.793778 1.336889 15.061333-4.010667 16.312889-11.761778 1.251556-7.751111-4.010667-15.061333-11.761778-16.312889l-9.443556-1.536C201.856 439.267556 201.073778 439.210667 200.32 439.210667zM252.544 447.687111c-6.684444 0-12.643556 4.721778-13.937778 11.534222-1.493333 7.708444 3.555556 15.175111 11.264 16.654222l153.927111 29.696 58.055111 133.148444c3.157333 7.182222 11.548444 10.496 18.716444 7.352889 7.210667-3.143111 10.510222-11.52 7.367111-18.716444l-61.056-140.017778c-1.877333-4.295111-5.745778-7.395556-10.353778-8.277333l-161.28-31.118222C254.336 447.758222 253.44 447.687111 252.544 447.687111z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="download-circle" unicode="&#58881;" d="M510.771521 828.211081c-244.998947 0-443.597097-198.60429-443.597097-443.590957s198.59815-443.591981 443.597097-443.591981c244.986667 0 443.583794 198.60429 443.583794 443.591981S755.758188 828.211081 510.771521 828.211081zM510.771521-30.044013999999947c-229.010811 0-414.664138 185.65435-414.664138 414.664138 0 229.010811 185.653327 414.657998 414.664138 414.657998 228.996484 0 414.652881-185.647187 414.652881-414.657998C925.424402 155.60931300000004 739.768005-30.044013999999947 510.771521-30.044013999999947zM662.749888 352.39518799999996L537.719266 245.82501100000002l0 324.388065c0 14.887059-12.06478 26.953885-26.947745 26.953885-14.894222 0-26.961048-12.066827-26.961048-26.953885l0-325.410348L357.936647 352.39518799999996c-10.56359 10.599406-27.693736 10.599406-38.267559 0-10.56359-10.596336-10.56359-27.777647 0-38.375006l170.181961-161.220868c5.629207-5.652743 13.111622-8.060583 20.49887-7.680936 7.373944-0.379647 14.859429 2.02717 20.488637 7.680936l170.181961 161.220868c10.562567 10.597359 10.562567 27.77867 0 38.375006C690.443623 362.99561700000004 673.313477 362.99561700000004 662.749888 352.39518799999996z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="close" unicode="&#4102;" d="M783.483 701.249L512 429.775 240.517 701.249c-10.082 10.083-26.429 10.083-36.51 0-10.083-10.082-10.083-26.429 0-36.509l271.481-271.475L204.008 121.78800000000001c-10.083-10.081-10.083-26.428 0-36.508 10.082-10.082 26.429-10.082 36.51 0L512 356.755l271.483-271.475c10.082-10.082 26.429-10.082 36.513 0 10.081 10.083 10.081 26.428 0 36.508L548.51 393.265l271.485 271.474c10.081 10.083 10.081 26.429 0 36.509C809.912 711.33 793.564 711.33 783.483 701.249z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="close-fill" unicode="&#4103;" d="M512 822.022125c-217.47508 0-394.423141-176.949085-394.423141-394.423141 0-217.474057 176.948061-394.422118 394.423141-394.422118 217.473033 0 394.422118 176.948061 394.422118 394.422118C906.422118 645.07304 729.473033 822.022125 512 822.022125zM702.228529 270.92978200000005c8.030907-8.030907 8.030907-21.052478 0-29.083385s-21.052478-8.030907-29.083385 0L512 402.992563 350.853833 241.84741899999995c-8.030907-8.030907-21.052478-8.030907-29.083385 0s-8.030907 21.052478 0 29.083385l161.146167 161.146167L321.771471 593.222115c-8.030907 8.030907-8.030907 21.052478 0 29.083385s21.052478 8.030907 29.083385 0l161.146167-161.146167L673.145144 622.305501c8.030907 8.030907 21.052478 8.030907 29.083385 0s8.030907-21.052478 0-29.083385L541.082362 432.075949 702.228529 270.92978200000005z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="ok-circle" unicode="&#4101;" d="M516.152065-63.152063c-60.696384 0-119.594819 11.894911-175.056991 35.353183-53.55473 22.651906-101.646028 55.073316-142.936433 96.364745-41.291428 41.291428-73.712839 89.381703-96.363721 142.936433-23.458271 55.462173-35.353183 114.359584-35.353183 175.055968s11.894911 119.594819 35.353183 175.056991c22.651906 53.55473 55.073316 101.646028 96.363721 142.936433 41.290405 41.291428 89.381703 73.712839 142.936433 96.363721 55.462173 23.458271 114.359584 35.353183 175.056991 35.353183s119.594819-11.894911 175.056991-35.353183c53.55473-22.651906 101.645005-55.073316 142.936433-96.363721 41.291428-41.290405 73.711815-89.38068 96.363721-142.936433 23.459295-55.462173 35.353183-114.359584 35.353183-175.056991 0-60.696384-11.893888-119.593795-35.353183-175.055968-22.651906-53.55473-55.072293-101.645005-96.363721-142.936433s-89.381703-73.712839-142.936433-96.364745C635.747907-51.25715200000002 576.849472-63.152063 516.152065-63.152063zM516.152065 774.870222c-214.115566 0-388.311956-174.196391-388.311956-388.311956s174.196391-388.311956 388.311956-388.311956 388.311956 174.196391 388.311956 388.311956S730.268654 774.870222 516.152065 774.870222zM434.74908 132.830517L209.49278 358.08784 289.087583 437.68162 434.74908 292.020122 743.218594 600.488613 822.812373 520.89381Z"  horiz-adv-x="1024" />
+      
+    </font>
+  </defs>
+</svg>
diff --git a/public/static/assets/layui/font/iconfont.ttf b/public/static/assets/layui/font/iconfont.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..6e84a89e031247509801ae5d65cc8d20323cb766
Binary files /dev/null and b/public/static/assets/layui/font/iconfont.ttf differ
diff --git a/public/static/assets/layui/font/iconfont.woff b/public/static/assets/layui/font/iconfont.woff
new file mode 100644
index 0000000000000000000000000000000000000000..acd7ed6082729ae968e44aa9f676cd50a37e8eb6
Binary files /dev/null and b/public/static/assets/layui/font/iconfont.woff differ
diff --git a/public/static/assets/layui/font/iconfont.woff2 b/public/static/assets/layui/font/iconfont.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..5badd6e38ec077cd5b50da3d41f029f7534be086
Binary files /dev/null and b/public/static/assets/layui/font/iconfont.woff2 differ
diff --git a/public/static/assets/layui/layui.js b/public/static/assets/layui/layui.js
new file mode 100644
index 0000000000000000000000000000000000000000..384fb66cd65daa4c1477349532b784e5ed257897
--- /dev/null
+++ b/public/static/assets/layui/layui.js
@@ -0,0 +1 @@
+/** v2.9.21 | MIT Licensed */;!function(d){"use strict";var t,h=d.document,m={modules:{},status:{},timeout:10,event:{}},o=function(){this.v="2.9.21"},e=d.LAYUI_GLOBAL||{},v=(t=h.currentScript&&"SCRIPT"===h.currentScript.tagName.toUpperCase()?h.currentScript.src:function(){for(var t,e=h.getElementsByTagName("script"),n=e.length-1,o=n;0<o;o--)if("interactive"===e[o].readyState){t=e[o].src;break}return t||e[n].src}(),m.dir=e.dir||t.substring(0,t.lastIndexOf("/")+1)),g=function(t,e){e=e||"log",d.console&&console[e]&&console[e]("layui error hint: "+t)},b="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),N=m.builtin={lay:"lay",layer:"layer",laydate:"laydate",laypage:"laypage",laytpl:"laytpl",form:"form",upload:"upload",dropdown:"dropdown",transfer:"transfer",tree:"tree",table:"table",treeTable:"treeTable",element:"element",rate:"rate",colorpicker:"colorpicker",slider:"slider",carousel:"carousel",flow:"flow",util:"util",code:"code",jquery:"jquery",all:"all","layui.all":"layui.all"},s=(o.prototype.cache=m,o.prototype.define=function(t,o){return"function"==typeof t&&(o=t,t=[]),this.use(t,function(){var n=function(t,e){layui[t]=e,m.status[t]=!0};return"function"==typeof o&&o(function(t,e){n(t,e),m.callback[t]=function(){o(n)}}),this},null,"define"),this},o.prototype.use=function(n,t,e,o){var r,i,a=this,u=m.dir=m.dir||v,l=h.getElementsByTagName("head")[0],s=(n="string"==typeof n?[n]:"function"==typeof n?(t=n,["all"]):n,d.jQuery&&jQuery.fn.on&&(a.each(n,function(t,e){"jquery"===e&&n.splice(t,1)}),layui.jquery=layui.$=jQuery),n[0]),c=0;function p(t,e){var n="PLaySTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/;"load"!==t.type&&!n.test((t.currentTarget||t.srcElement).readyState)||(m.modules[s]=e,l.removeChild(r),function o(){return++c>1e3*m.timeout/4?g(s+" is not a valid module","error"):void(m.status[s]?y():setTimeout(o,4))}())}function y(){e.push(layui[s]),1<n.length?a.use(n.slice(1),t,e,o):"function"==typeof t&&(layui.jquery&&"function"==typeof layui.jquery&&"define"!==o?layui.jquery(function(){t.apply(layui,e)}):t.apply(layui,e))}return e=e||[],m.host=m.host||(u.match(/\/\/([\s\S]+?)\//)||["//"+location.host+"/"])[0],0===n.length||layui["layui.all"]&&N[s]?y():(i=(i=(N[s]?u+"modules/":!/^\{\/\}/.test(a.modules[s])&&m.base||"")+(a.modules[s]||s)+".js").replace(/^\{\/\}/,""),!m.modules[s]&&layui[s]&&(m.modules[s]=i),m.modules[s]?function f(){return++c>1e3*m.timeout/4?g(s+" is not a valid module","error"):void("string"==typeof m.modules[s]&&m.status[s]?y():setTimeout(f,4))}():((r=h.createElement("script"))["async"]=!0,r.charset="utf-8",r.src=i+((u=!0===m.version?m.v||(new Date).getTime():m.version||"")?"?v="+u:""),l.appendChild(r),!r.attachEvent||r.attachEvent.toString&&r.attachEvent.toString().indexOf("[native code")<0||b?r.addEventListener("load",function(t){p(t,i)},!1):r.attachEvent("onreadystatechange",function(t){p(t,i)}),m.modules[s]=i)),a},o.prototype.disuse=function(t){var n=this;return t=n.isArray(t)?t:[t],n.each(t,function(t,e){m.status[e],delete n[e],delete N[e],delete n.modules[e],delete m.status[e],delete m.modules[e]}),n},o.prototype.getStyle=function(t,e){t=t.currentStyle||d.getComputedStyle(t,null);return t.getPropertyValue?t.getPropertyValue(e):t.getAttribute(e.replace(/-(\w)/g,function(t,e){return e?e.toUpperCase():""}))},o.prototype.link=function(n,o,t){var r=this,e=h.getElementsByTagName("head")[0],i=h.createElement("link"),a="layuicss-"+((t="string"==typeof o?o:t)||n).replace(/\.|\//g,""),u="creating",l=0;return i.href=n+(m.debug?"?v="+(new Date).getTime():""),i.rel="stylesheet",i.id=a,i.media="all",h.getElementById(a)||e.appendChild(i),"function"==typeof o&&function s(t){var e=h.getElementById(a);return++l>1e3*m.timeout/100?g(n+" timeout"):void(1989===parseInt(r.getStyle(e,"width"))?(t===u&&e.removeAttribute("lay-status"),e.getAttribute("lay-status")===u?setTimeout(s,100):o()):(e.setAttribute("lay-status",u),setTimeout(function(){s(u)},100)))}(),r},o.prototype.addcss=function(t,e,n){return layui.link(m.dir+"css/"+t,e,n)},m.callback={},o.prototype.factory=function(t){if(layui[t])return"function"==typeof m.callback[t]?m.callback[t]:null},o.prototype.img=function(t,e,n){var o=new Image;if(o.src=t,o.complete)return e(o);o.onload=function(){o.onload=null,"function"==typeof e&&e(o)},o.onerror=function(t){o.onerror=null,"function"==typeof n&&n(t)}},o.prototype.config=function(t){for(var e in t=t||{})m[e]=t[e];return this},o.prototype.modules=function(){var t,e={};for(t in N)e[t]=N[t];return e}(),o.prototype.extend=function(t){for(var e in t=t||{})this[e]||this.modules[e]?g(e+" Module already exists","error"):this.modules[e]=t[e];return this},o.prototype.router=o.prototype.hash=function(t){var n={path:[],search:{},hash:((t=t||location.hash).match(/[^#](#.*$)/)||[])[1]||""};return/^#\//.test(t)&&(t=t.replace(/^#\//,""),n.href="/"+t,t=t.replace(/([^#])(#.*$)/,"$1").split("/")||[],this.each(t,function(t,e){/^\w+=/.test(e)?(e=e.split("="),n.search[e[0]]=e[1]):n.path.push(e)})),n},o.prototype.url=function(t){var r,e,n=this;return{pathname:(t?((t.match(/\.[^.]+?\/.+/)||[])[0]||"").replace(/^[^\/]+/,"").replace(/\?.+/,""):location.pathname).replace(/^\//,"").split("/"),search:(r={},e=(t?((t.match(/\?.+/)||[])[0]||"").replace(/\#.+/,""):location.search).replace(/^\?+/,"").split("&"),n.each(e,function(t,e){var n=e.indexOf("="),o=n<0?e.substr(0,e.length):0!==n&&e.substr(0,n);o&&(r[o]=0<n?e.substr(n+1):null)}),r),hash:n.router(t?(t.match(/#.+/)||[])[0]||"/":location.hash)}},o.prototype.data=function(t,e,n){if(t=t||"layui",n=n||localStorage,d.JSON&&d.JSON.parse){if(null===e)return delete n[t];e="object"==typeof e?e:{key:e};try{var o=JSON.parse(n[t])}catch(r){o={}}return"value"in e&&(o[e.key]=e.value),e.remove&&delete o[e.key],n[t]=JSON.stringify(o),e.key?o[e.key]:o}},o.prototype.sessionData=function(t,e){return this.data(t,e,sessionStorage)},o.prototype.device=function(t){var n=navigator.userAgent.toLowerCase(),e=function(t){var e=new RegExp(t+"/([^\\s\\_\\-]+)");return(t=(n.match(e)||[])[1])||!1},o={os:/windows/.test(n)?"windows":/linux/.test(n)?"linux":/iphone|ipod|ipad|ios/.test(n)?"ios":/mac/.test(n)?"mac":void 0,ie:!!(d.ActiveXObject||"ActiveXObject"in d)&&((n.match(/msie\s(\d+)/)||[])[1]||"11"),weixin:e("micromessenger")};return t&&!o[t]&&(o[t]=e(t)),o.android=/android/.test(n),o.ios="ios"===o.os,o.mobile=o.android||o.ios,o},o.prototype.hint=function(){return{error:g}},o.prototype._typeof=o.prototype.type=function(t){return null===t?String(t):"object"==typeof t||"function"==typeof t?(e=(e=Object.prototype.toString.call(t).match(/\s(.+)\]$/)||[])[1]||"Object",new RegExp("\\b(Function|Array|Date|RegExp|Object|Error|Symbol)\\b").test(e)?e.toLowerCase():"object"):typeof t;var e},o.prototype._isArray=o.prototype.isArray=function(t){var e,n=this.type(t);return!(!t||"object"!=typeof t||t===d)&&(e="length"in t&&t.length,"array"===n||0===e||"number"==typeof e&&0<e&&e-1 in t)},o.prototype.each=function(t,n){var e,o=function(t,e){return n.call(e[t],t,e[t])};if("function"==typeof n)if(this.isArray(t=t||[]))for(e=0;e<t.length&&!o(e,t);e++);else for(e in t)if(o(e,t))break;return this},o.prototype.sort=function(t,r,e,n){n=n?t||[]:JSON.parse(JSON.stringify(t||[]));if("object"!==this.type(t)||r){if("object"!=typeof t)return[n];n.sort(function(t,e){var n=t[r],o=e[r];if(!isNaN(t)&&!isNaN(e))return t-e;if(!isNaN(t)&&isNaN(e)){if(!r||"object"!=typeof e)return-1;n=t}else if(isNaN(t)&&!isNaN(e)){if(!r||"object"!=typeof t)return 1;o=e}t=[!isNaN(n),!isNaN(o)];return t[0]&&t[1]?n&&!o&&0!==o?1:!n&&0!==n&&o?-1:n-o:t[0]||t[1]?t[0]||!t[1]?-1:!t[0]||t[1]?1:void 0:o<n?1:n<o?-1:0}),e&&n.reverse()}return n},o.prototype.stope=function(t){t=t||d.event;try{t.stopPropagation()}catch(e){t.cancelBubble=!0}},"LAYUI-EVENT-REMOVE");o.prototype.onevent=function(t,e,n){return"string"!=typeof t||"function"!=typeof n?this:o.event(t,e,null,n)},o.prototype.event=o.event=function(t,e,n,o){var r=this,i=null,a=(e||"").match(/\((.*)\)$/)||[],t=(t+"."+e).replace(a[0],""),u=a[1]||"",l=function(t,e){!1===(e&&e.call(r,n))&&null===i&&(i=!1)};return n===s?(delete(r.cache.event[t]||{})[u],r):o?(m.event[t]=m.event[t]||{},u?m.event[t][u]=[o]:(m.event[t][u]=m.event[t][u]||[],m.event[t][u].push(o)),this):(layui.each(m.event[t],function(t,e){("{*}"===u||(""===t&&layui.each(e,l),u&&t===u))&&layui.each(e,l)}),i)},o.prototype.on=function(t,e,n){return this.onevent.call(this,e,t,n)},o.prototype.off=function(t,e){return this.event.call(this,e,t,s)},o.prototype.debounce=function(n,o){var r;return function(){var t=this,e=arguments;clearTimeout(r),r=setTimeout(function(){n.apply(t,e)},o)}},o.prototype.throttle=function(t,e){var n=!1;return function(){n||(t.apply(this,arguments),n=!0,setTimeout(function(){n=!1},e))}},d.layui=new o}(window);layui.define(function(a){var i=layui.cache;layui.config({dir:i.dir.replace(/lay\/dest\/$/,"")}),a("layui.all",layui.v)});!function(d){"use strict";var t,h=d.document,p=function(t){return new r(t)},r=function(t){var n=this,i="object"==typeof t?layui.isArray(t)?t:[t]:(this.selector=t,h.querySelectorAll(t||null));p.each(i,function(t,e){n.push(i[t])})};Array.prototype.indexOf=Array.prototype.indexOf||function(n,i){var r=-1;return i=i||0,layui.each(this,function(t,e){if(n===e&&i<=t)return r=t,!0}),r},r.fn=r.prototype=[],r.fn.constructor=r,p.extend=function(){var t,e=1,n=arguments,i=function(t,e){for(var n in t=t||("array"===layui.type(e)?[]:{}),e)t[n]=e[n]&&e[n].constructor===Object?i(t[n],e[n]):e[n];return t};for(n[0]="object"==typeof n[0]?n[0]:{},t=n.length;e<t;e++)"object"==typeof n[e]&&i(n[0],n[e]);return n[0]},p.ie=(t=navigator.userAgent.toLowerCase(),!!(d.ActiveXObject||"ActiveXObject"in d)&&((t.match(/msie\s(\d+)/)||[])[1]||"11")),p.layui=layui||{},p.getPath=layui.cache.dir,p.stope=layui.stope,p.each=function(){return layui.each.apply(layui,arguments),this},p.digit=function(t,e){if("string"!=typeof t&&"number"!=typeof t)return"";var n="";e=e||2;for(var i=(t=String(t)).length;i<e;i++)n+="0";return t<Math.pow(10,e)?n+t:t},p.elem=function(t,e){var n=h.createElement(t);return p.each(e||{},function(t,e){n.setAttribute(t,e)}),n},p.hasScrollbar=function(){return h.body.scrollHeight>(d.innerHeight||h.documentElement.clientHeight)},p.getStyleRules=function(t,n){if(t)return t=(t=t.sheet||t.styleSheet||{}).cssRules||t.rules,"function"==typeof n&&layui.each(t,function(t,e){if(n(e,t))return!0}),t},p.style=function(t){t=t||{};var e=p.elem("style"),n=t.text||"",i=t.target;if(n)return"styleSheet"in e?(e.setAttribute("type","text/css"),e.styleSheet.cssText=n):e.innerHTML=n,e.id="LAY-STYLE-"+(t.id||(n=p.style.index||0,p.style.index++,"DF-"+n)),i&&((t=p(i).find("#"+e.id))[0]&&t.remove(),p(i).append(e)),e},p.position=function(t,e,n){var i,r,o,c,a,u,s,f,l;e&&(n=n||{},t!==h&&t!==p("body")[0]||(n.clickType="right"),i="right"===n.clickType?{left:(i=n.e||d.event||{}).clientX,top:i.clientY,right:i.clientX,bottom:i.clientY}:t.getBoundingClientRect(),a=e.offsetWidth,u=e.offsetHeight,r=function(t){return h.body[t=t?"scrollLeft":"scrollTop"]|h.documentElement[t]},o=function(t){return h.documentElement[t?"clientWidth":"clientHeight"]},c="margin"in n?n.margin:5,l=i.left,"center"===n.align?l-=(a-t.offsetWidth)/2:"right"===n.align&&(l=l-a+t.offsetWidth),(l=l+a+c>o("width")?o("width")-a-c:l)<c&&(l=c),(a=i.bottom)+u+c>o()&&(i.top>u+c&&i.top<=o()?a=i.top-u-2*c:n.allowBottomOut||(a=o()-u-2*c)<0&&(a=0)),(u=n.position)&&(e.style.position=u),s=n.offset?n.offset[0]:0,f=n.offset?n.offset[1]:0,e.style.left=l+("fixed"===u?0:r(1))+s+"px",e.style.top=a+("fixed"===u?0:r())+f+"px",p.hasScrollbar()||(l=e.getBoundingClientRect(),!n.SYSTEM_RELOAD&&l.bottom+c>o()&&(n.SYSTEM_RELOAD=!0,setTimeout(function(){p.position(t,e,n)},50))))},p.options=function(t,e){if(e="object"==typeof e?e:{attr:e},t===h)return{};var t=p(t),n=e.attr||"lay-options",t=t.attr(n);try{return new Function("return "+(t||"{}"))()}catch(i){return layui.hint().error(e.errorText||[n+'="'+t+'"',"\n parseerror: "+i].join("\n"),"error"),{}}},p.isTopElem=function(n){var t=[h,p("body")[0]],i=!1;return p.each(t,function(t,e){if(e===n)return i=!0}),i},p.clipboard={writeText:function(n){var i=String(n.text);function t(){var t=h.createElement("textarea");t.value=i,t.style.position="fixed",t.style.opacity="0",t.style.top="0px",t.style.left="0px",h.body.appendChild(t),t.select();try{h.execCommand("copy"),"function"==typeof n.done&&n.done()}catch(e){"function"==typeof n.error&&n.error(e)}finally{t.remove?t.remove():h.body.removeChild(t)}}navigator&&"clipboard"in navigator?navigator.clipboard.writeText(i).then(n.done,function(){t()}):t()}},p.passiveSupported=function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});d.addEventListener("test",null,e),d.removeEventListener("test",null,e)}catch(n){}return t}(),p.touchEventsSupported=function(){return"ontouchstart"in d},p.touchSwipe=function(t,e){var n,i,r,o,c=e,a=p(t)[0];a&&p.touchEventsSupported()&&(n={pointerStart:{x:0,y:0},pointerEnd:{x:0,y:0},distanceX:0,distanceY:0,direction:"none",timeStart:null},e=function(t){1===t.touches.length&&(a.addEventListener("touchmove",i,!!p.passiveSupported&&{passive:!1}),a.addEventListener("touchend",r),a.addEventListener("touchcancel",r),n.timeStart=Date.now(),n.pointerStart.x=n.pointerEnd.x=t.touches[0].clientX,n.pointerStart.y=n.pointerEnd.y=t.touches[0].clientY,n.distanceX=n.distanceY=0,n.direction="none",c.onTouchStart)&&c.onTouchStart(t,n)},i=function(t){t.preventDefault(),n.pointerEnd.x=t.touches[0].clientX,n.pointerEnd.y=t.touches[0].clientY,n.distanceX=n.pointerStart.x-n.pointerEnd.x,n.distanceY=n.pointerStart.y-n.pointerEnd.y,Math.abs(n.distanceX)>Math.abs(n.distanceY)?n.direction=0<n.distanceX?"left":"right":n.direction=0<n.distanceY?"up":"down",c.onTouchMove&&c.onTouchMove(t,n)},r=function(t){c.onTouchEnd&&c.onTouchEnd(t,n),o()},o=function(){a.removeEventListener("touchmove",i),a.removeEventListener("touchend",r,!!p.passiveSupported&&{passive:!1}),a.removeEventListener("touchcancel",r)},a.__lay_touchswipe_cb_&&a.removeEventListener("touchstart",a.__lay_touchswipe_cb_),a.__lay_touchswipe_cb_=e,a.addEventListener("touchstart",e))},p.addEvent=h.addEventListener?function(t,e,n,i){t.addEventListener(e,n,i)}:function(e,t,n){var i="_lay_on_"+t,r=function(t){t.target=t.srcElement,n.call(e,t)},o=(r._rawFn=n,e[i]||(e[i]=[]),!1);p.each(e[i],function(t,e){if(e._rawFn===n)return o=!0}),o||(e[i].push(r),e.attachEvent("on"+t,r))},p.removeEvent=h.removeEventListener?function(t,e,n,i){t.removeEventListener(e,n,i)}:function(n,i,r){var o,t="_lay_on_"+i,e=n[t];layui.isArray(e)&&(o=[],p.each(e,function(t,e){e._rawFn===r?n.detachEvent("on"+i,e):o.push(e)}),n[t]=o)},p.onClickOutside=function(r,o,t){var e,n,i,c,a=(t=t||{}).event||("onpointerdown"in d?"pointerdown":"mousedown"),u=t.scope||h,s=t.ignore||[],t=!("capture"in t)||t.capture;return e=u,n=a,i=function(t){var e=r,n=t.target||t.srcElement,i=function(t){var e=t.composedPath&&t.composedPath()||t.path,t=t.target||t.srcElement;if(null!==e&&e!==undefined)return e;return[t].concat(function n(t,e){e=e||[];t=t.parentNode;return t?n(t,e.concat([t])):e}(t))}(t);e&&e!==n&&-1===i.indexOf(e)&&!function(t,e){for(var n=t.target||t.srcElement,i=0;i<s.length;i++){var r=s[i];if("string"==typeof r)for(var o=h.querySelectorAll(r),c=0;c<o.length;c++){var a=o[i];if(a===n||-1!==e.indexOf(a))return 1}else if(r&&(r===n||-1!==e.indexOf(r)))return 1}}(t,i)&&o(t)},c=p.passiveSupported?{passive:!0,capture:t}:t,e.addEventListener?e.addEventListener(n,i,c):e.attachEvent("on"+n,i),function(){e.removeEventListener?e.removeEventListener(n,i,c):e.detachEvent("on"+n,i)}},r.addStr=function(n,t){return n=n.replace(/\s+/," "),t=t.replace(/\s+/," ").split(" "),p.each(t,function(t,e){new RegExp("\\b"+e+"\\b").test(n)||(n=n+" "+e)}),n.replace(/^\s|\s$/,"")},r.removeStr=function(n,t){return n=n.replace(/\s+/," "),t=t.replace(/\s+/," ").split(" "),p.each(t,function(t,e){e=new RegExp("\\b"+e+"\\b");e.test(n)&&(n=n.replace(e,""))}),n.replace(/\s+/," ").replace(/^\s|\s$/,"")},r.fn.find=function(n){var i=[],r="object"==typeof n;return this.each(function(t,e){e=r&&e.contains(n)?n:e.querySelectorAll(n||null);p.each(e,function(t,e){i.push(e)})}),p(i)},r.fn.each=function(t){return p.each.call(this,this,t)},r.fn.addClass=function(n,i){return this.each(function(t,e){e.className=r[i?"removeStr":"addStr"](e.className,n)})},r.fn.removeClass=function(t){return this.addClass(t,!0)},r.fn.hasClass=function(n){var i=!1;return this.each(function(t,e){new RegExp("\\b"+n+"\\b").test(e.className)&&(i=!0)}),i},r.fn.css=function(e,i){var t=this,r=function(t){return isNaN(t)?t:t+"px"};return"string"!=typeof e||i!==undefined?t.each(function(t,n){"object"==typeof e?p.each(e,function(t,e){n.style[t]=r(e)}):n.style[e]=r(i)}):0<t.length?t[0].style[e]:void 0},r.fn.width=function(n){var i=this;return n!==undefined?i.each(function(t,e){i.css("width",n)}):0<i.length?i[0].offsetWidth:void 0},r.fn.height=function(n){var i=this;return n!==undefined?i.each(function(t,e){i.css("height",n)}):0<i.length?i[0].offsetHeight:void 0},r.fn.attr=function(n,i){var t=this;return i!==undefined?t.each(function(t,e){e.setAttribute(n,i)}):0<t.length?t[0].getAttribute(n):void 0},r.fn.removeAttr=function(n){return this.each(function(t,e){e.removeAttribute(n)})},r.fn.html=function(n){var t=this;return n!==undefined?this.each(function(t,e){e.innerHTML=n}):0<t.length?t[0].innerHTML:void 0},r.fn.val=function(n){var t=this;return n!==undefined?this.each(function(t,e){e.value=n}):0<t.length?t[0].value:void 0},r.fn.append=function(n){return this.each(function(t,e){"object"==typeof n?e.appendChild(n):e.innerHTML=e.innerHTML+n})},r.fn.remove=function(n){return this.each(function(t,e){n?e.removeChild(n):e.parentNode.removeChild(e)})},r.fn.on=function(n,i,r){return this.each(function(t,e){p.addEvent(e,n,i,r)})},r.fn.off=function(n,i,r){return this.each(function(t,e){p.removeEvent(e,n,i,r)})},d.lay=p,d.layui&&layui.define&&layui.define(function(t){t("lay",p)})}(window,window.document);layui.define(function(e){"use strict";var c={open:"{{",close:"}}"},l={escape:function(e){return e===undefined||null===e?"":/[<"'>]|&(?=#[a-zA-Z0-9]+)/g.test(e+="")?e.replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"&#39;").replace(/"/g,"&quot;"):e}},i=function(e){return new RegExp(e,"g")},u=function(e,r){var n="Laytpl Error: ";return"object"==typeof console&&console.error(n+e+"\n"+(r||"")),n+e},n=function(e,r){var n=this,e=(n.config=n.config||{},n.template=e,function(e){for(var r in e)n.config[r]=e[r]});e(c),e(r)},r=(n.prototype.tagExp=function(e,r,n){var c=this.config;return i((r||"")+c.open+["#([\\s\\S])+?","([^{#}])*?"][e||0]+c.close+(n||""))},n.prototype.parse=function(e,r){var n=this,c=n.config,t=e,o=i("^"+c.open+"#",""),p=i(c.close+"$","");if("string"!=typeof e)return e;e='"use strict";var view = "'+(e=e.replace(/\s+|\r|\t|\n/g," ").replace(i(c.open+"#"),c.open+"# ").replace(i(c.close+"}"),"} "+c.close).replace(/\\/g,"\\\\").replace(i(c.open+"!(.+?)!"+c.close),function(e){return e=e.replace(i("^"+c.open+"!"),"").replace(i("!"+c.close),"").replace(i(c.open+"|"+c.close),function(e){return e.replace(/(.)/g,"\\$1")})}).replace(/(?="|')/g,"\\").replace(n.tagExp(),function(e){return'";'+(e=e.replace(o,"").replace(p,"")).replace(/\\(.)/g,"$1")+';view+="'}).replace(n.tagExp(1),function(e){var r='"+laytpl.escape(';return e.replace(/\s/g,"")===c.open+c.close?"":(e=e.replace(i(c.open+"|"+c.close),""),/^=/.test(e)?e=e.replace(/^=/,""):/^-/.test(e)&&(e=e.replace(/^-/,""),r='"+('),r+e.replace(/\\(.)/g,"$1")+')+"')}))+'";return view;';try{return n.cache=e=new Function("d, laytpl",e),e(r,l)}catch(a){return delete n.cache,u(a,t)}},n.prototype.render=function(e,r){e=e||{};var n=this,e=n.cache?n.cache(e,l):n.parse(n.template,e);return"function"==typeof r&&r(e),e},function(e,r){return new n(e,r)});r.config=function(e){for(var r in e=e||{})c[r]=e[r]},r.v="2.0.0",e("laytpl",r)});layui.define(function(e){"use strict";var r=document,u="getElementById",c="getElementsByTagName",a="layui-disabled",t=function(e){var a=this;a.config=e||{},a.config.index=++o.index,a.render(!0)},o=(t.prototype.type=function(){var e=this.config;if("object"==typeof e.elem)return e.elem.length===undefined?2:3},t.prototype.view=function(){var i,e,t,n=this.config,r=n.groups="groups"in n?Number(n.groups)||0:5,u=(n.layout="object"==typeof n.layout?n.layout:["prev","page","next"],n.count=Number(n.count)||0,n.curr=Number(n.curr)||1,n.limits="object"==typeof n.limits?n.limits:[10,20,30,40,50],n.limit=Number(n.limit)||10,n.pages=Math.ceil(n.count/n.limit)||1,n.curr>n.pages?n.curr=n.pages:n.curr<1&&(n.curr=1),r<0?r=1:r>n.pages&&(r=n.pages),n.prev="prev"in n?n.prev:"\u4e0a\u4e00\u9875",n.next="next"in n?n.next:"\u4e0b\u4e00\u9875",n.pages>r?Math.ceil((n.curr+(1<r?1:0))/(0<r?r:1)):1),l={prev:n.prev?'<a class="layui-laypage-prev'+(1==n.curr?" "+a:"")+'" data-page="'+(n.curr-1)+'">'+n.prev+"</a>":"",page:function(){var e=[];if(n.count<1)return"";1<u&&!1!==n.first&&0!==r&&e.push('<a class="layui-laypage-first" data-page="1"  title="\u9996\u9875">'+(n.first||1)+"</a>");var a=Math.floor((r-1)/2),t=1<u?n.curr-a:1,i=1<u?(a=n.curr+(r-a-1))>n.pages?n.pages:a:r;for(i-t<r-1&&(t=i-r+1),!1!==n.first&&2<t&&e.push('<span class="layui-laypage-spr">...</span>');t<=i;t++)t===n.curr?e.push('<span class="layui-laypage-curr"><em class="layui-laypage-em" '+(/^#/.test(n.theme)?'style="background-color:'+n.theme+';"':"")+"></em><em>"+t+"</em></span>"):e.push('<a data-page="'+t+'">'+t+"</a>");return n.pages>r&&n.pages>i&&!1!==n.last&&(i+1<n.pages&&e.push('<span class="layui-laypage-spr">...</span>'),0!==r)&&e.push('<a class="layui-laypage-last" title="\u5c3e\u9875"  data-page="'+n.pages+'">'+(n.last||n.pages)+"</a>"),e.join("")}(),next:n.next?'<a class="layui-laypage-next'+(n.curr==n.pages?" "+a:"")+'" data-page="'+(n.curr+1)+'">'+n.next+"</a>":"",count:'<span class="layui-laypage-count">'+(e="object"==typeof n.countText?n.countText:["\u5171 "," \u6761"])[0]+n.count+e[1]+"</span>",limit:(i=['<span class="layui-laypage-limits"><select lay-ignore>'],layui.each(n.limits,function(e,a){var t;i.push('<option value="'+a+'"'+(a===n.limit?" selected":"")+">"+(t=(a=a)+" \u6761/\u9875","function"==typeof n.limitTemplet&&n.limitTemplet(a)||t)+"</option>")}),i.join("")+"</select></span>"),refresh:['<a data-page="'+n.curr+'" class="layui-laypage-refresh">','<i class="layui-icon layui-icon-refresh"></i>',"</a>"].join(""),skip:['<span class="layui-laypage-skip">'+(e="object"==typeof n.skipText?n.skipText:["\u5230\u7b2c","\u9875","\u786e\u5b9a"])[0],'<input type="text" min="1" value="'+n.curr+'" class="layui-input">',e[1]+'<button type="button" class="layui-laypage-btn">'+e[2]+"</button>","</span>"].join("")};return['<div class="layui-box layui-laypage layui-laypage-'+(n.theme?/^#/.test(n.theme)?"molv":n.theme:"default")+'" id="layui-laypage-'+n.index+'">',(t=[],layui.each(n.layout,function(e,a){l[a]&&t.push(l[a])}),t.join("")),"</div>"].join("")},t.prototype.jump=function(e,a){if(e){var t=this,i=t.config,n=e.children,r=e[c]("button")[0],u=e[c]("input")[0],e=e[c]("select")[0],l=function(){var e=Number(u.value.replace(/\s|\D/g,""));e&&(i.curr=e,t.render())};if(a)return l();for(var s=0,p=n.length;s<p;s++)"a"===n[s].nodeName.toLowerCase()&&o.on(n[s],"click",function(){var e=Number(this.getAttribute("data-page"));e<1||e>i.pages||(i.curr=e,t.render())});e&&o.on(e,"change",function(){var e=this.value;i.curr*e>i.count&&(i.curr=Math.ceil(i.count/e)),i.limit=e,t.render()}),r&&o.on(r,"click",function(){l()})}},t.prototype.skip=function(t){var i,e;t&&(i=this,e=t[c]("input")[0])&&o.on(e,"keyup",function(e){var a=this.value,e=e.keyCode;/^(37|38|39|40)$/.test(e)||(/\D/.test(a)&&(this.value=a.replace(/\D/,"")),13===e&&i.jump(t,!0))})},t.prototype.render=function(e){var a=this,t=a.config,i=a.type(),n=a.view(),i=(2===i?t.elem&&(t.elem.innerHTML=n):3===i?t.elem.html(n):r[u](t.elem)&&(r[u](t.elem).innerHTML=n),t.jump&&t.jump(t,e),r[u]("layui-laypage-"+t.index));a.jump(i),t.hash&&!e&&(location.hash="!"+t.hash+"="+t.curr),a.skip(i)},{render:function(e){return new t(e).index},index:layui.laypage?layui.laypage.index+1e4:0,on:function(a,e,t){return a.attachEvent?a.attachEvent("on"+e,function(e){e.target=e.srcElement,t.call(a,e)}):a.addEventListener(e,t,!1),this}});e("laypage",o)});!function(i,D){"use strict";var n=i.layui&&layui.define,l={getPath:i.lay&&lay.getPath?lay.getPath:"",link:function(e,t,a){T.path&&i.lay&&lay.layui&&lay.layui.link(T.path+e,t,a)}},e=i.LAYUI_GLOBAL||{},a="laydate",d="lay-"+a+"-id",T={v:"5.6.0",config:{weekStart:0},index:i.laydate&&i.laydate.v?1e5:0,path:e.laydate_dir||l.getPath,set:function(e){var t=this;return t.config=lay.extend({},t.config,e),t},ready:function(e){var t="laydate",a=(n?"modules/":"")+"laydate.css?v="+T.v;return n?layui["layui.all"]?"function"==typeof e&&e():layui.addcss(a,e,t):l.link(a,e,t),this}},s=function(){var t=this,e=t.config.id;return(s.that[e]=t).inst={hint:function(e){t.hint.call(t,e)},reload:function(e){t.reload.call(t,e)},config:t.config}},M="layui-this",C="laydate-disabled",h=[100,2e5],v="layui-laydate-static",b="layui-laydate-list",o="laydate-selected",r="layui-laydate-hint",y="laydate-day-prev",m="laydate-day-next",E=".laydate-btns-confirm",L="laydate-time-text",I="laydate-btns-time",x="layui-laydate-preview",w="layui-laydate-shade",k=function(e){var t,a=this,n=(a.index=++T.index,a.config=lay.extend({},a.config,T.config,e),lay(e.elem||a.config.elem));return 1<n.length?(lay.each(n,function(){T.render(lay.extend({},a.config,{elem:this}))}),a):(e=lay.extend(a.config,lay.options(n[0])),n[0]&&n.attr(d)?(t=s.getThis(n.attr(d)))?t.reload(e):void 0:(e.id="id"in e?e.id:n.attr("id")||a.index,e.index=a.index,void T.ready(function(){a.init()})))},u="yyyy|y|MM|M|dd|d|HH|H|mm|m|ss|s";s.formatArr=function(e){return(e||"").match(new RegExp(u+"|.","g"))||[]},k.isLeapYear=function(e){return e%4==0&&e%100!=0||e%400==0},k.prototype.config={type:"date",range:!1,format:"yyyy-MM-dd",value:null,isInitValue:!0,min:"1900-1-1",max:"2099-12-31",trigger:"click",show:!1,showBottom:!0,isPreview:!0,btns:["clear","now","confirm"],lang:"cn",theme:"default",position:null,calendar:!1,mark:{},holidays:null,zIndex:null,done:null,change:null,autoConfirm:!0,shade:0},k.prototype.lang=function(){var e={cn:{weeks:["\u65e5","\u4e00","\u4e8c","\u4e09","\u56db","\u4e94","\u516d"],time:["\u65f6","\u5206","\u79d2"],timeTips:"\u9009\u62e9\u65f6\u95f4",startTime:"\u5f00\u59cb\u65f6\u95f4",endTime:"\u7ed3\u675f\u65f6\u95f4",dateTips:"\u8fd4\u56de\u65e5\u671f",month:["\u4e00","\u4e8c","\u4e09","\u56db","\u4e94","\u516d","\u4e03","\u516b","\u4e5d","\u5341","\u5341\u4e00","\u5341\u4e8c"],tools:{confirm:"\u786e\u5b9a",clear:"\u6e05\u7a7a",now:"\u73b0\u5728"},timeout:"\u7ed3\u675f\u65f6\u95f4\u4e0d\u80fd\u65e9\u4e8e\u5f00\u59cb\u65f6\u95f4<br>\u8bf7\u91cd\u65b0\u9009\u62e9",invalidDate:"\u4e0d\u5728\u6709\u6548\u65e5\u671f\u6216\u65f6\u95f4\u8303\u56f4\u5185",formatError:["\u65e5\u671f\u683c\u5f0f\u4e0d\u5408\u6cd5<br>\u5fc5\u987b\u9075\u5faa\u4e0b\u8ff0\u683c\u5f0f\uff1a<br>","<br>\u5df2\u4e3a\u4f60\u91cd\u7f6e"],preview:"\u5f53\u524d\u9009\u4e2d\u7684\u7ed3\u679c"},en:{weeks:["Su","Mo","Tu","We","Th","Fr","Sa"],time:["Hours","Minutes","Seconds"],timeTips:"Select Time",startTime:"Start Time",endTime:"End Time",dateTips:"Select Date",month:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],tools:{confirm:"Confirm",clear:"Clear",now:"Now"},timeout:"End time cannot be less than start Time<br>Please re-select",invalidDate:"Invalid date",formatError:["The date format error<br>Must be followed\uff1a<br>","<br>It has been reset"],preview:"The selected result"}};return e[this.config.lang]||e.cn},k.prototype.markerOfChineseFestivals={"0-1-1":"\u5143\u65e6","0-2-14":"\u60c5\u4eba","0-3-8":"\u5987\u5973","0-3-12":"\u690d\u6811","0-4-1":"\u611a\u4eba","0-5-1":"\u52b3\u52a8","0-5-4":"\u9752\u5e74","0-6-1":"\u513f\u7ae5","0-9-10":"\u6559\u5e08","0-10-1":"\u56fd\u5e86","0-12-25":"\u5723\u8bde"},k.prototype.reload=function(e){this.config=lay.extend({},this.config,e),this.init()},k.prototype.init=function(){var r=this,o=r.config,e="static"===o.position,t={year:"yyyy",month:"yyyy-MM",date:"yyyy-MM-dd",time:"HH:mm:ss",datetime:"yyyy-MM-dd HH:mm:ss"};o.elem=lay(o.elem),o.eventElem=lay(o.eventElem),o.elem[0]&&("array"!==layui.type(o.theme)&&(o.theme=[o.theme]),o.fullPanel&&("datetime"!==o.type||o.range)&&delete o.fullPanel,r.rangeStr=o.range?"string"==typeof o.range?o.range:"-":"",r.rangeLinked=!(!o.range||!o.rangeLinked||"date"!==o.type&&"datetime"!==o.type),r.autoCalendarModel=function(){var e=r.rangeLinked;return r.rangeLinked=o.range&&("date"===o.type||"datetime"===o.type)&&(!r.startDate||!r.endDate||r.startDate&&r.endDate&&r.startDate.year===r.endDate.year&&r.startDate.month===r.endDate.month),lay(r.elem)[r.rangeLinked?"addClass":"removeClass"]("layui-laydate-linkage"),r.rangeLinked!=e},r.autoCalendarModel.auto=r.rangeLinked&&"auto"===o.rangeLinked,"array"===layui.type(o.range)&&(r.rangeElem=[lay(o.range[0]),lay(o.range[1])]),t[o.type]||(i.console&&console.error&&console.error("laydate type error:'"+o.type+"' is not supported"),o.type="date"),o.format===t.date&&(o.format=t[o.type]||t.date),r.format=s.formatArr(o.format),o.weekStart&&!/^[0-6]$/.test(o.weekStart)&&(t=r.lang(),o.weekStart=t.weeks.indexOf(o.weekStart),-1===o.weekStart)&&(o.weekStart=0),r.EXP_IF="",r.EXP_SPLIT="",lay.each(r.format,function(e,t){e=new RegExp(u).test(t)?"\\d{"+(new RegExp(u).test(r.format[0===e?e+1:e-1]||"")?/^yyyy|y$/.test(t)?4:t.length:/^yyyy$/.test(t)?"1,4":/^y$/.test(t)?"1,308":"1,2")+"}":"\\"+t;r.EXP_IF=r.EXP_IF+e,r.EXP_SPLIT=r.EXP_SPLIT+"("+e+")"}),r.EXP_IF_ONE=new RegExp("^"+r.EXP_IF+"$"),r.EXP_IF=new RegExp("^"+(o.range?r.EXP_IF+"\\s\\"+r.rangeStr+"\\s"+r.EXP_IF:r.EXP_IF)+"$"),r.EXP_SPLIT=new RegExp("^"+r.EXP_SPLIT+"$",""),r.isInput(o.elem[0])||"focus"===o.trigger&&(o.trigger="click"),o.elem.attr("lay-key",r.index),o.eventElem.attr("lay-key",r.index),o.elem.attr(d,o.id),lay.each(["min","max"],function(e,t){var a=[],n=[];if("number"==typeof o[t])var i=o[t],l=new Date,l=r.newDate({year:l.getFullYear(),month:l.getMonth(),date:l.getDate(),hours:e?23:0,minutes:e?59:0,seconds:e?59:0}).getTime(),e=new Date(i?i<864e5?l+864e5*i:i:l),a=[e.getFullYear(),e.getMonth()+1,e.getDate()],n=[e.getHours(),e.getMinutes(),e.getSeconds()];else if("string"==typeof o[t])a=(o[t].match(/\d+-\d+-\d+/)||[""])[0].split("-"),n=(o[t].match(/\d+:\d+:\d+/)||[""])[0].split(":");else if("object"==typeof o[t])return o[t];o[t]={year:0|a[0]||(new Date).getFullYear(),month:a[1]?(0|a[1])-1:(new Date).getMonth(),date:0|a[2]||(new Date).getDate(),hours:0|n[0],minutes:0|n[1],seconds:0|n[2]}}),r.elemID="layui-laydate"+o.elem.attr("lay-key"),(o.show||e)&&r.render(),e||r.events(),"function"==typeof o.formatToDisplay&&(r.isInput(o.elem[0])?r.formatToDisplay(o.elem[0],o.formatToDisplay):(t=r.rangeElem)&&(r.formatToDisplay(t[0][0],o.formatToDisplay),r.formatToDisplay(t[1][0],o.formatToDisplay))),o.value)&&o.isInitValue&&("date"===layui.type(o.value)?r.setValue(r.parse(0,r.systemDate(o.value))):r.setValue(o.value))},k.prototype.render=function(){var a,n,i,l,r=this,o=r.config,d=r.lang(),s="static"===o.position,y=r.elem=lay.elem("div",{id:r.elemID,"class":["layui-laydate",o.range?" layui-laydate-range":"",r.rangeLinked?" layui-laydate-linkage":"",s?" "+v:"",o.fullPanel?" laydate-theme-fullpanel":"",(a="",lay.each(o.theme,function(e,t){"default"===t||/^#/.test(t)||(a+=" laydate-theme-"+t)}),a)].join("")}),m=r.elemMain=[],u=r.elemHeader=[],c=r.elemCont=[],h=r.table=[],e=r.footer=lay.elem("div",{"class":"layui-laydate-footer"}),t=r.shortcut=lay.elem("ul",{"class":"layui-laydate-shortcut"}),p=(o.zIndex&&(y.style.zIndex=o.zIndex),lay.each(new Array(2),function(e){if(!o.range&&0<e)return!0;var a=lay.elem("div",{"class":"layui-laydate-header"}),t=[((t=lay.elem("i",{"class":"layui-icon laydate-icon laydate-prev-y"})).innerHTML="&#xe65a;",t),((t=lay.elem("i",{"class":"layui-icon laydate-icon laydate-prev-m"})).innerHTML="&#xe603;",t),((t=lay.elem("div",{"class":"laydate-set-ym"})).appendChild(lay.elem("span")),t.appendChild(lay.elem("span")),t),((t=lay.elem("i",{"class":"layui-icon laydate-icon laydate-next-m"})).innerHTML="&#xe602;",t),((t=lay.elem("i",{"class":"layui-icon laydate-icon laydate-next-y"})).innerHTML="&#xe65b;",t)],n=lay.elem("div",{"class":"layui-laydate-content"}),i=lay.elem("table"),l=lay.elem("thead"),r=lay.elem("tr");lay.each(t,function(e,t){a.appendChild(t)}),l.appendChild(r),lay.each(new Array(6),function(a){var n=i.insertRow(0);lay.each(new Array(7),function(e){var t;0===a&&((t=lay.elem("th")).innerHTML=d.weeks[(e+o.weekStart)%7],r.appendChild(t)),n.insertCell(e)})}),i.insertBefore(l,i.children[0]),n.appendChild(i),m[e]=lay.elem("div",{"class":"layui-laydate-main laydate-main-list-"+e}),m[e].appendChild(a),m[e].appendChild(n),u.push(t),c.push(n),h.push(i)}),lay(e).html((p=[],n=[],"datetime"===o.type&&p.push('<span lay-type="datetime" class="'+I+'">'+d.timeTips+"</span>"),(o.range||"datetime"!==o.type||o.fullPanel)&&p.push('<span class="'+x+'" title="'+d.preview+'"></span>'),lay.each(o.btns,function(e,t){var a=d.tools[t]||"btn";o.range&&"now"===t||(s&&"clear"===t&&(a="cn"===o.lang?"\u91cd\u7f6e":"Reset"),n.push('<span lay-type="'+t+'" class="laydate-btns-'+t+'">'+a+"</span>"))}),p.push('<div class="laydate-footer-btns">'+n.join("")+"</div>"),p.join(""))),o.shortcuts&&(y.appendChild(t),lay(t).html((i=[],lay.each(o.shortcuts,function(e,t){i.push('<li data-index="'+e+'">'+t.text+"</li>")}),i.join(""))).find("li").on("click",function(e){var t=o.shortcuts[this.dataset.index]||{},t=("function"==typeof t.value?t.value():t.value)||[],n=(layui.isArray(t)||(t=[t]),o.type),t=(lay.each(t,function(e,t){var a=[o.dateTime,r.endDate][e];"time"===n&&"date"!==layui.type(t)?r.EXP_IF.test(t)&&(t=(t.match(r.EXP_SPLIT)||[]).slice(1),lay.extend(a,{hours:0|t[0],minutes:0|t[2],seconds:0|t[4]})):lay.extend(a,r.systemDate("date"===layui.type(t)?t:new Date(t))),"time"!==n&&"datetime"!==n||(r[["startTime","endTime"][e]]={hours:a.hours,minutes:a.minutes,seconds:a.seconds}),0===e?r.startDate=lay.extend({},a):r.endState=!0,"year"===n||"month"===n||"time"===n?r.listYM[e]=[a.year,a.month+1]:e&&r.autoCalendarModel.auto&&r.autoCalendarModel()}),r.checkDate("limit").calendar(null,null,"init"),lay(r.footer).find("."+I).removeClass(C));t&&"date"===t.attr("lay-type")&&t[0].click(),r.done(null,"change"),lay(this).addClass(M),"static"!==o.position&&r.setValue(r.parse()).done().remove()})),lay.each(m,function(e,t){y.appendChild(t)}),o.showBottom&&y.appendChild(e),lay.elem("style")),f=[],g=!0,t=(lay.each(o.theme,function(e,t){g&&/^#/.test(t)?(g=!(l=!0),f.push(["#{{id}} .layui-laydate-header{background-color:{{theme}};}","#{{id}} li.layui-this,#{{id}} td.layui-this>div{background-color:{{theme}} !important;}",-1!==o.theme.indexOf("circle")?"":"#{{id}} .layui-this{background-color:{{theme}} !important;}","#{{id}} .laydate-day-now{color:{{theme}} !important;}","#{{id}} .laydate-day-now:after{border-color:{{theme}} !important;}"].join("").replace(/{{id}}/g,r.elemID).replace(/{{theme}}/g,t))):!g&&/^#/.test(t)&&f.push(["#{{id}} .laydate-selected>div{background-color:{{theme}} !important;}","#{{id}} .laydate-selected:hover>div{background-color:{{theme}} !important;}"].join("").replace(/{{id}}/g,r.elemID).replace(/{{theme}}/g,t))}),o.shortcuts&&o.range&&f.push("#{{id}}.layui-laydate-range{width: 628px;}".replace(/{{id}}/g,r.elemID)),f.length&&(f=f.join(""),"styleSheet"in p?(p.setAttribute("type","text/css"),p.styleSheet.cssText=f):p.innerHTML=f,l&&lay(y).addClass("laydate-theme-molv"),y.appendChild(p)),r.remove(k.thisElemDate),T.thisId=o.id,s?o.elem.append(y):(D.body.appendChild(y),r.position()),o.shade?'<div class="'+w+'" style="z-index:'+(parseInt(layui.getStyle(y,"z-index"))-1)+"; background-color: "+(o.shade[1]||"#000")+"; opacity: "+(o.shade[0]||o.shade)+'"></div>':"");y.insertAdjacentHTML("beforebegin",t),r.checkDate().calendar(null,0,"init"),r.changeEvent(),k.thisElemDate=r.elemID,r.renderAdditional(),"function"==typeof o.ready&&o.ready(lay.extend({},o.dateTime,{month:o.dateTime.month+1})),r.preview()},k.prototype.remove=function(e){var t=this,a=t.config,n=lay("#"+(e||t.elemID));return n[0]&&(n.hasClass(v)||t.checkDate(function(){n.remove(),delete t.startDate,delete t.endDate,delete t.endState,delete t.startTime,delete t.endTime,delete T.thisId,"function"==typeof a.close&&a.close(t)}),lay("."+w).remove()),t},k.prototype.position=function(){var e=this.config;return lay.position(e.elem[0],this.elem,{position:e.position}),this},k.prototype.hint=function(e){var t=this,a=(t.config,lay.elem("div",{"class":r}));t.elem&&(a.innerHTML=(e="object"==typeof e?e||{}:{content:e}).content||"",lay(t.elem).find("."+r).remove(),t.elem.appendChild(a),clearTimeout(t.hinTimer),t.hinTimer=setTimeout(function(){lay(t.elem).find("."+r).remove()},"ms"in e?e.ms:3e3))},k.prototype.getAsYM=function(e,t,a){return a?t--:t++,t<0&&(t=11,e--),11<t&&(t=0,e++),[e,t]},k.prototype.systemDate=function(e){var t=e||new Date;return{year:t.getFullYear(),month:t.getMonth(),date:t.getDate(),hours:e?e.getHours():0,minutes:e?e.getMinutes():0,seconds:e?e.getSeconds():0}},k.prototype.checkDate=function(e){var t,o,a,n,i,d=this,s=(new Date,d.config),l=d.lang(),r=s.dateTime=s.dateTime||d.systemDate(),y=s.elem[0],m=(d.isInput(y),function(){if(d.rangeElem){var e=[d.rangeElem[0].val(),d.rangeElem[1].val()];if(e[0]&&e[1])return e.join(" "+d.rangeStr+" ")}return d.isInput(y)?y.value:"static"===s.position?"":lay(y).attr("lay-date")}()),u=function(e){e&&(e.year>h[1]&&(e.year=h[1],o=!0),11<e.month&&(e.month=11,o=!0),59<e.seconds&&(e.seconds=0,e.minutes++,o=!0),59<e.minutes&&(e.minutes=0,e.hours++,o=!0),23<e.hours&&(e.hours=0,o=!0),t=T.getEndDate(e.month+1,e.year),e.date>t)&&(e.date=t,o=!0)},c=function(n,i,l){var r=["startTime","endTime"];i=(i.match(d.EXP_SPLIT)||[]).slice(1),l=l||0,s.range&&(d[r[l]]=d[r[l]]||{}),lay.each(d.format,function(e,t){var a=parseFloat(i[e]);i[e].length<t.length&&(o=!0),/yyyy|y/.test(t)?(a<h[0]&&(a=h[0],o=!0),n.year=a):/MM|M/.test(t)?(a<1&&(a=1,o=!0),n.month=a-1):/dd|d/.test(t)?(a<1&&(a=1,o=!0),n.date=a):/HH|H/.test(t)?(a<0&&(o=!(a=0)),23<a&&(a=23,o=!0),n.hours=a,s.range&&(d[r[l]].hours=a)):/mm|m/.test(t)?(a<0&&(o=!(a=0)),59<a&&(a=59,o=!0),n.minutes=a,s.range&&(d[r[l]].minutes=a)):/ss|s/.test(t)&&(a<0&&(o=!(a=0)),59<a&&(a=59,o=!0),n.seconds=a,s.range)&&(d[r[l]].seconds=a)}),u(n)};return"limit"===e?s.range?(u(d.rangeLinked?d.startDate:r),d.endDate&&u(d.endDate)):u(r):("string"==typeof(m=m||s.value)&&(m=m.replace(/\s+/g," ").replace(/^\s|\s$/g,"")),(a=function(){var e,t,a;s.range&&(d.endDate=d.endDate||lay.extend({},s.dateTime,(e={},t=s.dateTime,a=d.getAsYM(t.year,t.month),"year"===s.type?e.year=t.year+1:"time"!==s.type&&(e.year=a[0],e.month=a[1]),"datetime"!==s.type&&"time"!==s.type||(e.hours=23,e.minutes=e.seconds=59),e)))})(),"string"==typeof m&&m?d.EXP_IF.test(m)?s.range?(m=m.split(" "+d.rangeStr+" "),lay.each([s.dateTime,d.endDate],function(e,t){c(t,m[e],e)})):c(r,m):(d.hint(l.formatError[0]+(s.range?s.format+" "+d.rangeStr+" "+s.format:s.format)+l.formatError[1]),o=!0):m&&"date"===layui.type(m)?s.dateTime=d.systemDate(m):(s.dateTime=d.systemDate(),delete d.startTime,delete d.endDate,a(),delete d.endTime),d.rangeElem&&(a=[d.rangeElem[0].val(),d.rangeElem[1].val()],n=[s.dateTime,d.endDate],lay.each(a,function(e,t){d.EXP_IF_ONE.test(t)&&c(n[e],t,e)})),u(r),s.range&&u(d.endDate),o&&m&&d.setValue(!s.range||d.endDate?d.parse():""),d.getDateTime(r)>d.getDateTime(s.max)?(r=s.dateTime=lay.extend({},s.max),i=!0):d.getDateTime(r)<d.getDateTime(s.min)&&(r=s.dateTime=lay.extend({},s.min),i=!0),s.range&&((d.getDateTime(d.endDate)<d.getDateTime(s.min)||d.getDateTime(d.endDate)>d.getDateTime(s.max))&&(d.endDate=lay.extend({},s.max),i=!0),d.startTime={hours:s.dateTime.hours,minutes:s.dateTime.minutes,seconds:s.dateTime.seconds},d.endTime={hours:d.endDate.hours,minutes:d.endDate.minutes,seconds:d.endDate.seconds},"month"===s.type)&&(s.dateTime.date=1,d.endDate.date=1),i&&m&&(d.setValue(d.parse()),d.hint("value "+l.invalidDate+l.formatError[1])),d.startDate=d.startDate||m&&lay.extend({},s.dateTime),d.autoCalendarModel.auto&&d.autoCalendarModel(),d.endState=!s.range||!d.rangeLinked||!(!d.startDate||!d.endDate),e&&e()),d},k.prototype.markRender=function(e,a,t){var n;"object"==typeof t?lay.each(t||{},function(e,t){e=e.split("-");e[0]!=a[0]&&0!=e[0]||e[1]!=a[1]&&0!=e[1]||e[2]!=a[2]||(n=t||a[2])}):"string"==typeof t&&(n=t||a[2]),n&&e.find("div").html('<span class="laydate-day-mark">'+n+"</span>")},k.prototype.mark=function(t,a){var n=this,e=n.config,i=function(e){n.markRender(t,a,e)};return e.calendar&&"cn"===e.lang&&i(n.markerOfChineseFestivals),"function"==typeof e.mark?e.mark({year:a[0],month:a[1],date:a[2]},i):"object"==typeof e.mark&&i(e.mark),n},k.prototype.holidaysRender=function(r,o,e){var d=["holidays","workdays"],s=function(e,t,a){e.find("div").html(["<span",' class="laydate-day-holidays"',' type="'+t+'"',">",a,"</span>"].join(""))};"array"===layui.type(e)?lay.each(e,function(l,e){lay.each(e,function(e,t){var a,n,i;t=t,a=r.attr("lay-ymd"),n=t.split("-"),i=a.split("-"),lay.each(n,function(e,t){n[e]=parseInt(t,10)}),lay.each(i,function(e,t){i[e]=parseInt(t,10)}),n.join("-")===i.join("-")&&s(r,d[l],o[2])})}):"string"==typeof e&&-1!==d.indexOf(e)&&s(r,e,o[2])},k.prototype.holidays=function(t,a){var n=this,e=n.config,i=function(e){n.holidaysRender(t,a,e)};return"function"==typeof e.holidays?e.holidays({year:a[0],month:a[1],date:a[2]},i):"array"===layui.type(e.holidays)&&i(e.holidays),n},k.prototype.cellRender=function(t,e,a){var n=this.config;return"function"==typeof n.cellRender&&n.cellRender(e,function(e){"string"==typeof e?lay(t).html(e):"object"==typeof e&&lay(t).html("").append(lay(e)[0])},{originElem:t,type:a}),this},k.prototype.startOfYear=function(e){e=new Date(e);return e.setFullYear(e.getFullYear(),0,1),e.setHours(0,0,0,0),e},k.prototype.endOfYear=function(e){var e=new Date(e),t=e.getFullYear();return e.setFullYear(t+1,0,0),e.setHours(23,59,59,999),e},k.prototype.startOfMonth=function(e){e=new Date(e);return e.setDate(1),e.setHours(0,0,0,0),e},k.prototype.endOfMonth=function(e){var e=new Date(e),t=e.getMonth();return e.setFullYear(e.getFullYear(),t+1,0),e.setHours(23,59,59,999),e},k.prototype.addDays=function(e,t){e=new Date(e);return t&&e.setDate(e.getDate()+t),e},k.prototype.isDisabledYearOrMonth=function(e,t,a){for(var n=this,i=n.config,l="year"===t?n.startOfYear(e):n.startOfMonth(e),t="year"===t?n.endOfYear(e):n.endOfMonth(e),r=Math.floor((t.getTime()-l.getTime())/864e5)+1,o=0,d=0;d<r;d++){var s=n.addDays(l,d);i.disabledDate.call(i,s,a)&&o++}return o===r},k.prototype.isDisabledDate=function(e,t){t=t||{};var a=this.config,n=!a.range||0===t.rangeType?"start":"end";return!!a.disabledDate&&"time"!==a.type&&("date"===t.disabledType||"datetime"===t.disabledType)&&((e=new Date(e)).setHours(0,0,0,0),"year"===t.type||"month"===t.type?this.isDisabledYearOrMonth(e,t.type,n):a.disabledDate.call(a,e,n))},k.prototype.isDisabledTime=function(e,t){t=t||{};var a,n=this.config,i=!n.range||0===t.rangeType?"start":"end";return!!n.disabledTime&&!("time"!==n.type&&"datetime"!==n.type||"time"!==t.disabledType&&"datetime"!==t.disabledType)&&(a=function(e,t,a){return function(){return-1!==("function"==typeof t&&t.apply(n,a)||[]).indexOf(e)}},e=this.systemDate(new Date(e)),i=n.disabledTime.call(n,this.newDate(e),i)||{},"datetime"===t.disabledType?a(e.hours,i.hours)()||a(e.minutes,i.minutes,[e.hours])()||a(e.seconds,i.seconds,[e.hours,e.minutes])():[a(e.hours,i.hours),a(e.minutes,i.minutes,[e.hours]),a(e.seconds,i.seconds,[e.hours,e.minutes])][t.time.length-1]())},k.prototype.isDisabledDateTime=function(e,t){this.config;return this.isDisabledDate(e,t=t||{})||this.isDisabledTime(e,t)},k.prototype.limit=function(t){t=t||{};var i=this,e=i.config,l={},a=t.index>(t.time?0:41)?i.endDate:e.dateTime;return lay.each({now:lay.extend({},a,t.date||{}),min:e.min,max:e.max},function(e,a){var n;l[e]=i.newDate(lay.extend({year:a.year,month:"year"===t.type?0:a.month,date:"year"===t.type||"month"===t.type?1:a.date},(n={},lay.each(t.time,function(e,t){n[t]=a[t]}),n))).getTime()}),a=l.now<l.min||l.max<l.now||i.isDisabledDateTime(l.now,t),t.elem&&t.elem[a?"addClass":"removeClass"](C),a},k.prototype.thisDateTime=function(e){var t=this.config;return e?this.endDate:t.dateTime},k.prototype.calendar=function(e,i,t){i=i?1:0;var l,r,o,d=this,a=d.config,s=e||d.thisDateTime(i),n=new Date,y=d.lang(),m="date"!==a.type&&"datetime"!==a.type,u=lay(d.table[i]).find("td"),c=lay(d.elemHeader[i][2]).find("span");return s.year<h[0]&&(s.year=h[0],d.hint(y.invalidDate)),s.year>h[1]&&(s.year=h[1],d.hint(y.invalidDate)),d.firstDate||(d.firstDate=lay.extend({},s)),n.setFullYear(s.year,s.month,1),l=(n.getDay()+(7-a.weekStart))%7,r=T.getEndDate(s.month||12,s.year),o=T.getEndDate(s.month+1,s.year),lay.each(u,function(e,t){var a,n=[s.year,s.month];(t=lay(t)).removeAttr("class"),e<l?(a=r-l+e,t.addClass("laydate-day-prev"),n=d.getAsYM(s.year,s.month,"sub")):l<=e&&e<o+l?(a=e-l,d.rangeLinked||a+1===s.date&&t.addClass(M)):(a=e-o-l,t.addClass("laydate-day-next"),n=d.getAsYM(s.year,s.month)),n[1]++,n[2]=a+1,t.attr("lay-ymd",n.join("-")).html("<div>"+n[2]+"</div>"),d.mark(t,n).holidays(t,n).limit({elem:t,date:{year:n[0],month:n[1]-1,date:n[2]},index:e,rangeType:i,disabledType:"date"}),d.cellRender(t,{year:n[0],month:n[1],date:n[2]},"date")}),lay(c[0]).attr("lay-ym",s.year+"-"+(s.month+1)),lay(c[1]).attr("lay-ym",s.year+"-"+(s.month+1)),d.panelYM||(d.panelYM={}),d.panelYM[i]={year:s.year,month:s.month},"cn"===a.lang?(lay(c[0]).attr("lay-type","year").html(s.year+" \u5e74"),lay(c[1]).attr("lay-type","month").html(s.month+1+" \u6708")):(lay(c[0]).attr("lay-type","month").html(y.month[s.month]),lay(c[1]).attr("lay-type","year").html(s.year)),m&&(a.range?!e&&"init"===t||(d.listYM=[[(d.startDate||a.dateTime).year,(d.startDate||a.dateTime).month+1],[d.endDate.year,d.endDate.month+1]],d.list(a.type,0).list(a.type,1),"time"===a.type?d.setBtnStatus("\u65f6\u95f4",lay.extend({},d.systemDate(),d.startTime),lay.extend({},d.systemDate(),d.endTime)):d.setBtnStatus(!0)):(d.listYM=[[s.year,s.month+1]],d.list(a.type,0))),a.range&&"init"===t&&(d.rangeLinked?(n=d.getAsYM(s.year,s.month,i?"sub":null),d.calendar(lay.extend({},s,{year:n[0],month:n[1]}),1-i)):d.calendar(null,1-i)),a.range||(u=["hours","minutes","seconds"],d.limit({elem:lay(d.footer).find(".laydate-btns-now"),date:d.systemDate(/^(datetime|time)$/.test(a.type)?new Date:null),index:0,time:u,disabledType:"datetime"}),d.limit({elem:lay(d.footer).find(E),index:0,time:u,disabledType:"datetime"})),d.setBtnStatus(),lay(d.shortcut).find("li."+M).removeClass(M),a.range&&!m&&"init"!==t&&d.stampRange(),d},k.prototype.list=function(n,i){var l,r,e,a,o,d,t,s=this,y=s.config,m=s.rangeLinked?y.dateTime:[y.dateTime,s.endDate][i],u=s.lang(),c=y.range&&"date"!==y.type&&"datetime"!==y.type,h=lay.elem("ul",{"class":b+" "+{year:"laydate-year-list",month:"laydate-month-list",time:"laydate-time-list"}[n]}),p=s.elemHeader[i],f=lay(p[2]).find("span"),g=s.elemCont[i||0],D=lay(g).find("."+b)[0],T="cn"===y.lang,v=T?"\u5e74":"",x=s.listYM[i]||{},w=["hours","minutes","seconds"],k=["startTime","endTime"][i];return x[0]<1&&(x[0]=1),"year"===n?(e=l=x[0]-7,l<1&&(e=l=1),lay.each(new Array(15),function(e){var t=lay.elem("li",{"lay-ym":l}),a={year:l,month:0,date:1};l==x[0]&&lay(t).addClass(M),t.innerHTML=l+v,h.appendChild(t),s.limit({elem:lay(t),date:a,index:i,type:n,rangeType:i,disabledType:"date"}),s.cellRender(t,{year:l,month:1,date:1},"year"),l++}),lay(f[T?0:1]).attr("lay-ym",l-8+"-"+x[1]).html(e+v+" - "+(l-1)+v)):"month"===n?(lay.each(new Array(12),function(e){var t=lay.elem("li",{"lay-ym":e}),a={year:x[0],month:e,date:1};e+1==x[1]&&lay(t).addClass(M),t.innerHTML=u.month[e]+(T?"\u6708":""),h.appendChild(t),s.limit({elem:lay(t),date:a,index:i,type:n,rangeType:i,disabledType:"date"}),s.cellRender(t,{year:x[0],month:e+1,date:1},"month")}),lay(f[T?0:1]).attr("lay-ym",x[0]+"-"+x[1]).html(x[0]+v)):"time"===n&&(r=function(){lay(h).find("ol").each(function(a,e){lay(e).find("li").each(function(e,t){s.limit({elem:lay(t),date:[{hours:e},{hours:s[k].hours,minutes:e},{hours:s[k].hours,minutes:s[k].minutes,seconds:e}][a],index:i,rangeType:i,disabledType:"time",time:[["hours"],["hours","minutes"],["hours","minutes","seconds"]][a]})})}),y.range||s.limit({elem:lay(s.footer).find(E),date:s[k],index:0,time:["hours","minutes","seconds"],disabledType:"datetime"})},y.range?s[k]||(s[k]="startTime"===k?m:s.endDate):s[k]=m,lay.each([24,60,60],function(t,e){var a=lay.elem("li"),n=["<p>"+u.time[t]+"</p><ol>"];lay.each(new Array(e),function(e){n.push("<li"+(s[k][w[t]]===e?' class="'+M+'"':"")+">"+lay.digit(e,2)+"</li>")}),a.innerHTML=n.join("")+"</ol>",h.appendChild(a)}),r(),e=-1!==y.format.indexOf("H"),f=-1!==y.format.indexOf("m"),t=-1!==y.format.indexOf("s"),a=h.children,o=0,lay.each([e,f,t],function(e,t){t||(a[e].className+=" layui-hide",o++)}),h.className+=" laydate-time-list-hide-"+o),D&&g.removeChild(D),g.appendChild(h),"year"===n||"month"===n?(lay(s.elemMain[i]).addClass("laydate-ym-show"),lay(h).find("li").on("click",function(){var e,t,a=0|lay(this).attr("lay-ym");lay(this).hasClass(C)||(s.rangeLinked?lay.extend(m,{year:"year"===n?a:x[0],month:"year"===n?x[1]-1:a}):m[n]=a,e=-1!==["year","month"].indexOf(y.type),t="year"===n&&-1!==["date","datetime"].indexOf(y.type),e||t?(lay(h).find("."+M).removeClass(M),lay(this).addClass(M),("month"===y.type&&"year"===n||t)&&(s.listYM[i][0]=a,c&&((i?s.endDate:m).year=a),s.list("month",i))):(s.checkDate("limit").calendar(m,i,"init"),s.closeList()),s.setBtnStatus(),!y.range&&y.autoConfirm&&("month"===y.type&&"month"===n||"year"===y.type&&"year"===n)&&s.setValue(s.parse()).done().remove(),s.autoCalendarModel.auto&&!s.rangeLinked?s.choose(lay(g).find("td.layui-this"),i):s.endState&&s.done(null,"change"),lay(s.footer).find("."+I).removeClass(C))})):(f=lay.elem("span",{"class":L}),d=function(){lay(h).find("ol").each(function(e){var a=this,t=lay(a).find("li");a.scrollTop=30*(s[k][w[e]]-2),a.scrollTop<=0&&t.each(function(e,t){if(!lay(this).hasClass(C))return a.scrollTop=30*(e-2),!0})})},t=lay(p[2]).find("."+L),d(),f.innerHTML=y.range?[u.startTime,u.endTime][i]:u.timeTips,lay(s.elemMain[i]).addClass("laydate-time-show"),t[0]&&t.remove(),p[2].appendChild(f),(D=lay(h).find("ol")).each(function(t){var a=this;lay(a).find("li").on("click",function(){var e=0|this.innerHTML;lay(this).hasClass(C)||(y.range?s[k][w[t]]=e:m[w[t]]=e,lay(a).find("."+M).removeClass(M),lay(this).addClass(M),r(),d(),!s.endDate&&"time"!==y.type&&"datetime"!==y.type||s.done(null,"change"),s.setBtnStatus())})}),layui.device().mobile&&D.css({overflowY:"auto",touchAction:"pan-y"})),s},k.prototype.listYM=[],k.prototype.closeList=function(){var a=this;a.config;lay.each(a.elemCont,function(e,t){lay(this).find("."+b).remove(),lay(a.elemMain[e]).removeClass("laydate-ym-show laydate-time-show")}),lay(a.elem).find("."+L).remove()},k.prototype.setBtnStatus=function(e,t,a){var n=this,i=n.config,l=n.lang(),r=lay(n.footer).find(E),o="datetime"===i.type||"time"===i.type?["hours","minutes","seconds"]:undefined;i.range&&(t=t||(n.rangeLinked?n.startDate:i.dateTime),a=a||n.endDate,i=!n.endState||n.newDate(t).getTime()>n.newDate(a).getTime(),n.limit({date:t,disabledType:"datetime",time:o,rangeType:0})||n.limit({date:a,disabledType:"datetime",time:o,rangeType:1})?r.addClass(C):r[i?"addClass":"removeClass"](C),e)&&i&&n.hint("string"==typeof e?l.timeout.replace(/\u65e5\u671f/g,e):l.timeout)},k.prototype.parse=function(e,t){var a=this,n=a.config,i=a.rangeLinked?a.startDate:n.dateTime,t=t||("end"==e?lay.extend({},a.endDate,a.endTime):n.range?lay.extend({},i||n.dateTime,a.startTime):n.dateTime),i=T.parse(t,a.format,1);return n.range&&e===undefined?i+" "+a.rangeStr+" "+a.parse("end"):i},k.prototype.newDate=function(e){return e=e||{},new Date(e.year||1,e.month||0,e.date||1,e.hours||0,e.minutes||0,e.seconds||0)},k.prototype.getDateTime=function(e){return this.newDate(e).getTime()},k.prototype.formatToDisplay=function(e,t){var a=this,n=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,"value");Object.defineProperty(e,"value",lay.extend({},n,{get:function(){return this.getAttribute("lay-date")},set:function(e){n.set.call(this,t.call(a,e)),this.setAttribute("lay-date",e)}}))},k.prototype.setValue=function(e){var t,a=this,n=a.config,i=n.elem[0];return"static"!==n.position&&(e=e||"",a.isInput(i)?lay(i).val(e):(t=a.rangeElem)?("array"!==layui.type(e)&&(e=e.split(" "+a.rangeStr+" ")),t[0].val(e[0]||""),t[1].val(e[1]||"")):(0===lay(i).find("*").length&&(t="function"==typeof n.formatToDisplay?n.formatToDisplay(e):e,lay(i).html(t)),lay(i).attr("lay-date",e))),a},k.prototype.preview=function(){var e,t=this,a=t.config;a.isPreview&&(e=lay(t.elem).find("."+x),a=!a.range||(t.rangeLinked?t.endState:t.endDate)?t.parse():"",e.html(a),e.html())&&(e.css({color:"#16b777"}),setTimeout(function(){e.css({color:"#777"})},300))},k.prototype.renderAdditional=function(){this.config.fullPanel&&this.list("time",0)},k.prototype.stampRange=function(){var n,i=this,l=i.config,r=i.rangeLinked?i.startDate:l.dateTime,e=lay(i.elem).find("td");l.range&&!i.endState&&lay(i.footer).find(E).addClass(C),r=r&&i.newDate({year:r.year,month:r.month,date:r.date}).getTime(),n=i.endState&&i.endDate&&i.newDate({year:i.endDate.year,month:i.endDate.month,date:i.endDate.date}).getTime(),lay.each(e,function(e,t){var a=lay(t).attr("lay-ymd").split("-"),a=i.newDate({year:a[0],month:a[1]-1,date:a[2]}).getTime();l.rangeLinked&&!i.startDate&&a===i.newDate(i.systemDate()).getTime()&&lay(t).addClass(lay(t).hasClass(y)||lay(t).hasClass(m)?"":"laydate-day-now"),lay(t).removeClass(o+" "+M),a!==r&&a!==n||(i.rangeLinked||!i.rangeLinked&&(e<42?a===r:a===n))&&lay(t).addClass(lay(t).hasClass(y)||lay(t).hasClass(m)?o:M),r<a&&a<n&&lay(t).addClass(o)})},k.prototype.done=function(e,t){var a=this,n=a.config,i=lay.extend({},lay.extend(a.rangeLinked?a.startDate:n.dateTime,a.startTime)),l=lay.extend({},lay.extend(a.endDate,a.endTime));return lay.each([i,l],function(e,t){"month"in t&&lay.extend(t,{month:t.month+1})}),a.preview(),e=e||[a.parse(),i,l],"change"===t&&a.renderAdditional(),"function"==typeof n[t||"done"]&&n[t||"done"].apply(n,e),a},k.prototype.checkPanelDate=function(e,t){var a,n=this.config;if("date"===n.type||"datetime"===n.type)return n=0===t,e=e.month+1,a=this.panelYM[t].month+1,n=this.endState&&(n&&a<e||!n&&e<a)?1-t:t,{needFullRender:e!==a,index:n}},k.prototype.choose=function(e,a){var n,i,t,l,r,o,d;e.hasClass(C)||(i=(n=this).config,t=a,n.rangeLinked&&(n.endState||!n.startDate?(a=0,n.endState=!1):(a=1,n.endState=!0)),l=n.thisDateTime(a),lay(n.elem).find("td"),e={year:0|(e=e.attr("lay-ymd").split("-"))[0],month:(0|e[1])-1,date:0|e[2]},lay.extend(l,e),i.range?(lay.each(["startTime","endTime"],function(e,t){n[t]=n[t]||{hours:e?23:0,minutes:e?59:0,seconds:e?59:0},a===e&&(n.getDateTime(lay.extend({},l,n[t]))<n.getDateTime(i.min)?(n[t]={hours:i.min.hours,minutes:i.min.minutes,seconds:i.min.seconds},lay.extend(l,n[t])):n.getDateTime(lay.extend({},l,n[t]))>n.getDateTime(i.max)&&(n[t]={hours:i.max.hours,minutes:i.max.minutes,seconds:i.max.seconds},lay.extend(l,n[t])))}),a||(n.startDate=lay.extend({},l)),n.endState&&!n.limit({date:n.rangeLinked?n.startDate:n.thisDateTime(1-a),disabledType:"date"})&&(((r=n.endState&&n.autoCalendarModel.auto?n.autoCalendarModel():r)||n.rangeLinked&&n.endState)&&n.newDate(n.startDate)>n.newDate(n.endDate)&&(n.startDate.year===n.endDate.year&&n.startDate.month===n.endDate.month&&n.startDate.date===n.endDate.date&&(o=n.startTime,n.startTime=n.endTime,n.endTime=o),o=n.startDate,n.startDate=lay.extend({},n.endDate,n.startTime),i.dateTime=lay.extend({},n.startDate),n.endDate=lay.extend({},o,n.endTime)),r)&&(i.dateTime=lay.extend({},n.startDate)),n.rangeLinked?(e=n.checkPanelDate(l,t),o=lay.extend({},l),d=r||e&&e.needFullRender?"init":null,e=e?e.index:t,n.calendar(o,e,d)):n.calendar(null,a,r?"init":null),n.endState&&n.done(null,"change")):"static"===i.position?n.calendar().done().done(null,"change"):"date"===i.type?i.autoConfirm?n.setValue(n.parse()).done().remove():n.calendar().done(null,"change"):"datetime"===i.type&&n.calendar().done(null,"change"))},k.prototype.tool=function(t,e){var a=this,n=a.config,i=a.lang(),l=n.dateTime,r="static"===n.position,o={datetime:function(){lay(t).hasClass(C)||(a.list("time",0),n.range&&a.list("time",1),lay(t).attr("lay-type","date").html(a.lang().dateTips))},date:function(){a.closeList(),lay(t).attr("lay-type","datetime").html(a.lang().timeTips)},clear:function(){r&&(lay.extend(l,a.firstDate),a.calendar()),n.range&&(delete n.dateTime,delete a.endDate,delete a.startTime,delete a.endTime),a.setValue(""),a.done(null,"onClear").done(["",{},{}]).remove()},now:function(){var e=new Date;if(lay(t).hasClass(C))return a.hint(i.tools.now+", "+i.invalidDate);lay.extend(l,a.systemDate(),{hours:e.getHours(),minutes:e.getMinutes(),seconds:e.getSeconds()}),a.setValue(a.parse()),r&&a.calendar(),a.done(null,"onNow").done().remove()},confirm:function(){if(n.range){if(lay(t).hasClass(C))return("time"===n.type?a.startTime&&a.endTime&&a.newDate(a.startTime)>a.newDate(a.endTime):a.startDate&&a.endDate&&a.newDate(lay.extend({},a.startDate,a.startTime||{}))>a.newDate(lay.extend({},a.endDate,a.endTime||{})))?a.hint("time"===n.type?i.timeout.replace(/\u65e5\u671f/g,"\u65f6\u95f4"):i.timeout):a.hint(i.invalidDate)}else if(lay(t).hasClass(C))return a.hint(i.invalidDate);a.setValue(a.parse()),a.done(null,"onConfirm").done().remove()}};o[e]&&o[e]()},k.prototype.change=function(n){var i=this,l=i.config,r=i.thisDateTime(n),o=l.range&&("year"===l.type||"month"===l.type),d=i.elemCont[n||0],s=i.listYM[n],e=function(e){var t=lay(d).find(".laydate-year-list")[0],a=lay(d).find(".laydate-month-list")[0];return t&&(s[0]=e?s[0]-15:s[0]+15,i.list("year",n)),a&&(e?s[0]--:s[0]++,i.list("month",n)),(t||a)&&(lay.extend(r,{year:s[0]}),o&&(r.year=s[0]),l.range||i.done(null,"change"),l.range||i.limit({elem:lay(i.footer).find(E),date:{year:s[0]},disabledType:"datetime"})),i.setBtnStatus(),t||a};return{prevYear:function(){e("sub")||(i.rangeLinked?(l.dateTime.year--,i.checkDate("limit").calendar(null,null,"init")):(r.year--,i.checkDate("limit").calendar(null,n),i.autoCalendarModel.auto?i.choose(lay(d).find("td.layui-this"),n):i.done(null,"change")))},prevMonth:function(){var e,t;i.rangeLinked?(t=i.panelYM[0],t=i.getAsYM(t.year,t.month,"sub"),e=lay.extend({},l.dateTime,i.panelYM[0],{year:t[0],month:t[1]}),i.checkDate("limit").calendar(e,null,"init")):(t=i.getAsYM(r.year,r.month,"sub"),lay.extend(r,{year:t[0],month:t[1]}),i.checkDate("limit").calendar(null,null,"init"),i.autoCalendarModel.auto?i.choose(lay(d).find("td.layui-this"),n):i.done(null,"change"))},nextMonth:function(){var e,t;i.rangeLinked?(t=i.panelYM[0],t=i.getAsYM(t.year,t.month),e=lay.extend({},l.dateTime,i.panelYM[0],{year:t[0],month:t[1]}),i.checkDate("limit").calendar(e,null,"init")):(t=i.getAsYM(r.year,r.month),lay.extend(r,{year:t[0],month:t[1]}),i.checkDate("limit").calendar(null,null,"init"),i.autoCalendarModel.auto?i.choose(lay(d).find("td.layui-this"),n):i.done(null,"change"))},nextYear:function(){e()||(i.rangeLinked?(l.dateTime.year++,i.checkDate("limit").calendar(null,0,"init")):(r.year++,i.checkDate("limit").calendar(null,n),i.autoCalendarModel.auto?i.choose(lay(d).find("td.layui-this"),n):i.done(null,"change")))}}},k.prototype.changeEvent=function(){var i=this;i.config;lay(i.elem).on("click",function(e){lay.stope(e)}).on("mousedown",function(e){lay.stope(e)}),lay.each(i.elemHeader,function(n,e){lay(e[0]).on("click",function(e){i.change(n).prevYear()}),lay(e[1]).on("click",function(e){i.change(n).prevMonth()}),lay(e[2]).find("span").on("click",function(e){var t=lay(this),a=t.attr("lay-ym"),t=t.attr("lay-type");a&&(a=a.split("-"),i.listYM[n]=[0|a[0],0|a[1]],i.list(t,n),lay(i.footer).find("."+I).addClass(C))}),lay(e[3]).on("click",function(e){i.change(n).nextMonth()}),lay(e[4]).on("click",function(e){i.change(n).nextYear()})}),lay.each(i.table,function(e,t){lay(t).find("td").on("click",function(){i.choose(lay(this),e)})}),lay(i.footer).find("span").on("click",function(){var e=lay(this).attr("lay-type");i.tool(this,e)})},k.prototype.isInput=function(e){return/input|textarea/.test(e.tagName.toLocaleLowerCase())||/INPUT|TEXTAREA/.test(e.tagName)},k.prototype.events=function(){var e,t=this,a=t.config;a.elem[0]&&!a.elem[0].eventHandler&&(a.elem.on(a.trigger,e=function(){T.thisId!==a.id&&t.render()}),a.elem[0].eventHandler=!0,a.eventElem.on(a.trigger,e),t.unbind=function(){t.remove(),a.elem.off(a.trigger,e),a.elem.removeAttr("lay-key"),a.elem.removeAttr(d),a.elem[0].eventHandler=!1,a.eventElem.off(a.trigger,e),a.eventElem.removeAttr("lay-key"),delete s.that[a.id]})},s.that={},s.getThis=function(e){var t=s.that[e];return!t&&n&&layui.hint().error(e?a+" instance with ID '"+e+"' not found":"ID argument required"),t},l.run=function(n){n(D).on("mousedown",function(e){var t,a;T.thisId&&(t=s.getThis(T.thisId))&&(a=t.config,e.target===a.elem[0]||e.target===a.eventElem[0]||e.target===n(a.closeStop)[0]||a.elem[0]&&a.elem[0].contains(e.target)||t.remove())}).on("keydown",function(e){var t;T.thisId&&(t=s.getThis(T.thisId))&&"static"!==t.config.position&&13===e.keyCode&&n("#"+t.elemID)[0]&&t.elemID===k.thisElemDate&&(e.preventDefault(),n(t.footer).find(E)[0].click())}),n(i).on("resize",function(){if(T.thisId){var e=s.getThis(T.thisId);if(e)return!(!e.elem||!n(".layui-laydate")[0])&&void e.position()}})},T.render=function(e){e=new k(e);return s.call(e)},T.reload=function(e,t){e=s.getThis(e);if(e)return e.reload(t)},T.getInst=function(e){e=s.getThis(e);if(e)return e.inst},T.hint=function(e,t){e=s.getThis(e);if(e)return e.hint(t)},T.unbind=function(e){e=s.getThis(e);if(e)return e.unbind()},T.close=function(e){e=s.getThis(e||T.thisId);if(e)return e.remove()},T.parse=function(a,n,i){return a=a||{},n=((n="string"==typeof n?s.formatArr(n):n)||[]).concat(),lay.each(n,function(e,t){/yyyy|y/.test(t)?n[e]=lay.digit(a.year,t.length):/MM|M/.test(t)?n[e]=lay.digit(a.month+(i||0),t.length):/dd|d/.test(t)?n[e]=lay.digit(a.date,t.length):/HH|H/.test(t)?n[e]=lay.digit(a.hours,t.length):/mm|m/.test(t)?n[e]=lay.digit(a.minutes,t.length):/ss|s/.test(t)&&(n[e]=lay.digit(a.seconds,t.length))}),n.join("")},T.getEndDate=function(e,t){var a=new Date;return a.setFullYear(t||a.getFullYear(),e||a.getMonth()+1,1),new Date(a.getTime()-864e5).getDate()},n?(T.ready(),layui.define("lay",function(e){T.path=layui.cache.dir,l.run(lay),e(a,T)})):"function"==typeof define&&define.amd?define(function(){return l.run(lay),T}):(T.ready(),l.run(i.lay),i.laydate=T)}(window,window.document);!function(e,t){"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e):function(e){if(e.document)return t(e);throw new Error("jQuery requires a window with a document")}:t(e)}("undefined"!=typeof window?window:this,function(T,M){var f=[],g=T.document,c=f.slice,O=f.concat,R=f.push,P=f.indexOf,B={},W=B.toString,m=B.hasOwnProperty,y={},e="1.12.4",C=function(e,t){return new C.fn.init(e,t)},I=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,$=/^-ms-/,z=/-([\da-z])/gi,X=function(e,t){return t.toUpperCase()};function U(e){var t=!!e&&"length"in e&&e.length,n=C.type(e);return"function"!==n&&!C.isWindow(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}C.fn=C.prototype={jquery:e,constructor:C,selector:"",length:0,toArray:function(){return c.call(this)},get:function(e){return null!=e?e<0?this[e+this.length]:this[e]:c.call(this)},pushStack:function(e){e=C.merge(this.constructor(),e);return e.prevObject=this,e.context=this.context,e},each:function(e){return C.each(this,e)},map:function(n){return this.pushStack(C.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(c.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,e=+e+(e<0?t:0);return this.pushStack(0<=e&&e<t?[this[e]]:[])},end:function(){return this.prevObject||this.constructor()},push:R,sort:f.sort,splice:f.splice},C.extend=C.fn.extend=function(){var e,t,n,r,i,o=arguments[0]||{},a=1,s=arguments.length,u=!1;for("boolean"==typeof o&&(u=o,o=arguments[a]||{},a++),"object"==typeof o||C.isFunction(o)||(o={}),a===s&&(o=this,a--);a<s;a++)if(null!=(r=arguments[a]))for(n in r)i=o[n],o!==(t=r[n])&&(u&&t&&(C.isPlainObject(t)||(e=C.isArray(t)))?(i=e?(e=!1,i&&C.isArray(i)?i:[]):i&&C.isPlainObject(i)?i:{},o[n]=C.extend(u,i,t)):t!==undefined&&(o[n]=t));return o},C.extend({expando:"jQuery"+(e+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isFunction:function(e){return"function"===C.type(e)},isArray:Array.isArray||function(e){return"array"===C.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){var t=e&&e.toString();return!C.isArray(e)&&0<=t-parseFloat(t)+1},isEmptyObject:function(e){for(var t in e)return!1;return!0},isPlainObject:function(e){if(!e||"object"!==C.type(e)||e.nodeType||C.isWindow(e))return!1;try{if(e.constructor&&!m.call(e,"constructor")&&!m.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}if(!y.ownFirst)for(var t in e)return m.call(e,t);for(t in e);return t===undefined||m.call(e,t)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?B[W.call(e)]||"object":typeof e},globalEval:function(e){e&&C.trim(e)&&(T.execScript||function(e){T.eval.call(T,e)})(e)},camelCase:function(e){return e.replace($,"ms-").replace(z,X)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t){var n,r=0;if(U(e))for(n=e.length;r<n&&!1!==t.call(e[r],r,e[r]);r++);else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?"":(e+"").replace(I,"")},makeArray:function(e,t){t=t||[];return null!=e&&(U(Object(e))?C.merge(t,"string"==typeof e?[e]:e):R.call(t,e)),t},inArray:function(e,t,n){var r;if(t){if(P)return P.call(t,e,n);for(r=t.length,n=n?n<0?Math.max(0,r+n):n:0;n<r;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;)e[i++]=t[r++];if(n!=n)for(;t[r]!==undefined;)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(U(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 O.apply([],a)},guid:1,proxy:function(e,t){var n,r;return"string"==typeof t&&(r=e[t],t=e,e=r),C.isFunction(e)?(n=c.call(arguments,2),(r=function(){return e.apply(t||this,n.concat(c.call(arguments)))}).guid=e.guid=e.guid||C.guid++,r):undefined},now:function(){return+new Date},support:y}),"function"==typeof Symbol&&(C.fn[Symbol.iterator]=f[Symbol.iterator]),C.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){B["[object "+t+"]"]=t.toLowerCase()});var e=function(M){var e,g,b,o,O,w,R,P,T,u,l,C,E,t,N,m,r,i,y,k="sizzle"+ +new Date,v=M.document,S=0,B=0,W=le(),I=le(),A=le(),$=function(e,t){return e===t&&(l=!0),0},z={}.hasOwnProperty,n=[],X=n.pop,U=n.push,D=n.push,V=n.slice,j=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},Y="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",a="[\\x20\\t\\r\\n\\f]",s="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",J="\\["+a+"*("+s+")(?:"+a+"*([*^$|!~]?=)"+a+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+s+"))|)"+a+"*\\]",G=":("+s+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+J+")*)|.*)\\)|)",K=new RegExp(a+"+","g"),L=new RegExp("^"+a+"+|((?:^|[^\\\\])(?:\\\\.)*)"+a+"+$","g"),Q=new RegExp("^"+a+"*,"+a+"*"),Z=new RegExp("^"+a+"*([>+~]|"+a+")"+a+"*"),ee=new RegExp("="+a+"*([^\\]'\"]*?)"+a+"*\\]","g"),te=new RegExp(G),ne=new RegExp("^"+s+"$"),f={ID:new RegExp("^#("+s+")"),CLASS:new RegExp("^\\.("+s+")"),TAG:new RegExp("^("+s+"|[*])"),ATTR:new RegExp("^"+J),PSEUDO:new RegExp("^"+G),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+a+"*(even|odd|(([+-]|)(\\d*)n|)"+a+"*(?:([+-]|)"+a+"*(\\d+)|))"+a+"*\\)|)","i"),bool:new RegExp("^(?:"+Y+")$","i"),needsContext:new RegExp("^"+a+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+a+"*((?:-\\d)?\\d*)"+a+"*\\)|)(?=[^-]|$)","i")},re=/^(?:input|select|textarea|button)$/i,ie=/^h\d$/i,c=/^[^{]+\{\s*\[native \w/,oe=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ae=/[+~]/,se=/'|\\/g,d=new RegExp("\\\\([\\da-f]{1,6}"+a+"?|("+a+")|.)","ig"),p=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(65536+r):String.fromCharCode(r>>10|55296,1023&r|56320)},ue=function(){C()};try{D.apply(n=V.call(v.childNodes),v.childNodes),n[v.childNodes.length].nodeType}catch(F){D={apply:n.length?function(e,t){U.apply(e,V.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}function H(e,t,n,r){var i,o,a,s,u,l,c,f,d=t&&t.ownerDocument,p=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==p&&9!==p&&11!==p)return n;if(!r&&((t?t.ownerDocument||t:v)!==E&&C(t),t=t||E,N)){if(11!==p&&(l=oe.exec(e)))if(i=l[1]){if(9===p){if(!(a=t.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(d&&(a=d.getElementById(i))&&y(t,a)&&a.id===i)return n.push(a),n}else{if(l[2])return D.apply(n,t.getElementsByTagName(e)),n;if((i=l[3])&&g.getElementsByClassName&&t.getElementsByClassName)return D.apply(n,t.getElementsByClassName(i)),n}if(g.qsa&&!A[e+" "]&&(!m||!m.test(e))){if(1!==p)d=t,f=e;else if("object"!==t.nodeName.toLowerCase()){for((s=t.getAttribute("id"))?s=s.replace(se,"\\$&"):t.setAttribute("id",s=k),o=(c=w(e)).length,u=ne.test(s)?"#"+s:"[id='"+s+"']";o--;)c[o]=u+" "+_(c[o]);f=c.join(","),d=ae.test(e)&&de(t.parentNode)||t}if(f)try{return D.apply(n,d.querySelectorAll(f)),n}catch(h){}finally{s===k&&t.removeAttribute("id")}}}return P(e.replace(L,"$1"),t,n,r)}function le(){var n=[];function r(e,t){return n.push(e+" ")>b.cacheLength&&delete r[n.shift()],r[e+" "]=t}return r}function q(e){return e[k]=!0,e}function h(e){var t=E.createElement("div");try{return!!e(t)}catch(F){return!1}finally{t.parentNode&&t.parentNode.removeChild(t)}}function ce(e,t){for(var n=e.split("|"),r=n.length;r--;)b.attrHandle[n[r]]=t}function fe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||1<<31)-(~e.sourceIndex||1<<31);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function x(a){return q(function(o){return o=+o,q(function(e,t){for(var n,r=a([],e.length,o),i=r.length;i--;)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function de(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in g=H.support={},O=H.isXML=function(e){e=e&&(e.ownerDocument||e).documentElement;return!!e&&"HTML"!==e.nodeName},C=H.setDocument=function(e){var e=e?e.ownerDocument||e:v;return e!==E&&9===e.nodeType&&e.documentElement&&(t=(E=e).documentElement,N=!O(E),(e=E.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",ue,!1):e.attachEvent&&e.attachEvent("onunload",ue)),g.attributes=h(function(e){return e.className="i",!e.getAttribute("className")}),g.getElementsByTagName=h(function(e){return e.appendChild(E.createComment("")),!e.getElementsByTagName("*").length}),g.getElementsByClassName=c.test(E.getElementsByClassName),g.getById=h(function(e){return t.appendChild(e).id=k,!E.getElementsByName||!E.getElementsByName(k).length}),g.getById?(b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&N)return(e=t.getElementById(e))?[e]:[]},b.filter.ID=function(e){var t=e.replace(d,p);return function(e){return e.getAttribute("id")===t}}):(delete b.find.ID,b.filter.ID=function(e){var t=e.replace(d,p);return function(e){e="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return e&&e.value===t}}),b.find.TAG=g.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):g.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"!==e)return o;for(;n=o[i++];)1===n.nodeType&&r.push(n);return r},b.find.CLASS=g.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&N)return t.getElementsByClassName(e)},r=[],m=[],(g.qsa=c.test(E.querySelectorAll))&&(h(function(e){t.appendChild(e).innerHTML="<a id='"+k+"'></a><select id='"+k+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]="+a+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||m.push("\\["+a+"*(?:value|"+Y+")"),e.querySelectorAll("[id~="+k+"-]").length||m.push("~="),e.querySelectorAll(":checked").length||m.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||m.push(".#.+[+~]")}),h(function(e){var t=E.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&m.push("name"+a+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||m.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),m.push(",.*:")})),(g.matchesSelector=c.test(i=t.matches||t.webkitMatchesSelector||t.mozMatchesSelector||t.oMatchesSelector||t.msMatchesSelector))&&h(function(e){g.disconnectedMatch=i.call(e,"div"),i.call(e,"[s!='']:x"),r.push("!=",G)}),m=m.length&&new RegExp(m.join("|")),r=r.length&&new RegExp(r.join("|")),e=c.test(t.compareDocumentPosition),y=e||c.test(t.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,t=t&&t.parentNode;return e===t||!(!t||1!==t.nodeType||!(n.contains?n.contains(t):e.compareDocumentPosition&&16&e.compareDocumentPosition(t)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},$=e?function(e,t){var n;return e===t?(l=!0,0):(n=!e.compareDocumentPosition-!t.compareDocumentPosition)||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!g.sortDetached&&t.compareDocumentPosition(e)===n?e===E||e.ownerDocument===v&&y(v,e)?-1:t===E||t.ownerDocument===v&&y(v,t)?1:u?j(u,e)-j(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===E?-1:t===E?1:i?-1:o?1:u?j(u,e)-j(u,t):0;if(i===o)return fe(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)s.unshift(n);for(;a[r]===s[r];)r++;return r?fe(a[r],s[r]):a[r]===v?-1:s[r]===v?1:0}),E},H.matches=function(e,t){return H(e,null,null,t)},H.matchesSelector=function(e,t){if((e.ownerDocument||e)!==E&&C(e),t=t.replace(ee,"='$1']"),g.matchesSelector&&N&&!A[t+" "]&&(!r||!r.test(t))&&(!m||!m.test(t)))try{var n=i.call(e,t);if(n||g.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(F){}return 0<H(t,E,null,[e]).length},H.contains=function(e,t){return(e.ownerDocument||e)!==E&&C(e),y(e,t)},H.attr=function(e,t){(e.ownerDocument||e)!==E&&C(e);var n=b.attrHandle[t.toLowerCase()],n=n&&z.call(b.attrHandle,t.toLowerCase())?n(e,t,!N):undefined;return n!==undefined?n:g.attributes||!N?e.getAttribute(t):(n=e.getAttributeNode(t))&&n.specified?n.value:null},H.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},H.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!g.detectDuplicates,u=!g.sortStable&&e.slice(0),e.sort($),l){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return u=null,e},o=H.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 for(;t=e[r++];)n+=o(t);return n},(b=H.selectors={cacheLength:50,createPseudo:q,match:f,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(d,p),e[3]=(e[3]||e[4]||e[5]||"").replace(d,p),"~="===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]||H.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]&&H.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return f.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&te.test(n)&&(t=(t=w(n,!0))&&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(d,p).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=W[e+" "];return t||(t=new RegExp("(^|"+a+")"+e+"("+a+"|$)"))&&W(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(t,n,r){return function(e){e=H.attr(e,t);return null==e?"!="===n:!n||(e+="","="===n?e===r:"!="===n?e!==r:"^="===n?r&&0===e.indexOf(r):"*="===n?r&&-1<e.indexOf(r):"$="===n?r&&e.slice(-r.length)===r:"~="===n?-1<(" "+e.replace(K," ")+" ").indexOf(r):"|="===n&&(e===r||e.slice(0,r.length+1)===r+"-"))}},CHILD:function(h,e,t,g,m){var y="nth"!==h.slice(0,3),v="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===m?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!=v?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),d=!n&&!x,p=!1;if(c){if(y){for(;l;){for(a=e;a=a[l];)if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[v?c.firstChild:c.lastChild],v&&d){for(p=(s=(r=(i=(o=(a=c)[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===S&&r[1])&&r[2],a=s&&c.childNodes[s];a=++s&&a&&a[l]||(p=s=0,u.pop());)if(1===a.nodeType&&++p&&a===e){i[h]=[S,s,p];break}}else if(!1===(p=d?s=(r=(i=(o=(a=e)[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===S&&r[1]:p))for(;(a=++s&&a&&a[l]||(p=s=0,u.pop()))&&((x?a.nodeName.toLowerCase()!==f:1!==a.nodeType)||!++p||(d&&((i=(o=a[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[S,p]),a!==e)););return(p-=m)===g||p%g==0&&0<=p/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||H.error("unsupported pseudo: "+e);return a[k]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?q(function(e,t){for(var n,r=a(e,o),i=r.length;i--;)e[n=j(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:q(function(e){var r=[],i=[],s=R(e.replace(L,"$1"));return s[k]?q(function(e,t,n,r){for(var i,o=s(e,null,r,[]),a=e.length;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:q(function(t){return function(e){return 0<H(t,e).length}}),contains:q(function(t){return t=t.replace(d,p),function(e){return-1<(e.textContent||e.innerText||o(e)).indexOf(t)}}),lang:q(function(n){return ne.test(n||"")||H.error("unsupported lang: "+n),n=n.replace(d,p).toLowerCase(),function(e){var t;do{if(t=N?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=M.location&&M.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===t},focus:function(e){return e===E.activeElement&&(!E.hasFocus||E.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return!1===e.disabled},disabled:function(e){return!0===e.disabled},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 ie.test(e.nodeName)},input:function(e){return re.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(e=e.getAttribute("type"))||"text"===e.toLowerCase())},first:x(function(){return[0]}),last:x(function(e,t){return[t-1]}),eq:x(function(e,t,n){return[n<0?n+t:n]}),even:x(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:x(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:x(function(e,t,n){for(var r=n<0?n+t:n;0<=--r;)e.push(r);return e}),gt:x(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]=function(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=function(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}(e);function pe(){}function _(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function he(a,e,t){var s=e.dir,u=t&&"parentNode"===s,l=B++;return e.first?function(e,t,n){for(;e=e[s];)if(1===e.nodeType||u)return a(e,t,n)}:function(e,t,n){var r,i,o=[S,l];if(n){for(;e=e[s];)if((1===e.nodeType||u)&&a(e,t,n))return!0}else for(;e=e[s];)if(1===e.nodeType||u){if((r=(i=(i=e[k]||(e[k]={}))[e.uniqueID]||(i[e.uniqueID]={}))[s])&&r[0]===S&&r[1]===l)return o[2]=r[2];if((i[s]=o)[2]=a(e,t,n))return!0}}}function ge(i){return 1<i.length?function(e,t,n){for(var r=i.length;r--;)if(!i[r](e,t,n))return!1;return!0}:i[0]}function me(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 ye(p,h,g,m,y,e){return m&&!m[k]&&(m=ye(m)),y&&!y[k]&&(y=ye(y,e)),q(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++)H(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!p||!e&&h?c:me(c,s,p,n,r),d=g?y||(e?p:l||m)?[]:t:f;if(g&&g(f,d,n,r),m)for(i=me(d,u),m(i,[],n,r),o=i.length;o--;)(a=i[o])&&(d[u[o]]=!(f[u[o]]=a));if(e){if(y||p){if(y){for(i=[],o=d.length;o--;)(a=d[o])&&i.push(f[o]=a);y(null,d=[],i,r)}for(o=d.length;o--;)(a=d[o])&&-1<(i=y?j(e,a):s[o])&&(e[i]=!(t[i]=a))}}else d=me(d===t?d.splice(l,d.length):d),y?y(null,t,d,r):D.apply(t,d)})}return pe.prototype=b.filters=b.pseudos,b.setFilters=new pe,w=H.tokenize=function(e,t){var n,r,i,o,a,s,u,l=I[e+" "];if(l)return t?0:l.slice(0);for(a=e,s=[],u=b.preFilter;a;){for(o in n&&!(r=Q.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(L," ")}),a=a.slice(n.length)),b.filter)!(r=f[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?H.error(e):I(e,s).slice(0)},R=H.compile=function(e,t){var n,m,y,v,x,r,i=[],o=[],a=A[e+" "];if(!a){for(n=(t=t||w(e)).length;n--;)((a=function f(e){for(var r,t,n,i=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=he(function(e){return e===r},a,!0),l=he(function(e){return-1<j(r,e)},a,!0),c=[function(e,t,n){return e=!o&&(n||t!==T)||((r=t).nodeType?u:l)(e,t,n),r=null,e}];s<i;s++)if(t=b.relative[e[s].type])c=[he(ge(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[k]){for(n=++s;n<i&&!b.relative[e[n].type];n++);return ye(1<s&&ge(c),1<s&&_(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(L,"$1"),t,s<n&&f(e.slice(s,n)),n<i&&f(e=e.slice(n)),n<i&&_(e))}c.push(t)}return ge(c)}(t[n]))[k]?i:o).push(a);(a=A(e,(m=o,v=0<(y=i).length,x=0<m.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],d=T,p=e||x&&b.find.TAG("*",i),h=S+=null==d?1:Math.random()||.1,g=p.length;for(i&&(T=t===E||t||i);l!==g&&null!=(o=p[l]);l++){if(x&&o){for(a=0,t||o.ownerDocument===E||(C(o),n=!N);s=m[a++];)if(s(o,t||E,n)){r.push(o);break}i&&(S=h)}v&&((o=!s&&o)&&u--,e)&&c.push(o)}if(u+=l,v&&l!==u){for(a=0;s=y[a++];)s(c,f,t,n);if(e){if(0<u)for(;l--;)c[l]||f[l]||(f[l]=X.call(r));f=me(f)}D.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&H.uniqueSort(r)}return i&&(S=h,T=d),c},v?q(r):r))).selector=e}return a},P=H.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&w(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&&g.getById&&9===t.nodeType&&N&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(d,p),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=f.needsContext.test(e)?0:o.length;i--&&(a=o[i],!b.relative[s=a.type]);)if((u=b.find[s])&&(r=u(a.matches[0].replace(d,p),ae.test(o[0].type)&&de(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&_(o))break;return D.apply(n,r),n}}return(l||R(e,c))(r,t,!N,n,!t||ae.test(e)&&de(t.parentNode)||t),n},g.sortStable=k.split("").sort($).join("")===k,g.detectDuplicates=!!l,C(),g.sortDetached=h(function(e){return 1&e.compareDocumentPosition(E.createElement("div"))}),h(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||ce("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),g.attributes&&h(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ce("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),h(function(e){return null==e.getAttribute("disabled")})||ce(Y,function(e,t,n){if(!n)return!0===e[t]?t.toLowerCase():(n=e.getAttributeNode(t))&&n.specified?n.value:null}),H}(T),r=(C.find=e,C.expr=e.selectors,C.expr[":"]=C.expr.pseudos,C.uniqueSort=C.unique=e.uniqueSort,C.text=e.getText,C.isXMLDoc=e.isXML,C.contains=e.contains,function(e,t,n){for(var r=[],i=n!==undefined;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&C(e).is(n))break;r.push(e)}return r}),V=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},Y=C.expr.match.needsContext,J=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,G=/^.[^:#\[\.,]*$/;function K(e,n,r){if(C.isFunction(n))return C.grep(e,function(e,t){return!!n.call(e,t,e)!==r});if(n.nodeType)return C.grep(e,function(e){return e===n!==r});if("string"==typeof n){if(G.test(n))return C.filter(n,e,r);n=C.filter(n,e)}return C.grep(e,function(e){return-1<C.inArray(e,n)!==r})}C.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?C.find.matchesSelector(r,e)?[r]:[]:C.find.matches(e,C.grep(t,function(e){return 1===e.nodeType}))},C.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(C(e).filter(function(){for(t=0;t<i;t++)if(C.contains(r[t],this))return!0}));for(t=0;t<i;t++)C.find(e,r[t],n);return(n=this.pushStack(1<i?C.unique(n):n)).selector=this.selector?this.selector+" "+e:e,n},filter:function(e){return this.pushStack(K(this,e||[],!1))},not:function(e){return this.pushStack(K(this,e||[],!0))},is:function(e){return!!K(this,"string"==typeof e&&Y.test(e)?C(e):e||[],!1).length}});var Q,Z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,ee=((C.fn.init=function(e,t,n){if(e){if(n=n||Q,"string"!=typeof e)return e.nodeType?(this.context=this[0]=e,this.length=1,this):C.isFunction(e)?"undefined"!=typeof n.ready?n.ready(e):e(C):(e.selector!==undefined&&(this.selector=e.selector,this.context=e.context),C.makeArray(e,this));if(!(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&3<=e.length?[null,e,null]:Z.exec(e))||!r[1]&&t)return(!t||t.jquery?t||n:this.constructor(t)).find(e);if(r[1]){if(t=t instanceof C?t[0]:t,C.merge(this,C.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:g,!0)),J.test(r[1])&&C.isPlainObject(t))for(var r in t)C.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r])}else{if((n=g.getElementById(r[2]))&&n.parentNode){if(n.id!==r[2])return Q.find(e);this.length=1,this[0]=n}this.context=g,this.selector=e}}return this}).prototype=C.fn,Q=C(g),/^(?:parents|prev(?:Until|All))/),te={children:!0,contents:!0,next:!0,prev:!0};function ne(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}C.fn.extend({has:function(e){var t,n=C(e,this),r=n.length;return this.filter(function(){for(t=0;t<r;t++)if(C.contains(this,n[t]))return!0})},closest:function(e,t){for(var n,r=0,i=this.length,o=[],a=Y.test(e)||"string"!=typeof e?C(e,t||this.context):0;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&&C.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?C.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?C.inArray(this[0],C(e)):C.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(C.uniqueSort(C.merge(this.get(),C(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),C.each({parent:function(e){e=e.parentNode;return e&&11!==e.nodeType?e:null},parents:function(e){return r(e,"parentNode")},parentsUntil:function(e,t,n){return r(e,"parentNode",n)},next:function(e){return ne(e,"nextSibling")},prev:function(e){return ne(e,"previousSibling")},nextAll:function(e){return r(e,"nextSibling")},prevAll:function(e){return r(e,"previousSibling")},nextUntil:function(e,t,n){return r(e,"nextSibling",n)},prevUntil:function(e,t,n){return r(e,"previousSibling",n)},siblings:function(e){return V((e.parentNode||{}).firstChild,e)},children:function(e){return V(e.firstChild)},contents:function(e){return C.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:C.merge([],e.childNodes)}},function(r,i){C.fn[r]=function(e,t){var n=C.map(this,i,e);return(t="Until"!==r.slice(-5)?e:t)&&"string"==typeof t&&(n=C.filter(t,n)),1<this.length&&(te[r]||(n=C.uniqueSort(n)),ee.test(r))&&(n=n.reverse()),this.pushStack(n)}});var re,ie,E=/\S+/g;function oe(){g.addEventListener?(g.removeEventListener("DOMContentLoaded",i),T.removeEventListener("load",i)):(g.detachEvent("onreadystatechange",i),T.detachEvent("onload",i))}function i(){!g.addEventListener&&"load"!==T.event.type&&"complete"!==g.readyState||(oe(),C.ready())}for(ie in C.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},C.each(e.match(E)||[],function(e,t){n[t]=!0}),n):C.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=r.once,o=i=!0;u.length;l=-1)for(t=u.shift();++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){C.each(e,function(e,t){C.isFunction(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==C.type(t)&&n(t)})}(arguments),t)&&!i&&c(),this},remove:function(){return C.each(arguments,function(e,t){for(var n;-1<(n=C.inArray(t,s,n));)s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<C.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=!0,t||f.disable(),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},C.extend({Deferred:function(e){var o=[["resolve","done",C.Callbacks("once memory"),"resolved"],["reject","fail",C.Callbacks("once memory"),"rejected"],["notify","progress",C.Callbacks("memory")]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},then:function(){var i=arguments;return C.Deferred(function(r){C.each(o,function(e,t){var n=C.isFunction(i[e])&&i[e];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&C.isFunction(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this===a?r.promise():this,n?[e]:arguments)})}),i=null}).promise()},promise:function(e){return null!=e?C.extend(e,a):a}},s={};return a.pipe=a.then,C.each(o,function(e,t){var n=t[2],r=t[3];a[t[1]]=n.add,r&&n.add(function(){i=r},o[1^e][2].disable,o[2][2].lock),s[t[0]]=function(){return s[t[0]+"With"](this===s?a:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var i,t,n,r=0,o=c.call(arguments),a=o.length,s=1!==a||e&&C.isFunction(e.promise)?a:0,u=1===s?e:C.Deferred(),l=function(t,n,r){return function(e){n[t]=this,r[t]=1<arguments.length?c.call(arguments):e,r===i?u.notifyWith(n,r):--s||u.resolveWith(n,r)}};if(1<a)for(i=new Array(a),t=new Array(a),n=new Array(a);r<a;r++)o[r]&&C.isFunction(o[r].promise)?o[r].promise().progress(l(r,t,i)).done(l(r,n,o)).fail(u.reject):--s;return s||u.resolveWith(n,o),u.promise()}}),C.fn.ready=function(e){return C.ready.promise().done(e),this},C.extend({isReady:!1,readyWait:1,holdReady:function(e){e?C.readyWait++:C.ready(!0)},ready:function(e){(!0===e?--C.readyWait:C.isReady)||(C.isReady=!0)!==e&&0<--C.readyWait||(re.resolveWith(g,[C]),C.fn.triggerHandler&&(C(g).triggerHandler("ready"),C(g).off("ready")))}}),C.ready.promise=function(e){if(!re)if(re=C.Deferred(),"complete"===g.readyState||"loading"!==g.readyState&&!g.documentElement.doScroll)T.setTimeout(C.ready);else if(g.addEventListener)g.addEventListener("DOMContentLoaded",i),T.addEventListener("load",i);else{g.attachEvent("onreadystatechange",i),T.attachEvent("onload",i);var t=!1;try{t=null==T.frameElement&&g.documentElement}catch(n){}t&&t.doScroll&&!function r(){if(!C.isReady){try{t.doScroll("left")}catch(n){return T.setTimeout(r,50)}oe(),C.ready()}}()}return re.promise(e)},C.ready.promise(),C(y))break;y.ownFirst="0"===ie,y.inlineBlockNeedsLayout=!1,C(function(){var e,t,n=g.getElementsByTagName("body")[0];n&&n.style&&(e=g.createElement("div"),(t=g.createElement("div")).style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(t).appendChild(e),"undefined"!=typeof e.style.zoom&&(e.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",y.inlineBlockNeedsLayout=e=3===e.offsetWidth,e)&&(n.style.zoom=1),n.removeChild(t))});e=g.createElement("div");y.deleteExpando=!0;try{delete e.test}catch(yn){y.deleteExpando=!1}var o,v=function(e){var t=C.noData[(e.nodeName+" ").toLowerCase()],n=+e.nodeType||1;return(1===n||9===n)&&(!t||!0!==t&&e.getAttribute("classid")===t)},ae=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,se=/([A-Z])/g;function ue(e,t,n){if(n===undefined&&1===e.nodeType){var r="data-"+t.replace(se,"-$1").toLowerCase();if("string"==typeof(n=e.getAttribute(r))){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:ae.test(n)?C.parseJSON(n):n)}catch(i){}C.data(e,t,n)}else n=undefined}return n}function le(e){for(var t in e)if(("data"!==t||!C.isEmptyObject(e[t]))&&"toJSON"!==t)return;return 1}function ce(e,t,n,r){if(v(e)){var i,o=C.expando,a=e.nodeType,s=a?C.cache:e,u=a?e[o]:e[o]&&o;if(u&&s[u]&&(r||s[u].data)||n!==undefined||"string"!=typeof t)return s[u=u||(a?e[o]=f.pop()||C.guid++:o)]||(s[u]=a?{}:{toJSON:C.noop}),"object"!=typeof t&&"function"!=typeof t||(r?s[u]=C.extend(s[u],t):s[u].data=C.extend(s[u].data,t)),e=s[u],r||(e.data||(e.data={}),e=e.data),n!==undefined&&(e[C.camelCase(t)]=n),"string"==typeof t?null==(i=e[t])&&(i=e[C.camelCase(t)]):i=e,i}}function fe(e,t,n){if(v(e)){var r,i,o=e.nodeType,a=o?C.cache:e,s=o?e[C.expando]:C.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){i=(t=C.isArray(t)?t.concat(C.map(t,C.camelCase)):t in r||(t=C.camelCase(t))in r?[t]:t.split(" ")).length;for(;i--;)delete r[t[i]];if(n?!le(r):!C.isEmptyObject(r))return}(n||(delete a[s].data,le(a[s])))&&(o?C.cleanData([e],!0):y.deleteExpando||a!=a.window?delete a[s]:a[s]=undefined)}}}C.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return!!(e=e.nodeType?C.cache[e[C.expando]]:e[C.expando])&&!le(e)},data:function(e,t,n){return ce(e,t,n)},removeData:function(e,t){return fe(e,t)},_data:function(e,t,n){return ce(e,t,n,!0)},_removeData:function(e,t){return fe(e,t,!0)}}),C.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(e!==undefined)return"object"==typeof e?this.each(function(){C.data(this,e)}):1<arguments.length?this.each(function(){C.data(this,e,t)}):o?ue(o,e,C.data(o,e)):undefined;if(this.length&&(i=C.data(o),1===o.nodeType)&&!C._data(o,"parsedAttrs")){for(n=a.length;n--;)a[n]&&0===(r=a[n].name).indexOf("data-")&&ue(o,r=C.camelCase(r.slice(5)),i[r]);C._data(o,"parsedAttrs",!0)}return i},removeData:function(e){return this.each(function(){C.removeData(this,e)})}}),C.extend({queue:function(e,t,n){var r;if(e)return r=C._data(e,t=(t||"fx")+"queue"),n&&(!r||C.isArray(n)?r=C._data(e,t,C.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=C.queue(e,t),r=n.length,i=n.shift(),o=C._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){C.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return C._data(e,n)||C._data(e,n,{empty:C.Callbacks("once memory").add(function(){C._removeData(e,t+"queue"),C._removeData(e,n)})})}}),C.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?C.queue(this[0],t):n===undefined?this:this.each(function(){var e=C.queue(this,t,n);C._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&C.dequeue(this,t)})},dequeue:function(e){return this.each(function(){C.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=C.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};for("string"!=typeof e&&(t=e,e=undefined),e=e||"fx";a--;)(n=C._data(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}}),y.shrinkWrapBlocks=function(){var e,t,n;return null!=o?o:(o=!1,(t=g.getElementsByTagName("body")[0])&&t.style?(e=g.createElement("div"),(n=g.createElement("div")).style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",t.appendChild(n).appendChild(e),"undefined"!=typeof e.style.zoom&&(e.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",e.appendChild(g.createElement("div")).style.width="5px",o=3!==e.offsetWidth),t.removeChild(n),o):void 0)};var e=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,de=new RegExp("^(?:([+-])=|)("+e+")([a-z%]*)$","i"),s=["Top","Right","Bottom","Left"],pe=function(e,t){return"none"===C.css(e=t||e,"display")||!C.contains(e.ownerDocument,e)};function he(e,t,n,r){var i,o=1,a=20,s=r?function(){return r.cur()}:function(){return C.css(e,t,"")},u=s(),l=n&&n[3]||(C.cssNumber[t]?"":"px"),c=(C.cssNumber[t]||"px"!==l&&+u)&&de.exec(C.css(e,t));if(c&&c[3]!==l)for(l=l||c[3],n=n||[],c=+u||1;c/=o=o||".5",C.style(e,t,c+l),o!==(o=s()/u)&&1!==o&&--a;);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 d=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===C.type(n))for(s in i=!0,n)d(e,t,s,n[s],!0,o,a);else if(r!==undefined&&(i=!0,C.isFunction(r)||(a=!0),t=l?a?(t.call(e,r),null):(l=t,function(e,t,n){return l.call(C(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},ge=/^(?:checkbox|radio)$/i,me=/<([\w:-]+)/,ye=/^$|\/(?:java|ecma)script/i,ve=/^\s+/,xe="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function be(e){var t=xe.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}S=g.createElement("div"),k=g.createDocumentFragment(),q=g.createElement("input"),S.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",y.leadingWhitespace=3===S.firstChild.nodeType,y.tbody=!S.getElementsByTagName("tbody").length,y.htmlSerialize=!!S.getElementsByTagName("link").length,y.html5Clone="<:nav></:nav>"!==g.createElement("nav").cloneNode(!0).outerHTML,q.type="checkbox",q.checked=!0,k.appendChild(q),y.appendChecked=q.checked,S.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!S.cloneNode(!0).lastChild.defaultValue,k.appendChild(S),(q=g.createElement("input")).setAttribute("type","radio"),q.setAttribute("checked","checked"),q.setAttribute("name","t"),S.appendChild(q),y.checkClone=S.cloneNode(!0).cloneNode(!0).lastChild.checked,y.noCloneEvent=!!S.addEventListener,S[C.expando]=1,y.attributes=!S.getAttribute(C.expando);var x={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:y.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]};function b(e,t){var n,r,i=0,o="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):undefined;if(!o)for(o=[],n=e.childNodes||e;null!=(r=n[i]);i++)!t||C.nodeName(r,t)?o.push(r):C.merge(o,b(r,t));return t===undefined||t&&C.nodeName(e,t)?C.merge([e],o):o}function we(e,t){for(var n,r=0;null!=(n=e[r]);r++)C._data(n,"globalEval",!t||C._data(t[r],"globalEval"))}x.optgroup=x.option,x.tbody=x.tfoot=x.colgroup=x.caption=x.thead,x.th=x.td;var Te=/<|&#?\w+;/,Ce=/<tbody/i;function Ee(e){ge.test(e.type)&&(e.defaultChecked=e.checked)}function Ne(e,t,n,r,i){for(var o,a,s,u,l,c,f,d=e.length,p=be(t),h=[],g=0;g<d;g++)if((a=e[g])||0===a)if("object"===C.type(a))C.merge(h,a.nodeType?[a]:a);else if(Te.test(a)){for(u=u||p.appendChild(t.createElement("div")),l=(me.exec(a)||["",""])[1].toLowerCase(),f=x[l]||x._default,u.innerHTML=f[1]+C.htmlPrefilter(a)+f[2],o=f[0];o--;)u=u.lastChild;if(!y.leadingWhitespace&&ve.test(a)&&h.push(t.createTextNode(ve.exec(a)[0])),!y.tbody)for(o=(a="table"!==l||Ce.test(a)?"<table>"!==f[1]||Ce.test(a)?0:u:u.firstChild)&&a.childNodes.length;o--;)C.nodeName(c=a.childNodes[o],"tbody")&&!c.childNodes.length&&a.removeChild(c);for(C.merge(h,u.childNodes),u.textContent="";u.firstChild;)u.removeChild(u.firstChild);u=p.lastChild}else h.push(t.createTextNode(a));for(u&&p.removeChild(u),y.appendChecked||C.grep(b(h,"input"),Ee),g=0;a=h[g++];)if(r&&-1<C.inArray(a,r))i&&i.push(a);else if(s=C.contains(a.ownerDocument,a),u=b(p.appendChild(a),"script"),s&&we(u),n)for(o=0;a=u[o++];)ye.test(a.type||"")&&n.push(a);return u=null,p}var ke,Se,Ae=g.createElement("div");for(ke in{submit:!0,change:!0,focusin:!0})(y[ke]=(Se="on"+ke)in T)||(Ae.setAttribute(Se,"t"),y[ke]=!1===Ae.attributes[Se].expando);var De=/^(?:input|select|textarea)$/i,je=/^key/,Le=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,He=/^(?:focusinfocus|focusoutblur)$/,qe=/^([^.]*)(?:\.(.+)|)/;function _e(){return!0}function u(){return!1}function Fe(){try{return g.activeElement}catch(e){}}function Me(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=undefined),t)Me(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=undefined):null==i&&("string"==typeof n?(i=r,r=undefined):(i=r,r=n,n=undefined)),!1===i)i=u;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return C().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=C.guid++)),e.each(function(){C.event.add(this,t,i,r,n)})}C.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,d,p,h=C._data(e);if(h)for(n.handler&&(n=(s=n).handler,i=s.selector),n.guid||(n.guid=C.guid++),o=(o=h.events)||(h.events={}),(l=h.handle)||((l=h.handle=function(e){return void 0===C||e&&C.event.triggered===e.type?undefined:C.event.dispatch.apply(l.elem,arguments)}).elem=e),a=(t=(t||"").match(E)||[""]).length;a--;)f=p=(d=qe.exec(t[a])||[])[1],d=(d[2]||"").split(".").sort(),f&&(u=C.event.special[f]||{},f=(i?u.delegateType:u.bindType)||f,u=C.event.special[f]||{},p=C.extend({type:f,origType:p,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&C.expr.match.needsContext.test(i),namespace:d.join(".")},s),(c=o[f])||((c=o[f]=[]).delegateCount=0,u.setup&&!1!==u.setup.call(e,r,d,l))||(e.addEventListener?e.addEventListener(f,l,!1):e.attachEvent&&e.attachEvent("on"+f,l)),u.add&&(u.add.call(e,p),p.handler.guid||(p.handler.guid=n.guid)),i?c.splice(c.delegateCount++,0,p):c.push(p),C.event.global[f]=!0)},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,d,p,h,g,m=C.hasData(e)&&C._data(e);if(m&&(c=m.events)){for(l=(t=(t||"").match(E)||[""]).length;l--;)if(p=g=(s=qe.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),p){for(f=C.event.special[p]||{},d=c[p=(r?f.delegateType:f.bindType)||p]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=d.length;o--;)a=d[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(d.splice(o,1),a.selector&&d.delegateCount--,f.remove&&f.remove.call(e,a));u&&!d.length&&(f.teardown&&!1!==f.teardown.call(e,h,m.handle)||C.removeEvent(e,p,m.handle),delete c[p])}else for(p in c)C.event.remove(e,p+t[l],n,r,!0);C.isEmptyObject(c)&&(delete m.handle,C._removeData(e,"events"))}},trigger:function(e,t,n,r){var i,o,a,s,u,l,c=[n||g],f=m.call(e,"type")?e.type:e,d=m.call(e,"namespace")?e.namespace.split("."):[],p=u=n=n||g;if(3!==n.nodeType&&8!==n.nodeType&&!He.test(f+C.event.triggered)&&(-1<f.indexOf(".")&&(f=(d=f.split(".")).shift(),d.sort()),o=f.indexOf(":")<0&&"on"+f,(e=e[C.expando]?e:new C.Event(f,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=d.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=undefined,e.target||(e.target=n),t=null==t?[e]:C.makeArray(t,[e]),s=C.event.special[f]||{},r||!s.trigger||!1!==s.trigger.apply(n,t))){if(!r&&!s.noBubble&&!C.isWindow(n)){for(a=s.delegateType||f,He.test(a+f)||(p=p.parentNode);p;p=p.parentNode)c.push(p),u=p;u===(n.ownerDocument||g)&&c.push(u.defaultView||u.parentWindow||T)}for(l=0;(p=c[l++])&&!e.isPropagationStopped();)e.type=1<l?a:s.bindType||f,(i=(C._data(p,"events")||{})[e.type]&&C._data(p,"handle"))&&i.apply(p,t),(i=o&&p[o])&&i.apply&&v(p)&&(e.result=i.apply(p,t),!1===e.result)&&e.preventDefault();if(e.type=f,!r&&!e.isDefaultPrevented()&&(!s._default||!1===s._default.apply(c.pop(),t))&&v(n)&&o&&n[f]&&!C.isWindow(n)){(u=n[o])&&(n[o]=null),C.event.triggered=f;try{n[f]()}catch(h){}C.event.triggered=undefined,u&&(n[o]=u)}return e.result}},dispatch:function(e){e=C.event.fix(e);var t,n,r,i,o,a=c.call(arguments),s=(C._data(this,"events")||{})[e.type]||[],u=C.event.special[e.type]||{};if((a[0]=e).delegateTarget=this,!u.preDispatch||!1!==u.preDispatch.call(this,e)){for(o=C.event.handlers.call(this,e,s),t=0;(r=o[t++])&&!e.isPropagationStopped();)for(e.currentTarget=r.elem,n=0;(i=r.handlers[n++])&&!e.isImmediatePropagationStopped();)e.rnamespace&&!e.rnamespace.test(i.namespace)||(e.handleObj=i,e.data=i.data,(i=((C.event.special[i.origType]||{}).handle||i.handler).apply(r.elem,a))!==undefined&&!1===(e.result=i)&&(e.preventDefault(),e.stopPropagation()));return u.postDispatch&&u.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,a=[],s=t.delegateCount,u=e.target;if(s&&u.nodeType&&("click"!==e.type||isNaN(e.button)||e.button<1))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(!0!==u.disabled||"click"!==e.type)){for(r=[],n=0;n<s;n++)r[i=(o=t[n]).selector+" "]===undefined&&(r[i]=o.needsContext?-1<C(i,this).index(u):C.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&a.push({elem:u,handlers:r})}return s<t.length&&a.push({elem:this,handlers:t.slice(s)}),a},fix:function(e){if(e[C.expando])return e;var t,n,r,i=e.type,o=e,a=this.fixHooks[i];for(a||(this.fixHooks[i]=a=Le.test(i)?this.mouseHooks:je.test(i)?this.keyHooks:{}),r=a.props?this.props.concat(a.props):this.props,e=new C.Event(o),t=r.length;t--;)e[n=r[t]]=o[n];return e.target||(e.target=o.srcElement||g),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,a.filter?a.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,t){var n,r,i=t.button,o=t.fromElement;return null==e.pageX&&null!=t.clientX&&(r=(n=e.target.ownerDocument||g).documentElement,n=n.body,e.pageX=t.clientX+(r&&r.scrollLeft||n&&n.scrollLeft||0)-(r&&r.clientLeft||n&&n.clientLeft||0),e.pageY=t.clientY+(r&&r.scrollTop||n&&n.scrollTop||0)-(r&&r.clientTop||n&&n.clientTop||0)),!e.relatedTarget&&o&&(e.relatedTarget=o===e.target?t.toElement:o),e.which||i===undefined||(e.which=1&i?1:2&i?3:4&i?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==Fe()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){if(this===Fe()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if(C.nodeName(this,"input")&&"checkbox"===this.type&&this.click)return this.click(),!1},_default:function(e){return C.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==undefined&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n){e=C.extend(new C.Event,n,{type:e,isSimulated:!0});C.event.trigger(e,null,t),e.isDefaultPrevented()&&n.preventDefault()}},C.removeEvent=g.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)}:function(e,t,n){t="on"+t;e.detachEvent&&("undefined"==typeof e[t]&&(e[t]=null),e.detachEvent(t,n))},C.Event=function(e,t){if(!(this instanceof C.Event))return new C.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.defaultPrevented===undefined&&!1===e.returnValue?_e:u):this.type=e,t&&C.extend(this,t),this.timeStamp=e&&e.timeStamp||C.now(),this[C.expando]=!0},C.Event.prototype={constructor:C.Event,isDefaultPrevented:u,isPropagationStopped:u,isImmediatePropagationStopped:u,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=_e,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=_e,e&&!this.isSimulated&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=_e,e&&e.stopImmediatePropagation&&e.stopImmediatePropagation(),this.stopPropagation()}},C.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){C.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||C.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),y.submit||(C.event.special.submit={setup:function(){if(C.nodeName(this,"form"))return!1;C.event.add(this,"click._submit keypress._submit",function(e){e=e.target,e=C.nodeName(e,"input")||C.nodeName(e,"button")?C.prop(e,"form"):undefined;e&&!C._data(e,"submit")&&(C.event.add(e,"submit._submit",function(e){e._submitBubble=!0}),C._data(e,"submit",!0))})},postDispatch:function(e){e._submitBubble&&(delete e._submitBubble,this.parentNode)&&!e.isTrigger&&C.event.simulate("submit",this.parentNode,e)},teardown:function(){if(C.nodeName(this,"form"))return!1;C.event.remove(this,"._submit")}}),y.change||(C.event.special.change={setup:function(){if(De.test(this.nodeName))return"checkbox"!==this.type&&"radio"!==this.type||(C.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._justChanged=!0)}),C.event.add(this,"click._change",function(e){this._justChanged&&!e.isTrigger&&(this._justChanged=!1),C.event.simulate("change",this,e)})),!1;C.event.add(this,"beforeactivate._change",function(e){e=e.target;De.test(e.nodeName)&&!C._data(e,"change")&&(C.event.add(e,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||C.event.simulate("change",this.parentNode,e)}),C._data(e,"change",!0))})},handle:function(e){var t=e.target;if(this!==t||e.isSimulated||e.isTrigger||"radio"!==t.type&&"checkbox"!==t.type)return e.handleObj.handler.apply(this,arguments)},teardown:function(){return C.event.remove(this,"._change"),!De.test(this.nodeName)}}),y.focusin||C.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){C.event.simulate(r,e.target,C.event.fix(e))};C.event.special[r]={setup:function(){var e=this.ownerDocument||this,t=C._data(e,r);t||e.addEventListener(n,i,!0),C._data(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this,t=C._data(e,r)-1;t?C._data(e,r,t):(e.removeEventListener(n,i,!0),C._removeData(e,r))}}}),C.fn.extend({on:function(e,t,n,r){return Me(this,e,t,n,r)},one:function(e,t,n,r){return Me(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)r=e.handleObj,C(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler);else{if("object"!=typeof e)return!1!==t&&"function"!=typeof t||(n=t,t=undefined),!1===n&&(n=u),this.each(function(){C.event.remove(this,e,n,t)});for(i in e)this.off(i,t,e[i])}return this},trigger:function(e,t){return this.each(function(){C.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return C.event.trigger(e,t,n,!0)}});var Oe=/ jQuery\d+="(?:null|\d+)"/g,Re=new RegExp("<(?:"+xe+")[\\s/>]","i"),Pe=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,Be=/<script|<style|<link/i,We=/checked\s*(?:[^=]|=\s*.checked.)/i,Ie=/^true\/(.*)/,$e=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ze=be(g).appendChild(g.createElement("div"));function Xe(e,t){return C.nodeName(e,"table")&&C.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ue(e){return e.type=(null!==C.find.attr(e,"type"))+"/"+e.type,e}function Ve(e){var t=Ie.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Ye(e,t){if(1===t.nodeType&&C.hasData(e)){var n,r,i,e=C._data(e),o=C._data(t,e),a=e.events;if(a)for(n in delete o.handle,o.events={},a)for(r=0,i=a[n].length;r<i;r++)C.event.add(t,n,a[n][r]);o.data&&(o.data=C.extend({},o.data))}}function w(n,r,i,o){r=O.apply([],r);var e,t,a,s,u,l,c=0,f=n.length,d=f-1,p=r[0],h=C.isFunction(p);if(h||1<f&&"string"==typeof p&&!y.checkClone&&We.test(p))return n.each(function(e){var t=n.eq(e);h&&(r[0]=p.call(this,e,t.html())),w(t,r,i,o)});if(f&&(e=(l=Ne(r,n[0].ownerDocument,!1,n,o)).firstChild,1===l.childNodes.length&&(l=e),e||o)){for(a=(s=C.map(b(l,"script"),Ue)).length;c<f;c++)t=l,c!==d&&(t=C.clone(t,!0,!0),a)&&C.merge(s,b(t,"script")),i.call(n[c],t,c);if(a)for(u=s[s.length-1].ownerDocument,C.map(s,Ve),c=0;c<a;c++)t=s[c],ye.test(t.type||"")&&!C._data(t,"globalEval")&&C.contains(u,t)&&(t.src?C._evalUrl&&C._evalUrl(t.src):C.globalEval((t.text||t.textContent||t.innerHTML||"").replace($e,"")));l=null}return n}function Je(e,t,n){for(var r,i=t?C.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||C.cleanData(b(r)),r.parentNode&&(n&&C.contains(r.ownerDocument,r)&&we(b(r,"script")),r.parentNode.removeChild(r));return e}C.extend({htmlPrefilter:function(e){return e.replace(Pe,"<$1></$2>")},clone:function(e,t,n){var r,i,o,a,s,u=C.contains(e.ownerDocument,e);if(y.html5Clone||C.isXMLDoc(e)||!Re.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(ze.innerHTML=e.outerHTML,ze.removeChild(o=ze.firstChild)),!(y.noCloneEvent&&y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||C.isXMLDoc(e)))for(r=b(o),s=b(e),a=0;null!=(i=s[a]);++a)if(r[a]){f=c=l=p=d=void 0;var l,c,f,d=i,p=r[a];if(1===p.nodeType){if(l=p.nodeName.toLowerCase(),!y.noCloneEvent&&p[C.expando]){for(c in(f=C._data(p)).events)C.removeEvent(p,c,f.handle);p.removeAttribute(C.expando)}"script"===l&&p.text!==d.text?(Ue(p).text=d.text,Ve(p)):"object"===l?(p.parentNode&&(p.outerHTML=d.outerHTML),y.html5Clone&&d.innerHTML&&!C.trim(p.innerHTML)&&(p.innerHTML=d.innerHTML)):"input"===l&&ge.test(d.type)?(p.defaultChecked=p.checked=d.checked,p.value!==d.value&&(p.value=d.value)):"option"===l?p.defaultSelected=p.selected=d.defaultSelected:"input"!==l&&"textarea"!==l||(p.defaultValue=d.defaultValue)}}if(t)if(n)for(s=s||b(e),r=r||b(o),a=0;null!=(i=s[a]);a++)Ye(i,r[a]);else Ye(e,o);return 0<(r=b(o,"script")).length&&we(r,!u&&b(e,"script")),r=s=i=null,o},cleanData:function(e,t){for(var n,r,i,o,a=0,s=C.expando,u=C.cache,l=y.attributes,c=C.event.special;null!=(n=e[a]);a++)if((t||v(n))&&(o=(i=n[s])&&u[i])){if(o.events)for(r in o.events)c[r]?C.event.remove(n,r):C.removeEvent(n,r,o.handle);u[i]&&(delete u[i],l||"undefined"==typeof n.removeAttribute?n[s]=undefined:n.removeAttribute(s),f.push(i))}}}),C.fn.extend({domManip:w,detach:function(e){return Je(this,e,!0)},remove:function(e){return Je(this,e)},text:function(e){return d(this,function(e){return e===undefined?C.text(this):this.empty().append((this[0]&&this[0].ownerDocument||g).createTextNode(e))},null,e,arguments.length)},append:function(){return w(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Xe(this,e).appendChild(e)})},prepend:function(){return w(this,arguments,function(e){var t;1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(t=Xe(this,e)).insertBefore(e,t.firstChild)})},before:function(){return w(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return w(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++){for(1===e.nodeType&&C.cleanData(b(e,!1));e.firstChild;)e.removeChild(e.firstChild);e.options&&C.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return C.clone(this,e,t)})},html:function(e){return d(this,function(e){var t=this[0]||{},n=0,r=this.length;if(e===undefined)return 1===t.nodeType?t.innerHTML.replace(Oe,""):undefined;if("string"==typeof e&&!Be.test(e)&&(y.htmlSerialize||!Re.test(e))&&(y.leadingWhitespace||!ve.test(e))&&!x[(me.exec(e)||["",""])[1].toLowerCase()]){e=C.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(C.cleanData(b(t,!1)),t.innerHTML=e);t=0}catch(i){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return w(this,arguments,function(e){var t=this.parentNode;C.inArray(this,n)<0&&(C.cleanData(b(this)),t)&&t.replaceChild(e,this)},n)}}),C.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){C.fn[e]=function(e){for(var t,n=0,r=[],i=C(e),o=i.length-1;n<=o;n++)t=n===o?this:this.clone(!0),C(i[n])[a](t),R.apply(r,t.get());return this.pushStack(r)}});var Ge,Ke={HTML:"block",BODY:"block"};function Qe(e,t){e=C(t.createElement(e)).appendTo(t.body),t=C.css(e[0],"display");return e.detach(),t}function Ze(e){var t=g,n=Ke[e];return n||("none"!==(n=Qe(e,t))&&n||((t=((Ge=(Ge||C("<iframe frameborder='0' width='0' height='0'/>")).appendTo(t.documentElement))[0].contentWindow||Ge[0].contentDocument).document).write(),t.close(),n=Qe(e,t),Ge.detach()),Ke[e]=n),n}var n,et,tt,nt,rt,it,ot,a,at=/^margin/,st=new RegExp("^("+e+")(?!px)[a-z%]+$","i"),ut=function(e,t,n,r){var i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.apply(e,r||[]),t)e.style[i]=o[i];return r},lt=g.documentElement;function t(){var e,t=g.documentElement;t.appendChild(ot),a.style.cssText="-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",n=tt=it=!1,et=rt=!0,T.getComputedStyle&&(e=T.getComputedStyle(a),n="1%"!==(e||{}).top,it="2px"===(e||{}).marginLeft,tt="4px"===(e||{width:"4px"}).width,a.style.marginRight="50%",et="4px"===(e||{marginRight:"4px"}).marginRight,(e=a.appendChild(g.createElement("div"))).style.cssText=a.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",e.style.marginRight=e.style.width="0",a.style.width="1px",rt=!parseFloat((T.getComputedStyle(e)||{}).marginRight),a.removeChild(e)),a.style.display="none",(nt=0===a.getClientRects().length)&&(a.style.display="",a.innerHTML="<table><tr><td></td><td>t</td></tr></table>",a.childNodes[0].style.borderCollapse="separate",(e=a.getElementsByTagName("td"))[0].style.cssText="margin:0;border:0;padding:0;display:none",nt=0===e[0].offsetHeight)&&(e[0].style.display="",e[1].style.display="none",nt=0===e[0].offsetHeight),t.removeChild(ot)}ot=g.createElement("div"),(a=g.createElement("div")).style&&(a.style.cssText="float:left;opacity:.5",y.opacity="0.5"===a.style.opacity,y.cssFloat=!!a.style.cssFloat,a.style.backgroundClip="content-box",a.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===a.style.backgroundClip,(ot=g.createElement("div")).style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",a.innerHTML="",ot.appendChild(a),y.boxSizing=""===a.style.boxSizing||""===a.style.MozBoxSizing||""===a.style.WebkitBoxSizing,C.extend(y,{reliableHiddenOffsets:function(){return null==n&&t(),nt},boxSizingReliable:function(){return null==n&&t(),tt},pixelMarginRight:function(){return null==n&&t(),et},pixelPosition:function(){return null==n&&t(),n},reliableMarginRight:function(){return null==n&&t(),rt},reliableMarginLeft:function(){return null==n&&t(),it}}));var l,p,ct=/^(top|right|bottom|left)$/;function ft(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}T.getComputedStyle?(l=function(e){var t=e.ownerDocument.defaultView;return(t=t&&t.opener?t:T).getComputedStyle(e)},p=function(e,t,n){var r,i,o=e.style;return""!==(i=(n=n||l(e))?n.getPropertyValue(t)||n[t]:undefined)&&i!==undefined||C.contains(e.ownerDocument,e)||(i=C.style(e,t)),n&&!y.pixelMarginRight()&&st.test(i)&&at.test(t)&&(e=o.width,t=o.minWidth,r=o.maxWidth,o.minWidth=o.maxWidth=o.width=i,i=n.width,o.width=e,o.minWidth=t,o.maxWidth=r),i===undefined?i:i+""}):lt.currentStyle&&(l=function(e){return e.currentStyle},p=function(e,t,n){var r,i,o,a=e.style;return null==(n=(n=n||l(e))?n[t]:undefined)&&a&&a[t]&&(n=a[t]),st.test(n)&&!ct.test(t)&&(r=a.left,(o=(i=e.runtimeStyle)&&i.left)&&(i.left=e.currentStyle.left),a.left="fontSize"===t?"1em":n,n=a.pixelLeft+"px",a.left=r,o)&&(i.left=o),n===undefined?n:n+""||"auto"});var dt=/alpha\([^)]*\)/i,pt=/opacity\s*=\s*([^)]*)/i,ht=/^(none|table(?!-c[ea]).+)/,gt=new RegExp("^("+e+")(.*)$","i"),mt={position:"absolute",visibility:"hidden",display:"block"},yt={letterSpacing:"0",fontWeight:"400"},vt=["Webkit","O","Moz","ms"],xt=g.createElement("div").style;function bt(e){if(e in xt)return e;for(var t=e.charAt(0).toUpperCase()+e.slice(1),n=vt.length;n--;)if((e=vt[n]+t)in xt)return e}function wt(e,t){for(var n,r,i,o=[],a=0,s=e.length;a<s;a++)(r=e[a]).style&&(o[a]=C._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&pe(r)&&(o[a]=C._data(r,"olddisplay",Ze(r.nodeName)))):(i=pe(r),(n&&"none"!==n||!i)&&C._data(r,"olddisplay",i?n:C.css(r,"display"))));for(a=0;a<s;a++)!(r=e[a]).style||t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none");return e}function Tt(e,t,n){var r=gt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function Ct(e,t,n,r,i){for(var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;o<4;o+=2)"margin"===n&&(a+=C.css(e,n+s[o],!0,i)),r?("content"===n&&(a-=C.css(e,"padding"+s[o],!0,i)),"margin"!==n&&(a-=C.css(e,"border"+s[o]+"Width",!0,i))):(a+=C.css(e,"padding"+s[o],!0,i),"padding"!==n&&(a+=C.css(e,"border"+s[o]+"Width",!0,i)));return a}function Et(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=l(e),a=y.boxSizing&&"border-box"===C.css(e,"boxSizing",!1,o);if(i<=0||null==i){if(((i=p(e,t,o))<0||null==i)&&(i=e.style[t]),st.test(i))return i;r=a&&(y.boxSizingReliable()||i===e.style[t]),i=parseFloat(i)||0}return i+Ct(e,t,n||(a?"border":"content"),r,o)+"px"}function h(e,t,n,r,i){return new h.prototype.init(e,t,n,r,i)}C.extend({cssHooks:{opacity:{get:function(e,t){if(t)return""===(t=p(e,"opacity"))?"1":t}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":y.cssFloat?"cssFloat":"styleFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=C.camelCase(t),u=e.style;if(t=C.cssProps[s]||(C.cssProps[s]=bt(s)||s),a=C.cssHooks[t]||C.cssHooks[s],n===undefined)return a&&"get"in a&&(i=a.get(e,!1,r))!==undefined?i:u[t];if("string"===(o=typeof n)&&(i=de.exec(n))&&i[1]&&(n=he(e,t,i),o="number"),null!=n&&n==n&&("number"===o&&(n+=i&&i[3]||(C.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),!(a&&"set"in a&&(n=a.set(e,n,r))===undefined)))try{u[t]=n}catch(l){}}},css:function(e,t,n,r){var i,o=C.camelCase(t);return t=C.cssProps[o]||(C.cssProps[o]=bt(o)||o),"normal"===(i=(i=(o=C.cssHooks[t]||C.cssHooks[o])&&"get"in o?o.get(e,!0,n):i)===undefined?p(e,t,r):i)&&t in yt&&(i=yt[t]),(""===n||n)&&(o=parseFloat(i),!0===n||isFinite(o))?o||0:i}}),C.each(["height","width"],function(e,i){C.cssHooks[i]={get:function(e,t,n){if(t)return ht.test(C.css(e,"display"))&&0===e.offsetWidth?ut(e,mt,function(){return Et(e,i,n)}):Et(e,i,n)},set:function(e,t,n){var r=n&&l(e);return Tt(0,t,n?Ct(e,i,n,y.boxSizing&&"border-box"===C.css(e,"boxSizing",!1,r),r):0)}}}),y.opacity||(C.cssHooks.opacity={get:function(e,t){return pt.test((t&&e.currentStyle?e.currentStyle:e.style).filter||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,e=e.currentStyle,r=C.isNumeric(t)?"alpha(opacity="+100*t+")":"",i=e&&e.filter||n.filter||"";((n.zoom=1)<=t||""===t)&&""===C.trim(i.replace(dt,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||e&&!e.filter)||(n.filter=dt.test(i)?i.replace(dt,r):i+" "+r)}}),C.cssHooks.marginRight=ft(y.reliableMarginRight,function(e,t){if(t)return ut(e,{display:"inline-block"},p,[e,"marginRight"])}),C.cssHooks.marginLeft=ft(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(p(e,"marginLeft"))||(C.contains(e.ownerDocument,e)?e.getBoundingClientRect().left-ut(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}):0))+"px"}),C.each({margin:"",padding:"",border:"Width"},function(i,o){C.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+s[t]+o]=r[t]||r[t-2]||r[0];return n}},at.test(i)||(C.cssHooks[i+o].set=Tt)}),C.fn.extend({css:function(e,t){return d(this,function(e,t,n){var r,i,o={},a=0;if(C.isArray(t)){for(r=l(e),i=t.length;a<i;a++)o[t[a]]=C.css(e,t[a],!1,r);return o}return n!==undefined?C.style(e,t,n):C.css(e,t)},e,t,1<arguments.length)},show:function(){return wt(this,!0)},hide:function(){return wt(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){pe(this)?C(this).show():C(this).hide()})}}),((C.Tween=h).prototype={constructor:h,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||C.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(C.cssNumber[n]?"":"px")},cur:function(){var e=h.propHooks[this.prop];return(e&&e.get?e:h.propHooks._default).get(this)},run:function(e){var t,n=h.propHooks[this.prop];return this.options.duration?this.pos=t=C.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:h.propHooks._default).set(this),this}}).init.prototype=h.prototype,(h.propHooks={_default:{get:function(e){return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(e=C.css(e.elem,e.prop,""))&&"auto"!==e?e:0},set:function(e){C.fx.step[e.prop]?C.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[C.cssProps[e.prop]]&&!C.cssHooks[e.prop]?e.elem[e.prop]=e.now:C.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=h.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},C.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},C.fx=h.prototype.init,C.fx.step={};var N,Nt,k,S,kt=/^(?:toggle|show|hide)$/,St=/queueHooks$/;function At(){return T.setTimeout(function(){N=undefined}),N=C.now()}function Dt(e,t){var n,r={height:e},i=0;for(t=t?1:0;i<4;i+=2-t)r["margin"+(n=s[i])]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function jt(e,t,n){for(var r,i=(A.tweeners[t]||[]).concat(A.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function A(i,e,t){var n,o,r,a,s,u,l,c=0,f=A.prefilters.length,d=C.Deferred().always(function(){delete p.elem}),p=function(){if(o)return!1;for(var e=N||At(),e=Math.max(0,h.startTime+h.duration-e),t=1-(e/h.duration||0),n=0,r=h.tweens.length;n<r;n++)h.tweens[n].run(t);return d.notifyWith(i,[h,t,e]),t<1&&r?e:(d.resolveWith(i,[h]),!1)},h=d.promise({elem:i,props:C.extend({},e),opts:C.extend(!0,{specialEasing:{},easing:C.easing._default},t),originalProperties:e,originalOptions:t,startTime:N||At(),duration:t.duration,tweens:[],createTween:function(e,t){t=C.Tween(i,h.opts,e,t,h.opts.specialEasing[e]||h.opts.easing);return h.tweens.push(t),t},stop:function(e){var t=0,n=e?h.tweens.length:0;if(!o){for(o=!0;t<n;t++)h.tweens[t].run(1);e?(d.notifyWith(i,[h,1,0]),d.resolveWith(i,[h,e])):d.rejectWith(i,[h,e])}return this}}),g=h.props,m=g,y=h.opts.specialEasing;for(r in m)if(s=y[a=C.camelCase(r)],u=m[r],C.isArray(u)&&(s=u[1],u=m[r]=u[0]),r!==a&&(m[a]=u,delete m[r]),(l=C.cssHooks[a])&&"expand"in l)for(r in u=l.expand(u),delete m[a],u)r in m||(m[r]=u[r],y[r]=s);else y[a]=s;for(;c<f;c++)if(n=A.prefilters[c].call(h,i,g,h.opts))return C.isFunction(n.stop)&&(C._queueHooks(h.elem,h.opts.queue).stop=C.proxy(n.stop,n)),n;return C.map(g,jt,h),C.isFunction(h.opts.start)&&h.opts.start.call(i,h),C.fx.timer(C.extend(p,{elem:i,anim:h,queue:h.opts.queue})),h.progress(h.opts.progress).done(h.opts.done,h.opts.complete).fail(h.opts.fail).always(h.opts.always)}C.Animation=C.extend(A,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return he(n.elem,e,de.exec(t),n),n}]},tweener:function(e,t){for(var n,r=0,i=(e=C.isFunction(e)?(t=e,["*"]):e.match(E)).length;r<i;r++)n=e[r],A.tweeners[n]=A.tweeners[n]||[],A.tweeners[n].unshift(t)},prefilters:[function(t,e,n){var r,i,o,a,s,u,l,c=this,f={},d=t.style,p=t.nodeType&&pe(t),h=C._data(t,"fxshow");for(r in n.queue||(null==(s=C._queueHooks(t,"fx")).unqueued&&(s.unqueued=0,u=s.empty.fire,s.empty.fire=function(){s.unqueued||u()}),s.unqueued++,c.always(function(){c.always(function(){s.unqueued--,C.queue(t,"fx").length||s.empty.fire()})})),1===t.nodeType&&("height"in e||"width"in e)&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],"inline"===("none"===(l=C.css(t,"display"))?C._data(t,"olddisplay")||Ze(t.nodeName):l))&&"none"===C.css(t,"float")&&(y.inlineBlockNeedsLayout&&"inline"!==Ze(t.nodeName)?d.zoom=1:d.display="inline-block"),n.overflow&&(d.overflow="hidden",y.shrinkWrapBlocks()||c.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]})),e)if(i=e[r],kt.exec(i)){if(delete e[r],o=o||"toggle"===i,i===(p?"hide":"show")){if("show"!==i||!h||h[r]===undefined)continue;p=!0}f[r]=h&&h[r]||C.style(t,r)}else l=undefined;if(C.isEmptyObject(f))"inline"===("none"===l?Ze(t.nodeName):l)&&(d.display=l);else for(r in h?"hidden"in h&&(p=h.hidden):h=C._data(t,"fxshow",{}),o&&(h.hidden=!p),p?C(t).show():c.done(function(){C(t).hide()}),c.done(function(){for(var e in C._removeData(t,"fxshow"),f)C.style(t,e,f[e])}),f)a=jt(p?h[r]:0,r,c),r in h||(h[r]=a.start,p&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}],prefilter:function(e,t){t?A.prefilters.unshift(e):A.prefilters.push(e)}}),C.speed=function(e,t,n){var r=e&&"object"==typeof e?C.extend({},e):{complete:n||!n&&t||C.isFunction(e)&&e,duration:e,easing:n&&t||t&&!C.isFunction(t)&&t};return r.duration=C.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in C.fx.speeds?C.fx.speeds[r.duration]:C.fx.speeds._default,null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){C.isFunction(r.old)&&r.old.call(this),r.queue&&C.dequeue(this,r.queue)},r},C.fn.extend({fadeTo:function(e,t,n,r){return this.filter(pe).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=C.isEmptyObject(t),o=C.speed(e,n,r),e=function(){var e=A(this,C.extend({},t),o);(i||C._data(this,"finish"))&&e.stop(!0)};return e.finish=e,i||!1===o.queue?this.each(e):this.queue(o.queue,e)},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=undefined),e&&!1!==i&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=C.timers,r=C._data(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&St.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||C.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=C._data(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=C.timers,o=n?n.length:0;for(t.finish=!0,C.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})}}),C.each(["toggle","show","hide"],function(e,r){var i=C.fn[r];C.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(Dt(r,!0),e,t,n)}}),C.each({slideDown:Dt("show"),slideUp:Dt("hide"),slideToggle:Dt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){C.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),C.timers=[],C.fx.tick=function(){var e,t=C.timers,n=0;for(N=C.now();n<t.length;n++)(e=t[n])()||t[n]!==e||t.splice(n--,1);t.length||C.fx.stop(),N=undefined},C.fx.timer=function(e){C.timers.push(e),e()?C.fx.start():C.timers.pop()},C.fx.interval=13,C.fx.start=function(){Nt=Nt||T.setInterval(C.fx.tick,C.fx.interval)},C.fx.stop=function(){T.clearInterval(Nt),Nt=null},C.fx.speeds={slow:600,fast:200,_default:400},C.fn.delay=function(r,e){return r=C.fx&&C.fx.speeds[r]||r,this.queue(e=e||"fx",function(e,t){var n=T.setTimeout(e,r);t.stop=function(){T.clearTimeout(n)}})},k=g.createElement("input"),q=g.createElement("div"),S=g.createElement("select"),e=S.appendChild(g.createElement("option")),(q=g.createElement("div")).setAttribute("className","t"),q.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",F=q.getElementsByTagName("a")[0],k.setAttribute("type","checkbox"),q.appendChild(k),(F=q.getElementsByTagName("a")[0]).style.cssText="top:1px",y.getSetAttribute="t"!==q.className,y.style=/top/.test(F.getAttribute("style")),y.hrefNormalized="/a"===F.getAttribute("href"),y.checkOn=!!k.value,y.optSelected=e.selected,y.enctype=!!g.createElement("form").enctype,S.disabled=!0,y.optDisabled=!e.disabled,(k=g.createElement("input")).setAttribute("value",""),y.input=""===k.getAttribute("value"),k.value="t",k.setAttribute("type","radio"),y.radioValue="t"===k.value;var Lt=/\r/g,Ht=/[\x20\t\r\n\f]+/g;C.fn.extend({val:function(t){var n,e,r,i=this[0];return arguments.length?(r=C.isFunction(t),this.each(function(e){1!==this.nodeType||(null==(e=r?t.call(this,e,C(this).val()):t)?e="":"number"==typeof e?e+="":C.isArray(e)&&(e=C.map(e,function(e){return null==e?"":e+""})),(n=C.valHooks[this.type]||C.valHooks[this.nodeName.toLowerCase()])&&"set"in n&&n.set(this,e,"value")!==undefined)||(this.value=e)})):i?(n=C.valHooks[i.type]||C.valHooks[i.nodeName.toLowerCase()])&&"get"in n&&(e=n.get(i,"value"))!==undefined?e:"string"==typeof(e=i.value)?e.replace(Lt,""):null==e?"":e:void 0}}),C.extend({valHooks:{option:{get:function(e){var t=C.find.attr(e,"value");return null!=t?t:C.trim(C.text(e)).replace(Ht," ")}},select:{get:function(e){for(var t,n=e.options,r=e.selectedIndex,i="select-one"===e.type||r<0,o=i?null:[],a=i?r+1:n.length,s=r<0?a:i?r:0;s<a;s++)if(((t=n[s]).selected||s===r)&&(y.optDisabled?!t.disabled:null===t.getAttribute("disabled"))&&(!t.parentNode.disabled||!C.nodeName(t.parentNode,"optgroup"))){if(t=C(t).val(),i)return t;o.push(t)}return o},set:function(e,t){for(var n,r,i=e.options,o=C.makeArray(t),a=i.length;a--;)if(r=i[a],-1<C.inArray(C.valHooks.option.get(r),o))try{r.selected=n=!0}catch(s){r.scrollHeight}else r.selected=!1;return n||(e.selectedIndex=-1),i}}}}),C.each(["radio","checkbox"],function(){C.valHooks[this]={set:function(e,t){if(C.isArray(t))return e.checked=-1<C.inArray(C(e).val(),t)}},y.checkOn||(C.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var D,qt,j=C.expr.attrHandle,_t=/^(?:checked|selected)$/i,L=y.getSetAttribute,Ft=y.input,Mt=(C.fn.extend({attr:function(e,t){return d(this,C.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){C.removeAttr(this,e)})}}),C.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?C.prop(e,t,n):(1===o&&C.isXMLDoc(e)||(t=t.toLowerCase(),i=C.attrHooks[t]||(C.expr.match.bool.test(t)?qt:D)),n!==undefined?null===n?void C.removeAttr(e,t):i&&"set"in i&&(r=i.set(e,n,t))!==undefined?r:(e.setAttribute(t,n+""),n):!(i&&"get"in i&&null!==(r=i.get(e,t)))&&null==(r=C.find.attr(e,t))?undefined:r)},attrHooks:{type:{set:function(e,t){var n;if(!y.radioValue&&"radio"===t&&C.nodeName(e,"input"))return n=e.value,e.setAttribute("type",t),n&&(e.value=n),t}}},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(E);if(o&&1===e.nodeType)for(;n=o[i++];)r=C.propFix[n]||n,C.expr.match.bool.test(n)?Ft&&L||!_t.test(n)?e[r]=!1:e[C.camelCase("default-"+n)]=e[r]=!1:C.attr(e,n,""),e.removeAttribute(L?n:r)}}),qt={set:function(e,t,n){return!1===t?C.removeAttr(e,n):Ft&&L||!_t.test(n)?e.setAttribute(!L&&C.propFix[n]||n,n):e[C.camelCase("default-"+n)]=e[n]=!0,n}},C.each(C.expr.match.bool.source.match(/\w+/g),function(e,t){var o=j[t]||C.find.attr;Ft&&L||!_t.test(t)?j[t]=function(e,t,n){var r,i;return n||(i=j[t],j[t]=r,r=null!=o(e,t,n)?t.toLowerCase():null,j[t]=i),r}:j[t]=function(e,t,n){if(!n)return e[C.camelCase("default-"+t)]?t.toLowerCase():null}}),Ft&&L||(C.attrHooks.value={set:function(e,t,n){if(!C.nodeName(e,"input"))return D&&D.set(e,t,n);e.defaultValue=t}}),L||(D={set:function(e,t,n){var r=e.getAttributeNode(n);if(r||e.setAttributeNode(r=e.ownerDocument.createAttribute(n)),r.value=t+="","value"===n||t===e.getAttribute(n))return t}},j.id=j.name=j.coords=function(e,t,n){if(!n)return(n=e.getAttributeNode(t))&&""!==n.value?n.value:null},C.valHooks.button={get:function(e,t){t=e.getAttributeNode(t);if(t&&t.specified)return t.value},set:D.set},C.attrHooks.contenteditable={set:function(e,t,n){D.set(e,""!==t&&t,n)}},C.each(["width","height"],function(e,n){C.attrHooks[n]={set:function(e,t){if(""===t)return e.setAttribute(n,"auto"),t}}})),y.style||(C.attrHooks.style={get:function(e){return e.style.cssText||undefined},set:function(e,t){return e.style.cssText=t+""}}),/^(?:input|select|textarea|button|object)$/i),Ot=/^(?:a|area)$/i,Rt=(C.fn.extend({prop:function(e,t){return d(this,C.prop,e,t,1<arguments.length)},removeProp:function(t){return t=C.propFix[t]||t,this.each(function(){try{this[t]=undefined,delete this[t]}catch(e){}})}}),C.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&C.isXMLDoc(e)||(t=C.propFix[t]||t,i=C.propHooks[t]),n!==undefined?i&&"set"in i&&(r=i.set(e,n,t))!==undefined?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=C.find.attr(e,"tabindex");return t?parseInt(t,10):Mt.test(e.nodeName)||Ot.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.hrefNormalized||C.each(["href","src"],function(e,t){C.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),y.optSelected||(C.propHooks.selected={get:function(e){e=e.parentNode;return e&&(e.selectedIndex,e.parentNode)&&e.parentNode.selectedIndex,null},set:function(e){e=e.parentNode;e&&(e.selectedIndex,e.parentNode)&&e.parentNode.selectedIndex}}),C.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){C.propFix[this.toLowerCase()]=this}),y.enctype||(C.propFix.enctype="encoding"),/[\t\r\n\f]/g);function H(e){return C.attr(e,"class")||""}C.fn.extend({addClass:function(t){var e,n,r,i,o,a,s=0;if(C.isFunction(t))return this.each(function(e){C(this).addClass(t.call(this,e,H(this)))});if("string"==typeof t&&t)for(e=t.match(E)||[];n=this[s++];)if(a=H(n),r=1===n.nodeType&&(" "+a+" ").replace(Rt," ")){for(o=0;i=e[o++];)r.indexOf(" "+i+" ")<0&&(r+=i+" ");a!==(a=C.trim(r))&&C.attr(n,"class",a)}return this},removeClass:function(t){var e,n,r,i,o,a,s=0;if(C.isFunction(t))return this.each(function(e){C(this).removeClass(t.call(this,e,H(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof t&&t)for(e=t.match(E)||[];n=this[s++];)if(a=H(n),r=1===n.nodeType&&(" "+a+" ").replace(Rt," ")){for(o=0;i=e[o++];)for(;-1<r.indexOf(" "+i+" ");)r=r.replace(" "+i+" "," ");a!==(a=C.trim(r))&&C.attr(n,"class",a)}return this},toggleClass:function(i,t){var o=typeof i;return"boolean"==typeof t&&"string"==o?t?this.addClass(i):this.removeClass(i):C.isFunction(i)?this.each(function(e){C(this).toggleClass(i.call(this,e,H(this),t),t)}):this.each(function(){var e,t,n,r;if("string"==o)for(t=0,n=C(this),r=i.match(E)||[];e=r[t++];)n.hasClass(e)?n.removeClass(e):n.addClass(e);else i!==undefined&&"boolean"!=o||((e=H(this))&&C._data(this,"__className__",e),C.attr(this,"class",!e&&!1!==i&&C._data(this,"__className__")||""))})},hasClass:function(e){for(var t,n=0,r=" "+e+" ";t=this[n++];)if(1===t.nodeType&&-1<(" "+H(t)+" ").replace(Rt," ").indexOf(r))return!0;return!1}}),C.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,n){C.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}}),C.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}});var q=T.location,Pt=C.now(),Bt=/\?/,Wt=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g,It=(C.parseJSON=function(e){var i,o,t;return T.JSON&&T.JSON.parse?T.JSON.parse(e+""):(o=null,(t=C.trim(e+""))&&!C.trim(t.replace(Wt,function(e,t,n,r){return 0===(o=i&&t?0:o)?e:(i=n||t,o+=!r-!n,"")}))?Function("return "+t)():C.error("Invalid JSON: "+e))},C.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{T.DOMParser?t=(new T.DOMParser).parseFromString(e,"text/xml"):((t=new T.ActiveXObject("Microsoft.XMLDOM"))["async"]="false",t.loadXML(e))}catch(n){t=undefined}return t&&t.documentElement&&!t.getElementsByTagName("parsererror").length||C.error("Invalid XML: "+e),t},/#.*$/),$t=/([?&])_=[^&]*/,zt=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Xt=/^(?:GET|HEAD)$/,Ut=/^\/\//,Vt=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Yt={},Jt={},Gt="*/".concat("*"),Kt=q.href,_=Vt.exec(Kt.toLowerCase())||[];function Qt(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(E)||[];if(C.isFunction(t))for(;n=i[r++];)"+"===n.charAt(0)?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Zt(t,r,i,o){var a={},s=t===Jt;function u(e){var n;return a[e]=!0,C.each(t[e]||[],function(e,t){t=t(r,i,o);return"string"!=typeof t||s||a[t]?s?!(n=t):void 0:(r.dataTypes.unshift(t),u(t),!1)}),n}return u(r.dataTypes[0])||!a["*"]&&u("*")}function en(e,t){var n,r,i=C.ajaxSettings.flatOptions||{};for(r in t)t[r]!==undefined&&((i[r]?e:n=n||{})[r]=t[r]);return n&&C.extend(!0,e,n),e}function tn(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];for(o=c.shift();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(f){return{state:"parsererror",error:a?f:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}function nn(e){if(!C.contains(e.ownerDocument||g,e))return!0;for(;e&&1===e.nodeType;){if("none"===((t=e).style&&t.style.display||C.css(t,"display"))||"hidden"===e.type)return!0;e=e.parentNode}var t;return!1}C.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Kt,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(_[1]),global:!0,processData:!0,"async":!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Gt,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":C.parseJSON,"text xml":C.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?en(en(e,C.ajaxSettings),t):en(C.ajaxSettings,e)},ajaxPrefilter:Qt(Yt),ajaxTransport:Qt(Jt),ajax:function(e,t){"object"==typeof e&&(t=e,e=undefined);var n,u,l,c,f,d,r,p=C.ajaxSetup({},t=t||{}),h=p.context||p,g=p.context&&(h.nodeType||h.jquery)?C(h):C.event,m=C.Deferred(),y=C.Callbacks("once memory"),v=p.statusCode||{},i={},o={},x=0,a="canceled",b={readyState:0,getResponseHeader:function(e){var t;if(2===x){if(!r)for(r={};t=zt.exec(l);)r[t[1].toLowerCase()]=t[2];t=r[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===x?l:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return x||(e=o[n]=o[n]||e,i[e]=t),this},overrideMimeType:function(e){return x||(p.mimeType=e),this},statusCode:function(e){if(e)if(x<2)for(var t in e)v[t]=[v[t],e[t]];else b.always(e[b.status]);return this},abort:function(e){e=e||a;return d&&d.abort(e),s(0,e),this}};if(m.promise(b).complete=y.add,b.success=b.done,b.error=b.fail,p.url=((e||p.url||Kt)+"").replace(It,"").replace(Ut,_[1]+"//"),p.type=t.method||t.type||p.method||p.type,p.dataTypes=C.trim(p.dataType||"*").toLowerCase().match(E)||[""],null==p.crossDomain&&(e=Vt.exec(p.url.toLowerCase()),p.crossDomain=!(!e||e[1]===_[1]&&e[2]===_[2]&&(e[3]||("http:"===e[1]?"80":"443"))===(_[3]||("http:"===_[1]?"80":"443")))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=C.param(p.data,p.traditional)),Zt(Yt,p,t,b),2!==x){for(n in(f=C.event&&p.global)&&0==C.active++&&C.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Xt.test(p.type),u=p.url,p.hasContent||(p.data&&(u=p.url+=(Bt.test(u)?"&":"?")+p.data,delete p.data),!1===p.cache&&(p.url=$t.test(u)?u.replace($t,"$1_="+Pt++):u+(Bt.test(u)?"&":"?")+"_="+Pt++)),p.ifModified&&(C.lastModified[u]&&b.setRequestHeader("If-Modified-Since",C.lastModified[u]),C.etag[u])&&b.setRequestHeader("If-None-Match",C.etag[u]),(p.data&&p.hasContent&&!1!==p.contentType||t.contentType)&&b.setRequestHeader("Content-Type",p.contentType),b.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Gt+"; q=0.01":""):p.accepts["*"]),p.headers)b.setRequestHeader(n,p.headers[n]);if(p.beforeSend&&(!1===p.beforeSend.call(h,b,p)||2===x))return b.abort();for(n in a="abort",{success:1,error:1,complete:1})b[n](p[n]);if(d=Zt(Jt,p,t,b)){if(b.readyState=1,f&&g.trigger("ajaxSend",[b,p]),2===x)return b;p["async"]&&0<p.timeout&&(c=T.setTimeout(function(){b.abort("timeout")},p.timeout));try{x=1,d.send(i,s)}catch(w){if(!(x<2))throw w;s(-1,w)}}else s(-1,"No Transport")}return b;function s(e,t,n,r){var i,o,a,s=t;2!==x&&(x=2,c&&T.clearTimeout(c),d=undefined,l=r||"",b.readyState=0<e?4:0,r=200<=e&&e<300||304===e,n&&(a=function(e,t,n){for(var r,i,o,a,s=e.contents,u=e.dataTypes;"*"===u[0];)u.shift(),i===undefined&&(i=e.mimeType||t.getResponseHeader("Content-Type"));if(i)for(a in s)if(s[a]&&s[a].test(i)){u.unshift(a);break}if(u[0]in n)o=u[0];else{for(a in n){if(!u[0]||e.converters[a+" "+u[0]]){o=a;break}r=r||a}o=o||r}if(o)return o!==u[0]&&u.unshift(o),n[o]}(p,b,n)),a=tn(p,a,b,r),r?(p.ifModified&&((n=b.getResponseHeader("Last-Modified"))&&(C.lastModified[u]=n),n=b.getResponseHeader("etag"))&&(C.etag[u]=n),204===e||"HEAD"===p.type?s="nocontent":304===e?s="notmodified":(s=a.state,i=a.data,r=!(o=a.error))):(o=s,!e&&s||(s="error",e<0&&(e=0))),b.status=e,b.statusText=(t||s)+"",r?m.resolveWith(h,[i,s,b]):m.rejectWith(h,[b,s,o]),b.statusCode(v),v=undefined,f&&g.trigger(r?"ajaxSuccess":"ajaxError",[b,p,r?i:o]),y.fireWith(h,[b,s]),f)&&(g.trigger("ajaxComplete",[b,p]),--C.active||C.event.trigger("ajaxStop"))}},getJSON:function(e,t,n){return C.get(e,t,n,"json")},getScript:function(e,t){return C.get(e,undefined,t,"script")}}),C.each(["get","post"],function(e,i){C[i]=function(e,t,n,r){return C.isFunction(t)&&(r=r||n,n=t,t=undefined),C.ajax(C.extend({url:e,type:i,dataType:r,data:t,success:n},C.isPlainObject(e)&&e))}}),C._evalUrl=function(e){return C.ajax({url:e,type:"GET",dataType:"script",cache:!0,"async":!1,global:!1,"throws":!0})},C.fn.extend({wrapAll:function(t){var e;return C.isFunction(t)?this.each(function(e){C(this).wrapAll(t.call(this,e))}):(this[0]&&(e=C(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map(function(){for(var e=this;e.firstChild&&1===e.firstChild.nodeType;)e=e.firstChild;return e}).append(this)),this)},wrapInner:function(n){return C.isFunction(n)?this.each(function(e){C(this).wrapInner(n.call(this,e))}):this.each(function(){var e=C(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=C.isFunction(t);return this.each(function(e){C(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(){return this.parent().each(function(){C.nodeName(this,"body")||C(this).replaceWith(this.childNodes)}).end()}}),C.expr.filters.hidden=function(e){return y.reliableHiddenOffsets()?e.offsetWidth<=0&&e.offsetHeight<=0&&!e.getClientRects().length:nn(e)},C.expr.filters.visible=function(e){return!C.expr.filters.hidden(e)};var rn=/%20/g,on=/\[\]$/,an=/\r?\n/g,sn=/^(?:submit|button|image|reset|file)$/i,un=/^(?:input|select|textarea|keygen)/i;C.param=function(e,t){var n,r=[],i=function(e,t){t=C.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(t===undefined&&(t=C.ajaxSettings&&C.ajaxSettings.traditional),C.isArray(e)||e.jquery&&!C.isPlainObject(e))C.each(e,function(){i(this.name,this.value)});else for(n in e)!function o(n,e,r,i){if(C.isArray(e))C.each(e,function(e,t){r||on.test(n)?i(n,t):o(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==C.type(e))i(n,e);else for(var t in e)o(n+"["+t+"]",e[t],r,i)}(n,e[n],t,i);return r.join("&").replace(rn,"+")},C.fn.extend({serialize:function(){return C.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=C.prop(this,"elements");return e?C.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!C(this).is(":disabled")&&un.test(this.nodeName)&&!sn.test(e)&&(this.checked||!ge.test(e))}).map(function(e,t){var n=C(this).val();return null==n?null:C.isArray(n)?C.map(n,function(e){return{name:t.name,value:e.replace(an,"\r\n")}}):{name:t.name,value:n.replace(an,"\r\n")}}).get()}}),C.ajaxSettings.xhr=T.ActiveXObject!==undefined?function(){return this.isLocal?dn():8<g.documentMode?fn():/^(get|post|head|put|delete|options)$/i.test(this.type)&&fn()||dn()}:fn;var ln=0,cn={},F=C.ajaxSettings.xhr();function fn(){try{return new T.XMLHttpRequest}catch(e){}}function dn(){try{return new T.ActiveXObject("Microsoft.XMLHTTP")}catch(e){}}T.attachEvent&&T.attachEvent("onunload",function(){for(var e in cn)cn[e](undefined,!0)}),y.cors=!!F&&"withCredentials"in F,(y.ajax=!!F)&&C.ajaxTransport(function(l){var c;if(!l.crossDomain||y.cors)return{send:function(e,a){var t,s=l.xhr(),u=++ln;if(s.open(l.type,l.url,l["async"],l.username,l.password),l.xhrFields)for(t in l.xhrFields)s[t]=l.xhrFields[t];for(t in l.mimeType&&s.overrideMimeType&&s.overrideMimeType(l.mimeType),l.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)e[t]!==undefined&&s.setRequestHeader(t,e[t]+"");s.send(l.hasContent&&l.data||null),c=function(e,t){var n,r,i;if(c&&(t||4===s.readyState))if(delete cn[u],c=undefined,s.onreadystatechange=C.noop,t)4!==s.readyState&&s.abort();else{i={},n=s.status,"string"==typeof s.responseText&&(i.text=s.responseText);try{r=s.statusText}catch(o){r=""}n||!l.isLocal||l.crossDomain?1223===n&&(n=204):n=i.text?200:404}i&&a(n,r,i,s.getAllResponseHeaders())},l["async"]?4===s.readyState?T.setTimeout(c):s.onreadystatechange=cn[u]=c:c()},abort:function(){c&&c(undefined,!0)}}}),C.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 C.globalEval(e),e}}}),C.ajaxPrefilter("script",function(e){e.cache===undefined&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),C.ajaxTransport("script",function(t){var r,i;if(t.crossDomain)return i=g.head||C("head")[0]||g.documentElement,{send:function(e,n){(r=g.createElement("script"))["async"]=!0,t.scriptCharset&&(r.charset=t.scriptCharset),r.src=t.url,r.onload=r.onreadystatechange=function(e,t){!t&&r.readyState&&!/loaded|complete/.test(r.readyState)||(r.onload=r.onreadystatechange=null,r.parentNode&&r.parentNode.removeChild(r),r=null,t)||n(200,"success")},i.insertBefore(r,i.firstChild)},abort:function(){r&&r.onload(undefined,!0)}}});var pn=[],hn=/(=)\?(?=&|$)|\?\?/,gn=(C.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=pn.pop()||C.expando+"_"+Pt++;return this[e]=!0,e}}),C.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(hn.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&hn.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=C.isFunction(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(hn,"$1"+r):!1!==e.jsonp&&(e.url+=(Bt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||C.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=T[r],T[r]=function(){o=arguments},n.always(function(){i===undefined?C(T).removeProp(r):T[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,pn.push(r)),o&&C.isFunction(i)&&i(o[0]),o=i=undefined}),"script"}),C.parseHTML=function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||g;var r=J.exec(e),n=!n&&[];return r?[t.createElement(r[1])]:(r=Ne([e],t,n),n&&n.length&&C(n).remove(),C.merge([],r.childNodes))},C.fn.load);function mn(e){return C.isWindow(e)?e:9===e.nodeType&&(e.defaultView||e.parentWindow)}return C.fn.load=function(e,t,n){var r,i,o,a,s;return"string"!=typeof e&&gn?gn.apply(this,arguments):(a=this,-1<(s=e.indexOf(" "))&&(r=C.trim(e.slice(s,e.length)),e=e.slice(0,s)),C.isFunction(t)?(n=t,t=undefined):t&&"object"==typeof t&&(i="POST"),0<a.length&&C.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?C("<div>").append(C.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this)},C.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){C.fn[t]=function(e){return this.on(t,e)}}),C.expr.filters.animated=function(t){return C.grep(C.timers,function(e){return t===e.elem}).length},C.offset={setOffset:function(e,t,n){var r,i,o,a,s=C.css(e,"position"),u=C(e),l={};"static"===s&&(e.style.position="relative"),o=u.offset(),r=C.css(e,"top"),a=C.css(e,"left"),s=("absolute"===s||"fixed"===s)&&-1<C.inArray("auto",[r,a])?(i=(s=u.position()).top,s.left):(i=parseFloat(r)||0,parseFloat(a)||0),null!=(t=C.isFunction(t)?t.call(e,n,C.extend({},o)):t).top&&(l.top=t.top-o.top+i),null!=t.left&&(l.left=t.left-o.left+s),"using"in t?t.using.call(e,l):u.css(l)}},C.fn.extend({offset:function(t){var e,n,r,i;return arguments.length?t===undefined?this:this.each(function(e){C.offset.setOffset(this,t,e)}):(n={top:0,left:0},(i=(r=this[0])&&r.ownerDocument)?(e=i.documentElement,C.contains(e,r)?("undefined"!=typeof r.getBoundingClientRect&&(n=r.getBoundingClientRect()),r=mn(i),{top:n.top+(r.pageYOffset||e.scrollTop)-(e.clientTop||0),left:n.left+(r.pageXOffset||e.scrollLeft)-(e.clientLeft||0)}):n):void 0)},position:function(){var e,t,n,r;if(this[0])return n={top:0,left:0},r=this[0],"fixed"===C.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),(n=C.nodeName(e[0],"html")?n:e.offset()).top+=C.css(e[0],"borderTopWidth",!0),n.left+=C.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-C.css(r,"marginTop",!0),left:t.left-n.left-C.css(r,"marginLeft",!0)}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&!C.nodeName(e,"html")&&"static"===C.css(e,"position");)e=e.offsetParent;return e||lt})}}),C.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o=/Y/.test(i);C.fn[t]=function(e){return d(this,function(e,t,n){var r=mn(e);if(n===undefined)return r?i in r?r[i]:r.document.documentElement[t]:e[t];r?r.scrollTo(o?C(r).scrollLeft():n,o?n:C(r).scrollTop()):e[t]=n},t,e,arguments.length,null)}}),C.each(["top","left"],function(e,n){C.cssHooks[n]=ft(y.pixelPosition,function(e,t){if(t)return t=p(e,n),st.test(t)?C(e).position()[n]+"px":t})}),C.each({Height:"height",Width:"width"},function(o,a){C.each({padding:"inner"+o,content:a,"":"outer"+o},function(r,e){C.fn[e]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return d(this,function(e,t,n){var r;return C.isWindow(e)?e.document.documentElement["client"+o]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+o],r["scroll"+o],e.body["offset"+o],r["offset"+o],r["client"+o])):n===undefined?C.css(e,t,i):C.style(e,t,n,i)},a,n?e:undefined,n,null)}})}),C.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)}}),C.fn.size=function(){return this.length},C.fn.andSelf=C.fn.addBack,layui.define(function(e){e("jquery",layui.$=C)}),C});!function(p,m){"use strict";var h,g,e,n=p.layui&&layui.define,f={getPath:(e=document.currentScript&&"SCRIPT"===document.currentScript.tagName.toUpperCase()?document.currentScript.src:function(){for(var e,t=document.getElementsByTagName("script"),i=t.length-1,n=i;0<n;n--)if("interactive"===t[n].readyState){e=t[n].src;break}return e||t[i].src}(),(p.LAYUI_GLOBAL||{}).layer_dir||e.substring(0,e.lastIndexOf("/")+1)),config:{removeFocus:!0},end:{},beforeEnd:{},events:{resize:{}},minStackIndex:0,minStackArr:[],btn:["\u786e\u5b9a","\u53d6\u6d88"],type:["dialog","page","iframe","loading","tips"],getStyle:function(e,t){e=e.currentStyle||p.getComputedStyle(e,null);return e[e.getPropertyValue?"getPropertyValue":"getAttribute"](t)},link:function(e,i,t){var n,a,o,s,r,l;v.path&&(n=document.getElementsByTagName("head")[0],a=document.createElement("link"),o=((t="string"==typeof i?i:t)||e).replace(/\.|\//g,""),s="layuicss-"+o,r="creating",l=0,a.rel="stylesheet",a.href=v.path+e,a.id=s,document.getElementById(s)||n.appendChild(a),"function"==typeof i)&&!function c(e){var t=document.getElementById(s);return 100<++l?p.console&&console.error(o+".css: Invalid"):void(1989===parseInt(f.getStyle(t,"width"))?(e===r&&t.removeAttribute("lay-status"),t.getAttribute("lay-status")===r?setTimeout(c,100):i()):(t.setAttribute("lay-status",r),setTimeout(function(){c(r)},100)))}()}},v={v:"3.7.0",ie:(e=navigator.userAgent.toLowerCase(),!!(p.ActiveXObject||"ActiveXObject"in p)&&((e.match(/msie\s(\d+)/)||[])[1]||"11")),index:p.layer&&p.layer.v?1e5:0,path:f.getPath,config:function(e,t){return v.cache=f.config=h.extend({},f.config,e=e||{}),v.path=f.config.path||v.path,"string"==typeof e.extend&&(e.extend=[e.extend]),f.config.path&&v.ready(),e.extend&&(n?layui.addcss("modules/layer/"+e.extend):f.link("css/"+e.extend)),this},ready:function(e){var t="layer",i=(n?"modules/":"css/")+"layer.css?v="+v.v;return n?layui["layui.all"]?"function"==typeof e&&e():layui.addcss(i,e,t):f.link(i,e,t),this},alert:function(e,t,i){var n="function"==typeof t;return v.open(h.extend({content:e,yes:i=n?t:i},n?{}:t))},confirm:function(e,t,i,n){var a="function"==typeof t;return a&&(n=i,i=t),v.open(h.extend({content:e,btn:f.btn,yes:i,btn2:n},a?{}:t))},msg:function(e,t,i){var n="function"==typeof t,a=f.config.skin,a=(a?a+" "+a+"-msg":"")||"layui-layer-msg",o=u.anim.length-1;return n&&(i=t),v.open(h.extend({content:e,time:3e3,shade:!1,skin:a,title:!1,closeBtn:!1,btn:!1,resize:!1,end:i,removeFocus:!1},n&&!f.config.skin?{skin:a+" layui-layer-hui",anim:o}:(-1!==(t=t||{}).icon&&(t.icon!==m||f.config.skin)||(t.skin=a+" "+(t.skin||"layui-layer-hui")),t)))},load:function(e,t){return v.open(h.extend({type:3,icon:e||0,resize:!1,shade:.01,removeFocus:!1},t))},tips:function(e,t,i){return v.open(h.extend({type:4,content:[e,t],closeBtn:!1,time:3e3,shade:!1,resize:!1,fixed:!1,maxWidth:260,removeFocus:!1},i))}},t=function(e){var t=this,i=function(){t.creat()};t.index=++v.index,t.config.maxWidth=h(g).width()-30,t.config=h.extend({},t.config,f.config,e),document.body?i():setTimeout(function(){i()},30)},u=(t.pt=t.prototype,["layui-layer",".layui-layer-title",".layui-layer-main",".layui-layer-dialog","layui-layer-iframe","layui-layer-content","layui-layer-btn","layui-layer-close"]),y=(u.anim={0:"layer-anim-00",1:"layer-anim-01",2:"layer-anim-02",3:"layer-anim-03",4:"layer-anim-04",5:"layer-anim-05",6:"layer-anim-06",slideDown:"layer-anim-slide-down",slideLeft:"layer-anim-slide-left",slideUp:"layer-anim-slide-up",slideRight:"layer-anim-slide-right"},u.SHADE="layui-layer-shade",u.MOVE="layui-layer-move","LAYUI-LAYER-SHADE-KEY"),l="LAYUI_LAYER_CONTENT_RECORD_HEIGHT",i=(t.pt.config={type:0,shade:.3,fixed:!0,move:u[1],title:"\u4fe1\u606f",offset:"auto",area:"auto",closeBtn:1,icon:-1,time:0,zIndex:19891014,maxWidth:360,anim:0,isOutAnim:!0,minStack:!0,moveType:1,resize:!0,scrollbar:!0,tips:2},t.pt.vessel=function(e,t){var i,n=this.index,a=this.config,o=a.zIndex+n,s="object"==typeof a.title,r=a.maxmin&&(1===a.type||2===a.type),s=a.title?'<div class="layui-layer-title" style="'+(s?a.title[1]:"")+'">'+(s?a.title[0]:a.title)+"</div>":"";return a.zIndex=o,t([a.shade?'<div class="'+u.SHADE+'" id="'+u.SHADE+n+'" times="'+n+'" style="z-index:'+(o-1)+'; "></div>':"",'<div class="'+u[0]+" layui-layer-"+f.type[a.type]+(0!=a.type&&2!=a.type||a.shade?"":" layui-layer-border")+" "+(a.skin||"")+'" id="'+u[0]+n+'" type="'+f.type[a.type]+'" times="'+n+'" showtime="'+a.time+'" conType="'+(e?"object":"string")+'" style="z-index: '+o+"; width:"+a.area[0]+";height:"+a.area[1]+";position:"+(a.fixed?"fixed;":"absolute;")+'">'+(e&&2!=a.type?"":s)+"<div"+(a.id?' id="'+a.id+'"':"")+' class="layui-layer-content'+(0==a.type&&-1!==a.icon?" layui-layer-padding":"")+(3==a.type?" layui-layer-loading"+a.icon:"")+'">'+(n=["layui-icon-tips","layui-icon-success","layui-icon-error","layui-icon-question","layui-icon-lock","layui-icon-face-cry","layui-icon-face-smile"],o="layui-anim layui-anim-rotate layui-anim-loop",0==a.type&&-1!==a.icon?'<i class="layui-layer-face layui-icon '+((i=16==a.icon?"layui-icon layui-icon-loading "+o:i)||n[a.icon]||n[0])+'"></i>':3==a.type?(i=["layui-icon-loading","layui-icon-loading-1"],2==a.icon?'<div class="layui-layer-loading-2 '+o+'"></div>':'<i class="layui-layer-loading-icon layui-icon '+(i[a.icon]||i[0])+" "+o+'"></i>'):"")+((1!=a.type||!e)&&a.content||"")+'</div><div class="layui-layer-setwin">'+(n=[],r&&(n.push('<span class="layui-layer-min"></span>'),n.push('<span class="layui-layer-max"></span>')),a.closeBtn&&n.push('<span class="layui-icon layui-icon-close '+[u[7],u[7]+(a.title?a.closeBtn:4==a.type?"1":"2")].join(" ")+'"></span>'),n.join(""))+"</div>"+(a.btn?function(){var e="";"string"==typeof a.btn&&(a.btn=[a.btn]);for(var t,i=0,n=a.btn.length;i<n;i++)e+='<a class="'+u[6]+i+'">'+a.btn[i]+"</a>";return'<div class="'+(t=[u[6]],a.btnAlign&&t.push(u[6]+"-"+a.btnAlign),t.join(" "))+'">'+e+"</div>"}():"")+(a.resize?'<span class="layui-layer-resize"></span>':"")+"</div>"],s,h('<div class="'+u.MOVE+'" id="'+u.MOVE+'"></div>')),this},t.pt.creat=function(){var e,t,i,n,a=this,o=a.config,s=a.index,r="object"==typeof(d=o.content),l=h("body"),c=function(e){var t;o.shift&&(o.anim=o.shift),u.anim[o.anim]&&(t="layer-anim "+u.anim[o.anim],e.addClass(t).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){h(this).removeClass(t)}))};if(o.id&&h("."+u[0]).find("#"+o.id)[0])e=h("#"+o.id).closest("."+u[0]),t=e.attr("times"),i=e.data("config"),n=h("#"+u.SHADE+t),"min"===(e.data("maxminStatus")||{})?v.restore(t):i.hideOnClose&&(n.show(),e.show(),c(e),setTimeout(function(){n.css({opacity:n.data(y)})},10));else{switch(o.removeFocus&&document.activeElement&&document.activeElement.blur(),"string"==typeof o.area&&(o.area="auto"===o.area?["",""]:[o.area,""]),6==v.ie&&(o.fixed=!1),o.type){case 0:o.btn="btn"in o?o.btn:f.btn[0],v.closeAll("dialog");break;case 2:var d=o.content=r?o.content:[o.content||"","auto"];o.content='<iframe scrolling="'+(o.content[1]||"auto")+'" allowtransparency="true" id="'+u[4]+s+'" name="'+u[4]+s+'" onload="this.className=\'\';" class="layui-layer-load" frameborder="0" src="'+o.content[0]+'"></iframe>';break;case 3:delete o.title,delete o.closeBtn,-1===o.icon&&o.icon,v.closeAll("loading");break;case 4:r||(o.content=[o.content,"body"]),o.follow=o.content[1],o.content=o.content[0]+'<i class="layui-layer-TipsG"></i>',delete o.title,o.tips="object"==typeof o.tips?o.tips:[o.tips,!0],o.tipsMore||v.closeAll("tips")}a.vessel(r,function(e,t,i){l.append(e[0]),r?2==o.type||4==o.type?h("body").append(e[1]):d.parents("."+u[0])[0]||(d.data("display",d.css("display")).show().addClass("layui-layer-wrap").wrap(e[1]),h("#"+u[0]+s).find("."+u[5]).before(t)):l.append(e[1]),h("#"+u.MOVE)[0]||l.append(f.moveElem=i),a.layero=h("#"+u[0]+s),a.shadeo=h("#"+u.SHADE+s),o.scrollbar||f.setScrollbar(s)}).auto(s),a.shadeo.css({"background-color":o.shade[1]||"#000",opacity:o.shade[0]||o.shade,transition:o.shade[2]||""}),a.shadeo.data(y,o.shade[0]||o.shade),2==o.type&&6==v.ie&&a.layero.find("iframe").attr("src",d[0]),4==o.type?a.tips():(a.offset(),parseInt(f.getStyle(document.getElementById(u.MOVE),"z-index"))||(a.layero.css("visibility","hidden"),v.ready(function(){a.offset(),a.layero.css("visibility","visible")}))),!o.fixed||f.events.resize[a.index]||(f.events.resize[a.index]=function(){a.resize()},g.on("resize",f.events.resize[a.index])),o.time<=0||setTimeout(function(){v.close(a.index)},o.time),a.move().callback(),c(a.layero),a.layero.data("config",o)}},t.pt.resize=function(){var e=this,t=e.config;e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(e.index),4==t.type&&e.tips()},t.pt.auto=function(e){var t=this.config,i=h("#"+u[0]+e),n=((""===t.area[0]||"auto"===t.area[0])&&0<t.maxWidth&&(v.ie&&v.ie<8&&t.btn&&i.width(i.innerWidth()),i.outerWidth()>t.maxWidth)&&i.width(t.maxWidth),[i.innerWidth(),i.innerHeight()]),a=i.find(u[1]).outerHeight()||0,o=i.find("."+u[6]).outerHeight()||0,e=function(e){(e=i.find(e)).height(n[1]-a-o-2*(0|parseFloat(e.css("padding-top"))))};return 2===t.type?e("iframe"):""===t.area[1]||"auto"===t.area[1]?0<t.maxHeight&&i.outerHeight()>t.maxHeight?(n[1]=t.maxHeight,e("."+u[5])):t.fixed&&n[1]>=g.height()&&(n[1]=g.height(),e("."+u[5])):e("."+u[5]),this},t.pt.offset=function(){var e=this,t=e.config,i=e.layero,n=[i.outerWidth(),i.outerHeight()],a="object"==typeof t.offset;e.offsetTop=(g.height()-n[1])/2,e.offsetLeft=(g.width()-n[0])/2,a?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=g.width()-n[0]:"b"===t.offset?e.offsetTop=g.height()-n[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=g.height()-n[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=g.width()-n[0]):"rb"===t.offset?(e.offsetTop=g.height()-n[1],e.offsetLeft=g.width()-n[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?g.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?g.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=g.scrollTop(),e.offsetLeft+=g.scrollLeft()),"min"===i.data("maxminStatus")&&(e.offsetTop=g.height()-(i.find(u[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},t.pt.tips=function(){var e=this.config,t=this.layero,i=[t.outerWidth(),t.outerHeight()],n=h(e.follow),a={width:(n=n[0]?n:h("body")).outerWidth(),height:n.outerHeight(),top:n.offset().top,left:n.offset().left},o=t.find(".layui-layer-TipsG"),n=e.tips[0];e.tips[1]||o.remove(),a.autoLeft=function(){0<a.left+i[0]-g.width()?(a.tipLeft=a.left+a.width-i[0],o.css({right:12,left:"auto"})):a.tipLeft=a.left},a.where=[function(){a.autoLeft(),a.tipTop=a.top-i[1]-10,o.removeClass("layui-layer-TipsB").addClass("layui-layer-TipsT").css("border-right-color",e.tips[1])},function(){a.tipLeft=a.left+a.width+10,a.tipTop=a.top-(.75*a.height<21?21-.5*a.height:0),a.tipTop=Math.max(a.tipTop,0),o.removeClass("layui-layer-TipsL").addClass("layui-layer-TipsR").css("border-bottom-color",e.tips[1])},function(){a.autoLeft(),a.tipTop=a.top+a.height+10,o.removeClass("layui-layer-TipsT").addClass("layui-layer-TipsB").css("border-right-color",e.tips[1])},function(){a.tipLeft=a.left-i[0]-10,a.tipTop=a.top-(.75*a.height<21?21-.5*a.height:0),a.tipTop=Math.max(a.tipTop,0),o.removeClass("layui-layer-TipsR").addClass("layui-layer-TipsL").css("border-bottom-color",e.tips[1])}],a.where[n-1](),1===n?a.top-(g.scrollTop()+i[1]+16)<0&&a.where[2]():2===n?0<g.width()-(a.left+a.width+i[0]+16)||a.where[3]():3===n?0<a.top-g.scrollTop()+a.height+i[1]+16-g.height()&&a.where[0]():4===n&&0<i[0]+16-a.left&&a.where[1](),t.find("."+u[5]).css({"background-color":e.tips[1],"padding-right":e.closeBtn?"30px":""}),t.css({left:a.tipLeft-(e.fixed?g.scrollLeft():0),top:a.tipTop-(e.fixed?g.scrollTop():0)})},t.pt.move=function(){var n=this,a=n.config,e=h(document),o=n.layero,l=["LAY_MOVE_DICT","LAY_RESIZE_DICT"],t=o.find(a.move),i=o.find(".layui-layer-resize");return a.move&&t.css("cursor","move"),t.on("mousedown",function(e){var t,i;e.button||(t=h(this),i={},a.move&&(i.layero=o,i.config=a,i.offset=[e.clientX-parseFloat(o.css("left")),e.clientY-parseFloat(o.css("top"))],t.data(l[0],i),f.eventMoveElem=t,f.moveElem.css("cursor","move").show()),e.preventDefault())}),i.on("mousedown",function(e){var t=h(this),i={};a.resize&&(i.layero=o,i.config=a,i.offset=[e.clientX,e.clientY],i.index=n.index,i.area=[o.outerWidth(),o.outerHeight()],t.data(l[1],i),f.eventResizeElem=t,f.moveElem.css("cursor","se-resize").show()),e.preventDefault()}),f.docEvent||(e.on("mousemove",function(e){var t,i,n,a,o,s,r;f.eventMoveElem&&(t=(a=f.eventMoveElem.data(l[0])||{}).layero,o=a.config,s=e.clientX-a.offset[0],r=e.clientY-a.offset[1],i="fixed"===t.css("position"),e.preventDefault(),a.stX=i?0:g.scrollLeft(),a.stY=i?0:g.scrollTop(),o.moveOut||(i=g.width()-t.outerWidth()+a.stX,n=g.height()-t.outerHeight()+a.stY,i<(s=s<a.stX?a.stX:s)&&(s=i),n<(r=r<a.stY?a.stY:r)&&(r=n)),t.css({left:s,top:r})),f.eventResizeElem&&(o=(a=f.eventResizeElem.data(l[1])||{}).config,s=e.clientX-a.offset[0],r=e.clientY-a.offset[1],e.preventDefault(),v.style(a.index,{width:a.area[0]+s,height:a.area[1]+r}),o.resizing)&&o.resizing(a.layero)}).on("mouseup",function(e){var t,i;f.eventMoveElem&&(i=(t=f.eventMoveElem.data(l[0])||{}).config,f.eventMoveElem.removeData(l[0]),delete f.eventMoveElem,f.moveElem.hide(),i.moveEnd)&&i.moveEnd(t.layero),f.eventResizeElem&&(f.eventResizeElem.removeData(l[1]),delete f.eventResizeElem,f.moveElem.hide())}),f.docEvent=!0),n},t.pt.btnLoading=function(e,t){t?e.find(".layui-layer-btn-loading-icon")[0]||e.addClass("layui-layer-btn-is-loading").attr({disabled:""}).prepend('<i class="layui-layer-btn-loading-icon layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"></i>'):e.removeClass("layui-layer-btn-is-loading").removeAttr("disabled").find(".layui-layer-btn-loading-icon").remove()},t.pt.callback=function(){var n=this,a=n.layero,o=n.config;n.openLayer(),o.success&&(2==o.type?a.find("iframe").on("load",function(){o.success(a,n.index,n)}):o.success(a,n.index,n)),6==v.ie&&n.IE6(a),a.find("."+u[6]).children("a").on("click",function(){var e,t=h(this),i=t.index();t.attr("disabled")||(o.btnAsync?(e=0===i?o.yes||o.btn1:o["btn"+(i+1)],n.loading=function(e){n.btnLoading(t,e)},e?f.promiseLikeResolve(e.call(o,n.index,a,n)).then(function(e){!1!==e&&v.close(n.index)},function(e){e!==m&&p.console&&p.console.error("layer error hint: "+e)}):v.close(n.index)):0===i?o.yes?o.yes(n.index,a,n):o.btn1?o.btn1(n.index,a,n):v.close(n.index):!1!==(o["btn"+(i+1)]&&o["btn"+(i+1)](n.index,a,n))&&v.close(n.index))}),a.find("."+u[7]).on("click",function(){!1!==(o.cancel&&o.cancel(n.index,a,n))&&v.close(n.index)}),o.shadeClose&&n.shadeo.on("click",function(){v.close(n.index)}),a.find(".layui-layer-min").on("click",function(){!1!==(o.min&&o.min(a,n.index,n))&&v.min(n.index,o)}),a.find(".layui-layer-max").on("click",function(){h(this).hasClass("layui-layer-maxmin")?(v.restore(n.index),o.restore&&o.restore(a,n.index,n)):(v.full(n.index,o),setTimeout(function(){o.full&&o.full(a,n.index,n)},100))}),o.end&&(f.end[n.index]=o.end),o.beforeEnd&&(f.beforeEnd[n.index]=h.proxy(o.beforeEnd,o,a,n.index,n))},f.reselect=function(){h.each(h("select"),function(e,t){var i=h(this);i.parents("."+u[0])[0]||1==i.attr("layer")&&h("."+u[0]).length<1&&i.removeAttr("layer").show()})},t.pt.IE6=function(e){h("select").each(function(e,t){var i=h(this);i.parents("."+u[0])[0]||"none"!==i.css("display")&&i.attr({layer:"1"}).hide()})},t.pt.openLayer=function(){v.zIndex=this.config.zIndex,v.setTop=function(e){return v.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",function(){v.zIndex++,e.css("z-index",v.zIndex+1)}),v.zIndex}},f.record=function(e){if(!e[0])return p.console&&console.error("index error");var t=e.attr("type"),i=e.find(".layui-layer-content"),t=t===f.type[2]?i.children("iframe"):i,n=[e[0].style.width||f.getStyle(e[0],"width"),e[0].style.height||f.getStyle(e[0],"height"),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:n}),i.data(l,f.getStyle(t[0],"height"))},f.setScrollbar=function(e){u.html.css("overflow","hidden").attr("layer-full",e)},f.restScrollbar=function(e){u.html.attr("layer-full")==e&&(u.html[0].style[u.html[0].style.removeProperty?"removeProperty":"removeAttribute"]("overflow"),u.html.removeAttr("layer-full"))},f.promiseLikeResolve=function(e){var t=h.Deferred();return e&&"function"==typeof e.then?e.then(t.resolve,t.reject):t.resolve(e),t.promise()},(p.layer=v).getChildFrame=function(e,t){return t=t||h("."+u[4]).attr("times"),h("#"+u[0]+t).find("iframe").contents().find(e)},v.getFrameIndex=function(e){return h("#"+e).parents("."+u[4]).attr("times")},v.iframeAuto=function(e){var t,i,n;e&&(t=v.getChildFrame("html",e).outerHeight(),i=(e=h("#"+u[0]+e)).find(u[1]).outerHeight()||0,n=e.find("."+u[6]).outerHeight()||0,e.css({height:t+i+n}),e.find("iframe").css({height:t}))},v.iframeSrc=function(e,t){h("#"+u[0]+e).find("iframe").attr("src",t)},v.style=function(e,t,i){var e=h("#"+u[0]+e),n=e.find(".layui-layer-content"),a=e.attr("type"),o=e.find(u[1]).outerHeight()||0,s=e.find("."+u[6]).outerHeight()||0;e.attr("minLeft");a!==f.type[3]&&a!==f.type[4]&&(i||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-o-s<=64&&(t.height=64+o+s)),e.css(t),s=e.find("."+u[6]).outerHeight()||0,a===f.type[2]?e.find("iframe").css({height:("number"==typeof t.height?t.height:e.height())-o-s}):n.css({height:("number"==typeof t.height?t.height:e.height())-o-s-parseFloat(n.css("padding-top"))-parseFloat(n.css("padding-bottom"))}))},v.min=function(e,t){var i,n,a,o,s,r,l=h("#"+u[0]+e),c=l.data("maxminStatus");"min"!==c&&("max"===c&&v.restore(e),l.data("maxminStatus","min"),t=t||l.data("config")||{},c=h("#"+u.SHADE+e),i=l.find(".layui-layer-min"),n=l.find(u[1]).outerHeight()||0,o=(a="string"==typeof(o=l.attr("minLeft")))?o:181*f.minStackIndex+"px",s=l.css("position"),r={width:180,height:n,position:"fixed",overflow:"hidden"},f.record(l),0<f.minStackArr.length&&(o=f.minStackArr[0],f.minStackArr.shift()),parseFloat(o)+180>g.width()&&(o=g.width()-180-(f.minStackArr.edgeIndex=f.minStackArr.edgeIndex||0,f.minStackArr.edgeIndex+=3))<0&&(o=0),t.minStack&&(r.left=o,r.top=g.height()-n,a||f.minStackIndex++,l.attr("minLeft",o)),l.attr("position",s),v.style(e,r,!0),i.hide(),"page"===l.attr("type")&&l.find(u[4]).hide(),f.restScrollbar(e),c.hide())},v.restore=function(e){var t=h("#"+u[0]+e),i=h("#"+u.SHADE+e),n=t.find(".layui-layer-content"),a=t.attr("area").split(","),o=t.attr("type"),s=t.data("config")||{},r=n.data(l);t.removeData("maxminStatus"),v.style(e,{width:a[0],height:a[1],top:parseFloat(a[2]),left:parseFloat(a[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===o&&t.find(u[4]).show(),s.scrollbar?f.restScrollbar(e):f.setScrollbar(e),r!==m&&(n.removeData(l),(o===f.type[2]?n.children("iframe"):n).css({height:r})),i.show()},v.full=function(t){var i=h("#"+u[0]+t),e=i.data("maxminStatus");"max"!==e&&("min"===e&&v.restore(t),i.data("maxminStatus","max"),f.record(i),u.html.attr("layer-full")||f.setScrollbar(t),setTimeout(function(){var e="fixed"===i.css("position");v.style(t,{top:e?0:g.scrollTop(),left:e?0:g.scrollLeft(),width:"100%",height:"100%"},!0),i.find(".layui-layer-min").hide()},100))},v.title=function(e,t){h("#"+u[0]+(t||v.index)).find(u[1]).html(e)},v.close=function(s,r){var e,t,l=(e=h("."+u[0]).children("#"+s).closest("."+u[0]))[0]?(s=e.attr("times"),e):h("#"+u[0]+s),c=l.attr("type"),i=l.data("config")||{},d=i.id&&i.hideOnClose;l[0]&&(t=function(){var o={slideDown:"layer-anim-slide-down-out",slideLeft:"layer-anim-slide-left-out",slideUp:"layer-anim-slide-up-out",slideRight:"layer-anim-slide-right-out"}[i.anim]||"layer-anim-close",e=function(){var e="layui-layer-wrap";if(d)return l.removeClass("layer-anim "+o),l.hide();if(c===f.type[1]&&"object"===l.attr("conType")){l.children(":not(."+u[5]+")").remove();for(var t=l.find("."+e),i=0;i<2;i++)t.unwrap();t.css("display",t.data("display")).removeClass(e)}else{if(c===f.type[2])try{var n=h("#"+u[4]+s)[0];n.contentWindow.document.write(""),n.contentWindow.close(),l.find("."+u[5])[0].removeChild(n)}catch(a){}l[0].innerHTML="",l.remove()}"function"==typeof f.end[s]&&f.end[s](),delete f.end[s],"function"==typeof r&&r(),f.events.resize[s]&&(g.off("resize",f.events.resize[s]),delete f.events.resize[s])},t=h("#"+u.SHADE+s);v.ie&&v.ie<10||!i.isOutAnim?t[d?"hide":"remove"]():(t.css({opacity:0}),setTimeout(function(){t[d?"hide":"remove"]()},350)),i.isOutAnim&&l.addClass("layer-anim "+o),6==v.ie&&f.reselect(),f.restScrollbar(s),"string"==typeof l.attr("minLeft")&&(f.minStackIndex--,f.minStackArr.push(l.attr("minLeft"))),v.ie&&v.ie<10||!i.isOutAnim?e():setTimeout(function(){e()},200)},d||"function"!=typeof f.beforeEnd[s]?(delete f.beforeEnd[s],t()):f.promiseLikeResolve(f.beforeEnd[s]()).then(function(e){!1!==e&&(delete f.beforeEnd[s],t())},function(e){e!==m&&p.console&&p.console.error("layer error hint: "+e)}))},v.closeAll=function(n,a){"function"==typeof n&&(a=n,n=null);var o=h("."+u[0]);h.each(o,function(e){var t=h(this),i=n?t.attr("type")===n:1;i&&v.close(t.attr("times"),e===o.length-1?a:null)}),0===o.length&&"function"==typeof a&&a()},v.closeLast=function(i,e){var t,n=[],a=h.isArray(i);h("string"==typeof i?".layui-layer-"+i:".layui-layer").each(function(e,t){t=h(t);if(a&&-1===i.indexOf(t.attr("type"))||"none"===t.css("display"))return!0;n.push(Number(t.attr("times")))}),0<n.length&&(t=Math.max.apply(null,n),v.close(t,e))},v.cache||{}),x=function(e){return i.skin?" "+i.skin+" "+i.skin+"-"+e:""};v.prompt=function(i,n){var e="",t="";"function"==typeof(i=i||{})&&(n=i),i.area&&(e='style="width: '+(o=i.area)[0]+"; height: "+o[1]+';"',delete i.area),i.placeholder&&(t=' placeholder="'+i.placeholder+'"');var a,o=2==i.formType?'<textarea class="layui-layer-input"'+e+t+"></textarea>":'<input type="'+(1==i.formType?"password":"text")+'" class="layui-layer-input"'+t+">",s=i.success;return delete i.success,v.open(h.extend({type:1,btn:["\u786e\u5b9a","\u53d6\u6d88"],content:o,skin:"layui-layer-prompt"+x("prompt"),maxWidth:g.width(),success:function(e){(a=e.find(".layui-layer-input")).val(i.value||"").focus(),"function"==typeof s&&s(e)},resize:!1,yes:function(e){var t=a.val();t.length>(i.maxlength||500)?v.tips("\u6700\u591a\u8f93\u5165"+(i.maxlength||500)+"\u4e2a\u5b57\u7b26",a,{tips:1}):n&&n(t,e,a)}},i))},v.tab=function(n){var a=(n=n||{}).tab||{},o="layui-this",s=n.success;return delete n.success,v.open(h.extend({type:1,skin:"layui-layer-tab"+x("tab"),resize:!1,title:function(){var e=a.length,t=1,i="";if(0<e)for(i='<span class="'+o+'">'+a[0].title+"</span>";t<e;t++)i+="<span>"+a[t].title+"</span>";return i}(),content:'<ul class="layui-layer-tabmain">'+function(){var e=a.length,t=1,i="";if(0<e)for(i='<li class="layui-layer-tabli '+o+'">'+(a[0].content||"no content")+"</li>";t<e;t++)i+='<li class="layui-layer-tabli">'+(a[t].content||"no  content")+"</li>";return i}()+"</ul>",success:function(e){var t=e.find(".layui-layer-title").children(),i=e.find(".layui-layer-tabmain").children();t.on("mousedown",function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0;var e=h(this),t=e.index();e.addClass(o).siblings().removeClass(o),i.eq(t).show().siblings().hide(),"function"==typeof n.change&&n.change(t)}),"function"==typeof s&&s(e)}},n))},v.photos=function(n,e,a){var s={};if((n=h.extend(!0,{toolbar:!0,footer:!0},n)).photos){var t=!("string"==typeof n.photos||n.photos instanceof h),i=t?n.photos:{},o=i.data||[],r=i.start||0,l=n.success;if(s.imgIndex=1+(0|r),n.img=n.img||"img",delete n.success,t){if(0===o.length)return v.msg("\u6ca1\u6709\u56fe\u7247")}else{var c=h(n.photos),d=function(){o=[],c.find(n.img).each(function(e){var t=h(this);t.attr("layer-index",e),o.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("lay-src")||t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(d(),0===o.length)return;if(e||c.on("click",n.img,function(){d();var e=h(this).attr("layer-index");v.photos(h.extend(n,{photos:{start:e,data:o,tab:n.tab},full:n.full}),!0)}),!e)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=o.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>o.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){var t;s.end||(t=e.keyCode,e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&v.close(s.index))},s.tabimg=function(e){if(!(o.length<=1))return i.start=s.imgIndex-1,v.close(s.index),v.photos(n,!0,e)},s.isNumber=function(e){return"number"==typeof e&&!isNaN(e)},s.image={},s.getTransform=function(e){var t=[],i=e.rotate,n=e.scaleX,e=e.scale;return s.isNumber(i)&&0!==i&&t.push("rotate("+i+"deg)"),s.isNumber(n)&&1!==n&&t.push("scaleX("+n+")"),s.isNumber(e)&&t.push("scale("+e+")"),t.length?t.join(" "):"none"},s.event=function(e,i,n){var a,o;s.main.find(".layui-layer-photos-prev").on("click",function(e){e.preventDefault(),s.imgprev(!0)}),s.main.find(".layui-layer-photos-next").on("click",function(e){e.preventDefault(),s.imgnext(!0)}),h(document).on("keyup",s.keyup),e.off("click").on("click","*[toolbar-event]",function(){var e=h(this);switch(e.attr("toolbar-event")){case"rotate":s.image.rotate=((s.image.rotate||0)+Number(e.attr("data-option")))%360,s.imgElem.css({transform:s.getTransform(s.image)});break;case"scalex":s.image.scaleX=-1===s.image.scaleX?1:-1,s.imgElem.css({transform:s.getTransform(s.image)});break;case"zoom":var t=Number(e.attr("data-option"));s.image.scale=(s.image.scale||1)+t,t<0&&s.image.scale<0-t&&(s.image.scale=0-t),s.imgElem.css({transform:s.getTransform(s.image)});break;case"reset":s.image.scaleX=1,s.image.scale=1,s.image.rotate=0,s.imgElem.css({transform:"none"});break;case"close":v.close(i)}n.offset(),n.auto(i)}),s.main.on("mousewheel DOMMouseScroll",function(e){var t=e.originalEvent.wheelDelta||-e.originalEvent.detail,i=s.main.find('[toolbar-event="zoom"]');(0<t?i.eq(0):i.eq(1)).trigger("click"),e.preventDefault()}),(p.layui||p.lay)&&(a=p.layui.lay||p.lay,o=function(e,t){var i=Date.now()-t.timeStart,i=t.distanceX/i,n=g.width()/3;(.25<Math.abs(i)||Math.abs(t.distanceX)>n)&&("left"===t.direction?s.imgnext(!0):"right"===t.direction&&s.imgprev(!0))},h.each([n.shadeo,s.main],function(e,t){a.touchSwipe(t,{onTouchEnd:o})}))},s.loadi=v.load(1,{shade:!("shade"in n)&&[.9,m,"unset"],scrollbar:!1});var t=o[r].src,f=function(e){v.close(s.loadi);var t,i=o[r].alt||"";a&&(n.anim=-1),s.index=v.open(h.extend({type:1,id:"layui-layer-photos",area:(e=[e.width,e.height],t=[h(p).width()-100,h(p).height()-100],!n.full&&(t[0]<e[0]||t[1]<e[1])&&((t=[e[0]/t[0],e[1]/t[1]])[1]<t[0]?(e[0]=e[0]/t[0],e[1]=e[1]/t[0]):t[0]<t[1]&&(e[0]=e[0]/t[1],e[1]=e[1]/t[1])),[e[0]+"px",e[1]+"px"]),title:!1,shade:[.9,m,"unset"],shadeClose:!0,closeBtn:!1,move:".layer-layer-photos-main img",moveType:1,scrollbar:!1,moveOut:!0,anim:5,isOutAnim:!1,skin:"layui-layer-photos"+x("photos"),content:'<div class="layer-layer-photos-main"><img src="'+o[r].src+'" alt="'+i+'" layer-pid="'+(o[r].pid||"")+'">'+(t=['<div class="layui-layer-photos-pointer">'],1<o.length&&t.push(['<div class="layer-layer-photos-page">','<span class="layui-icon layui-icon-left layui-layer-photos-prev"></span>','<span class="layui-icon layui-icon-right layui-layer-photos-next"></span>',"</div>"].join("")),n.toolbar&&t.push(['<div class="layui-layer-photos-toolbar layui-layer-photos-header">','<span toolbar-event="rotate" data-option="90" title="\u65cb\u8f6c"><i class="layui-icon layui-icon-refresh"></i></span>','<span toolbar-event="scalex" title="\u53d8\u6362"><i class="layui-icon layui-icon-slider"></i></span>','<span toolbar-event="zoom" data-option="0.1" title="\u653e\u5927"><i class="layui-icon layui-icon-add-circle"></i></span>','<span toolbar-event="zoom" data-option="-0.1" title="\u7f29\u5c0f"><i class="layui-icon layui-icon-reduce-circle"></i></span>','<span toolbar-event="reset" title="\u8fd8\u539f"><i class="layui-icon layui-icon-refresh-1"></i></span>','<span toolbar-event="close" title="\u5173\u95ed"><i class="layui-icon layui-icon-close"></i></span>',"</div>"].join("")),n.footer&&t.push(['<div class="layui-layer-photos-toolbar layui-layer-photos-footer">',"<h3>"+i+"</h3>","<em>"+s.imgIndex+" / "+o.length+"</em>",'<a href="'+o[r].src+'" target="_blank">\u67e5\u770b\u539f\u56fe</a>',"</div>"].join("")),t.push("</div>"),t.join(""))+"</div>",success:function(e,t,i){s.main=e.find(".layer-layer-photos-main"),s.footer=e.find(".layui-layer-photos-footer"),s.imgElem=s.main.children("img"),s.event(e,t,i),n.tab&&n.tab(o[r],e),"function"==typeof l&&l(e)},end:function(){s.end=!0,h(document).off("keyup",s.keyup)}},n))},u=function(){v.close(s.loadi),v.msg("\u5f53\u524d\u56fe\u7247\u5730\u5740\u5f02\u5e38\uff0c<br>\u662f\u5426\u7ee7\u7eed\u67e5\u770b\u4e0b\u4e00\u5f20\uff1f",{time:3e4,btn:["\u4e0b\u4e00\u5f20","\u4e0d\u770b\u4e86"],yes:function(){1<o.length&&s.imgnext(!0,!0)}})},y=new Image;(y.src=t,y.complete)?f(y):(y.onload=function(){y.onload=null,f(y)},y.onerror=function(e){y.onerror=null,u(e)})}},f.run=function(e){g=(h=e)(p);var e=navigator.userAgent.toLowerCase(),e=/android|iphone|ipod|ipad|ios/.test(e),n=h(p);e&&h.each({Height:"height",Width:"width"},function(e,t){var i="inner"+e;g[t]=function(){return i in p?p[i]:n[t]()}}),u.html=h("html"),v.open=function(e){return new t(e).index}},p.layui&&layui.define?(v.ready(),layui.define(["jquery","lay"],function(e){v.path=layui.cache.dir,f.run(layui.$),e("layer",p.layer=v)})):"function"==typeof define&&define.amd?define(["jquery"],function(){return f.run(p.jQuery),v}):(v.ready(),f.run(p.jQuery))}(window);layui.define("jquery",function(t){"use strict";var s=layui.$,p=layui.hint(),e={fixbar:function(i){var o,t,e,n,r="layui-fixbar",a=s(document),c=(i=s.extend(!0,{target:"body",bars:[],"default":!0,margin:160,duration:320},i),s(i.target)),u=i.scroll?s(i.scroll):s("body"===i.target?a:c),l=(i["default"]&&(i.bar1&&i.bars.push({type:"bar1",icon:"layui-icon-chat"}),i.bar2&&i.bars.push({type:"bar2",icon:"layui-icon-help"}),i.bars.push({type:"top",icon:"layui-icon-top"})),s("<ul>").addClass(r));layui.each(i.bars,function(t,e){var n=s('<li class="layui-icon">');n.addClass(e.icon).attr({"lay-type":e.type,style:e.style||(i.bgcolor?"background-color: "+i.bgcolor:"")}).html(e.content),n.on("click",function(){var t=s(this).attr("lay-type");"top"===t&&("body"===i.target?s("html,body"):u).animate({scrollTop:0},i.duration),"function"==typeof i.click&&i.click.call(this,t)}),"object"===layui.type(i.on)&&layui.each(i.on,function(t,e){n.on(t,function(){var t=s(this).attr("lay-type");"function"==typeof e&&e.call(this,t)})}),"top"===e.type&&(n.addClass("layui-fixbar-top"),o=n),l.append(n)}),c.find("."+r).remove(),"object"==typeof i.css&&l.css(i.css),c.append(l),o&&(e=function e(){return u.scrollTop()>=i.margin?t||(o.show(),t=1):t&&(o.hide(),t=0),e}()),u.on("scroll",function(){e&&(clearTimeout(n),n=setTimeout(function(){e()},100))})},countdown:function(i){i=s.extend(!0,{date:new Date,now:new Date},i);var o=arguments,r=(1<o.length&&(i.date=new Date(o[0]),i.now=new Date(o[1]),i.clock=o[2]),{options:i,clear:function(){clearTimeout(r.timer)},reload:function(t){this.clear(),s.extend(!0,this.options,{now:new Date},t),a()}}),a=("function"==typeof i.ready&&i.ready(),function c(){var t=new Date(i.date),e=new Date(i.now),t=0<(t=t.getTime()-e.getTime())?t:0,n={d:Math.floor(t/864e5),h:Math.floor(t/36e5)%24,m:Math.floor(t/6e4)%60,s:Math.floor(t/1e3)%60};return 1<o.length&&(n=[n.d,n.h,n.m,n.s]),r.timer=setTimeout(function(){e.setTime(e.getTime()+1e3),i.now=e,a()},1e3),"function"==typeof i.clock&&i.clock(n,r),t<=0&&(clearTimeout(r.timer),"function"==typeof i.done)&&i.done(n,r),c}());return r},timeAgo:function(t,e){var n=this,i=[[],[]],o=(new Date).getTime()-new Date(t).getTime();return 26784e5<o?(o=new Date(t),i[0][0]=n.digit(o.getFullYear(),4),i[0][1]=n.digit(o.getMonth()+1),i[0][2]=n.digit(o.getDate()),e||(i[1][0]=n.digit(o.getHours()),i[1][1]=n.digit(o.getMinutes()),i[1][2]=n.digit(o.getSeconds())),i[0].join("-")+" "+i[1].join(":")):864e5<=o?(o/1e3/60/60/24|0)+" \u5929\u524d":36e5<=o?(o/1e3/60/60|0)+" \u5c0f\u65f6\u524d":18e4<=o?(o/1e3/60|0)+" \u5206\u949f\u524d":o<0?"\u672a\u6765":"\u521a\u521a"},digit:function(t,e){var n="";e=e||2;for(var i=(t=String(t)).length;i<e;i++)n+="0";return t<Math.pow(10,e)?n+(0|t):t},toDateString:function(t,e,n){var i,o,r,a,c,u,l,s,g,f,d;return null===t||""===t?"":(i=this,(o=new Date(function(){if(t)return!isNaN(t)&&"string"==typeof t?parseInt(t):t}()||new Date)).getDate()?(r=o.getFullYear(),a=o.getMonth(),c=o.getDate(),u=o.getHours(),l=o.getMinutes(),s=o.getSeconds(),g=o.getMilliseconds(),f=n&&n.customMeridiem||function(t,e){t=100*t+e;return t<600?"\u51cc\u6668":t<900?"\u65e9\u4e0a":t<1100?"\u4e0a\u5348":t<1300?"\u4e2d\u5348":t<1800?"\u4e0b\u5348":"\u665a\u4e0a"},d={yy:function(){return String(r).slice(-2)},yyyy:function(){return i.digit(r,4)},M:function(){return String(a+1)},MM:function(){return i.digit(a+1)},d:function(){return String(c)},dd:function(){return i.digit(c)},H:function(){return String(u)},HH:function(){return i.digit(u)},h:function(){return String(u%12||12)},hh:function(){return i.digit(u%12||12)},A:function(){return f(u,l)},m:function(){return String(l)},mm:function(){return i.digit(l)},s:function(){return String(s)},ss:function(){return i.digit(s)},SSS:function(){return i.digit(g,3)}},(e=e||"yyyy-MM-dd HH:mm:ss").replace(/\[([^\]]+)]|y{1,4}|M{1,2}|d{1,2}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|SSS/g,function(t,e){return e||d[t]&&d[t]()||t})):(p.error('Invalid millisecond for "util.toDateString(millisecond)"'),""))},escape:function(t){return t===undefined||null===t?"":/[<"'>]|&(?=#[a-zA-Z0-9]+)/g.test(t+="")?t.replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"&#39;").replace(/"/g,"&quot;"):t},unescape:function(t){return t!==undefined&&null!==t||(t=""),(t+="").replace(/\&amp;/g,"&").replace(/\&lt;/g,"<").replace(/\&gt;/g,">").replace(/\&#39;/g,"'").replace(/\&quot;/g,'"')},openWin:function(t){var e=(t=t||{}).window||window.open(t.url||"",t.target,t.specs);t.url||(e.document.open("text/html","replace"),e.document.write(t.content||""),e.document.close())},toVisibleArea:function(t){var e,n,i,o,r,a,c,u;(t=s.extend({margin:160,duration:200,type:"y"},t)).scrollElem[0]&&t.thisElem[0]&&(c=t.thisElem,i=(r="y"===t.type)?"top":"left",o=(e=t.scrollElem)[n=r?"scrollTop":"scrollLeft"](),r=e[r?"height":"width"](),a=e.offset()[i],u={},(c=c.offset()[i]-a)>r-t.margin||c<t.margin)&&(u[n]=c-r/2+o,e.animate(u,t.duration))},on:function(i,o,t){"object"==typeof i&&(t=o||{},o=i,i=t.attr||"lay-on");var e,n=(t=s.extend({elem:"body",trigger:"click"},"object"==typeof t?t:{trigger:t})).elem=s(t.elem),r="["+i+"]",a="UTIL_ON_DATA";if(n[0])return n.data(a)||n.data(a,{events:{}}),a=n.data(a),e=i+"_"+t.trigger,o=a.events[e]=s.extend(!0,a.events[e],o),e=t.trigger+".lay_util_on",n.off(e,r),n.on(e,r,function(t){var e=s(this),n=e.attr(i);"function"==typeof o[n]&&o[n].call(this,e,t)}),o}};e.event=e.on,t("util",e)});layui.define(["jquery","laytpl","lay","util"],function(e){"use strict";var n,i,t,c=layui.$,m=layui.laytpl,p=layui.util,o=(layui.hint(),layui.device().mobile?"touchstart":"mousedown"),r="dropdown",f="layui_dropdown_index_opened",y="lay-"+r+"-id",h={config:{customName:{id:"id",title:"title",children:"child"}},index:layui[r]?layui[r].index+1e4:0,set:function(e){var i=this;return i.config=c.extend({},i.config,e),i},on:function(e,i){return layui.onevent.call(this,r,e,i)}},g=function(){var i=this,e=i.config,t=e.id;return{config:e,reload:function(e){i.reload.call(i,e)},reloadData:function(e){h.reloadData(t,e)},close:function(){i.remove()},open:function(){i.render()}}},a="layui-dropdown",l="layui-menu-item-up",d="layui-menu-item-down",v="layui-menu-body-title",s="layui-menu-item-group",w="layui-menu-item-parent",u="layui-menu-item-checked",C="layui-menu-item-checked2",E="layui-menu-body-panel",x="layui-menu-body-panel-left",k="layui-dropdown-shade",b="."+s+">."+v,T=function(e){var i=this;i.index=++h.index,i.config=c.extend({},i.config,h.config,e),i.init()};T.prototype.config={trigger:"click",content:"",className:"",style:"",show:!1,isAllowSpread:!0,isSpreadItem:!0,data:[],delay:[200,300],shade:0,accordion:!1,closeOnClick:!0},T.prototype.reload=function(e,i){var t=this;t.config=c.extend({},t.config,e),t.init(!0,i)},T.prototype.init=function(e,i){var t=this,n=t.config,a=c(n.elem);return 1<a.length?(layui.each(a,function(){h.render(c.extend({},n,{elem:this}))}),t):(c.extend(n,lay.options(a[0])),!e&&a.attr(y)?(e=g.getThis(a.attr(y)))?e.reload(n,i):void 0:(n.elem=c(n.elem),n.target=c("body"),n.id="id"in n?n.id:a.attr("id")||t.index,g.that[n.id]=t,a.attr(y,n.id),n.customName=c.extend({},h.config.customName,n.customName),"hover"===n.trigger&&(n.trigger="mouseenter"),(n.show||"reloadData"===i&&t.mainElem&&n.target.find(t.mainElem.get(0)).length)&&t.render(i),void t.events()))},T.prototype.render=function(e){var i,l=this,d=l.config,s=d.customName,u=function(r,e){return layui.each(e,function(e,i){var t,n=i[s.children]&&0<i[s.children].length,a=("isSpreadItem"in i?i:d).isSpreadItem,l=(o=p.escape(i[s.title]),l=i.templet||d.templet,o=l?"function"==typeof l?l(i):m(l).render(i):o),o=(n&&(i.type=i.type||"parent"),i.type?{group:"group",parent:"parent","-":"-"}[i.type]||"parent":"");("-"===o||i[s.title]||i[s.id]||n)&&((l=c(["<li"+(t={group:"layui-menu-item-group"+(d.isAllowSpread?a?" layui-menu-item-down":" layui-menu-item-up":""),parent:w,"-":"layui-menu-item-divider"},n||o?' class="'+t[o]+'"':i.disabled?' class="layui-disabled"':"")+">",(t="href"in i?'<a href="'+i.href+'" target="'+(i.target||"_self")+'">'+l+"</a>":l,n?'<div class="'+v+'">'+t+("parent"===o?'<i class="layui-icon layui-icon-right"></i>':"group"===o&&d.isAllowSpread?'<i class="layui-icon layui-icon-'+(a?"up":"down")+'"></i>':"")+"</div>":'<div class="'+v+'">'+t+"</div>"),"</li>"].join(""))).data("item",i),n&&(a=c('<div class="layui-panel layui-menu-body-panel"></div>'),t=c("<ul></ul>"),"parent"===o?(a.append(u(t,i[s.children])),l.append(a)):l.append(u(t,i[s.children]))),r.append(l))}),r},t=['<div class="layui-dropdown layui-border-box layui-panel layui-anim layui-anim-downbit" '+y+'="'+d.id+'">',"</div>"].join(""),n=d.content||(n=c('<ul class="layui-menu layui-dropdown-menu"></ul>'),0<d.data.length?u(n,d.data):n.html('<li class="layui-menu-item-none">\u6682\u65e0\u6570\u636e</li>'),n),a=g.findMainElem(d.id);"reloadData"===e&&a.length?(i=l.mainElem=a).html(n):((i=l.mainElem=c(t)).append(n),i.addClass(d.className),i.attr("style",d.style),l.remove(h.thisId),d.target.append(i),d.elem.data(f,!0),e=d.shade?'<div class="'+k+'" style="z-index:'+(i.css("z-index")-1)+"; background-color: "+(d.shade[1]||"#000")+"; opacity: "+(d.shade[0]||d.shade)+'"></div>':"",i.before(e),"mouseenter"===d.trigger&&i.on("mouseenter",function(){clearTimeout(g.timer)}).on("mouseleave",function(){l.delayRemove()})),l.position(),h.thisId=d.id,i.find(".layui-menu").on(o,function(e){layui.stope(e)}),i.find(".layui-menu li").on("click",function(e){var i=c(this),t=i.data("item")||{},n=t[s.children]&&0<t[s.children].length,a="all"===d.clickScope;t.disabled||n&&!a||"-"===t.type||(!1===("function"==typeof d.click?d.click(t,i,e):null)||n||l.remove(),layui.stope(e))}),i.find(b).on("click",function(e){var i=c(this).parent();"group"===(i.data("item")||{}).type&&d.isAllowSpread&&g.spread(i,d.accordion)}),"function"==typeof d.ready&&d.ready(i,d.elem)},T.prototype.position=function(e){var i=this.config;lay.position(i.elem[0],this.mainElem[0],{position:i.position,e:this.e,clickType:"contextmenu"===i.trigger?"right":null,align:i.align||null})},T.prototype.remove=function(e){e=e||this.config.id;var i=g.getThis(e);i&&(i=i.config,(e=g.findMainElem(e))[0])&&(e.prev("."+k).remove(),e.remove(),i.elem.removeData(f),delete h.thisId,"function"==typeof i.close)&&i.close(i.elem)},T.prototype.normalizedDelay=function(){var e=this.config,e=[].concat(e.delay);return{show:e[0],hide:e[1]!==undefined?e[1]:e[0]}},T.prototype.delayRemove=function(){var e=this;e.config;clearTimeout(g.timer),g.timer=setTimeout(function(){e.remove()},e.normalizedDelay().hide)},T.prototype.events=function(){var t=this,n=t.config,a="mouseenter"===n.trigger,e=n.trigger+".lay_dropdown_render";t.thisEventElem&&t.thisEventElem.off(e),t.thisEventElem=n.elem,n.elem.off(e).on(e,function(e){clearTimeout(g.timer),t.e=e;var i=n.elem.data(f);a?i||(g.timer=setTimeout(function(){t.render()},t.normalizedDelay().show)):n.closeOnClick&&i&&"click"===n.trigger?t.remove():t.render(),e.preventDefault()}),a&&n.elem.on("mouseleave",function(){t.delayRemove()})},g.that={},g.getThis=function(e){if(e===undefined)throw new Error("ID argument required");return g.that[e]},g.findMainElem=function(e){return c("."+a+"["+y+'="'+e+'"]')},g.spread=function(e,i){var t=e.children("ul"),n=e.hasClass(l),a=function(){c(this).css({display:""})};t.is(":animated")||(n?(e.removeClass(l).addClass(d),t.hide().stop().slideDown(200,a)):(t.stop().slideUp(200,a),e.removeClass(d).addClass(l)),n&&i&&((t=e.siblings("."+d)).children("ul").stop().slideUp(200,a),t.removeClass(d).addClass(l)))},n=c(window),i=c(document),n.on("resize",function(){if(h.thisId){var e=g.getThis(h.thisId);if(e)return!(e.mainElem&&!e.mainElem[0]||!c("."+a)[0])&&void("contextmenu"===e.config.trigger?e.remove():e.position())}}),lay(i).on(o,function(e){if(h.thisId){var i=g.getThis(h.thisId);if(i){var t=i.config,n=lay.isTopElem(t.elem[0]),a="contextmenu"===t.trigger,n=!(n||a)&&(t.elem[0]===e.target||t.elem.find(e.target)[0]),a=i.mainElem&&(e.target===i.mainElem[0]||i.mainElem.find(e.target)[0]);if(!n&&!a){if("touchstart"===e.type&&t.elem.data(f)&&c(e.target).hasClass(k)&&e.preventDefault(),"function"==typeof t.onClickOutside)if(!1===t.onClickOutside(e))return;i.remove()}}}},{passive:!1}),t=".layui-menu:not(.layui-dropdown-menu) li",i.on("click",t,function(e){var i=c(this),t=i.parents(".layui-menu").eq(0),n=i.hasClass(s)||i.hasClass(w),a=t.attr("lay-filter")||t.attr("id"),l=lay.options(this);i.hasClass("layui-menu-item-divider")||n||(t.find("."+u).removeClass(u),t.find("."+C).removeClass(C),i.addClass(u),i.parents("."+w).addClass(C),l.title=l.title||c.trim(i.children("."+v).text()),layui.event.call(this,r,"click("+a+")",l))}),i.on("click",t+b,function(e){var i=c(this),t=i.parents("."+s+":eq(0)"),n=lay.options(t[0]),i="string"==typeof i.parents(".layui-menu").eq(0).attr("lay-accordion");"isAllowSpread"in n&&!n.isAllowSpread||g.spread(t,i)}),t=".layui-menu ."+w,i.on("mouseenter",t,function(e){var i,t=c(this).find("."+E);t[0]&&((i=t[0].getBoundingClientRect()).right>n.width()&&(t.addClass(x),(i=t[0].getBoundingClientRect()).left<0)&&t.removeClass(x),i.bottom>n.height())&&t.eq(0).css("margin-top",-(i.bottom-n.height()+5))}).on("mouseleave",t,function(e){var i=c(this).children("."+E);i.removeClass(x),i.css("margin-top",0)}),h.close=function(e){e=g.getThis(e);return e?(e.remove(),g.call(e)):this},h.open=function(e){e=g.getThis(e);return e?(e.render(),g.call(e)):this},h.reload=function(e,i,t){e=g.getThis(e);return e?(e.reload(i,t),g.call(e)):this},h.reloadData=function(){var t=c.extend([],arguments),n=(t[2]="reloadData",new RegExp("^("+["data","templet","content"].join("|")+")$"));return layui.each(t[1],function(e,i){n.test(e)||delete t[1][e]}),h.reload.apply(null,t)},h.render=function(e){e=new T(e);return g.call(e)},e(r,h)});layui.define(["jquery","lay"],function(e){"use strict";var x=layui.$,b=layui.lay,m={config:{},index:layui.slider?layui.slider.index+1e4:0,set:function(e){var t=this;return t.config=x.extend({},t.config,e),t},on:function(e,t){return layui.onevent.call(this,i,e,t)}},i="slider",f="layui-disabled",T="layui-slider-bar",w="layui-slider-wrap",M="layui-slider-wrap-btn",L="layui-slider-tips",E="layui-slider-input-txt",Y="layui-slider-hover",t=function(e){var t=this;t.index=++m.index,t.config=x.extend({},t.config,m.config,e),t.render()};t.prototype.config={type:"default",min:0,max:100,value:0,step:1,showstep:!1,tips:!0,tipsAlways:!1,input:!1,range:!1,height:200,disabled:!1,theme:"#16baaa"},t.prototype.precision=function(){var e=this.config,e=x.map([e.min,e.max,e.step],function(e,t){e=String(e).split(".");return e[1]?e[1].length:0});return Math.max.apply(null,e)},t.prototype.render=function(){var n=this,a=n.config,e=x(a.elem);if(1<e.length)return layui.each(e,function(){m.render(x.extend({},a,{elem:this}))}),n;x.extend(a,b.options(e[0])),a.step<=0&&(a.step=1),a.max<a.min&&(a.max=a.min+a.step),a.range?(a.value="object"==typeof a.value?a.value:[a.min,a.value],e=Math.min(a.value[0],a.value[1]),i=Math.max(a.value[0],a.value[1]),a.value[0]=Math.max(e,a.min),a.value[1]=Math.max(i,a.min),a.value[0]=Math.min(a.value[0],a.max),a.value[1]=Math.min(a.value[1],a.max),i=(a.value[0]-a.min)/(a.max-a.min)*100,l=(s=(a.value[1]-a.min)/(a.max-a.min)*100)-i+"%",i+="%",s+="%"):("object"==typeof a.value&&(a.value=Math.min.apply(null,a.value)),a.value<a.min&&(a.value=a.min),a.value>a.max&&(a.value=a.max),l=(a.value-a.min)/(a.max-a.min)*100+"%");var t,e=a.disabled?"#c2c2c2":a.theme,i='<div class="layui-slider '+("vertical"===a.type?"layui-slider-vertical":"")+'">'+(a.tips?'<div class="'+L+'" '+(a.tipsAlways?"":'style="display:none;"')+"></div>":"")+'<div class="layui-slider-bar" style="background:'+e+"; "+("vertical"===a.type?"height":"width")+":"+l+";"+("vertical"===a.type?"bottom":"left")+":"+(i||0)+';"></div><div class="layui-slider-wrap" style="'+("vertical"===a.type?"bottom":"left")+":"+(i||l)+';"><div class="layui-slider-wrap-btn" style="border: 2px solid '+e+';"></div></div>'+(a.range?'<div class="layui-slider-wrap" style="'+("vertical"===a.type?"bottom":"left")+":"+s+';"><div class="layui-slider-wrap-btn" style="border: 2px solid '+e+';"></div></div>':"")+"</div>",l=x(a.elem),s=l.next(".layui-slider");if(s[0]&&s.remove(),n.elemTemp=x(i),a.range?(n.elemTemp.find("."+w).eq(0).data("value",a.value[0]),n.elemTemp.find("."+w).eq(1).data("value",a.value[1])):n.elemTemp.find("."+w).data("value",a.value),l.html(n.elemTemp),"vertical"===a.type&&n.elemTemp.height(a.height+"px"),a.showstep){for(var o=(a.max-a.min)/a.step,r="",u=1;u<1+o;u++){var c=100*u/o;c<100&&(r+='<div class="layui-slider-step" style="'+("vertical"===a.type?"bottom":"left")+":"+c+'%"></div>')}n.elemTemp.append(r)}function d(e){e=e.parent().data("value"),e=a.setTips?a.setTips(e):e;n.elemTemp.find("."+L).html(e)}function p(e){var t="vertical"===a.type?a.height:n.elemTemp[0].offsetWidth,i=n.elemTemp.find("."+w);return("vertical"===a.type?t-e.parent()[0].offsetTop-i.height():e.parent()[0].offsetLeft)/t*100}function v(e){"vertical"===a.type?n.elemTemp.find("."+L).css({bottom:e+"%","margin-bottom":"20px",display:"inline-block"}):n.elemTemp.find("."+L).css({left:e+"%",display:"inline-block"})}a.input&&!a.range&&(e=x('<div class="layui-slider-input"><div class="layui-slider-input-txt"><input type="text" class="layui-input"></div><div class="layui-slider-input-btn"><i class="layui-icon layui-icon-up"></i><i class="layui-icon layui-icon-down"></i></div></div>'),l.css("position","relative"),l.append(e),l.find("."+E).children("input").val(a.value),"vertical"===a.type?e.css({left:0,top:-48}):n.elemTemp.css("margin-right",e.outerWidth()+15)),a.disabled?(n.elemTemp.addClass(f),n.elemTemp.find("."+M).addClass(f)):n.slide(),a.tips&&(a.tipsAlways?(d(s=n.elemTemp.find("."+M)),v(p(s))):n.elemTemp.find("."+M).on("mouseover",function(){d(x(this));var e=p(x(this));clearTimeout(t),t=setTimeout(function(){v(e)},300)}).on("mouseout",function(){clearTimeout(t),a.tipsAlways||n.elemTemp.find("."+L).css("display","none")}))},t.prototype.slide=function(e,t,i){var u=this,c=u.config,d=u.elemTemp,p=function(){return"vertical"===c.type?c.height:d[0].offsetWidth},v=d.find("."+w),o=d.next(".layui-slider-input"),r=o.children("."+E).children("input").val(),m=100/((c.max-c.min)/c.step),f=u.precision(),h=function(e,t,i){e=(e=100<(e=100<Math.ceil(e)*m?Math.ceil(e)*m:Math.round(e)*m)?100:e)<0?0:e,v.eq(t).css("vertical"===c.type?"bottom":"left",e+"%");var n,a=y(v[0].offsetLeft),l=c.range?y(v[1].offsetLeft):0,s=("vertical"===c.type?(d.find("."+L).css({bottom:e+"%","margin-bottom":"20px"}),a=y(p()-v[0].offsetTop-v.height()),l=c.range?y(p()-v[1].offsetTop-v.height()):0):d.find("."+L).css("left",e+"%"),a=100<a?100:a,l=100<l?100:l,Math.min(a,l)),a=Math.abs(a-l),l=("vertical"===c.type?d.find("."+T).css({height:a+"%",bottom:s+"%"}):d.find("."+T).css({width:a+"%",left:s+"%"}),c.min+(c.max-c.min)*e/100),l=Number(parseFloat(l).toFixed(f));r=l,o.children("."+E).children("input").val(r),v.eq(t).data("value",l),d.find("."+L).html(c.setTips?c.setTips(l):l),c.range&&(n=[v.eq(0).data("value"),v.eq(1).data("value")])[0]>n[1]&&n.reverse(),u.value=c.range?n:l,c.change&&c.change(u.value),"done"===i&&c.done&&c.done(u.value)},y=function(e){var t=e/p()*100/m,i=Math.round(t)*m;return i=e==p()?Math.ceil(t)*m:i},g=x(['<div class="layui-auxiliar-moving" id="LAY-slider-moving"></div'].join(""));if("set"===e)return h((t-c.min)/(c.max-c.min)*100/m,i,"done");d.find("."+M).each(function(o){var r=x(this);r.on("mousedown touchstart",function(e){"touchstart"===(e=e||window.event).type&&(e.clientX=e.originalEvent.touches[0].clientX,e.clientY=e.originalEvent.touches[0].clientY);var t,i,n,a,l=r.parent()[0].offsetLeft,s=e.clientX;"vertical"===c.type&&(l=p()-r.parent()[0].offsetTop-v.height(),s=e.clientY);t=r,i=function(e){"touchmove"===(e=e||window.event).type&&(e.clientX=e.touches[0].clientX,e.clientY=e.touches[0].clientY);var t=l+("vertical"===c.type?s-e.clientY:e.clientX-s),t=(t=(t=t<0?0:t)>p()?p():t)/p()*100/m;h(t,o),r.addClass(Y),d.find("."+L).show(),e.preventDefault()},n=function(e){r.removeClass(Y),c.tipsAlways||setTimeout(function(){d.find("."+L).hide()},e)},a=function(){n&&n(b.touchEventsSupported()?1e3:0),g.remove(),c.done&&c.done(u.value),b.touchEventsSupported()&&(t[0].removeEventListener("touchmove",i,!!b.passiveSupported&&{passive:!1}),t[0].removeEventListener("touchend",a),t[0].removeEventListener("touchcancel",a))},x("#LAY-slider-moving")[0]||x("body").append(g),g.on("mousemove",i),g.on("mouseup",a).on("mouseleave",a),b.touchEventsSupported()&&(t[0].addEventListener("touchmove",i,!!b.passiveSupported&&{passive:!1}),t[0].addEventListener("touchend",a),t[0].addEventListener("touchcancel",a))})}),d.on("click",function(e){var t=x("."+M),i=x(this);!t.is(event.target)&&0===t.has(event.target).length&&t.length&&(i=(t=(t=(t="vertical"===c.type?p()-e.clientY+i.offset().top-x(window).scrollTop():e.clientX-i.offset().left-x(window).scrollLeft())<0?0:t)>p()?p():t)/p()*100/m,t=c.range?"vertical"===c.type?Math.abs(t-parseInt(x(v[0]).css("bottom")))>Math.abs(t-parseInt(x(v[1]).css("bottom")))?1:0:Math.abs(t-v[0].offsetLeft)>Math.abs(t-v[1].offsetLeft)?1:0:0,h(i,t,"done"),e.preventDefault())}),o.children(".layui-slider-input-btn").children("i").each(function(t){x(this).on("click",function(){r=o.children("."+E).children("input").val();var e=((r=1==t?r-c.step<c.min?c.min:Number(r)-c.step:Number(r)+c.step>c.max?c.max:Number(r)+c.step)-c.min)/(c.max-c.min)*100/m;h(e,0,"done")})});var n=function(){var e=this.value,e=(e=(e=(e=isNaN(e)?0:e)<c.min?c.min:e)>c.max?c.max:e,((this.value=e)-c.min)/(c.max-c.min)*100/m);h(e,0,"done")};o.children("."+E).children("input").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),n.call(this))}).on("change",n)},t.prototype.events=function(){this.config},m.render=function(e){e=new t(e);return function(){var i=this,n=i.config;return{setValue:function(e,t){return e=(e=e>n.max?n.max:e)<n.min?n.min:e,n.value=e,i.slide("set",e,t||0)},config:n}}.call(e)},e(i,m)});layui.define(["jquery","lay"],function(e){"use strict";var x=layui.$,P=layui.lay,o=layui.hint(),i=layui.device().mobile?"click":"mousedown",r={config:{},index:layui.colorpicker?layui.colorpicker.index+1e4:0,set:function(e){var i=this;return i.config=x.extend({},i.config,e),i},on:function(e,i){return layui.onevent.call(this,"colorpicker",e,i)}},n=function(){var e=this.config,i=e.id;return n.that[i]=this,{config:e}},t="colorpicker",l="layui-colorpicker",c=".layui-colorpicker-main",C="layui-icon-down",w="layui-icon-close",T="layui-colorpicker-trigger-span",B="layui-colorpicker-trigger-i",I="layui-colorpicker-side-slider",E="layui-colorpicker-basis",D="layui-colorpicker-alpha-bgcolor",Y="layui-colorpicker-alpha-slider",M="layui-colorpicker-basis-cursor",X="layui-colorpicker-main-input",j=function(e){var i={h:0,s:0,b:0},o=Math.min(e.r,e.g,e.b),t=Math.max(e.r,e.g,e.b),n=t-o;return i.b=t,i.s=0!==t?255*n/t:0,0!==i.s?e.r==t?i.h=(e.g-e.b)/n:e.g==t?i.h=2+(e.b-e.r)/n:i.h=4+(e.r-e.g)/n:i.h=-1,t===o&&(i.h=0),i.h*=60,i.h<0&&(i.h+=360),i.s*=100/255,i.b*=100/255,i},F=function(e){var i,o={},t=e.h,n=255*e.s/100,e=255*e.b/100;return 0==n?o.r=o.g=o.b=e:(e=t%60*((i=e)-(n=(255-n)*e/255))/60,(t=360===t?0:t)<60?(o.r=i,o.b=n,o.g=n+e):t<120?(o.g=i,o.b=n,o.r=i-e):t<180?(o.g=i,o.r=n,o.b=n+e):t<240?(o.b=i,o.r=n,o.g=i-e):t<300?(o.b=i,o.g=n,o.r=n+e):t<360?(o.r=i,o.g=n,o.b=i-e):(o.r=0,o.g=0,o.b=0)),{r:Math.round(o.r),g:Math.round(o.g),b:Math.round(o.b)}},H=function(e){var e=F(e),o=[e.r.toString(16),e.g.toString(16),e.b.toString(16)];return x.each(o,function(e,i){1===i.length&&(o[e]="0"+i)}),o.join("")},L=function(e){e=e.match(/[0-9]{1,3}/g)||[];return{r:e[0],g:e[1],b:e[2]}},W=x(window),a=x(document),s=function(e){this.index=++r.index,this.config=x.extend({},this.config,r.config,e),this.render()};s.prototype.config={color:"",size:null,alpha:!1,format:"hex",predefine:!1,colors:["#16baaa","#16b777","#1E9FFF","#FF5722","#FFB800","#01AAED","#999","#c00","#ff8c00","#ffd700","#90ee90","#00ced1","#1e90ff","#c71585","rgb(0, 186, 189)","rgb(255, 120, 0)","rgb(250, 212, 0)","#393D49","rgba(0,0,0,.5)","rgba(255, 69, 0, 0.68)","rgba(144, 240, 144, 0.5)","rgba(31, 147, 255, 0.73)"]},s.prototype.render=function(){var e=this,i=e.config;if(1<(t=x(i.elem)).length)return layui.each(t,function(){r.render(x.extend({},i,{elem:this}))}),e;x.extend(i,P.options(t[0]));var o=x(['<div class="layui-unselect layui-colorpicker">',"<span "+("rgb"==i.format&&i.alpha?'class="layui-colorpicker-trigger-bgcolor"':"")+">",'<span class="layui-colorpicker-trigger-span" ','lay-type="'+("rgb"==i.format?i.alpha?"rgba":"torgb":"")+'" ','style="'+(o="",i.color?(o=i.color,3<(i.color.match(/[0-9]{1,3}/g)||[]).length&&(i.alpha&&"rgb"==i.format||(o="#"+H(j(L(i.color))))),"background: "+o):o)+'">','<i class="layui-icon layui-colorpicker-trigger-i '+(i.color?C:w)+'"></i>',"</span>","</span>","</div>"].join("")),t=i.elem=x(i.elem);i.size&&o.addClass("layui-colorpicker-"+i.size),t.addClass("layui-inline").html(e.elemColorBox=o),i.id="id"in i?i.id:t.attr("id")||e.index,e.color=e.elemColorBox.find("."+T)[0].style.background,e.events()},s.prototype.renderPicker=function(){var o,e=this,i=e.config,t=e.elemColorBox[0],n=e.elemPicker=x(['<div id="layui-colorpicker'+e.index+'" data-index="'+e.index+'" class="layui-anim layui-anim-downbit layui-colorpicker-main">','<div class="layui-colorpicker-main-wrapper">','<div class="layui-colorpicker-basis">','<div class="layui-colorpicker-basis-white"></div>','<div class="layui-colorpicker-basis-black"></div>','<div class="layui-colorpicker-basis-cursor"></div>',"</div>",'<div class="layui-colorpicker-side">','<div class="layui-colorpicker-side-slider"></div>',"</div>","</div>",'<div class="layui-colorpicker-main-alpha '+(i.alpha?"layui-show":"")+'">','<div class="layui-colorpicker-alpha-bgcolor">','<div class="layui-colorpicker-alpha-slider"></div>',"</div>","</div>",i.predefine?(o=['<div class="layui-colorpicker-main-pre">'],layui.each(i.colors,function(e,i){o.push(['<div class="layui-colorpicker-pre'+(3<(i.match(/[0-9]{1,3}/g)||[]).length?" layui-colorpicker-pre-isalpha":"")+'">','<div style="background:'+i+'"></div>',"</div>"].join(""))}),o.push("</div>"),o.join("")):"",'<div class="layui-colorpicker-main-input">','<div class="layui-inline">','<input type="text" class="layui-input">',"</div>",'<div class="layui-btn-container">','<button class="layui-btn layui-btn-primary layui-btn-sm" colorpicker-events="clear">\u6e05\u7a7a</button>','<button class="layui-btn layui-btn-sm" colorpicker-events="confirm">\u786e\u5b9a</button>',"</div","</div>","</div>"].join(""));e.elemColorBox.find("."+T)[0];x(c)[0]&&x(c).data("index")==e.index?e.removePicker(s.thisElemInd):(e.removePicker(s.thisElemInd),x("body").append(n)),r.thisId=i.id,s.thisElemInd=e.index,s.thisColor=t.style.background,e.position(),e.pickerEvents()},s.prototype.removePicker=function(e){var i=this.config,e=x("#layui-colorpicker"+(e||this.index));return e[0]&&(e.remove(),delete r.thisId,"function"==typeof i.close)&&i.close(this.color),this},s.prototype.position=function(){var e=this,i=e.config;return P.position(e.bindElem||e.elemColorBox[0],e.elemPicker[0],{position:i.position,align:"center"}),e},s.prototype.val=function(){var e,i=this,o=(i.config,i.elemColorBox.find("."+T)),t=i.elemPicker.find("."+X),n=o[0].style.backgroundColor;n?(e=j(L(n)),o=o.attr("lay-type"),i.select(e.h,e.s,e.b),"torgb"===o?t.find("input").val(n):"rgba"===o?(o=L(n),3===(n.match(/[0-9]{1,3}/g)||[]).length?(t.find("input").val("rgba("+o.r+", "+o.g+", "+o.b+", 1)"),i.elemPicker.find("."+Y).css("left",280)):(t.find("input").val(n),n=280*n.slice(n.lastIndexOf(",")+1,n.length-1),i.elemPicker.find("."+Y).css("left",n)),i.elemPicker.find("."+D)[0].style.background="linear-gradient(to right, rgba("+o.r+", "+o.g+", "+o.b+", 0), rgb("+o.r+", "+o.g+", "+o.b+"))"):t.find("input").val("#"+H(e))):(i.select(0,100,100),t.find("input").val(""),i.elemPicker.find("."+D)[0].style.background="",i.elemPicker.find("."+Y).css("left",280))},s.prototype.side=function(){var r=this,l=r.config,c=r.elemColorBox.find("."+T),a=c.attr("lay-type"),s=r.elemPicker.find(".layui-colorpicker-side"),o=r.elemPicker.find("."+I),d=r.elemPicker.find("."+E),t=r.elemPicker.find("."+M),u=r.elemPicker.find("."+D),f=r.elemPicker.find("."+Y),p=o[0].offsetTop/180*360,h=100-t[0].offsetTop/180*100,g=t[0].offsetLeft/260*100,v=Math.round(f[0].offsetLeft/280*100)/100,m=r.elemColorBox.find("."+B),e=r.elemPicker.find(".layui-colorpicker-pre").children("div"),y=function(e,i,o,t){r.select(e,i,o);var n=F({h:e,s:i,b:o}),e=H({h:e,s:i,b:o}),i=r.elemPicker.find("."+X).find("input");m.addClass(C).removeClass(w),c[0].style.background="rgb("+n.r+", "+n.g+", "+n.b+")","torgb"===a?i.val("rgb("+n.r+", "+n.g+", "+n.b+")"):"rgba"===a?(f.css("left",280*t),i.val("rgba("+n.r+", "+n.g+", "+n.b+", "+t+")"),c[0].style.background="rgba("+n.r+", "+n.g+", "+n.b+", "+t+")",u[0].style.background="linear-gradient(to right, rgba("+n.r+", "+n.g+", "+n.b+", 0), rgb("+n.r+", "+n.g+", "+n.b+"))"):i.val("#"+e),l.change&&l.change(x.trim(r.elemPicker.find("."+X).find("input").val()))},i=x(['<div class="layui-auxiliar-moving" id="LAY-colorpicker-moving"></div>'].join("")),b=function(e){x("#LAY-colorpicker-moving")[0]||x("body").append(i),i.on("mousemove",e),i.on("mouseup",function(){i.remove()}).on("mouseleave",function(){i.remove()})},n=!0,k=!0;o.on("mousedown",function(e,i){var t=this.offsetTop,n=(e.clientY===undefined?i:e).clientY;k&&layui.stope(e),b(function(e){var i=t+(e.clientY-n),o=s[0].offsetHeight,o=(i=o<(i=i<0?0:i)?o:i)/180*360;y(p=o,g,h,v),e.preventDefault()}),e.preventDefault()}),s.on("mousedown",function(e){var i=e.clientY-x(this).offset().top+W.scrollTop(),i=(i=(i=i<0?0:i)>this.offsetHeight?this.offsetHeight:i)/180*360;y(p=i,g,h,v),e.preventDefault(),n&&o.trigger("mousedown",e)}),t.on("mousedown",function(e,i){var r=this.offsetTop,l=this.offsetLeft,c=(e.clientY===undefined?i:e).clientY,a=(e.clientX===undefined?i:e).clientX;k&&layui.stope(e),b(function(e){var i=r+(e.clientY-c),o=l+(e.clientX-a),t=d[0].offsetHeight,n=d[0].offsetWidth,n=(o=n<(o=o<0?0:o)?n:o)/260*100,o=100-(i=t<(i=i<0?0:i)?t:i)/180*100;y(p,g=n,h=o,v),e.preventDefault()}),e.preventDefault()}),d.on("mousedown",function(e){var i=e.clientY-x(this).offset().top+W.scrollTop(),o=e.clientX-x(this).offset().left+W.scrollLeft(),o=((i=i<0?0:i)>this.offsetHeight&&(i=this.offsetHeight),(o=(o=o<0?0:o)>this.offsetWidth?this.offsetWidth:o)/260*100),i=100-i/180*100;y(p,g=o,h=i,v),layui.stope(e),e.preventDefault(),n&&t.trigger("mousedown",e)}),f.on("mousedown",function(e,i){var t=this.offsetLeft,n=(e.clientX===undefined?i:e).clientX;k&&layui.stope(e),b(function(e){var i=t+(e.clientX-n),o=u[0].offsetWidth,o=(o<(i=i<0?0:i)&&(i=o),Math.round(i/280*100)/100);y(p,g,h,v=o),e.preventDefault()}),e.preventDefault()}),u.on("mousedown",function(e){var i=e.clientX-x(this).offset().left,i=((i=i<0?0:i)>this.offsetWidth&&(i=this.offsetWidth),Math.round(i/280*100)/100);y(p,g,h,v=i),e.preventDefault(),n&&f.trigger("mousedown",e)}),e.each(function(){x(this).on("click",function(){x(this).parent(".layui-colorpicker-pre").addClass("selected").siblings().removeClass("selected");var e=this.style.backgroundColor,i=j(L(e)),o=e.slice(e.lastIndexOf(",")+1,e.length-1);p=i.h,g=i.s,h=i.b,3===(e.match(/[0-9]{1,3}/g)||[]).length&&(o=1),v=o,y(i.h,i.s,i.b,o)})}),P.touchEventsSupported()&&layui.each([{elem:s,eventType:"mousedown"},{elem:u,eventType:"mousedown"},{elem:d,eventType:"mousedown"}],function(e,t){P.touchSwipe(t.elem,{onTouchStart:function(){k=n=!1},onTouchMove:function(e){var i,o;e=e,i=t.eventType,e=e.touches[0],(o=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,e.screenX,e.screenY,e.clientX,e.clientY,!1,!1,!1,!1,0,null),e.target.dispatchEvent(o)},onTouchEnd:function(){i.remove(),k=n=!0}})})},s.prototype.select=function(e,i,o,t){this.config;var n=H({h:e,s:100,b:100}),e=(H({h:e,s:i,b:o}),e/360*180),o=180-o/100*180,i=i/100*260,r=this.elemPicker.find("."+E)[0];this.elemPicker.find("."+I).css("top",e),r.style.background="#"+n,this.elemPicker.find("."+M).css({top:o/r.offsetHeight*100+"%",left:i/r.offsetWidth*100+"%"})},s.prototype.pickerEvents=function(){var c=this,a=c.config,s=c.elemColorBox.find("."+T),d=c.elemPicker.find("."+X+" input"),o={clear:function(e){s[0].style.background="",c.elemColorBox.find("."+B).removeClass(C).addClass(w),c.color="",a.done&&a.done(""),c.removePicker()},confirm:function(e,i){var o,t,n,r,l=x.trim(d.val());-1<l.indexOf(",")?(t=j(L(l)),c.select(t.h,t.s,t.b),s[0].style.background=o="#"+H(t),3<(l.match(/[0-9]{1,3}/g)||[]).length&&"rgba"===s.attr("lay-type")&&(n=280*l.slice(l.lastIndexOf(",")+1,l.length-1),c.elemPicker.find("."+Y).css("left",n),o=s[0].style.background=l)):(3===(n=-1<(n=l).indexOf("#")?n.substring(1):n).length&&(n=(r=n.split(""))[0]+r[0]+r[1]+r[1]+r[2]+r[2]),r={r:(n=parseInt(n,16))>>16,g:(65280&n)>>8,b:255&n},t=j(r),s[0].style.background=o="#"+H(t),c.elemColorBox.find("."+B).removeClass(w).addClass(C)),"change"===i?(c.select(t.h,t.s,t.b,i),a.change&&a.change(o)):(c.color=l,a.done&&a.done(l),c.removePicker())}};c.elemPicker.on("click","*[colorpicker-events]",function(){var e=x(this),i=e.attr("colorpicker-events");o[i]&&o[i].call(this,e)}),d.on("keyup",function(e){var i=x(this);o.confirm.call(this,i,13===e.keyCode?null:"change")})},s.prototype.events=function(){var e=this;e.config;e.elemColorBox.on("click",function(){e.renderPicker(),x(c)[0]&&(e.val(),e.side())})},a.on(i,function(e){var i,o,t;r.thisId&&(i=n.getThis(r.thisId))&&(o=i.config,t=i.elemColorBox.find("."+T),x(e.target).hasClass(l)||x(e.target).parents("."+l)[0]||x(e.target).hasClass(c.replace(/\./g,""))||x(e.target).parents(c)[0]||i.elemPicker&&(i.color?(e=j(L(i.color)),i.select(e.h,e.s,e.b)):i.elemColorBox.find("."+B).removeClass(C).addClass(w),t[0].style.background=i.color||"","function"==typeof o.cancel&&o.cancel(i.color),i.removePicker()))}),W.on("resize",function(){if(r.thisId){var e=n.getThis(r.thisId);if(e)return!(!e.elemPicker||!x(c)[0])&&void e.position()}}),n.that={},n.getThis=function(e){var i=n.that[e];return i||o.error(e?t+" instance with ID '"+e+"' not found":"ID argument required"),i},r.render=function(e){e=new s(e);return n.call(e)},e(t,r)});layui.define("jquery",function(t){"use strict";var u=layui.$,d=(layui.hint(),layui.device()),r="element",y="layui-this",f="layui-show",c=".layui-tab-title",i=function(){this.config={}},h=(i.prototype.set=function(t){return u.extend(!0,this.config,t),this},i.prototype.on=function(t,i){return layui.onevent.call(this,r,t,i)},i.prototype.tabAdd=function(t,i){var a,e=u(".layui-tab[lay-filter="+t+"]"),l=e.children(c),n=l.children(".layui-tab-bar"),s=e.children(".layui-tab-content"),o="<li"+(a=[],layui.each(i,function(t,i){/^(title|content)$/.test(t)||a.push("lay-"+t+'="'+i+'"')}),0<a.length&&a.unshift(""),a.join(" "))+">"+(i.title||"unnaming")+"</li>";return n[0]?n.before(o):l.append(o),s.append('<div class="layui-tab-item" '+(i.id?'lay-id="'+i.id+'"':"")+">"+(i.content||"")+"</div>"),i.change&&this.tabChange(t,i.id),l.data("LAY_TAB_CHANGE",i.change),w.tabAuto(i.change?"change":null,e),this},i.prototype.tabDelete=function(t,i,a){t=u(".layui-tab[lay-filter="+t+"]").children(c).find('>li[lay-id="'+i+'"]');return w.tabDelete.call(t[0],{liElem:t,force:a}),this},i.prototype.tabChange=function(t,i,a){t=u(".layui-tab[lay-filter="+t+"]").children(c).find('>li[lay-id="'+i+'"]');return w.tabClick.call(t[0],{liElem:t,force:a}),this},i.prototype.tab=function(a){a=a||{},e.on("click",a.headerElem,function(t){var i=u(a.headerElem).index(u(this));w.tabClick.call(this,{index:i,options:a})})},i.prototype.progress=function(t,i){var a="layui-progress",t=u("."+a+"[lay-filter="+t+"]").find("."+a+"-bar"),a=t.find("."+a+"-text");return t.css("width",function(){return/^.+\/.+$/.test(i)?100*new Function("return "+i)()+"%":i}).attr("lay-percent",i),a.text(i),this},".layui-nav"),p="layui-nav-item",b="layui-nav-bar",v="layui-nav-tree",m="layui-nav-child",g="layui-nav-more",C="layui-anim layui-anim-upbit",w={tabClick:function(t){var i=(t=t||{}).options||{},a=t.liElem||u(this),e=i.headerElem?a.parent():a.parents(".layui-tab").eq(0),i=i.bodyElem?u(i.bodyElem):e.children(".layui-tab-content").children(".layui-tab-item"),l=a.find("a"),l="javascript:;"!==l.attr("href")&&"_blank"===l.attr("target"),n="string"==typeof a.attr("lay-unselect"),s=e.attr("lay-filter"),o=a.attr("lay-id"),c="index"in t?t.index:a.parent().children("li").index(a);if(!t.force){var t=a.siblings("."+y);if(!1===layui.event.call(this,r,"tabBeforeChange("+s+")",{elem:e,from:{index:a.parent().children("li").index(t),id:t.attr("lay-id")},to:{index:c,id:o}}))return}l||n||(a.addClass(y).siblings().removeClass(y),(o?t=(t=i.filter('[lay-id="'+o+'"]')).length?t:i.eq(c):i.eq(c)).addClass(f).siblings().removeClass(f)),layui.event.call(this,r,"tab("+s+")",{elem:e,index:c,id:o})},tabDelete:function(t){var i=(t=t||{}).liElem||u(this).parent(),a=i.parent().children("li").index(i),e=i.closest(".layui-tab"),l=e.children(".layui-tab-content").children(".layui-tab-item"),n=e.attr("lay-filter"),s=i.attr("lay-id");if(!t.force&&!1===layui.event.call(i[0],r,"tabBeforeDelete("+n+")",{elem:e,index:a,id:s}))return;i.hasClass(y)&&(i.next()[0]&&i.next().is("li")?w.tabClick.call(i.next()[0],{index:a+1}):i.prev()[0]&&i.prev().is("li")&&w.tabClick.call(i.prev()[0],null,a-1)),i.remove(),(s?t=(t=l.filter('[lay-id="'+s+'"]')).length?t:l.eq(a):l.eq(a)).remove(),setTimeout(function(){w.tabAuto(null,e)},50),layui.event.call(this,r,"tabDelete("+n+")",{elem:e,index:a,id:s})},tabAuto:function(l,t){var n="layui-tab-more",s="layui-tab-bar",o="layui-tab-close",c=this;(t||u(".layui-tab")).each(function(){var t=u(this),a=t.children(".layui-tab-title"),i=(t.children(".layui-tab-content").children(".layui-tab-item"),'lay-stope="tabmore"'),i=u('<span class="layui-unselect layui-tab-bar" '+i+"><i "+i+' class="layui-icon">&#xe61a;</i></span>'),e=(c===window&&d.ie,t.attr("lay-allowclose"));e&&"false"!==e&&a.find("li").each(function(){var t,i=u(this);i.find("."+o)[0]||"false"===i.attr("lay-allowclose")||((t=u('<i class="layui-icon layui-icon-close layui-unselect '+o+'"></i>')).on("click",function(t){w.tabDelete.call(this,{e:t})}),i.append(t))}),"string"!=typeof t.attr("lay-unauto")&&(a.prop("scrollWidth")>a.outerWidth()+1||a.find("li").length&&a.height()>(e=a.find("li").eq(0).height())+e/2?("change"===l&&a.data("LAY_TAB_CHANGE")&&a.addClass(n),a.find("."+s)[0]||(a.append(i),t.attr("overflow",""),i.on("click",function(t){var i=a.hasClass(n);a[i?"removeClass":"addClass"](n)}))):(a.find("."+s).remove(),t.removeAttr("overflow")))})},hideTabMore:function(t){var i=u(".layui-tab-title");!0!==t&&"tabmore"===u(t.target).attr("lay-stope")||(i.removeClass("layui-tab-more"),i.find(".layui-tab-bar").attr("title",""))},clickThis:function(){var t=u(this),i=t.closest(h),a=i.attr("lay-filter"),e=t.parent(),l=t.siblings("."+m),n="string"==typeof e.attr("lay-unselect");if("javascript:;"!==t.attr("href")&&"_blank"===t.attr("target")||n||l[0]||(i.find("."+y).removeClass(y),e.addClass(y)),i.hasClass(v)){var n=p+"ed",s=!e.hasClass(n),o=function(){u(this).css({display:""}),i.children("."+b).css({opacity:0})};if(l.is(":animated"))return;l.removeClass(C),l[0]&&(s?(l.slideDown(200,o),e.addClass(n)):(e.removeClass(n),l.show().slideUp(200,o)),"string"!=typeof i.attr("lay-accordion")&&"all"!==i.attr("lay-shrink")||((s=e.siblings("."+n)).removeClass(n),s.children("."+m).show().stop().slideUp(200,o)))}layui.event.call(this,r,"nav("+a+")",t)},collapse:function(){var t=u(this),i=t.find(".layui-colla-icon"),a=t.siblings(".layui-colla-content"),e=t.parents(".layui-collapse").eq(0),l=e.attr("lay-filter"),n="none"===a.css("display");"string"==typeof e.attr("lay-accordion")&&((e=e.children(".layui-colla-item").children("."+f)).siblings(".layui-colla-title").children(".layui-colla-icon").html("&#xe602;"),e.removeClass(f)),a[n?"addClass":"removeClass"](f),i.html(n?"&#xe61a;":"&#xe602;"),layui.event.call(this,r,"collapse("+l+")",{title:t,content:a,show:n})}},a=(i.prototype.render=i.prototype.init=function(t,i){var a="string"==typeof i&&i?'[lay-filter="'+i+'"]':"",e={tab:function(t){t=t||u(".layui-tab"+a);w.tabAuto.call({},null,t)},nav:function(t){var s={},o={},c={},r="layui-nav-title";(t||u(h+a)).each(function(t){var i=u(this),a=u('<span class="'+b+'"></span>'),e=i.find("."+p),l=i.find("."+b);l[0]&&l.remove(),i.append(a),(i.hasClass(v)?e.find("dd,>."+r):e).off("mouseenter.lay_nav").on("mouseenter.lay_nav",function(){!function(t,i,a){var e,l=u(this),n=l.find("."+m);i.hasClass(v)?n[0]||(e=l.children("."+r),t.css({top:l.offset().top-i.offset().top,height:(e[0]?e:l).outerHeight(),opacity:1})):(n.addClass(C),n.hasClass("layui-nav-child-c")&&n.css({left:-(n.outerWidth()-l.width())/2}),n[0]?t.css({left:t.position().left+t.width()/2,width:0,opacity:0}):t.css({left:l.position().left+parseFloat(l.css("marginLeft")),top:l.position().top+l.height()-t.height()}),s[a]=setTimeout(function(){t.css({width:n[0]?0:l.width(),opacity:n[0]?0:1})},d.ie&&d.ie<10?0:200),clearTimeout(c[a]),"block"===n.css("display")&&clearTimeout(o[a]),o[a]=setTimeout(function(){n.addClass(f),l.find("."+g).addClass(g+"d")},300))}.call(this,a,i,t)}).off("mouseleave.lay_nav").on("mouseleave.lay_nav",function(){i.hasClass(v)?a.css({height:0,opacity:0}):(clearTimeout(o[t]),o[t]=setTimeout(function(){i.find("."+m).removeClass(f),i.find("."+g).removeClass(g+"d")},300))}),i.off("mouseleave.lay_nav").on("mouseleave.lay_nav",function(){clearTimeout(s[t]),c[t]=setTimeout(function(){i.hasClass(v)||a.css({width:0,left:a.position().left+a.width()/2,opacity:0})},200)}),e.find("a").each(function(){var t=u(this);t.parent();t.siblings("."+m)[0]&&!t.children("."+g)[0]&&t.append('<i class="layui-icon layui-icon-down '+g+'"></i>'),t.off("click",w.clickThis).on("click",w.clickThis)})})},breadcrumb:function(t){(t||u(".layui-breadcrumb"+a)).each(function(){var t=u(this),i="lay-separator",a=t.attr(i)||"/",e=t.find("a");e.next("span["+i+"]")[0]||(e.each(function(t){t!==e.length-1&&u(this).after("<span "+i+">"+a+"</span>")}),t.css("visibility","visible"))})},progress:function(t){var e="layui-progress";(t||u("."+e+a)).each(function(){var t=u(this),i=t.find(".layui-progress-bar"),a=i.attr("lay-percent");i.css("width",function(){return/^.+\/.+$/.test(a)?100*new Function("return "+a)()+"%":a}),t.attr("lay-showpercent")&&setTimeout(function(){i.html('<span class="'+e+'-text">'+a+"</span>")},350)})},collapse:function(t){(t||u(".layui-collapse"+a)).each(function(){u(this).find(".layui-colla-item").each(function(){var t=u(this),i=t.find(".layui-colla-title"),t="none"===t.find(".layui-colla-content").css("display");i.find(".layui-colla-icon").remove(),i.append('<i class="layui-icon layui-colla-icon">'+(t?"&#xe602;":"&#xe61a;")+"</i>"),i.off("click",w.collapse).on("click",w.collapse)})})}};return t&&"object"==typeof i&&i instanceof u?e[t](i):e[t]?e[t]():layui.each(e,function(t,i){i()})},new i),e=u(document);u(function(){a.render()}),e.on("click",".layui-tab-title li",w.tabClick),u(window).on("resize",w.tabAuto),t(r,a)});layui.define(["lay","layer"],function(e){"use strict";var F=layui.$,a=layui.lay,t=layui.layer,R=layui.device(),i="upload",s="layui_"+i+"_index",w={config:{},index:layui[i]?layui[i].index+1e4:0,set:function(e){var t=this;return t.config=F.extend({},t.config,e),t},on:function(e,t){return layui.onevent.call(this,i,e,t)}},o=function(){var t=this,e=t.config.id;return{upload:function(e){t.upload.call(t,e)},reload:function(e){t.reload.call(t,e)},config:(o.that[e]=t).config}},r="layui-upload-file",l="layui-upload-form",E="layui-upload-iframe",L="layui-upload-choose",T="UPLOADING",D=function(e){var t=this;t.index=++w.index,t.config=F.extend({},t.config,w.config,e),t.render()};D.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",force:"",field:"file",acceptMime:"",method:"post",data:{},drag:!0,size:0,number:0,multiple:!1,text:{"cross-domain":"Cross-domain requests are not supported","data-format-error":"Please return JSON data format","check-error":"",error:"","limit-number":null,"limit-size":null}},D.prototype.reload=function(e){var t=this;t.config=F.extend({},t.config,e),t.render(!0)},D.prototype.render=function(e){var t=this,i=t.config,n=F(i.elem);return 1<n.length?(layui.each(n,function(){w.render(F.extend({},i,{elem:this}))}),t):(F.extend(i,a.options(n[0],{attr:n.attr("lay-data")?"lay-data":null})),!e&&n[0]&&n.data(s)?(e=o.getThis(n.data(s)))?e.reload(i):void 0:(i.elem=F(i.elem),i.bindAction=F(i.bindAction),i.id="id"in i?i.id:n.attr("id")||t.index,t.file(),void t.events()))},D.prototype.file=function(){var e=this,t=e.config,i=e.elemFile=F(['<input class="'+r+'" type="file" accept="'+t.acceptMime+'" name="'+t.field+'"',t.multiple?" multiple":"",">"].join("")),n=t.elem.next();(n.hasClass(r)||n.hasClass(l))&&n.remove(),R.ie&&R.ie<10&&t.elem.wrap('<div class="layui-upload-wrap"></div>'),e.isFile()?(e.elemFile=t.elem,t.field=t.elem[0].name):t.elem.after(i),R.ie&&R.ie<10&&e.initIE()},D.prototype.initIE=function(){var i,e=this.config,t=F('<iframe id="'+E+'" class="'+E+'" name="'+E+'" frameborder="0"></iframe>'),n=F(['<form target="'+E+'" class="'+l+'" method="post" key="set-mine" enctype="multipart/form-data" action="'+e.url+'">',"</form>"].join(""));F("#"+E)[0]||F("body").append(t),e.elem.next().hasClass(l)||(this.elemFile.wrap(n),e.elem.next("."+l).append((i=[],layui.each(e.data,function(e,t){t="function"==typeof t?t():t,i.push('<input type="hidden" name="'+e+'" value="'+t+'">')}),i.join(""))))},D.prototype.msg=function(e){return t.msg(e,{icon:2,shift:6})},D.prototype.isFile=function(){var e=this.config.elem[0];if(e)return"input"===e.tagName.toLocaleLowerCase()&&"file"===e.type},D.prototype.preview=function(n){window.FileReader&&layui.each(this.chooseFiles,function(e,t){var i=new FileReader;i.readAsDataURL(t),i.onload=function(){n&&n(e,t,this.result)}})},D.prototype.upload=function(e,t){var i,n,a,o,r,u=this,f=u.config,s=f.text||{},l=u.elemFile[0],c=function(){return e||u.files||u.chooseFiles||l.files},d=function(){var a=0,o=0,r=c(),l=function(){f.multiple&&a+o===u.fileLength&&"function"==typeof f.allDone&&f.allDone({total:u.fileLength,successful:a,failed:o})},i=function(i){var n=new FormData,t=function(e){i.unified?layui.each(r,function(e,t){delete t[T]}):delete e[T]};if(layui.each(f.data,function(e,t){t="function"==typeof t?i.unified?t():t(i.index,i.file):t,n.append(e,t)}),i.unified)layui.each(r,function(e,t){t[T]||(t[T]=!0,n.append(f.field,t))});else{if(i.file[T])return;n.append(f.field,i.file),i.file[T]=!0}var e={url:f.url,type:"post",data:n,dataType:f.dataType||"json",contentType:!1,processData:!1,headers:f.headers||{},success:function(e){f.unified?a+=u.fileLength:a++,m(i.index,e),l(i.index),t(i.file)},error:function(e){f.unified?o+=u.fileLength:o++,u.msg(s.error||["Upload failed, please try again.","status: "+(e.status||"")+" - "+(e.statusText||"error")].join("<br>")),g(i.index,e.responseText,e),l(i.index),t(i.file)}};"function"==typeof f.progress&&(e.xhr=function(){var e=F.ajaxSettings.xhr();return e.upload.addEventListener("progress",function(e){var t;e.lengthComputable&&(t=Math.floor(e.loaded/e.total*100),f.progress(t,(f.item||f.elem)[0],e,i.index))}),e}),F.ajax(e)};f.unified?i({unified:!0,index:0}):layui.each(r,function(e,t){i({index:e,file:t})})},p=function(){var n=F("#"+E);u.elemFile.parent().submit(),clearInterval(D.timer),D.timer=setInterval(function(){var e,t=n.contents().find("body");try{e=t.text()}catch(i){u.msg(s["cross-domain"]),clearInterval(D.timer),g()}e&&(clearInterval(D.timer),t.html(""),m(0,e))},30)},h=function(e){if("json"===f.force&&"object"!=typeof e)try{return{status:"CONVERTED",data:JSON.parse(e)}}catch(t){return u.msg(s["data-format-error"]),{status:"FORMAT_ERROR",data:{}}}return{status:"DO_NOTHING",data:{}}},m=function(e,t){u.elemFile.next("."+L).remove(),l.value="";var i=h(t);switch(i.status){case"CONVERTED":t=i.data;break;case"FORMAT_ERROR":return}"function"==typeof f.done&&f.done(t,e||0,function(e){u.upload(e)})},g=function(e,t,i){f.auto&&(l.value="");var n=h(t);switch(n.status){case"CONVERTED":t=n.data;break;case"FORMAT_ERROR":return}"function"==typeof f.error&&f.error(e||0,function(e){u.upload(e)},t,i)},v=f.exts,y=(n=[],layui.each(e||u.chooseFiles,function(e,t){n.push(t.name)}),n),x={preview:function(e){u.preview(e)},upload:function(e,t){var i={};i[e]=t,u.upload(i)},pushFile:function(){return u.files=u.files||{},layui.each(u.chooseFiles,function(e,t){u.files[e]=t}),u.files},resetFile:function(e,t,i){t=new File([t],i);u.files=u.files||{},u.files[e]=t},getChooseFiles:function(){return u.chooseFiles}},b={file:"\u6587\u4ef6",images:"\u56fe\u7247",video:"\u89c6\u9891",audio:"\u97f3\u9891"}[f.accept]||"\u6587\u4ef6",y=0===y.length?l.value.match(/[^\/\\]+\..+/g)||[]:y;if(0!==y.length){switch(f.accept){case"file":layui.each(y,function(e,t){if(v&&!RegExp(".\\.("+v+")$","i").test(escape(t)))return i=!0});break;case"video":layui.each(y,function(e,t){if(!RegExp(".\\.("+(v||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(t)))return i=!0});break;case"audio":layui.each(y,function(e,t){if(!RegExp(".\\.("+(v||"mp3|wav|mid")+")$","i").test(escape(t)))return i=!0});break;default:layui.each(y,function(e,t){if(!RegExp(".\\.("+(v||"jpg|png|gif|bmp|jpeg|svg|webp")+")$","i").test(escape(t)))return i=!0})}if(i)return u.msg(s["check-error"]||"\u9009\u62e9\u7684"+b+"\u4e2d\u5305\u542b\u4e0d\u652f\u6301\u7684\u683c\u5f0f"),l.value="";if("choose"!==t&&!f.auto||(f.choose&&f.choose(x),"choose"!==t)){if(u.fileLength=(a=0,b=c(),layui.each(b,function(){a++}),a),f.number&&u.fileLength>f.number)return u.msg("function"==typeof s["limit-number"]?s["limit-number"](f,u.fileLength):"\u540c\u65f6\u6700\u591a\u53ea\u80fd\u4e0a\u4f20: "+f.number+" \u4e2a\u6587\u4ef6<br>\u60a8\u5f53\u524d\u5df2\u7ecf\u9009\u62e9\u4e86: "+u.fileLength+" \u4e2a\u6587\u4ef6");if(0<f.size&&!(R.ie&&R.ie<10))if(layui.each(c(),function(e,t){t.size>1024*f.size&&(t=1<=(t=f.size/1024)?t.toFixed(2)+"MB":f.size+"KB",l.value="",o=t)}),o)return u.msg("function"==typeof s["limit-size"]?s["limit-size"](f,o):"\u6587\u4ef6\u5927\u5c0f\u4e0d\u80fd\u8d85\u8fc7 "+o);r=function(){if(R.ie)return(9<R.ie?d:p)();d()},"function"==typeof f.before?w.util.promiseLikeResolve(f.before(x)).then(function(e){!1!==e?r():f.auto&&(l.value="")},function(e){f.auto&&(l.value=""),e!==undefined&&layui.hint().error(e)}):r()}}},D.prototype.events=function(){var a=this,n=a.config,o=function(e){a.chooseFiles={},layui.each(e,function(e,t){var i=(new Date).getTime();a.chooseFiles[i+"-"+e]=t})},r=function(e,t){var i=a.elemFile,e=(n.item||n.elem,1<e.length?e.length+"\u4e2a\u6587\u4ef6":(e[0]||{}).name||i[0].value.match(/[^\/\\]+\..+/g)||[]);i.next().hasClass(L)&&i.next().remove(),a.upload(null,"choose"),a.isFile()||n.choose||i.after('<span class="layui-inline '+L+'">'+e+"</span>")},l=function(i){var n=!0;return layui.each(a.files,function(e,t){if(!(n=!(t.name===i.name)))return!0}),n},u=function(e){var i=function(e){e.ext=e.name.substr(e.name.lastIndexOf(".")+1).toLowerCase(),e.sizes=w.util.parseSize(e.size)};return e instanceof FileList?layui.each(e,function(e,t){i(t)}):i(e),e},f=function(e){var i;return(e=e||[]).length?a.files?(i=[],layui.each(e,function(e,t){l(t)&&i.push(u(t))}),i):u(e):[]};n.elem.off("upload.start").on("upload.start",function(){var e=F(this);a.config.item=e,a.elemFile[0].click()}),R.ie&&R.ie<10||n.elem.off("upload.over").on("upload.over",function(){F(this).attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){F(this).removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(e,t){var i=F(this),t=f(t.originalEvent.dataTransfer.files);i.removeAttr("lay-over"),o(t),n.auto?a.upload():r(t)}),a.elemFile.on("change",function(){var e=f(this.files);0!==e.length&&(o(e),n.auto?a.upload():r(e))}),n.bindAction.off("upload.action").on("upload.action",function(){a.upload()}),n.elem.data(s)||(n.elem.on("click",function(){a.isFile()||F(this).trigger("upload.start")}),n.drag&&n.elem.on("dragover",function(e){e.preventDefault(),F(this).trigger("upload.over")}).on("dragleave",function(e){F(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),F(this).trigger("upload.drop",e)}),n.bindAction.on("click",function(){F(this).trigger("upload.action")}),n.elem.data(s,n.id))},w.util={parseSize:function(e,t){var i,n;return t=t||2,null!=e&&e?(i="string"==typeof e?parseFloat(e):e,n=Math.floor(Math.log(i)/Math.log(1024)),(e=(e=i/Math.pow(1024,n))%1==0?e:parseFloat(e.toFixed(t)))+["Bytes","Kb","Mb","Gb","Tb","Pb","Eb","Zb","Yb"][n]):"0"},promiseLikeResolve:function(e){var t=F.Deferred();return e&&"function"==typeof e.then?e.then(t.resolve,t.reject):t.resolve(e),t.promise()}},o.that={},o.getThis=function(e){var t=o.that[e];return t||hint.error(e?i+" instance with ID '"+e+"' not found":"ID argument required"),t},w.render=function(e){e=new D(e);return o.call(e)},e(i,w)});layui.define(["lay","layer","util"],function(e){"use strict";var _=layui.$,f=layui.layer,A=layui.util,l=layui.hint(),d=(layui.device(),lay.ie&&8===parseFloat(lay.ie)),N="form",h=".layui-form",$="layui-this",j="layui-hide",O="layui-disabled",t=function(){this.config={verify:{required:function(e){if(!/[\S]+/.test(e)||e===undefined||null===e)return"\u5fc5\u586b\u9879\u4e0d\u80fd\u4e3a\u7a7a"},phone:function(e){if(e&&!/^1\d{10}$/.test(e))return"\u624b\u673a\u53f7\u683c\u5f0f\u4e0d\u6b63\u786e"},email:function(e){if(e&&!/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/.test(e))return"\u90ae\u7bb1\u683c\u5f0f\u4e0d\u6b63\u786e"},url:function(e){if(e&&!/^(#|(http(s?)):\/\/|\/\/)[^\s]+\.[^\s]+$/.test(e))return"\u94fe\u63a5\u683c\u5f0f\u4e0d\u6b63\u786e"},number:function(e){if(e&&isNaN(e))return"\u53ea\u80fd\u586b\u5199\u6570\u5b57"},date:function(e){if(e&&!/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/.test(e))return"\u65e5\u671f\u683c\u5f0f\u4e0d\u6b63\u786e"},identity:function(e){if(e&&!/(^\d{15}$)|(^\d{17}(x|X|\d)$)/.test(e))return"\u8eab\u4efd\u8bc1\u53f7\u683c\u5f0f\u4e0d\u6b63\u786e"}},autocomplete:null}},i=(t.prototype.set=function(e){return _.extend(!0,this.config,e),this},t.prototype.verify=function(e){return _.extend(!0,this.config.verify,e),this},t.prototype.getFormElem=function(e){return _(h+(e?'[lay-filter="'+e+'"]':""))},t.prototype.on=function(e,t){return layui.onevent.call(this,N,e,t)},t.prototype.val=function(e,i){return this.getFormElem(e).each(function(e,t){var a=_(this);layui.each(i,function(e,t){var i,e=a.find('[name="'+e+'"]');e[0]&&("checkbox"===(i=e[0].type)?e[0].checked=t:"radio"===i?e.each(function(){this.checked=this.value==t+""}):e.val(t))})}),r.render(null,e),this.getValue(e)},t.prototype.getValue=function(e,t){t=t||this.getFormElem(e);var n={},l={},e=t.find("input,select,textarea");return layui.each(e,function(e,t){var i,a=_(this);t.name=(t.name||"").replace(/^\s*|\s*&/,""),t.name&&(/^.*\[\]$/.test(t.name)&&(i=t.name.match(/^(.*)\[\]$/g)[0],n[i]=0|n[i],i=t.name.replace(/^(.*)\[\]$/,"$1["+n[i]+++"]")),/^(checkbox|radio)$/.test(t.type)&&!t.checked||(l[i||t.name]=a.val()))}),l},t.prototype.render=function(e,t){var u=this,i=u.config,a=_(h+(t?'[lay-filter="'+t+'"]':"")),n={input:function(e){var e=e||a.find("input,textarea"),t=(i.autocomplete&&e.attr("autocomplete",i.autocomplete),function(e,t){var i=e.val(),a=Number(i),n=Number(e.attr("step"))||1,l=Number(e.attr("min")),r=Number(e.attr("max")),s=Number(e.attr("lay-precision")),o="click"!==t&&""===i,c="init"===t;isNaN(a)||("click"===t&&(a=!!_(this).index()?a-n:a+n),t=function(e){return((e.toString().match(/\.(\d+$)/)||[])[1]||"").length},s=0<=s?s:Math.max(t(n),t(i)),o||(c||r<=(a=a<=l?l:a)&&(a=r),0===s?a=parseInt(a):0<s&&(a=a.toFixed(s)),e.val(a)),e[(a<l||r<a)&&!o?"addClass":"removeClass"]("layui-input-number-out-of-range"),c)||((n={increment:e.next().find(".layui-icon-up"),decrement:e.next().find(".layui-icon-down")}).increment[r<=a&&!o?"addClass":"removeClass"](O),n.decrement[a<=l&&!o?"addClass":"removeClass"](O))});a.find("input[lay-affix],textarea[lay-affix]").each(function(){var r=_(this),s=r.attr("lay-affix"),o="layui-input-wrap",c="layui-input-suffix",u="layui-input-affix",e=r.is("[disabled]")||r.is("[readonly]"),d=function(e,t){(e=_(e))[0]&&e[_.trim(t)?"removeClass":"addClass"](j)},n=function(i){i=_.extend({},h[s]||{value:s},i,lay.options(r[0]));var a,t=_('<div class="'+u+'">'),e=layui.isArray(i.value)?i.value:[i.value],e=_((a=[],layui.each(e,function(e,t){a.push('<i class="layui-icon layui-icon-'+t+(i.disabled?" "+O:"")+'"></i>')}),a.join(""))),n=(t.append(e),i.split&&t.addClass("layui-input-split"),i.className&&t.addClass(i.className),r.next("."+u)),l=(n[0]&&n.remove(),r.parent().hasClass(o)||r.wrap('<div class="'+o+'"></div>'),r.next("."+c));l[0]?((n=l.find("."+u))[0]&&n.remove(),l.prepend(t),r.css("padding-right",function(){return(r.closest(".layui-input-group")[0]?0:l.outerWidth())+t.outerWidth()})):(t.addClass(c),r.after(t)),"auto"===i.show&&d(t,r.val()),"function"==typeof i.init&&i.init.call(this,r,i),r.on("input propertychange",function(){var e=this.value;"auto"===i.show&&d(t,e)}),r.on("blur",function(){"function"==typeof i.blur&&i.blur.call(this,r,i)}),e.on("click",function(){var e=r.attr("lay-filter");_(this).hasClass(O)||("function"==typeof i.click&&i.click.call(this,r,i),layui.event.call(this,N,"input-affix("+e+")",{elem:r[0],affix:s,options:i}))})},h={eye:{value:"eye-invisible",click:function(e,t){var i="LAY_FORM_INPUT_AFFIX_SHOW",a=e.data(i);e.attr("type",a?"password":"text").data(i,!a),n({value:a?"eye-invisible":"eye"})}},clear:{value:"clear",click:function(e){e.val("").focus(),d(_(this).parent(),null)},show:"auto",disabled:e},number:{value:["up","down"],split:!0,className:"layui-input-number",disabled:r.is("[disabled]"),init:function(e){t.call(this,e,"init")},click:function(e){t.call(this,e,"click")},blur:function(e){t.call(this,e,"blur")}}};n()})},select:function(e){var f="\u8bf7\u9009\u62e9",C="layui-form-select",w="layui-select-none",T="layui-select-create-option",p="layui-select-panel-elem-data",e=e||a.find("select"),y=function(n,e,t,i,u,a){var l,d,r,s,o,c,h,f,p,y=_(this),v=e,m=v.find("input"),g=n.find("dl"),b=(g.children("dd"),g.children("dt")),k=this.selectedIndex,x="";t||(d="cs"===y.attr("lay-search")?{caseSensitive:!0}:lay.options(y,{attr:"lay-search"}),r=y.attr("lay-append-to")||"body",s=y.attr("lay-append-position"),o=!(!lay.ie||"10"!==lay.ie&&"11"!==lay.ie||!m.attr("placeholder")),c=function(){a&&(n.appendTo(r).css({width:v.width()+"px"}),(e=function(){lay.position(v[0],n[0],{position:s,allowBottomOut:!0,offset:[0,5]})})(),_(window).on("resize.lay_select_resize",e));var e=n.offset().top+n.outerHeight()+5-S.scrollTop(),t=g.outerHeight(),i=g.children("dd");k=y[0].selectedIndex,v.parent().addClass(C+"ed"),i.removeClass(j),b.removeClass(j),i.removeClass($),0<=k&&i.eq(k).addClass($),e+t>S.height()&&t<=e&&n.addClass(C+"up"),f(),o&&g.off("mousedown.lay_select_ieph").on("mousedown.lay_select_ieph",function(){m[0].__ieph=!0,setTimeout(function(){m[0].__ieph=!1},60)}),l=lay.onClickOutside((a?n:g)[0],function(){h(),x&&m.val(x)},{ignore:v})},h=function(e){v.parent().removeClass(C+"ed "+C+"up"),m.blur(),u&&g.children("."+T).remove(),l&&l(),a&&(n.detach(),_(window).off("resize.lay_select_resize")),e||p(m.val(),function(e){var t=y[0].selectedIndex;e&&(x=_(y[0].options[t]).html(),0===t&&x===m.attr("placeholder")&&(x=""),m.val(x||""))})},f=function(){var e,t,i=g.children("dd."+$);i[0]&&(e=i.position().top,t=g.height(),i=i.height(),t<e&&g.scrollTop(e+g.scrollTop()-t+i-5),e<0)&&g.scrollTop(e+g.scrollTop()-5)},v.on("click",function(e){(v.parent().hasClass(C+"ed")?h:c)(),g.find("."+w).remove()}),v.find(".layui-edge").on("click",function(){m.focus()}),m.on("keyup",function(e){9===e.keyCode&&c()}).on("keydown",function(n){var e=n.keyCode,t=(9===e&&h(),function(e){n.preventDefault();var t,i,a=g.children("dd:not(."+j+",."+O+")");a.length&&(t=a.length-1,i=-1,layui.each(a,function(e,t){if(_(t).hasClass($))return i=e,!0}),e="prev"===e?i-1<0?t:i-1:t<i+1?0:i+1,a.eq(e).addClass($).siblings().removeClass($),f())});38===e&&t("prev"),40===e&&t("next"),13===e&&(n.preventDefault(),g.children("dd."+$).trigger("click"))}).on("paste",function(){c()}),p=function(n,e,l){var r,s=0,t=g.children("dd"),o=!1,c=n,t=(d.caseSensitive||(n=n.toLowerCase()),d.fuzzy&&(r=function(e,t){var i={},a=["^"];t||(e=e.toLowerCase());for(var n=e.trim().split(""),l=0;l<n.length;l++){var r=n[l];i[r]=(i[r]||0)+1}for(r in i){a.push("(?=.*");for(l=0;l<i[r];l++)a.push(r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),l!==i[r]-1&&a.push(".*");a.push(")")}return a.push(".*"),new RegExp(a.join(""),t?undefined:"i")}(n,d.caseSensitive)),layui.each(t,function(){var e=_(this),t=e.text(),i=u&&e.hasClass(T),a=(u&&!i&&t===c&&(o=!0),d.caseSensitive||(t=t.toLowerCase()),d.fuzzy?!r.test(t):-1===t.indexOf(n));(""===n||"blur"===l?n!==t:a)&&s++,"keyup"===l&&e[(u?a&&!i:a)?"addClass":"removeClass"](j)}),"keyup"===l&&layui.each(b,function(){var e=_(this),t=e.nextUntil("dt").filter("dd");e[(t=u?t.not("."+T):t).length==t.filter("."+j).length?"addClass":"removeClass"](j)}),s===t.length);return e(t,o),t},i&&m.on("input propertychange",layui.debounce(function(e){var n=this.value,t=e.keyCode;return 9!==t&&13!==t&&37!==t&&38!==t&&39!==t&&40!==t&&(o&&e.target.__ieph?e.target.__ieph=!1:(p(n,function(e,t){var i,a;u?t?g.children("."+T).remove():(t=g.children("."+T))[0]?t.attr("lay-value",n).html(A.escape(n)):(t=_("<dd>").addClass(T).attr("lay-value",n).html(A.escape(n)),a=(i=g.children().eq(0)).hasClass("layui-select-tips"),i[a?"after":"before"](t)):e?g.find("."+w)[0]||g.append('<p class="'+w+'">\u65e0\u5339\u914d\u9879</p>'):g.find("."+w).remove()},"keyup"),""===n&&(y.val(""),g.find("."+$).removeClass($),(y[0].options[0]||{}).value||g.children("dd:eq(0)").addClass($),g.find("."+w).remove(),u)&&g.children("."+T).remove(),void f()))},50)).on("blur",function(e){var t=y[0].selectedIndex;x=_(y[0].options[t]).text(),0===t&&x===m.attr("placeholder")&&(x=""),setTimeout(function(){p(m.val(),function(e){x||m.val("")},"blur")},200)}),g.on("click","dd",function(){var e,t=_(this),i=t.attr("lay-value"),a=y.attr("lay-filter");return t.hasClass(O)||(t.hasClass("layui-select-tips")?m.val(""):(m.val(t.text()),t.addClass($)),u&&t.hasClass(T)&&(g.append(t.removeClass(T)),e=_("<option>").attr("value",i).text(t.text()),y.append(e)),t.siblings().removeClass($),y.val(i).removeClass("layui-form-danger"),layui.event.call(this,N,"select("+a+")",{elem:y[0],value:i,othis:n}),h(!0)),!1}),g.on("mousedown pointerdown touchstart",function(e){layui.stope(e)}),n.find("dl>dt").on("click",function(e){return!1}),a&&e.on("_lay-select-destroy",function(){n.remove()}))};_.event.special["_lay-select-destroy"]={remove:function(e){e.handler()}},e.each(function(e,t){var i=_(this),a=i.next("."+C),n=this.disabled,l=t.value,r=_(t.options[t.selectedIndex]),t=t.options[0];if("string"==typeof i.attr("lay-ignore"))return i.show();var s,o,c="string"==typeof i.attr("lay-search"),u="string"==typeof i.attr("lay-creatable")&&c,d="string"==typeof i.attr("lay-append-to"),t=t&&!t.value&&t.innerHTML||f,h=_(['<div class="'+(c?"":"layui-unselect ")+C,(n?" layui-select-disabled":"")+'"></div>'].join("")),t=_(['<div class="layui-select-title">','<input type="text" placeholder="'+A.escape(_.trim(t))+'" value="'+A.escape(_.trim(l?r.html():""))+'"'+(!n&&c?"":" readonly")+' class="layui-input'+(c?"":" layui-unselect")+(n?" "+O:"")+'">','<i class="layui-edge"></i>',"</div>"].join("")),r=_(['<dl class="layui-anim layui-anim-upbit'+(i.find("optgroup")[0]?" layui-select-group":"")+'">',(r=i.find("*"),s=[],layui.each(r,function(e,t){var i=t.tagName.toLowerCase();0!==e||t.value||"optgroup"===i?s.push("optgroup"===i?"<dt>"+t.label+"</dt>":'<dd lay-value="'+A.escape(t.value)+'" class="'+(l===t.value?$:"")+(t.disabled?" "+O:"")+'">'+_.trim(t.innerHTML)+"</dd>"):s.push('<dd lay-value="" class="layui-select-tips">'+_.trim(t.innerHTML||f)+"</dd>")}),0===s.length&&s.push('<dd lay-value="" class="'+O+'">\u6ca1\u6709\u9009\u9879</dd>'),s.join("")+"</dl>")].join(""));a[0]&&(d&&(o=a.data(p))&&o.remove(),a.remove()),d?(h.append(t),i.after(h),o=_('<div class="'+C+' layui-select-panel-wrap"></div>').append(r),h.data(p,o),y.call(this,o,t,n,c,u,d)):(h.append(t).append(r),i.after(h),y.call(this,h,t,n,c,u,d))})},checkbox:function(e){var c={checkbox:["layui-form-checkbox","layui-form-checked","checkbox"],"switch":["layui-form-switch","layui-form-onswitch","switch"],SUBTRA:"layui-icon-indeterminate"},e=e||a.find("input[type=checkbox]");e.each(function(e,t){var i=_(this),a=i.attr("lay-skin")||"primary",n=A.escape(_.trim(t.title||(t.title=i.attr("lay-text")||""))),l=this.disabled,r=c[a]||c.checkbox,s=i.next("."+r[0]),o=(s[0]&&s.remove(),[]);if(i.next("[lay-checkbox]")[0]&&(s=i.next(),n=s.html()||"",1<s[0].attributes.length)&&layui.each(s[0].attributes,function(e,t){"lay-checkbox"!==t.name&&o.push(t.name+'="'+t.value+'"')}),o=o.join(" "),n="switch"===a?n.split("|"):[n],"string"==typeof i.attr("lay-ignore"))return i.show();d&&(p.call(t,"lay-form-sync-checked",t.checked),t.checked||p.call(t,"lay-form-sync-indeterminate",t.indeterminate));l=_(['<div class="layui-unselect '+r[0],t.checked?" "+r[1]:"",l?" layui-checkbox-disabled "+O:"",'"',a?' lay-skin="'+a+'"':"",">",(s={checkbox:[n[0]?"<div "+o+">"+n[0]+"</div>":"primary"===a?"":"<div></div>",'<i class="layui-icon '+("primary"===a&&!t.checked&&i.get(0).indeterminate?c.SUBTRA:"layui-icon-ok")+'"></i>'].join(""),"switch":"<div>"+(!t.checked&&n[1]||n[0]||"")+"</div><i></i>"})[a]||s.checkbox,"</div>"].join(""));i.after(l),function(t,i){var a=_(this),e=a.attr("lay-skin")||"primary",n="switch"===e,e="primary"===e;t.on("click",function(){var e=a.attr("lay-filter");a[0].disabled||(a[0].indeterminate&&(a[0].indeterminate=!1),a[0].checked=!a[0].checked,layui.event.call(a[0],N,i[2]+"("+e+")",{elem:a[0],value:a[0].value,othis:t}))}),u.syncAppearanceOnPropChanged(this,"checked",function(){var e;n&&(e=(t.next("*[lay-checkbox]")[0]?t.next().html():a.attr("title")||"").split("|"),t.children("div").html(!this.checked&&e[1]||e[0])),t.toggleClass(i[1],this.checked)}),e&&u.syncAppearanceOnPropChanged(this,"indeterminate",function(){this.indeterminate?t.children(".layui-icon-ok").removeClass("layui-icon-ok").addClass(c.SUBTRA):t.children("."+c.SUBTRA).removeClass(c.SUBTRA).addClass("layui-icon-ok")})}.call(this,l,r)})},radio:function(e){var o="layui-form-radio",c=["layui-icon-radio","layui-icon-circle"],e=e||a.find("input[type=radio]");e.each(function(e,t){var i=_(this),a=i.next("."+o),n=this.disabled,l=i.attr("lay-skin");if("string"==typeof i.attr("lay-ignore"))return i.show();d&&p.call(t,"lay-form-sync-checked",t.checked),a[0]&&a.remove();var a=A.escape(t.title||""),r=[],s=(i.next("[lay-radio]")[0]&&(a=(s=i.next()).html()||"",1<s[0].attributes.length)&&layui.each(s[0].attributes,function(e,t){"lay-radio"!==t.name&&r.push(t.name+'="'+t.value+'"')}),r=r.join(" "),_(['<div class="layui-unselect '+o,t.checked?" "+o+"ed":"",(n?" layui-radio-disabled "+O:"")+'"',l?' lay-skin="'+l+'"':"",">",'<i class="layui-anim layui-icon '+c[t.checked?0:1]+'"></i>',"<div "+r+">"+a+"</div>","</div>"].join("")));i.after(s),function(i){var a=_(this),n="layui-anim-scaleSpring";i.on("click",function(){var e=a.attr("lay-filter");a[0].disabled||(a[0].checked=!0,layui.event.call(a[0],N,"radio("+e+")",{elem:a[0],value:a[0].value,othis:i}))}),u.syncAppearanceOnPropChanged(this,"checked",function(){var e,t=this;t.checked?(i.addClass(o+"ed"),i.children(".layui-icon").addClass(n+" "+c[0]),e=a.parents(h).find("input[name="+t.name.replace(/(\.|#|\[|\])/g,"\\$1")+"]"),layui.each(e,function(){t!==this&&(this.checked=!1)})):(i.removeClass(o+"ed"),i.children(".layui-icon").removeClass(n+" "+c[0]).addClass(c[1]))})}.call(this,s)})}},t=function(){layui.each(n,function(e,t){t()})};return"object"===layui.type(e)?_(e).is(h)?(a=_(e),t()):e.each(function(e,t){var i=_(t);i.closest(h).length&&("SELECT"===t.tagName?n.select(i):"INPUT"===t.tagName&&("checkbox"===(t=t.type)||"radio"===t?n[t](i):n.input(i)))}):e?n[e]?n[e]():l.error('\u4e0d\u652f\u6301\u7684 "'+e+'" \u8868\u5355\u6e32\u67d3'):t(),u},t.prototype.syncAppearanceOnPropChanged=d?function(e,t,i){var a=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,t);Object.defineProperty(e,t,lay.extend({},a,{get:function(){return"string"==typeof this.getAttribute("lay-form-sync-"+t)},set:function(e){p.call(this,"lay-form-sync-"+t,e),i.call(this)}}))}:function(e,t,i){var a=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,t);Object.defineProperty(e,t,lay.extend({},a,{get:function(){return a.get.call(this)},set:function(e){a.set.call(this,e),i.call(this)}}))},t.prototype.validate=function(e){var u,d=this.config.verify,h="layui-form-danger";return!(e=_(e))[0]||(e.attr("lay-verify")!==undefined||!1!==this.validate(e.find("*[lay-verify]")))&&(layui.each(e,function(e,r){var s=_(this),t=(s.attr("lay-verify")||"").split("|"),o=s.attr("lay-vertype"),c="string"==typeof(c=s.val())?_.trim(c):c;if(s.removeClass(h),layui.each(t,function(e,t){var i="",a=d[t];if(a){var n="function"==typeof a?i=a(c,r):!a[0].test(c),l="select"===r.tagName.toLowerCase()||/^(checkbox|radio)$/.test(r.type),i=i||a[1];if("required"===t&&(i=s.attr("lay-reqtext")||i),n)return"tips"===o?f.tips(i,"string"!=typeof s.attr("lay-ignore")&&l?s.next():s,{tips:1}):"alert"===o?f.alert(i,{title:"\u63d0\u793a",shadeClose:!0}):/\b(string|number)\b/.test(typeof i)&&f.msg(i,{icon:5,shift:6}),setTimeout(function(){(l?s.next().find("input"):r).focus()},7),s.addClass(h),u=!0}}),u)return u}),!u)},t.prototype.submit=function(e,t){var i={},a=_(this),e="string"==typeof e?e:a.attr("lay-filter"),n=this.getFormElem?this.getFormElem(e):a.parents(h).eq(0),l=n.find("*[lay-verify]");return!!r.validate(l)&&(i=r.getValue(null,n),l={elem:this.getFormElem?window.event&&window.event.target:this,form:(this.getFormElem?n:a.parents("form"))[0],field:i},"function"==typeof t&&t(l),layui.event.call(this,N,"submit("+e+")",l))});function p(e,t){var i=!!t,t=2===arguments.length&&!t;return null!==this.getAttribute(e)?i||(this.removeAttribute(e),!1):!t&&(this.setAttribute(e,""),!0)}var r=new t,t=_(document),S=_(window);_(function(){r.render()}),t.on("reset",h,function(){var e=_(this).attr("lay-filter");setTimeout(function(){r.render(null,e)},50)}),t.on("submit",h,i).on("click","*[lay-submit]",i),e(N,r)});layui.define(["lay","laytpl","laypage","form","util"],function(s){"use strict";var f=layui.$,d=layui.lay,m=layui.laytpl,p=layui.laypage,g=layui.layer,i=layui.form,v=layui.util,b=layui.hint(),x=layui.device(),k={config:{checkName:"LAY_CHECKED",indexName:"LAY_INDEX",initIndexName:"LAY_INDEX_INIT",numbersName:"LAY_NUM",disabledName:"LAY_DISABLED"},cache:{},index:layui.table?layui.table.index+1e4:0,set:function(e){return this.config=f.extend({},this.config,e),this},on:function(e,t){return layui.onevent.call(this,R,e,t)}},w=function(){var a=this,e=a.config,i=e.id||e.index;return{config:e,reload:function(e,t){a.reload.call(a,e,t)},reloadData:function(e,t){k.reloadData(i,e,t)},setColsWidth:function(){a.setColsWidth.call(a)},resize:function(){a.resize.call(a)}}},C=function(e){var t=w.that[e];return t||b.error(e?"The table instance with ID '"+e+"' not found":"ID argument required"),t||null},l=function(e){var t=w.config[e];return t||b.error(e?"The table instance with ID '"+e+"' not found":"ID argument required"),t||null},T=function(e){var t=this.config||{},a=(e=e||{}).item3,i=e.content;"numbers"===a.type&&(i=e.tplData[k.config.numbersName]);("escape"in a?a:t).escape&&(i=v.escape(i));t=e.text&&a.exportTemplet||a.templet||a.toolbar;return t&&(i="function"==typeof t?t.call(a,e.tplData,e.obj):m(function(e){try{return d(e).html()}catch(t){return e}}(t)||String(i)).render(f.extend({LAY_COL:a},e.tplData))),e.text?f("<div>"+i+"</div>").text():i},R="table",N="lay-"+R+"-id",t=".layui-table",W="layui-hide",y="layui-hide-v",h="layui-none",D="layui-table-view",o=".layui-table-header",L=".layui-table-body",I=".layui-table-fixed-r",O=".layui-table-pageview",E=".layui-table-sort",A="layui-table-checked",M="layui-table-edit",_="layui-table-hover",u="laytable-cell-group",z="layui-table-col-special",F="layui-table-tool-panel",S="layui-table-expanded",P="layui-table-disabled-transition",H="LAY_TABLE_MOVE_DICT",e=function(e){return['<table cellspacing="0" cellpadding="0" border="0" class="layui-table" ','{{# if(d.data.skin){ }}lay-skin="{{=d.data.skin}}"{{# } }} {{# if(d.data.size){ }}lay-size="{{=d.data.size}}"{{# } }} {{# if(d.data.even){ }}lay-even{{# } }}>',"<thead>","{{# layui.each(d.data.cols, function(i1, item1){ }}","<tr>","{{# layui.each(item1, function(i2, item2){ }}",'{{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}','{{# if(item2.fixed === "right"){ right = true; } }}',(e=e||{}).fixed&&"right"!==e.fixed?'{{# if(item2.fixed && item2.fixed !== "right"){ }}':"right"===e.fixed?'{{# if(item2.fixed === "right"){ }}':"","{{# var isSort = !(item2.colGroup) && item2.sort; }}",'<th data-field="{{= item2.field||i2 }}" data-key="{{=d.index}}-{{=i1}}-{{=i2}}" {{# if( item2.parentKey){ }}data-parentkey="{{= item2.parentKey }}"{{# } }} {{# if(item2.minWidth){ }}data-minwidth="{{=item2.minWidth}}"{{# } }} {{# if(item2.maxWidth){ }}data-maxwidth="{{=item2.maxWidth}}"{{# } }} {{# if(item2.style){ }}style="{{=item2.style}}"{{# } }} {{#var colspan = layui.type(item2.colspan2) === \'number\' ? item2.colspan2 : item2.colspan; if(colspan){}} colspan="{{=colspan}}"{{#} if(item2.rowspan){}} rowspan="{{=item2.rowspan}}"{{#}}} {{# if(item2.unresize || item2.colGroup){ }}data-unresize="true"{{# } }} class="{{# if(item2.hide){ }}layui-hide{{# } }}{{# if(isSort){ }} layui-unselect{{# } }}{{# if(!item2.field){ }} layui-table-col-special{{# } }}"{{# if(item2.title){ }} title="{{ layui.$(\'<div>\' + item2.title + \'</div>\').text() }}"{{# } }}>','<div class="layui-table-cell laytable-cell-',"{{# if(item2.colGroup){ }}","group","{{# } else { }}","{{=d.index}}-{{=i1}}-{{=i2}}",'{{# if(item2.type !== "normal"){ }}'," laytable-cell-{{= item2.type }}","{{# } }}","{{# } }}",'" {{#if(item2.align){}}align="{{=item2.align}}"{{#}}}>','{{# if(item2.type === "checkbox"){ }}','<input type="checkbox" name="layTableCheckbox" lay-skin="primary" lay-filter="layTableAllChoose" {{# if(item2[d.data.checkName]){ }}checked{{# }; }}>',"{{# } else { }}",'<span>{{-item2.title||""}}</span>',"{{# if(isSort){ }}",'<span class="layui-table-sort layui-inline"><i class="layui-edge layui-table-sort-asc" title="\u5347\u5e8f"></i><i class="layui-edge layui-table-sort-desc" title="\u964d\u5e8f"></i></span>',"{{# } }}","{{# } }}","</div>","</th>",e.fixed?"{{# }; }}":"","{{# }); }}","</tr>","{{# }); }}","</thead>","</table>"].join("")},a=['<table cellspacing="0" cellpadding="0" border="0" class="layui-table" ','{{# if(d.data.skin){ }}lay-skin="{{=d.data.skin}}"{{# } }} {{# if(d.data.size){ }}lay-size="{{=d.data.size}}"{{# } }} {{# if(d.data.even){ }}lay-even{{# } }}>',"<tbody></tbody>","</table>"].join(""),B=[,"{{# if(d.data.toolbar){ }}",'<div class="layui-table-tool">','<div class="layui-table-tool-temp"></div>','<div class="layui-table-tool-self"></div>',"</div>","{{# } }}",'<div class="layui-table-box">',"{{# if(d.data.loading){ }}",'<div class="layui-table-init">','<div class="layui-table-loading-icon">','{{# if(typeof d.data.loading === "string"){ }}',"{{- d.data.loading}}","{{# } else{ }}",'<i class="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"></i>',"{{# } }}","</div>","</div>","{{# } }}","{{# var left, right; }}",'<div class="layui-table-header">',e(),"</div>",'<div class="layui-table-body layui-table-main">',a,"</div>","{{# if(left){ }}",'<div class="layui-table-fixed layui-table-fixed-l">','<div class="layui-table-header">',e({fixed:!0}),"</div>",'<div class="layui-table-body">',a,"</div>","</div>","{{# }; }}","{{# if(right){ }}",'<div class="layui-table-fixed layui-table-fixed-r layui-hide">','<div class="layui-table-header">',e({fixed:"right"}),'<div class="layui-table-mend"></div>',"</div>",'<div class="layui-table-body">',a,"</div>","</div>","{{# }; }}","</div>","{{# if(d.data.totalRow){ }}",'<div class="layui-table-total">','<table cellspacing="0" cellpadding="0" border="0" class="layui-table" ','{{# if(d.data.skin){ }}lay-skin="{{=d.data.skin}}"{{# } }} {{# if(d.data.size){ }}lay-size="{{=d.data.size}}"{{# } }} {{# if(d.data.even){ }}lay-even{{# } }}>','<tbody><tr><td><div class="layui-table-cell" style="visibility: hidden;">Total</div></td></tr></tbody>',"</table>","</div>","{{# } }}",'<div class="layui-table-column layui-table-page layui-hide">','<div class="layui-inline layui-table-pageview" id="layui-table-page{{=d.index}}"></div>',"</div>"].join(""),r=f(window),j=f(document),n=function(e){this.index=++k.index,this.config=f.extend({},this.config,k.config,e),this.render()},c=(n.prototype.config={limit:10,loading:!0,escape:!0,cellMinWidth:60,cellMaxWidth:Number.MAX_VALUE,editTrigger:"click",defaultToolbar:["filter","exports","print"],defaultContextmenu:!0,autoSort:!0,text:{none:"\u65e0\u6570\u636e"},cols:[]},n.prototype.render=function(e){var t=this,a=t.config,i=(a.elem=f(a.elem),a.where=a.where||{},a.id="id"in a?a.id:a.elem.attr("id")||t.index);if(w.that[i]=t,(w.config[i]=a).request=f.extend({pageName:"page",limitName:"limit"},a.request),a.response=f.extend({statusName:"code",statusCode:0,msgName:"msg",dataName:"data",totalRowName:"totalRow",countName:"count"},a.response),null!==a.page&&"object"==typeof a.page&&(a.limit=a.page.limit||a.limit,a.limits=a.page.limits||a.limits,t.page=a.page.curr=a.page.curr||1,delete a.page.elem,delete a.page.jump),!a.elem[0])return t;if(a.elem.attr("lay-filter")||a.elem.attr("lay-filter",a.id),"reloadData"===e)return t.pullData(t.page,{type:"reloadData"});a.index=t.index,t.key=a.id||a.index,t.setInit(),a.height&&/^full-.+$/.test(a.height)?(t.fullHeightGap=a.height.split("-")[1],a.height=r.height()-(parseFloat(t.fullHeightGap)||0)):a.height&&/^#\w+\S*-.+$/.test(a.height)?(i=a.height.split("-"),t.parentHeightGap=i.pop(),t.parentDiv=i.join("-"),a.height=f(t.parentDiv).height()-(parseFloat(t.parentHeightGap)||0)):"function"==typeof a.height&&(t.customHeightFunc=a.height,a.height=t.customHeightFunc());var l,e=a.elem,i=e.next("."+D),n=t.elem=f("<div></div>");n.addClass((l=[D,D+"-"+t.index,"layui-form","layui-border-box"],a.className&&l.push(a.className),l.join(" "))).attr(((l={"lay-filter":"LAY-TABLE-FORM-DF-"+t.index,style:(l=[],a.width&&l.push("width:"+a.width+"px;"),l.join(""))})[N]=a.id,l)).html(m(B,{open:"{{",close:"}}"}).render({data:a,index:t.index})),t.renderStyle(),i[0]&&i.remove(),e.after(n),t.layTool=n.find(".layui-table-tool"),t.layBox=n.find(".layui-table-box"),t.layHeader=n.find(o),t.layMain=n.find(".layui-table-main"),t.layBody=n.find(L),t.layFixed=n.find(".layui-table-fixed"),t.layFixLeft=n.find(".layui-table-fixed-l"),t.layFixRight=n.find(I),t.layTotal=n.find(".layui-table-total"),t.layPage=n.find(".layui-table-page"),t.renderToolbar(),t.renderPagebar(),t.fullSize(),t.setColsWidth({isInit:!0}),t.pullData(t.page),t.events()},n.prototype.initOpts=function(e){this.config;e.checkbox&&(e.type="checkbox"),e.space&&(e.type="space"),e.type||(e.type="normal"),"normal"!==e.type&&(e.unresize=!0,e.width=e.width||{checkbox:50,radio:50,space:30,numbers:60}[e.type])},n.prototype.setInit=function(e){var n,a,r=this,d=r.config;if(d.clientWidth=d.width||(n=function(e){var t,a;e=e||d.elem.parent(),t=r.getContentWidth(e);try{a="none"===e.css("display")}catch(l){}var i=e.parent();return e[0]&&i&&i[0]&&(!t||a)?n(i):t})(),"width"===e)return d.clientWidth;d.height=d.maxHeight||d.height,d.css&&-1===d.css.indexOf(D)&&(a=d.css.split("}"),layui.each(a,function(e,t){t&&(a[e]="."+D+"-"+r.index+" "+t)}),d.css=a.join("}"));var c=function(a,e,i,l){var n,o;l?(l.key=[d.index,a,i].join("-"),l.colspan=l.colspan||0,l.rowspan=l.rowspan||0,r.initOpts(l),(n=a+(parseInt(l.rowspan)||1))<d.cols.length?(l.colGroup=!0,o=0,layui.each(d.cols[n],function(e,t){t.HAS_PARENT||1<=o&&o==(l.colspan||1)||(t.HAS_PARENT=!0,t.parentKey=[d.index,a,i].join("-"),o+=parseInt(1<t.colspan?t.colspan:1),c(n,d.cols[n],e,t))})):l.colGroup=!1,l.hide=l.hide&&!l.colGroup||!1):e.splice(i,1)};layui.each(d.cols,function(a,i){layui.each(i,function(e,t){a?delete t.HAS_PARENT:c(a,i,e,t)})})},n.prototype.renderStyle=function(){var e,a,t,i,l=this.config,n=this.index,o=[];layui.each(l.cols,function(a,e){layui.each(e,function(e,t){e=[n,a,e].join("-"),t=["width: ",t.width||l.cellMinWidth,"px"].join("");o.push(".laytable-cell-"+e+"{"+t+"}")})}),(e=l.lineStyle)&&(a=".layui-table-view-"+n+" .layui-table-body .layui-table tr",t=e.split(";"),i="none",layui.each(t,function(e,t){if("height"===(t=t.split(":"))[0])return t=parseFloat(t[1]),isNaN(t)||(i=t-1+"px"),!0}),layui.each(["{"+e+"}",".layui-table-cell{height: auto; max-height: "+i+"; white-space: normal; text-overflow: clip;}","> td:hover > .layui-table-cell{overflow: auto;}"].concat(x.ie?[".layui-table-edit{height: "+i+";}","td[data-edit]:hover:after{height: "+i+";}"]:[]),function(e,t){t&&o.push(a+" "+t)})),l.css&&o.push(l.css),d.style({target:this.elem[0],text:o.join(""),id:"DF-table-"+n})},n.prototype.renderToolbar=function(){var l,o=this,e=o.config,r=e.elem.attr("lay-filter"),t=['<div class="layui-inline" lay-event="add"><i class="layui-icon layui-icon-add-1"></i></div>','<div class="layui-inline" lay-event="update"><i class="layui-icon layui-icon-edit"></i></div>','<div class="layui-inline" lay-event="delete"><i class="layui-icon layui-icon-delete"></i></div>'].join(""),a=o.layTool.find(".layui-table-tool-temp"),n=("default"===e.toolbar?a.html(t):"string"==typeof e.toolbar&&(t=f(e.toolbar).html()||"")&&a.html(m(t).render(e)),{filter:{title:"\u7b5b\u9009\u5217",layEvent:"LAYTABLE_COLS",icon:"layui-icon-cols",onClick:function(e){var a,n=e.config;(0,e.openPanel)({list:(a=[],o.eachCols(function(e,t){t.field&&"normal"==t.type&&a.push('<li><input type="checkbox" name="'+t.field+'" data-key="'+t.key+'" data-parentkey="'+(t.parentKey||"")+'" lay-skin="primary" '+(t.hide?"":"checked")+' title="'+v.escape(f("<div>"+(t.fieldTitle||t.title||t.field)+"</div>").text())+'" lay-filter="LAY_TABLE_TOOL_COLS"></li>')}),a.join("")),done:function(){i.on("checkbox(LAY_TABLE_TOOL_COLS)",function(e){var e=f(e.elem),t=this.checked,a=e.data("key"),i=o.col(a),l=i.hide,e=e.data("parentkey");i.key&&(i.hide=!t,o.elem.find('*[data-key="'+a+'"]')[t?"removeClass":"addClass"](W),l!=i.hide&&o.setParentCol(!t,e),o.resize(),layui.event.call(this,R,"colToggled("+r+")",{col:i,config:n}))})}})}},exports:{title:"\u5bfc\u51fa",layEvent:"LAYTABLE_EXPORT",icon:"layui-icon-export",onClick:function(e){var t=e.data,a=e.config,i=e.openPanel,e=e.elem;if(!t.length)return g.tips("\u5f53\u524d\u8868\u683c\u65e0\u6570\u636e",e,{tips:3});x.ie?g.tips("\u5bfc\u51fa\u529f\u80fd\u4e0d\u652f\u6301 IE\uff0c\u8bf7\u7528 Chrome \u7b49\u9ad8\u7ea7\u6d4f\u89c8\u5668\u5bfc\u51fa",e,{tips:3}):i({list:['<li data-type="csv">\u5bfc\u51fa CSV \u6587\u4ef6</li>'].join(""),done:function(e,t){t.on("click",function(){var e=f(this).data("type");k.exportFile.call(o,a.id,null,e)})}})}},print:{title:"\u6253\u5370",layEvent:"LAYTABLE_PRINT",icon:"layui-icon-print",onClick:function(e){var t=e.data;if(!t.length)return g.tips("\u5f53\u524d\u8868\u683c\u65e0\u6570\u636e",e.elem,{tips:3});var t=window.open("about:blank","_blank"),e=["<style>","body{font-size: 12px; color: #5F5F5F;}","table{width: 100%; border-collapse: collapse; border-spacing: 0;}","th,td{line-height: 20px; padding: 9px 15px; border: 1px solid #ccc; text-align: left; font-size: 12px; color: #5F5F5F;}","a{color: #5F5F5F; text-decoration:none;}","img{max-height: 100%;}","*.layui-hide{display: none}","</style>"].join(""),a=f(o.layHeader.html());a.append(o.layMain.find("table").html()),a.append(o.layTotal.find("table").html()),a.find("th.layui-table-patch").remove(),a.find("thead>tr>th."+z).filter(function(e,t){return!f(t).children("."+u).length}).remove(),a.find("tbody>tr>td."+z).remove(),t.document.write(e+a.prop("outerHTML")),t.document.close(),layui.device("edg").edg?(t.onafterprint=t.close,t.print()):(t.print(),t.close())}}});"object"==typeof e.defaultToolbar&&(l=[],e.defaultToolbar=f.map(e.defaultToolbar,function(e,t){var a="string"==typeof e,i=a?n[e]:e;return i&&(!(i=i.name&&n[i.name]?f.extend({},n[i.name],i):i).name&&a&&(i.name=e),l.push('<div class="layui-inline" title="'+i.title+'" lay-event="'+i.layEvent+'"><i class="layui-icon '+i.icon+'"></i></div>')),i}),o.layTool.find(".layui-table-tool-self").html(l.join("")))},n.prototype.renderPagebar=function(){var e,t=this.config,a=this.layPagebar=f('<div class="layui-inline layui-table-pagebar"></div>');t.pagebar&&((e=f(t.pagebar).html()||"")&&a.append(m(e).render(t)),this.layPage.append(a))},n.prototype.setParentCol=function(e,t){var a=this.config,i=this.layHeader.find('th[data-key="'+t+'"]'),l=parseInt(i.attr("colspan"))||0;i[0]&&(t=t.split("-"),t=a.cols[t[1]][t[2]],e?l--:l++,i.attr("colspan",l),i[l?"removeClass":"addClass"](W),t.colspan2=l,t.hide=l<1,a=i.data("parentkey"))&&this.setParentCol(e,a)},n.prototype.setColsPatch=function(){var a=this,e=a.config;layui.each(e.cols,function(e,t){layui.each(t,function(e,t){t.hide&&a.setParentCol(t.hide,t.parentKey)})})},n.prototype.setGroupWidth=function(i){var e,l=this;l.config.cols.length<=1||((e=l.layHeader.find((i?"th[data-key="+i.data("parentkey")+"]>":"")+"."+u)).css("width",0),layui.each(e.get().reverse(),function(){var e=f(this),t=e.parent().data("key"),a=0;l.layHeader.eq(0).find("th[data-parentkey="+t+"]").width(function(e,t){f(this).hasClass(W)||0<t&&(a+=t)}),a&&e.css("max-width",a-1),i&&e.parent().data("parentkey")&&l.setGroupWidth(e.parent())}),e.css("width","auto"))},n.prototype.setColsWidth=function(e){var n,o=this,r=o.config,a=0,d=0,c=0,s=0,u=o.setInit("width"),i=parseFloat(layui.getStyle(o.elem[0],"border-left-width")),l=o.layHeader.first().children("table"),y=o.layMain.find("table"),h=o.layMain.find("tbody").is(":empty"),p=e&&e.isInit,e=(o.eachCols(function(e,t){t.hide||(a++,t.width)||"normal"!==t.type||(n=t)}),u=u-("line"===r.skin||"nob"===r.skin?2:a+1)*i-o.getScrollWidth(o.layMain[0]),function(o){layui.each(r.cols,function(e,n){layui.each(n,function(e,t){var a=0,i=t.minWidth||r.cellMinWidth,l=t.maxWidth||r.cellMaxWidth;t?t.colGroup||t.hide||(o?c&&c<i?(d--,a=i):c&&l<c&&(d--,a=l):(a=t.width||0,/\d+%$/.test(a)?l<(a=(a=parseFloat(a)/100*u)<i?i:a)&&(a=l):a?"normal"===t.type&&(a<i&&(t.width=a=i),l<a)&&(t.width=a=l):(t.width=a=0,d++)),s+=a=t.hide?0:a):n.splice(e,1)})}),s<u&&0<d&&(c=(u-s)/d)}),f=(e(),e(!0),o.autoColNums=d=0<d?d:0,u);o.eachCols(function(e,a){var i=a.minWidth||r.cellMinWidth,l=a.maxWidth||r.cellMaxWidth;a.colGroup||a.hide||n&&n.key===a.key||(0===a.width?o.cssRules(a.key,function(e){var t=Math.round(c<i?i:l<c?l:c);e.style.width=t+"px",f-=t}):/\d+%$/.test(a.width)?o.cssRules(a.key,function(e){var t=Math.round(parseFloat(a.width)/100*u);e.style.width=(t=l<(t=t<i?i:t)?l:t)+"px",f-=t}):o.cssRules(a.key,function(e){e.style.width=a.width+"px",f-=a.width}))}),n&&o.cssRules(n.key,function(e){var t=n.minWidth||r.cellMinWidth,a=n.maxWidth||r.cellMaxWidth,a=Math.max(Math.min(f,a),t);e.style.width=a+"px",!p&&h&&y.width(o.getContentWidth(l)),o.layMain.prop("offsetHeight")>o.layMain.prop("clientHeight")&&(e.style.width=parseFloat(e.style.width)-i+"px")}),!p&&h?y.width(o.getContentWidth(l)):y.width("auto"),o.setGroupWidth()},n.prototype.resize=function(){var e=this;e.layMain&&("isConnected"in e.layMain[0]?e.layMain[0].isConnected:f.contains(document.body,e.layMain[0]))&&(e.fullSize(),e.setColsWidth(),e.scrollPatch())},n.prototype.reload=function(e,t,a){var i=this;e=e||{},delete i.haveInit,layui.each(e,function(e,t){"array"===layui.type(t)&&delete i.config[e]}),i.config=f.extend(t,{},i.config,e),"reloadData"!==a&&(layui.each(i.config.cols,function(e,t){layui.each(t,function(e,t){delete t.colspan2})}),delete i.config.HAS_SET_COLS_PATCH),i.render(a)},n.prototype.errorView=function(e){var t=this,a=t.layMain.find("."+h),e=f('<div class="'+h+'">'+(e||"Error")+"</div>");a[0]&&(t.layNone.remove(),a.remove()),t.layFixed.addClass(W),t.layMain.find("tbody").html(""),t.layMain.append(t.layNone=e),t.layTotal.addClass(y),t.layPage.find(O).addClass(y),k.cache[t.key]=[],t.syncCheckAll(),t.renderForm(),t.setColsWidth(),t.loading(!1)},n.prototype.page=1,n.prototype.pullData=function(i,l){var e,t,n=this,o=n.config,a=(o.HAS_SET_COLS_PATCH||n.setColsPatch(),o.HAS_SET_COLS_PATCH=!0,o.request),r=o.response,d=function(){"object"==typeof o.initSort&&n.sort({field:o.initSort.field,type:o.initSort.type,reloadType:l.type})},c=function(e,t){n.setColsWidth(),n.loading(!1),"function"==typeof o.done&&o.done(e,i,e[r.countName],t)};l=l||{},"function"==typeof o.before&&o.before(o),n.startTime=(new Date).getTime(),l.renderData?((e={})[r.dataName]=k.cache[n.key],e[r.countName]=o.url?"object"===layui.type(o.page)?o.page.count:e[r.dataName].length:o.data.length,"object"==typeof o.totalRow&&(e[r.totalRowName]=f.extend({},n.totalRow)),n.renderData({res:e,curr:i,count:e[r.countName],type:l.type,sort:!0}),c(e,"renderData")):o.url?(t={},o.page&&(t[a.pageName]=i,t[a.limitName]=o.limit),a=f.extend(t,o.where),o.contentType&&0==o.contentType.indexOf("application/json")&&(a=JSON.stringify(a)),n.loading(!0),f.ajax({type:o.method||"get",url:o.url,contentType:o.contentType,data:a,dataType:o.dataType||"json",jsonpCallback:o.jsonpCallback,headers:o.headers||{},complete:"function"==typeof o.complete?o.complete:undefined,success:function(e){var t,a;(e="function"==typeof o.parseData?o.parseData(e)||e:e)[r.statusName]!=r.statusCode?n.errorView(e[r.msgName]||'\u8fd4\u56de\u7684\u6570\u636e\u4e0d\u7b26\u5408\u89c4\u8303\uff0c\u6b63\u786e\u7684\u6210\u529f\u72b6\u6001\u7801\u5e94\u4e3a\uff1a"'+r.statusName+'": '+r.statusCode):(t=e[r.countName],(a=Math.ceil(t/o.limit)||1)<i&&(i=a),n.totalRow=e[r.totalRowName],n.renderData({res:e,curr:i,count:t,type:l.type}),d(),o.time=(new Date).getTime()-n.startTime+" ms"),c(e,l.type)},error:function(e,t){n.errorView("\u8bf7\u6c42\u5f02\u5e38\uff0c\u9519\u8bef\u63d0\u793a\uff1a"+t),"function"==typeof o.error&&o.error(e,t)}})):"array"===layui.type(o.data)&&(e={},t=i*o.limit-o.limit,a=o.data.concat(),e[r.dataName]=o.page?a.splice(t,o.limit):a,e[r.countName]=o.data.length,"object"==typeof o.totalRow&&(e[r.totalRowName]=f.extend({},o.totalRow)),n.totalRow=e[r.totalRowName],n.renderData({res:e,curr:i,count:e[r.countName],type:l.type}),d(),c(e,l.type))},n.prototype.eachCols=function(e){return k.eachCols(null,e,this.config.cols),this},n.prototype.col=function(e){try{return e=e.split("-"),this.config.cols[e[1]][e[2]]||{}}catch(t){return b.error(t),{}}},n.prototype.getTrHtml=function(a,l,n,e){var s=this,u=s.config,y=e&&e.trs||[],h=e&&e.trs_fixed||[],p=e&&e.trs_fixed_r||[];return n=n||1,layui.each(a,function(e,o){var i=[],r=[],d=[],c=e+u.limit*(n-1)+1;if("object"!=typeof o){a[e]=o={LAY_KEY:o};try{k.cache[s.key][e]=o}catch(t){}}"array"===layui.type(o)&&0===o.length||(o[k.config.numbersName]=c,o[k.config.indexName]=e,l||(o[k.config.initIndexName]=e),s.eachCols(function(e,l){var t,e=l.field||e,a=l.key,n=o[e];n!==undefined&&null!==n||(n=""),l.colGroup||(e=['<td data-field="'+e+'" data-key="'+a+'" '+(e=[],(t="function"==typeof l.edit?l.edit(o):l.edit)&&e.push('data-edit="'+t+'"'),l.templet&&e.push('data-content="'+v.escape(n)+'"'),l.toolbar&&e.push('data-off="true"'),l.event&&e.push('lay-event="'+l.event+'"'),l.minWidth&&e.push('data-minwidth="'+l.minWidth+'"'),l.maxWidth&&e.push('data-maxwidth="'+l.maxWidth+'"'),l.style&&e.push('style="'+l.style+'"'),e.join(" "))+' class="'+(t=[],l.hide&&t.push(W),l.field||t.push(z),t.join(" "))+'">','<div class="layui-table-cell laytable-cell-'+("normal"===l.type?a:a+" laytable-cell-"+l.type)+'"'+(l.align?' align="'+l.align+'"':"")+">"+function(){var e,t=f.extend(!0,{LAY_COL:l},o),a=k.config.checkName,i=k.config.disabledName;switch(l.type){case"checkbox":return'<input type="checkbox" name="layTableCheckbox" lay-skin="primary" '+(e=[],l[a]&&(o[a]=l[a],l[a])&&(e[0]="checked"),t[a]&&(e[0]="checked"),t[i]&&e.push("disabled"),e.join(" "))+' lay-type="layTableCheckbox">';case"radio":return'<input type="radio" name="layTableRadio_'+u.index+'" '+(e=[],t[a]&&(e[0]="checked"),t[i]&&e.push("disabled"),e.join(" "))+' lay-type="layTableRadio">';case"numbers":return c}return l.toolbar?m(f(l.toolbar).html()||"").render(t):T.call(s,{item3:l,content:n,tplData:t})}(),"</div></td>"].join(""),i.push(e),l.fixed&&"right"!==l.fixed&&r.push(e),"right"===l.fixed&&d.push(e))}),e=['data-index="'+e+'"'],o[k.config.checkName]&&e.push('class="'+A+'"'),e=e.join(" "),y.push("<tr "+e+">"+i.join("")+"</tr>"),h.push("<tr "+e+">"+r.join("")+"</tr>"),p.push("<tr "+e+">"+d.join("")+"</tr>"))}),{trs:y,trs_fixed:h,trs_fixed_r:p}},k.getTrHtml=function(e,t){e=C(e);return e.getTrHtml(t,null,e.page)},n.prototype.renderData=function(e){var a=this,i=a.config,t=e.res,l=e.curr,n=a.count=e.count,o=e.sort,r=t[i.response.dataName]||[],t=t[i.response.totalRowName],d=[],c=[],s=[],u=function(){if(!o&&a.sortKey)return a.sort({field:a.sortKey.field,type:a.sortKey.sort,pull:!0,reloadType:e.type});a.getTrHtml(r,o,l,{trs:d,trs_fixed:c,trs_fixed_r:s}),"fixed"===i.scrollPos&&"reloadData"===e.type||a.layBody.scrollTop(0),"reset"===i.scrollPos&&a.layBody.scrollLeft(0),a.layMain.find("."+h).remove(),a.layMain.find("tbody").html(d.join("")),a.layFixLeft.find("tbody").html(c.join("")),a.layFixRight.find("tbody").html(s.join("")),a.syncCheckAll(),a.renderForm(),a.fullSize(),a.haveInit?a.scrollPatch():setTimeout(function(){a.scrollPatch()},50),a.haveInit=!0,g.close(a.tipsIndex)};return k.cache[a.key]=r,a.layTotal[0==r.length?"addClass":"removeClass"](y),a.layPage[i.page||i.pagebar?"removeClass":"addClass"](W),a.layPage.find(O)[!i.page||0==n||0===r.length&&1==l?"addClass":"removeClass"](y),0===r.length?a.errorView(i.text.none):(a.layFixLeft.removeClass(W),o?u():(u(),a.renderTotal(r,t),a.layTotal&&a.layTotal.removeClass(W),void(i.page&&(i.page=f.extend({elem:"layui-table-page"+i.index,count:n,limit:i.limit,limits:i.limits||[10,20,30,40,50,60,70,80,90],groups:3,layout:["prev","page","next","skip","count","limit"],prev:'<i class="layui-icon">&#xe603;</i>',next:'<i class="layui-icon">&#xe602;</i>',jump:function(e,t){t||(a.page=e.curr,i.limit=e.limit,a.pullData(e.curr))}},i.page),i.page.count=n,p.render(i.page)))))},k.renderData=function(e){e=C(e);e&&e.pullData(e.page,{renderData:!0,type:"reloadData"})},n.prototype.renderTotal=function(e,o){var r,d=this,c=d.config,s={};c.totalRow&&(layui.each(e,function(e,i){"array"===layui.type(i)&&0===i.length||d.eachCols(function(e,t){var e=t.field||e,a=i[e];t.totalRow&&(s[e]=(s[e]||0)+(parseFloat(a)||0))})}),d.dataTotal=[],r=[],d.eachCols(function(e,t){var e=t.field||e,a=o&&o[t.field],i="totalRowDecimals"in t?t.totalRowDecimals:2,i=s[e]?parseFloat(s[e]||0).toFixed(i):"",i=(n=t.totalRowText||"",(l={LAY_COL:t})[e]=i,l=t.totalRow&&T.call(d,{item3:t,content:i,tplData:l})||n,a||l),l="string"==typeof(n=t.totalRow||c.totalRow)?m(n).render(f.extend({TOTAL_NUMS:a||s[e],TOTAL_ROW:o||{},LAY_COL:t},t)):i,n=(t.field&&d.dataTotal.push({field:t.field,total:f("<div>"+l+"</div>").text()}),['<td data-field="'+e+'" data-key="'+t.key+'" '+(n=[],t.minWidth&&n.push('data-minwidth="'+t.minWidth+'"'),t.maxWidth&&n.push('data-maxwidth="'+t.maxWidth+'"'),t.style&&n.push('style="'+t.style+'"'),n.join(" "))+' class="'+(a=[],t.hide&&a.push(W),t.field||a.push(z),a.join(" "))+'">','<div class="layui-table-cell laytable-cell-'+(i=t.key,"normal"===t.type?i:i+" laytable-cell-"+t.type)+'"'+(e=[],t.align&&e.push('align="'+t.align+'"'),e.join(" "))+">"+l,"</div></td>"].join(""));r.push(n)}),e=d.layTotal.find(".layui-table-patch"),d.layTotal.find("tbody").html("<tr>"+r.join("")+(e.length?e.get(0).outerHTML:"")+"</tr>"))},n.prototype.getColElem=function(e,t){return e.eq(0).find(".laytable-cell-"+t+":eq(0)")},n.prototype.renderForm=function(e){this.config;var t=this.elem.attr("lay-filter");i.render(e,t)},n.prototype.renderFormByElem=function(a){layui.each(["input","select"],function(e,t){i.render(a.find(t))})},n.prototype.syncCheckAll=function(){var a,e=this,i=e.config,t=e.layHeader.find('input[name="layTableCheckbox"]'),l=k.checkStatus(e.key);t[0]&&(a=l.isAll,e.eachCols(function(e,t){"checkbox"===t.type&&(t[i.checkName]=a)}),t.prop({checked:l.isAll,indeterminate:!l.isAll&&l.data.length}))},n.prototype.setRowActive=function(e,t,a){this.config;e=this.layBody.find('tr[data-index="'+e+'"]');if(t=t||"layui-table-click",a)return e.removeClass(t);e.addClass(t),e.siblings("tr").removeClass(t)},n.prototype.setRowChecked=function(i){var a,e,l,t,n,o,r,d=this,c=d.config,s="all"===i.index,u="array"===layui.type(i.index),y=s||u;y&&(d.layBox.addClass(P),"radio"===i.type)||(u&&(a={},layui.each(i.index,function(e,t){a[t]=!0}),i.index=a),e=d.layBody.children(".layui-table").children("tbody"),r=y?"tr":'tr[data-index="'+i.index+'"]',r=e.children(r),e=s?r:r.filter(u?function(){var e=f(this).data("index");return i.index[e]}:'[data-index="'+i.index+'"]'),i=f.extend({type:"checkbox"},i),l=k.cache[d.key],t="checked"in i,n=function(e){return"radio"===i.type||(t?i.checked:!e)},e.each(function(){var e=f(this),t=e.attr("data-index"),a=l[t];t&&"array"!==layui.type(a)&&!a[c.disabledName]&&(a=a[c.checkName]=n(e.hasClass(A)),e.toggleClass(A,!!a),"radio"===i.type)&&(o=t,e.siblings().removeClass(A))}),o&&layui.each(l,function(e,t){Number(o)!==Number(e)&&delete t[c.checkName]}),r=(u=(s=e.children("td").children(".layui-table-cell").children('input[lay-type="'+({radio:"layTableRadio",checkbox:"layTableCheckbox"}[i.type]||"checkbox")+'"]:not(:disabled)')).last()).closest(I),("radio"===i.type&&r.hasClass(W)?s.first():s).prop("checked",n(u.prop("checked"))),d.syncCheckAll(),y&&setTimeout(function(){d.layBox.removeClass(P)},100))},n.prototype.sort=function(l){var e,t=this,a={},i=t.config,n=i.elem.attr("lay-filter"),o=k.cache[t.key];"string"==typeof(l=l||{}).field&&(r=l.field,t.layHeader.find("th").each(function(e,t){var a=f(this),i=a.data("field");if(i===l.field)return l.field=a,r=i,!1}));try{var r=r||l.field.data("field"),d=l.field.data("key");if(t.sortKey&&!l.pull&&r===t.sortKey.field&&l.type===t.sortKey.sort)return;var c=t.layHeader.find("th .laytable-cell-"+d).find(E);t.layHeader.find("th").find(E).removeAttr("lay-sort"),c.attr("lay-sort",l.type||null),t.layFixed.find("th")}catch(s){b.error("Table modules: sort field '"+r+"' not matched")}t.sortKey={field:r,sort:l.type},i.autoSort&&("asc"===l.type?e=layui.sort(o,r,null,!0):"desc"===l.type?e=layui.sort(o,r,!0,!0):(e=layui.sort(o,k.config.initIndexName,null,!0),delete t.sortKey,delete i.initSort)),a[i.response.dataName]=e||o,t.renderData({res:a,curr:t.page,count:t.count,sort:!0,type:l.reloadType}),l.fromEvent&&(i.initSort={field:r,type:l.type},layui.event.call(l.field,R,"sort("+n+")",f.extend({config:i},i.initSort)))},n.prototype.loading=function(e){this.config.loading&&this.layBox.find(".layui-table-init").toggleClass(W,!e)},n.prototype.cssRules=function(t,a){var e=this.elem.children("style")[0];d.getStyleRules(e,function(e){if(e.selectorText===".laytable-cell-"+t)return a(e),!0})},n.prototype.fullSize=function(){var e,a,i=this,t=i.config,l=t.height;i.fullHeightGap?(l=r.height()-i.fullHeightGap)<135&&(l=135):i.parentDiv&&i.parentHeightGap?(l=f(i.parentDiv).height()-i.parentHeightGap)<135&&(l=135):i.customHeightFunc&&(l=i.customHeightFunc())<135&&(l=135),1<t.cols.length&&(e=i.layFixed.find(o).find("th"),a=i.layHeader.first(),layui.each(e,function(e,t){(t=f(t)).height(a.find('th[data-key="'+t.attr("data-key")+'"]').height()+"px")})),l&&(e=parseFloat(l)-(i.layHeader.outerHeight()||39),t.toolbar&&(e-=i.layTool.outerHeight()||51),t.totalRow&&(e-=i.layTotal.outerHeight()||40),(t.page||t.pagebar)&&(e-=i.layPage.outerHeight()||43),t.maxHeight?layui.each({elem:l,layMain:e},function(e,t){i[e].css({height:"auto",maxHeight:t+"px"})}):i.layMain.outerHeight(e))},n.prototype.getScrollWidth=function(e){var t;return e?t=e.offsetWidth-e.clientWidth:((e=document.createElement("div")).style.width="100px",e.style.height="100px",e.style.overflowY="scroll",document.body.appendChild(e),t=e.offsetWidth-e.clientWidth,document.body.removeChild(e)),t},n.prototype.scrollPatch=function(){var e=this,t=e.layMain.children("table"),a=e.layMain.width()-e.layMain.prop("clientWidth"),i=e.layMain.height()-e.layMain.prop("clientHeight"),l=(e.getScrollWidth(e.layMain[0]),t.outerWidth()-e.layMain.width()),n=function(e){var t;a&&i?(e=e.eq(0)).find(".layui-table-patch")[0]||((t=f('<th class="layui-table-patch"><div class="layui-table-cell"></div></th>')).find("div").css({width:a}),e.find("tr").append(t)):e.find(".layui-table-patch").remove()};n(e.layHeader),n(e.layTotal);n=e.layMain.height()-i;e.layFixed.find(L).css("height",t.height()>=n?n:"auto").scrollTop(e.layMain.scrollTop()),e.layFixRight[k.cache[e.key]&&k.cache[e.key].length&&0<l?"removeClass":"addClass"](W),e.layFixRight.css("right",a)},n.prototype.updateRow=function(e,i){var d=this,c=".layui-table-cell",e="array"===layui.type(e)?e:[e],s=k.cache[d.key]||[];layui.each(e,function(e,t){var a,l,n,o,r;a=t.index,l=t.data,n=t.related,o=s[a]||{},r=d.layBody.find('tr[data-index="'+a+'"]'),layui.each(l,function(e,t){o[e]=t,i&&i(e,t)}),d.eachCols(function(e,t){var a,i=String(t.field||e);(i in l||("function"==typeof n?n(i,e):n)&&(t.templet||t.toolbar))&&(i=(e=r.children('td[data-field="'+i+'"]')).children(c),a=o[t.field],i.html(T.call(d,{item3:t,content:a,tplData:f.extend({LAY_COL:t},o)})),e.data("content",a),d.renderFormByElem(i))})})},k.updateRow=function(e,t){return C(e).updateRow(t)},n.prototype.events=function(){var c=this,s=c.config,o=s.elem.attr("lay-filter"),e=c.layHeader.find("th"),u=".layui-table-cell",r=f("body"),d={},y=(c.layTool.on("click","*[lay-event]",function(e){var i=f(this),a=i.attr("lay-event"),l=k.cache[s.id],n=function(e){var t=f(e.list),a=f('<ul class="'+F+'"></ul>');a.html(t),s.height&&a.css("max-height",s.height-(c.layTool.outerHeight()||50)),i.find("."+F)[0]||i.append(a),c.renderForm(),a.on("click",function(e){layui.stope(e)}),e.done&&e.done(a,t)};layui.stope(e),j.trigger("table.tool.panel.remove"),g.close(c.tipsIndex),layui.each(s.defaultToolbar,function(e,t){if(t.layEvent===a)return"function"==typeof t.onClick&&t.onClick({data:l,config:s,openPanel:n,elem:i}),!0}),layui.event.call(this,R,"toolbar("+o+")",f.extend({event:a,config:s},{}))}),c.layHeader.on("click","*[lay-event]",function(e){var t=f(this),a=t.attr("lay-event"),t=t.closest("th").data("key"),t=c.col(t);layui.event.call(this,R,"colTool("+o+")",f.extend({event:a,config:s,col:t},{}))}),c.layPagebar.on("click","*[lay-event]",function(e){var t=f(this).attr("lay-event");layui.event.call(this,R,"pagebar("+o+")",f.extend({event:t,config:s},{}))}),e.on("mousemove",function(e){var t=f(this),a=t.offset().left,e=e.clientX-a;t.data("unresize")||w.eventMoveElem||(d.allowResize=t.width()-e<=10,r.css("cursor",d.allowResize?"col-resize":""))}).on("mouseleave",function(){f(this);w.eventMoveElem||(d.allowResize=!1,r.css("cursor",""))}).on("mousedown",function(e){var t,a=f(this);d.allowResize&&(t=a.data("key"),e.preventDefault(),d.offset=[e.clientX,e.clientY],c.cssRules(t,function(e){var t=e.style.width||a.outerWidth();d.rule=e,d.ruleWidth=parseFloat(t),d.minWidth=a.data("minwidth")||s.cellMinWidth,d.maxWidth=a.data("maxwidth")||s.cellMaxWidth}),a.data(H,d),w.eventMoveElem=a)}),w.docEvent||j.on("mousemove",function(e){var t,a;w.eventMoveElem&&(t=w.eventMoveElem.data(H)||{},w.eventMoveElem.data("resizing",1),e.preventDefault(),t.rule)&&(e=t.ruleWidth+e.clientX-t.offset[0],a=w.eventMoveElem.closest("."+D).attr(N),a=C(a))&&((e=e<t.minWidth?t.minWidth:e)>t.maxWidth&&(e=t.maxWidth),t.rule.style.width=e+"px",a.setGroupWidth(w.eventMoveElem),g.close(c.tipsIndex))}).on("mouseup",function(e){var t,a,i,l,n;w.eventMoveElem&&(i=(t=w.eventMoveElem).closest("."+D).attr(N),a=C(i))&&(i=t.data("key"),l=a.col(i),n=a.config.elem.attr("lay-filter"),d={},r.css("cursor",""),a.scrollPatch(),t.removeData(H),delete w.eventMoveElem,a.cssRules(i,function(e){l.width=parseFloat(e.style.width),layui.event.call(t[0],R,"colResized("+n+")",{col:l,config:a.config})}))}),w.docEvent=!0,e.on("click",function(e){var t=f(this),a=t.find(E),i=a.attr("lay-sort");if(!a[0]||1===t.data("resizing"))return t.removeData("resizing");c.sort({field:t,type:"asc"===i?"desc":"desc"===i?null:"asc",fromEvent:!0})}).find(E+" .layui-edge ").on("click",function(e){var t=f(this),a=t.index(),t=t.parents("th").eq(0).data("field");layui.stope(e),0===a?c.sort({field:t,type:"asc",fromEvent:!0}):c.sort({field:t,type:"desc",fromEvent:!0})}),c.commonMember=function(e){var a=f(this).parents("tr").eq(0).data("index"),t=c.layBody.find('tr[data-index="'+a+'"]'),i=(k.cache[c.key]||[])[a]||{},l={tr:t,config:s,data:k.clearCacheKey(i),dataCache:i,index:a,del:function(){k.cache[c.key][a]=[],t.remove(),c.scrollPatch()},update:function(e,t){c.updateRow({index:a,data:e=e||{},related:t},function(e,t){l.data[e]=t})},setRowChecked:function(e){c.setRowChecked(f.extend({index:a},e))}};return f.extend(l,e)}),t=(c.elem.on("click",'input[name="layTableCheckbox"]+',function(e){var t=f(this),a=t.closest("td"),t=t.prev(),i=(c.layBody.find('input[name="layTableCheckbox"]'),t.parents("tr").eq(0).data("index")),l=t[0].checked,n="layTableAllChoose"===t.attr("lay-filter");t[0].disabled||(n?c.setRowChecked({index:"all",checked:l}):c.setRowChecked({index:i,checked:l}),layui.stope(e),layui.event.call(t[0],R,"checkbox("+o+")",y.call(t[0],{checked:l,type:n?"all":"one",getCol:function(){return c.col(a.data("key"))}})))}),c.elem.on("click",'input[lay-type="layTableRadio"]+',function(e){var t=f(this),a=t.closest("td"),t=t.prev(),i=t[0].checked,l=t.parents("tr").eq(0).data("index");if(layui.stope(e),t[0].disabled)return!1;c.setRowChecked({type:"radio",index:l}),layui.event.call(t[0],R,"radio("+o+")",y.call(t[0],{checked:i,getCol:function(){return c.col(a.data("key"))}}))}),c.layBody.on("mouseenter","tr",function(){var e=f(this),t=e.index();e.data("off")||c.layBody.find("tr:eq("+t+")").addClass(_)}).on("mouseleave","tr",function(){var e=f(this),t=e.index();e.data("off")||c.layBody.find("tr:eq("+t+")").removeClass(_)}).on("click","tr",function(e){t.call(this,"row",e)}).on("dblclick","tr",function(e){t.call(this,"rowDouble",e)}).on("contextmenu","tr",function(e){s.defaultContextmenu||e.preventDefault(),t.call(this,"rowContextmenu",e)}),function(e,t){var a=f(this);if(!a.data("off")){if("rowContextmenu"!==e){var i=[".layui-form-checkbox",".layui-form-switch",".layui-form-radio","[lay-unrow]"].join(",");if(f(t.target).is(i)||f(t.target).closest(i)[0])return}layui.event.call(this,R,e+"("+o+")",y.call(a.children("td")[0],{e:t}))}}),n=function(e,t){var a,i,l;(e=f(e)).data("off")||(l=e.data("field"),i=e.data("key"),i=c.col(i),a=e.closest("tr").data("index"),a=k.cache[c.key][a],e.children(u),(i="function"==typeof i.edit?i.edit(a):i.edit)&&((i=f("textarea"===i?'<textarea class="layui-input '+M+'" lay-unrow></textarea>':'<input class="layui-input '+M+'" lay-unrow>'))[0].value=(l=e.data("content")||a[l])===undefined||null===l?"":l,e.find("."+M)[0]||e.append(i),i.focus(),t)&&layui.stope(t))},i=(c.layBody.on("change","."+M,function(){var e=f(this),t=e.parent(),a=this.value,i=e.parent().data("field"),e=e.closest("tr").data("index"),e=k.cache[c.key][e],l=y.call(t[0],{value:a,field:i,oldValue:e[i],td:t,reedit:function(){setTimeout(function(){n(l.td);var e={};e[i]=l.oldValue,l.update(e)})},getCol:function(){return c.col(t.data("key"))}}),e={};e[i]=a,l.update(e),layui.event.call(t[0],R,"edit("+o+")",l)}).on("blur","."+M,function(){f(this).remove()}),c.layBody.on(s.editTrigger,"td",function(e){n(this,e)}).on("mouseenter","td",function(){a.call(this)}).on("mouseleave","td",function(){a.call(this,"hide")}),c.layTotal.on("mouseenter","td",function(){a.call(this)}).on("mouseleave","td",function(){a.call(this,"hide")}),"layui-table-grid-down"),a=function(e){var t=f(this),a=t.children(u);t.data("off")||t.parent().hasClass(S)||(e?t.find(".layui-table-grid-down").remove():!(a.prop("scrollWidth")>a.prop("clientWidth")||0<a.find("br").length)||s.lineStyle||a.find("."+i)[0]||t.append('<div class="'+i+'"><i class="layui-icon layui-icon-down"></i></div>'))},l=function(e,t){var a=f(this),i=a.parent(),l=i.data("key"),n=c.col(l),o=i.parent().data("index"),r=i.children(u),i="layui-table-cell-c",d=f('<i class="layui-icon layui-icon-up '+i+'">');"tips"===(t=t||n.expandedMode||s.cellExpandedMode)?c.tipsIndex=g.tips(['<div class="layui-table-tips-main" style="margin-top: -'+(r.height()+23)+"px;"+("sm"===s.size?"padding: 4px 15px; font-size: 12px;":"lg"===s.size?"padding: 14px 15px;":"")+'">',r.html(),"</div>",'<i class="layui-icon layui-table-tips-c layui-icon-close"></i>'].join(""),r[0],{tips:[3,""],time:-1,anim:-1,maxWidth:x.ios||x.android?300:c.elem.width()/2,isOutAnim:!1,skin:"layui-table-tips",success:function(e,t){e.find(".layui-table-tips-c").on("click",function(){g.close(t)})}}):(c.elem.find("."+i).trigger("click"),c.cssRules(l,function(e){var t=e.style.width,a=n.expandedWidth||s.cellExpandedWidth;a<parseFloat(t)&&(a=parseFloat(t)),d.data("cell-width",t),e.style.width=a+"px",setTimeout(function(){c.scrollPatch()})}),c.setRowActive(o,S),r.next("."+i)[0]||r.after(d),d.on("click",function(){var t=f(this);c.setRowActive(o,[S,_].join(" "),!0),c.cssRules(l,function(e){e.style.width=t.data("cell-width"),setTimeout(function(){c.resize()})}),t.remove(),r.scrollTop(0),r.scrollLeft(0)})),a.remove(),layui.stope(e)},h=(c.layBody.on("click","."+i,function(e){l.call(this,e)}),c.layTotal.on("click","."+i,function(e){l.call(this,e,"tips")}),function(e){var t=f(this),a=t.closest("td"),i=t.parents("tr").eq(0).data("index");c.setRowActive(i),layui.event.call(this,R,(e||"tool")+"("+o+")",y.call(this,{event:t.attr("lay-event"),getCol:function(){return c.col(a.data("key"))}}))}),p=(c.layBody.on("click","*[lay-event]",function(e){h.call(this),layui.stope(e)}).on("dblclick","*[lay-event]",function(e){h.call(this,"toolDouble"),layui.stope(e)}),c.layMain.on("scroll",function(){var e=f(this),t=e.scrollLeft(),e=e.scrollTop();c.layHeader.scrollLeft(t),c.layTotal.scrollLeft(t),c.layFixed.find(L).scrollTop(e),g.close(c.tipsIndex)}),window.requestAnimationFrame||function(e){return setTimeout(e,1e3/60)});c.layFixed.find(L).on("mousewheel DOMMouseScroll",function(e){var t=e.originalEvent.wheelDelta||-e.originalEvent.detail,a=c.layMain.scrollTop(),i=100,l=(e.preventDefault(),function(){0<i&&(i-=10,a+=0<t?-10:10,c.layMain.scrollTop(a),p(l))});p(l)}),c.autoResize()},n.prototype.getElementSize=function(e){if(window.getComputedStyle)return e=window.getComputedStyle(e,null),{height:parseFloat(e.height||"0"),width:parseFloat(e.width||"0"),borderTopWidth:parseFloat(e.borderTopWidth||"0"),borderRightWidth:parseFloat(e.borderRightWidth||"0"),borderBottomWidth:parseFloat(e.borderBottomWidth||"0"),borderLeftWidth:parseFloat(e.borderLeftWidth||"0"),paddingTop:parseFloat(e.paddingTop||"0"),paddingRight:parseFloat(e.paddingRight||"0"),paddingBottom:parseFloat(e.paddingBottom||"0"),paddingLeft:parseFloat(e.paddingLeft||"0"),marginTop:parseFloat(e.marginTop||"0"),marginRight:parseFloat(e.marginRight||"0"),marginBottom:parseFloat(e.marginBottom||"0"),marginLeft:parseFloat(e.marginLeft||"0"),boxSizing:e.boxSizing}},n.prototype.getContentWidth=function(e){var t;return!(9===e[0].nodeType||d.ie&&"border-box"===e.css("box-sizing")||"none"===e.css("display"))&&void 0!==(t=this.getElementSize(e[0]))&&t.width?"border-box"===t.boxSizing?t.width-t.paddingLeft-t.paddingRight-t.borderLeftWidth-t.borderRightWidth:t.width:e.width()},n.prototype.autoResize=function(){"function"==typeof this.resizeStrategy&&this.resizeStrategy(this.elem)},n.prototype.resizeStrategy=window.ResizeObserver?function(e){var t=this;t.resizeObserver&&(t.resizeObserver.disconnect(),t.resizeObserver=null),t.resizeObserver=new ResizeObserver(function(){t.resize()}),t.resizeObserver.observe(e[0])}:"8"===d.ie?function(e){var t=this;e.off("resize.lay-table-autoresize").on("resize.lay-table-autoresize",function(){t.resize()})}:void 0,r.on("resize",function(){layui.each(w.that,function(){this.resize()})}),j.on("click",function(){j.trigger("table.remove.tool.panel")}),j.on("table.remove.tool.panel",function(){f("."+F).remove()}),k.init=function(i,o){o=o||{};var e="object"==typeof i?i:f("string"==typeof i?'table[lay-filter="'+i+'"]':t+"[lay-data], "+t+"[lay-options]"),r="Table element property lay-data configuration item has a syntax error: ";return e.each(function(){var l,e=f(this),t=e.attr("lay-data"),t=d.options(this,{attr:t?"lay-data":null,errorText:r+(t||e.attr("lay-options"))}),n=f.extend({elem:this,cols:[],data:[],skin:e.attr("lay-skin"),size:e.attr("lay-size"),even:"string"==typeof e.attr("lay-even")},k.config,o,t),a=(i&&e.hide(),e.find("thead>tr").each(function(i){n.cols[i]=[],f(this).children().each(function(e){var t=f(this),a=t.attr("lay-data"),a=d.options(this,{attr:a?"lay-data":null,errorText:r+(a||t.attr("lay-options"))}),t=f.extend({title:t.text(),colspan:parseInt(t.attr("colspan"))||1,rowspan:parseInt(t.attr("rowspan"))||1},a);n.cols[i].push(t)})}),e.find("tbody>tr")),t=k.render(n);!a.length||o.data||t.config.url||(l=0,k.eachCols(t.config.id,function(e,i){a.each(function(e){n.data[e]=n.data[e]||{};var t=f(this),a=i.field;n.data[e][a]=t.children("td").eq(l).html()}),l++}),t.reloadData({data:n.data}))}),this},w.that={},w.config={},function(a,i,e,l){var n,o;l.colGroup&&(n=0,a++,l.CHILD_COLS=[],o=e+(parseInt(l.rowspan)||1),layui.each(i[o],function(e,t){t.parentKey?t.parentKey===l.key&&(t.PARENT_COL_INDEX=a,l.CHILD_COLS.push(t),c(a,i,o,t)):t.PARENT_COL_INDEX||1<=n&&n==(l.colspan||1)||(t.PARENT_COL_INDEX=a,l.CHILD_COLS.push(t),n+=parseInt(1<t.colspan?t.colspan:1),c(a,i,o,t))}))});k.eachCols=function(e,a,i){var e=w.config[e]||{},l=[],n=(i=f.extend(!0,[],i||e.cols),layui.each(i,function(a,e){if(a)return!0;layui.each(e,function(e,t){c(0,i,a,t),t.PARENT_COL_INDEX||l.push(t)})}),function(e){layui.each(e||l,function(e,t){if(t.CHILD_COLS)return n(t.CHILD_COLS);"function"==typeof a&&a(e,t)})});n()},k.checkStatus=function(e){var a=0,i=[],l=[],e=k.cache[e]||[];return layui.each(e,function(e,t){"array"===layui.type(t)||t[k.config.disabledName]?a++:t[k.config.checkName]&&(i.push(k.clearCacheKey(t)),l.push(t))}),{data:i,dataCache:l,isAll:!(!e.length||!i.length)&&i.length===e.length-a}},k.setRowChecked=function(e,t){e=C(e);e&&e.setRowChecked(t)},k.getData=function(e){var a=[],e=k.cache[e]||[];return layui.each(e,function(e,t){"array"!==layui.type(t)&&a.push(k.clearCacheKey(t))}),a},k.resize=function(e){e?l(e)&&C(e).resize():layui.each(w.that,function(){this.resize()})},k.exportFile=function(e,t,a){t=t||k.clearCacheKey(k.cache[e]);var i=(a="object"==typeof a?a:(i={},a&&(i.type=a),i)).type||"csv",o=w.that[e],l=w.config[e]||{},n={csv:"text/csv",xls:"application/vnd.ms-excel"}[i],r=document.createElement("a");if(x.ie)return b.error("IE_NOT_SUPPORT_EXPORTS");var d,c,s,u,y=l.tree&&l.tree.view;if(y)try{t=f.extend(!0,[],k.cache[e]),t=function h(e){return e.reduce(function(e,t){var a=t.children||[];return delete t.children,e.concat(t,h(a))},[])}(Array.from(t))}catch(p){}r.href="data:"+n+";charset=utf-8,\ufeff"+encodeURIComponent((d=[],c=[],s=[],u={},layui.each(t,function(i,l){var n=[];"object"==typeof e?(layui.each(e,function(e,t){0==i&&d.push(t||"")}),layui.each(layui.isArray(l)?f.extend([],l):k.clearCacheKey(l),function(e,t){n.push('"'+(t||"")+'"')})):k.eachCols(e,function(e,t){var a;!1===t.ignoreExport||t.field&&"normal"==t.type?t.hide&&!1!==t.ignoreExport||!0===t.ignoreExport?0==i&&(u[t.field]=!0):((a=l[t.field])!==undefined&&null!==a||(a=""),0==i&&d.push(t.fieldTitle||t.title||t.field||""),a=(a=T.call(o,{item3:t,content:a,tplData:l,text:"text",obj:{td:function(e){return y&&(i=l.LAY_DATA_INDEX),o.layBody.find('tr[data-index="'+i+'"]>td').filter('[data-field="'+e+'"]')}}})).replace(/"/g,'""'),n.push(a='"'+a+'"')):t.field&&"normal"!==t.type&&0==i&&(u[t.field]=!0)}),c.push(n.join(","))}),o&&layui.each(o.dataTotal,function(e,t){u[t.field]||s.push('"'+(t.total||"")+'"')}),d.join(",")+"\r\n"+c.join("\r\n")+"\r\n"+s.join(","))),r.download=(a.title||l.title||"table_"+(l.index||""))+"."+i,document.body.appendChild(r),r.click(),document.body.removeChild(r)},k.getOptions=l,k.hideCol=function(e,l){var n=C(e);n&&("boolean"===layui.type(l)?n.eachCols(function(e,t){var a=t.key,i=n.col(a),t=t.parentKey;i.hide!=l&&(i=i.hide=l,n.elem.find('*[data-key="'+a+'"]')[i?"addClass":"removeClass"](W),n.setParentCol(i,t))}):(l=layui.isArray(l)?l:[l],layui.each(l,function(e,l){n.eachCols(function(e,t){var a,i;l.field===t.field&&(a=t.key,i=n.col(a),t=t.parentKey,"hide"in l)&&i.hide!=l.hide&&(i=i.hide=!!l.hide,n.elem.find('*[data-key="'+a+'"]')[i?"addClass":"removeClass"](W),n.setParentCol(i,t))})})),f("."+F).remove(),n.resize())},k.reload=function(e,t,a,i){if(l(e))return(e=C(e)).reload(t,a,i),w.call(e)},k.reloadData=function(){var a=f.extend([],arguments),i=(a[3]="reloadData",new RegExp("^("+["elem","id","cols","width","height","maxHeight","toolbar","defaultToolbar","className","css","pagebar"].join("|")+")$"));return layui.each(a[1],function(e,t){i.test(e)&&delete a[1][e]}),k.reload.apply(null,a)},k.render=function(e){e=new n(e);return w.call(e)},k.clearCacheKey=function(e){return delete(e=f.extend({},e))[k.config.checkName],delete e[k.config.indexName],delete e[k.config.initIndexName],delete e[k.config.numbersName],delete e[k.config.disabledName],e},f(function(){k.init()}),s(R,k)});layui.define(["table"],function(e){"use strict";var A=layui.$,h=layui.form,P=layui.table,y=layui.hint(),B={config:{},on:P.on,eachCols:P.eachCols,index:P.index,set:function(e){var t=this;return t.config=A.extend({},t.config,e),t},resize:P.resize,getOptions:P.getOptions,hideCol:P.hideCol,renderData:P.renderData},i=function(){var a=this,e=a.config,n=e.id||e.index;return{config:e,reload:function(e,t){a.reload.call(a,e,t)},reloadData:function(e,t){B.reloadData(n,e,t)}}},j=function(e){var t=i.that[e];return t||y.error(e?"The treeTable instance with ID '"+e+"' not found":"ID argument required"),t||null},F="lay-table-id",L="layui-hide",s=".layui-table-body",q=".layui-table-main",R=".layui-table-fixed-l",Y=".layui-table-fixed-r",l="layui-table-checked",m="layui-table-tree",z="LAY_DATA_INDEX",b="LAY_DATA_INDEX_HISTORY",f="LAY_PARENT_INDEX",g="LAY_CHECKBOX_HALF",H="LAY_EXPAND",X="LAY_HAS_EXPANDED",V="LAY_ASYNC_STATUS",n=["all","parent","children","none"],t=/<[^>]+?>/,p=["flexIconClose","flexIconOpen","iconClose","iconOpen","iconLeaf","icon"],a=function(e){var t=this;t.index=++B.index,t.config=A.extend(!0,{},t.config,B.config,e),t.init(),t.render()},x=function(n,i,e){var l=P.cache[n];layui.each(e||l,function(e,t){var a=t[z]||"";-1!==a.indexOf("-")&&(l[a]=t),t[i]&&x(n,i,t[i])})},d=function(d,a,e){var r=j(d),o=("reloadData"!==e&&(r.status={expand:{}}),A.extend(!0,{},r.getOptions(),a)),n=o.tree,c=n.customName.children,i=n.customName.id,l=(delete a.hasNumberCol,delete a.hasChecboxCol,delete a.hasRadioCol,P.eachCols(null,function(e,t){"numbers"===t.type?a.hasNumberCol=!0:"checkbox"===t.type?a.hasChecboxCol=!0:"radio"===t.type&&(a.hasRadioCol=!0)},o.cols),a.parseData),u=a.done;"reloadData"===e&&"fixed"===o.scrollPos&&(r.scrollTopCache=r.config.elem.next().find(s).scrollTop()),o.url?e&&(!l||l.mod)||(a.parseData=function(){var e=this,t=arguments,a=t[0],t=("function"===layui.type(l)&&(a=l.apply(e,t)||t[0]),e.response.dataName);return n.data.isSimpleData&&!n["async"].enable&&(a[t]=r.flatToTree(a[t])),N(a[t],function(e){e[H]=H in e?e[H]:e[i]!==undefined&&r.status.expand[e[i]]},c),e.autoSort&&e.initSort&&e.initSort.type&&layui.sort(a[t],e.initSort.field,"desc"===e.initSort.type,!0),r.initData(a[t]),a},a.parseData.mod=!0):a.data!==undefined&&(a.data=a.data||[],n.data.isSimpleData&&(a.data=r.flatToTree(a.data)),r.initData(a.data)),e&&(!u||u.mod)||(a.done=function(){var e,t=arguments,a=t[3],n="renderData"===a,i=(n||delete r.isExpandAll,this.elem.next()),l=(r.updateStatus(null,{LAY_HAS_EXPANDED:!1}),x(d,c),i.find('[name="layTableCheckbox"][lay-filter="layTableAllChoose"]'));if(l.length&&(e=B.checkStatus(d),l.prop({checked:e.isAll&&e.data.length,indeterminate:!e.isAll&&e.data.length})),!n&&o.autoSort&&o.initSort&&o.initSort.type&&B.sort(d),r.renderTreeTable(i),"reloadData"===a&&"fixed"===this.scrollPos&&i.find(s).scrollTop(r.scrollTopCache),"function"===layui.type(u))return u.apply(this,t)},a.done.mod=!0),a&&a.tree&&a.tree.view&&layui.each(p,function(e,t){a.tree.view[t]!==undefined&&(a.tree.view[t]=r.normalizedIcon(a.tree.view[t]))})};a.prototype.init=function(){var e=this.config,t=e.tree.data.cascade,t=(-1===n.indexOf(t)&&(e.tree.data.cascade="all"),P.render(A.extend({},e,{data:[],url:"",done:null}))),a=t.config.id;(i.that[a]=this).tableIns=t,d(a,e)},a.prototype.config={tree:{customName:{children:"children",isParent:"isParent",name:"name",id:"id",pid:"parentId",icon:"icon"},view:{indent:14,flexIconClose:'<i class="layui-icon layui-icon-triangle-r"></i>',flexIconOpen:'<i class="layui-icon layui-icon-triangle-d"></i>',showIcon:!0,icon:"",iconClose:'<i class="layui-icon layui-icon-folder"></i>',iconOpen:'<i class="layui-icon layui-icon-folder-open"></i>',iconLeaf:'<i class="layui-icon layui-icon-leaf"></i>',showFlexIconIfNotParent:!1,dblClickExpand:!0,expandAllDefault:!1},data:{isSimpleData:!1,rootPid:null,cascade:"all"},"async":{enable:!1,url:"",type:null,contentType:null,headers:null,where:null,autoParam:[]},callback:{beforeExpand:null,onExpand:null}}},a.prototype.normalizedIcon=function(e){return e?t.test(e)?e:'<i class="'+e+'"></i>':""},a.prototype.getOptions=function(){return this.tableIns?P.getOptions(this.tableIns.config.id):this.config},a.prototype.flatToTree=function(e){var n,i,l,d,r,o,c,u,t=this.getOptions(),a=t.tree,s=a.customName;return e=e||P.cache[t.id],t=e,n=s.id,i=s.pid,l=s.children,d=a.data.rootPid,n=n||"id",i=i||"parentId",l=l||"children",c={},u=[],layui.each(t,function(e,t){r=n+t[n],o=n+t[i],c[r]||(c[r]={},c[r][l]=[]);var a={};a[l]=c[r][l],c[r]=A.extend({},t,a),((d?c[r][i]===d:!c[r][i])?u:(c[o]||(c[o]={},c[o][l]=[]),c[o][l])).push(c[r])}),u},a.prototype.treeToFlat=function(e,n,i){var l=this,d=l.getOptions().tree.customName,r=d.children,o=d.pid,c=[];return layui.each(e,function(e,t){var e=(i?i+"-":"")+e,a=A.extend({},t);a[o]=t[o]||n,c.push(a),c=c.concat(l.treeToFlat(t[r],t[d.id],e))}),c},a.prototype.getTreeNode=function(e){var t,a=this;return e?(t=a.getOptions().tree,t.customName,{data:e,dataIndex:e[z],getParentNode:function(){return a.getNodeByIndex(e[f])}}):y.error("\u627e\u4e0d\u5230\u8282\u70b9\u6570\u636e")},a.prototype.getNodeByIndex=function(t){var a,e,n=this,i=n.getNodeDataByIndex(t);return i?((e=n.getOptions()).tree.customName.parent,a=e.id,(e={data:i,dataIndex:i[z],getParentNode:function(){return n.getNodeByIndex(i[f])},update:function(e){return B.updateNode(a,t,e)},remove:function(){return B.removeNode(a,t)},expand:function(e){return B.expandNode(a,A.extend({},e,{index:t}))},setChecked:function(e){return B.setRowChecked(a,A.extend({},e,{index:t}))}}).dataIndex=t,e):y.error("\u627e\u4e0d\u5230\u8282\u70b9\u6570\u636e")},a.prototype.getNodeById=function(a){var e=this.getOptions(),n=e.tree.customName.id,i="",e=B.getData(e.id,!0);if(layui.each(e,function(e,t){if(t[n]===a)return i=t[z],!0}),i)return this.getNodeByIndex(i)},a.prototype.getNodeDataByIndex=function(e,t,a){var n=this.getOptions(),i=n.tree,n=P.cache[n.id],l=n[e];if("delete"!==a&&l)return A.extend(l,a),t?A.extend({},l):l;for(var d=n,r=String(e).split("-"),o=0,c=i.customName.children;o<r.length;o++){if(a&&o===r.length-1){if("delete"===a)return(o?d[c]:d).splice(r[o],1)[0];A.extend((o?d[c]:d)[r[o]],a)}d=(o?d[c]:d)[r[o]]}return t?A.extend({},d):d},B.getNodeDataByIndex=function(e,t){e=j(e);if(e)return e.getNodeDataByIndex(t,!0)};a.prototype.initData=function(e,t){var a=this.getOptions(),n=a.tree,a=a.id,n=(e=e||this.getTableData(),n.customName),i=n.isParent,l=n.children,d=function(e,a){layui.each(e,function(e,t){i in t||(t[i]=!(!t[l]||!t[l].length)),t[b]=t[z],t[f]=a=a||"";e=t[z]=(a?a+"-":"")+e;d(t[l]||[],e)})};return d(e,t),x(a,l,e),e},r={};var r,U=function(e,t,a){return r[e]||(r[e]=layui.debounce(t,a)),r[e]},J=function(t,a,n,i,l){var e=t.trElem,d=t.tableViewElem||e.closest(".layui-table-view"),r=t.tableId||d.attr(F),o=t.options||P.getOptions(r),e=t.dataIndex||e.attr("lay-data-index"),c=j(r),u=o.tree||{},s=u.customName||{},f=s.isParent,y=c.getNodeDataByIndex(e),p="boolean"!==layui.type(a),x=p?!y[H]:a,h=y[f]?x:null;if(l&&x!=y[H]&&(!y[V]||"local"===y[V])){var m=u.callback.beforeExpand;if("function"===layui.type(m)&&!1===m(r,y,a))return h}var m=y[X],b=d.find('tr[lay-data-index="'+e+'"]'),g=b.find(".layui-table-tree-flexIcon"),v=(c.updateNodeIcon({scopeEl:b,isExpand:x,isParent:y[f]}),y[H]=x,y[s.id]);if(v!==undefined&&(c.status.expand[v]=x),null!==h){v=y[s.children]||[];if(x)if(m){if(!v.length)return;b.nextAll(v.map(function(e,t,a){return'tr[lay-data-index="'+e[z]+'"]'}).join(",")).removeClass(L),layui.each(v,function(e,t){t[f]&&(!n||p||t[H]?t[H]&&J({dataIndex:t[z],trElem:d.find('tr[lay-data-index="'+t[z]+'"]').first(),tableViewElem:d,tableId:r,options:o},!0):J({dataIndex:t[z],trElem:d.find('tr[lay-data-index="'+t[z]+'"]').first(),tableViewElem:d,tableId:r,options:o},a,n,i,l))})}else{var N,I,C,D,T,_,k,w,O,S,E,m=u["async"]||{},b=m.url||o.url;if(m.enable&&y[f]&&!y[V])return y[V]="loading",g.html('<i class="layui-icon layui-icon-loading layui-anim layui-anim-loop layui-anim-rotate"></i>'),N=function(e){y[V]="success",y[s.children]=e,c.initData(y[s.children],y[z]),J(t,!0,!p&&n,i,l)},C=m.format,"function"===layui.type(C)?C(y,o,N):(I=A.extend({},m.where||o.where),C=m.autoParam,layui.each(C,function(e,t){t=t.split("=");I[t[0].trim()]=y[(t[1]||t[0]).trim()]}),(C=m.contentType||o.contentType)&&0==C.indexOf("application/json")&&(I=JSON.stringify(I)),O=m.method||o.method,D=m.dataType||o.dataType,T=m.jsonpCallback||o.jsonpCallback,_=m.headers||o.headers,k=m.parseData||o.parseData,w=m.response||o.response,A.ajax({type:O||"get",url:b,contentType:C,data:I,dataType:D||"json",jsonpCallback:T,headers:_||{},success:function(e){(e="function"==typeof k?k.call(o,e)||e:e)[w.statusName]!=w.statusCode?(y[V]="error",g.html('<i class="layui-icon layui-icon-refresh"></i>')):N(e[w.dataName])},error:function(e,t){y[V]="error","function"==typeof o.error&&o.error(e,t)}})),h;y[X]=!0,v.length&&(!o.initSort||o.url&&!o.autoSort||((m=o.initSort).type?layui.sort(v,m.field,"desc"===m.type,!0):layui.sort(v,P.config.indexName,null,!0)),c.initData(y[s.children],y[z]),O=P.getTrHtml(r,v,null,null,e),S={trs:A(O.trs.join("")),trs_fixed:A(O.trs_fixed.join("")),trs_fixed_r:A(O.trs_fixed_r.join(""))},E=(e.split("-").length-1||0)+1,layui.each(v,function(e,t){S.trs.eq(e).attr({"data-index":t[z],"lay-data-index":t[z],"data-level":E}).data("index",t[z]),S.trs_fixed.eq(e).attr({"data-index":t[z],"lay-data-index":t[z],"data-level":E}).data("index",t[z]),S.trs_fixed_r.eq(e).attr({"data-index":t[z],"lay-data-index":t[z],"data-level":E}).data("index",t[z])}),d.find(q).find('tbody tr[lay-data-index="'+e+'"]').after(S.trs),d.find(R).find('tbody tr[lay-data-index="'+e+'"]').after(S.trs_fixed),d.find(Y).find('tbody tr[lay-data-index="'+e+'"]').after(S.trs_fixed_r),c.renderTreeTable(S.trs,E),n)&&!p&&layui.each(v,function(e,t){J({dataIndex:t[z],trElem:d.find('tr[lay-data-index="'+t[z]+'"]').first(),tableViewElem:d,tableId:r,options:o},a,n,i,l)})}else c.isExpandAll=!1,(n&&!p?(layui.each(v,function(e,t){J({dataIndex:t[z],trElem:d.find('tr[lay-data-index="'+t[z]+'"]').first(),tableViewElem:d,tableId:r,options:o},a,n,i,l)}),d.find(v.map(function(e,t,a){return'tr[lay-data-index="'+e[z]+'"]'}).join(","))):(b=c.treeToFlat(v,y[s.id],e),d.find(b.map(function(e,t,a){return'tr[lay-data-index="'+e[z]+'"]'}).join(",")))).addClass(L);U("resize-"+r,function(){B.resize(r)},0)(),l&&"loading"!==y[V]&&(C=u.callback.onExpand,"function"===layui.type(C))&&C(r,y,x)}return h},v=(B.expandNode=function(e,t){var a,n,i,e=j(e);if(e)return a=(t=t||{}).index,n=t.expandFlag,i=t.inherit,t=t.callbackFlag,e=e.getOptions().elem.next(),J({trElem:e.find('tr[lay-data-index="'+a+'"]').first()},n,i,null,t)},B.expandAll=function(a,e){if("boolean"!==layui.type(e))return y.error("expandAll \u7684\u5c55\u5f00\u72b6\u6001\u53c2\u6570\u53ea\u63a5\u6536true/false");var t=j(a);if(t){t.isExpandAll=e;var n=t.getOptions(),i=n.tree,l=n.elem.next(),d=i.customName.isParent,r=i.customName.id,o=i.view.showFlexIconIfNotParent;if(e){e=B.getData(a,!0);if(i["async"].enable){var c=!0;if(layui.each(e,function(e,t){if(t[d]&&!t[V])return!(c=!1)}),!c)return void layui.each(B.getData(a),function(e,t){B.expandNode(a,{index:t[z],expandFlag:!0,inherit:!0})})}var u=!0;if(layui.each(e,function(e,t){if(t[d]&&!t[X])return!(u=!1)}),u)t.updateStatus(null,function(e){(e[d]||o)&&(e[H]=!0,e[r]!==undefined)&&(t.status.expand[e[r]]=!0)}),l.find('tbody tr[data-level!="0"]').removeClass(L),l.find(".layui-table-tree-flexIcon").html(i.view.flexIconOpen),i.view.showIcon&&l.find(".layui-table-tree-nodeIcon:not(.layui-table-tree-iconCustom,.layui-table-tree-iconLeaf)").html(i.view.iconOpen);else{if(t.updateStatus(null,function(e){(e[d]||o)&&(e[H]=!0,e[X]=!0,e[r]!==undefined)&&(t.status.expand[e[r]]=!0)}),n.initSort&&n.initSort.type&&n.autoSort)return B.sort(a);var s,n=P.getTrHtml(a,e),f={trs:A(n.trs.join("")),trs_fixed:A(n.trs_fixed.join("")),trs_fixed_r:A(n.trs_fixed_r.join(""))};layui.each(e,function(e,t){var a=t[z].split("-").length-1;s={"data-index":t[z],"lay-data-index":t[z],"data-level":a},f.trs.eq(e).attr(s).data("index",t[z]),f.trs_fixed.eq(e).attr(s).data("index",t[z]),f.trs_fixed_r.eq(e).attr(s).data("index",t[z])}),layui.each(["main","fixed-l","fixed-r"],function(e,t){l.find(".layui-table-"+t+" tbody").html(f[["trs","trs_fixed","trs_fixed_r"][e]])}),t.renderTreeTable(l,0,!1)}}else t.updateStatus(null,function(e){(e[d]||o)&&(e[H]=!1,e[r]!==undefined)&&(t.status.expand[e[r]]=!1)}),l.find('.layui-table-box tbody tr[data-level!="0"]').addClass(L),l.find(".layui-table-tree-flexIcon").html(i.view.flexIconClose),i.view.showIcon&&l.find(".layui-table-tree-nodeIcon:not(.layui-table-tree-iconCustom,.layui-table-tree-iconLeaf)").html(i.view.iconClose);B.resize(a)}},a.prototype.updateNodeIcon=function(e){var t=this.getOptions().tree||{},a=e.scopeEl,n=e.isExpand,e=e.isParent;a.find(".layui-table-tree-flexIcon").css("visibility",e||t.view.showFlexIconIfNotParent?"visible":"hidden").html(n?t.view.flexIconOpen:t.view.flexIconClose),t.view.showIcon&&(a=a.find(".layui-table-tree-nodeIcon:not(.layui-table-tree-iconCustom)"),n=e?n?t.view.iconOpen:t.view.iconClose:t.view.iconLeaf,a.toggleClass("layui-table-tree-iconLeaf",!e).html(n))},a.prototype.renderTreeTable=function(e,t,a){var l=this,n=l.getOptions(),d=n.elem.next(),i=(d.hasClass(m)||d.addClass(m),n.id),r=n.tree||{},o=(r.data,r.view||{}),c=r.customName||{},u=c.isParent,s=(d.attr("lay-filter"),l),f=n.data.length,y=((t=t||0)||(d.find(".layui-table-body tr:not([data-level])").attr("data-level",t),layui.each(P.cache[i],function(e,t){f&&(t[z]=String(e));t=t[z];d.find('.layui-table-main tbody tr[data-level="0"]:eq('+e+")").attr("lay-data-index",t),d.find('.layui-table-fixed-l tbody tr[data-level="0"]:eq('+e+")").attr("lay-data-index",t),d.find('.layui-table-fixed-r tbody tr[data-level="0"]:eq('+e+")").attr("lay-data-index",t)})),null),p=c.name,x=o.indent||14;if(layui.each(e.find('td[data-field="'+p+'"]'),function(e,t){var a,n,i=(t=A(t)).closest("tr"),t=t.children(".layui-table-cell");t.hasClass("layui-table-tree-item")||(n=i.attr("lay-data-index"))&&(i=d.find('tr[lay-data-index="'+n+'"]'),(a=s.getNodeDataByIndex(n))[H]&&a[u]&&((y=y||{})[n]=!0),a[g]&&i.find('input[type="checkbox"][name="layTableCheckbox"]').prop("indeterminate",!0),n=t.html(),(t=i.find('td[data-field="'+p+'"]>div.layui-table-cell')).addClass("layui-table-tree-item"),t.html(['<div class="layui-inline layui-table-tree-flexIcon" ','style="',"margin-left: "+x*i.attr("data-level")+"px;",a[u]||o.showFlexIconIfNotParent?"":" visibility: hidden;",'">',a[H]?o.flexIconOpen:o.flexIconClose,"</div>",o.showIcon?'<div class="layui-inline layui-table-tree-nodeIcon'+(a[c.icon]||o.icon?" layui-table-tree-iconCustom":"")+(a[u]?"":" layui-table-tree-iconLeaf")+'">'+(l.normalizedIcon(a[c.icon])||o.icon||(a[u]?a[H]?o.iconOpen:o.iconClose:o.iconLeaf)||"")+"</div>":"",n].join("")).find(".layui-table-tree-flexIcon").on("click",function(e){layui.stope(e),J({trElem:i},null,null,null,!0)}))}),!t&&r.view.expandAllDefault&&l.isExpandAll===undefined)return B.expandAll(i,!0);(!1!==a&&y?(layui.each(y,function(e,t){e=d.find('tr[lay-data-index="'+e+'"]');e.find(".layui-table-tree-flexIcon").html(o.flexIconOpen),J({trElem:e.first()},!0)}),U("renderTreeTable2-"+i,function(){h.render(A(".layui-table-tree["+F+'="'+i+'"]'))},0)):U("renderTreeTable-"+i,function(){n.hasNumberCol&&v(l),h.render(A(".layui-table-tree["+F+'="'+i+'"]'))},0))()},function(a){var e=a.getOptions(),t=e.elem.next(),n=0,i=t.find(".layui-table-main tbody tr"),l=t.find(".layui-table-fixed-l tbody tr"),d=t.find(".layui-table-fixed-r tbody tr");layui.each(a.treeToFlat(P.cache[e.id]),function(e,t){t.LAY_HIDE||(a.getNodeDataByIndex(t[z]).LAY_NUM=++n,i.eq(e).find(".laytable-cell-numbers").html(n),l.eq(e).find(".laytable-cell-numbers").html(n),d.eq(e).find(".laytable-cell-numbers").html(n))})}),N=(a.prototype.render=function(e){var t=this;t.tableIns=P["reloadData"===e?"reloadData":"reload"](t.tableIns.config.id,A.extend(!0,{},t.config)),t.config=t.tableIns.config},a.prototype.reload=function(e,t,a){var n=this;e=e||{},delete n.haveInit,layui.each(e,function(e,t){"array"===layui.type(t)&&delete n.config[e]}),d(n.getOptions().id,e,a||!0),n.config=A.extend(t,{},n.config,e),n.render(a)},B.reloadData=function(){var e=A.extend(!0,[],arguments);return e[3]="reloadData",B.reload.apply(null,e)},function(e,a,n,i){var l=[];return layui.each(e,function(e,t){"function"===layui.type(a)?a(t):A.extend(t,a),l.push(A.extend({},t)),i||(l=l.concat(N(t[n],a,n,i)))}),l}),o=(a.prototype.updateStatus=function(e,t,a){var n=this.getOptions(),i=n.tree;return e=e||P.cache[n.id],N(e,t,i.customName.children,a)},a.prototype.getTableData=function(){var e=this.getOptions();return P.cache[e.id]},B.updateStatus=function(e,t,a){var e=j(e),n=e.getOptions();return a=a||(n.url?P.cache[n.id]:n.data),e.updateStatus(a,t)},B.sort=function(e){var t,a,i,l,n,d=j(e);d&&(n=(t=d.getOptions()).tree,a=B.getData(e),i=n.customName.children,l=function(e,a,n){layui.sort(e,a,n,!0),layui.each(e,function(e,t){l(t[i]||[],a,n)})},t.autoSort)&&((n=t.initSort).type?l(a,n.field,"desc"===n.type):l(a,P.config.indexName,null),P.cache[e]=a,d.initData(a),B.renderData(e))},function(n){var t=n.config.id,i=j(t),a=n.data=B.getNodeDataByIndex(t,n.index),l=a[z],d=(n.dataIndex=l,n.update);n.update=function(){var e=arguments,t=(A.extend(i.getNodeDataByIndex(l),e[0]),d.apply(this,e)),a=n.config.tree.customName.name;return a in e[0]&&n.tr.find('td[data-field="'+a+'"]').children("div.layui-table-cell").removeClass("layui-table-tree-item"),i.renderTreeTable(n.tr,n.tr.attr("data-level"),!1),t},n.del=function(){B.removeNode(t,a)},n.setRowChecked=function(e){B.setRowChecked(t,{index:a,checked:e})}}),u=(B.updateNode=function(e,a,t){var n,i,l,d,r,o=j(e);o&&((d=o.getOptions()).tree,d=(n=d.elem.next()).find('tr[lay-data-index="'+a+'"]'),i=d.attr("data-index"),l=d.attr("data-level"),t)&&(d=o.getNodeDataByIndex(a,!1,t),r=P.getTrHtml(e,[d]),layui.each(["main","fixed-l","fixed-r"],function(e,t){n.find(".layui-table-"+t+' tbody tr[lay-data-index="'+a+'"]').replaceWith(A(r[["trs","trs_fixed","trs_fixed_r"][e]].join("")).attr({"data-index":i,"lay-data-index":a,"data-level":l}).data("index",i))}),o.renderTreeTable(n.find('tr[lay-data-index="'+a+'"]'),l))},B.removeNode=function(e,t,a){var n,i,l,d,r,o,c,u,s=j(e);s&&(i=(u=(n=s.getOptions()).tree).customName.isParent,l=u.customName.children,d=n.elem.next(),r=[],o=P.cache[e],t=s.getNodeDataByIndex("string"===layui.type(t)?t:t[z],!1,"delete"),c=s.getNodeDataByIndex(t[f]),s.updateCheckStatus(c),u=s.treeToFlat([t],t[u.customName.pid],t[f]),layui.each(u,function(e,t){t=t[z];r.push('tr[lay-data-index="'+t+'"]'),-1!==t.indexOf("-")&&delete o[t]}),d.find(r.join(",")).remove(),t=s.initData(),function(){for(var e in o)-1!==e.indexOf("-")&&e!==o[e][z]&&delete o[e]}(),layui.each(s.treeToFlat(t),function(e,t){t[b]&&t[b]!==t[z]&&d.find('tr[lay-data-index="'+t[b]+'"]').attr({"data-index":t[z],"lay-data-index":t[z]}).data("index",t[z])}),layui.each(o,function(e,t){d.find('tr[data-level="0"][lay-data-index="'+t[z]+'"]').attr("data-index",e).data("index",e)}),n.hasNumberCol&&v(s),c&&(u=d.find('tr[lay-data-index="'+c[z]+'"]'),a||(c[i]=!(!c[l]||!c[l].length)),s.updateNodeIcon({scopeEl:u,isExpand:c[H],isParent:c[i]})),B.resize(e))},B.addNodes=function(e,t){var a=j(e);if(a){var n=a.getOptions(),i=n.tree,l=n.elem.next(),d=P.config.checkName,r=(t=t||{}).parentIndex,o=t.index,c=t.data,t=t.focus,u=(r="number"===layui.type(r)?r.toString():r)?a.getNodeDataByIndex(r):null,o="number"===layui.type(o)?o:-1,c=A.extend(!0,[],layui.isArray(c)?c:[c]);layui.each(c,function(e,t){d in t||!u||(t[d]=u[d])}),a.getTableData();if(u){var s=i.customName.isParent,f=i.customName.children;u[s]=!0;var y=(y=u[f])?(p=y.splice(-1===o?y.length:o),u[f]=y.concat(c,p)):u[f]=c,f=(a.updateStatus(y,function(e){(e[s]||i.view.showFlexIconIfNotParent)&&(e[X]=!1)}),a.treeToFlat(y));l.find(f.map(function(e){return'tr[lay-data-index="'+e[z]+'"]'}).join(",")).remove(),a.initData(),u[X]=!1,u[V]="local",J({trElem:l.find('tr[lay-data-index="'+r+'"]')},!0)}else{var p=P.cache[e].splice(-1===o?P.cache[e].length:o);if(P.cache[e]=P.cache[e].concat(c,p),n.url||(n.page?(y=n.page,n.data.splice.apply(n.data,[y.limit*(y.curr-1),y.limit].concat(P.cache[e]))):n.data=P.cache[e]),a.initData(),l.find(".layui-none").length)return P.renderData(e),c;var x,f=P.getTrHtml(e,c),h={trs:A(f.trs.join("")),trs_fixed:A(f.trs_fixed.join("")),trs_fixed_r:A(f.trs_fixed_r.join(""))},r=(layui.each(c,function(e,t){x={"data-index":t[z],"lay-data-index":t[z],"data-level":"0"},h.trs.eq(e).attr(x).data("index",t[z]),h.trs_fixed.eq(e).attr(x).data("index",t[z]),h.trs_fixed_r.eq(e).attr(x).data("index",t[z])}),parseInt(c[0][z])-1),y=l.find(q),n=l.find(R),f=l.find(Y);-1==r?y.find('tr[data-level="0"][data-index="0"]')[0]?(y.find('tr[data-level="0"][data-index="0"]').before(h.trs),n.find('tr[data-level="0"][data-index="0"]').before(h.trs_fixed),f.find('tr[data-level="0"][data-index="0"]').before(h.trs_fixed_r)):(y.find("tbody").prepend(h.trs),n.find("tbody").prepend(h.trs_fixed),f.find("tbody").prepend(h.trs_fixed_r)):-1===o?(y.find("tbody").append(h.trs),n.find("tbody").append(h.trs_fixed),f.find("tbody").append(h.trs_fixed_r)):(r=p[0][b],y.find('tr[data-level="0"][data-index="'+r+'"]').before(h.trs),n.find('tr[data-level="0"][data-index="'+r+'"]').before(h.trs_fixed),f.find('tr[data-level="0"][data-index="'+r+'"]').before(h.trs_fixed_r)),layui.each(P.cache[e],function(e,t){l.find('tr[data-level="0"][lay-data-index="'+t[z]+'"]').attr("data-index",e).data("index",e)}),a.renderTreeTable(l.find(c.map(function(e,t,a){return'tr[lay-data-index="'+e[z]+'"]'}).join(",")))}return a.updateCheckStatus(u),u&&(o=l.find('tr[lay-data-index="'+u[z]+'"]'),a.updateNodeIcon({scopeEl:o,isExpand:u[H],isParent:u[s]})),B.resize(e),t&&l.find(q).find('tr[lay-data-index="'+c[0][z]+'"]').get(0).scrollIntoViewIfNeeded(),c}},B.checkStatus=function(e,n){var i,t,a,l=j(e);if(l)return l=l.getOptions().tree,i=P.config.checkName,t=B.getData(e,!0).filter(function(e,t,a){return e[i]||n&&e[g]}),a=!0,layui.each("all"===l.data.cascade?P.cache[e]:B.getData(e,!0),function(e,t){if(!t[i])return!(a=!1)}),{data:t,isAll:a}},B.on("sort",function(e){var e=e.config,t=e.elem.next(),e=e.id;t.hasClass(m)&&B.sort(e)}),B.on("row",function(e){e.config.elem.next().hasClass(m)&&o(e)}),B.on("rowDouble",function(e){var t=e.config,a=t.elem.next();t.id;a.hasClass(m)&&(o(e),(t.tree||{}).view.dblClickExpand)&&J({trElem:e.tr.first()},null,null,null,!0)}),B.on("rowContextmenu",function(e){var t=e.config,a=t.elem.next();t.id;a.hasClass(m)&&o(e)}),B.on("tool",function(e){var t=e.config,a=t.elem.next();t.id;a.hasClass(m)&&o(e)}),B.on("edit",function(e){var t=e.config,a=t.elem.next();t.id;a.hasClass(m)&&(o(e),e.field===t.tree.customName.name)&&((a={})[e.field]=e.value,e.update(a))}),B.on("radio",function(e){var t=e.config,a=t.elem.next(),t=t.id;a.hasClass(m)&&(a=j(t),o(e),u.call(a,e.tr,e.checked))}),a.prototype.setRowCheckedClass=function(e,t){var a=this.getOptions(),n=(e.data("index"),a.elem.next());e[t?"addClass":"removeClass"](l),e.each(function(){var e=A(this).data("index");n.find('.layui-table-fixed-r tbody tr[data-index="'+e+'"]')[t?"addClass":"removeClass"](l)})},a.prototype.updateCheckStatus=function(e,t){var a,n,i,l,d,r,o,c=this,u=c.getOptions();return!!u.hasChecboxCol&&(a=u.tree,n=u.id,i=u.elem.next(),l=P.config.checkName,"all"!==(d=a.data.cascade)&&"parent"!==d||!e||(d=c.updateParentCheckStatus(e,"boolean"===layui.type(t)?t:null),layui.each(d,function(e,t){var a=i.find('tr[lay-data-index="'+t[z]+'"]  input[name="layTableCheckbox"]:not(:disabled)'),n=t[l];c.setRowCheckedClass(a.closest("tr"),n),h.render(a.prop({checked:n,indeterminate:t[g]}))})),o=!(r=!0),0<(e=(e="all"===a.data.cascade?P.cache[n]:B.getData(n,!0)).filter(function(e){return!e[u.disabledName]})).length?layui.each(e,function(e,t){if((t[l]||t[g])&&(o=!0),t[l]||(r=!1),o&&!r)return!0}):r=!1,o=o&&!r,h.render(i.find('input[name="layTableCheckbox"][lay-filter="layTableAllChoose"]').prop({checked:r,indeterminate:o})),r)},a.prototype.updateParentCheckStatus=function(a,n){var i,e=this.getOptions(),t=e.tree,e=e.id,l=P.config.checkName,t=t.customName.children,d=[];return!(a[g]=!1)===n?a[t].length?layui.each(a[t],function(e,t){if(!t[l])return n=!1,a[g]=!0}):n=!1:!1===n?layui.each(a[t],function(e,t){if(t[l]||t[g])return a[g]=!0}):(n=!1,i=0,layui.each(a[t],function(e,t){t[l]&&i++}),n=a[t].length?a[t].length===i:a[l],a[g]=!n&&0<i),a[l]=n,d.push(A.extend({},a)),d=a[f]?d.concat(this.updateParentCheckStatus(P.cache[e][a[f]],n)):d},function(e,t,a){var n=this,i=n.getOptions(),l=i.tree,d=i.id,r=i.elem.next(),o=(e.length?e:r).find(".laytable-cell-radio, .laytable-cell-checkbox").children("input").last(),i="radio"===o.attr("type");if(a){a=function(){var e=function(e){layui.stope(e)};o.parent().on("click",e),o.next().click(),o.parent().off("click",e)};i?t&&!o.prop("checked")&&a():"boolean"===layui.type(t)&&o.prop("checked")===t||a()}else{var c,a=n.getNodeDataByIndex(e.attr("data-index")),u=P.config.checkName;if(!i)return t="boolean"===layui.type(t)?t:!a[u],i=n.updateStatus(a?[a]:P.cache[d],function(e){e[P.config.disabledName]||(e[u]=t,e[g]=!1)},a&&-1!==["parent","none"].indexOf(l.data.cascade)),d=r.find(i.map(function(e){return'tr[lay-data-index="'+e[z]+'"] input[name="layTableCheckbox"]:not(:disabled)'}).join(",")),n.setRowCheckedClass(d.closest("tr"),t),h.render(d.prop({checked:t,indeterminate:!1})),a&&a[f]&&(c=n.getNodeDataByIndex(a[f])),n.updateCheckStatus(c,t);a&&(n.updateStatus(null,function(e){var t;e[u]&&(t=r.find('tr[lay-data-index="'+e[z]+'"] input[type="radio"][lay-type="layTableRadio"]'),e[u]=!1,n.setRowCheckedClass(t.closest("tr"),!1),h.render(t.prop("checked",!1)))}),a[u]=t,n.setRowCheckedClass(e,t),n.setRowCheckedClass(e.siblings(),!1),h.render(e.find('input[type="radio"][lay-type="layTableRadio"]').prop("checked",t)))}});B.on("checkbox",function(e){var t=e.config,a=t.elem.next(),t=t.id;a.hasClass(m)&&(a=j(t),t=e.checked,o(e),e.isAll=u.call(a,e.tr,t))}),B.setRowChecked=function(a,e){var t,n,i,l,d,r,o,c=j(a);c&&(t=c.getOptions().elem.next(),i=(e=e||{}).index,n=e.checked,e=e.callbackFlag,i="string"===layui.type(i)?i:i[z],r=c.getNodeDataByIndex(i))&&(l=function(e){o.push(e),t.find('tr[lay-data-index="'+e+'"]').length||(e=c.getNodeDataByIndex(e)[f])&&l(e)},(d=t.find('tr[lay-data-index="'+i+'"]')).length||(r=r[f],o=[],l(r),layui.each(o.reverse(),function(e,t){B.expandNode(a,{index:t,expandFlag:!0})}),d=t.find('tr[lay-data-index="'+i+'"]')),u.call(c,d,n,e))},B.checkAllNodes=function(e,t){var a,e=j(e);e&&(a=e.getOptions().elem.next(),u.call(e,a.find('tr[data-index="NONE"]'),!!t))},B.getData=function(e,t){var a,n=j(e);if(n)return a=[],layui.each(A.extend(!0,[],P.cache[e]||[]),function(e,t){a.push(t)}),t?n.treeToFlat(a):a},B.reloadAsyncNode=function(a,e){var t,n,i=j(a);i&&(t=i.getOptions().tree)["async"]&&t["async"].enable&&(n=i.getNodeDataByIndex(e))&&(n[X]=!1,n[H]=!1,n[V]=!1,layui.each(i.treeToFlat(n[t.customName.children]).reverse(),function(e,t){B.removeNode(a,t[z],!0)}),B.expandNode(a,{index:e,expandFlag:!0,callbackFlag:!0}))},B.getNodeById=function(e,t){e=j(e);if(e)return e.getNodeById(t)},B.getNodesByFilter=function(e,t,a){var n,i,l,d=j(e);if(d)return i=d.getOptions(),n=(a=a||{}).isSingle,a=(a=a.parentNode)&&a.data,i=d.treeToFlat(a?a[i.tree.customName.children]||[]:P.cache[e]).filter(t),l=[],layui.each(i,function(e,t){if(l.push(d.getNodeByIndex(t[z])),n)return!0}),l},i.that={},B.reload=function(e,t,a,n){e=j(e);if(e)return e.reload(t,a,n),i.call(e)},B.render=function(e){e=new a(e);return i.call(e)},e("treeTable",B)});layui.define(["form","util"],function(e){"use strict";var p=layui.$,i=layui.form,y=layui.layer,f=layui.util,a="tree",t={config:{customName:{id:"id",title:"title",children:"children"}},index:layui[a]?layui[a].index+1e4:0,set:function(e){var i=this;return i.config=p.extend({},i.config,e),i},on:function(e,i){return layui.onevent.call(this,a,e,i)}},n=function(){var i=this,e=i.config,a=e.id||i.index;return n.that[a]=i,{config:n.config[a]=e,reload:function(e){i.reload.call(i,e)},getChecked:function(){return i.getChecked.call(i)},setChecked:function(e){return i.setChecked.call(i,e)}}},m="layui-hide",u="layui-disabled",k="layui-tree-set",C="layui-tree-iconClick",v="layui-icon-addition",x="layui-icon-subtraction",b="layui-tree-entry",g="layui-tree-main",w="layui-tree-txt",N="layui-tree-pack",F="layui-tree-spread",T="layui-tree-setLineShort",L="layui-tree-showLine",S="layui-tree-lineExtend",l=function(e){var i=this;i.index=++t.index,i.config=p.extend({},i.config,t.config,e),i.render()};l.prototype.config={data:[],showCheckbox:!1,showLine:!0,accordion:!1,onlyIconControl:!1,isJump:!1,edit:!1,text:{defaultNodeName:"\u672a\u547d\u540d",none:"\u65e0\u6570\u636e"}},l.prototype.reload=function(e){var a=this;layui.each(e,function(e,i){"array"===layui.type(i)&&delete a.config[e]}),a.config=p.extend(!0,{},a.config,e),a.render()},l.prototype.render=function(){var e=this,i=e.config,a=(i.customName=p.extend({},t.config.customName,i.customName),e.checkids=[],p('<div class="layui-tree layui-border-box'+(i.showCheckbox?" layui-form":"")+(i.showLine?" layui-tree-line":"")+'" lay-filter="LAY-tree-'+e.index+'"></div>')),n=(e.tree(a),i.elem=p(i.elem));if(n[0]){if(e.key=i.id||e.index,e.elem=a,e.elemNone=p('<div class="layui-tree-emptyText">'+i.text.none+"</div>"),n.html(e.elem),0==e.elem.find(".layui-tree-set").length)return e.elem.append(e.elemNone);i.showCheckbox&&e.renderForm("checkbox"),e.elem.find(".layui-tree-set").each(function(){var e=p(this);e.parent(".layui-tree-pack")[0]||e.addClass("layui-tree-setHide"),!e.next()[0]&&e.parents(".layui-tree-pack").eq(1).hasClass("layui-tree-lineExtend")&&e.addClass(T),e.next()[0]||e.parents(".layui-tree-set").eq(0).next()[0]||e.addClass(T)}),e.events()}},l.prototype.renderForm=function(e){i.render(e,"LAY-tree-"+this.index)},l.prototype.tree=function(r,e){var d=this,s=d.config,o=s.customName,e=e||s.data;layui.each(e,function(e,i){var a,n,t=i[o.children]&&0<i[o.children].length,l=p('<div class="layui-tree-pack" '+(i.spread?'style="display: block;"':"")+"></div>"),c=p(['<div data-id="'+i[o.id]+'" class="layui-tree-set'+(i.spread?" layui-tree-spread":"")+(i.checked?" layui-tree-checkedFirst":"")+'">','<div class="layui-tree-entry">','<div class="layui-tree-main">',s.showLine?t?'<span class="layui-tree-iconClick layui-tree-icon"><i class="layui-icon '+(i.spread?"layui-icon-subtraction":"layui-icon-addition")+'"></i></span>':'<span class="layui-tree-iconClick"><i class="layui-icon layui-icon-file"></i></span>':'<span class="layui-tree-iconClick"><i class="layui-tree-iconArrow '+(t?"":m)+'"></i></span>',s.showCheckbox?'<input type="checkbox" name="'+(i.field||"layuiTreeCheck_"+i[o.id])+'" same="layuiTreeCheck" lay-skin="primary" '+(i.disabled?"disabled":"")+' value="'+i[o.id]+'">':"",s.isJump&&i.href?'<a href="'+i.href+'" target="_blank" class="'+w+'">'+(i[o.title]||i.label||s.text.defaultNodeName)+"</a>":'<span class="'+w+(i.disabled?" "+u:"")+'">'+(i[o.title]||i.label||s.text.defaultNodeName)+"</span>","</div>",s.edit?(a={add:'<i class="layui-icon layui-icon-add-1"  data-type="add"></i>',update:'<i class="layui-icon layui-icon-edit" data-type="update"></i>',del:'<i class="layui-icon layui-icon-delete" data-type="del"></i>'},n=['<div class="layui-btn-group layui-tree-btnGroup">'],!0===s.edit&&(s.edit=["update","del"]),"object"==typeof s.edit?(layui.each(s.edit,function(e,i){n.push(a[i]||"")}),n.join("")+"</div>"):void 0):"","</div></div>"].join(""));t&&(c.append(l),d.tree(l,i[o.children])),r.append(c),c.prev("."+k)[0]&&c.prev().children(".layui-tree-pack").addClass("layui-tree-showLine"),t||c.parent(".layui-tree-pack").addClass("layui-tree-lineExtend"),d.spread(c,i),s.showCheckbox&&(i.checked&&d.checkids.push(i[o.id]),d.checkClick(c,i)),s.edit&&d.operate(c,i)})},l.prototype.spread=function(n,t){var l=this,c=l.config,e=n.children("."+b),i=e.children("."+g),a=i.find('input[same="layuiTreeCheck"]'),r=e.find("."+C),e=e.find("."+w),d=c.onlyIconControl?r:i,s="";d.on("click",function(e){var i=n.children("."+N),a=(d.children(".layui-icon")[0]?d:d.find(".layui-tree-icon")).children(".layui-icon");i[0]?n.hasClass(F)?(n.removeClass(F),i.slideUp(200),a.removeClass(x).addClass(v),l.updateFieldValue(t,"spread",!1)):(n.addClass(F),i.slideDown(200),a.addClass(x).removeClass(v),l.updateFieldValue(t,"spread",!0),c.accordion&&((i=n.siblings("."+k)).removeClass(F),i.children("."+N).slideUp(200),i.find(".layui-tree-icon").children(".layui-icon").removeClass(x).addClass(v))):s="normal"}),e.on("click",function(){p(this).hasClass(u)||(s=n.hasClass(F)?c.onlyIconControl?"open":"close":c.onlyIconControl?"close":"open",a[0]&&l.updateFieldValue(t,"checked",a.prop("checked")),c.click&&c.click({elem:n,state:s,data:t}))})},l.prototype.updateFieldValue=function(e,i,a){i in e&&(e[i]=a)},l.prototype.setCheckbox=function(e,i,a){var t,n=this,l=n.config.customName,c=a.prop("checked");a.prop("disabled")||("object"!=typeof i[l.children]&&!e.find("."+N)[0]||e.find("."+N).find('input[same="layuiTreeCheck"]').each(function(e){this.disabled||((e=i[l.children][e])&&n.updateFieldValue(e,"checked",c),n.updateFieldValue(this,"checked",c))}),(t=function(e){var i,a,n;e.parents("."+k)[0]&&(a=(e=e.parent("."+N)).parent(),n=e.prev().find('input[same="layuiTreeCheck"]'),c?n.prop("checked",c):(e.find('input[same="layuiTreeCheck"]').each(function(){this.checked&&(i=!0)}),i||n.prop("checked",!1)),t(a))})(e),n.renderForm("checkbox"))},l.prototype.checkClick=function(a,n){var t=this,l=t.config;a.children("."+b).children("."+g).on("click",'input[same="layuiTreeCheck"]+',function(e){layui.stope(e);var e=p(this).prev(),i=e.prop("checked");e.prop("disabled")||(t.setCheckbox(a,n,e),t.updateFieldValue(n,"checked",i),l.oncheck&&l.oncheck({elem:a,checked:i,data:n}))})},l.prototype.operate=function(r,d){var s=this,o=s.config,u=o.customName,e=r.children("."+b),h=e.children("."+g);e.children(".layui-tree-btnGroup").on("click",".layui-icon",function(e){layui.stope(e);var i,e=p(this).data("type"),n=r.children("."+N),t={data:d,type:e,elem:r};if("add"==e){n[0]||(o.showLine?(h.find("."+C).addClass("layui-tree-icon"),h.find("."+C).children(".layui-icon").addClass(v).removeClass("layui-icon-file")):h.find(".layui-tree-iconArrow").removeClass(m),r.append('<div class="layui-tree-pack"></div>'));var a,l=o.operate&&o.operate(t),c={};if(c[u.title]=o.text.defaultNodeName,c[u.id]=l,s.tree(r.children("."+N),[c]),o.showLine&&(n[0]?(n.hasClass(S)||n.addClass(S),r.find("."+N).each(function(){p(this).children("."+k).last().addClass(T)}),(n.children("."+k).last().prev().hasClass(T)?n.children("."+k).last().prev():n.children("."+k).last()).removeClass(T),!r.parent("."+N)[0]&&r.next()[0]&&n.children("."+k).last().removeClass(T)):(l=r.siblings("."+k),a=1,c=r.parent("."+N),layui.each(l,function(e,i){p(i).children("."+N)[0]||(a=0)}),(1==a?(l.children("."+N).addClass(L),l.children("."+N).children("."+k).removeClass(T),r.children("."+N).addClass(L),c.removeClass(S),c.children("."+k).last().children("."+N).children("."+k).last()):r.children("."+N).children("."+k)).addClass(T))),!o.showCheckbox)return;h.find('input[same="layuiTreeCheck"]')[0].checked&&(r.children("."+N).children("."+k).last().find('input[same="layuiTreeCheck"]')[0].checked=!0),s.renderForm("checkbox")}else"update"==e?(l=h.children("."+w).html(),h.children("."+w).html(""),h.append('<input type="text" class="layui-tree-editInput">'),h.children(".layui-tree-editInput").val(f.unescape(l)).focus(),i=function(e){var i=f.escape(e.val().trim())||o.text.defaultNodeName;e.remove(),h.children("."+w).html(i),t.data[u.title]=i,o.operate&&o.operate(t)},h.children(".layui-tree-editInput").blur(function(){i(p(this))}),h.children(".layui-tree-editInput").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),i(p(this)))})):y.confirm('\u786e\u8ba4\u5220\u9664\u8be5\u8282\u70b9 "<span style="color: #999;">'+(d[u.title]||"")+'</span>" \u5417\uff1f',function(e){var l,a,i;o.operate&&o.operate(t),t.status="remove",y.close(e),r.prev("."+k)[0]||r.next("."+k)[0]||r.parent("."+N)[0]?(r.siblings("."+k).children("."+b)[0]?(o.showCheckbox&&(l=function(e){var i,a,n,t;e.parents("."+k)[0]&&(i=e.siblings("."+k).children("."+b),a=(e=e.parent("."+N).prev()).find('input[same="layuiTreeCheck"]')[0],n=1,(t=0)==a.checked)&&(i.each(function(e,i){i=p(i).find('input[same="layuiTreeCheck"]')[0];0!=i.checked||i.disabled||(n=0),i.disabled||(t=1)}),1==n)&&1==t&&(a.checked=!0,s.renderForm("checkbox"),l(e.parent("."+k)))})(r),o.showLine&&(e=r.siblings("."+k),a=1,i=r.parent("."+N),layui.each(e,function(e,i){p(i).children("."+N)[0]||(a=0)}),1==a?(n[0]||(i.removeClass(S),e.children("."+N).addClass(L),e.children("."+N).children("."+k).removeClass(T)),(r.next()[0]?i.children("."+k).last():r.prev()).children("."+N).children("."+k).last().addClass(T),r.next()[0]||r.parents("."+k)[1]||r.parents("."+k).eq(0).next()[0]||r.prev("."+k).addClass(T)):!r.next()[0]&&r.hasClass(T)&&r.prev().addClass(T))):(e=r.parent("."+N).prev(),o.showLine?(e.find("."+C).removeClass("layui-tree-icon"),e.find("."+C).children(".layui-icon").removeClass(x).addClass("layui-icon-file"),(i=e.parents("."+N).eq(0)).addClass(S),i.children("."+k).each(function(){p(this).children("."+N).children("."+k).last().addClass(T)})):e.find(".layui-tree-iconArrow").addClass(m),r.parents("."+k).eq(0).removeClass(F),r.parent("."+N).remove()),r.remove()):(r.remove(),s.elem.append(s.elemNone))})})},l.prototype.events=function(){var i=this,t=i.config;i.elem.find(".layui-tree-checkedFirst");i.setChecked(i.checkids),i.elem.find(".layui-tree-search").on("keyup",function(){var e=p(this),a=e.val(),e=e.nextAll(),n=[];e.find("."+w).each(function(){var i,e=p(this).parents("."+b);-1!=p(this).html().indexOf(a)&&(n.push(p(this).parent()),(i=function(e){e.addClass("layui-tree-searchShow"),e.parent("."+N)[0]&&i(e.parent("."+N).parent("."+k))})(e.parent("."+k)))}),e.find("."+b).each(function(){var e=p(this).parent("."+k);e.hasClass("layui-tree-searchShow")||e.addClass(m)}),0==e.find(".layui-tree-searchShow").length&&i.elem.append(i.elemNone),t.onsearch&&t.onsearch({elem:n})}),i.elem.find(".layui-tree-search").on("keydown",function(){p(this).nextAll().find("."+b).each(function(){p(this).parent("."+k).removeClass("layui-tree-searchShow "+m)}),p(".layui-tree-emptyText")[0]&&p(".layui-tree-emptyText").remove()})},l.prototype.getChecked=function(){var t=this,e=t.config,l=e.customName,i=[],a=[],c=(t.elem.find(".layui-form-checked").each(function(){i.push(p(this).prev()[0].value)}),function(e,n){layui.each(e,function(e,a){layui.each(i,function(e,i){if(a[l.id]==i)return t.updateFieldValue(a,"checked",!0),delete(i=p.extend({},a))[l.children],n.push(i),a[l.children]&&(i[l.children]=[],c(a[l.children],i[l.children])),!0})})});return c(p.extend({},e.data),a),a},l.prototype.setChecked=function(l){this.config;this.elem.find("."+k).each(function(e,i){var a=p(this).data("id"),n=p(i).children("."+b).find('input[same="layuiTreeCheck"]'),t=n.next();if("number"==typeof l){if(a.toString()==l.toString())return n[0].checked||t.click(),!1}else"object"==typeof l&&layui.each(l,function(e,i){if(i.toString()==a.toString()&&!n[0].checked)return t.click(),!0})})},n.that={},n.config={},t.reload=function(e,i){e=n.that[e];return e.reload(i),n.call(e)},t.getChecked=function(e){return n.that[e].getChecked()},t.setChecked=function(e,i){return n.that[e].setChecked(i)},t.render=function(e){e=new l(e);return n.call(e)},e(a,t)});layui.define(["laytpl","form"],function(e){"use strict";var d=layui.$,n=layui.laytpl,t=layui.form,a="transfer",i={config:{},index:layui[a]?layui[a].index+1e4:0,set:function(e){var t=this;return t.config=d.extend({},t.config,e),t},on:function(e,t){return layui.onevent.call(this,a,e,t)}},l=function(){var t=this,e=t.config,a=e.id||t.index;return l.that[a]=t,{config:l.config[a]=e,reload:function(e){t.reload.call(t,e)},getData:function(){return t.getData.call(t)}}},s="layui-hide",u="layui-btn-disabled",c="layui-none",r="layui-transfer-box",h="layui-transfer-header",o="layui-transfer-search",f="layui-transfer-data",y=function(e){return['<div class="layui-transfer-box" data-index="'+(e=e||{}).index+'">','<div class="layui-transfer-header">','<input type="checkbox" name="'+e.checkAllName+'" lay-filter="layTransferCheckbox" lay-type="all" lay-skin="primary" title="{{= d.data.title['+e.index+"] || 'list"+(e.index+1)+"' }}\">","</div>","{{# if(d.data.showSearch){ }}",'<div class="layui-transfer-search">','<i class="layui-icon layui-icon-search"></i>','<input type="text" class="layui-input" placeholder="\u5173\u952e\u8bcd\u641c\u7d22">',"</div>","{{# } }}",'<ul class="layui-transfer-data"></ul>',"</div>"].join("")},p=['<div class="layui-transfer layui-form layui-border-box" lay-filter="LAY-transfer-{{= d.index }}">',y({index:0,checkAllName:"layTransferLeftCheckAll"}),'<div class="layui-transfer-active">','<button type="button" class="layui-btn layui-btn-sm layui-btn-primary layui-btn-disabled" data-index="0">','<i class="layui-icon layui-icon-next"></i>',"</button>",'<button type="button" class="layui-btn layui-btn-sm layui-btn-primary layui-btn-disabled" data-index="1">','<i class="layui-icon layui-icon-prev"></i>',"</button>","</div>",y({index:1,checkAllName:"layTransferRightCheckAll"}),"</div>"].join(""),v=function(e){var t=this;t.index=++i.index,t.config=d.extend({},t.config,i.config,e),t.render()};v.prototype.config={title:["\u5217\u8868\u4e00","\u5217\u8868\u4e8c"],width:200,height:360,data:[],value:[],showSearch:!1,id:"",text:{none:"\u65e0\u6570\u636e",searchNone:"\u65e0\u5339\u914d\u6570\u636e"}},v.prototype.reload=function(e){var t=this;t.config=d.extend({},t.config,e),t.render()},v.prototype.render=function(){var e=this,t=e.config,a=e.elem=d(n(p,{open:"{{",close:"}}"}).render({data:t,index:e.index})),i=t.elem=d(t.elem);i[0]&&(t.data=t.data||[],t.value=t.value||[],t.id="id"in t?t.id:elem.attr("id")||e.index,e.key=t.id,i.html(e.elem),e.layBox=e.elem.find("."+r),e.layHeader=e.elem.find("."+h),e.laySearch=e.elem.find("."+o),e.layData=a.find("."+f),e.layBtn=a.find(".layui-transfer-active .layui-btn"),e.layBox.css({width:t.width,height:t.height}),e.layData.css({height:(i=t.height-e.layHeader.outerHeight(),t.showSearch&&(i-=e.laySearch.outerHeight()),i-2)}),e.renderData(),e.events())},v.prototype.renderData=function(){var e=this,t=e.config,l=[{checkName:"layTransferLeftCheck",views:[]},{checkName:"layTransferRightCheck",views:[]}];e.parseData(function(a){var i=a.selected?1:0,n=["<li>",'<input type="checkbox" name="'+l[i].checkName+'" lay-skin="primary" lay-filter="layTransferCheckbox" title="'+a.title+'"'+(a.disabled?" disabled":"")+(a.checked?" checked":"")+' value="'+a.value+'">',"</li>"].join("");i?layui.each(t.value,function(e,t){t==a.value&&a.selected&&(l[i].views[e]=n)}):l[i].views.push(n),delete a.selected}),e.layData.eq(0).html(l[0].views.join("")),e.layData.eq(1).html(l[1].views.join("")),e.renderCheckBtn()},v.prototype.renderForm=function(e){t.render(e,"LAY-transfer-"+this.index)},v.prototype.renderCheckBtn=function(c){var r=this,o=r.config;c=c||{},r.layBox.each(function(e){var t=d(this),a=t.find("."+f),t=t.find("."+h).find('input[type="checkbox"]'),i=a.find('input[type="checkbox"]'),n=0,l=!1;i.each(function(){var e=d(this).data("hide");(this.checked||this.disabled||e)&&n++,this.checked&&!e&&(l=!0)}),t.prop("checked",l&&n===i.length),r.layBtn.eq(e)[l?"removeClass":"addClass"](u),c.stopNone||(i=a.children("li:not(."+s+")").length,r.noneView(a,i?"":o.text.none))}),r.renderForm("checkbox")},v.prototype.noneView=function(e,t){var a=d('<p class="layui-none">'+(t||"")+"</p>");e.find("."+c)[0]&&e.find("."+c).remove(),t.replace(/\s/g,"")&&e.append(a)},v.prototype.setValue=function(){var e=this.config,t=[];return this.layBox.eq(1).find("."+f+' input[type="checkbox"]').each(function(){d(this).data("hide")||t.push(this.value)}),e.value=t,this},v.prototype.parseData=function(t){var i=this.config,n=[];return layui.each(i.data,function(e,a){a=("function"==typeof i.parseData?i.parseData(a):a)||a,n.push(a=d.extend({},a)),layui.each(i.value,function(e,t){t==a.value&&(a.selected=!0)}),t&&t(a)}),i.data=n,this},v.prototype.getData=function(e){var t=this.config,i=[];return this.setValue(),layui.each(e||t.value,function(e,a){layui.each(t.data,function(e,t){delete t.selected,a==t.value&&i.push(t)})}),i},v.prototype.transfer=function(e,t){var a,i=this,n=i.config,l=i.layBox.eq(e),c=[],t=(t?((a=(t=t).find('input[type="checkbox"]'))[0].checked=!1,l.siblings("."+r).find("."+f).append(t.clone()),t.remove(),c.push(a[0].value),i.setValue()):l.each(function(e){d(this).find("."+f).children("li").each(function(){var e=d(this),t=e.find('input[type="checkbox"]'),a=t.data("hide");t[0].checked&&!a&&(t[0].checked=!1,l.siblings("."+r).find("."+f).append(e.clone()),e.remove(),c.push(t[0].value)),i.setValue()})}),i.renderCheckBtn(),l.siblings("."+r).find("."+o+" input"));""!==t.val()&&t.trigger("keyup"),n.onchange&&n.onchange(i.getData(c),e)},v.prototype.events=function(){var n=this,l=n.config;n.elem.on("click",'input[lay-filter="layTransferCheckbox"]+',function(){var e=d(this).prev(),t=e[0].checked,a=e.parents("."+r).eq(0).find("."+f);e[0].disabled||("all"===e.attr("lay-type")&&a.find('input[type="checkbox"]').each(function(){this.disabled||(this.checked=t)}),setTimeout(function(){n.renderCheckBtn({stopNone:!0})},0))}),n.elem.on("dblclick","."+f+">li",function(e){var t=d(this),a=t.children('input[type="checkbox"]'),i=t.parent().parent().data("index");a[0].disabled||!1!==("function"==typeof l.dblclick?l.dblclick({elem:t,data:n.getData([a[0].value])[0],index:i}):null)&&n.transfer(i,t)}),n.layBtn.on("click",function(){var e=d(this),t=e.data("index");e.hasClass(u)||n.transfer(t)}),n.laySearch.find("input").on("keyup",function(){var i=this.value,e=d(this).parents("."+o).eq(0).siblings("."+f),t=e.children("li"),t=(t.each(function(){var e=d(this),t=e.find('input[type="checkbox"]'),a=t[0].title,a=("cs"!==l.showSearch&&(a=a.toLowerCase(),i=i.toLowerCase()),-1!==a.indexOf(i));e[a?"removeClass":"addClass"](s),t.data("hide",!a)}),n.renderCheckBtn(),t.length===e.children("li."+s).length);n.noneView(e,t?l.text.searchNone:"")})},l.that={},l.config={},i.reload=function(e,t){e=l.that[e];return e.reload(t),l.call(e)},i.getData=function(e){return l.that[e].getData()},i.render=function(e){e=new v(e);return l.call(e)},e(a,i)});layui.define(["jquery","lay"],function(e){"use strict";var o=layui.$,l=layui.lay,t=(layui.hint(),layui.device(),{config:{},set:function(e){var n=this;return n.config=o.extend({},n.config,e),n},on:function(e,n){return layui.onevent.call(this,r,e,n)}}),r="carousel",s="layui-this",u="layui-carousel-left",c="layui-carousel-right",m="layui-carousel-prev",h="layui-carousel-next",a="layui-carousel-arrow",d="layui-carousel-ind",n=function(e){var n=this;n.config=o.extend({},n.config,t.config,e),n.render()};n.prototype.config={width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},n.prototype.render=function(){var e=this,n=e.config,i=o(n.elem);if(1<i.length)return layui.each(i,function(){t.render(o.extend({},n,{elem:this}))}),e;o.extend(n,l.options(i[0])),n.elem=o(n.elem),n.elem[0]&&(e.elemItem=n.elem.find(">*[carousel-item]>*"),n.index<0&&(n.index=0),n.index>=e.elemItem.length&&(n.index=e.elemItem.length-1),n.interval<800&&(n.interval=800),n.full?n.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):n.elem.css({width:n.width,height:n.height}),n.elem.attr("lay-anim",n.anim),e.elemItem.eq(n.index).addClass(s),e.indicator(),e.arrow(),e.autoplay(),1<e.elemItem.length)&&e.events()},n.prototype.reload=function(e){var n=this;clearInterval(n.timer),n.config=o.extend({},n.config,e),n.render()},n.prototype.prevIndex=function(){var e=this.config.index-1;return e=e<0?this.elemItem.length-1:e},n.prototype.nextIndex=function(){var e=this.config.index+1;return e=e>=this.elemItem.length?0:e},n.prototype.addIndex=function(e){var n=this.config;n.index=n.index+(e=e||1),n.index>=this.elemItem.length&&(n.index=0)},n.prototype.subIndex=function(e){var n=this.config;n.index=n.index-(e=e||1),n.index<0&&(n.index=this.elemItem.length-1)},n.prototype.autoplay=function(){var e=this,n=e.config,i=e.elemItem.length;n.autoplay&&(clearInterval(e.timer),1<i)&&(e.timer=setInterval(function(){e.slide()},n.interval))},n.prototype.arrow=function(){var n=this,e=n.config,i=n.elemItem.length,t=o(['<button type="button" class="layui-icon '+("updown"===e.anim?"layui-icon-up":"layui-icon-left")+" "+a+'" lay-type="sub"></button>','<button type="button" class="layui-icon '+("updown"===e.anim?"layui-icon-down":"layui-icon-right")+" "+a+'" lay-type="add"></button>'].join(""));e.elem.attr("lay-arrow",e.arrow),e.elem.find("."+a)[0]&&e.elem.find("."+a).remove(),1<i?e.elem.append(t):t.remove(),t.on("click",function(){var e=o(this).attr("lay-type");n.slide(e)})},n.prototype["goto"]=function(e){var n=this,i=n.config;e>i.index?n.slide("add",e-i.index):e<i.index&&n.slide("sub",i.index-e)},n.prototype.indicator=function(){var n,e=this,i=e.config,t=e.elemItem.length,a=e.elemInd=o(['<div class="'+d+'"><ul>',(n=[],layui.each(e.elemItem,function(e){n.push("<li"+(i.index===e?' class="layui-this"':"")+"></li>")}),n.join("")),"</ul></div>"].join(""));i.elem.attr("lay-indicator",i.indicator),i.elem.find("."+d)[0]&&i.elem.find("."+d).remove(),1<t?i.elem.append(a):a.remove(),"updown"===i.anim&&a.css("margin-top",-a.height()/2),a.find("li").on("hover"===i.trigger?"mouseover":i.trigger,function(){e["goto"](o(this).index())})},n.prototype.slide=function(e,n){var i=this,t=i.elemItem,a=t.length,o=i.config,l=o.index,d=o.elem.attr("lay-filter");i.haveSlide||a<=1||("sub"===e?(i.subIndex(n),t.eq(o.index).addClass(m),setTimeout(function(){t.eq(l).addClass(c),t.eq(o.index).addClass(c)},50)):(i.addIndex(n),t.eq(o.index).addClass(h),setTimeout(function(){t.eq(l).addClass(u),t.eq(o.index).addClass(u)},50)),setTimeout(function(){t.removeClass(s+" "+m+" "+h+" "+u+" "+c),t.eq(o.index).addClass(s),i.haveSlide=!1},350),i.elemInd.find("li").eq(o.index).addClass(s).siblings().removeClass(s),i.haveSlide=!0,a={index:o.index,prevIndex:l,item:t.eq(o.index)},"function"==typeof o.change&&o.change(a),layui.event.call(this,r,"change("+d+")",a))},n.prototype.events=function(){var t,a,o=this,e=o.config;e.elem.data("haveEvents")||(e.elem.on("mouseenter touchstart",function(){"always"!==o.config.autoplay&&clearInterval(o.timer)}).on("mouseleave touchend",function(){"always"!==o.config.autoplay&&o.autoplay()}),t=e.elem,a="updown"===e.anim,l.touchSwipe(t,{onTouchEnd:function(e,n){var i=Date.now()-n.timeStart,n=a?n.distanceY:n.distanceX;(.25<Math.abs(n/i)||Math.abs(n)>t[a?"height":"width"]()/3)&&o.slide(0<n?"":"sub")}}),e.elem.data("haveEvents",!0))},t.render=function(e){return new n(e)},e(r,t)});layui.define(["jquery","lay"],function(e){"use strict";var u=layui.jquery,r=layui.lay,c={config:{},index:layui.rate?layui.rate.index+1e4:0,set:function(e){var a=this;return a.config=u.extend({},a.config,e),a},on:function(e,a){return layui.onevent.call(this,l,e,a)}},l="rate",h="layui-icon-rate",f="layui-icon-rate-solid",o="layui-icon-rate-half",s="layui-icon-rate-solid layui-icon-rate-half",v="layui-icon-rate layui-icon-rate-half",a=function(e){var a=this;a.index=++c.index,a.config=u.extend({},a.config,c.config,e),a.render()};a.prototype.config={length:5,text:!1,readonly:!1,half:!1,value:0,theme:""},a.prototype.render=function(){var e=this,a=e.config,l=u(a.elem);if(1<l.length)return layui.each(l,function(){c.render(u.extend({},a,{elem:this}))}),e;u.extend(a,r.options(l[0]));for(var t=a.theme?'style="color: '+a.theme+';"':"",i=(a.elem=u(a.elem),a.value>a.length&&(a.value=a.length),parseInt(a.value)===a.value||a.half||(a.value=Math.ceil(a.value)-a.value<.5?Math.ceil(a.value):Math.floor(a.value)),'<ul class="layui-rate" '+(a.readonly?"readonly":"")+">"),n=1;n<=a.length;n++){var o='<li class="layui-inline"><i class="layui-icon '+(n>Math.floor(a.value)?h:f)+'" '+t+"></i></li>";a.half&&parseInt(a.value)!==a.value&&n==Math.ceil(a.value)?i=i+'<li><i class="layui-icon layui-icon-rate-half" '+t+"></i></li>":i+=o}i+="</ul>"+(a.text?'<span class="layui-inline">'+a.value+"\u661f":"")+"</span>";var l=a.elem,s=l.next(".layui-rate");s[0]&&s.remove(),e.elemTemp=u(i),a.span=e.elemTemp.next("span"),a.setText&&a.setText(a.value),l.html(e.elemTemp),l.addClass("layui-inline"),a.readonly||e.action()},a.prototype.setvalue=function(e){this.config.value=e,this.render()},a.prototype.action=function(){var n=this.config,t=this.elemTemp,i=t.find("i").width(),l=t.children("li");l.each(function(e){var a=e+1,l=u(this);l.on("click",function(e){n.value=a,n.half&&e.pageX-u(this).offset().left<=i/2&&(n.value=n.value-.5),n.text&&t.next("span").text(n.value+"\u661f"),n.choose&&n.choose(n.value),n.setText&&n.setText(n.value)}),l.on("mousemove",function(e){t.find("i").each(function(){u(this).addClass(h).removeClass(s)}),t.find("i:lt("+a+")").each(function(){u(this).addClass(f).removeClass(v)}),n.half&&e.pageX-u(this).offset().left<=i/2&&l.children("i").addClass(o).removeClass(f)}),l.on("mouseleave",function(){t.find("i").each(function(){u(this).addClass(h).removeClass(s)}),t.find("i:lt("+Math.floor(n.value)+")").each(function(){u(this).addClass(f).removeClass(v)}),n.half&&parseInt(n.value)!==n.value&&t.children("li:eq("+Math.floor(n.value)+")").children("i").addClass(o).removeClass("layui-icon-rate-solid layui-icon-rate")})}),r.touchSwipe(t,{onTouchMove:function(e,a){var i;Date.now()-a.timeStart<=200||(a=e.touches[0].pageX,e=t.width()/n.length,a=(a-t.offset().left)/e,(i=(i=(e=a%1)<=.5&&n.half?.5+(a-e):Math.ceil(a))>n.length?n.length:i)<0&&(i=0),l.each(function(e){var a=u(this).children("i"),l=Math.ceil(i)-e==1,t=Math.ceil(i)>e,e=i-e==.5;t?(a.addClass(f).removeClass(v),n.half&&e&&a.addClass(o).removeClass(f)):a.addClass(h).removeClass(s),a.toggleClass("layui-rate-hover",l)}),n.value=i,n.text&&t.next("span").text(n.value+"\u661f"),n.setText&&n.setText(n.value))},onTouchEnd:function(e,a){Date.now()-a.timeStart<=200||(t.find("i").removeClass("layui-rate-hover"),n.choose&&n.choose(n.value),n.setText&&n.setText(n.value))}})},a.prototype.events=function(){},c.render=function(e){e=new a(e);return function(){var a=this;return{setvalue:function(e){a.setvalue.call(a,e)},config:a.config}}.call(e)},e(l,c)});layui.define("jquery",function(o){"use strict";var w=layui.$,l=function(o){};l.prototype.load=function(o){var i,n,r,l,c,m,e,t,a,f,s,u,p,d,y,g=this,h=0,v=w((o=o||{}).elem);if(v[0])return c=w(o.scrollElem||document),m="mb"in o?o.mb:50,e=!("isAuto"in o)||o.isAuto,t=o.moreText||"\u52a0\u8f7d\u66f4\u591a",a=o.end||"\u6ca1\u6709\u66f4\u591a\u4e86",f="top"===(o.direction||"bottom"),g._cleanup(v,c),s=o.scrollElem&&o.scrollElem!==document,p=w('<div class="layui-flow-more"><a href="javascript:;">'+(u="<cite>"+t+"</cite>")+"</a></div>"),v.find(".layui-flow-more")[0]||v[f?"prepend":"append"](p),d=function(o,l){var e=s?c.prop("scrollHeight"):document.documentElement.scrollHeight,t=c.scrollTop();o=w(o),p[f?"after":"before"](o),(l=0==l||null)?p.html(a):p.find("a").html(u),n=l,i=null,r&&r(),f&&(o=s?c.prop("scrollHeight"):document.documentElement.scrollHeight,1===h?c.scrollTop(o):1<h&&c.scrollTop(t+(o-e)))},(y=function(){i=!0,p.find("a").html('<i class="layui-anim layui-anim-rotate layui-anim-loop layui-icon ">&#xe63e;</i>'),"function"==typeof o.done&&o.done(++h,d)})(),p.find("a").on("click.flow",function(){w(this);n||i||y()}),o.isLazyimg&&(r=g.lazyimg({elem:o.elem+" img",scrollElem:o.scrollElem,direction:o.direction})),e&&c.on("scroll.flow",function(){var e=w(this),t=e.scrollTop();l&&clearTimeout(l),!n&&v.width()&&(l=setTimeout(function(){var o=(s?e:w(window)).height(),l=s?e.prop("scrollHeight"):document.documentElement.scrollHeight;(f?t<=m:l-t-o<=m)&&!i&&y()},100))}),g},l.prototype.lazyimg=function(o){var l,m=this,a=0,f=w((o=o||{}).scrollElem||document),s=o.elem||"img",n="top"===(o.direction||"bottom"),u=o.scrollElem&&o.scrollElem!==document,p=function(l,o){var e,t=f.scrollTop(),o=t+o,i=u?l.offset().top-f.offset().top+t:l.offset().top;(n?i+l.height():i)>=t&&i<=o&&l.attr("lay-src")&&(e=l.attr("lay-src"),layui.img(e,function(){var o=m.lazyimg.elem.eq(a);l.attr("src",e).removeAttr("lay-src"),o[0]&&r(o),a++},function(){m.lazyimg.elem.eq(a);l.removeAttr("lay-src")}))},r=function(o,l){var e=(u?l||f:w(window)).height(),t=f.scrollTop(),i=t+e;if(m.lazyimg.elem=w(s),o)p(o,e);else for(var n=0;n<m.lazyimg.elem.length;n++){var r=m.lazyimg.elem.eq(n),c=u?r.offset().top-f.offset().top+t:r.offset().top;if(p(r,e),a=n,i<c)break}};return r(),f.on("scroll.lazyimg",function(){var o=w(this);l&&clearTimeout(l),l=setTimeout(function(){r(null,o)},50)}),r},l.prototype._cleanup=function(o,l){l.off("scroll.flow").off("scroll.lazyimg"),o.find(".layui-flow-more").find("a").off("click.flow")},o("flow",new l)});layui.define(["lay","util","element","form"],function(e){"use strict";var x=layui.$,D=layui.util,S=layui.element,I=layui.form,N=layui.layer,A=(layui.hint(),{ELEM_VIEW:"layui-code-view",ELEM_TAB:"layui-tab",ELEM_HEADER:"layui-code-header",ELEM_FULL:"layui-code-full",ELEM_PREVIEW:"layui-code-preview",ELEM_ITEM:"layui-code-item",ELEM_SHOW:"layui-show",ELEM_LINE:"layui-code-line",ELEM_LINE_NUM:"layui-code-line-number",ELEM_LN_MODE:"layui-code-ln-mode",CDDE_DATA_CLASS:"LayuiCodeDataClass",LINE_RAW_WIDTH:45}),T={elem:"",about:"",ln:!0,header:!1,encode:!0,copy:!0,text:{code:D.escape("</>"),preview:"Preview"},wordWrap:!0,lang:"text",highlighter:!1,langMarker:!1},W=layui.code?layui.code.index+1e4:0,R=function(e){return String(e).replace(/\s+$/,"").replace(/^\n|\n$/,"")};e("code",function(l,e){var o,i,t,a,n,d,c,s,r,u,y,p,E,f,h,v,m,L,_,M,C,g={config:l=x.extend(!0,{},T,l),reload:function(e){layui.code(this.updateOptions(e))},updateOptions:function(e){return delete(e=e||{}).elem,x.extend(!0,l,e)},reloadCode:function(e){layui.code(this.updateOptions(e),"reloadCode")}},w=x(l.elem);return 1<w.length?layui.each(l.obverse?w:w.get().reverse(),function(){layui.code(x.extend({},l,{elem:this}),e)}):(o=l.elem=x(l.elem))[0]&&(x.extend(!0,l,lay.options(o[0]),(i={},layui.each(["title","height","encode","skin","about"],function(e,t){var a=o.attr("lay-"+t);"string"==typeof a&&(i[t]=a)}),i)),l.encode=(l.encode||l.preview)&&!l.codeRender,l.code=l.code||(t=[],o.children("textarea").each(function(){t.push(R(this.value))}),0===t.length&&t.push(R(o.html())),t.join("")),w=function(e){"function"==typeof l.codeRender&&(e=l.codeRender(String(e),l));var t=String(e).split(/\r?\n/g);return{lines:t,html:e=x.map(t,function(e,t){return['<div class="'+A.ELEM_LINE+'">',l.ln?['<div class="'+A.ELEM_LINE_NUM+'">',D.digit(t+1)+".","</div>"].join(""):"",'<div class="layui-code-line-content">',e||" ","</div>","</div>"].join("")})}},a=l.code,n=function(e){return"function"==typeof l.codeParse?l.codeParse(e,l):e},"reloadCode"===e?o.children(".layui-code-wrap").html(w(n(a)).html):(d=layui.code.index=++W,o.attr("lay-code-index",d),(M=A.CDDE_DATA_CLASS in o.data())&&o.attr("class",o.data(A.CDDE_DATA_CLASS)||""),M||o.data(A.CDDE_DATA_CLASS,o.attr("class")),c={copy:{className:"file-b",title:["\u590d\u5236\u4ee3\u7801"],event:function(e){var t=D.unescape(n(l.code)),a="function"==typeof l.onCopy;lay.clipboard.writeText({text:t,done:function(){if(a&&!1===l.onCopy(t,!0))return;N.msg("\u5df2\u590d\u5236",{icon:1})},error:function(){if(a&&!1===l.onCopy(t,!1))return;N.msg("\u590d\u5236\u5931\u8d25",{icon:2})}})}}},function b(){var e=o.parent("."+A.ELEM_PREVIEW),t=e.children("."+A.ELEM_TAB),a=e.children("."+A.ELEM_ITEM+"-preview");return t.remove(),a.remove(),e[0]&&o.unwrap(),b}(),l.preview&&(M="LAY-CODE-DF-"+d,f=l.layout||["code","preview"],s="iframe"===l.preview,E=x('<div class="'+A.ELEM_PREVIEW+'">'),C=x('<div class="layui-tab layui-tab-brief">'),r=x('<div class="layui-tab-title">'),_=x('<div class="'+[A.ELEM_ITEM,A.ELEM_ITEM+"-preview","layui-border"].join(" ")+'">'),u=x('<div class="layui-code-tools"></div>'),l.id&&E.attr("id",l.id),E.addClass(l.className),C.attr("lay-filter",M),layui.each(f,function(e,t){var a=x('<li lay-id="'+t+'">');0===e&&a.addClass("layui-this"),a.html(l.text[t]),r.append(a)}),x.extend(c,{full:{className:"screen-full",title:["\u6700\u5927\u5316\u663e\u793a","\u8fd8\u539f\u663e\u793a"],event:function(e){var e=e.elem,t=e.closest("."+A.ELEM_PREVIEW),a="layui-icon-"+this.className,i="layui-icon-screen-restore",l=this.title,o=x("html,body"),n="layui-scrollbar-hide";e.hasClass(a)?(t.addClass(A.ELEM_FULL),e.removeClass(a).addClass(i),e.attr("title",l[1]),o.addClass(n)):(t.removeClass(A.ELEM_FULL),e.removeClass(i).addClass(a),e.attr("title",l[0]),o.removeClass(n))}},window:{className:"release",title:["\u5728\u65b0\u7a97\u53e3\u9884\u89c8"],event:function(e){D.openWin({content:n(l.code)})}}}),l.copy&&("array"===layui.type(l.tools)?-1===l.tools.indexOf("copy")&&l.tools.unshift("copy"):l.tools=["copy"]),u.on("click",">i",function(){var e=x(this),t=e.data("type"),e={elem:e,type:t,options:l,rawCode:l.code,finalCode:D.unescape(n(l.code))};c[t]&&"function"==typeof c[t].event&&c[t].event(e),"function"==typeof l.toolsEvent&&l.toolsEvent(e)}),l.addTools&&l.tools&&(l.tools=[].concat(l.tools,l.addTools)),layui.each(l.tools,function(e,t){var a="object"==typeof t,i=a?t:c[t]||{className:t,title:[t]},l=i.className||i.type,o=i.title||[""],a=a?i.type||l:t;a&&(c[a]||((t={})[a]=i,x.extend(c,t)),u.append('<i class="layui-icon layui-icon-'+l+'" data-type="'+a+'" title="'+o[0]+'"></i>'))}),o.addClass(A.ELEM_ITEM).wrap(E),C.append(r),l.tools&&C.append(u),o.before(C),s&&_.html('<iframe allowtransparency="true" frameborder="0"></iframe>'),y=function(e){var t=e.children("iframe")[0];s&&t?t.srcdoc=n(l.code):e.html(l.code),setTimeout(function(){"function"==typeof l.done&&l.done({container:e,options:l,render:function(){I.render(e.find(".layui-form")),S.render()}})},3)},"preview"===f[0]?(_.addClass(A.ELEM_SHOW),o.before(_),y(_)):o.addClass(A.ELEM_SHOW).after(_),l.previewStyle=[l.style,l.previewStyle].join(""),_.attr("style",l.previewStyle),S.on("tab("+M+")",function(e){var t=x(this),a=x(e.elem).closest("."+A.ELEM_PREVIEW).find("."+A.ELEM_ITEM),e=a.eq(e.index);a.removeClass(A.ELEM_SHOW),e.addClass(A.ELEM_SHOW),"preview"===t.attr("lay-id")&&y(e),L()})),p=x('<code class="layui-code-wrap"></code>'),o.addClass((E=["layui-code-view layui-border-box"],l.wordWrap||E.push("layui-code-nowrap"),E.join(" "))),(C=l.theme||l.skin)&&(o.removeClass("layui-code-theme-dark layui-code-theme-light"),o.addClass("layui-code-theme-"+C)),l.highlighter&&o.addClass([l.highlighter,"language-"+l.lang,"layui-code-hl"].join(" ")),f=w(l.encode?D.escape(n(a)):a),h=f.lines,o.html(p.html(f.html)),l.ln&&o.append('<div class="layui-code-ln-side"></div>'),l.height&&p.css("max-height",l.height),l.codeStyle=[l.style,l.codeStyle].join(""),l.codeStyle&&p.attr("style",function(e,t){return(t||"")+l.codeStyle}),v=[{selector:">.layui-code-wrap>.layui-code-line{}",setValue:function(e,t){e.style["padding-left"]=t+"px"}},{selector:">.layui-code-wrap>.layui-code-line>.layui-code-line-number{}",setValue:function(e,t){e.style.width=t+"px"}},{selector:">.layui-code-ln-side{}",setValue:function(e,t){e.style.width=t+"px"}}],m=lay.style({target:o[0],id:"DF-code-"+d,text:x.map(x.map(v,function(e){return e.selector}),function(e,t){return['.layui-code-view[lay-code-index="'+d+'"]',e].join(" ")}).join("")}),L=function b(){var e,i;return l.ln&&(e=Math.floor(h.length/100),i=p.children("."+A.ELEM_LINE).last().children("."+A.ELEM_LINE_NUM).outerWidth(),o.addClass(A.ELEM_LN_MODE),e)&&A.LINE_RAW_WIDTH<i&&lay.getStyleRules(m,function(e,t){try{v[t].setValue(e,i)}catch(a){}}),b}(),l.header&&((_=x('<div class="'+A.ELEM_HEADER+'"></div>')).html(l.title||l.text.code),o.prepend(_)),M=x('<div class="layui-code-fixbar"></div>'),l.copy&&!l.preview&&((C=x(['<span class="layui-code-copy">','<i class="layui-icon layui-icon-file-b" title="\u590d\u5236"></i>',"</span>"].join(""))).on("click",function(){c.copy.event()}),M.append(C)),l.langMarker&&M.append('<span class="layui-code-lang-marker">'+l.lang+"</span>"),l.about&&M.append(l.about),o.append(M),l.preview||setTimeout(function(){"function"==typeof l.done&&l.done({})},3),l.elem.length===1+d&&"function"==typeof l.allDone&&l.allDone())),g})}),layui["layui.all"]||layui.addcss("modules/code.css?v=6","skincodecss");
\ No newline at end of file
diff --git a/public/static/assets/mbui/css/mbui.css b/public/static/assets/mbui/css/mbui.css
new file mode 100644
index 0000000000000000000000000000000000000000..70e23b53e58f267fa99fc83350ba3e0e108f9c52
--- /dev/null
+++ b/public/static/assets/mbui/css/mbui.css
@@ -0,0 +1,1903 @@
+@import url("../../icon/iconfont.css");
+:root {
+  --color-gray-50: #f8fafc;
+  --color-gray-100: #f0f1f0;
+  --color-gray-200: #eeeeee;
+  --color-gray-300: #cccccc;
+  --color-gray-400: #9B9B9B;
+  --color-gray-500: #666666;
+  --color-gray-600: #475569;
+  --color-gray-700: #334155;
+  --color-gray-800: #1e293b;
+  --color-gray-900: #0f172a;
+  --color-gray-950: #020617;
+  
+  --color-blue-50: #eff6ff;
+  --color-blue-100: #dbeafe;
+  --color-blue-200: #bfdbfe;
+  --color-blue-300: #93c5fd;
+  --color-blue-400: #60a5fa;
+  --color-blue-500: #3b82f6;
+  --color-blue-600: #2563eb;
+  --color-blue-700: #1d4ed8;
+  --color-blue-800: #1e40af;
+  --color-blue-900: #1e3a8a;
+  --color-blue-950: #172554;
+  
+  --color-cyan-50: #ecfeff;
+  --color-cyan-100: #cffafe;
+  --color-cyan-200: #a5f3fc;
+  --color-cyan-300: #67e8f9;
+  --color-cyan-400: #22d3ee;
+  --color-cyan-500: #06b6d4;
+  --color-cyan-600: #0891b2;
+  --color-cyan-700: #0e7490;
+  --color-cyan-800: #155e75;
+  --color-cyan-900: #164e63;
+  --color-cyan-950: #083344;
+  
+  --color-green-50: #f0fdf4;
+  --color-green-100: #dcfce7;
+  --color-green-200: #bbf7d0;
+  --color-green-300: #86efac;
+  --color-green-400: #4ade80;
+  --color-green-500: #22c55e;
+  --color-green-600: #16a34a;
+  --color-green-700: #15803d;
+  --color-green-800: #166534;
+  --color-green-900: #14532d;
+  --color-green-950: #052e16;
+  
+  --color-lime-50: #f7fee7;
+  --color-lime-100: #ecfccb;
+  --color-lime-200: #d9f99d;
+  --color-lime-300: #bef264;
+  --color-lime-400: #a3e635;
+  --color-lime-500: #84cc16;
+  --color-lime-600: #65a30d;
+  --color-lime-700: #4d7c0f;
+  --color-lime-800: #3f6212;
+  --color-lime-900: #365314;
+  --color-lime-950: #1a2e05;
+  
+  --color-yellow-50: #fffbeb;
+  --color-yellow-100: #fef3c7;
+  --color-yellow-200: #fde68a;
+  --color-yellow-300: #fcd34d;
+  --color-yellow-400: #fbbf24;
+  --color-yellow-500: #f59e0b;
+  --color-yellow-600: #d97706;
+  --color-yellow-700: #b45309;
+  --color-yellow-800: #92400e;
+  --color-yellow-900: #78350f;
+  --color-yellow-950: #451a03;
+  
+  --color-orange-50: #fff7ed;
+  --color-orange-100: #ffedd5;
+  --color-orange-200: #fed7aa;
+  --color-orange-300: #fdba74;
+  --color-orange-400: #fb923c;
+  --color-orange-500: #f97316;
+  --color-orange-600: #ea580c;
+  --color-orange-700: #c2410c;
+  --color-orange-800: #9a3412;
+  --color-orange-900: #7c2d12;
+  --color-orange-950: #431407;
+  
+  --color-red-50: #fef2f2;
+  --color-red-100: #fee2e2;
+  --color-red-200: #fecaca;
+  --color-red-300: #fca5a5;
+  --color-red-400: #f87171;
+  --color-red-500: #ef4444;
+  --color-red-600: #dc2626;
+  --color-red-700: #b91c1c;
+  --color-red-800: #991b1b;
+  --color-red-900: #7f1d1d;
+  --color-red-950: #450a0a;
+  
+  --color-pink-50: #fdf2f8;
+  --color-pink-100: #fce7f3;
+  --color-pink-200: #fbcfe8;
+  --color-pink-300: #f9a8d4;
+  --color-pink-400: #f472b6;
+  --color-pink-500: #ec4899;
+  --color-pink-600: #db2777;
+  --color-pink-700: #be185d;
+  --color-pink-800: #9d174d;
+  --color-pink-900: #831843;
+  --color-pink-950: #500724;
+  
+  --color-purple-50: #faf5ff;
+  --color-purple-100: #f3e8ff;
+  --color-purple-200: #e9d5ff;
+  --color-purple-300: #d8b4fe;
+  --color-purple-400: #c084fc;
+  --color-purple-500: #a855f7;
+  --color-purple-600: #9333ea;
+  --color-purple-700: #7e22ce;
+  --color-purple-800: #6b21a8;
+  --color-purple-900: #581c87;
+  --color-purple-950: #3b0764;
+  
+  --color-black: #000;
+  --color-white: #fff;
+  --color-body: #F2F3F5;
+  --black-shadow: rgba(0,0,0,.72);
+  --white-shadow: rgba(255,255,255,.72);
+  
+  --xs: 2px;
+  --sm: 4px;
+  --md: 6px;
+  --lg: 8px;
+  --xl: 10px;
+  --2xl: 12px;
+  --3xl: 16px;
+  --4xl: 20px;
+  --5xl: 24px;
+  --6xl: 30px;
+  
+  --shadow: 0 1px 4px 0 rgba(0, 0, 0, .15), 0 1px 2px -1px rgba(0, 0, 0, .1);
+  --shadow-md: 0 2px 6px -1px rgba(0, 0, 0, .2), 0 1px 4px -2px rgba(0, 0, 0, .15);
+  --shadow-lg: 0 4px 12px -4px rgba(0, 0, 0, .2), 0 4px 12px -4px rgba(0, 0, 0, .15);
+  --shadow-xl: 0 6px 20px -6px rgba(0, 0, 0, .2), 0 8px 20px -6px rgba(0, 0, 0, .15);
+  --shadow-2xl: 0 10px 30px -10px rgba(0, 0, 0, .4), 0 8px 20px -10px rgba(0, 0, 0, .3);
+}
+/*light dark*/
+@media (prefers-color-scheme:dark) {
+:root {
+  --color-gray-50: #020617;
+  --color-gray-100: #0f172a;
+  --color-gray-200: #1e293b;
+  --color-gray-300: #334155;
+  --color-gray-400: #475569;
+  --color-gray-500: #888888;
+  --color-gray-600: #9B9B9B;
+  --color-gray-700: #aaaaaa;
+  --color-gray-800: #dddddd;
+  --color-gray-900: #cccccc;
+  --color-gray-950: #f0f0f0;
+  
+  --color-blue-50: #172554;
+  --color-blue-100: #1e3a8a;
+  --color-blue-200: #1e40af;
+  --color-blue-300: #1d4ed8;
+  --color-blue-400: #2563eb;
+  --color-blue-500: #3b82f6;
+  --color-blue-600: #60a5fa;
+  --color-blue-700: #93c5fd;
+  --color-blue-800: #bfdbfe;
+  --color-blue-900: #dbeafe;
+  --color-blue-950: #eff6ff;
+  
+  --color-cyan-950: #ecfeff;
+  --color-cyan-900: #cffafe;
+  --color-cyan-800: #a5f3fc;
+  --color-cyan-700: #67e8f9;
+  --color-cyan-600: #22d3ee;
+  --color-cyan-500: #06b6d4;
+  --color-cyan-400: #0891b2;
+  --color-cyan-300: #0e7490;
+  --color-cyan-200: #155e75;
+  --color-cyan-100: #164e63;
+  --color-cyan-50: #083344;
+  
+  --color-green-50: #052e16;
+  --color-green-100: #14532d;
+  --color-green-200: #166534;
+  --color-green-300: #15803d;
+  --color-green-400: #16a34a;
+  --color-green-500: #22c55e;
+  --color-green-600: #4ade80;
+  --color-green-700: #86efac;
+  --color-green-800: #bbf7d0;
+  --color-green-900: #dcfce7;
+  --color-green-950: #f0fdf4; 
+
+  --color-lime-950: #f7fee7;
+  --color-lime-900: #ecfccb;
+  --color-lime-800: #d9f99d;
+  --color-lime-700: #bef264;
+  --color-lime-600: #a3e635;
+  --color-lime-500: #84cc16;
+  --color-lime-400: #65a30d;
+  --color-lime-300: #4d7c0f;
+  --color-lime-200: #3f6212;
+  --color-lime-100: #365314;
+  --color-lime-50: #1a2e05;
+  
+  --color-yellow-50: #451a03;
+  --color-yellow-100: #78350f;
+  --color-yellow-200: #92400e;
+  --color-yellow-300: #b45309;
+  --color-yellow-400: #d97706;
+  --color-yellow-500: #f59e0b;
+  --color-yellow-600: #fbbf24;
+  --color-yellow-700: #fcd34d;
+  --color-yellow-800: #fde68a;
+  --color-yellow-900: #fef3c7;
+  --color-yellow-950: #fffbeb;
+  
+  --color-orange-950: #fff7ed;
+  --color-orange-900: #ffedd5;
+  --color-orange-800: #fed7aa;
+  --color-orange-700: #fdba74;
+  --color-orange-600: #fb923c;
+  --color-orange-500: #f97316;
+  --color-orange-400: #ea580c;
+  --color-orange-300: #c2410c;
+  --color-orange-200: #9a3412;
+  --color-orange-100: #7c2d12;
+  --color-orange-50: #431407;
+  
+  --color-red-50: #450a0a;
+  --color-red-100: #7f1d1d;
+  --color-red-200: #991b1b;
+  --color-red-300: #b91c1c;
+  --color-red-400: #dc2626;
+  --color-red-500: #ef4444;
+  --color-red-600: #f87171;
+  --color-red-700: #fca5a5;
+  --color-red-800: #fecaca;
+  --color-red-900: #fee2e2;
+  --color-red-950: #fef2f2;
+  
+  --color-pink-50: #500724;
+  --color-pink-100: #831843;
+  --color-pink-200: #9d174d;
+  --color-pink-300: #be185d;
+  --color-pink-400: #db2777;
+  --color-pink-500: #ec4899;
+  --color-pink-600: #f472b6;
+  --color-pink-700: #f9a8d4;
+  --color-pink-800: #fbcfe8;
+  --color-pink-900: #fce7f3;
+  --color-pink-950: #fdf2f8;
+  
+  --color-purple-50: #3b0764;
+  --color-purple-100: #581c87;
+  --color-purple-200: #6b21a8;
+  --color-purple-300: #7e22ce;
+  --color-purple-400: #9333ea;
+  --color-purple-500: #a855f7;
+  --color-purple-600: #c084fc;
+  --color-purple-700: #d8b4fe;
+  --color-purple-800: #e9d5ff;
+  --color-purple-900: #f3e8ff;
+  --color-purple-950: #faf5ff;
+  
+  --color-black: #ffffff;
+  --color-white: #181818;
+  --color-body: #111111;
+  --black-shadow: rgba(255,255,255,.72);
+  --white-shadow: rgba(0,0,0,.72);
+ }
+}
+
+html,body {background: var(--color-body);margin:0; padding:0;height: 100%; width: 100%; background-origin: border-box;box-sizing: border-box;
+  -webkit-overflow-scrolling: touch;
+  -webkit-touch-callout: none; 
+}
+html {-webkit-text-size-adjust: 100%;}
+body {font-size:16px; line-height: 1.5; color:var(--color-gray-900); font-family: -apple-system-font, Helvetica Neue, sans-serif; min-height: 100vh; overflow: auto;}
+#root {-webkit-tap-highlight-color: transparent; width:100%;}
+#app {max-width: 640px; min-width: 320px; margin-left: auto; margin-right: auto; min-height: 100vh; position: relative;}
+
+div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,select,textarea,blockquote,p{padding:0; margin:0; user-select: none; box-sizing: border-box;}
+table,td,tr,th{font-size:14px;}
+img{vertical-align:top;border:0;}
+ol,ul{list-style:none;}
+li{list-style-type:none;}
+h1,h2,h3,h4,h5,h6 {font-size:20px;}
+address,code,em,th,s,i{font-weight:normal; font-style:normal;}
+:before,:after{box-sizing: border-box;}
+
+/*float*/
+.l,.left{float:left;}
+.r,.right{float:right;}
+.clearfix {display: block;}
+.clearfix:after {clear: both;content: "";display: block}
+
+.flex{display:flex;}
+.justify-between{-ms-flex-align: center;-ms-flex-pack: justify; -webkit-align-items: center; -webkit-justify-content: space-between; align-items: center; display: -ms-flexbox; display: -webkit-flex;  justify-content: space-between;}
+.text-content{word-wrap: break-word;}
+.center{text-align:center;}
+/*display*/
+.hide{display:none;}
+.block{display:block;}
+
+/*margin*/
+.margin-2{margin: var(--xs);}
+.margin-4{margin: var(--sm);}
+.margin-6{margin: var(--md);}
+.margin-8{margin: var(--lg);}
+.margin-10{margin: var(--xl);}
+.margin-12{margin: var(--2xl);}
+.margin-16{margin: var(--3xl);}
+.margin-20{margin: var(--4xl);}
+.margin-24{margin: var(--5xl);}
+.margin-30{margin: var(--6xl);}
+
+.margin-2-t{margin-top: var(--xs);}
+.margin-4-t{margin-top: var(--sm);}
+.margin-6-t{margin-top: var(--md);}
+.margin-8-t{margin-top: var(--lg);}
+.margin-10-t{margin-top: var(--xl);}
+.margin-12-t{margin-top: var(--2xl);}
+.margin-16-t{margin-top: var(--3xl);}
+.margin-20-t{margin-top: var(--4xl);}
+.margin-24-t{margin-top: var(--5xl);}
+.margin-30-t{margin-top: var(--6xl);}
+
+.margin-2-r{margin-right: var(--xs);}
+.margin-4-r{margin-right: var(--sm);}
+.margin-6-r{margin-right: var(--md);}
+.margin-8-r{margin-right: var(--lg);}
+.margin-10-r{margin-right: var(--xl);}
+.margin-12-r{margin-right: var(--2xl);}
+.margin-16-r{margin-right: var(--3xl);}
+.margin-20-r{margin-right: var(--4xl);}
+.margin-24-r{margin-right: var(--5xl);}
+.margin-30-r{margin-right: var(--6xl);}
+
+.margin-2-b{margin-bottom: var(--xs);}
+.margin-4-b{margin-bottom: var(--sm);}
+.margin-6-b{margin-bottom: var(--md);}
+.margin-8-b{margin-bottom: var(--lg);}
+.margin-10-b{margin-bottom: var(--xl);}
+.margin-12-b{margin-bottom: var(--2xl);}
+.margin-16-b{margin-bottom: var(--3xl);}
+.margin-20-b{margin-bottom: var(--4xl)}
+.margin-24-b{margin-bottom: var(--5xl)}
+.margin-30-b{margin-bottom: var(--6xl)}
+
+.margin-2-l{margin-left: var(--xs);}
+.margin-4-l{margin-left: var(--sm);}
+.margin-6-l{margin-left: var(--md);}
+.margin-8-l{margin-left: var(--lg);}
+.margin-10-l{margin-left: var(--xl);}
+.margin-12-l{margin-left: var(--2xl);}
+.margin-16-l{margin-left: var(--3xl);}
+.margin-20-l{margin-left: var(--4xl);}
+.margin-24-l{margin-left: var(--5xl);}
+.margin-30-l{margin-left: var(--6xl);}
+
+.margin-2-lr{margin: 0 var(--xs);}
+.margin-4-lr{margin: 0 var(--sm);}
+.margin-6-lr{margin: 0 var(--md);}
+.margin-8-lr{margin: 0 var(--lg);}
+.margin-10-lr{margin: 0 var(--xl);}
+.margin-12-lr{margin: 0 var(--2xl);}
+.margin-16-lr{margin: 0 var(--3xl);}
+.margin-20-lr{margin: 0 var(--4xl);}
+.margin-24-lr{margin: 0 var(--5xl);}
+.margin-30-lr{margin: 0 var(--6xl);}
+
+.margin-2-tb{margin: var(--xs) 0;}
+.margin-4-tb{margin: var(--sm) 0;}
+.margin-6-tb{margin: var(--md) 0;}
+.margin-8-tb{margin: var(--lg) 0;}
+.margin-10-tb{margin: var(--xl) 0;}
+.margin-12-tb{margin: var(--2xl) 0;}
+.margin-16-tb{margin: var(--3xl) 0;}
+.margin-20-tb{margin: var(--4xl) 0;}
+.margin-24-tb{margin: var(--5xl) 0;}
+.margin-30-tb{margin: var(--6xl) 0;}
+
+/*padding*/
+.padding-2{padding: var(--xs);}
+.padding-4{padding: var(--sm);}
+.padding-6{padding: var(--md);}
+.padding-8{padding: var(--lg);}
+.padding-10{padding: var(--xl);}
+.padding-12{padding: var(--2xl);}
+.padding-16{padding: var(--3xl);}
+.padding-20{padding: var(--4xl);}
+.padding-24{padding: var(--5xl);}
+.padding-30{padding: var(--6xl);}
+
+.padding-2-t{padding-top: var(--xs);}
+.padding-4-t{padding-top: var(--sm);}
+.padding-6-t{padding-top: var(--md);}
+.padding-8-t{padding-top: var(--lg);}
+.padding-10-t{padding-top: var(--xl);}
+.padding-12-t{padding-top: var(--2xl);}
+.padding-16-t{padding-top: var(--3xl);}
+.padding-20-t{padding-top: var(--4xl);}
+.padding-24-t{padding-top: var(--5xl);}
+.padding-30-t{padding-top: var(--6xl);}
+
+.padding-2-r{padding-right: var(--xs);}
+.padding-4-r{padding-right: var(--sm);}
+.padding-6-r{padding-right: var(--md);}
+.padding-8-r{padding-right: var(--lg);}
+.padding-10-r{padding-right: var(--xl);}
+.padding-12-r{padding-right: var(--2xl);}
+.padding-16-r{padding-right: var(--3xl);}
+.padding-20-r{padding-right: var(--4xl);}
+.padding-24-r{padding-right: var(--5xl);}
+.padding-30-r{padding-right: var(--6xl);}
+
+.padding-2-b{padding-bottom: var(--xs);}
+.padding-4-b{padding-bottom: var(--sm);}
+.padding-6-b{padding-bottom: var(--md);}
+.padding-8-b{padding-bottom: var(--lg);}
+.padding-10-b{padding-bottom: var(--xl);}
+.padding-12-b{padding-bottom: var(--2xl);}
+.padding-16-b{padding-bottom: var(--3xl);}
+.padding-20-b{padding-bottom: var(--4xl)}
+.padding-24-b{padding-bottom: var(--5xl)}
+.padding-30-b{padding-bottom: var(--6xl)}
+
+.padding-2-l{padding-left: var(--xs);}
+.padding-4-l{padding-left: var(--sm);}
+.padding-6-l{padding-left: var(--md);}
+.padding-8-l{padding-left: var(--lg);}
+.padding-10-l{padding-left: var(--xl);}
+.padding-12-l{padding-left: var(--2xl);}
+.padding-16-l{padding-left: var(--3xl);}
+.padding-20-l{padding-left: var(--4xl);}
+.padding-24-l{padding-left: var(--5xl);}
+.padding-30-l{padding-left: var(--6xl);}
+
+.padding-2-lr{padding: 0 var(--xs);}
+.padding-4-lr{padding: 0 var(--sm);}
+.padding-6-lr{padding: 0 var(--md);}
+.padding-8-lr{padding: 0 var(--lg);}
+.padding-10-lr{padding: 0 var(--xl);}
+.padding-12-lr{padding: 0 var(--2xl);}
+.padding-16-lr{padding: 0 var(--3xl);}
+.padding-20-lr{padding: 0 var(--4xl);}
+.padding-24-lr{padding: 0 var(--5xl);}
+.padding-30-lr{padding: 0 var(--6xl);}
+
+.padding-2-tb{padding: var(--xs) 0;}
+.padding-4-tb{padding: var(--sm) 0;}
+.padding-6-tb{padding: var(--md) 0;}
+.padding-8-tb{padding: var(--lg) 0;}
+.padding-10-tb{padding: var(--xl) 0;}
+.padding-12-tb{padding: var(--2xl) 0;}
+.padding-16-tb{padding: var(--3xl) 0;}
+.padding-20-tb{padding: var(--4xl) 0;}
+.padding-24-tb{padding: var(--5xl) 0;}
+.padding-30-tb{padding: var(--6xl) 0;}
+
+/*radius*/
+.radius{border-radius: 50%}
+.radius-2{border-radius: var(--xs)}
+.radius-4{border-radius: var(--sm)}
+.radius-6{border-radius: var(--md)}
+.radius-8{border-radius: var(--lg)}
+.radius-10{border-radius: var(--xl)}
+.radius-12{border-radius: var(--2xl)}
+.radius-16{border-radius: var(--3xl)}
+.radius-20{border-radius: var(--4xl)}
+.radius-24{border-radius: var(--5xl)}
+.radius-30{border-radius: var(--6xl)}
+
+/* 边框 */
+.border{border-width: 1px; border-style: solid; border-color: var(--color-gray-300); color: var(--color-gray-500);}
+.border-red{border-width: 1px; border-style: solid; border-color: var(--color-red-500)!important; color: var(--color-red-500)!important;}
+.border-orange{border-width: 1px; border-style: solid; border-color: var(--color-orange-500)!important; color: var(--color-orange-500)!important;}
+.border-yellow{border-width: 1px; border-style: solid; border-color: var(--color-yellow-500)!important; color: var(--color-yellow-500)!important;}
+.border-green{border-width: 1px; border-style: solid; border-color: var(--color-green-500)!important; color:var(--color-green-500)!important;}
+.border-lime{border-width: 1px; border-style: solid; border-color: var(--color-lime-500)!important; color:var(--color-lime-500)!important;}
+.border-cyan{border-width: 1px; border-style: solid; border-color: var(--color-cyan-500)!important; color: var(--color-cyan-500)!important;}
+.border-blue{border-width: 1px; border-style: solid; border-color: var(--color-blue-500)!important; color: var(--color-blue-500)!important;}
+.border-purple{border-width: 1px; border-style: solid; border-color: var(--color-purple-500)!important; color: var(--color-purple-500)!important;}
+.border-black{border-width: 1px; border-style: solid; border-color: var(--color-black-900)!important; color: var(--color-black-900)!important;}
+.border-gray{border-width: 1px; border-style: solid; border-color:var(--color-gray-200)!important; color: var(--color-gray-400)!important;}
+
+/* 背景颜色 */
+.bg-red{background-color: var(--color-red-500)!important; color: var(--color-white)!important;}
+.bg-orange{background-color: var(--color-orange-500)!important; color: var(--color-white)!important;}
+.bg-yellow{background-color: var(--color-yellow-500)!important; color: var(--color-white)!important;}
+.bg-green{background-color: var(--color-green-500)!important; color: var(--color-white)!important;}
+.bg-lime{background-color: var(--color-lime-500)!important; color:var(--color-white)!important}
+.bg-cyan{background-color: var(--color-cyan-500)!important; color: var(--color-white)!important;}
+.bg-blue{background-color: var(--color-blue-500)!important; color: var(--color-white)!important;}
+.bg-pink{background-color: var(--color-pink-500)!important; color: var(--color-white)!important;}
+.bg-purple{background-color: var(--color-purple-500)!important; color: var(--color-white)!important;}
+.bg-black{background-color: var(--color-black-500)!important; color: var(--color-white)!important;}
+.bg-white{background-color: var(--color-white)!important; color: var(--color-gray-900)!important;}
+.bg-gray{background-color: var(--color-gray-100)!important; color: var(--color-gray-500)!important;}
+
+/* 文本颜色 */
+.text-red{color: var(--color-red-500)!important;}
+.text-orange{color: var(--color-orange-500)!important;}
+.text-yellow{color: var(--color-yellow-500)!important;}
+.text-green{color: var(--color-green-500)!important;}
+.text-lime{color: var(--color-lime-500)!important;}
+.text-cyan{color: var(--color-cyan-500)!important;}
+.text-blue{color: var(--color-blue-500)!important;}
+.text-pink{color: var(--color-pink-500)!important;}
+.text-purple{color: var(--color-purple-500)!important;}
+.text-black{color: var(--color-gray-900)!important;}
+.text-white{color: var(--color-white)!important;}
+.text-gray{color: var(--color-gray-400)!important;}
+.text-grey{color: var(--color-gray-200)!important;}
+
+/* 审核状态颜色 */
+.check-status-color-0{color: var(--color-gray-600)!important;}
+.check-status-color-1{color: var(--color-blue-500)!important;}
+.check-status-color-2{color: var(--color-green-500)!important;}
+.check-status-color-3{color: var(--color-red-500)!important;}
+.check-status-color-4{color: var(--color-gray-400)!important;}
+.check-status-color-5{color: var(--color-lime-500)!important;}
+.check-status-color-6{color: var(--color-orange-500)!important;}
+.check-status-color-7{color: var(--color-yellow-500)!important;}
+.check-status-color-8{color: var(--color-purple-500)!important;}
+
+/*font-size*/
+.fn{font-weight:normal!important;}
+.fb{font-weight:bold!important;}
+.fs{font-style:normal!important;}
+.f10{font-size:10px!important;}
+.f12{font-size:12px!important;}
+.f13{font-size:13px!important;}
+.f14{font-size:14px!important;}
+.f15{font-size:15px!important;}
+.f16{font-size:16px!important;}
+.f18{font-size:18px!important;}
+.f20{font-size:20px!important;}
+.f24{font-size:24px!important;}
+.f28{font-size:28px!important;}
+
+/*a*/
+a{text-decoration:none;color: var(--color-gray-900)}
+/*ellipsis*/
+.line-limit-1,.line-limit-2,.line-limit-3,.line-limit-4,.line-limit-5{letter-spacing: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; display: -webkit-box !important; -webkit-box-orient: vertical; -webkit-line-clamp: 1;}
+.line-limit-2{-webkit-line-clamp: 2;}
+.line-limit-3{-webkit-line-clamp: 3;}
+.line-limit-4{-webkit-line-clamp: 4;}
+.line-limit-5{-webkit-line-clamp: 5;}
+
+/*border-1-px*/
+.border-top,.border-bottom,.border-left,.border-right{position:relative;}
+.border-top:before,.border-left:before,.border-bottom:after,.border-right:after{content: " ";position: absolute; width: 200%; height: 0;pointer-events: none; transform: scale(0.5); transform-origin: 0 0;}
+.border-top:before{border-top:1px solid var(--color-gray-200);top: 0; left: 0;}
+.border-right:after{border-right:1px solid var(--color-gray-200);top: 0; right: 0;}
+.border-bottom:after{border-bottom:1px solid var(--color-gray-200); bottom: 0; left: 0;}
+.border-left:before{border-left:1px solid var(--color-gray-200);top: 0; left: 0;}
+
+/*avatar*/
+.avatar{align-items: center; aspect-ratio: 1/1; border-radius:4px; display: inline-flex; justify-content: center; overflow: hidden; width: 48px;height:48px;}
+.avatar>img {margin: 0; -o-object-fit: cover; object-fit: cover; width: 100%; height: 100%;}
+.avatar.sm{width: 36px;height:36px;}
+.avatar.xs{width: 24px;height:24px;}
+.avatar.lg{width: 60px;height:60px;}
+.avatar.radius{border-radius:50%;}
+
+/*mbui-btn*/
+.mbui-btn{display: inline-block; vertical-align: middle; height: 42px; line-height: 42px; border: 1px solid transparent; padding: 0 16px;background-color: var(--color-blue-500); color: #f1f1f1; white-space: nowrap; text-align: center; font-size: 16px; border-radius: 4px; cursor: pointer; user-select: none;}
+.mbui-btn:hover{opacity: 0.8; filter:alpha(opacity=80);}
+.mbui-btn:active{opacity: 1; filter:alpha(opacity=100);}
+.mbui-btn+.mbui-btn{margin-left: 10px;}
+.mbui-btn-100{width:100%;}
+
+/* 原始 */
+.mbui-btn-primary{border-color: var(--color-gray-300); background: var(--color-gray-50); color: var(--color-gray-500);}
+.mbui-btn-primary:hover{border-color: var(--color-gray-400); color: var(--color-gray-900);}
+/* 百搭 */.mbui-btn-normal{background-color: var(--color-blue-500);}
+/* 暖色 */.mbui-btn-warm{background-color: var(--color-yellow-500);}
+/* 警告 */.mbui-btn-danger{background-color: var(--color-red-500);}
+/* 常规 */.mbui-btn-green{background-color: var(--color-green-500);}
+/* 选中 */.mbui-btn-checked{background-color: var(--color-lime-500);}
+/* 禁用 */.mbui-btn-disabled, .mbui-btn-disabled:hover, .mbui-btn-disabled:active{border-color: var(--color-gray-200)!important; background-color:var(--color-gray-100)!important; color:var(--color-gray-300)!important; cursor: not-allowed !important; opacity: 1;}
+
+/* 大型 */.mbui-btn.lg{height: 48px; line-height: 48px; padding: 0 20px; font-size: 18px;}
+/* 中型 */.mbui-btn.md{height: 42px; line-height: 42px; padding: 0 16px; font-size: 16px;}
+/* 小型 */.mbui-btn.sm{height: 32px; line-height: 32px; padding: 0 12px; font-size: 14px;}
+/* 超小 */.mbui-btn.xs{height: 24px; line-height: 24px; padding: 0 6px; font-size: 12px;}
+
+
+/* 圆角 */
+.mbui-btn-radius{border-radius: 100px;}
+.mbui-btn .mbui-icon{padding: 0 2px; vertical-align: middle\0; vertical-align: bottom;}
+
+/* 按钮组 */
+.mbui-btn-group{display: inline-block; vertical-align: middle; font-size: 0;}
+.mbui-btn-group .mbui-btn{margin-left: 0!important; margin-right: 0!important; border-left: 1px solid rgba(255,255,255,.5); border-radius: 0;}
+.mbui-btn-group .mbui-btn-primary{border-left: none;}
+.mbui-btn-group .mbui-btn-primary:hover{border-color:var(--color-gray-300); color: var(--color-gray-500);}
+.mbui-btn-group .mbui-btn:first-child{border-left: none; border-radius: 2px 0 0 2px;}
+.mbui-btn-group .mbui-btn-primary:first-child{border-left: 1px solid var(--color-gray-300);}
+.mbui-btn-group .mbui-btn:last-child{border-radius: 0 2px 2px 0;}
+.mbui-btn-group .mbui-btn+.mbui-btn{margin-left: 0;}
+.mbui-btn-group+.mbui-btn-group{margin-left: 10px;}
+
+/*mbui-list*/
+.mbui-list{padding: var(--2xl); vertical-align: middle; position: relative; align-items: center; background: var(--color-white); font-size: 16px;
+  display: -webkit-box;
+  display: -webkit-flex;
+  display: flex;
+}
+.mbui-list:before{content: " "; position: absolute; top: 0;left: 0; width: 200%; height: 0; border-top: 1px solid var(--color-gray-200);
+  -webkit-transform: scale(0.5);
+  transform: scale(0.5);
+  -webkit-transform-origin: 0 0;
+  transform-origin: 0 0;
+  pointer-events: none;
+}
+.mbui-group .mbui-list:first-child:before {display:none}
+.mbui-list-bd{display: block; color:var(--color-gray-500); width:120px; height: 24px; text-overflow: ellipsis; white-space: nowrap; flex: 1;}
+.mbui-list-hd{width: 20px; height: 20px; margin-right: 14px; display: block;}
+.mbui-list-ft{text-align: right; padding-left: 10px;}
+.mbui-list-ft .mbui-badge{position: relative;top: -1px;}
+.mbui-list-ft small{font-size: 16px; color: var(--color-gray-400);}
+.mbui-list-ft-arrow{display: inline-block; width: 10px;height: 10px;margin-right: 2px; vertical-align:middle;
+  border-bottom: solid 2px var(--color-gray-200);
+  border-right: solid 2px var(--color-gray-200);
+  -webkit-transform: rotate(315deg);
+  -ms-transform: rotate(315deg);
+  transform: rotate(315deg);  
+}
+a.mbui-list:active{background:var(--color-gray-100);}
+
+/*tabbar*/
+.tabbar-fixed{width: 100%; max-width: 480px; position: fixed; left: 50%; bottom: 0; z-index: 999;transform: translateX(-50%);}
+.tabbar{display:flex;position:relative;z-index:500;background-color:var(--color-gray-100);}
+.tabbar:before{content:" ";position:absolute;left:0;top:0;right:0;height:1px;border-top:1px solid var(--color-gray-100);color:var(--color-gray-100);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}
+.tabbar-item{display:block;flex:1;padding:3px 0 6px;padding-bottom:calc(6px + constant(safe-area-inset-bottom));padding-bottom:calc(6px + env(safe-area-inset-bottom));font-size:0;color:var(--color-gray-500);text-align:center;-webkit-tap-highlight-color:var(--color-black)}
+.tabbar-item:first-child{padding-left:constant(safe-area-inset-left);padding-left:env(safe-area-inset-left)}
+.tabbar-item:last-child{padding-right:constant(safe-area-inset-right);padding-right:env(safe-area-inset-right)}
+.tabbar-icon{display:inline-block;width:28px;height:28px;margin-bottom:8px}
+.tabbar-icon img{width:100%;height:100%}
+.tabbar-icon>i.iconfont{font-size:24px;color:var(--color-gray-900);}
+.tabbar-label{color:var(--color-gray-900); font-size:10px; line-height:1.4}
+.bar-item-on .tabbar-label,.bar-item-on .tabbar-icon>i{color:var(--color-gray-700);}
+
+/*tab*/
+.mbui-tab {position: relative;width: 100%; display: block;}
+.mbui-tab .mbui-tab-title { padding: 0; margin: 0;list-style: none; position: relative; background: var(--color-white);}
+.mbui-tab .mbui-tab-title:after{content: " ";position: absolute; width: 200%; height: 0;pointer-events: none; transform: scale(0.5); transform-origin: 0 0; border-bottom:1px solid var(--color-gray-300); bottom: 0; left: 0;}
+.mbui-tab .mbui-tab-title a { display: inline-block;padding: 12px 0; color: var(--color-gray-500); font-size: 16px; text-align: center;}
+.mbui-tab .mbui-tab-title .active { position: relative; bottom: 0;}
+.mbui-tab .mbui-tab-title .active a {border-bottom: 2px solid var(--color-gray-900); padding: 12px 0 10px; color: var(--color-gray-900); position: relative; font-weight: 600;}
+.mbui-tab .mbui-tab-title li { display: table-cell; width: 1%; text-align: center; position: relative;}
+.mbui-tab .mbui-tab-title li .badge { padding: 0 4px; position: relative; top: -1px; margin-left: 2px;}
+.mbui-tab .mbui-tab-title li small { color: var(--color-gray-500);}
+.mbui-tab.tab-fixed {position: fixed !important; right: 0; left: 0; z-index: 10;}
+.mbui-tab-item{ display: none;}
+.mbui-tab-item.mbui-tab-show{ display: block;}
+
+.mbui-new-add{width:44px;height:44px; border-radius:50%; position:fixed;right:10px;bottom:48px; background-color:var(--color-blue-600);}
+.mbui-new-add a{width:44px;height:44px;color:var(--color-white); font-size:24px;display: flex; justify-content: center;align-items: center;}
+.mbui-new-add a i{font-size:24px;}
+
+/*bar*/
+.mbui-bar {backface-visibility: hidden; background-color: var(--white-shadow); backdrop-filter: blur(8px); width: 100%; display: block; position: relative; z-index: 10;}
+.mbui-bar.bar-fixed { position: fixed !important; right: 0; left: 0; z-index: 10;}
+header.mbui-bar.bar-fixed { top: 0;}
+header.mbui-bar:before {content: " ";transform: scale(0.5); transform-origin: 0 0; pointer-events: none; position: absolute; top: 0; left: 0; width: 200%; bottom: 0; height: 200%; border-bottom: 1px solid rgba(0, 0, 0, 0.1); top: auto; bottom: -1px;}
+header.mbui-bar:before,
+header.mbui-bar:after { content: "";display: table;}
+header.mbui-bar:after {clear: both;}
+header.mbui-bar .mbui-bar-title {display: block; font-size: 18px;font-weight: bold; width: 100%; position: absolute; text-align: center; line-height: 46px; margin: 0; padding: 0; white-space: nowrap;}
+header.mbui-bar .mbui-bar-title a {color: inherit;}
+header.mbui-bar .mbui-bar-item { padding: 0 12px; font-size: 16px; line-height: 46px; position: relative;z-index: 10;color: var(--color-gray-900);}
+header.mbui-bar .mbui-bar-item .mbui-bar-arrow-left { display: inline-block; width: 10px; height: 10px; border-bottom: solid 2px var(--color-gray-900); border-right: solid 2px var(--color-gray-900); margin-left: 2px; transform: rotate(135deg);}
+header.mbui-bar.bar-primary{ border: none; background: var(--color-gray-900); color: var(--color-white);}
+header.mbui-bar.bar-green { border: none; background: var(--color-green-500); color: var(--color-white);}
+header.mbui-bar.bar-primary:before,
+header.mbui-bar.bar-green:before { display: none;}
+header.mbui-bar.bar-primary .mbui-bar-item,
+header.mbui-bar.bar-green .mbui-bar-item { color: var(--color-white);}
+header.mbui-bar.bar-primary .mbui-bar-item .mbui-bar-arrow-left,
+header.mbui-bar.bar-green .mbui-bar-item .mbui-bar-arrow-left { border-bottom: solid 2px var(--color-white); border-right: solid 2px var(--color-white);}
+footer.mbui-bar {height: 60px; display: table; position: relative;}
+footer.mbui-bar.bar-fixed {bottom: 0;}
+footer.mbui-bar:before { content: " ";transform: scale(0.5); transform-origin: 0 0; pointer-events: none; position: absolute; top: 0; left: 0; width: 200%; height: 0; border-top: 1px solid var(--color-gray-100);}
+footer.mbui-bar .mbui-bar-item {display: table-cell; text-align: center; vertical-align: middle; height: inherit; font-size: 12px;color:var(--color-gray-500)}
+footer.mbui-bar .mbui-bar-item .mbui-bar-icon {width: 30px; height: 30px; line-height:24px; display: inline-block; position: relative;}
+footer.mbui-bar .mbui-bar-item .mbui-bar-icon i{font-size:24px;}
+footer.mbui-bar.tool-bar .mbui-bar-item .mbui-bar-icon i{font-weight:600;color: var(--color-gray-700);}
+footer.mbui-bar .mbui-bar-item .mbui-bar-icon .mbui-badge {position: absolute; top: -2px; right: -10px;}
+footer.mbui-bar .mbui-bar-item .mbui-bar-icon .mbui-badge.mbui-badge-dot { top: 0px; right: -4px;}
+footer.mbui-bar .mbui-bar-item span { display: block;line-height: 1;}
+footer.mbui-bar .mbui-bar-item.active {color: var(--color-blue-600);}
+
+.mbui-badge{ display: inline-block; padding: 2px 5px; z-index: 2; background: var(--color-red-500); font-weight: 400; border-radius: 50%; -webkit-border-radius: 50px; color: var(--color-white) !important; font-size: 12px !important; line-height: 1 !important; text-align: center; white-space: nowrap; font-style: normal;}
+.mbui-badge-dot{ width: 9px; height: 9px; padding: 0; min-width: 0;}
+
+/*grid-9*/
+.mbui-grid{ background: var(--color-white); border-radius:6px;}
+.mbui-grid .mbui-grid-title{padding:12px 12px 0; color:var(--color-gray-400);font-size:14px;}
+.mbui-grid-box{padding:8px 0}
+.mbui-grid .mbui-grid-item {width: 33.3333%; box-sizing: border-box; display: block; text-align: center; float: left; padding: 8px 8px 12px; line-height:1.32; color: var(--color-gray-500);font-size: 14px; position: relative;}
+.mbui-grid.grid-4 .mbui-grid-item {width: 25%;}
+.mbui-grid.border .mbui-grid-item:after { content: " "; pointer-events: none; position: absolute; top: 0; left: -1px; width: 200%; height: 200%; border-right: 1px solid var(--color-gray-100);
+  -webkit-transform: scale(0.5);
+  transform: scale(0.5);
+  -webkit-transform-origin: 0 0;
+  transform-origin: 0 0;
+}
+.mbui-grid.border .mbui-grid-item:before { content: " "; pointer-events: none; position: absolute; top: 0; left: 0; width: 200%; height: 0; border-top: 1px solid var(--color-gray-100);
+  -webkit-transform: scale(0.5);
+  transform: scale(0.5);
+  -webkit-transform-origin: 0 0;
+  transform-origin: 0 0;
+}
+.mbui-grid .mbui-grid-item .mbui-grid-item-icon {width: 44px; height: 44px; display: block; margin: 8px auto; line-height:44px;}
+.mbui-grid .mbui-grid-item .mbui-grid-item-icon i{font-size:32px; color:var(--color-blue-500)}
+.mbui-grid .mbui-grid-item:nth-child(3n):after {border-right: none;}
+.mbui-grid.border .mbui-grid-item:nth-last-child(-n+3):before {content: " "; position: absolute; top: 0; left: 0; width: 200%; bottom: 0; height: 200%; border-bottom: 1px solid var(--color-gray-100); transform: scale(0.5); transform-origin: 0 0; pointer-events: none;}
+.mbui-grid .mbui-grid-item .mbui-grid-item-mun {width: 32px; height: 32px; font-size:24px; color:var(--color-blue-600); display: block; margin: 8px auto; line-height:32px;}
+.mbui-grid.mbui-grid-bg .mbui-grid-item-icon{background-color:var(--color-blue-600); width: 44px; height: 44px; padding:6px; border-radius:6px;}
+.mbui-grid.mbui-grid-bg .mbui-grid-item-icon i{font-size:26px; color:#f1f1f1}
+
+/* 用户面板 */
+.mbui-user-panel{padding:12px; background-color:var(--color-white); display: flex;}
+.mbui-user-panel .avatar{margin-right:12px;}
+
+/* 面板 */
+.mbui-panel{position: relative; border-width: 1px; border-style: solid; border-radius: 2px; background-color: var(--color-white); color: var(--color-gray-500); box-shadow: 0 4px 8px -4px rgba(0,0,0,.13),0 6px 16px 0 rgba(0,0,0,.08),0 12px 24px 16px rgba(0,0,0,.04);}
+.mbui-table{padding:0; margin:1px; background-color:var(--color-white); border:1px solid var(--color-gray-200);border-collapse: collapse; border-spacing: 0;}
+.mbui-table th,.mbui-table td{padding:8px 4px; border:1px solid var(--color-gray-200); text-align:center; font-size:14px;}
+.mbui-table th{background-color:var(--color-gray-50); color:var(--color-gray-500)}
+
+/*表单*/
+input, textarea {user-select: auto;}
+input,button, textarea ,select{border: none; outline: none;
+  -webkit-appearance: none;
+  -webkit-user-select : text;
+  user-select: text;
+}
+input[disabled] {background: var(--color-gray-100);}
+input::placeholder,textarea::placeholder {color: var(--color-gray-300);}
+label input{vertical-align:middle; margin-right:3px;}
+:focus {outline: 0;}
+select{padding:4px 5px;border:1px solid var(--color-gray-300); border-radius:2px; margin-right:3px;}
+input[type="file"] {display: block;}
+
+.mbui-input,.mbui-textarea{box-sizing: border-box;}
+
+.mbui-input, .mbui-textarea,
+.mbui-form-pane .mbui-form-label,
+.mbui-form-pane .mbui-form-item[pane]{border-color: var(--color-gray-200); font-size:16px;}
+.mbui-form-label >i{color:var(--color-orange-600);}
+
+.mbui-input, .mbui-textarea{height: 44px; line-height: 1.3; border-width: 1px; border-style: solid; background-color: var(--color-white); color: var(--color-black); border-radius: 2px;}
+.mbui-input::-webkit-input-placeholder,
+.mbui-textarea::-webkit-input-placeholder{line-height: 1.3; color:var(--color-gray-400);}
+.mbui-input, .mbui-textarea{display: block; width: 100%; padding-left: 10px;}
+.mbui-input:focus, .mbui-textarea:focus{border-color: var(--color-blue-600) !important; box-shadow: 0 0 0 3px rgba(22,183,119,0.08);}
+.mbui-textarea{position: relative; min-height: 100px; height: auto; line-height: 20px; padding: 6px 10px; resize: vertical;}
+.mbui-input[disabled], .mbui-textarea[disabled]{background-color: var(--color-gray-100);}
+
+.mbui-form-item{position: relative; margin-bottom: 15px; clear: both; *zoom: 1;}
+.mbui-form-item:after{content:'\20'; clear: both; *zoom: 1; display: block; height:0;}
+.mbui-input-block, .mbui-input-inline{position: relative;}
+.mbui-input-block{margin-left: 110px; min-height: 36px;}
+.mbui-input-inline{display: inline-block; vertical-align: middle;}
+.mbui-form-item .mbui-input-inline{float: left; width: 190px; margin-right: 10px;}
+.mbui-form-text .mbui-input-inline{width: auto;}
+
+/*mbui-form-inline*/
+.mbui-group+.mbui-group{margin-top:var(--3xl);}
+.mbui-group-title{padding:var(--3xl) var(--xl) var(--md) var(--2xl); font-size: 14px; color: var(--color-gray-400);font-weight: 400;}
+.mbui-form-line{position: relative;background:var(--color-white);}
+.mbui-form-line:before {content: " "; position: absolute; top: 0;left: 0; width: 200%; height: 0; border-top: 1px solid var(--color-gray-200);
+  -webkit-transform: scale(0.5);
+  transform: scale(0.5);
+  -webkit-transform-origin: 0 0;
+  transform-origin: 0 0;
+  pointer-events: none;
+}
+.mbui-group .mbui-form-line:first-child:before{display:none}
+/*input*/
+.mbui-form-label {width: 122px; padding: 17px 6px 17px 12px; color: var(--color-gray-500); line-height: 1; font-size: 16px; font-weight: 400; margin: 0; position: absolute;letter-spacing: 0; overflow: hidden; text-overflow: ellipsis; word-break: keep-all; display: -webkit-box !important;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 1;}
+.mbui-form-input { width: 100%; border: 0; outline: 0; font-size: 16px; box-shadow: none; appearance: none; -webkit-appearance: none; -moz-appearance:button; border-radius: 0; color: var(--color-gray-900); padding: 16px 14px 15px 122px;  background: var(--color-white);}
+
+/*radio*/
+.mbui-form-radio{ width: 100%; border: 0; font-size: 16px; color: var(--color-gray-900); padding: 3px 12px 3px 122px; background: var(--color-white); line-height:44px}
+.mbui-form-radio .mbui-input-radio{width: 19px; height: 19px; appearance: none; position: relative;}
+.mbui-form-radio .mbui-input-radio:before{content: ''; width: 19px; height: 19px; border: 1px solid var(--color-gray-400); display: inline-block; border-radius: 50%; vertical-align: bottom;}
+.mbui-form-radio .mbui-input-radio:checked:before{ content: ''; width: 19px; height: 19px; border: 1px solid var(--color-blue-600); background:var(--color-blue-600); display: inline-block; border-radius: 50%; vertical-align: bottom;}
+.mbui-form-radio .mbui-input-radio:checked:after{ content: ''; width: 10px; height:5px;border: 2px solid var(--color-white); border-top: transparent; border-right: transparent;text-align: center; display: block; position: absolute; top: 6px; left:5px; vertical-align: bottom; transform: rotate(-45deg);}
+.mbui-form-radio .mbui-input-radio + label{line-height: 19px; display: inline-block;  margin-left: 3px; margin-right:16px;}
+
+/*checkbox*/
+.mbui-form-checkbox{ width: 100%; border: 0; font-size: 16px; color: var(--color-gray-900); padding: 14px 12px 14px 122px; background: var(--color-white); line-height:1.5}
+.mbui-form-checkbox .mbui-input-checkbox{width: 19px; height: 19px; appearance: none; position: relative;}
+.mbui-form-checkbox .mbui-input-checkbox:before{content: ''; width: 19px; height: 19px; border: 1px solid var(--color-gray-400); display: inline-block; border-radius: 3px; vertical-align: bottom;}
+.mbui-form-checkbox .mbui-input-checkbox:checked:before{ content: ''; width: 19px; height: 19px; border: 1px solid var(--color-blue-600); background:var(--color-blue-600); display: inline-block; border-radius: 3px; vertical-align: bottom;}
+.mbui-form-checkbox .mbui-input-checkbox:checked:after{ content: ''; width: 10px; height:5px;border: 2px solid var(--color-white); border-top: transparent; border-right: transparent;text-align: center; display: block; position: absolute; top: 6px; left:5px; vertical-align: middle; transform: rotate(-45deg);}
+.mbui-form-checkbox .mbui-input-checkbox + label{line-height: 19px; display: inline-block;  margin-left: 3px; margin-right:16px;}
+
+/*select*/
+.mbui-form-select{position: static; width: 100%; min-height: 50px;}
+.mbui-form-select > select {border-radius: 0;border: 0;  width: 100%; padding-left: 122px; height: 48px; font-size: 16px; margin: 2px 0; background: var(--color-white); color: var(--color-gray-900);}
+.mbui-form-select > select > option {padding: 6px; background-color: var(--color-gray-100); color: var(--color-gray-500);}
+.mbui-form-select:after {content: ""; top: 20px; right: 20px; position: absolute; display: inline-block;font-size: 0; width: 8px; height: 8px; background-color: transparent; border-top: 2px solid var(--color-gray-400); border-left: 2px solid var(--color-gray-400);-webkit-transform: rotate(225deg);}
+.mbui-form-select .mbui-form-input{padding: 3px 32px 3px 122px; line-height:44px;}
+
+.mbui-form-select.date-select:after{content: '📅'; font-size: 14px; width: 12px; height: 12px; top:14px; background-color: transparent; border:none;-webkit-transform: rotate(0);}
+.mbui-form-select.admin-select:after{content: '👤'; font-size: 14px; width: 12px; height: 12px; top:14px; background-color: transparent; border:none;-webkit-transform: rotate(0);}
+
+/*uploader*/
+.mbui-form-uploader {width: 100%;border: 0;outline: 0;font-size: 16px; box-shadow: none; appearance: none;border-radius: 0; color: var(--color-gray-900); padding: 5px 14px 5px 122px; background: var(--color-white);
+  -webkit-appearance: none;
+  -moz-appearance:button;
+}
+.mbui-form-uploader .mbui-uploader-btn-border { width: 100%; height: 42px; background: var(--color-white); border-radius: 0;display: block; text-align:right; position: relative;color:var(--color-gray-500);line-height:42px;}
+.mbui-form-uploader .mbui-uploader-btn-border i{font-size:20px; font-weight:600}
+.mbui-form-uploader input { opacity: 0; position: absolute;top: 0;left: 0;width: 100%; height: 100%;}
+
+.mbui-form-phone .mbui-form-input{padding: 16px 120px;}
+.mbui-input-cell {float: none; width: 100%; padding: 14px 20px; position: static;}
+.mbui-input-cell small {color: var(--color-gray-400);}
+.mbui-form-static {font-size: 16px;width: 100%; padding: 14px 20px 14px 122px; margin-bottom: 0;}
+
+/*list-radio*/
+.mbui-radio-checkbox{position: relative; background:var(--color-white); width: 100%; font-size: 16px; color: var(--color-gray-900); padding:15px 14px;}
+.mbui-radio-checkbox:before {content: " ";pointer-events: none;position: absolute; top: 0; left: 0; width: 200%; height: 0; border-top: 1px solid var(--color-gray-100);
+    -webkit-transform: scale(0.5);
+    transform: scale(0.5);
+    -webkit-transform-origin: 0 0;
+    transform-origin: 0 0;   
+}
+.mbui-group .mbui-radio-checkbox:last-child:after {content: " ";pointer-events: none;position: absolute; bottom: 0; left: 0; width: 200%; height: 0; border-bottom: 1px solid var(--color-gray-100);
+    -webkit-transform: scale(0.5);
+    transform: scale(0.5);
+    -webkit-transform-origin: 0 0;
+    transform-origin: 0 0;   
+}
+.mbui-radio-checkbox label{width: 100%; position:relative; line-height:1.36; display:flex;justify-content:space-between;}
+
+.mbui-radio-checkbox .mbui-radio{width: 21px; height: 21px; appearance: none; position: relative;}
+.mbui-radio-checkbox .mbui-radio:before{content: ''; width: 21px; height: 21px; border: 1px solid var(--color-gray-400); display: inline-block; border-radius: 50%; vertical-align: middle;}
+.mbui-radio-checkbox .mbui-radio:checked:before{border: 1px solid var(--color-blue-600); background:var(--color-blue-600); }
+.mbui-radio-checkbox .mbui-radio:checked:after{ content: ''; width: 10px; height:5px;border: 2px solid var(--color-white); border-top: transparent; border-right: transparent;text-align: center; display: block; position: absolute; top: 7px; left:5px; vertical-align: bottom; transform: rotate(-45deg);}
+
+.mbui-radio-checkbox .mbui-checkbox{width: 21px; height: 21px; appearance: none; position: relative;}
+.mbui-radio-checkbox .mbui-checkbox:before{content: ''; width: 21px; height: 21px; border: 1px solid var(--color-gray-400); display: inline-block; border-radius: 3px; vertical-align: middle;}
+.mbui-radio-checkbox .mbui-checkbox:checked:before{border: 1px solid var(--color-blue-600); background:var(--color-blue-600);}
+.mbui-radio-checkbox .mbui-checkbox:checked:after{ content: ''; width: 10px; height:5px;border: 2px solid var(--color-white); border-top: transparent; border-right: transparent;text-align: center; display: block; position: absolute; top: 7px; left:5px; vertical-align: middle; transform: rotate(-45deg);}
+
+/*switch*/
+.mbui-switch {
+  padding: 14px 20px;
+}
+.mbui-switch .mbui-switch-text {
+  padding: 4px 0;
+  margin: 0;
+  font-size: 16px;
+  text-indent: 0 !important;
+}
+.mbui-switch .mbui-switch-text small {
+  color: var(--color-gray-400);
+}
+.mbui-switch > input[type="checkbox"] {
+  display: none;
+}
+.mbui-switch > label {
+  margin-bottom: 0;
+}
+.mbui-switch .mbui-switch_radius {
+  position: relative;
+  display: inline-block;
+  color: var(--color-gray-200);
+  width: 50px;
+  height: 32px;
+  background: var(--color-gray-200);
+  border-radius: 100px;
+  cursor: pointer;
+  transition: all 0.4s cubic-bezier(0.17, 0.67, 0.43, 0.98);
+  -webkit-transition: all 0.4s cubic-bezier(0.17, 0.67, 0.43, 0.98);
+  float: right;
+}
+.mbui-switch .mbui-switch_radius:active {
+  box-shadow: inset 0 0 0 1.2em var(--color-gray-300);
+  -webkit-box-shadow: inset 0 0 0 1.2em var(--color-gray-300);
+}
+.mbui-switch .mbui-switch_radius:before {
+  width: 30px;
+  height: 30px;
+  border-radius: 100px;
+  transition: margin-left 0.2s ease 0s;
+  -webkit-transition: margin-left 0.2s ease 0s;
+  margin: 1px;
+  background: var(--color-white);
+  box-shadow: inset 0 0 0 0.03em rgba(0, 0, 0, 0.1), 0 0 0.05em rgba(0, 0, 0, 0.05), 0 0.1em 0.2em rgba(0, 0, 0, 0.2);
+  -webkit-box-shadow: inset 0 0 0 0.03em rgba(0, 0, 0, 0.1), 0 0 0.05em rgba(0, 0, 0, 0.05), 0 0.1em 0.2em rgba(0, 0, 0, 0.2);
+}
+.mbui-switch .mbui-switch_radius:before,
+.mbui-switch .mbui-switch_radius:after {
+  position: absolute;
+  content: "";
+}
+.mbui-switch > input:checked + label {
+  background: var(--color-gray-900);
+  transition: all 0.15s ease-out;
+  -webkit-transition: all 0.15s ease-out;
+  box-shadow: inset 0 0 0 1.2em var(--color-gray-900);
+  -webkit-box-shadow: inset 0 0 0 1.2em var(--color-gray-900);
+}
+.mbui-switch > input:checked + label:active {
+  box-shadow: inset 0 0 0 1.2em var(--color-gray-900);
+  -webkit-box-shadow: inset 0 0 0 1.2em var(--color-gray-900);
+}
+.mbui-switch > input:checked + label:before {
+  margin-left: 19px;
+}
+
+.mbui-checkbox_hd,
+.mbui-radio_hd {
+  display: block;
+  margin-right: 14px;
+  line-height: 0;
+}
+.mbui-checkbox_bd,
+.mbui-radio_bd {
+  width: 100%;
+  font-size: 16px;
+  display: block;
+  position: relative;
+  -webkit-box-flex: 1;
+  -webkit-flex: 1;
+  flex: 1;
+}
+.mbui-checkbox_bd small,
+.mbui-radio_bd small {
+  color: var(--color-gray-400);
+}
+.mbui-radio .btn .mbui-radio_ft,
+.mbui-checkbox .btn .mbui-checkbox_ft {width: 22px; height: 22px;display: inline-block;}
+.mbui-checkbox .btn .mbui-checkbox_ft:after,
+.mbui-checkbox .btn .mbui-checkbox_ft:before {
+  position: absolute;
+  display: block;
+  content: "";
+  height: 1px;
+}
+.mbui-radio .btn .mbui-radio_ft:after,
+.mbui-radio .btn .mbui-radio_ft:before {
+  position: absolute;
+  display: block;
+  content: "";
+  height: 2px;
+}
+.mbui-radio .btn.active .mbui-radio_ft:after {margin-top: 19px; margin-left: -2px; width: 18px; background: var(--color-blue-600);
+  -webkit-transform: rotate(-45deg) translate3d(10px, 0, 0);
+  -moz-transform: rotate(-45deg) translate3d(10px, 0, 0);
+  transform: rotate(-45deg) translate3d(10px, 0, 0);
+
+}
+.mbui-radio .btn.active .mbui-radio_ft:before {  margin-top: 4px;margin-left: -2px; width: 8px; background: var(--color-blue-600);
+  -webkit-transform: rotate(45deg) translate3d(10px, 5px, 0);
+  -moz-transform: rotate(45deg) translate3d(10px, 5px, 0);
+  transform: rotate(45deg) translate3d(10px, 5px, 0);
+}
+.mbui-checkbox .btn .mbui-checkbox_ft {
+  border-radius: 100%;
+  -webkit-border-radius: 100%;
+  background: var(--color-white);
+  border: 1px solid var(--color-gray-300);
+}
+.mbui-checkbox .btn.active .mbui-checkbox_ft {background: var(--color-blue-600); border-color: var(--color-blue-600);}
+.mbui-checkbox .btn.active .mbui-checkbox_ft:after {
+  -webkit-transform: rotate(-45deg) translate3d(10px, 0, 0);
+  -moz-transform: rotate(-45deg) translate3d(10px, 0, 0);
+  transform: rotate(-45deg) translate3d(10px, 0, 0);
+  margin-top: 17px;
+  margin-left: -1px;
+  width: 10px;
+  background: var(--color-white);
+}
+.mbui-checkbox .btn.active .mbui-checkbox_ft:before {
+  -webkit-transform: rotate(45deg) translate3d(11px, 4px, 0);
+  -moz-transform: rotate(45deg) translate3d(11px, 4px, 0);
+  transform: rotate(45deg) translate3d(11px, 4px, 0);
+  margin-top: 1px;
+  margin-left: -1px;
+  width: 5px;
+  background: var(--color-white);
+}
+[data-toggle="buttons"] > .btn input[type="radio"],
+[data-toggle="buttons"] > .btn input[type="checkbox"] {
+  clip: rect(0, 0, 0, 0);
+  pointer-events: none;
+  position: absolute;
+  width: auto;
+  height: 100%;
+}
+.mbui-uploader {
+  background: var(--color-white);
+  position: relative;
+  padding: 0 20px;
+}
+.mbui-uploader:before {
+  content: " ";
+  -webkit-transform: scale(0.5);
+  transform: scale(0.5);
+  -webkit-transform-origin: 0 0;
+  transform-origin: 0 0;
+  pointer-events: none;
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 200%;
+  height: 0;
+  border-top: 1px solid var(--color-gray-100);
+}
+.mbui-uploader:after {
+  content: " ";
+  -webkit-transform: scale(0.5);
+  transform: scale(0.5);
+  -webkit-transform-origin: 0 0;
+  transform-origin: 0 0;
+  pointer-events: none;
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 200%;
+  bottom: 0;
+  height: 200%;
+  border-bottom: 1px solid var(--color-gray-100);
+}
+.mbui-uploader_title {
+  padding: 20px 0;
+  line-height: 1.1333;
+  font-size: 16px;
+  font-weight: 400;
+  margin: 0;
+  color: var(--color-gray-900);
+}
+.mbui-uploader_files {
+  list-style: none;
+  padding: 0;
+  margin: 0;
+}
+.mbui-uploader_files .mbui-uploader_files_item {
+  width: 90px;
+  height: 90px;
+  float: left;
+  margin-right: 10px;
+  margin-bottom: 20px;
+}
+
+.mbui-uploader_files .mbui-uploader_files_item a,
+.mbui-uploader_files .mbui-uploader_files_item img {
+  display: block;
+}
+.mbui-uploader_btn {
+  float: left;
+  position: relative;
+  width: 90px;
+  height: 90px;
+  margin-bottom: 20px;
+}
+.mbui-uploader_btn .mbui-uploader_btn_border {
+  float: left;
+  width: 100%;
+  height: 100%;
+  background: var(--color-white);
+  border: 1px dashed var(--color-gray-300);
+  border-radius: 6px;
+  display: block;
+  position: relative;
+  text-align: center;
+}
+.mbui-uploader_btn .mbui-uploader_btn_border:before,
+.mbui-uploader_btn .mbui-uploader_btn_border:after {
+  content: " ";
+  position: absolute;
+  background: var(--color-gray-300);
+  display: block;
+  top: 50%;
+  left: 50%;
+  -webkit-transform: translate(-50%, -50%);
+  transform: translate(-50%, -50%);
+}
+.mbui-uploader_btn .mbui-uploader_btn_border:after {
+  width: 2px;
+  height: 26px;
+}
+.mbui-uploader_btn .mbui-uploader_btn_border:before {
+  width: 26px;
+  height: 2px;
+}
+.mbui-uploader_btn input {
+  opacity: 0;
+  position: absolute;
+  top: 0px;
+  left: 0px;
+  width: 100%;
+  height: 100%;
+}
+
+/*steps*/
+.mbui-steps .mbui-steps-item { position: relative; padding-left: 25px; padding-bottom: 12px; font-size: 14px; color: var(--color-gray-600); font-weight: 600;}
+.mbui-steps .mbui-steps-item small {padding-top:2px; display: block; font-size: 14px;color: var(--color-gray-400); font-weight: 400;}
+.mbui-steps .mbui-steps-item:last-child:after {display: none;}
+.mbui-steps .mbui-steps-item:before {position: absolute; content: " ";top: 5px; left: 3px; display: block; width: 13px; height: 13px; background: var(--color-gray-300); border-radius: 50%; z-index: 2;}
+.mbui-steps .mbui-steps-item:after {position: absolute; content: " "; top: 5px; left: 9px; display: block; width: 1px; height: 100%; background: var(--color-gray-300);}
+.mbui-steps .mbui-steps-item.success {color: var(--color-gray-900);}
+.mbui-steps .mbui-steps-item.success:after,
+.mbui-steps .mbui-steps-item.success:before {background: var(--color-gray-900);}
+.mbui-steps .mbui-steps-item.active {color: var(--color-gray-900);font-weight: 600;}
+.mbui-steps .mbui-steps-item.active small {font-weight: 400;}
+.mbui-steps .mbui-steps-item.success:before,
+.mbui-steps .mbui-steps-item.active:before {top: 3px; left: 6px; width: 12px;height: 12px;background: var(--color-gray-900);border: 4px solid var(--color-white);}
+
+/*layer - modal*/
+.mbui-layer {position: relative; z-index: 888;}
+.mbui-layer *{box-sizing: border-box;}
+.mbui-layershade {background-color:var(--black-shadow);pointer-events: auto;}
+.mbui-layermain,.mbui-layershade { position: fixed; left: 0;top: 0; width: 100%; height: 100%;}
+.mbui-layermain{display: table;}
+
+.mbui-layer .modal-dialog { width: 100%; margin: 0;padding: 0; display: table-cell; vertical-align: middle; text-align: center;}
+.mbui-layer .modal-content {position: relative; background-clip: padding-box; background: var(--color-white); border-radius: 12px; max-width: 320px; margin-left: auto; margin-right: auto;animation: bounce-in 300ms 0ms ease both;}
+@-webkit-keyframes bounce-in {
+  0% {
+    opacity: 0;
+    -webkit-transform: scale(0.5);
+  }
+  100% {
+    opacity: 1;
+    -webkit-transform: scale(1);
+  }
+}
+
+.mbui-layer .modal-header {padding:12px 16px; font-size: 18px; text-align: center;font-weight: 600;}
+.mbui-layer .modal-body { position: relative; padding: 0 16px 16px; font-size: 16px; color: var(--color-gray-500);text-align: center;}
+.mbui-layer .modal-footer {padding: 0; position: relative;}
+
+.mbui-layer .modal-content .btn-default {background-color: var(--color-white);}
+.mbui-layer .modal-content .btn-lg {font-size: 17px; padding: 12px 16px; border-radius: 0; border: none;}
+.mbui-layer .modal-content .btn-lg:before {display: none;}
+
+.mbui-layer .modal-footer:before {content: " "; pointer-events: none;  position: absolute;  top: 0;  left: 0;  width: 200%;  height: 0; border-top: 1px solid var(--color-gray-100);
+  -webkit-transform: scale(0.5);
+  transform: scale(0.5);
+  -webkit-transform-origin: 0 0;
+  transform-origin: 0 0;
+}
+.mbui-layer .modal-footer .btn { margin: 0; border: none; background: none; padding: 14px; width: 50%; text-align: center; float: left; color: var(--color-gray-900); font-size: 16px; border-bottom-left-radius: 4px; border-bottom-right-radius: 0; border-top-left-radius: 0; border-top-right-radius: 0; box-shadow: none; position: relative; box-sizing: border-box;}
+.mbui-layer .modal-footer .btn:before {display: none;}
+.mbui-layer .modal-footer .btn.active { color: var(--color-gray-900); font-weight: 600;}
+.mbui-layer .modal-footer .btn:active { background: rgba(0, 0, 0, 0.05);}
+.mbui-layer .modal-footer .btn + .btn { margin-left: 0; border-bottom-left-radius: 0; border-bottom-right-radius: 4px; border-top-left-radius: 0;border-top-right-radius: 0;}
+.mbui-layer .modal-footer .btn + .btn:after { content: " ";pointer-events: none; position: absolute;top: 0; left: 0; width: 200%; height: 200%;border-left: 1px solid var(--color-gray-100);
+  -webkit-transform: scale(0.5);
+  transform: scale(0.5);
+  -webkit-transform-origin: 0 0;
+  transform-origin: 0 0;
+}
+.mbui-layer .modal-footer .btn-block { width: 100%; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px;}
+.mbui-layer .mbui-form-input { height: 40px; padding: 10px;}
+.form-hairlines {position: relative;}
+.form-hairlines:before {content: " "; pointer-events: none; position: absolute; top: 0; left: 0; width: 200%; height: 200%; border: 1px solid var(--color-gray-300);  border-radius: 8px;
+  -webkit-transform: scale(0.5);
+  transform: scale(0.5);
+  -webkit-transform-origin: 0 0;
+  transform-origin: 0 0;
+  -webkit-border-radius: 8px;
+}
+.form-hairlines input,.form-hairlines textarea { border: none; border-radius: 3px;}
+
+.mbui-layer .modal-content.modal-actionsheet{max-width: 100%;width: 100%;position: fixed; margin: 0;left: 0; bottom: 0;background:#EDEDED;}
+.mbui-layer .modal-long .modal-body {padding: 0 16px;  max-height: 320px; overflow-y: auto; text-align: left;}
+
+.mbui-layer .modal-content.modal-actionsheet.bottom{
+	-webkit-animation: fade-in-up 300ms 0ms ease-in-out both;
+    animation: fade-in-up 300ms 0ms ease-in-out both;
+}
+@-webkit-keyframes fade-in-up {
+  0% {
+    -webkit-transform: translateY(200px);
+    transform: translateY(200px);
+  }
+  100% {
+    -webkit-transform: translateY(0);
+    transform: translateY(0);
+  }
+}
+.mbui-layer .modal-actionsheet .modal-body{padding:0;width:100%; text-align: left;}
+.mbui-layer .modal-actionsheet .modal-body .actionsheet-btn {width: 100%; background: var(--color-white); position: relative; border-radius: 0;  padding: 14px 20px; max-width: 100%; display: inline-block;  font-size: 16px; font-weight: 600; margin-bottom: 0; line-height: 1.42857143;  border: 0; text-align: center; white-space: nowrap; vertical-align: middle;touch-action: manipulation; cursor: pointer;
+    -webkit-user-select: none;
+    user-select: none;
+    background-image: none;
+    -webkit-appearance: none;
+}
+.mbui-layer .modal-actionsheet .modal-body .actionsheet-btn:after {content: " "; position: absolute; top: 0; left: 0;width: 200%; bottom: 0; height: 200%; border-bottom: 1px solid var(--color-gray-100);
+  -webkit-transform: scale(0.5);
+  transform: scale(0.5);
+  -webkit-transform-origin: 0 0;
+  transform-origin: 0 0;
+  pointer-events: none;
+}
+.mbui-layer .modal-actionsheet .modal-body .actionsheet-btn:first-child { border-top-left-radius: 12px;  border-top-right-radius: 12px;}
+.mbui-layer .modal-actionsheet .modal-footer { margin-top: 10px;}
+.mbui-layer .modal-actionsheet .modal-footer .btn { background: var(--color-white); border-radius: 0; padding: 14px 16px; max-width: 100%;}
+
+.mbui-layer .modal-content.modal-view{max-width: 100%;width: 100%;position: fixed; margin: 0;left: 0; top: 0;border-radius: 0 0 12px 12px;}
+.mbui-layer .modal-content.modal-view.top{
+	-webkit-animation: fade-in-down 300ms 0ms ease-in-out both;
+    animation: fade-in-down 300ms 0ms ease-in-out both;	
+}
+.mbui-layer .modal-view .modal-body{padding:0;width:100%; text-align: left;}
+
+/*layer - toast*/
+.mbui-toptips {font-size: 14px; width: 100%;z-index: 18888; padding: 10px;
+  -webkit-animation: fade-in-down 500ms 0ms ease both;
+  animation: fade-in-down 500ms 0ms ease both;
+  display: -webkit-box;
+  display: -webkit-flex;
+  display: flex;
+  -webkit-box-align: center;
+  -webkit-align-items: center;
+  align-items: center;
+}
+@-webkit-keyframes fade-in-down {
+  0% {
+    -webkit-transform: translateY(-40px);
+  }
+  100% {
+    -webkit-transform: translateY(0);
+  }
+}
+.mbui-toptips:before {content: " "; pointer-events: none; position: absolute; top: 0; left: 0; width: 200%; bottom: 0;  height: 200%;  border-bottom: 1px solid var(--color-gray-100);
+  -webkit-transform: scale(0.5);
+  transform: scale(0.5);
+  -webkit-transform-origin: 0 0;
+  transform-origin: 0 0;
+
+}
+.mbui-toptips i {width: 16px; height: 16px; min-width: 16px; display: inline-block; margin-right: 7px;overflow: hidden;
+  background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAABsCAMAAAAbkME5AAAA5FBMVEUAAAD/llrtUVXmoSbtUVbmoCbtUVXmoSbmoSXloSbtUFXmoSbuUVXmoSb/WVn/sjvmoSbooifvUlbyUljnpSbvU1bloSbtUVXtUFXmoCbmoCbtUVXtUVbmoSbtUVbnoiXlpCfwX1/wrS/tUVXsUVXsUFXtUFbmoSXsUFXloSXmoCXsUFbuUlXnoSbtUFbmoCXuUlbmoibsUFXloSbuUVbnoibsUVfnoCbuUVfooibwU1jmoiftUlvtpC71UlzroynsUFbsUlbtUFbuUVXloyntUFXloSbtUFXmoCbmoCXsUFXloCUgjMVLAAAASnRSTlMAA/r6xMS4rvblyMhkZAgIeUw7KChN7ezNzbeuoKBSUjsQEOT29fHx29u6r5OTj4+Ghmxsa2teXlhYNDQcHBkZ5Xp4RkWoqJmZPuxJ55cAAANkSURBVFjD7VbXcuowEJUhMZCAMb33hBZ6TSgJkG79///cXXsmLpKCPMzcp5w3r/bsaqtMGGiZkdrNBQK5rjrKaOQMGqvSveHAfWnVIGJop7bBoH0SuVGiB0slX57MqtXZpJy3vltRhaf/fIOHAXWxs2W7hRpA6c0zq79p4clDyitPPZhONl754x0aShIOkuj67tGjj2YGiiC4AZ66GBuwH4gSIaIB8LFxxHsA/VfyC16B0fqJXMFLuu1nVDXj9oEhKo6PgVvfALhdDmyj2sEkO1FCQsklwmscrJof4dCTzyskXHmyC6Kj2W9tqBc5TyBQwTZ24goylJIhpCBTK+u+KpEhENWMS4P+X8gRFjAfmpnBnRxhB8IMGUH/EzkCgfkY4cXKsoQyhts1jIksYWIYXZIzjJksYWYYOQLJrcoSqlAy3wTfV+IH/Y6Ed27Q/LQmkZDkppVXOGSUy0nCLZzdGiy4rWE3Hwtu87HtLQa2t2CASOp0Qhk7QIIRrcJZoMobUf4SUHIGIKcwqT4J1kzKMJHyrpmWJlhkDYvQYBaZcFV+ov4nuyqFy1g55vNHhVnG/te9/wfF/5Ml/yj6fnYvf9gR2pH363DULvo5Ofv784c//D/EE+NiLxsMZnvFcSJ+Tru5DoWpA+HQuvmbcb1DGXR0kRslFrFUCpXpvFabTysF6zsS447oyy0eBvvLvS3bL/tBlN6+sPpb03wo7ZWnQ6aTrVf+FEZDdcJBHV2Hnzz6FDAUrcohnroYW7AfjBEhYkHwsXXEGwH9N/IL3oAR+YlcwUu67SeKxYTbB4aoOD6Gbn0KcDOGttF4xCQ7ETJT7BLhNSJWzXU49OTzGgnXnuyCSDf7rYPGzhPQbQc7cQ0ZSssQ0pCptUXsExkC6ZtXiUPNlnKEJVQvbmZwL0fYm7keQ/8TOQKB+RiTIqUVWUKF0iLpUTqVJUwp7ZEspXNZwpzSLIHk1mQJNSiZb4LvK/GD/kDCBzdoflq/kfDNTSu/cKReqdQJt3B2a7DgtobdfCy4zce2txjY3oIBImldRxk7QIIRrcFZsMYbUf4SULIUkFXYJSBYM2lqIs2uGcEia1qEJrPIhKvyC/W/2FUpXMaKXijoCrOM/a97/w+K/ydL/lG89NmVf9jlfx3kf04u/P35BwHDLihDV8YIAAAAAElFTkSuQmCC") no-repeat;
+  background-size: 16px; 
+}
+.mbui-toptips i.mbui-toptips-error-icon {background-position: 0 0;}
+.mbui-toptips i.mbui-toptips-warning-icon {background-position: 0 -20px;}
+.mbui-toptips.mbui-toptips-warning { background: var(--color-yellow-100); color: var(--color-yellow-600);}
+.mbui-toptips.mbui-toptips-warning > a {color: var(--color-yellow-600);}
+.mbui-toptips.mbui-toptips-error { background: var(--color-red-100); color: var(--color-red-600);}
+.mbui-toptips.mbui-toptips-error > a { color: var(--color-red-600);}
+.mbui-toptips.fixed{position: fixed !important;right: 0; left: 0; top: 0;z-index: 10;}
+.mbui-toast{position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 888; overflow: hidden; outline: 0; text-align: center; background-color:var(--black-shadow));
+  -webkit-overflow-scrolling: touch; 
+}
+.mbui-toast-dialog { width: 100%; height: 100%;
+  display: -webkit-box;
+  display: -ms-flexbox;
+  display: -webkit-flex;
+  display: flex;
+  -webkit-box-pack: center;
+  -webkit-justify-content: center;
+  justify-content: center;
+  -webkit-box-align: center;
+  -webkit-align-items: center;
+  align-items: center;
+  -webkit-animation: fade-in-up 100ms 0ms ease-in-out both;
+   animation: fade-in-up 100ms 0ms ease-in-out both;
+}
+.mbui-toast-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1040;}
+.mbui-toast-content { position: relative; min-width: 126px; display: inline-block; background: var(--black-shadow); text-align: center; border-radius: 6px; margin-top:-20%; color: var(--color-white); font-size: 16px;}
+.mbui-toast-content > span {padding:12px 16px;display: block;}
+.mbui-toast-success .mbui-toast-content {min-height: 120px;}
+.mbui-toast-success .mbui-toast-content .mbui-toast-success-icon {width: 44px; height: 44px; display: block; margin: 6px auto 10px;
+  background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAACQCAMAAADQmBKKAAAAnFBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+TINBkAAAAM3RSTlMA/PL47DQCCINDKgTalRXjil5wTx7VeA7f0MS2s6Q6JBIM5smvwVdqP7uckWJLMBoZzHzNBA+9AAADrElEQVR42u3ciXLaMBSF4eMdsFlCIOw7JGRrSM/7v1vbDJ0GZNkhN+RqpnxPoIll/bIcg4uLi//H82gLhyzqpD+HM6YZf7uBI9KKxz8yuKE24F4EB8TtgH9VoK+z4T9rqLvy+c4YyhYTHniErijjgU0CVe2AB1YLaJqPeWgwh6Ztk4e6DSiKf3o8lO2g6GXDI/0OFFWXPLKcQdGNxyNhDXp6ax4Lf0BPLeMxP4KeW98czxRq0kcavGeo2Q1peoKaaEnTT6i5CmiqQ0vcYo51DCW9EXMMEyiZdZmjO4eSasgczQ6U3L3Fy5mAxXXmCbbQsRgz1y107F6Z6wY6an3mmkBH1SddWoCeAubqN6Ciwnx+DRrSB/7hzA4oGdOiDQ3zIS0eoOGlS4v7FApmfVpkcyiIQlr4Myio+rS5hoLrgDYVKLj1aDOK8f2e7OPpa0zoO1oFGmcKN7S7goA0p448E7ZoN1RYoYvGs9yhzLeOx5tCQDQeZ/b0heMZ4TN622lynvEsG/iEO59sPsvvd5NXxenSunGxBeuhPKm9e+5NEpyszSKbWHZ+s9pJ+mUKX3CybXgwBSOc5IqFnuXHkcEtTnDtsUgLJ2uJpmE1YJFVihMt1syxXuBjIp8G0ab+5ZW5Bh18RC1koTucKH6lRThFuU6ThcY4VUSr4All5hkLhQ3JgEyPMQolQxqkT2HxqjDScxSI1yz2AIN0FmQz2NVZrL+AQXyfhNXioJ66SZSvJF4b+W5ZogIL6Vr7kCLHNGCxQQoLcY02DRhmIYt5P2Aj73W/hiO9ruCCyXdY9I8WlHjEEt1E/Axc7MayPxDeYYJFZZIYV7hAC3ITFlu9YC8KWCJLIJeOacrb2Tb6LLPFV0g2NJk72/ieZer4Gr0BS7QSJBOWaS7wRRoZS4Qrn6WuIWCkX24NCTP9Un4HImb6hdoQMtMvMoghZaZfwIvw5a4oUMcZtPlpyx4szpl+hcP6Oj9niHOZODOj99IRS8kfDOXpFzzJnzf98qMXefrLdVNYKKW/Cgul9I9hoZR+r4azM9Ov/wLzw+n3Gzg3M/1uvKD7WPqbCc7OTL8rr+TrLNWN8Y3iCfdc+Sec0vSv8M2SoUI0BOm/h8A50h9BSp5+B74Ftaf/B8Tk6Xfi691q4NQf6C397swge/qn0NR2Yg16r6K/SBen/xXa4okTX4vY0t+Poe99+ttwwb/0+ws4oZE58osGx+kPZnBF7W1EP+GOxmN39YSLi4uLiwt9vwAkwFFwKPIJrgAAAABJRU5ErkJggg==") no-repeat;
+  background-size: 44px;
+}
+.mbui-toast-loading .mbui-toast-content {min-height: 126px;}
+.mbui-toast-loading_icon {position: relative; width: 44px; height: 44px; display: block; margin: 4px auto 16px;}
+.loading-icon-leaf {position: absolute; opacity: 0.25; left: 21px; top: 21px;}
+.loading-icon-leaf:before {content: " "; position: absolute; width: 8.14px; height: 3.08px; background: var(--color-gray-300); box-shadow: rgba(0, 0, 0, 0.0980392) 0px 0px 1px; border-radius: 1px; transform-origin: left 50% 0px;}
+.loading-icon-leaf_0 {
+  -webkit-animation: opacity-60-25-0-12 1.25s linear infinite;
+  animation: opacity-60-25-0-12 1.25s linear infinite;
+}
+.loading-icon-leaf_0:before {
+  -webkit-transform: rotate(0deg) translate(7.92px, 0px);
+  transform: rotate(0deg) translate(7.92px, 0px);
+}
+.loading-icon-leaf_1 {
+  -webkit-animation: opacity-60-25-1-12 1.25s linear infinite;
+  animation: opacity-60-25-1-12 1.25s linear infinite;
+}
+.loading-icon-leaf_1:before {
+  -webkit-transform: rotate(30deg) translate(7.92px, 0px);
+  transform: rotate(30deg) translate(7.92px, 0px);
+}
+.loading-icon-leaf_2 {
+  -webkit-animation: opacity-60-25-2-12 1.25s linear infinite;
+  animation: opacity-60-25-2-12 1.25s linear infinite;
+}
+.loading-icon-leaf_2:before {
+  -webkit-transform: rotate(60deg) translate(7.92px, 0px);
+  transform: rotate(60deg) translate(7.92px, 0px);
+}
+.loading-icon-leaf_3 {
+  -webkit-animation: opacity-60-25-3-12 1.25s linear infinite;
+  animation: opacity-60-25-3-12 1.25s linear infinite;
+}
+.loading-icon-leaf_3:before {
+  -webkit-transform: rotate(90deg) translate(7.92px, 0px);
+  transform: rotate(90deg) translate(7.92px, 0px);
+}
+.loading-icon-leaf_4 {
+  -webkit-animation: opacity-60-25-4-12 1.25s linear infinite;
+  animation: opacity-60-25-4-12 1.25s linear infinite;
+}
+.loading-icon-leaf_4:before {
+  -webkit-transform: rotate(120deg) translate(7.92px, 0px);
+  transform: rotate(120deg) translate(7.92px, 0px);
+}
+.loading-icon-leaf_5 {
+  -webkit-animation: opacity-60-25-5-12 1.25s linear infinite;
+  animation: opacity-60-25-5-12 1.25s linear infinite;
+}
+.loading-icon-leaf_5:before {
+  -webkit-transform: rotate(150deg) translate(7.92px, 0px);
+  transform: rotate(150deg) translate(7.92px, 0px);
+}
+.loading-icon-leaf_6 {
+  -webkit-animation: opacity-60-25-6-12 1.25s linear infinite;
+  animation: opacity-60-25-6-12 1.25s linear infinite;
+}
+.loading-icon-leaf_6:before {
+  -webkit-transform: rotate(180deg) translate(7.92px, 0px);
+  transform: rotate(180deg) translate(7.92px, 0px);
+}
+.loading-icon-leaf_7 {
+  -webkit-animation: opacity-60-25-7-12 1.25s linear infinite;
+  animation: opacity-60-25-7-12 1.25s linear infinite;
+}
+.loading-icon-leaf_7:before {
+  -webkit-transform: rotate(210deg) translate(7.92px, 0px);
+  transform: rotate(210deg) translate(7.92px, 0px);
+}
+.loading-icon-leaf_8 {
+  -webkit-animation: opacity-60-25-8-12 1.25s linear infinite;
+  animation: opacity-60-25-8-12 1.25s linear infinite;
+}
+.loading-icon-leaf_8:before {
+  -webkit-transform: rotate(240deg) translate(7.92px, 0px);
+  transform: rotate(240deg) translate(7.92px, 0px);
+}
+.loading-icon-leaf_9 {
+  -webkit-animation: opacity-60-25-9-12 1.25s linear infinite;
+  animation: opacity-60-25-9-12 1.25s linear infinite;
+}
+.loading-icon-leaf_9:before {
+  -webkit-transform: rotate(270deg) translate(7.92px, 0px);
+  transform: rotate(270deg) translate(7.92px, 0px);
+}
+.loading-icon-leaf_10 {
+  -webkit-animation: opacity-60-25-10-12 1.25s linear infinite;
+  animation: opacity-60-25-10-12 1.25s linear infinite;
+}
+.loading-icon-leaf_10:before {
+  -webkit-transform: rotate(300deg) translate(7.92px, 0px);
+  transform: rotate(300deg) translate(7.92px, 0px);
+}
+.loading-icon-leaf_11 {
+  -webkit-animation: opacity-60-25-11-12 1.25s linear infinite;
+  animation: opacity-60-25-11-12 1.25s linear infinite;
+}
+.loading-icon-leaf_11:before {
+  -webkit-transform: rotate(330deg) translate(7.92px, 0px);
+  transform: rotate(330deg) translate(7.92px, 0px);
+}
+@-webkit-keyframes opacity-60-25-0-12 {
+  0% {
+    opacity: 0.25;
+  }
+  0.01% {
+    opacity: 0.25;
+  }
+  0.02% {
+    opacity: 1;
+  }
+  60.01% {
+    opacity: 0.25;
+  }
+  100% {
+    opacity: 0.25;
+  }
+}
+@-webkit-keyframes opacity-60-25-1-12 {
+  0% {
+    opacity: 0.25;
+  }
+  8.34333% {
+    opacity: 0.25;
+  }
+  8.35333% {
+    opacity: 1;
+  }
+  68.3433% {
+    opacity: 0.25;
+  }
+  100% {
+    opacity: 0.25;
+  }
+}
+@-webkit-keyframes opacity-60-25-2-12 {
+  0% {
+    opacity: 0.25;
+  }
+  16.6767% {
+    opacity: 0.25;
+  }
+  16.6867% {
+    opacity: 1;
+  }
+  76.6767% {
+    opacity: 0.25;
+  }
+  100% {
+    opacity: 0.25;
+  }
+}
+@-webkit-keyframes opacity-60-25-3-12 {
+  0% {
+    opacity: 0.25;
+  }
+  25.01% {
+    opacity: 0.25;
+  }
+  25.02% {
+    opacity: 1;
+  }
+  85.01% {
+    opacity: 0.25;
+  }
+  100% {
+    opacity: 0.25;
+  }
+}
+@-webkit-keyframes opacity-60-25-4-12 {
+  0% {
+    opacity: 0.25;
+  }
+  33.3433% {
+    opacity: 0.25;
+  }
+  33.3533% {
+    opacity: 1;
+  }
+  93.3433% {
+    opacity: 0.25;
+  }
+  100% {
+    opacity: 0.25;
+  }
+}
+@-webkit-keyframes opacity-60-25-5-12 {
+  0% {
+    opacity: 0.270958333333333;
+  }
+  41.6767% {
+    opacity: 0.25;
+  }
+  41.6867% {
+    opacity: 1;
+  }
+  1.67667% {
+    opacity: 0.25;
+  }
+  100% {
+    opacity: 0.270958333333333;
+  }
+}
+@-webkit-keyframes opacity-60-25-6-12 {
+  0% {
+    opacity: 0.375125;
+  }
+  50.01% {
+    opacity: 0.25;
+  }
+  50.02% {
+    opacity: 1;
+  }
+  10.01% {
+    opacity: 0.25;
+  }
+  100% {
+    opacity: 0.375125;
+  }
+}
+@-webkit-keyframes opacity-60-25-7-12 {
+  0% {
+    opacity: 0.479291666666667;
+  }
+  58.3433% {
+    opacity: 0.25;
+  }
+  58.3533% {
+    opacity: 1;
+  }
+  18.3433% {
+    opacity: 0.25;
+  }
+  100% {
+    opacity: 0.479291666666667;
+  }
+}
+@-webkit-keyframes opacity-60-25-8-12 {
+  0% {
+    opacity: 0.583458333333333;
+  }
+  66.6767% {
+    opacity: 0.25;
+  }
+  66.6867% {
+    opacity: 1;
+  }
+  26.6767% {
+    opacity: 0.25;
+  }
+  100% {
+    opacity: 0.583458333333333;
+  }
+}
+@-webkit-keyframes opacity-60-25-9-12 {
+  0% {
+    opacity: 0.687625;
+  }
+  75.01% {
+    opacity: 0.25;
+  }
+  75.02% {
+    opacity: 1;
+  }
+  35.01% {
+    opacity: 0.25;
+  }
+  100% {
+    opacity: 0.687625;
+  }
+}
+@-webkit-keyframes opacity-60-25-10-12 {
+  0% {
+    opacity: 0.791791666666667;
+  }
+  83.3433% {
+    opacity: 0.25;
+  }
+  83.3533% {
+    opacity: 1;
+  }
+  43.3433% {
+    opacity: 0.25;
+  }
+  100% {
+    opacity: 0.791791666666667;
+  }
+}
+@-webkit-keyframes opacity-60-25-11-12 {
+  0% {
+    opacity: 0.895958333333333;
+  }
+  91.6767% {
+    opacity: 0.25;
+  }
+  91.6867% {
+    opacity: 1;
+  }
+  51.6767% {
+    opacity: 0.25;
+  }
+  100% {
+    opacity: 0.895958333333333;
+  }
+}
+/*layer-photo*/
+.layer-image-photo {display: none; position: fixed;top: 0;left: 0; width: 100%; height: 100%; background-color: var(--black-shadow);z-index: 9999; display: flex;align-items: center; justify-content: center;}
+.layer-image-photo img { max-width: 96%; max-height: 96%; margin-top:-2%;display: block;}
+
+/*flex-panel*/
+.mbui-flex-panel{display:flex;flex:1;align-items:flex-start;font-size:0}
+.mbui-flex-avatar{margin-right:12px}
+.mbui-flex-avatar-img{width: 72px; height:72px;}
+.mbui-flex-avatar-img img{width: 100%; height:100%; border-radius: 4px;} 
+.mbui-flex-content{color: var(--color-gray-900);}
+.mbui-flex-title{font-weight:600;font-size:16px;}
+.mbui-flex-description{font-size:14px; line-height:1.5}
+.mbui-section-title{padding:12px; position: relative; line-height:1.36; font-size:14px; display: flex;align-items: center; justify-content:space-between}
+/*文件上传*/
+.mbui-file-list .mbui-file-div{display: flex;align-items: center; padding: 6px 32px 6px 6px; background-color:var(--color-gray-100);border-radius:4px;line-height:1.8;position:relative;margin-bottom:12px;}
+.mbui-file-div .mbui-file-icon{width:45px;height:45px; line-height:45px; margin-right:8px; overflow:hidden}
+.mbui-file-div .mbui-file-icon.file-img{width:80px;}
+.mbui-file-div .mbui-file-icon img{width:100%;height:100%;border-radius:3px;object-fit: cover;}
+.mbui-file-div .mbui-file-icon i{font-size:40px;}
+.mbui-file-div .mbui-file-name {font-size:15px;}
+.mbui-file-div .mbui-file-size {font-size: 12px;color: var(--color-gray-400);}
+.mbui-file-div .mbui-file-del{ width: 30px; height: 30px;position:absolute;top:16px; right:2px; font-size:20px;line-height:28px; text-align:center; color:var(--color-gray-500);}
+
+/*人员选择*/
+.mbui-picker-selector {background-color:var(--color-white);width:100%;height:100vh;position:fixed;top:0;left:0;z-index:999;}
+.mbui-picker-selector .mbui-bar:before { content: " ";pointer-events: none; position: absolute; bottom: 0; left: 0; width: 200%; height: 0; border-top: 1px solid var(--color-gray-100);
+ -webkit-transform: scale(0.5);
+    transform: scale(0.5);
+    -webkit-transform-origin: 0 0;
+    transform-origin: 0 0;
+}
+.mbui-picker-item{margin: 0;padding: 12px; color: var(--color-gray-900); text-align: left; background: var(--color-white); position: relative;
+  display: -webkit-box;
+  display: -webkit-flex;
+  display: flex;
+  -webkit-box-align: center;
+  -webkit-align-items: center;
+  align-items: center;
+}
+.mbui-picker-item:before{ content: " ";pointer-events: none; position: absolute; bottom: 0; left: 0; width: 200%; height: 0; border-top: 1px solid var(--color-gray-100);
+ -webkit-transform: scale(0.5);
+    transform: scale(0.5);
+    -webkit-transform-origin: 0 0;
+    transform-origin: 0 0;
+}
+
+.mbui-picker-selector .letters {display: flex; flex-direction: column; align-items: center; position: fixed; top: 50%; right: 0; z-index:999; width:36px; text-align:center; transform: translateY(-50%);}
+.mbui-picker-selector .letters a { margin: 2px; text-decoration: none; font-size:12px; color: var(--color-gray-900);}
+.mbui-picker-selector .contacts{ padding: 0; margin:0; height:100vh; overflow-y:auto;}
+.mbui-picker-selector .contacts .mbui-contacts-title{padding:8px 16px; background-color:var(--color-gray-50); font-size:12px; color:var(--color-gray-400);}
+.mbui-picker-selector .lists{padding: 0; margin:0; height:calc(100vh - 46px); overflow-y:auto;}
+/*picker-radio*/
+.mbui-picker-item .mbui-input-radio{width: 19px; height: 19px; margin-left:4px; appearance: none; position: relative;}
+.mbui-picker-item .mbui-input-radio:before{content: ''; width: 19px; height: 19px; border: 1px solid var(--color-gray-400); display: inline-block; border-radius: 50%; vertical-align: bottom;}
+.mbui-picker-item .mbui-input-radio:checked:before{ content: ''; width: 19px; height: 19px; border: 1px solid var(--color-blue-600); background:var(--color-blue-600); display: inline-block; border-radius: 50%; vertical-align: bottom;}
+.mbui-picker-item .mbui-input-radio:checked:after{ content: ''; width: 10px; height:5px;border: 2px solid var(--color-white); border-top: transparent; border-right: transparent;text-align: center; display: block; position: absolute; top: 6px; left:5px; vertical-align: bottom; transform: rotate(-45deg);}
+
+/*picker-checkbox*/
+.mbui-picker-item .mbui-input-checkbox{width: 19px; height: 19px; margin-left:4px; appearance: none; position: relative;}
+.mbui-picker-item .mbui-input-checkbox:before{content: ''; width: 19px; height: 19px; border: 1px solid var(--color-gray-400); display: inline-block; border-radius: 3px; vertical-align: bottom;}
+.mbui-picker-item .mbui-input-checkbox:checked:before{ content: ''; width: 19px; height: 19px; border: 1px solid var(--color-blue-600); background:var(--color-blue-600); display: inline-block; border-radius: 3px; vertical-align: bottom;}
+.mbui-picker-item .mbui-input-checkbox:checked:after{ content: ''; width: 10px; height:5px;border: 2px solid var(--color-white); border-top: transparent; border-right: transparent;text-align: center; display: block; position: absolute; top: 6px; left:5px; vertical-align: middle; transform: rotate(-45deg);}
+
+.mbui-picker-item .mbui-picker-avatar{margin-left:12px; margin-right:8px;}
+
+/*comment*/
+.mbui-comment-box{display: flex; align-items:flex-start; background-color:var(--color-white); padding:12px;}
+.mbui-comment-box .comment-avatar{width: 32px;}
+.mbui-comment-box .comment-image{width:32px; height:32px; border-radius:50%}
+
+.mbui-comment-box .comment-body{font-size:16px; margin-left:12px; line-height:1.5; width:100%;}
+.mbui-comment-box .comment-meta span{margin-right:12px; font-size:12px; color:var(--color-gray-400);}
+.mbui-comment-box .comment-content{padding:4px 0;}
+.mbui-comment-box .comment-actions a{color:var(--color-blue-400); cursor:pointer; font-size:12px;}
+.mbui-comment-box .comment-actions a:hover{color:var(--color-blue-600);}
+.mbui-comment-box fieldset{border:1px solid var(--color-gray-200); border-radius:3px; background-color:var(--color-gray-100); color:var(--color-gray-500); font-size:14px; padding:8px;}
+.mbui-comment-box .comment-btn{margin:4px 0;}
+
+/*img*/
+.mbui-img-cover{width:100%; position:relative; padding-top: 100%; border-radius: 3px; overflow: hidden; background-color: var(--color-gray-100);}
+.mbui-img-cover.img3-2{padding-top: 66.666666%;}
+.mbui-img-cover.img4-3{padding-top: 75%;}
+.mbui-img-cover.img16-9{padding-top: 56.25%;}
+.mbui-img-cover.img16-10{padding-top: 62.5%;}
+.mbui-img-cover img{width: 100%; height: 100%; object-fit: cover; position: absolute; top: 0; left:0; border-radius:3px;}
+
+/*pagebox*/
+.mbui-pagebox{width:100%; text-align:center; font-size:14px;}
+.mbui-pagebox a,.mbui-pagebox span{min-width:16px; height:33px; line-height:33px;  margin:0 4px; padding:0 10px; color:var(--color-gray-700); border-radius:1px; text-align:center; border:1px solid var(--color-gray-300); background-color:var(--color-white); display:inline-block;}
+.mbui-pagebox span{background-color:var(--color-blue-600); color:var(--color-white); border:1px solid var(--color-blue-600);}
+.mbui-data-none{padding:30px 0; text-align: center; color:var(--color-gray-400);}
+.mbui-data-none img{width:200px}
+
+/*bar*/
+.mobile-bar{padding: 12px; position: relative; align-items: center; line-height: 1.41176471; font-size: 16px; color: var(--color-gray-900);
+    display: -webkit-box;
+    display: -webkit-flex;
+    display: flex;
+    -webkit-box-align: center;
+    -webkit-align-items: center;
+	justify-content: space-between;
+}
+.mobile-bar::after{content: " ";position: absolute; left: 0;bottom: 0; right: 0; height: 1px; border-top: 1px solid var(--color-gray-100);  color: var(--color-gray-100); z-index: 2;
+    -webkit-transform-origin: 0 0;
+    transform-origin: 0 0;
+    -webkit-transform: scaleY(0.5);
+    transform: scaleY(0.5);
+}
+.mobile-bar-title{font-size:16px; font-weight:800;}
+.tabbar-space{width: 100%; height:60px;}
+
+
+/*calendar*/
+.calendar {background-color:var(--color-white); font-size: 14px; color: var(--color-black);}
+.calendar-header{background-color: #3875C5;padding: 12px 16px;text-align: center; position:relative;}
+.calendar-select {line-height: 1.5;color: var(--color-gray-500);margin: 0;padding: 0;list-style: none;display: inline-block;position: relative;outline: 0;box-sizing: border-box;}
+.calendar-column-header,.calendar-cell {width: 14%}
+.calendar-column-header{font-weight: 400;text-align: center; line-height:2;}
+.calendar-header i {position: absolute;top: 50%; width: 30px; height: 30px; margin-top: -15px; font-size: 16px;line-height: 30px;text-align: center; cursor: pointer;}
+.calendar-header i.calendar-next {right: 12px;}
+.calendar-header i.calendar-pre{left:12px;}
+.calendar-header i:after {position: absolute; top: 50%;left: 50%; content: ''; width: 14px; height: 14px; margin-top: -7px;  margin-left: -5px; border-top:2px solid var(--color-white); border-left: 2px solid var(--color-white);}
+.calendar-pre:after {transform: rotateZ(-45deg);}
+.calendar-next:after {transform: rotateZ(135deg);}
+
+.calendar-table{width:100%;table-layout: fixed;}
+.calendar-cell{font-size: 12px;color: var(--color-gray-500);}
+.calendar-cell.calendar-last-month-cell,.calendar-cell.calendar-next-month-cell {color:var(--color-gray-300);}
+.calendar-date {margin: 0 4px;}
+.calendar-cell.calendar-thisMonth .calendar-date,.calendar-cell.calendar-today .calendar-date {background-color: var(--color-blue-50);border-radius:4px;color:var(--color-blue-600)}
+.calendar-cell.calendar-today .calendar-date {background-color:var(--color-blue-600);border-radius:4px;color:var(--color-white)}
+.calendar-date:hover{background: var(--color-blue-100);border-radius:4px;}
+.calendar-value {text-align: center;height: 44px;line-height:44px;position: relative;font-size:16px;width: 100%;}
+.calendar-event {position:absolute;width:6px;height:6px;border-radius:50%;background-color:var(--color-red-600);top:6px;right:6px;}
+.calendar-select {font-size: 18px;vertical-align: middle;color: var(--color-white)}
+.calendar-year-text,.calendar-month-text {line-height: 30px;padding:0 10px;}
+/*calendar-dropdown*/
+ul.dropdown-month,.dropdown-month li,ul.dropdown-year, .dropdown-year li {list-style: none;text-align: center;padding: 0;margin: 0;}
+.dropdown-month.open,.dropdown-year.open {display: inline-block;margin-top: 1px;width: 100%;}
+.dropdown-month, .dropdown-year {height: 240px;overflow-y: auto;overflow-x: hidden;display: none;position: absolute;left: 0;top: 100%;background: var(--color-white);width: 50px;border: 1px solid #eee;z-index:1;box-shadow: 0px 6px 12px rgba(0,0,0,0.175);-webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175)}
+.dropdown-month .month-item,.dropdown-year .year-item {font-size: 14px;position: relative;display: block;padding: 6px 3px;line-height: 22px;font-weight: normal;color:var(--color-gray-500);white-space: nowrap;overflow: hidden;text-overflow: ellipsis;-webkit-transition: background 0.3s ease;transition: background 0.3s ease;}
+.month-item:hover,.year-item:hover{background: var(--color-blue-50);}
+.year-item.active {background-color: var(--color-gray-100);font-weight: 600;color: rgba(0, 0, 0, 0.65);}
+
+/*loadData*/
+.load-data-list{width:100%; box-sizing:border-box;}
+.load-data-list a{width:100%; display:block; box-sizing: border-box;}
+.load-data-list dl{background-color:var(--color-white); padding:12px;}
+.load-data-list dt{margin-bottom:6px;}
+.load-data-list dd{line-height:24px;}
+.load-data-span i{color:var(--color-gray-400);}
+.load-data-span + .load-data-span{margin-left: 16px;}
+.load-data-none{padding-top:50px; padding-bottom:20px; color:var(--color-gray-400); text-align:center; display:none;}
+.load-data-none.load-data-0{display:block;}
+.load-data-none i{font-size:24px;}
+.load-data-loading {padding:12px 0;text-align:center;}
+.load-data-loading span{white-space: nowrap; display: inline-block; padding-right:20px; height: 24px; line-height:24px; position: relative; color:var(--color-gray-400)}
+.load-data-loading span:after {content: '.'; color: var(--color-blue-600); animation: loading-dots 1.2s infinite; font-size: 26px; position: absolute; bottom: 8px; left: 88%;}
+@keyframes loading-dots {
+    0%,100% {
+      content: '.';
+	  color:var(--color-green-600);
+    }
+    25% {
+      content: '..';
+	  color:var(--color-blue-600);
+    }
+    50% {
+      content: '...';
+	  color:var(--color-orange-600);
+    }
+    75% {
+      content: '';
+	  color:var(--color-yellow-600);
+    }
+}
+.load-data-end{text-align:center; color:var(--color-gray-300); padding:8px 0}
+
+/*flow-check*/
+.flow-flex-row {box-direction: row;box-orient: horizontal;
+    -webkit-box-orient: horizontal;
+    -ms-flex-direction: row;
+    flex-direction: row;
+}
+.flow-flexbox { width: 100%;text-align: left;display: flex;box-align: center;align-items: center;flex-wrap: wrap; line-height:1.2;}
+.check-item{width: auto; -ms-flex-negative: 0; flex-shrink: 0; padding:4px 0}
+.check-item i{margin-right:3px; color:var(--color-gray-500);}
+.check-item span{color:var(--color-gray-400);margin:0 3px;}
+.check-item .iconfont {font-size:18px;}
+.check-item .iconfont.icon-arrow{font-size:12px;}
+.iconfont[data-ok]{color:var(--color-green-600)}
+.iconfont[data-no]{color:var(--color-red-600);}
+.check-item-status{color:var(--color-gray-400); font-size:12px; margin-left:3px;}
+
+/*fixed-bar*/
+.mbui-fixed-bar {position: fixed; bottom:160px; height:44px; left:8px;z-index: 8;}
+.fixed-bar-box {padding:4px;z-index: 8;border-radius:50%; position: relative; background-color:var(--color-blue-500);}
+
+.fixed-bar-btn {position: relative; border: none; background: var(--color-white); width: 36px; height: 36px; border-radius: 50%; line-height: 36px; display: flex; flex-direction: column; justify-content: center; align-items: center; cursor: pointer; z-index: 9;}
+.fixed-bar-btn:focus {border: none;}
+
+.fixed-bar-btn.active .menutoggle:before,
+.fixed-bar-btn.active .menutoggle:after,
+.fixed-bar-btn.active .menutoggle span {animation: none;}
+.fixed-bar-btn.active .menutoggle span { opacity: 0;}
+
+.fixed-bar-btn.active .menutoggle:before {
+    transform: translateY(7px) rotate(135deg);
+}
+
+.fixed-bar-btn.active .menutoggle:after {
+    transform: translateY(-7px) rotate(-135deg);
+}
+
+span.menutoggle {width: 24px; height: 24px; position: relative;cursor: pointer; display: block;}
+span.menutoggle:before,
+span.menutoggle:after,
+span.menutoggle span { background: var(--color-blue-600); content: "";  display: block;  height: 3px;  border-radius: 8px; margin: 4px 0; transition: 0.5s;}
+
+.fixed-bar-item {position: relative; width: 44px; height: 44px; border-radius: 50%; transform: translatey(-100%); opacity: 0; visibility: hidden;}
+.fixed-bar-item.open {opacity: 1; visibility: visible;}
+.fixed-bar-item a {width: 44px; height: 44px; border-radius: 50%; background-color: var(--color-gray-200); font-size: 12px; text-align: center; position: absolute; right: -24px; top: 0;  bottom: 0; color: #ffffff; transition-duration: 0.3s; display: flex; flex-direction: column; justify-content: center; align-items: center; cursor: pointer; line-height:1.32;}
+.fixed-bar-item.open a:nth-of-type(1) {
+    transform: rotate(-90deg) translateX(80px) rotate(90deg);
+    transition-delay: 0s;
+    background: var(--color-purple-600);
+}
+
+.fixed-bar-item.open a:nth-of-type(2) {
+    transform: rotate(-45deg) translateX(80px) rotate(45deg);
+    transition-delay: 0.1s;
+    background: var(--color-orange-600);
+}
+
+.fixed-bar-item.open a:nth-of-type(3) {
+    transform: rotate(0deg) translateX(80px) rotate(0deg);
+    transition-delay: 0.2s;
+    background: var(--color-blue-600);
+}
+
+.fixed-bar-item.open a:nth-of-type(4) {
+    transform: rotate(45deg) translateX(80px) rotate(-45deg);
+    transition-delay: 0.3s;
+    background: var(--color-cyan-600);
+
+}
+
+.fixed-bar-item.open a:nth-of-type(5) {
+    transform: rotate(90deg) translateX(80px) rotate(-90deg);
+    transition-delay: 0.4s;
+    background: var(--color-green-600);
+}
+
+
+/*picker*/
+.lay-picker {position: fixed;left: 0;top: 0;width: 100%;height: 100%;z-index: 99999999999999;display: none;overflow: hidden;}
+.lay-picker-shade {position: absolute;left: 0;top: 0;width: 100%;height: 100%;background: var(--black-shadow);z-index: 9;}
+.lay-picker-container {position: absolute;left: 0;bottom: 0;z-index: 99;width: 100%;background: var(--color-white);color: var(--color-gray-900);font-size: 16px;
+	-webkit-transition: transform .25s;
+	-webkit-transform: translate3d(0, 100%, 0);
+	transition: transform .25s;
+	transform: translate3d(0, 100%, 0);
+}
+
+.lay-picker-header {height: 50px;line-height: 50px;border-bottom: 1px solid #f3f3f3;margin-bottom: 1px;margin: 0px 12px;}
+.lay-picker-title {text-align: center;position: absolute;top: 0;left: 0;z-index: 9;width: 100%;color: var(--color-gray-900);}
+.lay-picker-search{margin: 0 12px; text-align: center; padding: 5px 0;}
+.lay-picker-search input{text-align: center; height: 40px; line-height: 40px; border: none; border-bottom: 1px solid var(--color-gray-200);font-size: 14px;
+    transition: all .2s;
+    -webkit-transition: all .2s;
+    box-shadow: none!important;
+}
+.lay-picker-search input:hover,.lay-picker-search input:focus{ border: none!important; border-bottom: 1px solid var(--color-gray-200)!important;}
+.lay-picker-btn {position: relative;z-index: 99;}
+.lay-picker-cancel {color: var(--color-gray-500);}
+.lay-picker-clear {margin-left:12px;color: var(--color-orange-600);}
+.lay-picker-confirm {float: right;color: var(--color-blue-600);}
+
+.lay-picker-shadowup,.lay-picker-shadowdown {height: 120px;width: 100%;position: absolute;left: 0;z-index: 50;}
+.lay-picker-shadowup {height: 115px;top: -1px;
+	background: -webkit-linear-gradient(to bottom, var(--color-white), rgba(255, 255, 255, .6));
+	background: linear-gradient(to bottom, var(--color-white), rgba(255, 255, 255, .6));
+	pointer-events: none;
+	border-bottom: 1px solid var(--color-gray-200);
+}
+
+.lay-picker-shadowdown {height: 130px;bottom: 0;
+	background: -webkit-linear-gradient(to top, var(--color-white), rgba(255, 255, 255, .6));
+	background: linear-gradient(to top, var(--color-white), rgba(255, 255, 255, .6));
+	pointer-events: none;
+	border-top: 1px solid var(--color-gray-200);
+}
+
+.lay-picker-content {position: relative;height: 300px;margin: 15px;overflow: hidden;}
+.lay-picker-box {overflow: hidden;}
+.lay-picker-box:after {display: table;height: 0;clear: both;content: '';}
+.lay-picker-list-wrap {float: left;height: 300px;overflow: hidden;
+	-webkit-transition: width .2s;
+	transition: width .2s;
+}
+.lay-picker-list-wrap ul {position: relative;padding: 100px 0;margin-top: 16px;
+	-webkit-transition: transform .1s ease-out;
+	transition: transform .1s ease-out;
+}
+.lay-picker-list-wrap ul:after {position: absolute;top: 0;left: 0;right: 0;bottom: 0;z-index: 55;content: '';}
+.lay-picker-list-wrap li {line-height: 50px;height: 50px;text-align: center;white-space: nowrap;text-overflow: ellipsis;overflow: hidden;}
+
+/** picker wechat skin*/
+.lay-picker-bottom {text-align: center;margin-top: 10px;margin-bottom: 30px;font-size: 16px;}
+.lay-picker-bottom-btn {border-radius: 6px;display: inline-block;width: 30%;height: 40px;line-height: 40px;}
+.lay-picker-bottom-btn-cancel {color: var(--color-gray-500);background: var(--color-gray-200);margin-right: 3%;}
+.lay-picker-bottom-btn-clear {color: var(--color-white);background: var(--color-orange-600);margin-right: 3%;}
+.lay-picker-bottom-btn-confirm {color: var(--color-white);background:  var(--color-blue-600);}
\ No newline at end of file
diff --git a/public/static/assets/mbui/mbui.js b/public/static/assets/mbui/mbui.js
new file mode 100644
index 0000000000000000000000000000000000000000..03c412194c92bbc476cbaf984180704c8ac0a932
--- /dev/null
+++ b/public/static/assets/mbui/mbui.js
@@ -0,0 +1,29 @@
+;!function(win){"use strict";var doc=win.document;var config={modules:{},status:{},timeout:10,event:{}};var Mbui=function(){this.v='1.0.1'};var GLOBAL=win.GLOBAL||{};var getPath=function(){var jsPath=doc.currentScript?doc.currentScript.src:function(){var js=doc.scripts;var last=js.length-1;var src;for(var i=last;i>0;i--){if(js[i].readyState==='interactive'){src=js[i].src;break}}return src||js[last].src}();return config.dir=GLOBAL.dir||jsPath.substring(0,jsPath.lastIndexOf('/')+1)}();var error=function(msg,type){type=type||'log';win.console&&console[type]&&console[type]('mbui error hint: '+msg)};var isOpera=typeof opera!=='undefined'&&opera.toString()==='[object Opera]';var modules={};Mbui.prototype.cache=config;Mbui.prototype.define=function(deps,factory){var that=this;var type=typeof deps==='function';var callback=function(){var setApp=function(app,exports){mbui[app]=exports;config.status[app]=true};typeof factory==='function'&&factory(function(app,exports){setApp(app,exports);config.callback[app]=function(){factory(setApp)}});return this};type&&(factory=deps,deps=[]);that.use(deps,callback,null,'define');return that};Mbui.prototype.use=function(apps,callback,exports,from){var that=this;var dir=config.dir=config.dir?config.dir:getPath;var head=doc.getElementsByTagName('head')[0];apps=function(){if(typeof apps==='string'){return[apps]}else if(typeof apps==='function'){callback=apps;return['all']}return apps}();var item=apps[0];var timeout=0;exports=exports||[];config.host=config.host||(dir.match(/\/\/([\s\S]+?)\//)||['//'+location.host+'/'])[0];function onScriptLoad(e,url){var readyRegExp=navigator.platform==='PLaySTATION 3'?/^complete$/:/^(complete|loaded)$/;if(e.type==='load'||(readyRegExp.test((e.currentTarget||e.srcElement).readyState))){config.modules[item]=url;head.removeChild(node);(function poll(){if(++timeout>config.timeout*1000/4){return error(item+' is not a valid module','error')}config.status[item]?onCallback():setTimeout(poll,4)}())}}function onCallback(){exports.push(mbui[item]);apps.length>1?that.use(apps.slice(1),callback,exports,from):(typeof callback==='function'&&function(){callback.apply(mbui,exports)}())}if(apps.length===0||(modules[item])){return onCallback(),that}var url=(modules[item]?(dir+'modules/'):(/^\{\/\}/.test(that.modules[item])?'':(config.base||'')))+(that.modules[item]||item)+'.js';url=url.replace(/^\{\/\}/,'');if(!config.modules[item]&&mbui[item]){config.modules[item]=url}if(!config.modules[item]){var node=doc.createElement('script');node.async=true;node.charset='utf-8';node.src=url+function(){var version=config.version===true?(config.v||(new Date()).getTime()):(config.version||'');return version?('?v='+version):''}();head.appendChild(node);if(node.attachEvent&&!(node.attachEvent.toString&&node.attachEvent.toString().indexOf('[native code')<0)&&!isOpera){node.attachEvent('onreadystatechange',function(e){onScriptLoad(e,url)})}else{node.addEventListener('load',function(e){onScriptLoad(e,url)},false)}config.modules[item]=url}else{(function poll(){if(++timeout>config.timeout*1000/4){return error(item+' is not a valid module','error')}(typeof config.modules[item]==='string'&&config.status[item])?onCallback():setTimeout(poll,4)}())}return that};Mbui.prototype.disuse=function(apps){var that=this;apps=that.isArray(apps)?apps:[apps];that.each(apps,function(index,item){if(!config.status[item]){}delete that[item];delete modules[item];delete that.modules[item];delete config.status[item];delete config.modules[item]});return that};Mbui.prototype.getStyle=function(node,name){var style=node.currentStyle?node.currentStyle:win.getComputedStyle(node,null);return style[style.getPropertyValue?'getPropertyValue':'getAttribute'](name)};Mbui.prototype.link=function(href,fn,cssname){var that=this;var head=doc.getElementsByTagName('head')[0];var link=doc.createElement('link');if(typeof fn==='string')cssname=fn;var app=(cssname||href).replace(/\.|\//g,'');var id='mbuicss-'+app;var STAUTS_NAME='creating';var timeout=0;link.href=href+(config.debug?'?v='+new Date().getTime():'');link.rel='stylesheet';link.id=id;link.media='all';if(!doc.getElementById(id)){head.appendChild(link)}if(typeof fn!=='function')return that;(function poll(status){var delay=100;var getLinkElem=doc.getElementById(id);if(++timeout>config.timeout*1000/delay){return error(href+' timeout')}if(parseInt(that.getStyle(getLinkElem,'width'))===1989){if(status===STAUTS_NAME)getLinkElem.removeAttribute('load-status');getLinkElem.getAttribute('load-status')===STAUTS_NAME?setTimeout(poll,delay):fn()}else{getLinkElem.setAttribute('load-status',STAUTS_NAME);setTimeout(function(){poll(STAUTS_NAME)},delay)}}());return that};Mbui.prototype.addcss=function(firename,fn,cssname){return mbui.link(config.dir+'css/'+firename,fn,cssname)};config.callback={};Mbui.prototype.factory=function(modName){if(mbui[modName]){return typeof config.callback[modName]==='function'?config.callback[modName]:null}};Mbui.prototype.config=function(options){options=options||{};for(var key in options){config[key]=options[key]}return this};Mbui.prototype.modules=function(){var clone={};for(var o in modules){clone[o]=modules[o]}return clone}();Mbui.prototype.extend=function(options){var that=this;options=options||{};for(var o in options){if(that[o]||that.modules[o]){error(o+' Module already exists','error')}else{that.modules[o]=options[o]}}return that};Mbui.prototype.router=Mbui.prototype.hash=function(hash){var that=this;var hash=hash||location.hash;var data={path:[],search:{},hash:(hash.match(/[^#](#.*$)/)||[])[1]||''};if(!/^#\//.test(hash))return data;hash=hash.replace(/^#\//,'');data.href='/'+hash;hash=hash.replace(/([^#])(#.*$)/,'$1').split('/')||[];that.each(hash,function(index,item){/^\w+=/.test(item)?function(){item=item.split('=');data.search[item[0]]=item[1]}():data.path.push(item)});return data};Mbui.prototype.url=function(href){var that=this;var data={pathname:function(){var pathname=href?function(){var str=(href.match(/\.[^.]+?\/.+/)||[])[0]||'';return str.replace(/^[^\/]+/,'').replace(/\?.+/,'')}():location.pathname;return pathname.replace(/^\//,'').split('/')}(),search:function(){var obj={};var search=(href?function(){var str=(href.match(/\?.+/)||[])[0]||'';return str.replace(/\#.+/,'')}():location.search).replace(/^\?+/,'').split('&');that.each(search,function(index,item){var _index=item.indexOf('='),key=function(){if(_index<0){return item.substr(0,item.length)}else if(_index===0){return false}else{return item.substr(0,_index)}}();if(key){obj[key]=_index>0?item.substr(_index+1):null}});return obj}(),hash:that.router(function(){return href?((href.match(/#.+/)||[])[0]||'/'):location.hash}())};return data};Mbui.prototype.each=function(obj,fn){var key;var that=this;var callFn=function(key,obj){return fn.call(obj[key],key,obj[key])};if(typeof fn!=='function')return that;obj=obj||[];if(that.isArray(obj)){for(key=0;key<obj.length;key++){if(callFn(key,obj))break}}else{for(key in obj){if(callFn(key,obj))break}}return that};var EV_REMOVE='MOBAI-EVENT-REMOVE';Mbui.prototype.event=Mbui.event=function(modName,events,params,fn){var that=this;var result=null;var filter=(events||'').match(/\((.*)\)$/)||[];var eventName=(modName+'.'+events).replace(filter[0],'');var filterName=filter[1]||'';var callback=function(_,item){var res=item&&item.call(that,params);res===false&&result===null&&(result=false)};if(params===EV_REMOVE){delete(that.cache.event[eventName]||{})[filterName];return that}if(fn){config.event[eventName]=config.event[eventName]||{};if(filterName){config.event[eventName][filterName]=[fn]}else{config.event[eventName][filterName]=config.event[eventName][filterName]||[];config.event[eventName][filterName].push(fn)}return this}mbui.each(config.event[eventName],function(key,item){if(filterName==='{*}'){mbui.each(item,callback);return}key===''&&mbui.each(item,callback);(filterName&&key===filterName)&&mbui.each(item,callback)});return result};win.mbui=new Mbui()}(window);
+
+mbui.define([],function(e){"use strict";var t={ajax:function(e,t){let n="json";e.hasOwnProperty("data")&&(n=e.data.hasOwnProperty("format")?e.data.format:"json"),(t=t||e.success)&&delete e.success;let r={timeout:1e4};"jsonp"==n&&(r={timeout:1e4,dataType:"jsonp",jsonp:"callback"});let o=$.extend({},r,{success:function(e){t&&"function"==typeof t&&t(e)}},e);$.ajax(o)},get:function(e,t,n){this.ajax({url:e,type:"GET",data:t},n)},post:function(e,t,n){this.ajax({url:e,type:"POST",data:t},n)},put:function(e,t,n){this.ajax({url:e,type:"PUT",data:t},n)},delete:function(e,t,n){this.ajax({url:e,type:"DELETE",data:t},n)},reload:function(e){e&&e>0?setTimeout(function(){location.reload()},e):location.reload()},replace:function(e,t){t&&t>0?setTimeout(function(){window.location.replace(e)},t):window.location.replace(e)},countdown:function(e){e=$.extend(!0,{date:new Date,now:new Date},e);var t=arguments;t.length>1&&(e.date=new Date(t[0]),e.now=new Date(t[1]),e.clock=t[2]);var n={options:e,clear:function(){clearTimeout(n.timer)},reload:function(e){this.clear(),$.extend(!0,this.options,{now:new Date},e),r()}};"function"==typeof e.ready&&e.ready();var r=function t(){var o,a=new Date(e.date),i=new Date(e.now),u=(o=a.getTime()-i.getTime())>0?o:0,c={d:Math.floor(u/864e5),h:Math.floor(u/36e5)%24,m:Math.floor(u/6e4)%60,s:Math.floor(u/1e3)%60};return n.timer=setTimeout(function(){i.setTime(i.getTime()+1e3),e.now=i,r()},1e3),"function"==typeof e.clock&&e.clock(c,n),u<=0&&(clearTimeout(n.timer),"function"==typeof e.done&&e.done(c,n)),t}();return n},timeAgo:function(e,t){var n=[[],[]],r=(new Date).getTime()-new Date(e).getTime();return r>26784e5?(r=new Date(e),n[0][0]=this.digit(r.getFullYear(),4),n[0][1]=this.digit(r.getMonth()+1),n[0][2]=this.digit(r.getDate()),t||(n[1][0]=this.digit(r.getHours()),n[1][1]=this.digit(r.getMinutes()),n[1][2]=this.digit(r.getSeconds())),n[0].join("-")+" "+n[1].join(":")):r>=864e5?(r/1e3/60/60/24|0)+" 天前":r>=36e5?(r/1e3/60/60|0)+" 小时前":r>=18e4?(r/1e3/60|0)+" 分钟前":r<0?"未来":"刚刚"},toDateString:function(e,t,n){if(null===e||""===e)return"";var r=this,o=new Date(function(){if(e)return isNaN(e)?e:"string"==typeof e?parseInt(e):e}()||new Date);if(!o.getDate())return console.log('Invalid millisecond for "tool.toDateString(millisecond)"');var a=o.getFullYear(),i=o.getMonth(),u=o.getDate(),c=o.getHours(),s=o.getMinutes(),f=o.getSeconds(),l=o.getMilliseconds(),d=n&&n.customMeridiem||function(e,t){var n=100*e+t;return n<600?"凌晨":n<900?"早上":n<1100?"上午":n<1300?"中午":n<1800?"下午":"晚上"},g={yy:function(){return String(a).slice(-2)},yyyy:function(){return r.digit(a,4)},M:function(){return String(i+1)},MM:function(){return r.digit(i+1)},d:function(){return String(u)},dd:function(){return r.digit(u)},H:function(){return String(c)},HH:function(){return r.digit(c)},h:function(){return String(c%12||12)},hh:function(){return r.digit(c%12||12)},A:function(){return d(c,s)},m:function(){return String(s)},mm:function(){return r.digit(s)},s:function(){return String(f)},ss:function(){return r.digit(f)},SSS:function(){return r.digit(l,3)}};return(t=t||"yyyy-MM-dd HH:mm:ss").replace(/\[([^\]]+)]|y{1,4}|M{1,2}|d{1,2}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|SSS/g,function(e,t){return t||g[e]&&g[e]()||e})},time:function(){return Math.floor((new Date).getTime()/1e3)},date:function(e,t){var n,r,o=["Sun","Mon","Tues","Wednes","Thurs","Fri","Satur","January","February","March","April","May","June","July","August","September","October","November","December"],a=/\\?(.?)/gi,i=function(e,t){return r[e]?r[e]():t},u=function(e,t){for(e=String(e);e.length<t;)e="0"+e;return e};return r={d:function(){return u(r.j(),2)},D:function(){return r.l().slice(0,3)},j:function(){return n.getDate()},l:function(){return o[r.w()]+"day"},N:function(){return r.w()||7},S:function(){var e=r.j(),t=e%10;return t<=3&&1===parseInt(e%100/10,10)&&(t=0),["st","nd","rd"][t-1]||"th"},w:function(){return n.getDay()},z:function(){var e=new Date(r.Y(),r.n()-1,r.j()),t=new Date(r.Y(),0,1);return Math.round((e-t)/864e5)},W:function(){var e=new Date(r.Y(),r.n()-1,r.j()-r.N()+3),t=new Date(e.getFullYear(),0,4);return u(1+Math.round((e-t)/864e5/7),2)},F:function(){return o[6+r.n()]},m:function(){return u(r.n(),2)},M:function(){return r.F().slice(0,3)},n:function(){return n.getMonth()+1},t:function(){return new Date(r.Y(),r.n(),0).getDate()},L:function(){var e=r.Y();return e%4==0&e%100!=0|e%400==0},o:function(){var e=r.n(),t=r.W();return r.Y()+(12===e&&t<9?1:1===e&&t>9?-1:0)},Y:function(){return n.getFullYear()},y:function(){return r.Y().toString().slice(-2)},a:function(){return n.getHours()>11?"pm":"am"},A:function(){return r.a().toUpperCase()},B:function(){var e=3600*n.getUTCHours(),t=60*n.getUTCMinutes(),r=n.getUTCSeconds();return u(Math.floor((e+t+r+3600)/86.4)%1e3,3)},g:function(){return r.G()%12||12},G:function(){return n.getHours()},h:function(){return u(r.g(),2)},H:function(){return u(r.G(),2)},i:function(){return u(n.getMinutes(),2)},s:function(){return u(n.getSeconds(),2)},u:function(){return u(1e3*n.getMilliseconds(),6)},e:function(){throw new Error("Not supported (see source code of date() for timezone on how to add support)")},I:function(){return new Date(r.Y(),0)-Date.UTC(r.Y(),0)!=new Date(r.Y(),6)-Date.UTC(r.Y(),6)?1:0},O:function(){var e=n.getTimezoneOffset(),t=Math.abs(e);return(e>0?"-":"+")+u(100*Math.floor(t/60)+t%60,4)},P:function(){var e=r.O();return e.substr(0,3)+":"+e.substr(3,2)},T:function(){return"UTC"},Z:function(){return 60*-n.getTimezoneOffset()},c:function(){return"Y-m-d\\TH:i:sP".replace(a,i)},r:function(){return"D, d M Y H:i:s O".replace(a,i)},U:function(){return n/1e3|0}},function(e,t){return n=void 0===t?new Date:t instanceof Date?new Date(t):new Date(1e3*t),e.replace(a,i)}(e,t)},strtotime:function(e,t){var n,r,o,a,i,u,c,s,f,l;if(!e)return!1;if((r=(e=e.replace(/^\s+|\s+$/g,"").replace(/\s{2,}/g," ").replace(/[\t\r\n]/g,"").toLowerCase()).match(/^(\d{1,4})([\-\.\/\:])(\d{1,2})([\-\.\/\:])(\d{1,4})(?:\s(\d{1,2}):(\d{2})?:?(\d{2})?)?(?:\s([A-Z]+)?)?$/))&&r[2]===r[4])if(r[1]>1901)switch(r[2]){case"-":return!(r[3]>12||r[5]>31)&&new Date(r[1],parseInt(r[3],10)-1,r[5],r[6]||0,r[7]||0,r[8]||0,r[9]||0)/1e3;case".":return!1;case"/":return!(r[3]>12||r[5]>31)&&new Date(r[1],parseInt(r[3],10)-1,r[5],r[6]||0,r[7]||0,r[8]||0,r[9]||0)/1e3}else if(r[5]>1901)switch(r[2]){case"-":case".":return!(r[3]>12||r[1]>31)&&new Date(r[5],parseInt(r[3],10)-1,r[1],r[6]||0,r[7]||0,r[8]||0,r[9]||0)/1e3;case"/":return!(r[1]>12||r[3]>31)&&new Date(r[5],parseInt(r[1],10)-1,r[3],r[6]||0,r[7]||0,r[8]||0,r[9]||0)/1e3}else switch(r[2]){case"-":return!(r[3]>12||r[5]>31||r[1]<70&&r[1]>38)&&(a=r[1]>=0&&r[1]<=38?+r[1]+2e3:r[1],new Date(a,parseInt(r[3],10)-1,r[5],r[6]||0,r[7]||0,r[8]||0,r[9]||0)/1e3);case".":return r[5]>=70?!(r[3]>12||r[1]>31)&&new Date(r[5],parseInt(r[3],10)-1,r[1],r[6]||0,r[7]||0,r[8]||0,r[9]||0)/1e3:r[5]<60&&!r[6]&&(!(r[1]>23||r[3]>59)&&(o=new Date,new Date(o.getFullYear(),o.getMonth(),o.getDate(),r[1]||0,r[3]||0,r[5]||0,r[9]||0)/1e3));case"/":return!(r[1]>12||r[3]>31||r[5]<70&&r[5]>38)&&(a=r[5]>=0&&r[5]<=38?+r[5]+2e3:r[5],new Date(a,parseInt(r[1],10)-1,r[3],r[6]||0,r[7]||0,r[8]||0,r[9]||0)/1e3);case":":return!(r[1]>23||r[3]>59||r[5]>59)&&(o=new Date,new Date(o.getFullYear(),o.getMonth(),o.getDate(),r[1]||0,r[3]||0,r[5]||0)/1e3)}if("now"===e)return null===t||isNaN(t)?(new Date).getTime()/1e3|0:0|t;if(!isNaN(n=Date.parse(e)))return n/1e3|0;function d(e){var t=e.split(" "),n=t[0],r=t[1].substring(0,3),o=/\d+/.test(n),a=("last"===n?-1:1)*("ago"===t[2]?-1:1);if(o&&(a*=parseInt(n,10)),c.hasOwnProperty(r)&&!t[1].match(/^mon(day|\.)?$/i))return i["set"+c[r]](i["get"+c[r]]()+a);if("wee"===r)return i.setDate(i.getDate()+7*a);if("next"===n||"last"===n)!function(e,t,n){var r,o=u[t];void 0!==o&&(0==(r=o-i.getDay())?r=7*n:r>0&&"last"===e?r-=7:r<0&&"next"===e&&(r+=7),i.setDate(i.getDate()+r))}(n,r,a);else if(!o)return!1;return!0}if(i=t?new Date(1e3*t):new Date,u={sun:0,mon:1,tue:2,wed:3,thu:4,fri:5,sat:6},c={yea:"FullYear",mon:"Month",day:"Date",hou:"Hours",min:"Minutes",sec:"Seconds"},"([+-]?\\d+\\s"+(f="(years?|months?|weeks?|days?|hours?|minutes?|min|seconds?|sec|sunday|sun\\.?|monday|mon\\.?|tuesday|tue\\.?|wednesday|wed\\.?|thursday|thu\\.?|friday|fri\\.?|saturday|sat\\.?)")+"|(last|next)\\s"+f+")(\\sago)?",!(r=e.match(new RegExp("([+-]?\\d+\\s(years?|months?|weeks?|days?|hours?|minutes?|min|seconds?|sec|sunday|sun\\.?|monday|mon\\.?|tuesday|tue\\.?|wednesday|wed\\.?|thursday|thu\\.?|friday|fri\\.?|saturday|sat\\.?)|(last|next)\\s(years?|months?|weeks?|days?|hours?|minutes?|min|seconds?|sec|sunday|sun\\.?|monday|mon\\.?|tuesday|tue\\.?|wednesday|wed\\.?|thursday|thu\\.?|friday|fri\\.?|saturday|sat\\.?))(\\sago)?","gi"))))return!1;for(l=0,s=r.length;l<s;l++)if(!d(r[l]))return!1;return i.getTime()/1e3},date_eq:function(e,t){return new Date(e.replace(/\-/g,"/"))-new Date(t.replace(/\-/g,"/"))>=0},timeline:function(e){var t=new Date,n=new Date(1e3*e),r=t.getTime()-n.getTime();return r<=0&&(r=1e3),r<6e4?Math.floor(r/1e3)+"秒前":r<36e5?Math.floor(r/6e4)+"分钟前":r<864e5?Math.floor(r/36e5)+"小时前":r<6048e5?Math.floor(r/864e5)+"天前":r<338688e5?Math.floor(r/6048e5)+"周前":Math.floor(r/314496e5)+"年前"},getFirstNowLastDay:function(e){var t=e?new Date(e):new Date,n=t.getFullYear(),r=t.getMonth()+1,o=t.getDate();r>=1&&r<=9&&(r="0"+r),o>=1&&o<=9&&(o="0"+o);var a=n+"-"+r;return[n+"-"+r+"-01",n+"-"+r+"-"+o,n+"-"+r+"-"+this.getLastDay(n,r),a]},getLastDay:function(e,t){var n=e,r=t++;return t>12&&(r-=12,n++),new Date(n,r,0).getDate()},array_keys:function(e,t,n){var r=void 0!==t,o=[],a=!!n,i=!0,u="";for(u in e)e.hasOwnProperty(u)&&(i=!0,r&&(a&&e[u]!==t?i=!1:e[u]!==t&&(i=!1)),i&&(o[o.length]=u));return o},array_values:function(e){var t=[],n="";for(n in e)t[t.length]=e[n];return t},array_unique:function(e){var t="",n={},r="";for(t in e)e.hasOwnProperty(t)&&(!1===function(e,t){var n="";for(n in t)if(t.hasOwnProperty(n)&&t[n]+""==e+"")return n;return!1}(r=e[t],n)&&(n[t]=r));return n},array_slice:function(e,t,n,r){var o="";if("[object Array]"!==Object.prototype.toString.call(e)||r&&0!==t){var a=0,i={};for(o in e)a+=1,i[o]=e[o];e=i,t=t<0?a+t:t,n=void 0===n?a:n<0?a+n-t:n;var u={},c=!1,s=-1,f=0,l=0;for(o in e){if(++s,f>=n)break;s===t&&(c=!0),c&&(++f,is_int(o)&&!r?u[l++]=e[o]:u[o]=e[o])}return u}return void 0===n?e.slice(t):n>=0?e.slice(t,t+n):e.slice(t,n)},array_search:function(e,t,n){var r=!!n,o="";if("object"==typeof e&&e.exec){if(!r){var a="i"+(e.global?"g":"")+(e.multiline?"m":"")+(e.sticky?"y":"");e=new RegExp(e.source,a)}for(o in t)if(t.hasOwnProperty(o)&&e.test(t[o]))return o;return!1}for(o in t)if(t.hasOwnProperty(o)&&(r&&t[o]===e||!r&&t[o]==e))return o;return!1},is_array:function(e){if(!e||"object"!=typeof e)return!1;if(function(e){if(!e||"object"!=typeof e||"number"!=typeof e.length)return!1;var t=e.length;return e[e.length]="bogus",t!==e.length?(e.length-=1,!0):(delete e[e.length],!1)}(e))return!0;var t=Object.prototype.toString.call(e),n=function(e){var t=/\W*function\s+([\w$]+)\s*\(/.exec(e);return t?t[1]:"(Anonymous)"}(e.constructor);return"[object Object]"===t&&"Object"===n},in_array:function(e,t,n){var r="";if(n){for(r in t)if(t[r]===e)return!0}else for(r in t)if(t[r]==e)return!0;return!1},sort:function(e,t,n=!0){var r=[],o="",a=0,i=!1,u=[];switch(t){case"SORT_STRING":i=function(e,t){return strnatcmp(e,t)};break;case"SORT_NUMERIC":i=function(e,t){return e-t};break;default:i=function(e,t){var n=parseFloat(e),r=parseFloat(t),o=n+""===e,a=r+""===t;return o&&a?n>r?1:n<r?-1:0:o&&!a?1:!o&&a?-1:e>t?1:e<t?-1:0}}for(o in u=n?e:u,e)e.hasOwnProperty(o)&&(r.push(e[o]),n&&delete e[o]);for(r.sort(i),a=0;a<r.length;a++)u[a]=r[a];return n||u},is_int:function(e){return e===+e&&isFinite(e)&&!(e%1)},is_float:function(e){return!(+e!==e||isFinite(e)&&!(e%1))},is_object:function(e){return"[object Array]"!==Object.prototype.toString.call(e)&&null!==e&&"object"==typeof e},function_exists:function(e){var t="undefined"!=typeof window?window:global;return"string"==typeof e&&(e=t[e]),"function"==typeof e},serialize:function(e){var t,n,r,o="",a=0,i=function(e){var t,n,r,o,a=typeof e;if("object"===a&&!e)return"null";if("object"===a){if(!e.constructor)return"object";for(n in(t=(r=e.constructor.toString()).match(/(\w+)\(/))&&(r=t[1].toLowerCase()),o=["boolean","number","string","array"])if(r==o[n]){a=o[n];break}}return a},u=i(e);switch(u){case"function":t="";break;case"boolean":t="b:"+(e?"1":"0");break;case"number":t=(Math.round(e)==e?"i":"d")+":"+e;break;case"string":t="s:"+function(e){var t=0,n=0,r=e.length,o="";for(n=0;n<r;n++)t+=(o=e.charCodeAt(n))<128?1:o<2048?2:3;return t}(e)+':"'+e+'"';break;case"array":case"object":for(n in t="a",e)if(e.hasOwnProperty(n)){if("function"===i(e[n]))continue;r=n.match(/^[0-9]+$/)?parseInt(n,10):n,o+=this.serialize(r)+this.serialize(e[n]),a++}t+=":"+a+":{"+o+"}";break;case"undefined":default:t="N"}return"object"!==u&&"array"!==u&&(t+=";"),t},unserialize:function(e){var t=this,n=function(e){var t=e.charCodeAt(0);return t<128?0:t<2048?1:2};return error=function(e,n,r,o){throw new t.window[e](n,r,o)},read_until=function(e,t,n){for(var r=2,o=[],a=e.slice(t,t+1);a!=n;)r+t>e.length&&error("Error","Invalid"),o.push(a),a=e.slice(t+(r-1),t+r),r+=1;return[o.length,o.join("")]},read_chrs=function(e,t,r){var o,a,i;for(i=[],o=0;o<r;o++)a=e.slice(t+(o-1),t+o),i.push(a),r-=n(a);return[i.length,i.join("")]},_unserialize=function(e,t){var n,r,o,a,i,u,c,s,f,l,d,g,p,h,w,m,y,v,b=0,M=function(e){return e};switch(t||(t=0),r=t+2,n=e.slice(t,t+1).toLowerCase()){case"i":M=function(e){return parseInt(e,10)},b=(f=read_until(e,r,";"))[0],s=f[1],r+=b+1;break;case"b":M=function(e){return 0!==parseInt(e,10)},b=(f=read_until(e,r,";"))[0],s=f[1],r+=b+1;break;case"d":M=function(e){return parseFloat(e)},b=(f=read_until(e,r,";"))[0],s=f[1],r+=b+1;break;case"n":s=null;break;case"s":b=(l=read_until(e,r,":"))[0],d=l[1],r+=b+2,b=(f=read_chrs(e,r+1,parseInt(d,10)))[0],s=f[1],r+=b+2,b!=parseInt(d,10)&&b!=s.length&&error("SyntaxError","String length mismatch");break;case"a":for(s={},b=(o=read_until(e,r,":"))[0],a=o[1],r+=b+2,u=parseInt(a,10),i=!0,g=0;g<u;g++)w=(h=_unserialize(e,r))[1],p=h[2],r+=w,y=(m=_unserialize(e,r))[1],v=m[2],r+=y,p!==g&&(i=!1),s[p]=v;if(i){for(c=new Array(u),g=0;g<u;g++)c[g]=s[g];s=c}r+=1;break;default:error("SyntaxError","Unknown / Unhandled data type(s): "+n)}return[n,r-t,M(s)]},_unserialize(e+"",0)[2]},uniqid:function(e,t){void 0===e&&(e="");var n,r=function(e,t){return t<(e=parseInt(e,10).toString(16)).length?e.slice(e.length-t):t>e.length?Array(t-e.length+1).join("0")+e:e},o="undefined"!=typeof window?window:global;o.$locutus=o.$locutus||{};var a=o.$locutus;return a.php=a.php||{},a.php.uniqidSeed||(a.php.uniqidSeed=Math.floor(123456789*Math.random())),a.php.uniqidSeed++,n=e,n+=r(parseInt((new Date).getTime()/1e3,10),8),n+=r(a.php.uniqidSeed,5),t&&(n+=(10*Math.random()).toFixed(8).toString()),n},intval:function(e,t){var n,r,o=typeof e;return"boolean"===o?+e:"string"===o?(0===t&&(t=(r=e.match(/^\s*0(x?)/i))?r[1]?16:8:10),n=parseInt(e,t||10),isNaN(n)||!isFinite(n)?0:n):"number"===o&&isFinite(e)?e<0?Math.ceil(e):Math.floor(e):0},floatval:function(e){return parseFloat(e)||0},log:function(e){console.log(e)},trim:function(e,t){var n=[" ","\n","\r","\t","\f","\v"," "," "," "," "," "," "," "," "," "," "," "," ","​","\u2028","\u2029","　"].join(""),r=0,o=0;for(e+="",t&&(n=(t+"").replace(/([[\]().?\/*{}+$^:])/g,"$1")),r=e.length,o=0;o<r;o++)if(-1===n.indexOf(e.charAt(o))){e=e.substring(o);break}for(o=(r=e.length)-1;o>=0;o--)if(-1===n.indexOf(e.charAt(o))){e=e.substring(0,o+1);break}return-1===n.indexOf(e.charAt(0))?e:""},rtrim:function(e,t){return t=t?(t+"").replace(/([[\]().?\/*{}+$^:])/g,"\\$1"):" \\s ",(e+"").replace(new RegExp("["+t+"]+$","g"),"")},ltrim:function(e,t){return t=t?(t+"").replace(/([[\]().?\/*{}+$^:])/g,"$1"):" \\s ",(e+"").replace(new RegExp("^["+t+"]+","g"),"")},strtrim:function(e){return e.replace(/\s+/g," ")},str_replace:function(e,t,n,r){var o,a=0,i=0,u="",c="",s=0,f=[].concat(e),l=[].concat(t),d=n,g="[object Array]"===Object.prototype.toString.call(l),p="[object Array]"===Object.prototype.toString.call(d);d=[].concat(d);var h="undefined"!=typeof window?window:global;h.$locutus=h.$locutus||{};var w=h.$locutus;if(w.php=w.php||{},"object"==typeof e&&"string"==typeof t){for(u=t,t=[],a=0;a<e.length;a+=1)t[a]=u;u="",l=[].concat(t),g="[object Array]"===Object.prototype.toString.call(l)}for(void 0!==r&&(r.value=0),a=0,o=d.length;a<o;a++)if(""!==d[a])for(i=0,s=f.length;i<s;i++)u=d[a]+"",c=g?void 0!==l[i]?l[i]:"":l[0],d[a]=u.split(f[i]).join(c),void 0!==r&&(r.value+=u.split(f[i]).length-1);return p?d:d[0]},strip_tags:function(e,t){t=(((t||"")+"").toLowerCase().match(/<[a-z][a-z0-9]*>/g)||[]).join("");return e.replace(/<!--[\s\S]*?-->|<\?(?:php)?[\s\S]*?\?>/gi,"").replace(/<\/?([a-z][a-z0-9]*)\b[^>]*>/gi,function(e,n){return t.indexOf("<"+n.toLowerCase()+">")>-1?e:""})},ucfirst:function(e){return(e+="").charAt(0).toUpperCase()+e.substr(1)},htmlencode:function(e){return function(e,t,n,r){var o=0,a=0,i=!1;null==t&&(t=2),e=e.toString(),!1!==r&&(e=e.replace(/&/g,"&amp;")),e=e.replace(/</g,"&lt;").replace(/>/g,"&gt;");var u={ENT_NOQUOTES:0,ENT_HTML_QUOTE_SINGLE:1,ENT_HTML_QUOTE_DOUBLE:2,ENT_COMPAT:2,ENT_QUOTES:3,ENT_IGNORE:4};if(0===t&&(i=!0),"number"!=typeof t){for(t=[].concat(t),a=0;a<t.length;a++)0===u[t[a]]?i=!0:u[t[a]]&&(o|=u[t[a]]);t=o}return t&u.ENT_HTML_QUOTE_SINGLE&&(e=e.replace(/'/g,"&#039;")),i||(e=e.replace(/"/g,"&quot;")),e}(e)},htmldecode:function(e){return function(e,t){var n=0,r=0,o=!1;void 0===t&&(t=2),e=e.toString().replace(/&lt;/g,"<").replace(/&gt;/g,">");var a={ENT_NOQUOTES:0,ENT_HTML_QUOTE_SINGLE:1,ENT_HTML_QUOTE_DOUBLE:2,ENT_COMPAT:2,ENT_QUOTES:3,ENT_IGNORE:4};if(0===t&&(o=!0),"number"!=typeof t){for(t=[].concat(t),r=0;r<t.length;r++)0===a[t[r]]?o=!0:a[t[r]]&&(n|=a[t[r]]);t=n}return t&a.ENT_HTML_QUOTE_SINGLE&&(e=e.replace(/&#0*39;/g,"'")),o||(e=e.replace(/&quot;/g,'"')),e.replace(/&amp;/g,"&")}(e)},escape:function(e){return null==e?"":/[<"'>]|&(?=#[a-zA-Z0-9]+)/g.test(e+="")?e.replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"&#39;").replace(/"/g,"&quot;"):e},unescape:function(e){return null==e&&(e=""),(e+="").replace(/\&amp;/g,"&").replace(/\&lt;/g,"<").replace(/\&gt;/g,">").replace(/\&#39;/g,"'").replace(/\&quot;/g,'"')},base64_decode:function(e){var t=function(e){return decodeURIComponent(e.split("").map(function(e){return"%"+("00"+e.charCodeAt(0).toString(16)).slice(-2)}).join(""))};if("undefined"==typeof window)return new Buffer(e,"base64").toString("utf-8");if(void 0!==window.atob)return t(window.atob(e));var n,r,o,a,i,u,c="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",s=0,f=0,l=[];if(!e)return e;e+="";do{n=(u=c.indexOf(e.charAt(s++))<<18|c.indexOf(e.charAt(s++))<<12|(a=c.indexOf(e.charAt(s++)))<<6|(i=c.indexOf(e.charAt(s++))))>>16&255,r=u>>8&255,o=255&u,l[f++]=64===a?String.fromCharCode(n):64===i?String.fromCharCode(n,r):String.fromCharCode(n,r,o)}while(s<e.length);return t(l.join("").replace(/\0+$/,""))},base64_encode:function(e){var t=function(e){return encodeURIComponent(e).replace(/%([0-9A-F]{2})/g,function(e,t){return String.fromCharCode("0x"+t)})};if("undefined"==typeof window)return new Buffer(e).toString("base64");if(void 0!==window.btoa)return window.btoa(t(e));var n,r,o,a,i,u="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",c=0,s=0,f="",l=[];if(!e)return e;e=t(e);do{n=(i=e.charCodeAt(c++)<<16|e.charCodeAt(c++)<<8|e.charCodeAt(c++))>>18&63,r=i>>12&63,o=i>>6&63,a=63&i,l[s++]=u.charAt(n)+u.charAt(r)+u.charAt(o)+u.charAt(a)}while(c<e.length);f=l.join("");var d=e.length%3;return(d?f.slice(0,d-3):f)+"===".slice(d||3)},urlencode:function(e){return encodeURIComponent(e+="").replace(/!/g,"%21").replace(/'/g,"%27").replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/\*/g,"%2A").replace(/~/g,"%7E").replace(/%20/g,"+")},urldecode:function(e){return decodeURIComponent((e+"").replace(/%(?![\da-f]{2})/gi,function(){return"%25"}).replace(/\+/g,"%20"))},unicode_decode:function(e){return e=e.replace(/\\/g,"%"),unescape(e)},unicode_encode:function(e){if(1==(arguments.length>1&&void 0!==arguments[1]&&arguments[1])){for(var t=[],n=0;n<e.length;n++)t[n]=("00"+e.charCodeAt(n).toString(16)).slice(-4);return"\\u"+t.join("\\u")}return e.replace(/[\ud800-\udbff][\udc00-\udfff]/g,function(e){return 2===e.length?function(e){for(var t=[],n=0;n<e.length;n++)t[n]=("00"+e.charCodeAt(n).toString(16)).slice(-4);return"\\u"+t.join("\\u")}(e):e})},get_params:function(e){var t,n=e+"=",r=(t=window.location.href).indexOf("?"),o=(t=t.slice(r+1)).split("&"),a=0,i="",u=o.length;for(a=0;a<u;a++){if(0===(i=o[a]).indexOf(n))return decodeURIComponent(i.slice(n.length).replace(/\+/g,"%20"))}return null},mt_rand:function(e,t){var n=arguments.length;if(0===n)e=0,t=2147483647;else{if(1===n)throw new Error("Warning: mt_rand() expects exactly 2 parameters, 1 given");e=parseInt(e,10),t=parseInt(t,10)}return Math.floor(Math.random()*(t-e+1))+e},rand:function(e,t){var n=arguments.length;if(0===n)e=0,t=2147483647;else if(1===n)throw new Error("Warning: rand() expects exactly 2 parameters, 1 given");return Math.floor(Math.random()*(t-e+1))+e},strcut:function(e,t,n){if(isNaN(t))return e;if(strlen(e)<=t)return e;for(var r=0,o=0;r<e.length&&o<t;++r,++o)e.charCodeAt(r)>255&&++o;return n=n||"",(o-t==1?e.substr(0,r-1):e.substr(0,r))+n},strfind:function(e,t){return!(-1===e.indexOf(t))},is_num:function(e){return new RegExp("^[0-9]*$").test(e)},is_mobile:function(e){return/^1\d{10}$/.test(e)},is_qq:function(e){return/^[1-utf8_decode]{1}\d{4,11}$/.test(e)},is_email:function(e){return/^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/.test(e)},is_chinese:function(e){return/[\u4e00-\u9fa5]/g.test(e)},is_reg:function(e){return/^([a-zA-z_]{1})([\w]*)$/g.test(e)},is_tel:function(e){return/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/.test(e)},is_ip:function(e){if(isNull(e))return!1;return!!(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/g.test(e)&&RegExp.$1<256&&RegExp.$2<256&&RegExp.$3<256&&RegExp.$4<256)},is_zipcode:function(e){return/^(\d){6}$/.test(e)},is_english:function(e){return/^[A-Za-z]+$/.test(e)},is_url:function(e){return new RegExp(/(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/).test(e)},is_http:function(e){return-1!==e.indexOf("http://")||-1!==e.indexOf("https://")},is_money:function(e){return!!/(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/.test(e)},is_CardNumber:function(e){return e.toString().replace(/\s/g,"").replace(/(.{4})/g,"$1 ")},is_IDCard:function(e){for(var t=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2],n=e+"",r=e[17],o=n.substring(0,17).split(""),a=o.length,i=0,u=0;u<a;u++)i+=o[u]*t[u];var c=["1","0","X","9","8","7","6","5","4","3","2","x"][i%11],s=/^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/.test(e);return r===c&&s},in_int:function(e,t,n){return!!isFinite(e)&&(!!/^[+-]?\d+$/.test(e)&&(!(null!=t&&parseInt(e)<parseInt(t))&&!(null!=n&&parseInt(e)>parseInt(n))))},in_float:function(e,t,n){return!!isFinite(e)&&(!(null!=t&&parseFloat(e)<parseFloat(t))&&!(null!=n&&parseFloat(e)>parseFloat(n)))},number_format:function(e,t,n,r){e=(e+"").replace(/[^0-9+\-Ee.]/g,"");var o=isFinite(+e)?+e:0,a=isFinite(+t)?Math.abs(t):0,i=void 0===r?",":r,u=void 0===n?".":n,c="";return(c=(a?function(e,t){if(-1===(""+e).indexOf("e"))return+(Math.round(e+"e+"+t)+"e-"+t);var n=(""+e).split("e"),r="";return+n[1]+t>0&&(r="+"),(+(Math.round(+n[0]+"e"+r+(+n[1]+t))+"e-"+t)).toFixed(t)}(o,a).toString():""+Math.round(o)).split("."))[0].length>3&&(c[0]=c[0].replace(/\B(?=(?:\d{3})+(?!\d))/g,i)),(c[1]||"").length<a&&(c[1]=c[1]||"",c[1]+=new Array(a-c[1].length+1).join("0")),c.join(u)},digit:function(e,t){var n="";t=t||2;for(var r=(e=String(e)).length;r<t;r++)n+="0";return e<Math.pow(10,t)?n+(0|e):e},upDigit:function(e,t=!1){var n=["角","分","厘"],r=["零","壹","贰","叁","肆","伍","陆","柒","捌","玖"],o=[["元","万","亿"],["","拾","佰","仟"]],a=e<0?"欠人民币":"人民币";e=Math.abs(e);var i,u="";for(i=0;i<n.length;i++)u+=(r[Math.floor(10*e*Math.pow(10,i))%10]+n[i]).replace(/零./,"");for(u=u||"整",e=Math.floor(e),i=0;i<o[0].length&&e>0;i++){for(var c="",s=0;s<o[1].length&&e>0;s++)c=r[e%10]+o[1][s]+c,e=Math.floor(e/10);u=c.replace(/(零.)*零$/,"").replace(/^$/,"零")+o[0][i]+u}return 1==t?a+u.replace(/(零.)*零元/,"元").replace(/(零.)+/g,"零").replace(/^整$/,"零元整"):u.replace(/(零.)*零元/,"元").replace(/(零.)+/g,"零").replace(/^整$/,"零元整")},hidebank:function(e="6217995510035399947"){return e.replace(/^(\d{8})\d+(\d{4})$/,"$1*******$2")},hidemobile:function(e="18291447788"){return e.replace(/^(\d{3})\d+(\d{4})$/,"$1****$2")},addcss:function(e){var t=document.createElement("style"),n=document.head||document.getElementsByTagName("head")[0];if(t.type="text/css",t.styleSheet){var r=function(){try{t.styleSheet.cssText=e}catch(e){}};t.styleSheet.disabled?setTimeout(r,10):r()}else{var o=document.createTextNode(e);t.appendChild(o)}n.appendChild(t)},addjs:function(e){var t=document.createElement("script");t.type="text/javascript";try{t.appendChild(document.createTextNode(e))}catch(n){t.text=e}document.head.appendChild(t)},loadjs:function(e,t){var n=document.createElement("script");n.src=e,n.onload=function(){var e=n.readyState&&"complete"!=n.readyState&&"loaded"!=n.readyState;t&&t(!e)},document.head.appendChild(n)},loadcss:function(e,t){var n=document.createElement("link");n.rel="stylesheet",n.type="text/css",n.onerror=function(){t(!1)},n.onload=function(){t(!0)},n.href=e,document.head.appendChild(n)},gethost:function(){return window.location.protocol+"//"+window.location.host},distance:function(e,t){var n=e.lat*Math.PI/180,r=t.lat*Math.PI/180,o=n-r,a=e.lng*Math.PI/180-t.lng*Math.PI/180,i=2*Math.asin(Math.sqrt(Math.pow(Math.sin(o/2),2)+Math.cos(n)*Math.cos(r)*Math.pow(Math.sin(a/2),2)));return i*=6378.137,(i=Math.round(1e4*i)/1e4).toFixed(2)},setCookie:function(e,t,n){var r=new Date;r.setDate(r.getDate()+n),document.cookie=e+"="+t+";expires="+r},getCookie:function(e){for(var t=document.cookie.split("; "),n=0;n<t.length;n++){var r=t[n].split("=");if(r[0]==e)return r[1]}return""},removeCookie:function(e){this.setCookie(e,1,-1)},computeProgres:function(e,t){var n=parseFloat(e)||0,r=parseFloat(t)||0;return Math.round(n/r*1e4)/100},token:function(e){e=e||32;for(var t="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",n="",r=0;r<e;r++)n+=t.charAt(Math.floor(Math.random()*t.length));return n}};$("body").on("click",".link-a",function(){let e=$(this).data("href");return e&&""!==e&&window.location.replace(e),!1}),e("tool",t)});
+
+//加载
+window.rootPath = (function (src) {
+  src = document.currentScript ? document.currentScript.src : document.scripts[document.scripts.length - 1].src;
+  let src_array = src.split('?v=');
+  if (src_array.length == 2) {
+    window.webVersion = src_array[1];
+  }
+  return src.substring(0, src.lastIndexOf("/") + 1);
+})();
+if (typeof jQuery === "undefined") {
+  console.error('请引入jQuery')
+}
+if (typeof moduleInit == "undefined") {
+  window.moduleInit = [];
+}
+mbui.config({
+  base: rootPath + "module/",
+  version: window.webVersion ? window.webVersion : '58'
+}).use(moduleInit, function () {
+  if (typeof mbuiInit === 'function') {
+    mbuiInit();
+  }
+});
+
+
diff --git a/public/static/assets/mbui/module/calendar.js b/public/static/assets/mbui/module/calendar.js
new file mode 100644
index 0000000000000000000000000000000000000000..7bf140e8bbf977d3540124099d65c293785fb257
--- /dev/null
+++ b/public/static/assets/mbui/module/calendar.js
@@ -0,0 +1,390 @@
+﻿mbui.define(['tool'], function (exports) {
+	let tool = mbui.tool;
+	var settings = {
+		mode: "month",
+		weekMode: ["一", "二", "三", "四", "五", "六", "日"],
+		newDate: new Date(),
+		width: null,
+		height: null,
+		shwoLunar: false,
+		showModeBtn: true,
+		showEvent: true,
+		success: function (today) {
+			console.log(today);
+		},
+		mark: function (start_date, end_date) {
+			console.log(start_date);
+			console.log(end_date);
+		}
+	};
+	var Calendar = {
+		init: function () {
+			var me = this, el = me.el, opts = me.options;
+			el.addClass("calendar");
+			opts.width = el.width();
+			opts.height = el.height();
+
+			typeof (opts.newDate) == "string" ? opts.newDate = me._getDateByString(opts.newDate) : "";
+			me._createCalendar();
+
+			//绑定事件
+			//changeMode
+			el.on("click", ".calendar-mode-select .btn", function (e) {
+				e.stopPropagation();
+				var modeText = $(this).text();
+				var mode = modeText == "月" ? "month" : "year";
+				me.changeMode(mode);
+			})
+
+			//calendar-cell日期点击事件
+			el.on("click", ".calendar-cell", function (e) {
+				e.stopPropagation();
+				$(".dropdown-month").removeClass("open");
+				$(".dropdown-year").removeClass("open");
+
+				var cellDate = $(this).attr("title");
+				var viewData = me.viewData;
+				var year = parseInt(cellDate.split("年")[0]);
+				var month = parseInt(cellDate.split("年")[1].split("月")[0]) - 1;
+				var date = parseInt(cellDate.split("年")[1].split("月")[1].split("日")[0]);
+				if (opts.mode == "year") {
+					if (opts.cellClick) opts.cellClick(year + '-' + (month + 1))
+				}
+				else if (opts.mode == "month" && month == opts.newDate.getMonth()) {
+					if (me.options.cellClick) me.options.cellClick(year + '-' + (month + 1) + '-' + date);
+				}
+			})
+
+			//年份下拉
+			el.on("click", ".calendar-year-select", function (e) {
+				e.stopPropagation();
+				$(".dropdown-month").removeClass("open");
+				$(".dropdown-year").toggleClass("open");
+				//创建下拉数据
+				var yearText = opts.newDate.getFullYear();
+				var s = '';
+				for (var i = 0; i < 21; i++) {
+					if (i == 10) {
+						s += '<li class="year-item active">'
+					}
+					else {
+						s += '<li class="year-item">'
+					}
+					s += '<span class="year-check">' + (yearText - 10 + i) + '</span>'
+					s += '<span >年</span>'
+					s += '</li>'
+				}
+				me.el.find(".dropdown-year").html(s);
+			})
+
+			//上一月
+			el.on("click", ".calendar-pre", function (e) {
+				e.stopPropagation();
+				var year = opts.newDate.getFullYear(), month = opts.newDate.getMonth() + 1;
+				month--;
+				if (month < 1) {
+					year = year - 1;
+					month = 12;
+				}
+				opts.newDate.setFullYear(year);
+				var beforeDate = opts.newDate.getDate();
+				opts.newDate.setMonth(month - 1);
+				var afterDate = opts.newDate.getDate();
+
+				//处理日期30号，切换到2月不存在30号
+				if (beforeDate != afterDate) {
+					opts.newDate.setDate(opts.newDate.getDate() - 1);
+				}
+				opts.mode == "month" ? me._refreshCalendar(opts.newDate) : me._refreshYearCalendar(opts.newDate);
+				$(".calendar-month-text").text(month + "月");
+				$(".calendar-year-text").text(year + "年");
+			})
+
+			//下一月
+			el.on("click", ".calendar-next", function (e) {
+				e.stopPropagation();
+				var year = opts.newDate.getFullYear(), month = opts.newDate.getMonth() + 1;
+				month++;
+				if (month > 12) {
+					year = year + 1;
+					month = 1;
+				}
+				opts.newDate.setFullYear(year);
+				var beforeDate = opts.newDate.getDate();
+				opts.newDate.setMonth(month - 1);
+				var afterDate = opts.newDate.getDate();
+
+				//处理日期30号，切换到2月不存在30号
+				if (beforeDate != afterDate) {
+					opts.newDate.setDate(opts.newDate.getDate() - 1);
+				}
+				opts.mode == "month" ? me._refreshCalendar(opts.newDate) : me._refreshYearCalendar(opts.newDate);
+				$(".calendar-month-text").text(month + "月");
+				$(".calendar-year-text").text(year + "年");
+			})
+
+			//年份改变
+			el.on("click", ".year-item", function (e) {
+				e.stopPropagation();
+				$(".dropdown-year").removeClass("open");
+				var yearText = $(this).text();
+				var yearNum = yearText.split("年")[0];
+				if (yearNum == opts.newDate.getFullYear()) return;
+				opts.newDate.setFullYear(yearNum);
+				opts.mode == "month" ? me._refreshCalendar(opts.newDate) : me._refreshYearCalendar(opts.newDate);
+				$(".calendar-year-text").text(yearText);
+			})
+
+			//月份下拉
+			el.on("click", ".calendar-month-select", function (e) {
+				e.stopPropagation();
+				$(".dropdown-year").removeClass("open");
+				$(".dropdown-month").toggleClass("open");
+			})
+
+			//月份改变
+			el.on("click", ".month-item", function (e) {
+				e.stopPropagation();
+				$(".dropdown-month").removeClass("open");
+				var monthText = $(this).text();
+				var monthNum = monthText.split("月")[0];
+				if (monthNum == (opts.newDate.getMonth() + 1)) return;
+
+				var beforeDate = opts.newDate.getDate();
+				opts.newDate.setMonth(monthNum - 1);
+				var afterDate = opts.newDate.getDate();
+
+				//处理日期30号，切换到2月不存在30号
+				if (beforeDate != afterDate) {
+					opts.newDate.setDate(opts.newDate.getDate() - 1);
+				}
+				me._refreshCalendar(opts.newDate);
+				$(".calendar-month-text").text(monthText);
+			})
+
+			$(document.body).on("click", function (e) {
+				$(".dropdown-month").removeClass("open");
+				$(".dropdown-year").removeClass("open");
+			})
+		},
+		//公开方法
+		changeMode: function (mode) {
+			var me = this;
+			if (mode == me.options.mode) return;
+			me.options.mode = mode;
+			me._createCalendar();
+		},
+		getViewDate: function (viewDate) {
+			var me = this, opts = me.options, mode = opts.mode, data = opts.data;
+			if (!data || data.length == 0) return [];
+			var viewData = {}, modeYear = viewDate.getFullYear(), modeMonth = null;
+			if (mode == "month") { modeMonth = viewDate.getMonth() };
+
+			//筛选视图数据并转化未对象 要不要转化为属性
+			for (var i = 0; i < data.length; i++) {
+				var item = data[i];
+				var start = me._getDateByString(item.startDate);
+				var year = start.getFullYear();
+				var month = start.getMonth();
+				var date = start.getDate();
+				if (modeMonth && year == modeYear && modeMonth == month) {
+					if (!viewData[date]) viewData[date] = [];
+					viewData[date].push(item);
+				}
+				else if (!modeMonth && year == modeYear) {
+					if (!viewData[month]) viewData[month] = [];
+					viewData[month].push(item);
+				}
+			}
+			return viewData;
+
+		},
+		_getDateByString: function (stringDate) {
+			var me = this;
+			var year = stringDate.split("-")[0];
+			var month = parseInt(stringDate.split("-")[1]) - 1;
+			var date = stringDate.split("-")[2];
+			return new Date(year, month, date);
+		},
+		//私有方法
+		_createCalendar: function () {
+			var me = this;
+			var dateMode = me.options.mode;
+			me._createView();
+		},
+		_createView: function () {
+			var me = this, el = me.el, opts = me.options, mode = opts.mode, newDate = opts.newDate, html = '';
+			html += me._createToolbar();
+			html += '<div class="calendar-body">';
+			html += '<table class="calendar-table" cellspacing="0">'
+			if (mode == "month") {
+				html += me._createHeader();
+			}
+			html += me._createBody();
+			html += '</table>'
+			html += '</div>'
+			el.html(html);
+
+			if (mode == "month") {
+				me._refreshCalendar(newDate);
+			}
+			else {
+				me._refreshYearCalendar(newDate);
+			}
+			if (me.options.success) me.options.success(newDate);
+		},
+		_createToolbar: function () {
+			var me = this, newDare = me.options.newDate, mode = me.options.mode, showModeBtn = me.options.showModeBtn, s = '';
+			var year = newDare.getFullYear();
+			var month = newDare.getMonth() + 1;
+			s += '<div class="calendar-header">'
+			s += '<div class="calendar-select calendar-year-select" >'
+			s += '<span class="calendar-year-text"> ' + year + '年</span >'
+			s += '<ul id="dropdown-year" class="dropdown-year">'
+			s += '</ul>'
+			s += '</div> '
+
+			if (mode == "month") {
+				s += '<div class="calendar-select  calendar-month-select">'
+				s += '<span class="calendar-month-text"> ' + month + '月</span >'
+				//创建月份下拉
+				s += '<ul class="dropdown-month">'
+				for (var i = 1; i <= 12; i++) {
+					s += '<li class="month-item">'
+					s += '<span class="month-check">' + i + '</span>'
+					s += '<span >月</span>'
+					s += '</li>'
+				}
+				s += '</ul>'
+				s += '</div > '
+			}
+			if (showModeBtn) {
+				s += '<div class="calendar-select calendar-mode-select">'
+				s += '<div class="btn-group">'
+				if (mode == "month") {
+					s += '<span  class="btn calendar-select-active">月</span>'
+					s += '<span class="btn">年</span>'
+				}
+				else {
+					s += '<span  class="btn">月</span>'
+					s += '<span class="btn calendar-select-active">年</span>'
+				}
+				s += '</div>'
+				s += '</div>'
+			}
+			s += '<i class="fa-angle-left calendar-pre"></i><i class="fa-angle-right calendar-next"></i>'
+			s += '</div>'
+			return s;
+		},
+		_createHeader: function () {
+			var me = this, opts = me.options, weekMode = opts.weekMode;
+			var s = '<thead><tr>'
+			weekMode.forEach(function (item) {
+				s += ' <th class="calendar-column-header" title="周' + item + '"><span class="calendar-column-header-inner">' + item + '</span></th>'
+			})
+			s += '</thead></tr>'
+			return s;
+		},
+		_createBody: function () {
+			var me = this;
+			var s = ' <tbody class="calendar-tbody">'
+			s += '</tbody>'
+			return s;
+		},
+		_refreshYearCalendar: function (newDate) {
+			var me = this, showEvent = me.options.showEvent, s = '';
+			//每次都重新获取会不会影响性能
+			me.viewData = viewData = me.getViewDate(newDate);
+			var year = newDate.getFullYear(), month = newDate.getMonth();
+			//四行三列
+			for (var i = 0; i < 4; i++) {
+				s += '<tr>'
+				for (var l = 0; l < 3; l++) {
+					renderMonth = i * 3 + l;
+					if (month == renderMonth) {
+						s += '<td title="' + year + '年' + (renderMonth + 1) + '月" class="calendar-cell calendar-thisMonth">';
+					}
+					else {
+						s += '<td title="' + year + '年' + (renderMonth + 1) + '月" class="calendar-cell">';
+					}
+					s += '<div class="calendar-date">';
+					s += '<div class="calendar-value">' + (renderMonth + 1) + '月';
+					if (showEvent && viewData[renderMonth]) {
+						if (viewData[renderMonth].length > 0) {
+							s += '<div class="calendar-event"></div>';
+						}
+					}
+					s += '</div>';
+					s += '</div></td>';
+				}
+				s += '</tr>'
+			}
+			me.el.find(".calendar-tbody").html(s);
+		},
+		_refreshCalendar: function (newDate) {
+			var me = this, showEvent = me.options.showEvent, s = '';
+			me.viewData = viewData = me.getViewDate(newDate);
+			var _newDate = me._cloneDate(newDate);
+			//当前date
+			var nowNum = _newDate.getDate();
+			//第一天周几
+			_newDate.setDate(1);
+			var weekDay = _newDate.getDay() == 0 ? 7 : _newDate.getDay();
+			//视图第一天
+			var viewDate = me._cloneDate(_newDate);
+			viewDate.setDate(viewDate.getDate() - weekDay + 1);
+			//当前第几周/行 (暂不处理)
+			var spileDate = (newDate.getTime() - viewDate.getTime()) / (1000 * 60 * 60 * 24);
+			renderDate = me._cloneDate(viewDate);
+			var start_date, end_date;
+			//固定六行
+			for (var i = 0; i < 6; i++) {
+				s += '<tr>'
+				for (var l = 0; l < 7; l++) {
+					var year = renderDate.getFullYear();
+					var month = renderDate.getMonth() + 1;
+					var date = renderDate.getDate();
+					if (i == 0 && l == 0) {
+						start_date = year + '-' + month + '-' + date;
+					}
+					end_date = year + '-' + month + '-' + date;
+					if (renderDate.getMonth() < newDate.getMonth()) {
+						s += '<td title="' + year + '年' + month + '月' + date + '日" class="calendar-cell calendar-last-month-cell">';
+					}
+					else if (renderDate.getMonth() > newDate.getMonth()) {
+						s += '<td title="' + year + '年' + month + '月' + date + '日" class="calendar-cell calendar-next-month-cell">';
+					}
+					else if (date == nowNum) {
+						s += '<td title="' + year + '年' + month + '月' + date + '日" class="calendar-cell calendar-today">';
+					}
+					else {
+						s += '<td title="' + year + '年' + month + '月' + date + '日" class="calendar-cell">';
+					}
+					s += '<div class="calendar-date">';
+					s += '<div class="calendar-value">' + date;
+					if (showEvent && viewData[date] && renderDate.getMonth() == newDate.getMonth()) {
+						if (viewData[date].length > 0) {
+							s += '<div class="calendar-event"></div>';
+						}
+					}
+					s += '</div>';
+					s += '</div></td>';
+					renderDate.setDate(renderDate.getDate() + 1);
+				}
+				s += '</tr>'
+			}
+			me.el.find(".calendar-tbody").html(s);
+			if (me.options.mark) me.options.mark(start_date, end_date);
+		},
+		_cloneDate: function (date) {
+			return new Date(date.getFullYear(), date.getMonth(), date.getDate());
+		}
+	}
+	var calendar = function (element, options) {
+		Calendar.el = $('#' + element);
+		Calendar.options = $.extend(true, {}, settings, options);
+		Calendar.init();
+	}
+	// 输出接口
+	exports('calendar', calendar);
+});
\ No newline at end of file
diff --git a/public/static/assets/mbui/module/dataPicker.js b/public/static/assets/mbui/module/dataPicker.js
new file mode 100644
index 0000000000000000000000000000000000000000..9b3eff856d73d3fa4ceba0ff6dd57a19ab14415a
--- /dev/null
+++ b/public/static/assets/mbui/module/dataPicker.js
@@ -0,0 +1,317 @@
+mbui.define(['tool'], function (exports) {
+	const tool = mbui.tool;
+	
+	const dataTypes = {
+		'property':{
+			title:'选择固定资产',
+			url:'/adm/api/get_property',
+			template:function (item,types){
+				return '<label class="mbui-picker-item" data-id="' + item.id + '" data-title="' + item.title + '">\
+								<input class="mbui-input-'+types+'" name="radio_picker[]" type="'+types+'" value="' + item.id + '">\
+								<div style="margin-left:8px;">\
+									<div class="line-limit-1">' + item.title + '</div>\
+									<div class="f12"><span class="text-gray">编号：</span>'+item.code+'<span class="text-gray" style="margin-left:12px;">分类：</span>'+item.cate+'</div>\
+								</div>\
+							</label>'
+			}
+		},
+		'car':{
+			title:'选择车辆信息',
+			url:'/adm/api/get_car',
+			template:function (item,types){
+				return '<label class="mbui-picker-item" data-id="' + item.id + '" data-title="' + item.title + '">\
+								<input class="mbui-input-'+types+'" name="radio_picker[]" type="'+types+'" value="' + item.id + '">\
+								<div style="margin-left:8px;">\
+									<div class="line-limit-1">' + item.title + '</div>\
+									<div class="f12"><span class="text-gray">车牌号：</span>'+item.name+'<span class="text-gray" style="margin-left:12px;">座位数：</span>'+item.seats+'</div>\
+								</div>\
+							</label>'
+			}
+		},
+		'room':{
+			title:'选择会议室',
+			url:'/adm/api/get_meeting_room',
+			template:function (item,types){
+				return '<label class="mbui-picker-item" data-id="' + item.id + '" data-title="' + item.title + '">\
+								<input class="mbui-input-'+types+'" name="radio_picker[]" type="'+types+'" value="' + item.id + '">\
+								<div style="margin-left:8px;">\
+									<div class="line-limit-1">' + item.title + '</div>\
+									<div class="f12"><span class="text-gray">管理员：</span>'+item.keep_name+'<span class="text-gray" style="margin-left:12px;">可容纳人数：</span>'+item.num+'</div>\
+								</div>\
+							</label>'
+			}
+		},
+		'customer':{
+			title:'选择客户',
+			url:'/customer/api/get_customer',
+			template:function (item,types){
+				return '<label class="mbui-picker-item" data-id="' + item.id + '" data-title="' + item.name + '">\
+								<input class="mbui-input-'+types+'" name="radio_picker[]" type="'+types+'" value="' + item.id + '">\
+								<div style="margin-left:8px;">\
+									<div class="line-limit-1">' + item.name + '</div>\
+									<div class="f12"><span class="text-gray">所属员工：</span>'+item.belong_name+'<span class="text-gray" style="margin-left:12px;">所属部门：</span>'+item.belong_department+'</div>\
+								</div>\
+							</label>'
+			}
+		},
+		'supplier':{
+			title:'选择供应商',
+			url:'/contract/api/get_supplier',
+			template:function (item,types){
+				return '<label class="mbui-picker-item" data-id="' + item.id + '" data-title="' + item.title + '">\
+								<input class="mbui-input-'+types+'" name="radio_picker[]" type="'+types+'" value="' + item.id + '">\
+								<div style="margin-left:8px;">\
+									<div class="line-limit-1">' + item.title + '</div>\
+									<div class="f12"><span class="text-gray">供应商电话：</span>'+item.mobile+'</div>\
+								</div>\
+							</label>'
+			}
+		},
+		'contract':{
+			title:'选择销售合同',
+			url:'/contract/api/get_contract',
+			template:function (item,types){
+				return '<label class="mbui-picker-item" data-id="' + item.id + '" data-title="' + item.name + '">\
+								<input class="mbui-input-'+types+'" name="radio_picker[]" type="'+types+'" value="' + item.id + '">\
+								<div style="margin-left:8px;">\
+									<div class="line-limit-1">' + item.name + '</div>\
+									<div class="f12"><span class="text-gray">合同编号：</span>'+item.code+'<span class="text-gray" style="margin-left:12px;">签订人：</span>'+item.sign_name+'</div>\
+								</div>\
+							</label>'
+			}
+		},
+		'product':{
+			title:'选择产品',
+			url:'/contract/api/get_product',
+			template:function (item,types){
+				return '<label class="mbui-picker-item" data-id="' + item.id + '" data-title="' + item.title + '">\
+								<input class="mbui-input-'+types+'" name="radio_picker[]" type="'+types+'" value="' + item.id + '">\
+								<div style="margin-left:8px;">\
+									<div class="line-limit-1">' + item.title + '</div>\
+									<div class="f12"><span class="text-gray">编码：</span>'+item.code+'<span class="text-gray" style="margin-left:12px;">分类：</span>'+item.cate+'</div>\
+								</div>\
+							</label>'
+			}
+		},
+		'purchase':{
+			title:'选择采购合同',
+			url:'/contract/api/get_purchase',
+			template:function (item,types){
+				return '<label class="mbui-picker-item" data-id="' + item.id + '" data-title="' + item.name + '">\
+								<input class="mbui-input-'+types+'" name="radio_picker[]" type="'+types+'" value="' + item.id + '">\
+								<div style="margin-left:8px;">\
+									<div class="line-limit-1">' + item.name + '</div>\
+									<div class="f12"><span class="text-gray">合同编号：</span>'+item.code+'<span class="text-gray" style="margin-left:12px;">签订人：</span>'+item.sign_name+'</div>\
+								</div>\
+							</label>'
+			}
+		},
+		'purchased':{
+			title:'选择采购物品',
+			url:'/contract/api/get_purchased',
+			template:function (item,types){
+				return '<label class="mbui-picker-item" data-id="' + item.id + '" data-title="' + item.title + '">\
+								<input class="mbui-input-'+types+'" name="radio_picker[]" type="'+types+'" value="' + item.id + '">\
+								<div style="margin-left:8px;">\
+									<div class="line-limit-1">' + item.title + '</div>\
+									<div class="f12"><span class="text-gray">编码：</span>'+item.code+'<span class="text-gray" style="margin-left:12px;">分类：</span>'+item.cate+'</div>\
+								</div>\
+							</label>'
+			}
+		},
+		'project':{
+			title:'选择项目',
+			url:'/project/api/get_project',
+			template:function (item,types){
+				return '<label class="mbui-picker-item" data-id="' + item.id + '" data-title="' + item.name + '">\
+								<input class="mbui-input-'+types+'" name="radio_picker[]" type="'+types+'" value="' + item.id + '">\
+								<div style="margin-left:8px;">\
+									<div class="line-limit-1">' + item.name + '</div>\
+									<div class="f12"><span class="text-gray">cate：</span>'+item.code+'<span class="text-gray" style="margin-left:12px;">项目负责人：</span>'+item.director_name+'</div>\
+								</div>\
+							</label>'
+			}
+		},
+		'task':{
+			title:'选择任务',
+			url:'/project/api/get_task',
+			template:function (item,types){
+				return '<label class="mbui-picker-item" data-id="' + item.id + '" data-title="' + item.title + '">\
+								<input class="mbui-input-'+types+'" name="radio_picker[]" type="'+types+'" value="' + item.id + '">\
+								<div style="margin-left:8px;">\
+									<div class="line-limit-1">' + item.title + '</div>\
+									<div class="f12"><span class="text-gray">负责人：</span>'+item.director_name+'<span class="text-gray" style="margin-left:12px;">任务状态：</span>'+item.status_name+'</div>\
+								</div>\
+							</label>'
+			}
+		}
+	};
+	//html转义，防止XSS
+	function escapeHtml(text) {
+	  var map = {
+		'&': '&amp;',
+		'<': '&lt;',
+		'>': '&gt;',
+		'"': '&quot;',
+		"'": '&#039;'
+	  };
+	  return text.replace(/[&<>"']/g, function(m) { return map[m]; });
+	}
+	
+	var LoadData= function () {
+		this.config = {
+			title: "请选择内容",
+			url: "",
+			type: "radio",
+			where: {},
+			limit: 20,
+			template: function (data) {
+				return JSON.parse(data);
+			},
+			callback: function(){}
+		};
+		this.index = 0;
+		this.loaded = 0;
+		this.page = 1;
+		this.count = 0;
+		this.total = 0;
+	};
+	// 初始化
+	LoadData.prototype.init = function (options) {
+		var that = this;
+		$.extend(true, that.config, options);
+		that.index = new Date().getTime();
+		var $container = $('<div class="mbui-picker-selector"><header class="mbui-bar"><a class="mbui-bar-item left" href="javascript:;"><i class="mbui-bar-arrow-left"></i>关闭</a><a class="mbui-bar-item right text-blue" href="javascript:;">确认</a><h1 class="mbui-bar-title">'+that.config.title+'</h1></header></div>');
+		
+		$container.append('<div class="load-data-container lists" id="lists_'+that.index+'"><div id="container_'+that.index+'"></div><div class="load-data-none"><i class="iconfont icon-none"></i><br>暂无数据</div><div class="load-data-loading"><span>努力加载中</span></div><div class="load-data-end"><span>—— ● ——</span></div></div>');
+		$('body').append($container);
+		$('#root').hide();
+		
+		$container.find('.left').click(function () {
+			$container.fadeOut(function () {
+				$container.remove();
+				$('#root').show();
+			});
+		});
+
+		$container.find('.right').click(function () {
+			let selected = $container.find('input:checked');
+			if (selected.length == 0) {
+				layer.msg('请选择数据');
+				return false;
+			}
+			let ids = [], titles = [];
+			for (var m = 0; m < selected.length; m++) {
+				let selected_item = $(selected[m]).parent();
+				ids.push(selected_item.data('id'));
+				titles.push(selected_item.data('title'));
+			}
+			that.config.callback(ids,titles);
+			$container.fadeOut(function () {
+				$container.remove();
+				$('#root').show();
+			});
+		});
+		
+		$('#lists_'+that.index).scroll(function(){
+			if ($(this).scrollTop() + $('body').height() >= $('#container_'+that.index).height()-60) {
+				console.log($(this).scrollTop());
+				console.log('<br>');
+				console.log($('body').height());
+				console.log('<br>');
+				console.log($('#container_'+that.index).height());
+				// 滚动到页面底部时加载更多数据
+				if (that.total < that.count && that.loaded == 0){
+					that.ajax();
+				}
+			}
+		});
+		that.ajax();
+	};
+
+	LoadData.prototype.ajax = function () {
+		var that = this;
+		var elem = $('#container_'+that.index);
+		var container = elem.parent();
+		console.log(container.html());
+		// 发送请求获取数据
+		$.ajax({
+			url: that.config.url + '?page=' + that.page + '&limit=' + that.config.limit,
+			type: 'GET',
+			data: that.config.where,
+			beforeSend: function () {
+				// 显示加载按钮
+				that.loaded = 1;
+				container.find('.load-data-loading').show();
+				container.find('.load-data-end').hide();
+			},
+			success: function (res) {
+				that.count=res.count;
+				that.total+=res.data.length;
+				container.find('.load-data-none').addClass('load-data-'+that.count);
+				if (res.count > 0) {
+					that.page++;
+					$.each(res.data, function (index, item) {
+						// 转义JSON对象中的字符串值,防止XSS
+						for (var key in item) {
+						  if (typeof item[key] === 'string') {
+							item[key] = escapeHtml(item[key]);
+						  }
+						}
+						// 创建列表项并添加到列表中
+						var listItem = that.config.template(item,that.config.type);
+						elem.append(listItem);
+					});
+				}
+			},
+			complete: function () {
+				that.loaded = 0;
+				container.find('.load-data-loading').hide();
+				container.find('.load-data-end').show();
+			}
+		});
+	}
+	
+	//选择员工弹窗		
+	$('body').on('click','.picker-data',function () {
+		let that = $(this);
+		let type = that.data('type');
+		let types = that.data('types');
+		let where = that.data('where');
+		if (typeof(type) == "undefined" || type == '') {
+			type = 1;
+		}
+		type = type == 2 ? 'checkbox' : 'radio';
+
+		if (typeof(types) == "undefined" || types == '') {
+			layer.msg('请设置【picker】的类型');
+			return false;
+		}
+
+		if (typeof(where) == "undefined" || where == '') {
+			map = {};
+		}
+		else{
+			map = JSON.parse(where);
+		}
+		let opts = dataTypes[types];
+		let picker = new LoadData();
+		picker.init({
+			url:opts.url,
+			where:opts.map,
+			type:type,
+			template:opts.template,
+			limit:20,
+			callback:function(ids,titles){
+				that.val(titles.join(','));
+				that.next().val(ids.join(','));
+			}
+		});
+	});
+
+	// 导出loadData模块
+	exports('dataPicker', function (options) {
+		var dataPicker = new LoadData();
+		dataPicker.init(options);
+	});
+});
\ No newline at end of file
diff --git a/public/static/assets/mbui/module/fileupload.js b/public/static/assets/mbui/module/fileupload.js
new file mode 100644
index 0000000000000000000000000000000000000000..1d226c605b2a7f9445c7565592a8f0797c2f3658
--- /dev/null
+++ b/public/static/assets/mbui/module/fileupload.js
@@ -0,0 +1,136 @@
+mbui.define(['layer'], function (exports) {
+	function bytesToSize(bytes) {
+		const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
+		if (bytes === 0) return '0 Bytes';
+		const i = Math.floor(Math.log(bytes) / Math.log(1024));
+		return (bytes / Math.pow(1024, i)).toFixed(2) + ' ' + sizes[i];
+	}
+	var layer = mbui.layer;
+	var fileUpload = function () {
+		this.config = {
+			uploadBtn: "#uploadBtn",
+			uploadBox: "#uploadBox",
+			url: "/api/index/upload",
+			accept: "application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-powerpoint,application/vnd.openxmlformats-officedocument.presentationml.presentation,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/pdf,.csv,image/*,text/plain,video/*,audio/*,application/x-zip-compressed",
+			onlyImage: false,
+			template:function(data){
+				let exts = ['jpg', 'png', 'gif', 'jpeg'];
+				let filesize = bytesToSize(data.filesize);
+				let fileshow='<div class="mbui-file-icon"><i class="iconfont icon-weizhigeshi"></i></div>';
+				if(exts.includes(data.fileext)){
+					fileshow='<div class="mbui-file-icon file-img"><img src="'+data.filepath+'" alt="'+data.name+'"></div>';
+				}
+				return `<div class="mbui-file-div" data-id="${data.id}">
+							${fileshow}
+							<div class="mbui-file-info">
+								<div class="mbui-file-name line-limit-1">${data.name}</div>
+								<div class="mbui-file-size">${filesize}，刚刚</div>
+							</div>
+							<div class="mbui-file-del"><i class="iconfont icon-cuowukongxin"></i></div>
+						</div>`;
+			},
+			ajaxUpload:null
+		};
+		this.loaded = 0;
+	};
+	// 初始化
+	fileUpload.prototype.init = function (options) {
+		var that = this,timestamp = Date.now();
+		$.extend(true, that.config, options);
+		if(that.config.onlyImage){
+			that.config.accept = "image/jpeg,image/png,image/bmp";
+		}
+		var uploadBtn = $(that.config.uploadBtn),uploadBox = $(that.config.uploadBox),fileInput = 'fileInput_'+timestamp;		
+		uploadBox.append('<input id="'+fileInput+'" type="file" multiple="" accept="'+that.config.accept+'" style="display:none;">');
+		
+		//点击上传
+		uploadBtn.click(function() {
+			let newtimestamp = Date.now();
+			$('#'+fileInput).replaceWith($('<input type="file" id="'+fileInput+'" style="display:none;" multiple accept="'+that.config.accept+'">'));
+			if(that.loaded == 0){
+				$('#'+fileInput).click();
+			}			
+		});
+		
+		//赋值到form表单
+		function fileValue(){
+			let file_array = [];
+			uploadBox.find('.mbui-file-div').each(function () {
+				let $id = $(this).data('id');
+				file_array.push($id);
+			});		
+			uploadBox.find('[data-type="file"]').val(file_array.join(','));
+		}
+		
+		//删除已上传
+		uploadBox.on('click','.mbui-file-del',function() {
+			$(this).parent().remove();
+			fileValue();
+		});
+		
+		//附件上传
+		uploadBox.on('change','#'+fileInput,function() {
+			var fileInput = $(this)[0];
+			var file = fileInput.files[0];
+			if (file) {
+			  var formData = new FormData();
+			  formData.append('file', file);      
+			  // 发送文件到服务器
+			  $.ajax({
+				url: that.config.url,
+				type: 'POST',
+				data: formData,
+				processData: false,
+				contentType: false,
+				beforeSend: function () {
+				// 显示加载按钮
+					that.loaded = 1;
+					layer.loading('文件上传中...');
+				},
+				complete:function(){
+					that.loaded = 0;
+					setTimeout(function(){
+						layer.closeAll();
+					},500)					
+				},
+				success: function(res) {
+					if(res.code==0){
+						if(typeof(that.config.ajaxUpload) == "undefined" || that.config.ajaxUpload==null){
+							var listItem = that.config.template(res.data);
+							uploadBox.append(listItem);
+						}
+						else{
+							 that.config.ajaxUpload(res);
+						}
+						fileValue();
+					}
+				},
+				error: function(xhr, status, error) {
+				  console.log('文件上传失败');
+				  console.log('错误信息：', error);
+				}
+			  });
+			} else {
+			  console.log('请选择要上传的文件');
+			}
+		  });
+	};
+
+	//查看图片
+	$('body').on('click','.mbui-file-icon',function(e) {
+		e.preventDefault();
+		let img = $(this).find('img');
+		let href = img.attr('src');
+		if (href!=undefined && href!='') {					
+			layer.photo(href);
+		}
+		else {
+			layer.msg('企业微信不支持下载文件附件<br>请到PC端下载查看');
+		}
+	});
+	// 导出loadData模块
+	exports('fileupload', function (options) {
+		var fileupload = new fileUpload();
+		fileupload.init(options);
+	});
+});
\ No newline at end of file
diff --git a/public/static/assets/mbui/module/fixedbar.js b/public/static/assets/mbui/module/fixedbar.js
new file mode 100644
index 0000000000000000000000000000000000000000..e22aabfae6e94afbbba768e052637180d043a82b
--- /dev/null
+++ b/public/static/assets/mbui/module/fixedbar.js
@@ -0,0 +1,56 @@
+mbui.define([], function (exports) {
+	$('body').append('<div class="mbui-fixed-bar">\
+			<div class="fixed-bar-box">\
+				<button class="fixed-bar-btn"><span class="menutoggle"><span></span></span></button>\
+			</div>\
+			<div class="fixed-bar-item">\
+				<a href="/qiye/index/index">工作台</a>\
+				<a href="/qiye/customer/index">客户<br>管理</a>\
+				<a href="/qiye/contract/index">合同<br>管理</a>\
+				<a href="/qiye/project/index">项目<br>管理</a>\
+				<a href="/qiye/msg/index">消息<br>通知</a>\
+			</div>\
+		</div>');
+	$('.fixed-bar-btn').click(function () {
+		$(this).toggleClass('active');
+		return $('.fixed-bar-item').toggleClass('open');
+	});
+	$('.fixed-bar-item').on('click','a',function(e){
+		e.preventDefault();
+		let href=$(this).attr('href');
+		location.replace(href);
+	})	
+	
+	var startX, startY, moveX, moveY;
+	var browserWidth = $(window).width();
+	var browserHeight = $(window).height();
+    var $button = $('.mbui-fixed-bar');
+	
+    $button.on('touchstart', function(e){
+		startX = e.touches[0].pageX - parseInt($button.css('left'));
+		startY = e.touches[0].pageY - parseInt($button.css('top'));
+		$button.on('touchmove', function(e){
+			e.preventDefault();
+			moveX = e.touches[0].pageX - startX;
+			moveY = e.touches[0].pageY - startY;
+			if(moveY>100 && moveY<browserHeight-206){
+				$button.css({
+					top: moveY + 'px'
+				});
+			}
+			if(moveX>8 && moveX<browserWidth-166){
+				$button.css({
+					left: moveX + 'px'
+				});
+			}
+		});
+		$button.on('touchend', function(){
+			$button.off('touchmove').off('touchend');
+		});
+    });
+	
+	// 导出Tab模块
+	exports('fixedbar', function () {
+
+	});
+});
\ No newline at end of file
diff --git a/public/static/assets/mbui/module/form.js b/public/static/assets/mbui/module/form.js
new file mode 100644
index 0000000000000000000000000000000000000000..7e171e2dcf6a8b7faaa1063dba1e1ee76885c200
--- /dev/null
+++ b/public/static/assets/mbui/module/form.js
@@ -0,0 +1,163 @@
+mbui.define(['layer'], function (exports) {
+	let layer = mbui.layer;
+	var form = function (options) {
+		// 默认配置选项
+		var settings = $.extend({
+			target: '#formBox',
+			verify: {
+				required: function (value) {
+					if (!/[\S]+/.test(value)) {
+						return '必填项不能为空';
+					}
+				},
+				phone: function (value) {
+					var EXP = /^1\d{10}$/;
+					if (value && !EXP.test(value)) {
+						return '手机号格式不正确';
+					}
+				},
+				email: function (value) {
+					var EXP = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
+					if (value && !EXP.test(value)) {
+						return '邮箱格式不正确';
+					}
+				},
+				url: function (value) {
+					var EXP = /^(#|(http(s?)):\/\/|\/\/)[^\s]+\.[^\s]+$/;
+					if (value && !EXP.test(value)) {
+						return '链接格式不正确';
+					}
+				},
+				number: function (value) {
+					if (value && isNaN(value)) {
+						return '只能填写数字';
+					}
+				},
+				date: function (value) {
+					var EXP = /^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/;
+					if (value && !EXP.test(value)) {
+						return '日期格式不正确';
+					}
+				},
+				identity: function (value) {
+					var EXP = /(^\d{15}$)|(^\d{17}(x|X|\d)$)/;
+					if (value && !EXP.test(value)) {
+						return '身份证号格式不正确';
+					}
+				}
+			},
+			errorClass: 'mbui-form-danger',
+			successClass: 'mbui-form-success',
+			errorMessageContainer: null, // 可以指定错误信息容器，例如：'div#error-message'
+			submit: function (data) {
+				console.log(data);
+			}
+		}, options);
+
+		var formBox = $(settings.target);
+		formBox.on('submit', function (event) {
+			event.preventDefault();
+			var isValid = true; //校验判断标识
+			var field = {};  // 字段集合
+			formBox.find('input,select,textarea').each(function () {
+				if (isValid == false) {
+					return false;
+				}
+				var $this = $(this),
+					val = $this.val(),
+					rule = $this.data('verify') || '',
+					rules = rule.split('|'),
+					errMsg = '';
+				$this.removeClass(settings.errorClass); // 移除警示样式
+
+				for (var i = 0; i < rules.length; i++) {
+					var ruleName = rules[i],
+						ruleFunc = settings.verify[ruleName];
+					if (ruleFunc) {
+						errMsg = ruleFunc(val);
+						if (errMsg) {
+							// 获取自定义必填项提示文本
+							if (ruleName === 'required') {
+								errMsg = $this.data('errortips') || errMsg;
+							}
+							isValid = false;
+							break;
+						}
+					}
+				}
+				if (!isValid) {
+					layer.error(errMsg);
+					$this.removeClass(settings.successClass).addClass(settings.errorClass).focus();
+					if (settings.errorMessageContainer) {
+						$(settings.errorMessageContainer).text(errors.join('<br/>'));
+					}
+				} else {
+					$this.removeClass(settings.errorClass).addClass(settings.successClass);
+				}
+			});
+			//校验radio是否选中
+			formBox.find('[data-verify="radio"]').each(function () {
+				if (isValid == false) {
+					return false;
+				}
+				var $this = $(this),errMsg = '至少要有一个单选按钮被选中';
+				if ($this.find('[type="radio"]').is(':checked')) {
+					console.log('至少有一个单选按钮被选中');
+				} else {
+					errMsg = $this.data('errortips') || errMsg;
+					isValid = false;
+				}
+				if (!isValid) {
+					layer.error(errMsg);
+				}
+			});
+			formBox.find('[data-verify="checkbox"]').each(function () {
+				if (isValid == false) {
+					return false;
+				}
+				var $this = $(this),errMsg = '至少要有一个多选按钮被选中';
+				if ($this.find('[type="checkbox"]').is(':checked')) {
+					console.log('至少要有一个多选按钮被选中');
+				} else {
+					errMsg = $this.data('errortips') || errMsg;
+					isValid = false;
+				}
+				if (!isValid) {
+					layer.error(errMsg);
+				}
+			});
+			if (isValid) {
+				// 如果所有验证都通过，则提交表单
+				settings.submit(form.getValue(settings.target));
+			}
+		});
+	};
+
+	// 取值
+	form.getValue = function (itemForm) {
+		var nameIndex = {} // 数组 name 索引
+			, field = {}
+			, fieldElem = $(itemForm).find('input,select,textarea') // 获取所有表单域
+
+		$.each(fieldElem, function (_, item) {
+			var othis = $(this)
+				, init_name; // 初始 name
+
+			item.name = (item.name || '').replace(/^\s*|\s*&/, '');
+			if (!item.name) return;
+
+			// 用于支持数组 name
+			if (/^.*\[\]$/.test(item.name)) {
+				var key = item.name.match(/^(.*)\[\]$/g)[0];
+				nameIndex[key] = nameIndex[key] | 0;
+				init_name = item.name.replace(/^(.*)\[\]$/, '$1[' + (nameIndex[key]++) + ']');
+			}
+			// 复选框和单选框未选中，不记录字段     
+			if (/^(checkbox|radio)$/.test(item.type) && !item.checked) return;
+			field[init_name || item.name] = item.value;
+		});
+		return field;
+	};
+	// 输出接口
+	exports('form', form);
+});
\ No newline at end of file
diff --git a/public/static/assets/mbui/module/layer.js b/public/static/assets/mbui/module/layer.js
new file mode 100644
index 0000000000000000000000000000000000000000..2c53440c67c32a92054fdb9d470b81937b47400b
--- /dev/null
+++ b/public/static/assets/mbui/module/layer.js
@@ -0,0 +1,319 @@
+mbui.define([], function (exports) {
+	var doc = document, query = 'querySelectorAll', claname = 'getElementsByClassName', S = function (s) {
+		return doc[query](s);
+	};
+
+	var template = {
+		warning: function (text) {
+			//警告提示
+			return `<div class="mbui-toptips mbui-toptips-warning fixed" id="${classs}${index}">
+						<i class="mbui-toptips-warning-icon"></i><span>${text}</span>
+					</div>`;
+		},
+		error: function (text) {
+			//失败提示
+			return `<div class="mbui-toptips mbui-toptips-error fixed" id="${classs}${index}">
+						 <i class="mbui-toptips-error-icon"></i><span>${text}</span>
+					</div>`;
+		},
+		toast: function (text) {
+			//轻提示
+			return `<div class="mbui-toast" id="${classs}${index}">
+						<div class="mbui-toast-backdrop"></div>
+						<div class="mbui-toast-dialog">
+							<div class="mbui-toast-content">
+								<span>${text}</span>
+							</div>
+						</div>
+					</div>`;
+		},
+		loading: function (text) {
+			//轻提示
+			return `<div class="mbui-toast mbui-toast-loading" id="${classs}${index}">
+						<div class="mbui-toast-backdrop"></div>
+						<div class="mbui-toast-dialog">
+							<div class="mbui-toast-content">
+								<span>
+									<div class="mbui-toast-loading_icon">
+										<div class="loading-icon-leaf loading-icon-leaf_0"></div>
+										<div class="loading-icon-leaf loading-icon-leaf_1"></div>
+										<div class="loading-icon-leaf loading-icon-leaf_2"></div>
+										<div class="loading-icon-leaf loading-icon-leaf_3"></div>
+										<div class="loading-icon-leaf loading-icon-leaf_4"></div>
+										<div class="loading-icon-leaf loading-icon-leaf_5"></div>
+										<div class="loading-icon-leaf loading-icon-leaf_6"></div>
+										<div class="loading-icon-leaf loading-icon-leaf_7"></div>
+										<div class="loading-icon-leaf loading-icon-leaf_8"></div>
+										<div class="loading-icon-leaf loading-icon-leaf_9"></div>
+										<div class="loading-icon-leaf loading-icon-leaf_10"></div>
+										<div class="loading-icon-leaf loading-icon-leaf_11"></div>
+									</div>
+									${text}
+								</span>
+							</div>
+						</div>
+					</div>`;
+		},
+		success: function (text) {
+			//轻提示
+			return `<div class="mbui-toast mbui-toast-success" id="${classs}${index}">
+						<div class="mbui-toast-backdrop"></div>
+						<div class="mbui-toast-dialog">
+							<div class="mbui-toast-content">
+								<span><i class="mbui-toast-success-icon"></i>${text}</span>
+							</div>
+						</div>
+					</div>`;
+		}
+	}
+
+	//默认配置
+	var config = {
+		type: 1,
+		shade: true,
+		shadeClose: false,
+		fixed: true
+	};
+
+	var ready = {
+		extend: function (obj) {
+			var newobj = JSON.parse(JSON.stringify(config));
+			for (var i in obj) {
+				newobj[i] = obj[i];
+			}
+			return newobj;
+		},
+		timer: {}, end: {}
+	};
+
+	//点触事件
+	ready.touch = function (elem, fn) {
+		elem.addEventListener('click', function (e) {
+			fn.call(this, e);
+		}, false);
+	};
+
+	var index = 0, classs = ['mbui-layer'], Layer = function (options) {
+		var that = this;
+		that.config = ready.extend(options);
+		that.view();
+	};
+
+	Layer.prototype.view = function () {
+		var that = this, config = that.config, layerbox = doc.createElement('div');
+
+		that.id = layerbox.id = classs[0] + index;
+		layerbox.setAttribute('class', classs[0] + ' ' + classs[0] + (config.type || 0));
+		layerbox.setAttribute('index', index);
+
+		//标题区域
+		var title = (function () {
+			var titype = typeof config.title === 'object';
+			return config.title
+				? '<div class="modal-header" style="' + (titype ? config.title[1] : '') + '">' + (titype ? config.title[0] : config.title) + '</div>' : '';
+		}());
+
+		//按钮区域
+		var button = (function () {
+			typeof config.btn === 'string' && (config.btn = [config.btn]);
+			var btns = (config.btn || []).length, btndom;
+			if (btns === 0 || !config.btn) {
+				return '';
+			}
+			btndom = '<button type="button" types="1" class="btn btn-block active">' + config.btn[0] + '</button>'
+			if (btns === 2) {
+				btndom = '<a href="javascript:void(0);" types="0" class="btn">' + config.btn[1] + '</a><button type="button" types="1" class="btn active">' + config.btn[0] + '</button>';
+			}
+			return '<div class="modal-footer clearfix">' + btndom + '</div>';
+		}());
+
+		if (!config.fixed) {
+			config.top = config.hasOwnProperty('top') ? config.top : 100;
+			config.style = config.style || '';
+			config.style += ' top:' + (doc.body.scrollTop + config.top) + 'px';
+		}
+
+		if (config.type === 0) {
+			config.shade = false;
+			let content = template[config.template];
+			layerbox.innerHTML = content(config.content);
+		}
+
+		if (config.type === 2) {
+			config.content = '<div class="form-hairlines"><input type="text" id="prompt' + index + '" class="mbui-input" placeholder="请输入内容"></div>';
+		}
+		
+		if (config.type === 3) {
+			config.className = 'modal-view top';
+			config.content = '<div style="padding:0 16px 16px;"><textarea rows="5" id="textarea' + index + '" class="mbui-textarea" placeholder="请输入内容"></textarea></div>';
+		}
+
+		if (config.type === 4) {
+			config.className = 'modal-actionsheet bottom';
+		}
+
+		if (config.type === 5) {
+			config.className = 'modal-view top';
+		}
+
+		if (config.type > 0) {
+			layerbox.innerHTML = (config.shade ? '<div ' + (typeof config.shade === 'string' ? 'style="' + config.shade + '"' : '') + ' class="mbui-layershade"></div>' : '')
+				+ '<div class="mbui-layermain" ' + (!config.fixed ? 'style="position:static;"' : '') + '>'
+				+ '<div class="modal-dialog">'
+				+ '<div class="modal-content ' + (config.className ? config.className : '') + '" ' + (config.style ? 'style="' + config.style + '"' : '') + '>'
+				+ title
+				+ '<div class="modal-body">' + config.content + '</div>'
+				+ button
+				+ '</div>'
+				+ '</div>'
+				+ '</div>';
+		}
+
+		document.body.appendChild(layerbox);
+		var elem = that.elem = S('#' + that.id)[0];
+		config.success && config.success(elem,index);
+		that.index = index++;
+		that.action(config, elem);
+	};
+
+	Layer.prototype.action = function (config, elem) {
+		var that = this;
+		//自动关闭
+		if (config.time && config.time > 0) {
+			ready.timer[that.index] = setTimeout(function () {
+				layer.close(that.index);
+			}, config.time * 1000);
+		}
+
+		//确认取消
+		var btn = function () {
+			var type = this.getAttribute('types');
+			if (type == 0) {
+				config.no && config.no();
+				layer.close(that.index);
+			} else {
+				config.yes ? config.yes(that.index) : layer.close(that.index);
+			}
+		};
+
+		if (config.btn) {
+			var btns = elem[claname]('modal-footer')[0].children, btnlen = btns.length;
+			for (var ii = 0; ii < btnlen; ii++) {
+				ready.touch(btns[ii], btn);
+			}
+		}
+
+		//点遮罩关闭
+		if (config.shade && config.shadeClose) {
+			var shade = elem[claname]('mbui-layershade')[0];
+			ready.touch(shade, function () {
+				layer.close(that.index, config.end);
+			});
+		}
+		config.end && (ready.end[that.index] = config.end);
+	};
+
+	var layer = {
+		v: '1.0',
+		index: index,
+		//核心方法
+		open: function (options) {
+			var o = new Layer(options || {});
+			return o.index;
+		},
+		alert: function (txt) {
+			layer.open({
+				type: 1,
+				title: '提示',
+				content: txt,
+				btn: ['确定']
+			});
+		},
+		confirm: function (txt, fun) {
+			layer.open({
+				type: 1,
+				title: '温馨提示',
+				content: txt,
+				btn: ['确定', '取消'],
+				yes: function (index) {
+					fun ? fun(index) : layer.close(index);
+				}
+			});
+		},
+		prompt: function (title,fun,txt) {
+			layer.open({
+				type: 2,
+				title: title,
+				content: txt,
+				btn: ['确定', '取消'],
+				yes: function (index) {
+					let val = $('#prompt' + index).val();
+					fun ? fun(val,index) : layer.close(index);
+				}
+			});
+		},
+		textarea: function (title,fun,txt) {
+			layer.open({
+				type: 3,
+				title: title,
+				content: txt,
+				btn: ['确定', '取消'],
+				yes: function (index) {
+					let val = $('#textarea' + index).val();
+					fun ? fun(val,index) : layer.close(index);
+				}
+			});
+		},
+		msg: function (txt = '', time = 3, template = 'toast') {
+			let msg = layer.open({
+				type: 0,
+				content: txt,
+				template: template,
+				time: time
+			});
+			return msg;
+		},
+		success: function (txt) {
+			layer.msg(txt, 3, 'success');
+		},
+		warning: function (txt) {
+			layer.msg(txt, 3, 'warning');
+		},
+		error: function (txt) {
+			layer.msg(txt, 3, 'error');
+		},
+		loading: function (txt) {
+			let loading = layer.msg(txt, 0, 'loading');
+			return loading;
+		},
+		photo: function (url) {
+			var $image = $('<div class="layer-image-photo"><img src="' + url + '"></div>');
+			$('body').append($image);
+			$image.fadeIn();
+			$image.click(function () {
+				$(this).fadeOut(function () {
+					$(this).remove();
+				});
+			});
+		},
+		close: function (index) {
+			var ibox = S('#' + classs[0] + index)[0];
+			if (!ibox) return;
+			ibox.innerHTML = '';
+			doc.body.removeChild(ibox);
+			clearTimeout(ready.timer[index]);
+			delete ready.timer[index];
+			typeof ready.end[index] === 'function' && ready.end[index]();
+			delete ready.end[index];
+		},
+		//关闭所有layer层
+		closeAll: function () {
+			var boxs = doc[claname](classs[0]);
+			for (var i = 0, len = boxs.length; i < len; i++) {
+				layer.close((boxs[0].getAttribute('index') | 0));
+			}
+		}
+	};
+	// 输出接口
+	exports('layer', layer);
+});
\ No newline at end of file
diff --git a/public/static/assets/mbui/module/loadData.js b/public/static/assets/mbui/module/loadData.js
new file mode 100644
index 0000000000000000000000000000000000000000..a1a7c629d7e4d9d661f694973ba8278529f6cb82
--- /dev/null
+++ b/public/static/assets/mbui/module/loadData.js
@@ -0,0 +1,108 @@
+mbui.define(['tool'], function (exports) {
+	let tool = mbui.tool;
+	//html转义，防止XSS
+	function escapeHtml(text) {
+	  var map = {
+		'&': '&amp;',
+		'<': '&lt;',
+		'>': '&gt;',
+		'"': '&quot;',
+		"'": '&#039;'
+	  };
+	  return text.replace(/[&<>"']/g, function(m) { return map[m]; });
+	}
+	
+	var LoadData = function () {
+		this.config = {
+			elem: "#listBox",
+			url: "",
+			where: {},
+			limit: 10,
+			scroll: 1,
+			template: function (data) {
+				return JSON.parse(data);
+			}
+		};
+		this.loaded = 0;
+		this.page = 1;
+		this.count = 0;
+		this.total = 0;
+	};
+	// 初始化
+	LoadData.prototype.init = function (options) {
+		var that = this;
+		$.extend(true, that.config, options);
+		var elem = $(that.config.elem);
+		elem.html('<div class="load-data-container"></div><div class="load-data-none"><i class="iconfont icon-none"></i><br>暂无数据</div><div class="load-data-loading"><span>努力加载中</span></div><div class="load-data-end"><span>—— ● ——</span></div>');
+		
+		if(that.config.scroll==2){
+			$('#root').scroll(function(){
+				if ($(this).scrollTop() + $('#root').height() >= $('#app').height()-10) {					
+					// 滚动到页面底部时加载更多数据
+					if (that.total < that.count && that.loaded == 0){
+						that.ajax();
+					}
+				}
+			});
+		}
+		else{
+			// 监听滚动事件
+			$(window).scroll(function () {
+				if ($(window).scrollTop() + $(window).height() >= $(document).height()-10) {
+					// 滚动到页面底部时加载更多数据
+					if (that.total < that.count && that.loaded == 0){
+						that.ajax();
+					}
+				}
+			});
+		}
+		that.ajax();
+	};
+
+	LoadData.prototype.ajax = function () {
+		var that = this;
+		var elem = $(that.config.elem);
+		// 发送请求获取数据
+		$.ajax({
+			url: that.config.url + '?page=' + that.page + '&limit=' + that.config.limit,
+			type: 'GET',
+			data: that.config.where,
+			beforeSend: function () {
+				// 显示加载按钮
+				that.loaded = 1;
+				elem.find('.load-data-loading').show();
+				elem.find('.load-data-end').hide();
+			},
+			success: function (res) {
+				that.count=res.count;
+				that.total+=res.data.length;
+				elem.find('.load-data-none').addClass('load-data-'+that.count);
+				if (res.count > 0) {
+					that.page++;
+					$.each(res.data, function (index, item) {
+						// 转义JSON对象中的字符串值,防止XSS
+						for (var key in item) {
+						  if (typeof item[key] === 'string') {
+							item[key] = escapeHtml(item[key]);
+						  }
+						}
+						// 创建列表项并添加到列表中
+						var listItem = that.config.template(item);
+						elem.find('.load-data-container').append(listItem);
+					});
+				}
+			},
+			complete: function () {
+				that.loaded = 0;
+				elem.find('.load-data-loading').hide();
+				elem.find('.load-data-end').show();
+			}
+		});
+	}
+
+	// 导出loadData模块
+	exports('loadData', function (options) {
+		var loadData = new LoadData();
+		loadData.init(options);
+	});
+});
\ No newline at end of file
diff --git a/public/static/assets/mbui/module/oaCheck.js b/public/static/assets/mbui/module/oaCheck.js
new file mode 100644
index 0000000000000000000000000000000000000000..68e28cb77a28bc77aa5ee440def0131570fba35a
--- /dev/null
+++ b/public/static/assets/mbui/module/oaCheck.js
@@ -0,0 +1,588 @@
+mbui.define(['form','layer','userPicker'], function (exports) {
+	const layer = mbui.layer;
+	const form = mbui.form;
+	const tool = mbui.tool;
+	const opts={
+		"checkBox":"checkBox",//审核容器id
+		"check_copy": 1,//是否需要抄送人
+		"check_name": "",//审核类型标识
+		"check_btn":1,//是否显示提交审核按钮
+		"check_back":0,//是否支持反确认审核操作
+		"checking_btn":''//待审核状态下添加的按钮
+	};
+	const obj = {
+		loading:false,
+		checkStatus: function (status) {
+			statusArray = ['待提交审批','审批中','审批通过','审批不通过','已撤回'];
+			return '<span class="check-status-color-'+status+'">'+statusArray[status]+'</span>';
+		},
+		statusTemplate: function (status) {
+			let me = this;
+			let tem =`
+				<div class="mbui-list">
+					<div class="mbui-list-bd">审批状态</div>
+					<div class="mbui-list-ft">
+						${me.checkStatus(status)}
+					</div>
+				</div>
+			`;
+			return tem;
+		},
+		uidsTemplate: function () {
+			let tem =`
+				<div class="mbui-form-line">
+					<label class="mbui-form-label">审批人</label>
+					<input type="text" name="check_uames" value="" placeholder="请选择审批人" data-verify="required" data-errortips="请选择审批人" class="mbui-form-input picker-admin" readonly><input type="text" name="check_uids" value="" readonly style="display:none;">
+				</div>
+			`;
+			return tem;
+		},
+		flowTemplate: function (data) {
+			let flowtype='<option value="" title="">--请选择--</option>';
+			if(data && data.length>0){
+				for(let i=0;i<data.length;i++){
+					flowtype+='<option value="'+data[i].id+'" title="'+data[i].check_type+'">'+data[i].title+'</option>';
+				}				
+			}
+			let tem =`
+				<div class="mbui-form-line">
+					<label class="mbui-form-label">审批流程</label>
+					<div class="mbui-form-select">
+						<select name="flow_id" data-verify="required" data-errortips="请选择审批流程">
+							${flowtype}
+						</select>
+					</div>
+				</div>
+			`;
+			return tem;
+		},
+		copyTemplate: function () {
+			let me = this;
+			let tem =`
+				<div class="mbui-form-line">
+					<label class="mbui-form-label">抄 送 人</label>
+					<input class="mbui-form-input picker-admin" name="check_copy_unames" value="" readonly placeholder="请选择" placeholder="请选择审批通过后的抄送人" data-type="2">
+					<input type="text" name="check_copy_uids" value="" readonly style="display:none;">
+				</div>
+			`;
+			if(me.sets.check_copy == 1){
+				return tem;
+			}else{
+				return '';
+			}			
+		},
+		btnTemplate: function () {
+			let me = this;
+			let tem =`
+			<div class="padding-16 center">
+				<button class="mbui-btn mbui-btn-normal" data-event="submit">提交审批</button>
+				<button type="reset" class="mbui-btn mbui-btn-primary">重置</button>
+				${me.sets.checking_btn}
+			</div>
+			`;			
+			if(me.sets.check_btn == 1){
+				return tem;
+			}else{
+				return '';
+			}			
+		},
+		recordTemplate: function (record) {
+			let me = this;
+			let tem ='';
+			if(record.length>0){
+				tem+='<div class="padding-12 border-top">';
+				tem+='<div class="padding-12-b"><span class="f16 mbui-text-gray">审批记录</span></div>';
+				tem+='<div class="mbui-steps">';
+						for(let l=0;l<record.length;l++){
+						tem+='<div class="mbui-steps-item delete-'+record[l].delete_time+'">'+record[l].check_time_str+'<small><span class="text-black">'+record[l].name+'</span><span class="check-status-color-'+(record[l].check_status+1)+'">『'+record[l].status_str+'』</span>了此申请。审批意见：<span class="text-black">'+record[l].content+'。</span></small></div>';
+						}
+					tem+='</div>';
+				tem+='</div>';
+			}
+			return tem;		
+		},
+		createTemplate: function (flow) {
+			let me = this;
+			let checkHtml = `
+				<form class="mbui-form" id="formCheckBox">
+					<div class="mbui-group-title">审批操作</div>
+					<div class="bg-white">
+						${me.flowTemplate(flow)}
+						<div id="checkTR">${me.uidsTemplate()}</div>
+						${me.copyTemplate()}
+					</div>
+				</form>
+			`;
+			return checkHtml;
+		},
+		//审批待提交模版
+		initTemplate: function (detail) {
+			let me = this;
+			let checkHtml = `
+				<form class="mbui-form" id="formCheckBox">
+					<div class="mbui-group-title">审批操作</div>
+					<div class="bg-white">
+						${me.statusTemplate(detail.check_status)}
+						${me.recordTemplate(detail.check_record)}
+						${me.flowTemplate(detail.flow)}
+						<div id="checkTR">${me.uidsTemplate()}</div>
+						${me.copyTemplate()}
+					</div>
+					${me.btnTemplate()}
+				</form>
+			`;
+			let viewHtml = `
+				<form class="mbui-form" id="formCheckBox">
+					<div class="mbui-group-title">审批操作</div>
+					<div class="bg-white">
+						${me.statusTemplate(detail.check_status)}
+						${me.recordTemplate(detail.check_record)}
+					</div>
+				</form>
+			`;
+			if(detail.is_creater==1){
+				return checkHtml;
+			}
+			else{
+				return viewHtml;
+			}
+		},
+		//审批中模版
+		checkTemplate: function (detail) {
+			let me = this,flowHtml='',list = detail.nodes;
+			for(var f=0;f<list.length;f++){
+				//审批流程
+				let checkUser = '',
+				iconRight ='<span class="iconfont icon-arrow"></span>',
+				iconStatus ='<i class="mbui-icon mbui-icon-time"></i>',
+				strStatus ='<div class="check-item-status">待审批</div>',
+				check_types= '',
+				sortClass ='';
+				if(f == list.length-1){
+					iconRight ='';
+				}
+				if(detail.check_step_sort == list[f].sort){
+					sortClass ='flow-this';
+					iconStatus ='<i class="mbui-icon mbui-icon-time"></i>';
+					strStatus ='<div class="check-item-status">当前审批</div>';
+					if(list[f].check_uids_info.length>1){
+						check_types= ' <span class="mbui-badge mbui-bg-blue">会签</span>';
+						if(list[f].check_types==2){
+							check_types= ' <span class="mbui-badge mbui-bg-orange">或签</span>';
+						}
+					}
+				}
+				if(list[f].check_role == 0 || list[f].check_role == 5){
+					checkUser=list[f].check_uids_info[0].name;
+				}
+				if(list[f].check_role == 1 || list[f].check_role == 2 || list[f].check_role == 3  || list[f].check_role == 4){
+					checkUser=list[f].flow_name;
+				}	
+				if(list[f].check_list.length>0){
+					let one=0,two=0,three=0;
+					for(var m=0;m<list[f].check_uids_info.length;m++){
+						if(list[f].check_uids_info[m].check_status == 2){
+							three++
+						}
+						if(list[f].check_uids_info[m].check_status == 1){
+							two++
+						}
+						if(list[f].check_uids_info[m].check_status == 0){
+							one++
+						}
+					}
+					//会签
+					if(list[f].check_types==1){
+						if(three > 0){
+							iconStatus ='<i class="iconfont mbui-icon-close" data-no=""></i>';
+							strStatus ='<div class="check-item-status">拒绝</div>';
+						}
+						else{
+							if(one > 0){
+								iconStatus ='<i class="iconfont icon-clock"></i>';
+								strStatus ='<div class="check-item-status">待审批</div>';
+							}
+							else{
+								iconStatus ='<i class="iconfont icon-kongjian" data-ok=""></i>';
+								strStatus ='<div class="check-item-status">通过</div>';	
+							}
+						}
+					}
+					//或签
+					if(list[f].check_types==2){
+						if(two > 0){
+							iconStatus ='<i class="iconfont icon-kongjian" data-ok=""></i>';
+							strStatus ='<div class="check-item-status">通过</div>';
+						}
+						else{
+							iconStatus ='<i class="iconfont mbui-icon-close" data-no=""></i>';
+							strStatus ='<div class="check-item-status">拒绝</div>';
+						}
+					}
+				}
+				flowHtml+= '<div class="flow-flexbox check-item flow-flex-row '+sortClass+'" id="flow'+f+'">'+iconStatus+'<div class="check-item-name">'+check_types+checkUser+'</div>'+strStatus+iconRight+'</div>';
+			}			
+			
+			let checkCopy=`<div class="mbui-list">
+								<div class="mbui-list-bd">抄 送 人</div>
+								<div class="mbui-list-ft">
+									${detail.copy_unames}
+								</div>
+							</div>
+							`;
+			
+			let checkNode = `
+							<div class="mbui-form-line">
+								<label class="mbui-form-label">审批节点</label>
+								<div class="mbui-form-radio">
+									<input class="mbui-input-radio" type="radio" name="check_node" id="check_node1" value="1" /><label for="check_node1">审批结束</label>
+									<input class="mbui-input-radio" type="radio" name="check_node" id="check_node2" value="2" /><label for="check_node2">下一审批人</label>
+								</div>
+							</div>
+							<div class="mbui-form-line next-admin" style="display:none;">
+								<label class="mbui-form-label">下一审批人</label>
+								<input class="mbui-form-input picker-admin" type="text" name="check_uname" value="" placeholder="请选择" readonly>
+								<input type="hidden" name="check_uids" value="">
+							</div>
+				`;
+				
+			let checkContent = `
+								<div class="mbui-form-line">
+									<label class="mbui-form-label">审批意见</label>
+									<textarea rows="3" name="content" class="mbui-form-input" placeholder="请输入审批意见" data-verify="required" data-errortips="请完善审批意见"></textarea>
+								</div>`;
+				
+			let btnCheck='<span class="mbui-btn mbui-btn-normal btn-check" data-status="1"><i class="mbui-icon mbui-icon-ok"></i> 通过</span><span class="mbui-btn mbui-btn-danger btn-check" data-status="2"><i class="mbui-icon mbui-icon-close"></i> 拒绝</span>';
+			
+			if(detail.step.check_role==5){
+				btnCheck='<span class="mbui-btn mbui-btn-normal btn-check" data-status="1"><i class="mbui-icon mbui-icon-ok"></i> 通过</span><span class="mbui-btn mbui-btn-danger btn-check" data-status="2"><i class="mbui-icon mbui-icon-close"></i> 退回</span>';
+			}
+			
+			let btnBack='<span class="mbui-btn mbui-btn-primary btn-check" data-status="3"><i class="mbui-icon mbui-icon-reduce-circle"></i> 撤回</span>';
+			let btnCheckBack='<span class="mbui-btn mbui-btn-danger btn-check" data-event="check" data-status="4">反确认审核</span>';
+			
+			let checkHtml = `
+				<form class="mbui-form" id="formCheckBox">
+					<div class="mbui-group-title">审批操作</div>
+					<div class="mbui-list">
+						<div class="mbui-list-bd">审批状态</div>
+						<div class="mbui-list-ft">
+							${me.checkStatus(detail.check_status)}
+						</div>
+					</div>
+					<div class="mbui-list">
+						<div class="mbui-list-bd">当前审批人</div>
+						<div class="mbui-list-ft">
+							${detail.check_unames}
+						</div>
+					</div>
+					${(me.sets.check_copy == 1&&detail.check_copy_uids!='') ? checkCopy : ""}					
+					<div class="bg-white">
+						<div class="padding-12 border-top">
+							<span class="f16 mbui-text-gray">审批流</span>
+						</div>
+						<div class="bg-gray radius-4" style="padding:4px 8px; margin:0 12px 12px;">
+							<div class="flow-flexbox check-items flow-flex-row" id="flowList">
+								<div class="flow-flexbox check-item flow-flex-row">
+										<i class="iconfont icon-fangkuai2" data-ok=""></i>
+										<div class="check-item-name">${detail.admin_name}</div>
+										<div class="check-item-status">创建</div>
+										<span class="iconfont icon-arrow"></span>
+								</div>
+								${flowHtml}
+							</div>							
+						</div>
+						${me.recordTemplate(detail.check_record)}
+						${detail.is_checker==1 && detail.step.check_role==0?checkNode:''}
+						${detail.is_checker==1?checkContent:''}
+					</div>
+					<div class="padding-16 center">
+						<input type="hidden" name="check_role" value="${detail.step.check_role}">
+						${detail.is_checker==1?btnCheck:''}
+						${detail.is_creater==1 && (detail.check_status==1 || detail.check_status==3)?btnBack:''}
+						${me.sets.check_back == 1 && detail.check_status==2?btnCheckBack:''}						
+					</div>
+				</form>
+			`;
+			return checkHtml;
+		},
+		//审批撤回模版
+		backTemplate: function (detail) {
+			let me = this;
+			let btnHtml ='';
+			if(me.sets.check_btn == 1){
+				btnHtml ='<div class="padding-16 center"><button class="mbui-btn mbui-btn-normal" data-event="submit">提交审批</button><button type="reset" class="mbui-btn mbui-btn-primary">重置</button></div>';
+			}
+			let checkHtml = `
+				<form class="mbui-form" id="formCheckBox">
+					<div class="mbui-group-title">审批操作</div>
+					<div class="bg-white">
+						${me.statusTemplate(detail.check_status)}
+						${me.recordTemplate(detail.check_record)}
+						${me.flowTemplate(detail.flow)}
+						<div id="checkTR">${me.uidsTemplate()}</div>
+						${me.copyTemplate()}
+					</div>
+					${me.btnTemplate()}
+				</form>
+			`;
+			let viewHtml = `
+				<form class="mbui-form" id="formCheckBox">
+					<div class="mbui-group-title">审批操作</div>
+					<div class="bg-white">
+						${me.statusTemplate(detail.check_status)}
+						${me.recordTemplate(detail.check_record)}
+					</div>
+				</form>
+			`;
+			if(detail.is_creater==1){
+				return checkHtml;
+			}
+			else{
+				return viewHtml;
+			}
+		},
+		submit:function(data,callback){
+			tool.post("/api/check/submit_check", data, callback);
+		},
+		init: function (options) {
+			this.sets = $.extend({}, opts, options);
+			let me = this;
+			let checkBox = $('#'+me.sets.checkBox);
+			let action_id = checkBox.data('id');
+			let check_status = checkBox.data('status');
+			let check_flow_id = checkBox.data('checkflowid');
+			if(action_id === undefined || check_status === undefined || check_flow_id === undefined){
+				return false;
+			}
+			//获取审批信息
+			$.ajax({
+				url: "/api/check/get_flow_nodes",
+				type:'get',
+				data:{check_name:me.sets.check_name,action_id:action_id,flow_id:check_flow_id},
+				success: function (e) {
+					if (e.code == 0) {
+						if(check_status==0){
+							if(action_id==0){
+								checkBox.append(me.createTemplate(e.data));
+							}
+							else{
+								checkBox.append(me.initTemplate(e.data));
+							}
+						}
+						else if(check_status==4){
+							checkBox.append(me.backTemplate(e.data));
+						}
+						else{
+							checkBox.append(me.checkTemplate(e.data));
+						}
+						//提交审批
+						form({
+							target: '#formCheckBox',
+							submit:function(data){
+								let callback = function (e) {
+									layer.msg(e.msg);
+									if (e.code == 0) {
+										tool.reload(2000);
+									}
+								}
+								data.action_id = action_id;
+								data.check_name = me.sets.check_name;
+								tool.post("/api/check/submit_check", data, callback);
+								return false;
+							}
+						});	
+					}
+				}
+			})
+			
+			$('body').on('change','input[name="check_node"]',function() {  
+                var val = this.value;  
+                if(val==2){
+					$('.next-admin').show();
+				}
+				else{
+					$('.next-admin').hide();
+				}
+            }); 
+			//选择审批流
+			$('body').on('change','select[name="flow_id"]', function(data){
+				var check_type = $('select[name="flow_id"] option:selected').attr('title');
+				var selectedValue = $(this).val();
+				if(selectedValue==''){
+					$('#checkTR').html(me.uidsTemplate());
+					checkBox.find('[name="check_copy_unames"]').val('');
+					checkBox.find('[name="check_copy_uids"]').val('');
+					return false;
+				}
+				if(check_type == 1){
+					$('#checkTR').html(me.uidsTemplate());
+				}
+				$.ajax({
+					url: "/api/check/get_flow_users",
+					type:'get',
+					data:{id:selectedValue},
+					success: function (e) {
+						if (e.code == 0) {
+							var flow_li='',flow_idx=0;
+							var flow_data = e.data.flow_data;
+							if(e.data.copy_uids && e.data.copy_uids !='' && me.sets.check_copy==1){
+								checkBox.find('[name="check_copy_unames"]').val(e.data.copy_unames);
+								checkBox.find('[name="check_copy_uids"]').val(e.data.copy_uids.split(','));
+							}
+							if(check_type == 2 || check_type == 3){
+								for(var a=0;a<flow_data.length;a++){
+									var check_types = '',check_role = '',user_li='';
+									if(flow_data[a].check_types==1){
+										check_types= ' <span class="mbui-badge mbui-bg-blue">会签</span>';
+									}
+									if(flow_data[a].check_types==2){
+										check_types= ' <span class="mbui-badge mbui-bg-orange">或签</span>';
+									}
+									
+									if(flow_data[a].check_role==1){
+										check_role = '当前部门负责人';
+									}
+									if(flow_data[a].check_role==2){
+										check_role = '上级部门负责人';
+									}
+									if(flow_data[a].check_role==3){
+										check_role = '岗位职称:'+flow_data[a].check_position;
+									}
+									if(flow_data[a].check_role==4){
+										check_role = '指定人员';
+									}
+									if(flow_data[a].check_role==5){
+										check_role = flow_data[a].flow_name;
+										check_types= ' <span class="mbui-badge mbui-bg-text-green">可回退</span>';
+									}
+									let check_uids_info=flow_data[a].check_uids_info;
+									if(check_uids_info.length>0){
+										flow_idx++;
+										for(var b=0;b<check_uids_info.length;b++){
+											user_li+= '<li style="padding:3px 0;line-height:22px"><img src="'+check_uids_info[b].thumb+'" style="width:22px; height:22px; border-radius:50%; vertical-align: bottom; margin-right:8px;" />'+check_uids_info[b].name+'</li>';
+										}
+										flow_li+='<div class="mbui-steps-item">第'+flow_idx+'级审批『'+check_role+'』'+check_types+'<small>'+user_li+'</small></div>';
+									}
+								}							
+								formHtml = '<div class="mbui-form-line">\
+												<label class="mbui-form-label">审批流</label>\
+												<ul id="flowList" class="mbui-form-input mbui-steps">'+flow_li+'</ul>\
+											</div>';
+								$('#checkTR').html(formHtml);
+							}
+						}
+					}
+				})
+			});
+			
+			//审批操作按钮
+			checkBox.on('click','.btn-check', function(data){
+				let content=checkBox.find('[name="content"]').val();
+				let check_status=$(this).data('status');
+				let check_role = checkBox.find('input[name="check_role"]').val();
+				
+				let check_node=0,check_uids='';
+				if(check_role == 0 && check_status==1){
+					check_node = checkBox.find('input[name="check_node"]:checked').val();
+					check_uids = checkBox.find('input[name="check_uids"]').val();
+					if(!check_node){
+						layer.msg('请选择下一审批节点');
+						return false;
+					}
+					if(check_node == 2 && check_uids==''){
+						layer.msg('请选择下一审批人');
+						return false;
+					}
+				}
+				if(check_status ==1 || check_status==2){
+					if(content==''){
+						layer.msg('请输入审批意见');
+						return false;
+					}
+					let confirmTips='确定通过该审批？';
+					if(check_status==2){
+						confirmTips='确定拒绝该审批？';
+					}				
+					layer.confirm(confirmTips, function(index){
+						$.ajax({
+							url: "/api/check/flow_check",
+							type:'post',
+							data:{
+								action_id:action_id,
+								check_name:me.sets.check_name,
+								check_flow_id:check_flow_id,
+								check_node:check_node,
+								check_uids:check_uids,
+								check:check_status,
+								content:content
+							},
+							success: function (e) {
+								layer.msg(e.msg);
+								if (e.code == 0) {	
+									tool.reload(1000);
+								}
+							}
+						})
+						layer.close(index);
+					});   
+				}
+				else if(check_status ==3){			
+					layer.prompt('请输入撤回理由', function(val, index){
+						if(val==''){
+							layer.msg('请输入撤回理由');
+							return false;
+						}
+						$.ajax({
+							url: "/api/check/flow_check",
+							type:'post',
+							data:{
+								action_id:action_id,
+								check_name:me.sets.check_name,
+								check_flow_id:check_flow_id,
+								check:check_status,
+								content:val
+							},
+							success: function (e) {
+								layer.msg(e.msg);
+								if (e.code == 0) {	
+									tool.reload(1000);
+								}
+							}
+						})
+						layer.close(index);
+					});
+				}
+				else if(check_status ==4){			
+					layer.prompt('请输入反确认理由', function(val, index){
+						if(val==''){
+							layer.msg('请输入反确认理由');
+							return false;
+						}
+						$.ajax({
+							url: "/api/check/flow_check",
+							type:'post',
+							data:{
+								action_id:action_id,
+								check_name:me.sets.check_name,
+								check_flow_id:check_flow_id,
+								check:check_status,
+								content:val
+							},
+							success: function (e) {
+								layer.msg(e.msg);
+								if (e.code == 0) {	
+									tool.reload(1000);
+								}
+							}
+						})
+						layer.close(index);
+					});
+				}
+				return false;
+			});
+			
+		}
+	};
+	exports('oaCheck', obj);
+});
\ No newline at end of file
diff --git a/public/static/assets/mbui/module/oaComment.js b/public/static/assets/mbui/module/oaComment.js
new file mode 100644
index 0000000000000000000000000000000000000000..d97399a220a658226b1070d8edd9d54091499611
--- /dev/null
+++ b/public/static/assets/mbui/module/oaComment.js
@@ -0,0 +1,121 @@
+mbui.define(['tool','layer','userPicker','loadData'], function (exports) {
+	const layer = mbui.layer, tool = mbui.tool,userPicker = mbui.userPicker,loadData = mbui.loadData;
+	const obj = {
+		comment_box:'comment_box',
+		module:'module',
+		topic_id:'topic_id',
+		load: function (comment_box,module,topic_id) {
+			let that = this;
+			that.comment_box=comment_box;
+			that.module=module;
+			that.topic_id=topic_id;
+			loadData({
+				url:'/api/comment/datalist',
+				elem:'#'+comment_box,
+				where: {topic_id: topic_id, module: module},
+				limit:100,
+				template:function(data){
+					let to_names = '', ops = '' ,ptext='';
+						if (data.to_names !='') {
+							to_names = `<span class="text-blue">@${data.to_names}</span>`;
+						}
+						if (data.admin_id == login_admin) {
+							ops = `<span class="mbui-btn mbui-btn-primary xs" data-event="edit" data-id="${data.id}">编辑</span><span class="mbui-btn mbui-btn-primary xs" data-event="del" data-id="${data.id}">删除</span>`;
+						}
+						else{
+							ops = `<span class="mbui-btn mbui-btn-primary xs" data-event="replay" data-id="${data.id}" data-uid="${data.admin_id}" data-unames="${data.name}">回复</span>`;
+						}
+						if(data.pid>0){
+							ptext=`<div style="padding-bottom:8px;"><fieldset><legend>回复『${data.padmin}』${data.ptimes}的评论</legend>${data.pcontent}</fieldset></div>`;
+						}
+							
+					let listItem = `
+							<div id="comment_${data.id}" class="mbui-comment-box border-bottom" data-content="${data.content}">
+								<div class="comment-avatar" title="${data.name}">
+									<img class="comment-image" src="${data.thumb}">
+								</div>
+								<div class="comment-body">
+									<div class="comment-meta">
+										<span class="comment-name">${data.name}</span><span title="${data.create_time}">${data.create_times}${data.update_times}</span>
+									</div>
+									<div class="comment-content">${to_names} ${data.content}</div>
+									${ptext}
+									<div class="comment-btn mbui-btn-group">${ops}</div>
+								</div>
+							</div>
+							`;
+					return listItem;
+				}	
+			});
+		},
+		add: function (topic_id, module,content,to_uids,pid) {
+			let that = this;
+			let callback = function (res) {
+				layer.closeAll();
+				that.load(that.comment_box,that.module,that.topic_id);
+			}
+			if (content == '') {
+				layer.msg('请完善评论内容');
+				return false;
+			}
+			let postData = { module: module,topic_id: topic_id, content: content, to_uids: to_uids, pid: pid};
+			tool.post("/api/comment/add", postData, callback);
+		},
+		edit: function (id,content) {
+			let that = this;
+			let callback = function (res) {
+				layer.closeAll();
+				that.load(that.comment_box,that.module,that.topic_id);
+			}
+			if (content == '') {
+				layer.msg('请完善评论内容');
+				return false;
+			}
+			let postData = {id: id, content: content};
+			tool.post("/api/comment/add", postData, callback);
+		},
+		del: function (id) {
+			let that = this;
+			layer.confirm('确定删除该评论吗？', function (index) {
+				let callback = function (e) {
+					layer.msg(e.msg);
+					if (e.code == 0) {
+						that.load(that.comment_box,that.module,that.topic_id);
+					}
+				}
+				tool.delete("/api/comment/del", { id: id }, callback);
+				layer.close(index);
+			});
+		},
+		//文本
+		textarea: function (id, topic_id, module, content, to_uids, to_unames, pid) {
+			let that = this;
+			let usersInput='';
+			if(id==0){
+				usersInput='<div class="mbui-input-wrap" style="margin-bottom:5px;"><div class="mbui-input-prefix"><i class="mbui-icon mbui-icon-at"></i></div><input type="text" placeholder="@ 要提醒的员工" value="'+to_unames+'" readonly class="mbui-input picker-admin" data-type="2" /><input type="hidden" id="to_uids" value="'+to_uids+'" /></div>';
+			}
+			
+			layer.open({
+				type:5,
+				title: '请输入评论内容',
+				content: '<div style="padding:0 6px 6px;">'+usersInput+'<textarea class="mbui-textarea" id="editTextarea" style="width: 100%; height: 100px;">'+content+'</textarea></div>',
+				btn:['确定','取消'],
+				yes:function(index){
+					let content = $("#editTextarea").val();
+					if (content != '') {
+						if(id>0){
+							that.edit(id, content);
+						}
+						else{
+							let to_uids = $("#to_uids").val();
+							that.add(topic_id, module, content, to_uids, pid);
+						}
+					} else {
+						layer.msg('请输入评论内容');
+					}
+				}
+			});
+		}
+	};
+	exports('oaComment', obj);
+});  
\ No newline at end of file
diff --git a/public/static/assets/mbui/module/oaEdit.js b/public/static/assets/mbui/module/oaEdit.js
new file mode 100644
index 0000000000000000000000000000000000000000..20178fae76eeec01e0d78e68433965f1a2ee0cfb
--- /dev/null
+++ b/public/static/assets/mbui/module/oaEdit.js
@@ -0,0 +1,403 @@
+mbui.define(['tool','layer','picker','userPicker'],function(exports){
+	let layer = mbui.layer,tool=mbui.tool,picker = mbui.picker,adminpicker = mbui.userPicker;
+	const opts={
+		"box":'editBox',//编辑容器id
+		"id":0,//编辑容器id
+		"url": '',
+		"radio":{},
+		"checbox":{},
+		"menu":{},
+		"callback":function(e){
+			layer.msg(e.msg);
+			if(e.code==0){
+				setTimeout(function(){
+					location.reload();
+				},1000)
+			}
+		}
+	};
+	
+	const obj = {
+		//短文本
+		text: function (that) {
+			let me = this;
+			let field = that.data('field');
+			let text = that.data('text');
+			text = typeof(text) == "undefined" ? that.text():text;
+			
+			layer.open({
+				type: 1,
+				title: '请输入内容',
+				area: ['360px', '158px'],
+				content: '<div><input class="mbui-input" id="oaEditText" value="' + text + '"/></div>',
+				btnAlign: 'c',
+				btn: ['保存','取消'],
+				yes: function () {
+					let val = $("#oaEditText").val();
+					if (val != '') {
+						let postData = {'id':me.sets.id,'scene':'oaedit'};
+						postData[field] = val;
+						tool.post(me.sets.url,postData,me.sets.callback);
+					} else {
+						layer.msg('请输入内容');
+					}
+				}
+			})			
+		},
+		//长文本
+		textarea: function (that) {
+			let me = this;
+			let field = that.data('field');
+			let target = that.data('target');
+			let textarea='';
+			if (typeof(target) == "undefined") {
+				textarea = that.text();
+			}
+			else{
+				textarea = $('#'+target).text();
+			}
+			layer.open({
+				type: 1,
+				title: '请输入内容',
+				area: ['600px', '320px'],
+				content: '<div style="padding:5px;"><textarea class="mbui-textarea" id="oaEditTextarea" style="width: 100%; height: 200px;">' + textarea + '</textarea></div>',
+				btnAlign: 'c',
+				btn: ['保存','取消'],
+				yes: function () {
+					let val = $("#oaEditTextarea").val();
+					if (val != '') {
+						let postData = {'id':me.sets.id,'scene':'oaedit'};
+						postData[field] = val;
+						tool.post(me.sets.url,postData,me.sets.callback);
+					} else {
+						layer.msg('请输入内容');
+					}
+				}
+			})			
+		},
+		//数字
+		num: function (that) {
+			let me = this;
+			let field = that.data('field');
+			let text = that.data('text');
+			text = typeof(text) == "undefined" ? that.text():text;
+			
+			let min = that.data('min');
+			min = typeof(min) == "undefined" ? 0:min;
+			
+			let max = that.data('max');
+			max = typeof(max) == "undefined" ? 100:max;
+
+			layer.open({
+				type: 1,
+				title: '请输入数字',
+				area: ['200px', '158px'],
+				content: '<div style="padding:5px;"><input class="mbui-input" oninput="this.value = this.value.replace(/[^0-9]/g,\'\')" id="oaEditNum" value="' + text + '"/></div>',
+				btnAlign: 'c',
+				btn: ['保存','取消'],
+				yes: function () {
+					let val = $("#oaEditNum").val();
+					if (val != '') {
+						if(min !='' && val<min){
+							layer.msg('输入数字不能小于'+min);
+							return false;
+						}
+						if(max !='' && val>max){
+							layer.msg('输入数字不能大于'+max);
+							return false;
+						}
+						let postData = {'id':me.sets.id,'scene':'oaedit'};
+						postData[field] = val;
+						tool.post(me.sets.url,postData,me.sets.callback);
+					} else {
+						layer.msg('请输入内容');
+					}
+				}
+			})			
+		},
+		oadate: function (that) {
+			let me = this;
+			let type = that.data('type');
+			let min = that.data('min');
+			let max = that.data('max');
+			if (typeof(type) == "undefined" || type === '') {
+				type = 'date';
+			}
+			if (typeof(min) == "undefined" || min === '' || min === 1) {
+				min = '1970-01-01 00:00:00';
+			}
+			if (typeof(max) == "undefined" || max === '' || max === 100) {
+				max = '2099-12-31 23:59:59';
+			}
+			let field = that.data('field');
+			let text = that.data('text');
+			text = typeof(text) == "undefined" ? that.text():text;
+			
+			picker.init({
+				elem: that, // 绑定元素
+				options: type, // 设置为日期选择器（日期选择器可设置：year、month、date、time、timesecond、datetime、datetimesecond）
+				onSuccess: function(index, elem){ // 渲染成功回调
+					picker.show(index);
+				},
+				onClear: function(index){ // 停止滚动触发：index是当前对象的标识， i 是当前滑动的对象，result是前面的值集
+					let postData = {'id':me.sets.id,'scene':'oaedit'};
+					postData[field] = 0;
+					tool.post(me.sets.url,postData,me.sets.callback);
+					picker.remove(index);
+				},
+				onConfirm: function(index, val, result){ // 点击确认回调
+					let postData = {'id':me.sets.id,'scene':'oaedit'};
+					postData[field] = val;
+					tool.post(me.sets.url,postData,me.sets.callback);
+					picker.remove(index);
+				},
+				onCancel: function(index){ // 点击取消回调
+					picker.remove(index);
+				},
+				onShade: function(index){ // 点击遮罩回调
+					picker.remove(index);
+				},
+				minDate:min,
+				maxDate:max
+			})
+		},
+		adminpicker: function (that){
+			let me = this;
+			let field = that.data('field');
+			let ids = that.data('ids');
+			let names = that.data('names');
+			let min = that.data('min');
+			min = typeof(min) == "undefined" ? 1:min;
+
+			adminpicker({
+				type:min,
+				callback:function(ids,names,dids,departments){
+					let postData = {'id':me.sets.id,'scene':'oaedit'};
+					postData[field] = ids.join(',');
+					tool.post(me.sets.url,postData,me.sets.callback);
+				}
+			});
+		},
+		picker:function(that){
+			let me = this;
+			let field = that.data('field');
+			let api = that.data('api');
+			if(typeof(api) == "undefined"){
+				layer.msg('相关API参数未完善');
+				return false;
+			}	
+			let min = that.data('min');
+			min = typeof(min) == "undefined" ? 1:min;
+			let loading;
+			$.ajax({
+				url: api,
+				type: 'get',
+				beforeSend:function(){
+					loading = layer.loading('加载中...');
+				},
+				success: function (e) {
+					if (e.code == 0) {
+						data = e.data;
+						if(min==1){
+							me.radio(that,data);
+						}
+						else{
+							me.checkbox(that,data);
+						}
+					}
+				},
+				complete:function(){
+					layer.close(loading);
+				}
+			})
+		},
+		radio:function(that,data){
+			let me = this;
+			let field = that.data('field');
+			let text = that.data('text');
+			text = typeof(text) == "undefined" ? that.text():text;
+			
+			let arrayidx = that.data('array');
+			if(typeof(arrayidx) != "undefined" && arrayidx!=''){
+				data = me.sets.radio[arrayidx];
+			}
+			if (data.length == 0) {
+				layer.msg('无可选择的内容');
+				return false;
+			}
+			let len = data.length;
+			let editHtml = '<div class="mbui-layer-radio">'
+			while (len--) {
+				if (data[len].id == text) {
+					editHtml+='<div class="mbui-radio-checkbox"><label for="list_radio_'+data[len].id+'">'+data[len].title+'<input class="mbui-radio" type="radio" name="layer_radio" checked value="'+data[len].id+'" id="list_radio_'+data[len].id+'" /></label></div>';
+				}
+				else{
+					editHtml+='<div class="mbui-radio-checkbox"><label for="list_radio_'+data[len].id+'">'+data[len].title+'<input class="mbui-radio" type="radio" name="layer_radio" value="'+data[len].id+'" id="list_radio_'+data[len].id+'" /></label></div>';
+				}
+			}
+			editHtml+='</div>';
+			layer.open({
+				type:5,
+				content:editHtml,
+				btn:['确定','取消'],
+				yes:function(index){
+					let val = $('input[name="layer_radio"]:checked').val();
+					let postData = {'id':me.sets.id,'scene':'oaedit'};
+					postData[field] = val;
+					tool.post(me.sets.url,postData,me.sets.callback);
+				}
+			});
+		},
+		checkbox:function(that){
+			let me = this;
+			let field = that.data('field');
+			let text = that.data('text');
+			text = typeof(text) == "undefined" ? that.text():text;
+			
+			let selected_array = text+''.split(',');
+			let arrayidx = that.data('array');
+			let data = me.sets.checkbox[arrayidx];
+			if (data.length == 0) {
+				layer.msg('无可选择的内容');
+				return false;
+			}
+			let len = data.length;
+			let editHtml = '<div class="mbui-layer-checkbox">'
+			while (len--) {
+				if (selected_array.includes(data[len].id)) {
+					editHtml+='<div class="mbui-radio-checkbox"><label for="list_checkbox_'+data[len].id+'">'+data[len].title+'<input class="mbui-checkbox" type="checkbox" name="layer_checkbox" checked value="'+data[len].id+'" id="list_radio_'+data[len].id+'" /></label></div>';
+				}
+				else{
+					editHtml+='<div class="mbui-radio-checkbox"><label for="list_checkbox_'+data[len].id+'">'+data[len].title+'<input class="mbui-checkbox" type="checkbox" name="layer_checkbox" value="'+data[len].id+'" id="list_checkbox_'+data[len].id+'" /></label></div>';
+				}
+			}
+			editHtml+='</div>';
+			layer.open({
+				type:5,
+				content:editHtml,
+				btn:['确定','取消'],
+				yes:function(index){
+					let checkedValues = $('input[name="layer_checkbox"]:checked').map(function(){
+						return $(this).val();
+					}).get();
+					let postData = {'id':me.sets.id,'scene':'oaedit'};
+					postData[field] = checkedValues.join(',');
+					tool.post(me.sets.url,postData,me.sets.callback);
+				}
+			});
+		},
+		menu: function (that) {
+			let me = this;
+			let arrayidx = that.data('array');
+			let data = me.sets.menu[arrayidx];
+			if (data.length == 0) {
+				layer.msg('无可选择的内容');
+				return false;
+			}
+			let len = data.length;
+			let editHtml = ''
+			while (len--) {
+				let item = $('#edit_'+data[len].field);
+				let types = item.data('types');
+				let text = item.data('text');
+				text = typeof(text) == "undefined" ? item.text():text;
+				
+				let arrays = item.data('array');
+				arrays = typeof(arrays) == "undefined" ? '':arrays;
+				
+				let api = item.data('api');
+				api = typeof(api) == "undefined" ? '':api;
+				
+				let min = item.data('min');
+				min = typeof(min) == "undefined" ? 1:min;
+
+				let max = item.data('max');
+				max = typeof(max) == "undefined" ? 100:max;
+				
+				editHtml+='<a href="javascript:void(0);" class="actionsheet-btn" data-field="'+data[len].field+'" data-types="'+types+'" data-array="'+arrays+'" data-text="'+text+'" data-min="'+min+'" data-max="'+max+'" data-api="'+api+'">'+data[len].title+'</a>';
+			}
+			layer.open({
+				type:4,
+				content: editHtml,
+				btn:['取消'],
+				success:function(elem,index){
+					$(elem).on('click','.actionsheet-btn',function(){
+						let thatmenu = $(this);
+						let types = thatmenu.data('types');
+						layer.close(index);
+						switch (types) {
+							case "num":
+								me.num(thatmenu);
+								break;
+							case "oadate":
+								me.oadate(thatmenu);
+								break;
+							case "textarea":
+								me.textarea(thatmenu);
+								break;
+							case "adminpicker":
+								me.adminpicker(thatmenu);
+								break;
+							case "picker":
+								me.picker(thatmenu);
+								break;
+							case "radio":
+								me.radio(thatmenu,[]);
+								break;
+							case "checkbox":
+								me.checkbox(thatmenu,[]);
+								break;
+							default:
+								me.text(thatmenu);
+						}
+					})
+				}
+			});
+		},
+		init: function (options) {
+			this.sets = $.extend({}, opts, options);
+			let me = this;
+			let editBox = $('#'+me.sets.box);
+			editBox.on('click','.click-edit',function(){
+				let that = $(this);
+				let types = that.data('types');
+				let role = that.data('role');
+				role = typeof(role) == "undefined" ? 1:role;
+				if(role==0){
+					layer.msg('你无权限操作');
+					return false;
+				}
+				switch (types) {
+					case "num":
+						me.num(that);
+						break;
+					case "oadate":
+						me.oadate(that);
+						break;
+					case "textarea":
+						me.textarea(that);
+						break;
+					case "adminpicker":
+						me.adminpicker(that);
+						break;
+					case "picker":
+						me.picker(that);
+						break;
+					case "radio":
+						me.radio(that,[]);
+						break;
+					case "checkbox":
+						me.checkbox(that,[]);
+						break;
+					case "menu":
+						me.menu(that);
+						break;
+					default:
+						me.text(that);
+				}
+			})
+		}
+	}
+	//输出接口
+	exports('oaEdit', obj);
+});   
\ No newline at end of file
diff --git a/public/static/assets/mbui/module/oaLog.js b/public/static/assets/mbui/module/oaLog.js
new file mode 100644
index 0000000000000000000000000000000000000000..928af037800234e7a74df5a7c0a04b1d50a1245e
--- /dev/null
+++ b/public/static/assets/mbui/module/oaLog.js
@@ -0,0 +1,47 @@
+layui.define(['tool'], function (exports) {
+	const tool = layui.tool;
+	const obj = {
+		load: function (box,name, action_id) {
+			let page=1;
+			let callback = function (res) {
+				if (res.code == 0 && res.data.length > 0) {
+					let itemLog = '',log_time='';
+					$.each(res.data, function (index, item) {
+						let detail = "";
+						if(log_time != item.create_time){
+							if(log_time==''){
+								itemLog+='<dl><dt><span class="date-second-point"></span>'+item.create_time+'</dt>'
+							}
+							else{
+								itemLog+='</dl><dl><dt><span class="date-second-point"></span>'+item.create_time+'</dt>'
+							}
+							log_time = 	item.create_time;			
+						}
+						detail= `
+							<span class="log-content gray">将<strong>${item.field_name}</strong>从 <span class="green">${item.old_content}</span> ${item.action}为 <span class="blue">${item.new_content}</span><span class="ml-4 gray" title="${item.create_time}">${item.times}</span></span>
+						`;
+						itemLog+= `
+							<dd><img src="${item.thumb}" class="log-thumb" /><span class="log-name">${item.admin_name}</span>${detail}</dd>
+						`;
+					});
+					itemLog+='</dl>';
+					if(res.data.length>19){
+						itemLog+='<div class="py-3 log-more"><button class="layui-btn layui-btn-normal layui-btn-sm" type="button">查看更多</button></div>';
+					}
+					$("#"+box).html(itemLog);
+				}
+				else{
+					if(page ==1){
+						$("#"+box).html('<div class="layui-data-none">暂无记录</div>');
+					}
+				}
+			}
+			tool.get("/api/index/load_log", {name:name,action_id:action_id,page:page}, callback);
+			$("#"+box).on('click','.log-more',function(){
+				page++;
+				tool.get("/api/index/load_log", {name:name,action_id:action_id,page:page}, callback);
+			});
+		}
+	};
+	exports('oaLog', obj);
+});  
\ No newline at end of file
diff --git a/public/static/assets/mbui/module/picker.js b/public/static/assets/mbui/module/picker.js
new file mode 100644
index 0000000000000000000000000000000000000000..6b196e3fa225a50086455701124c06325336cd21
--- /dev/null
+++ b/public/static/assets/mbui/module/picker.js
@@ -0,0 +1,1189 @@
+mbui.define(['layer'], function (exports) {
+var layer = mbui.layer;
+var layPicker = {
+	index: 0, // 递增的index，作为元素的唯一标识
+	indexList: [], // 每个index的集合
+	offset: {}, // 每个ul元素的滚动位置
+	liHeight: 50, // 每个li的高度
+	selectList: {}, // 存储每个被选中的值，li下标
+	textField: 'name', // 参数名称-内容
+	valueField: 'value',// 参数名称-值
+	fieldList: {}, // 参数名称集
+	dataList: {}, // 数据集合
+	tempSearchList: {}, // 临时存储搜索前的主数据
+	minMaxData: {}, // 最小最大限制数据
+	init: function(data){
+		layPicker.index ++;
+		layPicker.indexList.push(layPicker.index);
+		var key = ''+layPicker.index;
+		// 参数名称替换
+		layPicker.fieldList[key] = {
+			textField: data.textField || layPicker.textField,
+			valueField: data.valueField || layPicker.valueField,
+		};
+		// 滚动位置初始化
+		layPicker.offset[key] = {
+			start: {},
+			move: {},
+			end: {state: false},
+		};
+		// 日期选择器-获取对应值
+		if(data.options){
+			var minObj = lay_picker_date.getMinOrMaxDate(data.minDate);
+			var maxObj = lay_picker_date.getMinOrMaxDate(data.maxDate);
+			layPicker.minMaxData[key] = {};
+			layPicker.minMaxData[key]['minObj'] = minObj;
+			layPicker.minMaxData[key]['maxObj'] = maxObj;
+			layPicker.minMaxData[key]['options'] = data.options;
+			data.data = lay_picker_date.getData(data.options, key);
+		}
+		// 选中值初始化
+		layPicker.selectList[key] = {};
+		// 数据集
+		layPicker.dataList[key] = data.data;
+		// 渲染标签
+		var html = layPicker.initBody(data, key);
+		$('body').append(html);
+		// 给绑定元素添加标识
+		//data.elem.attr('readonly', true);
+		data.elem.attr('lay-picker-id', key);
+
+		// 不等于自定义html才需要执行这些操作
+		if(!data.type || data.type != 3){
+			// 初始化标签和值
+			layPicker.initBox(data.data, key);
+			layPicker.initSelect(key);
+			// 日期选择器-赋值
+			if(data.options){
+				layPicker.setValue(key, lay_picker_date.getVoluation(data.options, layPicker.fieldList[key].valueField), data.options);
+			}
+			// 搜索监听
+			if(data.search){
+				layPicker.tempSearchList[key] = data.data[0];
+				var temp_keyup;
+				$('#lay-picker-input-'+key).on('keyup', function() {
+				    var value = $(this).val();
+					clearTimeout(temp_keyup);
+					temp_keyup = setTimeout(function(){
+						var tempArray = [];
+						if(value){
+							var arr = layPicker.tempSearchList[key];
+							for(var i=0; i<arr.length; i++){
+								var obj = arr[i];
+								var text = layPicker.fieldList[key].textField;
+								if(obj[text].indexOf(value) != -1){
+									tempArray.push(obj);
+								}
+							}
+						}else{
+							tempArray = layPicker.tempSearchList[key];
+						}
+						layPicker.setData(key, -1, tempArray);
+					}, 500)
+				});
+			}
+			// 滑动-开始（手指放在页面时触发）
+			$('.lay-picker-'+key).on('touchstart', '.lay-picker-list-wrap', function(e) {
+				var touch = e.originalEvent.targetTouches[0];
+				if(layPicker.tempInter){
+					clearInterval(layPicker.tempInter);
+					layPicker.tempInter = null;
+					layPicker.offset[key].move.y = touch.clientY;
+				}
+				layPicker.offset[key].move.len = 0;
+				layPicker.offset[key].end.state = true;
+				layPicker.offset[key].start.y = touch.clientY;
+				var ul = $(this).find('ul')[0];
+				layPicker.offset[key].start.top = parseInt(ul.style.transform.split(",")[1].replace('px', '')) || 0;
+				e.stopPropagation(); // 防止屏幕滑动
+			});
+			// 滑动-中（手指移动时触发）
+			$('.lay-picker-'+key).on('touchmove', '.lay-picker-list-wrap', function(e) {
+				var touch = e.originalEvent.targetTouches[0];
+				layPicker.offset[key].move.y = touch.clientY;
+				var y = layPicker.offset[key].move.y - layPicker.offset[key].start.y + layPicker.offset[key].start.top;
+				$(this).find('ul').css('transform', 'translate3d(0px, ' + y + 'px, 0px)');
+				layPicker.offset[key].end.y = y;
+				e.stopPropagation();
+				e.preventDefault();// 防止屏幕滑动
+			});
+			// 滑动-结束（手指离开页面时触发）
+			$('.lay-picker-'+key).on('touchend', '.lay-picker-list-wrap', function(e) {
+				layPicker.offset[key].move.state = true;
+				var tempLen = 1;
+				if(layPicker.offset[key].start.y > layPicker.offset[key].move.y){
+					layPicker.offset[key].move.num = true;
+					tempLen = layPicker.offset[key].start.y - layPicker.offset[key].move.y;
+				}else{
+					layPicker.offset[key].move.num = false;
+					tempLen = layPicker.offset[key].move.y - layPicker.offset[key].start.y;
+				}
+				tempLen = tempLen / layPicker.liHeight;
+				var _this = this;
+				var ul = $(_this).find('ul')[0], ul2 = $(_this).find('ul');
+				var tempNum = 1;
+				layPicker.tempInter = setInterval(function(){
+					tempNum ++;
+					var tempTop = layPicker.offset[key].start.top;
+					layPicker.offset[key].start.top = parseInt(ul.style.transform.split(",")[1].replace('px', '')) || 0;
+					if(tempLen <= 3
+						|| tempTop >= 0
+						|| layPicker.offset[key].start.top >= 0
+						|| ((ul.children.length - 1) * layPicker.liHeight) <= Math.abs(tempTop)
+						|| ((ul.children.length - 1) * layPicker.liHeight) <= Math.abs(layPicker.offset[key].start.top)){
+						tempNum = tempLen;
+					}else{
+						layPicker.offset[key].start.y = layPicker.offset[key].move.y;
+						if(layPicker.offset[key].move.num){
+							layPicker.offset[key].move.y = layPicker.offset[key].move.y - ((tempLen - tempNum) * layPicker.liHeight);
+						}else{
+							if(layPicker.offset[key].move.y < 0){
+								layPicker.offset[key].move.y = layPicker.offset[key].move.y - ((tempLen - tempNum) * layPicker.liHeight);
+							}else{
+								layPicker.offset[key].move.y = layPicker.offset[key].move.y + ((tempLen - tempNum) * layPicker.liHeight);
+							}
+						}
+						var y = layPicker.offset[key].move.y - layPicker.offset[key].start.y + layPicker.offset[key].start.top;
+						ul2.css('transform', 'translate3d(0px, ' + y + 'px, 0px)');
+						layPicker.offset[key].end.y = y;
+					}
+					// 在这前面的都是实现延迟继续滚动效果,这下面的则是原来的效果
+					if(tempNum >= tempLen){
+						clearInterval(layPicker.tempInter);
+						layPicker.offset[key].end.state = false;
+						var itemHeight = layPicker.liHeight;
+						var sign = layPicker.offset[key].end.y >= 0 ? 1 : -1;
+						var thisIndex = $(_this).attr("index");
+						// 计算超出回弹
+						var fieldIndex = Math.round(Math.abs(layPicker.offset[key].end.y) / itemHeight);
+			            var len = sign * (fieldIndex * itemHeight);
+			            if (len > 0) {
+			                len = 0;
+			                fieldIndex = 0;
+			            } else if (len < -(ul.children.length - 1) * itemHeight) {
+			                len = -(ul.children.length - 1) * itemHeight;
+			                fieldIndex = ul.children.length - 1;
+			            };
+			            ul2.css('transform', 'translate3d(0px, ' + len + 'px, 0px)');
+						layPicker.selectList[key][thisIndex] = fieldIndex;
+						// 获取选中值
+						var list = layPicker.dataList[key];
+						var resultArray = [];
+						for(var k in layPicker.selectList[key]){
+							var arr = list[Number(k)]
+							if(arr && arr.length > 0){
+								var obj = arr[layPicker.selectList[key][k]]
+								resultArray.push(obj);
+							}
+						}
+						// 回调
+						if(data.onSelect){
+							data.onSelect(key, thisIndex, resultArray);
+						}
+						// 日期选择器-赋值day
+						if(data.options){
+							var valList = layPicker.setOptions(data.options, key, resultArray, thisIndex);
+							layPicker.setValue(key, valList); // 赋值，以位置类推
+						}
+					}
+				}, 100)
+				e.stopPropagation();// 防止屏幕滑动
+			});
+		  	// 取消-点击
+			$('.lay-picker-'+key).on("click", ".lay-picker-cancel-click", function(e){
+				layPicker.hiden($(this).parents('.lay-picker').attr('lay-index'));
+				if(data.onCancel){
+					data.onCancel(key);
+				}
+		  	});
+		  	// 确认-点击
+			$('.lay-picker-'+key).on("click", ".lay-picker-confirm-click", function(e){
+				layPicker.hiden($(this).parents('.lay-picker').attr('lay-index'));
+				var list = layPicker.dataList[key];
+				var v = '', resultArray = [];
+				for(var k in layPicker.selectList[key]){
+					var arr = list[Number(k)]
+					if(arr && arr.length > 0){
+						var obj = arr[layPicker.selectList[key][k]]
+						if(data.options && (data.options == 'time' || data.options == 'timesecond' || data.options == 'datetime' || data.options == 'datetimesecond')){
+							if(data.options == 'time' || data.options == 'timesecond'){
+								v += obj[layPicker.fieldList[key].valueField] + ":";
+							}else if((data.options == 'datetime' || data.options == 'datetimesecond') && Number(k) == 2){
+								v += obj[layPicker.fieldList[key].valueField] + " ";
+							}else if((data.options == 'datetime' || data.options == 'datetimesecond') && Number(k) > 2){
+								v += obj[layPicker.fieldList[key].valueField] + ":";
+							}else{
+								v += obj[layPicker.fieldList[key].valueField] + "-";
+							}
+						}else{
+							v += obj[layPicker.fieldList[key].valueField] + "-";
+						}
+						resultArray.push(obj);
+					}
+				}
+				if(data.onConfirm){
+					data.onConfirm(key, v.substring(0, v.length-1), resultArray);
+				}
+		  	});
+		  	// 清除-点击
+			$('.lay-picker-'+key).on("click", ".lay-picker-clear-click", function(e){
+				if(data.onClear){
+					data.onClear(key);
+				}
+		  	});
+		}
+		// 绑定元素-点击
+		data.elem.on('click', function(e){
+			layPicker.show($(this).attr('lay-picker-id'));
+			if(data.onShow){
+				data.onShow(key);
+			}
+		})
+		// 遮罩-点击
+		$('.lay-picker-'+key).on("click", ".lay-picker-shade", function(e){
+			layPicker.hiden($(this).parents('.lay-picker').attr('lay-index'));
+			if(data.onShade){
+				data.onShade(key);
+			}
+	  	});
+	  	// 成功回调
+		if(data.onSuccess){
+			data.onSuccess(key, '.lay-picker-'+key);
+		}
+	  	return key;
+	},
+	/** 重置值*/
+	setOptions: function(options, key, resultArray, thisIndex){
+		var valList = [];
+		if(options == 'month' ||  options == 'date' || options == 'datetime' || options == 'datetimesecond'){
+			if(thisIndex == 0){
+				layPicker.setData(key, Number(thisIndex), lay_picker_date.getMonth(resultArray, key));
+				if(options != 'month'){
+					layPicker.setData(key, Number(thisIndex) + 1, lay_picker_date.getDay(resultArray, key));
+				}
+			}else if(thisIndex == 1 && options != 'month'){
+				layPicker.setData(key, Number(thisIndex), lay_picker_date.getDay(resultArray, key));
+			}
+			if(options != 'month'){
+				var tempDay = resultArray[2][layPicker.fieldList[key].valueField];
+				var lastDay = lay_picker_date.getLastDay(resultArray);
+				if(Number(tempDay) > lastDay){
+					tempDay = lastDay;
+				}
+				valList = [
+					{value: resultArray[0][layPicker.fieldList[key].valueField]},
+					{value: resultArray[1][layPicker.fieldList[key].valueField]},
+					{value: tempDay},
+				];
+				if(options == 'datetime' || options == 'datetimesecond'){
+					if(thisIndex == 0){
+						layPicker.setData(key, Number(thisIndex) + 2, lay_picker_date.getHours(resultArray, key));
+						layPicker.setData(key, Number(thisIndex) + 3, lay_picker_date.getMinutes(resultArray, key));
+					}else if(thisIndex == 1){
+						layPicker.setData(key, Number(thisIndex) + 1, lay_picker_date.getHours(resultArray, key));
+						layPicker.setData(key, Number(thisIndex) + 2, lay_picker_date.getMinutes(resultArray, key));
+					}else if(thisIndex == 2){
+						layPicker.setData(key, Number(thisIndex) , lay_picker_date.getHours(resultArray, key));
+						layPicker.setData(key, Number(thisIndex) + 1, lay_picker_date.getMinutes(resultArray, key));
+					}else if(thisIndex == 3){
+						layPicker.setData(key, thisIndex, lay_picker_date.getMinutes(resultArray, key));
+					}
+					valList.push({value: resultArray[3][layPicker.fieldList[key].valueField]})
+					valList.push({value: resultArray[4][layPicker.fieldList[key].valueField]})
+					if(options == 'datetimesecond'){
+						if(thisIndex == 0){
+							layPicker.setData(key, Number(thisIndex) + 4, lay_picker_date.getSeconds(resultArray, key));
+						}else if(thisIndex == 1){
+							layPicker.setData(key, Number(thisIndex) + 3, lay_picker_date.getSeconds(resultArray, key));
+						}else if(thisIndex == 2){
+							layPicker.setData(key, Number(thisIndex) + 2, lay_picker_date.getSeconds(resultArray, key));
+						}else if(thisIndex == 3){
+							layPicker.setData(key, Number(thisIndex) + 1, lay_picker_date.getSeconds(resultArray, key));
+						}else if(thisIndex == 4){
+							layPicker.setData(key, Number(thisIndex), lay_picker_date.getSeconds(resultArray, key));
+						}
+						valList.push({value: resultArray[5][layPicker.fieldList[key].valueField]})
+					}
+				}
+			}
+		}
+		if(options == 'time' || options == 'timesecond'){
+			if(thisIndex == 0){
+				layPicker.setData(key, thisIndex, lay_picker_date.getMinutes(resultArray, key, 1));
+			}
+			valList = [
+				{value: resultArray[0][layPicker.fieldList[key].valueField]},
+				{value: resultArray[1][layPicker.fieldList[key].valueField]},
+			];
+			if(options == 'timesecond'){
+				if(thisIndex == 0){
+					layPicker.setData(key, Number(thisIndex) + 1, lay_picker_date.getSeconds(resultArray, key, 1));
+				}else if(thisIndex == 1){
+					layPicker.setData(key, Number(thisIndex), lay_picker_date.getSeconds(resultArray, key, 1));
+				}
+				valList.push({value: resultArray[2][layPicker.fieldList[key].valueField]});
+			}
+		}
+		return valList;
+	},
+	initBody: function(data, index){
+		var s = '';
+		s += '<div class="lay-picker lay-picker-'+index+'" lay-index="'+index+'" style="display: none;">';
+		if(data.shade !== false){
+			if(data.shade){
+				s += '	<div class="lay-picker-shade" style="background: rgba(0, 0, 0, '+data.shade+');"></div>';
+			}else{
+				s += '	<div class="lay-picker-shade"></div>';
+			}
+		}
+		var cancel = '取消',clear = '清空', confirm = '确定';
+		if(data.btns && data.btns.length > 0){
+			cancel = data.btns[0];
+			clear = data.btns[1];
+			confirm = data.btns[2];
+		}
+		if(data.type == 3){
+			var radius = (data.radius?'border-radius: '+data.radius+'px '+data.radius+'px 0px 0;':'');
+			s += '	<div class="lay-picker-container" style=";transform: translate3d(0px, 100%, 0px);'+radius+'">';
+			s += '		<div class="lay-picker-content" style="overflow: auto;">';
+			s += (data.content || '');
+			s += '		</div>';
+			s += '	</div>';
+			s += '</div>';
+		}else if(data.type == 2){
+			var sumHeight = 350; // 高度超出出现滚动条
+			sumHeight = (data.title) ? sumHeight += 80 : sumHeight;
+			sumHeight = (data.search) ? sumHeight += 80 : sumHeight;
+			var h = $(window).height();
+			var radius = (data.radius?'border-radius: '+data.radius+'px '+data.radius+'px 0px 0;':'');
+			s += '	<div class="lay-picker-container" style="transform: translate3d(0px, 100%, 0px);'+radius+''+(sumHeight > h ? 'overflow: auto;height: 100%;':'')+'">';
+			if(data.title){
+				s += '		<div class="lay-picker-header" style="'+radius+'">';
+				s += '			<div class="lay-picker-title">'+(data.title || '')+'</div>';
+				s += '		</div>';
+			}
+			if(data.search){
+				s += '		<div class="lay-picker-search" style="'+radius+'">';
+				s += '			<input type="text" id="lay-picker-input-'+index+'" placeholder="'+((typeof data.search === "string") ? data.search : '请输入搜索内容')+'"/>';
+				s += '		</div>';
+			}
+			s += '		<div class="lay-picker-content" style="'+(data.title ? '' : 'margin: 30px 15px;')+'">';
+			s += '			<div class="lay-picker-shadowup"></div>';
+			s += '			<div class="lay-picker-shadowdown"></div>';
+			s += '			<div class="lay-picker-box"></div>';
+			s += '		</div>';
+			s += '		<div class="lay-picker-bottom">';
+			s += '			<span class="lay-picker-cancel-click lay-picker-bottom-btn lay-picker-bottom-btn-cancel">'+cancel+'</span>';
+			s += '			<span class="lay-picker-clear-click lay-picker-bottom-btn lay-picker-bottom-btn-clear">'+clear+'</span>';
+			s += '			<span class="lay-picker-confirm-click lay-picker-bottom-btn lay-picker-bottom-btn-confirm">'+confirm+'</span>';
+			s += '		</div>';
+			s += '	</div>';
+			s += '</div>';
+		}else{
+			var sumHeight = 350; // 高度超出出现滚动条
+			sumHeight = (data.search) ? sumHeight += 80 : sumHeight;
+			var h = $(window).height();
+			var radius = (data.radius?'border-radius: '+data.radius+'px '+data.radius+'px 0px 0;':'');
+			s += '	<div class="lay-picker-container" style="transform: translate3d(0px, 100%, 0px);'+radius+''+(sumHeight > h ? 'overflow: auto;height: 100%;':'')+'">';
+			s += '		<div class="lay-picker-header" style="'+radius+'">';
+			s += '			<div class="lay-picker-title">'+(data.title || '')+'</div>';
+			s += '			<div class="lay-picker-btn">';
+			s += '				<span class="lay-picker-cancel lay-picker-cancel-click">'+cancel+'</span>';
+			s += '				<span class="lay-picker-clear lay-picker-clear-click">'+clear+'</span>';
+			s += '				<span class="lay-picker-confirm lay-picker-confirm-click">'+confirm+'</span>';
+			s += '			</div>';
+			s += '		</div>';
+			if(data.search){
+				s += '		<div class="lay-picker-search" style="'+radius+'">';
+				s += '			<input type="text" id="lay-picker-input-'+index+'" placeholder="'+((typeof data.search === "string") ? data.search : '请输入搜索内容')+'"/>';
+				s += '		</div>';
+			}
+			s += '		<div class="lay-picker-content">';
+			s += '			<div class="lay-picker-shadowup"></div>';
+			s += '			<div class="lay-picker-shadowdown"></div>';
+			s += '			<div class="lay-picker-box"></div>';
+			s += '		</div>';
+			s += '	</div>';
+			s += '</div>';
+		}
+		return s;
+	},
+	initBox: function(data, index){
+		var len = 100 / data.length;
+		var box = $('.lay-picker-'+index).find('.lay-picker-box');
+		for(var i=0; i<data.length; i++){
+			var div = $('<div index="'+i+'" class="lay-picker-list-wrap" style="width: '+len+'%;"></div>');
+			var ul = $('<ul style="transform: translate3d(0px, 0, 0px);"></ul>');
+			for(var j=0; j<data[i].length; j++){
+				var li = $('<li>'+data[i][j][layPicker.fieldList[index].textField]+'</li>');
+				ul.append(li);
+			}
+			div.append(ul);
+			box.append(div);
+		}
+	},
+	initSelect: function(index){
+		var list = layPicker.dataList[index];
+		for(var i=0; i<list.length; i++){
+			layPicker.selectList[index][i+''] = 0;
+		}
+	},
+	setData: function(index, i, data, trends){
+		var t_index = (Number(i) + 1);
+		var ul = $('.lay-picker-'+index).find('.lay-picker-box').find('[index='+t_index+']>ul');
+		ul.empty();
+		ul.css('transform', 'translate3d(0px, 0px, 0px)');
+		for(var i=0; i<data.length; i++){
+			var li = $('<li>'+data[i][layPicker.fieldList[index].textField]+'</li>');
+			ul.append(li);
+		}
+		layPicker.selectList[index][t_index+''] = 0;
+		layPicker.dataList[index][t_index] = data;
+
+	},
+	setDataTrends: function(index, i, data){
+		var t_index = (Number(i) + 1);
+		if(!data || data.length == 0){
+			layPicker.deleteData(index, i, t_index);
+			var len = 100 / layPicker.dataList[index].length;
+			$('.lay-picker-'+index).find('.lay-picker-list-wrap').css('width', len+'%');
+			return;
+		}
+		var data_len = t_index > layPicker.dataList[index].length-1;
+		if(data_len){
+			layPicker.dataList[index].push(data);
+		}else{
+			layPicker.dataList[index][t_index] = data;
+			layPicker.deleteData(index, t_index, t_index+1);
+		}
+		var box = $('.lay-picker-'+index).find('.lay-picker-box');
+		var len = 100 / layPicker.dataList[index].length;
+		$('.lay-picker-'+index).find('.lay-picker-list-wrap').css('width', len+'%');
+		if(data_len){
+			var div = $('<div index="'+t_index+'" class="lay-picker-list-wrap" style="width: '+len+'%;"><ul style="transform: translate3d(0px, 0, 0px);"></ul></div>');
+			box.append(div);
+		}
+		var ul = $('.lay-picker-'+index).find('.lay-picker-box').find('[index='+t_index+']>ul');
+		ul.empty();
+		ul.css('transform', 'translate3d(0px, 0px, 0px)');
+		for(var i=0; i<data.length; i++){
+			var li = $('<li>'+data[i][layPicker.fieldList[index].textField]+'</li>');
+			ul.append(li);
+		}
+		layPicker.selectList[index][t_index+''] = 0;
+	},
+	deleteData: function(index, i, t_index){
+		if(layPicker.dataList[index].length > Number(i)){
+			for(var i=t_index; i<layPicker.dataList[index].length; i++){
+				layPicker.dataList[index].splice(i, 1);
+				$('.lay-picker-'+index).find('.lay-picker-box').find('[index='+i+']').remove();
+				return layPicker.deleteData(index, i, t_index);
+			}
+		}
+	},
+	setValue: function(index, data, options){
+		var list = layPicker.dataList[index];
+		var box = $('.lay-picker-'+index).find('.lay-picker-box');
+		for(var i=0; i<data.length; i++){
+			data[i].value = Number(data[i].value) < 10 ? '0'+Number(data[i].value) : data[i].value;
+		}
+		if(!options && layPicker.minMaxData[index]){
+			options = layPicker.minMaxData[index]['options'];
+		}
+		for(var i=0; i<data.length; i++){
+			var arr = list[i];
+			for(var j=0; j<arr.length; j++){
+				if(arr[j][layPicker.fieldList[index].valueField] == data[i][layPicker.fieldList[index].valueField]){
+					layPicker.selectList[index][i+''] = j;
+					if(options){
+						layPicker.setOptionsValue(options, index, data, i);
+					}
+					var y = j * layPicker.liHeight;
+					box.find('[index='+i+']>ul').css('transform', 'translate3d(0px, -'+y+'px, 0px)');
+				}
+			}
+		}
+	},
+	setOptionsValue: function(options, key, resultArray, thisIndex){
+		if(options == 'month' || options == 'date' || options == 'datetime' || options == 'datetimesecond'){
+			if(thisIndex == 0){
+				layPicker.setData(key, Number(thisIndex), lay_picker_date.getMonth(resultArray, key));
+			}else if(thisIndex == 1 && options != 'month'){
+				layPicker.setData(key, Number(thisIndex), lay_picker_date.getDay(resultArray, key));
+			}
+			if(options == 'datetime' || options == 'datetimesecond'){
+				if(thisIndex == 2){
+					layPicker.setData(key, Number(thisIndex) , lay_picker_date.getHours(resultArray, key));
+				}else if(thisIndex == 3){
+					layPicker.setData(key, thisIndex, lay_picker_date.getMinutes(resultArray, key));
+				}
+				if(options == 'datetimesecond'){
+					if(thisIndex == 4){
+						layPicker.setData(key, Number(thisIndex), lay_picker_date.getSeconds(resultArray, key));
+					}
+				}
+			}
+		}
+		if(options == 'time' || options == 'timesecond'){
+			if(thisIndex == 0){
+				layPicker.setData(key, thisIndex, lay_picker_date.getMinutes(resultArray, key, 1));
+			}
+			if(options == 'timesecond'){
+				if(thisIndex == 1){
+					layPicker.setData(key, Number(thisIndex), lay_picker_date.getSeconds(resultArray, key, 1));
+				}
+			}
+		}
+	},
+	hiden: function(index){
+		$('.lay-picker-'+index).find('.lay-picker-container').css('transform', 'translate3d(0px, 100%, 0px)');
+		$('.lay-picker-'+index).find('.lay-picker-shade').fadeOut(200);
+		setTimeout(function(){
+			$('.lay-picker-'+index).css('display', 'none');
+		}, 100)
+	},
+	show: function(index){
+		$('.lay-picker-'+index).css('display', 'block');
+		$('.lay-picker-'+index).find('.lay-picker-shade').fadeIn(200);
+		setTimeout(function(){
+			$('.lay-picker-'+index).find('.lay-picker-container').css('transform', 'translate3d(0px, 0px, 0px)');
+		}, 10)
+		$(".lay-picker-not-mobile").remove();
+		if(!layPicker.isMobile()){
+			$(".lay-picker-container").append("<div class='lay-picker-not-mobile' style='padding: 15px 0; color: #999;text-align: center;'>非手机模式无法滑动</div>")
+		}
+	},
+	remove: function(index){
+		layPicker.hiden(index);
+		setTimeout(function(){
+			$('.lay-picker-'+index).remove();
+		}, 200)
+		for(var i=0; i<layPicker.indexList.length; i++){
+			if(layPicker.indexList[i] == index){
+				layPicker.indexList.splice(i, 1);
+				break;
+			}
+		}
+	},
+	removeAll: function(){
+		if(layPicker.indexList.length > 0){
+			for(var i=0; i<layPicker.indexList.length; i++){
+				layPicker.hiden(layPicker.indexList[i]);
+				var index = layPicker.indexList[i];
+				layPicker.removeTime(index);
+				layPicker.indexList.splice(i, 1);
+				return layPicker.removeAll();
+			}
+		}
+	},
+	removeTime: function(index){
+		setTimeout(function(){
+			$('.lay-picker-'+index).remove();
+		}, 200)
+	},
+	/** 判断是否是手机打开*/
+	isMobile: function () {
+	  return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|DingTalk|Opera Mini/i.test(navigator.userAgent);
+	},
+}
+
+/**
+ * 日期对象
+ */
+var lay_picker_date = {
+	getVoluation: function(value, key){
+		var date_obj = lay_picker_date.getDateTime();
+		var year_obj = {};
+		year_obj[''+key] = date_obj.year;
+		var month_obj = {};
+		month_obj[''+key] = date_obj.month;
+		var day_obj = {};
+		day_obj[''+key] = date_obj.day;
+		var hours_obj = {};
+		hours_obj[''+key] = date_obj.hours;
+		var minutes_obj = {};
+		minutes_obj[''+key] = date_obj.minutes;
+		var seconds_obj = {};
+		seconds_obj[''+key] = date_obj.seconds;
+		if(value == 'year'){
+			return [year_obj];
+		}else if(value == 'month'){
+			return [year_obj, month_obj];
+		}else if(value == 'date'){
+			return [year_obj, month_obj, day_obj];
+		}else if(value == 'time'){
+			return [hours_obj, minutes_obj];
+		}else if(value == 'timesecond'){
+			return [hours_obj, minutes_obj, seconds_obj];
+		}else if(value == 'datetime'){
+			return [year_obj, month_obj, day_obj, hours_obj, minutes_obj];
+		}else if(value == 'datetimesecond'){
+			return [year_obj, month_obj, day_obj, hours_obj, minutes_obj, seconds_obj];
+		}
+	},
+	getData: function(value, key){
+		if(value == 'year'){
+			var years = lay_picker_date.getYear(key);
+			return [years];
+		}else if(value == 'month'){
+			var years = lay_picker_date.getYear(key);
+			var date_obj = lay_picker_date.getDateTime();
+			var months = lay_picker_date.getMonth(
+				[
+					{value: years[0].value},
+					{value: date_obj.month},
+				]
+			, key);
+			return [years, months];
+		}else if(value == 'date'){
+			var years = lay_picker_date.getYear(key);
+			var date_obj = lay_picker_date.getDateTime();
+			var months = lay_picker_date.getMonth(
+				[
+					{value: years[0].value},
+					{value: date_obj.month},
+				]
+			, key);
+			var days = lay_picker_date.getDay(
+				[
+					{value: years[0].value},
+					{value: months[0].value},
+					{value: date_obj.day},
+				]
+			, key);
+			return [years, months, days];
+		}else if(value == 'time'){
+			var hourss = lay_picker_date.getHours(null, key, 1);
+			var date_obj = lay_picker_date.getDateTime();
+			var minutess = lay_picker_date.getMinutes(
+				[
+					{value: hourss[0].value},
+					{value: date_obj.minutes},
+				]
+			, key, 1);
+			return [hourss, minutess];
+		}else if(value == 'timesecond'){
+			var hourss = lay_picker_date.getHours(null, key, 1);
+			var date_obj = lay_picker_date.getDateTime();
+			var minutess = lay_picker_date.getMinutes(
+				[
+					{value: hourss[0].value},
+					{value: date_obj.minutes},
+				]
+			, key, 1);
+			var secondss = lay_picker_date.getSeconds(
+				[
+					{value: hourss[0].value},
+					{value: minutess[0].value},
+					{value: date_obj.seconds},
+				]
+			, key, 1);
+			return [hourss, minutess, secondss];
+		}else if(value == 'datetime'){
+			var years = lay_picker_date.getYear(key);
+			var date_obj = lay_picker_date.getDateTime();
+			var months = lay_picker_date.getMonth(
+				[
+					{value: years[0].value},
+					{value: date_obj.month},
+				]
+			, key);
+			var days = lay_picker_date.getDay(
+				[
+					{value: years[0].value},
+					{value: months[0].value},
+					{value: date_obj.day},
+				]
+			, key);
+			var hourss = lay_picker_date.getHours(
+				[
+					{value: years[0].value},
+					{value: months[0].value},
+					{value: days[0].value},
+				], key);
+			var minutess = lay_picker_date.getMinutes(
+				[
+					{value: years[0].value},
+					{value: months[0].value},
+					{value: days[0].value},
+					{value: hourss[0].value},
+				], key);
+			return [years, months, days, hourss, minutess];
+		}else if(value == 'datetimesecond'){
+			var years = lay_picker_date.getYear(key);
+			var date_obj = lay_picker_date.getDateTime();
+			var months = lay_picker_date.getMonth(
+				[
+					{value: years[0].value},
+					{value: date_obj.month},
+				]
+			, key);
+			var days = lay_picker_date.getDay(
+				[
+					{value: years[0].value},
+					{value: months[0].value},
+					{value: date_obj.day},
+				]
+			, key);
+			var hourss = lay_picker_date.getHours(
+				[
+					{value: years[0].value},
+					{value: months[0].value},
+					{value: days[0].value},
+				], key);
+			var minutess = lay_picker_date.getMinutes(
+				[
+					{value: years[0].value},
+					{value: months[0].value},
+					{value: days[0].value},
+					{value: hourss[0].value},
+				], key);
+			var secondss = lay_picker_date.getSeconds(
+				[
+					{value: years[0].value},
+					{value: months[0].value},
+					{value: days[0].value},
+					{value: hourss[0].value},
+					{value: minutess[0].value},
+				], key);
+			return [years, months, days, hourss, minutess, secondss];
+		}
+	},
+	getDateTime: function() {
+	    var myDate = new Date();
+	    var year = myDate.getFullYear(); //获取年
+	    var month = myDate.getMonth() + 1; //获取月，默认从0开始，所以要加一
+	    month = ('00' + month).slice(-2);
+	    var day = ('00' + myDate.getDate()).slice(-2); //获取日
+	    var hours = ('00' + myDate.getHours()).slice(-2); //获取小时
+	    var minutes = ('00' + myDate.getMinutes()).slice(-2); //获取分
+	    var seconds = ('00' + myDate.getSeconds()).slice(-2); //获取秒
+		return {
+			year: year,
+			month: month,
+			day: day,
+			hours: hours,
+			minutes: minutes,
+			seconds: seconds,
+		}
+	},
+	getYear: function(key){
+		var arr = [],
+			now = new Date();
+		var minYear = 1900;
+		var maxYear = now.getFullYear() + 60;
+		if(key){
+			var minObj = layPicker.minMaxData[key].minObj;
+			if(minObj && minObj.ymd){
+				minYear = Number(minObj.ymd[0]);
+			}
+			var maxObj = layPicker.minMaxData[key].maxObj;
+			if(maxObj && maxObj.ymd){
+				maxYear = Number(maxObj.ymd[0]);
+			}
+		}
+		for(var i = minYear; i <= maxYear; i++) {
+			arr.push({
+				name: i + '年',
+				value: i
+			});
+		}
+		return arr;
+	},
+	getMonth: function(result, key) {
+		var year = result[0].value;
+		var arr = [];
+		var minMonth = 1;
+		var maxMonth = 12;
+		if(key){
+			var minObj = layPicker.minMaxData[key].minObj;
+			if(minObj && minObj.ymd){
+				if(year == minObj.ymd[0]){
+					minMonth = Number(minObj.ymd[1]);
+				}else{
+					var d1 = Number(year+''+result[1].value);
+					var d2 = Number(minObj.ymd[0]+''+minObj.ymd[1]);
+					if(d1 <= d2){
+						minMonth = Number(minObj.ymd[1]);
+					}
+				}
+			}
+			var maxObj = layPicker.minMaxData[key].maxObj;
+			if(maxObj && maxObj.ymd){
+				if(year == maxObj.ymd[0]){
+					maxMonth = Number(maxObj.ymd[1]);
+				}else{
+					var d1 = Number(year+''+result[1].value);
+					var d2 = Number(maxObj.ymd[0]+''+maxObj.ymd[1]);
+					if(d1 >= d2){
+						maxMonth = Number(maxObj.ymd[1]);
+					}
+				}
+			}
+		}
+		for(var i = minMonth; i <= maxMonth; i++) {
+			var code = ('00' + i).slice(-2);
+			arr.push({
+				name: i + '月',
+				value: code
+			});
+		}
+		return arr;
+	},
+	getDay: function(result, key) {
+		var year = result[0].value,
+			month = result[1].value;
+		var thisDate = new Date(Number(year), Number(month), 0);
+		var maxDay = thisDate.getDate();
+		var minDay = 1;
+		if(key){
+			var minObj = layPicker.minMaxData[key].minObj;
+			if(minObj && minObj.ymd){
+				if(year == minObj.ymd[0] && month == minObj.ymd[1]){
+					minDay = Number(minObj.ymd[2]);
+				}else{
+					var d1 = Number(year+''+month+''+result[1].value);
+					var d2 = Number(minObj.ymd[0]+''+minObj.ymd[1]+''+minObj.ymd[2]);
+					if(d1 <= d2){
+						minDay = Number(minObj.ymd[2]);
+					}
+				}
+			}
+			var maxObj = layPicker.minMaxData[key].maxObj;
+			if(maxObj && maxObj.ymd){
+				if(year == maxObj.ymd[0] && month == maxObj.ymd[1]){
+					maxDay = Number(maxObj.ymd[2]);
+				}else{
+					var d1 = Number(year+''+month+''+result[1].value);
+					var d2 = Number(maxObj.ymd[0]+''+maxObj.ymd[1]+''+maxObj.ymd[2]);
+					if(d1 >= d2){
+						maxDay = Number(maxObj.ymd[2]);
+					}
+				}
+			}
+		}
+		var arr = [];
+		for(var i = minDay; i <= maxDay; i++) {
+			var code = ('00' + i).slice(-2);
+			arr.push({
+				name: i + '日',
+				value: code
+			});
+		}
+		return arr;
+	},
+	getHours: function(result, key, type) {
+		var arr = [];
+		var minHour = 0;
+		var maxHour = 23;
+		if(key){
+			if(type){
+				var minObj = layPicker.minMaxData[key].minObj;
+				if(minObj && minObj.hms){
+					minHour = Number(minObj.hms[0]);
+				}
+				var maxObj = layPicker.minMaxData[key].maxObj;
+				if(maxObj && maxObj.hms){
+					maxHour = Number(maxObj.hms[0]);
+				}
+			}else{
+				var year = result[0].value,
+				month = result[1].value,
+				day = result[2].value;
+				var minObj = layPicker.minMaxData[key].minObj;
+				if(minObj && minObj.hms){
+					if(minObj && minObj.ymd){
+						var d1 = Number(year+''+month+''+day+''+minObj.hms[0]);
+						var d2 = Number(minObj.ymd[0]+''+minObj.ymd[1]+''+minObj.ymd[2]+''+minObj.hms[0]);
+						if(d1 <= d2){
+							minHour = Number(minObj.hms[0]);
+						}
+					}else{
+						minHour = Number(minObj.hms[0]);
+					}
+				}
+				var maxObj = layPicker.minMaxData[key].maxObj;
+				if(maxObj && maxObj.hms){
+					if(maxObj && maxObj.ymd){
+						var d1 = Number(year+''+month+''+day+''+maxObj.hms[0]);
+						var d2 = Number(maxObj.ymd[0]+''+maxObj.ymd[1]+''+maxObj.ymd[2]+''+maxObj.hms[0]);
+						if(d1 >= d2){
+							maxHour = Number(maxObj.hms[0]);
+						}
+					}else{
+						maxHour = Number(maxObj.hms[0]);
+					}
+				}
+			}
+		}
+		for(var i = minHour; i <= maxHour; i++) {
+			var value = ('00' + i).slice(-2);
+			arr.push({
+				name: value + '时',
+				value: value
+			})
+		}
+		return arr;
+	},
+	getMinutes: function(result, key, type) {
+		var arr = [];
+		var minMinute = 0;
+		var maxMinute = 59;
+		if(key){
+			if(type){
+				var hours = result[0].value;
+				var minObj = layPicker.minMaxData[key].minObj;
+				if(minObj && minObj.hms){
+					var d1 = Number(hours +''+ minObj.hms[1]);
+					var d2 = Number(minObj.hms[0] +''+ minObj.hms[1]);
+					if(d1 <= d2){
+						minMinute = Number(minObj.hms[1]);
+					}
+				}
+				var maxObj = layPicker.minMaxData[key].maxObj;
+				if(maxObj && maxObj.hms){
+					var d1 = Number(hours +''+ maxObj.hms[1]);
+					var d2 = Number(maxObj.hms[0] +''+ maxObj.hms[1]);
+					if(d1 >= d2){
+						maxMinute = Number(maxObj.hms[1]);
+					}
+				}
+			}else{
+				var year = result[0].value,
+				month = result[1].value,
+				day = result[2].value;
+				hours = result[3].value;
+				var minObj = layPicker.minMaxData[key].minObj;
+				if(minObj && minObj.hms){
+					if(minObj && minObj.ymd){
+						var d1 = Number(year+''+month+''+day+''+hours+''+minObj.hms[1]);
+						var d2 = Number(minObj.ymd[0]+''+minObj.ymd[1]+''+minObj.ymd[2]+''+minObj.hms[0]+''+minObj.hms[1]);
+						if(d1 <= d2){
+							minMinute = Number(minObj.hms[1]);
+						}
+					}else{
+						minMinute = Number(minObj.hms[1]);
+					}
+				}
+				var maxObj = layPicker.minMaxData[key].maxObj;
+				if(maxObj && maxObj.hms){
+					if(maxObj && maxObj.ymd){
+						var d1 = Number(year+''+month+''+day+''+hours+''+maxObj.hms[1]);
+						var d2 = Number(maxObj.ymd[0]+''+maxObj.ymd[1]+''+maxObj.ymd[2]+''+maxObj.hms[0]+''+maxObj.hms[1]);
+						if(d1 >= d2){
+							maxMinute = Number(maxObj.hms[1]);
+						}
+					}else{
+						maxMinute = Number(maxObj.hms[1]);
+					}
+				}
+			}
+		}
+		for(var i = minMinute; i <= maxMinute; i++) {
+			var value = ('00' + i).slice(-2);
+			arr.push({
+				name: value + '分',
+				value: value
+			})
+		}
+		return arr;
+	},
+	getSeconds: function(result, key, type) {
+		var arr = [];
+		var minSecond = 0;
+		var maxSecond = 59
+		if(key){
+			if(type){
+				var hours = result[0].value;
+				var minute = result[1].value;
+				var minObj = layPicker.minMaxData[key].minObj;
+				if(minObj && minObj.hms && minObj.hms.length > 2){
+					var d1 = Number(hours +''+ minute+''+ minObj.hms[2]);
+					var d2 = Number(minObj.hms[0] +''+ minObj.hms[1]+''+ minObj.hms[2]);
+					if(d1 <= d2){
+						minSecond = Number(minObj.hms[2]);
+					}
+				}
+				var maxObj = layPicker.minMaxData[key].maxObj;
+				if(maxObj && maxObj.hms && maxObj.hms.length > 2){
+					var d1 = Number(hours +''+ minute+''+ maxObj.hms[2]);
+					var d2 = Number(maxObj.hms[0] +''+ maxObj.hms[1]+''+ maxObj.hms[2]);
+					if(d1 >= d2){
+						maxSecond = Number(maxObj.hms[2]);
+					}
+				}
+			}else{
+				var year = result[0].value,
+				month = result[1].value,
+				day = result[2].value;
+				hours = result[3].value;
+				minute = result[4].value;
+				var minObj = layPicker.minMaxData[key].minObj;
+				if(minObj && minObj.hms){
+					if(minObj && minObj.ymd){
+						var d1 = Number(year+''+month+''+day+''+hours+''+minute+''+minObj.hms[2]);
+						var d2 = Number(minObj.ymd[0]+''+minObj.ymd[1]+''+minObj.ymd[2]+''+minObj.hms[0]+''+minObj.hms[1]+''+minObj.hms[2]);
+						if(d1 <= d2){
+							minSecond = Number(minObj.hms[2]);
+						}
+					}else{
+						minSecond = Number(minObj.hms[2]);
+					}
+				}
+				var maxObj = layPicker.minMaxData[key].maxObj;
+				if(maxObj && maxObj.hms){
+					if(maxObj && maxObj.ymd){
+						var d1 = Number(year+''+month+''+day+''+hours+''+minute+''+maxObj.hms[2]);
+						var d2 = Number(maxObj.ymd[0]+''+maxObj.ymd[1]+''+maxObj.ymd[2]+''+maxObj.hms[0]+''+maxObj.hms[1]+''+maxObj.hms[2]);
+						if(d1 >= d2){
+							maxSecond = Number(maxObj.hms[2]);
+						}
+					}else{
+						maxSecond = Number(maxObj.hms[2]);
+					}
+				}
+			}
+		}
+		for(var i = minSecond; i <= maxSecond; i++) {
+			var value = ('00' + i).slice(-2);
+			arr.push({
+				name: value + '秒',
+				value: value
+			})
+		}
+		return arr;
+	},
+	getLastDay: function(result){
+		var year = result[0].value,
+			month = result[1].value;
+		var thisDate = new Date(Number(year), Number(month), 0);
+		return thisDate.getDate();
+	},
+	getMinOrMaxDate: function(date){
+		if(!date){
+			return;
+		}
+		var arr = date.split(" ");
+		var obj = {};
+		if(arr.length > 0){
+			if(arr.length == 2){
+				obj.ymd = arr[0].split("-");
+				obj.hms = arr[1].split(":");
+			}else if(arr.length == 1 && date.indexOf(":") == -1){
+				obj.ymd = arr[0].split("-");
+			}else{
+				obj.hms = arr[0].split(":");
+			}
+		}
+		return obj;
+	},
+}
+
+$('body').on('click', '.tool-time', function () {
+	let elem = $(this);
+	let type = $(this).data('type');
+	let min = $(this).data('min');
+	let max = $(this).data('max');
+	if (typeof(type) == "undefined" || type === '') {
+		type = 'date';
+	}
+	if (typeof(min) == "undefined" || min === '') {
+		minDate = '1900-1-1';
+	}
+	if (typeof(max) == "undefined" || max === '') {
+		maxDate = '2099-1-1';
+	}
+	layPicker.init({
+		elem: elem, // 绑定元素
+		options: type, // 设置为日期选择器（日期选择器可设置：year、month、date、time、timesecond、datetime、datetimesecond），不设置默认取data作为选择值
+		onSuccess: function(index, elem){ // 渲染成功回调
+			layPicker.show(index);
+			/*
+			layPicker.setValue(index, [ // 赋值，以位置类推
+				{value: ''},
+				{value: ''},
+				{value: ''}, 
+			])
+			*/
+		},
+		onClear: function(index){ // 停止滚动触发：index是当前对象的标识， i 是当前滑动的对象，result是前面的值集
+			elem.val('');
+			layPicker.remove(index);
+		},
+		onConfirm: function(index, val, result){ // 点击确认回调
+			elem.val(val)
+			layPicker.remove(index);
+		},
+		onCancel: function(index){ // 点击取消回调
+			layPicker.remove(index);
+		},
+		onShade: function(index){ // 点击遮罩回调
+			layPicker.remove(index);
+		}
+	});
+	return false;
+});
+
+$('body').on('click', '.picker-oa', function () {
+	let elem = $(this);
+	let url = $(this).data('url');
+	let field = $(this).data('field');
+	if (typeof(url) == "undefined" || url === '') {
+		return false;
+	}
+	if (typeof(field) == "undefined" || field === '') {
+		field = 'title';
+	}
+	let loading;
+	$.ajax({
+		url: url,
+		type: 'get',
+		data:{limit:999999},
+		beforeSend:function(){
+			loading = layer.loading('加载中...');
+		},
+		success: function (e) {
+			if (e.code == 0) {
+				let pickerData = e.data;
+				layPicker.init({
+					elem: elem, // 绑定元素
+					data: [pickerData],
+					textField: field,
+					valueField: 'id',
+					search:true,
+					onSuccess: function(index, elem){ // 渲染成功回调
+						layPicker.show(index);
+						layPicker.setValue(index, [ // 赋值，以位置类推
+							{value: ''}
+						])
+					},
+					onClear: function(index){
+						elem.val('');
+						elem.next().val('');
+						layPicker.remove(index);
+					},
+					onConfirm: function(index, val, result){ // 点击确认回调
+						if(result.length>0){
+							elem.val(result[0][field]);
+							elem.next().val(result[0].id);
+						}
+						layPicker.remove(index);
+					},
+					onCancel: function(index){ // 点击取消回调
+						layPicker.remove(index);
+					},
+					onShade: function(index){ // 点击遮罩回调
+						layPicker.remove(index);
+					}
+				});
+			}
+		},
+		complete:function(){
+			layer.close(loading);
+		}
+	})
+	return false;
+});
+
+exports('picker', layPicker);
+});
diff --git a/public/static/assets/mbui/module/tab.js b/public/static/assets/mbui/module/tab.js
new file mode 100644
index 0000000000000000000000000000000000000000..fcd6bdef69116390f0bb97a75a162a473ed80434
--- /dev/null
+++ b/public/static/assets/mbui/module/tab.js
@@ -0,0 +1,37 @@
+mbui.define([], function (exports) {
+  var Tab = function () {
+    this.config = {
+      elem: null,
+      trigger: 'click',
+      ontab: null
+    };
+  };
+
+  // 初始化Tab
+  Tab.prototype.init = function (options) {
+    var that = this;
+    $.extend(true, that.config, options);
+    var elem = $(that.config.elem);
+    var tabs = elem.find('.mbui-tab-title li');
+    var contents = elem.find('.mbui-tab-content .mbui-tab-item');
+
+    tabs.on(that.config.trigger, function () {
+      var index = $(this).index();
+      tabs.removeClass('active');
+      contents.removeClass('mbui-tab-show');
+      $(this).addClass('active');
+      contents.eq(index).addClass('mbui-tab-show');
+
+      // 执行回调函数
+      if (typeof that.config.ontab === 'function') {
+        that.config.ontab(index, $(this));
+      }
+    });
+  };
+
+  // 导出Tab模块
+  exports('tab', function (options) {
+    var tab = new Tab();
+    tab.init(options);
+  });
+});
\ No newline at end of file
diff --git a/public/static/assets/mbui/module/tool.js b/public/static/assets/mbui/module/tool.js
new file mode 100644
index 0000000000000000000000000000000000000000..61c8508b22dc39a2ea6464d90e79055f52327104
--- /dev/null
+++ b/public/static/assets/mbui/module/tool.js
@@ -0,0 +1,863 @@
+/**
+ * tool 工具组件
+ */
+mbui.define([], function (exports) {
+	"use strict";
+	var tool = {
+		ajax: function (options, callback) {
+			let format = 'json';
+			if (options.hasOwnProperty('data')) {
+				format = options.data.hasOwnProperty('format') ? options.data.format : 'json';
+			}
+			callback = callback || options.success;
+			callback && delete options.success;
+			let optsetting = { timeout: 10000 };
+			if (format == 'jsonp') {
+				optsetting = { timeout: 10000, dataType: 'jsonp', jsonp: 'callback' }
+			}
+			let opts = $.extend({}, optsetting, {
+				success: function (res) {
+					if (callback && typeof callback === 'function') {
+						callback(res);
+					}
+				}
+			}, options);
+			$.ajax(opts);
+		},
+		get: function (url, data, callback) {
+			this.ajax({ url: url, type: "GET", data: data }, callback);
+		},
+		post: function (url, data, callback) {
+			this.ajax({ url: url, type: "POST", data: data }, callback);
+		},
+		put: function (url, data, callback) {
+			this.ajax({ url: url, type: "PUT", data: data }, callback);
+		},
+		delete: function (url, data, callback) {
+			this.ajax({ url: url, type: "DELETE", data: data }, callback);
+		},
+		reload: function (delay) {
+			//延迟刷新，一般是在编辑完页面数据后需要自动关闭页面用到
+			if(delay && delay>0){
+				setTimeout(function () {
+					location.reload();
+				}, delay);
+			}else{
+				location.reload();
+			}
+		},
+		replace: function (url,delay) {
+			//延迟刷新，一般是在编辑完页面数据后需要自动关闭页面用到
+			if(delay && delay>0){
+				setTimeout(function () {
+					window.location.replace(url);
+				}, delay);
+			}else{
+				window.location.replace(url);
+			}
+		},
+		// 倒计时
+		countdown: function (options) {
+			var that = this;
+			// 默认可选项
+			options = $.extend(true, {
+				date: new Date(),
+				now: new Date()
+			}, options);
+
+			// 兼容旧版参数
+			var args = arguments;
+			if (args.length > 1) {
+				options.date = new Date(args[0]);
+				options.now = new Date(args[1]);
+				options.clock = args[2];
+			}
+			// 实例对象
+			var inst = {
+				options: options,
+				clear: function () { // 清除计时器
+					clearTimeout(inst.timer);
+				},
+				reload: function (opts) { // 重置倒计时
+					this.clear();
+					$.extend(true, this.options, {
+						now: new Date()
+					}, opts);
+					count();
+				}
+			};
+			typeof options.ready === 'function' && options.ready();
+			// 计算倒计时
+			var count = (function fn() {
+				var date = new Date(options.date);
+				var now = new Date(options.now);
+				var countTime = function (time) {
+					return time > 0 ? time : 0;
+				}(date.getTime() - now.getTime());
+				var result = {
+					d: Math.floor(countTime / (1000 * 60 * 60 * 24)), // 天
+					h: Math.floor(countTime / (1000 * 60 * 60)) % 24, // 时
+					m: Math.floor(countTime / (1000 * 60)) % 60, // 分
+					s: Math.floor(countTime / 1000) % 60 // 秒
+				};
+				var next = function () {
+					now.setTime(now.getTime() + 1000);
+					options.now = now;
+					count();
+				};
+				// 计时 - 以秒间隔
+				inst.timer = setTimeout(next, 1000);
+				typeof options.clock === 'function' && options.clock(result, inst);
+
+				// 计时完成
+				if (countTime <= 0) {
+					clearTimeout(inst.timer);
+					typeof options.done === 'function' && options.done(result, inst);
+				}
+				return fn;
+			})();
+			return inst;
+		},
+		// 某个时间在当前时间的多久前
+		timeAgo: function (time, onlyDate) {
+			var that = this;
+			var arr = [[], []];
+			var stamp = new Date().getTime() - new Date(time).getTime();
+
+			// 返回具体日期
+			if (stamp > 1000 * 60 * 60 * 24 * 31) {
+				stamp = new Date(time);
+				arr[0][0] = that.digit(stamp.getFullYear(), 4);
+				arr[0][1] = that.digit(stamp.getMonth() + 1);
+				arr[0][2] = that.digit(stamp.getDate());
+
+				// 是否输出时间
+				if (!onlyDate) {
+					arr[1][0] = that.digit(stamp.getHours());
+					arr[1][1] = that.digit(stamp.getMinutes());
+					arr[1][2] = that.digit(stamp.getSeconds());
+				}
+				return arr[0].join('-') + ' ' + arr[1].join(':');
+			}
+
+			// 30 天以内，返回「多久前」
+			if (stamp >= 1000 * 60 * 60 * 24) {
+				return ((stamp / 1000 / 60 / 60 / 24) | 0) + ' 天前';
+			} else if (stamp >= 1000 * 60 * 60) {
+				return ((stamp / 1000 / 60 / 60) | 0) + ' 小时前';
+			} else if (stamp >= 1000 * 60 * 3) { // 3 分钟以内为：刚刚
+				return ((stamp / 1000 / 60) | 0) + ' 分钟前';
+			} else if (stamp < 0) {
+				return '未来';
+			} else {
+				return '刚刚';
+			}
+		},
+		// 转化为日期格式字符
+		toDateString: function (time, format, options) {
+			// 若 null 或空字符，则返回空字符
+			if (time === null || time === '') return '';
+			var REGEX_FORMAT = /\[([^\]]+)]|y{1,4}|M{1,2}|d{1,2}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|SSS/g;
+			var that = this;
+			var date = new Date(function () {
+				if (!time) return;
+				return isNaN(time) ? time : (typeof time === 'string' ? parseInt(time) : time)
+			}() || new Date());
+			if (!date.getDate()) return console.log('Invalid millisecond for "tool.toDateString(millisecond)"');
+			var years = date.getFullYear();
+			var month = date.getMonth();
+			var days = date.getDate();
+			var hours = date.getHours();
+			var minutes = date.getMinutes();
+			var seconds = date.getSeconds();
+			var milliseconds = date.getMilliseconds();
+			var defaultMeridiem = function (hours, minutes) {
+				var hm = hours * 100 + minutes;
+				if (hm < 600) {
+					return '凌晨';
+				} else if (hm < 900) {
+					return '早上';
+				} else if (hm < 1100) {
+					return '上午';
+				} else if (hm < 1300) {
+					return '中午';
+				} else if (hm < 1800) {
+					return '下午';
+				}
+				return '晚上';
+			};
+			var meridiem = (options && options.customMeridiem) || defaultMeridiem;
+			var matches = {
+				yy: function () { return String(years).slice(-2); },
+				yyyy: function () { return that.digit(years, 4); },
+				M: function () { return String(month + 1); },
+				MM: function () { return that.digit(month + 1); },
+				d: function () { return String(days); },
+				dd: function () { return that.digit(days); },
+				H: function () { return String(hours); },
+				HH: function () { return that.digit(hours); },
+				h: function () { return String(hours % 12 || 12); },
+				hh: function () { return that.digit(hours % 12 || 12); },
+				A: function () { return meridiem(hours, minutes); },
+				m: function () { return String(minutes); },
+				mm: function () { return that.digit(minutes); },
+				s: function () { return String(seconds); },
+				ss: function () { return that.digit(seconds); },
+				SSS: function () { return that.digit(milliseconds, 3); }
+			};
+			format = format || 'yyyy-MM-dd HH:mm:ss';
+			return format.replace(REGEX_FORMAT, function (match, $1) {
+				return $1 || (matches[match] && matches[match]()) || match;
+			});
+		},
+		//返回10位时间戳
+		time: function () {
+			return Math.floor((new Date).getTime() / 1e3);
+		},
+		/**
+		 *
+		 * @param n 格式化样式Y-m-d H:i:s返回带0 Y-n-j不带0 z一年中第几天要+1才正确 w星期0是周日 N 7是周日D三个字母星期 l英语星期 W周 F月份英语 L闰年判断 c带时区日期时间 r英文形式
+		 * @param t 时间戳
+		 * @returns 格式化时间
+		 */
+		date: function (n, t) {
+			var e, r, u = ["Sun", "Mon", "Tues", "Wednes", "Thurs", "Fri", "Satur", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], o = /\\?(.?)/gi, i = function (n, t) { return r[n] ? r[n]() : t }, c = function (n, t) { for (n = String(n); n.length < t;)n = "0" + n; return n }; r = { d: function () { return c(r.j(), 2) }, D: function () { return r.l().slice(0, 3) }, j: function () { return e.getDate() }, l: function () { return u[r.w()] + "day" }, N: function () { return r.w() || 7 }, S: function () { var n = r.j(), t = n % 10; return t <= 3 && 1 === parseInt(n % 100 / 10, 10) && (t = 0), ["st", "nd", "rd"][t - 1] || "th" }, w: function () { return e.getDay() }, z: function () { var n = new Date(r.Y(), r.n() - 1, r.j()), t = new Date(r.Y(), 0, 1); return Math.round((n - t) / 864e5) }, W: function () { var n = new Date(r.Y(), r.n() - 1, r.j() - r.N() + 3), t = new Date(n.getFullYear(), 0, 4); return c(1 + Math.round((n - t) / 864e5 / 7), 2) }, F: function () { return u[6 + r.n()] }, m: function () { return c(r.n(), 2) }, M: function () { return r.F().slice(0, 3) }, n: function () { return e.getMonth() + 1 }, t: function () { return new Date(r.Y(), r.n(), 0).getDate() }, L: function () { var n = r.Y(); return n % 4 == 0 & n % 100 != 0 | n % 400 == 0 }, o: function () { var n = r.n(), t = r.W(); return r.Y() + (12 === n && t < 9 ? 1 : 1 === n && t > 9 ? -1 : 0) }, Y: function () { return e.getFullYear() }, y: function () { return r.Y().toString().slice(-2) }, a: function () { return e.getHours() > 11 ? "pm" : "am" }, A: function () { return r.a().toUpperCase() }, B: function () { var n = 3600 * e.getUTCHours(), t = 60 * e.getUTCMinutes(), r = e.getUTCSeconds(); return c(Math.floor((n + t + r + 3600) / 86.4) % 1e3, 3) }, g: function () { return r.G() % 12 || 12 }, G: function () { return e.getHours() }, h: function () { return c(r.g(), 2) }, H: function () { return c(r.G(), 2) }, i: function () { return c(e.getMinutes(), 2) }, s: function () { return c(e.getSeconds(), 2) }, u: function () { return c(1e3 * e.getMilliseconds(), 6) }, e: function () { throw new Error("Not supported (see source code of date() for timezone on how to add support)") }, I: function () { return new Date(r.Y(), 0) - Date.UTC(r.Y(), 0) != new Date(r.Y(), 6) - Date.UTC(r.Y(), 6) ? 1 : 0 }, O: function () { var n = e.getTimezoneOffset(), t = Math.abs(n); return (n > 0 ? "-" : "+") + c(100 * Math.floor(t / 60) + t % 60, 4) }, P: function () { var n = r.O(); return n.substr(0, 3) + ":" + n.substr(3, 2) }, T: function () { return "UTC" }, Z: function () { return 60 * -e.getTimezoneOffset() }, c: function () { return "Y-m-d\\TH:i:sP".replace(o, i) }, r: function () { return "D, d M Y H:i:s O".replace(o, i) }, U: function () { return e / 1e3 | 0 } }; return function (n, t) { return e = void 0 === t ? new Date : t instanceof Date ? new Date(t) : new Date(1e3 * t), n.replace(o, i) }(n, t)
+		},
+		/**
+		 *
+		 * @param text 转换参数now +-1 day +- 2 days +-1 week
+		 * @param now 默认当前时间戳
+		 * @returns 字符串转换时间戳
+		 */
+		strtotime: function (text, now) {
+			var parsed, match, today, year, date, days, ranges, len, times, regex, i, fail = false; if (!text) { return fail } text = text.replace(/^\s+|\s+$/g, "").replace(/\s{2,}/g, " ").replace(/[\t\r\n]/g, "").toLowerCase(); match = text.match(/^(\d{1,4})([\-\.\/\:])(\d{1,2})([\-\.\/\:])(\d{1,4})(?:\s(\d{1,2}):(\d{2})?:?(\d{2})?)?(?:\s([A-Z]+)?)?$/); if (match && match[2] === match[4]) { if (match[1] > 1901) { switch (match[2]) { case "-": if (match[3] > 12 || match[5] > 31) { return fail } return new Date(match[1], parseInt(match[3], 10) - 1, match[5], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000; case ".": return fail; case "/": if (match[3] > 12 || match[5] > 31) { return fail } return new Date(match[1], parseInt(match[3], 10) - 1, match[5], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000 } } else { if (match[5] > 1901) { switch (match[2]) { case "-": if (match[3] > 12 || match[1] > 31) { return fail } return new Date(match[5], parseInt(match[3], 10) - 1, match[1], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000; case ".": if (match[3] > 12 || match[1] > 31) { return fail } return new Date(match[5], parseInt(match[3], 10) - 1, match[1], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000; case "/": if (match[1] > 12 || match[3] > 31) { return fail } return new Date(match[5], parseInt(match[1], 10) - 1, match[3], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000 } } else { switch (match[2]) { case "-": if (match[3] > 12 || match[5] > 31 || (match[1] < 70 && match[1] > 38)) { return fail } year = match[1] >= 0 && match[1] <= 38 ? +match[1] + 2000 : match[1]; return new Date(year, parseInt(match[3], 10) - 1, match[5], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000; case ".": if (match[5] >= 70) { if (match[3] > 12 || match[1] > 31) { return fail } return new Date(match[5], parseInt(match[3], 10) - 1, match[1], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000 } if (match[5] < 60 && !match[6]) { if (match[1] > 23 || match[3] > 59) { return fail } today = new Date(); return new Date(today.getFullYear(), today.getMonth(), today.getDate(), match[1] || 0, match[3] || 0, match[5] || 0, match[9] || 0) / 1000 } return fail; case "/": if (match[1] > 12 || match[3] > 31 || (match[5] < 70 && match[5] > 38)) { return fail } year = match[5] >= 0 && match[5] <= 38 ? +match[5] + 2000 : match[5]; return new Date(year, parseInt(match[1], 10) - 1, match[3], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000; case ":": if (match[1] > 23 || match[3] > 59 || match[5] > 59) { return fail } today = new Date(); return new Date(today.getFullYear(), today.getMonth(), today.getDate(), match[1] || 0, match[3] || 0, match[5] || 0) / 1000 } } } } if (text === "now") { return now === null || isNaN(now) ? new Date().getTime() / 1000 | 0 : now | 0 } if (!isNaN(parsed = Date.parse(text))) { return parsed / 1000 | 0 } date = now ? new Date(now * 1000) : new Date(); days = { "sun": 0, "mon": 1, "tue": 2, "wed": 3, "thu": 4, "fri": 5, "sat": 6 }; ranges = { "yea": "FullYear", "mon": "Month", "day": "Date", "hou": "Hours", "min": "Minutes", "sec": "Seconds" }; function lastNext(type, range, modifier) { var diff, day = days[range]; if (typeof day !== "undefined") { diff = day - date.getDay(); if (diff === 0) { diff = 7 * modifier } else { if (diff > 0 && type === "last") { diff -= 7 } else { if (diff < 0 && type === "next") { diff += 7 } } } date.setDate(date.getDate() + diff) } } function process(val) { var splt = val.split(" "), type = splt[0], range = splt[1].substring(0, 3), typeIsNumber = /\d+/.test(type), ago = splt[2] === "ago", num = (type === "last" ? -1 : 1) * (ago ? -1 : 1); if (typeIsNumber) { num *= parseInt(type, 10) } if (ranges.hasOwnProperty(range) && !splt[1].match(/^mon(day|\.)?$/i)) { return date["set" + ranges[range]](date["get" + ranges[range]]() + num) } if (range === "wee") { return date.setDate(date.getDate() + (num * 7)) } if (type === "next" || type === "last") { lastNext(type, range, num) } else { if (!typeIsNumber) { return false } } return true } times = "(years?|months?|weeks?|days?|hours?|minutes?|min|seconds?|sec" + "|sunday|sun\\.?|monday|mon\\.?|tuesday|tue\\.?|wednesday|wed\\.?" + "|thursday|thu\\.?|friday|fri\\.?|saturday|sat\\.?)"; regex = "([+-]?\\d+\\s" + times + "|" + "(last|next)\\s" + times + ")(\\sago)?"; match = text.match(new RegExp(regex, "gi")); if (!match) { return fail } for (i = 0, len = match.length; i < len; i++) { if (!process(match[i])) { return fail } } return (date.getTime() / 1000)
+		},
+		/**
+		 * date_eq('2019-10-22','2019-10-21') true
+		 * @param 前日期
+		 * @param 后日期
+		 * @returns 判断日期是否前边大于后边
+		 */
+		date_eq: function (strDate1, strDate2) {
+			var date1 = new Date(strDate1.replace(/\-/g, "\/")); var date2 = new Date(strDate2.replace(/\-/g, "\/")); if ((date1 - date2) >= 0) { return true; } else { return false; }
+		},
+		/**
+		 * @param 时间戳10位
+		 * @returns 格式化时间
+		 */
+		timeline: function (tt) {
+			var today = new Date(); var d = new Date(tt * 1000); var m = today.getTime() - d.getTime(); if (m <= 0) { m = 1000 } if (m < 60 * 1000) { return Math.floor(m / 1000) + "秒前" } else { if (m < 60 * 60 * 1000) { return Math.floor(m / (1000 * 60)) + "分钟前" } else { if (m < 60 * 60 * 1000 * 24) { return Math.floor(m / (1000 * 60 * 60)) + "小时前" } else { if (m < 60 * 60 * 1000 * 24 * 7) { return Math.floor(m / (1000 * 60 * 60 * 24)) + "天前" } else { if (m < 60 * 60 * 1000 * 24 * 7 * 56) { return Math.floor(m / (1000 * 60 * 60 * 24 * 7)) + "周前" } else { return Math.floor(m / (1000 * 60 * 60 * 24 * 7 * 52)) + "年前" } } } } }
+		},
+		/**
+		 * 获取某个月份的第一天、最后一天
+		 * @param nowDate 时间
+		 * @return {(string|string)[]}
+		 */
+		getFirstNowLastDay: function (nowDate) {
+			var now = nowDate ? new Date(nowDate) : new Date();
+			var strLink = "-";
+			var year = now.getFullYear();
+			var month = now.getMonth() + 1;
+			var day = now.getDate();
+			if (month >= 1 && month <= 9) {
+				month = "0" + month;
+			}
+			if (day >= 1 && day <= 9) {
+				day = "0" + day;
+			}
+			var yearMonth = year + strLink + month;
+			var firstDate = year + strLink + month + strLink + '01';
+			var sysDate = year + strLink + month + strLink + day;
+			var lastDay = this.getLastDay(year, month);
+			var lastDate = year + strLink + month + strLink + lastDay;
+			//以数组形式返回
+			return [firstDate, sysDate, lastDate, yearMonth];
+		},
+		/**
+		 * 获取当月的最后一天
+		 * @param year 年份
+		 * @param month 月份
+		 **/
+		getLastDay: function (year, month) {
+			var new_year = year;
+			var new_month = month++;//取下一个月的第一天，方便计算（最后一天不固定）
+			if (month > 12) {//如果当前大于12月，则年份转到下一年
+				new_month -= 12;//月份减
+				new_year++;//年份增
+			}
+			// 取当年当月对应的下个月的前一天，即当前月的最后一天
+			return new Date(new_year, new_month, 0).getDate();
+		},
+		/**
+		 *array_keys( {firstname: 'Kevin', surname: 'van Zonneveld'} );
+		 * @param 数组
+		 * @returns 返回数组中key
+		 */
+		array_keys: function (r, n, a) {
+			var e = void 0 !== n, o = [], t = !!a, i = !0, y = ""; for (y in r) r.hasOwnProperty(y) && (i = !0, e && (t && r[y] !== n ? i = !1 : r[y] !== n && (i = !1)), i && (o[o.length] = y)); return o
+		},
+		/**
+		 * array_values( {firstname: 'Kevin', surname: 'van Zonneveld'} );
+		 * @param 数组
+		 * @returns 返回数组中值
+		 */
+		array_values: function (r) {
+			var n = [], a = ""; for (a in r) n[n.length] = r[a]; return n
+		},
+		/**
+		 *array_unique({'a': 'green', 0: 'red', 'b': 'green', 1: 'blue', 2: 'red'})
+		 * @param 数组
+		 * @returns 去除数组重复
+		 */
+		array_unique: function (r) {
+			var n = "", t = {}, u = ""; for (n in r) r.hasOwnProperty(n) && (u = r[n], !1 === function (r, n) { var t = ""; for (t in n) if (n.hasOwnProperty(t) && n[t] + "" == r + "") return t; return !1 }(u, t) && (t[n] = u)); return t
+		},
+		/**
+		 * array_slice(["a", "b", "c", "d", "e"], 2, -1, true);
+		 * @param 数组
+		 * @param 开始位置
+		 * @param 取出个数
+		 * @param 是否重排
+		 * @returns 截取数组
+		 */
+		array_slice: function (r, i, e, t) {
+			var o = ""; if ("[object Array]" !== Object.prototype.toString.call(r) || t && 0 !== i) { var a = 0, c = {}; for (o in r) a += 1, c[o] = r[o]; r = c, i = i < 0 ? a + i : i, e = void 0 === e ? a : e < 0 ? a + e - i : e; var n = {}, l = !1, f = -1, s = 0, v = 0; for (o in r) { if (++f, s >= e) break; f === i && (l = !0), l && (++s, is_int(o) && !t ? n[v++] = r[o] : n[o] = r[o]) } return n } return void 0 === e ? r.slice(i) : e >= 0 ? r.slice(i, i + e) : r.slice(i, e)
+		},
+		/**
+		 *array_search('e',["a", "b", "c", "d", "e"])
+		 * @param 要查找的值
+		 * @param 数组
+		 * @returns 数组中搜索指定值返回键
+		 */
+		array_search: function (r, e, t) {
+			var n = !!t, i = ""; if ("object" == typeof r && r.exec) { if (!n) { var o = "i" + (r.global ? "g" : "") + (r.multiline ? "m" : "") + (r.sticky ? "y" : ""); r = new RegExp(r.source, o) } for (i in e) if (e.hasOwnProperty(i) && r.test(e[i])) return i; return !1 } for (i in e) if (e.hasOwnProperty(i) && (n && e[i] === r || !n && e[i] == r)) return i; return !1
+		},
+		/**
+		 *
+		 * @param 变量
+		 * @returns 是否数组判断
+		 */
+		is_array: function (t) {
+			if (!t || "object" != typeof t) return !1; if (function (t) { if (!t || "object" != typeof t || "number" != typeof t.length) return !1; var e = t.length; return t[t.length] = "bogus", e !== t.length ? (t.length -= 1, !0) : (delete t[t.length], !1) }(t)) return !0; var e = Object.prototype.toString.call(t), n = function (t) { var e = /\W*function\s+([\w$]+)\s*\(/.exec(t); return e ? e[1] : "(Anonymous)" }(t.constructor); return "[object Object]" === e && "Object" === n
+		},
+		/**
+		 *
+		 * @param 值
+		 * @param 数组
+		 * @returns 判断元素是否在数组中bool
+		 */
+		in_array: function (r, n, i) {
+			var f = ""; if (!i) { for (f in n) if (n[f] == r) return !0 } else for (f in n) if (n[f] === r) return !0; return !1
+		},
+		/**
+		 *sort(["a","b"],"SORT_STRING",true)
+		 * @param 数组
+		 * @param SORT_STRING|SORT_NUMERIC 排序类型
+		 * @param 默认true只排序不输出,false输出
+		 * @returns 数组排序
+		 */
+		sort: function (inputArr, sort_flags, strictForIn = true) {
+			var valArr = [], keyArr = [], k = '', i = 0, sorter = false, populateArr = []; switch (sort_flags) { case 'SORT_STRING': sorter = function (a, b) { return strnatcmp(a, b); }; break; case 'SORT_NUMERIC': sorter = function (a, b) { return (a - b); }; break; default: sorter = function (a, b) { var aFloat = parseFloat(a), bFloat = parseFloat(b), aNumeric = aFloat + '' === a, bNumeric = bFloat + '' === b; if (aNumeric && bNumeric) { return aFloat > bFloat ? 1 : aFloat < bFloat ? -1 : 0; } else if (aNumeric && !bNumeric) { return 1; } else if (!aNumeric && bNumeric) { return -1; } return a > b ? 1 : a < b ? -1 : 0; }; break; }populateArr = strictForIn ? inputArr : populateArr; for (k in inputArr) { if (inputArr.hasOwnProperty(k)) { valArr.push(inputArr[k]); if (strictForIn) { delete inputArr[k]; } } } valArr.sort(sorter); for (i = 0; i < valArr.length; i++) { populateArr[i] = valArr[i]; } return strictForIn || populateArr;
+		},
+		/**
+		 *
+		 * @param 字符
+		 * @returns 是否整数判断
+		 */
+		is_int: function (i) {
+			return i === +i && isFinite(i) && !(i % 1)
+		},
+		/**
+		 *
+		 * @param 字符
+		 * @returns 是否浮点数判断
+		 */
+		is_float: function (i) {
+			return !(+i !== i || isFinite(i) && !(i % 1))
+		},
+		/**
+		 *
+		 * @param 变量
+		 * @returns 是否对象判断
+		 */
+		is_object: function (t) {
+			return "[object Array]" !== Object.prototype.toString.call(t) && (null !== t && "object" == typeof t)
+		},
+		/**
+		 *  @param 函数名字符串
+		 * @returns 判断函数是否存在
+		 */
+		function_exists: function (n) {
+			var o = "undefined" != typeof window ? window : global; return "string" == typeof n && (n = o[n]), "function" == typeof n
+		},
+		/**
+		 *
+		 * @param 数组或对象
+		 * @returns 序列化
+		 */
+		serialize: function (r) {
+			var e, t, a, n = "", o = 0, i = function (r) { var e, t, a, n, o = typeof r; if ("object" === o && !r) return "null"; if ("object" === o) { if (!r.constructor) return "object"; a = r.constructor.toString(), e = a.match(/(\w+)\(/), e && (a = e[1].toLowerCase()), n = ["boolean", "number", "string", "array"]; for (t in n) if (a == n[t]) { o = n[t]; break } } return o }, c = i(r); switch (c) { case "function": e = ""; break; case "boolean": e = "b:" + (r ? "1" : "0"); break; case "number": e = (Math.round(r) == r ? "i" : "d") + ":" + r; break; case "string": e = "s:" + function (r) { var e = 0, t = 0, a = r.length, n = ""; for (t = 0; t < a; t++)n = r.charCodeAt(t), e += n < 128 ? 1 : n < 2048 ? 2 : 3; return e }(r) + ':"' + r + '"'; break; case "array": case "object": e = "a"; for (t in r) if (r.hasOwnProperty(t)) { if ("function" === i(r[t])) continue; a = t.match(/^[0-9]+$/) ? parseInt(t, 10) : t, n += this.serialize(a) + this.serialize(r[t]), o++ } e += ":" + o + ":{" + n + "}"; break; case "undefined": default: e = "N" }return "object" !== c && "array" !== c && (e += ";"), e
+		},
+		/**
+		 *
+		 * @param 字符串
+		 * @returns 解码序列化
+		 */
+		unserialize: function (r) {
+			var e = this, n = function (r) { var e = r.charCodeAt(0); return e < 128 ? 0 : e < 2048 ? 1 : 2 }; return error = function (r, n, a, t) { throw new e.window[r](n, a, t) }, read_until = function (r, e, n) { for (var a = 2, t = [], i = r.slice(e, e + 1); i != n;)a + e > r.length && error("Error", "Invalid"), t.push(i), i = r.slice(e + (a - 1), e + a), a += 1; return [t.length, t.join("")] }, read_chrs = function (r, e, a) { var t, i, u; for (u = [], t = 0; t < a; t++)i = r.slice(e + (t - 1), e + t), u.push(i), a -= n(i); return [u.length, u.join("")] }, _unserialize = function (r, e) { var n, a, t, i, u, s, o, l, c, d, f, h, _, p, w, b, k, g, v = 0, I = function (r) { return r }; switch (e || (e = 0), n = r.slice(e, e + 1).toLowerCase(), a = e + 2, n) { case "i": I = function (r) { return parseInt(r, 10) }, c = read_until(r, a, ";"), v = c[0], l = c[1], a += v + 1; break; case "b": I = function (r) { return 0 !== parseInt(r, 10) }, c = read_until(r, a, ";"), v = c[0], l = c[1], a += v + 1; break; case "d": I = function (r) { return parseFloat(r) }, c = read_until(r, a, ";"), v = c[0], l = c[1], a += v + 1; break; case "n": l = null; break; case "s": d = read_until(r, a, ":"), v = d[0], f = d[1], a += v + 2, c = read_chrs(r, a + 1, parseInt(f, 10)), v = c[0], l = c[1], a += v + 2, v != parseInt(f, 10) && v != l.length && error("SyntaxError", "String length mismatch"); break; case "a": for (l = {}, t = read_until(r, a, ":"), v = t[0], i = t[1], a += v + 2, s = parseInt(i, 10), u = !0, h = 0; h < s; h++)p = _unserialize(r, a), w = p[1], _ = p[2], a += w, b = _unserialize(r, a), k = b[1], g = b[2], a += k, _ !== h && (u = !1), l[_] = g; if (u) { for (o = new Array(s), h = 0; h < s; h++)o[h] = l[h]; l = o } a += 1; break; default: error("SyntaxError", "Unknown / Unhandled data type(s): " + n) }return [n, a - e, I(l)] }, _unserialize(r + "", 0)[2]
+		},
+		/**
+		 * uniqid('',true)长度23 默认13
+		 * @param 前缀
+		 * @param 是否增加长度
+		 * @returns 生成唯一id
+		 */
+		uniqid: function (n, e) {
+			void 0 === n && (n = ""); var t, i = function (n, e) { return n = parseInt(n, 10).toString(16), e < n.length ? n.slice(n.length - e) : e > n.length ? Array(e - n.length + 1).join("0") + n : n }, o = "undefined" != typeof window ? window : global; o.$locutus = o.$locutus || {}; var d = o.$locutus; return d.php = d.php || {}, d.php.uniqidSeed || (d.php.uniqidSeed = Math.floor(123456789 * Math.random())), d.php.uniqidSeed++, t = n, t += i(parseInt((new Date).getTime() / 1e3, 10), 8), t += i(d.php.uniqidSeed, 5), e && (t += (10 * Math.random()).toFixed(8).toString()), t
+		},
+		/**
+		 *
+		 * @param 变量
+		 * @param 进制,默认十进制
+		 * @returns 转换成整型
+		 */
+		intval: function (i, t) {
+			var n, a, e = typeof i; return "boolean" === e ? +i : "string" === e ? (0 === t && (a = i.match(/^\s*0(x?)/i), t = a ? a[1] ? 16 : 8 : 10), n = parseInt(i, t || 10), isNaN(n) || !isFinite(n) ? 0 : n) : "number" === e && isFinite(i) ? i < 0 ? Math.ceil(i) : Math.floor(i) : 0
+		},
+		//转换成浮点型
+		floatval: function (a) {
+			return parseFloat(a) || 0
+		},
+		//打印变量
+		log: function (arr) {
+			console.log(arr);
+		},
+		/**
+		 *
+		 * @param 字符串
+		 * @param 要去除的字符,默认为空格
+		 * @returns 去除两边空格
+		 */
+		trim: function (r, n) {
+			var t = [" ", "\n", "\r", "\t", "\f", "\v", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "​", "\u2028", "\u2029", "　"].join(""), e = 0, i = 0; for (r += "", n && (t = (n + "").replace(/([[\]().?\/*{}+$^:])/g, "$1")), e = r.length, i = 0; i < e; i++)if (-1 === t.indexOf(r.charAt(i))) { r = r.substring(i); break } for (e = r.length, i = e - 1; i >= 0; i--)if (-1 === t.indexOf(r.charAt(i))) { r = r.substring(0, i + 1); break } return -1 === t.indexOf(r.charAt(0)) ? r : ""
+		},
+		/**
+		 *
+		 * @param 字符串
+		 * @param 要去除的字符
+		 * @returns 去除右边空格
+		 */
+		rtrim: function (e, r) {
+			return r = r ? (r + "").replace(/([[\]().?\/*{}+$^:])/g, "\\$1") : " \\s ", (e + "").replace(new RegExp("[" + r + "]+$", "g"), "")
+		},
+		/**
+		 *
+		 * @param 字符串
+		 * @param 要去除的字符
+		 * @returns 去除左边空格
+		 */
+		ltrim: function (e, r) {
+			return r = r ? (r + "").replace(/([[\]().?\/*{}+$^:])/g, "$1") : " \\s ", (e + "").replace(new RegExp("^[" + r + "]+", "g"), "")
+		},
+		//字符串删除多个空格只保留一个
+		strtrim: function (a) {
+			return a.replace(/\s+/g, " ");
+		},
+		/**
+		 *str_replace("a","我","来自于a")
+		 * @param 要查找的字符
+		 * @param 要替换的字符
+		 * @param 字符串
+		 * @returns 字符串替换
+		 */
+		str_replace: function (t, o, e, c) {
+			var r = 0, l = 0, n = "", a = "", i = 0, p = 0, u = [].concat(t), f = [].concat(o), g = e, y = "[object Array]" === Object.prototype.toString.call(f), b = "[object Array]" === Object.prototype.toString.call(g); g = [].concat(g); var j = "undefined" != typeof window ? window : global; j.$locutus = j.$locutus || {}; var v = j.$locutus; if (v.php = v.php || {}, "object" == typeof t && "string" == typeof o) { for (n = o, o = [], r = 0; r < t.length; r += 1)o[r] = n; n = "", f = [].concat(o), y = "[object Array]" === Object.prototype.toString.call(f) } for (void 0 !== c && (c.value = 0), r = 0, i = g.length; r < i; r++)if ("" !== g[r]) for (l = 0, p = u.length; l < p; l++)n = g[r] + "", a = y ? void 0 !== f[l] ? f[l] : "" : f[0], g[r] = n.split(u[l]).join(a), void 0 !== c && (c.value += n.split(u[l]).length - 1); return b ? g : g[0]
+		},
+		/**
+		 *
+		 * @param 字符串
+		 * @param 保留的标签
+		 * @returns 过滤去除html标签
+		 */
+		strip_tags: function (input, allowed) {
+			allowed = (((allowed || "") + "").toLowerCase().match(/<[a-z][a-z0-9]*>/g) || []).join(""); var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>/gi, commentsAndPhpTags = /<!--[\s\S]*?-->|<\?(?:php)?[\s\S]*?\?>/gi; return input.replace(commentsAndPhpTags, "").replace(tags, function ($0, $1) { return allowed.indexOf("<" + $1.toLowerCase() + ">") > -1 ? $0 : "" })
+		},
+		//字符串转换首字母大写
+		ucfirst: function (t) {
+			return t += "", t.charAt(0).toUpperCase() + t.substr(1)
+		},
+		//html转换实体
+		htmlencode: function (sStr) {
+			var htmlspecialchars = function (e, E, T, _) { var r = 0, t = 0, a = !1; ("undefined" == typeof E || null === E) && (E = 2), e = e.toString(), _ !== !1 && (e = e.replace(/&/g, "&amp;")), e = e.replace(/</g, "&lt;").replace(/>/g, "&gt;"); var N = { ENT_NOQUOTES: 0, ENT_HTML_QUOTE_SINGLE: 1, ENT_HTML_QUOTE_DOUBLE: 2, ENT_COMPAT: 2, ENT_QUOTES: 3, ENT_IGNORE: 4 }; if (0 === E && (a = !0), "number" != typeof E) { for (E = [].concat(E), t = 0; t < E.length; t++)0 === N[E[t]] ? a = !0 : N[E[t]] && (r |= N[E[t]]); E = r } return E & N.ENT_HTML_QUOTE_SINGLE && (e = e.replace(/'/g, "&#039;")), a || (e = e.replace(/"/g, "&quot;")), e }; return htmlspecialchars(sStr);
+		},
+		//html实体还原
+		htmldecode: function (sStr) {
+			var htmlspecialchars_decode = function (e, E) { var T = 0, _ = 0, r = !1; "undefined" == typeof E && (E = 2), e = e.toString().replace(/&lt;/g, "<").replace(/&gt;/g, ">"); var t = { ENT_NOQUOTES: 0, ENT_HTML_QUOTE_SINGLE: 1, ENT_HTML_QUOTE_DOUBLE: 2, ENT_COMPAT: 2, ENT_QUOTES: 3, ENT_IGNORE: 4 }; if (0 === E && (r = !0), "number" != typeof E) { for (E = [].concat(E), _ = 0; _ < E.length; _++)0 === t[E[_]] ? r = !0 : t[E[_]] && (T |= t[E[_]]); E = T } return E & t.ENT_HTML_QUOTE_SINGLE && (e = e.replace(/&#0*39;/g, "'")), r || (e = e.replace(/&quot;/g, '"')), e = e.replace(/&amp;/g, "&") }; return htmlspecialchars_decode(sStr)
+		},
+		// 转义 html
+		escape: function (html) {
+			var exp = /[<"'>]|&(?=#[a-zA-Z0-9]+)/g;
+			if (html === undefined || html === null) return '';
+			html += '';
+			if (!exp.test(html)) return html;
+			return html.replace(/&(?!#?[a-zA-Z0-9]+;)/g, '&amp;')
+				.replace(/</g, '&lt;').replace(/>/g, '&gt;')
+				.replace(/'/g, '&#39;').replace(/"/g, '&quot;');
+		},
+		// 还原转义的 html
+		unescape: function (html) {
+			if (html === undefined || html === null) html = '';
+			html += '';
+			return html.replace(/\&amp;/g, '&')
+				.replace(/\&lt;/g, '<').replace(/\&gt;/g, '>')
+				.replace(/\&#39;/g, '\'').replace(/\&quot;/g, '"');
+		},
+		//base64还原
+		base64_decode: function (n) {
+			var r = function (n) { return decodeURIComponent(n.split("").map(function (n) { return "%" + ("00" + n.charCodeAt(0).toString(16)).slice(-2) }).join("")) }; if ("undefined" == typeof window) return new Buffer(n, "base64").toString("utf-8"); if (void 0 !== window.atob) return r(window.atob(n)); var e, t, o, i, d, f, a, c, u = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", h = 0, w = 0, C = "", g = []; if (!n) return n; n += ""; do { i = u.indexOf(n.charAt(h++)), d = u.indexOf(n.charAt(h++)), f = u.indexOf(n.charAt(h++)), a = u.indexOf(n.charAt(h++)), c = i << 18 | d << 12 | f << 6 | a, e = c >> 16 & 255, t = c >> 8 & 255, o = 255 & c, g[w++] = 64 === f ? String.fromCharCode(e) : 64 === a ? String.fromCharCode(e, t) : String.fromCharCode(e, t, o) } while (h < n.length); return C = g.join(""), r(C.replace(/\0+$/, ""))
+		},
+		// base64编码
+		base64_encode: function (e) {
+			var r = function (e) { return encodeURIComponent(e).replace(/%([0-9A-F]{2})/g, function (e, r) { return String.fromCharCode("0x" + r) }) }; if ("undefined" == typeof window) return new Buffer(e).toString("base64"); if (void 0 !== window.btoa) return window.btoa(r(e)); var n, t, o, i, a, c, d, f, h = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", u = 0, w = 0, A = "", l = []; if (!e) return e; e = r(e); do { n = e.charCodeAt(u++), t = e.charCodeAt(u++), o = e.charCodeAt(u++), f = n << 16 | t << 8 | o, i = f >> 18 & 63, a = f >> 12 & 63, c = f >> 6 & 63, d = 63 & f, l[w++] = h.charAt(i) + h.charAt(a) + h.charAt(c) + h.charAt(d) } while (u < e.length); A = l.join(""); var C = e.length % 3; return (C ? A.slice(0, C - 3) : A) + "===".slice(C || 3)
+		},
+		//字符串URL编码
+		urlencode: function (e) {
+			return e += "", encodeURIComponent(e).replace(/!/g, "%21").replace(/'/g, "%27").replace(/\(/g, "%28").replace(/\)/g, "%29").replace(/\*/g, "%2A").replace(/~/g, "%7E").replace(/%20/g, "+")
+		},
+		//字符串URL解码
+		urldecode: function (e) {
+			return decodeURIComponent((e + "").replace(/%(?![\da-f]{2})/gi, function () { return "%25" }).replace(/\+/g, "%20"))
+		},
+		//unicode解码表情中文
+		unicode_decode: function (e) {
+			return e = e.replace(/\\/g, "%"), unescape(e)
+		},
+		/**
+		 * @param 字符串
+		 * @param 是否中文也编码
+		 * @returns unicode编码中文表情
+		 */
+		unicode_encode: function (n) {
+			if (1 == (arguments.length > 1 && void 0 !== arguments[1] && arguments[1])) { for (var r = [], t = 0; t < n.length; t++)r[t] = ("00" + n.charCodeAt(t).toString(16)).slice(-4); return "\\u" + r.join("\\u") } var e = function (n) { for (var r = [], t = 0; t < n.length; t++)r[t] = ("00" + n.charCodeAt(t).toString(16)).slice(-4); return "\\u" + r.join("\\u") }, u = /[\ud800-\udbff][\udc00-\udfff]/g; return n = n.replace(u, function (n) { return 2 === n.length ? e(n) : n })
+		},
+		//获取url变量值
+		get_params: function (c) {
+			var e = c + "=", b = window.location.href, h = b.indexOf("?"), b = b.slice(h + 1), a = b.split("&"), d = 0, f = "", g = a.length; for (d = 0; d < g; d++) { var f = a[d]; if (f.indexOf(e) === 0) { return decodeURIComponent(f.slice(e.length).replace(/\+/g, "%20")) } } return null
+		},
+		/**
+		 * 可以不要参数
+		 * @param 最小
+		 * @param 最大
+		 * @returns 生成更好随机数
+		 */
+		mt_rand: function (r, e) {
+			var n = arguments.length; if (0 === n) r = 0, e = 2147483647; else { if (1 === n) throw new Error("Warning: mt_rand() expects exactly 2 parameters, 1 given"); r = parseInt(r, 10), e = parseInt(e, 10) } return Math.floor(Math.random() * (e - r + 1)) + r
+		},
+		/**
+		 * 可以不要参数
+		 * @param 最小
+		 * @param 最大
+		 * @returns 生成随机数
+		 */
+		rand: function (r, e) {
+			var n = arguments.length; if (0 === n) r = 0, e = 2147483647; else if (1 === n) throw new Error("Warning: rand() expects exactly 2 parameters, 1 given"); return Math.floor(Math.random() * (e - r + 1)) + r
+		},
+		/**
+		 *strcut("我爱中国人",4,"...")
+		 * @param 字符串
+		 * @param 长度中文汉字算两个
+		 * @param 显示符号
+		 * @returns 字符串截取
+		 */
+		strcut: function (str, iMaxBytes, sSuffix) {
+			if (isNaN(iMaxBytes)) { return str } if (strlen(str) <= iMaxBytes) { return str } var i = 0, bytes = 0; for (; i < str.length && bytes < iMaxBytes; ++i, ++bytes) { if (str.charCodeAt(i) > 255) { ++bytes } } sSuffix = sSuffix || ""; return (bytes - iMaxBytes == 1 ? str.substr(0, i - 1) : str.substr(0, i)) + sSuffix
+		},
+		/**
+		 * @param 字符串
+		 * @param 子字符串
+		 * @returns 查找字符串
+		 */
+		strfind: function (string, find) {
+			return !(string.indexOf(find) === -1)
+		},
+		//判断是否数字
+		is_num: function (num) {
+			var reg = new RegExp("^[0-9]*$"); return reg.test(num)
+		},
+		//判断是否手机号
+		is_mobile: function (num) {
+			var reg = /^1\d{10}$/; return reg.test(num)
+		},
+		//判断是否QQ
+		is_qq: function (num) {
+			var reg = /^[1-utf8_decode]{1}\d{4,11}$/; return reg.test(num)
+		},
+		//判断是否邮箱
+		is_email: function (str) {
+			var reg = /^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/; return reg.test(str)
+		},
+		//判断是否中文
+		is_chinese: function (num) {
+			var reg = /[\u4e00-\u9fa5]/g; return reg.test(num)
+		},
+		//判断是否符合注册用户名(数字字母组成,下划钱字母开头)
+		is_reg: function (num) {
+			var reg = /^([a-zA-z_]{1})([\w]*)$/g; return reg.test(num)
+		},
+		//判断是否电话
+		is_tel: function (str) {
+			var reg = /^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/; return reg.test(str)
+		},
+		//判断是否是IP
+		is_ip: function (strIP) {
+			if (isNull(strIP)) { return false } var re = /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/g; if (re.test(strIP)) { if (RegExp.$1 < 256 && RegExp.$2 < 256 && RegExp.$3 < 256 && RegExp.$4 < 256) { return true } } return false
+		},
+		//判断是否邮编
+		is_zipcode: function (str) {
+			var reg = /^(\d){6}$/; return reg.test(str)
+		},
+		//判断是否英文
+		is_english: function (str) {
+			var reg = /^[A-Za-z]+$/; return reg.test(str)
+		},
+		//判断是否是URL
+		is_url: function (url) {
+			var strRegex = /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/; var re = new RegExp(strRegex); return re.test(url);
+		},
+		//判断是否http
+		is_http: function (url) {
+			if (url.indexOf("http://") === -1 && url.indexOf("https://") === -1) { return false } return true
+		},
+		//判断是否金额
+		is_money: function (n) {
+			return !!/(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/.test(n)
+		},
+		//是否是银行卡号
+		is_CardNumber: function (num) {
+			return num.toString().replace(/\s/g, '').replace(/(.{4})/g, "$1 ");
+		},
+		//是否是身份证号
+		is_IDCard: function (idcode) {
+			var weight_factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
+			var check_code = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2', 'x'];
+			var code = idcode + "";
+			var last = idcode[17];//最后一位
+			var seventeen = code.substring(0, 17);
+			var arr = seventeen.split("");
+			var len = arr.length;
+			var num = 0;
+			for (var i = 0; i < len; i++) {
+				num = num + arr[i] * weight_factor[i];
+			}
+			var resisue = num % 11;
+			var last_no = check_code[resisue];
+			var idcard_patter = /^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/;
+			var format = idcard_patter.test(idcode);
+			return last === last_no && format;
+		},
+		/**
+		 *
+		 * @param 整数
+		 * @param 最小
+		 * @param 最大
+		 * @returns 判断是否在两个整数内
+		 */
+		in_int: function (n, iMin, iMax) {
+			if (!isFinite(n)) { return false } if (!/^[+-]?\d+$/.test(n)) { return false } if (iMin != undefined && parseInt(n) < parseInt(iMin)) { return false } if (iMax != undefined && parseInt(n) > parseInt(iMax)) { return false } return true
+		},
+		/**
+		 *
+		 * @param 浮点数
+		 * @param 最小
+		 * @param 最大
+		 * @returns 判断是否在两个浮点数之内
+		 */
+		in_float: function (n, fMin, fMax) {
+			if (!isFinite(n)) { return false } if (fMin != undefined && parseFloat(n) < parseFloat(fMin)) { return false } if (fMax != undefined && parseFloat(n) > parseFloat(fMax)) { return false } return true
+		},
+		/**
+		 *number_format('150.456', 2, '.', ',')
+		 * @param 数字
+		 * @param 保留小数位数
+		 * @param 小数点显示符号
+		 * @param 千分位符号
+		 * @returns 格式化数字
+		 */
+		number_format: function (e, n, t, i) {
+			e = (e + "").replace(/[^0-9+\-Ee.]/g, ""); var r = isFinite(+e) ? +e : 0, o = isFinite(+n) ? Math.abs(n) : 0, a = void 0 === i ? "," : i, d = void 0 === t ? "." : t, u = ""; return u = (o ? function (e, n) { if (-1 === ("" + e).indexOf("e")) return +(Math.round(e + "e+" + n) + "e-" + n); var t = ("" + e).split("e"), i = ""; return +t[1] + n > 0 && (i = "+"), (+(Math.round(+t[0] + "e" + i + (+t[1] + n)) + "e-" + n)).toFixed(n) }(r, o).toString() : "" + Math.round(r)).split("."), u[0].length > 3 && (u[0] = u[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, a)), (u[1] || "").length < o && (u[1] = u[1] || "", u[1] += new Array(o - u[1].length + 1).join("0")), u.join(d)
+		},
+		// 数字前置补零
+		digit: function (num, length) {
+			var str = '';
+			num = String(num);
+			length = length || 2;
+			for (var i = num.length; i < length; i++) {
+				str += '0';
+			}
+			return num < Math.pow(10, length) ? str + (num | 0) : num;
+		},
+		/**
+		* 金额数字转大写
+		* @param num number
+		* @return {string}
+		*/
+		upDigit: function (num, is_head = false) {
+			var fraction = ['角', '分', '厘'];
+			var digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
+			var unit = [
+				['元', '万', '亿'],
+				['', '拾', '佰', '仟']
+			];
+			var head = num < 0 ? '欠人民币' : '人民币';
+			num = Math.abs(num);
+			var s = '', i;
+			for (i = 0; i < fraction.length; i++) {
+				s += (digit[Math.floor(num * 10 * Math.pow(10, i)) % 10] + fraction[i]).replace(/零./, '');
+			}
+			s = s || '整';
+			num = Math.floor(num);
+			for (i = 0; i < unit[0].length && num > 0; i++) {
+				var p = '';
+				for (var j = 0; j < unit[1].length && num > 0; j++) {
+					p = digit[num % 10] + unit[1][j] + p;
+					num = Math.floor(num / 10);
+				}
+				s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s;
+			}
+			if (is_head == true) {
+				return head + s.replace(/(零.)*零元/, '元').replace(/(零.)+/g, '零').replace(/^整$/, '零元整');
+			}
+			else {
+				return s.replace(/(零.)*零元/, '元').replace(/(零.)+/g, '零').replace(/^整$/, '零元整');
+			}
+
+		},
+		//隐藏银行号码
+		hidebank: function (s = "6217995510035399947") {
+			return s.replace(/^(\d{8})\d+(\d{4})$/, "$1*******$2");
+		},
+		// 隐藏手机号中间四位
+		hidemobile: function (s = "18291447788") {
+			return s.replace(/^(\d{3})\d+(\d{4})$/, "$1****$2");
+		},
+		/**
+		 *
+		 * @param css代码
+		 * @returns 添加css代码
+		 */
+		addcss: function (e) {
+			var t = document.createElement("style"), d = document.head || document.getElementsByTagName("head")[0]; if (t.type = "text/css", t.styleSheet) { var a = function () { try { t.styleSheet.cssText = e } catch (e) { } }; t.styleSheet.disabled ? setTimeout(a, 10) : a() } else { var s = document.createTextNode(e); t.appendChild(s) } d.appendChild(t)
+		},
+		/**
+		 * @param js代码
+		 * @returns 添加js代码
+		 */
+		addjs: function (t) {
+			var e = document.createElement("script"); e.type = "text/javascript"; try { e.appendChild(document.createTextNode(t)) } catch (d) { e.text = t } document.head.appendChild(e)
+		},
+		/**
+		 *
+		 * @param js文件路径
+		 * @param 回调函数
+		 * @returns 加载js支持回调
+		 */
+		loadjs: function (e, a) {
+			var t = document.createElement("script"); t.src = e, t.onload = function () { var e = t.readyState && "complete" != t.readyState && "loaded" != t.readyState; a && a(!e) }, document.head.appendChild(t)
+		},
+		/**
+		 *
+		 * @param css路径
+		 * @param 回调函数
+		 * @returns 加载css支持回调
+		 */
+		loadcss: function (e, n) {
+			var t = document.createElement("link"); t.rel = "stylesheet", t.type = "text/css", t.onerror = function () { n(!1) }, t.onload = function () { n(!0) }, t.href = e, document.head.appendChild(t)
+		},
+		//获取当前域名主机
+		gethost: function () {
+			return window.location.protocol + "//" + window.location.host;
+		},
+		/**
+		* 由经纬度计算两点之间的距离
+		* @param latlngFirst
+		* @param latlngLast
+		* @return {string}
+		*/
+		distance: function (latlngFirst, latlngLast) {
+			var La1 = latlngFirst.lat * Math.PI / 180.0;
+			var La2 = latlngLast.lat * Math.PI / 180.0;
+			var La3 = La1 - La2;
+			var Lb3 = latlngFirst.lng * Math.PI / 180.0 - latlngLast.lng * Math.PI / 180.0;
+			var dis = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(La3 / 2), 2) + Math.cos(La1) * Math.cos(La2) * Math.pow(Math.sin(Lb3 / 2), 2)));
+			dis = dis * 6378.137;
+			dis = Math.round(dis * 10000) / 10000;
+			return dis.toFixed(2);
+		},
+		/**
+		 * 设置cookie
+		 * @param name
+		 * @param value
+		 * @param iDay
+		 */
+		setCookie: function (name, value, iDay) {
+			var oDate = new Date();
+			oDate.setDate(oDate.getDate() + iDay);
+			document.cookie = name + '=' + value + ';expires=' + oDate;
+		},
+		/**
+		 * 获取cookie
+		 * @param name
+		 * @return {string}
+		 */
+		getCookie: function (name) {
+			var arr = document.cookie.split('; ');
+			for (var i = 0; i < arr.length; i++) {
+				var arr2 = arr[i].split('=');
+				if (arr2[0] == name) {
+					return arr2[1];
+				}
+			}
+			return '';
+		},
+		/**
+		 * 删除Cookie
+		 * @param name
+		 */
+		removeCookie: function (name) {
+			this.setCookie(name, 1, -1);
+		},
+		/**
+		 * 运算百分制
+		 * @param thisNum
+		 * @param totalNum
+		 * @return {number}
+		 */
+		computeProgres: function (thisNum, totalNum) {
+			var num = parseFloat(thisNum) || 0.00, total = parseFloat(totalNum) || 0.00;
+			return Math.round(num / total * 10000) / 100;
+		},
+		/**
+		 * 生成随着大小写token
+		 * @param length 长度，默认32
+		 * @return {string}
+		 */
+		token: function (length) {
+			length = length || 32;
+			var char = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
+			var result = '';
+			for (var i = 0; i < length; i++) {
+				result += char.charAt(Math.floor(Math.random() * char.length));
+			}
+			return result;
+		}
+	};
+	$('body').on('click', '.link-a', function () {
+		let url = $(this).data('href');
+		if (url && url !== '') {
+			window.location.replace(url);
+		}
+		return false;
+	});
+	// 输出接口
+	exports('tool', tool);
+});
diff --git a/public/static/assets/mbui/module/userPicker.js b/public/static/assets/mbui/module/userPicker.js
new file mode 100644
index 0000000000000000000000000000000000000000..0b24ab107bc93d152a27d6f67377f464cdb6f947
--- /dev/null
+++ b/public/static/assets/mbui/module/userPicker.js
@@ -0,0 +1,142 @@
+mbui.define(['layer'], function (exports) {
+	var layer = mbui.layer;
+	var userSelector = function () {
+		this.config = {
+			type:1,
+			url: "/api/index/get_employee",
+			where: {},
+			callback: function(){}
+		};
+		this.loaded = 0;
+	};
+	// 初始化
+	userSelector.prototype.init = function (options) {
+		var that = this;
+		$.extend(true, that.config, options);
+		that.select();
+	};
+	
+	userSelector.prototype.select = function () {
+		var that = this;
+		var types = that.config.type == 2 ? 'checkbox' : 'radio';
+		var users = [];
+		var alphabet = [];
+		var userGroups = {};
+		var selector = $('.user-selector');
+		if (selector.length > 0) {
+			return false;
+		}
+		let loading;
+		$.ajax({
+			url: that.config.url,
+			type: 'get',
+			data: { did: 0 },
+			beforeSend:function(){
+				loading = layer.loading('加载中...');
+			},
+			success: function (e) {
+				if (e.code == 0) {
+					users = e.data;
+					bulidSelector();
+				}
+			},
+			complete:function(){
+				layer.close(loading);
+			}
+		})
+
+		function bulidSelector() {
+			// 将用户账号按照首字母分组
+			for (var i = 0; i < users.length; i++) {
+				var user = users[i]['username'];
+				var firstLetter = user.charAt(0).toUpperCase();
+				if (!userGroups[firstLetter]) {
+					userGroups[firstLetter] = [];
+					alphabet.push(firstLetter);
+				}
+				userGroups[firstLetter].push(users[i]);
+			}
+			alphabet.sort();
+			var $container = $('<div class="mbui-picker-selector"><header class="mbui-bar"><a class="mbui-bar-item left" href="javascript:;"><i class="mbui-bar-arrow-left"></i>关闭</a><a class="mbui-bar-item right text-blue" href="javascript:;">确认</a><h1 class="mbui-bar-title">选择员工</h1></header></div>');
+			var $letters = $('<div class="letters"></div>');
+			var $userList = $('<div class="contacts mbui-' + types + '"></div>');
+
+			var item = '';
+			for (var j = 0; j < alphabet.length; j++) {
+				var $letterLink = $('<a href="#' + alphabet[j] + '">' + alphabet[j] + '</a>');
+				$letters.append($letterLink);
+
+				item += '<div class="mbui-contacts-title" id="' + alphabet[j] + '">' + alphabet[j] + '</div>';
+				var userData = userGroups[alphabet[j]];
+				for (var k = 0; k < userData.length; k++) {
+					item += '<label class="mbui-picker-item" data-id="' + userData[k]['id'] + '" data-did="' + userData[k]['did'] + '" data-name="' + userData[k]['name'] + '" data-department="' + userData[k]['department'] + '">\
+								<input class="mbui-input-'+types+'" name="radio_user[]" type="'+types+'" value="' + userData[k]['id'] + '">\
+								<i class="mbui-picker-avatar"><img src="' + userData[k]['thumb'] + '" width="32" height="32" align="'+userData[k]['name']+'" style="border-radius:6px;"></i>\
+								<span class="mbui-picker-name">' + userData[k]['name'] + ' <span class="text-gray f14">『' + userData[k]['department'] + '』</span></span>\
+							</label>';
+				}
+			}
+			$userList.append(item);
+			$container.append($letters).append($userList);
+			$('body').append($container);
+
+			// 点击字母滚动到对应的字母开头的用户位置
+			$letters.on('click', 'a', function (e) {
+				e.preventDefault();
+				var letter = $(this).attr('href').substring(1);
+				var $letterSection = $('#' + letter);
+				var scrollTop = $letterSection.offset().top - $userList.offset().top + $userList.scrollTop();
+				$userList.animate({ scrollTop: scrollTop }, 500);
+			});
+
+			$container.find('.left').click(function () {
+				$container.fadeOut(function () {
+					$container.remove();
+				});
+			});
+
+			$container.find('.right').click(function () {
+				let selected = $container.find('input:checked');
+				if (selected.length == 0) {
+					layer.msg('请选择员工');
+					return false;
+				}
+				let ids = [], names = [], dids = [],departments=[];
+				for (var m = 0; m < selected.length; m++) {
+					let selected_item = $(selected[m]).parent();
+					ids.push(selected_item.data('id'));
+					names.push(selected_item.data('name'));
+					dids.push(selected_item.data('dids'));
+					departments.push(selected_item.data('departments'));
+				}
+				that.config.callback(ids,names,dids,departments);
+				$container.fadeOut(function () {
+					$container.remove();
+				});
+			});
+		}
+	};
+	
+	//选择员工弹窗		
+	$('body').on('click','.picker-admin',function () {
+		let that = $(this);
+		let type = that.data('type');
+		if (typeof(type) == "undefined" || type == '') {
+			type = 1;
+		}
+		let ids=that.next().val()+'',names = that.val()+'';
+		let picker = new userSelector();
+		picker.init({
+			type:type,
+			callback:function(ids,names,dids,departments){
+				that.val(names.join(','));
+				that.next().val(ids.join(','));
+			}
+		});
+	});
+	// 导出userPicker模块
+	exports('userPicker', function (options) {
+		var userPicker = new userSelector();
+		userPicker.init(options);
+	});
+});
\ No newline at end of file
diff --git a/public/static/assets/third_party/echart/china.js b/public/static/assets/third_party/echart/china.js
new file mode 100644
index 0000000000000000000000000000000000000000..917887e06619486b9db0b868c89592b115b866be
--- /dev/null
+++ b/public/static/assets/third_party/echart/china.js
@@ -0,0 +1,27 @@
+(function (root, factory) {
+    if (typeof define === 'function' && define.amd) {
+        // AMD. Register as an anonymous module.
+        define(['exports', 'echarts'], factory);
+    } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
+        // CommonJS
+        factory(exports, require('echarts'));
+    } else {
+        // Browser globals
+        factory({}, root.echarts);
+    }
+}(this, function (exports, echarts) {
+    var log = function (msg) {
+        if (typeof console !== 'undefined') {
+            console && console.error && console.error(msg);
+        }
+    }
+    if (!echarts) {
+        log('ECharts is not Loaded');
+        return;
+    }
+    if (!echarts.registerMap) {
+        log('ECharts Map is not loaded')
+        return;
+    }
+    echarts.registerMap('china', {"type":"FeatureCollection","features":[{"id":"710000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@°Ü¯Û"],["@@ƛĴÕƊÉɼģºðʀ\\ƎsÆNŌÔĚänÜƤɊĂǀĆĴĤǊŨxĚĮǂƺòƌâÔ®ĮXŦţƸZûÐƕƑGđ¨ĭMó·ęcëƝɉlÝƯֹÅŃ^Ó·śŃǋƏďíåɛGɉ¿@ăƑ¥ĘWǬÏĶŁâ"],["@@\\p|WoYG¿¥Ij@¢"],["@@¡@V^RqBbAnTXeRz¤L«³I"],["@@ÆEEkWqë @"],["@@fced"]],"encodeOffsets":[[[122886,24033]],[[123335,22980]],[[122375,24193]],[[122518,24117]],[[124427,22618]],[[124862,26043]]]},"properties":{"cp":[121.509062,25.044332],"name":"台湾","childNum":6}},{"id":"130000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@o~Z]ªrºc_ħ²G¼s`jÎŸnüsÂłNX_M`Ç½ÓnUKĜēs¤­©yrý§uģcJe"],["@@U`Ts¿mÂ"],["@@oºƋÄdeVDJj£J|ÅdzÂFt~KŨ¸IÆv|¢r}èonb}`RÎÄn°ÒdÞ²^®lnÐèĄlðÓ×]ªÆ}LiĂ±Ö`^°Ç¶p®đDcŋ`ZÔ¶êqvFÆN®ĆTH®¦O¾IbÐã´BĐɢŴÆíȦpĐÞXR·nndO¤OÀĈƒ­QgµFo|gȒęSWb©osx|hYhgŃfmÖĩnºTÌSp¢dYĤ¶UĈjlǐpäìë|³kÛfw²Xjz~ÂqbTÑěŨ@|oMzv¢ZrÃVw¬ŧĖ¸f°ÐTªqs{S¯r æÝlNd®²Ğ ǆiGĘJ¼lr}~K¨ŸƐÌWöÆzR¤lêmĞLÎ@¡|q]SvKÑcwpÏÏĿćènĪWlĄkT}J¤~ÈTdpddʾĬBVtEÀ¢ôPĎƗè@~kü\\rÊĔÖæW_§¼F´©òDòjYÈrbĞāøŀG{ƀ|¦ðrb|ÀH`pʞkvGpuARhÞÆǶgĘTǼƹS£¨¡ù³ŘÍ]¿ÂyôEP xX¶¹ÜO¡gÚ¡IwÃé¦ÅBÏ|Ç°N«úmH¯âDùyŜŲIÄuĐ¨D¸dɂFOhđ©OiÃ`ww^ÌkÑH«ƇǤŗĺtFu{Z}Ö@U´ʚLg®¯Oı°Ãw ^VbÉsmAê]]w§RRl£ȭµu¯b{ÍDěïÿȧuT£ġěŗƃĝQ¨fVƋƅn­a@³@ďyÃ½IĹÊKŭfċŰóxV@tƯJ]eR¾fe|rHA|h~Ėƍl§ÏlTíb ØoÅbbx³^zÃĶ¶Sj®AyÂhðk`«PËµEFÛ¬Y¨Ļrõqi¼Wi°§Ð±´°^[À|ĠO@ÆxO\\ta\\tĕtû{ġȧXýĪÓjùÎRb^ÎfK[ÝděYfíÙTyuUSyŌŏů@Oi½éŅ­aVcř§ax¹XŻácWU£ôãºQ¨÷Ñws¥qEHÙ|šYQoŕÇyáĂ£MÃ°oťÊP¡mWO¡v{ôvîēÜISpÌhp¨ jdeŔQÖjX³àĈ[n`Yp@UcM`RKhEbpŞlNut®EtqnsÁgAiúoHqCXhfgu~ÏWP½¢G^}¯ÅīGCÑ^ãziMáļMTÃƘrMc|O_¯Ŏ´|morDkO\\mĆJfl@cĢ¬¢aĦtRıÒ¾ùƀ^juųœK­UFyƝīÛ÷ąV×qƥV¿aȉd³BqPBmaËđŻģmÅ®V¹d^KKonYg¯XhqaLdu¥Ípǅ¡KąÅkĝęěhq}HyÃ]¹ǧ£Í÷¿qáµ§g¤o^á¾ZE¤i`ĳ{nOl»WÝĔįhgF[¿¡ßkOüš_ūiǱàUtėGyl}ÓM}jpEC~¡FtoQiHkk{Ãmï"]],"encodeOffsets":[[[119712,40641]],[[121616,39981]],[[116462,37237]]]},"properties":{"cp":[114.502461,38.045474],"name":"河北","childNum":3}},{"id":"140000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@ÞĩÒSra}ÁyWix±Üe´lèßÓǏokćiµVZģ¡coTSË¹ĪmnÕńehZg{gtwªpXaĚThȑp{¶Eh®RćƑP¿£Pmc¸mQÝWďȥoÅîɡųAďä³aÏJ½¥PG­ąSM­EÅruµéYÓŌ_dĒCo­Èµ]¯_²ÕjāK~©ÅØ^ÔkïçămÏk]­±cÝ¯ÑÃmQÍ~_apm~ç¡qu{JÅŧ·Ls}EyÁÆcI{¤IiCfUcƌÃp§]ě«vD@¡SÀµMÅwuYY¡DbÑc¡h×]nkoQdaMç~eDÛtT©±@¥ù@É¡ZcW|WqOJmĩl«ħşvOÓ«IqăV¥D[mI~Ó¢cehiÍ]Ɠ~ĥqX·eƷn±}v[ěďŕ]_œ`¹§ÕōIo©b­s^}Ét±ū«³p£ÿ·Wµ|¡¥ăFÏs×¥ŅxÊdÒ{ºvĴÎêÌɊ²¶ü¨|ÞƸµȲLLúÉƎ¤ϊęĔV`_bªS^|dzY|dz¥pZbÆ£¶ÒK}tĦÔņƠPYznÍvX¶Ěn ĠÔzý¦ª÷ÑĸÙUȌ¸dòÜJð´ìúNM¬XZ´¤ŊǸ_tldI{¦ƀðĠȤ¥NehXnYGR° ƬDj¬¸|CĞKqºfƐiĺ©ª~ĆOQª ¤@ìǦɌ²æBÊTŸʂōĖĴŞȀÆÿȄlŤĒötÎ½î¼ĨXh|ªM¤Ðz"],"encodeOffsets":[[116874,41716]]},"properties":{"cp":[112.549248,37.857014],"name":"山西","childNum":1}},{"id":"150000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@Č^â£ĂhĖMÈÄw\\fŦ°W ¢¾luŸDw\\̀ʉÌÛMĀ[bÓEn}¶Vcês¯PqFB|S³C|kñHdiÄ¥sŉÅPóÑÑE^ÅPpy_YtShQ·aHwsOnŉÃs©iqjUSiº]ïW«gW¡ARëśĳĘů`çõh]y»ǃǛҤxÒm~zf}pf|ÜroÈzrKÈĵSƧż؜Ġu¦ö"],["@@sKCGS|úþXgp{ÁX¿ć{ƱȏñZáĔyoÁhA}ŅĆfdŉ_¹Y°ėǩÑ¡H¯¶oMQqð¡Ë|Ñ`ƭŁX½·óÛxğįÅcQs«tȋǅFù^it«Č¯[hAi©á¥ÇĚ×l|¹y¯YȵƓñǙµïċĻ|Düȭ¶¡oŽäÕG\\ÄT¿Òõr¯LguÏYęRƩɷŌO\\İÐ¢æ^Ŋ ĲȶȆbÜGĝ¬¿ĚVĎgª^íu½jÿĕęjık@Ľ]ėl¥ËĭûÁėéV©±ćn©­ȇÍq¯½YÃÔŉÉNÑÅÝy¹NqáʅDǡËñ­ƁYÅy̱os§ȋµʽǘǏƬɱàưN¢ƔÊuľýľώȪƺɂļxZĈ}ÌŉŪĺœĭFЛĽ̅ȣͽÒŵìƩÇϋÿȮǡŏçƑůĕ~Ç¼ȳÐUfdIxÿ\\G zâɏÙOº·pqy£@qþ@Ǟ˽IBäƣzsÂZÁàĻdñ°ŕzéØűzșCìDȐĴĺf®Àľưø@ɜÖÞKĊŇƄ§͑těï͡VAġÑÑ»d³öǍÝXĉĕÖ{þĉu¸ËʅğU̎éhɹƆ̗̮ȘǊ֥ड़ࡰţાíϲäʮW¬®ҌeרūȠkɬɻ̼ãüfƠSצɩςåȈHϚÎKǳͲOðÏȆƘ¼CϚǚ࢚˼ФÔ¤ƌĞ̪Qʤ´¼mȠJˀƲÀɠmǐnǔĎȆÞǠN~ʢĜ¶ƌĆĘźʆȬ˪ĚĒ¸ĞGȖƴƀj`ĢçĶāàŃºēĢĖćYÀŎüôQÐÂŎŞǆŞêƖoˆDĤÕºÑǘÛˤ³̀gńƘĔÀ^ªƂ`ªt¾äƚêĦĀ¼ÐĔǎ¨Ȕ»͠^ˮÊȦƤøxRrŜH¤¸ÂxDÄ|ø˂˜ƮÐ¬ɚwɲFjĔ²Äw°ǆdÀÉ_ĸdîàŎjÊêTĞªŌŜWÈ|tqĢUB~´°ÎFCU¼pĀēƄN¦¾O¶łKĊOjĚj´ĜYp{¦SĚÍ\\T×ªV÷Ší¨ÅDK°ßtŇĔK¨ǵÂcḷ̌ĚǣȄĽFlġUĵŇȣFʉɁMğįʏƶɷØŭOǽ«ƽū¹Ʊő̝Ȩ§ȞʘĖiɜɶʦ}¨֪ࠜ̀ƇǬ¹ǨE˦ĥªÔêFxúQEr´Wrh¤Ɛ \\talĈDJÜ|[Pll̚¸ƎGú´P¬W¦^¦H]prRn|or¾wLVnÇIujkmon£cX^Bh`¥V¦U¤¸}xRj[^xN[~ªxQ[`ªHÆÂExx^wN¶Ê|¨ìMrdYpoRzNyÀDs~bcfÌ`L¾n|¾T°c¨È¢ar¤`[|òDŞĔöxElÖdHÀI`Ď\\Àì~ÆR¼tf¦^¢ķ¶eÐÚMptgjɡČÅyġLûŇV®ÄÈƀĎ°P|ªVVªj¬ĚÒêp¬E|ŬÂc|ÀtƐK f{ĘFĒƌXƲąo½Ę\\¥o}Ûu£ç­kX{uĩ«āíÓUŅßŢqŤ¥lyň[oi{¦LńðFȪȖĒL¿Ìf£K£ʺoqNwğc`uetOj×°KJ±qÆġmĚŗos¬qehqsuH{¸kH¡ÊRǪÇƌbȆ¢´äÜ¢NìÉʖ¦â©Ż؛Ç@Vu»Aylßí¹ĵêÝlISò³C¹Ìâ²i¶Ìoú^H²CǜңǄ z¼g^èöŰ_Ĳĕê}gÁnUI«m]jvV¼euhwqAaW_µj»çjioQR¹ēÃßt@r³[ÛlćË^ÍÉáGOUÛOB±XkÅ¹£k|e]olkVÍ¼ÕqtaÏõjgÁ£§U^RLËnX°ÇBz^~wfvypV ¯ƫĉ˭ȫƗŷɿÿĿƑ˃ĝÿÃǃßËőó©ǐȍŒĖM×ÍEyxþp]ÉvïèvƀnÂĴÖ@V~Ĉ³MEĸÅĖtējyÄDXÄxGQuv_i¦aBçw˛wD©{tāmQ{EJ§KPśƘƿ¥@sCTÉ}ɃwƇy±gÑ}T[÷kÐç¦«SÒ¥¸ëBX½HáÅµÀğtSÝÂa[ƣ°¯¦Pï¡]£ġÒk®G²èQ°óMq}EóƐÇ\\@áügQÍu¥FTÕ¿Jû]|mvāÎYua^WoÀa·­ząÒot×¶CLƗi¯¤mƎHǊ¤îìɾŊìTdåwsRÖgĒųúÍġäÕ}Q¶¿A[¡{d×uQAMxVvMOmăl«ct[wº_ÇÊjbÂ£ĦS_éQZ_lwgOiýe`YYLq§IÁǳ£ÙË[ÕªuƏ³ÍTs·bÁĽäė[b[ŗfãcn¥îC¿÷µ[ŏÀQ­ōĉm¿Á^£mJVmL[{Ï_£F¥Ö{ŹA}×Wu©ÅaųĳƳhB{·TQqÙIķËZđ©Yc|M¡LeVUóK_QWk_ĥ¿ãZ»X\\ĴuUèlG®ěłTĠğDŃOrÍdÆÍz]±ŭ©Å]ÅÐ}UË¥©TċïxgckfWgi\\ÏĒ¥HkµEë{»ÏetcG±ahUiñiWsɁ·cCÕk]wȑ|ća}wVaĚá G°ùnM¬¯{ÈÐÆA¥ÄêJxÙ¢hP¢ÛºµwWOóFÁz^ÀŗÎú´§¢T¤ǻƺSėǵhÝÅQgvBHouʝl_o¿Ga{ïq{¥|ſĿHĂ÷aĝÇqZñiñC³ª»E`¨åXēÕqÉû[l}ç@čƘóO¿¡FUsAʽīccocÇS}£IS~ălkĩXçmĈŀÐoÐdxÒuL^T{r@¢ÍĝKén£kQyÅõËXŷƏL§~}kq»IHėǅjĝ»ÑÞoå°qTt|r©ÏS¯·eŨĕx«È[eM¿yupN~¹ÏyN£{©għWí»Í¾səšǅ_ÃĀɗ±ąĳĉʍŌŷSÉA±åǥɋ@ë£R©ąP©}ĹªƏj¹erLDĝ·{i«ƫC£µ"]],"encodeOffsets":[[[127444,52594]],[[113793,40312]]]},"properties":{"cp":[111.670801,40.818311],"name":"内蒙古","childNum":2}},{"id":"210000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@L@@sa"],["@@MnNm"],["@@dc"],["@@eÀC@b"],["@@fXwkbrÄ`qg"],["@@^jtWQ"],["@@~ Y]c"],["@@G`ĔN^_¿ZÃM"],["@@iX¶BY"],["@@YZ"],["@@L_{Epf"],["@@^WqCT\\"],["@@\\[§t|¤_"],["@@m`n_"],["@@Ïxǌ{q_×^Giip"],["@@@é^BntaÊU]x ¯ÄPĲ­°hʙK³VÕ@Y~|EvĹsÇ¦­L^pÃ²ŸÒG Ël]xxÄ_fT¤Ď¤cPC¨¸TVjbgH²sdÎdHt`B²¬GJję¶[ÐhjeXdlwhðSČ¦ªVÊÏÆZÆŶ®²^ÎyÅÎcPqńĚDMħĜŁH­kçvV[ĳ¼WYÀäĦ`XlR`ôLUVfK¢{NZdĒªYĸÌÚJRr¸SA|ƴgŴĴÆbvªØX~źB|¦ÕE¤Ð`\\|KUnnI]¤ÀÂĊnŎR®Ő¿¶\\ÀøíDm¦ÎbŨabaĘ\\ľãÂ¸atÎSƐ´©v\\ÖÚÌǴ¤Â¨JKrZ_ZfjþhPkx`YRIjJcVf~sCN¤ EhæmsHy¨SðÑÌ\\\\ĐRZk°IS§fqŒßýáĞÙÉÖ[^¯ǤŲê´\\¦¬ĆPM¯£»uïpùzExanµyoluqe¦W^£ÊL}ñrkqWňûPUP¡ôJoo·U}£[·¨@XĸDXm­ÛÝºGUCÁª½{íĂ^cjk¶Ã[q¤LÉö³cux«zZf²BWÇ®Yß½ve±ÃCý£W{Ú^q^sÑ·¨ÍOt¹·C¥GDrí@wÕKţÃ«V·i}xËÍ÷i©ĝɝǡ]{c±OW³Ya±_ç©HĕoƫŇqr³Lys[ñ³¯OSďOMisZ±ÅFC¥Pq{Ã[Pg}\\¿ghćOk^ģÁFıĉĥM­oEqqZûěŉ³F¦oĵhÕP{¯~TÍlªNßYÐ{Ps{ÃVUeĎwk±ŉVÓ½ŽJãÇÇ»Jm°dhcÀffdF~ĀeĖd`sx² ®EżĀdQÂd^~ăÔH¦\\LKpĄVez¤NP ǹÓRÆąJSh­a[¦´ÂghwmBÐ¨źhI|VV|p] Â¼èNä¶ÜBÖ¼L`¼bØæKVpoúNZÞÒKxpw|ÊEMnzEQIZZNBčÚFÜçmĩWĪñtÞĵÇñZ«uD±|Əlĳ¥ãn·±PmÍada CLǑkùó¡³Ï«QaċÏOÃ¥ÕđQȥċƭy³ÃA"]],"encodeOffsets":[[[123686,41445]],[[126019,40435]],[[124393,40128]],[[126117,39963]],[[125322,40140]],[[126686,40700]],[[126041,40374]],[[125584,40168]],[[125453,40165]],[[125362,40214]],[[125280,40291]],[[125774,39997]],[[125976,40496]],[[125822,39993]],[[125509,40217]],[[122731,40949]]]},"properties":{"cp":[123.429096,41.796767],"name":"辽宁","childNum":16}},{"id":"220000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@pä³PClFbbÍzwBGĭZÅi»lY­ċ²SgkÇ£^Sqd¯R©é£¯S\\cZ¹iűƏCuƍÓXoR}M^o£R}oªU­FuuXHlEÅÏ©¤ÛmTþ¤D²ÄufàÀ­XXÈ±AeyYw¬dvõ´KÊ£\\rµÄlidā]|î©¾DÂVH¹Þ®ÜWnCķ W§@\\¸~¤Vp¸póIO¢VOŇürXql~òÉK]¤¥Xrfkvzpm¶bwyFoúvð¼¤ N°ąO¥«³[éǡű_°Õ\\ÚÊĝþâőàerR¨­JYlďQ[ ÏYëÐ§TGztnß¡gFkMāGÁ¤ia ÉÈ¹`\\xs¬dĆkNnuNUuP@vRY¾\\¢GªóĄ~RãÖÎĢùđŴÕhQxtcæëSɽŉíëǉ£ƍG£nj°KƘµDsØÑpyĆ¸®¿bXp]vbÍZuĂ{n^IüÀSÖ¦EvRÎûh@â[ƏÈô~FNr¯ôçR±­HÑlĢ^¤¢OðævxsŒ]ÞÁTĠs¶¿âÆGW¾ìA¦·TÑ¬è¥ÏÐJ¨¼ÒÖ¼ƦɄxÊ~StD@Ă¼Ŵ¡jlºWvÐzƦZÐ²CH AxiukdGgetqmcÛ£Ozy¥cE}|¾cZk¿uŐã[oxGikfeäT@SUwpiÚFM©£è^Ú`@v¶eňf heP¶täOlÃUgÞzŸU`l}ÔÆUvØ_Ō¬Öi^ĉi§²ÃB~¡ĈÚEgc|DC_Ȧm²rBx¼MÔ¦ŮdĨÃâYxƘDVÇĺĿg¿cwÅ\\¹¥Yĭl¤OvLjM_a W`zļMž·\\swqÝSAqŚĳ¯°kRē°wx^ĐkǂÒ\\]nrĂ}²ĊŲÒøãh·M{yMzysěnĒġV·°G³¼XÀ¤¹i´o¤ŃÈ`ÌǲÄUĞd\\iÖmÈBĤÜɲDEh LG¾ƀÄ¾{WaYÍÈĢĘÔRîĐj}ÇccjoUb½{h§Ǿ{KƖµÎ÷GĀÖŠåưÎs­lyiē«`å§H¥Ae^§GK}iã\\c]v©ģZmÃ|[M}ģTɟĵÂÂ`ÀçmFK¥ÚíÁbX³ÌQÒHof{]ept·GŋĜYünĎųVY^ydõkÅZW«WUa~U·SbwGçǑiW^qFuNĝ·EwUtW·Ýďæ©PuqEzwAVXRãQ`­©GMehccďÏd©ÑW_ÏYƅ»é\\ɹ~ǙG³mØ©BšuT§Ĥ½¢Ã_Ã½L¡ýqT^rme\\PpZZbyuybQefµ]UhĿDCmûvaÙNSkCwncćfv~YÇG"],"encodeOffsets":[[130196,42528]]},"properties":{"cp":[125.3245,43.886841],"name":"吉林","childNum":1}},{"id":"230000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@ƨĶTLÇyqpÇÛqe{~oyen}s`qiXGù]Ëp½©lÉÁp]Þñ´FĂ^fäîºkàz¼BUvÈ@"],["@@UµNÿ¥īèçHÍøƕ¶Lǽ|g¨|a¾pVidd~ÈiíďÓQġėÇZÎXb½|ſÃH½KFgɱCģÛÇAnjÕc[VĝǱÃËÇ_ £ń³pj£º¿»WH´¯U¸đĢmtĜyzzNN|g¸÷äűÑ±ĉā~mq^[ǁÑďlw]¯xQĔ¯l°řĴrBÞTxr[tŽ¸ĻN_yX`biNKuP£kZĮ¦[ºxÆÀdhĹŀUÈƗCwáZħÄŭcÓ¥»NAw±qȥnD`{ChdÙFć}¢A±Äj¨]ĊÕjŋ«×`VuÓÅ~_kŷVÝyhVkÄãPsOµfgeŇµf@u_Ù ÙcªNªÙEojVxT@ãSefjlwH\\pŏäÀvlY½d{F~¦dyz¤PÜndsrhfHcvlwjF£G±DÏƥYyÏu¹XikĿ¦ÏqƗǀOŜ¨LI|FRĂn sª|C˜zxAè¥bfudTrFWÁ¹Am|ĔĕsķÆF´N}ćUÕ@Áĳſmuçuð^ÊýowFzØÎĕNőǏȎôªÌŒǄàĀÄ˄ĞŀƒʀĀƘŸˮȬƬĊ°Uzouxe]}AyÈW¯ÌmKQ]Īºif¸ÄX|sZt|½ÚUÎ lk^p{f¤lºlÆW A²PVÜPHÊâ]ÎĈÌÜk´\\@qàsĔÄQºpRij¼èi`¶bXrBgxfv»uUi^v~J¬mVp´£´VWrnP½ì¢BX¬hðX¹^TjVriªjtŊÄmtPGx¸bgRsT`ZozÆO]ÒFôÒOÆŊvÅpcGêsx´DR{AEOr°x|íb³Wm~DVjºéNNËÜ˛ɶ­GxŷCSt}]ûōSmtuÇÃĕNāg»íT«u}ç½BĵÞʣ¥ëÊ¡MÛ³ãȅ¡ƋaǩÈÉQG¢·lG|tvgrrf«ptęŘnÅĢrI²¯LiØsPf_vĠdxM prʹL¤¤eËÀđKïÙVY§]Ióáĥ]ķK¥j|pŇ\\kzţ¦šnņäÔVĂîĪ¬|vW®l¤èØrxm¶ă~lÄƯĄ̈́öȄEÔ¤ØQĄĄ»ƢjȦOǺ¨ìSŖÆƬyQv`cwZSÌ®ü±Ǆ]ŀç¬B¬©ńzƺŷɄeeOĨSfm ĊƀP̎ēz©ĊÄÕÊmgÇsJ¥ƔŊśæÎÑqv¿íUOµªÂnĦÁ_½ä@êí£P}Ġ[@gġ}gɊ×ûÏWXá¢užƻÌsNÍ½ƎÁ§čŐAēeL³àydl¦ĘVçŁpśǆĽĺſÊQíÜçÛġÔsĕ¬Ǹ¯YßċġHµ ¡eå`ļrĉŘóƢFìĎWøxÊkƈdƬv|I|·©NqńRŀ¤éeŊŀàŀU²ŕƀBQ£Ď}L¹Îk@©ĈuǰųǨÚ§ƈnTËÇéƟÊcfčŤ^XmHĊĕË«W·ċëx³ǔķÐċJāwİ_ĸȀ^ôWr­°oú¬ĦŨK~ȰCĐ´Ƕ£fNÎèâw¢XnŮeÂÆĶ¾¾xäLĴĘlļO¤ÒĨA¢Êɚ¨®ØCÔ ŬGƠƦYĜĘÜƬDJg_ͥœ@čŅĻA¶¯@wÎqC½Ĉ»NăëKďÍQÙƫ[«ÃígßÔÇOÝáWñuZ¯ĥŕā¡ÑķJu¤E å¯°WKÉ±_d_}}vyõu¬ï¹ÓU±½@gÏ¿rÃ½DgCdµ°MFYxw¿CG£Rƛ½Õ{]L§{qqą¿BÇƻğëܭǊË|c²}Fµ}ÙRsÓpg±QNqǫŋRwŕnéÑÉK«SeYRŋ@{¤SJ}D Ûǖ֍]gr¡µŷjqWÛham³~S«Þ]"]],"encodeOffsets":[[[127123,51780]],[[134456,44547]]]},"properties":{"cp":[126.642464,45.756967],"name":"黑龙江","childNum":2}},{"id":"320000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@cþÅPi`ZRu¥É\\]~°Y`µÓ^phÁbnÀşúòaĬºTÖŒbe¦¦{¸ZâćNp©Hr|^mjhSEb\\afv`sz^lkljÄtg¤D­¾X¿À|ĐiZȀåB·î}GL¢õcßjayBFµÏC^ĭcÙt¿sğH]j{s©HM¢QnDÀ©DaÜÞ·jgàiDbPufjDk`dPOîhw¡ĥ¥GP²ĐobºrYî¶aHŢ´ ]´rılw³r_{£DB_Ûdåuk|Ũ¯F Cºyr{XFye³Þċ¿ÂkĭB¿MvÛpm`rÚã@Ę¹hågËÖƿxnlč¶Åì½Ot¾dJlVJĂǀŞqvnO^JZż·Q}êÍÅmµÒ]ƍ¦Dq}¬R^èĂ´ŀĻĊIÔtĲyQŐĠMNtR®òLhĚs©»}OÓGZz¶A\\jĨFäOĤHYJvÞHNiÜaĎÉnFQlNM¤B´ĄNöɂtpŬdfåqm¿QûùŞÚb¤uŃJŴu»¹ĄlȖħŴw̌ŵ²ǹǠ͛hĭłƕrçü±Yxcitğ®jű¢KOķCoy`å®VTa­_Ā]ŐÝɞï²ʯÊ^]afYǸÃĆēĪȣJđ͍ôƋÄÄÍīçÛɈǥ£­ÛmY`ó£Z«§°Ó³QafusNıǅ_k}¢m[ÝóDµ¡RLčiXyÅNïă¡¸iĔÏNÌŕoēdōîåŤûHcs}~Ûwbù¹£¦ÓCtOPrE^ÒogĉIµÛÅʹK¤½phMü`oæŀ"],"encodeOffsets":[[121740,32276]]},"properties":{"cp":[118.767413,32.041544],"name":"江苏","childNum":1}},{"id":"330000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@E^dQ]K"],["@@jX^j"],["@@sfbU"],["@@qP\\xz[ck"],["@@R¢FX}°[s_"],["@@Cb\\}"],["@@e|v\\la{u"],["@@v~u}"],["@@QxÂF¯}"],["@@¹nvÞs¯o"],["@@rSkUEj"],["@@bi­ZP"],["@@p[}INf"],["@@À¿"],["@@¹dnb"],["@@rSBnR"],["@@g~h}"],["@@FlEk"],["@@OdPc"],["@@v[u\\"],["@@FjâL~wyoo~sµL\\"],["@@¬e¹aN"],["@@\\nÔ¡q]L³ë\\ÿ®QÖ"],["@@ÊA­©[¬"],["@@Kxv­"],["@@@hlIk]"],["@@pW{o||j"],["@@Md|_mC"],["@@¢X£ÏylD¼XtH"],["@@hlÜ[LykAvyfw^E¤"],["@@fp¤MusR"],["@@®_ma~LÁ¬Z"],["@@iMxZ"],["@@ZcYd"],["@@Z~dOSo|A¿qZv"],["@@@`EN¡v"],["@@|TY{"],["@@@n@m"],["@@XWkCT\\"],["@@ºwZRkĕWO¢"],["@@X®±GrÆª\\ÔáXq{"],["@@ůTG°ĄLHm°UC"],["@@¤aÜx~}dtüGæţŎíĔcŖpMËÐjē¢·ðĄÆMzjWKĎ¢Q¶À_ê_Bıi«pZgf¤Nrq]§ĂN®«H±yƳí¾×ŸīàLłčŴǝĂíÀBŖÕªÁŖHŗŉåqûõi¨hÜ·ñt»¹ýv_[«¸mYL¯QªmĉÅdMgÇjcº«ę¬­K­´B«Âącoċ\\xKd¡gěŧ«®á[~ıxu·ÅKsËÉc¢Ù\\ĭƛëbf¹­ģSĜkáƉÔ­ĈZB{aMµfzŉfåÂŧįƋǝÊĕġć£g³ne­ą»@­¦S®\\ßðChiqªĭiAuA­µ_W¥ƣO\\lċĢttC¨£t`PZäuXßBsĻyekOđġĵHuXBµ]×­­\\°®¬F¢¾pµ¼kŘó¬Wät¸|@L¨¸µrºù³Ù~§WIZW®±Ð¨ÒÉx`²pĜrOògtÁZ}þÙ]¡FKwsPlU[}¦Rvn`hq¬\\nQ´ĘRWb_ rtČFIÖkĦPJ¶ÖÀÖJĈĄTĚòC ²@PúØz©Pî¢£CÈÚĒ±hŖl¬â~nm¨f©iļ«mntuÖZÜÄjL®EÌFª²iÊxØ¨IÈhhst"],["@@o\\VzRZ}y"],["@@@°¡mÛGĕ¨§Ianá[ýƤjfæØLäGr"]],"encodeOffsets":[[[125592,31553]],[[125785,31436]],[[125729,31431]],[[125513,31380]],[[125223,30438]],[[125115,30114]],[[124815,29155]],[[124419,28746]],[[124095,28635]],[[124005,28609]],[[125000,30713]],[[125111,30698]],[[125078,30682]],[[125150,30684]],[[124014,28103]],[[125008,31331]],[[125411,31468]],[[125329,31479]],[[125626,30916]],[[125417,30956]],[[125254,30976]],[[125199,30997]],[[125095,31058]],[[125083,30915]],[[124885,31015]],[[125218,30798]],[[124867,30838]],[[124755,30788]],[[124802,30809]],[[125267,30657]],[[125218,30578]],[[125200,30562]],[[124968,30474]],[[125167,30396]],[[124955,29879]],[[124714,29781]],[[124762,29462]],[[124325,28754]],[[123990,28459]],[[125366,31477]],[[125115,30363]],[[125369,31139]],[[122495,31878]],[[125329,30690]],[[125192,30787]]]},"properties":{"cp":[120.153576,30.287459],"name":"浙江","childNum":45}},{"id":"340000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@^iuLX^"],["@@e©Ehl"],["@@°ZÆëĎµmkǀwÌÕæhºgBĝâqÙĊzÖgņtÀÁĂÆáhEz|WzqD¹°Eŧl{ævÜcA`¤C`|´qxĲkq^³³GšµbíZ¹qpa±ď OH¦Ħx¢gPícOl_iCveaOjChß¸iÝbÛªCC¿mRV§¢A|t^iĠGÀtÚsd]ĮÐDE¶zAb àiödK¡~H¸íæAǿYj{ď¿À½W®£ChÃsikkly]_teu[bFaTign{]GqªoĈMYá|·¥f¥őaSÕėNµñĞ«Im_m¿Âa]uĜp Z_§{Cäg¤°r[_YjÆOdý[I[á·¥Q_nùgL¾mvˊBÜÆ¶ĊJhpc¹O]iŠ]¥ jtsggJÇ§w×jÉ©±EFË­KiÛÃÕYvsm¬njĻª§emná}k«ŕgđ²ÙDÇ¤í¡ªOy×Où±@DñSęćăÕIÕ¿IµĥOjNÕËT¡¿tNæŇàåyķrĕq§ÄĩsWÆßF¶X®¿mwRIÞfßoG³¾©uyHį{Ɓħ¯AFnuPÍÔzVdàôº^Ðæd´oG¤{S¬ćxã}ŧ×Kǥĩ«ÕOEÐ·ÖdÖsƘÑ¨[Û^Xr¢¼§xvÄÆµ`K§ tÒ´Cvlo¸fzŨð¾NY´ı~ÉĔēßúLÃÃ_ÈÏ|]ÂÏFlg`ben¾¢pUh~ƴĖ¶_r sĄ~cƈ]|r c~`¼{À{ȒiJjz`îÀT¥Û³]u}fïQl{skloNdjäËzDvčoQďHI¦rbtHĔ~BmlRV_ħTLnñH±DL¼Lªl§Ťa¸ĚlK²\\RòvDcÎJbt[¤D@®hh~kt°ǾzÖ@¾ªdbYhüóZ ň¶vHrľ\\ÊJuxAT|dmÀO[ÃÔG·ĚąĐlŪÚpSJ¨ĸLvÞcPæķŨ®mÐálwKhïgA¢ųÆ©Þ¤OÈm°K´"]],"encodeOffsets":[[[121722,32278]],[[119475,30423]],[[119168,35472]]]},"properties":{"cp":[117.283042,31.86119],"name":"安徽","childNum":3}},{"id":"350000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@zht´]"],["@@aj^~ĆG©O"],["@@ed¨C}}i"],["@@@vPGsQ"],["@@sBzddW]Q"],["@@S¨Q{"],["@@NVucW"],["@@qptBAq"],["@@¸[mu"],["@@Q\\pD]_"],["@@jSwUadpF"],["@@eXª~"],["@@AjvFso"],["@@fT_Çí\\v|ba¦jZÆy°"],["@@IjJi"],["@@wJIx«¼AoNe{M­"],["@@K±¡ÓČäeZ"],["@@k¡¹Eh~c®wBkUplÀ¡I~Māe£bN¨gZý¡a±Öcp©PhI¢QqÇGj|¥U g[Ky¬ŏv@OptÉEF\\@ åA¬V{XģĐBycpě¼³Ăp·¤¥ohqqÚ¡ŅLs^Ã¡§qlÀhH¨MCe»åÇGD¥zPO£čÙkJA¼ßėuĕeûÒiÁŧSW¥Qûŗ½ùěcÝ§SùĩąSWó«íęACµeRåǃRCÒÇZÍ¢ź±^dlstjD¸ZpuÔâÃH¾oLUêÃÔjjēò´ĄWƛ^Ñ¥Ħ@ÇòmOw¡õyJyD}¢ďÑÈġfZda©º²z£NjD°Ötj¶¬ZSÎ~¾c°¶ÐmxO¸¢Pl´SL|¥AȪĖMņĲg®áIJČĒü` QF¬h|ĂJ@zµ |ê³È ¸UÖŬŬÀEttĸr]ðM¤ĶĲHtÏ AĬkvsq^aÎbvdfÊòSD´Z^xPsĂrvƞŀjJd×ŘÉ ®AÎ¦ĤdxĆqAZRÀMźnĊ»İÐZ YXæJyĊ²·¶q§·K@·{sXãô«lŗ¶»o½E¡­«¢±¨Y®Ø¶^AvWĶGĒĢPlzfļtàAvWYãO_¤sD§ssČġ[kƤPX¦`¶®BBvĪjv©jx[L¥àï[F¼ÍË»ğV`«Ip}ccÅĥZEãoP´B@D¸m±z«Ƴ¿å³BRØ¶Wlâþäą`]Z£Tc ĹGµ¶Hm@_©k¾xĨôȉðX«½đCIbćqK³ÁÄš¬OAwã»aLŉËĥW[ÂGIÂNxĳ¤D¢îĎÎB§°_JGs¥E@¤ućPåcuMuw¢BI¿]zG¹guĮck\\_"]],"encodeOffsets":[[[123250,27563]],[[122541,27268]],[[123020,27189]],[[122916,27125]],[[122887,26845]],[[122808,26762]],[[122568,25912]],[[122778,26197]],[[122515,26757]],[[122816,26587]],[[123388,27005]],[[122450,26243]],[[122578,25962]],[[121255,25103]],[[120987,24903]],[[122339,25802]],[[121042,25093]],[[122439,26024]]]},"properties":{"cp":[119.306239,26.075302],"name":"福建","childNum":18}},{"id":"360000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@ĢĨƐgļ¼ÂMD~ņªe^\\^§ý©j×cZØ¨zdÒa¶lÒJìõ`oz÷@¤uŞ¸´ôęöY¼HČƶajlÞƩ¥éZ[|h}^U  ¥pĄžƦO lt¸Æ Q\\aÆ|CnÂOjt­ĚĤdÈF`¶@Ðë ¦ōÒ¨SêvHĢûXD®QgÄWiØPÞìºr¤ǆNĠ¢lĄtZoCƞÔºCxrpĠV®Ê{f_Y`_eq®Aot`@oDXfkp¨|s¬\\DÄSfè©Hn¬^DhÆyøJhØxĢĀLÊƠPżċĄwȠĚ¦G®ǒĤäTŠÆ~Ħw«|TF¡nc³Ïå¹]ĉđxe{ÎÓvOEm°BƂĨİ|Gvz½ª´HàpeJÝQxnÀW­EµàXÅĪt¨ÃĖrÄwÀFÎ|ňÓMå¼ibµ¯»åDT±m[r«_gmQu~¥V\\OkxtL E¢Ú^~ýêPóqoě±_Êw§ÑªåƗā¼mĉŹ¿NQYBąrwģcÍ¥B­ŗÊcØiIƝĿuqtāwO]³YCñTeÉcaubÍ]trluīBÐGsĵıN£ï^ķqss¿FūūVÕ·´Ç{éĈýÿOER_đûIċâJh­ŅıNȩĕB¦K{Tk³¡OP·wnµÏd¯}½TÍ«YiµÕsC¯iM¤­¦¯P|ÿUHvhe¥oFTuõ\\OSsMòđƇiaºćXĊĵà·çhƃ÷Ç{ígu^đgm[×zkKN¶Õ»lčÓ{XSÆv©_ÈëJbVkĔVÀ¤P¾ºÈMÖxlò~ªÚàGĂ¢B±ÌKyáV¼Ã~­`gsÙfIƋlę¹e|~udjuTlXµf`¿Jd[\\L²"],"encodeOffsets":[[116689,26234]]},"properties":{"cp":[115.892151,28.676493],"name":"江西","childNum":1}},{"id":"370000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@Xjd]{K"],["@@itbFHy"],["@@HlGk"],["@@TGy"],["@@K¬U"],["@@WdXc"],["@@PtOs"],["@@LnXhc"],["@@ppVu]Or"],["@@cdzAUa"],["@@udRhnCI"],["@@oIpR"],["@@Ľč{fzƤîKÎMĮ]ZF½Y]â£ph¶¨râøÀÎǨ¤^ºÄGz~grĚĜlĞÆLĆǆ¢Îo¦cvKbgr°WhmZp L]LºcUÆ­nżĤÌĒbAnrOA´ȊcÀbƦUØrĆUÜøĬƞEzVL®öØBkŖÝĐĖ¹ŧ̄±ÀbÎÉnb²ĦhņBĖįĦåXćì@L¯´ywƕCéÃµė ƿ¸lµ¾Z|ZWyFY¨Mf~C¿`à_RÇzwƌfQnny´INoƬèôº|sTJULîVjǎ¾ĒØDz²XPn±ŴPè¸ŔLƔÜƺ_TüÃĤBBċÈöA´faM¨{«M`¶d¡ôÖ°mȰBÔjj´PM|c^d¤u¤Û´ä«ƢfPk¶Môl]Lb}su^ke{lCMrDÇ­]NÑFsmoõľHyGă{{çrnÓEƕZGª¹Fj¢ïWuøCǷë¡ąuhÛ¡^KxC`C\\bÅxì²ĝÝ¿_NīCȽĿåB¥¢·IŖÕy\\¹kxÃ£Č×GDyÃ¤ÁçFQ¡KtŵƋ]CgÏAùSedcÚźuYfyMmhUWpSyGwMPqŀÁ¼zK¶G­Y§Ë@´śÇµƕBm@IogZ¯uTMx}CVKï{éƵP_K«pÛÙqċtkkù]gTğwoɁsMõ³ăAN£MRkmEÊčÛbMjÝGuIZGPģãħE[iµBEuDPÔ~ª¼ęt]ûG§¡QMsğNPŏįzs£Ug{đJĿļā³]ç«Qr~¥CƎÑ^n¶ÆéÎR~Ż¸YI] PumŝrƿIā[xeÇ³L¯v¯s¬ÁY~}ťuŁgƋpÝĄ_ņī¶ÏSR´ÁP~¿Cyċßdwk´SsX|t`Ä ÈðAªìÎT°¦Dda^lĎDĶÚY°`ĪŴǒàŠv\\ebZHŖR¬ŢƱùęOÑM­³FÛWp["]],"encodeOffsets":[[[123806,39303]],[[123821,39266]],[[123742,39256]],[[123702,39203]],[[123649,39066]],[[123847,38933]],[[123580,38839]],[[123894,37288]],[[123043,36624]],[[123344,38676]],[[123522,38857]],[[123628,38858]],[[118260,36742]]]},"properties":{"cp":[117.000923,36.675807],"name":"山东","childNum":13}},{"id":"410000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@ýLùµP³swIÓxcŢĞð´E®ÚPtĴXØxÂ¶@«ŕŕQGYfa[şußǩđš_X³ĳÕčC]kbc¥CS¯ëÍB©÷³­Si_}mYTt³xlàcČzÀD}ÂOQ³ÐTĨ¯ƗòËŖ[hłŦv~}ÂZ«¤lPÇ£ªÝŴÅR§ØnhctâknÏ­ľŹUÓÝdKuķI§oTũÙďkęĆH¸Ó\\Ä¿PcnS{wBIvÉĽ[GqµuŇôYgûZca©@½Õǽys¯}lgg@­C\\£asIdÍuCQñ[L±ęk·ţb¨©kK»KC²òGKmĨS`UQnk}AGēsqaJ¥ĐGRĎpCuÌy ã iMcplk|tRkðev~^´¦ÜSí¿_iyjI|ȑ|¿_»d}q^{Ƈdă}tqµ`Ƴĕg}V¡om½faÇo³TTj¥tĠRyK{ùÓjuµ{t}uËRivGçJFjµÍyqÎàQÂFewixGw½Yŷpµú³XU½ġyłåkÚwZX·l¢Á¢KzOÎÎjc¼htoDHr|­J½}JZ_¯iPq{tę½ĕ¦Zpĵø«kQĹ¤]MÛfaQpě±ǽ¾]u­Fu÷nčÄ¯ADp}AjmcEÇaª³o³ÆÍSƇĈÙDIzËčľ^KLiÞñ[aA²zzÌ÷D|[íÄ³gfÕÞd®|`Ć~oĠƑô³ŊD×°¯CsøÀ«ìUMhTº¨¸ǡîSÔDruÂÇZÖEvPZW~ØÐtĄE¢¦Ðy¸bô´oŬ¬²Ês~]®tªapŎJ¨Öº_Ŕ`Ŗ^Đ\\Ĝu~m²Ƹ¸fWĦrƔ}Î^gjdfÔ¡J}\\n C¦þWxªJRÔŠu¬ĨĨmFdM{\\d\\YÊ¢ú@@¦ª²SÜsC}fNècbpRmlØ^gd¢aÒ¢CZZxvÆ¶N¿¢T@uC¬^ĊðÄn|lGlRjsp¢ED}Fio~ÔN~zkĘHVsǲßjŬŢ`Pûàl¢\\ÀEhİgÞē X¼Pk|m"],"encodeOffsets":[[118256,37017]]},"properties":{"cp":[113.665412,34.757975],"name":"河南","childNum":1}},{"id":"420000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@AB"],["@@lskt"],["@@¾«}{ra®pîÃ\\{øCËyyB±b\\òÝjKL ]ĎĽÌJyÚCƈćÎT´Å´pb©ÈdFin~BCo°BĎÃømv®E^vǾ½Ĝ²RobÜeN^ĺ£R¬lĶ÷YoĖ¥Ě¾|sOr°jY`~I¾®I{GqpCgyl{£ÍÍyPLÂ¡¡¸kWxYlÙæŁĢz¾V´W¶ùŸo¾ZHxjwfxGNÁ³Xéæl¶EièIH ujÌQ~v|sv¶Ôi|ú¢FhQsğ¦SiŠBgÐE^ÁÐ{čnOÂÈUÎóĔÊēĲ}Z³½Mŧïeyp·uk³DsÑ¨L¶_ÅuÃ¨w»¡WqÜ]\\Ò§tƗcÕ¸ÕFÏǝĉăxŻČƟOKÉġÿ×wg÷IÅzCg]m«ªGeçÃTC«[t§{loWeC@ps_Bp­rf_``Z|ei¡oċMqow¹DƝÓDYpûsYkıǃ}s¥ç³[§cY§HK«Qy]¢wwö¸ïx¼ņ¾Xv®ÇÀµRĠÐHM±cÏdƒǍũȅȷ±DSyúĝ£ŤĀàtÖÿï[îb\\}pĭÉI±Ñy¿³x¯No|¹HÏÛmjúË~TuęjCöAwě¬Rđl¯ Ñb­ŇTĿ_[IčĄʿnM¦ğ\\É[T·k¹©oĕ@A¾wya¥Y\\¥Âaz¯ãÁ¡k¥ne£ÛwE©Êō¶˓uoj_U¡cF¹­[WvP©whuÕyBF`RqJUw\\i¡{jEPïÿ½fćQÑÀQ{°fLÔ~wXgītêÝ¾ĺHd³fJd]HJ²EoU¥HhwQsƐ»Xmg±çve]DmÍPoCc¾_hhøYrŊU¶eD°Č_N~øĹĚ·`z]Äþp¼äÌQv\\rCé¾TnkžŐÚÜa¼ÝƆĢ¶ÛodĔňÐ¢JqPb ¾|J¾fXƐîĨ_Z¯À}úƲN_ĒÄ^ĈaŐyp»CÇÄKñL³ġM²wrIÒŭxjb[n«øæà ^²­h¯ÚŐªÞ¸Y²ĒVø}Ā^İ´LÚm¥ÀJÞ{JVųÞŃx×sxxƈē ģMřÚðòIfĊŒ\\Ʈ±ŒdÊ§ĘDvČ_Àæ~Dċ´A®µ¨ØLV¦êHÒ¤"]],"encodeOffsets":[[[113712,34000]],[[115612,30507]],[[113649,34054]]]},"properties":{"cp":[114.298572,30.584355],"name":"湖北","childNum":3}},{"id":"430000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@nFTs"],["@@ßÅÆá½ÔXrCOËRïÿĩ­TooQyÓ[ŅBE¬ÎÓXaį§Ã¸G °ITxpúxÚĳ¥ÏĢ¾edÄ©ĸGàGhM¤Â_U}Ċ}¢pczfþg¤ÇòAVM"],["@@©KA·³CQ±Á«³BUƑ¹AtćOwD]JiØSm¯b£ylXHËÑ±H«C^õľAÅ§¤É¥ïyuǙuA¢^{ÌC´­¦ŷJ£^[ª¿ĕ~ƇN skóā¹¿ï]ă~÷O§­@Vm¡Qđ¦¢Ĥ{ºjÔª¥nf´~Õo×ÛąMąıuZmZcÒ ĲĪ²SÊǄŶ¨ƚCÖŎªQØ¼rŭ­«}NÏürÊ¬mjr@ĘrTW ­SsdHzƓ^ÇÂyUi¯DÅYlŹu{hT}mĉ¹¥ěDÿë©ıÓ[Oº£¥ótł¹MÕƪ`PDiÛU¾ÅâìUñBÈ£ýhedy¡oċ`pfmjP~kZaZsÐd°wj§@Ĵ®w~^kÀÅKvNmX\\¨aŃqvíó¿F¤¡@ũÑVw}S@j}¾«pĂrªg àÀ²NJ¶¶DôK|^ª°LX¾ŴäPĪ±£EXd^¶ĲÞÜ~u¸ǔMRhsRe`ÄofIÔ\\Ø  ićymnú¨cj ¢»GČìƊÿÐ¨XeĈĀ¾Oð Fi ¢|[jVxrIQ_EzAN¦zLU`cªxOTu RLÄ¢dVi`p˔vŎµªÉF~Ød¢ºgİàw¸Áb[¦Zb¦z½xBĖ@ªpºlS¸Ö\\Ĕ[N¥ˀmĎăJ\\ŀ`ňSÚĖÁĐiOĜ«BxDõĚivSÌ}iùÜnÐºG{p°M´wÀÒzJ²ò¨ oTçüöoÛÿñőĞ¤ùTz²CȆȸǎŪƑÐc°dPÎğË¶[È½u¯½WM¡­ÉB·rínZÒ `¨GA¾\\pēXhÃRC­üWGġuTé§ŎÑ©ò³I±³}_EÃħg®ęisÁPDmÅ{b[RÅs·kPŽƥóRoOV~]{g\\êYƪ¦kÝbiċƵGZ»Ěõó·³vŝ£ø@pyö_ëIkÑµbcÑ§y×dYØªiþ¨[]f]Ņ©C}ÁN»hĻħƏĩ"]],"encodeOffsets":[[[115640,30489]],[[112543,27312]],[[116690,26230]]]},"properties":{"cp":[112.982279,28.19409],"name":"湖南","childNum":3}},{"id":"440000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@QdAua"],["@@lxDLo"],["@@sbhNLo"],["@@Ă ā"],["@@WltO[["],["@@Kr]S"],["@@eI]y"],["@@I|Mym"],["@@Û³LS¼Y"],["@@nvºBëui©`¾"],["@@zdÛJw®"],["@@°¯"],["@@a yAª¸ËJIxØ@ĀHAmÃV¡ofuo"],["@@sŗÃÔėAƁZÄ ~°ČPäh"],["@@¶ÝÌvmĞh­ıQ"],["@@HdSjĒ¢D}waru«ZqadYM"],["@@el\\LqqU"],["@@~rMo\\"],["@@f^C"],["@@øPªoj÷ÍÝħXČx°Q¨ıXNv"],["@@gÇƳo[~tly"],["@@EÆC¿"],["@@OP"],["@@wđógĝ[³¡VÙæÅöMÌ³¹pÁaËýý©D©ÜJŹƕģGą¤{ÙūÇO²«BƱéAÒĥ¡«BhlmtÃPµyU¯ucd·w_bŝcīímGO|KPȏŹãŝIŕŭŕ@Óoo¿ē±ß}ŭĲWÈCőâUâǙIğŉ©IĳE×Á³AówXJþ±ÌÜÓĨ£L]ĈÙƺZǾĆĖMĸĤfÎĵlŨnÈĐtFFĤêk¶^k°f¶g}®Faf`vXŲxl¦ÔÁ²¬Ð¦pqÊÌ²iXØRDÎ}Ä@ZĠsx®AR~®ETtĄZƈfŠŠHâÒÐAµ\\S¸^wĖkRzalŜ|E¨ÈNĀňZTpBh£\\ĎƀuXĖtKL¶G|»ĺEļĞ~ÜĢÛĊrOÙîvd]n¬VÊĜ°RÖpMƂªFbwEÀ©\\¤]ŸI®¥D³|Ë]CöAŤ¦æ´¥¸Lv¼¢ĽBaôF~®²GÌÒEYzk¤°ahlVÕI^CxĈPsBƒºV¸@¾ªR²ĨN]´_eavSivc}p}Đ¼ƌkJÚe th_¸ ºx±ò_xNË²@ă¡ßH©Ùñ}wkNÕ¹ÇO½¿£ĕ]ly_WìIÇª`uTÅxYĒÖ¼kÖµMjJÚwn\\hĒv]îh|ÈƄøèg¸Ķß ĉĈWb¹ƀdéĘNTtP[öSvrCZaGubo´ŖÒÇĐ~¡zCIözx¢PnÈñ @ĥÒ¦]ƞV}³ăĔñiiÄÓVépKG½ÄÓávYoC·sitiaÀyŧÎ¡ÈYDÑům}ý|m[węõĉZÅxUO}÷N¹³ĉo_qtăqwµŁYÙǝŕ¹tïÛUÃ¯mRCºĭ|µÕÊK½Rē ó]GªęAx»HO£|ām¡diď×YïYWªŉOeÚtĐ«zđ¹TāúEá²\\ķÍ}jYàÙÆſ¿Çdğ·ùTßÇţʄ¡XgWÀǇğ·¿ÃOj YÇ÷Qěi"]],"encodeOffsets":[[[117381,22988]],[[116552,22934]],[[116790,22617]],[[116973,22545]],[[116444,22536]],[[116931,22515]],[[116496,22490]],[[116453,22449]],[[113301,21439]],[[118726,21604]],[[118709,21486]],[[113210,20816]],[[115482,22082]],[[113171,21585]],[[113199,21590]],[[115232,22102]],[[115739,22373]],[[115134,22184]],[[113056,21175]],[[119573,21271]],[[119957,24020]],[[115859,22356]],[[116561,22649]],[[116285,22746]]]},"properties":{"cp":[113.280637,23.125178],"name":"广东","childNum":24}},{"id":"450000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@H TQ§A"],["@@ĨÊªLƊDÎĹĐCǦė¸zÚGn£¾rªŀÜt¬@ÖÚSx~øOŒŶÐÂæȠ\\ÈÜObĖw^oÞLf¬°bI lTØBÌF£Ć¹gñĤaYt¿¤VSñK¸¤nM¼JE±½¸ñoÜCƆæĪ^ĚQÖ¦^f´QüÜÊz¯lzUĺš@ìp¶n]sxtx¶@~ÒĂJb©gk{°~c°`Ô¬rV\\la¼¤ôá`¯¹LCÆbxEræOv[H­[~|aB£ÖsºdAĐzNÂðsÞÆĤªbab`ho¡³F«èVlo¤ÔRzpp®SĪº¨ÖºNĳd`a¦¤F³ºDÎńĀìCĜº¦Ċ~nS|gźvZkCÆj°zVÈÁƔ]LÊFZgčP­kini«qÇczÍY®¬Ů»qR×ō©DÕ§ƙǃŵTÉĩ±ıdÑnYYĲvNĆĆØÜ Öp}e³¦m©iÓ|¹ħņ|ª¦QF¢Â¬ʖovg¿em^ucà÷gÕuíÙćĝ}FĻ¼Ĺ{µHKsLSđƃrč¤[AgoSŇYMÿ§Ç{FśbkylQxĕ]T·¶[BÑÏGáşşƇeăYSs­FQ}­BwtYğÃ@~CÍQ ×WjË±rÉ¥oÏ ±«ÓÂ¥kwWűmcih³K~µh¯e]lµélEģEďsmÇŧē`ãògK_ÛsUʝćğ¶höO¤Ǜn³c`¡y¦CezYwa[ďĵűMę§]XÎ_íÛ]éÛUćİÕBƣ±dy¹T^dûÅÑŦ·PĻþÙ`K¦¢ÍeĥR¿³£[~äu¼dltW¸oRM¢ď\\z}Æzdvň{ÎXF¶°Â_ÒÂÏL©ÖTmu¼ãlīkiqéfA·Êµ\\őDc¥ÝFyÔćcűH_hLÜêĺĐ¨c}rn`½Ì@¸¶ªVLhŒ\\Ţĺk~Ġið°|gtTĭĸ^xvKVGréAébUuMJVÃO¡qĂXËSģãlýà_juYÛÒBG^éÖ¶§EGÅzěƯ¤EkN[kdåucé¬dnYpAyČ{`]þ¯TbÜÈk¡ĠvàhÂƄ¢Jî¶²"]],"encodeOffsets":[[[111707,21520]],[[107619,25527]]]},"properties":{"cp":[108.320004,22.82402],"name":"广西","childNum":2}},{"id":"460000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@¦Ŝil¢XƦƞòïè§ŞCêɕrŧůÇąĻõ·ĉ³œ̅kÇm@ċȧŧĥĽʉ­ƅſȓÒË¦ŝE}ºƑ[ÍĜȋ gÎfǐÏĤ¨êƺ\\Ɔ¸ĠĎvʄȀÐ¾jNðĀÒRZǆzÐŘÎ°H¨Ƣb²_Ġ "],"encodeOffsets":[[112750,20508]]},"properties":{"cp":[110.33119,20.031971],"name":"海南","childNum":1}},{"id":"510000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@LqKr"],["@@[ĻéV£_ţġñpG réÏ·~ąSfy×Í·ºſƽiÍıƣıĻmHH}siaX@iÇ°ÁÃ×t«­T¤JJJyJÈ`Ohß¦¡uËhIyCjmÿwZGTiSsOB²fNmsPa{M{õE^Hj}gYpaeu¯oáwHjÁ½M¡pMuåmni{fk\\oÎqCwEZ¼KĝAy{m÷LwO×SimRI¯rKõBS«sFe]fµ¢óY_ÆPRcue°Cbo×bd£ŌIHgtrnyPt¦foaXďxlBowz_{ÊéWiêEGhÜ¸ºuFĈIxf®Y½ĀǙ]¤EyF²ċw¸¿@g¢§RGv»áW`ÃĵJwi]t¥wO­½a[×]`Ãi­üL¦LabbTÀåc}ÍhÆh®BHî|îºÉk­¤Sy£ia©taį·Ɖ`ō¥UhOĝLk}©Fos´JmµlŁuønÑJWÎªYÀïAetTŅÓGË«bo{ıwodƟ½OġÜÂµxàNÖ¾P²§HKv¾]|BÆåoZ`¡Ø`ÀmºĠ~ÌÐ§nÇ¿¤]wğ@srğu~Io[é±¹ ¿ſđÓ@qg¹zƱřaí°KtÇ¤V»Ã[ĩǭƑ^ÇÓ@áťsZÏÅĭƋěpwDóÖáŻneQËq·GCœýS]x·ýq³OÕ¶Qzßti{řáÍÇWŝŭñzÇWpç¿JXĩè½cFÂLiVjx}\\NŇĖ¥GeJA¼ÄHfÈu~¸Æ«dE³ÉMA|bÒćhG¬CMõƤąAvüVéŀ_VÌ³ĐwQj´·ZeÈÁ¨X´Æ¡Qu·»ÕZ³ġqDoy`L¬gdp°şp¦ėìÅĮZ°Iähzĵf²å ĚÑKpIN|Ñz]ń·FU×é»R³MÉ»GM«kiér}Ã`¹ăÞmÈnÁîRǀ³ĜoİzŔwǶVÚ£À]ɜ»ĆlƂ²ĠþTº·àUȞÏʦ¶I«dĽĢdĬ¿»Ĕ×h\\c¬ä²GêëĤł¥ÀǿżÃÆMº}BÕĢyFVvwxBèĻĒ©ĈtCĢɽŠȣ¦āæ·HĽîôNÔ~^¤Ɗu^s¼{TA¼ø°¢İªDè¾Ň¶ÝJ®Z´ğ~Sn|ªWÚ©òzPOȸbð¢|øĞŒQìÛÐ@ĞǎRS¤Á§di´ezÝúØã]HqkIþËQÇ¦ÃsÇ¤[E¬ÉŪÍxXƒ·ÖƁİlƞ¹ª¹|XÊwnÆƄmÀêErĒtD®ċæcQE®³^ĭ¥©l}äQtoŖÜqÆkµªÔĻĴ¡@Ċ°B²Èw^^RsºTĀ£ŚæQPJvÄz^Đ¹Æ¯fLà´GC²dt­ĀRt¼¤ĦOðğfÔðDŨŁĞƘïPÈ®âbMüÀXZ ¸£@Å»»QÉ­]dsÖ×_Í_ÌêŮPrĔĐÕGĂeZÜîĘqBhtO ¤tE[h|YÔZśÎs´xº±Uñt|OĩĠºNbgþJy^dÂY Į]Řz¦gC³R`Āz¢Aj¸CL¤RÆ»@­Ŏk\\Ç´£YW}z@Z}Ã¶oû¶]´^NÒ}èNªPÍy¹`S°´ATeVamdUĐwʄvĮÕ\\uÆŗ¨Yp¹àZÂmWh{á}WØǍÉüwga§áCNęÎ[ĀÕĪgÖÉªXøx¬½Ů¦¦[NÎLÜUÖ´òrÙŠxR^JkĳnDX{U~ET{ļº¦PZcjF²Ė@pg¨B{u¨ŦyhoÚD®¯¢ WòàFÎ¤¨GDäz¦kŮPġqË¥À]eâÚ´ªKxīPÖ|æ[xÃ¤JÞĥsNÖ½I¬nĨY´®ÐƐmDŝuäđđEbee_v¡}ìęǊē}qÉåT¯µRs¡M@}ůaa­¯wvƉåZw\\Z{åû^"]],"encodeOffsets":[[[108815,30935]],[[110617,31811]]]},"properties":{"cp":[104.065735,30.659462],"name":"四川","childNum":2}},{"id":"520000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@G\\lY£in"],["@@q|mc¯tÏVSÎ"],["@@hÑ£IsNgßHHªķÃh_¹¡ĝÄ§ń¦uÙùgS¯JH|sÝÅtÁïyMDč»eÕtA¤{b\\}G®u\\åPFqwÅaDK°ºâ_£ùbµmÁÛĹM[q|hlaªāI}Ñµ@swtwm^oµDéĽŠyVky°ÉûÛR³e¥]RÕěħ[ƅåÛDpJiVÂF²I»mN·£LbÒYbWsÀbpkiTZĄă¶Hq`ĥ_J¯ae«KpÝx]aĕÛPÇȟ[ÁåŵÏő÷Pw}TÙ@Õs«ĿÛq©½m¤ÙH·yǥĘĉBµĨÕnđ]K©œáGçş§ÕßgǗĦTèƤƺ{¶ÉHÎd¾ŚÊ·OÐjXWrãLyzÉAL¾ę¢bĶėy_qMĔąro¼hĊw¶øV¤w²Ĉ]ÊKx|`ź¦ÂÈdrcÈbe¸`I¼čTF´¼Óýȃr¹ÍJ©k_șl³´_pĐ`oÒh¶pa^ÓĔ}D»^Xy`d[KvJPhèhCrĂĚÂ^Êƌ wZL­Ġ£ÁbrzOIlMMĪŐžËr×ÎeŦtw|¢mKjSǘňĂStÎŦEtqFT¾Eì¬¬ôxÌO¢ K³ŀºäYPVgŎ¦ŊmŞ¼VZwVlz¤£Tl®ctĽÚó{G­AÇge~Îd¿æaSba¥KKûj®_Ä^\\Ø¾bP®¦x^sxjĶI_Ä Xâ¼Hu¨Qh¡À@Ëô}±GNìĎlT¸`V~R°tbÕĊ`¸úÛtÏFDu[MfqGH·¥yAztMFe|R_GkChZeÚ°tov`xbDnÐ{E}ZèxNEÞREn[Pv@{~rĆAB§EO¿|UZ~ìUf¨J²ĂÝÆsªB`s¶fvö¦Õ~dÔq¨¸º»uù[[§´sb¤¢zþF¢ÆÀhÂW\\ıËIÝo±ĭŠ£þÊs}¡R]ěDg´VG¢j±®èºÃmpU[Áëº°rÜbNu¸}º¼`niºÔXĄ¤¼ÔdaµÁ_ÃftQQgR·Ǔv}Ý×ĵ]µWc¤F²OĩųãW½¯K©]{LóµCIµ±Mß¿h©āq¬o½~@i~TUxŪÒ¢@£ÀEîôruńb[§nWuMÆLl¿]x}ĳ­½"]],"encodeOffsets":[[[112158,27383]],[[112105,27474]],[[112095,27476]]]},"properties":{"cp":[106.713478,26.578343],"name":"贵州","childNum":3}},{"id":"530000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@[ùx½}ÑRHYīĺûsÍniEoã½Ya²ė{c¬ĝgĂsAØÅwďõzFjw}«Dx¿}Uũlê@HÅ­F¨ÇoJ´Ónũuą¡Ã¢pÒÅØ TF²xa²ËXcÊlHîAßËŁkŻƑŷÉ©hW­æßUËs¡¦}teèÆ¶StÇÇ}Fd£jĈZĆÆ¤Tč\\D}O÷£U§~ŃGåŃDĝ¸Tsd¶¶Bª¤u¢ŌĎo~t¾ÍŶÒtD¦ÚiôözØX²ghįh½Û±¯ÿm·zR¦Ɵ`ªŊÃh¢rOÔ´£Ym¼èêf¯ŪĽncÚbw\\zlvWªâ ¦gmĿBĹ£¢ƹřbĥkǫßeeZkÙIKueT»sVesbaĕ  ¶®dNĄÄpªy¼³BE®lGŭCǶwêżĔÂepÍÀQƞpC¼ŲÈ­AÎô¶RäQ^Øu¬°_Èôc´¹ò¨PÎ¢hlĎ¦´ĦÆ´sâÇŲPnÊD^¯°Upv}®BPÌªjǬxSöwlfòªvqĸ|`H­viļndĜ­Ćhňem·FyÞqóSį¯³X_ĞçêtryvL¤§z¦c¦¥jnŞklD¤øz½ĜàĂŧMÅ|áƆàÊcðÂFÜáŢ¥\\\\ºİøÒÐJĴîD¦zK²ǏÎEh~CD­hMn^ÌöÄ©ČZÀaüfɭyœpį´ěFűk]Ôě¢qlÅĆÙa¶~ÄqêljN¬¼HÊNQ´ê¼VØ¸E^ŃÒyM{JLoÒęæe±Ķygã¯JYÆĭĘëo¥Šo¯hcK«z_prC´ĢÖY¼ v¸¢RÅW³Â§fÇ¸Yi³xR´ďUË`êĿUûuĆBƣöNDH«ĈgÑaB{ÊNF´¬c·Åv}eÇÃGB»If¦HňĕM~[iwjUÁKE¾dĪçWIèÀoÈXòyŞŮÈXâÎŚj|àsRyµÖPr´þ ¸^wþTDŔHr¸RÌmfżÕâCôoxĜƌÆĮÐYtâŦÔ@]ÈǮƒ\\Ī¼Ä£UsÈ¯LbîƲŚºyhr@ĒÔƀÀ²º\\êpJ}ĠvqtĠ@^xÀ£È¨mËÏğ}n¹_¿¢×Y_æpÅA^{½Lu¨GO±Õ½ßM¶wÁĢÛPƢ¼pcĲx|apÌ¬HÐŊSfsðBZ¿©XÏÒKk÷Eû¿SrEFsÕūkóVǥŉiTL¡n{uxţÏhôŝ¬ğōNNJkyPaqÂğ¤K®YxÉƋÁ]āęDqçgOgILu\\_gz]W¼~CÔē]bµogpÑ_oď`´³Țkl`IªºÎȄqÔþ»E³ĎSJ»_f·adÇqÇc¥Á_Źw{L^É±ćxU£µ÷xgĉp»ĆqNē`rĘzaĵĚ¡K½ÊBzyäKXqiWPÏÉ¸½řÍcÊG|µƕƣGË÷k°_^ý|_zċBZocmø¯hhcæ\\lMFlư£ĜÆyHF¨µêÕ]HAàÓ^it `þßäkĤÎT~Wlÿ¨ÔPzUCNVv [jâôDôď[}z¿msSh¯{jïğl}šĹ[őgK©U·µË@¾m_~q¡f¹ÅË^»f³ø}Q¡ÖË³gÍ±^Ç\\ëÃA_¿bWÏ[¶ƛé£F{īZgm@|kHǭƁć¦UĔť×ë}ǝeďºȡȘÏíBÉ£āĘPªĳ¶ŉÿy©nď£G¹¡I±LÉĺÑdĉÜW¥}gÁ{aqÃ¥aıęÏZï`"],"encodeOffsets":[[104636,22969]]},"properties":{"cp":[102.712251,25.040609],"name":"云南","childNum":1}},{"id":"540000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@ÂhľxŖxÒVºÅâAĪÝȆµę¯Ňa±r_w~uSÕňqOj]ɄQ£ZUDûoY»©M[L¼qãË{VÍçWVi]ë©Ä÷àyƛhÚU°adcQ~Mx¥cc¡ÙaSyFÖk­uRýq¿ÔµQĽ³aG{¿FµëªéĜÿª@¬·K·àariĕĀ«V»ŶĴūgèLǴŇƶaftèBŚ£^âǐÝ®M¦ÁǞÿ¬LhJ¾óƾÆºcxwf]Y´¦|QLn°adĊ\\¨oǀÍŎ´ĩĀd`tÊQŞŕ|¨C^©Ĉ¦¦ÎJĊ{ëĎjª²rÐl`¼Ą[t|¦Stè¾PÜK¸dƄı]s¤î_v¹ÎVòŦj£Əsc¬_Ğ´|Ł¦Av¦w`ăaÝaa­¢e¤ı²©ªSªÈMĄwÉØŔì@T¤Ę\\õª@þo´­xA sÂtŎKzó´ÇĊµ¢r^nĊ­Æ¬×üG¢³ {âĊ]G~bÀgVjzlhǶfOfdªB]pjTOtĊn¤}®¦Č¥d¢¼»ddY¼t¢eȤJ¤}Ǿ¡°§¤AÐlc@ĝsªćļđAçwxUuzEÖġ~AN¹ÄÅȀŻ¦¿ģŁéì±Hãd«g[Ø¼ēÀcīľġ¬cJµÐʥVȝ¸ßS¹ý±ğkƁ¼ą^ɛ¤Ûÿb[}¬ōõÃ]ËNm®g@Bg}ÍF±ǐyL¥íCIĳÏ÷Ñį[¹¦[âšEÛïÁÉdƅß{âNÆāŨß¾ě÷yC£k­´ÓH@Â¹TZ¥¢į·ÌAÐ§®Zcv½Z­¹|ÅWZqgW|ieZÅYVÓqdqbc²R@c¥Rã»GeeƃīQ}J[ÒK¬Ə|oėjġĠÑN¡ð¯EBčnwôɍėª²CλŹġǝʅįĭạ̃ūȹ]ΓͧgšsgȽóϧµǛęgſ¶ҍć`ĘąŌJÞä¤rÅň¥ÖÁUětęuůÞiĊÄÀ\\Æs¦ÓRb|Â^řÌkÄŷ¶½÷f±iMÝ@ĥ°G¬ÃM¥n£Øąğ¯ß§aëbéüÑOčk£{\\eµª×MÉfm«Ƒ{Å×Gŏǩãy³©WÑăû··Qòı}¯ãIéÕÂZ¨īès¶ZÈsæĔTŘvgÌsN@îá¾ó@ÙwU±ÉTå»£TđWxq¹Zobs[×¯cĩvėŧ³BM|¹kªħ¥TzNYnÝßpęrñĠĉRS~½ěVVµõ«M££µBĉ¥áºae~³AuĐh`Ü³ç@BÛïĿa©|z²Ý¼D£àč²ŸIûI āóK¥}rÝ_Á´éMaň¨~ªSĈ½½KÙóĿeƃÆB·¬ën×W|Uº}LJrƳlŒµ`bÔ`QÐÓ@s¬ñIÍ@ûws¡åQÑßÁ`ŋĴ{ĪTÚÅTSÄ³Yo|Ç[Ç¾µMW¢ĭiÕØ¿@MhpÕ]jéò¿OƇĆƇpêĉâlØwěsǩĵ¸cbU¹ř¨WavquSMzeo_^gsÏ·¥Ó@~¯¿RiīB\\qTGªÇĜçPoÿfñòą¦óQīÈáPābß{ZŗĸIæÅhnszÁCËìñÏ·ąĚÝUm®ó­L·ăUÈíoù´Êj°ŁŤ_uµ^°ìÇ@tĶĒ¡ÆM³Ģ«İĨÅ®ğRāðggheÆ¢zÊ©Ô\\°ÝĎz~ź¤PnMĪÖB£kné§żćĆKĒ°¼L¶èâz¨u¦¥LDĘz¬ýÎmĘd¾ßFzhg²Fy¦ĝ¤ċņbÎ@yĄæm°NĮZRÖíJ²öLĸÒ¨Y®ƌÐVàtt_ÚÂyĠz]ŢhzĎ{ÂĢXc|ÐqfO¢¤ögÌHNPKŖUú´xx[xvĐCûĀìÖT¬¸^}Ìsòd´_KgžLĴÀBon|H@Êx¦BpŰŌ¿fµƌA¾zǈRx¶FkĄźRzŀ~¶[´HnªVƞuĒ­È¨ƎcƽÌm¸ÁÈM¦x͊ëÀxǆBú^´W£dkɾĬpw˂ØɦļĬIŚÊnŔa¸~J°îlɌxĤÊÈðhÌ®gT´øàCÀ^ªerrƘd¢İP|Ė ŸWªĦ^¶´ÂLaT±üWƜǀRÂŶUńĖ[QhlLüAÜ\\qRĄ©"],"encodeOffsets":[[90849,37210]]},"properties":{"cp":[91.132212,29.660361],"name":"西藏","childNum":1}},{"id":"610000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@p¢ȮµûGĦ}Ħðǚ¶òƄjɂz°{ºØkÈęâ¦jªBg\\ċ°s¬]jú EȌǆ¬stRÆdĠİwÜ¸ôW¾ƮłÒ_{Ìû¼jº¹¢GǪÒ¯ĘZ`ºŊecņą~BÂgzpâēòYǠȰÌTÎ¨ÂW|fcă§uF@N¢XLRMº[ğȣſï|¥Jkc`sŉǷY¹W@µ÷Kãï³ÛIcñ·VȋÚÒķø©þ¥yÓğęmWµÎumZyOŅƟĥÓ~sÑL¤µaÅY¦ocyZ{y c]{Ta©`U_Ěē£ωÊƍKùK¶ȱÝƷ§{û»ÅÁȹÍéuĳ|¹cÑdìUYOuFÕÈYvÁCqÓTǢí§·S¹NgV¬ë÷Át°DØ¯C´ŉƒópģ}ċcEËFéGU¥×K§­¶³BČ}C¿åċ`wġB·¤őcƭ²ő[Å^axwQOÿEËßŚĤNĔwƇÄńwĪ­o[_KÓª³ÙnKÇěÿ]ďă_d©·©Ýŏ°Ù®g]±ßå¬÷m\\iaǑkěX{¢|ZKlçhLtŇîŵœè[É@ƉĄEtƇÏ³­ħZ«mJ×¾MtÝĦ£IwÄå\\Õ{OwĬ©LÙ³ÙgBƕŀrÌĢŭO¥lãyC§HÍ£ßEñX¡­°ÙCgpťzb`wIvA|§hoĕ@E±iYd¥OĻ¹S|}F@¾oAO²{tfÜ¢FǂÒW²°BĤh^Wx{@¬­F¸¡ķn£P|ªĴ@^ĠĈæbÔc¶lYi^MicĎ°Â[ävï¶gv@ÀĬ·lJ¸sn|¼u~a]ÆÈtŌºJpþ£KKf~¦UbyäIĺãnÔ¿^­ŵMThĠÜ¤ko¼Ŏìąǜh`[tRd²Ĳ_XPrɲlXiL§à¹H°Ȧqº®QCbAŌJ¸ĕÚ³ĺ§ `d¨YjiZvRĺ±öVKkjGȊÄePĞZmļKÀ[`ösìhïÎoĬdtKÞ{¬èÒÒBÔpĲÇĬJŊ¦±J«Y§@·pHµàåVKepWftsAÅqC·¬ko«pHÆuK@oHĆÛķhxenS³àǍrqƶRbzy¸ËÐl¼EºpĤ¼x¼½~Ğà@ÚüdK^mÌSj"],"encodeOffsets":[[110234,38774]]},"properties":{"cp":[108.948024,34.263161],"name":"陕西","childNum":1}},{"id":"620000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@VuUv"],["@@ũEĠtt~nkh`Q¦ÅÄÜdwAb×ĠąJ¤DüègĺqBqj°lI¡ĨÒ¤úSHbjÎB°aZ¢KJO[|A£Dx}NĂ¬HUnrk kp¼Y kMJn[aGáÚÏ[½rc}aQxOgsPMnUsncZsKúvAtÞġ£®ĀYKdnFw¢JE°Latf`¼h¬we|Æbj}GA·~W`¢MC¤tL©Ĳ°qdfObÞĬ¹ttu`^ZúE`[@Æsîz®¡CƳƜG²R¢RmfwĸgÜą G@pzJM½mhVy¸uÈÔO±¨{LfæU¶ßGĂq\\ª¬²I¥IŉÈīoıÓÑAçÑ|«LÝcspīðÍgtë_õ\\ĉñLYnĝgRǡÁiHLlõUĹ²uQjYi§Z_c¨´ĹĖÙ·ŋIaBD­R¹ȥr¯GºßK¨jWkɱOqWĳ\\a­Q\\sg_ĆǛōëp»£lğÛgSŶN®À]ÓämĹãJaz¥V}Le¤Lýo¹IsŋÅÇ^bz³tmEÁ´a¹cčecÇNĊãÁ\\č¯dNj]jZµkÓdaćå]ğĳ@ ©O{¤ĸm¢E·®«|@Xwg]Aģ±¯XǁÑǳªcwQÚŝñsÕ³ÛV_ý¥\\ů¥©¾÷w©WÕÊĩhÿÖÁRo¸V¬âDb¨hûxÊ×ǌ~Zâg|XÁnßYoº§ZÅŘv[ĭÖʃuďxcVbnUSfB¯³_TzºÎO©çMÑ~M³]µ^püµÄY~y@X~¤Z³[Èōl@®Å¼£QK·Di¡ByÿQ_´D¥hŗy^ĭÁZ]cIzýah¹MĪğPs{ò²Vw¹t³ŜË[Ñ}X\\gsF£sPAgěp×ëfYHāďÖqēŭOÏëdLü\\it^c®RÊº¶¢H°mrY£B¹čIoľu¶uI]vģSQ{UŻÅ}QÂ|Ì°ƅ¤ĩŪU ęĄÌZÒ\\v²PĔ»ƢNHĂyAmƂwVm`]ÈbH`Ì¢²ILvĜH®¤Dlt_¢JJÄämèÔDëþgºƫaʎÌrêYi~ Îİ¤NpÀA¾Ĕ¼bð÷®üszMzÖĖQdȨýv§Tè|ªHÃ¾a¸|Ð ƒwKĢx¦ivr^ÿ ¸l öæfƟĴ·PJv}n\\h¹¶v·À|\\ƁĚN´ĜçèÁz]ġ¤²¨QÒŨTIlªťØ}¼˗ƦvÄùØEÂ«FïËIqōTvāÜŏíÛßÛVj³âwGăÂíNOPìyV³ŉĖýZso§HÑiYw[ß\\X¦¥c]ÔƩÜ·«jÐqvÁ¦m^ċ±R¦΋ƈťĚgÀ»IïĨʗƮ°ƝĻþÍAƉſ±tÍEÕÞāNUÍ¡\\ſčåÒʻĘm ƭÌŹöʥëQ¤µ­ÇcƕªoIýIÉ_mkl³ăƓ¦j¡YzŇi}Msßõīʋ }ÁVm_[n}eı­Uĥ¼ªI{Î§DÓƻėojqYhĹT©oūĶ£]ďxĩǑMĝq`B´ƃ˺Чç~²ņj@¥@đ´ί}ĥtPńÇ¾V¬ufÓÉCtÓ̻¹£G³]ƖƾŎĪŪĘ̖¨ʈĢƂlɘ۪üºňUðǜȢƢż̌ȦǼĤŊɲĖÂ­Kq´ï¦ºĒǲņɾªǀÞĈĂD½ĄĎÌŗĞrôñnN¼â¾ʄľԆ|Ǆ֦ज़ȗǉ̘̭ɺƅêgV̍ʆĠ·ÌĊv|ýĖÕWĊǎÞ´õ¼cÒÒBĢ͢UĜð͒s¨ňƃLĉÕÝ@ɛƯ÷¿Ľ­ĹeȏĳëCȚDŲyê×Ŗyò¯ļcÂßYtÁƤyAã˾J@ǝrý@¤rz¸oP¹ɐÚyáHĀ[JwcVeȴÏ»ÈĖ}ƒŰŐèȭǢόĀƪÈŶë;Ñ̆ȤМľĮEŔĹŊũ~ËUă{ĻƹɁύȩþĽvĽƓÉ@ēĽɲßǐƫʾǗĒpäWÐxnsÀ^ƆwW©¦cÅ¡Ji§vúF¶¨c~c¼īeXǚ\\đ¾JwÀďksãAfÕ¦L}waoZD½Ml«]eÒÅaÉ²áo½FõÛ]ĻÒ¡wYR£¢rvÓ®y®LFLzĈôe]gx}|KK}xklL]c¦£fRtív¦PĤoH{tK"]],"encodeOffsets":[[[108619,36299]],[[108589,36341]]]},"properties":{"cp":[103.823557,36.058039],"name":"甘肃","childNum":2}},{"id":"630000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@InJm"],["@@CÆ½OŃĦsΰ~Ē³¦@@Ņi±è}ШƄ˹A³r_ĞǒNĪĐw¤^ŬĵªpĺSZgrpiƼĘÔ¨C|ÍJ©Ħ»®VĲ~f\\m `UnÂ~ʌĬàöNt~ňjy¢ZiƔ¥Ąk´nl`JÊJþ©pdƖ®È£¶ìRʦźõƮËnʼėæÑƀĎ[¢VÎĂMÖÝÎF²sƊƀÎBļýƞ¯ʘƭðħ¼Jh¿ŦęΌƇ¥²Q]Č¥nuÂÏri¸¬ƪÛ^Ó¦d¥[Wàx\\ZjÒ¨GtpþYŊĕ´zUOëPîMĄÁxH´áiÜUàîÜŐĂÛSuŎrJðÌ¬EFÁú×uÃÎkrĒ{V}İ«O_ÌËĬ©ÓŧSRÑ±§Ģ£^ÂyèçěM³Ƃę{[¸¿uºµ[gt£¸OƤĿéYõ·kĀq]juw¥DĩƍõÇPéÄ½G©ã¤GuȧþRcÕĕNyyût­øï»a½ē¿BMoį£Íj}éZËqbʍƬh¹ìÿÓAçãnIÃ¡I`ks£CG­ěUy×Cy@¶ʡÊBnāzGơMē¼±O÷õJËĚăVĪũƆ£¯{ËL½ÌzżVR|ĠTbuvJvµhĻĖHAëáa­OÇðñęNwœľ·LmI±íĠĩPÉ×®ÿscB³±JKßĊ«`ađ»·QAmOVţéÿ¤¹SQt]]Çx±¯A@ĉĳ¢Óļ©l¶ÅÛrŕspãRk~¦ª]Į­´FRåd­ČsCqđéFn¿ÅƃmÉx{W©ºƝºįkÕƂƑ¸wWūÐ©ÈF£\\tÈ¥ÄRÈýÌJ lGr^×äùyÞ³fjc¨£ÂZ|ǓMĝÏ@ëÜőRĝ÷¡{aïȷPu°ËXÙ{©TmĠ}Y³­ÞIňµç½©C¡į÷¯B»|St»]vųs»}MÓ ÿʪƟǭA¡fs»PY¼c¡»¦cċ­¥£~msĉPSi^o©AecPeǵkgyUi¿h}aHĉ^|á´¡HØûÅ«ĉ®]m¡qĉ¶³ÈyôōLÁstB®wn±ă¥HSòė£Së@×œÊăxÇN©©T±ª£Ĳ¡fb®Þbb_Ą¥xu¥B{łĝ³«`dƐt¤ťiñÍUuºí`£^tƃĲc·ÛLO½sç¥Ts{ă\\_»kÏ±q©čiìĉ|ÍI¥ć¥]ª§D{ŝŖÉR_sÿc³ĪōƿÎ§p[ĉc¯bKmR¥{³Ze^wx¹dƽÅ½ôIg §Mĕ ƹĴ¿ǣÜÍ]Ý]snåA{eƭ`ǻŊĿ\\ĳŬűYÂÿ¬jĖqßb¸L«¸©@ěĀ©ê¶ìÀEH|´bRľÓ¶rÀQþvl®ÕETzÜdb hw¤{LRdcb¯ÙVgƜßzÃôì®^jUèXÎ|UäÌ»rK\\ªN¼pZCüVY¤ɃRi^rPŇTÖ}|br°qňbĚ°ªiƶGQ¾²x¦PmlŜ[Ĥ¡ΞsĦÔÏâ\\ªÚŒU\\f¢N²§x|¤§xĔsZPòʛ²SÐqF`ªVÞŜĶƨVZÌL`¢dŐIqr\\oäõFÎ·¤»Ŷ×h¹]ClÙ\\¦ďÌį¬řtTӺƙgQÇÓHţĒ´ÃbEÄlbʔC|CŮkƮ[ʼ¬ň´KŮÈΰÌĪ¶ƶlðļATUvdTGº̼ÔsÊDÔveOg"]],"encodeOffsets":[[[105308,37219]],[[95370,40081]]]},"properties":{"cp":[101.778916,36.623178],"name":"青海","childNum":2}},{"id":"640000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@KëÀęĞ«Oęȿȕı]ŉ¡åįÕÔ«ǴõƪĚQÐZhv K°öqÀÑS[ÃÖHƖčËnL]ûcÙß@ĝ¾}w»»oģF¹»kÌÏ·{zP§B­¢íyÅt@@á]Yv_ssģ¼ißĻL¾ġsKD£¡N_X¸}B~HaiÅf{«x»ge_bsKF¯¡IxmELcÿZ¤­ĢÝsuBLùtYdmVtNmtOPhRw~bd¾qÐ\\âÙH\\bImlNZ»loqlVmGā§~QCw¤{A\\PKNY¯bFkC¥sks_Ã\\ă«¢ħkJi¯rrAhĹûç£CUĕĊ_ÔBixÅÙĄnªÑaM~ħpOu¥sîeQ¥¤^dkKwlL~{L~hw^ófćKyE­K­zuÔ¡qQ¤xZÑ¢^ļöÜ¾Ep±âbÊÑÆ^fk¬NC¾YpxbK~¥eÖäBlt¿Đx½I[ĒǙWf»Ĭ}d§dµùEuj¨IÆ¢¥dXªƅx¿]mtÏwßRĶX¢͎vÆzƂZò®ǢÌʆCrâºMÞzÆMÒÊÓŊZÄ¾r°Î®Ȉmª²ĈUªĚîøºĮ¦ÌĘk^FłĬhĚiĀĖ¾iİbjÕ"],["@@mfwěwMrŢªv@G"]],"encodeOffsets":[[[109366,40242]],[[108600,36303]]]},"properties":{"cp":[106.278179,38.46637],"name":"宁夏","childNum":2}},{"id":"650000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@QØĔ²X¨~ǘBºjʐßØvKƔX¨vĊOÃ·¢i@~cĝe_«E}QxgɪëÏÃ@sÅyXoŖ{ô«ŸuXêÎf`C¹ÂÿÐGĮÕĞXŪōŸMźÈƺQèĽôe|¿ƸJR¤ĘEjcUóº¯Ĩ_ŘÁMª÷Ð¥OéÈ¿ÖğǤǷÂFÒzÉx[]­Ĥĝœ¦EP}ûƥé¿İƷTėƫœŕƅƱB»Đ±ēO¦E}`cȺrĦáŖuÒª«ĲπdƺÏØZƴwʄ¤ĖGĐǂZĶèH¶}ÚZצʥĪï|ÇĦMŔ»İĝǈì¥Βba­¯¥ǕǚkĆŵĦɑĺƯxūД̵nơʃĽá½M»òmqóŘĝčË¾ăCćāƿÝɽ©ǱŅ¹đ¥³ðLrÁ®ɱĕģŉǻ̋ȥơŻǛȡVï¹Ň۩ûkɗġƁ§ʇė̕ĩũƽō^ƕUv£ƁQïƵkŏ½ΉÃŭÇ³LŇʻ«ƭ\\lŭD{ʓDkaFÃÄa³ŤđÔGRÈƚhSӹŚsİ«ĐË[¥ÚDkº^Øg¼ŵ¸£EÍöůŉT¡c_ËKYƧUśĵÝU_©rETÏʜ±OñtYwē¨{£¨uM³x½şL©Ùá[ÓÐĥ Νtģ¢\\śnkOw¥±T»ƷFɯàĩÞáB¹ÆÑUwŕĽw[mG½Èå~Æ÷QyěCFmĭZīŵVÁƿQƛûXS²b½KÏ½ĉS©ŷXĕ{ĕK·¥Ɨcqq©f¿]ßDõU³h­gËÇïģÉɋwk¯í}I·œbmÉřīJɥĻˁ×xoɹīlc¤³Xù]ǅA¿w͉ì¥wÇN·ÂËnƾƍdÇ§đ®ƝvUm©³G\\}µĿQyŹlăµEwǇQ½yƋBe¶ŋÀůo¥AÉw@{Gpm¿AĳŽKLh³`ñcËtW±»ÕSëüÿďDu\\wwwù³VLŕOMËGh£õP¡erÏd{ġWÁč|yšg^ğyÁzÙs`s|ÉåªÇ}m¢Ń¨`x¥ù^}Ì¥H«YªƅAÐ¹n~ź¯f¤áÀzgÇDIÔ´AňĀÒ¶ûEYospõD[{ù°]uJqU|Soċxţ[õÔĥkŋÞŭZËºóYËüċrw ÞkrťË¿XGÉbřaDü·Ē÷AÃª[ÄäIÂ®BÕĐÞ_¢āĠpÛÄȉĖġDKwbmÄNôfƫVÉviǳHQµâFù­Âœ³¦{YGd¢ĚÜO {Ö¦ÞÍÀP^bƾl[vt×ĈÍEË¨¡Đ~´î¸ùÎhuè`¸HÕŔVºwĠââWò@{ÙNÝ´ə²ȕn{¿¥{l÷eé^eďXj©î\\ªÑòÜìc\\üqÕ[Č¡xoÂċªbØ­ø|¶ȴZdÆÂońéG\\¼C°ÌÆn´nxÊOĨŪƴĸ¢¸òTxÊǪMīĞÖŲÃɎOvʦƢ~FRěò¿ġ~åŊúN¸qĘ[Ĕ¶ÂćnÒPĒÜvúĀÊbÖ{Äî¸~Ŕünp¤ÂH¾ĄYÒ©ÊfºmÔĘcDoĬMŬS¤s²ʘÚžȂVŦ èW°ªB|ĲXŔþÈJĦÆæFĚêYĂªĂ]øªŖNÞüAfɨJ¯ÎrDDĤ`mz\\§~D¬{vJÂ«lµĂb¤pŌŰNĄ¨ĊXW|ų ¿¾ɄĦƐMTòP÷fØĶK¢ȝ˔Sô¹òEð­`Ɩ½ǒÂň×äı§ĤƝ§C~¡hlåǺŦŞkâ~}FøàĲaĞfƠ¥Ŕd®U¸źXv¢aƆúŪtŠųƠjdƺƺÅìnrh\\ĺ¯äɝĦ]èpĄ¦´LƞĬ´ƤǬ˼Ēɸ¤rºǼ²¨zÌPðŀbþ¹ļD¢¹\\ĜÑŚ¶ZƄ³àjĨoâȴLÊȮĐ­ĚăÀêZǚŐ¤qȂ\\L¢ŌİfÆs|zºeªÙæ§΢{Ā´ƐÚ¬¨Ĵà²łhʺKÞºÖTiƢ¾ªì°`öøu®Ê¾ãØ"],"encodeOffsets":[[88824,50096]]},"properties":{"cp":[87.617733,43.792818],"name":"新疆","childNum":1}},{"id":"110000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@ĽOÁûtŷmiÍt_H»Ĩ±d`¹­{bwYr³S]§§o¹qGtm_SŧoaFLgQN_dV@Zom_ć\\ßcÂ±x¯oœRcfe£o§ËgToÛJíĔóu|wP¤XnO¢ÉŦ¯rNÄā¤zâŖÈRpŢZÚ{GrFt¦Òx§ø¹RóäV¤XdżâºWbwŚ¨Ud®bêņ¾jnŎGŃŶnzÚSeîĜZczî¾i]ÍQaúÍÔiþĩȨWĢü|Ėu[qb[swP@ÅğP¿{\\¥A¨ÏÑ¨j¯X\\¯MKpA³[Hīu}}"],"encodeOffsets":[[120023,41045]]},"properties":{"cp":[116.405285,39.904989],"name":"北京","childNum":1}},{"id":"120000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@ŬgX§Ü«E¶FÌ¬O_ïlÁgz±AXeµÄĵ{¶]gitgIj·¥îakS¨ÐƎk}ĕ{gBqGf{¿aU^fIư³õ{YıëNĿk©ïËZŏR§òoY×Ógcĥs¡bġ«@dekąI[nlPqCnp{ō³°`{PNdƗqSÄĻNNâyj]äÒD ĬH°Æ]~¡HO¾X}ÐxgpgWrDGpù^LrzWxZ^¨´T\\|~@IzbĤjeĊªz£®ĔvěLmV¾Ô_ÈNW~zbĬvG²ZmDM~~"],"encodeOffsets":[[120237,41215]]},"properties":{"cp":[117.190182,39.125596],"name":"天津","childNum":1}},{"id":"310000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@ɧư¬EpƸÁxc"],["@@©ª"],["@@MA"],["@@QpİE§ÉC¾"],["@@bŝÕÕEȣÚƥêImɇǦèÜĠÚÃƌÃ͎ó"],["@@ǜûȬɋŭ×^sYɍDŋŽąñCG²«ªč@h_p¯A{oloY¬j@Ĳ`gQÚhr|ǀ^MĲvtbe´R¯Ô¬¨Yô¤r]ìƬį"]],"encodeOffsets":[[[124702,32062]],[[124547,32200]],[[124808,31991]],[[124726,32110]],[[124903,32376]],[[124438,32149]]]},"properties":{"cp":[121.472644,31.231706],"name":"上海","childNum":6}},{"id":"500000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@vjG~nGŘŬĶȂƀƾ¹¸ØÎezĆT¸}êÐqHðqĖä¥^CÆIj²p\\_ æüY|[YxƊæu°xb®Űb@~¢NQt°¶Sæ Ê~rǉĔëĚ¢~uf`faĔJåĊnÖ]jƎćÊ@£¾a®£Ű{ŶĕFègLk{Y|¡ĜWƔtƬJÑxq±ĢN´òKLÈÃ¼D|s`ŋć]Ã`đMûƱ½~Y°ħ`ƏíW½eI½{aOIrÏ¡ĕŇapµÜƅġ^ÖÛbÙŽŏml½SêqDu[RãË»ÿw`»y¸_ĺę}÷`M¯ċfCVµqŉ÷Zgg`d½pDOÎCn^uf²ènh¼WtƏxRGg¦pVFI±G^Ic´ecGĹÞ½sëĬhxW}KÓe­XsbkF¦LØgTkïƵNï¶}Gyw\\oñ¡nmĈzj@Óc£»Wă¹Ój_m»¹·~MvÛaq»­ê\\ÂoVnÓØÍ²«bq¿efE Ĝ^Q~ Évýş¤²ĮpEİ}zcĺL½¿gÅ¡ýE¡ya£³t\\¨\\vú»¼§·Ñr_oÒý¥u_n»_At©ÞÅ±ā§IVeëY}{VPÀFA¨ąB}q@|Ou\\FmQFÝMwå}]|FmÏCawu_p¯sfÙgYDHl`{QEfNysB¦zG¸rHeN\\CvEsÐùÜ_·ÖĉsaQ¯}_UxÃđqNH¬Äd^ÝŰR¬ã°wećJE·vÝ·HgéFXjÉê`|ypxkAwWĐpb¥eOsmzwqChóUQl¥F^lafanòsrEvfQdÁUVfÎvÜ^eftET¬ôA\\¢sJnQTjPØxøK|nBzĞ»LYFDxÓvr[ehľvN¢o¾NiÂxGpâ¬zbfZo~hGi]öF||NbtOMn eA±tPTLjpYQ|SHYĀxinzDJÌg¢và¥Pg_ÇzIIII£®S¬ØsÎ¼£N"],["@@ifjN@s"]],"encodeOffsets":[[[109628,30765]],[[111725,31320]]]},"properties":{"cp":[106.504962,29.533155],"name":"重庆","childNum":2}},{"id":"810000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@AlBk"],["@@mn"],["@@EpFo"],["@@ea¢pl¸Eõ¹hj[]ÔCÎ@lj¡uBX´AI¹[yDU]W`çwZkmcMpÅv}IoJlcafŃK°ä¬XJmÐ đhI®æÔtSHnEÒrÈc"],["@@rMUwAS®e"]],"encodeOffsets":[[[117111,23002]],[[117072,22876]],[[117045,22887]],[[116975,23082]],[[116882,22747]]]},"properties":{"cp":[114.173355,22.320048],"name":"香港","childNum":5}},{"id":"820000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@kÊd°å§s"],"encodeOffsets":[[116279,22639]]},"properties":{"cp":[113.54909,22.198951],"name":"澳门","childNum":1}}],"UTF8Encoding":true});
+}));
\ No newline at end of file
diff --git a/public/static/assets/third_party/echart/echarts.min.js b/public/static/assets/third_party/echart/echarts.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..a472100544be1041790ec37900ae842cbed6e4b1
--- /dev/null
+++ b/public/static/assets/third_party/echart/echarts.min.js
@@ -0,0 +1,45 @@
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).echarts={})}(this,(function(t){"use strict";
+/*! *****************************************************************************
+    Copyright (c) Microsoft Corporation.
+
+    Permission to use, copy, modify, and/or distribute this software for any
+    purpose with or without fee is hereby granted.
+
+    THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+    PERFORMANCE OF THIS SOFTWARE.
+    ***************************************************************************** */var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])})(t,n)};function n(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}var i=function(){this.firefox=!1,this.ie=!1,this.edge=!1,this.newEdge=!1,this.weChat=!1},r=new function(){this.browser=new i,this.node=!1,this.wxa=!1,this.worker=!1,this.svgSupported=!1,this.touchEventsSupported=!1,this.pointerEventsSupported=!1,this.domSupported=!1,this.transformSupported=!1,this.transform3dSupported=!1,this.hasGlobalWindow="undefined"!=typeof window};"object"==typeof wx&&"function"==typeof wx.getSystemInfoSync?(r.wxa=!0,r.touchEventsSupported=!0):"undefined"==typeof document&&"undefined"!=typeof self?r.worker=!0:"undefined"==typeof navigator?(r.node=!0,r.svgSupported=!0):function(t,e){var n=e.browser,i=t.match(/Firefox\/([\d.]+)/),r=t.match(/MSIE\s([\d.]+)/)||t.match(/Trident\/.+?rv:(([\d.]+))/),o=t.match(/Edge?\/([\d.]+)/),a=/micromessenger/i.test(t);i&&(n.firefox=!0,n.version=i[1]);r&&(n.ie=!0,n.version=r[1]);o&&(n.edge=!0,n.version=o[1],n.newEdge=+o[1].split(".")[0]>18);a&&(n.weChat=!0);e.svgSupported="undefined"!=typeof SVGRect,e.touchEventsSupported="ontouchstart"in window&&!n.ie&&!n.edge,e.pointerEventsSupported="onpointerdown"in window&&(n.edge||n.ie&&+n.version>=11),e.domSupported="undefined"!=typeof document;var s=document.documentElement.style;e.transform3dSupported=(n.ie&&"transition"in s||n.edge||"WebKitCSSMatrix"in window&&"m11"in new WebKitCSSMatrix||"MozPerspective"in s)&&!("OTransition"in s),e.transformSupported=e.transform3dSupported||n.ie&&+n.version>=9}(navigator.userAgent,r);var o="sans-serif",a="12px sans-serif";var s,l,u=function(t){var e={};if("undefined"==typeof JSON)return e;for(var n=0;n<t.length;n++){var i=String.fromCharCode(n+32),r=(t.charCodeAt(n)-20)/100;e[i]=r}return e}("007LLmW'55;N0500LLLLLLLLLL00NNNLzWW\\\\WQb\\0FWLg\\bWb\\WQ\\WrWWQ000CL5LLFLL0LL**F*gLLLL5F0LF\\FFF5.5N"),h={createCanvas:function(){return"undefined"!=typeof document&&document.createElement("canvas")},measureText:function(t,e){if(!s){var n=h.createCanvas();s=n&&n.getContext("2d")}if(s)return l!==e&&(l=s.font=e||a),s.measureText(t);t=t||"";var i=/^([0-9]*?)px$/.exec(e=e||a),r=+(i&&i[1])||12,o=0;if(e.indexOf("mono")>=0)o=r*t.length;else for(var c=0;c<t.length;c++){var p=u[t[c]];o+=null==p?r:p*r}return{width:o}},loadImage:function(t,e,n){var i=new Image;return i.onload=e,i.onerror=n,i.src=t,i}};function c(t){for(var e in h)t[e]&&(h[e]=t[e])}var p=V(["Function","RegExp","Date","Error","CanvasGradient","CanvasPattern","Image","Canvas"],(function(t,e){return t["[object "+e+"]"]=!0,t}),{}),d=V(["Int8","Uint8","Uint8Clamped","Int16","Uint16","Int32","Uint32","Float32","Float64"],(function(t,e){return t["[object "+e+"Array]"]=!0,t}),{}),f=Object.prototype.toString,g=Array.prototype,y=g.forEach,v=g.filter,m=g.slice,x=g.map,_=function(){}.constructor,b=_?_.prototype:null,w="__proto__",S=2311;function M(){return S++}function I(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];"undefined"!=typeof console&&console.error.apply(console,t)}function T(t){if(null==t||"object"!=typeof t)return t;var e=t,n=f.call(t);if("[object Array]"===n){if(!pt(t)){e=[];for(var i=0,r=t.length;i<r;i++)e[i]=T(t[i])}}else if(d[n]){if(!pt(t)){var o=t.constructor;if(o.from)e=o.from(t);else{e=new o(t.length);for(i=0,r=t.length;i<r;i++)e[i]=t[i]}}}else if(!p[n]&&!pt(t)&&!J(t))for(var a in e={},t)t.hasOwnProperty(a)&&a!==w&&(e[a]=T(t[a]));return e}function C(t,e,n){if(!q(e)||!q(t))return n?T(e):t;for(var i in e)if(e.hasOwnProperty(i)&&i!==w){var r=t[i],o=e[i];!q(o)||!q(r)||Y(o)||Y(r)||J(o)||J(r)||K(o)||K(r)||pt(o)||pt(r)?!n&&i in t||(t[i]=T(e[i])):C(r,o,n)}return t}function D(t,e){for(var n=t[0],i=1,r=t.length;i<r;i++)n=C(n,t[i],e);return n}function A(t,e){if(Object.assign)Object.assign(t,e);else for(var n in e)e.hasOwnProperty(n)&&n!==w&&(t[n]=e[n]);return t}function k(t,e,n){for(var i=G(e),r=0;r<i.length;r++){var o=i[r];(n?null!=e[o]:null==t[o])&&(t[o]=e[o])}return t}var L=h.createCanvas;function P(t,e){if(t){if(t.indexOf)return t.indexOf(e);for(var n=0,i=t.length;n<i;n++)if(t[n]===e)return n}return-1}function O(t,e){var n=t.prototype;function i(){}for(var r in i.prototype=e.prototype,t.prototype=new i,n)n.hasOwnProperty(r)&&(t.prototype[r]=n[r]);t.prototype.constructor=t,t.superClass=e}function R(t,e,n){if(t="prototype"in t?t.prototype:t,e="prototype"in e?e.prototype:e,Object.getOwnPropertyNames)for(var i=Object.getOwnPropertyNames(e),r=0;r<i.length;r++){var o=i[r];"constructor"!==o&&(n?null!=e[o]:null==t[o])&&(t[o]=e[o])}else k(t,e,n)}function N(t){return!!t&&("string"!=typeof t&&"number"==typeof t.length)}function E(t,e,n){if(t&&e)if(t.forEach&&t.forEach===y)t.forEach(e,n);else if(t.length===+t.length)for(var i=0,r=t.length;i<r;i++)e.call(n,t[i],i,t);else for(var o in t)t.hasOwnProperty(o)&&e.call(n,t[o],o,t)}function z(t,e,n){if(!t)return[];if(!e)return at(t);if(t.map&&t.map===x)return t.map(e,n);for(var i=[],r=0,o=t.length;r<o;r++)i.push(e.call(n,t[r],r,t));return i}function V(t,e,n,i){if(t&&e){for(var r=0,o=t.length;r<o;r++)n=e.call(i,n,t[r],r,t);return n}}function B(t,e,n){if(!t)return[];if(!e)return at(t);if(t.filter&&t.filter===v)return t.filter(e,n);for(var i=[],r=0,o=t.length;r<o;r++)e.call(n,t[r],r,t)&&i.push(t[r]);return i}function F(t,e,n){if(t&&e)for(var i=0,r=t.length;i<r;i++)if(e.call(n,t[i],i,t))return t[i]}function G(t){if(!t)return[];if(Object.keys)return Object.keys(t);var e=[];for(var n in t)t.hasOwnProperty(n)&&e.push(n);return e}var W=b&&U(b.bind)?b.call.bind(b.bind):function(t,e){for(var n=[],i=2;i<arguments.length;i++)n[i-2]=arguments[i];return function(){return t.apply(e,n.concat(m.call(arguments)))}};function H(t){for(var e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n];return function(){return t.apply(this,e.concat(m.call(arguments)))}}function Y(t){return Array.isArray?Array.isArray(t):"[object Array]"===f.call(t)}function U(t){return"function"==typeof t}function X(t){return"string"==typeof t}function Z(t){return"[object String]"===f.call(t)}function j(t){return"number"==typeof t}function q(t){var e=typeof t;return"function"===e||!!t&&"object"===e}function K(t){return!!p[f.call(t)]}function $(t){return!!d[f.call(t)]}function J(t){return"object"==typeof t&&"number"==typeof t.nodeType&&"object"==typeof t.ownerDocument}function Q(t){return null!=t.colorStops}function tt(t){return null!=t.image}function et(t){return"[object RegExp]"===f.call(t)}function nt(t){return t!=t}function it(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];for(var n=0,i=t.length;n<i;n++)if(null!=t[n])return t[n]}function rt(t,e){return null!=t?t:e}function ot(t,e,n){return null!=t?t:null!=e?e:n}function at(t){for(var e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n];return m.apply(t,e)}function st(t){if("number"==typeof t)return[t,t,t,t];var e=t.length;return 2===e?[t[0],t[1],t[0],t[1]]:3===e?[t[0],t[1],t[2],t[1]]:t}function lt(t,e){if(!t)throw new Error(e)}function ut(t){return null==t?null:"function"==typeof t.trim?t.trim():t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}var ht="__ec_primitive__";function ct(t){t[ht]=!0}function pt(t){return t[ht]}var dt=function(){function t(e){this.data={};var n=Y(e);this.data={};var i=this;function r(t,e){n?i.set(t,e):i.set(e,t)}e instanceof t?e.each(r):e&&E(e,r)}return t.prototype.get=function(t){return this.data.hasOwnProperty(t)?this.data[t]:null},t.prototype.set=function(t,e){return this.data[t]=e},t.prototype.each=function(t,e){for(var n in this.data)this.data.hasOwnProperty(n)&&t.call(e,this.data[n],n)},t.prototype.keys=function(){return G(this.data)},t.prototype.removeKey=function(t){delete this.data[t]},t}();function ft(t){return new dt(t)}function gt(t,e){for(var n=new t.constructor(t.length+e.length),i=0;i<t.length;i++)n[i]=t[i];var r=t.length;for(i=0;i<e.length;i++)n[i+r]=e[i];return n}function yt(t,e){var n;if(Object.create)n=Object.create(t);else{var i=function(){};i.prototype=t,n=new i}return e&&A(n,e),n}function vt(t){var e=t.style;e.webkitUserSelect="none",e.userSelect="none",e.webkitTapHighlightColor="rgba(0,0,0,0)",e["-webkit-touch-callout"]="none"}function mt(t,e){return t.hasOwnProperty(e)}function xt(){}var _t=180/Math.PI,bt=Object.freeze({__proto__:null,guid:M,logError:I,clone:T,merge:C,mergeAll:D,extend:A,defaults:k,createCanvas:L,indexOf:P,inherits:O,mixin:R,isArrayLike:N,each:E,map:z,reduce:V,filter:B,find:F,keys:G,bind:W,curry:H,isArray:Y,isFunction:U,isString:X,isStringSafe:Z,isNumber:j,isObject:q,isBuiltInObject:K,isTypedArray:$,isDom:J,isGradientObject:Q,isImagePatternObject:tt,isRegExp:et,eqNaN:nt,retrieve:it,retrieve2:rt,retrieve3:ot,slice:at,normalizeCssArray:st,assert:lt,trim:ut,setAsPrimitive:ct,isPrimitive:pt,HashMap:dt,createHashMap:ft,concatArray:gt,createObject:yt,disableUserSelect:vt,hasOwn:mt,noop:xt,RADIAN_TO_DEGREE:_t});function wt(t,e){return null==t&&(t=0),null==e&&(e=0),[t,e]}function St(t,e){return t[0]=e[0],t[1]=e[1],t}function Mt(t){return[t[0],t[1]]}function It(t,e,n){return t[0]=e,t[1]=n,t}function Tt(t,e,n){return t[0]=e[0]+n[0],t[1]=e[1]+n[1],t}function Ct(t,e,n,i){return t[0]=e[0]+n[0]*i,t[1]=e[1]+n[1]*i,t}function Dt(t,e,n){return t[0]=e[0]-n[0],t[1]=e[1]-n[1],t}function At(t){return Math.sqrt(Lt(t))}var kt=At;function Lt(t){return t[0]*t[0]+t[1]*t[1]}var Pt=Lt;function Ot(t,e,n){return t[0]=e[0]*n,t[1]=e[1]*n,t}function Rt(t,e){var n=At(e);return 0===n?(t[0]=0,t[1]=0):(t[0]=e[0]/n,t[1]=e[1]/n),t}function Nt(t,e){return Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1]))}var Et=Nt;function zt(t,e){return(t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])}var Vt=zt;function Bt(t,e,n,i){return t[0]=e[0]+i*(n[0]-e[0]),t[1]=e[1]+i*(n[1]-e[1]),t}function Ft(t,e,n){var i=e[0],r=e[1];return t[0]=n[0]*i+n[2]*r+n[4],t[1]=n[1]*i+n[3]*r+n[5],t}function Gt(t,e,n){return t[0]=Math.min(e[0],n[0]),t[1]=Math.min(e[1],n[1]),t}function Wt(t,e,n){return t[0]=Math.max(e[0],n[0]),t[1]=Math.max(e[1],n[1]),t}var Ht=Object.freeze({__proto__:null,create:wt,copy:St,clone:Mt,set:It,add:Tt,scaleAndAdd:Ct,sub:Dt,len:At,length:kt,lenSquare:Lt,lengthSquare:Pt,mul:function(t,e,n){return t[0]=e[0]*n[0],t[1]=e[1]*n[1],t},div:function(t,e,n){return t[0]=e[0]/n[0],t[1]=e[1]/n[1],t},dot:function(t,e){return t[0]*e[0]+t[1]*e[1]},scale:Ot,normalize:Rt,distance:Nt,dist:Et,distanceSquare:zt,distSquare:Vt,negate:function(t,e){return t[0]=-e[0],t[1]=-e[1],t},lerp:Bt,applyTransform:Ft,min:Gt,max:Wt}),Yt=function(t,e){this.target=t,this.topTarget=e&&e.topTarget},Ut=function(){function t(t){this.handler=t,t.on("mousedown",this._dragStart,this),t.on("mousemove",this._drag,this),t.on("mouseup",this._dragEnd,this)}return t.prototype._dragStart=function(t){for(var e=t.target;e&&!e.draggable;)e=e.parent||e.__hostTarget;e&&(this._draggingTarget=e,e.dragging=!0,this._x=t.offsetX,this._y=t.offsetY,this.handler.dispatchToElement(new Yt(e,t),"dragstart",t.event))},t.prototype._drag=function(t){var e=this._draggingTarget;if(e){var n=t.offsetX,i=t.offsetY,r=n-this._x,o=i-this._y;this._x=n,this._y=i,e.drift(r,o,t),this.handler.dispatchToElement(new Yt(e,t),"drag",t.event);var a=this.handler.findHover(n,i,e).target,s=this._dropTarget;this._dropTarget=a,e!==a&&(s&&a!==s&&this.handler.dispatchToElement(new Yt(s,t),"dragleave",t.event),a&&a!==s&&this.handler.dispatchToElement(new Yt(a,t),"dragenter",t.event))}},t.prototype._dragEnd=function(t){var e=this._draggingTarget;e&&(e.dragging=!1),this.handler.dispatchToElement(new Yt(e,t),"dragend",t.event),this._dropTarget&&this.handler.dispatchToElement(new Yt(this._dropTarget,t),"drop",t.event),this._draggingTarget=null,this._dropTarget=null},t}(),Xt=function(){function t(t){t&&(this._$eventProcessor=t)}return t.prototype.on=function(t,e,n,i){this._$handlers||(this._$handlers={});var r=this._$handlers;if("function"==typeof e&&(i=n,n=e,e=null),!n||!t)return this;var o=this._$eventProcessor;null!=e&&o&&o.normalizeQuery&&(e=o.normalizeQuery(e)),r[t]||(r[t]=[]);for(var a=0;a<r[t].length;a++)if(r[t][a].h===n)return this;var s={h:n,query:e,ctx:i||this,callAtLast:n.zrEventfulCallAtLast},l=r[t].length-1,u=r[t][l];return u&&u.callAtLast?r[t].splice(l,0,s):r[t].push(s),this},t.prototype.isSilent=function(t){var e=this._$handlers;return!e||!e[t]||!e[t].length},t.prototype.off=function(t,e){var n=this._$handlers;if(!n)return this;if(!t)return this._$handlers={},this;if(e){if(n[t]){for(var i=[],r=0,o=n[t].length;r<o;r++)n[t][r].h!==e&&i.push(n[t][r]);n[t]=i}n[t]&&0===n[t].length&&delete n[t]}else delete n[t];return this},t.prototype.trigger=function(t){for(var e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n];if(!this._$handlers)return this;var i=this._$handlers[t],r=this._$eventProcessor;if(i)for(var o=e.length,a=i.length,s=0;s<a;s++){var l=i[s];if(!r||!r.filter||null==l.query||r.filter(t,l.query))switch(o){case 0:l.h.call(l.ctx);break;case 1:l.h.call(l.ctx,e[0]);break;case 2:l.h.call(l.ctx,e[0],e[1]);break;default:l.h.apply(l.ctx,e)}}return r&&r.afterTrigger&&r.afterTrigger(t),this},t.prototype.triggerWithContext=function(t){for(var e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n];if(!this._$handlers)return this;var i=this._$handlers[t],r=this._$eventProcessor;if(i)for(var o=e.length,a=e[o-1],s=i.length,l=0;l<s;l++){var u=i[l];if(!r||!r.filter||null==u.query||r.filter(t,u.query))switch(o){case 0:u.h.call(a);break;case 1:u.h.call(a,e[0]);break;case 2:u.h.call(a,e[0],e[1]);break;default:u.h.apply(a,e.slice(1,o-1))}}return r&&r.afterTrigger&&r.afterTrigger(t),this},t}(),Zt=Math.log(2);function jt(t,e,n,i,r,o){var a=i+"-"+r,s=t.length;if(o.hasOwnProperty(a))return o[a];if(1===e){var l=Math.round(Math.log((1<<s)-1&~r)/Zt);return t[n][l]}for(var u=i|1<<n,h=n+1;i&1<<h;)h++;for(var c=0,p=0,d=0;p<s;p++){var f=1<<p;f&r||(c+=(d%2?-1:1)*t[n][p]*jt(t,e-1,h,u,r|f,o),d++)}return o[a]=c,c}function qt(t,e){var n=[[t[0],t[1],1,0,0,0,-e[0]*t[0],-e[0]*t[1]],[0,0,0,t[0],t[1],1,-e[1]*t[0],-e[1]*t[1]],[t[2],t[3],1,0,0,0,-e[2]*t[2],-e[2]*t[3]],[0,0,0,t[2],t[3],1,-e[3]*t[2],-e[3]*t[3]],[t[4],t[5],1,0,0,0,-e[4]*t[4],-e[4]*t[5]],[0,0,0,t[4],t[5],1,-e[5]*t[4],-e[5]*t[5]],[t[6],t[7],1,0,0,0,-e[6]*t[6],-e[6]*t[7]],[0,0,0,t[6],t[7],1,-e[7]*t[6],-e[7]*t[7]]],i={},r=jt(n,8,0,0,0,i);if(0!==r){for(var o=[],a=0;a<8;a++)for(var s=0;s<8;s++)null==o[s]&&(o[s]=0),o[s]+=((a+s)%2?-1:1)*jt(n,7,0===a?1:0,1<<a,1<<s,i)/r*e[a];return function(t,e,n){var i=e*o[6]+n*o[7]+1;t[0]=(e*o[0]+n*o[1]+o[2])/i,t[1]=(e*o[3]+n*o[4]+o[5])/i}}}var Kt=[];function $t(t,e,n,i,o){if(e.getBoundingClientRect&&r.domSupported&&!Jt(e)){var a=e.___zrEVENTSAVED||(e.___zrEVENTSAVED={}),s=function(t,e,n){for(var i=n?"invTrans":"trans",r=e[i],o=e.srcCoords,a=[],s=[],l=!0,u=0;u<4;u++){var h=t[u].getBoundingClientRect(),c=2*u,p=h.left,d=h.top;a.push(p,d),l=l&&o&&p===o[c]&&d===o[c+1],s.push(t[u].offsetLeft,t[u].offsetTop)}return l&&r?r:(e.srcCoords=a,e[i]=n?qt(s,a):qt(a,s))}(function(t,e){var n=e.markers;if(n)return n;n=e.markers=[];for(var i=["left","right"],r=["top","bottom"],o=0;o<4;o++){var a=document.createElement("div"),s=o%2,l=(o>>1)%2;a.style.cssText=["position: absolute","visibility: hidden","padding: 0","margin: 0","border-width: 0","user-select: none","width:0","height:0",i[s]+":0",r[l]+":0",i[1-s]+":auto",r[1-l]+":auto",""].join("!important;"),t.appendChild(a),n.push(a)}return n}(e,a),a,o);if(s)return s(t,n,i),!0}return!1}function Jt(t){return"CANVAS"===t.nodeName.toUpperCase()}var Qt=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,te=[],ee=r.browser.firefox&&+r.browser.version.split(".")[0]<39;function ne(t,e,n,i){return n=n||{},i?ie(t,e,n):ee&&null!=e.layerX&&e.layerX!==e.offsetX?(n.zrX=e.layerX,n.zrY=e.layerY):null!=e.offsetX?(n.zrX=e.offsetX,n.zrY=e.offsetY):ie(t,e,n),n}function ie(t,e,n){if(r.domSupported&&t.getBoundingClientRect){var i=e.clientX,o=e.clientY;if(Jt(t)){var a=t.getBoundingClientRect();return n.zrX=i-a.left,void(n.zrY=o-a.top)}if($t(te,t,i,o))return n.zrX=te[0],void(n.zrY=te[1])}n.zrX=n.zrY=0}function re(t){return t||window.event}function oe(t,e,n){if(null!=(e=re(e)).zrX)return e;var i=e.type;if(i&&i.indexOf("touch")>=0){var r="touchend"!==i?e.targetTouches[0]:e.changedTouches[0];r&&ne(t,r,e,n)}else{ne(t,e,e,n);var o=function(t){var e=t.wheelDelta;if(e)return e;var n=t.deltaX,i=t.deltaY;if(null==n||null==i)return e;return 3*(0!==i?Math.abs(i):Math.abs(n))*(i>0?-1:i<0?1:n>0?-1:1)}(e);e.zrDelta=o?o/120:-(e.detail||0)/3}var a=e.button;return null==e.which&&void 0!==a&&Qt.test(e.type)&&(e.which=1&a?1:2&a?3:4&a?2:0),e}function ae(t,e,n,i){t.addEventListener(e,n,i)}var se=function(t){t.preventDefault(),t.stopPropagation(),t.cancelBubble=!0};function le(t){return 2===t.which||3===t.which}var ue=function(){function t(){this._track=[]}return t.prototype.recognize=function(t,e,n){return this._doTrack(t,e,n),this._recognize(t)},t.prototype.clear=function(){return this._track.length=0,this},t.prototype._doTrack=function(t,e,n){var i=t.touches;if(i){for(var r={points:[],touches:[],target:e,event:t},o=0,a=i.length;o<a;o++){var s=i[o],l=ne(n,s,{});r.points.push([l.zrX,l.zrY]),r.touches.push(s)}this._track.push(r)}},t.prototype._recognize=function(t){for(var e in ce)if(ce.hasOwnProperty(e)){var n=ce[e](this._track,t);if(n)return n}},t}();function he(t){var e=t[1][0]-t[0][0],n=t[1][1]-t[0][1];return Math.sqrt(e*e+n*n)}var ce={pinch:function(t,e){var n=t.length;if(n){var i,r=(t[n-1]||{}).points,o=(t[n-2]||{}).points||r;if(o&&o.length>1&&r&&r.length>1){var a=he(r)/he(o);!isFinite(a)&&(a=1),e.pinchScale=a;var s=[((i=r)[0][0]+i[1][0])/2,(i[0][1]+i[1][1])/2];return e.pinchX=s[0],e.pinchY=s[1],{type:"pinch",target:t[0].target,event:e}}}}},pe="silent";function de(){se(this.event)}var fe=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.handler=null,e}return n(e,t),e.prototype.dispose=function(){},e.prototype.setCursor=function(){},e}(Xt),ge=function(t,e){this.x=t,this.y=e},ye=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],ve=function(t){function e(e,n,i,r){var o=t.call(this)||this;return o._hovered=new ge(0,0),o.storage=e,o.painter=n,o.painterRoot=r,i=i||new fe,o.proxy=null,o.setHandlerProxy(i),o._draggingMgr=new Ut(o),o}return n(e,t),e.prototype.setHandlerProxy=function(t){this.proxy&&this.proxy.dispose(),t&&(E(ye,(function(e){t.on&&t.on(e,this[e],this)}),this),t.handler=this),this.proxy=t},e.prototype.mousemove=function(t){var e=t.zrX,n=t.zrY,i=xe(this,e,n),r=this._hovered,o=r.target;o&&!o.__zr&&(o=(r=this.findHover(r.x,r.y)).target);var a=this._hovered=i?new ge(e,n):this.findHover(e,n),s=a.target,l=this.proxy;l.setCursor&&l.setCursor(s?s.cursor:"default"),o&&s!==o&&this.dispatchToElement(r,"mouseout",t),this.dispatchToElement(a,"mousemove",t),s&&s!==o&&this.dispatchToElement(a,"mouseover",t)},e.prototype.mouseout=function(t){var e=t.zrEventControl;"only_globalout"!==e&&this.dispatchToElement(this._hovered,"mouseout",t),"no_globalout"!==e&&this.trigger("globalout",{type:"globalout",event:t})},e.prototype.resize=function(){this._hovered=new ge(0,0)},e.prototype.dispatch=function(t,e){var n=this[t];n&&n.call(this,e)},e.prototype.dispose=function(){this.proxy.dispose(),this.storage=null,this.proxy=null,this.painter=null},e.prototype.setCursorStyle=function(t){var e=this.proxy;e.setCursor&&e.setCursor(t)},e.prototype.dispatchToElement=function(t,e,n){var i=(t=t||{}).target;if(!i||!i.silent){for(var r="on"+e,o=function(t,e,n){return{type:t,event:n,target:e.target,topTarget:e.topTarget,cancelBubble:!1,offsetX:n.zrX,offsetY:n.zrY,gestureEvent:n.gestureEvent,pinchX:n.pinchX,pinchY:n.pinchY,pinchScale:n.pinchScale,wheelDelta:n.zrDelta,zrByTouch:n.zrByTouch,which:n.which,stop:de}}(e,t,n);i&&(i[r]&&(o.cancelBubble=!!i[r].call(i,o)),i.trigger(e,o),i=i.__hostTarget?i.__hostTarget:i.parent,!o.cancelBubble););o.cancelBubble||(this.trigger(e,o),this.painter&&this.painter.eachOtherLayer&&this.painter.eachOtherLayer((function(t){"function"==typeof t[r]&&t[r].call(t,o),t.trigger&&t.trigger(e,o)})))}},e.prototype.findHover=function(t,e,n){for(var i=this.storage.getDisplayList(),r=new ge(t,e),o=i.length-1;o>=0;o--){var a=void 0;if(i[o]!==n&&!i[o].ignore&&(a=me(i[o],t,e))&&(!r.topTarget&&(r.topTarget=i[o]),a!==pe)){r.target=i[o];break}}return r},e.prototype.processGesture=function(t,e){this._gestureMgr||(this._gestureMgr=new ue);var n=this._gestureMgr;"start"===e&&n.clear();var i=n.recognize(t,this.findHover(t.zrX,t.zrY,null).target,this.proxy.dom);if("end"===e&&n.clear(),i){var r=i.type;t.gestureEvent=r;var o=new ge;o.target=i.target,this.dispatchToElement(o,r,i.event)}},e}(Xt);function me(t,e,n){if(t[t.rectHover?"rectContain":"contain"](e,n)){for(var i=t,r=void 0,o=!1;i;){if(i.ignoreClip&&(o=!0),!o){var a=i.getClipPath();if(a&&!a.contain(e,n))return!1;i.silent&&(r=!0)}var s=i.__hostTarget;i=s||i.parent}return!r||pe}return!1}function xe(t,e,n){var i=t.painter;return e<0||e>i.getWidth()||n<0||n>i.getHeight()}E(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],(function(t){ve.prototype[t]=function(e){var n,i,r=e.zrX,o=e.zrY,a=xe(this,r,o);if("mouseup"===t&&a||(i=(n=this.findHover(r,o)).target),"mousedown"===t)this._downEl=i,this._downPoint=[e.zrX,e.zrY],this._upEl=i;else if("mouseup"===t)this._upEl=i;else if("click"===t){if(this._downEl!==this._upEl||!this._downPoint||Et(this._downPoint,[e.zrX,e.zrY])>4)return;this._downPoint=null}this.dispatchToElement(n,t,e)}}));function _e(t,e,n,i){var r=e+1;if(r===n)return 1;if(i(t[r++],t[e])<0){for(;r<n&&i(t[r],t[r-1])<0;)r++;!function(t,e,n){n--;for(;e<n;){var i=t[e];t[e++]=t[n],t[n--]=i}}(t,e,r)}else for(;r<n&&i(t[r],t[r-1])>=0;)r++;return r-e}function be(t,e,n,i,r){for(i===e&&i++;i<n;i++){for(var o,a=t[i],s=e,l=i;s<l;)r(a,t[o=s+l>>>1])<0?l=o:s=o+1;var u=i-s;switch(u){case 3:t[s+3]=t[s+2];case 2:t[s+2]=t[s+1];case 1:t[s+1]=t[s];break;default:for(;u>0;)t[s+u]=t[s+u-1],u--}t[s]=a}}function we(t,e,n,i,r,o){var a=0,s=0,l=1;if(o(t,e[n+r])>0){for(s=i-r;l<s&&o(t,e[n+r+l])>0;)a=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s),a+=r,l+=r}else{for(s=r+1;l<s&&o(t,e[n+r-l])<=0;)a=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s);var u=a;a=r-l,l=r-u}for(a++;a<l;){var h=a+(l-a>>>1);o(t,e[n+h])>0?a=h+1:l=h}return l}function Se(t,e,n,i,r,o){var a=0,s=0,l=1;if(o(t,e[n+r])<0){for(s=r+1;l<s&&o(t,e[n+r-l])<0;)a=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s);var u=a;a=r-l,l=r-u}else{for(s=i-r;l<s&&o(t,e[n+r+l])>=0;)a=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s),a+=r,l+=r}for(a++;a<l;){var h=a+(l-a>>>1);o(t,e[n+h])<0?l=h:a=h+1}return l}function Me(t,e){var n,i,r=7,o=0;t.length;var a=[];function s(s){var l=n[s],u=i[s],h=n[s+1],c=i[s+1];i[s]=u+c,s===o-3&&(n[s+1]=n[s+2],i[s+1]=i[s+2]),o--;var p=Se(t[h],t,l,u,0,e);l+=p,0!==(u-=p)&&0!==(c=we(t[l+u-1],t,h,c,c-1,e))&&(u<=c?function(n,i,o,s){var l=0;for(l=0;l<i;l++)a[l]=t[n+l];var u=0,h=o,c=n;if(t[c++]=t[h++],0==--s){for(l=0;l<i;l++)t[c+l]=a[u+l];return}if(1===i){for(l=0;l<s;l++)t[c+l]=t[h+l];return void(t[c+s]=a[u])}var p,d,f,g=r;for(;;){p=0,d=0,f=!1;do{if(e(t[h],a[u])<0){if(t[c++]=t[h++],d++,p=0,0==--s){f=!0;break}}else if(t[c++]=a[u++],p++,d=0,1==--i){f=!0;break}}while((p|d)<g);if(f)break;do{if(0!==(p=Se(t[h],a,u,i,0,e))){for(l=0;l<p;l++)t[c+l]=a[u+l];if(c+=p,u+=p,(i-=p)<=1){f=!0;break}}if(t[c++]=t[h++],0==--s){f=!0;break}if(0!==(d=we(a[u],t,h,s,0,e))){for(l=0;l<d;l++)t[c+l]=t[h+l];if(c+=d,h+=d,0===(s-=d)){f=!0;break}}if(t[c++]=a[u++],1==--i){f=!0;break}g--}while(p>=7||d>=7);if(f)break;g<0&&(g=0),g+=2}if((r=g)<1&&(r=1),1===i){for(l=0;l<s;l++)t[c+l]=t[h+l];t[c+s]=a[u]}else{if(0===i)throw new Error;for(l=0;l<i;l++)t[c+l]=a[u+l]}}(l,u,h,c):function(n,i,o,s){var l=0;for(l=0;l<s;l++)a[l]=t[o+l];var u=n+i-1,h=s-1,c=o+s-1,p=0,d=0;if(t[c--]=t[u--],0==--i){for(p=c-(s-1),l=0;l<s;l++)t[p+l]=a[l];return}if(1===s){for(d=(c-=i)+1,p=(u-=i)+1,l=i-1;l>=0;l--)t[d+l]=t[p+l];return void(t[c]=a[h])}var f=r;for(;;){var g=0,y=0,v=!1;do{if(e(a[h],t[u])<0){if(t[c--]=t[u--],g++,y=0,0==--i){v=!0;break}}else if(t[c--]=a[h--],y++,g=0,1==--s){v=!0;break}}while((g|y)<f);if(v)break;do{if(0!==(g=i-Se(a[h],t,n,i,i-1,e))){for(i-=g,d=(c-=g)+1,p=(u-=g)+1,l=g-1;l>=0;l--)t[d+l]=t[p+l];if(0===i){v=!0;break}}if(t[c--]=a[h--],1==--s){v=!0;break}if(0!==(y=s-we(t[u],a,0,s,s-1,e))){for(s-=y,d=(c-=y)+1,p=(h-=y)+1,l=0;l<y;l++)t[d+l]=a[p+l];if(s<=1){v=!0;break}}if(t[c--]=t[u--],0==--i){v=!0;break}f--}while(g>=7||y>=7);if(v)break;f<0&&(f=0),f+=2}(r=f)<1&&(r=1);if(1===s){for(d=(c-=i)+1,p=(u-=i)+1,l=i-1;l>=0;l--)t[d+l]=t[p+l];t[c]=a[h]}else{if(0===s)throw new Error;for(p=c-(s-1),l=0;l<s;l++)t[p+l]=a[l]}}(l,u,h,c))}return n=[],i=[],{mergeRuns:function(){for(;o>1;){var t=o-2;if(t>=1&&i[t-1]<=i[t]+i[t+1]||t>=2&&i[t-2]<=i[t]+i[t-1])i[t-1]<i[t+1]&&t--;else if(i[t]>i[t+1])break;s(t)}},forceMergeRuns:function(){for(;o>1;){var t=o-2;t>0&&i[t-1]<i[t+1]&&t--,s(t)}},pushRun:function(t,e){n[o]=t,i[o]=e,o+=1}}}function Ie(t,e,n,i){n||(n=0),i||(i=t.length);var r=i-n;if(!(r<2)){var o=0;if(r<32)be(t,n,i,n+(o=_e(t,n,i,e)),e);else{var a=Me(t,e),s=function(t){for(var e=0;t>=32;)e|=1&t,t>>=1;return t+e}(r);do{if((o=_e(t,n,i,e))<s){var l=r;l>s&&(l=s),be(t,n,n+l,n+o,e),o=l}a.pushRun(n,o),a.mergeRuns(),r-=o,n+=o}while(0!==r);a.forceMergeRuns()}}}var Te=!1;function Ce(){Te||(Te=!0,console.warn("z / z2 / zlevel of displayable is invalid, which may cause unexpected errors"))}function De(t,e){return t.zlevel===e.zlevel?t.z===e.z?t.z2-e.z2:t.z-e.z:t.zlevel-e.zlevel}var Ae=function(){function t(){this._roots=[],this._displayList=[],this._displayListLen=0,this.displayableSortFunc=De}return t.prototype.traverse=function(t,e){for(var n=0;n<this._roots.length;n++)this._roots[n].traverse(t,e)},t.prototype.getDisplayList=function(t,e){e=e||!1;var n=this._displayList;return!t&&n.length||this.updateDisplayList(e),n},t.prototype.updateDisplayList=function(t){this._displayListLen=0;for(var e=this._roots,n=this._displayList,i=0,r=e.length;i<r;i++)this._updateAndAddDisplayable(e[i],null,t);n.length=this._displayListLen,Ie(n,De)},t.prototype._updateAndAddDisplayable=function(t,e,n){if(!t.ignore||n){t.beforeUpdate(),t.update(),t.afterUpdate();var i=t.getClipPath();if(t.ignoreClip)e=null;else if(i){e=e?e.slice():[];for(var r=i,o=t;r;)r.parent=o,r.updateTransform(),e.push(r),o=r,r=r.getClipPath()}if(t.childrenRef){for(var a=t.childrenRef(),s=0;s<a.length;s++){var l=a[s];t.__dirty&&(l.__dirty|=1),this._updateAndAddDisplayable(l,e,n)}t.__dirty=0}else{var u=t;e&&e.length?u.__clipPaths=e:u.__clipPaths&&u.__clipPaths.length>0&&(u.__clipPaths=[]),isNaN(u.z)&&(Ce(),u.z=0),isNaN(u.z2)&&(Ce(),u.z2=0),isNaN(u.zlevel)&&(Ce(),u.zlevel=0),this._displayList[this._displayListLen++]=u}var h=t.getDecalElement&&t.getDecalElement();h&&this._updateAndAddDisplayable(h,e,n);var c=t.getTextGuideLine();c&&this._updateAndAddDisplayable(c,e,n);var p=t.getTextContent();p&&this._updateAndAddDisplayable(p,e,n)}},t.prototype.addRoot=function(t){t.__zr&&t.__zr.storage===this||this._roots.push(t)},t.prototype.delRoot=function(t){if(t instanceof Array)for(var e=0,n=t.length;e<n;e++)this.delRoot(t[e]);else{var i=P(this._roots,t);i>=0&&this._roots.splice(i,1)}},t.prototype.delAllRoots=function(){this._roots=[],this._displayList=[],this._displayListLen=0},t.prototype.getRoots=function(){return this._roots},t.prototype.dispose=function(){this._displayList=null,this._roots=null},t}(),ke=r.hasGlobalWindow&&(window.requestAnimationFrame&&window.requestAnimationFrame.bind(window)||window.msRequestAnimationFrame&&window.msRequestAnimationFrame.bind(window)||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame)||function(t){return setTimeout(t,16)},Le={linear:function(t){return t},quadraticIn:function(t){return t*t},quadraticOut:function(t){return t*(2-t)},quadraticInOut:function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)},cubicIn:function(t){return t*t*t},cubicOut:function(t){return--t*t*t+1},cubicInOut:function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},quarticIn:function(t){return t*t*t*t},quarticOut:function(t){return 1- --t*t*t*t},quarticInOut:function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},quinticIn:function(t){return t*t*t*t*t},quinticOut:function(t){return--t*t*t*t*t+1},quinticInOut:function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},sinusoidalIn:function(t){return 1-Math.cos(t*Math.PI/2)},sinusoidalOut:function(t){return Math.sin(t*Math.PI/2)},sinusoidalInOut:function(t){return.5*(1-Math.cos(Math.PI*t))},exponentialIn:function(t){return 0===t?0:Math.pow(1024,t-1)},exponentialOut:function(t){return 1===t?1:1-Math.pow(2,-10*t)},exponentialInOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(2-Math.pow(2,-10*(t-1)))},circularIn:function(t){return 1-Math.sqrt(1-t*t)},circularOut:function(t){return Math.sqrt(1- --t*t)},circularInOut:function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},elasticIn:function(t){var e,n=.1;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=.4*Math.asin(1/n)/(2*Math.PI),-n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4))},elasticOut:function(t){var e,n=.1;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=.4*Math.asin(1/n)/(2*Math.PI),n*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/.4)+1)},elasticInOut:function(t){var e,n=.1,i=.4;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=i*Math.asin(1/n)/(2*Math.PI),(t*=2)<1?n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*-.5:n*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*.5+1)},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){var e=1.70158;return--t*t*((e+1)*t+e)+1},backInOut:function(t){var e=2.5949095;return(t*=2)<1?t*t*((e+1)*t-e)*.5:.5*((t-=2)*t*((e+1)*t+e)+2)},bounceIn:function(t){return 1-Le.bounceOut(1-t)},bounceOut:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},bounceInOut:function(t){return t<.5?.5*Le.bounceIn(2*t):.5*Le.bounceOut(2*t-1)+.5}},Pe=Math.pow,Oe=Math.sqrt,Re=1e-8,Ne=1e-4,Ee=Oe(3),ze=1/3,Ve=wt(),Be=wt(),Fe=wt();function Ge(t){return t>-1e-8&&t<Re}function We(t){return t>Re||t<-1e-8}function He(t,e,n,i,r){var o=1-r;return o*o*(o*t+3*r*e)+r*r*(r*i+3*o*n)}function Ye(t,e,n,i,r){var o=1-r;return 3*(((e-t)*o+2*(n-e)*r)*o+(i-n)*r*r)}function Ue(t,e,n,i,r,o){var a=i+3*(e-n)-t,s=3*(n-2*e+t),l=3*(e-t),u=t-r,h=s*s-3*a*l,c=s*l-9*a*u,p=l*l-3*s*u,d=0;if(Ge(h)&&Ge(c)){if(Ge(s))o[0]=0;else(M=-l/s)>=0&&M<=1&&(o[d++]=M)}else{var f=c*c-4*h*p;if(Ge(f)){var g=c/h,y=-g/2;(M=-s/a+g)>=0&&M<=1&&(o[d++]=M),y>=0&&y<=1&&(o[d++]=y)}else if(f>0){var v=Oe(f),m=h*s+1.5*a*(-c+v),x=h*s+1.5*a*(-c-v);(M=(-s-((m=m<0?-Pe(-m,ze):Pe(m,ze))+(x=x<0?-Pe(-x,ze):Pe(x,ze))))/(3*a))>=0&&M<=1&&(o[d++]=M)}else{var _=(2*h*s-3*a*c)/(2*Oe(h*h*h)),b=Math.acos(_)/3,w=Oe(h),S=Math.cos(b),M=(-s-2*w*S)/(3*a),I=(y=(-s+w*(S+Ee*Math.sin(b)))/(3*a),(-s+w*(S-Ee*Math.sin(b)))/(3*a));M>=0&&M<=1&&(o[d++]=M),y>=0&&y<=1&&(o[d++]=y),I>=0&&I<=1&&(o[d++]=I)}}return d}function Xe(t,e,n,i,r){var o=6*n-12*e+6*t,a=9*e+3*i-3*t-9*n,s=3*e-3*t,l=0;if(Ge(a)){if(We(o))(h=-s/o)>=0&&h<=1&&(r[l++]=h)}else{var u=o*o-4*a*s;if(Ge(u))r[0]=-o/(2*a);else if(u>0){var h,c=Oe(u),p=(-o-c)/(2*a);(h=(-o+c)/(2*a))>=0&&h<=1&&(r[l++]=h),p>=0&&p<=1&&(r[l++]=p)}}return l}function Ze(t,e,n,i,r,o){var a=(e-t)*r+t,s=(n-e)*r+e,l=(i-n)*r+n,u=(s-a)*r+a,h=(l-s)*r+s,c=(h-u)*r+u;o[0]=t,o[1]=a,o[2]=u,o[3]=c,o[4]=c,o[5]=h,o[6]=l,o[7]=i}function je(t,e,n,i,r,o,a,s,l,u,h){var c,p,d,f,g,y=.005,v=1/0;Ve[0]=l,Ve[1]=u;for(var m=0;m<1;m+=.05)Be[0]=He(t,n,r,a,m),Be[1]=He(e,i,o,s,m),(f=Vt(Ve,Be))<v&&(c=m,v=f);v=1/0;for(var x=0;x<32&&!(y<Ne);x++)p=c-y,d=c+y,Be[0]=He(t,n,r,a,p),Be[1]=He(e,i,o,s,p),f=Vt(Be,Ve),p>=0&&f<v?(c=p,v=f):(Fe[0]=He(t,n,r,a,d),Fe[1]=He(e,i,o,s,d),g=Vt(Fe,Ve),d<=1&&g<v?(c=d,v=g):y*=.5);return h&&(h[0]=He(t,n,r,a,c),h[1]=He(e,i,o,s,c)),Oe(v)}function qe(t,e,n,i,r,o,a,s,l){for(var u=t,h=e,c=0,p=1/l,d=1;d<=l;d++){var f=d*p,g=He(t,n,r,a,f),y=He(e,i,o,s,f),v=g-u,m=y-h;c+=Math.sqrt(v*v+m*m),u=g,h=y}return c}function Ke(t,e,n,i){var r=1-i;return r*(r*t+2*i*e)+i*i*n}function $e(t,e,n,i){return 2*((1-i)*(e-t)+i*(n-e))}function Je(t,e,n){var i=t+n-2*e;return 0===i?.5:(t-e)/i}function Qe(t,e,n,i,r){var o=(e-t)*i+t,a=(n-e)*i+e,s=(a-o)*i+o;r[0]=t,r[1]=o,r[2]=s,r[3]=s,r[4]=a,r[5]=n}function tn(t,e,n,i,r,o,a,s,l){var u,h=.005,c=1/0;Ve[0]=a,Ve[1]=s;for(var p=0;p<1;p+=.05){Be[0]=Ke(t,n,r,p),Be[1]=Ke(e,i,o,p),(y=Vt(Ve,Be))<c&&(u=p,c=y)}c=1/0;for(var d=0;d<32&&!(h<Ne);d++){var f=u-h,g=u+h;Be[0]=Ke(t,n,r,f),Be[1]=Ke(e,i,o,f);var y=Vt(Be,Ve);if(f>=0&&y<c)u=f,c=y;else{Fe[0]=Ke(t,n,r,g),Fe[1]=Ke(e,i,o,g);var v=Vt(Fe,Ve);g<=1&&v<c?(u=g,c=v):h*=.5}}return l&&(l[0]=Ke(t,n,r,u),l[1]=Ke(e,i,o,u)),Oe(c)}function en(t,e,n,i,r,o,a){for(var s=t,l=e,u=0,h=1/a,c=1;c<=a;c++){var p=c*h,d=Ke(t,n,r,p),f=Ke(e,i,o,p),g=d-s,y=f-l;u+=Math.sqrt(g*g+y*y),s=d,l=f}return u}var nn=/cubic-bezier\(([0-9,\.e ]+)\)/;function rn(t){var e=t&&nn.exec(t);if(e){var n=e[1].split(","),i=+ut(n[0]),r=+ut(n[1]),o=+ut(n[2]),a=+ut(n[3]);if(isNaN(i+r+o+a))return;var s=[];return function(t){return t<=0?0:t>=1?1:Ue(0,i,o,1,t,s)&&He(0,r,a,1,s[0])}}}var on=function(){function t(t){this._inited=!1,this._startTime=0,this._pausedTime=0,this._paused=!1,this._life=t.life||1e3,this._delay=t.delay||0,this.loop=t.loop||!1,this.onframe=t.onframe||xt,this.ondestroy=t.ondestroy||xt,this.onrestart=t.onrestart||xt,t.easing&&this.setEasing(t.easing)}return t.prototype.step=function(t,e){if(this._inited||(this._startTime=t+this._delay,this._inited=!0),!this._paused){var n=this._life,i=t-this._startTime-this._pausedTime,r=i/n;r<0&&(r=0),r=Math.min(r,1);var o=this.easingFunc,a=o?o(r):r;if(this.onframe(a),1===r){if(!this.loop)return!0;var s=i%n;this._startTime=t-s,this._pausedTime=0,this.onrestart()}return!1}this._pausedTime+=e},t.prototype.pause=function(){this._paused=!0},t.prototype.resume=function(){this._paused=!1},t.prototype.setEasing=function(t){this.easing=t,this.easingFunc=U(t)?t:Le[t]||rn(t)},t}(),an=function(t){this.value=t},sn=function(){function t(){this._len=0}return t.prototype.insert=function(t){var e=new an(t);return this.insertEntry(e),e},t.prototype.insertEntry=function(t){this.head?(this.tail.next=t,t.prev=this.tail,t.next=null,this.tail=t):this.head=this.tail=t,this._len++},t.prototype.remove=function(t){var e=t.prev,n=t.next;e?e.next=n:this.head=n,n?n.prev=e:this.tail=e,t.next=t.prev=null,this._len--},t.prototype.len=function(){return this._len},t.prototype.clear=function(){this.head=this.tail=null,this._len=0},t}(),ln=function(){function t(t){this._list=new sn,this._maxSize=10,this._map={},this._maxSize=t}return t.prototype.put=function(t,e){var n=this._list,i=this._map,r=null;if(null==i[t]){var o=n.len(),a=this._lastRemovedEntry;if(o>=this._maxSize&&o>0){var s=n.head;n.remove(s),delete i[s.key],r=s.value,this._lastRemovedEntry=s}a?a.value=e:a=new an(e),a.key=t,n.insertEntry(a),i[t]=a}return r},t.prototype.get=function(t){var e=this._map[t],n=this._list;if(null!=e)return e!==n.tail&&(n.remove(e),n.insertEntry(e)),e.value},t.prototype.clear=function(){this._list.clear(),this._map={}},t.prototype.len=function(){return this._list.len()},t}(),un={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};function hn(t){return(t=Math.round(t))<0?0:t>255?255:t}function cn(t){return t<0?0:t>1?1:t}function pn(t){var e=t;return e.length&&"%"===e.charAt(e.length-1)?hn(parseFloat(e)/100*255):hn(parseInt(e,10))}function dn(t){var e=t;return e.length&&"%"===e.charAt(e.length-1)?cn(parseFloat(e)/100):cn(parseFloat(e))}function fn(t,e,n){return n<0?n+=1:n>1&&(n-=1),6*n<1?t+(e-t)*n*6:2*n<1?e:3*n<2?t+(e-t)*(2/3-n)*6:t}function gn(t,e,n){return t+(e-t)*n}function yn(t,e,n,i,r){return t[0]=e,t[1]=n,t[2]=i,t[3]=r,t}function vn(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}var mn=new ln(20),xn=null;function _n(t,e){xn&&vn(xn,e),xn=mn.put(t,xn||e.slice())}function bn(t,e){if(t){e=e||[];var n=mn.get(t);if(n)return vn(e,n);var i=(t+="").replace(/ /g,"").toLowerCase();if(i in un)return vn(e,un[i]),_n(t,e),e;var r,o=i.length;if("#"===i.charAt(0))return 4===o||5===o?(r=parseInt(i.slice(1,4),16))>=0&&r<=4095?(yn(e,(3840&r)>>4|(3840&r)>>8,240&r|(240&r)>>4,15&r|(15&r)<<4,5===o?parseInt(i.slice(4),16)/15:1),_n(t,e),e):void yn(e,0,0,0,1):7===o||9===o?(r=parseInt(i.slice(1,7),16))>=0&&r<=16777215?(yn(e,(16711680&r)>>16,(65280&r)>>8,255&r,9===o?parseInt(i.slice(7),16)/255:1),_n(t,e),e):void yn(e,0,0,0,1):void 0;var a=i.indexOf("("),s=i.indexOf(")");if(-1!==a&&s+1===o){var l=i.substr(0,a),u=i.substr(a+1,s-(a+1)).split(","),h=1;switch(l){case"rgba":if(4!==u.length)return 3===u.length?yn(e,+u[0],+u[1],+u[2],1):yn(e,0,0,0,1);h=dn(u.pop());case"rgb":return 3!==u.length?void yn(e,0,0,0,1):(yn(e,pn(u[0]),pn(u[1]),pn(u[2]),h),_n(t,e),e);case"hsla":return 4!==u.length?void yn(e,0,0,0,1):(u[3]=dn(u[3]),wn(u,e),_n(t,e),e);case"hsl":return 3!==u.length?void yn(e,0,0,0,1):(wn(u,e),_n(t,e),e);default:return}}yn(e,0,0,0,1)}}function wn(t,e){var n=(parseFloat(t[0])%360+360)%360/360,i=dn(t[1]),r=dn(t[2]),o=r<=.5?r*(i+1):r+i-r*i,a=2*r-o;return yn(e=e||[],hn(255*fn(a,o,n+1/3)),hn(255*fn(a,o,n)),hn(255*fn(a,o,n-1/3)),1),4===t.length&&(e[3]=t[3]),e}function Sn(t,e){var n=bn(t);if(n){for(var i=0;i<3;i++)n[i]=e<0?n[i]*(1-e)|0:(255-n[i])*e+n[i]|0,n[i]>255?n[i]=255:n[i]<0&&(n[i]=0);return kn(n,4===n.length?"rgba":"rgb")}}function Mn(t,e,n){if(e&&e.length&&t>=0&&t<=1){n=n||[];var i=t*(e.length-1),r=Math.floor(i),o=Math.ceil(i),a=e[r],s=e[o],l=i-r;return n[0]=hn(gn(a[0],s[0],l)),n[1]=hn(gn(a[1],s[1],l)),n[2]=hn(gn(a[2],s[2],l)),n[3]=cn(gn(a[3],s[3],l)),n}}var In=Mn;function Tn(t,e,n){if(e&&e.length&&t>=0&&t<=1){var i=t*(e.length-1),r=Math.floor(i),o=Math.ceil(i),a=bn(e[r]),s=bn(e[o]),l=i-r,u=kn([hn(gn(a[0],s[0],l)),hn(gn(a[1],s[1],l)),hn(gn(a[2],s[2],l)),cn(gn(a[3],s[3],l))],"rgba");return n?{color:u,leftIndex:r,rightIndex:o,value:i}:u}}var Cn=Tn;function Dn(t,e,n,i){var r=bn(t);if(t)return r=function(t){if(t){var e,n,i=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.min(i,r,o),s=Math.max(i,r,o),l=s-a,u=(s+a)/2;if(0===l)e=0,n=0;else{n=u<.5?l/(s+a):l/(2-s-a);var h=((s-i)/6+l/2)/l,c=((s-r)/6+l/2)/l,p=((s-o)/6+l/2)/l;i===s?e=p-c:r===s?e=1/3+h-p:o===s&&(e=2/3+c-h),e<0&&(e+=1),e>1&&(e-=1)}var d=[360*e,n,u];return null!=t[3]&&d.push(t[3]),d}}(r),null!=e&&(r[0]=function(t){return(t=Math.round(t))<0?0:t>360?360:t}(e)),null!=n&&(r[1]=dn(n)),null!=i&&(r[2]=dn(i)),kn(wn(r),"rgba")}function An(t,e){var n=bn(t);if(n&&null!=e)return n[3]=cn(e),kn(n,"rgba")}function kn(t,e){if(t&&t.length){var n=t[0]+","+t[1]+","+t[2];return"rgba"!==e&&"hsva"!==e&&"hsla"!==e||(n+=","+t[3]),e+"("+n+")"}}function Ln(t,e){var n=bn(t);return n?(.299*n[0]+.587*n[1]+.114*n[2])*n[3]/255+(1-n[3])*e:0}var Pn=Object.freeze({__proto__:null,parse:bn,lift:Sn,toHex:function(t){var e=bn(t);if(e)return((1<<24)+(e[0]<<16)+(e[1]<<8)+ +e[2]).toString(16).slice(1)},fastLerp:Mn,fastMapToColor:In,lerp:Tn,mapToColor:Cn,modifyHSL:Dn,modifyAlpha:An,stringify:kn,lum:Ln,random:function(){return kn([Math.round(255*Math.random()),Math.round(255*Math.random()),Math.round(255*Math.random())],"rgb")}}),On=Math.round;function Rn(t){var e;if(t&&"transparent"!==t){if("string"==typeof t&&t.indexOf("rgba")>-1){var n=bn(t);n&&(t="rgb("+n[0]+","+n[1]+","+n[2]+")",e=n[3])}}else t="none";return{color:t,opacity:null==e?1:e}}var Nn=1e-4;function En(t){return t<Nn&&t>-1e-4}function zn(t){return On(1e3*t)/1e3}function Vn(t){return On(1e4*t)/1e4}var Bn={left:"start",right:"end",center:"middle",middle:"middle"};function Fn(t){return t&&!!t.image}function Gn(t){return"linear"===t.type}function Wn(t){return"radial"===t.type}function Hn(t){return"url(#"+t+")"}function Yn(t){var e=t.getGlobalScale(),n=Math.max(e[0],e[1]);return Math.max(Math.ceil(Math.log(n)/Math.log(10)),1)}function Un(t){var e=t.x||0,n=t.y||0,i=(t.rotation||0)*_t,r=rt(t.scaleX,1),o=rt(t.scaleY,1),a=t.skewX||0,s=t.skewY||0,l=[];return(e||n)&&l.push("translate("+e+"px,"+n+"px)"),i&&l.push("rotate("+i+")"),1===r&&1===o||l.push("scale("+r+","+o+")"),(a||s)&&l.push("skew("+On(a*_t)+"deg, "+On(s*_t)+"deg)"),l.join(" ")}var Xn=r.hasGlobalWindow&&U(window.btoa)?function(t){return window.btoa(unescape(t))}:"undefined"!=typeof Buffer?function(t){return Buffer.from(t).toString("base64")}:function(t){return null},Zn=Array.prototype.slice;function jn(t,e,n){return(e-t)*n+t}function qn(t,e,n,i){for(var r=e.length,o=0;o<r;o++)t[o]=jn(e[o],n[o],i);return t}function Kn(t,e,n,i){for(var r=e.length,o=0;o<r;o++)t[o]=e[o]+n[o]*i;return t}function $n(t,e,n,i){for(var r=e.length,o=r&&e[0].length,a=0;a<r;a++){t[a]||(t[a]=[]);for(var s=0;s<o;s++)t[a][s]=e[a][s]+n[a][s]*i}return t}function Jn(t,e){for(var n=t.length,i=e.length,r=n>i?e:t,o=Math.min(n,i),a=r[o-1]||{color:[0,0,0,0],offset:0},s=o;s<Math.max(n,i);s++)r.push({offset:a.offset,color:a.color.slice()})}function Qn(t,e,n){var i=t,r=e;if(i.push&&r.push){var o=i.length,a=r.length;if(o!==a)if(o>a)i.length=a;else for(var s=o;s<a;s++)i.push(1===n?r[s]:Zn.call(r[s]));var l=i[0]&&i[0].length;for(s=0;s<i.length;s++)if(1===n)isNaN(i[s])&&(i[s]=r[s]);else for(var u=0;u<l;u++)isNaN(i[s][u])&&(i[s][u]=r[s][u])}}function ti(t){if(N(t)){var e=t.length;if(N(t[0])){for(var n=[],i=0;i<e;i++)n.push(Zn.call(t[i]));return n}return Zn.call(t)}return t}function ei(t){return t[0]=Math.floor(t[0])||0,t[1]=Math.floor(t[1])||0,t[2]=Math.floor(t[2])||0,t[3]=null==t[3]?1:t[3],"rgba("+t.join(",")+")"}function ni(t){return 4===t||5===t}function ii(t){return 1===t||2===t}var ri=[0,0,0,0],oi=function(){function t(t){this.keyframes=[],this.discrete=!1,this._invalid=!1,this._needsSort=!1,this._lastFr=0,this._lastFrP=0,this.propName=t}return t.prototype.isFinished=function(){return this._finished},t.prototype.setFinished=function(){this._finished=!0,this._additiveTrack&&this._additiveTrack.setFinished()},t.prototype.needsAnimate=function(){return this.keyframes.length>=1},t.prototype.getAdditiveTrack=function(){return this._additiveTrack},t.prototype.addKeyframe=function(t,e,n){this._needsSort=!0;var i=this.keyframes,r=i.length,o=!1,a=6,s=e;if(N(e)){var l=function(t){return N(t&&t[0])?2:1}(e);a=l,(1===l&&!j(e[0])||2===l&&!j(e[0][0]))&&(o=!0)}else if(j(e)&&!nt(e))a=0;else if(X(e))if(isNaN(+e)){var u=bn(e);u&&(s=u,a=3)}else a=0;else if(Q(e)){var h=A({},s);h.colorStops=z(e.colorStops,(function(t){return{offset:t.offset,color:bn(t.color)}})),Gn(e)?a=4:Wn(e)&&(a=5),s=h}0===r?this.valType=a:a===this.valType&&6!==a||(o=!0),this.discrete=this.discrete||o;var c={time:t,value:s,rawValue:e,percent:0};return n&&(c.easing=n,c.easingFunc=U(n)?n:Le[n]||rn(n)),i.push(c),c},t.prototype.prepare=function(t,e){var n=this.keyframes;this._needsSort&&n.sort((function(t,e){return t.time-e.time}));for(var i=this.valType,r=n.length,o=n[r-1],a=this.discrete,s=ii(i),l=ni(i),u=0;u<r;u++){var h=n[u],c=h.value,p=o.value;h.percent=h.time/t,a||(s&&u!==r-1?Qn(c,p,i):l&&Jn(c.colorStops,p.colorStops))}if(!a&&5!==i&&e&&this.needsAnimate()&&e.needsAnimate()&&i===e.valType&&!e._finished){this._additiveTrack=e;var d=n[0].value;for(u=0;u<r;u++)0===i?n[u].additiveValue=n[u].value-d:3===i?n[u].additiveValue=Kn([],n[u].value,d,-1):ii(i)&&(n[u].additiveValue=1===i?Kn([],n[u].value,d,-1):$n([],n[u].value,d,-1))}},t.prototype.step=function(t,e){if(!this._finished){this._additiveTrack&&this._additiveTrack._finished&&(this._additiveTrack=null);var n,i,r,o=null!=this._additiveTrack,a=o?"additiveValue":"value",s=this.valType,l=this.keyframes,u=l.length,h=this.propName,c=3===s,p=this._lastFr,d=Math.min;if(1===u)i=r=l[0];else{if(e<0)n=0;else if(e<this._lastFrP){for(n=d(p+1,u-1);n>=0&&!(l[n].percent<=e);n--);n=d(n,u-2)}else{for(n=p;n<u&&!(l[n].percent>e);n++);n=d(n-1,u-2)}r=l[n+1],i=l[n]}if(i&&r){this._lastFr=n,this._lastFrP=e;var f=r.percent-i.percent,g=0===f?1:d((e-i.percent)/f,1);r.easingFunc&&(g=r.easingFunc(g));var y=o?this._additiveValue:c?ri:t[h];if(!ii(s)&&!c||y||(y=this._additiveValue=[]),this.discrete)t[h]=g<1?i.rawValue:r.rawValue;else if(ii(s))1===s?qn(y,i[a],r[a],g):function(t,e,n,i){for(var r=e.length,o=r&&e[0].length,a=0;a<r;a++){t[a]||(t[a]=[]);for(var s=0;s<o;s++)t[a][s]=jn(e[a][s],n[a][s],i)}}(y,i[a],r[a],g);else if(ni(s)){var v=i[a],m=r[a],x=4===s;t[h]={type:x?"linear":"radial",x:jn(v.x,m.x,g),y:jn(v.y,m.y,g),colorStops:z(v.colorStops,(function(t,e){var n=m.colorStops[e];return{offset:jn(t.offset,n.offset,g),color:ei(qn([],t.color,n.color,g))}})),global:m.global},x?(t[h].x2=jn(v.x2,m.x2,g),t[h].y2=jn(v.y2,m.y2,g)):t[h].r=jn(v.r,m.r,g)}else if(c)qn(y,i[a],r[a],g),o||(t[h]=ei(y));else{var _=jn(i[a],r[a],g);o?this._additiveValue=_:t[h]=_}o&&this._addToTarget(t)}}},t.prototype._addToTarget=function(t){var e=this.valType,n=this.propName,i=this._additiveValue;0===e?t[n]=t[n]+i:3===e?(bn(t[n],ri),Kn(ri,ri,i,1),t[n]=ei(ri)):1===e?Kn(t[n],t[n],i,1):2===e&&$n(t[n],t[n],i,1)},t}(),ai=function(){function t(t,e,n,i){this._tracks={},this._trackKeys=[],this._maxTime=0,this._started=0,this._clip=null,this._target=t,this._loop=e,e&&i?I("Can' use additive animation on looped animation."):(this._additiveAnimators=i,this._allowDiscrete=n)}return t.prototype.getMaxTime=function(){return this._maxTime},t.prototype.getDelay=function(){return this._delay},t.prototype.getLoop=function(){return this._loop},t.prototype.getTarget=function(){return this._target},t.prototype.changeTarget=function(t){this._target=t},t.prototype.when=function(t,e,n){return this.whenWithKeys(t,e,G(e),n)},t.prototype.whenWithKeys=function(t,e,n,i){for(var r=this._tracks,o=0;o<n.length;o++){var a=n[o],s=r[a];if(!s){s=r[a]=new oi(a);var l=void 0,u=this._getAdditiveTrack(a);if(u){var h=u.keyframes,c=h[h.length-1];l=c&&c.value,3===u.valType&&l&&(l=ei(l))}else l=this._target[a];if(null==l)continue;t>0&&s.addKeyframe(0,ti(l),i),this._trackKeys.push(a)}s.addKeyframe(t,ti(e[a]),i)}return this._maxTime=Math.max(this._maxTime,t),this},t.prototype.pause=function(){this._clip.pause(),this._paused=!0},t.prototype.resume=function(){this._clip.resume(),this._paused=!1},t.prototype.isPaused=function(){return!!this._paused},t.prototype.duration=function(t){return this._maxTime=t,this._force=!0,this},t.prototype._doneCallback=function(){this._setTracksFinished(),this._clip=null;var t=this._doneCbs;if(t)for(var e=t.length,n=0;n<e;n++)t[n].call(this)},t.prototype._abortedCallback=function(){this._setTracksFinished();var t=this.animation,e=this._abortedCbs;if(t&&t.removeClip(this._clip),this._clip=null,e)for(var n=0;n<e.length;n++)e[n].call(this)},t.prototype._setTracksFinished=function(){for(var t=this._tracks,e=this._trackKeys,n=0;n<e.length;n++)t[e[n]].setFinished()},t.prototype._getAdditiveTrack=function(t){var e,n=this._additiveAnimators;if(n)for(var i=0;i<n.length;i++){var r=n[i].getTrack(t);r&&(e=r)}return e},t.prototype.start=function(t){if(!(this._started>0)){this._started=1;for(var e=this,n=[],i=this._maxTime||0,r=0;r<this._trackKeys.length;r++){var o=this._trackKeys[r],a=this._tracks[o],s=this._getAdditiveTrack(o),l=a.keyframes,u=l.length;if(a.prepare(i,s),a.needsAnimate())if(!this._allowDiscrete&&a.discrete){var h=l[u-1];h&&(e._target[a.propName]=h.rawValue),a.setFinished()}else n.push(a)}if(n.length||this._force){var c=new on({life:i,loop:this._loop,delay:this._delay||0,onframe:function(t){e._started=2;var i=e._additiveAnimators;if(i){for(var r=!1,o=0;o<i.length;o++)if(i[o]._clip){r=!0;break}r||(e._additiveAnimators=null)}for(o=0;o<n.length;o++)n[o].step(e._target,t);var a=e._onframeCbs;if(a)for(o=0;o<a.length;o++)a[o](e._target,t)},ondestroy:function(){e._doneCallback()}});this._clip=c,this.animation&&this.animation.addClip(c),t&&c.setEasing(t)}else this._doneCallback();return this}},t.prototype.stop=function(t){if(this._clip){var e=this._clip;t&&e.onframe(1),this._abortedCallback()}},t.prototype.delay=function(t){return this._delay=t,this},t.prototype.during=function(t){return t&&(this._onframeCbs||(this._onframeCbs=[]),this._onframeCbs.push(t)),this},t.prototype.done=function(t){return t&&(this._doneCbs||(this._doneCbs=[]),this._doneCbs.push(t)),this},t.prototype.aborted=function(t){return t&&(this._abortedCbs||(this._abortedCbs=[]),this._abortedCbs.push(t)),this},t.prototype.getClip=function(){return this._clip},t.prototype.getTrack=function(t){return this._tracks[t]},t.prototype.getTracks=function(){var t=this;return z(this._trackKeys,(function(e){return t._tracks[e]}))},t.prototype.stopTracks=function(t,e){if(!t.length||!this._clip)return!0;for(var n=this._tracks,i=this._trackKeys,r=0;r<t.length;r++){var o=n[t[r]];o&&!o.isFinished()&&(e?o.step(this._target,1):1===this._started&&o.step(this._target,0),o.setFinished())}var a=!0;for(r=0;r<i.length;r++)if(!n[i[r]].isFinished()){a=!1;break}return a&&this._abortedCallback(),a},t.prototype.saveTo=function(t,e,n){if(t){e=e||this._trackKeys;for(var i=0;i<e.length;i++){var r=e[i],o=this._tracks[r];if(o&&!o.isFinished()){var a=o.keyframes,s=a[n?0:a.length-1];s&&(t[r]=ti(s.rawValue))}}}},t.prototype.__changeFinalValue=function(t,e){e=e||G(t);for(var n=0;n<e.length;n++){var i=e[n],r=this._tracks[i];if(r){var o=r.keyframes;if(o.length>1){var a=o.pop();r.addKeyframe(a.time,t[i]),r.prepare(this._maxTime,r.getAdditiveTrack())}}}},t}();function si(){return(new Date).getTime()}var li,ui,hi=function(t){function e(e){var n=t.call(this)||this;return n._running=!1,n._time=0,n._pausedTime=0,n._pauseStart=0,n._paused=!1,e=e||{},n.stage=e.stage||{},n}return n(e,t),e.prototype.addClip=function(t){t.animation&&this.removeClip(t),this._head?(this._tail.next=t,t.prev=this._tail,t.next=null,this._tail=t):this._head=this._tail=t,t.animation=this},e.prototype.addAnimator=function(t){t.animation=this;var e=t.getClip();e&&this.addClip(e)},e.prototype.removeClip=function(t){if(t.animation){var e=t.prev,n=t.next;e?e.next=n:this._head=n,n?n.prev=e:this._tail=e,t.next=t.prev=t.animation=null}},e.prototype.removeAnimator=function(t){var e=t.getClip();e&&this.removeClip(e),t.animation=null},e.prototype.update=function(t){for(var e=si()-this._pausedTime,n=e-this._time,i=this._head;i;){var r=i.next;i.step(e,n)?(i.ondestroy(),this.removeClip(i),i=r):i=r}this._time=e,t||(this.trigger("frame",n),this.stage.update&&this.stage.update())},e.prototype._startLoop=function(){var t=this;this._running=!0,ke((function e(){t._running&&(ke(e),!t._paused&&t.update())}))},e.prototype.start=function(){this._running||(this._time=si(),this._pausedTime=0,this._startLoop())},e.prototype.stop=function(){this._running=!1},e.prototype.pause=function(){this._paused||(this._pauseStart=si(),this._paused=!0)},e.prototype.resume=function(){this._paused&&(this._pausedTime+=si()-this._pauseStart,this._paused=!1)},e.prototype.clear=function(){for(var t=this._head;t;){var e=t.next;t.prev=t.next=t.animation=null,t=e}this._head=this._tail=null},e.prototype.isFinished=function(){return null==this._head},e.prototype.animate=function(t,e){e=e||{},this.start();var n=new ai(t,e.loop);return this.addAnimator(n),n},e}(Xt),ci=r.domSupported,pi=(ui={pointerdown:1,pointerup:1,pointermove:1,pointerout:1},{mouse:li=["click","dblclick","mousewheel","wheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],touch:["touchstart","touchend","touchmove"],pointer:z(li,(function(t){var e=t.replace("mouse","pointer");return ui.hasOwnProperty(e)?e:t}))}),di=["mousemove","mouseup"],fi=["pointermove","pointerup"],gi=!1;function yi(t){var e=t.pointerType;return"pen"===e||"touch"===e}function vi(t){t&&(t.zrByTouch=!0)}function mi(t,e){for(var n=e,i=!1;n&&9!==n.nodeType&&!(i=n.domBelongToZr||n!==e&&n===t.painterRoot);)n=n.parentNode;return i}var xi=function(t,e){this.stopPropagation=xt,this.stopImmediatePropagation=xt,this.preventDefault=xt,this.type=e.type,this.target=this.currentTarget=t.dom,this.pointerType=e.pointerType,this.clientX=e.clientX,this.clientY=e.clientY},_i={mousedown:function(t){t=oe(this.dom,t),this.__mayPointerCapture=[t.zrX,t.zrY],this.trigger("mousedown",t)},mousemove:function(t){t=oe(this.dom,t);var e=this.__mayPointerCapture;!e||t.zrX===e[0]&&t.zrY===e[1]||this.__togglePointerCapture(!0),this.trigger("mousemove",t)},mouseup:function(t){t=oe(this.dom,t),this.__togglePointerCapture(!1),this.trigger("mouseup",t)},mouseout:function(t){mi(this,(t=oe(this.dom,t)).toElement||t.relatedTarget)||(this.__pointerCapturing&&(t.zrEventControl="no_globalout"),this.trigger("mouseout",t))},wheel:function(t){gi=!0,t=oe(this.dom,t),this.trigger("mousewheel",t)},mousewheel:function(t){gi||(t=oe(this.dom,t),this.trigger("mousewheel",t))},touchstart:function(t){vi(t=oe(this.dom,t)),this.__lastTouchMoment=new Date,this.handler.processGesture(t,"start"),_i.mousemove.call(this,t),_i.mousedown.call(this,t)},touchmove:function(t){vi(t=oe(this.dom,t)),this.handler.processGesture(t,"change"),_i.mousemove.call(this,t)},touchend:function(t){vi(t=oe(this.dom,t)),this.handler.processGesture(t,"end"),_i.mouseup.call(this,t),+new Date-+this.__lastTouchMoment<300&&_i.click.call(this,t)},pointerdown:function(t){_i.mousedown.call(this,t)},pointermove:function(t){yi(t)||_i.mousemove.call(this,t)},pointerup:function(t){_i.mouseup.call(this,t)},pointerout:function(t){yi(t)||_i.mouseout.call(this,t)}};E(["click","dblclick","contextmenu"],(function(t){_i[t]=function(e){e=oe(this.dom,e),this.trigger(t,e)}}));var bi={pointermove:function(t){yi(t)||bi.mousemove.call(this,t)},pointerup:function(t){bi.mouseup.call(this,t)},mousemove:function(t){this.trigger("mousemove",t)},mouseup:function(t){var e=this.__pointerCapturing;this.__togglePointerCapture(!1),this.trigger("mouseup",t),e&&(t.zrEventControl="only_globalout",this.trigger("mouseout",t))}};function wi(t,e){var n=e.domHandlers;r.pointerEventsSupported?E(pi.pointer,(function(i){Mi(e,i,(function(e){n[i].call(t,e)}))})):(r.touchEventsSupported&&E(pi.touch,(function(i){Mi(e,i,(function(r){n[i].call(t,r),function(t){t.touching=!0,null!=t.touchTimer&&(clearTimeout(t.touchTimer),t.touchTimer=null),t.touchTimer=setTimeout((function(){t.touching=!1,t.touchTimer=null}),700)}(e)}))})),E(pi.mouse,(function(i){Mi(e,i,(function(r){r=re(r),e.touching||n[i].call(t,r)}))})))}function Si(t,e){function n(n){Mi(e,n,(function(i){i=re(i),mi(t,i.target)||(i=function(t,e){return oe(t.dom,new xi(t,e),!0)}(t,i),e.domHandlers[n].call(t,i))}),{capture:!0})}r.pointerEventsSupported?E(fi,n):r.touchEventsSupported||E(di,n)}function Mi(t,e,n,i){t.mounted[e]=n,t.listenerOpts[e]=i,ae(t.domTarget,e,n,i)}function Ii(t){var e,n,i,r,o=t.mounted;for(var a in o)o.hasOwnProperty(a)&&(e=t.domTarget,n=a,i=o[a],r=t.listenerOpts[a],e.removeEventListener(n,i,r));t.mounted={}}var Ti=function(t,e){this.mounted={},this.listenerOpts={},this.touching=!1,this.domTarget=t,this.domHandlers=e},Ci=function(t){function e(e,n){var i=t.call(this)||this;return i.__pointerCapturing=!1,i.dom=e,i.painterRoot=n,i._localHandlerScope=new Ti(e,_i),ci&&(i._globalHandlerScope=new Ti(document,bi)),wi(i,i._localHandlerScope),i}return n(e,t),e.prototype.dispose=function(){Ii(this._localHandlerScope),ci&&Ii(this._globalHandlerScope)},e.prototype.setCursor=function(t){this.dom.style&&(this.dom.style.cursor=t||"default")},e.prototype.__togglePointerCapture=function(t){if(this.__mayPointerCapture=null,ci&&+this.__pointerCapturing^+t){this.__pointerCapturing=t;var e=this._globalHandlerScope;t?Si(this,e):Ii(e)}},e}(Xt),Di=1;r.hasGlobalWindow&&(Di=Math.max(window.devicePixelRatio||window.screen&&window.screen.deviceXDPI/window.screen.logicalXDPI||1,1));var Ai=Di,ki="#333",Li="#ccc";function Pi(){return[1,0,0,1,0,0]}function Oi(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t}function Ri(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t}function Ni(t,e,n){var i=e[0]*n[0]+e[2]*n[1],r=e[1]*n[0]+e[3]*n[1],o=e[0]*n[2]+e[2]*n[3],a=e[1]*n[2]+e[3]*n[3],s=e[0]*n[4]+e[2]*n[5]+e[4],l=e[1]*n[4]+e[3]*n[5]+e[5];return t[0]=i,t[1]=r,t[2]=o,t[3]=a,t[4]=s,t[5]=l,t}function Ei(t,e,n){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4]+n[0],t[5]=e[5]+n[1],t}function zi(t,e,n){var i=e[0],r=e[2],o=e[4],a=e[1],s=e[3],l=e[5],u=Math.sin(n),h=Math.cos(n);return t[0]=i*h+a*u,t[1]=-i*u+a*h,t[2]=r*h+s*u,t[3]=-r*u+h*s,t[4]=h*o+u*l,t[5]=h*l-u*o,t}function Vi(t,e,n){var i=n[0],r=n[1];return t[0]=e[0]*i,t[1]=e[1]*r,t[2]=e[2]*i,t[3]=e[3]*r,t[4]=e[4]*i,t[5]=e[5]*r,t}function Bi(t,e){var n=e[0],i=e[2],r=e[4],o=e[1],a=e[3],s=e[5],l=n*a-o*i;return l?(l=1/l,t[0]=a*l,t[1]=-o*l,t[2]=-i*l,t[3]=n*l,t[4]=(i*s-a*r)*l,t[5]=(o*r-n*s)*l,t):null}function Fi(t){var e=[1,0,0,1,0,0];return Ri(e,t),e}var Gi=Object.freeze({__proto__:null,create:Pi,identity:Oi,copy:Ri,mul:Ni,translate:Ei,rotate:zi,scale:Vi,invert:Bi,clone:Fi}),Wi=Oi,Hi=5e-5;function Yi(t){return t>Hi||t<-5e-5}var Ui=[],Xi=[],Zi=[1,0,0,1,0,0],ji=Math.abs,qi=function(){function t(){}return t.prototype.getLocalTransform=function(e){return t.getLocalTransform(this,e)},t.prototype.setPosition=function(t){this.x=t[0],this.y=t[1]},t.prototype.setScale=function(t){this.scaleX=t[0],this.scaleY=t[1]},t.prototype.setSkew=function(t){this.skewX=t[0],this.skewY=t[1]},t.prototype.setOrigin=function(t){this.originX=t[0],this.originY=t[1]},t.prototype.needLocalTransform=function(){return Yi(this.rotation)||Yi(this.x)||Yi(this.y)||Yi(this.scaleX-1)||Yi(this.scaleY-1)||Yi(this.skewX)||Yi(this.skewY)},t.prototype.updateTransform=function(){var t=this.parent&&this.parent.transform,e=this.needLocalTransform(),n=this.transform;e||t?(n=n||[1,0,0,1,0,0],e?this.getLocalTransform(n):Wi(n),t&&(e?Ni(n,t,n):Ri(n,t)),this.transform=n,this._resolveGlobalScaleRatio(n)):n&&Wi(n)},t.prototype._resolveGlobalScaleRatio=function(t){var e=this.globalScaleRatio;if(null!=e&&1!==e){this.getGlobalScale(Ui);var n=Ui[0]<0?-1:1,i=Ui[1]<0?-1:1,r=((Ui[0]-n)*e+n)/Ui[0]||0,o=((Ui[1]-i)*e+i)/Ui[1]||0;t[0]*=r,t[1]*=r,t[2]*=o,t[3]*=o}this.invTransform=this.invTransform||[1,0,0,1,0,0],Bi(this.invTransform,t)},t.prototype.getComputedTransform=function(){for(var t=this,e=[];t;)e.push(t),t=t.parent;for(;t=e.pop();)t.updateTransform();return this.transform},t.prototype.setLocalTransform=function(t){if(t){var e=t[0]*t[0]+t[1]*t[1],n=t[2]*t[2]+t[3]*t[3],i=Math.atan2(t[1],t[0]),r=Math.PI/2+i-Math.atan2(t[3],t[2]);n=Math.sqrt(n)*Math.cos(r),e=Math.sqrt(e),this.skewX=r,this.skewY=0,this.rotation=-i,this.x=+t[4],this.y=+t[5],this.scaleX=e,this.scaleY=n,this.originX=0,this.originY=0}},t.prototype.decomposeTransform=function(){if(this.transform){var t=this.parent,e=this.transform;t&&t.transform&&(Ni(Xi,t.invTransform,e),e=Xi);var n=this.originX,i=this.originY;(n||i)&&(Zi[4]=n,Zi[5]=i,Ni(Xi,e,Zi),Xi[4]-=n,Xi[5]-=i,e=Xi),this.setLocalTransform(e)}},t.prototype.getGlobalScale=function(t){var e=this.transform;return t=t||[],e?(t[0]=Math.sqrt(e[0]*e[0]+e[1]*e[1]),t[1]=Math.sqrt(e[2]*e[2]+e[3]*e[3]),e[0]<0&&(t[0]=-t[0]),e[3]<0&&(t[1]=-t[1]),t):(t[0]=1,t[1]=1,t)},t.prototype.transformCoordToLocal=function(t,e){var n=[t,e],i=this.invTransform;return i&&Ft(n,n,i),n},t.prototype.transformCoordToGlobal=function(t,e){var n=[t,e],i=this.transform;return i&&Ft(n,n,i),n},t.prototype.getLineScale=function(){var t=this.transform;return t&&ji(t[0]-1)>1e-10&&ji(t[3]-1)>1e-10?Math.sqrt(ji(t[0]*t[3]-t[2]*t[1])):1},t.prototype.copyTransform=function(t){$i(this,t)},t.getLocalTransform=function(t,e){e=e||[];var n=t.originX||0,i=t.originY||0,r=t.scaleX,o=t.scaleY,a=t.anchorX,s=t.anchorY,l=t.rotation||0,u=t.x,h=t.y,c=t.skewX?Math.tan(t.skewX):0,p=t.skewY?Math.tan(-t.skewY):0;if(n||i||a||s){var d=n+a,f=i+s;e[4]=-d*r-c*f*o,e[5]=-f*o-p*d*r}else e[4]=e[5]=0;return e[0]=r,e[3]=o,e[1]=p*r,e[2]=c*o,l&&zi(e,e,l),e[4]+=n+u,e[5]+=i+h,e},t.initDefaultProps=function(){var e=t.prototype;e.scaleX=e.scaleY=e.globalScaleRatio=1,e.x=e.y=e.originX=e.originY=e.skewX=e.skewY=e.rotation=e.anchorX=e.anchorY=0}(),t}(),Ki=["x","y","originX","originY","anchorX","anchorY","rotation","scaleX","scaleY","skewX","skewY"];function $i(t,e){for(var n=0;n<Ki.length;n++){var i=Ki[n];t[i]=e[i]}}var Ji=function(){function t(t,e){this.x=t||0,this.y=e||0}return t.prototype.copy=function(t){return this.x=t.x,this.y=t.y,this},t.prototype.clone=function(){return new t(this.x,this.y)},t.prototype.set=function(t,e){return this.x=t,this.y=e,this},t.prototype.equal=function(t){return t.x===this.x&&t.y===this.y},t.prototype.add=function(t){return this.x+=t.x,this.y+=t.y,this},t.prototype.scale=function(t){this.x*=t,this.y*=t},t.prototype.scaleAndAdd=function(t,e){this.x+=t.x*e,this.y+=t.y*e},t.prototype.sub=function(t){return this.x-=t.x,this.y-=t.y,this},t.prototype.dot=function(t){return this.x*t.x+this.y*t.y},t.prototype.len=function(){return Math.sqrt(this.x*this.x+this.y*this.y)},t.prototype.lenSquare=function(){return this.x*this.x+this.y*this.y},t.prototype.normalize=function(){var t=this.len();return this.x/=t,this.y/=t,this},t.prototype.distance=function(t){var e=this.x-t.x,n=this.y-t.y;return Math.sqrt(e*e+n*n)},t.prototype.distanceSquare=function(t){var e=this.x-t.x,n=this.y-t.y;return e*e+n*n},t.prototype.negate=function(){return this.x=-this.x,this.y=-this.y,this},t.prototype.transform=function(t){if(t){var e=this.x,n=this.y;return this.x=t[0]*e+t[2]*n+t[4],this.y=t[1]*e+t[3]*n+t[5],this}},t.prototype.toArray=function(t){return t[0]=this.x,t[1]=this.y,t},t.prototype.fromArray=function(t){this.x=t[0],this.y=t[1]},t.set=function(t,e,n){t.x=e,t.y=n},t.copy=function(t,e){t.x=e.x,t.y=e.y},t.len=function(t){return Math.sqrt(t.x*t.x+t.y*t.y)},t.lenSquare=function(t){return t.x*t.x+t.y*t.y},t.dot=function(t,e){return t.x*e.x+t.y*e.y},t.add=function(t,e,n){t.x=e.x+n.x,t.y=e.y+n.y},t.sub=function(t,e,n){t.x=e.x-n.x,t.y=e.y-n.y},t.scale=function(t,e,n){t.x=e.x*n,t.y=e.y*n},t.scaleAndAdd=function(t,e,n,i){t.x=e.x+n.x*i,t.y=e.y+n.y*i},t.lerp=function(t,e,n,i){var r=1-i;t.x=r*e.x+i*n.x,t.y=r*e.y+i*n.y},t}(),Qi=Math.min,tr=Math.max,er=new Ji,nr=new Ji,ir=new Ji,rr=new Ji,or=new Ji,ar=new Ji,sr=function(){function t(t,e,n,i){n<0&&(t+=n,n=-n),i<0&&(e+=i,i=-i),this.x=t,this.y=e,this.width=n,this.height=i}return t.prototype.union=function(t){var e=Qi(t.x,this.x),n=Qi(t.y,this.y);isFinite(this.x)&&isFinite(this.width)?this.width=tr(t.x+t.width,this.x+this.width)-e:this.width=t.width,isFinite(this.y)&&isFinite(this.height)?this.height=tr(t.y+t.height,this.y+this.height)-n:this.height=t.height,this.x=e,this.y=n},t.prototype.applyTransform=function(e){t.applyTransform(this,this,e)},t.prototype.calculateTransform=function(t){var e=this,n=t.width/e.width,i=t.height/e.height,r=[1,0,0,1,0,0];return Ei(r,r,[-e.x,-e.y]),Vi(r,r,[n,i]),Ei(r,r,[t.x,t.y]),r},t.prototype.intersect=function(e,n){if(!e)return!1;e instanceof t||(e=t.create(e));var i=this,r=i.x,o=i.x+i.width,a=i.y,s=i.y+i.height,l=e.x,u=e.x+e.width,h=e.y,c=e.y+e.height,p=!(o<l||u<r||s<h||c<a);if(n){var d=1/0,f=0,g=Math.abs(o-l),y=Math.abs(u-r),v=Math.abs(s-h),m=Math.abs(c-a),x=Math.min(g,y),_=Math.min(v,m);o<l||u<r?x>f&&(f=x,g<y?Ji.set(ar,-g,0):Ji.set(ar,y,0)):x<d&&(d=x,g<y?Ji.set(or,g,0):Ji.set(or,-y,0)),s<h||c<a?_>f&&(f=_,v<m?Ji.set(ar,0,-v):Ji.set(ar,0,m)):x<d&&(d=x,v<m?Ji.set(or,0,v):Ji.set(or,0,-m))}return n&&Ji.copy(n,p?or:ar),p},t.prototype.contain=function(t,e){var n=this;return t>=n.x&&t<=n.x+n.width&&e>=n.y&&e<=n.y+n.height},t.prototype.clone=function(){return new t(this.x,this.y,this.width,this.height)},t.prototype.copy=function(e){t.copy(this,e)},t.prototype.plain=function(){return{x:this.x,y:this.y,width:this.width,height:this.height}},t.prototype.isFinite=function(){return isFinite(this.x)&&isFinite(this.y)&&isFinite(this.width)&&isFinite(this.height)},t.prototype.isZero=function(){return 0===this.width||0===this.height},t.create=function(e){return new t(e.x,e.y,e.width,e.height)},t.copy=function(t,e){t.x=e.x,t.y=e.y,t.width=e.width,t.height=e.height},t.applyTransform=function(e,n,i){if(i){if(i[1]<1e-5&&i[1]>-1e-5&&i[2]<1e-5&&i[2]>-1e-5){var r=i[0],o=i[3],a=i[4],s=i[5];return e.x=n.x*r+a,e.y=n.y*o+s,e.width=n.width*r,e.height=n.height*o,e.width<0&&(e.x+=e.width,e.width=-e.width),void(e.height<0&&(e.y+=e.height,e.height=-e.height))}er.x=ir.x=n.x,er.y=rr.y=n.y,nr.x=rr.x=n.x+n.width,nr.y=ir.y=n.y+n.height,er.transform(i),rr.transform(i),nr.transform(i),ir.transform(i),e.x=Qi(er.x,nr.x,ir.x,rr.x),e.y=Qi(er.y,nr.y,ir.y,rr.y);var l=tr(er.x,nr.x,ir.x,rr.x),u=tr(er.y,nr.y,ir.y,rr.y);e.width=l-e.x,e.height=u-e.y}else e!==n&&t.copy(e,n)},t}(),lr={};function ur(t,e){var n=lr[e=e||a];n||(n=lr[e]=new ln(500));var i=n.get(t);return null==i&&(i=h.measureText(t,e).width,n.put(t,i)),i}function hr(t,e,n,i){var r=ur(t,e),o=fr(e),a=pr(0,r,n),s=dr(0,o,i);return new sr(a,s,r,o)}function cr(t,e,n,i){var r=((t||"")+"").split("\n");if(1===r.length)return hr(r[0],e,n,i);for(var o=new sr(0,0,0,0),a=0;a<r.length;a++){var s=hr(r[a],e,n,i);0===a?o.copy(s):o.union(s)}return o}function pr(t,e,n){return"right"===n?t-=e:"center"===n&&(t-=e/2),t}function dr(t,e,n){return"middle"===n?t-=e/2:"bottom"===n&&(t-=e),t}function fr(t){return ur("国",t)}function gr(t,e){return"string"==typeof t?t.lastIndexOf("%")>=0?parseFloat(t)/100*e:parseFloat(t):t}function yr(t,e,n){var i=e.position||"inside",r=null!=e.distance?e.distance:5,o=n.height,a=n.width,s=o/2,l=n.x,u=n.y,h="left",c="top";if(i instanceof Array)l+=gr(i[0],n.width),u+=gr(i[1],n.height),h=null,c=null;else switch(i){case"left":l-=r,u+=s,h="right",c="middle";break;case"right":l+=r+a,u+=s,c="middle";break;case"top":l+=a/2,u-=r,h="center",c="bottom";break;case"bottom":l+=a/2,u+=o+r,h="center";break;case"inside":l+=a/2,u+=s,h="center",c="middle";break;case"insideLeft":l+=r,u+=s,c="middle";break;case"insideRight":l+=a-r,u+=s,h="right",c="middle";break;case"insideTop":l+=a/2,u+=r,h="center";break;case"insideBottom":l+=a/2,u+=o-r,h="center",c="bottom";break;case"insideTopLeft":l+=r,u+=r;break;case"insideTopRight":l+=a-r,u+=r,h="right";break;case"insideBottomLeft":l+=r,u+=o-r,c="bottom";break;case"insideBottomRight":l+=a-r,u+=o-r,h="right",c="bottom"}return(t=t||{}).x=l,t.y=u,t.align=h,t.verticalAlign=c,t}var vr="__zr_normal__",mr=Ki.concat(["ignore"]),xr=V(Ki,(function(t,e){return t[e]=!0,t}),{ignore:!1}),_r={},br=new sr(0,0,0,0),wr=function(){function t(t){this.id=M(),this.animators=[],this.currentStates=[],this.states={},this._init(t)}return t.prototype._init=function(t){this.attr(t)},t.prototype.drift=function(t,e,n){switch(this.draggable){case"horizontal":e=0;break;case"vertical":t=0}var i=this.transform;i||(i=this.transform=[1,0,0,1,0,0]),i[4]+=t,i[5]+=e,this.decomposeTransform(),this.markRedraw()},t.prototype.beforeUpdate=function(){},t.prototype.afterUpdate=function(){},t.prototype.update=function(){this.updateTransform(),this.__dirty&&this.updateInnerText()},t.prototype.updateInnerText=function(t){var e=this._textContent;if(e&&(!e.ignore||t)){this.textConfig||(this.textConfig={});var n=this.textConfig,i=n.local,r=e.innerTransformable,o=void 0,a=void 0,s=!1;r.parent=i?this:null;var l=!1;if(r.copyTransform(e),null!=n.position){var u=br;n.layoutRect?u.copy(n.layoutRect):u.copy(this.getBoundingRect()),i||u.applyTransform(this.transform),this.calculateTextPosition?this.calculateTextPosition(_r,n,u):yr(_r,n,u),r.x=_r.x,r.y=_r.y,o=_r.align,a=_r.verticalAlign;var h=n.origin;if(h&&null!=n.rotation){var c=void 0,p=void 0;"center"===h?(c=.5*u.width,p=.5*u.height):(c=gr(h[0],u.width),p=gr(h[1],u.height)),l=!0,r.originX=-r.x+c+(i?0:u.x),r.originY=-r.y+p+(i?0:u.y)}}null!=n.rotation&&(r.rotation=n.rotation);var d=n.offset;d&&(r.x+=d[0],r.y+=d[1],l||(r.originX=-d[0],r.originY=-d[1]));var f=null==n.inside?"string"==typeof n.position&&n.position.indexOf("inside")>=0:n.inside,g=this._innerTextDefaultStyle||(this._innerTextDefaultStyle={}),y=void 0,v=void 0,m=void 0;f&&this.canBeInsideText()?(y=n.insideFill,v=n.insideStroke,null!=y&&"auto"!==y||(y=this.getInsideTextFill()),null!=v&&"auto"!==v||(v=this.getInsideTextStroke(y),m=!0)):(y=n.outsideFill,v=n.outsideStroke,null!=y&&"auto"!==y||(y=this.getOutsideFill()),null!=v&&"auto"!==v||(v=this.getOutsideStroke(y),m=!0)),(y=y||"#000")===g.fill&&v===g.stroke&&m===g.autoStroke&&o===g.align&&a===g.verticalAlign||(s=!0,g.fill=y,g.stroke=v,g.autoStroke=m,g.align=o,g.verticalAlign=a,e.setDefaultTextStyle(g)),e.__dirty|=1,s&&e.dirtyStyle(!0)}},t.prototype.canBeInsideText=function(){return!0},t.prototype.getInsideTextFill=function(){return"#fff"},t.prototype.getInsideTextStroke=function(t){return"#000"},t.prototype.getOutsideFill=function(){return this.__zr&&this.__zr.isDarkMode()?Li:ki},t.prototype.getOutsideStroke=function(t){var e=this.__zr&&this.__zr.getBackgroundColor(),n="string"==typeof e&&bn(e);n||(n=[255,255,255,1]);for(var i=n[3],r=this.__zr.isDarkMode(),o=0;o<3;o++)n[o]=n[o]*i+(r?0:255)*(1-i);return n[3]=1,kn(n,"rgba")},t.prototype.traverse=function(t,e){},t.prototype.attrKV=function(t,e){"textConfig"===t?this.setTextConfig(e):"textContent"===t?this.setTextContent(e):"clipPath"===t?this.setClipPath(e):"extra"===t?(this.extra=this.extra||{},A(this.extra,e)):this[t]=e},t.prototype.hide=function(){this.ignore=!0,this.markRedraw()},t.prototype.show=function(){this.ignore=!1,this.markRedraw()},t.prototype.attr=function(t,e){if("string"==typeof t)this.attrKV(t,e);else if(q(t))for(var n=G(t),i=0;i<n.length;i++){var r=n[i];this.attrKV(r,t[r])}return this.markRedraw(),this},t.prototype.saveCurrentToNormalState=function(t){this._innerSaveToNormal(t);for(var e=this._normalState,n=0;n<this.animators.length;n++){var i=this.animators[n],r=i.__fromStateTransition;if(!(i.getLoop()||r&&r!==vr)){var o=i.targetName,a=o?e[o]:e;i.saveTo(a)}}},t.prototype._innerSaveToNormal=function(t){var e=this._normalState;e||(e=this._normalState={}),t.textConfig&&!e.textConfig&&(e.textConfig=this.textConfig),this._savePrimaryToNormal(t,e,mr)},t.prototype._savePrimaryToNormal=function(t,e,n){for(var i=0;i<n.length;i++){var r=n[i];null==t[r]||r in e||(e[r]=this[r])}},t.prototype.hasState=function(){return this.currentStates.length>0},t.prototype.getState=function(t){return this.states[t]},t.prototype.ensureState=function(t){var e=this.states;return e[t]||(e[t]={}),e[t]},t.prototype.clearStates=function(t){this.useState(vr,!1,t)},t.prototype.useState=function(t,e,n,i){var r=t===vr;if(this.hasState()||!r){var o=this.currentStates,a=this.stateTransition;if(!(P(o,t)>=0)||!e&&1!==o.length){var s;if(this.stateProxy&&!r&&(s=this.stateProxy(t)),s||(s=this.states&&this.states[t]),s||r){r||this.saveCurrentToNormalState(s);var l=!!(s&&s.hoverLayer||i);l&&this._toggleHoverLayerFlag(!0),this._applyStateObj(t,s,this._normalState,e,!n&&!this.__inHover&&a&&a.duration>0,a);var u=this._textContent,h=this._textGuide;return u&&u.useState(t,e,n,l),h&&h.useState(t,e,n,l),r?(this.currentStates=[],this._normalState={}):e?this.currentStates.push(t):this.currentStates=[t],this._updateAnimationTargets(),this.markRedraw(),!l&&this.__inHover&&(this._toggleHoverLayerFlag(!1),this.__dirty&=-2),s}I("State "+t+" not exists.")}}},t.prototype.useStates=function(t,e,n){if(t.length){var i=[],r=this.currentStates,o=t.length,a=o===r.length;if(a)for(var s=0;s<o;s++)if(t[s]!==r[s]){a=!1;break}if(a)return;for(s=0;s<o;s++){var l=t[s],u=void 0;this.stateProxy&&(u=this.stateProxy(l,t)),u||(u=this.states[l]),u&&i.push(u)}var h=i[o-1],c=!!(h&&h.hoverLayer||n);c&&this._toggleHoverLayerFlag(!0);var p=this._mergeStates(i),d=this.stateTransition;this.saveCurrentToNormalState(p),this._applyStateObj(t.join(","),p,this._normalState,!1,!e&&!this.__inHover&&d&&d.duration>0,d);var f=this._textContent,g=this._textGuide;f&&f.useStates(t,e,c),g&&g.useStates(t,e,c),this._updateAnimationTargets(),this.currentStates=t.slice(),this.markRedraw(),!c&&this.__inHover&&(this._toggleHoverLayerFlag(!1),this.__dirty&=-2)}else this.clearStates()},t.prototype._updateAnimationTargets=function(){for(var t=0;t<this.animators.length;t++){var e=this.animators[t];e.targetName&&e.changeTarget(this[e.targetName])}},t.prototype.removeState=function(t){var e=P(this.currentStates,t);if(e>=0){var n=this.currentStates.slice();n.splice(e,1),this.useStates(n)}},t.prototype.replaceState=function(t,e,n){var i=this.currentStates.slice(),r=P(i,t),o=P(i,e)>=0;r>=0?o?i.splice(r,1):i[r]=e:n&&!o&&i.push(e),this.useStates(i)},t.prototype.toggleState=function(t,e){e?this.useState(t,!0):this.removeState(t)},t.prototype._mergeStates=function(t){for(var e,n={},i=0;i<t.length;i++){var r=t[i];A(n,r),r.textConfig&&A(e=e||{},r.textConfig)}return e&&(n.textConfig=e),n},t.prototype._applyStateObj=function(t,e,n,i,r,o){var a=!(e&&i);e&&e.textConfig?(this.textConfig=A({},i?this.textConfig:n.textConfig),A(this.textConfig,e.textConfig)):a&&n.textConfig&&(this.textConfig=n.textConfig);for(var s={},l=!1,u=0;u<mr.length;u++){var h=mr[u],c=r&&xr[h];e&&null!=e[h]?c?(l=!0,s[h]=e[h]):this[h]=e[h]:a&&null!=n[h]&&(c?(l=!0,s[h]=n[h]):this[h]=n[h])}if(!r)for(u=0;u<this.animators.length;u++){var p=this.animators[u],d=p.targetName;p.getLoop()||p.__changeFinalValue(d?(e||n)[d]:e||n)}l&&this._transitionState(t,s,o)},t.prototype._attachComponent=function(t){if((!t.__zr||t.__hostTarget)&&t!==this){var e=this.__zr;e&&t.addSelfToZr(e),t.__zr=e,t.__hostTarget=this}},t.prototype._detachComponent=function(t){t.__zr&&t.removeSelfFromZr(t.__zr),t.__zr=null,t.__hostTarget=null},t.prototype.getClipPath=function(){return this._clipPath},t.prototype.setClipPath=function(t){this._clipPath&&this._clipPath!==t&&this.removeClipPath(),this._attachComponent(t),this._clipPath=t,this.markRedraw()},t.prototype.removeClipPath=function(){var t=this._clipPath;t&&(this._detachComponent(t),this._clipPath=null,this.markRedraw())},t.prototype.getTextContent=function(){return this._textContent},t.prototype.setTextContent=function(t){var e=this._textContent;e!==t&&(e&&e!==t&&this.removeTextContent(),t.innerTransformable=new qi,this._attachComponent(t),this._textContent=t,this.markRedraw())},t.prototype.setTextConfig=function(t){this.textConfig||(this.textConfig={}),A(this.textConfig,t),this.markRedraw()},t.prototype.removeTextConfig=function(){this.textConfig=null,this.markRedraw()},t.prototype.removeTextContent=function(){var t=this._textContent;t&&(t.innerTransformable=null,this._detachComponent(t),this._textContent=null,this._innerTextDefaultStyle=null,this.markRedraw())},t.prototype.getTextGuideLine=function(){return this._textGuide},t.prototype.setTextGuideLine=function(t){this._textGuide&&this._textGuide!==t&&this.removeTextGuideLine(),this._attachComponent(t),this._textGuide=t,this.markRedraw()},t.prototype.removeTextGuideLine=function(){var t=this._textGuide;t&&(this._detachComponent(t),this._textGuide=null,this.markRedraw())},t.prototype.markRedraw=function(){this.__dirty|=1;var t=this.__zr;t&&(this.__inHover?t.refreshHover():t.refresh()),this.__hostTarget&&this.__hostTarget.markRedraw()},t.prototype.dirty=function(){this.markRedraw()},t.prototype._toggleHoverLayerFlag=function(t){this.__inHover=t;var e=this._textContent,n=this._textGuide;e&&(e.__inHover=t),n&&(n.__inHover=t)},t.prototype.addSelfToZr=function(t){if(this.__zr!==t){this.__zr=t;var e=this.animators;if(e)for(var n=0;n<e.length;n++)t.animation.addAnimator(e[n]);this._clipPath&&this._clipPath.addSelfToZr(t),this._textContent&&this._textContent.addSelfToZr(t),this._textGuide&&this._textGuide.addSelfToZr(t)}},t.prototype.removeSelfFromZr=function(t){if(this.__zr){this.__zr=null;var e=this.animators;if(e)for(var n=0;n<e.length;n++)t.animation.removeAnimator(e[n]);this._clipPath&&this._clipPath.removeSelfFromZr(t),this._textContent&&this._textContent.removeSelfFromZr(t),this._textGuide&&this._textGuide.removeSelfFromZr(t)}},t.prototype.animate=function(t,e,n){var i=t?this[t]:this;var r=new ai(i,e,n);return t&&(r.targetName=t),this.addAnimator(r,t),r},t.prototype.addAnimator=function(t,e){var n=this.__zr,i=this;t.during((function(){i.updateDuringAnimation(e)})).done((function(){var e=i.animators,n=P(e,t);n>=0&&e.splice(n,1)})),this.animators.push(t),n&&n.animation.addAnimator(t),n&&n.wakeUp()},t.prototype.updateDuringAnimation=function(t){this.markRedraw()},t.prototype.stopAnimation=function(t,e){for(var n=this.animators,i=n.length,r=[],o=0;o<i;o++){var a=n[o];t&&t!==a.scope?r.push(a):a.stop(e)}return this.animators=r,this},t.prototype.animateTo=function(t,e,n){Sr(this,t,e,n)},t.prototype.animateFrom=function(t,e,n){Sr(this,t,e,n,!0)},t.prototype._transitionState=function(t,e,n,i){for(var r=Sr(this,e,n,i),o=0;o<r.length;o++)r[o].__fromStateTransition=t},t.prototype.getBoundingRect=function(){return null},t.prototype.getPaintRect=function(){return null},t.initDefaultProps=function(){var e=t.prototype;e.type="element",e.name="",e.ignore=e.silent=e.isGroup=e.draggable=e.dragging=e.ignoreClip=e.__inHover=!1,e.__dirty=1;function n(t,n,i,r){function o(t,e){Object.defineProperty(e,0,{get:function(){return t[i]},set:function(e){t[i]=e}}),Object.defineProperty(e,1,{get:function(){return t[r]},set:function(e){t[r]=e}})}Object.defineProperty(e,t,{get:function(){this[n]||o(this,this[n]=[]);return this[n]},set:function(t){this[i]=t[0],this[r]=t[1],this[n]=t,o(this,t)}})}Object.defineProperty&&(n("position","_legacyPos","x","y"),n("scale","_legacyScale","scaleX","scaleY"),n("origin","_legacyOrigin","originX","originY"))}(),t}();function Sr(t,e,n,i,r){var o=[];Tr(t,"",t,e,n=n||{},i,o,r);var a=o.length,s=!1,l=n.done,u=n.aborted,h=function(){s=!0,--a<=0&&(s?l&&l():u&&u())},c=function(){--a<=0&&(s?l&&l():u&&u())};a||l&&l(),o.length>0&&n.during&&o[0].during((function(t,e){n.during(e)}));for(var p=0;p<o.length;p++){var d=o[p];h&&d.done(h),c&&d.aborted(c),n.force&&d.duration(n.duration),d.start(n.easing)}return o}function Mr(t,e,n){for(var i=0;i<n;i++)t[i]=e[i]}function Ir(t,e,n){if(N(e[n]))if(N(t[n])||(t[n]=[]),$(e[n])){var i=e[n].length;t[n].length!==i&&(t[n]=new e[n].constructor(i),Mr(t[n],e[n],i))}else{var r=e[n],o=t[n],a=r.length;if(N(r[0]))for(var s=r[0].length,l=0;l<a;l++)o[l]?Mr(o[l],r[l],s):o[l]=Array.prototype.slice.call(r[l]);else Mr(o,r,a);o.length=r.length}else t[n]=e[n]}function Tr(t,e,n,i,r,o,a,s){for(var l=G(i),u=r.duration,h=r.delay,c=r.additive,p=r.setToFinal,d=!q(o),f=t.animators,g=[],y=0;y<l.length;y++){var v=l[y],m=i[v];if(null!=m&&null!=n[v]&&(d||o[v]))if(!q(m)||N(m)||Q(m))g.push(v);else{if(e){s||(n[v]=m,t.updateDuringAnimation(e));continue}Tr(t,v,n[v],m,r,o&&o[v],a,s)}else s||(n[v]=m,t.updateDuringAnimation(e),g.push(v))}var x=g.length;if(!c&&x)for(var _=0;_<f.length;_++){if((w=f[_]).targetName===e)if(w.stopTracks(g)){var b=P(f,w);f.splice(b,1)}}if(r.force||(x=(g=B(g,(function(t){return e=i[t],r=n[t],!(e===r||N(e)&&N(r)&&function(t,e){var n=t.length;if(n!==e.length)return!1;for(var i=0;i<n;i++)if(t[i]!==e[i])return!1;return!0}(e,r));var e,r}))).length),x>0||r.force&&!a.length){var w,S=void 0,M=void 0,I=void 0;if(s){M={},p&&(S={});for(_=0;_<x;_++){M[v=g[_]]=n[v],p?S[v]=i[v]:n[v]=i[v]}}else if(p){I={};for(_=0;_<x;_++){I[v=g[_]]=ti(n[v]),Ir(n,i,v)}}(w=new ai(n,!1,!1,c?B(f,(function(t){return t.targetName===e})):null)).targetName=e,r.scope&&(w.scope=r.scope),p&&S&&w.whenWithKeys(0,S,g),I&&w.whenWithKeys(0,I,g),w.whenWithKeys(null==u?500:u,s?M:i,g).delay(h||0),t.addAnimator(w,e),a.push(w)}}R(wr,Xt),R(wr,qi);var Cr=function(t){function e(e){var n=t.call(this)||this;return n.isGroup=!0,n._children=[],n.attr(e),n}return n(e,t),e.prototype.childrenRef=function(){return this._children},e.prototype.children=function(){return this._children.slice()},e.prototype.childAt=function(t){return this._children[t]},e.prototype.childOfName=function(t){for(var e=this._children,n=0;n<e.length;n++)if(e[n].name===t)return e[n]},e.prototype.childCount=function(){return this._children.length},e.prototype.add=function(t){return t&&t!==this&&t.parent!==this&&(this._children.push(t),this._doAdd(t)),this},e.prototype.addBefore=function(t,e){if(t&&t!==this&&t.parent!==this&&e&&e.parent===this){var n=this._children,i=n.indexOf(e);i>=0&&(n.splice(i,0,t),this._doAdd(t))}return this},e.prototype.replace=function(t,e){var n=P(this._children,t);return n>=0&&this.replaceAt(e,n),this},e.prototype.replaceAt=function(t,e){var n=this._children,i=n[e];if(t&&t!==this&&t.parent!==this&&t!==i){n[e]=t,i.parent=null;var r=this.__zr;r&&i.removeSelfFromZr(r),this._doAdd(t)}return this},e.prototype._doAdd=function(t){t.parent&&t.parent.remove(t),t.parent=this;var e=this.__zr;e&&e!==t.__zr&&t.addSelfToZr(e),e&&e.refresh()},e.prototype.remove=function(t){var e=this.__zr,n=this._children,i=P(n,t);return i<0||(n.splice(i,1),t.parent=null,e&&t.removeSelfFromZr(e),e&&e.refresh()),this},e.prototype.removeAll=function(){for(var t=this._children,e=this.__zr,n=0;n<t.length;n++){var i=t[n];e&&i.removeSelfFromZr(e),i.parent=null}return t.length=0,this},e.prototype.eachChild=function(t,e){for(var n=this._children,i=0;i<n.length;i++){var r=n[i];t.call(e,r,i)}return this},e.prototype.traverse=function(t,e){for(var n=0;n<this._children.length;n++){var i=this._children[n],r=t.call(e,i);i.isGroup&&!r&&i.traverse(t,e)}return this},e.prototype.addSelfToZr=function(e){t.prototype.addSelfToZr.call(this,e);for(var n=0;n<this._children.length;n++){this._children[n].addSelfToZr(e)}},e.prototype.removeSelfFromZr=function(e){t.prototype.removeSelfFromZr.call(this,e);for(var n=0;n<this._children.length;n++){this._children[n].removeSelfFromZr(e)}},e.prototype.getBoundingRect=function(t){for(var e=new sr(0,0,0,0),n=t||this._children,i=[],r=null,o=0;o<n.length;o++){var a=n[o];if(!a.ignore&&!a.invisible){var s=a.getBoundingRect(),l=a.getLocalTransform(i);l?(sr.applyTransform(e,s,l),(r=r||e.clone()).union(e)):(r=r||s.clone()).union(s)}}return r||e},e}(wr);Cr.prototype.type="group";
+/*!
+    * ZRender, a high performance 2d drawing library.
+    *
+    * Copyright (c) 2013, Baidu Inc.
+    * All rights reserved.
+    *
+    * LICENSE
+    * https://github.com/ecomfe/zrender/blob/master/LICENSE.txt
+    */
+var Dr={},Ar={};var kr=function(){function t(t,e,n){var i=this;this._sleepAfterStill=10,this._stillFrameAccum=0,this._needsRefresh=!0,this._needsRefreshHover=!0,this._darkMode=!1,n=n||{},this.dom=e,this.id=t;var o=new Ae,a=n.renderer||"canvas";Dr[a]||(a=G(Dr)[0]),n.useDirtyRect=null!=n.useDirtyRect&&n.useDirtyRect;var s=new Dr[a](e,o,n,t),l=n.ssr||s.ssrOnly;this.storage=o,this.painter=s;var u=r.node||r.worker||l?null:new Ci(s.getViewportRoot(),s.root);this.handler=new ve(o,s,u,s.root),this.animation=new hi({stage:{update:l?null:function(){return i._flush(!0)}}}),l||this.animation.start()}return t.prototype.add=function(t){t&&(this.storage.addRoot(t),t.addSelfToZr(this),this.refresh())},t.prototype.remove=function(t){t&&(this.storage.delRoot(t),t.removeSelfFromZr(this),this.refresh())},t.prototype.configLayer=function(t,e){this.painter.configLayer&&this.painter.configLayer(t,e),this.refresh()},t.prototype.setBackgroundColor=function(t){this.painter.setBackgroundColor&&this.painter.setBackgroundColor(t),this.refresh(),this._backgroundColor=t,this._darkMode=function(t){if(!t)return!1;if("string"==typeof t)return Ln(t,1)<.4;if(t.colorStops){for(var e=t.colorStops,n=0,i=e.length,r=0;r<i;r++)n+=Ln(e[r].color,1);return(n/=i)<.4}return!1}(t)},t.prototype.getBackgroundColor=function(){return this._backgroundColor},t.prototype.setDarkMode=function(t){this._darkMode=t},t.prototype.isDarkMode=function(){return this._darkMode},t.prototype.refreshImmediately=function(t){t||this.animation.update(!0),this._needsRefresh=!1,this.painter.refresh(),this._needsRefresh=!1},t.prototype.refresh=function(){this._needsRefresh=!0,this.animation.start()},t.prototype.flush=function(){this._flush(!1)},t.prototype._flush=function(t){var e,n=si();this._needsRefresh&&(e=!0,this.refreshImmediately(t)),this._needsRefreshHover&&(e=!0,this.refreshHoverImmediately());var i=si();e?(this._stillFrameAccum=0,this.trigger("rendered",{elapsedTime:i-n})):this._sleepAfterStill>0&&(this._stillFrameAccum++,this._stillFrameAccum>this._sleepAfterStill&&this.animation.stop())},t.prototype.setSleepAfterStill=function(t){this._sleepAfterStill=t},t.prototype.wakeUp=function(){this.animation.start(),this._stillFrameAccum=0},t.prototype.refreshHover=function(){this._needsRefreshHover=!0},t.prototype.refreshHoverImmediately=function(){this._needsRefreshHover=!1,this.painter.refreshHover&&"canvas"===this.painter.getType()&&this.painter.refreshHover()},t.prototype.resize=function(t){t=t||{},this.painter.resize(t.width,t.height),this.handler.resize()},t.prototype.clearAnimation=function(){this.animation.clear()},t.prototype.getWidth=function(){return this.painter.getWidth()},t.prototype.getHeight=function(){return this.painter.getHeight()},t.prototype.setCursorStyle=function(t){this.handler.setCursorStyle(t)},t.prototype.findHover=function(t,e){return this.handler.findHover(t,e)},t.prototype.on=function(t,e,n){return this.handler.on(t,e,n),this},t.prototype.off=function(t,e){this.handler.off(t,e)},t.prototype.trigger=function(t,e){this.handler.trigger(t,e)},t.prototype.clear=function(){for(var t=this.storage.getRoots(),e=0;e<t.length;e++)t[e]instanceof Cr&&t[e].removeSelfFromZr(this);this.storage.delAllRoots(),this.painter.clear()},t.prototype.dispose=function(){var t;this.animation.stop(),this.clear(),this.storage.dispose(),this.painter.dispose(),this.handler.dispose(),this.animation=this.storage=this.painter=this.handler=null,t=this.id,delete Ar[t]},t}();function Lr(t,e){var n=new kr(M(),t,e);return Ar[n.id]=n,n}function Pr(t,e){Dr[t]=e}var Or=Object.freeze({__proto__:null,init:Lr,dispose:function(t){t.dispose()},disposeAll:function(){for(var t in Ar)Ar.hasOwnProperty(t)&&Ar[t].dispose();Ar={}},getInstance:function(t){return Ar[t]},registerPainter:Pr,version:"5.3.0"}),Rr=1e-4;function Nr(t,e,n,i){var r=e[0],o=e[1],a=n[0],s=n[1],l=o-r,u=s-a;if(0===l)return 0===u?a:(a+s)/2;if(i)if(l>0){if(t<=r)return a;if(t>=o)return s}else{if(t>=r)return a;if(t<=o)return s}else{if(t===r)return a;if(t===o)return s}return(t-r)/l*u+a}function Er(t,e){switch(t){case"center":case"middle":t="50%";break;case"left":case"top":t="0%";break;case"right":case"bottom":t="100%"}return X(t)?(n=t,n.replace(/^\s+|\s+$/g,"")).match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?NaN:+t;var n}function zr(t,e,n){return null==e&&(e=10),e=Math.min(Math.max(0,e),20),t=(+t).toFixed(e),n?t:+t}function Vr(t){return t.sort((function(t,e){return t-e})),t}function Br(t){if(t=+t,isNaN(t))return 0;if(t>1e-14)for(var e=1,n=0;n<15;n++,e*=10)if(Math.round(t*e)/e===t)return n;return Fr(t)}function Fr(t){var e=t.toString().toLowerCase(),n=e.indexOf("e"),i=n>0?+e.slice(n+1):0,r=n>0?n:e.length,o=e.indexOf("."),a=o<0?0:r-1-o;return Math.max(0,a-i)}function Gr(t,e){var n=Math.log,i=Math.LN10,r=Math.floor(n(t[1]-t[0])/i),o=Math.round(n(Math.abs(e[1]-e[0]))/i),a=Math.min(Math.max(-r+o,0),20);return isFinite(a)?a:20}function Wr(t,e,n){if(!t[e])return 0;var i=V(t,(function(t,e){return t+(isNaN(e)?0:e)}),0);if(0===i)return 0;for(var r=Math.pow(10,n),o=z(t,(function(t){return(isNaN(t)?0:t)/i*r*100})),a=100*r,s=z(o,(function(t){return Math.floor(t)})),l=V(s,(function(t,e){return t+e}),0),u=z(o,(function(t,e){return t-s[e]}));l<a;){for(var h=Number.NEGATIVE_INFINITY,c=null,p=0,d=u.length;p<d;++p)u[p]>h&&(h=u[p],c=p);++s[c],u[c]=0,++l}return s[e]/r}function Hr(t,e){var n=Math.max(Br(t),Br(e)),i=t+e;return n>20?i:zr(i,n)}var Yr=9007199254740991;function Ur(t){var e=2*Math.PI;return(t%e+e)%e}function Xr(t){return t>-1e-4&&t<Rr}var Zr=/^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d{1,2})(?::(\d{1,2})(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/;function jr(t){if(t instanceof Date)return t;if(X(t)){var e=Zr.exec(t);if(!e)return new Date(NaN);if(e[8]){var n=+e[4]||0;return"Z"!==e[8].toUpperCase()&&(n-=+e[8].slice(0,3)),new Date(Date.UTC(+e[1],+(e[2]||1)-1,+e[3]||1,n,+(e[5]||0),+e[6]||0,e[7]?+e[7].substring(0,3):0))}return new Date(+e[1],+(e[2]||1)-1,+e[3]||1,+e[4]||0,+(e[5]||0),+e[6]||0,e[7]?+e[7].substring(0,3):0)}return null==t?new Date(NaN):new Date(Math.round(t))}function qr(t){return Math.pow(10,Kr(t))}function Kr(t){if(0===t)return 0;var e=Math.floor(Math.log(t)/Math.LN10);return t/Math.pow(10,e)>=10&&e++,e}function $r(t,e){var n=Kr(t),i=Math.pow(10,n),r=t/i;return t=(e?r<1.5?1:r<2.5?2:r<4?3:r<7?5:10:r<1?1:r<2?2:r<3?3:r<5?5:10)*i,n>=-20?+t.toFixed(n<0?-n:0):t}function Jr(t,e){var n=(t.length-1)*e+1,i=Math.floor(n),r=+t[i-1],o=n-i;return o?r+o*(t[i]-r):r}function Qr(t){t.sort((function(t,e){return s(t,e,0)?-1:1}));for(var e=-1/0,n=1,i=0;i<t.length;){for(var r=t[i].interval,o=t[i].close,a=0;a<2;a++)r[a]<=e&&(r[a]=e,o[a]=a?1:1-n),e=r[a],n=o[a];r[0]===r[1]&&o[0]*o[1]!=1?t.splice(i,1):i++}return t;function s(t,e,n){return t.interval[n]<e.interval[n]||t.interval[n]===e.interval[n]&&(t.close[n]-e.close[n]==(n?-1:1)||!n&&s(t,e,1))}}function to(t){var e=parseFloat(t);return e==t&&(0!==e||!X(t)||t.indexOf("x")<=0)?e:NaN}function eo(t){return!isNaN(to(t))}function no(){return Math.round(9*Math.random())}function io(t,e){return 0===e?t:io(e,t%e)}function ro(t,e){return null==t?e:null==e?t:t*e/io(t,e)}"undefined"!=typeof console&&console.warn&&console.log;function oo(t){0}function ao(t){throw new Error(t)}function so(t,e,n){return(e-t)*n+t}var lo="series\0",uo="\0_ec_\0";function ho(t){return t instanceof Array?t:null==t?[]:[t]}function co(t,e,n){if(t){t[e]=t[e]||{},t.emphasis=t.emphasis||{},t.emphasis[e]=t.emphasis[e]||{};for(var i=0,r=n.length;i<r;i++){var o=n[i];!t.emphasis[e].hasOwnProperty(o)&&t[e].hasOwnProperty(o)&&(t.emphasis[e][o]=t[e][o])}}}var po=["fontStyle","fontWeight","fontSize","fontFamily","rich","tag","color","textBorderColor","textBorderWidth","width","height","lineHeight","align","verticalAlign","baseline","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY","textShadowColor","textShadowBlur","textShadowOffsetX","textShadowOffsetY","backgroundColor","borderColor","borderWidth","borderRadius","padding"];function fo(t){return!q(t)||Y(t)||t instanceof Date?t:t.value}function go(t){return q(t)&&!(t instanceof Array)}function yo(t,e,n){var i="normalMerge"===n,r="replaceMerge"===n,o="replaceAll"===n;t=t||[],e=(e||[]).slice();var a=ft();E(e,(function(t,n){q(t)||(e[n]=null)}));var s,l,u=function(t,e,n){var i=[];if("replaceAll"===n)return i;for(var r=0;r<t.length;r++){var o=t[r];o&&null!=o.id&&e.set(o.id,r),i.push({existing:"replaceMerge"===n||bo(o)?null:o,newOption:null,keyInfo:null,brandNew:null})}return i}(t,a,n);return(i||r)&&function(t,e,n,i){E(i,(function(r,o){if(r&&null!=r.id){var a=mo(r.id),s=n.get(a);if(null!=s){var l=t[s];lt(!l.newOption,'Duplicated option on id "'+a+'".'),l.newOption=r,l.existing=e[s],i[o]=null}}}))}(u,t,a,e),i&&function(t,e){E(e,(function(n,i){if(n&&null!=n.name)for(var r=0;r<t.length;r++){var o=t[r].existing;if(!t[r].newOption&&o&&(null==o.id||null==n.id)&&!bo(n)&&!bo(o)&&vo("name",o,n))return t[r].newOption=n,void(e[i]=null)}}))}(u,e),i||r?function(t,e,n){E(e,(function(e){if(e){for(var i,r=0;(i=t[r])&&(i.newOption||bo(i.existing)||i.existing&&null!=e.id&&!vo("id",e,i.existing));)r++;i?(i.newOption=e,i.brandNew=n):t.push({newOption:e,brandNew:n,existing:null,keyInfo:null}),r++}}))}(u,e,r):o&&function(t,e){E(e,(function(e){t.push({newOption:e,brandNew:!0,existing:null,keyInfo:null})}))}(u,e),s=u,l=ft(),E(s,(function(t){var e=t.existing;e&&l.set(e.id,t)})),E(s,(function(t){var e=t.newOption;lt(!e||null==e.id||!l.get(e.id)||l.get(e.id)===t,"id duplicates: "+(e&&e.id)),e&&null!=e.id&&l.set(e.id,t),!t.keyInfo&&(t.keyInfo={})})),E(s,(function(t,e){var n=t.existing,i=t.newOption,r=t.keyInfo;if(q(i)){if(r.name=null!=i.name?mo(i.name):n?n.name:lo+e,n)r.id=mo(n.id);else if(null!=i.id)r.id=mo(i.id);else{var o=0;do{r.id="\0"+r.name+"\0"+o++}while(l.get(r.id))}l.set(r.id,t)}})),u}function vo(t,e,n){var i=xo(e[t],null),r=xo(n[t],null);return null!=i&&null!=r&&i===r}function mo(t){return xo(t,"")}function xo(t,e){return null==t?e:X(t)?t:j(t)||Z(t)?t+"":e}function _o(t){var e=t.name;return!(!e||!e.indexOf(lo))}function bo(t){return t&&null!=t.id&&0===mo(t.id).indexOf(uo)}function wo(t,e){return null!=e.dataIndexInside?e.dataIndexInside:null!=e.dataIndex?Y(e.dataIndex)?z(e.dataIndex,(function(e){return t.indexOfRawIndex(e)})):t.indexOfRawIndex(e.dataIndex):null!=e.name?Y(e.name)?z(e.name,(function(e){return t.indexOfName(e)})):t.indexOfName(e.name):void 0}function So(){var t="__ec_inner_"+Mo++;return function(e){return e[t]||(e[t]={})}}var Mo=no();function Io(t,e,n){var i=To(e,n),r=i.mainTypeSpecified,o=i.queryOptionMap,a=i.others,s=n?n.defaultMainType:null;return!r&&s&&o.set(s,{}),o.each((function(e,i){var r=Ao(t,i,e,{useDefault:s===i,enableAll:!n||null==n.enableAll||n.enableAll,enableNone:!n||null==n.enableNone||n.enableNone});a[i+"Models"]=r.models,a[i+"Model"]=r.models[0]})),a}function To(t,e){var n;if(X(t)){var i={};i[t+"Index"]=0,n=i}else n=t;var r=ft(),o={},a=!1;return E(n,(function(t,n){if("dataIndex"!==n&&"dataIndexInside"!==n){var i=n.match(/^(\w+)(Index|Id|Name)$/)||[],s=i[1],l=(i[2]||"").toLowerCase();if(s&&l&&!(e&&e.includeMainTypes&&P(e.includeMainTypes,s)<0))a=a||!!s,(r.get(s)||r.set(s,{}))[l]=t}else o[n]=t})),{mainTypeSpecified:a,queryOptionMap:r,others:o}}var Co={useDefault:!0,enableAll:!1,enableNone:!1},Do={useDefault:!1,enableAll:!0,enableNone:!0};function Ao(t,e,n,i){i=i||Co;var r=n.index,o=n.id,a=n.name,s={models:null,specified:null!=r||null!=o||null!=a};if(!s.specified){var l=void 0;return s.models=i.useDefault&&(l=t.getComponent(e))?[l]:[],s}return"none"===r||!1===r?(lt(i.enableNone,'`"none"` or `false` is not a valid value on index option.'),s.models=[],s):("all"===r&&(lt(i.enableAll,'`"all"` is not a valid value on index option.'),r=o=a=null),s.models=t.queryComponents({mainType:e,index:r,id:o,name:a}),s)}function ko(t,e,n){t.setAttribute?t.setAttribute(e,n):t[e]=n}function Lo(t,e){var n=ft(),i=[];return E(t,(function(t){var r=e(t);(n.get(r)||(i.push(r),n.set(r,[]))).push(t)})),{keys:i,buckets:n}}function Po(t,e,n,i,r){var o=null==e||"auto"===e;if(null==i)return i;if(j(i))return zr(f=so(n||0,i,r),o?Math.max(Br(n||0),Br(i)):e);if(X(i))return r<1?n:i;for(var a=[],s=n,l=i,u=Math.max(s?s.length:0,l.length),h=0;h<u;++h){var c=t.getDimensionInfo(h);if(c&&"ordinal"===c.type)a[h]=(r<1&&s?s:l)[h];else{var p=s&&s[h]?s[h]:0,d=l[h],f=so(p,d,r);a[h]=zr(f,o?Math.max(Br(p),Br(d)):e)}}return a}var Oo="___EC__COMPONENT__CONTAINER___",Ro="___EC__EXTENDED_CLASS___";function No(t){var e={main:"",sub:""};if(t){var n=t.split(".");e.main=n[0]||"",e.sub=n[1]||""}return e}function Eo(t,e){t.$constructor=t,t.extend=function(t){var e,i,r=this;return U(i=r)&&/^class\s/.test(Function.prototype.toString.call(i))?e=function(t){function e(){return t.apply(this,arguments)||this}return n(e,t),e}(r):O(e=function(){(t.$constructor||r).apply(this,arguments)},this),A(e.prototype,t),e[Ro]=!0,e.extend=this.extend,e.superCall=Bo,e.superApply=Fo,e.superClass=r,e}}function zo(t,e){t.extend=e.extend}var Vo=Math.round(10*Math.random());function Bo(t,e){for(var n=[],i=2;i<arguments.length;i++)n[i-2]=arguments[i];return this.superClass.prototype[e].apply(t,n)}function Fo(t,e,n){return this.superClass.prototype[e].apply(t,n)}function Go(t){var e={};t.registerClass=function(t){var n,i=t.type||t.prototype.type;if(i){lt(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(n=i),'componentType "'+n+'" illegal'),t.prototype.type=i;var r=No(i);if(r.sub){if(r.sub!==Oo){(function(t){var n=e[t.main];n&&n[Oo]||((n=e[t.main]={})[Oo]=!0);return n}(r))[r.sub]=t}}else e[r.main]=t}return t},t.getClass=function(t,n,i){var r=e[t];if(r&&r[Oo]&&(r=n?r[n]:null),i&&!r)throw new Error(n?"Component "+t+"."+(n||"")+" is used but not imported.":t+".type should be specified.");return r},t.getClassesByMainType=function(t){var n=No(t),i=[],r=e[n.main];return r&&r[Oo]?E(r,(function(t,e){e!==Oo&&i.push(t)})):i.push(r),i},t.hasClass=function(t){var n=No(t);return!!e[n.main]},t.getAllClassMainTypes=function(){var t=[];return E(e,(function(e,n){t.push(n)})),t},t.hasSubTypes=function(t){var n=No(t),i=e[n.main];return i&&i[Oo]}}function Wo(t,e){for(var n=0;n<t.length;n++)t[n][1]||(t[n][1]=t[n][0]);return e=e||!1,function(n,i,r){for(var o={},a=0;a<t.length;a++){var s=t[a][1];if(!(i&&P(i,s)>=0||r&&P(r,s)<0)){var l=n.getShallow(s,e);null!=l&&(o[t[a][0]]=l)}}return o}}var Ho=Wo([["fill","color"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["opacity"],["shadowColor"]]),Yo=function(){function t(){}return t.prototype.getAreaStyle=function(t,e){return Ho(this,t,e)},t}(),Uo=new ln(50);function Xo(t){if("string"==typeof t){var e=Uo.get(t);return e&&e.image}return t}function Zo(t,e,n,i,r){if(t){if("string"==typeof t){if(e&&e.__zrImageSrc===t||!n)return e;var o=Uo.get(t),a={hostEl:n,cb:i,cbPayload:r};if(o)!qo(e=o.image)&&o.pending.push(a);else{var s=h.loadImage(t,jo,jo);s.__zrImageSrc=t,Uo.put(t,s.__cachedImgObj={image:s,pending:[a]})}return e}return t}return e}function jo(){var t=this.__cachedImgObj;this.onload=this.onerror=this.__cachedImgObj=null;for(var e=0;e<t.pending.length;e++){var n=t.pending[e],i=n.cb;i&&i(this,n.cbPayload),n.hostEl.dirty()}t.pending.length=0}function qo(t){return t&&t.width&&t.height}var Ko=/\{([a-zA-Z0-9_]+)\|([^}]*)\}/g;function $o(t,e,n,i,r){if(!e)return"";var o=(t+"").split("\n");r=Jo(e,n,i,r);for(var a=0,s=o.length;a<s;a++)o[a]=Qo(o[a],r);return o.join("\n")}function Jo(t,e,n,i){var r=A({},i=i||{});r.font=e,n=rt(n,"..."),r.maxIterations=rt(i.maxIterations,2);var o=r.minChar=rt(i.minChar,0);r.cnCharWidth=ur("国",e);var a=r.ascCharWidth=ur("a",e);r.placeholder=rt(i.placeholder,"");for(var s=t=Math.max(0,t-1),l=0;l<o&&s>=a;l++)s-=a;var u=ur(n,e);return u>s&&(n="",u=0),s=t-u,r.ellipsis=n,r.ellipsisWidth=u,r.contentWidth=s,r.containerWidth=t,r}function Qo(t,e){var n=e.containerWidth,i=e.font,r=e.contentWidth;if(!n)return"";var o=ur(t,i);if(o<=n)return t;for(var a=0;;a++){if(o<=r||a>=e.maxIterations){t+=e.ellipsis;break}var s=0===a?ta(t,r,e.ascCharWidth,e.cnCharWidth):o>0?Math.floor(t.length*r/o):0;o=ur(t=t.substr(0,s),i)}return""===t&&(t=e.placeholder),t}function ta(t,e,n,i){for(var r=0,o=0,a=t.length;o<a&&r<e;o++){var s=t.charCodeAt(o);r+=0<=s&&s<=127?n:i}return o}var ea=function(){},na=function(t){this.tokens=[],t&&(this.tokens=t)},ia=function(){this.width=0,this.height=0,this.contentWidth=0,this.contentHeight=0,this.outerWidth=0,this.outerHeight=0,this.lines=[]};function ra(t,e,n,i,r){var o,a,s=""===e,l=r&&n.rich[r]||{},u=t.lines,h=l.font||n.font,c=!1;if(i){var p=l.padding,d=p?p[1]+p[3]:0;if(null!=l.width&&"auto"!==l.width){var f=gr(l.width,i.width)+d;u.length>0&&f+i.accumWidth>i.width&&(o=e.split("\n"),c=!0),i.accumWidth=f}else{var g=sa(e,h,i.width,i.breakAll,i.accumWidth);i.accumWidth=g.accumWidth+d,a=g.linesWidths,o=g.lines}}else o=e.split("\n");for(var y=0;y<o.length;y++){var v=o[y],m=new ea;if(m.styleName=r,m.text=v,m.isLineHolder=!v&&!s,"number"==typeof l.width?m.width=l.width:m.width=a?a[y]:ur(v,h),y||c)u.push(new na([m]));else{var x=(u[u.length-1]||(u[0]=new na)).tokens,_=x.length;1===_&&x[0].isLineHolder?x[0]=m:(v||!_||s)&&x.push(m)}}}var oa=V(",&?/;] ".split(""),(function(t,e){return t[e]=!0,t}),{});function aa(t){return!function(t){var e=t.charCodeAt(0);return e>=33&&e<=383}(t)||!!oa[t]}function sa(t,e,n,i,r){for(var o=[],a=[],s="",l="",u=0,h=0,c=0;c<t.length;c++){var p=t.charAt(c);if("\n"!==p){var d=ur(p,e),f=!i&&!aa(p);(o.length?h+d>n:r+h+d>n)?h?(s||l)&&(f?(s||(s=l,l="",h=u=0),o.push(s),a.push(h-u),l+=p,s="",h=u+=d):(l&&(s+=l,l="",u=0),o.push(s),a.push(h),s=p,h=d)):f?(o.push(l),a.push(u),l=p,u=d):(o.push(p),a.push(d)):(h+=d,f?(l+=p,u+=d):(l&&(s+=l,l="",u=0),s+=p))}else l&&(s+=l,h+=u),o.push(s),a.push(h),s="",l="",u=0,h=0}return o.length||s||(s=t,l="",u=0),l&&(s+=l),s&&(o.push(s),a.push(h)),1===o.length&&(h+=r),{accumWidth:h,lines:o,linesWidths:a}}var la="__zr_style_"+Math.round(10*Math.random()),ua={shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,shadowColor:"#000",opacity:1,blend:"source-over"},ha={style:{shadowBlur:!0,shadowOffsetX:!0,shadowOffsetY:!0,shadowColor:!0,opacity:!0}};ua[la]=!0;var ca=["z","z2","invisible"],pa=["invisible"],da=function(t){function e(e){return t.call(this,e)||this}var i;return n(e,t),e.prototype._init=function(e){for(var n=G(e),i=0;i<n.length;i++){var r=n[i];"style"===r?this.useStyle(e[r]):t.prototype.attrKV.call(this,r,e[r])}this.style||this.useStyle({})},e.prototype.beforeBrush=function(){},e.prototype.afterBrush=function(){},e.prototype.innerBeforeBrush=function(){},e.prototype.innerAfterBrush=function(){},e.prototype.shouldBePainted=function(t,e,n,i){var r=this.transform;if(this.ignore||this.invisible||0===this.style.opacity||this.culling&&function(t,e,n){fa.copy(t.getBoundingRect()),t.transform&&fa.applyTransform(t.transform);return ga.width=e,ga.height=n,!fa.intersect(ga)}(this,t,e)||r&&!r[0]&&!r[3])return!1;if(n&&this.__clipPaths)for(var o=0;o<this.__clipPaths.length;++o)if(this.__clipPaths[o].isZeroArea())return!1;if(i&&this.parent)for(var a=this.parent;a;){if(a.ignore)return!1;a=a.parent}return!0},e.prototype.contain=function(t,e){return this.rectContain(t,e)},e.prototype.traverse=function(t,e){t.call(e,this)},e.prototype.rectContain=function(t,e){var n=this.transformCoordToLocal(t,e);return this.getBoundingRect().contain(n[0],n[1])},e.prototype.getPaintRect=function(){var t=this._paintRect;if(!this._paintRect||this.__dirty){var e=this.transform,n=this.getBoundingRect(),i=this.style,r=i.shadowBlur||0,o=i.shadowOffsetX||0,a=i.shadowOffsetY||0;t=this._paintRect||(this._paintRect=new sr(0,0,0,0)),e?sr.applyTransform(t,n,e):t.copy(n),(r||o||a)&&(t.width+=2*r+Math.abs(o),t.height+=2*r+Math.abs(a),t.x=Math.min(t.x,t.x+o-r),t.y=Math.min(t.y,t.y+a-r));var s=this.dirtyRectTolerance;t.isZero()||(t.x=Math.floor(t.x-s),t.y=Math.floor(t.y-s),t.width=Math.ceil(t.width+1+2*s),t.height=Math.ceil(t.height+1+2*s))}return t},e.prototype.setPrevPaintRect=function(t){t?(this._prevPaintRect=this._prevPaintRect||new sr(0,0,0,0),this._prevPaintRect.copy(t)):this._prevPaintRect=null},e.prototype.getPrevPaintRect=function(){return this._prevPaintRect},e.prototype.animateStyle=function(t){return this.animate("style",t)},e.prototype.updateDuringAnimation=function(t){"style"===t?this.dirtyStyle():this.markRedraw()},e.prototype.attrKV=function(e,n){"style"!==e?t.prototype.attrKV.call(this,e,n):this.style?this.setStyle(n):this.useStyle(n)},e.prototype.setStyle=function(t,e){return"string"==typeof t?this.style[t]=e:A(this.style,t),this.dirtyStyle(),this},e.prototype.dirtyStyle=function(t){t||this.markRedraw(),this.__dirty|=2,this._rect&&(this._rect=null)},e.prototype.dirty=function(){this.dirtyStyle()},e.prototype.styleChanged=function(){return!!(2&this.__dirty)},e.prototype.styleUpdated=function(){this.__dirty&=-3},e.prototype.createStyle=function(t){return yt(ua,t)},e.prototype.useStyle=function(t){t[la]||(t=this.createStyle(t)),this.__inHover?this.__hoverStyle=t:this.style=t,this.dirtyStyle()},e.prototype.isStyleObject=function(t){return t[la]},e.prototype._innerSaveToNormal=function(e){t.prototype._innerSaveToNormal.call(this,e);var n=this._normalState;e.style&&!n.style&&(n.style=this._mergeStyle(this.createStyle(),this.style)),this._savePrimaryToNormal(e,n,ca)},e.prototype._applyStateObj=function(e,n,i,r,o,a){t.prototype._applyStateObj.call(this,e,n,i,r,o,a);var s,l=!(n&&r);if(n&&n.style?o?r?s=n.style:(s=this._mergeStyle(this.createStyle(),i.style),this._mergeStyle(s,n.style)):(s=this._mergeStyle(this.createStyle(),r?this.style:i.style),this._mergeStyle(s,n.style)):l&&(s=i.style),s)if(o){var u=this.style;if(this.style=this.createStyle(l?{}:u),l)for(var h=G(u),c=0;c<h.length;c++){(d=h[c])in s&&(s[d]=s[d],this.style[d]=u[d])}var p=G(s);for(c=0;c<p.length;c++){var d=p[c];this.style[d]=this.style[d]}this._transitionState(e,{style:s},a,this.getAnimationStyleProps())}else this.useStyle(s);var f=this.__inHover?pa:ca;for(c=0;c<f.length;c++){d=f[c];n&&null!=n[d]?this[d]=n[d]:l&&null!=i[d]&&(this[d]=i[d])}},e.prototype._mergeStates=function(e){for(var n,i=t.prototype._mergeStates.call(this,e),r=0;r<e.length;r++){var o=e[r];o.style&&(n=n||{},this._mergeStyle(n,o.style))}return n&&(i.style=n),i},e.prototype._mergeStyle=function(t,e){return A(t,e),t},e.prototype.getAnimationStyleProps=function(){return ha},e.initDefaultProps=((i=e.prototype).type="displayable",i.invisible=!1,i.z=0,i.z2=0,i.zlevel=0,i.culling=!1,i.cursor="pointer",i.rectHover=!1,i.incremental=!1,i._rect=null,i.dirtyRectTolerance=0,void(i.__dirty=3)),e}(wr),fa=new sr(0,0,0,0),ga=new sr(0,0,0,0);var ya=Math.min,va=Math.max,ma=Math.sin,xa=Math.cos,_a=2*Math.PI,ba=wt(),wa=wt(),Sa=wt();function Ma(t,e,n){if(0!==t.length){for(var i=t[0],r=i[0],o=i[0],a=i[1],s=i[1],l=1;l<t.length;l++)i=t[l],r=ya(r,i[0]),o=va(o,i[0]),a=ya(a,i[1]),s=va(s,i[1]);e[0]=r,e[1]=a,n[0]=o,n[1]=s}}function Ia(t,e,n,i,r,o){r[0]=ya(t,n),r[1]=ya(e,i),o[0]=va(t,n),o[1]=va(e,i)}var Ta=[],Ca=[];function Da(t,e,n,i,r,o,a,s,l,u){var h=Xe,c=He,p=h(t,n,r,a,Ta);l[0]=1/0,l[1]=1/0,u[0]=-1/0,u[1]=-1/0;for(var d=0;d<p;d++){var f=c(t,n,r,a,Ta[d]);l[0]=ya(f,l[0]),u[0]=va(f,u[0])}p=h(e,i,o,s,Ca);for(d=0;d<p;d++){var g=c(e,i,o,s,Ca[d]);l[1]=ya(g,l[1]),u[1]=va(g,u[1])}l[0]=ya(t,l[0]),u[0]=va(t,u[0]),l[0]=ya(a,l[0]),u[0]=va(a,u[0]),l[1]=ya(e,l[1]),u[1]=va(e,u[1]),l[1]=ya(s,l[1]),u[1]=va(s,u[1])}function Aa(t,e,n,i,r,o,a,s){var l=Je,u=Ke,h=va(ya(l(t,n,r),1),0),c=va(ya(l(e,i,o),1),0),p=u(t,n,r,h),d=u(e,i,o,c);a[0]=ya(t,r,p),a[1]=ya(e,o,d),s[0]=va(t,r,p),s[1]=va(e,o,d)}function ka(t,e,n,i,r,o,a,s,l){var u=Gt,h=Wt,c=Math.abs(r-o);if(c%_a<1e-4&&c>1e-4)return s[0]=t-n,s[1]=e-i,l[0]=t+n,void(l[1]=e+i);if(ba[0]=xa(r)*n+t,ba[1]=ma(r)*i+e,wa[0]=xa(o)*n+t,wa[1]=ma(o)*i+e,u(s,ba,wa),h(l,ba,wa),(r%=_a)<0&&(r+=_a),(o%=_a)<0&&(o+=_a),r>o&&!a?o+=_a:r<o&&a&&(r+=_a),a){var p=o;o=r,r=p}for(var d=0;d<o;d+=Math.PI/2)d>r&&(Sa[0]=xa(d)*n+t,Sa[1]=ma(d)*i+e,u(s,Sa,s),h(l,Sa,l))}var La={M:1,L:2,C:3,Q:4,A:5,Z:6,R:7},Pa=[],Oa=[],Ra=[],Na=[],Ea=[],za=[],Va=Math.min,Ba=Math.max,Fa=Math.cos,Ga=Math.sin,Wa=Math.abs,Ha=Math.PI,Ya=2*Ha,Ua="undefined"!=typeof Float32Array,Xa=[];function Za(t){return Math.round(t/Ha*1e8)/1e8%2*Ha}var ja=function(){function t(t){this.dpr=1,this._xi=0,this._yi=0,this._x0=0,this._y0=0,this._len=0,t&&(this._saveData=!1),this._saveData&&(this.data=[])}return t.prototype.increaseVersion=function(){this._version++},t.prototype.getVersion=function(){return this._version},t.prototype.setScale=function(t,e,n){(n=n||0)>0&&(this._ux=Wa(n/Ai/t)||0,this._uy=Wa(n/Ai/e)||0)},t.prototype.setDPR=function(t){this.dpr=t},t.prototype.setContext=function(t){this._ctx=t},t.prototype.getContext=function(){return this._ctx},t.prototype.beginPath=function(){return this._ctx&&this._ctx.beginPath(),this.reset(),this},t.prototype.reset=function(){this._saveData&&(this._len=0),this._pathSegLen&&(this._pathSegLen=null,this._pathLen=0),this._version++},t.prototype.moveTo=function(t,e){return this._drawPendingPt(),this.addData(La.M,t,e),this._ctx&&this._ctx.moveTo(t,e),this._x0=t,this._y0=e,this._xi=t,this._yi=e,this},t.prototype.lineTo=function(t,e){var n=Wa(t-this._xi),i=Wa(e-this._yi),r=n>this._ux||i>this._uy;if(this.addData(La.L,t,e),this._ctx&&r&&this._ctx.lineTo(t,e),r)this._xi=t,this._yi=e,this._pendingPtDist=0;else{var o=n*n+i*i;o>this._pendingPtDist&&(this._pendingPtX=t,this._pendingPtY=e,this._pendingPtDist=o)}return this},t.prototype.bezierCurveTo=function(t,e,n,i,r,o){return this._drawPendingPt(),this.addData(La.C,t,e,n,i,r,o),this._ctx&&this._ctx.bezierCurveTo(t,e,n,i,r,o),this._xi=r,this._yi=o,this},t.prototype.quadraticCurveTo=function(t,e,n,i){return this._drawPendingPt(),this.addData(La.Q,t,e,n,i),this._ctx&&this._ctx.quadraticCurveTo(t,e,n,i),this._xi=n,this._yi=i,this},t.prototype.arc=function(t,e,n,i,r,o){this._drawPendingPt(),Xa[0]=i,Xa[1]=r,function(t,e){var n=Za(t[0]);n<0&&(n+=Ya);var i=n-t[0],r=t[1];r+=i,!e&&r-n>=Ya?r=n+Ya:e&&n-r>=Ya?r=n-Ya:!e&&n>r?r=n+(Ya-Za(n-r)):e&&n<r&&(r=n-(Ya-Za(r-n))),t[0]=n,t[1]=r}(Xa,o),i=Xa[0];var a=(r=Xa[1])-i;return this.addData(La.A,t,e,n,n,i,a,0,o?0:1),this._ctx&&this._ctx.arc(t,e,n,i,r,o),this._xi=Fa(r)*n+t,this._yi=Ga(r)*n+e,this},t.prototype.arcTo=function(t,e,n,i,r){return this._drawPendingPt(),this._ctx&&this._ctx.arcTo(t,e,n,i,r),this},t.prototype.rect=function(t,e,n,i){return this._drawPendingPt(),this._ctx&&this._ctx.rect(t,e,n,i),this.addData(La.R,t,e,n,i),this},t.prototype.closePath=function(){this._drawPendingPt(),this.addData(La.Z);var t=this._ctx,e=this._x0,n=this._y0;return t&&t.closePath(),this._xi=e,this._yi=n,this},t.prototype.fill=function(t){t&&t.fill(),this.toStatic()},t.prototype.stroke=function(t){t&&t.stroke(),this.toStatic()},t.prototype.len=function(){return this._len},t.prototype.setData=function(t){var e=t.length;this.data&&this.data.length===e||!Ua||(this.data=new Float32Array(e));for(var n=0;n<e;n++)this.data[n]=t[n];this._len=e},t.prototype.appendPath=function(t){t instanceof Array||(t=[t]);for(var e=t.length,n=0,i=this._len,r=0;r<e;r++)n+=t[r].len();Ua&&this.data instanceof Float32Array&&(this.data=new Float32Array(i+n));for(r=0;r<e;r++)for(var o=t[r].data,a=0;a<o.length;a++)this.data[i++]=o[a];this._len=i},t.prototype.addData=function(t,e,n,i,r,o,a,s,l){if(this._saveData){var u=this.data;this._len+arguments.length>u.length&&(this._expandData(),u=this.data);for(var h=0;h<arguments.length;h++)u[this._len++]=arguments[h]}},t.prototype._drawPendingPt=function(){this._pendingPtDist>0&&(this._ctx&&this._ctx.lineTo(this._pendingPtX,this._pendingPtY),this._pendingPtDist=0)},t.prototype._expandData=function(){if(!(this.data instanceof Array)){for(var t=[],e=0;e<this._len;e++)t[e]=this.data[e];this.data=t}},t.prototype.toStatic=function(){if(this._saveData){this._drawPendingPt();var t=this.data;t instanceof Array&&(t.length=this._len,Ua&&this._len>11&&(this.data=new Float32Array(t)))}},t.prototype.getBoundingRect=function(){Ra[0]=Ra[1]=Ea[0]=Ea[1]=Number.MAX_VALUE,Na[0]=Na[1]=za[0]=za[1]=-Number.MAX_VALUE;var t,e=this.data,n=0,i=0,r=0,o=0;for(t=0;t<this._len;){var a=e[t++],s=1===t;switch(s&&(r=n=e[t],o=i=e[t+1]),a){case La.M:n=r=e[t++],i=o=e[t++],Ea[0]=r,Ea[1]=o,za[0]=r,za[1]=o;break;case La.L:Ia(n,i,e[t],e[t+1],Ea,za),n=e[t++],i=e[t++];break;case La.C:Da(n,i,e[t++],e[t++],e[t++],e[t++],e[t],e[t+1],Ea,za),n=e[t++],i=e[t++];break;case La.Q:Aa(n,i,e[t++],e[t++],e[t],e[t+1],Ea,za),n=e[t++],i=e[t++];break;case La.A:var l=e[t++],u=e[t++],h=e[t++],c=e[t++],p=e[t++],d=e[t++]+p;t+=1;var f=!e[t++];s&&(r=Fa(p)*h+l,o=Ga(p)*c+u),ka(l,u,h,c,p,d,f,Ea,za),n=Fa(d)*h+l,i=Ga(d)*c+u;break;case La.R:Ia(r=n=e[t++],o=i=e[t++],r+e[t++],o+e[t++],Ea,za);break;case La.Z:n=r,i=o}Gt(Ra,Ra,Ea),Wt(Na,Na,za)}return 0===t&&(Ra[0]=Ra[1]=Na[0]=Na[1]=0),new sr(Ra[0],Ra[1],Na[0]-Ra[0],Na[1]-Ra[1])},t.prototype._calculateLength=function(){var t=this.data,e=this._len,n=this._ux,i=this._uy,r=0,o=0,a=0,s=0;this._pathSegLen||(this._pathSegLen=[]);for(var l=this._pathSegLen,u=0,h=0,c=0;c<e;){var p=t[c++],d=1===c;d&&(a=r=t[c],s=o=t[c+1]);var f=-1;switch(p){case La.M:r=a=t[c++],o=s=t[c++];break;case La.L:var g=t[c++],y=(x=t[c++])-o;(Wa(A=g-r)>n||Wa(y)>i||c===e-1)&&(f=Math.sqrt(A*A+y*y),r=g,o=x);break;case La.C:var v=t[c++],m=t[c++],x=(g=t[c++],t[c++]),_=t[c++],b=t[c++];f=qe(r,o,v,m,g,x,_,b,10),r=_,o=b;break;case La.Q:f=en(r,o,v=t[c++],m=t[c++],g=t[c++],x=t[c++],10),r=g,o=x;break;case La.A:var w=t[c++],S=t[c++],M=t[c++],I=t[c++],T=t[c++],C=t[c++],D=C+T;c+=1;t[c++];d&&(a=Fa(T)*M+w,s=Ga(T)*I+S),f=Ba(M,I)*Va(Ya,Math.abs(C)),r=Fa(D)*M+w,o=Ga(D)*I+S;break;case La.R:a=r=t[c++],s=o=t[c++],f=2*t[c++]+2*t[c++];break;case La.Z:var A=a-r;y=s-o;f=Math.sqrt(A*A+y*y),r=a,o=s}f>=0&&(l[h++]=f,u+=f)}return this._pathLen=u,u},t.prototype.rebuildPath=function(t,e){var n,i,r,o,a,s,l,u,h,c,p=this.data,d=this._ux,f=this._uy,g=this._len,y=e<1,v=0,m=0,x=0;if(!y||(this._pathSegLen||this._calculateLength(),l=this._pathSegLen,u=e*this._pathLen))t:for(var _=0;_<g;){var b=p[_++],w=1===_;switch(w&&(n=r=p[_],i=o=p[_+1]),b!==La.L&&x>0&&(t.lineTo(h,c),x=0),b){case La.M:n=r=p[_++],i=o=p[_++],t.moveTo(r,o);break;case La.L:a=p[_++],s=p[_++];var S=Wa(a-r),M=Wa(s-o);if(S>d||M>f){if(y){if(v+(j=l[m++])>u){var I=(u-v)/j;t.lineTo(r*(1-I)+a*I,o*(1-I)+s*I);break t}v+=j}t.lineTo(a,s),r=a,o=s,x=0}else{var T=S*S+M*M;T>x&&(h=a,c=s,x=T)}break;case La.C:var C=p[_++],D=p[_++],A=p[_++],k=p[_++],L=p[_++],P=p[_++];if(y){if(v+(j=l[m++])>u){Ze(r,C,A,L,I=(u-v)/j,Pa),Ze(o,D,k,P,I,Oa),t.bezierCurveTo(Pa[1],Oa[1],Pa[2],Oa[2],Pa[3],Oa[3]);break t}v+=j}t.bezierCurveTo(C,D,A,k,L,P),r=L,o=P;break;case La.Q:C=p[_++],D=p[_++],A=p[_++],k=p[_++];if(y){if(v+(j=l[m++])>u){Qe(r,C,A,I=(u-v)/j,Pa),Qe(o,D,k,I,Oa),t.quadraticCurveTo(Pa[1],Oa[1],Pa[2],Oa[2]);break t}v+=j}t.quadraticCurveTo(C,D,A,k),r=A,o=k;break;case La.A:var O=p[_++],R=p[_++],N=p[_++],E=p[_++],z=p[_++],V=p[_++],B=p[_++],F=!p[_++],G=N>E?N:E,W=Wa(N-E)>.001,H=z+V,Y=!1;if(y)v+(j=l[m++])>u&&(H=z+V*(u-v)/j,Y=!0),v+=j;if(W&&t.ellipse?t.ellipse(O,R,N,E,B,z,H,F):t.arc(O,R,G,z,H,F),Y)break t;w&&(n=Fa(z)*N+O,i=Ga(z)*E+R),r=Fa(H)*N+O,o=Ga(H)*E+R;break;case La.R:n=r=p[_],i=o=p[_+1],a=p[_++],s=p[_++];var U=p[_++],X=p[_++];if(y){if(v+(j=l[m++])>u){var Z=u-v;t.moveTo(a,s),t.lineTo(a+Va(Z,U),s),(Z-=U)>0&&t.lineTo(a+U,s+Va(Z,X)),(Z-=X)>0&&t.lineTo(a+Ba(U-Z,0),s+X),(Z-=U)>0&&t.lineTo(a,s+Ba(X-Z,0));break t}v+=j}t.rect(a,s,U,X);break;case La.Z:if(y){var j;if(v+(j=l[m++])>u){I=(u-v)/j;t.lineTo(r*(1-I)+n*I,o*(1-I)+i*I);break t}v+=j}t.closePath(),r=n,o=i}}},t.prototype.clone=function(){var e=new t,n=this.data;return e.data=n.slice?n.slice():Array.prototype.slice.call(n),e._len=this._len,e},t.CMD=La,t.initDefaultProps=function(){var e=t.prototype;e._saveData=!0,e._ux=0,e._uy=0,e._pendingPtDist=0,e._version=0}(),t}();function qa(t,e,n,i,r,o,a){if(0===r)return!1;var s=r,l=0;if(a>e+s&&a>i+s||a<e-s&&a<i-s||o>t+s&&o>n+s||o<t-s&&o<n-s)return!1;if(t===n)return Math.abs(o-t)<=s/2;var u=(l=(e-i)/(t-n))*o-a+(t*i-n*e)/(t-n);return u*u/(l*l+1)<=s/2*s/2}function Ka(t,e,n,i,r,o,a,s,l,u,h){if(0===l)return!1;var c=l;return!(h>e+c&&h>i+c&&h>o+c&&h>s+c||h<e-c&&h<i-c&&h<o-c&&h<s-c||u>t+c&&u>n+c&&u>r+c&&u>a+c||u<t-c&&u<n-c&&u<r-c&&u<a-c)&&je(t,e,n,i,r,o,a,s,u,h,null)<=c/2}function $a(t,e,n,i,r,o,a,s,l){if(0===a)return!1;var u=a;return!(l>e+u&&l>i+u&&l>o+u||l<e-u&&l<i-u&&l<o-u||s>t+u&&s>n+u&&s>r+u||s<t-u&&s<n-u&&s<r-u)&&tn(t,e,n,i,r,o,s,l,null)<=u/2}var Ja=2*Math.PI;function Qa(t){return(t%=Ja)<0&&(t+=Ja),t}var ts=2*Math.PI;function es(t,e,n,i,r,o,a,s,l){if(0===a)return!1;var u=a;s-=t,l-=e;var h=Math.sqrt(s*s+l*l);if(h-u>n||h+u<n)return!1;if(Math.abs(i-r)%ts<1e-4)return!0;if(o){var c=i;i=Qa(r),r=Qa(c)}else i=Qa(i),r=Qa(r);i>r&&(r+=ts);var p=Math.atan2(l,s);return p<0&&(p+=ts),p>=i&&p<=r||p+ts>=i&&p+ts<=r}function ns(t,e,n,i,r,o){if(o>e&&o>i||o<e&&o<i)return 0;if(i===e)return 0;var a=(o-e)/(i-e),s=i<e?1:-1;1!==a&&0!==a||(s=i<e?.5:-.5);var l=a*(n-t)+t;return l===r?1/0:l>r?s:0}var is=ja.CMD,rs=2*Math.PI;var os=[-1,-1,-1],as=[-1,-1];function ss(t,e,n,i,r,o,a,s,l,u){if(u>e&&u>i&&u>o&&u>s||u<e&&u<i&&u<o&&u<s)return 0;var h,c=Ue(e,i,o,s,u,os);if(0===c)return 0;for(var p=0,d=-1,f=void 0,g=void 0,y=0;y<c;y++){var v=os[y],m=0===v||1===v?.5:1;He(t,n,r,a,v)<l||(d<0&&(d=Xe(e,i,o,s,as),as[1]<as[0]&&d>1&&(h=void 0,h=as[0],as[0]=as[1],as[1]=h),f=He(e,i,o,s,as[0]),d>1&&(g=He(e,i,o,s,as[1]))),2===d?v<as[0]?p+=f<e?m:-m:v<as[1]?p+=g<f?m:-m:p+=s<g?m:-m:v<as[0]?p+=f<e?m:-m:p+=s<f?m:-m)}return p}function ls(t,e,n,i,r,o,a,s){if(s>e&&s>i&&s>o||s<e&&s<i&&s<o)return 0;var l=function(t,e,n,i,r){var o=t-2*e+n,a=2*(e-t),s=t-i,l=0;if(Ge(o))We(a)&&(h=-s/a)>=0&&h<=1&&(r[l++]=h);else{var u=a*a-4*o*s;if(Ge(u))(h=-a/(2*o))>=0&&h<=1&&(r[l++]=h);else if(u>0){var h,c=Oe(u),p=(-a-c)/(2*o);(h=(-a+c)/(2*o))>=0&&h<=1&&(r[l++]=h),p>=0&&p<=1&&(r[l++]=p)}}return l}(e,i,o,s,os);if(0===l)return 0;var u=Je(e,i,o);if(u>=0&&u<=1){for(var h=0,c=Ke(e,i,o,u),p=0;p<l;p++){var d=0===os[p]||1===os[p]?.5:1;Ke(t,n,r,os[p])<a||(os[p]<u?h+=c<e?d:-d:h+=o<c?d:-d)}return h}d=0===os[0]||1===os[0]?.5:1;return Ke(t,n,r,os[0])<a?0:o<e?d:-d}function us(t,e,n,i,r,o,a,s){if((s-=e)>n||s<-n)return 0;var l=Math.sqrt(n*n-s*s);os[0]=-l,os[1]=l;var u=Math.abs(i-r);if(u<1e-4)return 0;if(u>=rs-1e-4){i=0,r=rs;var h=o?1:-1;return a>=os[0]+t&&a<=os[1]+t?h:0}if(i>r){var c=i;i=r,r=c}i<0&&(i+=rs,r+=rs);for(var p=0,d=0;d<2;d++){var f=os[d];if(f+t>a){var g=Math.atan2(s,f);h=o?1:-1;g<0&&(g=rs+g),(g>=i&&g<=r||g+rs>=i&&g+rs<=r)&&(g>Math.PI/2&&g<1.5*Math.PI&&(h=-h),p+=h)}}return p}function hs(t,e,n,i,r){for(var o,a,s,l,u=t.data,h=t.len(),c=0,p=0,d=0,f=0,g=0,y=0;y<h;){var v=u[y++],m=1===y;switch(v===is.M&&y>1&&(n||(c+=ns(p,d,f,g,i,r))),m&&(f=p=u[y],g=d=u[y+1]),v){case is.M:p=f=u[y++],d=g=u[y++];break;case is.L:if(n){if(qa(p,d,u[y],u[y+1],e,i,r))return!0}else c+=ns(p,d,u[y],u[y+1],i,r)||0;p=u[y++],d=u[y++];break;case is.C:if(n){if(Ka(p,d,u[y++],u[y++],u[y++],u[y++],u[y],u[y+1],e,i,r))return!0}else c+=ss(p,d,u[y++],u[y++],u[y++],u[y++],u[y],u[y+1],i,r)||0;p=u[y++],d=u[y++];break;case is.Q:if(n){if($a(p,d,u[y++],u[y++],u[y],u[y+1],e,i,r))return!0}else c+=ls(p,d,u[y++],u[y++],u[y],u[y+1],i,r)||0;p=u[y++],d=u[y++];break;case is.A:var x=u[y++],_=u[y++],b=u[y++],w=u[y++],S=u[y++],M=u[y++];y+=1;var I=!!(1-u[y++]);o=Math.cos(S)*b+x,a=Math.sin(S)*w+_,m?(f=o,g=a):c+=ns(p,d,o,a,i,r);var T=(i-x)*w/b+x;if(n){if(es(x,_,w,S,S+M,I,e,T,r))return!0}else c+=us(x,_,w,S,S+M,I,T,r);p=Math.cos(S+M)*b+x,d=Math.sin(S+M)*w+_;break;case is.R:if(f=p=u[y++],g=d=u[y++],o=f+u[y++],a=g+u[y++],n){if(qa(f,g,o,g,e,i,r)||qa(o,g,o,a,e,i,r)||qa(o,a,f,a,e,i,r)||qa(f,a,f,g,e,i,r))return!0}else c+=ns(o,g,o,a,i,r),c+=ns(f,a,f,g,i,r);break;case is.Z:if(n){if(qa(p,d,f,g,e,i,r))return!0}else c+=ns(p,d,f,g,i,r);p=f,d=g}}return n||(s=d,l=g,Math.abs(s-l)<1e-4)||(c+=ns(p,d,f,g,i,r)||0),0!==c}var cs=k({fill:"#000",stroke:null,strokePercent:1,fillOpacity:1,strokeOpacity:1,lineDashOffset:0,lineWidth:1,lineCap:"butt",miterLimit:10,strokeNoScale:!1,strokeFirst:!1},ua),ps={style:k({fill:!0,stroke:!0,strokePercent:!0,fillOpacity:!0,strokeOpacity:!0,lineDashOffset:!0,lineWidth:!0,miterLimit:!0},ha.style)},ds=Ki.concat(["invisible","culling","z","z2","zlevel","parent"]),fs=function(t){function e(e){return t.call(this,e)||this}var i;return n(e,t),e.prototype.update=function(){var n=this;t.prototype.update.call(this);var i=this.style;if(i.decal){var r=this._decalEl=this._decalEl||new e;r.buildPath===e.prototype.buildPath&&(r.buildPath=function(t){n.buildPath(t,n.shape)}),r.silent=!0;var o=r.style;for(var a in i)o[a]!==i[a]&&(o[a]=i[a]);o.fill=i.fill?i.decal:null,o.decal=null,o.shadowColor=null,i.strokeFirst&&(o.stroke=null);for(var s=0;s<ds.length;++s)r[ds[s]]=this[ds[s]];r.__dirty|=1}else this._decalEl&&(this._decalEl=null)},e.prototype.getDecalElement=function(){return this._decalEl},e.prototype._init=function(e){var n=G(e);this.shape=this.getDefaultShape();var i=this.getDefaultStyle();i&&this.useStyle(i);for(var r=0;r<n.length;r++){var o=n[r],a=e[o];"style"===o?this.style?A(this.style,a):this.useStyle(a):"shape"===o?A(this.shape,a):t.prototype.attrKV.call(this,o,a)}this.style||this.useStyle({})},e.prototype.getDefaultStyle=function(){return null},e.prototype.getDefaultShape=function(){return{}},e.prototype.canBeInsideText=function(){return this.hasFill()},e.prototype.getInsideTextFill=function(){var t=this.style.fill;if("none"!==t){if(X(t)){var e=Ln(t,0);return e>.5?ki:e>.2?"#eee":Li}if(t)return Li}return ki},e.prototype.getInsideTextStroke=function(t){var e=this.style.fill;if(X(e)){var n=this.__zr;if(!(!n||!n.isDarkMode())===Ln(t,0)<.4)return e}},e.prototype.buildPath=function(t,e,n){},e.prototype.pathUpdated=function(){this.__dirty&=-5},e.prototype.getUpdatedPathProxy=function(t){return!this.path&&this.createPathProxy(),this.path.beginPath(),this.buildPath(this.path,this.shape,t),this.path},e.prototype.createPathProxy=function(){this.path=new ja(!1)},e.prototype.hasStroke=function(){var t=this.style,e=t.stroke;return!(null==e||"none"===e||!(t.lineWidth>0))},e.prototype.hasFill=function(){var t=this.style.fill;return null!=t&&"none"!==t},e.prototype.getBoundingRect=function(){var t=this._rect,e=this.style,n=!t;if(n){var i=!1;this.path||(i=!0,this.createPathProxy());var r=this.path;(i||4&this.__dirty)&&(r.beginPath(),this.buildPath(r,this.shape,!1),this.pathUpdated()),t=r.getBoundingRect()}if(this._rect=t,this.hasStroke()&&this.path&&this.path.len()>0){var o=this._rectStroke||(this._rectStroke=t.clone());if(this.__dirty||n){o.copy(t);var a=e.strokeNoScale?this.getLineScale():1,s=e.lineWidth;if(!this.hasFill()){var l=this.strokeContainThreshold;s=Math.max(s,null==l?4:l)}a>1e-10&&(o.width+=s/a,o.height+=s/a,o.x-=s/a/2,o.y-=s/a/2)}return o}return t},e.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect(),r=this.style;if(t=n[0],e=n[1],i.contain(t,e)){var o=this.path;if(this.hasStroke()){var a=r.lineWidth,s=r.strokeNoScale?this.getLineScale():1;if(s>1e-10&&(this.hasFill()||(a=Math.max(a,this.strokeContainThreshold)),function(t,e,n,i){return hs(t,e,!0,n,i)}(o,a/s,t,e)))return!0}if(this.hasFill())return function(t,e,n){return hs(t,0,!1,e,n)}(o,t,e)}return!1},e.prototype.dirtyShape=function(){this.__dirty|=4,this._rect&&(this._rect=null),this._decalEl&&this._decalEl.dirtyShape(),this.markRedraw()},e.prototype.dirty=function(){this.dirtyStyle(),this.dirtyShape()},e.prototype.animateShape=function(t){return this.animate("shape",t)},e.prototype.updateDuringAnimation=function(t){"style"===t?this.dirtyStyle():"shape"===t?this.dirtyShape():this.markRedraw()},e.prototype.attrKV=function(e,n){"shape"===e?this.setShape(n):t.prototype.attrKV.call(this,e,n)},e.prototype.setShape=function(t,e){var n=this.shape;return n||(n=this.shape={}),"string"==typeof t?n[t]=e:A(n,t),this.dirtyShape(),this},e.prototype.shapeChanged=function(){return!!(4&this.__dirty)},e.prototype.createStyle=function(t){return yt(cs,t)},e.prototype._innerSaveToNormal=function(e){t.prototype._innerSaveToNormal.call(this,e);var n=this._normalState;e.shape&&!n.shape&&(n.shape=A({},this.shape))},e.prototype._applyStateObj=function(e,n,i,r,o,a){t.prototype._applyStateObj.call(this,e,n,i,r,o,a);var s,l=!(n&&r);if(n&&n.shape?o?r?s=n.shape:(s=A({},i.shape),A(s,n.shape)):(s=A({},r?this.shape:i.shape),A(s,n.shape)):l&&(s=i.shape),s)if(o){this.shape=A({},this.shape);for(var u={},h=G(s),c=0;c<h.length;c++){var p=h[c];"object"==typeof s[p]?this.shape[p]=s[p]:u[p]=s[p]}this._transitionState(e,{shape:u},a)}else this.shape=s,this.dirtyShape()},e.prototype._mergeStates=function(e){for(var n,i=t.prototype._mergeStates.call(this,e),r=0;r<e.length;r++){var o=e[r];o.shape&&(n=n||{},this._mergeStyle(n,o.shape))}return n&&(i.shape=n),i},e.prototype.getAnimationStyleProps=function(){return ps},e.prototype.isZeroArea=function(){return!1},e.extend=function(t){var i=function(e){function i(n){var i=e.call(this,n)||this;return t.init&&t.init.call(i,n),i}return n(i,e),i.prototype.getDefaultStyle=function(){return T(t.style)},i.prototype.getDefaultShape=function(){return T(t.shape)},i}(e);for(var r in t)"function"==typeof t[r]&&(i.prototype[r]=t[r]);return i},e.initDefaultProps=((i=e.prototype).type="path",i.strokeContainThreshold=5,i.segmentIgnoreThreshold=0,i.subPixelOptimize=!1,i.autoBatch=!1,void(i.__dirty=7)),e}(da),gs=k({strokeFirst:!0,font:a,x:0,y:0,textAlign:"left",textBaseline:"top",miterLimit:2},cs),ys=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.hasStroke=function(){var t=this.style,e=t.stroke;return null!=e&&"none"!==e&&t.lineWidth>0},e.prototype.hasFill=function(){var t=this.style.fill;return null!=t&&"none"!==t},e.prototype.createStyle=function(t){return yt(gs,t)},e.prototype.setBoundingRect=function(t){this._rect=t},e.prototype.getBoundingRect=function(){var t=this.style;if(!this._rect){var e=t.text;null!=e?e+="":e="";var n=cr(e,t.font,t.textAlign,t.textBaseline);if(n.x+=t.x||0,n.y+=t.y||0,this.hasStroke()){var i=t.lineWidth;n.x-=i/2,n.y-=i/2,n.width+=i,n.height+=i}this._rect=n}return this._rect},e.initDefaultProps=void(e.prototype.dirtyRectTolerance=10),e}(da);ys.prototype.type="tspan";var vs=k({x:0,y:0},ua),ms={style:k({x:!0,y:!0,width:!0,height:!0,sx:!0,sy:!0,sWidth:!0,sHeight:!0},ha.style)};var xs=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.createStyle=function(t){return yt(vs,t)},e.prototype._getSize=function(t){var e=this.style,n=e[t];if(null!=n)return n;var i,r=(i=e.image)&&"string"!=typeof i&&i.width&&i.height?e.image:this.__image;if(!r)return 0;var o="width"===t?"height":"width",a=e[o];return null==a?r[t]:r[t]/r[o]*a},e.prototype.getWidth=function(){return this._getSize("width")},e.prototype.getHeight=function(){return this._getSize("height")},e.prototype.getAnimationStyleProps=function(){return ms},e.prototype.getBoundingRect=function(){var t=this.style;return this._rect||(this._rect=new sr(t.x||0,t.y||0,this.getWidth(),this.getHeight())),this._rect},e}(da);xs.prototype.type="image";var _s=Math.round;function bs(t,e,n){if(e){var i=e.x1,r=e.x2,o=e.y1,a=e.y2;t.x1=i,t.x2=r,t.y1=o,t.y2=a;var s=n&&n.lineWidth;return s?(_s(2*i)===_s(2*r)&&(t.x1=t.x2=Ss(i,s,!0)),_s(2*o)===_s(2*a)&&(t.y1=t.y2=Ss(o,s,!0)),t):t}}function ws(t,e,n){if(e){var i=e.x,r=e.y,o=e.width,a=e.height;t.x=i,t.y=r,t.width=o,t.height=a;var s=n&&n.lineWidth;return s?(t.x=Ss(i,s,!0),t.y=Ss(r,s,!0),t.width=Math.max(Ss(i+o,s,!1)-t.x,0===o?0:1),t.height=Math.max(Ss(r+a,s,!1)-t.y,0===a?0:1),t):t}}function Ss(t,e,n){if(!e)return t;var i=_s(2*t);return(i+_s(e))%2==0?i/2:(i+(n?1:-1))/2}var Ms=function(){this.x=0,this.y=0,this.width=0,this.height=0},Is={},Ts=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new Ms},e.prototype.buildPath=function(t,e){var n,i,r,o;if(this.subPixelOptimize){var a=ws(Is,e,this.style);n=a.x,i=a.y,r=a.width,o=a.height,a.r=e.r,e=a}else n=e.x,i=e.y,r=e.width,o=e.height;e.r?function(t,e){var n,i,r,o,a,s=e.x,l=e.y,u=e.width,h=e.height,c=e.r;u<0&&(s+=u,u=-u),h<0&&(l+=h,h=-h),"number"==typeof c?n=i=r=o=c:c instanceof Array?1===c.length?n=i=r=o=c[0]:2===c.length?(n=r=c[0],i=o=c[1]):3===c.length?(n=c[0],i=o=c[1],r=c[2]):(n=c[0],i=c[1],r=c[2],o=c[3]):n=i=r=o=0,n+i>u&&(n*=u/(a=n+i),i*=u/a),r+o>u&&(r*=u/(a=r+o),o*=u/a),i+r>h&&(i*=h/(a=i+r),r*=h/a),n+o>h&&(n*=h/(a=n+o),o*=h/a),t.moveTo(s+n,l),t.lineTo(s+u-i,l),0!==i&&t.arc(s+u-i,l+i,i,-Math.PI/2,0),t.lineTo(s+u,l+h-r),0!==r&&t.arc(s+u-r,l+h-r,r,0,Math.PI/2),t.lineTo(s+o,l+h),0!==o&&t.arc(s+o,l+h-o,o,Math.PI/2,Math.PI),t.lineTo(s,l+n),0!==n&&t.arc(s+n,l+n,n,Math.PI,1.5*Math.PI)}(t,e):t.rect(n,i,r,o)},e.prototype.isZeroArea=function(){return!this.shape.width||!this.shape.height},e}(fs);Ts.prototype.type="rect";var Cs={fill:"#000"},Ds={style:k({fill:!0,stroke:!0,fillOpacity:!0,strokeOpacity:!0,lineWidth:!0,fontSize:!0,lineHeight:!0,width:!0,height:!0,textShadowColor:!0,textShadowBlur:!0,textShadowOffsetX:!0,textShadowOffsetY:!0,backgroundColor:!0,padding:!0,borderColor:!0,borderWidth:!0,borderRadius:!0},ha.style)},As=function(t){function e(e){var n=t.call(this)||this;return n.type="text",n._children=[],n._defaultStyle=Cs,n.attr(e),n}return n(e,t),e.prototype.childrenRef=function(){return this._children},e.prototype.update=function(){t.prototype.update.call(this),this.styleChanged()&&this._updateSubTexts();for(var e=0;e<this._children.length;e++){var n=this._children[e];n.zlevel=this.zlevel,n.z=this.z,n.z2=this.z2,n.culling=this.culling,n.cursor=this.cursor,n.invisible=this.invisible}},e.prototype.updateTransform=function(){var e=this.innerTransformable;e?(e.updateTransform(),e.transform&&(this.transform=e.transform)):t.prototype.updateTransform.call(this)},e.prototype.getLocalTransform=function(e){var n=this.innerTransformable;return n?n.getLocalTransform(e):t.prototype.getLocalTransform.call(this,e)},e.prototype.getComputedTransform=function(){return this.__hostTarget&&(this.__hostTarget.getComputedTransform(),this.__hostTarget.updateInnerText(!0)),t.prototype.getComputedTransform.call(this)},e.prototype._updateSubTexts=function(){var t;this._childCursor=0,Es(t=this.style),E(t.rich,Es),this.style.rich?this._updateRichTexts():this._updatePlainTexts(),this._children.length=this._childCursor,this.styleUpdated()},e.prototype.addSelfToZr=function(e){t.prototype.addSelfToZr.call(this,e);for(var n=0;n<this._children.length;n++)this._children[n].__zr=e},e.prototype.removeSelfFromZr=function(e){t.prototype.removeSelfFromZr.call(this,e);for(var n=0;n<this._children.length;n++)this._children[n].__zr=null},e.prototype.getBoundingRect=function(){if(this.styleChanged()&&this._updateSubTexts(),!this._rect){for(var t=new sr(0,0,0,0),e=this._children,n=[],i=null,r=0;r<e.length;r++){var o=e[r],a=o.getBoundingRect(),s=o.getLocalTransform(n);s?(t.copy(a),t.applyTransform(s),(i=i||t.clone()).union(t)):(i=i||a.clone()).union(a)}this._rect=i||t}return this._rect},e.prototype.setDefaultTextStyle=function(t){this._defaultStyle=t||Cs},e.prototype.setTextContent=function(t){0},e.prototype._mergeStyle=function(t,e){if(!e)return t;var n=e.rich,i=t.rich||n&&{};return A(t,e),n&&i?(this._mergeRich(i,n),t.rich=i):i&&(t.rich=i),t},e.prototype._mergeRich=function(t,e){for(var n=G(e),i=0;i<n.length;i++){var r=n[i];t[r]=t[r]||{},A(t[r],e[r])}},e.prototype.getAnimationStyleProps=function(){return Ds},e.prototype._getOrCreateChild=function(t){var e=this._children[this._childCursor];return e&&e instanceof t||(e=new t),this._children[this._childCursor++]=e,e.__zr=this.__zr,e.parent=this,e},e.prototype._updatePlainTexts=function(){var t=this.style,e=t.font||a,n=t.padding,i=function(t,e){null!=t&&(t+="");var n,i=e.overflow,r=e.padding,o=e.font,a="truncate"===i,s=fr(o),l=rt(e.lineHeight,s),u=!!e.backgroundColor,h="truncate"===e.lineOverflow,c=e.width,p=(n=null==c||"break"!==i&&"breakAll"!==i?t?t.split("\n"):[]:t?sa(t,e.font,c,"breakAll"===i,0).lines:[]).length*l,d=rt(e.height,p);if(p>d&&h){var f=Math.floor(d/l);n=n.slice(0,f)}if(t&&a&&null!=c)for(var g=Jo(c,o,e.ellipsis,{minChar:e.truncateMinChar,placeholder:e.placeholder}),y=0;y<n.length;y++)n[y]=Qo(n[y],g);var v=d,m=0;for(y=0;y<n.length;y++)m=Math.max(ur(n[y],o),m);null==c&&(c=m);var x=m;return r&&(v+=r[0]+r[2],x+=r[1]+r[3],c+=r[1]+r[3]),u&&(x=c),{lines:n,height:d,outerWidth:x,outerHeight:v,lineHeight:l,calculatedLineHeight:s,contentWidth:m,contentHeight:p,width:c}}(Fs(t),t),r=Gs(t),o=!!t.backgroundColor,s=i.outerHeight,l=i.outerWidth,u=i.contentWidth,h=i.lines,c=i.lineHeight,p=this._defaultStyle,d=t.x||0,f=t.y||0,g=t.align||p.align||"left",y=t.verticalAlign||p.verticalAlign||"top",v=d,m=dr(f,i.contentHeight,y);if(r||n){var x=pr(d,l,g),_=dr(f,s,y);r&&this._renderBackground(t,t,x,_,l,s)}m+=c/2,n&&(v=Bs(d,g,n),"top"===y?m+=n[0]:"bottom"===y&&(m-=n[2]));for(var b=0,w=!1,S=(Vs("fill"in t?t.fill:(w=!0,p.fill))),M=(zs("stroke"in t?t.stroke:o||p.autoStroke&&!w?null:(b=2,p.stroke))),I=t.textShadowBlur>0,T=null!=t.width&&("truncate"===t.overflow||"break"===t.overflow||"breakAll"===t.overflow),C=i.calculatedLineHeight,D=0;D<h.length;D++){var A=this._getOrCreateChild(ys),k=A.createStyle();A.useStyle(k),k.text=h[D],k.x=v,k.y=m,g&&(k.textAlign=g),k.textBaseline="middle",k.opacity=t.opacity,k.strokeFirst=!0,I&&(k.shadowBlur=t.textShadowBlur||0,k.shadowColor=t.textShadowColor||"transparent",k.shadowOffsetX=t.textShadowOffsetX||0,k.shadowOffsetY=t.textShadowOffsetY||0),k.stroke=M,k.fill=S,M&&(k.lineWidth=t.lineWidth||b,k.lineDash=t.lineDash,k.lineDashOffset=t.lineDashOffset||0),k.font=e,Rs(k,t),m+=c,T&&A.setBoundingRect(new sr(pr(k.x,t.width,k.textAlign),dr(k.y,C,k.textBaseline),u,C))}},e.prototype._updateRichTexts=function(){var t=this.style,e=function(t,e){var n=new ia;if(null!=t&&(t+=""),!t)return n;for(var i,r=e.width,o=e.height,a=e.overflow,s="break"!==a&&"breakAll"!==a||null==r?null:{width:r,accumWidth:0,breakAll:"breakAll"===a},l=Ko.lastIndex=0;null!=(i=Ko.exec(t));){var u=i.index;u>l&&ra(n,t.substring(l,u),e,s),ra(n,i[2],e,s,i[1]),l=Ko.lastIndex}l<t.length&&ra(n,t.substring(l,t.length),e,s);var h=[],c=0,p=0,d=e.padding,f="truncate"===a,g="truncate"===e.lineOverflow;function y(t,e,n){t.width=e,t.lineHeight=n,c+=n,p=Math.max(p,e)}t:for(var v=0;v<n.lines.length;v++){for(var m=n.lines[v],x=0,_=0,b=0;b<m.tokens.length;b++){var w=(P=m.tokens[b]).styleName&&e.rich[P.styleName]||{},S=P.textPadding=w.padding,M=S?S[1]+S[3]:0,I=P.font=w.font||e.font;P.contentHeight=fr(I);var T=rt(w.height,P.contentHeight);if(P.innerHeight=T,S&&(T+=S[0]+S[2]),P.height=T,P.lineHeight=ot(w.lineHeight,e.lineHeight,T),P.align=w&&w.align||e.align,P.verticalAlign=w&&w.verticalAlign||"middle",g&&null!=o&&c+P.lineHeight>o){b>0?(m.tokens=m.tokens.slice(0,b),y(m,_,x),n.lines=n.lines.slice(0,v+1)):n.lines=n.lines.slice(0,v);break t}var C=w.width,D=null==C||"auto"===C;if("string"==typeof C&&"%"===C.charAt(C.length-1))P.percentWidth=C,h.push(P),P.contentWidth=ur(P.text,I);else{if(D){var A=w.backgroundColor,k=A&&A.image;k&&qo(k=Xo(k))&&(P.width=Math.max(P.width,k.width*T/k.height))}var L=f&&null!=r?r-_:null;null!=L&&L<P.width?!D||L<M?(P.text="",P.width=P.contentWidth=0):(P.text=$o(P.text,L-M,I,e.ellipsis,{minChar:e.truncateMinChar}),P.width=P.contentWidth=ur(P.text,I)):P.contentWidth=ur(P.text,I)}P.width+=M,_+=P.width,w&&(x=Math.max(x,P.lineHeight))}y(m,_,x)}for(n.outerWidth=n.width=rt(r,p),n.outerHeight=n.height=rt(o,c),n.contentHeight=c,n.contentWidth=p,d&&(n.outerWidth+=d[1]+d[3],n.outerHeight+=d[0]+d[2]),v=0;v<h.length;v++){var P,O=(P=h[v]).percentWidth;P.width=parseInt(O,10)/100*n.width}return n}(Fs(t),t),n=e.width,i=e.outerWidth,r=e.outerHeight,o=t.padding,a=t.x||0,s=t.y||0,l=this._defaultStyle,u=t.align||l.align,h=t.verticalAlign||l.verticalAlign,c=pr(a,i,u),p=dr(s,r,h),d=c,f=p;o&&(d+=o[3],f+=o[0]);var g=d+n;Gs(t)&&this._renderBackground(t,t,c,p,i,r);for(var y=!!t.backgroundColor,v=0;v<e.lines.length;v++){for(var m=e.lines[v],x=m.tokens,_=x.length,b=m.lineHeight,w=m.width,S=0,M=d,I=g,T=_-1,C=void 0;S<_&&(!(C=x[S]).align||"left"===C.align);)this._placeToken(C,t,b,f,M,"left",y),w-=C.width,M+=C.width,S++;for(;T>=0&&"right"===(C=x[T]).align;)this._placeToken(C,t,b,f,I,"right",y),w-=C.width,I-=C.width,T--;for(M+=(n-(M-d)-(g-I)-w)/2;S<=T;)C=x[S],this._placeToken(C,t,b,f,M+C.width/2,"center",y),M+=C.width,S++;f+=b}},e.prototype._placeToken=function(t,e,n,i,r,o,s){var l=e.rich[t.styleName]||{};l.text=t.text;var u=t.verticalAlign,h=i+n/2;"top"===u?h=i+t.height/2:"bottom"===u&&(h=i+n-t.height/2),!t.isLineHolder&&Gs(l)&&this._renderBackground(l,e,"right"===o?r-t.width:"center"===o?r-t.width/2:r,h-t.height/2,t.width,t.height);var c=!!l.backgroundColor,p=t.textPadding;p&&(r=Bs(r,o,p),h-=t.height/2-p[0]-t.innerHeight/2);var d=this._getOrCreateChild(ys),f=d.createStyle();d.useStyle(f);var g=this._defaultStyle,y=!1,v=0,m=Vs("fill"in l?l.fill:"fill"in e?e.fill:(y=!0,g.fill)),x=zs("stroke"in l?l.stroke:"stroke"in e?e.stroke:c||s||g.autoStroke&&!y?null:(v=2,g.stroke)),_=l.textShadowBlur>0||e.textShadowBlur>0;f.text=t.text,f.x=r,f.y=h,_&&(f.shadowBlur=l.textShadowBlur||e.textShadowBlur||0,f.shadowColor=l.textShadowColor||e.textShadowColor||"transparent",f.shadowOffsetX=l.textShadowOffsetX||e.textShadowOffsetX||0,f.shadowOffsetY=l.textShadowOffsetY||e.textShadowOffsetY||0),f.textAlign=o,f.textBaseline="middle",f.font=t.font||a,f.opacity=ot(l.opacity,e.opacity,1),Rs(f,l),x&&(f.lineWidth=ot(l.lineWidth,e.lineWidth,v),f.lineDash=rt(l.lineDash,e.lineDash),f.lineDashOffset=e.lineDashOffset||0,f.stroke=x),m&&(f.fill=m);var b=t.contentWidth,w=t.contentHeight;d.setBoundingRect(new sr(pr(f.x,b,f.textAlign),dr(f.y,w,f.textBaseline),b,w))},e.prototype._renderBackground=function(t,e,n,i,r,o){var a,s,l,u=t.backgroundColor,h=t.borderWidth,c=t.borderColor,p=u&&u.image,d=u&&!p,f=t.borderRadius,g=this;if(d||t.lineHeight||h&&c){(a=this._getOrCreateChild(Ts)).useStyle(a.createStyle()),a.style.fill=null;var y=a.shape;y.x=n,y.y=i,y.width=r,y.height=o,y.r=f,a.dirtyShape()}if(d)(l=a.style).fill=u||null,l.fillOpacity=rt(t.fillOpacity,1);else if(p){(s=this._getOrCreateChild(xs)).onload=function(){g.dirtyStyle()};var v=s.style;v.image=u.image,v.x=n,v.y=i,v.width=r,v.height=o}h&&c&&((l=a.style).lineWidth=h,l.stroke=c,l.strokeOpacity=rt(t.strokeOpacity,1),l.lineDash=t.borderDash,l.lineDashOffset=t.borderDashOffset||0,a.strokeContainThreshold=0,a.hasFill()&&a.hasStroke()&&(l.strokeFirst=!0,l.lineWidth*=2));var m=(a||s).style;m.shadowBlur=t.shadowBlur||0,m.shadowColor=t.shadowColor||"transparent",m.shadowOffsetX=t.shadowOffsetX||0,m.shadowOffsetY=t.shadowOffsetY||0,m.opacity=ot(t.opacity,e.opacity,1)},e.makeFont=function(t){var e="";return Ns(t)&&(e=[t.fontStyle,t.fontWeight,Os(t.fontSize),t.fontFamily||"sans-serif"].join(" ")),e&&ut(e)||t.textFont||t.font},e}(da),ks={left:!0,right:1,center:1},Ls={top:1,bottom:1,middle:1},Ps=["fontStyle","fontWeight","fontSize","fontFamily"];function Os(t){return"string"!=typeof t||-1===t.indexOf("px")&&-1===t.indexOf("rem")&&-1===t.indexOf("em")?isNaN(+t)?"12px":t+"px":t}function Rs(t,e){for(var n=0;n<Ps.length;n++){var i=Ps[n],r=e[i];null!=r&&(t[i]=r)}}function Ns(t){return null!=t.fontSize||t.fontFamily||t.fontWeight}function Es(t){if(t){t.font=As.makeFont(t);var e=t.align;"middle"===e&&(e="center"),t.align=null==e||ks[e]?e:"left";var n=t.verticalAlign;"center"===n&&(n="middle"),t.verticalAlign=null==n||Ls[n]?n:"top",t.padding&&(t.padding=st(t.padding))}}function zs(t,e){return null==t||e<=0||"transparent"===t||"none"===t?null:t.image||t.colorStops?"#000":t}function Vs(t){return null==t||"none"===t?null:t.image||t.colorStops?"#000":t}function Bs(t,e,n){return"right"===e?t-n[1]:"center"===e?t+n[3]/2-n[1]/2:t+n[3]}function Fs(t){var e=t.text;return null!=e&&(e+=""),e}function Gs(t){return!!(t.backgroundColor||t.lineHeight||t.borderWidth&&t.borderColor)}var Ws=So(),Hs=function(t,e,n,i){if(i){var r=Ws(i);r.dataIndex=n,r.dataType=e,r.seriesIndex=t,"group"===i.type&&i.traverse((function(i){var r=Ws(i);r.seriesIndex=t,r.dataIndex=n,r.dataType=e}))}},Ys=1,Us={},Xs=So(),Zs=So(),js=["emphasis","blur","select"],qs=["normal","emphasis","blur","select"],Ks=10,$s="highlight",Js="downplay",Qs="select",tl="unselect",el="toggleSelect";function nl(t){return null!=t&&"none"!==t}var il=new ln(100);function rl(t){if(X(t)){var e=il.get(t);return e||(e=Sn(t,-.1),il.put(t,e)),e}if(Q(t)){var n=A({},t);return n.colorStops=z(t.colorStops,(function(t){return{offset:t.offset,color:Sn(t.color,-.1)}})),n}return t}function ol(t,e,n){t.onHoverStateChange&&(t.hoverState||0)!==n&&t.onHoverStateChange(e),t.hoverState=n}function al(t){ol(t,"emphasis",2)}function sl(t){2===t.hoverState&&ol(t,"normal",0)}function ll(t){ol(t,"blur",1)}function ul(t){1===t.hoverState&&ol(t,"normal",0)}function hl(t){t.selected=!0}function cl(t){t.selected=!1}function pl(t,e,n){e(t,n)}function dl(t,e,n){pl(t,e,n),t.isGroup&&t.traverse((function(t){pl(t,e,n)}))}function fl(t,e){switch(e){case"emphasis":t.hoverState=2;break;case"normal":t.hoverState=0;break;case"blur":t.hoverState=1;break;case"select":t.selected=!0}}function gl(t,e){var n=this.states[t];if(this.style){if("emphasis"===t)return function(t,e,n,i){var r=n&&P(n,"select")>=0,o=!1;if(t instanceof fs){var a=Xs(t),s=r&&a.selectFill||a.normalFill,l=r&&a.selectStroke||a.normalStroke;if(nl(s)||nl(l)){var u=(i=i||{}).style||{};"inherit"===u.fill?(o=!0,i=A({},i),(u=A({},u)).fill=s):!nl(u.fill)&&nl(s)?(o=!0,i=A({},i),(u=A({},u)).fill=rl(s)):!nl(u.stroke)&&nl(l)&&(o||(i=A({},i),u=A({},u)),u.stroke=rl(l)),i.style=u}}if(i&&null==i.z2){o||(i=A({},i));var h=t.z2EmphasisLift;i.z2=t.z2+(null!=h?h:Ks)}return i}(this,0,e,n);if("blur"===t)return function(t,e,n){var i=P(t.currentStates,e)>=0,r=t.style.opacity,o=i?null:function(t,e,n,i){for(var r=t.style,o={},a=0;a<e.length;a++){var s=e[a],l=r[s];o[s]=null==l?i&&i[s]:l}for(a=0;a<t.animators.length;a++){var u=t.animators[a];u.__fromStateTransition&&u.__fromStateTransition.indexOf(n)<0&&"style"===u.targetName&&u.saveTo(o,e)}return o}(t,["opacity"],e,{opacity:1}),a=(n=n||{}).style||{};return null==a.opacity&&(n=A({},n),a=A({opacity:i?r:.1*o.opacity},a),n.style=a),n}(this,t,n);if("select"===t)return function(t,e,n){if(n&&null==n.z2){n=A({},n);var i=t.z2SelectLift;n.z2=t.z2+(null!=i?i:9)}return n}(this,0,n)}return n}function yl(t){t.stateProxy=gl;var e=t.getTextContent(),n=t.getTextGuideLine();e&&(e.stateProxy=gl),n&&(n.stateProxy=gl)}function vl(t,e){!Il(t,e)&&!t.__highByOuter&&dl(t,al)}function ml(t,e){!Il(t,e)&&!t.__highByOuter&&dl(t,sl)}function xl(t,e){t.__highByOuter|=1<<(e||0),dl(t,al)}function _l(t,e){!(t.__highByOuter&=~(1<<(e||0)))&&dl(t,sl)}function bl(t){dl(t,ll)}function wl(t){dl(t,ul)}function Sl(t){dl(t,hl)}function Ml(t){dl(t,cl)}function Il(t,e){return t.__highDownSilentOnTouch&&e.zrByTouch}function Tl(t){t.getModel().eachComponent((function(e,n){var i=Zs(n);i.isBlured&&("series"===e?t.getViewOfSeriesModel(n):t.getViewOfComponentModel(n)).group.traverse((function(t){ul(t)}));i.isBlured=!1}))}function Cl(t,e,n,i){var r=i.getModel();function o(t,e){for(var n=0;n<e.length;n++){var i=t.getItemGraphicEl(e[n]);i&&wl(i)}}if(n=n||"coordinateSystem",null!=t&&e&&"none"!==e){var a=r.getSeriesByIndex(t),s=a.coordinateSystem;s&&s.master&&(s=s.master);var l=[];r.eachSeries((function(t){var r=a===t,u=t.coordinateSystem;if(u&&u.master&&(u=u.master),!("series"===n&&!r||"coordinateSystem"===n&&!(u&&s?u===s:r)||"series"===e&&r)){if(i.getViewOfSeriesModel(t).group.traverse((function(t){ll(t)})),N(e))o(t.getData(),e);else if(q(e))for(var h=G(e),c=0;c<h.length;c++)o(t.getData(h[c]),e[h[c]]);l.push(t),Zs(t).isBlured=!0}})),r.eachComponent((function(t,e){if("series"!==t){var n=i.getViewOfComponentModel(e);n&&n.blurSeries&&n.blurSeries(l,r)}}))}}function Dl(t,e,n){if(null!=t&&null!=e){var i=n.getModel().getComponent(t,e);if(i){Zs(i).isBlured=!0;var r=n.getViewOfComponentModel(i);r&&r.focusBlurEnabled&&r.group.traverse((function(t){ll(t)}))}}}function Al(t,e,n,i){var r={focusSelf:!1,dispatchers:null};if(null==t||"series"===t||null==e||null==n)return r;var o=i.getModel().getComponent(t,e);if(!o)return r;var a=i.getViewOfComponentModel(o);if(!a||!a.findHighDownDispatchers)return r;for(var s,l=a.findHighDownDispatchers(n),u=0;u<l.length;u++)if("self"===Ws(l[u]).focus){s=!0;break}return{focusSelf:s,dispatchers:l}}function kl(t){E(t.getAllData(),(function(e){var n=e.data,i=e.type;n.eachItemGraphicEl((function(e,n){t.isSelected(n,i)?Sl(e):Ml(e)}))}))}function Ll(t){var e=[];return t.eachSeries((function(t){E(t.getAllData(),(function(n){n.data;var i=n.type,r=t.getSelectedDataIndices();if(r.length>0){var o={dataIndex:r,seriesIndex:t.seriesIndex};null!=i&&(o.dataType=i),e.push(o)}}))})),e}function Pl(t,e,n){Vl(t,!0),dl(t,yl),Rl(t,e,n)}function Ol(t,e,n,i){i?function(t){Vl(t,!1)}(t):Pl(t,e,n)}function Rl(t,e,n){var i=Ws(t);null!=e?(i.focus=e,i.blurScope=n):i.focus&&(i.focus=null)}var Nl=["emphasis","blur","select"],El={itemStyle:"getItemStyle",lineStyle:"getLineStyle",areaStyle:"getAreaStyle"};function zl(t,e,n,i){n=n||"itemStyle";for(var r=0;r<Nl.length;r++){var o=Nl[r],a=e.getModel([o,n]);t.ensureState(o).style=i?i(a):a[El[n]]()}}function Vl(t,e){var n=!1===e,i=t;t.highDownSilentOnTouch&&(i.__highDownSilentOnTouch=t.highDownSilentOnTouch),n&&!i.__highDownDispatcher||(i.__highByOuter=i.__highByOuter||0,i.__highDownDispatcher=!n)}function Bl(t){return!(!t||!t.__highDownDispatcher)}function Fl(t){var e=t.type;return e===Qs||e===tl||e===el}function Gl(t){var e=t.type;return e===$s||e===Js}var Wl=ja.CMD,Hl=[[],[],[]],Yl=Math.sqrt,Ul=Math.atan2;function Xl(t,e){if(e){var n,i,r,o,a,s,l=t.data,u=t.len(),h=Wl.M,c=Wl.C,p=Wl.L,d=Wl.R,f=Wl.A,g=Wl.Q;for(r=0,o=0;r<u;){switch(n=l[r++],o=r,i=0,n){case h:case p:i=1;break;case c:i=3;break;case g:i=2;break;case f:var y=e[4],v=e[5],m=Yl(e[0]*e[0]+e[1]*e[1]),x=Yl(e[2]*e[2]+e[3]*e[3]),_=Ul(-e[1]/x,e[0]/m);l[r]*=m,l[r++]+=y,l[r]*=x,l[r++]+=v,l[r++]*=m,l[r++]*=x,l[r++]+=_,l[r++]+=_,o=r+=2;break;case d:s[0]=l[r++],s[1]=l[r++],Ft(s,s,e),l[o++]=s[0],l[o++]=s[1],s[0]+=l[r++],s[1]+=l[r++],Ft(s,s,e),l[o++]=s[0],l[o++]=s[1]}for(a=0;a<i;a++){var b=Hl[a];b[0]=l[r++],b[1]=l[r++],Ft(b,b,e),l[o++]=b[0],l[o++]=b[1]}}t.increaseVersion()}}var Zl=Math.sqrt,jl=Math.sin,ql=Math.cos,Kl=Math.PI;function $l(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])}function Jl(t,e){return(t[0]*e[0]+t[1]*e[1])/($l(t)*$l(e))}function Ql(t,e){return(t[0]*e[1]<t[1]*e[0]?-1:1)*Math.acos(Jl(t,e))}function tu(t,e,n,i,r,o,a,s,l,u,h){var c=l*(Kl/180),p=ql(c)*(t-n)/2+jl(c)*(e-i)/2,d=-1*jl(c)*(t-n)/2+ql(c)*(e-i)/2,f=p*p/(a*a)+d*d/(s*s);f>1&&(a*=Zl(f),s*=Zl(f));var g=(r===o?-1:1)*Zl((a*a*(s*s)-a*a*(d*d)-s*s*(p*p))/(a*a*(d*d)+s*s*(p*p)))||0,y=g*a*d/s,v=g*-s*p/a,m=(t+n)/2+ql(c)*y-jl(c)*v,x=(e+i)/2+jl(c)*y+ql(c)*v,_=Ql([1,0],[(p-y)/a,(d-v)/s]),b=[(p-y)/a,(d-v)/s],w=[(-1*p-y)/a,(-1*d-v)/s],S=Ql(b,w);if(Jl(b,w)<=-1&&(S=Kl),Jl(b,w)>=1&&(S=0),S<0){var M=Math.round(S/Kl*1e6)/1e6;S=2*Kl+M%2*Kl}h.addData(u,m,x,a,s,_,S,c,o)}var eu=/([mlvhzcqtsa])([^mlvhzcqtsa]*)/gi,nu=/-?([0-9]*\.)?[0-9]+([eE]-?[0-9]+)?/g;var iu=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.applyTransform=function(t){},e}(fs);function ru(t){return null!=t.setData}function ou(t,e){var n=function(t){var e=new ja;if(!t)return e;var n,i=0,r=0,o=i,a=r,s=ja.CMD,l=t.match(eu);if(!l)return e;for(var u=0;u<l.length;u++){for(var h=l[u],c=h.charAt(0),p=void 0,d=h.match(nu)||[],f=d.length,g=0;g<f;g++)d[g]=parseFloat(d[g]);for(var y=0;y<f;){var v=void 0,m=void 0,x=void 0,_=void 0,b=void 0,w=void 0,S=void 0,M=i,I=r,T=void 0,C=void 0;switch(c){case"l":i+=d[y++],r+=d[y++],p=s.L,e.addData(p,i,r);break;case"L":i=d[y++],r=d[y++],p=s.L,e.addData(p,i,r);break;case"m":i+=d[y++],r+=d[y++],p=s.M,e.addData(p,i,r),o=i,a=r,c="l";break;case"M":i=d[y++],r=d[y++],p=s.M,e.addData(p,i,r),o=i,a=r,c="L";break;case"h":i+=d[y++],p=s.L,e.addData(p,i,r);break;case"H":i=d[y++],p=s.L,e.addData(p,i,r);break;case"v":r+=d[y++],p=s.L,e.addData(p,i,r);break;case"V":r=d[y++],p=s.L,e.addData(p,i,r);break;case"C":p=s.C,e.addData(p,d[y++],d[y++],d[y++],d[y++],d[y++],d[y++]),i=d[y-2],r=d[y-1];break;case"c":p=s.C,e.addData(p,d[y++]+i,d[y++]+r,d[y++]+i,d[y++]+r,d[y++]+i,d[y++]+r),i+=d[y-2],r+=d[y-1];break;case"S":v=i,m=r,T=e.len(),C=e.data,n===s.C&&(v+=i-C[T-4],m+=r-C[T-3]),p=s.C,M=d[y++],I=d[y++],i=d[y++],r=d[y++],e.addData(p,v,m,M,I,i,r);break;case"s":v=i,m=r,T=e.len(),C=e.data,n===s.C&&(v+=i-C[T-4],m+=r-C[T-3]),p=s.C,M=i+d[y++],I=r+d[y++],i+=d[y++],r+=d[y++],e.addData(p,v,m,M,I,i,r);break;case"Q":M=d[y++],I=d[y++],i=d[y++],r=d[y++],p=s.Q,e.addData(p,M,I,i,r);break;case"q":M=d[y++]+i,I=d[y++]+r,i+=d[y++],r+=d[y++],p=s.Q,e.addData(p,M,I,i,r);break;case"T":v=i,m=r,T=e.len(),C=e.data,n===s.Q&&(v+=i-C[T-4],m+=r-C[T-3]),i=d[y++],r=d[y++],p=s.Q,e.addData(p,v,m,i,r);break;case"t":v=i,m=r,T=e.len(),C=e.data,n===s.Q&&(v+=i-C[T-4],m+=r-C[T-3]),i+=d[y++],r+=d[y++],p=s.Q,e.addData(p,v,m,i,r);break;case"A":x=d[y++],_=d[y++],b=d[y++],w=d[y++],S=d[y++],tu(M=i,I=r,i=d[y++],r=d[y++],w,S,x,_,b,p=s.A,e);break;case"a":x=d[y++],_=d[y++],b=d[y++],w=d[y++],S=d[y++],tu(M=i,I=r,i+=d[y++],r+=d[y++],w,S,x,_,b,p=s.A,e)}}"z"!==c&&"Z"!==c||(p=s.Z,e.addData(p),i=o,r=a),n=p}return e.toStatic(),e}(t),i=A({},e);return i.buildPath=function(t){if(ru(t)){t.setData(n.data),(e=t.getContext())&&t.rebuildPath(e,1)}else{var e=t;n.rebuildPath(e,1)}},i.applyTransform=function(t){Xl(n,t),this.dirtyShape()},i}function au(t,e){return new iu(ou(t,e))}function su(t,e){e=e||{};var n=new fs;return t.shape&&n.setShape(t.shape),n.setStyle(t.style),e.bakeTransform?Xl(n.path,t.getComputedTransform()):e.toLocal?n.setLocalTransform(t.getComputedTransform()):n.copyTransform(t),n.buildPath=t.buildPath,n.applyTransform=n.applyTransform,n.z=t.z,n.z2=t.z2,n.zlevel=t.zlevel,n}var lu=function(){this.cx=0,this.cy=0,this.r=0},uu=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new lu},e.prototype.buildPath=function(t,e){t.moveTo(e.cx+e.r,e.cy),t.arc(e.cx,e.cy,e.r,0,2*Math.PI)},e}(fs);uu.prototype.type="circle";var hu=function(){this.cx=0,this.cy=0,this.rx=0,this.ry=0},cu=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new hu},e.prototype.buildPath=function(t,e){var n=.5522848,i=e.cx,r=e.cy,o=e.rx,a=e.ry,s=o*n,l=a*n;t.moveTo(i-o,r),t.bezierCurveTo(i-o,r-l,i-s,r-a,i,r-a),t.bezierCurveTo(i+s,r-a,i+o,r-l,i+o,r),t.bezierCurveTo(i+o,r+l,i+s,r+a,i,r+a),t.bezierCurveTo(i-s,r+a,i-o,r+l,i-o,r),t.closePath()},e}(fs);cu.prototype.type="ellipse";var pu=Math.PI,du=2*pu,fu=Math.sin,gu=Math.cos,yu=Math.acos,vu=Math.atan2,mu=Math.abs,xu=Math.sqrt,_u=Math.max,bu=Math.min,wu=1e-4;function Su(t,e,n,i,r,o,a){var s=t-n,l=e-i,u=(a?o:-o)/xu(s*s+l*l),h=u*l,c=-u*s,p=t+h,d=e+c,f=n+h,g=i+c,y=(p+f)/2,v=(d+g)/2,m=f-p,x=g-d,_=m*m+x*x,b=r-o,w=p*g-f*d,S=(x<0?-1:1)*xu(_u(0,b*b*_-w*w)),M=(w*x-m*S)/_,I=(-w*m-x*S)/_,T=(w*x+m*S)/_,C=(-w*m+x*S)/_,D=M-y,A=I-v,k=T-y,L=C-v;return D*D+A*A>k*k+L*L&&(M=T,I=C),{cx:M,cy:I,x0:-h,y0:-c,x1:M*(r/b-1),y1:I*(r/b-1)}}function Mu(t,e){var n,i=_u(e.r,0),r=_u(e.r0||0,0),o=i>0;if(o||r>0){if(o||(i=r,r=0),r>i){var a=i;i=r,r=a}var s=e.startAngle,l=e.endAngle;if(!isNaN(s)&&!isNaN(l)){var u=e.cx,h=e.cy,c=!!e.clockwise,p=mu(l-s),d=p>du&&p%du;if(d>wu&&(p=d),i>wu)if(p>du-wu)t.moveTo(u+i*gu(s),h+i*fu(s)),t.arc(u,h,i,s,l,!c),r>wu&&(t.moveTo(u+r*gu(l),h+r*fu(l)),t.arc(u,h,r,l,s,c));else{var f=void 0,g=void 0,y=void 0,v=void 0,m=void 0,x=void 0,_=void 0,b=void 0,w=void 0,S=void 0,M=void 0,I=void 0,T=void 0,C=void 0,D=void 0,A=void 0,k=i*gu(s),L=i*fu(s),P=r*gu(l),O=r*fu(l),R=p>wu;if(R){var N=e.cornerRadius;N&&(f=(n=function(t){var e;if(Y(t)){var n=t.length;if(!n)return t;e=1===n?[t[0],t[0],0,0]:2===n?[t[0],t[0],t[1],t[1]]:3===n?t.concat(t[2]):t}else e=[t,t,t,t];return e}(N))[0],g=n[1],y=n[2],v=n[3]);var E=mu(i-r)/2;if(m=bu(E,y),x=bu(E,v),_=bu(E,f),b=bu(E,g),M=w=_u(m,x),I=S=_u(_,b),(w>wu||S>wu)&&(T=i*gu(l),C=i*fu(l),D=r*gu(s),A=r*fu(s),p<pu)){var z=function(t,e,n,i,r,o,a,s){var l=n-t,u=i-e,h=a-r,c=s-o,p=c*l-h*u;if(!(p*p<wu))return[t+(p=(h*(e-o)-c*(t-r))/p)*l,e+p*u]}(k,L,D,A,T,C,P,O);if(z){var V=k-z[0],B=L-z[1],F=T-z[0],G=C-z[1],W=1/fu(yu((V*F+B*G)/(xu(V*V+B*B)*xu(F*F+G*G)))/2),H=xu(z[0]*z[0]+z[1]*z[1]);M=bu(w,(i-H)/(W+1)),I=bu(S,(r-H)/(W-1))}}}if(R)if(M>wu){var U=bu(y,M),X=bu(v,M),Z=Su(D,A,k,L,i,U,c),j=Su(T,C,P,O,i,X,c);t.moveTo(u+Z.cx+Z.x0,h+Z.cy+Z.y0),M<w&&U===X?t.arc(u+Z.cx,h+Z.cy,M,vu(Z.y0,Z.x0),vu(j.y0,j.x0),!c):(U>0&&t.arc(u+Z.cx,h+Z.cy,U,vu(Z.y0,Z.x0),vu(Z.y1,Z.x1),!c),t.arc(u,h,i,vu(Z.cy+Z.y1,Z.cx+Z.x1),vu(j.cy+j.y1,j.cx+j.x1),!c),X>0&&t.arc(u+j.cx,h+j.cy,X,vu(j.y1,j.x1),vu(j.y0,j.x0),!c))}else t.moveTo(u+k,h+L),t.arc(u,h,i,s,l,!c);else t.moveTo(u+k,h+L);if(r>wu&&R)if(I>wu){U=bu(f,I),Z=Su(P,O,T,C,r,-(X=bu(g,I)),c),j=Su(k,L,D,A,r,-U,c);t.lineTo(u+Z.cx+Z.x0,h+Z.cy+Z.y0),I<S&&U===X?t.arc(u+Z.cx,h+Z.cy,I,vu(Z.y0,Z.x0),vu(j.y0,j.x0),!c):(X>0&&t.arc(u+Z.cx,h+Z.cy,X,vu(Z.y0,Z.x0),vu(Z.y1,Z.x1),!c),t.arc(u,h,r,vu(Z.cy+Z.y1,Z.cx+Z.x1),vu(j.cy+j.y1,j.cx+j.x1),c),U>0&&t.arc(u+j.cx,h+j.cy,U,vu(j.y1,j.x1),vu(j.y0,j.x0),!c))}else t.lineTo(u+P,h+O),t.arc(u,h,r,l,s,c);else t.lineTo(u+P,h+O)}else t.moveTo(u,h);t.closePath()}}}var Iu=function(){this.cx=0,this.cy=0,this.r0=0,this.r=0,this.startAngle=0,this.endAngle=2*Math.PI,this.clockwise=!0,this.cornerRadius=0},Tu=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new Iu},e.prototype.buildPath=function(t,e){Mu(t,e)},e.prototype.isZeroArea=function(){return this.shape.startAngle===this.shape.endAngle||this.shape.r===this.shape.r0},e}(fs);Tu.prototype.type="sector";var Cu=function(){this.cx=0,this.cy=0,this.r=0,this.r0=0},Du=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new Cu},e.prototype.buildPath=function(t,e){var n=e.cx,i=e.cy,r=2*Math.PI;t.moveTo(n+e.r,i),t.arc(n,i,e.r,0,r,!1),t.moveTo(n+e.r0,i),t.arc(n,i,e.r0,0,r,!0)},e}(fs);function Au(t,e,n){var i=e.smooth,r=e.points;if(r&&r.length>=2){if(i){var o=function(t,e,n,i){var r,o,a,s,l=[],u=[],h=[],c=[];if(i){a=[1/0,1/0],s=[-1/0,-1/0];for(var p=0,d=t.length;p<d;p++)Gt(a,a,t[p]),Wt(s,s,t[p]);Gt(a,a,i[0]),Wt(s,s,i[1])}for(p=0,d=t.length;p<d;p++){var f=t[p];if(n)r=t[p?p-1:d-1],o=t[(p+1)%d];else{if(0===p||p===d-1){l.push(Mt(t[p]));continue}r=t[p-1],o=t[p+1]}Dt(u,o,r),Ot(u,u,e);var g=Nt(f,r),y=Nt(f,o),v=g+y;0!==v&&(g/=v,y/=v),Ot(h,u,-g),Ot(c,u,y);var m=Tt([],f,h),x=Tt([],f,c);i&&(Wt(m,m,a),Gt(m,m,s),Wt(x,x,a),Gt(x,x,s)),l.push(m),l.push(x)}return n&&l.push(l.shift()),l}(r,i,n,e.smoothConstraint);t.moveTo(r[0][0],r[0][1]);for(var a=r.length,s=0;s<(n?a:a-1);s++){var l=o[2*s],u=o[2*s+1],h=r[(s+1)%a];t.bezierCurveTo(l[0],l[1],u[0],u[1],h[0],h[1])}}else{t.moveTo(r[0][0],r[0][1]);s=1;for(var c=r.length;s<c;s++)t.lineTo(r[s][0],r[s][1])}n&&t.closePath()}}Du.prototype.type="ring";var ku=function(){this.points=null,this.smooth=0,this.smoothConstraint=null},Lu=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new ku},e.prototype.buildPath=function(t,e){Au(t,e,!0)},e}(fs);Lu.prototype.type="polygon";var Pu=function(){this.points=null,this.percent=1,this.smooth=0,this.smoothConstraint=null},Ou=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new Pu},e.prototype.buildPath=function(t,e){Au(t,e,!1)},e}(fs);Ou.prototype.type="polyline";var Ru={},Nu=function(){this.x1=0,this.y1=0,this.x2=0,this.y2=0,this.percent=1},Eu=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new Nu},e.prototype.buildPath=function(t,e){var n,i,r,o;if(this.subPixelOptimize){var a=bs(Ru,e,this.style);n=a.x1,i=a.y1,r=a.x2,o=a.y2}else n=e.x1,i=e.y1,r=e.x2,o=e.y2;var s=e.percent;0!==s&&(t.moveTo(n,i),s<1&&(r=n*(1-s)+r*s,o=i*(1-s)+o*s),t.lineTo(r,o))},e.prototype.pointAt=function(t){var e=this.shape;return[e.x1*(1-t)+e.x2*t,e.y1*(1-t)+e.y2*t]},e}(fs);Eu.prototype.type="line";var zu=[],Vu=function(){this.x1=0,this.y1=0,this.x2=0,this.y2=0,this.cpx1=0,this.cpy1=0,this.percent=1};function Bu(t,e,n){var i=t.cpx2,r=t.cpy2;return null!=i||null!=r?[(n?Ye:He)(t.x1,t.cpx1,t.cpx2,t.x2,e),(n?Ye:He)(t.y1,t.cpy1,t.cpy2,t.y2,e)]:[(n?$e:Ke)(t.x1,t.cpx1,t.x2,e),(n?$e:Ke)(t.y1,t.cpy1,t.y2,e)]}var Fu=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new Vu},e.prototype.buildPath=function(t,e){var n=e.x1,i=e.y1,r=e.x2,o=e.y2,a=e.cpx1,s=e.cpy1,l=e.cpx2,u=e.cpy2,h=e.percent;0!==h&&(t.moveTo(n,i),null==l||null==u?(h<1&&(Qe(n,a,r,h,zu),a=zu[1],r=zu[2],Qe(i,s,o,h,zu),s=zu[1],o=zu[2]),t.quadraticCurveTo(a,s,r,o)):(h<1&&(Ze(n,a,l,r,h,zu),a=zu[1],l=zu[2],r=zu[3],Ze(i,s,u,o,h,zu),s=zu[1],u=zu[2],o=zu[3]),t.bezierCurveTo(a,s,l,u,r,o)))},e.prototype.pointAt=function(t){return Bu(this.shape,t,!1)},e.prototype.tangentAt=function(t){var e=Bu(this.shape,t,!0);return Rt(e,e)},e}(fs);Fu.prototype.type="bezier-curve";var Gu=function(){this.cx=0,this.cy=0,this.r=0,this.startAngle=0,this.endAngle=2*Math.PI,this.clockwise=!0},Wu=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new Gu},e.prototype.buildPath=function(t,e){var n=e.cx,i=e.cy,r=Math.max(e.r,0),o=e.startAngle,a=e.endAngle,s=e.clockwise,l=Math.cos(o),u=Math.sin(o);t.moveTo(l*r+n,u*r+i),t.arc(n,i,r,o,a,!s)},e}(fs);Wu.prototype.type="arc";var Hu=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="compound",e}return n(e,t),e.prototype._updatePathDirty=function(){for(var t=this.shape.paths,e=this.shapeChanged(),n=0;n<t.length;n++)e=e||t[n].shapeChanged();e&&this.dirtyShape()},e.prototype.beforeBrush=function(){this._updatePathDirty();for(var t=this.shape.paths||[],e=this.getGlobalScale(),n=0;n<t.length;n++)t[n].path||t[n].createPathProxy(),t[n].path.setScale(e[0],e[1],t[n].segmentIgnoreThreshold)},e.prototype.buildPath=function(t,e){for(var n=e.paths||[],i=0;i<n.length;i++)n[i].buildPath(t,n[i].shape,!0)},e.prototype.afterBrush=function(){for(var t=this.shape.paths||[],e=0;e<t.length;e++)t[e].pathUpdated()},e.prototype.getBoundingRect=function(){return this._updatePathDirty.call(this),fs.prototype.getBoundingRect.call(this)},e}(fs),Yu=function(){function t(t){this.colorStops=t||[]}return t.prototype.addColorStop=function(t,e){this.colorStops.push({offset:t,color:e})},t}(),Uu=function(t){function e(e,n,i,r,o,a){var s=t.call(this,o)||this;return s.x=null==e?0:e,s.y=null==n?0:n,s.x2=null==i?1:i,s.y2=null==r?0:r,s.type="linear",s.global=a||!1,s}return n(e,t),e}(Yu),Xu=function(t){function e(e,n,i,r,o){var a=t.call(this,r)||this;return a.x=null==e?.5:e,a.y=null==n?.5:n,a.r=null==i?.5:i,a.type="radial",a.global=o||!1,a}return n(e,t),e}(Yu),Zu=[0,0],ju=[0,0],qu=new Ji,Ku=new Ji,$u=function(){function t(t,e){this._corners=[],this._axes=[],this._origin=[0,0];for(var n=0;n<4;n++)this._corners[n]=new Ji;for(n=0;n<2;n++)this._axes[n]=new Ji;t&&this.fromBoundingRect(t,e)}return t.prototype.fromBoundingRect=function(t,e){var n=this._corners,i=this._axes,r=t.x,o=t.y,a=r+t.width,s=o+t.height;if(n[0].set(r,o),n[1].set(a,o),n[2].set(a,s),n[3].set(r,s),e)for(var l=0;l<4;l++)n[l].transform(e);Ji.sub(i[0],n[1],n[0]),Ji.sub(i[1],n[3],n[0]),i[0].normalize(),i[1].normalize();for(l=0;l<2;l++)this._origin[l]=i[l].dot(n[0])},t.prototype.intersect=function(t,e){var n=!0,i=!e;return qu.set(1/0,1/0),Ku.set(0,0),!this._intersectCheckOneSide(this,t,qu,Ku,i,1)&&(n=!1,i)||!this._intersectCheckOneSide(t,this,qu,Ku,i,-1)&&(n=!1,i)||i||Ji.copy(e,n?qu:Ku),n},t.prototype._intersectCheckOneSide=function(t,e,n,i,r,o){for(var a=!0,s=0;s<2;s++){var l=this._axes[s];if(this._getProjMinMaxOnAxis(s,t._corners,Zu),this._getProjMinMaxOnAxis(s,e._corners,ju),Zu[1]<ju[0]||Zu[0]>ju[1]){if(a=!1,r)return a;var u=Math.abs(ju[0]-Zu[1]),h=Math.abs(Zu[0]-ju[1]);Math.min(u,h)>i.len()&&(u<h?Ji.scale(i,l,-u*o):Ji.scale(i,l,h*o))}else if(n){u=Math.abs(ju[0]-Zu[1]),h=Math.abs(Zu[0]-ju[1]);Math.min(u,h)<n.len()&&(u<h?Ji.scale(n,l,u*o):Ji.scale(n,l,-h*o))}}return a},t.prototype._getProjMinMaxOnAxis=function(t,e,n){for(var i=this._axes[t],r=this._origin,o=e[0].dot(i)+r[t],a=o,s=o,l=1;l<e.length;l++){var u=e[l].dot(i)+r[t];a=Math.min(u,a),s=Math.max(u,s)}n[0]=a,n[1]=s},t}(),Ju=[],Qu=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.notClear=!0,e.incremental=!0,e._displayables=[],e._temporaryDisplayables=[],e._cursor=0,e}return n(e,t),e.prototype.traverse=function(t,e){t.call(e,this)},e.prototype.useStyle=function(){this.style={}},e.prototype.getCursor=function(){return this._cursor},e.prototype.innerAfterBrush=function(){this._cursor=this._displayables.length},e.prototype.clearDisplaybles=function(){this._displayables=[],this._temporaryDisplayables=[],this._cursor=0,this.markRedraw(),this.notClear=!1},e.prototype.clearTemporalDisplayables=function(){this._temporaryDisplayables=[]},e.prototype.addDisplayable=function(t,e){e?this._temporaryDisplayables.push(t):this._displayables.push(t),this.markRedraw()},e.prototype.addDisplayables=function(t,e){e=e||!1;for(var n=0;n<t.length;n++)this.addDisplayable(t[n],e)},e.prototype.getDisplayables=function(){return this._displayables},e.prototype.getTemporalDisplayables=function(){return this._temporaryDisplayables},e.prototype.eachPendingDisplayable=function(t){for(var e=this._cursor;e<this._displayables.length;e++)t&&t(this._displayables[e]);for(e=0;e<this._temporaryDisplayables.length;e++)t&&t(this._temporaryDisplayables[e])},e.prototype.update=function(){this.updateTransform();for(var t=this._cursor;t<this._displayables.length;t++){(e=this._displayables[t]).parent=this,e.update(),e.parent=null}for(t=0;t<this._temporaryDisplayables.length;t++){var e;(e=this._temporaryDisplayables[t]).parent=this,e.update(),e.parent=null}},e.prototype.getBoundingRect=function(){if(!this._rect){for(var t=new sr(1/0,1/0,-1/0,-1/0),e=0;e<this._displayables.length;e++){var n=this._displayables[e],i=n.getBoundingRect().clone();n.needLocalTransform()&&i.applyTransform(n.getLocalTransform(Ju)),t.union(i)}this._rect=t}return this._rect},e.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e);if(this.getBoundingRect().contain(n[0],n[1]))for(var i=0;i<this._displayables.length;i++){if(this._displayables[i].contain(t,e))return!0}return!1},e}(da),th=So();function eh(t,e,n,i,r){var o;if(e&&e.ecModel){var a=e.ecModel.getUpdatePayload();o=a&&a.animation}var s="update"===t;if(e&&e.isAnimationEnabled()){var l=void 0,u=void 0,h=void 0;return i?(l=rt(i.duration,200),u=rt(i.easing,"cubicOut"),h=0):(l=e.getShallow(s?"animationDurationUpdate":"animationDuration"),u=e.getShallow(s?"animationEasingUpdate":"animationEasing"),h=e.getShallow(s?"animationDelayUpdate":"animationDelay")),o&&(null!=o.duration&&(l=o.duration),null!=o.easing&&(u=o.easing),null!=o.delay&&(h=o.delay)),U(h)&&(h=h(n,r)),U(l)&&(l=l(n)),{duration:l||0,delay:h,easing:u}}return null}function nh(t,e,n,i,r,o,a){var s,l=!1;U(r)?(a=o,o=r,r=null):q(r)&&(o=r.cb,a=r.during,l=r.isFrom,s=r.removeOpt,r=r.dataIndex);var u="leave"===t;u||e.stopAnimation("leave");var h=eh(t,i,r,u?s||{}:null,i&&i.getAnimationDelayParams?i.getAnimationDelayParams(e,r):null);if(h&&h.duration>0){var c={duration:h.duration,delay:h.delay||0,easing:h.easing,done:o,force:!!o||!!a,setToFinal:!u,scope:t,during:a};l?e.animateFrom(n,c):e.animateTo(n,c)}else e.stopAnimation(),!l&&e.attr(n),a&&a(1),o&&o()}function ih(t,e,n,i,r,o){nh("update",t,e,n,i,r,o)}function rh(t,e,n,i,r,o){nh("enter",t,e,n,i,r,o)}function oh(t){if(!t.__zr)return!0;for(var e=0;e<t.animators.length;e++){if("leave"===t.animators[e].scope)return!0}return!1}function ah(t,e,n,i,r,o){oh(t)||nh("leave",t,e,n,i,r,o)}function sh(t,e,n,i){t.removeTextContent(),t.removeTextGuideLine(),ah(t,{style:{opacity:0}},e,n,i)}function lh(t,e,n){function i(){t.parent&&t.parent.remove(t)}t.isGroup?t.traverse((function(t){t.isGroup||sh(t,e,n,i)})):sh(t,e,n,i)}function uh(t){th(t).oldStyle=t.style}var hh=Math.max,ch=Math.min,ph={};function dh(t){return fs.extend(t)}var fh=function(t,e){var i=ou(t,e);return function(t){function e(e){var n=t.call(this,e)||this;return n.applyTransform=i.applyTransform,n.buildPath=i.buildPath,n}return n(e,t),e}(iu)};function gh(t,e){return fh(t,e)}function yh(t,e){ph[t]=e}function vh(t){if(ph.hasOwnProperty(t))return ph[t]}function mh(t,e,n,i){var r=au(t,e);return n&&("center"===i&&(n=_h(n,r.getBoundingRect())),wh(r,n)),r}function xh(t,e,n){var i=new xs({style:{image:t,x:e.x,y:e.y,width:e.width,height:e.height},onload:function(t){if("center"===n){var r={width:t.width,height:t.height};i.setStyle(_h(e,r))}}});return i}function _h(t,e){var n,i=e.width/e.height,r=t.height*i;return n=r<=t.width?t.height:(r=t.width)/i,{x:t.x+t.width/2-r/2,y:t.y+t.height/2-n/2,width:r,height:n}}var bh=function(t,e){for(var n=[],i=t.length,r=0;r<i;r++){var o=t[r];n.push(o.getUpdatedPathProxy(!0))}var a=new fs(e);return a.createPathProxy(),a.buildPath=function(t){if(ru(t)){t.appendPath(n);var e=t.getContext();e&&t.rebuildPath(e,1)}},a};function wh(t,e){if(t.applyTransform){var n=t.getBoundingRect().calculateTransform(e);t.applyTransform(n)}}var Sh=Ss;function Mh(t,e){for(var n=Oi([]);t&&t!==e;)Ni(n,t.getLocalTransform(),n),t=t.parent;return n}function Ih(t,e,n){return e&&!N(e)&&(e=qi.getLocalTransform(e)),n&&(e=Bi([],e)),Ft([],t,e)}function Th(t,e,n){var i=0===e[4]||0===e[5]||0===e[0]?1:Math.abs(2*e[4]/e[0]),r=0===e[4]||0===e[5]||0===e[2]?1:Math.abs(2*e[4]/e[2]),o=["left"===t?-i:"right"===t?i:0,"top"===t?-r:"bottom"===t?r:0];return o=Ih(o,e,n),Math.abs(o[0])>Math.abs(o[1])?o[0]>0?"right":"left":o[1]>0?"bottom":"top"}function Ch(t){return!t.isGroup}function Dh(t,e,n){if(t&&e){var i,r=(i={},t.traverse((function(t){Ch(t)&&t.anid&&(i[t.anid]=t)})),i);e.traverse((function(t){if(Ch(t)&&t.anid){var e=r[t.anid];if(e){var i=o(t);t.attr(o(e)),ih(t,i,n,Ws(t).dataIndex)}}}))}function o(t){var e={x:t.x,y:t.y,rotation:t.rotation};return function(t){return null!=t.shape}(t)&&(e.shape=A({},t.shape)),e}}function Ah(t,e){return z(t,(function(t){var n=t[0];n=hh(n,e.x),n=ch(n,e.x+e.width);var i=t[1];return i=hh(i,e.y),[n,i=ch(i,e.y+e.height)]}))}function kh(t,e){var n=hh(t.x,e.x),i=ch(t.x+t.width,e.x+e.width),r=hh(t.y,e.y),o=ch(t.y+t.height,e.y+e.height);if(i>=n&&o>=r)return{x:n,y:r,width:i-n,height:o-r}}function Lh(t,e,n){var i=A({rectHover:!0},e),r=i.style={strokeNoScale:!0};if(n=n||{x:-1,y:-1,width:2,height:2},t)return 0===t.indexOf("image://")?(r.image=t.slice(8),k(r,n),new xs(i)):mh(t.replace("path://",""),i,n,"center")}function Ph(t,e,n,i,r){for(var o=0,a=r[r.length-1];o<r.length;o++){var s=r[o];if(Oh(t,e,n,i,s[0],s[1],a[0],a[1]))return!0;a=s}}function Oh(t,e,n,i,r,o,a,s){var l,u=n-t,h=i-e,c=a-r,p=s-o,d=Rh(c,p,u,h);if((l=d)<=1e-6&&l>=-1e-6)return!1;var f=t-r,g=e-o,y=Rh(f,g,u,h)/d;if(y<0||y>1)return!1;var v=Rh(f,g,c,p)/d;return!(v<0||v>1)}function Rh(t,e,n,i){return t*i-n*e}function Nh(t){var e=t.itemTooltipOption,n=t.componentModel,i=t.itemName,r=X(e)?{formatter:e}:e,o=n.mainType,a=n.componentIndex,s={componentType:o,name:i,$vars:["name"]};s[o+"Index"]=a;var l=t.formatterParamsExtra;l&&E(G(l),(function(t){mt(s,t)||(s[t]=l[t],s.$vars.push(t))}));var u=Ws(t.el);u.componentMainType=o,u.componentIndex=a,u.tooltipConfig={name:i,option:k({content:i,formatterParams:s},r)}}function Eh(t,e){var n;t.isGroup&&(n=e(t)),n||t.traverse(e)}function zh(t,e){if(t)if(Y(t))for(var n=0;n<t.length;n++)Eh(t[n],e);else Eh(t,e)}yh("circle",uu),yh("ellipse",cu),yh("sector",Tu),yh("ring",Du),yh("polygon",Lu),yh("polyline",Ou),yh("rect",Ts),yh("line",Eu),yh("bezierCurve",Fu),yh("arc",Wu);var Vh=Object.freeze({__proto__:null,updateProps:ih,initProps:rh,removeElement:ah,removeElementWithFadeOut:lh,isElementRemoved:oh,extendShape:dh,extendPath:gh,registerShape:yh,getShapeClass:vh,makePath:mh,makeImage:xh,mergePath:bh,resizePath:wh,subPixelOptimizeLine:function(t){return bs(t.shape,t.shape,t.style),t},subPixelOptimizeRect:function(t){return ws(t.shape,t.shape,t.style),t},subPixelOptimize:Sh,getTransform:Mh,applyTransform:Ih,transformDirection:Th,groupTransition:Dh,clipPointsByRect:Ah,clipRectByRect:kh,createIcon:Lh,linePolygonIntersect:Ph,lineLineIntersect:Oh,setTooltipConfig:Nh,traverseElements:zh,Group:Cr,Image:xs,Text:As,Circle:uu,Ellipse:cu,Sector:Tu,Ring:Du,Polygon:Lu,Polyline:Ou,Rect:Ts,Line:Eu,BezierCurve:Fu,Arc:Wu,IncrementalDisplayable:Qu,CompoundPath:Hu,LinearGradient:Uu,RadialGradient:Xu,BoundingRect:sr,OrientedBoundingRect:$u,Point:Ji,Path:fs}),Bh={};function Fh(t,e){for(var n=0;n<js.length;n++){var i=js[n],r=e[i],o=t.ensureState(i);o.style=o.style||{},o.style.text=r}var a=t.currentStates.slice();t.clearStates(!0),t.setStyle({text:e.normal}),t.useStates(a,!0)}function Gh(t,e,n){var i,r=t.labelFetcher,o=t.labelDataIndex,a=t.labelDimIndex,s=e.normal;r&&(i=r.getFormattedLabel(o,"normal",null,a,s&&s.get("formatter"),null!=n?{interpolatedValue:n}:null)),null==i&&(i=U(t.defaultText)?t.defaultText(o,t,n):t.defaultText);for(var l={normal:i},u=0;u<js.length;u++){var h=js[u],c=e[h];l[h]=rt(r?r.getFormattedLabel(o,h,null,a,c&&c.get("formatter")):null,i)}return l}function Wh(t,e,n,i){n=n||Bh;for(var r=t instanceof As,o=!1,a=0;a<qs.length;a++){if((p=e[qs[a]])&&p.getShallow("show")){o=!0;break}}var s=r?t:t.getTextContent();if(o){r||(s||(s=new As,t.setTextContent(s)),t.stateProxy&&(s.stateProxy=t.stateProxy));var l=Gh(n,e),u=e.normal,h=!!u.getShallow("show"),c=Yh(u,i&&i.normal,n,!1,!r);c.text=l.normal,r||t.setTextConfig(Uh(u,n,!1));for(a=0;a<js.length;a++){var p,d=js[a];if(p=e[d]){var f=s.ensureState(d),g=!!rt(p.getShallow("show"),h);if(g!==h&&(f.ignore=!g),f.style=Yh(p,i&&i[d],n,!0,!r),f.style.text=l[d],!r)t.ensureState(d).textConfig=Uh(p,n,!0)}}s.silent=!!u.getShallow("silent"),null!=s.style.x&&(c.x=s.style.x),null!=s.style.y&&(c.y=s.style.y),s.ignore=!h,s.useStyle(c),s.dirty(),n.enableTextSetter&&($h(s).setLabelText=function(t){var i=Gh(n,e,t);Fh(s,i)})}else s&&(s.ignore=!0);t.dirty()}function Hh(t,e){e=e||"label";for(var n={normal:t.getModel(e)},i=0;i<js.length;i++){var r=js[i];n[r]=t.getModel([r,e])}return n}function Yh(t,e,n,i,r){var o={};return function(t,e,n,i,r){n=n||Bh;var o,a=e.ecModel,s=a&&a.option.textStyle,l=function(t){var e;for(;t&&t!==t.ecModel;){var n=(t.option||Bh).rich;if(n){e=e||{};for(var i=G(n),r=0;r<i.length;r++){e[i[r]]=1}}t=t.parentModel}return e}(e);if(l)for(var u in o={},l)if(l.hasOwnProperty(u)){var h=e.getModel(["rich",u]);qh(o[u]={},h,s,n,i,r,!1,!0)}o&&(t.rich=o);var c=e.get("overflow");c&&(t.overflow=c);var p=e.get("minMargin");null!=p&&(t.margin=p);qh(t,e,s,n,i,r,!0,!1)}(o,t,n,i,r),e&&A(o,e),o}function Uh(t,e,n){e=e||{};var i,r={},o=t.getShallow("rotate"),a=rt(t.getShallow("distance"),n?null:5),s=t.getShallow("offset");return"outside"===(i=t.getShallow("position")||(n?null:"inside"))&&(i=e.defaultOutsidePosition||"top"),null!=i&&(r.position=i),null!=s&&(r.offset=s),null!=o&&(o*=Math.PI/180,r.rotation=o),null!=a&&(r.distance=a),r.outsideFill="inherit"===t.get("color")?e.inheritColor||null:"auto",r}var Xh=["fontStyle","fontWeight","fontSize","fontFamily","textShadowColor","textShadowBlur","textShadowOffsetX","textShadowOffsetY"],Zh=["align","lineHeight","width","height","tag","verticalAlign"],jh=["padding","borderWidth","borderRadius","borderDashOffset","backgroundColor","borderColor","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY"];function qh(t,e,n,i,r,o,a,s){n=!r&&n||Bh;var l=i&&i.inheritColor,u=e.getShallow("color"),h=e.getShallow("textBorderColor"),c=rt(e.getShallow("opacity"),n.opacity);"inherit"!==u&&"auto"!==u||(u=l||null),"inherit"!==h&&"auto"!==h||(h=l||null),o||(u=u||n.color,h=h||n.textBorderColor),null!=u&&(t.fill=u),null!=h&&(t.stroke=h);var p=rt(e.getShallow("textBorderWidth"),n.textBorderWidth);null!=p&&(t.lineWidth=p);var d=rt(e.getShallow("textBorderType"),n.textBorderType);null!=d&&(t.lineDash=d);var f=rt(e.getShallow("textBorderDashOffset"),n.textBorderDashOffset);null!=f&&(t.lineDashOffset=f),r||null!=c||s||(c=i&&i.defaultOpacity),null!=c&&(t.opacity=c),r||o||null==t.fill&&i.inheritColor&&(t.fill=i.inheritColor);for(var g=0;g<Xh.length;g++){var y=Xh[g];null!=(m=rt(e.getShallow(y),n[y]))&&(t[y]=m)}for(g=0;g<Zh.length;g++){y=Zh[g];null!=(m=e.getShallow(y))&&(t[y]=m)}if(null==t.verticalAlign){var v=e.getShallow("baseline");null!=v&&(t.verticalAlign=v)}if(!a||!i.disableBox){for(g=0;g<jh.length;g++){var m;y=jh[g];null!=(m=e.getShallow(y))&&(t[y]=m)}var x=e.getShallow("borderType");null!=x&&(t.borderDash=x),"auto"!==t.backgroundColor&&"inherit"!==t.backgroundColor||!l||(t.backgroundColor=l),"auto"!==t.borderColor&&"inherit"!==t.borderColor||!l||(t.borderColor=l)}}function Kh(t,e){var n=e&&e.getModel("textStyle");return ut([t.fontStyle||n&&n.getShallow("fontStyle")||"",t.fontWeight||n&&n.getShallow("fontWeight")||"",(t.fontSize||n&&n.getShallow("fontSize")||12)+"px",t.fontFamily||n&&n.getShallow("fontFamily")||"sans-serif"].join(" "))}var $h=So();function Jh(t,e,n,i){if(t){var r=$h(t);r.prevValue=r.value,r.value=n;var o=e.normal;r.valueAnimation=o.get("valueAnimation"),r.valueAnimation&&(r.precision=o.get("precision"),r.defaultInterpolatedText=i,r.statesModels=e)}}function Qh(t,e,n,i,r){var o=$h(t);if(o.valueAnimation&&o.prevValue!==o.value){var a=o.defaultInterpolatedText,s=rt(o.interpolatedValue,o.prevValue),l=o.value;t.percent=0,(null==o.prevValue?rh:ih)(t,{percent:1},i,e,null,(function(i){var u=Po(n,o.precision,s,l,i);o.interpolatedValue=1===i?null:u;var h=Gh({labelDataIndex:e,labelFetcher:r,defaultText:a?a(u):u+""},o.statesModels,u);Fh(t,h)}))}}var tc,ec,nc=["textStyle","color"],ic=["fontStyle","fontWeight","fontSize","fontFamily","padding","lineHeight","rich","width","height","overflow"],rc=new As,oc=function(){function t(){}return t.prototype.getTextColor=function(t){var e=this.ecModel;return this.getShallow("color")||(!t&&e?e.get(nc):null)},t.prototype.getFont=function(){return Kh({fontStyle:this.getShallow("fontStyle"),fontWeight:this.getShallow("fontWeight"),fontSize:this.getShallow("fontSize"),fontFamily:this.getShallow("fontFamily")},this.ecModel)},t.prototype.getTextRect=function(t){for(var e={text:t,verticalAlign:this.getShallow("verticalAlign")||this.getShallow("baseline")},n=0;n<ic.length;n++)e[ic[n]]=this.getShallow(ic[n]);return rc.useStyle(e),rc.update(),rc.getBoundingRect()},t}(),ac=[["lineWidth","width"],["stroke","color"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"],["lineDash","type"],["lineDashOffset","dashOffset"],["lineCap","cap"],["lineJoin","join"],["miterLimit"]],sc=Wo(ac),lc=function(){function t(){}return t.prototype.getLineStyle=function(t){return sc(this,t)},t}(),uc=[["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"],["lineDash","borderType"],["lineDashOffset","borderDashOffset"],["lineCap","borderCap"],["lineJoin","borderJoin"],["miterLimit","borderMiterLimit"]],hc=Wo(uc),cc=function(){function t(){}return t.prototype.getItemStyle=function(t,e){return hc(this,t,e)},t}(),pc=function(){function t(t,e,n){this.parentModel=e,this.ecModel=n,this.option=t}return t.prototype.init=function(t,e,n){for(var i=[],r=3;r<arguments.length;r++)i[r-3]=arguments[r]},t.prototype.mergeOption=function(t,e){C(this.option,t,!0)},t.prototype.get=function(t,e){return null==t?this.option:this._doGet(this.parsePath(t),!e&&this.parentModel)},t.prototype.getShallow=function(t,e){var n=this.option,i=null==n?n:n[t];if(null==i&&!e){var r=this.parentModel;r&&(i=r.getShallow(t))}return i},t.prototype.getModel=function(e,n){var i=null!=e,r=i?this.parsePath(e):null;return new t(i?this._doGet(r):this.option,n=n||this.parentModel&&this.parentModel.getModel(this.resolveParentPath(r)),this.ecModel)},t.prototype.isEmpty=function(){return null==this.option},t.prototype.restoreData=function(){},t.prototype.clone=function(){return new(0,this.constructor)(T(this.option))},t.prototype.parsePath=function(t){return"string"==typeof t?t.split("."):t},t.prototype.resolveParentPath=function(t){return t},t.prototype.isAnimationEnabled=function(){if(!r.node&&this.option){if(null!=this.option.animation)return!!this.option.animation;if(this.parentModel)return this.parentModel.isAnimationEnabled()}},t.prototype._doGet=function(t,e){var n=this.option;if(!t)return n;for(var i=0;i<t.length&&(!t[i]||null!=(n=n&&"object"==typeof n?n[t[i]]:null));i++);return null==n&&e&&(n=e._doGet(this.resolveParentPath(t),e.parentModel)),n},t}();Eo(pc),tc=pc,ec=["__\0is_clz",Vo++].join("_"),tc.prototype[ec]=!0,tc.isInstance=function(t){return!(!t||!t[ec])},R(pc,lc),R(pc,cc),R(pc,Yo),R(pc,oc);var dc=Math.round(10*Math.random());function fc(t){return[t||"",dc++].join("_")}function gc(t,e){return C(C({},t,!0),e,!0)}var yc="ZH",vc="EN",mc=vc,xc={},_c={},bc=r.domSupported&&(document.documentElement.lang||navigator.language||navigator.browserLanguage).toUpperCase().indexOf(yc)>-1?yc:mc;function wc(t,e){t=t.toUpperCase(),_c[t]=new pc(e),xc[t]=e}function Sc(t){return _c[t]}wc(vc,{time:{month:["January","February","March","April","May","June","July","August","September","October","November","December"],monthAbbr:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayOfWeek:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayOfWeekAbbr:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]},legend:{selector:{all:"All",inverse:"Inv"}},toolbox:{brush:{title:{rect:"Box Select",polygon:"Lasso Select",lineX:"Horizontally Select",lineY:"Vertically Select",keep:"Keep Selections",clear:"Clear Selections"}},dataView:{title:"Data View",lang:["Data View","Close","Refresh"]},dataZoom:{title:{zoom:"Zoom",back:"Zoom Reset"}},magicType:{title:{line:"Switch to Line Chart",bar:"Switch to Bar Chart",stack:"Stack",tiled:"Tile"}},restore:{title:"Restore"},saveAsImage:{title:"Save as Image",lang:["Right Click to Save Image"]}},series:{typeNames:{pie:"Pie chart",bar:"Bar chart",line:"Line chart",scatter:"Scatter plot",effectScatter:"Ripple scatter plot",radar:"Radar chart",tree:"Tree",treemap:"Treemap",boxplot:"Boxplot",candlestick:"Candlestick",k:"K line chart",heatmap:"Heat map",map:"Map",parallel:"Parallel coordinate map",lines:"Line graph",graph:"Relationship graph",sankey:"Sankey diagram",funnel:"Funnel chart",gauge:"Gauge",pictorialBar:"Pictorial bar",themeRiver:"Theme River Map",sunburst:"Sunburst"}},aria:{general:{withTitle:'This is a chart about "{title}"',withoutTitle:"This is a chart"},series:{single:{prefix:"",withName:" with type {seriesType} named {seriesName}.",withoutName:" with type {seriesType}."},multiple:{prefix:". It consists of {seriesCount} series count.",withName:" The {seriesId} series is a {seriesType} representing {seriesName}.",withoutName:" The {seriesId} series is a {seriesType}.",separator:{middle:"",end:""}}},data:{allData:"The data is as follows: ",partialData:"The first {displayCnt} items are: ",withName:"the data for {name} is {value}",withoutName:"{value}",separator:{middle:", ",end:". "}}}}),wc(yc,{time:{month:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthAbbr:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],dayOfWeek:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayOfWeekAbbr:["日","一","二","三","四","五","六"]},legend:{selector:{all:"全选",inverse:"反选"}},toolbox:{brush:{title:{rect:"矩形选择",polygon:"圈选",lineX:"横向选择",lineY:"纵向选择",keep:"保持选择",clear:"清除选择"}},dataView:{title:"数据视图",lang:["数据视图","关闭","刷新"]},dataZoom:{title:{zoom:"区域缩放",back:"区域缩放还原"}},magicType:{title:{line:"切换为折线图",bar:"切换为柱状图",stack:"切换为堆叠",tiled:"切换为平铺"}},restore:{title:"还原"},saveAsImage:{title:"保存为图片",lang:["右键另存为图片"]}},series:{typeNames:{pie:"饼图",bar:"柱状图",line:"折线图",scatter:"散点图",effectScatter:"涟漪散点图",radar:"雷达图",tree:"树图",treemap:"矩形树图",boxplot:"箱型图",candlestick:"K线图",k:"K线图",heatmap:"热力图",map:"地图",parallel:"平行坐标图",lines:"线图",graph:"关系图",sankey:"桑基图",funnel:"漏斗图",gauge:"仪表盘图",pictorialBar:"象形柱图",themeRiver:"主题河流图",sunburst:"旭日图"}},aria:{general:{withTitle:"这是一个关于“{title}”的图表。",withoutTitle:"这是一个图表，"},series:{single:{prefix:"",withName:"图表类型是{seriesType}，表示{seriesName}。",withoutName:"图表类型是{seriesType}。"},multiple:{prefix:"它由{seriesCount}个图表系列组成。",withName:"第{seriesId}个系列是一个表示{seriesName}的{seriesType}，",withoutName:"第{seriesId}个系列是一个{seriesType}，",separator:{middle:"；",end:"。"}}},data:{allData:"其数据是——",partialData:"其中，前{displayCnt}项是——",withName:"{name}的数据是{value}",withoutName:"{value}",separator:{middle:"，",end:""}}}});var Mc=1e3,Ic=6e4,Tc=36e5,Cc=864e5,Dc=31536e6,Ac={year:"{yyyy}",month:"{MMM}",day:"{d}",hour:"{HH}:{mm}",minute:"{HH}:{mm}",second:"{HH}:{mm}:{ss}",millisecond:"{HH}:{mm}:{ss} {SSS}",none:"{yyyy}-{MM}-{dd} {HH}:{mm}:{ss} {SSS}"},kc="{yyyy}-{MM}-{dd}",Lc={year:"{yyyy}",month:"{yyyy}-{MM}",day:kc,hour:"{yyyy}-{MM}-{dd} "+Ac.hour,minute:"{yyyy}-{MM}-{dd} "+Ac.minute,second:"{yyyy}-{MM}-{dd} "+Ac.second,millisecond:Ac.none},Pc=["year","month","day","hour","minute","second","millisecond"],Oc=["year","half-year","quarter","month","week","half-week","day","half-day","quarter-day","hour","minute","second","millisecond"];function Rc(t,e){return"0000".substr(0,e-(t+="").length)+t}function Nc(t){switch(t){case"half-year":case"quarter":return"month";case"week":case"half-week":return"day";case"half-day":case"quarter-day":return"hour";default:return t}}function Ec(t){return t===Nc(t)}function zc(t,e,n,i){var r=jr(t),o=r[Fc(n)](),a=r[Gc(n)]()+1,s=Math.floor((a-1)/4)+1,l=r[Wc(n)](),u=r["get"+(n?"UTC":"")+"Day"](),h=r[Hc(n)](),c=(h-1)%12+1,p=r[Yc(n)](),d=r[Uc(n)](),f=r[Xc(n)](),g=(i instanceof pc?i:Sc(i||bc)||_c.EN).getModel("time"),y=g.get("month"),v=g.get("monthAbbr"),m=g.get("dayOfWeek"),x=g.get("dayOfWeekAbbr");return(e||"").replace(/{yyyy}/g,o+"").replace(/{yy}/g,o%100+"").replace(/{Q}/g,s+"").replace(/{MMMM}/g,y[a-1]).replace(/{MMM}/g,v[a-1]).replace(/{MM}/g,Rc(a,2)).replace(/{M}/g,a+"").replace(/{dd}/g,Rc(l,2)).replace(/{d}/g,l+"").replace(/{eeee}/g,m[u]).replace(/{ee}/g,x[u]).replace(/{e}/g,u+"").replace(/{HH}/g,Rc(h,2)).replace(/{H}/g,h+"").replace(/{hh}/g,Rc(c+"",2)).replace(/{h}/g,c+"").replace(/{mm}/g,Rc(p,2)).replace(/{m}/g,p+"").replace(/{ss}/g,Rc(d,2)).replace(/{s}/g,d+"").replace(/{SSS}/g,Rc(f,3)).replace(/{S}/g,f+"")}function Vc(t,e){var n=jr(t),i=n[Gc(e)]()+1,r=n[Wc(e)](),o=n[Hc(e)](),a=n[Yc(e)](),s=n[Uc(e)](),l=0===n[Xc(e)](),u=l&&0===s,h=u&&0===a,c=h&&0===o,p=c&&1===r;return p&&1===i?"year":p?"month":c?"day":h?"hour":u?"minute":l?"second":"millisecond"}function Bc(t,e,n){var i=j(t)?jr(t):t;switch(e=e||Vc(t,n)){case"year":return i[Fc(n)]();case"half-year":return i[Gc(n)]()>=6?1:0;case"quarter":return Math.floor((i[Gc(n)]()+1)/4);case"month":return i[Gc(n)]();case"day":return i[Wc(n)]();case"half-day":return i[Hc(n)]()/24;case"hour":return i[Hc(n)]();case"minute":return i[Yc(n)]();case"second":return i[Uc(n)]();case"millisecond":return i[Xc(n)]()}}function Fc(t){return t?"getUTCFullYear":"getFullYear"}function Gc(t){return t?"getUTCMonth":"getMonth"}function Wc(t){return t?"getUTCDate":"getDate"}function Hc(t){return t?"getUTCHours":"getHours"}function Yc(t){return t?"getUTCMinutes":"getMinutes"}function Uc(t){return t?"getUTCSeconds":"getSeconds"}function Xc(t){return t?"getUTCMilliseconds":"getMilliseconds"}function Zc(t){return t?"setUTCFullYear":"setFullYear"}function jc(t){return t?"setUTCMonth":"setMonth"}function qc(t){return t?"setUTCDate":"setDate"}function Kc(t){return t?"setUTCHours":"setHours"}function $c(t){return t?"setUTCMinutes":"setMinutes"}function Jc(t){return t?"setUTCSeconds":"setSeconds"}function Qc(t){return t?"setUTCMilliseconds":"setMilliseconds"}function tp(t){if(!eo(t))return X(t)?t:"-";var e=(t+"").split(".");return e[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(e.length>1?"."+e[1]:"")}function ep(t,e){return t=(t||"").toLowerCase().replace(/-(.)/g,(function(t,e){return e.toUpperCase()})),e&&t&&(t=t.charAt(0).toUpperCase()+t.slice(1)),t}var np=st,ip=/([&<>"'])/g,rp={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function op(t){return null==t?"":(t+"").replace(ip,(function(t,e){return rp[e]}))}function ap(t,e,n){function i(t){return t&&ut(t)?t:"-"}function r(t){return!(null==t||isNaN(t)||!isFinite(t))}var o="time"===e,a=t instanceof Date;if(o||a){var s=o?jr(t):t;if(!isNaN(+s))return zc(s,"{yyyy}-{MM}-{dd} {hh}:{mm}:{ss}",n);if(a)return"-"}if("ordinal"===e)return Z(t)?i(t):j(t)&&r(t)?t+"":"-";var l=to(t);return r(l)?tp(l):Z(t)?i(t):"boolean"==typeof t?t+"":"-"}var sp=["a","b","c","d","e","f","g"],lp=function(t,e){return"{"+t+(null==e?"":e)+"}"};function up(t,e,n){Y(e)||(e=[e]);var i=e.length;if(!i)return"";for(var r=e[0].$vars||[],o=0;o<r.length;o++){var a=sp[o];t=t.replace(lp(a),lp(a,0))}for(var s=0;s<i;s++)for(var l=0;l<r.length;l++){var u=e[s][r[l]];t=t.replace(lp(sp[l],s),n?op(u):u)}return t}function hp(t,e){var n=X(t)?{color:t,extraCssText:e}:t||{},i=n.color,r=n.type;e=n.extraCssText;var o=n.renderMode||"html";return i?"html"===o?"subItem"===r?'<span style="display:inline-block;vertical-align:middle;margin-right:8px;margin-left:3px;border-radius:4px;width:4px;height:4px;background-color:'+op(i)+";"+(e||"")+'"></span>':'<span style="display:inline-block;margin-right:4px;border-radius:10px;width:10px;height:10px;background-color:'+op(i)+";"+(e||"")+'"></span>':{renderMode:o,content:"{"+(n.markerId||"markerX")+"|}  ",style:"subItem"===r?{width:4,height:4,borderRadius:2,backgroundColor:i}:{width:10,height:10,borderRadius:5,backgroundColor:i}}:""}function cp(t,e){return e=e||"transparent",X(t)?t:q(t)&&t.colorStops&&(t.colorStops[0]||{}).color||e}function pp(t,e){if("_blank"===e||"blank"===e){var n=window.open();n.opener=null,n.location.href=t}else window.open(t,e)}var dp=E,fp=["left","right","top","bottom","width","height"],gp=[["width","left","right"],["height","top","bottom"]];function yp(t,e,n,i,r){var o=0,a=0;null==i&&(i=1/0),null==r&&(r=1/0);var s=0;e.eachChild((function(l,u){var h,c,p=l.getBoundingRect(),d=e.childAt(u+1),f=d&&d.getBoundingRect();if("horizontal"===t){var g=p.width+(f?-f.x+p.x:0);(h=o+g)>i||l.newline?(o=0,h=g,a+=s+n,s=p.height):s=Math.max(s,p.height)}else{var y=p.height+(f?-f.y+p.y:0);(c=a+y)>r||l.newline?(o+=s+n,a=0,c=y,s=p.width):s=Math.max(s,p.width)}l.newline||(l.x=o,l.y=a,l.markRedraw(),"horizontal"===t?o=h+n:a=c+n)}))}var vp=yp;H(yp,"vertical"),H(yp,"horizontal");function mp(t,e,n){n=np(n||0);var i=e.width,r=e.height,o=Er(t.left,i),a=Er(t.top,r),s=Er(t.right,i),l=Er(t.bottom,r),u=Er(t.width,i),h=Er(t.height,r),c=n[2]+n[0],p=n[1]+n[3],d=t.aspect;switch(isNaN(u)&&(u=i-s-p-o),isNaN(h)&&(h=r-l-c-a),null!=d&&(isNaN(u)&&isNaN(h)&&(d>i/r?u=.8*i:h=.8*r),isNaN(u)&&(u=d*h),isNaN(h)&&(h=u/d)),isNaN(o)&&(o=i-s-u-p),isNaN(a)&&(a=r-l-h-c),t.left||t.right){case"center":o=i/2-u/2-n[3];break;case"right":o=i-u-p}switch(t.top||t.bottom){case"middle":case"center":a=r/2-h/2-n[0];break;case"bottom":a=r-h-c}o=o||0,a=a||0,isNaN(u)&&(u=i-p-o-(s||0)),isNaN(h)&&(h=r-c-a-(l||0));var f=new sr(o+n[3],a+n[0],u,h);return f.margin=n,f}function xp(t,e,n,i,r,o){var a,s=!r||!r.hv||r.hv[0],l=!r||!r.hv||r.hv[1],u=r&&r.boundingMode||"all";if((o=o||t).x=t.x,o.y=t.y,!s&&!l)return!1;if("raw"===u)a="group"===t.type?new sr(0,0,+e.width||0,+e.height||0):t.getBoundingRect();else if(a=t.getBoundingRect(),t.needLocalTransform()){var h=t.getLocalTransform();(a=a.clone()).applyTransform(h)}var c=mp(k({width:a.width,height:a.height},e),n,i),p=s?c.x-a.x:0,d=l?c.y-a.y:0;return"raw"===u?(o.x=p,o.y=d):(o.x+=p,o.y+=d),o===t&&t.markRedraw(),!0}function _p(t){var e=t.layoutMode||t.constructor.layoutMode;return q(e)?e:e?{type:e}:null}function bp(t,e,n){var i=n&&n.ignoreSize;!Y(i)&&(i=[i,i]);var r=a(gp[0],0),o=a(gp[1],1);function a(n,r){var o={},a=0,u={},h=0;if(dp(n,(function(e){u[e]=t[e]})),dp(n,(function(t){s(e,t)&&(o[t]=u[t]=e[t]),l(o,t)&&a++,l(u,t)&&h++})),i[r])return l(e,n[1])?u[n[2]]=null:l(e,n[2])&&(u[n[1]]=null),u;if(2!==h&&a){if(a>=2)return o;for(var c=0;c<n.length;c++){var p=n[c];if(!s(o,p)&&s(t,p)){o[p]=t[p];break}}return o}return u}function s(t,e){return t.hasOwnProperty(e)}function l(t,e){return null!=t[e]&&"auto"!==t[e]}function u(t,e,n){dp(t,(function(t){e[t]=n[t]}))}u(gp[0],t,r),u(gp[1],t,o)}function wp(t){return Sp({},t)}function Sp(t,e){return e&&t&&dp(fp,(function(n){e.hasOwnProperty(n)&&(t[n]=e[n])})),t}var Mp=So(),Ip=function(t){function e(e,n,i){var r=t.call(this,e,n,i)||this;return r.uid=fc("ec_cpt_model"),r}return n(e,t),e.prototype.init=function(t,e,n){this.mergeDefaultAndTheme(t,n)},e.prototype.mergeDefaultAndTheme=function(t,e){var n=_p(this),i=n?wp(t):{};C(t,e.getTheme().get(this.mainType)),C(t,this.getDefaultOption()),n&&bp(t,i,n)},e.prototype.mergeOption=function(t,e){C(this.option,t,!0);var n=_p(this);n&&bp(this.option,t,n)},e.prototype.optionUpdated=function(t,e){},e.prototype.getDefaultOption=function(){var t=this.constructor;if(!function(t){return!(!t||!t[Ro])}(t))return t.defaultOption;var e=Mp(this);if(!e.defaultOption){for(var n=[],i=t;i;){var r=i.prototype.defaultOption;r&&n.push(r),i=i.superClass}for(var o={},a=n.length-1;a>=0;a--)o=C(o,n[a],!0);e.defaultOption=o}return e.defaultOption},e.prototype.getReferringComponents=function(t,e){var n=t+"Index",i=t+"Id";return Ao(this.ecModel,t,{index:this.get(n,!0),id:this.get(i,!0)},e)},e.prototype.getBoxLayoutParams=function(){var t=this;return{left:t.get("left"),top:t.get("top"),right:t.get("right"),bottom:t.get("bottom"),width:t.get("width"),height:t.get("height")}},e.prototype.getZLevelKey=function(){return""},e.prototype.setZLevel=function(t){this.option.zlevel=t},e.protoInitialize=function(){var t=e.prototype;t.type="component",t.id="",t.name="",t.mainType="",t.subType="",t.componentIndex=0}(),e}(pc);zo(Ip,pc),Go(Ip),function(t){var e={};t.registerSubTypeDefaulter=function(t,n){var i=No(t);e[i.main]=n},t.determineSubType=function(n,i){var r=i.type;if(!r){var o=No(n).main;t.hasSubTypes(n)&&e[o]&&(r=e[o](i))}return r}}(Ip),function(t,e){function n(t,e){return t[e]||(t[e]={predecessor:[],successor:[]}),t[e]}t.topologicalTravel=function(t,i,r,o){if(t.length){var a=function(t){var i={},r=[];return E(t,(function(o){var a=n(i,o),s=function(t,e){var n=[];return E(t,(function(t){P(e,t)>=0&&n.push(t)})),n}(a.originalDeps=e(o),t);a.entryCount=s.length,0===a.entryCount&&r.push(o),E(s,(function(t){P(a.predecessor,t)<0&&a.predecessor.push(t);var e=n(i,t);P(e.successor,t)<0&&e.successor.push(o)}))})),{graph:i,noEntryList:r}}(i),s=a.graph,l=a.noEntryList,u={};for(E(t,(function(t){u[t]=!0}));l.length;){var h=l.pop(),c=s[h],p=!!u[h];p&&(r.call(o,h,c.originalDeps.slice()),delete u[h]),E(c.successor,p?f:d)}E(u,(function(){var t="";throw new Error(t)}))}function d(t){s[t].entryCount--,0===s[t].entryCount&&l.push(t)}function f(t){u[t]=!0,d(t)}}}(Ip,(function(t){var e=[];E(Ip.getClassesByMainType(t),(function(t){e=e.concat(t.dependencies||t.prototype.dependencies||[])})),e=z(e,(function(t){return No(t).main})),"dataset"!==t&&P(e,"dataset")<=0&&e.unshift("dataset");return e}));var Tp="";"undefined"!=typeof navigator&&(Tp=navigator.platform||"");var Cp="rgba(0, 0, 0, 0.2)",Dp={darkMode:"auto",colorBy:"series",color:["#5470c6","#91cc75","#fac858","#ee6666","#73c0de","#3ba272","#fc8452","#9a60b4","#ea7ccc"],gradientColor:["#f6efa6","#d88273","#bf444c"],aria:{decal:{decals:[{color:Cp,dashArrayX:[1,0],dashArrayY:[2,5],symbolSize:1,rotation:Math.PI/6},{color:Cp,symbol:"circle",dashArrayX:[[8,8],[0,8,8,0]],dashArrayY:[6,0],symbolSize:.8},{color:Cp,dashArrayX:[1,0],dashArrayY:[4,3],rotation:-Math.PI/4},{color:Cp,dashArrayX:[[6,6],[0,6,6,0]],dashArrayY:[6,0]},{color:Cp,dashArrayX:[[1,0],[1,6]],dashArrayY:[1,0,6,0],rotation:Math.PI/4},{color:Cp,symbol:"triangle",dashArrayX:[[9,9],[0,9,9,0]],dashArrayY:[7,2],symbolSize:.75}]}},textStyle:{fontFamily:Tp.match(/^Win/)?"Microsoft YaHei":"sans-serif",fontSize:12,fontStyle:"normal",fontWeight:"normal"},blendMode:null,stateAnimation:{duration:300,easing:"cubicOut"},animation:"auto",animationDuration:1e3,animationDurationUpdate:500,animationEasing:"cubicInOut",animationEasingUpdate:"cubicInOut",animationThreshold:2e3,progressiveThreshold:3e3,progressive:400,hoverLayerThreshold:3e3,useUTC:!1},Ap=ft(["tooltip","label","itemName","itemId","itemGroupId","seriesName"]),kp="original",Lp="arrayRows",Pp="objectRows",Op="keyedColumns",Rp="typedArray",Np="unknown",Ep="column",zp="row",Vp=1,Bp=2,Fp=3,Gp=So();function Wp(t,e,n){var i={},r=Yp(e);if(!r||!t)return i;var o,a,s=[],l=[],u=e.ecModel,h=Gp(u).datasetMap,c=r.uid+"_"+n.seriesLayoutBy;E(t=t.slice(),(function(e,n){var r=q(e)?e:t[n]={name:e};"ordinal"===r.type&&null==o&&(o=n,a=f(r)),i[r.name]=[]}));var p=h.get(c)||h.set(c,{categoryWayDim:a,valueWayDim:0});function d(t,e,n){for(var i=0;i<n;i++)t.push(e+i)}function f(t){var e=t.dimsDef;return e?e.length:1}return E(t,(function(t,e){var n=t.name,r=f(t);if(null==o){var a=p.valueWayDim;d(i[n],a,r),d(l,a,r),p.valueWayDim+=r}else if(o===e)d(i[n],0,r),d(s,0,r);else{a=p.categoryWayDim;d(i[n],a,r),d(l,a,r),p.categoryWayDim+=r}})),s.length&&(i.itemName=s),l.length&&(i.seriesName=l),i}function Hp(t,e,n){var i={};if(!Yp(t))return i;var r,o=e.sourceFormat,a=e.dimensionsDefine;o!==Pp&&o!==Op||E(a,(function(t,e){"name"===(q(t)?t.name:t)&&(r=e)}));var s=function(){for(var t={},i={},s=[],l=0,u=Math.min(5,n);l<u;l++){var h=Xp(e.data,o,e.seriesLayoutBy,a,e.startIndex,l);s.push(h);var c=h===Fp;if(c&&null==t.v&&l!==r&&(t.v=l),(null==t.n||t.n===t.v||!c&&s[t.n]===Fp)&&(t.n=l),p(t)&&s[t.n]!==Fp)return t;c||(h===Bp&&null==i.v&&l!==r&&(i.v=l),null!=i.n&&i.n!==i.v||(i.n=l))}function p(t){return null!=t.v&&null!=t.n}return p(t)?t:p(i)?i:null}();if(s){i.value=[s.v];var l=null!=r?r:s.n;i.itemName=[l],i.seriesName=[l]}return i}function Yp(t){if(!t.get("data",!0))return Ao(t.ecModel,"dataset",{index:t.get("datasetIndex",!0),id:t.get("datasetId",!0)},Co).models[0]}function Up(t,e){return Xp(t.data,t.sourceFormat,t.seriesLayoutBy,t.dimensionsDefine,t.startIndex,e)}function Xp(t,e,n,i,r,o){var a,s,l;if($(t))return Fp;if(i){var u=i[o];q(u)?(s=u.name,l=u.type):X(u)&&(s=u)}if(null!=l)return"ordinal"===l?Vp:Fp;if(e===Lp){var h=t;if(n===zp){for(var c=h[o],p=0;p<(c||[]).length&&p<5;p++)if(null!=(a=m(c[r+p])))return a}else for(p=0;p<h.length&&p<5;p++){var d=h[r+p];if(d&&null!=(a=m(d[o])))return a}}else if(e===Pp){var f=t;if(!s)return Fp;for(p=0;p<f.length&&p<5;p++){if((y=f[p])&&null!=(a=m(y[s])))return a}}else if(e===Op){if(!s)return Fp;if(!(c=t[s])||$(c))return Fp;for(p=0;p<c.length&&p<5;p++)if(null!=(a=m(c[p])))return a}else if(e===kp){var g=t;for(p=0;p<g.length&&p<5;p++){var y,v=fo(y=g[p]);if(!Y(v))return Fp;if(null!=(a=m(v[o])))return a}}function m(t){var e=X(t);return null!=t&&isFinite(t)&&""!==t?e?Bp:Fp:e&&"-"!==t?Vp:void 0}return Fp}var Zp=ft();var jp,qp,Kp,$p=So(),Jp=So(),Qp=function(){function t(){}return t.prototype.getColorFromPalette=function(t,e,n){var i=ho(this.get("color",!0)),r=this.get("colorLayer",!0);return ed(this,$p,i,r,t,e,n)},t.prototype.clearColorPalette=function(){!function(t,e){e(t).paletteIdx=0,e(t).paletteNameMap={}}(this,$p)},t}();function td(t,e,n,i){var r=ho(t.get(["aria","decal","decals"]));return ed(t,Jp,r,null,e,n,i)}function ed(t,e,n,i,r,o,a){var s=e(o=o||t),l=s.paletteIdx||0,u=s.paletteNameMap=s.paletteNameMap||{};if(u.hasOwnProperty(r))return u[r];var h=null!=a&&i?function(t,e){for(var n=t.length,i=0;i<n;i++)if(t[i].length>e)return t[i];return t[n-1]}(i,a):n;if((h=h||n)&&h.length){var c=h[l];return r&&(u[r]=c),s.paletteIdx=(l+1)%h.length,c}}var nd=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.init=function(t,e,n,i,r,o){i=i||{},this.option=null,this._theme=new pc(i),this._locale=new pc(r),this._optionManager=o},e.prototype.setOption=function(t,e,n){var i=od(e);this._optionManager.setOption(t,n,i),this._resetOption(null,i)},e.prototype.resetOption=function(t,e){return this._resetOption(t,od(e))},e.prototype._resetOption=function(t,e){var n=!1,i=this._optionManager;if(!t||"recreate"===t){var r=i.mountOption("recreate"===t);0,this.option&&"recreate"!==t?(this.restoreData(),this._mergeOption(r,e)):Kp(this,r),n=!0}if("timeline"!==t&&"media"!==t||this.restoreData(),!t||"recreate"===t||"timeline"===t){var o=i.getTimelineOption(this);o&&(n=!0,this._mergeOption(o,e))}if(!t||"recreate"===t||"media"===t){var a=i.getMediaOption(this);a.length&&E(a,(function(t){n=!0,this._mergeOption(t,e)}),this)}return n},e.prototype.mergeOption=function(t){this._mergeOption(t,null)},e.prototype._mergeOption=function(t,e){var n=this.option,i=this._componentsMap,r=this._componentsCount,o=[],a=ft(),s=e&&e.replaceMergeMainTypeMap;Gp(this).datasetMap=ft(),E(t,(function(t,e){null!=t&&(Ip.hasClass(e)?e&&(o.push(e),a.set(e,!0)):n[e]=null==n[e]?T(t):C(n[e],t,!0))})),s&&s.each((function(t,e){Ip.hasClass(e)&&!a.get(e)&&(o.push(e),a.set(e,!0))})),Ip.topologicalTravel(o,Ip.getAllClassMainTypes(),(function(e){var o=function(t,e,n){var i=Zp.get(e);if(!i)return n;var r=i(t);return r?n.concat(r):n}(this,e,ho(t[e])),a=i.get(e),l=a?s&&s.get(e)?"replaceMerge":"normalMerge":"replaceAll",u=yo(a,o,l);(function(t,e,n){E(t,(function(t){var i=t.newOption;q(i)&&(t.keyInfo.mainType=e,t.keyInfo.subType=function(t,e,n,i){return e.type?e.type:n?n.subType:i.determineSubType(t,e)}(e,i,t.existing,n))}))})(u,e,Ip),n[e]=null,i.set(e,null),r.set(e,0);var h,c=[],p=[],d=0;E(u,(function(t,n){var i=t.existing,r=t.newOption;if(r){var o="series"===e,a=Ip.getClass(e,t.keyInfo.subType,!o);if(!a)return;if("tooltip"===e){if(h)return void 0;h=!0}if(i&&i.constructor===a)i.name=t.keyInfo.name,i.mergeOption(r,this),i.optionUpdated(r,!1);else{var s=A({componentIndex:n},t.keyInfo);A(i=new a(r,this,this,s),s),t.brandNew&&(i.__requireNewView=!0),i.init(r,this,this),i.optionUpdated(null,!0)}}else i&&(i.mergeOption({},this),i.optionUpdated({},!1));i?(c.push(i.option),p.push(i),d++):(c.push(void 0),p.push(void 0))}),this),n[e]=c,i.set(e,p),r.set(e,d),"series"===e&&jp(this)}),this),this._seriesIndices||jp(this)},e.prototype.getOption=function(){var t=T(this.option);return E(t,(function(e,n){if(Ip.hasClass(n)){for(var i=ho(e),r=i.length,o=!1,a=r-1;a>=0;a--)i[a]&&!bo(i[a])?o=!0:(i[a]=null,!o&&r--);i.length=r,t[n]=i}})),delete t["\0_ec_inner"],t},e.prototype.getTheme=function(){return this._theme},e.prototype.getLocaleModel=function(){return this._locale},e.prototype.setUpdatePayload=function(t){this._payload=t},e.prototype.getUpdatePayload=function(){return this._payload},e.prototype.getComponent=function(t,e){var n=this._componentsMap.get(t);if(n){var i=n[e||0];if(i)return i;if(null==e)for(var r=0;r<n.length;r++)if(n[r])return n[r]}},e.prototype.queryComponents=function(t){var e=t.mainType;if(!e)return[];var n,i=t.index,r=t.id,o=t.name,a=this._componentsMap.get(e);return a&&a.length?(null!=i?(n=[],E(ho(i),(function(t){a[t]&&n.push(a[t])}))):n=null!=r?id("id",r,a):null!=o?id("name",o,a):B(a,(function(t){return!!t})),rd(n,t)):[]},e.prototype.findComponents=function(t){var e,n,i,r,o,a=t.query,s=t.mainType,l=(n=s+"Index",i=s+"Id",r=s+"Name",!(e=a)||null==e[n]&&null==e[i]&&null==e[r]?null:{mainType:s,index:e[n],id:e[i],name:e[r]}),u=l?this.queryComponents(l):B(this._componentsMap.get(s),(function(t){return!!t}));return o=rd(u,t),t.filter?B(o,t.filter):o},e.prototype.eachComponent=function(t,e,n){var i=this._componentsMap;if(U(t)){var r=e,o=t;i.each((function(t,e){for(var n=0;t&&n<t.length;n++){var i=t[n];i&&o.call(r,e,i,i.componentIndex)}}))}else for(var a=X(t)?i.get(t):q(t)?this.findComponents(t):null,s=0;a&&s<a.length;s++){var l=a[s];l&&e.call(n,l,l.componentIndex)}},e.prototype.getSeriesByName=function(t){var e=xo(t,null);return B(this._componentsMap.get("series"),(function(t){return!!t&&null!=e&&t.name===e}))},e.prototype.getSeriesByIndex=function(t){return this._componentsMap.get("series")[t]},e.prototype.getSeriesByType=function(t){return B(this._componentsMap.get("series"),(function(e){return!!e&&e.subType===t}))},e.prototype.getSeries=function(){return B(this._componentsMap.get("series"),(function(t){return!!t}))},e.prototype.getSeriesCount=function(){return this._componentsCount.get("series")},e.prototype.eachSeries=function(t,e){qp(this),E(this._seriesIndices,(function(n){var i=this._componentsMap.get("series")[n];t.call(e,i,n)}),this)},e.prototype.eachRawSeries=function(t,e){E(this._componentsMap.get("series"),(function(n){n&&t.call(e,n,n.componentIndex)}))},e.prototype.eachSeriesByType=function(t,e,n){qp(this),E(this._seriesIndices,(function(i){var r=this._componentsMap.get("series")[i];r.subType===t&&e.call(n,r,i)}),this)},e.prototype.eachRawSeriesByType=function(t,e,n){return E(this.getSeriesByType(t),e,n)},e.prototype.isSeriesFiltered=function(t){return qp(this),null==this._seriesIndicesMap.get(t.componentIndex)},e.prototype.getCurrentSeriesIndices=function(){return(this._seriesIndices||[]).slice()},e.prototype.filterSeries=function(t,e){qp(this);var n=[];E(this._seriesIndices,(function(i){var r=this._componentsMap.get("series")[i];t.call(e,r,i)&&n.push(i)}),this),this._seriesIndices=n,this._seriesIndicesMap=ft(n)},e.prototype.restoreData=function(t){jp(this);var e=this._componentsMap,n=[];e.each((function(t,e){Ip.hasClass(e)&&n.push(e)})),Ip.topologicalTravel(n,Ip.getAllClassMainTypes(),(function(n){E(e.get(n),(function(e){!e||"series"===n&&function(t,e){if(e){var n=e.seriesIndex,i=e.seriesId,r=e.seriesName;return null!=n&&t.componentIndex!==n||null!=i&&t.id!==i||null!=r&&t.name!==r}}(e,t)||e.restoreData()}))}))},e.internalField=(jp=function(t){var e=t._seriesIndices=[];E(t._componentsMap.get("series"),(function(t){t&&e.push(t.componentIndex)})),t._seriesIndicesMap=ft(e)},qp=function(t){},void(Kp=function(t,e){t.option={},t.option["\0_ec_inner"]=1,t._componentsMap=ft({series:[]}),t._componentsCount=ft();var n=e.aria;q(n)&&null==n.enabled&&(n.enabled=!0),function(t,e){var n=t.color&&!t.colorLayer;E(e,(function(e,i){"colorLayer"===i&&n||Ip.hasClass(i)||("object"==typeof e?t[i]=t[i]?C(t[i],e,!1):T(e):null==t[i]&&(t[i]=e))}))}(e,t._theme.option),C(e,Dp,!1),t._mergeOption(e,null)})),e}(pc);function id(t,e,n){if(Y(e)){var i=ft();return E(e,(function(t){null!=t&&(null!=xo(t,null)&&i.set(t,!0))})),B(n,(function(e){return e&&i.get(e[t])}))}var r=xo(e,null);return B(n,(function(e){return e&&null!=r&&e[t]===r}))}function rd(t,e){return e.hasOwnProperty("subType")?B(t,(function(t){return t&&t.subType===e.subType})):t}function od(t){var e=ft();return t&&E(ho(t.replaceMerge),(function(t){e.set(t,!0)})),{replaceMergeMainTypeMap:e}}R(nd,Qp);var ad=["getDom","getZr","getWidth","getHeight","getDevicePixelRatio","dispatchAction","isSSR","isDisposed","on","off","getDataURL","getConnectedDataURL","getOption","getId","updateLabelLayout"],sd=function(t){E(ad,(function(e){this[e]=W(t[e],t)}),this)},ld={},ud=function(){function t(){this._coordinateSystems=[]}return t.prototype.create=function(t,e){var n=[];E(ld,(function(i,r){var o=i.create(t,e);n=n.concat(o||[])})),this._coordinateSystems=n},t.prototype.update=function(t,e){E(this._coordinateSystems,(function(n){n.update&&n.update(t,e)}))},t.prototype.getCoordinateSystems=function(){return this._coordinateSystems.slice()},t.register=function(t,e){ld[t]=e},t.get=function(t){return ld[t]},t}(),hd=/^(min|max)?(.+)$/,cd=function(){function t(t){this._timelineOptions=[],this._mediaList=[],this._currentMediaIndices=[],this._api=t}return t.prototype.setOption=function(t,e,n){t&&(E(ho(t.series),(function(t){t&&t.data&&$(t.data)&&ct(t.data)})),E(ho(t.dataset),(function(t){t&&t.source&&$(t.source)&&ct(t.source)}))),t=T(t);var i=this._optionBackup,r=function(t,e,n){var i,r,o=[],a=t.baseOption,s=t.timeline,l=t.options,u=t.media,h=!!t.media,c=!!(l||s||a&&a.timeline);a?(r=a).timeline||(r.timeline=s):((c||h)&&(t.options=t.media=null),r=t);h&&Y(u)&&E(u,(function(t){t&&t.option&&(t.query?o.push(t):i||(i=t))}));function p(t){E(e,(function(e){e(t,n)}))}return p(r),E(l,(function(t){return p(t)})),E(o,(function(t){return p(t.option)})),{baseOption:r,timelineOptions:l||[],mediaDefault:i,mediaList:o}}(t,e,!i);this._newBaseOption=r.baseOption,i?(r.timelineOptions.length&&(i.timelineOptions=r.timelineOptions),r.mediaList.length&&(i.mediaList=r.mediaList),r.mediaDefault&&(i.mediaDefault=r.mediaDefault)):this._optionBackup=r},t.prototype.mountOption=function(t){var e=this._optionBackup;return this._timelineOptions=e.timelineOptions,this._mediaList=e.mediaList,this._mediaDefault=e.mediaDefault,this._currentMediaIndices=[],T(t?e.baseOption:this._newBaseOption)},t.prototype.getTimelineOption=function(t){var e,n=this._timelineOptions;if(n.length){var i=t.getComponent("timeline");i&&(e=T(n[i.getCurrentIndex()]))}return e},t.prototype.getMediaOption=function(t){var e,n,i=this._api.getWidth(),r=this._api.getHeight(),o=this._mediaList,a=this._mediaDefault,s=[],l=[];if(!o.length&&!a)return l;for(var u=0,h=o.length;u<h;u++)pd(o[u].query,i,r)&&s.push(u);return!s.length&&a&&(s=[-1]),s.length&&(e=s,n=this._currentMediaIndices,e.join(",")!==n.join(","))&&(l=z(s,(function(t){return T(-1===t?a.option:o[t].option)}))),this._currentMediaIndices=s,l},t}();function pd(t,e,n){var i={width:e,height:n,aspectratio:e/n},r=!0;return E(t,(function(t,e){var n=e.match(hd);if(n&&n[1]&&n[2]){var o=n[1],a=n[2].toLowerCase();(function(t,e,n){return"min"===n?t>=e:"max"===n?t<=e:t===e})(i[a],t,o)||(r=!1)}})),r}var dd=E,fd=q,gd=["areaStyle","lineStyle","nodeStyle","linkStyle","chordStyle","label","labelLine"];function yd(t){var e=t&&t.itemStyle;if(e)for(var n=0,i=gd.length;n<i;n++){var r=gd[n],o=e.normal,a=e.emphasis;o&&o[r]&&(t[r]=t[r]||{},t[r].normal?C(t[r].normal,o[r]):t[r].normal=o[r],o[r]=null),a&&a[r]&&(t[r]=t[r]||{},t[r].emphasis?C(t[r].emphasis,a[r]):t[r].emphasis=a[r],a[r]=null)}}function vd(t,e,n){if(t&&t[e]&&(t[e].normal||t[e].emphasis)){var i=t[e].normal,r=t[e].emphasis;i&&(n?(t[e].normal=t[e].emphasis=null,k(t[e],i)):t[e]=i),r&&(t.emphasis=t.emphasis||{},t.emphasis[e]=r,r.focus&&(t.emphasis.focus=r.focus),r.blurScope&&(t.emphasis.blurScope=r.blurScope))}}function md(t){vd(t,"itemStyle"),vd(t,"lineStyle"),vd(t,"areaStyle"),vd(t,"label"),vd(t,"labelLine"),vd(t,"upperLabel"),vd(t,"edgeLabel")}function xd(t,e){var n=fd(t)&&t[e],i=fd(n)&&n.textStyle;if(i){0;for(var r=0,o=po.length;r<o;r++){var a=po[r];i.hasOwnProperty(a)&&(n[a]=i[a])}}}function _d(t){t&&(md(t),xd(t,"label"),t.emphasis&&xd(t.emphasis,"label"))}function bd(t){return Y(t)?t:t?[t]:[]}function wd(t){return(Y(t)?t[0]:t)||{}}function Sd(t,e){dd(bd(t.series),(function(t){fd(t)&&function(t){if(fd(t)){yd(t),md(t),xd(t,"label"),xd(t,"upperLabel"),xd(t,"edgeLabel"),t.emphasis&&(xd(t.emphasis,"label"),xd(t.emphasis,"upperLabel"),xd(t.emphasis,"edgeLabel"));var e=t.markPoint;e&&(yd(e),_d(e));var n=t.markLine;n&&(yd(n),_d(n));var i=t.markArea;i&&_d(i);var r=t.data;if("graph"===t.type){r=r||t.nodes;var o=t.links||t.edges;if(o&&!$(o))for(var a=0;a<o.length;a++)_d(o[a]);E(t.categories,(function(t){md(t)}))}if(r&&!$(r))for(a=0;a<r.length;a++)_d(r[a]);if((e=t.markPoint)&&e.data){var s=e.data;for(a=0;a<s.length;a++)_d(s[a])}if((n=t.markLine)&&n.data){var l=n.data;for(a=0;a<l.length;a++)Y(l[a])?(_d(l[a][0]),_d(l[a][1])):_d(l[a])}"gauge"===t.type?(xd(t,"axisLabel"),xd(t,"title"),xd(t,"detail")):"treemap"===t.type?(vd(t.breadcrumb,"itemStyle"),E(t.levels,(function(t){md(t)}))):"tree"===t.type&&md(t.leaves)}}(t)}));var n=["xAxis","yAxis","radiusAxis","angleAxis","singleAxis","parallelAxis","radar"];e&&n.push("valueAxis","categoryAxis","logAxis","timeAxis"),dd(n,(function(e){dd(bd(t[e]),(function(t){t&&(xd(t,"axisLabel"),xd(t.axisPointer,"label"))}))})),dd(bd(t.parallel),(function(t){var e=t&&t.parallelAxisDefault;xd(e,"axisLabel"),xd(e&&e.axisPointer,"label")})),dd(bd(t.calendar),(function(t){vd(t,"itemStyle"),xd(t,"dayLabel"),xd(t,"monthLabel"),xd(t,"yearLabel")})),dd(bd(t.radar),(function(t){xd(t,"name"),t.name&&null==t.axisName&&(t.axisName=t.name,delete t.name),null!=t.nameGap&&null==t.axisNameGap&&(t.axisNameGap=t.nameGap,delete t.nameGap)})),dd(bd(t.geo),(function(t){fd(t)&&(_d(t),dd(bd(t.regions),(function(t){_d(t)})))})),dd(bd(t.timeline),(function(t){_d(t),vd(t,"label"),vd(t,"itemStyle"),vd(t,"controlStyle",!0);var e=t.data;Y(e)&&E(e,(function(t){q(t)&&(vd(t,"label"),vd(t,"itemStyle"))}))})),dd(bd(t.toolbox),(function(t){vd(t,"iconStyle"),dd(t.feature,(function(t){vd(t,"iconStyle")}))})),xd(wd(t.axisPointer),"label"),xd(wd(t.tooltip).axisPointer,"label")}function Md(t){t&&E(Id,(function(e){e[0]in t&&!(e[1]in t)&&(t[e[1]]=t[e[0]])}))}var Id=[["x","left"],["y","top"],["x2","right"],["y2","bottom"]],Td=["grid","geo","parallel","legend","toolbox","title","visualMap","dataZoom","timeline"],Cd=[["borderRadius","barBorderRadius"],["borderColor","barBorderColor"],["borderWidth","barBorderWidth"]];function Dd(t){var e=t&&t.itemStyle;if(e)for(var n=0;n<Cd.length;n++){var i=Cd[n][1],r=Cd[n][0];null!=e[i]&&(e[r]=e[i])}}function Ad(t){t&&"edge"===t.alignTo&&null!=t.margin&&null==t.edgeDistance&&(t.edgeDistance=t.margin)}function kd(t){t&&t.downplay&&!t.blur&&(t.blur=t.downplay)}function Ld(t,e){if(t)for(var n=0;n<t.length;n++)e(t[n]),t[n]&&Ld(t[n].children,e)}function Pd(t,e){Sd(t,e),t.series=ho(t.series),E(t.series,(function(t){if(q(t)){var e=t.type;if("line"===e)null!=t.clipOverflow&&(t.clip=t.clipOverflow);else if("pie"===e||"gauge"===e){if(null!=t.clockWise&&(t.clockwise=t.clockWise),Ad(t.label),(r=t.data)&&!$(r))for(var n=0;n<r.length;n++)Ad(r[n]);null!=t.hoverOffset&&(t.emphasis=t.emphasis||{},(t.emphasis.scaleSize=null)&&(t.emphasis.scaleSize=t.hoverOffset))}else if("gauge"===e){var i=function(t,e){for(var n=e.split(","),i=t,r=0;r<n.length&&null!=(i=i&&i[n[r]]);r++);return i}(t,"pointer.color");null!=i&&function(t,e,n,i){for(var r,o=e.split(","),a=t,s=0;s<o.length-1;s++)null==a[r=o[s]]&&(a[r]={}),a=a[r];(i||null==a[o[s]])&&(a[o[s]]=n)}(t,"itemStyle.color",i)}else if("bar"===e){var r;if(Dd(t),Dd(t.backgroundStyle),Dd(t.emphasis),(r=t.data)&&!$(r))for(n=0;n<r.length;n++)"object"==typeof r[n]&&(Dd(r[n]),Dd(r[n]&&r[n].emphasis))}else if("sunburst"===e){var o=t.highlightPolicy;o&&(t.emphasis=t.emphasis||{},t.emphasis.focus||(t.emphasis.focus=o)),kd(t),Ld(t.data,kd)}else"graph"===e||"sankey"===e?function(t){t&&null!=t.focusNodeAdjacency&&(t.emphasis=t.emphasis||{},null==t.emphasis.focus&&(t.emphasis.focus="adjacency"))}(t):"map"===e&&(t.mapType&&!t.map&&(t.map=t.mapType),t.mapLocation&&k(t,t.mapLocation));null!=t.hoverAnimation&&(t.emphasis=t.emphasis||{},t.emphasis&&null==t.emphasis.scale&&(t.emphasis.scale=t.hoverAnimation)),Md(t)}})),t.dataRange&&(t.visualMap=t.dataRange),E(Td,(function(e){var n=t[e];n&&(Y(n)||(n=[n]),E(n,(function(t){Md(t)})))}))}function Od(t){E(t,(function(e,n){var i=[],r=[NaN,NaN],o=[e.stackResultDimension,e.stackedOverDimension],a=e.data,s=e.isStackedByIndex;a.modify(o,(function(o,l,u){var h,c,p=a.get(e.stackedDimension,u);if(isNaN(p))return r;s?c=a.getRawIndex(u):h=a.get(e.stackedByDimension,u);for(var d=NaN,f=n-1;f>=0;f--){var g=t[f];if(s||(c=g.data.rawIndexOf(g.stackedByDimension,h)),c>=0){var y=g.data.getByRawIndex(g.stackResultDimension,c);if(p>=0&&y>0||p<=0&&y<0){p=Hr(p,y),d=y;break}}}return i[0]=p,i[1]=d,i}))}))}var Rd,Nd,Ed,zd,Vd,Bd=function(t){this.data=t.data||(t.sourceFormat===Op?{}:[]),this.sourceFormat=t.sourceFormat||Np,this.seriesLayoutBy=t.seriesLayoutBy||Ep,this.startIndex=t.startIndex||0,this.dimensionsDetectedCount=t.dimensionsDetectedCount,this.metaRawOption=t.metaRawOption;var e=this.dimensionsDefine=t.dimensionsDefine;if(e)for(var n=0;n<e.length;n++){var i=e[n];null==i.type&&Up(this,n)===Vp&&(i.type="ordinal")}};function Fd(t){return t instanceof Bd}function Gd(t,e,n){n=n||Hd(t);var i=e.seriesLayoutBy,r=function(t,e,n,i,r){var o,a;if(!t)return{dimensionsDefine:Yd(r),startIndex:a,dimensionsDetectedCount:o};if(e===Lp){var s=t;"auto"===i||null==i?Ud((function(t){null!=t&&"-"!==t&&(X(t)?null==a&&(a=1):a=0)}),n,s,10):a=j(i)?i:i?1:0,r||1!==a||(r=[],Ud((function(t,e){r[e]=null!=t?t+"":""}),n,s,1/0)),o=r?r.length:n===zp?s.length:s[0]?s[0].length:null}else if(e===Pp)r||(r=function(t){var e,n=0;for(;n<t.length&&!(e=t[n++]););if(e){var i=[];return E(e,(function(t,e){i.push(e)})),i}}(t));else if(e===Op)r||(r=[],E(t,(function(t,e){r.push(e)})));else if(e===kp){var l=fo(t[0]);o=Y(l)&&l.length||1}return{startIndex:a,dimensionsDefine:Yd(r),dimensionsDetectedCount:o}}(t,n,i,e.sourceHeader,e.dimensions);return new Bd({data:t,sourceFormat:n,seriesLayoutBy:i,dimensionsDefine:r.dimensionsDefine,startIndex:r.startIndex,dimensionsDetectedCount:r.dimensionsDetectedCount,metaRawOption:T(e)})}function Wd(t){return new Bd({data:t,sourceFormat:$(t)?Rp:kp})}function Hd(t){var e=Np;if($(t))e=Rp;else if(Y(t)){0===t.length&&(e=Lp);for(var n=0,i=t.length;n<i;n++){var r=t[n];if(null!=r){if(Y(r)){e=Lp;break}if(q(r)){e=Pp;break}}}}else if(q(t))for(var o in t)if(mt(t,o)&&N(t[o])){e=Op;break}return e}function Yd(t){if(t){var e=ft();return z(t,(function(t,n){var i={name:(t=q(t)?t:{name:t}).name,displayName:t.displayName,type:t.type};if(null==i.name)return i;i.name+="",null==i.displayName&&(i.displayName=i.name);var r=e.get(i.name);return r?i.name+="-"+r.count++:e.set(i.name,{count:1}),i}))}}function Ud(t,e,n,i){if(e===zp)for(var r=0;r<n.length&&r<i;r++)t(n[r]?n[r][0]:null,r);else{var o=n[0]||[];for(r=0;r<o.length&&r<i;r++)t(o[r],r)}}function Xd(t){var e=t.sourceFormat;return e===Pp||e===Op}var Zd=function(){function t(t,e){var n=Fd(t)?t:Wd(t);this._source=n;var i=this._data=n.data;n.sourceFormat===Rp&&(this._offset=0,this._dimSize=e,this._data=i),Vd(this,i,n)}return t.prototype.getSource=function(){return this._source},t.prototype.count=function(){return 0},t.prototype.getItem=function(t,e){},t.prototype.appendData=function(t){},t.prototype.clean=function(){},t.protoInitialize=function(){var e=t.prototype;e.pure=!1,e.persistent=!0}(),t.internalField=function(){var t;Vd=function(t,r,o){var a=o.sourceFormat,s=o.seriesLayoutBy,l=o.startIndex,u=o.dimensionsDefine,h=zd[rf(a,s)];if(A(t,h),a===Rp)t.getItem=e,t.count=i,t.fillStorage=n;else{var c=Kd(a,s);t.getItem=W(c,null,r,l,u);var p=Qd(a,s);t.count=W(p,null,r,l,u)}};var e=function(t,e){t-=this._offset,e=e||[];for(var n=this._data,i=this._dimSize,r=i*t,o=0;o<i;o++)e[o]=n[r+o];return e},n=function(t,e,n,i){for(var r=this._data,o=this._dimSize,a=0;a<o;a++){for(var s=i[a],l=null==s[0]?1/0:s[0],u=null==s[1]?-1/0:s[1],h=e-t,c=n[a],p=0;p<h;p++){var d=r[p*o+a];c[t+p]=d,d<l&&(l=d),d>u&&(u=d)}s[0]=l,s[1]=u}},i=function(){return this._data?this._data.length/this._dimSize:0};function r(t){for(var e=0;e<t.length;e++)this._data.push(t[e])}(t={}).arrayRows_column={pure:!0,appendData:r},t.arrayRows_row={pure:!0,appendData:function(){throw new Error('Do not support appendData when set seriesLayoutBy: "row".')}},t.objectRows={pure:!0,appendData:r},t.keyedColumns={pure:!0,appendData:function(t){var e=this._data;E(t,(function(t,n){for(var i=e[n]||(e[n]=[]),r=0;r<(t||[]).length;r++)i.push(t[r])}))}},t.original={appendData:r},t.typedArray={persistent:!1,pure:!0,appendData:function(t){this._data=t},clean:function(){this._offset+=this.count(),this._data=null}},zd=t}(),t}(),jd=function(t,e,n,i){return t[i]},qd=((Rd={}).arrayRows_column=function(t,e,n,i){return t[i+e]},Rd.arrayRows_row=function(t,e,n,i,r){i+=e;for(var o=r||[],a=t,s=0;s<a.length;s++){var l=a[s];o[s]=l?l[i]:null}return o},Rd.objectRows=jd,Rd.keyedColumns=function(t,e,n,i,r){for(var o=r||[],a=0;a<n.length;a++){var s=n[a].name;0;var l=t[s];o[a]=l?l[i]:null}return o},Rd.original=jd,Rd);function Kd(t,e){var n=qd[rf(t,e)];return n}var $d=function(t,e,n){return t.length},Jd=((Nd={}).arrayRows_column=function(t,e,n){return Math.max(0,t.length-e)},Nd.arrayRows_row=function(t,e,n){var i=t[0];return i?Math.max(0,i.length-e):0},Nd.objectRows=$d,Nd.keyedColumns=function(t,e,n){var i=n[0].name;var r=t[i];return r?r.length:0},Nd.original=$d,Nd);function Qd(t,e){var n=Jd[rf(t,e)];return n}var tf=function(t,e,n){return t[e]},ef=((Ed={}).arrayRows=tf,Ed.objectRows=function(t,e,n){return t[n]},Ed.keyedColumns=tf,Ed.original=function(t,e,n){var i=fo(t);return i instanceof Array?i[e]:i},Ed.typedArray=tf,Ed);function nf(t){var e=ef[t];return e}function rf(t,e){return t===Lp?t+"_"+e:t}function of(t,e,n){if(t){var i=t.getRawDataItem(e);if(null!=i){var r=t.getStore(),o=r.getSource().sourceFormat;if(null!=n){var a=t.getDimensionIndex(n),s=r.getDimensionProperty(a);return nf(o)(i,a,s)}var l=i;return o===kp&&(l=fo(i)),l}}}var af=/\{@(.+?)\}/g,sf=function(){function t(){}return t.prototype.getDataParams=function(t,e){var n=this.getData(e),i=this.getRawValue(t,e),r=n.getRawIndex(t),o=n.getName(t),a=n.getRawDataItem(t),s=n.getItemVisual(t,"style"),l=s&&s[n.getItemVisual(t,"drawType")||"fill"],u=s&&s.stroke,h=this.mainType,c="series"===h,p=n.userOutput&&n.userOutput.get();return{componentType:h,componentSubType:this.subType,componentIndex:this.componentIndex,seriesType:c?this.subType:null,seriesIndex:this.seriesIndex,seriesId:c?this.id:null,seriesName:c?this.name:null,name:o,dataIndex:r,data:a,dataType:e,value:i,color:l,borderColor:u,dimensionNames:p?p.fullDimensions:null,encode:p?p.encode:null,$vars:["seriesName","name","value"]}},t.prototype.getFormattedLabel=function(t,e,n,i,r,o){e=e||"normal";var a=this.getData(n),s=this.getDataParams(t,n);(o&&(s.value=o.interpolatedValue),null!=i&&Y(s.value)&&(s.value=s.value[i]),r)||(r=a.getItemModel(t).get("normal"===e?["label","formatter"]:[e,"label","formatter"]));return U(r)?(s.status=e,s.dimensionIndex=i,r(s)):X(r)?up(r,s).replace(af,(function(e,n){var i=n.length,r=n;"["===r.charAt(0)&&"]"===r.charAt(i-1)&&(r=+r.slice(1,i-1));var s=of(a,t,r);if(o&&Y(o.interpolatedValue)){var l=a.getDimensionIndex(r);l>=0&&(s=o.interpolatedValue[l])}return null!=s?s+"":""})):void 0},t.prototype.getRawValue=function(t,e){return of(this.getData(e),t)},t.prototype.formatTooltip=function(t,e,n){},t}();function lf(t){var e,n;return q(t)?t.type&&(n=t):e=t,{text:e,frag:n}}function uf(t){return new hf(t)}var hf=function(){function t(t){t=t||{},this._reset=t.reset,this._plan=t.plan,this._count=t.count,this._onDirty=t.onDirty,this._dirty=!0}return t.prototype.perform=function(t){var e,n=this._upstream,i=t&&t.skip;if(this._dirty&&n){var r=this.context;r.data=r.outputData=n.context.outputData}this.__pipeline&&(this.__pipeline.currentTask=this),this._plan&&!i&&(e=this._plan(this.context));var o,a=h(this._modBy),s=this._modDataCount||0,l=h(t&&t.modBy),u=t&&t.modDataCount||0;function h(t){return!(t>=1)&&(t=1),t}a===l&&s===u||(e="reset"),(this._dirty||"reset"===e)&&(this._dirty=!1,o=this._doReset(i)),this._modBy=l,this._modDataCount=u;var c=t&&t.step;if(this._dueEnd=n?n._outputDueEnd:this._count?this._count(this.context):1/0,this._progress){var p=this._dueIndex,d=Math.min(null!=c?this._dueIndex+c:1/0,this._dueEnd);if(!i&&(o||p<d)){var f=this._progress;if(Y(f))for(var g=0;g<f.length;g++)this._doProgress(f[g],p,d,l,u);else this._doProgress(f,p,d,l,u)}this._dueIndex=d;var y=null!=this._settedOutputEnd?this._settedOutputEnd:d;0,this._outputDueEnd=y}else this._dueIndex=this._outputDueEnd=null!=this._settedOutputEnd?this._settedOutputEnd:this._dueEnd;return this.unfinished()},t.prototype.dirty=function(){this._dirty=!0,this._onDirty&&this._onDirty(this.context)},t.prototype._doProgress=function(t,e,n,i,r){cf.reset(e,n,i,r),this._callingProgress=t,this._callingProgress({start:e,end:n,count:n-e,next:cf.next},this.context)},t.prototype._doReset=function(t){var e,n;this._dueIndex=this._outputDueEnd=this._dueEnd=0,this._settedOutputEnd=null,!t&&this._reset&&((e=this._reset(this.context))&&e.progress&&(n=e.forceFirstProgress,e=e.progress),Y(e)&&!e.length&&(e=null)),this._progress=e,this._modBy=this._modDataCount=null;var i=this._downstream;return i&&i.dirty(),n},t.prototype.unfinished=function(){return this._progress&&this._dueIndex<this._dueEnd},t.prototype.pipe=function(t){(this._downstream!==t||this._dirty)&&(this._downstream=t,t._upstream=this,t.dirty())},t.prototype.dispose=function(){this._disposed||(this._upstream&&(this._upstream._downstream=null),this._downstream&&(this._downstream._upstream=null),this._dirty=!1,this._disposed=!0)},t.prototype.getUpstream=function(){return this._upstream},t.prototype.getDownstream=function(){return this._downstream},t.prototype.setOutputEnd=function(t){this._outputDueEnd=this._settedOutputEnd=t},t}(),cf=function(){var t,e,n,i,r,o={reset:function(l,u,h,c){e=l,t=u,n=h,i=c,r=Math.ceil(i/n),o.next=n>1&&i>0?s:a}};return o;function a(){return e<t?e++:null}function s(){var o=e%r*n+Math.ceil(e/r),a=e>=t?null:o<i?o:e;return e++,a}}();function pf(t,e){var n=e&&e.type;return"ordinal"===n?t:("time"!==n||j(t)||null==t||"-"===t||(t=+jr(t)),null==t||""===t?NaN:+t)}var df=ft({number:function(t){return parseFloat(t)},time:function(t){return+jr(t)},trim:function(t){return X(t)?ut(t):t}});function ff(t){return df.get(t)}var gf={lt:function(t,e){return t<e},lte:function(t,e){return t<=e},gt:function(t,e){return t>e},gte:function(t,e){return t>=e}},yf=function(){function t(t,e){if(!j(e)){var n="";0,ao(n)}this._opFn=gf[t],this._rvalFloat=to(e)}return t.prototype.evaluate=function(t){return j(t)?this._opFn(t,this._rvalFloat):this._opFn(to(t),this._rvalFloat)},t}(),vf=function(){function t(t,e){var n="desc"===t;this._resultLT=n?1:-1,null==e&&(e=n?"min":"max"),this._incomparable="min"===e?-1/0:1/0}return t.prototype.evaluate=function(t,e){var n=j(t)?t:to(t),i=j(e)?e:to(e),r=isNaN(n),o=isNaN(i);if(r&&(n=this._incomparable),o&&(i=this._incomparable),r&&o){var a=X(t),s=X(e);a&&(n=s?t:0),s&&(i=a?e:0)}return n<i?this._resultLT:n>i?-this._resultLT:0},t}(),mf=function(){function t(t,e){this._rval=e,this._isEQ=t,this._rvalTypeof=typeof e,this._rvalFloat=to(e)}return t.prototype.evaluate=function(t){var e=t===this._rval;if(!e){var n=typeof t;n===this._rvalTypeof||"number"!==n&&"number"!==this._rvalTypeof||(e=to(t)===this._rvalFloat)}return this._isEQ?e:!e},t}();function xf(t,e){return"eq"===t||"ne"===t?new mf("eq"===t,e):mt(gf,t)?new yf(t,e):null}var _f=function(){function t(){}return t.prototype.getRawData=function(){throw new Error("not supported")},t.prototype.getRawDataItem=function(t){throw new Error("not supported")},t.prototype.cloneRawData=function(){},t.prototype.getDimensionInfo=function(t){},t.prototype.cloneAllDimensionInfo=function(){},t.prototype.count=function(){},t.prototype.retrieveValue=function(t,e){},t.prototype.retrieveValueFromItem=function(t,e){},t.prototype.convertValue=function(t,e){return pf(t,e)},t}();function bf(t){var e=t.sourceFormat;if(!Cf(e)){var n="";0,ao(n)}return t.data}function wf(t){var e=t.sourceFormat,n=t.data;if(!Cf(e)){var i="";0,ao(i)}if(e===Lp){for(var r=[],o=0,a=n.length;o<a;o++)r.push(n[o].slice());return r}if(e===Pp){for(r=[],o=0,a=n.length;o<a;o++)r.push(A({},n[o]));return r}}function Sf(t,e,n){if(null!=n)return j(n)||!isNaN(n)&&!mt(e,n)?t[n]:mt(e,n)?e[n]:void 0}function Mf(t){return T(t)}var If=ft();function Tf(t,e,n,i){var r="";e.length||ao(r),q(t)||ao(r);var o=t.type,a=If.get(o);a||ao(r);var s=z(e,(function(t){return function(t,e){var n=new _f,i=t.data,r=n.sourceFormat=t.sourceFormat,o=t.startIndex,a="";t.seriesLayoutBy!==Ep&&ao(a);var s=[],l={},u=t.dimensionsDefine;if(u)E(u,(function(t,e){var n=t.name,i={index:e,name:n,displayName:t.displayName};if(s.push(i),null!=n){var r="";mt(l,n)&&ao(r),l[n]=i}}));else for(var h=0;h<t.dimensionsDetectedCount;h++)s.push({index:h});var c=Kd(r,Ep);e.__isBuiltIn&&(n.getRawDataItem=function(t){return c(i,o,s,t)},n.getRawData=W(bf,null,t)),n.cloneRawData=W(wf,null,t);var p=Qd(r,Ep);n.count=W(p,null,i,o,s);var d=nf(r);n.retrieveValue=function(t,e){var n=c(i,o,s,t);return f(n,e)};var f=n.retrieveValueFromItem=function(t,e){if(null!=t){var n=s[e];return n?d(t,e,n.name):void 0}};return n.getDimensionInfo=W(Sf,null,s,l),n.cloneAllDimensionInfo=W(Mf,null,s),n}(t,a)})),l=ho(a.transform({upstream:s[0],upstreamList:s,config:T(t.config)}));return z(l,(function(t,n){var i,r="";q(t)||ao(r),t.data||ao(r),Cf(Hd(t.data))||ao(r);var o=e[0];if(o&&0===n&&!t.dimensions){var a=o.startIndex;a&&(t.data=o.data.slice(0,a).concat(t.data)),i={seriesLayoutBy:Ep,sourceHeader:a,dimensions:o.metaRawOption.dimensions}}else i={seriesLayoutBy:Ep,sourceHeader:0,dimensions:t.dimensions};return Gd(t.data,i,null)}))}function Cf(t){return t===Lp||t===Pp}var Df,Af="undefined",kf=typeof Uint32Array===Af?Array:Uint32Array,Lf=typeof Uint16Array===Af?Array:Uint16Array,Pf=typeof Int32Array===Af?Array:Int32Array,Of=typeof Float64Array===Af?Array:Float64Array,Rf={float:Of,int:Pf,ordinal:Array,number:Array,time:Of};function Nf(t){return t>65535?kf:Lf}function Ef(t,e,n,i,r){var o=Rf[n||"float"];if(r){var a=t[e],s=a&&a.length;if(s!==i){for(var l=new o(i),u=0;u<s;u++)l[u]=a[u];t[e]=l}}else t[e]=new o(i)}var zf=function(){function t(){this._chunks=[],this._rawExtent=[],this._extent=[],this._count=0,this._rawCount=0,this._calcDimNameToIdx=ft()}return t.prototype.initData=function(t,e,n){this._provider=t,this._chunks=[],this._indices=null,this.getRawIndex=this._getRawIdxIdentity;var i=t.getSource(),r=this.defaultDimValueGetter=Df[i.sourceFormat];this._dimValueGetter=n||r,this._rawExtent=[];Xd(i);this._dimensions=z(e,(function(t){return{type:t.type,property:t.property}})),this._initDataFromProvider(0,t.count())},t.prototype.getProvider=function(){return this._provider},t.prototype.getSource=function(){return this._provider.getSource()},t.prototype.ensureCalculationDimension=function(t,e){var n=this._calcDimNameToIdx,i=this._dimensions,r=n.get(t);if(null!=r){if(i[r].type===e)return r}else r=i.length;return i[r]={type:e},n.set(t,r),this._chunks[r]=new Rf[e||"float"](this._rawCount),this._rawExtent[r]=[1/0,-1/0],r},t.prototype.collectOrdinalMeta=function(t,e){var n=this._chunks[t],i=this._dimensions[t],r=this._rawExtent,o=i.ordinalOffset||0,a=n.length;0===o&&(r[t]=[1/0,-1/0]);for(var s=r[t],l=o;l<a;l++){var u=n[l]=e.parseAndCollect(n[l]);s[0]=Math.min(u,s[0]),s[1]=Math.max(u,s[1])}i.ordinalMeta=e,i.ordinalOffset=a,i.type="ordinal"},t.prototype.getOrdinalMeta=function(t){return this._dimensions[t].ordinalMeta},t.prototype.getDimensionProperty=function(t){var e=this._dimensions[t];return e&&e.property},t.prototype.appendData=function(t){var e=this._provider,n=this.count();e.appendData(t);var i=e.count();return e.persistent||(i+=n),n<i&&this._initDataFromProvider(n,i,!0),[n,i]},t.prototype.appendValues=function(t,e){for(var n=this._chunks,i=this._dimensions,r=i.length,o=this._rawExtent,a=this.count(),s=a+Math.max(t.length,e||0),l=0;l<r;l++){Ef(n,l,(d=i[l]).type,s,!0)}for(var u=[],h=a;h<s;h++)for(var c=h-a,p=0;p<r;p++){var d=i[p],f=Df.arrayRows.call(this,t[c]||u,d.property,c,p);n[p][h]=f;var g=o[p];f<g[0]&&(g[0]=f),f>g[1]&&(g[1]=f)}return this._rawCount=this._count=s,{start:a,end:s}},t.prototype._initDataFromProvider=function(t,e,n){for(var i=this._provider,r=this._chunks,o=this._dimensions,a=o.length,s=this._rawExtent,l=z(o,(function(t){return t.property})),u=0;u<a;u++){var h=o[u];s[u]||(s[u]=[1/0,-1/0]),Ef(r,u,h.type,e,n)}if(i.fillStorage)i.fillStorage(t,e,r,s);else for(var c=[],p=t;p<e;p++){c=i.getItem(p,c);for(var d=0;d<a;d++){var f=r[d],g=this._dimValueGetter(c,l[d],p,d);f[p]=g;var y=s[d];g<y[0]&&(y[0]=g),g>y[1]&&(y[1]=g)}}!i.persistent&&i.clean&&i.clean(),this._rawCount=this._count=e,this._extent=[]},t.prototype.count=function(){return this._count},t.prototype.get=function(t,e){if(!(e>=0&&e<this._count))return NaN;var n=this._chunks[t];return n?n[this.getRawIndex(e)]:NaN},t.prototype.getValues=function(t,e){var n=[],i=[];if(null==e){e=t,t=[];for(var r=0;r<this._dimensions.length;r++)i.push(r)}else i=t;r=0;for(var o=i.length;r<o;r++)n.push(this.get(i[r],e));return n},t.prototype.getByRawIndex=function(t,e){if(!(e>=0&&e<this._rawCount))return NaN;var n=this._chunks[t];return n?n[e]:NaN},t.prototype.getSum=function(t){var e=0;if(this._chunks[t])for(var n=0,i=this.count();n<i;n++){var r=this.get(t,n);isNaN(r)||(e+=r)}return e},t.prototype.getMedian=function(t){var e=[];this.each([t],(function(t){isNaN(t)||e.push(t)}));var n=e.sort((function(t,e){return t-e})),i=this.count();return 0===i?0:i%2==1?n[(i-1)/2]:(n[i/2]+n[i/2-1])/2},t.prototype.indexOfRawIndex=function(t){if(t>=this._rawCount||t<0)return-1;if(!this._indices)return t;var e=this._indices,n=e[t];if(null!=n&&n<this._count&&n===t)return t;for(var i=0,r=this._count-1;i<=r;){var o=(i+r)/2|0;if(e[o]<t)i=o+1;else{if(!(e[o]>t))return o;r=o-1}}return-1},t.prototype.indicesOfNearest=function(t,e,n){var i=this._chunks[t],r=[];if(!i)return r;null==n&&(n=1/0);for(var o=1/0,a=-1,s=0,l=0,u=this.count();l<u;l++){var h=e-i[this.getRawIndex(l)],c=Math.abs(h);c<=n&&((c<o||c===o&&h>=0&&a<0)&&(o=c,a=h,s=0),h===a&&(r[s++]=l))}return r.length=s,r},t.prototype.getIndices=function(){var t,e=this._indices;if(e){var n=e.constructor,i=this._count;if(n===Array){t=new n(i);for(var r=0;r<i;r++)t[r]=e[r]}else t=new n(e.buffer,0,i)}else{t=new(n=Nf(this._rawCount))(this.count());for(r=0;r<t.length;r++)t[r]=r}return t},t.prototype.filter=function(t,e){if(!this._count)return this;for(var n=this.clone(),i=n.count(),r=new(Nf(n._rawCount))(i),o=[],a=t.length,s=0,l=t[0],u=n._chunks,h=0;h<i;h++){var c=void 0,p=n.getRawIndex(h);if(0===a)c=e(h);else if(1===a){c=e(u[l][p],h)}else{for(var d=0;d<a;d++)o[d]=u[t[d]][p];o[d]=h,c=e.apply(null,o)}c&&(r[s++]=p)}return s<i&&(n._indices=r),n._count=s,n._extent=[],n._updateGetRawIdx(),n},t.prototype.selectRange=function(t){var e=this.clone(),n=e._count;if(!n)return this;var i=G(t),r=i.length;if(!r)return this;var o=e.count(),a=new(Nf(e._rawCount))(o),s=0,l=i[0],u=t[l][0],h=t[l][1],c=e._chunks,p=!1;if(!e._indices){var d=0;if(1===r){for(var f=c[i[0]],g=0;g<n;g++){((x=f[g])>=u&&x<=h||isNaN(x))&&(a[s++]=d),d++}p=!0}else if(2===r){f=c[i[0]];var y=c[i[1]],v=t[i[1]][0],m=t[i[1]][1];for(g=0;g<n;g++){var x=f[g],_=y[g];(x>=u&&x<=h||isNaN(x))&&(_>=v&&_<=m||isNaN(_))&&(a[s++]=d),d++}p=!0}}if(!p)if(1===r)for(g=0;g<o;g++){var b=e.getRawIndex(g);((x=c[i[0]][b])>=u&&x<=h||isNaN(x))&&(a[s++]=b)}else for(g=0;g<o;g++){for(var w=!0,S=(b=e.getRawIndex(g),0);S<r;S++){var M=i[S];((x=c[M][b])<t[M][0]||x>t[M][1])&&(w=!1)}w&&(a[s++]=e.getRawIndex(g))}return s<o&&(e._indices=a),e._count=s,e._extent=[],e._updateGetRawIdx(),e},t.prototype.map=function(t,e){var n=this.clone(t);return this._updateDims(n,t,e),n},t.prototype.modify=function(t,e){this._updateDims(this,t,e)},t.prototype._updateDims=function(t,e,n){for(var i=t._chunks,r=[],o=e.length,a=t.count(),s=[],l=t._rawExtent,u=0;u<e.length;u++)l[e[u]]=[1/0,-1/0];for(var h=0;h<a;h++){for(var c=t.getRawIndex(h),p=0;p<o;p++)s[p]=i[e[p]][c];s[o]=h;var d=n&&n.apply(null,s);if(null!=d){"object"!=typeof d&&(r[0]=d,d=r);for(u=0;u<d.length;u++){var f=e[u],g=d[u],y=l[f],v=i[f];v&&(v[c]=g),g<y[0]&&(y[0]=g),g>y[1]&&(y[1]=g)}}}},t.prototype.lttbDownSample=function(t,e){var n,i,r,o=this.clone([t],!0),a=o._chunks[t],s=this.count(),l=0,u=Math.floor(1/e),h=this.getRawIndex(0),c=new(Nf(this._rawCount))(Math.ceil(s/u)+2);c[l++]=h;for(var p=1;p<s-1;p+=u){for(var d=Math.min(p+u,s-1),f=Math.min(p+2*u,s),g=(f+d)/2,y=0,v=d;v<f;v++){var m=a[S=this.getRawIndex(v)];isNaN(m)||(y+=m)}y/=f-d;var x=p,_=Math.min(p+u,s),b=p-1,w=a[h];n=-1,r=x;for(v=x;v<_;v++){var S;m=a[S=this.getRawIndex(v)];isNaN(m)||(i=Math.abs((b-g)*(m-w)-(b-v)*(y-w)))>n&&(n=i,r=S)}c[l++]=r,h=r}return c[l++]=this.getRawIndex(s-1),o._count=l,o._indices=c,o.getRawIndex=this._getRawIdx,o},t.prototype.downSample=function(t,e,n,i){for(var r=this.clone([t],!0),o=r._chunks,a=[],s=Math.floor(1/e),l=o[t],u=this.count(),h=r._rawExtent[t]=[1/0,-1/0],c=new(Nf(this._rawCount))(Math.ceil(u/s)),p=0,d=0;d<u;d+=s){s>u-d&&(s=u-d,a.length=s);for(var f=0;f<s;f++){var g=this.getRawIndex(d+f);a[f]=l[g]}var y=n(a),v=this.getRawIndex(Math.min(d+i(a,y)||0,u-1));l[v]=y,y<h[0]&&(h[0]=y),y>h[1]&&(h[1]=y),c[p++]=v}return r._count=p,r._indices=c,r._updateGetRawIdx(),r},t.prototype.each=function(t,e){if(this._count)for(var n=t.length,i=this._chunks,r=0,o=this.count();r<o;r++){var a=this.getRawIndex(r);switch(n){case 0:e(r);break;case 1:e(i[t[0]][a],r);break;case 2:e(i[t[0]][a],i[t[1]][a],r);break;default:for(var s=0,l=[];s<n;s++)l[s]=i[t[s]][a];l[s]=r,e.apply(null,l)}}},t.prototype.getDataExtent=function(t){var e=this._chunks[t],n=[1/0,-1/0];if(!e)return n;var i,r=this.count();if(!this._indices)return this._rawExtent[t].slice();if(i=this._extent[t])return i.slice();for(var o=(i=n)[0],a=i[1],s=0;s<r;s++){var l=e[this.getRawIndex(s)];l<o&&(o=l),l>a&&(a=l)}return i=[o,a],this._extent[t]=i,i},t.prototype.getRawDataItem=function(t){var e=this.getRawIndex(t);if(this._provider.persistent)return this._provider.getItem(e);for(var n=[],i=this._chunks,r=0;r<i.length;r++)n.push(i[r][e]);return n},t.prototype.clone=function(e,n){var i,r,o=new t,a=this._chunks,s=e&&V(e,(function(t,e){return t[e]=!0,t}),{});if(s)for(var l=0;l<a.length;l++)o._chunks[l]=s[l]?(i=a[l],r=void 0,(r=i.constructor)===Array?i.slice():new r(i)):a[l];else o._chunks=a;return this._copyCommonProps(o),n||(o._indices=this._cloneIndices()),o._updateGetRawIdx(),o},t.prototype._copyCommonProps=function(t){t._count=this._count,t._rawCount=this._rawCount,t._provider=this._provider,t._dimensions=this._dimensions,t._extent=T(this._extent),t._rawExtent=T(this._rawExtent)},t.prototype._cloneIndices=function(){if(this._indices){var t=this._indices.constructor,e=void 0;if(t===Array){var n=this._indices.length;e=new t(n);for(var i=0;i<n;i++)e[i]=this._indices[i]}else e=new t(this._indices);return e}return null},t.prototype._getRawIdxIdentity=function(t){return t},t.prototype._getRawIdx=function(t){return t<this._count&&t>=0?this._indices[t]:-1},t.prototype._updateGetRawIdx=function(){this.getRawIndex=this._indices?this._getRawIdx:this._getRawIdxIdentity},t.internalField=function(){function t(t,e,n,i){return pf(t[i],this._dimensions[i])}Df={arrayRows:t,objectRows:function(t,e,n,i){return pf(t[e],this._dimensions[i])},keyedColumns:t,original:function(t,e,n,i){var r=t&&(null==t.value?t:t.value);return pf(r instanceof Array?r[i]:r,this._dimensions[i])},typedArray:function(t,e,n,i){return t[i]}}}(),t}(),Vf=function(){function t(t){this._sourceList=[],this._storeList=[],this._upstreamSignList=[],this._versionSignBase=0,this._dirty=!0,this._sourceHost=t}return t.prototype.dirty=function(){this._setLocalSource([],[]),this._storeList=[],this._dirty=!0},t.prototype._setLocalSource=function(t,e){this._sourceList=t,this._upstreamSignList=e,this._versionSignBase++,this._versionSignBase>9e10&&(this._versionSignBase=0)},t.prototype._getVersionSign=function(){return this._sourceHost.uid+"_"+this._versionSignBase},t.prototype.prepareSource=function(){this._isDirty()&&(this._createSource(),this._dirty=!1)},t.prototype._createSource=function(){this._setLocalSource([],[]);var t,e,n=this._sourceHost,i=this._getUpstreamSourceManagers(),r=!!i.length;if(Ff(n)){var o=n,a=void 0,s=void 0,l=void 0;if(r){var u=i[0];u.prepareSource(),a=(l=u.getSource()).data,s=l.sourceFormat,e=[u._getVersionSign()]}else s=$(a=o.get("data",!0))?Rp:kp,e=[];var h=this._getSourceMetaRawOption()||{},c=l&&l.metaRawOption||{},p=rt(h.seriesLayoutBy,c.seriesLayoutBy)||null,d=rt(h.sourceHeader,c.sourceHeader),f=rt(h.dimensions,c.dimensions);t=p!==c.seriesLayoutBy||!!d!=!!c.sourceHeader||f?[Gd(a,{seriesLayoutBy:p,sourceHeader:d,dimensions:f},s)]:[]}else{var g=n;if(r){var y=this._applyTransform(i);t=y.sourceList,e=y.upstreamSignList}else{t=[Gd(g.get("source",!0),this._getSourceMetaRawOption(),null)],e=[]}}this._setLocalSource(t,e)},t.prototype._applyTransform=function(t){var e,n=this._sourceHost,i=n.get("transform",!0),r=n.get("fromTransformResult",!0);if(null!=r){var o="";1!==t.length&&Gf(o)}var a,s=[],l=[];return E(t,(function(t){t.prepareSource();var e=t.getSource(r||0),n="";null==r||e||Gf(n),s.push(e),l.push(t._getVersionSign())})),i?e=function(t,e,n){var i=ho(t),r=i.length,o="";r||ao(o);for(var a=0,s=r;a<s;a++)e=Tf(i[a],e),a!==s-1&&(e.length=Math.max(e.length,1));return e}(i,s,n.componentIndex):null!=r&&(e=[(a=s[0],new Bd({data:a.data,sourceFormat:a.sourceFormat,seriesLayoutBy:a.seriesLayoutBy,dimensionsDefine:T(a.dimensionsDefine),startIndex:a.startIndex,dimensionsDetectedCount:a.dimensionsDetectedCount}))]),{sourceList:e,upstreamSignList:l}},t.prototype._isDirty=function(){if(this._dirty)return!0;for(var t=this._getUpstreamSourceManagers(),e=0;e<t.length;e++){var n=t[e];if(n._isDirty()||this._upstreamSignList[e]!==n._getVersionSign())return!0}},t.prototype.getSource=function(t){t=t||0;var e=this._sourceList[t];if(!e){var n=this._getUpstreamSourceManagers();return n[0]&&n[0].getSource(t)}return e},t.prototype.getSharedDataStore=function(t){var e=t.makeStoreSchema();return this._innerGetDataStore(e.dimensions,t.source,e.hash)},t.prototype._innerGetDataStore=function(t,e,n){var i=this._storeList,r=i[0];r||(r=i[0]={});var o=r[n];if(!o){var a=this._getUpstreamSourceManagers()[0];Ff(this._sourceHost)&&a?o=a._innerGetDataStore(t,e,n):(o=new zf).initData(new Zd(e,t.length),t),r[n]=o}return o},t.prototype._getUpstreamSourceManagers=function(){var t=this._sourceHost;if(Ff(t)){var e=Yp(t);return e?[e.getSourceManager()]:[]}return z(function(t){return t.get("transform",!0)||t.get("fromTransformResult",!0)?Ao(t.ecModel,"dataset",{index:t.get("fromDatasetIndex",!0),id:t.get("fromDatasetId",!0)},Co).models:[]}(t),(function(t){return t.getSourceManager()}))},t.prototype._getSourceMetaRawOption=function(){var t,e,n,i=this._sourceHost;if(Ff(i))t=i.get("seriesLayoutBy",!0),e=i.get("sourceHeader",!0),n=i.get("dimensions",!0);else if(!this._getUpstreamSourceManagers().length){var r=i;t=r.get("seriesLayoutBy",!0),e=r.get("sourceHeader",!0),n=r.get("dimensions",!0)}return{seriesLayoutBy:t,sourceHeader:e,dimensions:n}},t}();function Bf(t){t.option.transform&&ct(t.option.transform)}function Ff(t){return"series"===t.mainType}function Gf(t){throw new Error(t)}function Wf(t,e){var n=t.color||"#6e7079",i=t.fontSize||12,r=t.fontWeight||"400",o=t.color||"#464646",a=t.fontSize||14,s=t.fontWeight||"900";return"html"===e?{nameStyle:"font-size:"+op(i+"")+"px;color:"+op(n)+";font-weight:"+op(r+""),valueStyle:"font-size:"+op(a+"")+"px;color:"+op(o)+";font-weight:"+op(s+"")}:{nameStyle:{fontSize:i,fill:n,fontWeight:r},valueStyle:{fontSize:a,fill:o,fontWeight:s}}}var Hf=[0,10,20,30],Yf=["","\n","\n\n","\n\n\n"];function Uf(t,e){return e.type=t,e}function Xf(t){return"section"===t.type}function Zf(t){return Xf(t)?qf:Kf}function jf(t){if(Xf(t)){var e=0,n=t.blocks.length,i=n>1||n>0&&!t.noHeader;return E(t.blocks,(function(t){var n=jf(t);n>=e&&(e=n+ +(i&&(!n||Xf(t)&&!t.noHeader)))})),e}return 0}function qf(t,e,n,i){var r,o=e.noHeader,a=(r=jf(e),{html:Hf[r],richText:Yf[r]}),s=[],l=e.blocks||[];lt(!l||Y(l)),l=l||[];var u=t.orderMode;if(e.sortBlocks&&u){l=l.slice();var h={valueAsc:"asc",valueDesc:"desc"};if(mt(h,u)){var c=new vf(h[u],null);l.sort((function(t,e){return c.evaluate(t.sortParam,e.sortParam)}))}else"seriesDesc"===u&&l.reverse()}E(l,(function(n,r){var o=e.valueFormatter,l=Zf(n)(o?A(A({},t),{valueFormatter:o}):t,n,r>0?a.html:0,i);null!=l&&s.push(l)}));var p="richText"===t.renderMode?s.join(a.richText):Jf(s.join(""),o?n:a.html);if(o)return p;var d=ap(e.header,"ordinal",t.useUTC),f=Wf(i,t.renderMode).nameStyle;return"richText"===t.renderMode?Qf(t,d,f)+a.richText+p:Jf('<div style="'+f+";"+'line-height:1;">'+op(d)+"</div>"+p,n)}function Kf(t,e,n,i){var r=t.renderMode,o=e.noName,a=e.noValue,s=!e.markerType,l=e.name,u=t.useUTC,h=e.valueFormatter||t.valueFormatter||function(t){return z(t=Y(t)?t:[t],(function(t,e){return ap(t,Y(d)?d[e]:d,u)}))};if(!o||!a){var c=s?"":t.markupStyleCreator.makeTooltipMarker(e.markerType,e.markerColor||"#333",r),p=o?"":ap(l,"ordinal",u),d=e.valueType,f=a?[]:h(e.value),g=!s||!o,y=!s&&o,v=Wf(i,r),m=v.nameStyle,x=v.valueStyle;return"richText"===r?(s?"":c)+(o?"":Qf(t,p,m))+(a?"":function(t,e,n,i,r){var o=[r],a=i?10:20;return n&&o.push({padding:[0,0,0,a],align:"right"}),t.markupStyleCreator.wrapRichTextStyle(Y(e)?e.join("  "):e,o)}(t,f,g,y,x)):Jf((s?"":c)+(o?"":function(t,e,n){return'<span style="'+n+";"+(e?"margin-left:2px":"")+'">'+op(t)+"</span>"}(p,!s,m))+(a?"":function(t,e,n,i){var r=n?"10px":"20px",o=e?"float:right;margin-left:"+r:"";return t=Y(t)?t:[t],'<span style="'+o+";"+i+'">'+z(t,(function(t){return op(t)})).join("&nbsp;&nbsp;")+"</span>"}(f,g,y,x)),n)}}function $f(t,e,n,i,r,o){if(t)return Zf(t)({useUTC:r,renderMode:n,orderMode:i,markupStyleCreator:e,valueFormatter:t.valueFormatter},t,0,o)}function Jf(t,e){return'<div style="'+("margin: "+e+"px 0 0")+";"+'line-height:1;">'+t+'<div style="clear:both"></div></div>'}function Qf(t,e,n){return t.markupStyleCreator.wrapRichTextStyle(e,n)}function tg(t,e){return cp(t.getData().getItemVisual(e,"style")[t.visualDrawType])}function eg(t,e){var n=t.get("padding");return null!=n?n:"richText"===e?[8,10]:10}var ng=function(){function t(){this.richTextStyles={},this._nextStyleNameId=no()}return t.prototype._generateStyleName=function(){return"__EC_aUTo_"+this._nextStyleNameId++},t.prototype.makeTooltipMarker=function(t,e,n){var i="richText"===n?this._generateStyleName():null,r=hp({color:e,type:t,renderMode:n,markerId:i});return X(r)?r:(this.richTextStyles[i]=r.style,r.content)},t.prototype.wrapRichTextStyle=function(t,e){var n={};Y(e)?E(e,(function(t){return A(n,t)})):A(n,e);var i=this._generateStyleName();return this.richTextStyles[i]=n,"{"+i+"|"+t+"}"},t}();function ig(t){var e,n,i,r,o=t.series,a=t.dataIndex,s=t.multipleSeries,l=o.getData(),u=l.mapDimensionsAll("defaultedTooltip"),h=u.length,c=o.getRawValue(a),p=Y(c),d=tg(o,a);if(h>1||p&&!h){var f=function(t,e,n,i,r){var o=e.getData(),a=V(t,(function(t,e,n){var i=o.getDimensionInfo(n);return t||i&&!1!==i.tooltip&&null!=i.displayName}),!1),s=[],l=[],u=[];function h(t,e){var n=o.getDimensionInfo(e);n&&!1!==n.otherDims.tooltip&&(a?u.push(Uf("nameValue",{markerType:"subItem",markerColor:r,name:n.displayName,value:t,valueType:n.type})):(s.push(t),l.push(n.type)))}return i.length?E(i,(function(t){h(of(o,n,t),t)})):E(t,h),{inlineValues:s,inlineValueTypes:l,blocks:u}}(c,o,a,u,d);e=f.inlineValues,n=f.inlineValueTypes,i=f.blocks,r=f.inlineValues[0]}else if(h){var g=l.getDimensionInfo(u[0]);r=e=of(l,a,u[0]),n=g.type}else r=e=p?c[0]:c;var y=_o(o),v=y&&o.name||"",m=l.getName(a),x=s?v:m;return Uf("section",{header:v,noHeader:s||!y,sortParam:r,blocks:[Uf("nameValue",{markerType:"item",markerColor:d,name:x,noName:!ut(x),value:e,valueType:n})].concat(i||[])})}var rg=So();function og(t,e){return t.getName(e)||t.getId(e)}var ag=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e._selectedDataIndicesMap={},e}return n(e,t),e.prototype.init=function(t,e,n){this.seriesIndex=this.componentIndex,this.dataTask=uf({count:lg,reset:ug}),this.dataTask.context={model:this},this.mergeDefaultAndTheme(t,n),(rg(this).sourceManager=new Vf(this)).prepareSource();var i=this.getInitialData(t,n);cg(i,this),this.dataTask.context.data=i,rg(this).dataBeforeProcessed=i,sg(this),this._initSelectedMapFromData(i)},e.prototype.mergeDefaultAndTheme=function(t,e){var n=_p(this),i=n?wp(t):{},r=this.subType;Ip.hasClass(r)&&(r+="Series"),C(t,e.getTheme().get(this.subType)),C(t,this.getDefaultOption()),co(t,"label",["show"]),this.fillDataTextStyle(t.data),n&&bp(t,i,n)},e.prototype.mergeOption=function(t,e){t=C(this.option,t,!0),this.fillDataTextStyle(t.data);var n=_p(this);n&&bp(this.option,t,n);var i=rg(this).sourceManager;i.dirty(),i.prepareSource();var r=this.getInitialData(t,e);cg(r,this),this.dataTask.dirty(),this.dataTask.context.data=r,rg(this).dataBeforeProcessed=r,sg(this),this._initSelectedMapFromData(r)},e.prototype.fillDataTextStyle=function(t){if(t&&!$(t))for(var e=["show"],n=0;n<t.length;n++)t[n]&&t[n].label&&co(t[n],"label",e)},e.prototype.getInitialData=function(t,e){},e.prototype.appendData=function(t){this.getRawData().appendData(t.data)},e.prototype.getData=function(t){var e=dg(this);if(e){var n=e.context.data;return null==t?n:n.getLinkedData(t)}return rg(this).data},e.prototype.getAllData=function(){var t=this.getData();return t&&t.getLinkedDataAll?t.getLinkedDataAll():[{data:t}]},e.prototype.setData=function(t){var e=dg(this);if(e){var n=e.context;n.outputData=t,e!==this.dataTask&&(n.data=t)}rg(this).data=t},e.prototype.getEncode=function(){var t=this.get("encode",!0);if(t)return ft(t)},e.prototype.getSourceManager=function(){return rg(this).sourceManager},e.prototype.getSource=function(){return this.getSourceManager().getSource()},e.prototype.getRawData=function(){return rg(this).dataBeforeProcessed},e.prototype.getColorBy=function(){return this.get("colorBy")||"series"},e.prototype.isColorBySeries=function(){return"series"===this.getColorBy()},e.prototype.getBaseAxis=function(){var t=this.coordinateSystem;return t&&t.getBaseAxis&&t.getBaseAxis()},e.prototype.formatTooltip=function(t,e,n){return ig({series:this,dataIndex:t,multipleSeries:e})},e.prototype.isAnimationEnabled=function(){var t=this.ecModel;if(r.node&&(!t||!t.ssr))return!1;var e=this.getShallow("animation");return e&&this.getData().count()>this.getShallow("animationThreshold")&&(e=!1),!!e},e.prototype.restoreData=function(){this.dataTask.dirty()},e.prototype.getColorFromPalette=function(t,e,n){var i=this.ecModel,r=Qp.prototype.getColorFromPalette.call(this,t,e,n);return r||(r=i.getColorFromPalette(t,e,n)),r},e.prototype.coordDimToDataDim=function(t){return this.getRawData().mapDimensionsAll(t)},e.prototype.getProgressive=function(){return this.get("progressive")},e.prototype.getProgressiveThreshold=function(){return this.get("progressiveThreshold")},e.prototype.select=function(t,e){this._innerSelect(this.getData(e),t)},e.prototype.unselect=function(t,e){var n=this.option.selectedMap;if(n){var i=this.option.selectedMode,r=this.getData(e);if("series"===i||"all"===n)return this.option.selectedMap={},void(this._selectedDataIndicesMap={});for(var o=0;o<t.length;o++){var a=og(r,t[o]);n[a]=!1,this._selectedDataIndicesMap[a]=-1}}},e.prototype.toggleSelect=function(t,e){for(var n=[],i=0;i<t.length;i++)n[0]=t[i],this.isSelected(t[i],e)?this.unselect(n,e):this.select(n,e)},e.prototype.getSelectedDataIndices=function(){if("all"===this.option.selectedMap)return[].slice.call(this.getData().getIndices());for(var t=this._selectedDataIndicesMap,e=G(t),n=[],i=0;i<e.length;i++){var r=t[e[i]];r>=0&&n.push(r)}return n},e.prototype.isSelected=function(t,e){var n=this.option.selectedMap;if(!n)return!1;var i=this.getData(e);return("all"===n||n[og(i,t)])&&!i.getItemModel(t).get(["select","disabled"])},e.prototype.isUniversalTransitionEnabled=function(){if(this.__universalTransitionEnabled)return!0;var t=this.option.universalTransition;return!!t&&(!0===t||t&&t.enabled)},e.prototype._innerSelect=function(t,e){var n,i,r=this.option,o=r.selectedMode,a=e.length;if(o&&a)if("series"===o)r.selectedMap="all";else if("multiple"===o){q(r.selectedMap)||(r.selectedMap={});for(var s=r.selectedMap,l=0;l<a;l++){var u=e[l];s[c=og(t,u)]=!0,this._selectedDataIndicesMap[c]=t.getRawIndex(u)}}else if("single"===o||!0===o){var h=e[a-1],c=og(t,h);r.selectedMap=((n={})[c]=!0,n),this._selectedDataIndicesMap=((i={})[c]=t.getRawIndex(h),i)}},e.prototype._initSelectedMapFromData=function(t){if(!this.option.selectedMap){var e=[];t.hasItemOption&&t.each((function(n){var i=t.getRawDataItem(n);i&&i.selected&&e.push(n)})),e.length>0&&this._innerSelect(t,e)}},e.registerClass=function(t){return Ip.registerClass(t)},e.protoInitialize=function(){var t=e.prototype;t.type="series.__base__",t.seriesIndex=0,t.ignoreStyleOnData=!1,t.hasSymbolVisual=!1,t.defaultSymbol="circle",t.visualStyleAccessPath="itemStyle",t.visualDrawType="fill"}(),e}(Ip);function sg(t){var e=t.name;_o(t)||(t.name=function(t){var e=t.getRawData(),n=e.mapDimensionsAll("seriesName"),i=[];return E(n,(function(t){var n=e.getDimensionInfo(t);n.displayName&&i.push(n.displayName)})),i.join(" ")}(t)||e)}function lg(t){return t.model.getRawData().count()}function ug(t){var e=t.model;return e.setData(e.getRawData().cloneShallow()),hg}function hg(t,e){e.outputData&&t.end>e.outputData.count()&&e.model.getRawData().cloneShallow(e.outputData)}function cg(t,e){E(gt(t.CHANGABLE_METHODS,t.DOWNSAMPLE_METHODS),(function(n){t.wrapMethod(n,H(pg,e))}))}function pg(t,e){var n=dg(t);return n&&n.setOutputEnd((e||this).count()),e}function dg(t){var e=(t.ecModel||{}).scheduler,n=e&&e.getPipeline(t.uid);if(n){var i=n.currentTask;if(i){var r=i.agentStubMap;r&&(i=r.get(t.uid))}return i}}R(ag,sf),R(ag,Qp),zo(ag,Ip);var fg=function(){function t(){this.group=new Cr,this.uid=fc("viewComponent")}return t.prototype.init=function(t,e){},t.prototype.render=function(t,e,n,i){},t.prototype.dispose=function(t,e){},t.prototype.updateView=function(t,e,n,i){},t.prototype.updateLayout=function(t,e,n,i){},t.prototype.updateVisual=function(t,e,n,i){},t.prototype.blurSeries=function(t,e){},t.prototype.eachRendered=function(t){var e=this.group;e&&e.traverse(t)},t}();function gg(){var t=So();return function(e){var n=t(e),i=e.pipelineContext,r=!!n.large,o=!!n.progressiveRender,a=n.large=!(!i||!i.large),s=n.progressiveRender=!(!i||!i.progressiveRender);return!(r===a&&o===s)&&"reset"}}Eo(fg),Go(fg);var yg=So(),vg=gg(),mg=function(){function t(){this.group=new Cr,this.uid=fc("viewChart"),this.renderTask=uf({plan:bg,reset:wg}),this.renderTask.context={view:this}}return t.prototype.init=function(t,e){},t.prototype.render=function(t,e,n,i){0},t.prototype.highlight=function(t,e,n,i){var r=t.getData(i&&i.dataType);r&&_g(r,i,"emphasis")},t.prototype.downplay=function(t,e,n,i){var r=t.getData(i&&i.dataType);r&&_g(r,i,"normal")},t.prototype.remove=function(t,e){this.group.removeAll()},t.prototype.dispose=function(t,e){},t.prototype.updateView=function(t,e,n,i){this.render(t,e,n,i)},t.prototype.updateLayout=function(t,e,n,i){this.render(t,e,n,i)},t.prototype.updateVisual=function(t,e,n,i){this.render(t,e,n,i)},t.prototype.eachRendered=function(t){zh(this.group,t)},t.markUpdateMethod=function(t,e){yg(t).updateMethod=e},t.protoInitialize=void(t.prototype.type="chart"),t}();function xg(t,e,n){t&&Bl(t)&&("emphasis"===e?xl:_l)(t,n)}function _g(t,e,n){var i=wo(t,e),r=e&&null!=e.highlightKey?function(t){var e=Us[t];return null==e&&Ys<=32&&(e=Us[t]=Ys++),e}(e.highlightKey):null;null!=i?E(ho(i),(function(e){xg(t.getItemGraphicEl(e),n,r)})):t.eachItemGraphicEl((function(t){xg(t,n,r)}))}function bg(t){return vg(t.model)}function wg(t){var e=t.model,n=t.ecModel,i=t.api,r=t.payload,o=e.pipelineContext.progressiveRender,a=t.view,s=r&&yg(r).updateMethod,l=o?"incrementalPrepareRender":s&&a[s]?s:"render";return"render"!==l&&a[l](e,n,i,r),Sg[l]}Eo(mg),Go(mg);var Sg={incrementalPrepareRender:{progress:function(t,e){e.view.incrementalRender(t,e.model,e.ecModel,e.api,e.payload)}},render:{forceFirstProgress:!0,progress:function(t,e){e.view.render(e.model,e.ecModel,e.api,e.payload)}}},Mg="\0__throttleOriginMethod",Ig="\0__throttleRate",Tg="\0__throttleType";function Cg(t,e,n){var i,r,o,a,s,l=0,u=0,h=null;function c(){u=(new Date).getTime(),h=null,t.apply(o,a||[])}e=e||0;var p=function(){for(var t=[],p=0;p<arguments.length;p++)t[p]=arguments[p];i=(new Date).getTime(),o=this,a=t;var d=s||e,f=s||n;s=null,r=i-(f?l:u)-d,clearTimeout(h),f?h=setTimeout(c,d):r>=0?c():h=setTimeout(c,-r),l=i};return p.clear=function(){h&&(clearTimeout(h),h=null)},p.debounceNextCall=function(t){s=t},p}function Dg(t,e,n,i){var r=t[e];if(r){var o=r[Mg]||r,a=r[Tg];if(r[Ig]!==n||a!==i){if(null==n||!i)return t[e]=o;(r=t[e]=Cg(o,n,"debounce"===i))[Mg]=o,r[Tg]=i,r[Ig]=n}return r}}function Ag(t,e){var n=t[e];n&&n[Mg]&&(n.clear&&n.clear(),t[e]=n[Mg])}var kg=So(),Lg={itemStyle:Wo(uc,!0),lineStyle:Wo(ac,!0)},Pg={lineStyle:"stroke",itemStyle:"fill"};function Og(t,e){var n=t.visualStyleMapper||Lg[e];return n||(console.warn("Unkown style type '"+e+"'."),Lg.itemStyle)}function Rg(t,e){var n=t.visualDrawType||Pg[e];return n||(console.warn("Unkown style type '"+e+"'."),"fill")}var Ng={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){var n=t.getData(),i=t.visualStyleAccessPath||"itemStyle",r=t.getModel(i),o=Og(t,i)(r),a=r.getShallow("decal");a&&(n.setVisual("decal",a),a.dirty=!0);var s=Rg(t,i),l=o[s],u=U(l)?l:null,h="auto"===o.fill||"auto"===o.stroke;if(!o[s]||u||h){var c=t.getColorFromPalette(t.name,null,e.getSeriesCount());o[s]||(o[s]=c,n.setVisual("colorFromPalette",!0)),o.fill="auto"===o.fill||U(o.fill)?c:o.fill,o.stroke="auto"===o.stroke||U(o.stroke)?c:o.stroke}if(n.setVisual("style",o),n.setVisual("drawType",s),!e.isSeriesFiltered(t)&&u)return n.setVisual("colorFromPalette",!1),{dataEach:function(e,n){var i=t.getDataParams(n),r=A({},o);r[s]=u(i),e.setItemVisual(n,"style",r)}}}},Eg=new pc,zg={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){if(!t.ignoreStyleOnData&&!e.isSeriesFiltered(t)){var n=t.getData(),i=t.visualStyleAccessPath||"itemStyle",r=Og(t,i),o=n.getVisual("drawType");return{dataEach:n.hasItemOption?function(t,e){var n=t.getRawDataItem(e);if(n&&n[i]){Eg.option=n[i];var a=r(Eg);A(t.ensureUniqueItemVisual(e,"style"),a),Eg.option.decal&&(t.setItemVisual(e,"decal",Eg.option.decal),Eg.option.decal.dirty=!0),o in a&&t.setItemVisual(e,"colorFromPalette",!1)}}:null}}}},Vg={performRawSeries:!0,overallReset:function(t){var e=ft();t.eachSeries((function(t){var n=t.getColorBy();if(!t.isColorBySeries()){var i=t.type+"-"+n,r=e.get(i);r||(r={},e.set(i,r)),kg(t).scope=r}})),t.eachSeries((function(e){if(!e.isColorBySeries()&&!t.isSeriesFiltered(e)){var n=e.getRawData(),i={},r=e.getData(),o=kg(e).scope,a=e.visualStyleAccessPath||"itemStyle",s=Rg(e,a);r.each((function(t){var e=r.getRawIndex(t);i[e]=t})),n.each((function(t){var a=i[t];if(r.getItemVisual(a,"colorFromPalette")){var l=r.ensureUniqueItemVisual(a,"style"),u=n.getName(t)||t+"",h=n.count();l[s]=e.getColorFromPalette(u,o,h)}}))}}))}},Bg=Math.PI;var Fg=function(){function t(t,e,n,i){this._stageTaskMap=ft(),this.ecInstance=t,this.api=e,n=this._dataProcessorHandlers=n.slice(),i=this._visualHandlers=i.slice(),this._allHandlers=n.concat(i)}return t.prototype.restoreData=function(t,e){t.restoreData(e),this._stageTaskMap.each((function(t){var e=t.overallTask;e&&e.dirty()}))},t.prototype.getPerformArgs=function(t,e){if(t.__pipeline){var n=this._pipelineMap.get(t.__pipeline.id),i=n.context,r=!e&&n.progressiveEnabled&&(!i||i.progressiveRender)&&t.__idxInPipeline>n.blockIndex?n.step:null,o=i&&i.modDataCount;return{step:r,modBy:null!=o?Math.ceil(o/r):null,modDataCount:o}}},t.prototype.getPipeline=function(t){return this._pipelineMap.get(t)},t.prototype.updateStreamModes=function(t,e){var n=this._pipelineMap.get(t.uid),i=t.getData().count(),r=n.progressiveEnabled&&e.incrementalPrepareRender&&i>=n.threshold,o=t.get("large")&&i>=t.get("largeThreshold"),a="mod"===t.get("progressiveChunkMode")?i:null;t.pipelineContext=n.context={progressiveRender:r,modDataCount:a,large:o}},t.prototype.restorePipelines=function(t){var e=this,n=e._pipelineMap=ft();t.eachSeries((function(t){var i=t.getProgressive(),r=t.uid;n.set(r,{id:r,head:null,tail:null,threshold:t.getProgressiveThreshold(),progressiveEnabled:i&&!(t.preventIncremental&&t.preventIncremental()),blockIndex:-1,step:Math.round(i||700),count:0}),e._pipe(t,t.dataTask)}))},t.prototype.prepareStageTasks=function(){var t=this._stageTaskMap,e=this.api.getModel(),n=this.api;E(this._allHandlers,(function(i){var r=t.get(i.uid)||t.set(i.uid,{}),o="";lt(!(i.reset&&i.overallReset),o),i.reset&&this._createSeriesStageTask(i,r,e,n),i.overallReset&&this._createOverallStageTask(i,r,e,n)}),this)},t.prototype.prepareView=function(t,e,n,i){var r=t.renderTask,o=r.context;o.model=e,o.ecModel=n,o.api=i,r.__block=!t.incrementalPrepareRender,this._pipe(e,r)},t.prototype.performDataProcessorTasks=function(t,e){this._performStageTasks(this._dataProcessorHandlers,t,e,{block:!0})},t.prototype.performVisualTasks=function(t,e,n){this._performStageTasks(this._visualHandlers,t,e,n)},t.prototype._performStageTasks=function(t,e,n,i){i=i||{};var r=!1,o=this;function a(t,e){return t.setDirty&&(!t.dirtyMap||t.dirtyMap.get(e.__pipeline.id))}E(t,(function(t,s){if(!i.visualType||i.visualType===t.visualType){var l=o._stageTaskMap.get(t.uid),u=l.seriesTaskMap,h=l.overallTask;if(h){var c,p=h.agentStubMap;p.each((function(t){a(i,t)&&(t.dirty(),c=!0)})),c&&h.dirty(),o.updatePayload(h,n);var d=o.getPerformArgs(h,i.block);p.each((function(t){t.perform(d)})),h.perform(d)&&(r=!0)}else u&&u.each((function(s,l){a(i,s)&&s.dirty();var u=o.getPerformArgs(s,i.block);u.skip=!t.performRawSeries&&e.isSeriesFiltered(s.context.model),o.updatePayload(s,n),s.perform(u)&&(r=!0)}))}})),this.unfinished=r||this.unfinished},t.prototype.performSeriesTasks=function(t){var e;t.eachSeries((function(t){e=t.dataTask.perform()||e})),this.unfinished=e||this.unfinished},t.prototype.plan=function(){this._pipelineMap.each((function(t){var e=t.tail;do{if(e.__block){t.blockIndex=e.__idxInPipeline;break}e=e.getUpstream()}while(e)}))},t.prototype.updatePayload=function(t,e){"remain"!==e&&(t.context.payload=e)},t.prototype._createSeriesStageTask=function(t,e,n,i){var r=this,o=e.seriesTaskMap,a=e.seriesTaskMap=ft(),s=t.seriesType,l=t.getTargetSeries;function u(e){var s=e.uid,l=a.set(s,o&&o.get(s)||uf({plan:Ug,reset:Xg,count:qg}));l.context={model:e,ecModel:n,api:i,useClearVisual:t.isVisual&&!t.isLayout,plan:t.plan,reset:t.reset,scheduler:r},r._pipe(e,l)}t.createOnAllSeries?n.eachRawSeries(u):s?n.eachRawSeriesByType(s,u):l&&l(n,i).each(u)},t.prototype._createOverallStageTask=function(t,e,n,i){var r=this,o=e.overallTask=e.overallTask||uf({reset:Gg});o.context={ecModel:n,api:i,overallReset:t.overallReset,scheduler:r};var a=o.agentStubMap,s=o.agentStubMap=ft(),l=t.seriesType,u=t.getTargetSeries,h=!0,c=!1,p="";function d(t){var e=t.uid,n=s.set(e,a&&a.get(e)||(c=!0,uf({reset:Wg,onDirty:Yg})));n.context={model:t,overallProgress:h},n.agent=o,n.__block=h,r._pipe(t,n)}lt(!t.createOnAllSeries,p),l?n.eachRawSeriesByType(l,d):u?u(n,i).each(d):(h=!1,E(n.getSeries(),d)),c&&o.dirty()},t.prototype._pipe=function(t,e){var n=t.uid,i=this._pipelineMap.get(n);!i.head&&(i.head=e),i.tail&&i.tail.pipe(e),i.tail=e,e.__idxInPipeline=i.count++,e.__pipeline=i},t.wrapStageHandler=function(t,e){return U(t)&&(t={overallReset:t,seriesType:Kg(t)}),t.uid=fc("stageHandler"),e&&(t.visualType=e),t},t}();function Gg(t){t.overallReset(t.ecModel,t.api,t.payload)}function Wg(t){return t.overallProgress&&Hg}function Hg(){this.agent.dirty(),this.getDownstream().dirty()}function Yg(){this.agent&&this.agent.dirty()}function Ug(t){return t.plan?t.plan(t.model,t.ecModel,t.api,t.payload):null}function Xg(t){t.useClearVisual&&t.data.clearAllVisual();var e=t.resetDefines=ho(t.reset(t.model,t.ecModel,t.api,t.payload));return e.length>1?z(e,(function(t,e){return jg(e)})):Zg}var Zg=jg(0);function jg(t){return function(e,n){var i=n.data,r=n.resetDefines[t];if(r&&r.dataEach)for(var o=e.start;o<e.end;o++)r.dataEach(i,o);else r&&r.progress&&r.progress(e,i)}}function qg(t){return t.data.count()}function Kg(t){$g=null;try{t(Jg,Qg)}catch(t){}return $g}var $g,Jg={},Qg={};function ty(t,e){for(var n in e.prototype)t[n]=xt}ty(Jg,nd),ty(Qg,sd),Jg.eachSeriesByType=Jg.eachRawSeriesByType=function(t){$g=t},Jg.eachComponent=function(t){"series"===t.mainType&&t.subType&&($g=t.subType)};var ey=["#37A2DA","#32C5E9","#67E0E3","#9FE6B8","#FFDB5C","#ff9f7f","#fb7293","#E062AE","#E690D1","#e7bcf3","#9d96f5","#8378EA","#96BFFF"],ny={color:ey,colorLayer:[["#37A2DA","#ffd85c","#fd7b5f"],["#37A2DA","#67E0E3","#FFDB5C","#ff9f7f","#E062AE","#9d96f5"],["#37A2DA","#32C5E9","#9FE6B8","#FFDB5C","#ff9f7f","#fb7293","#e7bcf3","#8378EA","#96BFFF"],ey]},iy="#B9B8CE",ry="#100C2A",oy=function(){return{axisLine:{lineStyle:{color:iy}},splitLine:{lineStyle:{color:"#484753"}},splitArea:{areaStyle:{color:["rgba(255,255,255,0.02)","rgba(255,255,255,0.05)"]}},minorSplitLine:{lineStyle:{color:"#20203B"}}}},ay=["#4992ff","#7cffb2","#fddd60","#ff6e76","#58d9f9","#05c091","#ff8a45","#8d48e3","#dd79ff"],sy={darkMode:!0,color:ay,backgroundColor:ry,axisPointer:{lineStyle:{color:"#817f91"},crossStyle:{color:"#817f91"},label:{color:"#fff"}},legend:{textStyle:{color:iy}},textStyle:{color:iy},title:{textStyle:{color:"#EEF1FA"},subtextStyle:{color:"#B9B8CE"}},toolbox:{iconStyle:{borderColor:iy}},dataZoom:{borderColor:"#71708A",textStyle:{color:iy},brushStyle:{color:"rgba(135,163,206,0.3)"},handleStyle:{color:"#353450",borderColor:"#C5CBE3"},moveHandleStyle:{color:"#B0B6C3",opacity:.3},fillerColor:"rgba(135,163,206,0.2)",emphasis:{handleStyle:{borderColor:"#91B7F2",color:"#4D587D"},moveHandleStyle:{color:"#636D9A",opacity:.7}},dataBackground:{lineStyle:{color:"#71708A",width:1},areaStyle:{color:"#71708A"}},selectedDataBackground:{lineStyle:{color:"#87A3CE"},areaStyle:{color:"#87A3CE"}}},visualMap:{textStyle:{color:iy}},timeline:{lineStyle:{color:iy},label:{color:iy},controlStyle:{color:iy,borderColor:iy}},calendar:{itemStyle:{color:ry},dayLabel:{color:iy},monthLabel:{color:iy},yearLabel:{color:iy}},timeAxis:oy(),logAxis:oy(),valueAxis:oy(),categoryAxis:oy(),line:{symbol:"circle"},graph:{color:ay},gauge:{title:{color:iy},axisLine:{lineStyle:{color:[[1,"rgba(207,212,219,0.2)"]]}},axisLabel:{color:iy},detail:{color:"#EEF1FA"}},candlestick:{itemStyle:{color:"#f64e56",color0:"#54ea92",borderColor:"#f64e56",borderColor0:"#54ea92"}}};sy.categoryAxis.splitLine.show=!1;var ly=function(){function t(){}return t.prototype.normalizeQuery=function(t){var e={},n={},i={};if(X(t)){var r=No(t);e.mainType=r.main||null,e.subType=r.sub||null}else{var o=["Index","Name","Id"],a={name:1,dataIndex:1,dataType:1};E(t,(function(t,r){for(var s=!1,l=0;l<o.length;l++){var u=o[l],h=r.lastIndexOf(u);if(h>0&&h===r.length-u.length){var c=r.slice(0,h);"data"!==c&&(e.mainType=c,e[u.toLowerCase()]=t,s=!0)}}a.hasOwnProperty(r)&&(n[r]=t,s=!0),s||(i[r]=t)}))}return{cptQuery:e,dataQuery:n,otherQuery:i}},t.prototype.filter=function(t,e){var n=this.eventInfo;if(!n)return!0;var i=n.targetEl,r=n.packedEvent,o=n.model,a=n.view;if(!o||!a)return!0;var s=e.cptQuery,l=e.dataQuery;return u(s,o,"mainType")&&u(s,o,"subType")&&u(s,o,"index","componentIndex")&&u(s,o,"name")&&u(s,o,"id")&&u(l,r,"name")&&u(l,r,"dataIndex")&&u(l,r,"dataType")&&(!a.filterForExposedEvent||a.filterForExposedEvent(t,e.otherQuery,i,r));function u(t,e,n,i){return null==t[n]||e[i||n]===t[n]}},t.prototype.afterTrigger=function(){this.eventInfo=null},t}(),uy=["symbol","symbolSize","symbolRotate","symbolOffset"],hy=uy.concat(["symbolKeepAspect"]),cy={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){var n=t.getData();if(t.legendIcon&&n.setVisual("legendIcon",t.legendIcon),t.hasSymbolVisual){for(var i={},r={},o=!1,a=0;a<uy.length;a++){var s=uy[a],l=t.get(s);U(l)?(o=!0,r[s]=l):i[s]=l}if(i.symbol=i.symbol||t.defaultSymbol,n.setVisual(A({legendIcon:t.legendIcon||i.symbol,symbolKeepAspect:t.get("symbolKeepAspect")},i)),!e.isSeriesFiltered(t)){var u=G(r);return{dataEach:o?function(e,n){for(var i=t.getRawValue(n),o=t.getDataParams(n),a=0;a<u.length;a++){var s=u[a];e.setItemVisual(n,s,r[s](i,o))}}:null}}}}},py={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){if(t.hasSymbolVisual&&!e.isSeriesFiltered(t))return{dataEach:t.getData().hasItemOption?function(t,e){for(var n=t.getItemModel(e),i=0;i<hy.length;i++){var r=hy[i],o=n.getShallow(r,!0);null!=o&&t.setItemVisual(e,r,o)}}:null}}};function dy(t,e,n){switch(n){case"color":return t.getItemVisual(e,"style")[t.getVisual("drawType")];case"opacity":return t.getItemVisual(e,"style").opacity;case"symbol":case"symbolSize":case"liftZ":return t.getItemVisual(e,n);default:0}}function fy(t,e){switch(e){case"color":return t.getVisual("style")[t.getVisual("drawType")];case"opacity":return t.getVisual("style").opacity;case"symbol":case"symbolSize":case"liftZ":return t.getVisual(e);default:0}}function gy(t,e,n,i){switch(n){case"color":t.ensureUniqueItemVisual(e,"style")[t.getVisual("drawType")]=i,t.setItemVisual(e,"colorFromPalette",!1);break;case"opacity":t.ensureUniqueItemVisual(e,"style").opacity=i;break;case"symbol":case"symbolSize":case"liftZ":t.setItemVisual(e,n,i);break;default:0}}function yy(t,e){function n(e,n){var i=[];return e.eachComponent({mainType:"series",subType:t,query:n},(function(t){i.push(t.seriesIndex)})),i}E([[t+"ToggleSelect","toggleSelect"],[t+"Select","select"],[t+"UnSelect","unselect"]],(function(t){e(t[0],(function(e,i,r){e=A({},e),r.dispatchAction(A(e,{type:t[1],seriesIndex:n(i,e)}))}))}))}function vy(t,e,n,i,r){var o=t+e;n.isSilent(o)||i.eachComponent({mainType:"series",subType:"pie"},(function(t){for(var e=t.seriesIndex,i=t.option.selectedMap,a=r.selected,s=0;s<a.length;s++)if(a[s].seriesIndex===e){var l=t.getData(),u=wo(l,r.fromActionPayload);n.trigger(o,{type:o,seriesId:t.id,name:Y(u)?l.getName(u[0]):l.getName(u),selected:X(i)?i:A({},i)})}}))}function my(t,e,n){for(var i;t&&(!e(t)||(i=t,!n));)t=t.__hostTarget||t.parent;return i}var xy=Math.round(9*Math.random()),_y="function"==typeof Object.defineProperty,by=function(){function t(){this._id="__ec_inner_"+xy++}return t.prototype.get=function(t){return this._guard(t)[this._id]},t.prototype.set=function(t,e){var n=this._guard(t);return _y?Object.defineProperty(n,this._id,{value:e,enumerable:!1,configurable:!0}):n[this._id]=e,this},t.prototype.delete=function(t){return!!this.has(t)&&(delete this._guard(t)[this._id],!0)},t.prototype.has=function(t){return!!this._guard(t)[this._id]},t.prototype._guard=function(t){if(t!==Object(t))throw TypeError("Value of WeakMap is not a non-null object.");return t},t}(),wy=fs.extend({type:"triangle",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=e.width/2,o=e.height/2;t.moveTo(n,i-o),t.lineTo(n+r,i+o),t.lineTo(n-r,i+o),t.closePath()}}),Sy=fs.extend({type:"diamond",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=e.width/2,o=e.height/2;t.moveTo(n,i-o),t.lineTo(n+r,i),t.lineTo(n,i+o),t.lineTo(n-r,i),t.closePath()}}),My=fs.extend({type:"pin",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.x,i=e.y,r=e.width/5*3,o=Math.max(r,e.height),a=r/2,s=a*a/(o-a),l=i-o+a+s,u=Math.asin(s/a),h=Math.cos(u)*a,c=Math.sin(u),p=Math.cos(u),d=.6*a,f=.7*a;t.moveTo(n-h,l+s),t.arc(n,l,a,Math.PI-u,2*Math.PI+u),t.bezierCurveTo(n+h-c*d,l+s+p*d,n,i-f,n,i),t.bezierCurveTo(n,i-f,n-h+c*d,l+s+p*d,n-h,l+s),t.closePath()}}),Iy=fs.extend({type:"arrow",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.height,i=e.width,r=e.x,o=e.y,a=i/3*2;t.moveTo(r,o),t.lineTo(r+a,o+n),t.lineTo(r,o+n/4*3),t.lineTo(r-a,o+n),t.lineTo(r,o),t.closePath()}}),Ty={line:function(t,e,n,i,r){r.x1=t,r.y1=e+i/2,r.x2=t+n,r.y2=e+i/2},rect:function(t,e,n,i,r){r.x=t,r.y=e,r.width=n,r.height=i},roundRect:function(t,e,n,i,r){r.x=t,r.y=e,r.width=n,r.height=i,r.r=Math.min(n,i)/4},square:function(t,e,n,i,r){var o=Math.min(n,i);r.x=t,r.y=e,r.width=o,r.height=o},circle:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.r=Math.min(n,i)/2},diamond:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.width=n,r.height=i},pin:function(t,e,n,i,r){r.x=t+n/2,r.y=e+i/2,r.width=n,r.height=i},arrow:function(t,e,n,i,r){r.x=t+n/2,r.y=e+i/2,r.width=n,r.height=i},triangle:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.width=n,r.height=i}},Cy={};E({line:Eu,rect:Ts,roundRect:Ts,square:Ts,circle:uu,diamond:Sy,pin:My,arrow:Iy,triangle:wy},(function(t,e){Cy[e]=new t}));var Dy=fs.extend({type:"symbol",shape:{symbolType:"",x:0,y:0,width:0,height:0},calculateTextPosition:function(t,e,n){var i=yr(t,e,n),r=this.shape;return r&&"pin"===r.symbolType&&"inside"===e.position&&(i.y=n.y+.4*n.height),i},buildPath:function(t,e,n){var i=e.symbolType;if("none"!==i){var r=Cy[i];r||(r=Cy[i="rect"]),Ty[i](e.x,e.y,e.width,e.height,r.shape),r.buildPath(t,r.shape,n)}}});function Ay(t,e){if("image"!==this.type){var n=this.style;this.__isEmptyBrush?(n.stroke=t,n.fill=e||"#fff",n.lineWidth=2):"line"===this.shape.symbolType?n.stroke=t:n.fill=t,this.markRedraw()}}function ky(t,e,n,i,r,o,a){var s,l=0===t.indexOf("empty");return l&&(t=t.substr(5,1).toLowerCase()+t.substr(6)),(s=0===t.indexOf("image://")?xh(t.slice(8),new sr(e,n,i,r),a?"center":"cover"):0===t.indexOf("path://")?mh(t.slice(7),{},new sr(e,n,i,r),a?"center":"cover"):new Dy({shape:{symbolType:t,x:e,y:n,width:i,height:r}})).__isEmptyBrush=l,s.setColor=Ay,o&&s.setColor(o),s}function Ly(t){return Y(t)||(t=[+t,+t]),[t[0]||0,t[1]||0]}function Py(t,e){if(null!=t)return Y(t)||(t=[t,t]),[Er(t[0],e[0])||0,Er(rt(t[1],t[0]),e[1])||0]}function Oy(t,e,n){for(var i="radial"===e.type?function(t,e,n){var i=n.width,r=n.height,o=Math.min(i,r),a=null==e.x?.5:e.x,s=null==e.y?.5:e.y,l=null==e.r?.5:e.r;return e.global||(a=a*i+n.x,s=s*r+n.y,l*=o),t.createRadialGradient(a,s,0,a,s,l)}(t,e,n):function(t,e,n){var i=null==e.x?0:e.x,r=null==e.x2?1:e.x2,o=null==e.y?0:e.y,a=null==e.y2?0:e.y2;return e.global||(i=i*n.width+n.x,r=r*n.width+n.x,o=o*n.height+n.y,a=a*n.height+n.y),i=isNaN(i)?0:i,r=isNaN(r)?1:r,o=isNaN(o)?0:o,a=isNaN(a)?0:a,t.createLinearGradient(i,o,r,a)}(t,e,n),r=e.colorStops,o=0;o<r.length;o++)i.addColorStop(r[o].offset,r[o].color);return i}function Ry(t){return parseInt(t,10)}function Ny(t,e,n){var i=["width","height"][e],r=["clientWidth","clientHeight"][e],o=["paddingLeft","paddingTop"][e],a=["paddingRight","paddingBottom"][e];if(null!=n[i]&&"auto"!==n[i])return parseFloat(n[i]);var s=document.defaultView.getComputedStyle(t);return(t[r]||Ry(s[i])||Ry(t.style[i]))-(Ry(s[o])||0)-(Ry(s[a])||0)|0}function Ey(t){var e,n,i=t.style,r=i.lineDash&&i.lineWidth>0&&(e=i.lineDash,n=i.lineWidth,e&&"solid"!==e&&n>0?"dashed"===e?[4*n,2*n]:"dotted"===e?[n]:j(e)?[e]:Y(e)?e:null:null),o=i.lineDashOffset;if(r){var a=i.strokeNoScale&&t.getLineScale?t.getLineScale():1;a&&1!==a&&(r=z(r,(function(t){return t/a})),o/=a)}return[r,o]}var zy=new ja(!0);function Vy(t){var e=t.stroke;return!(null==e||"none"===e||!(t.lineWidth>0))}function By(t){return"string"==typeof t&&"none"!==t}function Fy(t){var e=t.fill;return null!=e&&"none"!==e}function Gy(t,e){if(null!=e.fillOpacity&&1!==e.fillOpacity){var n=t.globalAlpha;t.globalAlpha=e.fillOpacity*e.opacity,t.fill(),t.globalAlpha=n}else t.fill()}function Wy(t,e){if(null!=e.strokeOpacity&&1!==e.strokeOpacity){var n=t.globalAlpha;t.globalAlpha=e.strokeOpacity*e.opacity,t.stroke(),t.globalAlpha=n}else t.stroke()}function Hy(t,e,n){var i=Zo(e.image,e.__image,n);if(qo(i)){var r=t.createPattern(i,e.repeat||"repeat");if("function"==typeof DOMMatrix&&r&&r.setTransform){var o=new DOMMatrix;o.translateSelf(e.x||0,e.y||0),o.rotateSelf(0,0,(e.rotation||0)*_t),o.scaleSelf(e.scaleX||1,e.scaleY||1),r.setTransform(o)}return r}}var Yy=["shadowBlur","shadowOffsetX","shadowOffsetY"],Uy=[["lineCap","butt"],["lineJoin","miter"],["miterLimit",10]];function Xy(t,e,n,i,r){var o=!1;if(!i&&e===(n=n||{}))return!1;if(i||e.opacity!==n.opacity){qy(t,r),o=!0;var a=Math.max(Math.min(e.opacity,1),0);t.globalAlpha=isNaN(a)?ua.opacity:a}(i||e.blend!==n.blend)&&(o||(qy(t,r),o=!0),t.globalCompositeOperation=e.blend||ua.blend);for(var s=0;s<Yy.length;s++){var l=Yy[s];(i||e[l]!==n[l])&&(o||(qy(t,r),o=!0),t[l]=t.dpr*(e[l]||0))}return(i||e.shadowColor!==n.shadowColor)&&(o||(qy(t,r),o=!0),t.shadowColor=e.shadowColor||ua.shadowColor),o}function Zy(t,e,n,i,r){var o=Ky(e,r.inHover),a=i?null:n&&Ky(n,r.inHover)||{};if(o===a)return!1;var s=Xy(t,o,a,i,r);if((i||o.fill!==a.fill)&&(s||(qy(t,r),s=!0),By(o.fill)&&(t.fillStyle=o.fill)),(i||o.stroke!==a.stroke)&&(s||(qy(t,r),s=!0),By(o.stroke)&&(t.strokeStyle=o.stroke)),(i||o.opacity!==a.opacity)&&(s||(qy(t,r),s=!0),t.globalAlpha=null==o.opacity?1:o.opacity),e.hasStroke()){var l=o.lineWidth/(o.strokeNoScale&&e.getLineScale?e.getLineScale():1);t.lineWidth!==l&&(s||(qy(t,r),s=!0),t.lineWidth=l)}for(var u=0;u<Uy.length;u++){var h=Uy[u],c=h[0];(i||o[c]!==a[c])&&(s||(qy(t,r),s=!0),t[c]=o[c]||h[1])}return s}function jy(t,e){var n=e.transform,i=t.dpr||1;n?t.setTransform(i*n[0],i*n[1],i*n[2],i*n[3],i*n[4],i*n[5]):t.setTransform(i,0,0,i,0,0)}function qy(t,e){e.batchFill&&t.fill(),e.batchStroke&&t.stroke(),e.batchFill="",e.batchStroke=""}function Ky(t,e){return e&&t.__hoverStyle||t.style}function $y(t,e){Jy(t,e,{inHover:!1,viewWidth:0,viewHeight:0},!0)}function Jy(t,e,n,i){var r=e.transform;if(!e.shouldBePainted(n.viewWidth,n.viewHeight,!1,!1))return e.__dirty&=-2,void(e.__isRendered=!1);var o=e.__clipPaths,s=n.prevElClipPaths,l=!1,u=!1;if(s&&!function(t,e){if(t===e||!t&&!e)return!1;if(!t||!e||t.length!==e.length)return!0;for(var n=0;n<t.length;n++)if(t[n]!==e[n])return!0;return!1}(o,s)||(s&&s.length&&(qy(t,n),t.restore(),u=l=!0,n.prevElClipPaths=null,n.allClipped=!1,n.prevEl=null),o&&o.length&&(qy(t,n),t.save(),function(t,e,n){for(var i=!1,r=0;r<t.length;r++){var o=t[r];i=i||o.isZeroArea(),jy(e,o),e.beginPath(),o.buildPath(e,o.shape),e.clip()}n.allClipped=i}(o,t,n),l=!0),n.prevElClipPaths=o),n.allClipped)e.__isRendered=!1;else{e.beforeBrush&&e.beforeBrush(),e.innerBeforeBrush();var h=n.prevEl;h||(u=l=!0);var c,p,d=e instanceof fs&&e.autoBatch&&function(t){var e=Fy(t),n=Vy(t);return!(t.lineDash||!(+e^+n)||e&&"string"!=typeof t.fill||n&&"string"!=typeof t.stroke||t.strokePercent<1||t.strokeOpacity<1||t.fillOpacity<1)}(e.style);l||(c=r,p=h.transform,c&&p?c[0]!==p[0]||c[1]!==p[1]||c[2]!==p[2]||c[3]!==p[3]||c[4]!==p[4]||c[5]!==p[5]:c||p)?(qy(t,n),jy(t,e)):d||qy(t,n);var f=Ky(e,n.inHover);e instanceof fs?(1!==n.lastDrawType&&(u=!0,n.lastDrawType=1),Zy(t,e,h,u,n),d&&(n.batchFill||n.batchStroke)||t.beginPath(),function(t,e,n,i){var r,o=Vy(n),a=Fy(n),s=n.strokePercent,l=s<1,u=!e.path;e.silent&&!l||!u||e.createPathProxy();var h=e.path||zy,c=e.__dirty;if(!i){var p=n.fill,d=n.stroke,f=a&&!!p.colorStops,g=o&&!!d.colorStops,y=a&&!!p.image,v=o&&!!d.image,m=void 0,x=void 0,_=void 0,b=void 0,w=void 0;(f||g)&&(w=e.getBoundingRect()),f&&(m=c?Oy(t,p,w):e.__canvasFillGradient,e.__canvasFillGradient=m),g&&(x=c?Oy(t,d,w):e.__canvasStrokeGradient,e.__canvasStrokeGradient=x),y&&(_=c||!e.__canvasFillPattern?Hy(t,p,e):e.__canvasFillPattern,e.__canvasFillPattern=_),v&&(b=c||!e.__canvasStrokePattern?Hy(t,d,e):e.__canvasStrokePattern,e.__canvasStrokePattern=_),f?t.fillStyle=m:y&&(_?t.fillStyle=_:a=!1),g?t.strokeStyle=x:v&&(b?t.strokeStyle=b:o=!1)}var S,M,I=e.getGlobalScale();h.setScale(I[0],I[1],e.segmentIgnoreThreshold),t.setLineDash&&n.lineDash&&(S=(r=Ey(e))[0],M=r[1]);var T=!0;(u||4&c)&&(h.setDPR(t.dpr),l?h.setContext(null):(h.setContext(t),T=!1),h.reset(),e.buildPath(h,e.shape,i),h.toStatic(),e.pathUpdated()),T&&h.rebuildPath(t,l?s:1),S&&(t.setLineDash(S),t.lineDashOffset=M),i||(n.strokeFirst?(o&&Wy(t,n),a&&Gy(t,n)):(a&&Gy(t,n),o&&Wy(t,n))),S&&t.setLineDash([])}(t,e,f,d),d&&(n.batchFill=f.fill||"",n.batchStroke=f.stroke||"")):e instanceof ys?(3!==n.lastDrawType&&(u=!0,n.lastDrawType=3),Zy(t,e,h,u,n),function(t,e,n){var i,r=n.text;if(null!=r&&(r+=""),r){t.font=n.font||a,t.textAlign=n.textAlign,t.textBaseline=n.textBaseline;var o=void 0,s=void 0;t.setLineDash&&n.lineDash&&(o=(i=Ey(e))[0],s=i[1]),o&&(t.setLineDash(o),t.lineDashOffset=s),n.strokeFirst?(Vy(n)&&t.strokeText(r,n.x,n.y),Fy(n)&&t.fillText(r,n.x,n.y)):(Fy(n)&&t.fillText(r,n.x,n.y),Vy(n)&&t.strokeText(r,n.x,n.y)),o&&t.setLineDash([])}}(t,e,f)):e instanceof xs?(2!==n.lastDrawType&&(u=!0,n.lastDrawType=2),function(t,e,n,i,r){Xy(t,Ky(e,r.inHover),n&&Ky(n,r.inHover),i,r)}(t,e,h,u,n),function(t,e,n){var i=e.__image=Zo(n.image,e.__image,e,e.onload);if(i&&qo(i)){var r=n.x||0,o=n.y||0,a=e.getWidth(),s=e.getHeight(),l=i.width/i.height;if(null==a&&null!=s?a=s*l:null==s&&null!=a?s=a/l:null==a&&null==s&&(a=i.width,s=i.height),n.sWidth&&n.sHeight){var u=n.sx||0,h=n.sy||0;t.drawImage(i,u,h,n.sWidth,n.sHeight,r,o,a,s)}else if(n.sx&&n.sy){var c=a-(u=n.sx),p=s-(h=n.sy);t.drawImage(i,u,h,c,p,r,o,a,s)}else t.drawImage(i,r,o,a,s)}}(t,e,f)):e.getTemporalDisplayables&&(4!==n.lastDrawType&&(u=!0,n.lastDrawType=4),function(t,e,n){var i=e.getDisplayables(),r=e.getTemporalDisplayables();t.save();var o,a,s={prevElClipPaths:null,prevEl:null,allClipped:!1,viewWidth:n.viewWidth,viewHeight:n.viewHeight,inHover:n.inHover};for(o=e.getCursor(),a=i.length;o<a;o++){(h=i[o]).beforeBrush&&h.beforeBrush(),h.innerBeforeBrush(),Jy(t,h,s,o===a-1),h.innerAfterBrush(),h.afterBrush&&h.afterBrush(),s.prevEl=h}for(var l=0,u=r.length;l<u;l++){var h;(h=r[l]).beforeBrush&&h.beforeBrush(),h.innerBeforeBrush(),Jy(t,h,s,l===u-1),h.innerAfterBrush(),h.afterBrush&&h.afterBrush(),s.prevEl=h}e.clearTemporalDisplayables(),e.notClear=!0,t.restore()}(t,e,n)),d&&i&&qy(t,n),e.innerAfterBrush(),e.afterBrush&&e.afterBrush(),n.prevEl=e,e.__dirty=0,e.__isRendered=!0}}var Qy=new by,tv=new ln(100),ev=["symbol","symbolSize","symbolKeepAspect","color","backgroundColor","dashArrayX","dashArrayY","maxTileWidth","maxTileHeight"];function nv(t,e){if("none"===t)return null;var n=e.getDevicePixelRatio(),i=e.getZr(),r="svg"===i.painter.type;t.dirty&&Qy.delete(t);var o=Qy.get(t);if(o)return o;var a=k(t,{symbol:"rect",symbolSize:1,symbolKeepAspect:!0,color:"rgba(0, 0, 0, 0.2)",backgroundColor:null,dashArrayX:5,dashArrayY:5,rotation:0,maxTileWidth:512,maxTileHeight:512});"none"===a.backgroundColor&&(a.backgroundColor=null);var s={repeat:"repeat"};return function(t){for(var e,o=[n],s=!0,l=0;l<ev.length;++l){var u=a[ev[l]];if(null!=u&&!Y(u)&&!X(u)&&!j(u)&&"boolean"!=typeof u){s=!1;break}o.push(u)}if(s){e=o.join(",")+(r?"-svg":"");var c=tv.get(e);c&&(r?t.svgElement=c:t.image=c)}var p,d=rv(a.dashArrayX),f=function(t){if(!t||"object"==typeof t&&0===t.length)return[0,0];if(j(t)){var e=Math.ceil(t);return[e,e]}var n=z(t,(function(t){return Math.ceil(t)}));return t.length%2?n.concat(n):n}(a.dashArrayY),g=iv(a.symbol),y=(b=d,z(b,(function(t){return ov(t)}))),v=ov(f),m=!r&&h.createCanvas(),x=r&&{tag:"g",attrs:{},key:"dcl",children:[]},_=function(){for(var t=1,e=0,n=y.length;e<n;++e)t=ro(t,y[e]);var i=1;for(e=0,n=g.length;e<n;++e)i=ro(i,g[e].length);t*=i;var r=v*y.length*g.length;return{width:Math.max(1,Math.min(t,a.maxTileWidth)),height:Math.max(1,Math.min(r,a.maxTileHeight))}}();var b;m&&(m.width=_.width*n,m.height=_.height*n,p=m.getContext("2d"));(function(){p&&(p.clearRect(0,0,m.width,m.height),a.backgroundColor&&(p.fillStyle=a.backgroundColor,p.fillRect(0,0,m.width,m.height)));for(var t=0,e=0;e<f.length;++e)t+=f[e];if(t<=0)return;var o=-v,s=0,l=0,u=0;for(;o<_.height;){if(s%2==0){for(var h=l/2%g.length,c=0,y=0,b=0;c<2*_.width;){var w=0;for(e=0;e<d[u].length;++e)w+=d[u][e];if(w<=0)break;if(y%2==0){var S=.5*(1-a.symbolSize),M=c+d[u][y]*S,I=o+f[s]*S,T=d[u][y]*a.symbolSize,C=f[s]*a.symbolSize,D=b/2%g[h].length;A(M,I,T,C,g[h][D])}c+=d[u][y],++b,++y===d[u].length&&(y=0)}++u===d.length&&(u=0)}o+=f[s],++l,++s===f.length&&(s=0)}function A(t,e,o,s,l){var u=r?1:n,h=ky(l,t*u,e*u,o*u,s*u,a.color,a.symbolKeepAspect);if(r){var c=i.painter.renderOneToVNode(h);c&&x.children.push(c)}else $y(p,h)}})(),s&&tv.put(e,m||x);t.image=m,t.svgElement=x,t.svgWidth=_.width,t.svgHeight=_.height}(s),s.rotation=a.rotation,s.scaleX=s.scaleY=r?1:1/n,Qy.set(t,s),t.dirty=!1,s}function iv(t){if(!t||0===t.length)return[["rect"]];if(X(t))return[[t]];for(var e=!0,n=0;n<t.length;++n)if(!X(t[n])){e=!1;break}if(e)return iv([t]);var i=[];for(n=0;n<t.length;++n)X(t[n])?i.push([t[n]]):i.push(t[n]);return i}function rv(t){if(!t||0===t.length)return[[0,0]];if(j(t))return[[r=Math.ceil(t),r]];for(var e=!0,n=0;n<t.length;++n)if(!j(t[n])){e=!1;break}if(e)return rv([t]);var i=[];for(n=0;n<t.length;++n)if(j(t[n])){var r=Math.ceil(t[n]);i.push([r,r])}else{(r=z(t[n],(function(t){return Math.ceil(t)}))).length%2==1?i.push(r.concat(r)):i.push(r)}return i}function ov(t){for(var e=0,n=0;n<t.length;++n)e+=t[n];return t.length%2==1?2*e:e}var av=new Xt,sv={};function lv(t){return sv[t]}var uv="undefined"!=typeof window,hv=2e3,cv=4500,pv={PROCESSOR:{FILTER:1e3,SERIES_FILTER:800,STATISTIC:5e3},VISUAL:{LAYOUT:1e3,PROGRESSIVE_LAYOUT:1100,GLOBAL:hv,CHART:3e3,POST_CHART_LAYOUT:4600,COMPONENT:4e3,BRUSH:5e3,CHART_ITEM:cv,ARIA:6e3,DECAL:7e3}},dv=/^[a-zA-Z0-9_]+$/,fv="__connectUpdateStatus";function gv(t){return function(){for(var e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];if(!this.isDisposed())return vv(this,t,e);Gv(this.id)}}function yv(t){return function(){for(var e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];return vv(this,t,e)}}function vv(t,e,n){return n[0]=n[0]&&n[0].toLowerCase(),Xt.prototype[e].apply(t,n)}var mv,xv,_v,bv,wv,Sv,Mv,Iv,Tv,Cv,Dv,Av,kv,Lv,Pv,Ov,Rv,Nv,Ev=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e}(Xt),zv=Ev.prototype;zv.on=yv("on"),zv.off=yv("off");var Vv=function(t){function e(e,n,i){var r=t.call(this,new ly)||this;r._chartsViews=[],r._chartsMap={},r._componentsViews=[],r._componentsMap={},r._pendingActions=[],i=i||{},X(n)&&(n=Zv[n]),r._dom=e;var o="canvas",a=!1,s=r._zr=Lr(e,{renderer:i.renderer||o,devicePixelRatio:i.devicePixelRatio,width:i.width,height:i.height,ssr:i.ssr,useDirtyRect:null==i.useDirtyRect?a:i.useDirtyRect});r._ssr=i.ssr,r._throttledZrFlush=Cg(W(s.flush,s),17),(n=T(n))&&Pd(n,!0),r._theme=n,r._locale=function(t){if(X(t)){var e=xc[t.toUpperCase()]||{};return t===yc||t===vc?T(e):C(T(e),T(xc.EN),!1)}return C(T(t),T(xc.EN),!1)}(i.locale||bc),r._coordSysMgr=new ud;var l=r._api=Pv(r);function u(t,e){return t.__prio-e.__prio}return Ie(Xv,u),Ie(Yv,u),r._scheduler=new Fg(r,l,Yv,Xv),r._messageCenter=new Ev,r._initEvents(),r.resize=W(r.resize,r),s.animation.on("frame",r._onframe,r),Cv(s,r),Dv(s,r),ct(r),r}return n(e,t),e.prototype._onframe=function(){if(!this._disposed){Nv(this);var t=this._scheduler;if(this.__pendingUpdate){var e=this.__pendingUpdate.silent;this.__flagInMainProcess=!0;try{mv(this),bv.update.call(this,null,this.__pendingUpdate.updateParams)}catch(t){throw this.__flagInMainProcess=!1,this.__pendingUpdate=null,t}this._zr.flush(),this.__flagInMainProcess=!1,this.__pendingUpdate=null,Iv.call(this,e),Tv.call(this,e)}else if(t.unfinished){var n=1,i=this._model,r=this._api;t.unfinished=!1;do{var o=+new Date;t.performSeriesTasks(i),t.performDataProcessorTasks(i),Sv(this,i),t.performVisualTasks(i),Lv(this,this._model,r,"remain",{}),n-=+new Date-o}while(n>0&&t.unfinished);t.unfinished||this._zr.flush()}}},e.prototype.getDom=function(){return this._dom},e.prototype.getId=function(){return this.id},e.prototype.getZr=function(){return this._zr},e.prototype.isSSR=function(){return this._ssr},e.prototype.setOption=function(t,e,n){if(!this.__flagInMainProcess)if(this._disposed)Gv(this.id);else{var i,r,o;if(q(e)&&(n=e.lazyUpdate,i=e.silent,r=e.replaceMerge,o=e.transition,e=e.notMerge),this.__flagInMainProcess=!0,!this._model||e){var a=new cd(this._api),s=this._theme,l=this._model=new nd;l.scheduler=this._scheduler,l.ssr=this._ssr,l.init(null,null,null,s,this._locale,a)}this._model.setOption(t,{replaceMerge:r},Uv);var u={seriesTransition:o,optionChanged:!0};if(n)this.__pendingUpdate={silent:i,updateParams:u},this.__flagInMainProcess=!1,this.getZr().wakeUp();else{try{mv(this),bv.update.call(this,null,u)}catch(t){throw this.__pendingUpdate=null,this.__flagInMainProcess=!1,t}this._ssr||this._zr.flush(),this.__pendingUpdate=null,this.__flagInMainProcess=!1,Iv.call(this,i),Tv.call(this,i)}}},e.prototype.setTheme=function(){oo()},e.prototype.getModel=function(){return this._model},e.prototype.getOption=function(){return this._model&&this._model.getOption()},e.prototype.getWidth=function(){return this._zr.getWidth()},e.prototype.getHeight=function(){return this._zr.getHeight()},e.prototype.getDevicePixelRatio=function(){return this._zr.painter.dpr||uv&&window.devicePixelRatio||1},e.prototype.getRenderedCanvas=function(t){return this.renderToCanvas(t)},e.prototype.renderToCanvas=function(t){t=t||{};var e=this._zr.painter;return e.getRenderedCanvas({backgroundColor:t.backgroundColor||this._model.get("backgroundColor"),pixelRatio:t.pixelRatio||this.getDevicePixelRatio()})},e.prototype.renderToSVGString=function(t){t=t||{};var e=this._zr.painter;return e.renderToString({useViewBox:t.useViewBox})},e.prototype.getSvgDataURL=function(){if(r.svgSupported){var t=this._zr;return E(t.storage.getDisplayList(),(function(t){t.stopAnimation(null,!0)})),t.painter.toDataURL()}},e.prototype.getDataURL=function(t){if(!this._disposed){var e=(t=t||{}).excludeComponents,n=this._model,i=[],r=this;E(e,(function(t){n.eachComponent({mainType:t},(function(t){var e=r._componentsMap[t.__viewId];e.group.ignore||(i.push(e),e.group.ignore=!0)}))}));var o="svg"===this._zr.painter.getType()?this.getSvgDataURL():this.renderToCanvas(t).toDataURL("image/"+(t&&t.type||"png"));return E(i,(function(t){t.group.ignore=!1})),o}Gv(this.id)},e.prototype.getConnectedDataURL=function(t){if(!this._disposed){var e="svg"===t.type,n=this.group,i=Math.min,r=Math.max,o=1/0;if(Kv[n]){var a=o,s=o,l=-1/0,u=-1/0,c=[],p=t&&t.pixelRatio||this.getDevicePixelRatio();E(qv,(function(o,h){if(o.group===n){var p=e?o.getZr().painter.getSvgDom().innerHTML:o.renderToCanvas(T(t)),d=o.getDom().getBoundingClientRect();a=i(d.left,a),s=i(d.top,s),l=r(d.right,l),u=r(d.bottom,u),c.push({dom:p,left:d.left,top:d.top})}}));var d=(l*=p)-(a*=p),f=(u*=p)-(s*=p),g=h.createCanvas(),y=Lr(g,{renderer:e?"svg":"canvas"});if(y.resize({width:d,height:f}),e){var v="";return E(c,(function(t){var e=t.left-a,n=t.top-s;v+='<g transform="translate('+e+","+n+')">'+t.dom+"</g>"})),y.painter.getSvgRoot().innerHTML=v,t.connectedBackgroundColor&&y.painter.setBackgroundColor(t.connectedBackgroundColor),y.refreshImmediately(),y.painter.toDataURL()}return t.connectedBackgroundColor&&y.add(new Ts({shape:{x:0,y:0,width:d,height:f},style:{fill:t.connectedBackgroundColor}})),E(c,(function(t){var e=new xs({style:{x:t.left*p-a,y:t.top*p-s,image:t.dom}});y.add(e)})),y.refreshImmediately(),g.toDataURL("image/"+(t&&t.type||"png"))}return this.getDataURL(t)}Gv(this.id)},e.prototype.convertToPixel=function(t,e){return wv(this,"convertToPixel",t,e)},e.prototype.convertFromPixel=function(t,e){return wv(this,"convertFromPixel",t,e)},e.prototype.containPixel=function(t,e){var n;if(!this._disposed)return E(Io(this._model,t),(function(t,i){i.indexOf("Models")>=0&&E(t,(function(t){var r=t.coordinateSystem;if(r&&r.containPoint)n=n||!!r.containPoint(e);else if("seriesModels"===i){var o=this._chartsMap[t.__viewId];o&&o.containPoint&&(n=n||o.containPoint(e,t))}else 0}),this)}),this),!!n;Gv(this.id)},e.prototype.getVisual=function(t,e){var n=Io(this._model,t,{defaultMainType:"series"}),i=n.seriesModel;var r=i.getData(),o=n.hasOwnProperty("dataIndexInside")?n.dataIndexInside:n.hasOwnProperty("dataIndex")?r.indexOfRawIndex(n.dataIndex):null;return null!=o?dy(r,o,e):fy(r,e)},e.prototype.getViewOfComponentModel=function(t){return this._componentsMap[t.__viewId]},e.prototype.getViewOfSeriesModel=function(t){return this._chartsMap[t.__viewId]},e.prototype._initEvents=function(){var t,e,n,i=this;E(Fv,(function(t){var e=function(e){var n,r=i.getModel(),o=e.target,a="globalout"===t;if(a?n={}:o&&my(o,(function(t){var e=Ws(t);if(e&&null!=e.dataIndex){var i=e.dataModel||r.getSeriesByIndex(e.seriesIndex);return n=i&&i.getDataParams(e.dataIndex,e.dataType)||{},!0}if(e.eventData)return n=A({},e.eventData),!0}),!0),n){var s=n.componentType,l=n.componentIndex;"markLine"!==s&&"markPoint"!==s&&"markArea"!==s||(s="series",l=n.seriesIndex);var u=s&&null!=l&&r.getComponent(s,l),h=u&&i["series"===u.mainType?"_chartsMap":"_componentsMap"][u.__viewId];0,n.event=e,n.type=t,i._$eventProcessor.eventInfo={targetEl:o,packedEvent:n,model:u,view:h},i.trigger(t,n)}};e.zrEventfulCallAtLast=!0,i._zr.on(t,e,i)})),E(Hv,(function(t,e){i._messageCenter.on(e,(function(t){this.trigger(e,t)}),i)})),E(["selectchanged"],(function(t){i._messageCenter.on(t,(function(e){this.trigger(t,e)}),i)})),t=this._messageCenter,e=this,n=this._api,t.on("selectchanged",(function(t){var i=n.getModel();t.isFromClick?(vy("map","selectchanged",e,i,t),vy("pie","selectchanged",e,i,t)):"select"===t.fromAction?(vy("map","selected",e,i,t),vy("pie","selected",e,i,t)):"unselect"===t.fromAction&&(vy("map","unselected",e,i,t),vy("pie","unselected",e,i,t))}))},e.prototype.isDisposed=function(){return this._disposed},e.prototype.clear=function(){this._disposed?Gv(this.id):this.setOption({series:[]},!0)},e.prototype.dispose=function(){if(this._disposed)Gv(this.id);else{this._disposed=!0,this.getDom()&&ko(this.getDom(),Qv,"");var t=this,e=t._api,n=t._model;E(t._componentsViews,(function(t){t.dispose(n,e)})),E(t._chartsViews,(function(t){t.dispose(n,e)})),t._zr.dispose(),t._dom=t._model=t._chartsMap=t._componentsMap=t._chartsViews=t._componentsViews=t._scheduler=t._api=t._zr=t._throttledZrFlush=t._theme=t._coordSysMgr=t._messageCenter=null,delete qv[t.id]}},e.prototype.resize=function(t){if(!this.__flagInMainProcess)if(this._disposed)Gv(this.id);else{this._zr.resize(t);var e=this._model;if(this._loadingFX&&this._loadingFX.resize(),e){var n=e.resetOption("media"),i=t&&t.silent;this.__pendingUpdate&&(null==i&&(i=this.__pendingUpdate.silent),n=!0,this.__pendingUpdate=null),this.__flagInMainProcess=!0;try{n&&mv(this),bv.update.call(this,{type:"resize",animation:A({duration:0},t&&t.animation)})}catch(t){throw this.__flagInMainProcess=!1,t}this.__flagInMainProcess=!1,Iv.call(this,i),Tv.call(this,i)}}},e.prototype.showLoading=function(t,e){if(this._disposed)Gv(this.id);else if(q(t)&&(e=t,t=""),t=t||"default",this.hideLoading(),jv[t]){var n=jv[t](this._api,e),i=this._zr;this._loadingFX=n,i.add(n)}},e.prototype.hideLoading=function(){this._disposed?Gv(this.id):(this._loadingFX&&this._zr.remove(this._loadingFX),this._loadingFX=null)},e.prototype.makeActionFromEvent=function(t){var e=A({},t);return e.type=Hv[t.type],e},e.prototype.dispatchAction=function(t,e){if(this._disposed)Gv(this.id);else if(q(e)||(e={silent:!!e}),Wv[t.type]&&this._model)if(this.__flagInMainProcess)this._pendingActions.push(t);else{var n=e.silent;Mv.call(this,t,n);var i=e.flush;i?this._zr.flush():!1!==i&&r.browser.weChat&&this._throttledZrFlush(),Iv.call(this,n),Tv.call(this,n)}},e.prototype.updateLabelLayout=function(){av.trigger("series:layoutlabels",this._model,this._api,{updatedSeries:[]})},e.prototype.appendData=function(t){if(this._disposed)Gv(this.id);else{var e=t.seriesIndex,n=this.getModel().getSeriesByIndex(e);0,n.appendData(t),this._scheduler.unfinished=!0,this.getZr().wakeUp()}},e.internalField=function(){function t(t){t.clearColorPalette(),t.eachSeries((function(t){t.clearColorPalette()}))}function e(t){for(var e=[],n=t.currentStates,i=0;i<n.length;i++){var r=n[i];"emphasis"!==r&&"blur"!==r&&"select"!==r&&e.push(r)}t.selected&&t.states.select&&e.push("select"),2===t.hoverState&&t.states.emphasis?e.push("emphasis"):1===t.hoverState&&t.states.blur&&e.push("blur"),t.useStates(e)}function i(t,e){if(!t.preventAutoZ){var n=t.get("z")||0,i=t.get("zlevel")||0;e.eachRendered((function(t){return o(t,n,i,-1/0),!0}))}}function o(t,e,n,i){var r=t.getTextContent(),a=t.getTextGuideLine();if(t.isGroup)for(var s=t.childrenRef(),l=0;l<s.length;l++)i=Math.max(o(s[l],e,n,i),i);else t.z=e,t.zlevel=n,i=Math.max(t.z2,i);if(r&&(r.z=e,r.zlevel=n,isFinite(i)&&(r.z2=i+2)),a){var u=t.textGuideLineConfig;a.z=e,a.zlevel=n,isFinite(i)&&(a.z2=i+(u&&u.showAbove?1:-1))}return i}function a(t,e){e.eachRendered((function(t){if(!oh(t)){var e=t.getTextContent(),n=t.getTextGuideLine();t.stateTransition&&(t.stateTransition=null),e&&e.stateTransition&&(e.stateTransition=null),n&&n.stateTransition&&(n.stateTransition=null),t.hasState()?(t.prevStates=t.currentStates,t.clearStates()):t.prevStates&&(t.prevStates=null)}}))}function s(t,n){var i=t.getModel("stateAnimation"),r=t.isAnimationEnabled(),o=i.get("duration"),a=o>0?{duration:o,delay:i.get("delay"),easing:i.get("easing")}:null;n.eachRendered((function(t){if(t.states&&t.states.emphasis){if(oh(t))return;if(t instanceof fs&&function(t){var e=Xs(t);e.normalFill=t.style.fill,e.normalStroke=t.style.stroke;var n=t.states.select||{};e.selectFill=n.style&&n.style.fill||null,e.selectStroke=n.style&&n.style.stroke||null}(t),t.__dirty){var n=t.prevStates;n&&t.useStates(n)}if(r){t.stateTransition=a;var i=t.getTextContent(),o=t.getTextGuideLine();i&&(i.stateTransition=a),o&&(o.stateTransition=a)}t.__dirty&&e(t)}}))}mv=function(t){var e=t._scheduler;e.restorePipelines(t._model),e.prepareStageTasks(),xv(t,!0),xv(t,!1),e.plan()},xv=function(t,e){for(var n=t._model,i=t._scheduler,r=e?t._componentsViews:t._chartsViews,o=e?t._componentsMap:t._chartsMap,a=t._zr,s=t._api,l=0;l<r.length;l++)r[l].__alive=!1;function u(t){var l=t.__requireNewView;t.__requireNewView=!1;var u="_ec_"+t.id+"_"+t.type,h=!l&&o[u];if(!h){var c=No(t.type),p=e?fg.getClass(c.main,c.sub):mg.getClass(c.sub);0,(h=new p).init(n,s),o[u]=h,r.push(h),a.add(h.group)}t.__viewId=h.__id=u,h.__alive=!0,h.__model=t,h.group.__ecComponentInfo={mainType:t.mainType,index:t.componentIndex},!e&&i.prepareView(h,t,n,s)}e?n.eachComponent((function(t,e){"series"!==t&&u(e)})):n.eachSeries(u);for(l=0;l<r.length;){var h=r[l];h.__alive?l++:(!e&&h.renderTask.dispose(),a.remove(h.group),h.dispose(n,s),r.splice(l,1),o[h.__id]===h&&delete o[h.__id],h.__id=h.group.__ecComponentInfo=null)}},_v=function(t,e,n,i,r){var o=t._model;if(o.setUpdatePayload(n),i){var a={};a[i+"Id"]=n[i+"Id"],a[i+"Index"]=n[i+"Index"],a[i+"Name"]=n[i+"Name"];var s={mainType:i,query:a};r&&(s.subType=r);var l,u=n.excludeSeriesId;null!=u&&(l=ft(),E(ho(u),(function(t){var e=xo(t,null);null!=e&&l.set(e,!0)}))),o&&o.eachComponent(s,(function(e){if(!(l&&null!==l.get(e.id)))if(Gl(n))if(e instanceof ag)n.type!==$s||n.notBlur||e.get(["emphasis","disabled"])||function(t,e,n){var i=t.seriesIndex,r=t.getData(e.dataType);if(r){var o=wo(r,e);o=(Y(o)?o[0]:o)||0;var a=r.getItemGraphicEl(o);if(!a)for(var s=r.count(),l=0;!a&&l<s;)a=r.getItemGraphicEl(l++);if(a){var u=Ws(a);Cl(i,u.focus,u.blurScope,n)}else{var h=t.get(["emphasis","focus"]),c=t.get(["emphasis","blurScope"]);null!=h&&Cl(i,h,c,n)}}}(e,n,t._api);else{var i=Al(e.mainType,e.componentIndex,n.name,t._api),r=i.focusSelf,o=i.dispatchers;n.type===$s&&r&&!n.notBlur&&Dl(e.mainType,e.componentIndex,t._api),o&&E(o,(function(t){n.type===$s?xl(t):_l(t)}))}else Fl(n)&&e instanceof ag&&(!function(t,e,n){if(Fl(e)){var i=e.dataType,r=wo(t.getData(i),e);Y(r)||(r=[r]),t[e.type===el?"toggleSelect":e.type===Qs?"select":"unselect"](r,i)}}(e,n,t._api),kl(e),Rv(t))}),t),o&&o.eachComponent(s,(function(e){l&&null!==l.get(e.id)||h(t["series"===i?"_chartsMap":"_componentsMap"][e.__viewId])}),t)}else E([].concat(t._componentsViews).concat(t._chartsViews),h);function h(i){i&&i.__alive&&i[e]&&i[e](i.__model,o,t._api,n)}},bv={prepareAndUpdate:function(t){mv(this),bv.update.call(this,t,{optionChanged:null!=t.newOption})},update:function(e,n){var i=this._model,r=this._api,o=this._zr,a=this._coordSysMgr,s=this._scheduler;if(i){i.setUpdatePayload(e),s.restoreData(i,e),s.performSeriesTasks(i),a.create(i,r),s.performDataProcessorTasks(i,e),Sv(this,i),a.update(i,r),t(i),s.performVisualTasks(i,e),Av(this,i,r,e,n);var l=i.get("backgroundColor")||"transparent",u=i.get("darkMode");o.setBackgroundColor(l),null!=u&&"auto"!==u&&o.setDarkMode(u),av.trigger("afterupdate",i,r)}},updateTransform:function(e){var n=this,i=this._model,r=this._api;if(i){i.setUpdatePayload(e);var o=[];i.eachComponent((function(t,a){if("series"!==t){var s=n.getViewOfComponentModel(a);if(s&&s.__alive)if(s.updateTransform){var l=s.updateTransform(a,i,r,e);l&&l.update&&o.push(s)}else o.push(s)}}));var a=ft();i.eachSeries((function(t){var o=n._chartsMap[t.__viewId];if(o.updateTransform){var s=o.updateTransform(t,i,r,e);s&&s.update&&a.set(t.uid,1)}else a.set(t.uid,1)})),t(i),this._scheduler.performVisualTasks(i,e,{setDirty:!0,dirtyMap:a}),Lv(this,i,r,e,{},a),av.trigger("afterupdate",i,r)}},updateView:function(e){var n=this._model;n&&(n.setUpdatePayload(e),mg.markUpdateMethod(e,"updateView"),t(n),this._scheduler.performVisualTasks(n,e,{setDirty:!0}),Av(this,n,this._api,e,{}),av.trigger("afterupdate",n,this._api))},updateVisual:function(e){var n=this,i=this._model;i&&(i.setUpdatePayload(e),i.eachSeries((function(t){t.getData().clearAllVisual()})),mg.markUpdateMethod(e,"updateVisual"),t(i),this._scheduler.performVisualTasks(i,e,{visualType:"visual",setDirty:!0}),i.eachComponent((function(t,r){if("series"!==t){var o=n.getViewOfComponentModel(r);o&&o.__alive&&o.updateVisual(r,i,n._api,e)}})),i.eachSeries((function(t){n._chartsMap[t.__viewId].updateVisual(t,i,n._api,e)})),av.trigger("afterupdate",i,this._api))},updateLayout:function(t){bv.update.call(this,t)}},wv=function(t,e,n,i){if(t._disposed)Gv(t.id);else{for(var r,o=t._model,a=t._coordSysMgr.getCoordinateSystems(),s=Io(o,n),l=0;l<a.length;l++){var u=a[l];if(u[e]&&null!=(r=u[e](o,s,i)))return r}0}},Sv=function(t,e){var n=t._chartsMap,i=t._scheduler;e.eachSeries((function(t){i.updateStreamModes(t,n[t.__viewId])}))},Mv=function(t,e){var n=this,i=this.getModel(),r=t.type,o=t.escapeConnect,a=Wv[r],s=a.actionInfo,l=(s.update||"update").split(":"),u=l.pop(),h=null!=l[0]&&No(l[0]);this.__flagInMainProcess=!0;var c=[t],p=!1;t.batch&&(p=!0,c=z(t.batch,(function(e){return(e=k(A({},e),t)).batch=null,e})));var d,f=[],g=Fl(t),y=Gl(t);if(y&&Tl(this._api),E(c,(function(e){if((d=(d=a.action(e,n._model,n._api))||A({},e)).type=s.event||d.type,f.push(d),y){var i=To(t),r=i.queryOptionMap,o=i.mainTypeSpecified?r.keys()[0]:"series";_v(n,u,e,o),Rv(n)}else g?(_v(n,u,e,"series"),Rv(n)):h&&_v(n,u,e,h.main,h.sub)})),"none"!==u&&!y&&!g&&!h)try{this.__pendingUpdate?(mv(this),bv.update.call(this,t),this.__pendingUpdate=null):bv[u].call(this,t)}catch(t){throw this.__flagInMainProcess=!1,t}if(d=p?{type:s.event||r,escapeConnect:o,batch:f}:f[0],this.__flagInMainProcess=!1,!e){var v=this._messageCenter;if(v.trigger(d.type,d),g){var m={type:"selectchanged",escapeConnect:o,selected:Ll(i),isFromClick:t.isFromClick||!1,fromAction:t.type,fromActionPayload:t};v.trigger(m.type,m)}}},Iv=function(t){for(var e=this._pendingActions;e.length;){var n=e.shift();Mv.call(this,n,t)}},Tv=function(t){!t&&this.trigger("updated")},Cv=function(t,e){t.on("rendered",(function(n){e.trigger("rendered",n),!t.animation.isFinished()||e.__pendingUpdate||e._scheduler.unfinished||e._pendingActions.length||e.trigger("finished")}))},Dv=function(t,e){t.on("mouseover",(function(t){var n=my(t.target,Bl);n&&(!function(t,e,n){var i=Ws(t),r=Al(i.componentMainType,i.componentIndex,i.componentHighDownName,n),o=r.dispatchers,a=r.focusSelf;o?(a&&Dl(i.componentMainType,i.componentIndex,n),E(o,(function(t){return vl(t,e)}))):(Cl(i.seriesIndex,i.focus,i.blurScope,n),"self"===i.focus&&Dl(i.componentMainType,i.componentIndex,n),vl(t,e))}(n,t,e._api),Rv(e))})).on("mouseout",(function(t){var n=my(t.target,Bl);n&&(!function(t,e,n){Tl(n);var i=Ws(t),r=Al(i.componentMainType,i.componentIndex,i.componentHighDownName,n).dispatchers;r?E(r,(function(t){return ml(t,e)})):ml(t,e)}(n,t,e._api),Rv(e))})).on("click",(function(t){var n=my(t.target,(function(t){return null!=Ws(t).dataIndex}),!0);if(n){var i=n.selected?"unselect":"select",r=Ws(n);e._api.dispatchAction({type:i,dataType:r.dataType,dataIndexInside:r.dataIndex,seriesIndex:r.seriesIndex,isFromClick:!0})}}))},Av=function(t,e,n,i,r){!function(t){var e=[],n=[],i=!1;if(t.eachComponent((function(t,r){var o=r.get("zlevel")||0,a=r.get("z")||0,s=r.getZLevelKey();i=i||!!s,("series"===t?n:e).push({zlevel:o,z:a,idx:r.componentIndex,type:t,key:s})})),i){var r,o,a=e.concat(n);Ie(a,(function(t,e){return t.zlevel===e.zlevel?t.z-e.z:t.zlevel-e.zlevel})),E(a,(function(e){var n=t.getComponent(e.type,e.idx),i=e.zlevel,a=e.key;null!=r&&(i=Math.max(r,i)),a?(i===r&&a!==o&&i++,o=a):o&&(i===r&&i++,o=""),r=i,n.setZLevel(i)}))}}(e),kv(t,e,n,i,r),E(t._chartsViews,(function(t){t.__alive=!1})),Lv(t,e,n,i,r),E(t._chartsViews,(function(t){t.__alive||t.remove(e,n)}))},kv=function(t,e,n,r,o,l){E(l||t._componentsViews,(function(t){var o=t.__model;a(o,t),t.render(o,e,n,r),i(o,t),s(o,t)}))},Lv=function(t,e,n,o,l,u){var h=t._scheduler;l=A(l||{},{updatedSeries:e.getSeries()}),av.trigger("series:beforeupdate",e,n,l);var c=!1;e.eachSeries((function(e){var n=t._chartsMap[e.__viewId];n.__alive=!0;var i=n.renderTask;h.updatePayload(i,o),a(e,n),u&&u.get(e.uid)&&i.dirty(),i.perform(h.getPerformArgs(i))&&(c=!0),n.group.silent=!!e.get("silent"),function(t,e){var n=t.get("blendMode")||null;e.eachRendered((function(t){t.isGroup||(t.style.blend=n)}))}(e,n),kl(e)})),h.unfinished=c||h.unfinished,av.trigger("series:layoutlabels",e,n,l),av.trigger("series:transition",e,n,l),e.eachSeries((function(e){var n=t._chartsMap[e.__viewId];i(e,n),s(e,n)})),function(t,e){var n=t._zr.storage,i=0;n.traverse((function(t){t.isGroup||i++})),i>e.get("hoverLayerThreshold")&&!r.node&&!r.worker&&e.eachSeries((function(e){if(!e.preventUsingHoverLayer){var n=t._chartsMap[e.__viewId];n.__alive&&n.eachRendered((function(t){t.states.emphasis&&(t.states.emphasis.hoverLayer=!0)}))}}))}(t,e),av.trigger("series:afterupdate",e,n,l)},Rv=function(t){t.__needsUpdateStatus=!0,t.getZr().wakeUp()},Nv=function(t){t.__needsUpdateStatus&&(t.getZr().storage.traverse((function(t){oh(t)||e(t)})),t.__needsUpdateStatus=!1)},Pv=function(t){return new(function(e){function i(){return null!==e&&e.apply(this,arguments)||this}return n(i,e),i.prototype.getCoordinateSystems=function(){return t._coordSysMgr.getCoordinateSystems()},i.prototype.getComponentByElement=function(e){for(;e;){var n=e.__ecComponentInfo;if(null!=n)return t._model.getComponent(n.mainType,n.index);e=e.parent}},i.prototype.enterEmphasis=function(e,n){xl(e,n),Rv(t)},i.prototype.leaveEmphasis=function(e,n){_l(e,n),Rv(t)},i.prototype.enterBlur=function(e){bl(e),Rv(t)},i.prototype.leaveBlur=function(e){wl(e),Rv(t)},i.prototype.enterSelect=function(e){Sl(e),Rv(t)},i.prototype.leaveSelect=function(e){Ml(e),Rv(t)},i.prototype.getModel=function(){return t.getModel()},i.prototype.getViewOfComponentModel=function(e){return t.getViewOfComponentModel(e)},i.prototype.getViewOfSeriesModel=function(e){return t.getViewOfSeriesModel(e)},i}(sd))(t)},Ov=function(t){function e(t,e){for(var n=0;n<t.length;n++){t[n][fv]=e}}E(Hv,(function(n,i){t._messageCenter.on(i,(function(n){if(Kv[t.group]&&0!==t[fv]){if(n&&n.escapeConnect)return;var i=t.makeActionFromEvent(n),r=[];E(qv,(function(e){e!==t&&e.group===t.group&&r.push(e)})),e(r,0),E(r,(function(t){1!==t[fv]&&t.dispatchAction(i)})),e(r,2)}}))}))}}(),e}(Xt),Bv=Vv.prototype;Bv.on=gv("on"),Bv.off=gv("off"),Bv.one=function(t,e,n){var i=this;oo(),this.on.call(this,t,(function n(){for(var r=[],o=0;o<arguments.length;o++)r[o]=arguments[o];e&&e.apply&&e.apply(this,r),i.off(t,n)}),n)};var Fv=["click","dblclick","mouseover","mouseout","mousemove","mousedown","mouseup","globalout","contextmenu"];function Gv(t){0}var Wv={},Hv={},Yv=[],Uv=[],Xv=[],Zv={},jv={},qv={},Kv={},$v=+new Date-0,Jv=+new Date-0,Qv="_echarts_instance_";function tm(t){Kv[t]=!1}var em=tm;function nm(t){return qv[function(t,e){return t.getAttribute?t.getAttribute(e):t[e]}(t,Qv)]}function im(t,e){Zv[t]=e}function rm(t){P(Uv,t)<0&&Uv.push(t)}function om(t,e){fm(Yv,t,e,2e3)}function am(t){lm("afterinit",t)}function sm(t){lm("afterupdate",t)}function lm(t,e){av.on(t,e)}function um(t,e,n){U(e)&&(n=e,e="");var i=q(t)?t.type:[t,t={event:e}][0];t.event=(t.event||i).toLowerCase(),e=t.event,Hv[e]||(lt(dv.test(i)&&dv.test(e)),Wv[i]||(Wv[i]={action:n,actionInfo:t}),Hv[e]=i)}function hm(t,e){ud.register(t,e)}function cm(t,e){fm(Xv,t,e,1e3,"layout")}function pm(t,e){fm(Xv,t,e,3e3,"visual")}var dm=[];function fm(t,e,n,i,r){if((U(e)||q(e))&&(n=e,e=i),!(P(dm,n)>=0)){dm.push(n);var o=Fg.wrapStageHandler(n,r);o.__prio=e,o.__raw=n,t.push(o)}}function gm(t,e){jv[t]=e}function ym(t,e,n){var i=lv("registerMap");i&&i(t,e,n)}var vm=function(t){var e=(t=T(t)).type,n="";e||ao(n);var i=e.split(":");2!==i.length&&ao(n);var r=!1;"echarts"===i[0]&&(e=i[1],r=!0),t.__isBuiltIn=r,If.set(e,t)};pm(hv,Ng),pm(cv,zg),pm(cv,Vg),pm(hv,cy),pm(cv,py),pm(7e3,(function(t,e){t.eachRawSeries((function(n){if(!t.isSeriesFiltered(n)){var i=n.getData();i.hasItemVisual()&&i.each((function(t){var n=i.getItemVisual(t,"decal");n&&(i.ensureUniqueItemVisual(t,"style").decal=nv(n,e))}));var r=i.getVisual("decal");if(r)i.getVisual("style").decal=nv(r,e)}}))})),rm(Pd),om(900,(function(t){var e=ft();t.eachSeries((function(t){var n=t.get("stack");if(n){var i=e.get(n)||e.set(n,[]),r=t.getData(),o={stackResultDimension:r.getCalculationInfo("stackResultDimension"),stackedOverDimension:r.getCalculationInfo("stackedOverDimension"),stackedDimension:r.getCalculationInfo("stackedDimension"),stackedByDimension:r.getCalculationInfo("stackedByDimension"),isStackedByIndex:r.getCalculationInfo("isStackedByIndex"),data:r,seriesModel:t};if(!o.stackedDimension||!o.isStackedByIndex&&!o.stackedByDimension)return;i.length&&r.setCalculationInfo("stackedOnSeries",i[i.length-1].seriesModel),i.push(o)}})),e.each(Od)})),gm("default",(function(t,e){k(e=e||{},{text:"loading",textColor:"#000",fontSize:12,fontWeight:"normal",fontStyle:"normal",fontFamily:"sans-serif",maskColor:"rgba(255, 255, 255, 0.8)",showSpinner:!0,color:"#5470c6",spinnerRadius:10,lineWidth:5,zlevel:0});var n=new Cr,i=new Ts({style:{fill:e.maskColor},zlevel:e.zlevel,z:1e4});n.add(i);var r,o=new As({style:{text:e.text,fill:e.textColor,fontSize:e.fontSize,fontWeight:e.fontWeight,fontStyle:e.fontStyle,fontFamily:e.fontFamily},zlevel:e.zlevel,z:10001}),a=new Ts({style:{fill:"none"},textContent:o,textConfig:{position:"right",distance:10},zlevel:e.zlevel,z:10001});return n.add(a),e.showSpinner&&((r=new Wu({shape:{startAngle:-Bg/2,endAngle:-Bg/2+.1,r:e.spinnerRadius},style:{stroke:e.color,lineCap:"round",lineWidth:e.lineWidth},zlevel:e.zlevel,z:10001})).animateShape(!0).when(1e3,{endAngle:3*Bg/2}).start("circularInOut"),r.animateShape(!0).when(1e3,{startAngle:3*Bg/2}).delay(300).start("circularInOut"),n.add(r)),n.resize=function(){var n=o.getBoundingRect().width,s=e.showSpinner?e.spinnerRadius:0,l=(t.getWidth()-2*s-(e.showSpinner&&n?10:0)-n)/2-(e.showSpinner&&n?0:5+n/2)+(e.showSpinner?0:n/2)+(n?0:s),u=t.getHeight()/2;e.showSpinner&&r.setShape({cx:l,cy:u}),a.setShape({x:l-s,y:u-s,width:2*s,height:2*s}),i.setShape({x:0,y:0,width:t.getWidth(),height:t.getHeight()})},n.resize(),n})),um({type:$s,event:$s,update:$s},xt),um({type:Js,event:Js,update:Js},xt),um({type:Qs,event:Qs,update:Qs},xt),um({type:tl,event:tl,update:tl},xt),um({type:el,event:el,update:el},xt),im("light",ny),im("dark",sy);var mm=[],xm={registerPreprocessor:rm,registerProcessor:om,registerPostInit:am,registerPostUpdate:sm,registerUpdateLifecycle:lm,registerAction:um,registerCoordinateSystem:hm,registerLayout:cm,registerVisual:pm,registerTransform:vm,registerLoading:gm,registerMap:ym,registerImpl:function(t,e){sv[t]=e},PRIORITY:pv,ComponentModel:Ip,ComponentView:fg,SeriesModel:ag,ChartView:mg,registerComponentModel:function(t){Ip.registerClass(t)},registerComponentView:function(t){fg.registerClass(t)},registerSeriesModel:function(t){ag.registerClass(t)},registerChartView:function(t){mg.registerClass(t)},registerSubTypeDefaulter:function(t,e){Ip.registerSubTypeDefaulter(t,e)},registerPainter:function(t,e){Pr(t,e)}};function _m(t){Y(t)?E(t,(function(t){_m(t)})):P(mm,t)>=0||(mm.push(t),U(t)&&(t={install:t}),t.install(xm))}function bm(t){return null==t?0:t.length||1}function wm(t){return t}var Sm=function(){function t(t,e,n,i,r,o){this._old=t,this._new=e,this._oldKeyGetter=n||wm,this._newKeyGetter=i||wm,this.context=r,this._diffModeMultiple="multiple"===o}return t.prototype.add=function(t){return this._add=t,this},t.prototype.update=function(t){return this._update=t,this},t.prototype.updateManyToOne=function(t){return this._updateManyToOne=t,this},t.prototype.updateOneToMany=function(t){return this._updateOneToMany=t,this},t.prototype.updateManyToMany=function(t){return this._updateManyToMany=t,this},t.prototype.remove=function(t){return this._remove=t,this},t.prototype.execute=function(){this[this._diffModeMultiple?"_executeMultiple":"_executeOneToOne"]()},t.prototype._executeOneToOne=function(){var t=this._old,e=this._new,n={},i=new Array(t.length),r=new Array(e.length);this._initIndexMap(t,null,i,"_oldKeyGetter"),this._initIndexMap(e,n,r,"_newKeyGetter");for(var o=0;o<t.length;o++){var a=i[o],s=n[a],l=bm(s);if(l>1){var u=s.shift();1===s.length&&(n[a]=s[0]),this._update&&this._update(u,o)}else 1===l?(n[a]=null,this._update&&this._update(s,o)):this._remove&&this._remove(o)}this._performRestAdd(r,n)},t.prototype._executeMultiple=function(){var t=this._old,e=this._new,n={},i={},r=[],o=[];this._initIndexMap(t,n,r,"_oldKeyGetter"),this._initIndexMap(e,i,o,"_newKeyGetter");for(var a=0;a<r.length;a++){var s=r[a],l=n[s],u=i[s],h=bm(l),c=bm(u);if(h>1&&1===c)this._updateManyToOne&&this._updateManyToOne(u,l),i[s]=null;else if(1===h&&c>1)this._updateOneToMany&&this._updateOneToMany(u,l),i[s]=null;else if(1===h&&1===c)this._update&&this._update(u,l),i[s]=null;else if(h>1&&c>1)this._updateManyToMany&&this._updateManyToMany(u,l),i[s]=null;else if(h>1)for(var p=0;p<h;p++)this._remove&&this._remove(l[p]);else this._remove&&this._remove(l)}this._performRestAdd(o,i)},t.prototype._performRestAdd=function(t,e){for(var n=0;n<t.length;n++){var i=t[n],r=e[i],o=bm(r);if(o>1)for(var a=0;a<o;a++)this._add&&this._add(r[a]);else 1===o&&this._add&&this._add(r);e[i]=null}},t.prototype._initIndexMap=function(t,e,n,i){for(var r=this._diffModeMultiple,o=0;o<t.length;o++){var a="_ec_"+this[i](t[o],o);if(r||(n[o]=a),e){var s=e[a],l=bm(s);0===l?(e[a]=o,r&&n.push(a)):1===l?e[a]=[s,o]:s.push(o)}}},t}(),Mm=function(){function t(t,e){this._encode=t,this._schema=e}return t.prototype.get=function(){return{fullDimensions:this._getFullDimensionNames(),encode:this._encode}},t.prototype._getFullDimensionNames=function(){return this._cachedDimNames||(this._cachedDimNames=this._schema?this._schema.makeOutputDimensionNames():[]),this._cachedDimNames},t}();function Im(t,e){return t.hasOwnProperty(e)||(t[e]=[]),t[e]}function Tm(t){return"category"===t?"ordinal":"time"===t?"time":"float"}var Cm=function(t){this.otherDims={},null!=t&&A(this,t)},Dm=So(),Am={float:"f",int:"i",ordinal:"o",number:"n",time:"t"},km=function(){function t(t){this.dimensions=t.dimensions,this._dimOmitted=t.dimensionOmitted,this.source=t.source,this._fullDimCount=t.fullDimensionCount,this._updateDimOmitted(t.dimensionOmitted)}return t.prototype.isDimensionOmitted=function(){return this._dimOmitted},t.prototype._updateDimOmitted=function(t){this._dimOmitted=t,t&&(this._dimNameMap||(this._dimNameMap=Om(this.source)))},t.prototype.getSourceDimensionIndex=function(t){return rt(this._dimNameMap.get(t),-1)},t.prototype.getSourceDimension=function(t){var e=this.source.dimensionsDefine;if(e)return e[t]},t.prototype.makeStoreSchema=function(){for(var t=this._fullDimCount,e=Xd(this.source),n=!Rm(t),i="",r=[],o=0,a=0;o<t;o++){var s=void 0,l=void 0,u=void 0,h=this.dimensions[a];if(h&&h.storeDimIndex===o)s=e?h.name:null,l=h.type,u=h.ordinalMeta,a++;else{var c=this.getSourceDimension(o);c&&(s=e?c.name:null,l=c.type)}r.push({property:s,type:l,ordinalMeta:u}),!e||null==s||h&&h.isCalculationCoord||(i+=n?s.replace(/\`/g,"`1").replace(/\$/g,"`2"):s),i+="$",i+=Am[l]||"f",u&&(i+=u.uid),i+="$"}var p=this.source;return{dimensions:r,hash:[p.seriesLayoutBy,p.startIndex,i].join("$$")}},t.prototype.makeOutputDimensionNames=function(){for(var t=[],e=0,n=0;e<this._fullDimCount;e++){var i=void 0,r=this.dimensions[n];if(r&&r.storeDimIndex===e)r.isCalculationCoord||(i=r.name),n++;else{var o=this.getSourceDimension(e);o&&(i=o.name)}t.push(i)}return t},t.prototype.appendCalculationDimension=function(t){this.dimensions.push(t),t.isCalculationCoord=!0,this._fullDimCount++,this._updateDimOmitted(!0)},t}();function Lm(t){return t instanceof km}function Pm(t){for(var e=ft(),n=0;n<(t||[]).length;n++){var i=t[n],r=q(i)?i.name:i;null!=r&&null==e.get(r)&&e.set(r,n)}return e}function Om(t){var e=Dm(t);return e.dimNameMap||(e.dimNameMap=Pm(t.dimensionsDefine))}function Rm(t){return t>30}var Nm,Em,zm,Vm,Bm,Fm,Gm,Wm=q,Hm=z,Ym="undefined"==typeof Int32Array?Array:Int32Array,Um=["hasItemOption","_nameList","_idList","_invertedIndicesMap","_dimSummary","userOutput","_rawData","_dimValueGetter","_nameDimIdx","_idDimIdx","_nameRepeatCount"],Xm=["_approximateExtent"],Zm=function(){function t(t,e){var n;this.type="list",this._dimOmitted=!1,this._nameList=[],this._idList=[],this._visual={},this._layout={},this._itemVisuals=[],this._itemLayouts=[],this._graphicEls=[],this._approximateExtent={},this._calculationInfo={},this.hasItemOption=!1,this.TRANSFERABLE_METHODS=["cloneShallow","downSample","lttbDownSample","map"],this.CHANGABLE_METHODS=["filterSelf","selectRange"],this.DOWNSAMPLE_METHODS=["downSample","lttbDownSample"];var i=!1;Lm(t)?(n=t.dimensions,this._dimOmitted=t.isDimensionOmitted(),this._schema=t):(i=!0,n=t),n=n||["x","y"];for(var r={},o=[],a={},s=!1,l={},u=0;u<n.length;u++){var h=n[u],c=X(h)?new Cm({name:h}):h instanceof Cm?h:new Cm(h),p=c.name;c.type=c.type||"float",c.coordDim||(c.coordDim=p,c.coordDimIndex=0);var d=c.otherDims=c.otherDims||{};o.push(p),r[p]=c,null!=l[p]&&(s=!0),c.createInvertedIndices&&(a[p]=[]),0===d.itemName&&(this._nameDimIdx=u),0===d.itemId&&(this._idDimIdx=u),i&&(c.storeDimIndex=u)}if(this.dimensions=o,this._dimInfos=r,this._initGetDimensionInfo(s),this.hostModel=e,this._invertedIndicesMap=a,this._dimOmitted){var f=this._dimIdxToName=ft();E(o,(function(t){f.set(r[t].storeDimIndex,t)}))}}return t.prototype.getDimension=function(t){var e=this._recognizeDimIndex(t);if(null==e)return t;if(e=t,!this._dimOmitted)return this.dimensions[e];var n=this._dimIdxToName.get(e);if(null!=n)return n;var i=this._schema.getSourceDimension(e);return i?i.name:void 0},t.prototype.getDimensionIndex=function(t){var e=this._recognizeDimIndex(t);if(null!=e)return e;if(null==t)return-1;var n=this._getDimInfo(t);return n?n.storeDimIndex:this._dimOmitted?this._schema.getSourceDimensionIndex(t):-1},t.prototype._recognizeDimIndex=function(t){if(j(t)||null!=t&&!isNaN(t)&&!this._getDimInfo(t)&&(!this._dimOmitted||this._schema.getSourceDimensionIndex(t)<0))return+t},t.prototype._getStoreDimIndex=function(t){var e=this.getDimensionIndex(t);return e},t.prototype.getDimensionInfo=function(t){return this._getDimInfo(this.getDimension(t))},t.prototype._initGetDimensionInfo=function(t){var e=this._dimInfos;this._getDimInfo=t?function(t){return e.hasOwnProperty(t)?e[t]:void 0}:function(t){return e[t]}},t.prototype.getDimensionsOnCoord=function(){return this._dimSummary.dataDimsOnCoord.slice()},t.prototype.mapDimension=function(t,e){var n=this._dimSummary;if(null==e)return n.encodeFirstDimNotExtra[t];var i=n.encode[t];return i?i[e]:null},t.prototype.mapDimensionsAll=function(t){return(this._dimSummary.encode[t]||[]).slice()},t.prototype.getStore=function(){return this._store},t.prototype.initData=function(t,e,n){var i,r=this;if(t instanceof zf&&(i=t),!i){var o=this.dimensions,a=Fd(t)||N(t)?new Zd(t,o.length):t;i=new zf;var s=Hm(o,(function(t){return{type:r._dimInfos[t].type,property:t}}));i.initData(a,s,n)}this._store=i,this._nameList=(e||[]).slice(),this._idList=[],this._nameRepeatCount={},this._doInit(0,i.count()),this._dimSummary=function(t,e){var n={},i=n.encode={},r=ft(),o=[],a=[],s={};E(t.dimensions,(function(e){var n,l=t.getDimensionInfo(e),u=l.coordDim;if(u){var h=l.coordDimIndex;Im(i,u)[h]=e,l.isExtraCoord||(r.set(u,1),"ordinal"!==(n=l.type)&&"time"!==n&&(o[0]=e),Im(s,u)[h]=t.getDimensionIndex(l.name)),l.defaultTooltip&&a.push(e)}Ap.each((function(t,e){var n=Im(i,e),r=l.otherDims[e];null!=r&&!1!==r&&(n[r]=l.name)}))}));var l=[],u={};r.each((function(t,e){var n=i[e];u[e]=n[0],l=l.concat(n)})),n.dataDimsOnCoord=l,n.dataDimIndicesOnCoord=z(l,(function(e){return t.getDimensionInfo(e).storeDimIndex})),n.encodeFirstDimNotExtra=u;var h=i.label;h&&h.length&&(o=h.slice());var c=i.tooltip;return c&&c.length?a=c.slice():a.length||(a=o.slice()),i.defaultedLabel=o,i.defaultedTooltip=a,n.userOutput=new Mm(s,e),n}(this,this._schema),this.userOutput=this._dimSummary.userOutput},t.prototype.appendData=function(t){var e=this._store.appendData(t);this._doInit(e[0],e[1])},t.prototype.appendValues=function(t,e){var n=this._store.appendValues(t,e.length),i=n.start,r=n.end,o=this._shouldMakeIdFromName();if(this._updateOrdinalMeta(),e)for(var a=i;a<r;a++){var s=a-i;this._nameList[a]=e[s],o&&Gm(this,a)}},t.prototype._updateOrdinalMeta=function(){for(var t=this._store,e=this.dimensions,n=0;n<e.length;n++){var i=this._dimInfos[e[n]];i.ordinalMeta&&t.collectOrdinalMeta(i.storeDimIndex,i.ordinalMeta)}},t.prototype._shouldMakeIdFromName=function(){var t=this._store.getProvider();return null==this._idDimIdx&&t.getSource().sourceFormat!==Rp&&!t.fillStorage},t.prototype._doInit=function(t,e){if(!(t>=e)){var n=this._store.getProvider();this._updateOrdinalMeta();var i=this._nameList,r=this._idList;if(n.getSource().sourceFormat===kp&&!n.pure)for(var o=[],a=t;a<e;a++){var s=n.getItem(a,o);if(!this.hasItemOption&&go(s)&&(this.hasItemOption=!0),s){var l=s.name;null==i[a]&&null!=l&&(i[a]=xo(l,null));var u=s.id;null==r[a]&&null!=u&&(r[a]=xo(u,null))}}if(this._shouldMakeIdFromName())for(a=t;a<e;a++)Gm(this,a);Nm(this)}},t.prototype.getApproximateExtent=function(t){return this._approximateExtent[t]||this._store.getDataExtent(this._getStoreDimIndex(t))},t.prototype.setApproximateExtent=function(t,e){e=this.getDimension(e),this._approximateExtent[e]=t.slice()},t.prototype.getCalculationInfo=function(t){return this._calculationInfo[t]},t.prototype.setCalculationInfo=function(t,e){Wm(t)?A(this._calculationInfo,t):this._calculationInfo[t]=e},t.prototype.getName=function(t){var e=this.getRawIndex(t),n=this._nameList[e];return null==n&&null!=this._nameDimIdx&&(n=zm(this,this._nameDimIdx,e)),null==n&&(n=""),n},t.prototype._getCategory=function(t,e){var n=this._store.get(t,e),i=this._store.getOrdinalMeta(t);return i?i.categories[n]:n},t.prototype.getId=function(t){return Em(this,this.getRawIndex(t))},t.prototype.count=function(){return this._store.count()},t.prototype.get=function(t,e){var n=this._store,i=this._dimInfos[t];if(i)return n.get(i.storeDimIndex,e)},t.prototype.getByRawIndex=function(t,e){var n=this._store,i=this._dimInfos[t];if(i)return n.getByRawIndex(i.storeDimIndex,e)},t.prototype.getIndices=function(){return this._store.getIndices()},t.prototype.getDataExtent=function(t){return this._store.getDataExtent(this._getStoreDimIndex(t))},t.prototype.getSum=function(t){return this._store.getSum(this._getStoreDimIndex(t))},t.prototype.getMedian=function(t){return this._store.getMedian(this._getStoreDimIndex(t))},t.prototype.getValues=function(t,e){var n=this,i=this._store;return Y(t)?i.getValues(Hm(t,(function(t){return n._getStoreDimIndex(t)})),e):i.getValues(t)},t.prototype.hasValue=function(t){for(var e=this._dimSummary.dataDimIndicesOnCoord,n=0,i=e.length;n<i;n++)if(isNaN(this._store.get(e[n],t)))return!1;return!0},t.prototype.indexOfName=function(t){for(var e=0,n=this._store.count();e<n;e++)if(this.getName(e)===t)return e;return-1},t.prototype.getRawIndex=function(t){return this._store.getRawIndex(t)},t.prototype.indexOfRawIndex=function(t){return this._store.indexOfRawIndex(t)},t.prototype.rawIndexOf=function(t,e){var n=t&&this._invertedIndicesMap[t];var i=n[e];return null==i||isNaN(i)?-1:i},t.prototype.indicesOfNearest=function(t,e,n){return this._store.indicesOfNearest(this._getStoreDimIndex(t),e,n)},t.prototype.each=function(t,e,n){U(t)&&(n=e,e=t,t=[]);var i=n||this,r=Hm(Vm(t),this._getStoreDimIndex,this);this._store.each(r,i?W(e,i):e)},t.prototype.filterSelf=function(t,e,n){U(t)&&(n=e,e=t,t=[]);var i=n||this,r=Hm(Vm(t),this._getStoreDimIndex,this);return this._store=this._store.filter(r,i?W(e,i):e),this},t.prototype.selectRange=function(t){var e=this,n={};return E(G(t),(function(i){var r=e._getStoreDimIndex(i);n[r]=t[i]})),this._store=this._store.selectRange(n),this},t.prototype.mapArray=function(t,e,n){U(t)&&(n=e,e=t,t=[]),n=n||this;var i=[];return this.each(t,(function(){i.push(e&&e.apply(this,arguments))}),n),i},t.prototype.map=function(t,e,n,i){var r=n||i||this,o=Hm(Vm(t),this._getStoreDimIndex,this),a=Fm(this);return a._store=this._store.map(o,r?W(e,r):e),a},t.prototype.modify=function(t,e,n,i){var r=n||i||this;var o=Hm(Vm(t),this._getStoreDimIndex,this);this._store.modify(o,r?W(e,r):e)},t.prototype.downSample=function(t,e,n,i){var r=Fm(this);return r._store=this._store.downSample(this._getStoreDimIndex(t),e,n,i),r},t.prototype.lttbDownSample=function(t,e){var n=Fm(this);return n._store=this._store.lttbDownSample(this._getStoreDimIndex(t),e),n},t.prototype.getRawDataItem=function(t){return this._store.getRawDataItem(t)},t.prototype.getItemModel=function(t){var e=this.hostModel,n=this.getRawDataItem(t);return new pc(n,e,e&&e.ecModel)},t.prototype.diff=function(t){var e=this;return new Sm(t?t.getStore().getIndices():[],this.getStore().getIndices(),(function(e){return Em(t,e)}),(function(t){return Em(e,t)}))},t.prototype.getVisual=function(t){var e=this._visual;return e&&e[t]},t.prototype.setVisual=function(t,e){this._visual=this._visual||{},Wm(t)?A(this._visual,t):this._visual[t]=e},t.prototype.getItemVisual=function(t,e){var n=this._itemVisuals[t],i=n&&n[e];return null==i?this.getVisual(e):i},t.prototype.hasItemVisual=function(){return this._itemVisuals.length>0},t.prototype.ensureUniqueItemVisual=function(t,e){var n=this._itemVisuals,i=n[t];i||(i=n[t]={});var r=i[e];return null==r&&(Y(r=this.getVisual(e))?r=r.slice():Wm(r)&&(r=A({},r)),i[e]=r),r},t.prototype.setItemVisual=function(t,e,n){var i=this._itemVisuals[t]||{};this._itemVisuals[t]=i,Wm(e)?A(i,e):i[e]=n},t.prototype.clearAllVisual=function(){this._visual={},this._itemVisuals=[]},t.prototype.setLayout=function(t,e){Wm(t)?A(this._layout,t):this._layout[t]=e},t.prototype.getLayout=function(t){return this._layout[t]},t.prototype.getItemLayout=function(t){return this._itemLayouts[t]},t.prototype.setItemLayout=function(t,e,n){this._itemLayouts[t]=n?A(this._itemLayouts[t]||{},e):e},t.prototype.clearItemLayouts=function(){this._itemLayouts.length=0},t.prototype.setItemGraphicEl=function(t,e){var n=this.hostModel&&this.hostModel.seriesIndex;Hs(n,this.dataType,t,e),this._graphicEls[t]=e},t.prototype.getItemGraphicEl=function(t){return this._graphicEls[t]},t.prototype.eachItemGraphicEl=function(t,e){E(this._graphicEls,(function(n,i){n&&t&&t.call(e,n,i)}))},t.prototype.cloneShallow=function(e){return e||(e=new t(this._schema?this._schema:Hm(this.dimensions,this._getDimInfo,this),this.hostModel)),Bm(e,this),e._store=this._store,e},t.prototype.wrapMethod=function(t,e){var n=this[t];U(n)&&(this.__wrappedMethods=this.__wrappedMethods||[],this.__wrappedMethods.push(t),this[t]=function(){var t=n.apply(this,arguments);return e.apply(this,[t].concat(at(arguments)))})},t.internalField=(Nm=function(t){var e=t._invertedIndicesMap;E(e,(function(n,i){var r=t._dimInfos[i],o=r.ordinalMeta,a=t._store;if(o){n=e[i]=new Ym(o.categories.length);for(var s=0;s<n.length;s++)n[s]=-1;for(s=0;s<a.count();s++)n[a.get(r.storeDimIndex,s)]=s}}))},zm=function(t,e,n){return xo(t._getCategory(e,n),null)},Em=function(t,e){var n=t._idList[e];return null==n&&null!=t._idDimIdx&&(n=zm(t,t._idDimIdx,e)),null==n&&(n="e\0\0"+e),n},Vm=function(t){return Y(t)||(t=null!=t?[t]:[]),t},Fm=function(e){var n=new t(e._schema?e._schema:Hm(e.dimensions,e._getDimInfo,e),e.hostModel);return Bm(n,e),n},Bm=function(t,e){E(Um.concat(e.__wrappedMethods||[]),(function(n){e.hasOwnProperty(n)&&(t[n]=e[n])})),t.__wrappedMethods=e.__wrappedMethods,E(Xm,(function(n){t[n]=T(e[n])})),t._calculationInfo=A({},e._calculationInfo)},void(Gm=function(t,e){var n=t._nameList,i=t._idList,r=t._nameDimIdx,o=t._idDimIdx,a=n[e],s=i[e];if(null==a&&null!=r&&(n[e]=a=zm(t,r,e)),null==s&&null!=o&&(i[e]=s=zm(t,o,e)),null==s&&null!=a){var l=t._nameRepeatCount,u=l[a]=(l[a]||0)+1;s=a,u>1&&(s+="__ec__"+u),i[e]=s}})),t}();function jm(t,e){Fd(t)||(t=Wd(t));var n=(e=e||{}).coordDimensions||[],i=e.dimensionsDefine||t.dimensionsDefine||[],r=ft(),o=[],a=function(t,e,n,i){var r=Math.max(t.dimensionsDetectedCount||1,e.length,n.length,i||0);return E(e,(function(t){var e;q(t)&&(e=t.dimsDef)&&(r=Math.max(r,e.length))})),r}(t,n,i,e.dimensionsCount),s=e.canOmitUnusedDimensions&&Rm(a),l=i===t.dimensionsDefine,u=l?Om(t):Pm(i),h=e.encodeDefine;!h&&e.encodeDefaulter&&(h=e.encodeDefaulter(t,a));for(var c=ft(h),p=new Pf(a),d=0;d<p.length;d++)p[d]=-1;function f(t){var e=p[t];if(e<0){var n=i[t],r=q(n)?n:{name:n},a=new Cm,s=r.name;null!=s&&null!=u.get(s)&&(a.name=a.displayName=s),null!=r.type&&(a.type=r.type),null!=r.displayName&&(a.displayName=r.displayName);var l=o.length;return p[t]=l,a.storeDimIndex=t,o.push(a),a}return o[e]}if(!s)for(d=0;d<a;d++)f(d);c.each((function(t,e){var n=ho(t).slice();if(1===n.length&&!X(n[0])&&n[0]<0)c.set(e,!1);else{var i=c.set(e,[]);E(n,(function(t,n){var r=X(t)?u.get(t):t;null!=r&&r<a&&(i[n]=r,y(f(r),e,n))}))}}));var g=0;function y(t,e,n){null!=Ap.get(e)?t.otherDims[e]=n:(t.coordDim=e,t.coordDimIndex=n,r.set(e,!0))}E(n,(function(t){var e,n,i,r;if(X(t))e=t,r={};else{e=(r=t).name;var o=r.ordinalMeta;r.ordinalMeta=null,(r=A({},r)).ordinalMeta=o,n=r.dimsDef,i=r.otherDims,r.name=r.coordDim=r.coordDimIndex=r.dimsDef=r.otherDims=null}var s=c.get(e);if(!1!==s){if(!(s=ho(s)).length)for(var u=0;u<(n&&n.length||1);u++){for(;g<a&&null!=f(g).coordDim;)g++;g<a&&s.push(g++)}E(s,(function(t,o){var a=f(t);if(l&&null!=r.type&&(a.type=r.type),y(k(a,r),e,o),null==a.name&&n){var s=n[o];!q(s)&&(s={name:s}),a.name=a.displayName=s.name,a.defaultTooltip=s.defaultTooltip}i&&k(a.otherDims,i)}))}}));var v=e.generateCoord,m=e.generateCoordCount,x=null!=m;m=v?m||1:0;var _=v||"value";function b(t){null==t.name&&(t.name=t.coordDim)}if(s)E(o,(function(t){b(t)})),o.sort((function(t,e){return t.storeDimIndex-e.storeDimIndex}));else for(var w=0;w<a;w++){var S=f(w);null==S.coordDim&&(S.coordDim=qm(_,r,x),S.coordDimIndex=0,(!v||m<=0)&&(S.isExtraCoord=!0),m--),b(S),null!=S.type||Up(t,w)!==Vp&&(!S.isExtraCoord||null==S.otherDims.itemName&&null==S.otherDims.seriesName)||(S.type="ordinal")}return function(t){for(var e=ft(),n=0;n<t.length;n++){var i=t[n],r=i.name,o=e.get(r)||0;o>0&&(i.name=r+(o-1)),o++,e.set(r,o)}}(o),new km({source:t,dimensions:o,fullDimensionCount:a,dimensionOmitted:s})}function qm(t,e,n){var i=e.data;if(n||i.hasOwnProperty(t)){for(var r=0;i.hasOwnProperty(t+r);)r++;t+=r}return e.set(t,!0),t}var Km=function(t){this.coordSysDims=[],this.axisMap=ft(),this.categoryAxisMap=ft(),this.coordSysName=t};var $m={cartesian2d:function(t,e,n,i){var r=t.getReferringComponents("xAxis",Co).models[0],o=t.getReferringComponents("yAxis",Co).models[0];e.coordSysDims=["x","y"],n.set("x",r),n.set("y",o),Jm(r)&&(i.set("x",r),e.firstCategoryDimIndex=0),Jm(o)&&(i.set("y",o),null==e.firstCategoryDimIndex&&(e.firstCategoryDimIndex=1))},singleAxis:function(t,e,n,i){var r=t.getReferringComponents("singleAxis",Co).models[0];e.coordSysDims=["single"],n.set("single",r),Jm(r)&&(i.set("single",r),e.firstCategoryDimIndex=0)},polar:function(t,e,n,i){var r=t.getReferringComponents("polar",Co).models[0],o=r.findAxisModel("radiusAxis"),a=r.findAxisModel("angleAxis");e.coordSysDims=["radius","angle"],n.set("radius",o),n.set("angle",a),Jm(o)&&(i.set("radius",o),e.firstCategoryDimIndex=0),Jm(a)&&(i.set("angle",a),null==e.firstCategoryDimIndex&&(e.firstCategoryDimIndex=1))},geo:function(t,e,n,i){e.coordSysDims=["lng","lat"]},parallel:function(t,e,n,i){var r=t.ecModel,o=r.getComponent("parallel",t.get("parallelIndex")),a=e.coordSysDims=o.dimensions.slice();E(o.parallelAxisIndex,(function(t,o){var s=r.getComponent("parallelAxis",t),l=a[o];n.set(l,s),Jm(s)&&(i.set(l,s),null==e.firstCategoryDimIndex&&(e.firstCategoryDimIndex=o))}))}};function Jm(t){return"category"===t.get("type")}function Qm(t,e,n){var i,r,o,a=(n=n||{}).byIndex,s=n.stackedCoordDimension;!function(t){return!Lm(t.schema)}(e)?(r=e.schema,i=r.dimensions,o=e.store):i=e;var l,u,h,c,p=!(!t||!t.get("stack"));if(E(i,(function(t,e){X(t)&&(i[e]=t={name:t}),p&&!t.isExtraCoord&&(a||l||!t.ordinalMeta||(l=t),u||"ordinal"===t.type||"time"===t.type||s&&s!==t.coordDim||(u=t))})),!u||a||l||(a=!0),u){h="__\0ecstackresult_"+t.id,c="__\0ecstackedover_"+t.id,l&&(l.createInvertedIndices=!0);var d=u.coordDim,f=u.type,g=0;E(i,(function(t){t.coordDim===d&&g++}));var y={name:h,coordDim:d,coordDimIndex:g,type:f,isExtraCoord:!0,isCalculationCoord:!0,storeDimIndex:i.length},v={name:c,coordDim:c,coordDimIndex:g+1,type:f,isExtraCoord:!0,isCalculationCoord:!0,storeDimIndex:i.length+1};r?(o&&(y.storeDimIndex=o.ensureCalculationDimension(c,f),v.storeDimIndex=o.ensureCalculationDimension(h,f)),r.appendCalculationDimension(y),r.appendCalculationDimension(v)):(i.push(y),i.push(v))}return{stackedDimension:u&&u.name,stackedByDimension:l&&l.name,isStackedByIndex:a,stackedOverDimension:c,stackResultDimension:h}}function tx(t,e){return!!e&&e===t.getCalculationInfo("stackedDimension")}function ex(t,e){return tx(t,e)?t.getCalculationInfo("stackResultDimension"):e}function nx(t,e,n){n=n||{};var i,r=e.getSourceManager(),o=!1;t?(o=!0,i=Wd(t)):o=(i=r.getSource()).sourceFormat===kp;var a=function(t){var e=t.get("coordinateSystem"),n=new Km(e),i=$m[e];if(i)return i(t,n,n.axisMap,n.categoryAxisMap),n}(e),s=function(t,e){var n,i=t.get("coordinateSystem"),r=ud.get(i);return e&&e.coordSysDims&&(n=z(e.coordSysDims,(function(t){var n={name:t},i=e.axisMap.get(t);if(i){var r=i.get("type");n.type=Tm(r)}return n}))),n||(n=r&&(r.getDimensionsInfo?r.getDimensionsInfo():r.dimensions.slice())||["x","y"]),n}(e,a),l=n.useEncodeDefaulter,u=U(l)?l:l?H(Wp,s,e):null,h=jm(i,{coordDimensions:s,generateCoord:n.generateCoord,encodeDefine:e.getEncode(),encodeDefaulter:u,canOmitUnusedDimensions:!o}),c=function(t,e,n){var i,r;return n&&E(t,(function(t,o){var a=t.coordDim,s=n.categoryAxisMap.get(a);s&&(null==i&&(i=o),t.ordinalMeta=s.getOrdinalMeta(),e&&(t.createInvertedIndices=!0)),null!=t.otherDims.itemName&&(r=!0)})),r||null==i||(t[i].otherDims.itemName=0),i}(h.dimensions,n.createInvertedIndices,a),p=o?null:r.getSharedDataStore(h),d=Qm(e,{schema:h,store:p}),f=new Zm(h,e);f.setCalculationInfo(d);var g=null!=c&&function(t){if(t.sourceFormat===kp){return!Y(fo(function(t){var e=0;for(;e<t.length&&null==t[e];)e++;return t[e]}(t.data||[])))}}(i)?function(t,e,n,i){return i===c?n:this.defaultDimValueGetter(t,e,n,i)}:null;return f.hasItemOption=!1,f.initData(o?i:p,null,g),f}var ix=function(){function t(t){this._setting=t||{},this._extent=[1/0,-1/0]}return t.prototype.getSetting=function(t){return this._setting[t]},t.prototype.unionExtent=function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1])},t.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e))},t.prototype.getExtent=function(){return this._extent.slice()},t.prototype.setExtent=function(t,e){var n=this._extent;isNaN(t)||(n[0]=t),isNaN(e)||(n[1]=e)},t.prototype.isInExtentRange=function(t){return this._extent[0]<=t&&this._extent[1]>=t},t.prototype.isBlank=function(){return this._isBlank},t.prototype.setBlank=function(t){this._isBlank=t},t}();Go(ix);var rx=0,ox=function(){function t(t){this.categories=t.categories||[],this._needCollect=t.needCollect,this._deduplication=t.deduplication,this.uid=++rx}return t.createByAxisModel=function(e){var n=e.option,i=n.data,r=i&&z(i,ax);return new t({categories:r,needCollect:!r,deduplication:!1!==n.dedplication})},t.prototype.getOrdinal=function(t){return this._getOrCreateMap().get(t)},t.prototype.parseAndCollect=function(t){var e,n=this._needCollect;if(!X(t)&&!n)return t;if(n&&!this._deduplication)return e=this.categories.length,this.categories[e]=t,e;var i=this._getOrCreateMap();return null==(e=i.get(t))&&(n?(e=this.categories.length,this.categories[e]=t,i.set(t,e)):e=NaN),e},t.prototype._getOrCreateMap=function(){return this._map||(this._map=ft(this.categories))},t}();function ax(t){return q(t)&&null!=t.value?t.value:t+""}function sx(t){return"interval"===t.type||"log"===t.type}function lx(t,e,n,i){var r={},o=t[1]-t[0],a=r.interval=$r(o/e,!0);null!=n&&a<n&&(a=r.interval=n),null!=i&&a>i&&(a=r.interval=i);var s=r.intervalPrecision=hx(a);return function(t,e){!isFinite(t[0])&&(t[0]=e[0]),!isFinite(t[1])&&(t[1]=e[1]),cx(t,0,e),cx(t,1,e),t[0]>t[1]&&(t[0]=t[1])}(r.niceTickExtent=[zr(Math.ceil(t[0]/a)*a,s),zr(Math.floor(t[1]/a)*a,s)],t),r}function ux(t){var e=Math.pow(10,Kr(t)),n=t/e;return n?2===n?n=3:3===n?n=5:n*=2:n=1,zr(n*e)}function hx(t){return Br(t)+2}function cx(t,e,n){t[e]=Math.max(Math.min(t[e],n[1]),n[0])}function px(t,e){return t>=e[0]&&t<=e[1]}function dx(t,e){return e[1]===e[0]?.5:(t-e[0])/(e[1]-e[0])}function fx(t,e){return t*(e[1]-e[0])+e[0]}var gx=function(t){function e(e){var n=t.call(this,e)||this;n.type="ordinal";var i=n.getSetting("ordinalMeta");return i||(i=new ox({})),Y(i)&&(i=new ox({categories:z(i,(function(t){return q(t)?t.value:t}))})),n._ordinalMeta=i,n._extent=n.getSetting("extent")||[0,i.categories.length-1],n}return n(e,t),e.prototype.parse=function(t){return X(t)?this._ordinalMeta.getOrdinal(t):Math.round(t)},e.prototype.contain=function(t){return px(t=this.parse(t),this._extent)&&null!=this._ordinalMeta.categories[t]},e.prototype.normalize=function(t){return dx(t=this._getTickNumber(this.parse(t)),this._extent)},e.prototype.scale=function(t){return t=Math.round(fx(t,this._extent)),this.getRawOrdinalNumber(t)},e.prototype.getTicks=function(){for(var t=[],e=this._extent,n=e[0];n<=e[1];)t.push({value:n}),n++;return t},e.prototype.getMinorTicks=function(t){},e.prototype.setSortInfo=function(t){if(null!=t){for(var e=t.ordinalNumbers,n=this._ordinalNumbersByTick=[],i=this._ticksByOrdinalNumber=[],r=0,o=this._ordinalMeta.categories.length,a=Math.min(o,e.length);r<a;++r){var s=e[r];n[r]=s,i[s]=r}for(var l=0;r<o;++r){for(;null!=i[l];)l++;n.push(l),i[l]=r}}else this._ordinalNumbersByTick=this._ticksByOrdinalNumber=null},e.prototype._getTickNumber=function(t){var e=this._ticksByOrdinalNumber;return e&&t>=0&&t<e.length?e[t]:t},e.prototype.getRawOrdinalNumber=function(t){var e=this._ordinalNumbersByTick;return e&&t>=0&&t<e.length?e[t]:t},e.prototype.getLabel=function(t){if(!this.isBlank()){var e=this.getRawOrdinalNumber(t.value),n=this._ordinalMeta.categories[e];return null==n?"":n+""}},e.prototype.count=function(){return this._extent[1]-this._extent[0]+1},e.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e))},e.prototype.isInExtentRange=function(t){return t=this._getTickNumber(t),this._extent[0]<=t&&this._extent[1]>=t},e.prototype.getOrdinalMeta=function(){return this._ordinalMeta},e.prototype.calcNiceTicks=function(){},e.prototype.calcNiceExtent=function(){},e.type="ordinal",e}(ix);ix.registerClass(gx);var yx=zr,vx=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="interval",e._interval=0,e._intervalPrecision=2,e}return n(e,t),e.prototype.parse=function(t){return t},e.prototype.contain=function(t){return px(t,this._extent)},e.prototype.normalize=function(t){return dx(t,this._extent)},e.prototype.scale=function(t){return fx(t,this._extent)},e.prototype.setExtent=function(t,e){var n=this._extent;isNaN(t)||(n[0]=parseFloat(t)),isNaN(e)||(n[1]=parseFloat(e))},e.prototype.unionExtent=function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1]),this.setExtent(e[0],e[1])},e.prototype.getInterval=function(){return this._interval},e.prototype.setInterval=function(t){this._interval=t,this._niceExtent=this._extent.slice(),this._intervalPrecision=hx(t)},e.prototype.getTicks=function(t){var e=this._interval,n=this._extent,i=this._niceExtent,r=this._intervalPrecision,o=[];if(!e)return o;n[0]<i[0]&&(t?o.push({value:yx(i[0]-e,r)}):o.push({value:n[0]}));for(var a=i[0];a<=i[1]&&(o.push({value:a}),(a=yx(a+e,r))!==o[o.length-1].value);)if(o.length>1e4)return[];var s=o.length?o[o.length-1].value:i[1];return n[1]>s&&(t?o.push({value:yx(s+e,r)}):o.push({value:n[1]})),o},e.prototype.getMinorTicks=function(t){for(var e=this.getTicks(!0),n=[],i=this.getExtent(),r=1;r<e.length;r++){for(var o=e[r],a=e[r-1],s=0,l=[],u=(o.value-a.value)/t;s<t-1;){var h=yx(a.value+(s+1)*u);h>i[0]&&h<i[1]&&l.push(h),s++}n.push(l)}return n},e.prototype.getLabel=function(t,e){if(null==t)return"";var n=e&&e.precision;return null==n?n=Br(t.value)||0:"auto"===n&&(n=this._intervalPrecision),tp(yx(t.value,n,!0))},e.prototype.calcNiceTicks=function(t,e,n){t=t||5;var i=this._extent,r=i[1]-i[0];if(isFinite(r)){r<0&&(r=-r,i.reverse());var o=lx(i,t,e,n);this._intervalPrecision=o.intervalPrecision,this._interval=o.interval,this._niceExtent=o.niceTickExtent}},e.prototype.calcNiceExtent=function(t){var e=this._extent;if(e[0]===e[1])if(0!==e[0]){var n=e[0];t.fixMax||(e[1]+=n/2),e[0]-=n/2}else e[1]=1;var i=e[1]-e[0];isFinite(i)||(e[0]=0,e[1]=1),this.calcNiceTicks(t.splitNumber,t.minInterval,t.maxInterval);var r=this._interval;t.fixMin||(e[0]=yx(Math.floor(e[0]/r)*r)),t.fixMax||(e[1]=yx(Math.ceil(e[1]/r)*r))},e.prototype.setNiceExtent=function(t,e){this._niceExtent=[t,e]},e.type="interval",e}(ix);ix.registerClass(vx);var mx="undefined"!=typeof Float32Array,xx=mx?Float32Array:Array;function _x(t){return Y(t)?mx?new Float32Array(t):t:new xx(t)}var bx="__ec_stack_";function Sx(t){return t.get("stack")||bx+t.seriesIndex}function Mx(t){return t.dim+t.index}function Ix(t,e){var n=[];return e.eachSeriesByType(t,(function(t){kx(t)&&n.push(t)})),n}function Tx(t){var e=function(t){var e={};E(t,(function(t){var n=t.coordinateSystem.getBaseAxis();if("time"===n.type||"value"===n.type)for(var i=t.getData(),r=n.dim+"_"+n.index,o=i.getDimensionIndex(i.mapDimension(n.dim)),a=i.getStore(),s=0,l=a.count();s<l;++s){var u=a.get(o,s);e[r]?e[r].push(u):e[r]=[u]}}));var n={};for(var i in e)if(e.hasOwnProperty(i)){var r=e[i];if(r){r.sort((function(t,e){return t-e}));for(var o=null,a=1;a<r.length;++a){var s=r[a]-r[a-1];s>0&&(o=null===o?s:Math.min(o,s))}n[i]=o}}return n}(t),n=[];return E(t,(function(t){var i,r=t.coordinateSystem.getBaseAxis(),o=r.getExtent();if("category"===r.type)i=r.getBandWidth();else if("value"===r.type||"time"===r.type){var a=r.dim+"_"+r.index,s=e[a],l=Math.abs(o[1]-o[0]),u=r.scale.getExtent(),h=Math.abs(u[1]-u[0]);i=s?l/h*s:l}else{var c=t.getData();i=Math.abs(o[1]-o[0])/c.count()}var p=Er(t.get("barWidth"),i),d=Er(t.get("barMaxWidth"),i),f=Er(t.get("barMinWidth")||(Lx(t)?.5:1),i),g=t.get("barGap"),y=t.get("barCategoryGap");n.push({bandWidth:i,barWidth:p,barMaxWidth:d,barMinWidth:f,barGap:g,barCategoryGap:y,axisKey:Mx(r),stackId:Sx(t)})})),Cx(n)}function Cx(t){var e={};E(t,(function(t,n){var i=t.axisKey,r=t.bandWidth,o=e[i]||{bandWidth:r,remainedWidth:r,autoWidthCount:0,categoryGap:null,gap:"20%",stacks:{}},a=o.stacks;e[i]=o;var s=t.stackId;a[s]||o.autoWidthCount++,a[s]=a[s]||{width:0,maxWidth:0};var l=t.barWidth;l&&!a[s].width&&(a[s].width=l,l=Math.min(o.remainedWidth,l),o.remainedWidth-=l);var u=t.barMaxWidth;u&&(a[s].maxWidth=u);var h=t.barMinWidth;h&&(a[s].minWidth=h);var c=t.barGap;null!=c&&(o.gap=c);var p=t.barCategoryGap;null!=p&&(o.categoryGap=p)}));var n={};return E(e,(function(t,e){n[e]={};var i=t.stacks,r=t.bandWidth,o=t.categoryGap;if(null==o){var a=G(i).length;o=Math.max(35-4*a,15)+"%"}var s=Er(o,r),l=Er(t.gap,1),u=t.remainedWidth,h=t.autoWidthCount,c=(u-s)/(h+(h-1)*l);c=Math.max(c,0),E(i,(function(t){var e=t.maxWidth,n=t.minWidth;if(t.width){i=t.width;e&&(i=Math.min(i,e)),n&&(i=Math.max(i,n)),t.width=i,u-=i+l*i,h--}else{var i=c;e&&e<i&&(i=Math.min(e,u)),n&&n>i&&(i=n),i!==c&&(t.width=i,u-=i+l*i,h--)}})),c=(u-s)/(h+(h-1)*l),c=Math.max(c,0);var p,d=0;E(i,(function(t,e){t.width||(t.width=c),p=t,d+=t.width*(1+l)})),p&&(d-=p.width*l);var f=-d/2;E(i,(function(t,i){n[e][i]=n[e][i]||{bandWidth:r,offset:f,width:t.width},f+=t.width*(1+l)}))})),n}function Dx(t,e){var n=Ix(t,e),i=Tx(n);E(n,(function(t){var e=t.getData(),n=t.coordinateSystem.getBaseAxis(),r=Sx(t),o=i[Mx(n)][r],a=o.offset,s=o.width;e.setLayout({bandWidth:o.bandWidth,offset:a,size:s})}))}function Ax(t){return{seriesType:t,plan:gg(),reset:function(t){if(kx(t)){var e=t.getData(),n=t.coordinateSystem,i=n.getBaseAxis(),r=n.getOtherAxis(i),o=e.getDimensionIndex(e.mapDimension(r.dim)),a=e.getDimensionIndex(e.mapDimension(i.dim)),s=t.get("showBackground",!0),l=e.mapDimension(r.dim),u=e.getCalculationInfo("stackResultDimension"),h=tx(e,l)&&!!e.getCalculationInfo("stackedOnSeries"),c=r.isHorizontal(),p=function(t,e){return e.toGlobalCoord(e.dataToCoord("log"===e.type?1:0))}(0,r),d=Lx(t),f=t.get("barMinHeight")||0,g=u&&e.getDimensionIndex(u),y=e.getLayout("size"),v=e.getLayout("offset");return{progress:function(t,e){for(var i,r=t.count,l=d&&_x(3*r),u=d&&s&&_x(3*r),m=d&&_x(r),x=n.master.getRect(),_=c?x.width:x.height,b=e.getStore(),w=0;null!=(i=t.next());){var S=b.get(h?g:o,i),M=b.get(a,i),I=p,T=void 0;h&&(T=+S-b.get(o,i));var C=void 0,D=void 0,A=void 0,k=void 0;if(c){var L=n.dataToPoint([S,M]);if(h)I=n.dataToPoint([T,M])[0];C=I,D=L[1]+v,A=L[0]-I,k=y,Math.abs(A)<f&&(A=(A<0?-1:1)*f)}else{L=n.dataToPoint([M,S]);if(h)I=n.dataToPoint([M,T])[1];C=L[0]+v,D=I,A=y,k=L[1]-I,Math.abs(k)<f&&(k=(k<=0?-1:1)*f)}d?(l[w]=C,l[w+1]=D,l[w+2]=c?A:k,u&&(u[w]=c?x.x:C,u[w+1]=c?D:x.y,u[w+2]=_),m[i]=i):e.setItemLayout(i,{x:C,y:D,width:A,height:k}),w+=3}d&&e.setLayout({largePoints:l,largeDataIndices:m,largeBackgroundPoints:u,valueAxisHorizontal:c})}}}}}}function kx(t){return t.coordinateSystem&&"cartesian2d"===t.coordinateSystem.type}function Lx(t){return t.pipelineContext&&t.pipelineContext.large}var Px=function(t){function e(e){var n=t.call(this,e)||this;return n.type="time",n}return n(e,t),e.prototype.getLabel=function(t){var e=this.getSetting("useUTC");return zc(t.value,Lc[function(t){switch(t){case"year":case"month":return"day";case"millisecond":return"millisecond";default:return"second"}}(Nc(this._minLevelUnit))]||Lc.second,e,this.getSetting("locale"))},e.prototype.getFormattedLabel=function(t,e,n){var i=this.getSetting("useUTC");return function(t,e,n,i,r){var o=null;if(X(n))o=n;else if(U(n))o=n(t.value,e,{level:t.level});else{var a=A({},Ac);if(t.level>0)for(var s=0;s<Pc.length;++s)a[Pc[s]]="{primary|"+a[Pc[s]]+"}";var l=n?!1===n.inherit?n:k(n,a):a,u=Vc(t.value,r);if(l[u])o=l[u];else if(l.inherit){for(s=Oc.indexOf(u)-1;s>=0;--s)if(l[u]){o=l[u];break}o=o||a.none}if(Y(o)){var h=null==t.level?0:t.level>=0?t.level:o.length+t.level;o=o[h=Math.min(h,o.length-1)]}}return zc(new Date(t.value),o,r,i)}(t,e,n,this.getSetting("locale"),i)},e.prototype.getTicks=function(){var t=this._interval,e=this._extent,n=[];if(!t)return n;n.push({value:e[0],level:0});var i=this.getSetting("useUTC"),r=function(t,e,n,i){var r=1e4,o=Oc,a=0;function s(t,e,n,r,o,a,s){for(var l=new Date(e),u=e,h=l[r]();u<n&&u<=i[1];)s.push({value:u}),h+=t,l[o](h),u=l.getTime();s.push({value:u,notAdd:!0})}function l(t,r,o){var a=[],l=!r.length;if(!function(t,e,n,i){var r=jr(e),o=jr(n),a=function(t){return Bc(r,t,i)===Bc(o,t,i)},s=function(){return a("year")},l=function(){return s()&&a("month")},u=function(){return l()&&a("day")},h=function(){return u()&&a("hour")},c=function(){return h()&&a("minute")},p=function(){return c()&&a("second")},d=function(){return p()&&a("millisecond")};switch(t){case"year":return s();case"month":return l();case"day":return u();case"hour":return h();case"minute":return c();case"second":return p();case"millisecond":return d()}}(Nc(t),i[0],i[1],n)){l&&(r=[{value:Bx(new Date(i[0]),t,n)},{value:i[1]}]);for(var u=0;u<r.length-1;u++){var h=r[u].value,c=r[u+1].value;if(h!==c){var p=void 0,d=void 0,f=void 0,g=!1;switch(t){case"year":p=Math.max(1,Math.round(e/Cc/365)),d=Fc(n),f=Zc(n);break;case"half-year":case"quarter":case"month":p=Nx(e),d=Gc(n),f=jc(n);break;case"week":case"half-week":case"day":p=Rx(e),d=Wc(n),f=qc(n),g=!0;break;case"half-day":case"quarter-day":case"hour":p=Ex(e),d=Hc(n),f=Kc(n);break;case"minute":p=zx(e,!0),d=Yc(n),f=$c(n);break;case"second":p=zx(e,!1),d=Uc(n),f=Jc(n);break;case"millisecond":p=Vx(e),d=Xc(n),f=Qc(n)}s(p,h,c,d,f,g,a),"year"===t&&o.length>1&&0===u&&o.unshift({value:o[0].value-p})}}for(u=0;u<a.length;u++)o.push(a[u]);return a}}for(var u=[],h=[],c=0,p=0,d=0;d<o.length&&a++<r;++d){var f=Nc(o[d]);if(Ec(o[d]))if(l(o[d],u[u.length-1]||[],h),f!==(o[d+1]?Nc(o[d+1]):null)){if(h.length){p=c,h.sort((function(t,e){return t.value-e.value}));for(var g=[],y=0;y<h.length;++y){var v=h[y].value;0!==y&&h[y-1].value===v||(g.push(h[y]),v>=i[0]&&v<=i[1]&&c++)}var m=(i[1]-i[0])/e;if(c>1.5*m&&p>m/1.5)break;if(u.push(g),c>m||t===o[d])break}h=[]}}0;var x=B(z(u,(function(t){return B(t,(function(t){return t.value>=i[0]&&t.value<=i[1]&&!t.notAdd}))})),(function(t){return t.length>0})),_=[],b=x.length-1;for(d=0;d<x.length;++d)for(var w=x[d],S=0;S<w.length;++S)_.push({value:w[S].value,level:b-d});_.sort((function(t,e){return t.value-e.value}));var M=[];for(d=0;d<_.length;++d)0!==d&&_[d].value===_[d-1].value||M.push(_[d]);return M}(this._minLevelUnit,this._approxInterval,i,e);return(n=n.concat(r)).push({value:e[1],level:0}),n},e.prototype.calcNiceExtent=function(t){var e=this._extent;if(e[0]===e[1]&&(e[0]-=Cc,e[1]+=Cc),e[1]===-1/0&&e[0]===1/0){var n=new Date;e[1]=+new Date(n.getFullYear(),n.getMonth(),n.getDate()),e[0]=e[1]-Cc}this.calcNiceTicks(t.splitNumber,t.minInterval,t.maxInterval)},e.prototype.calcNiceTicks=function(t,e,n){t=t||10;var i=this._extent,r=i[1]-i[0];this._approxInterval=r/t,null!=e&&this._approxInterval<e&&(this._approxInterval=e),null!=n&&this._approxInterval>n&&(this._approxInterval=n);var o=Ox.length,a=Math.min(function(t,e,n,i){for(;n<i;){var r=n+i>>>1;t[r][1]<e?n=r+1:i=r}return n}(Ox,this._approxInterval,0,o),o-1);this._interval=Ox[a][1],this._minLevelUnit=Ox[Math.max(a-1,0)][0]},e.prototype.parse=function(t){return j(t)?t:+jr(t)},e.prototype.contain=function(t){return px(this.parse(t),this._extent)},e.prototype.normalize=function(t){return dx(this.parse(t),this._extent)},e.prototype.scale=function(t){return fx(t,this._extent)},e.type="time",e}(vx),Ox=[["second",Mc],["minute",Ic],["hour",Tc],["quarter-day",216e5],["half-day",432e5],["day",10368e4],["half-week",3024e5],["week",6048e5],["month",26784e5],["quarter",8208e6],["half-year",Dc/2],["year",Dc]];function Rx(t,e){return(t/=Cc)>16?16:t>7.5?7:t>3.5?4:t>1.5?2:1}function Nx(t){return(t/=2592e6)>6?6:t>3?3:t>2?2:1}function Ex(t){return(t/=Tc)>12?12:t>6?6:t>3.5?4:t>2?2:1}function zx(t,e){return(t/=e?Ic:Mc)>30?30:t>20?20:t>15?15:t>10?10:t>5?5:t>2?2:1}function Vx(t){return $r(t,!0)}function Bx(t,e,n){var i=new Date(t);switch(Nc(e)){case"year":case"month":i[jc(n)](0);case"day":i[qc(n)](1);case"hour":i[Kc(n)](0);case"minute":i[$c(n)](0);case"second":i[Jc(n)](0),i[Qc(n)](0)}return i.getTime()}ix.registerClass(Px);var Fx=ix.prototype,Gx=vx.prototype,Wx=zr,Hx=Math.floor,Yx=Math.ceil,Ux=Math.pow,Xx=Math.log,Zx=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="log",e.base=10,e._originalScale=new vx,e._interval=0,e}return n(e,t),e.prototype.getTicks=function(t){var e=this._originalScale,n=this._extent,i=e.getExtent();return z(Gx.getTicks.call(this,t),(function(t){var e=t.value,r=zr(Ux(this.base,e));return r=e===n[0]&&this._fixMin?qx(r,i[0]):r,{value:r=e===n[1]&&this._fixMax?qx(r,i[1]):r}}),this)},e.prototype.setExtent=function(t,e){var n=this.base;t=Xx(t)/Xx(n),e=Xx(e)/Xx(n),Gx.setExtent.call(this,t,e)},e.prototype.getExtent=function(){var t=this.base,e=Fx.getExtent.call(this);e[0]=Ux(t,e[0]),e[1]=Ux(t,e[1]);var n=this._originalScale.getExtent();return this._fixMin&&(e[0]=qx(e[0],n[0])),this._fixMax&&(e[1]=qx(e[1],n[1])),e},e.prototype.unionExtent=function(t){this._originalScale.unionExtent(t);var e=this.base;t[0]=Xx(t[0])/Xx(e),t[1]=Xx(t[1])/Xx(e),Fx.unionExtent.call(this,t)},e.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e))},e.prototype.calcNiceTicks=function(t){t=t||10;var e=this._extent,n=e[1]-e[0];if(!(n===1/0||n<=0)){var i=qr(n);for(t/n*i<=.5&&(i*=10);!isNaN(i)&&Math.abs(i)<1&&Math.abs(i)>0;)i*=10;var r=[zr(Yx(e[0]/i)*i),zr(Hx(e[1]/i)*i)];this._interval=i,this._niceExtent=r}},e.prototype.calcNiceExtent=function(t){Gx.calcNiceExtent.call(this,t),this._fixMin=t.fixMin,this._fixMax=t.fixMax},e.prototype.parse=function(t){return t},e.prototype.contain=function(t){return px(t=Xx(t)/Xx(this.base),this._extent)},e.prototype.normalize=function(t){return dx(t=Xx(t)/Xx(this.base),this._extent)},e.prototype.scale=function(t){return t=fx(t,this._extent),Ux(this.base,t)},e.type="log",e}(ix),jx=Zx.prototype;function qx(t,e){return Wx(t,Br(e))}jx.getMinorTicks=Gx.getMinorTicks,jx.getLabel=Gx.getLabel,ix.registerClass(Zx);var Kx=function(){function t(t,e,n){this._prepareParams(t,e,n)}return t.prototype._prepareParams=function(t,e,n){n[1]<n[0]&&(n=[NaN,NaN]),this._dataMin=n[0],this._dataMax=n[1];var i=this._isOrdinal="ordinal"===t.type;this._needCrossZero="interval"===t.type&&e.getNeedCrossZero&&e.getNeedCrossZero();var r=this._modelMinRaw=e.get("min",!0);U(r)?this._modelMinNum=t_(t,r({min:n[0],max:n[1]})):"dataMin"!==r&&(this._modelMinNum=t_(t,r));var o=this._modelMaxRaw=e.get("max",!0);if(U(o)?this._modelMaxNum=t_(t,o({min:n[0],max:n[1]})):"dataMax"!==o&&(this._modelMaxNum=t_(t,o)),i)this._axisDataLen=e.getCategories().length;else{var a=e.get("boundaryGap"),s=Y(a)?a:[a||0,a||0];"boolean"==typeof s[0]||"boolean"==typeof s[1]?this._boundaryGapInner=[0,0]:this._boundaryGapInner=[gr(s[0],1),gr(s[1],1)]}},t.prototype.calculate=function(){var t=this._isOrdinal,e=this._dataMin,n=this._dataMax,i=this._axisDataLen,r=this._boundaryGapInner,o=t?null:n-e||Math.abs(e),a="dataMin"===this._modelMinRaw?e:this._modelMinNum,s="dataMax"===this._modelMaxRaw?n:this._modelMaxNum,l=null!=a,u=null!=s;null==a&&(a=t?i?0:NaN:e-r[0]*o),null==s&&(s=t?i?i-1:NaN:n+r[1]*o),(null==a||!isFinite(a))&&(a=NaN),(null==s||!isFinite(s))&&(s=NaN);var h=nt(a)||nt(s)||t&&!i;this._needCrossZero&&(a>0&&s>0&&!l&&(a=0),a<0&&s<0&&!u&&(s=0));var c=this._determinedMin,p=this._determinedMax;return null!=c&&(a=c,l=!0),null!=p&&(s=p,u=!0),{min:a,max:s,minFixed:l,maxFixed:u,isBlank:h}},t.prototype.modifyDataMinMax=function(t,e){this[Jx[t]]=e},t.prototype.setDeterminedMinMax=function(t,e){var n=$x[t];this[n]=e},t.prototype.freeze=function(){this.frozen=!0},t}(),$x={min:"_determinedMin",max:"_determinedMax"},Jx={min:"_dataMin",max:"_dataMax"};function Qx(t,e,n){var i=t.rawExtentInfo;return i||(i=new Kx(t,e,n),t.rawExtentInfo=i,i)}function t_(t,e){return null==e?null:nt(e)?NaN:t.parse(e)}function e_(t,e){var n=t.type,i=Qx(t,e,t.getExtent()).calculate();t.setBlank(i.isBlank);var r=i.min,o=i.max,a=e.ecModel;if(a&&"time"===n){var s=Ix("bar",a),l=!1;if(E(s,(function(t){l=l||t.getBaseAxis()===e.axis})),l){var u=Tx(s),h=function(t,e,n,i){var r=n.axis.getExtent(),o=r[1]-r[0],a=function(t,e,n){if(t&&e){var i=t[Mx(e)];return null!=i&&null!=n?i[Sx(n)]:i}}(i,n.axis);if(void 0===a)return{min:t,max:e};var s=1/0;E(a,(function(t){s=Math.min(t.offset,s)}));var l=-1/0;E(a,(function(t){l=Math.max(t.offset+t.width,l)})),s=Math.abs(s),l=Math.abs(l);var u=s+l,h=e-t,c=h/(1-(s+l)/o)-h;return{min:t-=c*(s/u),max:e+=c*(l/u)}}(r,o,e,u);r=h.min,o=h.max}}return{extent:[r,o],fixMin:i.minFixed,fixMax:i.maxFixed}}function n_(t,e){var n=e,i=e_(t,n),r=i.extent,o=n.get("splitNumber");t instanceof Zx&&(t.base=n.get("logBase"));var a=t.type,s=n.get("interval"),l="interval"===a||"time"===a;t.setExtent(r[0],r[1]),t.calcNiceExtent({splitNumber:o,fixMin:i.fixMin,fixMax:i.fixMax,minInterval:l?n.get("minInterval"):null,maxInterval:l?n.get("maxInterval"):null}),null!=s&&t.setInterval&&t.setInterval(s)}function i_(t,e){if(e=e||t.get("type"))switch(e){case"category":return new gx({ordinalMeta:t.getOrdinalMeta?t.getOrdinalMeta():t.getCategories(),extent:[1/0,-1/0]});case"time":return new Px({locale:t.ecModel.getLocaleModel(),useUTC:t.ecModel.get("useUTC")});default:return new(ix.getClass(e)||vx)}}function r_(t){var e,n,i=t.getLabelModel().get("formatter"),r="category"===t.type?t.scale.getExtent()[0]:null;return"time"===t.scale.type?(n=i,function(e,i){return t.scale.getFormattedLabel(e,i,n)}):X(i)?function(e){return function(n){var i=t.scale.getLabel(n);return e.replace("{value}",null!=i?i:"")}}(i):U(i)?(e=i,function(n,i){return null!=r&&(i=n.value-r),e(o_(t,n),i,null!=n.level?{level:n.level}:null)}):function(e){return t.scale.getLabel(e)}}function o_(t,e){return"category"===t.type?t.scale.getLabel(e):e.value}function a_(t,e){var n=e*Math.PI/180,i=t.width,r=t.height,o=i*Math.abs(Math.cos(n))+Math.abs(r*Math.sin(n)),a=i*Math.abs(Math.sin(n))+Math.abs(r*Math.cos(n));return new sr(t.x,t.y,o,a)}function s_(t){var e=t.get("interval");return null==e?"auto":e}function l_(t){return"category"===t.type&&0===s_(t.getLabelModel())}function u_(t,e){var n={};return E(t.mapDimensionsAll(e),(function(e){n[ex(t,e)]=!0})),G(n)}var h_=function(){function t(){}return t.prototype.getNeedCrossZero=function(){return!this.option.scale},t.prototype.getCoordSysModel=function(){},t}();var c_={isDimensionStacked:tx,enableDataStack:Qm,getStackedDimension:ex};var p_=Object.freeze({__proto__:null,createList:function(t){return nx(null,t)},getLayoutRect:mp,dataStack:c_,createScale:function(t,e){var n=e;e instanceof pc||(n=new pc(e));var i=i_(n);return i.setExtent(t[0],t[1]),n_(i,n),i},mixinAxisModelCommonMethods:function(t){R(t,h_)},getECData:Ws,createTextStyle:function(t,e){return Yh(t,null,null,"normal"!==(e=e||{}).state)},createDimensions:function(t,e){return jm(t,e).dimensions},createSymbol:ky,enableHoverEmphasis:Pl});function d_(t,e){return Math.abs(t-e)<1e-8}function f_(t,e,n){var i=0,r=t[0];if(!r)return!1;for(var o=1;o<t.length;o++){var a=t[o];i+=ns(r[0],r[1],a[0],a[1],e,n),r=a}var s=t[0];return d_(r[0],s[0])&&d_(r[1],s[1])||(i+=ns(r[0],r[1],s[0],s[1],e,n)),0!==i}var g_=[];function y_(t,e){for(var n=0;n<t.length;n++)Ft(t[n],t[n],e)}function v_(t,e,n,i){for(var r=0;r<t.length;r++){var o=t[r];i&&(o=i.project(o)),o&&isFinite(o[0])&&isFinite(o[1])&&(Gt(e,e,o),Wt(n,n,o))}}var m_=function(){function t(t){this.name=t}return t.prototype.setCenter=function(t){this._center=t},t.prototype.getCenter=function(){var t=this._center;return t||(t=this._center=this.calcCenter()),t},t}(),x_=function(t,e){this.type="polygon",this.exterior=t,this.interiors=e},__=function(t){this.type="linestring",this.points=t},b_=function(t){function e(e,n,i){var r=t.call(this,e)||this;return r.type="geoJSON",r.geometries=n,r._center=i&&[i[0],i[1]],r}return n(e,t),e.prototype.calcCenter=function(){for(var t,e=this.geometries,n=0,i=0;i<e.length;i++){var r=e[i],o=r.exterior,a=o&&o.length;a>n&&(t=r,n=a)}if(t)return function(t){for(var e=0,n=0,i=0,r=t.length,o=t[r-1][0],a=t[r-1][1],s=0;s<r;s++){var l=t[s][0],u=t[s][1],h=o*u-l*a;e+=h,n+=(o+l)*h,i+=(a+u)*h,o=l,a=u}return e?[n/e/3,i/e/3,e]:[t[0][0]||0,t[0][1]||0]}(t.exterior);var s=this.getBoundingRect();return[s.x+s.width/2,s.y+s.height/2]},e.prototype.getBoundingRect=function(t){var e=this._rect;if(e&&!t)return e;var n=[1/0,1/0],i=[-1/0,-1/0];return E(this.geometries,(function(e){"polygon"===e.type?v_(e.exterior,n,i,t):E(e.points,(function(e){v_(e,n,i,t)}))})),isFinite(n[0])&&isFinite(n[1])&&isFinite(i[0])&&isFinite(i[1])||(n[0]=n[1]=i[0]=i[1]=0),e=new sr(n[0],n[1],i[0]-n[0],i[1]-n[1]),t||(this._rect=e),e},e.prototype.contain=function(t){var e=this.getBoundingRect(),n=this.geometries;if(!e.contain(t[0],t[1]))return!1;t:for(var i=0,r=n.length;i<r;i++){var o=n[i];if("polygon"===o.type){var a=o.exterior,s=o.interiors;if(f_(a,t[0],t[1])){for(var l=0;l<(s?s.length:0);l++)if(f_(s[l],t[0],t[1]))continue t;return!0}}}return!1},e.prototype.transformTo=function(t,e,n,i){var r=this.getBoundingRect(),o=r.width/r.height;n?i||(i=n/o):n=o*i;for(var a=new sr(t,e,n,i),s=r.calculateTransform(a),l=this.geometries,u=0;u<l.length;u++){var h=l[u];"polygon"===h.type?(y_(h.exterior,s),E(h.interiors,(function(t){y_(t,s)}))):E(h.points,(function(t){y_(t,s)}))}(r=this._rect).copy(a),this._center=[r.x+r.width/2,r.y+r.height/2]},e.prototype.cloneShallow=function(t){null==t&&(t=this.name);var n=new e(t,this.geometries,this._center);return n._rect=this._rect,n.transformTo=null,n},e}(m_),w_=function(t){function e(e,n){var i=t.call(this,e)||this;return i.type="geoSVG",i._elOnlyForCalculate=n,i}return n(e,t),e.prototype.calcCenter=function(){for(var t=this._elOnlyForCalculate,e=t.getBoundingRect(),n=[e.x+e.width/2,e.y+e.height/2],i=Oi(g_),r=t;r&&!r.isGeoSVGGraphicRoot;)Ni(i,r.getLocalTransform(),i),r=r.parent;return Bi(i,i),Ft(n,n,i),n},e}(m_);function S_(t,e,n){for(var i=0;i<t.length;i++)t[i]=M_(t[i],e[i],n)}function M_(t,e,n){for(var i=[],r=e[0],o=e[1],a=0;a<t.length;a+=2){var s=t.charCodeAt(a)-64,l=t.charCodeAt(a+1)-64;s=s>>1^-(1&s),l=l>>1^-(1&l),r=s+=r,o=l+=o,i.push([s/n,l/n])}return i}function I_(t,e){return z(B((t=function(t){if(!t.UTF8Encoding)return t;var e=t,n=e.UTF8Scale;return null==n&&(n=1024),E(e.features,(function(t){var e=t.geometry,i=e.encodeOffsets,r=e.coordinates;if(i)switch(e.type){case"LineString":e.coordinates=M_(r,i,n);break;case"Polygon":case"MultiLineString":S_(r,i,n);break;case"MultiPolygon":E(r,(function(t,e){return S_(t,i[e],n)}))}})),e.UTF8Encoding=!1,e}(t)).features,(function(t){return t.geometry&&t.properties&&t.geometry.coordinates.length>0})),(function(t){var n=t.properties,i=t.geometry,r=[];switch(i.type){case"Polygon":var o=i.coordinates;r.push(new x_(o[0],o.slice(1)));break;case"MultiPolygon":E(i.coordinates,(function(t){t[0]&&r.push(new x_(t[0],t.slice(1)))}));break;case"LineString":r.push(new __([i.coordinates]));break;case"MultiLineString":r.push(new __(i.coordinates))}var a=new b_(n[e||"name"],r,n.cp);return a.properties=n,a}))}var T_=Object.freeze({__proto__:null,linearMap:Nr,round:zr,asc:Vr,getPrecision:Br,getPrecisionSafe:Fr,getPixelPrecision:Gr,getPercentWithPrecision:Wr,MAX_SAFE_INTEGER:Yr,remRadian:Ur,isRadianAroundZero:Xr,parseDate:jr,quantity:qr,quantityExponent:Kr,nice:$r,quantile:Jr,reformIntervals:Qr,isNumeric:eo,numericToNumber:to}),C_=Object.freeze({__proto__:null,parse:jr,format:zc}),D_=Object.freeze({__proto__:null,extendShape:dh,extendPath:gh,makePath:mh,makeImage:xh,mergePath:bh,resizePath:wh,createIcon:Lh,updateProps:ih,initProps:rh,getTransform:Mh,clipPointsByRect:Ah,clipRectByRect:kh,registerShape:yh,getShapeClass:vh,Group:Cr,Image:xs,Text:As,Circle:uu,Ellipse:cu,Sector:Tu,Ring:Du,Polygon:Lu,Polyline:Ou,Rect:Ts,Line:Eu,BezierCurve:Fu,Arc:Wu,IncrementalDisplayable:Qu,CompoundPath:Hu,LinearGradient:Uu,RadialGradient:Xu,BoundingRect:sr}),A_=Object.freeze({__proto__:null,addCommas:tp,toCamelCase:ep,normalizeCssArray:np,encodeHTML:op,formatTpl:up,getTooltipMarker:hp,formatTime:function(t,e,n){"week"!==t&&"month"!==t&&"quarter"!==t&&"half-year"!==t&&"year"!==t||(t="MM-dd\nyyyy");var i=jr(e),r=n?"getUTC":"get",o=i[r+"FullYear"](),a=i[r+"Month"]()+1,s=i[r+"Date"](),l=i[r+"Hours"](),u=i[r+"Minutes"](),h=i[r+"Seconds"](),c=i[r+"Milliseconds"]();return t=t.replace("MM",Rc(a,2)).replace("M",a).replace("yyyy",o).replace("yy",o%100+"").replace("dd",Rc(s,2)).replace("d",s).replace("hh",Rc(l,2)).replace("h",l).replace("mm",Rc(u,2)).replace("m",u).replace("ss",Rc(h,2)).replace("s",h).replace("SSS",Rc(c,3))},capitalFirst:function(t){return t?t.charAt(0).toUpperCase()+t.substr(1):t},truncateText:$o,getTextRect:function(t,e,n,i,r,o,a,s){return new As({style:{text:t,font:e,align:n,verticalAlign:i,padding:r,rich:o,overflow:a?"truncate":null,lineHeight:s}}).getBoundingRect()}}),k_=Object.freeze({__proto__:null,map:z,each:E,indexOf:P,inherits:O,reduce:V,filter:B,bind:W,curry:H,isArray:Y,isString:X,isObject:q,isFunction:U,extend:A,defaults:k,clone:T,merge:C}),L_=So();function P_(t){return"category"===t.type?function(t){var e=t.getLabelModel(),n=R_(t,e);return!e.get("show")||t.scale.isBlank()?{labels:[],labelCategoryInterval:n.labelCategoryInterval}:n}(t):function(t){var e=t.scale.getTicks(),n=r_(t);return{labels:z(e,(function(e,i){return{level:e.level,formattedLabel:n(e,i),rawLabel:t.scale.getLabel(e),tickValue:e.value}}))}}(t)}function O_(t,e){return"category"===t.type?function(t,e){var n,i,r=N_(t,"ticks"),o=s_(e),a=E_(r,o);if(a)return a;e.get("show")&&!t.scale.isBlank()||(n=[]);if(U(o))n=B_(t,o,!0);else if("auto"===o){var s=R_(t,t.getLabelModel());i=s.labelCategoryInterval,n=z(s.labels,(function(t){return t.tickValue}))}else n=V_(t,i=o,!0);return z_(r,o,{ticks:n,tickCategoryInterval:i})}(t,e):{ticks:z(t.scale.getTicks(),(function(t){return t.value}))}}function R_(t,e){var n,i,r=N_(t,"labels"),o=s_(e),a=E_(r,o);return a||(U(o)?n=B_(t,o):(i="auto"===o?function(t){var e=L_(t).autoInterval;return null!=e?e:L_(t).autoInterval=t.calculateCategoryInterval()}(t):o,n=V_(t,i)),z_(r,o,{labels:n,labelCategoryInterval:i}))}function N_(t,e){return L_(t)[e]||(L_(t)[e]=[])}function E_(t,e){for(var n=0;n<t.length;n++)if(t[n].key===e)return t[n].value}function z_(t,e,n){return t.push({key:e,value:n}),n}function V_(t,e,n){var i=r_(t),r=t.scale,o=r.getExtent(),a=t.getLabelModel(),s=[],l=Math.max((e||0)+1,1),u=o[0],h=r.count();0!==u&&l>1&&h/l>2&&(u=Math.round(Math.ceil(u/l)*l));var c=l_(t),p=a.get("showMinLabel")||c,d=a.get("showMaxLabel")||c;p&&u!==o[0]&&g(o[0]);for(var f=u;f<=o[1];f+=l)g(f);function g(t){var e={value:t};s.push(n?t:{formattedLabel:i(e),rawLabel:r.getLabel(e),tickValue:t})}return d&&f-l!==o[1]&&g(o[1]),s}function B_(t,e,n){var i=t.scale,r=r_(t),o=[];return E(i.getTicks(),(function(t){var a=i.getLabel(t),s=t.value;e(t.value,a)&&o.push(n?s:{formattedLabel:r(t),rawLabel:a,tickValue:s})})),o}var F_=[0,1],G_=function(){function t(t,e,n){this.onBand=!1,this.inverse=!1,this.dim=t,this.scale=e,this._extent=n||[0,0]}return t.prototype.contain=function(t){var e=this._extent,n=Math.min(e[0],e[1]),i=Math.max(e[0],e[1]);return t>=n&&t<=i},t.prototype.containData=function(t){return this.scale.contain(t)},t.prototype.getExtent=function(){return this._extent.slice()},t.prototype.getPixelPrecision=function(t){return Gr(t||this.scale.getExtent(),this._extent)},t.prototype.setExtent=function(t,e){var n=this._extent;n[0]=t,n[1]=e},t.prototype.dataToCoord=function(t,e){var n=this._extent,i=this.scale;return t=i.normalize(t),this.onBand&&"ordinal"===i.type&&W_(n=n.slice(),i.count()),Nr(t,F_,n,e)},t.prototype.coordToData=function(t,e){var n=this._extent,i=this.scale;this.onBand&&"ordinal"===i.type&&W_(n=n.slice(),i.count());var r=Nr(t,n,F_,e);return this.scale.scale(r)},t.prototype.pointToData=function(t,e){},t.prototype.getTicksCoords=function(t){var e=(t=t||{}).tickModel||this.getTickModel(),n=z(O_(this,e).ticks,(function(t){return{coord:this.dataToCoord("ordinal"===this.scale.type?this.scale.getRawOrdinalNumber(t):t),tickValue:t}}),this);return function(t,e,n,i){var r=e.length;if(!t.onBand||n||!r)return;var o,a,s=t.getExtent();if(1===r)e[0].coord=s[0],o=e[1]={coord:s[0]};else{var l=e[r-1].tickValue-e[0].tickValue,u=(e[r-1].coord-e[0].coord)/l;E(e,(function(t){t.coord-=u/2})),a=1+t.scale.getExtent()[1]-e[r-1].tickValue,o={coord:e[r-1].coord+u*a},e.push(o)}var h=s[0]>s[1];c(e[0].coord,s[0])&&(i?e[0].coord=s[0]:e.shift());i&&c(s[0],e[0].coord)&&e.unshift({coord:s[0]});c(s[1],o.coord)&&(i?o.coord=s[1]:e.pop());i&&c(o.coord,s[1])&&e.push({coord:s[1]});function c(t,e){return t=zr(t),e=zr(e),h?t>e:t<e}}(this,n,e.get("alignWithLabel"),t.clamp),n},t.prototype.getMinorTicksCoords=function(){if("ordinal"===this.scale.type)return[];var t=this.model.getModel("minorTick").get("splitNumber");return t>0&&t<100||(t=5),z(this.scale.getMinorTicks(t),(function(t){return z(t,(function(t){return{coord:this.dataToCoord(t),tickValue:t}}),this)}),this)},t.prototype.getViewLabels=function(){return P_(this).labels},t.prototype.getLabelModel=function(){return this.model.getModel("axisLabel")},t.prototype.getTickModel=function(){return this.model.getModel("axisTick")},t.prototype.getBandWidth=function(){var t=this._extent,e=this.scale.getExtent(),n=e[1]-e[0]+(this.onBand?1:0);0===n&&(n=1);var i=Math.abs(t[1]-t[0]);return Math.abs(i)/n},t.prototype.calculateCategoryInterval=function(){return function(t){var e=function(t){var e=t.getLabelModel();return{axisRotate:t.getRotate?t.getRotate():t.isHorizontal&&!t.isHorizontal()?90:0,labelRotate:e.get("rotate")||0,font:e.getFont()}}(t),n=r_(t),i=(e.axisRotate-e.labelRotate)/180*Math.PI,r=t.scale,o=r.getExtent(),a=r.count();if(o[1]-o[0]<1)return 0;var s=1;a>40&&(s=Math.max(1,Math.floor(a/40)));for(var l=o[0],u=t.dataToCoord(l+1)-t.dataToCoord(l),h=Math.abs(u*Math.cos(i)),c=Math.abs(u*Math.sin(i)),p=0,d=0;l<=o[1];l+=s){var f,g,y=cr(n({value:l}),e.font,"center","top");f=1.3*y.width,g=1.3*y.height,p=Math.max(p,f,7),d=Math.max(d,g,7)}var v=p/h,m=d/c;isNaN(v)&&(v=1/0),isNaN(m)&&(m=1/0);var x=Math.max(0,Math.floor(Math.min(v,m))),_=L_(t.model),b=t.getExtent(),w=_.lastAutoInterval,S=_.lastTickCount;return null!=w&&null!=S&&Math.abs(w-x)<=1&&Math.abs(S-a)<=1&&w>x&&_.axisExtent0===b[0]&&_.axisExtent1===b[1]?x=w:(_.lastTickCount=a,_.lastAutoInterval=x,_.axisExtent0=b[0],_.axisExtent1=b[1]),x}(this)},t}();function W_(t,e){var n=(t[1]-t[0])/e/2;t[0]+=n,t[1]-=n}var H_=2*Math.PI,Y_=ja.CMD,U_=["top","right","bottom","left"];function X_(t,e,n,i,r){var o=n.width,a=n.height;switch(t){case"top":i.set(n.x+o/2,n.y-e),r.set(0,-1);break;case"bottom":i.set(n.x+o/2,n.y+a+e),r.set(0,1);break;case"left":i.set(n.x-e,n.y+a/2),r.set(-1,0);break;case"right":i.set(n.x+o+e,n.y+a/2),r.set(1,0)}}function Z_(t,e,n,i,r,o,a,s,l){a-=t,s-=e;var u=Math.sqrt(a*a+s*s),h=(a/=u)*n+t,c=(s/=u)*n+e;if(Math.abs(i-r)%H_<1e-4)return l[0]=h,l[1]=c,u-n;if(o){var p=i;i=Qa(r),r=Qa(p)}else i=Qa(i),r=Qa(r);i>r&&(r+=H_);var d=Math.atan2(s,a);if(d<0&&(d+=H_),d>=i&&d<=r||d+H_>=i&&d+H_<=r)return l[0]=h,l[1]=c,u-n;var f=n*Math.cos(i)+t,g=n*Math.sin(i)+e,y=n*Math.cos(r)+t,v=n*Math.sin(r)+e,m=(f-a)*(f-a)+(g-s)*(g-s),x=(y-a)*(y-a)+(v-s)*(v-s);return m<x?(l[0]=f,l[1]=g,Math.sqrt(m)):(l[0]=y,l[1]=v,Math.sqrt(x))}function j_(t,e,n,i,r,o,a,s){var l=r-t,u=o-e,h=n-t,c=i-e,p=Math.sqrt(h*h+c*c),d=(l*(h/=p)+u*(c/=p))/p;s&&(d=Math.min(Math.max(d,0),1)),d*=p;var f=a[0]=t+d*h,g=a[1]=e+d*c;return Math.sqrt((f-r)*(f-r)+(g-o)*(g-o))}function q_(t,e,n,i,r,o,a){n<0&&(t+=n,n=-n),i<0&&(e+=i,i=-i);var s=t+n,l=e+i,u=a[0]=Math.min(Math.max(r,t),s),h=a[1]=Math.min(Math.max(o,e),l);return Math.sqrt((u-r)*(u-r)+(h-o)*(h-o))}var K_=[];function $_(t,e,n){var i=q_(e.x,e.y,e.width,e.height,t.x,t.y,K_);return n.set(K_[0],K_[1]),i}function J_(t,e,n){for(var i,r,o=0,a=0,s=0,l=0,u=1/0,h=e.data,c=t.x,p=t.y,d=0;d<h.length;){var f=h[d++];1===d&&(s=o=h[d],l=a=h[d+1]);var g=u;switch(f){case Y_.M:o=s=h[d++],a=l=h[d++];break;case Y_.L:g=j_(o,a,h[d],h[d+1],c,p,K_,!0),o=h[d++],a=h[d++];break;case Y_.C:g=je(o,a,h[d++],h[d++],h[d++],h[d++],h[d],h[d+1],c,p,K_),o=h[d++],a=h[d++];break;case Y_.Q:g=tn(o,a,h[d++],h[d++],h[d],h[d+1],c,p,K_),o=h[d++],a=h[d++];break;case Y_.A:var y=h[d++],v=h[d++],m=h[d++],x=h[d++],_=h[d++],b=h[d++];d+=1;var w=!!(1-h[d++]);i=Math.cos(_)*m+y,r=Math.sin(_)*x+v,d<=1&&(s=i,l=r),g=Z_(y,v,x,_,_+b,w,(c-y)*x/m+y,p,K_),o=Math.cos(_+b)*m+y,a=Math.sin(_+b)*x+v;break;case Y_.R:g=q_(s=o=h[d++],l=a=h[d++],h[d++],h[d++],c,p,K_);break;case Y_.Z:g=j_(o,a,s,l,c,p,K_,!0),o=s,a=l}g<u&&(u=g,n.set(K_[0],K_[1]))}return u}var Q_=new Ji,tb=new Ji,eb=new Ji,nb=new Ji,ib=new Ji;function rb(t,e){if(t){var n=t.getTextGuideLine(),i=t.getTextContent();if(i&&n){var r=t.textGuideLineConfig||{},o=[[0,0],[0,0],[0,0]],a=r.candidates||U_,s=i.getBoundingRect().clone();s.applyTransform(i.getComputedTransform());var l=1/0,u=r.anchor,h=t.getComputedTransform(),c=h&&Bi([],h),p=e.get("length2")||0;u&&eb.copy(u);for(var d=0;d<a.length;d++){X_(a[d],0,s,Q_,nb),Ji.scaleAndAdd(tb,Q_,nb,p),tb.transform(c);var f=t.getBoundingRect(),g=u?u.distance(tb):t instanceof fs?J_(tb,t.path,eb):$_(tb,f,eb);g<l&&(l=g,tb.transform(h),eb.transform(h),eb.toArray(o[0]),tb.toArray(o[1]),Q_.toArray(o[2]))}sb(o,e.get("minTurnAngle")),n.setShape({points:o})}}}var ob=[],ab=new Ji;function sb(t,e){if(e<=180&&e>0){e=e/180*Math.PI,Q_.fromArray(t[0]),tb.fromArray(t[1]),eb.fromArray(t[2]),Ji.sub(nb,Q_,tb),Ji.sub(ib,eb,tb);var n=nb.len(),i=ib.len();if(!(n<.001||i<.001)){nb.scale(1/n),ib.scale(1/i);var r=nb.dot(ib);if(Math.cos(e)<r){var o=j_(tb.x,tb.y,eb.x,eb.y,Q_.x,Q_.y,ob,!1);ab.fromArray(ob),ab.scaleAndAdd(ib,o/Math.tan(Math.PI-e));var a=eb.x!==tb.x?(ab.x-tb.x)/(eb.x-tb.x):(ab.y-tb.y)/(eb.y-tb.y);if(isNaN(a))return;a<0?Ji.copy(ab,tb):a>1&&Ji.copy(ab,eb),ab.toArray(t[1])}}}}function lb(t,e,n){if(n<=180&&n>0){n=n/180*Math.PI,Q_.fromArray(t[0]),tb.fromArray(t[1]),eb.fromArray(t[2]),Ji.sub(nb,tb,Q_),Ji.sub(ib,eb,tb);var i=nb.len(),r=ib.len();if(!(i<.001||r<.001))if(nb.scale(1/i),ib.scale(1/r),nb.dot(e)<Math.cos(n)){var o=j_(tb.x,tb.y,eb.x,eb.y,Q_.x,Q_.y,ob,!1);ab.fromArray(ob);var a=Math.PI/2,s=a+Math.acos(ib.dot(e))-n;if(s>=a)Ji.copy(ab,eb);else{ab.scaleAndAdd(ib,o/Math.tan(Math.PI/2-s));var l=eb.x!==tb.x?(ab.x-tb.x)/(eb.x-tb.x):(ab.y-tb.y)/(eb.y-tb.y);if(isNaN(l))return;l<0?Ji.copy(ab,tb):l>1&&Ji.copy(ab,eb)}ab.toArray(t[1])}}}function ub(t,e,n,i){var r="normal"===n,o=r?t:t.ensureState(n);o.ignore=e;var a=i.get("smooth");a&&!0===a&&(a=.3),o.shape=o.shape||{},a>0&&(o.shape.smooth=a);var s=i.getModel("lineStyle").getLineStyle();r?t.useStyle(s):o.style=s}function hb(t,e){var n=e.smooth,i=e.points;if(i)if(t.moveTo(i[0][0],i[0][1]),n>0&&i.length>=3){var r=Et(i[0],i[1]),o=Et(i[1],i[2]);if(!r||!o)return t.lineTo(i[1][0],i[1][1]),void t.lineTo(i[2][0],i[2][1]);var a=Math.min(r,o)*n,s=Bt([],i[1],i[0],a/r),l=Bt([],i[1],i[2],a/o),u=Bt([],s,l,.5);t.bezierCurveTo(s[0],s[1],s[0],s[1],u[0],u[1]),t.bezierCurveTo(l[0],l[1],l[0],l[1],i[2][0],i[2][1])}else for(var h=1;h<i.length;h++)t.lineTo(i[h][0],i[h][1])}function cb(t,e,n){var i=t.getTextGuideLine(),r=t.getTextContent();if(r){for(var o=e.normal,a=o.get("show"),s=r.ignore,l=0;l<qs.length;l++){var u=qs[l],h=e[u],c="normal"===u;if(h){var p=h.get("show");if((c?s:rt(r.states[u]&&r.states[u].ignore,s))||!rt(p,a)){var d=c?i:i&&i.states.normal;d&&(d.ignore=!0);continue}i||(i=new Ou,t.setTextGuideLine(i),c||!s&&a||ub(i,!0,"normal",e.normal),t.stateProxy&&(i.stateProxy=t.stateProxy)),ub(i,!1,u,h)}}if(i){k(i.style,n),i.style.fill=null;var f=o.get("showAbove");(t.textGuideLineConfig=t.textGuideLineConfig||{}).showAbove=f||!1,i.buildPath=hb}}else i&&t.removeTextGuideLine()}function pb(t,e){e=e||"labelLine";for(var n={normal:t.getModel(e)},i=0;i<js.length;i++){var r=js[i];n[r]=t.getModel([r,e])}return n}function db(t){for(var e=[],n=0;n<t.length;n++){var i=t[n];if(!i.defaultAttr.ignore){var r=i.label,o=r.getComputedTransform(),a=r.getBoundingRect(),s=!o||o[1]<1e-5&&o[2]<1e-5,l=r.style.margin||0,u=a.clone();u.applyTransform(o),u.x-=l/2,u.y-=l/2,u.width+=l,u.height+=l;var h=s?new $u(a,o):null;e.push({label:r,labelLine:i.labelLine,rect:u,localRect:a,obb:h,priority:i.priority,defaultAttr:i.defaultAttr,layoutOption:i.computedLayoutOption,axisAligned:s,transform:o})}}return e}function fb(t,e,n,i,r,o){var a=t.length;if(!(a<2)){t.sort((function(t,n){return t.rect[e]-n.rect[e]}));for(var s,l=0,u=!1,h=0,c=0;c<a;c++){var p=t[c],d=p.rect;(s=d[e]-l)<0&&(d[e]-=s,p.label[e]-=s,u=!0),h+=Math.max(-s,0),l=d[e]+d[n]}h>0&&o&&_(-h/a,0,a);var f,g,y=t[0],v=t[a-1];return m(),f<0&&b(-f,.8),g<0&&b(g,.8),m(),x(f,g,1),x(g,f,-1),m(),f<0&&w(-f),g<0&&w(g),u}function m(){f=y.rect[e]-i,g=r-v.rect[e]-v.rect[n]}function x(t,e,n){if(t<0){var i=Math.min(e,-t);if(i>0){_(i*n,0,a);var r=i+t;r<0&&b(-r*n,1)}else b(-t*n,1)}}function _(n,i,r){0!==n&&(u=!0);for(var o=i;o<r;o++){var a=t[o];a.rect[e]+=n,a.label[e]+=n}}function b(i,r){for(var o=[],s=0,l=1;l<a;l++){var u=t[l-1].rect,h=Math.max(t[l].rect[e]-u[e]-u[n],0);o.push(h),s+=h}if(s){var c=Math.min(Math.abs(i)/s,r);if(i>0)for(l=0;l<a-1;l++){_(o[l]*c,0,l+1)}else for(l=a-1;l>0;l--){_(-(o[l-1]*c),l,a)}}}function w(t){var e=t<0?-1:1;t=Math.abs(t);for(var n=Math.ceil(t/(a-1)),i=0;i<a-1;i++)if(e>0?_(n,0,i+1):_(-n,a-i-1,a),(t-=n)<=0)return}}function gb(t,e,n,i){return fb(t,"y","height",e,n,i)}function yb(t){var e=[];t.sort((function(t,e){return e.priority-t.priority}));var n=new sr(0,0,0,0);function i(t){if(!t.ignore){var e=t.ensureState("emphasis");null==e.ignore&&(e.ignore=!1)}t.ignore=!0}for(var r=0;r<t.length;r++){var o=t[r],a=o.axisAligned,s=o.localRect,l=o.transform,u=o.label,h=o.labelLine;n.copy(o.rect),n.width-=.1,n.height-=.1,n.x+=.05,n.y+=.05;for(var c=o.obb,p=!1,d=0;d<e.length;d++){var f=e[d];if(n.intersect(f.rect)){if(a&&f.axisAligned){p=!0;break}if(f.obb||(f.obb=new $u(f.localRect,f.transform)),c||(c=new $u(s,l)),c.intersect(f.obb)){p=!0;break}}}p?(i(u),h&&i(h)):(u.attr("ignore",o.defaultAttr.ignore),h&&h.attr("ignore",o.defaultAttr.labelGuideIgnore),e.push(o))}}function vb(t){if(t){for(var e=[],n=0;n<t.length;n++)e.push(t[n].slice());return e}}function mb(t,e){var n=t.label,i=e&&e.getTextGuideLine();return{dataIndex:t.dataIndex,dataType:t.dataType,seriesIndex:t.seriesModel.seriesIndex,text:t.label.style.text,rect:t.hostRect,labelRect:t.rect,align:n.style.align,verticalAlign:n.style.verticalAlign,labelLinePoints:vb(i&&i.shape.points)}}var xb=["align","verticalAlign","width","height","fontSize"],_b=new qi,bb=So(),wb=So();function Sb(t,e,n){for(var i=0;i<n.length;i++){var r=n[i];null!=e[r]&&(t[r]=e[r])}}var Mb=["x","y","rotation"],Ib=function(){function t(){this._labelList=[],this._chartViewList=[]}return t.prototype.clearLabels=function(){this._labelList=[],this._chartViewList=[]},t.prototype._addLabel=function(t,e,n,i,r){var o=i.style,a=i.__hostTarget.textConfig||{},s=i.getComputedTransform(),l=i.getBoundingRect().plain();sr.applyTransform(l,l,s),s?_b.setLocalTransform(s):(_b.x=_b.y=_b.rotation=_b.originX=_b.originY=0,_b.scaleX=_b.scaleY=1);var u,h=i.__hostTarget;if(h){u=h.getBoundingRect().plain();var c=h.getComputedTransform();sr.applyTransform(u,u,c)}var p=u&&h.getTextGuideLine();this._labelList.push({label:i,labelLine:p,seriesModel:n,dataIndex:t,dataType:e,layoutOption:r,computedLayoutOption:null,rect:l,hostRect:u,priority:u?u.width*u.height:0,defaultAttr:{ignore:i.ignore,labelGuideIgnore:p&&p.ignore,x:_b.x,y:_b.y,scaleX:_b.scaleX,scaleY:_b.scaleY,rotation:_b.rotation,style:{x:o.x,y:o.y,align:o.align,verticalAlign:o.verticalAlign,width:o.width,height:o.height,fontSize:o.fontSize},cursor:i.cursor,attachedPos:a.position,attachedRot:a.rotation}})},t.prototype.addLabelsOfSeries=function(t){var e=this;this._chartViewList.push(t);var n=t.__model,i=n.get("labelLayout");(U(i)||G(i).length)&&t.group.traverse((function(t){if(t.ignore)return!0;var r=t.getTextContent(),o=Ws(t);r&&!r.disableLabelLayout&&e._addLabel(o.dataIndex,o.dataType,n,r,i)}))},t.prototype.updateLayoutConfig=function(t){var e=t.getWidth(),n=t.getHeight();function i(t,e){return function(){rb(t,e)}}for(var r=0;r<this._labelList.length;r++){var o=this._labelList[r],a=o.label,s=a.__hostTarget,l=o.defaultAttr,u=void 0;u=(u=U(o.layoutOption)?o.layoutOption(mb(o,s)):o.layoutOption)||{},o.computedLayoutOption=u;var h=Math.PI/180;s&&s.setTextConfig({local:!1,position:null!=u.x||null!=u.y?null:l.attachedPos,rotation:null!=u.rotate?u.rotate*h:l.attachedRot,offset:[u.dx||0,u.dy||0]});var c=!1;if(null!=u.x?(a.x=Er(u.x,e),a.setStyle("x",0),c=!0):(a.x=l.x,a.setStyle("x",l.style.x)),null!=u.y?(a.y=Er(u.y,n),a.setStyle("y",0),c=!0):(a.y=l.y,a.setStyle("y",l.style.y)),u.labelLinePoints){var p=s.getTextGuideLine();p&&(p.setShape({points:u.labelLinePoints}),c=!1)}bb(a).needsUpdateLabelLine=c,a.rotation=null!=u.rotate?u.rotate*h:l.rotation,a.scaleX=l.scaleX,a.scaleY=l.scaleY;for(var d=0;d<xb.length;d++){var f=xb[d];a.setStyle(f,null!=u[f]?u[f]:l.style[f])}if(u.draggable){if(a.draggable=!0,a.cursor="move",s){var g=o.seriesModel;if(null!=o.dataIndex)g=o.seriesModel.getData(o.dataType).getItemModel(o.dataIndex);a.on("drag",i(s,g.getModel("labelLine")))}}else a.off("drag"),a.cursor=l.cursor}},t.prototype.layout=function(t){var e,n=t.getWidth(),i=t.getHeight(),r=db(this._labelList),o=B(r,(function(t){return"shiftX"===t.layoutOption.moveOverlap})),a=B(r,(function(t){return"shiftY"===t.layoutOption.moveOverlap}));fb(o,"x","width",0,n,e),gb(a,0,i),yb(B(r,(function(t){return t.layoutOption.hideOverlap})))},t.prototype.processLabelsOverall=function(){var t=this;E(this._chartViewList,(function(e){var n=e.__model,i=e.ignoreLabelLineUpdate,r=n.isAnimationEnabled();e.group.traverse((function(e){if(e.ignore&&!e.forceLabelAnimation)return!0;var o=!i,a=e.getTextContent();!o&&a&&(o=bb(a).needsUpdateLabelLine),o&&t._updateLabelLine(e,n),r&&t._animateLabels(e,n)}))}))},t.prototype._updateLabelLine=function(t,e){var n=t.getTextContent(),i=Ws(t),r=i.dataIndex;if(n&&null!=r){var o=e.getData(i.dataType),a=o.getItemModel(r),s={},l=o.getItemVisual(r,"style"),u=o.getVisual("drawType");s.stroke=l[u];var h=a.getModel("labelLine");cb(t,pb(a),s),rb(t,h)}},t.prototype._animateLabels=function(t,e){var n=t.getTextContent(),i=t.getTextGuideLine();if(n&&(t.forceLabelAnimation||!n.ignore&&!n.invisible&&!t.disableLabelAnimation&&!oh(t))){var r=(d=bb(n)).oldLayout,o=Ws(t),a=o.dataIndex,s={x:n.x,y:n.y,rotation:n.rotation},l=e.getData(o.dataType);if(r){n.attr(r);var u=t.prevStates;u&&(P(u,"select")>=0&&n.attr(d.oldLayoutSelect),P(u,"emphasis")>=0&&n.attr(d.oldLayoutEmphasis)),ih(n,s,e,a)}else if(n.attr(s),!$h(n).valueAnimation){var h=rt(n.style.opacity,1);n.style.opacity=0,rh(n,{style:{opacity:h}},e,a)}if(d.oldLayout=s,n.states.select){var c=d.oldLayoutSelect={};Sb(c,s,Mb),Sb(c,n.states.select,Mb)}if(n.states.emphasis){var p=d.oldLayoutEmphasis={};Sb(p,s,Mb),Sb(p,n.states.emphasis,Mb)}Qh(n,a,l,e,e)}if(i&&!i.ignore&&!i.invisible){r=(d=wb(i)).oldLayout;var d,f={points:i.shape.points};r?(i.attr({shape:r}),ih(i,{shape:f},e)):(i.setShape(f),i.style.strokePercent=0,rh(i,{style:{strokePercent:1}},e)),d.oldLayout=f}},t}(),Tb=So();var Cb=Math.sin,Db=Math.cos,Ab=Math.PI,kb=2*Math.PI,Lb=180/Ab,Pb=function(){function t(){}return t.prototype.reset=function(t){this._start=!0,this._d=[],this._str="",this._p=Math.pow(10,t||4)},t.prototype.moveTo=function(t,e){this._add("M",t,e)},t.prototype.lineTo=function(t,e){this._add("L",t,e)},t.prototype.bezierCurveTo=function(t,e,n,i,r,o){this._add("C",t,e,n,i,r,o)},t.prototype.quadraticCurveTo=function(t,e,n,i){this._add("Q",t,e,n,i)},t.prototype.arc=function(t,e,n,i,r,o){this.ellipse(t,e,n,n,0,i,r,o)},t.prototype.ellipse=function(t,e,n,i,r,o,a,s){var l=a-o,u=!s,h=Math.abs(l),c=En(h-kb)||(u?l>=kb:-l>=kb),p=l>0?l%kb:l%kb+kb,d=!1;d=!!c||!En(h)&&p>=Ab==!!u;var f=t+n*Db(o),g=e+i*Cb(o);this._start&&this._add("M",f,g);var y=Math.round(r*Lb);if(c){var v=1/this._p,m=(u?1:-1)*(kb-v);this._add("A",n,i,y,1,+u,t+n*Db(o+m),e+i*Cb(o+m)),v>.01&&this._add("A",n,i,y,0,+u,f,g)}else{var x=t+n*Db(a),_=e+i*Cb(a);this._add("A",n,i,y,+d,+u,x,_)}},t.prototype.rect=function(t,e,n,i){this._add("M",t,e),this._add("l",n,0),this._add("l",0,i),this._add("l",-n,0),this._add("Z")},t.prototype.closePath=function(){this._d.length>0&&this._add("Z")},t.prototype._add=function(t,e,n,i,r,o,a,s,l){for(var u=[],h=this._p,c=1;c<arguments.length;c++){var p=arguments[c];if(isNaN(p))return void(this._invalid=!0);u.push(Math.round(p*h)/h)}this._d.push(t+u.join(" ")),this._start="Z"===t},t.prototype.generateStr=function(){this._str=this._invalid?"":this._d.join(""),this._d=[]},t.prototype.getStr=function(){return this._str},t}(),Ob="none",Rb=Math.round;var Nb=["lineCap","miterLimit","lineJoin"],Eb=z(Nb,(function(t){return"stroke-"+t.toLowerCase()}));function zb(t,e,n,i){var r=null==e.opacity?1:e.opacity;if(n instanceof xs)t("opacity",r);else{if(function(t){var e=t.fill;return null!=e&&e!==Ob}(e)){var o=Rn(e.fill);t("fill",o.color);var a=null!=e.fillOpacity?e.fillOpacity*o.opacity*r:o.opacity*r;(i||a<1)&&t("fill-opacity",a)}else t("fill",Ob);if(function(t){var e=t.stroke;return null!=e&&e!==Ob}(e)){var s=Rn(e.stroke);t("stroke",s.color);var l=e.strokeNoScale?n.getLineScale():1,u=l?(e.lineWidth||0)/l:0,h=null!=e.strokeOpacity?e.strokeOpacity*s.opacity*r:s.opacity*r,c=e.strokeFirst;if((i||1!==u)&&t("stroke-width",u),(i||c)&&t("paint-order",c?"stroke":"fill"),(i||h<1)&&t("stroke-opacity",h),e.lineDash){var p=Ey(n),d=p[0],f=p[1];d&&(f=Rb(f||0),t("stroke-dasharray",d.join(",")),(f||i)&&t("stroke-dashoffset",f))}else i&&t("stroke-dasharray",Ob);for(var g=0;g<Nb.length;g++){var y=Nb[g];if(i||e[y]!==cs[y]){var v=e[y]||cs[y];v&&t(Eb[g],v)}}}else i&&t("stroke",Ob)}}var Vb="http://www.w3.org/2000/svg",Bb="http://www.w3.org/1999/xlink";function Fb(t){return document.createElementNS(Vb,t)}function Gb(t,e,n,i,r){return{tag:t,attrs:n||{},children:i,text:r,key:e}}function Wb(t,e){var n=(e=e||{}).newline?"\n":"";return function t(e){var i=e.children,r=e.tag;return function(t,e){var n=[];if(e)for(var i in e){var r=e[i],o=i;!1!==r&&(!0!==r&&null!=r&&(o+='="'+r+'"'),n.push(o))}return"<"+t+" "+n.join(" ")+">"}(r,e.attrs)+(e.text||"")+(i?""+n+z(i,(function(e){return t(e)})).join(n)+n:"")+("</"+r+">")}(t)}function Hb(t){return{zrId:t,shadowCache:{},patternCache:{},gradientCache:{},clipPathCache:{},defs:{},cssNodes:{},cssAnims:{},cssClassIdx:0,cssAnimIdx:0,shadowIdx:0,gradientIdx:0,patternIdx:0,clipPathIdx:0}}function Yb(t,e,n,i){return Gb("svg","root",{width:t,height:e,xmlns:Vb,"xmlns:xlink":Bb,version:"1.1",baseProfile:"full",viewBox:!!i&&"0 0 "+t+" "+e},n)}var Ub={cubicIn:"0.32,0,0.67,0",cubicOut:"0.33,1,0.68,1",cubicInOut:"0.65,0,0.35,1",quadraticIn:"0.11,0,0.5,0",quadraticOut:"0.5,1,0.89,1",quadraticInOut:"0.45,0,0.55,1",quarticIn:"0.5,0,0.75,0",quarticOut:"0.25,1,0.5,1",quarticInOut:"0.76,0,0.24,1",quinticIn:"0.64,0,0.78,0",quinticOut:"0.22,1,0.36,1",quinticInOut:"0.83,0,0.17,1",sinusoidalIn:"0.12,0,0.39,0",sinusoidalOut:"0.61,1,0.88,1",sinusoidalInOut:"0.37,0,0.63,1",exponentialIn:"0.7,0,0.84,0",exponentialOut:"0.16,1,0.3,1",exponentialInOut:"0.87,0,0.13,1",circularIn:"0.55,0,1,0.45",circularOut:"0,0.55,0.45,1",circularInOut:"0.85,0,0.15,1"},Xb="transform-origin";function Zb(t,e,n){var i=A({},t.shape);A(i,e),t.buildPath(n,i);var r=new Pb;return r.reset(Yn(t)),n.rebuildPath(r,1),r.generateStr(),r.getStr()}function jb(t,e){var n=e.originX,i=e.originY;(n||i)&&(t[Xb]=n+"px "+i+"px")}var qb={fill:"fill",opacity:"opacity",lineWidth:"stroke-width",lineDashOffset:"stroke-dashoffset"};function Kb(t,e){var n=e.zrId+"-ani-"+e.cssAnimIdx++;return e.cssAnims[n]=t,n}function $b(t){return X(t)?Ub[t]?"cubic-bezier("+Ub[t]+")":rn(t)?t:"":""}function Jb(t,e,n,i){var r=t.animators,o=r.length,a=[];if(t instanceof Hu){if(y=function(t,e,n){var i,r,o=t.shape.paths,a={};if(E(o,(function(t){var e=Hb(n.zrId);e.animation=!0,Jb(t,{},e,!0);var o=e.cssAnims,s=e.cssNodes,l=G(o),u=l.length;if(u){var h=o[r=l[u-1]];for(var c in h){var p=h[c];a[c]=a[c]||{d:""},a[c].d+=p.d||""}for(var d in s){var f=s[d].animation;f.indexOf(r)>=0&&(i=f)}}})),i){e.d=!1;var s=Kb(a,n);return i.replace(r,s)}}(t,e,n))a.push(y);else if(!o)return}else if(!o)return;for(var s={},l=0;l<o;l++){var u=r[l],h=[u.getMaxTime()/1e3+"s"],c=$b(u.getClip().easing),p=u.getDelay();c?h.push(c):h.push("linear"),p&&h.push(p/1e3+"s"),u.getLoop()&&h.push("infinite");var d=h.join(" ");s[d]=s[d]||[d,[]],s[d][1].push(u)}function f(r){var o,a=r[1],s=a.length,l={},u={},h={};function c(t,e,n){for(var i=t.getTracks(),r=t.getMaxTime(),o=0;o<i.length;o++){var a=i[o];if(a.needsAnimate()){var s=a.keyframes,l=a.propName;if(n&&(l=n(l)),l)for(var u=0;u<s.length;u++){var h=s[u],c=Math.round(h.time/r*100)+"%",p=$b(h.easing),d=h.rawValue;(X(d)||j(d))&&(e[c]=e[c]||{},e[c][l]=h.rawValue,p&&(e[c]["animation-timing-function"]=p))}}}}for(var p=0;p<s;p++){(w=(b=a[p]).targetName)?"shape"===w&&c(b,u):!i&&c(b,l)}for(var d in l){var f={};$i(f,t),A(f,l[d]);var g=Un(f),y=l[d]["animation-timing-function"];h[d]=g?{transform:g}:{},jb(h[d],f),y&&(h[d]["animation-timing-function"]=y)}var v=!0;for(var d in u){h[d]=h[d]||{};var m=!o;y=u[d]["animation-timing-function"];m&&(o=new ja);var x=o.len();o.reset(),h[d].d=Zb(t,u[d],o);var _=o.len();if(!m&&x!==_){v=!1;break}y&&(h[d]["animation-timing-function"]=y)}if(!v)for(var d in h)delete h[d].d;if(!i)for(p=0;p<s;p++){var b,w;"style"===(w=(b=a[p]).targetName)&&c(b,h,(function(t){return qb[t]}))}var S,M=G(h),I=!0;for(p=1;p<M.length;p++){var T=M[p-1],C=M[p];if(h[T][Xb]!==h[C][Xb]){I=!1;break}S=h[T][Xb]}if(I&&S){for(var d in h)h[d][Xb]&&delete h[d][Xb];e[Xb]=S}if(B(M,(function(t){return G(h[t]).length>0})).length)return Kb(h,n)+" "+r[0]+" both"}for(var g in s){var y;(y=f(s[g]))&&a.push(y)}if(a.length){var v=n.zrId+"-cls-"+n.cssClassIdx++;n.cssNodes["."+v]={animation:a.join(",")},e.class=v}}var Qb=Math.round;function tw(t){return t&&X(t.src)}function ew(t){return t&&U(t.toDataURL)}function nw(t,e,n,i){zb((function(r,o){var a="fill"===r||"stroke"===r;a&&function(t){return t&&("linear"===t.type||"radial"===t.type)}(o)?function(t,e,n,i){var r,o=t[n],a={gradientUnits:o.global?"userSpaceOnUse":"objectBoundingBox"};if(Gn(o))r="linearGradient",a.x1=o.x,a.y1=o.y,a.x2=o.x2,a.y2=o.y2;else{if(!Wn(o))return void 0;r="radialGradient",a.cx=rt(o.x,.5),a.cy=rt(o.y,.5),a.r=rt(o.r,.5)}for(var s=o.colorStops,l=[],u=0,h=s.length;u<h;++u){var c=100*Vn(s[u].offset)+"%",p=Rn(s[u].color),d=p.color,f=p.opacity,g={offset:c};g["stop-color"]=d,f<1&&(g["stop-opacity"]=f),l.push(Gb("stop",u+"",g))}var y=Wb(Gb(r,"",a,l)),v=i.gradientCache,m=v[y];m||(m=i.zrId+"-g"+i.gradientIdx++,v[y]=m,a.id=m,i.defs[m]=Gb(r,m,a,l));e[n]=Hn(m)}(e,t,r,i):a&&function(t){return Fn(t)||function(t){return t&&!!t.svgElement}(t)}(o)?function(t,e,n,i){var r,o=t.style[n],a={patternUnits:"userSpaceOnUse"};if(Fn(o)){var s=o.imageWidth,l=o.imageHeight,u=void 0,h=o.image;if(X(h)?u=h:tw(h)?u=h.src:ew(h)&&(u=h.toDataURL()),"undefined"==typeof Image){var c="Image width/height must been given explictly in svg-ssr renderer.";lt(s,c),lt(l,c)}else if(null==s||null==l){var p=function(t,e){if(t){var n=t.elm,i=t.attrs.width=s||e.width,r=t.attrs.height=l||e.height;n&&(n.setAttribute("width",i),n.setAttribute("height",r))}},d=Zo(u,null,t,(function(t){p(f,t),p(r,t)}));d&&d.width&&d.height&&(s=s||d.width,l=l||d.height)}r=Gb("image","img",{href:u,width:s,height:l}),a.width=s,a.height=l}else o.svgElement&&(r=o.svgElement,a.width=o.svgWidth,a.height=o.svgHeight);if(!r)return;a.patternTransform=Un(o);var f=Gb("pattern","",a,[r]),g=Wb(f),y=i.patternCache,v=y[g];v||(v=i.zrId+"-p"+i.patternIdx++,y[g]=v,a.id=v,f=i.defs[v]=Gb("pattern",v,a,[r]));e[n]=Hn(v)}(n,t,r,i):t[r]=o}),e,n,!1),function(t,e,n){var i=t.style;if(function(t){return t&&(t.shadowBlur||t.shadowOffsetX||t.shadowOffsetY)}(i)){var r=function(t){var e=t.style,n=t.getGlobalScale();return[e.shadowColor,(e.shadowBlur||0).toFixed(2),(e.shadowOffsetX||0).toFixed(2),(e.shadowOffsetY||0).toFixed(2),n[0],n[1]].join(",")}(t),o=n.shadowCache,a=o[r];if(!a){var s=t.getGlobalScale(),l=s[0],u=s[1];if(!l||!u)return;var h=i.shadowOffsetX||0,c=i.shadowOffsetY||0,p=i.shadowBlur,d=Rn(i.shadowColor),f=d.opacity,g=d.color,y=p/2/l+" "+p/2/u;a=n.zrId+"-s"+n.shadowIdx++,n.defs[a]=Gb("filter",a,{id:a,x:"-100%",y:"-100%",width:"300%",height:"300%"},[Gb("feDropShadow","",{dx:h/l,dy:c/u,stdDeviation:y,"flood-color":g,"flood-opacity":f})]),o[r]=a}e.filter=Hn(a)}}(n,t,i)}function iw(t){return En(t[0]-1)&&En(t[1])&&En(t[2])&&En(t[3]-1)}function rw(t,e,n){if(e&&(!function(t){return En(t[4])&&En(t[5])}(e)||!iw(e))){var i=n?10:1e4;t.transform=iw(e)?"translate("+Qb(e[4]*i)/i+" "+Qb(e[5]*i)/i+")":function(t){return"matrix("+zn(t[0])+","+zn(t[1])+","+zn(t[2])+","+zn(t[3])+","+Vn(t[4])+","+Vn(t[5])+")"}(e)}}function ow(t,e,n){for(var i=t.points,r=[],o=0;o<i.length;o++)r.push(Qb(i[o][0]*n)/n),r.push(Qb(i[o][1]*n)/n);e.points=r.join(" ")}function aw(t){return!t.smooth}var sw,lw,uw={circle:[(sw=["cx","cy","r"],lw=z(sw,(function(t){return"string"==typeof t?[t,t]:t})),function(t,e,n){for(var i=0;i<lw.length;i++){var r=lw[i],o=t[r[0]];null!=o&&(e[r[1]]=Qb(o*n)/n)}})],polyline:[ow,aw],polygon:[ow,aw]};function hw(t,e){var n=t.style,i=t.shape,r=uw[t.type],o={},a=e.animation,s="path",l=t.style.strokePercent,u=e.compress&&Yn(t)||4;if(!r||e.willUpdate||r[1]&&!r[1](i)||a&&function(t){for(var e=t.animators,n=0;n<e.length;n++)if("shape"===e[n].targetName)return!0;return!1}(t)||l<1){t.path||t.createPathProxy();var h=t.path;t.shapeChanged()&&(h.beginPath(),t.buildPath(h,t.shape),t.pathUpdated());var c=h.getVersion(),p=t,d=p.__svgPathBuilder;p.__svgPathVersion===c&&d&&l===p.__svgPathStrokePercent||(d||(d=p.__svgPathBuilder=new Pb),d.reset(u),h.rebuildPath(d,l),d.generateStr(),p.__svgPathVersion=c,p.__svgPathStrokePercent=l),o.d=d.getStr()}else{s=t.type;var f=Math.pow(10,u);r[0](i,o,f)}return rw(o,t.transform),nw(o,n,t,e),e.animation&&Jb(t,o,e),Gb(s,t.id+"",o)}function cw(t,e){return t instanceof fs?hw(t,e):t instanceof xs?function(t,e){var n=t.style,i=n.image;if(i&&!X(i)&&(tw(i)?i=i.src:ew(i)&&(i=i.toDataURL())),i){var r=n.x||0,o=n.y||0,a={href:i,width:n.width,height:n.height};return r&&(a.x=r),o&&(a.y=o),rw(a,t.transform),nw(a,n,t,e),e.animation&&Jb(t,a,e),Gb("image",t.id+"",a)}}(t,e):t instanceof ys?function(t,e){var n=t.style,i=n.text;if(null!=i&&(i+=""),i&&!isNaN(n.x)&&!isNaN(n.y)){var r=n.font||a,s=n.x||0,l=function(t,e,n){return"top"===n?t+=e/2:"bottom"===n&&(t-=e/2),t}(n.y||0,fr(r),n.textBaseline),u={"dominant-baseline":"central","text-anchor":Bn[n.textAlign]||n.textAlign};if(Ns(n)){var h="",c=n.fontStyle,p=Os(n.fontSize);if(!parseFloat(p))return;var d=n.fontFamily||o,f=n.fontWeight;h+="font-size:"+p+";font-family:"+d+";",c&&"normal"!==c&&(h+="font-style:"+c+";"),f&&"normal"!==f&&(h+="font-weight:"+f+";"),u.style=h}else u.style="font: "+r;return i.match(/\s/)&&(u["xml:space"]="preserve"),s&&(u.x=s),l&&(u.y=l),rw(u,t.transform),nw(u,n,t,e),e.animation&&Jb(t,u,e),Gb("text",t.id+"",u,void 0,i)}}(t,e):void 0}function pw(t,e,n){var i=n.clipPathCache,r=n.defs,o=i[t.id];if(!o){var a={id:o=n.zrId+"-c"+n.clipPathIdx++};i[t.id]=o,r[o]=Gb("clipPath",o,a,[hw(t,n)])}e["clip-path"]=Hn(o)}function dw(t){return document.createTextNode(t)}function fw(t,e,n){t.insertBefore(e,n)}function gw(t,e){t.removeChild(e)}function yw(t,e){t.appendChild(e)}function vw(t){return t.parentNode}function mw(t){return t.nextSibling}function xw(t,e){t.textContent=e}var _w=Gb("","");function bw(t){return void 0===t}function ww(t){return void 0!==t}function Sw(t,e,n){for(var i={},r=e;r<=n;++r){var o=t[r].key;void 0!==o&&(i[o]=r)}return i}function Mw(t,e){var n=t.key===e.key;return t.tag===e.tag&&n}function Iw(t){var e,n=t.children,i=t.tag;if(ww(i)){var r=t.elm=Fb(i);if(Dw(_w,t),Y(n))for(e=0;e<n.length;++e){var o=n[e];null!=o&&yw(r,Iw(o))}else ww(t.text)&&!q(t.text)&&yw(r,dw(t.text))}else t.elm=dw(t.text);return t.elm}function Tw(t,e,n,i,r){for(;i<=r;++i){var o=n[i];null!=o&&fw(t,Iw(o),e)}}function Cw(t,e,n,i){for(;n<=i;++n){var r=e[n];if(null!=r)if(ww(r.tag))gw(vw(r.elm),r.elm);else gw(t,r.elm)}}function Dw(t,e){var n,i=e.elm,r=t&&t.attrs||{},o=e.attrs||{};if(r!==o){for(n in o){var a=o[n];r[n]!==a&&(!0===a?i.setAttribute(n,""):!1===a?i.removeAttribute(n):120!==n.charCodeAt(0)?i.setAttribute(n,a):"xmlns:xlink"===n||"xmlns"===n?i.setAttributeNS("http://www.w3.org/2000/xmlns/",n,a):58===n.charCodeAt(3)?i.setAttributeNS("http://www.w3.org/XML/1998/namespace",n,a):58===n.charCodeAt(5)?i.setAttributeNS(Bb,n,a):i.setAttribute(n,a))}for(n in r)n in o||i.removeAttribute(n)}}function Aw(t,e){var n=e.elm=t.elm,i=t.children,r=e.children;t!==e&&(Dw(t,e),bw(e.text)?ww(i)&&ww(r)?i!==r&&function(t,e,n){for(var i,r,o,a=0,s=0,l=e.length-1,u=e[0],h=e[l],c=n.length-1,p=n[0],d=n[c];a<=l&&s<=c;)null==u?u=e[++a]:null==h?h=e[--l]:null==p?p=n[++s]:null==d?d=n[--c]:Mw(u,p)?(Aw(u,p),u=e[++a],p=n[++s]):Mw(h,d)?(Aw(h,d),h=e[--l],d=n[--c]):Mw(u,d)?(Aw(u,d),fw(t,u.elm,mw(h.elm)),u=e[++a],d=n[--c]):Mw(h,p)?(Aw(h,p),fw(t,h.elm,u.elm),h=e[--l],p=n[++s]):(bw(i)&&(i=Sw(e,a,l)),bw(r=i[p.key])||(o=e[r]).tag!==p.tag?fw(t,Iw(p),u.elm):(Aw(o,p),e[r]=void 0,fw(t,o.elm,u.elm)),p=n[++s]);(a<=l||s<=c)&&(a>l?Tw(t,null==n[c+1]?null:n[c+1].elm,n,s,c):Cw(t,e,a,l))}(n,i,r):ww(r)?(ww(t.text)&&xw(n,""),Tw(n,null,r,0,r.length-1)):ww(i)?Cw(n,i,0,i.length-1):ww(t.text)&&xw(n,""):t.text!==e.text&&(ww(i)&&Cw(n,i,0,i.length-1),xw(n,e.text)))}var kw=0,Lw=function(){function t(t,e,n){if(this.type="svg",this.refreshHover=Pw("refreshHover"),this.configLayer=Pw("configLayer"),this.storage=e,this._opts=n=A({},n),this.root=t,this._id="zr"+kw++,this._oldVNode=Yb(n.width,n.height),t&&!n.ssr){var i=this._viewport=document.createElement("div");i.style.cssText="position:relative;overflow:hidden";var r=this._svgDom=this._oldVNode.elm=Fb("svg");Dw(null,this._oldVNode),i.appendChild(r),t.appendChild(i)}this.resize(n.width,n.height)}return t.prototype.getType=function(){return this.type},t.prototype.getViewportRoot=function(){return this._viewport},t.prototype.getViewportRootOffset=function(){var t=this.getViewportRoot();if(t)return{offsetLeft:t.offsetLeft||0,offsetTop:t.offsetTop||0}},t.prototype.getSvgDom=function(){return this._svgDom},t.prototype.refresh=function(){if(this.root){var t=this.renderToVNode({willUpdate:!0});t.attrs.style="position:absolute;left:0;top:0;user-select:none",function(t,e){if(Mw(t,e))Aw(t,e);else{var n=t.elm,i=vw(n);Iw(e),null!==i&&(fw(i,e.elm,mw(n)),Cw(i,[t],0,0))}}(this._oldVNode,t),this._oldVNode=t}},t.prototype.renderOneToVNode=function(t){return cw(t,Hb(this._id))},t.prototype.renderToVNode=function(t){t=t||{};var e=this.storage.getDisplayList(!0),n=this._backgroundColor,i=this._width,r=this._height,o=Hb(this._id);o.animation=t.animation,o.willUpdate=t.willUpdate,o.compress=t.compress;var a=[];if(n&&"none"!==n){var s=Rn(n),l=s.color,u=s.opacity;this._bgVNode=Gb("rect","bg",{width:i,height:r,x:"0",y:"0",id:"0",fill:l,"fill-opacity":u}),a.push(this._bgVNode)}else this._bgVNode=null;var h=t.compress?null:this._mainVNode=Gb("g","main",{},[]);this._paintList(e,o,h?h.children:a),h&&a.push(h);var c=z(G(o.defs),(function(t){return o.defs[t]}));if(c.length&&a.push(Gb("defs","defs",{},c)),t.animation){var p=function(t,e,n){var i=(n=n||{}).newline?"\n":"",r=" {"+i,o=i+"}",a=z(G(t),(function(e){return e+r+z(G(t[e]),(function(n){return n+":"+t[e][n]+";"})).join(i)+o})).join(i),s=z(G(e),(function(t){return"@keyframes "+t+r+z(G(e[t]),(function(n){return n+r+z(G(e[t][n]),(function(i){var r=e[t][n][i];return"d"===i&&(r='path("'+r+'")'),i+":"+r+";"})).join(i)+o})).join(i)+o})).join(i);return a||s?["<![CDATA[",a,s,"]]>"].join(i):""}(o.cssNodes,o.cssAnims,{newline:!0});if(p){var d=Gb("style","stl",{},[],p);a.push(d)}}return Yb(i,r,a,t.useViewBox)},t.prototype.renderToString=function(t){return t=t||{},Wb(this.renderToVNode({animation:rt(t.cssAnimation,!0),willUpdate:!1,compress:!0,useViewBox:rt(t.useViewBox,!0)}),{newline:!0})},t.prototype.setBackgroundColor=function(t){this._backgroundColor=t;var e=this._bgVNode;if(e&&e.elm){var n=Rn(t),i=n.color,r=n.opacity;e.elm.setAttribute("fill",i),r<1&&e.elm.setAttribute("fill-opacity",r)}},t.prototype.getSvgRoot=function(){return this._mainVNode&&this._mainVNode.elm},t.prototype._paintList=function(t,e,n){for(var i,r,o=t.length,a=[],s=0,l=0,u=0;u<o;u++){var h=t[u];if(!h.invisible){var c=h.__clipPaths,p=c&&c.length||0,d=r&&r.length||0,f=void 0;for(f=Math.max(p-1,d-1);f>=0&&(!c||!r||c[f]!==r[f]);f--);for(var g=d-1;g>f;g--)i=a[--s-1];for(var y=f+1;y<p;y++){var v={};pw(c[y],v,e);var m=Gb("g","clip-g-"+l++,v,[]);(i?i.children:n).push(m),a[s++]=m,i=m}r=c;var x=cw(h,e);x&&(i?i.children:n).push(x)}}},t.prototype.resize=function(t,e){var n=this._opts,i=this.root,r=this._viewport;if(null!=t&&(n.width=t),null!=e&&(n.height=e),i&&r&&(r.style.display="none",t=Ny(i,0,n),e=Ny(i,1,n),r.style.display=""),this._width!==t||this._height!==e){if(this._width=t,this._height=e,r){var o=r.style;o.width=t+"px",o.height=e+"px"}var a=this._svgDom;a&&(a.setAttribute("width",t),a.setAttribute("height",e))}},t.prototype.getWidth=function(){return this._width},t.prototype.getHeight=function(){return this._height},t.prototype.dispose=function(){this.root&&(this.root.innerHTML=""),this._svgDom=this._viewport=this.storage=this._oldVNode=this._bgVNode=this._mainVNode=null},t.prototype.clear=function(){this._svgDom&&(this._svgDom.innerHTML=null),this._oldVNode=null},t.prototype.toDataURL=function(t){var e=encodeURIComponent(this.renderToString()),n="data:image/svg+xml;";return t?(e=Xn(e))&&n+"base64,"+e:n+"charset=UTF-8,"+e},t}();function Pw(t){return function(){0}}function Ow(t,e,n){var i=h.createCanvas(),r=e.getWidth(),o=e.getHeight(),a=i.style;return a&&(a.position="absolute",a.left="0",a.top="0",a.width=r+"px",a.height=o+"px",i.setAttribute("data-zr-dom-id",t)),i.width=r*n,i.height=o*n,i}var Rw=function(t){function e(e,n,i){var r,o=t.call(this)||this;o.motionBlur=!1,o.lastFrameAlpha=.7,o.dpr=1,o.virtual=!1,o.config={},o.incremental=!1,o.zlevel=0,o.maxRepaintRectCount=5,o.__dirty=!0,o.__firstTimePaint=!0,o.__used=!1,o.__drawIndex=0,o.__startIndex=0,o.__endIndex=0,o.__prevStartIndex=null,o.__prevEndIndex=null,i=i||Ai,"string"==typeof e?r=Ow(e,n,i):q(e)&&(e=(r=e).id),o.id=e,o.dom=r;var a=r.style;return a&&(vt(r),r.onselectstart=function(){return!1},a.padding="0",a.margin="0",a.borderWidth="0"),o.painter=n,o.dpr=i,o}return n(e,t),e.prototype.getElementCount=function(){return this.__endIndex-this.__startIndex},e.prototype.afterBrush=function(){this.__prevStartIndex=this.__startIndex,this.__prevEndIndex=this.__endIndex},e.prototype.initContext=function(){this.ctx=this.dom.getContext("2d"),this.ctx.dpr=this.dpr},e.prototype.setUnpainted=function(){this.__firstTimePaint=!0},e.prototype.createBackBuffer=function(){var t=this.dpr;this.domBack=Ow("back-"+this.id,this.painter,t),this.ctxBack=this.domBack.getContext("2d"),1!==t&&this.ctxBack.scale(t,t)},e.prototype.createRepaintRects=function(t,e,n,i){if(this.__firstTimePaint)return this.__firstTimePaint=!1,null;var r,o=[],a=this.maxRepaintRectCount,s=!1,l=new sr(0,0,0,0);function u(t){if(t.isFinite()&&!t.isZero())if(0===o.length){(e=new sr(0,0,0,0)).copy(t),o.push(e)}else{for(var e,n=!1,i=1/0,r=0,u=0;u<o.length;++u){var h=o[u];if(h.intersect(t)){var c=new sr(0,0,0,0);c.copy(h),c.union(t),o[u]=c,n=!0;break}if(s){l.copy(t),l.union(h);var p=t.width*t.height,d=h.width*h.height,f=l.width*l.height-p-d;f<i&&(i=f,r=u)}}if(s&&(o[r].union(t),n=!0),!n)(e=new sr(0,0,0,0)).copy(t),o.push(e);s||(s=o.length>=a)}}for(var h=this.__startIndex;h<this.__endIndex;++h){if(d=t[h]){var c=d.shouldBePainted(n,i,!0,!0);(f=d.__isRendered&&(1&d.__dirty||!c)?d.getPrevPaintRect():null)&&u(f);var p=c&&(1&d.__dirty||!d.__isRendered)?d.getPaintRect():null;p&&u(p)}}for(h=this.__prevStartIndex;h<this.__prevEndIndex;++h){var d,f;c=(d=e[h]).shouldBePainted(n,i,!0,!0);if(d&&(!c||!d.__zr)&&d.__isRendered)(f=d.getPrevPaintRect())&&u(f)}do{r=!1;for(h=0;h<o.length;)if(o[h].isZero())o.splice(h,1);else{for(var g=h+1;g<o.length;)o[h].intersect(o[g])?(r=!0,o[h].union(o[g]),o.splice(g,1)):g++;h++}}while(r);return this._paintRects=o,o},e.prototype.debugGetPaintRects=function(){return(this._paintRects||[]).slice()},e.prototype.resize=function(t,e){var n=this.dpr,i=this.dom,r=i.style,o=this.domBack;r&&(r.width=t+"px",r.height=e+"px"),i.width=t*n,i.height=e*n,o&&(o.width=t*n,o.height=e*n,1!==n&&this.ctxBack.scale(n,n))},e.prototype.clear=function(t,e,n){var i=this.dom,r=this.ctx,o=i.width,a=i.height;e=e||this.clearColor;var s=this.motionBlur&&!t,l=this.lastFrameAlpha,u=this.dpr,h=this;s&&(this.domBack||this.createBackBuffer(),this.ctxBack.globalCompositeOperation="copy",this.ctxBack.drawImage(i,0,0,o/u,a/u));var c=this.domBack;function p(t,n,i,o){if(r.clearRect(t,n,i,o),e&&"transparent"!==e){var a=void 0;Q(e)?(a=e.__canvasGradient||Oy(r,e,{x:0,y:0,width:i,height:o}),e.__canvasGradient=a):tt(e)&&(a=Hy(r,e,{dirty:function(){h.setUnpainted(),h.__painter.refresh()}})),r.save(),r.fillStyle=a||e,r.fillRect(t,n,i,o),r.restore()}s&&(r.save(),r.globalAlpha=l,r.drawImage(c,t,n,i,o),r.restore())}!n||s?p(0,0,o,a):n.length&&E(n,(function(t){p(t.x*u,t.y*u,t.width*u,t.height*u)}))},e}(Xt),Nw=1e5,Ew=314159,zw=.01;var Vw=function(){function t(t,e,n,i){this.type="canvas",this._zlevelList=[],this._prevDisplayList=[],this._layers={},this._layerConfig={},this._needsManuallyCompositing=!1,this.type="canvas";var r=!t.nodeName||"CANVAS"===t.nodeName.toUpperCase();this._opts=n=A({},n||{}),this.dpr=n.devicePixelRatio||Ai,this._singleCanvas=r,this.root=t,t.style&&(vt(t),t.innerHTML=""),this.storage=e;var o=this._zlevelList;this._prevDisplayList=[];var a=this._layers;if(r){var s=t,l=s.width,u=s.height;null!=n.width&&(l=n.width),null!=n.height&&(u=n.height),this.dpr=n.devicePixelRatio||1,s.width=l*this.dpr,s.height=u*this.dpr,this._width=l,this._height=u;var h=new Rw(s,this,this.dpr);h.__builtin__=!0,h.initContext(),a[314159]=h,h.zlevel=Ew,o.push(Ew),this._domRoot=t}else{this._width=Ny(t,0,n),this._height=Ny(t,1,n);var c=this._domRoot=function(t,e){var n=document.createElement("div");return n.style.cssText=["position:relative","width:"+t+"px","height:"+e+"px","padding:0","margin:0","border-width:0"].join(";")+";",n}(this._width,this._height);t.appendChild(c)}}return t.prototype.getType=function(){return"canvas"},t.prototype.isSingleCanvas=function(){return this._singleCanvas},t.prototype.getViewportRoot=function(){return this._domRoot},t.prototype.getViewportRootOffset=function(){var t=this.getViewportRoot();if(t)return{offsetLeft:t.offsetLeft||0,offsetTop:t.offsetTop||0}},t.prototype.refresh=function(t){var e=this.storage.getDisplayList(!0),n=this._prevDisplayList,i=this._zlevelList;this._redrawId=Math.random(),this._paintList(e,n,t,this._redrawId);for(var r=0;r<i.length;r++){var o=i[r],a=this._layers[o];if(!a.__builtin__&&a.refresh){var s=0===r?this._backgroundColor:null;a.refresh(s)}}return this._opts.useDirtyRect&&(this._prevDisplayList=e.slice()),this},t.prototype.refreshHover=function(){this._paintHoverList(this.storage.getDisplayList(!1))},t.prototype._paintHoverList=function(t){var e=t.length,n=this._hoverlayer;if(n&&n.clear(),e){for(var i,r={inHover:!0,viewWidth:this._width,viewHeight:this._height},o=0;o<e;o++){var a=t[o];a.__inHover&&(n||(n=this._hoverlayer=this.getLayer(Nw)),i||(i=n.ctx).save(),Jy(i,a,r,o===e-1))}i&&i.restore()}},t.prototype.getHoverLayer=function(){return this.getLayer(Nw)},t.prototype.paintOne=function(t,e){$y(t,e)},t.prototype._paintList=function(t,e,n,i){if(this._redrawId===i){n=n||!1,this._updateLayerStatus(t);var r=this._doPaintList(t,e,n),o=r.finished,a=r.needsRefreshHover;if(this._needsManuallyCompositing&&this._compositeManually(),a&&this._paintHoverList(t),o)this.eachLayer((function(t){t.afterBrush&&t.afterBrush()}));else{var s=this;ke((function(){s._paintList(t,e,n,i)}))}}},t.prototype._compositeManually=function(){var t=this.getLayer(Ew).ctx,e=this._domRoot.width,n=this._domRoot.height;t.clearRect(0,0,e,n),this.eachBuiltinLayer((function(i){i.virtual&&t.drawImage(i.dom,0,0,e,n)}))},t.prototype._doPaintList=function(t,e,n){for(var i=this,o=[],a=this._opts.useDirtyRect,s=0;s<this._zlevelList.length;s++){var l=this._zlevelList[s],u=this._layers[l];u.__builtin__&&u!==this._hoverlayer&&(u.__dirty||n)&&o.push(u)}for(var h=!0,c=!1,p=function(r){var s,l=o[r],u=l.ctx,p=a&&l.createRepaintRects(t,e,d._width,d._height),f=n?l.__startIndex:l.__drawIndex,g=!n&&l.incremental&&Date.now,y=g&&Date.now(),v=l.zlevel===d._zlevelList[0]?d._backgroundColor:null;if(l.__startIndex===l.__endIndex)l.clear(!1,v,p);else if(f===l.__startIndex){var m=t[f];m.incremental&&m.notClear&&!n||l.clear(!1,v,p)}-1===f&&(console.error("For some unknown reason. drawIndex is -1"),f=l.__startIndex);var x=function(e){var n={inHover:!1,allClipped:!1,prevEl:null,viewWidth:i._width,viewHeight:i._height};for(s=f;s<l.__endIndex;s++){var r=t[s];if(r.__inHover&&(c=!0),i._doPaintEl(r,l,a,e,n,s===l.__endIndex-1),g)if(Date.now()-y>15)break}n.prevElClipPaths&&u.restore()};if(p)if(0===p.length)s=l.__endIndex;else for(var _=d.dpr,b=0;b<p.length;++b){var w=p[b];u.save(),u.beginPath(),u.rect(w.x*_,w.y*_,w.width*_,w.height*_),u.clip(),x(w),u.restore()}else u.save(),x(),u.restore();l.__drawIndex=s,l.__drawIndex<l.__endIndex&&(h=!1)},d=this,f=0;f<o.length;f++)p(f);return r.wxa&&E(this._layers,(function(t){t&&t.ctx&&t.ctx.draw&&t.ctx.draw()})),{finished:h,needsRefreshHover:c}},t.prototype._doPaintEl=function(t,e,n,i,r,o){var a=e.ctx;if(n){var s=t.getPaintRect();(!i||s&&s.intersect(i))&&(Jy(a,t,r,o),t.setPrevPaintRect(s))}else Jy(a,t,r,o)},t.prototype.getLayer=function(t,e){this._singleCanvas&&!this._needsManuallyCompositing&&(t=Ew);var n=this._layers[t];return n||((n=new Rw("zr_"+t,this,this.dpr)).zlevel=t,n.__builtin__=!0,this._layerConfig[t]?C(n,this._layerConfig[t],!0):this._layerConfig[t-zw]&&C(n,this._layerConfig[t-zw],!0),e&&(n.virtual=e),this.insertLayer(t,n),n.initContext()),n},t.prototype.insertLayer=function(t,e){var n=this._layers,i=this._zlevelList,r=i.length,o=this._domRoot,a=null,s=-1;if(!n[t]&&function(t){return!!t&&(!!t.__builtin__||"function"==typeof t.resize&&"function"==typeof t.refresh)}(e)){if(r>0&&t>i[0]){for(s=0;s<r-1&&!(i[s]<t&&i[s+1]>t);s++);a=n[i[s]]}if(i.splice(s+1,0,t),n[t]=e,!e.virtual)if(a){var l=a.dom;l.nextSibling?o.insertBefore(e.dom,l.nextSibling):o.appendChild(e.dom)}else o.firstChild?o.insertBefore(e.dom,o.firstChild):o.appendChild(e.dom);e.__painter=this}},t.prototype.eachLayer=function(t,e){for(var n=this._zlevelList,i=0;i<n.length;i++){var r=n[i];t.call(e,this._layers[r],r)}},t.prototype.eachBuiltinLayer=function(t,e){for(var n=this._zlevelList,i=0;i<n.length;i++){var r=n[i],o=this._layers[r];o.__builtin__&&t.call(e,o,r)}},t.prototype.eachOtherLayer=function(t,e){for(var n=this._zlevelList,i=0;i<n.length;i++){var r=n[i],o=this._layers[r];o.__builtin__||t.call(e,o,r)}},t.prototype.getLayers=function(){return this._layers},t.prototype._updateLayerStatus=function(t){function e(t){o&&(o.__endIndex!==t&&(o.__dirty=!0),o.__endIndex=t)}if(this.eachBuiltinLayer((function(t,e){t.__dirty=t.__used=!1})),this._singleCanvas)for(var n=1;n<t.length;n++){if((s=t[n]).zlevel!==t[n-1].zlevel||s.incremental){this._needsManuallyCompositing=!0;break}}var i,r,o=null,a=0;for(r=0;r<t.length;r++){var s,l=(s=t[r]).zlevel,u=void 0;i!==l&&(i=l,a=0),s.incremental?((u=this.getLayer(l+.001,this._needsManuallyCompositing)).incremental=!0,a=1):u=this.getLayer(l+(a>0?zw:0),this._needsManuallyCompositing),u.__builtin__||I("ZLevel "+l+" has been used by unkown layer "+u.id),u!==o&&(u.__used=!0,u.__startIndex!==r&&(u.__dirty=!0),u.__startIndex=r,u.incremental?u.__drawIndex=-1:u.__drawIndex=r,e(r),o=u),1&s.__dirty&&!s.__inHover&&(u.__dirty=!0,u.incremental&&u.__drawIndex<0&&(u.__drawIndex=r))}e(r),this.eachBuiltinLayer((function(t,e){!t.__used&&t.getElementCount()>0&&(t.__dirty=!0,t.__startIndex=t.__endIndex=t.__drawIndex=0),t.__dirty&&t.__drawIndex<0&&(t.__drawIndex=t.__startIndex)}))},t.prototype.clear=function(){return this.eachBuiltinLayer(this._clearLayer),this},t.prototype._clearLayer=function(t){t.clear()},t.prototype.setBackgroundColor=function(t){this._backgroundColor=t,E(this._layers,(function(t){t.setUnpainted()}))},t.prototype.configLayer=function(t,e){if(e){var n=this._layerConfig;n[t]?C(n[t],e,!0):n[t]=e;for(var i=0;i<this._zlevelList.length;i++){var r=this._zlevelList[i];if(r===t||r===t+zw)C(this._layers[r],n[t],!0)}}},t.prototype.delLayer=function(t){var e=this._layers,n=this._zlevelList,i=e[t];i&&(i.dom.parentNode.removeChild(i.dom),delete e[t],n.splice(P(n,t),1))},t.prototype.resize=function(t,e){if(this._domRoot.style){var n=this._domRoot;n.style.display="none";var i=this._opts,r=this.root;if(null!=t&&(i.width=t),null!=e&&(i.height=e),t=Ny(r,0,i),e=Ny(r,1,i),n.style.display="",this._width!==t||e!==this._height){for(var o in n.style.width=t+"px",n.style.height=e+"px",this._layers)this._layers.hasOwnProperty(o)&&this._layers[o].resize(t,e);this.refresh(!0)}this._width=t,this._height=e}else{if(null==t||null==e)return;this._width=t,this._height=e,this.getLayer(Ew).resize(t,e)}return this},t.prototype.clearLayer=function(t){var e=this._layers[t];e&&e.clear()},t.prototype.dispose=function(){this.root.innerHTML="",this.root=this.storage=this._domRoot=this._layers=null},t.prototype.getRenderedCanvas=function(t){if(t=t||{},this._singleCanvas&&!this._compositeManually)return this._layers[314159].dom;var e=new Rw("image",this,t.pixelRatio||this.dpr);e.initContext(),e.clear(!1,t.backgroundColor||this._backgroundColor);var n=e.ctx;if(t.pixelRatio<=this.dpr){this.refresh();var i=e.dom.width,r=e.dom.height;this.eachLayer((function(t){t.__builtin__?n.drawImage(t.dom,0,0,i,r):t.renderToCanvas&&(n.save(),t.renderToCanvas(n),n.restore())}))}else for(var o={inHover:!1,viewWidth:this._width,viewHeight:this._height},a=this.storage.getDisplayList(!0),s=0,l=a.length;s<l;s++){var u=a[s];Jy(n,u,o,s===l-1)}return e.dom},t.prototype.getWidth=function(){return this._width},t.prototype.getHeight=function(){return this._height},t}();var Bw=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.hasSymbolVisual=!0,n}return n(e,t),e.prototype.getInitialData=function(t){return nx(null,this,{useEncodeDefaulter:!0})},e.prototype.getLegendIcon=function(t){var e=new Cr,n=ky("line",0,t.itemHeight/2,t.itemWidth,0,t.lineStyle.stroke,!1);e.add(n),n.setStyle(t.lineStyle);var i=this.getData().getVisual("symbol"),r=this.getData().getVisual("symbolRotate"),o="none"===i?"circle":i,a=.8*t.itemHeight,s=ky(o,(t.itemWidth-a)/2,(t.itemHeight-a)/2,a,a,t.itemStyle.fill);e.add(s),s.setStyle(t.itemStyle);var l="inherit"===t.iconRotate?r:t.iconRotate||0;return s.rotation=l*Math.PI/180,s.setOrigin([t.itemWidth/2,t.itemHeight/2]),o.indexOf("empty")>-1&&(s.style.stroke=s.style.fill,s.style.fill="#fff",s.style.lineWidth=2),e},e.type="series.line",e.dependencies=["grid","polar"],e.defaultOption={z:3,coordinateSystem:"cartesian2d",legendHoverLink:!0,clip:!0,label:{position:"top"},endLabel:{show:!1,valueAnimation:!0,distance:8},lineStyle:{width:2,type:"solid"},emphasis:{scale:!0},step:!1,smooth:!1,smoothMonotone:null,symbol:"emptyCircle",symbolSize:4,symbolRotate:null,showSymbol:!0,showAllSymbol:"auto",connectNulls:!1,sampling:"none",animationEasing:"linear",progressive:0,hoverLayerThreshold:1/0,universalTransition:{divideShape:"clone"},triggerLineEvent:!1},e}(ag);function Fw(t,e){var n=t.mapDimensionsAll("defaultedLabel"),i=n.length;if(1===i){var r=of(t,e,n[0]);return null!=r?r+"":null}if(i){for(var o=[],a=0;a<n.length;a++)o.push(of(t,e,n[a]));return o.join(" ")}}function Gw(t,e){var n=t.mapDimensionsAll("defaultedLabel");if(!Y(e))return e+"";for(var i=[],r=0;r<n.length;r++){var o=t.getDimensionIndex(n[r]);o>=0&&i.push(e[o])}return i.join(" ")}var Ww=function(t){function e(e,n,i,r){var o=t.call(this)||this;return o.updateData(e,n,i,r),o}return n(e,t),e.prototype._createSymbol=function(t,e,n,i,r){this.removeAll();var o=ky(t,-1,-1,2,2,null,r);o.attr({z2:100,culling:!0,scaleX:i[0]/2,scaleY:i[1]/2}),o.drift=Hw,this._symbolType=t,this.add(o)},e.prototype.stopSymbolAnimation=function(t){this.childAt(0).stopAnimation(null,t)},e.prototype.getSymbolType=function(){return this._symbolType},e.prototype.getSymbolPath=function(){return this.childAt(0)},e.prototype.highlight=function(){xl(this.childAt(0))},e.prototype.downplay=function(){_l(this.childAt(0))},e.prototype.setZ=function(t,e){var n=this.childAt(0);n.zlevel=t,n.z=e},e.prototype.setDraggable=function(t){var e=this.childAt(0);e.draggable=t,e.cursor=t?"move":e.cursor},e.prototype.updateData=function(t,n,i,r){this.silent=!1;var o=t.getItemVisual(n,"symbol")||"circle",a=t.hostModel,s=e.getSymbolSize(t,n),l=o!==this._symbolType,u=r&&r.disableAnimation;if(l){var h=t.getItemVisual(n,"symbolKeepAspect");this._createSymbol(o,t,n,s,h)}else{(p=this.childAt(0)).silent=!1;var c={scaleX:s[0]/2,scaleY:s[1]/2};u?p.attr(c):ih(p,c,a,n),uh(p)}if(this._updateCommon(t,n,s,i,r),l){var p=this.childAt(0);if(!u){c={scaleX:this._sizeX,scaleY:this._sizeY,style:{opacity:p.style.opacity}};p.scaleX=p.scaleY=0,p.style.opacity=0,rh(p,c,a,n)}}u&&this.childAt(0).stopAnimation("leave"),this._seriesModel=a},e.prototype._updateCommon=function(t,e,n,i,r){var o,a,s,l,u,h,c,p,d,f=this.childAt(0),g=t.hostModel;if(i&&(o=i.emphasisItemStyle,a=i.blurItemStyle,s=i.selectItemStyle,l=i.focus,u=i.blurScope,c=i.labelStatesModels,p=i.hoverScale,d=i.cursorStyle,h=i.emphasisDisabled),!i||t.hasItemOption){var y=i&&i.itemModel?i.itemModel:t.getItemModel(e),v=y.getModel("emphasis");o=v.getModel("itemStyle").getItemStyle(),s=y.getModel(["select","itemStyle"]).getItemStyle(),a=y.getModel(["blur","itemStyle"]).getItemStyle(),l=v.get("focus"),u=v.get("blurScope"),h=v.get("disabled"),c=Hh(y),p=v.getShallow("scale"),d=y.getShallow("cursor")}var m=t.getItemVisual(e,"symbolRotate");f.attr("rotation",(m||0)*Math.PI/180||0);var x=Py(t.getItemVisual(e,"symbolOffset"),n);x&&(f.x=x[0],f.y=x[1]),d&&f.attr("cursor",d);var _=t.getItemVisual(e,"style"),b=_.fill;if(f instanceof xs){var w=f.style;f.useStyle(A({image:w.image,x:w.x,y:w.y,width:w.width,height:w.height},_))}else f.__isEmptyBrush?f.useStyle(A({},_)):f.useStyle(_),f.style.decal=null,f.setColor(b,r&&r.symbolInnerColor),f.style.strokeNoScale=!0;var S=t.getItemVisual(e,"liftZ"),M=this._z2;null!=S?null==M&&(this._z2=f.z2,f.z2+=S):null!=M&&(f.z2=M,this._z2=null);var I=r&&r.useNameLabel;Wh(f,c,{labelFetcher:g,labelDataIndex:e,defaultText:function(e){return I?t.getName(e):Fw(t,e)},inheritColor:b,defaultOpacity:_.opacity}),this._sizeX=n[0]/2,this._sizeY=n[1]/2;var T=f.ensureState("emphasis");if(T.style=o,f.ensureState("select").style=s,f.ensureState("blur").style=a,p){var C=Math.max(1.1,3/this._sizeY);T.scaleX=this._sizeX*C,T.scaleY=this._sizeY*C}this.setSymbolScale(1),Ol(this,l,u,h)},e.prototype.setSymbolScale=function(t){this.scaleX=this.scaleY=t},e.prototype.fadeOut=function(t,e){var n=this.childAt(0),i=this._seriesModel,r=Ws(this).dataIndex,o=e&&e.animation;if(this.silent=n.silent=!0,e&&e.fadeLabel){var a=n.getTextContent();a&&ah(a,{style:{opacity:0}},i,{dataIndex:r,removeOpt:o,cb:function(){n.removeTextContent()}})}else n.removeTextContent();ah(n,{style:{opacity:0},scaleX:0,scaleY:0},i,{dataIndex:r,cb:t,removeOpt:o})},e.getSymbolSize=function(t,e){return Ly(t.getItemVisual(e,"symbolSize"))},e}(Cr);function Hw(t,e){this.parent.drift(t,e)}function Yw(t,e,n,i){return e&&!isNaN(e[0])&&!isNaN(e[1])&&!(i.isIgnore&&i.isIgnore(n))&&!(i.clipShape&&!i.clipShape.contain(e[0],e[1]))&&"none"!==t.getItemVisual(n,"symbol")}function Uw(t){return null==t||q(t)||(t={isIgnore:t}),t||{}}function Xw(t){var e=t.hostModel,n=e.getModel("emphasis");return{emphasisItemStyle:n.getModel("itemStyle").getItemStyle(),blurItemStyle:e.getModel(["blur","itemStyle"]).getItemStyle(),selectItemStyle:e.getModel(["select","itemStyle"]).getItemStyle(),focus:n.get("focus"),blurScope:n.get("blurScope"),emphasisDisabled:n.get("disabled"),hoverScale:n.get("scale"),labelStatesModels:Hh(e),cursorStyle:e.get("cursor")}}var Zw=function(){function t(t){this.group=new Cr,this._SymbolCtor=t||Ww}return t.prototype.updateData=function(t,e){this._progressiveEls=null,e=Uw(e);var n=this.group,i=t.hostModel,r=this._data,o=this._SymbolCtor,a=e.disableAnimation,s=Xw(t),l={disableAnimation:a},u=e.getSymbolPoint||function(e){return t.getItemLayout(e)};r||n.removeAll(),t.diff(r).add((function(i){var r=u(i);if(Yw(t,r,i,e)){var a=new o(t,i,s,l);a.setPosition(r),t.setItemGraphicEl(i,a),n.add(a)}})).update((function(h,c){var p=r.getItemGraphicEl(c),d=u(h);if(Yw(t,d,h,e)){var f=t.getItemVisual(h,"symbol")||"circle",g=p&&p.getSymbolType&&p.getSymbolType();if(!p||g&&g!==f)n.remove(p),(p=new o(t,h,s,l)).setPosition(d);else{p.updateData(t,h,s,l);var y={x:d[0],y:d[1]};a?p.attr(y):ih(p,y,i)}n.add(p),t.setItemGraphicEl(h,p)}else n.remove(p)})).remove((function(t){var e=r.getItemGraphicEl(t);e&&e.fadeOut((function(){n.remove(e)}))})).execute(),this._getSymbolPoint=u,this._data=t},t.prototype.updateLayout=function(){var t=this,e=this._data;e&&e.eachItemGraphicEl((function(e,n){var i=t._getSymbolPoint(n);e.setPosition(i),e.markRedraw()}))},t.prototype.incrementalPrepareUpdate=function(t){this._seriesScope=Xw(t),this._data=null,this.group.removeAll()},t.prototype.incrementalUpdate=function(t,e,n){function i(t){t.isGroup||(t.incremental=!0,t.ensureState("emphasis").hoverLayer=!0)}this._progressiveEls=[],n=Uw(n);for(var r=t.start;r<t.end;r++){var o=e.getItemLayout(r);if(Yw(e,o,r,n)){var a=new this._SymbolCtor(e,r,this._seriesScope);a.traverse(i),a.setPosition(o),this.group.add(a),e.setItemGraphicEl(r,a),this._progressiveEls.push(a)}}},t.prototype.eachRendered=function(t){zh(this._progressiveEls||this.group,t)},t.prototype.remove=function(t){var e=this.group,n=this._data;n&&t?n.eachItemGraphicEl((function(t){t.fadeOut((function(){e.remove(t)}))})):e.removeAll()},t}();function jw(t,e,n){var i=t.getBaseAxis(),r=t.getOtherAxis(i),o=function(t,e){var n=0,i=t.scale.getExtent();"start"===e?n=i[0]:"end"===e?n=i[1]:i[0]>0?n=i[0]:i[1]<0&&(n=i[1]);return n}(r,n),a=i.dim,s=r.dim,l=e.mapDimension(s),u=e.mapDimension(a),h="x"===s||"radius"===s?1:0,c=z(t.dimensions,(function(t){return e.mapDimension(t)})),p=!1,d=e.getCalculationInfo("stackResultDimension");return tx(e,c[0])&&(p=!0,c[0]=d),tx(e,c[1])&&(p=!0,c[1]=d),{dataDimsForPoint:c,valueStart:o,valueAxisDim:s,baseAxisDim:a,stacked:!!p,valueDim:l,baseDim:u,baseDataOffset:h,stackedOverDimension:e.getCalculationInfo("stackedOverDimension")}}function qw(t,e,n,i){var r=NaN;t.stacked&&(r=n.get(n.getCalculationInfo("stackedOverDimension"),i)),isNaN(r)&&(r=t.valueStart);var o=t.baseDataOffset,a=[];return a[o]=n.get(t.baseDim,i),a[1-o]=r,e.dataToPoint(a)}var Kw=Math.min,$w=Math.max;function Jw(t,e){return isNaN(t)||isNaN(e)}function Qw(t,e,n,i,r,o,a,s,l){for(var u,h,c,p,d,f,g=n,y=0;y<i;y++){var v=e[2*g],m=e[2*g+1];if(g>=r||g<0)break;if(Jw(v,m)){if(l){g+=o;continue}break}if(g===n)t[o>0?"moveTo":"lineTo"](v,m),c=v,p=m;else{var x=v-u,_=m-h;if(x*x+_*_<.5){g+=o;continue}if(a>0){for(var b=g+o,w=e[2*b],S=e[2*b+1];w===v&&S===m&&y<i;)y++,g+=o,w=e[2*(b+=o)],S=e[2*b+1],x=(v=e[2*g])-u,_=(m=e[2*g+1])-h;var M=y+1;if(l)for(;Jw(w,S)&&M<i;)M++,w=e[2*(b+=o)],S=e[2*b+1];var I=.5,T=0,C=0,D=void 0,A=void 0;if(M>=i||Jw(w,S))d=v,f=m;else{T=w-u,C=S-h;var k=v-u,L=w-v,P=m-h,O=S-m,R=void 0,N=void 0;if("x"===s){var E=T>0?1:-1;d=v-E*(R=Math.abs(k))*a,f=m,D=v+E*(N=Math.abs(L))*a,A=m}else if("y"===s){var z=C>0?1:-1;d=v,f=m-z*(R=Math.abs(P))*a,D=v,A=m+z*(N=Math.abs(O))*a}else R=Math.sqrt(k*k+P*P),d=v-T*a*(1-(I=(N=Math.sqrt(L*L+O*O))/(N+R))),f=m-C*a*(1-I),A=m+C*a*I,D=Kw(D=v+T*a*I,$w(w,v)),A=Kw(A,$w(S,m)),D=$w(D,Kw(w,v)),f=m-(C=(A=$w(A,Kw(S,m)))-m)*R/N,d=Kw(d=v-(T=D-v)*R/N,$w(u,v)),f=Kw(f,$w(h,m)),D=v+(T=v-(d=$w(d,Kw(u,v))))*N/R,A=m+(C=m-(f=$w(f,Kw(h,m))))*N/R}t.bezierCurveTo(c,p,d,f,v,m),c=D,p=A}else t.lineTo(v,m)}u=v,h=m,g+=o}return y}var tS=function(){this.smooth=0,this.smoothConstraint=!0},eS=function(t){function e(e){var n=t.call(this,e)||this;return n.type="ec-polyline",n}return n(e,t),e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new tS},e.prototype.buildPath=function(t,e){var n=e.points,i=0,r=n.length/2;if(e.connectNulls){for(;r>0&&Jw(n[2*r-2],n[2*r-1]);r--);for(;i<r&&Jw(n[2*i],n[2*i+1]);i++);}for(;i<r;)i+=Qw(t,n,i,r,r,1,e.smooth,e.smoothMonotone,e.connectNulls)+1},e.prototype.getPointOn=function(t,e){this.path||(this.createPathProxy(),this.buildPath(this.path,this.shape));for(var n,i,r=this.path.data,o=ja.CMD,a="x"===e,s=[],l=0;l<r.length;){var u=void 0,h=void 0,c=void 0,p=void 0,d=void 0,f=void 0,g=void 0;switch(r[l++]){case o.M:n=r[l++],i=r[l++];break;case o.L:if(u=r[l++],h=r[l++],(g=a?(t-n)/(u-n):(t-i)/(h-i))<=1&&g>=0){var y=a?(h-i)*g+i:(u-n)*g+n;return a?[t,y]:[y,t]}n=u,i=h;break;case o.C:u=r[l++],h=r[l++],c=r[l++],p=r[l++],d=r[l++],f=r[l++];var v=a?Ue(n,u,c,d,t,s):Ue(i,h,p,f,t,s);if(v>0)for(var m=0;m<v;m++){var x=s[m];if(x<=1&&x>=0){y=a?He(i,h,p,f,x):He(n,u,c,d,x);return a?[t,y]:[y,t]}}n=d,i=f}}},e}(fs),nS=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e}(tS),iS=function(t){function e(e){var n=t.call(this,e)||this;return n.type="ec-polygon",n}return n(e,t),e.prototype.getDefaultShape=function(){return new nS},e.prototype.buildPath=function(t,e){var n=e.points,i=e.stackedOnPoints,r=0,o=n.length/2,a=e.smoothMonotone;if(e.connectNulls){for(;o>0&&Jw(n[2*o-2],n[2*o-1]);o--);for(;r<o&&Jw(n[2*r],n[2*r+1]);r++);}for(;r<o;){var s=Qw(t,n,r,o,o,1,e.smooth,a,e.connectNulls);Qw(t,i,r+s-1,s,o,-1,e.stackedOnSmooth,a,e.connectNulls),r+=s+1,t.closePath()}},e}(fs);function rS(t,e,n,i,r){var o=t.getArea(),a=o.x,s=o.y,l=o.width,u=o.height,h=n.get(["lineStyle","width"])||2;a-=h/2,s-=h/2,l+=h,u+=h,a=Math.floor(a),l=Math.round(l);var c=new Ts({shape:{x:a,y:s,width:l,height:u}});if(e){var p=t.getBaseAxis(),d=p.isHorizontal(),f=p.inverse;d?(f&&(c.shape.x+=l),c.shape.width=0):(f||(c.shape.y+=u),c.shape.height=0);var g=U(r)?function(t){r(t,c)}:null;rh(c,{shape:{width:l,height:u,x:a,y:s}},n,null,i,g)}return c}function oS(t,e,n){var i=t.getArea(),r=zr(i.r0,1),o=zr(i.r,1),a=new Tu({shape:{cx:zr(t.cx,1),cy:zr(t.cy,1),r0:r,r:o,startAngle:i.startAngle,endAngle:i.endAngle,clockwise:i.clockwise}});e&&("angle"===t.getBaseAxis().dim?a.shape.endAngle=i.startAngle:a.shape.r=r,rh(a,{shape:{endAngle:i.endAngle,r:o}},n));return a}function aS(t,e,n,i,r){return t?"polar"===t.type?oS(t,e,n):"cartesian2d"===t.type?rS(t,e,n,i,r):null:null}function sS(t,e){return t.type===e}function lS(t,e){if(t.length===e.length){for(var n=0;n<t.length;n++)if(t[n]!==e[n])return;return!0}}function uS(t){for(var e=1/0,n=1/0,i=-1/0,r=-1/0,o=0;o<t.length;){var a=t[o++],s=t[o++];isNaN(a)||(e=Math.min(a,e),i=Math.max(a,i)),isNaN(s)||(n=Math.min(s,n),r=Math.max(s,r))}return[[e,n],[i,r]]}function hS(t,e){var n=uS(t),i=n[0],r=n[1],o=uS(e),a=o[0],s=o[1];return Math.max(Math.abs(i[0]-a[0]),Math.abs(i[1]-a[1]),Math.abs(r[0]-s[0]),Math.abs(r[1]-s[1]))}function cS(t){return j(t)?t:t?.5:0}function pS(t,e,n){for(var i=e.getBaseAxis(),r="x"===i.dim||"radius"===i.dim?0:1,o=[],a=0,s=[],l=[],u=[];a<t.length-2;a+=2)switch(u[0]=t[a+2],u[1]=t[a+3],l[0]=t[a],l[1]=t[a+1],o.push(l[0],l[1]),n){case"end":s[r]=u[r],s[1-r]=l[1-r],o.push(s[0],s[1]);break;case"middle":var h=(l[r]+u[r])/2,c=[];s[r]=c[r]=h,s[1-r]=l[1-r],c[1-r]=u[1-r],o.push(s[0],s[1]),o.push(c[0],c[1]);break;default:s[r]=l[r],s[1-r]=u[1-r],o.push(s[0],s[1])}return o.push(t[a++],t[a++]),o}function dS(t,e,n){var i=t.getVisual("visualMeta");if(i&&i.length&&t.count()&&"cartesian2d"===e.type){for(var r,o,a=i.length-1;a>=0;a--){var s=t.getDimensionInfo(i[a].dimension);if("x"===(r=s&&s.coordDim)||"y"===r){o=i[a];break}}if(o){var l=e.getAxis(r),u=z(o.stops,(function(t){return{coord:l.toGlobalCoord(l.dataToCoord(t.value)),color:t.color}})),h=u.length,c=o.outerColors.slice();h&&u[0].coord>u[h-1].coord&&(u.reverse(),c.reverse());var p=function(t,e){var n,i,r=[],o=t.length;function a(t,e,n){var i=t.coord;return{coord:n,color:Tn((n-i)/(e.coord-i),[t.color,e.color])}}for(var s=0;s<o;s++){var l=t[s],u=l.coord;if(u<0)n=l;else{if(u>e){i?r.push(a(i,l,e)):n&&r.push(a(n,l,0),a(n,l,e));break}n&&(r.push(a(n,l,0)),n=null),r.push(l),i=l}}return r}(u,"x"===r?n.getWidth():n.getHeight()),d=p.length;if(!d&&h)return u[0].coord<0?c[1]?c[1]:u[h-1].color:c[0]?c[0]:u[0].color;var f=p[0].coord-10,g=p[d-1].coord+10,y=g-f;if(y<.001)return"transparent";E(p,(function(t){t.offset=(t.coord-f)/y})),p.push({offset:d?p[d-1].offset:.5,color:c[1]||"transparent"}),p.unshift({offset:d?p[0].offset:.5,color:c[0]||"transparent"});var v=new Uu(0,0,0,0,p,!0);return v[r]=f,v[r+"2"]=g,v}}}function fS(t,e,n){var i=t.get("showAllSymbol"),r="auto"===i;if(!i||r){var o=n.getAxesByScale("ordinal")[0];if(o&&(!r||!function(t,e){var n=t.getExtent(),i=Math.abs(n[1]-n[0])/t.scale.count();isNaN(i)&&(i=0);for(var r=e.count(),o=Math.max(1,Math.round(r/5)),a=0;a<r;a+=o)if(1.5*Ww.getSymbolSize(e,a)[t.isHorizontal()?1:0]>i)return!1;return!0}(o,e))){var a=e.mapDimension(o.dim),s={};return E(o.getViewLabels(),(function(t){var e=o.scale.getRawOrdinalNumber(t.tickValue);s[e]=1})),function(t){return!s.hasOwnProperty(e.get(a,t))}}}}function gS(t,e){return[t[2*e],t[2*e+1]]}function yS(t){if(t.get(["endLabel","show"]))return!0;for(var e=0;e<js.length;e++)if(t.get([js[e],"endLabel","show"]))return!0;return!1}function vS(t,e,n,i){if(sS(e,"cartesian2d")){var r=i.getModel("endLabel"),o=r.get("valueAnimation"),a=i.getData(),s={lastFrameIndex:0},l=yS(i)?function(n,i){t._endLabelOnDuring(n,i,a,s,o,r,e)}:null,u=e.getBaseAxis().isHorizontal(),h=rS(e,n,i,(function(){var e=t._endLabel;e&&n&&null!=s.originalX&&e.attr({x:s.originalX,y:s.originalY})}),l);if(!i.get("clip",!0)){var c=h.shape,p=Math.max(c.width,c.height);u?(c.y-=p,c.height+=2*p):(c.x-=p,c.width+=2*p)}return l&&l(1,h),h}return oS(e,n,i)}var mS=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.init=function(){var t=new Cr,e=new Zw;this.group.add(e.group),this._symbolDraw=e,this._lineGroup=t},e.prototype.render=function(t,e,n){var i=this,r=t.coordinateSystem,o=this.group,a=t.getData(),s=t.getModel("lineStyle"),l=t.getModel("areaStyle"),u=a.getLayout("points")||[],h="polar"===r.type,c=this._coordSys,p=this._symbolDraw,d=this._polyline,f=this._polygon,g=this._lineGroup,y=t.get("animation"),v=!l.isEmpty(),m=l.get("origin"),x=jw(r,a,m),_=v&&function(t,e,n){if(!n.valueDim)return[];for(var i=e.count(),r=_x(2*i),o=0;o<i;o++){var a=qw(n,t,e,o);r[2*o]=a[0],r[2*o+1]=a[1]}return r}(r,a,x),b=t.get("showSymbol"),w=b&&!h&&fS(t,a,r),S=this._data;S&&S.eachItemGraphicEl((function(t,e){t.__temp&&(o.remove(t),S.setItemGraphicEl(e,null))})),b||p.remove(),o.add(g);var M,I=!h&&t.get("step");r&&r.getArea&&t.get("clip",!0)&&(null!=(M=r.getArea()).width?(M.x-=.1,M.y-=.1,M.width+=.2,M.height+=.2):M.r0&&(M.r0-=.5,M.r+=.5)),this._clipShapeForSymbol=M;var T=dS(a,r,n)||a.getVisual("style")[a.getVisual("drawType")];if(d&&c.type===r.type&&I===this._step){v&&!f?f=this._newPolygon(u,_):f&&!v&&(g.remove(f),f=this._polygon=null),h||this._initOrUpdateEndLabel(t,r,cp(T));var C=g.getClipPath();if(C)rh(C,{shape:vS(this,r,!1,t).shape},t);else g.setClipPath(vS(this,r,!0,t));b&&p.updateData(a,{isIgnore:w,clipShape:M,disableAnimation:!0,getSymbolPoint:function(t){return[u[2*t],u[2*t+1]]}}),lS(this._stackedOnPoints,_)&&lS(this._points,u)||(y?this._doUpdateAnimation(a,_,r,n,I,m):(I&&(u=pS(u,r,I),_&&(_=pS(_,r,I))),d.setShape({points:u}),f&&f.setShape({points:u,stackedOnPoints:_})))}else b&&p.updateData(a,{isIgnore:w,clipShape:M,disableAnimation:!0,getSymbolPoint:function(t){return[u[2*t],u[2*t+1]]}}),y&&this._initSymbolLabelAnimation(a,r,M),I&&(u=pS(u,r,I),_&&(_=pS(_,r,I))),d=this._newPolyline(u),v&&(f=this._newPolygon(u,_)),h||this._initOrUpdateEndLabel(t,r,cp(T)),g.setClipPath(vS(this,r,!0,t));var D=t.getModel("emphasis"),A=D.get("focus"),L=D.get("blurScope"),P=D.get("disabled");(d.useStyle(k(s.getLineStyle(),{fill:"none",stroke:T,lineJoin:"bevel"})),zl(d,t,"lineStyle"),d.style.lineWidth>0&&"bolder"===t.get(["emphasis","lineStyle","width"]))&&(d.getState("emphasis").style.lineWidth=+d.style.lineWidth+1);Ws(d).seriesIndex=t.seriesIndex,Ol(d,A,L,P);var O=cS(t.get("smooth")),R=t.get("smoothMonotone"),N=t.get("connectNulls");if(d.setShape({smooth:O,smoothMonotone:R,connectNulls:N}),f){var E=a.getCalculationInfo("stackedOnSeries"),z=0;f.useStyle(k(l.getAreaStyle(),{fill:T,opacity:.7,lineJoin:"bevel",decal:a.getVisual("style").decal})),E&&(z=cS(E.get("smooth"))),f.setShape({smooth:O,stackedOnSmooth:z,smoothMonotone:R,connectNulls:N}),zl(f,t,"areaStyle"),Ws(f).seriesIndex=t.seriesIndex,Ol(f,A,L,P)}var V=function(t){i._changePolyState(t)};a.eachItemGraphicEl((function(t){t&&(t.onHoverStateChange=V)})),this._polyline.onHoverStateChange=V,this._data=a,this._coordSys=r,this._stackedOnPoints=_,this._points=u,this._step=I,this._valueOrigin=m,t.get("triggerLineEvent")&&(this.packEventData(t,d),f&&this.packEventData(t,f))},e.prototype.packEventData=function(t,e){Ws(e).eventData={componentType:"series",componentSubType:"line",componentIndex:t.componentIndex,seriesIndex:t.seriesIndex,seriesName:t.name,seriesType:"line"}},e.prototype.highlight=function(t,e,n,i){var r=t.getData(),o=wo(r,i);if(this._changePolyState("emphasis"),!(o instanceof Array)&&null!=o&&o>=0){var a=r.getLayout("points"),s=r.getItemGraphicEl(o);if(!s){var l=a[2*o],u=a[2*o+1];if(isNaN(l)||isNaN(u))return;if(this._clipShapeForSymbol&&!this._clipShapeForSymbol.contain(l,u))return;var h=t.get("zlevel"),c=t.get("z");(s=new Ww(r,o)).x=l,s.y=u,s.setZ(h,c);var p=s.getSymbolPath().getTextContent();p&&(p.zlevel=h,p.z=c,p.z2=this._polyline.z2+1),s.__temp=!0,r.setItemGraphicEl(o,s),s.stopSymbolAnimation(!0),this.group.add(s)}s.highlight()}else mg.prototype.highlight.call(this,t,e,n,i)},e.prototype.downplay=function(t,e,n,i){var r=t.getData(),o=wo(r,i);if(this._changePolyState("normal"),null!=o&&o>=0){var a=r.getItemGraphicEl(o);a&&(a.__temp?(r.setItemGraphicEl(o,null),this.group.remove(a)):a.downplay())}else mg.prototype.downplay.call(this,t,e,n,i)},e.prototype._changePolyState=function(t){var e=this._polygon;fl(this._polyline,t),e&&fl(e,t)},e.prototype._newPolyline=function(t){var e=this._polyline;return e&&this._lineGroup.remove(e),e=new eS({shape:{points:t},segmentIgnoreThreshold:2,z2:10}),this._lineGroup.add(e),this._polyline=e,e},e.prototype._newPolygon=function(t,e){var n=this._polygon;return n&&this._lineGroup.remove(n),n=new iS({shape:{points:t,stackedOnPoints:e},segmentIgnoreThreshold:2}),this._lineGroup.add(n),this._polygon=n,n},e.prototype._initSymbolLabelAnimation=function(t,e,n){var i,r,o=e.getBaseAxis(),a=o.inverse;"cartesian2d"===e.type?(i=o.isHorizontal(),r=!1):"polar"===e.type&&(i="angle"===o.dim,r=!0);var s=t.hostModel,l=s.get("animationDuration");U(l)&&(l=l(null));var u=s.get("animationDelay")||0,h=U(u)?u(null):u;t.eachItemGraphicEl((function(t,o){var s=t;if(s){var c=[t.x,t.y],p=void 0,d=void 0,f=void 0;if(n)if(r){var g=n,y=e.pointToCoord(c);i?(p=g.startAngle,d=g.endAngle,f=-y[1]/180*Math.PI):(p=g.r0,d=g.r,f=y[0])}else{var v=n;i?(p=v.x,d=v.x+v.width,f=t.x):(p=v.y+v.height,d=v.y,f=t.y)}var m=d===p?0:(f-p)/(d-p);a&&(m=1-m);var x=U(u)?u(o):l*m+h,_=s.getSymbolPath(),b=_.getTextContent();s.attr({scaleX:0,scaleY:0}),s.animateTo({scaleX:1,scaleY:1},{duration:200,setToFinal:!0,delay:x}),b&&b.animateFrom({style:{opacity:0}},{duration:300,delay:x}),_.disableLabelAnimation=!0}}))},e.prototype._initOrUpdateEndLabel=function(t,e,n){var i=t.getModel("endLabel");if(yS(t)){var r=t.getData(),o=this._polyline,a=r.getLayout("points");if(!a)return o.removeTextContent(),void(this._endLabel=null);var s=this._endLabel;s||((s=this._endLabel=new As({z2:200})).ignoreClip=!0,o.setTextContent(this._endLabel),o.disableLabelAnimation=!0);var l=function(t){for(var e,n,i=t.length/2;i>0&&(e=t[2*i-2],n=t[2*i-1],isNaN(e)||isNaN(n));i--);return i-1}(a);l>=0&&(Wh(o,Hh(t,"endLabel"),{inheritColor:n,labelFetcher:t,labelDataIndex:l,defaultText:function(t,e,n){return null!=n?Gw(r,n):Fw(r,t)},enableTextSetter:!0},function(t,e){var n=e.getBaseAxis(),i=n.isHorizontal(),r=n.inverse,o=i?r?"right":"left":"center",a=i?"middle":r?"top":"bottom";return{normal:{align:t.get("align")||o,verticalAlign:t.get("verticalAlign")||a}}}(i,e)),o.textConfig.position=null)}else this._endLabel&&(this._polyline.removeTextContent(),this._endLabel=null)},e.prototype._endLabelOnDuring=function(t,e,n,i,r,o,a){var s=this._endLabel,l=this._polyline;if(s){t<1&&null==i.originalX&&(i.originalX=s.x,i.originalY=s.y);var u=n.getLayout("points"),h=n.hostModel,c=h.get("connectNulls"),p=o.get("precision"),d=o.get("distance")||0,f=a.getBaseAxis(),g=f.isHorizontal(),y=f.inverse,v=e.shape,m=y?g?v.x:v.y+v.height:g?v.x+v.width:v.y,x=(g?d:0)*(y?-1:1),_=(g?0:-d)*(y?-1:1),b=g?"x":"y",w=function(t,e,n){for(var i,r,o=t.length/2,a="x"===n?0:1,s=0,l=-1,u=0;u<o;u++)if(r=t[2*u+a],!isNaN(r)&&!isNaN(t[2*u+1-a]))if(0!==u){if(i<=e&&r>=e||i>=e&&r<=e){l=u;break}s=u,i=r}else i=r;return{range:[s,l],t:(e-i)/(r-i)}}(u,m,b),S=w.range,M=S[1]-S[0],I=void 0;if(M>=1){if(M>1&&!c){var T=gS(u,S[0]);s.attr({x:T[0]+x,y:T[1]+_}),r&&(I=h.getRawValue(S[0]))}else{(T=l.getPointOn(m,b))&&s.attr({x:T[0]+x,y:T[1]+_});var C=h.getRawValue(S[0]),D=h.getRawValue(S[1]);r&&(I=Po(n,p,C,D,w.t))}i.lastFrameIndex=S[0]}else{var A=1===t||i.lastFrameIndex>0?S[0]:0;T=gS(u,A);r&&(I=h.getRawValue(A)),s.attr({x:T[0]+x,y:T[1]+_})}r&&$h(s).setLabelText(I)}},e.prototype._doUpdateAnimation=function(t,e,n,i,r,o){var a=this._polyline,s=this._polygon,l=t.hostModel,u=function(t,e,n,i,r,o,a,s){for(var l=function(t,e){var n=[];return e.diff(t).add((function(t){n.push({cmd:"+",idx:t})})).update((function(t,e){n.push({cmd:"=",idx:e,idx1:t})})).remove((function(t){n.push({cmd:"-",idx:t})})).execute(),n}(t,e),u=[],h=[],c=[],p=[],d=[],f=[],g=[],y=jw(r,e,a),v=t.getLayout("points")||[],m=e.getLayout("points")||[],x=0;x<l.length;x++){var _=l[x],b=!0,w=void 0,S=void 0;switch(_.cmd){case"=":w=2*_.idx,S=2*_.idx1;var M=v[w],I=v[w+1],T=m[S],C=m[S+1];(isNaN(M)||isNaN(I))&&(M=T,I=C),u.push(M,I),h.push(T,C),c.push(n[w],n[w+1]),p.push(i[S],i[S+1]),g.push(e.getRawIndex(_.idx1));break;case"+":var D=_.idx,A=y.dataDimsForPoint,k=r.dataToPoint([e.get(A[0],D),e.get(A[1],D)]);S=2*D,u.push(k[0],k[1]),h.push(m[S],m[S+1]);var L=qw(y,r,e,D);c.push(L[0],L[1]),p.push(i[S],i[S+1]),g.push(e.getRawIndex(D));break;case"-":b=!1}b&&(d.push(_),f.push(f.length))}f.sort((function(t,e){return g[t]-g[e]}));var P=u.length,O=_x(P),R=_x(P),N=_x(P),E=_x(P),z=[];for(x=0;x<f.length;x++){var V=f[x],B=2*x,F=2*V;O[B]=u[F],O[B+1]=u[F+1],R[B]=h[F],R[B+1]=h[F+1],N[B]=c[F],N[B+1]=c[F+1],E[B]=p[F],E[B+1]=p[F+1],z[x]=d[V]}return{current:O,next:R,stackedOnCurrent:N,stackedOnNext:E,status:z}}(this._data,t,this._stackedOnPoints,e,this._coordSys,0,this._valueOrigin),h=u.current,c=u.stackedOnCurrent,p=u.next,d=u.stackedOnNext;if(r&&(h=pS(u.current,n,r),c=pS(u.stackedOnCurrent,n,r),p=pS(u.next,n,r),d=pS(u.stackedOnNext,n,r)),hS(h,p)>3e3||s&&hS(c,d)>3e3)return a.stopAnimation(),a.setShape({points:p}),void(s&&(s.stopAnimation(),s.setShape({points:p,stackedOnPoints:d})));a.shape.__points=u.current,a.shape.points=h;var f={shape:{points:p}};u.current!==h&&(f.shape.__points=u.next),a.stopAnimation(),ih(a,f,l),s&&(s.setShape({points:h,stackedOnPoints:c}),s.stopAnimation(),ih(s,{shape:{stackedOnPoints:d}},l),a.shape.points!==s.shape.points&&(s.shape.points=a.shape.points));for(var g=[],y=u.status,v=0;v<y.length;v++){if("="===y[v].cmd){var m=t.getItemGraphicEl(y[v].idx1);m&&g.push({el:m,ptIdx:v})}}a.animators&&a.animators.length&&a.animators[0].during((function(){s&&s.dirtyShape();for(var t=a.shape.__points,e=0;e<g.length;e++){var n=g[e].el,i=2*g[e].ptIdx;n.x=t[i],n.y=t[i+1],n.markRedraw()}}))},e.prototype.remove=function(t){var e=this.group,n=this._data;this._lineGroup.removeAll(),this._symbolDraw.remove(!0),n&&n.eachItemGraphicEl((function(t,i){t.__temp&&(e.remove(t),n.setItemGraphicEl(i,null))})),this._polyline=this._polygon=this._coordSys=this._points=this._stackedOnPoints=this._endLabel=this._data=null},e.type="line",e}(mg);function xS(t,e){return{seriesType:t,plan:gg(),reset:function(t){var n=t.getData(),i=t.coordinateSystem,r=t.pipelineContext,o=e||r.large;if(i){var a=z(i.dimensions,(function(t){return n.mapDimension(t)})).slice(0,2),s=a.length,l=n.getCalculationInfo("stackResultDimension");tx(n,a[0])&&(a[0]=l),tx(n,a[1])&&(a[1]=l);var u=n.getStore(),h=n.getDimensionIndex(a[0]),c=n.getDimensionIndex(a[1]);return s&&{progress:function(t,e){for(var n=t.end-t.start,r=o&&_x(n*s),a=[],l=[],p=t.start,d=0;p<t.end;p++){var f=void 0;if(1===s){var g=u.get(h,p);f=i.dataToPoint(g,null,l)}else a[0]=u.get(h,p),a[1]=u.get(c,p),f=i.dataToPoint(a,null,l);o?(r[d++]=f[0],r[d++]=f[1]):e.setItemLayout(p,f.slice())}o&&e.setLayout("points",r)}}}}}}var _S={average:function(t){for(var e=0,n=0,i=0;i<t.length;i++)isNaN(t[i])||(e+=t[i],n++);return 0===n?NaN:e/n},sum:function(t){for(var e=0,n=0;n<t.length;n++)e+=t[n]||0;return e},max:function(t){for(var e=-1/0,n=0;n<t.length;n++)t[n]>e&&(e=t[n]);return isFinite(e)?e:NaN},min:function(t){for(var e=1/0,n=0;n<t.length;n++)t[n]<e&&(e=t[n]);return isFinite(e)?e:NaN},nearest:function(t){return t[0]}},bS=function(t){return Math.round(t.length/2)};function wS(t){return{seriesType:t,reset:function(t,e,n){var i=t.getData(),r=t.get("sampling"),o=t.coordinateSystem,a=i.count();if(a>10&&"cartesian2d"===o.type&&r){var s=o.getBaseAxis(),l=o.getOtherAxis(s),u=s.getExtent(),h=n.getDevicePixelRatio(),c=Math.abs(u[1]-u[0])*(h||1),p=Math.round(a/c);if(p>1){"lttb"===r&&t.setData(i.lttbDownSample(i.mapDimension(l.dim),1/p));var d=void 0;X(r)?d=_S[r]:U(r)&&(d=r),d&&t.setData(i.downSample(i.mapDimension(l.dim),1/p,d,bS))}}}}}var SS=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.getInitialData=function(t,e){return nx(null,this,{useEncodeDefaulter:!0})},e.prototype.getMarkerPosition=function(t){var e=this.coordinateSystem;if(e&&e.clampData){var n=e.dataToPoint(e.clampData(t)),i=this.getData(),r=i.getLayout("offset"),o=i.getLayout("size");return n[e.getBaseAxis().isHorizontal()?0:1]+=r+o/2,n}return[NaN,NaN]},e.type="series.__base_bar__",e.defaultOption={z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,barMinHeight:0,barMinAngle:0,large:!1,largeThreshold:400,progressive:3e3,progressiveChunkMode:"mod"},e}(ag);ag.registerClass(SS);var MS=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.getInitialData=function(){return nx(null,this,{useEncodeDefaulter:!0,createInvertedIndices:!!this.get("realtimeSort",!0)||null})},e.prototype.getProgressive=function(){return!!this.get("large")&&this.get("progressive")},e.prototype.getProgressiveThreshold=function(){var t=this.get("progressiveThreshold"),e=this.get("largeThreshold");return e>t&&(t=e),t},e.prototype.brushSelector=function(t,e,n){return n.rect(e.getItemLayout(t))},e.type="series.bar",e.dependencies=["grid","polar"],e.defaultOption=gc(SS.defaultOption,{clip:!0,roundCap:!1,showBackground:!1,backgroundStyle:{color:"rgba(180, 180, 180, 0.2)",borderColor:null,borderWidth:0,borderType:"solid",borderRadius:0,shadowBlur:0,shadowColor:null,shadowOffsetX:0,shadowOffsetY:0,opacity:1},select:{itemStyle:{borderColor:"#212121"}},realtimeSort:!1}),e}(SS),IS=function(){this.cx=0,this.cy=0,this.r0=0,this.r=0,this.startAngle=0,this.endAngle=2*Math.PI,this.clockwise=!0},TS=function(t){function e(e){var n=t.call(this,e)||this;return n.type="sausage",n}return n(e,t),e.prototype.getDefaultShape=function(){return new IS},e.prototype.buildPath=function(t,e){var n=e.cx,i=e.cy,r=Math.max(e.r0||0,0),o=Math.max(e.r,0),a=.5*(o-r),s=r+a,l=e.startAngle,u=e.endAngle,h=e.clockwise,c=2*Math.PI,p=h?u-l<c:l-u<c;p||(l=u-(h?c:-c));var d=Math.cos(l),f=Math.sin(l),g=Math.cos(u),y=Math.sin(u);p?(t.moveTo(d*r+n,f*r+i),t.arc(d*s+n,f*s+i,a,-Math.PI+l,l,!h)):t.moveTo(d*o+n,f*o+i),t.arc(n,i,o,l,u,!h),t.arc(g*s+n,y*s+i,a,u-2*Math.PI,u-Math.PI,!h),0!==r&&t.arc(n,i,r,u,l,h)},e}(fs);function CS(t,e,n){return e*Math.sin(t)*(n?-1:1)}function DS(t,e,n){return e*Math.cos(t)*(n?1:-1)}var AS=Math.max,kS=Math.min;var LS=function(t){function e(){var n=t.call(this)||this;return n.type=e.type,n._isFirstFrame=!0,n}return n(e,t),e.prototype.render=function(t,e,n,i){this._model=t,this._removeOnRenderedListener(n),this._updateDrawMode(t);var r=t.get("coordinateSystem");("cartesian2d"===r||"polar"===r)&&(this._progressiveEls=null,this._isLargeDraw?this._renderLarge(t,e,n):this._renderNormal(t,e,n,i))},e.prototype.incrementalPrepareRender=function(t){this._clear(),this._updateDrawMode(t),this._updateLargeClip(t)},e.prototype.incrementalRender=function(t,e){this._progressiveEls=[],this._incrementalRenderLarge(t,e)},e.prototype.eachRendered=function(t){zh(this._progressiveEls||this.group,t)},e.prototype._updateDrawMode=function(t){var e=t.pipelineContext.large;null!=this._isLargeDraw&&e===this._isLargeDraw||(this._isLargeDraw=e,this._clear())},e.prototype._renderNormal=function(t,e,n,i){var r,o=this.group,a=t.getData(),s=this._data,l=t.coordinateSystem,u=l.getBaseAxis();"cartesian2d"===l.type?r=u.isHorizontal():"polar"===l.type&&(r="angle"===u.dim);var h=t.isAnimationEnabled()?t:null,c=function(t,e){var n=t.get("realtimeSort",!0),i=e.getBaseAxis();0;if(n&&"category"===i.type&&"cartesian2d"===e.type)return{baseAxis:i,otherAxis:e.getOtherAxis(i)}}(t,l);c&&this._enableRealtimeSort(c,a,n);var p=t.get("clip",!0)||c,d=function(t,e){var n=t.getArea&&t.getArea();if(sS(t,"cartesian2d")){var i=t.getBaseAxis();if("category"!==i.type||!i.onBand){var r=e.getLayout("bandWidth");i.isHorizontal()?(n.x-=r,n.width+=2*r):(n.y-=r,n.height+=2*r)}}return n}(l,a);o.removeClipPath();var f=t.get("roundCap",!0),g=t.get("showBackground",!0),y=t.getModel("backgroundStyle"),v=y.get("borderRadius")||0,m=[],x=this._backgroundEls,_=i&&i.isInitSort,b=i&&"changeAxisOrder"===i.type;function w(t){var e=BS[l.type](a,t),n=function(t,e,n){return new("polar"===t.type?Tu:Ts)({shape:XS(e,n,t),silent:!0,z2:0})}(l,r,e);return n.useStyle(y.getItemStyle()),"cartesian2d"===l.type&&n.setShape("r",v),m[t]=n,n}a.diff(s).add((function(e){var n=a.getItemModel(e),i=BS[l.type](a,e,n);if(g&&w(e),a.hasValue(e)&&VS[l.type](i)){var s=!1;p&&(s=PS[l.type](d,i));var y=OS[l.type](t,a,e,i,r,h,u.model,!1,f);c&&(y.forceLabelAnimation=!0),GS(y,a,e,n,i,t,r,"polar"===l.type),_?y.attr({shape:i}):c?RS(c,h,y,i,e,r,!1,!1):rh(y,{shape:i},t,e),a.setItemGraphicEl(e,y),o.add(y),y.ignore=s}})).update((function(e,n){var i=a.getItemModel(e),S=BS[l.type](a,e,i);if(g){var M=void 0;0===x.length?M=w(n):((M=x[n]).useStyle(y.getItemStyle()),"cartesian2d"===l.type&&M.setShape("r",v),m[e]=M);var I=BS[l.type](a,e);ih(M,{shape:XS(r,I,l)},h,e)}var T=s.getItemGraphicEl(n);if(a.hasValue(e)&&VS[l.type](S)){var C=!1;if(p&&(C=PS[l.type](d,S))&&o.remove(T),T?uh(T):T=OS[l.type](t,a,e,S,r,h,u.model,!!T,f),c&&(T.forceLabelAnimation=!0),b){var D=T.getTextContent();if(D){var A=$h(D);null!=A.prevValue&&(A.prevValue=A.value)}}else GS(T,a,e,i,S,t,r,"polar"===l.type);_?T.attr({shape:S}):c?RS(c,h,T,S,e,r,!0,b):ih(T,{shape:S},t,e,null),a.setItemGraphicEl(e,T),T.ignore=C,o.add(T)}else o.remove(T)})).remove((function(e){var n=s.getItemGraphicEl(e);n&&lh(n,t,e)})).execute();var S=this._backgroundGroup||(this._backgroundGroup=new Cr);S.removeAll();for(var M=0;M<m.length;++M)S.add(m[M]);o.add(S),this._backgroundEls=m,this._data=a},e.prototype._renderLarge=function(t,e,n){this._clear(),YS(t,this.group),this._updateLargeClip(t)},e.prototype._incrementalRenderLarge=function(t,e){this._removeBackground(),YS(e,this.group,this._progressiveEls,!0)},e.prototype._updateLargeClip=function(t){var e=t.get("clip",!0)&&aS(t.coordinateSystem,!1,t),n=this.group;e?n.setClipPath(e):n.removeClipPath()},e.prototype._enableRealtimeSort=function(t,e,n){var i=this;if(e.count()){var r=t.baseAxis;if(this._isFirstFrame)this._dispatchInitSort(e,t,n),this._isFirstFrame=!1;else{var o=function(t){var n=e.getItemGraphicEl(t),i=n&&n.shape;return i&&Math.abs(r.isHorizontal()?i.height:i.width)||0};this._onRendered=function(){i._updateSortWithinSameData(e,o,r,n)},n.getZr().on("rendered",this._onRendered)}}},e.prototype._dataSort=function(t,e,n){var i=[];return t.each(t.mapDimension(e.dim),(function(t,e){var r=n(e);r=null==r?NaN:r,i.push({dataIndex:e,mappedValue:r,ordinalNumber:t})})),i.sort((function(t,e){return e.mappedValue-t.mappedValue})),{ordinalNumbers:z(i,(function(t){return t.ordinalNumber}))}},e.prototype._isOrderChangedWithinSameData=function(t,e,n){for(var i=n.scale,r=t.mapDimension(n.dim),o=Number.MAX_VALUE,a=0,s=i.getOrdinalMeta().categories.length;a<s;++a){var l=t.rawIndexOf(r,i.getRawOrdinalNumber(a)),u=l<0?Number.MIN_VALUE:e(t.indexOfRawIndex(l));if(u>o)return!0;o=u}return!1},e.prototype._isOrderDifferentInView=function(t,e){for(var n=e.scale,i=n.getExtent(),r=Math.max(0,i[0]),o=Math.min(i[1],n.getOrdinalMeta().categories.length-1);r<=o;++r)if(t.ordinalNumbers[r]!==n.getRawOrdinalNumber(r))return!0},e.prototype._updateSortWithinSameData=function(t,e,n,i){if(this._isOrderChangedWithinSameData(t,e,n)){var r=this._dataSort(t,n,e);this._isOrderDifferentInView(r,n)&&(this._removeOnRenderedListener(i),i.dispatchAction({type:"changeAxisOrder",componentType:n.dim+"Axis",axisId:n.index,sortInfo:r}))}},e.prototype._dispatchInitSort=function(t,e,n){var i=e.baseAxis,r=this._dataSort(t,i,(function(n){return t.get(t.mapDimension(e.otherAxis.dim),n)}));n.dispatchAction({type:"changeAxisOrder",componentType:i.dim+"Axis",isInitSort:!0,axisId:i.index,sortInfo:r})},e.prototype.remove=function(t,e){this._clear(this._model),this._removeOnRenderedListener(e)},e.prototype.dispose=function(t,e){this._removeOnRenderedListener(e)},e.prototype._removeOnRenderedListener=function(t){this._onRendered&&(t.getZr().off("rendered",this._onRendered),this._onRendered=null)},e.prototype._clear=function(t){var e=this.group,n=this._data;t&&t.isAnimationEnabled()&&n&&!this._isLargeDraw?(this._removeBackground(),this._backgroundEls=[],n.eachItemGraphicEl((function(e){lh(e,t,Ws(e).dataIndex)}))):e.removeAll(),this._data=null,this._isFirstFrame=!0},e.prototype._removeBackground=function(){this.group.remove(this._backgroundGroup),this._backgroundGroup=null},e.type="bar",e}(mg),PS={cartesian2d:function(t,e){var n=e.width<0?-1:1,i=e.height<0?-1:1;n<0&&(e.x+=e.width,e.width=-e.width),i<0&&(e.y+=e.height,e.height=-e.height);var r=t.x+t.width,o=t.y+t.height,a=AS(e.x,t.x),s=kS(e.x+e.width,r),l=AS(e.y,t.y),u=kS(e.y+e.height,o),h=s<a,c=u<l;return e.x=h&&a>r?s:a,e.y=c&&l>o?u:l,e.width=h?0:s-a,e.height=c?0:u-l,n<0&&(e.x+=e.width,e.width=-e.width),i<0&&(e.y+=e.height,e.height=-e.height),h||c},polar:function(t,e){var n=e.r0<=e.r?1:-1;if(n<0){var i=e.r;e.r=e.r0,e.r0=i}var r=kS(e.r,t.r),o=AS(e.r0,t.r0);e.r=r,e.r0=o;var a=r-o<0;if(n<0){i=e.r;e.r=e.r0,e.r0=i}return a}},OS={cartesian2d:function(t,e,n,i,r,o,a,s,l){var u=new Ts({shape:A({},i),z2:1});(u.__dataIndex=n,u.name="item",o)&&(u.shape[r?"height":"width"]=0);return u},polar:function(t,e,n,i,r,o,a,s,l){var u=!r&&l?TS:Tu,h=new u({shape:i,z2:1});h.name="item";var c,p,d=FS(r);if(h.calculateTextPosition=(c=d,p=({isRoundCap:u===TS}||{}).isRoundCap,function(t,e,n){var i=e.position;if(!i||i instanceof Array)return yr(t,e,n);var r=c(i),o=null!=e.distance?e.distance:5,a=this.shape,s=a.cx,l=a.cy,u=a.r,h=a.r0,d=(u+h)/2,f=a.startAngle,g=a.endAngle,y=(f+g)/2,v=p?Math.abs(u-h)/2:0,m=Math.cos,x=Math.sin,_=s+u*m(f),b=l+u*x(f),w="left",S="top";switch(r){case"startArc":_=s+(h-o)*m(y),b=l+(h-o)*x(y),w="center",S="top";break;case"insideStartArc":_=s+(h+o)*m(y),b=l+(h+o)*x(y),w="center",S="bottom";break;case"startAngle":_=s+d*m(f)+CS(f,o+v,!1),b=l+d*x(f)+DS(f,o+v,!1),w="right",S="middle";break;case"insideStartAngle":_=s+d*m(f)+CS(f,-o+v,!1),b=l+d*x(f)+DS(f,-o+v,!1),w="left",S="middle";break;case"middle":_=s+d*m(y),b=l+d*x(y),w="center",S="middle";break;case"endArc":_=s+(u+o)*m(y),b=l+(u+o)*x(y),w="center",S="bottom";break;case"insideEndArc":_=s+(u-o)*m(y),b=l+(u-o)*x(y),w="center",S="top";break;case"endAngle":_=s+d*m(g)+CS(g,o+v,!0),b=l+d*x(g)+DS(g,o+v,!0),w="left",S="middle";break;case"insideEndAngle":_=s+d*m(g)+CS(g,-o+v,!0),b=l+d*x(g)+DS(g,-o+v,!0),w="right",S="middle";break;default:return yr(t,e,n)}return(t=t||{}).x=_,t.y=b,t.align=w,t.verticalAlign=S,t}),o){var f=r?"r":"endAngle",g={};h.shape[f]=r?0:i.startAngle,g[f]=i[f],(s?ih:rh)(h,{shape:g},o)}return h}};function RS(t,e,n,i,r,o,a,s){var l,u;o?(u={x:i.x,width:i.width},l={y:i.y,height:i.height}):(u={y:i.y,height:i.height},l={x:i.x,width:i.width}),s||(a?ih:rh)(n,{shape:l},e,r,null),(a?ih:rh)(n,{shape:u},e?t.baseAxis.model:null,r)}function NS(t,e){for(var n=0;n<e.length;n++)if(!isFinite(t[e[n]]))return!0;return!1}var ES=["x","y","width","height"],zS=["cx","cy","r","startAngle","endAngle"],VS={cartesian2d:function(t){return!NS(t,ES)},polar:function(t){return!NS(t,zS)}},BS={cartesian2d:function(t,e,n){var i=t.getItemLayout(e),r=n?function(t,e){var n=t.get(["itemStyle","borderColor"]);if(!n||"none"===n)return 0;var i=t.get(["itemStyle","borderWidth"])||0,r=isNaN(e.width)?Number.MAX_VALUE:Math.abs(e.width),o=isNaN(e.height)?Number.MAX_VALUE:Math.abs(e.height);return Math.min(i,r,o)}(n,i):0,o=i.width>0?1:-1,a=i.height>0?1:-1;return{x:i.x+o*r/2,y:i.y+a*r/2,width:i.width-o*r,height:i.height-a*r}},polar:function(t,e,n){var i=t.getItemLayout(e);return{cx:i.cx,cy:i.cy,r0:i.r0,r:i.r,startAngle:i.startAngle,endAngle:i.endAngle,clockwise:i.clockwise}}};function FS(t){return function(t){var e=t?"Arc":"Angle";return function(t){switch(t){case"start":case"insideStart":case"end":case"insideEnd":return t+e;default:return t}}}(t)}function GS(t,e,n,i,r,o,a,s){var l=e.getItemVisual(n,"style");s||t.setShape("r",i.get(["itemStyle","borderRadius"])||0),t.useStyle(l);var u=i.getShallow("cursor");u&&t.attr("cursor",u);var h=s?a?r.r>=r.r0?"endArc":"startArc":r.endAngle>=r.startAngle?"endAngle":"startAngle":a?r.height>=0?"bottom":"top":r.width>=0?"right":"left",c=Hh(i);Wh(t,c,{labelFetcher:o,labelDataIndex:n,defaultText:Fw(o.getData(),n),inheritColor:l.fill,defaultOpacity:l.opacity,defaultOutsidePosition:h});var p=t.getTextContent();if(s&&p){var d=i.get(["label","position"]);t.textConfig.inside="middle"===d||null,function(t,e,n,i){if(j(i))t.setTextConfig({rotation:i});else if(Y(e))t.setTextConfig({rotation:0});else{var r,o=t.shape,a=o.clockwise?o.startAngle:o.endAngle,s=o.clockwise?o.endAngle:o.startAngle,l=(a+s)/2,u=n(e);switch(u){case"startArc":case"insideStartArc":case"middle":case"insideEndArc":case"endArc":r=l;break;case"startAngle":case"insideStartAngle":r=a;break;case"endAngle":case"insideEndAngle":r=s;break;default:return void t.setTextConfig({rotation:0})}var h=1.5*Math.PI-r;"middle"===u&&h>Math.PI/2&&h<1.5*Math.PI&&(h-=Math.PI),t.setTextConfig({rotation:h})}}(t,"outside"===d?h:d,FS(a),i.get(["label","rotate"]))}Jh(p,c,o.getRawValue(n),(function(t){return Gw(e,t)}));var f=i.getModel(["emphasis"]);Ol(t,f.get("focus"),f.get("blurScope"),f.get("disabled")),zl(t,i),function(t){return null!=t.startAngle&&null!=t.endAngle&&t.startAngle===t.endAngle}(r)&&(t.style.fill="none",t.style.stroke="none",E(t.states,(function(t){t.style&&(t.style.fill=t.style.stroke="none")})))}var WS=function(){},HS=function(t){function e(e){var n=t.call(this,e)||this;return n.type="largeBar",n}return n(e,t),e.prototype.getDefaultShape=function(){return new WS},e.prototype.buildPath=function(t,e){for(var n=e.points,i=this.baseDimIdx,r=1-this.baseDimIdx,o=[],a=[],s=this.barWidth,l=0;l<n.length;l+=3)a[i]=s,a[r]=n[l+2],o[i]=n[l+i],o[r]=n[l+r],t.rect(o[0],o[1],a[0],a[1])},e}(fs);function YS(t,e,n,i){var r=t.getData(),o=r.getLayout("valueAxisHorizontal")?1:0,a=r.getLayout("largeDataIndices"),s=r.getLayout("size"),l=t.getModel("backgroundStyle"),u=r.getLayout("largeBackgroundPoints");if(u){var h=new HS({shape:{points:u},incremental:!!i,silent:!0,z2:0});h.baseDimIdx=o,h.largeDataIndices=a,h.barWidth=s,h.useStyle(l.getItemStyle()),e.add(h),n&&n.push(h)}var c=new HS({shape:{points:r.getLayout("largePoints")},incremental:!!i,z2:1});c.baseDimIdx=o,c.largeDataIndices=a,c.barWidth=s,e.add(c),c.useStyle(r.getVisual("style")),Ws(c).seriesIndex=t.seriesIndex,t.get("silent")||(c.on("mousedown",US),c.on("mousemove",US)),n&&n.push(c)}var US=Cg((function(t){var e=function(t,e,n){for(var i=t.baseDimIdx,r=1-i,o=t.shape.points,a=t.largeDataIndices,s=[],l=[],u=t.barWidth,h=0,c=o.length/3;h<c;h++){var p=3*h;if(l[i]=u,l[r]=o[p+2],s[i]=o[p+i],s[r]=o[p+r],l[r]<0&&(s[r]+=l[r],l[r]=-l[r]),e>=s[0]&&e<=s[0]+l[0]&&n>=s[1]&&n<=s[1]+l[1])return a[h]}return-1}(this,t.offsetX,t.offsetY);Ws(this).dataIndex=e>=0?e:null}),30,!1);function XS(t,e,n){if(sS(n,"cartesian2d")){var i=e,r=n.getArea();return{x:t?i.x:r.x,y:t?r.y:i.y,width:t?i.width:r.width,height:t?r.height:i.height}}var o=e;return{cx:(r=n.getArea()).cx,cy:r.cy,r0:t?r.r0:o.r0,r:t?r.r:o.r,startAngle:t?o.startAngle:0,endAngle:t?o.endAngle:2*Math.PI}}var ZS=2*Math.PI,jS=Math.PI/180;function qS(t,e){return mp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}function KS(t,e){var n=qS(t,e),i=t.get("center"),r=t.get("radius");Y(r)||(r=[0,r]),Y(i)||(i=[i,i]);var o=Er(n.width,e.getWidth()),a=Er(n.height,e.getHeight()),s=Math.min(o,a);return{cx:Er(i[0],o)+n.x,cy:Er(i[1],a)+n.y,r0:Er(r[0],s/2),r:Er(r[1],s/2)}}function $S(t,e,n){e.eachSeriesByType(t,(function(t){var e=t.getData(),i=e.mapDimension("value"),r=qS(t,n),o=KS(t,n),a=o.cx,s=o.cy,l=o.r,u=o.r0,h=-t.get("startAngle")*jS,c=t.get("minAngle")*jS,p=0;e.each(i,(function(t){!isNaN(t)&&p++}));var d=e.getSum(i),f=Math.PI/(d||p)*2,g=t.get("clockwise"),y=t.get("roseType"),v=t.get("stillShowZeroSum"),m=e.getDataExtent(i);m[0]=0;var x=ZS,_=0,b=h,w=g?1:-1;if(e.setLayout({viewRect:r,r:l}),e.each(i,(function(t,n){var i;if(isNaN(t))e.setItemLayout(n,{angle:NaN,startAngle:NaN,endAngle:NaN,clockwise:g,cx:a,cy:s,r0:u,r:y?NaN:l});else{(i="area"!==y?0===d&&v?f:t*f:ZS/p)<c?(i=c,x-=c):_+=t;var r=b+w*i;e.setItemLayout(n,{angle:i,startAngle:b,endAngle:r,clockwise:g,cx:a,cy:s,r0:u,r:y?Nr(t,m,[u,l]):l}),b=r}})),x<ZS&&p)if(x<=.001){var S=ZS/p;e.each(i,(function(t,n){if(!isNaN(t)){var i=e.getItemLayout(n);i.angle=S,i.startAngle=h+w*n*S,i.endAngle=h+w*(n+1)*S}}))}else f=x/_,b=h,e.each(i,(function(t,n){if(!isNaN(t)){var i=e.getItemLayout(n),r=i.angle===c?c:t*f;i.startAngle=b,i.endAngle=b+w*r,b+=w*r}}))}))}function JS(t){return{seriesType:t,reset:function(t,e){var n=e.findComponents({mainType:"legend"});if(n&&n.length){var i=t.getData();i.filterSelf((function(t){for(var e=i.getName(t),r=0;r<n.length;r++)if(!n[r].isSelected(e))return!1;return!0}))}}}}var QS=Math.PI/180;function tM(t,e,n,i,r,o,a,s,l,u){if(!(t.length<2)){for(var h=t.length,c=0;c<h;c++)if("outer"===t[c].position&&"labelLine"===t[c].labelAlignTo){var p=t[c].label.x-u;t[c].linePoints[1][0]+=p,t[c].label.x=u}gb(t,l,l+a)&&function(t){for(var o={list:[],maxY:0},a={list:[],maxY:0},s=0;s<t.length;s++)if("none"===t[s].labelAlignTo){var l=t[s],u=l.label.y>n?a:o,h=Math.abs(l.label.y-n);if(h>=u.maxY){var c=l.label.x-e-l.len2*r,p=i+l.len,f=Math.abs(c)<p?Math.sqrt(h*h/(1-c*c/p/p)):p;u.rB=f,u.maxY=h}u.list.push(l)}d(o),d(a)}(t)}function d(t){for(var o=t.rB,a=o*o,s=0;s<t.list.length;s++){var l=t.list[s],u=Math.abs(l.label.y-n),h=i+l.len,c=h*h,p=Math.sqrt((1-Math.abs(u*u/a))*c),d=e+(p+l.len2)*r,f=d-l.label.x;eM(l,l.targetTextWidth-f*r,!0),l.label.x=d}}}function eM(t,e,n){if(void 0===n&&(n=!1),null==t.labelStyleWidth){var i=t.label,r=i.style,o=t.rect,a=r.backgroundColor,s=r.padding,l=s?s[1]+s[3]:0,u=r.overflow,h=o.width+(a?0:l);if(e<h||n){var c=o.height;if(u&&u.match("break")){i.setStyle("backgroundColor",null),i.setStyle("width",e-l);var p=i.getBoundingRect();i.setStyle("width",Math.ceil(p.width)),i.setStyle("backgroundColor",a)}else{var d=e-l,f=e<h?d:n?d>t.unconstrainedWidth?null:d:null;i.setStyle("width",f)}var g=i.getBoundingRect();o.width=g.width;var y=(i.style.margin||0)+2.1;o.height=g.height+y,o.y-=(o.height-c)/2}}}function nM(t){return"center"===t.position}function iM(t){var e,n,i=t.getData(),r=[],o=!1,a=(t.get("minShowLabelAngle")||0)*QS,s=i.getLayout("viewRect"),l=i.getLayout("r"),u=s.width,h=s.x,c=s.y,p=s.height;function d(t){t.ignore=!0}i.each((function(t){var s=i.getItemGraphicEl(t),c=s.shape,p=s.getTextContent(),f=s.getTextGuideLine(),g=i.getItemModel(t),y=g.getModel("label"),v=y.get("position")||g.get(["emphasis","label","position"]),m=y.get("distanceToLabelLine"),x=y.get("alignTo"),_=Er(y.get("edgeDistance"),u),b=y.get("bleedMargin"),w=g.getModel("labelLine"),S=w.get("length");S=Er(S,u);var M=w.get("length2");if(M=Er(M,u),Math.abs(c.endAngle-c.startAngle)<a)return E(p.states,d),void(p.ignore=!0);if(function(t){if(!t.ignore)return!0;for(var e in t.states)if(!1===t.states[e].ignore)return!0;return!1}(p)){var I,T,C,D,A=(c.startAngle+c.endAngle)/2,k=Math.cos(A),L=Math.sin(A);e=c.cx,n=c.cy;var P="inside"===v||"inner"===v;if("center"===v)I=c.cx,T=c.cy,D="center";else{var O=(P?(c.r+c.r0)/2*k:c.r*k)+e,R=(P?(c.r+c.r0)/2*L:c.r*L)+n;if(I=O+3*k,T=R+3*L,!P){var N=O+k*(S+l-c.r),z=R+L*(S+l-c.r),V=N+(k<0?-1:1)*M;I="edge"===x?k<0?h+_:h+u-_:V+(k<0?-m:m),T=z,C=[[O,R],[N,z],[V,z]]}D=P?"center":"edge"===x?k>0?"right":"left":k>0?"left":"right"}var B=Math.PI,F=0,G=y.get("rotate");if(j(G))F=G*(B/180);else if("center"===v)F=0;else if("radial"===G||!0===G){F=k<0?-A+B:-A}else if("tangential"===G&&"outside"!==v&&"outer"!==v){var W=Math.atan2(k,L);W<0&&(W=2*B+W),L>0&&(W=B+W),F=W-B}if(o=!!F,p.x=I,p.y=T,p.rotation=F,p.setStyle({verticalAlign:"middle"}),P){p.setStyle({align:D});var H=p.states.select;H&&(H.x+=p.x,H.y+=p.y)}else{var Y=p.getBoundingRect().clone();Y.applyTransform(p.getComputedTransform());var U=(p.style.margin||0)+2.1;Y.y-=U/2,Y.height+=U,r.push({label:p,labelLine:f,position:v,len:S,len2:M,minTurnAngle:w.get("minTurnAngle"),maxSurfaceAngle:w.get("maxSurfaceAngle"),surfaceNormal:new Ji(k,L),linePoints:C,textAlign:D,labelDistance:m,labelAlignTo:x,edgeDistance:_,bleedMargin:b,rect:Y,unconstrainedWidth:Y.width,labelStyleWidth:p.style.width})}s.setTextConfig({inside:P})}})),!o&&t.get("avoidLabelOverlap")&&function(t,e,n,i,r,o,a,s){for(var l=[],u=[],h=Number.MAX_VALUE,c=-Number.MAX_VALUE,p=0;p<t.length;p++){var d=t[p].label;nM(t[p])||(d.x<e?(h=Math.min(h,d.x),l.push(t[p])):(c=Math.max(c,d.x),u.push(t[p])))}for(p=0;p<t.length;p++)if(!nM(y=t[p])&&y.linePoints){if(null!=y.labelStyleWidth)continue;d=y.label;var f=y.linePoints,g=void 0;g="edge"===y.labelAlignTo?d.x<e?f[2][0]-y.labelDistance-a-y.edgeDistance:a+r-y.edgeDistance-f[2][0]-y.labelDistance:"labelLine"===y.labelAlignTo?d.x<e?h-a-y.bleedMargin:a+r-c-y.bleedMargin:d.x<e?d.x-a-y.bleedMargin:a+r-d.x-y.bleedMargin,y.targetTextWidth=g,eM(y,g)}for(tM(u,e,n,i,1,0,o,0,s,c),tM(l,e,n,i,-1,0,o,0,s,h),p=0;p<t.length;p++){var y;if(!nM(y=t[p])&&y.linePoints){d=y.label,f=y.linePoints;var v="edge"===y.labelAlignTo,m=d.style.padding,x=m?m[1]+m[3]:0,_=d.style.backgroundColor?0:x,b=y.rect.width+_,w=f[1][0]-f[2][0];v?d.x<e?f[2][0]=a+y.edgeDistance+b+y.labelDistance:f[2][0]=a+r-y.edgeDistance-b-y.labelDistance:(d.x<e?f[2][0]=d.x+y.labelDistance:f[2][0]=d.x-y.labelDistance,f[1][0]=f[2][0]+w),f[1][1]=f[2][1]=d.y}}}(r,e,n,l,u,p,h,c);for(var f=0;f<r.length;f++){var g=r[f],y=g.label,v=g.labelLine,m=isNaN(y.x)||isNaN(y.y);if(y){y.setStyle({align:g.textAlign}),m&&(E(y.states,d),y.ignore=!0);var x=y.states.select;x&&(x.x+=y.x,x.y+=y.y)}if(v){var _=g.linePoints;m||!_?(E(v.states,d),v.ignore=!0):(sb(_,g.minTurnAngle),lb(_,g.surfaceNormal,g.maxSurfaceAngle),v.setShape({points:_}),y.__hostTarget.textGuideLineConfig={anchor:new Ji(_[0][0],_[0][1])})}}}function rM(t,e,n){var i=t.get("borderRadius");if(null==i)return n?{cornerRadius:0}:null;Y(i)||(i=[i,i,i,i]);var r=Math.abs(e.r||0-e.r0||0);return{cornerRadius:z(i,(function(t){return gr(t,r)}))}}var oM=function(t){function e(e,n,i){var r=t.call(this)||this;r.z2=2;var o=new As;return r.setTextContent(o),r.updateData(e,n,i,!0),r}return n(e,t),e.prototype.updateData=function(t,e,n,i){var r=this,o=t.hostModel,a=t.getItemModel(e),s=a.getModel("emphasis"),l=t.getItemLayout(e),u=A(rM(a.getModel("itemStyle"),l,!0),l);if(isNaN(u.startAngle))r.setShape(u);else{if(i){r.setShape(u);var h=o.getShallow("animationType");o.ecModel.ssr?(rh(r,{scaleX:0,scaleY:0},o,{dataIndex:e,isFrom:!0}),r.originX=u.cx,r.originY=u.cy):"scale"===h?(r.shape.r=l.r0,rh(r,{shape:{r:l.r}},o,e)):null!=n?(r.setShape({startAngle:n,endAngle:n}),rh(r,{shape:{startAngle:l.startAngle,endAngle:l.endAngle}},o,e)):(r.shape.endAngle=l.startAngle,ih(r,{shape:{endAngle:l.endAngle}},o,e))}else uh(r),ih(r,{shape:u},o,e);r.useStyle(t.getItemVisual(e,"style")),zl(r,a);var c=(l.startAngle+l.endAngle)/2,p=o.get("selectedOffset"),d=Math.cos(c)*p,f=Math.sin(c)*p,g=a.getShallow("cursor");g&&r.attr("cursor",g),this._updateLabel(o,t,e),r.ensureState("emphasis").shape=A({r:l.r+(s.get("scale")&&s.get("scaleSize")||0)},rM(s.getModel("itemStyle"),l)),A(r.ensureState("select"),{x:d,y:f,shape:rM(a.getModel(["select","itemStyle"]),l)}),A(r.ensureState("blur"),{shape:rM(a.getModel(["blur","itemStyle"]),l)});var y=r.getTextGuideLine(),v=r.getTextContent();y&&A(y.ensureState("select"),{x:d,y:f}),A(v.ensureState("select"),{x:d,y:f}),Ol(this,s.get("focus"),s.get("blurScope"),s.get("disabled"))}},e.prototype._updateLabel=function(t,e,n){var i=this,r=e.getItemModel(n),o=r.getModel("labelLine"),a=e.getItemVisual(n,"style"),s=a&&a.fill,l=a&&a.opacity;Wh(i,Hh(r),{labelFetcher:e.hostModel,labelDataIndex:n,inheritColor:s,defaultOpacity:l,defaultText:t.getFormattedLabel(n,"normal")||e.getName(n)});var u=i.getTextContent();i.setTextConfig({position:null,rotation:null}),u.attr({z2:10});var h=t.get(["label","position"]);if("outside"!==h&&"outer"!==h)i.removeTextGuideLine();else{var c=this.getTextGuideLine();c||(c=new Ou,this.setTextGuideLine(c)),cb(this,pb(r),{stroke:s,opacity:ot(o.get(["lineStyle","opacity"]),l,1)})}},e}(Tu),aM=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.ignoreLabelLineUpdate=!0,e}return n(e,t),e.prototype.init=function(){var t=new Cr;this._sectorGroup=t},e.prototype.render=function(t,e,n,i){var r,o=t.getData(),a=this._data,s=this.group;if(!a&&o.count()>0){for(var l=o.getItemLayout(0),u=1;isNaN(l&&l.startAngle)&&u<o.count();++u)l=o.getItemLayout(u);l&&(r=l.startAngle)}if(this._emptyCircleSector&&s.remove(this._emptyCircleSector),0===o.count()&&t.get("showEmptyCircle")){var h=new Tu({shape:KS(t,n)});h.useStyle(t.getModel("emptyCircleStyle").getItemStyle()),this._emptyCircleSector=h,s.add(h)}o.diff(a).add((function(t){var e=new oM(o,t,r);o.setItemGraphicEl(t,e),s.add(e)})).update((function(t,e){var n=a.getItemGraphicEl(e);n.updateData(o,t,r),n.off("click"),s.add(n),o.setItemGraphicEl(t,n)})).remove((function(e){lh(a.getItemGraphicEl(e),t,e)})).execute(),iM(t),"expansion"!==t.get("animationTypeUpdate")&&(this._data=o)},e.prototype.dispose=function(){},e.prototype.containPoint=function(t,e){var n=e.getData().getItemLayout(0);if(n){var i=t[0]-n.cx,r=t[1]-n.cy,o=Math.sqrt(i*i+r*r);return o<=n.r&&o>=n.r0}},e.type="pie",e}(mg);function sM(t,e,n){e=Y(e)&&{coordDimensions:e}||A({encodeDefine:t.getEncode()},e);var i=t.getSource(),r=jm(i,e).dimensions,o=new Zm(r,t);return o.initData(i,n),o}var lM=function(){function t(t,e){this._getDataWithEncodedVisual=t,this._getRawData=e}return t.prototype.getAllNames=function(){var t=this._getRawData();return t.mapArray(t.getName)},t.prototype.containName=function(t){return this._getRawData().indexOfName(t)>=0},t.prototype.indexOfName=function(t){return this._getDataWithEncodedVisual().indexOfName(t)},t.prototype.getItemVisual=function(t,e){return this._getDataWithEncodedVisual().getItemVisual(t,e)},t}(),uM=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.init=function(e){t.prototype.init.apply(this,arguments),this.legendVisualProvider=new lM(W(this.getData,this),W(this.getRawData,this)),this._defaultLabelLine(e)},e.prototype.mergeOption=function(){t.prototype.mergeOption.apply(this,arguments)},e.prototype.getInitialData=function(){return sM(this,{coordDimensions:["value"],encodeDefaulter:H(Hp,this)})},e.prototype.getDataParams=function(e){var n=this.getData(),i=t.prototype.getDataParams.call(this,e),r=[];return n.each(n.mapDimension("value"),(function(t){r.push(t)})),i.percent=Wr(r,e,n.hostModel.get("percentPrecision")),i.$vars.push("percent"),i},e.prototype._defaultLabelLine=function(t){co(t,"labelLine",["show"]);var e=t.labelLine,n=t.emphasis.labelLine;e.show=e.show&&t.label.show,n.show=n.show&&t.emphasis.label.show},e.type="series.pie",e.defaultOption={z:2,legendHoverLink:!0,colorBy:"data",center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,minShowLabelAngle:0,selectedOffset:10,percentPrecision:2,stillShowZeroSum:!0,left:0,top:0,right:0,bottom:0,width:null,height:null,label:{rotate:0,show:!0,overflow:"truncate",position:"outer",alignTo:"none",edgeDistance:"25%",bleedMargin:10,distanceToLabelLine:5},labelLine:{show:!0,length:15,length2:15,smooth:!1,minTurnAngle:90,maxSurfaceAngle:90,lineStyle:{width:1,type:"solid"}},itemStyle:{borderWidth:1,borderJoin:"round"},showEmptyCircle:!0,emptyCircleStyle:{color:"lightgray",opacity:1},labelLayout:{hideOverlap:!0},emphasis:{scale:!0,scaleSize:5},avoidLabelOverlap:!0,animationType:"expansion",animationDuration:1e3,animationTypeUpdate:"transition",animationEasingUpdate:"cubicInOut",animationDurationUpdate:500,animationEasing:"cubicInOut"},e}(ag);var hM=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.hasSymbolVisual=!0,n}return n(e,t),e.prototype.getInitialData=function(t,e){return nx(null,this,{useEncodeDefaulter:!0})},e.prototype.getProgressive=function(){var t=this.option.progressive;return null==t?this.option.large?5e3:this.get("progressive"):t},e.prototype.getProgressiveThreshold=function(){var t=this.option.progressiveThreshold;return null==t?this.option.large?1e4:this.get("progressiveThreshold"):t},e.prototype.brushSelector=function(t,e,n){return n.point(e.getItemLayout(t))},e.prototype.getZLevelKey=function(){return this.getData().count()>this.getProgressiveThreshold()?this.id:""},e.type="series.scatter",e.dependencies=["grid","polar","geo","singleAxis","calendar"],e.defaultOption={coordinateSystem:"cartesian2d",z:2,legendHoverLink:!0,symbolSize:10,large:!1,largeThreshold:2e3,itemStyle:{opacity:.8},emphasis:{scale:!0},clip:!0,select:{itemStyle:{borderColor:"#212121"}},universalTransition:{divideShape:"clone"}},e}(ag),cM=function(){},pM=function(t){function e(e){var n=t.call(this,e)||this;return n._off=0,n.hoverDataIdx=-1,n}return n(e,t),e.prototype.getDefaultShape=function(){return new cM},e.prototype.reset=function(){this.notClear=!1,this._off=0},e.prototype.buildPath=function(t,e){var n,i=e.points,r=e.size,o=this.symbolProxy,a=o.shape,s=t.getContext?t.getContext():t,l=s&&r[0]<4,u=this.softClipShape;if(l)this._ctx=s;else{for(this._ctx=null,n=this._off;n<i.length;){var h=i[n++],c=i[n++];isNaN(h)||isNaN(c)||(u&&!u.contain(h,c)||(a.x=h-r[0]/2,a.y=c-r[1]/2,a.width=r[0],a.height=r[1],o.buildPath(t,a,!0)))}this.incremental&&(this._off=n,this.notClear=!0)}},e.prototype.afterBrush=function(){var t,e=this.shape,n=e.points,i=e.size,r=this._ctx,o=this.softClipShape;if(r){for(t=this._off;t<n.length;){var a=n[t++],s=n[t++];isNaN(a)||isNaN(s)||(o&&!o.contain(a,s)||r.fillRect(a-i[0]/2,s-i[1]/2,i[0],i[1]))}this.incremental&&(this._off=t,this.notClear=!0)}},e.prototype.findDataIndex=function(t,e){for(var n=this.shape,i=n.points,r=n.size,o=Math.max(r[0],4),a=Math.max(r[1],4),s=i.length/2-1;s>=0;s--){var l=2*s,u=i[l]-o/2,h=i[l+1]-a/2;if(t>=u&&e>=h&&t<=u+o&&e<=h+a)return s}return-1},e.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect();return t=n[0],e=n[1],i.contain(t,e)?(this.hoverDataIdx=this.findDataIndex(t,e))>=0:(this.hoverDataIdx=-1,!1)},e.prototype.getBoundingRect=function(){var t=this._rect;if(!t){for(var e=this.shape,n=e.points,i=e.size,r=i[0],o=i[1],a=1/0,s=1/0,l=-1/0,u=-1/0,h=0;h<n.length;){var c=n[h++],p=n[h++];a=Math.min(c,a),l=Math.max(c,l),s=Math.min(p,s),u=Math.max(p,u)}t=this._rect=new sr(a-r/2,s-o/2,l-a+r,u-s+o)}return t},e}(fs),dM=function(){function t(){this.group=new Cr}return t.prototype.updateData=function(t,e){this._clear();var n=this._create();n.setShape({points:t.getLayout("points")}),this._setCommon(n,t,e)},t.prototype.updateLayout=function(t){var e=t.getLayout("points");this.group.eachChild((function(t){if(null!=t.startIndex){var n=2*(t.endIndex-t.startIndex),i=4*t.startIndex*2;e=new Float32Array(e.buffer,i,n)}t.setShape("points",e),t.reset()}))},t.prototype.incrementalPrepareUpdate=function(t){this._clear()},t.prototype.incrementalUpdate=function(t,e,n){var i=this._newAdded[0],r=e.getLayout("points"),o=i&&i.shape.points;if(o&&o.length<2e4){var a=o.length,s=new Float32Array(a+r.length);s.set(o),s.set(r,a),i.endIndex=t.end,i.setShape({points:s})}else{this._newAdded=[];var l=this._create();l.startIndex=t.start,l.endIndex=t.end,l.incremental=!0,l.setShape({points:r}),this._setCommon(l,e,n)}},t.prototype.eachRendered=function(t){this._newAdded[0]&&t(this._newAdded[0])},t.prototype._create=function(){var t=new pM({cursor:"default"});return this.group.add(t),this._newAdded.push(t),t},t.prototype._setCommon=function(t,e,n){var i=e.hostModel;n=n||{};var r=e.getVisual("symbolSize");t.setShape("size",r instanceof Array?r:[r,r]),t.softClipShape=n.clipShape||null,t.symbolProxy=ky(e.getVisual("symbol"),0,0,0,0),t.setColor=t.symbolProxy.setColor;var o=t.shape.size[0]<4;t.useStyle(i.getModel("itemStyle").getItemStyle(o?["color","shadowBlur","shadowColor"]:["color"]));var a=e.getVisual("style"),s=a&&a.fill;s&&t.setColor(s);var l=Ws(t);l.seriesIndex=i.seriesIndex,t.on("mousemove",(function(e){l.dataIndex=null;var n=t.hoverDataIdx;n>=0&&(l.dataIndex=n+(t.startIndex||0))}))},t.prototype.remove=function(){this._clear()},t.prototype._clear=function(){this._newAdded=[],this.group.removeAll()},t}(),fM=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=t.getData();this._updateSymbolDraw(i,t).updateData(i,{clipShape:this._getClipShape(t)}),this._finished=!0},e.prototype.incrementalPrepareRender=function(t,e,n){var i=t.getData();this._updateSymbolDraw(i,t).incrementalPrepareUpdate(i),this._finished=!1},e.prototype.incrementalRender=function(t,e,n){this._symbolDraw.incrementalUpdate(t,e.getData(),{clipShape:this._getClipShape(e)}),this._finished=t.end===e.getData().count()},e.prototype.updateTransform=function(t,e,n){var i=t.getData();if(this.group.dirty(),!this._finished||i.count()>1e4)return{update:!0};var r=xS("").reset(t,e,n);r.progress&&r.progress({start:0,end:i.count(),count:i.count()},i),this._symbolDraw.updateLayout(i)},e.prototype.eachRendered=function(t){this._symbolDraw&&this._symbolDraw.eachRendered(t)},e.prototype._getClipShape=function(t){var e=t.coordinateSystem,n=e&&e.getArea&&e.getArea();return t.get("clip",!0)?n:null},e.prototype._updateSymbolDraw=function(t,e){var n=this._symbolDraw,i=e.pipelineContext.large;return n&&i===this._isLargeDraw||(n&&n.remove(),n=this._symbolDraw=i?new dM:new Zw,this._isLargeDraw=i,this.group.removeAll()),this.group.add(n.group),n},e.prototype.remove=function(t,e){this._symbolDraw&&this._symbolDraw.remove(!0),this._symbolDraw=null},e.prototype.dispose=function(){},e.type="scatter",e}(mg),gM=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.type="grid",e.dependencies=["xAxis","yAxis"],e.layoutMode="box",e.defaultOption={show:!1,z:0,left:"10%",top:60,right:"10%",bottom:70,containLabel:!1,backgroundColor:"rgba(0,0,0,0)",borderWidth:1,borderColor:"#ccc"},e}(Ip),yM=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.getCoordSysModel=function(){return this.getReferringComponents("grid",Co).models[0]},e.type="cartesian2dAxis",e}(Ip);R(yM,h_);var vM={show:!0,z:0,inverse:!1,name:"",nameLocation:"end",nameRotate:null,nameTruncate:{maxWidth:null,ellipsis:"...",placeholder:"."},nameTextStyle:{},nameGap:15,silent:!1,triggerEvent:!1,tooltip:{show:!1},axisPointer:{},axisLine:{show:!0,onZero:!0,onZeroAxisIndex:null,lineStyle:{color:"#6E7079",width:1,type:"solid"},symbol:["none","none"],symbolSize:[10,15]},axisTick:{show:!0,inside:!1,length:5,lineStyle:{width:1}},axisLabel:{show:!0,inside:!1,rotate:0,showMinLabel:null,showMaxLabel:null,margin:8,fontSize:12},splitLine:{show:!0,lineStyle:{color:["#E0E6F1"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.2)","rgba(210,219,238,0.2)"]}}},mM=C({boundaryGap:!0,deduplication:null,splitLine:{show:!1},axisTick:{alignWithLabel:!1,interval:"auto"},axisLabel:{interval:"auto"}},vM),xM=C({boundaryGap:[0,0],axisLine:{show:"auto"},axisTick:{show:"auto"},splitNumber:5,minorTick:{show:!1,splitNumber:5,length:3,lineStyle:{}},minorSplitLine:{show:!1,lineStyle:{color:"#F4F7FD",width:1}}},vM),_M={category:mM,value:xM,time:C({splitNumber:6,axisLabel:{showMinLabel:!1,showMaxLabel:!1,rich:{primary:{fontWeight:"bold"}}},splitLine:{show:!1}},xM),log:k({logBase:10},xM)},bM={value:1,category:1,time:1,log:1};function wM(t,e,i,r){E(bM,(function(o,a){var s=C(C({},_M[a],!0),r,!0),l=function(t){function i(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e+"Axis."+a,n}return n(i,t),i.prototype.mergeDefaultAndTheme=function(t,e){var n=_p(this),i=n?wp(t):{};C(t,e.getTheme().get(a+"Axis")),C(t,this.getDefaultOption()),t.type=SM(t),n&&bp(t,i,n)},i.prototype.optionUpdated=function(){"category"===this.option.type&&(this.__ordinalMeta=ox.createByAxisModel(this))},i.prototype.getCategories=function(t){var e=this.option;if("category"===e.type)return t?e.data:this.__ordinalMeta.categories},i.prototype.getOrdinalMeta=function(){return this.__ordinalMeta},i.type=e+"Axis."+a,i.defaultOption=s,i}(i);t.registerComponentModel(l)})),t.registerSubTypeDefaulter(e+"Axis",SM)}function SM(t){return t.type||(t.data?"category":"value")}var MM=function(){function t(t){this.type="cartesian",this._dimList=[],this._axes={},this.name=t||""}return t.prototype.getAxis=function(t){return this._axes[t]},t.prototype.getAxes=function(){return z(this._dimList,(function(t){return this._axes[t]}),this)},t.prototype.getAxesByScale=function(t){return t=t.toLowerCase(),B(this.getAxes(),(function(e){return e.scale.type===t}))},t.prototype.addAxis=function(t){var e=t.dim;this._axes[e]=t,this._dimList.push(e)},t}(),IM=["x","y"];function TM(t){return"interval"===t.type||"time"===t.type}var CM=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="cartesian2d",e.dimensions=IM,e}return n(e,t),e.prototype.calcAffineTransform=function(){this._transform=this._invTransform=null;var t=this.getAxis("x").scale,e=this.getAxis("y").scale;if(TM(t)&&TM(e)){var n=t.getExtent(),i=e.getExtent(),r=this.dataToPoint([n[0],i[0]]),o=this.dataToPoint([n[1],i[1]]),a=n[1]-n[0],s=i[1]-i[0];if(a&&s){var l=(o[0]-r[0])/a,u=(o[1]-r[1])/s,h=r[0]-n[0]*l,c=r[1]-i[0]*u,p=this._transform=[l,0,0,u,h,c];this._invTransform=Bi([],p)}}},e.prototype.getBaseAxis=function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAxis("x")},e.prototype.containPoint=function(t){var e=this.getAxis("x"),n=this.getAxis("y");return e.contain(e.toLocalCoord(t[0]))&&n.contain(n.toLocalCoord(t[1]))},e.prototype.containData=function(t){return this.getAxis("x").containData(t[0])&&this.getAxis("y").containData(t[1])},e.prototype.dataToPoint=function(t,e,n){n=n||[];var i=t[0],r=t[1];if(this._transform&&null!=i&&isFinite(i)&&null!=r&&isFinite(r))return Ft(n,t,this._transform);var o=this.getAxis("x"),a=this.getAxis("y");return n[0]=o.toGlobalCoord(o.dataToCoord(i,e)),n[1]=a.toGlobalCoord(a.dataToCoord(r,e)),n},e.prototype.clampData=function(t,e){var n=this.getAxis("x").scale,i=this.getAxis("y").scale,r=n.getExtent(),o=i.getExtent(),a=n.parse(t[0]),s=i.parse(t[1]);return(e=e||[])[0]=Math.min(Math.max(Math.min(r[0],r[1]),a),Math.max(r[0],r[1])),e[1]=Math.min(Math.max(Math.min(o[0],o[1]),s),Math.max(o[0],o[1])),e},e.prototype.pointToData=function(t,e){var n=[];if(this._invTransform)return Ft(n,t,this._invTransform);var i=this.getAxis("x"),r=this.getAxis("y");return n[0]=i.coordToData(i.toLocalCoord(t[0]),e),n[1]=r.coordToData(r.toLocalCoord(t[1]),e),n},e.prototype.getOtherAxis=function(t){return this.getAxis("x"===t.dim?"y":"x")},e.prototype.getArea=function(){var t=this.getAxis("x").getGlobalExtent(),e=this.getAxis("y").getGlobalExtent(),n=Math.min(t[0],t[1]),i=Math.min(e[0],e[1]),r=Math.max(t[0],t[1])-n,o=Math.max(e[0],e[1])-i;return new sr(n,i,r,o)},e}(MM),DM=function(t){function e(e,n,i,r,o){var a=t.call(this,e,n,i)||this;return a.index=0,a.type=r||"value",a.position=o||"bottom",a}return n(e,t),e.prototype.isHorizontal=function(){var t=this.position;return"top"===t||"bottom"===t},e.prototype.getGlobalExtent=function(t){var e=this.getExtent();return e[0]=this.toGlobalCoord(e[0]),e[1]=this.toGlobalCoord(e[1]),t&&e[0]>e[1]&&e.reverse(),e},e.prototype.pointToData=function(t,e){return this.coordToData(this.toLocalCoord(t["x"===this.dim?0:1]),e)},e.prototype.setCategorySortInfo=function(t){if("category"!==this.type)return!1;this.model.option.categorySortInfo=t,this.scale.setSortInfo(t)},e}(G_);function AM(t,e,n){n=n||{};var i=t.coordinateSystem,r=e.axis,o={},a=r.getAxesOnZeroOf()[0],s=r.position,l=a?"onZero":s,u=r.dim,h=i.getRect(),c=[h.x,h.x+h.width,h.y,h.y+h.height],p={left:0,right:1,top:0,bottom:1,onZero:2},d=e.get("offset")||0,f="x"===u?[c[2]-d,c[3]+d]:[c[0]-d,c[1]+d];if(a){var g=a.toGlobalCoord(a.dataToCoord(0));f[p.onZero]=Math.max(Math.min(g,f[1]),f[0])}o.position=["y"===u?f[p[l]]:c[0],"x"===u?f[p[l]]:c[3]],o.rotation=Math.PI/2*("x"===u?0:1);o.labelDirection=o.tickDirection=o.nameDirection={top:-1,bottom:1,left:-1,right:1}[s],o.labelOffset=a?f[p[s]]-f[p.onZero]:0,e.get(["axisTick","inside"])&&(o.tickDirection=-o.tickDirection),it(n.labelInside,e.get(["axisLabel","inside"]))&&(o.labelDirection=-o.labelDirection);var y=e.get(["axisLabel","rotate"]);return o.labelRotate="top"===l?-y:y,o.z2=1,o}function kM(t){return"cartesian2d"===t.get("coordinateSystem")}function LM(t){var e={xAxisModel:null,yAxisModel:null};return E(e,(function(n,i){var r=i.replace(/Model$/,""),o=t.getReferringComponents(r,Co).models[0];e[i]=o})),e}var PM=Math.log;function OM(t,e,n){var i=vx.prototype,r=i.getTicks.call(n),o=i.getTicks.call(n,!0),a=r.length-1,s=i.getInterval.call(n),l=e_(t,e),u=l.extent,h=l.fixMin,c=l.fixMax;if("log"===t.type){var p=PM(t.base);u=[PM(u[0])/p,PM(u[1])/p]}t.setExtent(u[0],u[1]),t.calcNiceExtent({splitNumber:a,fixMin:h,fixMax:c});var d=i.getExtent.call(t);h&&(u[0]=d[0]),c&&(u[1]=d[1]);var f=i.getInterval.call(t),g=u[0],y=u[1];if(h&&c)f=(y-g)/a;else if(h)for(y=u[0]+f*a;y<u[1]&&isFinite(y)&&isFinite(u[1]);)f=ux(f),y=u[0]+f*a;else if(c)for(g=u[1]-f*a;g>u[0]&&isFinite(g)&&isFinite(u[0]);)f=ux(f),g=u[1]-f*a;else{t.getTicks().length-1>a&&(f=ux(f));var v=f*a;(g=zr((y=Math.ceil(u[1]/f)*f)-v))<0&&u[0]>=0?(g=0,y=zr(v)):y>0&&u[1]<=0&&(y=0,g=-zr(v))}var m=(r[0].value-o[0].value)/s,x=(r[a].value-o[a].value)/s;i.setExtent.call(t,g+f*m,y+f*x),i.setInterval.call(t,f),(m||x)&&i.setNiceExtent.call(t,g+f,y-f)}var RM=function(){function t(t,e,n){this.type="grid",this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this.axisPointerEnabled=!0,this.dimensions=IM,this._initCartesian(t,e,n),this.model=t}return t.prototype.getRect=function(){return this._rect},t.prototype.update=function(t,e){var n=this._axesMap;function i(t){var e,n=G(t),i=n.length;if(i){for(var r=[],o=i-1;o>=0;o--){var a=t[+n[o]],s=a.model,l=a.scale;sx(l)&&s.get("alignTicks")&&null==s.get("interval")?r.push(a):(n_(l,s),sx(l)&&(e=a))}r.length&&(e||n_((e=r.pop()).scale,e.model),E(r,(function(t){OM(t.scale,t.model,e.scale)})))}}this._updateScale(t,this.model),i(n.x),i(n.y);var r={};E(n.x,(function(t){EM(n,"y",t,r)})),E(n.y,(function(t){EM(n,"x",t,r)})),this.resize(this.model,e)},t.prototype.resize=function(t,e,n){var i=t.getBoxLayoutParams(),r=!n&&t.get("containLabel"),o=mp(i,{width:e.getWidth(),height:e.getHeight()});this._rect=o;var a=this._axesList;function s(){E(a,(function(t){var e=t.isHorizontal(),n=e?[0,o.width]:[0,o.height],i=t.inverse?1:0;t.setExtent(n[i],n[1-i]),function(t,e){var n=t.getExtent(),i=n[0]+n[1];t.toGlobalCoord="x"===t.dim?function(t){return t+e}:function(t){return i-t+e},t.toLocalCoord="x"===t.dim?function(t){return t-e}:function(t){return i-t+e}}(t,e?o.x:o.y)}))}s(),r&&(E(a,(function(t){if(!t.model.get(["axisLabel","inside"])){var e=function(t){var e=t.model,n=t.scale;if(e.get(["axisLabel","show"])&&!n.isBlank()){var i,r,o=n.getExtent();r=n instanceof gx?n.count():(i=n.getTicks()).length;var a,s=t.getLabelModel(),l=r_(t),u=1;r>40&&(u=Math.ceil(r/40));for(var h=0;h<r;h+=u){var c=l(i?i[h]:{value:o[0]+h},h),p=a_(s.getTextRect(c),s.get("rotate")||0);a?a.union(p):a=p}return a}}(t);if(e){var n=t.isHorizontal()?"height":"width",i=t.model.get(["axisLabel","margin"]);o[n]-=e[n]+i,"top"===t.position?o.y+=e.height+i:"left"===t.position&&(o.x+=e.width+i)}}})),s()),E(this._coordsList,(function(t){t.calcAffineTransform()}))},t.prototype.getAxis=function(t,e){var n=this._axesMap[t];if(null!=n)return n[e||0]},t.prototype.getAxes=function(){return this._axesList.slice()},t.prototype.getCartesian=function(t,e){if(null!=t&&null!=e){var n="x"+t+"y"+e;return this._coordsMap[n]}q(t)&&(e=t.yAxisIndex,t=t.xAxisIndex);for(var i=0,r=this._coordsList;i<r.length;i++)if(r[i].getAxis("x").index===t||r[i].getAxis("y").index===e)return r[i]},t.prototype.getCartesians=function(){return this._coordsList.slice()},t.prototype.convertToPixel=function(t,e,n){var i=this._findConvertTarget(e);return i.cartesian?i.cartesian.dataToPoint(n):i.axis?i.axis.toGlobalCoord(i.axis.dataToCoord(n)):null},t.prototype.convertFromPixel=function(t,e,n){var i=this._findConvertTarget(e);return i.cartesian?i.cartesian.pointToData(n):i.axis?i.axis.coordToData(i.axis.toLocalCoord(n)):null},t.prototype._findConvertTarget=function(t){var e,n,i=t.seriesModel,r=t.xAxisModel||i&&i.getReferringComponents("xAxis",Co).models[0],o=t.yAxisModel||i&&i.getReferringComponents("yAxis",Co).models[0],a=t.gridModel,s=this._coordsList;if(i)P(s,e=i.coordinateSystem)<0&&(e=null);else if(r&&o)e=this.getCartesian(r.componentIndex,o.componentIndex);else if(r)n=this.getAxis("x",r.componentIndex);else if(o)n=this.getAxis("y",o.componentIndex);else if(a){a.coordinateSystem===this&&(e=this._coordsList[0])}return{cartesian:e,axis:n}},t.prototype.containPoint=function(t){var e=this._coordsList[0];if(e)return e.containPoint(t)},t.prototype._initCartesian=function(t,e,n){var i=this,r=this,o={left:!1,right:!1,top:!1,bottom:!1},a={x:{},y:{}},s={x:0,y:0};if(e.eachComponent("xAxis",l("x"),this),e.eachComponent("yAxis",l("y"),this),!s.x||!s.y)return this._axesMap={},void(this._axesList=[]);function l(e){return function(n,i){if(NM(n,t)){var l=n.get("position");"x"===e?"top"!==l&&"bottom"!==l&&(l=o.bottom?"top":"bottom"):"left"!==l&&"right"!==l&&(l=o.left?"right":"left"),o[l]=!0;var u=new DM(e,i_(n),[0,0],n.get("type"),l),h="category"===u.type;u.onBand=h&&n.get("boundaryGap"),u.inverse=n.get("inverse"),n.axis=u,u.model=n,u.grid=r,u.index=i,r._axesList.push(u),a[e][i]=u,s[e]++}}}this._axesMap=a,E(a.x,(function(e,n){E(a.y,(function(r,o){var a="x"+n+"y"+o,s=new CM(a);s.master=i,s.model=t,i._coordsMap[a]=s,i._coordsList.push(s),s.addAxis(e),s.addAxis(r)}))}))},t.prototype._updateScale=function(t,e){function n(t,e){E(u_(t,e.dim),(function(n){e.scale.unionExtentFromData(t,n)}))}E(this._axesList,(function(t){if(t.scale.setExtent(1/0,-1/0),"category"===t.type){var e=t.model.get("categorySortInfo");t.scale.setSortInfo(e)}})),t.eachSeries((function(t){if(kM(t)){var i=LM(t),r=i.xAxisModel,o=i.yAxisModel;if(!NM(r,e)||!NM(o,e))return;var a=this.getCartesian(r.componentIndex,o.componentIndex),s=t.getData(),l=a.getAxis("x"),u=a.getAxis("y");n(s,l),n(s,u)}}),this)},t.prototype.getTooltipAxes=function(t){var e=[],n=[];return E(this.getCartesians(),(function(i){var r=null!=t&&"auto"!==t?i.getAxis(t):i.getBaseAxis(),o=i.getOtherAxis(r);P(e,r)<0&&e.push(r),P(n,o)<0&&n.push(o)})),{baseAxes:e,otherAxes:n}},t.create=function(e,n){var i=[];return e.eachComponent("grid",(function(r,o){var a=new t(r,e,n);a.name="grid_"+o,a.resize(r,n,!0),r.coordinateSystem=a,i.push(a)})),e.eachSeries((function(t){if(kM(t)){var e=LM(t),n=e.xAxisModel,i=e.yAxisModel,r=n.getCoordSysModel();0;var o=r.coordinateSystem;t.coordinateSystem=o.getCartesian(n.componentIndex,i.componentIndex)}})),i},t.dimensions=IM,t}();function NM(t,e){return t.getCoordSysModel()===e}function EM(t,e,n,i){n.getAxesOnZeroOf=function(){return r?[r]:[]};var r,o=t[e],a=n.model,s=a.get(["axisLine","onZero"]),l=a.get(["axisLine","onZeroAxisIndex"]);if(s){if(null!=l)zM(o[l])&&(r=o[l]);else for(var u in o)if(o.hasOwnProperty(u)&&zM(o[u])&&!i[h(o[u])]){r=o[u];break}r&&(i[h(r)]=!0)}function h(t){return t.dim+"_"+t.index}}function zM(t){return t&&"category"!==t.type&&"time"!==t.type&&function(t){var e=t.scale.getExtent(),n=e[0],i=e[1];return!(n>0&&i>0||n<0&&i<0)}(t)}var VM=Math.PI,BM=function(){function t(t,e){this.group=new Cr,this.opt=e,this.axisModel=t,k(e,{labelOffset:0,nameDirection:1,tickDirection:1,labelDirection:1,silent:!0,handleAutoShown:function(){return!0}});var n=new Cr({x:e.position[0],y:e.position[1],rotation:e.rotation});n.updateTransform(),this._transformGroup=n}return t.prototype.hasBuilder=function(t){return!!FM[t]},t.prototype.add=function(t){FM[t](this.opt,this.axisModel,this.group,this._transformGroup)},t.prototype.getGroup=function(){return this.group},t.innerTextLayout=function(t,e,n){var i,r,o=Ur(e-t);return Xr(o)?(r=n>0?"top":"bottom",i="center"):Xr(o-VM)?(r=n>0?"bottom":"top",i="center"):(r="middle",i=o>0&&o<VM?n>0?"right":"left":n>0?"left":"right"),{rotation:o,textAlign:i,textVerticalAlign:r}},t.makeAxisEventDataBase=function(t){var e={componentType:t.mainType,componentIndex:t.componentIndex};return e[t.mainType+"Index"]=t.componentIndex,e},t.isLabelSilent=function(t){var e=t.get("tooltip");return t.get("silent")||!(t.get("triggerEvent")||e&&e.show)},t}(),FM={axisLine:function(t,e,n,i){var r=e.get(["axisLine","show"]);if("auto"===r&&t.handleAutoShown&&(r=t.handleAutoShown("axisLine")),r){var o=e.axis.getExtent(),a=i.transform,s=[o[0],0],l=[o[1],0];a&&(Ft(s,s,a),Ft(l,l,a));var u=A({lineCap:"round"},e.getModel(["axisLine","lineStyle"]).getLineStyle()),h=new Eu({subPixelOptimize:!0,shape:{x1:s[0],y1:s[1],x2:l[0],y2:l[1]},style:u,strokeContainThreshold:t.strokeContainThreshold||5,silent:!0,z2:1});h.anid="line",n.add(h);var c=e.get(["axisLine","symbol"]);if(null!=c){var p=e.get(["axisLine","symbolSize"]);X(c)&&(c=[c,c]),(X(p)||j(p))&&(p=[p,p]);var d=Py(e.get(["axisLine","symbolOffset"])||0,p),f=p[0],g=p[1];E([{rotate:t.rotation+Math.PI/2,offset:d[0],r:0},{rotate:t.rotation-Math.PI/2,offset:d[1],r:Math.sqrt((s[0]-l[0])*(s[0]-l[0])+(s[1]-l[1])*(s[1]-l[1]))}],(function(e,i){if("none"!==c[i]&&null!=c[i]){var r=ky(c[i],-f/2,-g/2,f,g,u.stroke,!0),o=e.r+e.offset;r.attr({rotation:e.rotate,x:s[0]+o*Math.cos(t.rotation),y:s[1]-o*Math.sin(t.rotation),silent:!0,z2:11}),n.add(r)}}))}}},axisTickLabel:function(t,e,n,i){var r=function(t,e,n,i){var r=n.axis,o=n.getModel("axisTick"),a=o.get("show");"auto"===a&&i.handleAutoShown&&(a=i.handleAutoShown("axisTick"));if(!a||r.scale.isBlank())return;for(var s=o.getModel("lineStyle"),l=i.tickDirection*o.get("length"),u=YM(r.getTicksCoords(),e.transform,l,k(s.getLineStyle(),{stroke:n.get(["axisLine","lineStyle","color"])}),"ticks"),h=0;h<u.length;h++)t.add(u[h]);return u}(n,i,e,t),o=function(t,e,n,i){var r=n.axis;if(!it(i.axisLabelShow,n.get(["axisLabel","show"]))||r.scale.isBlank())return;var o=n.getModel("axisLabel"),a=o.get("margin"),s=r.getViewLabels(),l=(it(i.labelRotate,o.get("rotate"))||0)*VM/180,u=BM.innerTextLayout(i.rotation,l,i.labelDirection),h=n.getCategories&&n.getCategories(!0),c=[],p=BM.isLabelSilent(n),d=n.get("triggerEvent");return E(s,(function(s,l){var f="ordinal"===r.scale.type?r.scale.getRawOrdinalNumber(s.tickValue):s.tickValue,g=s.formattedLabel,y=s.rawLabel,v=o;if(h&&h[f]){var m=h[f];q(m)&&m.textStyle&&(v=new pc(m.textStyle,o,n.ecModel))}var x=v.getTextColor()||n.get(["axisLine","lineStyle","color"]),_=r.dataToCoord(f),b=new As({x:_,y:i.labelOffset+i.labelDirection*a,rotation:u.rotation,silent:p,z2:10+(s.level||0),style:Yh(v,{text:g,align:v.getShallow("align",!0)||u.textAlign,verticalAlign:v.getShallow("verticalAlign",!0)||v.getShallow("baseline",!0)||u.textVerticalAlign,fill:U(x)?x("category"===r.type?y:"value"===r.type?f+"":f,l):x})});if(b.anid="label_"+f,d){var w=BM.makeAxisEventDataBase(n);w.targetType="axisLabel",w.value=y,Ws(b).eventData=w}e.add(b),b.updateTransform(),c.push(b),t.add(b),b.decomposeTransform()})),c}(n,i,e,t);(function(t,e,n){if(l_(t.axis))return;var i=t.get(["axisLabel","showMinLabel"]),r=t.get(["axisLabel","showMaxLabel"]);n=n||[];var o=(e=e||[])[0],a=e[1],s=e[e.length-1],l=e[e.length-2],u=n[0],h=n[1],c=n[n.length-1],p=n[n.length-2];!1===i?(GM(o),GM(u)):WM(o,a)&&(i?(GM(a),GM(h)):(GM(o),GM(u)));!1===r?(GM(s),GM(c)):WM(l,s)&&(r?(GM(l),GM(p)):(GM(s),GM(c)))}(e,o,r),function(t,e,n,i){var r=n.axis,o=n.getModel("minorTick");if(!o.get("show")||r.scale.isBlank())return;var a=r.getMinorTicksCoords();if(!a.length)return;for(var s=o.getModel("lineStyle"),l=i*o.get("length"),u=k(s.getLineStyle(),k(n.getModel("axisTick").getLineStyle(),{stroke:n.get(["axisLine","lineStyle","color"])})),h=0;h<a.length;h++)for(var c=YM(a[h],e.transform,l,u,"minorticks_"+h),p=0;p<c.length;p++)t.add(c[p])}(n,i,e,t.tickDirection),e.get(["axisLabel","hideOverlap"]))&&yb(db(z(o,(function(t){return{label:t,priority:t.z2,defaultAttr:{ignore:t.ignore}}}))))},axisName:function(t,e,n,i){var r=it(t.axisName,e.get("name"));if(r){var o,a,s=e.get("nameLocation"),l=t.nameDirection,u=e.getModel("nameTextStyle"),h=e.get("nameGap")||0,c=e.axis.getExtent(),p=c[0]>c[1]?-1:1,d=["start"===s?c[0]-p*h:"end"===s?c[1]+p*h:(c[0]+c[1])/2,HM(s)?t.labelOffset+l*h:0],f=e.get("nameRotate");null!=f&&(f=f*VM/180),HM(s)?o=BM.innerTextLayout(t.rotation,null!=f?f:t.rotation,l):(o=function(t,e,n,i){var r,o,a=Ur(n-t),s=i[0]>i[1],l="start"===e&&!s||"start"!==e&&s;Xr(a-VM/2)?(o=l?"bottom":"top",r="center"):Xr(a-1.5*VM)?(o=l?"top":"bottom",r="center"):(o="middle",r=a<1.5*VM&&a>VM/2?l?"left":"right":l?"right":"left");return{rotation:a,textAlign:r,textVerticalAlign:o}}(t.rotation,s,f||0,c),null!=(a=t.axisNameAvailableWidth)&&(a=Math.abs(a/Math.sin(o.rotation)),!isFinite(a)&&(a=null)));var g=u.getFont(),y=e.get("nameTruncate",!0)||{},v=y.ellipsis,m=it(t.nameTruncateMaxWidth,y.maxWidth,a),x=new As({x:d[0],y:d[1],rotation:o.rotation,silent:BM.isLabelSilent(e),style:Yh(u,{text:r,font:g,overflow:"truncate",width:m,ellipsis:v,fill:u.getTextColor()||e.get(["axisLine","lineStyle","color"]),align:u.get("align")||o.textAlign,verticalAlign:u.get("verticalAlign")||o.textVerticalAlign}),z2:1});if(Nh({el:x,componentModel:e,itemName:r}),x.__fullText=r,x.anid="name",e.get("triggerEvent")){var _=BM.makeAxisEventDataBase(e);_.targetType="axisName",_.name=r,Ws(x).eventData=_}i.add(x),x.updateTransform(),n.add(x),x.decomposeTransform()}}};function GM(t){t&&(t.ignore=!0)}function WM(t,e){var n=t&&t.getBoundingRect().clone(),i=e&&e.getBoundingRect().clone();if(n&&i){var r=Oi([]);return zi(r,r,-t.rotation),n.applyTransform(Ni([],r,t.getLocalTransform())),i.applyTransform(Ni([],r,e.getLocalTransform())),n.intersect(i)}}function HM(t){return"middle"===t||"center"===t}function YM(t,e,n,i,r){for(var o=[],a=[],s=[],l=0;l<t.length;l++){var u=t[l].coord;a[0]=u,a[1]=0,s[0]=u,s[1]=n,e&&(Ft(a,a,e),Ft(s,s,e));var h=new Eu({subPixelOptimize:!0,shape:{x1:a[0],y1:a[1],x2:s[0],y2:s[1]},style:i,z2:2,autoBatch:!0,silent:!0});h.anid=r+"_"+t[l].tickValue,o.push(h)}return o}function UM(t,e){var n={axesInfo:{},seriesInvolved:!1,coordSysAxesInfo:{},coordSysMap:{}};return function(t,e,n){var i=e.getComponent("tooltip"),r=e.getComponent("axisPointer"),o=r.get("link",!0)||[],a=[];E(n.getCoordinateSystems(),(function(n){if(n.axisPointerEnabled){var s=KM(n.model),l=t.coordSysAxesInfo[s]={};t.coordSysMap[s]=n;var u=n.model.getModel("tooltip",i);if(E(n.getAxes(),H(d,!1,null)),n.getTooltipAxes&&i&&u.get("show")){var h="axis"===u.get("trigger"),c="cross"===u.get(["axisPointer","type"]),p=n.getTooltipAxes(u.get(["axisPointer","axis"]));(h||c)&&E(p.baseAxes,H(d,!c||"cross",h)),c&&E(p.otherAxes,H(d,"cross",!1))}}function d(i,s,h){var c=h.model.getModel("axisPointer",r),p=c.get("show");if(p&&("auto"!==p||i||qM(c))){null==s&&(s=c.get("triggerTooltip"));var d=(c=i?function(t,e,n,i,r,o){var a=e.getModel("axisPointer"),s={};E(["type","snap","lineStyle","shadowStyle","label","animation","animationDurationUpdate","animationEasingUpdate","z"],(function(t){s[t]=T(a.get(t))})),s.snap="category"!==t.type&&!!o,"cross"===a.get("type")&&(s.type="line");var l=s.label||(s.label={});if(null==l.show&&(l.show=!1),"cross"===r){var u=a.get(["label","show"]);if(l.show=null==u||u,!o){var h=s.lineStyle=a.get("crossStyle");h&&k(l,h.textStyle)}}return t.model.getModel("axisPointer",new pc(s,n,i))}(h,u,r,e,i,s):c).get("snap"),f=KM(h.model),g=s||d||"category"===h.type,y=t.axesInfo[f]={key:f,axis:h,coordSys:n,axisPointerModel:c,triggerTooltip:s,involveSeries:g,snap:d,useHandle:qM(c),seriesModels:[],linkGroup:null};l[f]=y,t.seriesInvolved=t.seriesInvolved||g;var v=function(t,e){for(var n=e.model,i=e.dim,r=0;r<t.length;r++){var o=t[r]||{};if(XM(o[i+"AxisId"],n.id)||XM(o[i+"AxisIndex"],n.componentIndex)||XM(o[i+"AxisName"],n.name))return r}}(o,h);if(null!=v){var m=a[v]||(a[v]={axesInfo:{}});m.axesInfo[f]=y,m.mapper=o[v].mapper,y.linkGroup=m}}}}))}(n,t,e),n.seriesInvolved&&function(t,e){e.eachSeries((function(e){var n=e.coordinateSystem,i=e.get(["tooltip","trigger"],!0),r=e.get(["tooltip","show"],!0);n&&"none"!==i&&!1!==i&&"item"!==i&&!1!==r&&!1!==e.get(["axisPointer","show"],!0)&&E(t.coordSysAxesInfo[KM(n.model)],(function(t){var i=t.axis;n.getAxis(i.dim)===i&&(t.seriesModels.push(e),null==t.seriesDataCount&&(t.seriesDataCount=0),t.seriesDataCount+=e.getData().count())}))}))}(n,t),n}function XM(t,e){return"all"===t||Y(t)&&P(t,e)>=0||t===e}function ZM(t){var e=jM(t);if(e){var n=e.axisPointerModel,i=e.axis.scale,r=n.option,o=n.get("status"),a=n.get("value");null!=a&&(a=i.parse(a));var s=qM(n);null==o&&(r.status=s?"show":"hide");var l=i.getExtent().slice();l[0]>l[1]&&l.reverse(),(null==a||a>l[1])&&(a=l[1]),a<l[0]&&(a=l[0]),r.value=a,s&&(r.status=e.axis.scale.isBlank()?"hide":"show")}}function jM(t){var e=(t.ecModel.getComponent("axisPointer")||{}).coordSysAxesInfo;return e&&e.axesInfo[KM(t)]}function qM(t){return!!t.get(["handle","show"])}function KM(t){return t.type+"||"+t.id}var $M={},JM=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(e,n,i,r){this.axisPointerClass&&ZM(e),t.prototype.render.apply(this,arguments),this._doUpdateAxisPointerClass(e,i,!0)},e.prototype.updateAxisPointer=function(t,e,n,i){this._doUpdateAxisPointerClass(t,n,!1)},e.prototype.remove=function(t,e){var n=this._axisPointer;n&&n.remove(e)},e.prototype.dispose=function(e,n){this._disposeAxisPointer(n),t.prototype.dispose.apply(this,arguments)},e.prototype._doUpdateAxisPointerClass=function(t,n,i){var r=e.getAxisPointerClass(this.axisPointerClass);if(r){var o=function(t){var e=jM(t);return e&&e.axisPointerModel}(t);o?(this._axisPointer||(this._axisPointer=new r)).render(t,o,n,i):this._disposeAxisPointer(n)}},e.prototype._disposeAxisPointer=function(t){this._axisPointer&&this._axisPointer.dispose(t),this._axisPointer=null},e.registerAxisPointerClass=function(t,e){$M[t]=e},e.getAxisPointerClass=function(t){return t&&$M[t]},e.type="axis",e}(fg),QM=So();function tI(t,e,n,i){var r=n.axis;if(!r.scale.isBlank()){var o=n.getModel("splitArea"),a=o.getModel("areaStyle"),s=a.get("color"),l=i.coordinateSystem.getRect(),u=r.getTicksCoords({tickModel:o,clamp:!0});if(u.length){var h=s.length,c=QM(t).splitAreaColors,p=ft(),d=0;if(c)for(var f=0;f<u.length;f++){var g=c.get(u[f].tickValue);if(null!=g){d=(g+(h-1)*f)%h;break}}var y=r.toGlobalCoord(u[0].coord),v=a.getAreaStyle();s=Y(s)?s:[s];for(f=1;f<u.length;f++){var m=r.toGlobalCoord(u[f].coord),x=void 0,_=void 0,b=void 0,w=void 0;r.isHorizontal()?(x=y,_=l.y,b=m-x,w=l.height,y=x+b):(x=l.x,_=y,b=l.width,y=_+(w=m-_));var S=u[f-1].tickValue;null!=S&&p.set(S,d),e.add(new Ts({anid:null!=S?"area_"+S:null,shape:{x:x,y:_,width:b,height:w},style:k({fill:s[d]},v),autoBatch:!0,silent:!0})),d=(d+1)%h}QM(t).splitAreaColors=p}}}function eI(t){QM(t).splitAreaColors=null}var nI=["axisLine","axisTickLabel","axisName"],iI=["splitArea","splitLine","minorSplitLine"],rI=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.axisPointerClass="CartesianAxisPointer",n}return n(e,t),e.prototype.render=function(e,n,i,r){this.group.removeAll();var o=this._axisGroup;if(this._axisGroup=new Cr,this.group.add(this._axisGroup),e.get("show")){var a=e.getCoordSysModel(),s=AM(a,e),l=new BM(e,A({handleAutoShown:function(t){for(var n=a.coordinateSystem.getCartesians(),i=0;i<n.length;i++)if(sx(n[i].getOtherAxis(e.axis).scale))return!0;return!1}},s));E(nI,l.add,l),this._axisGroup.add(l.getGroup()),E(iI,(function(t){e.get([t,"show"])&&oI[t](this,this._axisGroup,e,a)}),this),r&&"changeAxisOrder"===r.type&&r.isInitSort||Dh(o,this._axisGroup,e),t.prototype.render.call(this,e,n,i,r)}},e.prototype.remove=function(){eI(this)},e.type="cartesianAxis",e}(JM),oI={splitLine:function(t,e,n,i){var r=n.axis;if(!r.scale.isBlank()){var o=n.getModel("splitLine"),a=o.getModel("lineStyle"),s=a.get("color");s=Y(s)?s:[s];for(var l=i.coordinateSystem.getRect(),u=r.isHorizontal(),h=0,c=r.getTicksCoords({tickModel:o}),p=[],d=[],f=a.getLineStyle(),g=0;g<c.length;g++){var y=r.toGlobalCoord(c[g].coord);u?(p[0]=y,p[1]=l.y,d[0]=y,d[1]=l.y+l.height):(p[0]=l.x,p[1]=y,d[0]=l.x+l.width,d[1]=y);var v=h++%s.length,m=c[g].tickValue;e.add(new Eu({anid:null!=m?"line_"+c[g].tickValue:null,subPixelOptimize:!0,autoBatch:!0,shape:{x1:p[0],y1:p[1],x2:d[0],y2:d[1]},style:k({stroke:s[v]},f),silent:!0}))}}},minorSplitLine:function(t,e,n,i){var r=n.axis,o=n.getModel("minorSplitLine").getModel("lineStyle"),a=i.coordinateSystem.getRect(),s=r.isHorizontal(),l=r.getMinorTicksCoords();if(l.length)for(var u=[],h=[],c=o.getLineStyle(),p=0;p<l.length;p++)for(var d=0;d<l[p].length;d++){var f=r.toGlobalCoord(l[p][d].coord);s?(u[0]=f,u[1]=a.y,h[0]=f,h[1]=a.y+a.height):(u[0]=a.x,u[1]=f,h[0]=a.x+a.width,h[1]=f),e.add(new Eu({anid:"minor_line_"+l[p][d].tickValue,subPixelOptimize:!0,autoBatch:!0,shape:{x1:u[0],y1:u[1],x2:h[0],y2:h[1]},style:c,silent:!0}))}},splitArea:function(t,e,n,i){tI(t,e,n,i)}},aI=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="xAxis",e}(rI),sI=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=aI.type,e}return n(e,t),e.type="yAxis",e}(rI),lI=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="grid",e}return n(e,t),e.prototype.render=function(t,e){this.group.removeAll(),t.get("show")&&this.group.add(new Ts({shape:t.coordinateSystem.getRect(),style:k({fill:t.get("backgroundColor")},t.getItemStyle()),silent:!0,z2:-1}))},e.type="grid",e}(fg),uI={offset:0};function hI(t){t.registerComponentView(lI),t.registerComponentModel(gM),t.registerCoordinateSystem("cartesian2d",RM),wM(t,"x",yM,uI),wM(t,"y",yM,uI),t.registerComponentView(aI),t.registerComponentView(sI),t.registerPreprocessor((function(t){t.xAxis&&t.yAxis&&!t.grid&&(t.grid={})}))}function cI(t){t.eachSeriesByType("radar",(function(t){var e=t.getData(),n=[],i=t.coordinateSystem;if(i){var r=i.getIndicatorAxes();E(r,(function(t,o){e.each(e.mapDimension(r[o].dim),(function(t,e){n[e]=n[e]||[];var r=i.dataToPoint(t,o);n[e][o]=pI(r)?r:dI(i)}))})),e.each((function(t){var r=F(n[t],(function(t){return pI(t)}))||dI(i);n[t].push(r.slice()),e.setItemLayout(t,n[t])}))}}))}function pI(t){return!isNaN(t[0])&&!isNaN(t[1])}function dI(t){return[t.cx,t.cy]}function fI(t){var e=t.polar;if(e){Y(e)||(e=[e]);var n=[];E(e,(function(e,i){e.indicator?(e.type&&!e.shape&&(e.shape=e.type),t.radar=t.radar||[],Y(t.radar)||(t.radar=[t.radar]),t.radar.push(e)):n.push(e)})),t.polar=n}E(t.series,(function(t){t&&"radar"===t.type&&t.polarIndex&&(t.radarIndex=t.polarIndex)}))}var gI=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=t.coordinateSystem,r=this.group,o=t.getData(),a=this._data;function s(t,e){var n=t.getItemVisual(e,"symbol")||"circle";if("none"!==n){var i=Ly(t.getItemVisual(e,"symbolSize")),r=ky(n,-1,-1,2,2),o=t.getItemVisual(e,"symbolRotate")||0;return r.attr({style:{strokeNoScale:!0},z2:100,scaleX:i[0]/2,scaleY:i[1]/2,rotation:o*Math.PI/180||0}),r}}function l(e,n,i,r,o,a){i.removeAll();for(var l=0;l<n.length-1;l++){var u=s(r,o);u&&(u.__dimIdx=l,e[l]?(u.setPosition(e[l]),Vh[a?"initProps":"updateProps"](u,{x:n[l][0],y:n[l][1]},t,o)):u.setPosition(n[l]),i.add(u))}}function u(t){return z(t,(function(t){return[i.cx,i.cy]}))}o.diff(a).add((function(e){var n=o.getItemLayout(e);if(n){var i=new Lu,r=new Ou,a={shape:{points:n}};i.shape.points=u(n),r.shape.points=u(n),rh(i,a,t,e),rh(r,a,t,e);var s=new Cr,h=new Cr;s.add(r),s.add(i),s.add(h),l(r.shape.points,n,h,o,e,!0),o.setItemGraphicEl(e,s)}})).update((function(e,n){var i=a.getItemGraphicEl(n),r=i.childAt(0),s=i.childAt(1),u=i.childAt(2),h={shape:{points:o.getItemLayout(e)}};h.shape.points&&(l(r.shape.points,h.shape.points,u,o,e,!1),uh(s),uh(r),ih(r,h,t),ih(s,h,t),o.setItemGraphicEl(e,i))})).remove((function(t){r.remove(a.getItemGraphicEl(t))})).execute(),o.eachItemGraphicEl((function(t,e){var n=o.getItemModel(e),i=t.childAt(0),a=t.childAt(1),s=t.childAt(2),l=o.getItemVisual(e,"style"),u=l.fill;r.add(t),i.useStyle(k(n.getModel("lineStyle").getLineStyle(),{fill:"none",stroke:u})),zl(i,n,"lineStyle"),zl(a,n,"areaStyle");var h=n.getModel("areaStyle"),c=h.isEmpty()&&h.parentModel.isEmpty();a.ignore=c,E(["emphasis","select","blur"],(function(t){var e=n.getModel([t,"areaStyle"]),i=e.isEmpty()&&e.parentModel.isEmpty();a.ensureState(t).ignore=i&&c})),a.useStyle(k(h.getAreaStyle(),{fill:u,opacity:.7,decal:l.decal}));var p=n.getModel("emphasis"),d=p.getModel("itemStyle").getItemStyle();s.eachChild((function(t){if(t instanceof xs){var i=t.style;t.useStyle(A({image:i.image,x:i.x,y:i.y,width:i.width,height:i.height},l))}else t.useStyle(l),t.setColor(u),t.style.strokeNoScale=!0;t.ensureState("emphasis").style=T(d);var r=o.getStore().get(o.getDimensionIndex(t.__dimIdx),e);(null==r||isNaN(r))&&(r=""),Wh(t,Hh(n),{labelFetcher:o.hostModel,labelDataIndex:e,labelDimIndex:t.__dimIdx,defaultText:r,inheritColor:u,defaultOpacity:l.opacity})})),Ol(t,p.get("focus"),p.get("blurScope"),p.get("disabled"))})),this._data=o},e.prototype.remove=function(){this.group.removeAll(),this._data=null},e.type="radar",e}(mg),yI=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.hasSymbolVisual=!0,n}return n(e,t),e.prototype.init=function(e){t.prototype.init.apply(this,arguments),this.legendVisualProvider=new lM(W(this.getData,this),W(this.getRawData,this))},e.prototype.getInitialData=function(t,e){return sM(this,{generateCoord:"indicator_",generateCoordCount:1/0})},e.prototype.formatTooltip=function(t,e,n){var i=this.getData(),r=this.coordinateSystem.getIndicatorAxes(),o=this.getData().getName(t),a=""===o?this.name:o,s=tg(this,t);return Uf("section",{header:a,sortBlocks:!0,blocks:z(r,(function(e){var n=i.get(i.mapDimension(e.dim),t);return Uf("nameValue",{markerType:"subItem",markerColor:s,name:e.name,value:n,sortParam:n})}))})},e.prototype.getTooltipPosition=function(t){if(null!=t)for(var e=this.getData(),n=this.coordinateSystem,i=e.getValues(z(n.dimensions,(function(t){return e.mapDimension(t)})),t),r=0,o=i.length;r<o;r++)if(!isNaN(i[r])){var a=n.getIndicatorAxes();return n.coordToPoint(a[r].dataToCoord(i[r]),r)}},e.type="series.radar",e.dependencies=["radar"],e.defaultOption={z:2,colorBy:"data",coordinateSystem:"radar",legendHoverLink:!0,radarIndex:0,lineStyle:{width:2,type:"solid",join:"round"},label:{position:"top"},symbolSize:8},e}(ag),vI=_M.value;function mI(t,e){return k({show:e},t)}var xI=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.optionUpdated=function(){var t=this.get("boundaryGap"),e=this.get("splitNumber"),n=this.get("scale"),i=this.get("axisLine"),r=this.get("axisTick"),o=this.get("axisLabel"),a=this.get("axisName"),s=this.get(["axisName","show"]),l=this.get(["axisName","formatter"]),u=this.get("axisNameGap"),h=this.get("triggerEvent"),c=z(this.get("indicator")||[],(function(c){null!=c.max&&c.max>0&&!c.min?c.min=0:null!=c.min&&c.min<0&&!c.max&&(c.max=0);var p=a;null!=c.color&&(p=k({color:c.color},a));var d=C(T(c),{boundaryGap:t,splitNumber:e,scale:n,axisLine:i,axisTick:r,axisLabel:o,name:c.text,showName:s,nameLocation:"end",nameGap:u,nameTextStyle:p,triggerEvent:h},!1);if(s||(d.name=""),X(l)){var f=d.name;d.name=l.replace("{value}",null!=f?f:"")}else U(l)&&(d.name=l(d.name,d));var g=new pc(d,null,this.ecModel);return R(g,h_.prototype),g.mainType="radar",g.componentIndex=this.componentIndex,g}),this);this._indicatorModels=c},e.prototype.getIndicatorModels=function(){return this._indicatorModels},e.type="radar",e.defaultOption={z:0,center:["50%","50%"],radius:"75%",startAngle:90,axisName:{show:!0},boundaryGap:[0,0],splitNumber:5,axisNameGap:15,scale:!1,shape:"polygon",axisLine:C({lineStyle:{color:"#bbb"}},vI.axisLine),axisLabel:mI(vI.axisLabel,!1),axisTick:mI(vI.axisTick,!1),splitLine:mI(vI.splitLine,!0),splitArea:mI(vI.splitArea,!0),indicator:[]},e}(Ip),_I=["axisLine","axisTickLabel","axisName"],bI=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){this.group.removeAll(),this._buildAxes(t),this._buildSplitLineAndArea(t)},e.prototype._buildAxes=function(t){var e=t.coordinateSystem;E(z(e.getIndicatorAxes(),(function(t){var n=t.model.get("showName")?t.name:"";return new BM(t.model,{axisName:n,position:[e.cx,e.cy],rotation:t.angle,labelDirection:-1,tickDirection:-1,nameDirection:1})})),(function(t){E(_I,t.add,t),this.group.add(t.getGroup())}),this)},e.prototype._buildSplitLineAndArea=function(t){var e=t.coordinateSystem,n=e.getIndicatorAxes();if(n.length){var i=t.get("shape"),r=t.getModel("splitLine"),o=t.getModel("splitArea"),a=r.getModel("lineStyle"),s=o.getModel("areaStyle"),l=r.get("show"),u=o.get("show"),h=a.get("color"),c=s.get("color"),p=Y(h)?h:[h],d=Y(c)?c:[c],f=[],g=[];if("circle"===i)for(var y=n[0].getTicksCoords(),v=e.cx,m=e.cy,x=0;x<y.length;x++){if(l)f[C(f,p,x)].push(new uu({shape:{cx:v,cy:m,r:y[x].coord}}));if(u&&x<y.length-1)g[C(g,d,x)].push(new Du({shape:{cx:v,cy:m,r0:y[x].coord,r:y[x+1].coord}}))}else{var _,b=z(n,(function(t,n){var i=t.getTicksCoords();return _=null==_?i.length-1:Math.min(i.length-1,_),z(i,(function(t){return e.coordToPoint(t.coord,n)}))})),w=[];for(x=0;x<=_;x++){for(var S=[],M=0;M<n.length;M++)S.push(b[M][x]);if(S[0]&&S.push(S[0].slice()),l)f[C(f,p,x)].push(new Ou({shape:{points:S}}));if(u&&w)g[C(g,d,x-1)].push(new Lu({shape:{points:S.concat(w)}}));w=S.slice().reverse()}}var I=a.getLineStyle(),T=s.getAreaStyle();E(g,(function(t,e){this.group.add(bh(t,{style:k({stroke:"none",fill:d[e%d.length]},T),silent:!0}))}),this),E(f,(function(t,e){this.group.add(bh(t,{style:k({fill:"none",stroke:p[e%p.length]},I),silent:!0}))}),this)}function C(t,e,n){var i=n%e.length;return t[i]=t[i]||[],i}},e.type="radar",e}(fg),wI=function(t){function e(e,n,i){var r=t.call(this,e,n,i)||this;return r.type="value",r.angle=0,r.name="",r}return n(e,t),e}(G_),SI=function(){function t(t,e,n){this.dimensions=[],this._model=t,this._indicatorAxes=z(t.getIndicatorModels(),(function(t,e){var n="indicator_"+e,i=new wI(n,new vx);return i.name=t.get("name"),i.model=t,t.axis=i,this.dimensions.push(n),i}),this),this.resize(t,n)}return t.prototype.getIndicatorAxes=function(){return this._indicatorAxes},t.prototype.dataToPoint=function(t,e){var n=this._indicatorAxes[e];return this.coordToPoint(n.dataToCoord(t),e)},t.prototype.coordToPoint=function(t,e){var n=this._indicatorAxes[e].angle;return[this.cx+t*Math.cos(n),this.cy-t*Math.sin(n)]},t.prototype.pointToData=function(t){var e=t[0]-this.cx,n=t[1]-this.cy,i=Math.sqrt(e*e+n*n);e/=i,n/=i;for(var r,o=Math.atan2(-n,e),a=1/0,s=-1,l=0;l<this._indicatorAxes.length;l++){var u=this._indicatorAxes[l],h=Math.abs(o-u.angle);h<a&&(r=u,s=l,a=h)}return[s,+(r&&r.coordToData(i))]},t.prototype.resize=function(t,e){var n=t.get("center"),i=e.getWidth(),r=e.getHeight(),o=Math.min(i,r)/2;this.cx=Er(n[0],i),this.cy=Er(n[1],r),this.startAngle=t.get("startAngle")*Math.PI/180;var a=t.get("radius");(X(a)||j(a))&&(a=[0,a]),this.r0=Er(a[0],o),this.r=Er(a[1],o),E(this._indicatorAxes,(function(t,e){t.setExtent(this.r0,this.r);var n=this.startAngle+e*Math.PI*2/this._indicatorAxes.length;n=Math.atan2(Math.sin(n),Math.cos(n)),t.angle=n}),this)},t.prototype.update=function(t,e){var n=this._indicatorAxes,i=this._model;E(n,(function(t){t.scale.setExtent(1/0,-1/0)})),t.eachSeriesByType("radar",(function(e,r){if("radar"===e.get("coordinateSystem")&&t.getComponent("radar",e.get("radarIndex"))===i){var o=e.getData();E(n,(function(t){t.scale.unionExtentFromData(o,o.mapDimension(t.dim))}))}}),this);var r=i.get("splitNumber"),o=new vx;o.setExtent(0,r),o.setInterval(1),E(n,(function(t,e){OM(t.scale,t.model,o)}))},t.prototype.convertToPixel=function(t,e,n){return console.warn("Not implemented."),null},t.prototype.convertFromPixel=function(t,e,n){return console.warn("Not implemented."),null},t.prototype.containPoint=function(t){return console.warn("Not implemented."),!1},t.create=function(e,n){var i=[];return e.eachComponent("radar",(function(r){var o=new t(r,e,n);i.push(o),r.coordinateSystem=o})),e.eachSeriesByType("radar",(function(t){"radar"===t.get("coordinateSystem")&&(t.coordinateSystem=i[t.get("radarIndex")||0])})),i},t.dimensions=[],t}();function MI(t){t.registerCoordinateSystem("radar",SI),t.registerComponentModel(xI),t.registerComponentView(bI),t.registerVisual({seriesType:"radar",reset:function(t){var e=t.getData();e.each((function(t){e.setItemVisual(t,"legendIcon","roundRect")})),e.setVisual("legendIcon","roundRect")}})}var II="\0_ec_interaction_mutex";function TI(t,e){return!!CI(t)[e]}function CI(t){return t[II]||(t[II]={})}um({type:"takeGlobalCursor",event:"globalCursorTaken",update:"update"},xt);var DI=function(t){function e(e){var n=t.call(this)||this;n._zr=e;var i=W(n._mousedownHandler,n),r=W(n._mousemoveHandler,n),o=W(n._mouseupHandler,n),a=W(n._mousewheelHandler,n),s=W(n._pinchHandler,n);return n.enable=function(t,n){this.disable(),this._opt=k(T(n)||{},{zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!1,preventDefaultMouseMove:!0}),null==t&&(t=!0),!0!==t&&"move"!==t&&"pan"!==t||(e.on("mousedown",i),e.on("mousemove",r),e.on("mouseup",o)),!0!==t&&"scale"!==t&&"zoom"!==t||(e.on("mousewheel",a),e.on("pinch",s))},n.disable=function(){e.off("mousedown",i),e.off("mousemove",r),e.off("mouseup",o),e.off("mousewheel",a),e.off("pinch",s)},n}return n(e,t),e.prototype.isDragging=function(){return this._dragging},e.prototype.isPinching=function(){return this._pinching},e.prototype.setPointerChecker=function(t){this.pointerChecker=t},e.prototype.dispose=function(){this.disable()},e.prototype._mousedownHandler=function(t){if(!(le(t)||t.target&&t.target.draggable)){var e=t.offsetX,n=t.offsetY;this.pointerChecker&&this.pointerChecker(t,e,n)&&(this._x=e,this._y=n,this._dragging=!0)}},e.prototype._mousemoveHandler=function(t){if(this._dragging&&LI("moveOnMouseMove",t,this._opt)&&"pinch"!==t.gestureEvent&&!TI(this._zr,"globalPan")){var e=t.offsetX,n=t.offsetY,i=this._x,r=this._y,o=e-i,a=n-r;this._x=e,this._y=n,this._opt.preventDefaultMouseMove&&se(t.event),kI(this,"pan","moveOnMouseMove",t,{dx:o,dy:a,oldX:i,oldY:r,newX:e,newY:n,isAvailableBehavior:null})}},e.prototype._mouseupHandler=function(t){le(t)||(this._dragging=!1)},e.prototype._mousewheelHandler=function(t){var e=LI("zoomOnMouseWheel",t,this._opt),n=LI("moveOnMouseWheel",t,this._opt),i=t.wheelDelta,r=Math.abs(i),o=t.offsetX,a=t.offsetY;if(0!==i&&(e||n)){if(e){var s=r>3?1.4:r>1?1.2:1.1;AI(this,"zoom","zoomOnMouseWheel",t,{scale:i>0?s:1/s,originX:o,originY:a,isAvailableBehavior:null})}if(n){var l=Math.abs(i);AI(this,"scrollMove","moveOnMouseWheel",t,{scrollDelta:(i>0?1:-1)*(l>3?.4:l>1?.15:.05),originX:o,originY:a,isAvailableBehavior:null})}}},e.prototype._pinchHandler=function(t){TI(this._zr,"globalPan")||AI(this,"zoom",null,t,{scale:t.pinchScale>1?1.1:1/1.1,originX:t.pinchX,originY:t.pinchY,isAvailableBehavior:null})},e}(Xt);function AI(t,e,n,i,r){t.pointerChecker&&t.pointerChecker(i,r.originX,r.originY)&&(se(i.event),kI(t,e,n,i,r))}function kI(t,e,n,i,r){r.isAvailableBehavior=W(LI,null,n,i),t.trigger(e,r)}function LI(t,e,n){var i=n[t];return!t||i&&(!X(i)||e.event[i+"Key"])}function PI(t,e,n){var i=t.target;i.x+=e,i.y+=n,i.dirty()}function OI(t,e,n,i){var r=t.target,o=t.zoomLimit,a=t.zoom=t.zoom||1;if(a*=e,o){var s=o.min||0,l=o.max||1/0;a=Math.max(Math.min(l,a),s)}var u=a/t.zoom;t.zoom=a,r.x-=(n-r.x)*(u-1),r.y-=(i-r.y)*(u-1),r.scaleX*=u,r.scaleY*=u,r.dirty()}var RI,NI={axisPointer:1,tooltip:1,brush:1};function EI(t,e,n){var i=e.getComponentByElement(t.topTarget),r=i&&i.coordinateSystem;return i&&i!==n&&!NI.hasOwnProperty(i.mainType)&&r&&r.model!==n}function zI(t){X(t)&&(t=(new DOMParser).parseFromString(t,"text/xml"));var e=t;for(9===e.nodeType&&(e=e.firstChild);"svg"!==e.nodeName.toLowerCase()||1!==e.nodeType;)e=e.nextSibling;return e}var VI={fill:"fill",stroke:"stroke","stroke-width":"lineWidth",opacity:"opacity","fill-opacity":"fillOpacity","stroke-opacity":"strokeOpacity","stroke-dasharray":"lineDash","stroke-dashoffset":"lineDashOffset","stroke-linecap":"lineCap","stroke-linejoin":"lineJoin","stroke-miterlimit":"miterLimit","font-family":"fontFamily","font-size":"fontSize","font-style":"fontStyle","font-weight":"fontWeight","text-anchor":"textAlign",visibility:"visibility",display:"display"},BI=G(VI),FI={"alignment-baseline":"textBaseline","stop-color":"stopColor"},GI=G(FI),WI=function(){function t(){this._defs={},this._root=null}return t.prototype.parse=function(t,e){e=e||{};var n=zI(t);this._defsUsePending=[];var i=new Cr;this._root=i;var r=[],o=n.getAttribute("viewBox")||"",a=parseFloat(n.getAttribute("width")||e.width),s=parseFloat(n.getAttribute("height")||e.height);isNaN(a)&&(a=null),isNaN(s)&&(s=null),jI(n,i,null,!0,!1);for(var l,u,h=n.firstChild;h;)this._parseNode(h,i,r,null,!1,!1),h=h.nextSibling;if(function(t,e){for(var n=0;n<e.length;n++){var i=e[n];i[0].style[i[1]]=t[i[2]]}}(this._defs,this._defsUsePending),this._defsUsePending=[],o){var c=JI(o);c.length>=4&&(l={x:parseFloat(c[0]||0),y:parseFloat(c[1]||0),width:parseFloat(c[2]),height:parseFloat(c[3])})}if(l&&null!=a&&null!=s&&(u=iT(l,{x:0,y:0,width:a,height:s}),!e.ignoreViewBox)){var p=i;(i=new Cr).add(p),p.scaleX=p.scaleY=u.scale,p.x=u.x,p.y=u.y}return e.ignoreRootClip||null==a||null==s||i.setClipPath(new Ts({shape:{x:0,y:0,width:a,height:s}})),{root:i,width:a,height:s,viewBoxRect:l,viewBoxTransform:u,named:r}},t.prototype._parseNode=function(t,e,n,i,r,o){var a,s=t.nodeName.toLowerCase(),l=i;if("defs"===s&&(r=!0),"text"===s&&(o=!0),"defs"===s||"switch"===s)a=e;else{if(!r){var u=RI[s];if(u&&mt(RI,s)){a=u.call(this,t,e);var h=t.getAttribute("name");if(h){var c={name:h,namedFrom:null,svgNodeTagLower:s,el:a};n.push(c),"g"===s&&(l=c)}else i&&n.push({name:i.name,namedFrom:i,svgNodeTagLower:s,el:a});e.add(a)}}var p=HI[s];if(p&&mt(HI,s)){var d=p.call(this,t),f=t.getAttribute("id");f&&(this._defs[f]=d)}}if(a&&a.isGroup)for(var g=t.firstChild;g;)1===g.nodeType?this._parseNode(g,a,n,l,r,o):3===g.nodeType&&o&&this._parseText(g,a),g=g.nextSibling},t.prototype._parseText=function(t,e){var n=new ys({style:{text:t.textContent},silent:!0,x:this._textX||0,y:this._textY||0});XI(e,n),jI(t,n,this._defsUsePending,!1,!1),function(t,e){var n=e.__selfStyle;if(n){var i=n.textBaseline,r=i;i&&"auto"!==i?"baseline"===i?r="alphabetic":"before-edge"===i||"text-before-edge"===i?r="top":"after-edge"===i||"text-after-edge"===i?r="bottom":"central"!==i&&"mathematical"!==i||(r="middle"):r="alphabetic",t.style.textBaseline=r}var o=e.__inheritedStyle;if(o){var a=o.textAlign,s=a;a&&("middle"===a&&(s="center"),t.style.textAlign=s)}}(n,e);var i=n.style,r=i.fontSize;r&&r<9&&(i.fontSize=9,n.scaleX*=r/9,n.scaleY*=r/9);var o=(i.fontSize||i.fontFamily)&&[i.fontStyle,i.fontWeight,(i.fontSize||12)+"px",i.fontFamily||"sans-serif"].join(" ");i.font=o;var a=n.getBoundingRect();return this._textX+=a.width,e.add(n),n},t.internalField=void(RI={g:function(t,e){var n=new Cr;return XI(e,n),jI(t,n,this._defsUsePending,!1,!1),n},rect:function(t,e){var n=new Ts;return XI(e,n),jI(t,n,this._defsUsePending,!1,!1),n.setShape({x:parseFloat(t.getAttribute("x")||"0"),y:parseFloat(t.getAttribute("y")||"0"),width:parseFloat(t.getAttribute("width")||"0"),height:parseFloat(t.getAttribute("height")||"0")}),n.silent=!0,n},circle:function(t,e){var n=new uu;return XI(e,n),jI(t,n,this._defsUsePending,!1,!1),n.setShape({cx:parseFloat(t.getAttribute("cx")||"0"),cy:parseFloat(t.getAttribute("cy")||"0"),r:parseFloat(t.getAttribute("r")||"0")}),n.silent=!0,n},line:function(t,e){var n=new Eu;return XI(e,n),jI(t,n,this._defsUsePending,!1,!1),n.setShape({x1:parseFloat(t.getAttribute("x1")||"0"),y1:parseFloat(t.getAttribute("y1")||"0"),x2:parseFloat(t.getAttribute("x2")||"0"),y2:parseFloat(t.getAttribute("y2")||"0")}),n.silent=!0,n},ellipse:function(t,e){var n=new cu;return XI(e,n),jI(t,n,this._defsUsePending,!1,!1),n.setShape({cx:parseFloat(t.getAttribute("cx")||"0"),cy:parseFloat(t.getAttribute("cy")||"0"),rx:parseFloat(t.getAttribute("rx")||"0"),ry:parseFloat(t.getAttribute("ry")||"0")}),n.silent=!0,n},polygon:function(t,e){var n,i=t.getAttribute("points");i&&(n=ZI(i));var r=new Lu({shape:{points:n||[]},silent:!0});return XI(e,r),jI(t,r,this._defsUsePending,!1,!1),r},polyline:function(t,e){var n,i=t.getAttribute("points");i&&(n=ZI(i));var r=new Ou({shape:{points:n||[]},silent:!0});return XI(e,r),jI(t,r,this._defsUsePending,!1,!1),r},image:function(t,e){var n=new xs;return XI(e,n),jI(t,n,this._defsUsePending,!1,!1),n.setStyle({image:t.getAttribute("xlink:href")||t.getAttribute("href"),x:+t.getAttribute("x"),y:+t.getAttribute("y"),width:+t.getAttribute("width"),height:+t.getAttribute("height")}),n.silent=!0,n},text:function(t,e){var n=t.getAttribute("x")||"0",i=t.getAttribute("y")||"0",r=t.getAttribute("dx")||"0",o=t.getAttribute("dy")||"0";this._textX=parseFloat(n)+parseFloat(r),this._textY=parseFloat(i)+parseFloat(o);var a=new Cr;return XI(e,a),jI(t,a,this._defsUsePending,!1,!0),a},tspan:function(t,e){var n=t.getAttribute("x"),i=t.getAttribute("y");null!=n&&(this._textX=parseFloat(n)),null!=i&&(this._textY=parseFloat(i));var r=t.getAttribute("dx")||"0",o=t.getAttribute("dy")||"0",a=new Cr;return XI(e,a),jI(t,a,this._defsUsePending,!1,!0),this._textX+=parseFloat(r),this._textY+=parseFloat(o),a},path:function(t,e){var n=au(t.getAttribute("d")||"");return XI(e,n),jI(t,n,this._defsUsePending,!1,!1),n.silent=!0,n}}),t}(),HI={lineargradient:function(t){var e=parseInt(t.getAttribute("x1")||"0",10),n=parseInt(t.getAttribute("y1")||"0",10),i=parseInt(t.getAttribute("x2")||"10",10),r=parseInt(t.getAttribute("y2")||"0",10),o=new Uu(e,n,i,r);return YI(t,o),UI(t,o),o},radialgradient:function(t){var e=parseInt(t.getAttribute("cx")||"0",10),n=parseInt(t.getAttribute("cy")||"0",10),i=parseInt(t.getAttribute("r")||"0",10),r=new Xu(e,n,i);return YI(t,r),UI(t,r),r}};function YI(t,e){"userSpaceOnUse"===t.getAttribute("gradientUnits")&&(e.global=!0)}function UI(t,e){for(var n=t.firstChild;n;){if(1===n.nodeType&&"stop"===n.nodeName.toLocaleLowerCase()){var i=n.getAttribute("offset"),r=void 0;r=i&&i.indexOf("%")>0?parseInt(i,10)/100:i?parseFloat(i):0;var o={};nT(n,o,o);var a=o.stopColor||n.getAttribute("stop-color")||"#000000";e.colorStops.push({offset:r,color:a})}n=n.nextSibling}}function XI(t,e){t&&t.__inheritedStyle&&(e.__inheritedStyle||(e.__inheritedStyle={}),k(e.__inheritedStyle,t.__inheritedStyle))}function ZI(t){for(var e=JI(t),n=[],i=0;i<e.length;i+=2){var r=parseFloat(e[i]),o=parseFloat(e[i+1]);n.push([r,o])}return n}function jI(t,e,n,i,r){var o=e,a=o.__inheritedStyle=o.__inheritedStyle||{},s={};1===t.nodeType&&(function(t,e){var n=t.getAttribute("transform");if(n){n=n.replace(/,/g," ");var i=[],r=null;n.replace(QI,(function(t,e,n){return i.push(e,n),""}));for(var o=i.length-1;o>0;o-=2){var a=i[o],s=i[o-1],l=JI(a);switch(r=r||[1,0,0,1,0,0],s){case"translate":Ei(r,r,[parseFloat(l[0]),parseFloat(l[1]||"0")]);break;case"scale":Vi(r,r,[parseFloat(l[0]),parseFloat(l[1]||l[0])]);break;case"rotate":zi(r,r,-parseFloat(l[0])*tT);break;case"skewX":Ni(r,[1,0,Math.tan(parseFloat(l[0])*tT),1,0,0],r);break;case"skewY":Ni(r,[1,Math.tan(parseFloat(l[0])*tT),0,1,0,0],r);break;case"matrix":r[0]=parseFloat(l[0]),r[1]=parseFloat(l[1]),r[2]=parseFloat(l[2]),r[3]=parseFloat(l[3]),r[4]=parseFloat(l[4]),r[5]=parseFloat(l[5])}}e.setLocalTransform(r)}}(t,e),nT(t,a,s),i||function(t,e,n){for(var i=0;i<BI.length;i++){var r=BI[i];null!=(o=t.getAttribute(r))&&(e[VI[r]]=o)}for(i=0;i<GI.length;i++){var o;r=GI[i];null!=(o=t.getAttribute(r))&&(n[FI[r]]=o)}}(t,a,s)),o.style=o.style||{},null!=a.fill&&(o.style.fill=KI(o,"fill",a.fill,n)),null!=a.stroke&&(o.style.stroke=KI(o,"stroke",a.stroke,n)),E(["lineWidth","opacity","fillOpacity","strokeOpacity","miterLimit","fontSize"],(function(t){null!=a[t]&&(o.style[t]=parseFloat(a[t]))})),E(["lineDashOffset","lineCap","lineJoin","fontWeight","fontFamily","fontStyle","textAlign"],(function(t){null!=a[t]&&(o.style[t]=a[t])})),r&&(o.__selfStyle=s),a.lineDash&&(o.style.lineDash=z(JI(a.lineDash),(function(t){return parseFloat(t)}))),"hidden"!==a.visibility&&"collapse"!==a.visibility||(o.invisible=!0),"none"===a.display&&(o.ignore=!0)}var qI=/^url\(\s*#(.*?)\)/;function KI(t,e,n,i){var r=n&&n.match(qI);if(!r)return"none"===n&&(n=null),n;var o=ut(r[1]);i.push([t,e,o])}var $I=/-?([0-9]*\.)?[0-9]+([eE]-?[0-9]+)?/g;function JI(t){return t.match($I)||[]}var QI=/(translate|scale|rotate|skewX|skewY|matrix)\(([\-\s0-9\.eE,]*)\)/g,tT=Math.PI/180;var eT=/([^\s:;]+)\s*:\s*([^:;]+)/g;function nT(t,e,n){var i,r=t.getAttribute("style");if(r)for(eT.lastIndex=0;null!=(i=eT.exec(r));){var o=i[1],a=mt(VI,o)?VI[o]:null;a&&(e[a]=i[2]);var s=mt(FI,o)?FI[o]:null;s&&(n[s]=i[2])}}function iT(t,e){var n=e.width/t.width,i=e.height/t.height,r=Math.min(n,i);return{scale:r,x:-(t.x+t.width/2)*r+(e.x+e.width/2),y:-(t.y+t.height/2)*r+(e.y+e.height/2)}}var rT=ft(["rect","circle","line","ellipse","polygon","polyline","path","text","tspan","g"]),oT=function(){function t(t,e){this.type="geoSVG",this._usedGraphicMap=ft(),this._freedGraphics=[],this._mapName=t,this._parsedXML=zI(e)}return t.prototype.load=function(){var t=this._firstGraphic;if(!t){t=this._firstGraphic=this._buildGraphic(this._parsedXML),this._freedGraphics.push(t),this._boundingRect=this._firstGraphic.boundingRect.clone();var e=function(t){var e=[],n=ft();return E(t,(function(t){if(null==t.namedFrom){var i=new w_(t.name,t.el);e.push(i),n.set(t.name,i)}})),{regions:e,regionsMap:n}}(t.named),n=e.regions,i=e.regionsMap;this._regions=n,this._regionsMap=i}return{boundingRect:this._boundingRect,regions:this._regions,regionsMap:this._regionsMap}},t.prototype._buildGraphic=function(t){var e,n,i,r;try{lt(null!=(n=(e=t&&(i=t,r={ignoreViewBox:!0,ignoreRootClip:!0},(new WI).parse(i,r))||{}).root))}catch(t){throw new Error("Invalid svg format\n"+t.message)}var o=new Cr;o.add(n),o.isGeoSVGGraphicRoot=!0;var a=e.width,s=e.height,l=e.viewBoxRect,u=this._boundingRect;if(!u){var h=void 0,c=void 0,p=void 0,d=void 0;if(null!=a?(h=0,p=a):l&&(h=l.x,p=l.width),null!=s?(c=0,d=s):l&&(c=l.y,d=l.height),null==h||null==c){var f=n.getBoundingRect();null==h&&(h=f.x,p=f.width),null==c&&(c=f.y,d=f.height)}u=this._boundingRect=new sr(h,c,p,d)}if(l){var g=iT(l,u);n.scaleX=n.scaleY=g.scale,n.x=g.x,n.y=g.y}o.setClipPath(new Ts({shape:u.plain()}));var y=[];return E(e.named,(function(t){var e;null!=rT.get(t.svgNodeTagLower)&&(y.push(t),(e=t.el).silent=!1,e.isGroup&&e.traverse((function(t){t.silent=!1})))})),{root:o,boundingRect:u,named:y}},t.prototype.useGraphic=function(t){var e=this._usedGraphicMap,n=e.get(t);return n||(n=this._freedGraphics.pop()||this._buildGraphic(this._parsedXML),e.set(t,n),n)},t.prototype.freeGraphic=function(t){var e=this._usedGraphicMap,n=e.get(t);n&&(e.removeKey(t),this._freedGraphics.push(n))},t}();for(var aT=[126,25],sT="南海诸岛",lT=[[[0,3.5],[7,11.2],[15,11.9],[30,7],[42,.7],[52,.7],[56,7.7],[59,.7],[64,.7],[64,0],[5,0],[0,3.5]],[[13,16.1],[19,14.7],[16,21.7],[11,23.1],[13,16.1]],[[12,32.2],[14,38.5],[15,38.5],[13,32.2],[12,32.2]],[[16,47.6],[12,53.2],[13,53.2],[18,47.6],[16,47.6]],[[6,64.4],[8,70],[9,70],[8,64.4],[6,64.4]],[[23,82.6],[29,79.8],[30,79.8],[25,82.6],[23,82.6]],[[37,70.7],[43,62.3],[44,62.3],[39,70.7],[37,70.7]],[[48,51.1],[51,45.5],[53,45.5],[50,51.1],[48,51.1]],[[51,35],[51,28.7],[53,28.7],[53,35],[51,35]],[[52,22.4],[55,17.5],[56,17.5],[53,22.4],[52,22.4]],[[58,12.6],[62,7],[63,7],[60,12.6],[58,12.6]],[[0,3.5],[0,93.1],[64,93.1],[64,0],[63,0],[63,92.4],[1,92.4],[1,3.5],[0,3.5]]],uT=0;uT<lT.length;uT++)for(var hT=0;hT<lT[uT].length;hT++)lT[uT][hT][0]/=10.5,lT[uT][hT][1]/=-14,lT[uT][hT][0]+=aT[0],lT[uT][hT][1]+=aT[1];var cT={"南海诸岛":[32,80],"广东":[0,-10],"香港":[10,5],"澳门":[-10,10],"天津":[5,5]};var pT=[[[123.45165252685547,25.73527164402261],[123.49731445312499,25.73527164402261],[123.49731445312499,25.750734064600884],[123.45165252685547,25.750734064600884],[123.45165252685547,25.73527164402261]]];var dT=function(){function t(t,e,n){var i;this.type="geoJSON",this._parsedMap=ft(),this._mapName=t,this._specialAreas=n,this._geoJSON=X(i=e)?"undefined"!=typeof JSON&&JSON.parse?JSON.parse(i):new Function("return ("+i+");")():i}return t.prototype.load=function(t,e){e=e||"name";var n=this._parsedMap.get(e);if(!n){var i=this._parseToRegions(e);n=this._parsedMap.set(e,{regions:i,boundingRect:fT(i)})}var r=ft(),o=[];return E(n.regions,(function(e){var n=e.name;t&&mt(t,n)&&(e=e.cloneShallow(n=t[n])),o.push(e),r.set(n,e)})),{regions:o,boundingRect:n.boundingRect||new sr(0,0,0,0),regionsMap:r}},t.prototype._parseToRegions=function(t){var e,n=this._mapName,i=this._geoJSON;try{e=i?I_(i,t):[]}catch(t){throw new Error("Invalid geoJson format\n"+t.message)}return function(t,e){if("china"===t){for(var n=0;n<e.length;n++)if(e[n].name===sT)return;e.push(new b_(sT,z(lT,(function(t){return{type:"polygon",exterior:t}})),aT))}}(n,e),E(e,(function(t){var e=t.name;!function(t,e){if("china"===t){var n=cT[e.name];if(n){var i=e.getCenter();i[0]+=n[0]/10.5,i[1]+=-n[1]/14,e.setCenter(i)}}}(n,t),function(t,e){"china"===t&&"台湾"===e.name&&e.geometries.push({type:"polygon",exterior:pT[0]})}(n,t);var i=this._specialAreas&&this._specialAreas[e];i&&t.transformTo(i.left,i.top,i.width,i.height)}),this),e},t.prototype.getMapForUser=function(){return{geoJson:this._geoJSON,geoJSON:this._geoJSON,specialAreas:this._specialAreas}},t}();function fT(t){for(var e,n=0;n<t.length;n++){var i=t[n].getBoundingRect();(e=e||i.clone()).union(i)}return e}var gT=ft(),yT=function(t,e,n){if(e.svg){var i=new oT(t,e.svg);gT.set(t,i)}else{var r=e.geoJson||e.geoJSON;r&&!e.features?n=e.specialAreas:r=e;i=new dT(t,r,n);gT.set(t,i)}},vT=function(t){return gT.get(t)},mT=function(t){var e=gT.get(t);return e&&"geoJSON"===e.type&&e.getMapForUser()},xT=function(t,e,n){var i=gT.get(t);if(i)return i.load(e,n)},_T=["rect","circle","line","ellipse","polygon","polyline","path"],bT=ft(_T),wT=ft(_T.concat(["g"])),ST=ft(_T.concat(["g"])),MT=So();function IT(t){var e=t.getItemStyle(),n=t.get("areaColor");return null!=n&&(e.fill=n),e}function TT(t){var e=t.style;e&&(e.stroke=e.stroke||e.fill,e.fill=null)}var CT=function(){function t(t){var e=new Cr;this.uid=fc("ec_map_draw"),this._controller=new DI(t.getZr()),this._controllerHost={target:e},this.group=e,e.add(this._regionsGroup=new Cr),e.add(this._svgGroup=new Cr)}return t.prototype.draw=function(t,e,n,i,r){var o="geo"===t.mainType,a=t.getData&&t.getData();o&&e.eachComponent({mainType:"series",subType:"map"},(function(e){a||e.getHostGeoModel()!==t||(a=e.getData())}));var s=t.coordinateSystem,l=this._regionsGroup,u=this.group,h=s.getTransformInfo(),c=h.raw,p=h.roam;!l.childAt(0)||r?(u.x=p.x,u.y=p.y,u.scaleX=p.scaleX,u.scaleY=p.scaleY,u.dirty()):ih(u,p,t);var d=a&&a.getVisual("visualMeta")&&a.getVisual("visualMeta").length>0,f={api:n,geo:s,mapOrGeoModel:t,data:a,isVisualEncodedByVisualMap:d,isGeo:o,transformInfoRaw:c};"geoJSON"===s.resourceType?this._buildGeoJSON(f):"geoSVG"===s.resourceType&&this._buildSVG(f),this._updateController(t,e,n),this._updateMapSelectHandler(t,l,n,i)},t.prototype._buildGeoJSON=function(t){var e=this._regionsGroupByName=ft(),n=ft(),i=this._regionsGroup,r=t.transformInfoRaw,o=t.mapOrGeoModel,a=t.data,s=t.geo.projection,l=s&&s.stream;function u(t,e){return e&&(t=e(t)),t&&[t[0]*r.scaleX+r.x,t[1]*r.scaleY+r.y]}function h(t){for(var e=[],n=!l&&s&&s.project,i=0;i<t.length;++i){var r=u(t[i],n);r&&e.push(r)}return e}function c(t){return{shape:{points:h(t)}}}i.removeAll(),E(t.geo.regions,(function(r){var h=r.name,p=e.get(h),d=n.get(h)||{},f=d.dataIdx,g=d.regionModel;p||(p=e.set(h,new Cr),i.add(p),f=a?a.indexOfName(h):null,g=t.isGeo?o.getRegionModel(h):a?a.getItemModel(f):null,n.set(h,{dataIdx:f,regionModel:g}));var y=[],v=[];E(r.geometries,(function(t){if("polygon"===t.type){var e=[t.exterior].concat(t.interiors||[]);l&&(e=OT(e,l)),E(e,(function(t){y.push(new Lu(c(t)))}))}else{var n=t.points;l&&(n=OT(n,l,!0)),E(n,(function(t){v.push(new Ou(c(t)))}))}}));var m=u(r.getCenter(),s&&s.project);function x(e,n){if(e.length){var i=new Hu({culling:!0,segmentIgnoreThreshold:1,shape:{paths:e}});p.add(i),DT(t,i,f,g),AT(t,i,h,g,o,f,m),n&&(TT(i),E(i.states,TT))}}x(y),x(v,!0)})),e.each((function(e,i){var r=n.get(i),a=r.dataIdx,s=r.regionModel;kT(t,e,i,s,o,a),LT(t,e,i,s,o),PT(t,e,i,s,o)}),this)},t.prototype._buildSVG=function(t){var e=t.geo.map,n=t.transformInfoRaw;this._svgGroup.x=n.x,this._svgGroup.y=n.y,this._svgGroup.scaleX=n.scaleX,this._svgGroup.scaleY=n.scaleY,this._svgResourceChanged(e)&&(this._freeSVG(),this._useSVG(e));var i=this._svgDispatcherMap=ft(),r=!1;E(this._svgGraphicRecord.named,(function(e){var n=e.name,o=t.mapOrGeoModel,a=t.data,s=e.svgNodeTagLower,l=e.el,u=a?a.indexOfName(n):null,h=o.getRegionModel(n);(null!=bT.get(s)&&l instanceof da&&DT(t,l,u,h),l instanceof da&&(l.culling=!0),l.z2EmphasisLift=0,e.namedFrom)||(null!=ST.get(s)&&AT(t,l,n,h,o,u,null),kT(t,l,n,h,o,u),LT(t,l,n,h,o),null!=wT.get(s)&&("self"===PT(t,l,n,h,o)&&(r=!0),(i.get(n)||i.set(n,[])).push(l)))}),this),this._enableBlurEntireSVG(r,t)},t.prototype._enableBlurEntireSVG=function(t,e){if(t&&e.isGeo){var n=e.mapOrGeoModel.getModel(["blur","itemStyle"]).getItemStyle().opacity;this._svgGraphicRecord.root.traverse((function(t){if(!t.isGroup){yl(t);var e=t.ensureState("blur").style||{};null==e.opacity&&null!=n&&(e.opacity=n),t.ensureState("emphasis")}}))}},t.prototype.remove=function(){this._regionsGroup.removeAll(),this._regionsGroupByName=null,this._svgGroup.removeAll(),this._freeSVG(),this._controller.dispose(),this._controllerHost=null},t.prototype.findHighDownDispatchers=function(t,e){if(null==t)return[];var n=e.coordinateSystem;if("geoJSON"===n.resourceType){var i=this._regionsGroupByName;if(i){var r=i.get(t);return r?[r]:[]}}else if("geoSVG"===n.resourceType)return this._svgDispatcherMap&&this._svgDispatcherMap.get(t)||[]},t.prototype._svgResourceChanged=function(t){return this._svgMapName!==t},t.prototype._useSVG=function(t){var e=vT(t);if(e&&"geoSVG"===e.type){var n=e.useGraphic(this.uid);this._svgGroup.add(n.root),this._svgGraphicRecord=n,this._svgMapName=t}},t.prototype._freeSVG=function(){var t=this._svgMapName;if(null!=t){var e=vT(t);e&&"geoSVG"===e.type&&e.freeGraphic(this.uid),this._svgGraphicRecord=null,this._svgDispatcherMap=null,this._svgGroup.removeAll(),this._svgMapName=null}},t.prototype._updateController=function(t,e,n){var i=t.coordinateSystem,r=this._controller,o=this._controllerHost;o.zoomLimit=t.get("scaleLimit"),o.zoom=i.getZoom(),r.enable(t.get("roam")||!1);var a=t.mainType;function s(){var e={type:"geoRoam",componentType:a};return e[a+"Id"]=t.id,e}r.off("pan").on("pan",(function(t){this._mouseDownFlag=!1,PI(o,t.dx,t.dy),n.dispatchAction(A(s(),{dx:t.dx,dy:t.dy,animation:{duration:0}}))}),this),r.off("zoom").on("zoom",(function(t){this._mouseDownFlag=!1,OI(o,t.scale,t.originX,t.originY),n.dispatchAction(A(s(),{zoom:t.scale,originX:t.originX,originY:t.originY,animation:{duration:0}}))}),this),r.setPointerChecker((function(e,r,o){return i.containPoint([r,o])&&!EI(e,n,t)}))},t.prototype.resetForLabelLayout=function(){this.group.traverse((function(t){var e=t.getTextContent();e&&(e.ignore=MT(e).ignore)}))},t.prototype._updateMapSelectHandler=function(t,e,n,i){var r=this;e.off("mousedown"),e.off("click"),t.get("selectedMode")&&(e.on("mousedown",(function(){r._mouseDownFlag=!0})),e.on("click",(function(t){r._mouseDownFlag&&(r._mouseDownFlag=!1)})))},t}();function DT(t,e,n,i){var r=i.getModel("itemStyle"),o=i.getModel(["emphasis","itemStyle"]),a=i.getModel(["blur","itemStyle"]),s=i.getModel(["select","itemStyle"]),l=IT(r),u=IT(o),h=IT(s),c=IT(a),p=t.data;if(p){var d=p.getItemVisual(n,"style"),f=p.getItemVisual(n,"decal");t.isVisualEncodedByVisualMap&&d.fill&&(l.fill=d.fill),f&&(l.decal=nv(f,t.api))}e.setStyle(l),e.style.strokeNoScale=!0,e.ensureState("emphasis").style=u,e.ensureState("select").style=h,e.ensureState("blur").style=c,yl(e)}function AT(t,e,n,i,r,o,a){var s=t.data,l=t.isGeo,u=s&&isNaN(s.get(s.mapDimension("value"),o)),h=s&&s.getItemLayout(o);if(l||u||h&&h.showLabel){var c=l?n:o,p=void 0;(!s||o>=0)&&(p=r);var d=a?{normal:{align:"center",verticalAlign:"middle"}}:null;Wh(e,Hh(i),{labelFetcher:p,labelDataIndex:c,defaultText:n},d);var f=e.getTextContent();if(f&&(MT(f).ignore=f.ignore,e.textConfig&&a)){var g=e.getBoundingRect().clone();e.textConfig.layoutRect=g,e.textConfig.position=[(a[0]-g.x)/g.width*100+"%",(a[1]-g.y)/g.height*100+"%"]}e.disableLabelAnimation=!0}else e.removeTextContent(),e.removeTextConfig(),e.disableLabelAnimation=null}function kT(t,e,n,i,r,o){t.data?t.data.setItemGraphicEl(o,e):Ws(e).eventData={componentType:"geo",componentIndex:r.componentIndex,geoIndex:r.componentIndex,name:n,region:i&&i.option||{}}}function LT(t,e,n,i,r){t.data||Nh({el:e,componentModel:r,itemName:n,itemTooltipOption:i.get("tooltip")})}function PT(t,e,n,i,r){e.highDownSilentOnTouch=!!r.get("selectedMode");var o=i.getModel("emphasis"),a=o.get("focus");return Ol(e,a,o.get("blurScope"),o.get("disabled")),t.isGeo&&function(t,e,n){var i=Ws(t);i.componentMainType=e.mainType,i.componentIndex=e.componentIndex,i.componentHighDownName=n}(e,r,n),a}function OT(t,e,n){var i,r=[];function o(){i=[]}function a(){i.length&&(r.push(i),i=[])}var s=e({polygonStart:o,polygonEnd:a,lineStart:o,lineEnd:a,point:function(t,e){isFinite(t)&&isFinite(e)&&i.push([t,e])},sphere:function(){}});return!n&&s.polygonStart(),E(t,(function(t){s.lineStart();for(var e=0;e<t.length;e++)s.point(t[e][0],t[e][1]);s.lineEnd()})),!n&&s.polygonEnd(),r}var RT=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n,i){if(!i||"mapToggleSelect"!==i.type||i.from!==this.uid){var r=this.group;if(r.removeAll(),!t.getHostGeoModel()){if(this._mapDraw&&i&&"geoRoam"===i.type&&this._mapDraw.resetForLabelLayout(),i&&"geoRoam"===i.type&&"series"===i.componentType&&i.seriesId===t.id)(o=this._mapDraw)&&r.add(o.group);else if(t.needsDrawMap){var o=this._mapDraw||new CT(n);r.add(o.group),o.draw(t,e,n,this,i),this._mapDraw=o}else this._mapDraw&&this._mapDraw.remove(),this._mapDraw=null;t.get("showLegendSymbol")&&e.getComponent("legend")&&this._renderSymbols(t,e,n)}}},e.prototype.remove=function(){this._mapDraw&&this._mapDraw.remove(),this._mapDraw=null,this.group.removeAll()},e.prototype.dispose=function(){this._mapDraw&&this._mapDraw.remove(),this._mapDraw=null},e.prototype._renderSymbols=function(t,e,n){var i=t.originalData,r=this.group;i.each(i.mapDimension("value"),(function(e,n){if(!isNaN(e)){var o=i.getItemLayout(n);if(o&&o.point){var a=o.point,s=o.offset,l=new uu({style:{fill:t.getData().getVisual("style").fill},shape:{cx:a[0]+9*s,cy:a[1],r:3},silent:!0,z2:8+(s?0:11)});if(!s){var u=t.mainSeries.getData(),h=i.getName(n),c=u.indexOfName(h),p=i.getItemModel(n),d=p.getModel("label"),f=u.getItemGraphicEl(c);Wh(l,Hh(p),{labelFetcher:{getFormattedLabel:function(e,n){return t.getFormattedLabel(c,n)}},defaultText:h}),l.disableLabelAnimation=!0,d.get("position")||l.setTextConfig({position:"bottom"}),f.onHoverStateChange=function(t){fl(l,t)}}r.add(l)}}}))},e.type="map",e}(mg),NT=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.needsDrawMap=!1,n.seriesGroup=[],n.getTooltipPosition=function(t){if(null!=t){var e=this.getData().getName(t),n=this.coordinateSystem,i=n.getRegion(e);return i&&n.dataToPoint(i.getCenter())}},n}return n(e,t),e.prototype.getInitialData=function(t){for(var e=sM(this,{coordDimensions:["value"],encodeDefaulter:H(Hp,this)}),n=ft(),i=[],r=0,o=e.count();r<o;r++){var a=e.getName(r);n.set(a,!0)}return E(xT(this.getMapType(),this.option.nameMap,this.option.nameProperty).regions,(function(t){var e=t.name;n.get(e)||i.push(e)})),e.appendValues([],i),e},e.prototype.getHostGeoModel=function(){var t=this.option.geoIndex;return null!=t?this.ecModel.getComponent("geo",t):null},e.prototype.getMapType=function(){return(this.getHostGeoModel()||this).option.map},e.prototype.getRawValue=function(t){var e=this.getData();return e.get(e.mapDimension("value"),t)},e.prototype.getRegionModel=function(t){var e=this.getData();return e.getItemModel(e.indexOfName(t))},e.prototype.formatTooltip=function(t,e,n){for(var i=this.getData(),r=this.getRawValue(t),o=i.getName(t),a=this.seriesGroup,s=[],l=0;l<a.length;l++){var u=a[l].originalData.indexOfName(o),h=i.mapDimension("value");isNaN(a[l].originalData.get(h,u))||s.push(a[l].name)}return Uf("section",{header:s.join(", "),noHeader:!s.length,blocks:[Uf("nameValue",{name:o,value:r})]})},e.prototype.setZoom=function(t){this.option.zoom=t},e.prototype.setCenter=function(t){this.option.center=t},e.prototype.getLegendIcon=function(t){var e=t.icon||"roundRect",n=ky(e,0,0,t.itemWidth,t.itemHeight,t.itemStyle.fill);return n.setStyle(t.itemStyle),n.style.stroke="none",e.indexOf("empty")>-1&&(n.style.stroke=n.style.fill,n.style.fill="#fff",n.style.lineWidth=2),n},e.type="series.map",e.dependencies=["geo"],e.layoutMode="box",e.defaultOption={z:2,coordinateSystem:"geo",map:"",left:"center",top:"center",aspectScale:null,showLegendSymbol:!0,boundingCoords:null,center:null,zoom:1,scaleLimit:null,selectedMode:!0,label:{show:!1,color:"#000"},itemStyle:{borderWidth:.5,borderColor:"#444",areaColor:"#eee"},emphasis:{label:{show:!0,color:"rgb(100,0,0)"},itemStyle:{areaColor:"rgba(255,215,0,0.8)"}},select:{label:{show:!0,color:"rgb(100,0,0)"},itemStyle:{color:"rgba(255,215,0,0.8)"}},nameProperty:"name"},e}(ag);function ET(t){var e={};t.eachSeriesByType("map",(function(t){var n=t.getHostGeoModel(),i=n?"o"+n.id:"i"+t.getMapType();(e[i]=e[i]||[]).push(t)})),E(e,(function(t,e){for(var n,i,r,o=(n=z(t,(function(t){return t.getData()})),i=t[0].get("mapValueCalculation"),r={},E(n,(function(t){t.each(t.mapDimension("value"),(function(e,n){var i="ec-"+t.getName(n);r[i]=r[i]||[],isNaN(e)||r[i].push(e)}))})),n[0].map(n[0].mapDimension("value"),(function(t,e){for(var o="ec-"+n[0].getName(e),a=0,s=1/0,l=-1/0,u=r[o].length,h=0;h<u;h++)s=Math.min(s,r[o][h]),l=Math.max(l,r[o][h]),a+=r[o][h];return 0===u?NaN:"min"===i?s:"max"===i?l:"average"===i?a/u:a}))),a=0;a<t.length;a++)t[a].originalData=t[a].getData();for(a=0;a<t.length;a++)t[a].seriesGroup=t,t[a].needsDrawMap=0===a&&!t[a].getHostGeoModel(),t[a].setData(o.cloneShallow()),t[a].mainSeries=t[0]}))}function zT(t){var e={};t.eachSeriesByType("map",(function(n){var i=n.getMapType();if(!n.getHostGeoModel()&&!e[i]){var r={};E(n.seriesGroup,(function(e){var n=e.coordinateSystem,i=e.originalData;e.get("showLegendSymbol")&&t.getComponent("legend")&&i.each(i.mapDimension("value"),(function(t,e){var o=i.getName(e),a=n.getRegion(o);if(a&&!isNaN(t)){var s=r[o]||0,l=n.dataToPoint(a.getCenter());r[o]=s+1,i.setItemLayout(e,{point:l,offset:s})}}))}));var o=n.getData();o.each((function(t){var e=o.getName(t),n=o.getItemLayout(t)||{};n.showLabel=!r[e],o.setItemLayout(t,n)})),e[i]=!0}}))}var VT=Ft,BT=function(t){function e(e){var n=t.call(this)||this;return n.type="view",n.dimensions=["x","y"],n._roamTransformable=new qi,n._rawTransformable=new qi,n.name=e,n}return n(e,t),e.prototype.setBoundingRect=function(t,e,n,i){return this._rect=new sr(t,e,n,i),this._rect},e.prototype.getBoundingRect=function(){return this._rect},e.prototype.setViewRect=function(t,e,n,i){this._transformTo(t,e,n,i),this._viewRect=new sr(t,e,n,i)},e.prototype._transformTo=function(t,e,n,i){var r=this.getBoundingRect(),o=this._rawTransformable;o.transform=r.calculateTransform(new sr(t,e,n,i));var a=o.parent;o.parent=null,o.decomposeTransform(),o.parent=a,this._updateTransform()},e.prototype.setCenter=function(t){t&&(this._center=t,this._updateCenterAndZoom())},e.prototype.setZoom=function(t){t=t||1;var e=this.zoomLimit;e&&(null!=e.max&&(t=Math.min(e.max,t)),null!=e.min&&(t=Math.max(e.min,t))),this._zoom=t,this._updateCenterAndZoom()},e.prototype.getDefaultCenter=function(){var t=this.getBoundingRect();return[t.x+t.width/2,t.y+t.height/2]},e.prototype.getCenter=function(){return this._center||this.getDefaultCenter()},e.prototype.getZoom=function(){return this._zoom||1},e.prototype.getRoamTransform=function(){return this._roamTransformable.getLocalTransform()},e.prototype._updateCenterAndZoom=function(){var t=this._rawTransformable.getLocalTransform(),e=this._roamTransformable,n=this.getDefaultCenter(),i=this.getCenter(),r=this.getZoom();i=Ft([],i,t),n=Ft([],n,t),e.originX=i[0],e.originY=i[1],e.x=n[0]-i[0],e.y=n[1]-i[1],e.scaleX=e.scaleY=r,this._updateTransform()},e.prototype._updateTransform=function(){var t=this._roamTransformable,e=this._rawTransformable;e.parent=t,t.updateTransform(),e.updateTransform(),Ri(this.transform||(this.transform=[]),e.transform||[1,0,0,1,0,0]),this._rawTransform=e.getLocalTransform(),this.invTransform=this.invTransform||[],Bi(this.invTransform,this.transform),this.decomposeTransform()},e.prototype.getTransformInfo=function(){var t=this._rawTransformable,e=this._roamTransformable,n=new qi;return n.transform=e.transform,n.decomposeTransform(),{roam:{x:n.x,y:n.y,scaleX:n.scaleX,scaleY:n.scaleY},raw:{x:t.x,y:t.y,scaleX:t.scaleX,scaleY:t.scaleY}}},e.prototype.getViewRect=function(){return this._viewRect},e.prototype.getViewRectAfterRoam=function(){var t=this.getBoundingRect().clone();return t.applyTransform(this.transform),t},e.prototype.dataToPoint=function(t,e,n){var i=e?this._rawTransform:this.transform;return n=n||[],i?VT(n,t,i):St(n,t)},e.prototype.pointToData=function(t){var e=this.invTransform;return e?VT([],t,e):[t[0],t[1]]},e.prototype.convertToPixel=function(t,e,n){var i=FT(e);return i===this?i.dataToPoint(n):null},e.prototype.convertFromPixel=function(t,e,n){var i=FT(e);return i===this?i.pointToData(n):null},e.prototype.containPoint=function(t){return this.getViewRectAfterRoam().contain(t[0],t[1])},e.dimensions=["x","y"],e}(qi);function FT(t){var e=t.seriesModel;return e?e.coordinateSystem:null}var GT={geoJSON:{aspectScale:.75,invertLongitute:!0},geoSVG:{aspectScale:1,invertLongitute:!1}},WT=["lng","lat"],HT=function(t){function e(e,n,i){var r=t.call(this,e)||this;r.dimensions=WT,r.type="geo",r._nameCoordMap=ft(),r.map=n;var o,a=i.projection,s=xT(n,i.nameMap,i.nameProperty),l=vT(n),u=(r.resourceType=l?l.type:null,r.regions=s.regions),h=GT[l.type];if(r._regionsMap=s.regionsMap,r.regions=s.regions,r.projection=a,a)for(var c=0;c<u.length;c++){var p=u[c].getBoundingRect(a);(o=o||p.clone()).union(p)}else o=s.boundingRect;return r.setBoundingRect(o.x,o.y,o.width,o.height),r.aspectScale=a?1:rt(i.aspectScale,h.aspectScale),r._invertLongitute=!a&&h.invertLongitute,r}return n(e,t),e.prototype._transformTo=function(t,e,n,i){var r=this.getBoundingRect(),o=this._invertLongitute;r=r.clone(),o&&(r.y=-r.y-r.height);var a=this._rawTransformable;a.transform=r.calculateTransform(new sr(t,e,n,i));var s=a.parent;a.parent=null,a.decomposeTransform(),a.parent=s,o&&(a.scaleY=-a.scaleY),this._updateTransform()},e.prototype.getRegion=function(t){return this._regionsMap.get(t)},e.prototype.getRegionByCoord=function(t){for(var e=this.regions,n=0;n<e.length;n++){var i=e[n];if("geoJSON"===i.type&&i.contain(t))return e[n]}},e.prototype.addGeoCoord=function(t,e){this._nameCoordMap.set(t,e)},e.prototype.getGeoCoord=function(t){var e=this._regionsMap.get(t);return this._nameCoordMap.get(t)||e&&e.getCenter()},e.prototype.dataToPoint=function(t,e,n){if(X(t)&&(t=this.getGeoCoord(t)),t){var i=this.projection;return i&&(t=i.project(t)),t&&this.projectedToPoint(t)}},e.prototype.pointToData=function(t){var e=this.projection;return e&&(t=e.unproject(t)),t&&this.pointToProjected(t)},e.prototype.pointToProjected=function(e){return t.prototype.pointToData.call(this,e)},e.prototype.projectedToPoint=function(e,n,i){return t.prototype.dataToPoint.call(this,e,n,i)},e.prototype.convertToPixel=function(t,e,n){var i=YT(e);return i===this?i.dataToPoint(n):null},e.prototype.convertFromPixel=function(t,e,n){var i=YT(e);return i===this?i.pointToData(n):null},e}(BT);function YT(t){var e=t.geoModel,n=t.seriesModel;return e?e.coordinateSystem:n?n.coordinateSystem||(n.getReferringComponents("geo",Co).models[0]||{}).coordinateSystem:null}function UT(t,e){var n=t.get("boundingCoords");if(null!=n){var i=n[0],r=n[1];if(isFinite(i[0])&&isFinite(i[1])&&isFinite(r[0])&&isFinite(r[1])){var o=this.projection;if(o){var a=i[0],s=i[1],l=r[0],u=r[1];i=[1/0,1/0],r=[-1/0,-1/0];var h=function(t,e,n,a){for(var s=n-t,l=a-e,u=0;u<=100;u++){var h=u/100,c=o.project([t+s*h,e+l*h]);Gt(i,i,c),Wt(r,r,c)}};h(a,s,l,s),h(l,s,l,u),h(l,u,a,u),h(a,u,l,s)}this.setBoundingRect(i[0],i[1],r[0]-i[0],r[1]-i[1])}else 0}var c,p,d,f=this.getBoundingRect(),g=t.get("layoutCenter"),y=t.get("layoutSize"),v=e.getWidth(),m=e.getHeight(),x=f.width/f.height*this.aspectScale,_=!1;if(g&&y&&(c=[Er(g[0],v),Er(g[1],m)],p=Er(y,Math.min(v,m)),isNaN(c[0])||isNaN(c[1])||isNaN(p)||(_=!0)),_)d={},x>1?(d.width=p,d.height=p/x):(d.height=p,d.width=p*x),d.y=c[1]-d.height/2,d.x=c[0]-d.width/2;else{var b=t.getBoxLayoutParams();b.aspect=x,d=mp(b,{width:v,height:m})}this.setViewRect(d.x,d.y,d.width,d.height),this.setCenter(t.get("center")),this.setZoom(t.get("zoom"))}R(HT,BT);var XT=new(function(){function t(){this.dimensions=WT}return t.prototype.create=function(t,e){var n=[];function i(t){return{nameProperty:t.get("nameProperty"),aspectScale:t.get("aspectScale"),projection:t.get("projection")}}t.eachComponent("geo",(function(t,r){var o=t.get("map"),a=new HT(o+r,o,A({nameMap:t.get("nameMap")},i(t)));a.zoomLimit=t.get("scaleLimit"),n.push(a),t.coordinateSystem=a,a.model=t,a.resize=UT,a.resize(t,e)})),t.eachSeries((function(t){if("geo"===t.get("coordinateSystem")){var e=t.get("geoIndex")||0;t.coordinateSystem=n[e]}}));var r={};return t.eachSeriesByType("map",(function(t){if(!t.getHostGeoModel()){var e=t.getMapType();r[e]=r[e]||[],r[e].push(t)}})),E(r,(function(t,r){var o=z(t,(function(t){return t.get("nameMap")})),a=new HT(r,r,A({nameMap:D(o)},i(t[0])));a.zoomLimit=it.apply(null,z(t,(function(t){return t.get("scaleLimit")}))),n.push(a),a.resize=UT,a.resize(t[0],e),E(t,(function(t){t.coordinateSystem=a,function(t,e){E(e.get("geoCoord"),(function(e,n){t.addGeoCoord(n,e)}))}(a,t)}))})),n},t.prototype.getFilledRegions=function(t,e,n,i){for(var r=(t||[]).slice(),o=ft(),a=0;a<r.length;a++)o.set(r[a].name,r[a]);return E(xT(e,n,i).regions,(function(t){var e=t.name;!o.get(e)&&r.push({name:e})})),r},t}()),ZT=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(t,e,n){var i=vT(t.map);if(i&&"geoJSON"===i.type){var r=t.itemStyle=t.itemStyle||{};"color"in r||(r.color="#eee")}this.mergeDefaultAndTheme(t,n),co(t,"label",["show"])},e.prototype.optionUpdated=function(){var t=this,e=this.option;e.regions=XT.getFilledRegions(e.regions,e.map,e.nameMap,e.nameProperty);var n={};this._optionModelMap=V(e.regions||[],(function(e,i){var r=i.name;return r&&(e.set(r,new pc(i,t,t.ecModel)),i.selected&&(n[r]=!0)),e}),ft()),e.selectedMap||(e.selectedMap=n)},e.prototype.getRegionModel=function(t){return this._optionModelMap.get(t)||new pc(null,this,this.ecModel)},e.prototype.getFormattedLabel=function(t,e){var n=this.getRegionModel(t),i="normal"===e?n.get(["label","formatter"]):n.get(["emphasis","label","formatter"]),r={name:t};return U(i)?(r.status=e,i(r)):X(i)?i.replace("{a}",null!=t?t:""):void 0},e.prototype.setZoom=function(t){this.option.zoom=t},e.prototype.setCenter=function(t){this.option.center=t},e.prototype.select=function(t){var e=this.option,n=e.selectedMode;n&&("multiple"!==n&&(e.selectedMap=null),(e.selectedMap||(e.selectedMap={}))[t]=!0)},e.prototype.unSelect=function(t){var e=this.option.selectedMap;e&&(e[t]=!1)},e.prototype.toggleSelected=function(t){this[this.isSelected(t)?"unSelect":"select"](t)},e.prototype.isSelected=function(t){var e=this.option.selectedMap;return!(!e||!e[t])},e.type="geo",e.layoutMode="box",e.defaultOption={z:0,show:!0,left:"center",top:"center",aspectScale:null,silent:!1,map:"",boundingCoords:null,center:null,zoom:1,scaleLimit:null,label:{show:!1,color:"#000"},itemStyle:{borderWidth:.5,borderColor:"#444"},emphasis:{label:{show:!0,color:"rgb(100,0,0)"},itemStyle:{color:"rgba(255,215,0,0.8)"}},select:{label:{show:!0,color:"rgb(100,0,0)"},itemStyle:{color:"rgba(255,215,0,0.8)"}},regions:[]},e}(Ip);function jT(t,e){return t.pointToProjected?t.pointToProjected(e):t.pointToData(e)}function qT(t,e,n){var i=t.getZoom(),r=t.getCenter(),o=e.zoom,a=t.projectedToPoint?t.projectedToPoint(r):t.dataToPoint(r);if(null!=e.dx&&null!=e.dy&&(a[0]-=e.dx,a[1]-=e.dy,t.setCenter(jT(t,a))),null!=o){if(n){var s=n.min||0,l=n.max||1/0;o=Math.max(Math.min(i*o,l),s)/i}t.scaleX*=o,t.scaleY*=o;var u=(e.originX-t.x)*(o-1),h=(e.originY-t.y)*(o-1);t.x-=u,t.y-=h,t.updateTransform(),t.setCenter(jT(t,a)),t.setZoom(o*i)}return{center:t.getCenter(),zoom:t.getZoom()}}var KT=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.focusBlurEnabled=!0,n}return n(e,t),e.prototype.init=function(t,e){this._api=e},e.prototype.render=function(t,e,n,i){if(this._model=t,!t.get("show"))return this._mapDraw&&this._mapDraw.remove(),void(this._mapDraw=null);this._mapDraw||(this._mapDraw=new CT(n));var r=this._mapDraw;r.draw(t,e,n,this,i),r.group.on("click",this._handleRegionClick,this),r.group.silent=t.get("silent"),this.group.add(r.group),this.updateSelectStatus(t,e,n)},e.prototype._handleRegionClick=function(t){var e;my(t.target,(function(t){return null!=(e=Ws(t).eventData)}),!0),e&&this._api.dispatchAction({type:"geoToggleSelect",geoId:this._model.id,name:e.name})},e.prototype.updateSelectStatus=function(t,e,n){var i=this;this._mapDraw.group.traverse((function(t){var e=Ws(t).eventData;if(e)return i._model.isSelected(e.name)?n.enterSelect(t):n.leaveSelect(t),!0}))},e.prototype.findHighDownDispatchers=function(t){return this._mapDraw&&this._mapDraw.findHighDownDispatchers(t,this._model)},e.prototype.dispose=function(){this._mapDraw&&this._mapDraw.remove()},e.type="geo",e}(fg);function $T(t,e,n){yT(t,e,n)}function JT(t){function e(e,n){n.update="geo:updateSelectStatus",t.registerAction(n,(function(t,n){var i={},r=[];return n.eachComponent({mainType:"geo",query:t},(function(n){n[e](t.name),E(n.coordinateSystem.regions,(function(t){i[t.name]=n.isSelected(t.name)||!1}));var o=[];E(i,(function(t,e){i[e]&&o.push(e)})),r.push({geoIndex:n.componentIndex,name:o})})),{selected:i,allSelected:r,name:t.name}}))}t.registerCoordinateSystem("geo",XT),t.registerComponentModel(ZT),t.registerComponentView(KT),t.registerImpl("registerMap",$T),t.registerImpl("getMap",(function(t){return mT(t)})),e("toggleSelected",{type:"geoToggleSelect",event:"geoselectchanged"}),e("select",{type:"geoSelect",event:"geoselected"}),e("unSelect",{type:"geoUnSelect",event:"geounselected"}),t.registerAction({type:"geoRoam",event:"geoRoam",update:"updateTransform"},(function(t,e){var n=t.componentType||"series";e.eachComponent({mainType:n,query:t},(function(e){var i=e.coordinateSystem;if("geo"===i.type){var r=qT(i,t,e.get("scaleLimit"));e.setCenter&&e.setCenter(r.center),e.setZoom&&e.setZoom(r.zoom),"series"===n&&E(e.seriesGroup,(function(t){t.setCenter(r.center),t.setZoom(r.zoom)}))}}))}))}function QT(t,e){var n=t.isExpand?t.children:[],i=t.parentNode.children,r=t.hierNode.i?i[t.hierNode.i-1]:null;if(n.length){!function(t){var e=t.children,n=e.length,i=0,r=0;for(;--n>=0;){var o=e[n];o.hierNode.prelim+=i,o.hierNode.modifier+=i,r+=o.hierNode.change,i+=o.hierNode.shift+r}}(t);var o=(n[0].hierNode.prelim+n[n.length-1].hierNode.prelim)/2;r?(t.hierNode.prelim=r.hierNode.prelim+e(t,r),t.hierNode.modifier=t.hierNode.prelim-o):t.hierNode.prelim=o}else r&&(t.hierNode.prelim=r.hierNode.prelim+e(t,r));t.parentNode.hierNode.defaultAncestor=function(t,e,n,i){if(e){for(var r=t,o=t,a=o.parentNode.children[0],s=e,l=r.hierNode.modifier,u=o.hierNode.modifier,h=a.hierNode.modifier,c=s.hierNode.modifier;s=iC(s),o=rC(o),s&&o;){r=iC(r),a=rC(a),r.hierNode.ancestor=t;var p=s.hierNode.prelim+c-o.hierNode.prelim-u+i(s,o);p>0&&(aC(oC(s,t,n),t,p),u+=p,l+=p),c+=s.hierNode.modifier,u+=o.hierNode.modifier,l+=r.hierNode.modifier,h+=a.hierNode.modifier}s&&!iC(r)&&(r.hierNode.thread=s,r.hierNode.modifier+=c-l),o&&!rC(a)&&(a.hierNode.thread=o,a.hierNode.modifier+=u-h,n=t)}return n}(t,r,t.parentNode.hierNode.defaultAncestor||i[0],e)}function tC(t){var e=t.hierNode.prelim+t.parentNode.hierNode.modifier;t.setLayout({x:e},!0),t.hierNode.modifier+=t.parentNode.hierNode.modifier}function eC(t){return arguments.length?t:sC}function nC(t,e){return t-=Math.PI/2,{x:e*Math.cos(t),y:e*Math.sin(t)}}function iC(t){var e=t.children;return e.length&&t.isExpand?e[e.length-1]:t.hierNode.thread}function rC(t){var e=t.children;return e.length&&t.isExpand?e[0]:t.hierNode.thread}function oC(t,e,n){return t.hierNode.ancestor.parentNode===e.parentNode?t.hierNode.ancestor:n}function aC(t,e,n){var i=n/(e.hierNode.i-t.hierNode.i);e.hierNode.change-=i,e.hierNode.shift+=n,e.hierNode.modifier+=n,e.hierNode.prelim+=n,t.hierNode.change+=i}function sC(t,e){return t.parentNode===e.parentNode?1:2}var lC=function(){this.parentPoint=[],this.childPoints=[]},uC=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new lC},e.prototype.buildPath=function(t,e){var n=e.childPoints,i=n.length,r=e.parentPoint,o=n[0],a=n[i-1];if(1===i)return t.moveTo(r[0],r[1]),void t.lineTo(o[0],o[1]);var s=e.orient,l="TB"===s||"BT"===s?0:1,u=1-l,h=Er(e.forkPosition,1),c=[];c[l]=r[l],c[u]=r[u]+(a[u]-r[u])*h,t.moveTo(r[0],r[1]),t.lineTo(c[0],c[1]),t.moveTo(o[0],o[1]),c[l]=o[l],t.lineTo(c[0],c[1]),c[l]=a[l],t.lineTo(c[0],c[1]),t.lineTo(a[0],a[1]);for(var p=1;p<i-1;p++){var d=n[p];t.moveTo(d[0],d[1]),c[l]=d[l],t.lineTo(c[0],c[1])}},e}(fs),hC=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._mainGroup=new Cr,n}return n(e,t),e.prototype.init=function(t,e){this._controller=new DI(e.getZr()),this._controllerHost={target:this.group},this.group.add(this._mainGroup)},e.prototype.render=function(t,e,n){var i=t.getData(),r=t.layoutInfo,o=this._mainGroup;"radial"===t.get("layout")?(o.x=r.x+r.width/2,o.y=r.y+r.height/2):(o.x=r.x,o.y=r.y),this._updateViewCoordSys(t),this._updateController(t,e,n);var a=this._data;i.diff(a).add((function(e){cC(i,e)&&pC(i,e,null,o,t)})).update((function(e,n){var r=a.getItemGraphicEl(n);cC(i,e)?pC(i,e,r,o,t):r&&gC(a,n,r,o,t)})).remove((function(e){var n=a.getItemGraphicEl(e);n&&gC(a,e,n,o,t)})).execute(),this._nodeScaleRatio=t.get("nodeScaleRatio"),this._updateNodeAndLinkScale(t),!0===t.get("expandAndCollapse")&&i.eachItemGraphicEl((function(e,i){e.off("click").on("click",(function(){n.dispatchAction({type:"treeExpandAndCollapse",seriesId:t.id,dataIndex:i})}))})),this._data=i},e.prototype._updateViewCoordSys=function(t){var e=t.getData(),n=[];e.each((function(t){var i=e.getItemLayout(t);!i||isNaN(i.x)||isNaN(i.y)||n.push([+i.x,+i.y])}));var i=[],r=[];Ma(n,i,r);var o=this._min,a=this._max;r[0]-i[0]==0&&(i[0]=o?o[0]:i[0]-1,r[0]=a?a[0]:r[0]+1),r[1]-i[1]==0&&(i[1]=o?o[1]:i[1]-1,r[1]=a?a[1]:r[1]+1);var s=t.coordinateSystem=new BT;s.zoomLimit=t.get("scaleLimit"),s.setBoundingRect(i[0],i[1],r[0]-i[0],r[1]-i[1]),s.setCenter(t.get("center")),s.setZoom(t.get("zoom")),this.group.attr({x:s.x,y:s.y,scaleX:s.scaleX,scaleY:s.scaleY}),this._min=i,this._max=r},e.prototype._updateController=function(t,e,n){var i=this,r=this._controller,o=this._controllerHost,a=this.group;r.setPointerChecker((function(e,i,r){var o=a.getBoundingRect();return o.applyTransform(a.transform),o.contain(i,r)&&!EI(e,n,t)})),r.enable(t.get("roam")),o.zoomLimit=t.get("scaleLimit"),o.zoom=t.coordinateSystem.getZoom(),r.off("pan").off("zoom").on("pan",(function(e){PI(o,e.dx,e.dy),n.dispatchAction({seriesId:t.id,type:"treeRoam",dx:e.dx,dy:e.dy})})).on("zoom",(function(e){OI(o,e.scale,e.originX,e.originY),n.dispatchAction({seriesId:t.id,type:"treeRoam",zoom:e.scale,originX:e.originX,originY:e.originY}),i._updateNodeAndLinkScale(t),n.updateLabelLayout()}))},e.prototype._updateNodeAndLinkScale=function(t){var e=t.getData(),n=this._getNodeGlobalScale(t);e.eachItemGraphicEl((function(t,e){t.setSymbolScale(n)}))},e.prototype._getNodeGlobalScale=function(t){var e=t.coordinateSystem;if("view"!==e.type)return 1;var n=this._nodeScaleRatio,i=e.scaleX||1;return((e.getZoom()-1)*n+1)/i},e.prototype.dispose=function(){this._controller&&this._controller.dispose(),this._controllerHost=null},e.prototype.remove=function(){this._mainGroup.removeAll(),this._data=null},e.type="tree",e}(mg);function cC(t,e){var n=t.getItemLayout(e);return n&&!isNaN(n.x)&&!isNaN(n.y)}function pC(t,e,n,i,r){var o=!n,a=t.tree.getNodeByDataIndex(e),s=a.getModel(),l=a.getVisual("style").fill,u=!1===a.isExpand&&0!==a.children.length?l:"#fff",h=t.tree.root,c=a.parentNode===h?a:a.parentNode||a,p=t.getItemGraphicEl(c.dataIndex),d=c.getLayout(),f=p?{x:p.__oldX,y:p.__oldY,rawX:p.__radialOldRawX,rawY:p.__radialOldRawY}:d,g=a.getLayout();o?((n=new Ww(t,e,null,{symbolInnerColor:u,useNameLabel:!0})).x=f.x,n.y=f.y):n.updateData(t,e,null,{symbolInnerColor:u,useNameLabel:!0}),n.__radialOldRawX=n.__radialRawX,n.__radialOldRawY=n.__radialRawY,n.__radialRawX=g.rawX,n.__radialRawY=g.rawY,i.add(n),t.setItemGraphicEl(e,n),n.__oldX=n.x,n.__oldY=n.y,ih(n,{x:g.x,y:g.y},r);var y=n.getSymbolPath();if("radial"===r.get("layout")){var v=h.children[0],m=v.getLayout(),x=v.children.length,_=void 0,b=void 0;if(g.x===m.x&&!0===a.isExpand){var w={x:(v.children[0].getLayout().x+v.children[x-1].getLayout().x)/2,y:(v.children[0].getLayout().y+v.children[x-1].getLayout().y)/2};(_=Math.atan2(w.y-m.y,w.x-m.x))<0&&(_=2*Math.PI+_),(b=w.x<m.x)&&(_-=Math.PI)}else(_=Math.atan2(g.y-m.y,g.x-m.x))<0&&(_=2*Math.PI+_),0===a.children.length||0!==a.children.length&&!1===a.isExpand?(b=g.x<m.x)&&(_-=Math.PI):(b=g.x>m.x)||(_-=Math.PI);var S=b?"left":"right",M=s.getModel("label"),I=M.get("rotate"),T=I*(Math.PI/180),C=y.getTextContent();C&&(y.setTextConfig({position:M.get("position")||S,rotation:null==I?-_:T,origin:"center"}),C.setStyle("verticalAlign","middle"))}var D=s.get(["emphasis","focus"]),A="ancestor"===D?a.getAncestorsIndices():"descendant"===D?a.getDescendantIndices():null;A&&(Ws(n).focus=A),function(t,e,n,i,r,o,a,s){var l=e.getModel(),u=t.get("edgeShape"),h=t.get("layout"),c=t.getOrient(),p=t.get(["lineStyle","curveness"]),d=t.get("edgeForkPosition"),f=l.getModel("lineStyle").getLineStyle(),g=i.__edge;if("curve"===u)e.parentNode&&e.parentNode!==n&&(g||(g=i.__edge=new Fu({shape:yC(h,c,p,r,r)})),ih(g,{shape:yC(h,c,p,o,a)},t));else if("polyline"===u)if("orthogonal"===h){if(e!==n&&e.children&&0!==e.children.length&&!0===e.isExpand){for(var y=e.children,v=[],m=0;m<y.length;m++){var x=y[m].getLayout();v.push([x.x,x.y])}g||(g=i.__edge=new uC({shape:{parentPoint:[a.x,a.y],childPoints:[[a.x,a.y]],orient:c,forkPosition:d}})),ih(g,{shape:{parentPoint:[a.x,a.y],childPoints:v}},t)}}else 0;g&&(g.useStyle(k({strokeNoScale:!0,fill:null},f)),zl(g,l,"lineStyle"),yl(g),s.add(g))}(r,a,h,n,f,d,g,i),n.__edge&&(n.onHoverStateChange=function(e){if("blur"!==e){var i=a.parentNode&&t.getItemGraphicEl(a.parentNode.dataIndex);i&&1===i.hoverState||fl(n.__edge,e)}})}function dC(t,e,n,i,r){var o=fC(e.tree.root,t),a=o.source,s=o.sourceLayout,l=e.getItemGraphicEl(t.dataIndex);if(l){var u=e.getItemGraphicEl(a.dataIndex).__edge,h=l.__edge||(!1===a.isExpand||1===a.children.length?u:void 0),c=i.get("edgeShape"),p=i.get("layout"),d=i.get("orient"),f=i.get(["lineStyle","curveness"]);h&&("curve"===c?ah(h,{shape:yC(p,d,f,s,s),style:{opacity:0}},i,{cb:function(){n.remove(h)},removeOpt:r}):"polyline"===c&&"orthogonal"===i.get("layout")&&ah(h,{shape:{parentPoint:[s.x,s.y],childPoints:[[s.x,s.y]]},style:{opacity:0}},i,{cb:function(){n.remove(h)},removeOpt:r}))}}function fC(t,e){for(var n,i=e.parentNode===t?e:e.parentNode||e;null==(n=i.getLayout());)i=i.parentNode===t?i:i.parentNode||i;return{source:i,sourceLayout:n}}function gC(t,e,n,i,r){var o=t.tree.getNodeByDataIndex(e),a=fC(t.tree.root,o).sourceLayout,s={duration:r.get("animationDurationUpdate"),easing:r.get("animationEasingUpdate")};ah(n,{x:a.x+1,y:a.y+1},r,{cb:function(){i.remove(n),t.setItemGraphicEl(e,null)},removeOpt:s}),n.fadeOut(null,{fadeLabel:!0,animation:s}),o.children.forEach((function(e){dC(e,t,i,r,s)})),dC(o,t,i,r,s)}function yC(t,e,n,i,r){var o,a,s,l,u,h,c,p;if("radial"===t){u=i.rawX,c=i.rawY,h=r.rawX,p=r.rawY;var d=nC(u,c),f=nC(u,c+(p-c)*n),g=nC(h,p+(c-p)*n),y=nC(h,p);return{x1:d.x||0,y1:d.y||0,x2:y.x||0,y2:y.y||0,cpx1:f.x||0,cpy1:f.y||0,cpx2:g.x||0,cpy2:g.y||0}}return u=i.x,c=i.y,h=r.x,p=r.y,"LR"!==e&&"RL"!==e||(o=u+(h-u)*n,a=c,s=h+(u-h)*n,l=p),"TB"!==e&&"BT"!==e||(o=u,a=c+(p-c)*n,s=h,l=p+(c-p)*n),{x1:u,y1:c,x2:h,y2:p,cpx1:o,cpy1:a,cpx2:s,cpy2:l}}var vC=So();function mC(t){var e=t.mainData,n=t.datas;n||(n={main:e},t.datasAttr={main:"data"}),t.datas=t.mainData=null,MC(e,n,t),E(n,(function(n){E(e.TRANSFERABLE_METHODS,(function(e){n.wrapMethod(e,H(xC,t))}))})),e.wrapMethod("cloneShallow",H(bC,t)),E(e.CHANGABLE_METHODS,(function(n){e.wrapMethod(n,H(_C,t))})),lt(n[e.dataType]===e)}function xC(t,e){if(vC(i=this).mainData===i){var n=A({},vC(this).datas);n[this.dataType]=e,MC(e,n,t)}else IC(e,this.dataType,vC(this).mainData,t);var i;return e}function _C(t,e){return t.struct&&t.struct.update(),e}function bC(t,e){return E(vC(e).datas,(function(n,i){n!==e&&IC(n.cloneShallow(),i,e,t)})),e}function wC(t){var e=vC(this).mainData;return null==t||null==e?e:vC(e).datas[t]}function SC(){var t=vC(this).mainData;return null==t?[{data:t}]:z(G(vC(t).datas),(function(e){return{type:e,data:vC(t).datas[e]}}))}function MC(t,e,n){vC(t).datas={},E(e,(function(e,i){IC(e,i,t,n)}))}function IC(t,e,n,i){vC(n).datas[e]=t,vC(t).mainData=n,t.dataType=e,i.struct&&(t[i.structAttr]=i.struct,i.struct[i.datasAttr[e]]=t),t.getLinkedData=wC,t.getLinkedDataAll=SC}var TC=function(){function t(t,e){this.depth=0,this.height=0,this.dataIndex=-1,this.children=[],this.viewChildren=[],this.isExpand=!1,this.name=t||"",this.hostTree=e}return t.prototype.isRemoved=function(){return this.dataIndex<0},t.prototype.eachNode=function(t,e,n){U(t)&&(n=e,e=t,t=null),X(t=t||{})&&(t={order:t});var i,r=t.order||"preorder",o=this[t.attr||"children"];"preorder"===r&&(i=e.call(n,this));for(var a=0;!i&&a<o.length;a++)o[a].eachNode(t,e,n);"postorder"===r&&e.call(n,this)},t.prototype.updateDepthAndHeight=function(t){var e=0;this.depth=t;for(var n=0;n<this.children.length;n++){var i=this.children[n];i.updateDepthAndHeight(t+1),i.height>e&&(e=i.height)}this.height=e+1},t.prototype.getNodeById=function(t){if(this.getId()===t)return this;for(var e=0,n=this.children,i=n.length;e<i;e++){var r=n[e].getNodeById(t);if(r)return r}},t.prototype.contains=function(t){if(t===this)return!0;for(var e=0,n=this.children,i=n.length;e<i;e++){var r=n[e].contains(t);if(r)return r}},t.prototype.getAncestors=function(t){for(var e=[],n=t?this:this.parentNode;n;)e.push(n),n=n.parentNode;return e.reverse(),e},t.prototype.getAncestorsIndices=function(){for(var t=[],e=this;e;)t.push(e.dataIndex),e=e.parentNode;return t.reverse(),t},t.prototype.getDescendantIndices=function(){var t=[];return this.eachNode((function(e){t.push(e.dataIndex)})),t},t.prototype.getValue=function(t){var e=this.hostTree.data;return e.getStore().get(e.getDimensionIndex(t||"value"),this.dataIndex)},t.prototype.setLayout=function(t,e){this.dataIndex>=0&&this.hostTree.data.setItemLayout(this.dataIndex,t,e)},t.prototype.getLayout=function(){return this.hostTree.data.getItemLayout(this.dataIndex)},t.prototype.getModel=function(t){if(!(this.dataIndex<0))return this.hostTree.data.getItemModel(this.dataIndex).getModel(t)},t.prototype.getLevelModel=function(){return(this.hostTree.levelModels||[])[this.depth]},t.prototype.setVisual=function(t,e){this.dataIndex>=0&&this.hostTree.data.setItemVisual(this.dataIndex,t,e)},t.prototype.getVisual=function(t){return this.hostTree.data.getItemVisual(this.dataIndex,t)},t.prototype.getRawIndex=function(){return this.hostTree.data.getRawIndex(this.dataIndex)},t.prototype.getId=function(){return this.hostTree.data.getId(this.dataIndex)},t.prototype.getChildIndex=function(){if(this.parentNode){for(var t=this.parentNode.children,e=0;e<t.length;++e)if(t[e]===this)return e;return-1}return-1},t.prototype.isAncestorOf=function(t){for(var e=t.parentNode;e;){if(e===this)return!0;e=e.parentNode}return!1},t.prototype.isDescendantOf=function(t){return t!==this&&t.isAncestorOf(this)},t}(),CC=function(){function t(t){this.type="tree",this._nodes=[],this.hostModel=t}return t.prototype.eachNode=function(t,e,n){this.root.eachNode(t,e,n)},t.prototype.getNodeByDataIndex=function(t){var e=this.data.getRawIndex(t);return this._nodes[e]},t.prototype.getNodeById=function(t){return this.root.getNodeById(t)},t.prototype.update=function(){for(var t=this.data,e=this._nodes,n=0,i=e.length;n<i;n++)e[n].dataIndex=-1;for(n=0,i=t.count();n<i;n++)e[t.getRawIndex(n)].dataIndex=n},t.prototype.clearLayouts=function(){this.data.clearItemLayouts()},t.createTree=function(e,n,i){var r=new t(n),o=[],a=1;!function t(e,n){var i=e.value;a=Math.max(a,Y(i)?i.length:1),o.push(e);var s=new TC(xo(e.name,""),r);n?function(t,e){var n=e.children;if(t.parentNode===e)return;n.push(t),t.parentNode=e}(s,n):r.root=s,r._nodes.push(s);var l=e.children;if(l)for(var u=0;u<l.length;u++)t(l[u],s)}(e),r.root.updateDepthAndHeight(0);var s=jm(o,{coordDimensions:["value"],dimensionsCount:a}).dimensions,l=new Zm(s,n);return l.initData(o),i&&i(l),mC({mainData:l,struct:r,structAttr:"tree"}),r.update(),r},t}();function DC(t,e,n){if(t&&P(e,t.type)>=0){var i=n.getData().tree.root,r=t.targetNode;if(X(r)&&(r=i.getNodeById(r)),r&&i.contains(r))return{node:r};var o=t.targetNodeId;if(null!=o&&(r=i.getNodeById(o)))return{node:r}}}function AC(t){for(var e=[];t;)(t=t.parentNode)&&e.push(t);return e.reverse()}function kC(t,e){return P(AC(t),e)>=0}function LC(t,e){for(var n=[];t;){var i=t.dataIndex;n.push({name:t.name,dataIndex:i,value:e.getRawValue(i)}),t=t.parentNode}return n.reverse(),n}var PC=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.hasSymbolVisual=!0,e.ignoreStyleOnData=!0,e}return n(e,t),e.prototype.getInitialData=function(t){var e={name:t.name,children:t.data},n=t.leaves||{},i=new pc(n,this,this.ecModel),r=CC.createTree(e,this,(function(t){t.wrapMethod("getItemModel",(function(t,e){var n=r.getNodeByDataIndex(e);return n&&n.children.length&&n.isExpand||(t.parentModel=i),t}))}));var o=0;r.eachNode("preorder",(function(t){t.depth>o&&(o=t.depth)}));var a=t.expandAndCollapse&&t.initialTreeDepth>=0?t.initialTreeDepth:o;return r.root.eachNode("preorder",(function(t){var e=t.hostTree.data.getRawDataItem(t.dataIndex);t.isExpand=e&&null!=e.collapsed?!e.collapsed:t.depth<=a})),r.data},e.prototype.getOrient=function(){var t=this.get("orient");return"horizontal"===t?t="LR":"vertical"===t&&(t="TB"),t},e.prototype.setZoom=function(t){this.option.zoom=t},e.prototype.setCenter=function(t){this.option.center=t},e.prototype.formatTooltip=function(t,e,n){for(var i=this.getData().tree,r=i.root.children[0],o=i.getNodeByDataIndex(t),a=o.getValue(),s=o.name;o&&o!==r;)s=o.parentNode.name+"."+s,o=o.parentNode;return Uf("nameValue",{name:s,value:a,noValue:isNaN(a)||null==a})},e.prototype.getDataParams=function(e){var n=t.prototype.getDataParams.apply(this,arguments),i=this.getData().tree.getNodeByDataIndex(e);return n.treeAncestors=LC(i,this),n},e.type="series.tree",e.layoutMode="box",e.defaultOption={z:2,coordinateSystem:"view",left:"12%",top:"12%",right:"12%",bottom:"12%",layout:"orthogonal",edgeShape:"curve",edgeForkPosition:"50%",roam:!1,nodeScaleRatio:.4,center:null,zoom:1,orient:"LR",symbol:"emptyCircle",symbolSize:7,expandAndCollapse:!0,initialTreeDepth:2,lineStyle:{color:"#ccc",width:1.5,curveness:.5},itemStyle:{color:"lightsteelblue",borderWidth:1.5},label:{show:!0},animationEasing:"linear",animationDuration:700,animationDurationUpdate:500},e}(ag);function OC(t,e){for(var n,i=[t];n=i.pop();)if(e(n),n.isExpand){var r=n.children;if(r.length)for(var o=r.length-1;o>=0;o--)i.push(r[o])}}function RC(t,e){t.eachSeriesByType("tree",(function(t){!function(t,e){var n=function(t,e){return mp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}(t,e);t.layoutInfo=n;var i=t.get("layout"),r=0,o=0,a=null;"radial"===i?(r=2*Math.PI,o=Math.min(n.height,n.width)/2,a=eC((function(t,e){return(t.parentNode===e.parentNode?1:2)/t.depth}))):(r=n.width,o=n.height,a=eC());var s=t.getData().tree.root,l=s.children[0];if(l){!function(t){var e=t;e.hierNode={defaultAncestor:null,ancestor:e,prelim:0,modifier:0,change:0,shift:0,i:0,thread:null};for(var n,i,r=[e];n=r.pop();)if(i=n.children,n.isExpand&&i.length)for(var o=i.length-1;o>=0;o--){var a=i[o];a.hierNode={defaultAncestor:null,ancestor:a,prelim:0,modifier:0,change:0,shift:0,i:o,thread:null},r.push(a)}}(s),function(t,e,n){for(var i,r=[t],o=[];i=r.pop();)if(o.push(i),i.isExpand){var a=i.children;if(a.length)for(var s=0;s<a.length;s++)r.push(a[s])}for(;i=o.pop();)e(i,n)}(l,QT,a),s.hierNode.modifier=-l.hierNode.prelim,OC(l,tC);var u=l,h=l,c=l;OC(l,(function(t){var e=t.getLayout().x;e<u.getLayout().x&&(u=t),e>h.getLayout().x&&(h=t),t.depth>c.depth&&(c=t)}));var p=u===h?1:a(u,h)/2,d=p-u.getLayout().x,f=0,g=0,y=0,v=0;if("radial"===i)f=r/(h.getLayout().x+p+d),g=o/(c.depth-1||1),OC(l,(function(t){y=(t.getLayout().x+d)*f,v=(t.depth-1)*g;var e=nC(y,v);t.setLayout({x:e.x,y:e.y,rawX:y,rawY:v},!0)}));else{var m=t.getOrient();"RL"===m||"LR"===m?(g=o/(h.getLayout().x+p+d),f=r/(c.depth-1||1),OC(l,(function(t){v=(t.getLayout().x+d)*g,y="LR"===m?(t.depth-1)*f:r-(t.depth-1)*f,t.setLayout({x:y,y:v},!0)}))):"TB"!==m&&"BT"!==m||(f=r/(h.getLayout().x+p+d),g=o/(c.depth-1||1),OC(l,(function(t){y=(t.getLayout().x+d)*f,v="TB"===m?(t.depth-1)*g:o-(t.depth-1)*g,t.setLayout({x:y,y:v},!0)})))}}}(t,e)}))}function NC(t){t.eachSeriesByType("tree",(function(t){var e=t.getData();e.tree.eachNode((function(t){var n=t.getModel().getModel("itemStyle").getItemStyle();A(e.ensureUniqueItemVisual(t.dataIndex,"style"),n)}))}))}var EC=["treemapZoomToNode","treemapRender","treemapMove"];function zC(t){var e=t.getData().tree,n={};e.eachNode((function(e){for(var i=e;i&&i.depth>1;)i=i.parentNode;var r=td(t.ecModel,i.name||i.dataIndex+"",n);e.setVisual("decal",r)}))}var VC=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.preventUsingHoverLayer=!0,n}return n(e,t),e.prototype.getInitialData=function(t,e){var n={name:t.name,children:t.data};BC(n);var i=t.levels||[],r=this.designatedVisualItemStyle={},o=new pc({itemStyle:r},this,e),a=z((i=t.levels=function(t,e){var n,i,r=ho(e.get("color")),o=ho(e.get(["aria","decal","decals"]));if(!r)return;E(t=t||[],(function(t){var e=new pc(t),r=e.get("color"),o=e.get("decal");(e.get(["itemStyle","color"])||r&&"none"!==r)&&(n=!0),(e.get(["itemStyle","decal"])||o&&"none"!==o)&&(i=!0)}));var a=t[0]||(t[0]={});n||(a.color=r.slice());!i&&o&&(a.decal=o.slice());return t}(i,e))||[],(function(t){return new pc(t,o,e)}),this),s=CC.createTree(n,this,(function(t){t.wrapMethod("getItemModel",(function(t,e){var n=s.getNodeByDataIndex(e),i=n?a[n.depth]:null;return t.parentModel=i||o,t}))}));return s.data},e.prototype.optionUpdated=function(){this.resetViewRoot()},e.prototype.formatTooltip=function(t,e,n){var i=this.getData(),r=this.getRawValue(t);return Uf("nameValue",{name:i.getName(t),value:r})},e.prototype.getDataParams=function(e){var n=t.prototype.getDataParams.apply(this,arguments),i=this.getData().tree.getNodeByDataIndex(e);return n.treeAncestors=LC(i,this),n.treePathInfo=n.treeAncestors,n},e.prototype.setLayoutInfo=function(t){this.layoutInfo=this.layoutInfo||{},A(this.layoutInfo,t)},e.prototype.mapIdToIndex=function(t){var e=this._idIndexMap;e||(e=this._idIndexMap=ft(),this._idIndexMapCount=0);var n=e.get(t);return null==n&&e.set(t,n=this._idIndexMapCount++),n},e.prototype.getViewRoot=function(){return this._viewRoot},e.prototype.resetViewRoot=function(t){t?this._viewRoot=t:t=this._viewRoot;var e=this.getRawData().tree.root;t&&(t===e||e.contains(t))||(this._viewRoot=e)},e.prototype.enableAriaDecal=function(){zC(this)},e.type="series.treemap",e.layoutMode="box",e.defaultOption={progressive:0,left:"center",top:"middle",width:"80%",height:"80%",sort:!0,clipWindow:"origin",squareRatio:.5*(1+Math.sqrt(5)),leafDepth:null,drillDownIcon:"▶",zoomToNodeRatio:.1024,roam:!0,nodeClick:"zoomToNode",animation:!0,animationDurationUpdate:900,animationEasing:"quinticInOut",breadcrumb:{show:!0,height:22,left:"center",top:"bottom",emptyItemWidth:25,itemStyle:{color:"rgba(0,0,0,0.7)",textStyle:{color:"#fff"}}},label:{show:!0,distance:0,padding:5,position:"inside",color:"#fff",overflow:"truncate"},upperLabel:{show:!1,position:[0,"50%"],height:20,overflow:"truncate",verticalAlign:"middle"},itemStyle:{color:null,colorAlpha:null,colorSaturation:null,borderWidth:0,gapWidth:0,borderColor:"#fff",borderColorSaturation:null},emphasis:{upperLabel:{show:!0,position:[0,"50%"],overflow:"truncate",verticalAlign:"middle"}},visualDimension:0,visualMin:null,visualMax:null,color:[],colorAlpha:null,colorSaturation:null,colorMappingBy:"index",visibleMin:10,childrenVisibleMin:null,levels:[]},e}(ag);function BC(t){var e=0;E(t.children,(function(t){BC(t);var n=t.value;Y(n)&&(n=n[0]),e+=n}));var n=t.value;Y(n)&&(n=n[0]),(null==n||isNaN(n))&&(n=e),n<0&&(n=0),Y(t.value)?t.value[0]=n:t.value=n}var FC=function(){function t(t){this.group=new Cr,t.add(this.group)}return t.prototype.render=function(t,e,n,i){var r=t.getModel("breadcrumb"),o=this.group;if(o.removeAll(),r.get("show")&&n){var a=r.getModel("itemStyle"),s=a.getModel("textStyle"),l={pos:{left:r.get("left"),right:r.get("right"),top:r.get("top"),bottom:r.get("bottom")},box:{width:e.getWidth(),height:e.getHeight()},emptyItemWidth:r.get("emptyItemWidth"),totalWidth:0,renderList:[]};this._prepare(n,l,s),this._renderContent(t,l,a,s,i),xp(o,l.pos,l.box)}},t.prototype._prepare=function(t,e,n){for(var i=t;i;i=i.parentNode){var r=xo(i.getModel().get("name"),""),o=n.getTextRect(r),a=Math.max(o.width+16,e.emptyItemWidth);e.totalWidth+=a+8,e.renderList.push({node:i,text:r,width:a})}},t.prototype._renderContent=function(t,e,n,i,r){for(var o,a,s,l,u,h,c,p,d,f=0,g=e.emptyItemWidth,y=t.get(["breadcrumb","height"]),v=(o=e.pos,a=e.box,l=a.width,u=a.height,h=Er(o.left,l),c=Er(o.top,u),p=Er(o.right,l),d=Er(o.bottom,u),(isNaN(h)||isNaN(parseFloat(o.left)))&&(h=0),(isNaN(p)||isNaN(parseFloat(o.right)))&&(p=l),(isNaN(c)||isNaN(parseFloat(o.top)))&&(c=0),(isNaN(d)||isNaN(parseFloat(o.bottom)))&&(d=u),s=np(s||0),{width:Math.max(p-h-s[1]-s[3],0),height:Math.max(d-c-s[0]-s[2],0)}),m=e.totalWidth,x=e.renderList,_=x.length-1;_>=0;_--){var b=x[_],w=b.node,S=b.width,M=b.text;m>v.width&&(m-=S-g,S=g,M=null);var I=new Lu({shape:{points:GC(f,0,S,y,_===x.length-1,0===_)},style:k(n.getItemStyle(),{lineJoin:"bevel"}),textContent:new As({style:{text:M,fill:i.getTextColor(),font:i.getFont()}}),textConfig:{position:"inside"},z2:1e5,onclick:H(r,w)});I.disableLabelAnimation=!0,this.group.add(I),WC(I,t,w),f+=S+8}},t.prototype.remove=function(){this.group.removeAll()},t}();function GC(t,e,n,i,r,o){var a=[[r?t:t-5,e],[t+n,e],[t+n,e+i],[r?t:t-5,e+i]];return!o&&a.splice(2,0,[t+n+5,e+i/2]),!r&&a.push([t,e+i/2]),a}function WC(t,e,n){Ws(t).eventData={componentType:"series",componentSubType:"treemap",componentIndex:e.componentIndex,seriesIndex:e.seriesIndex,seriesName:e.name,seriesType:"treemap",selfType:"breadcrumb",nodeData:{dataIndex:n&&n.dataIndex,name:n&&n.name},treePathInfo:n&&LC(n,e)}}var HC=function(){function t(){this._storage=[],this._elExistsMap={}}return t.prototype.add=function(t,e,n,i,r){return!this._elExistsMap[t.id]&&(this._elExistsMap[t.id]=!0,this._storage.push({el:t,target:e,duration:n,delay:i,easing:r}),!0)},t.prototype.finished=function(t){return this._finishedCallback=t,this},t.prototype.start=function(){for(var t=this,e=this._storage.length,n=function(){--e<=0&&(t._storage.length=0,t._elExistsMap={},t._finishedCallback&&t._finishedCallback())},i=0,r=this._storage.length;i<r;i++){var o=this._storage[i];o.el.animateTo(o.target,{duration:o.duration,delay:o.delay,easing:o.easing,setToFinal:!0,done:n,aborted:n})}return this},t}();var YC=Cr,UC=Ts,XC="label",ZC="upperLabel",jC=Wo([["fill","color"],["stroke","strokeColor"],["lineWidth","strokeWidth"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]),qC=function(t){var e=jC(t);return e.stroke=e.fill=e.lineWidth=null,e},KC=So(),$C=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._state="ready",n._storage={nodeGroup:[],background:[],content:[]},n}return n(e,t),e.prototype.render=function(t,e,n,i){if(!(P(e.findComponents({mainType:"series",subType:"treemap",query:i}),t)<0)){this.seriesModel=t,this.api=n,this.ecModel=e;var r=DC(i,["treemapZoomToNode","treemapRootToNode"],t),o=i&&i.type,a=t.layoutInfo,s=!this._oldTree,l=this._storage,u="treemapRootToNode"===o&&r&&l?{rootNodeGroup:l.nodeGroup[r.node.getRawIndex()],direction:i.direction}:null,h=this._giveContainerGroup(a),c=t.get("animation"),p=this._doRender(h,t,u);!c||s||o&&"treemapZoomToNode"!==o&&"treemapRootToNode"!==o?p.renderFinally():this._doAnimation(h,p,t,u),this._resetController(n),this._renderBreadcrumb(t,n,r)}},e.prototype._giveContainerGroup=function(t){var e=this._containerGroup;return e||(e=this._containerGroup=new YC,this._initEvents(e),this.group.add(e)),e.x=t.x,e.y=t.y,e},e.prototype._doRender=function(t,e,n){var i=e.getData().tree,r=this._oldTree,o={nodeGroup:[],background:[],content:[]},a={nodeGroup:[],background:[],content:[]},s=this._storage,l=[];function u(t,i,r,u){return function(t,e,n,i,r,o,a,s,l,u){if(!a)return;var h=a.getLayout(),c=t.getData(),p=a.getModel();if(c.setItemGraphicEl(a.dataIndex,null),!h||!h.isInView)return;var d=h.width,f=h.height,g=h.borderWidth,y=h.invisible,v=a.getRawIndex(),m=s&&s.getRawIndex(),x=a.viewChildren,_=h.upperHeight,b=x&&x.length,w=p.getModel("itemStyle"),S=p.getModel(["emphasis","itemStyle"]),M=p.getModel(["blur","itemStyle"]),I=p.getModel(["select","itemStyle"]),T=w.get("borderRadius")||0,C=G("nodeGroup",YC);if(!C)return;if(l.add(C),C.x=h.x||0,C.y=h.y||0,C.markRedraw(),KC(C).nodeWidth=d,KC(C).nodeHeight=f,h.isAboveViewRoot)return C;var D=G("background",UC,u,20);D&&E(C,D,b&&h.upperLabelHeight);var k=p.getModel("emphasis"),L=k.get("focus"),P=k.get("blurScope"),O=k.get("disabled"),R="ancestor"===L?a.getAncestorsIndices():"descendant"===L?a.getDescendantIndices():L;if(b)Bl(C)&&Vl(C,!1),D&&(Vl(D,!O),c.setItemGraphicEl(a.dataIndex,D),Rl(D,R,P));else{var N=G("content",UC,u,30);N&&z(C,N),D.disableMorphing=!0,D&&Bl(D)&&Vl(D,!1),Vl(C,!O),c.setItemGraphicEl(a.dataIndex,C),Rl(C,R,P)}return C;function E(e,n,i){var r=Ws(n);if(r.dataIndex=a.dataIndex,r.seriesIndex=t.seriesIndex,n.setShape({x:0,y:0,width:d,height:f,r:T}),y)V(n);else{n.invisible=!1;var o=a.getVisual("style"),s=o.stroke,l=qC(w);l.fill=s;var u=jC(S);u.fill=S.get("borderColor");var h=jC(M);h.fill=M.get("borderColor");var c=jC(I);if(c.fill=I.get("borderColor"),i){var p=d-2*g;B(n,s,o.opacity,{x:g,y:0,width:p,height:_})}else n.removeTextContent();n.setStyle(l),n.ensureState("emphasis").style=u,n.ensureState("blur").style=h,n.ensureState("select").style=c,yl(n)}e.add(n)}function z(e,n){var i=Ws(n);i.dataIndex=a.dataIndex,i.seriesIndex=t.seriesIndex;var r=Math.max(d-2*g,0),o=Math.max(f-2*g,0);if(n.culling=!0,n.setShape({x:g,y:g,width:r,height:o,r:T}),y)V(n);else{n.invisible=!1;var s=a.getVisual("style"),l=s.fill,u=qC(w);u.fill=l,u.decal=s.decal;var h=jC(S),c=jC(M),p=jC(I);B(n,l,s.opacity,null),n.setStyle(u),n.ensureState("emphasis").style=h,n.ensureState("blur").style=c,n.ensureState("select").style=p,yl(n)}e.add(n)}function V(t){!t.invisible&&o.push(t)}function B(e,n,i,r){var o=p.getModel(r?ZC:XC),s=xo(p.get("name"),null),l=o.getShallow("show");Wh(e,Hh(p,r?ZC:XC),{defaultText:l?s:null,inheritColor:n,defaultOpacity:i,labelFetcher:t,labelDataIndex:a.dataIndex});var u=e.getTextContent();if(u){var c=u.style,d=st(c.padding||0);r&&(e.setTextConfig({layoutRect:r}),u.disableLabelLayout=!0),u.beforeUpdate=function(){var t=Math.max((r?r.width:e.shape.width)-d[1]-d[3],0),n=Math.max((r?r.height:e.shape.height)-d[0]-d[2],0);c.width===t&&c.height===n||u.setStyle({width:t,height:n})},c.truncateMinChar=2,c.lineOverflow="truncate",F(c,r,h);var f=u.getState("emphasis");F(f?f.style:null,r,h)}}function F(e,n,i){var r=e?e.text:null;if(!n&&i.isLeafRoot&&null!=r){var o=t.get("drillDownIcon",!0);e.text=o?o+" "+r:r}}function G(t,i,o,a){var s=null!=m&&n[t][m],l=r[t];return s?(n[t][m]=null,W(l,s)):y||((s=new i)instanceof da&&(s.z2=function(t,e){return 100*t+e}(o,a)),H(l,s)),e[t][v]=s}function W(t,e){var n=t[v]={};e instanceof YC?(n.oldX=e.x,n.oldY=e.y):n.oldShape=A({},e.shape)}function H(t,e){var n=t[v]={},o=a.parentNode,s=e instanceof Cr;if(o&&(!i||"drillDown"===i.direction)){var l=0,u=0,h=r.background[o.getRawIndex()];!i&&h&&h.oldShape&&(l=h.oldShape.width,u=h.oldShape.height),s?(n.oldX=0,n.oldY=u):n.oldShape={x:l,y:u,width:0,height:0}}n.fadein=!s}}(e,a,s,n,o,l,t,i,r,u)}!function t(e,n,i,r,o){r?(n=e,E(e,(function(t,e){!t.isRemoved()&&s(e,e)}))):new Sm(n,e,a,a).add(s).update(s).remove(H(s,null)).execute();function a(t){return t.getId()}function s(a,s){var l=null!=a?e[a]:null,h=null!=s?n[s]:null,c=u(l,h,i,o);c&&t(l&&l.viewChildren||[],h&&h.viewChildren||[],c,r,o+1)}}(i.root?[i.root]:[],r&&r.root?[r.root]:[],t,i===r||!r,0);var h=function(t){var e={nodeGroup:[],background:[],content:[]};return t&&E(t,(function(t,n){var i=e[n];E(t,(function(t){t&&(i.push(t),KC(t).willDelete=!0)}))})),e}(s);return this._oldTree=i,this._storage=a,{lastsForAnimation:o,willDeleteEls:h,renderFinally:function(){E(h,(function(t){E(t,(function(t){t.parent&&t.parent.remove(t)}))})),E(l,(function(t){t.invisible=!0,t.dirty()}))}}},e.prototype._doAnimation=function(t,e,n,i){var r=n.get("animationDurationUpdate"),o=n.get("animationEasing"),a=(U(r)?0:r)||0,s=(U(o)?null:o)||"cubicOut",l=new HC;E(e.willDeleteEls,(function(t,e){E(t,(function(t,n){if(!t.invisible){var r,o=t.parent,u=KC(o);if(i&&"drillDown"===i.direction)r=o===i.rootNodeGroup?{shape:{x:0,y:0,width:u.nodeWidth,height:u.nodeHeight},style:{opacity:0}}:{style:{opacity:0}};else{var h=0,c=0;u.willDelete||(h=u.nodeWidth/2,c=u.nodeHeight/2),r="nodeGroup"===e?{x:h,y:c,style:{opacity:0}}:{shape:{x:h,y:c,width:0,height:0},style:{opacity:0}}}r&&l.add(t,r,a,0,s)}}))})),E(this._storage,(function(t,n){E(t,(function(t,i){var r=e.lastsForAnimation[n][i],o={};r&&(t instanceof Cr?null!=r.oldX&&(o.x=t.x,o.y=t.y,t.x=r.oldX,t.y=r.oldY):(r.oldShape&&(o.shape=A({},t.shape),t.setShape(r.oldShape)),r.fadein?(t.setStyle("opacity",0),o.style={opacity:1}):1!==t.style.opacity&&(o.style={opacity:1})),l.add(t,o,a,0,s))}))}),this),this._state="animating",l.finished(W((function(){this._state="ready",e.renderFinally()}),this)).start()},e.prototype._resetController=function(t){var e=this._controller;e||((e=this._controller=new DI(t.getZr())).enable(this.seriesModel.get("roam")),e.on("pan",W(this._onPan,this)),e.on("zoom",W(this._onZoom,this)));var n=new sr(0,0,t.getWidth(),t.getHeight());e.setPointerChecker((function(t,e,i){return n.contain(e,i)}))},e.prototype._clearController=function(){var t=this._controller;t&&(t.dispose(),t=null)},e.prototype._onPan=function(t){if("animating"!==this._state&&(Math.abs(t.dx)>3||Math.abs(t.dy)>3)){var e=this.seriesModel.getData().tree.root;if(!e)return;var n=e.getLayout();if(!n)return;this.api.dispatchAction({type:"treemapMove",from:this.uid,seriesId:this.seriesModel.id,rootRect:{x:n.x+t.dx,y:n.y+t.dy,width:n.width,height:n.height}})}},e.prototype._onZoom=function(t){var e=t.originX,n=t.originY;if("animating"!==this._state){var i=this.seriesModel.getData().tree.root;if(!i)return;var r=i.getLayout();if(!r)return;var o=new sr(r.x,r.y,r.width,r.height),a=this.seriesModel.layoutInfo,s=[1,0,0,1,0,0];Ei(s,s,[-(e-=a.x),-(n-=a.y)]),Vi(s,s,[t.scale,t.scale]),Ei(s,s,[e,n]),o.applyTransform(s),this.api.dispatchAction({type:"treemapRender",from:this.uid,seriesId:this.seriesModel.id,rootRect:{x:o.x,y:o.y,width:o.width,height:o.height}})}},e.prototype._initEvents=function(t){var e=this;t.on("click",(function(t){if("ready"===e._state){var n=e.seriesModel.get("nodeClick",!0);if(n){var i=e.findTarget(t.offsetX,t.offsetY);if(i){var r=i.node;if(r.getLayout().isLeafRoot)e._rootToNode(i);else if("zoomToNode"===n)e._zoomToNode(i);else if("link"===n){var o=r.hostTree.data.getItemModel(r.dataIndex),a=o.get("link",!0),s=o.get("target",!0)||"blank";a&&pp(a,s)}}}}}),this)},e.prototype._renderBreadcrumb=function(t,e,n){var i=this;n||(n=null!=t.get("leafDepth",!0)?{node:t.getViewRoot()}:this.findTarget(e.getWidth()/2,e.getHeight()/2))||(n={node:t.getData().tree.root}),(this._breadcrumb||(this._breadcrumb=new FC(this.group))).render(t,e,n.node,(function(e){"animating"!==i._state&&(kC(t.getViewRoot(),e)?i._rootToNode({node:e}):i._zoomToNode({node:e}))}))},e.prototype.remove=function(){this._clearController(),this._containerGroup&&this._containerGroup.removeAll(),this._storage={nodeGroup:[],background:[],content:[]},this._state="ready",this._breadcrumb&&this._breadcrumb.remove()},e.prototype.dispose=function(){this._clearController()},e.prototype._zoomToNode=function(t){this.api.dispatchAction({type:"treemapZoomToNode",from:this.uid,seriesId:this.seriesModel.id,targetNode:t.node})},e.prototype._rootToNode=function(t){this.api.dispatchAction({type:"treemapRootToNode",from:this.uid,seriesId:this.seriesModel.id,targetNode:t.node})},e.prototype.findTarget=function(t,e){var n;return this.seriesModel.getViewRoot().eachNode({attr:"viewChildren",order:"preorder"},(function(i){var r=this._storage.background[i.getRawIndex()];if(r){var o=r.transformCoordToLocal(t,e),a=r.shape;if(!(a.x<=o[0]&&o[0]<=a.x+a.width&&a.y<=o[1]&&o[1]<=a.y+a.height))return!1;n={node:i,offsetX:o[0],offsetY:o[1]}}}),this),n},e.type="treemap",e}(mg);var JC=E,QC=q,tD=-1,eD=function(){function t(e){var n=e.mappingMethod,i=e.type,r=this.option=T(e);this.type=i,this.mappingMethod=n,this._normalizeData=cD[n];var o=t.visualHandlers[i];this.applyVisual=o.applyVisual,this.getColorMapper=o.getColorMapper,this._normalizedToVisual=o._normalizedToVisual[n],"piecewise"===n?(nD(r),function(t){var e=t.pieceList;t.hasSpecialVisual=!1,E(e,(function(e,n){e.originIndex=n,null!=e.visual&&(t.hasSpecialVisual=!0)}))}(r)):"category"===n?r.categories?function(t){var e=t.categories,n=t.categoryMap={},i=t.visual;if(JC(e,(function(t,e){n[t]=e})),!Y(i)){var r=[];q(i)?JC(i,(function(t,e){var i=n[e];r[null!=i?i:tD]=t})):r[-1]=i,i=hD(t,r)}for(var o=e.length-1;o>=0;o--)null==i[o]&&(delete n[e[o]],e.pop())}(r):nD(r,!0):(lt("linear"!==n||r.dataExtent),nD(r))}return t.prototype.mapValueToVisual=function(t){var e=this._normalizeData(t);return this._normalizedToVisual(e,t)},t.prototype.getNormalizer=function(){return W(this._normalizeData,this)},t.listVisualTypes=function(){return G(t.visualHandlers)},t.isValidType=function(e){return t.visualHandlers.hasOwnProperty(e)},t.eachVisual=function(t,e,n){q(t)?E(t,e,n):e.call(n,t)},t.mapVisual=function(e,n,i){var r,o=Y(e)?[]:q(e)?{}:(r=!0,null);return t.eachVisual(e,(function(t,e){var a=n.call(i,t,e);r?o=a:o[e]=a})),o},t.retrieveVisuals=function(e){var n,i={};return e&&JC(t.visualHandlers,(function(t,r){e.hasOwnProperty(r)&&(i[r]=e[r],n=!0)})),n?i:null},t.prepareVisualTypes=function(t){if(Y(t))t=t.slice();else{if(!QC(t))return[];var e=[];JC(t,(function(t,n){e.push(n)})),t=e}return t.sort((function(t,e){return"color"===e&&"color"!==t&&0===t.indexOf("color")?1:-1})),t},t.dependsOn=function(t,e){return"color"===e?!(!t||0!==t.indexOf(e)):t===e},t.findPieceIndex=function(t,e,n){for(var i,r=1/0,o=0,a=e.length;o<a;o++){var s=e[o].value;if(null!=s){if(s===t||X(s)&&s===t+"")return o;n&&c(s,o)}}for(o=0,a=e.length;o<a;o++){var l=e[o],u=l.interval,h=l.close;if(u){if(u[0]===-1/0){if(pD(h[1],t,u[1]))return o}else if(u[1]===1/0){if(pD(h[0],u[0],t))return o}else if(pD(h[0],u[0],t)&&pD(h[1],t,u[1]))return o;n&&c(u[0],o),n&&c(u[1],o)}}if(n)return t===1/0?e.length-1:t===-1/0?0:i;function c(e,n){var o=Math.abs(e-t);o<r&&(r=o,i=n)}},t.visualHandlers={color:{applyVisual:oD("color"),getColorMapper:function(){var t=this.option;return W("category"===t.mappingMethod?function(t,e){return!e&&(t=this._normalizeData(t)),aD.call(this,t)}:function(e,n,i){var r=!!i;return!n&&(e=this._normalizeData(e)),i=Mn(e,t.parsedVisual,i),r?i:kn(i,"rgba")},this)},_normalizedToVisual:{linear:function(t){return kn(Mn(t,this.option.parsedVisual),"rgba")},category:aD,piecewise:function(t,e){var n=uD.call(this,e);return null==n&&(n=kn(Mn(t,this.option.parsedVisual),"rgba")),n},fixed:sD}},colorHue:iD((function(t,e){return Dn(t,e)})),colorSaturation:iD((function(t,e){return Dn(t,null,e)})),colorLightness:iD((function(t,e){return Dn(t,null,null,e)})),colorAlpha:iD((function(t,e){return An(t,e)})),decal:{applyVisual:oD("decal"),_normalizedToVisual:{linear:null,category:aD,piecewise:null,fixed:null}},opacity:{applyVisual:oD("opacity"),_normalizedToVisual:lD([0,1])},liftZ:{applyVisual:oD("liftZ"),_normalizedToVisual:{linear:sD,category:sD,piecewise:sD,fixed:sD}},symbol:{applyVisual:function(t,e,n){n("symbol",this.mapValueToVisual(t))},_normalizedToVisual:{linear:rD,category:aD,piecewise:function(t,e){var n=uD.call(this,e);return null==n&&(n=rD.call(this,t)),n},fixed:sD}},symbolSize:{applyVisual:oD("symbolSize"),_normalizedToVisual:lD([0,1])}},t}();function nD(t,e){var n=t.visual,i=[];q(n)?JC(n,(function(t){i.push(t)})):null!=n&&i.push(n);e||1!==i.length||{color:1,symbol:1}.hasOwnProperty(t.type)||(i[1]=i[0]),hD(t,i)}function iD(t){return{applyVisual:function(e,n,i){var r=this.mapValueToVisual(e);i("color",t(n("color"),r))},_normalizedToVisual:lD([0,1])}}function rD(t){var e=this.option.visual;return e[Math.round(Nr(t,[0,1],[0,e.length-1],!0))]||{}}function oD(t){return function(e,n,i){i(t,this.mapValueToVisual(e))}}function aD(t){var e=this.option.visual;return e[this.option.loop&&t!==tD?t%e.length:t]}function sD(){return this.option.visual[0]}function lD(t){return{linear:function(e){return Nr(e,t,this.option.visual,!0)},category:aD,piecewise:function(e,n){var i=uD.call(this,n);return null==i&&(i=Nr(e,t,this.option.visual,!0)),i},fixed:sD}}function uD(t){var e=this.option,n=e.pieceList;if(e.hasSpecialVisual){var i=n[eD.findPieceIndex(t,n)];if(i&&i.visual)return i.visual[this.type]}}function hD(t,e){return t.visual=e,"color"===t.type&&(t.parsedVisual=z(e,(function(t){return bn(t)}))),e}var cD={linear:function(t){return Nr(t,this.option.dataExtent,[0,1],!0)},piecewise:function(t){var e=this.option.pieceList,n=eD.findPieceIndex(t,e,!0);if(null!=n)return Nr(n,[0,e.length-1],[0,1],!0)},category:function(t){var e=this.option.categories?this.option.categoryMap[t]:t;return null==e?tD:e},fixed:xt};function pD(t,e,n){return t?e<=n:e<n}var dD=So(),fD={seriesType:"treemap",reset:function(t){var e=t.getData().tree.root;e.isRemoved()||gD(e,{},t.getViewRoot().getAncestors(),t)}};function gD(t,e,n,i){var r=t.getModel(),o=t.getLayout(),a=t.hostTree.data;if(o&&!o.invisible&&o.isInView){var s,l=r.getModel("itemStyle"),u=function(t,e,n){var i=A({},e),r=n.designatedVisualItemStyle;return E(["color","colorAlpha","colorSaturation"],(function(n){r[n]=e[n];var o=t.get(n);r[n]=null,null!=o&&(i[n]=o)})),i}(l,e,i),h=a.ensureUniqueItemVisual(t.dataIndex,"style"),c=l.get("borderColor"),p=l.get("borderColorSaturation");null!=p&&(c=function(t,e){return null!=e?Dn(e,null,null,t):null}(p,s=yD(u))),h.stroke=c;var d=t.viewChildren;if(d&&d.length){var f=function(t,e,n,i,r,o){if(!o||!o.length)return;var a=mD(e,"color")||null!=r.color&&"none"!==r.color&&(mD(e,"colorAlpha")||mD(e,"colorSaturation"));if(!a)return;var s=e.get("visualMin"),l=e.get("visualMax"),u=n.dataExtent.slice();null!=s&&s<u[0]&&(u[0]=s),null!=l&&l>u[1]&&(u[1]=l);var h=e.get("colorMappingBy"),c={type:a.name,dataExtent:u,visual:a.range};"color"!==c.type||"index"!==h&&"id"!==h?c.mappingMethod="linear":(c.mappingMethod="category",c.loop=!0);var p=new eD(c);return dD(p).drColorMappingBy=h,p}(0,r,o,0,u,d);E(d,(function(t,e){if(t.depth>=n.length||t===n[t.depth]){var o=function(t,e,n,i,r,o){var a=A({},e);if(r){var s=r.type,l="color"===s&&dD(r).drColorMappingBy,u="index"===l?i:"id"===l?o.mapIdToIndex(n.getId()):n.getValue(t.get("visualDimension"));a[s]=r.mapValueToVisual(u)}return a}(r,u,t,e,f,i);gD(t,o,n,i)}}))}else s=yD(u),h.fill=s}}function yD(t){var e=vD(t,"color");if(e){var n=vD(t,"colorAlpha"),i=vD(t,"colorSaturation");return i&&(e=Dn(e,null,null,i)),n&&(e=An(e,n)),e}}function vD(t,e){var n=t[e];if(null!=n&&"none"!==n)return n}function mD(t,e){var n=t.get(e);return Y(n)&&n.length?{name:e,range:n}:null}var xD=Math.max,_D=Math.min,bD=it,wD=E,SD=["itemStyle","borderWidth"],MD=["itemStyle","gapWidth"],ID=["upperLabel","show"],TD=["upperLabel","height"],CD={seriesType:"treemap",reset:function(t,e,n,i){var r=n.getWidth(),o=n.getHeight(),a=t.option,s=mp(t.getBoxLayoutParams(),{width:n.getWidth(),height:n.getHeight()}),l=a.size||[],u=Er(bD(s.width,l[0]),r),h=Er(bD(s.height,l[1]),o),c=i&&i.type,p=DC(i,["treemapZoomToNode","treemapRootToNode"],t),d="treemapRender"===c||"treemapMove"===c?i.rootRect:null,f=t.getViewRoot(),g=AC(f);if("treemapMove"!==c){var y="treemapZoomToNode"===c?function(t,e,n,i,r){var o,a=(e||{}).node,s=[i,r];if(!a||a===n)return s;var l=i*r,u=l*t.option.zoomToNodeRatio;for(;o=a.parentNode;){for(var h=0,c=o.children,p=0,d=c.length;p<d;p++)h+=c[p].getValue();var f=a.getValue();if(0===f)return s;u*=h/f;var g=o.getModel(),y=g.get(SD);(u+=4*y*y+(3*y+Math.max(y,PD(g)))*Math.pow(u,.5))>Yr&&(u=Yr),a=o}u<l&&(u=l);var v=Math.pow(u/l,.5);return[i*v,r*v]}(t,p,f,u,h):d?[d.width,d.height]:[u,h],v=a.sort;v&&"asc"!==v&&"desc"!==v&&(v="desc");var m={squareRatio:a.squareRatio,sort:v,leafDepth:a.leafDepth};f.hostTree.clearLayouts();var x={x:0,y:0,width:y[0],height:y[1],area:y[0]*y[1]};f.setLayout(x),DD(f,m,!1,0),x=f.getLayout(),wD(g,(function(t,e){var n=(g[e+1]||f).getValue();t.setLayout(A({dataExtent:[n,n],borderWidth:0,upperHeight:0},x))}))}var _=t.getData().tree.root;_.setLayout(function(t,e,n){if(e)return{x:e.x,y:e.y};var i={x:0,y:0};if(!n)return i;var r=n.node,o=r.getLayout();if(!o)return i;var a=[o.width/2,o.height/2],s=r;for(;s;){var l=s.getLayout();a[0]+=l.x,a[1]+=l.y,s=s.parentNode}return{x:t.width/2-a[0],y:t.height/2-a[1]}}(s,d,p),!0),t.setLayoutInfo(s),LD(_,new sr(-s.x,-s.y,r,o),g,f,0)}};function DD(t,e,n,i){var r,o;if(!t.isRemoved()){var a=t.getLayout();r=a.width,o=a.height;var s=t.getModel(),l=s.get(SD),u=s.get(MD)/2,h=PD(s),c=Math.max(l,h),p=l-u,d=c-u;t.setLayout({borderWidth:l,upperHeight:c,upperLabelHeight:h},!0);var f=(r=xD(r-2*p,0))*(o=xD(o-p-d,0)),g=function(t,e,n,i,r,o){var a=t.children||[],s=i.sort;"asc"!==s&&"desc"!==s&&(s=null);var l=null!=i.leafDepth&&i.leafDepth<=o;if(r&&!l)return t.viewChildren=[];!function(t,e){e&&t.sort((function(t,n){var i="asc"===e?t.getValue()-n.getValue():n.getValue()-t.getValue();return 0===i?"asc"===e?t.dataIndex-n.dataIndex:n.dataIndex-t.dataIndex:i}))}(a=B(a,(function(t){return!t.isRemoved()})),s);var u=function(t,e,n){for(var i=0,r=0,o=e.length;r<o;r++)i+=e[r].getValue();var a,s=t.get("visualDimension");e&&e.length?"value"===s&&n?(a=[e[e.length-1].getValue(),e[0].getValue()],"asc"===n&&a.reverse()):(a=[1/0,-1/0],wD(e,(function(t){var e=t.getValue(s);e<a[0]&&(a[0]=e),e>a[1]&&(a[1]=e)}))):a=[NaN,NaN];return{sum:i,dataExtent:a}}(e,a,s);if(0===u.sum)return t.viewChildren=[];if(u.sum=function(t,e,n,i,r){if(!i)return n;for(var o=t.get("visibleMin"),a=r.length,s=a,l=a-1;l>=0;l--){var u=r["asc"===i?a-l-1:l].getValue();u/n*e<o&&(s=l,n-=u)}return"asc"===i?r.splice(0,a-s):r.splice(s,a-s),n}(e,n,u.sum,s,a),0===u.sum)return t.viewChildren=[];for(var h=0,c=a.length;h<c;h++){var p=a[h].getValue()/u.sum*n;a[h].setLayout({area:p})}l&&(a.length&&t.setLayout({isLeafRoot:!0},!0),a.length=0);return t.viewChildren=a,t.setLayout({dataExtent:u.dataExtent},!0),a}(t,s,f,e,n,i);if(g.length){var y={x:p,y:d,width:r,height:o},v=_D(r,o),m=1/0,x=[];x.area=0;for(var _=0,b=g.length;_<b;){var w=g[_];x.push(w),x.area+=w.getLayout().area;var S=AD(x,v,e.squareRatio);S<=m?(_++,m=S):(x.area-=x.pop().getLayout().area,kD(x,v,y,u,!1),v=_D(y.width,y.height),x.length=x.area=0,m=1/0)}if(x.length&&kD(x,v,y,u,!0),!n){var M=s.get("childrenVisibleMin");null!=M&&f<M&&(n=!0)}for(_=0,b=g.length;_<b;_++)DD(g[_],e,n,i+1)}}}function AD(t,e,n){for(var i=0,r=1/0,o=0,a=void 0,s=t.length;o<s;o++)(a=t[o].getLayout().area)&&(a<r&&(r=a),a>i&&(i=a));var l=t.area*t.area,u=e*e*n;return l?xD(u*i/l,l/(u*r)):1/0}function kD(t,e,n,i,r){var o=e===n.width?0:1,a=1-o,s=["x","y"],l=["width","height"],u=n[s[o]],h=e?t.area/e:0;(r||h>n[l[a]])&&(h=n[l[a]]);for(var c=0,p=t.length;c<p;c++){var d=t[c],f={},g=h?d.getLayout().area/h:0,y=f[l[a]]=xD(h-2*i,0),v=n[s[o]]+n[l[o]]-u,m=c===p-1||v<g?v:g,x=f[l[o]]=xD(m-2*i,0);f[s[a]]=n[s[a]]+_D(i,y/2),f[s[o]]=u+_D(i,x/2),u+=m,d.setLayout(f,!0)}n[s[a]]+=h,n[l[a]]-=h}function LD(t,e,n,i,r){var o=t.getLayout(),a=n[r],s=a&&a===t;if(!(a&&!s||r===n.length&&t!==i)){t.setLayout({isInView:!0,invisible:!s&&!e.intersect(o),isAboveViewRoot:s},!0);var l=new sr(e.x-o.x,e.y-o.y,e.width,e.height);wD(t.viewChildren||[],(function(t){LD(t,l,n,i,r+1)}))}}function PD(t){return t.get(ID)?t.get(TD):0}function OD(t){var e=t.findComponents({mainType:"legend"});e&&e.length&&t.eachSeriesByType("graph",(function(t){var n=t.getCategoriesData(),i=t.getGraph().data,r=n.mapArray(n.getName);i.filterSelf((function(t){var n=i.getItemModel(t).getShallow("category");if(null!=n){j(n)&&(n=r[n]);for(var o=0;o<e.length;o++)if(!e[o].isSelected(n))return!1}return!0}))}))}function RD(t){var e={};t.eachSeriesByType("graph",(function(t){var n=t.getCategoriesData(),i=t.getData(),r={};n.each((function(i){var o=n.getName(i);r["ec-"+o]=i;var a=n.getItemModel(i),s=a.getModel("itemStyle").getItemStyle();s.fill||(s.fill=t.getColorFromPalette(o,e)),n.setItemVisual(i,"style",s);for(var l=["symbol","symbolSize","symbolKeepAspect"],u=0;u<l.length;u++){var h=a.getShallow(l[u],!0);null!=h&&n.setItemVisual(i,l[u],h)}})),n.count()&&i.each((function(t){var e=i.getItemModel(t).getShallow("category");if(null!=e){X(e)&&(e=r["ec-"+e]);var o=n.getItemVisual(e,"style");A(i.ensureUniqueItemVisual(t,"style"),o);for(var a=["symbol","symbolSize","symbolKeepAspect"],s=0;s<a.length;s++)i.setItemVisual(t,a[s],n.getItemVisual(e,a[s]))}}))}))}function ND(t){return t instanceof Array||(t=[t,t]),t}function ED(t){t.eachSeriesByType("graph",(function(t){var e=t.getGraph(),n=t.getEdgeData(),i=ND(t.get("edgeSymbol")),r=ND(t.get("edgeSymbolSize"));n.setVisual("fromSymbol",i&&i[0]),n.setVisual("toSymbol",i&&i[1]),n.setVisual("fromSymbolSize",r&&r[0]),n.setVisual("toSymbolSize",r&&r[1]),n.setVisual("style",t.getModel("lineStyle").getLineStyle()),n.each((function(t){var i=n.getItemModel(t),r=e.getEdgeByIndex(t),o=ND(i.getShallow("symbol",!0)),a=ND(i.getShallow("symbolSize",!0)),s=i.getModel("lineStyle").getLineStyle(),l=n.ensureUniqueItemVisual(t,"style");switch(A(l,s),l.stroke){case"source":var u=r.node1.getVisual("style");l.stroke=u&&u.fill;break;case"target":u=r.node2.getVisual("style");l.stroke=u&&u.fill}o[0]&&r.setVisual("fromSymbol",o[0]),o[1]&&r.setVisual("toSymbol",o[1]),a[0]&&r.setVisual("fromSymbolSize",a[0]),a[1]&&r.setVisual("toSymbolSize",a[1])}))}))}var zD="--\x3e",VD=function(t){return t.get("autoCurveness")||null},BD=function(t,e){var n=VD(t),i=20,r=[];if(j(n))i=n;else if(Y(n))return void(t.__curvenessList=n);e>i&&(i=e);var o=i%2?i+2:i+3;r=[];for(var a=0;a<o;a++)r.push((a%2?a+1:a)/10*(a%2?-1:1));t.__curvenessList=r},FD=function(t,e,n){var i=[t.id,t.dataIndex].join("."),r=[e.id,e.dataIndex].join(".");return[n.uid,i,r].join(zD)},GD=function(t){var e=t.split(zD);return[e[0],e[2],e[1]].join(zD)},WD=function(t,e){var n=e.__edgeMap;return n[t]?n[t].length:0};function HD(t,e,n,i){var r=VD(e),o=Y(r);if(!r)return null;var a=function(t,e){var n=FD(t.node1,t.node2,e);return e.__edgeMap[n]}(t,e);if(!a)return null;for(var s=-1,l=0;l<a.length;l++)if(a[l]===n){s=l;break}var u=function(t,e){return WD(FD(t.node1,t.node2,e),e)+WD(FD(t.node2,t.node1,e),e)}(t,e);BD(e,u),t.lineStyle=t.lineStyle||{};var h=FD(t.node1,t.node2,e),c=e.__curvenessList,p=o||u%2?0:1;if(a.isForward)return c[p+s];var d=GD(h),f=WD(d,e),g=c[s+f+p];return i?o?r&&0===r[0]?(f+p)%2?g:-g:((f%2?0:1)+p)%2?g:-g:(f+p)%2?g:-g:c[s+f+p]}function YD(t){var e=t.coordinateSystem;if(!e||"view"===e.type){var n=t.getGraph();n.eachNode((function(t){var e=t.getModel();t.setLayout([+e.get("x"),+e.get("y")])})),UD(n,t)}}function UD(t,e){t.eachEdge((function(t,n){var i=ot(t.getModel().get(["lineStyle","curveness"]),-HD(t,e,n,!0),0),r=Mt(t.node1.getLayout()),o=Mt(t.node2.getLayout()),a=[r,o];+i&&a.push([(r[0]+o[0])/2-(r[1]-o[1])*i,(r[1]+o[1])/2-(o[0]-r[0])*i]),t.setLayout(a)}))}function XD(t,e){t.eachSeriesByType("graph",(function(t){var e=t.get("layout"),n=t.coordinateSystem;if(n&&"view"!==n.type){var i=t.getData(),r=[];E(n.dimensions,(function(t){r=r.concat(i.mapDimensionsAll(t))}));for(var o=0;o<i.count();o++){for(var a=[],s=!1,l=0;l<r.length;l++){var u=i.get(r[l],o);isNaN(u)||(s=!0),a.push(u)}s?i.setItemLayout(o,n.dataToPoint(a)):i.setItemLayout(o,[NaN,NaN])}UD(i.graph,t)}else e&&"none"!==e||YD(t)}))}function ZD(t){var e=t.coordinateSystem;if("view"!==e.type)return 1;var n=t.option.nodeScaleRatio,i=e.scaleX;return((e.getZoom()-1)*n+1)/i}function jD(t){var e=t.getVisual("symbolSize");return e instanceof Array&&(e=(e[0]+e[1])/2),+e}var qD=Math.PI,KD=[];function $D(t,e){var n=t.coordinateSystem;if(!n||"view"===n.type){var i=n.getBoundingRect(),r=t.getData(),o=r.graph,a=i.width/2+i.x,s=i.height/2+i.y,l=Math.min(i.width,i.height)/2,u=r.count();r.setLayout({cx:a,cy:s}),u&&(JD[e](t,o,r,l,a,s,u),o.eachEdge((function(e,n){var i,r=ot(e.getModel().get(["lineStyle","curveness"]),HD(e,t,n),0),o=Mt(e.node1.getLayout()),l=Mt(e.node2.getLayout()),u=(o[0]+l[0])/2,h=(o[1]+l[1])/2;+r&&(i=[a*(r*=3)+u*(1-r),s*r+h*(1-r)]),e.setLayout([o,l,i])})))}}var JD={value:function(t,e,n,i,r,o,a){var s=0,l=n.getSum("value"),u=2*Math.PI/(l||a);e.eachNode((function(t){var e=t.getValue("value"),n=u*(l?e:1)/2;s+=n,t.setLayout([i*Math.cos(s)+r,i*Math.sin(s)+o]),s+=n}))},symbolSize:function(t,e,n,i,r,o,a){var s=0;KD.length=a;var l=ZD(t);e.eachNode((function(t){var e=jD(t);isNaN(e)&&(e=2),e<0&&(e=0),e*=l;var n=Math.asin(e/2/i);isNaN(n)&&(n=qD/2),KD[t.dataIndex]=n,s+=2*n}));var u=(2*qD-s)/a/2,h=0;e.eachNode((function(t){var e=u+KD[t.dataIndex];h+=e,t.setLayout([i*Math.cos(h)+r,i*Math.sin(h)+o]),h+=e}))}};function QD(t){t.eachSeriesByType("graph",(function(t){"circular"===t.get("layout")&&$D(t,"symbolSize")}))}var tA=Ct;function eA(t){t.eachSeriesByType("graph",(function(t){var e=t.coordinateSystem;if(!e||"view"===e.type)if("force"===t.get("layout")){var n=t.preservedPoints||{},i=t.getGraph(),r=i.data,o=i.edgeData,a=t.getModel("force"),s=a.get("initLayout");t.preservedPoints?r.each((function(t){var e=r.getId(t);r.setItemLayout(t,n[e]||[NaN,NaN])})):s&&"none"!==s?"circular"===s&&$D(t,"value"):YD(t);var l=r.getDataExtent("value"),u=o.getDataExtent("value"),h=a.get("repulsion"),c=a.get("edgeLength"),p=Y(h)?h:[h,h],d=Y(c)?c:[c,c];d=[d[1],d[0]];var f=r.mapArray("value",(function(t,e){var n=r.getItemLayout(e),i=Nr(t,l,p);return isNaN(i)&&(i=(p[0]+p[1])/2),{w:i,rep:i,fixed:r.getItemModel(e).get("fixed"),p:!n||isNaN(n[0])||isNaN(n[1])?null:n}})),g=o.mapArray("value",(function(e,n){var r=i.getEdgeByIndex(n),o=Nr(e,u,d);isNaN(o)&&(o=(d[0]+d[1])/2);var a=r.getModel(),s=ot(r.getModel().get(["lineStyle","curveness"]),-HD(r,t,n,!0),0);return{n1:f[r.node1.dataIndex],n2:f[r.node2.dataIndex],d:o,curveness:s,ignoreForceLayout:a.get("ignoreForceLayout")}})),y=e.getBoundingRect(),v=function(t,e,n){for(var i=t,r=e,o=n.rect,a=o.width,s=o.height,l=[o.x+a/2,o.y+s/2],u=null==n.gravity?.1:n.gravity,h=0;h<i.length;h++){var c=i[h];c.p||(c.p=wt(a*(Math.random()-.5)+l[0],s*(Math.random()-.5)+l[1])),c.pp=Mt(c.p),c.edges=null}var p,d,f=null==n.friction?.6:n.friction,g=f;return{warmUp:function(){g=.8*f},setFixed:function(t){i[t].fixed=!0},setUnfixed:function(t){i[t].fixed=!1},beforeStep:function(t){p=t},afterStep:function(t){d=t},step:function(t){p&&p(i,r);for(var e=[],n=i.length,o=0;o<r.length;o++){var a=r[o];if(!a.ignoreForceLayout){var s=a.n1;Dt(e,(y=a.n2).p,s.p);var h=At(e)-a.d,c=y.w/(s.w+y.w);isNaN(c)&&(c=0),Rt(e,e),!s.fixed&&tA(s.p,s.p,e,c*h*g),!y.fixed&&tA(y.p,y.p,e,-(1-c)*h*g)}}for(o=0;o<n;o++)(x=i[o]).fixed||(Dt(e,l,x.p),tA(x.p,x.p,e,u*g));for(o=0;o<n;o++){s=i[o];for(var f=o+1;f<n;f++){var y;Dt(e,(y=i[f]).p,s.p),0===(h=At(e))&&(It(e,Math.random()-.5,Math.random()-.5),h=1);var v=(s.rep+y.rep)/h/h;!s.fixed&&tA(s.pp,s.pp,e,v),!y.fixed&&tA(y.pp,y.pp,e,-v)}}var m=[];for(o=0;o<n;o++){var x;(x=i[o]).fixed||(Dt(m,x.p,x.pp),tA(x.p,x.p,m,g),St(x.pp,x.p))}var _=(g*=.992)<.01;d&&d(i,r,_),t&&t(_)}}}(f,g,{rect:y,gravity:a.get("gravity"),friction:a.get("friction")});v.beforeStep((function(t,e){for(var n=0,r=t.length;n<r;n++)t[n].fixed&&St(t[n].p,i.getNodeByIndex(n).getLayout())})),v.afterStep((function(t,e,o){for(var a=0,s=t.length;a<s;a++)t[a].fixed||i.getNodeByIndex(a).setLayout(t[a].p),n[r.getId(a)]=t[a].p;for(a=0,s=e.length;a<s;a++){var l=e[a],u=i.getEdgeByIndex(a),h=l.n1.p,c=l.n2.p,p=u.getLayout();(p=p?p.slice():[])[0]=p[0]||[],p[1]=p[1]||[],St(p[0],h),St(p[1],c),+l.curveness&&(p[2]=[(h[0]+c[0])/2-(h[1]-c[1])*l.curveness,(h[1]+c[1])/2-(c[0]-h[0])*l.curveness]),u.setLayout(p)}})),t.forceLayout=v,t.preservedPoints=n,v.step()}else t.forceLayout=null}))}function nA(t,e){var n=[];return t.eachSeriesByType("graph",(function(t){var i=t.get("coordinateSystem");if(!i||"view"===i){var r=t.getData(),o=[],a=[];Ma(r.mapArray((function(t){var e=r.getItemModel(t);return[+e.get("x"),+e.get("y")]})),o,a),a[0]-o[0]==0&&(a[0]+=1,o[0]-=1),a[1]-o[1]==0&&(a[1]+=1,o[1]-=1);var s=(a[0]-o[0])/(a[1]-o[1]),l=function(t,e,n){return mp(A(t.getBoxLayoutParams(),{aspect:n}),{width:e.getWidth(),height:e.getHeight()})}(t,e,s);isNaN(s)&&(o=[l.x,l.y],a=[l.x+l.width,l.y+l.height]);var u=a[0]-o[0],h=a[1]-o[1],c=l.width,p=l.height,d=t.coordinateSystem=new BT;d.zoomLimit=t.get("scaleLimit"),d.setBoundingRect(o[0],o[1],u,h),d.setViewRect(l.x,l.y,c,p),d.setCenter(t.get("center")),d.setZoom(t.get("zoom")),n.push(d)}})),n}var iA=Eu.prototype,rA=Fu.prototype,oA=function(){this.x1=0,this.y1=0,this.x2=0,this.y2=0,this.percent=1};!function(t){function e(){return null!==t&&t.apply(this,arguments)||this}n(e,t)}(oA);function aA(t){return isNaN(+t.cpx1)||isNaN(+t.cpy1)}var sA=function(t){function e(e){var n=t.call(this,e)||this;return n.type="ec-line",n}return n(e,t),e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new oA},e.prototype.buildPath=function(t,e){aA(e)?iA.buildPath.call(this,t,e):rA.buildPath.call(this,t,e)},e.prototype.pointAt=function(t){return aA(this.shape)?iA.pointAt.call(this,t):rA.pointAt.call(this,t)},e.prototype.tangentAt=function(t){var e=this.shape,n=aA(e)?[e.x2-e.x1,e.y2-e.y1]:rA.tangentAt.call(this,t);return Rt(n,n)},e}(fs),lA=["fromSymbol","toSymbol"];function uA(t){return"_"+t+"Type"}function hA(t,e,n){var i=e.getItemVisual(n,t);if(i&&"none"!==i){var r=e.getItemVisual(n,t+"Size"),o=e.getItemVisual(n,t+"Rotate"),a=e.getItemVisual(n,t+"Offset"),s=e.getItemVisual(n,t+"KeepAspect"),l=Ly(r),u=Py(a||0,l),h=ky(i,-l[0]/2+u[0],-l[1]/2+u[1],l[0],l[1],null,s);return h.__specifiedRotation=null==o||isNaN(o)?void 0:+o*Math.PI/180||0,h.name=t,h}}function cA(t,e){t.x1=e[0][0],t.y1=e[0][1],t.x2=e[1][0],t.y2=e[1][1],t.percent=1;var n=e[2];n?(t.cpx1=n[0],t.cpy1=n[1]):(t.cpx1=NaN,t.cpy1=NaN)}var pA=function(t){function e(e,n,i){var r=t.call(this)||this;return r._createLine(e,n,i),r}return n(e,t),e.prototype._createLine=function(t,e,n){var i=t.hostModel,r=function(t){var e=new sA({name:"line",subPixelOptimize:!0});return cA(e.shape,t),e}(t.getItemLayout(e));r.shape.percent=0,rh(r,{shape:{percent:1}},i,e),this.add(r),E(lA,(function(n){var i=hA(n,t,e);this.add(i),this[uA(n)]=t.getItemVisual(e,n)}),this),this._updateCommonStl(t,e,n)},e.prototype.updateData=function(t,e,n){var i=t.hostModel,r=this.childOfName("line"),o=t.getItemLayout(e),a={shape:{}};cA(a.shape,o),ih(r,a,i,e),E(lA,(function(n){var i=t.getItemVisual(e,n),r=uA(n);if(this[r]!==i){this.remove(this.childOfName(n));var o=hA(n,t,e);this.add(o)}this[r]=i}),this),this._updateCommonStl(t,e,n)},e.prototype.getLinePath=function(){return this.childAt(0)},e.prototype._updateCommonStl=function(t,e,n){var i=t.hostModel,r=this.childOfName("line"),o=n&&n.emphasisLineStyle,a=n&&n.blurLineStyle,s=n&&n.selectLineStyle,l=n&&n.labelStatesModels,u=n&&n.emphasisDisabled,h=n&&n.focus,c=n&&n.blurScope;if(!n||t.hasItemOption){var p=t.getItemModel(e),d=p.getModel("emphasis");o=d.getModel("lineStyle").getLineStyle(),a=p.getModel(["blur","lineStyle"]).getLineStyle(),s=p.getModel(["select","lineStyle"]).getLineStyle(),u=d.get("disabled"),h=d.get("focus"),c=d.get("blurScope"),l=Hh(p)}var f=t.getItemVisual(e,"style"),g=f.stroke;r.useStyle(f),r.style.fill=null,r.style.strokeNoScale=!0,r.ensureState("emphasis").style=o,r.ensureState("blur").style=a,r.ensureState("select").style=s,E(lA,(function(t){var e=this.childOfName(t);if(e){e.setColor(g),e.style.opacity=f.opacity;for(var n=0;n<js.length;n++){var i=js[n],o=r.getState(i);if(o){var a=o.style||{},s=e.ensureState(i),l=s.style||(s.style={});null!=a.stroke&&(l[e.__isEmptyBrush?"stroke":"fill"]=a.stroke),null!=a.opacity&&(l.opacity=a.opacity)}}e.markRedraw()}}),this);var y=i.getRawValue(e);Wh(this,l,{labelDataIndex:e,labelFetcher:{getFormattedLabel:function(e,n){return i.getFormattedLabel(e,n,t.dataType)}},inheritColor:g||"#000",defaultOpacity:f.opacity,defaultText:(null==y?t.getName(e):isFinite(y)?zr(y):y)+""});var v=this.getTextContent();if(v){var m=l.normal;v.__align=v.style.align,v.__verticalAlign=v.style.verticalAlign,v.__position=m.get("position")||"middle";var x=m.get("distance");Y(x)||(x=[x,x]),v.__labelDistance=x}this.setTextConfig({position:null,local:!0,inside:!1}),Ol(this,h,c,u)},e.prototype.highlight=function(){xl(this)},e.prototype.downplay=function(){_l(this)},e.prototype.updateLayout=function(t,e){this.setLinePoints(t.getItemLayout(e))},e.prototype.setLinePoints=function(t){var e=this.childOfName("line");cA(e.shape,t),e.dirty()},e.prototype.beforeUpdate=function(){var t=this,e=t.childOfName("fromSymbol"),n=t.childOfName("toSymbol"),i=t.getTextContent();if(e||n||i&&!i.ignore){for(var r=1,o=this.parent;o;)o.scaleX&&(r/=o.scaleX),o=o.parent;var a=t.childOfName("line");if(this.__dirty||a.__dirty){var s=a.shape.percent,l=a.pointAt(0),u=a.pointAt(s),h=Dt([],u,l);if(Rt(h,h),e&&(e.setPosition(l),S(e,0),e.scaleX=e.scaleY=r*s,e.markRedraw()),n&&(n.setPosition(u),S(n,1),n.scaleX=n.scaleY=r*s,n.markRedraw()),i&&!i.ignore){i.x=i.y=0,i.originX=i.originY=0;var c=void 0,p=void 0,d=i.__labelDistance,f=d[0]*r,g=d[1]*r,y=s/2,v=a.tangentAt(y),m=[v[1],-v[0]],x=a.pointAt(y);m[1]>0&&(m[0]=-m[0],m[1]=-m[1]);var _=v[0]<0?-1:1;if("start"!==i.__position&&"end"!==i.__position){var b=-Math.atan2(v[1],v[0]);u[0]<l[0]&&(b=Math.PI+b),i.rotation=b}var w=void 0;switch(i.__position){case"insideStartTop":case"insideMiddleTop":case"insideEndTop":case"middle":w=-g,p="bottom";break;case"insideStartBottom":case"insideMiddleBottom":case"insideEndBottom":w=g,p="top";break;default:w=0,p="middle"}switch(i.__position){case"end":i.x=h[0]*f+u[0],i.y=h[1]*g+u[1],c=h[0]>.8?"left":h[0]<-.8?"right":"center",p=h[1]>.8?"top":h[1]<-.8?"bottom":"middle";break;case"start":i.x=-h[0]*f+l[0],i.y=-h[1]*g+l[1],c=h[0]>.8?"right":h[0]<-.8?"left":"center",p=h[1]>.8?"bottom":h[1]<-.8?"top":"middle";break;case"insideStartTop":case"insideStart":case"insideStartBottom":i.x=f*_+l[0],i.y=l[1]+w,c=v[0]<0?"right":"left",i.originX=-f*_,i.originY=-w;break;case"insideMiddleTop":case"insideMiddle":case"insideMiddleBottom":case"middle":i.x=x[0],i.y=x[1]+w,c="center",i.originY=-w;break;case"insideEndTop":case"insideEnd":case"insideEndBottom":i.x=-f*_+u[0],i.y=u[1]+w,c=v[0]>=0?"right":"left",i.originX=f*_,i.originY=-w}i.scaleX=i.scaleY=r,i.setStyle({verticalAlign:i.__verticalAlign||p,align:i.__align||c})}}}function S(t,e){var n=t.__specifiedRotation;if(null==n){var i=a.tangentAt(e);t.attr("rotation",(1===e?-1:1)*Math.PI/2-Math.atan2(i[1],i[0]))}else t.attr("rotation",n)}},e}(Cr),dA=function(){function t(t){this.group=new Cr,this._LineCtor=t||pA}return t.prototype.updateData=function(t){var e=this;this._progressiveEls=null;var n=this,i=n.group,r=n._lineData;n._lineData=t,r||i.removeAll();var o=fA(t);t.diff(r).add((function(n){e._doAdd(t,n,o)})).update((function(n,i){e._doUpdate(r,t,i,n,o)})).remove((function(t){i.remove(r.getItemGraphicEl(t))})).execute()},t.prototype.updateLayout=function(){var t=this._lineData;t&&t.eachItemGraphicEl((function(e,n){e.updateLayout(t,n)}),this)},t.prototype.incrementalPrepareUpdate=function(t){this._seriesScope=fA(t),this._lineData=null,this.group.removeAll()},t.prototype.incrementalUpdate=function(t,e){function n(t){t.isGroup||function(t){return t.animators&&t.animators.length>0}(t)||(t.incremental=!0,t.ensureState("emphasis").hoverLayer=!0)}this._progressiveEls=[];for(var i=t.start;i<t.end;i++){if(yA(e.getItemLayout(i))){var r=new this._LineCtor(e,i,this._seriesScope);r.traverse(n),this.group.add(r),e.setItemGraphicEl(i,r),this._progressiveEls.push(r)}}},t.prototype.remove=function(){this.group.removeAll()},t.prototype.eachRendered=function(t){zh(this._progressiveEls||this.group,t)},t.prototype._doAdd=function(t,e,n){if(yA(t.getItemLayout(e))){var i=new this._LineCtor(t,e,n);t.setItemGraphicEl(e,i),this.group.add(i)}},t.prototype._doUpdate=function(t,e,n,i,r){var o=t.getItemGraphicEl(n);yA(e.getItemLayout(i))?(o?o.updateData(e,i,r):o=new this._LineCtor(e,i,r),e.setItemGraphicEl(i,o),this.group.add(o)):this.group.remove(o)},t}();function fA(t){var e=t.hostModel,n=e.getModel("emphasis");return{lineStyle:e.getModel("lineStyle").getLineStyle(),emphasisLineStyle:n.getModel(["lineStyle"]).getLineStyle(),blurLineStyle:e.getModel(["blur","lineStyle"]).getLineStyle(),selectLineStyle:e.getModel(["select","lineStyle"]).getLineStyle(),emphasisDisabled:n.get("disabled"),blurScope:n.get("blurScope"),focus:n.get("focus"),labelStatesModels:Hh(e)}}function gA(t){return isNaN(t[0])||isNaN(t[1])}function yA(t){return t&&!gA(t[0])&&!gA(t[1])}var vA=[],mA=[],xA=[],_A=Ke,bA=Vt,wA=Math.abs;function SA(t,e,n){for(var i,r=t[0],o=t[1],a=t[2],s=1/0,l=n*n,u=.1,h=.1;h<=.9;h+=.1){vA[0]=_A(r[0],o[0],a[0],h),vA[1]=_A(r[1],o[1],a[1],h),(d=wA(bA(vA,e)-l))<s&&(s=d,i=h)}for(var c=0;c<32;c++){var p=i+u;mA[0]=_A(r[0],o[0],a[0],i),mA[1]=_A(r[1],o[1],a[1],i),xA[0]=_A(r[0],o[0],a[0],p),xA[1]=_A(r[1],o[1],a[1],p);var d=bA(mA,e)-l;if(wA(d)<.01)break;var f=bA(xA,e)-l;u/=2,d<0?f>=0?i+=u:i-=u:f>=0?i-=u:i+=u}return i}function MA(t,e){var n=[],i=Qe,r=[[],[],[]],o=[[],[]],a=[];e/=2,t.eachEdge((function(t,s){var l=t.getLayout(),u=t.getVisual("fromSymbol"),h=t.getVisual("toSymbol");l.__original||(l.__original=[Mt(l[0]),Mt(l[1])],l[2]&&l.__original.push(Mt(l[2])));var c=l.__original;if(null!=l[2]){if(St(r[0],c[0]),St(r[1],c[2]),St(r[2],c[1]),u&&"none"!==u){var p=jD(t.node1),d=SA(r,c[0],p*e);i(r[0][0],r[1][0],r[2][0],d,n),r[0][0]=n[3],r[1][0]=n[4],i(r[0][1],r[1][1],r[2][1],d,n),r[0][1]=n[3],r[1][1]=n[4]}if(h&&"none"!==h){p=jD(t.node2),d=SA(r,c[1],p*e);i(r[0][0],r[1][0],r[2][0],d,n),r[1][0]=n[1],r[2][0]=n[2],i(r[0][1],r[1][1],r[2][1],d,n),r[1][1]=n[1],r[2][1]=n[2]}St(l[0],r[0]),St(l[1],r[2]),St(l[2],r[1])}else{if(St(o[0],c[0]),St(o[1],c[1]),Dt(a,o[1],o[0]),Rt(a,a),u&&"none"!==u){p=jD(t.node1);Ct(o[0],o[0],a,p*e)}if(h&&"none"!==h){p=jD(t.node2);Ct(o[1],o[1],a,-p*e)}St(l[0],o[0]),St(l[1],o[1])}}))}function IA(t){return"view"===t.type}var TA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(t,e){var n=new Zw,i=new dA,r=this.group;this._controller=new DI(e.getZr()),this._controllerHost={target:r},r.add(n.group),r.add(i.group),this._symbolDraw=n,this._lineDraw=i,this._firstRender=!0},e.prototype.render=function(t,e,n){var i=this,r=t.coordinateSystem;this._model=t;var o=this._symbolDraw,a=this._lineDraw,s=this.group;if(IA(r)){var l={x:r.x,y:r.y,scaleX:r.scaleX,scaleY:r.scaleY};this._firstRender?s.attr(l):ih(s,l,t)}MA(t.getGraph(),ZD(t));var u=t.getData();o.updateData(u);var h=t.getEdgeData();a.updateData(h),this._updateNodeAndLinkScale(),this._updateController(t,e,n),clearTimeout(this._layoutTimeout);var c=t.forceLayout,p=t.get(["force","layoutAnimation"]);c&&this._startForceLayoutIteration(c,p),u.graph.eachNode((function(t){var e=t.dataIndex,n=t.getGraphicEl(),r=t.getModel();if(n){n.off("drag").off("dragend");var o=r.get("draggable");o&&n.on("drag",(function(){c&&(c.warmUp(),!i._layouting&&i._startForceLayoutIteration(c,p),c.setFixed(e),u.setItemLayout(e,[n.x,n.y]))})).on("dragend",(function(){c&&c.setUnfixed(e)})),n.setDraggable(o&&!!c),"adjacency"===r.get(["emphasis","focus"])&&(Ws(n).focus=t.getAdjacentDataIndices())}})),u.graph.eachEdge((function(t){var e=t.getGraphicEl(),n=t.getModel().get(["emphasis","focus"]);e&&"adjacency"===n&&(Ws(e).focus={edge:[t.dataIndex],node:[t.node1.dataIndex,t.node2.dataIndex]})}));var d="circular"===t.get("layout")&&t.get(["circular","rotateLabel"]),f=u.getLayout("cx"),g=u.getLayout("cy");u.eachItemGraphicEl((function(t,e){var n=u.getItemModel(e).get(["label","rotate"])||0,i=t.getSymbolPath();if(d){var r=u.getItemLayout(e),o=Math.atan2(r[1]-g,r[0]-f);o<0&&(o=2*Math.PI+o);var a=r[0]<f;a&&(o-=Math.PI);var s=a?"left":"right";i.setTextConfig({rotation:-o,position:s,origin:"center"});var l=i.ensureState("emphasis");A(l.textConfig||(l.textConfig={}),{position:s})}else i.setTextConfig({rotation:n*=Math.PI/180})})),this._firstRender=!1},e.prototype.dispose=function(){this._controller&&this._controller.dispose(),this._controllerHost=null},e.prototype._startForceLayoutIteration=function(t,e){var n=this;!function i(){t.step((function(t){n.updateLayout(n._model),(n._layouting=!t)&&(e?n._layoutTimeout=setTimeout(i,16):i())}))}()},e.prototype._updateController=function(t,e,n){var i=this,r=this._controller,o=this._controllerHost,a=this.group;r.setPointerChecker((function(e,i,r){var o=a.getBoundingRect();return o.applyTransform(a.transform),o.contain(i,r)&&!EI(e,n,t)})),IA(t.coordinateSystem)?(r.enable(t.get("roam")),o.zoomLimit=t.get("scaleLimit"),o.zoom=t.coordinateSystem.getZoom(),r.off("pan").off("zoom").on("pan",(function(e){PI(o,e.dx,e.dy),n.dispatchAction({seriesId:t.id,type:"graphRoam",dx:e.dx,dy:e.dy})})).on("zoom",(function(e){OI(o,e.scale,e.originX,e.originY),n.dispatchAction({seriesId:t.id,type:"graphRoam",zoom:e.scale,originX:e.originX,originY:e.originY}),i._updateNodeAndLinkScale(),MA(t.getGraph(),ZD(t)),i._lineDraw.updateLayout(),n.updateLabelLayout()}))):r.disable()},e.prototype._updateNodeAndLinkScale=function(){var t=this._model,e=t.getData(),n=ZD(t);e.eachItemGraphicEl((function(t,e){t&&t.setSymbolScale(n)}))},e.prototype.updateLayout=function(t){MA(t.getGraph(),ZD(t)),this._symbolDraw.updateLayout(),this._lineDraw.updateLayout()},e.prototype.remove=function(t,e){this._symbolDraw&&this._symbolDraw.remove(),this._lineDraw&&this._lineDraw.remove()},e.type="graph",e}(mg);function CA(t){return"_EC_"+t}var DA=function(){function t(t){this.type="graph",this.nodes=[],this.edges=[],this._nodesMap={},this._edgesMap={},this._directed=t||!1}return t.prototype.isDirected=function(){return this._directed},t.prototype.addNode=function(t,e){t=null==t?""+e:""+t;var n=this._nodesMap;if(!n[CA(t)]){var i=new AA(t,e);return i.hostGraph=this,this.nodes.push(i),n[CA(t)]=i,i}},t.prototype.getNodeByIndex=function(t){var e=this.data.getRawIndex(t);return this.nodes[e]},t.prototype.getNodeById=function(t){return this._nodesMap[CA(t)]},t.prototype.addEdge=function(t,e,n){var i=this._nodesMap,r=this._edgesMap;if(j(t)&&(t=this.nodes[t]),j(e)&&(e=this.nodes[e]),t instanceof AA||(t=i[CA(t)]),e instanceof AA||(e=i[CA(e)]),t&&e){var o=t.id+"-"+e.id,a=new kA(t,e,n);return a.hostGraph=this,this._directed&&(t.outEdges.push(a),e.inEdges.push(a)),t.edges.push(a),t!==e&&e.edges.push(a),this.edges.push(a),r[o]=a,a}},t.prototype.getEdgeByIndex=function(t){var e=this.edgeData.getRawIndex(t);return this.edges[e]},t.prototype.getEdge=function(t,e){t instanceof AA&&(t=t.id),e instanceof AA&&(e=e.id);var n=this._edgesMap;return this._directed?n[t+"-"+e]:n[t+"-"+e]||n[e+"-"+t]},t.prototype.eachNode=function(t,e){for(var n=this.nodes,i=n.length,r=0;r<i;r++)n[r].dataIndex>=0&&t.call(e,n[r],r)},t.prototype.eachEdge=function(t,e){for(var n=this.edges,i=n.length,r=0;r<i;r++)n[r].dataIndex>=0&&n[r].node1.dataIndex>=0&&n[r].node2.dataIndex>=0&&t.call(e,n[r],r)},t.prototype.breadthFirstTraverse=function(t,e,n,i){if(e instanceof AA||(e=this._nodesMap[CA(e)]),e){for(var r="out"===n?"outEdges":"in"===n?"inEdges":"edges",o=0;o<this.nodes.length;o++)this.nodes[o].__visited=!1;if(!t.call(i,e,null))for(var a=[e];a.length;){var s=a.shift(),l=s[r];for(o=0;o<l.length;o++){var u=l[o],h=u.node1===s?u.node2:u.node1;if(!h.__visited){if(t.call(i,h,s))return;a.push(h),h.__visited=!0}}}}},t.prototype.update=function(){for(var t=this.data,e=this.edgeData,n=this.nodes,i=this.edges,r=0,o=n.length;r<o;r++)n[r].dataIndex=-1;for(r=0,o=t.count();r<o;r++)n[t.getRawIndex(r)].dataIndex=r;e.filterSelf((function(t){var n=i[e.getRawIndex(t)];return n.node1.dataIndex>=0&&n.node2.dataIndex>=0}));for(r=0,o=i.length;r<o;r++)i[r].dataIndex=-1;for(r=0,o=e.count();r<o;r++)i[e.getRawIndex(r)].dataIndex=r},t.prototype.clone=function(){for(var e=new t(this._directed),n=this.nodes,i=this.edges,r=0;r<n.length;r++)e.addNode(n[r].id,n[r].dataIndex);for(r=0;r<i.length;r++){var o=i[r];e.addEdge(o.node1.id,o.node2.id,o.dataIndex)}return e},t}(),AA=function(){function t(t,e){this.inEdges=[],this.outEdges=[],this.edges=[],this.dataIndex=-1,this.id=null==t?"":t,this.dataIndex=null==e?-1:e}return t.prototype.degree=function(){return this.edges.length},t.prototype.inDegree=function(){return this.inEdges.length},t.prototype.outDegree=function(){return this.outEdges.length},t.prototype.getModel=function(t){if(!(this.dataIndex<0))return this.hostGraph.data.getItemModel(this.dataIndex).getModel(t)},t.prototype.getAdjacentDataIndices=function(){for(var t={edge:[],node:[]},e=0;e<this.edges.length;e++){var n=this.edges[e];n.dataIndex<0||(t.edge.push(n.dataIndex),t.node.push(n.node1.dataIndex,n.node2.dataIndex))}return t},t}(),kA=function(){function t(t,e,n){this.dataIndex=-1,this.node1=t,this.node2=e,this.dataIndex=null==n?-1:n}return t.prototype.getModel=function(t){if(!(this.dataIndex<0))return this.hostGraph.edgeData.getItemModel(this.dataIndex).getModel(t)},t.prototype.getAdjacentDataIndices=function(){return{edge:[this.dataIndex],node:[this.node1.dataIndex,this.node2.dataIndex]}},t}();function LA(t,e){return{getValue:function(n){var i=this[t][e];return i.getStore().get(i.getDimensionIndex(n||"value"),this.dataIndex)},setVisual:function(n,i){this.dataIndex>=0&&this[t][e].setItemVisual(this.dataIndex,n,i)},getVisual:function(n){return this[t][e].getItemVisual(this.dataIndex,n)},setLayout:function(n,i){this.dataIndex>=0&&this[t][e].setItemLayout(this.dataIndex,n,i)},getLayout:function(){return this[t][e].getItemLayout(this.dataIndex)},getGraphicEl:function(){return this[t][e].getItemGraphicEl(this.dataIndex)},getRawIndex:function(){return this[t][e].getRawIndex(this.dataIndex)}}}function PA(t,e,n,i,r){for(var o=new DA(i),a=0;a<t.length;a++)o.addNode(it(t[a].id,t[a].name,a),a);var s=[],l=[],u=0;for(a=0;a<e.length;a++){var h=e[a],c=h.source,p=h.target;o.addEdge(c,p,u)&&(l.push(h),s.push(it(xo(h.id,null),c+" > "+p)),u++)}var d,f=n.get("coordinateSystem");if("cartesian2d"===f||"polar"===f)d=nx(t,n);else{var g=ud.get(f),y=g&&g.dimensions||[];P(y,"value")<0&&y.concat(["value"]);var v=jm(t,{coordDimensions:y,encodeDefine:n.getEncode()}).dimensions;(d=new Zm(v,n)).initData(t)}var m=new Zm(["value"],n);return m.initData(l,s),r&&r(d,m),mC({mainData:d,struct:o,structAttr:"graph",datas:{node:d,edge:m},datasAttr:{node:"data",edge:"edgeData"}}),o.update(),o}R(AA,LA("hostGraph","data")),R(kA,LA("hostGraph","edgeData"));var OA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.hasSymbolVisual=!0,n}return n(e,t),e.prototype.init=function(e){t.prototype.init.apply(this,arguments);var n=this;function i(){return n._categoriesData}this.legendVisualProvider=new lM(i,i),this.fillDataTextStyle(e.edges||e.links),this._updateCategoriesData()},e.prototype.mergeOption=function(e){t.prototype.mergeOption.apply(this,arguments),this.fillDataTextStyle(e.edges||e.links),this._updateCategoriesData()},e.prototype.mergeDefaultAndTheme=function(e){t.prototype.mergeDefaultAndTheme.apply(this,arguments),co(e,"edgeLabel",["show"])},e.prototype.getInitialData=function(t,e){var n,i=t.edges||t.links||[],r=t.data||t.nodes||[],o=this;if(r&&i){VD(n=this)&&(n.__curvenessList=[],n.__edgeMap={},BD(n));var a=PA(r,i,this,!0,(function(t,e){t.wrapMethod("getItemModel",(function(t){var e=o._categoriesModels[t.getShallow("category")];return e&&(e.parentModel=t.parentModel,t.parentModel=e),t}));var n=pc.prototype.getModel;function i(t,e){var i=n.call(this,t,e);return i.resolveParentPath=r,i}function r(t){if(t&&("label"===t[0]||"label"===t[1])){var e=t.slice();return"label"===t[0]?e[0]="edgeLabel":"label"===t[1]&&(e[1]="edgeLabel"),e}return t}e.wrapMethod("getItemModel",(function(t){return t.resolveParentPath=r,t.getModel=i,t}))}));return E(a.edges,(function(t){!function(t,e,n,i){if(VD(n)){var r=FD(t,e,n),o=n.__edgeMap,a=o[GD(r)];o[r]&&!a?o[r].isForward=!0:a&&o[r]&&(a.isForward=!0,o[r].isForward=!1),o[r]=o[r]||[],o[r].push(i)}}(t.node1,t.node2,this,t.dataIndex)}),this),a.data}},e.prototype.getGraph=function(){return this.getData().graph},e.prototype.getEdgeData=function(){return this.getGraph().edgeData},e.prototype.getCategoriesData=function(){return this._categoriesData},e.prototype.formatTooltip=function(t,e,n){if("edge"===n){var i=this.getData(),r=this.getDataParams(t,n),o=i.graph.getEdgeByIndex(t),a=i.getName(o.node1.dataIndex),s=i.getName(o.node2.dataIndex),l=[];return null!=a&&l.push(a),null!=s&&l.push(s),Uf("nameValue",{name:l.join(" > "),value:r.value,noValue:null==r.value})}return ig({series:this,dataIndex:t,multipleSeries:e})},e.prototype._updateCategoriesData=function(){var t=z(this.option.categories||[],(function(t){return null!=t.value?t:A({value:0},t)})),e=new Zm(["value"],this);e.initData(t),this._categoriesData=e,this._categoriesModels=e.mapArray((function(t){return e.getItemModel(t)}))},e.prototype.setZoom=function(t){this.option.zoom=t},e.prototype.setCenter=function(t){this.option.center=t},e.prototype.isAnimationEnabled=function(){return t.prototype.isAnimationEnabled.call(this)&&!("force"===this.get("layout")&&this.get(["force","layoutAnimation"]))},e.type="series.graph",e.dependencies=["grid","polar","geo","singleAxis","calendar"],e.defaultOption={z:2,coordinateSystem:"view",legendHoverLink:!0,layout:null,circular:{rotateLabel:!1},force:{initLayout:null,repulsion:[0,50],gravity:.1,friction:.6,edgeLength:30,layoutAnimation:!0},left:"center",top:"center",symbol:"circle",symbolSize:10,edgeSymbol:["none","none"],edgeSymbolSize:10,edgeLabel:{position:"middle",distance:5},draggable:!1,roam:!1,center:null,zoom:1,nodeScaleRatio:.6,label:{show:!1,formatter:"{b}"},itemStyle:{},lineStyle:{color:"#aaa",width:1,opacity:.5},emphasis:{scale:!0,label:{show:!0}},select:{itemStyle:{borderColor:"#212121"}}},e}(ag),RA={type:"graphRoam",event:"graphRoam",update:"none"};var NA=function(){this.angle=0,this.width=10,this.r=10,this.x=0,this.y=0},EA=function(t){function e(e){var n=t.call(this,e)||this;return n.type="pointer",n}return n(e,t),e.prototype.getDefaultShape=function(){return new NA},e.prototype.buildPath=function(t,e){var n=Math.cos,i=Math.sin,r=e.r,o=e.width,a=e.angle,s=e.x-n(a)*o*(o>=r/3?1:2),l=e.y-i(a)*o*(o>=r/3?1:2);a=e.angle-Math.PI/2,t.moveTo(s,l),t.lineTo(e.x+n(a)*o,e.y+i(a)*o),t.lineTo(e.x+n(e.angle)*r,e.y+i(e.angle)*r),t.lineTo(e.x-n(a)*o,e.y-i(a)*o),t.lineTo(s,l)},e}(fs);function zA(t,e){var n=null==t?"":t+"";return e&&(X(e)?n=e.replace("{value}",n):U(e)&&(n=e(t))),n}var VA=2*Math.PI,BA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){this.group.removeAll();var i=t.get(["axisLine","lineStyle","color"]),r=function(t,e){var n=t.get("center"),i=e.getWidth(),r=e.getHeight(),o=Math.min(i,r);return{cx:Er(n[0],e.getWidth()),cy:Er(n[1],e.getHeight()),r:Er(t.get("radius"),o/2)}}(t,n);this._renderMain(t,e,n,i,r),this._data=t.getData()},e.prototype.dispose=function(){},e.prototype._renderMain=function(t,e,n,i,r){for(var o=this.group,a=t.get("clockwise"),s=-t.get("startAngle")/180*Math.PI,l=-t.get("endAngle")/180*Math.PI,u=t.getModel("axisLine"),h=u.get("roundCap")?TS:Tu,c=u.get("show"),p=u.getModel("lineStyle"),d=p.get("width"),f=(l-s)%VA||l===s?(l-s)%VA:VA,g=s,y=0;c&&y<i.length;y++){var v=new h({shape:{startAngle:g,endAngle:l=s+f*Math.min(Math.max(i[y][0],0),1),cx:r.cx,cy:r.cy,clockwise:a,r0:r.r-d,r:r.r},silent:!0});v.setStyle({fill:i[y][1]}),v.setStyle(p.getLineStyle(["color","width"])),o.add(v),g=l}var m=function(t){if(t<=0)return i[0][1];var e;for(e=0;e<i.length;e++)if(i[e][0]>=t&&(0===e?0:i[e-1][0])<t)return i[e][1];return i[e-1][1]};if(!a){var x=s;s=l,l=x}this._renderTicks(t,e,n,m,r,s,l,a,d),this._renderTitleAndDetail(t,e,n,m,r),this._renderAnchor(t,r),this._renderPointer(t,e,n,m,r,s,l,a,d)},e.prototype._renderTicks=function(t,e,n,i,r,o,a,s,l){for(var u,h,c=this.group,p=r.cx,d=r.cy,f=r.r,g=+t.get("min"),y=+t.get("max"),v=t.getModel("splitLine"),m=t.getModel("axisTick"),x=t.getModel("axisLabel"),_=t.get("splitNumber"),b=m.get("splitNumber"),w=Er(v.get("length"),f),S=Er(m.get("length"),f),M=o,I=(a-o)/_,T=I/b,C=v.getModel("lineStyle").getLineStyle(),D=m.getModel("lineStyle").getLineStyle(),A=v.get("distance"),k=0;k<=_;k++){if(u=Math.cos(M),h=Math.sin(M),v.get("show")){var L=new Eu({shape:{x1:u*(f-(P=A?A+l:l))+p,y1:h*(f-P)+d,x2:u*(f-w-P)+p,y2:h*(f-w-P)+d},style:C,silent:!0});"auto"===C.stroke&&L.setStyle({stroke:i(k/_)}),c.add(L)}if(x.get("show")){var P=x.get("distance")+A,O=zA(zr(k/_*(y-g)+g),x.get("formatter")),R=i(k/_);c.add(new As({style:Yh(x,{text:O,x:u*(f-w-P)+p,y:h*(f-w-P)+d,verticalAlign:h<-.8?"top":h>.8?"bottom":"middle",align:u<-.4?"left":u>.4?"right":"center"},{inheritColor:R}),silent:!0}))}if(m.get("show")&&k!==_){P=(P=m.get("distance"))?P+l:l;for(var N=0;N<=b;N++){u=Math.cos(M),h=Math.sin(M);var E=new Eu({shape:{x1:u*(f-P)+p,y1:h*(f-P)+d,x2:u*(f-S-P)+p,y2:h*(f-S-P)+d},silent:!0,style:D});"auto"===D.stroke&&E.setStyle({stroke:i((k+N/b)/_)}),c.add(E),M+=T}M-=T}else M+=I}},e.prototype._renderPointer=function(t,e,n,i,r,o,a,s,l){var u=this.group,h=this._data,c=this._progressEls,p=[],d=t.get(["pointer","show"]),f=t.getModel("progress"),g=f.get("show"),y=t.getData(),v=y.mapDimension("value"),m=+t.get("min"),x=+t.get("max"),_=[m,x],b=[o,a];function w(e,n){var i,o=y.getItemModel(e).getModel("pointer"),a=Er(o.get("width"),r.r),s=Er(o.get("length"),r.r),l=t.get(["pointer","icon"]),u=o.get("offsetCenter"),h=Er(u[0],r.r),c=Er(u[1],r.r),p=o.get("keepAspect");return(i=l?ky(l,h-a/2,c-s,a,s,null,p):new EA({shape:{angle:-Math.PI/2,width:a,r:s,x:h,y:c}})).rotation=-(n+Math.PI/2),i.x=r.cx,i.y=r.cy,i}function S(t,e){var n=f.get("roundCap")?TS:Tu,i=f.get("overlap"),a=i?f.get("width"):l/y.count(),u=i?r.r-a:r.r-(t+1)*a,h=i?r.r:r.r-t*a,c=new n({shape:{startAngle:o,endAngle:e,cx:r.cx,cy:r.cy,clockwise:s,r0:u,r:h}});return i&&(c.z2=x-y.get(v,t)%x),c}(g||d)&&(y.diff(h).add((function(e){var n=y.get(v,e);if(d){var i=w(e,o);rh(i,{rotation:-((isNaN(+n)?b[0]:Nr(n,_,b,!0))+Math.PI/2)},t),u.add(i),y.setItemGraphicEl(e,i)}if(g){var r=S(e,o),a=f.get("clip");rh(r,{shape:{endAngle:Nr(n,_,b,a)}},t),u.add(r),Hs(t.seriesIndex,y.dataType,e,r),p[e]=r}})).update((function(e,n){var i=y.get(v,e);if(d){var r=h.getItemGraphicEl(n),a=r?r.rotation:o,s=w(e,a);s.rotation=a,ih(s,{rotation:-((isNaN(+i)?b[0]:Nr(i,_,b,!0))+Math.PI/2)},t),u.add(s),y.setItemGraphicEl(e,s)}if(g){var l=c[n],m=S(e,l?l.shape.endAngle:o),x=f.get("clip");ih(m,{shape:{endAngle:Nr(i,_,b,x)}},t),u.add(m),Hs(t.seriesIndex,y.dataType,e,m),p[e]=m}})).execute(),y.each((function(t){var e=y.getItemModel(t),n=e.getModel("emphasis"),r=n.get("focus"),o=n.get("blurScope"),a=n.get("disabled");if(d){var s=y.getItemGraphicEl(t),l=y.getItemVisual(t,"style"),u=l.fill;if(s instanceof xs){var h=s.style;s.useStyle(A({image:h.image,x:h.x,y:h.y,width:h.width,height:h.height},l))}else s.useStyle(l),"pointer"!==s.type&&s.setColor(u);s.setStyle(e.getModel(["pointer","itemStyle"]).getItemStyle()),"auto"===s.style.fill&&s.setStyle("fill",i(Nr(y.get(v,t),_,[0,1],!0))),s.z2EmphasisLift=0,zl(s,e),Ol(s,r,o,a)}if(g){var c=p[t];c.useStyle(y.getItemVisual(t,"style")),c.setStyle(e.getModel(["progress","itemStyle"]).getItemStyle()),c.z2EmphasisLift=0,zl(c,e),Ol(c,r,o,a)}})),this._progressEls=p)},e.prototype._renderAnchor=function(t,e){var n=t.getModel("anchor");if(n.get("show")){var i=n.get("size"),r=n.get("icon"),o=n.get("offsetCenter"),a=n.get("keepAspect"),s=ky(r,e.cx-i/2+Er(o[0],e.r),e.cy-i/2+Er(o[1],e.r),i,i,null,a);s.z2=n.get("showAbove")?1:0,s.setStyle(n.getModel("itemStyle").getItemStyle()),this.group.add(s)}},e.prototype._renderTitleAndDetail=function(t,e,n,i,r){var o=this,a=t.getData(),s=a.mapDimension("value"),l=+t.get("min"),u=+t.get("max"),h=new Cr,c=[],p=[],d=t.isAnimationEnabled(),f=t.get(["pointer","showAbove"]);a.diff(this._data).add((function(t){c[t]=new As({silent:!0}),p[t]=new As({silent:!0})})).update((function(t,e){c[t]=o._titleEls[e],p[t]=o._detailEls[e]})).execute(),a.each((function(e){var n=a.getItemModel(e),o=a.get(s,e),g=new Cr,y=i(Nr(o,[l,u],[0,1],!0)),v=n.getModel("title");if(v.get("show")){var m=v.get("offsetCenter"),x=r.cx+Er(m[0],r.r),_=r.cy+Er(m[1],r.r);(D=c[e]).attr({z2:f?0:2,style:Yh(v,{x:x,y:_,text:a.getName(e),align:"center",verticalAlign:"middle"},{inheritColor:y})}),g.add(D)}var b=n.getModel("detail");if(b.get("show")){var w=b.get("offsetCenter"),S=r.cx+Er(w[0],r.r),M=r.cy+Er(w[1],r.r),I=Er(b.get("width"),r.r),T=Er(b.get("height"),r.r),C=t.get(["progress","show"])?a.getItemVisual(e,"style").fill:y,D=p[e],A=b.get("formatter");D.attr({z2:f?0:2,style:Yh(b,{x:S,y:M,text:zA(o,A),width:isNaN(I)?null:I,height:isNaN(T)?null:T,align:"center",verticalAlign:"middle"},{inheritColor:C})}),Jh(D,{normal:b},o,(function(t){return zA(t,A)})),d&&Qh(D,e,a,t,{getFormattedLabel:function(t,e,n,i,r,a){return zA(a?a.interpolatedValue:o,A)}}),g.add(D)}h.add(g)})),this.group.add(h),this._titleEls=c,this._detailEls=p},e.type="gauge",e}(mg),FA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.visualStyleAccessPath="itemStyle",n}return n(e,t),e.prototype.getInitialData=function(t,e){return sM(this,["value"])},e.type="series.gauge",e.defaultOption={z:2,colorBy:"data",center:["50%","50%"],legendHoverLink:!0,radius:"75%",startAngle:225,endAngle:-45,clockwise:!0,min:0,max:100,splitNumber:10,axisLine:{show:!0,roundCap:!1,lineStyle:{color:[[1,"#E6EBF8"]],width:10}},progress:{show:!1,overlap:!0,width:10,roundCap:!1,clip:!0},splitLine:{show:!0,length:10,distance:10,lineStyle:{color:"#63677A",width:3,type:"solid"}},axisTick:{show:!0,splitNumber:5,length:6,distance:10,lineStyle:{color:"#63677A",width:1,type:"solid"}},axisLabel:{show:!0,distance:15,color:"#464646",fontSize:12},pointer:{icon:null,offsetCenter:[0,0],show:!0,showAbove:!0,length:"60%",width:6,keepAspect:!1},anchor:{show:!1,showAbove:!1,size:6,icon:"circle",offsetCenter:[0,0],keepAspect:!1,itemStyle:{color:"#fff",borderWidth:0,borderColor:"#5470c6"}},title:{show:!0,offsetCenter:[0,"20%"],color:"#464646",fontSize:16,valueAnimation:!1},detail:{show:!0,backgroundColor:"rgba(0,0,0,0)",borderWidth:0,borderColor:"#ccc",width:100,height:null,padding:[5,10],offsetCenter:[0,"40%"],color:"#464646",fontSize:30,fontWeight:"bold",lineHeight:30,valueAnimation:!1}},e}(ag);var GA=["itemStyle","opacity"],WA=function(t){function e(e,n){var i=t.call(this)||this,r=i,o=new Ou,a=new As;return r.setTextContent(a),i.setTextGuideLine(o),i.updateData(e,n,!0),i}return n(e,t),e.prototype.updateData=function(t,e,n){var i=this,r=t.hostModel,o=t.getItemModel(e),a=t.getItemLayout(e),s=o.getModel("emphasis"),l=o.get(GA);l=null==l?1:l,n||uh(i),i.useStyle(t.getItemVisual(e,"style")),i.style.lineJoin="round",n?(i.setShape({points:a.points}),i.style.opacity=0,rh(i,{style:{opacity:l}},r,e)):ih(i,{style:{opacity:l},shape:{points:a.points}},r,e),zl(i,o),this._updateLabel(t,e),Ol(this,s.get("focus"),s.get("blurScope"),s.get("disabled"))},e.prototype._updateLabel=function(t,e){var n=this,i=this.getTextGuideLine(),r=n.getTextContent(),o=t.hostModel,a=t.getItemModel(e),s=t.getItemLayout(e).label,l=t.getItemVisual(e,"style"),u=l.fill;Wh(r,Hh(a),{labelFetcher:t.hostModel,labelDataIndex:e,defaultOpacity:l.opacity,defaultText:t.getName(e)},{normal:{align:s.textAlign,verticalAlign:s.verticalAlign}}),n.setTextConfig({local:!0,inside:!!s.inside,insideStroke:u,outsideFill:u});var h=s.linePoints;i.setShape({points:h}),n.textGuideLineConfig={anchor:h?new Ji(h[0][0],h[0][1]):null},ih(r,{style:{x:s.x,y:s.y}},o,e),r.attr({rotation:s.rotation,originX:s.x,originY:s.y,z2:10}),cb(n,pb(a),{stroke:u})},e}(Lu),HA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.ignoreLabelLineUpdate=!0,n}return n(e,t),e.prototype.render=function(t,e,n){var i=t.getData(),r=this._data,o=this.group;i.diff(r).add((function(t){var e=new WA(i,t);i.setItemGraphicEl(t,e),o.add(e)})).update((function(t,e){var n=r.getItemGraphicEl(e);n.updateData(i,t),o.add(n),i.setItemGraphicEl(t,n)})).remove((function(e){lh(r.getItemGraphicEl(e),t,e)})).execute(),this._data=i},e.prototype.remove=function(){this.group.removeAll(),this._data=null},e.prototype.dispose=function(){},e.type="funnel",e}(mg),YA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(e){t.prototype.init.apply(this,arguments),this.legendVisualProvider=new lM(W(this.getData,this),W(this.getRawData,this)),this._defaultLabelLine(e)},e.prototype.getInitialData=function(t,e){return sM(this,{coordDimensions:["value"],encodeDefaulter:H(Hp,this)})},e.prototype._defaultLabelLine=function(t){co(t,"labelLine",["show"]);var e=t.labelLine,n=t.emphasis.labelLine;e.show=e.show&&t.label.show,n.show=n.show&&t.emphasis.label.show},e.prototype.getDataParams=function(e){var n=this.getData(),i=t.prototype.getDataParams.call(this,e),r=n.mapDimension("value"),o=n.getSum(r);return i.percent=o?+(n.get(r,e)/o*100).toFixed(2):0,i.$vars.push("percent"),i},e.type="series.funnel",e.defaultOption={z:2,legendHoverLink:!0,colorBy:"data",left:80,top:60,right:80,bottom:60,minSize:"0%",maxSize:"100%",sort:"descending",orient:"vertical",gap:0,funnelAlign:"center",label:{show:!0,position:"outer"},labelLine:{show:!0,length:20,lineStyle:{width:1}},itemStyle:{borderColor:"#fff",borderWidth:1},emphasis:{label:{show:!0}},select:{itemStyle:{borderColor:"#212121"}}},e}(ag);function UA(t,e){t.eachSeriesByType("funnel",(function(t){var n=t.getData(),i=n.mapDimension("value"),r=t.get("sort"),o=function(t,e){return mp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}(t,e),a=t.get("orient"),s=o.width,l=o.height,u=function(t,e){for(var n=t.mapDimension("value"),i=t.mapArray(n,(function(t){return t})),r=[],o="ascending"===e,a=0,s=t.count();a<s;a++)r[a]=a;return U(e)?r.sort(e):"none"!==e&&r.sort((function(t,e){return o?i[t]-i[e]:i[e]-i[t]})),r}(n,r),h=o.x,c=o.y,p="horizontal"===a?[Er(t.get("minSize"),l),Er(t.get("maxSize"),l)]:[Er(t.get("minSize"),s),Er(t.get("maxSize"),s)],d=n.getDataExtent(i),f=t.get("min"),g=t.get("max");null==f&&(f=Math.min(d[0],0)),null==g&&(g=d[1]);var y=t.get("funnelAlign"),v=t.get("gap"),m=(("horizontal"===a?s:l)-v*(n.count()-1))/n.count(),x=function(t,e){if("horizontal"===a){var r=Nr(n.get(i,t)||0,[f,g],p,!0),o=void 0;switch(y){case"top":o=c;break;case"center":o=c+(l-r)/2;break;case"bottom":o=c+(l-r)}return[[e,o],[e,o+r]]}var u,d=Nr(n.get(i,t)||0,[f,g],p,!0);switch(y){case"left":u=h;break;case"center":u=h+(s-d)/2;break;case"right":u=h+s-d}return[[u,e],[u+d,e]]};"ascending"===r&&(m=-m,v=-v,"horizontal"===a?h+=s:c+=l,u=u.reverse());for(var _=0;_<u.length;_++){var b=u[_],w=u[_+1],S=n.getItemModel(b);if("horizontal"===a){var M=S.get(["itemStyle","width"]);null==M?M=m:(M=Er(M,s),"ascending"===r&&(M=-M));var I=x(b,h),T=x(w,h+M);h+=M+v,n.setItemLayout(b,{points:I.concat(T.slice().reverse())})}else{var C=S.get(["itemStyle","height"]);null==C?C=m:(C=Er(C,l),"ascending"===r&&(C=-C));I=x(b,c),T=x(w,c+C);c+=C+v,n.setItemLayout(b,{points:I.concat(T.slice().reverse())})}}!function(t){var e=t.hostModel.get("orient");t.each((function(n){var i,r,o,a,s=t.getItemModel(n),l=s.getModel("label").get("position"),u=s.getModel("labelLine"),h=t.getItemLayout(n),c=h.points,p="inner"===l||"inside"===l||"center"===l||"insideLeft"===l||"insideRight"===l;if(p)"insideLeft"===l?(r=(c[0][0]+c[3][0])/2+5,o=(c[0][1]+c[3][1])/2,i="left"):"insideRight"===l?(r=(c[1][0]+c[2][0])/2-5,o=(c[1][1]+c[2][1])/2,i="right"):(r=(c[0][0]+c[1][0]+c[2][0]+c[3][0])/4,o=(c[0][1]+c[1][1]+c[2][1]+c[3][1])/4,i="center"),a=[[r,o],[r,o]];else{var d=void 0,f=void 0,g=void 0,y=void 0,v=u.get("length");"left"===l?(d=(c[3][0]+c[0][0])/2,f=(c[3][1]+c[0][1])/2,r=(g=d-v)-5,i="right"):"right"===l?(d=(c[1][0]+c[2][0])/2,f=(c[1][1]+c[2][1])/2,r=(g=d+v)+5,i="left"):"top"===l?(d=(c[3][0]+c[0][0])/2,o=(y=(f=(c[3][1]+c[0][1])/2)-v)-5,i="center"):"bottom"===l?(d=(c[1][0]+c[2][0])/2,o=(y=(f=(c[1][1]+c[2][1])/2)+v)+5,i="center"):"rightTop"===l?(d="horizontal"===e?c[3][0]:c[1][0],f="horizontal"===e?c[3][1]:c[1][1],"horizontal"===e?(o=(y=f-v)-5,i="center"):(r=(g=d+v)+5,i="top")):"rightBottom"===l?(d=c[2][0],f=c[2][1],"horizontal"===e?(o=(y=f+v)+5,i="center"):(r=(g=d+v)+5,i="bottom")):"leftTop"===l?(d=c[0][0],f="horizontal"===e?c[0][1]:c[1][1],"horizontal"===e?(o=(y=f-v)-5,i="center"):(r=(g=d-v)-5,i="right")):"leftBottom"===l?(d="horizontal"===e?c[1][0]:c[3][0],f="horizontal"===e?c[1][1]:c[2][1],"horizontal"===e?(o=(y=f+v)+5,i="center"):(r=(g=d-v)-5,i="right")):(d=(c[1][0]+c[2][0])/2,f=(c[1][1]+c[2][1])/2,"horizontal"===e?(o=(y=f+v)+5,i="center"):(r=(g=d+v)+5,i="left")),"horizontal"===e?r=g=d:o=y=f,a=[[d,f],[g,y]]}h.label={linePoints:a,x:r,y:o,verticalAlign:"middle",textAlign:i,inside:p}}))}(n)}))}var XA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._dataGroup=new Cr,n._initialized=!1,n}return n(e,t),e.prototype.init=function(){this.group.add(this._dataGroup)},e.prototype.render=function(t,e,n,i){this._progressiveEls=null;var r=this._dataGroup,o=t.getData(),a=this._data,s=t.coordinateSystem,l=s.dimensions,u=qA(t);if(o.diff(a).add((function(t){KA(jA(o,r,t,l,s),o,t,u)})).update((function(e,n){var i=a.getItemGraphicEl(n),r=ZA(o,e,l,s);o.setItemGraphicEl(e,i),ih(i,{shape:{points:r}},t,e),uh(i),KA(i,o,e,u)})).remove((function(t){var e=a.getItemGraphicEl(t);r.remove(e)})).execute(),!this._initialized){this._initialized=!0;var h=function(t,e,n){var i=t.model,r=t.getRect(),o=new Ts({shape:{x:r.x,y:r.y,width:r.width,height:r.height}}),a="horizontal"===i.get("layout")?"width":"height";return o.setShape(a,0),rh(o,{shape:{width:r.width,height:r.height}},e,n),o}(s,t,(function(){setTimeout((function(){r.removeClipPath()}))}));r.setClipPath(h)}this._data=o},e.prototype.incrementalPrepareRender=function(t,e,n){this._initialized=!0,this._data=null,this._dataGroup.removeAll()},e.prototype.incrementalRender=function(t,e,n){for(var i=e.getData(),r=e.coordinateSystem,o=r.dimensions,a=qA(e),s=this._progressiveEls=[],l=t.start;l<t.end;l++){var u=jA(i,this._dataGroup,l,o,r);u.incremental=!0,KA(u,i,l,a),s.push(u)}},e.prototype.remove=function(){this._dataGroup&&this._dataGroup.removeAll(),this._data=null},e.type="parallel",e}(mg);function ZA(t,e,n,i){for(var r,o=[],a=0;a<n.length;a++){var s=n[a],l=t.get(t.mapDimension(s),e);r=l,("category"===i.getAxis(s).type?null==r:null==r||isNaN(r))||o.push(i.dataToPoint(l,s))}return o}function jA(t,e,n,i,r){var o=ZA(t,n,i,r),a=new Ou({shape:{points:o},z2:10});return e.add(a),t.setItemGraphicEl(n,a),a}function qA(t){var e=t.get("smooth",!0);return!0===e&&(e=.3),nt(e=to(e))&&(e=0),{smooth:e}}function KA(t,e,n,i){t.useStyle(e.getItemVisual(n,"style")),t.style.fill=null,t.setShape("smooth",i.smooth);var r=e.getItemModel(n),o=r.getModel("emphasis");zl(t,r,"lineStyle"),Ol(t,o.get("focus"),o.get("blurScope"),o.get("disabled"))}var $A=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.visualStyleAccessPath="lineStyle",n.visualDrawType="stroke",n}return n(e,t),e.prototype.getInitialData=function(t,e){return nx(null,this,{useEncodeDefaulter:W(JA,null,this)})},e.prototype.getRawIndicesByActiveState=function(t){var e=this.coordinateSystem,n=this.getData(),i=[];return e.eachActiveState(n,(function(e,r){t===e&&i.push(n.getRawIndex(r))})),i},e.type="series.parallel",e.dependencies=["parallel"],e.defaultOption={z:2,coordinateSystem:"parallel",parallelIndex:0,label:{show:!1},inactiveOpacity:.05,activeOpacity:1,lineStyle:{width:1,opacity:.45,type:"solid"},emphasis:{label:{show:!1}},progressive:500,smooth:!1,animationEasing:"linear"},e}(ag);function JA(t){var e=t.ecModel.getComponent("parallel",t.get("parallelIndex"));if(e){var n={};return E(e.dimensions,(function(t){var e=+t.replace("dim","");n[t]=e})),n}}var QA=["lineStyle","opacity"],tk={seriesType:"parallel",reset:function(t,e){var n=t.coordinateSystem,i={normal:t.get(["lineStyle","opacity"]),active:t.get("activeOpacity"),inactive:t.get("inactiveOpacity")};return{progress:function(t,e){n.eachActiveState(e,(function(t,n){var r=i[t];if("normal"===t&&e.hasItemOption){var o=e.getItemModel(n).get(QA,!0);null!=o&&(r=o)}e.ensureUniqueItemVisual(n,"style").opacity=r}),t.start,t.end)}}}};function ek(t){!function(t){if(t.parallel)return;var e=!1;E(t.series,(function(t){t&&"parallel"===t.type&&(e=!0)})),e&&(t.parallel=[{}])}(t),function(t){E(ho(t.parallelAxis),(function(e){if(q(e)){var n=e.parallelIndex||0,i=ho(t.parallel)[n];i&&i.parallelAxisDefault&&C(e,i.parallelAxisDefault,!1)}}))}(t)}var nk=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){this._model=t,this._api=n,this._handlers||(this._handlers={},E(ik,(function(t,e){n.getZr().on(e,this._handlers[e]=W(t,this))}),this)),Dg(this,"_throttledDispatchExpand",t.get("axisExpandRate"),"fixRate")},e.prototype.dispose=function(t,e){Ag(this,"_throttledDispatchExpand"),E(this._handlers,(function(t,n){e.getZr().off(n,t)})),this._handlers=null},e.prototype._throttledDispatchExpand=function(t){this._dispatchExpand(t)},e.prototype._dispatchExpand=function(t){t&&this._api.dispatchAction(A({type:"parallelAxisExpand"},t))},e.type="parallel",e}(fg),ik={mousedown:function(t){rk(this,"click")&&(this._mouseDownPoint=[t.offsetX,t.offsetY])},mouseup:function(t){var e=this._mouseDownPoint;if(rk(this,"click")&&e){var n=[t.offsetX,t.offsetY];if(Math.pow(e[0]-n[0],2)+Math.pow(e[1]-n[1],2)>5)return;var i=this._model.coordinateSystem.getSlidedAxisExpandWindow([t.offsetX,t.offsetY]);"none"!==i.behavior&&this._dispatchExpand({axisExpandWindow:i.axisExpandWindow})}this._mouseDownPoint=null},mousemove:function(t){if(!this._mouseDownPoint&&rk(this,"mousemove")){var e=this._model,n=e.coordinateSystem.getSlidedAxisExpandWindow([t.offsetX,t.offsetY]),i=n.behavior;"jump"===i&&this._throttledDispatchExpand.debounceNextCall(e.get("axisExpandDebounce")),this._throttledDispatchExpand("none"===i?null:{axisExpandWindow:n.axisExpandWindow,animation:"jump"===i?null:{duration:0}})}}};function rk(t,e){var n=t._model;return n.get("axisExpandable")&&n.get("axisExpandTriggerOn")===e}var ok=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(){t.prototype.init.apply(this,arguments),this.mergeOption({})},e.prototype.mergeOption=function(t){var e=this.option;t&&C(e,t,!0),this._initDimensions()},e.prototype.contains=function(t,e){var n=t.get("parallelIndex");return null!=n&&e.getComponent("parallel",n)===this},e.prototype.setAxisExpand=function(t){E(["axisExpandable","axisExpandCenter","axisExpandCount","axisExpandWidth","axisExpandWindow"],(function(e){t.hasOwnProperty(e)&&(this.option[e]=t[e])}),this)},e.prototype._initDimensions=function(){var t=this.dimensions=[],e=this.parallelAxisIndex=[];E(B(this.ecModel.queryComponents({mainType:"parallelAxis"}),(function(t){return(t.get("parallelIndex")||0)===this.componentIndex}),this),(function(n){t.push("dim"+n.get("dim")),e.push(n.componentIndex)}))},e.type="parallel",e.dependencies=["parallelAxis"],e.layoutMode="box",e.defaultOption={z:0,left:80,top:60,right:80,bottom:60,layout:"horizontal",axisExpandable:!1,axisExpandCenter:null,axisExpandCount:0,axisExpandWidth:50,axisExpandRate:17,axisExpandDebounce:50,axisExpandSlideTriggerArea:[-.15,.05,.4],axisExpandTriggerOn:"click",parallelAxisDefault:null},e}(Ip),ak=function(t){function e(e,n,i,r,o){var a=t.call(this,e,n,i)||this;return a.type=r||"value",a.axisIndex=o,a}return n(e,t),e.prototype.isHorizontal=function(){return"horizontal"!==this.coordinateSystem.getModel().get("layout")},e}(G_);function sk(t,e,n,i,r,o){t=t||0;var a=n[1]-n[0];if(null!=r&&(r=uk(r,[0,a])),null!=o&&(o=Math.max(o,null!=r?r:0)),"all"===i){var s=Math.abs(e[1]-e[0]);s=uk(s,[0,a]),r=o=uk(s,[r,o]),i=0}e[0]=uk(e[0],n),e[1]=uk(e[1],n);var l=lk(e,i);e[i]+=t;var u,h=r||0,c=n.slice();return l.sign<0?c[0]+=h:c[1]-=h,e[i]=uk(e[i],c),u=lk(e,i),null!=r&&(u.sign!==l.sign||u.span<r)&&(e[1-i]=e[i]+l.sign*r),u=lk(e,i),null!=o&&u.span>o&&(e[1-i]=e[i]+u.sign*o),e}function lk(t,e){var n=t[e]-t[1-e];return{span:Math.abs(n),sign:n>0?-1:n<0?1:e?-1:1}}function uk(t,e){return Math.min(null!=e[1]?e[1]:1/0,Math.max(null!=e[0]?e[0]:-1/0,t))}var hk=E,ck=Math.min,pk=Math.max,dk=Math.floor,fk=Math.ceil,gk=zr,yk=Math.PI,vk=function(){function t(t,e,n){this.type="parallel",this._axesMap=ft(),this._axesLayout={},this.dimensions=t.dimensions,this._model=t,this._init(t,e,n)}return t.prototype._init=function(t,e,n){var i=t.dimensions,r=t.parallelAxisIndex;hk(i,(function(t,n){var i=r[n],o=e.getComponent("parallelAxis",i),a=this._axesMap.set(t,new ak(t,i_(o),[0,0],o.get("type"),i)),s="category"===a.type;a.onBand=s&&o.get("boundaryGap"),a.inverse=o.get("inverse"),o.axis=a,a.model=o,a.coordinateSystem=o.coordinateSystem=this}),this)},t.prototype.update=function(t,e){this._updateAxesFromSeries(this._model,t)},t.prototype.containPoint=function(t){var e=this._makeLayoutInfo(),n=e.axisBase,i=e.layoutBase,r=e.pixelDimIndex,o=t[1-r],a=t[r];return o>=n&&o<=n+e.axisLength&&a>=i&&a<=i+e.layoutLength},t.prototype.getModel=function(){return this._model},t.prototype._updateAxesFromSeries=function(t,e){e.eachSeries((function(n){if(t.contains(n,e)){var i=n.getData();hk(this.dimensions,(function(t){var e=this._axesMap.get(t);e.scale.unionExtentFromData(i,i.mapDimension(t)),n_(e.scale,e.model)}),this)}}),this)},t.prototype.resize=function(t,e){this._rect=mp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()}),this._layoutAxes()},t.prototype.getRect=function(){return this._rect},t.prototype._makeLayoutInfo=function(){var t,e=this._model,n=this._rect,i=["x","y"],r=["width","height"],o=e.get("layout"),a="horizontal"===o?0:1,s=n[r[a]],l=[0,s],u=this.dimensions.length,h=mk(e.get("axisExpandWidth"),l),c=mk(e.get("axisExpandCount")||0,[0,u]),p=e.get("axisExpandable")&&u>3&&u>c&&c>1&&h>0&&s>0,d=e.get("axisExpandWindow");d?(t=mk(d[1]-d[0],l),d[1]=d[0]+t):(t=mk(h*(c-1),l),(d=[h*(e.get("axisExpandCenter")||dk(u/2))-t/2])[1]=d[0]+t);var f=(s-t)/(u-c);f<3&&(f=0);var g=[dk(gk(d[0]/h,1))+1,fk(gk(d[1]/h,1))-1],y=f/h*d[0];return{layout:o,pixelDimIndex:a,layoutBase:n[i[a]],layoutLength:s,axisBase:n[i[1-a]],axisLength:n[r[1-a]],axisExpandable:p,axisExpandWidth:h,axisCollapseWidth:f,axisExpandWindow:d,axisCount:u,winInnerIndices:g,axisExpandWindow0Pos:y}},t.prototype._layoutAxes=function(){var t=this._rect,e=this._axesMap,n=this.dimensions,i=this._makeLayoutInfo(),r=i.layout;e.each((function(t){var e=[0,i.axisLength],n=t.inverse?1:0;t.setExtent(e[n],e[1-n])})),hk(n,(function(e,n){var o=(i.axisExpandable?_k:xk)(n,i),a={horizontal:{x:o.position,y:i.axisLength},vertical:{x:0,y:o.position}},s={horizontal:yk/2,vertical:0},l=[a[r].x+t.x,a[r].y+t.y],u=s[r],h=[1,0,0,1,0,0];zi(h,h,u),Ei(h,h,l),this._axesLayout[e]={position:l,rotation:u,transform:h,axisNameAvailableWidth:o.axisNameAvailableWidth,axisLabelShow:o.axisLabelShow,nameTruncateMaxWidth:o.nameTruncateMaxWidth,tickDirection:1,labelDirection:1}}),this)},t.prototype.getAxis=function(t){return this._axesMap.get(t)},t.prototype.dataToPoint=function(t,e){return this.axisCoordToPoint(this._axesMap.get(e).dataToCoord(t),e)},t.prototype.eachActiveState=function(t,e,n,i){null==n&&(n=0),null==i&&(i=t.count());var r=this._axesMap,o=this.dimensions,a=[],s=[];E(o,(function(e){a.push(t.mapDimension(e)),s.push(r.get(e).model)}));for(var l=this.hasAxisBrushed(),u=n;u<i;u++){var h=void 0;if(l){h="active";for(var c=t.getValues(a,u),p=0,d=o.length;p<d;p++){if("inactive"===s[p].getActiveState(c[p])){h="inactive";break}}}else h="normal";e(h,u)}},t.prototype.hasAxisBrushed=function(){for(var t=this.dimensions,e=this._axesMap,n=!1,i=0,r=t.length;i<r;i++)"normal"!==e.get(t[i]).model.getActiveState()&&(n=!0);return n},t.prototype.axisCoordToPoint=function(t,e){return Ih([t,0],this._axesLayout[e].transform)},t.prototype.getAxisLayout=function(t){return T(this._axesLayout[t])},t.prototype.getSlidedAxisExpandWindow=function(t){var e=this._makeLayoutInfo(),n=e.pixelDimIndex,i=e.axisExpandWindow.slice(),r=i[1]-i[0],o=[0,e.axisExpandWidth*(e.axisCount-1)];if(!this.containPoint(t))return{behavior:"none",axisExpandWindow:i};var a,s=t[n]-e.layoutBase-e.axisExpandWindow0Pos,l="slide",u=e.axisCollapseWidth,h=this._model.get("axisExpandSlideTriggerArea"),c=null!=h[0];if(u)c&&u&&s<r*h[0]?(l="jump",a=s-r*h[2]):c&&u&&s>r*(1-h[0])?(l="jump",a=s-r*(1-h[2])):(a=s-r*h[1])>=0&&(a=s-r*(1-h[1]))<=0&&(a=0),(a*=e.axisExpandWidth/u)?sk(a,i,o,"all"):l="none";else{var p=i[1]-i[0];(i=[pk(0,o[1]*s/p-p/2)])[1]=ck(o[1],i[0]+p),i[0]=i[1]-p}return{axisExpandWindow:i,behavior:l}},t}();function mk(t,e){return ck(pk(t,e[0]),e[1])}function xk(t,e){var n=e.layoutLength/(e.axisCount-1);return{position:n*t,axisNameAvailableWidth:n,axisLabelShow:!0}}function _k(t,e){var n,i,r=e.layoutLength,o=e.axisExpandWidth,a=e.axisCount,s=e.axisCollapseWidth,l=e.winInnerIndices,u=s,h=!1;return t<l[0]?(n=t*s,i=s):t<=l[1]?(n=e.axisExpandWindow0Pos+t*o-e.axisExpandWindow[0],u=o,h=!0):(n=r-(a-1-t)*s,i=s),{position:n,axisNameAvailableWidth:u,axisLabelShow:h,nameTruncateMaxWidth:i}}var bk={create:function(t,e){var n=[];return t.eachComponent("parallel",(function(i,r){var o=new vk(i,t,e);o.name="parallel_"+r,o.resize(i,e),i.coordinateSystem=o,o.model=i,n.push(o)})),t.eachSeries((function(t){if("parallel"===t.get("coordinateSystem")){var e=t.getReferringComponents("parallel",Co).models[0];t.coordinateSystem=e.coordinateSystem}})),n}},wk=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.activeIntervals=[],n}return n(e,t),e.prototype.getAreaSelectStyle=function(){return Wo([["fill","color"],["lineWidth","borderWidth"],["stroke","borderColor"],["width","width"],["opacity","opacity"]])(this.getModel("areaSelectStyle"))},e.prototype.setActiveIntervals=function(t){var e=this.activeIntervals=T(t);if(e)for(var n=e.length-1;n>=0;n--)Vr(e[n])},e.prototype.getActiveState=function(t){var e=this.activeIntervals;if(!e.length)return"normal";if(null==t||isNaN(+t))return"inactive";if(1===e.length){var n=e[0];if(n[0]<=t&&t<=n[1])return"active"}else for(var i=0,r=e.length;i<r;i++)if(e[i][0]<=t&&t<=e[i][1])return"active";return"inactive"},e}(Ip);R(wk,h_);var Sk=!0,Mk=Math.min,Ik=Math.max,Tk=Math.pow,Ck="globalPan",Dk={w:[0,0],e:[0,1],n:[1,0],s:[1,1]},Ak={w:"ew",e:"ew",n:"ns",s:"ns",ne:"nesw",sw:"nesw",nw:"nwse",se:"nwse"},kk={brushStyle:{lineWidth:2,stroke:"rgba(210,219,238,0.3)",fill:"#D2DBEE"},transformable:!0,brushMode:"single",removeOnClick:!1},Lk=0,Pk=function(t){function e(e){var n=t.call(this)||this;return n._track=[],n._covers=[],n._handlers={},n._zr=e,n.group=new Cr,n._uid="brushController_"+Lk++,E(oL,(function(t,e){this._handlers[e]=W(t,this)}),n),n}return n(e,t),e.prototype.enableBrush=function(t){return this._brushType&&this._doDisableBrush(),t.brushType&&this._doEnableBrush(t),this},e.prototype._doEnableBrush=function(t){var e=this._zr;this._enableGlobalPan||function(t,e,n){CI(t)[e]=n}(e,Ck,this._uid),E(this._handlers,(function(t,n){e.on(n,t)})),this._brushType=t.brushType,this._brushOption=C(T(kk),t,!0)},e.prototype._doDisableBrush=function(){var t=this._zr;!function(t,e,n){var i=CI(t);i[e]===n&&(i[e]=null)}(t,Ck,this._uid),E(this._handlers,(function(e,n){t.off(n,e)})),this._brushType=this._brushOption=null},e.prototype.setPanels=function(t){if(t&&t.length){var e=this._panels={};E(t,(function(t){e[t.panelId]=T(t)}))}else this._panels=null;return this},e.prototype.mount=function(t){t=t||{},this._enableGlobalPan=t.enableGlobalPan;var e=this.group;return this._zr.add(e),e.attr({x:t.x||0,y:t.y||0,rotation:t.rotation||0,scaleX:t.scaleX||1,scaleY:t.scaleY||1}),this._transform=e.getLocalTransform(),this},e.prototype.updateCovers=function(t){t=z(t,(function(t){return C(T(kk),t,!0)}));var e=this._covers,n=this._covers=[],i=this,r=this._creatingCover;return new Sm(e,t,(function(t,e){return o(t.__brushOption,e)}),o).add(a).update(a).remove((function(t){e[t]!==r&&i.group.remove(e[t])})).execute(),this;function o(t,e){return(null!=t.id?t.id:"\0-brush-index-"+e)+"-"+t.brushType}function a(o,a){var s=t[o];if(null!=a&&e[a]===r)n[o]=e[a];else{var l=n[o]=null!=a?(e[a].__brushOption=s,e[a]):Rk(i,Ok(i,s));zk(i,l)}}},e.prototype.unmount=function(){return this.enableBrush(!1),Gk(this),this._zr.remove(this.group),this},e.prototype.dispose=function(){this.unmount(),this.off()},e}(Xt);function Ok(t,e){var n=sL[e.brushType].createCover(t,e);return n.__brushOption=e,Ek(n,e),t.group.add(n),n}function Rk(t,e){var n=Vk(e);return n.endCreating&&(n.endCreating(t,e),Ek(e,e.__brushOption)),e}function Nk(t,e){var n=e.__brushOption;Vk(e).updateCoverShape(t,e,n.range,n)}function Ek(t,e){var n=e.z;null==n&&(n=1e4),t.traverse((function(t){t.z=n,t.z2=n}))}function zk(t,e){Vk(e).updateCommon(t,e),Nk(t,e)}function Vk(t){return sL[t.__brushOption.brushType]}function Bk(t,e,n){var i,r=t._panels;if(!r)return Sk;var o=t._transform;return E(r,(function(t){t.isTargetByCursor(e,n,o)&&(i=t)})),i}function Fk(t,e){var n=t._panels;if(!n)return Sk;var i=e.__brushOption.panelId;return null!=i?n[i]:Sk}function Gk(t){var e=t._covers,n=e.length;return E(e,(function(e){t.group.remove(e)}),t),e.length=0,!!n}function Wk(t,e){var n=z(t._covers,(function(t){var e=t.__brushOption,n=T(e.range);return{brushType:e.brushType,panelId:e.panelId,range:n}}));t.trigger("brush",{areas:n,isEnd:!!e.isEnd,removeOnClick:!!e.removeOnClick})}function Hk(t){var e=t.length-1;return e<0&&(e=0),[t[0],t[e]]}function Yk(t,e,n,i){var r=new Cr;return r.add(new Ts({name:"main",style:jk(n),silent:!0,draggable:!0,cursor:"move",drift:H($k,t,e,r,["n","s","w","e"]),ondragend:H(Wk,e,{isEnd:!0})})),E(i,(function(n){r.add(new Ts({name:n.join(""),style:{opacity:0},draggable:!0,silent:!0,invisible:!0,drift:H($k,t,e,r,n),ondragend:H(Wk,e,{isEnd:!0})}))})),r}function Uk(t,e,n,i){var r=i.brushStyle.lineWidth||0,o=Ik(r,6),a=n[0][0],s=n[1][0],l=a-r/2,u=s-r/2,h=n[0][1],c=n[1][1],p=h-o+r/2,d=c-o+r/2,f=h-a,g=c-s,y=f+r,v=g+r;Zk(t,e,"main",a,s,f,g),i.transformable&&(Zk(t,e,"w",l,u,o,v),Zk(t,e,"e",p,u,o,v),Zk(t,e,"n",l,u,y,o),Zk(t,e,"s",l,d,y,o),Zk(t,e,"nw",l,u,o,o),Zk(t,e,"ne",p,u,o,o),Zk(t,e,"sw",l,d,o,o),Zk(t,e,"se",p,d,o,o))}function Xk(t,e){var n=e.__brushOption,i=n.transformable,r=e.childAt(0);r.useStyle(jk(n)),r.attr({silent:!i,cursor:i?"move":"default"}),E([["w"],["e"],["n"],["s"],["s","e"],["s","w"],["n","e"],["n","w"]],(function(n){var r=e.childOfName(n.join("")),o=1===n.length?Kk(t,n[0]):function(t,e){var n=[Kk(t,e[0]),Kk(t,e[1])];return("e"===n[0]||"w"===n[0])&&n.reverse(),n.join("")}(t,n);r&&r.attr({silent:!i,invisible:!i,cursor:i?Ak[o]+"-resize":null})}))}function Zk(t,e,n,i,r,o,a){var s=e.childOfName(n);s&&s.setShape(function(t){var e=Mk(t[0][0],t[1][0]),n=Mk(t[0][1],t[1][1]),i=Ik(t[0][0],t[1][0]),r=Ik(t[0][1],t[1][1]);return{x:e,y:n,width:i-e,height:r-n}}(tL(t,e,[[i,r],[i+o,r+a]])))}function jk(t){return k({strokeNoScale:!0},t.brushStyle)}function qk(t,e,n,i){var r=[Mk(t,n),Mk(e,i)],o=[Ik(t,n),Ik(e,i)];return[[r[0],o[0]],[r[1],o[1]]]}function Kk(t,e){return{left:"w",right:"e",top:"n",bottom:"s"}[Th({w:"left",e:"right",n:"top",s:"bottom"}[e],function(t){return Mh(t.group)}(t))]}function $k(t,e,n,i,r,o){var a=n.__brushOption,s=t.toRectRange(a.range),l=Qk(e,r,o);E(i,(function(t){var e=Dk[t];s[e[0]][e[1]]+=l[e[0]]})),a.range=t.fromRectRange(qk(s[0][0],s[1][0],s[0][1],s[1][1])),zk(e,n),Wk(e,{isEnd:!1})}function Jk(t,e,n,i){var r=e.__brushOption.range,o=Qk(t,n,i);E(r,(function(t){t[0]+=o[0],t[1]+=o[1]})),zk(t,e),Wk(t,{isEnd:!1})}function Qk(t,e,n){var i=t.group,r=i.transformCoordToLocal(e,n),o=i.transformCoordToLocal(0,0);return[r[0]-o[0],r[1]-o[1]]}function tL(t,e,n){var i=Fk(t,e);return i&&i!==Sk?i.clipPath(n,t._transform):T(n)}function eL(t){var e=t.event;e.preventDefault&&e.preventDefault()}function nL(t,e,n){return t.childOfName("main").contain(e,n)}function iL(t,e,n,i){var r,o=t._creatingCover,a=t._creatingPanel,s=t._brushOption;if(t._track.push(n.slice()),function(t){var e=t._track;if(!e.length)return!1;var n=e[e.length-1],i=e[0],r=n[0]-i[0],o=n[1]-i[1];return Tk(r*r+o*o,.5)>6}(t)||o){if(a&&!o){"single"===s.brushMode&&Gk(t);var l=T(s);l.brushType=rL(l.brushType,a),l.panelId=a===Sk?null:a.panelId,o=t._creatingCover=Ok(t,l),t._covers.push(o)}if(o){var u=sL[rL(t._brushType,a)];o.__brushOption.range=u.getCreatingRange(tL(t,o,t._track)),i&&(Rk(t,o),u.updateCommon(t,o)),Nk(t,o),r={isEnd:i}}}else i&&"single"===s.brushMode&&s.removeOnClick&&Bk(t,e,n)&&Gk(t)&&(r={isEnd:i,removeOnClick:!0});return r}function rL(t,e){return"auto"===t?e.defaultBrushType:t}var oL={mousedown:function(t){if(this._dragging)aL(this,t);else if(!t.target||!t.target.draggable){eL(t);var e=this.group.transformCoordToLocal(t.offsetX,t.offsetY);this._creatingCover=null,(this._creatingPanel=Bk(this,t,e))&&(this._dragging=!0,this._track=[e.slice()])}},mousemove:function(t){var e=t.offsetX,n=t.offsetY,i=this.group.transformCoordToLocal(e,n);if(function(t,e,n){if(t._brushType&&!function(t,e,n){var i=t._zr;return e<0||e>i.getWidth()||n<0||n>i.getHeight()}(t,e.offsetX,e.offsetY)){var i=t._zr,r=t._covers,o=Bk(t,e,n);if(!t._dragging)for(var a=0;a<r.length;a++){var s=r[a].__brushOption;if(o&&(o===Sk||s.panelId===o.panelId)&&sL[s.brushType].contain(r[a],n[0],n[1]))return}o&&i.setCursorStyle("crosshair")}}(this,t,i),this._dragging){eL(t);var r=iL(this,t,i,!1);r&&Wk(this,r)}},mouseup:function(t){aL(this,t)}};function aL(t,e){if(t._dragging){eL(e);var n=e.offsetX,i=e.offsetY,r=t.group.transformCoordToLocal(n,i),o=iL(t,e,r,!0);t._dragging=!1,t._track=[],t._creatingCover=null,o&&Wk(t,o)}}var sL={lineX:lL(0),lineY:lL(1),rect:{createCover:function(t,e){function n(t){return t}return Yk({toRectRange:n,fromRectRange:n},t,e,[["w"],["e"],["n"],["s"],["s","e"],["s","w"],["n","e"],["n","w"]])},getCreatingRange:function(t){var e=Hk(t);return qk(e[1][0],e[1][1],e[0][0],e[0][1])},updateCoverShape:function(t,e,n,i){Uk(t,e,n,i)},updateCommon:Xk,contain:nL},polygon:{createCover:function(t,e){var n=new Cr;return n.add(new Ou({name:"main",style:jk(e),silent:!0})),n},getCreatingRange:function(t){return t},endCreating:function(t,e){e.remove(e.childAt(0)),e.add(new Lu({name:"main",draggable:!0,drift:H(Jk,t,e),ondragend:H(Wk,t,{isEnd:!0})}))},updateCoverShape:function(t,e,n,i){e.childAt(0).setShape({points:tL(t,e,n)})},updateCommon:Xk,contain:nL}};function lL(t){return{createCover:function(e,n){return Yk({toRectRange:function(e){var n=[e,[0,100]];return t&&n.reverse(),n},fromRectRange:function(e){return e[t]}},e,n,[[["w"],["e"]],[["n"],["s"]]][t])},getCreatingRange:function(e){var n=Hk(e);return[Mk(n[0][t],n[1][t]),Ik(n[0][t],n[1][t])]},updateCoverShape:function(e,n,i,r){var o,a=Fk(e,n);if(a!==Sk&&a.getLinearBrushOtherExtent)o=a.getLinearBrushOtherExtent(t);else{var s=e._zr;o=[0,[s.getWidth(),s.getHeight()][1-t]]}var l=[i,o];t&&l.reverse(),Uk(e,n,l,r)},updateCommon:Xk,contain:nL}}function uL(t){return t=pL(t),function(e){return Ah(e,t)}}function hL(t,e){return t=pL(t),function(n){var i=null!=e?e:n,r=i?t.width:t.height,o=i?t.x:t.y;return[o,o+(r||0)]}}function cL(t,e,n){var i=pL(t);return function(t,r){return i.contain(r[0],r[1])&&!EI(t,e,n)}}function pL(t){return sr.create(t)}var dL=["axisLine","axisTickLabel","axisName"],fL=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(e,n){t.prototype.init.apply(this,arguments),(this._brushController=new Pk(n.getZr())).on("brush",W(this._onBrush,this))},e.prototype.render=function(t,e,n,i){if(!function(t,e,n){return n&&"axisAreaSelect"===n.type&&e.findComponents({mainType:"parallelAxis",query:n})[0]===t}(t,e,i)){this.axisModel=t,this.api=n,this.group.removeAll();var r=this._axisGroup;if(this._axisGroup=new Cr,this.group.add(this._axisGroup),t.get("show")){var o=function(t,e){return e.getComponent("parallel",t.get("parallelIndex"))}(t,e),a=o.coordinateSystem,s=t.getAreaSelectStyle(),l=s.width,u=t.axis.dim,h=A({strokeContainThreshold:l},a.getAxisLayout(u)),c=new BM(t,h);E(dL,c.add,c),this._axisGroup.add(c.getGroup()),this._refreshBrushController(h,s,t,o,l,n),Dh(r,this._axisGroup,t)}}},e.prototype._refreshBrushController=function(t,e,n,i,r,o){var a=n.axis.getExtent(),s=a[1]-a[0],l=Math.min(30,.1*Math.abs(s)),u=sr.create({x:a[0],y:-r/2,width:s,height:r});u.x-=l,u.width+=2*l,this._brushController.mount({enableGlobalPan:!0,rotation:t.rotation,x:t.position[0],y:t.position[1]}).setPanels([{panelId:"pl",clipPath:uL(u),isTargetByCursor:cL(u,o,i),getLinearBrushOtherExtent:hL(u,0)}]).enableBrush({brushType:"lineX",brushStyle:e,removeOnClick:!0}).updateCovers(function(t){var e=t.axis;return z(t.activeIntervals,(function(t){return{brushType:"lineX",panelId:"pl",range:[e.dataToCoord(t[0],!0),e.dataToCoord(t[1],!0)]}}))}(n))},e.prototype._onBrush=function(t){var e=t.areas,n=this.axisModel,i=n.axis,r=z(e,(function(t){return[i.coordToData(t.range[0],!0),i.coordToData(t.range[1],!0)]}));(!n.option.realtime===t.isEnd||t.removeOnClick)&&this.api.dispatchAction({type:"axisAreaSelect",parallelAxisId:n.id,intervals:r})},e.prototype.dispose=function(){this._brushController.dispose()},e.type="parallelAxis",e}(fg);var gL={type:"axisAreaSelect",event:"axisAreaSelected"};var yL={type:"value",areaSelectStyle:{width:20,borderWidth:1,borderColor:"rgba(160,197,232)",color:"rgba(160,197,232)",opacity:.3},realtime:!0,z:10};function vL(t){t.registerComponentView(nk),t.registerComponentModel(ok),t.registerCoordinateSystem("parallel",bk),t.registerPreprocessor(ek),t.registerComponentModel(wk),t.registerComponentView(fL),wM(t,"parallel",wk,yL),function(t){t.registerAction(gL,(function(t,e){e.eachComponent({mainType:"parallelAxis",query:t},(function(e){e.axis.model.setActiveIntervals(t.intervals)}))})),t.registerAction("parallelAxisExpand",(function(t,e){e.eachComponent({mainType:"parallel",query:t},(function(e){e.setAxisExpand(t)}))}))}(t)}var mL=function(){this.x1=0,this.y1=0,this.x2=0,this.y2=0,this.cpx1=0,this.cpy1=0,this.cpx2=0,this.cpy2=0,this.extent=0},xL=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new mL},e.prototype.buildPath=function(t,e){var n=e.extent;t.moveTo(e.x1,e.y1),t.bezierCurveTo(e.cpx1,e.cpy1,e.cpx2,e.cpy2,e.x2,e.y2),"vertical"===e.orient?(t.lineTo(e.x2+n,e.y2),t.bezierCurveTo(e.cpx2+n,e.cpy2,e.cpx1+n,e.cpy1,e.x1+n,e.y1)):(t.lineTo(e.x2,e.y2+n),t.bezierCurveTo(e.cpx2,e.cpy2+n,e.cpx1,e.cpy1+n,e.x1,e.y1+n)),t.closePath()},e.prototype.highlight=function(){xl(this)},e.prototype.downplay=function(){_l(this)},e}(fs),_L=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._focusAdjacencyDisabled=!1,n}return n(e,t),e.prototype.render=function(t,e,n){var i=this,r=t.getGraph(),o=this.group,a=t.layoutInfo,s=a.width,l=a.height,u=t.getData(),h=t.getData("edge"),c=t.get("orient");this._model=t,o.removeAll(),o.x=a.x,o.y=a.y,r.eachEdge((function(e){var n=new xL,i=Ws(n);i.dataIndex=e.dataIndex,i.seriesIndex=t.seriesIndex,i.dataType="edge";var r,a,u,p,d,f,g,y,v=e.getModel(),m=v.getModel("lineStyle"),x=m.get("curveness"),_=e.node1.getLayout(),b=e.node1.getModel(),w=b.get("localX"),S=b.get("localY"),M=e.node2.getLayout(),I=e.node2.getModel(),T=I.get("localX"),C=I.get("localY"),D=e.getLayout();switch(n.shape.extent=Math.max(1,D.dy),n.shape.orient=c,"vertical"===c?(r=(null!=w?w*s:_.x)+D.sy,a=(null!=S?S*l:_.y)+_.dy,u=(null!=T?T*s:M.x)+D.ty,d=r,f=a*(1-x)+(p=null!=C?C*l:M.y)*x,g=u,y=a*x+p*(1-x)):(r=(null!=w?w*s:_.x)+_.dx,a=(null!=S?S*l:_.y)+D.sy,d=r*(1-x)+(u=null!=T?T*s:M.x)*x,f=a,g=r*x+u*(1-x),y=p=(null!=C?C*l:M.y)+D.ty),n.setShape({x1:r,y1:a,x2:u,y2:p,cpx1:d,cpy1:f,cpx2:g,cpy2:y}),n.useStyle(m.getItemStyle()),n.style.fill){case"source":n.style.fill=e.node1.getVisual("color"),n.style.decal=e.node1.getVisual("style").decal;break;case"target":n.style.fill=e.node2.getVisual("color"),n.style.decal=e.node2.getVisual("style").decal;break;case"gradient":var A=e.node1.getVisual("color"),k=e.node2.getVisual("color");X(A)&&X(k)&&(n.style.fill=new Uu(0,0,+("horizontal"===c),+("vertical"===c),[{color:A,offset:0},{color:k,offset:1}]))}var L=v.getModel("emphasis");zl(n,v,"lineStyle",(function(t){return t.getItemStyle()})),o.add(n),h.setItemGraphicEl(e.dataIndex,n);var P=L.get("focus");Ol(n,"adjacency"===P?e.getAdjacentDataIndices():P,L.get("blurScope"),L.get("disabled")),Ws(n).dataType="edge"})),r.eachNode((function(e){var n=e.getLayout(),i=e.getModel(),r=i.get("localX"),a=i.get("localY"),h=i.getModel("emphasis"),c=new Ts({shape:{x:null!=r?r*s:n.x,y:null!=a?a*l:n.y,width:n.dx,height:n.dy},style:i.getModel("itemStyle").getItemStyle(),z2:10});Wh(c,Hh(i),{labelFetcher:t,labelDataIndex:e.dataIndex,defaultText:e.id}),c.disableLabelAnimation=!0,c.setStyle("fill",e.getVisual("color")),c.setStyle("decal",e.getVisual("style").decal),zl(c,i),o.add(c),u.setItemGraphicEl(e.dataIndex,c),Ws(c).dataType="node";var p=h.get("focus");Ol(c,"adjacency"===p?e.getAdjacentDataIndices():p,h.get("blurScope"),h.get("disabled"))})),u.eachItemGraphicEl((function(e,r){u.getItemModel(r).get("draggable")&&(e.drift=function(e,o){i._focusAdjacencyDisabled=!0,this.shape.x+=e,this.shape.y+=o,this.dirty(),n.dispatchAction({type:"dragNode",seriesId:t.id,dataIndex:u.getRawIndex(r),localX:this.shape.x/s,localY:this.shape.y/l})},e.ondragend=function(){i._focusAdjacencyDisabled=!1},e.draggable=!0,e.cursor="move")})),!this._data&&t.isAnimationEnabled()&&o.setClipPath(function(t,e,n){var i=new Ts({shape:{x:t.x-10,y:t.y-10,width:0,height:t.height+20}});return rh(i,{shape:{width:t.width+20}},e,n),i}(o.getBoundingRect(),t,(function(){o.removeClipPath()}))),this._data=t.getData()},e.prototype.dispose=function(){},e.type="sankey",e}(mg);var bL=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.getInitialData=function(t,e){var n=t.edges||t.links,i=t.data||t.nodes,r=t.levels;this.levelModels=[];for(var o=this.levelModels,a=0;a<r.length;a++)null!=r[a].depth&&r[a].depth>=0&&(o[r[a].depth]=new pc(r[a],this,e));if(i&&n)return PA(i,n,this,!0,(function(t,e){t.wrapMethod("getItemModel",(function(t,e){var n=t.parentModel,i=n.getData().getItemLayout(e);if(i){var r=i.depth,o=n.levelModels[r];o&&(t.parentModel=o)}return t})),e.wrapMethod("getItemModel",(function(t,e){var n=t.parentModel,i=n.getGraph().getEdgeByIndex(e).node1.getLayout();if(i){var r=i.depth,o=n.levelModels[r];o&&(t.parentModel=o)}return t}))})).data},e.prototype.setNodePosition=function(t,e){var n=(this.option.data||this.option.nodes)[t];n.localX=e[0],n.localY=e[1]},e.prototype.getGraph=function(){return this.getData().graph},e.prototype.getEdgeData=function(){return this.getGraph().edgeData},e.prototype.formatTooltip=function(t,e,n){function i(t){return isNaN(t)||null==t}if("edge"===n){var r=this.getDataParams(t,n),o=r.data,a=r.value;return Uf("nameValue",{name:o.source+" -- "+o.target,value:a,noValue:i(a)})}var s=this.getGraph().getNodeByIndex(t).getLayout().value,l=this.getDataParams(t,n).data.name;return Uf("nameValue",{name:null!=l?l+"":null,value:s,noValue:i(s)})},e.prototype.optionUpdated=function(){},e.prototype.getDataParams=function(e,n){var i=t.prototype.getDataParams.call(this,e,n);if(null==i.value&&"node"===n){var r=this.getGraph().getNodeByIndex(e).getLayout().value;i.value=r}return i},e.type="series.sankey",e.defaultOption={z:2,coordinateSystem:"view",left:"5%",top:"5%",right:"20%",bottom:"5%",orient:"horizontal",nodeWidth:20,nodeGap:8,draggable:!0,layoutIterations:32,label:{show:!0,position:"right",fontSize:12},levels:[],nodeAlign:"justify",lineStyle:{color:"#314656",opacity:.2,curveness:.5},emphasis:{label:{show:!0},lineStyle:{opacity:.5}},select:{itemStyle:{borderColor:"#212121"}},animationEasing:"linear",animationDuration:1e3},e}(ag);function wL(t,e){t.eachSeriesByType("sankey",(function(t){var n=t.get("nodeWidth"),i=t.get("nodeGap"),r=function(t,e){return mp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}(t,e);t.layoutInfo=r;var o=r.width,a=r.height,s=t.getGraph(),l=s.nodes,u=s.edges;!function(t){E(t,(function(t){var e=PL(t.outEdges,LL),n=PL(t.inEdges,LL),i=t.getValue()||0,r=Math.max(e,n,i);t.setLayout({value:r},!0)}))}(l),function(t,e,n,i,r,o,a,s,l){(function(t,e,n,i,r,o,a){for(var s=[],l=[],u=[],h=[],c=0,p=0;p<e.length;p++)s[p]=1;for(p=0;p<t.length;p++)l[p]=t[p].inEdges.length,0===l[p]&&u.push(t[p]);var d=-1;for(;u.length;){for(var f=0;f<u.length;f++){var g=u[f],y=g.hostGraph.data.getRawDataItem(g.dataIndex),v=null!=y.depth&&y.depth>=0;v&&y.depth>d&&(d=y.depth),g.setLayout({depth:v?y.depth:c},!0),"vertical"===o?g.setLayout({dy:n},!0):g.setLayout({dx:n},!0);for(var m=0;m<g.outEdges.length;m++){var x=g.outEdges[m];s[e.indexOf(x)]=0;var _=x.node2;0==--l[t.indexOf(_)]&&h.indexOf(_)<0&&h.push(_)}}++c,u=h,h=[]}for(p=0;p<s.length;p++)if(1===s[p])throw new Error("Sankey is a DAG, the original data has cycle!");var b=d>c-1?d:c-1;a&&"left"!==a&&function(t,e,n,i){if("right"===e){for(var r=[],o=t,a=0;o.length;){for(var s=0;s<o.length;s++){var l=o[s];l.setLayout({skNodeHeight:a},!0);for(var u=0;u<l.inEdges.length;u++){var h=l.inEdges[u];r.indexOf(h.node1)<0&&r.push(h.node1)}}o=r,r=[],++a}E(t,(function(t){SL(t)||t.setLayout({depth:Math.max(0,i-t.getLayout().skNodeHeight)},!0)}))}else"justify"===e&&function(t,e){E(t,(function(t){SL(t)||t.outEdges.length||t.setLayout({depth:e},!0)}))}(t,i)}(t,a,0,b);!function(t,e,n){E(t,(function(t){var i=t.getLayout().depth*e;"vertical"===n?t.setLayout({y:i},!0):t.setLayout({x:i},!0)}))}(t,"vertical"===o?(r-n)/b:(i-n)/b,o)})(t,e,n,r,o,s,l),function(t,e,n,i,r,o,a){var s=function(t,e){var n=[],i="vertical"===e?"y":"x",r=Lo(t,(function(t){return t.getLayout()[i]}));return r.keys.sort((function(t,e){return t-e})),E(r.keys,(function(t){n.push(r.buckets.get(t))})),n}(t,a);(function(t,e,n,i,r,o){var a=1/0;E(t,(function(t){var e=t.length,s=0;E(t,(function(t){s+=t.getLayout().value}));var l="vertical"===o?(i-(e-1)*r)/s:(n-(e-1)*r)/s;l<a&&(a=l)})),E(t,(function(t){E(t,(function(t,e){var n=t.getLayout().value*a;"vertical"===o?(t.setLayout({x:e},!0),t.setLayout({dx:n},!0)):(t.setLayout({y:e},!0),t.setLayout({dy:n},!0))}))})),E(e,(function(t){var e=+t.getValue()*a;t.setLayout({dy:e},!0)}))})(s,e,n,i,r,a),ML(s,r,n,i,a);for(var l=1;o>0;o--)IL(s,l*=.99,a),ML(s,r,n,i,a),OL(s,l,a),ML(s,r,n,i,a)}(t,e,o,r,i,a,s),function(t,e){var n="vertical"===e?"x":"y";E(t,(function(t){t.outEdges.sort((function(t,e){return t.node2.getLayout()[n]-e.node2.getLayout()[n]})),t.inEdges.sort((function(t,e){return t.node1.getLayout()[n]-e.node1.getLayout()[n]}))})),E(t,(function(t){var e=0,n=0;E(t.outEdges,(function(t){t.setLayout({sy:e},!0),e+=t.getLayout().dy})),E(t.inEdges,(function(t){t.setLayout({ty:n},!0),n+=t.getLayout().dy}))}))}(t,s)}(l,u,n,i,o,a,0!==B(l,(function(t){return 0===t.getLayout().value})).length?0:t.get("layoutIterations"),t.get("orient"),t.get("nodeAlign"))}))}function SL(t){var e=t.hostGraph.data.getRawDataItem(t.dataIndex);return null!=e.depth&&e.depth>=0}function ML(t,e,n,i,r){var o="vertical"===r?"x":"y";E(t,(function(t){var a,s,l;t.sort((function(t,e){return t.getLayout()[o]-e.getLayout()[o]}));for(var u=0,h=t.length,c="vertical"===r?"dx":"dy",p=0;p<h;p++)(l=u-(s=t[p]).getLayout()[o])>0&&(a=s.getLayout()[o]+l,"vertical"===r?s.setLayout({x:a},!0):s.setLayout({y:a},!0)),u=s.getLayout()[o]+s.getLayout()[c]+e;if((l=u-e-("vertical"===r?i:n))>0){a=s.getLayout()[o]-l,"vertical"===r?s.setLayout({x:a},!0):s.setLayout({y:a},!0),u=a;for(p=h-2;p>=0;--p)(l=(s=t[p]).getLayout()[o]+s.getLayout()[c]+e-u)>0&&(a=s.getLayout()[o]-l,"vertical"===r?s.setLayout({x:a},!0):s.setLayout({y:a},!0)),u=s.getLayout()[o]}}))}function IL(t,e,n){E(t.slice().reverse(),(function(t){E(t,(function(t){if(t.outEdges.length){var i=PL(t.outEdges,TL,n)/PL(t.outEdges,LL);if(isNaN(i)){var r=t.outEdges.length;i=r?PL(t.outEdges,CL,n)/r:0}if("vertical"===n){var o=t.getLayout().x+(i-kL(t,n))*e;t.setLayout({x:o},!0)}else{var a=t.getLayout().y+(i-kL(t,n))*e;t.setLayout({y:a},!0)}}}))}))}function TL(t,e){return kL(t.node2,e)*t.getValue()}function CL(t,e){return kL(t.node2,e)}function DL(t,e){return kL(t.node1,e)*t.getValue()}function AL(t,e){return kL(t.node1,e)}function kL(t,e){return"vertical"===e?t.getLayout().x+t.getLayout().dx/2:t.getLayout().y+t.getLayout().dy/2}function LL(t){return t.getValue()}function PL(t,e,n){for(var i=0,r=t.length,o=-1;++o<r;){var a=+e(t[o],n);isNaN(a)||(i+=a)}return i}function OL(t,e,n){E(t,(function(t){E(t,(function(t){if(t.inEdges.length){var i=PL(t.inEdges,DL,n)/PL(t.inEdges,LL);if(isNaN(i)){var r=t.inEdges.length;i=r?PL(t.inEdges,AL,n)/r:0}if("vertical"===n){var o=t.getLayout().x+(i-kL(t,n))*e;t.setLayout({x:o},!0)}else{var a=t.getLayout().y+(i-kL(t,n))*e;t.setLayout({y:a},!0)}}}))}))}function RL(t){t.eachSeriesByType("sankey",(function(t){var e=t.getGraph().nodes;if(e.length){var n=1/0,i=-1/0;E(e,(function(t){var e=t.getLayout().value;e<n&&(n=e),e>i&&(i=e)})),E(e,(function(e){var r=new eD({type:"color",mappingMethod:"linear",dataExtent:[n,i],visual:t.get("color")}).mapValueToVisual(e.getLayout().value),o=e.getModel().get(["itemStyle","color"]);null!=o?(e.setVisual("color",o),e.setVisual("style",{fill:o})):(e.setVisual("color",r),e.setVisual("style",{fill:r}))}))}}))}var NL=function(){function t(){}return t.prototype.getInitialData=function(t,e){var n,i,r=e.getComponent("xAxis",this.get("xAxisIndex")),o=e.getComponent("yAxis",this.get("yAxisIndex")),a=r.get("type"),s=o.get("type");"category"===a?(t.layout="horizontal",n=r.getOrdinalMeta(),i=!0):"category"===s?(t.layout="vertical",n=o.getOrdinalMeta(),i=!0):t.layout=t.layout||"horizontal";var l=["x","y"],u="horizontal"===t.layout?0:1,h=this._baseAxisDim=l[u],c=l[1-u],p=[r,o],d=p[u].get("type"),f=p[1-u].get("type"),g=t.data;if(g&&i){var y=[];E(g,(function(t,e){var n;Y(t)?(n=t.slice(),t.unshift(e)):Y(t.value)?((n=A({},t)).value=n.value.slice(),t.value.unshift(e)):n=t,y.push(n)})),t.data=y}var v=this.defaultValueDimensions,m=[{name:h,type:Tm(d),ordinalMeta:n,otherDims:{tooltip:!1,itemName:0},dimsDef:["base"]},{name:c,type:Tm(f),dimsDef:v.slice()}];return sM(this,{coordDimensions:m,dimensionsCount:v.length+1,encodeDefaulter:H(Wp,m,this)})},t.prototype.getBaseAxis=function(){var t=this._baseAxisDim;return this.ecModel.getComponent(t+"Axis",this.get(t+"AxisIndex")).axis},t}(),EL=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.defaultValueDimensions=[{name:"min",defaultTooltip:!0},{name:"Q1",defaultTooltip:!0},{name:"median",defaultTooltip:!0},{name:"Q3",defaultTooltip:!0},{name:"max",defaultTooltip:!0}],n.visualDrawType="stroke",n}return n(e,t),e.type="series.boxplot",e.dependencies=["xAxis","yAxis","grid"],e.defaultOption={z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,layout:null,boxWidth:[7,50],itemStyle:{color:"#fff",borderWidth:1},emphasis:{scale:!0,itemStyle:{borderWidth:2,shadowBlur:5,shadowOffsetX:1,shadowOffsetY:1,shadowColor:"rgba(0,0,0,0.2)"}},animationDuration:800},e}(ag);R(EL,NL,!0);var zL=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=t.getData(),r=this.group,o=this._data;this._data||r.removeAll();var a="horizontal"===t.get("layout")?1:0;i.diff(o).add((function(t){if(i.hasValue(t)){var e=FL(i.getItemLayout(t),i,t,a,!0);i.setItemGraphicEl(t,e),r.add(e)}})).update((function(t,e){var n=o.getItemGraphicEl(e);if(i.hasValue(t)){var s=i.getItemLayout(t);n?(uh(n),GL(s,n,i,t)):n=FL(s,i,t,a),r.add(n),i.setItemGraphicEl(t,n)}else r.remove(n)})).remove((function(t){var e=o.getItemGraphicEl(t);e&&r.remove(e)})).execute(),this._data=i},e.prototype.remove=function(t){var e=this.group,n=this._data;this._data=null,n&&n.eachItemGraphicEl((function(t){t&&e.remove(t)}))},e.type="boxplot",e}(mg),VL=function(){},BL=function(t){function e(e){var n=t.call(this,e)||this;return n.type="boxplotBoxPath",n}return n(e,t),e.prototype.getDefaultShape=function(){return new VL},e.prototype.buildPath=function(t,e){var n=e.points,i=0;for(t.moveTo(n[i][0],n[i][1]),i++;i<4;i++)t.lineTo(n[i][0],n[i][1]);for(t.closePath();i<n.length;i++)t.moveTo(n[i][0],n[i][1]),i++,t.lineTo(n[i][0],n[i][1])},e}(fs);function FL(t,e,n,i,r){var o=t.ends,a=new BL({shape:{points:r?WL(o,i,t):o}});return GL(t,a,e,n,r),a}function GL(t,e,n,i,r){var o=n.hostModel;(0,Vh[r?"initProps":"updateProps"])(e,{shape:{points:t.ends}},o,i),e.useStyle(n.getItemVisual(i,"style")),e.style.strokeNoScale=!0,e.z2=100;var a=n.getItemModel(i),s=a.getModel("emphasis");zl(e,a),Ol(e,s.get("focus"),s.get("blurScope"),s.get("disabled"))}function WL(t,e,n){return z(t,(function(t){return(t=t.slice())[e]=n.initBaseline,t}))}function HL(t,e){}var YL=E;function UL(t){var e=function(t){var e=[],n=[];return t.eachSeriesByType("boxplot",(function(t){var i=t.getBaseAxis(),r=P(n,i);r<0&&(r=n.length,n[r]=i,e[r]={axis:i,seriesModels:[]}),e[r].seriesModels.push(t)})),e}(t);YL(e,(function(t){var e=t.seriesModels;e.length&&(!function(t){var e,n=t.axis,i=t.seriesModels,r=i.length,o=t.boxWidthList=[],a=t.boxOffsetList=[],s=[];if("category"===n.type)e=n.getBandWidth();else{var l=0;YL(i,(function(t){l=Math.max(l,t.getData().count())}));var u=n.getExtent();e=Math.abs(u[1]-u[0])/l}YL(i,(function(t){var n=t.get("boxWidth");Y(n)||(n=[n,n]),s.push([Er(n[0],e)||0,Er(n[1],e)||0])}));var h=.8*e-2,c=h/r*.3,p=(h-c*(r-1))/r,d=p/2-h/2;YL(i,(function(t,e){a.push(d),d+=c+p,o.push(Math.min(Math.max(p,s[e][0]),s[e][1]))}))}(t),YL(e,(function(e,n){!function(t,e,n){var i=t.coordinateSystem,r=t.getData(),o=n/2,a="horizontal"===t.get("layout")?0:1,s=1-a,l=["x","y"],u=r.mapDimension(l[a]),h=r.mapDimensionsAll(l[s]);if(null==u||h.length<5)return;for(var c=0;c<r.count();c++){var p=r.get(u,c),d=x(p,h[2],c),f=x(p,h[0],c),g=x(p,h[1],c),y=x(p,h[3],c),v=x(p,h[4],c),m=[];_(m,g,!1),_(m,y,!0),m.push(f,g,v,y),b(m,f),b(m,v),b(m,d),r.setItemLayout(c,{initBaseline:d[s],ends:m})}function x(t,n,o){var l,u=r.get(n,o),h=[];return h[a]=t,h[s]=u,isNaN(t)||isNaN(u)?l=[NaN,NaN]:(l=i.dataToPoint(h))[a]+=e,l}function _(t,e,n){var i=e.slice(),r=e.slice();i[a]+=o,r[a]-=o,n?t.push(i,r):t.push(r,i)}function b(t,e){var n=e.slice(),i=e.slice();n[a]-=o,i[a]+=o,t.push(n,i)}}(e,t.boxOffsetList[n],t.boxWidthList[n])})))}))}var XL={type:"echarts:boxplot",transform:function(t){var e=t.upstream;if(e.sourceFormat!==Lp){var n="";0,ao(n)}var i=function(t,e){for(var n=[],i=[],r=(e=e||{}).boundIQR,o="none"===r||0===r,a=0;a<t.length;a++){var s=Vr(t[a].slice()),l=Jr(s,.25),u=Jr(s,.5),h=Jr(s,.75),c=s[0],p=s[s.length-1],d=(null==r?1.5:r)*(h-l),f=o?c:Math.max(c,l-d),g=o?p:Math.min(p,h+d),y=e.itemNameFormatter,v=U(y)?y({value:a}):X(y)?y.replace("{value}",a+""):a+"";n.push([v,f,l,u,h,g]);for(var m=0;m<s.length;m++){var x=s[m];if(x<f||x>g){var _=[v,x];i.push(_)}}}return{boxData:n,outliers:i}}(e.getRawData(),t.config);return[{dimensions:["ItemName","Low","Q1","Q2","Q3","High"],data:i.boxData},{data:i.outliers}]}};var ZL=["color","borderColor"],jL=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){this.group.removeClipPath(),this._progressiveEls=null,this._updateDrawMode(t),this._isLargeDraw?this._renderLarge(t):this._renderNormal(t)},e.prototype.incrementalPrepareRender=function(t,e,n){this._clear(),this._updateDrawMode(t)},e.prototype.incrementalRender=function(t,e,n,i){this._progressiveEls=[],this._isLargeDraw?this._incrementalRenderLarge(t,e):this._incrementalRenderNormal(t,e)},e.prototype.eachRendered=function(t){zh(this._progressiveEls||this.group,t)},e.prototype._updateDrawMode=function(t){var e=t.pipelineContext.large;null!=this._isLargeDraw&&e===this._isLargeDraw||(this._isLargeDraw=e,this._clear())},e.prototype._renderNormal=function(t){var e=t.getData(),n=this._data,i=this.group,r=e.getLayout("isSimpleBox"),o=t.get("clip",!0),a=t.coordinateSystem,s=a.getArea&&a.getArea();this._data||i.removeAll(),e.diff(n).add((function(n){if(e.hasValue(n)){var a=e.getItemLayout(n);if(o&&JL(s,a))return;var l=$L(a,n,!0);rh(l,{shape:{points:a.ends}},t,n),QL(l,e,n,r),i.add(l),e.setItemGraphicEl(n,l)}})).update((function(a,l){var u=n.getItemGraphicEl(l);if(e.hasValue(a)){var h=e.getItemLayout(a);o&&JL(s,h)?i.remove(u):(u?(ih(u,{shape:{points:h.ends}},t,a),uh(u)):u=$L(h),QL(u,e,a,r),i.add(u),e.setItemGraphicEl(a,u))}else i.remove(u)})).remove((function(t){var e=n.getItemGraphicEl(t);e&&i.remove(e)})).execute(),this._data=e},e.prototype._renderLarge=function(t){this._clear(),iP(t,this.group);var e=t.get("clip",!0)?aS(t.coordinateSystem,!1,t):null;e?this.group.setClipPath(e):this.group.removeClipPath()},e.prototype._incrementalRenderNormal=function(t,e){for(var n,i=e.getData(),r=i.getLayout("isSimpleBox");null!=(n=t.next());){var o=$L(i.getItemLayout(n));QL(o,i,n,r),o.incremental=!0,this.group.add(o),this._progressiveEls.push(o)}},e.prototype._incrementalRenderLarge=function(t,e){iP(e,this.group,this._progressiveEls,!0)},e.prototype.remove=function(t){this._clear()},e.prototype._clear=function(){this.group.removeAll(),this._data=null},e.type="candlestick",e}(mg),qL=function(){},KL=function(t){function e(e){var n=t.call(this,e)||this;return n.type="normalCandlestickBox",n}return n(e,t),e.prototype.getDefaultShape=function(){return new qL},e.prototype.buildPath=function(t,e){var n=e.points;this.__simpleBox?(t.moveTo(n[4][0],n[4][1]),t.lineTo(n[6][0],n[6][1])):(t.moveTo(n[0][0],n[0][1]),t.lineTo(n[1][0],n[1][1]),t.lineTo(n[2][0],n[2][1]),t.lineTo(n[3][0],n[3][1]),t.closePath(),t.moveTo(n[4][0],n[4][1]),t.lineTo(n[5][0],n[5][1]),t.moveTo(n[6][0],n[6][1]),t.lineTo(n[7][0],n[7][1]))},e}(fs);function $L(t,e,n){var i=t.ends;return new KL({shape:{points:n?tP(i,t):i},z2:100})}function JL(t,e){for(var n=!0,i=0;i<e.ends.length;i++)if(t.contain(e.ends[i][0],e.ends[i][1])){n=!1;break}return n}function QL(t,e,n,i){var r=e.getItemModel(n);t.useStyle(e.getItemVisual(n,"style")),t.style.strokeNoScale=!0,t.__simpleBox=i,zl(t,r)}function tP(t,e){return z(t,(function(t){return(t=t.slice())[1]=e.initBaseline,t}))}var eP=function(){},nP=function(t){function e(e){var n=t.call(this,e)||this;return n.type="largeCandlestickBox",n}return n(e,t),e.prototype.getDefaultShape=function(){return new eP},e.prototype.buildPath=function(t,e){for(var n=e.points,i=0;i<n.length;)if(this.__sign===n[i++]){var r=n[i++];t.moveTo(r,n[i++]),t.lineTo(r,n[i++])}else i+=3},e}(fs);function iP(t,e,n,i){var r=t.getData().getLayout("largePoints"),o=new nP({shape:{points:r},__sign:1});e.add(o);var a=new nP({shape:{points:r},__sign:-1});e.add(a),rP(1,o,t),rP(-1,a,t),i&&(o.incremental=!0,a.incremental=!0),n&&n.push(o,a)}function rP(t,e,n,i){var r=n.get(["itemStyle",t>0?"borderColor":"borderColor0"])||n.get(["itemStyle",t>0?"color":"color0"]),o=n.getModel("itemStyle").getItemStyle(ZL);e.useStyle(o),e.style.fill=null,e.style.stroke=r}var oP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.defaultValueDimensions=[{name:"open",defaultTooltip:!0},{name:"close",defaultTooltip:!0},{name:"lowest",defaultTooltip:!0},{name:"highest",defaultTooltip:!0}],n}return n(e,t),e.prototype.getShadowDim=function(){return"open"},e.prototype.brushSelector=function(t,e,n){var i=e.getItemLayout(t);return i&&n.rect(i.brushRect)},e.type="series.candlestick",e.dependencies=["xAxis","yAxis","grid"],e.defaultOption={z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,layout:null,clip:!0,itemStyle:{color:"#eb5454",color0:"#47b262",borderColor:"#eb5454",borderColor0:"#47b262",borderWidth:1},emphasis:{scale:!0,itemStyle:{borderWidth:2}},barMaxWidth:null,barMinWidth:null,barWidth:null,large:!0,largeThreshold:600,progressive:3e3,progressiveThreshold:1e4,progressiveChunkMode:"mod",animationEasing:"linear",animationDuration:300},e}(ag);function aP(t){t&&Y(t.series)&&E(t.series,(function(t){q(t)&&"k"===t.type&&(t.type="candlestick")}))}R(oP,NL,!0);var sP=["itemStyle","borderColor"],lP=["itemStyle","borderColor0"],uP=["itemStyle","color"],hP=["itemStyle","color0"],cP={seriesType:"candlestick",plan:gg(),performRawSeries:!0,reset:function(t,e){function n(t,e){return e.get(t>0?uP:hP)}function i(t,e){return e.get(t>0?sP:lP)}if(!e.isSeriesFiltered(t))return!t.pipelineContext.large&&{progress:function(t,e){for(var r;null!=(r=t.next());){var o=e.getItemModel(r),a=e.getItemLayout(r).sign,s=o.getItemStyle();s.fill=n(a,o),s.stroke=i(a,o)||s.fill,A(e.ensureUniqueItemVisual(r,"style"),s)}}}}},pP={seriesType:"candlestick",plan:gg(),reset:function(t){var e=t.coordinateSystem,n=t.getData(),i=function(t,e){var n,i=t.getBaseAxis(),r="category"===i.type?i.getBandWidth():(n=i.getExtent(),Math.abs(n[1]-n[0])/e.count()),o=Er(rt(t.get("barMaxWidth"),r),r),a=Er(rt(t.get("barMinWidth"),1),r),s=t.get("barWidth");return null!=s?Er(s,r):Math.max(Math.min(r/2,o),a)}(t,n),r=["x","y"],o=n.getDimensionIndex(n.mapDimension(r[0])),a=z(n.mapDimensionsAll(r[1]),n.getDimensionIndex,n),s=a[0],l=a[1],u=a[2],h=a[3];if(n.setLayout({candleWidth:i,isSimpleBox:i<=1.3}),!(o<0||a.length<4))return{progress:t.pipelineContext.large?function(t,n){var i,r,a=_x(4*t.count),c=0,p=[],d=[],f=n.getStore();for(;null!=(r=t.next());){var g=f.get(o,r),y=f.get(s,r),v=f.get(l,r),m=f.get(u,r),x=f.get(h,r);isNaN(g)||isNaN(m)||isNaN(x)?(a[c++]=NaN,c+=3):(a[c++]=dP(f,r,y,v,l),p[0]=g,p[1]=m,i=e.dataToPoint(p,null,d),a[c++]=i?i[0]:NaN,a[c++]=i?i[1]:NaN,p[1]=x,i=e.dataToPoint(p,null,d),a[c++]=i?i[1]:NaN)}n.setLayout("largePoints",a)}:function(t,n){var r,a=n.getStore();for(;null!=(r=t.next());){var c=a.get(o,r),p=a.get(s,r),d=a.get(l,r),f=a.get(u,r),g=a.get(h,r),y=Math.min(p,d),v=Math.max(p,d),m=S(y,c),x=S(v,c),_=S(f,c),b=S(g,c),w=[];M(w,x,0),M(w,m,1),w.push(T(b),T(x),T(_),T(m)),n.setItemLayout(r,{sign:dP(a,r,p,d,l),initBaseline:p>d?x[1]:m[1],ends:w,brushRect:I(f,g,c)})}function S(t,n){var i=[];return i[0]=n,i[1]=t,isNaN(n)||isNaN(t)?[NaN,NaN]:e.dataToPoint(i)}function M(t,e,n){var r=e.slice(),o=e.slice();r[0]=Sh(r[0]+i/2,1,!1),o[0]=Sh(o[0]-i/2,1,!0),n?t.push(r,o):t.push(o,r)}function I(t,e,n){var r=S(t,n),o=S(e,n);return r[0]-=i/2,o[0]-=i/2,{x:r[0],y:r[1],width:i,height:o[1]-r[1]}}function T(t){return t[0]=Sh(t[0],1),t}}}}};function dP(t,e,n,i,r){return n>i?-1:n<i?1:e>0?t.get(r,e-1)<=i?1:-1:1}function fP(t,e){var n=e.rippleEffectColor||e.color;t.eachChild((function(t){t.attr({z:e.z,zlevel:e.zlevel,style:{stroke:"stroke"===e.brushType?n:null,fill:"fill"===e.brushType?n:null}})}))}var gP=function(t){function e(e,n){var i=t.call(this)||this,r=new Ww(e,n),o=new Cr;return i.add(r),i.add(o),i.updateData(e,n),i}return n(e,t),e.prototype.stopEffectAnimation=function(){this.childAt(1).removeAll()},e.prototype.startEffectAnimation=function(t){for(var e=t.symbolType,n=t.color,i=t.rippleNumber,r=this.childAt(1),o=0;o<i;o++){var a=ky(e,-1,-1,2,2,n);a.attr({style:{strokeNoScale:!0},z2:99,silent:!0,scaleX:.5,scaleY:.5});var s=-o/i*t.period+t.effectOffset;a.animate("",!0).when(t.period,{scaleX:t.rippleScale/2,scaleY:t.rippleScale/2}).delay(s).start(),a.animateStyle(!0).when(t.period,{opacity:0}).delay(s).start(),r.add(a)}fP(r,t)},e.prototype.updateEffectAnimation=function(t){for(var e=this._effectCfg,n=this.childAt(1),i=["symbolType","period","rippleScale","rippleNumber"],r=0;r<i.length;r++){var o=i[r];if(e[o]!==t[o])return this.stopEffectAnimation(),void this.startEffectAnimation(t)}fP(n,t)},e.prototype.highlight=function(){xl(this)},e.prototype.downplay=function(){_l(this)},e.prototype.getSymbolType=function(){var t=this.childAt(0);return t&&t.getSymbolType()},e.prototype.updateData=function(t,e){var n=this,i=t.hostModel;this.childAt(0).updateData(t,e);var r=this.childAt(1),o=t.getItemModel(e),a=t.getItemVisual(e,"symbol"),s=Ly(t.getItemVisual(e,"symbolSize")),l=t.getItemVisual(e,"style"),u=l&&l.fill,h=o.getModel("emphasis");r.setScale(s),r.traverse((function(t){t.setStyle("fill",u)}));var c=Py(t.getItemVisual(e,"symbolOffset"),s);c&&(r.x=c[0],r.y=c[1]);var p=t.getItemVisual(e,"symbolRotate");r.rotation=(p||0)*Math.PI/180||0;var d={};d.showEffectOn=i.get("showEffectOn"),d.rippleScale=o.get(["rippleEffect","scale"]),d.brushType=o.get(["rippleEffect","brushType"]),d.period=1e3*o.get(["rippleEffect","period"]),d.effectOffset=e/t.count(),d.z=i.getShallow("z")||0,d.zlevel=i.getShallow("zlevel")||0,d.symbolType=a,d.color=u,d.rippleEffectColor=o.get(["rippleEffect","color"]),d.rippleNumber=o.get(["rippleEffect","number"]),"render"===d.showEffectOn?(this._effectCfg?this.updateEffectAnimation(d):this.startEffectAnimation(d),this._effectCfg=d):(this._effectCfg=null,this.stopEffectAnimation(),this.onHoverStateChange=function(t){"emphasis"===t?"render"!==d.showEffectOn&&n.startEffectAnimation(d):"normal"===t&&"render"!==d.showEffectOn&&n.stopEffectAnimation()}),this._effectCfg=d,Ol(this,h.get("focus"),h.get("blurScope"),h.get("disabled"))},e.prototype.fadeOut=function(t){t&&t()},e}(Cr),yP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(){this._symbolDraw=new Zw(gP)},e.prototype.render=function(t,e,n){var i=t.getData(),r=this._symbolDraw;r.updateData(i,{clipShape:this._getClipShape(t)}),this.group.add(r.group)},e.prototype._getClipShape=function(t){var e=t.coordinateSystem,n=e&&e.getArea&&e.getArea();return t.get("clip",!0)?n:null},e.prototype.updateTransform=function(t,e,n){var i=t.getData();this.group.dirty();var r=xS("").reset(t,e,n);r.progress&&r.progress({start:0,end:i.count(),count:i.count()},i),this._symbolDraw.updateLayout()},e.prototype._updateGroupTransform=function(t){var e=t.coordinateSystem;e&&e.getRoamTransform&&(this.group.transform=Fi(e.getRoamTransform()),this.group.decomposeTransform())},e.prototype.remove=function(t,e){this._symbolDraw&&this._symbolDraw.remove(!0)},e.type="effectScatter",e}(mg),vP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.hasSymbolVisual=!0,n}return n(e,t),e.prototype.getInitialData=function(t,e){return nx(null,this,{useEncodeDefaulter:!0})},e.prototype.brushSelector=function(t,e,n){return n.point(e.getItemLayout(t))},e.type="series.effectScatter",e.dependencies=["grid","polar"],e.defaultOption={coordinateSystem:"cartesian2d",z:2,legendHoverLink:!0,effectType:"ripple",progressive:0,showEffectOn:"render",clip:!0,rippleEffect:{period:4,scale:2.5,brushType:"fill",number:3},universalTransition:{divideShape:"clone"},symbolSize:10},e}(ag);var mP=function(t){function e(e,n,i){var r=t.call(this)||this;return r.add(r.createLine(e,n,i)),r._updateEffectSymbol(e,n),r}return n(e,t),e.prototype.createLine=function(t,e,n){return new pA(t,e,n)},e.prototype._updateEffectSymbol=function(t,e){var n=t.getItemModel(e).getModel("effect"),i=n.get("symbolSize"),r=n.get("symbol");Y(i)||(i=[i,i]);var o=t.getItemVisual(e,"style"),a=n.get("color")||o&&o.stroke,s=this.childAt(1);this._symbolType!==r&&(this.remove(s),(s=ky(r,-.5,-.5,1,1,a)).z2=100,s.culling=!0,this.add(s)),s&&(s.setStyle("shadowColor",a),s.setStyle(n.getItemStyle(["color"])),s.scaleX=i[0],s.scaleY=i[1],s.setColor(a),this._symbolType=r,this._symbolScale=i,this._updateEffectAnimation(t,n,e))},e.prototype._updateEffectAnimation=function(t,e,n){var i=this.childAt(1);if(i){var r=this,o=t.getItemLayout(n),a=1e3*e.get("period"),s=e.get("loop"),l=e.get("constantSpeed"),u=it(e.get("delay"),(function(e){return e/t.count()*a/3}));if(i.ignore=!0,this._updateAnimationPoints(i,o),l>0&&(a=this._getLineLength(i)/l*1e3),(a!==this._period||s!==this._loop)&&(i.stopAnimation(),a>0)){var h=void 0;h=U(u)?u(n):u,i.__t>0&&(h=-a*i.__t),i.__t=0;var c=i.animate("",s).when(a,{__t:1}).delay(h).during((function(){r._updateSymbolPosition(i)}));s||c.done((function(){r.remove(i)})),c.start()}this._period=a,this._loop=s}},e.prototype._getLineLength=function(t){return Et(t.__p1,t.__cp1)+Et(t.__cp1,t.__p2)},e.prototype._updateAnimationPoints=function(t,e){t.__p1=e[0],t.__p2=e[1],t.__cp1=e[2]||[(e[0][0]+e[1][0])/2,(e[0][1]+e[1][1])/2]},e.prototype.updateData=function(t,e,n){this.childAt(0).updateData(t,e,n),this._updateEffectSymbol(t,e)},e.prototype._updateSymbolPosition=function(t){var e=t.__p1,n=t.__p2,i=t.__cp1,r=t.__t,o=[t.x,t.y],a=o.slice(),s=Ke,l=$e;o[0]=s(e[0],i[0],n[0],r),o[1]=s(e[1],i[1],n[1],r);var u=l(e[0],i[0],n[0],r),h=l(e[1],i[1],n[1],r);t.rotation=-Math.atan2(h,u)-Math.PI/2,"line"!==this._symbolType&&"rect"!==this._symbolType&&"roundRect"!==this._symbolType||(void 0!==t.__lastT&&t.__lastT<t.__t?(t.scaleY=1.05*Et(a,o),1===r&&(o[0]=a[0]+(o[0]-a[0])/2,o[1]=a[1]+(o[1]-a[1])/2)):1===t.__lastT?t.scaleY=2*Et(e,o):t.scaleY=this._symbolScale[1]),t.__lastT=t.__t,t.ignore=!1,t.x=o[0],t.y=o[1]},e.prototype.updateLayout=function(t,e){this.childAt(0).updateLayout(t,e);var n=t.getItemModel(e).getModel("effect");this._updateEffectAnimation(t,n,e)},e}(Cr),xP=function(t){function e(e,n,i){var r=t.call(this)||this;return r._createPolyline(e,n,i),r}return n(e,t),e.prototype._createPolyline=function(t,e,n){var i=t.getItemLayout(e),r=new Ou({shape:{points:i}});this.add(r),this._updateCommonStl(t,e,n)},e.prototype.updateData=function(t,e,n){var i=t.hostModel;ih(this.childAt(0),{shape:{points:t.getItemLayout(e)}},i,e),this._updateCommonStl(t,e,n)},e.prototype._updateCommonStl=function(t,e,n){var i=this.childAt(0),r=t.getItemModel(e),o=n&&n.emphasisLineStyle,a=n&&n.focus,s=n&&n.blurScope,l=n&&n.emphasisDisabled;if(!n||t.hasItemOption){var u=r.getModel("emphasis");o=u.getModel("lineStyle").getLineStyle(),l=u.get("disabled"),a=u.get("focus"),s=u.get("blurScope")}i.useStyle(t.getItemVisual(e,"style")),i.style.fill=null,i.style.strokeNoScale=!0,i.ensureState("emphasis").style=o,Ol(this,a,s,l)},e.prototype.updateLayout=function(t,e){this.childAt(0).setShape("points",t.getItemLayout(e))},e}(Cr),_P=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e._lastFrame=0,e._lastFramePercent=0,e}return n(e,t),e.prototype.createLine=function(t,e,n){return new xP(t,e,n)},e.prototype._updateAnimationPoints=function(t,e){this._points=e;for(var n=[0],i=0,r=1;r<e.length;r++){var o=e[r-1],a=e[r];i+=Et(o,a),n.push(i)}if(0!==i){for(r=0;r<n.length;r++)n[r]/=i;this._offsets=n,this._length=i}else this._length=0},e.prototype._getLineLength=function(){return this._length},e.prototype._updateSymbolPosition=function(t){var e=t.__t,n=this._points,i=this._offsets,r=n.length;if(i){var o,a=this._lastFrame;if(e<this._lastFramePercent){for(o=Math.min(a+1,r-1);o>=0&&!(i[o]<=e);o--);o=Math.min(o,r-2)}else{for(o=a;o<r&&!(i[o]>e);o++);o=Math.min(o-1,r-2)}var s=(e-i[o])/(i[o+1]-i[o]),l=n[o],u=n[o+1];t.x=l[0]*(1-s)+s*u[0],t.y=l[1]*(1-s)+s*u[1];var h=u[0]-l[0],c=u[1]-l[1];t.rotation=-Math.atan2(c,h)-Math.PI/2,this._lastFrame=o,this._lastFramePercent=e,t.ignore=!1}},e}(mP),bP=function(){this.polyline=!1,this.curveness=0,this.segs=[]},wP=function(t){function e(e){var n=t.call(this,e)||this;return n._off=0,n.hoverDataIdx=-1,n}return n(e,t),e.prototype.reset=function(){this.notClear=!1,this._off=0},e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new bP},e.prototype.buildPath=function(t,e){var n,i=e.segs,r=e.curveness;if(e.polyline)for(n=this._off;n<i.length;){var o=i[n++];if(o>0){t.moveTo(i[n++],i[n++]);for(var a=1;a<o;a++)t.lineTo(i[n++],i[n++])}}else for(n=this._off;n<i.length;){var s=i[n++],l=i[n++],u=i[n++],h=i[n++];if(t.moveTo(s,l),r>0){var c=(s+u)/2-(l-h)*r,p=(l+h)/2-(u-s)*r;t.quadraticCurveTo(c,p,u,h)}else t.lineTo(u,h)}this.incremental&&(this._off=n,this.notClear=!0)},e.prototype.findDataIndex=function(t,e){var n=this.shape,i=n.segs,r=n.curveness,o=this.style.lineWidth;if(n.polyline)for(var a=0,s=0;s<i.length;){var l=i[s++];if(l>0)for(var u=i[s++],h=i[s++],c=1;c<l;c++){if(qa(u,h,p=i[s++],d=i[s++],o,t,e))return a}a++}else for(a=0,s=0;s<i.length;){u=i[s++],h=i[s++];var p=i[s++],d=i[s++];if(r>0){if($a(u,h,(u+p)/2-(h-d)*r,(h+d)/2-(p-u)*r,p,d,o,t,e))return a}else if(qa(u,h,p,d,o,t,e))return a;a++}return-1},e.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect();return t=n[0],e=n[1],i.contain(t,e)?(this.hoverDataIdx=this.findDataIndex(t,e))>=0:(this.hoverDataIdx=-1,!1)},e.prototype.getBoundingRect=function(){var t=this._rect;if(!t){for(var e=this.shape.segs,n=1/0,i=1/0,r=-1/0,o=-1/0,a=0;a<e.length;){var s=e[a++],l=e[a++];n=Math.min(s,n),r=Math.max(s,r),i=Math.min(l,i),o=Math.max(l,o)}t=this._rect=new sr(n,i,r,o)}return t},e}(fs),SP=function(){function t(){this.group=new Cr}return t.prototype.updateData=function(t){this._clear();var e=this._create();e.setShape({segs:t.getLayout("linesPoints")}),this._setCommon(e,t)},t.prototype.incrementalPrepareUpdate=function(t){this.group.removeAll(),this._clear()},t.prototype.incrementalUpdate=function(t,e){var n=this._newAdded[0],i=e.getLayout("linesPoints"),r=n&&n.shape.segs;if(r&&r.length<2e4){var o=r.length,a=new Float32Array(o+i.length);a.set(r),a.set(i,o),n.setShape({segs:a})}else{this._newAdded=[];var s=this._create();s.incremental=!0,s.setShape({segs:i}),this._setCommon(s,e),s.__startIndex=t.start}},t.prototype.remove=function(){this._clear()},t.prototype.eachRendered=function(t){this._newAdded[0]&&t(this._newAdded[0])},t.prototype._create=function(){var t=new wP({cursor:"default"});return this._newAdded.push(t),this.group.add(t),t},t.prototype._setCommon=function(t,e,n){var i=e.hostModel;t.setShape({polyline:i.get("polyline"),curveness:i.get(["lineStyle","curveness"])}),t.useStyle(i.getModel("lineStyle").getLineStyle()),t.style.strokeNoScale=!0;var r=e.getVisual("style");r&&r.stroke&&t.setStyle("stroke",r.stroke),t.setStyle("fill",null);var o=Ws(t);o.seriesIndex=i.seriesIndex,t.on("mousemove",(function(e){o.dataIndex=null;var n=t.hoverDataIdx;n>0&&(o.dataIndex=n+t.__startIndex)}))},t.prototype._clear=function(){this._newAdded=[],this.group.removeAll()},t}(),MP={seriesType:"lines",plan:gg(),reset:function(t){var e=t.coordinateSystem;if(e){var n=t.get("polyline"),i=t.pipelineContext.large;return{progress:function(r,o){var a=[];if(i){var s=void 0,l=r.end-r.start;if(n){for(var u=0,h=r.start;h<r.end;h++)u+=t.getLineCoordsCount(h);s=new Float32Array(l+2*u)}else s=new Float32Array(4*l);var c=0,p=[];for(h=r.start;h<r.end;h++){var d=t.getLineCoords(h,a);n&&(s[c++]=d);for(var f=0;f<d;f++)p=e.dataToPoint(a[f],!1,p),s[c++]=p[0],s[c++]=p[1]}o.setLayout("linesPoints",s)}else for(h=r.start;h<r.end;h++){var g=o.getItemModel(h),y=(d=t.getLineCoords(h,a),[]);if(n)for(var v=0;v<d;v++)y.push(e.dataToPoint(a[v]));else{y[0]=e.dataToPoint(a[0]),y[1]=e.dataToPoint(a[1]);var m=g.get(["lineStyle","curveness"]);+m&&(y[2]=[(y[0][0]+y[1][0])/2-(y[0][1]-y[1][1])*m,(y[0][1]+y[1][1])/2-(y[1][0]-y[0][0])*m])}o.setItemLayout(h,y)}}}}}},IP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=t.getData(),r=this._updateLineDraw(i,t),o=t.get("zlevel"),a=t.get(["effect","trailLength"]),s=n.getZr(),l="svg"===s.painter.getType();l||s.painter.getLayer(o).clear(!0),null==this._lastZlevel||l||s.configLayer(this._lastZlevel,{motionBlur:!1}),this._showEffect(t)&&a>0&&(l||s.configLayer(o,{motionBlur:!0,lastFrameAlpha:Math.max(Math.min(a/10+.9,1),0)})),r.updateData(i);var u=t.get("clip",!0)&&aS(t.coordinateSystem,!1,t);u?this.group.setClipPath(u):this.group.removeClipPath(),this._lastZlevel=o,this._finished=!0},e.prototype.incrementalPrepareRender=function(t,e,n){var i=t.getData();this._updateLineDraw(i,t).incrementalPrepareUpdate(i),this._clearLayer(n),this._finished=!1},e.prototype.incrementalRender=function(t,e,n){this._lineDraw.incrementalUpdate(t,e.getData()),this._finished=t.end===e.getData().count()},e.prototype.eachRendered=function(t){this._lineDraw&&this._lineDraw.eachRendered(t)},e.prototype.updateTransform=function(t,e,n){var i=t.getData(),r=t.pipelineContext;if(!this._finished||r.large||r.progressiveRender)return{update:!0};var o=MP.reset(t,e,n);o.progress&&o.progress({start:0,end:i.count(),count:i.count()},i),this._lineDraw.updateLayout(),this._clearLayer(n)},e.prototype._updateLineDraw=function(t,e){var n=this._lineDraw,i=this._showEffect(e),r=!!e.get("polyline"),o=e.pipelineContext.large;return n&&i===this._hasEffet&&r===this._isPolyline&&o===this._isLargeDraw||(n&&n.remove(),n=this._lineDraw=o?new SP:new dA(r?i?_P:xP:i?mP:pA),this._hasEffet=i,this._isPolyline=r,this._isLargeDraw=o),this.group.add(n.group),n},e.prototype._showEffect=function(t){return!!t.get(["effect","show"])},e.prototype._clearLayer=function(t){var e=t.getZr();"svg"===e.painter.getType()||null==this._lastZlevel||e.painter.getLayer(this._lastZlevel).clear(!0)},e.prototype.remove=function(t,e){this._lineDraw&&this._lineDraw.remove(),this._lineDraw=null,this._clearLayer(e)},e.prototype.dispose=function(t,e){this.remove(t,e)},e.type="lines",e}(mg),TP="undefined"==typeof Uint32Array?Array:Uint32Array,CP="undefined"==typeof Float64Array?Array:Float64Array;function DP(t){var e=t.data;e&&e[0]&&e[0][0]&&e[0][0].coord&&(t.data=z(e,(function(t){var e={coords:[t[0].coord,t[1].coord]};return t[0].name&&(e.fromName=t[0].name),t[1].name&&(e.toName=t[1].name),D([e,t[0],t[1]])})))}var AP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.visualStyleAccessPath="lineStyle",n.visualDrawType="stroke",n}return n(e,t),e.prototype.init=function(e){e.data=e.data||[],DP(e);var n=this._processFlatCoordsArray(e.data);this._flatCoords=n.flatCoords,this._flatCoordsOffset=n.flatCoordsOffset,n.flatCoords&&(e.data=new Float32Array(n.count)),t.prototype.init.apply(this,arguments)},e.prototype.mergeOption=function(e){if(DP(e),e.data){var n=this._processFlatCoordsArray(e.data);this._flatCoords=n.flatCoords,this._flatCoordsOffset=n.flatCoordsOffset,n.flatCoords&&(e.data=new Float32Array(n.count))}t.prototype.mergeOption.apply(this,arguments)},e.prototype.appendData=function(t){var e=this._processFlatCoordsArray(t.data);e.flatCoords&&(this._flatCoords?(this._flatCoords=gt(this._flatCoords,e.flatCoords),this._flatCoordsOffset=gt(this._flatCoordsOffset,e.flatCoordsOffset)):(this._flatCoords=e.flatCoords,this._flatCoordsOffset=e.flatCoordsOffset),t.data=new Float32Array(e.count)),this.getRawData().appendData(t.data)},e.prototype._getCoordsFromItemModel=function(t){var e=this.getData().getItemModel(t),n=e.option instanceof Array?e.option:e.getShallow("coords");return n},e.prototype.getLineCoordsCount=function(t){return this._flatCoordsOffset?this._flatCoordsOffset[2*t+1]:this._getCoordsFromItemModel(t).length},e.prototype.getLineCoords=function(t,e){if(this._flatCoordsOffset){for(var n=this._flatCoordsOffset[2*t],i=this._flatCoordsOffset[2*t+1],r=0;r<i;r++)e[r]=e[r]||[],e[r][0]=this._flatCoords[n+2*r],e[r][1]=this._flatCoords[n+2*r+1];return i}var o=this._getCoordsFromItemModel(t);for(r=0;r<o.length;r++)e[r]=e[r]||[],e[r][0]=o[r][0],e[r][1]=o[r][1];return o.length},e.prototype._processFlatCoordsArray=function(t){var e=0;if(this._flatCoords&&(e=this._flatCoords.length),j(t[0])){for(var n=t.length,i=new TP(n),r=new CP(n),o=0,a=0,s=0,l=0;l<n;){s++;var u=t[l++];i[a++]=o+e,i[a++]=u;for(var h=0;h<u;h++){var c=t[l++],p=t[l++];r[o++]=c,r[o++]=p}}return{flatCoordsOffset:new Uint32Array(i.buffer,0,a),flatCoords:r,count:s}}return{flatCoordsOffset:null,flatCoords:null,count:t.length}},e.prototype.getInitialData=function(t,e){var n=new Zm(["value"],this);return n.hasItemOption=!1,n.initData(t.data,[],(function(t,e,i,r){if(t instanceof Array)return NaN;n.hasItemOption=!0;var o=t.value;return null!=o?o instanceof Array?o[r]:o:void 0})),n},e.prototype.formatTooltip=function(t,e,n){var i=this.getData().getItemModel(t),r=i.get("name");if(r)return r;var o=i.get("fromName"),a=i.get("toName"),s=[];return null!=o&&s.push(o),null!=a&&s.push(a),Uf("nameValue",{name:s.join(" > ")})},e.prototype.preventIncremental=function(){return!!this.get(["effect","show"])},e.prototype.getProgressive=function(){var t=this.option.progressive;return null==t?this.option.large?1e4:this.get("progressive"):t},e.prototype.getProgressiveThreshold=function(){var t=this.option.progressiveThreshold;return null==t?this.option.large?2e4:this.get("progressiveThreshold"):t},e.prototype.getZLevelKey=function(){var t=this.getModel("effect"),e=t.get("trailLength");return this.getData().count()>this.getProgressiveThreshold()?this.id:t.get("show")&&e>0?e+"":""},e.type="series.lines",e.dependencies=["grid","polar","geo","calendar"],e.defaultOption={coordinateSystem:"geo",z:2,legendHoverLink:!0,xAxisIndex:0,yAxisIndex:0,symbol:["none","none"],symbolSize:[10,10],geoIndex:0,effect:{show:!1,period:4,constantSpeed:0,symbol:"circle",symbolSize:3,loop:!0,trailLength:.2},large:!1,largeThreshold:2e3,polyline:!1,clip:!0,label:{show:!1,position:"end"},lineStyle:{opacity:.5}},e}(ag);function kP(t){return t instanceof Array||(t=[t,t]),t}var LP={seriesType:"lines",reset:function(t){var e=kP(t.get("symbol")),n=kP(t.get("symbolSize")),i=t.getData();return i.setVisual("fromSymbol",e&&e[0]),i.setVisual("toSymbol",e&&e[1]),i.setVisual("fromSymbolSize",n&&n[0]),i.setVisual("toSymbolSize",n&&n[1]),{dataEach:i.hasItemOption?function(t,e){var n=t.getItemModel(e),i=kP(n.getShallow("symbol",!0)),r=kP(n.getShallow("symbolSize",!0));i[0]&&t.setItemVisual(e,"fromSymbol",i[0]),i[1]&&t.setItemVisual(e,"toSymbol",i[1]),r[0]&&t.setItemVisual(e,"fromSymbolSize",r[0]),r[1]&&t.setItemVisual(e,"toSymbolSize",r[1])}:null}}};var PP=function(){function t(){this.blurSize=30,this.pointSize=20,this.maxOpacity=1,this.minOpacity=0,this._gradientPixels={inRange:null,outOfRange:null};var t=h.createCanvas();this.canvas=t}return t.prototype.update=function(t,e,n,i,r,o){var a=this._getBrush(),s=this._getGradient(r,"inRange"),l=this._getGradient(r,"outOfRange"),u=this.pointSize+this.blurSize,h=this.canvas,c=h.getContext("2d"),p=t.length;h.width=e,h.height=n;for(var d=0;d<p;++d){var f=t[d],g=f[0],y=f[1],v=i(f[2]);c.globalAlpha=v,c.drawImage(a,g-u,y-u)}if(!h.width||!h.height)return h;for(var m=c.getImageData(0,0,h.width,h.height),x=m.data,_=0,b=x.length,w=this.minOpacity,S=this.maxOpacity-w;_<b;){v=x[_+3]/256;var M=4*Math.floor(255*v);if(v>0){var I=o(v)?s:l;v>0&&(v=v*S+w),x[_++]=I[M],x[_++]=I[M+1],x[_++]=I[M+2],x[_++]=I[M+3]*v*256}else _+=4}return c.putImageData(m,0,0),h},t.prototype._getBrush=function(){var t=this._brushCanvas||(this._brushCanvas=h.createCanvas()),e=this.pointSize+this.blurSize,n=2*e;t.width=n,t.height=n;var i=t.getContext("2d");return i.clearRect(0,0,n,n),i.shadowOffsetX=n,i.shadowBlur=this.blurSize,i.shadowColor="#000",i.beginPath(),i.arc(-e,e,this.pointSize,0,2*Math.PI,!0),i.closePath(),i.fill(),t},t.prototype._getGradient=function(t,e){for(var n=this._gradientPixels,i=n[e]||(n[e]=new Uint8ClampedArray(1024)),r=[0,0,0,0],o=0,a=0;a<256;a++)t[e](a/255,!0,r),i[o++]=r[0],i[o++]=r[1],i[o++]=r[2],i[o++]=r[3];return i},t}();function OP(t){var e=t.dimensions;return"lng"===e[0]&&"lat"===e[1]}var RP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i;e.eachComponent("visualMap",(function(e){e.eachTargetSeries((function(n){n===t&&(i=e)}))})),this._progressiveEls=null,this.group.removeAll();var r=t.coordinateSystem;"cartesian2d"===r.type||"calendar"===r.type?this._renderOnCartesianAndCalendar(t,n,0,t.getData().count()):OP(r)&&this._renderOnGeo(r,t,i,n)},e.prototype.incrementalPrepareRender=function(t,e,n){this.group.removeAll()},e.prototype.incrementalRender=function(t,e,n,i){var r=e.coordinateSystem;r&&(OP(r)?this.render(e,n,i):(this._progressiveEls=[],this._renderOnCartesianAndCalendar(e,i,t.start,t.end,!0)))},e.prototype.eachRendered=function(t){zh(this._progressiveEls||this.group,t)},e.prototype._renderOnCartesianAndCalendar=function(t,e,n,i,r){var o,a,s,l,u=t.coordinateSystem;if(sS(u,"cartesian2d")){var h=u.getAxis("x"),c=u.getAxis("y");0,o=h.getBandWidth(),a=c.getBandWidth(),s=h.scale.getExtent(),l=c.scale.getExtent()}for(var p=this.group,d=t.getData(),f=t.getModel(["emphasis","itemStyle"]).getItemStyle(),g=t.getModel(["blur","itemStyle"]).getItemStyle(),y=t.getModel(["select","itemStyle"]).getItemStyle(),v=Hh(t),m=t.getModel("emphasis"),x=m.get("focus"),_=m.get("blurScope"),b=m.get("disabled"),w=sS(u,"cartesian2d")?[d.mapDimension("x"),d.mapDimension("y"),d.mapDimension("value")]:[d.mapDimension("time"),d.mapDimension("value")],S=n;S<i;S++){var M=void 0,I=d.getItemVisual(S,"style");if(sS(u,"cartesian2d")){var T=d.get(w[0],S),C=d.get(w[1],S);if(isNaN(d.get(w[2],S))||T<s[0]||T>s[1]||C<l[0]||C>l[1])continue;var D=u.dataToPoint([T,C]);M=new Ts({shape:{x:Math.floor(Math.round(D[0])-o/2),y:Math.floor(Math.round(D[1])-a/2),width:Math.ceil(o),height:Math.ceil(a)},style:I})}else{if(isNaN(d.get(w[1],S)))continue;M=new Ts({z2:1,shape:u.dataToRect([d.get(w[0],S)]).contentShape,style:I})}var A=d.getItemModel(S);if(d.hasItemOption){var k=A.getModel("emphasis");f=k.getModel("itemStyle").getItemStyle(),g=A.getModel(["blur","itemStyle"]).getItemStyle(),y=A.getModel(["select","itemStyle"]).getItemStyle(),x=k.get("focus"),_=k.get("blurScope"),b=k.get("disabled"),v=Hh(A)}var L=t.getRawValue(S),P="-";L&&null!=L[2]&&(P=L[2]+""),Wh(M,v,{labelFetcher:t,labelDataIndex:S,defaultOpacity:I.opacity,defaultText:P}),M.ensureState("emphasis").style=f,M.ensureState("blur").style=g,M.ensureState("select").style=y,Ol(M,x,_,b),M.incremental=r,r&&(M.states.emphasis.hoverLayer=!0),p.add(M),d.setItemGraphicEl(S,M),this._progressiveEls&&this._progressiveEls.push(M)}},e.prototype._renderOnGeo=function(t,e,n,i){var r=n.targetVisuals.inRange,o=n.targetVisuals.outOfRange,a=e.getData(),s=this._hmLayer||this._hmLayer||new PP;s.blurSize=e.get("blurSize"),s.pointSize=e.get("pointSize"),s.minOpacity=e.get("minOpacity"),s.maxOpacity=e.get("maxOpacity");var l=t.getViewRect().clone(),u=t.getRoamTransform();l.applyTransform(u);var h=Math.max(l.x,0),c=Math.max(l.y,0),p=Math.min(l.width+l.x,i.getWidth()),d=Math.min(l.height+l.y,i.getHeight()),f=p-h,g=d-c,y=[a.mapDimension("lng"),a.mapDimension("lat"),a.mapDimension("value")],v=a.mapArray(y,(function(e,n,i){var r=t.dataToPoint([e,n]);return r[0]-=h,r[1]-=c,r.push(i),r})),m=n.getExtent(),x="visualMap.continuous"===n.type?function(t,e){var n=t[1]-t[0];return e=[(e[0]-t[0])/n,(e[1]-t[0])/n],function(t){return t>=e[0]&&t<=e[1]}}(m,n.option.range):function(t,e,n){var i=t[1]-t[0],r=(e=z(e,(function(e){return{interval:[(e.interval[0]-t[0])/i,(e.interval[1]-t[0])/i]}}))).length,o=0;return function(t){var i;for(i=o;i<r;i++)if((a=e[i].interval)[0]<=t&&t<=a[1]){o=i;break}if(i===r)for(i=o-1;i>=0;i--){var a;if((a=e[i].interval)[0]<=t&&t<=a[1]){o=i;break}}return i>=0&&i<r&&n[i]}}(m,n.getPieceList(),n.option.selected);s.update(v,f,g,r.color.getNormalizer(),{inRange:r.color.getColorMapper(),outOfRange:o.color.getColorMapper()},x);var _=new xs({style:{width:f,height:g,x:h,y:c,image:s.canvas},silent:!0});this.group.add(_)},e.type="heatmap",e}(mg),NP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.getInitialData=function(t,e){return nx(null,this,{generateCoord:"value"})},e.prototype.preventIncremental=function(){var t=ud.get(this.get("coordinateSystem"));if(t&&t.dimensions)return"lng"===t.dimensions[0]&&"lat"===t.dimensions[1]},e.type="series.heatmap",e.dependencies=["grid","geo","calendar"],e.defaultOption={coordinateSystem:"cartesian2d",z:2,geoIndex:0,blurSize:30,pointSize:20,maxOpacity:1,minOpacity:0,select:{itemStyle:{borderColor:"#212121"}}},e}(ag);var EP=["itemStyle","borderWidth"],zP=[{xy:"x",wh:"width",index:0,posDesc:["left","right"]},{xy:"y",wh:"height",index:1,posDesc:["top","bottom"]}],VP=new uu,BP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=this.group,r=t.getData(),o=this._data,a=t.coordinateSystem,s=a.getBaseAxis().isHorizontal(),l=a.master.getRect(),u={ecSize:{width:n.getWidth(),height:n.getHeight()},seriesModel:t,coordSys:a,coordSysExtent:[[l.x,l.x+l.width],[l.y,l.y+l.height]],isHorizontal:s,valueDim:zP[+s],categoryDim:zP[1-+s]};return r.diff(o).add((function(t){if(r.hasValue(t)){var e=ZP(r,t),n=FP(r,t,e,u),o=KP(r,u,n);r.setItemGraphicEl(t,o),i.add(o),eO(o,u,n)}})).update((function(t,e){var n=o.getItemGraphicEl(e);if(r.hasValue(t)){var a=ZP(r,t),s=FP(r,t,a,u),l=JP(r,s);n&&l!==n.__pictorialShapeStr&&(i.remove(n),r.setItemGraphicEl(t,null),n=null),n?function(t,e,n){var i=n.animationModel,r=n.dataIndex;ih(t.__pictorialBundle,{x:n.bundlePosition[0],y:n.bundlePosition[1]},i,r),n.symbolRepeat?HP(t,e,n,!0):YP(t,e,n,!0);UP(t,n,!0),XP(t,e,n,!0)}(n,u,s):n=KP(r,u,s,!0),r.setItemGraphicEl(t,n),n.__pictorialSymbolMeta=s,i.add(n),eO(n,u,s)}else i.remove(n)})).remove((function(t){var e=o.getItemGraphicEl(t);e&&$P(o,t,e.__pictorialSymbolMeta.animationModel,e)})).execute(),this._data=r,this.group},e.prototype.remove=function(t,e){var n=this.group,i=this._data;t.get("animation")?i&&i.eachItemGraphicEl((function(e){$P(i,Ws(e).dataIndex,t,e)})):n.removeAll()},e.type="pictorialBar",e}(mg);function FP(t,e,n,i){var r=t.getItemLayout(e),o=n.get("symbolRepeat"),a=n.get("symbolClip"),s=n.get("symbolPosition")||"start",l=(n.get("symbolRotate")||0)*Math.PI/180||0,u=n.get("symbolPatternSize")||2,h=n.isAnimationEnabled(),c={dataIndex:e,layout:r,itemModel:n,symbolType:t.getItemVisual(e,"symbol")||"circle",style:t.getItemVisual(e,"style"),symbolClip:a,symbolRepeat:o,symbolRepeatDirection:n.get("symbolRepeatDirection"),symbolPatternSize:u,rotation:l,animationModel:h?n:null,hoverScale:h&&n.get(["emphasis","scale"]),z2:n.getShallow("z",!0)||0};!function(t,e,n,i,r){var o,a=i.valueDim,s=t.get("symbolBoundingData"),l=i.coordSys.getOtherAxis(i.coordSys.getBaseAxis()),u=l.toGlobalCoord(l.dataToCoord(0)),h=1-+(n[a.wh]<=0);if(Y(s)){var c=[GP(l,s[0])-u,GP(l,s[1])-u];c[1]<c[0]&&c.reverse(),o=c[h]}else o=null!=s?GP(l,s)-u:e?i.coordSysExtent[a.index][h]-u:n[a.wh];r.boundingLength=o,e&&(r.repeatCutLength=n[a.wh]);r.pxSign=o>0?1:-1}(n,o,r,i,c),function(t,e,n,i,r,o,a,s,l,u){var h,c=l.valueDim,p=l.categoryDim,d=Math.abs(n[p.wh]),f=t.getItemVisual(e,"symbolSize");h=Y(f)?f.slice():null==f?["100%","100%"]:[f,f];h[p.index]=Er(h[p.index],d),h[c.index]=Er(h[c.index],i?d:Math.abs(o)),u.symbolSize=h,(u.symbolScale=[h[0]/s,h[1]/s])[c.index]*=(l.isHorizontal?-1:1)*a}(t,e,r,o,0,c.boundingLength,c.pxSign,u,i,c),function(t,e,n,i,r){var o=t.get(EP)||0;o&&(VP.attr({scaleX:e[0],scaleY:e[1],rotation:n}),VP.updateTransform(),o/=VP.getLineScale(),o*=e[i.valueDim.index]);r.valueLineWidth=o}(n,c.symbolScale,l,i,c);var p=c.symbolSize,d=Py(n.get("symbolOffset"),p);return function(t,e,n,i,r,o,a,s,l,u,h,c){var p=h.categoryDim,d=h.valueDim,f=c.pxSign,g=Math.max(e[d.index]+s,0),y=g;if(i){var v=Math.abs(l),m=it(t.get("symbolMargin"),"15%")+"",x=!1;m.lastIndexOf("!")===m.length-1&&(x=!0,m=m.slice(0,m.length-1));var _=Er(m,e[d.index]),b=Math.max(g+2*_,0),w=x?0:2*_,S=eo(i),M=S?i:nO((v+w)/b);b=g+2*(_=(v-M*g)/2/(x?M:Math.max(M-1,1))),w=x?0:2*_,S||"fixed"===i||(M=u?nO((Math.abs(u)+w)/b):0),y=M*b-w,c.repeatTimes=M,c.symbolMargin=_}var I=f*(y/2),T=c.pathPosition=[];T[p.index]=n[p.wh]/2,T[d.index]="start"===a?I:"end"===a?l-I:l/2,o&&(T[0]+=o[0],T[1]+=o[1]);var C=c.bundlePosition=[];C[p.index]=n[p.xy],C[d.index]=n[d.xy];var D=c.barRectShape=A({},n);D[d.wh]=f*Math.max(Math.abs(n[d.wh]),Math.abs(T[d.index]+I)),D[p.wh]=n[p.wh];var k=c.clipShape={};k[p.xy]=-n[p.xy],k[p.wh]=h.ecSize[p.wh],k[d.xy]=0,k[d.wh]=n[d.wh]}(n,p,r,o,0,d,s,c.valueLineWidth,c.boundingLength,c.repeatCutLength,i,c),c}function GP(t,e){return t.toGlobalCoord(t.dataToCoord(t.scale.parse(e)))}function WP(t){var e=t.symbolPatternSize,n=ky(t.symbolType,-e/2,-e/2,e,e);return n.attr({culling:!0}),"image"!==n.type&&n.setStyle({strokeNoScale:!0}),n}function HP(t,e,n,i){var r=t.__pictorialBundle,o=n.symbolSize,a=n.valueLineWidth,s=n.pathPosition,l=e.valueDim,u=n.repeatTimes||0,h=0,c=o[e.valueDim.index]+a+2*n.symbolMargin;for(QP(t,(function(t){t.__pictorialAnimationIndex=h,t.__pictorialRepeatTimes=u,h<u?tO(t,null,f(h),n,i):tO(t,null,{scaleX:0,scaleY:0},n,i,(function(){r.remove(t)})),h++}));h<u;h++){var p=WP(n);p.__pictorialAnimationIndex=h,p.__pictorialRepeatTimes=u,r.add(p);var d=f(h);tO(p,{x:d.x,y:d.y,scaleX:0,scaleY:0},{scaleX:d.scaleX,scaleY:d.scaleY,rotation:d.rotation},n,i)}function f(t){var e=s.slice(),i=n.pxSign,r=t;return("start"===n.symbolRepeatDirection?i>0:i<0)&&(r=u-1-t),e[l.index]=c*(r-u/2+.5)+s[l.index],{x:e[0],y:e[1],scaleX:n.symbolScale[0],scaleY:n.symbolScale[1],rotation:n.rotation}}}function YP(t,e,n,i){var r=t.__pictorialBundle,o=t.__pictorialMainPath;o?tO(o,null,{x:n.pathPosition[0],y:n.pathPosition[1],scaleX:n.symbolScale[0],scaleY:n.symbolScale[1],rotation:n.rotation},n,i):(o=t.__pictorialMainPath=WP(n),r.add(o),tO(o,{x:n.pathPosition[0],y:n.pathPosition[1],scaleX:0,scaleY:0,rotation:n.rotation},{scaleX:n.symbolScale[0],scaleY:n.symbolScale[1]},n,i))}function UP(t,e,n){var i=A({},e.barRectShape),r=t.__pictorialBarRect;r?tO(r,null,{shape:i},e,n):((r=t.__pictorialBarRect=new Ts({z2:2,shape:i,silent:!0,style:{stroke:"transparent",fill:"transparent",lineWidth:0}})).disableMorphing=!0,t.add(r))}function XP(t,e,n,i){if(n.symbolClip){var r=t.__pictorialClipPath,o=A({},n.clipShape),a=e.valueDim,s=n.animationModel,l=n.dataIndex;if(r)ih(r,{shape:o},s,l);else{o[a.wh]=0,r=new Ts({shape:o}),t.__pictorialBundle.setClipPath(r),t.__pictorialClipPath=r;var u={};u[a.wh]=n.clipShape[a.wh],Vh[i?"updateProps":"initProps"](r,{shape:u},s,l)}}}function ZP(t,e){var n=t.getItemModel(e);return n.getAnimationDelayParams=jP,n.isAnimationEnabled=qP,n}function jP(t){return{index:t.__pictorialAnimationIndex,count:t.__pictorialRepeatTimes}}function qP(){return this.parentModel.isAnimationEnabled()&&!!this.getShallow("animation")}function KP(t,e,n,i){var r=new Cr,o=new Cr;return r.add(o),r.__pictorialBundle=o,o.x=n.bundlePosition[0],o.y=n.bundlePosition[1],n.symbolRepeat?HP(r,e,n):YP(r,0,n),UP(r,n,i),XP(r,e,n,i),r.__pictorialShapeStr=JP(t,n),r.__pictorialSymbolMeta=n,r}function $P(t,e,n,i){var r=i.__pictorialBarRect;r&&r.removeTextContent();var o=[];QP(i,(function(t){o.push(t)})),i.__pictorialMainPath&&o.push(i.__pictorialMainPath),i.__pictorialClipPath&&(n=null),E(o,(function(t){ah(t,{scaleX:0,scaleY:0},n,e,(function(){i.parent&&i.parent.remove(i)}))})),t.setItemGraphicEl(e,null)}function JP(t,e){return[t.getItemVisual(e.dataIndex,"symbol")||"none",!!e.symbolRepeat,!!e.symbolClip].join(":")}function QP(t,e,n){E(t.__pictorialBundle.children(),(function(i){i!==t.__pictorialBarRect&&e.call(n,i)}))}function tO(t,e,n,i,r,o){e&&t.attr(e),i.symbolClip&&!r?n&&t.attr(n):n&&Vh[r?"updateProps":"initProps"](t,n,i.animationModel,i.dataIndex,o)}function eO(t,e,n){var i=n.dataIndex,r=n.itemModel,o=r.getModel("emphasis"),a=o.getModel("itemStyle").getItemStyle(),s=r.getModel(["blur","itemStyle"]).getItemStyle(),l=r.getModel(["select","itemStyle"]).getItemStyle(),u=r.getShallow("cursor"),h=o.get("focus"),c=o.get("blurScope"),p=o.get("scale");QP(t,(function(t){if(t instanceof xs){var e=t.style;t.useStyle(A({image:e.image,x:e.x,y:e.y,width:e.width,height:e.height},n.style))}else t.useStyle(n.style);var i=t.ensureState("emphasis");i.style=a,p&&(i.scaleX=1.1*t.scaleX,i.scaleY=1.1*t.scaleY),t.ensureState("blur").style=s,t.ensureState("select").style=l,u&&(t.cursor=u),t.z2=n.z2}));var d=e.valueDim.posDesc[+(n.boundingLength>0)];Wh(t.__pictorialBarRect,Hh(r),{labelFetcher:e.seriesModel,labelDataIndex:i,defaultText:Fw(e.seriesModel.getData(),i),inheritColor:n.style.fill,defaultOpacity:n.style.opacity,defaultOutsidePosition:d}),Ol(t,h,c,o.get("disabled"))}function nO(t){var e=Math.round(t);return Math.abs(t-e)<1e-4?e:Math.ceil(t)}var iO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.hasSymbolVisual=!0,n.defaultSymbol="roundRect",n}return n(e,t),e.prototype.getInitialData=function(e){return e.stack=null,t.prototype.getInitialData.apply(this,arguments)},e.type="series.pictorialBar",e.dependencies=["grid"],e.defaultOption=gc(SS.defaultOption,{symbol:"circle",symbolSize:null,symbolRotate:null,symbolPosition:null,symbolOffset:null,symbolMargin:null,symbolRepeat:!1,symbolRepeatDirection:"end",symbolClip:!1,symbolBoundingData:null,symbolPatternSize:400,barGap:"-100%",progressive:0,emphasis:{scale:!1},select:{itemStyle:{borderColor:"#212121"}}}),e}(SS);var rO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._layers=[],n}return n(e,t),e.prototype.render=function(t,e,n){var i=t.getData(),r=this,o=this.group,a=t.getLayerSeries(),s=i.getLayout("layoutInfo"),l=s.rect,u=s.boundaryGap;function h(t){return t.name}o.x=0,o.y=l.y+u[0];var c=new Sm(this._layersSeries||[],a,h,h),p=[];function d(e,n,s){var l=r._layers;if("remove"!==e){for(var u,h,c=[],d=[],f=a[n].indices,g=0;g<f.length;g++){var y=i.getItemLayout(f[g]),v=y.x,m=y.y0,x=y.y;c.push(v,m),d.push(v,m+x),u=i.getItemVisual(f[g],"style")}var _=i.getItemLayout(f[0]),b=t.getModel("label").get("margin"),w=t.getModel("emphasis");if("add"===e){var S=p[n]=new Cr;h=new iS({shape:{points:c,stackedOnPoints:d,smooth:.4,stackedOnSmooth:.4,smoothConstraint:!1},z2:0}),S.add(h),o.add(S),t.isAnimationEnabled()&&h.setClipPath(function(t,e,n){var i=new Ts({shape:{x:t.x-10,y:t.y-10,width:0,height:t.height+20}});return rh(i,{shape:{x:t.x-50,width:t.width+100,height:t.height+20}},e,n),i}(h.getBoundingRect(),t,(function(){h.removeClipPath()})))}else{S=l[s];h=S.childAt(0),o.add(S),p[n]=S,ih(h,{shape:{points:c,stackedOnPoints:d}},t),uh(h)}Wh(h,Hh(t),{labelDataIndex:f[g-1],defaultText:i.getName(f[g-1]),inheritColor:u.fill},{normal:{verticalAlign:"middle"}}),h.setTextConfig({position:null,local:!0});var M=h.getTextContent();M&&(M.x=_.x-b,M.y=_.y0+_.y/2),h.useStyle(u),i.setItemGraphicEl(n,h),zl(h,t),Ol(h,w.get("focus"),w.get("blurScope"),w.get("disabled"))}else o.remove(l[n])}c.add(W(d,this,"add")).update(W(d,this,"update")).remove(W(d,this,"remove")).execute(),this._layersSeries=a,this._layers=p},e.type="themeRiver",e}(mg);var oO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(e){t.prototype.init.apply(this,arguments),this.legendVisualProvider=new lM(W(this.getData,this),W(this.getRawData,this))},e.prototype.fixData=function(t){var e=t.length,n={},i=Lo(t,(function(t){return n.hasOwnProperty(t[0]+"")||(n[t[0]+""]=-1),t[2]})),r=[];i.buckets.each((function(t,e){r.push({name:e,dataList:t})}));for(var o=r.length,a=0;a<o;++a){for(var s=r[a].name,l=0;l<r[a].dataList.length;++l){var u=r[a].dataList[l][0]+"";n[u]=a}for(var u in n)n.hasOwnProperty(u)&&n[u]!==a&&(n[u]=a,t[e]=[u,0,s],e++)}return t},e.prototype.getInitialData=function(t,e){for(var n=this.getReferringComponents("singleAxis",Co).models[0].get("type"),i=B(t.data,(function(t){return void 0!==t[2]})),r=this.fixData(i||[]),o=[],a=this.nameMap=ft(),s=0,l=0;l<r.length;++l)o.push(r[l][2]),a.get(r[l][2])||(a.set(r[l][2],s),s++);var u=jm(r,{coordDimensions:["single"],dimensionsDefine:[{name:"time",type:Tm(n)},{name:"value",type:"float"},{name:"name",type:"ordinal"}],encodeDefine:{single:0,value:1,itemName:2}}).dimensions,h=new Zm(u,this);return h.initData(r),h},e.prototype.getLayerSeries=function(){for(var t=this.getData(),e=t.count(),n=[],i=0;i<e;++i)n[i]=i;var r=t.mapDimension("single"),o=Lo(n,(function(e){return t.get("name",e)})),a=[];return o.buckets.each((function(e,n){e.sort((function(e,n){return t.get(r,e)-t.get(r,n)})),a.push({name:n,indices:e})})),a},e.prototype.getAxisTooltipData=function(t,e,n){Y(t)||(t=t?[t]:[]);for(var i,r=this.getData(),o=this.getLayerSeries(),a=[],s=o.length,l=0;l<s;++l){for(var u=Number.MAX_VALUE,h=-1,c=o[l].indices.length,p=0;p<c;++p){var d=r.get(t[0],o[l].indices[p]),f=Math.abs(d-e);f<=u&&(i=d,u=f,h=o[l].indices[p])}a.push(h)}return{dataIndices:a,nestestValue:i}},e.prototype.formatTooltip=function(t,e,n){var i=this.getData();return Uf("nameValue",{name:i.getName(t),value:i.get(i.mapDimension("value"),t)})},e.type="series.themeRiver",e.dependencies=["singleAxis"],e.defaultOption={z:2,colorBy:"data",coordinateSystem:"singleAxis",boundaryGap:["10%","10%"],singleAxisIndex:0,animationEasing:"linear",label:{margin:4,show:!0,position:"left",fontSize:11},emphasis:{label:{show:!0}}},e}(ag);function aO(t,e){t.eachSeriesByType("themeRiver",(function(t){var e=t.getData(),n=t.coordinateSystem,i={},r=n.getRect();i.rect=r;var o=t.get("boundaryGap"),a=n.getAxis();(i.boundaryGap=o,"horizontal"===a.orient)?(o[0]=Er(o[0],r.height),o[1]=Er(o[1],r.height),sO(e,t,r.height-o[0]-o[1])):(o[0]=Er(o[0],r.width),o[1]=Er(o[1],r.width),sO(e,t,r.width-o[0]-o[1]));e.setLayout("layoutInfo",i)}))}function sO(t,e,n){if(t.count())for(var i,r=e.coordinateSystem,o=e.getLayerSeries(),a=t.mapDimension("single"),s=t.mapDimension("value"),l=z(o,(function(e){return z(e.indices,(function(e){var n=r.dataToPoint(t.get(a,e));return n[1]=t.get(s,e),n}))})),u=function(t){for(var e=t.length,n=t[0].length,i=[],r=[],o=0,a=0;a<n;++a){for(var s=0,l=0;l<e;++l)s+=t[l][a][1];s>o&&(o=s),i.push(s)}for(var u=0;u<n;++u)r[u]=(o-i[u])/2;o=0;for(var h=0;h<n;++h){var c=i[h]+r[h];c>o&&(o=c)}return{y0:r,max:o}}(l),h=u.y0,c=n/u.max,p=o.length,d=o[0].indices.length,f=0;f<d;++f){i=h[f]*c,t.setItemLayout(o[0].indices[f],{layerIndex:0,x:l[0][f][0],y0:i,y:l[0][f][1]*c});for(var g=1;g<p;++g)i+=l[g-1][f][1]*c,t.setItemLayout(o[g].indices[f],{layerIndex:g,x:l[g][f][0],y0:i,y:l[g][f][1]*c})}}var lO=function(t){function e(e,n,i,r){var o=t.call(this)||this;o.z2=2,o.textConfig={inside:!0},Ws(o).seriesIndex=n.seriesIndex;var a=new As({z2:4,silent:e.getModel().get(["label","silent"])});return o.setTextContent(a),o.updateData(!0,e,n,i,r),o}return n(e,t),e.prototype.updateData=function(t,e,n,i,r){this.node=e,e.piece=this,n=n||this._seriesModel,i=i||this._ecModel;var o=this;Ws(o).dataIndex=e.dataIndex;var a=e.getModel(),s=a.getModel("emphasis"),l=e.getLayout(),u=A({},l);u.label=null;var h=e.getVisual("style");h.lineJoin="bevel";var c=e.getVisual("decal");c&&(h.decal=nv(c,r));var p=rM(a.getModel("itemStyle"),u,!0);A(u,p),E(js,(function(t){var e=o.ensureState(t),n=a.getModel([t,"itemStyle"]);e.style=n.getItemStyle();var i=rM(n,u);i&&(e.shape=i)})),t?(o.setShape(u),o.shape.r=l.r0,ih(o,{shape:{r:l.r}},n,e.dataIndex)):(ih(o,{shape:u},n),uh(o)),o.useStyle(h),this._updateLabel(n);var d=a.getShallow("cursor");d&&o.attr("cursor",d),this._seriesModel=n||this._seriesModel,this._ecModel=i||this._ecModel;var f=s.get("focus");Ol(this,"ancestor"===f?e.getAncestorsIndices():"descendant"===f?e.getDescendantIndices():f,s.get("blurScope"),s.get("disabled"))},e.prototype._updateLabel=function(t){var e=this,n=this.node.getModel(),i=n.getModel("label"),r=this.node.getLayout(),o=r.endAngle-r.startAngle,a=(r.startAngle+r.endAngle)/2,s=Math.cos(a),l=Math.sin(a),u=this,h=u.getTextContent(),c=this.node.dataIndex,p=i.get("minAngle")/180*Math.PI,d=i.get("show")&&!(null!=p&&Math.abs(o)<p);function f(t,e){var n=t.get(e);return null==n?i.get(e):n}h.ignore=!d,E(qs,(function(i){var o="normal"===i?n.getModel("label"):n.getModel([i,"label"]),p="normal"===i,d=p?h:h.ensureState(i),g=t.getFormattedLabel(c,i);p&&(g=g||e.node.name),d.style=Yh(o,{},null,"normal"!==i,!0),g&&(d.style.text=g);var y=o.get("show");null==y||p||(d.ignore=!y);var v,m=f(o,"position"),x=p?u:u.states[i],_=x.style.fill;x.textConfig={outsideFill:"inherit"===o.get("color")?_:null,inside:"outside"!==m};var b=f(o,"distance")||0,w=f(o,"align");"outside"===m?(v=r.r+b,w=a>Math.PI/2?"right":"left"):w&&"center"!==w?"left"===w?(v=r.r0+b,a>Math.PI/2&&(w="right")):"right"===w&&(v=r.r-b,a>Math.PI/2&&(w="left")):(v=(r.r+r.r0)/2,w="center"),d.style.align=w,d.style.verticalAlign=f(o,"verticalAlign")||"middle",d.x=v*s+r.cx,d.y=v*l+r.cy;var S=f(o,"rotate"),M=0;"radial"===S?(M=-a)<-Math.PI/2&&(M+=Math.PI):"tangential"===S?(M=Math.PI/2-a)>Math.PI/2?M-=Math.PI:M<-Math.PI/2&&(M+=Math.PI):j(S)&&(M=S*Math.PI/180),d.rotation=M})),h.dirtyStyle()},e}(Tu),uO="sunburstRootToNode",hO="sunburstHighlight";var cO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n,i){var r=this;this.seriesModel=t,this.api=n,this.ecModel=e;var o=t.getData(),a=o.tree.root,s=t.getViewRoot(),l=this.group,u=t.get("renderLabelForZeroData"),h=[];s.eachNode((function(t){h.push(t)}));var c=this._oldChildren||[];!function(i,r){if(0===i.length&&0===r.length)return;function s(t){return t.getId()}function h(s,h){!function(i,r){u||!i||i.getValue()||(i=null);if(i!==a&&r!==a)if(r&&r.piece)i?(r.piece.updateData(!1,i,t,e,n),o.setItemGraphicEl(i.dataIndex,r.piece)):function(t){if(!t)return;t.piece&&(l.remove(t.piece),t.piece=null)}(r);else if(i){var s=new lO(i,t,e,n);l.add(s),o.setItemGraphicEl(i.dataIndex,s)}}(null==s?null:i[s],null==h?null:r[h])}new Sm(r,i,s,s).add(h).update(h).remove(H(h,null)).execute()}(h,c),function(i,o){o.depth>0?(r.virtualPiece?r.virtualPiece.updateData(!1,i,t,e,n):(r.virtualPiece=new lO(i,t,e,n),l.add(r.virtualPiece)),o.piece.off("click"),r.virtualPiece.on("click",(function(t){r._rootToNode(o.parentNode)}))):r.virtualPiece&&(l.remove(r.virtualPiece),r.virtualPiece=null)}(a,s),this._initEvents(),this._oldChildren=h},e.prototype._initEvents=function(){var t=this;this.group.off("click"),this.group.on("click",(function(e){var n=!1;t.seriesModel.getViewRoot().eachNode((function(i){if(!n&&i.piece&&i.piece===e.target){var r=i.getModel().get("nodeClick");if("rootToNode"===r)t._rootToNode(i);else if("link"===r){var o=i.getModel(),a=o.get("link");if(a)pp(a,o.get("target",!0)||"_blank")}n=!0}}))}))},e.prototype._rootToNode=function(t){t!==this.seriesModel.getViewRoot()&&this.api.dispatchAction({type:uO,from:this.uid,seriesId:this.seriesModel.id,targetNode:t})},e.prototype.containPoint=function(t,e){var n=e.getData().getItemLayout(0);if(n){var i=t[0]-n.cx,r=t[1]-n.cy,o=Math.sqrt(i*i+r*r);return o<=n.r&&o>=n.r0}},e.type="sunburst",e}(mg),pO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.ignoreStyleOnData=!0,n}return n(e,t),e.prototype.getInitialData=function(t,e){var n={name:t.name,children:t.data};dO(n);var i=this._levelModels=z(t.levels||[],(function(t){return new pc(t,this,e)}),this),r=CC.createTree(n,this,(function(t){t.wrapMethod("getItemModel",(function(t,e){var n=r.getNodeByDataIndex(e),o=i[n.depth];return o&&(t.parentModel=o),t}))}));return r.data},e.prototype.optionUpdated=function(){this.resetViewRoot()},e.prototype.getDataParams=function(e){var n=t.prototype.getDataParams.apply(this,arguments),i=this.getData().tree.getNodeByDataIndex(e);return n.treePathInfo=LC(i,this),n},e.prototype.getLevelModel=function(t){return this._levelModels&&this._levelModels[t.depth]},e.prototype.getViewRoot=function(){return this._viewRoot},e.prototype.resetViewRoot=function(t){t?this._viewRoot=t:t=this._viewRoot;var e=this.getRawData().tree.root;t&&(t===e||e.contains(t))||(this._viewRoot=e)},e.prototype.enableAriaDecal=function(){zC(this)},e.type="series.sunburst",e.defaultOption={z:2,center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,stillShowZeroSum:!0,nodeClick:"rootToNode",renderLabelForZeroData:!1,label:{rotate:"radial",show:!0,opacity:1,align:"center",position:"inside",distance:5,silent:!0},itemStyle:{borderWidth:1,borderColor:"white",borderType:"solid",shadowBlur:0,shadowColor:"rgba(0, 0, 0, 0.2)",shadowOffsetX:0,shadowOffsetY:0,opacity:1},emphasis:{focus:"descendant"},blur:{itemStyle:{opacity:.2},label:{opacity:.1}},animationType:"expansion",animationDuration:1e3,animationDurationUpdate:500,data:[],sort:"desc"},e}(ag);function dO(t){var e=0;E(t.children,(function(t){dO(t);var n=t.value;Y(n)&&(n=n[0]),e+=n}));var n=t.value;Y(n)&&(n=n[0]),(null==n||isNaN(n))&&(n=e),n<0&&(n=0),Y(t.value)?t.value[0]=n:t.value=n}var fO=Math.PI/180;function gO(t,e,n){e.eachSeriesByType(t,(function(t){var e=t.get("center"),i=t.get("radius");Y(i)||(i=[0,i]),Y(e)||(e=[e,e]);var r=n.getWidth(),o=n.getHeight(),a=Math.min(r,o),s=Er(e[0],r),l=Er(e[1],o),u=Er(i[0],a/2),h=Er(i[1],a/2),c=-t.get("startAngle")*fO,p=t.get("minAngle")*fO,d=t.getData().tree.root,f=t.getViewRoot(),g=f.depth,y=t.get("sort");null!=y&&yO(f,y);var v=0;E(f.children,(function(t){!isNaN(t.getValue())&&v++}));var m=f.getValue(),x=Math.PI/(m||v)*2,_=f.depth>0,b=f.height-(_?-1:1),w=(h-u)/(b||1),S=t.get("clockwise"),M=t.get("stillShowZeroSum"),I=S?1:-1,T=function(e,n){if(e){var i=n;if(e!==d){var r=e.getValue(),o=0===m&&M?x:r*x;o<p&&(o=p),i=n+I*o;var h=e.depth-g-(_?-1:1),c=u+w*h,f=u+w*(h+1),y=t.getLevelModel(e);if(y){var v=y.get("r0",!0),b=y.get("r",!0),C=y.get("radius",!0);null!=C&&(v=C[0],b=C[1]),null!=v&&(c=Er(v,a/2)),null!=b&&(f=Er(b,a/2))}e.setLayout({angle:o,startAngle:n,endAngle:i,clockwise:S,cx:s,cy:l,r0:c,r:f})}if(e.children&&e.children.length){var D=0;E(e.children,(function(t){D+=T(t,n+D)}))}return i-n}};if(_){var C=u,D=u+w,A=2*Math.PI;d.setLayout({angle:A,startAngle:c,endAngle:c+A,clockwise:S,cx:s,cy:l,r0:C,r:D})}T(f,c)}))}function yO(t,e){var n=t.children||[];t.children=function(t,e){if(U(e)){var n=z(t,(function(t,e){var n=t.getValue();return{params:{depth:t.depth,height:t.height,dataIndex:t.dataIndex,getValue:function(){return n}},index:e}}));return n.sort((function(t,n){return e(t.params,n.params)})),z(n,(function(e){return t[e.index]}))}var i="asc"===e;return t.sort((function(t,e){var n=(t.getValue()-e.getValue())*(i?1:-1);return 0===n?(t.dataIndex-e.dataIndex)*(i?-1:1):n}))}(n,e),n.length&&E(t.children,(function(t){yO(t,e)}))}function vO(t){var e={};t.eachSeriesByType("sunburst",(function(t){var n=t.getData(),i=n.tree;i.eachNode((function(r){var o=r.getModel().getModel("itemStyle").getItemStyle();o.fill||(o.fill=function(t,n,i){for(var r=t;r&&r.depth>1;)r=r.parentNode;var o=n.getColorFromPalette(r.name||r.dataIndex+"",e);return t.depth>1&&X(o)&&(o=Sn(o,(t.depth-1)/(i-1)*.5)),o}(r,t,i.root.height)),A(n.ensureUniqueItemVisual(r.dataIndex,"style"),o)}))}))}var mO={color:"fill",borderColor:"stroke"},xO={symbol:1,symbolSize:1,symbolKeepAspect:1,legendIcon:1,visualMeta:1,liftZ:1,decal:1},_O=So(),bO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.optionUpdated=function(){this.currentZLevel=this.get("zlevel",!0),this.currentZ=this.get("z",!0)},e.prototype.getInitialData=function(t,e){return nx(null,this)},e.prototype.getDataParams=function(e,n,i){var r=t.prototype.getDataParams.call(this,e,n);return i&&(r.info=_O(i).info),r},e.type="series.custom",e.dependencies=["grid","polar","geo","singleAxis","calendar"],e.defaultOption={coordinateSystem:"cartesian2d",z:2,legendHoverLink:!0,clip:!1},e}(ag);function wO(t,e){return e=e||[0,0],z(["x","y"],(function(n,i){var r=this.getAxis(n),o=e[i],a=t[i]/2;return"category"===r.type?r.getBandWidth():Math.abs(r.dataToCoord(o-a)-r.dataToCoord(o+a))}),this)}function SO(t,e){return e=e||[0,0],z([0,1],(function(n){var i=e[n],r=t[n]/2,o=[],a=[];return o[n]=i-r,a[n]=i+r,o[1-n]=a[1-n]=e[1-n],Math.abs(this.dataToPoint(o)[n]-this.dataToPoint(a)[n])}),this)}function MO(t,e){var n=this.getAxis(),i=e instanceof Array?e[0]:e,r=(t instanceof Array?t[0]:t)/2;return"category"===n.type?n.getBandWidth():Math.abs(n.dataToCoord(i-r)-n.dataToCoord(i+r))}function IO(t,e){return e=e||[0,0],z(["Radius","Angle"],(function(n,i){var r=this["get"+n+"Axis"](),o=e[i],a=t[i]/2,s="category"===r.type?r.getBandWidth():Math.abs(r.dataToCoord(o-a)-r.dataToCoord(o+a));return"Angle"===n&&(s=s*Math.PI/180),s}),this)}function TO(t,e,n,i){return t&&(t.legacy||!1!==t.legacy&&!n&&!i&&"tspan"!==e&&("text"===e||mt(t,"text")))}function CO(t,e,n){var i,r,o,a=t;if("text"===e)o=a;else{o={},mt(a,"text")&&(o.text=a.text),mt(a,"rich")&&(o.rich=a.rich),mt(a,"textFill")&&(o.fill=a.textFill),mt(a,"textStroke")&&(o.stroke=a.textStroke),mt(a,"fontFamily")&&(o.fontFamily=a.fontFamily),mt(a,"fontSize")&&(o.fontSize=a.fontSize),mt(a,"fontStyle")&&(o.fontStyle=a.fontStyle),mt(a,"fontWeight")&&(o.fontWeight=a.fontWeight),r={type:"text",style:o,silent:!0},i={};var s=mt(a,"textPosition");n?i.position=s?a.textPosition:"inside":s&&(i.position=a.textPosition),mt(a,"textPosition")&&(i.position=a.textPosition),mt(a,"textOffset")&&(i.offset=a.textOffset),mt(a,"textRotation")&&(i.rotation=a.textRotation),mt(a,"textDistance")&&(i.distance=a.textDistance)}return DO(o,t),E(o.rich,(function(t){DO(t,t)})),{textConfig:i,textContent:r}}function DO(t,e){e&&(e.font=e.textFont||e.font,mt(e,"textStrokeWidth")&&(t.lineWidth=e.textStrokeWidth),mt(e,"textAlign")&&(t.align=e.textAlign),mt(e,"textVerticalAlign")&&(t.verticalAlign=e.textVerticalAlign),mt(e,"textLineHeight")&&(t.lineHeight=e.textLineHeight),mt(e,"textWidth")&&(t.width=e.textWidth),mt(e,"textHeight")&&(t.height=e.textHeight),mt(e,"textBackgroundColor")&&(t.backgroundColor=e.textBackgroundColor),mt(e,"textPadding")&&(t.padding=e.textPadding),mt(e,"textBorderColor")&&(t.borderColor=e.textBorderColor),mt(e,"textBorderWidth")&&(t.borderWidth=e.textBorderWidth),mt(e,"textBorderRadius")&&(t.borderRadius=e.textBorderRadius),mt(e,"textBoxShadowColor")&&(t.shadowColor=e.textBoxShadowColor),mt(e,"textBoxShadowBlur")&&(t.shadowBlur=e.textBoxShadowBlur),mt(e,"textBoxShadowOffsetX")&&(t.shadowOffsetX=e.textBoxShadowOffsetX),mt(e,"textBoxShadowOffsetY")&&(t.shadowOffsetY=e.textBoxShadowOffsetY))}function AO(t,e,n){var i=t;i.textPosition=i.textPosition||n.position||"inside",null!=n.offset&&(i.textOffset=n.offset),null!=n.rotation&&(i.textRotation=n.rotation),null!=n.distance&&(i.textDistance=n.distance);var r=i.textPosition.indexOf("inside")>=0,o=t.fill||"#000";kO(i,e);var a=null==i.textFill;return r?a&&(i.textFill=n.insideFill||"#fff",!i.textStroke&&n.insideStroke&&(i.textStroke=n.insideStroke),!i.textStroke&&(i.textStroke=o),null==i.textStrokeWidth&&(i.textStrokeWidth=2)):(a&&(i.textFill=t.fill||n.outsideFill||"#000"),!i.textStroke&&n.outsideStroke&&(i.textStroke=n.outsideStroke)),i.text=e.text,i.rich=e.rich,E(e.rich,(function(t){kO(t,t)})),i}function kO(t,e){e&&(mt(e,"fill")&&(t.textFill=e.fill),mt(e,"stroke")&&(t.textStroke=e.fill),mt(e,"lineWidth")&&(t.textStrokeWidth=e.lineWidth),mt(e,"font")&&(t.font=e.font),mt(e,"fontStyle")&&(t.fontStyle=e.fontStyle),mt(e,"fontWeight")&&(t.fontWeight=e.fontWeight),mt(e,"fontSize")&&(t.fontSize=e.fontSize),mt(e,"fontFamily")&&(t.fontFamily=e.fontFamily),mt(e,"align")&&(t.textAlign=e.align),mt(e,"verticalAlign")&&(t.textVerticalAlign=e.verticalAlign),mt(e,"lineHeight")&&(t.textLineHeight=e.lineHeight),mt(e,"width")&&(t.textWidth=e.width),mt(e,"height")&&(t.textHeight=e.height),mt(e,"backgroundColor")&&(t.textBackgroundColor=e.backgroundColor),mt(e,"padding")&&(t.textPadding=e.padding),mt(e,"borderColor")&&(t.textBorderColor=e.borderColor),mt(e,"borderWidth")&&(t.textBorderWidth=e.borderWidth),mt(e,"borderRadius")&&(t.textBorderRadius=e.borderRadius),mt(e,"shadowColor")&&(t.textBoxShadowColor=e.shadowColor),mt(e,"shadowBlur")&&(t.textBoxShadowBlur=e.shadowBlur),mt(e,"shadowOffsetX")&&(t.textBoxShadowOffsetX=e.shadowOffsetX),mt(e,"shadowOffsetY")&&(t.textBoxShadowOffsetY=e.shadowOffsetY),mt(e,"textShadowColor")&&(t.textShadowColor=e.textShadowColor),mt(e,"textShadowBlur")&&(t.textShadowBlur=e.textShadowBlur),mt(e,"textShadowOffsetX")&&(t.textShadowOffsetX=e.textShadowOffsetX),mt(e,"textShadowOffsetY")&&(t.textShadowOffsetY=e.textShadowOffsetY))}var LO={position:["x","y"],scale:["scaleX","scaleY"],origin:["originX","originY"]},PO=G(LO),OO=(V(Ki,(function(t,e){return t[e]=1,t}),{}),Ki.join(", "),["","style","shape","extra"]),RO=So();function NO(t,e,n,i,r){var o=t+"Animation",a=eh(t,i,r)||{},s=RO(e).userDuring;return a.duration>0&&(a.during=s?W(WO,{el:e,userDuring:s}):null,a.setToFinal=!0,a.scope=t),A(a,n[o]),a}function EO(t,e,n,i){var r=(i=i||{}).dataIndex,o=i.isInit,a=i.clearStyle,s=n.isAnimationEnabled(),l=RO(t),u=e.style;l.userDuring=e.during;var h={},c={};if(function(t,e,n){for(var i=0;i<PO.length;i++){var r=PO[i],o=LO[r],a=e[r];a&&(n[o[0]]=a[0],n[o[1]]=a[1])}for(i=0;i<Ki.length;i++){var s=Ki[i];null!=e[s]&&(n[s]=e[s])}}(0,e,c),YO("shape",e,c),YO("extra",e,c),!o&&s&&(function(t,e,n){for(var i=e.transition,r=BO(i)?Ki:ho(i||[]),o=0;o<r.length;o++){var a=r[o];if("style"!==a&&"shape"!==a&&"extra"!==a){var s=t[a];0,n[a]=s}}}(t,e,h),HO("shape",t,e,h),HO("extra",t,e,h),function(t,e,n,i){if(!n)return;var r,o=t.style;if(o){var a=n.transition,s=e.transition;if(a&&!BO(a)){var l=ho(a);!r&&(r=i.style={});for(var u=0;u<l.length;u++){var h=o[f=l[u]];r[f]=h}}else if(t.getAnimationStyleProps&&(BO(s)||BO(a)||P(s,"style")>=0)){var c=t.getAnimationStyleProps(),p=c?c.style:null;if(p){!r&&(r=i.style={});var d=G(n);for(u=0;u<d.length;u++){var f;if(p[f=d[u]]){h=o[f];r[f]=h}}}}}}(t,e,u,h)),c.style=u,function(t,e,n){var i=e.style;if(!t.isGroup&&i){if(n){t.useStyle({});for(var r=t.animators,o=0;o<r.length;o++){var a=r[o];"style"===a.targetName&&a.changeTarget(t.style)}}t.setStyle(i)}e&&(e.style=null,e&&t.attr(e),e.style=i)}(t,c,a),function(t,e){mt(e,"silent")&&(t.silent=e.silent),mt(e,"ignore")&&(t.ignore=e.ignore),t instanceof da&&mt(e,"invisible")&&(t.invisible=e.invisible);t instanceof fs&&mt(e,"autoBatch")&&(t.autoBatch=e.autoBatch)}(t,e),s)if(o){var p={};E(OO,(function(t){var n=t?e[t]:e;n&&n.enterFrom&&(t&&(p[t]=p[t]||{}),A(t?p[t]:p,n.enterFrom))}));var d=NO("enter",t,e,n,r);d.duration>0&&t.animateFrom(p,d)}else!function(t,e,n,i,r){if(r){var o=NO("update",t,e,i,n);o.duration>0&&t.animateFrom(r,o)}}(t,e,r||0,n,h);zO(t,e),u?t.dirty():t.markRedraw()}function zO(t,e){for(var n=RO(t).leaveToProps,i=0;i<OO.length;i++){var r=OO[i],o=r?e[r]:e;o&&o.leaveTo&&(n||(n=RO(t).leaveToProps={}),r&&(n[r]=n[r]||{}),A(r?n[r]:n,o.leaveTo))}}function VO(t,e,n,i){if(t){var r=t.parent,o=RO(t).leaveToProps;if(o){var a=NO("update",t,e,n,0);a.done=function(){r.remove(t),i&&i()},t.animateTo(o,a)}else r.remove(t),i&&i()}}function BO(t){return"all"===t}var FO={},GO={setTransform:function(t,e){return FO.el[t]=e,this},getTransform:function(t){return FO.el[t]},setShape:function(t,e){var n=FO.el;return(n.shape||(n.shape={}))[t]=e,n.dirtyShape&&n.dirtyShape(),this},getShape:function(t){var e=FO.el.shape;if(e)return e[t]},setStyle:function(t,e){var n=FO.el,i=n.style;return i&&(i[t]=e,n.dirtyStyle&&n.dirtyStyle()),this},getStyle:function(t){var e=FO.el.style;if(e)return e[t]},setExtra:function(t,e){return(FO.el.extra||(FO.el.extra={}))[t]=e,this},getExtra:function(t){var e=FO.el.extra;if(e)return e[t]}};function WO(){var t=this,e=t.el;if(e){var n=RO(e).userDuring,i=t.userDuring;n===i?(FO.el=e,i(GO)):t.el=t.userDuring=null}}function HO(t,e,n,i){var r=n[t];if(r){var o,a=e[t];if(a){var s=n.transition,l=r.transition;if(l)if(!o&&(o=i[t]={}),BO(l))A(o,a);else for(var u=ho(l),h=0;h<u.length;h++){var c=a[d=u[h]];o[d]=c}else if(BO(s)||P(s,t)>=0){!o&&(o=i[t]={});var p=G(a);for(h=0;h<p.length;h++){var d;c=a[d=p[h]];UO(r[d],c)&&(o[d]=c)}}}}}function YO(t,e,n){var i=e[t];if(i)for(var r=n[t]={},o=G(i),a=0;a<o.length;a++){var s=o[a];r[s]=ti(i[s])}}function UO(t,e){return N(t)?t!==e:null!=t&&isFinite(t)}var XO=So(),ZO=["percent","easing","shape","style","extra"];function jO(t){t.stopAnimation("keyframe"),t.attr(XO(t))}function qO(t,e,n){if(n.isAnimationEnabled()&&e)if(Y(e))E(e,(function(e){qO(t,e,n)}));else{var i=e.keyframes,r=e.duration;if(n&&null==r){var o=eh("enter",n,0);r=o&&o.duration}if(i&&r){var a=XO(t);E(OO,(function(n){if(!n||t[n]){var o;i.sort((function(t,e){return t.percent-e.percent})),E(i,(function(i){var s=t.animators,l=n?i[n]:i;if(l){var u=G(l);if(n||(u=B(u,(function(t){return P(ZO,t)<0}))),u.length){o||((o=t.animate(n,e.loop,!0)).scope="keyframe");for(var h=0;h<s.length;h++)s[h]!==o&&s[h].targetName===o.targetName&&s[h].stopTracks(u);n&&(a[n]=a[n]||{});var c=n?a[n]:a;E(u,(function(e){c[e]=((n?t[n]:t)||{})[e]})),o.whenWithKeys(r*i.percent,l,u,i.easing)}}})),o&&o.delay(e.delay||0).duration(r).start(e.easing)}}))}}}var KO="emphasis",$O="normal",JO="blur",QO="select",tR=[$O,KO,JO,QO],eR={normal:["itemStyle"],emphasis:[KO,"itemStyle"],blur:[JO,"itemStyle"],select:[QO,"itemStyle"]},nR={normal:["label"],emphasis:[KO,"label"],blur:[JO,"label"],select:[QO,"label"]},iR=["x","y"],rR={normal:{},emphasis:{},blur:{},select:{}},oR={cartesian2d:function(t){var e=t.master.getRect();return{coordSys:{type:"cartesian2d",x:e.x,y:e.y,width:e.width,height:e.height},api:{coord:function(e){return t.dataToPoint(e)},size:W(wO,t)}}},geo:function(t){var e=t.getBoundingRect();return{coordSys:{type:"geo",x:e.x,y:e.y,width:e.width,height:e.height,zoom:t.getZoom()},api:{coord:function(e){return t.dataToPoint(e)},size:W(SO,t)}}},singleAxis:function(t){var e=t.getRect();return{coordSys:{type:"singleAxis",x:e.x,y:e.y,width:e.width,height:e.height},api:{coord:function(e){return t.dataToPoint(e)},size:W(MO,t)}}},polar:function(t){var e=t.getRadiusAxis(),n=t.getAngleAxis(),i=e.getExtent();return i[0]>i[1]&&i.reverse(),{coordSys:{type:"polar",cx:t.cx,cy:t.cy,r:i[1],r0:i[0]},api:{coord:function(i){var r=e.dataToRadius(i[0]),o=n.dataToAngle(i[1]),a=t.coordToPoint([r,o]);return a.push(r,o*Math.PI/180),a},size:W(IO,t)}}},calendar:function(t){var e=t.getRect(),n=t.getRangeInfo();return{coordSys:{type:"calendar",x:e.x,y:e.y,width:e.width,height:e.height,cellWidth:t.getCellWidth(),cellHeight:t.getCellHeight(),rangeInfo:{start:n.start,end:n.end,weeks:n.weeks,dayCount:n.allDay}},api:{coord:function(e,n){return t.dataToPoint(e,n)}}}}};function aR(t){return t instanceof fs}function sR(t){return t instanceof da}var lR=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n,i){this._progressiveEls=null;var r=this._data,o=t.getData(),a=this.group,s=dR(t,o,e,n);r||a.removeAll(),o.diff(r).add((function(e){gR(n,null,e,s(e,i),t,a,o)})).remove((function(e){var n=r.getItemGraphicEl(e);VO(n,_O(n).option,t)})).update((function(e,l){var u=r.getItemGraphicEl(l);gR(n,u,e,s(e,i),t,a,o)})).execute();var l=t.get("clip",!0)?aS(t.coordinateSystem,!1,t):null;l?a.setClipPath(l):a.removeClipPath(),this._data=o},e.prototype.incrementalPrepareRender=function(t,e,n){this.group.removeAll(),this._data=null},e.prototype.incrementalRender=function(t,e,n,i,r){var o=e.getData(),a=dR(e,o,n,i),s=this._progressiveEls=[];function l(t){t.isGroup||(t.incremental=!0,t.ensureState("emphasis").hoverLayer=!0)}for(var u=t.start;u<t.end;u++){var h=gR(null,null,u,a(u,r),e,this.group,o);h&&(h.traverse(l),s.push(h))}},e.prototype.eachRendered=function(t){zh(this._progressiveEls||this.group,t)},e.prototype.filterForExposedEvent=function(t,e,n,i){var r=e.element;if(null==r||n.name===r)return!0;for(;(n=n.__hostTarget||n.parent)&&n!==this.group;)if(n.name===r)return!0;return!1},e.type="custom",e}(mg);function uR(t){var e,n=t.type;if("path"===n){var i=t.shape,r=null!=i.width&&null!=i.height?{x:i.x||0,y:i.y||0,width:i.width,height:i.height}:null,o=MR(i);e=mh(o,null,r,i.layout||"center"),_O(e).customPathData=o}else if("image"===n)e=new xs({}),_O(e).customImagePath=t.style.image;else if("text"===n)e=new As({});else if("group"===n)e=new Cr;else{if("compoundPath"===n)throw new Error('"compoundPath" is not supported yet.');var a=vh(n);if(!a){var s="";0,ao(s)}e=new a}return _O(e).customGraphicType=n,e.name=t.name,e.z2EmphasisLift=1,e.z2SelectLift=1,e}function hR(t,e,n,i,r,o,a){jO(e);var s=r&&r.normal.cfg;s&&e.setTextConfig(s),i&&null==i.transition&&(i.transition=iR);var l=i&&i.style;if(l){if("text"===e.type){var u=l;mt(u,"textFill")&&(u.fill=u.textFill),mt(u,"textStroke")&&(u.stroke=u.textStroke)}var h=void 0,c=aR(e)?l.decal:null;t&&c&&(c.dirty=!0,h=nv(c,t)),l.__decalPattern=h}sR(e)&&(l&&(h=l.__decalPattern)&&(l.decal=h));EO(e,i,o,{dataIndex:n,isInit:a,clearStyle:!0}),qO(e,i.keyframeAnimation,o)}function cR(t,e,n,i,r){var o=e.isGroup?null:e,a=r&&r[t].cfg;if(o){var s=o.ensureState(t);if(!1===i){var l=o.getState(t);l&&(l.style=null)}else s.style=i||null;a&&(s.textConfig=a),yl(o)}}function pR(t,e,n){var i=n===$O,r=i?e:xR(e,n),o=r?r.z2:null;null!=o&&((i?t:t.ensureState(n)).z2=o||0)}function dR(t,e,n,i){var r=t.get("renderItem"),o=t.coordinateSystem,a={};o&&(a=o.prepareCustoms?o.prepareCustoms(o):oR[o.type](o));for(var s,l,u=k({getWidth:i.getWidth,getHeight:i.getHeight,getZr:i.getZr,getDevicePixelRatio:i.getDevicePixelRatio,value:function(t,n){return null==n&&(n=s),e.getStore().get(e.getDimensionIndex(t||0),n)},style:function(n,i){0;null==i&&(i=s);var r=e.getItemVisual(i,"style"),o=r&&r.fill,a=r&&r.opacity,l=m(i,$O).getItemStyle();null!=o&&(l.fill=o),null!=a&&(l.opacity=a);var u={inheritColor:X(o)?o:"#000"},h=x(i,$O),c=Yh(h,null,u,!1,!0);c.text=h.getShallow("show")?rt(t.getFormattedLabel(i,$O),Fw(e,i)):null;var p=Uh(h,u,!1);return b(n,l),l=AO(l,c,p),n&&_(l,n),l.legacy=!0,l},ordinalRawValue:function(t,n){null==n&&(n=s),t=t||0;var i=e.getDimensionInfo(t);if(!i){var r=e.getDimensionIndex(t);return r>=0?e.getStore().get(r,n):void 0}var o=e.get(i.name,n),a=i&&i.ordinalMeta;return a?a.categories[o]:o},styleEmphasis:function(n,i){0;null==i&&(i=s);var r=m(i,KO).getItemStyle(),o=x(i,KO),a=Yh(o,null,null,!0,!0);a.text=o.getShallow("show")?ot(t.getFormattedLabel(i,KO),t.getFormattedLabel(i,$O),Fw(e,i)):null;var l=Uh(o,null,!0);return b(n,r),r=AO(r,a,l),n&&_(r,n),r.legacy=!0,r},visual:function(t,n){if(null==n&&(n=s),mt(mO,t)){var i=e.getItemVisual(n,"style");return i?i[mO[t]]:null}if(mt(xO,t))return e.getItemVisual(n,t)},barLayout:function(t){if("cartesian2d"===o.type){return function(t){var e=[],n=t.axis,i="axis0";if("category"===n.type){for(var r=n.getBandWidth(),o=0;o<t.count;o++)e.push(k({bandWidth:r,axisKey:i,stackId:bx+o},t));var a=Cx(e),s=[];for(o=0;o<t.count;o++){var l=a.axis0[bx+o];l.offsetCenter=l.offset+l.width/2,s.push(l)}return s}}(k({axis:o.getBaseAxis()},t))}},currentSeriesIndices:function(){return n.getCurrentSeriesIndices()},font:function(t){return Kh(t,n)}},a.api||{}),h={context:{},seriesId:t.id,seriesName:t.name,seriesIndex:t.seriesIndex,coordSys:a.coordSys,dataInsideLength:e.count(),encode:fR(t.getData())},c={},p={},d={},f={},g=0;g<tR.length;g++){var y=tR[g];d[y]=t.getModel(eR[y]),f[y]=t.getModel(nR[y])}function v(t){return t===s?l||(l=e.getItemModel(t)):e.getItemModel(t)}function m(t,n){return e.hasItemOption?t===s?c[n]||(c[n]=v(t).getModel(eR[n])):v(t).getModel(eR[n]):d[n]}function x(t,n){return e.hasItemOption?t===s?p[n]||(p[n]=v(t).getModel(nR[n])):v(t).getModel(nR[n]):f[n]}return function(t,n){return s=t,l=null,c={},p={},r&&r(k({dataIndexInside:t,dataIndex:e.getRawIndex(t),actionType:n?n.type:null},h),u)};function _(t,e){for(var n in e)mt(e,n)&&(t[n]=e[n])}function b(t,e){t&&(t.textFill&&(e.textFill=t.textFill),t.textPosition&&(e.textPosition=t.textPosition))}}function fR(t){var e={};return E(t.dimensions,(function(n){var i=t.getDimensionInfo(n);if(!i.isExtraCoord){var r=i.coordDim;(e[r]=e[r]||[])[i.coordDimIndex]=t.getDimensionIndex(n)}})),e}function gR(t,e,n,i,r,o,a){if(i){var s=yR(t,e,n,i,r,o);return s&&a.setItemGraphicEl(n,s),s&&Ol(s,i.focus,i.blurScope,i.emphasisDisabled),s}o.remove(e)}function yR(t,e,n,i,r,o){var a=-1,s=e;e&&vR(e,i,r)&&(a=P(o.childrenRef(),e),e=null);var l,u,h=!e,c=e;c?c.clearStates():(c=uR(i),s&&(l=s,(u=c).copyTransform(l),sR(u)&&sR(l)&&(u.setStyle(l.style),u.z=l.z,u.z2=l.z2,u.zlevel=l.zlevel,u.invisible=l.invisible,u.ignore=l.ignore,aR(u)&&aR(l)&&u.setShape(l.shape)))),!1===i.morph?c.disableMorphing=!0:c.disableMorphing&&(c.disableMorphing=!1),rR.normal.cfg=rR.normal.conOpt=rR.emphasis.cfg=rR.emphasis.conOpt=rR.blur.cfg=rR.blur.conOpt=rR.select.cfg=rR.select.conOpt=null,rR.isLegacy=!1,function(t,e,n,i,r,o){if(t.isGroup)return;mR(n,null,o),mR(n,KO,o);var a=o.normal.conOpt,s=o.emphasis.conOpt,l=o.blur.conOpt,u=o.select.conOpt;if(null!=a||null!=s||null!=u||null!=l){var h=t.getTextContent();if(!1===a)h&&t.removeTextContent();else{a=o.normal.conOpt=a||{type:"text"},h?h.clearStates():(h=uR(a),t.setTextContent(h)),hR(null,h,e,a,null,i,r);for(var c=a&&a.style,p=0;p<tR.length;p++){var d=tR[p];if(d!==$O){var f=o[d].conOpt;cR(d,h,0,_R(a,f,d),null)}}c?h.dirty():h.markRedraw()}}}(c,n,i,r,h,rR),function(t,e,n,i,r){var o=n.clipPath;if(!1===o)t&&t.getClipPath()&&t.removeClipPath();else if(o){var a=t.getClipPath();a&&vR(a,o,i)&&(a=null),a||(a=uR(o),t.setClipPath(a)),hR(null,a,e,o,null,i,r)}}(c,n,i,r,h),hR(t,c,n,i,rR,r,h),mt(i,"info")&&(_O(c).info=i.info);for(var p=0;p<tR.length;p++){var d=tR[p];if(d!==$O){var f=xR(i,d);cR(d,c,0,_R(i,f,d),rR)}}return function(t,e,n){if(!t.isGroup){var i=t,r=n.currentZ,o=n.currentZLevel;i.z=r,i.zlevel=o;var a=e.z2;null!=a&&(i.z2=a||0);for(var s=0;s<tR.length;s++)pR(i,e,tR[s])}}(c,i,r),"group"===i.type&&function(t,e,n,i,r){var o=i.children,a=o?o.length:0,s=i.$mergeChildren,l="byName"===s||i.diffChildrenByName,u=!1===s;if(!a&&!l&&!u)return;if(l)return h={api:t,oldChildren:e.children()||[],newChildren:o||[],dataIndex:n,seriesModel:r,group:e},void new Sm(h.oldChildren,h.newChildren,bR,bR,h).add(wR).update(wR).remove(SR).execute();var h;u&&e.removeAll();for(var c=0;c<a;c++)o[c]&&yR(t,e.childAt(c),n,o[c],r,e);for(var p=e.childCount()-1;p>=c;p--){VO(e.childAt(p),_O(e).option,r)}}(t,c,n,i,r),a>=0?o.replaceAt(c,a):o.add(c),c}function vR(t,e,n){var i,r=_O(t),o=e.type,a=e.shape,s=e.style;return n.isUniversalTransitionEnabled()||null!=o&&o!==r.customGraphicType||"path"===o&&((i=a)&&(mt(i,"pathData")||mt(i,"d")))&&MR(a)!==r.customPathData||"image"===o&&mt(s,"image")&&s.image!==r.customImagePath}function mR(t,e,n){var i=e?xR(t,e):t,r=e?_R(t,i,KO):t.style,o=t.type,a=i?i.textConfig:null,s=t.textContent,l=s?e?xR(s,e):s:null;if(r&&(n.isLegacy||TO(r,o,!!a,!!l))){n.isLegacy=!0;var u=CO(r,o,!e);!a&&u.textConfig&&(a=u.textConfig),!l&&u.textContent&&(l=u.textContent)}if(!e&&l){var h=l;!h.type&&(h.type="text")}var c=e?n[e]:n.normal;c.cfg=a,c.conOpt=l}function xR(t,e){return e?t?t[e]:null:t}function _R(t,e,n){var i=e&&e.style;return null==i&&n===KO&&t&&(i=t.styleEmphasis),i}function bR(t,e){var n=t&&t.name;return null!=n?n:"e\0\0"+e}function wR(t,e){var n=this.context,i=null!=t?n.newChildren[t]:null,r=null!=e?n.oldChildren[e]:null;yR(n.api,r,n.dataIndex,i,n.seriesModel,n.group)}function SR(t){var e=this.context,n=e.oldChildren[t];VO(n,_O(n).option,e.seriesModel)}function MR(t){return t&&(t.pathData||t.d)}var IR=So(),TR=T,CR=W,DR=function(){function t(){this._dragging=!1,this.animationThreshold=15}return t.prototype.render=function(t,e,n,i){var r=e.get("value"),o=e.get("status");if(this._axisModel=t,this._axisPointerModel=e,this._api=n,i||this._lastValue!==r||this._lastStatus!==o){this._lastValue=r,this._lastStatus=o;var a=this._group,s=this._handle;if(!o||"hide"===o)return a&&a.hide(),void(s&&s.hide());a&&a.show(),s&&s.show();var l={};this.makeElOption(l,r,t,e,n);var u=l.graphicKey;u!==this._lastGraphicKey&&this.clear(n),this._lastGraphicKey=u;var h=this._moveAnimation=this.determineAnimation(t,e);if(a){var c=H(AR,e,h);this.updatePointerEl(a,l,c),this.updateLabelEl(a,l,c,e)}else a=this._group=new Cr,this.createPointerEl(a,l,t,e),this.createLabelEl(a,l,t,e),n.getZr().add(a);OR(a,e,!0),this._renderHandle(r)}},t.prototype.remove=function(t){this.clear(t)},t.prototype.dispose=function(t){this.clear(t)},t.prototype.determineAnimation=function(t,e){var n=e.get("animation"),i=t.axis,r="category"===i.type,o=e.get("snap");if(!o&&!r)return!1;if("auto"===n||null==n){var a=this.animationThreshold;if(r&&i.getBandWidth()>a)return!0;if(o){var s=jM(t).seriesDataCount,l=i.getExtent();return Math.abs(l[0]-l[1])/s>a}return!1}return!0===n},t.prototype.makeElOption=function(t,e,n,i,r){},t.prototype.createPointerEl=function(t,e,n,i){var r=e.pointer;if(r){var o=IR(t).pointerEl=new Vh[r.type](TR(e.pointer));t.add(o)}},t.prototype.createLabelEl=function(t,e,n,i){if(e.label){var r=IR(t).labelEl=new As(TR(e.label));t.add(r),LR(r,i)}},t.prototype.updatePointerEl=function(t,e,n){var i=IR(t).pointerEl;i&&e.pointer&&(i.setStyle(e.pointer.style),n(i,{shape:e.pointer.shape}))},t.prototype.updateLabelEl=function(t,e,n,i){var r=IR(t).labelEl;r&&(r.setStyle(e.label.style),n(r,{x:e.label.x,y:e.label.y}),LR(r,i))},t.prototype._renderHandle=function(t){if(!this._dragging&&this.updateHandleTransform){var e,n=this._axisPointerModel,i=this._api.getZr(),r=this._handle,o=n.getModel("handle"),a=n.get("status");if(!o.get("show")||!a||"hide"===a)return r&&i.remove(r),void(this._handle=null);this._handle||(e=!0,r=this._handle=Lh(o.get("icon"),{cursor:"move",draggable:!0,onmousemove:function(t){se(t.event)},onmousedown:CR(this._onHandleDragMove,this,0,0),drift:CR(this._onHandleDragMove,this),ondragend:CR(this._onHandleDragEnd,this)}),i.add(r)),OR(r,n,!1),r.setStyle(o.getItemStyle(null,["color","borderColor","borderWidth","opacity","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY"]));var s=o.get("size");Y(s)||(s=[s,s]),r.scaleX=s[0]/2,r.scaleY=s[1]/2,Dg(this,"_doDispatchAxisPointer",o.get("throttle")||0,"fixRate"),this._moveHandleToValue(t,e)}},t.prototype._moveHandleToValue=function(t,e){AR(this._axisPointerModel,!e&&this._moveAnimation,this._handle,PR(this.getHandleTransform(t,this._axisModel,this._axisPointerModel)))},t.prototype._onHandleDragMove=function(t,e){var n=this._handle;if(n){this._dragging=!0;var i=this.updateHandleTransform(PR(n),[t,e],this._axisModel,this._axisPointerModel);this._payloadInfo=i,n.stopAnimation(),n.attr(PR(i)),IR(n).lastProp=null,this._doDispatchAxisPointer()}},t.prototype._doDispatchAxisPointer=function(){if(this._handle){var t=this._payloadInfo,e=this._axisModel;this._api.dispatchAction({type:"updateAxisPointer",x:t.cursorPoint[0],y:t.cursorPoint[1],tooltipOption:t.tooltipOption,axesInfo:[{axisDim:e.axis.dim,axisIndex:e.componentIndex}]})}},t.prototype._onHandleDragEnd=function(){if(this._dragging=!1,this._handle){var t=this._axisPointerModel.get("value");this._moveHandleToValue(t),this._api.dispatchAction({type:"hideTip"})}},t.prototype.clear=function(t){this._lastValue=null,this._lastStatus=null;var e=t.getZr(),n=this._group,i=this._handle;e&&n&&(this._lastGraphicKey=null,n&&e.remove(n),i&&e.remove(i),this._group=null,this._handle=null,this._payloadInfo=null),Ag(this,"_doDispatchAxisPointer")},t.prototype.doClear=function(){},t.prototype.buildLabel=function(t,e,n){return{x:t[n=n||0],y:t[1-n],width:e[n],height:e[1-n]}},t}();function AR(t,e,n,i){kR(IR(n).lastProp,i)||(IR(n).lastProp=i,e?ih(n,i,t):(n.stopAnimation(),n.attr(i)))}function kR(t,e){if(q(t)&&q(e)){var n=!0;return E(e,(function(e,i){n=n&&kR(t[i],e)})),!!n}return t===e}function LR(t,e){t[e.get(["label","show"])?"show":"hide"]()}function PR(t){return{x:t.x||0,y:t.y||0,rotation:t.rotation||0}}function OR(t,e,n){var i=e.get("z"),r=e.get("zlevel");t&&t.traverse((function(t){"group"!==t.type&&(null!=i&&(t.z=i),null!=r&&(t.zlevel=r),t.silent=n)}))}function RR(t){var e,n=t.get("type"),i=t.getModel(n+"Style");return"line"===n?(e=i.getLineStyle()).fill=null:"shadow"===n&&((e=i.getAreaStyle()).stroke=null),e}function NR(t,e,n,i,r){var o=ER(n.get("value"),e.axis,e.ecModel,n.get("seriesDataIndices"),{precision:n.get(["label","precision"]),formatter:n.get(["label","formatter"])}),a=n.getModel("label"),s=np(a.get("padding")||0),l=a.getFont(),u=cr(o,l),h=r.position,c=u.width+s[1]+s[3],p=u.height+s[0]+s[2],d=r.align;"right"===d&&(h[0]-=c),"center"===d&&(h[0]-=c/2);var f=r.verticalAlign;"bottom"===f&&(h[1]-=p),"middle"===f&&(h[1]-=p/2),function(t,e,n,i){var r=i.getWidth(),o=i.getHeight();t[0]=Math.min(t[0]+e,r)-e,t[1]=Math.min(t[1]+n,o)-n,t[0]=Math.max(t[0],0),t[1]=Math.max(t[1],0)}(h,c,p,i);var g=a.get("backgroundColor");g&&"auto"!==g||(g=e.get(["axisLine","lineStyle","color"])),t.label={x:h[0],y:h[1],style:Yh(a,{text:o,font:l,fill:a.getTextColor(),padding:s,backgroundColor:g}),z2:10}}function ER(t,e,n,i,r){t=e.scale.parse(t);var o=e.scale.getLabel({value:t},{precision:r.precision}),a=r.formatter;if(a){var s={value:o_(e,{value:t}),axisDimension:e.dim,axisIndex:e.index,seriesData:[]};E(i,(function(t){var e=n.getSeriesByIndex(t.seriesIndex),i=t.dataIndexInside,r=e&&e.getDataParams(i);r&&s.seriesData.push(r)})),X(a)?o=a.replace("{value}",o):U(a)&&(o=a(s))}return o}function zR(t,e,n){var i=[1,0,0,1,0,0];return zi(i,i,n.rotation),Ei(i,i,n.position),Ih([t.dataToCoord(e),(n.labelOffset||0)+(n.labelDirection||1)*(n.labelMargin||0)],i)}function VR(t,e,n,i,r,o){var a=BM.innerTextLayout(n.rotation,0,n.labelDirection);n.labelMargin=r.get(["label","margin"]),NR(e,i,r,o,{position:zR(i.axis,t,n),align:a.textAlign,verticalAlign:a.textVerticalAlign})}function BR(t,e,n){return{x1:t[n=n||0],y1:t[1-n],x2:e[n],y2:e[1-n]}}function FR(t,e,n){return{x:t[n=n||0],y:t[1-n],width:e[n],height:e[1-n]}}function GR(t,e,n,i,r,o){return{cx:t,cy:e,r0:n,r:i,startAngle:r,endAngle:o,clockwise:!0}}var WR=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.makeElOption=function(t,e,n,i,r){var o=n.axis,a=o.grid,s=i.get("type"),l=HR(a,o).getOtherAxis(o).getGlobalExtent(),u=o.toGlobalCoord(o.dataToCoord(e,!0));if(s&&"none"!==s){var h=RR(i),c=YR[s](o,u,l);c.style=h,t.graphicKey=c.type,t.pointer=c}VR(e,t,AM(a.model,n),n,i,r)},e.prototype.getHandleTransform=function(t,e,n){var i=AM(e.axis.grid.model,e,{labelInside:!1});i.labelMargin=n.get(["handle","margin"]);var r=zR(e.axis,t,i);return{x:r[0],y:r[1],rotation:i.rotation+(i.labelDirection<0?Math.PI:0)}},e.prototype.updateHandleTransform=function(t,e,n,i){var r=n.axis,o=r.grid,a=r.getGlobalExtent(!0),s=HR(o,r).getOtherAxis(r).getGlobalExtent(),l="x"===r.dim?0:1,u=[t.x,t.y];u[l]+=e[l],u[l]=Math.min(a[1],u[l]),u[l]=Math.max(a[0],u[l]);var h=(s[1]+s[0])/2,c=[h,h];c[l]=u[l];return{x:u[0],y:u[1],rotation:t.rotation,cursorPoint:c,tooltipOption:[{verticalAlign:"middle"},{align:"center"}][l]}},e}(DR);function HR(t,e){var n={};return n[e.dim+"AxisIndex"]=e.index,t.getCartesian(n)}var YR={line:function(t,e,n){return{type:"Line",subPixelOptimize:!0,shape:BR([e,n[0]],[e,n[1]],UR(t))}},shadow:function(t,e,n){var i=Math.max(1,t.getBandWidth()),r=n[1]-n[0];return{type:"Rect",shape:FR([e-i/2,n[0]],[i,r],UR(t))}}};function UR(t){return"x"===t.dim?0:1}var XR=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="axisPointer",e.defaultOption={show:"auto",z:50,type:"line",snap:!1,triggerTooltip:!0,value:null,status:null,link:[],animation:null,animationDurationUpdate:200,lineStyle:{color:"#B9BEC9",width:1,type:"dashed"},shadowStyle:{color:"rgba(210,219,238,0.2)"},label:{show:!0,formatter:null,precision:"auto",margin:3,color:"#fff",padding:[5,7,5,7],backgroundColor:"auto",borderColor:null,borderWidth:0,borderRadius:3},handle:{show:!1,icon:"M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z",size:45,margin:50,color:"#333",shadowBlur:3,shadowColor:"#aaa",shadowOffsetX:0,shadowOffsetY:2,throttle:40}},e}(Ip),ZR=So(),jR=E;function qR(t,e,n){if(!r.node){var i=e.getZr();ZR(i).records||(ZR(i).records={}),function(t,e){if(ZR(t).initialized)return;function n(n,i){t.on(n,(function(n){var r=function(t){var e={showTip:[],hideTip:[]},n=function(i){var r=e[i.type];r?r.push(i):(i.dispatchAction=n,t.dispatchAction(i))};return{dispatchAction:n,pendings:e}}(e);jR(ZR(t).records,(function(t){t&&i(t,n,r.dispatchAction)})),function(t,e){var n,i=t.showTip.length,r=t.hideTip.length;i?n=t.showTip[i-1]:r&&(n=t.hideTip[r-1]);n&&(n.dispatchAction=null,e.dispatchAction(n))}(r.pendings,e)}))}ZR(t).initialized=!0,n("click",H($R,"click")),n("mousemove",H($R,"mousemove")),n("globalout",KR)}(i,e),(ZR(i).records[t]||(ZR(i).records[t]={})).handler=n}}function KR(t,e,n){t.handler("leave",null,n)}function $R(t,e,n,i){e.handler(t,n,i)}function JR(t,e){if(!r.node){var n=e.getZr();(ZR(n).records||{})[t]&&(ZR(n).records[t]=null)}}var QR=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=e.getComponent("tooltip"),r=t.get("triggerOn")||i&&i.get("triggerOn")||"mousemove|click";qR("axisPointer",n,(function(t,e,n){"none"!==r&&("leave"===t||r.indexOf(t)>=0)&&n({type:"updateAxisPointer",currTrigger:t,x:e&&e.offsetX,y:e&&e.offsetY})}))},e.prototype.remove=function(t,e){JR("axisPointer",e)},e.prototype.dispose=function(t,e){JR("axisPointer",e)},e.type="axisPointer",e}(fg);function tN(t,e){var n,i=[],r=t.seriesIndex;if(null==r||!(n=e.getSeriesByIndex(r)))return{point:[]};var o=n.getData(),a=wo(o,t);if(null==a||a<0||Y(a))return{point:[]};var s=o.getItemGraphicEl(a),l=n.coordinateSystem;if(n.getTooltipPosition)i=n.getTooltipPosition(a)||[];else if(l&&l.dataToPoint)if(t.isStacked){var u=l.getBaseAxis(),h=l.getOtherAxis(u).dim,c=u.dim,p="x"===h||"radius"===h?1:0,d=o.mapDimension(c),f=[];f[p]=o.get(d,a),f[1-p]=o.get(o.getCalculationInfo("stackResultDimension"),a),i=l.dataToPoint(f)||[]}else i=l.dataToPoint(o.getValues(z(l.dimensions,(function(t){return o.mapDimension(t)})),a))||[];else if(s){var g=s.getBoundingRect().clone();g.applyTransform(s.transform),i=[g.x+g.width/2,g.y+g.height/2]}return{point:i,el:s}}var eN=So();function nN(t,e,n){var i=t.currTrigger,r=[t.x,t.y],o=t,a=t.dispatchAction||W(n.dispatchAction,n),s=e.getComponent("axisPointer").coordSysAxesInfo;if(s){sN(r)&&(r=tN({seriesIndex:o.seriesIndex,dataIndex:o.dataIndex},e).point);var l=sN(r),u=o.axesInfo,h=s.axesInfo,c="leave"===i||sN(r),p={},d={},f={list:[],map:{}},g={showPointer:H(rN,d),showTooltip:H(oN,f)};E(s.coordSysMap,(function(t,e){var n=l||t.containPoint(r);E(s.coordSysAxesInfo[e],(function(t,e){var i=t.axis,o=function(t,e){for(var n=0;n<(t||[]).length;n++){var i=t[n];if(e.axis.dim===i.axisDim&&e.axis.model.componentIndex===i.axisIndex)return i}}(u,t);if(!c&&n&&(!u||o)){var a=o&&o.value;null!=a||l||(a=i.pointToData(r)),null!=a&&iN(t,a,g,!1,p)}}))}));var y={};return E(h,(function(t,e){var n=t.linkGroup;n&&!d[e]&&E(n.axesInfo,(function(e,i){var r=d[i];if(e!==t&&r){var o=r.value;n.mapper&&(o=t.axis.scale.parse(n.mapper(o,aN(e),aN(t)))),y[t.key]=o}}))})),E(y,(function(t,e){iN(h[e],t,g,!0,p)})),function(t,e,n){var i=n.axesInfo=[];E(e,(function(e,n){var r=e.axisPointerModel.option,o=t[n];o?(!e.useHandle&&(r.status="show"),r.value=o.value,r.seriesDataIndices=(o.payloadBatch||[]).slice()):!e.useHandle&&(r.status="hide"),"show"===r.status&&i.push({axisDim:e.axis.dim,axisIndex:e.axis.model.componentIndex,value:r.value})}))}(d,h,p),function(t,e,n,i){if(sN(e)||!t.list.length)return void i({type:"hideTip"});var r=((t.list[0].dataByAxis[0]||{}).seriesDataIndices||[])[0]||{};i({type:"showTip",escapeConnect:!0,x:e[0],y:e[1],tooltipOption:n.tooltipOption,position:n.position,dataIndexInside:r.dataIndexInside,dataIndex:r.dataIndex,seriesIndex:r.seriesIndex,dataByCoordSys:t.list})}(f,r,t,a),function(t,e,n){var i=n.getZr(),r="axisPointerLastHighlights",o=eN(i)[r]||{},a=eN(i)[r]={};E(t,(function(t,e){var n=t.axisPointerModel.option;"show"===n.status&&E(n.seriesDataIndices,(function(t){var e=t.seriesIndex+" | "+t.dataIndex;a[e]=t}))}));var s=[],l=[];E(o,(function(t,e){!a[e]&&l.push(t)})),E(a,(function(t,e){!o[e]&&s.push(t)})),l.length&&n.dispatchAction({type:"downplay",escapeConnect:!0,notBlur:!0,batch:l}),s.length&&n.dispatchAction({type:"highlight",escapeConnect:!0,notBlur:!0,batch:s})}(h,0,n),p}}function iN(t,e,n,i,r){var o=t.axis;if(!o.scale.isBlank()&&o.containData(e))if(t.involveSeries){var a=function(t,e){var n=e.axis,i=n.dim,r=t,o=[],a=Number.MAX_VALUE,s=-1;return E(e.seriesModels,(function(e,l){var u,h,c=e.getData().mapDimensionsAll(i);if(e.getAxisTooltipData){var p=e.getAxisTooltipData(c,t,n);h=p.dataIndices,u=p.nestestValue}else{if(!(h=e.getData().indicesOfNearest(c[0],t,"category"===n.type?.5:null)).length)return;u=e.getData().get(c[0],h[0])}if(null!=u&&isFinite(u)){var d=t-u,f=Math.abs(d);f<=a&&((f<a||d>=0&&s<0)&&(a=f,s=d,r=u,o.length=0),E(h,(function(t){o.push({seriesIndex:e.seriesIndex,dataIndexInside:t,dataIndex:e.getData().getRawIndex(t)})})))}})),{payloadBatch:o,snapToValue:r}}(e,t),s=a.payloadBatch,l=a.snapToValue;s[0]&&null==r.seriesIndex&&A(r,s[0]),!i&&t.snap&&o.containData(l)&&null!=l&&(e=l),n.showPointer(t,e,s),n.showTooltip(t,a,l)}else n.showPointer(t,e)}function rN(t,e,n,i){t[e.key]={value:n,payloadBatch:i}}function oN(t,e,n,i){var r=n.payloadBatch,o=e.axis,a=o.model,s=e.axisPointerModel;if(e.triggerTooltip&&r.length){var l=e.coordSys.model,u=KM(l),h=t.map[u];h||(h=t.map[u]={coordSysId:l.id,coordSysIndex:l.componentIndex,coordSysType:l.type,coordSysMainType:l.mainType,dataByAxis:[]},t.list.push(h)),h.dataByAxis.push({axisDim:o.dim,axisIndex:a.componentIndex,axisType:a.type,axisId:a.id,value:i,valueLabelOpt:{precision:s.get(["label","precision"]),formatter:s.get(["label","formatter"])},seriesDataIndices:r.slice()})}}function aN(t){var e=t.axis.model,n={},i=n.axisDim=t.axis.dim;return n.axisIndex=n[i+"AxisIndex"]=e.componentIndex,n.axisName=n[i+"AxisName"]=e.name,n.axisId=n[i+"AxisId"]=e.id,n}function sN(t){return!t||null==t[0]||isNaN(t[0])||null==t[1]||isNaN(t[1])}function lN(t){JM.registerAxisPointerClass("CartesianAxisPointer",WR),t.registerComponentModel(XR),t.registerComponentView(QR),t.registerPreprocessor((function(t){if(t){(!t.axisPointer||0===t.axisPointer.length)&&(t.axisPointer={});var e=t.axisPointer.link;e&&!Y(e)&&(t.axisPointer.link=[e])}})),t.registerProcessor(t.PRIORITY.PROCESSOR.STATISTIC,(function(t,e){t.getComponent("axisPointer").coordSysAxesInfo=UM(t,e)})),t.registerAction({type:"updateAxisPointer",event:"updateAxisPointer",update:":updateAxisPointer"},nN)}var uN=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.makeElOption=function(t,e,n,i,r){var o=n.axis;"angle"===o.dim&&(this.animationThreshold=Math.PI/18);var a=o.polar,s=a.getOtherAxis(o).getExtent(),l=o.dataToCoord(e),u=i.get("type");if(u&&"none"!==u){var h=RR(i),c=hN[u](o,a,l,s);c.style=h,t.graphicKey=c.type,t.pointer=c}var p=function(t,e,n,i,r){var o=e.axis,a=o.dataToCoord(t),s=i.getAngleAxis().getExtent()[0];s=s/180*Math.PI;var l,u,h,c=i.getRadiusAxis().getExtent();if("radius"===o.dim){var p=[1,0,0,1,0,0];zi(p,p,s),Ei(p,p,[i.cx,i.cy]),l=Ih([a,-r],p);var d=e.getModel("axisLabel").get("rotate")||0,f=BM.innerTextLayout(s,d*Math.PI/180,-1);u=f.textAlign,h=f.textVerticalAlign}else{var g=c[1];l=i.coordToPoint([g+r,a]);var y=i.cx,v=i.cy;u=Math.abs(l[0]-y)/g<.3?"center":l[0]>y?"left":"right",h=Math.abs(l[1]-v)/g<.3?"middle":l[1]>v?"top":"bottom"}return{position:l,align:u,verticalAlign:h}}(e,n,0,a,i.get(["label","margin"]));NR(t,n,i,r,p)},e}(DR);var hN={line:function(t,e,n,i){return"angle"===t.dim?{type:"Line",shape:BR(e.coordToPoint([i[0],n]),e.coordToPoint([i[1],n]))}:{type:"Circle",shape:{cx:e.cx,cy:e.cy,r:n}}},shadow:function(t,e,n,i){var r=Math.max(1,t.getBandWidth()),o=Math.PI/180;return"angle"===t.dim?{type:"Sector",shape:GR(e.cx,e.cy,i[0],i[1],(-n-r/2)*o,(r/2-n)*o)}:{type:"Sector",shape:GR(e.cx,e.cy,n-r/2,n+r/2,0,2*Math.PI)}}},cN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.findAxisModel=function(t){var e;return this.ecModel.eachComponent(t,(function(t){t.getCoordSysModel()===this&&(e=t)}),this),e},e.type="polar",e.dependencies=["radiusAxis","angleAxis"],e.defaultOption={z:0,center:["50%","50%"],radius:"80%"},e}(Ip),pN=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.getCoordSysModel=function(){return this.getReferringComponents("polar",Co).models[0]},e.type="polarAxis",e}(Ip);R(pN,h_);var dN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="angleAxis",e}(pN),fN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="radiusAxis",e}(pN),gN=function(t){function e(e,n){return t.call(this,"radius",e,n)||this}return n(e,t),e.prototype.pointToData=function(t,e){return this.polar.pointToData(t,e)["radius"===this.dim?0:1]},e}(G_);gN.prototype.dataToRadius=G_.prototype.dataToCoord,gN.prototype.radiusToData=G_.prototype.coordToData;var yN=So(),vN=function(t){function e(e,n){return t.call(this,"angle",e,n||[0,360])||this}return n(e,t),e.prototype.pointToData=function(t,e){return this.polar.pointToData(t,e)["radius"===this.dim?0:1]},e.prototype.calculateCategoryInterval=function(){var t=this,e=t.getLabelModel(),n=t.scale,i=n.getExtent(),r=n.count();if(i[1]-i[0]<1)return 0;var o=i[0],a=t.dataToCoord(o+1)-t.dataToCoord(o),s=Math.abs(a),l=cr(null==o?"":o+"",e.getFont(),"center","top"),u=Math.max(l.height,7)/s;isNaN(u)&&(u=1/0);var h=Math.max(0,Math.floor(u)),c=yN(t.model),p=c.lastAutoInterval,d=c.lastTickCount;return null!=p&&null!=d&&Math.abs(p-h)<=1&&Math.abs(d-r)<=1&&p>h?h=p:(c.lastTickCount=r,c.lastAutoInterval=h),h},e}(G_);vN.prototype.dataToAngle=G_.prototype.dataToCoord,vN.prototype.angleToData=G_.prototype.coordToData;var mN=["radius","angle"],xN=function(){function t(t){this.dimensions=mN,this.type="polar",this.cx=0,this.cy=0,this._radiusAxis=new gN,this._angleAxis=new vN,this.axisPointerEnabled=!0,this.name=t||"",this._radiusAxis.polar=this._angleAxis.polar=this}return t.prototype.containPoint=function(t){var e=this.pointToCoord(t);return this._radiusAxis.contain(e[0])&&this._angleAxis.contain(e[1])},t.prototype.containData=function(t){return this._radiusAxis.containData(t[0])&&this._angleAxis.containData(t[1])},t.prototype.getAxis=function(t){return this["_"+t+"Axis"]},t.prototype.getAxes=function(){return[this._radiusAxis,this._angleAxis]},t.prototype.getAxesByScale=function(t){var e=[],n=this._angleAxis,i=this._radiusAxis;return n.scale.type===t&&e.push(n),i.scale.type===t&&e.push(i),e},t.prototype.getAngleAxis=function(){return this._angleAxis},t.prototype.getRadiusAxis=function(){return this._radiusAxis},t.prototype.getOtherAxis=function(t){var e=this._angleAxis;return t===e?this._radiusAxis:e},t.prototype.getBaseAxis=function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAngleAxis()},t.prototype.getTooltipAxes=function(t){var e=null!=t&&"auto"!==t?this.getAxis(t):this.getBaseAxis();return{baseAxes:[e],otherAxes:[this.getOtherAxis(e)]}},t.prototype.dataToPoint=function(t,e){return this.coordToPoint([this._radiusAxis.dataToRadius(t[0],e),this._angleAxis.dataToAngle(t[1],e)])},t.prototype.pointToData=function(t,e){var n=this.pointToCoord(t);return[this._radiusAxis.radiusToData(n[0],e),this._angleAxis.angleToData(n[1],e)]},t.prototype.pointToCoord=function(t){var e=t[0]-this.cx,n=t[1]-this.cy,i=this.getAngleAxis(),r=i.getExtent(),o=Math.min(r[0],r[1]),a=Math.max(r[0],r[1]);i.inverse?o=a-360:a=o+360;var s=Math.sqrt(e*e+n*n);e/=s,n/=s;for(var l=Math.atan2(-n,e)/Math.PI*180,u=l<o?1:-1;l<o||l>a;)l+=360*u;return[s,l]},t.prototype.coordToPoint=function(t){var e=t[0],n=t[1]/180*Math.PI;return[Math.cos(n)*e+this.cx,-Math.sin(n)*e+this.cy]},t.prototype.getArea=function(){var t=this.getAngleAxis(),e=this.getRadiusAxis().getExtent().slice();e[0]>e[1]&&e.reverse();var n=t.getExtent(),i=Math.PI/180;return{cx:this.cx,cy:this.cy,r0:e[0],r:e[1],startAngle:-n[0]*i,endAngle:-n[1]*i,clockwise:t.inverse,contain:function(t,e){var n=t-this.cx,i=e-this.cy,r=n*n+i*i-1e-4,o=this.r,a=this.r0;return r<=o*o&&r>=a*a}}},t.prototype.convertToPixel=function(t,e,n){return _N(e)===this?this.dataToPoint(n):null},t.prototype.convertFromPixel=function(t,e,n){return _N(e)===this?this.pointToData(n):null},t}();function _N(t){var e=t.seriesModel,n=t.polarModel;return n&&n.coordinateSystem||e&&e.coordinateSystem}function bN(t,e){var n=this,i=n.getAngleAxis(),r=n.getRadiusAxis();if(i.scale.setExtent(1/0,-1/0),r.scale.setExtent(1/0,-1/0),t.eachSeries((function(t){if(t.coordinateSystem===n){var e=t.getData();E(u_(e,"radius"),(function(t){r.scale.unionExtentFromData(e,t)})),E(u_(e,"angle"),(function(t){i.scale.unionExtentFromData(e,t)}))}})),n_(i.scale,i.model),n_(r.scale,r.model),"category"===i.type&&!i.onBand){var o=i.getExtent(),a=360/i.scale.count();i.inverse?o[1]+=a:o[1]-=a,i.setExtent(o[0],o[1])}}function wN(t,e){if(t.type=e.get("type"),t.scale=i_(e),t.onBand=e.get("boundaryGap")&&"category"===t.type,t.inverse=e.get("inverse"),function(t){return"angleAxis"===t.mainType}(e)){t.inverse=t.inverse!==e.get("clockwise");var n=e.get("startAngle");t.setExtent(n,n+(t.inverse?-360:360))}e.axis=t,t.model=e}var SN={dimensions:mN,create:function(t,e){var n=[];return t.eachComponent("polar",(function(t,i){var r=new xN(i+"");r.update=bN;var o=r.getRadiusAxis(),a=r.getAngleAxis(),s=t.findAxisModel("radiusAxis"),l=t.findAxisModel("angleAxis");wN(o,s),wN(a,l),function(t,e,n){var i=e.get("center"),r=n.getWidth(),o=n.getHeight();t.cx=Er(i[0],r),t.cy=Er(i[1],o);var a=t.getRadiusAxis(),s=Math.min(r,o)/2,l=e.get("radius");null==l?l=[0,"100%"]:Y(l)||(l=[0,l]);var u=[Er(l[0],s),Er(l[1],s)];a.inverse?a.setExtent(u[1],u[0]):a.setExtent(u[0],u[1])}(r,t,e),n.push(r),t.coordinateSystem=r,r.model=t})),t.eachSeries((function(t){if("polar"===t.get("coordinateSystem")){var e=t.getReferringComponents("polar",Co).models[0];0,t.coordinateSystem=e.coordinateSystem}})),n}},MN=["axisLine","axisLabel","axisTick","minorTick","splitLine","minorSplitLine","splitArea"];function IN(t,e,n){e[1]>e[0]&&(e=e.slice().reverse());var i=t.coordToPoint([e[0],n]),r=t.coordToPoint([e[1],n]);return{x1:i[0],y1:i[1],x2:r[0],y2:r[1]}}function TN(t){return t.getRadiusAxis().inverse?0:1}function CN(t){var e=t[0],n=t[t.length-1];e&&n&&Math.abs(Math.abs(e.coord-n.coord)-360)<1e-4&&t.pop()}var DN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.axisPointerClass="PolarAxisPointer",n}return n(e,t),e.prototype.render=function(t,e){if(this.group.removeAll(),t.get("show")){var n=t.axis,i=n.polar,r=i.getRadiusAxis().getExtent(),o=n.getTicksCoords(),a=n.getMinorTicksCoords(),s=z(n.getViewLabels(),(function(t){t=T(t);var e=n.scale,i="ordinal"===e.type?e.getRawOrdinalNumber(t.tickValue):t.tickValue;return t.coord=n.dataToCoord(i),t}));CN(s),CN(o),E(MN,(function(e){!t.get([e,"show"])||n.scale.isBlank()&&"axisLine"!==e||AN[e](this.group,t,i,o,a,r,s)}),this)}},e.type="angleAxis",e}(JM),AN={axisLine:function(t,e,n,i,r,o){var a,s=e.getModel(["axisLine","lineStyle"]),l=TN(n),u=l?0:1;(a=0===o[u]?new uu({shape:{cx:n.cx,cy:n.cy,r:o[l]},style:s.getLineStyle(),z2:1,silent:!0}):new Du({shape:{cx:n.cx,cy:n.cy,r:o[l],r0:o[u]},style:s.getLineStyle(),z2:1,silent:!0})).style.fill=null,t.add(a)},axisTick:function(t,e,n,i,r,o){var a=e.getModel("axisTick"),s=(a.get("inside")?-1:1)*a.get("length"),l=o[TN(n)],u=z(i,(function(t){return new Eu({shape:IN(n,[l,l+s],t.coord)})}));t.add(bh(u,{style:k(a.getModel("lineStyle").getLineStyle(),{stroke:e.get(["axisLine","lineStyle","color"])})}))},minorTick:function(t,e,n,i,r,o){if(r.length){for(var a=e.getModel("axisTick"),s=e.getModel("minorTick"),l=(a.get("inside")?-1:1)*s.get("length"),u=o[TN(n)],h=[],c=0;c<r.length;c++)for(var p=0;p<r[c].length;p++)h.push(new Eu({shape:IN(n,[u,u+l],r[c][p].coord)}));t.add(bh(h,{style:k(s.getModel("lineStyle").getLineStyle(),k(a.getLineStyle(),{stroke:e.get(["axisLine","lineStyle","color"])}))}))}},axisLabel:function(t,e,n,i,r,o,a){var s=e.getCategories(!0),l=e.getModel("axisLabel"),u=l.get("margin"),h=e.get("triggerEvent");E(a,(function(i,r){var a=l,c=i.tickValue,p=o[TN(n)],d=n.coordToPoint([p+u,i.coord]),f=n.cx,g=n.cy,y=Math.abs(d[0]-f)/p<.3?"center":d[0]>f?"left":"right",v=Math.abs(d[1]-g)/p<.3?"middle":d[1]>g?"top":"bottom";if(s&&s[c]){var m=s[c];q(m)&&m.textStyle&&(a=new pc(m.textStyle,l,l.ecModel))}var x=new As({silent:BM.isLabelSilent(e),style:Yh(a,{x:d[0],y:d[1],fill:a.getTextColor()||e.get(["axisLine","lineStyle","color"]),text:i.formattedLabel,align:y,verticalAlign:v})});if(t.add(x),h){var _=BM.makeAxisEventDataBase(e);_.targetType="axisLabel",_.value=i.rawLabel,Ws(x).eventData=_}}),this)},splitLine:function(t,e,n,i,r,o){var a=e.getModel("splitLine").getModel("lineStyle"),s=a.get("color"),l=0;s=s instanceof Array?s:[s];for(var u=[],h=0;h<i.length;h++){var c=l++%s.length;u[c]=u[c]||[],u[c].push(new Eu({shape:IN(n,o,i[h].coord)}))}for(h=0;h<u.length;h++)t.add(bh(u[h],{style:k({stroke:s[h%s.length]},a.getLineStyle()),silent:!0,z:e.get("z")}))},minorSplitLine:function(t,e,n,i,r,o){if(r.length){for(var a=e.getModel("minorSplitLine").getModel("lineStyle"),s=[],l=0;l<r.length;l++)for(var u=0;u<r[l].length;u++)s.push(new Eu({shape:IN(n,o,r[l][u].coord)}));t.add(bh(s,{style:a.getLineStyle(),silent:!0,z:e.get("z")}))}},splitArea:function(t,e,n,i,r,o){if(i.length){var a=e.getModel("splitArea").getModel("areaStyle"),s=a.get("color"),l=0;s=s instanceof Array?s:[s];for(var u=[],h=Math.PI/180,c=-i[0].coord*h,p=Math.min(o[0],o[1]),d=Math.max(o[0],o[1]),f=e.get("clockwise"),g=1,y=i.length;g<=y;g++){var v=g===y?i[0].coord:i[g].coord,m=l++%s.length;u[m]=u[m]||[],u[m].push(new Tu({shape:{cx:n.cx,cy:n.cy,r0:p,r:d,startAngle:c,endAngle:-v*h,clockwise:f},silent:!0})),c=-v*h}for(g=0;g<u.length;g++)t.add(bh(u[g],{style:k({fill:s[g%s.length]},a.getAreaStyle()),silent:!0}))}}},kN=["axisLine","axisTickLabel","axisName"],LN=["splitLine","splitArea","minorSplitLine"],PN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.axisPointerClass="PolarAxisPointer",n}return n(e,t),e.prototype.render=function(t,e){if(this.group.removeAll(),t.get("show")){var n=this._axisGroup,i=this._axisGroup=new Cr;this.group.add(i);var r=t.axis,o=r.polar,a=o.getAngleAxis(),s=r.getTicksCoords(),l=r.getMinorTicksCoords(),u=a.getExtent()[0],h=r.getExtent(),c=function(t,e,n){return{position:[t.cx,t.cy],rotation:n/180*Math.PI,labelDirection:-1,tickDirection:-1,nameDirection:1,labelRotate:e.getModel("axisLabel").get("rotate"),z2:1}}(o,t,u),p=new BM(t,c);E(kN,p.add,p),i.add(p.getGroup()),Dh(n,i,t),E(LN,(function(e){t.get([e,"show"])&&!r.scale.isBlank()&&ON[e](this.group,t,o,u,h,s,l)}),this)}},e.type="radiusAxis",e}(JM),ON={splitLine:function(t,e,n,i,r,o){var a=e.getModel("splitLine").getModel("lineStyle"),s=a.get("color"),l=0;s=s instanceof Array?s:[s];for(var u=[],h=0;h<o.length;h++){var c=l++%s.length;u[c]=u[c]||[],u[c].push(new uu({shape:{cx:n.cx,cy:n.cy,r:o[h].coord}}))}for(h=0;h<u.length;h++)t.add(bh(u[h],{style:k({stroke:s[h%s.length],fill:null},a.getLineStyle()),silent:!0}))},minorSplitLine:function(t,e,n,i,r,o,a){if(a.length){for(var s=e.getModel("minorSplitLine").getModel("lineStyle"),l=[],u=0;u<a.length;u++)for(var h=0;h<a[u].length;h++)l.push(new uu({shape:{cx:n.cx,cy:n.cy,r:a[u][h].coord}}));t.add(bh(l,{style:k({fill:null},s.getLineStyle()),silent:!0}))}},splitArea:function(t,e,n,i,r,o){if(o.length){var a=e.getModel("splitArea").getModel("areaStyle"),s=a.get("color"),l=0;s=s instanceof Array?s:[s];for(var u=[],h=o[0].coord,c=1;c<o.length;c++){var p=l++%s.length;u[p]=u[p]||[],u[p].push(new Tu({shape:{cx:n.cx,cy:n.cy,r0:h,r:o[c].coord,startAngle:0,endAngle:2*Math.PI},silent:!0})),h=o[c].coord}for(c=0;c<u.length;c++)t.add(bh(u[c],{style:k({fill:s[c%s.length]},a.getAreaStyle()),silent:!0}))}}};function RN(t){return t.get("stack")||"__ec_stack_"+t.seriesIndex}function NN(t,e){return e.dim+t.model.componentIndex}function EN(t,e,n){var i={},r=function(t){var e={};E(t,(function(t,n){var i=t.getData(),r=t.coordinateSystem,o=r.getBaseAxis(),a=NN(r,o),s=o.getExtent(),l="category"===o.type?o.getBandWidth():Math.abs(s[1]-s[0])/i.count(),u=e[a]||{bandWidth:l,remainedWidth:l,autoWidthCount:0,categoryGap:"20%",gap:"30%",stacks:{}},h=u.stacks;e[a]=u;var c=RN(t);h[c]||u.autoWidthCount++,h[c]=h[c]||{width:0,maxWidth:0};var p=Er(t.get("barWidth"),l),d=Er(t.get("barMaxWidth"),l),f=t.get("barGap"),g=t.get("barCategoryGap");p&&!h[c].width&&(p=Math.min(u.remainedWidth,p),h[c].width=p,u.remainedWidth-=p),d&&(h[c].maxWidth=d),null!=f&&(u.gap=f),null!=g&&(u.categoryGap=g)}));var n={};return E(e,(function(t,e){n[e]={};var i=t.stacks,r=t.bandWidth,o=Er(t.categoryGap,r),a=Er(t.gap,1),s=t.remainedWidth,l=t.autoWidthCount,u=(s-o)/(l+(l-1)*a);u=Math.max(u,0),E(i,(function(t,e){var n=t.maxWidth;n&&n<u&&(n=Math.min(n,s),t.width&&(n=Math.min(n,t.width)),s-=n,t.width=n,l--)})),u=(s-o)/(l+(l-1)*a),u=Math.max(u,0);var h,c=0;E(i,(function(t,e){t.width||(t.width=u),h=t,c+=t.width*(1+a)})),h&&(c-=h.width*a);var p=-c/2;E(i,(function(t,i){n[e][i]=n[e][i]||{offset:p,width:t.width},p+=t.width*(1+a)}))})),n}(B(e.getSeriesByType(t),(function(t){return!e.isSeriesFiltered(t)&&t.coordinateSystem&&"polar"===t.coordinateSystem.type})));e.eachSeriesByType(t,(function(t){if("polar"===t.coordinateSystem.type){var e=t.getData(),n=t.coordinateSystem,o=n.getBaseAxis(),a=NN(n,o),s=RN(t),l=r[a][s],u=l.offset,h=l.width,c=n.getOtherAxis(o),p=t.coordinateSystem.cx,d=t.coordinateSystem.cy,f=t.get("barMinHeight")||0,g=t.get("barMinAngle")||0;i[s]=i[s]||[];for(var y=e.mapDimension(c.dim),v=e.mapDimension(o.dim),m=tx(e,y),x="radius"!==o.dim||!t.get("roundCap",!0),_=c.dataToCoord(0),b=0,w=e.count();b<w;b++){var S=e.get(y,b),M=e.get(v,b),I=S>=0?"p":"n",T=_;m&&(i[s][M]||(i[s][M]={p:_,n:_}),T=i[s][M][I]);var C=void 0,D=void 0,A=void 0,k=void 0;if("radius"===c.dim){var L=c.dataToCoord(S)-_,P=o.dataToCoord(M);Math.abs(L)<f&&(L=(L<0?-1:1)*f),C=T,D=T+L,k=(A=P-u)-h,m&&(i[s][M][I]=D)}else{var O=c.dataToCoord(S,x)-_,R=o.dataToCoord(M);Math.abs(O)<g&&(O=(O<0?-1:1)*g),D=(C=R+u)+h,A=T,k=T+O,m&&(i[s][M][I]=k)}e.setItemLayout(b,{cx:p,cy:d,r0:C,r:D,startAngle:-A*Math.PI/180,endAngle:-k*Math.PI/180,clockwise:A>=k})}}}))}var zN={startAngle:90,clockwise:!0,splitNumber:12,axisLabel:{rotate:0}},VN={splitNumber:5},BN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="polar",e}(fg);function FN(t,e){e=e||{};var n=t.coordinateSystem,i=t.axis,r={},o=i.position,a=i.orient,s=n.getRect(),l=[s.x,s.x+s.width,s.y,s.y+s.height],u={horizontal:{top:l[2],bottom:l[3]},vertical:{left:l[0],right:l[1]}};r.position=["vertical"===a?u.vertical[o]:l[0],"horizontal"===a?u.horizontal[o]:l[3]];r.rotation=Math.PI/2*{horizontal:0,vertical:1}[a];r.labelDirection=r.tickDirection=r.nameDirection={top:-1,bottom:1,right:1,left:-1}[o],t.get(["axisTick","inside"])&&(r.tickDirection=-r.tickDirection),it(e.labelInside,t.get(["axisLabel","inside"]))&&(r.labelDirection=-r.labelDirection);var h=e.rotate;return null==h&&(h=t.get(["axisLabel","rotate"])),r.labelRotation="top"===o?-h:h,r.z2=1,r}var GN=["axisLine","axisTickLabel","axisName"],WN=["splitArea","splitLine"],HN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.axisPointerClass="SingleAxisPointer",n}return n(e,t),e.prototype.render=function(e,n,i,r){var o=this.group;o.removeAll();var a=this._axisGroup;this._axisGroup=new Cr;var s=FN(e),l=new BM(e,s);E(GN,l.add,l),o.add(this._axisGroup),o.add(l.getGroup()),E(WN,(function(t){e.get([t,"show"])&&YN[t](this,this.group,this._axisGroup,e)}),this),Dh(a,this._axisGroup,e),t.prototype.render.call(this,e,n,i,r)},e.prototype.remove=function(){eI(this)},e.type="singleAxis",e}(JM),YN={splitLine:function(t,e,n,i){var r=i.axis;if(!r.scale.isBlank()){var o=i.getModel("splitLine"),a=o.getModel("lineStyle"),s=a.get("color");s=s instanceof Array?s:[s];for(var l=i.coordinateSystem.getRect(),u=r.isHorizontal(),h=[],c=0,p=r.getTicksCoords({tickModel:o}),d=[],f=[],g=0;g<p.length;++g){var y=r.toGlobalCoord(p[g].coord);u?(d[0]=y,d[1]=l.y,f[0]=y,f[1]=l.y+l.height):(d[0]=l.x,d[1]=y,f[0]=l.x+l.width,f[1]=y);var v=c++%s.length;h[v]=h[v]||[],h[v].push(new Eu({subPixelOptimize:!0,shape:{x1:d[0],y1:d[1],x2:f[0],y2:f[1]},silent:!0}))}var m=a.getLineStyle(["color"]);for(g=0;g<h.length;++g)e.add(bh(h[g],{style:k({stroke:s[g%s.length]},m),silent:!0}))}},splitArea:function(t,e,n,i){tI(t,n,i,i)}},UN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.getCoordSysModel=function(){return this},e.type="singleAxis",e.layoutMode="box",e.defaultOption={left:"5%",top:"5%",right:"5%",bottom:"5%",type:"value",position:"bottom",orient:"horizontal",axisLine:{show:!0,lineStyle:{width:1,type:"solid"}},tooltip:{show:!0},axisTick:{show:!0,length:6,lineStyle:{width:1}},axisLabel:{show:!0,interval:"auto"},splitLine:{show:!0,lineStyle:{type:"dashed",opacity:.2}}},e}(Ip);R(UN,h_.prototype);var XN=function(t){function e(e,n,i,r,o){var a=t.call(this,e,n,i)||this;return a.type=r||"value",a.position=o||"bottom",a}return n(e,t),e.prototype.isHorizontal=function(){var t=this.position;return"top"===t||"bottom"===t},e.prototype.pointToData=function(t,e){return this.coordinateSystem.pointToData(t)[0]},e}(G_),ZN=["single"],jN=function(){function t(t,e,n){this.type="single",this.dimension="single",this.dimensions=ZN,this.axisPointerEnabled=!0,this.model=t,this._init(t,e,n)}return t.prototype._init=function(t,e,n){var i=this.dimension,r=new XN(i,i_(t),[0,0],t.get("type"),t.get("position")),o="category"===r.type;r.onBand=o&&t.get("boundaryGap"),r.inverse=t.get("inverse"),r.orient=t.get("orient"),t.axis=r,r.model=t,r.coordinateSystem=this,this._axis=r},t.prototype.update=function(t,e){t.eachSeries((function(t){if(t.coordinateSystem===this){var e=t.getData();E(e.mapDimensionsAll(this.dimension),(function(t){this._axis.scale.unionExtentFromData(e,t)}),this),n_(this._axis.scale,this._axis.model)}}),this)},t.prototype.resize=function(t,e){this._rect=mp({left:t.get("left"),top:t.get("top"),right:t.get("right"),bottom:t.get("bottom"),width:t.get("width"),height:t.get("height")},{width:e.getWidth(),height:e.getHeight()}),this._adjustAxis()},t.prototype.getRect=function(){return this._rect},t.prototype._adjustAxis=function(){var t=this._rect,e=this._axis,n=e.isHorizontal(),i=n?[0,t.width]:[0,t.height],r=e.reverse?1:0;e.setExtent(i[r],i[1-r]),this._updateAxisTransform(e,n?t.x:t.y)},t.prototype._updateAxisTransform=function(t,e){var n=t.getExtent(),i=n[0]+n[1],r=t.isHorizontal();t.toGlobalCoord=r?function(t){return t+e}:function(t){return i-t+e},t.toLocalCoord=r?function(t){return t-e}:function(t){return i-t+e}},t.prototype.getAxis=function(){return this._axis},t.prototype.getBaseAxis=function(){return this._axis},t.prototype.getAxes=function(){return[this._axis]},t.prototype.getTooltipAxes=function(){return{baseAxes:[this.getAxis()],otherAxes:[]}},t.prototype.containPoint=function(t){var e=this.getRect(),n=this.getAxis();return"horizontal"===n.orient?n.contain(n.toLocalCoord(t[0]))&&t[1]>=e.y&&t[1]<=e.y+e.height:n.contain(n.toLocalCoord(t[1]))&&t[0]>=e.y&&t[0]<=e.y+e.height},t.prototype.pointToData=function(t){var e=this.getAxis();return[e.coordToData(e.toLocalCoord(t["horizontal"===e.orient?0:1]))]},t.prototype.dataToPoint=function(t){var e=this.getAxis(),n=this.getRect(),i=[],r="horizontal"===e.orient?0:1;return t instanceof Array&&(t=t[0]),i[r]=e.toGlobalCoord(e.dataToCoord(+t)),i[1-r]=0===r?n.y+n.height/2:n.x+n.width/2,i},t.prototype.convertToPixel=function(t,e,n){return qN(e)===this?this.dataToPoint(n):null},t.prototype.convertFromPixel=function(t,e,n){return qN(e)===this?this.pointToData(n):null},t}();function qN(t){var e=t.seriesModel,n=t.singleAxisModel;return n&&n.coordinateSystem||e&&e.coordinateSystem}var KN={create:function(t,e){var n=[];return t.eachComponent("singleAxis",(function(i,r){var o=new jN(i,t,e);o.name="single_"+r,o.resize(i,e),i.coordinateSystem=o,n.push(o)})),t.eachSeries((function(t){if("singleAxis"===t.get("coordinateSystem")){var e=t.getReferringComponents("singleAxis",Co).models[0];t.coordinateSystem=e&&e.coordinateSystem}})),n},dimensions:ZN},$N=["x","y"],JN=["width","height"],QN=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.makeElOption=function(t,e,n,i,r){var o=n.axis,a=o.coordinateSystem,s=nE(a,1-eE(o)),l=a.dataToPoint(e)[0],u=i.get("type");if(u&&"none"!==u){var h=RR(i),c=tE[u](o,l,s);c.style=h,t.graphicKey=c.type,t.pointer=c}VR(e,t,FN(n),n,i,r)},e.prototype.getHandleTransform=function(t,e,n){var i=FN(e,{labelInside:!1});i.labelMargin=n.get(["handle","margin"]);var r=zR(e.axis,t,i);return{x:r[0],y:r[1],rotation:i.rotation+(i.labelDirection<0?Math.PI:0)}},e.prototype.updateHandleTransform=function(t,e,n,i){var r=n.axis,o=r.coordinateSystem,a=eE(r),s=nE(o,a),l=[t.x,t.y];l[a]+=e[a],l[a]=Math.min(s[1],l[a]),l[a]=Math.max(s[0],l[a]);var u=nE(o,1-a),h=(u[1]+u[0])/2,c=[h,h];return c[a]=l[a],{x:l[0],y:l[1],rotation:t.rotation,cursorPoint:c,tooltipOption:{verticalAlign:"middle"}}},e}(DR),tE={line:function(t,e,n){return{type:"Line",subPixelOptimize:!0,shape:BR([e,n[0]],[e,n[1]],eE(t))}},shadow:function(t,e,n){var i=t.getBandWidth(),r=n[1]-n[0];return{type:"Rect",shape:FR([e-i/2,n[0]],[i,r],eE(t))}}};function eE(t){return t.isHorizontal()?0:1}function nE(t,e){var n=t.getRect();return[n[$N[e]],n[$N[e]]+n[JN[e]]]}var iE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="single",e}(fg);var rE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(e,n,i){var r=wp(e);t.prototype.init.apply(this,arguments),oE(e,r)},e.prototype.mergeOption=function(e){t.prototype.mergeOption.apply(this,arguments),oE(this.option,e)},e.prototype.getCellSize=function(){return this.option.cellSize},e.type="calendar",e.defaultOption={z:2,left:80,top:60,cellSize:20,orient:"horizontal",splitLine:{show:!0,lineStyle:{color:"#000",width:1,type:"solid"}},itemStyle:{color:"#fff",borderWidth:1,borderColor:"#ccc"},dayLabel:{show:!0,firstDay:0,position:"start",margin:"50%",color:"#000"},monthLabel:{show:!0,position:"start",margin:5,align:"center",formatter:null,color:"#000"},yearLabel:{show:!0,position:null,margin:30,formatter:null,color:"#ccc",fontFamily:"sans-serif",fontWeight:"bolder",fontSize:20}},e}(Ip);function oE(t,e){var n,i=t.cellSize;1===(n=Y(i)?i:t.cellSize=[i,i]).length&&(n[1]=n[0]);var r=z([0,1],(function(t){return function(t,e){return null!=t[gp[e][0]]||null!=t[gp[e][1]]&&null!=t[gp[e][2]]}(e,t)&&(n[t]="auto"),null!=n[t]&&"auto"!==n[t]}));bp(t,e,{type:"box",ignoreSize:r})}var aE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=this.group;i.removeAll();var r=t.coordinateSystem,o=r.getRangeInfo(),a=r.getOrient(),s=e.getLocaleModel();this._renderDayRect(t,o,i),this._renderLines(t,o,a,i),this._renderYearText(t,o,a,i),this._renderMonthText(t,s,a,i),this._renderWeekText(t,s,o,a,i)},e.prototype._renderDayRect=function(t,e,n){for(var i=t.coordinateSystem,r=t.getModel("itemStyle").getItemStyle(),o=i.getCellWidth(),a=i.getCellHeight(),s=e.start.time;s<=e.end.time;s=i.getNextNDay(s,1).time){var l=i.dataToRect([s],!1).tl,u=new Ts({shape:{x:l[0],y:l[1],width:o,height:a},cursor:"default",style:r});n.add(u)}},e.prototype._renderLines=function(t,e,n,i){var r=this,o=t.coordinateSystem,a=t.getModel(["splitLine","lineStyle"]).getLineStyle(),s=t.get(["splitLine","show"]),l=a.lineWidth;this._tlpoints=[],this._blpoints=[],this._firstDayOfMonth=[],this._firstDayPoints=[];for(var u=e.start,h=0;u.time<=e.end.time;h++){p(u.formatedDate),0===h&&(u=o.getDateInfo(e.start.y+"-"+e.start.m));var c=u.date;c.setMonth(c.getMonth()+1),u=o.getDateInfo(c)}function p(e){r._firstDayOfMonth.push(o.getDateInfo(e)),r._firstDayPoints.push(o.dataToRect([e],!1).tl);var l=r._getLinePointsOfOneWeek(t,e,n);r._tlpoints.push(l[0]),r._blpoints.push(l[l.length-1]),s&&r._drawSplitline(l,a,i)}p(o.getNextNDay(e.end.time,1).formatedDate),s&&this._drawSplitline(r._getEdgesPoints(r._tlpoints,l,n),a,i),s&&this._drawSplitline(r._getEdgesPoints(r._blpoints,l,n),a,i)},e.prototype._getEdgesPoints=function(t,e,n){var i=[t[0].slice(),t[t.length-1].slice()],r="horizontal"===n?0:1;return i[0][r]=i[0][r]-e/2,i[1][r]=i[1][r]+e/2,i},e.prototype._drawSplitline=function(t,e,n){var i=new Ou({z2:20,shape:{points:t},style:e});n.add(i)},e.prototype._getLinePointsOfOneWeek=function(t,e,n){for(var i=t.coordinateSystem,r=i.getDateInfo(e),o=[],a=0;a<7;a++){var s=i.getNextNDay(r.time,a),l=i.dataToRect([s.time],!1);o[2*s.day]=l.tl,o[2*s.day+1]=l["horizontal"===n?"bl":"tr"]}return o},e.prototype._formatterLabel=function(t,e){return X(t)&&t?(n=t,E(e,(function(t,e){n=n.replace("{"+e+"}",i?op(t):t)})),n):U(t)?t(e):e.nameMap;var n,i},e.prototype._yearTextPositionControl=function(t,e,n,i,r){var o=e[0],a=e[1],s=["center","bottom"];"bottom"===i?(a+=r,s=["center","top"]):"left"===i?o-=r:"right"===i?(o+=r,s=["center","top"]):a-=r;var l=0;return"left"!==i&&"right"!==i||(l=Math.PI/2),{rotation:l,x:o,y:a,style:{align:s[0],verticalAlign:s[1]}}},e.prototype._renderYearText=function(t,e,n,i){var r=t.getModel("yearLabel");if(r.get("show")){var o=r.get("margin"),a=r.get("position");a||(a="horizontal"!==n?"top":"left");var s=[this._tlpoints[this._tlpoints.length-1],this._blpoints[0]],l=(s[0][0]+s[1][0])/2,u=(s[0][1]+s[1][1])/2,h="horizontal"===n?0:1,c={top:[l,s[h][1]],bottom:[l,s[1-h][1]],left:[s[1-h][0],u],right:[s[h][0],u]},p=e.start.y;+e.end.y>+e.start.y&&(p=p+"-"+e.end.y);var d=r.get("formatter"),f={start:e.start.y,end:e.end.y,nameMap:p},g=this._formatterLabel(d,f),y=new As({z2:30,style:Yh(r,{text:g})});y.attr(this._yearTextPositionControl(y,c[a],n,a,o)),i.add(y)}},e.prototype._monthTextPositionControl=function(t,e,n,i,r){var o="left",a="top",s=t[0],l=t[1];return"horizontal"===n?(l+=r,e&&(o="center"),"start"===i&&(a="bottom")):(s+=r,e&&(a="middle"),"start"===i&&(o="right")),{x:s,y:l,align:o,verticalAlign:a}},e.prototype._renderMonthText=function(t,e,n,i){var r=t.getModel("monthLabel");if(r.get("show")){var o=r.get("nameMap"),a=r.get("margin"),s=r.get("position"),l=r.get("align"),u=[this._tlpoints,this._blpoints];o&&!X(o)||(o&&(e=Sc(o)||e),o=e.get(["time","monthAbbr"])||[]);var h="start"===s?0:1,c="horizontal"===n?0:1;a="start"===s?-a:a;for(var p="center"===l,d=0;d<u[h].length-1;d++){var f=u[h][d].slice(),g=this._firstDayOfMonth[d];if(p){var y=this._firstDayPoints[d];f[c]=(y[c]+u[0][d+1][c])/2}var v=r.get("formatter"),m=o[+g.m-1],x={yyyy:g.y,yy:(g.y+"").slice(2),MM:g.m,M:+g.m,nameMap:m},_=this._formatterLabel(v,x),b=new As({z2:30,style:A(Yh(r,{text:_}),this._monthTextPositionControl(f,p,n,s,a))});i.add(b)}}},e.prototype._weekTextPositionControl=function(t,e,n,i,r){var o="center",a="middle",s=t[0],l=t[1],u="start"===n;return"horizontal"===e?(s=s+i+(u?1:-1)*r[0]/2,o=u?"right":"left"):(l=l+i+(u?1:-1)*r[1]/2,a=u?"bottom":"top"),{x:s,y:l,align:o,verticalAlign:a}},e.prototype._renderWeekText=function(t,e,n,i,r){var o=t.getModel("dayLabel");if(o.get("show")){var a=t.coordinateSystem,s=o.get("position"),l=o.get("nameMap"),u=o.get("margin"),h=a.getFirstDayOfWeek();if(!l||X(l))l&&(e=Sc(l)||e),l=e.get(["time","dayOfWeekShort"])||z(e.get(["time","dayOfWeekAbbr"]),(function(t){return t[0]}));var c=a.getNextNDay(n.end.time,7-n.lweek).time,p=[a.getCellWidth(),a.getCellHeight()];u=Er(u,Math.min(p[1],p[0])),"start"===s&&(c=a.getNextNDay(n.start.time,-(7+n.fweek)).time,u=-u);for(var d=0;d<7;d++){var f,g=a.getNextNDay(c,d),y=a.dataToRect([g.time],!1).center;f=Math.abs((d+h)%7);var v=new As({z2:30,style:A(Yh(o,{text:l[f]}),this._weekTextPositionControl(y,i,s,u,p))});r.add(v)}}},e.type="calendar",e}(fg),sE=864e5,lE=function(){function t(e,n,i){this.type="calendar",this.dimensions=t.dimensions,this.getDimensionsInfo=t.getDimensionsInfo,this._model=e}return t.getDimensionsInfo=function(){return[{name:"time",type:"time"},"value"]},t.prototype.getRangeInfo=function(){return this._rangeInfo},t.prototype.getModel=function(){return this._model},t.prototype.getRect=function(){return this._rect},t.prototype.getCellWidth=function(){return this._sw},t.prototype.getCellHeight=function(){return this._sh},t.prototype.getOrient=function(){return this._orient},t.prototype.getFirstDayOfWeek=function(){return this._firstDayOfWeek},t.prototype.getDateInfo=function(t){var e=(t=jr(t)).getFullYear(),n=t.getMonth()+1,i=n<10?"0"+n:""+n,r=t.getDate(),o=r<10?"0"+r:""+r,a=t.getDay();return{y:e+"",m:i,d:o,day:a=Math.abs((a+7-this.getFirstDayOfWeek())%7),time:t.getTime(),formatedDate:e+"-"+i+"-"+o,date:t}},t.prototype.getNextNDay=function(t,e){return 0===(e=e||0)||(t=new Date(this.getDateInfo(t).time)).setDate(t.getDate()+e),this.getDateInfo(t)},t.prototype.update=function(t,e){this._firstDayOfWeek=+this._model.getModel("dayLabel").get("firstDay"),this._orient=this._model.get("orient"),this._lineWidth=this._model.getModel("itemStyle").getItemStyle().lineWidth||0,this._rangeInfo=this._getRangeInfo(this._initRangeOption());var n=this._rangeInfo.weeks||1,i=["width","height"],r=this._model.getCellSize().slice(),o=this._model.getBoxLayoutParams(),a="horizontal"===this._orient?[n,7]:[7,n];E([0,1],(function(t){u(r,t)&&(o[i[t]]=r[t]*a[t])}));var s={width:e.getWidth(),height:e.getHeight()},l=this._rect=mp(o,s);function u(t,e){return null!=t[e]&&"auto"!==t[e]}E([0,1],(function(t){u(r,t)||(r[t]=l[i[t]]/a[t])})),this._sw=r[0],this._sh=r[1]},t.prototype.dataToPoint=function(t,e){Y(t)&&(t=t[0]),null==e&&(e=!0);var n=this.getDateInfo(t),i=this._rangeInfo,r=n.formatedDate;if(e&&!(n.time>=i.start.time&&n.time<i.end.time+sE))return[NaN,NaN];var o=n.day,a=this._getRangeInfo([i.start.time,r]).nthWeek;return"vertical"===this._orient?[this._rect.x+o*this._sw+this._sw/2,this._rect.y+a*this._sh+this._sh/2]:[this._rect.x+a*this._sw+this._sw/2,this._rect.y+o*this._sh+this._sh/2]},t.prototype.pointToData=function(t){var e=this.pointToDate(t);return e&&e.time},t.prototype.dataToRect=function(t,e){var n=this.dataToPoint(t,e);return{contentShape:{x:n[0]-(this._sw-this._lineWidth)/2,y:n[1]-(this._sh-this._lineWidth)/2,width:this._sw-this._lineWidth,height:this._sh-this._lineWidth},center:n,tl:[n[0]-this._sw/2,n[1]-this._sh/2],tr:[n[0]+this._sw/2,n[1]-this._sh/2],br:[n[0]+this._sw/2,n[1]+this._sh/2],bl:[n[0]-this._sw/2,n[1]+this._sh/2]}},t.prototype.pointToDate=function(t){var e=Math.floor((t[0]-this._rect.x)/this._sw)+1,n=Math.floor((t[1]-this._rect.y)/this._sh)+1,i=this._rangeInfo.range;return"vertical"===this._orient?this._getDateByWeeksAndDay(n,e-1,i):this._getDateByWeeksAndDay(e,n-1,i)},t.prototype.convertToPixel=function(t,e,n){var i=uE(e);return i===this?i.dataToPoint(n):null},t.prototype.convertFromPixel=function(t,e,n){var i=uE(e);return i===this?i.pointToData(n):null},t.prototype.containPoint=function(t){return console.warn("Not implemented."),!1},t.prototype._initRangeOption=function(){var t,e=this._model.get("range");if(Y(e)&&1===e.length&&(e=e[0]),Y(e))t=e;else{var n=e.toString();if(/^\d{4}$/.test(n)&&(t=[n+"-01-01",n+"-12-31"]),/^\d{4}[\/|-]\d{1,2}$/.test(n)){var i=this.getDateInfo(n),r=i.date;r.setMonth(r.getMonth()+1);var o=this.getNextNDay(r,-1);t=[i.formatedDate,o.formatedDate]}/^\d{4}[\/|-]\d{1,2}[\/|-]\d{1,2}$/.test(n)&&(t=[n,n])}if(!t)return e;var a=this._getRangeInfo(t);return a.start.time>a.end.time&&t.reverse(),t},t.prototype._getRangeInfo=function(t){var e,n=[this.getDateInfo(t[0]),this.getDateInfo(t[1])];n[0].time>n[1].time&&(e=!0,n.reverse());var i=Math.floor(n[1].time/sE)-Math.floor(n[0].time/sE)+1,r=new Date(n[0].time),o=r.getDate(),a=n[1].date.getDate();r.setDate(o+i-1);var s=r.getDate();if(s!==a)for(var l=r.getTime()-n[1].time>0?1:-1;(s=r.getDate())!==a&&(r.getTime()-n[1].time)*l>0;)i-=l,r.setDate(s-l);var u=Math.floor((i+n[0].day+6)/7),h=e?1-u:u-1;return e&&n.reverse(),{range:[n[0].formatedDate,n[1].formatedDate],start:n[0],end:n[1],allDay:i,weeks:u,nthWeek:h,fweek:n[0].day,lweek:n[1].day}},t.prototype._getDateByWeeksAndDay=function(t,e,n){var i=this._getRangeInfo(n);if(t>i.weeks||0===t&&e<i.fweek||t===i.weeks&&e>i.lweek)return null;var r=7*(t-1)-i.fweek+e,o=new Date(i.start.time);return o.setDate(+i.start.d+r),this.getDateInfo(o)},t.create=function(e,n){var i=[];return e.eachComponent("calendar",(function(r){var o=new t(r,e,n);i.push(o),r.coordinateSystem=o})),e.eachSeries((function(t){"calendar"===t.get("coordinateSystem")&&(t.coordinateSystem=i[t.get("calendarIndex")||0])})),i},t.dimensions=["time","value"],t}();function uE(t){var e=t.calendarModel,n=t.seriesModel;return e?e.coordinateSystem:n?n.coordinateSystem:null}function hE(t,e){var n;return E(e,(function(e){null!=t[e]&&"auto"!==t[e]&&(n=!0)})),n}var cE=["transition","enterFrom","leaveTo"],pE=cE.concat(["enterAnimation","updateAnimation","leaveAnimation"]);function dE(t,e,n){if(n&&(!t[n]&&e[n]&&(t[n]={}),t=t[n],e=e[n]),t&&e)for(var i=n?cE:pE,r=0;r<i.length;r++){var o=i[r];null==t[o]&&null!=e[o]&&(t[o]=e[o])}}var fE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.preventAutoZ=!0,n}return n(e,t),e.prototype.mergeOption=function(e,n){var i=this.option.elements;this.option.elements=null,t.prototype.mergeOption.call(this,e,n),this.option.elements=i},e.prototype.optionUpdated=function(t,e){var n=this.option,i=(e?n:t).elements,r=n.elements=e?[]:n.elements,o=[];this._flatten(i,o,null);var a=yo(r,o,"normalMerge"),s=this._elOptionsToUpdate=[];E(a,(function(t,e){var n=t.newOption;n&&(s.push(n),function(t,e){var n=t.existing;if(e.id=t.keyInfo.id,!e.type&&n&&(e.type=n.type),null==e.parentId){var i=e.parentOption;i?e.parentId=i.id:n&&(e.parentId=n.parentId)}e.parentOption=null}(t,n),function(t,e,n){var i=A({},n),r=t[e],o=n.$action||"merge";"merge"===o?r?(C(r,i,!0),bp(r,i,{ignoreSize:!0}),Sp(n,r),dE(n,r),dE(n,r,"shape"),dE(n,r,"style"),dE(n,r,"extra"),n.clipPath=r.clipPath):t[e]=i:"replace"===o?t[e]=i:"remove"===o&&r&&(t[e]=null)}(r,e,n),function(t,e){if(t&&(t.hv=e.hv=[hE(e,["left","right"]),hE(e,["top","bottom"])],"group"===t.type)){var n=t,i=e;null==n.width&&(n.width=i.width=0),null==n.height&&(n.height=i.height=0)}}(r[e],n))}),this),n.elements=B(r,(function(t){return t&&delete t.$action,null!=t}))},e.prototype._flatten=function(t,e,n){E(t,(function(t){if(t){n&&(t.parentOption=n),e.push(t);var i=t.children;"group"===t.type&&i&&this._flatten(i,e,t),delete t.children}}),this)},e.prototype.useElOptionsToUpdate=function(){var t=this._elOptionsToUpdate;return this._elOptionsToUpdate=null,t},e.type="graphic",e.defaultOption={elements:[]},e}(Ip),gE={path:null,compoundPath:null,group:Cr,image:xs,text:As},yE=So(),vE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(){this._elMap=ft()},e.prototype.render=function(t,e,n){t!==this._lastGraphicModel&&this._clear(),this._lastGraphicModel=t,this._updateElements(t),this._relocate(t,n)},e.prototype._updateElements=function(t){var e=t.useElOptionsToUpdate();if(e){var n=this._elMap,i=this.group,r=t.get("z"),o=t.get("zlevel");E(e,(function(e){var a=xo(e.id,null),s=null!=a?n.get(a):null,l=xo(e.parentId,null),u=null!=l?n.get(l):i,h=e.type,c=e.style;"text"===h&&c&&e.hv&&e.hv[1]&&(c.textVerticalAlign=c.textBaseline=c.verticalAlign=c.align=null);var p=e.textContent,d=e.textConfig;if(c&&TO(c,h,!!d,!!p)){var f=CO(c,h,!0);!d&&f.textConfig&&(d=e.textConfig=f.textConfig),!p&&f.textContent&&(p=f.textContent)}var g=function(t){return t=A({},t),E(["id","parentId","$action","hv","bounding","textContent","clipPath"].concat(fp),(function(e){delete t[e]})),t}(e);var y=e.$action||"merge",v="merge"===y,m="replace"===y;if(v){var x=s;(T=!s)?x=xE(a,u,e.type,n):(x&&(yE(x).isNew=!1),jO(x)),x&&(EO(x,g,t,{isInit:T}),bE(x,e,r,o))}else if(m){_E(s,e,n,t);var _=xE(a,u,e.type,n);_&&(EO(_,g,t,{isInit:!0}),bE(_,e,r,o))}else"remove"===y&&(zO(s,e),_E(s,e,n,t));var b=n.get(a);if(b&&p)if(v){var w=b.getTextContent();w?w.attr(p):b.setTextContent(new As(p))}else m&&b.setTextContent(new As(p));if(b){var S=e.clipPath;if(S){var M=S.type,I=void 0,T=!1;if(v){var C=b.getClipPath();I=(T=!C||yE(C).type!==M)?mE(M):C}else m&&(T=!0,I=mE(M));b.setClipPath(I),EO(I,S,t,{isInit:T}),qO(I,S.keyframeAnimation,t)}var D=yE(b);b.setTextConfig(d),D.option=e,function(t,e,n){var i=Ws(t).eventData;t.silent||t.ignore||i||(i=Ws(t).eventData={componentType:"graphic",componentIndex:e.componentIndex,name:t.name});i&&(i.info=n.info)}(b,t,e),Nh({el:b,componentModel:t,itemName:b.name,itemTooltipOption:e.tooltip}),qO(b,e.keyframeAnimation,t)}}))}},e.prototype._relocate=function(t,e){for(var n=t.option.elements,i=this.group,r=this._elMap,o=e.getWidth(),a=e.getHeight(),s=["x","y"],l=0;l<n.length;l++){if((f=null!=(d=xo((p=n[l]).id,null))?r.get(d):null)&&f.isGroup){var u=(g=f.parent)===i,h=yE(f),c=yE(g);h.width=Er(h.option.width,u?o:c.width)||0,h.height=Er(h.option.height,u?a:c.height)||0}}for(l=n.length-1;l>=0;l--){var p,d,f;if(f=null!=(d=xo((p=n[l]).id,null))?r.get(d):null){var g=f.parent,y=(c=yE(g),{}),v=xp(f,p,g===i?{width:o,height:a}:{width:c.width,height:c.height},null,{hv:p.hv,boundingMode:p.bounding},y);if(!yE(f).isNew&&v){for(var m=p.transition,x={},_=0;_<s.length;_++){var b=s[_],w=y[b];m&&(BO(m)||P(m,b)>=0)?x[b]=w:f[b]=w}ih(f,x,t,0)}else f.attr(y)}}},e.prototype._clear=function(){var t=this,e=this._elMap;e.each((function(n){_E(n,yE(n).option,e,t._lastGraphicModel)})),this._elMap=ft()},e.prototype.dispose=function(){this._clear()},e.type="graphic",e}(fg);function mE(t){var e=mt(gE,t)?gE[t]:vh(t);var n=new e({});return yE(n).type=t,n}function xE(t,e,n,i){var r=mE(n);return e.add(r),i.set(t,r),yE(r).id=t,yE(r).isNew=!0,r}function _E(t,e,n,i){t&&t.parent&&("group"===t.type&&t.traverse((function(t){_E(t,e,n,i)})),VO(t,e,i),n.removeKey(yE(t).id))}function bE(t,e,n,i){if(!t.isGroup){var r=t;r.z=rt(e.z,n||0),r.zlevel=rt(e.zlevel,i||0);var o=e.z2;null!=o&&(r.z2=o||0)}E(G(e),(function(n){var i=e[n];0===n.indexOf("on")&&U(i)&&(t[n]=i)})),t.draggable=e.draggable,null!=e.name&&(t.name=e.name),null!=e.id&&(t.id=e.id)}var wE=["x","y","radius","angle","single"],SE=["cartesian2d","polar","singleAxis"];function ME(t){return t+"Axis"}function IE(t,e){var n,i=ft(),r=[],o=ft();t.eachComponent({mainType:"dataZoom",query:e},(function(t){o.get(t.uid)||s(t)}));do{n=!1,t.eachComponent("dataZoom",a)}while(n);function a(t){!o.get(t.uid)&&function(t){var e=!1;return t.eachTargetAxis((function(t,n){var r=i.get(t);r&&r[n]&&(e=!0)})),e}(t)&&(s(t),n=!0)}function s(t){o.set(t.uid,!0),r.push(t),t.eachTargetAxis((function(t,e){(i.get(t)||i.set(t,[]))[e]=!0}))}return r}function TE(t){var e=t.ecModel,n={infoList:[],infoMap:ft()};return t.eachTargetAxis((function(t,i){var r=e.getComponent(ME(t),i);if(r){var o=r.getCoordSysModel();if(o){var a=o.uid,s=n.infoMap.get(a);s||(s={model:o,axisModels:[]},n.infoList.push(s),n.infoMap.set(a,s)),s.axisModels.push(r)}}})),n}var CE=function(){function t(){this.indexList=[],this.indexMap=[]}return t.prototype.add=function(t){this.indexMap[t]||(this.indexList.push(t),this.indexMap[t]=!0)},t}(),DE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._autoThrottle=!0,n._noTarget=!0,n._rangePropMode=["percent","percent"],n}return n(e,t),e.prototype.init=function(t,e,n){var i=AE(t);this.settledOption=i,this.mergeDefaultAndTheme(t,n),this._doInit(i)},e.prototype.mergeOption=function(t){var e=AE(t);C(this.option,t,!0),C(this.settledOption,e,!0),this._doInit(e)},e.prototype._doInit=function(t){var e=this.option;this._setDefaultThrottle(t),this._updateRangeUse(t);var n=this.settledOption;E([["start","startValue"],["end","endValue"]],(function(t,i){"value"===this._rangePropMode[i]&&(e[t[0]]=n[t[0]]=null)}),this),this._resetTarget()},e.prototype._resetTarget=function(){var t=this.get("orient",!0),e=this._targetAxisInfoMap=ft();this._fillSpecifiedTargetAxis(e)?this._orient=t||this._makeAutoOrientByTargetAxis():(this._orient=t||"horizontal",this._fillAutoTargetAxisByOrient(e,this._orient)),this._noTarget=!0,e.each((function(t){t.indexList.length&&(this._noTarget=!1)}),this)},e.prototype._fillSpecifiedTargetAxis=function(t){var e=!1;return E(wE,(function(n){var i=this.getReferringComponents(ME(n),Do);if(i.specified){e=!0;var r=new CE;E(i.models,(function(t){r.add(t.componentIndex)})),t.set(n,r)}}),this),e},e.prototype._fillAutoTargetAxisByOrient=function(t,e){var n=this.ecModel,i=!0;if(i){var r="vertical"===e?"y":"x";o(n.findComponents({mainType:r+"Axis"}),r)}i&&o(n.findComponents({mainType:"singleAxis",filter:function(t){return t.get("orient",!0)===e}}),"single");function o(e,n){var r=e[0];if(r){var o=new CE;if(o.add(r.componentIndex),t.set(n,o),i=!1,"x"===n||"y"===n){var a=r.getReferringComponents("grid",Co).models[0];a&&E(e,(function(t){r.componentIndex!==t.componentIndex&&a===t.getReferringComponents("grid",Co).models[0]&&o.add(t.componentIndex)}))}}}i&&E(wE,(function(e){if(i){var r=n.findComponents({mainType:ME(e),filter:function(t){return"category"===t.get("type",!0)}});if(r[0]){var o=new CE;o.add(r[0].componentIndex),t.set(e,o),i=!1}}}),this)},e.prototype._makeAutoOrientByTargetAxis=function(){var t;return this.eachTargetAxis((function(e){!t&&(t=e)}),this),"y"===t?"vertical":"horizontal"},e.prototype._setDefaultThrottle=function(t){if(t.hasOwnProperty("throttle")&&(this._autoThrottle=!1),this._autoThrottle){var e=this.ecModel.option;this.option.throttle=e.animation&&e.animationDurationUpdate>0?100:20}},e.prototype._updateRangeUse=function(t){var e=this._rangePropMode,n=this.get("rangeMode");E([["start","startValue"],["end","endValue"]],(function(i,r){var o=null!=t[i[0]],a=null!=t[i[1]];o&&!a?e[r]="percent":!o&&a?e[r]="value":n?e[r]=n[r]:o&&(e[r]="percent")}))},e.prototype.noTarget=function(){return this._noTarget},e.prototype.getFirstTargetAxisModel=function(){var t;return this.eachTargetAxis((function(e,n){null==t&&(t=this.ecModel.getComponent(ME(e),n))}),this),t},e.prototype.eachTargetAxis=function(t,e){this._targetAxisInfoMap.each((function(n,i){E(n.indexList,(function(n){t.call(e,i,n)}))}))},e.prototype.getAxisProxy=function(t,e){var n=this.getAxisModel(t,e);if(n)return n.__dzAxisProxy},e.prototype.getAxisModel=function(t,e){var n=this._targetAxisInfoMap.get(t);if(n&&n.indexMap[e])return this.ecModel.getComponent(ME(t),e)},e.prototype.setRawRange=function(t){var e=this.option,n=this.settledOption;E([["start","startValue"],["end","endValue"]],(function(i){null==t[i[0]]&&null==t[i[1]]||(e[i[0]]=n[i[0]]=t[i[0]],e[i[1]]=n[i[1]]=t[i[1]])}),this),this._updateRangeUse(t)},e.prototype.setCalculatedRange=function(t){var e=this.option;E(["start","startValue","end","endValue"],(function(n){e[n]=t[n]}))},e.prototype.getPercentRange=function(){var t=this.findRepresentativeAxisProxy();if(t)return t.getDataPercentWindow()},e.prototype.getValueRange=function(t,e){if(null!=t||null!=e)return this.getAxisProxy(t,e).getDataValueWindow();var n=this.findRepresentativeAxisProxy();return n?n.getDataValueWindow():void 0},e.prototype.findRepresentativeAxisProxy=function(t){if(t)return t.__dzAxisProxy;for(var e,n=this._targetAxisInfoMap.keys(),i=0;i<n.length;i++)for(var r=n[i],o=this._targetAxisInfoMap.get(r),a=0;a<o.indexList.length;a++){var s=this.getAxisProxy(r,o.indexList[a]);if(s.hostedBy(this))return s;e||(e=s)}return e},e.prototype.getRangePropMode=function(){return this._rangePropMode.slice()},e.prototype.getOrient=function(){return this._orient},e.type="dataZoom",e.dependencies=["xAxis","yAxis","radiusAxis","angleAxis","singleAxis","series","toolbox"],e.defaultOption={z:4,filterMode:"filter",start:0,end:100},e}(Ip);function AE(t){var e={};return E(["start","end","startValue","endValue","throttle"],(function(n){t.hasOwnProperty(n)&&(e[n]=t[n])})),e}var kE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="dataZoom.select",e}(DE),LE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n,i){this.dataZoomModel=t,this.ecModel=e,this.api=n},e.type="dataZoom",e}(fg),PE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="dataZoom.select",e}(LE),OE=E,RE=Vr,NE=function(){function t(t,e,n,i){this._dimName=t,this._axisIndex=e,this.ecModel=i,this._dataZoomModel=n}return t.prototype.hostedBy=function(t){return this._dataZoomModel===t},t.prototype.getDataValueWindow=function(){return this._valueWindow.slice()},t.prototype.getDataPercentWindow=function(){return this._percentWindow.slice()},t.prototype.getTargetSeriesModels=function(){var t=[];return this.ecModel.eachSeries((function(e){if(function(t){var e=t.get("coordinateSystem");return P(SE,e)>=0}(e)){var n=ME(this._dimName),i=e.getReferringComponents(n,Co).models[0];i&&this._axisIndex===i.componentIndex&&t.push(e)}}),this),t},t.prototype.getAxisModel=function(){return this.ecModel.getComponent(this._dimName+"Axis",this._axisIndex)},t.prototype.getMinMaxSpan=function(){return T(this._minMaxSpan)},t.prototype.calculateDataWindow=function(t){var e,n=this._dataExtent,i=this.getAxisModel().axis.scale,r=this._dataZoomModel.getRangePropMode(),o=[0,100],a=[],s=[];OE(["start","end"],(function(l,u){var h=t[l],c=t[l+"Value"];"percent"===r[u]?(null==h&&(h=o[u]),c=i.parse(Nr(h,o,n))):(e=!0,h=Nr(c=null==c?n[u]:i.parse(c),n,o)),s[u]=c,a[u]=h})),RE(s),RE(a);var l=this._minMaxSpan;function u(t,e,n,r,o){var a=o?"Span":"ValueSpan";sk(0,t,n,"all",l["min"+a],l["max"+a]);for(var s=0;s<2;s++)e[s]=Nr(t[s],n,r,!0),o&&(e[s]=i.parse(e[s]))}return e?u(s,a,n,o,!1):u(a,s,o,n,!0),{valueWindow:s,percentWindow:a}},t.prototype.reset=function(t){if(t===this._dataZoomModel){var e=this.getTargetSeriesModels();this._dataExtent=function(t,e,n){var i=[1/0,-1/0];OE(n,(function(t){!function(t,e,n){e&&E(u_(e,n),(function(n){var i=e.getApproximateExtent(n);i[0]<t[0]&&(t[0]=i[0]),i[1]>t[1]&&(t[1]=i[1])}))}(i,t.getData(),e)}));var r=t.getAxisModel(),o=Qx(r.axis.scale,r,i).calculate();return[o.min,o.max]}(this,this._dimName,e),this._updateMinMaxSpan();var n=this.calculateDataWindow(t.settledOption);this._valueWindow=n.valueWindow,this._percentWindow=n.percentWindow,this._setAxisModel()}},t.prototype.filterData=function(t,e){if(t===this._dataZoomModel){var n=this._dimName,i=this.getTargetSeriesModels(),r=t.get("filterMode"),o=this._valueWindow;"none"!==r&&OE(i,(function(t){var e=t.getData(),i=e.mapDimensionsAll(n);if(i.length){if("weakFilter"===r){var a=e.getStore(),s=z(i,(function(t){return e.getDimensionIndex(t)}),e);e.filterSelf((function(t){for(var e,n,r,l=0;l<i.length;l++){var u=a.get(s[l],t),h=!isNaN(u),c=u<o[0],p=u>o[1];if(h&&!c&&!p)return!0;h&&(r=!0),c&&(e=!0),p&&(n=!0)}return r&&e&&n}))}else OE(i,(function(n){if("empty"===r)t.setData(e=e.map(n,(function(t){return function(t){return t>=o[0]&&t<=o[1]}(t)?t:NaN})));else{var i={};i[n]=o,e.selectRange(i)}}));OE(i,(function(t){e.setApproximateExtent(o,t)}))}}))}},t.prototype._updateMinMaxSpan=function(){var t=this._minMaxSpan={},e=this._dataZoomModel,n=this._dataExtent;OE(["min","max"],(function(i){var r=e.get(i+"Span"),o=e.get(i+"ValueSpan");null!=o&&(o=this.getAxisModel().axis.scale.parse(o)),null!=o?r=Nr(n[0]+o,n,[0,100],!0):null!=r&&(o=Nr(r,[0,100],n,!0)-n[0]),t[i+"Span"]=r,t[i+"ValueSpan"]=o}),this)},t.prototype._setAxisModel=function(){var t=this.getAxisModel(),e=this._percentWindow,n=this._valueWindow;if(e){var i=Gr(n,[0,500]);i=Math.min(i,20);var r=t.axis.scale.rawExtentInfo;0!==e[0]&&r.setDeterminedMinMax("min",+n[0].toFixed(i)),100!==e[1]&&r.setDeterminedMinMax("max",+n[1].toFixed(i)),r.freeze()}},t}();var EE={getTargetSeries:function(t){function e(e){t.eachComponent("dataZoom",(function(n){n.eachTargetAxis((function(i,r){var o=t.getComponent(ME(i),r);e(i,r,o,n)}))}))}e((function(t,e,n,i){n.__dzAxisProxy=null}));var n=[];e((function(e,i,r,o){r.__dzAxisProxy||(r.__dzAxisProxy=new NE(e,i,o,t),n.push(r.__dzAxisProxy))}));var i=ft();return E(n,(function(t){E(t.getTargetSeriesModels(),(function(t){i.set(t.uid,t)}))})),i},overallReset:function(t,e){t.eachComponent("dataZoom",(function(t){t.eachTargetAxis((function(e,n){t.getAxisProxy(e,n).reset(t)})),t.eachTargetAxis((function(n,i){t.getAxisProxy(n,i).filterData(t,e)}))})),t.eachComponent("dataZoom",(function(t){var e=t.findRepresentativeAxisProxy();if(e){var n=e.getDataPercentWindow(),i=e.getDataValueWindow();t.setCalculatedRange({start:n[0],end:n[1],startValue:i[0],endValue:i[1]})}}))}};var zE=!1;function VE(t){zE||(zE=!0,t.registerProcessor(t.PRIORITY.PROCESSOR.FILTER,EE),function(t){t.registerAction("dataZoom",(function(t,e){E(IE(e,t),(function(e){e.setRawRange({start:t.start,end:t.end,startValue:t.startValue,endValue:t.endValue})}))}))}(t),t.registerSubTypeDefaulter("dataZoom",(function(){return"slider"})))}function BE(t){t.registerComponentModel(kE),t.registerComponentView(PE),VE(t)}var FE=function(){},GE={};function WE(t,e){GE[t]=e}function HE(t){return GE[t]}var YE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.optionUpdated=function(){t.prototype.optionUpdated.apply(this,arguments);var e=this.ecModel;E(this.option.feature,(function(t,n){var i=HE(n);i&&(i.getDefaultOption&&(i.defaultOption=i.getDefaultOption(e)),C(t,i.defaultOption))}))},e.type="toolbox",e.layoutMode={type:"box",ignoreSize:!0},e.defaultOption={show:!0,z:6,orient:"horizontal",left:"right",top:"top",backgroundColor:"transparent",borderColor:"#ccc",borderRadius:0,borderWidth:0,padding:5,itemSize:15,itemGap:8,showTitle:!0,iconStyle:{borderColor:"#666",color:"none"},emphasis:{iconStyle:{borderColor:"#3E98C5"}},tooltip:{show:!1,position:"bottom"}},e}(Ip);function UE(t,e){var n=np(e.get("padding")),i=e.getItemStyle(["color","opacity"]);return i.fill=e.get("backgroundColor"),t=new Ts({shape:{x:t.x-n[3],y:t.y-n[0],width:t.width+n[1]+n[3],height:t.height+n[0]+n[2],r:e.get("borderRadius")},style:i,silent:!0,z2:-1})}var XE=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.render=function(t,e,n,i){var r=this.group;if(r.removeAll(),t.get("show")){var o=+t.get("itemSize"),a=t.get("feature")||{},s=this._features||(this._features={}),l=[];E(a,(function(t,e){l.push(e)})),new Sm(this._featureNames||[],l).add(u).update(u).remove(H(u,null)).execute(),this._featureNames=l,function(t,e,n){var i=e.getBoxLayoutParams(),r=e.get("padding"),o={width:n.getWidth(),height:n.getHeight()},a=mp(i,o,r);vp(e.get("orient"),t,e.get("itemGap"),a.width,a.height),xp(t,i,o,r)}(r,t,n),r.add(UE(r.getBoundingRect(),t)),r.eachChild((function(t){var e=t.__title,i=t.ensureState("emphasis"),a=i.textConfig||(i.textConfig={}),s=t.getTextContent(),l=s&&s.states.emphasis;if(l&&!U(l)&&e){var u=l.style||(l.style={}),h=cr(e,As.makeFont(u)),c=t.x+r.x,p=!1;t.y+r.y+o+h.height>n.getHeight()&&(a.position="top",p=!0);var d=p?-5-h.height:o+8;c+h.width/2>n.getWidth()?(a.position=["100%",d],u.align="right"):c-h.width/2<0&&(a.position=[0,d],u.align="left")}}))}function u(u,h){var c,p=l[u],d=l[h],f=a[p],g=new pc(f,t,t.ecModel);if(i&&null!=i.newTitle&&i.featureName===p&&(f.title=i.newTitle),p&&!d){if(function(t){return 0===t.indexOf("my")}(p))c={onclick:g.option.onclick,featureName:p};else{var y=HE(p);if(!y)return;c=new y}s[p]=c}else if(!(c=s[d]))return;c.uid=fc("toolbox-feature"),c.model=g,c.ecModel=e,c.api=n;var v=c instanceof FE;p||!d?!g.get("show")||v&&c.unusable?v&&c.remove&&c.remove(e,n):(!function(i,a,s){var l,u,h=i.getModel("iconStyle"),c=i.getModel(["emphasis","iconStyle"]),p=a instanceof FE&&a.getIcons?a.getIcons():i.get("icon"),d=i.get("title")||{};X(p)?(l={})[s]=p:l=p;X(d)?(u={})[s]=d:u=d;var f=i.iconPaths={};E(l,(function(s,l){var p=Lh(s,{},{x:-o/2,y:-o/2,width:o,height:o});p.setStyle(h.getItemStyle()),p.ensureState("emphasis").style=c.getItemStyle();var d=new As({style:{text:u[l],align:c.get("textAlign"),borderRadius:c.get("textBorderRadius"),padding:c.get("textPadding"),fill:null},ignore:!0});p.setTextContent(d),Nh({el:p,componentModel:t,itemName:l,formatterParamsExtra:{title:u[l]}}),p.__title=u[l],p.on("mouseover",(function(){var e=c.getItemStyle(),n="vertical"===t.get("orient")?null==t.get("right")?"right":"left":null==t.get("bottom")?"bottom":"top";d.setStyle({fill:c.get("textFill")||e.fill||e.stroke||"#000",backgroundColor:c.get("textBackgroundColor")}),p.setTextConfig({position:c.get("textPosition")||n}),d.ignore=!t.get("showTitle"),xl(this)})).on("mouseout",(function(){"emphasis"!==i.get(["iconStatus",l])&&_l(this),d.hide()})),("emphasis"===i.get(["iconStatus",l])?xl:_l)(p),r.add(p),p.on("click",W(a.onclick,a,e,n,l)),f[l]=p}))}(g,c,p),g.setIconStatus=function(t,e){var n=this.option,i=this.iconPaths;n.iconStatus=n.iconStatus||{},n.iconStatus[t]=e,i[t]&&("emphasis"===e?xl:_l)(i[t])},c instanceof FE&&c.render&&c.render(g,e,n,i)):v&&c.dispose&&c.dispose(e,n)}},e.prototype.updateView=function(t,e,n,i){E(this._features,(function(t){t instanceof FE&&t.updateView&&t.updateView(t.model,e,n,i)}))},e.prototype.remove=function(t,e){E(this._features,(function(n){n instanceof FE&&n.remove&&n.remove(t,e)})),this.group.removeAll()},e.prototype.dispose=function(t,e){E(this._features,(function(n){n instanceof FE&&n.dispose&&n.dispose(t,e)}))},e.type="toolbox",e}(fg);var ZE=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.onclick=function(t,e){var n=this.model,i=n.get("name")||t.get("title.0.text")||"echarts",o="svg"===e.getZr().painter.getType(),a=o?"svg":n.get("type",!0)||"png",s=e.getConnectedDataURL({type:a,backgroundColor:n.get("backgroundColor",!0)||t.get("backgroundColor")||"#fff",connectedBackgroundColor:n.get("connectedBackgroundColor"),excludeComponents:n.get("excludeComponents"),pixelRatio:n.get("pixelRatio")}),l=r.browser;if(U(MouseEvent)&&(l.newEdge||!l.ie&&!l.edge)){var u=document.createElement("a");u.download=i+"."+a,u.target="_blank",u.href=s;var h=new MouseEvent("click",{view:document.defaultView,bubbles:!0,cancelable:!1});u.dispatchEvent(h)}else if(window.navigator.msSaveOrOpenBlob||o){var c=s.split(","),p=c[0].indexOf("base64")>-1,d=o?decodeURIComponent(c[1]):c[1];p&&(d=window.atob(d));var f=i+"."+a;if(window.navigator.msSaveOrOpenBlob){for(var g=d.length,y=new Uint8Array(g);g--;)y[g]=d.charCodeAt(g);var v=new Blob([y]);window.navigator.msSaveOrOpenBlob(v,f)}else{var m=document.createElement("iframe");document.body.appendChild(m);var x=m.contentWindow,_=x.document;_.open("image/svg+xml","replace"),_.write(d),_.close(),x.focus(),_.execCommand("SaveAs",!0,f),document.body.removeChild(m)}}else{var b=n.get("lang"),w='<body style="margin:0;"><img src="'+s+'" style="max-width:100%;" title="'+(b&&b[0]||"")+'" /></body>',S=window.open();S.document.write(w),S.document.title=i}},e.getDefaultOption=function(t){return{show:!0,icon:"M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0",title:t.getLocaleModel().get(["toolbox","saveAsImage","title"]),type:"png",connectedBackgroundColor:"#fff",name:"",excludeComponents:["toolbox"],lang:t.getLocaleModel().get(["toolbox","saveAsImage","lang"])}},e}(FE),jE="__ec_magicType_stack__",qE=[["line","bar"],["stack"]],KE=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.getIcons=function(){var t=this.model,e=t.get("icon"),n={};return E(t.get("type"),(function(t){e[t]&&(n[t]=e[t])})),n},e.getDefaultOption=function(t){return{show:!0,type:[],icon:{line:"M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4",bar:"M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7",stack:"M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z"},title:t.getLocaleModel().get(["toolbox","magicType","title"]),option:{},seriesIndex:{}}},e.prototype.onclick=function(t,e,n){var i=this.model,r=i.get(["seriesIndex",n]);if($E[n]){var o,a={series:[]};E(qE,(function(t){P(t,n)>=0&&E(t,(function(t){i.setIconStatus(t,"normal")}))})),i.setIconStatus(n,"emphasis"),t.eachComponent({mainType:"series",query:null==r?null:{seriesIndex:r}},(function(t){var e=t.subType,r=t.id,o=$E[n](e,r,t,i);o&&(k(o,t.option),a.series.push(o));var s=t.coordinateSystem;if(s&&"cartesian2d"===s.type&&("line"===n||"bar"===n)){var l=s.getAxesByScale("ordinal")[0];if(l){var u=l.dim+"Axis",h=t.getReferringComponents(u,Co).models[0].componentIndex;a[u]=a[u]||[];for(var c=0;c<=h;c++)a[u][h]=a[u][h]||{};a[u][h].boundaryGap="bar"===n}}}));var s=n;"stack"===n&&(o=C({stack:i.option.title.tiled,tiled:i.option.title.stack},i.option.title),"emphasis"!==i.get(["iconStatus",n])&&(s="tiled")),e.dispatchAction({type:"changeMagicType",currentType:s,newOption:a,newTitle:o,featureName:"magicType"})}},e}(FE),$E={line:function(t,e,n,i){if("bar"===t)return C({id:e,type:"line",data:n.get("data"),stack:n.get("stack"),markPoint:n.get("markPoint"),markLine:n.get("markLine")},i.get(["option","line"])||{},!0)},bar:function(t,e,n,i){if("line"===t)return C({id:e,type:"bar",data:n.get("data"),stack:n.get("stack"),markPoint:n.get("markPoint"),markLine:n.get("markLine")},i.get(["option","bar"])||{},!0)},stack:function(t,e,n,i){var r=n.get("stack")===jE;if("line"===t||"bar"===t)return i.setIconStatus("stack",r?"normal":"emphasis"),C({id:e,stack:r?"":jE},i.get(["option","stack"])||{},!0)}};um({type:"changeMagicType",event:"magicTypeChanged",update:"prepareAndUpdate"},(function(t,e){e.mergeOption(t.newOption)}));var JE=new Array(60).join("-"),QE="\t";function tz(t){return t.replace(/^\s\s*/,"").replace(/\s\s*$/,"")}var ez=new RegExp("[\t]+","g");function nz(t,e){var n=t.split(new RegExp("\n*"+JE+"\n*","g")),i={series:[]};return E(n,(function(t,n){if(function(t){if(t.slice(0,t.indexOf("\n")).indexOf(QE)>=0)return!0}(t)){var r=function(t){for(var e=t.split(/\n+/g),n=[],i=z(tz(e.shift()).split(ez),(function(t){return{name:t,data:[]}})),r=0;r<e.length;r++){var o=tz(e[r]).split(ez);n.push(o.shift());for(var a=0;a<o.length;a++)i[a]&&(i[a].data[r]=o[a])}return{series:i,categories:n}}(t),o=e[n],a=o.axisDim+"Axis";o&&(i[a]=i[a]||[],i[a][o.axisIndex]={data:r.categories},i.series=i.series.concat(r.series))}else{r=function(t){for(var e=t.split(/\n+/g),n=tz(e.shift()),i=[],r=0;r<e.length;r++){var o=tz(e[r]);if(o){var a=o.split(ez),s="",l=void 0,u=!1;isNaN(a[0])?(u=!0,s=a[0],a=a.slice(1),i[r]={name:s,value:[]},l=i[r].value):l=i[r]=[];for(var h=0;h<a.length;h++)l.push(+a[h]);1===l.length&&(u?i[r].value=l[0]:i[r]=l[0])}}return{name:n,data:i}}(t);i.series.push(r)}})),i}var iz=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.onclick=function(t,e){var n=e.getDom(),i=this.model;this._dom&&n.removeChild(this._dom);var r=document.createElement("div");r.style.cssText="position:absolute;left:5px;top:5px;bottom:5px;right:5px;",r.style.backgroundColor=i.get("backgroundColor")||"#fff";var o=document.createElement("h4"),a=i.get("lang")||[];o.innerHTML=a[0]||i.get("title"),o.style.cssText="margin: 10px 20px;",o.style.color=i.get("textColor");var s=document.createElement("div"),l=document.createElement("textarea");s.style.cssText="display:block;width:100%;overflow:auto;";var u=i.get("optionToContent"),h=i.get("contentToOption"),c=function(t){var e,n,i,r=function(t){var e={},n=[],i=[];return t.eachRawSeries((function(t){var r=t.coordinateSystem;if(!r||"cartesian2d"!==r.type&&"polar"!==r.type)n.push(t);else{var o=r.getBaseAxis();if("category"===o.type){var a=o.dim+"_"+o.index;e[a]||(e[a]={categoryAxis:o,valueAxis:r.getOtherAxis(o),series:[]},i.push({axisDim:o.dim,axisIndex:o.index})),e[a].series.push(t)}else n.push(t)}})),{seriesGroupByCategoryAxis:e,other:n,meta:i}}(t);return{value:B([(n=r.seriesGroupByCategoryAxis,i=[],E(n,(function(t,e){var n=t.categoryAxis,r=t.valueAxis.dim,o=[" "].concat(z(t.series,(function(t){return t.name}))),a=[n.model.getCategories()];E(t.series,(function(t){var e=t.getRawData();a.push(t.getRawData().mapArray(e.mapDimension(r),(function(t){return t})))}));for(var s=[o.join(QE)],l=0;l<a[0].length;l++){for(var u=[],h=0;h<a.length;h++)u.push(a[h][l]);s.push(u.join(QE))}i.push(s.join("\n"))})),i.join("\n\n"+JE+"\n\n")),(e=r.other,z(e,(function(t){var e=t.getRawData(),n=[t.name],i=[];return e.each(e.dimensions,(function(){for(var t=arguments.length,r=arguments[t-1],o=e.getName(r),a=0;a<t-1;a++)i[a]=arguments[a];n.push((o?o+QE:"")+i.join(QE))})),n.join("\n")})).join("\n\n"+JE+"\n\n"))],(function(t){return!!t.replace(/[\n\t\s]/g,"")})).join("\n\n"+JE+"\n\n"),meta:r.meta}}(t);if(U(u)){var p=u(e.getOption());X(p)?s.innerHTML=p:J(p)&&s.appendChild(p)}else s.appendChild(l),l.readOnly=i.get("readOnly"),l.style.cssText="width:100%;height:100%;font-family:monospace;font-size:14px;line-height:1.6rem;",l.style.color=i.get("textColor"),l.style.borderColor=i.get("textareaBorderColor"),l.style.backgroundColor=i.get("textareaColor"),l.value=c.value;var d=c.meta,f=document.createElement("div");f.style.cssText="position:absolute;bottom:0;left:0;right:0;";var g="float:right;margin-right:20px;border:none;cursor:pointer;padding:2px 5px;font-size:12px;border-radius:3px",y=document.createElement("div"),v=document.createElement("div");g+=";background-color:"+i.get("buttonColor"),g+=";color:"+i.get("buttonTextColor");var m=this;function x(){n.removeChild(r),m._dom=null}ae(y,"click",x),ae(v,"click",(function(){if(null==h&&null!=u||null!=h&&null==u)x();else{var t;try{t=U(h)?h(s,e.getOption()):nz(l.value,d)}catch(t){throw x(),new Error("Data view format error "+t)}t&&e.dispatchAction({type:"changeDataView",newOption:t}),x()}})),y.innerHTML=a[1],v.innerHTML=a[2],v.style.cssText=g,y.style.cssText=g,!i.get("readOnly")&&f.appendChild(v),f.appendChild(y),r.appendChild(o),r.appendChild(s),r.appendChild(f),s.style.height=n.clientHeight-80+"px",n.appendChild(r),this._dom=r},e.prototype.remove=function(t,e){this._dom&&e.getDom().removeChild(this._dom)},e.prototype.dispose=function(t,e){this.remove(t,e)},e.getDefaultOption=function(t){return{show:!0,readOnly:!1,optionToContent:null,contentToOption:null,icon:"M17.5,17.3H33 M17.5,17.3H33 M45.4,29.5h-28 M11.5,2v56H51V14.8L38.4,2H11.5z M38.4,2.2v12.7H51 M45.4,41.7h-28",title:t.getLocaleModel().get(["toolbox","dataView","title"]),lang:t.getLocaleModel().get(["toolbox","dataView","lang"]),backgroundColor:"#fff",textColor:"#000",textareaColor:"#fff",textareaBorderColor:"#333",buttonColor:"#c23531",buttonTextColor:"#fff"}},e}(FE);function rz(t,e){return z(t,(function(t,n){var i=e&&e[n];if(q(i)&&!Y(i)){q(t)&&!Y(t)||(t={value:t});var r=null!=i.name&&null==t.name;return t=k(t,i),r&&delete t.name,t}return t}))}um({type:"changeDataView",event:"dataViewChanged",update:"prepareAndUpdate"},(function(t,e){var n=[];E(t.newOption.series,(function(t){var i=e.getSeriesByName(t.name)[0];if(i){var r=i.get("data");n.push({name:t.name,data:rz(t.data,r)})}else n.push(A({type:"scatter"},t))})),e.mergeOption(k({series:n},t.newOption))}));var oz=E,az=So();function sz(t){var e=az(t);return e.snapshots||(e.snapshots=[{}]),e.snapshots}var lz=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.onclick=function(t,e){!function(t){az(t).snapshots=null}(t),e.dispatchAction({type:"restore",from:this.uid})},e.getDefaultOption=function(t){return{show:!0,icon:"M3.8,33.4 M47,18.9h9.8V8.7 M56.3,20.1 C52.1,9,40.5,0.6,26.8,2.1C12.6,3.7,1.6,16.2,2.1,30.6 M13,41.1H3.1v10.2 M3.7,39.9c4.2,11.1,15.8,19.5,29.5,18 c14.2-1.6,25.2-14.1,24.7-28.5",title:t.getLocaleModel().get(["toolbox","restore","title"])}},e}(FE);um({type:"restore",event:"restore",update:"prepareAndUpdate"},(function(t,e){e.resetOption("recreate")}));var uz=["grid","xAxis","yAxis","geo","graph","polar","radiusAxis","angleAxis","bmap"],hz=function(){function t(t,e,n){var i=this;this._targetInfoList=[];var r=pz(e,t);E(dz,(function(t,e){(!n||!n.include||P(n.include,e)>=0)&&t(r,i._targetInfoList)}))}return t.prototype.setOutputRanges=function(t,e){return this.matchOutputRanges(t,e,(function(t,e,n){if((t.coordRanges||(t.coordRanges=[])).push(e),!t.coordRange){t.coordRange=e;var i=yz[t.brushType](0,n,e);t.__rangeOffset={offset:mz[t.brushType](i.values,t.range,[1,1]),xyMinMax:i.xyMinMax}}})),t},t.prototype.matchOutputRanges=function(t,e,n){E(t,(function(t){var i=this.findTargetInfo(t,e);i&&!0!==i&&E(i.coordSyses,(function(i){var r=yz[t.brushType](1,i,t.range,!0);n(t,r.values,i,e)}))}),this)},t.prototype.setInputRanges=function(t,e){E(t,(function(t){var n,i,r,o,a,s=this.findTargetInfo(t,e);if(t.range=t.range||[],s&&!0!==s){t.panelId=s.panelId;var l=yz[t.brushType](0,s.coordSys,t.coordRange),u=t.__rangeOffset;t.range=u?mz[t.brushType](l.values,u.offset,(n=l.xyMinMax,i=u.xyMinMax,r=_z(n),o=_z(i),a=[r[0]/o[0],r[1]/o[1]],isNaN(a[0])&&(a[0]=1),isNaN(a[1])&&(a[1]=1),a)):l.values}}),this)},t.prototype.makePanelOpts=function(t,e){return z(this._targetInfoList,(function(n){var i=n.getPanelRect();return{panelId:n.panelId,defaultBrushType:e?e(n):null,clipPath:uL(i),isTargetByCursor:cL(i,t,n.coordSysModel),getLinearBrushOtherExtent:hL(i)}}))},t.prototype.controlSeries=function(t,e,n){var i=this.findTargetInfo(t,n);return!0===i||i&&P(i.coordSyses,e.coordinateSystem)>=0},t.prototype.findTargetInfo=function(t,e){for(var n=this._targetInfoList,i=pz(e,t),r=0;r<n.length;r++){var o=n[r],a=t.panelId;if(a){if(o.panelId===a)return o}else for(var s=0;s<fz.length;s++)if(fz[s](i,o))return o}return!0},t}();function cz(t){return t[0]>t[1]&&t.reverse(),t}function pz(t,e){return Io(t,e,{includeMainTypes:uz})}var dz={grid:function(t,e){var n=t.xAxisModels,i=t.yAxisModels,r=t.gridModels,o=ft(),a={},s={};(n||i||r)&&(E(n,(function(t){var e=t.axis.grid.model;o.set(e.id,e),a[e.id]=!0})),E(i,(function(t){var e=t.axis.grid.model;o.set(e.id,e),s[e.id]=!0})),E(r,(function(t){o.set(t.id,t),a[t.id]=!0,s[t.id]=!0})),o.each((function(t){var r=t.coordinateSystem,o=[];E(r.getCartesians(),(function(t,e){(P(n,t.getAxis("x").model)>=0||P(i,t.getAxis("y").model)>=0)&&o.push(t)})),e.push({panelId:"grid--"+t.id,gridModel:t,coordSysModel:t,coordSys:o[0],coordSyses:o,getPanelRect:gz.grid,xAxisDeclared:a[t.id],yAxisDeclared:s[t.id]})})))},geo:function(t,e){E(t.geoModels,(function(t){var n=t.coordinateSystem;e.push({panelId:"geo--"+t.id,geoModel:t,coordSysModel:t,coordSys:n,coordSyses:[n],getPanelRect:gz.geo})}))}},fz=[function(t,e){var n=t.xAxisModel,i=t.yAxisModel,r=t.gridModel;return!r&&n&&(r=n.axis.grid.model),!r&&i&&(r=i.axis.grid.model),r&&r===e.gridModel},function(t,e){var n=t.geoModel;return n&&n===e.geoModel}],gz={grid:function(){return this.coordSys.master.getRect().clone()},geo:function(){var t=this.coordSys,e=t.getBoundingRect().clone();return e.applyTransform(Mh(t)),e}},yz={lineX:H(vz,0),lineY:H(vz,1),rect:function(t,e,n,i){var r=t?e.pointToData([n[0][0],n[1][0]],i):e.dataToPoint([n[0][0],n[1][0]],i),o=t?e.pointToData([n[0][1],n[1][1]],i):e.dataToPoint([n[0][1],n[1][1]],i),a=[cz([r[0],o[0]]),cz([r[1],o[1]])];return{values:a,xyMinMax:a}},polygon:function(t,e,n,i){var r=[[1/0,-1/0],[1/0,-1/0]];return{values:z(n,(function(n){var o=t?e.pointToData(n,i):e.dataToPoint(n,i);return r[0][0]=Math.min(r[0][0],o[0]),r[1][0]=Math.min(r[1][0],o[1]),r[0][1]=Math.max(r[0][1],o[0]),r[1][1]=Math.max(r[1][1],o[1]),o})),xyMinMax:r}}};function vz(t,e,n,i){var r=n.getAxis(["x","y"][t]),o=cz(z([0,1],(function(t){return e?r.coordToData(r.toLocalCoord(i[t]),!0):r.toGlobalCoord(r.dataToCoord(i[t]))}))),a=[];return a[t]=o,a[1-t]=[NaN,NaN],{values:o,xyMinMax:a}}var mz={lineX:H(xz,0),lineY:H(xz,1),rect:function(t,e,n){return[[t[0][0]-n[0]*e[0][0],t[0][1]-n[0]*e[0][1]],[t[1][0]-n[1]*e[1][0],t[1][1]-n[1]*e[1][1]]]},polygon:function(t,e,n){return z(t,(function(t,i){return[t[0]-n[0]*e[i][0],t[1]-n[1]*e[i][1]]}))}};function xz(t,e,n,i){return[e[0]-i[t]*n[0],e[1]-i[t]*n[1]]}function _z(t){return t?[t[0][1]-t[0][0],t[1][1]-t[1][0]]:[NaN,NaN]}var bz,wz,Sz=E,Mz=uo+"toolbox-dataZoom_",Iz=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.render=function(t,e,n,i){this._brushController||(this._brushController=new Pk(n.getZr()),this._brushController.on("brush",W(this._onBrush,this)).mount()),function(t,e,n,i,r){var o=n._isZoomActive;i&&"takeGlobalCursor"===i.type&&(o="dataZoomSelect"===i.key&&i.dataZoomSelectActive);n._isZoomActive=o,t.setIconStatus("zoom",o?"emphasis":"normal");var a=new hz(Cz(t),e,{include:["grid"]}).makePanelOpts(r,(function(t){return t.xAxisDeclared&&!t.yAxisDeclared?"lineX":!t.xAxisDeclared&&t.yAxisDeclared?"lineY":"rect"}));n._brushController.setPanels(a).enableBrush(!(!o||!a.length)&&{brushType:"auto",brushStyle:t.getModel("brushStyle").getItemStyle()})}(t,e,this,i,n),function(t,e){t.setIconStatus("back",function(t){return sz(t).length}(e)>1?"emphasis":"normal")}(t,e)},e.prototype.onclick=function(t,e,n){Tz[n].call(this)},e.prototype.remove=function(t,e){this._brushController&&this._brushController.unmount()},e.prototype.dispose=function(t,e){this._brushController&&this._brushController.dispose()},e.prototype._onBrush=function(t){var e=t.areas;if(t.isEnd&&e.length){var n={},i=this.ecModel;this._brushController.updateCovers([]),new hz(Cz(this.model),i,{include:["grid"]}).matchOutputRanges(e,i,(function(t,e,n){if("cartesian2d"===n.type){var i=t.brushType;"rect"===i?(r("x",n,e[0]),r("y",n,e[1])):r({lineX:"x",lineY:"y"}[i],n,e)}})),function(t,e){var n=sz(t);oz(e,(function(e,i){for(var r=n.length-1;r>=0&&!n[r][i];r--);if(r<0){var o=t.queryComponents({mainType:"dataZoom",subType:"select",id:i})[0];if(o){var a=o.getPercentRange();n[0][i]={dataZoomId:i,start:a[0],end:a[1]}}}})),n.push(e)}(i,n),this._dispatchZoomAction(n)}function r(t,e,r){var o=e.getAxis(t),a=o.model,s=function(t,e,n){var i;return n.eachComponent({mainType:"dataZoom",subType:"select"},(function(n){n.getAxisModel(t,e.componentIndex)&&(i=n)})),i}(t,a,i),l=s.findRepresentativeAxisProxy(a).getMinMaxSpan();null==l.minValueSpan&&null==l.maxValueSpan||(r=sk(0,r.slice(),o.scale.getExtent(),0,l.minValueSpan,l.maxValueSpan)),s&&(n[s.id]={dataZoomId:s.id,startValue:r[0],endValue:r[1]})}},e.prototype._dispatchZoomAction=function(t){var e=[];Sz(t,(function(t,n){e.push(T(t))})),e.length&&this.api.dispatchAction({type:"dataZoom",from:this.uid,batch:e})},e.getDefaultOption=function(t){return{show:!0,filterMode:"filter",icon:{zoom:"M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1",back:"M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26"},title:t.getLocaleModel().get(["toolbox","dataZoom","title"]),brushStyle:{borderWidth:0,color:"rgba(210,219,238,0.2)"}}},e}(FE),Tz={zoom:function(){var t=!this._isZoomActive;this.api.dispatchAction({type:"takeGlobalCursor",key:"dataZoomSelect",dataZoomSelectActive:t})},back:function(){this._dispatchZoomAction(function(t){var e=sz(t),n=e[e.length-1];e.length>1&&e.pop();var i={};return oz(n,(function(t,n){for(var r=e.length-1;r>=0;r--)if(t=e[r][n]){i[n]=t;break}})),i}(this.ecModel))}};function Cz(t){var e={xAxisIndex:t.get("xAxisIndex",!0),yAxisIndex:t.get("yAxisIndex",!0),xAxisId:t.get("xAxisId",!0),yAxisId:t.get("yAxisId",!0)};return null==e.xAxisIndex&&null==e.xAxisId&&(e.xAxisIndex="all"),null==e.yAxisIndex&&null==e.yAxisId&&(e.yAxisIndex="all"),e}bz="dataZoom",wz=function(t){var e=t.getComponent("toolbox",0),n=["feature","dataZoom"];if(e&&null!=e.get(n)){var i=e.getModel(n),r=[],o=Io(t,Cz(i));return Sz(o.xAxisModels,(function(t){return a(t,"xAxis","xAxisIndex")})),Sz(o.yAxisModels,(function(t){return a(t,"yAxis","yAxisIndex")})),r}function a(t,e,n){var o=t.componentIndex,a={type:"select",$fromToolbox:!0,filterMode:i.get("filterMode",!0)||"filter",id:Mz+e+o};a[n]=o,r.push(a)}},lt(null==Zp.get(bz)&&wz),Zp.set(bz,wz);var Dz=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="tooltip",e.dependencies=["axisPointer"],e.defaultOption={z:60,show:!0,showContent:!0,trigger:"item",triggerOn:"mousemove|click",alwaysShowContent:!1,displayMode:"single",renderMode:"auto",confine:null,showDelay:0,hideDelay:100,transitionDuration:.4,enterable:!1,backgroundColor:"#fff",shadowBlur:10,shadowColor:"rgba(0, 0, 0, .2)",shadowOffsetX:1,shadowOffsetY:2,borderRadius:4,borderWidth:1,padding:null,extraCssText:"",axisPointer:{type:"line",axis:"auto",animation:"auto",animationDurationUpdate:200,animationEasingUpdate:"exponentialOut",crossStyle:{color:"#999",width:1,type:"dashed",textStyle:{}}},textStyle:{color:"#666",fontSize:14}},e}(Ip);function Az(t){var e=t.get("confine");return null!=e?!!e:"richText"===t.get("renderMode")}function kz(t){if(r.domSupported)for(var e=document.documentElement.style,n=0,i=t.length;n<i;n++)if(t[n]in e)return t[n]}var Lz=kz(["transform","webkitTransform","OTransform","MozTransform","msTransform"]);function Pz(t,e){if(!t)return e;e=ep(e,!0);var n=t.indexOf(e);return(t=-1===n?e:"-"+t.slice(0,n)+"-"+e).toLowerCase()}var Oz=Pz(kz(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),"transition"),Rz=Pz(Lz,"transform"),Nz="position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;"+(r.transform3dSupported?"will-change:transform;":"");function Ez(t,e,n){var i=t.toFixed(0)+"px",o=e.toFixed(0)+"px";if(!r.transformSupported)return n?"top:"+o+";left:"+i+";":[["top",o],["left",i]];var a=r.transform3dSupported,s="translate"+(a?"3d":"")+"("+i+","+o+(a?",0":"")+")";return n?"top:0;left:0;"+Rz+":"+s+";":[["top",0],["left",0],[Lz,s]]}function zz(t,e,n){var i=[],o=t.get("transitionDuration"),a=t.get("backgroundColor"),s=t.get("shadowBlur"),l=t.get("shadowColor"),u=t.get("shadowOffsetX"),h=t.get("shadowOffsetY"),c=t.getModel("textStyle"),p=eg(t,"html"),d=u+"px "+h+"px "+s+"px "+l;return i.push("box-shadow:"+d),e&&o&&i.push(function(t,e){var n="cubic-bezier(0.23,1,0.32,1)",i=" "+t/2+"s "+n,o="opacity"+i+",visibility"+i;return e||(i=" "+t+"s "+n,o+=r.transformSupported?","+Rz+i:",left"+i+",top"+i),Oz+":"+o}(o,n)),a&&i.push("background-color:"+a),E(["width","color","radius"],(function(e){var n="border-"+e,r=ep(n),o=t.get(r);null!=o&&i.push(n+":"+o+("color"===e?"":"px"))})),i.push(function(t){var e=[],n=t.get("fontSize"),i=t.getTextColor();i&&e.push("color:"+i),e.push("font:"+t.getFont()),n&&e.push("line-height:"+Math.round(3*n/2)+"px");var r=t.get("textShadowColor"),o=t.get("textShadowBlur")||0,a=t.get("textShadowOffsetX")||0,s=t.get("textShadowOffsetY")||0;return r&&o&&e.push("text-shadow:"+a+"px "+s+"px "+o+"px "+r),E(["decoration","align"],(function(n){var i=t.get(n);i&&e.push("text-"+n+":"+i)})),e.join(";")}(c)),null!=p&&i.push("padding:"+np(p).join("px ")+"px"),i.join(";")+";"}function Vz(t,e,n,i,r){var o=e&&e.painter;if(n){var a=o&&o.getViewportRoot();a&&function(t,e,n,i,r){$t(Kt,e,i,r,!0)&&$t(t,n,Kt[0],Kt[1])}(t,a,document.body,i,r)}else{t[0]=i,t[1]=r;var s=o&&o.getViewportRootOffset();s&&(t[0]+=s.offsetLeft,t[1]+=s.offsetTop)}t[2]=t[0]/e.getWidth(),t[3]=t[1]/e.getHeight()}var Bz=function(){function t(t,e,n){if(this._show=!1,this._styleCoord=[0,0,0,0],this._enterable=!0,this._firstShow=!0,this._longHide=!0,r.wxa)return null;var i=document.createElement("div");i.domBelongToZr=!0,this.el=i;var o=this._zr=e.getZr(),a=this._appendToBody=n&&n.appendToBody;Vz(this._styleCoord,o,a,e.getWidth()/2,e.getHeight()/2),a?document.body.appendChild(i):t.appendChild(i),this._container=t;var s=this;i.onmouseenter=function(){s._enterable&&(clearTimeout(s._hideTimeout),s._show=!0),s._inContent=!0},i.onmousemove=function(t){if(t=t||window.event,!s._enterable){var e=o.handler;oe(o.painter.getViewportRoot(),t,!0),e.dispatch("mousemove",t)}},i.onmouseleave=function(){s._inContent=!1,s._enterable&&s._show&&s.hideLater(s._hideDelay)}}return t.prototype.update=function(t){var e,n,i,r=this._container,o=(n="position",(i=(e=r).currentStyle||document.defaultView&&document.defaultView.getComputedStyle(e))?n?i[n]:i:null),a=r.style;"absolute"!==a.position&&"absolute"!==o&&(a.position="relative"),t.get("alwaysShowContent")&&this._moveIfResized(),this.el.className=t.get("className")||""},t.prototype.show=function(t,e){clearTimeout(this._hideTimeout),clearTimeout(this._longHideTimeout);var n=this.el,i=n.style,r=this._styleCoord;n.innerHTML?i.cssText=Nz+zz(t,!this._firstShow,this._longHide)+Ez(r[0],r[1],!0)+"border-color:"+cp(e)+";"+(t.get("extraCssText")||"")+";pointer-events:"+(this._enterable?"auto":"none"):i.display="none",this._show=!0,this._firstShow=!1,this._longHide=!1},t.prototype.setContent=function(t,e,n,i,r){var o=this.el;if(null!=t){var a="";if(X(r)&&"item"===n.get("trigger")&&!Az(n)&&(a=function(t,e,n){if(!X(n)||"inside"===n)return"";var i=t.get("backgroundColor"),r=t.get("borderWidth");e=cp(e);var o,a,s="left"===(o=n)?"right":"right"===o?"left":"top"===o?"bottom":"top",l=Math.max(1.5*Math.round(r),6),u="",h=Rz+":";P(["left","right"],s)>-1?(u+="top:50%",h+="translateY(-50%) rotate("+(a="left"===s?-225:-45)+"deg)"):(u+="left:50%",h+="translateX(-50%) rotate("+(a="top"===s?225:45)+"deg)");var c=a*Math.PI/180,p=l+r,d=p*Math.abs(Math.cos(c))+p*Math.abs(Math.sin(c)),f=e+" solid "+r+"px;";return'<div style="'+["position:absolute;width:"+l+"px;height:"+l+"px;",(u+=";"+s+":-"+Math.round(100*((d-Math.SQRT2*r)/2+Math.SQRT2*r-(d-p)/2))/100+"px")+";"+h+";","border-bottom:"+f,"border-right:"+f,"background-color:"+i+";"].join("")+'"></div>'}(n,i,r)),X(t))o.innerHTML=t+a;else if(t){o.innerHTML="",Y(t)||(t=[t]);for(var s=0;s<t.length;s++)J(t[s])&&t[s].parentNode!==o&&o.appendChild(t[s]);if(a&&o.childNodes.length){var l=document.createElement("div");l.innerHTML=a,o.appendChild(l)}}}else o.innerHTML=""},t.prototype.setEnterable=function(t){this._enterable=t},t.prototype.getSize=function(){var t=this.el;return[t.offsetWidth,t.offsetHeight]},t.prototype.moveTo=function(t,e){var n=this._styleCoord;if(Vz(n,this._zr,this._appendToBody,t,e),null!=n[0]&&null!=n[1]){var i=this.el.style;E(Ez(n[0],n[1]),(function(t){i[t[0]]=t[1]}))}},t.prototype._moveIfResized=function(){var t=this._styleCoord[2],e=this._styleCoord[3];this.moveTo(t*this._zr.getWidth(),e*this._zr.getHeight())},t.prototype.hide=function(){var t=this,e=this.el.style;e.visibility="hidden",e.opacity="0",r.transform3dSupported&&(e.willChange=""),this._show=!1,this._longHideTimeout=setTimeout((function(){return t._longHide=!0}),500)},t.prototype.hideLater=function(t){!this._show||this._inContent&&this._enterable||(t?(this._hideDelay=t,this._show=!1,this._hideTimeout=setTimeout(W(this.hide,this),t)):this.hide())},t.prototype.isShow=function(){return this._show},t.prototype.dispose=function(){this.el.parentNode.removeChild(this.el)},t}(),Fz=function(){function t(t){this._show=!1,this._styleCoord=[0,0,0,0],this._enterable=!0,this._zr=t.getZr(),Hz(this._styleCoord,this._zr,t.getWidth()/2,t.getHeight()/2)}return t.prototype.update=function(t){t.get("alwaysShowContent")&&this._moveIfResized()},t.prototype.show=function(){this._hideTimeout&&clearTimeout(this._hideTimeout),this.el.show(),this._show=!0},t.prototype.setContent=function(t,e,n,i,r){var o=this;q(t)&&ao(""),this.el&&this._zr.remove(this.el);var a=n.getModel("textStyle");this.el=new As({style:{rich:e.richTextStyles,text:t,lineHeight:22,borderWidth:1,borderColor:i,textShadowColor:a.get("textShadowColor"),fill:n.get(["textStyle","color"]),padding:eg(n,"richText"),verticalAlign:"top",align:"left"},z:n.get("z")}),E(["backgroundColor","borderRadius","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY"],(function(t){o.el.style[t]=n.get(t)})),E(["textShadowBlur","textShadowOffsetX","textShadowOffsetY"],(function(t){o.el.style[t]=a.get(t)||0})),this._zr.add(this.el);var s=this;this.el.on("mouseover",(function(){s._enterable&&(clearTimeout(s._hideTimeout),s._show=!0),s._inContent=!0})),this.el.on("mouseout",(function(){s._enterable&&s._show&&s.hideLater(s._hideDelay),s._inContent=!1}))},t.prototype.setEnterable=function(t){this._enterable=t},t.prototype.getSize=function(){var t=this.el,e=this.el.getBoundingRect(),n=Wz(t.style);return[e.width+n.left+n.right,e.height+n.top+n.bottom]},t.prototype.moveTo=function(t,e){var n=this.el;if(n){var i=this._styleCoord;Hz(i,this._zr,t,e),t=i[0],e=i[1];var r=n.style,o=Gz(r.borderWidth||0),a=Wz(r);n.x=t+o+a.left,n.y=e+o+a.top,n.markRedraw()}},t.prototype._moveIfResized=function(){var t=this._styleCoord[2],e=this._styleCoord[3];this.moveTo(t*this._zr.getWidth(),e*this._zr.getHeight())},t.prototype.hide=function(){this.el&&this.el.hide(),this._show=!1},t.prototype.hideLater=function(t){!this._show||this._inContent&&this._enterable||(t?(this._hideDelay=t,this._show=!1,this._hideTimeout=setTimeout(W(this.hide,this),t)):this.hide())},t.prototype.isShow=function(){return this._show},t.prototype.dispose=function(){this._zr.remove(this.el)},t}();function Gz(t){return Math.max(0,t)}function Wz(t){var e=Gz(t.shadowBlur||0),n=Gz(t.shadowOffsetX||0),i=Gz(t.shadowOffsetY||0);return{left:Gz(e-n),right:Gz(e+n),top:Gz(e-i),bottom:Gz(e+i)}}function Hz(t,e,n,i){t[0]=n,t[1]=i,t[2]=t[0]/e.getWidth(),t[3]=t[1]/e.getHeight()}var Yz=new Ts({shape:{x:-1,y:-1,width:2,height:2}}),Uz=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(t,e){if(!r.node&&e.getDom()){var n,i=t.getComponent("tooltip"),o=this._renderMode="auto"===(n=i.get("renderMode"))?r.domSupported?"html":"richText":n||"html";this._tooltipContent="richText"===o?new Fz(e):new Bz(e.getDom(),e,{appendToBody:i.get("appendToBody",!0)})}},e.prototype.render=function(t,e,n){if(!r.node&&n.getDom()){this.group.removeAll(),this._tooltipModel=t,this._ecModel=e,this._api=n,this._alwaysShowContent=t.get("alwaysShowContent");var i=this._tooltipContent;i.update(t),i.setEnterable(t.get("enterable")),this._initGlobalListener(),this._keepShow(),"richText"!==this._renderMode&&t.get("transitionDuration")?Dg(this,"_updatePosition",50,"fixRate"):Ag(this,"_updatePosition")}},e.prototype._initGlobalListener=function(){var t=this._tooltipModel.get("triggerOn");qR("itemTooltip",this._api,W((function(e,n,i){"none"!==t&&(t.indexOf(e)>=0?this._tryShow(n,i):"leave"===e&&this._hide(i))}),this))},e.prototype._keepShow=function(){var t=this._tooltipModel,e=this._ecModel,n=this._api;if(null!=this._lastX&&null!=this._lastY&&"none"!==t.get("triggerOn")){var i=this;clearTimeout(this._refreshUpdateTimeout),this._refreshUpdateTimeout=setTimeout((function(){!n.isDisposed()&&i.manuallyShowTip(t,e,n,{x:i._lastX,y:i._lastY,dataByCoordSys:i._lastDataByCoordSys})}))}},e.prototype.manuallyShowTip=function(t,e,n,i){if(i.from!==this.uid&&!r.node&&n.getDom()){var o=Zz(i,n);this._ticket="";var a=i.dataByCoordSys,s=function(t,e,n){var i=To(t).queryOptionMap,r=i.keys()[0];if(!r||"series"===r)return;var o,a=Ao(e,r,i.get(r),{useDefault:!1,enableAll:!1,enableNone:!1}).models[0];if(!a)return;if(n.getViewOfComponentModel(a).group.traverse((function(e){var n=Ws(e).tooltipConfig;if(n&&n.name===t.name)return o=e,!0})),o)return{componentMainType:r,componentIndex:a.componentIndex,el:o}}(i,e,n);if(s){var l=s.el.getBoundingRect().clone();l.applyTransform(s.el.transform),this._tryShow({offsetX:l.x+l.width/2,offsetY:l.y+l.height/2,target:s.el,position:i.position,positionDefault:"bottom"},o)}else if(i.tooltip&&null!=i.x&&null!=i.y){var u=Yz;u.x=i.x,u.y=i.y,u.update(),Ws(u).tooltipConfig={name:null,option:i.tooltip},this._tryShow({offsetX:i.x,offsetY:i.y,target:u},o)}else if(a)this._tryShow({offsetX:i.x,offsetY:i.y,position:i.position,dataByCoordSys:a,tooltipOption:i.tooltipOption},o);else if(null!=i.seriesIndex){if(this._manuallyAxisShowTip(t,e,n,i))return;var h=tN(i,e),c=h.point[0],p=h.point[1];null!=c&&null!=p&&this._tryShow({offsetX:c,offsetY:p,target:h.el,position:i.position,positionDefault:"bottom"},o)}else null!=i.x&&null!=i.y&&(n.dispatchAction({type:"updateAxisPointer",x:i.x,y:i.y}),this._tryShow({offsetX:i.x,offsetY:i.y,position:i.position,target:n.getZr().findHover(i.x,i.y).target},o))}},e.prototype.manuallyHideTip=function(t,e,n,i){var r=this._tooltipContent;!this._alwaysShowContent&&this._tooltipModel&&r.hideLater(this._tooltipModel.get("hideDelay")),this._lastX=this._lastY=this._lastDataByCoordSys=null,i.from!==this.uid&&this._hide(Zz(i,n))},e.prototype._manuallyAxisShowTip=function(t,e,n,i){var r=i.seriesIndex,o=i.dataIndex,a=e.getComponent("axisPointer").coordSysAxesInfo;if(null!=r&&null!=o&&null!=a){var s=e.getSeriesByIndex(r);if(s)if("axis"===Xz([s.getData().getItemModel(o),s,(s.coordinateSystem||{}).model],this._tooltipModel).get("trigger"))return n.dispatchAction({type:"updateAxisPointer",seriesIndex:r,dataIndex:o,position:i.position}),!0}},e.prototype._tryShow=function(t,e){var n=t.target;if(this._tooltipModel){this._lastX=t.offsetX,this._lastY=t.offsetY;var i=t.dataByCoordSys;if(i&&i.length)this._showAxisTooltip(i,t);else if(n){var r,o;this._lastDataByCoordSys=null,my(n,(function(t){return null!=Ws(t).dataIndex?(r=t,!0):null!=Ws(t).tooltipConfig?(o=t,!0):void 0}),!0),r?this._showSeriesItemTooltip(t,r,e):o?this._showComponentItemTooltip(t,o,e):this._hide(e)}else this._lastDataByCoordSys=null,this._hide(e)}},e.prototype._showOrMove=function(t,e){var n=t.get("showDelay");e=W(e,this),clearTimeout(this._showTimout),n>0?this._showTimout=setTimeout(e,n):e()},e.prototype._showAxisTooltip=function(t,e){var n=this._ecModel,i=this._tooltipModel,r=[e.offsetX,e.offsetY],o=Xz([e.tooltipOption],i),a=this._renderMode,s=[],l=Uf("section",{blocks:[],noHeader:!0}),u=[],h=new ng;E(t,(function(t){E(t.dataByAxis,(function(t){var e=n.getComponent(t.axisDim+"Axis",t.axisIndex),r=t.value;if(e&&null!=r){var o=ER(r,e.axis,n,t.seriesDataIndices,t.valueLabelOpt),c=Uf("section",{header:o,noHeader:!ut(o),sortBlocks:!0,blocks:[]});l.blocks.push(c),E(t.seriesDataIndices,(function(l){var p=n.getSeriesByIndex(l.seriesIndex),d=l.dataIndexInside,f=p.getDataParams(d);if(!(f.dataIndex<0)){f.axisDim=t.axisDim,f.axisIndex=t.axisIndex,f.axisType=t.axisType,f.axisId=t.axisId,f.axisValue=o_(e.axis,{value:r}),f.axisValueLabel=o,f.marker=h.makeTooltipMarker("item",cp(f.color),a);var g=lf(p.formatTooltip(d,!0,null)),y=g.frag;if(y){var v=Xz([p],i).get("valueFormatter");c.blocks.push(v?A({valueFormatter:v},y):y)}g.text&&u.push(g.text),s.push(f)}}))}}))})),l.blocks.reverse(),u.reverse();var c=e.position,p=o.get("order"),d=$f(l,h,a,p,n.get("useUTC"),o.get("textStyle"));d&&u.unshift(d);var f="richText"===a?"\n\n":"<br/>",g=u.join(f);this._showOrMove(o,(function(){this._updateContentNotChangedOnAxis(t,s)?this._updatePosition(o,c,r[0],r[1],this._tooltipContent,s):this._showTooltipContent(o,g,s,Math.random()+"",r[0],r[1],c,null,h)}))},e.prototype._showSeriesItemTooltip=function(t,e,n){var i=this._ecModel,r=Ws(e),o=r.seriesIndex,a=i.getSeriesByIndex(o),s=r.dataModel||a,l=r.dataIndex,u=r.dataType,h=s.getData(u),c=this._renderMode,p=t.positionDefault,d=Xz([h.getItemModel(l),s,a&&(a.coordinateSystem||{}).model],this._tooltipModel,p?{position:p}:null),f=d.get("trigger");if(null==f||"item"===f){var g=s.getDataParams(l,u),y=new ng;g.marker=y.makeTooltipMarker("item",cp(g.color),c);var v=lf(s.formatTooltip(l,!1,u)),m=d.get("order"),x=d.get("valueFormatter"),_=v.frag,b=_?$f(x?A({valueFormatter:x},_):_,y,c,m,i.get("useUTC"),d.get("textStyle")):v.text,w="item_"+s.name+"_"+l;this._showOrMove(d,(function(){this._showTooltipContent(d,b,g,w,t.offsetX,t.offsetY,t.position,t.target,y)})),n({type:"showTip",dataIndexInside:l,dataIndex:h.getRawIndex(l),seriesIndex:o,from:this.uid})}},e.prototype._showComponentItemTooltip=function(t,e,n){var i=Ws(e),r=i.tooltipConfig.option||{};if(X(r)){r={content:r,formatter:r}}var o=[r],a=this._ecModel.getComponent(i.componentMainType,i.componentIndex);a&&o.push(a),o.push({formatter:r.content});var s=t.positionDefault,l=Xz(o,this._tooltipModel,s?{position:s}:null),u=l.get("content"),h=Math.random()+"",c=new ng;this._showOrMove(l,(function(){var n=T(l.get("formatterParams")||{});this._showTooltipContent(l,u,n,h,t.offsetX,t.offsetY,t.position,e,c)})),n({type:"showTip",from:this.uid})},e.prototype._showTooltipContent=function(t,e,n,i,r,o,a,s,l){if(this._ticket="",t.get("showContent")&&t.get("show")){var u=this._tooltipContent,h=t.get("formatter");a=a||t.get("position");var c=e,p=this._getNearestPoint([r,o],n,t.get("trigger"),t.get("borderColor")).color;if(h)if(X(h)){var d=t.ecModel.get("useUTC"),f=Y(n)?n[0]:n;c=h,f&&f.axisType&&f.axisType.indexOf("time")>=0&&(c=zc(f.axisValue,c,d)),c=up(c,n,!0)}else if(U(h)){var g=W((function(e,i){e===this._ticket&&(u.setContent(i,l,t,p,a),this._updatePosition(t,a,r,o,u,n,s))}),this);this._ticket=i,c=h(n,i,g)}else c=h;u.setContent(c,l,t,p,a),u.show(t,p),this._updatePosition(t,a,r,o,u,n,s)}},e.prototype._getNearestPoint=function(t,e,n,i){return"axis"===n||Y(e)?{color:i||("html"===this._renderMode?"#fff":"none")}:Y(e)?void 0:{color:i||e.color||e.borderColor}},e.prototype._updatePosition=function(t,e,n,i,r,o,a){var s=this._api.getWidth(),l=this._api.getHeight();e=e||t.get("position");var u=r.getSize(),h=t.get("align"),c=t.get("verticalAlign"),p=a&&a.getBoundingRect().clone();if(a&&p.applyTransform(a.transform),U(e)&&(e=e([n,i],o,r.el,p,{viewSize:[s,l],contentSize:u.slice()})),Y(e))n=Er(e[0],s),i=Er(e[1],l);else if(q(e)){var d=e;d.width=u[0],d.height=u[1];var f=mp(d,{width:s,height:l});n=f.x,i=f.y,h=null,c=null}else if(X(e)&&a){var g=function(t,e,n,i){var r=n[0],o=n[1],a=Math.ceil(Math.SQRT2*i)+8,s=0,l=0,u=e.width,h=e.height;switch(t){case"inside":s=e.x+u/2-r/2,l=e.y+h/2-o/2;break;case"top":s=e.x+u/2-r/2,l=e.y-o-a;break;case"bottom":s=e.x+u/2-r/2,l=e.y+h+a;break;case"left":s=e.x-r-a,l=e.y+h/2-o/2;break;case"right":s=e.x+u+a,l=e.y+h/2-o/2}return[s,l]}(e,p,u,t.get("borderWidth"));n=g[0],i=g[1]}else{g=function(t,e,n,i,r,o,a){var s=n.getSize(),l=s[0],u=s[1];null!=o&&(t+l+o+2>i?t-=l+o:t+=o);null!=a&&(e+u+a>r?e-=u+a:e+=a);return[t,e]}(n,i,r,s,l,h?null:20,c?null:20);n=g[0],i=g[1]}if(h&&(n-=jz(h)?u[0]/2:"right"===h?u[0]:0),c&&(i-=jz(c)?u[1]/2:"bottom"===c?u[1]:0),Az(t)){g=function(t,e,n,i,r){var o=n.getSize(),a=o[0],s=o[1];return t=Math.min(t+a,i)-a,e=Math.min(e+s,r)-s,t=Math.max(t,0),e=Math.max(e,0),[t,e]}(n,i,r,s,l);n=g[0],i=g[1]}r.moveTo(n,i)},e.prototype._updateContentNotChangedOnAxis=function(t,e){var n=this._lastDataByCoordSys,i=this._cbParamsList,r=!!n&&n.length===t.length;return r&&E(n,(function(n,o){var a=n.dataByAxis||[],s=(t[o]||{}).dataByAxis||[];(r=r&&a.length===s.length)&&E(a,(function(t,n){var o=s[n]||{},a=t.seriesDataIndices||[],l=o.seriesDataIndices||[];(r=r&&t.value===o.value&&t.axisType===o.axisType&&t.axisId===o.axisId&&a.length===l.length)&&E(a,(function(t,e){var n=l[e];r=r&&t.seriesIndex===n.seriesIndex&&t.dataIndex===n.dataIndex})),i&&E(t.seriesDataIndices,(function(t){var n=t.seriesIndex,o=e[n],a=i[n];o&&a&&a.data!==o.data&&(r=!1)}))}))})),this._lastDataByCoordSys=t,this._cbParamsList=e,!!r},e.prototype._hide=function(t){this._lastDataByCoordSys=null,t({type:"hideTip",from:this.uid})},e.prototype.dispose=function(t,e){!r.node&&e.getDom()&&(Ag(this,"_updatePosition"),this._tooltipContent.dispose(),JR("itemTooltip",e))},e.type="tooltip",e}(fg);function Xz(t,e,n){var i,r=e.ecModel;n?(i=new pc(n,r,r),i=new pc(e.option,i,r)):i=e;for(var o=t.length-1;o>=0;o--){var a=t[o];a&&(a instanceof pc&&(a=a.get("tooltip",!0)),X(a)&&(a={formatter:a}),a&&(i=new pc(a,i,r)))}return i}function Zz(t,e){return t.dispatchAction||W(e.dispatchAction,e)}function jz(t){return"center"===t||"middle"===t}var qz=["rect","polygon","keep","clear"];function Kz(t,e){var n=ho(t?t.brush:[]);if(n.length){var i=[];E(n,(function(t){var e=t.hasOwnProperty("toolbox")?t.toolbox:[];e instanceof Array&&(i=i.concat(e))}));var r=t&&t.toolbox;Y(r)&&(r=r[0]),r||(r={feature:{}},t.toolbox=[r]);var o=r.feature||(r.feature={}),a=o.brush||(o.brush={}),s=a.type||(a.type=[]);s.push.apply(s,i),function(t){var e={};E(t,(function(t){e[t]=1})),t.length=0,E(e,(function(e,n){t.push(n)}))}(s),e&&!s.length&&s.push.apply(s,qz)}}var $z=E;function Jz(t){if(t)for(var e in t)if(t.hasOwnProperty(e))return!0}function Qz(t,e,n){var i={};return $z(e,(function(e){var r,o=i[e]=((r=function(){}).prototype.__hidden=r.prototype,new r);$z(t[e],(function(t,i){if(eD.isValidType(i)){var r={type:i,visual:t};n&&n(r,e),o[i]=new eD(r),"opacity"===i&&((r=T(r)).type="colorAlpha",o.__hidden.__alphaForOpacity=new eD(r))}}))})),i}function tV(t,e,n){var i;E(n,(function(t){e.hasOwnProperty(t)&&Jz(e[t])&&(i=!0)})),i&&E(n,(function(n){e.hasOwnProperty(n)&&Jz(e[n])?t[n]=T(e[n]):delete t[n]}))}var eV={lineX:nV(0),lineY:nV(1),rect:{point:function(t,e,n){return t&&n.boundingRect.contain(t[0],t[1])},rect:function(t,e,n){return t&&n.boundingRect.intersect(t)}},polygon:{point:function(t,e,n){return t&&n.boundingRect.contain(t[0],t[1])&&f_(n.range,t[0],t[1])},rect:function(t,e,n){var i=n.range;if(!t||i.length<=1)return!1;var r=t.x,o=t.y,a=t.width,s=t.height,l=i[0];return!!(f_(i,r,o)||f_(i,r+a,o)||f_(i,r,o+s)||f_(i,r+a,o+s)||sr.create(t).contain(l[0],l[1])||Ph(r,o,r+a,o,i)||Ph(r,o,r,o+s,i)||Ph(r+a,o,r+a,o+s,i)||Ph(r,o+s,r+a,o+s,i))||void 0}}};function nV(t){var e=["x","y"],n=["width","height"];return{point:function(e,n,i){if(e){var r=i.range;return iV(e[t],r)}},rect:function(i,r,o){if(i){var a=o.range,s=[i[e[t]],i[e[t]]+i[n[t]]];return s[1]<s[0]&&s.reverse(),iV(s[0],a)||iV(s[1],a)||iV(a[0],s)||iV(a[1],s)}}}}function iV(t,e){return e[0]<=t&&t<=e[1]}var rV=["inBrush","outOfBrush"],oV="__ecBrushSelect",aV="__ecInBrushSelectEvent";function sV(t){t.eachComponent({mainType:"brush"},(function(e){(e.brushTargetManager=new hz(e.option,t)).setInputRanges(e.areas,t)}))}function lV(t,e,n){var i,r,o=[];t.eachComponent({mainType:"brush"},(function(t){n&&"takeGlobalCursor"===n.type&&t.setBrushOption("brush"===n.key?n.brushOption:{brushType:!1})})),sV(t),t.eachComponent({mainType:"brush"},(function(e,n){var a={brushId:e.id,brushIndex:n,brushName:e.name,areas:T(e.areas),selected:[]};o.push(a);var s=e.option,l=s.brushLink,u=[],h=[],c=[],p=!1;n||(i=s.throttleType,r=s.throttleDelay);var d=z(e.areas,(function(t){var e=cV[t.brushType],n=k({boundingRect:e?e(t):void 0},t);return n.selectors=function(t){var e=t.brushType,n={point:function(i){return eV[e].point(i,n,t)},rect:function(i){return eV[e].rect(i,n,t)}};return n}(n),n})),f=Qz(e.option,rV,(function(t){t.mappingMethod="fixed"}));function g(t){return"all"===l||!!u[t]}function y(t){return!!t.length}Y(l)&&E(l,(function(t){u[t]=1})),t.eachSeries((function(n,i){var r=c[i]=[];"parallel"===n.subType?function(t,e){var n=t.coordinateSystem;p=p||n.hasAxisBrushed(),g(e)&&n.eachActiveState(t.getData(),(function(t,e){"active"===t&&(h[e]=1)}))}(n,i):function(n,i,r){if(!n.brushSelector||function(t,e){var n=t.option.seriesIndex;return null!=n&&"all"!==n&&(Y(n)?P(n,e)<0:e!==n)}(e,i))return;if(E(d,(function(i){e.brushTargetManager.controlSeries(i,n,t)&&r.push(i),p=p||y(r)})),g(i)&&y(r)){var o=n.getData();o.each((function(t){hV(n,r,o,t)&&(h[t]=1)}))}}(n,i,r)})),t.eachSeries((function(t,e){var n={seriesId:t.id,seriesIndex:e,seriesName:t.name,dataIndex:[]};a.selected.push(n);var i=c[e],r=t.getData(),o=g(e)?function(t){return h[t]?(n.dataIndex.push(r.getRawIndex(t)),"inBrush"):"outOfBrush"}:function(e){return hV(t,i,r,e)?(n.dataIndex.push(r.getRawIndex(e)),"inBrush"):"outOfBrush"};(g(e)?p:y(i))&&function(t,e,n,i,r,o){var a,s={};function l(t){return dy(n,a,t)}function u(t,e){gy(n,a,t,e)}function h(t,h){a=null==o?t:h;var c=n.getRawDataItem(a);if(!c||!1!==c.visualMap)for(var p=i.call(r,t),d=e[p],f=s[p],g=0,y=f.length;g<y;g++){var v=f[g];d[v]&&d[v].applyVisual(t,l,u)}}E(t,(function(t){var n=eD.prepareVisualTypes(e[t]);s[t]=n})),null==o?n.each(h):n.each([o],h)}(rV,f,r,o)}))})),function(t,e,n,i,r){if(!r)return;var o=t.getZr();if(o[aV])return;o.__ecBrushSelect||(o.__ecBrushSelect=uV);Dg(o,oV,n,e)(t,i)}(e,i,r,o,n)}function uV(t,e){if(!t.isDisposed()){var n=t.getZr();n[aV]=!0,t.dispatchAction({type:"brushSelect",batch:e}),n[aV]=!1}}function hV(t,e,n,i){for(var r=0,o=e.length;r<o;r++){var a=e[r];if(t.brushSelector(i,n,a.selectors,a))return!0}}var cV={rect:function(t){return pV(t.range)},polygon:function(t){for(var e,n=t.range,i=0,r=n.length;i<r;i++){e=e||[[1/0,-1/0],[1/0,-1/0]];var o=n[i];o[0]<e[0][0]&&(e[0][0]=o[0]),o[0]>e[0][1]&&(e[0][1]=o[0]),o[1]<e[1][0]&&(e[1][0]=o[1]),o[1]>e[1][1]&&(e[1][1]=o[1])}return e&&pV(e)}};function pV(t){return new sr(t[0][0],t[1][0],t[0][1]-t[0][0],t[1][1]-t[1][0])}var dV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(t,e){this.ecModel=t,this.api=e,this.model,(this._brushController=new Pk(e.getZr())).on("brush",W(this._onBrush,this)).mount()},e.prototype.render=function(t,e,n,i){this.model=t,this._updateController(t,e,n,i)},e.prototype.updateTransform=function(t,e,n,i){sV(e),this._updateController(t,e,n,i)},e.prototype.updateVisual=function(t,e,n,i){this.updateTransform(t,e,n,i)},e.prototype.updateView=function(t,e,n,i){this._updateController(t,e,n,i)},e.prototype._updateController=function(t,e,n,i){(!i||i.$from!==t.id)&&this._brushController.setPanels(t.brushTargetManager.makePanelOpts(n)).enableBrush(t.brushOption).updateCovers(t.areas.slice())},e.prototype.dispose=function(){this._brushController.dispose()},e.prototype._onBrush=function(t){var e=this.model.id,n=this.model.brushTargetManager.setOutputRanges(t.areas,this.ecModel);(!t.isEnd||t.removeOnClick)&&this.api.dispatchAction({type:"brush",brushId:e,areas:T(n),$from:e}),t.isEnd&&this.api.dispatchAction({type:"brushEnd",brushId:e,areas:T(n),$from:e})},e.type="brush",e}(fg),fV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.areas=[],n.brushOption={},n}return n(e,t),e.prototype.optionUpdated=function(t,e){var n=this.option;!e&&tV(n,t,["inBrush","outOfBrush"]);var i=n.inBrush=n.inBrush||{};n.outOfBrush=n.outOfBrush||{color:"#ddd"},i.hasOwnProperty("liftZ")||(i.liftZ=5)},e.prototype.setAreas=function(t){t&&(this.areas=z(t,(function(t){return gV(this.option,t)}),this))},e.prototype.setBrushOption=function(t){this.brushOption=gV(this.option,t),this.brushType=this.brushOption.brushType},e.type="brush",e.dependencies=["geo","grid","xAxis","yAxis","parallel","series"],e.defaultOption={seriesIndex:"all",brushType:"rect",brushMode:"single",transformable:!0,brushStyle:{borderWidth:1,color:"rgba(210,219,238,0.3)",borderColor:"#D2DBEE"},throttleType:"fixRate",throttleDelay:0,removeOnClick:!0,z:1e4},e}(Ip);function gV(t,e){return C({brushType:t.brushType,brushMode:t.brushMode,transformable:t.transformable,brushStyle:new pc(t.brushStyle).getItemStyle(),removeOnClick:t.removeOnClick,z:t.z},e,!0)}var yV=["rect","polygon","lineX","lineY","keep","clear"],vV=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.render=function(t,e,n){var i,r,o;e.eachComponent({mainType:"brush"},(function(t){i=t.brushType,r=t.brushOption.brushMode||"single",o=o||!!t.areas.length})),this._brushType=i,this._brushMode=r,E(t.get("type",!0),(function(e){t.setIconStatus(e,("keep"===e?"multiple"===r:"clear"===e?o:e===i)?"emphasis":"normal")}))},e.prototype.updateView=function(t,e,n){this.render(t,e,n)},e.prototype.getIcons=function(){var t=this.model,e=t.get("icon",!0),n={};return E(t.get("type",!0),(function(t){e[t]&&(n[t]=e[t])})),n},e.prototype.onclick=function(t,e,n){var i=this._brushType,r=this._brushMode;"clear"===n?(e.dispatchAction({type:"axisAreaSelect",intervals:[]}),e.dispatchAction({type:"brush",command:"clear",areas:[]})):e.dispatchAction({type:"takeGlobalCursor",key:"brush",brushOption:{brushType:"keep"===n?i:i!==n&&n,brushMode:"keep"===n?"multiple"===r?"single":"multiple":r}})},e.getDefaultOption=function(t){return{show:!0,type:yV.slice(),icon:{rect:"M7.3,34.7 M0.4,10V-0.2h9.8 M89.6,10V-0.2h-9.8 M0.4,60v10.2h9.8 M89.6,60v10.2h-9.8 M12.3,22.4V10.5h13.1 M33.6,10.5h7.8 M49.1,10.5h7.8 M77.5,22.4V10.5h-13 M12.3,31.1v8.2 M77.7,31.1v8.2 M12.3,47.6v11.9h13.1 M33.6,59.5h7.6 M49.1,59.5 h7.7 M77.5,47.6v11.9h-13",polygon:"M55.2,34.9c1.7,0,3.1,1.4,3.1,3.1s-1.4,3.1-3.1,3.1 s-3.1-1.4-3.1-3.1S53.5,34.9,55.2,34.9z M50.4,51c1.7,0,3.1,1.4,3.1,3.1c0,1.7-1.4,3.1-3.1,3.1c-1.7,0-3.1-1.4-3.1-3.1 C47.3,52.4,48.7,51,50.4,51z M55.6,37.1l1.5-7.8 M60.1,13.5l1.6-8.7l-7.8,4 M59,19l-1,5.3 M24,16.1l6.4,4.9l6.4-3.3 M48.5,11.6 l-5.9,3.1 M19.1,12.8L9.7,5.1l1.1,7.7 M13.4,29.8l1,7.3l6.6,1.6 M11.6,18.4l1,6.1 M32.8,41.9 M26.6,40.4 M27.3,40.2l6.1,1.6 M49.9,52.1l-5.6-7.6l-4.9-1.2",lineX:"M15.2,30 M19.7,15.6V1.9H29 M34.8,1.9H40.4 M55.3,15.6V1.9H45.9 M19.7,44.4V58.1H29 M34.8,58.1H40.4 M55.3,44.4 V58.1H45.9 M12.5,20.3l-9.4,9.6l9.6,9.8 M3.1,29.9h16.5 M62.5,20.3l9.4,9.6L62.3,39.7 M71.9,29.9H55.4",lineY:"M38.8,7.7 M52.7,12h13.2v9 M65.9,26.6V32 M52.7,46.3h13.2v-9 M24.9,12H11.8v9 M11.8,26.6V32 M24.9,46.3H11.8v-9 M48.2,5.1l-9.3-9l-9.4,9.2 M38.9-3.9V12 M48.2,53.3l-9.3,9l-9.4-9.2 M38.9,62.3V46.4",keep:"M4,10.5V1h10.3 M20.7,1h6.1 M33,1h6.1 M55.4,10.5V1H45.2 M4,17.3v6.6 M55.6,17.3v6.6 M4,30.5V40h10.3 M20.7,40 h6.1 M33,40h6.1 M55.4,30.5V40H45.2 M21,18.9h62.9v48.6H21V18.9z",clear:"M22,14.7l30.9,31 M52.9,14.7L22,45.7 M4.7,16.8V4.2h13.1 M26,4.2h7.8 M41.6,4.2h7.8 M70.3,16.8V4.2H57.2 M4.7,25.9v8.6 M70.3,25.9v8.6 M4.7,43.2v12.6h13.1 M26,55.8h7.8 M41.6,55.8h7.8 M70.3,43.2v12.6H57.2"},title:t.getLocaleModel().get(["toolbox","brush","title"])}},e}(FE);var mV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.layoutMode={type:"box",ignoreSize:!0},n}return n(e,t),e.type="title",e.defaultOption={z:6,show:!0,text:"",target:"blank",subtext:"",subtarget:"blank",left:0,top:0,backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,textStyle:{fontSize:18,fontWeight:"bold",color:"#464646"},subtextStyle:{fontSize:12,color:"#6E7079"}},e}(Ip),xV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){if(this.group.removeAll(),t.get("show")){var i=this.group,r=t.getModel("textStyle"),o=t.getModel("subtextStyle"),a=t.get("textAlign"),s=rt(t.get("textBaseline"),t.get("textVerticalAlign")),l=new As({style:Yh(r,{text:t.get("text"),fill:r.getTextColor()},{disableBox:!0}),z2:10}),u=l.getBoundingRect(),h=t.get("subtext"),c=new As({style:Yh(o,{text:h,fill:o.getTextColor(),y:u.height+t.get("itemGap"),verticalAlign:"top"},{disableBox:!0}),z2:10}),p=t.get("link"),d=t.get("sublink"),f=t.get("triggerEvent",!0);l.silent=!p&&!f,c.silent=!d&&!f,p&&l.on("click",(function(){pp(p,"_"+t.get("target"))})),d&&c.on("click",(function(){pp(d,"_"+t.get("subtarget"))})),Ws(l).eventData=Ws(c).eventData=f?{componentType:"title",componentIndex:t.componentIndex}:null,i.add(l),h&&i.add(c);var g=i.getBoundingRect(),y=t.getBoxLayoutParams();y.width=g.width,y.height=g.height;var v=mp(y,{width:n.getWidth(),height:n.getHeight()},t.get("padding"));a||("middle"===(a=t.get("left")||t.get("right"))&&(a="center"),"right"===a?v.x+=v.width:"center"===a&&(v.x+=v.width/2)),s||("center"===(s=t.get("top")||t.get("bottom"))&&(s="middle"),"bottom"===s?v.y+=v.height:"middle"===s&&(v.y+=v.height/2),s=s||"top"),i.x=v.x,i.y=v.y,i.markRedraw();var m={align:a,verticalAlign:s};l.setStyle(m),c.setStyle(m),g=i.getBoundingRect();var x=v.margin,_=t.getItemStyle(["color","opacity"]);_.fill=t.get("backgroundColor");var b=new Ts({shape:{x:g.x-x[3],y:g.y-x[0],width:g.width+x[1]+x[3],height:g.height+x[0]+x[2],r:t.get("borderRadius")},style:_,subPixelOptimize:!0,silent:!0});i.add(b)}},e.type="title",e}(fg);var _V=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.layoutMode="box",n}return n(e,t),e.prototype.init=function(t,e,n){this.mergeDefaultAndTheme(t,n),this._initData()},e.prototype.mergeOption=function(e){t.prototype.mergeOption.apply(this,arguments),this._initData()},e.prototype.setCurrentIndex=function(t){null==t&&(t=this.option.currentIndex);var e=this._data.count();this.option.loop?t=(t%e+e)%e:(t>=e&&(t=e-1),t<0&&(t=0)),this.option.currentIndex=t},e.prototype.getCurrentIndex=function(){return this.option.currentIndex},e.prototype.isIndexMax=function(){return this.getCurrentIndex()>=this._data.count()-1},e.prototype.setPlayState=function(t){this.option.autoPlay=!!t},e.prototype.getPlayState=function(){return!!this.option.autoPlay},e.prototype._initData=function(){var t,e=this.option,n=e.data||[],i=e.axisType,r=this._names=[];"category"===i?(t=[],E(n,(function(e,n){var i,o=xo(fo(e),"");q(e)?(i=T(e)).value=n:i=n,t.push(i),r.push(o)}))):t=n;var o={category:"ordinal",time:"time",value:"number"}[i]||"number";(this._data=new Zm([{name:"value",type:o}],this)).initData(t,r)},e.prototype.getData=function(){return this._data},e.prototype.getCategories=function(){if("category"===this.get("axisType"))return this._names.slice()},e.type="timeline",e.defaultOption={z:4,show:!0,axisType:"time",realtime:!0,left:"20%",top:null,right:"20%",bottom:0,width:null,height:40,padding:5,controlPosition:"left",autoPlay:!1,rewind:!1,loop:!0,playInterval:2e3,currentIndex:0,itemStyle:{},label:{color:"#000"},data:[]},e}(Ip),bV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="timeline.slider",e.defaultOption=gc(_V.defaultOption,{backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,orient:"horizontal",inverse:!1,tooltip:{trigger:"item"},symbol:"circle",symbolSize:12,lineStyle:{show:!0,width:2,color:"#DAE1F5"},label:{position:"auto",show:!0,interval:"auto",rotate:0,color:"#A4B1D7"},itemStyle:{color:"#A4B1D7",borderWidth:1},checkpointStyle:{symbol:"circle",symbolSize:15,color:"#316bf3",borderColor:"#fff",borderWidth:2,shadowBlur:2,shadowOffsetX:1,shadowOffsetY:1,shadowColor:"rgba(0, 0, 0, 0.3)",animation:!0,animationDuration:300,animationEasing:"quinticInOut"},controlStyle:{show:!0,showPlayBtn:!0,showPrevBtn:!0,showNextBtn:!0,itemSize:24,itemGap:12,position:"left",playIcon:"path://M31.6,53C17.5,53,6,41.5,6,27.4S17.5,1.8,31.6,1.8C45.7,1.8,57.2,13.3,57.2,27.4S45.7,53,31.6,53z M31.6,3.3 C18.4,3.3,7.5,14.1,7.5,27.4c0,13.3,10.8,24.1,24.1,24.1C44.9,51.5,55.7,40.7,55.7,27.4C55.7,14.1,44.9,3.3,31.6,3.3z M24.9,21.3 c0-2.2,1.6-3.1,3.5-2l10.5,6.1c1.899,1.1,1.899,2.9,0,4l-10.5,6.1c-1.9,1.1-3.5,0.2-3.5-2V21.3z",stopIcon:"path://M30.9,53.2C16.8,53.2,5.3,41.7,5.3,27.6S16.8,2,30.9,2C45,2,56.4,13.5,56.4,27.6S45,53.2,30.9,53.2z M30.9,3.5C17.6,3.5,6.8,14.4,6.8,27.6c0,13.3,10.8,24.1,24.101,24.1C44.2,51.7,55,40.9,55,27.6C54.9,14.4,44.1,3.5,30.9,3.5z M36.9,35.8c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H36c0.5,0,0.9,0.4,0.9,1V35.8z M27.8,35.8 c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H27c0.5,0,0.9,0.4,0.9,1L27.8,35.8L27.8,35.8z",nextIcon:"M2,18.5A1.52,1.52,0,0,1,.92,18a1.49,1.49,0,0,1,0-2.12L7.81,9.36,1,3.11A1.5,1.5,0,1,1,3,.89l8,7.34a1.48,1.48,0,0,1,.49,1.09,1.51,1.51,0,0,1-.46,1.1L3,18.08A1.5,1.5,0,0,1,2,18.5Z",prevIcon:"M10,.5A1.52,1.52,0,0,1,11.08,1a1.49,1.49,0,0,1,0,2.12L4.19,9.64,11,15.89a1.5,1.5,0,1,1-2,2.22L1,10.77A1.48,1.48,0,0,1,.5,9.68,1.51,1.51,0,0,1,1,8.58L9,.92A1.5,1.5,0,0,1,10,.5Z",prevBtnSize:18,nextBtnSize:18,color:"#A4B1D7",borderColor:"#A4B1D7",borderWidth:1},emphasis:{label:{show:!0,color:"#6f778d"},itemStyle:{color:"#316BF3"},controlStyle:{color:"#316BF3",borderColor:"#316BF3",borderWidth:2}},progress:{lineStyle:{color:"#316BF3"},itemStyle:{color:"#316BF3"},label:{color:"#6f778d"}},data:[]}),e}(_V);R(bV,sf.prototype);var wV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="timeline",e}(fg),SV=function(t){function e(e,n,i,r){var o=t.call(this,e,n,i)||this;return o.type=r||"value",o}return n(e,t),e.prototype.getLabelModel=function(){return this.model.getModel("label")},e.prototype.isHorizontal=function(){return"horizontal"===this.model.get("orient")},e}(G_),MV=Math.PI,IV=So(),TV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(t,e){this.api=e},e.prototype.render=function(t,e,n){if(this.model=t,this.api=n,this.ecModel=e,this.group.removeAll(),t.get("show",!0)){var i=this._layout(t,n),r=this._createGroup("_mainGroup"),o=this._createGroup("_labelGroup"),a=this._axis=this._createAxis(i,t);t.formatTooltip=function(t){return Uf("nameValue",{noName:!0,value:a.scale.getLabel({value:t})})},E(["AxisLine","AxisTick","Control","CurrentPointer"],(function(e){this["_render"+e](i,r,a,t)}),this),this._renderAxisLabel(i,o,a,t),this._position(i,t)}this._doPlayStop(),this._updateTicksStatus()},e.prototype.remove=function(){this._clearTimer(),this.group.removeAll()},e.prototype.dispose=function(){this._clearTimer()},e.prototype._layout=function(t,e){var n,i,r,o,a=t.get(["label","position"]),s=t.get("orient"),l=function(t,e){return mp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()},t.get("padding"))}(t,e),u={horizontal:"center",vertical:(n=null==a||"auto"===a?"horizontal"===s?l.y+l.height/2<e.getHeight()/2?"-":"+":l.x+l.width/2<e.getWidth()/2?"+":"-":X(a)?{horizontal:{top:"-",bottom:"+"},vertical:{left:"-",right:"+"}}[s][a]:a)>=0||"+"===n?"left":"right"},h={horizontal:n>=0||"+"===n?"top":"bottom",vertical:"middle"},c={horizontal:0,vertical:MV/2},p="vertical"===s?l.height:l.width,d=t.getModel("controlStyle"),f=d.get("show",!0),g=f?d.get("itemSize"):0,y=f?d.get("itemGap"):0,v=g+y,m=t.get(["label","rotate"])||0;m=m*MV/180;var x=d.get("position",!0),_=f&&d.get("showPlayBtn",!0),b=f&&d.get("showPrevBtn",!0),w=f&&d.get("showNextBtn",!0),S=0,M=p;"left"===x||"bottom"===x?(_&&(i=[0,0],S+=v),b&&(r=[S,0],S+=v),w&&(o=[M-g,0],M-=v)):(_&&(i=[M-g,0],M-=v),b&&(r=[0,0],S+=v),w&&(o=[M-g,0],M-=v));var I=[S,M];return t.get("inverse")&&I.reverse(),{viewRect:l,mainLength:p,orient:s,rotation:c[s],labelRotation:m,labelPosOpt:n,labelAlign:t.get(["label","align"])||u[s],labelBaseline:t.get(["label","verticalAlign"])||t.get(["label","baseline"])||h[s],playPosition:i,prevBtnPosition:r,nextBtnPosition:o,axisExtent:I,controlSize:g,controlGap:y}},e.prototype._position=function(t,e){var n=this._mainGroup,i=this._labelGroup,r=t.viewRect;if("vertical"===t.orient){var o=[1,0,0,1,0,0],a=r.x,s=r.y+r.height;Ei(o,o,[-a,-s]),zi(o,o,-MV/2),Ei(o,o,[a,s]),(r=r.clone()).applyTransform(o)}var l=y(r),u=y(n.getBoundingRect()),h=y(i.getBoundingRect()),c=[n.x,n.y],p=[i.x,i.y];p[0]=c[0]=l[0][0];var d,f=t.labelPosOpt;null==f||X(f)?(v(c,u,l,1,d="+"===f?0:1),v(p,h,l,1,1-d)):(v(c,u,l,1,d=f>=0?0:1),p[1]=c[1]+f);function g(t){t.originX=l[0][0]-t.x,t.originY=l[1][0]-t.y}function y(t){return[[t.x,t.x+t.width],[t.y,t.y+t.height]]}function v(t,e,n,i,r){t[i]+=n[i][r]-e[i][r]}n.setPosition(c),i.setPosition(p),n.rotation=i.rotation=t.rotation,g(n),g(i)},e.prototype._createAxis=function(t,e){var n=e.getData(),i=e.get("axisType"),r=function(t,e){if(e=e||t.get("type"))switch(e){case"category":return new gx({ordinalMeta:t.getCategories(),extent:[1/0,-1/0]});case"time":return new Px({locale:t.ecModel.getLocaleModel(),useUTC:t.ecModel.get("useUTC")});default:return new vx}}(e,i);r.getTicks=function(){return n.mapArray(["value"],(function(t){return{value:t}}))};var o=n.getDataExtent("value");r.setExtent(o[0],o[1]),r.calcNiceTicks();var a=new SV("value",r,t.axisExtent,i);return a.model=e,a},e.prototype._createGroup=function(t){var e=this[t]=new Cr;return this.group.add(e),e},e.prototype._renderAxisLine=function(t,e,n,i){var r=n.getExtent();if(i.get(["lineStyle","show"])){var o=new Eu({shape:{x1:r[0],y1:0,x2:r[1],y2:0},style:A({lineCap:"round"},i.getModel("lineStyle").getLineStyle()),silent:!0,z2:1});e.add(o);var a=this._progressLine=new Eu({shape:{x1:r[0],x2:this._currentPointer?this._currentPointer.x:r[0],y1:0,y2:0},style:k({lineCap:"round",lineWidth:o.style.lineWidth},i.getModel(["progress","lineStyle"]).getLineStyle()),silent:!0,z2:1});e.add(a)}},e.prototype._renderAxisTick=function(t,e,n,i){var r=this,o=i.getData(),a=n.scale.getTicks();this._tickSymbols=[],E(a,(function(t){var a=n.dataToCoord(t.value),s=o.getItemModel(t.value),l=s.getModel("itemStyle"),u=s.getModel(["emphasis","itemStyle"]),h=s.getModel(["progress","itemStyle"]),c={x:a,y:0,onclick:W(r._changeTimeline,r,t.value)},p=CV(s,l,e,c);p.ensureState("emphasis").style=u.getItemStyle(),p.ensureState("progress").style=h.getItemStyle(),Pl(p);var d=Ws(p);s.get("tooltip")?(d.dataIndex=t.value,d.dataModel=i):d.dataIndex=d.dataModel=null,r._tickSymbols.push(p)}))},e.prototype._renderAxisLabel=function(t,e,n,i){var r=this;if(n.getLabelModel().get("show")){var o=i.getData(),a=n.getViewLabels();this._tickLabels=[],E(a,(function(i){var a=i.tickValue,s=o.getItemModel(a),l=s.getModel("label"),u=s.getModel(["emphasis","label"]),h=s.getModel(["progress","label"]),c=n.dataToCoord(i.tickValue),p=new As({x:c,y:0,rotation:t.labelRotation-t.rotation,onclick:W(r._changeTimeline,r,a),silent:!1,style:Yh(l,{text:i.formattedLabel,align:t.labelAlign,verticalAlign:t.labelBaseline})});p.ensureState("emphasis").style=Yh(u),p.ensureState("progress").style=Yh(h),e.add(p),Pl(p),IV(p).dataIndex=a,r._tickLabels.push(p)}))}},e.prototype._renderControl=function(t,e,n,i){var r=t.controlSize,o=t.rotation,a=i.getModel("controlStyle").getItemStyle(),s=i.getModel(["emphasis","controlStyle"]).getItemStyle(),l=i.getPlayState(),u=i.get("inverse",!0);function h(t,n,l,u){if(t){var h=gr(rt(i.get(["controlStyle",n+"BtnSize"]),r),r),c=function(t,e,n,i){var r=i.style,o=Lh(t.get(["controlStyle",e]),i||{},new sr(n[0],n[1],n[2],n[3]));r&&o.setStyle(r);return o}(i,n+"Icon",[0,-h/2,h,h],{x:t[0],y:t[1],originX:r/2,originY:0,rotation:u?-o:0,rectHover:!0,style:a,onclick:l});c.ensureState("emphasis").style=s,e.add(c),Pl(c)}}h(t.nextBtnPosition,"next",W(this._changeTimeline,this,u?"-":"+")),h(t.prevBtnPosition,"prev",W(this._changeTimeline,this,u?"+":"-")),h(t.playPosition,l?"stop":"play",W(this._handlePlayClick,this,!l),!0)},e.prototype._renderCurrentPointer=function(t,e,n,i){var r=i.getData(),o=i.getCurrentIndex(),a=r.getItemModel(o).getModel("checkpointStyle"),s=this,l={onCreate:function(t){t.draggable=!0,t.drift=W(s._handlePointerDrag,s),t.ondragend=W(s._handlePointerDragend,s),DV(t,s._progressLine,o,n,i,!0)},onUpdate:function(t){DV(t,s._progressLine,o,n,i)}};this._currentPointer=CV(a,a,this._mainGroup,{},this._currentPointer,l)},e.prototype._handlePlayClick=function(t){this._clearTimer(),this.api.dispatchAction({type:"timelinePlayChange",playState:t,from:this.uid})},e.prototype._handlePointerDrag=function(t,e,n){this._clearTimer(),this._pointerChangeTimeline([n.offsetX,n.offsetY])},e.prototype._handlePointerDragend=function(t){this._pointerChangeTimeline([t.offsetX,t.offsetY],!0)},e.prototype._pointerChangeTimeline=function(t,e){var n=this._toAxisCoord(t)[0],i=Vr(this._axis.getExtent().slice());n>i[1]&&(n=i[1]),n<i[0]&&(n=i[0]),this._currentPointer.x=n,this._currentPointer.markRedraw(),this._progressLine.shape.x2=n,this._progressLine.dirty();var r=this._findNearestTick(n),o=this.model;(e||r!==o.getCurrentIndex()&&o.get("realtime"))&&this._changeTimeline(r)},e.prototype._doPlayStop=function(){var t=this;this._clearTimer(),this.model.getPlayState()&&(this._timer=setTimeout((function(){var e=t.model;t._changeTimeline(e.getCurrentIndex()+(e.get("rewind",!0)?-1:1))}),this.model.get("playInterval")))},e.prototype._toAxisCoord=function(t){return Ih(t,this._mainGroup.getLocalTransform(),!0)},e.prototype._findNearestTick=function(t){var e,n=this.model.getData(),i=1/0,r=this._axis;return n.each(["value"],(function(n,o){var a=r.dataToCoord(n),s=Math.abs(a-t);s<i&&(i=s,e=o)})),e},e.prototype._clearTimer=function(){this._timer&&(clearTimeout(this._timer),this._timer=null)},e.prototype._changeTimeline=function(t){var e=this.model.getCurrentIndex();"+"===t?t=e+1:"-"===t&&(t=e-1),this.api.dispatchAction({type:"timelineChange",currentIndex:t,from:this.uid})},e.prototype._updateTicksStatus=function(){var t=this.model.getCurrentIndex(),e=this._tickSymbols,n=this._tickLabels;if(e)for(var i=0;i<e.length;i++)e&&e[i]&&e[i].toggleState("progress",i<t);if(n)for(i=0;i<n.length;i++)n&&n[i]&&n[i].toggleState("progress",IV(n[i]).dataIndex<=t)},e.type="timeline.slider",e}(wV);function CV(t,e,n,i,r,o){var a=e.get("color");r?(r.setColor(a),n.add(r),o&&o.onUpdate(r)):((r=ky(t.get("symbol"),-1,-1,2,2,a)).setStyle("strokeNoScale",!0),n.add(r),o&&o.onCreate(r));var s=e.getItemStyle(["color"]);r.setStyle(s),i=C({rectHover:!0,z2:100},i,!0);var l=Ly(t.get("symbolSize"));i.scaleX=l[0]/2,i.scaleY=l[1]/2;var u=Py(t.get("symbolOffset"),l);u&&(i.x=(i.x||0)+u[0],i.y=(i.y||0)+u[1]);var h=t.get("symbolRotate");return i.rotation=(h||0)*Math.PI/180||0,r.attr(i),r.updateTransform(),r}function DV(t,e,n,i,r,o){if(!t.dragging){var a=r.getModel("checkpointStyle"),s=i.dataToCoord(r.getData().get("value",n));if(o||!a.get("animation",!0))t.attr({x:s,y:0}),e&&e.attr({shape:{x2:s}});else{var l={duration:a.get("animationDuration",!0),easing:a.get("animationEasing",!0)};t.stopAnimation(null,!0),t.animateTo({x:s,y:0},l),e&&e.animateTo({shape:{x2:s}},l)}}}function AV(t){var e=t&&t.timeline;Y(e)||(e=e?[e]:[]),E(e,(function(t){t&&function(t){var e=t.type,n={number:"value",time:"time"};n[e]&&(t.axisType=n[e],delete t.type);if(kV(t),LV(t,"controlPosition")){var i=t.controlStyle||(t.controlStyle={});LV(i,"position")||(i.position=t.controlPosition),"none"!==i.position||LV(i,"show")||(i.show=!1,delete i.position),delete t.controlPosition}E(t.data||[],(function(t){q(t)&&!Y(t)&&(!LV(t,"value")&&LV(t,"name")&&(t.value=t.name),kV(t))}))}(t)}))}function kV(t){var e=t.itemStyle||(t.itemStyle={}),n=e.emphasis||(e.emphasis={}),i=t.label||t.label||{},r=i.normal||(i.normal={}),o={normal:1,emphasis:1};E(i,(function(t,e){o[e]||LV(r,e)||(r[e]=t)})),n.label&&!LV(i,"emphasis")&&(i.emphasis=n.label,delete n.label)}function LV(t,e){return t.hasOwnProperty(e)}function PV(t,e){if(!t)return!1;for(var n=Y(t)?t:[t],i=0;i<n.length;i++)if(n[i]&&n[i][e])return!0;return!1}function OV(t){co(t,"label",["show"])}var RV=So(),NV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.createdBySelf=!1,n}return n(e,t),e.prototype.init=function(t,e,n){this.mergeDefaultAndTheme(t,n),this._mergeOption(t,n,!1,!0)},e.prototype.isAnimationEnabled=function(){if(r.node)return!1;var t=this.__hostSeries;return this.getShallow("animation")&&t&&t.isAnimationEnabled()},e.prototype.mergeOption=function(t,e){this._mergeOption(t,e,!1,!1)},e.prototype._mergeOption=function(t,e,n,i){var r=this.mainType;n||e.eachSeries((function(t){var n=t.get(this.mainType,!0),o=RV(t)[r];n&&n.data?(o?o._mergeOption(n,e,!0):(i&&OV(n),E(n.data,(function(t){t instanceof Array?(OV(t[0]),OV(t[1])):OV(t)})),A(o=this.createMarkerModelFromSeries(n,this,e),{mainType:this.mainType,seriesIndex:t.seriesIndex,name:t.name,createdBySelf:!0}),o.__hostSeries=t),RV(t)[r]=o):RV(t)[r]=null}),this)},e.prototype.formatTooltip=function(t,e,n){var i=this.getData(),r=this.getRawValue(t),o=i.getName(t);return Uf("section",{header:this.name,blocks:[Uf("nameValue",{name:o,value:r,noName:!o,noValue:null==r})]})},e.prototype.getData=function(){return this._data},e.prototype.setData=function(t){this._data=t},e.getMarkerModelFromSeries=function(t,e){return RV(t)[e]},e.type="marker",e.dependencies=["series","grid","polar","geo"],e}(Ip);R(NV,sf.prototype);var EV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.createMarkerModelFromSeries=function(t,n,i){return new e(t,n,i)},e.type="markPoint",e.defaultOption={z:5,symbol:"pin",symbolSize:50,tooltip:{trigger:"item"},label:{show:!0,position:"inside"},itemStyle:{borderWidth:2},emphasis:{label:{show:!0}}},e}(NV);function zV(t,e,n,i,r,o){var a=[],s=tx(e,i)?e.getCalculationInfo("stackResultDimension"):i,l=HV(e,s,t),u=e.indicesOfNearest(s,l)[0];a[r]=e.get(n,u),a[o]=e.get(s,u);var h=e.get(i,u),c=Br(e.get(i,u));return(c=Math.min(c,20))>=0&&(a[o]=+a[o].toFixed(c)),[a,h]}var VV={min:H(zV,"min"),max:H(zV,"max"),average:H(zV,"average"),median:H(zV,"median")};function BV(t,e){var n=t.getData(),i=t.coordinateSystem;if(e&&!function(t){return!isNaN(parseFloat(t.x))&&!isNaN(parseFloat(t.y))}(e)&&!Y(e.coord)&&i){var r=i.dimensions,o=FV(e,n,i,t);if((e=T(e)).type&&VV[e.type]&&o.baseAxis&&o.valueAxis){var a=P(r,o.baseAxis.dim),s=P(r,o.valueAxis.dim),l=VV[e.type](n,o.baseDataDim,o.valueDataDim,a,s);e.coord=l[0],e.value=l[1]}else{for(var u=[null!=e.xAxis?e.xAxis:e.radiusAxis,null!=e.yAxis?e.yAxis:e.angleAxis],h=0;h<2;h++)VV[u[h]]&&(u[h]=HV(n,n.mapDimension(r[h]),u[h]));e.coord=u}}return e}function FV(t,e,n,i){var r={};return null!=t.valueIndex||null!=t.valueDim?(r.valueDataDim=null!=t.valueIndex?e.getDimension(t.valueIndex):t.valueDim,r.valueAxis=n.getAxis(function(t,e){var n=t.getData().getDimensionInfo(e);return n&&n.coordDim}(i,r.valueDataDim)),r.baseAxis=n.getOtherAxis(r.valueAxis),r.baseDataDim=e.mapDimension(r.baseAxis.dim)):(r.baseAxis=i.getBaseAxis(),r.valueAxis=n.getOtherAxis(r.baseAxis),r.baseDataDim=e.mapDimension(r.baseAxis.dim),r.valueDataDim=e.mapDimension(r.valueAxis.dim)),r}function GV(t,e){return!(t&&t.containData&&e.coord&&!function(t){return!(isNaN(parseFloat(t.x))&&isNaN(parseFloat(t.y)))}(e))||t.containData(e.coord)}function WV(t,e){return t?function(t,n,i,r){return pf(r<2?t.coord&&t.coord[r]:t.value,e[r])}:function(t,n,i,r){return pf(t.value,e[r])}}function HV(t,e,n){if("average"===n){var i=0,r=0;return t.each(e,(function(t,e){isNaN(t)||(i+=t,r++)})),i/r}return"median"===n?t.getMedian(e):t.getDataExtent(e)["max"===n?1:0]}var YV=So(),UV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(){this.markerGroupMap=ft()},e.prototype.render=function(t,e,n){var i=this,r=this.markerGroupMap;r.each((function(t){YV(t).keep=!1})),e.eachSeries((function(t){var r=NV.getMarkerModelFromSeries(t,i.type);r&&i.renderSeries(t,r,e,n)})),r.each((function(t){!YV(t).keep&&i.group.remove(t.group)}))},e.prototype.markKeep=function(t){YV(t).keep=!0},e.prototype.blurSeries=function(t){var e=this;E(t,(function(t){var n=NV.getMarkerModelFromSeries(t,e.type);n&&n.getData().eachItemGraphicEl((function(t){t&&bl(t)}))}))},e.type="marker",e}(fg);function XV(t,e,n){var i=e.coordinateSystem;t.each((function(r){var o,a=t.getItemModel(r),s=Er(a.get("x"),n.getWidth()),l=Er(a.get("y"),n.getHeight());if(isNaN(s)||isNaN(l)){if(e.getMarkerPosition)o=e.getMarkerPosition(t.getValues(t.dimensions,r));else if(i){var u=t.get(i.dimensions[0],r),h=t.get(i.dimensions[1],r);o=i.dataToPoint([u,h])}}else o=[s,l];isNaN(s)||(o[0]=s),isNaN(l)||(o[1]=l),t.setItemLayout(r,o)}))}var ZV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.updateTransform=function(t,e,n){e.eachSeries((function(t){var e=NV.getMarkerModelFromSeries(t,"markPoint");e&&(XV(e.getData(),t,n),this.markerGroupMap.get(t.id).updateLayout())}),this)},e.prototype.renderSeries=function(t,e,n,i){var r=t.coordinateSystem,o=t.id,a=t.getData(),s=this.markerGroupMap,l=s.get(o)||s.set(o,new Zw),u=function(t,e,n){var i;i=t?z(t&&t.dimensions,(function(t){return A(A({},e.getData().getDimensionInfo(e.getData().mapDimension(t))||{}),{name:t,ordinalMeta:null})})):[{name:"value",type:"float"}];var r=new Zm(i,n),o=z(n.get("data"),H(BV,e));t&&(o=B(o,H(GV,t)));var a=WV(!!t,i);return r.initData(o,null,a),r}(r,t,e);e.setData(u),XV(e.getData(),t,i),u.each((function(t){var n=u.getItemModel(t),i=n.getShallow("symbol"),r=n.getShallow("symbolSize"),o=n.getShallow("symbolRotate"),s=n.getShallow("symbolOffset"),l=n.getShallow("symbolKeepAspect");if(U(i)||U(r)||U(o)||U(s)){var h=e.getRawValue(t),c=e.getDataParams(t);U(i)&&(i=i(h,c)),U(r)&&(r=r(h,c)),U(o)&&(o=o(h,c)),U(s)&&(s=s(h,c))}var p=n.getModel("itemStyle").getItemStyle(),d=fy(a,"color");p.fill||(p.fill=d),u.setItemVisual(t,{symbol:i,symbolSize:r,symbolRotate:o,symbolOffset:s,symbolKeepAspect:l,style:p})})),l.updateData(u),this.group.add(l.group),u.eachItemGraphicEl((function(t){t.traverse((function(t){Ws(t).dataModel=e}))})),this.markKeep(l),l.group.silent=e.get("silent")||t.get("silent")},e.type="markPoint",e}(UV);var jV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.createMarkerModelFromSeries=function(t,n,i){return new e(t,n,i)},e.type="markLine",e.defaultOption={z:5,symbol:["circle","arrow"],symbolSize:[8,16],symbolOffset:0,precision:2,tooltip:{trigger:"item"},label:{show:!0,position:"end",distance:5},lineStyle:{type:"dashed"},emphasis:{label:{show:!0},lineStyle:{width:3}},animationEasing:"linear"},e}(NV),qV=So(),KV=function(t,e,n,i){var r,o=t.getData();if(Y(i))r=i;else{var a=i.type;if("min"===a||"max"===a||"average"===a||"median"===a||null!=i.xAxis||null!=i.yAxis){var s=void 0,l=void 0;if(null!=i.yAxis||null!=i.xAxis)s=e.getAxis(null!=i.yAxis?"y":"x"),l=it(i.yAxis,i.xAxis);else{var u=FV(i,o,e,t);s=u.valueAxis,l=HV(o,ex(o,u.valueDataDim),a)}var h="x"===s.dim?0:1,c=1-h,p=T(i),d={coord:[]};p.type=null,p.coord=[],p.coord[c]=-1/0,d.coord[c]=1/0;var f=n.get("precision");f>=0&&j(l)&&(l=+l.toFixed(Math.min(f,20))),p.coord[h]=d.coord[h]=l,r=[p,d,{type:a,valueIndex:i.valueIndex,value:l}]}else r=[]}var g=[BV(t,r[0]),BV(t,r[1]),A({},r[2])];return g[2].type=g[2].type||null,C(g[2],g[0]),C(g[2],g[1]),g};function $V(t){return!isNaN(t)&&!isFinite(t)}function JV(t,e,n,i){var r=1-t,o=i.dimensions[t];return $V(e[r])&&$V(n[r])&&e[t]===n[t]&&i.getAxis(o).containData(e[t])}function QV(t,e){if("cartesian2d"===t.type){var n=e[0].coord,i=e[1].coord;if(n&&i&&(JV(1,n,i,t)||JV(0,n,i,t)))return!0}return GV(t,e[0])&&GV(t,e[1])}function tB(t,e,n,i,r){var o,a=i.coordinateSystem,s=t.getItemModel(e),l=Er(s.get("x"),r.getWidth()),u=Er(s.get("y"),r.getHeight());if(isNaN(l)||isNaN(u)){if(i.getMarkerPosition)o=i.getMarkerPosition(t.getValues(t.dimensions,e));else{var h=a.dimensions,c=t.get(h[0],e),p=t.get(h[1],e);o=a.dataToPoint([c,p])}if(sS(a,"cartesian2d")){var d=a.getAxis("x"),f=a.getAxis("y");h=a.dimensions;$V(t.get(h[0],e))?o[0]=d.toGlobalCoord(d.getExtent()[n?0:1]):$V(t.get(h[1],e))&&(o[1]=f.toGlobalCoord(f.getExtent()[n?0:1]))}isNaN(l)||(o[0]=l),isNaN(u)||(o[1]=u)}else o=[l,u];t.setItemLayout(e,o)}var eB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.updateTransform=function(t,e,n){e.eachSeries((function(t){var e=NV.getMarkerModelFromSeries(t,"markLine");if(e){var i=e.getData(),r=qV(e).from,o=qV(e).to;r.each((function(e){tB(r,e,!0,t,n),tB(o,e,!1,t,n)})),i.each((function(t){i.setItemLayout(t,[r.getItemLayout(t),o.getItemLayout(t)])})),this.markerGroupMap.get(t.id).updateLayout()}}),this)},e.prototype.renderSeries=function(t,e,n,i){var r=t.coordinateSystem,o=t.id,a=t.getData(),s=this.markerGroupMap,l=s.get(o)||s.set(o,new dA);this.group.add(l.group);var u=function(t,e,n){var i;i=t?z(t&&t.dimensions,(function(t){return A(A({},e.getData().getDimensionInfo(e.getData().mapDimension(t))||{}),{name:t,ordinalMeta:null})})):[{name:"value",type:"float"}];var r=new Zm(i,n),o=new Zm(i,n),a=new Zm([],n),s=z(n.get("data"),H(KV,e,t,n));t&&(s=B(s,H(QV,t)));var l=WV(!!t,i);return r.initData(z(s,(function(t){return t[0]})),null,l),o.initData(z(s,(function(t){return t[1]})),null,l),a.initData(z(s,(function(t){return t[2]}))),a.hasItemOption=!0,{from:r,to:o,line:a}}(r,t,e),h=u.from,c=u.to,p=u.line;qV(e).from=h,qV(e).to=c,e.setData(p);var d=e.get("symbol"),f=e.get("symbolSize"),g=e.get("symbolRotate"),y=e.get("symbolOffset");function v(e,n,r){var o=e.getItemModel(n);tB(e,n,r,t,i);var s=o.getModel("itemStyle").getItemStyle();null==s.fill&&(s.fill=fy(a,"color")),e.setItemVisual(n,{symbolKeepAspect:o.get("symbolKeepAspect"),symbolOffset:rt(o.get("symbolOffset",!0),y[r?0:1]),symbolRotate:rt(o.get("symbolRotate",!0),g[r?0:1]),symbolSize:rt(o.get("symbolSize"),f[r?0:1]),symbol:rt(o.get("symbol",!0),d[r?0:1]),style:s})}Y(d)||(d=[d,d]),Y(f)||(f=[f,f]),Y(g)||(g=[g,g]),Y(y)||(y=[y,y]),u.from.each((function(t){v(h,t,!0),v(c,t,!1)})),p.each((function(t){var e=p.getItemModel(t).getModel("lineStyle").getLineStyle();p.setItemLayout(t,[h.getItemLayout(t),c.getItemLayout(t)]),null==e.stroke&&(e.stroke=h.getItemVisual(t,"style").fill),p.setItemVisual(t,{fromSymbolKeepAspect:h.getItemVisual(t,"symbolKeepAspect"),fromSymbolOffset:h.getItemVisual(t,"symbolOffset"),fromSymbolRotate:h.getItemVisual(t,"symbolRotate"),fromSymbolSize:h.getItemVisual(t,"symbolSize"),fromSymbol:h.getItemVisual(t,"symbol"),toSymbolKeepAspect:c.getItemVisual(t,"symbolKeepAspect"),toSymbolOffset:c.getItemVisual(t,"symbolOffset"),toSymbolRotate:c.getItemVisual(t,"symbolRotate"),toSymbolSize:c.getItemVisual(t,"symbolSize"),toSymbol:c.getItemVisual(t,"symbol"),style:e})})),l.updateData(p),u.line.eachItemGraphicEl((function(t,n){t.traverse((function(t){Ws(t).dataModel=e}))})),this.markKeep(l),l.group.silent=e.get("silent")||t.get("silent")},e.type="markLine",e}(UV);var nB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.createMarkerModelFromSeries=function(t,n,i){return new e(t,n,i)},e.type="markArea",e.defaultOption={z:1,tooltip:{trigger:"item"},animation:!1,label:{show:!0,position:"top"},itemStyle:{borderWidth:0},emphasis:{label:{show:!0,position:"top"}}},e}(NV),iB=So(),rB=function(t,e,n,i){var r=BV(t,i[0]),o=BV(t,i[1]),a=r.coord,s=o.coord;a[0]=it(a[0],-1/0),a[1]=it(a[1],-1/0),s[0]=it(s[0],1/0),s[1]=it(s[1],1/0);var l=D([{},r,o]);return l.coord=[r.coord,o.coord],l.x0=r.x,l.y0=r.y,l.x1=o.x,l.y1=o.y,l};function oB(t){return!isNaN(t)&&!isFinite(t)}function aB(t,e,n,i){var r=1-t;return oB(e[r])&&oB(n[r])}function sB(t,e){var n=e.coord[0],i=e.coord[1];return!!(sS(t,"cartesian2d")&&n&&i&&(aB(1,n,i)||aB(0,n,i)))||(GV(t,{coord:n,x:e.x0,y:e.y0})||GV(t,{coord:i,x:e.x1,y:e.y1}))}function lB(t,e,n,i,r){var o,a=i.coordinateSystem,s=t.getItemModel(e),l=Er(s.get(n[0]),r.getWidth()),u=Er(s.get(n[1]),r.getHeight());if(isNaN(l)||isNaN(u)){if(i.getMarkerPosition)o=i.getMarkerPosition(t.getValues(n,e));else{var h=[d=t.get(n[0],e),f=t.get(n[1],e)];a.clampData&&a.clampData(h,h),o=a.dataToPoint(h,!0)}if(sS(a,"cartesian2d")){var c=a.getAxis("x"),p=a.getAxis("y"),d=t.get(n[0],e),f=t.get(n[1],e);oB(d)?o[0]=c.toGlobalCoord(c.getExtent()["x0"===n[0]?0:1]):oB(f)&&(o[1]=p.toGlobalCoord(p.getExtent()["y0"===n[1]?0:1]))}isNaN(l)||(o[0]=l),isNaN(u)||(o[1]=u)}else o=[l,u];return o}var uB=[["x0","y0"],["x1","y0"],["x1","y1"],["x0","y1"]],hB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.updateTransform=function(t,e,n){e.eachSeries((function(t){var e=NV.getMarkerModelFromSeries(t,"markArea");if(e){var i=e.getData();i.each((function(e){var r=z(uB,(function(r){return lB(i,e,r,t,n)}));i.setItemLayout(e,r),i.getItemGraphicEl(e).setShape("points",r)}))}}),this)},e.prototype.renderSeries=function(t,e,n,i){var r=t.coordinateSystem,o=t.id,a=t.getData(),s=this.markerGroupMap,l=s.get(o)||s.set(o,{group:new Cr});this.group.add(l.group),this.markKeep(l);var u=function(t,e,n){var i,r,o=["x0","y0","x1","y1"];if(t){var a=z(t&&t.dimensions,(function(t){var n=e.getData();return A(A({},n.getDimensionInfo(n.mapDimension(t))||{}),{name:t,ordinalMeta:null})}));r=z(o,(function(t,e){return{name:t,type:a[e%2].type}})),i=new Zm(r,n)}else i=new Zm(r=[{name:"value",type:"float"}],n);var s=z(n.get("data"),H(rB,e,t,n));t&&(s=B(s,H(sB,t)));var l=t?function(t,e,n,i){return pf(t.coord[Math.floor(i/2)][i%2],r[i])}:function(t,e,n,i){return pf(t.value,r[i])};return i.initData(s,null,l),i.hasItemOption=!0,i}(r,t,e);e.setData(u),u.each((function(e){var n=z(uB,(function(n){return lB(u,e,n,t,i)})),o=r.getAxis("x").scale,s=r.getAxis("y").scale,l=o.getExtent(),h=s.getExtent(),c=[o.parse(u.get("x0",e)),o.parse(u.get("x1",e))],p=[s.parse(u.get("y0",e)),s.parse(u.get("y1",e))];Vr(c),Vr(p);var d=!!(l[0]>c[1]||l[1]<c[0]||h[0]>p[1]||h[1]<p[0]);u.setItemLayout(e,{points:n,allClipped:d});var f=u.getItemModel(e).getModel("itemStyle").getItemStyle(),g=fy(a,"color");f.fill||(f.fill=g,X(f.fill)&&(f.fill=An(f.fill,.4))),f.stroke||(f.stroke=g),u.setItemVisual(e,"style",f)})),u.diff(iB(l).data).add((function(t){var e=u.getItemLayout(t);if(!e.allClipped){var n=new Lu({shape:{points:e.points}});u.setItemGraphicEl(t,n),l.group.add(n)}})).update((function(t,n){var i=iB(l).data.getItemGraphicEl(n),r=u.getItemLayout(t);r.allClipped?i&&l.group.remove(i):(i?ih(i,{shape:{points:r.points}},e,t):i=new Lu({shape:{points:r.points}}),u.setItemGraphicEl(t,i),l.group.add(i))})).remove((function(t){var e=iB(l).data.getItemGraphicEl(t);l.group.remove(e)})).execute(),u.eachItemGraphicEl((function(t,n){var i=u.getItemModel(n),r=u.getItemVisual(n,"style");t.useStyle(u.getItemVisual(n,"style")),Wh(t,Hh(i),{labelFetcher:e,labelDataIndex:n,defaultText:u.getName(n)||"",inheritColor:X(r.fill)?An(r.fill,1):"#000"}),zl(t,i),Ol(t,null,null,i.get(["emphasis","disabled"])),Ws(t).dataModel=e})),iB(l).data=u,l.group.silent=e.get("silent")||t.get("silent")},e.type="markArea",e}(UV);var cB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.layoutMode={type:"box",ignoreSize:!0},n}return n(e,t),e.prototype.init=function(t,e,n){this.mergeDefaultAndTheme(t,n),t.selected=t.selected||{},this._updateSelector(t)},e.prototype.mergeOption=function(e,n){t.prototype.mergeOption.call(this,e,n),this._updateSelector(e)},e.prototype._updateSelector=function(t){var e=t.selector,n=this.ecModel;!0===e&&(e=t.selector=["all","inverse"]),Y(e)&&E(e,(function(t,i){X(t)&&(t={type:t}),e[i]=C(t,function(t,e){return"all"===e?{type:"all",title:t.getLocaleModel().get(["legend","selector","all"])}:"inverse"===e?{type:"inverse",title:t.getLocaleModel().get(["legend","selector","inverse"])}:void 0}(n,t.type))}))},e.prototype.optionUpdated=function(){this._updateData(this.ecModel);var t=this._data;if(t[0]&&"single"===this.get("selectedMode")){for(var e=!1,n=0;n<t.length;n++){var i=t[n].get("name");if(this.isSelected(i)){this.select(i),e=!0;break}}!e&&this.select(t[0].get("name"))}},e.prototype._updateData=function(t){var e=[],n=[];t.eachRawSeries((function(i){var r,o=i.name;if(n.push(o),i.legendVisualProvider){var a=i.legendVisualProvider.getAllNames();t.isSeriesFiltered(i)||(n=n.concat(a)),a.length?e=e.concat(a):r=!0}else r=!0;r&&_o(i)&&e.push(i.name)})),this._availableNames=n;var i=z(this.get("data")||e,(function(t){return(X(t)||j(t))&&(t={name:t}),new pc(t,this,this.ecModel)}),this);this._data=i},e.prototype.getData=function(){return this._data},e.prototype.select=function(t){var e=this.option.selected;"single"===this.get("selectedMode")&&E(this._data,(function(t){e[t.get("name")]=!1}));e[t]=!0},e.prototype.unSelect=function(t){"single"!==this.get("selectedMode")&&(this.option.selected[t]=!1)},e.prototype.toggleSelected=function(t){var e=this.option.selected;e.hasOwnProperty(t)||(e[t]=!0),this[e[t]?"unSelect":"select"](t)},e.prototype.allSelect=function(){var t=this._data,e=this.option.selected;E(t,(function(t){e[t.get("name",!0)]=!0}))},e.prototype.inverseSelect=function(){var t=this._data,e=this.option.selected;E(t,(function(t){var n=t.get("name",!0);e.hasOwnProperty(n)||(e[n]=!0),e[n]=!e[n]}))},e.prototype.isSelected=function(t){var e=this.option.selected;return!(e.hasOwnProperty(t)&&!e[t])&&P(this._availableNames,t)>=0},e.prototype.getOrient=function(){return"vertical"===this.get("orient")?{index:1,name:"vertical"}:{index:0,name:"horizontal"}},e.type="legend.plain",e.dependencies=["series"],e.defaultOption={z:4,show:!0,orient:"horizontal",left:"center",top:0,align:"auto",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderRadius:0,borderWidth:0,padding:5,itemGap:10,itemWidth:25,itemHeight:14,symbolRotate:"inherit",symbolKeepAspect:!0,inactiveColor:"#ccc",inactiveBorderColor:"#ccc",inactiveBorderWidth:"auto",itemStyle:{color:"inherit",opacity:"inherit",borderColor:"inherit",borderWidth:"auto",borderCap:"inherit",borderJoin:"inherit",borderDashOffset:"inherit",borderMiterLimit:"inherit"},lineStyle:{width:"auto",color:"inherit",inactiveColor:"#ccc",inactiveWidth:2,opacity:"inherit",type:"inherit",cap:"inherit",join:"inherit",dashOffset:"inherit",miterLimit:"inherit"},textStyle:{color:"#333"},selectedMode:!0,selector:!1,selectorLabel:{show:!0,borderRadius:10,padding:[3,5,3,5],fontSize:12,fontFamily:"sans-serif",color:"#666",borderWidth:1,borderColor:"#666"},emphasis:{selectorLabel:{show:!0,color:"#eee",backgroundColor:"#666"}},selectorPosition:"auto",selectorItemGap:7,selectorButtonGap:10,tooltip:{show:!1}},e}(Ip),pB=H,dB=E,fB=Cr,gB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.newlineDisabled=!1,n}return n(e,t),e.prototype.init=function(){this.group.add(this._contentGroup=new fB),this.group.add(this._selectorGroup=new fB),this._isFirstRender=!0},e.prototype.getContentGroup=function(){return this._contentGroup},e.prototype.getSelectorGroup=function(){return this._selectorGroup},e.prototype.render=function(t,e,n){var i=this._isFirstRender;if(this._isFirstRender=!1,this.resetInner(),t.get("show",!0)){var r=t.get("align"),o=t.get("orient");r&&"auto"!==r||(r="right"===t.get("left")&&"vertical"===o?"right":"left");var a=t.get("selector",!0),s=t.get("selectorPosition",!0);!a||s&&"auto"!==s||(s="horizontal"===o?"end":"start"),this.renderInner(r,t,e,n,a,o,s);var l=t.getBoxLayoutParams(),u={width:n.getWidth(),height:n.getHeight()},h=t.get("padding"),c=mp(l,u,h),p=this.layoutInner(t,r,c,i,a,s),d=mp(k({width:p.width,height:p.height},l),u,h);this.group.x=d.x-p.x,this.group.y=d.y-p.y,this.group.markRedraw(),this.group.add(this._backgroundEl=UE(p,t))}},e.prototype.resetInner=function(){this.getContentGroup().removeAll(),this._backgroundEl&&this.group.remove(this._backgroundEl),this.getSelectorGroup().removeAll()},e.prototype.renderInner=function(t,e,n,i,r,o,a){var s=this.getContentGroup(),l=ft(),u=e.get("selectedMode"),h=[];n.eachRawSeries((function(t){!t.get("legendHoverLink")&&h.push(t.id)})),dB(e.getData(),(function(r,o){var a=r.get("name");if(!this.newlineDisabled&&(""===a||"\n"===a)){var c=new fB;return c.newline=!0,void s.add(c)}var p=n.getSeriesByName(a)[0];if(!l.get(a)){if(p){var d=p.getData(),f=d.getVisual("legendLineStyle")||{},g=d.getVisual("legendIcon"),y=d.getVisual("style");this._createItem(p,a,o,r,e,t,f,y,g,u).on("click",pB(yB,a,null,i,h)).on("mouseover",pB(mB,p.name,null,i,h)).on("mouseout",pB(xB,p.name,null,i,h)),l.set(a,!0)}else n.eachRawSeries((function(n){if(!l.get(a)&&n.legendVisualProvider){var s=n.legendVisualProvider;if(!s.containName(a))return;var c=s.indexOfName(a),p=s.getItemVisual(c,"style"),d=s.getItemVisual(c,"legendIcon"),f=bn(p.fill);f&&0===f[3]&&(f[3]=.2,p=A(A({},p),{fill:kn(f,"rgba")})),this._createItem(n,a,o,r,e,t,{},p,d,u).on("click",pB(yB,null,a,i,h)).on("mouseover",pB(mB,null,a,i,h)).on("mouseout",pB(xB,null,a,i,h)),l.set(a,!0)}}),this);0}}),this),r&&this._createSelector(r,e,i,o,a)},e.prototype._createSelector=function(t,e,n,i,r){var o=this.getSelectorGroup();dB(t,(function(t){var i=t.type,r=new As({style:{x:0,y:0,align:"center",verticalAlign:"middle"},onclick:function(){n.dispatchAction({type:"all"===i?"legendAllSelect":"legendInverseSelect"})}});o.add(r),Wh(r,{normal:e.getModel("selectorLabel"),emphasis:e.getModel(["emphasis","selectorLabel"])},{defaultText:t.title}),Pl(r)}))},e.prototype._createItem=function(t,e,n,i,r,o,a,s,l,u){var h=t.visualDrawType,c=r.get("itemWidth"),p=r.get("itemHeight"),d=r.isSelected(e),f=i.get("symbolRotate"),g=i.get("symbolKeepAspect"),y=i.get("icon"),v=function(t,e,n,i,r,o){function a(t,e){"auto"===t.lineWidth&&(t.lineWidth=e.lineWidth>0?2:0),dB(t,(function(n,i){"inherit"===t[i]&&(t[i]=e[i])}))}var s=e.getModel("itemStyle").getItemStyle(),l=0===t.lastIndexOf("empty",0)?"fill":"stroke";s.decal=i.decal,"inherit"===s.fill&&(s.fill=i[r]);"inherit"===s.stroke&&(s.stroke=i[l]);"inherit"===s.opacity&&(s.opacity=("fill"===r?i:n).opacity);a(s,i);var u=e.getModel("lineStyle"),h=u.getLineStyle();if(a(h,n),"auto"===s.fill&&(s.fill=i.fill),"auto"===s.stroke&&(s.stroke=i.fill),"auto"===h.stroke&&(h.stroke=i.fill),!o){var c=e.get("inactiveBorderWidth"),p=s[l];s.lineWidth="auto"===c?i.lineWidth>0&&p?2:0:s.lineWidth,s.fill=e.get("inactiveColor"),s.stroke=e.get("inactiveBorderColor"),h.stroke=u.get("inactiveColor"),h.lineWidth=u.get("inactiveWidth")}return{itemStyle:s,lineStyle:h}}(l=y||l||"roundRect",i,a,s,h,d),m=new fB,x=i.getModel("textStyle");if(!U(t.getLegendIcon)||y&&"inherit"!==y){var _="inherit"===y&&t.getData().getVisual("symbol")?"inherit"===f?t.getData().getVisual("symbolRotate"):f:0;m.add(function(t){var e=t.icon||"roundRect",n=ky(e,0,0,t.itemWidth,t.itemHeight,t.itemStyle.fill,t.symbolKeepAspect);n.setStyle(t.itemStyle),n.rotation=(t.iconRotate||0)*Math.PI/180,n.setOrigin([t.itemWidth/2,t.itemHeight/2]),e.indexOf("empty")>-1&&(n.style.stroke=n.style.fill,n.style.fill="#fff",n.style.lineWidth=2);return n}({itemWidth:c,itemHeight:p,icon:l,iconRotate:_,itemStyle:v.itemStyle,lineStyle:v.lineStyle,symbolKeepAspect:g}))}else m.add(t.getLegendIcon({itemWidth:c,itemHeight:p,icon:l,iconRotate:f,itemStyle:v.itemStyle,lineStyle:v.lineStyle,symbolKeepAspect:g}));var b="left"===o?c+5:-5,w=o,S=r.get("formatter"),M=e;X(S)&&S?M=S.replace("{name}",null!=e?e:""):U(S)&&(M=S(e));var I=i.get("inactiveColor");m.add(new As({style:Yh(x,{text:M,x:b,y:p/2,fill:d?x.getTextColor():I,align:w,verticalAlign:"middle"})}));var T=new Ts({shape:m.getBoundingRect(),invisible:!0}),C=i.getModel("tooltip");return C.get("show")&&Nh({el:T,componentModel:r,itemName:e,itemTooltipOption:C.option}),m.add(T),m.eachChild((function(t){t.silent=!0})),T.silent=!u,this.getContentGroup().add(m),Pl(m),m.__legendDataIndex=n,m},e.prototype.layoutInner=function(t,e,n,i,r,o){var a=this.getContentGroup(),s=this.getSelectorGroup();vp(t.get("orient"),a,t.get("itemGap"),n.width,n.height);var l=a.getBoundingRect(),u=[-l.x,-l.y];if(s.markRedraw(),a.markRedraw(),r){vp("horizontal",s,t.get("selectorItemGap",!0));var h=s.getBoundingRect(),c=[-h.x,-h.y],p=t.get("selectorButtonGap",!0),d=t.getOrient().index,f=0===d?"width":"height",g=0===d?"height":"width",y=0===d?"y":"x";"end"===o?c[d]+=l[f]+p:u[d]+=h[f]+p,c[1-d]+=l[g]/2-h[g]/2,s.x=c[0],s.y=c[1],a.x=u[0],a.y=u[1];var v={x:0,y:0};return v[f]=l[f]+p+h[f],v[g]=Math.max(l[g],h[g]),v[y]=Math.min(0,h[y]+c[1-d]),v}return a.x=u[0],a.y=u[1],this.group.getBoundingRect()},e.prototype.remove=function(){this.getContentGroup().removeAll(),this._isFirstRender=!0},e.type="legend.plain",e}(fg);function yB(t,e,n,i){xB(t,e,n,i),n.dispatchAction({type:"legendToggleSelect",name:null!=t?t:e}),mB(t,e,n,i)}function vB(t){for(var e,n=t.getZr().storage.getDisplayList(),i=0,r=n.length;i<r&&!(e=n[i].states.emphasis);)i++;return e&&e.hoverLayer}function mB(t,e,n,i){vB(n)||n.dispatchAction({type:"highlight",seriesName:t,name:e,excludeSeriesId:i})}function xB(t,e,n,i){vB(n)||n.dispatchAction({type:"downplay",seriesName:t,name:e,excludeSeriesId:i})}function _B(t){var e=t.findComponents({mainType:"legend"});e&&e.length&&t.filterSeries((function(t){for(var n=0;n<e.length;n++)if(!e[n].isSelected(t.name))return!1;return!0}))}function bB(t,e,n){var i,r={},o="toggleSelected"===t;return n.eachComponent("legend",(function(n){o&&null!=i?n[i?"select":"unSelect"](e.name):"allSelect"===t||"inverseSelect"===t?n[t]():(n[t](e.name),i=n.isSelected(e.name)),E(n.getData(),(function(t){var e=t.get("name");if("\n"!==e&&""!==e){var i=n.isSelected(e);r.hasOwnProperty(e)?r[e]=r[e]&&i:r[e]=i}}))})),"allSelect"===t||"inverseSelect"===t?{selected:r}:{name:e.name,selected:r}}function wB(t){t.registerComponentModel(cB),t.registerComponentView(gB),t.registerProcessor(t.PRIORITY.PROCESSOR.SERIES_FILTER,_B),t.registerSubTypeDefaulter("legend",(function(){return"plain"})),function(t){t.registerAction("legendToggleSelect","legendselectchanged",H(bB,"toggleSelected")),t.registerAction("legendAllSelect","legendselectall",H(bB,"allSelect")),t.registerAction("legendInverseSelect","legendinverseselect",H(bB,"inverseSelect")),t.registerAction("legendSelect","legendselected",H(bB,"select")),t.registerAction("legendUnSelect","legendunselected",H(bB,"unSelect"))}(t)}var SB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.setScrollDataIndex=function(t){this.option.scrollDataIndex=t},e.prototype.init=function(e,n,i){var r=wp(e);t.prototype.init.call(this,e,n,i),MB(this,e,r)},e.prototype.mergeOption=function(e,n){t.prototype.mergeOption.call(this,e,n),MB(this,this.option,e)},e.type="legend.scroll",e.defaultOption=gc(cB.defaultOption,{scrollDataIndex:0,pageButtonItemGap:5,pageButtonGap:null,pageButtonPosition:"end",pageFormatter:"{current}/{total}",pageIcons:{horizontal:["M0,0L12,-10L12,10z","M0,0L-12,-10L-12,10z"],vertical:["M0,0L20,0L10,-20z","M0,0L20,0L10,20z"]},pageIconColor:"#2f4554",pageIconInactiveColor:"#aaa",pageIconSize:15,pageTextStyle:{color:"#333"},animationDurationUpdate:800}),e}(cB);function MB(t,e,n){var i=[1,1];i[t.getOrient().index]=0,bp(e,n,{type:"box",ignoreSize:!!i})}var IB=Cr,TB=["width","height"],CB=["x","y"],DB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.newlineDisabled=!0,n._currentIndex=0,n}return n(e,t),e.prototype.init=function(){t.prototype.init.call(this),this.group.add(this._containerGroup=new IB),this._containerGroup.add(this.getContentGroup()),this.group.add(this._controllerGroup=new IB)},e.prototype.resetInner=function(){t.prototype.resetInner.call(this),this._controllerGroup.removeAll(),this._containerGroup.removeClipPath(),this._containerGroup.__rectSize=null},e.prototype.renderInner=function(e,n,i,r,o,a,s){var l=this;t.prototype.renderInner.call(this,e,n,i,r,o,a,s);var u=this._controllerGroup,h=n.get("pageIconSize",!0),c=Y(h)?h:[h,h];d("pagePrev",0);var p=n.getModel("pageTextStyle");function d(t,e){var i=t+"DataIndex",o=Lh(n.get("pageIcons",!0)[n.getOrient().name][e],{onclick:W(l._pageGo,l,i,n,r)},{x:-c[0]/2,y:-c[1]/2,width:c[0],height:c[1]});o.name=t,u.add(o)}u.add(new As({name:"pageText",style:{text:"xx/xx",fill:p.getTextColor(),font:p.getFont(),verticalAlign:"middle",align:"center"},silent:!0})),d("pageNext",1)},e.prototype.layoutInner=function(t,e,n,i,r,o){var a=this.getSelectorGroup(),s=t.getOrient().index,l=TB[s],u=CB[s],h=TB[1-s],c=CB[1-s];r&&vp("horizontal",a,t.get("selectorItemGap",!0));var p=t.get("selectorButtonGap",!0),d=a.getBoundingRect(),f=[-d.x,-d.y],g=T(n);r&&(g[l]=n[l]-d[l]-p);var y=this._layoutContentAndController(t,i,g,s,l,h,c,u);if(r){if("end"===o)f[s]+=y[l]+p;else{var v=d[l]+p;f[s]-=v,y[u]-=v}y[l]+=d[l]+p,f[1-s]+=y[c]+y[h]/2-d[h]/2,y[h]=Math.max(y[h],d[h]),y[c]=Math.min(y[c],d[c]+f[1-s]),a.x=f[0],a.y=f[1],a.markRedraw()}return y},e.prototype._layoutContentAndController=function(t,e,n,i,r,o,a,s){var l=this.getContentGroup(),u=this._containerGroup,h=this._controllerGroup;vp(t.get("orient"),l,t.get("itemGap"),i?n.width:null,i?null:n.height),vp("horizontal",h,t.get("pageButtonItemGap",!0));var c=l.getBoundingRect(),p=h.getBoundingRect(),d=this._showController=c[r]>n[r],f=[-c.x,-c.y];e||(f[i]=l[s]);var g=[0,0],y=[-p.x,-p.y],v=rt(t.get("pageButtonGap",!0),t.get("itemGap",!0));d&&("end"===t.get("pageButtonPosition",!0)?y[i]+=n[r]-p[r]:g[i]+=p[r]+v);y[1-i]+=c[o]/2-p[o]/2,l.setPosition(f),u.setPosition(g),h.setPosition(y);var m={x:0,y:0};if(m[r]=d?n[r]:c[r],m[o]=Math.max(c[o],p[o]),m[a]=Math.min(0,p[a]+y[1-i]),u.__rectSize=n[r],d){var x={x:0,y:0};x[r]=Math.max(n[r]-p[r]-v,0),x[o]=m[o],u.setClipPath(new Ts({shape:x})),u.__rectSize=x[r]}else h.eachChild((function(t){t.attr({invisible:!0,silent:!0})}));var _=this._getPageInfo(t);return null!=_.pageIndex&&ih(l,{x:_.contentPosition[0],y:_.contentPosition[1]},d?t:null),this._updatePageInfoView(t,_),m},e.prototype._pageGo=function(t,e,n){var i=this._getPageInfo(e)[t];null!=i&&n.dispatchAction({type:"legendScroll",scrollDataIndex:i,legendId:e.id})},e.prototype._updatePageInfoView=function(t,e){var n=this._controllerGroup;E(["pagePrev","pageNext"],(function(i){var r=null!=e[i+"DataIndex"],o=n.childOfName(i);o&&(o.setStyle("fill",r?t.get("pageIconColor",!0):t.get("pageIconInactiveColor",!0)),o.cursor=r?"pointer":"default")}));var i=n.childOfName("pageText"),r=t.get("pageFormatter"),o=e.pageIndex,a=null!=o?o+1:0,s=e.pageCount;i&&r&&i.setStyle("text",X(r)?r.replace("{current}",null==a?"":a+"").replace("{total}",null==s?"":s+""):r({current:a,total:s}))},e.prototype._getPageInfo=function(t){var e=t.get("scrollDataIndex",!0),n=this.getContentGroup(),i=this._containerGroup.__rectSize,r=t.getOrient().index,o=TB[r],a=CB[r],s=this._findTargetItemIndex(e),l=n.children(),u=l[s],h=l.length,c=h?1:0,p={contentPosition:[n.x,n.y],pageCount:c,pageIndex:c-1,pagePrevDataIndex:null,pageNextDataIndex:null};if(!u)return p;var d=m(u);p.contentPosition[r]=-d.s;for(var f=s+1,g=d,y=d,v=null;f<=h;++f)(!(v=m(l[f]))&&y.e>g.s+i||v&&!x(v,g.s))&&(g=y.i>g.i?y:v)&&(null==p.pageNextDataIndex&&(p.pageNextDataIndex=g.i),++p.pageCount),y=v;for(f=s-1,g=d,y=d,v=null;f>=-1;--f)(v=m(l[f]))&&x(y,v.s)||!(g.i<y.i)||(y=g,null==p.pagePrevDataIndex&&(p.pagePrevDataIndex=g.i),++p.pageCount,++p.pageIndex),g=v;return p;function m(t){if(t){var e=t.getBoundingRect(),n=e[a]+t[a];return{s:n,e:n+e[o],i:t.__legendDataIndex}}}function x(t,e){return t.e>=e&&t.s<=e+i}},e.prototype._findTargetItemIndex=function(t){return this._showController?(this.getContentGroup().eachChild((function(i,r){var o=i.__legendDataIndex;null==n&&null!=o&&(n=r),o===t&&(e=r)})),null!=e?e:n):0;var e,n},e.type="legend.scroll",e}(gB);function AB(t){_m(wB),t.registerComponentModel(SB),t.registerComponentView(DB),function(t){t.registerAction("legendScroll","legendscroll",(function(t,e){var n=t.scrollDataIndex;null!=n&&e.eachComponent({mainType:"legend",subType:"scroll",query:t},(function(t){t.setScrollDataIndex(n)}))}))}(t)}var kB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="dataZoom.inside",e.defaultOption=gc(DE.defaultOption,{disabled:!1,zoomLock:!1,zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!1,preventDefaultMouseMove:!0}),e}(DE),LB=So();function PB(t,e,n){LB(t).coordSysRecordMap.each((function(t){var i=t.dataZoomInfoMap.get(e.uid);i&&(i.getRange=n)}))}function OB(t,e){if(e){t.removeKey(e.model.uid);var n=e.controller;n&&n.dispose()}}function RB(t,e){t.isDisposed()||t.dispatchAction({type:"dataZoom",animation:{easing:"cubicOut",duration:100},batch:e})}function NB(t,e,n,i){return t.coordinateSystem.containPoint([n,i])}function EB(t){t.registerProcessor(t.PRIORITY.PROCESSOR.FILTER,(function(t,e){var n=LB(e),i=n.coordSysRecordMap||(n.coordSysRecordMap=ft());i.each((function(t){t.dataZoomInfoMap=null})),t.eachComponent({mainType:"dataZoom",subType:"inside"},(function(t){E(TE(t).infoList,(function(n){var r=n.model.uid,o=i.get(r)||i.set(r,function(t,e){var n={model:e,containsPoint:H(NB,e),dispatchAction:H(RB,t),dataZoomInfoMap:null,controller:null},i=n.controller=new DI(t.getZr());return E(["pan","zoom","scrollMove"],(function(t){i.on(t,(function(e){var i=[];n.dataZoomInfoMap.each((function(r){if(e.isAvailableBehavior(r.model.option)){var o=(r.getRange||{})[t],a=o&&o(r.dzReferCoordSysInfo,n.model.mainType,n.controller,e);!r.model.get("disabled",!0)&&a&&i.push({dataZoomId:r.model.id,start:a[0],end:a[1]})}})),i.length&&n.dispatchAction(i)}))})),n}(e,n.model));(o.dataZoomInfoMap||(o.dataZoomInfoMap=ft())).set(t.uid,{dzReferCoordSysInfo:n,model:t,getRange:null})}))})),i.each((function(t){var e,n=t.controller,r=t.dataZoomInfoMap;if(r){var o=r.keys()[0];null!=o&&(e=r.get(o))}if(e){var a=function(t){var e,n="type_",i={type_true:2,type_move:1,type_false:0,type_undefined:-1},r=!0;return t.each((function(t){var o=t.model,a=!o.get("disabled",!0)&&(!o.get("zoomLock",!0)||"move");i[n+a]>i[n+e]&&(e=a),r=r&&o.get("preventDefaultMouseMove",!0)})),{controlType:e,opt:{zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!0,preventDefaultMouseMove:!!r}}}(r);n.enable(a.controlType,a.opt),n.setPointerChecker(t.containsPoint),Dg(t,"dispatchAction",e.model.get("throttle",!0),"fixRate")}else OB(i,t)}))}))}var zB=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="dataZoom.inside",e}return n(e,t),e.prototype.render=function(e,n,i){t.prototype.render.apply(this,arguments),e.noTarget()?this._clear():(this.range=e.getPercentRange(),PB(i,e,{pan:W(VB.pan,this),zoom:W(VB.zoom,this),scrollMove:W(VB.scrollMove,this)}))},e.prototype.dispose=function(){this._clear(),t.prototype.dispose.apply(this,arguments)},e.prototype._clear=function(){!function(t,e){for(var n=LB(t).coordSysRecordMap,i=n.keys(),r=0;r<i.length;r++){var o=i[r],a=n.get(o),s=a.dataZoomInfoMap;if(s){var l=e.uid;s.get(l)&&(s.removeKey(l),s.keys().length||OB(n,a))}}}(this.api,this.dataZoomModel),this.range=null},e.type="dataZoom.inside",e}(LE),VB={zoom:function(t,e,n,i){var r=this.range,o=r.slice(),a=t.axisModels[0];if(a){var s=FB[e](null,[i.originX,i.originY],a,n,t),l=(s.signal>0?s.pixelStart+s.pixelLength-s.pixel:s.pixel-s.pixelStart)/s.pixelLength*(o[1]-o[0])+o[0],u=Math.max(1/i.scale,0);o[0]=(o[0]-l)*u+l,o[1]=(o[1]-l)*u+l;var h=this.dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan();return sk(0,o,[0,100],0,h.minSpan,h.maxSpan),this.range=o,r[0]!==o[0]||r[1]!==o[1]?o:void 0}},pan:BB((function(t,e,n,i,r,o){var a=FB[i]([o.oldX,o.oldY],[o.newX,o.newY],e,r,n);return a.signal*(t[1]-t[0])*a.pixel/a.pixelLength})),scrollMove:BB((function(t,e,n,i,r,o){return FB[i]([0,0],[o.scrollDelta,o.scrollDelta],e,r,n).signal*(t[1]-t[0])*o.scrollDelta}))};function BB(t){return function(e,n,i,r){var o=this.range,a=o.slice(),s=e.axisModels[0];if(s)return sk(t(a,s,e,n,i,r),a,[0,100],"all"),this.range=a,o[0]!==a[0]||o[1]!==a[1]?a:void 0}}var FB={grid:function(t,e,n,i,r){var o=n.axis,a={},s=r.model.coordinateSystem.getRect();return t=t||[0,0],"x"===o.dim?(a.pixel=e[0]-t[0],a.pixelLength=s.width,a.pixelStart=s.x,a.signal=o.inverse?1:-1):(a.pixel=e[1]-t[1],a.pixelLength=s.height,a.pixelStart=s.y,a.signal=o.inverse?-1:1),a},polar:function(t,e,n,i,r){var o=n.axis,a={},s=r.model.coordinateSystem,l=s.getRadiusAxis().getExtent(),u=s.getAngleAxis().getExtent();return t=t?s.pointToCoord(t):[0,0],e=s.pointToCoord(e),"radiusAxis"===n.mainType?(a.pixel=e[0]-t[0],a.pixelLength=l[1]-l[0],a.pixelStart=l[0],a.signal=o.inverse?1:-1):(a.pixel=e[1]-t[1],a.pixelLength=u[1]-u[0],a.pixelStart=u[0],a.signal=o.inverse?-1:1),a},singleAxis:function(t,e,n,i,r){var o=n.axis,a=r.model.coordinateSystem.getRect(),s={};return t=t||[0,0],"horizontal"===o.orient?(s.pixel=e[0]-t[0],s.pixelLength=a.width,s.pixelStart=a.x,s.signal=o.inverse?1:-1):(s.pixel=e[1]-t[1],s.pixelLength=a.height,s.pixelStart=a.y,s.signal=o.inverse?-1:1),s}};function GB(t){VE(t),t.registerComponentModel(kB),t.registerComponentView(zB),EB(t)}var WB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="dataZoom.slider",e.layoutMode="box",e.defaultOption=gc(DE.defaultOption,{show:!0,right:"ph",top:"ph",width:"ph",height:"ph",left:null,bottom:null,borderColor:"#d2dbee",borderRadius:3,backgroundColor:"rgba(47,69,84,0)",dataBackground:{lineStyle:{color:"#d2dbee",width:.5},areaStyle:{color:"#d2dbee",opacity:.2}},selectedDataBackground:{lineStyle:{color:"#8fb0f7",width:.5},areaStyle:{color:"#8fb0f7",opacity:.2}},fillerColor:"rgba(135,175,274,0.2)",handleIcon:"path://M-9.35,34.56V42m0-40V9.5m-2,0h4a2,2,0,0,1,2,2v21a2,2,0,0,1-2,2h-4a2,2,0,0,1-2-2v-21A2,2,0,0,1-11.35,9.5Z",handleSize:"100%",handleStyle:{color:"#fff",borderColor:"#ACB8D1"},moveHandleSize:7,moveHandleIcon:"path://M-320.9-50L-320.9-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-348-41-339-50-320.9-50z M-212.3-50L-212.3-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-239.4-41-230.4-50-212.3-50z M-103.7-50L-103.7-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-130.9-41-121.8-50-103.7-50z",moveHandleStyle:{color:"#D2DBEE",opacity:.7},showDetail:!0,showDataShadow:"auto",realtime:!0,zoomLock:!1,textStyle:{color:"#6E7079"},brushSelect:!0,brushStyle:{color:"rgba(135,175,274,0.15)"},emphasis:{handleStyle:{borderColor:"#8FB0F7"},moveHandleStyle:{color:"#8FB0F7"}}}),e}(DE),HB=Ts,YB="horizontal",UB="vertical",XB=["line","bar","candlestick","scatter"],ZB={easing:"cubicOut",duration:100,delay:0},jB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._displayables={},n}return n(e,t),e.prototype.init=function(t,e){this.api=e,this._onBrush=W(this._onBrush,this),this._onBrushEnd=W(this._onBrushEnd,this)},e.prototype.render=function(e,n,i,r){if(t.prototype.render.apply(this,arguments),Dg(this,"_dispatchZoomAction",e.get("throttle"),"fixRate"),this._orient=e.getOrient(),!1!==e.get("show")){if(e.noTarget())return this._clear(),void this.group.removeAll();r&&"dataZoom"===r.type&&r.from===this.uid||this._buildView(),this._updateView()}else this.group.removeAll()},e.prototype.dispose=function(){this._clear(),t.prototype.dispose.apply(this,arguments)},e.prototype._clear=function(){Ag(this,"_dispatchZoomAction");var t=this.api.getZr();t.off("mousemove",this._onBrush),t.off("mouseup",this._onBrushEnd)},e.prototype._buildView=function(){var t=this.group;t.removeAll(),this._brushing=!1,this._displayables.brushRect=null,this._resetLocation(),this._resetInterval();var e=this._displayables.sliderGroup=new Cr;this._renderBackground(),this._renderHandle(),this._renderDataShadow(),t.add(e),this._positionGroup()},e.prototype._resetLocation=function(){var t=this.dataZoomModel,e=this.api,n=t.get("brushSelect")?7:0,i=this._findCoordRect(),r={width:e.getWidth(),height:e.getHeight()},o=this._orient===YB?{right:r.width-i.x-i.width,top:r.height-30-7-n,width:i.width,height:30}:{right:7,top:i.y,width:30,height:i.height},a=wp(t.option);E(["right","top","width","height"],(function(t){"ph"===a[t]&&(a[t]=o[t])}));var s=mp(a,r);this._location={x:s.x,y:s.y},this._size=[s.width,s.height],this._orient===UB&&this._size.reverse()},e.prototype._positionGroup=function(){var t=this.group,e=this._location,n=this._orient,i=this.dataZoomModel.getFirstTargetAxisModel(),r=i&&i.get("inverse"),o=this._displayables.sliderGroup,a=(this._dataShadowInfo||{}).otherAxisInverse;o.attr(n!==YB||r?n===YB&&r?{scaleY:a?1:-1,scaleX:-1}:n!==UB||r?{scaleY:a?-1:1,scaleX:-1,rotation:Math.PI/2}:{scaleY:a?-1:1,scaleX:1,rotation:Math.PI/2}:{scaleY:a?1:-1,scaleX:1});var s=t.getBoundingRect([o]);t.x=e.x-s.x,t.y=e.y-s.y,t.markRedraw()},e.prototype._getViewExtent=function(){return[0,this._size[0]]},e.prototype._renderBackground=function(){var t=this.dataZoomModel,e=this._size,n=this._displayables.sliderGroup,i=t.get("brushSelect");n.add(new HB({silent:!0,shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:t.get("backgroundColor")},z2:-40}));var r=new HB({shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:"transparent"},z2:0,onclick:W(this._onClickPanel,this)}),o=this.api.getZr();i?(r.on("mousedown",this._onBrushStart,this),r.cursor="crosshair",o.on("mousemove",this._onBrush),o.on("mouseup",this._onBrushEnd)):(o.off("mousemove",this._onBrush),o.off("mouseup",this._onBrushEnd)),n.add(r)},e.prototype._renderDataShadow=function(){var t=this._dataShadowInfo=this._prepareDataShadowInfo();if(this._displayables.dataShadowSegs=[],t){var e=this._size,n=this._shadowSize||[],i=t.series,r=i.getRawData(),o=i.getShadowDim?i.getShadowDim():t.otherDim;if(null!=o){var a=this._shadowPolygonPts,s=this._shadowPolylinePts;if(r!==this._shadowData||o!==this._shadowDim||e[0]!==n[0]||e[1]!==n[1]){var l=r.getDataExtent(o),u=.3*(l[1]-l[0]);l=[l[0]-u,l[1]+u];var h,c=[0,e[1]],p=[0,e[0]],d=[[e[0],0],[0,0]],f=[],g=p[1]/(r.count()-1),y=0,v=Math.round(r.count()/e[0]);r.each([o],(function(t,e){if(v>0&&e%v)y+=g;else{var n=null==t||isNaN(t)||""===t,i=n?0:Nr(t,l,c,!0);n&&!h&&e?(d.push([d[d.length-1][0],0]),f.push([f[f.length-1][0],0])):!n&&h&&(d.push([y,0]),f.push([y,0])),d.push([y,i]),f.push([y,i]),y+=g,h=n}})),a=this._shadowPolygonPts=d,s=this._shadowPolylinePts=f}this._shadowData=r,this._shadowDim=o,this._shadowSize=[e[0],e[1]];for(var m=this.dataZoomModel,x=0;x<3;x++){var _=b(1===x);this._displayables.sliderGroup.add(_),this._displayables.dataShadowSegs.push(_)}}}function b(t){var e=m.getModel(t?"selectedDataBackground":"dataBackground"),n=new Cr,i=new Lu({shape:{points:a},segmentIgnoreThreshold:1,style:e.getModel("areaStyle").getAreaStyle(),silent:!0,z2:-20}),r=new Ou({shape:{points:s},segmentIgnoreThreshold:1,style:e.getModel("lineStyle").getLineStyle(),silent:!0,z2:-19});return n.add(i),n.add(r),n}},e.prototype._prepareDataShadowInfo=function(){var t=this.dataZoomModel,e=t.get("showDataShadow");if(!1!==e){var n,i=this.ecModel;return t.eachTargetAxis((function(r,o){E(t.getAxisProxy(r,o).getTargetSeriesModels(),(function(t){if(!(n||!0!==e&&P(XB,t.get("type"))<0)){var a,s=i.getComponent(ME(r),o).axis,l={x:"y",y:"x",radius:"angle",angle:"radius"}[r],u=t.coordinateSystem;null!=l&&u.getOtherAxis&&(a=u.getOtherAxis(s).inverse),l=t.getData().mapDimension(l),n={thisAxis:s,series:t,thisDim:r,otherDim:l,otherAxisInverse:a}}}),this)}),this),n}},e.prototype._renderHandle=function(){var t=this.group,e=this._displayables,n=e.handles=[null,null],i=e.handleLabels=[null,null],r=this._displayables.sliderGroup,o=this._size,a=this.dataZoomModel,s=this.api,l=a.get("borderRadius")||0,u=a.get("brushSelect"),h=e.filler=new HB({silent:u,style:{fill:a.get("fillerColor")},textConfig:{position:"inside"}});r.add(h),r.add(new HB({silent:!0,subPixelOptimize:!0,shape:{x:0,y:0,width:o[0],height:o[1],r:l},style:{stroke:a.get("dataBackgroundColor")||a.get("borderColor"),lineWidth:1,fill:"rgba(0,0,0,0)"}})),E([0,1],(function(e){var o=a.get("handleIcon");!Cy[o]&&o.indexOf("path://")<0&&o.indexOf("image://")<0&&(o="path://"+o);var s=ky(o,-1,0,2,2,null,!0);s.attr({cursor:qB(this._orient),draggable:!0,drift:W(this._onDragMove,this,e),ondragend:W(this._onDragEnd,this),onmouseover:W(this._showDataInfo,this,!0),onmouseout:W(this._showDataInfo,this,!1),z2:5});var l=s.getBoundingRect(),u=a.get("handleSize");this._handleHeight=Er(u,this._size[1]),this._handleWidth=l.width/l.height*this._handleHeight,s.setStyle(a.getModel("handleStyle").getItemStyle()),s.style.strokeNoScale=!0,s.rectHover=!0,s.ensureState("emphasis").style=a.getModel(["emphasis","handleStyle"]).getItemStyle(),Pl(s);var h=a.get("handleColor");null!=h&&(s.style.fill=h),r.add(n[e]=s);var c=a.getModel("textStyle");t.add(i[e]=new As({silent:!0,invisible:!0,style:Yh(c,{x:0,y:0,text:"",verticalAlign:"middle",align:"center",fill:c.getTextColor(),font:c.getFont()}),z2:10}))}),this);var c=h;if(u){var p=Er(a.get("moveHandleSize"),o[1]),d=e.moveHandle=new Ts({style:a.getModel("moveHandleStyle").getItemStyle(),silent:!0,shape:{r:[0,0,2,2],y:o[1]-.5,height:p}}),f=.8*p,g=e.moveHandleIcon=ky(a.get("moveHandleIcon"),-f/2,-f/2,f,f,"#fff",!0);g.silent=!0,g.y=o[1]+p/2-.5,d.ensureState("emphasis").style=a.getModel(["emphasis","moveHandleStyle"]).getItemStyle();var y=Math.min(o[1]/2,Math.max(p,10));(c=e.moveZone=new Ts({invisible:!0,shape:{y:o[1]-y,height:p+y}})).on("mouseover",(function(){s.enterEmphasis(d)})).on("mouseout",(function(){s.leaveEmphasis(d)})),r.add(d),r.add(g),r.add(c)}c.attr({draggable:!0,cursor:qB(this._orient),drift:W(this._onDragMove,this,"all"),ondragstart:W(this._showDataInfo,this,!0),ondragend:W(this._onDragEnd,this),onmouseover:W(this._showDataInfo,this,!0),onmouseout:W(this._showDataInfo,this,!1)})},e.prototype._resetInterval=function(){var t=this._range=this.dataZoomModel.getPercentRange(),e=this._getViewExtent();this._handleEnds=[Nr(t[0],[0,100],e,!0),Nr(t[1],[0,100],e,!0)]},e.prototype._updateInterval=function(t,e){var n=this.dataZoomModel,i=this._handleEnds,r=this._getViewExtent(),o=n.findRepresentativeAxisProxy().getMinMaxSpan(),a=[0,100];sk(e,i,r,n.get("zoomLock")?"all":t,null!=o.minSpan?Nr(o.minSpan,a,r,!0):null,null!=o.maxSpan?Nr(o.maxSpan,a,r,!0):null);var s=this._range,l=this._range=Vr([Nr(i[0],r,a,!0),Nr(i[1],r,a,!0)]);return!s||s[0]!==l[0]||s[1]!==l[1]},e.prototype._updateView=function(t){var e=this._displayables,n=this._handleEnds,i=Vr(n.slice()),r=this._size;E([0,1],(function(t){var i=e.handles[t],o=this._handleHeight;i.attr({scaleX:o/2,scaleY:o/2,x:n[t]+(t?-1:1),y:r[1]/2-o/2})}),this),e.filler.setShape({x:i[0],y:0,width:i[1]-i[0],height:r[1]});var o={x:i[0],width:i[1]-i[0]};e.moveHandle&&(e.moveHandle.setShape(o),e.moveZone.setShape(o),e.moveZone.getBoundingRect(),e.moveHandleIcon&&e.moveHandleIcon.attr("x",o.x+o.width/2));for(var a=e.dataShadowSegs,s=[0,i[0],i[1],r[0]],l=0;l<a.length;l++){var u=a[l],h=u.getClipPath();h||(h=new Ts,u.setClipPath(h)),h.setShape({x:s[l],y:0,width:s[l+1]-s[l],height:r[1]})}this._updateDataInfo(t)},e.prototype._updateDataInfo=function(t){var e=this.dataZoomModel,n=this._displayables,i=n.handleLabels,r=this._orient,o=["",""];if(e.get("showDetail")){var a=e.findRepresentativeAxisProxy();if(a){var s=a.getAxisModel().axis,l=this._range,u=t?a.calculateDataWindow({start:l[0],end:l[1]}).valueWindow:a.getDataValueWindow();o=[this._formatLabel(u[0],s),this._formatLabel(u[1],s)]}}var h=Vr(this._handleEnds.slice());function c(t){var e=Mh(n.handles[t].parent,this.group),a=Th(0===t?"right":"left",e),s=this._handleWidth/2+5,l=Ih([h[t]+(0===t?-s:s),this._size[1]/2],e);i[t].setStyle({x:l[0],y:l[1],verticalAlign:r===YB?"middle":a,align:r===YB?a:"center",text:o[t]})}c.call(this,0),c.call(this,1)},e.prototype._formatLabel=function(t,e){var n=this.dataZoomModel,i=n.get("labelFormatter"),r=n.get("labelPrecision");null!=r&&"auto"!==r||(r=e.getPixelPrecision());var o=null==t||isNaN(t)?"":"category"===e.type||"time"===e.type?e.scale.getLabel({value:Math.round(t)}):t.toFixed(Math.min(r,20));return U(i)?i(t,o):X(i)?i.replace("{value}",o):o},e.prototype._showDataInfo=function(t){t=this._dragging||t;var e=this._displayables,n=e.handleLabels;n[0].attr("invisible",!t),n[1].attr("invisible",!t),e.moveHandle&&this.api[t?"enterEmphasis":"leaveEmphasis"](e.moveHandle,1)},e.prototype._onDragMove=function(t,e,n,i){this._dragging=!0,se(i.event);var r=Ih([e,n],this._displayables.sliderGroup.getLocalTransform(),!0),o=this._updateInterval(t,r[0]),a=this.dataZoomModel.get("realtime");this._updateView(!a),o&&a&&this._dispatchZoomAction(!0)},e.prototype._onDragEnd=function(){this._dragging=!1,this._showDataInfo(!1),!this.dataZoomModel.get("realtime")&&this._dispatchZoomAction(!1)},e.prototype._onClickPanel=function(t){var e=this._size,n=this._displayables.sliderGroup.transformCoordToLocal(t.offsetX,t.offsetY);if(!(n[0]<0||n[0]>e[0]||n[1]<0||n[1]>e[1])){var i=this._handleEnds,r=(i[0]+i[1])/2,o=this._updateInterval("all",n[0]-r);this._updateView(),o&&this._dispatchZoomAction(!1)}},e.prototype._onBrushStart=function(t){var e=t.offsetX,n=t.offsetY;this._brushStart=new Ji(e,n),this._brushing=!0,this._brushStartTime=+new Date},e.prototype._onBrushEnd=function(t){if(this._brushing){var e=this._displayables.brushRect;if(this._brushing=!1,e){e.attr("ignore",!0);var n=e.shape;if(!(+new Date-this._brushStartTime<200&&Math.abs(n.width)<5)){var i=this._getViewExtent(),r=[0,100];this._range=Vr([Nr(n.x,i,r,!0),Nr(n.x+n.width,i,r,!0)]),this._handleEnds=[n.x,n.x+n.width],this._updateView(),this._dispatchZoomAction(!1)}}}},e.prototype._onBrush=function(t){this._brushing&&(se(t.event),this._updateBrushRect(t.offsetX,t.offsetY))},e.prototype._updateBrushRect=function(t,e){var n=this._displayables,i=this.dataZoomModel,r=n.brushRect;r||(r=n.brushRect=new HB({silent:!0,style:i.getModel("brushStyle").getItemStyle()}),n.sliderGroup.add(r)),r.attr("ignore",!1);var o=this._brushStart,a=this._displayables.sliderGroup,s=a.transformCoordToLocal(t,e),l=a.transformCoordToLocal(o.x,o.y),u=this._size;s[0]=Math.max(Math.min(u[0],s[0]),0),r.setShape({x:l[0],y:0,width:s[0]-l[0],height:u[1]})},e.prototype._dispatchZoomAction=function(t){var e=this._range;this.api.dispatchAction({type:"dataZoom",from:this.uid,dataZoomId:this.dataZoomModel.id,animation:t?ZB:null,start:e[0],end:e[1]})},e.prototype._findCoordRect=function(){var t,e=TE(this.dataZoomModel).infoList;if(!t&&e.length){var n=e[0].model.coordinateSystem;t=n.getRect&&n.getRect()}if(!t){var i=this.api.getWidth(),r=this.api.getHeight();t={x:.2*i,y:.2*r,width:.6*i,height:.6*r}}return t},e.type="dataZoom.slider",e}(LE);function qB(t){return"vertical"===t?"ns-resize":"ew-resize"}function KB(t){t.registerComponentModel(WB),t.registerComponentView(jB),VE(t)}var $B=function(t,e,n){var i=T((JB[t]||{})[e]);return n&&Y(i)?i[i.length-1]:i},JB={color:{active:["#006edd","#e0ffff"],inactive:["rgba(0,0,0,0)"]},colorHue:{active:[0,360],inactive:[0,0]},colorSaturation:{active:[.3,1],inactive:[0,0]},colorLightness:{active:[.9,.5],inactive:[0,0]},colorAlpha:{active:[.3,1],inactive:[0,0]},opacity:{active:[.3,1],inactive:[0,0]},symbol:{active:["circle","roundRect","diamond"],inactive:["none"]},symbolSize:{active:[10,50],inactive:[0,0]}},QB=eD.mapVisual,tF=eD.eachVisual,eF=Y,nF=E,iF=Vr,rF=Nr,oF=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.stateList=["inRange","outOfRange"],n.replacableOptionKeys=["inRange","outOfRange","target","controller","color"],n.layoutMode={type:"box",ignoreSize:!0},n.dataBound=[-1/0,1/0],n.targetVisuals={},n.controllerVisuals={},n}return n(e,t),e.prototype.init=function(t,e,n){this.mergeDefaultAndTheme(t,n)},e.prototype.optionUpdated=function(t,e){var n=this.option;!e&&tV(n,t,this.replacableOptionKeys),this.textStyleModel=this.getModel("textStyle"),this.resetItemSize(),this.completeVisualOption()},e.prototype.resetVisual=function(t){var e=this.stateList;t=W(t,this),this.controllerVisuals=Qz(this.option.controller,e,t),this.targetVisuals=Qz(this.option.target,e,t)},e.prototype.getItemSymbol=function(){return null},e.prototype.getTargetSeriesIndices=function(){var t=this.option.seriesIndex,e=[];return null==t||"all"===t?this.ecModel.eachSeries((function(t,n){e.push(n)})):e=ho(t),e},e.prototype.eachTargetSeries=function(t,e){E(this.getTargetSeriesIndices(),(function(n){var i=this.ecModel.getSeriesByIndex(n);i&&t.call(e,i)}),this)},e.prototype.isTargetSeries=function(t){var e=!1;return this.eachTargetSeries((function(n){n===t&&(e=!0)})),e},e.prototype.formatValueText=function(t,e,n){var i,r=this.option,o=r.precision,a=this.dataBound,s=r.formatter;n=n||["<",">"],Y(t)&&(t=t.slice(),i=!0);var l=e?t:i?[u(t[0]),u(t[1])]:u(t);return X(s)?s.replace("{value}",i?l[0]:l).replace("{value2}",i?l[1]:l):U(s)?i?s(t[0],t[1]):s(t):i?t[0]===a[0]?n[0]+" "+l[1]:t[1]===a[1]?n[1]+" "+l[0]:l[0]+" - "+l[1]:l;function u(t){return t===a[0]?"min":t===a[1]?"max":(+t).toFixed(Math.min(o,20))}},e.prototype.resetExtent=function(){var t=this.option,e=iF([t.min,t.max]);this._dataExtent=e},e.prototype.getDataDimensionIndex=function(t){var e=this.option.dimension;if(null!=e)return t.getDimensionIndex(e);for(var n=t.dimensions,i=n.length-1;i>=0;i--){var r=n[i],o=t.getDimensionInfo(r);if(!o.isCalculationCoord)return o.storeDimIndex}},e.prototype.getExtent=function(){return this._dataExtent.slice()},e.prototype.completeVisualOption=function(){var t=this.ecModel,e=this.option,n={inRange:e.inRange,outOfRange:e.outOfRange},i=e.target||(e.target={}),r=e.controller||(e.controller={});C(i,n),C(r,n);var o=this.isCategory();function a(n){eF(e.color)&&!n.inRange&&(n.inRange={color:e.color.slice().reverse()}),n.inRange=n.inRange||{color:t.get("gradientColor")}}a.call(this,i),a.call(this,r),function(t,e,n){var i=t[e],r=t[n];i&&!r&&(r=t[n]={},nF(i,(function(t,e){if(eD.isValidType(e)){var n=$B(e,"inactive",o);null!=n&&(r[e]=n,"color"!==e||r.hasOwnProperty("opacity")||r.hasOwnProperty("colorAlpha")||(r.opacity=[0,0]))}})))}.call(this,i,"inRange","outOfRange"),function(t){var e=(t.inRange||{}).symbol||(t.outOfRange||{}).symbol,n=(t.inRange||{}).symbolSize||(t.outOfRange||{}).symbolSize,i=this.get("inactiveColor"),r=this.getItemSymbol()||"roundRect";nF(this.stateList,(function(a){var s=this.itemSize,l=t[a];l||(l=t[a]={color:o?i:[i]}),null==l.symbol&&(l.symbol=e&&T(e)||(o?r:[r])),null==l.symbolSize&&(l.symbolSize=n&&T(n)||(o?s[0]:[s[0],s[0]])),l.symbol=QB(l.symbol,(function(t){return"none"===t?r:t}));var u=l.symbolSize;if(null!=u){var h=-1/0;tF(u,(function(t){t>h&&(h=t)})),l.symbolSize=QB(u,(function(t){return rF(t,[0,h],[0,s[0]],!0)}))}}),this)}.call(this,r)},e.prototype.resetItemSize=function(){this.itemSize=[parseFloat(this.get("itemWidth")),parseFloat(this.get("itemHeight"))]},e.prototype.isCategory=function(){return!!this.option.categories},e.prototype.setSelected=function(t){},e.prototype.getSelected=function(){return null},e.prototype.getValueState=function(t){return null},e.prototype.getVisualMeta=function(t){return null},e.type="visualMap",e.dependencies=["series"],e.defaultOption={show:!0,z:4,seriesIndex:"all",min:0,max:200,left:0,right:null,top:null,bottom:0,itemWidth:null,itemHeight:null,inverse:!1,orient:"vertical",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",contentColor:"#5793f3",inactiveColor:"#aaa",borderWidth:0,padding:5,textGap:10,precision:0,textStyle:{color:"#333"}},e}(Ip),aF=[20,140],sF=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.optionUpdated=function(e,n){t.prototype.optionUpdated.apply(this,arguments),this.resetExtent(),this.resetVisual((function(t){t.mappingMethod="linear",t.dataExtent=this.getExtent()})),this._resetRange()},e.prototype.resetItemSize=function(){t.prototype.resetItemSize.apply(this,arguments);var e=this.itemSize;(null==e[0]||isNaN(e[0]))&&(e[0]=aF[0]),(null==e[1]||isNaN(e[1]))&&(e[1]=aF[1])},e.prototype._resetRange=function(){var t=this.getExtent(),e=this.option.range;!e||e.auto?(t.auto=1,this.option.range=t):Y(e)&&(e[0]>e[1]&&e.reverse(),e[0]=Math.max(e[0],t[0]),e[1]=Math.min(e[1],t[1]))},e.prototype.completeVisualOption=function(){t.prototype.completeVisualOption.apply(this,arguments),E(this.stateList,(function(t){var e=this.option.controller[t].symbolSize;e&&e[0]!==e[1]&&(e[0]=e[1]/3)}),this)},e.prototype.setSelected=function(t){this.option.range=t.slice(),this._resetRange()},e.prototype.getSelected=function(){var t=this.getExtent(),e=Vr((this.get("range")||[]).slice());return e[0]>t[1]&&(e[0]=t[1]),e[1]>t[1]&&(e[1]=t[1]),e[0]<t[0]&&(e[0]=t[0]),e[1]<t[0]&&(e[1]=t[0]),e},e.prototype.getValueState=function(t){var e=this.option.range,n=this.getExtent();return(e[0]<=n[0]||e[0]<=t)&&(e[1]>=n[1]||t<=e[1])?"inRange":"outOfRange"},e.prototype.findTargetDataIndices=function(t){var e=[];return this.eachTargetSeries((function(n){var i=[],r=n.getData();r.each(this.getDataDimensionIndex(r),(function(e,n){t[0]<=e&&e<=t[1]&&i.push(n)}),this),e.push({seriesId:n.id,dataIndex:i})}),this),e},e.prototype.getVisualMeta=function(t){var e=lF(this,"outOfRange",this.getExtent()),n=lF(this,"inRange",this.option.range.slice()),i=[];function r(e,n){i.push({value:e,color:t(e,n)})}for(var o=0,a=0,s=n.length,l=e.length;a<l&&(!n.length||e[a]<=n[0]);a++)e[a]<n[o]&&r(e[a],"outOfRange");for(var u=1;o<s;o++,u=0)u&&i.length&&r(n[o],"outOfRange"),r(n[o],"inRange");for(u=1;a<l;a++)(!n.length||n[n.length-1]<e[a])&&(u&&(i.length&&r(i[i.length-1].value,"outOfRange"),u=0),r(e[a],"outOfRange"));var h=i.length;return{stops:i,outerColors:[h?i[0].color:"transparent",h?i[h-1].color:"transparent"]}},e.type="visualMap.continuous",e.defaultOption=gc(oF.defaultOption,{align:"auto",calculable:!1,hoverLink:!0,realtime:!0,handleIcon:"path://M-11.39,9.77h0a3.5,3.5,0,0,1-3.5,3.5h-22a3.5,3.5,0,0,1-3.5-3.5h0a3.5,3.5,0,0,1,3.5-3.5h22A3.5,3.5,0,0,1-11.39,9.77Z",handleSize:"120%",handleStyle:{borderColor:"#fff",borderWidth:1},indicatorIcon:"circle",indicatorSize:"50%",indicatorStyle:{borderColor:"#fff",borderWidth:2,shadowBlur:2,shadowOffsetX:1,shadowOffsetY:1,shadowColor:"rgba(0,0,0,0.2)"}}),e}(oF);function lF(t,e,n){if(n[0]===n[1])return n.slice();for(var i=(n[1]-n[0])/200,r=n[0],o=[],a=0;a<=200&&r<n[1];a++)o.push(r),r+=i;return o.push(n[1]),o}var uF=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.autoPositionValues={left:1,right:1,top:1,bottom:1},n}return n(e,t),e.prototype.init=function(t,e){this.ecModel=t,this.api=e},e.prototype.render=function(t,e,n,i){this.visualMapModel=t,!1!==t.get("show")?this.doRender(t,e,n,i):this.group.removeAll()},e.prototype.renderBackground=function(t){var e=this.visualMapModel,n=np(e.get("padding")||0),i=t.getBoundingRect();t.add(new Ts({z2:-1,silent:!0,shape:{x:i.x-n[3],y:i.y-n[0],width:i.width+n[3]+n[1],height:i.height+n[0]+n[2]},style:{fill:e.get("backgroundColor"),stroke:e.get("borderColor"),lineWidth:e.get("borderWidth")}}))},e.prototype.getControllerVisual=function(t,e,n){var i=(n=n||{}).forceState,r=this.visualMapModel,o={};if("color"===e){var a=r.get("contentColor");o.color=a}function s(t){return o[t]}function l(t,e){o[t]=e}var u=r.controllerVisuals[i||r.getValueState(t)];return E(eD.prepareVisualTypes(u),(function(i){var r=u[i];n.convertOpacityToAlpha&&"opacity"===i&&(i="colorAlpha",r=u.__alphaForOpacity),eD.dependsOn(i,e)&&r&&r.applyVisual(t,s,l)})),o[e]},e.prototype.positionGroup=function(t){var e=this.visualMapModel,n=this.api;xp(t,e.getBoxLayoutParams(),{width:n.getWidth(),height:n.getHeight()})},e.prototype.doRender=function(t,e,n,i){},e.type="visualMap",e}(fg),hF=[["left","right","width"],["top","bottom","height"]];function cF(t,e,n){var i=t.option,r=i.align;if(null!=r&&"auto"!==r)return r;for(var o={width:e.getWidth(),height:e.getHeight()},a="horizontal"===i.orient?1:0,s=hF[a],l=[0,null,10],u={},h=0;h<3;h++)u[hF[1-a][h]]=l[h],u[s[h]]=2===h?n[0]:i[s[h]];var c=[["x","width",3],["y","height",0]][a],p=mp(u,o,i.padding);return s[(p.margin[c[2]]||0)+p[c[0]]+.5*p[c[1]]<.5*o[c[1]]?0:1]}function pF(t,e){return E(t||[],(function(t){null!=t.dataIndex&&(t.dataIndexInside=t.dataIndex,t.dataIndex=null),t.highlightKey="visualMap"+(e?e.componentIndex:"")})),t}var dF=Nr,fF=E,gF=Math.min,yF=Math.max,vF=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._shapes={},n._dataInterval=[],n._handleEnds=[],n._hoverLinkDataIndices=[],n}return n(e,t),e.prototype.doRender=function(t,e,n,i){this._api=n,i&&"selectDataRange"===i.type&&i.from===this.uid||this._buildView()},e.prototype._buildView=function(){this.group.removeAll();var t=this.visualMapModel,e=this.group;this._orient=t.get("orient"),this._useHandle=t.get("calculable"),this._resetInterval(),this._renderBar(e);var n=t.get("text");this._renderEndsText(e,n,0),this._renderEndsText(e,n,1),this._updateView(!0),this.renderBackground(e),this._updateView(),this._enableHoverLinkToSeries(),this._enableHoverLinkFromSeries(),this.positionGroup(e)},e.prototype._renderEndsText=function(t,e,n){if(e){var i=e[1-n];i=null!=i?i+"":"";var r=this.visualMapModel,o=r.get("textGap"),a=r.itemSize,s=this._shapes.mainGroup,l=this._applyTransform([a[0]/2,0===n?-o:a[1]+o],s),u=this._applyTransform(0===n?"bottom":"top",s),h=this._orient,c=this.visualMapModel.textStyleModel;this.group.add(new As({style:{x:l[0],y:l[1],verticalAlign:"horizontal"===h?"middle":u,align:"horizontal"===h?u:"center",text:i,font:c.getFont(),fill:c.getTextColor()}}))}},e.prototype._renderBar=function(t){var e=this.visualMapModel,n=this._shapes,i=e.itemSize,r=this._orient,o=this._useHandle,a=cF(e,this.api,i),s=n.mainGroup=this._createBarGroup(a),l=new Cr;s.add(l),l.add(n.outOfRange=mF()),l.add(n.inRange=mF(null,o?_F(this._orient):null,W(this._dragHandle,this,"all",!1),W(this._dragHandle,this,"all",!0))),l.setClipPath(new Ts({shape:{x:0,y:0,width:i[0],height:i[1],r:3}}));var u=e.textStyleModel.getTextRect("国"),h=yF(u.width,u.height);o&&(n.handleThumbs=[],n.handleLabels=[],n.handleLabelPoints=[],this._createHandle(e,s,0,i,h,r),this._createHandle(e,s,1,i,h,r)),this._createIndicator(e,s,i,h,r),t.add(s)},e.prototype._createHandle=function(t,e,n,i,r,o){var a=W(this._dragHandle,this,n,!1),s=W(this._dragHandle,this,n,!0),l=gr(t.get("handleSize"),i[0]),u=ky(t.get("handleIcon"),-l/2,-l/2,l,l,null,!0),h=_F(this._orient);u.attr({cursor:h,draggable:!0,drift:a,ondragend:s,onmousemove:function(t){se(t.event)}}),u.x=i[0]/2,u.useStyle(t.getModel("handleStyle").getItemStyle()),u.setStyle({strokeNoScale:!0,strokeFirst:!0}),u.style.lineWidth*=2,u.ensureState("emphasis").style=t.getModel(["emphasis","handleStyle"]).getItemStyle(),Vl(u,!0),e.add(u);var c=this.visualMapModel.textStyleModel,p=new As({cursor:h,draggable:!0,drift:a,onmousemove:function(t){se(t.event)},ondragend:s,style:{x:0,y:0,text:"",font:c.getFont(),fill:c.getTextColor()}});p.ensureState("blur").style={opacity:.1},p.stateTransition={duration:200},this.group.add(p);var d=[l,0],f=this._shapes;f.handleThumbs[n]=u,f.handleLabelPoints[n]=d,f.handleLabels[n]=p},e.prototype._createIndicator=function(t,e,n,i,r){var o=gr(t.get("indicatorSize"),n[0]),a=ky(t.get("indicatorIcon"),-o/2,-o/2,o,o,null,!0);a.attr({cursor:"move",invisible:!0,silent:!0,x:n[0]/2});var s=t.getModel("indicatorStyle").getItemStyle();if(a instanceof xs){var l=a.style;a.useStyle(A({image:l.image,x:l.x,y:l.y,width:l.width,height:l.height},s))}else a.useStyle(s);e.add(a);var u=this.visualMapModel.textStyleModel,h=new As({silent:!0,invisible:!0,style:{x:0,y:0,text:"",font:u.getFont(),fill:u.getTextColor()}});this.group.add(h);var c=[("horizontal"===r?i/2:6)+n[0]/2,0],p=this._shapes;p.indicator=a,p.indicatorLabel=h,p.indicatorLabelPoint=c,this._firstShowIndicator=!0},e.prototype._dragHandle=function(t,e,n,i){if(this._useHandle){if(this._dragging=!e,!e){var r=this._applyTransform([n,i],this._shapes.mainGroup,!0);this._updateInterval(t,r[1]),this._hideIndicator(),this._updateView()}e===!this.visualMapModel.get("realtime")&&this.api.dispatchAction({type:"selectDataRange",from:this.uid,visualMapId:this.visualMapModel.id,selected:this._dataInterval.slice()}),e?!this._hovering&&this._clearHoverLinkToSeries():xF(this.visualMapModel)&&this._doHoverLinkToSeries(this._handleEnds[t],!1)}},e.prototype._resetInterval=function(){var t=this.visualMapModel,e=this._dataInterval=t.getSelected(),n=t.getExtent(),i=[0,t.itemSize[1]];this._handleEnds=[dF(e[0],n,i,!0),dF(e[1],n,i,!0)]},e.prototype._updateInterval=function(t,e){e=e||0;var n=this.visualMapModel,i=this._handleEnds,r=[0,n.itemSize[1]];sk(e,i,r,t,0);var o=n.getExtent();this._dataInterval=[dF(i[0],r,o,!0),dF(i[1],r,o,!0)]},e.prototype._updateView=function(t){var e=this.visualMapModel,n=e.getExtent(),i=this._shapes,r=[0,e.itemSize[1]],o=t?r:this._handleEnds,a=this._createBarVisual(this._dataInterval,n,o,"inRange"),s=this._createBarVisual(n,n,r,"outOfRange");i.inRange.setStyle({fill:a.barColor}).setShape("points",a.barPoints),i.outOfRange.setStyle({fill:s.barColor}).setShape("points",s.barPoints),this._updateHandle(o,a)},e.prototype._createBarVisual=function(t,e,n,i){var r={forceState:i,convertOpacityToAlpha:!0},o=this._makeColorGradient(t,r),a=[this.getControllerVisual(t[0],"symbolSize",r),this.getControllerVisual(t[1],"symbolSize",r)],s=this._createBarPoints(n,a);return{barColor:new Uu(0,0,0,1,o),barPoints:s,handlesColor:[o[0].color,o[o.length-1].color]}},e.prototype._makeColorGradient=function(t,e){var n=[],i=(t[1]-t[0])/100;n.push({color:this.getControllerVisual(t[0],"color",e),offset:0});for(var r=1;r<100;r++){var o=t[0]+i*r;if(o>t[1])break;n.push({color:this.getControllerVisual(o,"color",e),offset:r/100})}return n.push({color:this.getControllerVisual(t[1],"color",e),offset:1}),n},e.prototype._createBarPoints=function(t,e){var n=this.visualMapModel.itemSize;return[[n[0]-e[0],t[0]],[n[0],t[0]],[n[0],t[1]],[n[0]-e[1],t[1]]]},e.prototype._createBarGroup=function(t){var e=this._orient,n=this.visualMapModel.get("inverse");return new Cr("horizontal"!==e||n?"horizontal"===e&&n?{scaleX:"bottom"===t?-1:1,rotation:-Math.PI/2}:"vertical"!==e||n?{scaleX:"left"===t?1:-1}:{scaleX:"left"===t?1:-1,scaleY:-1}:{scaleX:"bottom"===t?1:-1,rotation:Math.PI/2})},e.prototype._updateHandle=function(t,e){if(this._useHandle){var n=this._shapes,i=this.visualMapModel,r=n.handleThumbs,o=n.handleLabels,a=i.itemSize,s=i.getExtent();fF([0,1],(function(l){var u=r[l];u.setStyle("fill",e.handlesColor[l]),u.y=t[l];var h=dF(t[l],[0,a[1]],s,!0),c=this.getControllerVisual(h,"symbolSize");u.scaleX=u.scaleY=c/a[0],u.x=a[0]-c/2;var p=Ih(n.handleLabelPoints[l],Mh(u,this.group));o[l].setStyle({x:p[0],y:p[1],text:i.formatValueText(this._dataInterval[l]),verticalAlign:"middle",align:"vertical"===this._orient?this._applyTransform("left",n.mainGroup):"center"})}),this)}},e.prototype._showIndicator=function(t,e,n,i){var r=this.visualMapModel,o=r.getExtent(),a=r.itemSize,s=[0,a[1]],l=this._shapes,u=l.indicator;if(u){u.attr("invisible",!1);var h=this.getControllerVisual(t,"color",{convertOpacityToAlpha:!0}),c=this.getControllerVisual(t,"symbolSize"),p=dF(t,o,s,!0),d=a[0]-c/2,f={x:u.x,y:u.y};u.y=p,u.x=d;var g=Ih(l.indicatorLabelPoint,Mh(u,this.group)),y=l.indicatorLabel;y.attr("invisible",!1);var v=this._applyTransform("left",l.mainGroup),m="horizontal"===this._orient;y.setStyle({text:(n||"")+r.formatValueText(e),verticalAlign:m?v:"middle",align:m?"center":v});var x={x:d,y:p,style:{fill:h}},_={style:{x:g[0],y:g[1]}};if(r.ecModel.isAnimationEnabled()&&!this._firstShowIndicator){var b={duration:100,easing:"cubicInOut",additive:!0};u.x=f.x,u.y=f.y,u.animateTo(x,b),y.animateTo(_,b)}else u.attr(x),y.attr(_);this._firstShowIndicator=!1;var w=this._shapes.handleLabels;if(w)for(var S=0;S<w.length;S++)this._api.enterBlur(w[S])}},e.prototype._enableHoverLinkToSeries=function(){var t=this;this._shapes.mainGroup.on("mousemove",(function(e){if(t._hovering=!0,!t._dragging){var n=t.visualMapModel.itemSize,i=t._applyTransform([e.offsetX,e.offsetY],t._shapes.mainGroup,!0,!0);i[1]=gF(yF(0,i[1]),n[1]),t._doHoverLinkToSeries(i[1],0<=i[0]&&i[0]<=n[0])}})).on("mouseout",(function(){t._hovering=!1,!t._dragging&&t._clearHoverLinkToSeries()}))},e.prototype._enableHoverLinkFromSeries=function(){var t=this.api.getZr();this.visualMapModel.option.hoverLink?(t.on("mouseover",this._hoverLinkFromSeriesMouseOver,this),t.on("mouseout",this._hideIndicator,this)):this._clearHoverLinkFromSeries()},e.prototype._doHoverLinkToSeries=function(t,e){var n=this.visualMapModel,i=n.itemSize;if(n.option.hoverLink){var r=[0,i[1]],o=n.getExtent();t=gF(yF(r[0],t),r[1]);var a=function(t,e,n){var i=6,r=t.get("hoverLinkDataSize");r&&(i=dF(r,e,n,!0)/2);return i}(n,o,r),s=[t-a,t+a],l=dF(t,r,o,!0),u=[dF(s[0],r,o,!0),dF(s[1],r,o,!0)];s[0]<r[0]&&(u[0]=-1/0),s[1]>r[1]&&(u[1]=1/0),e&&(u[0]===-1/0?this._showIndicator(l,u[1],"< ",a):u[1]===1/0?this._showIndicator(l,u[0],"> ",a):this._showIndicator(l,l,"≈ ",a));var h=this._hoverLinkDataIndices,c=[];(e||xF(n))&&(c=this._hoverLinkDataIndices=n.findTargetDataIndices(u));var p=function(t,e){var n={},i={};return r(t||[],n),r(e||[],i,n),[o(n),o(i)];function r(t,e,n){for(var i=0,r=t.length;i<r;i++){var o=xo(t[i].seriesId,null);if(null==o)return;for(var a=ho(t[i].dataIndex),s=n&&n[o],l=0,u=a.length;l<u;l++){var h=a[l];s&&s[h]?s[h]=null:(e[o]||(e[o]={}))[h]=1}}}function o(t,e){var n=[];for(var i in t)if(t.hasOwnProperty(i)&&null!=t[i])if(e)n.push(+i);else{var r=o(t[i],!0);r.length&&n.push({seriesId:i,dataIndex:r})}return n}}(h,c);this._dispatchHighDown("downplay",pF(p[0],n)),this._dispatchHighDown("highlight",pF(p[1],n))}},e.prototype._hoverLinkFromSeriesMouseOver=function(t){var e=t.target,n=this.visualMapModel;if(e&&null!=Ws(e).dataIndex){var i=Ws(e),r=this.ecModel.getSeriesByIndex(i.seriesIndex);if(n.isTargetSeries(r)){var o=r.getData(i.dataType),a=o.getStore().get(n.getDataDimensionIndex(o),i.dataIndex);isNaN(a)||this._showIndicator(a,a)}}},e.prototype._hideIndicator=function(){var t=this._shapes;t.indicator&&t.indicator.attr("invisible",!0),t.indicatorLabel&&t.indicatorLabel.attr("invisible",!0);var e=this._shapes.handleLabels;if(e)for(var n=0;n<e.length;n++)this._api.leaveBlur(e[n])},e.prototype._clearHoverLinkToSeries=function(){this._hideIndicator();var t=this._hoverLinkDataIndices;this._dispatchHighDown("downplay",pF(t,this.visualMapModel)),t.length=0},e.prototype._clearHoverLinkFromSeries=function(){this._hideIndicator();var t=this.api.getZr();t.off("mouseover",this._hoverLinkFromSeriesMouseOver),t.off("mouseout",this._hideIndicator)},e.prototype._applyTransform=function(t,e,n,i){var r=Mh(e,i?null:this.group);return Y(t)?Ih(t,r,n):Th(t,r,n)},e.prototype._dispatchHighDown=function(t,e){e&&e.length&&this.api.dispatchAction({type:t,batch:e})},e.prototype.dispose=function(){this._clearHoverLinkFromSeries(),this._clearHoverLinkToSeries()},e.prototype.remove=function(){this._clearHoverLinkFromSeries(),this._clearHoverLinkToSeries()},e.type="visualMap.continuous",e}(uF);function mF(t,e,n,i){return new Lu({shape:{points:t},draggable:!!n,cursor:e,drift:n,onmousemove:function(t){se(t.event)},ondragend:i})}function xF(t){var e=t.get("hoverLinkOnHandle");return!!(null==e?t.get("realtime"):e)}function _F(t){return"vertical"===t?"ns-resize":"ew-resize"}var bF={type:"selectDataRange",event:"dataRangeSelected",update:"update"},wF=function(t,e){e.eachComponent({mainType:"visualMap",query:t},(function(e){e.setSelected(t.selected)}))},SF=[{createOnAllSeries:!0,reset:function(t,e){var n=[];return e.eachComponent("visualMap",(function(e){var i,r,o,a,s,l=t.pipelineContext;!e.isTargetSeries(t)||l&&l.large||n.push((i=e.stateList,r=e.targetVisuals,o=W(e.getValueState,e),a=e.getDataDimensionIndex(t.getData()),s={},E(i,(function(t){var e=eD.prepareVisualTypes(r[t]);s[t]=e})),{progress:function(t,e){var n,i;function l(t){return dy(e,i,t)}function u(t,n){gy(e,i,t,n)}null!=a&&(n=e.getDimensionIndex(a));for(var h=e.getStore();null!=(i=t.next());){var c=e.getRawDataItem(i);if(!c||!1!==c.visualMap)for(var p=null!=a?h.get(n,i):i,d=o(p),f=r[d],g=s[d],y=0,v=g.length;y<v;y++){var m=g[y];f[m]&&f[m].applyVisual(p,l,u)}}}}))})),n}},{createOnAllSeries:!0,reset:function(t,e){var n=t.getData(),i=[];e.eachComponent("visualMap",(function(e){if(e.isTargetSeries(t)){var r=e.getVisualMeta(W(MF,null,t,e))||{stops:[],outerColors:[]},o=e.getDataDimensionIndex(n);o>=0&&(r.dimension=o,i.push(r))}})),t.getData().setVisual("visualMeta",i)}}];function MF(t,e,n,i){for(var r=e.targetVisuals[i],o=eD.prepareVisualTypes(r),a={color:fy(t.getData(),"color")},s=0,l=o.length;s<l;s++){var u=o[s],h=r["opacity"===u?"__alphaForOpacity":u];h&&h.applyVisual(n,c,p)}return a.color;function c(t){return a[t]}function p(t,e){a[t]=e}}var IF=E;function TF(t){var e=t&&t.visualMap;Y(e)||(e=e?[e]:[]),IF(e,(function(t){if(t){CF(t,"splitList")&&!CF(t,"pieces")&&(t.pieces=t.splitList,delete t.splitList);var e=t.pieces;e&&Y(e)&&IF(e,(function(t){q(t)&&(CF(t,"start")&&!CF(t,"min")&&(t.min=t.start),CF(t,"end")&&!CF(t,"max")&&(t.max=t.end))}))}}))}function CF(t,e){return t&&t.hasOwnProperty&&t.hasOwnProperty(e)}var DF=!1;function AF(t){DF||(DF=!0,t.registerSubTypeDefaulter("visualMap",(function(t){return t.categories||(t.pieces?t.pieces.length>0:t.splitNumber>0)&&!t.calculable?"piecewise":"continuous"})),t.registerAction(bF,wF),E(SF,(function(e){t.registerVisual(t.PRIORITY.VISUAL.COMPONENT,e)})),t.registerPreprocessor(TF))}function kF(t){t.registerComponentModel(sF),t.registerComponentView(vF),AF(t)}var LF=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._pieceList=[],n}return n(e,t),e.prototype.optionUpdated=function(e,n){t.prototype.optionUpdated.apply(this,arguments),this.resetExtent();var i=this._mode=this._determineMode();this._pieceList=[],PF[this._mode].call(this,this._pieceList),this._resetSelected(e,n);var r=this.option.categories;this.resetVisual((function(t,e){"categories"===i?(t.mappingMethod="category",t.categories=T(r)):(t.dataExtent=this.getExtent(),t.mappingMethod="piecewise",t.pieceList=z(this._pieceList,(function(t){return t=T(t),"inRange"!==e&&(t.visual=null),t})))}))},e.prototype.completeVisualOption=function(){var e=this.option,n={},i=eD.listVisualTypes(),r=this.isCategory();function o(t,e,n){return t&&t[e]&&t[e].hasOwnProperty(n)}E(e.pieces,(function(t){E(i,(function(e){t.hasOwnProperty(e)&&(n[e]=1)}))})),E(n,(function(t,n){var i=!1;E(this.stateList,(function(t){i=i||o(e,t,n)||o(e.target,t,n)}),this),!i&&E(this.stateList,(function(t){(e[t]||(e[t]={}))[n]=$B(n,"inRange"===t?"active":"inactive",r)}))}),this),t.prototype.completeVisualOption.apply(this,arguments)},e.prototype._resetSelected=function(t,e){var n=this.option,i=this._pieceList,r=(e?n:t).selected||{};if(n.selected=r,E(i,(function(t,e){var n=this.getSelectedMapKey(t);r.hasOwnProperty(n)||(r[n]=!0)}),this),"single"===n.selectedMode){var o=!1;E(i,(function(t,e){var n=this.getSelectedMapKey(t);r[n]&&(o?r[n]=!1:o=!0)}),this)}},e.prototype.getItemSymbol=function(){return this.get("itemSymbol")},e.prototype.getSelectedMapKey=function(t){return"categories"===this._mode?t.value+"":t.index+""},e.prototype.getPieceList=function(){return this._pieceList},e.prototype._determineMode=function(){var t=this.option;return t.pieces&&t.pieces.length>0?"pieces":this.option.categories?"categories":"splitNumber"},e.prototype.setSelected=function(t){this.option.selected=T(t)},e.prototype.getValueState=function(t){var e=eD.findPieceIndex(t,this._pieceList);return null!=e&&this.option.selected[this.getSelectedMapKey(this._pieceList[e])]?"inRange":"outOfRange"},e.prototype.findTargetDataIndices=function(t){var e=[],n=this._pieceList;return this.eachTargetSeries((function(i){var r=[],o=i.getData();o.each(this.getDataDimensionIndex(o),(function(e,i){eD.findPieceIndex(e,n)===t&&r.push(i)}),this),e.push({seriesId:i.id,dataIndex:r})}),this),e},e.prototype.getRepresentValue=function(t){var e;if(this.isCategory())e=t.value;else if(null!=t.value)e=t.value;else{var n=t.interval||[];e=n[0]===-1/0&&n[1]===1/0?0:(n[0]+n[1])/2}return e},e.prototype.getVisualMeta=function(t){if(!this.isCategory()){var e=[],n=["",""],i=this,r=this._pieceList.slice();if(r.length){var o=r[0].interval[0];o!==-1/0&&r.unshift({interval:[-1/0,o]}),(o=r[r.length-1].interval[1])!==1/0&&r.push({interval:[o,1/0]})}else r.push({interval:[-1/0,1/0]});var a=-1/0;return E(r,(function(t){var e=t.interval;e&&(e[0]>a&&s([a,e[0]],"outOfRange"),s(e.slice()),a=e[1])}),this),{stops:e,outerColors:n}}function s(r,o){var a=i.getRepresentValue({interval:r});o||(o=i.getValueState(a));var s=t(a,o);r[0]===-1/0?n[0]=s:r[1]===1/0?n[1]=s:e.push({value:r[0],color:s},{value:r[1],color:s})}},e.type="visualMap.piecewise",e.defaultOption=gc(oF.defaultOption,{selected:null,minOpen:!1,maxOpen:!1,align:"auto",itemWidth:20,itemHeight:14,itemSymbol:"roundRect",pieces:null,categories:null,splitNumber:5,selectedMode:"multiple",itemGap:10,hoverLink:!0}),e}(oF),PF={splitNumber:function(t){var e=this.option,n=Math.min(e.precision,20),i=this.getExtent(),r=e.splitNumber;r=Math.max(parseInt(r,10),1),e.splitNumber=r;for(var o=(i[1]-i[0])/r;+o.toFixed(n)!==o&&n<5;)n++;e.precision=n,o=+o.toFixed(n),e.minOpen&&t.push({interval:[-1/0,i[0]],close:[0,0]});for(var a=0,s=i[0];a<r;s+=o,a++){var l=a===r-1?i[1]:s+o;t.push({interval:[s,l],close:[1,1]})}e.maxOpen&&t.push({interval:[i[1],1/0],close:[0,0]}),Qr(t),E(t,(function(t,e){t.index=e,t.text=this.formatValueText(t.interval)}),this)},categories:function(t){var e=this.option;E(e.categories,(function(e){t.push({text:this.formatValueText(e,!0),value:e})}),this),OF(e,t)},pieces:function(t){var e=this.option;E(e.pieces,(function(e,n){q(e)||(e={value:e});var i={text:"",index:n};if(null!=e.label&&(i.text=e.label),e.hasOwnProperty("value")){var r=i.value=e.value;i.interval=[r,r],i.close=[1,1]}else{for(var o=i.interval=[],a=i.close=[0,0],s=[1,0,1],l=[-1/0,1/0],u=[],h=0;h<2;h++){for(var c=[["gte","gt","min"],["lte","lt","max"]][h],p=0;p<3&&null==o[h];p++)o[h]=e[c[p]],a[h]=s[p],u[h]=2===p;null==o[h]&&(o[h]=l[h])}u[0]&&o[1]===1/0&&(a[0]=0),u[1]&&o[0]===-1/0&&(a[1]=0),o[0]===o[1]&&a[0]&&a[1]&&(i.value=o[0])}i.visual=eD.retrieveVisuals(e),t.push(i)}),this),OF(e,t),Qr(t),E(t,(function(t){var e=t.close,n=[["<","≤"][e[1]],[">","≥"][e[0]]];t.text=t.text||this.formatValueText(null!=t.value?t.value:t.interval,!1,n)}),this)}};function OF(t,e){var n=t.inverse;("vertical"===t.orient?!n:n)&&e.reverse()}var RF=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.doRender=function(){var t=this.group;t.removeAll();var e=this.visualMapModel,n=e.get("textGap"),i=e.textStyleModel,r=i.getFont(),o=i.getTextColor(),a=this._getItemAlign(),s=e.itemSize,l=this._getViewData(),u=l.endsText,h=it(e.get("showLabel",!0),!u);u&&this._renderEndsText(t,u[0],s,h,a),E(l.viewPieceList,(function(i){var l=i.piece,u=new Cr;u.onclick=W(this._onItemClick,this,l),this._enableHoverLink(u,i.indexInModelPieceList);var c=e.getRepresentValue(l);if(this._createItemSymbol(u,c,[0,0,s[0],s[1]]),h){var p=this.visualMapModel.getValueState(c);u.add(new As({style:{x:"right"===a?-n:s[0]+n,y:s[1]/2,text:l.text,verticalAlign:"middle",align:a,font:r,fill:o,opacity:"outOfRange"===p?.5:1}}))}t.add(u)}),this),u&&this._renderEndsText(t,u[1],s,h,a),vp(e.get("orient"),t,e.get("itemGap")),this.renderBackground(t),this.positionGroup(t)},e.prototype._enableHoverLink=function(t,e){var n=this;t.on("mouseover",(function(){return i("highlight")})).on("mouseout",(function(){return i("downplay")}));var i=function(t){var i=n.visualMapModel;i.option.hoverLink&&n.api.dispatchAction({type:t,batch:pF(i.findTargetDataIndices(e),i)})}},e.prototype._getItemAlign=function(){var t=this.visualMapModel,e=t.option;if("vertical"===e.orient)return cF(t,this.api,t.itemSize);var n=e.align;return n&&"auto"!==n||(n="left"),n},e.prototype._renderEndsText=function(t,e,n,i,r){if(e){var o=new Cr,a=this.visualMapModel.textStyleModel;o.add(new As({style:{x:i?"right"===r?n[0]:0:n[0]/2,y:n[1]/2,verticalAlign:"middle",align:i?r:"center",text:e,font:a.getFont(),fill:a.getTextColor()}})),t.add(o)}},e.prototype._getViewData=function(){var t=this.visualMapModel,e=z(t.getPieceList(),(function(t,e){return{piece:t,indexInModelPieceList:e}})),n=t.get("text"),i=t.get("orient"),r=t.get("inverse");return("horizontal"===i?r:!r)?e.reverse():n&&(n=n.slice().reverse()),{viewPieceList:e,endsText:n}},e.prototype._createItemSymbol=function(t,e,n){t.add(ky(this.getControllerVisual(e,"symbol"),n[0],n[1],n[2],n[3],this.getControllerVisual(e,"color")))},e.prototype._onItemClick=function(t){var e=this.visualMapModel,n=e.option,i=T(n.selected),r=e.getSelectedMapKey(t);"single"===n.selectedMode?(i[r]=!0,E(i,(function(t,e){i[e]=e===r}))):i[r]=!i[r],this.api.dispatchAction({type:"selectDataRange",from:this.uid,visualMapId:this.visualMapModel.id,selected:i})},e.type="visualMap.piecewise",e}(uF);function NF(t){t.registerComponentModel(LF),t.registerComponentView(RF),AF(t)}var EF={label:{enabled:!0},decal:{show:!1}},zF=So(),VF={};function BF(t,e){var n=t.getModel("aria");if(n.get("enabled")){var i=T(EF);C(i.label,t.getLocaleModel().get("aria"),!1),C(n.option,i,!1),function(){if(n.getModel("decal").get("show")){var e=ft();t.eachSeries((function(t){if(!t.isColorBySeries()){var n=e.get(t.type);n||(n={},e.set(t.type,n)),zF(t).scope=n}})),t.eachRawSeries((function(e){if(!t.isSeriesFiltered(e))if(U(e.enableAriaDecal))e.enableAriaDecal();else{var n=e.getData();if(e.isColorBySeries()){var i=td(e.ecModel,e.name,VF,t.getSeriesCount()),r=n.getVisual("decal");n.setVisual("decal",u(r,i))}else{var o=e.getRawData(),a={},s=zF(e).scope;n.each((function(t){var e=n.getRawIndex(t);a[e]=t}));var l=o.count();o.each((function(t){var i=a[t],r=o.getName(t)||t+"",h=td(e.ecModel,r,s,l),c=n.getItemVisual(i,"decal");n.setItemVisual(i,"decal",u(c,h))}))}}function u(t,e){var n=t?A(A({},e),t):e;return n.dirty=!0,n}}))}}(),function(){var i=t.getLocaleModel().get("aria"),o=n.getModel("label");if(o.option=k(o.option,i),!o.get("enabled"))return;var a=e.getZr().dom;if(o.get("description"))return void a.setAttribute("aria-label",o.get("description"));var s,l=t.getSeriesCount(),u=o.get(["data","maxCount"])||10,h=o.get(["series","maxCount"])||10,c=Math.min(l,h);if(l<1)return;var p=function(){var e=t.get("title");e&&e.length&&(e=e[0]);return e&&e.text}();if(p){var d=o.get(["general","withTitle"]);s=r(d,{title:p})}else s=o.get(["general","withoutTitle"]);var f=[],g=l>1?o.get(["series","multiple","prefix"]):o.get(["series","single","prefix"]);s+=r(g,{seriesCount:l}),t.eachSeries((function(e,n){if(n<c){var i=void 0,a=e.get("name")?"withName":"withoutName";i=r(i=l>1?o.get(["series","multiple",a]):o.get(["series","single",a]),{seriesId:e.seriesIndex,seriesName:e.get("name"),seriesType:(x=e.subType,t.getLocaleModel().get(["series","typeNames"])[x]||"自定义图")});var s=e.getData();if(s.count()>u)i+=r(o.get(["data","partialData"]),{displayCnt:u});else i+=o.get(["data","allData"]);for(var h=o.get(["data","separator","middle"]),p=o.get(["data","separator","end"]),d=[],g=0;g<s.count();g++)if(g<u){var y=s.getName(g),v=s.getValues(g),m=o.get(["data",y?"withName":"withoutName"]);d.push(r(m,{name:y,value:v.join(h)}))}i+=d.join(h)+p,f.push(i)}var x}));var y=o.getModel(["series","multiple","separator"]),v=y.get("middle"),m=y.get("end");s+=f.join(v)+m,a.setAttribute("aria-label",s)}()}function r(t,e){if(!X(t))return t;var n=t;return E(e,(function(t,e){n=n.replace(new RegExp("\\{\\s*"+e+"\\s*\\}","g"),t)})),n}}function FF(t){if(t&&t.aria){var e=t.aria;null!=e.show&&(e.enabled=e.show),e.label=e.label||{},E(["description","general","series","data"],(function(t){null!=e[t]&&(e.label[t]=e[t])}))}}var GF={value:"eq","<":"lt","<=":"lte",">":"gt",">=":"gte","=":"eq","!=":"ne","<>":"ne"},WF=function(){function t(t){if(null==(this._condVal=X(t)?new RegExp(t):et(t)?t:null)){var e="";0,ao(e)}}return t.prototype.evaluate=function(t){var e=typeof t;return X(e)?this._condVal.test(t):!!j(e)&&this._condVal.test(t+"")},t}(),HF=function(){function t(){}return t.prototype.evaluate=function(){return this.value},t}(),YF=function(){function t(){}return t.prototype.evaluate=function(){for(var t=this.children,e=0;e<t.length;e++)if(!t[e].evaluate())return!1;return!0},t}(),UF=function(){function t(){}return t.prototype.evaluate=function(){for(var t=this.children,e=0;e<t.length;e++)if(t[e].evaluate())return!0;return!1},t}(),XF=function(){function t(){}return t.prototype.evaluate=function(){return!this.child.evaluate()},t}(),ZF=function(){function t(){}return t.prototype.evaluate=function(){for(var t=!!this.valueParser,e=(0,this.getValue)(this.valueGetterParam),n=t?this.valueParser(e):null,i=0;i<this.subCondList.length;i++)if(!this.subCondList[i].evaluate(t?n:e))return!1;return!0},t}();function jF(t,e){if(!0===t||!1===t){var n=new HF;return n.value=t,n}var i="";return KF(t)||ao(i),t.and?qF("and",t,e):t.or?qF("or",t,e):t.not?function(t,e){var n=t.not,i="";0;KF(n)||ao(i);var r=new XF;r.child=jF(n,e),r.child||ao(i);return r}(t,e):function(t,e){for(var n="",i=e.prepareGetValue(t),r=[],o=G(t),a=t.parser,s=a?ff(a):null,l=0;l<o.length;l++){var u=o[l];if("parser"!==u&&!e.valueGetterAttrMap.get(u)){var h=mt(GF,u)?GF[u]:u,c=t[u],p=s?s(c):c,d=xf(h,p)||"reg"===h&&new WF(p);d||ao(n),r.push(d)}}r.length||ao(n);var f=new ZF;return f.valueGetterParam=i,f.valueParser=s,f.getValue=e.getValue,f.subCondList=r,f}(t,e)}function qF(t,e,n){var i=e[t],r="";Y(i)||ao(r),i.length||ao(r);var o="and"===t?new YF:new UF;return o.children=z(i,(function(t){return jF(t,n)})),o.children.length||ao(r),o}function KF(t){return q(t)&&!N(t)}var $F=function(){function t(t,e){this._cond=jF(t,e)}return t.prototype.evaluate=function(){return this._cond.evaluate()},t}();var JF={type:"echarts:filter",transform:function(t){for(var e,n,i,r=t.upstream,o=(n=t.config,i={valueGetterAttrMap:ft({dimension:!0}),prepareGetValue:function(t){var e="",n=t.dimension;mt(t,"dimension")||ao(e);var i=r.getDimensionInfo(n);return i||ao(e),{dimIdx:i.index}},getValue:function(t){return r.retrieveValueFromItem(e,t.dimIdx)}},new $F(n,i)),a=[],s=0,l=r.count();s<l;s++)e=r.getRawDataItem(s),o.evaluate()&&a.push(e);return{data:a}}};var QF={type:"echarts:sort",transform:function(t){var e=t.upstream,n=t.config,i="",r=ho(n);r.length||ao(i);var o=[];E(r,(function(t){var n=t.dimension,r=t.order,a=t.parser,s=t.incomparable;if(null==n&&ao(i),"asc"!==r&&"desc"!==r&&ao(i),s&&"min"!==s&&"max"!==s){var l="";0,ao(l)}if("asc"!==r&&"desc"!==r){var u="";0,ao(u)}var h=e.getDimensionInfo(n);h||ao(i);var c=a?ff(a):null;a&&!c&&ao(i),o.push({dimIdx:h.index,parser:c,comparator:new vf(r,s)})}));var a=e.sourceFormat;a!==Lp&&a!==Pp&&ao(i);for(var s=[],l=0,u=e.count();l<u;l++)s.push(e.getRawDataItem(l));return s.sort((function(t,n){for(var i=0;i<o.length;i++){var r=o[i],a=e.retrieveValueFromItem(t,r.dimIdx),s=e.retrieveValueFromItem(n,r.dimIdx);r.parser&&(a=r.parser(a),s=r.parser(s));var l=r.comparator.evaluate(a,s);if(0!==l)return l}return 0})),{data:s}}};var tG=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="dataset",e}return n(e,t),e.prototype.init=function(e,n,i){t.prototype.init.call(this,e,n,i),this._sourceManager=new Vf(this),Bf(this)},e.prototype.mergeOption=function(e,n){t.prototype.mergeOption.call(this,e,n),Bf(this)},e.prototype.optionUpdated=function(){this._sourceManager.dirty()},e.prototype.getSourceManager=function(){return this._sourceManager},e.type="dataset",e.defaultOption={seriesLayoutBy:Ep},e}(Ip),eG=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="dataset",e}return n(e,t),e.type="dataset",e}(fg);var nG=ja.CMD;function iG(t,e){return Math.abs(t-e)<1e-5}function rG(t){var e,n,i,r,o,a=t.data,s=t.len(),l=[],u=0,h=0,c=0,p=0;function d(t,n){e&&e.length>2&&l.push(e),e=[t,n]}function f(t,n,i,r){iG(t,i)&&iG(n,r)||e.push(t,n,i,r,i,r)}function g(t,n,i,r,o,a){var s=Math.abs(n-t),l=4*Math.tan(s/4)/3,u=n<t?-1:1,h=Math.cos(t),c=Math.sin(t),p=Math.cos(n),d=Math.sin(n),f=h*o+i,g=c*a+r,y=p*o+i,v=d*a+r,m=o*l*u,x=a*l*u;e.push(f-m*c,g+x*h,y+m*d,v-x*p,y,v)}for(var y=0;y<s;){var v=a[y++],m=1===y;switch(m&&(c=u=a[y],p=h=a[y+1],v!==nG.L&&v!==nG.C&&v!==nG.Q||(e=[c,p])),v){case nG.M:u=c=a[y++],h=p=a[y++],d(c,p);break;case nG.L:f(u,h,n=a[y++],i=a[y++]),u=n,h=i;break;case nG.C:e.push(a[y++],a[y++],a[y++],a[y++],u=a[y++],h=a[y++]);break;case nG.Q:n=a[y++],i=a[y++],r=a[y++],o=a[y++],e.push(u+2/3*(n-u),h+2/3*(i-h),r+2/3*(n-r),o+2/3*(i-o),r,o),u=r,h=o;break;case nG.A:var x=a[y++],_=a[y++],b=a[y++],w=a[y++],S=a[y++],M=a[y++]+S;y+=1;var I=!a[y++];n=Math.cos(S)*b+x,i=Math.sin(S)*w+_,m?d(c=n,p=i):f(u,h,n,i),u=Math.cos(M)*b+x,h=Math.sin(M)*w+_;for(var T=(I?-1:1)*Math.PI/2,C=S;I?C>M:C<M;C+=T){g(C,I?Math.max(C+T,M):Math.min(C+T,M),x,_,b,w)}break;case nG.R:c=u=a[y++],p=h=a[y++],n=c+a[y++],i=p+a[y++],d(n,p),f(n,p,n,i),f(n,i,c,i),f(c,i,c,p),f(c,p,n,p);break;case nG.Z:e&&f(u,h,c,p),u=c,h=p}}return e&&e.length>2&&l.push(e),l}function oG(t,e,n,i,r,o,a,s,l,u){if(iG(t,n)&&iG(e,i)&&iG(r,a)&&iG(o,s))l.push(a,s);else{var h=2/u,c=h*h,p=a-t,d=s-e,f=Math.sqrt(p*p+d*d);p/=f,d/=f;var g=n-t,y=i-e,v=r-a,m=o-s,x=g*g+y*y,_=v*v+m*m;if(x<c&&_<c)l.push(a,s);else{var b=p*g+d*y,w=-p*v-d*m;if(x-b*b<c&&b>=0&&_-w*w<c&&w>=0)l.push(a,s);else{var S=[],M=[];Ze(t,n,r,a,.5,S),Ze(e,i,o,s,.5,M),oG(S[0],M[0],S[1],M[1],S[2],M[2],S[3],M[3],l,u),oG(S[4],M[4],S[5],M[5],S[6],M[6],S[7],M[7],l,u)}}}}function aG(t,e,n){var i=t[e],r=t[1-e],o=Math.abs(i/r),a=Math.ceil(Math.sqrt(o*n)),s=Math.floor(n/a);0===s&&(s=1,a=n);for(var l=[],u=0;u<a;u++)l.push(s);var h=n-a*s;if(h>0)for(u=0;u<h;u++)l[u%a]+=1;return l}function sG(t,e,n){for(var i=t.r0,r=t.r,o=t.startAngle,a=t.endAngle,s=Math.abs(a-o),l=s*r,u=r-i,h=l>Math.abs(u),c=aG([l,u],h?0:1,e),p=(h?s:u)/c.length,d=0;d<c.length;d++)for(var f=(h?u:s)/c[d],g=0;g<c[d];g++){var y={};h?(y.startAngle=o+p*d,y.endAngle=o+p*(d+1),y.r0=i+f*g,y.r=i+f*(g+1)):(y.startAngle=o+f*g,y.endAngle=o+f*(g+1),y.r0=i+p*d,y.r=i+p*(d+1)),y.clockwise=t.clockwise,y.cx=t.cx,y.cy=t.cy,n.push(y)}}function lG(t,e,n,i){return t*i-n*e}function uG(t,e,n,i,r,o,a,s){var l=n-t,u=i-e,h=a-r,c=s-o,p=lG(h,c,l,u);if(Math.abs(p)<1e-6)return null;var d=lG(t-r,e-o,h,c)/p;return d<0||d>1?null:new Ji(d*l+t,d*u+e)}function hG(t,e,n){var i=new Ji;Ji.sub(i,n,e),i.normalize();var r=new Ji;return Ji.sub(r,t,e),r.dot(i)}function cG(t,e){var n=t[t.length-1];n&&n[0]===e[0]&&n[1]===e[1]||t.push(e)}function pG(t){var e=t.points,n=[],i=[];Ma(e,n,i);var r=new sr(n[0],n[1],i[0]-n[0],i[1]-n[1]),o=r.width,a=r.height,s=r.x,l=r.y,u=new Ji,h=new Ji;return o>a?(u.x=h.x=s+o/2,u.y=l,h.y=l+a):(u.y=h.y=l+a/2,u.x=s,h.x=s+o),function(t,e,n){for(var i=t.length,r=[],o=0;o<i;o++){var a=t[o],s=t[(o+1)%i],l=uG(a[0],a[1],s[0],s[1],e.x,e.y,n.x,n.y);l&&r.push({projPt:hG(l,e,n),pt:l,idx:o})}if(r.length<2)return[{points:t},{points:t}];r.sort((function(t,e){return t.projPt-e.projPt}));var u=r[0],h=r[r.length-1];if(h.idx<u.idx){var c=u;u=h,h=c}var p=[u.pt.x,u.pt.y],d=[h.pt.x,h.pt.y],f=[p],g=[d];for(o=u.idx+1;o<=h.idx;o++)cG(f,t[o].slice());for(cG(f,d),cG(f,p),o=h.idx+1;o<=u.idx+i;o++)cG(g,t[o%i].slice());return cG(g,p),cG(g,d),[{points:f},{points:g}]}(e,u,h)}function dG(t,e,n,i){if(1===n)i.push(e);else{var r=Math.floor(n/2),o=t(e);dG(t,o[0],r,i),dG(t,o[1],n-r,i)}return i}function fG(t,e){e.setStyle(t.style),e.z=t.z,e.z2=t.z2,e.zlevel=t.zlevel}function gG(t,e){var n,i=[],r=t.shape;switch(t.type){case"rect":!function(t,e,n){for(var i=t.width,r=t.height,o=i>r,a=aG([i,r],o?0:1,e),s=o?"width":"height",l=o?"height":"width",u=o?"x":"y",h=o?"y":"x",c=t[s]/a.length,p=0;p<a.length;p++)for(var d=t[l]/a[p],f=0;f<a[p];f++){var g={};g[u]=p*c,g[h]=f*d,g[s]=c,g[l]=d,g.x+=t.x,g.y+=t.y,n.push(g)}}(r,e,i),n=Ts;break;case"sector":sG(r,e,i),n=Tu;break;case"circle":sG({r0:0,r:r.r,startAngle:0,endAngle:2*Math.PI,cx:r.cx,cy:r.cy},e,i),n=Tu;break;default:var o=t.getComputedTransform(),a=o?Math.sqrt(Math.max(o[0]*o[0]+o[1]*o[1],o[2]*o[2]+o[3]*o[3])):1,s=z(function(t,e){var n=rG(t),i=[];e=e||1;for(var r=0;r<n.length;r++){var o=n[r],a=[],s=o[0],l=o[1];a.push(s,l);for(var u=2;u<o.length;){var h=o[u++],c=o[u++],p=o[u++],d=o[u++],f=o[u++],g=o[u++];oG(s,l,h,c,p,d,f,g,a,e),s=f,l=g}i.push(a)}return i}(t.getUpdatedPathProxy(),a),(function(t){return function(t){for(var e=[],n=0;n<t.length;)e.push([t[n++],t[n++]]);return e}(t)})),l=s.length;if(0===l)dG(pG,{points:s[0]},e,i);else if(l===e)for(var u=0;u<l;u++)i.push({points:s[u]});else{var h=0,c=z(s,(function(t){var e=[],n=[];Ma(t,e,n);var i=(n[1]-e[1])*(n[0]-e[0]);return h+=i,{poly:t,area:i}}));c.sort((function(t,e){return e.area-t.area}));var p=e;for(u=0;u<l;u++){var d=c[u];if(p<=0)break;var f=u===l-1?p:Math.ceil(d.area/h*e);f<0||(dG(pG,{points:d.poly},f,i),p-=f)}}n=Lu}if(!n)return function(t,e){for(var n=[],i=0;i<e;i++)n.push(su(t));return n}(t,e);var g=[];for(u=0;u<i.length;u++){var y=new n;y.setShape(i[u]),fG(t,y),g.push(y)}return g}function yG(t,e){var n=t.length,i=e.length;if(n===i)return[t,e];for(var r=[],o=[],a=n<i?t:e,s=Math.min(n,i),l=Math.abs(i-n)/6,u=(s-2)/6,h=Math.ceil(l/u)+1,c=[a[0],a[1]],p=l,d=2;d<s;){var f=a[d-2],g=a[d-1],y=a[d++],v=a[d++],m=a[d++],x=a[d++],_=a[d++],b=a[d++];if(p<=0)c.push(y,v,m,x,_,b);else{for(var w=Math.min(p,h-1)+1,S=1;S<=w;S++){var M=S/w;Ze(f,y,m,_,M,r),Ze(g,v,x,b,M,o),f=r[3],g=o[3],c.push(r[1],o[1],r[2],o[2],f,g),y=r[5],v=o[5],m=r[6],x=o[6]}p-=w-1}}return a===t?[c,e]:[t,c]}function vG(t,e){for(var n=t.length,i=t[n-2],r=t[n-1],o=[],a=0;a<e.length;)o[a++]=i,o[a++]=r;return o}function mG(t){for(var e=0,n=0,i=0,r=t.length,o=0,a=r-2;o<r;a=o,o+=2){var s=t[a],l=t[a+1],u=t[o],h=t[o+1],c=s*h-u*l;e+=c,n+=(s+u)*c,i+=(l+h)*c}return 0===e?[t[0]||0,t[1]||0]:[n/e/3,i/e/3,e]}function xG(t,e,n,i){for(var r=(t.length-2)/6,o=1/0,a=0,s=t.length,l=s-2,u=0;u<r;u++){for(var h=6*u,c=0,p=0;p<s;p+=2){var d=0===p?h:(h+p-2)%l+2,f=t[d]-n[0],g=t[d+1]-n[1],y=e[p]-i[0]-f,v=e[p+1]-i[1]-g;c+=y*y+v*v}c<o&&(o=c,a=u)}return a}function _G(t){for(var e=[],n=t.length,i=0;i<n;i+=2)e[i]=t[n-i-2],e[i+1]=t[n-i-1];return e}function bG(t){return t.__isCombineMorphing}var wG="__mOriginal_";function SG(t,e,n){var i=wG+e,r=t[i]||t[e];t[i]||(t[i]=t[e]);var o=n.replace,a=n.after,s=n.before;t[e]=function(){var t,e=arguments;return s&&s.apply(this,e),t=o?o.apply(this,e):r.apply(this,e),a&&a.apply(this,e),t}}function MG(t,e){var n=wG+e;t[n]&&(t[e]=t[n],t[n]=null)}function IG(t,e){for(var n=0;n<t.length;n++)for(var i=t[n],r=0;r<i.length;){var o=i[r],a=i[r+1];i[r++]=e[0]*o+e[2]*a+e[4],i[r++]=e[1]*o+e[3]*a+e[5]}}function TG(t,e){var n=t.getUpdatedPathProxy(),i=e.getUpdatedPathProxy(),r=function(t,e){for(var n,i,r,o=[],a=[],s=0;s<Math.max(t.length,e.length);s++){var l=t[s],u=e[s],h=void 0,c=void 0;l?u?(i=h=(n=yG(l,u))[0],r=c=n[1]):(c=vG(r||l,l),h=l):(h=vG(i||u,u),c=u),o.push(h),a.push(c)}return[o,a]}(rG(n),rG(i)),o=r[0],a=r[1],s=t.getComputedTransform(),l=e.getComputedTransform();s&&IG(o,s),l&&IG(a,l),SG(e,"updateTransform",{replace:function(){this.transform=null}}),e.transform=null;var u=function(t,e,n,i){for(var r,o=[],a=0;a<t.length;a++){var s=t[a],l=e[a],u=mG(s),h=mG(l);null==r&&(r=u[2]<0!=h[2]<0);var c=[],p=[],d=0,f=1/0,g=[],y=s.length;r&&(s=_G(s));for(var v=6*xG(s,l,u,h),m=y-2,x=0;x<m;x+=2){var _=(v+x)%m+2;c[x+2]=s[_]-u[0],c[x+3]=s[_+1]-u[1]}if(c[0]=s[v]-u[0],c[1]=s[v+1]-u[1],n>0)for(var b=i/n,w=-i/2;w<=i/2;w+=b){var S=Math.sin(w),M=Math.cos(w),I=0;for(x=0;x<s.length;x+=2){var T=c[x],C=c[x+1],D=l[x]-h[0],A=l[x+1]-h[1],k=D*M-A*S,L=D*S+A*M;g[x]=k,g[x+1]=L;var P=k-T,O=L-C;I+=P*P+O*O}if(I<f){f=I,d=w;for(var R=0;R<g.length;R++)p[R]=g[R]}}else for(var N=0;N<y;N+=2)p[N]=l[N]-h[0],p[N+1]=l[N+1]-h[1];o.push({from:c,to:p,fromCp:u,toCp:h,rotation:-d})}return o}(o,a,10,Math.PI),h=[];SG(e,"buildPath",{replace:function(t){for(var n=e.__morphT,i=1-n,r=[],o=0;o<u.length;o++){var a=u[o],s=a.from,l=a.to,c=a.rotation*n,p=a.fromCp,d=a.toCp,f=Math.sin(c),g=Math.cos(c);Bt(r,p,d,n);for(var y=0;y<s.length;y+=2){var v=s[y],m=s[y+1],x=v*i+(S=l[y])*n,_=m*i+(M=l[y+1])*n;h[y]=x*g-_*f+r[0],h[y+1]=x*f+_*g+r[1]}var b=h[0],w=h[1];t.moveTo(b,w);for(y=2;y<s.length;){var S=h[y++],M=h[y++],I=h[y++],T=h[y++],C=h[y++],D=h[y++];b===S&&w===M&&I===C&&T===D?t.lineTo(C,D):t.bezierCurveTo(S,M,I,T,C,D),b=C,w=D}}}})}function CG(t,e,n){if(!t||!e)return e;var i=n.done,r=n.during;return TG(t,e),e.__morphT=0,e.animateTo({__morphT:1},k({during:function(t){e.dirtyShape(),r&&r(t)},done:function(){MG(e,"buildPath"),MG(e,"updateTransform"),e.__morphT=-1,e.createPathProxy(),e.dirtyShape(),i&&i()}},n)),e}function DG(t,e,n,i,r,o){t=r===n?0:Math.round(32767*(t-n)/(r-n)),e=o===i?0:Math.round(32767*(e-i)/(o-i));for(var a,s=0,l=32768;l>0;l/=2){var u=0,h=0;(t&l)>0&&(u=1),(e&l)>0&&(h=1),s+=l*l*(3*u^h),0===h&&(1===u&&(t=l-1-t,e=l-1-e),a=t,t=e,e=a)}return s}function AG(t){var e=1/0,n=1/0,i=-1/0,r=-1/0,o=z(t,(function(t){var o=t.getBoundingRect(),a=t.getComputedTransform(),s=o.x+o.width/2+(a?a[4]:0),l=o.y+o.height/2+(a?a[5]:0);return e=Math.min(s,e),n=Math.min(l,n),i=Math.max(s,i),r=Math.max(l,r),[s,l]}));return z(o,(function(o,a){return{cp:o,z:DG(o[0],o[1],e,n,i,r),path:t[a]}})).sort((function(t,e){return t.z-e.z})).map((function(t){return t.path}))}function kG(t){return gG(t.path,t.count)}function LG(t){return Y(t[0])}function PG(t,e){for(var n=[],i=t.length,r=0;r<i;r++)n.push({one:t[r],many:[]});for(r=0;r<e.length;r++){var o=e[r].length,a=void 0;for(a=0;a<o;a++)n[a%i].many.push(e[r][a])}var s=0;for(r=i-1;r>=0;r--)if(!n[r].many.length){var l=n[s].many;if(l.length<=1){if(!s)return n;s=0}o=l.length;var u=Math.ceil(o/2);n[r].many=l.slice(u,o),n[s].many=l.slice(0,u),s++}return n}var OG={clone:function(t){for(var e=[],n=1-Math.pow(1-t.path.style.opacity,1/t.count),i=0;i<t.count;i++){var r=su(t.path);r.setStyle("opacity",n),e.push(r)}return e},split:null};function RG(t,e,n,i,r,o){if(t.length&&e.length){var a=eh("update",i,r);if(a&&a.duration>0){var s,l,u=i.getModel("universalTransition").get("delay"),h=Object.assign({setToFinal:!0},a);LG(t)&&(s=t,l=e),LG(e)&&(s=e,l=t);for(var c=s?s===t:t.length>e.length,p=s?PG(l,s):PG(c?e:t,[c?t:e]),d=0,f=0;f<p.length;f++)d+=p[f].many.length;var g=0;for(f=0;f<p.length;f++)y(p[f],c,g,d),g+=p[f].many.length}}function y(t,e,i,r,a){var s=t.many,l=t.one;if(1!==s.length||a)for(var c=k({dividePath:OG[n],individualDelay:u&&function(t,e,n,o){return u(t+i,r)}},h),p=e?function(t,e,n){var i=[];!function t(e){for(var n=0;n<e.length;n++){var r=e[n];bG(r)?t(r.childrenRef()):r instanceof fs&&i.push(r)}}(t);var r=i.length;if(!r)return{fromIndividuals:[],toIndividuals:[],count:0};var o=(n.dividePath||kG)({path:e,count:r});if(o.length!==r)return console.error("Invalid morphing: unmatched splitted path"),{fromIndividuals:[],toIndividuals:[],count:0};i=AG(i),o=AG(o);for(var a=n.done,s=n.during,l=n.individualDelay,u=new qi,h=0;h<r;h++){var c=i[h],p=o[h];p.parent=e,p.copyTransform(u),l||TG(c,p)}function d(t){for(var e=0;e<o.length;e++)o[e].addSelfToZr(t)}function f(){e.__isCombineMorphing=!1,e.__morphT=-1,e.childrenRef=null,MG(e,"addSelfToZr"),MG(e,"removeSelfFromZr")}e.__isCombineMorphing=!0,e.childrenRef=function(){return o},SG(e,"addSelfToZr",{after:function(t){d(t)}}),SG(e,"removeSelfFromZr",{after:function(t){for(var e=0;e<o.length;e++)o[e].removeSelfFromZr(t)}});var g=o.length;if(l){var y=g,v=function(){0==--y&&(f(),a&&a())};for(h=0;h<g;h++){var m=l?k({delay:(n.delay||0)+l(h,g,i[h],o[h]),done:v},n):n;CG(i[h],o[h],m)}}else e.__morphT=0,e.animateTo({__morphT:1},k({during:function(t){for(var n=0;n<g;n++){var i=o[n];i.__morphT=e.__morphT,i.dirtyShape()}s&&s(t)},done:function(){f();for(var e=0;e<t.length;e++)MG(t[e],"updateTransform");a&&a()}},n));return e.__zr&&d(e.__zr),{fromIndividuals:i,toIndividuals:o,count:g}}(s,l,c):function(t,e,n){var i=e.length,r=[],o=n.dividePath||kG;if(bG(t)){!function t(e){for(var n=0;n<e.length;n++){var i=e[n];bG(i)?t(i.childrenRef()):i instanceof fs&&r.push(i)}}(t.childrenRef());var a=r.length;if(a<i)for(var s=0,l=a;l<i;l++)r.push(su(r[s++%a]));r.length=i}else{r=o({path:t,count:i});var u=t.getComputedTransform();for(l=0;l<r.length;l++)r[l].setLocalTransform(u);if(r.length!==i)return console.error("Invalid morphing: unmatched splitted path"),{fromIndividuals:[],toIndividuals:[],count:0}}r=AG(r),e=AG(e);var h=n.individualDelay;for(l=0;l<i;l++){var c=h?k({delay:(n.delay||0)+h(l,i,r[l],e[l])},n):n;CG(r[l],e[l],c)}return{fromIndividuals:r,toIndividuals:e,count:e.length}}(l,s,c),d=p.fromIndividuals,f=p.toIndividuals,g=d.length,v=0;v<g;v++){m=u?k({delay:u(v,g)},h):h;o(d[v],f[v],e?s[v]:t.one,e?t.one:s[v],m)}else{var m,x=e?s[0]:l,_=e?l:s[0];if(bG(x))y({many:[x],one:_},!0,i,r,!0);else CG(x,_,m=u?k({delay:u(i,r)},h):h),o(x,_,x,_,m)}}}function NG(t){if(!t)return[];if(Y(t)){for(var e=[],n=0;n<t.length;n++)e.push(NG(t[n]));return e}var i=[];return t.traverse((function(t){t instanceof fs&&!t.disableMorphing&&!t.invisible&&!t.ignore&&i.push(t)})),i}var EG=So();function zG(t){var e=[];return E(t,(function(t){var n=t.data;if(!(n.count()>1e4))for(var i=n.getIndices(),r=function(t){for(var e=t.dimensions,n=0;n<e.length;n++){var i=t.getDimensionInfo(e[n]);if(i&&0===i.otherDims.itemGroupId)return e[n]}}(n),o=0;o<i.length;o++)e.push({data:n,dim:t.dim||r,divide:t.divide,dataIndex:o})})),e}function VG(t,e,n){t.traverse((function(t){t instanceof fs&&rh(t,{style:{opacity:0}},e,{dataIndex:n,isFrom:!0})}))}function BG(t){if(t.parent){var e=t.getComputedTransform();t.setLocalTransform(e),t.parent.remove(t)}}function FG(t){t.stopAnimation(),t.isGroup&&t.traverse((function(t){t.stopAnimation()}))}function GG(t,e,n){var i=eh("update",n,e);i&&t.traverse((function(t){if(t instanceof da){var e=function(t){return th(t).oldStyle}(t);e&&t.animateFrom({style:e},i)}}))}function WG(t,e,n){var i=zG(t),r=zG(e);function o(t,e,n,i,r){(n||t)&&e.animateFrom({style:n&&n!==t?A(A({},n.style),t.style):t.style},r)}function a(t){for(var e=0;e<t.length;e++)if(t[e].dim)return t[e].dim}var s=a(i),l=a(r),u=!1;function h(t,e){return function(n){var i=n.data,r=n.dataIndex;if(e)return i.getId(r);var o=i.hostModel&&i.hostModel.get("dataGroupId"),a=t?s||l:l||s,u=a&&i.getDimensionInfo(a),h=u&&u.ordinalMeta;if(u){var c=i.get(u.name,r);return h&&h.categories[c]||c+""}var p=i.getRawDataItem(r);return p&&p.groupId?p.groupId+"":o||i.getId(r)}}var c=function(t,e){var n=t.length;if(n!==e.length)return!1;for(var i=0;i<n;i++){var r=t[i],o=e[i];if(r.data.getId(r.dataIndex)!==o.data.getId(o.dataIndex))return!1}return!0}(i,r),p={};if(!c)for(var d=0;d<r.length;d++){var f=r[d],g=f.data.getItemGraphicEl(f.dataIndex);g&&(p[g.id]=!0)}function y(t,e){var n=i[e],a=r[t],s=a.data.hostModel,l=n.data.getItemGraphicEl(n.dataIndex),h=a.data.getItemGraphicEl(a.dataIndex);l!==h?l&&p[l.id]||h&&(FG(h),l?(FG(l),BG(l),u=!0,RG(NG(l),NG(h),a.divide,s,t,o)):VG(h,s,t)):h&&GG(h,a.dataIndex,s)}new Sm(i,r,h(!0,c),h(!1,c),null,"multiple").update(y).updateManyToOne((function(t,e){var n=r[t],a=n.data,s=a.hostModel,l=a.getItemGraphicEl(n.dataIndex),h=B(z(e,(function(t){return i[t].data.getItemGraphicEl(i[t].dataIndex)})),(function(t){return t&&t!==l&&!p[t.id]}));l&&(FG(l),h.length?(E(h,(function(t){FG(t),BG(t)})),u=!0,RG(NG(h),NG(l),n.divide,s,t,o)):VG(l,s,n.dataIndex))})).updateOneToMany((function(t,e){var n=i[e],a=n.data.getItemGraphicEl(n.dataIndex);if(!a||!p[a.id]){var s=B(z(t,(function(t){return r[t].data.getItemGraphicEl(r[t].dataIndex)})),(function(t){return t&&t!==a})),l=r[t[0]].data.hostModel;s.length&&(E(s,(function(t){return FG(t)})),a?(FG(a),BG(a),u=!0,RG(NG(a),NG(s),n.divide,l,t[0],o)):E(s,(function(e){return VG(e,l,t[0])})))}})).updateManyToMany((function(t,e){new Sm(e,t,(function(t){return i[t].data.getId(i[t].dataIndex)}),(function(t){return r[t].data.getId(r[t].dataIndex)})).update((function(n,i){y(t[n],e[i])})).execute()})).execute(),u&&E(e,(function(t){var e=t.data.hostModel,i=e&&n.getViewOfSeriesModel(e),r=eh("update",e,0);i&&e.isAnimationEnabled()&&r&&r.duration>0&&i.group.traverse((function(t){t instanceof fs&&!t.animators.length&&t.animateFrom({style:{opacity:0}},r)}))}))}function HG(t){var e=t.getModel("universalTransition").get("seriesKey");return e||t.id}function YG(t){return Y(t)?t.sort().join(","):t}function UG(t){if(t.hostModel)return t.hostModel.getModel("universalTransition").get("divideShape")}function XG(t,e){for(var n=0;n<t.length;n++){if(null!=e.seriesIndex&&e.seriesIndex===t[n].seriesIndex||null!=e.seriesId&&e.seriesId===t[n].id)return n}}_m([function(t){t.registerPainter("canvas",Vw)}]),_m([function(t){t.registerPainter("svg",Lw)}]),_m([function(t){t.registerChartView(mS),t.registerSeriesModel(Bw),t.registerLayout(xS("line",!0)),t.registerVisual({seriesType:"line",reset:function(t){var e=t.getData(),n=t.getModel("lineStyle").getLineStyle();n&&!n.stroke&&(n.stroke=e.getVisual("style").fill),e.setVisual("legendLineStyle",n)}}),t.registerProcessor(t.PRIORITY.PROCESSOR.STATISTIC,wS("line"))},function(t){t.registerChartView(LS),t.registerSeriesModel(MS),t.registerLayout(t.PRIORITY.VISUAL.LAYOUT,H(Dx,"bar")),t.registerLayout(t.PRIORITY.VISUAL.PROGRESSIVE_LAYOUT,Ax("bar")),t.registerProcessor(t.PRIORITY.PROCESSOR.STATISTIC,wS("bar")),t.registerAction({type:"changeAxisOrder",event:"changeAxisOrder",update:"update"},(function(t,e){var n=t.componentType||"series";e.eachComponent({mainType:n,query:t},(function(e){t.sortInfo&&e.axis.setCategorySortInfo(t.sortInfo)}))}))},function(t){t.registerChartView(aM),t.registerSeriesModel(uM),yy("pie",t.registerAction),t.registerLayout(H($S,"pie")),t.registerProcessor(JS("pie")),t.registerProcessor(function(t){return{seriesType:t,reset:function(t,e){var n=t.getData();n.filterSelf((function(t){var e=n.mapDimension("value"),i=n.get(e,t);return!(j(i)&&!isNaN(i)&&i<0)}))}}}("pie"))},function(t){_m(hI),t.registerSeriesModel(hM),t.registerChartView(fM),t.registerLayout(xS("scatter"))},function(t){_m(MI),t.registerChartView(gI),t.registerSeriesModel(yI),t.registerLayout(cI),t.registerProcessor(JS("radar")),t.registerPreprocessor(fI)},function(t){_m(JT),t.registerChartView(RT),t.registerSeriesModel(NT),t.registerLayout(zT),t.registerProcessor(t.PRIORITY.PROCESSOR.STATISTIC,ET),yy("map",t.registerAction)},function(t){t.registerChartView(hC),t.registerSeriesModel(PC),t.registerLayout(RC),t.registerVisual(NC),function(t){t.registerAction({type:"treeExpandAndCollapse",event:"treeExpandAndCollapse",update:"update"},(function(t,e){e.eachComponent({mainType:"series",subType:"tree",query:t},(function(e){var n=t.dataIndex,i=e.getData().tree.getNodeByDataIndex(n);i.isExpand=!i.isExpand}))})),t.registerAction({type:"treeRoam",event:"treeRoam",update:"none"},(function(t,e){e.eachComponent({mainType:"series",subType:"tree",query:t},(function(e){var n=qT(e.coordinateSystem,t);e.setCenter&&e.setCenter(n.center),e.setZoom&&e.setZoom(n.zoom)}))}))}(t)},function(t){t.registerSeriesModel(VC),t.registerChartView($C),t.registerVisual(fD),t.registerLayout(CD),function(t){for(var e=0;e<EC.length;e++)t.registerAction({type:EC[e],update:"updateView"},xt);t.registerAction({type:"treemapRootToNode",update:"updateView"},(function(t,e){e.eachComponent({mainType:"series",subType:"treemap",query:t},(function(e,n){var i=DC(t,["treemapZoomToNode","treemapRootToNode"],e);if(i){var r=e.getViewRoot();r&&(t.direction=kC(r,i.node)?"rollUp":"drillDown"),e.resetViewRoot(i.node)}}))}))}(t)},function(t){t.registerChartView(TA),t.registerSeriesModel(OA),t.registerProcessor(OD),t.registerVisual(RD),t.registerVisual(ED),t.registerLayout(XD),t.registerLayout(t.PRIORITY.VISUAL.POST_CHART_LAYOUT,QD),t.registerLayout(eA),t.registerCoordinateSystem("graphView",{dimensions:BT.dimensions,create:nA}),t.registerAction({type:"focusNodeAdjacency",event:"focusNodeAdjacency",update:"series:focusNodeAdjacency"},xt),t.registerAction({type:"unfocusNodeAdjacency",event:"unfocusNodeAdjacency",update:"series:unfocusNodeAdjacency"},xt),t.registerAction(RA,(function(t,e){e.eachComponent({mainType:"series",query:t},(function(e){var n=qT(e.coordinateSystem,t);e.setCenter&&e.setCenter(n.center),e.setZoom&&e.setZoom(n.zoom)}))}))},function(t){t.registerChartView(BA),t.registerSeriesModel(FA)},function(t){t.registerChartView(HA),t.registerSeriesModel(YA),t.registerLayout(UA),t.registerProcessor(JS("funnel"))},function(t){_m(vL),t.registerChartView(XA),t.registerSeriesModel($A),t.registerVisual(t.PRIORITY.VISUAL.BRUSH,tk)},function(t){t.registerChartView(_L),t.registerSeriesModel(bL),t.registerLayout(wL),t.registerVisual(RL),t.registerAction({type:"dragNode",event:"dragnode",update:"update"},(function(t,e){e.eachComponent({mainType:"series",subType:"sankey",query:t},(function(e){e.setNodePosition(t.dataIndex,[t.localX,t.localY])}))}))},function(t){t.registerSeriesModel(EL),t.registerChartView(zL),t.registerVisual(HL),t.registerLayout(UL),t.registerTransform(XL)},function(t){t.registerChartView(jL),t.registerSeriesModel(oP),t.registerPreprocessor(aP),t.registerVisual(cP),t.registerLayout(pP)},function(t){t.registerChartView(yP),t.registerSeriesModel(vP),t.registerLayout(xS("effectScatter"))},function(t){t.registerChartView(IP),t.registerSeriesModel(AP),t.registerLayout(MP),t.registerVisual(LP)},function(t){t.registerChartView(RP),t.registerSeriesModel(NP)},function(t){t.registerChartView(BP),t.registerSeriesModel(iO),t.registerLayout(t.PRIORITY.VISUAL.LAYOUT,H(Dx,"pictorialBar")),t.registerLayout(t.PRIORITY.VISUAL.PROGRESSIVE_LAYOUT,Ax("pictorialBar"))},function(t){t.registerChartView(rO),t.registerSeriesModel(oO),t.registerLayout(aO),t.registerProcessor(JS("themeRiver"))},function(t){t.registerChartView(cO),t.registerSeriesModel(pO),t.registerLayout(H(gO,"sunburst")),t.registerProcessor(H(JS,"sunburst")),t.registerVisual(vO),function(t){t.registerAction({type:uO,update:"updateView"},(function(t,e){e.eachComponent({mainType:"series",subType:"sunburst",query:t},(function(e,n){var i=DC(t,[uO],e);if(i){var r=e.getViewRoot();r&&(t.direction=kC(r,i.node)?"rollUp":"drillDown"),e.resetViewRoot(i.node)}}))})),t.registerAction({type:hO,update:"none"},(function(t,e,n){t=A({},t),e.eachComponent({mainType:"series",subType:"sunburst",query:t},(function(e){var n=DC(t,[hO],e);n&&(t.dataIndex=n.node.dataIndex)})),n.dispatchAction(A(t,{type:"highlight"}))})),t.registerAction({type:"sunburstUnhighlight",update:"updateView"},(function(t,e,n){t=A({},t),n.dispatchAction(A(t,{type:"downplay"}))}))}(t)},function(t){t.registerChartView(lR),t.registerSeriesModel(bO)}]),_m((function(t){_m(hI),_m(lN)})),_m((function(t){_m(lN),JM.registerAxisPointerClass("PolarAxisPointer",uN),t.registerCoordinateSystem("polar",SN),t.registerComponentModel(cN),t.registerComponentView(BN),wM(t,"angle",dN,zN),wM(t,"radius",fN,VN),t.registerComponentView(DN),t.registerComponentView(PN),t.registerLayout(H(EN,"bar"))})),_m(JT),_m((function(t){_m(lN),JM.registerAxisPointerClass("SingleAxisPointer",QN),t.registerComponentView(iE),t.registerComponentView(HN),t.registerComponentModel(UN),wM(t,"single",UN,UN.defaultOption),t.registerCoordinateSystem("single",KN)})),_m(vL),_m((function(t){t.registerComponentModel(rE),t.registerComponentView(aE),t.registerCoordinateSystem("calendar",lE)})),_m((function(t){t.registerComponentModel(fE),t.registerComponentView(vE),t.registerPreprocessor((function(t){var e=t.graphic;Y(e)?e[0]&&e[0].elements?t.graphic=[t.graphic[0]]:t.graphic=[{elements:e}]:e&&!e.elements&&(t.graphic=[{elements:[e]}])}))})),_m((function(t){t.registerComponentModel(YE),t.registerComponentView(XE),WE("saveAsImage",ZE),WE("magicType",KE),WE("dataView",iz),WE("dataZoom",Iz),WE("restore",lz),_m(BE)})),_m((function(t){_m(lN),t.registerComponentModel(Dz),t.registerComponentView(Uz),t.registerAction({type:"showTip",event:"showTip",update:"tooltip:manuallyShowTip"},xt),t.registerAction({type:"hideTip",event:"hideTip",update:"tooltip:manuallyHideTip"},xt)})),_m(lN),_m((function(t){t.registerComponentView(dV),t.registerComponentModel(fV),t.registerPreprocessor(Kz),t.registerVisual(t.PRIORITY.VISUAL.BRUSH,lV),t.registerAction({type:"brush",event:"brush",update:"updateVisual"},(function(t,e){e.eachComponent({mainType:"brush",query:t},(function(e){e.setAreas(t.areas)}))})),t.registerAction({type:"brushSelect",event:"brushSelected",update:"none"},xt),t.registerAction({type:"brushEnd",event:"brushEnd",update:"none"},xt),WE("brush",vV)})),_m((function(t){t.registerComponentModel(mV),t.registerComponentView(xV)})),_m((function(t){t.registerComponentModel(bV),t.registerComponentView(TV),t.registerSubTypeDefaulter("timeline",(function(){return"slider"})),function(t){t.registerAction({type:"timelineChange",event:"timelineChanged",update:"prepareAndUpdate"},(function(t,e,n){var i=e.getComponent("timeline");return i&&null!=t.currentIndex&&(i.setCurrentIndex(t.currentIndex),!i.get("loop",!0)&&i.isIndexMax()&&i.getPlayState()&&(i.setPlayState(!1),n.dispatchAction({type:"timelinePlayChange",playState:!1,from:t.from}))),e.resetOption("timeline",{replaceMerge:i.get("replaceMerge",!0)}),k({currentIndex:i.option.currentIndex},t)})),t.registerAction({type:"timelinePlayChange",event:"timelinePlayChanged",update:"update"},(function(t,e){var n=e.getComponent("timeline");n&&null!=t.playState&&n.setPlayState(t.playState)}))}(t),t.registerPreprocessor(AV)})),_m((function(t){t.registerComponentModel(EV),t.registerComponentView(ZV),t.registerPreprocessor((function(t){PV(t.series,"markPoint")&&(t.markPoint=t.markPoint||{})}))})),_m((function(t){t.registerComponentModel(jV),t.registerComponentView(eB),t.registerPreprocessor((function(t){PV(t.series,"markLine")&&(t.markLine=t.markLine||{})}))})),_m((function(t){t.registerComponentModel(nB),t.registerComponentView(hB),t.registerPreprocessor((function(t){PV(t.series,"markArea")&&(t.markArea=t.markArea||{})}))})),_m((function(t){_m(wB),_m(AB)})),_m((function(t){_m(GB),_m(KB)})),_m(GB),_m(KB),_m((function(t){_m(kF),_m(NF)})),_m(kF),_m(NF),_m((function(t){t.registerPreprocessor(FF),t.registerVisual(t.PRIORITY.VISUAL.ARIA,BF)})),_m((function(t){t.registerTransform(JF),t.registerTransform(QF)})),_m((function(t){t.registerComponentModel(tG),t.registerComponentView(eG)})),_m((function(t){t.registerUpdateLifecycle("series:beforeupdate",(function(t,e,n){E(ho(n.seriesTransition),(function(t){E(ho(t.to),(function(t){for(var e=n.updatedSeries,i=0;i<e.length;i++)(null!=t.seriesIndex&&t.seriesIndex===e[i].seriesIndex||null!=t.seriesId&&t.seriesId===e[i].id)&&(e[i].__universalTransitionEnabled=!0)}))}))})),t.registerUpdateLifecycle("series:transition",(function(t,e,n){var i=EG(e);if(i.oldSeries&&n.updatedSeries&&n.optionChanged){var r=n.seriesTransition;if(r)E(ho(r),(function(t){!function(t,e,n,i){var r=[],o=[];E(ho(t.from),(function(t){var n=XG(e.oldSeries,t);n>=0&&r.push({data:e.oldData[n],divide:UG(e.oldData[n]),dim:t.dimension})})),E(ho(t.to),(function(t){var e=XG(n.updatedSeries,t);if(e>=0){var i=n.updatedSeries[e].getData();o.push({data:i,divide:UG(i),dim:t.dimension})}})),r.length>0&&o.length>0&&WG(r,o,i)}(t,i,n,e)}));else{var o=function(t,e){var n=ft(),i=ft(),r=ft();return E(t.oldSeries,(function(e,n){var o=t.oldData[n],a=HG(e),s=YG(a);i.set(s,o),Y(a)&&E(a,(function(t){r.set(t,{data:o,key:s})}))})),E(e.updatedSeries,(function(t){if(t.isUniversalTransitionEnabled()&&t.isAnimationEnabled()){var e=t.getData(),o=HG(t),a=YG(o),s=i.get(a);if(s)n.set(a,{oldSeries:[{divide:UG(s),data:s}],newSeries:[{divide:UG(e),data:e}]});else if(Y(o)){var l=[];E(o,(function(t){var e=i.get(t);e&&l.push({divide:UG(e),data:e})})),l.length&&n.set(a,{oldSeries:l,newSeries:[{data:e,divide:UG(e)}]})}else{var u=r.get(o);if(u){var h=n.get(u.key);h||(h={oldSeries:[{data:u.data,divide:UG(u.data)}],newSeries:[]},n.set(u.key,h)),h.newSeries.push({data:e,divide:UG(e)})}}}})),n}(i,n);E(o.keys(),(function(t){var n=o.get(t);WG(n.oldSeries,n.newSeries,e)}))}E(n.updatedSeries,(function(t){t.__universalTransitionEnabled&&(t.__universalTransitionEnabled=!1)}))}for(var a=t.getSeries(),s=i.oldSeries=[],l=i.oldData=[],u=0;u<a.length;u++){var h=a[u].getData();h.count()<1e4&&(s.push(a[u]),l.push(h))}}))})),_m((function(t){t.registerUpdateLifecycle("series:beforeupdate",(function(t,e,n){var i=Tb(e).labelManager;i||(i=Tb(e).labelManager=new Ib),i.clearLabels()})),t.registerUpdateLifecycle("series:layoutlabels",(function(t,e,n){var i=Tb(e).labelManager;n.updatedSeries.forEach((function(t){i.addLabelsOfSeries(e.getViewOfSeriesModel(t))})),i.updateLayoutConfig(e),i.layout(e),i.processLabelsOverall()}))})),t.Axis=G_,t.ChartView=mg,t.ComponentModel=Ip,t.ComponentView=fg,t.List=Zm,t.Model=pc,t.PRIORITY=pv,t.SeriesModel=ag,t.color=Pn,t.connect=function(t){if(Y(t)){var e=t;t=null,E(e,(function(e){null!=e.group&&(t=e.group)})),t=t||"g_"+Jv++,E(e,(function(e){e.group=t}))}return Kv[t]=!0,t},t.dataTool={},t.dependencies={zrender:"5.3.0"},t.disConnect=tm,t.disconnect=em,t.dispose=function(t){X(t)?t=qv[t]:t instanceof Vv||(t=nm(t)),t instanceof Vv&&!t.isDisposed()&&t.dispose()},t.env=r,t.extendChartView=function(t){var e=mg.extend(t);return mg.registerClass(e),e},t.extendComponentModel=function(t){var e=Ip.extend(t);return Ip.registerClass(e),e},t.extendComponentView=function(t){var e=fg.extend(t);return fg.registerClass(e),e},t.extendSeriesModel=function(t){var e=ag.extend(t);return ag.registerClass(e),e},t.format=A_,t.getCoordinateSystemDimensions=function(t){var e=ud.get(t);if(e)return e.getDimensionsInfo?e.getDimensionsInfo():e.dimensions.slice()},t.getInstanceByDom=nm,t.getInstanceById=function(t){return qv[t]},t.getMap=function(t){var e=lv("getMap");return e&&e(t)},t.graphic=D_,t.helper=p_,t.init=function(t,e,n){var i=!(n&&n.ssr);if(i){0;var r=nm(t);if(r)return r;0}var o=new Vv(t,e,n);return o.id="ec_"+$v++,qv[o.id]=o,i&&ko(t,Qv,o.id),Ov(o),av.trigger("afterinit",o),o},t.innerDrawElementOnCanvas=$y,t.matrix=Gi,t.number=T_,t.parseGeoJSON=I_,t.parseGeoJson=I_,t.registerAction=um,t.registerCoordinateSystem=hm,t.registerLayout=cm,t.registerLoading=gm,t.registerLocale=wc,t.registerMap=ym,t.registerPostInit=am,t.registerPostUpdate=sm,t.registerPreprocessor=rm,t.registerProcessor=om,t.registerTheme=im,t.registerTransform=vm,t.registerUpdateLifecycle=lm,t.registerVisual=pm,t.setCanvasCreator=function(t){c({createCanvas:t})},t.setPlatformAPI=c,t.throttle=Cg,t.time=C_,t.use=_m,t.util=k_,t.vector=Ht,t.version="5.3.0",t.zrUtil=bt,t.zrender=Or,Object.defineProperty(t,"__esModule",{value:!0})}));
diff --git a/public/static/assets/third_party/fullcalendar/main.min.css b/public/static/assets/third_party/fullcalendar/main.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..84b713276e45d152564d87268d53da11b7f0f788
--- /dev/null
+++ b/public/static/assets/third_party/fullcalendar/main.min.css
@@ -0,0 +1 @@
+.fc-icon,.fc-unselectable{-moz-user-select:none;-ms-user-select:none}.fc .fc-button,.fc-icon{text-transform:none;font-weight:400}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc .fc-button:not(:disabled),.fc a[data-navlink],.fc-event.fc-event-draggable,.fc-event[href]{cursor:pointer}.fc-unselectable{-webkit-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}.fc{display:flex;flex-direction:column;font-size:1em}.fc .fc-button,.fc-icon{display:inline-block;text-align:center}.fc,.fc *,.fc :after,.fc :before{box-sizing:border-box}.fc table{border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{vertical-align:top;padding:0}.fc .fc-button,.fc .fc-button .fc-icon,.fc .fc-button-group,.fc .fc-timegrid-slot-label{vertical-align:middle}.fc a[data-navlink]:hover{text-decoration:underline}.fc .fc-button:hover,.fc .fc-list-event-title a,a.fc-event,a.fc-event:hover{text-decoration:none}.fc-direction-ltr{direction:ltr;text-align:left}.fc-direction-rtl{direction:rtl;text-align:right}.fc-theme-standard td,.fc-theme-standard th{border:1px solid #ddd;border:1px solid var(--fc-border-color,#ddd)}.fc-liquid-hack td,.fc-liquid-hack th{position:relative}@font-face{font-family:fcicons;src:url("data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBfAAAAC8AAAAYGNtYXAXVtKNAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZgYydxIAAAF4AAAFNGhlYWQUJ7cIAAAGrAAAADZoaGVhB20DzAAABuQAAAAkaG10eCIABhQAAAcIAAAALGxvY2ED4AU6AAAHNAAAABhtYXhwAA8AjAAAB0wAAAAgbmFtZXsr690AAAdsAAABhnBvc3QAAwAAAAAI9AAAACAAAwPAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpBgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Qb//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAWIAjQKeAskAEwAAJSc3NjQnJiIHAQYUFwEWMjc2NCcCnuLiDQ0MJAz/AA0NAQAMJAwNDcni4gwjDQwM/wANIwz/AA0NDCMNAAAAAQFiAI0CngLJABMAACUBNjQnASYiBwYUHwEHBhQXFjI3AZ4BAA0N/wAMJAwNDeLiDQ0MJAyNAQAMIw0BAAwMDSMM4uINIwwNDQAAAAIA4gC3Ax4CngATACcAACUnNzY0JyYiDwEGFB8BFjI3NjQnISc3NjQnJiIPAQYUHwEWMjc2NCcB87e3DQ0MIw3VDQ3VDSMMDQ0BK7e3DQ0MJAzVDQ3VDCQMDQ3zuLcMJAwNDdUNIwzWDAwNIwy4twwkDA0N1Q0jDNYMDA0jDAAAAgDiALcDHgKeABMAJwAAJTc2NC8BJiIHBhQfAQcGFBcWMjchNzY0LwEmIgcGFB8BBwYUFxYyNwJJ1Q0N1Q0jDA0Nt7cNDQwjDf7V1Q0N1QwkDA0Nt7cNDQwkDLfWDCMN1Q0NDCQMt7gMIw0MDNYMIw3VDQ0MJAy3uAwjDQwMAAADAFUAAAOrA1UAMwBoAHcAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMhMjY1NCYjISIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAAVYRGRkR/qoRGRkRA1UFBAUOCQkVDAsZDf2rDRkLDBUJCA4FBQUFBQUOCQgVDAsZDQJVDRkLDBUJCQ4FBAVVAgECBQMCBwQECAX9qwQJAwQHAwMFAQICAgIBBQMDBwQDCQQCVQUIBAQHAgMFAgEC/oAZEhEZGRESGQAAAAADAFUAAAOrA1UAMwBoAIkAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMzFRQWMzI2PQEzMjY1NCYrATU0JiMiBh0BIyIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAgBkSEhmAERkZEYAZEhIZgBEZGREDVQUEBQ4JCRUMCxkN/asNGQsMFQkIDgUFBQUFBQ4JCBUMCxkNAlUNGQsMFQkJDgUEBVUCAQIFAwIHBAQIBf2rBAkDBAcDAwUBAgICAgEFAwMHBAMJBAJVBQgEBAcCAwUCAQL+gIASGRkSgBkSERmAEhkZEoAZERIZAAABAOIAjQMeAskAIAAAExcHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQX4uLiDQ0MJAzi4gwkDA0N4uINDQwkDOLiDCQMDQ0CjeLiDSMMDQ3h4Q0NDCMN4uIMIw0MDOLiDAwNIwwAAAABAAAAAQAAa5n0y18PPPUACwQAAAAAANivOVsAAAAA2K85WwAAAAADqwNVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOrAAEAAAAAAAAAAAAAAAAAAAALBAAAAAAAAAAAAAAAAgAAAAQAAWIEAAFiBAAA4gQAAOIEAABVBAAAVQQAAOIAAAAAAAoAFAAeAEQAagCqAOoBngJkApoAAQAAAAsAigADAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGZjaWNvbnMAZgBjAGkAYwBvAG4Ac1ZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGZjaWNvbnMAZgBjAGkAYwBvAG4Ac2ZjaWNvbnMAZgBjAGkAYwBvAG4Ac1JlZ3VsYXIAUgBlAGcAdQBsAGEAcmZjaWNvbnMAZgBjAGkAYwBvAG4Ac0ZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") format('truetype');font-weight:400;font-style:normal}.fc-icon{width:1em;height:1em;-webkit-user-select:none;user-select:none;font-family:fcicons!important;speak:none;font-style:normal;font-variant:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fc-icon-chevron-left:before{content:"\e900"}.fc-icon-chevron-right:before{content:"\e901"}.fc-icon-chevrons-left:before{content:"\e902"}.fc-icon-chevrons-right:before{content:"\e903"}.fc-icon-minus-square:before{content:"\e904"}.fc-icon-plus-square:before{content:"\e905"}.fc-icon-x:before{content:"\e906"}.fc .fc-button{overflow:visible;text-transform:none;margin:0;font-family:inherit}.fc .fc-button::-moz-focus-inner{padding:0;border-style:none}.fc .fc-button{-webkit-appearance:button;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.4em .65em;font-size:1em;line-height:1.5;border-radius:.25em}.fc .fc-button:focus{outline:0;box-shadow:0 0 0 .2rem rgba(44,62,80,.25)}.fc .fc-button-primary:focus,.fc .fc-button-primary:not(:disabled).fc-button-active:focus,.fc .fc-button-primary:not(:disabled):active:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button:disabled{opacity:.65}.fc .fc-button-primary{color:#fff;color:var(--fc-button-text-color,#fff);background-color:#2C3E50;background-color:var(--fc-button-bg-color,#2C3E50);border-color:#2C3E50;border-color:var(--fc-button-border-color,#2C3E50)}.fc .fc-button-primary:hover{color:#fff;color:var(--fc-button-text-color,#fff);background-color:#1e2b37;background-color:var(--fc-button-hover-bg-color,#1e2b37);border-color:#1a252f;border-color:var(--fc-button-hover-border-color,#1a252f)}.fc .fc-button-primary:disabled{color:#fff;color:var(--fc-button-text-color,#fff);background-color:#2C3E50;background-color:var(--fc-button-bg-color,#2C3E50);border-color:#2C3E50;border-color:var(--fc-button-border-color,#2C3E50)}.fc .fc-button-primary:not(:disabled).fc-button-active,.fc .fc-button-primary:not(:disabled):active{color:#fff;color:var(--fc-button-text-color,#fff);background-color:#1a252f;background-color:var(--fc-button-active-bg-color,#1a252f);border-color:#151e27;border-color:var(--fc-button-active-border-color,#151e27)}.fc .fc-button .fc-icon{font-size:1.5em}.fc .fc-button-group{position:relative;display:inline-flex}.fc .fc-button-group>.fc-button{position:relative;flex:1 1 auto}.fc .fc-button-group>.fc-button.fc-button-active,.fc .fc-button-group>.fc-button:active,.fc .fc-button-group>.fc-button:focus,.fc .fc-button-group>.fc-button:hover{z-index:1}.fc-direction-ltr .fc-button-group>.fc-button:not(:first-child){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-direction-ltr .fc-button-group>.fc-button:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:first-child){margin-right:-1px;border-top-right-radius:0;border-bottom-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:last-child){border-top-left-radius:0;border-bottom-left-radius:0}.fc .fc-toolbar{display:flex;justify-content:space-between;align-items:center}.fc .fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc .fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc .fc-toolbar-title{font-size:1.75em;margin:0}.fc-direction-ltr .fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-direction-rtl .fc-toolbar>*>:not(:first-child){margin-right:.75em}.fc-direction-rtl .fc-toolbar-ltr{flex-direction:row-reverse}.fc .fc-scroller{-webkit-overflow-scrolling:touch;position:relative}.fc .fc-scroller-liquid{height:100%}.fc .fc-scroller-liquid-absolute{position:absolute;top:0;right:0;left:0;bottom:0}.fc .fc-scroller-harness{position:relative;overflow:hidden;direction:ltr}.fc .fc-scroller-harness-liquid{height:100%}.fc-direction-rtl .fc-scroller-harness>.fc-scroller{direction:rtl}.fc-theme-standard .fc-scrollgrid{border:1px solid #ddd;border:1px solid var(--fc-border-color,#ddd)}.fc .fc-scrollgrid,.fc .fc-scrollgrid-section-footer>*,.fc .fc-scrollgrid-section-header>*{border-bottom-width:0}.fc .fc-scrollgrid,.fc .fc-scrollgrid table{width:100%;table-layout:fixed}.fc .fc-scrollgrid table{border-top-style:hidden;border-left-style:hidden;border-right-style:hidden}.fc .fc-scrollgrid{border-collapse:separate;border-right-width:0}.fc .fc-scrollgrid-liquid{height:100%}.fc .fc-scrollgrid-section,.fc .fc-scrollgrid-section table,.fc .fc-scrollgrid-section>td{height:1px}.fc .fc-scrollgrid-section-liquid>td{height:100%}.fc .fc-scrollgrid-section>*{border-top-width:0;border-left-width:0}.fc .fc-scrollgrid-section-body table,.fc .fc-scrollgrid-section-footer table{border-bottom-style:hidden}.fc .fc-scrollgrid-section-sticky>*{background:var(--fc-page-bg-color,#fff);position:sticky;z-index:3}.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky>*{top:0}.fc .fc-scrollgrid-section-footer.fc-scrollgrid-section-sticky>*{bottom:0}.fc .fc-scrollgrid-sticky-shim{height:1px;margin-bottom:-1px}.fc-sticky{position:sticky}.fc .fc-view-harness{flex-grow:1;position:relative}.fc .fc-bg-event,.fc .fc-highlight,.fc .fc-non-business,.fc .fc-view-harness-active>.fc-view{position:absolute;top:0;left:0;right:0;bottom:0}.fc .fc-col-header-cell-cushion{display:inline-block;padding:2px 4px}.fc .fc-non-business{background:rgba(215,215,215,.3);background:var(--fc-non-business-color,rgba(215,215,215,.3))}.fc .fc-bg-event{background:var(--fc-bg-event-color,#8fdf82);opacity:.3;opacity:var(--fc-bg-event-opacity,.3)}.fc .fc-bg-event .fc-event-title{margin:.5em;font-size:.85em;font-size:var(--fc-small-font-size,.85em);font-style:italic}.fc .fc-highlight{background:rgba(188,232,241,.3);background:var(--fc-highlight-color,rgba(188,232,241,.3))}.fc .fc-cell-shaded,.fc .fc-day-disabled{background:rgba(208,208,208,.3);background:var(--fc-neutral-bg-color,rgba(208,208,208,.3))}.fc-event .fc-event-main{position:relative;z-index:2}.fc-event-dragging:not(.fc-event-selected){opacity:.75}.fc-event-dragging.fc-event-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event .fc-event-resizer{display:none;position:absolute;z-index:4}.fc-event-selected .fc-event-resizer,.fc-event:hover .fc-event-resizer,.fc-h-event,.fc-v-event{display:block}.fc-event-selected .fc-event-resizer{border-radius:4px;border-radius:calc(var(--fc-event-resizer-dot-total-width,8px)/ 2);border-width:1px;border-width:var(--fc-event-resizer-dot-border-width,1px);width:8px;width:var(--fc-event-resizer-dot-total-width,8px);height:8px;height:var(--fc-event-resizer-dot-total-width,8px);border-style:solid;border-color:inherit;background:var(--fc-page-bg-color,#fff)}.fc-event-selected .fc-event-resizer:before{content:'';position:absolute;top:-20px;left:-20px;right:-20px;bottom:-20px}.fc-event-selected,.fc-event:focus{box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event-selected:before,.fc-event:focus:before{content:"";position:absolute;z-index:3;top:0;left:0;right:0;bottom:0}.fc-event-selected:after,.fc-event:focus:after{content:"";background:rgba(0,0,0,.25);background:var(--fc-event-selected-overlay-color,rgba(0,0,0,.25));position:absolute;z-index:1;top:-1px;left:-1px;right:-1px;bottom:-1px}.fc-h-event{border:1px solid #3788d8;border:1px solid var(--fc-event-border-color,#3788d8);background-color:#3788d8;background-color:var(--fc-event-bg-color,#3788d8)}.fc-h-event .fc-event-main{color:#fff;color:var(--fc-event-text-color,#fff)}.fc-h-event .fc-event-main-frame{display:flex}.fc-h-event .fc-event-time{max-width:100%;overflow:hidden}.fc-h-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-width:0}.fc-h-event .fc-event-title{display:inline-block;vertical-align:top;left:0;right:0;max-width:100%;overflow:hidden}.fc-h-event.fc-event-selected:before{top:-10px;bottom:-10px}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end){border-top-left-radius:0;border-bottom-left-radius:0;border-left-width:0}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start){border-top-right-radius:0;border-bottom-right-radius:0;border-right-width:0}.fc-h-event:not(.fc-event-selected) .fc-event-resizer{top:0;bottom:0;width:8px;width:var(--fc-event-resizer-thickness,8px)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end{cursor:w-resize;left:-4px;left:calc(-.5 * var(--fc-event-resizer-thickness,8px))}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start{cursor:e-resize;right:-4px;right:calc(-.5 * var(--fc-event-resizer-thickness,8px))}.fc-h-event.fc-event-selected .fc-event-resizer{top:50%;margin-top:-4px;margin-top:calc(-.5 * var(--fc-event-resizer-dot-total-width,8px))}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-start,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-end{left:-4px;left:calc(-.5 * var(--fc-event-resizer-dot-total-width,8px))}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-end,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-start{right:-4px;right:calc(-.5 * var(--fc-event-resizer-dot-total-width,8px))}.fc .fc-popover{position:absolute;z-index:9999;box-shadow:0 2px 6px rgba(0,0,0,.15)}.fc .fc-popover-header{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding:3px 4px}.fc .fc-popover-title{margin:0 2px}.fc .fc-popover-close{cursor:pointer;opacity:.65;font-size:1.1em}.fc-theme-standard .fc-popover{border:1px solid #ddd;border:1px solid var(--fc-border-color,#ddd);background:var(--fc-page-bg-color,#fff)}.fc-theme-standard .fc-popover-header{background:rgba(208,208,208,.3);background:var(--fc-neutral-bg-color,rgba(208,208,208,.3))}:root{--fc-daygrid-event-dot-width:8px;--fc-list-event-dot-width:10px;--fc-list-event-hover-bg-color:#f5f5f5}.fc-daygrid-day-events:after,.fc-daygrid-day-events:before,.fc-daygrid-day-frame:after,.fc-daygrid-day-frame:before,.fc-daygrid-event-harness:after,.fc-daygrid-event-harness:before{content:"";clear:both;display:table}.fc .fc-daygrid-body{position:relative;z-index:1}.fc .fc-daygrid-day.fc-day-today{background-color:rgba(255,220,40,.15);background-color:var(--fc-today-bg-color,rgba(255,220,40,.15))}.fc .fc-daygrid-day-frame{position:relative;min-height:100%}.fc .fc-daygrid-day-top{display:flex;flex-direction:row-reverse}.fc .fc-day-other .fc-daygrid-day-top{opacity:.3}.fc .fc-daygrid-day-number{position:relative;z-index:4;padding:4px}.fc .fc-daygrid-day-events{margin-top:1px}.fc .fc-daygrid-body-balanced .fc-daygrid-day-events{position:absolute;left:0;right:0}.fc .fc-daygrid-body-unbalanced .fc-daygrid-day-events{position:relative;min-height:2em}.fc .fc-daygrid-body-natural .fc-daygrid-day-events{margin-bottom:1em}.fc .fc-daygrid-event-harness{position:relative}.fc .fc-daygrid-event-harness-abs{position:absolute;top:0;left:0;right:0}.fc .fc-daygrid-bg-harness{position:absolute;top:0;bottom:0}.fc .fc-daygrid-day-bg .fc-non-business{z-index:1}.fc .fc-daygrid-day-bg .fc-bg-event{z-index:2}.fc .fc-daygrid-day-bg .fc-highlight{z-index:3}.fc .fc-daygrid-event{z-index:6;margin-top:1px}.fc .fc-daygrid-event.fc-event-mirror{z-index:7}.fc .fc-daygrid-day-bottom{font-size:.85em;padding:2px 3px 0}.fc .fc-daygrid-day-bottom:before{content:"";clear:both;display:table}.fc .fc-daygrid-more-link{position:relative;z-index:4;cursor:pointer}.fc .fc-daygrid-week-number{position:absolute;z-index:5;top:0;padding:2px;min-width:1.5em;text-align:center;background-color:rgba(208,208,208,.3);background-color:var(--fc-neutral-bg-color,rgba(208,208,208,.3));color:grey;color:var(--fc-neutral-text-color,grey)}.fc .fc-more-popover .fc-popover-body{min-width:220px;padding:10px}.fc-direction-ltr .fc-daygrid-event.fc-event-start,.fc-direction-rtl .fc-daygrid-event.fc-event-end{margin-left:2px}.fc-direction-ltr .fc-daygrid-event.fc-event-end,.fc-direction-rtl .fc-daygrid-event.fc-event-start{margin-right:2px}.fc-direction-ltr .fc-daygrid-week-number{left:0;border-radius:0 0 3px}.fc-direction-rtl .fc-daygrid-week-number{right:0;border-radius:0 0 0 3px}.fc-liquid-hack .fc-daygrid-day-frame{position:static}.fc-daygrid-event{position:relative;white-space:nowrap;border-radius:3px;font-size:.85em;font-size:var(--fc-small-font-size,.85em)}.fc-daygrid-block-event .fc-event-time{font-weight:700}.fc-daygrid-block-event .fc-event-time,.fc-daygrid-block-event .fc-event-title{padding:1px}.fc-daygrid-dot-event{display:flex;align-items:center;padding:2px 0}.fc-daygrid-dot-event .fc-event-title{flex-grow:1;flex-shrink:1;min-width:0;overflow:hidden;font-weight:700}.fc-daygrid-dot-event.fc-event-mirror,.fc-daygrid-dot-event:hover{background:rgba(0,0,0,.1)}.fc-daygrid-dot-event.fc-event-selected:before{top:-10px;bottom:-10px}.fc-daygrid-event-dot{margin:0 4px;box-sizing:content-box;width:0;height:0;border:4px solid #3788d8;border:calc(var(--fc-daygrid-event-dot-width,8px)/ 2) solid var(--fc-event-border-color,#3788d8);border-radius:4px;border-radius:calc(var(--fc-daygrid-event-dot-width,8px)/ 2)}.fc-direction-ltr .fc-daygrid-event .fc-event-time{margin-right:3px}.fc-direction-rtl .fc-daygrid-event .fc-event-time{margin-left:3px}.fc-v-event{border:1px solid #3788d8;border:1px solid var(--fc-event-border-color,#3788d8);background-color:#3788d8;background-color:var(--fc-event-bg-color,#3788d8)}.fc-v-event .fc-event-main{color:#fff;color:var(--fc-event-text-color,#fff);height:100%}.fc-v-event .fc-event-main-frame{height:100%;display:flex;flex-direction:column}.fc-v-event .fc-event-time{flex-grow:0;flex-shrink:0;max-height:100%;overflow:hidden}.fc-v-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-height:0}.fc-v-event .fc-event-title{top:0;bottom:0;max-height:100%;overflow:hidden}.fc-v-event:not(.fc-event-start){border-top-width:0;border-top-left-radius:0;border-top-right-radius:0}.fc-v-event:not(.fc-event-end){border-bottom-width:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.fc-v-event.fc-event-selected:before{left:-10px;right:-10px}.fc-v-event .fc-event-resizer-start{cursor:n-resize}.fc-v-event .fc-event-resizer-end{cursor:s-resize}.fc-v-event:not(.fc-event-selected) .fc-event-resizer{height:8px;height:var(--fc-event-resizer-thickness,8px);left:0;right:0}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-start{top:-4px;top:calc(var(--fc-event-resizer-thickness,8px)/ -2)}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-end{bottom:-4px;bottom:calc(var(--fc-event-resizer-thickness,8px)/ -2)}.fc-v-event.fc-event-selected .fc-event-resizer{left:50%;margin-left:-4px;margin-left:calc(var(--fc-event-resizer-dot-total-width,8px)/ -2)}.fc-v-event.fc-event-selected .fc-event-resizer-start{top:-4px;top:calc(var(--fc-event-resizer-dot-total-width,8px)/ -2)}.fc-v-event.fc-event-selected .fc-event-resizer-end{bottom:-4px;bottom:calc(var(--fc-event-resizer-dot-total-width,8px)/ -2)}.fc .fc-timegrid .fc-daygrid-body{z-index:2}.fc .fc-timegrid-axis-chunk>table,.fc .fc-timegrid-body,.fc .fc-timegrid-slots{position:relative;z-index:1}.fc .fc-timegrid-divider{padding:0 0 2px}.fc .fc-timegrid-body{min-height:100%}.fc .fc-timegrid-axis-chunk{position:relative}.fc .fc-timegrid-slot{height:1.5em;border-bottom:0}.fc .fc-timegrid-slot:empty:before{content:'\00a0'}.fc .fc-timegrid-slot-minor{border-top-style:dotted}.fc .fc-timegrid-slot-label-cushion{display:inline-block;white-space:nowrap}.fc .fc-timegrid-axis-cushion,.fc .fc-timegrid-slot-label-cushion{padding:0 4px}.fc .fc-timegrid-axis-frame-liquid{height:100%}.fc .fc-timegrid-axis-frame{overflow:hidden;display:flex;align-items:center;justify-content:flex-end}.fc .fc-timegrid-axis-cushion{max-width:60px;flex-shrink:0}.fc-direction-ltr .fc-timegrid-slot-label-frame{text-align:right}.fc-direction-rtl .fc-timegrid-slot-label-frame{text-align:left}.fc-liquid-hack .fc-timegrid-axis-frame-liquid{height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.fc .fc-timegrid-col.fc-day-today{background-color:rgba(255,220,40,.15);background-color:var(--fc-today-bg-color,rgba(255,220,40,.15))}.fc .fc-timegrid-col-frame{min-height:100%;position:relative}.fc-media-screen.fc-liquid-hack .fc-timegrid-col-frame{height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.fc-media-screen .fc-timegrid-cols{position:absolute;top:0;left:0;right:0;bottom:0}.fc-media-screen .fc-timegrid-cols>table{height:100%}.fc-media-screen .fc-timegrid-col-bg,.fc-media-screen .fc-timegrid-col-events,.fc-media-screen .fc-timegrid-now-indicator-container{position:absolute;top:0;left:0;right:0}.fc .fc-timegrid-col-bg{z-index:2}.fc .fc-timegrid-col-bg .fc-non-business{z-index:1}.fc .fc-timegrid-col-bg .fc-bg-event{z-index:2}.fc .fc-timegrid-col-bg .fc-highlight,.fc .fc-timegrid-col-events{z-index:3}.fc .fc-timegrid-bg-harness{position:absolute;left:0;right:0}.fc .fc-timegrid-now-indicator-container{bottom:0;overflow:hidden}.fc-direction-ltr .fc-timegrid-col-events{margin:0 2.5% 0 2px}.fc-direction-rtl .fc-timegrid-col-events{margin:0 2px 0 2.5%}.fc-timegrid-event-harness{position:absolute}.fc-timegrid-event-harness>.fc-timegrid-event{position:absolute;top:0;bottom:0;left:0;right:0}.fc-timegrid-event-harness-inset .fc-timegrid-event,.fc-timegrid-event.fc-event-mirror,.fc-timegrid-more-link{box-shadow:0 0 0 1px #fff;box-shadow:0 0 0 1px var(--fc-page-bg-color,#fff)}.fc-timegrid-event,.fc-timegrid-more-link{font-size:.85em;font-size:var(--fc-small-font-size,.85em);border-radius:3px}.fc-timegrid-event{margin-bottom:1px}.fc-timegrid-event .fc-event-main{padding:1px 1px 0}.fc-timegrid-event .fc-event-time{white-space:nowrap;font-size:.85em;font-size:var(--fc-small-font-size,.85em);margin-bottom:1px}.fc-timegrid-event-short .fc-event-main-frame{flex-direction:row;overflow:hidden}.fc-timegrid-event-short .fc-event-time:after{content:'\00a0-\00a0'}.fc-timegrid-event-short .fc-event-title{font-size:.85em;font-size:var(--fc-small-font-size,.85em)}.fc-timegrid-more-link{position:absolute;z-index:9999;color:inherit;color:var(--fc-more-link-text-color,inherit);background:var(--fc-more-link-bg-color,#d0d0d0);cursor:pointer;margin-bottom:1px}.fc-timegrid-more-link-inner{padding:3px 2px;top:0}.fc-direction-ltr .fc-timegrid-more-link{right:0}.fc-direction-rtl .fc-timegrid-more-link{left:0}.fc .fc-timegrid-now-indicator-line{position:absolute;z-index:4;left:0;right:0;border-style:solid;border-color:red;border-color:var(--fc-now-indicator-color,red);border-width:1px 0 0}.fc .fc-timegrid-now-indicator-arrow{position:absolute;z-index:4;margin-top:-5px;border-style:solid;border-color:red;border-color:var(--fc-now-indicator-color,red)}.fc-direction-ltr .fc-timegrid-now-indicator-arrow{left:0;border-width:5px 0 5px 6px;border-top-color:transparent;border-bottom-color:transparent}.fc-direction-rtl .fc-timegrid-now-indicator-arrow{right:0;border-width:5px 6px 5px 0;border-top-color:transparent;border-bottom-color:transparent}.fc-theme-standard .fc-list{border:1px solid #ddd;border:1px solid var(--fc-border-color,#ddd)}.fc .fc-list-empty{background-color:rgba(208,208,208,.3);background-color:var(--fc-neutral-bg-color,rgba(208,208,208,.3));height:100%;display:flex;justify-content:center;align-items:center}.fc .fc-list-empty-cushion{margin:5em 0}.fc .fc-list-table{width:100%;border-style:hidden}.fc .fc-list-table tr>*{border-left:0;border-right:0}.fc .fc-list-sticky .fc-list-day>*{position:sticky;top:0;background:var(--fc-page-bg-color,#fff)}.fc .fc-list-table thead{position:absolute;left:-10000px}.fc .fc-list-table tbody>tr:first-child th{border-top:0}.fc .fc-list-table th{padding:0}.fc .fc-list-day-cushion,.fc .fc-list-table td{padding:8px 14px}.fc .fc-list-day-cushion:after{content:"";clear:both;display:table}.fc-theme-standard .fc-list-day-cushion{background-color:rgba(208,208,208,.3);background-color:var(--fc-neutral-bg-color,rgba(208,208,208,.3))}.fc-direction-ltr .fc-list-day-text,.fc-direction-rtl .fc-list-day-side-text{float:left}.fc-direction-ltr .fc-list-day-side-text,.fc-direction-rtl .fc-list-day-text{float:right}.fc-direction-ltr .fc-list-table .fc-list-event-graphic{padding-right:0}.fc-direction-rtl .fc-list-table .fc-list-event-graphic{padding-left:0}.fc .fc-list-event.fc-event-forced-url{cursor:pointer}.fc .fc-list-event:hover td{background-color:#f5f5f5;background-color:var(--fc-list-event-hover-bg-color,#f5f5f5)}.fc .fc-list-event-graphic,.fc .fc-list-event-time{white-space:nowrap;width:1px}.fc .fc-list-event-dot{display:inline-block;box-sizing:content-box;width:0;height:0;border:5px solid #3788d8;border:calc(var(--fc-list-event-dot-width,10px)/ 2) solid var(--fc-event-border-color,#3788d8);border-radius:5px;border-radius:calc(var(--fc-list-event-dot-width,10px)/ 2)}.fc .fc-list-event-title a{color:inherit}.fc .fc-list-event.fc-event-forced-url:hover a{text-decoration:underline}.fc-theme-bootstrap a:not([href]){color:inherit}
\ No newline at end of file
diff --git a/public/static/assets/third_party/fullcalendar/main.min.js b/public/static/assets/third_party/fullcalendar/main.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..59e8cc01ee6d485f60a9009ecd55038d07acc98b
--- /dev/null
+++ b/public/static/assets/third_party/fullcalendar/main.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar v5.10.1
+Docs & License: https://fullcalendar.io/
+(c) 2021 Adam Shaw
+*/
+var FullCalendar=function(e){"use strict";var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,n)};function n(e,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}var r=function(){return(r=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e}).apply(this,arguments)};function o(e,t,n){if(n||2===arguments.length)for(var r,o=0,i=t.length;o<i;o++)!r&&o in t||(r||(r=Array.prototype.slice.call(t,0,o)),r[o]=t[o]);return e.concat(r||t)}var i,a,s,l,u,c={},d=[],p=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function f(e,t){for(var n in t)e[n]=t[n];return e}function h(e){var t=e.parentNode;t&&t.removeChild(e)}function v(e,t,n){var r,o,i,a=arguments,s={};for(i in t)"key"==i?r=t[i]:"ref"==i?o=t[i]:s[i]=t[i];if(arguments.length>3)for(n=[n],i=3;i<arguments.length;i++)n.push(a[i]);if(null!=n&&(s.children=n),"function"==typeof e&&null!=e.defaultProps)for(i in e.defaultProps)void 0===s[i]&&(s[i]=e.defaultProps[i]);return g(e,s,r,o,null)}function g(e,t,n,r,o){var a={type:e,props:t,key:n,ref:r,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==o?++i.__v:o};return null!=i.vnode&&i.vnode(a),a}function m(e){return e.children}function y(e,t){this.props=e,this.context=t}function E(e,t){if(null==t)return e.__?E(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?E(e):null}function S(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 S(e)}}function b(e){(!e.__d&&(e.__d=!0)&&a.push(e)&&!D.__r++||l!==i.debounceRendering)&&((l=i.debounceRendering)||s)(D)}function D(){for(var e;D.__r=a.length;)e=a.sort((function(e,t){return e.__v.__b-t.__v.__b})),a=[],e.some((function(e){var t,n,r,o,i,a;e.__d&&(i=(o=(t=e).__v).__e,(a=t.__P)&&(n=[],(r=f({},o)).__v=o.__v+1,I(a,o,r,t.__n,void 0!==a.ownerSVGElement,null!=o.__h?[i]:null,n,null==i?E(o):i,o.__h),P(n,o),o.__e!=i&&S(o)))}))}function C(e,t,n,r,o,i,a,s,l,u){var p,f,h,v,y,S,b,D=r&&r.__k||d,C=D.length;for(n.__k=[],p=0;p<t.length;p++)if(null!=(v=n.__k[p]=null==(v=t[p])||"boolean"==typeof v?null:"string"==typeof v||"number"==typeof v||"bigint"==typeof v?g(null,v,null,null,v):Array.isArray(v)?g(m,{children:v},null,null,null):v.__b>0?g(v.type,v.props,v.key,null,v.__v):v)){if(v.__=n,v.__b=n.__b+1,null===(h=D[p])||h&&v.key==h.key&&v.type===h.type)D[p]=void 0;else for(f=0;f<C;f++){if((h=D[f])&&v.key==h.key&&v.type===h.type){D[f]=void 0;break}h=null}I(e,v,h=h||c,o,i,a,s,l,u),y=v.__e,(f=v.ref)&&h.ref!=f&&(b||(b=[]),h.ref&&b.push(h.ref,null,v),b.push(f,v.__c||y,v)),null!=y?(null==S&&(S=y),"function"==typeof v.type&&null!=v.__k&&v.__k===h.__k?v.__d=l=w(v,l,e):l=_(e,v,h,D,y,l),u||"option"!==n.type?"function"==typeof n.type&&(n.__d=l):e.value=""):l&&h.__e==l&&l.parentNode!=e&&(l=E(h))}for(n.__e=S,p=C;p--;)null!=D[p]&&("function"==typeof n.type&&null!=D[p].__e&&D[p].__e==n.__d&&(n.__d=E(r,p+1)),O(D[p],D[p]));if(b)for(p=0;p<b.length;p++)H(b[p],b[++p],b[++p])}function w(e,t,n){var r,o;for(r=0;r<e.__k.length;r++)(o=e.__k[r])&&(o.__=e,t="function"==typeof o.type?w(o,t,n):_(n,o,o,e.__k,o.__e,t));return t}function R(e,t){return t=t||[],null==e||"boolean"==typeof e||(Array.isArray(e)?e.some((function(e){R(e,t)})):t.push(e)),t}function _(e,t,n,r,o,i){var a,s,l;if(void 0!==t.__d)a=t.__d,t.__d=void 0;else if(null==n||o!=i||null==o.parentNode)e:if(null==i||i.parentNode!==e)e.appendChild(o),a=null;else{for(s=i,l=0;(s=s.nextSibling)&&l<r.length;l+=2)if(s==o)break e;e.insertBefore(o,i),a=i}return void 0!==a?a:o.nextSibling}function T(e,t,n){"-"===t[0]?e.setProperty(t,n):e[t]=null==n?"":"number"!=typeof n||p.test(t)?n:n+"px"}function k(e,t,n,r,o){var i;e:if("style"===t)if("string"==typeof n)e.style.cssText=n;else{if("string"==typeof r&&(e.style.cssText=r=""),r)for(t in r)n&&t in n||T(e.style,t,"");if(n)for(t in n)r&&n[t]===r[t]||T(e.style,t,n[t])}else if("o"===t[0]&&"n"===t[1])i=t!==(t=t.replace(/Capture$/,"")),t=t.toLowerCase()in e?t.toLowerCase().slice(2):t.slice(2),e.l||(e.l={}),e.l[t+i]=n,n?r||e.addEventListener(t,i?M:x,i):e.removeEventListener(t,i?M:x,i);else if("dangerouslySetInnerHTML"!==t){if(o)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||"a"===t[0]&&"r"===t[1])?e.setAttribute(t,n):e.removeAttribute(t))}}function x(e){this.l[e.type+!1](i.event?i.event(e):e)}function M(e){this.l[e.type+!0](i.event?i.event(e):e)}function I(e,t,n,r,o,a,s,l,u){var c,d,p,h,v,g,E,S,b,D,w,R=t.type;if(void 0!==t.constructor)return null;null!=n.__h&&(u=n.__h,l=t.__e=n.__e,t.__h=null,a=[l]),(c=i.__b)&&c(t);try{e:if("function"==typeof R){if(S=t.props,b=(c=R.contextType)&&r[c.__c],D=c?b?b.props.value:c.__:r,n.__c?E=(d=t.__c=n.__c).__=d.__E:("prototype"in R&&R.prototype.render?t.__c=d=new R(S,D):(t.__c=d=new y(S,D),d.constructor=R,d.render=A),b&&b.sub(d),d.props=S,d.state||(d.state={}),d.context=D,d.__n=r,p=d.__d=!0,d.__h=[]),null==d.__s&&(d.__s=d.state),null!=R.getDerivedStateFromProps&&(d.__s==d.state&&(d.__s=f({},d.__s)),f(d.__s,R.getDerivedStateFromProps(S,d.__s))),h=d.props,v=d.state,p)null==R.getDerivedStateFromProps&&null!=d.componentWillMount&&d.componentWillMount(),null!=d.componentDidMount&&d.__h.push(d.componentDidMount);else{if(null==R.getDerivedStateFromProps&&S!==h&&null!=d.componentWillReceiveProps&&d.componentWillReceiveProps(S,D),!d.__e&&null!=d.shouldComponentUpdate&&!1===d.shouldComponentUpdate(S,d.__s,D)||t.__v===n.__v){d.props=S,d.state=d.__s,t.__v!==n.__v&&(d.__d=!1),d.__v=t,t.__e=n.__e,t.__k=n.__k,t.__k.forEach((function(e){e&&(e.__=t)})),d.__h.length&&s.push(d);break e}null!=d.componentWillUpdate&&d.componentWillUpdate(S,d.__s,D),null!=d.componentDidUpdate&&d.__h.push((function(){d.componentDidUpdate(h,v,g)}))}d.context=D,d.props=S,d.state=d.__s,(c=i.__r)&&c(t),d.__d=!1,d.__v=t,d.__P=e,c=d.render(d.props,d.state,d.context),d.state=d.__s,null!=d.getChildContext&&(r=f(f({},r),d.getChildContext())),p||null==d.getSnapshotBeforeUpdate||(g=d.getSnapshotBeforeUpdate(h,v)),w=null!=c&&c.type===m&&null==c.key?c.props.children:c,C(e,Array.isArray(w)?w:[w],t,n,r,o,a,s,l,u),d.base=t.__e,t.__h=null,d.__h.length&&s.push(d),E&&(d.__E=d.__=null),d.__e=!1}else null==a&&t.__v===n.__v?(t.__k=n.__k,t.__e=n.__e):t.__e=N(n.__e,t,n,r,o,a,s,u);(c=i.diffed)&&c(t)}catch(e){t.__v=null,(u||null!=a)&&(t.__e=l,t.__h=!!u,a[a.indexOf(l)]=null),i.__e(e,t,n)}}function P(e,t){i.__c&&i.__c(t,e),e.some((function(t){try{e=t.__h,t.__h=[],e.some((function(e){e.call(t)}))}catch(e){i.__e(e,t.__v)}}))}function N(e,t,n,r,o,i,a,s){var l,u,p,f,v=n.props,g=t.props,m=t.type,y=0;if("svg"===m&&(o=!0),null!=i)for(;y<i.length;y++)if((l=i[y])&&(l===e||(m?l.localName==m:3==l.nodeType))){e=l,i[y]=null;break}if(null==e){if(null===m)return document.createTextNode(g);e=o?document.createElementNS("http://www.w3.org/2000/svg",m):document.createElement(m,g.is&&g),i=null,s=!1}if(null===m)v===g||s&&e.data===g||(e.data=g);else{if(i=i&&d.slice.call(e.childNodes),u=(v=n.props||c).dangerouslySetInnerHTML,p=g.dangerouslySetInnerHTML,!s){if(null!=i)for(v={},f=0;f<e.attributes.length;f++)v[e.attributes[f].name]=e.attributes[f].value;(p||u)&&(p&&(u&&p.__html==u.__html||p.__html===e.innerHTML)||(e.innerHTML=p&&p.__html||""))}if(function(e,t,n,r,o){var i;for(i in n)"children"===i||"key"===i||i in t||k(e,i,null,n[i],r);for(i in t)o&&"function"!=typeof t[i]||"children"===i||"key"===i||"value"===i||"checked"===i||n[i]===t[i]||k(e,i,t[i],n[i],r)}(e,g,v,o,s),p)t.__k=[];else if(y=t.props.children,C(e,Array.isArray(y)?y:[y],t,n,r,o&&"foreignObject"!==m,i,a,e.firstChild,s),null!=i)for(y=i.length;y--;)null!=i[y]&&h(i[y]);s||("value"in g&&void 0!==(y=g.value)&&(y!==e.value||"progress"===m&&!y)&&k(e,"value",y,v.value,!1),"checked"in g&&void 0!==(y=g.checked)&&y!==e.checked&&k(e,"checked",y,v.checked,!1))}return e}function H(e,t,n){try{"function"==typeof e?e(t):e.current=t}catch(e){i.__e(e,n)}}function O(e,t,n){var r,o,a;if(i.unmount&&i.unmount(e),(r=e.ref)&&(r.current&&r.current!==e.__e||H(r,null,t)),n||"function"==typeof e.type||(n=null!=(o=e.__e)),e.__e=e.__d=void 0,null!=(r=e.__c)){if(r.componentWillUnmount)try{r.componentWillUnmount()}catch(e){i.__e(e,t)}r.base=r.__P=null}if(r=e.__k)for(a=0;a<r.length;a++)r[a]&&O(r[a],t,n);null!=o&&h(o)}function A(e,t,n){return this.constructor(e,n)}function L(e,t,n){var r,o,a;i.__&&i.__(e,t),o=(r="function"==typeof n)?null:n&&n.__k||t.__k,a=[],I(t,e=(!r&&n||t).__k=v(m,null,[e]),o||c,c,void 0!==t.ownerSVGElement,!r&&n?[n]:o?null:t.firstChild?d.slice.call(t.childNodes):null,a,!r&&n?n:o?o.__e:t.firstChild,r),P(a,e)}i={__e:function(e,t){for(var n,r,o;t=t.__;)if((n=t.__c)&&!n.__)try{if((r=n.constructor)&&null!=r.getDerivedStateFromError&&(n.setState(r.getDerivedStateFromError(e)),o=n.__d),null!=n.componentDidCatch&&(n.componentDidCatch(e),o=n.__d),o)return n.__E=n}catch(t){e=t}throw e},__v:0},y.prototype.setState=function(e,t){var n;n=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=f({},this.state),"function"==typeof e&&(e=e(f({},n),this.props)),e&&f(n,e),null!=e&&this.__v&&(t&&this.__h.push(t),b(this))},y.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),b(this))},y.prototype.render=m,a=[],s="function"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,D.__r=0,u=0;var U,W=[],V=i.__b,F=i.__r,B=i.diffed,z=i.__c,j=i.unmount;function G(){W.forEach((function(e){if(e.__P)try{e.__H.__h.forEach(Y),e.__H.__h.forEach(Z),e.__H.__h=[]}catch(t){e.__H.__h=[],i.__e(t,e.__v)}})),W=[]}i.__b=function(e){V&&V(e)},i.__r=function(e){F&&F(e);var t=e.__c.__H;t&&(t.__h.forEach(Y),t.__h.forEach(Z),t.__h=[])},i.diffed=function(e){B&&B(e);var t=e.__c;t&&t.__H&&t.__H.__h.length&&(1!==W.push(t)&&U===i.requestAnimationFrame||((U=i.requestAnimationFrame)||function(e){var t,n=function(){clearTimeout(r),q&&cancelAnimationFrame(t),setTimeout(e)},r=setTimeout(n,100);q&&(t=requestAnimationFrame(n))})(G))},i.__c=function(e,t){t.some((function(e){try{e.__h.forEach(Y),e.__h=e.__h.filter((function(e){return!e.__||Z(e)}))}catch(n){t.some((function(e){e.__h&&(e.__h=[])})),t=[],i.__e(n,e.__v)}})),z&&z(e,t)},i.unmount=function(e){j&&j(e);var t=e.__c;if(t&&t.__H)try{t.__H.__.forEach(Y)}catch(e){i.__e(e,t.__v)}};var q="function"==typeof requestAnimationFrame;function Y(e){"function"==typeof e.__c&&e.__c()}function Z(e){e.__c=e.__()}function X(e,t){for(var n in e)if("__source"!==n&&!(n in t))return!0;for(var r in t)if("__source"!==r&&e[r]!==t[r])return!0;return!1}function K(e){this.props=e}(K.prototype=new y).isPureReactComponent=!0,K.prototype.shouldComponentUpdate=function(e,t){return X(this.props,e)||X(this.state,t)};var $=i.__b;i.__b=function(e){e.type&&e.type.__f&&e.ref&&(e.props.ref=e.ref,e.ref=null),$&&$(e)};var J=i.__e;i.__e=function(e,t,n){if(e.then)for(var r,o=t;o=o.__;)if((r=o.__c)&&r.__c)return null==t.__e&&(t.__e=n.__e,t.__k=n.__k),r.__c(e,t);J(e,t,n)};var Q=i.unmount;function ee(){this.__u=0,this.t=null,this.__b=null}function te(e){var t=e.__.__c;return t&&t.__e&&t.__e(e)}function ne(){this.u=null,this.o=null}i.unmount=function(e){var t=e.__c;t&&t.__R&&t.__R(),t&&!0===e.__h&&(e.type=null),Q&&Q(e)},(ee.prototype=new y).__c=function(e,t){var n=t.__c,r=this;null==r.t&&(r.t=[]),r.t.push(n);var o=te(r.__v),i=!1,a=function(){i||(i=!0,n.__R=null,o?o(s):s())};n.__R=a;var s=function(){if(!--r.__u){if(r.state.__e){var e=r.state.__e;r.__v.__k[0]=function e(t,n,r){return t&&(t.__v=null,t.__k=t.__k&&t.__k.map((function(t){return e(t,n,r)})),t.__c&&t.__c.__P===n&&(t.__e&&r.insertBefore(t.__e,t.__d),t.__c.__e=!0,t.__c.__P=r)),t}(e,e.__c.__P,e.__c.__O)}var t;for(r.setState({__e:r.__b=null});t=r.t.pop();)t.forceUpdate()}},l=!0===t.__h;r.__u++||l||r.setState({__e:r.__b=r.__v.__k[0]}),e.then(a,a)},ee.prototype.componentWillUnmount=function(){this.t=[]},ee.prototype.render=function(e,t){if(this.__b){if(this.__v.__k){var n=document.createElement("div"),r=this.__v.__k[0].__c;this.__v.__k[0]=function e(t,n,r){return t&&(t.__c&&t.__c.__H&&(t.__c.__H.__.forEach((function(e){"function"==typeof e.__c&&e.__c()})),t.__c.__H=null),null!=(t=function(e,t){for(var n in t)e[n]=t[n];return e}({},t)).__c&&(t.__c.__P===r&&(t.__c.__P=n),t.__c=null),t.__k=t.__k&&t.__k.map((function(t){return e(t,n,r)}))),t}(this.__b,n,r.__O=r.__P)}this.__b=null}var o=t.__e&&v(m,null,e.fallback);return o&&(o.__h=null),[v(m,null,t.__e?null:e.children),o]};var re=function(e,t,n){if(++n[1]===n[0]&&e.o.delete(t),e.props.revealOrder&&("t"!==e.props.revealOrder[0]||!e.o.size))for(n=e.u;n;){for(;n.length>3;)n.pop()();if(n[1]<n[0])break;e.u=n=n[2]}};function oe(e){return this.getChildContext=function(){return e.context},e.children}function ie(e){var t=this,n=e.i;t.componentWillUnmount=function(){L(null,t.l),t.l=null,t.i=null},t.i&&t.i!==n&&t.componentWillUnmount(),e.__v?(t.l||(t.i=n,t.l={nodeType:1,parentNode:n,childNodes:[],appendChild:function(e){this.childNodes.push(e),t.i.appendChild(e)},insertBefore:function(e,n){this.childNodes.push(e),t.i.appendChild(e)},removeChild:function(e){this.childNodes.splice(this.childNodes.indexOf(e)>>>1,1),t.i.removeChild(e)}}),L(v(oe,{context:t.context},e.__v),t.l)):t.l&&t.componentWillUnmount()}(ne.prototype=new y).__e=function(e){var t=this,n=te(t.__v),r=t.o.get(e);return r[0]++,function(o){var i=function(){t.props.revealOrder?(r.push(o),re(t,e,r)):o()};n?n(i):i()}},ne.prototype.render=function(e){this.u=null,this.o=new Map;var t=R(e.children);e.revealOrder&&"b"===e.revealOrder[0]&&t.reverse();for(var n=t.length;n--;)this.o.set(t[n],this.u=[1,0,this.u]);return e.children},ne.prototype.componentDidUpdate=ne.prototype.componentDidMount=function(){var e=this;this.o.forEach((function(t,n){re(e,n,t)}))};var ae="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,se=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|fill|flood|font|glyph(?!R)|horiz|marker(?!H|W|U)|overline|paint|stop|strikethrough|stroke|text(?!L)|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,le=function(e){return("undefined"!=typeof Symbol&&"symbol"==typeof Symbol()?/fil|che|rad/i:/fil|che|ra/i).test(e)};y.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach((function(e){Object.defineProperty(y.prototype,e,{configurable:!0,get:function(){return this["UNSAFE_"+e]},set:function(t){Object.defineProperty(this,e,{configurable:!0,writable:!0,value:t})}})}));var ue=i.event;function ce(){}function de(){return this.cancelBubble}function pe(){return this.defaultPrevented}i.event=function(e){return ue&&(e=ue(e)),e.persist=ce,e.isPropagationStopped=de,e.isDefaultPrevented=pe,e.nativeEvent=e};var fe={configurable:!0,get:function(){return this.class}},he=i.vnode;i.vnode=function(e){var t=e.type,n=e.props,r=n;if("string"==typeof t){for(var o in r={},n){var i=n[o];"value"===o&&"defaultValue"in n&&null==i||("defaultValue"===o&&"value"in n&&null==n.value?o="value":"download"===o&&!0===i?i="":/ondoubleclick/i.test(o)?o="ondblclick":/^onchange(textarea|input)/i.test(o+t)&&!le(n.type)?o="oninput":/^on(Ani|Tra|Tou|BeforeInp)/.test(o)?o=o.toLowerCase():se.test(o)?o=o.replace(/[A-Z0-9]/,"-$&").toLowerCase():null===i&&(i=void 0),r[o]=i)}"select"==t&&r.multiple&&Array.isArray(r.value)&&(r.value=R(n.children).forEach((function(e){e.props.selected=-1!=r.value.indexOf(e.props.value)}))),"select"==t&&null!=r.defaultValue&&(r.value=R(n.children).forEach((function(e){e.props.selected=r.multiple?-1!=r.defaultValue.indexOf(e.props.value):r.defaultValue==e.props.value}))),e.props=r}t&&n.class!=n.className&&(fe.enumerable="className"in n,null!=n.className&&(r.class=n.className),Object.defineProperty(r,"className",fe)),e.$$typeof=ae,he&&he(e)};var ve=i.__r;i.__r=function(e){ve&&ve(e)},"object"==typeof performance&&"function"==typeof performance.now&&performance.now.bind(performance);var ge="undefined"!=typeof globalThis?globalThis:window;ge.FullCalendarVDom?console.warn("FullCalendar VDOM already loaded"):ge.FullCalendarVDom={Component:y,createElement:v,render:L,createRef:function(){return{current:null}},Fragment:m,createContext:function(e){var t=function(e,t){var n={__c:t="__cC"+u++,__:e,Consumer:function(e,t){return e.children(t)},Provider:function(e){var n,r;return this.getChildContext||(n=[],(r={})[t]=this,this.getChildContext=function(){return r},this.shouldComponentUpdate=function(e){this.props.value!==e.value&&n.some(b)},this.sub=function(e){n.push(e);var t=e.componentWillUnmount;e.componentWillUnmount=function(){n.splice(n.indexOf(e),1),t&&t.call(e)}}),e.children}};return n.Provider.__=n.Consumer.contextType=n}(e),n=t.Provider;return t.Provider=function(){var e=this,t=!this.getChildContext,r=n.apply(this,arguments);if(t){var o=[];this.shouldComponentUpdate=function(t){e.props.value!==t.value&&o.forEach((function(e){e.context=t.value,e.forceUpdate()}))},this.sub=function(e){o.push(e);var t=e.componentWillUnmount;e.componentWillUnmount=function(){o.splice(o.indexOf(e),1),t&&t.call(e)}}}return r},t},createPortal:function(e,t){return v(ie,{__v:e,i:t})},flushToDom:function(){var e=i.debounceRendering,t=[];function n(e){t.push(e)}i.debounceRendering=n,L(v(me,{}),document.createElement("div"));for(;t.length;)t.shift()();i.debounceRendering=e},unmountComponentAtNode:function(e){L(null,e)}};var me=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){return v("div",{})},t.prototype.componentDidMount=function(){this.setState({})},t}(y);var ye=function(){function e(e,t){this.context=e,this.internalEventSource=t}return e.prototype.remove=function(){this.context.dispatch({type:"REMOVE_EVENT_SOURCE",sourceId:this.internalEventSource.sourceId})},e.prototype.refetch=function(){this.context.dispatch({type:"FETCH_EVENT_SOURCES",sourceIds:[this.internalEventSource.sourceId],isRefetch:!0})},Object.defineProperty(e.prototype,"id",{get:function(){return this.internalEventSource.publicId},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this.internalEventSource.meta.url},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"format",{get:function(){return this.internalEventSource.meta.format},enumerable:!1,configurable:!0}),e}();function Ee(e){e.parentNode&&e.parentNode.removeChild(e)}function Se(e,t){if(e.closest)return e.closest(t);if(!document.documentElement.contains(e))return null;do{if(be(e,t))return e;e=e.parentElement||e.parentNode}while(null!==e&&1===e.nodeType);return null}function be(e,t){return(e.matches||e.matchesSelector||e.msMatchesSelector).call(e,t)}function De(e,t){for(var n=e instanceof HTMLElement?[e]:e,r=[],o=0;o<n.length;o+=1)for(var i=n[o].querySelectorAll(t),a=0;a<i.length;a+=1)r.push(i[a]);return r}var Ce=/(top|left|right|bottom|width|height)$/i;function we(e,t){for(var n in t)Re(e,n,t[n])}function Re(e,t,n){null==n?e.style[t]="":"number"==typeof n&&Ce.test(t)?e.style[t]=n+"px":e.style[t]=n}function _e(e){var t,n;return null!==(n=null===(t=e.composedPath)||void 0===t?void 0:t.call(e)[0])&&void 0!==n?n:e.target}function Te(e){return e.getRootNode?e.getRootNode():document}var ke=0;function xe(){return"fc-dom-"+(ke+=1)}function Me(e){e.preventDefault()}function Ie(e,t,n,r){var o=function(e,t){return function(n){var r=Se(n.target,e);r&&t.call(r,n,r)}}(n,r);return e.addEventListener(t,o),function(){e.removeEventListener(t,o)}}var Pe=["webkitTransitionEnd","otransitionend","oTransitionEnd","msTransitionEnd","transitionend"];function Ne(e,t){var n=function(r){t(r),Pe.forEach((function(t){e.removeEventListener(t,n)}))};Pe.forEach((function(t){e.addEventListener(t,n)}))}function He(e){return r({onClick:e},Oe(e))}function Oe(e){return{tabIndex:0,onKeyDown:function(t){"Enter"!==t.key&&" "!==t.key||(e(t),t.preventDefault())}}}var Ae=0;function Le(){return String(Ae+=1)}function Ue(){document.body.classList.add("fc-not-allowed")}function We(){document.body.classList.remove("fc-not-allowed")}function Ve(e){e.classList.add("fc-unselectable"),e.addEventListener("selectstart",Me)}function Fe(e){e.classList.remove("fc-unselectable"),e.removeEventListener("selectstart",Me)}function Be(e){e.addEventListener("contextmenu",Me)}function ze(e){e.removeEventListener("contextmenu",Me)}function je(e){var t,n,r=[],o=[];for("string"==typeof e?o=e.split(/\s*,\s*/):"function"==typeof e?o=[e]:Array.isArray(e)&&(o=e),t=0;t<o.length;t+=1)"string"==typeof(n=o[t])?r.push("-"===n.charAt(0)?{field:n.substring(1),order:-1}:{field:n,order:1}):"function"==typeof n&&r.push({func:n});return r}function Ge(e,t,n){var r,o;for(r=0;r<n.length;r+=1)if(o=qe(e,t,n[r]))return o;return 0}function qe(e,t,n){return n.func?n.func(e,t):Ye(e[n.field],t[n.field])*(n.order||1)}function Ye(e,t){return e||t?null==t?-1:null==e?1:"string"==typeof e||"string"==typeof t?String(e).localeCompare(String(t)):e-t:0}function Ze(e,t){var n=String(e);return"000".substr(0,t-n.length)+n}function Xe(e,t,n){return"function"==typeof e?e.apply(void 0,t):"string"==typeof e?t.reduce((function(e,t,n){return e.replace("$"+n,t||"")}),e):n}function Ke(e,t){return e-t}function $e(e){return e%1==0}function Je(e){var t=e.querySelector(".fc-scrollgrid-shrink-frame"),n=e.querySelector(".fc-scrollgrid-shrink-cushion");if(!t)throw new Error("needs fc-scrollgrid-shrink-frame className");if(!n)throw new Error("needs fc-scrollgrid-shrink-cushion className");return e.getBoundingClientRect().width-t.getBoundingClientRect().width+n.getBoundingClientRect().width}var Qe=["sun","mon","tue","wed","thu","fri","sat"];function et(e,t){var n=ft(e);return n[2]+=7*t,ht(n)}function tt(e,t){var n=ft(e);return n[2]+=t,ht(n)}function nt(e,t){var n=ft(e);return n[6]+=t,ht(n)}function rt(e,t){return ot(e,t)/7}function ot(e,t){return(t.valueOf()-e.valueOf())/864e5}function it(e,t){var n=lt(e),r=lt(t);return{years:0,months:0,days:Math.round(ot(n,r)),milliseconds:t.valueOf()-r.valueOf()-(e.valueOf()-n.valueOf())}}function at(e,t){var n=st(e,t);return null!==n&&n%7==0?n/7:null}function st(e,t){return gt(e)===gt(t)?Math.round(ot(e,t)):null}function lt(e){return ht([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()])}function ut(e,t,n,r){var o=ht([t,0,1+ct(t,n,r)]),i=lt(e),a=Math.round(ot(o,i));return Math.floor(a/7)+1}function ct(e,t,n){var r=7+t-n;return-((7+ht([e,0,r]).getUTCDay()-t)%7)+r-1}function dt(e){return[e.getFullYear(),e.getMonth(),e.getDate(),e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds()]}function pt(e){return new Date(e[0],e[1]||0,null==e[2]?1:e[2],e[3]||0,e[4]||0,e[5]||0)}function ft(e){return[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds()]}function ht(e){return 1===e.length&&(e=e.concat([0])),new Date(Date.UTC.apply(Date,e))}function vt(e){return!isNaN(e.valueOf())}function gt(e){return 1e3*e.getUTCHours()*60*60+1e3*e.getUTCMinutes()*60+1e3*e.getUTCSeconds()+e.getUTCMilliseconds()}function mt(e,t,n,r){return{instanceId:Le(),defId:e,range:t,forcedStartTzo:null==n?null:n,forcedEndTzo:null==r?null:r}}var yt=Object.prototype.hasOwnProperty;function Et(e,t){var n={};if(t)for(var r in t){for(var o=[],i=e.length-1;i>=0;i-=1){var a=e[i][r];if("object"==typeof a&&a)o.unshift(a);else if(void 0!==a){n[r]=a;break}}o.length&&(n[r]=Et(o))}for(i=e.length-1;i>=0;i-=1){var s=e[i];for(var l in s)l in n||(n[l]=s[l])}return n}function St(e,t){var n={};for(var r in e)t(e[r],r)&&(n[r]=e[r]);return n}function bt(e,t){var n={};for(var r in e)n[r]=t(e[r],r);return n}function Dt(e){for(var t={},n=0,r=e;n<r.length;n++){t[r[n]]=!0}return t}function Ct(e){var t=[];for(var n in e)t.push(e[n]);return t}function wt(e,t){if(e===t)return!0;for(var n in e)if(yt.call(e,n)&&!(n in t))return!1;for(var n in t)if(yt.call(t,n)&&e[n]!==t[n])return!1;return!0}function Rt(e,t){var n=[];for(var r in e)yt.call(e,r)&&(r in t||n.push(r));for(var r in t)yt.call(t,r)&&e[r]!==t[r]&&n.push(r);return n}function _t(e,t,n){if(void 0===n&&(n={}),e===t)return!0;for(var r in t)if(!(r in e)||!Tt(e[r],t[r],n[r]))return!1;for(var r in e)if(!(r in t))return!1;return!0}function Tt(e,t,n){return e===t||!0===n||!!n&&n(e,t)}function kt(e,t,n,r){void 0===t&&(t=0),void 0===r&&(r=1);var o=[];null==n&&(n=Object.keys(e).length);for(var i=t;i<n;i+=r){var a=e[i];void 0!==a&&o.push(a)}return o}function xt(e,t,n){var r=n.dateEnv,o=n.pluginHooks,i=n.options,a=e.defs,s=e.instances;for(var l in s=St(s,(function(e){return!a[e.defId].recurringDef})),a){var u=a[l];if(u.recurringDef){var c=u.recurringDef.duration;c||(c=u.allDay?i.defaultAllDayEventDuration:i.defaultTimedEventDuration);for(var d=0,p=Mt(u,c,t,r,o.recurringTypes);d<p.length;d++){var f=p[d],h=mt(l,{start:f,end:r.add(f,c)});s[h.instanceId]=h}}}return{defs:a,instances:s}}function Mt(e,t,n,r,o){var i=o[e.recurringDef.typeId].expand(e.recurringDef.typeData,{start:r.subtract(n.start,t),end:n.end},r);return e.allDay&&(i=i.map(lt)),i}var It=["years","months","days","milliseconds"],Pt=/^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/;function Nt(e,t){var n;return"string"==typeof e?function(e){var t=Pt.exec(e);if(t){var n=t[1]?-1:1;return{years:0,months:0,days:n*(t[2]?parseInt(t[2],10):0),milliseconds:n*(60*(t[3]?parseInt(t[3],10):0)*60*1e3+60*(t[4]?parseInt(t[4],10):0)*1e3+1e3*(t[5]?parseInt(t[5],10):0)+(t[6]?parseInt(t[6],10):0))}}return null}(e):"object"==typeof e&&e?Ht(e):"number"==typeof e?Ht(((n={})[t||"milliseconds"]=e,n)):null}function Ht(e){var t={years:e.years||e.year||0,months:e.months||e.month||0,days:e.days||e.day||0,milliseconds:60*(e.hours||e.hour||0)*60*1e3+60*(e.minutes||e.minute||0)*1e3+1e3*(e.seconds||e.second||0)+(e.milliseconds||e.millisecond||e.ms||0)},n=e.weeks||e.week;return n&&(t.days+=7*n,t.specifiedWeeks=!0),t}function Ot(e,t){return{years:e.years+t.years,months:e.months+t.months,days:e.days+t.days,milliseconds:e.milliseconds+t.milliseconds}}function At(e,t){return{years:e.years*t,months:e.months*t,days:e.days*t,milliseconds:e.milliseconds*t}}function Lt(e){return Ut(e)/864e5}function Ut(e){return 31536e6*e.years+2592e6*e.months+864e5*e.days+e.milliseconds}function Wt(e,t){for(var n=null,r=0;r<It.length;r+=1){var o=It[r];if(t[o]){var i=e[o]/t[o];if(!$e(i)||null!==n&&n!==i)return null;n=i}else if(e[o])return null}return n}function Vt(e){var t=e.milliseconds;if(t){if(t%1e3!=0)return{unit:"millisecond",value:t};if(t%6e4!=0)return{unit:"second",value:t/1e3};if(t%36e5!=0)return{unit:"minute",value:t/6e4};if(t)return{unit:"hour",value:t/36e5}}return e.days?e.specifiedWeeks&&e.days%7==0?{unit:"week",value:e.days/7}:{unit:"day",value:e.days}:e.months?{unit:"month",value:e.months}:e.years?{unit:"year",value:e.years}:{unit:"millisecond",value:0}}function Ft(e,t,n){void 0===n&&(n=!1);var r=e.toISOString();return r=r.replace(".000",""),n&&(r=r.replace("T00:00:00Z","")),r.length>10&&(null==t?r=r.replace("Z",""):0!==t&&(r=r.replace("Z",jt(t,!0)))),r}function Bt(e){return e.toISOString().replace(/T.*$/,"")}function zt(e){return Ze(e.getUTCHours(),2)+":"+Ze(e.getUTCMinutes(),2)+":"+Ze(e.getUTCSeconds(),2)}function jt(e,t){void 0===t&&(t=!1);var n=e<0?"-":"+",r=Math.abs(e),o=Math.floor(r/60),i=Math.round(r%60);return t?n+Ze(o,2)+":"+Ze(i,2):"GMT"+n+o+(i?":"+Ze(i,2):"")}function Gt(e,t,n){if(e===t)return!0;var r,o=e.length;if(o!==t.length)return!1;for(r=0;r<o;r+=1)if(!(n?n(e[r],t[r]):e[r]===t[r]))return!1;return!0}function qt(e,t,n){var r,o;return function(){for(var i=[],a=0;a<arguments.length;a++)i[a]=arguments[a];if(r){if(!Gt(r,i)){n&&n(o);var s=e.apply(this,i);t&&t(s,o)||(o=s)}}else o=e.apply(this,i);return r=i,o}}function Yt(e,t,n){var r,o,i=this;return function(a){if(r){if(!wt(r,a)){n&&n(o);var s=e.call(i,a);t&&t(s,o)||(o=s)}}else o=e.call(i,a);return r=a,o}}var Zt={week:3,separator:0,omitZeroMinute:0,meridiem:0,omitCommas:0},Xt={timeZoneName:7,era:6,year:5,month:4,day:2,weekday:2,hour:1,minute:1,second:1},Kt=/\s*([ap])\.?m\.?/i,$t=/,/g,Jt=/\s+/g,Qt=/\u200e/g,en=/UTC|GMT/,tn=function(){function e(e){var t={},n={},r=0;for(var o in e)o in Zt?(n[o]=e[o],r=Math.max(Zt[o],r)):(t[o]=e[o],o in Xt&&(r=Math.max(Xt[o],r)));this.standardDateProps=t,this.extendedSettings=n,this.severity=r,this.buildFormattingFunc=qt(nn)}return e.prototype.format=function(e,t){return this.buildFormattingFunc(this.standardDateProps,this.extendedSettings,t)(e)},e.prototype.formatRange=function(e,t,n,r){var o=this.standardDateProps,i=this.extendedSettings,a=function(e,t,n){if(n.getMarkerYear(e)!==n.getMarkerYear(t))return 5;if(n.getMarkerMonth(e)!==n.getMarkerMonth(t))return 4;if(n.getMarkerDay(e)!==n.getMarkerDay(t))return 2;if(gt(e)!==gt(t))return 1;return 0}(e.marker,t.marker,n.calendarSystem);if(!a)return this.format(e,n);var s=a;!(s>1)||"numeric"!==o.year&&"2-digit"!==o.year||"numeric"!==o.month&&"2-digit"!==o.month||"numeric"!==o.day&&"2-digit"!==o.day||(s=1);var l=this.format(e,n),u=this.format(t,n);if(l===u)return l;var c=nn(function(e,t){var n={};for(var r in e)(!(r in Xt)||Xt[r]<=t)&&(n[r]=e[r]);return n}(o,s),i,n),d=c(e),p=c(t),f=function(e,t,n,r){var o=0;for(;o<e.length;){var i=e.indexOf(t,o);if(-1===i)break;var a=e.substr(0,i);o=i+t.length;for(var s=e.substr(o),l=0;l<n.length;){var u=n.indexOf(r,l);if(-1===u)break;var c=n.substr(0,u);l=u+r.length;var d=n.substr(l);if(a===c&&s===d)return{before:a,after:s}}}return null}(l,d,u,p),h=i.separator||r||n.defaultSeparator||"";return f?f.before+d+h+p+f.after:l+h+u},e.prototype.getLargestUnit=function(){switch(this.severity){case 7:case 6:case 5:return"year";case 4:return"month";case 3:return"week";case 2:return"day";default:return"time"}},e}();function nn(e,t,n){var o=Object.keys(e).length;return 1===o&&"short"===e.timeZoneName?function(e){return jt(e.timeZoneOffset)}:0===o&&t.week?function(e){return function(e,t,n,r,o){var i=[];"long"===o?i.push(n):"short"!==o&&"narrow"!==o||i.push(t);"long"!==o&&"short"!==o||i.push(" ");i.push(r.simpleNumberFormat.format(e)),"rtl"===r.options.direction&&i.reverse();return i.join("")}(n.computeWeekNumber(e.marker),n.weekText,n.weekTextLong,n.locale,t.week)}:function(e,t,n){e=r({},e),t=r({},t),function(e,t){e.timeZoneName&&(e.hour||(e.hour="2-digit"),e.minute||(e.minute="2-digit"));"long"===e.timeZoneName&&(e.timeZoneName="short");t.omitZeroMinute&&(e.second||e.millisecond)&&delete t.omitZeroMinute}(e,t),e.timeZone="UTC";var o,i=new Intl.DateTimeFormat(n.locale.codes,e);if(t.omitZeroMinute){var a=r({},e);delete a.minute,o=new Intl.DateTimeFormat(n.locale.codes,a)}return function(r){var a=r.marker;return function(e,t,n,r,o){e=e.replace(Qt,""),"short"===n.timeZoneName&&(e=function(e,t){var n=!1;e=e.replace(en,(function(){return n=!0,t})),n||(e+=" "+t);return e}(e,"UTC"===o.timeZone||null==t.timeZoneOffset?"UTC":jt(t.timeZoneOffset)));r.omitCommas&&(e=e.replace($t,"").trim());r.omitZeroMinute&&(e=e.replace(":00",""));!1===r.meridiem?e=e.replace(Kt,"").trim():"narrow"===r.meridiem?e=e.replace(Kt,(function(e,t){return t.toLocaleLowerCase()})):"short"===r.meridiem?e=e.replace(Kt,(function(e,t){return t.toLocaleLowerCase()+"m"})):"lowercase"===r.meridiem&&(e=e.replace(Kt,(function(e){return e.toLocaleLowerCase()})));return e=(e=e.replace(Jt," ")).trim()}((o&&!a.getUTCMinutes()?o:i).format(a),r,e,t,n)}}(e,t,n)}function rn(e,t){var n=t.markerToArray(e.marker);return{marker:e.marker,timeZoneOffset:e.timeZoneOffset,array:n,year:n[0],month:n[1],day:n[2],hour:n[3],minute:n[4],second:n[5],millisecond:n[6]}}function on(e,t,n,r){var o=rn(e,n.calendarSystem);return{date:o,start:o,end:t?rn(t,n.calendarSystem):null,timeZone:n.timeZone,localeCodes:n.locale.codes,defaultSeparator:r||n.defaultSeparator}}var an=function(){function e(e){this.cmdStr=e}return e.prototype.format=function(e,t,n){return t.cmdFormatter(this.cmdStr,on(e,null,t,n))},e.prototype.formatRange=function(e,t,n,r){return n.cmdFormatter(this.cmdStr,on(e,t,n,r))},e}(),sn=function(){function e(e){this.func=e}return e.prototype.format=function(e,t,n){return this.func(on(e,null,t,n))},e.prototype.formatRange=function(e,t,n,r){return this.func(on(e,t,n,r))},e}();function ln(e){return"object"==typeof e&&e?new tn(e):"string"==typeof e?new an(e):"function"==typeof e?new sn(e):null}var un={navLinkDayClick:yn,navLinkWeekClick:yn,duration:Nt,bootstrapFontAwesome:yn,buttonIcons:yn,customButtons:yn,defaultAllDayEventDuration:Nt,defaultTimedEventDuration:Nt,nextDayThreshold:Nt,scrollTime:Nt,scrollTimeReset:Boolean,slotMinTime:Nt,slotMaxTime:Nt,dayPopoverFormat:ln,slotDuration:Nt,snapDuration:Nt,headerToolbar:yn,footerToolbar:yn,defaultRangeSeparator:String,titleRangeSeparator:String,forceEventDuration:Boolean,dayHeaders:Boolean,dayHeaderFormat:ln,dayHeaderClassNames:yn,dayHeaderContent:yn,dayHeaderDidMount:yn,dayHeaderWillUnmount:yn,dayCellClassNames:yn,dayCellContent:yn,dayCellDidMount:yn,dayCellWillUnmount:yn,initialView:String,aspectRatio:Number,weekends:Boolean,weekNumberCalculation:yn,weekNumbers:Boolean,weekNumberClassNames:yn,weekNumberContent:yn,weekNumberDidMount:yn,weekNumberWillUnmount:yn,editable:Boolean,viewClassNames:yn,viewDidMount:yn,viewWillUnmount:yn,nowIndicator:Boolean,nowIndicatorClassNames:yn,nowIndicatorContent:yn,nowIndicatorDidMount:yn,nowIndicatorWillUnmount:yn,showNonCurrentDates:Boolean,lazyFetching:Boolean,startParam:String,endParam:String,timeZoneParam:String,timeZone:String,locales:yn,locale:yn,themeSystem:String,dragRevertDuration:Number,dragScroll:Boolean,allDayMaintainDuration:Boolean,unselectAuto:Boolean,dropAccept:yn,eventOrder:je,eventOrderStrict:Boolean,handleWindowResize:Boolean,windowResizeDelay:Number,longPressDelay:Number,eventDragMinDistance:Number,expandRows:Boolean,height:yn,contentHeight:yn,direction:String,weekNumberFormat:ln,eventResizableFromStart:Boolean,displayEventTime:Boolean,displayEventEnd:Boolean,weekText:String,weekTextLong:String,progressiveEventRendering:Boolean,businessHours:yn,initialDate:yn,now:yn,eventDataTransform:yn,stickyHeaderDates:yn,stickyFooterScrollbar:yn,viewHeight:yn,defaultAllDay:Boolean,eventSourceFailure:yn,eventSourceSuccess:yn,eventDisplay:String,eventStartEditable:Boolean,eventDurationEditable:Boolean,eventOverlap:yn,eventConstraint:yn,eventAllow:yn,eventBackgroundColor:String,eventBorderColor:String,eventTextColor:String,eventColor:String,eventClassNames:yn,eventContent:yn,eventDidMount:yn,eventWillUnmount:yn,selectConstraint:yn,selectOverlap:yn,selectAllow:yn,droppable:Boolean,unselectCancel:String,slotLabelFormat:yn,slotLaneClassNames:yn,slotLaneContent:yn,slotLaneDidMount:yn,slotLaneWillUnmount:yn,slotLabelClassNames:yn,slotLabelContent:yn,slotLabelDidMount:yn,slotLabelWillUnmount:yn,dayMaxEvents:yn,dayMaxEventRows:yn,dayMinWidth:Number,slotLabelInterval:Nt,allDayText:String,allDayClassNames:yn,allDayContent:yn,allDayDidMount:yn,allDayWillUnmount:yn,slotMinWidth:Number,navLinks:Boolean,eventTimeFormat:ln,rerenderDelay:Number,moreLinkText:yn,moreLinkHint:yn,selectMinDistance:Number,selectable:Boolean,selectLongPressDelay:Number,eventLongPressDelay:Number,selectMirror:Boolean,eventMaxStack:Number,eventMinHeight:Number,eventMinWidth:Number,eventShortHeight:Number,slotEventOverlap:Boolean,plugins:yn,firstDay:Number,dayCount:Number,dateAlignment:String,dateIncrement:Nt,hiddenDays:yn,monthMode:Boolean,fixedWeekCount:Boolean,validRange:yn,visibleRange:yn,titleFormat:yn,eventInteractive:Boolean,noEventsText:String,viewHint:yn,navLinkHint:yn,closeHint:String,timeHint:String,eventHint:String,moreLinkClick:yn,moreLinkClassNames:yn,moreLinkContent:yn,moreLinkDidMount:yn,moreLinkWillUnmount:yn},cn={eventDisplay:"auto",defaultRangeSeparator:" - ",titleRangeSeparator:" – ",defaultTimedEventDuration:"01:00:00",defaultAllDayEventDuration:{day:1},forceEventDuration:!1,nextDayThreshold:"00:00:00",dayHeaders:!0,initialView:"",aspectRatio:1.35,headerToolbar:{start:"title",center:"",end:"today prev,next"},weekends:!0,weekNumbers:!1,weekNumberCalculation:"local",editable:!1,nowIndicator:!1,scrollTime:"06:00:00",scrollTimeReset:!0,slotMinTime:"00:00:00",slotMaxTime:"24:00:00",showNonCurrentDates:!0,lazyFetching:!0,startParam:"start",endParam:"end",timeZoneParam:"timeZone",timeZone:"local",locales:[],locale:"",themeSystem:"standard",dragRevertDuration:500,dragScroll:!0,allDayMaintainDuration:!1,unselectAuto:!0,dropAccept:"*",eventOrder:"start,-duration,allDay,title",dayPopoverFormat:{month:"long",day:"numeric",year:"numeric"},handleWindowResize:!0,windowResizeDelay:100,longPressDelay:1e3,eventDragMinDistance:5,expandRows:!1,navLinks:!1,selectable:!1,eventMinHeight:15,eventMinWidth:30,eventShortHeight:30},dn={datesSet:yn,eventsSet:yn,eventAdd:yn,eventChange:yn,eventRemove:yn,windowResize:yn,eventClick:yn,eventMouseEnter:yn,eventMouseLeave:yn,select:yn,unselect:yn,loading:yn,_unmount:yn,_beforeprint:yn,_afterprint:yn,_noEventDrop:yn,_noEventResize:yn,_resize:yn,_scrollRequest:yn},pn={buttonText:yn,buttonHints:yn,views:yn,plugins:yn,initialEvents:yn,events:yn,eventSources:yn},fn={headerToolbar:hn,footerToolbar:hn,buttonText:hn,buttonHints:hn,buttonIcons:hn};function hn(e,t){return"object"==typeof e&&"object"==typeof t&&e&&t?wt(e,t):e===t}var vn={type:String,component:yn,buttonText:String,buttonTextKey:String,dateProfileGeneratorClass:yn,usesMinMaxTime:Boolean,classNames:yn,content:yn,didMount:yn,willUnmount:yn};function gn(e){return Et(e,fn)}function mn(e,t){var n={},r={};for(var o in t)o in e&&(n[o]=t[o](e[o]));for(var o in e)o in t||(r[o]=e[o]);return{refined:n,extra:r}}function yn(e){return e}function En(e,t,n,r){for(var o={defs:{},instances:{}},i=An(n),a=0,s=e;a<s.length;a++){var l=Hn(s[a],t,n,r,i);l&&Sn(l,o)}return o}function Sn(e,t){return void 0===t&&(t={defs:{},instances:{}}),t.defs[e.def.defId]=e.def,e.instance&&(t.instances[e.instance.instanceId]=e.instance),t}function bn(e,t){var n=e.instances[t];if(n){var r=e.defs[n.defId],o=wn(e,(function(e){return t=r,n=e,Boolean(t.groupId&&t.groupId===n.groupId);var t,n}));return o.defs[r.defId]=r,o.instances[n.instanceId]=n,o}return{defs:{},instances:{}}}function Dn(){return{defs:{},instances:{}}}function Cn(e,t){return{defs:r(r({},e.defs),t.defs),instances:r(r({},e.instances),t.instances)}}function wn(e,t){var n=St(e.defs,t),r=St(e.instances,(function(e){return n[e.defId]}));return{defs:n,instances:r}}function Rn(e){return Array.isArray(e)?e:"string"==typeof e?e.split(/\s+/):[]}var _n={display:String,editable:Boolean,startEditable:Boolean,durationEditable:Boolean,constraint:yn,overlap:yn,allow:yn,className:Rn,classNames:Rn,color:String,backgroundColor:String,borderColor:String,textColor:String},Tn={display:null,startEditable:null,durationEditable:null,constraints:[],overlap:null,allows:[],backgroundColor:"",borderColor:"",textColor:"",classNames:[]};function kn(e,t){var n=function(e,t){return Array.isArray(e)?En(e,null,t,!0):"object"==typeof e&&e?En([e],null,t,!0):null!=e?String(e):null}(e.constraint,t);return{display:e.display||null,startEditable:null!=e.startEditable?e.startEditable:e.editable,durationEditable:null!=e.durationEditable?e.durationEditable:e.editable,constraints:null!=n?[n]:[],overlap:null!=e.overlap?e.overlap:null,allows:null!=e.allow?[e.allow]:[],backgroundColor:e.backgroundColor||e.color||"",borderColor:e.borderColor||e.color||"",textColor:e.textColor||"",classNames:(e.className||[]).concat(e.classNames||[])}}function xn(e){return e.reduce(Mn,Tn)}function Mn(e,t){return{display:null!=t.display?t.display:e.display,startEditable:null!=t.startEditable?t.startEditable:e.startEditable,durationEditable:null!=t.durationEditable?t.durationEditable:e.durationEditable,constraints:e.constraints.concat(t.constraints),overlap:"boolean"==typeof t.overlap?t.overlap:e.overlap,allows:e.allows.concat(t.allows),backgroundColor:t.backgroundColor||e.backgroundColor,borderColor:t.borderColor||e.borderColor,textColor:t.textColor||e.textColor,classNames:e.classNames.concat(t.classNames)}}var In={id:String,groupId:String,title:String,url:String,interactive:Boolean},Pn={start:yn,end:yn,date:yn,allDay:Boolean},Nn=r(r(r({},In),Pn),{extendedProps:yn});function Hn(e,t,n,r,o){void 0===o&&(o=An(n));var i=On(e,n,o),a=i.refined,s=i.extra,l=function(e,t){var n=null;e&&(n=e.defaultAllDay);null==n&&(n=t.options.defaultAllDay);return n}(t,n),u=function(e,t,n,r){for(var o=0;o<r.length;o+=1){var i=r[o].parse(e,n);if(i){var a=e.allDay;return null==a&&null==(a=t)&&null==(a=i.allDayGuess)&&(a=!1),{allDay:a,duration:i.duration,typeData:i.typeData,typeId:o}}}return null}(a,l,n.dateEnv,n.pluginHooks.recurringTypes);if(u)return(c=Ln(a,s,t?t.sourceId:"",u.allDay,Boolean(u.duration),n)).recurringDef={typeId:u.typeId,typeData:u.typeData,duration:u.duration},{def:c,instance:null};var c,d=function(e,t,n,r){var o,i,a=e.allDay,s=null,l=!1,u=null,c=null!=e.start?e.start:e.date;if(o=n.dateEnv.createMarkerMeta(c))s=o.marker;else if(!r)return null;null!=e.end&&(i=n.dateEnv.createMarkerMeta(e.end));null==a&&(a=null!=t?t:(!o||o.isTimeUnspecified)&&(!i||i.isTimeUnspecified));a&&s&&(s=lt(s));i&&(u=i.marker,a&&(u=lt(u)),s&&u<=s&&(u=null));u?l=!0:r||(l=n.options.forceEventDuration||!1,u=n.dateEnv.add(s,a?n.options.defaultAllDayEventDuration:n.options.defaultTimedEventDuration));return{allDay:a,hasEnd:l,range:{start:s,end:u},forcedStartTzo:o?o.forcedTzo:null,forcedEndTzo:i?i.forcedTzo:null}}(a,l,n,r);return d?{def:c=Ln(a,s,t?t.sourceId:"",d.allDay,d.hasEnd,n),instance:mt(c.defId,d.range,d.forcedStartTzo,d.forcedEndTzo)}:null}function On(e,t,n){return void 0===n&&(n=An(t)),mn(e,n)}function An(e){return r(r(r({},_n),Nn),e.pluginHooks.eventRefiners)}function Ln(e,t,n,o,i,a){for(var s={title:e.title||"",groupId:e.groupId||"",publicId:e.id||"",url:e.url||"",recurringDef:null,defId:Le(),sourceId:n,allDay:o,hasEnd:i,interactive:e.interactive,ui:kn(e,a),extendedProps:r(r({},e.extendedProps||{}),t)},l=0,u=a.pluginHooks.eventDefMemberAdders;l<u.length;l++){var c=u[l];r(s,c(e))}return Object.freeze(s.ui.classNames),Object.freeze(s.extendedProps),s}function Un(e){var t=Math.floor(ot(e.start,e.end))||1,n=lt(e.start);return{start:n,end:tt(n,t)}}function Wn(e,t){void 0===t&&(t=Nt(0));var n=null,r=null;if(e.end){r=lt(e.end);var o=e.end.valueOf()-r.valueOf();o&&o>=Ut(t)&&(r=tt(r,1))}return e.start&&(n=lt(e.start),r&&r<=n&&(r=tt(n,1))),{start:n,end:r}}function Vn(e){var t=Wn(e);return ot(t.start,t.end)>1}function Fn(e,t,n,r){return"year"===r?Nt(n.diffWholeYears(e,t),"year"):"month"===r?Nt(n.diffWholeMonths(e,t),"month"):it(e,t)}function Bn(e,t){var n,r,o=[],i=t.start;for(e.sort(zn),n=0;n<e.length;n+=1)(r=e[n]).start>i&&o.push({start:i,end:r.start}),r.end>i&&(i=r.end);return i<t.end&&o.push({start:i,end:t.end}),o}function zn(e,t){return e.start.valueOf()-t.start.valueOf()}function jn(e,t){var n=e.start,r=e.end,o=null;return null!==t.start&&(n=null===n?t.start:new Date(Math.max(n.valueOf(),t.start.valueOf()))),null!=t.end&&(r=null===r?t.end:new Date(Math.min(r.valueOf(),t.end.valueOf()))),(null===n||null===r||n<r)&&(o={start:n,end:r}),o}function Gn(e,t){return(null===e.start?null:e.start.valueOf())===(null===t.start?null:t.start.valueOf())&&(null===e.end?null:e.end.valueOf())===(null===t.end?null:t.end.valueOf())}function qn(e,t){return(null===e.end||null===t.start||e.end>t.start)&&(null===e.start||null===t.end||e.start<t.end)}function Yn(e,t){return(null===e.start||null!==t.start&&t.start>=e.start)&&(null===e.end||null!==t.end&&t.end<=e.end)}function Zn(e,t){return(null===e.start||t>=e.start)&&(null===e.end||t<e.end)}function Xn(e,t,n,r){var o={},i={},a={},s=[],l=[],u=Qn(e.defs,t);for(var c in e.defs){"inverse-background"===(f=u[(S=e.defs[c]).defId]).display&&(S.groupId?(o[S.groupId]=[],a[S.groupId]||(a[S.groupId]=S)):i[c]=[])}for(var d in e.instances){var p=e.instances[d],f=u[(S=e.defs[p.defId]).defId],h=p.range,v=!S.allDay&&r?Wn(h,r):h,g=jn(v,n);g&&("inverse-background"===f.display?S.groupId?o[S.groupId].push(g):i[p.defId].push(g):"none"!==f.display&&("background"===f.display?s:l).push({def:S,ui:f,instance:p,range:g,isStart:v.start&&v.start.valueOf()===g.start.valueOf(),isEnd:v.end&&v.end.valueOf()===g.end.valueOf()}))}for(var m in o)for(var y=0,E=Bn(o[m],n);y<E.length;y++){var S,b=E[y];f=u[(S=a[m]).defId];s.push({def:S,ui:f,instance:null,range:b,isStart:!1,isEnd:!1})}for(var c in i)for(var D=0,C=Bn(i[c],n);D<C.length;D++){b=C[D];s.push({def:e.defs[c],ui:u[c],instance:null,range:b,isStart:!1,isEnd:!1})}return{bg:s,fg:l}}function Kn(e){return"background"===e.ui.display||"inverse-background"===e.ui.display}function $n(e,t){e.fcSeg=t}function Jn(e){return e.fcSeg||e.parentNode.fcSeg||null}function Qn(e,t){return bt(e,(function(e){return er(e,t)}))}function er(e,t){var n=[];return t[""]&&n.push(t[""]),t[e.defId]&&n.push(t[e.defId]),n.push(e.ui),xn(n)}function tr(e,t){var n=e.map(nr);return n.sort((function(e,n){return Ge(e,n,t)})),n.map((function(e){return e._seg}))}function nr(e){var t=e.eventRange,n=t.def,o=t.instance?t.instance.range:t.range,i=o.start?o.start.valueOf():0,a=o.end?o.end.valueOf():0;return r(r(r({},n.extendedProps),n),{id:n.publicId,start:i,end:a,duration:a-i,allDay:Number(n.allDay),_seg:e})}function rr(e,t){for(var n=t.pluginHooks.isDraggableTransformers,r=e.eventRange,o=r.def,i=r.ui,a=i.startEditable,s=0,l=n;s<l.length;s++){a=(0,l[s])(a,o,i,t)}return a}function or(e,t){return e.isStart&&e.eventRange.ui.durationEditable&&t.options.eventResizableFromStart}function ir(e,t){return e.isEnd&&e.eventRange.ui.durationEditable}function ar(e,t,n,r,o,i,a){var s=n.dateEnv,l=n.options,u=l.displayEventTime,c=l.displayEventEnd,d=e.eventRange.def,p=e.eventRange.instance;null==u&&(u=!1!==r),null==c&&(c=!1!==o);var f=p.range.start,h=p.range.end,v=i||e.start||e.eventRange.range.start,g=a||e.end||e.eventRange.range.end,m=lt(f).valueOf()===lt(v).valueOf(),y=lt(nt(h,-1)).valueOf()===lt(nt(g,-1)).valueOf();return u&&!d.allDay&&(m||y)?(v=m?f:v,g=y?h:g,c&&d.hasEnd?s.formatRange(v,g,t,{forcedStartTzo:i?null:p.forcedStartTzo,forcedEndTzo:a?null:p.forcedEndTzo}):s.format(v,t,{forcedTzo:i?null:p.forcedStartTzo})):""}function sr(e,t,n){var r=e.eventRange.range;return{isPast:r.end<(n||t.start),isFuture:r.start>=(n||t.end),isToday:t&&Zn(t,r.start)}}function lr(e){var t=["fc-event"];return e.isMirror&&t.push("fc-event-mirror"),e.isDraggable&&t.push("fc-event-draggable"),(e.isStartResizable||e.isEndResizable)&&t.push("fc-event-resizable"),e.isDragging&&t.push("fc-event-dragging"),e.isResizing&&t.push("fc-event-resizing"),e.isSelected&&t.push("fc-event-selected"),e.isStart&&t.push("fc-event-start"),e.isEnd&&t.push("fc-event-end"),e.isPast&&t.push("fc-event-past"),e.isToday&&t.push("fc-event-today"),e.isFuture&&t.push("fc-event-future"),t}function ur(e){return e.instance?e.instance.instanceId:e.def.defId+":"+e.range.start.toISOString()}function cr(e,t){var n=e.eventRange,r=n.def,o=n.instance,i=r.url;if(i)return{href:i};var a=t.emitter,s=t.options.eventInteractive;return null==s&&null==(s=r.interactive)&&(s=Boolean(a.hasHandlers("eventClick"))),s?Oe((function(e){a.trigger("eventClick",{el:e.target,event:new xr(t,r,o),jsEvent:e,view:t.viewApi})})):{}}var dr={start:yn,end:yn,allDay:Boolean};function pr(e,t,n){var o=function(e,t){var n=mn(e,dr),o=n.refined,i=n.extra,a=o.start?t.createMarkerMeta(o.start):null,s=o.end?t.createMarkerMeta(o.end):null,l=o.allDay;null==l&&(l=a&&a.isTimeUnspecified&&(!s||s.isTimeUnspecified));return r({range:{start:a?a.marker:null,end:s?s.marker:null},allDay:l},i)}(e,t),i=o.range;if(!i.start)return null;if(!i.end){if(null==n)return null;i.end=t.add(i.start,n)}return o}function fr(e,t){return Gn(e.range,t.range)&&e.allDay===t.allDay&&function(e,t){for(var n in t)if("range"!==n&&"allDay"!==n&&e[n]!==t[n])return!1;for(var n in e)if(!(n in t))return!1;return!0}(e,t)}function hr(e,t,n){return r(r({},vr(e,t,n)),{timeZone:t.timeZone})}function vr(e,t,n){return{start:t.toDate(e.start),end:t.toDate(e.end),startStr:t.formatIso(e.start,{omitTime:n}),endStr:t.formatIso(e.end,{omitTime:n})}}function gr(e,t,n){var r=On({editable:!1},n),o=Ln(r.refined,r.extra,"",e.allDay,!0,n);return{def:o,ui:er(o,t),instance:mt(o.defId,e.range),range:e.range,isStart:!0,isEnd:!0}}function mr(e,t,n){n.emitter.trigger("select",r(r({},yr(e,n)),{jsEvent:t?t.origEvent:null,view:n.viewApi||n.calendarApi.view}))}function yr(e,t){for(var n,o,i={},a=0,s=t.pluginHooks.dateSpanTransforms;a<s.length;a++){var l=s[a];r(i,l(e,t))}return r(i,(n=e,o=t.dateEnv,r(r({},vr(n.range,o,n.allDay)),{allDay:n.allDay}))),i}function Er(e,t,n){var r=n.dateEnv,o=n.options,i=t;return e?(i=lt(i),i=r.add(i,o.defaultAllDayEventDuration)):i=r.add(i,o.defaultTimedEventDuration),i}function Sr(e,t,n,r){var o=Qn(e.defs,t),i={defs:{},instances:{}};for(var a in e.defs){var s=e.defs[a];i.defs[a]=br(s,o[a],n,r)}for(var l in e.instances){var u=e.instances[l];s=i.defs[u.defId];i.instances[l]=Dr(u,s,o[u.defId],n,r)}return i}function br(e,t,n,o){var i=n.standardProps||{};null==i.hasEnd&&t.durationEditable&&(n.startDelta||n.endDelta)&&(i.hasEnd=!0);var a=r(r(r({},e),i),{ui:r(r({},e.ui),i.ui)});n.extendedProps&&(a.extendedProps=r(r({},a.extendedProps),n.extendedProps));for(var s=0,l=o.pluginHooks.eventDefMutationAppliers;s<l.length;s++){(0,l[s])(a,n,o)}return!a.hasEnd&&o.options.forceEventDuration&&(a.hasEnd=!0),a}function Dr(e,t,n,o,i){var a=i.dateEnv,s=o.standardProps&&!0===o.standardProps.allDay,l=o.standardProps&&!1===o.standardProps.hasEnd,u=r({},e);return s&&(u.range=Un(u.range)),o.datesDelta&&n.startEditable&&(u.range={start:a.add(u.range.start,o.datesDelta),end:a.add(u.range.end,o.datesDelta)}),o.startDelta&&n.durationEditable&&(u.range={start:a.add(u.range.start,o.startDelta),end:u.range.end}),o.endDelta&&n.durationEditable&&(u.range={start:u.range.start,end:a.add(u.range.end,o.endDelta)}),l&&(u.range={start:u.range.start,end:Er(t.allDay,u.range.start,i)}),t.allDay&&(u.range={start:lt(u.range.start),end:lt(u.range.end)}),u.range.end<u.range.start&&(u.range.end=Er(t.allDay,u.range.start,i)),u}var Cr=function(){function e(e,t,n){this.type=e,this.getCurrentData=t,this.dateEnv=n}return Object.defineProperty(e.prototype,"calendar",{get:function(){return this.getCurrentData().calendarApi},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"title",{get:function(){return this.getCurrentData().viewTitle},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"activeStart",{get:function(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.start)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"activeEnd",{get:function(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.end)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentStart",{get:function(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.start)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentEnd",{get:function(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.end)},enumerable:!1,configurable:!0}),e.prototype.getOption=function(e){return this.getCurrentData().options[e]},e}(),wr={id:String,defaultAllDay:Boolean,url:String,format:String,events:yn,eventDataTransform:yn,success:yn,failure:yn};function Rr(e,t,n){var r;if(void 0===n&&(n=_r(t)),"string"==typeof e?r={url:e}:"function"==typeof e||Array.isArray(e)?r={events:e}:"object"==typeof e&&e&&(r=e),r){var o=mn(r,n),i=o.refined,a=o.extra,s=function(e,t){for(var n=t.pluginHooks.eventSourceDefs,r=n.length-1;r>=0;r-=1){var o=n[r].parseMeta(e);if(o)return{sourceDefId:r,meta:o}}return null}(i,t);if(s)return{_raw:e,isFetching:!1,latestFetchId:"",fetchRange:null,defaultAllDay:i.defaultAllDay,eventDataTransform:i.eventDataTransform,success:i.success,failure:i.failure,publicId:i.id||"",sourceId:Le(),sourceDefId:s.sourceDefId,meta:s.meta,ui:kn(i,t),extendedProps:a}}return null}function _r(e){return r(r(r({},_n),wr),e.pluginHooks.eventSourceRefiners)}function Tr(e,t){return"function"==typeof e&&(e=e()),null==e?t.createNowMarker():t.createMarker(e)}var kr=function(){function e(){}return e.prototype.getCurrentData=function(){return this.currentDataManager.getCurrentData()},e.prototype.dispatch=function(e){return this.currentDataManager.dispatch(e)},Object.defineProperty(e.prototype,"view",{get:function(){return this.getCurrentData().viewApi},enumerable:!1,configurable:!0}),e.prototype.batchRendering=function(e){e()},e.prototype.updateSize=function(){this.trigger("_resize",!0)},e.prototype.setOption=function(e,t){this.dispatch({type:"SET_OPTION",optionName:e,rawOptionValue:t})},e.prototype.getOption=function(e){return this.currentDataManager.currentCalendarOptionsInput[e]},e.prototype.getAvailableLocaleCodes=function(){return Object.keys(this.getCurrentData().availableRawLocales)},e.prototype.on=function(e,t){var n=this.currentDataManager;n.currentCalendarOptionsRefiners[e]?n.emitter.on(e,t):console.warn("Unknown listener name '"+e+"'")},e.prototype.off=function(e,t){this.currentDataManager.emitter.off(e,t)},e.prototype.trigger=function(e){for(var t,n=[],r=1;r<arguments.length;r++)n[r-1]=arguments[r];(t=this.currentDataManager.emitter).trigger.apply(t,o([e],n))},e.prototype.changeView=function(e,t){var n=this;this.batchRendering((function(){if(n.unselect(),t)if(t.start&&t.end)n.dispatch({type:"CHANGE_VIEW_TYPE",viewType:e}),n.dispatch({type:"SET_OPTION",optionName:"visibleRange",rawOptionValue:t});else{var r=n.getCurrentData().dateEnv;n.dispatch({type:"CHANGE_VIEW_TYPE",viewType:e,dateMarker:r.createMarker(t)})}else n.dispatch({type:"CHANGE_VIEW_TYPE",viewType:e})}))},e.prototype.zoomTo=function(e,t){var n;t=t||"day",n=this.getCurrentData().viewSpecs[t]||this.getUnitViewSpec(t),this.unselect(),n?this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:n.type,dateMarker:e}):this.dispatch({type:"CHANGE_DATE",dateMarker:e})},e.prototype.getUnitViewSpec=function(e){var t,n,r=this.getCurrentData(),o=r.viewSpecs,i=r.toolbarConfig,a=[].concat(i.header?i.header.viewsWithButtons:[],i.footer?i.footer.viewsWithButtons:[]);for(var s in o)a.push(s);for(t=0;t<a.length;t+=1)if((n=o[a[t]])&&n.singleUnit===e)return n;return null},e.prototype.prev=function(){this.unselect(),this.dispatch({type:"PREV"})},e.prototype.next=function(){this.unselect(),this.dispatch({type:"NEXT"})},e.prototype.prevYear=function(){var e=this.getCurrentData();this.unselect(),this.dispatch({type:"CHANGE_DATE",dateMarker:e.dateEnv.addYears(e.currentDate,-1)})},e.prototype.nextYear=function(){var e=this.getCurrentData();this.unselect(),this.dispatch({type:"CHANGE_DATE",dateMarker:e.dateEnv.addYears(e.currentDate,1)})},e.prototype.today=function(){var e=this.getCurrentData();this.unselect(),this.dispatch({type:"CHANGE_DATE",dateMarker:Tr(e.calendarOptions.now,e.dateEnv)})},e.prototype.gotoDate=function(e){var t=this.getCurrentData();this.unselect(),this.dispatch({type:"CHANGE_DATE",dateMarker:t.dateEnv.createMarker(e)})},e.prototype.incrementDate=function(e){var t=this.getCurrentData(),n=Nt(e);n&&(this.unselect(),this.dispatch({type:"CHANGE_DATE",dateMarker:t.dateEnv.add(t.currentDate,n)}))},e.prototype.getDate=function(){var e=this.getCurrentData();return e.dateEnv.toDate(e.currentDate)},e.prototype.formatDate=function(e,t){var n=this.getCurrentData().dateEnv;return n.format(n.createMarker(e),ln(t))},e.prototype.formatRange=function(e,t,n){var r=this.getCurrentData().dateEnv;return r.formatRange(r.createMarker(e),r.createMarker(t),ln(n),n)},e.prototype.formatIso=function(e,t){var n=this.getCurrentData().dateEnv;return n.formatIso(n.createMarker(e),{omitTime:t})},e.prototype.select=function(e,t){var n;n=null==t?null!=e.start?e:{start:e,end:null}:{start:e,end:t};var r=this.getCurrentData(),o=pr(n,r.dateEnv,Nt({days:1}));o&&(this.dispatch({type:"SELECT_DATES",selection:o}),mr(o,null,r))},e.prototype.unselect=function(e){var t=this.getCurrentData();t.dateSelection&&(this.dispatch({type:"UNSELECT_DATES"}),function(e,t){t.emitter.trigger("unselect",{jsEvent:e?e.origEvent:null,view:t.viewApi||t.calendarApi.view})}(e,t))},e.prototype.addEvent=function(e,t){if(e instanceof xr){var n=e._def,r=e._instance;return this.getCurrentData().eventStore.defs[n.defId]||(this.dispatch({type:"ADD_EVENTS",eventStore:Sn({def:n,instance:r})}),this.triggerEventAdd(e)),e}var o,i=this.getCurrentData();if(t instanceof ye)o=t.internalEventSource;else if("boolean"==typeof t)t&&(o=Ct(i.eventSources)[0]);else if(null!=t){var a=this.getEventSourceById(t);if(!a)return console.warn('Could not find an event source with ID "'+t+'"'),null;o=a.internalEventSource}var s=Hn(e,o,i,!1);if(s){var l=new xr(i,s.def,s.def.recurringDef?null:s.instance);return this.dispatch({type:"ADD_EVENTS",eventStore:Sn(s)}),this.triggerEventAdd(l),l}return null},e.prototype.triggerEventAdd=function(e){var t=this;this.getCurrentData().emitter.trigger("eventAdd",{event:e,relatedEvents:[],revert:function(){t.dispatch({type:"REMOVE_EVENTS",eventStore:Mr(e)})}})},e.prototype.getEventById=function(e){var t=this.getCurrentData(),n=t.eventStore,r=n.defs,o=n.instances;for(var i in e=String(e),r){var a=r[i];if(a.publicId===e){if(a.recurringDef)return new xr(t,a,null);for(var s in o){var l=o[s];if(l.defId===a.defId)return new xr(t,a,l)}}}return null},e.prototype.getEvents=function(){var e=this.getCurrentData();return Ir(e.eventStore,e)},e.prototype.removeAllEvents=function(){this.dispatch({type:"REMOVE_ALL_EVENTS"})},e.prototype.getEventSources=function(){var e=this.getCurrentData(),t=e.eventSources,n=[];for(var r in t)n.push(new ye(e,t[r]));return n},e.prototype.getEventSourceById=function(e){var t=this.getCurrentData(),n=t.eventSources;for(var r in e=String(e),n)if(n[r].publicId===e)return new ye(t,n[r]);return null},e.prototype.addEventSource=function(e){var t=this.getCurrentData();if(e instanceof ye)return t.eventSources[e.internalEventSource.sourceId]||this.dispatch({type:"ADD_EVENT_SOURCES",sources:[e.internalEventSource]}),e;var n=Rr(e,t);return n?(this.dispatch({type:"ADD_EVENT_SOURCES",sources:[n]}),new ye(t,n)):null},e.prototype.removeAllEventSources=function(){this.dispatch({type:"REMOVE_ALL_EVENT_SOURCES"})},e.prototype.refetchEvents=function(){this.dispatch({type:"FETCH_EVENT_SOURCES",isRefetch:!0})},e.prototype.scrollToTime=function(e){var t=Nt(e);t&&this.trigger("_scrollRequest",{time:t})},e}(),xr=function(){function e(e,t,n){this._context=e,this._def=t,this._instance=n||null}return e.prototype.setProp=function(e,t){var n,r;if(e in Pn)console.warn("Could not set date-related prop 'name'. Use one of the date-related methods instead.");else if("id"===e)t=In[e](t),this.mutate({standardProps:{publicId:t}});else if(e in In)t=In[e](t),this.mutate({standardProps:(n={},n[e]=t,n)});else if(e in _n){var o=_n[e](t);"color"===e?o={backgroundColor:t,borderColor:t}:"editable"===e?o={startEditable:t,durationEditable:t}:((r={})[e]=t,o=r),this.mutate({standardProps:{ui:o}})}else console.warn("Could not set prop '"+e+"'. Use setExtendedProp instead.")},e.prototype.setExtendedProp=function(e,t){var n;this.mutate({extendedProps:(n={},n[e]=t,n)})},e.prototype.setStart=function(e,t){void 0===t&&(t={});var n=this._context.dateEnv,r=n.createMarker(e);if(r&&this._instance){var o=Fn(this._instance.range.start,r,n,t.granularity);t.maintainDuration?this.mutate({datesDelta:o}):this.mutate({startDelta:o})}},e.prototype.setEnd=function(e,t){void 0===t&&(t={});var n,r=this._context.dateEnv;if((null==e||(n=r.createMarker(e)))&&this._instance)if(n){var o=Fn(this._instance.range.end,n,r,t.granularity);this.mutate({endDelta:o})}else this.mutate({standardProps:{hasEnd:!1}})},e.prototype.setDates=function(e,t,n){void 0===n&&(n={});var r,o,i,a=this._context.dateEnv,s={allDay:n.allDay},l=a.createMarker(e);if(l&&((null==t||(r=a.createMarker(t)))&&this._instance)){var u=this._instance.range;!0===n.allDay&&(u=Un(u));var c=Fn(u.start,l,a,n.granularity);if(r){var d=Fn(u.end,r,a,n.granularity);i=d,(o=c).years===i.years&&o.months===i.months&&o.days===i.days&&o.milliseconds===i.milliseconds?this.mutate({datesDelta:c,standardProps:s}):this.mutate({startDelta:c,endDelta:d,standardProps:s})}else s.hasEnd=!1,this.mutate({datesDelta:c,standardProps:s})}},e.prototype.moveStart=function(e){var t=Nt(e);t&&this.mutate({startDelta:t})},e.prototype.moveEnd=function(e){var t=Nt(e);t&&this.mutate({endDelta:t})},e.prototype.moveDates=function(e){var t=Nt(e);t&&this.mutate({datesDelta:t})},e.prototype.setAllDay=function(e,t){void 0===t&&(t={});var n={allDay:e},r=t.maintainDuration;null==r&&(r=this._context.options.allDayMaintainDuration),this._def.allDay!==e&&(n.hasEnd=r),this.mutate({standardProps:n})},e.prototype.formatRange=function(e){var t=this._context.dateEnv,n=this._instance,r=ln(e);return this._def.hasEnd?t.formatRange(n.range.start,n.range.end,r,{forcedStartTzo:n.forcedStartTzo,forcedEndTzo:n.forcedEndTzo}):t.format(n.range.start,r,{forcedTzo:n.forcedStartTzo})},e.prototype.mutate=function(t){var n=this._instance;if(n){var r=this._def,o=this._context,i=o.getCurrentData().eventStore,a=bn(i,n.instanceId);a=Sr(a,{"":{display:"",startEditable:!0,durationEditable:!0,constraints:[],overlap:null,allows:[],backgroundColor:"",borderColor:"",textColor:"",classNames:[]}},t,o);var s=new e(o,r,n);this._def=a.defs[r.defId],this._instance=a.instances[n.instanceId],o.dispatch({type:"MERGE_EVENTS",eventStore:a}),o.emitter.trigger("eventChange",{oldEvent:s,event:this,relatedEvents:Ir(a,o,n),revert:function(){o.dispatch({type:"RESET_EVENTS",eventStore:i})}})}},e.prototype.remove=function(){var e=this._context,t=Mr(this);e.dispatch({type:"REMOVE_EVENTS",eventStore:t}),e.emitter.trigger("eventRemove",{event:this,relatedEvents:[],revert:function(){e.dispatch({type:"MERGE_EVENTS",eventStore:t})}})},Object.defineProperty(e.prototype,"source",{get:function(){var e=this._def.sourceId;return e?new ye(this._context,this._context.getCurrentData().eventSources[e]):null},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"start",{get:function(){return this._instance?this._context.dateEnv.toDate(this._instance.range.start):null},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"end",{get:function(){return this._instance&&this._def.hasEnd?this._context.dateEnv.toDate(this._instance.range.end):null},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"startStr",{get:function(){var e=this._instance;return e?this._context.dateEnv.formatIso(e.range.start,{omitTime:this._def.allDay,forcedTzo:e.forcedStartTzo}):""},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"endStr",{get:function(){var e=this._instance;return e&&this._def.hasEnd?this._context.dateEnv.formatIso(e.range.end,{omitTime:this._def.allDay,forcedTzo:e.forcedEndTzo}):""},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._def.publicId},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"groupId",{get:function(){return this._def.groupId},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"allDay",{get:function(){return this._def.allDay},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"title",{get:function(){return this._def.title},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this._def.url},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"display",{get:function(){return this._def.ui.display||"auto"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"startEditable",{get:function(){return this._def.ui.startEditable},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"durationEditable",{get:function(){return this._def.ui.durationEditable},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"constraint",{get:function(){return this._def.ui.constraints[0]||null},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"overlap",{get:function(){return this._def.ui.overlap},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"allow",{get:function(){return this._def.ui.allows[0]||null},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"backgroundColor",{get:function(){return this._def.ui.backgroundColor},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"borderColor",{get:function(){return this._def.ui.borderColor},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"textColor",{get:function(){return this._def.ui.textColor},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"classNames",{get:function(){return this._def.ui.classNames},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"extendedProps",{get:function(){return this._def.extendedProps},enumerable:!1,configurable:!0}),e.prototype.toPlainObject=function(e){void 0===e&&(e={});var t=this._def,n=t.ui,o=this.startStr,i=this.endStr,a={};return t.title&&(a.title=t.title),o&&(a.start=o),i&&(a.end=i),t.publicId&&(a.id=t.publicId),t.groupId&&(a.groupId=t.groupId),t.url&&(a.url=t.url),n.display&&"auto"!==n.display&&(a.display=n.display),e.collapseColor&&n.backgroundColor&&n.backgroundColor===n.borderColor?a.color=n.backgroundColor:(n.backgroundColor&&(a.backgroundColor=n.backgroundColor),n.borderColor&&(a.borderColor=n.borderColor)),n.textColor&&(a.textColor=n.textColor),n.classNames.length&&(a.classNames=n.classNames),Object.keys(t.extendedProps).length&&(e.collapseExtendedProps?r(a,t.extendedProps):a.extendedProps=t.extendedProps),a},e.prototype.toJSON=function(){return this.toPlainObject()},e}();function Mr(e){var t,n,r=e._def,o=e._instance;return{defs:(t={},t[r.defId]=r,t),instances:o?(n={},n[o.instanceId]=o,n):{}}}function Ir(e,t,n){var r=e.defs,o=e.instances,i=[],a=n?n.instanceId:"";for(var s in o){var l=o[s],u=r[l.defId];l.instanceId!==a&&i.push(new xr(t,u,l))}return i}var Pr={};var Nr,Hr=function(){function e(){}return e.prototype.getMarkerYear=function(e){return e.getUTCFullYear()},e.prototype.getMarkerMonth=function(e){return e.getUTCMonth()},e.prototype.getMarkerDay=function(e){return e.getUTCDate()},e.prototype.arrayToMarker=function(e){return ht(e)},e.prototype.markerToArray=function(e){return ft(e)},e}();Nr=Hr,Pr["gregory"]=Nr;var Or=/^\s*(\d{4})(-?(\d{2})(-?(\d{2})([T ](\d{2}):?(\d{2})(:?(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/;function Ar(e){var t=Or.exec(e);if(t){var n=new Date(Date.UTC(Number(t[1]),t[3]?Number(t[3])-1:0,Number(t[5]||1),Number(t[7]||0),Number(t[8]||0),Number(t[10]||0),t[12]?1e3*Number("0."+t[12]):0));if(vt(n)){var r=null;return t[13]&&(r=("-"===t[15]?-1:1)*(60*Number(t[16]||0)+Number(t[18]||0))),{marker:n,isTimeUnspecified:!t[6],timeZoneOffset:r}}}return null}var Lr=function(){function e(e){var t=this.timeZone=e.timeZone,n="local"!==t&&"UTC"!==t;e.namedTimeZoneImpl&&n&&(this.namedTimeZoneImpl=new e.namedTimeZoneImpl(t)),this.canComputeOffset=Boolean(!n||this.namedTimeZoneImpl),this.calendarSystem=function(e){return new Pr[e]}(e.calendarSystem),this.locale=e.locale,this.weekDow=e.locale.week.dow,this.weekDoy=e.locale.week.doy,"ISO"===e.weekNumberCalculation&&(this.weekDow=1,this.weekDoy=4),"number"==typeof e.firstDay&&(this.weekDow=e.firstDay),"function"==typeof e.weekNumberCalculation&&(this.weekNumberFunc=e.weekNumberCalculation),this.weekText=null!=e.weekText?e.weekText:e.locale.options.weekText,this.weekTextLong=(null!=e.weekTextLong?e.weekTextLong:e.locale.options.weekTextLong)||this.weekText,this.cmdFormatter=e.cmdFormatter,this.defaultSeparator=e.defaultSeparator}return e.prototype.createMarker=function(e){var t=this.createMarkerMeta(e);return null===t?null:t.marker},e.prototype.createNowMarker=function(){return this.canComputeOffset?this.timestampToMarker((new Date).valueOf()):ht(dt(new Date))},e.prototype.createMarkerMeta=function(e){if("string"==typeof e)return this.parse(e);var t=null;return"number"==typeof e?t=this.timestampToMarker(e):e instanceof Date?(e=e.valueOf(),isNaN(e)||(t=this.timestampToMarker(e))):Array.isArray(e)&&(t=ht(e)),null!==t&&vt(t)?{marker:t,isTimeUnspecified:!1,forcedTzo:null}:null},e.prototype.parse=function(e){var t=Ar(e);if(null===t)return null;var n=t.marker,r=null;return null!==t.timeZoneOffset&&(this.canComputeOffset?n=this.timestampToMarker(n.valueOf()-60*t.timeZoneOffset*1e3):r=t.timeZoneOffset),{marker:n,isTimeUnspecified:t.isTimeUnspecified,forcedTzo:r}},e.prototype.getYear=function(e){return this.calendarSystem.getMarkerYear(e)},e.prototype.getMonth=function(e){return this.calendarSystem.getMarkerMonth(e)},e.prototype.add=function(e,t){var n=this.calendarSystem.markerToArray(e);return n[0]+=t.years,n[1]+=t.months,n[2]+=t.days,n[6]+=t.milliseconds,this.calendarSystem.arrayToMarker(n)},e.prototype.subtract=function(e,t){var n=this.calendarSystem.markerToArray(e);return n[0]-=t.years,n[1]-=t.months,n[2]-=t.days,n[6]-=t.milliseconds,this.calendarSystem.arrayToMarker(n)},e.prototype.addYears=function(e,t){var n=this.calendarSystem.markerToArray(e);return n[0]+=t,this.calendarSystem.arrayToMarker(n)},e.prototype.addMonths=function(e,t){var n=this.calendarSystem.markerToArray(e);return n[1]+=t,this.calendarSystem.arrayToMarker(n)},e.prototype.diffWholeYears=function(e,t){var n=this.calendarSystem;return gt(e)===gt(t)&&n.getMarkerDay(e)===n.getMarkerDay(t)&&n.getMarkerMonth(e)===n.getMarkerMonth(t)?n.getMarkerYear(t)-n.getMarkerYear(e):null},e.prototype.diffWholeMonths=function(e,t){var n=this.calendarSystem;return gt(e)===gt(t)&&n.getMarkerDay(e)===n.getMarkerDay(t)?n.getMarkerMonth(t)-n.getMarkerMonth(e)+12*(n.getMarkerYear(t)-n.getMarkerYear(e)):null},e.prototype.greatestWholeUnit=function(e,t){var n=this.diffWholeYears(e,t);return null!==n?{unit:"year",value:n}:null!==(n=this.diffWholeMonths(e,t))?{unit:"month",value:n}:null!==(n=at(e,t))?{unit:"week",value:n}:null!==(n=st(e,t))?{unit:"day",value:n}:$e(n=function(e,t){return(t.valueOf()-e.valueOf())/36e5}(e,t))?{unit:"hour",value:n}:$e(n=function(e,t){return(t.valueOf()-e.valueOf())/6e4}(e,t))?{unit:"minute",value:n}:$e(n=function(e,t){return(t.valueOf()-e.valueOf())/1e3}(e,t))?{unit:"second",value:n}:{unit:"millisecond",value:t.valueOf()-e.valueOf()}},e.prototype.countDurationsBetween=function(e,t,n){var r;return n.years&&null!==(r=this.diffWholeYears(e,t))?r/(Lt(n)/365):n.months&&null!==(r=this.diffWholeMonths(e,t))?r/function(e){return Lt(e)/30}(n):n.days&&null!==(r=st(e,t))?r/Lt(n):(t.valueOf()-e.valueOf())/Ut(n)},e.prototype.startOf=function(e,t){return"year"===t?this.startOfYear(e):"month"===t?this.startOfMonth(e):"week"===t?this.startOfWeek(e):"day"===t?lt(e):"hour"===t?function(e){return ht([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours()])}(e):"minute"===t?function(e){return ht([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes()])}(e):"second"===t?function(e){return ht([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds()])}(e):null},e.prototype.startOfYear=function(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e)])},e.prototype.startOfMonth=function(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e),this.calendarSystem.getMarkerMonth(e)])},e.prototype.startOfWeek=function(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e),this.calendarSystem.getMarkerMonth(e),e.getUTCDate()-(e.getUTCDay()-this.weekDow+7)%7])},e.prototype.computeWeekNumber=function(e){return this.weekNumberFunc?this.weekNumberFunc(this.toDate(e)):function(e,t,n){var r=e.getUTCFullYear(),o=ut(e,r,t,n);if(o<1)return ut(e,r-1,t,n);var i=ut(e,r+1,t,n);return i>=1?Math.min(o,i):o}(e,this.weekDow,this.weekDoy)},e.prototype.format=function(e,t,n){return void 0===n&&(n={}),t.format({marker:e,timeZoneOffset:null!=n.forcedTzo?n.forcedTzo:this.offsetForMarker(e)},this)},e.prototype.formatRange=function(e,t,n,r){return void 0===r&&(r={}),r.isEndExclusive&&(t=nt(t,-1)),n.formatRange({marker:e,timeZoneOffset:null!=r.forcedStartTzo?r.forcedStartTzo:this.offsetForMarker(e)},{marker:t,timeZoneOffset:null!=r.forcedEndTzo?r.forcedEndTzo:this.offsetForMarker(t)},this,r.defaultSeparator)},e.prototype.formatIso=function(e,t){void 0===t&&(t={});var n=null;return t.omitTimeZoneOffset||(n=null!=t.forcedTzo?t.forcedTzo:this.offsetForMarker(e)),Ft(e,n,t.omitTime)},e.prototype.timestampToMarker=function(e){return"local"===this.timeZone?ht(dt(new Date(e))):"UTC"!==this.timeZone&&this.namedTimeZoneImpl?ht(this.namedTimeZoneImpl.timestampToArray(e)):new Date(e)},e.prototype.offsetForMarker=function(e){return"local"===this.timeZone?-pt(ft(e)).getTimezoneOffset():"UTC"===this.timeZone?0:this.namedTimeZoneImpl?this.namedTimeZoneImpl.offsetForArray(ft(e)):null},e.prototype.toDate=function(e,t){return"local"===this.timeZone?pt(ft(e)):"UTC"===this.timeZone?new Date(e.valueOf()):this.namedTimeZoneImpl?new Date(e.valueOf()-1e3*this.namedTimeZoneImpl.offsetForArray(ft(e))*60):new Date(e.valueOf()-(t||0))},e}(),Ur=[],Wr={code:"en",week:{dow:0,doy:4},direction:"ltr",buttonText:{prev:"prev",next:"next",prevYear:"prev year",nextYear:"next year",year:"year",today:"today",month:"month",week:"week",day:"day",list:"list"},weekText:"W",weekTextLong:"Week",closeHint:"Close",timeHint:"Time",eventHint:"Event",allDayText:"all-day",moreLinkText:"more",noEventsText:"No events to display"},Vr=r(r({},Wr),{buttonHints:{prev:"Previous $0",next:"Next $0",today:function(e,t){return"day"===t?"Today":"This "+e}},viewHint:"$0 view",navLinkHint:"Go to $0",moreLinkHint:function(e){return"Show "+e+" more event"+(1===e?"":"s")}});function Fr(e){for(var t=e.length>0?e[0].code:"en",n=Ur.concat(e),r={en:Vr},o=0,i=n;o<i.length;o++){var a=i[o];r[a.code]=a}return{map:r,defaultCode:t}}function Br(e,t){return"object"!=typeof e||Array.isArray(e)?function(e,t){var n=[].concat(e||[]),r=function(e,t){for(var n=0;n<e.length;n+=1)for(var r=e[n].toLocaleLowerCase().split("-"),o=r.length;o>0;o-=1){var i=r.slice(0,o).join("-");if(t[i])return t[i]}return null}(n,t)||Vr;return zr(e,n,r)}(e,t):zr(e.code,[e.code],e)}function zr(e,t,n){var r=Et([Wr,n],["buttonText"]);delete r.code;var o=r.week;return delete r.week,{codeArg:e,codes:t,week:o,simpleNumberFormat:new Intl.NumberFormat(e),options:r}}function jr(e){var t=Br(e.locale||"en",Fr([]).map);return new Lr(r(r({timeZone:cn.timeZone,calendarSystem:"gregory"},e),{locale:t}))}var Gr,qr={startTime:"09:00",endTime:"17:00",daysOfWeek:[1,2,3,4,5],display:"inverse-background",classNames:"fc-non-business",groupId:"_businessHours"};function Yr(e,t){return En(function(e){var t;t=!0===e?[{}]:Array.isArray(e)?e.filter((function(e){return e.daysOfWeek})):"object"==typeof e&&e?[e]:[];return t=t.map((function(e){return r(r({},qr),e)}))}(e),null,t)}function Zr(e,t){return e.left>=t.left&&e.left<t.right&&e.top>=t.top&&e.top<t.bottom}function Xr(e,t){var n={left:Math.max(e.left,t.left),right:Math.min(e.right,t.right),top:Math.max(e.top,t.top),bottom:Math.min(e.bottom,t.bottom)};return n.left<n.right&&n.top<n.bottom&&n}function Kr(e,t){return{left:Math.min(Math.max(e.left,t.left),t.right),top:Math.min(Math.max(e.top,t.top),t.bottom)}}function $r(e){return{left:(e.left+e.right)/2,top:(e.top+e.bottom)/2}}function Jr(e,t){return{left:e.left-t.left,top:e.top-t.top}}function Qr(){return null==Gr&&(Gr=function(){if("undefined"==typeof document)return!0;var e=document.createElement("div");e.style.position="absolute",e.style.top="0px",e.style.left="0px",e.innerHTML="<table><tr><td><div></div></td></tr></table>",e.querySelector("table").style.height="100px",e.querySelector("div").style.height="100%",document.body.appendChild(e);var t=e.querySelector("div").offsetHeight>0;return document.body.removeChild(e),t}()),Gr}var eo={defs:{},instances:{}},to=function(){function e(){this.getKeysForEventDefs=qt(this._getKeysForEventDefs),this.splitDateSelection=qt(this._splitDateSpan),this.splitEventStore=qt(this._splitEventStore),this.splitIndividualUi=qt(this._splitIndividualUi),this.splitEventDrag=qt(this._splitInteraction),this.splitEventResize=qt(this._splitInteraction),this.eventUiBuilders={}}return e.prototype.splitProps=function(e){var t=this,n=this.getKeyInfo(e),r=this.getKeysForEventDefs(e.eventStore),o=this.splitDateSelection(e.dateSelection),i=this.splitIndividualUi(e.eventUiBases,r),a=this.splitEventStore(e.eventStore,r),s=this.splitEventDrag(e.eventDrag),l=this.splitEventResize(e.eventResize),u={};for(var c in this.eventUiBuilders=bt(n,(function(e,n){return t.eventUiBuilders[n]||qt(no)})),n){var d=n[c],p=a[c]||eo,f=this.eventUiBuilders[c];u[c]={businessHours:d.businessHours||e.businessHours,dateSelection:o[c]||null,eventStore:p,eventUiBases:f(e.eventUiBases[""],d.ui,i[c]),eventSelection:p.instances[e.eventSelection]?e.eventSelection:"",eventDrag:s[c]||null,eventResize:l[c]||null}}return u},e.prototype._splitDateSpan=function(e){var t={};if(e)for(var n=0,r=this.getKeysForDateSpan(e);n<r.length;n++){t[r[n]]=e}return t},e.prototype._getKeysForEventDefs=function(e){var t=this;return bt(e.defs,(function(e){return t.getKeysForEventDef(e)}))},e.prototype._splitEventStore=function(e,t){var n=e.defs,r=e.instances,o={};for(var i in n)for(var a=0,s=t[i];a<s.length;a++){o[p=s[a]]||(o[p]={defs:{},instances:{}}),o[p].defs[i]=n[i]}for(var l in r)for(var u=r[l],c=0,d=t[u.defId];c<d.length;c++){var p;o[p=d[c]]&&(o[p].instances[l]=u)}return o},e.prototype._splitIndividualUi=function(e,t){var n={};for(var r in e)if(r)for(var o=0,i=t[r];o<i.length;o++){var a=i[o];n[a]||(n[a]={}),n[a][r]=e[r]}return n},e.prototype._splitInteraction=function(e){var t={};if(e){var n=this._splitEventStore(e.affectedEvents,this._getKeysForEventDefs(e.affectedEvents)),r=this._getKeysForEventDefs(e.mutatedEvents),o=this._splitEventStore(e.mutatedEvents,r),i=function(r){t[r]||(t[r]={affectedEvents:n[r]||eo,mutatedEvents:o[r]||eo,isEvent:e.isEvent})};for(var a in n)i(a);for(var a in o)i(a)}return t},e}();function no(e,t,n){var o=[];e&&o.push(e),t&&o.push(t);var i={"":xn(o)};return n&&r(i,n),i}function ro(e,t,n,r){return{dow:e.getUTCDay(),isDisabled:Boolean(r&&!Zn(r.activeRange,e)),isOther:Boolean(r&&!Zn(r.currentRange,e)),isToday:Boolean(t&&Zn(t,e)),isPast:Boolean(n?e<n:!!t&&e<t.start),isFuture:Boolean(n?e>n:!!t&&e>=t.end)}}function oo(e,t){var n=["fc-day","fc-day-"+Qe[e.dow]];return e.isDisabled?n.push("fc-day-disabled"):(e.isToday&&(n.push("fc-day-today"),n.push(t.getClass("today"))),e.isPast&&n.push("fc-day-past"),e.isFuture&&n.push("fc-day-future"),e.isOther&&n.push("fc-day-other")),n}var io=ln({year:"numeric",month:"long",day:"numeric"}),ao=ln({week:"long"});function so(e,t,n,o){void 0===n&&(n="day"),void 0===o&&(o=!0);var i=e.dateEnv,a=e.options,s=e.calendarApi,l=i.format(t,"week"===n?ao:io);if(a.navLinks){var u=i.toDate(t),c=function(e){var r="day"===n?a.navLinkDayClick:"week"===n?a.navLinkWeekClick:null;"function"==typeof r?r.call(s,i.toDate(t),e):("string"==typeof r&&(n=r),s.zoomTo(t,n))};return r({title:Xe(a.navLinkHint,[l,u],l),"data-navlink":""},o?He(c):{onClick:c})}return{"aria-label":l}}var lo,uo=null;function co(){return null===uo&&(uo=function(){var e=document.createElement("div");we(e,{position:"absolute",top:-1e3,left:0,border:0,padding:0,overflow:"scroll",direction:"rtl"}),e.innerHTML="<div></div>",document.body.appendChild(e);var t=e.firstChild.getBoundingClientRect().left>e.getBoundingClientRect().left;return Ee(e),t}()),uo}function po(){return lo||(lo=function(){var e=document.createElement("div");e.style.overflow="scroll",e.style.position="absolute",e.style.top="-9999px",e.style.left="-9999px",document.body.appendChild(e);var t=fo(e);return document.body.removeChild(e),t}()),lo}function fo(e){return{x:e.offsetHeight-e.clientHeight,y:e.offsetWidth-e.clientWidth}}function ho(e,t){void 0===t&&(t=!1);var n=window.getComputedStyle(e),r=parseInt(n.borderLeftWidth,10)||0,o=parseInt(n.borderRightWidth,10)||0,i=parseInt(n.borderTopWidth,10)||0,a=parseInt(n.borderBottomWidth,10)||0,s=fo(e),l=s.y-r-o,u={borderLeft:r,borderRight:o,borderTop:i,borderBottom:a,scrollbarBottom:s.x-i-a,scrollbarLeft:0,scrollbarRight:0};return co()&&"rtl"===n.direction?u.scrollbarLeft=l:u.scrollbarRight=l,t&&(u.paddingLeft=parseInt(n.paddingLeft,10)||0,u.paddingRight=parseInt(n.paddingRight,10)||0,u.paddingTop=parseInt(n.paddingTop,10)||0,u.paddingBottom=parseInt(n.paddingBottom,10)||0),u}function vo(e,t,n){void 0===t&&(t=!1);var r=n?e.getBoundingClientRect():go(e),o=ho(e,t),i={left:r.left+o.borderLeft+o.scrollbarLeft,right:r.right-o.borderRight-o.scrollbarRight,top:r.top+o.borderTop,bottom:r.bottom-o.borderBottom-o.scrollbarBottom};return t&&(i.left+=o.paddingLeft,i.right-=o.paddingRight,i.top+=o.paddingTop,i.bottom-=o.paddingBottom),i}function go(e){var t=e.getBoundingClientRect();return{left:t.left+window.pageXOffset,top:t.top+window.pageYOffset,right:t.right+window.pageXOffset,bottom:t.bottom+window.pageYOffset}}function mo(e){for(var t=[];e instanceof HTMLElement;){var n=window.getComputedStyle(e);if("fixed"===n.position)break;/(auto|scroll)/.test(n.overflow+n.overflowY+n.overflowX)&&t.push(e),e=e.parentNode}return t}function yo(e,t,n){var r=!1,o=function(){r||(r=!0,t.apply(this,arguments))},i=function(){r||(r=!0,n&&n.apply(this,arguments))},a=e(o,i);a&&"function"==typeof a.then&&a.then(o,i)}var Eo=function(){function e(){this.handlers={},this.thisContext=null}return e.prototype.setThisContext=function(e){this.thisContext=e},e.prototype.setOptions=function(e){this.options=e},e.prototype.on=function(e,t){!function(e,t,n){(e[t]||(e[t]=[])).push(n)}(this.handlers,e,t)},e.prototype.off=function(e,t){!function(e,t,n){n?e[t]&&(e[t]=e[t].filter((function(e){return e!==n}))):delete e[t]}(this.handlers,e,t)},e.prototype.trigger=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];for(var r=this.handlers[e]||[],o=this.options&&this.options[e],i=[].concat(o||[],r),a=0,s=i;a<s.length;a++){var l=s[a];l.apply(this.thisContext,t)}},e.prototype.hasHandlers=function(e){return Boolean(this.handlers[e]&&this.handlers[e].length||this.options&&this.options[e])},e}();var So=function(){function e(e,t,n,r){this.els=t;var o=this.originClientRect=e.getBoundingClientRect();n&&this.buildElHorizontals(o.left),r&&this.buildElVerticals(o.top)}return e.prototype.buildElHorizontals=function(e){for(var t=[],n=[],r=0,o=this.els;r<o.length;r++){var i=o[r].getBoundingClientRect();t.push(i.left-e),n.push(i.right-e)}this.lefts=t,this.rights=n},e.prototype.buildElVerticals=function(e){for(var t=[],n=[],r=0,o=this.els;r<o.length;r++){var i=o[r].getBoundingClientRect();t.push(i.top-e),n.push(i.bottom-e)}this.tops=t,this.bottoms=n},e.prototype.leftToIndex=function(e){var t,n=this.lefts,r=this.rights,o=n.length;for(t=0;t<o;t+=1)if(e>=n[t]&&e<r[t])return t},e.prototype.topToIndex=function(e){var t,n=this.tops,r=this.bottoms,o=n.length;for(t=0;t<o;t+=1)if(e>=n[t]&&e<r[t])return t},e.prototype.getWidth=function(e){return this.rights[e]-this.lefts[e]},e.prototype.getHeight=function(e){return this.bottoms[e]-this.tops[e]},e}(),bo=function(){function e(){}return e.prototype.getMaxScrollTop=function(){return this.getScrollHeight()-this.getClientHeight()},e.prototype.getMaxScrollLeft=function(){return this.getScrollWidth()-this.getClientWidth()},e.prototype.canScrollVertically=function(){return this.getMaxScrollTop()>0},e.prototype.canScrollHorizontally=function(){return this.getMaxScrollLeft()>0},e.prototype.canScrollUp=function(){return this.getScrollTop()>0},e.prototype.canScrollDown=function(){return this.getScrollTop()<this.getMaxScrollTop()},e.prototype.canScrollLeft=function(){return this.getScrollLeft()>0},e.prototype.canScrollRight=function(){return this.getScrollLeft()<this.getMaxScrollLeft()},e}(),Do=function(e){function t(t){var n=e.call(this)||this;return n.el=t,n}return n(t,e),t.prototype.getScrollTop=function(){return this.el.scrollTop},t.prototype.getScrollLeft=function(){return this.el.scrollLeft},t.prototype.setScrollTop=function(e){this.el.scrollTop=e},t.prototype.setScrollLeft=function(e){this.el.scrollLeft=e},t.prototype.getScrollWidth=function(){return this.el.scrollWidth},t.prototype.getScrollHeight=function(){return this.el.scrollHeight},t.prototype.getClientHeight=function(){return this.el.clientHeight},t.prototype.getClientWidth=function(){return this.el.clientWidth},t}(bo),Co=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.getScrollTop=function(){return window.pageYOffset},t.prototype.getScrollLeft=function(){return window.pageXOffset},t.prototype.setScrollTop=function(e){window.scroll(window.pageXOffset,e)},t.prototype.setScrollLeft=function(e){window.scroll(e,window.pageYOffset)},t.prototype.getScrollWidth=function(){return document.documentElement.scrollWidth},t.prototype.getScrollHeight=function(){return document.documentElement.scrollHeight},t.prototype.getClientHeight=function(){return document.documentElement.clientHeight},t.prototype.getClientWidth=function(){return document.documentElement.clientWidth},t}(bo),wo=function(){function e(e){this.iconOverrideOption&&this.setIconOverride(e[this.iconOverrideOption])}return e.prototype.setIconOverride=function(e){var t,n;if("object"==typeof e&&e){for(n in t=r({},this.iconClasses),e)t[n]=this.applyIconOverridePrefix(e[n]);this.iconClasses=t}else!1===e&&(this.iconClasses={})},e.prototype.applyIconOverridePrefix=function(e){var t=this.iconOverridePrefix;return t&&0!==e.indexOf(t)&&(e=t+e),e},e.prototype.getClass=function(e){return this.classes[e]||""},e.prototype.getIconClass=function(e,t){var n;return(n=t&&this.rtlIconClasses&&this.rtlIconClasses[e]||this.iconClasses[e])?this.baseIconClass+" "+n:""},e.prototype.getCustomButtonIconClass=function(e){var t;return this.iconOverrideCustomButtonOption&&(t=e[this.iconOverrideCustomButtonOption])?this.baseIconClass+" "+this.applyIconOverridePrefix(t):""},e}();if(wo.prototype.classes={},wo.prototype.iconClasses={},wo.prototype.baseIconClass="",wo.prototype.iconOverridePrefix="","undefined"==typeof FullCalendarVDom)throw new Error("Please import the top-level fullcalendar lib before attempting to import a plugin.");var Ro=FullCalendarVDom.Component,_o=FullCalendarVDom.createElement,To=FullCalendarVDom.render,ko=FullCalendarVDom.createRef,xo=FullCalendarVDom.Fragment,Mo=FullCalendarVDom.createContext,Io=FullCalendarVDom.createPortal,Po=FullCalendarVDom.flushToDom,No=FullCalendarVDom.unmountComponentAtNode,Ho=function(){function e(e,t,n,o){var i=this;this.execFunc=e,this.emitter=t,this.scrollTime=n,this.scrollTimeReset=o,this.handleScrollRequest=function(e){i.queuedRequest=r({},i.queuedRequest||{},e),i.drain()},t.on("_scrollRequest",this.handleScrollRequest),this.fireInitialScroll()}return e.prototype.detach=function(){this.emitter.off("_scrollRequest",this.handleScrollRequest)},e.prototype.update=function(e){e&&this.scrollTimeReset?this.fireInitialScroll():this.drain()},e.prototype.fireInitialScroll=function(){this.handleScrollRequest({time:this.scrollTime})},e.prototype.drain=function(){this.queuedRequest&&this.execFunc(this.queuedRequest)&&(this.queuedRequest=null)},e}(),Oo=Mo({});function Ao(e,t,n,r,o,i,a,s,l,u,c,d,p){return{dateEnv:o,options:n,pluginHooks:a,emitter:u,dispatch:s,getCurrentData:l,calendarApi:c,viewSpec:e,viewApi:t,dateProfileGenerator:r,theme:i,isRtl:"rtl"===n.direction,addResizeHandler:function(e){u.on("_resize",e)},removeResizeHandler:function(e){u.off("_resize",e)},createScrollResponder:function(e){return new Ho(e,u,Nt(n.scrollTime),n.scrollTimeReset)},registerInteractiveComponent:d,unregisterInteractiveComponent:p}}var Lo=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.shouldComponentUpdate=function(e,t){return this.debug&&console.log(Rt(e,this.props),Rt(t,this.state)),!_t(this.props,e,this.propEquality)||!_t(this.state,t,this.stateEquality)},t.addPropsEquality=Wo,t.addStateEquality=Vo,t.contextType=Oo,t}(Ro);Lo.prototype.propEquality={},Lo.prototype.stateEquality={};var Uo=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.contextType=Oo,t}(Lo);function Wo(e){var t=Object.create(this.prototype.propEquality);r(t,e),this.prototype.propEquality=t}function Vo(e){var t=Object.create(this.prototype.stateEquality);r(t,e),this.prototype.stateEquality=t}function Fo(e,t){"function"==typeof e?e(t):e&&(e.current=t)}var Bo=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.uid=Le(),t}return n(t,e),t.prototype.prepareHits=function(){},t.prototype.queryHit=function(e,t,n,r){return null},t.prototype.isValidSegDownEl=function(e){return!this.props.eventDrag&&!this.props.eventResize&&!Se(e,".fc-event-mirror")},t.prototype.isValidDateDownEl=function(e){return!(Se(e,".fc-event:not(.fc-bg-event)")||Se(e,".fc-more-link")||Se(e,"a[data-navlink]")||Se(e,".fc-popover"))},t}(Uo);function zo(e){return{id:Le(),deps:e.deps||[],reducers:e.reducers||[],isLoadingFuncs:e.isLoadingFuncs||[],contextInit:[].concat(e.contextInit||[]),eventRefiners:e.eventRefiners||{},eventDefMemberAdders:e.eventDefMemberAdders||[],eventSourceRefiners:e.eventSourceRefiners||{},isDraggableTransformers:e.isDraggableTransformers||[],eventDragMutationMassagers:e.eventDragMutationMassagers||[],eventDefMutationAppliers:e.eventDefMutationAppliers||[],dateSelectionTransformers:e.dateSelectionTransformers||[],datePointTransforms:e.datePointTransforms||[],dateSpanTransforms:e.dateSpanTransforms||[],views:e.views||{},viewPropsTransformers:e.viewPropsTransformers||[],isPropsValid:e.isPropsValid||null,externalDefTransforms:e.externalDefTransforms||[],viewContainerAppends:e.viewContainerAppends||[],eventDropTransformers:e.eventDropTransformers||[],componentInteractions:e.componentInteractions||[],calendarInteractions:e.calendarInteractions||[],themeClasses:e.themeClasses||{},eventSourceDefs:e.eventSourceDefs||[],cmdFormatter:e.cmdFormatter,recurringTypes:e.recurringTypes||[],namedTimeZonedImpl:e.namedTimeZonedImpl,initialView:e.initialView||"",elementDraggingImpl:e.elementDraggingImpl,optionChangeHandlers:e.optionChangeHandlers||{},scrollGridImpl:e.scrollGridImpl||null,contentTypeHandlers:e.contentTypeHandlers||{},listenerRefiners:e.listenerRefiners||{},optionRefiners:e.optionRefiners||{},propSetHandlers:e.propSetHandlers||{}}}function jo(){var e,t=[],n=[];return function(o,i){return e&&Gt(o,t)&&Gt(i,n)||(e=function(e,t){var n={},o={reducers:[],isLoadingFuncs:[],contextInit:[],eventRefiners:{},eventDefMemberAdders:[],eventSourceRefiners:{},isDraggableTransformers:[],eventDragMutationMassagers:[],eventDefMutationAppliers:[],dateSelectionTransformers:[],datePointTransforms:[],dateSpanTransforms:[],views:{},viewPropsTransformers:[],isPropsValid:null,externalDefTransforms:[],viewContainerAppends:[],eventDropTransformers:[],componentInteractions:[],calendarInteractions:[],themeClasses:{},eventSourceDefs:[],cmdFormatter:null,recurringTypes:[],namedTimeZonedImpl:null,initialView:"",elementDraggingImpl:null,optionChangeHandlers:{},scrollGridImpl:null,contentTypeHandlers:{},listenerRefiners:{},optionRefiners:{},propSetHandlers:{}};function i(e){for(var t=0,a=e;t<a.length;t++){var s=a[t];n[s.id]||(n[s.id]=!0,i(s.deps),u=s,o={reducers:(l=o).reducers.concat(u.reducers),isLoadingFuncs:l.isLoadingFuncs.concat(u.isLoadingFuncs),contextInit:l.contextInit.concat(u.contextInit),eventRefiners:r(r({},l.eventRefiners),u.eventRefiners),eventDefMemberAdders:l.eventDefMemberAdders.concat(u.eventDefMemberAdders),eventSourceRefiners:r(r({},l.eventSourceRefiners),u.eventSourceRefiners),isDraggableTransformers:l.isDraggableTransformers.concat(u.isDraggableTransformers),eventDragMutationMassagers:l.eventDragMutationMassagers.concat(u.eventDragMutationMassagers),eventDefMutationAppliers:l.eventDefMutationAppliers.concat(u.eventDefMutationAppliers),dateSelectionTransformers:l.dateSelectionTransformers.concat(u.dateSelectionTransformers),datePointTransforms:l.datePointTransforms.concat(u.datePointTransforms),dateSpanTransforms:l.dateSpanTransforms.concat(u.dateSpanTransforms),views:r(r({},l.views),u.views),viewPropsTransformers:l.viewPropsTransformers.concat(u.viewPropsTransformers),isPropsValid:u.isPropsValid||l.isPropsValid,externalDefTransforms:l.externalDefTransforms.concat(u.externalDefTransforms),viewContainerAppends:l.viewContainerAppends.concat(u.viewContainerAppends),eventDropTransformers:l.eventDropTransformers.concat(u.eventDropTransformers),calendarInteractions:l.calendarInteractions.concat(u.calendarInteractions),componentInteractions:l.componentInteractions.concat(u.componentInteractions),themeClasses:r(r({},l.themeClasses),u.themeClasses),eventSourceDefs:l.eventSourceDefs.concat(u.eventSourceDefs),cmdFormatter:u.cmdFormatter||l.cmdFormatter,recurringTypes:l.recurringTypes.concat(u.recurringTypes),namedTimeZonedImpl:u.namedTimeZonedImpl||l.namedTimeZonedImpl,initialView:l.initialView||u.initialView,elementDraggingImpl:l.elementDraggingImpl||u.elementDraggingImpl,optionChangeHandlers:r(r({},l.optionChangeHandlers),u.optionChangeHandlers),scrollGridImpl:u.scrollGridImpl||l.scrollGridImpl,contentTypeHandlers:r(r({},l.contentTypeHandlers),u.contentTypeHandlers),listenerRefiners:r(r({},l.listenerRefiners),u.listenerRefiners),optionRefiners:r(r({},l.optionRefiners),u.optionRefiners),propSetHandlers:r(r({},l.propSetHandlers),u.propSetHandlers)})}var l,u}return e&&i(e),i(t),o}(o,i)),t=o,n=i,e}}var Go=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t}(wo);function qo(e,t,n,o){if(t[e])return t[e];var i=function(e,t,n,o){var i=n[e],a=o[e],s=function(e){return i&&null!==i[e]?i[e]:a&&null!==a[e]?a[e]:null},l=s("component"),u=s("superType"),c=null;if(u){if(u===e)throw new Error("Can't have a custom view type that references itself");c=qo(u,t,n,o)}!l&&c&&(l=c.component);if(!l)return null;return{type:e,component:l,defaults:r(r({},c?c.defaults:{}),i?i.rawOptions:{}),overrides:r(r({},c?c.overrides:{}),a?a.rawOptions:{})}}(e,t,n,o);return i&&(t[e]=i),i}Go.prototype.classes={root:"fc-theme-standard",tableCellShaded:"fc-cell-shaded",buttonGroup:"fc-button-group",button:"fc-button fc-button-primary",buttonActive:"fc-button-active"},Go.prototype.baseIconClass="fc-icon",Go.prototype.iconClasses={close:"fc-icon-x",prev:"fc-icon-chevron-left",next:"fc-icon-chevron-right",prevYear:"fc-icon-chevrons-left",nextYear:"fc-icon-chevrons-right"},Go.prototype.rtlIconClasses={prev:"fc-icon-chevron-right",next:"fc-icon-chevron-left",prevYear:"fc-icon-chevrons-right",nextYear:"fc-icon-chevrons-left"},Go.prototype.iconOverrideOption="buttonIcons",Go.prototype.iconOverrideCustomButtonOption="icon",Go.prototype.iconOverridePrefix="fc-icon-";var Yo=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.rootElRef=ko(),t.handleRootEl=function(e){Fo(t.rootElRef,e),t.props.elRef&&Fo(t.props.elRef,e)},t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=t.hookProps;return _o($o,{hookProps:n,didMount:t.didMount,willUnmount:t.willUnmount,elRef:this.handleRootEl},(function(r){return _o(Xo,{hookProps:n,content:t.content,defaultContent:t.defaultContent,backupElRef:e.rootElRef},(function(e,o){return t.children(r,Qo(t.classNames,n),e,o)}))}))},t}(Uo),Zo=Mo(0);function Xo(e){return _o(Zo.Consumer,null,(function(t){return _o(Ko,r({renderId:t},e))}))}var Ko=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.innerElRef=ko(),t}return n(t,e),t.prototype.render=function(){return this.props.children(this.innerElRef,this.renderInnerContent())},t.prototype.componentDidMount=function(){this.updateCustomContent()},t.prototype.componentDidUpdate=function(){this.updateCustomContent()},t.prototype.componentWillUnmount=function(){this.customContentInfo&&this.customContentInfo.destroy&&this.customContentInfo.destroy()},t.prototype.renderInnerContent=function(){var e=this.customContentInfo,t=this.getInnerContent(),n=this.getContentMeta(t);return e&&e.contentKey===n.contentKey?e&&(e.contentVal=t[n.contentKey]):(e&&(e.destroy&&e.destroy(),e=this.customContentInfo=null),n.contentKey&&(e=this.customContentInfo=r({contentKey:n.contentKey,contentVal:t[n.contentKey]},n.buildLifecycleFuncs()))),e?[]:t},t.prototype.getInnerContent=function(){var e=this.props,t=ei(e.content,e.hookProps);return void 0===t&&(t=ei(e.defaultContent,e.hookProps)),null==t?null:t},t.prototype.getContentMeta=function(e){var t=this.context.pluginHooks.contentTypeHandlers,n="",r=null;if(e)for(var o in t)if(void 0!==e[o]){n=o,r=t[o];break}return{contentKey:n,buildLifecycleFuncs:r}},t.prototype.updateCustomContent=function(){this.customContentInfo&&this.customContentInfo.render(this.innerElRef.current||this.props.backupElRef.current,this.customContentInfo.contentVal)},t}(Uo),$o=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.handleRootEl=function(e){t.rootEl=e,t.props.elRef&&Fo(t.props.elRef,e)},t}return n(t,e),t.prototype.render=function(){return this.props.children(this.handleRootEl)},t.prototype.componentDidMount=function(){var e=this.props.didMount;e&&e(r(r({},this.props.hookProps),{el:this.rootEl}))},t.prototype.componentWillUnmount=function(){var e=this.props.willUnmount;e&&e(r(r({},this.props.hookProps),{el:this.rootEl}))},t}(Uo);function Jo(){var e,t,n=[];return function(r,o){return t&&wt(t,o)&&r===e||(e=r,t=o,n=Qo(r,o)),n}}function Qo(e,t){return"function"==typeof e&&(e=e(t)),Rn(e)}function ei(e,t){return"function"==typeof e?e(t,_o):e}var ti=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.normalizeClassNames=Jo(),t}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context,n=t.options,r={view:t.viewApi},o=this.normalizeClassNames(n.viewClassNames,r);return _o($o,{hookProps:r,didMount:n.viewDidMount,willUnmount:n.viewWillUnmount,elRef:e.elRef},(function(t){return e.children(t,["fc-"+e.viewSpec.type+"-view","fc-view"].concat(o))}))},t}(Uo);function ni(e){return bt(e,ri)}function ri(e){var t,n="function"==typeof e?{component:e}:e,o=n.component;return n.content&&(t=n,o=function(e){return _o(Oo.Consumer,null,(function(n){return _o(ti,{viewSpec:n.viewSpec},(function(o,i){var a=r(r({},e),{nextDayThreshold:n.options.nextDayThreshold});return _o(Yo,{hookProps:a,classNames:t.classNames,content:t.content,didMount:t.didMount,willUnmount:t.willUnmount,elRef:o},(function(e,t,n,r){return _o("div",{className:i.concat(t).join(" "),ref:e},r)}))}))}))}),{superType:n.type,component:o,rawOptions:n}}function oi(e,t,n,o){var i=ni(e),a=ni(t.views);return bt(function(e,t){var n,r={};for(n in e)qo(n,r,e,t);for(n in t)qo(n,r,e,t);return r}(i,a),(function(e){return function(e,t,n,o,i){var a=e.overrides.duration||e.defaults.duration||o.duration||n.duration,s=null,l="",u="",c={};if(a&&(s=function(e){var t=JSON.stringify(e),n=ii[t];void 0===n&&(n=Nt(e),ii[t]=n);return n}(a))){var d=Vt(s);l=d.unit,1===d.value&&(u=l,c=t[l]?t[l].rawOptions:{})}var p=function(t){var n=t.buttonText||{},r=e.defaults.buttonTextKey;return null!=r&&null!=n[r]?n[r]:null!=n[e.type]?n[e.type]:null!=n[u]?n[u]:null},f=function(t){var n=t.buttonHints||{},r=e.defaults.buttonTextKey;return null!=r&&null!=n[r]?n[r]:null!=n[e.type]?n[e.type]:null!=n[u]?n[u]:null};return{type:e.type,component:e.component,duration:s,durationUnit:l,singleUnit:u,optionDefaults:e.defaults,optionOverrides:r(r({},c),e.overrides),buttonTextOverride:p(o)||p(n)||e.overrides.buttonText,buttonTextDefault:p(i)||e.defaults.buttonText||p(cn)||e.type,buttonTitleOverride:f(o)||f(n)||e.overrides.buttonHint,buttonTitleDefault:f(i)||e.defaults.buttonHint||f(cn)}}(e,a,t,n,o)}))}var ii={};var ai=function(){function e(e){this.props=e,this.nowDate=Tr(e.nowInput,e.dateEnv),this.initHiddenDays()}return e.prototype.buildPrev=function(e,t,n){var r=this.props.dateEnv,o=r.subtract(r.startOf(t,e.currentRangeUnit),e.dateIncrement);return this.build(o,-1,n)},e.prototype.buildNext=function(e,t,n){var r=this.props.dateEnv,o=r.add(r.startOf(t,e.currentRangeUnit),e.dateIncrement);return this.build(o,1,n)},e.prototype.build=function(e,t,n){void 0===n&&(n=!0);var r,o,i,a,s,l,u,c,d=this.props;return r=this.buildValidRange(),r=this.trimHiddenDays(r),n&&(u=e,e=null!=(c=r).start&&u<c.start?c.start:null!=c.end&&u>=c.end?new Date(c.end.valueOf()-1):u),o=this.buildCurrentRangeInfo(e,t),i=/^(year|month|week|day)$/.test(o.unit),a=this.buildRenderRange(this.trimHiddenDays(o.range),o.unit,i),s=a=this.trimHiddenDays(a),d.showNonCurrentDates||(s=jn(s,o.range)),s=jn(s=this.adjustActiveRange(s),r),l=qn(o.range,r),{validRange:r,currentRange:o.range,currentRangeUnit:o.unit,isRangeAllDay:i,activeRange:s,renderRange:a,slotMinTime:d.slotMinTime,slotMaxTime:d.slotMaxTime,isValid:l,dateIncrement:this.buildDateIncrement(o.duration)}},e.prototype.buildValidRange=function(){var e=this.props.validRangeInput,t="function"==typeof e?e.call(this.props.calendarApi,this.nowDate):e;return this.refineRange(t)||{start:null,end:null}},e.prototype.buildCurrentRangeInfo=function(e,t){var n,r=this.props,o=null,i=null,a=null;return r.duration?(o=r.duration,i=r.durationUnit,a=this.buildRangeFromDuration(e,t,o,i)):(n=this.props.dayCount)?(i="day",a=this.buildRangeFromDayCount(e,t,n)):(a=this.buildCustomVisibleRange(e))?i=r.dateEnv.greatestWholeUnit(a.start,a.end).unit:(i=Vt(o=this.getFallbackDuration()).unit,a=this.buildRangeFromDuration(e,t,o,i)),{duration:o,unit:i,range:a}},e.prototype.getFallbackDuration=function(){return Nt({day:1})},e.prototype.adjustActiveRange=function(e){var t=this.props,n=t.dateEnv,r=t.usesMinMaxTime,o=t.slotMinTime,i=t.slotMaxTime,a=e.start,s=e.end;return r&&(Lt(o)<0&&(a=lt(a),a=n.add(a,o)),Lt(i)>1&&(s=tt(s=lt(s),-1),s=n.add(s,i))),{start:a,end:s}},e.prototype.buildRangeFromDuration=function(e,t,n,r){var o,i,a,s=this.props,l=s.dateEnv,u=s.dateAlignment;if(!u){var c=this.props.dateIncrement;u=c&&Ut(c)<Ut(n)?Vt(c).unit:r}function d(){o=l.startOf(e,u),i=l.add(o,n),a={start:o,end:i}}return Lt(n)<=1&&this.isHiddenDay(o)&&(o=lt(o=this.skipHiddenDays(o,t))),d(),this.trimHiddenDays(a)||(e=this.skipHiddenDays(e,t),d()),a},e.prototype.buildRangeFromDayCount=function(e,t,n){var r,o=this.props,i=o.dateEnv,a=o.dateAlignment,s=0,l=e;a&&(l=i.startOf(l,a)),l=lt(l),r=l=this.skipHiddenDays(l,t);do{r=tt(r,1),this.isHiddenDay(r)||(s+=1)}while(s<n);return{start:l,end:r}},e.prototype.buildCustomVisibleRange=function(e){var t=this.props,n=t.visibleRangeInput,r="function"==typeof n?n.call(t.calendarApi,t.dateEnv.toDate(e)):n,o=this.refineRange(r);return!o||null!=o.start&&null!=o.end?o:null},e.prototype.buildRenderRange=function(e,t,n){return e},e.prototype.buildDateIncrement=function(e){var t,n=this.props.dateIncrement;return n||((t=this.props.dateAlignment)?Nt(1,t):e||Nt({days:1}))},e.prototype.refineRange=function(e){if(e){var t=(n=e,r=this.props.dateEnv,o=null,i=null,n.start&&(o=r.createMarker(n.start)),n.end&&(i=r.createMarker(n.end)),o||i?o&&i&&i<o?null:{start:o,end:i}:null);return t&&(t=Wn(t)),t}var n,r,o,i;return null},e.prototype.initHiddenDays=function(){var e,t=this.props.hiddenDays||[],n=[],r=0;for(!1===this.props.weekends&&t.push(0,6),e=0;e<7;e+=1)(n[e]=-1!==t.indexOf(e))||(r+=1);if(!r)throw new Error("invalid hiddenDays");this.isHiddenDayHash=n},e.prototype.trimHiddenDays=function(e){var t=e.start,n=e.end;return t&&(t=this.skipHiddenDays(t)),n&&(n=this.skipHiddenDays(n,-1,!0)),null==t||null==n||t<n?{start:t,end:n}:null},e.prototype.isHiddenDay=function(e){return e instanceof Date&&(e=e.getUTCDay()),this.isHiddenDayHash[e]},e.prototype.skipHiddenDays=function(e,t,n){for(void 0===t&&(t=1),void 0===n&&(n=!1);this.isHiddenDayHash[(e.getUTCDay()+(n?t:0)+7)%7];)e=tt(e,t);return e},e}();function si(e,t,n){var r=t?t.activeRange:null;return ci({},function(e,t){var n=_r(t),r=[].concat(e.eventSources||[]),o=[];e.initialEvents&&r.unshift(e.initialEvents);e.events&&r.unshift(e.events);for(var i=0,a=r;i<a.length;i++){var s=Rr(a[i],t,n);s&&o.push(s)}return o}(e,n),r,n)}function li(e,t,n,o){var i,a,s=n?n.activeRange:null;switch(t.type){case"ADD_EVENT_SOURCES":return ci(e,t.sources,s,o);case"REMOVE_EVENT_SOURCE":return i=e,a=t.sourceId,St(i,(function(e){return e.sourceId!==a}));case"PREV":case"NEXT":case"CHANGE_DATE":case"CHANGE_VIEW_TYPE":return n?di(e,s,o):e;case"FETCH_EVENT_SOURCES":return pi(e,t.sourceIds?Dt(t.sourceIds):hi(e,o),s,t.isRefetch||!1,o);case"RECEIVE_EVENTS":case"RECEIVE_EVENT_ERROR":return function(e,t,n,o){var i,a=e[t];if(a&&n===a.latestFetchId)return r(r({},e),((i={})[t]=r(r({},a),{isFetching:!1,fetchRange:o}),i));return e}(e,t.sourceId,t.fetchId,t.fetchRange);case"REMOVE_ALL_EVENT_SOURCES":return{};default:return e}}function ui(e){for(var t in e)if(e[t].isFetching)return!0;return!1}function ci(e,t,n,o){for(var i={},a=0,s=t;a<s.length;a++){var l=s[a];i[l.sourceId]=l}return n&&(i=di(i,n,o)),r(r({},e),i)}function di(e,t,n){return pi(e,St(e,(function(e){return function(e,t,n){if(!vi(e,n))return!e.latestFetchId;return!n.options.lazyFetching||!e.fetchRange||e.isFetching||t.start<e.fetchRange.start||t.end>e.fetchRange.end}(e,t,n)})),t,!1,n)}function pi(e,t,n,r,o){var i={};for(var a in e){var s=e[a];t[a]?i[a]=fi(s,n,r,o):i[a]=s}return i}function fi(e,t,n,o){var i=o.options,a=o.calendarApi,s=o.pluginHooks.eventSourceDefs[e.sourceDefId],l=Le();return s.fetch({eventSource:e,range:t,isRefetch:n,context:o},(function(n){var r=n.rawEvents;i.eventSourceSuccess&&(r=i.eventSourceSuccess.call(a,r,n.xhr)||r),e.success&&(r=e.success.call(a,r,n.xhr)||r),o.dispatch({type:"RECEIVE_EVENTS",sourceId:e.sourceId,fetchId:l,fetchRange:t,rawEvents:r})}),(function(n){console.warn(n.message,n),i.eventSourceFailure&&i.eventSourceFailure.call(a,n),e.failure&&e.failure(n),o.dispatch({type:"RECEIVE_EVENT_ERROR",sourceId:e.sourceId,fetchId:l,fetchRange:t,error:n})})),r(r({},e),{isFetching:!0,latestFetchId:l})}function hi(e,t){return St(e,(function(e){return vi(e,t)}))}function vi(e,t){return!t.pluginHooks.eventSourceDefs[e.sourceDefId].ignoreRange}function gi(e,t,n,r,o){switch(t.type){case"RECEIVE_EVENTS":return function(e,t,n,r,o,i){if(t&&n===t.latestFetchId){var a=En(function(e,t,n){var r=n.options.eventDataTransform,o=t?t.eventDataTransform:null;o&&(e=mi(e,o));r&&(e=mi(e,r));return e}(o,t,i),t,i);return r&&(a=xt(a,r,i)),Cn(yi(e,t.sourceId),a)}return e}(e,n[t.sourceId],t.fetchId,t.fetchRange,t.rawEvents,o);case"ADD_EVENTS":return function(e,t,n,r){n&&(t=xt(t,n,r));return Cn(e,t)}(e,t.eventStore,r?r.activeRange:null,o);case"RESET_EVENTS":return t.eventStore;case"MERGE_EVENTS":return Cn(e,t.eventStore);case"PREV":case"NEXT":case"CHANGE_DATE":case"CHANGE_VIEW_TYPE":return r?xt(e,r.activeRange,o):e;case"REMOVE_EVENTS":return function(e,t){var n=e.defs,r=e.instances,o={},i={};for(var a in n)t.defs[a]||(o[a]=n[a]);for(var s in r)!t.instances[s]&&o[r[s].defId]&&(i[s]=r[s]);return{defs:o,instances:i}}(e,t.eventStore);case"REMOVE_EVENT_SOURCE":return yi(e,t.sourceId);case"REMOVE_ALL_EVENT_SOURCES":return wn(e,(function(e){return!e.sourceId}));case"REMOVE_ALL_EVENTS":return{defs:{},instances:{}};default:return e}}function mi(e,t){var n;if(t){n=[];for(var r=0,o=e;r<o.length;r++){var i=o[r],a=t(i);a?n.push(a):null==a&&n.push(i)}}else n=e;return n}function yi(e,t){return wn(e,(function(e){return e.sourceId!==t}))}function Ei(e,t){switch(t.type){case"UNSELECT_DATES":return null;case"SELECT_DATES":return t.selection;default:return e}}function Si(e,t){switch(t.type){case"UNSELECT_EVENT":return"";case"SELECT_EVENT":return t.eventInstanceId;default:return e}}function bi(e,t){var n;switch(t.type){case"UNSET_EVENT_DRAG":return null;case"SET_EVENT_DRAG":return{affectedEvents:(n=t.state).affectedEvents,mutatedEvents:n.mutatedEvents,isEvent:n.isEvent};default:return e}}function Di(e,t){var n;switch(t.type){case"UNSET_EVENT_RESIZE":return null;case"SET_EVENT_RESIZE":return{affectedEvents:(n=t.state).affectedEvents,mutatedEvents:n.mutatedEvents,isEvent:n.isEvent};default:return e}}function Ci(e,t,n,r,o){return{header:e.headerToolbar?wi(e.headerToolbar,e,t,n,r,o):null,footer:e.footerToolbar?wi(e.footerToolbar,e,t,n,r,o):null}}function wi(e,t,n,r,o,i){var a={},s=[],l=!1;for(var u in e){var c=Ri(e[u],t,n,r,o,i);a[u]=c.widgets,s.push.apply(s,c.viewsWithButtons),l=l||c.hasTitle}return{sectionWidgets:a,viewsWithButtons:s,hasTitle:l}}function Ri(e,t,n,r,o,i){var a="rtl"===t.direction,s=t.customButtons||{},l=n.buttonText||{},u=t.buttonText||{},c=n.buttonHints||{},d=t.buttonHints||{},p=e?e.split(" "):[],f=[],h=!1;return{widgets:p.map((function(e){return e.split(",").map((function(e){if("title"===e)return h=!0,{buttonName:e};var n,p,v,g,m,y;if(n=s[e])v=function(e){n.click&&n.click.call(e.target,e,e.target)},(g=r.getCustomButtonIconClass(n))||(g=r.getIconClass(e,a))||(m=n.text),y=n.hint||n.text;else if(p=o[e]){f.push(e),v=function(){i.changeView(e)},(m=p.buttonTextOverride)||(g=r.getIconClass(e,a))||(m=p.buttonTextDefault);var E=p.buttonTextOverride||p.buttonTextDefault;y=Xe(p.buttonTitleOverride||p.buttonTitleDefault||t.viewHint,[E,e],E)}else if(i[e])if(v=function(){i[e]()},(m=l[e])||(g=r.getIconClass(e,a))||(m=u[e]),"prevYear"===e||"nextYear"===e){var S="prevYear"===e?"prev":"next";y=Xe(c[S]||d[S],[u.year||"year","year"],u[e])}else y=function(t){return Xe(c[e]||d[e],[u[t]||t,t],u[e])};return{buttonName:e,buttonClick:v,buttonIcon:g,buttonText:m,buttonHint:y}}))})),viewsWithButtons:f,hasTitle:h}}function _i(e,t,n,r,o){var i=null;"GET"===(e=e.toUpperCase())?t=function(e,t){return e+(-1===e.indexOf("?")?"?":"&")+Ti(t)}(t,n):i=Ti(n);var a=new XMLHttpRequest;a.open(e,t,!0),"GET"!==e&&a.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),a.onload=function(){if(a.status>=200&&a.status<400){var e=!1,t=void 0;try{t=JSON.parse(a.responseText),e=!0}catch(e){}e?r(t,a):o("Failure parsing JSON",a)}else o("Request failed",a)},a.onerror=function(){o("Request failed",a)},a.send(i)}function Ti(e){var t=[];for(var n in e)t.push(encodeURIComponent(n)+"="+encodeURIComponent(e[n]));return t.join("&")}function ki(e,t){for(var n=Ct(t.getCurrentData().eventSources),r=[],o=0,i=e;o<i.length;o++){for(var a=i[o],s=!1,l=0;l<n.length;l+=1)if(n[l]._raw===a){n.splice(l,1),s=!0;break}s||r.push(a)}for(var u=0,c=n;u<c.length;u++){var d=c[u];t.dispatch({type:"REMOVE_EVENT_SOURCE",sourceId:d.sourceId})}for(var p=0,f=r;p<f.length;p++){var h=f[p];t.calendarApi.addEventSource(h)}}var xi=[zo({eventSourceDefs:[{ignoreRange:!0,parseMeta:function(e){return Array.isArray(e.events)?e.events:null},fetch:function(e,t){t({rawEvents:e.eventSource.meta})}}]}),zo({eventSourceDefs:[{parseMeta:function(e){return"function"==typeof e.events?e.events:null},fetch:function(e,t,n){var r=e.context.dateEnv;yo(e.eventSource.meta.bind(null,hr(e.range,r)),(function(e){t({rawEvents:e})}),n)}}]}),zo({eventSourceRefiners:{method:String,extraParams:yn,startParam:String,endParam:String,timeZoneParam:String},eventSourceDefs:[{parseMeta:function(e){return!e.url||"json"!==e.format&&e.format?null:{url:e.url,format:"json",method:(e.method||"GET").toUpperCase(),extraParams:e.extraParams,startParam:e.startParam,endParam:e.endParam,timeZoneParam:e.timeZoneParam}},fetch:function(e,t,n){var o=e.eventSource.meta,i=function(e,t,n){var o,i,a,s,l=n.dateEnv,u=n.options,c={};null==(o=e.startParam)&&(o=u.startParam);null==(i=e.endParam)&&(i=u.endParam);null==(a=e.timeZoneParam)&&(a=u.timeZoneParam);s="function"==typeof e.extraParams?e.extraParams():e.extraParams||{};r(c,s),c[o]=l.formatIso(t.start),c[i]=l.formatIso(t.end),"local"!==l.timeZone&&(c[a]=l.timeZone);return c}(o,e.range,e.context);_i(o.method,o.url,i,(function(e,n){t({rawEvents:e,xhr:n})}),(function(e,t){n({message:e,xhr:t})}))}}]}),zo({recurringTypes:[{parse:function(e,t){if(e.daysOfWeek||e.startTime||e.endTime||e.startRecur||e.endRecur){var n={daysOfWeek:e.daysOfWeek||null,startTime:e.startTime||null,endTime:e.endTime||null,startRecur:e.startRecur?t.createMarker(e.startRecur):null,endRecur:e.endRecur?t.createMarker(e.endRecur):null},r=void 0;return e.duration&&(r=e.duration),!r&&e.startTime&&e.endTime&&(o=e.endTime,i=e.startTime,r={years:o.years-i.years,months:o.months-i.months,days:o.days-i.days,milliseconds:o.milliseconds-i.milliseconds}),{allDayGuess:Boolean(!e.startTime&&!e.endTime),duration:r,typeData:n}}var o,i;return null},expand:function(e,t,n){var r=jn(t,{start:e.startRecur,end:e.endRecur});return r?function(e,t,n,r){var o=e?Dt(e):null,i=lt(n.start),a=n.end,s=[];for(;i<a;){var l=void 0;o&&!o[i.getUTCDay()]||(l=t?r.add(i,t):i,s.push(l)),i=tt(i,1)}return s}(e.daysOfWeek,e.startTime,r,n):[]}}],eventRefiners:{daysOfWeek:yn,startTime:Nt,endTime:Nt,duration:Nt,startRecur:yn,endRecur:yn}}),zo({optionChangeHandlers:{events:function(e,t){ki([e],t)},eventSources:ki}}),zo({isLoadingFuncs:[function(e){return ui(e.eventSources)}],contentTypeHandlers:{html:function(){var e=null,t="";return{render:function(n,r){n===e&&r===t||(n.innerHTML=r),e=n,t=r},destroy:function(){e.innerHTML="",e=null,t=""}}},domNodes:function(){var e=null,t=[];function n(){t.forEach(Ee),t=[],e=null}return{render:function(r,o){var i=Array.prototype.slice.call(o);if(r!==e||!Gt(t,i)){for(var a=0,s=i;a<s.length;a++){var l=s[a];r.appendChild(l)}n()}e=r,t=i},destroy:n}}},propSetHandlers:{dateProfile:function(e,t){t.emitter.trigger("datesSet",r(r({},hr(e.activeRange,t.dateEnv)),{view:t.viewApi}))},eventStore:function(e,t){var n=t.emitter;n.hasHandlers("eventsSet")&&n.trigger("eventsSet",Ir(e,t))}}})];var Mi=function(){function e(e){this.drainedOption=e,this.isRunning=!1,this.isDirty=!1,this.pauseDepths={},this.timeoutId=0}return e.prototype.request=function(e){this.isDirty=!0,this.isPaused()||(this.clearTimeout(),null==e?this.tryDrain():this.timeoutId=setTimeout(this.tryDrain.bind(this),e))},e.prototype.pause=function(e){void 0===e&&(e="");var t=this.pauseDepths;t[e]=(t[e]||0)+1,this.clearTimeout()},e.prototype.resume=function(e,t){void 0===e&&(e="");var n=this.pauseDepths;if(e in n){if(t)delete n[e];else n[e]-=1,n[e]<=0&&delete n[e];this.tryDrain()}},e.prototype.isPaused=function(){return Object.keys(this.pauseDepths).length},e.prototype.tryDrain=function(){if(!this.isRunning&&!this.isPaused()){for(this.isRunning=!0;this.isDirty;)this.isDirty=!1,this.drained();this.isRunning=!1}},e.prototype.clear=function(){this.clearTimeout(),this.isDirty=!1,this.pauseDepths={}},e.prototype.clearTimeout=function(){this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=0)},e.prototype.drained=function(){this.drainedOption&&this.drainedOption()},e}(),Ii=function(){function e(e,t){this.runTaskOption=e,this.drainedOption=t,this.queue=[],this.delayedRunner=new Mi(this.drain.bind(this))}return e.prototype.request=function(e,t){this.queue.push(e),this.delayedRunner.request(t)},e.prototype.pause=function(e){this.delayedRunner.pause(e)},e.prototype.resume=function(e,t){this.delayedRunner.resume(e,t)},e.prototype.drain=function(){for(var e=this.queue;e.length;){for(var t=[],n=void 0;n=e.shift();)this.runTask(n),t.push(n);this.drained(t)}},e.prototype.runTask=function(e){this.runTaskOption&&this.runTaskOption(e)},e.prototype.drained=function(e){this.drainedOption&&this.drainedOption(e)},e}();function Pi(e,t,n){var r;return r=/^(year|month)$/.test(e.currentRangeUnit)?e.currentRange:e.activeRange,n.formatRange(r.start,r.end,ln(t.titleFormat||function(e){var t=e.currentRangeUnit;if("year"===t)return{year:"numeric"};if("month"===t)return{year:"numeric",month:"long"};var n=st(e.currentRange.start,e.currentRange.end);if(null!==n&&n>1)return{year:"numeric",month:"short",day:"numeric"};return{year:"numeric",month:"long",day:"numeric"}}(e)),{isEndExclusive:e.isRangeAllDay,defaultSeparator:t.titleRangeSeparator})}var Ni=function(){function e(e){var t=this;this.computeOptionsData=qt(this._computeOptionsData),this.computeCurrentViewData=qt(this._computeCurrentViewData),this.organizeRawLocales=qt(Fr),this.buildLocale=qt(Br),this.buildPluginHooks=jo(),this.buildDateEnv=qt(Hi),this.buildTheme=qt(Oi),this.parseToolbars=qt(Ci),this.buildViewSpecs=qt(oi),this.buildDateProfileGenerator=Yt(Ai),this.buildViewApi=qt(Li),this.buildViewUiProps=Yt(Vi),this.buildEventUiBySource=qt(Ui,wt),this.buildEventUiBases=qt(Wi),this.parseContextBusinessHours=Yt(Bi),this.buildTitle=qt(Pi),this.emitter=new Eo,this.actionRunner=new Ii(this._handleAction.bind(this),this.updateData.bind(this)),this.currentCalendarOptionsInput={},this.currentCalendarOptionsRefined={},this.currentViewOptionsInput={},this.currentViewOptionsRefined={},this.currentCalendarOptionsRefiners={},this.getCurrentData=function(){return t.data},this.dispatch=function(e){t.actionRunner.request(e)},this.props=e,this.actionRunner.pause();var n={},o=this.computeOptionsData(e.optionOverrides,n,e.calendarApi),i=o.calendarOptions.initialView||o.pluginHooks.initialView,a=this.computeCurrentViewData(i,o,e.optionOverrides,n);e.calendarApi.currentDataManager=this,this.emitter.setThisContext(e.calendarApi),this.emitter.setOptions(a.options);var s,l,u,c=(s=o.calendarOptions,l=o.dateEnv,null!=(u=s.initialDate)?l.createMarker(u):Tr(s.now,l)),d=a.dateProfileGenerator.build(c);Zn(d.activeRange,c)||(c=d.currentRange.start);for(var p={dateEnv:o.dateEnv,options:o.calendarOptions,pluginHooks:o.pluginHooks,calendarApi:e.calendarApi,dispatch:this.dispatch,emitter:this.emitter,getCurrentData:this.getCurrentData},f=0,h=o.pluginHooks.contextInit;f<h.length;f++){(0,h[f])(p)}for(var v=si(o.calendarOptions,d,p),g={dynamicOptionOverrides:n,currentViewType:i,currentDate:c,dateProfile:d,businessHours:this.parseContextBusinessHours(p),eventSources:v,eventUiBases:{},eventStore:{defs:{},instances:{}},renderableEventStore:{defs:{},instances:{}},dateSelection:null,eventSelection:"",eventDrag:null,eventResize:null,selectionConfig:this.buildViewUiProps(p).selectionConfig},m=r(r({},p),g),y=0,E=o.pluginHooks.reducers;y<E.length;y++){var S=E[y];r(g,S(null,null,m))}Fi(g,p)&&this.emitter.trigger("loading",!0),this.state=g,this.updateData(),this.actionRunner.resume()}return e.prototype.resetOptions=function(e,t){var n=this.props;n.optionOverrides=t?r(r({},n.optionOverrides),e):e,this.actionRunner.request({type:"NOTHING"})},e.prototype._handleAction=function(e){var t=this,n=t.props,o=t.state,i=t.emitter,a=function(e,t){var n;switch(t.type){case"SET_OPTION":return r(r({},e),((n={})[t.optionName]=t.rawOptionValue,n));default:return e}}(o.dynamicOptionOverrides,e),s=this.computeOptionsData(n.optionOverrides,a,n.calendarApi),l=function(e,t){switch(t.type){case"CHANGE_VIEW_TYPE":e=t.viewType}return e}(o.currentViewType,e),u=this.computeCurrentViewData(l,s,n.optionOverrides,a);n.calendarApi.currentDataManager=this,i.setThisContext(n.calendarApi),i.setOptions(u.options);var c={dateEnv:s.dateEnv,options:s.calendarOptions,pluginHooks:s.pluginHooks,calendarApi:n.calendarApi,dispatch:this.dispatch,emitter:i,getCurrentData:this.getCurrentData},d=o.currentDate,p=o.dateProfile;this.data&&this.data.dateProfileGenerator!==u.dateProfileGenerator&&(p=u.dateProfileGenerator.build(d)),p=function(e,t,n,r){var o;switch(t.type){case"CHANGE_VIEW_TYPE":return r.build(t.dateMarker||n);case"CHANGE_DATE":return r.build(t.dateMarker);case"PREV":if((o=r.buildPrev(e,n)).isValid)return o;break;case"NEXT":if((o=r.buildNext(e,n)).isValid)return o}return e}(p,e,d=function(e,t){switch(t.type){case"CHANGE_DATE":return t.dateMarker;default:return e}}(d,e),u.dateProfileGenerator),"PREV"!==e.type&&"NEXT"!==e.type&&Zn(p.currentRange,d)||(d=p.currentRange.start);for(var f=li(o.eventSources,e,p,c),h=gi(o.eventStore,e,f,p,c),v=ui(f)&&!u.options.progressiveEventRendering&&o.renderableEventStore||h,g=this.buildViewUiProps(c),m=g.eventUiSingleBase,y=g.selectionConfig,E=this.buildEventUiBySource(f),S={dynamicOptionOverrides:a,currentViewType:l,currentDate:d,dateProfile:p,eventSources:f,eventStore:h,renderableEventStore:v,selectionConfig:y,eventUiBases:this.buildEventUiBases(v.defs,m,E),businessHours:this.parseContextBusinessHours(c),dateSelection:Ei(o.dateSelection,e),eventSelection:Si(o.eventSelection,e),eventDrag:bi(o.eventDrag,e),eventResize:Di(o.eventResize,e)},b=r(r({},c),S),D=0,C=s.pluginHooks.reducers;D<C.length;D++){var w=C[D];r(S,w(o,e,b))}var R=Fi(o,c),_=Fi(S,c);!R&&_?i.trigger("loading",!0):R&&!_&&i.trigger("loading",!1),this.state=S,n.onAction&&n.onAction(e)},e.prototype.updateData=function(){var e,t,n,o,i,a,s,l,u,c=this.props,d=this.state,p=this.data,f=this.computeOptionsData(c.optionOverrides,d.dynamicOptionOverrides,c.calendarApi),h=this.computeCurrentViewData(d.currentViewType,f,c.optionOverrides,d.dynamicOptionOverrides),v=this.data=r(r(r({viewTitle:this.buildTitle(d.dateProfile,h.options,f.dateEnv),calendarApi:c.calendarApi,dispatch:this.dispatch,emitter:this.emitter,getCurrentData:this.getCurrentData},f),h),d),g=f.pluginHooks.optionChangeHandlers,m=p&&p.calendarOptions,y=f.calendarOptions;if(m&&m!==y)for(var E in m.timeZone!==y.timeZone&&(d.eventSources=v.eventSources=(a=v.eventSources,s=d.dateProfile,l=v,u=s?s.activeRange:null,pi(a,hi(a,l),u,!0,l)),d.eventStore=v.eventStore=(e=v.eventStore,t=p.dateEnv,n=v.dateEnv,o=e.defs,i=bt(e.instances,(function(e){var i=o[e.defId];return i.allDay||i.recurringDef?e:r(r({},e),{range:{start:n.createMarker(t.toDate(e.range.start,e.forcedStartTzo)),end:n.createMarker(t.toDate(e.range.end,e.forcedEndTzo))},forcedStartTzo:n.canComputeOffset?null:e.forcedStartTzo,forcedEndTzo:n.canComputeOffset?null:e.forcedEndTzo})})),{defs:o,instances:i})),g)m[E]!==y[E]&&g[E](y[E],v);c.onData&&c.onData(v)},e.prototype._computeOptionsData=function(e,t,n){var r=this.processRawCalendarOptions(e,t),o=r.refinedOptions,i=r.pluginHooks,a=r.localeDefaults,s=r.availableLocaleData;zi(r.extra);var l=this.buildDateEnv(o.timeZone,o.locale,o.weekNumberCalculation,o.firstDay,o.weekText,i,s,o.defaultRangeSeparator),u=this.buildViewSpecs(i.views,e,t,a),c=this.buildTheme(o,i);return{calendarOptions:o,pluginHooks:i,dateEnv:l,viewSpecs:u,theme:c,toolbarConfig:this.parseToolbars(o,e,c,u,n),localeDefaults:a,availableRawLocales:s.map}},e.prototype.processRawCalendarOptions=function(e,t){var n=gn([cn,e,t]),o=n.locales,i=n.locale,a=this.organizeRawLocales(o),s=a.map,l=this.buildLocale(i||a.defaultCode,s).options,u=this.buildPluginHooks(e.plugins||[],xi),c=this.currentCalendarOptionsRefiners=r(r(r(r(r({},un),dn),pn),u.listenerRefiners),u.optionRefiners),d={},p=gn([cn,l,e,t]),f={},h=this.currentCalendarOptionsInput,v=this.currentCalendarOptionsRefined,g=!1;for(var m in p)"plugins"!==m&&(p[m]===h[m]||fn[m]&&m in h&&fn[m](h[m],p[m])?f[m]=v[m]:c[m]?(f[m]=c[m](p[m]),g=!0):d[m]=h[m]);return g&&(this.currentCalendarOptionsInput=p,this.currentCalendarOptionsRefined=f),{rawOptions:this.currentCalendarOptionsInput,refinedOptions:this.currentCalendarOptionsRefined,pluginHooks:u,availableLocaleData:a,localeDefaults:l,extra:d}},e.prototype._computeCurrentViewData=function(e,t,n,r){var o=t.viewSpecs[e];if(!o)throw new Error('viewType "'+e+"\" is not available. Please make sure you've loaded all neccessary plugins");var i=this.processRawViewOptions(o,t.pluginHooks,t.localeDefaults,n,r),a=i.refinedOptions;return zi(i.extra),{viewSpec:o,options:a,dateProfileGenerator:this.buildDateProfileGenerator({dateProfileGeneratorClass:o.optionDefaults.dateProfileGeneratorClass,duration:o.duration,durationUnit:o.durationUnit,usesMinMaxTime:o.optionDefaults.usesMinMaxTime,dateEnv:t.dateEnv,calendarApi:this.props.calendarApi,slotMinTime:a.slotMinTime,slotMaxTime:a.slotMaxTime,showNonCurrentDates:a.showNonCurrentDates,dayCount:a.dayCount,dateAlignment:a.dateAlignment,dateIncrement:a.dateIncrement,hiddenDays:a.hiddenDays,weekends:a.weekends,nowInput:a.now,validRangeInput:a.validRange,visibleRangeInput:a.visibleRange,monthMode:a.monthMode,fixedWeekCount:a.fixedWeekCount}),viewApi:this.buildViewApi(e,this.getCurrentData,t.dateEnv)}},e.prototype.processRawViewOptions=function(e,t,n,o,i){var a=gn([cn,e.optionDefaults,n,o,e.optionOverrides,i]),s=r(r(r(r(r(r({},un),dn),pn),vn),t.listenerRefiners),t.optionRefiners),l={},u=this.currentViewOptionsInput,c=this.currentViewOptionsRefined,d=!1,p={};for(var f in a)a[f]===u[f]?l[f]=c[f]:(a[f]===this.currentCalendarOptionsInput[f]?f in this.currentCalendarOptionsRefined&&(l[f]=this.currentCalendarOptionsRefined[f]):s[f]?l[f]=s[f](a[f]):p[f]=a[f],d=!0);return d&&(this.currentViewOptionsInput=a,this.currentViewOptionsRefined=l),{rawOptions:this.currentViewOptionsInput,refinedOptions:this.currentViewOptionsRefined,extra:p}},e}();function Hi(e,t,n,r,o,i,a,s){var l=Br(t||a.defaultCode,a.map);return new Lr({calendarSystem:"gregory",timeZone:e,namedTimeZoneImpl:i.namedTimeZonedImpl,locale:l,weekNumberCalculation:n,firstDay:r,weekText:o,cmdFormatter:i.cmdFormatter,defaultSeparator:s})}function Oi(e,t){return new(t.themeClasses[e.themeSystem]||Go)(e)}function Ai(e){return new(e.dateProfileGeneratorClass||ai)(e)}function Li(e,t,n){return new Cr(e,t,n)}function Ui(e){return bt(e,(function(e){return e.ui}))}function Wi(e,t,n){var r={"":t};for(var o in e){var i=e[o];i.sourceId&&n[i.sourceId]&&(r[o]=n[i.sourceId])}return r}function Vi(e){var t=e.options;return{eventUiSingleBase:kn({display:t.eventDisplay,editable:t.editable,startEditable:t.eventStartEditable,durationEditable:t.eventDurationEditable,constraint:t.eventConstraint,overlap:"boolean"==typeof t.eventOverlap?t.eventOverlap:void 0,allow:t.eventAllow,backgroundColor:t.eventBackgroundColor,borderColor:t.eventBorderColor,textColor:t.eventTextColor,color:t.eventColor},e),selectionConfig:kn({constraint:t.selectConstraint,overlap:"boolean"==typeof t.selectOverlap?t.selectOverlap:void 0,allow:t.selectAllow},e)}}function Fi(e,t){for(var n=0,r=t.pluginHooks.isLoadingFuncs;n<r.length;n++){if((0,r[n])(e))return!0}return!1}function Bi(e){return Yr(e.options.businessHours,e)}function zi(e,t){for(var n in e)console.warn("Unknown option '"+n+"'"+(t?" for view '"+t+"'":""))}var ji=function(e){function t(t){var n=e.call(this,t)||this;return n.handleData=function(e){n.dataManager?n.setState(e):n.state=e},n.dataManager=new Ni({optionOverrides:t.optionOverrides,calendarApi:t.calendarApi,onData:n.handleData}),n}return n(t,e),t.prototype.render=function(){return this.props.children(this.state)},t.prototype.componentDidUpdate=function(e){var t=this.props.optionOverrides;t!==e.optionOverrides&&this.dataManager.resetOptions(t)},t}(Ro);var Gi=function(e){this.timeZoneName=e},qi=function(){function e(){this.strictOrder=!1,this.allowReslicing=!1,this.maxCoord=-1,this.maxStackCnt=-1,this.levelCoords=[],this.entriesByLevel=[],this.stackCnts={}}return e.prototype.addSegs=function(e){for(var t=[],n=0,r=e;n<r.length;n++){var o=r[n];this.insertEntry(o,t)}return t},e.prototype.insertEntry=function(e,t){var n=this.findInsertion(e);return this.isInsertionValid(n,e)?(this.insertEntryAt(e,n),1):this.handleInvalidInsertion(n,e,t)},e.prototype.isInsertionValid=function(e,t){return(-1===this.maxCoord||e.levelCoord+t.thickness<=this.maxCoord)&&(-1===this.maxStackCnt||e.stackCnt<this.maxStackCnt)},e.prototype.handleInvalidInsertion=function(e,t,n){return this.allowReslicing&&e.touchingEntry?this.splitEntry(t,e.touchingEntry,n):(n.push(t),0)},e.prototype.splitEntry=function(e,t,n){var r=0,i=[],a=e.span,s=t.span;return a.start<s.start&&(r+=this.insertEntry({index:e.index,thickness:e.thickness,span:{start:a.start,end:s.start}},i)),a.end>s.end&&(r+=this.insertEntry({index:e.index,thickness:e.thickness,span:{start:s.end,end:a.end}},i)),r?(n.push.apply(n,o([{index:e.index,thickness:e.thickness,span:$i(s,a)}],i)),r):(n.push(e),0)},e.prototype.insertEntryAt=function(e,t){var n=this.entriesByLevel,r=this.levelCoords;-1===t.lateral?(Ji(r,t.level,t.levelCoord),Ji(n,t.level,[e])):Ji(n[t.level],t.lateral,e),this.stackCnts[Zi(e)]=t.stackCnt},e.prototype.findInsertion=function(e){for(var t=this,n=t.levelCoords,r=t.entriesByLevel,o=t.strictOrder,i=t.stackCnts,a=n.length,s=0,l=-1,u=-1,c=null,d=0,p=0;p<a;p+=1){var f=n[p];if(!o&&f>=s+e.thickness)break;for(var h=r[p],v=void 0,g=Qi(h,e.span.start,Yi),m=g[0]+g[1];(v=h[m])&&v.span.start<e.span.end;){var y=f+v.thickness;y>s&&(s=y,c=v,l=p,u=m),y===s&&(d=Math.max(d,i[Zi(v)]+1)),m+=1}}var E=0;if(c)for(E=l+1;E<a&&n[E]<s;)E+=1;var S=-1;return E<a&&n[E]===s&&(S=Qi(r[E],e.span.end,Yi)[0]),{touchingLevel:l,touchingLateral:u,touchingEntry:c,stackCnt:d,levelCoord:s,level:E,lateral:S}},e.prototype.toRects=function(){for(var e=this.entriesByLevel,t=this.levelCoords,n=e.length,o=[],i=0;i<n;i+=1)for(var a=e[i],s=t[i],l=0,u=a;l<u.length;l++){var c=u[l];o.push(r(r({},c),{levelCoord:s}))}return o},e}();function Yi(e){return e.span.end}function Zi(e){return e.index+":"+e.span.start}function Xi(e){for(var t=[],n=0,r=e;n<r.length;n++){for(var o=r[n],i=[],a={span:o.span,entries:[o]},s=0,l=t;s<l.length;s++){var u=l[s];$i(u.span,a.span)?a={entries:u.entries.concat(a.entries),span:Ki(u.span,a.span)}:i.push(u)}i.push(a),t=i}return t}function Ki(e,t){return{start:Math.min(e.start,t.start),end:Math.max(e.end,t.end)}}function $i(e,t){var n=Math.max(e.start,t.start),r=Math.min(e.end,t.end);return n<r?{start:n,end:r}:null}function Ji(e,t,n){e.splice(t,0,n)}function Qi(e,t,n){var r=0,o=e.length;if(!o||t<n(e[r]))return[0,0];if(t>n(e[o-1]))return[o,0];for(;r<o;){var i=Math.floor(r+(o-r)/2),a=n(e[i]);if(t<a)o=i;else{if(!(t>a))return[i,1];r=i+1}}return[r,0]}var ea=function(){function e(e){this.component=e.component,this.isHitComboAllowed=e.isHitComboAllowed||null}return e.prototype.destroy=function(){},e}();function ta(e,t){return{component:e,el:t.el,useEventCenter:null==t.useEventCenter||t.useEventCenter,isHitComboAllowed:t.isHitComboAllowed||null}}function na(e){var t;return(t={})[e.component.uid]=e,t}var ra={},oa=function(){function e(e,t){this.emitter=new Eo}return e.prototype.destroy=function(){},e.prototype.setMirrorIsVisible=function(e){},e.prototype.setMirrorNeedsRevert=function(e){},e.prototype.setAutoScrollEnabled=function(e){},e}(),ia={},aa={startTime:Nt,duration:Nt,create:Boolean,sourceId:String};function sa(e){var t=mn(e,aa),n=t.refined,r=t.extra;return{startTime:n.startTime||null,duration:n.duration||null,create:null==n.create||n.create,sourceId:n.sourceId,leftoverProps:r}}var la=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this,t=this.props.widgetGroups.map((function(t){return e.renderWidgetGroup(t)}));return _o.apply(void 0,o(["div",{className:"fc-toolbar-chunk"}],t))},t.prototype.renderWidgetGroup=function(e){for(var t=this.props,n=this.context.theme,r=[],i=!0,a=0,s=e;a<s.length;a++){var l=s[a],u=l.buttonName,c=l.buttonClick,d=l.buttonText,p=l.buttonIcon,f=l.buttonHint;if("title"===u)i=!1,r.push(_o("h2",{className:"fc-toolbar-title",id:t.titleId},t.title));else{var h=u===t.activeButton,v=!t.isTodayEnabled&&"today"===u||!t.isPrevEnabled&&"prev"===u||!t.isNextEnabled&&"next"===u,g=["fc-"+u+"-button",n.getClass("button")];h&&g.push(n.getClass("buttonActive")),r.push(_o("button",{type:"button",title:"function"==typeof f?f(t.navUnit):f,disabled:v,"aria-pressed":h,className:g.join(" "),onClick:c},d||(p?_o("span",{className:p}):"")))}}if(r.length>1){var m=i&&n.getClass("buttonGroup")||"";return _o.apply(void 0,o(["div",{className:m}],r))}return r[0]},t}(Uo),ua=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e,t,n=this.props,r=n.model,o=n.extraClassName,i=!1,a=r.sectionWidgets,s=a.center;return a.left?(i=!0,e=a.left):e=a.start,a.right?(i=!0,t=a.right):t=a.end,_o("div",{className:[o||"","fc-toolbar",i?"fc-toolbar-ltr":""].join(" ")},this.renderSection("start",e||[]),this.renderSection("center",s||[]),this.renderSection("end",t||[]))},t.prototype.renderSection=function(e,t){var n=this.props;return _o(la,{key:e,widgetGroups:t,title:n.title,navUnit:n.navUnit,activeButton:n.activeButton,isTodayEnabled:n.isTodayEnabled,isPrevEnabled:n.isPrevEnabled,isNextEnabled:n.isNextEnabled,titleId:n.titleId})},t}(Uo),ca=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.state={availableWidth:null},t.handleEl=function(e){t.el=e,Fo(t.props.elRef,e),t.updateAvailableWidth()},t.handleResize=function(){t.updateAvailableWidth()},t}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.state,n=e.aspectRatio,r=["fc-view-harness",n||e.liquid||e.height?"fc-view-harness-active":"fc-view-harness-passive"],o="",i="";return n?null!==t.availableWidth?o=t.availableWidth/n:i=1/n*100+"%":o=e.height||"",_o("div",{"aria-labelledby":e.labeledById,ref:this.handleEl,className:r.join(" "),style:{height:o,paddingBottom:i}},e.children)},t.prototype.componentDidMount=function(){this.context.addResizeHandler(this.handleResize)},t.prototype.componentWillUnmount=function(){this.context.removeResizeHandler(this.handleResize)},t.prototype.updateAvailableWidth=function(){this.el&&this.props.aspectRatio&&this.setState({availableWidth:this.el.offsetWidth})},t}(Uo),da=function(e){function t(t){var n=e.call(this,t)||this;return n.handleSegClick=function(e,t){var r=n.component,o=r.context,i=Jn(t);if(i&&r.isValidSegDownEl(e.target)){var a=Se(e.target,".fc-event-forced-url"),s=a?a.querySelector("a[href]").href:"";o.emitter.trigger("eventClick",{el:t,event:new xr(r.context,i.eventRange.def,i.eventRange.instance),jsEvent:e,view:o.viewApi}),s&&!e.defaultPrevented&&(window.location.href=s)}},n.destroy=Ie(t.el,"click",".fc-event",n.handleSegClick),n}return n(t,e),t}(ea),pa=function(e){function t(t){var n,r,o,i,a,s=e.call(this,t)||this;return s.handleEventElRemove=function(e){e===s.currentSegEl&&s.handleSegLeave(null,s.currentSegEl)},s.handleSegEnter=function(e,t){Jn(t)&&(s.currentSegEl=t,s.triggerEvent("eventMouseEnter",e,t))},s.handleSegLeave=function(e,t){s.currentSegEl&&(s.currentSegEl=null,s.triggerEvent("eventMouseLeave",e,t))},s.removeHoverListeners=(n=t.el,r=".fc-event",o=s.handleSegEnter,i=s.handleSegLeave,Ie(n,"mouseover",r,(function(e,t){if(t!==a){a=t,o(e,t);var n=function(e){a=null,i(e,t),t.removeEventListener("mouseleave",n)};t.addEventListener("mouseleave",n)}}))),s}return n(t,e),t.prototype.destroy=function(){this.removeHoverListeners()},t.prototype.triggerEvent=function(e,t,n){var r=this.component,o=r.context,i=Jn(n);t&&!r.isValidSegDownEl(t.target)||o.emitter.trigger(e,{el:n,event:new xr(o,i.eventRange.def,i.eventRange.instance),jsEvent:t,view:o.viewApi})},t}(ea),fa=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.buildViewContext=qt(Ao),t.buildViewPropTransformers=qt(va),t.buildToolbarProps=qt(ha),t.headerRef=ko(),t.footerRef=ko(),t.interactionsStore={},t.state={viewLabelId:xe()},t.registerInteractiveComponent=function(e,n){var r=ta(e,n),o=[da,pa].concat(t.props.pluginHooks.componentInteractions).map((function(e){return new e(r)}));t.interactionsStore[e.uid]=o,ra[e.uid]=r},t.unregisterInteractiveComponent=function(e){for(var n=0,r=t.interactionsStore[e.uid];n<r.length;n++){r[n].destroy()}delete t.interactionsStore[e.uid],delete ra[e.uid]},t.resizeRunner=new Mi((function(){t.props.emitter.trigger("_resize",!0),t.props.emitter.trigger("windowResize",{view:t.props.viewApi})})),t.handleWindowResize=function(e){var n=t.props.options;n.handleWindowResize&&e.target===window&&t.resizeRunner.request(n.windowResizeDelay)},t}return n(t,e),t.prototype.render=function(){var e,t=this.props,n=t.toolbarConfig,o=t.options,i=this.buildToolbarProps(t.viewSpec,t.dateProfile,t.dateProfileGenerator,t.currentDate,Tr(t.options.now,t.dateEnv),t.viewTitle),a=!1,s="";t.isHeightAuto||t.forPrint?s="":null!=o.height?a=!0:null!=o.contentHeight?s=o.contentHeight:e=Math.max(o.aspectRatio,.5);var l=this.buildViewContext(t.viewSpec,t.viewApi,t.options,t.dateProfileGenerator,t.dateEnv,t.theme,t.pluginHooks,t.dispatch,t.getCurrentData,t.emitter,t.calendarApi,this.registerInteractiveComponent,this.unregisterInteractiveComponent),u=n.header&&n.header.hasTitle?this.state.viewLabelId:"";return _o(Oo.Provider,{value:l},n.header&&_o(ua,r({ref:this.headerRef,extraClassName:"fc-header-toolbar",model:n.header,titleId:u},i)),_o(ca,{liquid:a,height:s,aspectRatio:e,labeledById:u},this.renderView(t),this.buildAppendContent()),n.footer&&_o(ua,r({ref:this.footerRef,extraClassName:"fc-footer-toolbar",model:n.footer,titleId:""},i)))},t.prototype.componentDidMount=function(){var e=this.props;this.calendarInteractions=e.pluginHooks.calendarInteractions.map((function(t){return new t(e)})),window.addEventListener("resize",this.handleWindowResize);var t=e.pluginHooks.propSetHandlers;for(var n in t)t[n](e[n],e)},t.prototype.componentDidUpdate=function(e){var t=this.props,n=t.pluginHooks.propSetHandlers;for(var r in n)t[r]!==e[r]&&n[r](t[r],t)},t.prototype.componentWillUnmount=function(){window.removeEventListener("resize",this.handleWindowResize),this.resizeRunner.clear();for(var e=0,t=this.calendarInteractions;e<t.length;e++){t[e].destroy()}this.props.emitter.trigger("_unmount")},t.prototype.buildAppendContent=function(){var e=this.props,t=e.pluginHooks.viewContainerAppends.map((function(t){return t(e)}));return _o.apply(void 0,o([xo,{}],t))},t.prototype.renderView=function(e){for(var t=e.pluginHooks,n=e.viewSpec,o={dateProfile:e.dateProfile,businessHours:e.businessHours,eventStore:e.renderableEventStore,eventUiBases:e.eventUiBases,dateSelection:e.dateSelection,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize,isHeightAuto:e.isHeightAuto,forPrint:e.forPrint},i=0,a=this.buildViewPropTransformers(t.viewPropsTransformers);i<a.length;i++){var s=a[i];r(o,s.transform(o,e))}var l=n.component;return _o(l,r({},o))},t}(Lo);function ha(e,t,n,r,o,i){var a=n.build(o,void 0,!1),s=n.buildPrev(t,r,!1),l=n.buildNext(t,r,!1);return{title:i,activeButton:e.type,navUnit:e.singleUnit,isTodayEnabled:a.isValid&&!Zn(t.currentRange,o),isPrevEnabled:s.isValid,isNextEnabled:l.isValid}}function va(e){return e.map((function(e){return new e}))}var ga=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.state={forPrint:!1},t.handleBeforePrint=function(){t.setState({forPrint:!0})},t.handleAfterPrint=function(){t.setState({forPrint:!1})},t}return n(t,e),t.prototype.render=function(){var e=this.props,t=e.options,n=this.state.forPrint,r=n||"auto"===t.height||"auto"===t.contentHeight,o=r||null==t.height?"":t.height,i=["fc",n?"fc-media-print":"fc-media-screen","fc-direction-"+t.direction,e.theme.getClass("root")];return Qr()||i.push("fc-liquid-hack"),e.children(i,o,r,n)},t.prototype.componentDidMount=function(){var e=this.props.emitter;e.on("_beforeprint",this.handleBeforePrint),e.on("_afterprint",this.handleAfterPrint)},t.prototype.componentWillUnmount=function(){var e=this.props.emitter;e.off("_beforeprint",this.handleBeforePrint),e.off("_afterprint",this.handleAfterPrint)},t}(Uo);function ma(e,t){return ln(!e||t>10?{weekday:"short"}:t>1?{weekday:"short",month:"numeric",day:"numeric",omitCommas:!0}:{weekday:"long"})}var ya="fc-col-header-cell";function Ea(e){return e.text}var Sa=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.context,t=e.dateEnv,n=e.options,o=e.theme,i=e.viewApi,a=this.props,s=a.date,l=a.dateProfile,u=ro(s,a.todayRange,null,l),c=[ya].concat(oo(u,o)),d=t.format(s,a.dayHeaderFormat),p=!u.isDisabled&&a.colCnt>1?so(this.context,s):{},f=r(r(r({date:t.toDate(s),view:i},a.extraHookProps),{text:d}),u);return _o(Yo,{hookProps:f,classNames:n.dayHeaderClassNames,content:n.dayHeaderContent,defaultContent:Ea,didMount:n.dayHeaderDidMount,willUnmount:n.dayHeaderWillUnmount},(function(e,t,n,o){return _o("th",r({ref:e,role:"columnheader",className:c.concat(t).join(" "),"data-date":u.isDisabled?void 0:Bt(s),colSpan:a.colSpan},a.extraDataAttrs),_o("div",{className:"fc-scrollgrid-sync-inner"},!u.isDisabled&&_o("a",r({ref:n,className:["fc-col-header-cell-cushion",a.isSticky?"fc-sticky":""].join(" ")},p),o)))}))},t}(Uo),ba=ln({weekday:"long"}),Da=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context,n=t.dateEnv,o=t.theme,i=t.viewApi,a=t.options,s=tt(new Date(2592e5),e.dow),l={dow:e.dow,isDisabled:!1,isFuture:!1,isPast:!1,isToday:!1,isOther:!1},u=[ya].concat(oo(l,o),e.extraClassNames||[]),c=n.format(s,e.dayHeaderFormat),d=r(r(r(r({date:s},l),{view:i}),e.extraHookProps),{text:c});return _o(Yo,{hookProps:d,classNames:a.dayHeaderClassNames,content:a.dayHeaderContent,defaultContent:Ea,didMount:a.dayHeaderDidMount,willUnmount:a.dayHeaderWillUnmount},(function(t,o,i,a){return _o("th",r({ref:t,role:"columnheader",className:u.concat(o).join(" "),colSpan:e.colSpan},e.extraDataAttrs),_o("div",{className:"fc-scrollgrid-sync-inner"},_o("a",{"aria-label":n.format(s,ba),className:["fc-col-header-cell-cushion",e.isSticky?"fc-sticky":""].join(" "),ref:i},a)))}))},t}(Uo),Ca=function(e){function t(t,n){var r=e.call(this,t,n)||this;return r.initialNowDate=Tr(n.options.now,n.dateEnv),r.initialNowQueriedMs=(new Date).valueOf(),r.state=r.computeTiming().currentState,r}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.state;return e.children(t.nowDate,t.todayRange)},t.prototype.componentDidMount=function(){this.setTimeout()},t.prototype.componentDidUpdate=function(e){e.unit!==this.props.unit&&(this.clearTimeout(),this.setTimeout())},t.prototype.componentWillUnmount=function(){this.clearTimeout()},t.prototype.computeTiming=function(){var e=this.props,t=this.context,n=nt(this.initialNowDate,(new Date).valueOf()-this.initialNowQueriedMs),r=t.dateEnv.startOf(n,e.unit),o=t.dateEnv.add(r,Nt(1,e.unit)),i=o.valueOf()-n.valueOf();return i=Math.min(864e5,i),{currentState:{nowDate:r,todayRange:wa(r)},nextState:{nowDate:o,todayRange:wa(o)},waitMs:i}},t.prototype.setTimeout=function(){var e=this,t=this.computeTiming(),n=t.nextState,r=t.waitMs;this.timeoutId=setTimeout((function(){e.setState(n,(function(){e.setTimeout()}))}),r)},t.prototype.clearTimeout=function(){this.timeoutId&&clearTimeout(this.timeoutId)},t.contextType=Oo,t}(Ro);function wa(e){var t=lt(e);return{start:t,end:tt(t,1)}}var Ra=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.createDayHeaderFormatter=qt(_a),t}return n(t,e),t.prototype.render=function(){var e=this.context,t=this.props,n=t.dates,r=t.dateProfile,o=t.datesRepDistinctDays,i=t.renderIntro,a=this.createDayHeaderFormatter(e.options.dayHeaderFormat,o,n.length);return _o(Ca,{unit:"day"},(function(e,t){return _o("tr",{role:"row"},i&&i("day"),n.map((function(e){return o?_o(Sa,{key:e.toISOString(),date:e,dateProfile:r,todayRange:t,colCnt:n.length,dayHeaderFormat:a}):_o(Da,{key:e.getUTCDay(),dow:e.getUTCDay(),dayHeaderFormat:a})})))}))},t}(Uo);function _a(e,t,n){return e||ma(t,n)}var Ta=function(){function e(e,t){for(var n=e.start,r=e.end,o=[],i=[],a=-1;n<r;)t.isHiddenDay(n)?o.push(a+.5):(a+=1,o.push(a),i.push(n)),n=tt(n,1);this.dates=i,this.indices=o,this.cnt=i.length}return e.prototype.sliceRange=function(e){var t=this.getDateDayIndex(e.start),n=this.getDateDayIndex(tt(e.end,-1)),r=Math.max(0,t),o=Math.min(this.cnt-1,n);return(r=Math.ceil(r))<=(o=Math.floor(o))?{firstIndex:r,lastIndex:o,isStart:t===r,isEnd:n===o}:null},e.prototype.getDateDayIndex=function(e){var t=this.indices,n=Math.floor(ot(this.dates[0],e));return n<0?t[0]-1:n>=t.length?t[t.length-1]+1:t[n]},e}(),ka=function(){function e(e,t){var n,r,o,i=e.dates;if(t){for(r=i[0].getUTCDay(),n=1;n<i.length&&i[n].getUTCDay()!==r;n+=1);o=Math.ceil(i.length/n)}else o=1,n=i.length;this.rowCnt=o,this.colCnt=n,this.daySeries=e,this.cells=this.buildCells(),this.headerDates=this.buildHeaderDates()}return e.prototype.buildCells=function(){for(var e=[],t=0;t<this.rowCnt;t+=1){for(var n=[],r=0;r<this.colCnt;r+=1)n.push(this.buildCell(t,r));e.push(n)}return e},e.prototype.buildCell=function(e,t){var n=this.daySeries.dates[e*this.colCnt+t];return{key:n.toISOString(),date:n}},e.prototype.buildHeaderDates=function(){for(var e=[],t=0;t<this.colCnt;t+=1)e.push(this.cells[0][t].date);return e},e.prototype.sliceRange=function(e){var t=this.colCnt,n=this.daySeries.sliceRange(e),r=[];if(n)for(var o=n.firstIndex,i=n.lastIndex,a=o;a<=i;){var s=Math.floor(a/t),l=Math.min((s+1)*t,i+1);r.push({row:s,firstCol:a%t,lastCol:(l-1)%t,isStart:n.isStart&&a===o,isEnd:n.isEnd&&l-1===i}),a=l}return r},e}(),xa=function(){function e(){this.sliceBusinessHours=qt(this._sliceBusinessHours),this.sliceDateSelection=qt(this._sliceDateSpan),this.sliceEventStore=qt(this._sliceEventStore),this.sliceEventDrag=qt(this._sliceInteraction),this.sliceEventResize=qt(this._sliceInteraction),this.forceDayIfListItem=!1}return e.prototype.sliceProps=function(e,t,n,r){for(var i=[],a=4;a<arguments.length;a++)i[a-4]=arguments[a];var s=e.eventUiBases,l=this.sliceEventStore.apply(this,o([e.eventStore,s,t,n],i));return{dateSelectionSegs:this.sliceDateSelection.apply(this,o([e.dateSelection,s,r],i)),businessHourSegs:this.sliceBusinessHours.apply(this,o([e.businessHours,t,n,r],i)),fgEventSegs:l.fg,bgEventSegs:l.bg,eventDrag:this.sliceEventDrag.apply(this,o([e.eventDrag,s,t,n],i)),eventResize:this.sliceEventResize.apply(this,o([e.eventResize,s,t,n],i)),eventSelection:e.eventSelection}},e.prototype.sliceNowDate=function(e,t){for(var n=[],r=2;r<arguments.length;r++)n[r-2]=arguments[r];return this._sliceDateSpan.apply(this,o([{range:{start:e,end:nt(e,1)},allDay:!1},{},t],n))},e.prototype._sliceBusinessHours=function(e,t,n,r){for(var i=[],a=4;a<arguments.length;a++)i[a-4]=arguments[a];return e?this._sliceEventStore.apply(this,o([xt(e,Ma(t,Boolean(n)),r),{},t,n],i)).bg:[]},e.prototype._sliceEventStore=function(e,t,n,r){for(var o=[],i=4;i<arguments.length;i++)o[i-4]=arguments[i];if(e){var a=Xn(e,t,Ma(n,Boolean(r)),r);return{bg:this.sliceEventRanges(a.bg,o),fg:this.sliceEventRanges(a.fg,o)}}return{bg:[],fg:[]}},e.prototype._sliceInteraction=function(e,t,n,r){for(var o=[],i=4;i<arguments.length;i++)o[i-4]=arguments[i];if(!e)return null;var a=Xn(e.mutatedEvents,t,Ma(n,Boolean(r)),r);return{segs:this.sliceEventRanges(a.fg,o),affectedInstances:e.affectedEvents.instances,isEvent:e.isEvent}},e.prototype._sliceDateSpan=function(e,t,n){for(var r=[],i=3;i<arguments.length;i++)r[i-3]=arguments[i];if(!e)return[];for(var a=gr(e,t,n),s=this.sliceRange.apply(this,o([e.range],r)),l=0,u=s;l<u.length;l++){var c=u[l];c.eventRange=a}return s},e.prototype.sliceEventRanges=function(e,t){for(var n=[],r=0,o=e;r<o.length;r++){var i=o[r];n.push.apply(n,this.sliceEventRange(i,t))}return n},e.prototype.sliceEventRange=function(e,t){var n=e.range;this.forceDayIfListItem&&"list-item"===e.ui.display&&(n={start:n.start,end:tt(n.start,1)});for(var r=this.sliceRange.apply(this,o([n],t)),i=0,a=r;i<a.length;i++){var s=a[i];s.eventRange=e,s.isStart=e.isStart&&s.isStart,s.isEnd=e.isEnd&&s.isEnd}return r},e}();function Ma(e,t){var n=e.activeRange;return t?n:{start:nt(n.start,e.slotMinTime.milliseconds),end:nt(n.end,e.slotMaxTime.milliseconds-864e5)}}function Ia(e,t,n){var r=e.mutatedEvents.instances;for(var o in r)if(!Yn(t.validRange,r[o].range))return!1;return Na({eventDrag:e},n)}function Pa(e,t,n){return!!Yn(t.validRange,e.range)&&Na({dateSelection:e},n)}function Na(e,t){var n=t.getCurrentData(),o=r({businessHours:n.businessHours,dateSelection:"",eventStore:n.eventStore,eventUiBases:n.eventUiBases,eventSelection:"",eventDrag:null,eventResize:null},e);return(t.pluginHooks.isPropsValid||Ha)(o,t)}function Ha(e,t,n,o){return void 0===n&&(n={}),!(e.eventDrag&&!function(e,t,n,o){var i=t.getCurrentData(),a=e.eventDrag,s=a.mutatedEvents,l=s.defs,u=s.instances,c=Qn(l,a.isEvent?e.eventUiBases:{"":i.selectionConfig});o&&(c=bt(c,o));var d=(v=e.eventStore,g=a.affectedEvents.instances,{defs:v.defs,instances:St(v.instances,(function(e){return!g[e.instanceId]}))}),p=d.defs,f=d.instances,h=Qn(p,e.eventUiBases);var v,g;for(var m in u){var y=u[m],E=y.range,S=c[y.defId],b=l[y.defId];if(!Oa(S.constraints,E,d,e.businessHours,t))return!1;var D=t.options.eventOverlap,C="function"==typeof D?D:null;for(var w in f){var R=f[w];if(qn(E,R.range)){if(!1===h[R.defId].overlap&&a.isEvent)return!1;if(!1===S.overlap)return!1;if(C&&!C(new xr(t,p[R.defId],R),new xr(t,b,y)))return!1}}for(var _=i.eventStore,T=0,k=S.allows;T<k.length;T++){var x=k[T],M=r(r({},n),{range:y.range,allDay:b.allDay}),I=_.defs[b.defId],P=_.instances[m],N=void 0;if(N=I?new xr(t,I,P):new xr(t,b),!x(yr(M,t),N))return!1}}return!0}(e,t,n,o))&&!(e.dateSelection&&!function(e,t,n,o){var i=e.eventStore,a=i.defs,s=i.instances,l=e.dateSelection,u=l.range,c=t.getCurrentData().selectionConfig;o&&(c=o(c));if(!Oa(c.constraints,u,i,e.businessHours,t))return!1;var d=t.options.selectOverlap,p="function"==typeof d?d:null;for(var f in s){var h=s[f];if(qn(u,h.range)){if(!1===c.overlap)return!1;if(p&&!p(new xr(t,a[h.defId],h),null))return!1}}for(var v=0,g=c.allows;v<g.length;v++){if(!(0,g[v])(yr(r(r({},n),l),t),null))return!1}return!0}(e,t,n,o))}function Oa(e,t,n,r,o){for(var i=0,a=e;i<a.length;i++){if(!Ua(Aa(a[i],t,n,r,o),t))return!1}return!0}function Aa(e,t,n,r,o){return"businessHours"===e?La(xt(r,t,o)):"string"==typeof e?La(wn(n,(function(t){return t.groupId===e}))):"object"==typeof e&&e?La(xt(e,t,o)):[]}function La(e){var t=e.instances,n=[];for(var r in t)n.push(t[r].range);return n}function Ua(e,t){for(var n=0,r=e;n<r.length;n++){if(Yn(r[n],t))return!0}return!1}var Wa=/^(visible|hidden)$/,Va=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.handleEl=function(e){t.el=e,Fo(t.props.elRef,e)},t}return n(t,e),t.prototype.render=function(){var e=this.props,t=e.liquid,n=e.liquidIsAbsolute,r=t&&n,o=["fc-scroller"];return t&&(n?o.push("fc-scroller-liquid-absolute"):o.push("fc-scroller-liquid")),_o("div",{ref:this.handleEl,className:o.join(" "),style:{overflowX:e.overflowX,overflowY:e.overflowY,left:r&&-(e.overcomeLeft||0)||"",right:r&&-(e.overcomeRight||0)||"",bottom:r&&-(e.overcomeBottom||0)||"",marginLeft:!r&&-(e.overcomeLeft||0)||"",marginRight:!r&&-(e.overcomeRight||0)||"",marginBottom:!r&&-(e.overcomeBottom||0)||"",maxHeight:e.maxHeight||""}},e.children)},t.prototype.needsXScrolling=function(){if(Wa.test(this.props.overflowX))return!1;for(var e=this.el,t=this.el.getBoundingClientRect().width-this.getYScrollbarWidth(),n=e.children,r=0;r<n.length;r+=1){if(n[r].getBoundingClientRect().width>t)return!0}return!1},t.prototype.needsYScrolling=function(){if(Wa.test(this.props.overflowY))return!1;for(var e=this.el,t=this.el.getBoundingClientRect().height-this.getXScrollbarWidth(),n=e.children,r=0;r<n.length;r+=1){if(n[r].getBoundingClientRect().height>t)return!0}return!1},t.prototype.getXScrollbarWidth=function(){return Wa.test(this.props.overflowX)?0:this.el.offsetHeight-this.el.clientHeight},t.prototype.getYScrollbarWidth=function(){return Wa.test(this.props.overflowY)?0:this.el.offsetWidth-this.el.clientWidth},t}(Uo),Fa=function(){function e(e){var t=this;this.masterCallback=e,this.currentMap={},this.depths={},this.callbackMap={},this.handleValue=function(e,n){var r=t,o=r.depths,i=r.currentMap,a=!1,s=!1;null!==e?(a=n in i,i[n]=e,o[n]=(o[n]||0)+1,s=!0):(o[n]-=1,o[n]||(delete i[n],delete t.callbackMap[n],a=!0)),t.masterCallback&&(a&&t.masterCallback(null,String(n)),s&&t.masterCallback(e,String(n)))}}return e.prototype.createRef=function(e){var t=this,n=this.callbackMap[e];return n||(n=this.callbackMap[e]=function(n){t.handleValue(n,String(e))}),n},e.prototype.collect=function(e,t,n){return kt(this.currentMap,e,t,n)},e.prototype.getAll=function(){return Ct(this.currentMap)},e}();function Ba(e){for(var t=0,n=0,r=De(e,".fc-scrollgrid-shrink");n<r.length;n++){var o=r[n];t=Math.max(t,Je(o))}return Math.ceil(t)}function za(e,t){return e.liquid&&t.liquid}function ja(e,t){return null!=t.maxHeight||za(e,t)}function Ga(e,t,n,r){var o=n.expandRows;return"function"==typeof t.content?t.content(n):_o("table",{role:"presentation",className:[t.tableClassName,e.syncRowHeights?"fc-scrollgrid-sync-table":""].join(" "),style:{minWidth:n.tableMinWidth,width:n.clientWidth,height:o?n.clientHeight:""}},n.tableColGroupNode,_o(r?"thead":"tbody",{role:"presentation"},"function"==typeof t.rowContent?t.rowContent(n):t.rowContent))}function qa(e,t){return Gt(e,t,wt)}function Ya(e,t){for(var n=[],r=0,i=e;r<i.length;r++)for(var a=i[r],s=a.span||1,l=0;l<s;l+=1)n.push(_o("col",{style:{width:"shrink"===a.width?Za(t):a.width||"",minWidth:a.minWidth||""}}));return _o.apply(void 0,o(["colgroup",{}],n))}function Za(e){return null==e?4:e}function Xa(e){for(var t=0,n=e;t<n.length;t++){if("shrink"===n[t].width)return!0}return!1}function Ka(e,t){var n=["fc-scrollgrid",t.theme.getClass("table")];return e&&n.push("fc-scrollgrid-liquid"),n}function $a(e,t){var n=["fc-scrollgrid-section","fc-scrollgrid-section-"+e.type,e.className];return t&&e.liquid&&null==e.maxHeight&&n.push("fc-scrollgrid-section-liquid"),e.isSticky&&n.push("fc-scrollgrid-section-sticky"),n}function Ja(e){return _o("div",{className:"fc-scrollgrid-sticky-shim",style:{width:e.clientWidth,minWidth:e.tableMinWidth}})}function Qa(e){var t=e.stickyHeaderDates;return null!=t&&"auto"!==t||(t="auto"===e.height||"auto"===e.viewHeight),t}function es(e){var t=e.stickyFooterScrollbar;return null!=t&&"auto"!==t||(t="auto"===e.height||"auto"===e.viewHeight),t}var ts=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.processCols=qt((function(e){return e}),qa),t.renderMicroColGroup=qt(Ya),t.scrollerRefs=new Fa,t.scrollerElRefs=new Fa(t._handleScrollerEl.bind(t)),t.state={shrinkWidth:null,forceYScrollbars:!1,scrollerClientWidths:{},scrollerClientHeights:{}},t.handleSizing=function(){t.setState(r({shrinkWidth:t.computeShrinkWidth()},t.computeScrollerDims()))},t}return n(t,e),t.prototype.render=function(){var e=this,t=e.props,n=e.state,r=e.context,i=t.sections||[],a=this.processCols(t.cols),s=this.renderMicroColGroup(a,n.shrinkWidth),l=Ka(t.liquid,r);t.collapsibleWidth&&l.push("fc-scrollgrid-collapsible");for(var u,c=i.length,d=0,p=[],f=[],h=[];d<c&&"header"===(u=i[d]).type;)p.push(this.renderSection(u,s,!0)),d+=1;for(;d<c&&"body"===(u=i[d]).type;)f.push(this.renderSection(u,s,!1)),d+=1;for(;d<c&&"footer"===(u=i[d]).type;)h.push(this.renderSection(u,s,!0)),d+=1;var v=!Qr(),g={role:"rowgroup"};return _o("table",{role:"grid",className:l.join(" "),style:{height:t.height}},Boolean(!v&&p.length)&&_o.apply(void 0,o(["thead",g],p)),Boolean(!v&&f.length)&&_o.apply(void 0,o(["tbody",g],f)),Boolean(!v&&h.length)&&_o.apply(void 0,o(["tfoot",g],h)),v&&_o.apply(void 0,o(o(o(["tbody",g],p),f),h)))},t.prototype.renderSection=function(e,t,n){return"outerContent"in e?_o(xo,{key:e.key},e.outerContent):_o("tr",{key:e.key,role:"presentation",className:$a(e,this.props.liquid).join(" ")},this.renderChunkTd(e,t,e.chunk,n))},t.prototype.renderChunkTd=function(e,t,n,r){if("outerContent"in n)return n.outerContent;var o=this.props,i=this.state,a=i.forceYScrollbars,s=i.scrollerClientWidths,l=i.scrollerClientHeights,u=ja(o,e),c=za(o,e),d=o.liquid?a?"scroll":u?"auto":"hidden":"visible",p=e.key,f=Ga(e,n,{tableColGroupNode:t,tableMinWidth:"",clientWidth:o.collapsibleWidth||void 0===s[p]?null:s[p],clientHeight:void 0!==l[p]?l[p]:null,expandRows:e.expandRows,syncRowHeights:!1,rowSyncHeights:[],reportRowHeightChange:function(){}},r);return _o(r?"th":"td",{ref:n.elRef,role:"presentation"},_o("div",{className:"fc-scroller-harness"+(c?" fc-scroller-harness-liquid":"")},_o(Va,{ref:this.scrollerRefs.createRef(p),elRef:this.scrollerElRefs.createRef(p),overflowY:d,overflowX:o.liquid?"hidden":"visible",maxHeight:e.maxHeight,liquid:c,liquidIsAbsolute:!0},f)))},t.prototype._handleScrollerEl=function(e,t){var n=function(e,t){for(var n=0,r=e;n<r.length;n++){var o=r[n];if(o.key===t)return o}return null}(this.props.sections,t);n&&Fo(n.chunk.scrollerElRef,e)},t.prototype.componentDidMount=function(){this.handleSizing(),this.context.addResizeHandler(this.handleSizing)},t.prototype.componentDidUpdate=function(){this.handleSizing()},t.prototype.componentWillUnmount=function(){this.context.removeResizeHandler(this.handleSizing)},t.prototype.computeShrinkWidth=function(){return Xa(this.props.cols)?Ba(this.scrollerElRefs.getAll()):0},t.prototype.computeScrollerDims=function(){var e=po(),t=this.scrollerRefs,n=this.scrollerElRefs,r=!1,o={},i={};for(var a in t.currentMap){var s=t.currentMap[a];if(s&&s.needsYScrolling()){r=!0;break}}for(var l=0,u=this.props.sections;l<u.length;l++){a=u[l].key;var c=n.currentMap[a];if(c){var d=c.parentNode;o[a]=Math.floor(d.getBoundingClientRect().width-(r?e.y:0)),i[a]=Math.floor(d.getBoundingClientRect().height)}}return{forceYScrollbars:r,scrollerClientWidths:o,scrollerClientHeights:i}},t}(Uo);ts.addStateEquality({scrollerClientWidths:wt,scrollerClientHeights:wt});var ns=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.elRef=ko(),t}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context,n=t.options,r=e.seg,o=r.eventRange,i=o.ui,a={event:new xr(t,o.def,o.instance),view:t.viewApi,timeText:e.timeText,textColor:i.textColor,backgroundColor:i.backgroundColor,borderColor:i.borderColor,isDraggable:!e.disableDragging&&rr(r,t),isStartResizable:!e.disableResizing&&or(r,t),isEndResizable:!e.disableResizing&&ir(r),isMirror:Boolean(e.isDragging||e.isResizing||e.isDateSelecting),isStart:Boolean(r.isStart),isEnd:Boolean(r.isEnd),isPast:Boolean(e.isPast),isFuture:Boolean(e.isFuture),isToday:Boolean(e.isToday),isSelected:Boolean(e.isSelected),isDragging:Boolean(e.isDragging),isResizing:Boolean(e.isResizing)},s=lr(a).concat(i.classNames);return _o(Yo,{hookProps:a,classNames:n.eventClassNames,content:n.eventContent,defaultContent:e.defaultContent,didMount:n.eventDidMount,willUnmount:n.eventWillUnmount,elRef:this.elRef},(function(t,n,r,o){return e.children(t,s.concat(n),r,o,a)}))},t.prototype.componentDidMount=function(){$n(this.elRef.current,this.props.seg)},t.prototype.componentDidUpdate=function(e){var t=this.props.seg;t!==e.seg&&$n(this.elRef.current,t)},t}(Uo),rs=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context,n=e.seg,o=t.options.eventTimeFormat||e.defaultTimeFormat,i=ar(n,o,t,e.defaultDisplayEventTime,e.defaultDisplayEventEnd);return _o(ns,{seg:n,timeText:i,disableDragging:e.disableDragging,disableResizing:e.disableResizing,defaultContent:e.defaultContent||os,isDragging:e.isDragging,isResizing:e.isResizing,isDateSelecting:e.isDateSelecting,isSelected:e.isSelected,isPast:e.isPast,isFuture:e.isFuture,isToday:e.isToday},(function(o,i,a,s,l){return _o("a",r({className:e.extraClassNames.concat(i).join(" "),style:{borderColor:l.borderColor,backgroundColor:l.backgroundColor},ref:o},cr(n,t)),_o("div",{className:"fc-event-main",ref:a,style:{color:l.textColor}},s),l.isStartResizable&&_o("div",{className:"fc-event-resizer fc-event-resizer-start"}),l.isEndResizable&&_o("div",{className:"fc-event-resizer fc-event-resizer-end"}))}))},t}(Uo);function os(e){return _o("div",{className:"fc-event-main-frame"},e.timeText&&_o("div",{className:"fc-event-time"},e.timeText),_o("div",{className:"fc-event-title-container"},_o("div",{className:"fc-event-title fc-sticky"},e.event.title||_o(xo,null," "))))}var is=function(e){return _o(Oo.Consumer,null,(function(t){var n=t.options,r={isAxis:e.isAxis,date:t.dateEnv.toDate(e.date),view:t.viewApi};return _o(Yo,{hookProps:r,classNames:n.nowIndicatorClassNames,content:n.nowIndicatorContent,didMount:n.nowIndicatorDidMount,willUnmount:n.nowIndicatorWillUnmount},e.children)}))},as=ln({day:"numeric"}),ss=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context,n=t.options,r=ls({date:e.date,dateProfile:e.dateProfile,todayRange:e.todayRange,showDayNumber:e.showDayNumber,extraProps:e.extraHookProps,viewApi:t.viewApi,dateEnv:t.dateEnv});return _o(Xo,{hookProps:r,content:n.dayCellContent,defaultContent:e.defaultContent},e.children)},t}(Uo);function ls(e){var t=e.date,n=e.dateEnv,o=ro(t,e.todayRange,null,e.dateProfile);return r(r(r({date:n.toDate(t),view:e.viewApi},o),{dayNumberText:e.showDayNumber?n.format(t,as):""}),e.extraProps)}var us=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.refineHookProps=Yt(ls),t.normalizeClassNames=Jo(),t}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context,n=t.options,r=this.refineHookProps({date:e.date,dateProfile:e.dateProfile,todayRange:e.todayRange,showDayNumber:e.showDayNumber,extraProps:e.extraHookProps,viewApi:t.viewApi,dateEnv:t.dateEnv}),o=oo(r,t.theme).concat(r.isDisabled?[]:this.normalizeClassNames(n.dayCellClassNames,r)),i=r.isDisabled?{}:{"data-date":Bt(e.date)};return _o($o,{hookProps:r,didMount:n.dayCellDidMount,willUnmount:n.dayCellWillUnmount,elRef:e.elRef},(function(t){return e.children(t,o,i,r.isDisabled)}))},t}(Uo);function cs(e){return _o("div",{className:"fc-"+e})}var ds=function(e){return _o(ns,{defaultContent:ps,seg:e.seg,timeText:"",disableDragging:!0,disableResizing:!0,isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:!1,isPast:e.isPast,isFuture:e.isFuture,isToday:e.isToday},(function(e,t,n,r,o){return _o("div",{ref:e,className:["fc-bg-event"].concat(t).join(" "),style:{backgroundColor:o.backgroundColor}},r)}))};function ps(e){return e.event.title&&_o("div",{className:"fc-event-title"},e.event.title)}var fs=function(e){return _o(Oo.Consumer,null,(function(t){var n=t.dateEnv,r=t.options,o=e.date,i=r.weekNumberFormat||e.defaultFormat,a=n.computeWeekNumber(o),s=n.format(o,i);return _o(Yo,{hookProps:{num:a,text:s,date:o},classNames:r.weekNumberClassNames,content:r.weekNumberContent,defaultContent:hs,didMount:r.weekNumberDidMount,willUnmount:r.weekNumberWillUnmount},e.children)}))};function hs(e){return e.text}var vs=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.state={titleId:xe()},t.handleRootEl=function(e){t.rootEl=e,t.props.elRef&&Fo(t.props.elRef,e)},t.handleDocumentMouseDown=function(e){var n=_e(e);t.rootEl.contains(n)||t.handleCloseClick()},t.handleDocumentKeyDown=function(e){"Escape"===e.key&&t.handleCloseClick()},t.handleCloseClick=function(){var e=t.props.onClose;e&&e()},t}return n(t,e),t.prototype.render=function(){var e=this.context,t=e.theme,n=e.options,o=this.props,i=this.state,a=["fc-popover",t.getClass("popover")].concat(o.extraClassNames||[]);return Io(_o("div",r({id:o.id,className:a.join(" "),"aria-labelledby":i.titleId},o.extraAttrs,{ref:this.handleRootEl}),_o("div",{className:"fc-popover-header "+t.getClass("popoverHeader")},_o("span",{className:"fc-popover-title",id:i.titleId},o.title),_o("span",{className:"fc-popover-close "+t.getIconClass("close"),title:n.closeHint,onClick:this.handleCloseClick})),_o("div",{className:"fc-popover-body "+t.getClass("popoverContent")},o.children)),o.parentEl)},t.prototype.componentDidMount=function(){document.addEventListener("mousedown",this.handleDocumentMouseDown),document.addEventListener("keydown",this.handleDocumentKeyDown),this.updateSize()},t.prototype.componentWillUnmount=function(){document.removeEventListener("mousedown",this.handleDocumentMouseDown),document.removeEventListener("keydown",this.handleDocumentKeyDown)},t.prototype.updateSize=function(){var e=this.context.isRtl,t=this.props,n=t.alignmentEl,r=t.alignGridTop,o=this.rootEl,i=function(e){for(var t=mo(e),n=e.getBoundingClientRect(),r=0,o=t;r<o.length;r++){var i=Xr(n,o[r].getBoundingClientRect());if(!i)return null;n=i}return n}(n);if(i){var a=o.getBoundingClientRect(),s=r?Se(n,".fc-scrollgrid").getBoundingClientRect().top:i.top,l=e?i.right-a.width:i.left;s=Math.max(s,10),l=Math.min(l,document.documentElement.clientWidth-10-a.width),l=Math.max(l,10);var u=o.offsetParent.getBoundingClientRect();we(o,{top:s-u.top,left:l-u.left})}},t}(Uo),gs=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.handleRootEl=function(e){t.rootEl=e,e?t.context.registerInteractiveComponent(t,{el:e,useEventCenter:!1}):t.context.unregisterInteractiveComponent(t)},t}return n(t,e),t.prototype.render=function(){var e=this.context,t=e.options,n=e.dateEnv,r=this.props,o=r.startDate,i=r.todayRange,a=r.dateProfile,s=n.format(o,t.dayPopoverFormat);return _o(us,{date:o,dateProfile:a,todayRange:i,elRef:this.handleRootEl},(function(e,t,n){return _o(vs,{elRef:e,id:r.id,title:s,extraClassNames:["fc-more-popover"].concat(t),extraAttrs:n,parentEl:r.parentEl,alignmentEl:r.alignmentEl,alignGridTop:r.alignGridTop,onClose:r.onClose},_o(ss,{date:o,dateProfile:a,todayRange:i},(function(e,t){return t&&_o("div",{className:"fc-more-popover-misc",ref:e},t)})),r.children)}))},t.prototype.queryHit=function(e,t,n,o){var i=this.rootEl,a=this.props;return e>=0&&e<n&&t>=0&&t<o?{dateProfile:a.dateProfile,dateSpan:r({allDay:!0,range:{start:a.startDate,end:a.endDate}},a.extraDateSpan),dayEl:i,rect:{left:0,top:0,right:n,bottom:o},layer:1}:null},t}(Bo),ms=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.linkElRef=ko(),t.state={isPopoverOpen:!1,popoverId:xe()},t.handleClick=function(e){var n=t,r=n.props,o=n.context,i=o.options.moreLinkClick,a=Es(r).start;function s(e){var t=e.eventRange,n=t.def,r=t.instance,i=t.range;return{event:new xr(o,n,r),start:o.dateEnv.toDate(i.start),end:o.dateEnv.toDate(i.end),isStart:e.isStart,isEnd:e.isEnd}}"function"==typeof i&&(i=i({date:a,allDay:Boolean(r.allDayDate),allSegs:r.allSegs.map(s),hiddenSegs:r.hiddenSegs.map(s),jsEvent:e,view:o.viewApi})),i&&"popover"!==i?"string"==typeof i&&o.calendarApi.zoomTo(a,i):t.setState({isPopoverOpen:!0})},t.handlePopoverClose=function(){t.setState({isPopoverOpen:!1})},t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.state;return _o(Oo.Consumer,null,(function(r){var o=r.viewApi,i=r.options,a=r.calendarApi,s=i.moreLinkText,l=t.moreCnt,u=Es(t),c="function"==typeof s?s.call(a,l):"+"+l+" "+s,d=Xe(i.moreLinkHint,[l],c),p={num:l,shortText:"+"+l,text:c,view:o};return _o(xo,null,Boolean(t.moreCnt)&&_o(Yo,{elRef:e.linkElRef,hookProps:p,classNames:i.moreLinkClassNames,content:i.moreLinkContent,defaultContent:t.defaultContent||ys,didMount:i.moreLinkDidMount,willUnmount:i.moreLinkWillUnmount},(function(r,o,i,a){return t.children(r,["fc-more-link"].concat(o),i,a,e.handleClick,d,n.isPopoverOpen,n.isPopoverOpen?n.popoverId:"")})),n.isPopoverOpen&&_o(gs,{id:n.popoverId,startDate:u.start,endDate:u.end,dateProfile:t.dateProfile,todayRange:t.todayRange,extraDateSpan:t.extraDateSpan,parentEl:e.parentEl,alignmentEl:t.alignmentElRef.current,alignGridTop:t.alignGridTop,onClose:e.handlePopoverClose},t.popoverContent()))}))},t.prototype.componentDidMount=function(){this.updateParentEl()},t.prototype.componentDidUpdate=function(){this.updateParentEl()},t.prototype.updateParentEl=function(){this.linkElRef.current&&(this.parentEl=Se(this.linkElRef.current,".fc-view-harness"))},t}(Uo);function ys(e){return e.text}function Es(e){if(e.allDayDate)return{start:e.allDayDate,end:tt(e.allDayDate,1)};var t,n=e.hiddenSegs;return{start:Ss(n),end:(t=n,t.reduce(Ds).eventRange.range.end)}}function Ss(e){return e.reduce(bs).eventRange.range.start}function bs(e,t){return e.eventRange.range.start<t.eventRange.range.start?e:t}function Ds(e,t){return e.eventRange.range.end>t.eventRange.range.end?e:t}var Cs=function(e){function t(t,n){void 0===n&&(n={});var o=e.call(this)||this;return o.isRendering=!1,o.isRendered=!1,o.currentClassNames=[],o.customContentRenderId=0,o.handleAction=function(e){switch(e.type){case"SET_EVENT_DRAG":case"SET_EVENT_RESIZE":o.renderRunner.tryDrain()}},o.handleData=function(e){o.currentData=e,o.renderRunner.request(e.calendarOptions.rerenderDelay)},o.handleRenderRequest=function(){if(o.isRendering){o.isRendered=!0;var e=o.currentData;To(_o(ga,{options:e.calendarOptions,theme:e.theme,emitter:e.emitter},(function(t,n,i,a){return o.setClassNames(t),o.setHeight(n),_o(Zo.Provider,{value:o.customContentRenderId},_o(fa,r({isHeightAuto:i,forPrint:a},e)))})),o.el)}else o.isRendered&&(o.isRendered=!1,No(o.el),o.setClassNames([]),o.setHeight(""));Po()},o.el=t,o.renderRunner=new Mi(o.handleRenderRequest),new Ni({optionOverrides:n,calendarApi:o,onAction:o.handleAction,onData:o.handleData}),o}return n(t,e),Object.defineProperty(t.prototype,"view",{get:function(){return this.currentData.viewApi},enumerable:!1,configurable:!0}),t.prototype.render=function(){var e=this.isRendering;e?this.customContentRenderId+=1:this.isRendering=!0,this.renderRunner.request(),e&&this.updateSize()},t.prototype.destroy=function(){this.isRendering&&(this.isRendering=!1,this.renderRunner.request())},t.prototype.updateSize=function(){e.prototype.updateSize.call(this),Po()},t.prototype.batchRendering=function(e){this.renderRunner.pause("batchRendering"),e(),this.renderRunner.resume("batchRendering")},t.prototype.pauseRendering=function(){this.renderRunner.pause("pauseRendering")},t.prototype.resumeRendering=function(){this.renderRunner.resume("pauseRendering",!0)},t.prototype.resetOptions=function(e,t){this.currentDataManager.resetOptions(e,t)},t.prototype.setClassNames=function(e){if(!Gt(e,this.currentClassNames)){for(var t=this.el.classList,n=0,r=this.currentClassNames;n<r.length;n++){var o=r[n];t.remove(o)}for(var i=0,a=e;i<a.length;i++){o=a[i];t.add(o)}this.currentClassNames=e}},t.prototype.setHeight=function(e){Re(this.el,"height",e)},t}(kr);ia.touchMouseIgnoreWait=500;var ws=0,Rs=0,_s=!1,Ts=function(){function e(e){var t=this;this.subjectEl=null,this.selector="",this.handleSelector="",this.shouldIgnoreMove=!1,this.shouldWatchScroll=!0,this.isDragging=!1,this.isTouchDragging=!1,this.wasTouchScroll=!1,this.handleMouseDown=function(e){if(!t.shouldIgnoreMouse()&&function(e){return 0===e.button&&!e.ctrlKey}(e)&&t.tryStart(e)){var n=t.createEventFromMouse(e,!0);t.emitter.trigger("pointerdown",n),t.initScrollWatch(n),t.shouldIgnoreMove||document.addEventListener("mousemove",t.handleMouseMove),document.addEventListener("mouseup",t.handleMouseUp)}},this.handleMouseMove=function(e){var n=t.createEventFromMouse(e);t.recordCoords(n),t.emitter.trigger("pointermove",n)},this.handleMouseUp=function(e){document.removeEventListener("mousemove",t.handleMouseMove),document.removeEventListener("mouseup",t.handleMouseUp),t.emitter.trigger("pointerup",t.createEventFromMouse(e)),t.cleanup()},this.handleTouchStart=function(e){if(t.tryStart(e)){t.isTouchDragging=!0;var n=t.createEventFromTouch(e,!0);t.emitter.trigger("pointerdown",n),t.initScrollWatch(n);var r=e.target;t.shouldIgnoreMove||r.addEventListener("touchmove",t.handleTouchMove),r.addEventListener("touchend",t.handleTouchEnd),r.addEventListener("touchcancel",t.handleTouchEnd),window.addEventListener("scroll",t.handleTouchScroll,!0)}},this.handleTouchMove=function(e){var n=t.createEventFromTouch(e);t.recordCoords(n),t.emitter.trigger("pointermove",n)},this.handleTouchEnd=function(e){if(t.isDragging){var n=e.target;n.removeEventListener("touchmove",t.handleTouchMove),n.removeEventListener("touchend",t.handleTouchEnd),n.removeEventListener("touchcancel",t.handleTouchEnd),window.removeEventListener("scroll",t.handleTouchScroll,!0),t.emitter.trigger("pointerup",t.createEventFromTouch(e)),t.cleanup(),t.isTouchDragging=!1,ws+=1,setTimeout((function(){ws-=1}),ia.touchMouseIgnoreWait)}},this.handleTouchScroll=function(){t.wasTouchScroll=!0},this.handleScroll=function(e){if(!t.shouldIgnoreMove){var n=window.pageXOffset-t.prevScrollX+t.prevPageX,r=window.pageYOffset-t.prevScrollY+t.prevPageY;t.emitter.trigger("pointermove",{origEvent:e,isTouch:t.isTouchDragging,subjectEl:t.subjectEl,pageX:n,pageY:r,deltaX:n-t.origPageX,deltaY:r-t.origPageY})}},this.containerEl=e,this.emitter=new Eo,e.addEventListener("mousedown",this.handleMouseDown),e.addEventListener("touchstart",this.handleTouchStart,{passive:!0}),1===(Rs+=1)&&window.addEventListener("touchmove",ks,{passive:!1})}return e.prototype.destroy=function(){this.containerEl.removeEventListener("mousedown",this.handleMouseDown),this.containerEl.removeEventListener("touchstart",this.handleTouchStart,{passive:!0}),(Rs-=1)||window.removeEventListener("touchmove",ks,{passive:!1})},e.prototype.tryStart=function(e){var t=this.querySubjectEl(e),n=e.target;return!(!t||this.handleSelector&&!Se(n,this.handleSelector))&&(this.subjectEl=t,this.isDragging=!0,this.wasTouchScroll=!1,!0)},e.prototype.cleanup=function(){_s=!1,this.isDragging=!1,this.subjectEl=null,this.destroyScrollWatch()},e.prototype.querySubjectEl=function(e){return this.selector?Se(e.target,this.selector):this.containerEl},e.prototype.shouldIgnoreMouse=function(){return ws||this.isTouchDragging},e.prototype.cancelTouchScroll=function(){this.isDragging&&(_s=!0)},e.prototype.initScrollWatch=function(e){this.shouldWatchScroll&&(this.recordCoords(e),window.addEventListener("scroll",this.handleScroll,!0))},e.prototype.recordCoords=function(e){this.shouldWatchScroll&&(this.prevPageX=e.pageX,this.prevPageY=e.pageY,this.prevScrollX=window.pageXOffset,this.prevScrollY=window.pageYOffset)},e.prototype.destroyScrollWatch=function(){this.shouldWatchScroll&&window.removeEventListener("scroll",this.handleScroll,!0)},e.prototype.createEventFromMouse=function(e,t){var n=0,r=0;return t?(this.origPageX=e.pageX,this.origPageY=e.pageY):(n=e.pageX-this.origPageX,r=e.pageY-this.origPageY),{origEvent:e,isTouch:!1,subjectEl:this.subjectEl,pageX:e.pageX,pageY:e.pageY,deltaX:n,deltaY:r}},e.prototype.createEventFromTouch=function(e,t){var n,r,o=e.touches,i=0,a=0;return o&&o.length?(n=o[0].pageX,r=o[0].pageY):(n=e.pageX,r=e.pageY),t?(this.origPageX=n,this.origPageY=r):(i=n-this.origPageX,a=r-this.origPageY),{origEvent:e,isTouch:!0,subjectEl:this.subjectEl,pageX:n,pageY:r,deltaX:i,deltaY:a}},e}();function ks(e){_s&&e.preventDefault()}var xs=function(){function e(){this.isVisible=!1,this.sourceEl=null,this.mirrorEl=null,this.sourceElRect=null,this.parentNode=document.body,this.zIndex=9999,this.revertDuration=0}return e.prototype.start=function(e,t,n){this.sourceEl=e,this.sourceElRect=this.sourceEl.getBoundingClientRect(),this.origScreenX=t-window.pageXOffset,this.origScreenY=n-window.pageYOffset,this.deltaX=0,this.deltaY=0,this.updateElPosition()},e.prototype.handleMove=function(e,t){this.deltaX=e-window.pageXOffset-this.origScreenX,this.deltaY=t-window.pageYOffset-this.origScreenY,this.updateElPosition()},e.prototype.setIsVisible=function(e){e?this.isVisible||(this.mirrorEl&&(this.mirrorEl.style.display=""),this.isVisible=e,this.updateElPosition()):this.isVisible&&(this.mirrorEl&&(this.mirrorEl.style.display="none"),this.isVisible=e)},e.prototype.stop=function(e,t){var n=this,r=function(){n.cleanup(),t()};e&&this.mirrorEl&&this.isVisible&&this.revertDuration&&(this.deltaX||this.deltaY)?this.doRevertAnimation(r,this.revertDuration):setTimeout(r,0)},e.prototype.doRevertAnimation=function(e,t){var n=this.mirrorEl,r=this.sourceEl.getBoundingClientRect();n.style.transition="top "+t+"ms,left "+t+"ms",we(n,{left:r.left,top:r.top}),Ne(n,(function(){n.style.transition="",e()}))},e.prototype.cleanup=function(){this.mirrorEl&&(Ee(this.mirrorEl),this.mirrorEl=null),this.sourceEl=null},e.prototype.updateElPosition=function(){this.sourceEl&&this.isVisible&&we(this.getMirrorEl(),{left:this.sourceElRect.left+this.deltaX,top:this.sourceElRect.top+this.deltaY})},e.prototype.getMirrorEl=function(){var e=this.sourceElRect,t=this.mirrorEl;return t||((t=this.mirrorEl=this.sourceEl.cloneNode(!0)).classList.add("fc-unselectable"),t.classList.add("fc-event-dragging"),we(t,{position:"fixed",zIndex:this.zIndex,visibility:"",boxSizing:"border-box",width:e.right-e.left,height:e.bottom-e.top,right:"auto",bottom:"auto",margin:0}),this.parentNode.appendChild(t)),t},e}(),Ms=function(e){function t(t,n){var r=e.call(this)||this;return r.handleScroll=function(){r.scrollTop=r.scrollController.getScrollTop(),r.scrollLeft=r.scrollController.getScrollLeft(),r.handleScrollChange()},r.scrollController=t,r.doesListening=n,r.scrollTop=r.origScrollTop=t.getScrollTop(),r.scrollLeft=r.origScrollLeft=t.getScrollLeft(),r.scrollWidth=t.getScrollWidth(),r.scrollHeight=t.getScrollHeight(),r.clientWidth=t.getClientWidth(),r.clientHeight=t.getClientHeight(),r.clientRect=r.computeClientRect(),r.doesListening&&r.getEventTarget().addEventListener("scroll",r.handleScroll),r}return n(t,e),t.prototype.destroy=function(){this.doesListening&&this.getEventTarget().removeEventListener("scroll",this.handleScroll)},t.prototype.getScrollTop=function(){return this.scrollTop},t.prototype.getScrollLeft=function(){return this.scrollLeft},t.prototype.setScrollTop=function(e){this.scrollController.setScrollTop(e),this.doesListening||(this.scrollTop=Math.max(Math.min(e,this.getMaxScrollTop()),0),this.handleScrollChange())},t.prototype.setScrollLeft=function(e){this.scrollController.setScrollLeft(e),this.doesListening||(this.scrollLeft=Math.max(Math.min(e,this.getMaxScrollLeft()),0),this.handleScrollChange())},t.prototype.getClientWidth=function(){return this.clientWidth},t.prototype.getClientHeight=function(){return this.clientHeight},t.prototype.getScrollWidth=function(){return this.scrollWidth},t.prototype.getScrollHeight=function(){return this.scrollHeight},t.prototype.handleScrollChange=function(){},t}(bo),Is=function(e){function t(t,n){return e.call(this,new Do(t),n)||this}return n(t,e),t.prototype.getEventTarget=function(){return this.scrollController.el},t.prototype.computeClientRect=function(){return vo(this.scrollController.el)},t}(Ms),Ps=function(e){function t(t){return e.call(this,new Co,t)||this}return n(t,e),t.prototype.getEventTarget=function(){return window},t.prototype.computeClientRect=function(){return{left:this.scrollLeft,right:this.scrollLeft+this.clientWidth,top:this.scrollTop,bottom:this.scrollTop+this.clientHeight}},t.prototype.handleScrollChange=function(){this.clientRect=this.computeClientRect()},t}(Ms),Ns="function"==typeof performance?performance.now:Date.now,Hs=function(){function e(){var e=this;this.isEnabled=!0,this.scrollQuery=[window,".fc-scroller"],this.edgeThreshold=50,this.maxVelocity=300,this.pointerScreenX=null,this.pointerScreenY=null,this.isAnimating=!1,this.scrollCaches=null,this.everMovedUp=!1,this.everMovedDown=!1,this.everMovedLeft=!1,this.everMovedRight=!1,this.animate=function(){if(e.isAnimating){var t=e.computeBestEdge(e.pointerScreenX+window.pageXOffset,e.pointerScreenY+window.pageYOffset);if(t){var n=Ns();e.handleSide(t,(n-e.msSinceRequest)/1e3),e.requestAnimation(n)}else e.isAnimating=!1}}}return e.prototype.start=function(e,t,n){this.isEnabled&&(this.scrollCaches=this.buildCaches(n),this.pointerScreenX=null,this.pointerScreenY=null,this.everMovedUp=!1,this.everMovedDown=!1,this.everMovedLeft=!1,this.everMovedRight=!1,this.handleMove(e,t))},e.prototype.handleMove=function(e,t){if(this.isEnabled){var n=e-window.pageXOffset,r=t-window.pageYOffset,o=null===this.pointerScreenY?0:r-this.pointerScreenY,i=null===this.pointerScreenX?0:n-this.pointerScreenX;o<0?this.everMovedUp=!0:o>0&&(this.everMovedDown=!0),i<0?this.everMovedLeft=!0:i>0&&(this.everMovedRight=!0),this.pointerScreenX=n,this.pointerScreenY=r,this.isAnimating||(this.isAnimating=!0,this.requestAnimation(Ns()))}},e.prototype.stop=function(){if(this.isEnabled){this.isAnimating=!1;for(var e=0,t=this.scrollCaches;e<t.length;e++){t[e].destroy()}this.scrollCaches=null}},e.prototype.requestAnimation=function(e){this.msSinceRequest=e,requestAnimationFrame(this.animate)},e.prototype.handleSide=function(e,t){var n=e.scrollCache,r=this.edgeThreshold,o=r-e.distance,i=o*o/(r*r)*this.maxVelocity*t,a=1;switch(e.name){case"left":a=-1;case"right":n.setScrollLeft(n.getScrollLeft()+i*a);break;case"top":a=-1;case"bottom":n.setScrollTop(n.getScrollTop()+i*a)}},e.prototype.computeBestEdge=function(e,t){for(var n=this.edgeThreshold,r=null,o=0,i=this.scrollCaches;o<i.length;o++){var a=i[o],s=a.clientRect,l=e-s.left,u=s.right-e,c=t-s.top,d=s.bottom-t;l>=0&&u>=0&&c>=0&&d>=0&&(c<=n&&this.everMovedUp&&a.canScrollUp()&&(!r||r.distance>c)&&(r={scrollCache:a,name:"top",distance:c}),d<=n&&this.everMovedDown&&a.canScrollDown()&&(!r||r.distance>d)&&(r={scrollCache:a,name:"bottom",distance:d}),l<=n&&this.everMovedLeft&&a.canScrollLeft()&&(!r||r.distance>l)&&(r={scrollCache:a,name:"left",distance:l}),u<=n&&this.everMovedRight&&a.canScrollRight()&&(!r||r.distance>u)&&(r={scrollCache:a,name:"right",distance:u}))}return r},e.prototype.buildCaches=function(e){return this.queryScrollEls(e).map((function(e){return e===window?new Ps(!1):new Is(e,!1)}))},e.prototype.queryScrollEls=function(e){for(var t=[],n=0,r=this.scrollQuery;n<r.length;n++){var o=r[n];"object"==typeof o?t.push(o):t.push.apply(t,Array.prototype.slice.call(Te(e).querySelectorAll(o)))}return t},e}(),Os=function(e){function t(t,n){var r=e.call(this,t)||this;r.containerEl=t,r.delay=null,r.minDistance=0,r.touchScrollAllowed=!0,r.mirrorNeedsRevert=!1,r.isInteracting=!1,r.isDragging=!1,r.isDelayEnded=!1,r.isDistanceSurpassed=!1,r.delayTimeoutId=null,r.onPointerDown=function(e){r.isDragging||(r.isInteracting=!0,r.isDelayEnded=!1,r.isDistanceSurpassed=!1,Ve(document.body),Be(document.body),e.isTouch||e.origEvent.preventDefault(),r.emitter.trigger("pointerdown",e),r.isInteracting&&!r.pointer.shouldIgnoreMove&&(r.mirror.setIsVisible(!1),r.mirror.start(e.subjectEl,e.pageX,e.pageY),r.startDelay(e),r.minDistance||r.handleDistanceSurpassed(e)))},r.onPointerMove=function(e){if(r.isInteracting){if(r.emitter.trigger("pointermove",e),!r.isDistanceSurpassed){var t=r.minDistance,n=e.deltaX,o=e.deltaY;n*n+o*o>=t*t&&r.handleDistanceSurpassed(e)}r.isDragging&&("scroll"!==e.origEvent.type&&(r.mirror.handleMove(e.pageX,e.pageY),r.autoScroller.handleMove(e.pageX,e.pageY)),r.emitter.trigger("dragmove",e))}},r.onPointerUp=function(e){r.isInteracting&&(r.isInteracting=!1,Fe(document.body),ze(document.body),r.emitter.trigger("pointerup",e),r.isDragging&&(r.autoScroller.stop(),r.tryStopDrag(e)),r.delayTimeoutId&&(clearTimeout(r.delayTimeoutId),r.delayTimeoutId=null))};var o=r.pointer=new Ts(t);return o.emitter.on("pointerdown",r.onPointerDown),o.emitter.on("pointermove",r.onPointerMove),o.emitter.on("pointerup",r.onPointerUp),n&&(o.selector=n),r.mirror=new xs,r.autoScroller=new Hs,r}return n(t,e),t.prototype.destroy=function(){this.pointer.destroy(),this.onPointerUp({})},t.prototype.startDelay=function(e){var t=this;"number"==typeof this.delay?this.delayTimeoutId=setTimeout((function(){t.delayTimeoutId=null,t.handleDelayEnd(e)}),this.delay):this.handleDelayEnd(e)},t.prototype.handleDelayEnd=function(e){this.isDelayEnded=!0,this.tryStartDrag(e)},t.prototype.handleDistanceSurpassed=function(e){this.isDistanceSurpassed=!0,this.tryStartDrag(e)},t.prototype.tryStartDrag=function(e){this.isDelayEnded&&this.isDistanceSurpassed&&(this.pointer.wasTouchScroll&&!this.touchScrollAllowed||(this.isDragging=!0,this.mirrorNeedsRevert=!1,this.autoScroller.start(e.pageX,e.pageY,this.containerEl),this.emitter.trigger("dragstart",e),!1===this.touchScrollAllowed&&this.pointer.cancelTouchScroll()))},t.prototype.tryStopDrag=function(e){this.mirror.stop(this.mirrorNeedsRevert,this.stopDrag.bind(this,e))},t.prototype.stopDrag=function(e){this.isDragging=!1,this.emitter.trigger("dragend",e)},t.prototype.setIgnoreMove=function(e){this.pointer.shouldIgnoreMove=e},t.prototype.setMirrorIsVisible=function(e){this.mirror.setIsVisible(e)},t.prototype.setMirrorNeedsRevert=function(e){this.mirrorNeedsRevert=e},t.prototype.setAutoScrollEnabled=function(e){this.autoScroller.isEnabled=e},t}(oa),As=function(){function e(e){this.origRect=go(e),this.scrollCaches=mo(e).map((function(e){return new Is(e,!0)}))}return e.prototype.destroy=function(){for(var e=0,t=this.scrollCaches;e<t.length;e++){t[e].destroy()}},e.prototype.computeLeft=function(){for(var e=this.origRect.left,t=0,n=this.scrollCaches;t<n.length;t++){var r=n[t];e+=r.origScrollLeft-r.getScrollLeft()}return e},e.prototype.computeTop=function(){for(var e=this.origRect.top,t=0,n=this.scrollCaches;t<n.length;t++){var r=n[t];e+=r.origScrollTop-r.getScrollTop()}return e},e.prototype.isWithinClipping=function(e,t){for(var n,r,o={left:e,top:t},i=0,a=this.scrollCaches;i<a.length;i++){var s=a[i];if(n=s.getEventTarget(),r=void 0,"HTML"!==(r=n.tagName)&&"BODY"!==r&&!Zr(o,s.clientRect))return!1}return!0},e}();var Ls=function(){function e(e,t){var n=this;this.useSubjectCenter=!1,this.requireInitial=!0,this.initialHit=null,this.movingHit=null,this.finalHit=null,this.handlePointerDown=function(e){var t=n.dragging;n.initialHit=null,n.movingHit=null,n.finalHit=null,n.prepareHits(),n.processFirstCoord(e),n.initialHit||!n.requireInitial?(t.setIgnoreMove(!1),n.emitter.trigger("pointerdown",e)):t.setIgnoreMove(!0)},this.handleDragStart=function(e){n.emitter.trigger("dragstart",e),n.handleMove(e,!0)},this.handleDragMove=function(e){n.emitter.trigger("dragmove",e),n.handleMove(e)},this.handlePointerUp=function(e){n.releaseHits(),n.emitter.trigger("pointerup",e)},this.handleDragEnd=function(e){n.movingHit&&n.emitter.trigger("hitupdate",null,!0,e),n.finalHit=n.movingHit,n.movingHit=null,n.emitter.trigger("dragend",e)},this.droppableStore=t,e.emitter.on("pointerdown",this.handlePointerDown),e.emitter.on("dragstart",this.handleDragStart),e.emitter.on("dragmove",this.handleDragMove),e.emitter.on("pointerup",this.handlePointerUp),e.emitter.on("dragend",this.handleDragEnd),this.dragging=e,this.emitter=new Eo}return e.prototype.processFirstCoord=function(e){var t,n={left:e.pageX,top:e.pageY},r=n,o=e.subjectEl;o instanceof HTMLElement&&(r=Kr(r,t=go(o)));var i=this.initialHit=this.queryHitForOffset(r.left,r.top);if(i){if(this.useSubjectCenter&&t){var a=Xr(t,i.rect);a&&(r=$r(a))}this.coordAdjust=Jr(r,n)}else this.coordAdjust={left:0,top:0}},e.prototype.handleMove=function(e,t){var n=this.queryHitForOffset(e.pageX+this.coordAdjust.left,e.pageY+this.coordAdjust.top);!t&&Us(this.movingHit,n)||(this.movingHit=n,this.emitter.trigger("hitupdate",n,!1,e))},e.prototype.prepareHits=function(){this.offsetTrackers=bt(this.droppableStore,(function(e){return e.component.prepareHits(),new As(e.el)}))},e.prototype.releaseHits=function(){var e=this.offsetTrackers;for(var t in e)e[t].destroy();this.offsetTrackers={}},e.prototype.queryHitForOffset=function(e,t){var n=this.droppableStore,r=this.offsetTrackers,o=null;for(var i in n){var a=n[i].component,s=r[i];if(s&&s.isWithinClipping(e,t)){var l=s.computeLeft(),u=s.computeTop(),c=e-l,d=t-u,p=s.origRect,f=p.right-p.left,h=p.bottom-p.top;if(c>=0&&c<f&&d>=0&&d<h){var v=a.queryHit(c,d,f,h);v&&Yn(v.dateProfile.activeRange,v.dateSpan.range)&&(!o||v.layer>o.layer)&&(v.componentId=i,v.context=a.context,v.rect.left+=l,v.rect.right+=l,v.rect.top+=u,v.rect.bottom+=u,o=v)}}}return o},e}();function Us(e,t){return!e&&!t||Boolean(e)===Boolean(t)&&fr(e.dateSpan,t.dateSpan)}function Ws(e,t){for(var n,o,i={},a=0,s=t.pluginHooks.datePointTransforms;a<s.length;a++){var l=s[a];r(i,l(e,t))}return r(i,(n=e,{date:(o=t.dateEnv).toDate(n.range.start),dateStr:o.formatIso(n.range.start,{omitTime:n.allDay}),allDay:n.allDay})),i}var Vs=function(e){function t(t){var n=e.call(this,t)||this;n.handlePointerDown=function(e){var t=n.dragging,r=e.origEvent.target;t.setIgnoreMove(!n.component.isValidDateDownEl(r))},n.handleDragEnd=function(e){var t=n.component;if(!n.dragging.pointer.wasTouchScroll){var o=n.hitDragging,i=o.initialHit,a=o.finalHit;if(i&&a&&Us(i,a)){var s=t.context,l=r(r({},Ws(i.dateSpan,s)),{dayEl:i.dayEl,jsEvent:e.origEvent,view:s.viewApi||s.calendarApi.view});s.emitter.trigger("dateClick",l)}}},n.dragging=new Os(t.el),n.dragging.autoScroller.isEnabled=!1;var o=n.hitDragging=new Ls(n.dragging,na(t));return o.emitter.on("pointerdown",n.handlePointerDown),o.emitter.on("dragend",n.handleDragEnd),n}return n(t,e),t.prototype.destroy=function(){this.dragging.destroy()},t}(ea),Fs=function(e){function t(t){var n=e.call(this,t)||this;n.dragSelection=null,n.handlePointerDown=function(e){var t=n,r=t.component,o=t.dragging,i=r.context.options.selectable&&r.isValidDateDownEl(e.origEvent.target);o.setIgnoreMove(!i),o.delay=e.isTouch?function(e){var t=e.context.options,n=t.selectLongPressDelay;null==n&&(n=t.longPressDelay);return n}(r):null},n.handleDragStart=function(e){n.component.context.calendarApi.unselect(e)},n.handleHitUpdate=function(e,t){var o=n.component.context,i=null,a=!1;if(e){var s=n.hitDragging.initialHit;e.componentId===s.componentId&&n.isHitComboAllowed&&!n.isHitComboAllowed(s,e)||(i=function(e,t,n){var o=e.dateSpan,i=t.dateSpan,a=[o.range.start,o.range.end,i.range.start,i.range.end];a.sort(Ke);for(var s={},l=0,u=n;l<u.length;l++){var c=(0,u[l])(e,t);if(!1===c)return null;c&&r(s,c)}return s.range={start:a[0],end:a[3]},s.allDay=o.allDay,s}(s,e,o.pluginHooks.dateSelectionTransformers)),i&&Pa(i,e.dateProfile,o)||(a=!0,i=null)}i?o.dispatch({type:"SELECT_DATES",selection:i}):t||o.dispatch({type:"UNSELECT_DATES"}),a?Ue():We(),t||(n.dragSelection=i)},n.handlePointerUp=function(e){n.dragSelection&&(mr(n.dragSelection,e,n.component.context),n.dragSelection=null)};var o=t.component.context.options,i=n.dragging=new Os(t.el);i.touchScrollAllowed=!1,i.minDistance=o.selectMinDistance||0,i.autoScroller.isEnabled=o.dragScroll;var a=n.hitDragging=new Ls(n.dragging,na(t));return a.emitter.on("pointerdown",n.handlePointerDown),a.emitter.on("dragstart",n.handleDragStart),a.emitter.on("hitupdate",n.handleHitUpdate),a.emitter.on("pointerup",n.handlePointerUp),n}return n(t,e),t.prototype.destroy=function(){this.dragging.destroy()},t}(ea);var Bs=function(e){function t(n){var o=e.call(this,n)||this;o.subjectEl=null,o.subjectSeg=null,o.isDragging=!1,o.eventRange=null,o.relevantEvents=null,o.receivingContext=null,o.validMutation=null,o.mutatedRelevantEvents=null,o.handlePointerDown=function(e){var t=e.origEvent.target,n=o,r=n.component,i=n.dragging,a=i.mirror,s=r.context.options,l=r.context;o.subjectEl=e.subjectEl;var u=o.subjectSeg=Jn(e.subjectEl),c=(o.eventRange=u.eventRange).instance.instanceId;o.relevantEvents=bn(l.getCurrentData().eventStore,c),i.minDistance=e.isTouch?0:s.eventDragMinDistance,i.delay=e.isTouch&&c!==r.props.eventSelection?function(e){var t=e.context.options,n=t.eventLongPressDelay;null==n&&(n=t.longPressDelay);return n}(r):null,s.fixedMirrorParent?a.parentNode=s.fixedMirrorParent:a.parentNode=Se(t,".fc"),a.revertDuration=s.dragRevertDuration;var d=r.isValidSegDownEl(t)&&!Se(t,".fc-event-resizer");i.setIgnoreMove(!d),o.isDragging=d&&e.subjectEl.classList.contains("fc-event-draggable")},o.handleDragStart=function(e){var t=o.component.context,n=o.eventRange,r=n.instance.instanceId;e.isTouch?r!==o.component.props.eventSelection&&t.dispatch({type:"SELECT_EVENT",eventInstanceId:r}):t.dispatch({type:"UNSELECT_EVENT"}),o.isDragging&&(t.calendarApi.unselect(e),t.emitter.trigger("eventDragStart",{el:o.subjectEl,event:new xr(t,n.def,n.instance),jsEvent:e.origEvent,view:t.viewApi}))},o.handleHitUpdate=function(e,t){if(o.isDragging){var n=o.relevantEvents,r=o.hitDragging.initialHit,i=o.component.context,a=null,s=null,l=null,u=!1,c={affectedEvents:n,mutatedEvents:{defs:{},instances:{}},isEvent:!0};if(e){var d=(a=e.context).options;i===a||d.editable&&d.droppable?(s=function(e,t,n){var r=e.dateSpan,o=t.dateSpan,i=r.range.start,a=o.range.start,s={};r.allDay!==o.allDay&&(s.allDay=o.allDay,s.hasEnd=t.context.options.allDayMaintainDuration,o.allDay&&(i=lt(i)));var l=Fn(i,a,e.context.dateEnv,e.componentId===t.componentId?e.largeUnit:null);l.milliseconds&&(s.allDay=!1);for(var u={datesDelta:l,standardProps:s},c=0,d=n;c<d.length;c++){(0,d[c])(u,e,t)}return u}(r,e,a.getCurrentData().pluginHooks.eventDragMutationMassagers))&&(l=Sr(n,a.getCurrentData().eventUiBases,s,a),c.mutatedEvents=l,Ia(c,e.dateProfile,a)||(u=!0,s=null,l=null,c.mutatedEvents={defs:{},instances:{}})):a=null}o.displayDrag(a,c),u?Ue():We(),t||(i===a&&Us(r,e)&&(s=null),o.dragging.setMirrorNeedsRevert(!s),o.dragging.setMirrorIsVisible(!e||!Te(o.subjectEl).querySelector(".fc-event-mirror")),o.receivingContext=a,o.validMutation=s,o.mutatedRelevantEvents=l)}},o.handlePointerUp=function(){o.isDragging||o.cleanup()},o.handleDragEnd=function(e){if(o.isDragging){var t=o.component.context,n=t.viewApi,i=o,a=i.receivingContext,s=i.validMutation,l=o.eventRange.def,u=o.eventRange.instance,c=new xr(t,l,u),d=o.relevantEvents,p=o.mutatedRelevantEvents,f=o.hitDragging.finalHit;if(o.clearDrag(),t.emitter.trigger("eventDragStop",{el:o.subjectEl,event:c,jsEvent:e.origEvent,view:n}),s){if(a===t){var h=new xr(t,p.defs[l.defId],u?p.instances[u.instanceId]:null);t.dispatch({type:"MERGE_EVENTS",eventStore:p});for(var v={oldEvent:c,event:h,relatedEvents:Ir(p,t,u),revert:function(){t.dispatch({type:"MERGE_EVENTS",eventStore:d})}},g={},m=0,y=t.getCurrentData().pluginHooks.eventDropTransformers;m<y.length;m++){var E=y[m];r(g,E(s,t))}t.emitter.trigger("eventDrop",r(r(r({},v),g),{el:e.subjectEl,delta:s.datesDelta,jsEvent:e.origEvent,view:n})),t.emitter.trigger("eventChange",v)}else if(a){var S={event:c,relatedEvents:Ir(d,t,u),revert:function(){t.dispatch({type:"MERGE_EVENTS",eventStore:d})}};t.emitter.trigger("eventLeave",r(r({},S),{draggedEl:e.subjectEl,view:n})),t.dispatch({type:"REMOVE_EVENTS",eventStore:d}),t.emitter.trigger("eventRemove",S);var b=p.defs[l.defId],D=p.instances[u.instanceId],C=new xr(a,b,D);a.dispatch({type:"MERGE_EVENTS",eventStore:p});var w={event:C,relatedEvents:Ir(p,a,D),revert:function(){a.dispatch({type:"REMOVE_EVENTS",eventStore:p})}};a.emitter.trigger("eventAdd",w),e.isTouch&&a.dispatch({type:"SELECT_EVENT",eventInstanceId:u.instanceId}),a.emitter.trigger("drop",r(r({},Ws(f.dateSpan,a)),{draggedEl:e.subjectEl,jsEvent:e.origEvent,view:f.context.viewApi})),a.emitter.trigger("eventReceive",r(r({},w),{draggedEl:e.subjectEl,view:f.context.viewApi}))}}else t.emitter.trigger("_noEventDrop")}o.cleanup()};var i=o.component.context.options,a=o.dragging=new Os(n.el);a.pointer.selector=t.SELECTOR,a.touchScrollAllowed=!1,a.autoScroller.isEnabled=i.dragScroll;var s=o.hitDragging=new Ls(o.dragging,ra);return s.useSubjectCenter=n.useEventCenter,s.emitter.on("pointerdown",o.handlePointerDown),s.emitter.on("dragstart",o.handleDragStart),s.emitter.on("hitupdate",o.handleHitUpdate),s.emitter.on("pointerup",o.handlePointerUp),s.emitter.on("dragend",o.handleDragEnd),o}return n(t,e),t.prototype.destroy=function(){this.dragging.destroy()},t.prototype.displayDrag=function(e,t){var n=this.component.context,r=this.receivingContext;r&&r!==e&&(r===n?r.dispatch({type:"SET_EVENT_DRAG",state:{affectedEvents:t.affectedEvents,mutatedEvents:{defs:{},instances:{}},isEvent:!0}}):r.dispatch({type:"UNSET_EVENT_DRAG"})),e&&e.dispatch({type:"SET_EVENT_DRAG",state:t})},t.prototype.clearDrag=function(){var e=this.component.context,t=this.receivingContext;t&&t.dispatch({type:"UNSET_EVENT_DRAG"}),e!==t&&e.dispatch({type:"UNSET_EVENT_DRAG"})},t.prototype.cleanup=function(){this.subjectSeg=null,this.isDragging=!1,this.eventRange=null,this.relevantEvents=null,this.receivingContext=null,this.validMutation=null,this.mutatedRelevantEvents=null},t.SELECTOR=".fc-event-draggable, .fc-event-resizable",t}(ea);var zs=function(e){function t(t){var n=e.call(this,t)||this;n.draggingSegEl=null,n.draggingSeg=null,n.eventRange=null,n.relevantEvents=null,n.validMutation=null,n.mutatedRelevantEvents=null,n.handlePointerDown=function(e){var t=n.component,r=Jn(n.querySegEl(e)),o=n.eventRange=r.eventRange;n.dragging.minDistance=t.context.options.eventDragMinDistance,n.dragging.setIgnoreMove(!n.component.isValidSegDownEl(e.origEvent.target)||e.isTouch&&n.component.props.eventSelection!==o.instance.instanceId)},n.handleDragStart=function(e){var t=n.component.context,r=n.eventRange;n.relevantEvents=bn(t.getCurrentData().eventStore,n.eventRange.instance.instanceId);var o=n.querySegEl(e);n.draggingSegEl=o,n.draggingSeg=Jn(o),t.calendarApi.unselect(),t.emitter.trigger("eventResizeStart",{el:o,event:new xr(t,r.def,r.instance),jsEvent:e.origEvent,view:t.viewApi})},n.handleHitUpdate=function(e,t,r){var o=n.component.context,i=n.relevantEvents,a=n.hitDragging.initialHit,s=n.eventRange.instance,l=null,u=null,c=!1,d={affectedEvents:i,mutatedEvents:{defs:{},instances:{}},isEvent:!0};e&&(e.componentId===a.componentId&&n.isHitComboAllowed&&!n.isHitComboAllowed(a,e)||(l=function(e,t,n,r){var o=e.context.dateEnv,i=e.dateSpan.range.start,a=t.dateSpan.range.start,s=Fn(i,a,o,e.largeUnit);if(n){if(o.add(r.start,s)<r.end)return{startDelta:s}}else if(o.add(r.end,s)>r.start)return{endDelta:s};return null}(a,e,r.subjectEl.classList.contains("fc-event-resizer-start"),s.range)));l&&(u=Sr(i,o.getCurrentData().eventUiBases,l,o),d.mutatedEvents=u,Ia(d,e.dateProfile,o)||(c=!0,l=null,u=null,d.mutatedEvents=null)),u?o.dispatch({type:"SET_EVENT_RESIZE",state:d}):o.dispatch({type:"UNSET_EVENT_RESIZE"}),c?Ue():We(),t||(l&&Us(a,e)&&(l=null),n.validMutation=l,n.mutatedRelevantEvents=u)},n.handleDragEnd=function(e){var t=n.component.context,o=n.eventRange.def,i=n.eventRange.instance,a=new xr(t,o,i),s=n.relevantEvents,l=n.mutatedRelevantEvents;if(t.emitter.trigger("eventResizeStop",{el:n.draggingSegEl,event:a,jsEvent:e.origEvent,view:t.viewApi}),n.validMutation){var u=new xr(t,l.defs[o.defId],i?l.instances[i.instanceId]:null);t.dispatch({type:"MERGE_EVENTS",eventStore:l});var c={oldEvent:a,event:u,relatedEvents:Ir(l,t,i),revert:function(){t.dispatch({type:"MERGE_EVENTS",eventStore:s})}};t.emitter.trigger("eventResize",r(r({},c),{el:n.draggingSegEl,startDelta:n.validMutation.startDelta||Nt(0),endDelta:n.validMutation.endDelta||Nt(0),jsEvent:e.origEvent,view:t.viewApi})),t.emitter.trigger("eventChange",c)}else t.emitter.trigger("_noEventResize");n.draggingSeg=null,n.relevantEvents=null,n.validMutation=null};var o=t.component,i=n.dragging=new Os(t.el);i.pointer.selector=".fc-event-resizer",i.touchScrollAllowed=!1,i.autoScroller.isEnabled=o.context.options.dragScroll;var a=n.hitDragging=new Ls(n.dragging,na(t));return a.emitter.on("pointerdown",n.handlePointerDown),a.emitter.on("dragstart",n.handleDragStart),a.emitter.on("hitupdate",n.handleHitUpdate),a.emitter.on("dragend",n.handleDragEnd),n}return n(t,e),t.prototype.destroy=function(){this.dragging.destroy()},t.prototype.querySegEl=function(e){return Se(e.subjectEl,".fc-event")},t}(ea);var js=function(){function e(e){var t=this;this.context=e,this.isRecentPointerDateSelect=!1,this.matchesCancel=!1,this.matchesEvent=!1,this.onSelect=function(e){e.jsEvent&&(t.isRecentPointerDateSelect=!0)},this.onDocumentPointerDown=function(e){var n=t.context.options.unselectCancel,r=_e(e.origEvent);t.matchesCancel=!!Se(r,n),t.matchesEvent=!!Se(r,Bs.SELECTOR)},this.onDocumentPointerUp=function(e){var n=t.context,r=t.documentPointer,o=n.getCurrentData();if(!r.wasTouchScroll){if(o.dateSelection&&!t.isRecentPointerDateSelect){var i=n.options.unselectAuto;!i||i&&t.matchesCancel||n.calendarApi.unselect(e)}o.eventSelection&&!t.matchesEvent&&n.dispatch({type:"UNSELECT_EVENT"})}t.isRecentPointerDateSelect=!1};var n=this.documentPointer=new Ts(document);n.shouldIgnoreMove=!0,n.shouldWatchScroll=!1,n.emitter.on("pointerdown",this.onDocumentPointerDown),n.emitter.on("pointerup",this.onDocumentPointerUp),e.emitter.on("select",this.onSelect)}return e.prototype.destroy=function(){this.context.emitter.off("select",this.onSelect),this.documentPointer.destroy()},e}(),Gs={fixedMirrorParent:yn},qs={dateClick:yn,eventDragStart:yn,eventDragStop:yn,eventDrop:yn,eventResizeStart:yn,eventResizeStop:yn,eventResize:yn,drop:yn,eventReceive:yn,eventLeave:yn},Ys=function(){function e(e,t){var n=this;this.receivingContext=null,this.droppableEvent=null,this.suppliedDragMeta=null,this.dragMeta=null,this.handleDragStart=function(e){n.dragMeta=n.buildDragMeta(e.subjectEl)},this.handleHitUpdate=function(e,t,o){var i=n.hitDragging.dragging,a=null,s=null,l=!1,u={affectedEvents:{defs:{},instances:{}},mutatedEvents:{defs:{},instances:{}},isEvent:n.dragMeta.create};e&&(a=e.context,n.canDropElOnCalendar(o.subjectEl,a)&&(s=function(e,t,n){for(var o=r({},t.leftoverProps),i=0,a=n.pluginHooks.externalDefTransforms;i<a.length;i++){var s=a[i];r(o,s(e,t))}var l=On(o,n),u=l.refined,c=l.extra,d=Ln(u,c,t.sourceId,e.allDay,n.options.forceEventDuration||Boolean(t.duration),n),p=e.range.start;e.allDay&&t.startTime&&(p=n.dateEnv.add(p,t.startTime));var f=t.duration?n.dateEnv.add(p,t.duration):Er(e.allDay,p,n),h=mt(d.defId,{start:p,end:f});return{def:d,instance:h}}(e.dateSpan,n.dragMeta,a),u.mutatedEvents=Sn(s),(l=!Ia(u,e.dateProfile,a))&&(u.mutatedEvents={defs:{},instances:{}},s=null))),n.displayDrag(a,u),i.setMirrorIsVisible(t||!s||!document.querySelector(".fc-event-mirror")),l?Ue():We(),t||(i.setMirrorNeedsRevert(!s),n.receivingContext=a,n.droppableEvent=s)},this.handleDragEnd=function(e){var t=n,o=t.receivingContext,i=t.droppableEvent;if(n.clearDrag(),o&&i){var a=n.hitDragging.finalHit,s=a.context.viewApi,l=n.dragMeta;if(o.emitter.trigger("drop",r(r({},Ws(a.dateSpan,o)),{draggedEl:e.subjectEl,jsEvent:e.origEvent,view:s})),l.create){var u=Sn(i);o.dispatch({type:"MERGE_EVENTS",eventStore:u}),e.isTouch&&o.dispatch({type:"SELECT_EVENT",eventInstanceId:i.instance.instanceId}),o.emitter.trigger("eventReceive",{event:new xr(o,i.def,i.instance),relatedEvents:[],revert:function(){o.dispatch({type:"REMOVE_EVENTS",eventStore:u})},draggedEl:e.subjectEl,view:s})}}n.receivingContext=null,n.droppableEvent=null};var o=this.hitDragging=new Ls(e,ra);o.requireInitial=!1,o.emitter.on("dragstart",this.handleDragStart),o.emitter.on("hitupdate",this.handleHitUpdate),o.emitter.on("dragend",this.handleDragEnd),this.suppliedDragMeta=t}return e.prototype.buildDragMeta=function(e){return"object"==typeof this.suppliedDragMeta?sa(this.suppliedDragMeta):"function"==typeof this.suppliedDragMeta?sa(this.suppliedDragMeta(e)):sa((t=function(e,t){var n=ia.dataAttrPrefix,r=(n?n+"-":"")+t;return e.getAttribute("data-"+r)||""}(e,"event"))?JSON.parse(t):{create:!1});var t},e.prototype.displayDrag=function(e,t){var n=this.receivingContext;n&&n!==e&&n.dispatch({type:"UNSET_EVENT_DRAG"}),e&&e.dispatch({type:"SET_EVENT_DRAG",state:t})},e.prototype.clearDrag=function(){this.receivingContext&&this.receivingContext.dispatch({type:"UNSET_EVENT_DRAG"})},e.prototype.canDropElOnCalendar=function(e,t){var n=t.options.dropAccept;return"function"==typeof n?n.call(t.calendarApi,e):"string"!=typeof n||!n||Boolean(be(e,n))},e}();ia.dataAttrPrefix="";var Zs=function(){function e(e,t){var n=this;void 0===t&&(t={}),this.handlePointerDown=function(e){var t=n.dragging,r=n.settings,o=r.minDistance,i=r.longPressDelay;t.minDistance=null!=o?o:e.isTouch?0:cn.eventDragMinDistance,t.delay=e.isTouch?null!=i?i:cn.longPressDelay:0},this.handleDragStart=function(e){e.isTouch&&n.dragging.delay&&e.subjectEl.classList.contains("fc-event")&&n.dragging.mirror.getMirrorEl().classList.add("fc-event-selected")},this.settings=t;var r=this.dragging=new Os(e);r.touchScrollAllowed=!1,null!=t.itemSelector&&(r.pointer.selector=t.itemSelector),null!=t.appendTo&&(r.mirror.parentNode=t.appendTo),r.emitter.on("pointerdown",this.handlePointerDown),r.emitter.on("dragstart",this.handleDragStart),new Ys(r,t.eventData)}return e.prototype.destroy=function(){this.dragging.destroy()},e}(),Xs=function(e){function t(t){var n=e.call(this,t)||this;n.shouldIgnoreMove=!1,n.mirrorSelector="",n.currentMirrorEl=null,n.handlePointerDown=function(e){n.emitter.trigger("pointerdown",e),n.shouldIgnoreMove||n.emitter.trigger("dragstart",e)},n.handlePointerMove=function(e){n.shouldIgnoreMove||n.emitter.trigger("dragmove",e)},n.handlePointerUp=function(e){n.emitter.trigger("pointerup",e),n.shouldIgnoreMove||n.emitter.trigger("dragend",e)};var r=n.pointer=new Ts(t);return r.emitter.on("pointerdown",n.handlePointerDown),r.emitter.on("pointermove",n.handlePointerMove),r.emitter.on("pointerup",n.handlePointerUp),n}return n(t,e),t.prototype.destroy=function(){this.pointer.destroy()},t.prototype.setIgnoreMove=function(e){this.shouldIgnoreMove=e},t.prototype.setMirrorIsVisible=function(e){if(e)this.currentMirrorEl&&(this.currentMirrorEl.style.visibility="",this.currentMirrorEl=null);else{var t=this.mirrorSelector?document.querySelector(this.mirrorSelector):null;t&&(this.currentMirrorEl=t,t.style.visibility="hidden")}},t}(oa),Ks=function(){function e(e,t){var n=document;e===document||e instanceof Element?(n=e,t=t||{}):t=e||{};var r=this.dragging=new Xs(n);"string"==typeof t.itemSelector?r.pointer.selector=t.itemSelector:n===document&&(r.pointer.selector="[data-event]"),"string"==typeof t.mirrorSelector&&(r.mirrorSelector=t.mirrorSelector),new Ys(r,t.eventData)}return e.prototype.destroy=function(){this.dragging.destroy()},e}(),$s=zo({componentInteractions:[Vs,Fs,Bs,zs],calendarInteractions:[js],elementDraggingImpl:Os,optionRefiners:Gs,listenerRefiners:qs}),Js=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.headerElRef=ko(),t}return n(t,e),t.prototype.renderSimpleLayout=function(e,t){var n=this.props,r=this.context,o=[],i=Qa(r.options);return e&&o.push({type:"header",key:"header",isSticky:i,chunk:{elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}}),o.push({type:"body",key:"body",liquid:!0,chunk:{content:t}}),_o(ti,{viewSpec:r.viewSpec},(function(e,t){return _o("div",{ref:e,className:["fc-daygrid"].concat(t).join(" ")},_o(ts,{liquid:!n.isHeightAuto&&!n.forPrint,collapsibleWidth:n.forPrint,cols:[],sections:o}))}))},t.prototype.renderHScrollLayout=function(e,t,n,r){var o=this.context.pluginHooks.scrollGridImpl;if(!o)throw new Error("No ScrollGrid implementation");var i=this.props,a=this.context,s=!i.forPrint&&Qa(a.options),l=!i.forPrint&&es(a.options),u=[];return e&&u.push({type:"header",key:"header",isSticky:s,chunks:[{key:"main",elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}]}),u.push({type:"body",key:"body",liquid:!0,chunks:[{key:"main",content:t}]}),l&&u.push({type:"footer",key:"footer",isSticky:!0,chunks:[{key:"main",content:Ja}]}),_o(ti,{viewSpec:a.viewSpec},(function(e,t){return _o("div",{ref:e,className:["fc-daygrid"].concat(t).join(" ")},_o(o,{liquid:!i.isHeightAuto&&!i.forPrint,collapsibleWidth:i.forPrint,colGroups:[{cols:[{span:n,minWidth:r}]}],sections:u}))}))},t}(Bo);function Qs(e,t){for(var n=[],r=0;r<t;r+=1)n[r]=[];for(var o=0,i=e;o<i.length;o++){var a=i[o];n[a.row].push(a)}return n}function el(e,t){for(var n=[],r=0;r<t;r+=1)n[r]=[];for(var o=0,i=e;o<i.length;o++){var a=i[o];n[a.firstCol].push(a)}return n}function tl(e,t){var n=[];if(e){for(a=0;a<t;a+=1)n[a]={affectedInstances:e.affectedInstances,isEvent:e.isEvent,segs:[]};for(var r=0,o=e.segs;r<o.length;r++){var i=o[r];n[i.row].segs.push(i)}}else for(var a=0;a<t;a+=1)n[a]=null;return n}var nl=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=so(this.context,e.date);return _o(ss,{date:e.date,dateProfile:e.dateProfile,todayRange:e.todayRange,showDayNumber:e.showDayNumber,extraHookProps:e.extraHookProps,defaultContent:rl},(function(n,o){return(o||e.forceDayTop)&&_o("div",{className:"fc-daygrid-day-top",ref:n},_o("a",r({id:e.dayNumberId,className:"fc-daygrid-day-number"},t),o||_o(xo,null," ")))}))},t}(Uo);function rl(e){return e.dayNumberText}var ol=ln({hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"narrow"});function il(e){var t=e.eventRange.ui.display;return"list-item"===t||"auto"===t&&!e.eventRange.def.allDay&&e.firstCol===e.lastCol&&e.isStart&&e.isEnd}var al=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props;return _o(rs,r({},e,{extraClassNames:["fc-daygrid-event","fc-daygrid-block-event","fc-h-event"],defaultTimeFormat:ol,defaultDisplayEventEnd:e.defaultDisplayEventEnd,disableResizing:!e.seg.eventRange.def.allDay}))},t}(Uo),sl=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context,n=t.options.eventTimeFormat||ol,o=ar(e.seg,n,t,!0,e.defaultDisplayEventEnd);return _o(ns,{seg:e.seg,timeText:o,defaultContent:ll,isDragging:e.isDragging,isResizing:!1,isDateSelecting:!1,isSelected:e.isSelected,isPast:e.isPast,isFuture:e.isFuture,isToday:e.isToday},(function(n,o,i,a){return _o("a",r({className:["fc-daygrid-event","fc-daygrid-dot-event"].concat(o).join(" "),ref:n},cr(e.seg,t)),a)}))},t}(Uo);function ll(e){return _o(xo,null,_o("div",{className:"fc-daygrid-event-dot",style:{borderColor:e.borderColor||e.backgroundColor}}),e.timeText&&_o("div",{className:"fc-event-time"},e.timeText),_o("div",{className:"fc-event-title"},e.event.title||_o(xo,null," ")))}var ul=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.compileSegs=qt(cl),t}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.compileSegs(e.singlePlacements),n=t.allSegs,o=t.invisibleSegs;return _o(ms,{dateProfile:e.dateProfile,todayRange:e.todayRange,allDayDate:e.allDayDate,moreCnt:e.moreCnt,allSegs:n,hiddenSegs:o,alignmentElRef:e.alignmentElRef,alignGridTop:e.alignGridTop,extraDateSpan:e.extraDateSpan,popoverContent:function(){var t=(e.eventDrag?e.eventDrag.affectedInstances:null)||(e.eventResize?e.eventResize.affectedInstances:null)||{};return _o(xo,null,n.map((function(n){var o=n.eventRange.instance.instanceId;return _o("div",{className:"fc-daygrid-event-harness",key:o,style:{visibility:t[o]?"hidden":""}},il(n)?_o(sl,r({seg:n,isDragging:!1,isSelected:o===e.eventSelection,defaultDisplayEventEnd:!1},sr(n,e.todayRange))):_o(al,r({seg:n,isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:o===e.eventSelection,defaultDisplayEventEnd:!1},sr(n,e.todayRange))))})))}},(function(e,t,n,o,i,a,s,l){return _o("a",r({ref:e,className:["fc-daygrid-more-link"].concat(t).join(" "),title:a,"aria-expanded":s,"aria-controls":l},He(i)),o)}))},t}(Uo);function cl(e){for(var t=[],n=[],r=0,o=e;r<o.length;r++){var i=o[r];t.push(i.seg),i.isVisible||n.push(i.seg)}return{allSegs:t,invisibleSegs:n}}var dl=ln({week:"narrow"}),pl=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.rootElRef=ko(),t.state={dayNumberId:xe()},t.handleRootEl=function(e){Fo(t.rootElRef,e),Fo(t.props.elRef,e)},t}return n(t,e),t.prototype.render=function(){var e=this,t=e.context,n=e.props,o=e.state,i=e.rootElRef,a=n.date,s=n.dateProfile,l=so(t,a,"week");return _o(us,{date:a,dateProfile:s,todayRange:n.todayRange,showDayNumber:n.showDayNumber,extraHookProps:n.extraHookProps,elRef:this.handleRootEl},(function(e,t,u,c){return _o("td",r({ref:e,role:"gridcell",className:["fc-daygrid-day"].concat(t,n.extraClassNames||[]).join(" ")},u,n.extraDataAttrs,n.showDayNumber?{"aria-labelledby":o.dayNumberId}:{}),_o("div",{className:"fc-daygrid-day-frame fc-scrollgrid-sync-inner",ref:n.innerElRef},n.showWeekNumber&&_o(fs,{date:a,defaultFormat:dl},(function(e,t,n,o){return _o("a",r({ref:e,className:["fc-daygrid-week-number"].concat(t).join(" ")},l),o)})),!c&&_o(nl,{date:a,dateProfile:s,showDayNumber:n.showDayNumber,dayNumberId:o.dayNumberId,forceDayTop:n.forceDayTop,todayRange:n.todayRange,extraHookProps:n.extraHookProps}),_o("div",{className:"fc-daygrid-day-events",ref:n.fgContentElRef},n.fgContent,_o("div",{className:"fc-daygrid-day-bottom",style:{marginTop:n.moreMarginTop}},_o(ul,{allDayDate:a,singlePlacements:n.singlePlacements,moreCnt:n.moreCnt,alignmentElRef:i,alignGridTop:!n.showDayNumber,extraDateSpan:n.extraDateSpan,dateProfile:n.dateProfile,eventSelection:n.eventSelection,eventDrag:n.eventDrag,eventResize:n.eventResize,todayRange:n.todayRange}))),_o("div",{className:"fc-daygrid-day-bg"},n.bgContent)))}))},t}(Bo);function fl(e,t,n,r,o,i,a){var s=new vl;s.allowReslicing=!0,s.strictOrder=r,!0===t||!0===n?(s.maxCoord=i,s.hiddenConsumes=!0):"number"==typeof t?s.maxStackCnt=t:"number"==typeof n&&(s.maxStackCnt=n,s.hiddenConsumes=!0);for(var l=[],u=[],c=0;c<e.length;c+=1){var d=o[(R=e[c]).eventRange.instance.instanceId];null!=d?l.push({index:c,thickness:d,span:{start:R.firstCol,end:R.lastCol+1}}):u.push(R)}for(var p=s.addSegs(l),f=function(e,t,n){for(var r=function(e,t){for(var n=[],r=0;r<t;r+=1)n.push([]);for(var o=0,i=e;o<i.length;o++){var a=i[o];for(r=a.span.start;r<a.span.end;r+=1)n[r].push(a)}return n}(e,n.length),o=[],i=[],a=[],s=0;s<n.length;s+=1){for(var l=r[s],u=[],c=0,d=0,p=0,f=l;p<f.length;p++){var h=t[(y=f[p]).index];u.push({seg:hl(h,s,s+1,n),isVisible:!0,isAbsolute:!1,absoluteTop:y.levelCoord,marginTop:y.levelCoord-c}),c=y.levelCoord+y.thickness}var v=[];c=0,d=0;for(var g=0,m=l;g<m.length;g++){h=t[(y=m[g]).index];var y,E=y.span.end-y.span.start>1,S=y.span.start===s;d+=y.levelCoord-c,c=y.levelCoord+y.thickness,E?(d+=y.thickness,S&&v.push({seg:hl(h,y.span.start,y.span.end,n),isVisible:!0,isAbsolute:!0,absoluteTop:y.levelCoord,marginTop:0})):S&&(v.push({seg:hl(h,y.span.start,y.span.end,n),isVisible:!0,isAbsolute:!1,absoluteTop:y.levelCoord,marginTop:d}),d=0)}o.push(u),i.push(v),a.push(d)}return{singleColPlacements:o,multiColPlacements:i,leftoverMargins:a}}(s.toRects(),e,a),h=f.singleColPlacements,v=f.multiColPlacements,g=f.leftoverMargins,m=[],y=[],E=0,S=u;E<S.length;E++){v[(R=S[E]).firstCol].push({seg:R,isVisible:!1,isAbsolute:!0,absoluteTop:0,marginTop:0});for(var b=R.firstCol;b<=R.lastCol;b+=1)h[b].push({seg:hl(R,b,b+1,a),isVisible:!1,isAbsolute:!1,absoluteTop:0,marginTop:0})}for(b=0;b<a.length;b+=1)m.push(0);for(var D=0,C=p;D<C.length;D++){var w=C[D],R=e[w.index],_=w.span;v[_.start].push({seg:hl(R,_.start,_.end,a),isVisible:!1,isAbsolute:!0,absoluteTop:0,marginTop:0});for(b=_.start;b<_.end;b+=1)m[b]+=1,h[b].push({seg:hl(R,b,b+1,a),isVisible:!1,isAbsolute:!1,absoluteTop:0,marginTop:0})}for(b=0;b<a.length;b+=1)y.push(g[b]);return{singleColPlacements:h,multiColPlacements:v,moreCnts:m,moreMarginTops:y}}function hl(e,t,n,o){if(e.firstCol===t&&e.lastCol===n-1)return e;var i=e.eventRange,a=i.range,s=jn(a,{start:o[t].date,end:tt(o[n-1].date,1)});return r(r({},e),{firstCol:t,lastCol:n-1,eventRange:{def:i.def,ui:r(r({},i.ui),{durationEditable:!1}),instance:i.instance,range:s},isStart:e.isStart&&s.start.valueOf()===a.start.valueOf(),isEnd:e.isEnd&&s.end.valueOf()===a.end.valueOf()})}var vl=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.hiddenConsumes=!1,t.forceHidden={},t}return n(t,e),t.prototype.addSegs=function(t){for(var n=this,r=e.prototype.addSegs.call(this,t),o=this.entriesByLevel,i=function(e){return!n.forceHidden[Zi(e)]},a=0;a<o.length;a+=1)o[a]=o[a].filter(i);return r},t.prototype.handleInvalidInsertion=function(t,n,o){var i=this.entriesByLevel,a=this.forceHidden,s=t.touchingEntry,l=t.touchingLevel,u=t.touchingLateral;if(this.hiddenConsumes&&s){var c=Zi(s);if(!a[c])if(this.allowReslicing){var d=r(r({},s),{span:$i(s.span,n.span)});a[Zi(d)]=!0,i[l][u]=d,this.splitEntry(s,n,o)}else a[c]=!0,o.push(s)}return e.prototype.handleInvalidInsertion.call(this,t,n,o)},t}(qi),gl=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.cellElRefs=new Fa,t.frameElRefs=new Fa,t.fgElRefs=new Fa,t.segHarnessRefs=new Fa,t.rootElRef=ko(),t.state={framePositions:null,maxContentHeight:null,eventInstanceHeights:{}},t}return n(t,e),t.prototype.render=function(){var e=this,t=this,n=t.props,r=t.state,o=t.context.options,i=n.cells.length,a=el(n.businessHourSegs,i),s=el(n.bgEventSegs,i),l=el(this.getHighlightSegs(),i),u=el(this.getMirrorSegs(),i),c=fl(tr(n.fgEventSegs,o.eventOrder),n.dayMaxEvents,n.dayMaxEventRows,o.eventOrderStrict,r.eventInstanceHeights,r.maxContentHeight,n.cells),d=c.singleColPlacements,p=c.multiColPlacements,f=c.moreCnts,h=c.moreMarginTops,v=n.eventDrag&&n.eventDrag.affectedInstances||n.eventResize&&n.eventResize.affectedInstances||{};return _o("tr",{ref:this.rootElRef,role:"row"},n.renderIntro&&n.renderIntro(),n.cells.map((function(t,r){var o=e.renderFgSegs(r,n.forPrint?d[r]:p[r],n.todayRange,v),i=e.renderFgSegs(r,function(e,t){if(!e.length)return[];var n=function(e){for(var t={},n=0,r=e;n<r.length;n++)for(var o=0,i=r[n];o<i.length;o++){var a=i[o];t[a.seg.eventRange.instance.instanceId]=a.absoluteTop}return t}(t);return e.map((function(e){return{seg:e,isVisible:!0,isAbsolute:!0,absoluteTop:n[e.eventRange.instance.instanceId],marginTop:0}}))}(u[r],p),n.todayRange,{},Boolean(n.eventDrag),Boolean(n.eventResize),!1);return _o(pl,{key:t.key,elRef:e.cellElRefs.createRef(t.key),innerElRef:e.frameElRefs.createRef(t.key),dateProfile:n.dateProfile,date:t.date,showDayNumber:n.showDayNumbers,showWeekNumber:n.showWeekNumbers&&0===r,forceDayTop:n.showWeekNumbers,todayRange:n.todayRange,eventSelection:n.eventSelection,eventDrag:n.eventDrag,eventResize:n.eventResize,extraHookProps:t.extraHookProps,extraDataAttrs:t.extraDataAttrs,extraClassNames:t.extraClassNames,extraDateSpan:t.extraDateSpan,moreCnt:f[r],moreMarginTop:h[r],singlePlacements:d[r],fgContentElRef:e.fgElRefs.createRef(t.key),fgContent:_o(xo,null,_o(xo,null,o),_o(xo,null,i)),bgContent:_o(xo,null,e.renderFillSegs(l[r],"highlight"),e.renderFillSegs(a[r],"non-business"),e.renderFillSegs(s[r],"bg-event"))})})))},t.prototype.componentDidMount=function(){this.updateSizing(!0)},t.prototype.componentDidUpdate=function(e,t){var n=this.props;this.updateSizing(!wt(e,n))},t.prototype.getHighlightSegs=function(){var e=this.props;return e.eventDrag&&e.eventDrag.segs.length?e.eventDrag.segs:e.eventResize&&e.eventResize.segs.length?e.eventResize.segs:e.dateSelectionSegs},t.prototype.getMirrorSegs=function(){var e=this.props;return e.eventResize&&e.eventResize.segs.length?e.eventResize.segs:[]},t.prototype.renderFgSegs=function(e,t,n,o,i,a,s){var l=this.context,u=this.props.eventSelection,c=this.state.framePositions,d=1===this.props.cells.length,p=i||a||s,f=[];if(c)for(var h=0,v=t;h<v.length;h++){var g=v[h],m=g.seg,y=m.eventRange.instance.instanceId,E=y+":"+e,S=g.isVisible&&!o[y],b=g.isAbsolute,D="",C="";b&&(l.isRtl?(C=0,D=c.lefts[m.lastCol]-c.lefts[m.firstCol]):(D=0,C=c.rights[m.firstCol]-c.rights[m.lastCol])),f.push(_o("div",{className:"fc-daygrid-event-harness"+(b?" fc-daygrid-event-harness-abs":""),key:E,ref:p?null:this.segHarnessRefs.createRef(E),style:{visibility:S?"":"hidden",marginTop:b?"":g.marginTop,top:b?g.absoluteTop:"",left:D,right:C}},il(m)?_o(sl,r({seg:m,isDragging:i,isSelected:y===u,defaultDisplayEventEnd:d},sr(m,n))):_o(al,r({seg:m,isDragging:i,isResizing:a,isDateSelecting:s,isSelected:y===u,defaultDisplayEventEnd:d},sr(m,n)))))}return f},t.prototype.renderFillSegs=function(e,t){var n=this.context.isRtl,i=this.props.todayRange,a=this.state.framePositions,s=[];if(a)for(var l=0,u=e;l<u.length;l++){var c=u[l],d=n?{right:0,left:a.lefts[c.lastCol]-a.lefts[c.firstCol]}:{left:0,right:a.rights[c.firstCol]-a.rights[c.lastCol]};s.push(_o("div",{key:ur(c.eventRange),className:"fc-daygrid-bg-harness",style:d},"bg-event"===t?_o(ds,r({seg:c},sr(c,i))):cs(t)))}return _o.apply(void 0,o([xo,{}],s))},t.prototype.updateSizing=function(e){var t=this.props,n=this.frameElRefs;if(!t.forPrint&&null!==t.clientWidth){if(e){var o=t.cells.map((function(e){return n.currentMap[e.key]}));if(o.length){var i=this.rootElRef.current;this.setState({framePositions:new So(i,o,!0,!1)})}}var a=this.state.eventInstanceHeights,s=this.queryEventInstanceHeights(),l=!0===t.dayMaxEvents||!0===t.dayMaxEventRows;this.setState({eventInstanceHeights:r(r({},a),s),maxContentHeight:l?this.computeMaxContentHeight():null})}},t.prototype.queryEventInstanceHeights=function(){var e=this.segHarnessRefs.currentMap,t={};for(var n in e){var r=Math.round(e[n].getBoundingClientRect().height),o=n.split(":")[0];t[o]=Math.max(t[o]||0,r)}return t},t.prototype.computeMaxContentHeight=function(){var e=this.props.cells[0].key,t=this.cellElRefs.currentMap[e],n=this.fgElRefs.currentMap[e];return t.getBoundingClientRect().bottom-n.getBoundingClientRect().top},t.prototype.getCellEls=function(){var e=this.cellElRefs.currentMap;return this.props.cells.map((function(t){return e[t.key]}))},t}(Bo);gl.addStateEquality({eventInstanceHeights:wt});var ml=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.splitBusinessHourSegs=qt(Qs),t.splitBgEventSegs=qt(Qs),t.splitFgEventSegs=qt(Qs),t.splitDateSelectionSegs=qt(Qs),t.splitEventDrag=qt(tl),t.splitEventResize=qt(tl),t.rowRefs=new Fa,t.handleRootEl=function(e){t.rootEl=e,e?t.context.registerInteractiveComponent(t,{el:e,isHitComboAllowed:t.props.isHitComboAllowed}):t.context.unregisterInteractiveComponent(t)},t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=t.dateProfile,r=t.dayMaxEventRows,o=t.dayMaxEvents,i=t.expandRows,a=t.cells.length,s=this.splitBusinessHourSegs(t.businessHourSegs,a),l=this.splitBgEventSegs(t.bgEventSegs,a),u=this.splitFgEventSegs(t.fgEventSegs,a),c=this.splitDateSelectionSegs(t.dateSelectionSegs,a),d=this.splitEventDrag(t.eventDrag,a),p=this.splitEventResize(t.eventResize,a),f=!0===o||!0===r;return f&&!i&&(f=!1,r=null,o=null),_o("div",{className:["fc-daygrid-body",f?"fc-daygrid-body-balanced":"fc-daygrid-body-unbalanced",i?"":"fc-daygrid-body-natural"].join(" "),ref:this.handleRootEl,style:{width:t.clientWidth,minWidth:t.tableMinWidth}},_o(Ca,{unit:"day"},(function(f,h){return _o(xo,null,_o("table",{role:"presentation",className:"fc-scrollgrid-sync-table",style:{width:t.clientWidth,minWidth:t.tableMinWidth,height:i?t.clientHeight:""}},t.colGroupNode,_o("tbody",{role:"presentation"},t.cells.map((function(i,f){return _o(gl,{ref:e.rowRefs.createRef(f),key:i.length?i[0].date.toISOString():f,showDayNumbers:a>1,showWeekNumbers:t.showWeekNumbers,todayRange:h,dateProfile:n,cells:i,renderIntro:t.renderRowIntro,businessHourSegs:s[f],eventSelection:t.eventSelection,bgEventSegs:l[f].filter(yl),fgEventSegs:u[f],dateSelectionSegs:c[f],eventDrag:d[f],eventResize:p[f],dayMaxEvents:o,dayMaxEventRows:r,clientWidth:t.clientWidth,clientHeight:t.clientHeight,forPrint:t.forPrint})})))))})))},t.prototype.prepareHits=function(){this.rowPositions=new So(this.rootEl,this.rowRefs.collect().map((function(e){return e.getCellEls()[0]})),!1,!0),this.colPositions=new So(this.rootEl,this.rowRefs.currentMap[0].getCellEls(),!0,!1)},t.prototype.queryHit=function(e,t){var n=this.colPositions,o=this.rowPositions,i=n.leftToIndex(e),a=o.topToIndex(t);if(null!=a&&null!=i){var s=this.props.cells[a][i];return{dateProfile:this.props.dateProfile,dateSpan:r({range:this.getCellRange(a,i),allDay:!0},s.extraDateSpan),dayEl:this.getCellEl(a,i),rect:{left:n.lefts[i],right:n.rights[i],top:o.tops[a],bottom:o.bottoms[a]},layer:0}}return null},t.prototype.getCellEl=function(e,t){return this.rowRefs.currentMap[e].getCellEls()[t]},t.prototype.getCellRange=function(e,t){var n=this.props.cells[e][t].date;return{start:n,end:tt(n,1)}},t}(Bo);function yl(e){return e.eventRange.def.allDay}var El=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.forceDayIfListItem=!0,t}return n(t,e),t.prototype.sliceRange=function(e,t){return t.sliceRange(e)},t}(xa),Sl=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.slicer=new El,t.tableRef=ko(),t}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context;return _o(ml,r({ref:this.tableRef},this.slicer.sliceProps(e,e.dateProfile,e.nextDayThreshold,t,e.dayTableModel),{dateProfile:e.dateProfile,cells:e.dayTableModel.cells,colGroupNode:e.colGroupNode,tableMinWidth:e.tableMinWidth,renderRowIntro:e.renderRowIntro,dayMaxEvents:e.dayMaxEvents,dayMaxEventRows:e.dayMaxEventRows,showWeekNumbers:e.showWeekNumbers,expandRows:e.expandRows,headerAlignElRef:e.headerAlignElRef,clientWidth:e.clientWidth,clientHeight:e.clientHeight,forPrint:e.forPrint}))},t}(Bo),bl=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.buildDayTableModel=qt(Dl),t.headerRef=ko(),t.tableRef=ko(),t}return n(t,e),t.prototype.render=function(){var e=this,t=this.context,n=t.options,r=t.dateProfileGenerator,o=this.props,i=this.buildDayTableModel(o.dateProfile,r),a=n.dayHeaders&&_o(Ra,{ref:this.headerRef,dateProfile:o.dateProfile,dates:i.headerDates,datesRepDistinctDays:1===i.rowCnt}),s=function(t){return _o(Sl,{ref:e.tableRef,dateProfile:o.dateProfile,dayTableModel:i,businessHours:o.businessHours,dateSelection:o.dateSelection,eventStore:o.eventStore,eventUiBases:o.eventUiBases,eventSelection:o.eventSelection,eventDrag:o.eventDrag,eventResize:o.eventResize,nextDayThreshold:n.nextDayThreshold,colGroupNode:t.tableColGroupNode,tableMinWidth:t.tableMinWidth,dayMaxEvents:n.dayMaxEvents,dayMaxEventRows:n.dayMaxEventRows,showWeekNumbers:n.weekNumbers,expandRows:!o.isHeightAuto,headerAlignElRef:e.headerElRef,clientWidth:t.clientWidth,clientHeight:t.clientHeight,forPrint:o.forPrint})};return n.dayMinWidth?this.renderHScrollLayout(a,s,i.colCnt,n.dayMinWidth):this.renderSimpleLayout(a,s)},t}(Js);function Dl(e,t){var n=new Ta(e.renderRange,t);return new ka(n,/year|month|week/.test(e.currentRangeUnit))}var Cl=zo({initialView:"dayGridMonth",views:{dayGrid:{component:bl,dateProfileGeneratorClass:function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.buildRenderRange=function(t,n,r){var o,i=this.props.dateEnv,a=e.prototype.buildRenderRange.call(this,t,n,r),s=a.start,l=a.end;(/^(year|month)$/.test(n)&&(s=i.startOfWeek(s),(o=i.startOfWeek(l)).valueOf()!==l.valueOf()&&(l=et(o,1))),this.props.monthMode&&this.props.fixedWeekCount)&&(l=et(l,6-Math.ceil(rt(s,l))));return{start:s,end:l}},t}(ai)},dayGridDay:{type:"dayGrid",duration:{days:1}},dayGridWeek:{type:"dayGrid",duration:{weeks:1}},dayGridMonth:{type:"dayGrid",duration:{months:1},monthMode:!0,fixedWeekCount:!0}}}),wl=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.getKeyInfo=function(){return{allDay:{},timed:{}}},t.prototype.getKeysForDateSpan=function(e){return e.allDay?["allDay"]:["timed"]},t.prototype.getKeysForEventDef=function(e){return e.allDay?Kn(e)?["timed","allDay"]:["allDay"]:["timed"]},t}(to),Rl=ln({hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"short"});function _l(e){var t=["fc-timegrid-slot","fc-timegrid-slot-label",e.isLabeled?"fc-scrollgrid-shrink":"fc-timegrid-slot-minor"];return _o(Oo.Consumer,null,(function(n){if(!e.isLabeled)return _o("td",{className:t.join(" "),"data-time":e.isoTimeStr});var r=n.dateEnv,o=n.options,i=n.viewApi,a=null==o.slotLabelFormat?Rl:Array.isArray(o.slotLabelFormat)?ln(o.slotLabelFormat[0]):ln(o.slotLabelFormat),s={level:0,time:e.time,date:r.toDate(e.date),view:i,text:r.format(e.date,a)};return _o(Yo,{hookProps:s,classNames:o.slotLabelClassNames,content:o.slotLabelContent,defaultContent:Tl,didMount:o.slotLabelDidMount,willUnmount:o.slotLabelWillUnmount},(function(n,r,o,i){return _o("td",{ref:n,className:t.concat(r).join(" "),"data-time":e.isoTimeStr},_o("div",{className:"fc-timegrid-slot-label-frame fc-scrollgrid-shrink-frame"},_o("div",{className:"fc-timegrid-slot-label-cushion fc-scrollgrid-shrink-cushion",ref:o},i)))}))}))}function Tl(e){return e.text}var kl=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){return this.props.slatMetas.map((function(e){return _o("tr",{key:e.key},_o(_l,r({},e)))}))},t}(Uo),xl=ln({week:"short"}),Ml=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.allDaySplitter=new wl,t.headerElRef=ko(),t.rootElRef=ko(),t.scrollerElRef=ko(),t.state={slatCoords:null},t.handleScrollTopRequest=function(e){var n=t.scrollerElRef.current;n&&(n.scrollTop=e)},t.renderHeadAxis=function(e,n){void 0===n&&(n="");var o=t.context.options,i=t.props.dateProfile.renderRange,a=1===ot(i.start,i.end)?so(t.context,i.start,"week"):{};return o.weekNumbers&&"day"===e?_o(fs,{date:i.start,defaultFormat:xl},(function(e,t,o,i){return _o("th",{ref:e,"aria-hidden":!0,className:["fc-timegrid-axis","fc-scrollgrid-shrink"].concat(t).join(" ")},_o("div",{className:"fc-timegrid-axis-frame fc-scrollgrid-shrink-frame fc-timegrid-axis-frame-liquid",style:{height:n}},_o("a",r({ref:o,className:"fc-timegrid-axis-cushion fc-scrollgrid-shrink-cushion fc-scrollgrid-sync-inner"},a),i)))})):_o("th",{"aria-hidden":!0,className:"fc-timegrid-axis"},_o("div",{className:"fc-timegrid-axis-frame",style:{height:n}}))},t.renderTableRowAxis=function(e){var n=t.context,r=n.options,o=n.viewApi,i={text:r.allDayText,view:o};return _o(Yo,{hookProps:i,classNames:r.allDayClassNames,content:r.allDayContent,defaultContent:Il,didMount:r.allDayDidMount,willUnmount:r.allDayWillUnmount},(function(t,n,r,o){return _o("td",{ref:t,"aria-hidden":!0,className:["fc-timegrid-axis","fc-scrollgrid-shrink"].concat(n).join(" ")},_o("div",{className:"fc-timegrid-axis-frame fc-scrollgrid-shrink-frame"+(null==e?" fc-timegrid-axis-frame-liquid":""),style:{height:e}},_o("span",{className:"fc-timegrid-axis-cushion fc-scrollgrid-shrink-cushion fc-scrollgrid-sync-inner",ref:r},o)))}))},t.handleSlatCoords=function(e){t.setState({slatCoords:e})},t}return n(t,e),t.prototype.renderSimpleLayout=function(e,t,n){var r=this.context,o=this.props,i=[],a=Qa(r.options);return e&&i.push({type:"header",key:"header",isSticky:a,chunk:{elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}}),t&&(i.push({type:"body",key:"all-day",chunk:{content:t}}),i.push({type:"body",key:"all-day-divider",outerContent:_o("tr",{role:"presentation",className:"fc-scrollgrid-section"},_o("td",{className:"fc-timegrid-divider "+r.theme.getClass("tableCellShaded")}))})),i.push({type:"body",key:"body",liquid:!0,expandRows:Boolean(r.options.expandRows),chunk:{scrollerElRef:this.scrollerElRef,content:n}}),_o(ti,{viewSpec:r.viewSpec,elRef:this.rootElRef},(function(e,t){return _o("div",{className:["fc-timegrid"].concat(t).join(" "),ref:e},_o(ts,{liquid:!o.isHeightAuto&&!o.forPrint,collapsibleWidth:o.forPrint,cols:[{width:"shrink"}],sections:i}))}))},t.prototype.renderHScrollLayout=function(e,t,n,r,o,i,a){var s=this,l=this.context.pluginHooks.scrollGridImpl;if(!l)throw new Error("No ScrollGrid implementation");var u=this.context,c=this.props,d=!c.forPrint&&Qa(u.options),p=!c.forPrint&&es(u.options),f=[];e&&f.push({type:"header",key:"header",isSticky:d,syncRowHeights:!0,chunks:[{key:"axis",rowContent:function(e){return _o("tr",{role:"presentation"},s.renderHeadAxis("day",e.rowSyncHeights[0]))}},{key:"cols",elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}]}),t&&(f.push({type:"body",key:"all-day",syncRowHeights:!0,chunks:[{key:"axis",rowContent:function(e){return _o("tr",{role:"presentation"},s.renderTableRowAxis(e.rowSyncHeights[0]))}},{key:"cols",content:t}]}),f.push({key:"all-day-divider",type:"body",outerContent:_o("tr",{role:"presentation",className:"fc-scrollgrid-section"},_o("td",{colSpan:2,className:"fc-timegrid-divider "+u.theme.getClass("tableCellShaded")}))}));var h=u.options.nowIndicator;return f.push({type:"body",key:"body",liquid:!0,expandRows:Boolean(u.options.expandRows),chunks:[{key:"axis",content:function(e){return _o("div",{className:"fc-timegrid-axis-chunk"},_o("table",{"aria-hidden":!0,style:{height:e.expandRows?e.clientHeight:""}},e.tableColGroupNode,_o("tbody",null,_o(kl,{slatMetas:i}))),_o("div",{className:"fc-timegrid-now-indicator-container"},_o(Ca,{unit:h?"minute":"day"},(function(e){var t=h&&a&&a.safeComputeTop(e);return"number"==typeof t?_o(is,{isAxis:!0,date:e},(function(e,n,r,o){return _o("div",{ref:e,className:["fc-timegrid-now-indicator-arrow"].concat(n).join(" "),style:{top:t}},o)})):null}))))}},{key:"cols",scrollerElRef:this.scrollerElRef,content:n}]}),p&&f.push({key:"footer",type:"footer",isSticky:!0,chunks:[{key:"axis",content:Ja},{key:"cols",content:Ja}]}),_o(ti,{viewSpec:u.viewSpec,elRef:this.rootElRef},(function(e,t){return _o("div",{className:["fc-timegrid"].concat(t).join(" "),ref:e},_o(l,{liquid:!c.isHeightAuto&&!c.forPrint,collapsibleWidth:!1,colGroups:[{width:"shrink",cols:[{width:"shrink"}]},{cols:[{span:r,minWidth:o}]}],sections:f}))}))},t.prototype.getAllDayMaxEventProps=function(){var e=this.context.options,t=e.dayMaxEvents,n=e.dayMaxEventRows;return!0!==t&&!0!==n||(t=void 0,n=5),{dayMaxEvents:t,dayMaxEventRows:n}},t}(Bo);function Il(e){return e.text}var Pl=function(){function e(e,t,n){this.positions=e,this.dateProfile=t,this.slotDuration=n}return e.prototype.safeComputeTop=function(e){var t=this.dateProfile;if(Zn(t.currentRange,e)){var n=lt(e),r=e.valueOf()-n.valueOf();if(r>=Ut(t.slotMinTime)&&r<Ut(t.slotMaxTime))return this.computeTimeTop(Nt(r))}return null},e.prototype.computeDateTop=function(e,t){return t||(t=lt(e)),this.computeTimeTop(Nt(e.valueOf()-t.valueOf()))},e.prototype.computeTimeTop=function(e){var t,n,r=this.positions,o=this.dateProfile,i=r.els.length,a=(e.milliseconds-Ut(o.slotMinTime))/Ut(this.slotDuration);return a=Math.max(0,a),a=Math.min(i,a),t=Math.floor(a),n=a-(t=Math.min(t,i-1)),r.tops[t]+r.getHeight(t)*n},e}(),Nl=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context,n=t.options,o=e.slatElRefs;return _o("tbody",null,e.slatMetas.map((function(i,a){var s={time:i.time,date:t.dateEnv.toDate(i.date),view:t.viewApi},l=["fc-timegrid-slot","fc-timegrid-slot-lane",i.isLabeled?"":"fc-timegrid-slot-minor"];return _o("tr",{key:i.key,ref:o.createRef(i.key)},e.axis&&_o(_l,r({},i)),_o(Yo,{hookProps:s,classNames:n.slotLaneClassNames,content:n.slotLaneContent,didMount:n.slotLaneDidMount,willUnmount:n.slotLaneWillUnmount},(function(e,t,n,r){return _o("td",{ref:e,className:l.concat(t).join(" "),"data-time":i.isoTimeStr},r)})))})))},t}(Uo),Hl=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.rootElRef=ko(),t.slatElRefs=new Fa,t}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context;return _o("div",{ref:this.rootElRef,className:"fc-timegrid-slots"},_o("table",{"aria-hidden":!0,className:t.theme.getClass("table"),style:{minWidth:e.tableMinWidth,width:e.clientWidth,height:e.minHeight}},e.tableColGroupNode,_o(Nl,{slatElRefs:this.slatElRefs,axis:e.axis,slatMetas:e.slatMetas})))},t.prototype.componentDidMount=function(){this.updateSizing()},t.prototype.componentDidUpdate=function(){this.updateSizing()},t.prototype.componentWillUnmount=function(){this.props.onCoords&&this.props.onCoords(null)},t.prototype.updateSizing=function(){var e,t=this.context,n=this.props;n.onCoords&&null!==n.clientWidth&&(this.rootElRef.current.offsetHeight&&n.onCoords(new Pl(new So(this.rootElRef.current,(e=this.slatElRefs.currentMap,n.slatMetas.map((function(t){return e[t.key]}))),!1,!0),this.props.dateProfile,t.options.slotDuration)))},t}(Uo);function Ol(e,t){var n,r=[];for(n=0;n<t;n+=1)r.push([]);if(e)for(n=0;n<e.length;n+=1)r[e[n].col].push(e[n]);return r}function Al(e,t){var n=[];if(e){for(a=0;a<t;a+=1)n[a]={affectedInstances:e.affectedInstances,isEvent:e.isEvent,segs:[]};for(var r=0,o=e.segs;r<o.length;r++){var i=o[r];n[i.col].segs.push(i)}}else for(var a=0;a<t;a+=1)n[a]=null;return n}var Ll=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.rootElRef=ko(),t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props;return _o(ms,{allDayDate:null,moreCnt:t.hiddenSegs.length,allSegs:t.hiddenSegs,hiddenSegs:t.hiddenSegs,alignmentElRef:this.rootElRef,defaultContent:Ul,extraDateSpan:t.extraDateSpan,dateProfile:t.dateProfile,todayRange:t.todayRange,popoverContent:function(){return Xl(t.hiddenSegs,t)}},(function(n,r,o,i,a,s,l,u){return _o("a",{ref:function(t){Fo(n,t),Fo(e.rootElRef,t)},className:["fc-timegrid-more-link"].concat(r).join(" "),style:{top:t.top,bottom:t.bottom},onClick:a,title:s,"aria-expanded":l,"aria-controls":u},_o("div",{ref:o,className:"fc-timegrid-more-link-inner fc-sticky"},i))}))},t}(Uo);function Ul(e){return e.shortText}function Wl(e,t,n){var o=new qi;null!=t&&(o.strictOrder=t),null!=n&&(o.maxStackCnt=n);var i,a,s,l=Xi(o.addSegs(e)),u=function(e){var t=e.entriesByLevel,n=zl((function(e,t){return e+":"+t}),(function(o,i){var a=Vl(function(e,t,n){for(var r=e.levelCoords,o=e.entriesByLevel,i=o[t][n],a=r[t]+i.thickness,s=r.length,l=t;l<s&&r[l]<a;l+=1);for(;l<s;l+=1){for(var u=o[l],c=void 0,d=Qi(u,i.span.start,Yi),p=d[0]+d[1],f=p;(c=u[f])&&c.span.start<i.span.end;)f+=1;if(p<f)return{level:l,lateralStart:p,lateralEnd:f}}return null}(e,o,i),n),s=t[o][i];return[r(r({},s),{nextLevelNodes:a[0]}),s.thickness+a[1]]}));return Vl(t.length?{level:0,lateralStart:0,lateralEnd:t[0].length}:null,n)[0]}(o);return i=u,a=1,s=zl((function(e,t,n){return Zi(e)}),(function(e,t,n){var o,i=e.nextLevelNodes,l=e.thickness,u=l+n,c=l/u,d=[];if(i.length)for(var p=0,f=i;p<f.length;p++){var h=f[p];if(void 0===o)o=(v=s(h,t,u))[0],d.push(v[1]);else{var v=s(h,o,0);d.push(v[1])}}else o=a;var g=(o-t)*c;return[o-g,r(r({},e),{thickness:g,nextLevelNodes:d})]})),{segRects:function(e){var t=[],n=zl((function(e,t,n){return Zi(e)}),(function(e,n,i){var a=r(r({},e),{levelCoord:n,stackDepth:i,stackForward:0});return t.push(a),a.stackForward=o(e.nextLevelNodes,n+e.thickness,i+1)+1}));function o(e,t,r){for(var o=0,i=0,a=e;i<a.length;i++){var s=a[i];o=Math.max(n(s,t,r),o)}return o}return o(e,0,0),t}(u=i.map((function(e){return s(e,0,0)[1]}))),hiddenGroups:l}}function Vl(e,t){if(!e)return[[],0];for(var n=e.level,r=e.lateralStart,o=e.lateralEnd,i=r,a=[];i<o;)a.push(t(n,i)),i+=1;return a.sort(Fl),[a.map(Bl),a[0][1]]}function Fl(e,t){return t[1]-e[1]}function Bl(e){return e[0]}function zl(e,t){var n={};return function(){for(var r=[],o=0;o<arguments.length;o++)r[o]=arguments[o];var i=e.apply(void 0,r);return i in n?n[i]:n[i]=t.apply(void 0,r)}}function jl(e,t,n,r){void 0===n&&(n=null),void 0===r&&(r=0);var o=[];if(n)for(var i=0;i<e.length;i+=1){var a=e[i],s=n.computeDateTop(a.start,t),l=Math.max(s+(r||0),n.computeDateTop(a.end,t));o.push({start:Math.round(s),end:Math.round(l)})}return o}var Gl=ln({hour:"numeric",minute:"2-digit",meridiem:!1}),ql=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=["fc-timegrid-event","fc-v-event"];return this.props.isShort&&e.push("fc-timegrid-event-short"),_o(rs,r({},this.props,{defaultTimeFormat:Gl,extraClassNames:e}))},t}(Uo),Yl=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props;return _o(ss,{date:e.date,dateProfile:e.dateProfile,todayRange:e.todayRange,extraHookProps:e.extraHookProps},(function(e,t){return t&&_o("div",{className:"fc-timegrid-col-misc",ref:e},t)}))},t}(Uo),Zl=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.sortEventSegs=qt(tr),t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.context,o=n.options.selectMirror,i=t.eventDrag&&t.eventDrag.segs||t.eventResize&&t.eventResize.segs||o&&t.dateSelectionSegs||[],a=t.eventDrag&&t.eventDrag.affectedInstances||t.eventResize&&t.eventResize.affectedInstances||{},s=this.sortEventSegs(t.fgEventSegs,n.options.eventOrder);return _o(us,{elRef:t.elRef,date:t.date,dateProfile:t.dateProfile,todayRange:t.todayRange,extraHookProps:t.extraHookProps},(function(n,l,u){return _o("td",r({ref:n,role:"gridcell",className:["fc-timegrid-col"].concat(l,t.extraClassNames||[]).join(" ")},u,t.extraDataAttrs),_o("div",{className:"fc-timegrid-col-frame"},_o("div",{className:"fc-timegrid-col-bg"},e.renderFillSegs(t.businessHourSegs,"non-business"),e.renderFillSegs(t.bgEventSegs,"bg-event"),e.renderFillSegs(t.dateSelectionSegs,"highlight")),_o("div",{className:"fc-timegrid-col-events"},e.renderFgSegs(s,a,!1,!1,!1)),_o("div",{className:"fc-timegrid-col-events"},e.renderFgSegs(i,{},Boolean(t.eventDrag),Boolean(t.eventResize),Boolean(o))),_o("div",{className:"fc-timegrid-now-indicator-container"},e.renderNowIndicator(t.nowIndicatorSegs)),_o(Yl,{date:t.date,dateProfile:t.dateProfile,todayRange:t.todayRange,extraHookProps:t.extraHookProps})))}))},t.prototype.renderFgSegs=function(e,t,n,r,o){var i=this.props;return i.forPrint?Xl(e,i):this.renderPositionedFgSegs(e,t,n,r,o)},t.prototype.renderPositionedFgSegs=function(e,t,n,o,i){var a=this,s=this.context.options,l=s.eventMaxStack,u=s.eventShortHeight,c=s.eventOrderStrict,d=s.eventMinHeight,p=this.props,f=p.date,h=p.slatCoords,v=p.eventSelection,g=p.todayRange,m=p.nowDate,y=n||o||i,E=function(e,t,n,r){for(var o=[],i=[],a=0;a<e.length;a+=1){var s=t[a];s?o.push({index:a,thickness:1,span:s}):i.push(e[a])}for(var l=Wl(o,n,r),u=l.segRects,c=l.hiddenGroups,d=[],p=0,f=u;p<f.length;p++){var h=f[p];d.push({seg:e[h.index],rect:h})}for(var v=0,g=i;v<g.length;v++){var m=g[v];d.push({seg:m,rect:null})}return{segPlacements:d,hiddenGroups:c}}(e,jl(e,f,h,d),c,l),S=E.segPlacements,b=E.hiddenGroups;return _o(xo,null,this.renderHiddenGroups(b,e),S.map((function(e){var s=e.seg,l=e.rect,c=s.eventRange.instance.instanceId,d=y||Boolean(!t[c]&&l),p=Kl(l&&l.span),f=!y&&l?a.computeSegHStyle(l):{left:0,right:0},h=Boolean(l)&&l.stackForward>0,E=Boolean(l)&&l.span.end-l.span.start<u;return _o("div",{className:"fc-timegrid-event-harness"+(h?" fc-timegrid-event-harness-inset":""),key:c,style:r(r({visibility:d?"":"hidden"},p),f)},_o(ql,r({seg:s,isDragging:n,isResizing:o,isDateSelecting:i,isSelected:c===v,isShort:E},sr(s,g,m))))})))},t.prototype.renderHiddenGroups=function(e,t){var n=this.props,r=n.extraDateSpan,o=n.dateProfile,i=n.todayRange,a=n.nowDate,s=n.eventSelection,l=n.eventDrag,u=n.eventResize;return _o(xo,null,e.map((function(e){var n,c,d=Kl(e.span),p=(n=e.entries,c=t,n.map((function(e){return c[e.index]})));return _o(Ll,{key:Ft(Ss(p)),hiddenSegs:p,top:d.top,bottom:d.bottom,extraDateSpan:r,dateProfile:o,todayRange:i,nowDate:a,eventSelection:s,eventDrag:l,eventResize:u})})))},t.prototype.renderFillSegs=function(e,t){var n=this.props,o=this.context,i=jl(e,n.date,n.slatCoords,o.options.eventMinHeight).map((function(o,i){var a=e[i];return _o("div",{key:ur(a.eventRange),className:"fc-timegrid-bg-harness",style:Kl(o)},"bg-event"===t?_o(ds,r({seg:a},sr(a,n.todayRange,n.nowDate))):cs(t))}));return _o(xo,null,i)},t.prototype.renderNowIndicator=function(e){var t=this.props,n=t.slatCoords,r=t.date;return n?e.map((function(e,t){return _o(is,{isAxis:!1,date:r,key:t},(function(t,o,i,a){return _o("div",{ref:t,className:["fc-timegrid-now-indicator-line"].concat(o).join(" "),style:{top:n.computeDateTop(e.start,r)}},a)}))})):null},t.prototype.computeSegHStyle=function(e){var t,n,r=this.context,o=r.isRtl,i=r.options.slotEventOverlap,a=e.levelCoord,s=e.levelCoord+e.thickness;i&&(s=Math.min(1,a+2*(s-a))),o?(t=1-s,n=a):(t=a,n=1-s);var l={zIndex:e.stackDepth+1,left:100*t+"%",right:100*n+"%"};return i&&!e.stackForward&&(l[o?"marginLeft":"marginRight"]=20),l},t}(Uo);function Xl(e,t){var n=t.todayRange,o=t.nowDate,i=t.eventSelection,a=t.eventDrag,s=t.eventResize,l=(a?a.affectedInstances:null)||(s?s.affectedInstances:null)||{};return _o(xo,null,e.map((function(e){var t=e.eventRange.instance.instanceId;return _o("div",{key:t,style:{visibility:l[t]?"hidden":""}},_o(ql,r({seg:e,isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:t===i,isShort:!1},sr(e,n,o))))})))}function Kl(e){return e?{top:e.start,bottom:-e.end}:{top:"",bottom:""}}var $l=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.splitFgEventSegs=qt(Ol),t.splitBgEventSegs=qt(Ol),t.splitBusinessHourSegs=qt(Ol),t.splitNowIndicatorSegs=qt(Ol),t.splitDateSelectionSegs=qt(Ol),t.splitEventDrag=qt(Al),t.splitEventResize=qt(Al),t.rootElRef=ko(),t.cellElRefs=new Fa,t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.context.options.nowIndicator&&t.slatCoords&&t.slatCoords.safeComputeTop(t.nowDate),r=t.cells.length,o=this.splitFgEventSegs(t.fgEventSegs,r),i=this.splitBgEventSegs(t.bgEventSegs,r),a=this.splitBusinessHourSegs(t.businessHourSegs,r),s=this.splitNowIndicatorSegs(t.nowIndicatorSegs,r),l=this.splitDateSelectionSegs(t.dateSelectionSegs,r),u=this.splitEventDrag(t.eventDrag,r),c=this.splitEventResize(t.eventResize,r);return _o("div",{className:"fc-timegrid-cols",ref:this.rootElRef},_o("table",{role:"presentation",style:{minWidth:t.tableMinWidth,width:t.clientWidth}},t.tableColGroupNode,_o("tbody",{role:"presentation"},_o("tr",{role:"row"},t.axis&&_o("td",{"aria-hidden":!0,className:"fc-timegrid-col fc-timegrid-axis"},_o("div",{className:"fc-timegrid-col-frame"},_o("div",{className:"fc-timegrid-now-indicator-container"},"number"==typeof n&&_o(is,{isAxis:!0,date:t.nowDate},(function(e,t,r,o){return _o("div",{ref:e,className:["fc-timegrid-now-indicator-arrow"].concat(t).join(" "),style:{top:n}},o)}))))),t.cells.map((function(n,r){return _o(Zl,{key:n.key,elRef:e.cellElRefs.createRef(n.key),dateProfile:t.dateProfile,date:n.date,nowDate:t.nowDate,todayRange:t.todayRange,extraHookProps:n.extraHookProps,extraDataAttrs:n.extraDataAttrs,extraClassNames:n.extraClassNames,extraDateSpan:n.extraDateSpan,fgEventSegs:o[r],bgEventSegs:i[r],businessHourSegs:a[r],nowIndicatorSegs:s[r],dateSelectionSegs:l[r],eventDrag:u[r],eventResize:c[r],slatCoords:t.slatCoords,eventSelection:t.eventSelection,forPrint:t.forPrint})}))))))},t.prototype.componentDidMount=function(){this.updateCoords()},t.prototype.componentDidUpdate=function(){this.updateCoords()},t.prototype.updateCoords=function(){var e,t=this.props;t.onColCoords&&null!==t.clientWidth&&t.onColCoords(new So(this.rootElRef.current,(e=this.cellElRefs.currentMap,t.cells.map((function(t){return e[t.key]}))),!0,!1))},t}(Uo);var Jl=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.processSlotOptions=qt(Ql),t.state={slatCoords:null},t.handleRootEl=function(e){e?t.context.registerInteractiveComponent(t,{el:e,isHitComboAllowed:t.props.isHitComboAllowed}):t.context.unregisterInteractiveComponent(t)},t.handleScrollRequest=function(e){var n=t.props.onScrollTopRequest,r=t.state.slatCoords;if(n&&r){if(e.time){var o=r.computeTimeTop(e.time);(o=Math.ceil(o))&&(o+=1),n(o)}return!0}return!1},t.handleColCoords=function(e){t.colCoords=e},t.handleSlatCoords=function(e){t.setState({slatCoords:e}),t.props.onSlatCoords&&t.props.onSlatCoords(e)},t}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.state;return _o("div",{className:"fc-timegrid-body",ref:this.handleRootEl,style:{width:e.clientWidth,minWidth:e.tableMinWidth}},_o(Hl,{axis:e.axis,dateProfile:e.dateProfile,slatMetas:e.slatMetas,clientWidth:e.clientWidth,minHeight:e.expandRows?e.clientHeight:"",tableMinWidth:e.tableMinWidth,tableColGroupNode:e.axis?e.tableColGroupNode:null,onCoords:this.handleSlatCoords}),_o($l,{cells:e.cells,axis:e.axis,dateProfile:e.dateProfile,businessHourSegs:e.businessHourSegs,bgEventSegs:e.bgEventSegs,fgEventSegs:e.fgEventSegs,dateSelectionSegs:e.dateSelectionSegs,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize,todayRange:e.todayRange,nowDate:e.nowDate,nowIndicatorSegs:e.nowIndicatorSegs,clientWidth:e.clientWidth,tableMinWidth:e.tableMinWidth,tableColGroupNode:e.tableColGroupNode,slatCoords:t.slatCoords,onColCoords:this.handleColCoords,forPrint:e.forPrint}))},t.prototype.componentDidMount=function(){this.scrollResponder=this.context.createScrollResponder(this.handleScrollRequest)},t.prototype.componentDidUpdate=function(e){this.scrollResponder.update(e.dateProfile!==this.props.dateProfile)},t.prototype.componentWillUnmount=function(){this.scrollResponder.detach()},t.prototype.queryHit=function(e,t){var n=this.context,o=n.dateEnv,i=n.options,a=this.colCoords,s=this.props.dateProfile,l=this.state.slatCoords,u=this.processSlotOptions(this.props.slotDuration,i.snapDuration),c=u.snapDuration,d=u.snapsPerSlot,p=a.leftToIndex(e),f=l.positions.topToIndex(t);if(null!=p&&null!=f){var h=this.props.cells[p],v=l.positions.tops[f],g=l.positions.getHeight(f),m=(t-v)/g,y=f*d+Math.floor(m*d),E=this.props.cells[p].date,S=Ot(s.slotMinTime,At(c,y)),b=o.add(E,S),D=o.add(b,c);return{dateProfile:s,dateSpan:r({range:{start:b,end:D},allDay:!1},h.extraDateSpan),dayEl:a.els[p],rect:{left:a.lefts[p],right:a.rights[p],top:v,bottom:v+g},layer:0}}return null},t}(Bo);function Ql(e,t){var n=t||e,r=Wt(e,n);return null===r&&(n=e,r=1),{snapDuration:n,snapsPerSlot:r}}var eu=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.sliceRange=function(e,t){for(var n=[],r=0;r<t.length;r+=1){var o=jn(e,t[r]);o&&n.push({start:o.start,end:o.end,isStart:o.start.valueOf()===e.start.valueOf(),isEnd:o.end.valueOf()===e.end.valueOf(),col:r})}return n},t}(xa),tu=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.buildDayRanges=qt(nu),t.slicer=new eu,t.timeColsRef=ko(),t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.context,o=t.dateProfile,i=t.dayTableModel,a=n.options.nowIndicator,s=this.buildDayRanges(i,o,n.dateEnv);return _o(Ca,{unit:a?"minute":"day"},(function(l,u){return _o(Jl,r({ref:e.timeColsRef},e.slicer.sliceProps(t,o,null,n,s),{forPrint:t.forPrint,axis:t.axis,dateProfile:o,slatMetas:t.slatMetas,slotDuration:t.slotDuration,cells:i.cells[0],tableColGroupNode:t.tableColGroupNode,tableMinWidth:t.tableMinWidth,clientWidth:t.clientWidth,clientHeight:t.clientHeight,expandRows:t.expandRows,nowDate:l,nowIndicatorSegs:a&&e.slicer.sliceNowDate(l,n,s),todayRange:u,onScrollTopRequest:t.onScrollTopRequest,onSlatCoords:t.onSlatCoords}))}))},t}(Bo);function nu(e,t,n){for(var r=[],o=0,i=e.headerDates;o<i.length;o++){var a=i[o];r.push({start:n.add(a,t.slotMinTime),end:n.add(a,t.slotMaxTime)})}return r}var ru=[{hours:1},{minutes:30},{minutes:15},{seconds:30},{seconds:15}];function ou(e,t,n,r,o){for(var i=new Date(0),a=e,s=Nt(0),l=n||function(e){var t,n,r;for(t=ru.length-1;t>=0;t-=1)if(null!==(r=Wt(n=Nt(ru[t]),e))&&r>1)return n;return e}(r),u=[];Ut(a)<Ut(t);){var c=o.add(i,a),d=null!==Wt(s,l);u.push({date:c,time:a,key:c.toISOString(),isoTimeStr:zt(c),isLabeled:d}),a=Ot(a,r),s=Ot(s,r)}return u}var iu=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.buildTimeColsModel=qt(au),t.buildSlatMetas=qt(ou),t}return n(t,e),t.prototype.render=function(){var e=this,t=this.context,n=t.options,o=t.dateEnv,i=t.dateProfileGenerator,a=this.props,s=a.dateProfile,l=this.buildTimeColsModel(s,i),u=this.allDaySplitter.splitProps(a),c=this.buildSlatMetas(s.slotMinTime,s.slotMaxTime,n.slotLabelInterval,n.slotDuration,o),d=n.dayMinWidth,p=!d,f=d,h=n.dayHeaders&&_o(Ra,{dates:l.headerDates,dateProfile:s,datesRepDistinctDays:!0,renderIntro:p?this.renderHeadAxis:null}),v=!1!==n.allDaySlot&&function(t){return _o(Sl,r({},u.allDay,{dateProfile:s,dayTableModel:l,nextDayThreshold:n.nextDayThreshold,tableMinWidth:t.tableMinWidth,colGroupNode:t.tableColGroupNode,renderRowIntro:p?e.renderTableRowAxis:null,showWeekNumbers:!1,expandRows:!1,headerAlignElRef:e.headerElRef,clientWidth:t.clientWidth,clientHeight:t.clientHeight,forPrint:a.forPrint},e.getAllDayMaxEventProps()))},g=function(t){return _o(tu,r({},u.timed,{dayTableModel:l,dateProfile:s,axis:p,slotDuration:n.slotDuration,slatMetas:c,forPrint:a.forPrint,tableColGroupNode:t.tableColGroupNode,tableMinWidth:t.tableMinWidth,clientWidth:t.clientWidth,clientHeight:t.clientHeight,onSlatCoords:e.handleSlatCoords,expandRows:t.expandRows,onScrollTopRequest:e.handleScrollTopRequest}))};return f?this.renderHScrollLayout(h,v,g,l.colCnt,d,c,this.state.slatCoords):this.renderSimpleLayout(h,v,g)},t}(Ml);function au(e,t){var n=new Ta(e.renderRange,t);return new ka(n,!1)}var su=zo({initialView:"timeGridWeek",optionRefiners:{allDaySlot:Boolean},views:{timeGrid:{component:iu,usesMinMaxTime:!0,allDaySlot:!0,slotDuration:"00:30:00",slotEventOverlap:!0},timeGridDay:{type:"timeGrid",duration:{days:1}},timeGridWeek:{type:"timeGrid",duration:{weeks:1}}}}),lu=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.state={textId:xe()},t}return n(t,e),t.prototype.render=function(){var e=this.context,t=e.theme,n=e.dateEnv,o=e.options,i=e.viewApi,a=this.props,s=a.cellId,l=a.dayDate,u=a.todayRange,c=this.state.textId,d=ro(l,u),p=o.listDayFormat?n.format(l,o.listDayFormat):"",f=o.listDaySideFormat?n.format(l,o.listDaySideFormat):"",h=r({date:n.toDate(l),view:i,textId:c,text:p,sideText:f,navLinkAttrs:so(this.context,l),sideNavLinkAttrs:so(this.context,l,"day",!1)},d),v=["fc-list-day"].concat(oo(d,t));return _o(Yo,{hookProps:h,classNames:o.dayHeaderClassNames,content:o.dayHeaderContent,defaultContent:uu,didMount:o.dayHeaderDidMount,willUnmount:o.dayHeaderWillUnmount},(function(e,n,r,o){return _o("tr",{ref:e,className:v.concat(n).join(" "),"data-date":Bt(l)},_o("th",{scope:"colgroup",colSpan:3,id:s,"aria-labelledby":c},_o("div",{className:"fc-list-day-cushion "+t.getClass("tableCellShaded"),ref:r},o)))}))},t}(Uo);function uu(e){return _o(xo,null,e.text&&_o("a",r({id:e.textId,className:"fc-list-day-text"},e.navLinkAttrs),e.text),e.sideText&&_o("a",r({"aria-hidden":!0,className:"fc-list-day-side-text"},e.sideNavLinkAttrs),e.sideText))}var cu=ln({hour:"numeric",minute:"2-digit",meridiem:"short"}),du=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context,n=e.seg,o=e.timeHeaderId,i=e.eventHeaderId,a=e.dateHeaderId,s=t.options.eventTimeFormat||cu;return _o(ns,{seg:n,timeText:"",disableDragging:!0,disableResizing:!0,defaultContent:function(){return function(e,t){var n=cr(e,t);return _o("a",r({},n),e.eventRange.def.title)}(n,t)},isPast:e.isPast,isFuture:e.isFuture,isToday:e.isToday,isSelected:e.isSelected,isDragging:e.isDragging,isResizing:e.isResizing,isDateSelecting:e.isDateSelecting},(function(e,r,l,u,c){return _o("tr",{className:["fc-list-event",c.event.url?"fc-event-forced-url":""].concat(r).join(" "),ref:e},function(e,t,n,r,o){var i=n.options;if(!1!==i.displayEventTime){var a=e.eventRange.def,s=e.eventRange.instance,l=!1,u=void 0;if(a.allDay?l=!0:Vn(e.eventRange.range)?e.isStart?u=ar(e,t,n,null,null,s.range.start,e.end):e.isEnd?u=ar(e,t,n,null,null,e.start,s.range.end):l=!0:u=ar(e,t,n),l){var c={text:n.options.allDayText,view:n.viewApi};return _o(Yo,{hookProps:c,classNames:i.allDayClassNames,content:i.allDayContent,defaultContent:pu,didMount:i.allDayDidMount,willUnmount:i.allDayWillUnmount},(function(e,t,n,i){return _o("td",{ref:e,headers:r+" "+o,className:["fc-list-event-time"].concat(t).join(" ")},i)}))}return _o("td",{className:"fc-list-event-time"},u)}return null}(n,s,t,o,a),_o("td",{"aria-hidden":!0,className:"fc-list-event-graphic"},_o("span",{className:"fc-list-event-dot",style:{borderColor:c.borderColor||c.backgroundColor}})),_o("td",{ref:l,headers:i+" "+a,className:"fc-list-event-title"},u))}))},t}(Uo);function pu(e){return e.text}var fu=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.computeDateVars=qt(vu),t.eventStoreToSegs=qt(t._eventStoreToSegs),t.state={timeHeaderId:xe(),eventHeaderId:xe(),dateHeaderIdRoot:xe()},t.setRootEl=function(e){e?t.context.registerInteractiveComponent(t,{el:e}):t.context.unregisterInteractiveComponent(t)},t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.context,r=["fc-list",n.theme.getClass("table"),!1!==n.options.stickyHeaderDates?"fc-list-sticky":""],o=this.computeDateVars(t.dateProfile),i=o.dayDates,a=o.dayRanges,s=this.eventStoreToSegs(t.eventStore,t.eventUiBases,a);return _o(ti,{viewSpec:n.viewSpec,elRef:this.setRootEl},(function(n,o){return _o("div",{ref:n,className:r.concat(o).join(" ")},_o(Va,{liquid:!t.isHeightAuto,overflowX:t.isHeightAuto?"visible":"hidden",overflowY:t.isHeightAuto?"visible":"auto"},s.length>0?e.renderSegList(s,i):e.renderEmptyMessage()))}))},t.prototype.renderEmptyMessage=function(){var e=this.context,t=e.options,n=e.viewApi,r={text:t.noEventsText,view:n};return _o(Yo,{hookProps:r,classNames:t.noEventsClassNames,content:t.noEventsContent,defaultContent:hu,didMount:t.noEventsDidMount,willUnmount:t.noEventsWillUnmount},(function(e,t,n,r){return _o("div",{className:["fc-list-empty"].concat(t).join(" "),ref:e},_o("div",{className:"fc-list-empty-cushion",ref:n},r))}))},t.prototype.renderSegList=function(e,t){var n=this.context,o=n.theme,i=n.options,a=this.state,s=a.timeHeaderId,l=a.eventHeaderId,u=a.dateHeaderIdRoot,c=function(e){var t,n,r=[];for(t=0;t<e.length;t+=1)(r[(n=e[t]).dayIndex]||(r[n.dayIndex]=[])).push(n);return r}(e);return _o(Ca,{unit:"day"},(function(e,n){for(var a=[],d=0;d<c.length;d+=1){var p=c[d];if(p){var f=Bt(t[d]),h=u+"-"+f;a.push(_o(lu,{key:f,cellId:h,dayDate:t[d],todayRange:n}));for(var v=0,g=p=tr(p,i.eventOrder);v<g.length;v++){var m=g[v];a.push(_o(du,r({key:f+":"+m.eventRange.instance.instanceId,seg:m,isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:!1,timeHeaderId:s,eventHeaderId:l,dateHeaderId:h},sr(m,n,e))))}}}return _o("table",{className:"fc-list-table "+o.getClass("table")},_o("thead",null,_o("tr",null,_o("th",{scope:"col",id:s},i.timeHint),_o("th",{scope:"col","aria-hidden":!0}),_o("th",{scope:"col",id:l},i.eventHint))),_o("tbody",null,a))}))},t.prototype._eventStoreToSegs=function(e,t,n){return this.eventRangesToSegs(Xn(e,t,this.props.dateProfile.activeRange,this.context.options.nextDayThreshold).fg,n)},t.prototype.eventRangesToSegs=function(e,t){for(var n=[],r=0,o=e;r<o.length;r++){var i=o[r];n.push.apply(n,this.eventRangeToSegs(i,t))}return n},t.prototype.eventRangeToSegs=function(e,t){var n,r,o,i=this.context.dateEnv,a=this.context.options.nextDayThreshold,s=e.range,l=e.def.allDay,u=[];for(n=0;n<t.length;n+=1)if((r=jn(s,t[n]))&&(o={component:this,eventRange:e,start:r.start,end:r.end,isStart:e.isStart&&r.start.valueOf()===s.start.valueOf(),isEnd:e.isEnd&&r.end.valueOf()===s.end.valueOf(),dayIndex:n},u.push(o),!o.isEnd&&!l&&n+1<t.length&&s.end<i.add(t[n+1].start,a))){o.end=s.end,o.isEnd=!0;break}return u},t}(Bo);function hu(e){return e.text}function vu(e){for(var t=lt(e.renderRange.start),n=e.renderRange.end,r=[],o=[];t<n;)r.push(t),o.push({start:t,end:tt(t,1)}),t=tt(t,1);return{dayDates:r,dayRanges:o}}function gu(e){return!1===e?null:ln(e)}var mu=zo({optionRefiners:{listDayFormat:gu,listDaySideFormat:gu,noEventsClassNames:yn,noEventsContent:yn,noEventsDidMount:yn,noEventsWillUnmount:yn},views:{list:{component:fu,buttonTextKey:"list",listDayFormat:{month:"long",day:"numeric",year:"numeric"}},listDay:{type:"list",duration:{days:1},listDayFormat:{weekday:"long"}},listWeek:{type:"list",duration:{weeks:1},listDayFormat:{weekday:"long"},listDaySideFormat:{month:"long",day:"numeric",year:"numeric"}},listMonth:{type:"list",duration:{month:1},listDaySideFormat:{weekday:"long"}},listYear:{type:"list",duration:{year:1},listDaySideFormat:{weekday:"long"}}}}),yu=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t}(wo);yu.prototype.classes={root:"fc-theme-bootstrap",table:"table-bordered",tableCellShaded:"table-active",buttonGroup:"btn-group",button:"btn btn-primary",buttonActive:"active",popover:"popover",popoverHeader:"popover-header",popoverContent:"popover-body"},yu.prototype.baseIconClass="fa",yu.prototype.iconClasses={close:"fa-times",prev:"fa-chevron-left",next:"fa-chevron-right",prevYear:"fa-angle-double-left",nextYear:"fa-angle-double-right"},yu.prototype.rtlIconClasses={prev:"fa-chevron-right",next:"fa-chevron-left",prevYear:"fa-angle-double-right",nextYear:"fa-angle-double-left"},yu.prototype.iconOverrideOption="bootstrapFontAwesome",yu.prototype.iconOverrideCustomButtonOption="bootstrapFontAwesome",yu.prototype.iconOverridePrefix="fa-";var Eu=zo({themeClasses:{bootstrap:yu}}),Su="https://www.googleapis.com/calendar/v3/calendars";var bu=zo({eventSourceDefs:[{parseMeta:function(e){var t=e.googleCalendarId;return!t&&e.url&&(t=function(e){var t;if(/^[^/]+@([^/.]+\.)*(google|googlemail|gmail)\.com$/.test(e))return e;if((t=/^https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/([^/]*)/.exec(e))||(t=/^https?:\/\/www.google.com\/calendar\/feeds\/([^/]*)/.exec(e)))return decodeURIComponent(t[1]);return null}(e.url)),t?{googleCalendarId:t,googleCalendarApiKey:e.googleCalendarApiKey,googleCalendarApiBase:e.googleCalendarApiBase,extraParams:e.extraParams}:null},fetch:function(e,t,n){var o=e.context,i=o.dateEnv,a=o.options,s=e.eventSource.meta,l=s.googleCalendarApiKey||a.googleCalendarApiKey;if(l){var u=function(e){var t=e.googleCalendarApiBase;t||(t=Su);return t+"/"+encodeURIComponent(e.googleCalendarId)+"/events"}(s),c=s.extraParams,d="function"==typeof c?c():c,p=function(e,t,n,o){var i,a,s;o.canComputeOffset?(a=o.formatIso(e.start),s=o.formatIso(e.end)):(a=tt(e.start,-1).toISOString(),s=tt(e.end,1).toISOString());i=r(r({},n||{}),{key:t,timeMin:a,timeMax:s,singleEvents:!0,maxResults:9999}),"local"!==o.timeZone&&(i.timeZone=o.timeZone);return i}(e.range,l,d,i);_i("GET",u,p,(function(e,r){var o,i;e.error?n({message:"Google Calendar API: "+e.error.message,errors:e.error.errors,xhr:r}):t({rawEvents:(o=e.items,i=p.timeZone,o.map((function(e){return function(e,t){var n=e.htmlLink||null;n&&t&&(n=function(e,t){return e.replace(/(\?.*?)?(#|$)/,(function(e,n,r){return(n?n+"&":"?")+t+r}))}(n,"ctz="+t));return{id:e.id,title:e.summary,start:e.start.dateTime||e.start.date,end:e.end.dateTime||e.end.date,url:n,location:e.location,description:e.description,attachments:e.attachments||[],extendedProps:(e.extendedProperties||{}).shared||{}}}(e,i)}))),xhr:r})}),(function(e,t){n({message:e,xhr:t})}))}else n({message:"Specify a googleCalendarApiKey. See http://fullcalendar.io/docs/google_calendar/"})}}],optionRefiners:{googleCalendarApiKey:String},eventSourceRefiners:{googleCalendarApiKey:String,googleCalendarId:String,googleCalendarApiBase:String,extraParams:yn}});return xi.push($s,Cl,su,mu,Eu,bu),e.BASE_OPTION_DEFAULTS=cn,e.BASE_OPTION_REFINERS=un,e.BaseComponent=Uo,e.BgEvent=ds,e.BootstrapTheme=yu,e.Calendar=Cs,e.CalendarApi=kr,e.CalendarContent=fa,e.CalendarDataManager=Ni,e.CalendarDataProvider=ji,e.CalendarRoot=ga,e.Component=Ro,e.ContentHook=Xo,e.CustomContentRenderContext=Zo,e.DateComponent=Bo,e.DateEnv=Lr,e.DateProfileGenerator=ai,e.DayCellContent=ss,e.DayCellRoot=us,e.DayGridView=bl,e.DayHeader=Ra,e.DaySeriesModel=Ta,e.DayTable=Sl,e.DayTableModel=ka,e.DayTableSlicer=El,e.DayTimeCols=tu,e.DayTimeColsSlicer=eu,e.DayTimeColsView=iu,e.DelayedRunner=Mi,e.Draggable=Zs,e.ElementDragging=oa,e.ElementScrollController=Do,e.Emitter=Eo,e.EventApi=xr,e.EventRoot=ns,e.EventSourceApi=ye,e.FeaturefulElementDragging=Os,e.Fragment=xo,e.Interaction=ea,e.ListView=fu,e.MoreLinkRoot=ms,e.MountHook=$o,e.NamedTimeZoneImpl=Gi,e.NowIndicatorRoot=is,e.NowTimer=Ca,e.PointerDragging=Ts,e.PositionCache=So,e.RefMap=Fa,e.RenderHook=Yo,e.ScrollController=bo,e.ScrollResponder=Ho,e.Scroller=Va,e.SegHierarchy=qi,e.SimpleScrollGrid=ts,e.Slicer=xa,e.Splitter=to,e.StandardEvent=rs,e.Table=ml,e.TableDateCell=Sa,e.TableDowCell=Da,e.TableView=Js,e.Theme=wo,e.ThirdPartyDraggable=Ks,e.TimeCols=Jl,e.TimeColsSlatsCoords=Pl,e.TimeColsView=Ml,e.ViewApi=Cr,e.ViewContextType=Oo,e.ViewRoot=ti,e.WeekNumberRoot=fs,e.WindowScrollController=Co,e.addDays=tt,e.addDurations=Ot,e.addMs=nt,e.addWeeks=et,e.allowContextMenu=ze,e.allowSelection=Fe,e.applyMutationToEventStore=Sr,e.applyStyle=we,e.applyStyleProp=Re,e.asCleanDays=function(e){return e.years||e.months||e.milliseconds?0:e.days},e.asRoughMinutes=function(e){return Ut(e)/6e4},e.asRoughMs=Ut,e.asRoughSeconds=function(e){return Ut(e)/1e3},e.binarySearch=Qi,e.buildClassNameNormalizer=Jo,e.buildDayRanges=nu,e.buildDayTableModel=Dl,e.buildEntryKey=Zi,e.buildEventApis=Ir,e.buildEventRangeKey=ur,e.buildHashFromArray=function(e,t){for(var n={},r=0;r<e.length;r+=1){var o=t(e[r],r);n[o[0]]=o[1]}return n},e.buildIsoString=Ft,e.buildNavLinkAttrs=so,e.buildSegCompareObj=nr,e.buildSegTimeText=ar,e.buildSlatMetas=ou,e.buildTimeColsModel=au,e.collectFromHash=kt,e.combineEventUis=xn,e.compareByFieldSpec=qe,e.compareByFieldSpecs=Ge,e.compareNumbers=Ke,e.compareObjs=_t,e.computeEarliestSegStart=Ss,e.computeEdges=ho,e.computeFallbackHeaderFormat=ma,e.computeHeightAndMargins=function(e){return e.getBoundingClientRect().height+function(e){var t=window.getComputedStyle(e);return parseInt(t.marginTop,10)+parseInt(t.marginBottom,10)}(e)},e.computeInnerRect=vo,e.computeRect=go,e.computeSegDraggable=rr,e.computeSegEndResizable=ir,e.computeSegStartResizable=or,e.computeShrinkWidth=Ba,e.computeSmallestCellWidth=Je,e.computeVisibleDayRange=Wn,e.config=ia,e.constrainPoint=Kr,e.createAriaClickAttrs=He,e.createContext=Mo,e.createDuration=Nt,e.createElement=_o,e.createEmptyEventStore=Dn,e.createEventInstance=mt,e.createEventUi=kn,e.createFormatter=ln,e.createPlugin=zo,e.createPortal=Io,e.createRef=ko,e.diffDates=Fn,e.diffDayAndTime=it,e.diffDays=ot,e.diffPoints=Jr,e.diffWeeks=rt,e.diffWholeDays=st,e.diffWholeWeeks=at,e.disableCursor=Ue,e.elementClosest=Se,e.elementMatches=be,e.enableCursor=We,e.eventTupleToStore=Sn,e.filterEventStoreDefs=wn,e.filterHash=St,e.findDirectChildren=function(e,t){for(var n=e instanceof HTMLElement?[e]:e,r=[],o=0;o<n.length;o+=1)for(var i=n[o].children,a=0;a<i.length;a+=1){var s=i[a];t&&!be(s,t)||r.push(s)}return r},e.findElements=De,e.flexibleCompare=Ye,e.flushToDom=Po,e.formatDate=function(e,t){void 0===t&&(t={});var n=jr(t),r=ln(t),o=n.createMarkerMeta(e);return o?n.format(o.marker,r,{forcedTzo:o.forcedTzo}):""},e.formatDayString=Bt,e.formatIsoTimeString=zt,e.formatRange=function(e,t,n){var r=jr("object"==typeof n&&n?n:{}),o=ln(n),i=r.createMarkerMeta(e),a=r.createMarkerMeta(t);return i&&a?r.formatRange(i.marker,a.marker,o,{forcedStartTzo:i.forcedTzo,forcedEndTzo:a.forcedTzo,isEndExclusive:n.isEndExclusive,defaultSeparator:cn.defaultRangeSeparator}):""},e.getAllowYScrolling=ja,e.getCanVGrowWithinCell=Qr,e.getClippingParents=mo,e.getDateMeta=ro,e.getDayClassNames=oo,e.getDefaultEventEnd=Er,e.getElRoot=Te,e.getElSeg=Jn,e.getEntrySpanEnd=Yi,e.getEventClassNames=lr,e.getEventTargetViaRoot=_e,e.getIsRtlScrollbarOnLeft=co,e.getRectCenter=$r,e.getRelevantEvents=bn,e.getScrollGridClassNames=Ka,e.getScrollbarWidths=po,e.getSectionClassNames=$a,e.getSectionHasLiquidHeight=za,e.getSegAnchorAttrs=cr,e.getSegMeta=sr,e.getSlotClassNames=function(e,t){var n=["fc-slot","fc-slot-"+Qe[e.dow]];return e.isDisabled?n.push("fc-slot-disabled"):(e.isToday&&(n.push("fc-slot-today"),n.push(t.getClass("today"))),e.isPast&&n.push("fc-slot-past"),e.isFuture&&n.push("fc-slot-future")),n},e.getStickyFooterScrollbar=es,e.getStickyHeaderDates=Qa,e.getUnequalProps=Rt,e.getUniqueDomId=xe,e.globalLocales=Ur,e.globalPlugins=xi,e.greatestDurationDenominator=Vt,e.groupIntersectingEntries=Xi,e.guid=Le,e.hasBgRendering=Kn,e.hasShrinkWidth=Xa,e.identity=yn,e.interactionSettingsStore=ra,e.interactionSettingsToStore=na,e.intersectRanges=jn,e.intersectRects=Xr,e.intersectSpans=$i,e.isArraysEqual=Gt,e.isColPropsEqual=qa,e.isDateSelectionValid=Pa,e.isDateSpansEqual=fr,e.isInt=$e,e.isInteractionValid=Ia,e.isMultiDayRange=Vn,e.isPropsEqual=wt,e.isPropsValid=Ha,e.isValidDate=vt,e.joinSpans=Ki,e.listenBySelector=Ie,e.mapHash=bt,e.memoize=qt,e.memoizeArraylike=function(e,t,n){var r=this,o=[],i=[];return function(a){for(var s=o.length,l=a.length,u=0;u<s;u+=1)if(a[u]){if(!Gt(o[u],a[u])){n&&n(i[u]);var c=e.apply(r,a[u]);t&&t(c,i[u])||(i[u]=c)}}else n&&n(i[u]);for(;u<l;u+=1)i[u]=e.apply(r,a[u]);return o=a,i.splice(l),i}},e.memoizeHashlike=function(e,t,n){var r=this,o={},i={};return function(a){var s={};for(var l in a)if(i[l])if(Gt(o[l],a[l]))s[l]=i[l];else{n&&n(i[l]);var u=e.apply(r,a[l]);s[l]=t&&t(u,i[l])?i[l]:u}else s[l]=e.apply(r,a[l]);return o=a,i=s,s}},e.memoizeObjArg=Yt,e.mergeEventStores=Cn,e.multiplyDuration=At,e.padStart=Ze,e.parseBusinessHours=Yr,e.parseClassNames=Rn,e.parseDragMeta=sa,e.parseEventDef=Ln,e.parseFieldSpecs=je,e.parseMarker=Ar,e.pointInsideRect=Zr,e.preventContextMenu=Be,e.preventDefault=Me,e.preventSelection=Ve,e.rangeContainsMarker=Zn,e.rangeContainsRange=Yn,e.rangesEqual=Gn,e.rangesIntersect=qn,e.refineEventDef=On,e.refineProps=mn,e.removeElement=Ee,e.removeExact=function(e,t){for(var n=0,r=0;r<e.length;)e[r]===t?(e.splice(r,1),n+=1):r+=1;return n},e.render=To,e.renderChunkContent=Ga,e.renderFill=cs,e.renderMicroColGroup=Ya,e.renderScrollShim=Ja,e.requestJson=_i,e.sanitizeShrinkWidth=Za,e.setElSeg=$n,e.setRef=Fo,e.sliceEventStore=Xn,e.sliceEvents=function(e,t){return Xn(e.eventStore,e.eventUiBases,e.dateProfile.activeRange,t?e.nextDayThreshold:null).fg},e.sortEventSegs=tr,e.startOfDay=lt,e.translateRect=function(e,t,n){return{left:e.left+t,right:e.right+t,top:e.top+n,bottom:e.bottom+n}},e.triggerDateSelect=mr,e.unmountComponentAtNode=No,e.unpromisify=yo,e.version="5.10.1",e.whenTransitionDone=Ne,e.wholeDivideDurations=Wt,Object.defineProperty(e,"__esModule",{value:!0}),e}({});
\ No newline at end of file
diff --git a/public/static/assets/third_party/prism/prism.css b/public/static/assets/third_party/prism/prism.css
new file mode 100644
index 0000000000000000000000000000000000000000..efb0f15ff505964ec3d3f05535c32951b34621aa
--- /dev/null
+++ b/public/static/assets/third_party/prism/prism.css
@@ -0,0 +1,5 @@
+/* PrismJS 1.25.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+c+csharp+cpp+css-extras+java+markup-templating+php+plsql+powershell+python+sqf+sql+typescript&plugins=line-numbers+toolbar+copy-to-clipboard */
+code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:14px;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f6f6f6}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}
+pre[class*=language-].line-numbers{position:relative;padding-left:3.6em;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.6em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:.8em;text-align:right}
+div.code-toolbar{position:relative}div.code-toolbar>.toolbar{position:absolute;z-index:10;top:.3em;right:.2em;transition:opacity .3s ease-in-out;opacity:0}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar:focus-within>.toolbar{opacity:1}div.code-toolbar>.toolbar>.toolbar-item{display:inline-block}div.code-toolbar>.toolbar>.toolbar-item>a{cursor:pointer}div.code-toolbar>.toolbar>.toolbar-item>button{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}div.code-toolbar>.toolbar>.toolbar-item>a,div.code-toolbar>.toolbar>.toolbar-item>button,div.code-toolbar>.toolbar>.toolbar-item>span{color:#bbb;font-size:.8em;padding:.3em .8em;background:#666;border-radius:.2em; color:#fff; cursor:pointer;}div.code-toolbar>.toolbar>.toolbar-item>a:focus,div.code-toolbar>.toolbar>.toolbar-item>a:hover,div.code-toolbar>.toolbar>.toolbar-item>button:focus,div.code-toolbar>.toolbar>.toolbar-item>button:hover,div.code-toolbar>.toolbar>.toolbar-item>span:focus,div.code-toolbar>.toolbar>.toolbar-item>span:hover{color:#eee;text-decoration:none;}
diff --git a/public/static/assets/third_party/prism/prism.js b/public/static/assets/third_party/prism/prism.js
new file mode 100644
index 0000000000000000000000000000000000000000..63ab994b86ca3950a4673d99b404f95fb480bf4a
--- /dev/null
+++ b/public/static/assets/third_party/prism/prism.js
@@ -0,0 +1,23 @@
+/* PrismJS 1.25.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+c+csharp+cpp+css-extras+java+markup-templating+php+plsql+powershell+python+sqf+sql+typescript&plugins=line-numbers+toolbar+copy-to-clipboard */
+var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(u){var t=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,n=0,e={},M={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof W?new W(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++n}),e.__id},clone:function t(e,r){var a,n;switch(r=r||{},M.util.type(e)){case"Object":if(n=M.util.objId(e),r[n])return r[n];for(var i in a={},r[n]=a,e)e.hasOwnProperty(i)&&(a[i]=t(e[i],r));return a;case"Array":return n=M.util.objId(e),r[n]?r[n]:(a=[],r[n]=a,e.forEach(function(e,n){a[n]=t(e,r)}),a);default:return e}},getLanguage:function(e){for(;e;){var n=t.exec(e.className);if(n)return n[1].toLowerCase();e=e.parentElement}return"none"},setLanguage:function(e,n){e.className=e.className.replace(RegExp(t,"gi"),""),e.classList.add("language-"+n)},currentScript:function(){if("undefined"==typeof document)return null;if("currentScript"in document)return document.currentScript;try{throw new Error}catch(e){var n=(/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(e.stack)||[])[1];if(n){var t=document.getElementsByTagName("script");for(var r in t)if(t[r].src==n)return t[r]}return null}},isActive:function(e,n,t){for(var r="no-"+n;e;){var a=e.classList;if(a.contains(n))return!0;if(a.contains(r))return!1;e=e.parentElement}return!!t}},languages:{plain:e,plaintext:e,text:e,txt:e,extend:function(e,n){var t=M.util.clone(M.languages[e]);for(var r in n)t[r]=n[r];return t},insertBefore:function(t,e,n,r){var a=(r=r||M.languages)[t],i={};for(var l in a)if(a.hasOwnProperty(l)){if(l==e)for(var o in n)n.hasOwnProperty(o)&&(i[o]=n[o]);n.hasOwnProperty(l)||(i[l]=a[l])}var s=r[t];return r[t]=i,M.languages.DFS(M.languages,function(e,n){n===s&&e!=t&&(this[e]=i)}),i},DFS:function e(n,t,r,a){a=a||{};var i=M.util.objId;for(var l in n)if(n.hasOwnProperty(l)){t.call(n,l,n[l],r||l);var o=n[l],s=M.util.type(o);"Object"!==s||a[i(o)]?"Array"!==s||a[i(o)]||(a[i(o)]=!0,e(o,t,l,a)):(a[i(o)]=!0,e(o,t,null,a))}}},plugins:{},highlightAll:function(e,n){M.highlightAllUnder(document,e,n)},highlightAllUnder:function(e,n,t){var r={callback:t,container:e,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};M.hooks.run("before-highlightall",r),r.elements=Array.prototype.slice.apply(r.container.querySelectorAll(r.selector)),M.hooks.run("before-all-elements-highlight",r);for(var a,i=0;a=r.elements[i++];)M.highlightElement(a,!0===n,r.callback)},highlightElement:function(e,n,t){var r=M.util.getLanguage(e),a=M.languages[r];M.util.setLanguage(e,r);var i=e.parentElement;i&&"pre"===i.nodeName.toLowerCase()&&M.util.setLanguage(i,r);var l={element:e,language:r,grammar:a,code:e.textContent};function o(e){l.highlightedCode=e,M.hooks.run("before-insert",l),l.element.innerHTML=l.highlightedCode,M.hooks.run("after-highlight",l),M.hooks.run("complete",l),t&&t.call(l.element)}if(M.hooks.run("before-sanity-check",l),(i=l.element.parentElement)&&"pre"===i.nodeName.toLowerCase()&&!i.hasAttribute("tabindex")&&i.setAttribute("tabindex","0"),!l.code)return M.hooks.run("complete",l),void(t&&t.call(l.element));if(M.hooks.run("before-highlight",l),l.grammar)if(n&&u.Worker){var s=new Worker(M.filename);s.onmessage=function(e){o(e.data)},s.postMessage(JSON.stringify({language:l.language,code:l.code,immediateClose:!0}))}else o(M.highlight(l.code,l.grammar,l.language));else o(M.util.encode(l.code))},highlight:function(e,n,t){var r={code:e,grammar:n,language:t};return M.hooks.run("before-tokenize",r),r.tokens=M.tokenize(r.code,r.grammar),M.hooks.run("after-tokenize",r),W.stringify(M.util.encode(r.tokens),r.language)},tokenize:function(e,n){var t=n.rest;if(t){for(var r in t)n[r]=t[r];delete n.rest}var a=new i;return I(a,a.head,e),function e(n,t,r,a,i,l){for(var o in r)if(r.hasOwnProperty(o)&&r[o]){var s=r[o];s=Array.isArray(s)?s:[s];for(var u=0;u<s.length;++u){if(l&&l.cause==o+","+u)return;var c=s[u],g=c.inside,f=!!c.lookbehind,h=!!c.greedy,d=c.alias;if(h&&!c.pattern.global){var v=c.pattern.toString().match(/[imsuy]*$/)[0];c.pattern=RegExp(c.pattern.source,v+"g")}for(var p=c.pattern||c,m=a.next,y=i;m!==t.tail&&!(l&&y>=l.reach);y+=m.value.length,m=m.next){var k=m.value;if(t.length>n.length)return;if(!(k instanceof W)){var x,b=1;if(h){if(!(x=z(p,y,n,f))||x.index>=n.length)break;var w=x.index,A=x.index+x[0].length,P=y;for(P+=m.value.length;P<=w;)m=m.next,P+=m.value.length;if(P-=m.value.length,y=P,m.value instanceof W)continue;for(var E=m;E!==t.tail&&(P<A||"string"==typeof E.value);E=E.next)b++,P+=E.value.length;b--,k=n.slice(y,P),x.index-=y}else if(!(x=z(p,0,k,f)))continue;var w=x.index,L=x[0],S=k.slice(0,w),O=k.slice(w+L.length),j=y+k.length;l&&j>l.reach&&(l.reach=j);var C=m.prev;S&&(C=I(t,C,S),y+=S.length),q(t,C,b);var N=new W(o,g?M.tokenize(L,g):L,d,L);if(m=I(t,C,N),O&&I(t,m,O),1<b){var _={cause:o+","+u,reach:j};e(n,t,r,m.prev,y,_),l&&_.reach>l.reach&&(l.reach=_.reach)}}}}}}(e,a,n,a.head,0),function(e){var n=[],t=e.head.next;for(;t!==e.tail;)n.push(t.value),t=t.next;return n}(a)},hooks:{all:{},add:function(e,n){var t=M.hooks.all;t[e]=t[e]||[],t[e].push(n)},run:function(e,n){var t=M.hooks.all[e];if(t&&t.length)for(var r,a=0;r=t[a++];)r(n)}},Token:W};function W(e,n,t,r){this.type=e,this.content=n,this.alias=t,this.length=0|(r||"").length}function z(e,n,t,r){e.lastIndex=n;var a=e.exec(t);if(a&&r&&a[1]){var i=a[1].length;a.index+=i,a[0]=a[0].slice(i)}return a}function i(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function I(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function q(e,n,t){for(var r=n.next,a=0;a<t&&r!==e.tail;a++)r=r.next;(n.next=r).prev=n,e.length-=a}if(u.Prism=M,W.stringify=function n(e,t){if("string"==typeof e)return e;if(Array.isArray(e)){var r="";return e.forEach(function(e){r+=n(e,t)}),r}var a={type:e.type,content:n(e.content,t),tag:"span",classes:["token",e.type],attributes:{},language:t},i=e.alias;i&&(Array.isArray(i)?Array.prototype.push.apply(a.classes,i):a.classes.push(i)),M.hooks.run("wrap",a);var l="";for(var o in a.attributes)l+=" "+o+'="'+(a.attributes[o]||"").replace(/"/g,"&quot;")+'"';return"<"+a.tag+' class="'+a.classes.join(" ")+'"'+l+">"+a.content+"</"+a.tag+">"},!u.document)return u.addEventListener&&(M.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,r=n.code,a=n.immediateClose;u.postMessage(M.highlight(r,M.languages[t],t)),a&&u.close()},!1)),M;var r=M.util.currentScript();function a(){M.manual||M.highlightAll()}if(r&&(M.filename=r.src,r.hasAttribute("data-manual")&&(M.manual=!0)),!M.manual){var l=document.readyState;"loading"===l||"interactive"===l&&r&&r.defer?document.addEventListener("DOMContentLoaded",a):window.requestAnimationFrame?window.requestAnimationFrame(a):window.setTimeout(a,16)}return M}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism);
+Prism.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&amp;/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^<!\[CDATA\[|\]\]>$/i;var t={"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:<!\\[CDATA\\[(?:[^\\]]|\\](?!\\]>))*\\]\\]>|(?!<!\\[CDATA\\[)[^])*?(?=</__>)".replace(/__/g,function(){return a}),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml;
+!function(s){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism);
+Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};
+Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript;
+Prism.languages.c=Prism.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),Prism.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],char:Prism.languages.c.char,comment:Prism.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:Prism.languages.c}}}}),Prism.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete Prism.languages.c.boolean;
+!function(s){function a(e,s){return e.replace(/<<(\d+)>>/g,function(e,n){return"(?:"+s[+n]+")"})}function t(e,n,s){return RegExp(a(e,n),s||"")}function e(e,n){for(var s=0;s<n;s++)e=e.replace(/<<self>>/g,function(){return"(?:"+e+")"});return e.replace(/<<self>>/g,"[^\\s\\S]")}var n="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",r="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var d=l(r),p=RegExp(l(n+" "+r+" "+i+" "+o)),c=l(r+" "+i+" "+o),u=l(n+" "+r+" "+o),g=e("<(?:[^<>;=+\\-*/%&|^]|<<self>>)*>",2),b=e("\\((?:[^()]|<<self>>)*\\)",2),h="@?\\b[A-Za-z_]\\w*\\b",f=a("<<0>>(?:\\s*<<1>>)?",[h,g]),m=a("(?!<<0>>)<<1>>(?:\\s*\\.\\s*<<1>>)*",[c,f]),k="\\[\\s*(?:,\\s*)*\\]",y=a("<<0>>(?:\\s*(?:\\?\\s*)?<<1>>)*(?:\\s*\\?)?",[m,k]),w=a("(?:<<0>>|<<1>>)(?:\\s*(?:\\?\\s*)?<<2>>)*(?:\\s*\\?)?",[a("\\(<<0>>+(?:,<<0>>+)+\\)",[a("[^,()<>[\\];=+\\-*/%&|^]|<<0>>|<<1>>|<<2>>",[g,b,k])]),m,k]),v={keyword:p,punctuation:/[<>()?,.:[\]]/},x="'(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'",$='"(?:\\\\.|[^\\\\"\r\n])*"';s.languages.csharp=s.languages.extend("clike",{string:[{pattern:t("(^|[^$\\\\])<<0>>",['@"(?:""|\\\\[^]|[^\\\\"])*"(?!")']),lookbehind:!0,greedy:!0},{pattern:t("(^|[^@$\\\\])<<0>>",[$]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:t("(\\busing\\s+static\\s+)<<0>>(?=\\s*;)",[m]),lookbehind:!0,inside:v},{pattern:t("(\\busing\\s+<<0>>\\s*=\\s*)<<1>>(?=\\s*;)",[h,w]),lookbehind:!0,inside:v},{pattern:t("(\\busing\\s+)<<0>>(?=\\s*=)",[h]),lookbehind:!0},{pattern:t("(\\b<<0>>\\s+)<<1>>",[d,f]),lookbehind:!0,inside:v},{pattern:t("(\\bcatch\\s*\\(\\s*)<<0>>",[m]),lookbehind:!0,inside:v},{pattern:t("(\\bwhere\\s+)<<0>>",[h]),lookbehind:!0},{pattern:t("(\\b(?:is(?:\\s+not)?|as)\\s+)<<0>>",[y]),lookbehind:!0,inside:v},{pattern:t("\\b<<0>>(?=\\s+(?!<<1>>|with\\s*\\{)<<2>>(?:\\s*[=,;:{)\\]]|\\s+(?:in|when)\\b))",[w,u,h]),inside:v}],keyword:p,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),s.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),s.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:t("([(,]\\s*)<<0>>(?=\\s*:)",[h]),lookbehind:!0,alias:"punctuation"}}),s.languages.insertBefore("csharp","class-name",{namespace:{pattern:t("(\\b(?:namespace|using)\\s+)<<0>>(?:\\s*\\.\\s*<<0>>)*(?=\\s*[;{])",[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:t("(\\b(?:default|sizeof|typeof)\\s*\\(\\s*(?!\\s))(?:[^()\\s]|\\s(?!\\s)|<<0>>)*(?=\\s*\\))",[b]),lookbehind:!0,alias:"class-name",inside:v},"return-type":{pattern:t("<<0>>(?=\\s+(?:<<1>>\\s*(?:=>|[({]|\\.\\s*this\\s*\\[)|this\\s*\\[))",[w,m]),inside:v,alias:"class-name"},"constructor-invocation":{pattern:t("(\\bnew\\s+)<<0>>(?=\\s*[[({])",[w]),lookbehind:!0,inside:v,alias:"class-name"},"generic-method":{pattern:t("<<0>>\\s*<<1>>(?=\\s*\\()",[h,g]),inside:{function:t("^<<0>>",[h]),generic:{pattern:RegExp(g),alias:"class-name",inside:v}}},"type-list":{pattern:t("\\b((?:<<0>>\\s+<<1>>|record\\s+<<1>>\\s*<<5>>|where\\s+<<2>>)\\s*:\\s*)(?:<<3>>|<<4>>|<<1>>\\s*<<5>>|<<6>>)(?:\\s*,\\s*(?:<<3>>|<<4>>|<<6>>))*(?=\\s*(?:where|[{;]|=>|$))",[d,f,h,w,p.source,b,"\\bnew\\s*\\(\\s*\\)"]),lookbehind:!0,inside:{"record-arguments":{pattern:t("(^(?!new\\s*\\()<<0>>\\s*)<<1>>",[f,b]),lookbehind:!0,greedy:!0,inside:s.languages.csharp},keyword:p,"class-name":{pattern:RegExp(w),greedy:!0,inside:v},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var _=$+"|"+x,B=a("/(?![*/])|//[^\r\n]*[\r\n]|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>",[_]),E=e(a("[^\"'/()]|<<0>>|\\(<<self>>*\\)",[B]),2),R="\\b(?:assembly|event|field|method|module|param|property|return|type)\\b",z=a("<<0>>(?:\\s*\\(<<1>>*\\))?",[m,E]);s.languages.insertBefore("csharp","class-name",{attribute:{pattern:t("((?:^|[^\\s\\w>)?])\\s*\\[\\s*)(?:<<0>>\\s*:\\s*)?<<1>>(?:\\s*,\\s*<<1>>)*(?=\\s*\\])",[R,z]),lookbehind:!0,greedy:!0,inside:{target:{pattern:t("^<<0>>(?=\\s*:)",[R]),alias:"keyword"},"attribute-arguments":{pattern:t("\\(<<0>>*\\)",[E]),inside:s.languages.csharp},"class-name":{pattern:RegExp(m),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var S=":[^}\r\n]+",j=e(a("[^\"'/()]|<<0>>|\\(<<self>>*\\)",[B]),2),A=a("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[j,S]),F=e(a("[^\"'/()]|/(?!\\*)|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>|\\(<<self>>*\\)",[_]),2),P=a("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[F,S]);function U(e,n){return{interpolation:{pattern:t("((?:^|[^{])(?:\\{\\{)*)<<0>>",[e]),lookbehind:!0,inside:{"format-string":{pattern:t("(^\\{(?:(?![}:])<<0>>)*)<<1>>(?=\\}$)",[n,S]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:s.languages.csharp}}},string:/[\s\S]+/}}s.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:t('(^|[^\\\\])(?:\\$@|@\\$)"(?:""|\\\\[^]|\\{\\{|<<0>>|[^\\\\{"])*"',[A]),lookbehind:!0,greedy:!0,inside:U(A,j)},{pattern:t('(^|[^@\\\\])\\$"(?:\\\\.|\\{\\{|<<0>>|[^\\\\"{])*"',[P]),lookbehind:!0,greedy:!0,inside:U(P,F)}],char:{pattern:RegExp(x),greedy:!0}}),s.languages.dotnet=s.languages.cs=s.languages.csharp}(Prism);
+!function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n="\\b(?!<keyword>)\\w+(?:\\s*\\.\\s*\\w+)*\\b".replace(/<keyword>/g,function(){return t.source});e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp("(\\b(?:class|concept|enum|struct|typename)\\s+)(?!<keyword>)\\w+".replace(/<keyword>/g,function(){return t.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp('(\\b(?:import|module)\\s+)(?:"(?:\\\\(?:\r\n|[^])|[^"\\\\\r\n])*"|<[^<>\r\n]*>|'+"<mod-name>(?:\\s*:\\s*<mod-name>)?|:\\s*<mod-name>".replace(/<mod-name>/g,function(){return n})+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(Prism);
+!function(e){var a,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:a={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=a,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},i={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:i,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:i})}(Prism);
+!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n="(^|[^\\w.])(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",a={pattern:RegExp(n+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[a,{pattern:RegExp(n+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()])"),lookbehind:!0,inside:a.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":a,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},namespace:{pattern:RegExp("(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!<keyword>)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?".replace(/<keyword>/g,function(){return t.source})),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism);
+!function(h){function v(e,n){return"___"+e.toUpperCase()+n+"___"}Object.defineProperties(h.languages["markup-templating"]={},{buildPlaceholders:{value:function(a,r,e,o){if(a.language===r){var c=a.tokenStack=[];a.code=a.code.replace(e,function(e){if("function"==typeof o&&!o(e))return e;for(var n,t=c.length;-1!==a.code.indexOf(n=v(r,t));)++t;return c[t]=e,n}),a.grammar=h.languages.markup}}},tokenizePlaceholders:{value:function(p,k){if(p.language===k&&p.tokenStack){p.grammar=h.languages[k];var m=0,d=Object.keys(p.tokenStack);!function e(n){for(var t=0;t<n.length&&!(m>=d.length);t++){var a=n[t];if("string"==typeof a||a.content&&"string"==typeof a.content){var r=d[m],o=p.tokenStack[r],c="string"==typeof a?a:a.content,i=v(k,r),u=c.indexOf(i);if(-1<u){++m;var g=c.substring(0,u),l=new h.Token(k,h.tokenize(o,p.grammar),"language-"+k,o),s=c.substring(u+i.length),f=[];g&&f.push.apply(f,e([g])),f.push(l),s&&f.push.apply(f,e([s])),"string"==typeof a?n.splice.apply(n,[t,1].concat(f)):a.content=f}}else a.content&&e(a.content)}return n}(p.tokens)}}}})}(Prism);
+!function(a){var e=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,t=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],i=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,n=/<?=>|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,s=/[{}\[\](),:;]/;a.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:e,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|new|or|parent|print|private|protected|public|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s+)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:i,operator:n,punctuation:s};var l={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:a.languages.php},r=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:l}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:l}}];a.languages.insertBefore("php","variable",{string:r,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:e,string:r,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,number:i,operator:n,punctuation:s}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),a.hooks.add("before-tokenize",function(e){if(/<\?/.test(e.code)){a.languages["markup-templating"].buildPlaceholders(e,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)}}),a.hooks.add("after-tokenize",function(e){a.languages["markup-templating"].tokenizePlaceholders(e,"php")})}(Prism);
+Prism.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/};
+Prism.languages.plsql=Prism.languages.extend("sql",{comment:{pattern:/\/\*[\s\S]*?\*\/|--.*/,greedy:!0},keyword:/\b(?:A|ACCESSIBLE|ADD|AGENT|AGGREGATE|ALL|ALTER|AND|ANY|ARRAY|AS|ASC|AT|ATTRIBUTE|AUTHID|AVG|BEGIN|BETWEEN|BFILE_BASE|BINARY|BLOB_BASE|BLOCK|BODY|BOTH|BOUND|BULK|BY|BYTE|C|CALL|CALLING|CASCADE|CASE|CHAR|CHARACTER|CHARSET|CHARSETFORM|CHARSETID|CHAR_BASE|CHECK|CLOB_BASE|CLONE|CLOSE|CLUSTER|CLUSTERS|COLAUTH|COLLECT|COLUMNS|COMMENT|COMMIT|COMMITTED|COMPILED|COMPRESS|CONNECT|CONSTANT|CONSTRUCTOR|CONTEXT|CONTINUE|CONVERT|COUNT|CRASH|CREATE|CREDENTIAL|CURRENT|CURSOR|CUSTOMDATUM|DANGLING|DATA|DATE|DATE_BASE|DAY|DECLARE|DEFAULT|DEFINE|DELETE|DESC|DETERMINISTIC|DIRECTORY|DISTINCT|DOUBLE|DROP|DURATION|ELEMENT|ELSE|ELSIF|EMPTY|END|ESCAPE|EXCEPT|EXCEPTION|EXCEPTIONS|EXCLUSIVE|EXECUTE|EXISTS|EXIT|EXTERNAL|FETCH|FINAL|FIRST|FIXED|FLOAT|FOR|FORALL|FORCE|FROM|FUNCTION|GENERAL|GOTO|GRANT|GROUP|HASH|HAVING|HEAP|HIDDEN|HOUR|IDENTIFIED|IF|IMMEDIATE|IMMUTABLE|IN|INCLUDING|INDEX|INDEXES|INDICATOR|INDICES|INFINITE|INSERT|INSTANTIABLE|INT|INTERFACE|INTERSECT|INTERVAL|INTO|INVALIDATE|IS|ISOLATION|JAVA|LANGUAGE|LARGE|LEADING|LENGTH|LEVEL|LIBRARY|LIKE|LIKE2|LIKE4|LIKEC|LIMIT|LIMITED|LOCAL|LOCK|LONG|LOOP|MAP|MAX|MAXLEN|MEMBER|MERGE|MIN|MINUS|MINUTE|MOD|MODE|MODIFY|MONTH|MULTISET|MUTABLE|NAME|NAN|NATIONAL|NATIVE|NCHAR|NEW|NOCOMPRESS|NOCOPY|NOT|NOWAIT|NULL|NUMBER_BASE|OBJECT|OCICOLL|OCIDATE|OCIDATETIME|OCIDURATION|OCIINTERVAL|OCILOBLOCATOR|OCINUMBER|OCIRAW|OCIREF|OCIREFCURSOR|OCIROWID|OCISTRING|OCITYPE|OF|OLD|ON|ONLY|OPAQUE|OPEN|OPERATOR|OPTION|OR|ORACLE|ORADATA|ORDER|ORGANIZATION|ORLANY|ORLVARY|OTHERS|OUT|OVERLAPS|OVERRIDING|PACKAGE|PARALLEL_ENABLE|PARAMETER|PARAMETERS|PARENT|PARTITION|PASCAL|PERSISTABLE|PIPE|PIPELINED|PLUGGABLE|POLYMORPHIC|PRAGMA|PRECISION|PRIOR|PRIVATE|PROCEDURE|PUBLIC|RAISE|RANGE|RAW|READ|RECORD|REF|REFERENCE|RELIES_ON|REM|REMAINDER|RENAME|RESOURCE|RESULT|RESULT_CACHE|RETURN|RETURNING|REVERSE|REVOKE|ROLLBACK|ROW|SAMPLE|SAVE|SAVEPOINT|SB1|SB2|SB4|SECOND|SEGMENT|SELECT|SELF|SEPARATE|SEQUENCE|SERIALIZABLE|SET|SHARE|SHORT|SIZE|SIZE_T|SOME|SPARSE|SQL|SQLCODE|SQLDATA|SQLNAME|SQLSTATE|STANDARD|START|STATIC|STDDEV|STORED|STRING|STRUCT|STYLE|SUBMULTISET|SUBPARTITION|SUBSTITUTABLE|SUBTYPE|SUM|SYNONYM|TABAUTH|TABLE|TDO|THE|THEN|TIME|TIMESTAMP|TIMEZONE_ABBR|TIMEZONE_HOUR|TIMEZONE_MINUTE|TIMEZONE_REGION|TO|TRAILING|TRANSACTION|TRANSACTIONAL|TRUSTED|TYPE|UB1|UB2|UB4|UNDER|UNION|UNIQUE|UNPLUG|UNSIGNED|UNTRUSTED|UPDATE|USE|USING|VALIST|VALUE|VALUES|VARIABLE|VARIANCE|VARRAY|VARYING|VIEW|VIEWS|VOID|WHEN|WHERE|WHILE|WITH|WORK|WRAPPED|WRITE|YEAR|ZONE)\b/i,operator:/:=?|=>|[<>^~!]=|\.\.|\|\||\*\*|[-+*/%<>=@]/}),Prism.languages.insertBefore("plsql","operator",{label:{pattern:/<<\s*\w+\s*>>/,alias:"symbol"}});
+!function(e){var i=Prism.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\S]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:{function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:{}}}},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,boolean:/\$(?:false|true)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(\W?)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/},r=i.string[0].inside;r.boolean=i.boolean,r.variable=i.variable,r.function.inside=i}();
+Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python;
+Prism.languages.sqf=Prism.languages.extend("clike",{string:{pattern:/"(?:(?:"")?[^"])*"(?!")|'(?:[^'])*'/,greedy:!0},keyword:/\b(?:breakOut|breakTo|call|case|catch|default|do|echo|else|execFSM|execVM|exitWith|for|forEach|forEachMember|forEachMemberAgent|forEachMemberTeam|from|goto|if|nil|preprocessFile|preprocessFileLineNumbers|private|scopeName|spawn|step|switch|then|throw|to|try|while|with)\b/i,boolean:/\b(?:false|true)\b/i,function:/\b(?:abs|accTime|acos|action|actionIDs|actionKeys|actionKeysImages|actionKeysNames|actionKeysNamesArray|actionName|actionParams|activateAddons|activatedAddons|activateKey|add3DENConnection|add3DENEventHandler|add3DENLayer|addAction|addBackpack|addBackpackCargo|addBackpackCargoGlobal|addBackpackGlobal|addCamShake|addCuratorAddons|addCuratorCameraArea|addCuratorEditableObjects|addCuratorEditingArea|addCuratorPoints|addEditorObject|addEventHandler|addForce|addForceGeneratorRTD|addGoggles|addGroupIcon|addHandgunItem|addHeadgear|addItem|addItemCargo|addItemCargoGlobal|addItemPool|addItemToBackpack|addItemToUniform|addItemToVest|addLiveStats|addMagazine|addMagazineAmmoCargo|addMagazineCargo|addMagazineCargoGlobal|addMagazineGlobal|addMagazinePool|addMagazines|addMagazineTurret|addMenu|addMenuItem|addMissionEventHandler|addMPEventHandler|addMusicEventHandler|addOwnedMine|addPlayerScores|addPrimaryWeaponItem|addPublicVariableEventHandler|addRating|addResources|addScore|addScoreSide|addSecondaryWeaponItem|addSwitchableUnit|addTeamMember|addToRemainsCollector|addTorque|addUniform|addVehicle|addVest|addWaypoint|addWeapon|addWeaponCargo|addWeaponCargoGlobal|addWeaponGlobal|addWeaponItem|addWeaponPool|addWeaponTurret|admin|agent|agents|AGLToASL|aimedAtTarget|aimPos|airDensityCurveRTD|airDensityRTD|airplaneThrottle|airportSide|AISFinishHeal|alive|all3DENEntities|allAirports|allControls|allCurators|allCutLayers|allDead|allDeadMen|allDisplays|allGroups|allMapMarkers|allMines|allMissionObjects|allow3DMode|allowCrewInImmobile|allowCuratorLogicIgnoreAreas|allowDamage|allowDammage|allowFileOperations|allowFleeing|allowGetIn|allowSprint|allPlayers|allSimpleObjects|allSites|allTurrets|allUnits|allUnitsUAV|allVariables|ammo|ammoOnPylon|animate|animateBay|animateDoor|animatePylon|animateSource|animationNames|animationPhase|animationSourcePhase|animationState|append|apply|armoryPoints|arrayIntersect|asin|ASLToAGL|ASLToATL|assert|assignAsCargo|assignAsCargoIndex|assignAsCommander|assignAsDriver|assignAsGunner|assignAsTurret|assignCurator|assignedCargo|assignedCommander|assignedDriver|assignedGunner|assignedItems|assignedTarget|assignedTeam|assignedVehicle|assignedVehicleRole|assignItem|assignTeam|assignToAirport|atan|atan2|atg|ATLToASL|attachedObject|attachedObjects|attachedTo|attachObject|attachTo|attackEnabled|backpack|backpackCargo|backpackContainer|backpackItems|backpackMagazines|backpackSpaceFor|behaviour|benchmark|binocular|blufor|boundingBox|boundingBoxReal|boundingCenter|briefingName|buildingExit|buildingPos|buldozer_EnableRoadDiag|buldozer_IsEnabledRoadDiag|buldozer_LoadNewRoads|buldozer_reloadOperMap|buttonAction|buttonSetAction|cadetMode|callExtension|camCommand|camCommit|camCommitPrepared|camCommitted|camConstuctionSetParams|camCreate|camDestroy|cameraEffect|cameraEffectEnableHUD|cameraInterest|cameraOn|cameraView|campaignConfigFile|camPreload|camPreloaded|camPrepareBank|camPrepareDir|camPrepareDive|camPrepareFocus|camPrepareFov|camPrepareFovRange|camPreparePos|camPrepareRelPos|camPrepareTarget|camSetBank|camSetDir|camSetDive|camSetFocus|camSetFov|camSetFovRange|camSetPos|camSetRelPos|camSetTarget|camTarget|camUseNVG|canAdd|canAddItemToBackpack|canAddItemToUniform|canAddItemToVest|cancelSimpleTaskDestination|canFire|canMove|canSlingLoad|canStand|canSuspend|canTriggerDynamicSimulation|canUnloadInCombat|canVehicleCargo|captive|captiveNum|cbChecked|cbSetChecked|ceil|channelEnabled|cheatsEnabled|checkAIFeature|checkVisibility|civilian|className|clear3DENAttribute|clear3DENInventory|clearAllItemsFromBackpack|clearBackpackCargo|clearBackpackCargoGlobal|clearForcesRTD|clearGroupIcons|clearItemCargo|clearItemCargoGlobal|clearItemPool|clearMagazineCargo|clearMagazineCargoGlobal|clearMagazinePool|clearOverlay|clearRadio|clearVehicleInit|clearWeaponCargo|clearWeaponCargoGlobal|clearWeaponPool|clientOwner|closeDialog|closeDisplay|closeOverlay|collapseObjectTree|collect3DENHistory|collectiveRTD|combatMode|commandArtilleryFire|commandChat|commander|commandFire|commandFollow|commandFSM|commandGetOut|commandingMenu|commandMove|commandRadio|commandStop|commandSuppressiveFire|commandTarget|commandWatch|comment|commitOverlay|compile|compileFinal|completedFSM|composeText|configClasses|configFile|configHierarchy|configName|configNull|configProperties|configSourceAddonList|configSourceMod|configSourceModList|confirmSensorTarget|connectTerminalToUAV|controlNull|controlsGroupCtrl|copyFromClipboard|copyToClipboard|copyWaypoints|cos|count|countEnemy|countFriendly|countSide|countType|countUnknown|create3DENComposition|create3DENEntity|createAgent|createCenter|createDialog|createDiaryLink|createDiaryRecord|createDiarySubject|createDisplay|createGearDialog|createGroup|createGuardedPoint|createLocation|createMarker|createMarkerLocal|createMenu|createMine|createMissionDisplay|createMPCampaignDisplay|createSimpleObject|createSimpleTask|createSite|createSoundSource|createTask|createTeam|createTrigger|createUnit|createVehicle|createVehicleCrew|createVehicleLocal|crew|ctAddHeader|ctAddRow|ctClear|ctCurSel|ctData|ctFindHeaderRows|ctFindRowHeader|ctHeaderControls|ctHeaderCount|ctRemoveHeaders|ctRemoveRows|ctrlActivate|ctrlAddEventHandler|ctrlAngle|ctrlAutoScrollDelay|ctrlAutoScrollRewind|ctrlAutoScrollSpeed|ctrlChecked|ctrlClassName|ctrlCommit|ctrlCommitted|ctrlCreate|ctrlDelete|ctrlEnable|ctrlEnabled|ctrlFade|ctrlHTMLLoaded|ctrlIDC|ctrlIDD|ctrlMapAnimAdd|ctrlMapAnimClear|ctrlMapAnimCommit|ctrlMapAnimDone|ctrlMapCursor|ctrlMapMouseOver|ctrlMapScale|ctrlMapScreenToWorld|ctrlMapWorldToScreen|ctrlModel|ctrlModelDirAndUp|ctrlModelScale|ctrlParent|ctrlParentControlsGroup|ctrlPosition|ctrlRemoveAllEventHandlers|ctrlRemoveEventHandler|ctrlScale|ctrlSetActiveColor|ctrlSetAngle|ctrlSetAutoScrollDelay|ctrlSetAutoScrollRewind|ctrlSetAutoScrollSpeed|ctrlSetBackgroundColor|ctrlSetChecked|ctrlSetDisabledColor|ctrlSetEventHandler|ctrlSetFade|ctrlSetFocus|ctrlSetFont|ctrlSetFontH1|ctrlSetFontH1B|ctrlSetFontH2|ctrlSetFontH2B|ctrlSetFontH3|ctrlSetFontH3B|ctrlSetFontH4|ctrlSetFontH4B|ctrlSetFontH5|ctrlSetFontH5B|ctrlSetFontH6|ctrlSetFontH6B|ctrlSetFontHeight|ctrlSetFontHeightH1|ctrlSetFontHeightH2|ctrlSetFontHeightH3|ctrlSetFontHeightH4|ctrlSetFontHeightH5|ctrlSetFontHeightH6|ctrlSetFontHeightSecondary|ctrlSetFontP|ctrlSetFontPB|ctrlSetFontSecondary|ctrlSetForegroundColor|ctrlSetModel|ctrlSetModelDirAndUp|ctrlSetModelScale|ctrlSetPixelPrecision|ctrlSetPosition|ctrlSetScale|ctrlSetStructuredText|ctrlSetText|ctrlSetTextColor|ctrlSetTextColorSecondary|ctrlSetTextSecondary|ctrlSetTooltip|ctrlSetTooltipColorBox|ctrlSetTooltipColorShade|ctrlSetTooltipColorText|ctrlShow|ctrlShown|ctrlText|ctrlTextHeight|ctrlTextSecondary|ctrlTextWidth|ctrlType|ctrlVisible|ctRowControls|ctRowCount|ctSetCurSel|ctSetData|ctSetHeaderTemplate|ctSetRowTemplate|ctSetValue|ctValue|curatorAddons|curatorCamera|curatorCameraArea|curatorCameraAreaCeiling|curatorCoef|curatorEditableObjects|curatorEditingArea|curatorEditingAreaType|curatorMouseOver|curatorPoints|curatorRegisteredObjects|curatorSelected|curatorWaypointCost|current3DENOperation|currentChannel|currentCommand|currentMagazine|currentMagazineDetail|currentMagazineDetailTurret|currentMagazineTurret|currentMuzzle|currentNamespace|currentTask|currentTasks|currentThrowable|currentVisionMode|currentWaypoint|currentWeapon|currentWeaponMode|currentWeaponTurret|currentZeroing|cursorObject|cursorTarget|customChat|customRadio|cutFadeOut|cutObj|cutRsc|cutText|damage|date|dateToNumber|daytime|deActivateKey|debriefingText|debugFSM|debugLog|deg|delete3DENEntities|deleteAt|deleteCenter|deleteCollection|deleteEditorObject|deleteGroup|deleteGroupWhenEmpty|deleteIdentity|deleteLocation|deleteMarker|deleteMarkerLocal|deleteRange|deleteResources|deleteSite|deleteStatus|deleteTeam|deleteVehicle|deleteVehicleCrew|deleteWaypoint|detach|detectedMines|diag_activeMissionFSMs|diag_activeScripts|diag_activeSQFScripts|diag_activeSQSScripts|diag_captureFrame|diag_captureFrameToFile|diag_captureSlowFrame|diag_codePerformance|diag_drawMode|diag_dynamicSimulationEnd|diag_enable|diag_enabled|diag_fps|diag_fpsMin|diag_frameNo|diag_lightNewLoad|diag_list|diag_log|diag_logSlowFrame|diag_mergeConfigFile|diag_recordTurretLimits|diag_setLightNew|diag_tickTime|diag_toggle|dialog|diarySubjectExists|didJIP|didJIPOwner|difficulty|difficultyEnabled|difficultyEnabledRTD|difficultyOption|direction|directSay|disableAI|disableCollisionWith|disableConversation|disableDebriefingStats|disableMapIndicators|disableNVGEquipment|disableRemoteSensors|disableSerialization|disableTIEquipment|disableUAVConnectability|disableUserInput|displayAddEventHandler|displayCtrl|displayNull|displayParent|displayRemoveAllEventHandlers|displayRemoveEventHandler|displaySetEventHandler|dissolveTeam|distance|distance2D|distanceSqr|distributionRegion|do3DENAction|doArtilleryFire|doFire|doFollow|doFSM|doGetOut|doMove|doorPhase|doStop|doSuppressiveFire|doTarget|doWatch|drawArrow|drawEllipse|drawIcon|drawIcon3D|drawLine|drawLine3D|drawLink|drawLocation|drawPolygon|drawRectangle|drawTriangle|driver|drop|dynamicSimulationDistance|dynamicSimulationDistanceCoef|dynamicSimulationEnabled|dynamicSimulationSystemEnabled|east|edit3DENMissionAttributes|editObject|editorSetEventHandler|effectiveCommander|emptyPositions|enableAI|enableAIFeature|enableAimPrecision|enableAttack|enableAudioFeature|enableAutoStartUpRTD|enableAutoTrimRTD|enableCamShake|enableCaustics|enableChannel|enableCollisionWith|enableCopilot|enableDebriefingStats|enableDiagLegend|enableDynamicSimulation|enableDynamicSimulationSystem|enableEndDialog|enableEngineArtillery|enableEnvironment|enableFatigue|enableGunLights|enableInfoPanelComponent|enableIRLasers|enableMimics|enablePersonTurret|enableRadio|enableReload|enableRopeAttach|enableSatNormalOnDetail|enableSaving|enableSentences|enableSimulation|enableSimulationGlobal|enableStamina|enableStressDamage|enableTeamSwitch|enableTraffic|enableUAVConnectability|enableUAVWaypoints|enableVehicleCargo|enableVehicleSensor|enableWeaponDisassembly|endl|endLoadingScreen|endMission|engineOn|enginesIsOnRTD|enginesPowerRTD|enginesRpmRTD|enginesTorqueRTD|entities|environmentEnabled|estimatedEndServerTime|estimatedTimeLeft|evalObjectArgument|everyBackpack|everyContainer|exec|execEditorScript|exp|expectedDestination|exportJIPMessages|eyeDirection|eyePos|face|faction|fadeMusic|fadeRadio|fadeSound|fadeSpeech|failMission|fillWeaponsFromPool|find|findCover|findDisplay|findEditorObject|findEmptyPosition|findEmptyPositionReady|findIf|findNearestEnemy|finishMissionInit|finite|fire|fireAtTarget|firstBackpack|flag|flagAnimationPhase|flagOwner|flagSide|flagTexture|fleeing|floor|flyInHeight|flyInHeightASL|fog|fogForecast|fogParams|forceAddUniform|forceAtPositionRTD|forcedMap|forceEnd|forceFlagTexture|forceFollowRoad|forceGeneratorRTD|forceMap|forceRespawn|forceSpeed|forceWalk|forceWeaponFire|forceWeatherChange|forgetTarget|format|formation|formationDirection|formationLeader|formationMembers|formationPosition|formationTask|formatText|formLeader|freeLook|fromEditor|fuel|fullCrew|gearIDCAmmoCount|gearSlotAmmoCount|gearSlotData|get3DENActionState|get3DENAttribute|get3DENCamera|get3DENConnections|get3DENEntity|get3DENEntityID|get3DENGrid|get3DENIconsVisible|get3DENLayerEntities|get3DENLinesVisible|get3DENMissionAttribute|get3DENMouseOver|get3DENSelected|getAimingCoef|getAllEnvSoundControllers|getAllHitPointsDamage|getAllOwnedMines|getAllSoundControllers|getAmmoCargo|getAnimAimPrecision|getAnimSpeedCoef|getArray|getArtilleryAmmo|getArtilleryComputerSettings|getArtilleryETA|getAssignedCuratorLogic|getAssignedCuratorUnit|getBackpackCargo|getBleedingRemaining|getBurningValue|getCameraViewDirection|getCargoIndex|getCenterOfMass|getClientState|getClientStateNumber|getCompatiblePylonMagazines|getConnectedUAV|getContainerMaxLoad|getCursorObjectParams|getCustomAimCoef|getDammage|getDescription|getDir|getDirVisual|getDLCAssetsUsage|getDLCAssetsUsageByName|getDLCs|getDLCUsageTime|getEditorCamera|getEditorMode|getEditorObjectScope|getElevationOffset|getEngineTargetRpmRTD|getEnvSoundController|getFatigue|getFieldManualStartPage|getForcedFlagTexture|getFriend|getFSMVariable|getFuelCargo|getGroupIcon|getGroupIconParams|getGroupIcons|getHideFrom|getHit|getHitIndex|getHitPointDamage|getItemCargo|getMagazineCargo|getMarkerColor|getMarkerPos|getMarkerSize|getMarkerType|getMass|getMissionConfig|getMissionConfigValue|getMissionDLCs|getMissionLayerEntities|getMissionLayers|getModelInfo|getMousePosition|getMusicPlayedTime|getNumber|getObjectArgument|getObjectChildren|getObjectDLC|getObjectMaterials|getObjectProxy|getObjectTextures|getObjectType|getObjectViewDistance|getOxygenRemaining|getPersonUsedDLCs|getPilotCameraDirection|getPilotCameraPosition|getPilotCameraRotation|getPilotCameraTarget|getPlateNumber|getPlayerChannel|getPlayerScores|getPlayerUID|getPlayerUIDOld|getPos|getPosASL|getPosASLVisual|getPosASLW|getPosATL|getPosATLVisual|getPosVisual|getPosWorld|getPylonMagazines|getRelDir|getRelPos|getRemoteSensorsDisabled|getRepairCargo|getResolution|getRotorBrakeRTD|getShadowDistance|getShotParents|getSlingLoad|getSoundController|getSoundControllerResult|getSpeed|getStamina|getStatValue|getSuppression|getTerrainGrid|getTerrainHeightASL|getText|getTotalDLCUsageTime|getTrimOffsetRTD|getUnitLoadout|getUnitTrait|getUserMFDText|getUserMFDValue|getVariable|getVehicleCargo|getWeaponCargo|getWeaponSway|getWingsOrientationRTD|getWingsPositionRTD|getWPPos|glanceAt|globalChat|globalRadio|goggles|group|groupChat|groupFromNetId|groupIconSelectable|groupIconsVisible|groupId|groupOwner|groupRadio|groupSelectedUnits|groupSelectUnit|grpNull|gunner|gusts|halt|handgunItems|handgunMagazine|handgunWeapon|handsHit|hasInterface|hasPilotCamera|hasWeapon|hcAllGroups|hcGroupParams|hcLeader|hcRemoveAllGroups|hcRemoveGroup|hcSelected|hcSelectGroup|hcSetGroup|hcShowBar|hcShownBar|headgear|hideBody|hideObject|hideObjectGlobal|hideSelection|hint|hintC|hintCadet|hintSilent|hmd|hostMission|htmlLoad|HUDMovementLevels|humidity|image|importAllGroups|importance|in|inArea|inAreaArray|incapacitatedState|independent|inflame|inflamed|infoPanel|infoPanelComponentEnabled|infoPanelComponents|infoPanels|inGameUISetEventHandler|inheritsFrom|initAmbientLife|inPolygon|inputAction|inRangeOfArtillery|insertEditorObject|intersect|is3DEN|is3DENMultiplayer|isAbleToBreathe|isAgent|isAimPrecisionEnabled|isArray|isAutoHoverOn|isAutonomous|isAutoStartUpEnabledRTD|isAutotest|isAutoTrimOnRTD|isBleeding|isBurning|isClass|isCollisionLightOn|isCopilotEnabled|isDamageAllowed|isDedicated|isDLCAvailable|isEngineOn|isEqualTo|isEqualType|isEqualTypeAll|isEqualTypeAny|isEqualTypeArray|isEqualTypeParams|isFilePatchingEnabled|isFlashlightOn|isFlatEmpty|isForcedWalk|isFormationLeader|isGroupDeletedWhenEmpty|isHidden|isInRemainsCollector|isInstructorFigureEnabled|isIRLaserOn|isKeyActive|isKindOf|isLaserOn|isLightOn|isLocalized|isManualFire|isMarkedForCollection|isMultiplayer|isMultiplayerSolo|isNil|isNull|isNumber|isObjectHidden|isObjectRTD|isOnRoad|isPipEnabled|isPlayer|isRealTime|isRemoteExecuted|isRemoteExecutedJIP|isServer|isShowing3DIcons|isSimpleObject|isSprintAllowed|isStaminaEnabled|isSteamMission|isStreamFriendlyUIEnabled|isStressDamageEnabled|isText|isTouchingGround|isTurnedOut|isTutHintsEnabled|isUAVConnectable|isUAVConnected|isUIContext|isUniformAllowed|isVehicleCargo|isVehicleRadarOn|isVehicleSensorEnabled|isWalking|isWeaponDeployed|isWeaponRested|itemCargo|items|itemsWithMagazines|join|joinAs|joinAsSilent|joinSilent|joinString|kbAddDatabase|kbAddDatabaseTargets|kbAddTopic|kbHasTopic|kbReact|kbRemoveTopic|kbTell|kbWasSaid|keyImage|keyName|knowsAbout|land|landAt|landResult|language|laserTarget|lbAdd|lbClear|lbColor|lbColorRight|lbCurSel|lbData|lbDelete|lbIsSelected|lbPicture|lbPictureRight|lbSelection|lbSetColor|lbSetColorRight|lbSetCurSel|lbSetData|lbSetPicture|lbSetPictureColor|lbSetPictureColorDisabled|lbSetPictureColorSelected|lbSetPictureRight|lbSetPictureRightColor|lbSetPictureRightColorDisabled|lbSetPictureRightColorSelected|lbSetSelectColor|lbSetSelectColorRight|lbSetSelected|lbSetText|lbSetTextRight|lbSetTooltip|lbSetValue|lbSize|lbSort|lbSortByValue|lbText|lbTextRight|lbValue|leader|leaderboardDeInit|leaderboardGetRows|leaderboardInit|leaderboardRequestRowsFriends|leaderboardRequestRowsGlobal|leaderboardRequestRowsGlobalAroundUser|leaderboardsRequestUploadScore|leaderboardsRequestUploadScoreKeepBest|leaderboardState|leaveVehicle|libraryCredits|libraryDisclaimers|lifeState|lightAttachObject|lightDetachObject|lightIsOn|lightnings|limitSpeed|linearConversion|lineBreak|lineIntersects|lineIntersectsObjs|lineIntersectsSurfaces|lineIntersectsWith|linkItem|list|listObjects|listRemoteTargets|listVehicleSensors|ln|lnbAddArray|lnbAddColumn|lnbAddRow|lnbClear|lnbColor|lnbColorRight|lnbCurSelRow|lnbData|lnbDeleteColumn|lnbDeleteRow|lnbGetColumnsPosition|lnbPicture|lnbPictureRight|lnbSetColor|lnbSetColorRight|lnbSetColumnsPos|lnbSetCurSelRow|lnbSetData|lnbSetPicture|lnbSetPictureColor|lnbSetPictureColorRight|lnbSetPictureColorSelected|lnbSetPictureColorSelectedRight|lnbSetPictureRight|lnbSetText|lnbSetTextRight|lnbSetValue|lnbSize|lnbSort|lnbSortByValue|lnbText|lnbTextRight|lnbValue|load|loadAbs|loadBackpack|loadFile|loadGame|loadIdentity|loadMagazine|loadOverlay|loadStatus|loadUniform|loadVest|local|localize|locationNull|locationPosition|lock|lockCameraTo|lockCargo|lockDriver|locked|lockedCargo|lockedDriver|lockedTurret|lockIdentity|lockTurret|lockWP|log|logEntities|logNetwork|logNetworkTerminate|lookAt|lookAtPos|magazineCargo|magazines|magazinesAllTurrets|magazinesAmmo|magazinesAmmoCargo|magazinesAmmoFull|magazinesDetail|magazinesDetailBackpack|magazinesDetailUniform|magazinesDetailVest|magazinesTurret|magazineTurretAmmo|mapAnimAdd|mapAnimClear|mapAnimCommit|mapAnimDone|mapCenterOnCamera|mapGridPosition|markAsFinishedOnSteam|markerAlpha|markerBrush|markerColor|markerDir|markerPos|markerShape|markerSize|markerText|markerType|max|members|menuAction|menuAdd|menuChecked|menuClear|menuCollapse|menuData|menuDelete|menuEnable|menuEnabled|menuExpand|menuHover|menuPicture|menuSetAction|menuSetCheck|menuSetData|menuSetPicture|menuSetValue|menuShortcut|menuShortcutText|menuSize|menuSort|menuText|menuURL|menuValue|min|mineActive|mineDetectedBy|missionConfigFile|missionDifficulty|missionName|missionNamespace|missionStart|missionVersion|modelToWorld|modelToWorldVisual|modelToWorldVisualWorld|modelToWorldWorld|modParams|moonIntensity|moonPhase|morale|move|move3DENCamera|moveInAny|moveInCargo|moveInCommander|moveInDriver|moveInGunner|moveInTurret|moveObjectToEnd|moveOut|moveTime|moveTo|moveToCompleted|moveToFailed|musicVolume|name|nameSound|nearEntities|nearestBuilding|nearestLocation|nearestLocations|nearestLocationWithDubbing|nearestObject|nearestObjects|nearestTerrainObjects|nearObjects|nearObjectsReady|nearRoads|nearSupplies|nearTargets|needReload|netId|netObjNull|newOverlay|nextMenuItemIndex|nextWeatherChange|nMenuItems|numberOfEnginesRTD|numberToDate|objectCurators|objectFromNetId|objectParent|objNull|objStatus|onBriefingGear|onBriefingGroup|onBriefingNotes|onBriefingPlan|onBriefingTeamSwitch|onCommandModeChanged|onDoubleClick|onEachFrame|onGroupIconClick|onGroupIconOverEnter|onGroupIconOverLeave|onHCGroupSelectionChanged|onMapSingleClick|onPlayerConnected|onPlayerDisconnected|onPreloadFinished|onPreloadStarted|onShowNewObject|onTeamSwitch|openCuratorInterface|openDLCPage|openDSInterface|openMap|openSteamApp|openYoutubeVideo|opfor|orderGetIn|overcast|overcastForecast|owner|param|params|parseNumber|parseSimpleArray|parseText|parsingNamespace|particlesQuality|pi|pickWeaponPool|pitch|pixelGrid|pixelGridBase|pixelGridNoUIScale|pixelH|pixelW|playableSlotsNumber|playableUnits|playAction|playActionNow|player|playerRespawnTime|playerSide|playersNumber|playGesture|playMission|playMove|playMoveNow|playMusic|playScriptedMission|playSound|playSound3D|position|positionCameraToWorld|posScreenToWorld|posWorldToScreen|ppEffectAdjust|ppEffectCommit|ppEffectCommitted|ppEffectCreate|ppEffectDestroy|ppEffectEnable|ppEffectEnabled|ppEffectForceInNVG|precision|preloadCamera|preloadObject|preloadSound|preloadTitleObj|preloadTitleRsc|primaryWeapon|primaryWeaponItems|primaryWeaponMagazine|priority|processDiaryLink|processInitCommands|productVersion|profileName|profileNamespace|profileNameSteam|progressLoadingScreen|progressPosition|progressSetPosition|publicVariable|publicVariableClient|publicVariableServer|pushBack|pushBackUnique|putWeaponPool|queryItemsPool|queryMagazinePool|queryWeaponPool|rad|radioChannelAdd|radioChannelCreate|radioChannelRemove|radioChannelSetCallSign|radioChannelSetLabel|radioVolume|rain|rainbow|random|rank|rankId|rating|rectangular|registeredTasks|registerTask|reload|reloadEnabled|remoteControl|remoteExec|remoteExecCall|remoteExecutedOwner|remove3DENConnection|remove3DENEventHandler|remove3DENLayer|removeAction|removeAll3DENEventHandlers|removeAllActions|removeAllAssignedItems|removeAllContainers|removeAllCuratorAddons|removeAllCuratorCameraAreas|removeAllCuratorEditingAreas|removeAllEventHandlers|removeAllHandgunItems|removeAllItems|removeAllItemsWithMagazines|removeAllMissionEventHandlers|removeAllMPEventHandlers|removeAllMusicEventHandlers|removeAllOwnedMines|removeAllPrimaryWeaponItems|removeAllWeapons|removeBackpack|removeBackpackGlobal|removeCuratorAddons|removeCuratorCameraArea|removeCuratorEditableObjects|removeCuratorEditingArea|removeDrawIcon|removeDrawLinks|removeEventHandler|removeFromRemainsCollector|removeGoggles|removeGroupIcon|removeHandgunItem|removeHeadgear|removeItem|removeItemFromBackpack|removeItemFromUniform|removeItemFromVest|removeItems|removeMagazine|removeMagazineGlobal|removeMagazines|removeMagazinesTurret|removeMagazineTurret|removeMenuItem|removeMissionEventHandler|removeMPEventHandler|removeMusicEventHandler|removeOwnedMine|removePrimaryWeaponItem|removeSecondaryWeaponItem|removeSimpleTask|removeSwitchableUnit|removeTeamMember|removeUniform|removeVest|removeWeapon|removeWeaponAttachmentCargo|removeWeaponCargo|removeWeaponGlobal|removeWeaponTurret|reportRemoteTarget|requiredVersion|resetCamShake|resetSubgroupDirection|resistance|resize|resources|respawnVehicle|restartEditorCamera|reveal|revealMine|reverse|reversedMouseY|roadAt|roadsConnectedTo|roleDescription|ropeAttachedObjects|ropeAttachedTo|ropeAttachEnabled|ropeAttachTo|ropeCreate|ropeCut|ropeDestroy|ropeDetach|ropeEndPosition|ropeLength|ropes|ropeUnwind|ropeUnwound|rotorsForcesRTD|rotorsRpmRTD|round|runInitScript|safeZoneH|safeZoneW|safeZoneWAbs|safeZoneX|safeZoneXAbs|safeZoneY|save3DENInventory|saveGame|saveIdentity|saveJoysticks|saveOverlay|saveProfileNamespace|saveStatus|saveVar|savingEnabled|say|say2D|say3D|score|scoreSide|screenshot|screenToWorld|scriptDone|scriptName|scriptNull|scudState|secondaryWeapon|secondaryWeaponItems|secondaryWeaponMagazine|select|selectBestPlaces|selectDiarySubject|selectedEditorObjects|selectEditorObject|selectionNames|selectionPosition|selectLeader|selectMax|selectMin|selectNoPlayer|selectPlayer|selectRandom|selectRandomWeighted|selectWeapon|selectWeaponTurret|sendAUMessage|sendSimpleCommand|sendTask|sendTaskResult|sendUDPMessage|serverCommand|serverCommandAvailable|serverCommandExecutable|serverName|serverTime|set|set3DENAttribute|set3DENAttributes|set3DENGrid|set3DENIconsVisible|set3DENLayer|set3DENLinesVisible|set3DENLogicType|set3DENMissionAttribute|set3DENMissionAttributes|set3DENModelsVisible|set3DENObjectType|set3DENSelected|setAccTime|setActualCollectiveRTD|setAirplaneThrottle|setAirportSide|setAmmo|setAmmoCargo|setAmmoOnPylon|setAnimSpeedCoef|setAperture|setApertureNew|setArmoryPoints|setAttributes|setAutonomous|setBehaviour|setBleedingRemaining|setBrakesRTD|setCameraInterest|setCamShakeDefParams|setCamShakeParams|setCamUseTI|setCaptive|setCenterOfMass|setCollisionLight|setCombatMode|setCompassOscillation|setConvoySeparation|setCuratorCameraAreaCeiling|setCuratorCoef|setCuratorEditingAreaType|setCuratorWaypointCost|setCurrentChannel|setCurrentTask|setCurrentWaypoint|setCustomAimCoef|setCustomWeightRTD|setDamage|setDammage|setDate|setDebriefingText|setDefaultCamera|setDestination|setDetailMapBlendPars|setDir|setDirection|setDrawIcon|setDriveOnPath|setDropInterval|setDynamicSimulationDistance|setDynamicSimulationDistanceCoef|setEditorMode|setEditorObjectScope|setEffectCondition|setEngineRpmRTD|setFace|setFaceAnimation|setFatigue|setFeatureType|setFlagAnimationPhase|setFlagOwner|setFlagSide|setFlagTexture|setFog|setForceGeneratorRTD|setFormation|setFormationTask|setFormDir|setFriend|setFromEditor|setFSMVariable|setFuel|setFuelCargo|setGroupIcon|setGroupIconParams|setGroupIconsSelectable|setGroupIconsVisible|setGroupId|setGroupIdGlobal|setGroupOwner|setGusts|setHideBehind|setHit|setHitIndex|setHitPointDamage|setHorizonParallaxCoef|setHUDMovementLevels|setIdentity|setImportance|setInfoPanel|setLeader|setLightAmbient|setLightAttenuation|setLightBrightness|setLightColor|setLightDayLight|setLightFlareMaxDistance|setLightFlareSize|setLightIntensity|setLightnings|setLightUseFlare|setLocalWindParams|setMagazineTurretAmmo|setMarkerAlpha|setMarkerAlphaLocal|setMarkerBrush|setMarkerBrushLocal|setMarkerColor|setMarkerColorLocal|setMarkerDir|setMarkerDirLocal|setMarkerPos|setMarkerPosLocal|setMarkerShape|setMarkerShapeLocal|setMarkerSize|setMarkerSizeLocal|setMarkerText|setMarkerTextLocal|setMarkerType|setMarkerTypeLocal|setMass|setMimic|setMousePosition|setMusicEffect|setMusicEventHandler|setName|setNameSound|setObjectArguments|setObjectMaterial|setObjectMaterialGlobal|setObjectProxy|setObjectTexture|setObjectTextureGlobal|setObjectViewDistance|setOvercast|setOwner|setOxygenRemaining|setParticleCircle|setParticleClass|setParticleFire|setParticleParams|setParticleRandom|setPilotCameraDirection|setPilotCameraRotation|setPilotCameraTarget|setPilotLight|setPiPEffect|setPitch|setPlateNumber|setPlayable|setPlayerRespawnTime|setPos|setPosASL|setPosASL2|setPosASLW|setPosATL|setPosition|setPosWorld|setPylonLoadOut|setPylonsPriority|setRadioMsg|setRain|setRainbow|setRandomLip|setRank|setRectangular|setRepairCargo|setRotorBrakeRTD|setShadowDistance|setShotParents|setSide|setSimpleTaskAlwaysVisible|setSimpleTaskCustomData|setSimpleTaskDescription|setSimpleTaskDestination|setSimpleTaskTarget|setSimpleTaskType|setSimulWeatherLayers|setSize|setSkill|setSlingLoad|setSoundEffect|setSpeaker|setSpeech|setSpeedMode|setStamina|setStaminaScheme|setStatValue|setSuppression|setSystemOfUnits|setTargetAge|setTaskMarkerOffset|setTaskResult|setTaskState|setTerrainGrid|setText|setTimeMultiplier|setTitleEffect|setToneMapping|setToneMappingParams|setTrafficDensity|setTrafficDistance|setTrafficGap|setTrafficSpeed|setTriggerActivation|setTriggerArea|setTriggerStatements|setTriggerText|setTriggerTimeout|setTriggerType|setType|setUnconscious|setUnitAbility|setUnitLoadout|setUnitPos|setUnitPosWeak|setUnitRank|setUnitRecoilCoefficient|setUnitTrait|setUnloadInCombat|setUserActionText|setUserMFDText|setUserMFDValue|setVariable|setVectorDir|setVectorDirAndUp|setVectorUp|setVehicleAmmo|setVehicleAmmoDef|setVehicleArmor|setVehicleCargo|setVehicleId|setVehicleInit|setVehicleLock|setVehiclePosition|setVehicleRadar|setVehicleReceiveRemoteTargets|setVehicleReportOwnPosition|setVehicleReportRemoteTargets|setVehicleTIPars|setVehicleVarName|setVelocity|setVelocityModelSpace|setVelocityTransformation|setViewDistance|setVisibleIfTreeCollapsed|setWantedRpmRTD|setWaves|setWaypointBehaviour|setWaypointCombatMode|setWaypointCompletionRadius|setWaypointDescription|setWaypointForceBehaviour|setWaypointFormation|setWaypointHousePosition|setWaypointLoiterRadius|setWaypointLoiterType|setWaypointName|setWaypointPosition|setWaypointScript|setWaypointSpeed|setWaypointStatements|setWaypointTimeout|setWaypointType|setWaypointVisible|setWeaponReloadingTime|setWind|setWindDir|setWindForce|setWindStr|setWingForceScaleRTD|setWPPos|show3DIcons|showChat|showCinemaBorder|showCommandingMenu|showCompass|showCuratorCompass|showGPS|showHUD|showLegend|showMap|shownArtilleryComputer|shownChat|shownCompass|shownCuratorCompass|showNewEditorObject|shownGPS|shownHUD|shownMap|shownPad|shownRadio|shownScoretable|shownUAVFeed|shownWarrant|shownWatch|showPad|showRadio|showScoretable|showSubtitles|showUAVFeed|showWarrant|showWatch|showWaypoint|showWaypoints|side|sideAmbientLife|sideChat|sideEmpty|sideEnemy|sideFriendly|sideLogic|sideRadio|sideUnknown|simpleTasks|simulationEnabled|simulCloudDensity|simulCloudOcclusion|simulInClouds|simulWeatherSync|sin|size|sizeOf|skill|skillFinal|skipTime|sleep|sliderPosition|sliderRange|sliderSetPosition|sliderSetRange|sliderSetSpeed|sliderSpeed|slingLoadAssistantShown|soldierMagazines|someAmmo|sort|soundVolume|speaker|speed|speedMode|splitString|sqrt|squadParams|stance|startLoadingScreen|stop|stopEngineRTD|stopped|str|sunOrMoon|supportInfo|suppressFor|surfaceIsWater|surfaceNormal|surfaceType|swimInDepth|switchableUnits|switchAction|switchCamera|switchGesture|switchLight|switchMove|synchronizedObjects|synchronizedTriggers|synchronizedWaypoints|synchronizeObjectsAdd|synchronizeObjectsRemove|synchronizeTrigger|synchronizeWaypoint|systemChat|systemOfUnits|tan|targetKnowledge|targets|targetsAggregate|targetsQuery|taskAlwaysVisible|taskChildren|taskCompleted|taskCustomData|taskDescription|taskDestination|taskHint|taskMarkerOffset|taskNull|taskParent|taskResult|taskState|taskType|teamMember|teamMemberNull|teamName|teams|teamSwitch|teamSwitchEnabled|teamType|terminate|terrainIntersect|terrainIntersectASL|terrainIntersectAtASL|text|textLog|textLogFormat|tg|time|timeMultiplier|titleCut|titleFadeOut|titleObj|titleRsc|titleText|toArray|toFixed|toLower|toString|toUpper|triggerActivated|triggerActivation|triggerArea|triggerAttachedVehicle|triggerAttachObject|triggerAttachVehicle|triggerDynamicSimulation|triggerStatements|triggerText|triggerTimeout|triggerTimeoutCurrent|triggerType|turretLocal|turretOwner|turretUnit|tvAdd|tvClear|tvCollapse|tvCollapseAll|tvCount|tvCurSel|tvData|tvDelete|tvExpand|tvExpandAll|tvPicture|tvPictureRight|tvSetColor|tvSetCurSel|tvSetData|tvSetPicture|tvSetPictureColor|tvSetPictureColorDisabled|tvSetPictureColorSelected|tvSetPictureRight|tvSetPictureRightColor|tvSetPictureRightColorDisabled|tvSetPictureRightColorSelected|tvSetSelectColor|tvSetText|tvSetTooltip|tvSetValue|tvSort|tvSortByValue|tvText|tvTooltip|tvValue|type|typeName|typeOf|UAVControl|uiNamespace|uiSleep|unassignCurator|unassignItem|unassignTeam|unassignVehicle|underwater|uniform|uniformContainer|uniformItems|uniformMagazines|unitAddons|unitAimPosition|unitAimPositionVisual|unitBackpack|unitIsUAV|unitPos|unitReady|unitRecoilCoefficient|units|unitsBelowHeight|unlinkItem|unlockAchievement|unregisterTask|updateDrawIcon|updateMenuItem|updateObjectTree|useAIOperMapObstructionTest|useAISteeringComponent|useAudioTimeForMoves|userInputDisabled|vectorAdd|vectorCos|vectorCrossProduct|vectorDiff|vectorDir|vectorDirVisual|vectorDistance|vectorDistanceSqr|vectorDotProduct|vectorFromTo|vectorMagnitude|vectorMagnitudeSqr|vectorModelToWorld|vectorModelToWorldVisual|vectorMultiply|vectorNormalized|vectorUp|vectorUpVisual|vectorWorldToModel|vectorWorldToModelVisual|vehicle|vehicleCargoEnabled|vehicleChat|vehicleRadio|vehicleReceiveRemoteTargets|vehicleReportOwnPosition|vehicleReportRemoteTargets|vehicles|vehicleVarName|velocity|velocityModelSpace|verifySignature|vest|vestContainer|vestItems|vestMagazines|viewDistance|visibleCompass|visibleGPS|visibleMap|visiblePosition|visiblePositionASL|visibleScoretable|visibleWatch|waitUntil|waves|waypointAttachedObject|waypointAttachedVehicle|waypointAttachObject|waypointAttachVehicle|waypointBehaviour|waypointCombatMode|waypointCompletionRadius|waypointDescription|waypointForceBehaviour|waypointFormation|waypointHousePosition|waypointLoiterRadius|waypointLoiterType|waypointName|waypointPosition|waypoints|waypointScript|waypointsEnabledUAV|waypointShow|waypointSpeed|waypointStatements|waypointTimeout|waypointTimeoutCurrent|waypointType|waypointVisible|weaponAccessories|weaponAccessoriesCargo|weaponCargo|weaponDirection|weaponInertia|weaponLowered|weapons|weaponsItems|weaponsItemsCargo|weaponState|weaponsTurret|weightRTD|west|WFSideText|wind|windDir|windRTD|windStr|wingsForcesRTD|worldName|worldSize|worldToModel|worldToModelVisual|worldToScreen)\b/i,number:/(?:\$|\b0x)[\da-f]+\b|(?:\B\.\d+|\b\d+(?:\.\d+)?)(?:e[+-]?\d+)?\b/i,operator:/##|>>|&&|\|\||[!=<>]=?|[-+*/%#^]|\b(?:and|mod|not|or)\b/i,"magic-variable":{pattern:/\b(?:this|thisList|thisTrigger|_exception|_fnc_scriptName|_fnc_scriptNameParent|_forEachIndex|_this|_thisEventHandler|_thisFSM|_thisScript|_x)\b/i,alias:"keyword"},constant:/\bDIK(?:_[a-z\d]+)+\b/i}),Prism.languages.insertBefore("sqf","string",{macro:{pattern:/(^[ \t]*)#[a-z](?:[^\r\n\\]|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{directive:{pattern:/#[a-z]+\b/i,alias:"keyword"},comment:Prism.languages.sqf.comment}}}),delete Prism.languages.sqf["class-name"];
+!function(e){e.languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var s=e.languages.extend("typescript",{});delete s["class-name"],e.languages.typescript["class-name"].inside=s,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:s}}}}),e.languages.ts=e.languages.typescript}(Prism);
+!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var o="line-numbers",a=/\n(?!$)/g,e=Prism.plugins.lineNumbers={getLine:function(e,n){if("PRE"===e.tagName&&e.classList.contains(o)){var t=e.querySelector(".line-numbers-rows");if(t){var i=parseInt(e.getAttribute("data-start"),10)||1,r=i+(t.children.length-1);n<i&&(n=i),r<n&&(n=r);var s=n-i;return t.children[s]}}},resize:function(e){u([e])},assumeViewportIndependence:!0},n=void 0;window.addEventListener("resize",function(){e.assumeViewportIndependence&&n===window.innerWidth||(n=window.innerWidth,u(Array.prototype.slice.call(document.querySelectorAll("pre."+o))))}),Prism.hooks.add("complete",function(e){if(e.code){var n=e.element,t=n.parentNode;if(t&&/pre/i.test(t.nodeName)&&!n.querySelector(".line-numbers-rows")&&Prism.util.isActive(n,o)){n.classList.remove(o),t.classList.add(o);var i,r=e.code.match(a),s=r?r.length+1:1,l=new Array(s+1).join("<span></span>");(i=document.createElement("span")).setAttribute("aria-hidden","true"),i.className="line-numbers-rows",i.innerHTML=l,t.hasAttribute("data-start")&&(t.style.counterReset="linenumber "+(parseInt(t.getAttribute("data-start"),10)-1)),e.element.appendChild(i),u([t]),Prism.hooks.run("line-numbers",e)}}}),Prism.hooks.add("line-numbers",function(e){e.plugins=e.plugins||{},e.plugins.lineNumbers=!0})}function u(e){if(0!=(e=e.filter(function(e){var n=function(e){return e?window.getComputedStyle?getComputedStyle(e):e.currentStyle||null:null}(e)["white-space"];return"pre-wrap"===n||"pre-line"===n})).length){var n=e.map(function(e){var n=e.querySelector("code"),t=e.querySelector(".line-numbers-rows");if(n&&t){var i=e.querySelector(".line-numbers-sizer"),r=n.textContent.split(a);i||((i=document.createElement("span")).className="line-numbers-sizer",n.appendChild(i)),i.innerHTML="0",i.style.display="block";var s=i.getBoundingClientRect().height;return i.innerHTML="",{element:e,lines:r,lineHeights:[],oneLinerHeight:s,sizer:i}}}).filter(Boolean);n.forEach(function(e){var i=e.sizer,n=e.lines,r=e.lineHeights,s=e.oneLinerHeight;r[n.length-1]=void 0,n.forEach(function(e,n){if(e&&1<e.length){var t=i.appendChild(document.createElement("span"));t.style.display="block",t.textContent=e}else r[n]=s})}),n.forEach(function(e){for(var n=e.sizer,t=e.lineHeights,i=0,r=0;r<t.length;r++)void 0===t[r]&&(t[r]=n.children[i++].getBoundingClientRect().height)}),n.forEach(function(e){var n=e.sizer,t=e.element.querySelector(".line-numbers-rows");n.style.display="none",n.innerHTML="",e.lineHeights.forEach(function(e,n){t.children[n].style.height=e+"px"})})}}}();
+!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var i=[],l={},d=function(){};Prism.plugins.toolbar={};var e=Prism.plugins.toolbar.registerButton=function(e,n){var t;t="function"==typeof n?n:function(e){var t;return"function"==typeof n.onClick?((t=document.createElement("button")).type="button",t.addEventListener("click",function(){n.onClick.call(this,e)})):"string"==typeof n.url?(t=document.createElement("a")).href=n.url:t=document.createElement("span"),n.className&&t.classList.add(n.className),t.textContent=n.text,t},e in l?console.warn('There is a button with the key "'+e+'" registered already.'):i.push(l[e]=t)},t=Prism.plugins.toolbar.hook=function(a){var e=a.element.parentNode;if(e&&/pre/i.test(e.nodeName)&&!e.parentNode.classList.contains("code-toolbar")){var t=document.createElement("div");t.classList.add("code-toolbar"),e.parentNode.insertBefore(t,e),t.appendChild(e);var r=document.createElement("div");r.classList.add("toolbar");var n=i,o=function(e){for(;e;){var t=e.getAttribute("data-toolbar-order");if(null!=t)return(t=t.trim()).length?t.split(/\s*,\s*/g):[];e=e.parentElement}}(a.element);o&&(n=o.map(function(e){return l[e]||d})),n.forEach(function(e){var t=e(a);if(t){var n=document.createElement("div");n.classList.add("toolbar-item"),n.appendChild(t),r.appendChild(n)}}),t.appendChild(r)}};e("label",function(e){var t=e.element.parentNode;if(t&&/pre/i.test(t.nodeName)&&t.hasAttribute("data-label")){var n,a,r=t.getAttribute("data-label");try{a=document.querySelector("template#"+r)}catch(e){}return a?n=a.content:(t.hasAttribute("data-url")?(n=document.createElement("a")).href=t.getAttribute("data-url"):n=document.createElement("span"),n.textContent=r),n}}),Prism.hooks.add("complete",t)}}();
+!function(){function u(t,e){t.addEventListener("click",function(){!function(t){navigator.clipboard?navigator.clipboard.writeText(t.getText()).then(t.success,function(){o(t)}):o(t)}(e)})}function o(e){var t=document.createElement("textarea");t.value=e.getText(),t.style.top="0",t.style.left="0",t.style.position="fixed",document.body.appendChild(t),t.focus(),t.select();try{var o=document.execCommand("copy");setTimeout(function(){o?e.success():e.error()},1)}catch(t){setTimeout(function(){e.error(t)},1)}document.body.removeChild(t)}"undefined"!=typeof Prism&&"undefined"!=typeof document&&(Prism.plugins.toolbar?Prism.plugins.toolbar.registerButton("copy-to-clipboard",function(t){var e=t.element,o=function(t){var e={copy:"复制","copy-error":"Press Ctrl+C to copy","copy-success":"已复制","copy-timeout":5e3};for(var o in e){for(var n="data-prismjs-"+o,c=t;c&&!c.hasAttribute(n);)c=c.parentElement;c&&(e[o]=c.getAttribute(n))}return e}(e),n=document.createElement("button");n.className="copy-to-clipboard-button",n.setAttribute("type","button");var c=document.createElement("span");return n.appendChild(c),i("copy"),u(n,{getText:function(){return e.textContent},success:function(){i("copy-success"),r()},error:function(){i("copy-error"),setTimeout(function(){!function(t){window.getSelection().selectAllChildren(t)}(e)},1),r()}}),n;function r(){setTimeout(function(){i("copy")},o["copy-timeout"])}function i(t){c.textContent=o[t],n.setAttribute("data-copy-state",t)}}):console.warn("Copy to Clipboard plugin loaded before Toolbar plugin."))}();
diff --git a/public/static/home/css/common.css b/public/static/home/css/common.css
new file mode 100644
index 0000000000000000000000000000000000000000..f21a34a25750be087046dc9de8e9f66fa3067816
--- /dev/null
+++ b/public/static/home/css/common.css
@@ -0,0 +1,1025 @@
+ /* 滚动条样式 */
+ ::-webkit-scrollbar {
+   width: 8px;
+ }
+ ::-webkit-scrollbar-thumb {
+   background-color:rgba(0,0,0,.15);background-clip:content-box;border:1px solid transparent;border-radius:8px
+ }
+ 
+::-webkit-scrollbar-track{background-color:transparent}
+::-webkit-scrollbar-track:hover{background-color:rgba(0,0,0,.04)}
+::-webkit-scrollbar-thumb:hover{background-color:rgba(0,0,0,.4);border:1px solid transparent}
+::-webkit-scrollbar-thumb:active{background-color:rgba(0,0,0,.65)}
+  
+ ::-moz-scrollbar {
+   width: 8px;
+   background-color: transparent;
+ }
+ ::-moz-scrollbar-thumb {
+   background-color: #c1c1c1;
+   border-radius: 8px;
+ }
+ body.right-open{overflow-y:clip;}
+ div.layui-table-main::-webkit-scrollbar{width:12px;height:12px}
+ div.layui-table-main::-webkit-scrollbar-thumb{min-width:12px;min-height:12px;background-color:rgba(0,0,0,.15);background-clip:content-box;border:2px solid transparent;border-radius:12px}
+ div.layui-table-main::-webkit-scrollbar-track{background-color:transparent}
+ div.layui-table-main::-webkit-scrollbar-track:hover{background-color:rgba(0,0,0,.04)}
+ div.layui-table-main::-webkit-scrollbar-thumb:hover{background-color:rgba(0,0,0,.4);border:2px solid transparent}
+ div.layui-table-main::-webkit-scrollbar-thumb:active{background-color:rgba(0,0,0,.65)}
+ /*placeholder*/
+ ::-webkit-input-placeholder { /* WebKit, Blink, Edge */
+     color:    #aaa;
+ }
+ :-moz-placeholder { /* Mozilla Firefox 4 to 18 */
+    color:    #aaa;
+ }
+ ::-moz-placeholder { /* Mozilla Firefox 19+ */
+    color:    #aaa;
+ }
+ :-ms-input-placeholder { /* Internet Explorer 10-11 */
+    color:    #aaa;
+ }
+ .layui-card { box-shadow: 0 1px 3px 0 rgb(5 32 96 / 10%); margin-bottom:12px!important;}
+ .layui-table, .layui-table-view{margin:0}
+ .layui-table td,.layui-table th{padding:9px 10px;}
+ .layui-table-cell{padding:0 10px;}
+ .layui-table[lay-size=sm] td, .layui-table[lay-size=sm] th {padding: 5px;}
+ .layui-form-bar{padding:12px;border:1px solid #eee; border-bottom:none;}
+ .auth-single .auth-icon{font-size:24px; float:left;}
+ .auth-single .layui-form-radio,.auth-single .layui-form-checkbox{margin-left:0;}
+ .auth-single .layui-form-radio{margin-top:0;}
+ .auth-single .layui-form-radio>i,.auth-single .layui-form-checkbox>i{font-size:20px;}
+ .layui-select-tags{padding:10px 0;}
+ .layui-tags-span{padding:5px 8px; font-size:14px; border-radius:3px; margin-bottom:6px; margin-right:6px; border:1px solid #e6e6e6; display:inline-block;cursor:pointer;}
+ .layui-readonly{background-color: #f5f5f5; color:#999;}
+ .layui-tags-span:hover{border:1px solid #ddd; background-color:#f2f2f2;}
+ .layui-tags-span i{margin-left:5px; font-size:14px;}
+ .layui-tags-span i:hover{border-radius:2px;background-color:#FF6347;color:#fff}
+ .layui-letter-span{padding:10px 5px; font-size:15px; display:inline-block; cursor:pointer;}
+ .layui-letter-span.on{color:#FF6347; font-weight:800;}
+ .layui-letter-span:hover{color:#4285f4;}
+ .layui-tags-all{float: right; font-weight: 200px; background-color:#4285f4; color:#fff; border-radius: 3px; padding: 2px 6px; cursor: pointer; display: none;}
+ .layui-table-form{margin-top: 0;}
+ .layui-table-form tbody tr:hover{background-color: #fff;}
+ .layui-td-gray{color:#999; width:80px; text-align:right; background-color:#f8f8f8;}
+ .layui-td-gray2{color:#999; width:100px; text-align:right; background-color:#f8f8f8;}
+ .layui-td-gray3{color:#999; width:120px; text-align:right; background-color:#f8f8f8;}
+ .layui-td-gray4{color:#999; width:150px; text-align:right; background-color:#f8f8f8;}
+ .layui-td-gray font,.layui-td-gray2 font,.layui-td-gray3 font{color:#FF6347; margin-left: 3px;}
+ .main-body{padding:12px;padding-bottom: 0; min-width: 868px;}
+ .body-content{background-color:#fff; padding:10px 12px;}
+ .body-table{background-color:#fff; margin-bottom:12px}
+ .h3-title{font-size:18px; height:39px; font-weight:800}
+ .h3-title2{font-size:18px; height:39px; font-weight:800; padding-top:20px}
+ .body-form-btn{padding:10px 0;}
+ .span-color--1{color:#999999;}
+ .span-color-0{color:#5FB878;}
+ .span-color-1{color:#FF6347;}
+ .span-color-2{color:#01AAED;}
+ .span-color-3{color:#d89d00;}
+ .span-color-4{color:#CC0033;}
+ .span-color-5{color:#CCCC00;}
+ .span-color-6{color:#FF33CC;}
+ .span-color-7{color:#6699FF;}
+ .span-color-8{color:#CC9933;}
+.layui-tab-title .layui-this:after {width:calc(100% - 35px );left:12px; min-width:65px;}
+ 
+@keyframes layui-rl{
+    from{transform:translateX(0px);}to{transform:translateX(-100%);}
+}
+@-webkit-keyframes layui-rl{
+    from{transform:translateX(0px);}to{transform:translateX(-100%);}
+}
+.layui-anim {
+    -webkit-animation-duration: .3s;
+    animation-duration: .3s;
+    -webkit-animation-fill-mode: both;
+    animation-fill-mode: both;
+}
+.layui-anim-rl {
+    -webkit-animation-name: layui-rl;
+    animation-name: layui-rl;
+}
+.layui-layer-admin-right {
+    box-shadow: 1px 1px 10px rgba(0,0,0,.1);
+    border-radius: 0!important;
+    overflow: auto;
+}
+.layui-anim-rl.layui-layer-iframe{
+	overflow:initial!important;
+}
+.right-popup-close{position: absolute;width:24px;height:60px; padding:30px 6px; line-height:30px;text-align:center; left: -38px;right:0; top: 20%;background-color:#FF5722;color:#fff;border-radius:6px 0 0 6px; cursor:pointer; border:2px solid #fff; border-right:none; font-weight:600; font-size:14px;}
+.right-popup-close:hover{opacity:0.88}
+.page-content{background-color:#fff;}
+
+
+@font-face {
+  font-family: "iconfont"; /* Project id 2936988 */
+  src: url('/static/layui/font/extend/iconfont.woff2?t=1636884517050') format('woff2'),
+       url('/static/layui/font/extend/iconfont.woff?t=1636884517050') format('woff'),
+       url('/static/layui/font/extend/iconfont.ttf?t=1636884517050') format('truetype');
+}
+
+.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-xueshengyidong:before {
+  content: "\e6e9";
+}
+
+.icon-baokao:before {
+  content: "\e6ea";
+}
+
+.icon-chengji:before {
+  content: "\e6eb";
+}
+
+.icon-yuejuan:before {
+  content: "\e6ec";
+}
+
+.icon-kaoheshezhi:before {
+  content: "\e6ed";
+}
+
+.icon-lunwenguanli:before {
+  content: "\e6ee";
+}
+
+.icon-shenbao:before {
+  content: "\e6ef";
+}
+
+.icon-kecheng:before {
+  content: "\e6f0";
+}
+
+.icon-tiku:before {
+  content: "\e6f1";
+}
+
+.icon-jiaowushezhi:before {
+  content: "\e6f2";
+}
+
+.icon-zidingyishezhi:before {
+  content: "\e6f3";
+}
+
+.icon-chaojitongji:before {
+  content: "\e6f4";
+}
+
+.icon-zhaoshengtongji:before {
+  content: "\e6f5";
+}
+
+.icon-tuiguangtongji:before {
+  content: "\e6f6";
+}
+
+.icon-xuexitongji:before {
+  content: "\e6f7";
+}
+
+.icon-diqushujutongji:before {
+  content: "\e6f8";
+}
+
+.icon-shujudaoru:before {
+  content: "\e6f9";
+}
+
+.icon-chengkaoguanli:before {
+  content: "\e6fb";
+}
+
+.icon-yuanchengguanli:before {
+  content: "\e6fe";
+}
+
+.icon-shujiguanli:before {
+  content: "\e6ff";
+}
+
+.icon-guochengxingkaohe:before {
+  content: "\e700";
+}
+
+.icon-xuefenrending:before {
+  content: "\e701";
+}
+
+.icon-kechengdingdan:before {
+  content: "\e702";
+}
+
+.icon-wentifankui:before {
+  content: "\e703";
+}
+
+.icon-zichan:before {
+  content: "\e704";
+}
+
+.icon-KPIguanli:before {
+  content: "\e705";
+}
+
+.icon-xiangmuguanli:before {
+  content: "\e706";
+}
+
+.icon-weixingongzhonghao:before {
+  content: "\e707";
+}
+
+.icon-anquanshezhi:before {
+  content: "\e708";
+}
+
+.icon-fuwuzhongxin:before {
+  content: "\e709";
+}
+
+.icon-qiyefuwu:before {
+  content: "\e70a";
+}
+
+.icon-wangkefuwu:before {
+  content: "\e70b";
+}
+
+.icon-shoufeiguanli:before {
+  content: "\e70c";
+}
+
+.icon-quanxianshezhi:before {
+  content: "\e70d";
+}
+
+.icon-jiaowutongji:before {
+  content: "\e70f";
+}
+
+.icon-jiaoxuetongji:before {
+  content: "\e710";
+}
+
+.icon-shoufeitongji:before {
+  content: "\e711";
+}
+
+.icon-fuwutongji:before {
+  content: "\e713";
+}
+
+.icon-tongzhitongji:before {
+  content: "\e714";
+}
+
+.icon-kaohetongji:before {
+  content: "\e715";
+}
+
+.icon-yonghuhuoyuedu:before {
+  content: "\e716";
+}
+
+.icon-xueshengbaoming:before {
+  content: "\e717";
+}
+
+.icon-xueshengluqu:before {
+  content: "\e718";
+}
+
+.icon-xueshengzhuce:before {
+  content: "\e719";
+}
+
+.icon-zaijixuesheng:before {
+  content: "\e71a";
+}
+
+.icon-huamingce:before {
+  content: "\e71b";
+}
+
+.icon-fenleiguanli:before {
+  content: "\e71c";
+}
+
+.icon-fuwuliebiao:before {
+  content: "\e71d";
+}
+
+.icon-fenleiliebiao:before {
+  content: "\e71e";
+}
+
+.icon-tongzhiliebiao:before {
+  content: "\e71f";
+}
+
+.icon-jiaoxuejihua:before {
+  content: "\e720";
+}
+
+.icon-jiaoxueanpai:before {
+  content: "\e721";
+}
+
+.icon-chengjiguanli:before {
+  content: "\e722";
+}
+
+.icon-tupianguanli:before {
+  content: "\e723";
+}
+
+.icon-kaoshijihua:before {
+  content: "\e724";
+}
+
+.icon-kaoshipeizhi:before {
+  content: "\e725";
+}
+
+.icon-xuexizhongxinguanli:before {
+  content: "\e726";
+}
+
+.icon-kaoheguanli:before {
+  content: "\e728";
+}
+
+.icon-jiaoshiguanli:before {
+  content: "\e729";
+}
+
+.icon-wangkeguanli:before {
+  content: "\e72a";
+}
+
+.icon-bulujiesuan:before {
+  content: "\e72b";
+}
+
+.icon-biyeguanli:before {
+  content: "\e72c";
+}
+
+.icon-kaohezhibiao:before {
+  content: "\e72d";
+}
+
+.icon-qiyeguanli:before {
+  content: "\e77e";
+}
+
+.icon-chubuguanli:before {
+  content: "\e77f";
+}
+
+.icon-hujiaobaobiao:before {
+  content: "\e780";
+}
+
+.icon-saomiaodianjing:before {
+  content: "\e781";
+}
+
+.icon-jiezhang:before {
+  content: "\e782";
+}
+
+.icon-xiaoshoubaobiao:before {
+  content: "\e783";
+}
+
+.icon-pingzheng:before {
+  content: "\e784";
+}
+
+.icon-hetongyidong:before {
+  content: "\e785";
+}
+
+.icon-xiaoshoupin:before {
+  content: "\e787";
+}
+
+.icon-xueshuguanli:before {
+  content: "\e788";
+}
+
+.icon-yihaopin:before {
+  content: "\e789";
+}
+
+.icon-renwuguanli:before {
+  content: "\e78a";
+}
+
+.icon-dianshang:before {
+  content: "\e78b";
+}
+
+.icon-mingpianbaobiao_1:before {
+  content: "\e78c";
+}
+
+.icon-gudingzichan:before {
+  content: "\e78d";
+}
+
+.icon-dongtaiguanli:before {
+  content: "\e78e";
+}
+
+.icon-jichupeizhi:before {
+  content: "\e78f";
+}
+
+.icon-hujiaotongji:before {
+  content: "\e790";
+}
+
+.icon-xiaoshoubaobiao_1:before {
+  content: "\e791";
+}
+
+.icon-dashuju:before {
+  content: "\e792";
+}
+
+.icon-huodongguanli:before {
+  content: "\e793";
+}
+
+.icon-hujiaoshezhi:before {
+  content: "\e794";
+}
+
+.icon-fenxiaoshichang:before {
+  content: "\e795";
+}
+
+.icon-chengjitongji:before {
+  content: "\e796";
+}
+
+.icon-tuiguangshezhi:before {
+  content: "\e797";
+}
+
+.icon-kechengzhongxin:before {
+  content: "\e798";
+}
+
+.icon-hetongshezhi:before {
+  content: "\e799";
+}
+
+.icon-kechengbaoguanli:before {
+  content: "\e79a";
+}
+
+.icon-yonghuguanli:before {
+  content: "\e79b";
+}
+
+.icon-yonghuhuaxiang:before {
+  content: "\e79c";
+}
+
+.icon-zhanghaoguanli:before {
+  content: "\e79d";
+}
+
+.icon-SEMguanli:before {
+  content: "\e79e";
+}
+
+.icon-yusuan:before {
+  content: "\e79f";
+}
+
+.icon-mingpianbaobiao:before {
+  content: "\e7a0";
+}
+
+.icon-dingdanguanli:before {
+  content: "\e7a1";
+}
+
+.icon-tuiguangguanli:before {
+  content: "\e7a2";
+}
+
+.icon-zhuantiguanli:before {
+  content: "\e7a3";
+}
+
+.icon-xinxiliu:before {
+  content: "\e7a4";
+}
+
+.icon-xiaoshoushezhi:before {
+  content: "\e7a5";
+}
+
+.icon-sucaiguanli:before {
+  content: "\e7a9";
+}
+
+.icon-xueshengdaoru:before {
+  content: "\e7aa";
+}
+
+.icon-shangpinguanli:before {
+  content: "\e7ab";
+}
+
+.icon-paikeguanli:before {
+  content: "\e7ac";
+}
+
+.icon-xinxidaoru:before {
+  content: "\e7ad";
+}
+
+.icon-shoufeipeizhi:before {
+  content: "\e7ae";
+}
+
+.icon-yonghuquanxian:before {
+  content: "\e7af";
+}
+
+.icon-zaijixueshengguanli:before {
+  content: "\e7b0";
+}
+
+.icon-xuehaoguanli:before {
+  content: "\e7b1";
+}
+
+.icon-kechengziyuanguanli:before {
+  content: "\e7b2";
+}
+
+.icon-mianshoujiaoxueanpai:before {
+  content: "\e7b3";
+}
+
+.icon-zhangfang:before {
+  content: "\e7b4";
+}
+
+.icon-kaikeguanli:before {
+  content: "\e7b5";
+}
+
+.icon-biyetongji:before {
+  content: "\e7b6";
+}
+
+.icon-zhaoshengzhunbei:before {
+  content: "\e7b8";
+}
+
+.icon-paikeshezhi:before {
+  content: "\e7b9";
+}
+
+.icon-banjiguanli:before {
+  content: "\e7ba";
+}
+
+.icon-jingpinketang:before {
+  content: "\e7bb";
+}
+
+.icon-yuangongtidian:before {
+  content: "\e7bc";
+}
+
+.icon-kaoshianpai:before {
+  content: "\e7bd";
+}
+
+.icon-wangluojiaoxueanpai:before {
+  content: "\e7bf";
+}
+
+.icon-ruxuechengji:before {
+  content: "\e7c3";
+}
+
+.icon-mianshoujiaoxue:before {
+  content: "\e7c6";
+}
+
+.icon-jiaoshijiaoshiguanli:before {
+  content: "\e7c7";
+}
+
+.icon-luquguanli:before {
+  content: "\e7c8";
+}
+
+.icon-luquchengji:before {
+  content: "\e7c9";
+}
+
+.icon-ziyuan:before {
+  content: "\e7ca";
+}
+
+.icon-kejian:before {
+  content: "\e7cc";
+}
+
+.icon-waibukejian:before {
+  content: "\e7cd";
+}
+
+.icon-rizhiguanli:before {
+  content: "\e7ce";
+}
+
+.icon-mobanguanli:before {
+  content: "\e7cf";
+}
+
+.icon-xuelirenzheng:before {
+  content: "\e7d1";
+}
+
+.icon-yiyichuli:before {
+  content: "\e7d2";
+}
+
+.icon-lunwenshenbao:before {
+  content: "\e7d3";
+}
+
+.icon-lunwenshezhi:before {
+  content: "\e7d4";
+}
+
+.icon-jiaoxuedianshezhi:before {
+  content: "\e7d5";
+}
+
+.icon-buluchenjiang:before {
+  content: "\e7d6";
+}
+
+.icon-mokuaishezhi:before {
+  content: "\e7d7";
+}
+
+.icon-ziliaoguanli:before {
+  content: "\e7d8";
+}
+
+.icon-jituanguanli:before {
+  content: "\e7d9";
+}
+
+.icon-yingyongguanli:before {
+  content: "\e7da";
+}
+
+.icon-guanwangshijuan:before {
+  content: "\e7db";
+}
+
+.icon-wodewangke:before {
+  content: "\e7dc";
+}
+
+.icon-jiaobenguanli:before {
+  content: "\e7dd";
+}
+
+.icon-zhuanyeguanliyuan:before {
+  content: "\e7de";
+}
+
+.icon-xueshengchengji:before {
+  content: "\e7df";
+}
+
+.icon-fuwuguanli:before {
+  content: "\e7e2";
+}
+
+.icon-daijinquan:before {
+  content: "\e7e3";
+}
+
+.icon-hujiaozhongxin:before {
+  content: "\e7e4";
+}
+
+.icon-yinjinshoufei:before {
+  content: "\e7e5";
+}
+
+.icon-yingjiaoqingdan:before {
+  content: "\e7e6";
+}
+
+.icon-duizhangdan:before {
+  content: "\e7e7";
+}
+
+.icon-shangjiguanli:before {
+  content: "\e7e8";
+}
+
+.icon-qiyehuihuacundang:before {
+  content: "\e7e9";
+}
+
+.icon-yonghushezhi:before {
+  content: "\e7ea";
+}
+
+.icon-xiaoxishezhi:before {
+  content: "\e7ec";
+}
+
+.icon-yingxiaoshezhi:before {
+  content: "\e7ed";
+}
+
+.icon-fuwushichang:before {
+  content: "\e7ee";
+}
+
+.icon-sucaiziyuan:before {
+  content: "\e7ef";
+}
+
+.icon-yingxiaowanfa:before {
+  content: "\e7f0";
+}
+
+.icon-tuiguang:before {
+  content: "\e7f1";
+}
+
+.icon-yonghuliebiao:before {
+  content: "\e7f2";
+}
+
+.icon-ziyuanguanli:before {
+  content: "\e692";
+}
+
+.icon-kechengguanli:before {
+  content: "\e693";
+}
+
+.icon-kechengbao:before {
+  content: "\e694";
+}
+
+.icon-tikuguanli:before {
+  content: "\e695";
+}
+
+.icon-wangkeshichang:before {
+  content: "\e696";
+}
+
+.icon-gongdan:before {
+  content: "\e697";
+}
+
+.icon-fangkeguanli:before {
+  content: "\e698";
+}
+
+.icon-xiansuoguanli:before {
+  content: "\e699";
+}
+
+.icon-kehuguanli:before {
+  content: "\e69a";
+}
+
+.icon-jituankehu:before {
+  content: "\e69b";
+}
+
+.icon-genjinjilu:before {
+  content: "\e69c";
+}
+
+.icon-hujiaoguanli:before {
+  content: "\e69d";
+}
+
+.icon-gongzuotai:before {
+  content: "\e69e";
+}
+
+.icon-shujubaobiao:before {
+  content: "\e69f";
+}
+
+.icon-fangkebaobiao:before {
+  content: "\e6a0";
+}
+
+.icon-zhangbuguanli:before {
+  content: "\e6a1";
+}
+
+.icon-zhangbuguanli_zi:before {
+  content: "\e6a2";
+}
+
+.icon-zhangbuguanli_zixitong_A:before {
+  content: "\e6a3";
+}
+
+.icon-hetongguanli:before {
+  content: "\e6a4";
+}
+
+.icon-yunyingzheguanli:before {
+  content: "\e6a5";
+}
+
+.icon-zhaopinguanli:before {
+  content: "\e6a6";
+}
+
+.icon-gongziguanli:before {
+  content: "\e6a7";
+}
+
+.icon-wodeshenpi:before {
+  content: "\e6a8";
+}
+
+.icon-biaozhunmobanshezhi:before {
+  content: "\e6a9";
+}
+
+.icon-jichushezhi:before {
+  content: "\e6aa";
+}
+
+.icon-caiwushezhi:before {
+  content: "\e6ab";
+}
+
+.icon-chanpinshezhi:before {
+  content: "\e6ac";
+}
+
+.icon-shenpishezhi:before {
+  content: "\e6ad";
+}
+
+.icon-mubiaoguanli:before {
+  content: "\e6ae";
+}
+
+.icon-zhandianshezhi:before {
+  content: "\e6af";
+}
+
+.icon-renshishezhi:before {
+  content: "\e6b0";
+}
+
+.icon-CRMshezhi:before {
+  content: "\e6b1";
+}
+
+.icon-mingpianshezhi:before {
+  content: "\e6b2";
+}
+
+.icon-wangxiaoshezhi:before {
+  content: "\e6b3";
+}
+
+.icon-wodedianping:before {
+  content: "\e6b4";
+}
+
+.icon-wodexuesheng:before {
+  content: "\e6b5";
+}
+
+.icon-lianxijilu:before {
+  content: "\e6b8";
+}
+
+.icon-tousutiwen:before {
+  content: "\e6b9";
+}
+
+.icon-peixunjihua:before {
+  content: "\e6ba";
+}
+
+.icon-feiyongchaxun:before {
+  content: "\e6bb";
+}
+
+.icon-xueshengjiaofei:before {
+  content: "\e6bc";
+}
+
+.icon-jizhang:before {
+  content: "\e6bd";
+}
+
+.icon-chaxun:before {
+  content: "\e6be";
+}
+
+.icon-chazhang:before {
+  content: "\e6bf";
+}
+
+.icon-baobiao:before {
+  content: "\e6c0";
+}
+
+.icon-shezhi:before {
+  content: "\e6c2";
+}
+
+.icon-daqiajilu:before {
+  content: "\e6ce";
+}
+
+.icon-wangluobanji:before {
+  content: "\e6d3";
+}
+
+.icon-wangxiaoshezhi1:before {
+  content: "\e6d6";
+}
+
+.icon-houtaishezhi:before {
+  content: "\e6d8";
+}
+
+.icon-zhaoshengshezhi:before {
+  content: "\e6db";
+}
+
+.icon-xiaoxizhongxin:before {
+  content: "\e6df";
+}
+
+.icon-zhaoshengbaobiao:before {
+  content: "\e6e1";
+}
+
+.icon-caidanguanli:before {
+  content: "\e6e2";
+}
+
+.icon-jituanshezhi:before {
+  content: "\e6e3";
+}
+
+.icon-shichangguanli:before {
+  content: "\e6e4";
+}
+
+.icon-chuangjianxitong:before {
+  content: "\e6e5";
+}
+
+.icon-gongdanguanli:before {
+  content: "\e6e6";
+}
+
+.icon-duanxin:before {
+  content: "\e6e7";
+}
+
+.icon-bangzhuzhongxin:before {
+  content: "\e6e8";
+}
\ No newline at end of file
diff --git a/public/static/home/css/gougucms.css b/public/static/home/css/gougucms.css
new file mode 100644
index 0000000000000000000000000000000000000000..bef690e137bc3b24e5a3f58308e29b8607354dfa
--- /dev/null
+++ b/public/static/home/css/gougucms.css
@@ -0,0 +1,77 @@
+.main-body{padding:0;min-width: 1220px;
+-moz-user-select: none; /*火狐*/
+-webkit-user-select: none; /*webkit浏览器*/
+-ms-user-select: none; /*IE10*/
+-khtml-user-select: none; /*早期浏览器*/
+user-select: none;}
+.layui-layout-admin .layui-header {height:49px;background-color:#fff;box-shadow: 0 2px 6px 0 rgb(5 32 96 / 10%);}
+.layui-layout-admin .layui-logo {line-height:49px;cursor:pointer;font-size:16px;color:#fff;background:#001529;width:200px;border-bottom: 1px solid #001529;}
+.layui-layout-admin .layui-side {top:50px;width:200px;border-right:1px solid #ddd;}
+.layui-header .layui-nav-item {line-height:49px; height:49px; border-left: 1px solid #eee;position: relative;display: inline-block; *display: inline; *zoom: 1; vertical-align: middle;}
+.layui-header .layui-nav-item a{padding: 0 12px; text-align: center; min-width: 24px;}
+.layui-header.layui-layout-left {color:#333;margin-left:10px;}
+.layui-header.layui-layout-left input {border:0;}
+.layui-header .layui-nav-bar {display:none;}
+.layui-layout-right{padding: 0 3px; background-color:#fff;}
+.layui-header .layui-nav-item #ittab-refresh {color:#000;}
+.layui-header .layui-nav-item #ittab-refresh i {font-size:16px;}
+.layui-header .layui-nav-item #ittab-del-cache{color:#000}
+.layui-header .layui-nav-item #ittab-del-cache i{font-size:16px}
+.layui-header.layui-layout-right .layui-nav-bar {background-color: #fff;}
+.layui-tab-brief>.layui-tab-more li.layui-this:after {border-bottom: 0;}
+.layui-nav-img {width:25px;height:25px;margin-right:0;}
+.layui-header .msg-num { min-width: 18px;height: 18px;position: absolute;top: -10px;right: 5px;display: none;}
+.layui-header .msg-num a {min-width: 18px; height: 18px; margin: 0; padding: 0; display: inline-block; font-size: 11px;line-height: 18px;text-align: center; background-color: #FF5722; color: #fff;border-radius: 12px; cursor: pointer;}
+
+
+.layui-layout-admin .layui-body {top:50px; z-index:1008; padding:0;padding-right:0;padding-bottom:0;bottom:0;left:200px;overflow:visible;right:0;background-color:#F5F8FA;}
+
+.menulist-bg-gray{background-color:#001529;}
+.menulist {width:100%;height:100%; border-right:1px solid #ccc; font-size:14px; color:#aaaaaa;}
+.layui-side.menulist-bg-gray::-webkit-scrollbar{width: 0; height: 0;}
+.menulist-top {padding: 10px 12px; font-size:0; border-bottom: 1px solid #17232c; text-align:center;}
+.menulist-top a {background-color:#34a853; opacity:1; width: 25%; margin:0; padding: 5px 0; display:inline-block;}
+.menulist-top .layui-icon {color:#fff;font-size:16px;}
+.menulist-top a:first-child {border-radius: 3px 0 0 3px;}
+.menulist-top a:last-child {border-radius: 0 3px 3px 0;}
+.menulist-top a:hover{opacity: .9;}
+.menulist .layui-nav{background-color:#001529;}
+.menulist .layui-nav-tree .layui-nav-bar{width:4px;background-color:#E94335}
+.layui-nav-tree .layui-nav-child{padding:0;}
+.layui-nav-tree .layui-nav-child dd.layui-this, .layui-nav-tree .layui-nav-child dd.layui-this a, .layui-nav-tree .layui-this, .layui-nav-tree .layui-this>a, .layui-nav-tree .layui-this>a:hover{background-color:#131E25}
+.layui-nav .layui-nav-item a{padding-left:12px;}
+.layui-nav .layui-nav-item a.menu-b{padding-left:32px;}
+.layui-nav .layui-nav-item a.menu-c{padding-left:45px;}
+.layui-nav .layui-nav-item a.menu-d{padding-left:58px;}
+
+.gougu-admin-tab {margin:0;}
+.gougu-admin-tab .layui-icon-prev,.gougu-admin-tab .layui-icon-next {position:absolute;top:-50px; width:39px; height:49px; line-height:49px; color: #999; text-align:center; cursor:pointer; background-color:#fff;}
+.gougu-admin-tab .layui-icon-prev{left:0; border-right: 1px solid #eee;}
+.gougu-admin-tab .layui-icon-next {right:152px; border-left: 1px solid #eee;}
+.gougu-admin-tab .layui-icon-prev:hover,.gougu-admin-tab .layui-icon-next:hover{color: #333;}
+
+.gougu-admin-tab .layui-tab-title {position:absolute;top:-50px; z-index:58; height:49px;left:40px; border:0;max-width:calc(100% - 226px); overflow:hidden;}
+.gougu-admin-tab .layui-tab-title li {min-width:36px; padding:0 24px 0 12px; color:#666;font-size:12px;line-height:48px;border-top:3px solid #fff; border-right: 1px solid #F5F8FA; background-color:#fff;}
+.gougu-admin-tab .layui-tab-title li .gougu-tab-active {display: inline-block; background-color: #999; width: 8px; height: 8px; border-radius: 20px; margin-right: 6px;}
+.gougu-admin-tab .layui-tab-title li .layui-tab-close {position:absolute;width:15px;height:15px;line-height:16px;top:16px;right:5px;font-size:10px;display:none;border-radius:50%;}
+
+.gougu-admin-tab .layui-tab-title li:hover {color:#333;background-color:#F5F8FA;border-top:3px solid #333;}
+.gougu-admin-tab .layui-tab-title li:hover .gougu-tab-active {background-color:#333}
+.gougu-admin-tab .layui-tab-title li:hover .layui-tab-close {display:inline-block;}
+
+.gougu-admin-tab .layui-tab-title li .layui-tab-close:hover {background-color:#E94335;color:#fff;}
+
+.gougu-admin-tab .layui-tab-title li.layui-this {color:#333;background-color:#F5F8FA;border-top:3px solid #E94335;}
+.gougu-admin-tab .layui-tab-title li.layui-this .gougu-tab-active{background-color:#E94335;}
+.gougu-admin-tab .layui-tab-title li.layui-this .layui-tab-close{display:inline-block;}
+
+.gougu-admin-tab .layui-tab-title li.ittab-tab-home{padding:0 16px;}
+.gougu-admin-tab .layui-tab-title li.ittab-tab-home .layui-tab-close {display:none;}
+.gougu-admin-tab .layui-tab-title li.ittab-tab-home:hover .layui-tab-close {display:none;}
+
+.gougu-admin-tab .layui-tab-brief>.layui-tab-more li.layui-this:after,.layui-tab-brief>.layui-tab-title .layui-this:after {border:0;}
+.gougu-admin-tab .layui-tab-item {height:100%;}
+.gougu-admin-tab .layui-tab-bar {height: 50px;border-width: 0;line-height: 50px;}
+
+.layui-layout-admin .layui-footer {left:200px;height:30px;line-height:30px;background-color:#f0f0f0;font-size:12px;}
+.layui-tab-content {padding:0px;}
\ No newline at end of file
diff --git a/public/static/home/file/msg.mp3 b/public/static/home/file/msg.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..8d576b6c7146001199bee8f5ee7c84184efe0f0d
Binary files /dev/null and b/public/static/home/file/msg.mp3 differ
diff --git a/public/static/home/file/oa_area.sql b/public/static/home/file/oa_area.sql
new file mode 100644
index 0000000000000000000000000000000000000000..5cbf47bd9abcbf32eefae6a9c8a46db2b03cd10e
--- /dev/null
+++ b/public/static/home/file/oa_area.sql
@@ -0,0 +1,3667 @@
+-- ----------------------------
+-- Table structure for oa_area
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_area`;
+CREATE TABLE `oa_area` (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `pid` int(11) NOT NULL DEFAULT 0 COMMENT '父级',
+  `name` varchar(50) NOT NULL DEFAULT '' COMMENT '名称',
+  shortname varchar(30) NOT NULL DEFAULT '' COMMENT '简称',
+  longitude varchar(30) NOT NULL DEFAULT '' COMMENT '经度',
+  latitude varchar(30) NOT NULL DEFAULT '' COMMENT '纬度',
+  level smallint(6) NOT NULL DEFAULT 0 COMMENT '级别',
+  sort mediumint(9) NOT NULL DEFAULT 0 COMMENT '排序',
+  status tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态:默认1有效',
+  PRIMARY KEY (id)
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '中国省市区数据表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of oa_area
+-- ----------------------------
+INSERT INTO oa_area VALUES
+(110000, 0, '北京市', '北京', '116.40529', '39.904987', 1, 0, 1),
+(110100, 110000, '北京市', '北京', '116.40529', '39.904987', 2, 0, 1),
+(110101, 110100, '东城区', '东城', '116.418755', '39.917545', 3, 0, 1),
+(110102, 110100, '西城区', '西城', '116.36679', '39.91531', 3, 0, 1),
+(110105, 110100, '朝阳区', '朝阳', '116.48641', '39.92149', 3, 0, 1),
+(110106, 110100, '丰台区', '丰台', '116.286964', '39.863644', 3, 0, 1),
+(110107, 110100, '石景山区', '石景山', '116.19544', '39.9146', 3, 0, 1),
+(110108, 110100, '海淀区', '海淀', '116.31032', '39.956074', 3, 0, 1),
+(110109, 110100, '门头沟区', '门头沟', '116.10538', '39.937183', 3, 0, 1),
+(110111, 110100, '房山区', '房山', '116.13916', '39.735535', 3, 0, 1),
+(110112, 110100, '通州区', '通州', '116.6586', '39.902485', 3, 0, 1),
+(110113, 110100, '顺义区', '顺义', '116.65353', '40.128937', 3, 0, 1),
+(110114, 110100, '昌平区', '昌平', '116.23591', '40.218086', 3, 0, 1),
+(110115, 110100, '大兴区', '大兴', '116.338036', '39.72891', 3, 0, 1),
+(110116, 110100, '怀柔区', '怀柔', '116.63712', '40.324272', 3, 0, 1),
+(110117, 110100, '平谷区', '平谷', '117.112335', '40.144783', 3, 0, 1),
+(110118, 110100, '密云区', '密云', '116.84317', '40.37625', 3, 0, 1),
+(110119, 110100, '延庆区', '延庆', '115.97503', '40.45678', 3, 0, 1),
+(120000, 0, '天津市', '天津', '117.190186', '39.125595', 1, 0, 1),
+(120100, 120000, '天津市', '天津', '117.190186', '39.125595', 2, 0, 1),
+(120101, 120100, '和平区', '和平', '117.19591', '39.11833', 3, 0, 1),
+(120102, 120100, '河东区', '河东', '117.22657', '39.122124', 3, 0, 1),
+(120103, 120100, '河西区', '河西', '117.21754', '39.1019', 3, 0, 1),
+(120104, 120100, '南开区', '南开', '117.16415', '39.120476', 3, 0, 1),
+(120105, 120100, '河北区', '河北', '117.20157', '39.15663', 3, 0, 1),
+(120106, 120100, '红桥区', '红桥', '117.1633', '39.175068', 3, 0, 1),
+(120110, 120100, '东丽区', '东丽', '117.313965', '39.087765', 3, 0, 1),
+(120111, 120100, '西青区', '西青', '117.012245', '39.139446', 3, 0, 1),
+(120112, 120100, '津南区', '津南', '117.382545', '38.98958', 3, 0, 1),
+(120113, 120100, '北辰区', '北辰', '117.13482', '39.225555', 3, 0, 1),
+(120114, 120100, '武清区', '武清', '117.05796', '39.376926', 3, 0, 1),
+(120115, 120100, '宝坻区', '宝坻', '117.30809', '39.716965', 3, 0, 1),
+(120116, 120100, '滨海新区', '滨海', '117.654175', '39.032845', 3, 0, 1),
+(120117, 120100, '宁河区', '宁河', '117.82478', '39.33091', 3, 0, 1),
+(120118, 120100, '静海区', '静海', '116.97428', '38.94737', 3, 0, 1),
+(120119, 120100, '蓟州区', '蓟州', '117.40829', '40.04577', 3, 0, 1),
+(130000, 0, '河北省', '河北', '114.502464', '38.045475', 1, 0, 1),
+(130100, 130000, '石家庄市', '石家庄', '114.502464', '38.045475', 2, 0, 1),
+(130102, 130100, '长安区', '长安', '114.54815', '38.0475', 3, 0, 1),
+(130104, 130100, '桥西区', '桥西', '114.46293', '38.02838', 3, 0, 1),
+(130105, 130100, '新华区', '新华', '114.46597', '38.067142', 3, 0, 1),
+(130107, 130100, '井陉矿区', '井陉矿', '114.05818', '38.069748', 3, 0, 1),
+(130108, 130100, '裕华区', '裕华', '114.53326', '38.027695', 3, 0, 1),
+(130109, 130100, '藁城区', '藁城', '114.84676', '38.02166', 3, 0, 1),
+(130110, 130100, '鹿泉区', '鹿泉', '114.31344', '38.08587', 3, 0, 1),
+(130111, 130100, '栾城区', '栾城', '114.64839', '37.90025', 3, 0, 1),
+(130121, 130100, '井陉县', '井陉', '114.144485', '38.033615', 3, 0, 1),
+(130123, 130100, '正定县', '正定', '114.569885', '38.147835', 3, 0, 1),
+(130125, 130100, '行唐县', '行唐', '114.552734', '38.437424', 3, 0, 1),
+(130126, 130100, '灵寿县', '灵寿', '114.37946', '38.306545', 3, 0, 1),
+(130127, 130100, '高邑县', '高邑', '114.6107', '37.605713', 3, 0, 1),
+(130128, 130100, '深泽县', '深泽', '115.20021', '38.18454', 3, 0, 1),
+(130129, 130100, '赞皇县', '赞皇', '114.38776', '37.6602', 3, 0, 1),
+(130130, 130100, '无极县', '无极', '114.977844', '38.176376', 3, 0, 1),
+(130131, 130100, '平山县', '平山', '114.18414', '38.25931', 3, 0, 1),
+(130132, 130100, '元氏县', '元氏', '114.52618', '37.762512', 3, 0, 1),
+(130133, 130100, '赵县', '赵县', '114.77536', '37.75434', 3, 0, 1),
+(130181, 130100, '辛集市', '辛集', '115.21745', '37.92904', 3, 0, 1),
+(130183, 130100, '晋州市', '晋州', '115.04488', '38.027477', 3, 0, 1),
+(130184, 130100, '新乐市', '新乐', '114.68578', '38.34477', 3, 0, 1),
+(130200, 130000, '唐山市', '唐山', '118.17539', '39.635113', 2, 0, 1),
+(130202, 130200, '路南区', '路南', '118.21082', '39.61516', 3, 0, 1),
+(130203, 130200, '路北区', '路北', '118.174736', '39.628536', 3, 0, 1),
+(130204, 130200, '古冶区', '古冶', '118.45429', '39.715736', 3, 0, 1),
+(130205, 130200, '开平区', '开平', '118.26443', '39.67617', 3, 0, 1),
+(130207, 130200, '丰南区', '丰南', '118.110794', '39.56303', 3, 0, 1),
+(130208, 130200, '丰润区', '丰润', '118.15578', '39.831364', 3, 0, 1),
+(130209, 130200, '曹妃甸区', '曹妃甸', '118.46023', '39.27313', 3, 0, 1),
+(130224, 130200, '滦南县', '滦南', '118.68155', '39.506203', 3, 0, 1),
+(130225, 130200, '乐亭县', '乐亭', '118.90534', '39.42813', 3, 0, 1),
+(130227, 130200, '迁西县', '迁西', '118.30514', '40.146236', 3, 0, 1),
+(130229, 130200, '玉田县', '玉田', '117.75366', '39.88732', 3, 0, 1),
+(130281, 130200, '遵化市', '遵化', '117.96587', '40.188618', 3, 0, 1),
+(130283, 130200, '迁安市', '迁安', '118.701935', '40.012108', 3, 0, 1),
+(130284, 130200, '滦州市', '滦州', '118.70351', '39.74058', 3, 0, 1),
+(130300, 130000, '秦皇岛市', '秦皇岛', '119.58658', '39.94253', 2, 0, 1),
+(130302, 130300, '海港区', '海港', '119.59622', '39.94346', 3, 0, 1),
+(130303, 130300, '山海关区', '山海关', '119.75359', '39.998024', 3, 0, 1),
+(130304, 130300, '北戴河区', '北戴河', '119.48628', '39.825123', 3, 0, 1),
+(130306, 130300, '抚宁区', '抚宁', '119.24444', '39.87634', 3, 0, 1),
+(130321, 130300, '青龙满族自治县', '青龙', '118.95455', '40.40602', 3, 0, 1),
+(130322, 130300, '昌黎县', '昌黎', '119.16454', '39.70973', 3, 0, 1),
+(130324, 130300, '卢龙县', '卢龙', '118.881805', '39.89164', 3, 0, 1),
+(130400, 130000, '邯郸市', '邯郸', '114.490685', '36.612274', 2, 0, 1),
+(130402, 130400, '邯山区', '邯山', '114.484985', '36.603195', 3, 0, 1),
+(130403, 130400, '丛台区', '丛台', '114.494705', '36.61108', 3, 0, 1),
+(130404, 130400, '复兴区', '复兴', '114.458244', '36.615482', 3, 0, 1),
+(130406, 130400, '峰峰矿区', '峰峰矿', '114.20994', '36.420486', 3, 0, 1),
+(130407, 130400, '肥乡区', '肥乡', '114.80002', '36.54811', 3, 0, 1),
+(130408, 130400, '永年区', '永年', '114.49095', '36.77771', 3, 0, 1),
+(130423, 130400, '临漳县', '临漳', '114.6107', '36.337605', 3, 0, 1),
+(130424, 130400, '成安县', '成安', '114.68036', '36.443832', 3, 0, 1),
+(130425, 130400, '大名县', '大名', '115.15259', '36.283318', 3, 0, 1),
+(130426, 130400, '涉县', '涉县', '113.673294', '36.563145', 3, 0, 1),
+(130427, 130400, '磁县', '磁县', '114.38208', '36.367672', 3, 0, 1),
+(130430, 130400, '邱县', '邱县', '115.16859', '36.81325', 3, 0, 1),
+(130431, 130400, '鸡泽县', '鸡泽', '114.87852', '36.91491', 3, 0, 1),
+(130432, 130400, '广平县', '广平', '114.95086', '36.483604', 3, 0, 1),
+(130433, 130400, '馆陶县', '馆陶', '115.289055', '36.53946', 3, 0, 1),
+(130434, 130400, '魏县', '魏县', '114.93411', '36.354248', 3, 0, 1),
+(130435, 130400, '曲周县', '曲周', '114.95759', '36.7734', 3, 0, 1),
+(130481, 130400, '武安市', '武安', '114.19458', '36.696114', 3, 0, 1),
+(130500, 130000, '邢台市', '邢台', '114.50885', '37.0682', 2, 0, 1),
+(130502, 130500, '襄都区', '桥东', '114.50713', '37.064125', 3, 0, 1),
+(130503, 130500, '信都区', '桥西', '114.47369', '37.06801', 3, 0, 1),
+(130505, 130500, '任泽区', '任泽', '', '', 3, 0, 1),
+(130506, 130500, '南和区', '南和', '', '', 3, 0, 1),
+(130522, 130500, '临城县', '临城', '114.506874', '37.444008', 3, 0, 1),
+(130523, 130500, '内丘县', '内丘', '114.51152', '37.287663', 3, 0, 1),
+(130524, 130500, '柏乡县', '柏乡', '114.69338', '37.483597', 3, 0, 1),
+(130525, 130500, '隆尧县', '隆尧', '114.776344', '37.350925', 3, 0, 1),
+(130528, 130500, '宁晋县', '宁晋', '114.92103', '37.618958', 3, 0, 1),
+(130529, 130500, '巨鹿县', '巨鹿', '115.03878', '37.21768', 3, 0, 1),
+(130530, 130500, '新河县', '新河', '115.247536', '37.526215', 3, 0, 1),
+(130531, 130500, '广宗县', '广宗', '115.1428', '37.075546', 3, 0, 1),
+(130532, 130500, '平乡县', '平乡', '115.02922', '37.069405', 3, 0, 1),
+(130533, 130500, '威县', '威县', '115.27275', '36.983273', 3, 0, 1),
+(130534, 130500, '清河县', '清河', '115.669', '37.05999', 3, 0, 1),
+(130535, 130500, '临西县', '临西', '115.49869', '36.8642', 3, 0, 1),
+(130581, 130500, '南宫市', '南宫', '115.3981', '37.35967', 3, 0, 1),
+(130582, 130500, '沙河市', '沙河', '114.504906', '36.861904', 3, 0, 1),
+(130600, 130000, '保定市', '保定', '115.48233', '38.867657', 2, 0, 1),
+(130602, 130600, '竞秀区', '新市', '115.47066', '38.88662', 3, 0, 1),
+(130606, 130600, '莲池区', '莲池', '115.49715', '38.88353', 3, 0, 1),
+(130607, 130600, '满城区', '满城', '115.32217', '38.94892', 3, 0, 1),
+(130608, 130600, '清苑区', '清苑', '115.48989', '38.76526', 3, 0, 1),
+(130609, 130600, '徐水区', '徐水', '115.65586', '39.01865', 3, 0, 1),
+(130623, 130600, '涞水县', '涞水', '115.71198', '39.393147', 3, 0, 1),
+(130624, 130600, '阜平县', '阜平', '114.1988', '38.847275', 3, 0, 1),
+(130626, 130600, '定兴县', '定兴', '115.7969', '39.266193', 3, 0, 1),
+(130627, 130600, '唐县', '唐县', '114.98124', '38.748543', 3, 0, 1),
+(130628, 130600, '高阳县', '高阳', '115.77888', '38.69009', 3, 0, 1),
+(130629, 130600, '容城县', '容城', '115.86625', '39.05282', 3, 0, 1),
+(130630, 130600, '涞源县', '涞源', '114.692566', '39.35755', 3, 0, 1),
+(130631, 130600, '望都县', '望都', '115.15401', '38.707447', 3, 0, 1),
+(130632, 130600, '安新县', '安新', '115.93198', '38.929913', 3, 0, 1),
+(130633, 130600, '易县', '易县', '115.501144', '39.35297', 3, 0, 1),
+(130634, 130600, '曲阳县', '曲阳', '114.704056', '38.61999', 3, 0, 1),
+(130635, 130600, '蠡县', '蠡县', '115.58363', '38.49643', 3, 0, 1),
+(130636, 130600, '顺平县', '顺平', '115.13275', '38.845127', 3, 0, 1),
+(130637, 130600, '博野县', '博野', '115.4618', '38.45827', 3, 0, 1),
+(130638, 130600, '雄县', '雄县', '116.107475', '38.990818', 3, 0, 1),
+(130681, 130600, '涿州市', '涿州', '115.97341', '39.485764', 3, 0, 1),
+(130682, 130600, '定州市', '定州', '114.99139', '38.5176', 3, 0, 1),
+(130683, 130600, '安国市', '安国', '115.33141', '38.421368', 3, 0, 1),
+(130684, 130600, '高碑店市', '高碑店', '115.882706', '39.32769', 3, 0, 1),
+(130700, 130000, '张家口市', '张家口', '114.884094', '40.8119', 2, 0, 1),
+(130702, 130700, '桥东区', '桥东', '114.88566', '40.813873', 3, 0, 1),
+(130703, 130700, '桥西区', '桥西', '114.882126', '40.824387', 3, 0, 1),
+(130705, 130700, '宣化区', '宣化区', '115.0632', '40.609367', 3, 0, 1),
+(130706, 130700, '下花园区', '下花园', '115.281', '40.488644', 3, 0, 1),
+(130708, 130700, '万全区', '万全', '114.74055', '40.76699', 3, 0, 1),
+(130709, 130700, '崇礼区', '崇礼', '115.282349', '40.974758', 3, 0, 1),
+(130722, 130700, '张北县', '张北', '114.71595', '41.151714', 3, 0, 1),
+(130723, 130700, '康保县', '康保', '114.61581', '41.850044', 3, 0, 1),
+(130724, 130700, '沽源县', '沽源', '115.68484', '41.66742', 3, 0, 1),
+(130725, 130700, '尚义县', '尚义', '113.977715', '41.08009', 3, 0, 1),
+(130726, 130700, '蔚县', '蔚县', '114.582695', '39.83718', 3, 0, 1),
+(130727, 130700, '阳原县', '阳原', '114.16734', '40.11342', 3, 0, 1),
+(130728, 130700, '怀安县', '怀安', '114.42236', '40.671272', 3, 0, 1),
+(130730, 130700, '怀来县', '怀来', '115.52084', '40.405403', 3, 0, 1),
+(130731, 130700, '涿鹿县', '涿鹿', '115.219246', '40.3787', 3, 0, 1),
+(130732, 130700, '赤城县', '赤城', '115.83271', '40.912083', 3, 0, 1),
+(130800, 130000, '承德市', '承德', '117.939156', '40.976204', 2, 0, 1),
+(130802, 130800, '双桥区', '双桥', '117.939156', '40.976204', 3, 0, 1),
+(130803, 130800, '双滦区', '双滦', '117.797485', '40.959755', 3, 0, 1),
+(130804, 130800, '鹰手营子矿区', '鹰手营子矿', '117.661156', '40.546955', 3, 0, 1),
+(130821, 130800, '承德县', '承德', '118.17249', '40.76864', 3, 0, 1),
+(130822, 130800, '兴隆县', '兴隆', '117.507095', '40.418526', 3, 0, 1),
+(130824, 130800, '滦平县', '滦平', '117.33713', '40.936646', 3, 0, 1),
+(130825, 130800, '隆化县', '隆化', '117.73634', '41.316666', 3, 0, 1),
+(130826, 130800, '丰宁满族自治县', '丰宁', '116.65121', '41.209904', 3, 0, 1),
+(130827, 130800, '宽城满族自治县', '宽城', '118.48864', '40.607983', 3, 0, 1),
+(130828, 130800, '围场满族蒙古族自治县', '围场', '117.764084', '41.949406', 3, 0, 1),
+(130881, 130800, '平泉市', '平泉', '118.70065', '41.01797', 3, 0, 1),
+(130900, 130000, '沧州市', '沧州', '116.85746', '38.31058', 2, 0, 1),
+(130902, 130900, '新华区', '新华', '116.87305', '38.308273', 3, 0, 1),
+(130903, 130900, '运河区', '运河', '116.840065', '38.307404', 3, 0, 1),
+(130921, 130900, '沧县', '沧县', '117.00748', '38.219856', 3, 0, 1),
+(130922, 130900, '青县', '青县', '116.83839', '38.569645', 3, 0, 1),
+(130923, 130900, '东光县', '东光', '116.54206', '37.88655', 3, 0, 1),
+(130924, 130900, '海兴县', '海兴', '117.496605', '38.141582', 3, 0, 1),
+(130925, 130900, '盐山县', '盐山', '117.22981', '38.05614', 3, 0, 1),
+(130926, 130900, '肃宁县', '肃宁', '115.83585', '38.4271', 3, 0, 1),
+(130927, 130900, '南皮县', '南皮', '116.70917', '38.04244', 3, 0, 1),
+(130928, 130900, '吴桥县', '吴桥', '116.39151', '37.62818', 3, 0, 1),
+(130929, 130900, '献县', '献县', '116.12384', '38.18966', 3, 0, 1),
+(130930, 130900, '孟村回族自治县', '孟村', '117.1051', '38.057953', 3, 0, 1),
+(130981, 130900, '泊头市', '泊头', '116.57016', '38.07348', 3, 0, 1),
+(130982, 130900, '任丘市', '任丘', '116.106766', '38.706512', 3, 0, 1),
+(130983, 130900, '黄骅市', '黄骅', '117.3438', '38.36924', 3, 0, 1),
+(130984, 130900, '河间市', '河间', '116.089455', '38.44149', 3, 0, 1),
+(131000, 130000, '廊坊市', '廊坊', '116.70444', '39.523926', 2, 0, 1),
+(131002, 131000, '安次区', '安次', '116.69454', '39.502567', 3, 0, 1),
+(131003, 131000, '广阳区', '广阳', '116.71371', '39.52193', 3, 0, 1),
+(131022, 131000, '固安县', '固安', '116.2999', '39.436466', 3, 0, 1),
+(131023, 131000, '永清县', '永清', '116.49809', '39.319717', 3, 0, 1),
+(131024, 131000, '香河县', '香河', '117.007164', '39.757214', 3, 0, 1),
+(131025, 131000, '大城县', '大城', '116.64073', '38.699215', 3, 0, 1),
+(131026, 131000, '文安县', '文安', '116.460106', '38.866802', 3, 0, 1),
+(131028, 131000, '大厂回族自治县', '大厂', '116.9865', '39.889267', 3, 0, 1),
+(131081, 131000, '霸州市', '霸州', '116.39202', '39.117332', 3, 0, 1),
+(131082, 131000, '三河市', '三河', '117.07702', '39.982777', 3, 0, 1),
+(131100, 130000, '衡水市', '衡水', '115.66599', '37.735096', 2, 0, 1),
+(131102, 131100, '桃城区', '桃城', '115.69495', '37.73224', 3, 0, 1),
+(131103, 131100, '冀州区', '冀州', '115.57938', '37.55085', 3, 0, 1),
+(131121, 131100, '枣强县', '枣强', '115.7265', '37.511513', 3, 0, 1),
+(131122, 131100, '武邑县', '武邑', '115.89242', '37.803776', 3, 0, 1),
+(131123, 131100, '武强县', '武强', '115.97024', '38.03698', 3, 0, 1),
+(131124, 131100, '饶阳县', '饶阳', '115.72658', '38.23267', 3, 0, 1),
+(131125, 131100, '安平县', '安平', '115.51963', '38.233513', 3, 0, 1),
+(131126, 131100, '故城县', '故城', '115.96674', '37.350983', 3, 0, 1),
+(131127, 131100, '景县', '景县', '116.258446', '37.686623', 3, 0, 1),
+(131128, 131100, '阜城县', '阜城', '116.16473', '37.869946', 3, 0, 1),
+(131182, 131100, '深州市', '深州', '115.554596', '38.00347', 3, 0, 1),
+(140000, 0, '山西省', '山西', '112.54925', '37.857014', 1, 0, 1),
+(140100, 140000, '太原市', '太原', '112.54925', '37.857014', 2, 0, 1),
+(140105, 140100, '小店区', '小店', '112.56427', '37.817974', 3, 0, 1),
+(140106, 140100, '迎泽区', '迎泽', '112.55885', '37.855804', 3, 0, 1),
+(140107, 140100, '杏花岭区', '杏花岭', '112.560745', '37.87929', 3, 0, 1),
+(140108, 140100, '尖草坪区', '尖草坪', '112.48712', '37.93989', 3, 0, 1),
+(140109, 140100, '万柏林区', '万柏林', '112.522255', '37.86265', 3, 0, 1),
+(140110, 140100, '晋源区', '晋源', '112.47785', '37.71562', 3, 0, 1),
+(140121, 140100, '清徐县', '清徐', '112.35796', '37.60729', 3, 0, 1),
+(140122, 140100, '阳曲县', '阳曲', '112.67382', '38.058796', 3, 0, 1),
+(140123, 140100, '娄烦县', '娄烦', '111.7938', '38.066036', 3, 0, 1),
+(140181, 140100, '古交市', '古交', '112.174355', '37.908535', 3, 0, 1),
+(140200, 140000, '大同市', '大同', '113.29526', '40.09031', 2, 0, 1),
+(140212, 140200, '新荣区', '新荣', '113.141045', '40.25827', 3, 0, 1),
+(140213, 140200, '平城区', '平城', '113.29798', '40.07583', 3, 0, 1),
+(140214, 140200, '云冈区', '云冈', '113.14952', '40.00543', 3, 0, 1),
+(140215, 140200, '云州区', '云州', '113.61217', '40.04016', 3, 0, 1),
+(140221, 140200, '阳高县', '阳高', '113.74987', '40.364925', 3, 0, 1),
+(140222, 140200, '天镇县', '天镇', '114.09112', '40.421337', 3, 0, 1),
+(140223, 140200, '广灵县', '广灵', '114.27925', '39.76305', 3, 0, 1),
+(140224, 140200, '灵丘县', '灵丘', '114.23576', '39.438866', 3, 0, 1),
+(140225, 140200, '浑源县', '浑源', '113.69809', '39.6991', 3, 0, 1),
+(140226, 140200, '左云县', '左云', '112.70641', '40.012875', 3, 0, 1),
+(140300, 140000, '阳泉市', '阳泉', '113.58328', '37.861187', 2, 0, 1),
+(140302, 140300, '城区', '城区', '113.58651', '37.86094', 3, 0, 1),
+(140303, 140300, '矿区', '矿区', '113.55907', '37.870087', 3, 0, 1),
+(140311, 140300, '郊区', '郊区', '113.58328', '37.861187', 3, 0, 1),
+(140321, 140300, '平定县', '平定', '113.63105', '37.80029', 3, 0, 1),
+(140322, 140300, '盂县', '盂县', '113.41223', '38.086132', 3, 0, 1),
+(140400, 140000, '长治市', '长治', '113.113556', '36.191113', 2, 0, 1),
+(140403, 140400, '潞州区', '潞州', '113.12303', '36.20346', 3, 0, 1),
+(140404, 140400, '上党区', '上党', '113.05135', '36.05312', 3, 0, 1),
+(140405, 140400, '屯留区', '屯留', '112.89221', '36.31553', 3, 0, 1),
+(140406, 140400, '潞城区', '潞城', '113.22893', '36.33418', 3, 0, 1),
+(140423, 140400, '襄垣县', '襄垣', '113.050095', '36.532852', 3, 0, 1),
+(140425, 140400, '平顺县', '平顺', '113.43879', '36.200203', 3, 0, 1),
+(140426, 140400, '黎城县', '黎城', '113.38737', '36.50297', 3, 0, 1),
+(140427, 140400, '壶关县', '壶关', '113.20614', '36.11094', 3, 0, 1),
+(140428, 140400, '长子县', '长子', '112.88466', '36.119484', 3, 0, 1),
+(140429, 140400, '武乡县', '武乡', '112.8653', '36.834316', 3, 0, 1),
+(140430, 140400, '沁县', '沁县', '112.70138', '36.757122', 3, 0, 1),
+(140431, 140400, '沁源县', '沁源', '112.34088', '36.50078', 3, 0, 1),
+(140500, 140000, '晋城市', '晋城', '112.85127', '35.497555', 2, 0, 1),
+(140502, 140500, '城区', '城区', '112.8531', '35.49664', 3, 0, 1),
+(140521, 140500, '沁水县', '沁水', '112.18721', '35.689472', 3, 0, 1),
+(140522, 140500, '阳城县', '阳城', '112.42201', '35.482178', 3, 0, 1),
+(140524, 140500, '陵川县', '陵川', '113.27888', '35.775616', 3, 0, 1),
+(140525, 140500, '泽州县', '泽州', '112.89914', '35.61722', 3, 0, 1),
+(140581, 140500, '高平市', '高平', '112.930695', '35.791355', 3, 0, 1),
+(140600, 140000, '朔州市', '朔州', '112.43339', '39.33126', 2, 0, 1),
+(140602, 140600, '朔城区', '朔城', '112.42867', '39.324524', 3, 0, 1),
+(140603, 140600, '平鲁区', '平鲁', '112.29523', '39.515602', 3, 0, 1),
+(140621, 140600, '山阴县', '山阴', '112.8164', '39.52677', 3, 0, 1),
+(140622, 140600, '应县', '应县', '113.18751', '39.55919', 3, 0, 1),
+(140623, 140600, '右玉县', '右玉', '112.46559', '39.98881', 3, 0, 1),
+(140681, 140600, '怀仁市', '怀仁', '113.10012', '39.82788', 3, 0, 1),
+(140700, 140000, '晋中市', '晋中', '112.736465', '37.696495', 2, 0, 1),
+(140702, 140700, '榆次区', '榆次', '112.74006', '37.6976', 3, 0, 1),
+(140703, 140700, '太谷区', '太谷', '112.55126', '37.42119', 3, 0, 1),
+(140721, 140700, '榆社县', '榆社', '112.97352', '37.06902', 3, 0, 1),
+(140722, 140700, '左权县', '左权', '113.37783', '37.079674', 3, 0, 1),
+(140723, 140700, '和顺县', '和顺', '113.57292', '37.327026', 3, 0, 1),
+(140724, 140700, '昔阳县', '昔阳', '113.70617', '37.60437', 3, 0, 1),
+(140725, 140700, '寿阳县', '寿阳', '113.17771', '37.891136', 3, 0, 1),
+(140727, 140700, '祁县', '祁县', '112.33053', '37.358738', 3, 0, 1),
+(140728, 140700, '平遥县', '平遥', '112.17406', '37.195473', 3, 0, 1),
+(140729, 140700, '灵石县', '灵石', '111.77276', '36.84747', 3, 0, 1),
+(140781, 140700, '介休市', '介休', '111.91386', '37.027615', 3, 0, 1),
+(140800, 140000, '运城市', '运城', '111.00396', '35.022778', 2, 0, 1),
+(140802, 140800, '盐湖区', '盐湖', '111.000626', '35.025642', 3, 0, 1),
+(140821, 140800, '临猗县', '临猗', '110.77493', '35.141884', 3, 0, 1),
+(140822, 140800, '万荣县', '万荣', '110.84356', '35.41704', 3, 0, 1),
+(140823, 140800, '闻喜县', '闻喜', '111.22031', '35.35384', 3, 0, 1),
+(140824, 140800, '稷山县', '稷山', '110.979', '35.60041', 3, 0, 1),
+(140825, 140800, '新绛县', '新绛', '111.225204', '35.613697', 3, 0, 1),
+(140826, 140800, '绛县', '绛县', '111.57618', '35.49045', 3, 0, 1),
+(140827, 140800, '垣曲县', '垣曲', '111.67099', '35.298294', 3, 0, 1),
+(140828, 140800, '夏县', '夏县', '111.223175', '35.14044', 3, 0, 1),
+(140829, 140800, '平陆县', '平陆', '111.21238', '34.837257', 3, 0, 1),
+(140830, 140800, '芮城县', '芮城', '110.69114', '34.69477', 3, 0, 1),
+(140881, 140800, '永济市', '永济', '110.44798', '34.865124', 3, 0, 1),
+(140882, 140800, '河津市', '河津', '110.710266', '35.59715', 3, 0, 1),
+(140900, 140000, '忻州市', '忻州', '112.733536', '38.41769', 2, 0, 1),
+(140902, 140900, '忻府区', '忻府', '112.734116', '38.417744', 3, 0, 1),
+(140921, 140900, '定襄县', '定襄', '112.963234', '38.484947', 3, 0, 1),
+(140922, 140900, '五台县', '五台', '113.25901', '38.72571', 3, 0, 1),
+(140923, 140900, '代县', '代县', '112.96252', '39.06514', 3, 0, 1),
+(140924, 140900, '繁峙县', '繁峙', '113.26771', '39.188103', 3, 0, 1),
+(140925, 140900, '宁武县', '宁武', '112.30794', '39.001717', 3, 0, 1),
+(140926, 140900, '静乐县', '静乐', '111.94023', '38.355946', 3, 0, 1),
+(140927, 140900, '神池县', '神池', '112.20044', '39.088467', 3, 0, 1),
+(140928, 140900, '五寨县', '五寨', '111.84102', '38.91276', 3, 0, 1),
+(140929, 140900, '岢岚县', '岢岚', '111.56981', '38.705624', 3, 0, 1),
+(140930, 140900, '河曲县', '河曲', '111.14661', '39.381893', 3, 0, 1),
+(140931, 140900, '保德县', '保德', '111.085686', '39.022575', 3, 0, 1),
+(140932, 140900, '偏关县', '偏关', '111.50048', '39.442154', 3, 0, 1),
+(140981, 140900, '原平市', '原平', '112.713135', '38.729187', 3, 0, 1),
+(141000, 140000, '临汾市', '临汾', '111.517975', '36.08415', 2, 0, 1),
+(141002, 141000, '尧都区', '尧都', '111.52294', '36.080364', 3, 0, 1),
+(141021, 141000, '曲沃县', '曲沃', '111.47553', '35.641388', 3, 0, 1),
+(141022, 141000, '翼城县', '翼城', '111.71351', '35.73862', 3, 0, 1),
+(141023, 141000, '襄汾县', '襄汾', '111.44293', '35.87614', 3, 0, 1),
+(141024, 141000, '洪洞县', '洪洞', '111.67369', '36.25574', 3, 0, 1),
+(141025, 141000, '古县', '古县', '111.920204', '36.26855', 3, 0, 1),
+(141026, 141000, '安泽县', '安泽', '112.25137', '36.14603', 3, 0, 1),
+(141027, 141000, '浮山县', '浮山', '111.85004', '35.97136', 3, 0, 1),
+(141028, 141000, '吉县', '吉县', '110.68285', '36.099354', 3, 0, 1),
+(141029, 141000, '乡宁县', '乡宁', '110.85737', '35.975403', 3, 0, 1),
+(141030, 141000, '大宁县', '大宁', '110.75128', '36.46383', 3, 0, 1),
+(141031, 141000, '隰县', '隰县', '110.93581', '36.692677', 3, 0, 1),
+(141032, 141000, '永和县', '永和', '110.63128', '36.760612', 3, 0, 1),
+(141033, 141000, '蒲县', '蒲县', '111.09733', '36.411682', 3, 0, 1),
+(141034, 141000, '汾西县', '汾西', '111.56302', '36.65337', 3, 0, 1),
+(141081, 141000, '侯马市', '侯马', '111.37127', '35.6203', 3, 0, 1),
+(141082, 141000, '霍州市', '霍州', '111.72311', '36.57202', 3, 0, 1),
+(141100, 140000, '吕梁市', '吕梁', '111.13434', '37.524364', 2, 0, 1),
+(141102, 141100, '离石区', '离石', '111.13446', '37.524036', 3, 0, 1),
+(141121, 141100, '文水县', '文水', '112.03259', '37.436314', 3, 0, 1),
+(141122, 141100, '交城县', '交城', '112.15916', '37.555157', 3, 0, 1),
+(141123, 141100, '兴县', '兴县', '111.12482', '38.464134', 3, 0, 1),
+(141124, 141100, '临县', '临县', '110.995964', '37.960808', 3, 0, 1),
+(141125, 141100, '柳林县', '柳林', '110.89613', '37.431664', 3, 0, 1),
+(141126, 141100, '石楼县', '石楼', '110.83712', '36.999428', 3, 0, 1),
+(141127, 141100, '岚县', '岚县', '111.671555', '38.278652', 3, 0, 1),
+(141128, 141100, '方山县', '方山', '111.238884', '37.89263', 3, 0, 1),
+(141129, 141100, '中阳县', '中阳', '111.19332', '37.342052', 3, 0, 1),
+(141130, 141100, '交口县', '交口', '111.18319', '36.983067', 3, 0, 1),
+(141181, 141100, '孝义市', '孝义', '111.78157', '37.144474', 3, 0, 1),
+(141182, 141100, '汾阳市', '汾阳', '111.78527', '37.267742', 3, 0, 1),
+(150000, 0, '内蒙古自治区', '内蒙古', '111.6708', '40.81831', 1, 0, 1),
+(150100, 150000, '呼和浩特市', '呼和浩特', '111.6708', '40.81831', 2, 0, 1),
+(150102, 150100, '新城区', '新城', '111.68597', '40.826225', 3, 0, 1),
+(150103, 150100, '回民区', '回民', '111.66216', '40.815147', 3, 0, 1),
+(150104, 150100, '玉泉区', '玉泉', '111.66543', '40.79942', 3, 0, 1),
+(150105, 150100, '赛罕区', '赛罕', '111.69846', '40.807835', 3, 0, 1),
+(150121, 150100, '土默特左旗', '土默特左', '111.13361', '40.720417', 3, 0, 1),
+(150122, 150100, '托克托县', '托克托', '111.19732', '40.27673', 3, 0, 1),
+(150123, 150100, '和林格尔县', '和林格尔', '111.82414', '40.380287', 3, 0, 1),
+(150124, 150100, '清水河县', '清水河', '111.67222', '39.91248', 3, 0, 1),
+(150125, 150100, '武川县', '武川', '111.456566', '41.094482', 3, 0, 1),
+(150200, 150000, '包头市', '包头', '109.84041', '40.65817', 2, 0, 1),
+(150202, 150200, '东河区', '东河', '110.02689', '40.587055', 3, 0, 1),
+(150203, 150200, '昆都仑区', '昆都仑', '109.82293', '40.661346', 3, 0, 1),
+(150204, 150200, '青山区', '青山', '109.88005', '40.668556', 3, 0, 1),
+(150205, 150200, '石拐区', '石拐', '110.27257', '40.672092', 3, 0, 1),
+(150206, 150200, '白云鄂博矿区', '白云矿区', '109.97016', '41.769245', 3, 0, 1),
+(150207, 150200, '九原区', '九原', '109.968124', '40.600582', 3, 0, 1),
+(150221, 150200, '土默特右旗', '土默特右', '110.526764', '40.566433', 3, 0, 1),
+(150222, 150200, '固阳县', '固阳', '110.06342', '41.030003', 3, 0, 1),
+(150223, 150200, '达尔罕茂明安联合旗', '达尔罕茂明安联合', '109.84041', '40.65817', 3, 0, 1),
+(150300, 150000, '乌海市', '乌海', '106.82556', '39.673733', 2, 0, 1),
+(150302, 150300, '海勃湾区', '海勃湾', '106.817764', '39.673527', 3, 0, 1),
+(150303, 150300, '海南区', '海南', '106.88479', '39.44153', 3, 0, 1),
+(150304, 150300, '乌达区', '乌达', '106.72271', '39.50229', 3, 0, 1),
+(150400, 150000, '赤峰市', '赤峰', '118.9568', '42.27532', 2, 0, 1),
+(150402, 150400, '红山区', '红山', '118.96109', '42.269733', 3, 0, 1),
+(150403, 150400, '元宝山区', '元宝山', '119.28988', '42.04117', 3, 0, 1),
+(150404, 150400, '松山区', '松山', '118.93896', '42.281048', 3, 0, 1),
+(150421, 150400, '阿鲁科尔沁旗', '阿鲁科尔沁', '120.09497', '43.87877', 3, 0, 1),
+(150422, 150400, '巴林左旗', '巴林左', '119.39174', '43.980717', 3, 0, 1),
+(150423, 150400, '巴林右旗', '巴林右', '118.678345', '43.52896', 3, 0, 1),
+(150424, 150400, '林西县', '林西', '118.05775', '43.605328', 3, 0, 1),
+(150425, 150400, '克什克腾旗', '克什克腾', '117.542465', '43.256233', 3, 0, 1),
+(150426, 150400, '翁牛特旗', '翁牛特', '119.02262', '42.937126', 3, 0, 1),
+(150428, 150400, '喀喇沁旗', '喀喇沁', '118.70857', '41.92778', 3, 0, 1),
+(150429, 150400, '宁城县', '宁城', '119.33924', '41.598694', 3, 0, 1),
+(150430, 150400, '敖汉旗', '敖汉', '119.90649', '42.28701', 3, 0, 1),
+(150500, 150000, '通辽市', '通辽', '122.26312', '43.617428', 2, 0, 1),
+(150502, 150500, '科尔沁区', '科尔沁', '122.264046', '43.61742', 3, 0, 1),
+(150521, 150500, '科尔沁左翼中旗', '科尔沁左翼中', '123.31387', '44.127167', 3, 0, 1),
+(150522, 150500, '科尔沁左翼后旗', '科尔沁左翼后', '122.355156', '42.954563', 3, 0, 1),
+(150523, 150500, '开鲁县', '开鲁', '121.3088', '43.602432', 3, 0, 1),
+(150524, 150500, '库伦旗', '库伦', '121.77489', '42.73469', 3, 0, 1),
+(150525, 150500, '奈曼旗', '奈曼', '120.662544', '42.84685', 3, 0, 1),
+(150526, 150500, '扎鲁特旗', '扎鲁特', '120.90527', '44.555294', 3, 0, 1),
+(150581, 150500, '霍林郭勒市', '霍林郭勒', '119.65786', '45.53236', 3, 0, 1),
+(150600, 150000, '鄂尔多斯市', '鄂尔多斯', '109.99029', '39.81718', 2, 0, 1),
+(150602, 150600, '东胜区', '东胜', '109.98945', '39.81788', 3, 0, 1),
+(150603, 150600, '康巴什区', '康巴什', '109.85851', '39.60837', 3, 0, 1),
+(150621, 150600, '达拉特旗', '达拉特', '110.04028', '40.404076', 3, 0, 1),
+(150622, 150600, '准格尔旗', '准格尔', '111.238335', '39.86522', 3, 0, 1),
+(150623, 150600, '鄂托克前旗', '鄂托克前', '107.48172', '38.183258', 3, 0, 1),
+(150624, 150600, '鄂托克旗', '鄂托克', '107.982605', '39.095753', 3, 0, 1),
+(150625, 150600, '杭锦旗', '杭锦', '108.73632', '39.831787', 3, 0, 1),
+(150626, 150600, '乌审旗', '乌审', '108.84245', '38.59661', 3, 0, 1),
+(150627, 150600, '伊金霍洛旗', '伊金霍洛', '109.7874', '39.604313', 3, 0, 1),
+(150700, 150000, '呼伦贝尔市', '呼伦贝尔', '119.75817', '49.215332', 2, 0, 1),
+(150702, 150700, '海拉尔区', '海拉尔', '119.76492', '49.21389', 3, 0, 1),
+(150703, 150700, '扎赉诺尔区', '扎赉诺尔', '117.7927', '49.486942', 3, 0, 1),
+(150721, 150700, '阿荣旗', '阿荣', '123.464615', '48.130505', 3, 0, 1),
+(150722, 150700, '莫力达瓦达斡尔族自治旗', '莫力达瓦', '124.5074', '48.478386', 3, 0, 1),
+(150723, 150700, '鄂伦春自治旗', '鄂伦春', '123.725685', '50.590176', 3, 0, 1),
+(150724, 150700, '鄂温克族自治旗', '鄂温克', '119.75404', '49.14329', 3, 0, 1),
+(150725, 150700, '陈巴尔虎旗', '陈巴尔虎', '119.43761', '49.328423', 3, 0, 1),
+(150726, 150700, '新巴尔虎左旗', '新巴尔虎左', '118.267456', '48.21657', 3, 0, 1),
+(150727, 150700, '新巴尔虎右旗', '新巴尔虎右', '116.82599', '48.669132', 3, 0, 1),
+(150781, 150700, '满洲里市', '满洲里', '117.45556', '49.59079', 3, 0, 1),
+(150782, 150700, '牙克石市', '牙克石', '120.729004', '49.287025', 3, 0, 1),
+(150783, 150700, '扎兰屯市', '扎兰屯', '122.7444', '48.007412', 3, 0, 1),
+(150784, 150700, '额尔古纳市', '额尔古纳', '120.178635', '50.2439', 3, 0, 1),
+(150785, 150700, '根河市', '根河', '121.53272', '50.780453', 3, 0, 1),
+(150800, 150000, '巴彦淖尔市', '巴彦淖尔', '107.41696', '40.7574', 2, 0, 1),
+(150802, 150800, '临河区', '临河', '107.417015', '40.75709', 3, 0, 1),
+(150821, 150800, '五原县', '五原', '108.27066', '41.097637', 3, 0, 1),
+(150822, 150800, '磴口县', '磴口', '107.00606', '40.33048', 3, 0, 1),
+(150823, 150800, '乌拉特前旗', '乌拉特前', '108.656815', '40.72521', 3, 0, 1),
+(150824, 150800, '乌拉特中旗', '乌拉特中', '108.51526', '41.57254', 3, 0, 1),
+(150825, 150800, '乌拉特后旗', '乌拉特后', '107.07494', '41.08431', 3, 0, 1),
+(150826, 150800, '杭锦后旗', '杭锦后', '107.14768', '40.888798', 3, 0, 1),
+(150900, 150000, '乌兰察布市', '乌兰察布', '113.11454', '41.034126', 2, 0, 1),
+(150902, 150900, '集宁区', '集宁', '113.116455', '41.034134', 3, 0, 1),
+(150921, 150900, '卓资县', '卓资', '112.577705', '40.89576', 3, 0, 1),
+(150922, 150900, '化德县', '化德', '114.01008', '41.899334', 3, 0, 1),
+(150923, 150900, '商都县', '商都', '113.560646', '41.56016', 3, 0, 1),
+(150924, 150900, '兴和县', '兴和', '113.83401', '40.872437', 3, 0, 1),
+(150925, 150900, '凉城县', '凉城', '112.50091', '40.531628', 3, 0, 1),
+(150926, 150900, '察哈尔右翼前旗', '察哈尔右翼前', '113.21196', '40.786858', 3, 0, 1),
+(150927, 150900, '察哈尔右翼中旗', '察哈尔右翼中', '112.63356', '41.27421', 3, 0, 1),
+(150928, 150900, '察哈尔右翼后旗', '察哈尔右翼后', '113.1906', '41.447212', 3, 0, 1),
+(150929, 150900, '四子王旗', '四子王', '111.70123', '41.528114', 3, 0, 1),
+(150981, 150900, '丰镇市', '丰镇', '113.16346', '40.437534', 3, 0, 1),
+(152200, 150000, '兴安盟', '兴安', '122.07032', '46.076267', 2, 0, 1),
+(152201, 152200, '乌兰浩特市', '乌兰浩特', '122.06898', '46.077236', 3, 0, 1),
+(152202, 152200, '阿尔山市', '阿尔山', '119.94366', '47.177', 3, 0, 1),
+(152221, 152200, '科尔沁右翼前旗', '科尔沁右翼前', '121.95754', '46.076496', 3, 0, 1),
+(152222, 152200, '科尔沁右翼中旗', '科尔沁右翼中', '121.47282', '45.059647', 3, 0, 1),
+(152223, 152200, '扎赉特旗', '扎赉特', '122.90933', '46.725136', 3, 0, 1),
+(152224, 152200, '突泉县', '突泉', '121.56486', '45.380985', 3, 0, 1),
+(152500, 150000, '锡林郭勒盟', '锡林郭勒', '116.090996', '43.94402', 2, 0, 1),
+(152501, 152500, '二连浩特市', '二连浩特', '111.97981', '43.652897', 3, 0, 1),
+(152502, 152500, '锡林浩特市', '锡林浩特', '116.0919', '43.9443', 3, 0, 1),
+(152522, 152500, '阿巴嘎旗', '阿巴嘎', '114.97062', '44.022728', 3, 0, 1),
+(152523, 152500, '苏尼特左旗', '苏尼特左', '113.65341', '43.854107', 3, 0, 1),
+(152524, 152500, '苏尼特右旗', '苏尼特右', '112.65539', '42.746662', 3, 0, 1),
+(152525, 152500, '东乌珠穆沁旗', '东乌珠穆沁', '116.98002', '45.510307', 3, 0, 1),
+(152526, 152500, '西乌珠穆沁旗', '西乌珠穆沁', '117.61525', '44.586147', 3, 0, 1),
+(152527, 152500, '太仆寺旗', '太仆寺', '115.28728', '41.8952', 3, 0, 1),
+(152528, 152500, '镶黄旗', '镶黄', '113.84387', '42.239227', 3, 0, 1),
+(152529, 152500, '正镶白旗', '正镶白', '115.031425', '42.286808', 3, 0, 1),
+(152530, 152500, '正蓝旗', '正蓝', '116.00331', '42.245895', 3, 0, 1),
+(152531, 152500, '多伦县', '多伦', '116.47729', '42.197964', 3, 0, 1),
+(152900, 150000, '阿拉善盟', '阿拉善', '105.70642', '38.844814', 2, 0, 1),
+(152921, 152900, '阿拉善左旗', '阿拉善左', '105.70192', '38.84724', 3, 0, 1),
+(152922, 152900, '阿拉善右旗', '阿拉善右', '101.67198', '39.21159', 3, 0, 1),
+(152923, 152900, '额济纳旗', '额济纳', '101.06944', '41.958813', 3, 0, 1),
+(210000, 0, '辽宁省', '辽宁', '123.42909', '41.79677', 1, 0, 1),
+(210100, 210000, '沈阳市', '沈阳', '123.42909', '41.79677', 2, 0, 1),
+(210102, 210100, '和平区', '和平', '123.40666', '41.788074', 3, 0, 1),
+(210103, 210100, '沈河区', '沈河', '123.445694', '41.79559', 3, 0, 1),
+(210104, 210100, '大东区', '大东', '123.469955', '41.808502', 3, 0, 1),
+(210105, 210100, '皇姑区', '皇姑', '123.40568', '41.822334', 3, 0, 1),
+(210106, 210100, '铁西区', '铁西', '123.35066', '41.787807', 3, 0, 1),
+(210111, 210100, '苏家屯区', '苏家屯', '123.341606', '41.665905', 3, 0, 1),
+(210112, 210100, '浑南区', '东陵', '123.458984', '41.741947', 3, 0, 1),
+(210113, 210100, '沈北新区', '沈北新', '123.58424', '41.91303', 3, 0, 1),
+(210114, 210100, '于洪区', '于洪', '123.31083', '41.795834', 3, 0, 1),
+(210115, 210100, '辽中区', '辽中', '122.76549', '41.51685', 3, 0, 1),
+(210123, 210100, '康平县', '康平', '123.3527', '42.74153', 3, 0, 1),
+(210124, 210100, '法库县', '法库', '123.416725', '42.507046', 3, 0, 1),
+(210181, 210100, '新民市', '新民', '122.828865', '41.99651', 3, 0, 1),
+(210200, 210000, '大连市', '大连', '121.61862', '38.91459', 2, 0, 1),
+(210202, 210200, '中山区', '中山', '121.64376', '38.921555', 3, 0, 1),
+(210203, 210200, '西岗区', '西岗', '121.61611', '38.914265', 3, 0, 1),
+(210204, 210200, '沙河口区', '沙河口', '121.593704', '38.91286', 3, 0, 1),
+(210211, 210200, '甘井子区', '甘井子', '121.58261', '38.975147', 3, 0, 1),
+(210212, 210200, '旅顺口区', '旅顺口', '121.26713', '38.812042', 3, 0, 1),
+(210213, 210200, '金州区', '金州', '121.78941', '39.052746', 3, 0, 1),
+(210214, 210200, '普兰店区', '普兰店', '121.96323', '39.39443', 3, 0, 1),
+(210224, 210200, '长海县', '长海', '122.58782', '39.2724', 3, 0, 1),
+(210281, 210200, '瓦房店市', '瓦房店', '122.002655', '39.63065', 3, 0, 1),
+(210283, 210200, '庄河市', '庄河', '122.97061', '39.69829', 3, 0, 1),
+(210300, 210000, '鞍山市', '鞍山', '122.99563', '41.110626', 2, 0, 1),
+(210302, 210300, '铁东区', '铁东', '122.99448', '41.110344', 3, 0, 1),
+(210303, 210300, '铁西区', '铁西', '122.97183', '41.11069', 3, 0, 1),
+(210304, 210300, '立山区', '立山', '123.0248', '41.150623', 3, 0, 1),
+(210311, 210300, '千山区', '千山', '122.95788', '41.07072', 3, 0, 1),
+(210321, 210300, '台安县', '台安', '122.42973', '41.38686', 3, 0, 1),
+(210323, 210300, '岫岩满族自治县', '岫岩', '123.28833', '40.28151', 3, 0, 1),
+(210381, 210300, '海城市', '海城', '122.7522', '40.85253', 3, 0, 1),
+(210400, 210000, '抚顺市', '抚顺', '123.92111', '41.875957', 2, 0, 1),
+(210402, 210400, '新抚区', '新抚', '123.902855', '41.86082', 3, 0, 1),
+(210403, 210400, '东洲区', '东洲', '124.04722', '41.86683', 3, 0, 1),
+(210404, 210400, '望花区', '望花', '123.801506', '41.851803', 3, 0, 1),
+(210411, 210400, '顺城区', '顺城', '123.91717', '41.88113', 3, 0, 1),
+(210421, 210400, '抚顺县', '抚顺', '124.09798', '41.922646', 3, 0, 1),
+(210422, 210400, '新宾满族自治县', '新宾', '125.037544', '41.732456', 3, 0, 1),
+(210423, 210400, '清原满族自治县', '清原', '124.92719', '42.10135', 3, 0, 1),
+(210500, 210000, '本溪市', '本溪', '123.770515', '41.29791', 2, 0, 1),
+(210502, 210500, '平山区', '平山', '123.76123', '41.29158', 3, 0, 1),
+(210503, 210500, '溪湖区', '溪湖', '123.76523', '41.330055', 3, 0, 1),
+(210504, 210500, '明山区', '明山', '123.76329', '41.30243', 3, 0, 1),
+(210505, 210500, '南芬区', '南芬', '123.74838', '41.10409', 3, 0, 1),
+(210521, 210500, '本溪满族自治县', '本溪', '124.12616', '41.300343', 3, 0, 1),
+(210522, 210500, '桓仁满族自治县', '桓仁', '125.35919', '41.268997', 3, 0, 1),
+(210600, 210000, '丹东市', '丹东', '124.38304', '40.124294', 2, 0, 1),
+(210602, 210600, '元宝区', '元宝', '124.39781', '40.136482', 3, 0, 1),
+(210603, 210600, '振兴区', '振兴', '124.36115', '40.102802', 3, 0, 1),
+(210604, 210600, '振安区', '振安', '124.42771', '40.158558', 3, 0, 1),
+(210624, 210600, '宽甸满族自治县', '宽甸', '124.78487', '40.73041', 3, 0, 1),
+(210681, 210600, '东港市', '东港', '124.14944', '39.88347', 3, 0, 1),
+(210682, 210600, '凤城市', '凤城', '124.07107', '40.457565', 3, 0, 1),
+(210700, 210000, '锦州市', '锦州', '121.13574', '41.11927', 2, 0, 1),
+(210702, 210700, '古塔区', '古塔', '121.13009', '41.11572', 3, 0, 1),
+(210703, 210700, '凌河区', '凌河', '121.151306', '41.114662', 3, 0, 1),
+(210711, 210700, '太和区', '太和', '121.1073', '41.105377', 3, 0, 1),
+(210726, 210700, '黑山县', '黑山', '122.11791', '41.691803', 3, 0, 1),
+(210727, 210700, '义县', '义县', '121.24283', '41.537224', 3, 0, 1),
+(210781, 210700, '凌海市', '凌海', '121.364235', '41.171738', 3, 0, 1),
+(210782, 210700, '北镇市', '北镇', '121.79596', '41.598763', 3, 0, 1),
+(210800, 210000, '营口市', '营口', '122.23515', '40.66743', 2, 0, 1),
+(210802, 210800, '站前区', '站前', '122.253235', '40.66995', 3, 0, 1),
+(210803, 210800, '西市区', '西市', '122.21007', '40.663086', 3, 0, 1),
+(210804, 210800, '鲅鱼圈区', '鲅鱼圈', '122.12724', '40.263645', 3, 0, 1),
+(210811, 210800, '老边区', '老边', '122.38258', '40.682724', 3, 0, 1),
+(210881, 210800, '盖州市', '盖州', '122.35554', '40.405235', 3, 0, 1),
+(210882, 210800, '大石桥市', '大石桥', '122.5059', '40.633972', 3, 0, 1),
+(210900, 210000, '阜新市', '阜新', '121.648964', '42.011795', 2, 0, 1),
+(210902, 210900, '海州区', '海州', '121.65764', '42.01116', 3, 0, 1),
+(210903, 210900, '新邱区', '新邱', '121.79054', '42.0866', 3, 0, 1),
+(210904, 210900, '太平区', '太平', '121.677574', '42.011147', 3, 0, 1),
+(210905, 210900, '清河门区', '清河门', '121.42018', '41.780476', 3, 0, 1),
+(210911, 210900, '细河区', '细河', '121.65479', '42.01922', 3, 0, 1),
+(210921, 210900, '阜新蒙古族自治县', '阜新', '121.743126', '42.058605', 3, 0, 1),
+(210922, 210900, '彰武县', '彰武', '122.537445', '42.384823', 3, 0, 1),
+(211000, 210000, '辽阳市', '辽阳', '123.18152', '41.2694', 2, 0, 1),
+(211002, 211000, '白塔区', '白塔', '123.17261', '41.26745', 3, 0, 1),
+(211003, 211000, '文圣区', '文圣', '123.188225', '41.266766', 3, 0, 1),
+(211004, 211000, '宏伟区', '宏伟', '123.20046', '41.205746', 3, 0, 1),
+(211005, 211000, '弓长岭区', '弓长岭', '123.43163', '41.15783', 3, 0, 1),
+(211011, 211000, '太子河区', '太子河', '123.18533', '41.251682', 3, 0, 1),
+(211021, 211000, '辽阳县', '辽阳', '123.07967', '41.21648', 3, 0, 1),
+(211081, 211000, '灯塔市', '灯塔', '123.32587', '41.427837', 3, 0, 1),
+(211100, 210000, '盘锦市', '盘锦', '122.06957', '41.124485', 2, 0, 1),
+(211102, 211100, '双台子区', '双台子', '122.05573', '41.190365', 3, 0, 1),
+(211103, 211100, '兴隆台区', '兴隆台', '122.071625', '41.12242', 3, 0, 1),
+(211104, 211100, '大洼区', '大洼', '122.08245', '41.00247', 3, 0, 1),
+(211122, 211100, '盘山县', '盘山', '121.98528', '41.2407', 3, 0, 1),
+(211200, 210000, '铁岭市', '铁岭', '123.84428', '42.290585', 2, 0, 1),
+(211202, 211200, '银州区', '银州', '123.84488', '42.29228', 3, 0, 1),
+(211204, 211200, '清河区', '清河', '124.14896', '42.542976', 3, 0, 1),
+(211221, 211200, '铁岭县', '铁岭', '123.72567', '42.223316', 3, 0, 1),
+(211223, 211200, '西丰县', '西丰', '124.72332', '42.73809', 3, 0, 1),
+(211224, 211200, '昌图县', '昌图', '124.11017', '42.784443', 3, 0, 1),
+(211281, 211200, '调兵山市', '调兵山', '123.545364', '42.450733', 3, 0, 1),
+(211282, 211200, '开原市', '开原', '124.04555', '42.54214', 3, 0, 1),
+(211300, 210000, '朝阳市', '朝阳', '120.45118', '41.57676', 2, 0, 1),
+(211302, 211300, '双塔区', '双塔', '120.44877', '41.579388', 3, 0, 1),
+(211303, 211300, '龙城区', '龙城', '120.413376', '41.576748', 3, 0, 1),
+(211321, 211300, '朝阳县', '朝阳', '120.40422', '41.52634', 3, 0, 1),
+(211322, 211300, '建平县', '建平', '119.642365', '41.402576', 3, 0, 1),
+(211324, 211300, '喀喇沁左翼蒙古族自治县', '喀左', '119.74488', '41.125427', 3, 0, 1),
+(211381, 211300, '北票市', '北票', '120.76695', '41.803288', 3, 0, 1),
+(211382, 211300, '凌源市', '凌源', '119.40479', '41.243088', 3, 0, 1),
+(211400, 210000, '葫芦岛市', '葫芦岛', '120.85639', '40.755573', 2, 0, 1),
+(211402, 211400, '连山区', '连山', '120.85937', '40.755142', 3, 0, 1),
+(211403, 211400, '龙港区', '龙港', '120.83857', '40.70999', 3, 0, 1),
+(211404, 211400, '南票区', '南票', '120.75231', '41.098812', 3, 0, 1),
+(211421, 211400, '绥中县', '绥中', '120.34211', '40.328407', 3, 0, 1),
+(211422, 211400, '建昌县', '建昌', '119.80778', '40.81287', 3, 0, 1),
+(211481, 211400, '兴城市', '兴城', '120.72936', '40.61941', 3, 0, 1),
+(220000, 0, '吉林省', '吉林', '125.3245', '43.88684', 1, 0, 1),
+(220100, 220000, '长春市', '长春', '125.3245', '43.88684', 2, 0, 1),
+(220102, 220100, '南关区', '南关', '125.337234', '43.890236', 3, 0, 1),
+(220103, 220100, '宽城区', '宽城', '125.34283', '43.903824', 3, 0, 1),
+(220104, 220100, '朝阳区', '朝阳', '125.31804', '43.86491', 3, 0, 1),
+(220105, 220100, '二道区', '二道', '125.38473', '43.870823', 3, 0, 1),
+(220106, 220100, '绿园区', '绿园', '125.27247', '43.892178', 3, 0, 1),
+(220112, 220100, '双阳区', '双阳', '125.65902', '43.52517', 3, 0, 1),
+(220113, 220100, '九台区', '九台', '125.83949', '44.15174', 3, 0, 1),
+(220122, 220100, '农安县', '农安', '125.175285', '44.43126', 3, 0, 1),
+(220182, 220100, '榆树市', '榆树', '126.55011', '44.82764', 3, 0, 1),
+(220183, 220100, '德惠市', '德惠', '125.70332', '44.53391', 3, 0, 1),
+(220184, 220100, '公主岭市', '公主岭', '', '', 3, 0, 1),
+(220200, 220000, '吉林市', '吉林', '126.55302', '43.84358', 2, 0, 1),
+(220202, 220200, '昌邑区', '昌邑', '126.57076', '43.851116', 3, 0, 1),
+(220203, 220200, '龙潭区', '龙潭', '126.56143', '43.909756', 3, 0, 1),
+(220204, 220200, '船营区', '船营', '126.55239', '43.843803', 3, 0, 1),
+(220211, 220200, '丰满区', '丰满', '126.56076', '43.816593', 3, 0, 1),
+(220221, 220200, '永吉县', '永吉', '126.501625', '43.667416', 3, 0, 1),
+(220281, 220200, '蛟河市', '蛟河', '127.342735', '43.720577', 3, 0, 1),
+(220282, 220200, '桦甸市', '桦甸', '126.745445', '42.97209', 3, 0, 1),
+(220283, 220200, '舒兰市', '舒兰', '126.947815', '44.410908', 3, 0, 1),
+(220284, 220200, '磐石市', '磐石', '126.05993', '42.942474', 3, 0, 1),
+(220300, 220000, '四平市', '四平', '124.37079', '43.170345', 2, 0, 1),
+(220302, 220300, '铁西区', '铁西', '124.36089', '43.17626', 3, 0, 1),
+(220303, 220300, '铁东区', '铁东', '124.388466', '43.16726', 3, 0, 1),
+(220322, 220300, '梨树县', '梨树', '124.3358', '43.30831', 3, 0, 1),
+(220323, 220300, '伊通满族自治县', '伊通', '125.30312', '43.345463', 3, 0, 1),
+(220382, 220300, '双辽市', '双辽', '123.50528', '43.518276', 3, 0, 1),
+(220400, 220000, '辽源市', '辽源', '125.14535', '42.90269', 2, 0, 1),
+(220402, 220400, '龙山区', '龙山', '125.145164', '42.902702', 3, 0, 1),
+(220403, 220400, '西安区', '西安', '125.15142', '42.920414', 3, 0, 1),
+(220421, 220400, '东丰县', '东丰', '125.529625', '42.67523', 3, 0, 1),
+(220422, 220400, '东辽县', '东辽', '124.992', '42.927723', 3, 0, 1),
+(220500, 220000, '通化市', '通化', '125.9365', '41.721176', 2, 0, 1),
+(220502, 220500, '东昌区', '东昌', '125.936714', '41.721233', 3, 0, 1),
+(220503, 220500, '二道江区', '二道江', '126.04599', '41.777565', 3, 0, 1),
+(220521, 220500, '通化县', '通化', '125.75312', '41.677917', 3, 0, 1),
+(220523, 220500, '辉南县', '辉南', '126.04282', '42.68346', 3, 0, 1),
+(220524, 220500, '柳河县', '柳河', '125.74054', '42.281483', 3, 0, 1),
+(220581, 220500, '梅河口市', '梅河口', '125.68734', '42.530003', 3, 0, 1),
+(220582, 220500, '集安市', '集安', '126.1862', '41.126274', 3, 0, 1),
+(220600, 220000, '白山市', '白山', '126.42784', '41.942505', 2, 0, 1),
+(220602, 220600, '浑江区', '浑江', '126.42803', '41.943066', 3, 0, 1),
+(220605, 220600, '江源区', '江源', '126.59088', '42.05665', 3, 0, 1),
+(220621, 220600, '抚松县', '抚松', '127.273796', '42.33264', 3, 0, 1),
+(220622, 220600, '靖宇县', '靖宇', '126.80839', '42.38969', 3, 0, 1),
+(220623, 220600, '长白朝鲜族自治县', '长白', '128.20338', '41.41936', 3, 0, 1),
+(220681, 220600, '临江市', '临江', '126.9193', '41.810688', 3, 0, 1),
+(220700, 220000, '松原市', '松原', '124.82361', '45.118244', 2, 0, 1),
+(220702, 220700, '宁江区', '宁江', '124.82785', '45.1765', 3, 0, 1),
+(220721, 220700, '前郭尔罗斯蒙古族自治县', '前郭', '124.826805', '45.116287', 3, 0, 1),
+(220722, 220700, '长岭县', '长岭', '123.98518', '44.27658', 3, 0, 1),
+(220723, 220700, '乾安县', '乾安', '124.02436', '45.006847', 3, 0, 1),
+(220781, 220700, '扶余市', '扶余', '126.04972', '44.99014', 3, 0, 1),
+(220800, 220000, '白城市', '白城', '122.84111', '45.619026', 2, 0, 1),
+(220802, 220800, '洮北区', '洮北', '122.8425', '45.61925', 3, 0, 1),
+(220821, 220800, '镇赉县', '镇赉', '123.20225', '45.84609', 3, 0, 1),
+(220822, 220800, '通榆县', '通榆', '123.08855', '44.80915', 3, 0, 1),
+(220881, 220800, '洮南市', '洮南', '122.783775', '45.33911', 3, 0, 1),
+(220882, 220800, '大安市', '大安', '124.29151', '45.50765', 3, 0, 1),
+(222400, 220000, '延边朝鲜族自治州', '延边朝鲜族', '129.51323', '42.904823', 2, 0, 1),
+(222401, 222400, '延吉市', '延吉', '129.5158', '42.906963', 3, 0, 1),
+(222402, 222400, '图们市', '图们', '129.8467', '42.96662', 3, 0, 1),
+(222403, 222400, '敦化市', '敦化', '128.22986', '43.36692', 3, 0, 1),
+(222404, 222400, '珲春市', '珲春', '130.36578', '42.871056', 3, 0, 1),
+(222405, 222400, '龙井市', '龙井', '129.42575', '42.77103', 3, 0, 1),
+(222406, 222400, '和龙市', '和龙', '129.00874', '42.547005', 3, 0, 1),
+(222424, 222400, '汪清县', '汪清', '129.76616', '43.315426', 3, 0, 1),
+(222426, 222400, '安图县', '安图', '128.90187', '43.110992', 3, 0, 1),
+(230000, 0, '黑龙江省', '黑龙江', '126.64246', '45.756966', 1, 0, 1),
+(230100, 230000, '哈尔滨市', '哈尔滨', '126.64246', '45.756966', 2, 0, 1),
+(230102, 230100, '道里区', '道里', '126.61253', '45.762035', 3, 0, 1),
+(230103, 230100, '南岗区', '南岗', '126.6521', '45.75597', 3, 0, 1),
+(230104, 230100, '道外区', '道外', '126.648834', '45.78454', 3, 0, 1),
+(230108, 230100, '平房区', '平房', '126.62926', '45.605568', 3, 0, 1),
+(230109, 230100, '松北区', '松北', '126.563065', '45.814655', 3, 0, 1),
+(230110, 230100, '香坊区', '香坊', '126.66287', '45.70847', 3, 0, 1),
+(230111, 230100, '呼兰区', '呼兰', '126.6033', '45.98423', 3, 0, 1),
+(230112, 230100, '阿城区', '阿城', '126.95717', '45.54774', 3, 0, 1),
+(230113, 230100, '双城区', '双城', '126.31227', '45.38355', 3, 0, 1),
+(230123, 230100, '依兰县', '依兰', '129.5656', '46.315105', 3, 0, 1),
+(230124, 230100, '方正县', '方正', '128.83614', '45.839535', 3, 0, 1),
+(230125, 230100, '宾县', '宾县', '127.48594', '45.75937', 3, 0, 1),
+(230126, 230100, '巴彦县', '巴彦', '127.4036', '46.08189', 3, 0, 1),
+(230127, 230100, '木兰县', '木兰', '128.04268', '45.949825', 3, 0, 1),
+(230128, 230100, '通河县', '通河', '128.74779', '45.97762', 3, 0, 1),
+(230129, 230100, '延寿县', '延寿', '128.33188', '45.455647', 3, 0, 1),
+(230183, 230100, '尚志市', '尚志', '127.96854', '45.214954', 3, 0, 1),
+(230184, 230100, '五常市', '五常', '127.15759', '44.91942', 3, 0, 1),
+(230200, 230000, '齐齐哈尔市', '齐齐哈尔', '123.95792', '47.34208', 2, 0, 1),
+(230202, 230200, '龙沙区', '龙沙', '123.95734', '47.341736', 3, 0, 1),
+(230203, 230200, '建华区', '建华', '123.95589', '47.354492', 3, 0, 1),
+(230204, 230200, '铁锋区', '铁锋', '123.97356', '47.3395', 3, 0, 1),
+(230205, 230200, '昂昂溪区', '昂昂溪', '123.81318', '47.156868', 3, 0, 1),
+(230206, 230200, '富拉尔基区', '富拉尔基', '123.63887', '47.20697', 3, 0, 1),
+(230207, 230200, '碾子山区', '碾子山', '122.88797', '47.51401', 3, 0, 1),
+(230208, 230200, '梅里斯达斡尔族区', '梅里斯达斡尔族', '123.7546', '47.31111', 3, 0, 1),
+(230221, 230200, '龙江县', '龙江', '123.187225', '47.336388', 3, 0, 1),
+(230223, 230200, '依安县', '依安', '125.30756', '47.8901', 3, 0, 1),
+(230224, 230200, '泰来县', '泰来', '123.41953', '46.39233', 3, 0, 1),
+(230225, 230200, '甘南县', '甘南', '123.506035', '47.91784', 3, 0, 1),
+(230227, 230200, '富裕县', '富裕', '124.46911', '47.797173', 3, 0, 1),
+(230229, 230200, '克山县', '克山', '125.87435', '48.034344', 3, 0, 1),
+(230230, 230200, '克东县', '克东', '126.24909', '48.03732', 3, 0, 1),
+(230231, 230200, '拜泉县', '拜泉', '126.09191', '47.607365', 3, 0, 1),
+(230281, 230200, '讷河市', '讷河', '124.88217', '48.481133', 3, 0, 1),
+(230300, 230000, '鸡西市', '鸡西', '130.97597', '45.300045', 2, 0, 1),
+(230302, 230300, '鸡冠区', '鸡冠', '130.97438', '45.30034', 3, 0, 1),
+(230303, 230300, '恒山区', '恒山', '130.91063', '45.21324', 3, 0, 1),
+(230304, 230300, '滴道区', '滴道', '130.84682', '45.348812', 3, 0, 1),
+(230305, 230300, '梨树区', '梨树', '130.69778', '45.092194', 3, 0, 1),
+(230306, 230300, '城子河区', '城子河', '131.0105', '45.33825', 3, 0, 1),
+(230307, 230300, '麻山区', '麻山', '130.48112', '45.209606', 3, 0, 1),
+(230321, 230300, '鸡东县', '鸡东', '131.14891', '45.250893', 3, 0, 1),
+(230381, 230300, '虎林市', '虎林', '132.97388', '45.767986', 3, 0, 1),
+(230382, 230300, '密山市', '密山', '131.87413', '45.54725', 3, 0, 1),
+(230400, 230000, '鹤岗市', '鹤岗', '130.27748', '47.332085', 2, 0, 1),
+(230402, 230400, '向阳区', '向阳', '130.29248', '47.34537', 3, 0, 1),
+(230403, 230400, '工农区', '工农', '130.27666', '47.331676', 3, 0, 1),
+(230404, 230400, '南山区', '南山', '130.27553', '47.31324', 3, 0, 1),
+(230405, 230400, '兴安区', '兴安', '130.23618', '47.25291', 3, 0, 1),
+(230406, 230400, '东山区', '东山', '130.31714', '47.337383', 3, 0, 1),
+(230407, 230400, '兴山区', '兴山', '130.30534', '47.35997', 3, 0, 1),
+(230421, 230400, '萝北县', '萝北', '130.82909', '47.577576', 3, 0, 1),
+(230422, 230400, '绥滨县', '绥滨', '131.86052', '47.28989', 3, 0, 1),
+(230500, 230000, '双鸭山市', '双鸭山', '131.1573', '46.64344', 2, 0, 1),
+(230502, 230500, '尖山区', '尖山', '131.15897', '46.64296', 3, 0, 1),
+(230503, 230500, '岭东区', '岭东', '131.16368', '46.591076', 3, 0, 1),
+(230505, 230500, '四方台区', '四方台', '131.33318', '46.594345', 3, 0, 1),
+(230506, 230500, '宝山区', '宝山', '131.4043', '46.573364', 3, 0, 1),
+(230521, 230500, '集贤县', '集贤', '131.13933', '46.72898', 3, 0, 1),
+(230522, 230500, '友谊县', '友谊', '131.81062', '46.775158', 3, 0, 1),
+(230523, 230500, '宝清县', '宝清', '132.20642', '46.32878', 3, 0, 1),
+(230524, 230500, '饶河县', '饶河', '134.02116', '46.80129', 3, 0, 1),
+(230600, 230000, '大庆市', '大庆', '125.11272', '46.590733', 2, 0, 1),
+(230602, 230600, '萨尔图区', '萨尔图', '125.11464', '46.596355', 3, 0, 1),
+(230603, 230600, '龙凤区', '龙凤', '125.1458', '46.573948', 3, 0, 1),
+(230604, 230600, '让胡路区', '让胡路', '124.86834', '46.653255', 3, 0, 1),
+(230605, 230600, '红岗区', '红岗', '124.88953', '46.40305', 3, 0, 1),
+(230606, 230600, '大同区', '大同', '124.81851', '46.034306', 3, 0, 1),
+(230621, 230600, '肇州县', '肇州', '125.273254', '45.708687', 3, 0, 1),
+(230622, 230600, '肇源县', '肇源', '125.08197', '45.518833', 3, 0, 1),
+(230623, 230600, '林甸县', '林甸', '124.87774', '47.186413', 3, 0, 1),
+(230624, 230600, '杜尔伯特蒙古族自治县', '杜尔伯特', '124.44626', '46.865974', 3, 0, 1),
+(230700, 230000, '伊春市', '伊春', '128.8994', '47.724773', 2, 0, 1),
+(230717, 230700, '伊美区', '伊美', '128.907302', '47.728208', 3, 0, 1),
+(230718, 230700, '乌翠区', '乌翠', '128.66945', '47.726495', 3, 0, 1),
+(230719, 230700, '友好区', '友好', '128.84071', '47.8538', 3, 0, 1),
+(230722, 230700, '嘉荫县', '嘉荫', '130.39769', '48.891376', 3, 0, 1),
+(230723, 230700, '汤旺县', '汤旺', '129.570968', '48.454691', 3, 0, 1),
+(230724, 230700, '丰林县', '丰林', '129.53362', '48.29045', 3, 0, 1),
+(230725, 230700, '大箐山县', '大箐山', '129.02057', '47.02834', 3, 0, 1),
+(230726, 230700, '南岔县', '南岔', '129.28365', '47.13799', 3, 0, 1),
+(230751, 230700, '金林区', '金林', '129.42899', '47.41303', 3, 0, 1),
+(230781, 230700, '铁力市', '铁力', '128.03056', '46.98577', 3, 0, 1),
+(230800, 230000, '佳木斯市', '佳木斯', '130.36163', '46.809605', 2, 0, 1),
+(230803, 230800, '向阳区', '向阳', '130.36179', '46.809647', 3, 0, 1),
+(230804, 230800, '前进区', '前进', '130.37769', '46.812344', 3, 0, 1),
+(230805, 230800, '东风区', '东风', '130.40329', '46.822475', 3, 0, 1),
+(230811, 230800, '郊区', '郊区', '130.36163', '46.809605', 3, 0, 1),
+(230822, 230800, '桦南县', '桦南', '130.57011', '46.240116', 3, 0, 1),
+(230826, 230800, '桦川县', '桦川', '130.72371', '47.02304', 3, 0, 1),
+(230828, 230800, '汤原县', '汤原', '129.90446', '46.73005', 3, 0, 1),
+(230881, 230800, '同江市', '同江', '132.51012', '47.65113', 3, 0, 1),
+(230882, 230800, '富锦市', '富锦', '132.03795', '47.250748', 3, 0, 1),
+(230883, 230800, '抚远市', '抚远', '134.30795', '48.36485', 3, 0, 1),
+(230900, 230000, '七台河市', '七台河', '131.01558', '45.771267', 2, 0, 1),
+(230902, 230900, '新兴区', '新兴', '130.88948', '45.79426', 3, 0, 1),
+(230903, 230900, '桃山区', '桃山', '131.01585', '45.771217', 3, 0, 1),
+(230904, 230900, '茄子河区', '茄子河', '131.07156', '45.77659', 3, 0, 1),
+(230921, 230900, '勃利县', '勃利', '130.57503', '45.75157', 3, 0, 1),
+(231000, 230000, '牡丹江市', '牡丹江', '129.6186', '44.582962', 2, 0, 1),
+(231002, 231000, '东安区', '东安', '129.62329', '44.582397', 3, 0, 1),
+(231003, 231000, '阳明区', '阳明', '129.63464', '44.59633', 3, 0, 1),
+(231004, 231000, '爱民区', '爱民', '129.60123', '44.595444', 3, 0, 1),
+(231005, 231000, '西安区', '西安', '129.61311', '44.58103', 3, 0, 1),
+(231025, 231000, '林口县', '林口', '130.2684', '45.286644', 3, 0, 1),
+(231081, 231000, '绥芬河市', '绥芬河', '131.16486', '44.396866', 3, 0, 1),
+(231083, 231000, '海林市', '海林', '129.38791', '44.57415', 3, 0, 1),
+(231084, 231000, '宁安市', '宁安', '129.47002', '44.346836', 3, 0, 1),
+(231085, 231000, '穆棱市', '穆棱', '130.52708', '44.91967', 3, 0, 1),
+(231086, 231000, '东宁市', '东宁', '131.12463', '44.08694', 3, 0, 1),
+(231100, 230000, '黑河市', '黑河', '127.49902', '50.249584', 2, 0, 1),
+(231102, 231100, '爱辉区', '爱辉', '127.49764', '50.249027', 3, 0, 1),
+(231123, 231100, '逊克县', '逊克', '128.47615', '49.582973', 3, 0, 1),
+(231124, 231100, '孙吴县', '孙吴', '127.32732', '49.423943', 3, 0, 1),
+(231181, 231100, '北安市', '北安', '126.508736', '48.245438', 3, 0, 1),
+(231182, 231100, '五大连池市', '五大连池', '126.19769', '48.512688', 3, 0, 1),
+(231183, 231100, '嫩江市', '嫩江', '125.22094', '49.18572', 3, 0, 1),
+(231200, 230000, '绥化市', '绥化', '126.99293', '46.637394', 2, 0, 1),
+(231202, 231200, '北林区', '北林', '126.99066', '46.63491', 3, 0, 1),
+(231221, 231200, '望奎县', '望奎', '126.48419', '46.83352', 3, 0, 1),
+(231222, 231200, '兰西县', '兰西', '126.289314', '46.259037', 3, 0, 1),
+(231223, 231200, '青冈县', '青冈', '126.11227', '46.686596', 3, 0, 1),
+(231224, 231200, '庆安县', '庆安', '127.510025', '46.879204', 3, 0, 1),
+(231225, 231200, '明水县', '明水', '125.90755', '47.18353', 3, 0, 1),
+(231226, 231200, '绥棱县', '绥棱', '127.11112', '47.247196', 3, 0, 1),
+(231281, 231200, '安达市', '安达', '125.329926', '46.410614', 3, 0, 1),
+(231282, 231200, '肇东市', '肇东', '125.9914', '46.06947', 3, 0, 1),
+(231283, 231200, '海伦市', '海伦', '126.96938', '47.460426', 3, 0, 1),
+(232700, 230000, '大兴安岭地区', '大兴安岭', '124.711525', '52.335262', 2, 0, 1),
+(232701, 232700, '漠河市', '漠河', '122.53864', '52.97209', 3, 0, 1),
+(232721, 232700, '呼玛县', '呼玛', '126.6621', '51.726997', 3, 0, 1),
+(232722, 232700, '塔河县', '塔河', '124.71052', '52.335228', 3, 0, 1),
+(310000, 0, '上海市', '上海', '121.47264', '31.231707', 1, 0, 1),
+(310100, 310000, '上海市', '上海', '121.47264', '31.231707', 2, 0, 1),
+(310101, 310100, '黄浦区', '黄浦', '121.49032', '31.22277', 3, 0, 1),
+(310104, 310100, '徐汇区', '徐汇', '121.43752', '31.179974', 3, 0, 1),
+(310105, 310100, '长宁区', '长宁', '121.4222', '31.218122', 3, 0, 1),
+(310106, 310100, '静安区', '静安', '121.44823', '31.229004', 3, 0, 1),
+(310107, 310100, '普陀区', '普陀', '121.3925', '31.241701', 3, 0, 1),
+(310109, 310100, '虹口区', '虹口', '121.49183', '31.26097', 3, 0, 1),
+(310110, 310100, '杨浦区', '杨浦', '121.5228', '31.270756', 3, 0, 1),
+(310112, 310100, '闵行区', '闵行', '121.37597', '31.111658', 3, 0, 1),
+(310113, 310100, '宝山区', '宝山', '121.48994', '31.398895', 3, 0, 1),
+(310114, 310100, '嘉定区', '嘉定', '121.250336', '31.383524', 3, 0, 1),
+(310115, 310100, '浦东新区', '浦东', '121.5677', '31.245943', 3, 0, 1),
+(310116, 310100, '金山区', '金山', '121.330734', '30.724697', 3, 0, 1),
+(310117, 310100, '松江区', '松江', '121.22354', '31.03047', 3, 0, 1),
+(310118, 310100, '青浦区', '青浦', '121.11302', '31.151209', 3, 0, 1),
+(310120, 310100, '奉贤区', '奉贤', '121.45847', '30.912346', 3, 0, 1),
+(310151, 310100, '崇明区', '崇明', '121.3973', '31.6229', 3, 0, 1),
+(320000, 0, '江苏省', '江苏', '118.76741', '32.041546', 1, 0, 1),
+(320100, 320000, '南京市', '南京', '118.76741', '32.041546', 2, 0, 1),
+(320102, 320100, '玄武区', '玄武', '118.7922', '32.05068', 3, 0, 1),
+(320104, 320100, '秦淮区', '秦淮', '118.78609', '32.033817', 3, 0, 1),
+(320105, 320100, '建邺区', '建邺', '118.73269', '32.00454', 3, 0, 1),
+(320106, 320100, '鼓楼区', '鼓楼', '118.76974', '32.066967', 3, 0, 1),
+(320111, 320100, '浦口区', '浦口', '118.625305', '32.05839', 3, 0, 1),
+(320113, 320100, '栖霞区', '栖霞', '118.8087', '32.102146', 3, 0, 1),
+(320114, 320100, '雨花台区', '雨花台', '118.77207', '31.995947', 3, 0, 1),
+(320115, 320100, '江宁区', '江宁', '118.850624', '31.953419', 3, 0, 1),
+(320116, 320100, '六合区', '六合', '118.85065', '32.340656', 3, 0, 1),
+(320117, 320100, '溧水区', '溧水', '119.0284', '31.651', 3, 0, 1),
+(320118, 320100, '高淳区', '高淳', '118.8921', '31.32751', 3, 0, 1),
+(320200, 320000, '无锡市', '无锡', '120.30167', '31.57473', 2, 0, 1),
+(320205, 320200, '锡山区', '锡山', '120.3573', '31.58556', 3, 0, 1),
+(320206, 320200, '惠山区', '惠山', '120.30354', '31.681019', 3, 0, 1),
+(320211, 320200, '滨湖区', '滨湖', '120.26605', '31.550228', 3, 0, 1),
+(320213, 320200, '梁溪区', '梁溪', '120.30297', '31.56597', 3, 0, 1),
+(320214, 320200, '新吴区', '新吴', '120.36434', '31.49055', 3, 0, 1),
+(320281, 320200, '江阴市', '江阴', '120.275894', '31.910984', 3, 0, 1),
+(320282, 320200, '宜兴市', '宜兴', '119.82054', '31.364384', 3, 0, 1),
+(320300, 320000, '徐州市', '徐州', '117.184814', '34.26179', 2, 0, 1),
+(320302, 320300, '鼓楼区', '鼓楼', '117.19294', '34.269398', 3, 0, 1),
+(320303, 320300, '云龙区', '云龙', '117.19459', '34.254807', 3, 0, 1),
+(320305, 320300, '贾汪区', '贾汪', '117.45021', '34.441643', 3, 0, 1),
+(320311, 320300, '泉山区', '泉山', '117.18223', '34.26225', 3, 0, 1),
+(320312, 320300, '铜山区', '铜山', '117.16898', '34.18044', 3, 0, 1),
+(320321, 320300, '丰县', '丰县', '116.59289', '34.696945', 3, 0, 1),
+(320322, 320300, '沛县', '沛县', '116.93718', '34.729046', 3, 0, 1),
+(320324, 320300, '睢宁县', '睢宁', '117.95066', '33.899223', 3, 0, 1),
+(320381, 320300, '新沂市', '新沂', '118.345825', '34.36878', 3, 0, 1),
+(320382, 320300, '邳州市', '邳州', '117.96392', '34.31471', 3, 0, 1),
+(320400, 320000, '常州市', '常州', '119.946976', '31.772753', 2, 0, 1),
+(320402, 320400, '天宁区', '天宁', '119.96378', '31.779633', 3, 0, 1),
+(320404, 320400, '钟楼区', '钟楼', '119.94839', '31.78096', 3, 0, 1),
+(320411, 320400, '新北区', '新北', '119.974655', '31.824663', 3, 0, 1),
+(320412, 320400, '武进区', '武进', '119.95877', '31.718567', 3, 0, 1),
+(320413, 320400, '金坛区', '金坛', '119.59794', '31.72322', 3, 0, 1),
+(320481, 320400, '溧阳市', '溧阳', '119.487816', '31.42708', 3, 0, 1),
+(320500, 320000, '苏州市', '苏州', '120.61958', '31.29938', 2, 0, 1),
+(320505, 320500, '虎丘区', '虎丘', '120.56683', '31.294846', 3, 0, 1),
+(320506, 320500, '吴中区', '吴中', '120.62462', '31.27084', 3, 0, 1),
+(320507, 320500, '相城区', '相城', '120.61896', '31.396685', 3, 0, 1),
+(320508, 320500, '姑苏区', '姑苏', '120.622246', '31.311415', 3, 0, 1),
+(320509, 320500, '吴江区', '吴江', '120.64517', '31.13914', 3, 0, 1),
+(320581, 320500, '常熟市', '常熟', '120.74852', '31.658155', 3, 0, 1),
+(320582, 320500, '张家港市', '张家港', '120.54344', '31.865553', 3, 0, 1),
+(320583, 320500, '昆山市', '昆山', '120.95814', '31.381926', 3, 0, 1),
+(320585, 320500, '太仓市', '太仓', '121.112274', '31.452568', 3, 0, 1),
+(320600, 320000, '南通市', '南通', '120.86461', '32.016212', 2, 0, 1),
+(320602, 320600, '崇川区', '崇川', '120.86635', '32.015278', 3, 0, 1),
+(320611, 320600, '港闸区', '港闸', '120.8339', '32.0403', 3, 0, 1),
+(320612, 320600, '通州区', '通州', '121.07317', '32.084286', 3, 0, 1),
+(320623, 320600, '如东县', '如东', '121.18609', '32.311832', 3, 0, 1),
+(320681, 320600, '启东市', '启东', '121.65972', '31.810158', 3, 0, 1),
+(320682, 320600, '如皋市', '如皋', '120.56632', '32.39159', 3, 0, 1),
+(320684, 320600, '海门市', '海门', '121.176605', '31.893528', 3, 0, 1),
+(320685, 320600, '海安市', '海安', '120.46759', '32.53308', 3, 0, 1),
+(320700, 320000, '连云港市', '连云港', '119.17882', '34.600018', 2, 0, 1),
+(320703, 320700, '连云区', '连云', '119.366486', '34.73953', 3, 0, 1),
+(320706, 320700, '海州区', '海州', '119.137146', '34.57129', 3, 0, 1),
+(320707, 320700, '赣榆区', '赣榆', '119.1773', '34.84065', 3, 0, 1),
+(320722, 320700, '东海县', '东海', '118.76649', '34.522858', 3, 0, 1),
+(320723, 320700, '灌云县', '灌云', '119.25574', '34.298435', 3, 0, 1),
+(320724, 320700, '灌南县', '灌南', '119.35233', '34.092552', 3, 0, 1),
+(320800, 320000, '淮安市', '淮安', '119.02126', '33.597507', 2, 0, 1),
+(320803, 320800, '淮安区', '淮安', '119.14634', '33.5075', 3, 0, 1),
+(320804, 320800, '淮阴区', '淮阴', '119.02082', '33.62245', 3, 0, 1),
+(320812, 320800, '清江浦区', '清江浦', '119.02662', '33.55308', 3, 0, 1),
+(320813, 320800, '洪泽区', '洪泽', '118.8735', '33.29433', 3, 0, 1),
+(320826, 320800, '涟水县', '涟水', '119.266075', '33.77131', 3, 0, 1),
+(320830, 320800, '盱眙县', '盱眙', '118.49382', '33.00439', 3, 0, 1),
+(320831, 320800, '金湖县', '金湖', '119.01694', '33.01816', 3, 0, 1),
+(320900, 320000, '盐城市', '盐城', '120.14', '33.377632', 2, 0, 1),
+(320902, 320900, '亭湖区', '亭湖', '120.13608', '33.38391', 3, 0, 1),
+(320903, 320900, '盐都区', '盐都', '120.139755', '33.34129', 3, 0, 1),
+(320904, 320900, '大丰区', '大丰', '120.50102', '33.20107', 3, 0, 1),
+(320921, 320900, '响水县', '响水', '119.579575', '34.19996', 3, 0, 1),
+(320922, 320900, '滨海县', '滨海', '119.82844', '33.989887', 3, 0, 1),
+(320923, 320900, '阜宁县', '阜宁', '119.805336', '33.78573', 3, 0, 1),
+(320924, 320900, '射阳县', '射阳', '120.25745', '33.77378', 3, 0, 1),
+(320925, 320900, '建湖县', '建湖', '119.793106', '33.472622', 3, 0, 1),
+(320981, 320900, '东台市', '东台', '120.3141', '32.853172', 3, 0, 1),
+(321000, 320000, '扬州市', '扬州', '119.421005', '32.393158', 2, 0, 1),
+(321002, 321000, '广陵区', '广陵', '119.44227', '32.392155', 3, 0, 1),
+(321003, 321000, '邗江区', '邗江', '119.39777', '32.3779', 3, 0, 1),
+(321012, 321000, '江都区', '江都', '119.57006', '32.43458', 3, 0, 1),
+(321023, 321000, '宝应县', '宝应', '119.32128', '33.23694', 3, 0, 1),
+(321081, 321000, '仪征市', '仪征', '119.18244', '32.271965', 3, 0, 1),
+(321084, 321000, '高邮市', '高邮', '119.44384', '32.785164', 3, 0, 1),
+(321100, 320000, '镇江市', '镇江', '119.45275', '32.204403', 2, 0, 1),
+(321102, 321100, '京口区', '京口', '119.454575', '32.206192', 3, 0, 1),
+(321111, 321100, '润州区', '润州', '119.41488', '32.2135', 3, 0, 1),
+(321112, 321100, '丹徒区', '丹徒', '119.43388', '32.12897', 3, 0, 1),
+(321181, 321100, '丹阳市', '丹阳', '119.58191', '31.991459', 3, 0, 1),
+(321182, 321100, '扬中市', '扬中', '119.82806', '32.237267', 3, 0, 1),
+(321183, 321100, '句容市', '句容', '119.16714', '31.947355', 3, 0, 1),
+(321200, 320000, '泰州市', '泰州', '119.91518', '32.484882', 2, 0, 1),
+(321202, 321200, '海陵区', '海陵', '119.92019', '32.488407', 3, 0, 1),
+(321203, 321200, '高港区', '高港', '119.88166', '32.3157', 3, 0, 1),
+(321204, 321200, '姜堰区', '姜堰', '120.12673', '32.50879', 3, 0, 1),
+(321281, 321200, '兴化市', '兴化', '119.840164', '32.938065', 3, 0, 1),
+(321282, 321200, '靖江市', '靖江', '120.26825', '32.01817', 3, 0, 1),
+(321283, 321200, '泰兴市', '泰兴', '120.020226', '32.168785', 3, 0, 1),
+(321300, 320000, '宿迁市', '宿迁', '118.27516', '33.96301', 2, 0, 1),
+(321302, 321300, '宿城区', '宿城', '118.278984', '33.937725', 3, 0, 1),
+(321311, 321300, '宿豫区', '宿豫', '118.33001', '33.94107', 3, 0, 1),
+(321322, 321300, '沭阳县', '沭阳', '118.77589', '34.129097', 3, 0, 1),
+(321323, 321300, '泗阳县', '泗阳', '118.68128', '33.711433', 3, 0, 1),
+(321324, 321300, '泗洪县', '泗洪', '118.21182', '33.45654', 3, 0, 1),
+(330000, 0, '浙江省', '浙江', '120.15358', '30.287458', 1, 0, 1),
+(330100, 330000, '杭州市', '杭州', '120.15358', '30.287458', 2, 0, 1),
+(330102, 330100, '上城区', '上城', '120.17146', '30.250237', 3, 0, 1),
+(330103, 330100, '下城区', '下城', '120.17276', '30.276272', 3, 0, 1),
+(330104, 330100, '江干区', '江干', '120.20264', '30.266603', 3, 0, 1),
+(330105, 330100, '拱墅区', '拱墅', '120.150055', '30.314697', 3, 0, 1),
+(330106, 330100, '西湖区', '西湖', '120.14738', '30.272934', 3, 0, 1),
+(330108, 330100, '滨江区', '滨江', '120.21062', '30.206615', 3, 0, 1),
+(330109, 330100, '萧山区', '萧山', '120.27069', '30.162931', 3, 0, 1),
+(330110, 330100, '余杭区', '余杭', '120.301735', '30.421186', 3, 0, 1),
+(330111, 330100, '富阳区', '富阳', '119.96043', '30.04885', 3, 0, 1),
+(330112, 330100, '临安区', '临安', '119.7248', '30.23383', 3, 0, 1),
+(330122, 330100, '桐庐县', '桐庐', '119.68504', '29.797438', 3, 0, 1),
+(330127, 330100, '淳安县', '淳安', '119.04427', '29.604177', 3, 0, 1),
+(330182, 330100, '建德市', '建德', '119.27909', '29.472284', 3, 0, 1),
+(330200, 330000, '宁波市', '宁波', '121.54979', '29.868387', 2, 0, 1),
+(330203, 330200, '海曙区', '海曙', '121.539696', '29.874453', 3, 0, 1),
+(330205, 330200, '江北区', '江北', '121.55928', '29.888361', 3, 0, 1),
+(330206, 330200, '北仑区', '北仑', '121.83131', '29.90944', 3, 0, 1),
+(330211, 330200, '镇海区', '镇海', '121.713165', '29.952106', 3, 0, 1),
+(330212, 330200, '鄞州区', '鄞州', '121.55843', '29.831661', 3, 0, 1),
+(330213, 330200, '奉化区', '奉化', '121.40686', '29.65503', 3, 0, 1),
+(330225, 330200, '象山县', '象山', '121.87709', '29.470205', 3, 0, 1),
+(330226, 330200, '宁海县', '宁海', '121.43261', '29.299835', 3, 0, 1),
+(330281, 330200, '余姚市', '余姚', '121.156296', '30.045404', 3, 0, 1),
+(330282, 330200, '慈溪市', '慈溪', '121.248055', '30.177141', 3, 0, 1),
+(330300, 330000, '温州市', '温州', '120.67211', '28.000574', 2, 0, 1),
+(330302, 330300, '鹿城区', '鹿城', '120.67423', '28.003351', 3, 0, 1),
+(330303, 330300, '龙湾区', '龙湾', '120.763466', '27.970255', 3, 0, 1),
+(330304, 330300, '瓯海区', '瓯海', '120.637146', '28.006445', 3, 0, 1),
+(330305, 330300, '洞头区', '洞头', '121.1572', '27.83616', 3, 0, 1),
+(330324, 330300, '永嘉县', '永嘉', '120.69097', '28.153887', 3, 0, 1),
+(330326, 330300, '平阳县', '平阳', '120.564384', '27.6693', 3, 0, 1),
+(330327, 330300, '苍南县', '苍南', '120.40626', '27.507744', 3, 0, 1),
+(330328, 330300, '文成县', '文成', '120.09245', '27.789133', 3, 0, 1),
+(330329, 330300, '泰顺县', '泰顺', '119.71624', '27.557308', 3, 0, 1),
+(330381, 330300, '瑞安市', '瑞安', '120.64617', '27.779322', 3, 0, 1),
+(330382, 330300, '乐清市', '乐清', '120.96715', '28.116083', 3, 0, 1),
+(330383, 330300, '龙港市', '龙港', '120.553102', '27.578205', 3, 0, 1),
+(330400, 330000, '嘉兴市', '嘉兴', '120.75086', '30.762653', 2, 0, 1),
+(330402, 330400, '南湖区', '南湖', '120.749954', '30.764652', 3, 0, 1),
+(330411, 330400, '秀洲区', '秀洲', '120.72043', '30.763323', 3, 0, 1),
+(330421, 330400, '嘉善县', '嘉善', '120.92187', '30.841352', 3, 0, 1),
+(330424, 330400, '海盐县', '海盐', '120.94202', '30.522223', 3, 0, 1),
+(330481, 330400, '海宁市', '海宁', '120.68882', '30.525543', 3, 0, 1),
+(330482, 330400, '平湖市', '平湖', '121.01466', '30.698921', 3, 0, 1),
+(330483, 330400, '桐乡市', '桐乡', '120.55109', '30.629065', 3, 0, 1),
+(330500, 330000, '湖州市', '湖州', '120.1024', '30.867199', 2, 0, 1),
+(330502, 330500, '吴兴区', '吴兴', '120.10142', '30.867252', 3, 0, 1),
+(330503, 330500, '南浔区', '南浔', '120.4172', '30.872742', 3, 0, 1),
+(330521, 330500, '德清县', '德清', '119.96766', '30.534927', 3, 0, 1),
+(330522, 330500, '长兴县', '长兴', '119.910126', '31.00475', 3, 0, 1),
+(330523, 330500, '安吉县', '安吉', '119.68789', '30.631973', 3, 0, 1),
+(330600, 330000, '绍兴市', '绍兴', '120.582115', '29.997116', 2, 0, 1),
+(330602, 330600, '越城区', '越城', '120.58531', '29.996992', 3, 0, 1),
+(330603, 330600, '柯桥区', '柯桥', '120.49476', '30.08189', 3, 0, 1),
+(330604, 330600, '上虞区', '上虞', '120.86858', '30.03227', 3, 0, 1),
+(330624, 330600, '新昌县', '新昌', '120.90566', '29.501205', 3, 0, 1),
+(330681, 330600, '诸暨市', '诸暨', '120.24432', '29.713661', 3, 0, 1),
+(330683, 330600, '嵊州市', '嵊州', '120.82888', '29.586605', 3, 0, 1),
+(330700, 330000, '金华市', '金华', '119.649506', '29.089523', 2, 0, 1),
+(330702, 330700, '婺城区', '婺城', '119.65258', '29.082607', 3, 0, 1),
+(330703, 330700, '金东区', '金东', '119.68127', '29.095835', 3, 0, 1),
+(330723, 330700, '武义县', '武义', '119.81916', '28.896563', 3, 0, 1),
+(330726, 330700, '浦江县', '浦江', '119.893364', '29.451254', 3, 0, 1),
+(330727, 330700, '磐安县', '磐安', '120.44513', '29.052628', 3, 0, 1),
+(330781, 330700, '兰溪市', '兰溪', '119.46052', '29.210066', 3, 0, 1),
+(330782, 330700, '义乌市', '义乌', '120.07491', '29.306864', 3, 0, 1),
+(330783, 330700, '东阳市', '东阳', '120.23334', '29.262547', 3, 0, 1),
+(330784, 330700, '永康市', '永康', '120.03633', '28.895292', 3, 0, 1),
+(330800, 330000, '衢州市', '衢州', '118.87263', '28.941708', 2, 0, 1),
+(330802, 330800, '柯城区', '柯城', '118.87304', '28.944538', 3, 0, 1),
+(330803, 330800, '衢江区', '衢江', '118.95768', '28.973194', 3, 0, 1),
+(330822, 330800, '常山县', '常山', '118.52165', '28.90004', 3, 0, 1),
+(330824, 330800, '开化县', '开化', '118.41444', '29.136503', 3, 0, 1),
+(330825, 330800, '龙游县', '龙游', '119.17252', '29.031364', 3, 0, 1),
+(330881, 330800, '江山市', '江山', '118.62788', '28.734674', 3, 0, 1),
+(330900, 330000, '舟山市', '舟山', '122.106865', '30.016027', 2, 0, 1),
+(330902, 330900, '定海区', '定海', '122.1085', '30.016422', 3, 0, 1),
+(330903, 330900, '普陀区', '普陀', '122.301956', '29.945614', 3, 0, 1),
+(330921, 330900, '岱山县', '岱山', '122.20113', '30.242865', 3, 0, 1),
+(330922, 330900, '嵊泗县', '嵊泗', '122.45781', '30.727165', 3, 0, 1),
+(331000, 330000, '台州市', '台州', '121.4286', '28.661379', 2, 0, 1),
+(331002, 331000, '椒江区', '椒江', '121.431046', '28.67615', 3, 0, 1),
+(331003, 331000, '黄岩区', '黄岩', '121.26214', '28.64488', 3, 0, 1),
+(331004, 331000, '路桥区', '路桥', '121.37292', '28.581799', 3, 0, 1),
+(331022, 331000, '三门县', '三门', '121.37643', '29.118956', 3, 0, 1),
+(331023, 331000, '天台县', '天台', '121.03123', '29.141127', 3, 0, 1),
+(331024, 331000, '仙居县', '仙居', '120.73508', '28.849213', 3, 0, 1),
+(331081, 331000, '温岭市', '温岭', '121.37361', '28.36878', 3, 0, 1),
+(331082, 331000, '临海市', '临海', '121.131226', '28.845442', 3, 0, 1),
+(331083, 331000, '玉环市', '玉环', '121.23164', '28.13589', 3, 0, 1),
+(331100, 330000, '丽水市', '丽水', '119.92178', '28.451994', 2, 0, 1),
+(331102, 331100, '莲都区', '莲都', '119.922295', '28.451103', 3, 0, 1),
+(331121, 331100, '青田县', '青田', '120.29194', '28.135246', 3, 0, 1),
+(331122, 331100, '缙云县', '缙云', '120.078964', '28.654207', 3, 0, 1),
+(331123, 331100, '遂昌县', '遂昌', '119.27589', '28.5924', 3, 0, 1),
+(331124, 331100, '松阳县', '松阳', '119.48529', '28.449938', 3, 0, 1),
+(331125, 331100, '云和县', '云和', '119.56946', '28.111076', 3, 0, 1),
+(331126, 331100, '庆元县', '庆元', '119.06723', '27.61823', 3, 0, 1),
+(331127, 331100, '景宁畲族自治县', '景宁', '119.63467', '27.977247', 3, 0, 1),
+(331181, 331100, '龙泉市', '龙泉', '119.13232', '28.069178', 3, 0, 1),
+(340000, 0, '安徽省', '安徽', '117.28304', '31.86119', 1, 0, 1),
+(340100, 340000, '合肥市', '合肥', '117.28304', '31.86119', 2, 0, 1),
+(340102, 340100, '瑶海区', '瑶海', '117.31536', '31.86961', 3, 0, 1),
+(340103, 340100, '庐阳区', '庐阳', '117.283775', '31.86901', 3, 0, 1),
+(340104, 340100, '蜀山区', '蜀山', '117.26207', '31.855867', 3, 0, 1),
+(340111, 340100, '包河区', '包河', '117.28575', '31.82956', 3, 0, 1),
+(340121, 340100, '长丰县', '长丰', '117.164696', '32.478546', 3, 0, 1),
+(340122, 340100, '肥东县', '肥东', '117.46322', '31.883991', 3, 0, 1),
+(340123, 340100, '肥西县', '肥西', '117.166115', '31.719646', 3, 0, 1),
+(340124, 340100, '庐江县', '庐江', '117.28736', '31.25567', 3, 0, 1),
+(340181, 340100, '巢湖市', '巢湖', '117.88937', '31.62329', 3, 0, 1),
+(340200, 340000, '芜湖市', '芜湖', '118.37645', '31.326319', 2, 0, 1),
+(340202, 340200, '镜湖区', '镜湖', '118.37634', '31.32559', 3, 0, 1),
+(340207, 340200, '鸠江区', '鸠江', '118.40018', '31.362717', 3, 0, 1),
+(340209, 340200, '弋江区', '弋江', '', '', 3, 0, 1),
+(340210, 340200, '湾沚区', '湾沚', '', '', 3, 0, 1),
+(340211, 340200, '繁昌区', '繁昌', '', '', 3, 0, 1),
+(340223, 340200, '南陵县', '南陵', '118.337105', '30.919638', 3, 0, 1),
+(340281, 340200, '无为市', '无为', '117.90224', '31.30317', 3, 0, 1),
+(340300, 340000, '蚌埠市', '蚌埠', '117.36323', '32.939667', 2, 0, 1),
+(340302, 340300, '龙子湖区', '龙子湖', '117.38231', '32.95045', 3, 0, 1),
+(340303, 340300, '蚌山区', '蚌山', '117.35579', '32.938065', 3, 0, 1),
+(340304, 340300, '禹会区', '禹会', '117.35259', '32.931934', 3, 0, 1),
+(340311, 340300, '淮上区', '淮上', '117.34709', '32.963146', 3, 0, 1),
+(340321, 340300, '怀远县', '怀远', '117.20017', '32.956936', 3, 0, 1),
+(340322, 340300, '五河县', '五河', '117.88881', '33.146202', 3, 0, 1),
+(340323, 340300, '固镇县', '固镇', '117.31596', '33.31868', 3, 0, 1),
+(340400, 340000, '淮南市', '淮南', '117.018326', '32.647575', 2, 0, 1),
+(340402, 340400, '大通区', '大通', '117.052925', '32.632065', 3, 0, 1),
+(340403, 340400, '田家庵区', '田家庵', '117.01832', '32.64434', 3, 0, 1),
+(340404, 340400, '谢家集区', '谢家集', '116.86536', '32.59829', 3, 0, 1),
+(340405, 340400, '八公山区', '八公山', '116.84111', '32.628227', 3, 0, 1),
+(340406, 340400, '潘集区', '潘集', '116.81688', '32.782116', 3, 0, 1),
+(340421, 340400, '凤台县', '凤台', '116.72277', '32.705383', 3, 0, 1),
+(340422, 340400, '寿县', '寿县', '116.78708', '32.57332', 3, 0, 1),
+(340500, 340000, '马鞍山市', '马鞍山', '118.507904', '31.689362', 2, 0, 1),
+(340503, 340500, '花山区', '花山', '118.51131', '31.69902', 3, 0, 1),
+(340504, 340500, '雨山区', '雨山', '118.4931', '31.685911', 3, 0, 1),
+(340506, 340500, '博望区', '博望', '118.84374', '31.56232', 3, 0, 1),
+(340521, 340500, '当涂县', '当涂', '118.489876', '31.556168', 3, 0, 1),
+(340522, 340500, '含山县', '含山', '118.10241', '31.73358', 3, 0, 1),
+(340523, 340500, '和县', '和县', '118.35145', '31.74423', 3, 0, 1),
+(340600, 340000, '淮北市', '淮北', '116.79466', '33.971706', 2, 0, 1),
+(340602, 340600, '杜集区', '杜集', '116.83392', '33.99122', 3, 0, 1),
+(340603, 340600, '相山区', '相山', '116.79077', '33.970917', 3, 0, 1),
+(340604, 340600, '烈山区', '烈山', '116.80946', '33.88953', 3, 0, 1),
+(340621, 340600, '濉溪县', '濉溪', '116.76743', '33.91641', 3, 0, 1),
+(340700, 340000, '铜陵市', '铜陵', '117.816574', '30.929935', 2, 0, 1),
+(340705, 340700, '铜官区', '铜官', '117.87431', '30.95614', 3, 0, 1),
+(340706, 340700, '义安区', '义安', '117.79147', '30.95271', 3, 0, 1),
+(340711, 340700, '郊区', '郊区', '117.816574', '30.929935', 3, 0, 1),
+(340722, 340700, '枞阳县', '枞阳', '117.22019', '30.69961', 3, 0, 1),
+(340800, 340000, '安庆市', '安庆', '117.04355', '30.50883', 2, 0, 1),
+(340802, 340800, '迎江区', '迎江', '117.04497', '30.506374', 3, 0, 1),
+(340803, 340800, '大观区', '大观', '117.034515', '30.505632', 3, 0, 1),
+(340811, 340800, '宜秀区', '宜秀', '117.07', '30.541323', 3, 0, 1),
+(340822, 340800, '怀宁县', '怀宁', '116.82867', '30.734995', 3, 0, 1),
+(340825, 340800, '太湖县', '太湖', '116.30522', '30.451868', 3, 0, 1),
+(340826, 340800, '宿松县', '宿松', '116.1202', '30.158327', 3, 0, 1),
+(340827, 340800, '望江县', '望江', '116.690926', '30.12491', 3, 0, 1),
+(340828, 340800, '岳西县', '岳西', '116.36048', '30.848501', 3, 0, 1),
+(340881, 340800, '桐城市', '桐城', '116.959656', '31.050575', 3, 0, 1),
+(340882, 340800, '潜山市', '潜山', '116.58133', '30.63107', 3, 0, 1),
+(341000, 340000, '黄山市', '黄山', '118.31732', '29.709238', 2, 0, 1),
+(341002, 341000, '屯溪区', '屯溪', '118.31735', '29.709187', 3, 0, 1),
+(341003, 341000, '黄山区', '黄山', '118.13664', '30.294518', 3, 0, 1),
+(341004, 341000, '徽州区', '徽州', '118.339745', '29.825201', 3, 0, 1),
+(341021, 341000, '歙县', '歙县', '118.428024', '29.867748', 3, 0, 1),
+(341022, 341000, '休宁县', '休宁', '118.18853', '29.788877', 3, 0, 1),
+(341023, 341000, '黟县', '黟县', '117.94291', '29.923813', 3, 0, 1),
+(341024, 341000, '祁门县', '祁门', '117.71724', '29.853472', 3, 0, 1),
+(341100, 340000, '滁州市', '滁州', '118.31626', '32.303627', 2, 0, 1),
+(341102, 341100, '琅琊区', '琅琊', '118.316475', '32.3038', 3, 0, 1),
+(341103, 341100, '南谯区', '南谯', '118.29695', '32.32984', 3, 0, 1),
+(341122, 341100, '来安县', '来安', '118.4333', '32.45023', 3, 0, 1),
+(341124, 341100, '全椒县', '全椒', '118.26858', '32.09385', 3, 0, 1),
+(341125, 341100, '定远县', '定远', '117.683716', '32.527103', 3, 0, 1),
+(341126, 341100, '凤阳县', '凤阳', '117.56246', '32.867146', 3, 0, 1),
+(341181, 341100, '天长市', '天长', '119.011215', '32.6815', 3, 0, 1),
+(341182, 341100, '明光市', '明光', '117.99805', '32.781204', 3, 0, 1),
+(341200, 340000, '阜阳市', '阜阳', '115.81973', '32.89697', 2, 0, 1),
+(341202, 341200, '颍州区', '颍州', '115.81391', '32.89124', 3, 0, 1),
+(341203, 341200, '颍东区', '颍东', '115.85875', '32.90886', 3, 0, 1),
+(341204, 341200, '颍泉区', '颍泉', '115.80453', '32.924797', 3, 0, 1),
+(341221, 341200, '临泉县', '临泉', '115.26169', '33.0627', 3, 0, 1),
+(341222, 341200, '太和县', '太和', '115.62724', '33.16229', 3, 0, 1),
+(341225, 341200, '阜南县', '阜南', '115.59053', '32.638103', 3, 0, 1),
+(341226, 341200, '颍上县', '颍上', '116.259125', '32.637066', 3, 0, 1),
+(341282, 341200, '界首市', '界首', '115.362114', '33.26153', 3, 0, 1),
+(341300, 340000, '宿州市', '宿州', '116.984085', '33.633892', 2, 0, 1),
+(341302, 341300, '埇桥区', '埇桥', '116.98331', '33.633854', 3, 0, 1),
+(341321, 341300, '砀山县', '砀山', '116.35111', '34.426247', 3, 0, 1),
+(341322, 341300, '萧县', '萧县', '116.9454', '34.183266', 3, 0, 1),
+(341323, 341300, '灵璧县', '灵璧', '117.55149', '33.54063', 3, 0, 1),
+(341324, 341300, '泗县', '泗县', '117.885445', '33.47758', 3, 0, 1),
+(341500, 340000, '六安市', '六安', '116.507675', '31.75289', 2, 0, 1),
+(341502, 341500, '金安区', '金安', '116.50329', '31.754492', 3, 0, 1),
+(341503, 341500, '裕安区', '裕安', '116.494545', '31.750692', 3, 0, 1),
+(341504, 341500, '叶集区', '叶集', '115.9133', '31.85122', 3, 0, 1),
+(341522, 341500, '霍邱县', '霍邱', '116.27888', '32.341305', 3, 0, 1),
+(341523, 341500, '舒城县', '舒城', '116.94409', '31.462849', 3, 0, 1),
+(341524, 341500, '金寨县', '金寨', '115.87852', '31.681623', 3, 0, 1),
+(341525, 341500, '霍山县', '霍山', '116.33308', '31.402456', 3, 0, 1),
+(341600, 340000, '亳州市', '亳州', '115.782936', '33.86934', 2, 0, 1),
+(341602, 341600, '谯城区', '谯城', '115.78121', '33.869286', 3, 0, 1),
+(341621, 341600, '涡阳县', '涡阳', '116.21155', '33.50283', 3, 0, 1),
+(341622, 341600, '蒙城县', '蒙城', '116.56033', '33.260815', 3, 0, 1),
+(341623, 341600, '利辛县', '利辛', '116.20778', '33.1435', 3, 0, 1),
+(341700, 340000, '池州市', '池州', '117.48916', '30.656036', 2, 0, 1),
+(341702, 341700, '贵池区', '贵池', '117.48834', '30.657377', 3, 0, 1),
+(341721, 341700, '东至县', '东至', '117.02148', '30.096567', 3, 0, 1),
+(341722, 341700, '石台县', '石台', '117.48291', '30.210323', 3, 0, 1),
+(341723, 341700, '青阳县', '青阳', '117.85739', '30.63818', 3, 0, 1),
+(341800, 340000, '宣城市', '宣城', '118.757996', '30.945667', 2, 0, 1),
+(341802, 341800, '宣州区', '宣州', '118.758415', '30.946003', 3, 0, 1),
+(341821, 341800, '郎溪县', '郎溪', '119.18502', '31.127834', 3, 0, 1),
+(341823, 341800, '泾县', '泾县', '118.4124', '30.685974', 3, 0, 1),
+(341824, 341800, '绩溪县', '绩溪', '118.5947', '30.065268', 3, 0, 1),
+(341825, 341800, '旌德县', '旌德', '118.54308', '30.288057', 3, 0, 1),
+(341881, 341800, '宁国市', '宁国', '118.983406', '30.62653', 3, 0, 1),
+(341882, 341800, '广德市', '广德', '119.41705', '30.8938', 3, 0, 1),
+(350000, 0, '福建省', '福建', '119.30624', '26.075302', 1, 0, 1),
+(350100, 350000, '福州市', '福州', '119.30624', '26.075302', 2, 0, 1),
+(350102, 350100, '鼓楼区', '鼓楼', '119.29929', '26.082285', 3, 0, 1),
+(350103, 350100, '台江区', '台江', '119.31016', '26.058617', 3, 0, 1),
+(350104, 350100, '仓山区', '仓山', '119.32099', '26.038912', 3, 0, 1),
+(350105, 350100, '马尾区', '马尾', '119.458725', '25.991976', 3, 0, 1),
+(350111, 350100, '晋安区', '晋安', '119.3286', '26.078836', 3, 0, 1),
+(350112, 350100, '长乐区', '长乐', '119.52324', '25.96283', 3, 0, 1),
+(350121, 350100, '闽侯县', '闽侯', '119.14512', '26.148567', 3, 0, 1),
+(350122, 350100, '连江县', '连江', '119.53837', '26.202108', 3, 0, 1),
+(350123, 350100, '罗源县', '罗源', '119.55264', '26.487234', 3, 0, 1),
+(350124, 350100, '闽清县', '闽清', '118.868416', '26.223793', 3, 0, 1),
+(350125, 350100, '永泰县', '永泰', '118.93909', '25.864824', 3, 0, 1),
+(350128, 350100, '平潭县', '平潭', '119.7912', '25.503672', 3, 0, 1),
+(350181, 350100, '福清市', '福清', '119.37699', '25.720402', 3, 0, 1),
+(350200, 350000, '厦门市', '厦门', '118.11022', '24.490475', 2, 0, 1),
+(350203, 350200, '思明区', '思明', '118.08783', '24.462059', 3, 0, 1),
+(350205, 350200, '海沧区', '海沧', '118.03636', '24.492512', 3, 0, 1),
+(350206, 350200, '湖里区', '湖里', '118.10943', '24.512764', 3, 0, 1),
+(350211, 350200, '集美区', '集美', '118.10087', '24.572874', 3, 0, 1),
+(350212, 350200, '同安区', '同安', '118.15045', '24.729334', 3, 0, 1),
+(350213, 350200, '翔安区', '翔安', '118.24281', '24.63748', 3, 0, 1),
+(350300, 350000, '莆田市', '莆田', '119.00756', '25.431011', 2, 0, 1),
+(350302, 350300, '城厢区', '城厢', '119.00103', '25.433737', 3, 0, 1),
+(350303, 350300, '涵江区', '涵江', '119.1191', '25.459272', 3, 0, 1),
+(350304, 350300, '荔城区', '荔城', '119.02005', '25.430046', 3, 0, 1),
+(350305, 350300, '秀屿区', '秀屿', '119.092606', '25.316141', 3, 0, 1),
+(350322, 350300, '仙游县', '仙游', '118.69433', '25.35653', 3, 0, 1),
+(350400, 350000, '三明市', '三明', '117.635', '26.265444', 2, 0, 1),
+(350402, 350400, '梅列区', '梅列', '117.63687', '26.269209', 3, 0, 1),
+(350403, 350400, '三元区', '三元', '117.607414', '26.234192', 3, 0, 1),
+(350421, 350400, '明溪县', '明溪', '117.20184', '26.357374', 3, 0, 1),
+(350423, 350400, '清流县', '清流', '116.81582', '26.17761', 3, 0, 1),
+(350424, 350400, '宁化县', '宁化', '116.65972', '26.259932', 3, 0, 1),
+(350425, 350400, '大田县', '大田', '117.84936', '25.690804', 3, 0, 1),
+(350426, 350400, '尤溪县', '尤溪', '118.188576', '26.169262', 3, 0, 1),
+(350427, 350400, '沙县', '沙县', '117.78909', '26.397362', 3, 0, 1),
+(350428, 350400, '将乐县', '将乐', '117.47356', '26.728666', 3, 0, 1),
+(350429, 350400, '泰宁县', '泰宁', '117.17752', '26.897995', 3, 0, 1),
+(350430, 350400, '建宁县', '建宁', '116.84583', '26.831398', 3, 0, 1),
+(350481, 350400, '永安市', '永安', '117.36445', '25.974075', 3, 0, 1),
+(350500, 350000, '泉州市', '泉州', '118.589424', '24.908854', 2, 0, 1),
+(350502, 350500, '鲤城区', '鲤城', '118.58893', '24.907644', 3, 0, 1),
+(350503, 350500, '丰泽区', '丰泽', '118.60515', '24.896042', 3, 0, 1),
+(350504, 350500, '洛江区', '洛江', '118.67031', '24.941153', 3, 0, 1),
+(350505, 350500, '泉港区', '泉港', '118.912285', '25.12686', 3, 0, 1),
+(350521, 350500, '惠安县', '惠安', '118.79895', '25.028719', 3, 0, 1),
+(350524, 350500, '安溪县', '安溪', '118.18601', '25.056824', 3, 0, 1),
+(350525, 350500, '永春县', '永春', '118.29503', '25.32072', 3, 0, 1),
+(350526, 350500, '德化县', '德化', '118.24299', '25.489004', 3, 0, 1),
+(350527, 350500, '金门县', '金门', '118.32322', '24.436417', 3, 0, 1),
+(350581, 350500, '石狮市', '石狮', '118.6284', '24.731977', 3, 0, 1),
+(350582, 350500, '晋江市', '晋江', '118.57734', '24.807322', 3, 0, 1),
+(350583, 350500, '南安市', '南安', '118.38703', '24.959494', 3, 0, 1),
+(350600, 350000, '漳州市', '漳州', '117.661804', '24.510897', 2, 0, 1),
+(350602, 350600, '芗城区', '芗城', '117.65646', '24.509954', 3, 0, 1),
+(350603, 350600, '龙文区', '龙文', '117.67139', '24.515656', 3, 0, 1),
+(350622, 350600, '云霄县', '云霄', '117.34094', '23.950485', 3, 0, 1),
+(350623, 350600, '漳浦县', '漳浦', '117.61402', '24.117907', 3, 0, 1),
+(350624, 350600, '诏安县', '诏安', '117.17609', '23.710835', 3, 0, 1),
+(350625, 350600, '长泰县', '长泰', '117.75591', '24.621475', 3, 0, 1),
+(350626, 350600, '东山县', '东山', '117.42768', '23.702845', 3, 0, 1),
+(350627, 350600, '南靖县', '南靖', '117.36546', '24.516424', 3, 0, 1),
+(350628, 350600, '平和县', '平和', '117.313545', '24.366158', 3, 0, 1),
+(350629, 350600, '华安县', '华安', '117.53631', '25.001415', 3, 0, 1),
+(350681, 350600, '龙海市', '龙海', '117.81729', '24.445341', 3, 0, 1),
+(350700, 350000, '南平市', '南平', '118.17846', '26.635628', 2, 0, 1),
+(350702, 350700, '延平区', '延平', '118.17892', '26.63608', 3, 0, 1),
+(350703, 350700, '建阳区', '建阳', '118.120427', '27.331749', 3, 0, 1),
+(350721, 350700, '顺昌县', '顺昌', '117.80771', '26.79285', 3, 0, 1),
+(350722, 350700, '浦城县', '浦城', '118.53682', '27.920412', 3, 0, 1),
+(350723, 350700, '光泽县', '光泽', '117.3379', '27.542803', 3, 0, 1),
+(350724, 350700, '松溪县', '松溪', '118.78349', '27.525785', 3, 0, 1),
+(350725, 350700, '政和县', '政和', '118.85866', '27.365398', 3, 0, 1),
+(350781, 350700, '邵武市', '邵武', '117.49155', '27.337952', 3, 0, 1),
+(350782, 350700, '武夷山市', '武夷山', '118.0328', '27.751734', 3, 0, 1),
+(350783, 350700, '建瓯市', '建瓯', '118.32176', '27.03502', 3, 0, 1),
+(350800, 350000, '龙岩市', '龙岩', '117.02978', '25.091602', 2, 0, 1),
+(350802, 350800, '新罗区', '新罗', '117.03072', '25.0918', 3, 0, 1),
+(350803, 350800, '永定区', '永定', '116.73202', '24.72303', 3, 0, 1),
+(350821, 350800, '长汀县', '长汀', '116.36101', '25.842278', 3, 0, 1),
+(350823, 350800, '上杭县', '上杭', '116.424774', '25.050018', 3, 0, 1),
+(350824, 350800, '武平县', '武平', '116.10093', '25.08865', 3, 0, 1),
+(350825, 350800, '连城县', '连城', '116.75668', '25.708506', 3, 0, 1),
+(350881, 350800, '漳平市', '漳平', '117.42073', '25.291597', 3, 0, 1),
+(350900, 350000, '宁德市', '宁德', '119.527084', '26.65924', 2, 0, 1),
+(350902, 350900, '蕉城区', '蕉城', '119.52722', '26.659252', 3, 0, 1),
+(350921, 350900, '霞浦县', '霞浦', '120.00521', '26.882069', 3, 0, 1),
+(350922, 350900, '古田县', '古田', '118.74316', '26.577492', 3, 0, 1),
+(350923, 350900, '屏南县', '屏南', '118.98754', '26.910826', 3, 0, 1),
+(350924, 350900, '寿宁县', '寿宁', '119.50674', '27.457798', 3, 0, 1),
+(350925, 350900, '周宁县', '周宁', '119.33824', '27.103106', 3, 0, 1),
+(350926, 350900, '柘荣县', '柘荣', '119.898224', '27.236162', 3, 0, 1),
+(350981, 350900, '福安市', '福安', '119.650795', '27.084246', 3, 0, 1),
+(350982, 350900, '福鼎市', '福鼎', '120.219765', '27.318884', 3, 0, 1),
+(360000, 0, '江西省', '江西', '115.89215', '28.676493', 1, 0, 1),
+(360100, 360000, '南昌市', '南昌', '115.89215', '28.676493', 2, 0, 1),
+(360102, 360100, '东湖区', '东湖', '115.88967', '28.682987', 3, 0, 1),
+(360103, 360100, '西湖区', '西湖', '115.91065', '28.6629', 3, 0, 1),
+(360104, 360100, '青云谱区', '青云谱', '115.907295', '28.635723', 3, 0, 1),
+(360111, 360100, '青山湖区', '青山湖', '115.94904', '28.689293', 3, 0, 1),
+(360112, 360100, '新建区', '新建', '115.81529', '28.6925', 3, 0, 1),
+(360113, 360100, '红谷滩区', '红谷滩', '115.858393', '28.698314', 3, 0, 1),
+(360121, 360100, '南昌县', '南昌', '115.94247', '28.543781', 3, 0, 1),
+(360123, 360100, '安义县', '安义', '115.55311', '28.841333', 3, 0, 1),
+(360124, 360100, '进贤县', '进贤', '116.26767', '28.36568', 3, 0, 1),
+(360200, 360000, '景德镇市', '景德镇', '117.21466', '29.29256', 2, 0, 1),
+(360202, 360200, '昌江区', '昌江', '117.19502', '29.288465', 3, 0, 1),
+(360203, 360200, '珠山区', '珠山', '117.21481', '29.292812', 3, 0, 1),
+(360222, 360200, '浮梁县', '浮梁', '117.21761', '29.352251', 3, 0, 1),
+(360281, 360200, '乐平市', '乐平', '117.12938', '28.967361', 3, 0, 1),
+(360300, 360000, '萍乡市', '萍乡', '113.85219', '27.622946', 2, 0, 1),
+(360302, 360300, '安源区', '安源', '113.85504', '27.625826', 3, 0, 1),
+(360313, 360300, '湘东区', '湘东', '113.7456', '27.639318', 3, 0, 1),
+(360321, 360300, '莲花县', '莲花', '113.95558', '27.127808', 3, 0, 1),
+(360322, 360300, '上栗县', '上栗', '113.80052', '27.87704', 3, 0, 1),
+(360323, 360300, '芦溪县', '芦溪', '114.04121', '27.633633', 3, 0, 1),
+(360400, 360000, '九江市', '九江', '115.99281', '29.712034', 2, 0, 1),
+(360402, 360400, '濂溪区', '庐山', '115.99012', '29.676174', 3, 0, 1),
+(360403, 360400, '浔阳区', '浔阳', '115.99595', '29.72465', 3, 0, 1),
+(360404, 360400, '柴桑区', '柴桑', '115.91135', '29.60855', 3, 0, 1),
+(360423, 360400, '武宁县', '武宁', '115.105644', '29.260181', 3, 0, 1),
+(360424, 360400, '修水县', '修水', '114.573425', '29.032728', 3, 0, 1),
+(360425, 360400, '永修县', '永修', '115.80905', '29.018211', 3, 0, 1),
+(360426, 360400, '德安县', '德安', '115.76261', '29.327475', 3, 0, 1),
+(360428, 360400, '都昌县', '都昌', '116.20512', '29.275105', 3, 0, 1),
+(360429, 360400, '湖口县', '湖口', '116.244316', '29.7263', 3, 0, 1),
+(360430, 360400, '彭泽县', '彭泽', '116.55584', '29.898865', 3, 0, 1),
+(360481, 360400, '瑞昌市', '瑞昌', '115.66908', '29.6766', 3, 0, 1),
+(360482, 360400, '共青城市', '共青城', '115.81477', '29.24955', 3, 0, 1),
+(360483, 360400, '庐山市', '共青城', '115.80571', '29.247885', 3, 0, 1),
+(360500, 360000, '新余市', '新余', '114.93083', '27.810835', 2, 0, 1),
+(360502, 360500, '渝水区', '渝水', '114.92392', '27.819172', 3, 0, 1),
+(360521, 360500, '分宜县', '分宜', '114.67526', '27.8113', 3, 0, 1),
+(360600, 360000, '鹰潭市', '鹰潭', '117.03384', '28.238638', 2, 0, 1),
+(360602, 360600, '月湖区', '月湖', '117.03411', '28.239077', 3, 0, 1),
+(360603, 360600, '余江区', '余江', '116.81834', '28.20991', 3, 0, 1),
+(360681, 360600, '贵溪市', '贵溪', '117.212105', '28.283693', 3, 0, 1),
+(360700, 360000, '赣州市', '赣州', '114.94028', '25.85097', 2, 0, 1),
+(360702, 360700, '章贡区', '章贡', '114.93872', '25.851368', 3, 0, 1),
+(360703, 360700, '南康区', '南康', '114.76535', '25.66144', 3, 0, 1),
+(360704, 360700, '赣县区', '赣县', '115.01161', '25.86076', 3, 0, 1),
+(360722, 360700, '信丰县', '信丰', '114.93089', '25.38023', 3, 0, 1),
+(360723, 360700, '大余县', '大余', '114.36224', '25.395937', 3, 0, 1),
+(360724, 360700, '上犹县', '上犹', '114.540535', '25.794285', 3, 0, 1),
+(360725, 360700, '崇义县', '崇义', '114.30735', '25.68791', 3, 0, 1),
+(360726, 360700, '安远县', '安远', '115.39233', '25.13459', 3, 0, 1),
+(360728, 360700, '定南县', '定南', '115.03267', '24.774277', 3, 0, 1),
+(360729, 360700, '全南县', '全南', '114.531586', '24.742651', 3, 0, 1),
+(360730, 360700, '宁都县', '宁都', '116.01878', '26.472054', 3, 0, 1),
+(360731, 360700, '于都县', '于都', '115.4112', '25.955032', 3, 0, 1),
+(360732, 360700, '兴国县', '兴国', '115.3519', '26.330488', 3, 0, 1),
+(360733, 360700, '会昌县', '会昌', '115.79116', '25.599125', 3, 0, 1),
+(360734, 360700, '寻乌县', '寻乌', '115.6514', '24.954136', 3, 0, 1),
+(360735, 360700, '石城县', '石城', '116.34225', '26.326582', 3, 0, 1),
+(360781, 360700, '瑞金市', '瑞金', '116.03485', '25.875278', 3, 0, 1),
+(360783, 360700, '龙南市', '龙南', '', '', 3, 0, 1),
+(360800, 360000, '吉安市', '吉安', '114.986374', '27.111698', 2, 0, 1),
+(360802, 360800, '吉州区', '吉州', '114.98733', '27.112368', 3, 0, 1),
+(360803, 360800, '青原区', '青原', '115.016304', '27.105879', 3, 0, 1),
+(360821, 360800, '吉安县', '吉安', '114.90511', '27.040043', 3, 0, 1),
+(360822, 360800, '吉水县', '吉水', '115.13457', '27.213446', 3, 0, 1),
+(360823, 360800, '峡江县', '峡江', '115.31933', '27.580862', 3, 0, 1),
+(360824, 360800, '新干县', '新干', '115.39929', '27.755758', 3, 0, 1),
+(360825, 360800, '永丰县', '永丰', '115.43556', '27.321087', 3, 0, 1),
+(360826, 360800, '泰和县', '泰和', '114.90139', '26.790165', 3, 0, 1),
+(360827, 360800, '遂川县', '遂川', '114.51689', '26.323706', 3, 0, 1),
+(360828, 360800, '万安县', '万安', '114.78469', '26.462086', 3, 0, 1),
+(360829, 360800, '安福县', '安福', '114.61384', '27.382746', 3, 0, 1),
+(360830, 360800, '永新县', '永新', '114.24253', '26.944721', 3, 0, 1),
+(360881, 360800, '井冈山市', '井冈山', '114.284424', '26.745918', 3, 0, 1),
+(360900, 360000, '宜春市', '宜春', '114.391136', '27.8043', 2, 0, 1),
+(360902, 360900, '袁州区', '袁州', '114.38738', '27.800117', 3, 0, 1),
+(360921, 360900, '奉新县', '奉新', '115.3899', '28.700672', 3, 0, 1),
+(360922, 360900, '万载县', '万载', '114.44901', '28.104528', 3, 0, 1),
+(360923, 360900, '上高县', '上高', '114.932655', '28.234789', 3, 0, 1),
+(360924, 360900, '宜丰县', '宜丰', '114.787384', '28.388288', 3, 0, 1),
+(360925, 360900, '靖安县', '靖安', '115.36175', '28.86054', 3, 0, 1),
+(360926, 360900, '铜鼓县', '铜鼓', '114.37014', '28.520956', 3, 0, 1),
+(360981, 360900, '丰城市', '丰城', '115.786', '28.191584', 3, 0, 1),
+(360982, 360900, '樟树市', '樟树', '115.54339', '28.055899', 3, 0, 1),
+(360983, 360900, '高安市', '高安', '115.38153', '28.420952', 3, 0, 1),
+(361000, 360000, '抚州市', '抚州', '116.35835', '27.98385', 2, 0, 1),
+(361002, 361000, '临川区', '临川', '116.361404', '27.981918', 3, 0, 1),
+(361003, 361000, '东乡区', '东乡', '116.60334', '28.24771', 3, 0, 1),
+(361021, 361000, '南城县', '南城', '116.63945', '27.55531', 3, 0, 1),
+(361022, 361000, '黎川县', '黎川', '116.91457', '27.29256', 3, 0, 1),
+(361023, 361000, '南丰县', '南丰', '116.533', '27.210133', 3, 0, 1),
+(361024, 361000, '崇仁县', '崇仁', '116.05911', '27.760906', 3, 0, 1),
+(361025, 361000, '乐安县', '乐安', '115.83843', '27.420101', 3, 0, 1),
+(361026, 361000, '宜黄县', '宜黄', '116.22302', '27.546513', 3, 0, 1),
+(361027, 361000, '金溪县', '金溪', '116.77875', '27.907387', 3, 0, 1),
+(361028, 361000, '资溪县', '资溪', '117.06609', '27.70653', 3, 0, 1),
+(361030, 361000, '广昌县', '广昌', '116.32729', '26.838427', 3, 0, 1),
+(361100, 360000, '上饶市', '上饶', '117.97118', '28.44442', 2, 0, 1),
+(361102, 361100, '信州区', '信州', '117.97052', '28.445377', 3, 0, 1),
+(361103, 361100, '广丰区', '广丰', '118.19133', '28.43631', 3, 0, 1),
+(361104, 361100, '广信区', '广信', '117.9096', '28.44923', 3, 0, 1),
+(361123, 361100, '玉山县', '玉山', '118.24441', '28.67348', 3, 0, 1),
+(361124, 361100, '铅山县', '铅山', '117.71191', '28.310892', 3, 0, 1),
+(361125, 361100, '横峰县', '横峰', '117.608246', '28.415104', 3, 0, 1),
+(361126, 361100, '弋阳县', '弋阳', '117.435005', '28.402391', 3, 0, 1),
+(361127, 361100, '余干县', '余干', '116.69107', '28.69173', 3, 0, 1),
+(361128, 361100, '鄱阳县', '鄱阳', '116.673744', '28.993374', 3, 0, 1),
+(361129, 361100, '万年县', '万年', '117.07015', '28.692589', 3, 0, 1),
+(361130, 361100, '婺源县', '婺源', '117.86219', '29.254015', 3, 0, 1),
+(361181, 361100, '德兴市', '德兴', '117.578735', '28.945034', 3, 0, 1),
+(370000, 0, '山东省', '山东', '117.00092', '36.675808', 1, 0, 1),
+(370100, 370000, '济南市', '济南', '117.00092', '36.675808', 2, 0, 1),
+(370102, 370100, '历下区', '历下', '117.03862', '36.66417', 3, 0, 1),
+(370103, 370100, '市中区', '市中', '116.99898', '36.657352', 3, 0, 1),
+(370104, 370100, '槐荫区', '槐荫', '116.94792', '36.668205', 3, 0, 1),
+(370105, 370100, '天桥区', '天桥', '116.996086', '36.693375', 3, 0, 1),
+(370112, 370100, '历城区', '历城', '117.06374', '36.681744', 3, 0, 1),
+(370113, 370100, '长清区', '长清', '116.74588', '36.56105', 3, 0, 1),
+(370114, 370100, '章丘区', '章丘', '117.52627', '36.68124', 3, 0, 1),
+(370115, 370100, '济阳区', '济阳', '117.17333', '36.97847', 3, 0, 1),
+(370116, 370100, '莱芜区', '莱芜', '117.65992', '36.20317', 3, 0, 1),
+(370117, 370100, '钢城区', '钢城', '117.81107', '36.05866', 3, 0, 1),
+(370124, 370100, '平阴县', '平阴', '116.455055', '36.286922', 3, 0, 1),
+(370126, 370100, '商河县', '商河', '117.15637', '37.310543', 3, 0, 1),
+(370200, 370000, '青岛市', '青岛', '120.35517', '36.08298', 2, 0, 1),
+(370202, 370200, '市南区', '市南', '120.395966', '36.070892', 3, 0, 1),
+(370203, 370200, '市北区', '市北', '120.35503', '36.08382', 3, 0, 1),
+(370211, 370200, '黄岛区', '黄岛', '119.99552', '35.875137', 3, 0, 1),
+(370212, 370200, '崂山区', '崂山', '120.46739', '36.10257', 3, 0, 1),
+(370213, 370200, '李沧区', '李沧', '120.421234', '36.160023', 3, 0, 1),
+(370214, 370200, '城阳区', '城阳', '120.38914', '36.30683', 3, 0, 1),
+(370215, 370200, '即墨区', '即墨', '120.44715', '36.38932', 3, 0, 1),
+(370281, 370200, '胶州市', '胶州', '120.0062', '36.285877', 3, 0, 1),
+(370283, 370200, '平度市', '平度', '119.959015', '36.78883', 3, 0, 1),
+(370285, 370200, '莱西市', '莱西', '120.52622', '36.86509', 3, 0, 1),
+(370300, 370000, '淄博市', '淄博', '118.047646', '36.814938', 2, 0, 1),
+(370302, 370300, '淄川区', '淄川', '117.9677', '36.64727', 3, 0, 1),
+(370303, 370300, '张店区', '张店', '118.05352', '36.80705', 3, 0, 1),
+(370304, 370300, '博山区', '博山', '117.85823', '36.497566', 3, 0, 1),
+(370305, 370300, '临淄区', '临淄', '118.306015', '36.816658', 3, 0, 1),
+(370306, 370300, '周村区', '周村', '117.851036', '36.8037', 3, 0, 1),
+(370321, 370300, '桓台县', '桓台', '118.101555', '36.959774', 3, 0, 1),
+(370322, 370300, '高青县', '高青', '117.82984', '37.169582', 3, 0, 1),
+(370323, 370300, '沂源县', '沂源', '118.16616', '36.186283', 3, 0, 1),
+(370400, 370000, '枣庄市', '枣庄', '117.55796', '34.856422', 2, 0, 1),
+(370402, 370400, '市中区', '市中', '117.55728', '34.85665', 3, 0, 1),
+(370403, 370400, '薛城区', '薛城', '117.26529', '34.79789', 3, 0, 1),
+(370404, 370400, '峄城区', '峄城', '117.58632', '34.76771', 3, 0, 1),
+(370405, 370400, '台儿庄区', '台儿庄', '117.73475', '34.564816', 3, 0, 1),
+(370406, 370400, '山亭区', '山亭', '117.45897', '35.096077', 3, 0, 1),
+(370481, 370400, '滕州市', '滕州', '117.1621', '35.088497', 3, 0, 1),
+(370500, 370000, '东营市', '东营', '118.66471', '37.434563', 2, 0, 1),
+(370502, 370500, '东营区', '东营', '118.507545', '37.461567', 3, 0, 1),
+(370503, 370500, '河口区', '河口', '118.52961', '37.886017', 3, 0, 1),
+(370505, 370500, '垦利区', '垦利', '118.54768', '37.58748', 3, 0, 1),
+(370522, 370500, '利津县', '利津', '118.248856', '37.493366', 3, 0, 1),
+(370523, 370500, '广饶县', '广饶', '118.407524', '37.05161', 3, 0, 1),
+(370600, 370000, '烟台市', '烟台', '121.39138', '37.539295', 2, 0, 1),
+(370602, 370600, '芝罘区', '芝罘', '121.38588', '37.540924', 3, 0, 1),
+(370611, 370600, '福山区', '福山', '121.26474', '37.496876', 3, 0, 1),
+(370612, 370600, '牟平区', '牟平', '121.60151', '37.388355', 3, 0, 1),
+(370613, 370600, '莱山区', '莱山', '121.44887', '37.47355', 3, 0, 1),
+(370614, 370600, '蓬莱区', '蓬莱', '', '', 3, 0, 1),
+(370681, 370600, '龙口市', '龙口', '120.52833', '37.648445', 3, 0, 1),
+(370682, 370600, '莱阳市', '莱阳', '120.71115', '36.977036', 3, 0, 1),
+(370683, 370600, '莱州市', '莱州', '119.94214', '37.182724', 3, 0, 1),
+(370685, 370600, '招远市', '招远', '120.403145', '37.364918', 3, 0, 1),
+(370686, 370600, '栖霞市', '栖霞', '120.8341', '37.305855', 3, 0, 1),
+(370687, 370600, '海阳市', '海阳', '121.16839', '36.78066', 3, 0, 1),
+(370700, 370000, '潍坊市', '潍坊', '119.10708', '36.70925', 2, 0, 1),
+(370702, 370700, '潍城区', '潍城', '119.10378', '36.71006', 3, 0, 1),
+(370703, 370700, '寒亭区', '寒亭', '119.20786', '36.772102', 3, 0, 1),
+(370704, 370700, '坊子区', '坊子', '119.16633', '36.654617', 3, 0, 1),
+(370705, 370700, '奎文区', '奎文', '119.13736', '36.709496', 3, 0, 1),
+(370724, 370700, '临朐县', '临朐', '118.53988', '36.516373', 3, 0, 1),
+(370725, 370700, '昌乐县', '昌乐', '118.84', '36.703255', 3, 0, 1),
+(370781, 370700, '青州市', '青州', '118.484695', '36.697857', 3, 0, 1),
+(370782, 370700, '诸城市', '诸城', '119.40318', '35.997093', 3, 0, 1),
+(370783, 370700, '寿光市', '寿光', '118.73645', '36.874413', 3, 0, 1),
+(370784, 370700, '安丘市', '安丘', '119.20689', '36.427418', 3, 0, 1),
+(370785, 370700, '高密市', '高密', '119.757034', '36.37754', 3, 0, 1),
+(370786, 370700, '昌邑市', '昌邑', '119.3945', '36.85494', 3, 0, 1),
+(370800, 370000, '济宁市', '济宁', '116.58724', '35.415394', 2, 0, 1),
+(370811, 370800, '任城区', '任城', '116.63102', '35.431835', 3, 0, 1),
+(370812, 370800, '兖州区', '兖州', '116.7857', '35.5526', 3, 0, 1),
+(370826, 370800, '微山县', '微山', '117.12861', '34.809525', 3, 0, 1),
+(370827, 370800, '鱼台县', '鱼台', '116.650024', '34.997707', 3, 0, 1),
+(370828, 370800, '金乡县', '金乡', '116.31036', '35.06977', 3, 0, 1),
+(370829, 370800, '嘉祥县', '嘉祥', '116.34289', '35.398098', 3, 0, 1),
+(370830, 370800, '汶上县', '汶上', '116.487144', '35.721745', 3, 0, 1),
+(370831, 370800, '泗水县', '泗水', '117.273605', '35.653217', 3, 0, 1),
+(370832, 370800, '梁山县', '梁山', '116.08963', '35.80184', 3, 0, 1),
+(370881, 370800, '曲阜市', '曲阜', '116.99188', '35.59279', 3, 0, 1),
+(370883, 370800, '邹城市', '邹城', '116.96673', '35.40526', 3, 0, 1),
+(370900, 370000, '泰安市', '泰安', '117.12907', '36.19497', 2, 0, 1),
+(370902, 370900, '泰山区', '泰山', '117.12998', '36.189312', 3, 0, 1),
+(370911, 370900, '岱岳区', '岱岳', '117.0418', '36.18752', 3, 0, 1),
+(370921, 370900, '宁阳县', '宁阳', '116.79929', '35.76754', 3, 0, 1),
+(370923, 370900, '东平县', '东平', '116.46105', '35.930466', 3, 0, 1),
+(370982, 370900, '新泰市', '新泰', '117.76609', '35.910385', 3, 0, 1),
+(370983, 370900, '肥城市', '肥城', '116.7637', '36.1856', 3, 0, 1),
+(371000, 370000, '威海市', '威海', '122.116394', '37.50969', 2, 0, 1),
+(371002, 371000, '环翠区', '环翠', '122.11619', '37.510754', 3, 0, 1),
+(371003, 371000, '文登区', '文登', '122.0581', '37.19397', 3, 0, 1),
+(371082, 371000, '荣成市', '荣成', '122.4229', '37.160133', 3, 0, 1),
+(371083, 371000, '乳山市', '乳山', '121.53635', '36.91962', 3, 0, 1),
+(371100, 370000, '日照市', '日照', '119.461205', '35.42859', 2, 0, 1),
+(371102, 371100, '东港区', '东港', '119.4577', '35.42615', 3, 0, 1),
+(371103, 371100, '岚山区', '岚山', '119.31584', '35.119793', 3, 0, 1),
+(371121, 371100, '五莲县', '五莲', '119.20674', '35.751938', 3, 0, 1),
+(371122, 371100, '莒县', '莒县', '118.832855', '35.588116', 3, 0, 1),
+(371300, 370000, '临沂市', '临沂', '118.32645', '35.06528', 2, 0, 1),
+(371302, 371300, '兰山区', '兰山', '118.32767', '35.06163', 3, 0, 1),
+(371311, 371300, '罗庄区', '罗庄', '118.2848', '34.997204', 3, 0, 1),
+(371312, 371300, '河东区', '河东', '118.39829', '35.085003', 3, 0, 1),
+(371321, 371300, '沂南县', '沂南', '118.4554', '35.547', 3, 0, 1),
+(371322, 371300, '郯城县', '郯城', '118.342964', '34.614742', 3, 0, 1),
+(371323, 371300, '沂水县', '沂水', '118.634544', '35.78703', 3, 0, 1),
+(371324, 371300, '兰陵县', '苍山', '118.32645', '35.06528', 3, 0, 1),
+(371325, 371300, '费县', '费县', '117.96887', '35.269173', 3, 0, 1),
+(371326, 371300, '平邑县', '平邑', '117.63188', '35.51152', 3, 0, 1),
+(371327, 371300, '莒南县', '莒南', '118.838326', '35.17591', 3, 0, 1),
+(371328, 371300, '蒙阴县', '蒙阴', '117.94327', '35.712437', 3, 0, 1),
+(371329, 371300, '临沭县', '临沭', '118.64838', '34.91706', 3, 0, 1),
+(371400, 370000, '德州市', '德州', '116.30743', '37.453968', 2, 0, 1),
+(371402, 371400, '德城区', '德城', '116.307076', '37.453922', 3, 0, 1),
+(371403, 371400, '陵城区', '陵城', '116.57634', '37.33566', 3, 0, 1),
+(371422, 371400, '宁津县', '宁津', '116.79372', '37.64962', 3, 0, 1),
+(371423, 371400, '庆云县', '庆云', '117.39051', '37.777725', 3, 0, 1),
+(371424, 371400, '临邑县', '临邑', '116.86703', '37.192043', 3, 0, 1),
+(371425, 371400, '齐河县', '齐河', '116.75839', '36.795498', 3, 0, 1),
+(371426, 371400, '平原县', '平原', '116.43391', '37.164467', 3, 0, 1),
+(371427, 371400, '夏津县', '夏津', '116.003815', '36.9505', 3, 0, 1),
+(371428, 371400, '武城县', '武城', '116.07863', '37.209526', 3, 0, 1),
+(371481, 371400, '乐陵市', '乐陵', '117.21666', '37.729115', 3, 0, 1),
+(371482, 371400, '禹城市', '禹城', '116.642555', '36.934486', 3, 0, 1),
+(371500, 370000, '聊城市', '聊城', '115.98037', '36.456013', 2, 0, 1),
+(371502, 371500, '东昌府区', '东昌府', '115.98003', '36.45606', 3, 0, 1),
+(371503, 371500, '茌平区', '茌平', '116.25522', '36.58068', 3, 0, 1),
+(371521, 371500, '阳谷县', '阳谷', '115.78429', '36.11371', 3, 0, 1),
+(371522, 371500, '莘县', '莘县', '115.66729', '36.2376', 3, 0, 1),
+(371524, 371500, '东阿县', '东阿', '116.248856', '36.336002', 3, 0, 1),
+(371525, 371500, '冠县', '冠县', '115.44481', '36.483753', 3, 0, 1),
+(371526, 371500, '高唐县', '高唐', '116.22966', '36.859756', 3, 0, 1),
+(371581, 371500, '临清市', '临清', '115.71346', '36.842598', 3, 0, 1),
+(371600, 370000, '滨州市', '滨州', '118.016975', '37.38354', 2, 0, 1),
+(371602, 371600, '滨城区', '滨城', '118.02015', '37.384842', 3, 0, 1),
+(371603, 371600, '沾化区', '沾化', '118.09882', '37.70058', 3, 0, 1),
+(371621, 371600, '惠民县', '惠民', '117.50894', '37.483875', 3, 0, 1),
+(371622, 371600, '阳信县', '阳信', '117.58133', '37.64049', 3, 0, 1),
+(371623, 371600, '无棣县', '无棣', '117.616325', '37.74085', 3, 0, 1),
+(371625, 371600, '博兴县', '博兴', '118.12309', '37.147003', 3, 0, 1),
+(371681, 371600, '邹平市', '邹平', '117.74309', '36.86299', 3, 0, 1),
+(371700, 370000, '菏泽市', '菏泽', '115.46938', '35.246532', 2, 0, 1),
+(371702, 371700, '牡丹区', '牡丹', '115.47095', '35.24311', 3, 0, 1),
+(371703, 371700, '定陶区', '定陶', '115.57298', '35.07095', 3, 0, 1),
+(371721, 371700, '曹县', '曹县', '115.549484', '34.823254', 3, 0, 1),
+(371722, 371700, '单县', '单县', '116.08262', '34.79085', 3, 0, 1),
+(371723, 371700, '成武县', '成武', '115.89735', '34.947365', 3, 0, 1),
+(371724, 371700, '巨野县', '巨野', '116.08934', '35.391', 3, 0, 1),
+(371725, 371700, '郓城县', '郓城', '115.93885', '35.594772', 3, 0, 1),
+(371726, 371700, '鄄城县', '鄄城', '115.51434', '35.560257', 3, 0, 1),
+(371728, 371700, '东明县', '东明', '115.09841', '35.28964', 3, 0, 1),
+(410000, 0, '河南省', '河南', '113.66541', '34.757977', 1, 0, 1),
+(410100, 410000, '郑州市', '郑州', '113.66541', '34.757977', 2, 0, 1),
+(410102, 410100, '中原区', '中原', '113.61157', '34.748287', 3, 0, 1),
+(410103, 410100, '二七区', '二七', '113.645424', '34.730934', 3, 0, 1),
+(410104, 410100, '管城回族区', '管城回族', '113.68531', '34.746452', 3, 0, 1),
+(410105, 410100, '金水区', '金水', '113.686035', '34.775837', 3, 0, 1),
+(410106, 410100, '上街区', '上街', '113.29828', '34.80869', 3, 0, 1),
+(410108, 410100, '惠济区', '惠济', '113.61836', '34.82859', 3, 0, 1),
+(410122, 410100, '中牟县', '中牟', '114.02252', '34.721977', 3, 0, 1),
+(410181, 410100, '巩义市', '巩义', '112.98283', '34.75218', 3, 0, 1),
+(410182, 410100, '荥阳市', '荥阳', '113.391525', '34.789078', 3, 0, 1),
+(410183, 410100, '新密市', '新密', '113.380615', '34.537846', 3, 0, 1),
+(410184, 410100, '新郑市', '新郑', '113.73967', '34.39422', 3, 0, 1),
+(410185, 410100, '登封市', '登封', '113.037766', '34.459938', 3, 0, 1),
+(410200, 410000, '开封市', '开封', '114.341446', '34.79705', 2, 0, 1),
+(410202, 410200, '龙亭区', '龙亭', '114.35335', '34.79983', 3, 0, 1),
+(410203, 410200, '顺河回族区', '顺河回族', '114.364876', '34.80046', 3, 0, 1),
+(410204, 410200, '鼓楼区', '鼓楼', '114.3485', '34.79238', 3, 0, 1),
+(410205, 410200, '禹王台区', '禹王台', '114.35024', '34.779728', 3, 0, 1),
+(410212, 410200, '祥符区', '祥符', '114.44136', '34.757', 3, 0, 1),
+(410221, 410200, '杞县', '杞县', '114.77047', '34.554585', 3, 0, 1),
+(410222, 410200, '通许县', '通许', '114.467735', '34.477303', 3, 0, 1),
+(410223, 410200, '尉氏县', '尉氏', '114.193924', '34.412254', 3, 0, 1),
+(410225, 410200, '兰考县', '兰考', '114.82057', '34.8299', 3, 0, 1),
+(410300, 410000, '洛阳市', '洛阳', '112.43447', '34.66304', 2, 0, 1),
+(410302, 410300, '老城区', '老城', '112.477295', '34.682945', 3, 0, 1),
+(410303, 410300, '西工区', '西工', '112.44323', '34.667847', 3, 0, 1),
+(410304, 410300, '瀍河回族区', '瀍河回族', '112.49162', '34.68474', 3, 0, 1),
+(410305, 410300, '涧西区', '涧西', '112.39925', '34.65425', 3, 0, 1),
+(410306, 410300, '吉利区', '吉利', '112.58479', '34.899094', 3, 0, 1),
+(410311, 410300, '洛龙区', '洛龙', '112.4647', '34.6196', 3, 0, 1),
+(410322, 410300, '孟津县', '孟津', '112.44389', '34.826485', 3, 0, 1),
+(410323, 410300, '新安县', '新安', '112.1414', '34.72868', 3, 0, 1),
+(410324, 410300, '栾川县', '栾川', '111.618385', '33.783195', 3, 0, 1),
+(410325, 410300, '嵩县', '嵩县', '112.08777', '34.13156', 3, 0, 1),
+(410326, 410300, '汝阳县', '汝阳', '112.473785', '34.15323', 3, 0, 1),
+(410327, 410300, '宜阳县', '宜阳', '112.17999', '34.51648', 3, 0, 1),
+(410328, 410300, '洛宁县', '洛宁', '111.655396', '34.38718', 3, 0, 1),
+(410329, 410300, '伊川县', '伊川', '112.42938', '34.423416', 3, 0, 1),
+(410381, 410300, '偃师市', '偃师', '112.78774', '34.72304', 3, 0, 1),
+(410400, 410000, '平顶山市', '平顶山', '113.30772', '33.73524', 2, 0, 1),
+(410402, 410400, '新华区', '新华', '113.299065', '33.73758', 3, 0, 1),
+(410403, 410400, '卫东区', '卫东', '113.310326', '33.739285', 3, 0, 1),
+(410404, 410400, '石龙区', '石龙', '112.889885', '33.90154', 3, 0, 1),
+(410411, 410400, '湛河区', '湛河', '113.32087', '33.72568', 3, 0, 1),
+(410421, 410400, '宝丰县', '宝丰', '113.06681', '33.86636', 3, 0, 1),
+(410422, 410400, '叶县', '叶县', '113.3583', '33.62125', 3, 0, 1),
+(410423, 410400, '鲁山县', '鲁山', '112.9067', '33.740326', 3, 0, 1),
+(410425, 410400, '郏县', '郏县', '113.22045', '33.971992', 3, 0, 1),
+(410481, 410400, '舞钢市', '舞钢', '113.52625', '33.302082', 3, 0, 1),
+(410482, 410400, '汝州市', '汝州', '112.84534', '34.167408', 3, 0, 1),
+(410500, 410000, '安阳市', '安阳', '114.352486', '36.103443', 2, 0, 1),
+(410502, 410500, '文峰区', '文峰', '114.35256', '36.098103', 3, 0, 1),
+(410503, 410500, '北关区', '北关', '114.352646', '36.10978', 3, 0, 1),
+(410505, 410500, '殷都区', '殷都', '114.300095', '36.108974', 3, 0, 1),
+(410506, 410500, '龙安区', '龙安', '114.323524', '36.09557', 3, 0, 1),
+(410522, 410500, '安阳县', '安阳', '114.1302', '36.130585', 3, 0, 1),
+(410523, 410500, '汤阴县', '汤阴', '114.36236', '35.922348', 3, 0, 1),
+(410526, 410500, '滑县', '滑县', '114.524', '35.574627', 3, 0, 1),
+(410527, 410500, '内黄县', '内黄', '114.90458', '35.9537', 3, 0, 1),
+(410581, 410500, '林州市', '林州', '113.82377', '36.063404', 3, 0, 1),
+(410600, 410000, '鹤壁市', '鹤壁', '114.29544', '35.748238', 2, 0, 1),
+(410602, 410600, '鹤山区', '鹤山', '114.16655', '35.936127', 3, 0, 1),
+(410603, 410600, '山城区', '山城', '114.184204', '35.896057', 3, 0, 1),
+(410611, 410600, '淇滨区', '淇滨', '114.293915', '35.748383', 3, 0, 1),
+(410621, 410600, '浚县', '浚县', '114.55016', '35.671284', 3, 0, 1),
+(410622, 410600, '淇县', '淇县', '114.20038', '35.609478', 3, 0, 1),
+(410700, 410000, '新乡市', '新乡', '113.88399', '35.302616', 2, 0, 1),
+(410702, 410700, '红旗区', '红旗', '113.87816', '35.302685', 3, 0, 1),
+(410703, 410700, '卫滨区', '卫滨', '113.866066', '35.304905', 3, 0, 1),
+(410704, 410700, '凤泉区', '凤泉', '113.906715', '35.379856', 3, 0, 1),
+(410711, 410700, '牧野区', '牧野', '113.89716', '35.312973', 3, 0, 1),
+(410721, 410700, '新乡县', '新乡', '113.80618', '35.19002', 3, 0, 1),
+(410724, 410700, '获嘉县', '获嘉', '113.65725', '35.261684', 3, 0, 1),
+(410725, 410700, '原阳县', '原阳', '113.965965', '35.054', 3, 0, 1),
+(410726, 410700, '延津县', '延津', '114.20098', '35.149513', 3, 0, 1),
+(410727, 410700, '封丘县', '封丘', '114.42341', '35.04057', 3, 0, 1),
+(410781, 410700, '卫辉市', '卫辉', '114.06586', '35.404297', 3, 0, 1),
+(410782, 410700, '辉县市', '辉县', '113.80252', '35.46132', 3, 0, 1),
+(410783, 410700, '长垣市', '长垣', '114.66886', '35.20049', 3, 0, 1),
+(410800, 410000, '焦作市', '焦作', '113.238266', '35.23904', 2, 0, 1),
+(410802, 410800, '解放区', '解放', '113.22613', '35.241352', 3, 0, 1),
+(410803, 410800, '中站区', '中站', '113.17548', '35.236145', 3, 0, 1),
+(410804, 410800, '马村区', '马村', '113.3217', '35.265453', 3, 0, 1),
+(410811, 410800, '山阳区', '山阳', '113.26766', '35.21476', 3, 0, 1),
+(410821, 410800, '修武县', '修武', '113.447464', '35.229923', 3, 0, 1),
+(410822, 410800, '博爱县', '博爱', '113.06931', '35.17035', 3, 0, 1),
+(410823, 410800, '武陟县', '武陟', '113.40833', '35.09885', 3, 0, 1),
+(410825, 410800, '温县', '温县', '113.07912', '34.941235', 3, 0, 1),
+(410882, 410800, '沁阳市', '沁阳', '112.93454', '35.08901', 3, 0, 1),
+(410883, 410800, '孟州市', '孟州', '112.78708', '34.90963', 3, 0, 1),
+(410900, 410000, '濮阳市', '濮阳', '115.0413', '35.768234', 2, 0, 1),
+(410902, 410900, '华龙区', '华龙', '115.03184', '35.76047', 3, 0, 1),
+(410922, 410900, '清丰县', '清丰', '115.107285', '35.902412', 3, 0, 1),
+(410923, 410900, '南乐县', '南乐', '115.20434', '36.075203', 3, 0, 1),
+(410926, 410900, '范县', '范县', '115.50421', '35.85198', 3, 0, 1),
+(410927, 410900, '台前县', '台前', '115.85568', '35.996475', 3, 0, 1),
+(410928, 410900, '濮阳县', '濮阳', '115.02384', '35.71035', 3, 0, 1),
+(411000, 410000, '许昌市', '许昌', '113.826065', '34.022957', 2, 0, 1),
+(411002, 411000, '魏都区', '魏都', '113.82831', '34.02711', 3, 0, 1),
+(411003, 411000, '建安区', '建安', '', '', 3, 0, 1),
+(411024, 411000, '鄢陵县', '鄢陵', '114.18851', '34.100502', 3, 0, 1),
+(411025, 411000, '襄城县', '襄城', '113.493164', '33.85594', 3, 0, 1),
+(411081, 411000, '禹州市', '禹州', '113.47131', '34.154404', 3, 0, 1),
+(411082, 411000, '长葛市', '长葛', '113.76891', '34.219257', 3, 0, 1),
+(411100, 410000, '漯河市', '漯河', '114.026405', '33.575855', 2, 0, 1),
+(411102, 411100, '源汇区', '源汇', '114.017944', '33.56544', 3, 0, 1),
+(411103, 411100, '郾城区', '郾城', '114.016815', '33.588898', 3, 0, 1),
+(411104, 411100, '召陵区', '召陵', '114.05169', '33.567554', 3, 0, 1),
+(411121, 411100, '舞阳县', '舞阳', '113.610565', '33.43628', 3, 0, 1),
+(411122, 411100, '临颍县', '临颍', '113.93889', '33.80609', 3, 0, 1),
+(411200, 410000, '三门峡市', '三门峡', '111.1941', '34.777336', 2, 0, 1),
+(411202, 411200, '湖滨区', '湖滨', '111.19487', '34.77812', 3, 0, 1),
+(411203, 411200, '陕州区', '陕州', '111.10338', '34.72054', 3, 0, 1),
+(411221, 411200, '渑池县', '渑池', '111.76299', '34.76349', 3, 0, 1),
+(411224, 411200, '卢氏县', '卢氏', '111.05265', '34.053993', 3, 0, 1),
+(411281, 411200, '义马市', '义马', '111.869415', '34.74687', 3, 0, 1),
+(411282, 411200, '灵宝市', '灵宝', '110.88577', '34.521263', 3, 0, 1),
+(411300, 410000, '南阳市', '南阳', '112.54092', '32.99908', 2, 0, 1),
+(411302, 411300, '宛城区', '宛城', '112.54459', '32.994858', 3, 0, 1),
+(411303, 411300, '卧龙区', '卧龙', '112.528786', '32.989876', 3, 0, 1),
+(411321, 411300, '南召县', '南召', '112.435585', '33.488617', 3, 0, 1),
+(411322, 411300, '方城县', '方城', '113.01093', '33.25514', 3, 0, 1),
+(411323, 411300, '西峡县', '西峡', '111.48577', '33.302982', 3, 0, 1),
+(411324, 411300, '镇平县', '镇平', '112.23272', '33.03665', 3, 0, 1),
+(411325, 411300, '内乡县', '内乡', '111.8438', '33.046356', 3, 0, 1),
+(411326, 411300, '淅川县', '淅川', '111.48903', '33.136105', 3, 0, 1),
+(411327, 411300, '社旗县', '社旗县', '112.93828', '33.056126', 3, 0, 1),
+(411328, 411300, '唐河县', '唐河', '112.83849', '32.687893', 3, 0, 1),
+(411329, 411300, '新野县', '新野', '112.36562', '32.524006', 3, 0, 1),
+(411330, 411300, '桐柏县', '桐柏', '113.40606', '32.367153', 3, 0, 1),
+(411381, 411300, '邓州市', '邓州', '112.09271', '32.68164', 3, 0, 1),
+(411400, 410000, '商丘市', '商丘', '115.6505', '34.437054', 2, 0, 1),
+(411402, 411400, '梁园区', '梁园', '115.65459', '34.436554', 3, 0, 1),
+(411403, 411400, '睢阳区', '睢阳', '115.65382', '34.390537', 3, 0, 1),
+(411421, 411400, '民权县', '民权', '115.14815', '34.648457', 3, 0, 1),
+(411422, 411400, '睢县', '睢县', '115.07011', '34.428432', 3, 0, 1),
+(411423, 411400, '宁陵县', '宁陵', '115.32005', '34.4493', 3, 0, 1),
+(411424, 411400, '柘城县', '柘城', '115.307434', '34.075275', 3, 0, 1),
+(411425, 411400, '虞城县', '虞城', '115.86381', '34.399635', 3, 0, 1),
+(411426, 411400, '夏邑县', '夏邑', '116.13989', '34.240894', 3, 0, 1),
+(411481, 411400, '永城市', '永城', '116.44967', '33.931316', 3, 0, 1),
+(411500, 410000, '信阳市', '信阳', '114.07503', '32.123276', 2, 0, 1),
+(411502, 411500, '浉河区', '浉河', '114.07503', '32.123276', 3, 0, 1),
+(411503, 411500, '平桥区', '平桥', '114.12603', '32.098396', 3, 0, 1),
+(411521, 411500, '罗山县', '罗山', '114.53342', '32.203205', 3, 0, 1),
+(411522, 411500, '光山县', '光山', '114.90358', '32.0104', 3, 0, 1),
+(411523, 411500, '新县', '新县', '114.87705', '31.63515', 3, 0, 1),
+(411524, 411500, '商城县', '商城', '115.406296', '31.799982', 3, 0, 1),
+(411525, 411500, '固始县', '固始', '115.66733', '32.183075', 3, 0, 1),
+(411526, 411500, '潢川县', '潢川', '115.050125', '32.134026', 3, 0, 1),
+(411527, 411500, '淮滨县', '淮滨', '115.41545', '32.45264', 3, 0, 1),
+(411528, 411500, '息县', '息县', '114.740715', '32.344746', 3, 0, 1),
+(411600, 410000, '周口市', '周口', '114.64965', '33.620358', 2, 0, 1),
+(411602, 411600, '川汇区', '川汇', '114.65214', '33.614838', 3, 0, 1),
+(411603, 411600, '淮阳区', '淮阳', '114.88614', '33.7315', 3, 0, 1),
+(411621, 411600, '扶沟县', '扶沟', '114.392006', '34.05406', 3, 0, 1),
+(411622, 411600, '西华县', '西华', '114.53007', '33.784378', 3, 0, 1),
+(411623, 411600, '商水县', '商水', '114.60927', '33.543846', 3, 0, 1),
+(411624, 411600, '沈丘县', '沈丘', '115.07838', '33.395515', 3, 0, 1),
+(411625, 411600, '郸城县', '郸城', '115.189', '33.643852', 3, 0, 1),
+(411627, 411600, '太康县', '太康', '114.853836', '34.06531', 3, 0, 1),
+(411628, 411600, '鹿邑县', '鹿邑', '115.48639', '33.86107', 3, 0, 1),
+(411681, 411600, '项城市', '项城', '114.89952', '33.443085', 3, 0, 1),
+(411700, 410000, '驻马店市', '驻马店', '114.024734', '32.980167', 2, 0, 1),
+(411702, 411700, '驿城区', '驿城', '114.02915', '32.97756', 3, 0, 1),
+(411721, 411700, '西平县', '西平', '114.02686', '33.382317', 3, 0, 1),
+(411722, 411700, '上蔡县', '上蔡', '114.26689', '33.264717', 3, 0, 1),
+(411723, 411700, '平舆县', '平舆', '114.63711', '32.955627', 3, 0, 1),
+(411724, 411700, '正阳县', '正阳', '114.38948', '32.601826', 3, 0, 1),
+(411725, 411700, '确山县', '确山', '114.02668', '32.801537', 3, 0, 1),
+(411726, 411700, '泌阳县', '泌阳', '113.32605', '32.72513', 3, 0, 1),
+(411727, 411700, '汝南县', '汝南', '114.3595', '33.004536', 3, 0, 1),
+(411728, 411700, '遂平县', '遂平', '114.00371', '33.14698', 3, 0, 1),
+(411729, 411700, '新蔡县', '新蔡', '114.97524', '32.749947', 3, 0, 1),
+(419001, 419000, '济源市', '济源', '112.60273', '35.06707', 3, 0, 1),
+(420000, 0, '湖北省', '湖北', '114.29857', '30.584354', 1, 0, 1),
+(420100, 420000, '武汉市', '武汉', '114.29857', '30.584354', 2, 0, 1),
+(420102, 420100, '江岸区', '江岸', '114.30304', '30.594912', 3, 0, 1),
+(420103, 420100, '江汉区', '江汉', '114.28311', '30.578772', 3, 0, 1),
+(420104, 420100, '硚口区', '硚口', '114.264565', '30.57061', 3, 0, 1),
+(420105, 420100, '汉阳区', '汉阳', '114.26581', '30.549326', 3, 0, 1),
+(420106, 420100, '武昌区', '武昌', '114.30734', '30.546535', 3, 0, 1),
+(420107, 420100, '青山区', '青山', '114.39707', '30.634214', 3, 0, 1),
+(420111, 420100, '洪山区', '洪山', '114.40072', '30.50426', 3, 0, 1),
+(420112, 420100, '东西湖区', '东西湖', '114.14249', '30.622467', 3, 0, 1),
+(420113, 420100, '汉南区', '汉南', '114.08124', '30.309637', 3, 0, 1),
+(420114, 420100, '蔡甸区', '蔡甸', '114.02934', '30.582186', 3, 0, 1),
+(420115, 420100, '江夏区', '江夏', '114.31396', '30.349045', 3, 0, 1),
+(420116, 420100, '黄陂区', '黄陂', '114.37402', '30.874155', 3, 0, 1),
+(420117, 420100, '新洲区', '新洲', '114.80211', '30.84215', 3, 0, 1),
+(420200, 420000, '黄石市', '黄石', '115.07705', '30.220074', 2, 0, 1),
+(420202, 420200, '黄石港区', '黄石港', '115.090164', '30.212086', 3, 0, 1),
+(420203, 420200, '西塞山区', '西塞山', '115.09335', '30.205364', 3, 0, 1),
+(420204, 420200, '下陆区', '下陆', '114.97575', '30.177845', 3, 0, 1),
+(420205, 420200, '铁山区', '铁山', '114.90137', '30.20601', 3, 0, 1),
+(420222, 420200, '阳新县', '阳新', '115.21288', '29.841572', 3, 0, 1),
+(420281, 420200, '大冶市', '大冶', '114.97484', '30.098804', 3, 0, 1),
+(420300, 420000, '十堰市', '十堰', '110.78792', '32.646908', 2, 0, 1),
+(420302, 420300, '茅箭区', '茅箭', '110.78621', '32.644463', 3, 0, 1),
+(420303, 420300, '张湾区', '张湾', '110.77236', '32.652515', 3, 0, 1),
+(420304, 420300, '郧阳区', '郧阳', '110.81197', '32.83488', 3, 0, 1),
+(420322, 420300, '郧西县', '郧西', '110.426476', '32.99146', 3, 0, 1),
+(420323, 420300, '竹山县', '竹山', '110.2296', '32.22586', 3, 0, 1),
+(420324, 420300, '竹溪县', '竹溪', '109.71719', '32.315342', 3, 0, 1),
+(420325, 420300, '房县', '房县', '110.74197', '32.055', 3, 0, 1),
+(420381, 420300, '丹江口市', '丹江口', '111.513794', '32.538837', 3, 0, 1),
+(420500, 420000, '宜昌市', '宜昌', '111.29084', '30.702637', 2, 0, 1),
+(420502, 420500, '西陵区', '西陵', '111.29547', '30.702477', 3, 0, 1),
+(420503, 420500, '伍家岗区', '伍家岗', '111.30721', '30.679052', 3, 0, 1),
+(420504, 420500, '点军区', '点军', '111.268166', '30.692322', 3, 0, 1),
+(420505, 420500, '猇亭区', '猇亭', '111.29084', '30.702637', 3, 0, 1),
+(420506, 420500, '夷陵区', '夷陵', '111.326744', '30.770199', 3, 0, 1),
+(420525, 420500, '远安县', '远安', '111.64331', '31.059626', 3, 0, 1),
+(420526, 420500, '兴山县', '兴山', '110.7545', '31.34795', 3, 0, 1),
+(420527, 420500, '秭归县', '秭归', '110.97678', '30.823908', 3, 0, 1),
+(420528, 420500, '长阳土家族自治县', '长阳', '111.19848', '30.466534', 3, 0, 1),
+(420529, 420500, '五峰土家族自治县', '五峰', '110.674934', '30.199251', 3, 0, 1),
+(420581, 420500, '宜都市', '宜都', '111.45437', '30.387234', 3, 0, 1),
+(420582, 420500, '当阳市', '当阳', '111.79342', '30.824492', 3, 0, 1),
+(420583, 420500, '枝江市', '枝江', '111.7518', '30.425364', 3, 0, 1),
+(420600, 420000, '襄阳市', '襄阳', '112.14415', '32.042427', 2, 0, 1),
+(420602, 420600, '襄城区', '襄城', '112.15033', '32.015087', 3, 0, 1),
+(420606, 420600, '樊城区', '樊城', '112.13957', '32.05859', 3, 0, 1),
+(420607, 420600, '襄州区', '襄州', '112.19738', '32.085518', 3, 0, 1),
+(420624, 420600, '南漳县', '南漳', '111.84442', '31.77692', 3, 0, 1),
+(420625, 420600, '谷城县', '谷城', '111.640144', '32.262676', 3, 0, 1),
+(420626, 420600, '保康县', '保康', '111.26224', '31.873507', 3, 0, 1),
+(420682, 420600, '老河口市', '老河口', '111.675735', '32.385437', 3, 0, 1),
+(420683, 420600, '枣阳市', '枣阳', '112.76527', '32.12308', 3, 0, 1),
+(420684, 420600, '宜城市', '宜城', '112.261444', '31.709204', 3, 0, 1),
+(420700, 420000, '鄂州市', '鄂州', '114.890594', '30.396536', 2, 0, 1),
+(420702, 420700, '梁子湖区', '梁子湖', '114.68197', '30.09819', 3, 0, 1),
+(420703, 420700, '华容区', '华容', '114.74148', '30.534468', 3, 0, 1),
+(420704, 420700, '鄂城区', '鄂城', '114.890015', '30.39669', 3, 0, 1),
+(420800, 420000, '荆门市', '荆门', '112.204254', '31.03542', 2, 0, 1),
+(420802, 420800, '东宝区', '东宝', '112.2048', '31.03346', 3, 0, 1),
+(420804, 420800, '掇刀区', '掇刀', '112.19841', '30.980799', 3, 0, 1),
+(420822, 420800, '沙洋县', '沙洋', '112.595215', '30.70359', 3, 0, 1),
+(420881, 420800, '钟祥市', '钟祥', '112.587265', '31.165573', 3, 0, 1),
+(420882, 420800, '京山市', '京山', '113.11953', '31.01848', 3, 0, 1),
+(420900, 420000, '孝感市', '孝感', '113.92666', '30.926422', 2, 0, 1),
+(420902, 420900, '孝南区', '孝南', '113.92585', '30.925966', 3, 0, 1),
+(420921, 420900, '孝昌县', '孝昌', '113.98896', '31.251617', 3, 0, 1),
+(420922, 420900, '大悟县', '大悟', '114.12625', '31.565483', 3, 0, 1),
+(420923, 420900, '云梦县', '云梦', '113.75062', '31.02169', 3, 0, 1),
+(420981, 420900, '应城市', '应城', '113.573845', '30.939037', 3, 0, 1),
+(420982, 420900, '安陆市', '安陆', '113.6904', '31.26174', 3, 0, 1),
+(420984, 420900, '汉川市', '汉川', '113.835304', '30.652164', 3, 0, 1),
+(421000, 420000, '荆州市', '荆州', '112.23813', '30.326857', 2, 0, 1),
+(421002, 421000, '沙市区', '沙市', '112.25743', '30.315895', 3, 0, 1),
+(421003, 421000, '荆州区', '荆州', '112.19535', '30.350674', 3, 0, 1),
+(421022, 421000, '公安县', '公安', '112.23018', '30.059065', 3, 0, 1),
+(421023, 421000, '监利县', '监利', '112.90434', '29.82008', 3, 0, 1),
+(421024, 421000, '江陵县', '江陵', '112.41735', '30.033918', 3, 0, 1),
+(421081, 421000, '石首市', '石首', '112.40887', '29.716436', 3, 0, 1),
+(421083, 421000, '洪湖市', '洪湖', '113.47031', '29.81297', 3, 0, 1),
+(421087, 421000, '松滋市', '松滋', '111.77818', '30.176037', 3, 0, 1),
+(421100, 420000, '黄冈市', '黄冈', '114.879364', '30.447712', 2, 0, 1),
+(421102, 421100, '黄州区', '黄州', '114.87894', '30.447435', 3, 0, 1),
+(421121, 421100, '团风县', '团风', '114.87203', '30.63569', 3, 0, 1),
+(421122, 421100, '红安县', '红安', '114.6151', '31.284777', 3, 0, 1),
+(421123, 421100, '罗田县', '罗田', '115.39899', '30.78168', 3, 0, 1),
+(421124, 421100, '英山县', '英山', '115.67753', '30.735794', 3, 0, 1),
+(421125, 421100, '浠水县', '浠水', '115.26344', '30.454838', 3, 0, 1),
+(421126, 421100, '蕲春县', '蕲春', '115.43397', '30.234926', 3, 0, 1),
+(421127, 421100, '黄梅县', '黄梅', '115.94255', '30.075113', 3, 0, 1),
+(421181, 421100, '麻城市', '麻城', '115.02541', '31.177906', 3, 0, 1),
+(421182, 421100, '武穴市', '武穴', '115.56242', '29.849342', 3, 0, 1),
+(421200, 420000, '咸宁市', '咸宁', '114.328964', '29.832798', 2, 0, 1),
+(421202, 421200, '咸安区', '咸安', '114.33389', '29.824717', 3, 0, 1),
+(421221, 421200, '嘉鱼县', '嘉鱼', '113.92155', '29.973364', 3, 0, 1),
+(421222, 421200, '通城县', '通城', '113.81413', '29.246077', 3, 0, 1),
+(421223, 421200, '崇阳县', '崇阳', '114.04996', '29.54101', 3, 0, 1),
+(421224, 421200, '通山县', '通山', '114.493164', '29.604456', 3, 0, 1),
+(421281, 421200, '赤壁市', '赤壁', '113.88366', '29.716879', 3, 0, 1),
+(421300, 420000, '随州市', '随州', '113.37377', '31.717497', 2, 0, 1),
+(421303, 421300, '曾都区', '曾都', '113.3712', '31.71615', 3, 0, 1),
+(421321, 421300, '随县', '随县', '113.301384', '31.854246', 3, 0, 1),
+(421381, 421300, '广水市', '广水', '113.8266', '31.617731', 3, 0, 1),
+(422800, 420000, '恩施土家族苗族自治州', '恩施', '109.48699', '30.283113', 2, 0, 1),
+(422801, 422800, '恩施市', '恩施', '109.48676', '30.282406', 3, 0, 1),
+(422802, 422800, '利川市', '利川', '108.94349', '30.294247', 3, 0, 1),
+(422822, 422800, '建始县', '建始', '109.72382', '30.601631', 3, 0, 1),
+(422823, 422800, '巴东县', '巴东', '110.33666', '31.041403', 3, 0, 1),
+(422825, 422800, '宣恩县', '宣恩', '109.48282', '29.98867', 3, 0, 1),
+(422826, 422800, '咸丰县', '咸丰', '109.15041', '29.678967', 3, 0, 1),
+(422827, 422800, '来凤县', '来凤', '109.408325', '29.506945', 3, 0, 1),
+(422828, 422800, '鹤峰县', '鹤峰', '110.0337', '29.887299', 3, 0, 1),
+(429004, 420000, '仙桃市', '仙桃', '113.45397', '30.364952', 3, 0, 1),
+(429005, 420000, '潜江市', '潜江', '112.896866', '30.421215', 3, 0, 1),
+(429006, 420000, '天门市', '天门', '113.16586', '30.65306', 3, 0, 1),
+(429021, 420000, '神农架林区', '神农架', '114.29857', '30.584354', 3, 0, 1),
+(430000, 0, '湖南省', '湖南', '112.98228', '28.19409', 1, 0, 1),
+(430100, 430000, '长沙市', '长沙', '112.98228', '28.19409', 2, 0, 1),
+(430102, 430100, '芙蓉区', '芙蓉', '112.98809', '28.193106', 3, 0, 1),
+(430103, 430100, '天心区', '天心', '112.97307', '28.192375', 3, 0, 1),
+(430104, 430100, '岳麓区', '岳麓', '112.91159', '28.213043', 3, 0, 1),
+(430105, 430100, '开福区', '开福', '112.98553', '28.201336', 3, 0, 1),
+(430111, 430100, '雨花区', '雨花', '113.016335', '28.109938', 3, 0, 1),
+(430112, 430100, '望城区', '望城', '112.8179', '28.36121', 3, 0, 1),
+(430121, 430100, '长沙县', '长沙', '113.0801', '28.237888', 3, 0, 1),
+(430181, 430100, '浏阳市', '浏阳', '113.6333', '28.141111', 3, 0, 1),
+(430182, 430100, '宁乡市', '宁乡', '112.55183', '28.27741', 3, 0, 1),
+(430200, 430000, '株洲市', '株洲', '113.15173', '27.835806', 2, 0, 1),
+(430202, 430200, '荷塘区', '荷塘', '113.162544', '27.833036', 3, 0, 1),
+(430203, 430200, '芦淞区', '芦淞', '113.15517', '27.827246', 3, 0, 1),
+(430204, 430200, '石峰区', '石峰', '113.11295', '27.871944', 3, 0, 1),
+(430211, 430200, '天元区', '天元', '113.13625', '27.826908', 3, 0, 1),
+(430212, 430200, '渌口区', '渌口', '113.14398', '27.69938', 3, 0, 1),
+(430223, 430200, '攸县', '攸县', '113.34577', '27.00007', 3, 0, 1),
+(430224, 430200, '茶陵县', '茶陵', '113.54651', '26.789534', 3, 0, 1),
+(430225, 430200, '炎陵县', '炎陵', '113.776886', '26.489458', 3, 0, 1),
+(430281, 430200, '醴陵市', '醴陵', '113.50716', '27.657873', 3, 0, 1),
+(430300, 430000, '湘潭市', '湘潭', '112.94405', '27.82973', 2, 0, 1),
+(430302, 430300, '雨湖区', '雨湖', '112.907425', '27.86077', 3, 0, 1),
+(430304, 430300, '岳塘区', '岳塘', '112.927704', '27.828854', 3, 0, 1),
+(430321, 430300, '湘潭县', '湘潭', '112.95283', '27.7786', 3, 0, 1),
+(430381, 430300, '湘乡市', '湘乡', '112.525215', '27.734919', 3, 0, 1),
+(430382, 430300, '韶山市', '韶山', '112.52848', '27.922682', 3, 0, 1),
+(430400, 430000, '衡阳市', '衡阳', '112.6077', '26.900358', 2, 0, 1),
+(430405, 430400, '珠晖区', '珠晖', '112.62633', '26.891064', 3, 0, 1),
+(430406, 430400, '雁峰区', '雁峰', '112.61224', '26.893694', 3, 0, 1),
+(430407, 430400, '石鼓区', '石鼓', '112.607635', '26.903908', 3, 0, 1),
+(430408, 430400, '蒸湘区', '蒸湘', '112.57061', '26.89087', 3, 0, 1),
+(430412, 430400, '南岳区', '南岳', '112.734146', '27.240536', 3, 0, 1),
+(430421, 430400, '衡阳县', '衡阳', '112.37965', '26.962387', 3, 0, 1),
+(430422, 430400, '衡南县', '衡南', '112.67746', '26.739973', 3, 0, 1),
+(430423, 430400, '衡山县', '衡山', '112.86971', '27.234808', 3, 0, 1),
+(430424, 430400, '衡东县', '衡东', '112.95041', '27.08353', 3, 0, 1),
+(430426, 430400, '祁东县', '祁东', '112.11119', '26.78711', 3, 0, 1),
+(430481, 430400, '耒阳市', '耒阳', '112.84721', '26.414162', 3, 0, 1),
+(430482, 430400, '常宁市', '常宁', '112.39682', '26.406773', 3, 0, 1),
+(430500, 430000, '邵阳市', '邵阳', '111.46923', '27.237843', 2, 0, 1),
+(430502, 430500, '双清区', '双清', '111.47976', '27.240002', 3, 0, 1),
+(430503, 430500, '大祥区', '大祥', '111.46297', '27.233593', 3, 0, 1),
+(430511, 430500, '北塔区', '北塔', '111.45232', '27.245687', 3, 0, 1),
+(430522, 430500, '新邵县', '新邵', '111.45976', '27.311428', 3, 0, 1),
+(430523, 430500, '邵阳县', '邵阳', '111.2757', '26.989714', 3, 0, 1),
+(430524, 430500, '隆回县', '隆回', '111.03879', '27.116001', 3, 0, 1),
+(430525, 430500, '洞口县', '洞口', '110.57921', '27.062286', 3, 0, 1),
+(430527, 430500, '绥宁县', '绥宁', '110.155075', '26.580622', 3, 0, 1),
+(430528, 430500, '新宁县', '新宁', '110.859116', '26.438911', 3, 0, 1),
+(430529, 430500, '城步苗族自治县', '城步', '110.313225', '26.363575', 3, 0, 1),
+(430581, 430500, '武冈市', '武冈', '110.6368', '26.732086', 3, 0, 1),
+(430582, 430500, '邵东市', '邵东', '111.74446', '27.25844', 3, 0, 1),
+(430600, 430000, '岳阳市', '岳阳', '113.13286', '29.37029', 2, 0, 1),
+(430602, 430600, '岳阳楼区', '岳阳楼', '113.12075', '29.366783', 3, 0, 1),
+(430603, 430600, '云溪区', '云溪', '113.27387', '29.473394', 3, 0, 1),
+(430611, 430600, '君山区', '君山', '113.00408', '29.438063', 3, 0, 1),
+(430621, 430600, '岳阳县', '岳阳', '113.11607', '29.144842', 3, 0, 1),
+(430623, 430600, '华容县', '华容', '112.55937', '29.524107', 3, 0, 1),
+(430624, 430600, '湘阴县', '湘阴', '112.88975', '28.677498', 3, 0, 1),
+(430626, 430600, '平江县', '平江', '113.59375', '28.701523', 3, 0, 1),
+(430681, 430600, '汨罗市', '汨罗', '113.07942', '28.803148', 3, 0, 1),
+(430682, 430600, '临湘市', '临湘', '113.450806', '29.471594', 3, 0, 1),
+(430700, 430000, '常德市', '常德', '111.691345', '29.040224', 2, 0, 1),
+(430702, 430700, '武陵区', '武陵', '111.69072', '29.040478', 3, 0, 1),
+(430703, 430700, '鼎城区', '鼎城', '111.685326', '29.014425', 3, 0, 1),
+(430721, 430700, '安乡县', '安乡', '112.17229', '29.414482', 3, 0, 1),
+(430722, 430700, '汉寿县', '汉寿', '111.968506', '28.907318', 3, 0, 1),
+(430723, 430700, '澧县', '澧县', '111.76168', '29.64264', 3, 0, 1),
+(430724, 430700, '临澧县', '临澧', '111.6456', '29.443216', 3, 0, 1),
+(430725, 430700, '桃源县', '桃源', '111.484505', '28.902735', 3, 0, 1),
+(430726, 430700, '石门县', '石门', '111.37909', '29.584703', 3, 0, 1),
+(430781, 430700, '津市市', '津市', '111.87961', '29.630867', 3, 0, 1),
+(430800, 430000, '张家界市', '张家界', '110.47992', '29.127401', 2, 0, 1),
+(430802, 430800, '永定区', '永定', '110.48456', '29.125961', 3, 0, 1),
+(430811, 430800, '武陵源区', '武陵源', '110.54758', '29.347828', 3, 0, 1),
+(430821, 430800, '慈利县', '慈利', '111.132706', '29.423876', 3, 0, 1),
+(430822, 430800, '桑植县', '桑植', '110.16404', '29.399939', 3, 0, 1),
+(430900, 430000, '益阳市', '益阳', '112.35504', '28.570066', 2, 0, 1),
+(430902, 430900, '资阳区', '资阳', '112.33084', '28.592772', 3, 0, 1),
+(430903, 430900, '赫山区', '赫山', '112.36095', '28.568327', 3, 0, 1),
+(430921, 430900, '南县', '南县', '112.4104', '29.37218', 3, 0, 1),
+(430922, 430900, '桃江县', '桃江', '112.13973', '28.520992', 3, 0, 1),
+(430923, 430900, '安化县', '安化', '111.221825', '28.37742', 3, 0, 1),
+(430981, 430900, '沅江市', '沅江', '112.36109', '28.839712', 3, 0, 1),
+(431000, 430000, '郴州市', '郴州', '113.03207', '25.793589', 2, 0, 1),
+(431002, 431000, '北湖区', '北湖', '113.03221', '25.792627', 3, 0, 1),
+(431003, 431000, '苏仙区', '苏仙', '113.0387', '25.793158', 3, 0, 1),
+(431021, 431000, '桂阳县', '桂阳', '112.73447', '25.737448', 3, 0, 1),
+(431022, 431000, '宜章县', '宜章', '112.94788', '25.394344', 3, 0, 1),
+(431023, 431000, '永兴县', '永兴', '113.11482', '26.129393', 3, 0, 1),
+(431024, 431000, '嘉禾县', '嘉禾', '112.37062', '25.587309', 3, 0, 1),
+(431025, 431000, '临武县', '临武', '112.56459', '25.27912', 3, 0, 1),
+(431026, 431000, '汝城县', '汝城', '113.685684', '25.553759', 3, 0, 1),
+(431027, 431000, '桂东县', '桂东', '113.94588', '26.073917', 3, 0, 1),
+(431028, 431000, '安仁县', '安仁', '113.27217', '26.708626', 3, 0, 1),
+(431081, 431000, '资兴市', '资兴', '113.23682', '25.974152', 3, 0, 1),
+(431100, 430000, '永州市', '永州', '111.60802', '26.434517', 2, 0, 1),
+(431102, 431100, '零陵区', '零陵', '111.62635', '26.223347', 3, 0, 1),
+(431103, 431100, '冷水滩区', '冷水滩', '111.607155', '26.434364', 3, 0, 1),
+(431121, 431100, '祁阳县', '祁阳', '111.85734', '26.58593', 3, 0, 1),
+(431122, 431100, '东安县', '东安', '111.313034', '26.397278', 3, 0, 1),
+(431123, 431100, '双牌县', '双牌', '111.66215', '25.959396', 3, 0, 1),
+(431124, 431100, '道县', '道县', '111.59161', '25.518444', 3, 0, 1),
+(431125, 431100, '江永县', '江永', '111.3468', '25.268154', 3, 0, 1),
+(431126, 431100, '宁远县', '宁远', '111.94453', '25.584112', 3, 0, 1),
+(431127, 431100, '蓝山县', '蓝山', '112.1942', '25.375256', 3, 0, 1),
+(431128, 431100, '新田县', '新田', '112.220345', '25.906927', 3, 0, 1),
+(431129, 431100, '江华瑶族自治县', '江华', '111.57728', '25.182596', 3, 0, 1),
+(431200, 430000, '怀化市', '怀化', '109.97824', '27.550081', 2, 0, 1),
+(431202, 431200, '鹤城区', '鹤城', '109.98224', '27.548473', 3, 0, 1),
+(431221, 431200, '中方县', '中方', '109.94806', '27.43736', 3, 0, 1),
+(431222, 431200, '沅陵县', '沅陵', '110.39916', '28.455553', 3, 0, 1),
+(431223, 431200, '辰溪县', '辰溪', '110.19695', '28.005474', 3, 0, 1),
+(431224, 431200, '溆浦县', '溆浦', '110.593376', '27.903803', 3, 0, 1),
+(431225, 431200, '会同县', '会同', '109.72079', '26.870789', 3, 0, 1),
+(431226, 431200, '麻阳苗族自治县', '麻阳', '109.80281', '27.865992', 3, 0, 1),
+(431227, 431200, '新晃侗族自治县', '新晃', '109.174446', '27.359898', 3, 0, 1),
+(431228, 431200, '芷江侗族自治县', '芷江', '109.687775', '27.437996', 3, 0, 1),
+(431229, 431200, '靖州苗族侗族自治县', '靖州', '109.69116', '26.573511', 3, 0, 1),
+(431230, 431200, '通道侗族自治县', '通道', '109.783356', '26.158348', 3, 0, 1),
+(431281, 431200, '洪江市', '洪江', '109.831764', '27.201876', 3, 0, 1),
+(431300, 430000, '娄底市', '娄底', '112.0085', '27.728136', 2, 0, 1),
+(431302, 431300, '娄星区', '娄星', '112.008484', '27.726643', 3, 0, 1),
+(431321, 431300, '双峰县', '双峰', '112.19824', '27.459126', 3, 0, 1),
+(431322, 431300, '新化县', '新化', '111.30675', '27.737455', 3, 0, 1),
+(431381, 431300, '冷水江市', '冷水江', '111.43468', '27.685759', 3, 0, 1),
+(431382, 431300, '涟源市', '涟源', '111.670845', '27.6923', 3, 0, 1),
+(433100, 430000, '湘西土家族苗族自治州', '湘西', '109.73974', '28.314297', 2, 0, 1),
+(433101, 433100, '吉首市', '吉首', '109.73827', '28.314827', 3, 0, 1),
+(433122, 433100, '泸溪县', '泸溪', '110.21443', '28.214516', 3, 0, 1),
+(433123, 433100, '凤凰县', '凤凰', '109.59919', '27.948309', 3, 0, 1),
+(433124, 433100, '花垣县', '花垣', '109.479065', '28.581352', 3, 0, 1),
+(433125, 433100, '保靖县', '保靖', '109.65144', '28.709604', 3, 0, 1),
+(433126, 433100, '古丈县', '古丈', '109.94959', '28.616974', 3, 0, 1),
+(433127, 433100, '永顺县', '永顺', '109.853294', '28.998068', 3, 0, 1),
+(433130, 433100, '龙山县', '龙山', '109.44119', '29.453438', 3, 0, 1),
+(440000, 0, '广东省', '广东', '113.28064', '23.125177', 1, 0, 1),
+(440100, 440000, '广州市', '广州', '113.28064', '23.125177', 2, 0, 1),
+(440103, 440100, '荔湾区', '荔湾', '113.243034', '23.124943', 3, 0, 1),
+(440104, 440100, '越秀区', '越秀', '113.280716', '23.125624', 3, 0, 1),
+(440105, 440100, '海珠区', '海珠', '113.26201', '23.10313', 3, 0, 1),
+(440106, 440100, '天河区', '天河', '113.335365', '23.13559', 3, 0, 1),
+(440111, 440100, '白云区', '白云', '113.26283', '23.162281', 3, 0, 1),
+(440112, 440100, '黄埔区', '黄埔', '113.45076', '23.10324', 3, 0, 1),
+(440113, 440100, '番禺区', '番禺', '113.36462', '22.938581', 3, 0, 1),
+(440114, 440100, '花都区', '花都', '113.21118', '23.39205', 3, 0, 1),
+(440115, 440100, '南沙区', '南沙', '113.53738', '22.79453', 3, 0, 1),
+(440117, 440100, '从化区', '从化', '113.58646', '23.54835', 3, 0, 1),
+(440118, 440100, '增城区', '增城', '113.8109', '23.26093', 3, 0, 1),
+(440200, 440000, '韶关市', '韶关', '113.591545', '24.801323', 2, 0, 1),
+(440203, 440200, '武江区', '武江', '113.58829', '24.80016', 3, 0, 1),
+(440204, 440200, '浈江区', '浈江', '113.59922', '24.803976', 3, 0, 1),
+(440205, 440200, '曲江区', '曲江', '113.60558', '24.680195', 3, 0, 1),
+(440222, 440200, '始兴县', '始兴', '114.06721', '24.948364', 3, 0, 1),
+(440224, 440200, '仁化县', '仁化', '113.74863', '25.088226', 3, 0, 1),
+(440229, 440200, '翁源县', '翁源', '114.13129', '24.353888', 3, 0, 1),
+(440232, 440200, '乳源瑶族自治县', '乳源', '113.27842', '24.77611', 3, 0, 1),
+(440233, 440200, '新丰县', '新丰', '114.20703', '24.055412', 3, 0, 1),
+(440281, 440200, '乐昌市', '乐昌', '113.35241', '25.128445', 3, 0, 1),
+(440282, 440200, '南雄市', '南雄', '114.31123', '25.115328', 3, 0, 1),
+(440300, 440000, '深圳市', '深圳', '114.085945', '22.547', 2, 0, 1),
+(440303, 440300, '罗湖区', '罗湖', '114.123886', '22.555342', 3, 0, 1),
+(440304, 440300, '福田区', '福田', '114.05096', '22.54101', 3, 0, 1),
+(440305, 440300, '南山区', '南山', '113.92943', '22.531221', 3, 0, 1),
+(440306, 440300, '宝安区', '宝安', '113.828674', '22.754742', 3, 0, 1),
+(440307, 440300, '龙岗区', '龙岗', '114.25137', '22.721512', 3, 0, 1),
+(440308, 440300, '盐田区', '盐田', '114.23537', '22.555069', 3, 0, 1),
+(440309, 440300, '龙华区', '龙华', '114.06031', '22.72174', 3, 0, 1),
+(440310, 440300, '坪山区', '坪山', '114.34632', '22.69084', 3, 0, 1),
+(440311, 440300, '光明区', '光明', '113.93588', '22.74894', 3, 0, 1),
+(440400, 440000, '珠海市', '珠海', '113.553986', '22.22498', 2, 0, 1),
+(440402, 440400, '香洲区', '香洲', '113.55027', '22.27125', 3, 0, 1),
+(440403, 440400, '斗门区', '斗门', '113.29774', '22.209118', 3, 0, 1),
+(440404, 440400, '金湾区', '金湾', '113.34507', '22.139122', 3, 0, 1),
+(440500, 440000, '汕头市', '汕头', '116.708466', '23.37102', 2, 0, 1),
+(440507, 440500, '龙湖区', '龙湖', '116.73202', '23.373755', 3, 0, 1),
+(440511, 440500, '金平区', '金平', '116.70358', '23.367071', 3, 0, 1),
+(440512, 440500, '濠江区', '濠江', '116.72953', '23.279345', 3, 0, 1),
+(440513, 440500, '潮阳区', '潮阳', '116.6026', '23.262337', 3, 0, 1),
+(440514, 440500, '潮南区', '潮南', '116.42361', '23.249798', 3, 0, 1),
+(440515, 440500, '澄海区', '澄海', '116.76336', '23.46844', 3, 0, 1),
+(440523, 440500, '南澳县', '南澳', '117.02711', '23.419561', 3, 0, 1),
+(440600, 440000, '佛山市', '佛山', '113.12272', '23.028763', 2, 0, 1),
+(440604, 440600, '禅城区', '禅城', '113.11241', '23.019644', 3, 0, 1),
+(440605, 440600, '南海区', '南海', '113.14558', '23.031563', 3, 0, 1),
+(440606, 440600, '顺德区', '顺德', '113.28182', '22.75851', 3, 0, 1),
+(440607, 440600, '三水区', '三水', '112.899414', '23.16504', 3, 0, 1),
+(440608, 440600, '高明区', '高明', '112.882126', '22.893854', 3, 0, 1),
+(440700, 440000, '江门市', '江门', '113.09494', '22.590431', 2, 0, 1),
+(440703, 440700, '蓬江区', '蓬江', '113.07859', '22.59677', 3, 0, 1),
+(440704, 440700, '江海区', '江海', '113.1206', '22.57221', 3, 0, 1),
+(440705, 440700, '新会区', '新会', '113.03858', '22.520247', 3, 0, 1),
+(440781, 440700, '台山市', '台山', '112.79341', '22.250713', 3, 0, 1),
+(440783, 440700, '开平市', '开平', '112.69226', '22.366285', 3, 0, 1),
+(440784, 440700, '鹤山市', '鹤山', '112.96179', '22.768105', 3, 0, 1),
+(440785, 440700, '恩平市', '恩平', '112.31405', '22.182957', 3, 0, 1),
+(440800, 440000, '湛江市', '湛江', '110.364975', '21.274899', 2, 0, 1),
+(440802, 440800, '赤坎区', '赤坎', '110.36163', '21.273365', 3, 0, 1),
+(440803, 440800, '霞山区', '霞山', '110.40638', '21.19423', 3, 0, 1),
+(440804, 440800, '坡头区', '坡头', '110.455635', '21.24441', 3, 0, 1),
+(440811, 440800, '麻章区', '麻章', '110.32917', '21.265997', 3, 0, 1),
+(440823, 440800, '遂溪县', '遂溪', '110.25532', '21.376915', 3, 0, 1),
+(440825, 440800, '徐闻县', '徐闻', '110.17572', '20.326082', 3, 0, 1),
+(440881, 440800, '廉江市', '廉江', '110.28496', '21.61128', 3, 0, 1),
+(440882, 440800, '雷州市', '雷州', '110.08827', '20.908524', 3, 0, 1),
+(440883, 440800, '吴川市', '吴川', '110.78051', '21.428453', 3, 0, 1),
+(440900, 440000, '茂名市', '茂名', '110.91923', '21.659752', 2, 0, 1),
+(440902, 440900, '茂南区', '茂南', '110.92054', '21.660425', 3, 0, 1),
+(440904, 440900, '电白区', '电白', '111.01636', '21.51428', 3, 0, 1),
+(440981, 440900, '高州市', '高州', '110.85325', '21.915154', 3, 0, 1),
+(440982, 440900, '化州市', '化州', '110.63839', '21.654953', 3, 0, 1),
+(440983, 440900, '信宜市', '信宜', '110.94166', '22.35268', 3, 0, 1),
+(441200, 440000, '肇庆市', '肇庆', '112.47253', '23.051546', 2, 0, 1),
+(441202, 441200, '端州区', '端州', '112.47233', '23.052662', 3, 0, 1),
+(441203, 441200, '鼎湖区', '鼎湖', '112.56525', '23.155823', 3, 0, 1),
+(441204, 441200, '高要区', '高要', '112.45839', '23.02581', 3, 0, 1),
+(441223, 441200, '广宁县', '广宁', '112.44042', '23.631487', 3, 0, 1),
+(441224, 441200, '怀集县', '怀集', '112.182465', '23.913073', 3, 0, 1),
+(441225, 441200, '封开县', '封开', '111.502975', '23.43473', 3, 0, 1),
+(441226, 441200, '德庆县', '德庆', '111.78156', '23.14171', 3, 0, 1),
+(441284, 441200, '四会市', '四会', '112.69503', '23.340324', 3, 0, 1),
+(441300, 440000, '惠州市', '惠州', '114.4126', '23.079405', 2, 0, 1),
+(441302, 441300, '惠城区', '惠城', '114.41398', '23.079884', 3, 0, 1),
+(441303, 441300, '惠阳区', '惠阳', '114.469444', '22.78851', 3, 0, 1),
+(441322, 441300, '博罗县', '博罗', '114.284256', '23.167576', 3, 0, 1),
+(441323, 441300, '惠东县', '惠东', '114.72309', '22.983036', 3, 0, 1),
+(441324, 441300, '龙门县', '龙门', '114.25999', '23.723894', 3, 0, 1),
+(441400, 440000, '梅州市', '梅州', '116.117584', '24.299112', 2, 0, 1),
+(441402, 441400, '梅江区', '梅江', '116.12116', '24.302593', 3, 0, 1),
+(441403, 441400, '梅县区', '梅县', '116.08245', '24.26539', 3, 0, 1),
+(441422, 441400, '大埔县', '大埔', '116.69552', '24.351587', 3, 0, 1),
+(441423, 441400, '丰顺县', '丰顺', '116.18442', '23.752771', 3, 0, 1),
+(441424, 441400, '五华县', '五华', '115.775', '23.925425', 3, 0, 1),
+(441426, 441400, '平远县', '平远', '115.89173', '24.56965', 3, 0, 1),
+(441427, 441400, '蕉岭县', '蕉岭', '116.17053', '24.653313', 3, 0, 1),
+(441481, 441400, '兴宁市', '兴宁', '115.73165', '24.138077', 3, 0, 1),
+(441500, 440000, '汕尾市', '汕尾', '115.364235', '22.774485', 2, 0, 1),
+(441502, 441500, '城区', '城区', '115.36367', '22.776228', 3, 0, 1),
+(441521, 441500, '海丰县', '海丰', '115.337326', '22.971043', 3, 0, 1),
+(441523, 441500, '陆河县', '陆河', '115.65756', '23.302683', 3, 0, 1),
+(441581, 441500, '陆丰市', '陆丰', '115.6442', '22.946104', 3, 0, 1),
+(441600, 440000, '河源市', '河源', '114.6978', '23.746265', 2, 0, 1),
+(441602, 441600, '源城区', '源城', '114.69683', '23.746256', 3, 0, 1),
+(441621, 441600, '紫金县', '紫金', '115.18438', '23.633743', 3, 0, 1),
+(441622, 441600, '龙川县', '龙川', '115.25642', '24.101173', 3, 0, 1),
+(441623, 441600, '连平县', '连平', '114.49595', '24.364227', 3, 0, 1),
+(441624, 441600, '和平县', '和平', '114.941475', '24.44318', 3, 0, 1),
+(441625, 441600, '东源县', '东源', '114.742714', '23.789093', 3, 0, 1),
+(441700, 440000, '阳江市', '阳江', '111.975105', '21.859222', 2, 0, 1),
+(441702, 441700, '江城区', '江城', '111.96891', '21.859182', 3, 0, 1),
+(441704, 441700, '阳东区', '阳东', '112.0067', '21.86829', 3, 0, 1),
+(441721, 441700, '阳西县', '阳西', '111.61755', '21.75367', 3, 0, 1),
+(441781, 441700, '阳春市', '阳春', '111.7905', '22.169598', 3, 0, 1),
+(441800, 440000, '清远市', '清远', '113.05122', '23.685022', 2, 0, 1),
+(441802, 441800, '清城区', '清城', '113.0487', '23.688976', 3, 0, 1),
+(441803, 441800, '清新区', '清新', '113.01658', '23.73474', 3, 0, 1),
+(441821, 441800, '佛冈县', '佛冈', '113.534096', '23.86674', 3, 0, 1),
+(441823, 441800, '阳山县', '阳山', '112.63402', '24.470285', 3, 0, 1),
+(441825, 441800, '连山壮族瑶族自治县', '连山', '112.086555', '24.56727', 3, 0, 1),
+(441826, 441800, '连南瑶族自治县', '连南', '112.29081', '24.719097', 3, 0, 1),
+(441881, 441800, '英德市', '英德', '113.4054', '24.18612', 3, 0, 1),
+(441882, 441800, '连州市', '连州', '112.37927', '24.783966', 3, 0, 1),
+(441900, 440000, '东莞市', '东莞', '113.74626', '23.046238', 2, 0, 1),
+(442000, 440000, '中山市', '中山', '113.38239', '22.521112', 2, 0, 1),
+(445100, 440000, '潮州市', '潮州', '116.6323', '23.661701', 2, 0, 1),
+(445102, 445100, '湘桥区', '湘桥', '116.63365', '23.664675', 3, 0, 1),
+(445103, 445100, '潮安区', '潮安', '116.67809', '23.46244', 3, 0, 1),
+(445122, 445100, '饶平县', '饶平', '117.00205', '23.66817', 3, 0, 1),
+(445200, 440000, '揭阳市', '揭阳', '116.355736', '23.543777', 2, 0, 1),
+(445202, 445200, '榕城区', '榕城', '116.35705', '23.535524', 3, 0, 1),
+(445203, 445200, '揭东区', '揭东', '116.41211', '23.56606', 3, 0, 1),
+(445222, 445200, '揭西县', '揭西', '115.83871', '23.4273', 3, 0, 1),
+(445224, 445200, '惠来县', '惠来', '116.29583', '23.029835', 3, 0, 1),
+(445281, 445200, '普宁市', '普宁', '116.165085', '23.29788', 3, 0, 1),
+(445300, 440000, '云浮市', '云浮', '112.04444', '22.929802', 2, 0, 1),
+(445302, 445300, '云城区', '云城', '112.04471', '22.930826', 3, 0, 1),
+(445303, 445300, '云安区', '云安', '112.00324', '23.07101', 3, 0, 1),
+(445321, 445300, '新兴县', '新兴', '112.23083', '22.703203', 3, 0, 1),
+(445322, 445300, '郁南县', '郁南', '111.53592', '23.237709', 3, 0, 1),
+(445381, 445300, '罗定市', '罗定', '111.5782', '22.765415', 3, 0, 1),
+(450000, 0, '广西壮族自治区', '广西', '108.32001', '22.82402', 1, 0, 1),
+(450100, 450000, '南宁市', '南宁', '108.32001', '22.82402', 2, 0, 1),
+(450102, 450100, '兴宁区', '兴宁', '108.32019', '22.819511', 3, 0, 1),
+(450103, 450100, '青秀区', '青秀', '108.346115', '22.816614', 3, 0, 1),
+(450105, 450100, '江南区', '江南', '108.31048', '22.799593', 3, 0, 1),
+(450107, 450100, '西乡塘区', '西乡塘', '108.3069', '22.832779', 3, 0, 1),
+(450108, 450100, '良庆区', '良庆', '108.322105', '22.75909', 3, 0, 1),
+(450109, 450100, '邕宁区', '邕宁', '108.48425', '22.756598', 3, 0, 1),
+(450110, 450100, '武鸣区', '武鸣', '108.27461', '23.15866', 3, 0, 1),
+(450123, 450100, '隆安县', '隆安', '107.68866', '23.174763', 3, 0, 1),
+(450124, 450100, '马山县', '马山', '108.172905', '23.711758', 3, 0, 1),
+(450125, 450100, '上林县', '上林', '108.603935', '23.431768', 3, 0, 1),
+(450126, 450100, '宾阳县', '宾阳', '108.816734', '23.216885', 3, 0, 1),
+(450127, 450100, '横县', '横县', '109.27099', '22.68743', 3, 0, 1),
+(450200, 450000, '柳州市', '柳州', '109.411705', '24.314617', 2, 0, 1),
+(450202, 450200, '城中区', '城中', '109.41175', '24.312325', 3, 0, 1),
+(450203, 450200, '鱼峰区', '鱼峰', '109.41537', '24.303848', 3, 0, 1),
+(450204, 450200, '柳南区', '柳南', '109.395935', '24.287012', 3, 0, 1),
+(450205, 450200, '柳北区', '柳北', '109.40658', '24.359144', 3, 0, 1),
+(450206, 450200, '柳江区', '柳江', '109.32672', '24.25465', 3, 0, 1),
+(450222, 450200, '柳城县', '柳城', '109.24581', '24.65512', 3, 0, 1),
+(450223, 450200, '鹿寨县', '鹿寨', '109.74081', '24.483404', 3, 0, 1),
+(450224, 450200, '融安县', '融安', '109.40362', '25.214703', 3, 0, 1),
+(450225, 450200, '融水苗族自治县', '融水', '109.25275', '25.068811', 3, 0, 1),
+(450226, 450200, '三江侗族自治县', '三江', '109.614845', '25.78553', 3, 0, 1),
+(450300, 450000, '桂林市', '桂林', '110.29912', '25.274216', 2, 0, 1),
+(450302, 450300, '秀峰区', '秀峰', '110.29244', '25.278543', 3, 0, 1),
+(450303, 450300, '叠彩区', '叠彩', '110.30078', '25.301334', 3, 0, 1),
+(450304, 450300, '象山区', '象山', '110.28488', '25.261986', 3, 0, 1),
+(450305, 450300, '七星区', '七星', '110.31757', '25.25434', 3, 0, 1),
+(450311, 450300, '雁山区', '雁山', '110.305664', '25.077646', 3, 0, 1),
+(450312, 450300, '临桂区', '临桂', '110.2124', '25.23868', 3, 0, 1),
+(450321, 450300, '阳朔县', '阳朔', '110.4947', '24.77534', 3, 0, 1),
+(450323, 450300, '灵川县', '灵川', '110.325714', '25.40854', 3, 0, 1),
+(450324, 450300, '全州县', '全州', '111.07299', '25.929897', 3, 0, 1),
+(450325, 450300, '兴安县', '兴安', '110.670784', '25.609554', 3, 0, 1),
+(450326, 450300, '永福县', '永福', '109.989204', '24.986692', 3, 0, 1),
+(450327, 450300, '灌阳县', '灌阳', '111.16025', '25.489098', 3, 0, 1),
+(450328, 450300, '龙胜各族自治县', '龙胜', '110.00942', '25.796429', 3, 0, 1),
+(450329, 450300, '资源县', '资源', '110.642586', '26.0342', 3, 0, 1),
+(450330, 450300, '平乐县', '平乐', '110.64282', '24.632215', 3, 0, 1),
+(450332, 450300, '恭城瑶族自治县', '恭城', '110.82952', '24.833612', 3, 0, 1),
+(450381, 450300, '荔浦市', '荔浦', '110.39517', '24.48887', 3, 0, 1),
+(450400, 450000, '梧州市', '梧州', '111.29761', '23.474804', 2, 0, 1),
+(450403, 450400, '万秀区', '万秀', '111.31582', '23.471317', 3, 0, 1),
+(450405, 450400, '长洲区', '长洲', '111.27568', '23.4777', 3, 0, 1),
+(450406, 450400, '龙圩区', '龙圩', '111.24603', '23.40996', 3, 0, 1),
+(450421, 450400, '苍梧县', '苍梧', '111.54401', '23.845097', 3, 0, 1),
+(450422, 450400, '藤县', '藤县', '110.93182', '23.373962', 3, 0, 1),
+(450423, 450400, '蒙山县', '蒙山', '110.5226', '24.19983', 3, 0, 1),
+(450481, 450400, '岑溪市', '岑溪', '110.998116', '22.918406', 3, 0, 1),
+(450500, 450000, '北海市', '北海', '109.119255', '21.473343', 2, 0, 1),
+(450502, 450500, '海城区', '海城', '109.10753', '21.468443', 3, 0, 1),
+(450503, 450500, '银海区', '银海', '109.118706', '21.444908', 3, 0, 1),
+(450512, 450500, '铁山港区', '铁山港', '109.45058', '21.5928', 3, 0, 1),
+(450521, 450500, '合浦县', '合浦', '109.20069', '21.663553', 3, 0, 1),
+(450600, 450000, '防城港市', '防城港', '108.345474', '21.614632', 2, 0, 1),
+(450602, 450600, '港口区', '港口', '108.34628', '21.614407', 3, 0, 1),
+(450603, 450600, '防城区', '防城', '108.35843', '21.764757', 3, 0, 1),
+(450621, 450600, '上思县', '上思', '107.98214', '22.151423', 3, 0, 1),
+(450681, 450600, '东兴市', '东兴', '107.97017', '21.541172', 3, 0, 1),
+(450700, 450000, '钦州市', '钦州', '108.624176', '21.967127', 2, 0, 1),
+(450702, 450700, '钦南区', '钦南', '108.62663', '21.966808', 3, 0, 1),
+(450703, 450700, '钦北区', '钦北', '108.44911', '22.132761', 3, 0, 1),
+(450721, 450700, '灵山县', '灵山', '109.293465', '22.418041', 3, 0, 1),
+(450722, 450700, '浦北县', '浦北', '109.55634', '22.268335', 3, 0, 1),
+(450800, 450000, '贵港市', '贵港', '109.60214', '23.0936', 2, 0, 1),
+(450802, 450800, '港北区', '港北', '109.59481', '23.107677', 3, 0, 1),
+(450803, 450800, '港南区', '港南', '109.60467', '23.067516', 3, 0, 1),
+(450804, 450800, '覃塘区', '覃塘', '109.415695', '23.132814', 3, 0, 1),
+(450821, 450800, '平南县', '平南', '110.397484', '23.544546', 3, 0, 1),
+(450881, 450800, '桂平市', '桂平', '110.07467', '23.382473', 3, 0, 1),
+(450900, 450000, '玉林市', '玉林', '110.154396', '22.63136', 2, 0, 1),
+(450902, 450900, '玉州区', '玉州', '110.154915', '22.632132', 3, 0, 1),
+(450903, 450900, '福绵区', '福绵', '110.05143', '22.579947', 3, 0, 1),
+(450921, 450900, '容县', '容县', '110.55247', '22.856436', 3, 0, 1),
+(450922, 450900, '陆川县', '陆川', '110.26484', '22.321054', 3, 0, 1),
+(450923, 450900, '博白县', '博白', '109.98', '22.271284', 3, 0, 1),
+(450924, 450900, '兴业县', '兴业', '109.87777', '22.74187', 3, 0, 1),
+(450981, 450900, '北流市', '北流', '110.34805', '22.701649', 3, 0, 1),
+(451000, 450000, '百色市', '百色', '106.61629', '23.897741', 2, 0, 1),
+(451002, 451000, '右江区', '右江', '106.61573', '23.897675', 3, 0, 1),
+(451003, 451000, '田阳区', '田阳', '106.91567', '23.73567', 3, 0, 1),
+(451022, 451000, '田东县', '田东', '107.12426', '23.600445', 3, 0, 1),
+(451024, 451000, '德保县', '德保', '106.618164', '23.321465', 3, 0, 1),
+(451026, 451000, '那坡县', '那坡', '105.83355', '23.400785', 3, 0, 1),
+(451027, 451000, '凌云县', '凌云', '106.56487', '24.345642', 3, 0, 1),
+(451028, 451000, '乐业县', '乐业', '106.55964', '24.782204', 3, 0, 1),
+(451029, 451000, '田林县', '田林', '106.23505', '24.290262', 3, 0, 1),
+(451030, 451000, '西林县', '西林', '105.095024', '24.49204', 3, 0, 1),
+(451031, 451000, '隆林各族自治县', '隆林', '105.34236', '24.774319', 3, 0, 1),
+(451081, 451000, '靖西市', '靖西', '106.41769', '23.13402', 3, 0, 1),
+(451082, 451000, '平果市', '平果', '107.58988', '23.32934', 3, 0, 1),
+(451100, 450000, '贺州市', '贺州', '111.552055', '24.41414', 2, 0, 1),
+(451102, 451100, '八步区', '八步', '111.551994', '24.412445', 3, 0, 1),
+(451103, 451100, '平桂区', '平桂', '111.47971', '24.45296', 3, 0, 1),
+(451121, 451100, '昭平县', '昭平', '110.81087', '24.172958', 3, 0, 1),
+(451122, 451100, '钟山县', '钟山', '111.30363', '24.528566', 3, 0, 1),
+(451123, 451100, '富川瑶族自治县', '富川', '111.27723', '24.81896', 3, 0, 1),
+(451200, 450000, '河池市', '河池', '108.0621', '24.695898', 2, 0, 1),
+(451202, 451200, '金城江区', '金城江', '108.06213', '24.695625', 3, 0, 1),
+(451203, 451200, '宜州区', '宜州', '108.63656', '24.48513', 3, 0, 1),
+(451221, 451200, '南丹县', '南丹', '107.54661', '24.983192', 3, 0, 1),
+(451222, 451200, '天峨县', '天峨', '107.17494', '24.985964', 3, 0, 1),
+(451223, 451200, '凤山县', '凤山', '107.04459', '24.544561', 3, 0, 1),
+(451224, 451200, '东兰县', '东兰', '107.373695', '24.509367', 3, 0, 1),
+(451225, 451200, '罗城仫佬族自治县', '罗城', '108.90245', '24.779327', 3, 0, 1),
+(451226, 451200, '环江毛南族自治县', '环江', '108.25867', '24.827627', 3, 0, 1),
+(451227, 451200, '巴马瑶族自治县', '巴马', '107.25313', '24.139538', 3, 0, 1),
+(451228, 451200, '都安瑶族自治县', '都安', '108.10276', '23.934963', 3, 0, 1),
+(451229, 451200, '大化瑶族自治县', '大化', '107.9945', '23.739595', 3, 0, 1),
+(451300, 450000, '来宾市', '来宾', '109.229774', '23.733767', 2, 0, 1),
+(451302, 451300, '兴宾区', '兴宾', '109.23054', '23.732925', 3, 0, 1),
+(451321, 451300, '忻城县', '忻城', '108.66736', '24.06478', 3, 0, 1),
+(451322, 451300, '象州县', '象州', '109.684555', '23.959824', 3, 0, 1),
+(451323, 451300, '武宣县', '武宣', '109.66287', '23.604162', 3, 0, 1),
+(451324, 451300, '金秀瑶族自治县', '金秀', '110.18855', '24.134941', 3, 0, 1),
+(451381, 451300, '合山市', '合山', '108.88858', '23.81311', 3, 0, 1),
+(451400, 450000, '崇左市', '崇左', '107.35393', '22.404108', 2, 0, 1),
+(451402, 451400, '江州区', '江州', '107.35445', '22.40469', 3, 0, 1),
+(451421, 451400, '扶绥县', '扶绥', '107.91153', '22.63582', 3, 0, 1),
+(451422, 451400, '宁明县', '宁明', '107.06762', '22.131353', 3, 0, 1),
+(451423, 451400, '龙州县', '龙州', '106.857506', '22.343716', 3, 0, 1),
+(451424, 451400, '大新县', '大新', '107.200806', '22.833368', 3, 0, 1),
+(451425, 451400, '天等县', '天等', '107.14244', '23.082483', 3, 0, 1),
+(451481, 451400, '凭祥市', '凭祥', '106.75904', '22.108883', 3, 0, 1),
+(460000, 0, '海南省', '海南', '110.33119', '20.031971', 1, 0, 1),
+(460100, 460000, '海口市', '海口', '110.33119', '20.031971', 2, 0, 1),
+(460105, 460100, '秀英区', '秀英', '110.282394', '20.008144', 3, 0, 1),
+(460106, 460100, '龙华区', '龙华', '110.330376', '20.031027', 3, 0, 1),
+(460107, 460100, '琼山区', '琼山', '110.35472', '20.00105', 3, 0, 1),
+(460108, 460100, '美兰区', '美兰', '110.35657', '20.03074', 3, 0, 1),
+(460200, 460000, '三亚市', '三亚', '109.50827', '18.247871', 2, 0, 1),
+(460202, 460200, '海棠区', '海棠', '109.7525', '18.40005', 3, 0, 1),
+(460203, 460200, '吉阳区', '吉阳', '109.57841', '18.28225', 3, 0, 1),
+(460204, 460200, '天涯区', '天涯', '109.45263', '18.29921', 3, 0, 1),
+(460205, 460200, '崖州区', '崖州', '109.17186', '18.35753', 3, 0, 1),
+(460300, 460000, '三沙市', '三沙', '112.34882', '16.83104', 2, 0, 1),
+(460321, 460300, '西沙群岛', '西沙群岛', '112.338695', '16.831839', 3, 0, 1),
+(460322, 460300, '南沙群岛', '南沙群岛', '112.338695', '16.831839', 3, 0, 1),
+(460323, 460300, '中沙群岛的岛礁及其海域', '中沙群岛的岛礁及其海域', '112.338695', '16.831839', 3, 0, 1),
+(460400, 460000, '儋州市', '儋州', '109.58069', '19.52093', 2, 0, 1),
+(469001, 469000, '五指山市', '五指山', '109.51666', '18.77692', 3, 0, 1),
+(469002, 469000, '琼海市', '琼海', '110.46678', '19.246012', 3, 0, 1),
+(469005, 469000, '文昌市', '文昌', '110.753975', '19.612986', 3, 0, 1),
+(469006, 469000, '万宁市', '万宁', '110.388794', '18.796215', 3, 0, 1),
+(469007, 469000, '东方市', '东方', '108.653786', '19.10198', 3, 0, 1),
+(469021, 469000, '定安县', '定安', '110.3593', '19.68121', 3, 0, 1),
+(469022, 469000, '屯昌县', '屯昌', '110.10347', '19.35182', 3, 0, 1),
+(469023, 469000, '澄迈县', '澄迈', '110.00487', '19.73849', 3, 0, 1),
+(469024, 469000, '临高县', '临高', '109.69077', '19.91243', 3, 0, 1),
+(469025, 469000, '白沙黎族自治县', '定安', '110.349236', '19.684965', 3, 0, 1),
+(469026, 469000, '昌江黎族自治县', '屯昌', '110.102776', '19.362917', 3, 0, 1),
+(469027, 469000, '乐东黎族自治县', '澄迈', '110.00715', '19.737095', 3, 0, 1),
+(469028, 469000, '陵水黎族自治县', '临高', '109.6877', '19.908293', 3, 0, 1),
+(469029, 469000, '保亭黎族苗族自治县', '保亭黎族苗族自治县', '109.70259', '18.63905', 3, 0, 1),
+(469030, 469000, '琼中黎族苗族自治县', '白沙', '109.45261', '19.224585', 3, 0, 1),
+(500000, 0, '重庆市', '重庆', '106.50496', '29.533155', 1, 0, 1),
+(500100, 500000, '重庆市', '重庆', '106.50496', '29.533155', 2, 0, 1),
+(500101, 500100, '万州区', '万州', '108.38025', '30.807808', 3, 0, 1),
+(500102, 500100, '涪陵区', '涪陵', '107.394905', '29.703651', 3, 0, 1),
+(500103, 500100, '渝中区', '渝中', '106.56288', '29.556742', 3, 0, 1),
+(500104, 500100, '大渡口区', '大渡口', '106.48613', '29.481003', 3, 0, 1),
+(500105, 500100, '江北区', '江北', '106.532845', '29.575352', 3, 0, 1),
+(500106, 500100, '沙坪坝区', '沙坪坝', '106.4542', '29.541224', 3, 0, 1),
+(500107, 500100, '九龙坡区', '九龙坡', '106.48099', '29.523493', 3, 0, 1),
+(500108, 500100, '南岸区', '南岸', '106.560814', '29.523993', 3, 0, 1),
+(500109, 500100, '北碚区', '北碚', '106.43787', '29.82543', 3, 0, 1),
+(500110, 500100, '綦江区', '綦江', '106.92852', '28.96463', 3, 0, 1),
+(500111, 500100, '大足区', '大足', '105.78017', '29.48604', 3, 0, 1),
+(500112, 500100, '渝北区', '渝北', '106.51285', '29.601452', 3, 0, 1),
+(500113, 500100, '巴南区', '巴南', '106.519424', '29.38192', 3, 0, 1),
+(500114, 500100, '黔江区', '黔江', '108.78258', '29.527548', 3, 0, 1),
+(500115, 500100, '长寿区', '长寿', '107.07485', '29.833672', 3, 0, 1),
+(500116, 500100, '江津区', '江津', '106.25936', '29.29014', 3, 0, 1),
+(500117, 500100, '合川区', '合川', '106.27679', '29.97288', 3, 0, 1),
+(500118, 500100, '永川区', '永川', '105.92709', '29.356', 3, 0, 1),
+(500119, 500100, '南川区', '南川', '107.09896', '29.15788', 3, 0, 1),
+(500120, 500100, '璧山区', '璧山', '106.22742', '29.59202', 3, 0, 1),
+(500151, 500100, '铜梁区', '铜梁', '106.05638', '29.84475', 3, 0, 1),
+(500152, 500100, '潼南区', '潼南', '105.83952', '30.19054', 3, 0, 1),
+(500153, 500100, '荣昌区', '荣昌', '105.61188', '29.41671', 3, 0, 1),
+(500154, 500100, '开州区', '开州', '108.39311', '31.16098', 3, 0, 1),
+(500155, 500100, '梁平区', '梁平', '107.80235', '30.67373', 3, 0, 1),
+(500156, 500100, '武隆区', '武隆', '107.75993', '29.32543', 3, 0, 1),
+(500229, 500100, '城口县', '城口', '108.6649', '31.946293', 3, 0, 1),
+(500230, 500100, '丰都县', '丰都', '107.73248', '29.866425', 3, 0, 1),
+(500231, 500100, '垫江县', '垫江', '107.348694', '30.330011', 3, 0, 1),
+(500233, 500100, '忠县', '忠县', '108.03752', '30.291536', 3, 0, 1),
+(500235, 500100, '云阳县', '云阳', '108.6977', '30.930529', 3, 0, 1),
+(500236, 500100, '奉节县', '奉节', '109.465775', '31.019966', 3, 0, 1),
+(500237, 500100, '巫山县', '巫山', '109.87893', '31.074842', 3, 0, 1),
+(500238, 500100, '巫溪县', '巫溪', '109.628914', '31.3966', 3, 0, 1),
+(500240, 500100, '石柱土家族自治县', '石柱', '108.11245', '29.99853', 3, 0, 1),
+(500241, 500100, '秀山土家族苗族自治县', '秀山', '108.99604', '28.444773', 3, 0, 1),
+(500242, 500100, '酉阳土家族苗族自治县', '酉阳', '108.767204', '28.839828', 3, 0, 1),
+(500243, 500100, '彭水苗族土家族自治县', '彭水', '108.16655', '29.293856', 3, 0, 1),
+(510000, 0, '四川省', '四川', '104.065735', '30.659462', 1, 0, 1),
+(510100, 510000, '成都市', '成都', '104.065735', '30.659462', 2, 0, 1),
+(510104, 510100, '锦江区', '锦江', '104.080986', '30.657688', 3, 0, 1),
+(510105, 510100, '青羊区', '青羊', '104.05573', '30.667648', 3, 0, 1),
+(510106, 510100, '金牛区', '金牛', '104.04349', '30.692059', 3, 0, 1),
+(510107, 510100, '武侯区', '武侯', '104.05167', '30.630861', 3, 0, 1),
+(510108, 510100, '成华区', '成华', '104.10308', '30.660275', 3, 0, 1),
+(510112, 510100, '龙泉驿区', '龙泉驿', '104.26918', '30.56065', 3, 0, 1),
+(510113, 510100, '青白江区', '青白江', '104.25494', '30.883438', 3, 0, 1),
+(510114, 510100, '新都区', '新都', '104.16022', '30.824223', 3, 0, 1),
+(510115, 510100, '温江区', '温江', '103.83678', '30.697996', 3, 0, 1),
+(510116, 510100, '双流区', '双流', '103.92377', '30.57447', 3, 0, 1),
+(510117, 510100, '郫都区', '郫都', '103.90256', '30.79589', 3, 0, 1),
+(510118, 510100, '新津区', '新津', '', '', 3, 0, 1),
+(510121, 510100, '金堂县', '金堂', '104.4156', '30.858418', 3, 0, 1),
+(510129, 510100, '大邑县', '大邑', '103.5224', '30.586601', 3, 0, 1),
+(510131, 510100, '蒲江县', '蒲江', '103.51154', '30.194359', 3, 0, 1),
+(510181, 510100, '都江堰市', '都江堰', '103.6279', '30.99114', 3, 0, 1),
+(510182, 510100, '彭州市', '彭州', '103.94117', '30.98516', 3, 0, 1),
+(510183, 510100, '邛崃市', '邛崃', '103.46143', '30.41327', 3, 0, 1),
+(510184, 510100, '崇州市', '崇州', '103.67105', '30.631477', 3, 0, 1),
+(510185, 510100, '简阳市', '简阳', '104.54733', '30.41133', 3, 0, 1),
+(510300, 510000, '自贡市', '自贡', '104.773445', '29.352764', 2, 0, 1),
+(510302, 510300, '自流井区', '自流井', '104.77819', '29.343231', 3, 0, 1),
+(510303, 510300, '贡井区', '贡井', '104.71437', '29.345675', 3, 0, 1),
+(510304, 510300, '大安区', '大安', '104.783226', '29.367136', 3, 0, 1),
+(510311, 510300, '沿滩区', '沿滩', '104.87642', '29.27252', 3, 0, 1),
+(510321, 510300, '荣县', '荣县', '104.423935', '29.454851', 3, 0, 1),
+(510322, 510300, '富顺县', '富顺', '104.98425', '29.181282', 3, 0, 1),
+(510400, 510000, '攀枝花市', '攀枝花', '101.716', '26.580446', 2, 0, 1),
+(510402, 510400, '东区', '东区', '101.71513', '26.580887', 3, 0, 1),
+(510403, 510400, '西区', '西区', '101.63797', '26.596775', 3, 0, 1),
+(510411, 510400, '仁和区', '仁和', '101.737915', '26.497185', 3, 0, 1),
+(510421, 510400, '米易县', '米易', '102.10988', '26.887474', 3, 0, 1),
+(510422, 510400, '盐边县', '盐边', '101.851845', '26.67762', 3, 0, 1),
+(510500, 510000, '泸州市', '泸州', '105.44335', '28.889137', 2, 0, 1),
+(510502, 510500, '江阳区', '江阳', '105.44513', '28.882889', 3, 0, 1),
+(510503, 510500, '纳溪区', '纳溪', '105.37721', '28.77631', 3, 0, 1),
+(510504, 510500, '龙马潭区', '龙马潭', '105.43523', '28.897572', 3, 0, 1),
+(510521, 510500, '泸县', '泸县', '105.376335', '29.151287', 3, 0, 1),
+(510522, 510500, '合江县', '合江', '105.8341', '28.810326', 3, 0, 1),
+(510524, 510500, '叙永县', '叙永', '105.437775', '28.16792', 3, 0, 1),
+(510525, 510500, '古蔺县', '古蔺', '105.81336', '28.03948', 3, 0, 1),
+(510600, 510000, '德阳市', '德阳', '104.39865', '31.12799', 2, 0, 1),
+(510603, 510600, '旌阳区', '旌阳', '104.38965', '31.130428', 3, 0, 1),
+(510604, 510600, '罗江区', '罗江', '104.51021', '31.31681', 3, 0, 1),
+(510623, 510600, '中江县', '中江', '104.67783', '31.03681', 3, 0, 1),
+(510681, 510600, '广汉市', '广汉', '104.281906', '30.97715', 3, 0, 1),
+(510682, 510600, '什邡市', '什邡', '104.17365', '31.12688', 3, 0, 1),
+(510683, 510600, '绵竹市', '绵竹', '104.200165', '31.343084', 3, 0, 1),
+(510700, 510000, '绵阳市', '绵阳', '104.74172', '31.46402', 2, 0, 1),
+(510703, 510700, '涪城区', '涪城', '104.740974', '31.463556', 3, 0, 1),
+(510704, 510700, '游仙区', '游仙', '104.770004', '31.484772', 3, 0, 1),
+(510705, 510700, '安州区', '安州', '104.56735', '31.53465', 3, 0, 1),
+(510722, 510700, '三台县', '三台', '105.09032', '31.090908', 3, 0, 1),
+(510723, 510700, '盐亭县', '盐亭', '105.39199', '31.22318', 3, 0, 1),
+(510725, 510700, '梓潼县', '梓潼', '105.16353', '31.635225', 3, 0, 1),
+(510726, 510700, '北川羌族自治县', '北川', '104.46807', '31.615864', 3, 0, 1),
+(510727, 510700, '平武县', '平武', '104.530556', '32.40759', 3, 0, 1),
+(510781, 510700, '江油市', '江油', '104.74443', '31.776386', 3, 0, 1),
+(510800, 510000, '广元市', '广元', '105.82976', '32.433666', 2, 0, 1),
+(510802, 510800, '利州区', '利州', '105.826195', '32.432278', 3, 0, 1),
+(510811, 510800, '昭化区', '昭化', '105.96412', '32.32279', 3, 0, 1),
+(510812, 510800, '朝天区', '朝天', '105.88917', '32.64263', 3, 0, 1),
+(510821, 510800, '旺苍县', '旺苍', '106.29043', '32.22833', 3, 0, 1),
+(510822, 510800, '青川县', '青川', '105.238846', '32.585655', 3, 0, 1),
+(510823, 510800, '剑阁县', '剑阁', '105.52704', '32.28652', 3, 0, 1),
+(510824, 510800, '苍溪县', '苍溪', '105.939705', '31.73225', 3, 0, 1),
+(510900, 510000, '遂宁市', '遂宁', '105.57133', '30.513311', 2, 0, 1),
+(510903, 510900, '船山区', '船山', '105.582214', '30.502647', 3, 0, 1),
+(510904, 510900, '安居区', '安居', '105.45938', '30.34612', 3, 0, 1),
+(510921, 510900, '蓬溪县', '蓬溪', '105.7137', '30.774883', 3, 0, 1),
+(510923, 510900, '大英县', '大英', '105.25219', '30.581572', 3, 0, 1),
+(510981, 510900, '射洪市', '射洪', '105.38836', '30.87113', 3, 0, 1),
+(511000, 510000, '内江市', '内江', '105.06614', '29.58708', 2, 0, 1),
+(511002, 511000, '市中区', '市中', '105.06547', '29.585264', 3, 0, 1),
+(511011, 511000, '东兴区', '东兴', '105.0672', '29.600107', 3, 0, 1),
+(511024, 511000, '威远县', '威远', '104.66833', '29.52686', 3, 0, 1),
+(511025, 511000, '资中县', '资中', '104.85246', '29.775295', 3, 0, 1),
+(511083, 511000, '隆昌市', '隆昌', '105.28773', '29.33948', 3, 0, 1),
+(511100, 510000, '乐山市', '乐山', '103.76126', '29.582024', 2, 0, 1),
+(511102, 511100, '市中区', '市中', '103.75539', '29.588327', 3, 0, 1),
+(511111, 511100, '沙湾区', '沙湾', '103.54996', '29.416536', 3, 0, 1),
+(511112, 511100, '五通桥区', '五通桥', '103.81683', '29.406185', 3, 0, 1),
+(511113, 511100, '金口河区', '金口河', '103.07783', '29.24602', 3, 0, 1),
+(511123, 511100, '犍为县', '犍为', '103.94427', '29.209782', 3, 0, 1),
+(511124, 511100, '井研县', '井研', '104.06885', '29.651646', 3, 0, 1),
+(511126, 511100, '夹江县', '夹江', '103.578865', '29.741018', 3, 0, 1),
+(511129, 511100, '沐川县', '沐川', '103.90211', '28.956339', 3, 0, 1),
+(511132, 511100, '峨边彝族自治县', '峨边', '103.262146', '29.23027', 3, 0, 1),
+(511133, 511100, '马边彝族自治县', '马边', '103.54685', '28.838934', 3, 0, 1),
+(511181, 511100, '峨眉山市', '峨眉山', '103.492485', '29.597479', 3, 0, 1),
+(511300, 510000, '南充市', '南充', '106.08298', '30.79528', 2, 0, 1),
+(511302, 511300, '顺庆区', '顺庆', '106.08409', '30.795572', 3, 0, 1),
+(511303, 511300, '高坪区', '高坪', '106.10899', '30.781809', 3, 0, 1),
+(511304, 511300, '嘉陵区', '嘉陵', '106.067024', '30.762976', 3, 0, 1),
+(511321, 511300, '南部县', '南部', '106.061134', '31.349407', 3, 0, 1),
+(511322, 511300, '营山县', '营山', '106.564896', '31.075907', 3, 0, 1),
+(511323, 511300, '蓬安县', '蓬安', '106.41349', '31.027979', 3, 0, 1),
+(511324, 511300, '仪陇县', '仪陇', '106.29708', '31.271261', 3, 0, 1),
+(511325, 511300, '西充县', '西充', '105.89302', '30.994616', 3, 0, 1),
+(511381, 511300, '阆中市', '阆中', '105.975266', '31.580465', 3, 0, 1),
+(511400, 510000, '眉山市', '眉山', '103.83179', '30.048319', 2, 0, 1),
+(511402, 511400, '东坡区', '东坡', '103.83155', '30.048128', 3, 0, 1),
+(511403, 511400, '彭山区', '彭山', '103.87283', '30.19299', 3, 0, 1),
+(511421, 511400, '仁寿县', '仁寿', '104.147644', '29.996721', 3, 0, 1),
+(511423, 511400, '洪雅县', '洪雅', '103.37501', '29.904867', 3, 0, 1),
+(511424, 511400, '丹棱县', '丹棱', '103.51833', '30.01275', 3, 0, 1),
+(511425, 511400, '青神县', '青神', '103.84613', '29.831469', 3, 0, 1),
+(511500, 510000, '宜宾市', '宜宾', '104.63082', '28.76019', 2, 0, 1),
+(511502, 511500, '翠屏区', '翠屏', '104.63023', '28.76018', 3, 0, 1),
+(511503, 511500, '南溪区', '南溪', '104.96953', '28.84548', 3, 0, 1),
+(511504, 511500, '叙州区', '叙州', '104.53316', '28.68998', 3, 0, 1),
+(511523, 511500, '江安县', '江安', '105.068695', '28.728102', 3, 0, 1),
+(511524, 511500, '长宁县', '长宁', '104.92112', '28.57727', 3, 0, 1),
+(511525, 511500, '高县', '高县', '104.51919', '28.435677', 3, 0, 1),
+(511526, 511500, '珙县', '珙县', '104.712265', '28.449041', 3, 0, 1),
+(511527, 511500, '筠连县', '筠连', '104.50785', '28.162018', 3, 0, 1),
+(511528, 511500, '兴文县', '兴文', '105.23655', '28.302988', 3, 0, 1),
+(511529, 511500, '屏山县', '屏山', '104.16262', '28.64237', 3, 0, 1),
+(511600, 510000, '广安市', '广安', '106.63337', '30.456398', 2, 0, 1),
+(511602, 511600, '广安区', '广安', '106.632904', '30.456463', 3, 0, 1),
+(511603, 511600, '前锋区', '前锋', '106.89328', '30.4963', 3, 0, 1),
+(511621, 511600, '岳池县', '岳池', '106.44445', '30.533539', 3, 0, 1),
+(511622, 511600, '武胜县', '武胜', '106.29247', '30.344292', 3, 0, 1),
+(511623, 511600, '邻水县', '邻水', '106.93497', '30.334324', 3, 0, 1),
+(511681, 511600, '华蓥市', '华蓥', '106.777885', '30.380573', 3, 0, 1),
+(511700, 510000, '达州市', '达州', '107.50226', '31.209484', 2, 0, 1),
+(511702, 511700, '通川区', '通川', '107.50106', '31.213522', 3, 0, 1),
+(511703, 511700, '达川区', '达川', '107.51177', '31.19603', 3, 0, 1),
+(511722, 511700, '宣汉县', '宣汉', '107.72225', '31.355024', 3, 0, 1),
+(511723, 511700, '开江县', '开江', '107.864136', '31.085537', 3, 0, 1),
+(511724, 511700, '大竹县', '大竹', '107.20742', '30.736288', 3, 0, 1),
+(511725, 511700, '渠县', '渠县', '106.97075', '30.836348', 3, 0, 1),
+(511781, 511700, '万源市', '万源', '108.037544', '32.06777', 3, 0, 1),
+(511800, 510000, '雅安市', '雅安', '103.00103', '29.987722', 2, 0, 1),
+(511802, 511800, '雨城区', '雨城', '103.003395', '29.98183', 3, 0, 1),
+(511803, 511800, '名山区', '名山', '103.10954', '30.06982', 3, 0, 1),
+(511822, 511800, '荥经县', '荥经', '102.84467', '29.795528', 3, 0, 1),
+(511823, 511800, '汉源县', '汉源', '102.67715', '29.349915', 3, 0, 1),
+(511824, 511800, '石棉县', '石棉', '102.35962', '29.234062', 3, 0, 1),
+(511825, 511800, '天全县', '天全', '102.76346', '30.059956', 3, 0, 1),
+(511826, 511800, '芦山县', '芦山', '102.92402', '30.152906', 3, 0, 1),
+(511827, 511800, '宝兴县', '宝兴', '102.81338', '30.369026', 3, 0, 1),
+(511900, 510000, '巴中市', '巴中', '106.75367', '31.858809', 2, 0, 1),
+(511902, 511900, '巴州区', '巴州', '106.75367', '31.858366', 3, 0, 1),
+(511903, 511900, '恩阳区', '恩阳', '106.63608', '31.789442', 3, 0, 1),
+(511921, 511900, '通江县', '通江', '107.24762', '31.91212', 3, 0, 1),
+(511922, 511900, '南江县', '南江', '106.843414', '32.353165', 3, 0, 1),
+(511923, 511900, '平昌县', '平昌', '107.10194', '31.562815', 3, 0, 1),
+(512000, 510000, '资阳市', '资阳', '104.641914', '30.122211', 2, 0, 1),
+(512002, 512000, '雁江区', '雁江', '104.64234', '30.121687', 3, 0, 1),
+(512021, 512000, '安岳县', '安岳', '105.33676', '30.099207', 3, 0, 1),
+(512022, 512000, '乐至县', '乐至', '105.03114', '30.27562', 3, 0, 1),
+(513200, 510000, '阿坝藏族羌族自治州', '阿坝', '102.221375', '31.899792', 2, 0, 1),
+(513201, 513200, '马尔康市', '马尔康', '102.20644', '31.90585', 3, 0, 1),
+(513221, 513200, '汶川县', '汶川', '103.58067', '31.47463', 3, 0, 1),
+(513222, 513200, '理县', '理县', '103.16549', '31.436764', 3, 0, 1),
+(513223, 513200, '茂县', '茂县', '103.850685', '31.680407', 3, 0, 1),
+(513224, 513200, '松潘县', '松潘', '103.599174', '32.63838', 3, 0, 1),
+(513225, 513200, '九寨沟县', '九寨沟', '104.23634', '33.262096', 3, 0, 1),
+(513226, 513200, '金川县', '金川', '102.064644', '31.476357', 3, 0, 1),
+(513227, 513200, '小金县', '小金', '102.36319', '30.999016', 3, 0, 1),
+(513228, 513200, '黑水县', '黑水', '102.99081', '32.06172', 3, 0, 1),
+(513230, 513200, '壤塘县', '壤塘', '100.97913', '32.26489', 3, 0, 1),
+(513231, 513200, '阿坝县', '阿坝', '101.70099', '32.904224', 3, 0, 1),
+(513232, 513200, '若尔盖县', '若尔盖', '102.96372', '33.575935', 3, 0, 1),
+(513233, 513200, '红原县', '红原', '102.54491', '32.793903', 3, 0, 1),
+(513300, 510000, '甘孜藏族自治州', '甘孜', '101.96381', '30.050663', 2, 0, 1),
+(513301, 513300, '康定市', '康定', '101.96308', '30.05441', 3, 0, 1),
+(513322, 513300, '泸定县', '泸定', '102.23322', '29.912481', 3, 0, 1),
+(513323, 513300, '丹巴县', '丹巴', '101.88612', '30.877083', 3, 0, 1),
+(513324, 513300, '九龙县', '九龙', '101.50694', '29.001974', 3, 0, 1),
+(513325, 513300, '雅江县', '雅江', '101.01573', '30.03225', 3, 0, 1),
+(513326, 513300, '道孚县', '道孚', '101.12333', '30.978767', 3, 0, 1),
+(513327, 513300, '炉霍县', '炉霍', '100.6795', '31.392673', 3, 0, 1),
+(513328, 513300, '甘孜县', '甘孜', '99.99175', '31.61975', 3, 0, 1),
+(513329, 513300, '新龙县', '新龙', '100.312096', '30.93896', 3, 0, 1),
+(513330, 513300, '德格县', '德格', '98.57999', '31.806728', 3, 0, 1),
+(513331, 513300, '白玉县', '白玉', '98.82434', '31.208805', 3, 0, 1),
+(513332, 513300, '石渠县', '石渠', '98.10088', '32.975304', 3, 0, 1),
+(513333, 513300, '色达县', '色达', '100.33166', '32.268776', 3, 0, 1),
+(513334, 513300, '理塘县', '理塘', '100.26986', '29.991808', 3, 0, 1),
+(513335, 513300, '巴塘县', '巴塘', '99.10904', '30.005724', 3, 0, 1),
+(513336, 513300, '乡城县', '乡城', '99.79994', '28.930855', 3, 0, 1),
+(513337, 513300, '稻城县', '稻城', '100.29669', '29.037544', 3, 0, 1),
+(513338, 513300, '得荣县', '得荣', '99.28803', '28.71134', 3, 0, 1),
+(513400, 510000, '凉山彝族自治州', '凉山', '102.25874', '27.886763', 2, 0, 1),
+(513401, 513400, '西昌市', '西昌', '102.25876', '27.885786', 3, 0, 1),
+(513422, 513400, '木里藏族自治县', '木里', '101.28018', '27.926859', 3, 0, 1),
+(513423, 513400, '盐源县', '盐源', '101.50891', '27.423414', 3, 0, 1),
+(513424, 513400, '德昌县', '德昌', '102.17885', '27.403828', 3, 0, 1),
+(513425, 513400, '会理县', '会理', '102.24955', '26.658703', 3, 0, 1),
+(513426, 513400, '会东县', '会东', '102.57899', '26.630713', 3, 0, 1),
+(513427, 513400, '宁南县', '宁南', '102.75738', '27.065205', 3, 0, 1),
+(513428, 513400, '普格县', '普格', '102.541084', '27.376827', 3, 0, 1),
+(513429, 513400, '布拖县', '布拖', '102.8088', '27.709063', 3, 0, 1),
+(513430, 513400, '金阳县', '金阳', '103.2487', '27.695915', 3, 0, 1),
+(513431, 513400, '昭觉县', '昭觉', '102.843994', '28.010553', 3, 0, 1),
+(513432, 513400, '喜德县', '喜德', '102.41234', '28.305487', 3, 0, 1),
+(513433, 513400, '冕宁县', '冕宁', '102.170044', '28.550844', 3, 0, 1),
+(513434, 513400, '越西县', '越西', '102.50887', '28.639631', 3, 0, 1),
+(513435, 513400, '甘洛县', '甘洛', '102.775925', '28.977095', 3, 0, 1),
+(513436, 513400, '美姑县', '美姑', '103.132', '28.327946', 3, 0, 1),
+(513437, 513400, '雷波县', '雷波', '103.57159', '28.262945', 3, 0, 1),
+(520000, 0, '贵州省', '贵州', '106.71348', '26.578342', 1, 0, 1),
+(520100, 520000, '贵阳市', '贵阳', '106.71348', '26.578342', 2, 0, 1),
+(520102, 520100, '南明区', '南明', '106.715965', '26.573744', 3, 0, 1),
+(520103, 520100, '云岩区', '云岩', '106.713394', '26.58301', 3, 0, 1),
+(520111, 520100, '花溪区', '花溪', '106.67079', '26.410463', 3, 0, 1),
+(520112, 520100, '乌当区', '乌当', '106.76212', '26.630928', 3, 0, 1),
+(520113, 520100, '白云区', '白云', '106.63303', '26.67685', 3, 0, 1),
+(520115, 520100, '观山湖区', '观山湖', '106.62254', '26.6015', 3, 0, 1),
+(520121, 520100, '开阳县', '开阳', '106.96944', '27.056793', 3, 0, 1),
+(520122, 520100, '息烽县', '息烽', '106.73769', '27.092665', 3, 0, 1),
+(520123, 520100, '修文县', '修文', '106.59922', '26.840672', 3, 0, 1),
+(520181, 520100, '清镇市', '清镇', '106.470276', '26.551289', 3, 0, 1),
+(520200, 520000, '六盘水市', '六盘水', '104.84674', '26.584642', 2, 0, 1),
+(520201, 520200, '钟山区', '钟山', '104.846245', '26.584805', 3, 0, 1),
+(520203, 520200, '六枝特区', '六枝特', '105.474236', '26.210663', 3, 0, 1),
+(520221, 520200, '水城县', '水城', '104.95685', '26.540478', 3, 0, 1),
+(520281, 520200, '盘州市', '盘州', '104.47158', '25.70993', 3, 0, 1),
+(520300, 520000, '遵义市', '遵义', '106.93726', '27.706627', 2, 0, 1),
+(520302, 520300, '红花岗区', '红花岗', '106.94379', '27.694395', 3, 0, 1),
+(520303, 520300, '汇川区', '汇川', '106.93726', '27.706627', 3, 0, 1),
+(520304, 520300, '播州区', '播州', '106.82922', '27.53625', 3, 0, 1),
+(520322, 520300, '桐梓县', '桐梓', '106.82659', '28.13156', 3, 0, 1),
+(520323, 520300, '绥阳县', '绥阳', '107.191025', '27.951342', 3, 0, 1),
+(520324, 520300, '正安县', '正安', '107.44187', '28.550337', 3, 0, 1),
+(520325, 520300, '道真仡佬族苗族自治县', '道真', '107.60534', '28.880089', 3, 0, 1),
+(520326, 520300, '务川仡佬族苗族自治县', '务川', '107.887856', '28.521566', 3, 0, 1),
+(520327, 520300, '凤冈县', '凤冈', '107.72202', '27.960857', 3, 0, 1),
+(520328, 520300, '湄潭县', '湄潭', '107.485725', '27.765839', 3, 0, 1),
+(520329, 520300, '余庆县', '余庆', '107.89256', '27.221552', 3, 0, 1),
+(520330, 520300, '习水县', '习水', '106.20095', '28.327826', 3, 0, 1),
+(520381, 520300, '赤水市', '赤水', '105.69811', '28.587057', 3, 0, 1),
+(520382, 520300, '仁怀市', '仁怀', '106.412476', '27.803377', 3, 0, 1),
+(520400, 520000, '安顺市', '安顺', '105.93219', '26.245544', 2, 0, 1),
+(520402, 520400, '西秀区', '西秀', '105.94617', '26.248323', 3, 0, 1),
+(520403, 520400, '平坝区', '平坝', '106.2553', '26.40574', 3, 0, 1),
+(520422, 520400, '普定县', '普定', '105.745605', '26.305794', 3, 0, 1),
+(520423, 520400, '镇宁布依族苗族自治县', '镇宁', '105.768654', '26.056095', 3, 0, 1),
+(520424, 520400, '关岭布依族苗族自治县', '关岭', '105.618454', '25.944248', 3, 0, 1),
+(520425, 520400, '紫云苗族布依族自治县', '紫云', '106.08452', '25.751568', 3, 0, 1),
+(520500, 520000, '毕节市', '毕节', '', '', 2, 0, 1),
+(520502, 520500, '七星关区', '七星关', '105.30504', '27.29847', 3, 0, 1),
+(520521, 520500, '大方县', '大方', '105.613', '27.14161', 3, 0, 1),
+(520522, 520500, '黔西县', '黔西', '106.0323', '27.00866', 3, 0, 1),
+(520523, 520500, '金沙县', '金沙', '106.22014', '27.45922', 3, 0, 1),
+(520524, 520500, '织金县', '织金', '105.77488', '26.66301', 3, 0, 1),
+(520525, 520500, '纳雍县', '纳雍', '105.38269', '26.7777', 3, 0, 1),
+(520526, 520500, '威宁彝族回族苗族自治县', '威宁彝族回族苗族自治县', '104.27872', '26.85641', 3, 0, 1),
+(520527, 520500, '赫章县', '赫章', '104.7274', '27.12328', 3, 0, 1),
+(520600, 520000, '铜仁市', '铜仁', '', '', 2, 0, 1),
+(520602, 520600, '碧江区', '碧江', '109.26433', '27.81621', 3, 0, 1),
+(520603, 520600, '万山区', '万山', '109.21369', '27.51796', 3, 0, 1),
+(520621, 520600, '江口县', '江口', '108.83967', '27.69956', 3, 0, 1),
+(520622, 520600, '玉屏侗族自治县', '玉屏侗族自治县', '108.91212', '27.23637', 3, 0, 1),
+(520623, 520600, '石阡县', '石阡', '108.2233', '27.51382', 3, 0, 1),
+(520624, 520600, '思南县', '思南', '108.2528', '27.93886', 3, 0, 1),
+(520625, 520600, '印江土家族苗族自治县', '印江土家族苗族自治县', '108.40958', '27.9941', 3, 0, 1),
+(520626, 520600, '德江县', '德江', '108.11987', '28.26408', 3, 0, 1),
+(520627, 520600, '沿河土家族自治县', '沿河土家族自治县', '108.50301', '28.56397', 3, 0, 1),
+(520628, 520600, '松桃苗族自治县', '松桃苗族自治县', '109.20316', '28.15414', 3, 0, 1),
+(522300, 520000, '黔西南布依族苗族自治州', '黔西南', '104.89797', '25.08812', 2, 0, 1),
+(522301, 522300, '兴义市', '兴义', '104.89798', '25.088598', 3, 0, 1),
+(522302, 522300, '兴仁市', '兴仁', '105.18639', '25.43511', 3, 0, 1),
+(522323, 522300, '普安县', '普安', '104.955345', '25.786404', 3, 0, 1),
+(522324, 522300, '晴隆县', '晴隆', '105.21877', '25.832882', 3, 0, 1),
+(522325, 522300, '贞丰县', '贞丰', '105.65013', '25.385752', 3, 0, 1),
+(522326, 522300, '望谟县', '望谟', '106.09156', '25.166668', 3, 0, 1),
+(522327, 522300, '册亨县', '册亨', '105.81241', '24.983337', 3, 0, 1),
+(522328, 522300, '安龙县', '安龙', '105.4715', '25.10896', 3, 0, 1),
+(522600, 520000, '黔东南苗族侗族自治州', '黔东南', '107.977486', '26.583351', 2, 0, 1),
+(522601, 522600, '凯里市', '凯里', '107.97754', '26.582964', 3, 0, 1),
+(522622, 522600, '黄平县', '黄平', '107.90134', '26.896973', 3, 0, 1),
+(522623, 522600, '施秉县', '施秉', '108.12678', '27.034657', 3, 0, 1),
+(522624, 522600, '三穗县', '三穗', '108.68112', '26.959885', 3, 0, 1),
+(522625, 522600, '镇远县', '镇远', '108.42365', '27.050234', 3, 0, 1),
+(522626, 522600, '岑巩县', '岑巩', '108.81646', '27.173244', 3, 0, 1),
+(522627, 522600, '天柱县', '天柱', '109.2128', '26.909683', 3, 0, 1),
+(522628, 522600, '锦屏县', '锦屏', '109.20252', '26.680626', 3, 0, 1),
+(522629, 522600, '剑河县', '剑河', '108.4405', '26.727348', 3, 0, 1),
+(522630, 522600, '台江县', '台江', '108.31464', '26.669138', 3, 0, 1),
+(522631, 522600, '黎平县', '黎平', '109.136505', '26.230637', 3, 0, 1),
+(522632, 522600, '榕江县', '榕江', '108.52103', '25.931086', 3, 0, 1),
+(522633, 522600, '从江县', '从江', '108.91265', '25.747059', 3, 0, 1),
+(522634, 522600, '雷山县', '雷山', '108.07961', '26.381027', 3, 0, 1),
+(522635, 522600, '麻江县', '麻江', '107.59317', '26.494802', 3, 0, 1),
+(522636, 522600, '丹寨县', '丹寨', '107.79481', '26.199497', 3, 0, 1),
+(522700, 520000, '黔南布依族苗族自治州', '黔南', '107.51716', '26.258219', 2, 0, 1),
+(522701, 522700, '都匀市', '都匀', '107.51702', '26.258205', 3, 0, 1),
+(522702, 522700, '福泉市', '福泉', '107.51351', '26.702509', 3, 0, 1),
+(522722, 522700, '荔波县', '荔波', '107.8838', '25.41224', 3, 0, 1),
+(522723, 522700, '贵定县', '贵定', '107.23359', '26.580807', 3, 0, 1),
+(522725, 522700, '瓮安县', '瓮安', '107.47842', '27.06634', 3, 0, 1),
+(522726, 522700, '独山县', '独山', '107.542755', '25.826283', 3, 0, 1),
+(522727, 522700, '平塘县', '平塘', '107.32405', '25.831802', 3, 0, 1),
+(522728, 522700, '罗甸县', '罗甸', '106.75001', '25.429893', 3, 0, 1),
+(522729, 522700, '长顺县', '长顺', '106.44737', '26.022116', 3, 0, 1),
+(522730, 522700, '龙里县', '龙里', '106.97773', '26.448809', 3, 0, 1),
+(522731, 522700, '惠水县', '惠水', '106.657845', '26.128637', 3, 0, 1),
+(522732, 522700, '三都水族自治县', '三都', '107.87747', '25.985184', 3, 0, 1),
+(530000, 0, '云南省', '云南', '102.71225', '25.04061', 1, 0, 1),
+(530100, 530000, '昆明市', '昆明', '102.71225', '25.04061', 2, 0, 1),
+(530102, 530100, '五华区', '五华', '102.704414', '25.042166', 3, 0, 1),
+(530103, 530100, '盘龙区', '盘龙', '102.72904', '25.070238', 3, 0, 1),
+(530111, 530100, '官渡区', '官渡', '102.723434', '25.021212', 3, 0, 1),
+(530112, 530100, '西山区', '西山', '102.7059', '25.02436', 3, 0, 1),
+(530113, 530100, '东川区', '东川', '103.182', '26.08349', 3, 0, 1),
+(530114, 530100, '呈贡区', '呈贡', '102.82147', '24.88554', 3, 0, 1),
+(530115, 530100, '晋宁区', '晋宁', '102.59559', '24.66982', 3, 0, 1),
+(530124, 530100, '富民县', '富民', '102.49789', '25.219667', 3, 0, 1),
+(530125, 530100, '宜良县', '宜良', '103.14599', '24.918215', 3, 0, 1),
+(530126, 530100, '石林彝族自治县', '石林', '103.271965', '24.754545', 3, 0, 1),
+(530127, 530100, '嵩明县', '嵩明', '103.03878', '25.335087', 3, 0, 1),
+(530128, 530100, '禄劝彝族苗族自治县', '禄劝', '102.46905', '25.556534', 3, 0, 1),
+(530129, 530100, '寻甸回族彝族自治县', '寻甸', '103.25759', '25.559475', 3, 0, 1),
+(530181, 530100, '安宁市', '安宁', '102.48554', '24.921785', 3, 0, 1),
+(530300, 530000, '曲靖市', '曲靖', '103.79785', '25.501556', 2, 0, 1),
+(530302, 530300, '麒麟区', '麒麟', '103.79806', '25.501268', 3, 0, 1),
+(530303, 530300, '沾益区', '沾益', '103.82183', '25.60167', 3, 0, 1),
+(530304, 530300, '马龙区', '马龙', '103.57834', '25.42807', 3, 0, 1),
+(530322, 530300, '陆良县', '陆良', '103.655235', '25.022879', 3, 0, 1),
+(530323, 530300, '师宗县', '师宗', '103.993805', '24.825682', 3, 0, 1),
+(530324, 530300, '罗平县', '罗平', '104.309265', '24.885708', 3, 0, 1),
+(530325, 530300, '富源县', '富源', '104.25692', '25.67064', 3, 0, 1),
+(530326, 530300, '会泽县', '会泽', '103.30004', '26.41286', 3, 0, 1),
+(530381, 530300, '宣威市', '宣威', '104.09554', '26.227777', 3, 0, 1),
+(530400, 530000, '玉溪市', '玉溪', '102.54391', '24.35046', 2, 0, 1),
+(530402, 530400, '红塔区', '红塔', '102.543465', '24.350754', 3, 0, 1),
+(530403, 530400, '江川区', '江川', '102.75376', '24.28744', 3, 0, 1),
+(530423, 530400, '通海县', '通海', '102.76004', '24.112206', 3, 0, 1),
+(530424, 530400, '华宁县', '华宁', '102.928986', '24.189808', 3, 0, 1),
+(530425, 530400, '易门县', '易门', '102.16211', '24.669598', 3, 0, 1),
+(530426, 530400, '峨山彝族自治县', '峨山', '102.40436', '24.173256', 3, 0, 1),
+(530427, 530400, '新平彝族傣族自治县', '新平', '101.990906', '24.0664', 3, 0, 1),
+(530428, 530400, '元江哈尼族彝族傣族自治县', '元江', '101.99966', '23.597618', 3, 0, 1),
+(530481, 530400, '澄江市', '澄江', '102.90819', '24.67379', 3, 0, 1),
+(530500, 530000, '保山市', '保山', '99.16713', '25.111801', 2, 0, 1),
+(530502, 530500, '隆阳区', '隆阳', '99.165825', '25.112144', 3, 0, 1),
+(530521, 530500, '施甸县', '施甸', '99.18376', '24.730846', 3, 0, 1),
+(530523, 530500, '龙陵县', '龙陵', '98.693565', '24.591911', 3, 0, 1),
+(530524, 530500, '昌宁县', '昌宁', '99.61234', '24.823662', 3, 0, 1),
+(530581, 530500, '腾冲市', '腾冲', '98.49097', '25.02053', 3, 0, 1),
+(530600, 530000, '昭通市', '昭通', '103.71722', '27.337', 2, 0, 1),
+(530602, 530600, '昭阳区', '昭阳', '103.71727', '27.336636', 3, 0, 1),
+(530621, 530600, '鲁甸县', '鲁甸', '103.54933', '27.191637', 3, 0, 1),
+(530622, 530600, '巧家县', '巧家', '102.92928', '26.9117', 3, 0, 1),
+(530623, 530600, '盐津县', '盐津', '104.23506', '28.106922', 3, 0, 1),
+(530624, 530600, '大关县', '大关', '103.89161', '27.747114', 3, 0, 1),
+(530625, 530600, '永善县', '永善', '103.63732', '28.231525', 3, 0, 1),
+(530626, 530600, '绥江县', '绥江', '103.9611', '28.599953', 3, 0, 1),
+(530627, 530600, '镇雄县', '镇雄', '104.873055', '27.436268', 3, 0, 1),
+(530628, 530600, '彝良县', '彝良', '104.04849', '27.627424', 3, 0, 1),
+(530629, 530600, '威信县', '威信', '105.04869', '27.843382', 3, 0, 1),
+(530681, 530600, '水富市', '水富', '104.41562', '28.63002', 3, 0, 1),
+(530700, 530000, '丽江市', '丽江', '100.233025', '26.872108', 2, 0, 1),
+(530702, 530700, '古城区', '古城', '100.23441', '26.872229', 3, 0, 1),
+(530721, 530700, '玉龙纳西族自治县', '玉龙', '100.23831', '26.830593', 3, 0, 1),
+(530722, 530700, '永胜县', '永胜', '100.7509', '26.685623', 3, 0, 1),
+(530723, 530700, '华坪县', '华坪', '101.2678', '26.628834', 3, 0, 1),
+(530724, 530700, '宁蒗彝族自治县', '宁蒗', '100.852425', '27.281109', 3, 0, 1),
+(530800, 530000, '普洱市', '普洱', '100.97234', '22.77732', 2, 0, 1),
+(530802, 530800, '思茅区', '思茅', '100.97323', '22.776594', 3, 0, 1),
+(530821, 530800, '宁洱哈尼族彝族自治县', '宁洱', '101.04524', '23.062508', 3, 0, 1),
+(530822, 530800, '墨江哈尼族自治县', '墨江', '101.68761', '23.428165', 3, 0, 1),
+(530823, 530800, '景东彝族自治县', '景东', '100.84001', '24.448523', 3, 0, 1),
+(530824, 530800, '景谷傣族彝族自治县', '景谷', '100.70142', '23.500278', 3, 0, 1),
+(530825, 530800, '镇沅彝族哈尼族拉祜族自治县', '镇沅', '101.10851', '24.005713', 3, 0, 1),
+(530826, 530800, '江城哈尼族彝族自治县', '江城', '101.859146', '22.58336', 3, 0, 1),
+(530827, 530800, '孟连傣族拉祜族佤族自治县', '孟连', '99.5854', '22.325924', 3, 0, 1),
+(530828, 530800, '澜沧拉祜族自治县', '澜沧', '99.9312', '22.553083', 3, 0, 1),
+(530829, 530800, '西盟佤族自治县', '西盟', '99.594376', '22.644423', 3, 0, 1),
+(530900, 530000, '临沧市', '临沧', '100.08697', '23.886566', 2, 0, 1),
+(530902, 530900, '临翔区', '临翔', '100.08649', '23.886562', 3, 0, 1),
+(530921, 530900, '凤庆县', '凤庆', '99.91871', '24.592737', 3, 0, 1),
+(530922, 530900, '云县', '云县', '100.12563', '24.439026', 3, 0, 1),
+(530923, 530900, '永德县', '永德', '99.25368', '24.028158', 3, 0, 1),
+(530924, 530900, '镇康县', '镇康', '98.82743', '23.761415', 3, 0, 1),
+(530925, 530900, '双江拉祜族佤族布朗族傣族自治县', '双江', '99.82442', '23.477476', 3, 0, 1),
+(530926, 530900, '耿马傣族佤族自治县', '耿马', '99.4025', '23.534578', 3, 0, 1),
+(530927, 530900, '沧源佤族自治县', '沧源', '99.2474', '23.146887', 3, 0, 1),
+(532300, 530000, '楚雄彝族自治州', '楚雄', '101.54604', '25.041988', 2, 0, 1),
+(532301, 532300, '楚雄市', '楚雄', '101.54614', '25.040913', 3, 0, 1),
+(532322, 532300, '双柏县', '双柏', '101.63824', '24.685095', 3, 0, 1),
+(532323, 532300, '牟定县', '牟定', '101.543045', '25.31211', 3, 0, 1),
+(532324, 532300, '南华县', '南华', '101.274994', '25.192408', 3, 0, 1),
+(532325, 532300, '姚安县', '姚安', '101.238396', '25.505404', 3, 0, 1),
+(532326, 532300, '大姚县', '大姚', '101.3236', '25.722347', 3, 0, 1),
+(532327, 532300, '永仁县', '永仁', '101.67117', '26.056316', 3, 0, 1),
+(532328, 532300, '元谋县', '元谋', '101.870834', '25.703314', 3, 0, 1),
+(532329, 532300, '武定县', '武定', '102.406784', '25.5301', 3, 0, 1),
+(532331, 532300, '禄丰县', '禄丰', '102.07569', '25.14327', 3, 0, 1),
+(532500, 530000, '红河哈尼族彝族自治州', '红河', '103.384186', '23.366776', 2, 0, 1),
+(532501, 532500, '个旧市', '个旧', '103.154755', '23.360382', 3, 0, 1),
+(532502, 532500, '开远市', '开远', '103.25868', '23.713833', 3, 0, 1),
+(532503, 532500, '蒙自市', '蒙自', '103.36481', '23.39622', 3, 0, 1),
+(532504, 532500, '弥勒市', '弥勒', '103.41499', '24.41059', 3, 0, 1),
+(532523, 532500, '屏边苗族自治县', '屏边', '103.687225', '22.987013', 3, 0, 1),
+(532524, 532500, '建水县', '建水', '102.820496', '23.618387', 3, 0, 1),
+(532525, 532500, '石屏县', '石屏', '102.48447', '23.712568', 3, 0, 1),
+(532527, 532500, '泸西县', '泸西', '103.75962', '24.532368', 3, 0, 1),
+(532528, 532500, '元阳县', '元阳', '102.83706', '23.219772', 3, 0, 1),
+(532529, 532500, '红河县', '红河', '102.42121', '23.36919', 3, 0, 1),
+(532530, 532500, '金平苗族瑶族傣族自治县', '金平', '103.228355', '22.779982', 3, 0, 1),
+(532531, 532500, '绿春县', '绿春', '102.39286', '22.99352', 3, 0, 1),
+(532532, 532500, '河口瑶族自治县', '河口', '103.96159', '22.507563', 3, 0, 1),
+(532600, 530000, '文山壮族苗族自治州', '文山', '104.24401', '23.36951', 2, 0, 1),
+(532601, 532600, '文山市', '文山', '104.233', '23.38678', 3, 0, 1),
+(532622, 532600, '砚山县', '砚山', '104.34399', '23.6123', 3, 0, 1),
+(532623, 532600, '西畴县', '西畴', '104.67571', '23.437439', 3, 0, 1),
+(532624, 532600, '麻栗坡县', '麻栗坡', '104.7019', '23.124203', 3, 0, 1),
+(532625, 532600, '马关县', '马关', '104.39862', '23.011723', 3, 0, 1),
+(532626, 532600, '丘北县', '丘北', '104.19437', '24.040981', 3, 0, 1),
+(532627, 532600, '广南县', '广南', '105.05669', '24.050272', 3, 0, 1),
+(532628, 532600, '富宁县', '富宁', '105.62856', '23.626493', 3, 0, 1),
+(532800, 530000, '西双版纳傣族自治州', '西双版纳', '100.79794', '22.001724', 2, 0, 1),
+(532801, 532800, '景洪市', '景洪', '100.79795', '22.002087', 3, 0, 1),
+(532822, 532800, '勐海县', '勐海', '100.44829', '21.955866', 3, 0, 1),
+(532823, 532800, '勐腊县', '勐腊', '101.567055', '21.479448', 3, 0, 1),
+(532900, 530000, '大理白族自治州', '大理', '100.22567', '25.589449', 2, 0, 1),
+(532901, 532900, '大理市', '大理', '100.24137', '25.593067', 3, 0, 1),
+(532922, 532900, '漾濞彝族自治县', '漾濞', '99.95797', '25.669542', 3, 0, 1),
+(532923, 532900, '祥云县', '祥云', '100.55402', '25.477072', 3, 0, 1),
+(532924, 532900, '宾川县', '宾川', '100.57896', '25.825905', 3, 0, 1),
+(532925, 532900, '弥渡县', '弥渡', '100.49067', '25.342594', 3, 0, 1),
+(532926, 532900, '南涧彝族自治县', '南涧', '100.518684', '25.041279', 3, 0, 1),
+(532927, 532900, '巍山彝族回族自治县', '巍山', '100.30793', '25.23091', 3, 0, 1),
+(532928, 532900, '永平县', '永平', '99.53354', '25.46128', 3, 0, 1),
+(532929, 532900, '云龙县', '云龙', '99.3694', '25.884954', 3, 0, 1),
+(532930, 532900, '洱源县', '洱源', '99.951706', '26.111183', 3, 0, 1),
+(532931, 532900, '剑川县', '剑川', '99.90588', '26.530066', 3, 0, 1),
+(532932, 532900, '鹤庆县', '鹤庆', '100.17338', '26.55839', 3, 0, 1),
+(533100, 530000, '德宏傣族景颇族自治州', '德宏', '98.57836', '24.436693', 2, 0, 1),
+(533102, 533100, '瑞丽市', '瑞丽', '97.85588', '24.010735', 3, 0, 1),
+(533103, 533100, '芒市', '芒市', '98.57761', '24.436699', 3, 0, 1),
+(533122, 533100, '梁河县', '梁河', '98.298195', '24.80742', 3, 0, 1),
+(533123, 533100, '盈江县', '盈江', '97.93393', '24.709541', 3, 0, 1),
+(533124, 533100, '陇川县', '陇川', '97.79444', '24.184065', 3, 0, 1),
+(533300, 530000, '怒江傈僳族自治州', '怒江', '98.8543', '25.850948', 2, 0, 1),
+(533301, 533300, '泸水市', '泸水', '98.85804', '25.82306', 3, 0, 1),
+(533323, 533300, '福贡县', '福贡', '98.86742', '26.902739', 3, 0, 1),
+(533324, 533300, '贡山独龙族怒族自治县', '贡山', '98.66614', '27.738054', 3, 0, 1),
+(533325, 533300, '兰坪白族普米族自治县', '兰坪', '99.42138', '26.453838', 3, 0, 1),
+(533400, 530000, '迪庆藏族自治州', '迪庆', '99.70647', '27.826853', 2, 0, 1),
+(533401, 533400, '香格里拉市', '香格里拉', '99.74317', '27.84254', 3, 0, 1),
+(533422, 533400, '德钦县', '德钦', '98.91506', '28.483273', 3, 0, 1),
+(533423, 533400, '维西傈僳族自治县', '维西', '99.286354', '27.180948', 3, 0, 1),
+(540000, 0, '西藏自治区', '西藏', '91.13221', '29.66036', 1, 0, 1),
+(540100, 540000, '拉萨市', '拉萨', '91.13221', '29.66036', 2, 0, 1),
+(540102, 540100, '城关区', '城关', '91.13291', '29.659472', 3, 0, 1),
+(540103, 540100, '堆龙德庆区', '堆龙德庆', '91.00338', '29.64602', 3, 0, 1),
+(540104, 540100, '达孜区', '达孜', '91.34979', '29.66933', 3, 0, 1),
+(540121, 540100, '林周县', '林周', '91.26184', '29.895754', 3, 0, 1),
+(540122, 540100, '当雄县', '当雄', '91.10355', '30.47482', 3, 0, 1),
+(540123, 540100, '尼木县', '尼木', '90.16554', '29.431347', 3, 0, 1),
+(540124, 540100, '曲水县', '曲水', '90.73805', '29.349895', 3, 0, 1),
+(540127, 540100, '墨竹工卡县', '墨竹工卡', '91.731155', '29.834658', 3, 0, 1),
+(540200, 540000, '日喀则市', '日喀则', '', '', 2, 0, 1),
+(540202, 540200, '桑珠孜区', '桑珠孜', '88.88697', '29.26969', 3, 0, 1),
+(540221, 540200, '南木林县', '南木林', '89.09936', '29.68224', 3, 0, 1),
+(540222, 540200, '江孜县', '江孜', '89.60558', '28.91152', 3, 0, 1),
+(540223, 540200, '定日县', '定日', '87.12607', '28.65874', 3, 0, 1),
+(540224, 540200, '萨迦县', '萨迦', '88.02172', '28.89919', 3, 0, 1),
+(540225, 540200, '拉孜县', '拉孜', '87.63718', '29.08164', 3, 0, 1),
+(540226, 540200, '昂仁县', '昂仁', '87.23617', '29.29482', 3, 0, 1),
+(540227, 540200, '谢通门县', '谢通门', '88.26166', '29.43234', 3, 0, 1),
+(540228, 540200, '白朗县', '白朗', '89.26156', '29.10919', 3, 0, 1),
+(540229, 540200, '仁布县', '仁布', '89.842', '29.23089', 3, 0, 1),
+(540230, 540200, '康马县', '康马', '89.68169', '28.55567', 3, 0, 1),
+(540231, 540200, '定结县', '定结', '87.76606', '28.36408', 3, 0, 1),
+(540232, 540200, '仲巴县', '仲巴', '84.02454', '29.72419', 3, 0, 1),
+(540233, 540200, '亚东县', '亚东', '88.90708', '27.48592', 3, 0, 1),
+(540234, 540200, '吉隆县', '吉隆', '85.29737', '28.85254', 3, 0, 1),
+(540235, 540200, '聂拉木县', '聂拉木', '85.98232', '28.15499', 3, 0, 1),
+(540236, 540200, '萨嘎县', '萨嘎', '85.23421', '29.32943', 3, 0, 1),
+(540237, 540200, '岗巴县', '岗巴', '88.52015', '28.2746', 3, 0, 1),
+(540300, 540000, '昌都市', '昌都', '', '', 2, 0, 1),
+(540302, 540300, '卡若区', '卡若', '97.18039', '31.13831', 3, 0, 1),
+(540321, 540300, '江达县', '江达', '98.21822', '31.49968', 3, 0, 1),
+(540322, 540300, '贡觉县', '贡觉', '98.2708', '30.86016', 3, 0, 1),
+(540323, 540300, '类乌齐县', '类乌齐', '96.6002', '31.21155', 3, 0, 1),
+(540324, 540300, '丁青县', '丁青', '95.59572', '31.4125', 3, 0, 1),
+(540325, 540300, '察雅县', '察雅', '97.56877', '30.65363', 3, 0, 1),
+(540326, 540300, '八宿县', '八宿', '96.91785', '30.0532', 3, 0, 1),
+(540327, 540300, '左贡县', '左贡', '97.84085', '29.67091', 3, 0, 1),
+(540328, 540300, '芒康县', '芒康', '98.59312', '29.68008', 3, 0, 1),
+(540329, 540300, '洛隆县', '洛隆', '95.82482', '30.74181', 3, 0, 1),
+(540330, 540300, '边坝县', '边坝', '94.7079', '30.93345', 3, 0, 1),
+(540400, 540000, '林芝市', '林芝', '', '', 2, 0, 1),
+(540402, 540400, '巴宜区', '巴宜', '94.36119', '29.63654', 3, 0, 1),
+(540421, 540400, '工布江达县', '工布江达', '93.24611', '29.88531', 3, 0, 1),
+(540422, 540400, '米林县', '米林', '94.21315', '29.21607', 3, 0, 1),
+(540423, 540400, '墨脱县', '墨脱', '95.33304', '29.32521', 3, 0, 1),
+(540424, 540400, '波密县', '波密', '95.76761', '29.85903', 3, 0, 1),
+(540425, 540400, '察隅县', '察隅', '97.46687', '28.66154', 3, 0, 1),
+(540426, 540400, '朗县', '朗县', '93.07482', '29.04607', 3, 0, 1),
+(540500, 540000, '山南市', '山南', '', '', 2, 0, 1),
+(540502, 540500, '乃东区', '乃东', '91.76141', '29.22484', 3, 0, 1),
+(540521, 540500, '扎囊县', '扎囊', '91.33735', '29.245', 3, 0, 1),
+(540522, 540500, '贡嘎县', '贡嘎', '90.98421', '29.28947', 3, 0, 1),
+(540523, 540500, '桑日县', '桑日', '92.01579', '29.25906', 3, 0, 1),
+(540524, 540500, '琼结县', '琼结', '91.68385', '29.02464', 3, 0, 1),
+(540525, 540500, '曲松县', '曲松', '92.20222', '29.06277', 3, 0, 1),
+(540526, 540500, '措美县', '措美', '91.43361', '28.43793', 3, 0, 1),
+(540527, 540500, '洛扎县', '洛扎', '90.85998', '28.38569', 3, 0, 1),
+(540528, 540500, '加查县', '加查', '92.59387', '29.14023', 3, 0, 1),
+(540529, 540500, '隆子县', '隆子', '92.46177', '28.40681', 3, 0, 1),
+(540530, 540500, '错那县', '错那', '91.9571', '27.99099', 3, 0, 1),
+(540531, 540500, '浪卡子县', '浪卡子', '90.40011', '28.96768', 3, 0, 1),
+(540600, 540000, '那曲市', '那曲', '', '', 2, 0, 1),
+(540602, 540600, '色尼区', '色尼', '92.05355', '31.46988', 3, 0, 1),
+(540621, 540600, '嘉黎县', '嘉黎', '93.23236', '30.64087', 3, 0, 1),
+(540622, 540600, '比如县', '比如', '93.6813', '31.47785', 3, 0, 1),
+(540623, 540600, '聂荣县', '聂荣', '92.30327', '32.10784', 3, 0, 1),
+(540624, 540600, '安多县', '安多', '91.68258', '32.265', 3, 0, 1),
+(540625, 540600, '申扎县', '申扎', '88.70982', '30.93043', 3, 0, 1),
+(540626, 540600, '索县', '索县', '93.78556', '31.88673', 3, 0, 1),
+(540627, 540600, '班戈县', '班戈', '90.00987', '31.39199', 3, 0, 1),
+(540628, 540600, '巴青县', '巴青', '94.05345', '31.9184', 3, 0, 1),
+(540629, 540600, '尼玛县', '尼玛', '87.23691', '31.78448', 3, 0, 1),
+(540630, 540600, '双湖县', '双湖', '88.83691', '33.18763', 3, 0, 1),
+(542500, 540000, '阿里地区', '阿里', '80.1055', '32.503185', 2, 0, 1),
+(542521, 542500, '普兰县', '普兰', '81.17759', '30.291897', 3, 0, 1),
+(542522, 542500, '札达县', '札达', '79.80319', '31.478586', 3, 0, 1),
+(542523, 542500, '噶尔县', '噶尔', '80.105', '32.503372', 3, 0, 1),
+(542524, 542500, '日土县', '日土', '79.73193', '33.382454', 3, 0, 1),
+(542525, 542500, '革吉县', '革吉', '81.1429', '32.38919', 3, 0, 1),
+(542526, 542500, '改则县', '改则', '84.062386', '32.302074', 3, 0, 1),
+(542527, 542500, '措勤县', '措勤', '85.159256', '31.016773', 3, 0, 1),
+(610000, 0, '陕西省', '陕西', '108.94802', '34.26316', 1, 0, 1),
+(610100, 610000, '西安市', '西安', '108.94802', '34.26316', 2, 0, 1),
+(610102, 610100, '新城区', '新城', '108.9599', '34.26927', 3, 0, 1),
+(610103, 610100, '碑林区', '碑林', '108.94699', '34.25106', 3, 0, 1),
+(610104, 610100, '莲湖区', '莲湖', '108.9332', '34.2656', 3, 0, 1),
+(610111, 610100, '灞桥区', '灞桥', '109.06726', '34.267452', 3, 0, 1),
+(610112, 610100, '未央区', '未央', '108.94602', '34.30823', 3, 0, 1),
+(610113, 610100, '雁塔区', '雁塔', '108.92659', '34.21339', 3, 0, 1),
+(610114, 610100, '阎良区', '阎良', '109.22802', '34.66214', 3, 0, 1),
+(610115, 610100, '临潼区', '临潼', '109.21399', '34.372066', 3, 0, 1),
+(610116, 610100, '长安区', '长安', '108.94158', '34.157097', 3, 0, 1),
+(610117, 610100, '高陵区', '高陵', '109.08822', '34.53487', 3, 0, 1),
+(610118, 610100, '鄠邑区', '鄠邑', '108.60494', '34.10847', 3, 0, 1),
+(610122, 610100, '蓝田县', '蓝田', '109.317635', '34.15619', 3, 0, 1),
+(610124, 610100, '周至县', '周至', '108.21647', '34.161533', 3, 0, 1),
+(610200, 610000, '铜川市', '铜川', '108.97961', '34.91658', 2, 0, 1),
+(610202, 610200, '王益区', '王益', '109.07586', '35.0691', 3, 0, 1),
+(610203, 610200, '印台区', '印台', '109.100815', '35.111927', 3, 0, 1),
+(610204, 610200, '耀州区', '耀州', '108.96254', '34.910206', 3, 0, 1),
+(610222, 610200, '宜君县', '宜君', '109.11828', '35.398766', 3, 0, 1),
+(610300, 610000, '宝鸡市', '宝鸡', '107.14487', '34.369316', 2, 0, 1),
+(610302, 610300, '渭滨区', '渭滨', '107.14447', '34.37101', 3, 0, 1),
+(610303, 610300, '金台区', '金台', '107.14994', '34.37519', 3, 0, 1),
+(610304, 610300, '陈仓区', '陈仓', '107.383644', '34.35275', 3, 0, 1),
+(610322, 610300, '凤翔县', '凤翔', '107.40057', '34.521667', 3, 0, 1),
+(610323, 610300, '岐山县', '岐山', '107.624466', '34.44296', 3, 0, 1),
+(610324, 610300, '扶风县', '扶风', '107.89142', '34.375496', 3, 0, 1),
+(610326, 610300, '眉县', '眉县', '107.75237', '34.272137', 3, 0, 1),
+(610327, 610300, '陇县', '陇县', '106.85706', '34.89326', 3, 0, 1),
+(610328, 610300, '千阳县', '千阳', '107.13299', '34.642586', 3, 0, 1),
+(610329, 610300, '麟游县', '麟游', '107.79661', '34.677715', 3, 0, 1),
+(610330, 610300, '凤县', '凤县', '106.525215', '33.912464', 3, 0, 1),
+(610331, 610300, '太白县', '太白', '107.316536', '34.059216', 3, 0, 1),
+(610400, 610000, '咸阳市', '咸阳', '108.70512', '34.33344', 2, 0, 1),
+(610402, 610400, '秦都区', '秦都', '108.69864', '34.3298', 3, 0, 1),
+(610403, 610400, '杨陵区', '杨陵', '108.08635', '34.27135', 3, 0, 1),
+(610404, 610400, '渭城区', '渭城', '108.73096', '34.336845', 3, 0, 1),
+(610422, 610400, '三原县', '三原', '108.94348', '34.613995', 3, 0, 1),
+(610423, 610400, '泾阳县', '泾阳', '108.83784', '34.528492', 3, 0, 1),
+(610424, 610400, '乾县', '乾县', '108.247406', '34.52726', 3, 0, 1),
+(610425, 610400, '礼泉县', '礼泉', '108.428314', '34.482582', 3, 0, 1),
+(610426, 610400, '永寿县', '永寿', '108.14313', '34.69262', 3, 0, 1),
+(610428, 610400, '长武县', '长武', '107.79584', '35.206123', 3, 0, 1),
+(610429, 610400, '旬邑县', '旬邑', '108.337234', '35.112232', 3, 0, 1),
+(610430, 610400, '淳化县', '淳化', '108.58118', '34.79797', 3, 0, 1),
+(610431, 610400, '武功县', '武功', '108.21286', '34.25973', 3, 0, 1),
+(610481, 610400, '兴平市', '兴平', '108.488495', '34.297134', 3, 0, 1),
+(610482, 610400, '彬州市', '彬州', '108.08108', '35.03565', 3, 0, 1),
+(610500, 610000, '渭南市', '渭南', '109.502884', '34.499382', 2, 0, 1),
+(610502, 610500, '临渭区', '临渭', '109.503296', '34.50127', 3, 0, 1),
+(610503, 610500, '华州区', '华州', '109.7719', '34.51259', 3, 0, 1),
+(610522, 610500, '潼关县', '潼关', '110.24726', '34.544514', 3, 0, 1),
+(610523, 610500, '大荔县', '大荔', '109.94312', '34.79501', 3, 0, 1),
+(610524, 610500, '合阳县', '合阳', '110.14798', '35.2371', 3, 0, 1),
+(610525, 610500, '澄城县', '澄城', '109.93761', '35.184', 3, 0, 1),
+(610526, 610500, '蒲城县', '蒲城', '109.58965', '34.956036', 3, 0, 1),
+(610527, 610500, '白水县', '白水', '109.59431', '35.17729', 3, 0, 1),
+(610528, 610500, '富平县', '富平', '109.18717', '34.746677', 3, 0, 1),
+(610581, 610500, '韩城市', '韩城', '110.45239', '35.47524', 3, 0, 1),
+(610582, 610500, '华阴市', '华阴', '110.08952', '34.565357', 3, 0, 1),
+(610600, 610000, '延安市', '延安', '109.49081', '36.59654', 2, 0, 1),
+(610602, 610600, '宝塔区', '宝塔', '109.49069', '36.59629', 3, 0, 1),
+(610603, 610600, '安塞区', '安塞', '109.32897', '36.86373', 3, 0, 1),
+(610621, 610600, '延长县', '延长', '110.01296', '36.578304', 3, 0, 1),
+(610622, 610600, '延川县', '延川', '110.190315', '36.882065', 3, 0, 1),
+(610625, 610600, '志丹县', '志丹', '108.7689', '36.823032', 3, 0, 1),
+(610626, 610600, '吴起县', '吴起', '108.17698', '36.92485', 3, 0, 1),
+(610627, 610600, '甘泉县', '甘泉', '109.34961', '36.27773', 3, 0, 1),
+(610628, 610600, '富县', '富县', '109.38413', '35.996494', 3, 0, 1),
+(610629, 610600, '洛川县', '洛川', '109.435715', '35.762135', 3, 0, 1),
+(610630, 610600, '宜川县', '宜川', '110.17554', '36.050392', 3, 0, 1),
+(610631, 610600, '黄龙县', '黄龙', '109.83502', '35.583275', 3, 0, 1),
+(610632, 610600, '黄陵县', '黄陵', '109.26247', '35.580166', 3, 0, 1),
+(610681, 610600, '子长市', '子长', '109.67538', '37.14258', 3, 0, 1),
+(610700, 610000, '汉中市', '汉中', '107.02862', '33.077667', 2, 0, 1),
+(610702, 610700, '汉台区', '汉台', '107.02824', '33.077675', 3, 0, 1),
+(610703, 610700, '南郑区', '南郑', '106.93624', '32.99932', 3, 0, 1),
+(610722, 610700, '城固县', '城固', '107.32989', '33.1531', 3, 0, 1),
+(610723, 610700, '洋县', '洋县', '107.549965', '33.22328', 3, 0, 1),
+(610724, 610700, '西乡县', '西乡', '107.76586', '32.98796', 3, 0, 1),
+(610725, 610700, '勉县', '勉县', '106.680176', '33.155617', 3, 0, 1),
+(610726, 610700, '宁强县', '宁强', '106.25739', '32.830807', 3, 0, 1),
+(610727, 610700, '略阳县', '略阳', '106.1539', '33.32964', 3, 0, 1),
+(610728, 610700, '镇巴县', '镇巴', '107.89531', '32.535854', 3, 0, 1),
+(610729, 610700, '留坝县', '留坝', '106.92438', '33.61334', 3, 0, 1),
+(610730, 610700, '佛坪县', '佛坪', '107.98858', '33.520744', 3, 0, 1),
+(610800, 610000, '榆林市', '榆林', '109.741196', '38.29016', 2, 0, 1),
+(610802, 610800, '榆阳区', '榆阳', '109.74791', '38.299267', 3, 0, 1),
+(610803, 610800, '横山区', '横山', '109.29315', '37.95871', 3, 0, 1),
+(610822, 610800, '府谷县', '府谷', '111.06965', '39.029243', 3, 0, 1),
+(610824, 610800, '靖边县', '靖边', '108.80567', '37.596085', 3, 0, 1),
+(610825, 610800, '定边县', '定边', '107.60128', '37.59523', 3, 0, 1),
+(610826, 610800, '绥德县', '绥德', '110.26537', '37.5077', 3, 0, 1),
+(610827, 610800, '米脂县', '米脂', '110.17868', '37.759083', 3, 0, 1),
+(610828, 610800, '佳县', '佳县', '110.49337', '38.0216', 3, 0, 1),
+(610829, 610800, '吴堡县', '吴堡', '110.73931', '37.451923', 3, 0, 1),
+(610830, 610800, '清涧县', '清涧', '110.12146', '37.087704', 3, 0, 1),
+(610831, 610800, '子洲县', '子洲', '110.03457', '37.611572', 3, 0, 1),
+(610881, 610800, '神木市', '神木', '110.49896', '38.84239', 3, 0, 1),
+(610900, 610000, '安康市', '安康', '109.029274', '32.6903', 2, 0, 1),
+(610902, 610900, '汉滨区', '汉滨', '109.0291', '32.69082', 3, 0, 1),
+(610921, 610900, '汉阴县', '汉阴', '108.51095', '32.89112', 3, 0, 1),
+(610922, 610900, '石泉县', '石泉', '108.25051', '33.038513', 3, 0, 1),
+(610923, 610900, '宁陕县', '宁陕', '108.31371', '33.312183', 3, 0, 1),
+(610924, 610900, '紫阳县', '紫阳', '108.53779', '32.520176', 3, 0, 1),
+(610925, 610900, '岚皋县', '岚皋', '108.900665', '32.31069', 3, 0, 1),
+(610926, 610900, '平利县', '平利', '109.36186', '32.38793', 3, 0, 1),
+(610927, 610900, '镇坪县', '镇坪', '109.526436', '31.883394', 3, 0, 1),
+(610928, 610900, '旬阳县', '旬阳', '109.36815', '32.83357', 3, 0, 1),
+(610929, 610900, '白河县', '白河', '110.11419', '32.809483', 3, 0, 1),
+(611000, 610000, '商洛市', '商洛', '109.93977', '33.86832', 2, 0, 1),
+(611002, 611000, '商州区', '商州', '109.93768', '33.86921', 3, 0, 1),
+(611021, 611000, '洛南县', '洛南', '110.14571', '34.0885', 3, 0, 1),
+(611022, 611000, '丹凤县', '丹凤', '110.33191', '33.69471', 3, 0, 1),
+(611023, 611000, '商南县', '商南', '110.88544', '33.526367', 3, 0, 1),
+(611024, 611000, '山阳县', '山阳', '109.88043', '33.53041', 3, 0, 1),
+(611025, 611000, '镇安县', '镇安', '109.15108', '33.42398', 3, 0, 1),
+(611026, 611000, '柞水县', '柞水', '109.11125', '33.682774', 3, 0, 1),
+(620000, 0, '甘肃省', '甘肃', '103.823555', '36.05804', 1, 0, 1),
+(620100, 620000, '兰州市', '兰州', '103.823555', '36.05804', 2, 0, 1),
+(620102, 620100, '城关区', '城关', '103.841034', '36.049114', 3, 0, 1),
+(620103, 620100, '七里河区', '七里河', '103.784325', '36.06673', 3, 0, 1),
+(620104, 620100, '西固区', '西固', '103.62233', '36.10037', 3, 0, 1),
+(620105, 620100, '安宁区', '安宁', '103.72404', '36.10329', 3, 0, 1),
+(620111, 620100, '红古区', '红古', '102.86182', '36.344177', 3, 0, 1),
+(620121, 620100, '永登县', '永登', '103.2622', '36.73443', 3, 0, 1),
+(620122, 620100, '皋兰县', '皋兰', '103.94933', '36.331253', 3, 0, 1),
+(620123, 620100, '榆中县', '榆中', '104.114975', '35.84443', 3, 0, 1),
+(620200, 620000, '嘉峪关市', '嘉峪关', '98.277306', '39.78653', 2, 0, 1),
+(620300, 620000, '金昌市', '金昌', '102.18789', '38.514236', 2, 0, 1),
+(620302, 620300, '金川区', '金川', '102.18768', '38.513794', 3, 0, 1),
+(620321, 620300, '永昌县', '永昌', '101.971954', '38.247353', 3, 0, 1),
+(620400, 620000, '白银市', '白银', '104.17361', '36.54568', 2, 0, 1),
+(620402, 620400, '白银区', '白银', '104.17425', '36.54565', 3, 0, 1),
+(620403, 620400, '平川区', '平川', '104.81921', '36.72921', 3, 0, 1),
+(620421, 620400, '靖远县', '靖远', '104.68697', '36.561424', 3, 0, 1),
+(620422, 620400, '会宁县', '会宁', '105.05434', '35.692486', 3, 0, 1),
+(620423, 620400, '景泰县', '景泰', '104.06639', '37.19352', 3, 0, 1),
+(620500, 620000, '天水市', '天水', '105.725', '34.57853', 2, 0, 1),
+(620502, 620500, '秦州区', '秦州', '105.72448', '34.578644', 3, 0, 1),
+(620503, 620500, '麦积区', '麦积', '105.89763', '34.563503', 3, 0, 1),
+(620521, 620500, '清水县', '清水', '106.13988', '34.75287', 3, 0, 1),
+(620522, 620500, '秦安县', '秦安', '105.6733', '34.862354', 3, 0, 1),
+(620523, 620500, '甘谷县', '甘谷', '105.332344', '34.747326', 3, 0, 1),
+(620524, 620500, '武山县', '武山', '104.89169', '34.721954', 3, 0, 1),
+(620525, 620500, '张家川回族自治县', '张家川', '106.21242', '34.993237', 3, 0, 1),
+(620600, 620000, '武威市', '武威', '102.6347', '37.929996', 2, 0, 1),
+(620602, 620600, '凉州区', '凉州', '102.63449', '37.93025', 3, 0, 1),
+(620621, 620600, '民勤县', '民勤', '103.09065', '38.624622', 3, 0, 1),
+(620622, 620600, '古浪县', '古浪', '102.89805', '37.47057', 3, 0, 1),
+(620623, 620600, '天祝藏族自治县', '天祝', '103.14204', '36.97168', 3, 0, 1),
+(620700, 620000, '张掖市', '张掖', '100.455475', '38.932896', 2, 0, 1),
+(620702, 620700, '甘州区', '甘州', '100.454865', '38.931774', 3, 0, 1),
+(620721, 620700, '肃南裕固族自治县', '肃南', '99.61709', '38.83727', 3, 0, 1),
+(620722, 620700, '民乐县', '民乐', '100.81662', '38.434456', 3, 0, 1),
+(620723, 620700, '临泽县', '临泽', '100.166336', '39.15215', 3, 0, 1),
+(620724, 620700, '高台县', '高台', '99.81665', '39.37631', 3, 0, 1),
+(620725, 620700, '山丹县', '山丹', '101.08844', '38.78484', 3, 0, 1),
+(620800, 620000, '平凉市', '平凉', '106.68469', '35.54279', 2, 0, 1),
+(620802, 620800, '崆峒区', '崆峒', '106.68422', '35.54173', 3, 0, 1),
+(620821, 620800, '泾川县', '泾川', '107.36522', '35.33528', 3, 0, 1),
+(620822, 620800, '灵台县', '灵台', '107.62059', '35.06401', 3, 0, 1),
+(620823, 620800, '崇信县', '崇信', '107.03125', '35.30453', 3, 0, 1),
+(620825, 620800, '庄浪县', '庄浪', '106.04198', '35.203426', 3, 0, 1),
+(620826, 620800, '静宁县', '静宁', '105.73349', '35.52524', 3, 0, 1),
+(620881, 620800, '华亭市', '华亭', '106.65352', '35.21756', 3, 0, 1),
+(620900, 620000, '酒泉市', '酒泉', '98.510796', '39.744022', 2, 0, 1),
+(620902, 620900, '肃州区', '肃州', '98.511154', '39.74386', 3, 0, 1),
+(620921, 620900, '金塔县', '金塔', '98.90296', '39.983036', 3, 0, 1),
+(620922, 620900, '瓜州县', '瓜州', '95.780594', '40.516525', 3, 0, 1),
+(620923, 620900, '肃北蒙古族自治县', '肃北', '94.87728', '39.51224', 3, 0, 1),
+(620924, 620900, '阿克塞哈萨克族自治县', '阿克塞', '94.33764', '39.63164', 3, 0, 1),
+(620981, 620900, '玉门市', '玉门', '97.03721', '40.28682', 3, 0, 1),
+(620982, 620900, '敦煌市', '敦煌', '94.664276', '40.141117', 3, 0, 1),
+(621000, 620000, '庆阳市', '庆阳', '107.638374', '35.73422', 2, 0, 1),
+(621002, 621000, '西峰区', '西峰', '107.638824', '35.73371', 3, 0, 1),
+(621021, 621000, '庆城县', '庆城', '107.885666', '36.013504', 3, 0, 1),
+(621022, 621000, '环县', '环县', '107.308754', '36.56932', 3, 0, 1),
+(621023, 621000, '华池县', '华池', '107.98629', '36.457302', 3, 0, 1),
+(621024, 621000, '合水县', '合水', '108.01987', '35.819004', 3, 0, 1),
+(621025, 621000, '正宁县', '正宁', '108.36107', '35.490643', 3, 0, 1),
+(621026, 621000, '宁县', '宁县', '107.92118', '35.50201', 3, 0, 1),
+(621027, 621000, '镇原县', '镇原', '107.19571', '35.677807', 3, 0, 1),
+(621100, 620000, '定西市', '定西', '104.6263', '35.57958', 2, 0, 1),
+(621102, 621100, '安定区', '安定', '104.62577', '35.579765', 3, 0, 1),
+(621121, 621100, '通渭县', '通渭', '105.2501', '35.208923', 3, 0, 1),
+(621122, 621100, '陇西县', '陇西', '104.63755', '35.00341', 3, 0, 1),
+(621123, 621100, '渭源县', '渭源', '104.21174', '35.133022', 3, 0, 1),
+(621124, 621100, '临洮县', '临洮', '103.86218', '35.376232', 3, 0, 1),
+(621125, 621100, '漳县', '漳县', '104.46676', '34.84864', 3, 0, 1),
+(621126, 621100, '岷县', '岷县', '104.03988', '34.439106', 3, 0, 1),
+(621200, 620000, '陇南市', '陇南', '104.92938', '33.3886', 2, 0, 1),
+(621202, 621200, '武都区', '武都', '104.92986', '33.388157', 3, 0, 1),
+(621221, 621200, '成县', '成县', '105.734436', '33.739864', 3, 0, 1),
+(621222, 621200, '文县', '文县', '104.68245', '32.94217', 3, 0, 1),
+(621223, 621200, '宕昌县', '宕昌', '104.39448', '34.042656', 3, 0, 1),
+(621224, 621200, '康县', '康县', '105.609535', '33.328266', 3, 0, 1),
+(621225, 621200, '西和县', '西和', '105.299736', '34.013718', 3, 0, 1),
+(621226, 621200, '礼县', '礼县', '105.18162', '34.18939', 3, 0, 1),
+(621227, 621200, '徽县', '徽县', '106.08563', '33.767784', 3, 0, 1),
+(621228, 621200, '两当县', '两当', '106.30696', '33.91073', 3, 0, 1),
+(622900, 620000, '临夏回族自治州', '临夏', '103.212006', '35.599445', 2, 0, 1),
+(622901, 622900, '临夏市', '临夏市', '103.21163', '35.59941', 3, 0, 1),
+(622921, 622900, '临夏县', '临夏县', '102.99387', '35.49236', 3, 0, 1),
+(622922, 622900, '康乐县', '康乐', '103.709854', '35.371906', 3, 0, 1),
+(622923, 622900, '永靖县', '永靖', '103.31987', '35.938934', 3, 0, 1),
+(622924, 622900, '广河县', '广河', '103.57619', '35.48169', 3, 0, 1),
+(622925, 622900, '和政县', '和政', '103.35036', '35.425972', 3, 0, 1),
+(622926, 622900, '东乡族自治县', '东乡', '103.389565', '35.66383', 3, 0, 1),
+(622927, 622900, '积石山保安族东乡族撒拉族自治县', '积石山', '102.87747', '35.712906', 3, 0, 1),
+(623000, 620000, '甘南藏族自治州', '甘南', '102.91101', '34.986355', 2, 0, 1),
+(623001, 623000, '合作市', '合作', '102.91149', '34.985973', 3, 0, 1),
+(623021, 623000, '临潭县', '临潭', '103.35305', '34.69164', 3, 0, 1),
+(623022, 623000, '卓尼县', '卓尼', '103.50851', '34.588165', 3, 0, 1),
+(623023, 623000, '舟曲县', '舟曲', '104.37027', '33.782963', 3, 0, 1),
+(623024, 623000, '迭部县', '迭部', '103.22101', '34.055347', 3, 0, 1),
+(623025, 623000, '玛曲县', '玛曲', '102.07577', '33.99807', 3, 0, 1),
+(623026, 623000, '碌曲县', '碌曲', '102.488495', '34.589592', 3, 0, 1),
+(623027, 623000, '夏河县', '夏河', '102.520744', '35.20085', 3, 0, 1),
+(630000, 0, '青海省', '青海', '101.778915', '36.623177', 1, 0, 1),
+(630100, 630000, '西宁市', '西宁', '101.778915', '36.623177', 2, 0, 1),
+(630102, 630100, '城东区', '城东', '101.7961', '36.616043', 3, 0, 1),
+(630103, 630100, '城中区', '城中', '101.78455', '36.62118', 3, 0, 1),
+(630104, 630100, '城西区', '城西', '101.76365', '36.628323', 3, 0, 1),
+(630105, 630100, '城北区', '城北', '101.7613', '36.64845', 3, 0, 1),
+(630106, 630100, '湟中区', '湟中', '101.57164', '36.50087', 3, 0, 1),
+(630121, 630100, '大通回族土族自治县', '大通', '101.68418', '36.931343', 3, 0, 1),
+(630123, 630100, '湟源县', '湟源', '101.263435', '36.68482', 3, 0, 1),
+(630200, 630000, '海东市', '海东', '', '', 2, 0, 1),
+(630202, 630200, '乐都区', '乐都', '102.40173', '36.48209', 3, 0, 1),
+(630203, 630200, '平安区', '平安', '102.10848', '36.50029', 3, 0, 1),
+(630222, 630200, '民和回族土族自治县', '民和回族土族自治县', '102.83087', '36.32026', 3, 0, 1),
+(630223, 630200, '互助土族自治县', '互助土族自治县', '101.95842', '36.84412', 3, 0, 1),
+(630224, 630200, '化隆回族自治县', '化隆回族自治县', '102.26404', '36.09493', 3, 0, 1),
+(630225, 630200, '循化撒拉族自治县', '循化撒拉族自治县', '102.4891', '35.8508', 3, 0, 1),
+(632200, 630000, '海北藏族自治州', '海北', '100.90106', '36.959435', 2, 0, 1),
+(632221, 632200, '门源回族自治县', '门源', '101.61846', '37.37663', 3, 0, 1),
+(632222, 632200, '祁连县', '祁连', '100.24978', '38.175407', 3, 0, 1),
+(632223, 632200, '海晏县', '海晏', '100.90049', '36.95954', 3, 0, 1),
+(632224, 632200, '刚察县', '刚察', '100.13842', '37.326263', 3, 0, 1),
+(632300, 630000, '黄南藏族自治州', '黄南', '102.01999', '35.517742', 2, 0, 1),
+(632301, 632300, '同仁市', '同仁', '', '', 3, 0, 1),
+(632322, 632300, '尖扎县', '尖扎', '102.03195', '35.938206', 3, 0, 1),
+(632323, 632300, '泽库县', '泽库', '101.469345', '35.036842', 3, 0, 1),
+(632324, 632300, '河南蒙古族自治县', '河南', '101.61188', '34.734524', 3, 0, 1),
+(632500, 630000, '海南藏族自治州', '海南藏族', '100.619545', '36.280354', 2, 0, 1),
+(632521, 632500, '共和县', '共和', '100.6196', '36.280285', 3, 0, 1),
+(632522, 632500, '同德县', '同德', '100.57947', '35.254494', 3, 0, 1),
+(632523, 632500, '贵德县', '贵德', '101.431854', '36.040455', 3, 0, 1),
+(632524, 632500, '兴海县', '兴海', '99.98696', '35.58909', 3, 0, 1),
+(632525, 632500, '贵南县', '贵南', '100.74792', '35.587086', 3, 0, 1),
+(632600, 630000, '果洛藏族自治州', '果洛', '100.24214', '34.4736', 2, 0, 1),
+(632621, 632600, '玛沁县', '玛沁', '100.24353', '34.473385', 3, 0, 1),
+(632622, 632600, '班玛县', '班玛', '100.73795', '32.931587', 3, 0, 1),
+(632623, 632600, '甘德县', '甘德', '99.90259', '33.966988', 3, 0, 1),
+(632624, 632600, '达日县', '达日', '99.65172', '33.753258', 3, 0, 1),
+(632625, 632600, '久治县', '久治', '101.484886', '33.430218', 3, 0, 1),
+(632626, 632600, '玛多县', '玛多', '98.21134', '34.91528', 3, 0, 1),
+(632700, 630000, '玉树藏族自治州', '玉树', '97.00852', '33.004047', 2, 0, 1),
+(632701, 632700, '玉树市', '玉树', '97.00862', '32.99336', 3, 0, 1),
+(632722, 632700, '杂多县', '杂多', '95.29343', '32.891888', 3, 0, 1),
+(632723, 632700, '称多县', '称多', '97.11089', '33.367886', 3, 0, 1),
+(632724, 632700, '治多县', '治多', '95.616844', '33.85232', 3, 0, 1),
+(632725, 632700, '囊谦县', '囊谦', '96.4798', '32.203205', 3, 0, 1),
+(632726, 632700, '曲麻莱县', '曲麻莱', '95.800674', '34.12654', 3, 0, 1),
+(632800, 630000, '海西蒙古族藏族自治州', '海西', '97.37079', '37.374664', 2, 0, 1),
+(632801, 632800, '格尔木市', '格尔木', '94.90578', '36.401543', 3, 0, 1),
+(632802, 632800, '德令哈市', '德令哈', '97.37014', '37.374554', 3, 0, 1),
+(632803, 632800, '茫崖市', '茫崖', '90.85616', '38.24763', 3, 0, 1),
+(632821, 632800, '乌兰县', '乌兰', '98.47985', '36.93039', 3, 0, 1),
+(632822, 632800, '都兰县', '都兰', '98.089165', '36.298553', 3, 0, 1),
+(632823, 632800, '天峻县', '天峻', '99.02078', '37.29906', 3, 0, 1),
+(640000, 0, '宁夏回族自治区', '宁夏', '106.278175', '38.46637', 1, 0, 1),
+(640100, 640000, '银川市', '银川', '106.278175', '38.46637', 2, 0, 1),
+(640104, 640100, '兴庆区', '兴庆', '106.2784', '38.46747', 3, 0, 1),
+(640105, 640100, '西夏区', '西夏', '106.13212', '38.492424', 3, 0, 1),
+(640106, 640100, '金凤区', '金凤', '106.228485', '38.477352', 3, 0, 1),
+(640121, 640100, '永宁县', '永宁', '106.253784', '38.28043', 3, 0, 1),
+(640122, 640100, '贺兰县', '贺兰', '106.3459', '38.55456', 3, 0, 1),
+(640181, 640100, '灵武市', '灵武', '106.3347', '38.09406', 3, 0, 1),
+(640200, 640000, '石嘴山市', '石嘴山', '106.376175', '39.01333', 2, 0, 1),
+(640202, 640200, '大武口区', '大武口', '106.37665', '39.014156', 3, 0, 1),
+(640205, 640200, '惠农区', '惠农', '106.77551', '39.230095', 3, 0, 1),
+(640221, 640200, '平罗县', '平罗', '106.54489', '38.90674', 3, 0, 1),
+(640300, 640000, '吴忠市', '吴忠', '106.19941', '37.986164', 2, 0, 1),
+(640302, 640300, '利通区', '利通', '106.19942', '37.985966', 3, 0, 1),
+(640303, 640300, '红寺堡区', '红寺堡', '106.067314', '37.421616', 3, 0, 1),
+(640323, 640300, '盐池县', '盐池', '107.40541', '37.78422', 3, 0, 1),
+(640324, 640300, '同心县', '同心', '105.914764', '36.9829', 3, 0, 1),
+(640381, 640300, '青铜峡市', '青铜峡', '106.07539', '38.021507', 3, 0, 1),
+(640400, 640000, '固原市', '固原', '106.28524', '36.004562', 2, 0, 1),
+(640402, 640400, '原州区', '原州', '106.28477', '36.005337', 3, 0, 1),
+(640422, 640400, '西吉县', '西吉', '105.731804', '35.965385', 3, 0, 1),
+(640423, 640400, '隆德县', '隆德', '106.12344', '35.618233', 3, 0, 1),
+(640424, 640400, '泾源县', '泾源', '106.33868', '35.49344', 3, 0, 1),
+(640425, 640400, '彭阳县', '彭阳', '106.64151', '35.849976', 3, 0, 1),
+(640500, 640000, '中卫市', '中卫', '105.18957', '37.51495', 2, 0, 1),
+(640502, 640500, '沙坡头区', '沙坡头', '105.19054', '37.514565', 3, 0, 1),
+(640521, 640500, '中宁县', '中宁', '105.67578', '37.489735', 3, 0, 1),
+(640522, 640500, '海原县', '海原', '105.64732', '36.562008', 3, 0, 1),
+(650000, 0, '新疆维吾尔自治区', '新疆', '87.61773', '43.792816', 1, 0, 1),
+(650100, 650000, '乌鲁木齐市', '乌鲁木齐', '87.61773', '43.792816', 2, 0, 1),
+(650102, 650100, '天山区', '天山', '87.62012', '43.79643', 3, 0, 1),
+(650103, 650100, '沙依巴克区', '沙依巴克', '87.59664', '43.78887', 3, 0, 1),
+(650104, 650100, '新市区', '新市', '87.56065', '43.87088', 3, 0, 1),
+(650105, 650100, '水磨沟区', '水磨沟', '87.61309', '43.816746', 3, 0, 1),
+(650106, 650100, '头屯河区', '头屯河', '87.42582', '43.876053', 3, 0, 1),
+(650107, 650100, '达坂城区', '达坂城', '88.30994', '43.36181', 3, 0, 1),
+(650109, 650100, '米东区', '米东', '87.6918', '43.960983', 3, 0, 1),
+(650121, 650100, '乌鲁木齐县', '乌鲁木齐', '1.0', '0.0', 3, 0, 1),
+(650200, 650000, '克拉玛依市', '克拉玛依', '84.87395', '45.595886', 2, 0, 1),
+(650202, 650200, '独山子区', '独山子', '84.88227', '44.327206', 3, 0, 1),
+(650203, 650200, '克拉玛依区', '克拉玛依', '84.86892', '45.600475', 3, 0, 1),
+(650204, 650200, '白碱滩区', '白碱滩', '85.12988', '45.689022', 3, 0, 1),
+(650205, 650200, '乌尔禾区', '乌尔禾', '85.69777', '46.08776', 3, 0, 1),
+(650400, 650000, '吐鲁番市', '吐鲁番', '', '', 2, 0, 1),
+(650402, 650400, '高昌区', '高昌', '89.18596', '42.94244', 3, 0, 1),
+(650421, 650400, '鄯善县', '鄯善', '90.21341', '42.86887', 3, 0, 1),
+(650422, 650400, '托克逊县', '托克逊', '88.65384', '42.79181', 3, 0, 1),
+(650500, 650000, '哈密市', '哈密', '', '', 2, 0, 1),
+(650502, 650500, '伊州区', '伊州', '93.51465', '42.82699', 3, 0, 1),
+(650521, 650500, '巴里坤哈萨克自治县', '巴里坤哈萨克自治县', '93.01654', '43.59873', 3, 0, 1),
+(650522, 650500, '伊吾县', '伊吾', '94.69741', '43.25451', 3, 0, 1),
+(652300, 650000, '昌吉回族自治州', '昌吉', '87.30401', '44.014576', 2, 0, 1),
+(652301, 652300, '昌吉市', '昌吉', '87.304115', '44.013184', 3, 0, 1),
+(652302, 652300, '阜康市', '阜康', '87.98384', '44.152153', 3, 0, 1),
+(652323, 652300, '呼图壁县', '呼图壁', '86.88861', '44.189342', 3, 0, 1),
+(652324, 652300, '玛纳斯县', '玛纳斯', '86.21769', '44.305626', 3, 0, 1),
+(652325, 652300, '奇台县', '奇台', '89.59144', '44.021996', 3, 0, 1),
+(652327, 652300, '吉木萨尔县', '吉木萨尔', '89.18129', '43.99716', 3, 0, 1),
+(652328, 652300, '木垒哈萨克自治县', '木垒', '90.28283', '43.832443', 3, 0, 1),
+(652700, 650000, '博尔塔拉蒙古自治州', '博尔塔拉', '82.074776', '44.90326', 2, 0, 1),
+(652701, 652700, '博乐市', '博乐', '82.072235', '44.903088', 3, 0, 1),
+(652702, 652700, '阿拉山口市', '阿拉山口', '82.074776', '44.90326', 3, 0, 1),
+(652722, 652700, '精河县', '精河', '82.89294', '44.605644', 3, 0, 1),
+(652723, 652700, '温泉县', '温泉', '81.03099', '44.97375', 3, 0, 1),
+(652800, 650000, '巴音郭楞蒙古自治州', '巴音郭楞', '86.15097', '41.76855', 2, 0, 1),
+(652801, 652800, '库尔勒市', '库尔勒', '86.14595', '41.763123', 3, 0, 1),
+(652822, 652800, '轮台县', '轮台', '84.24854', '41.781265', 3, 0, 1),
+(652823, 652800, '尉犁县', '尉犁', '86.26341', '41.33743', 3, 0, 1),
+(652824, 652800, '若羌县', '若羌', '88.16881', '39.023808', 3, 0, 1),
+(652825, 652800, '且末县', '且末', '85.53263', '38.13856', 3, 0, 1),
+(652826, 652800, '焉耆回族自治县', '焉耆', '86.5698', '42.06435', 3, 0, 1),
+(652827, 652800, '和静县', '和静', '86.39107', '42.31716', 3, 0, 1),
+(652828, 652800, '和硕县', '和硕', '86.864944', '42.268864', 3, 0, 1),
+(652829, 652800, '博湖县', '博湖', '86.63158', '41.980167', 3, 0, 1),
+(652900, 650000, '阿克苏地区', '阿克苏', '80.26507', '41.17071', 2, 0, 1),
+(652901, 652900, '阿克苏市', '阿克苏', '80.2629', '41.171272', 3, 0, 1),
+(652902, 652900, '库车市', '库车', '82.96212', '41.71741', 3, 0, 1),
+(652922, 652900, '温宿县', '温宿', '80.24327', '41.272995', 3, 0, 1),
+(652924, 652900, '沙雅县', '沙雅', '82.78077', '41.22627', 3, 0, 1),
+(652925, 652900, '新和县', '新和', '82.610825', '41.551174', 3, 0, 1),
+(652926, 652900, '拜城县', '拜城', '81.86988', '41.7961', 3, 0, 1),
+(652927, 652900, '乌什县', '乌什', '79.230804', '41.21587', 3, 0, 1),
+(652928, 652900, '阿瓦提县', '阿瓦提', '80.378426', '40.63842', 3, 0, 1),
+(652929, 652900, '柯坪县', '柯坪', '79.04785', '40.50624', 3, 0, 1),
+(653000, 650000, '克孜勒苏柯尔克孜自治州', '克孜勒苏柯尔克孜', '76.17283', '39.713432', 2, 0, 1),
+(653001, 653000, '阿图什市', '阿图什', '76.17394', '39.7129', 3, 0, 1),
+(653022, 653000, '阿克陶县', '阿克陶', '75.94516', '39.14708', 3, 0, 1),
+(653023, 653000, '阿合奇县', '阿合奇', '78.450165', '40.93757', 3, 0, 1),
+(653024, 653000, '乌恰县', '乌恰', '75.25969', '39.716633', 3, 0, 1),
+(653100, 650000, '喀什地区', '喀什', '75.989136', '39.467663', 2, 0, 1),
+(653101, 653100, '喀什市', '喀什', '75.98838', '39.46786', 3, 0, 1),
+(653121, 653100, '疏附县', '疏附', '75.863075', '39.378307', 3, 0, 1),
+(653122, 653100, '疏勒县', '疏勒', '76.05365', '39.39946', 3, 0, 1),
+(653123, 653100, '英吉沙县', '英吉沙', '76.17429', '38.92984', 3, 0, 1),
+(653124, 653100, '泽普县', '泽普', '77.27359', '38.191216', 3, 0, 1),
+(653125, 653100, '莎车县', '莎车', '77.248886', '38.414497', 3, 0, 1),
+(653126, 653100, '叶城县', '叶城', '77.42036', '37.884678', 3, 0, 1),
+(653127, 653100, '麦盖提县', '麦盖提', '77.651535', '38.903385', 3, 0, 1),
+(653128, 653100, '岳普湖县', '岳普湖', '76.7724', '39.23525', 3, 0, 1),
+(653129, 653100, '伽师县', '伽师', '76.74198', '39.494324', 3, 0, 1),
+(653130, 653100, '巴楚县', '巴楚', '78.55041', '39.783478', 3, 0, 1),
+(653131, 653100, '塔什库尔干塔吉克自治县', '塔什库尔干', '75.228065', '37.775436', 3, 0, 1),
+(653200, 650000, '和田地区', '和田', '79.92533', '37.110687', 2, 0, 1),
+(653201, 653200, '和田市', '和田市', '79.92754', '37.108944', 3, 0, 1),
+(653221, 653200, '和田县', '和田县', '79.81907', '37.12003', 3, 0, 1),
+(653222, 653200, '墨玉县', '墨玉', '79.736626', '37.27151', 3, 0, 1),
+(653223, 653200, '皮山县', '皮山', '78.2823', '37.616333', 3, 0, 1),
+(653224, 653200, '洛浦县', '洛浦', '80.18404', '37.074375', 3, 0, 1),
+(653225, 653200, '策勒县', '策勒', '80.80357', '37.00167', 3, 0, 1),
+(653226, 653200, '于田县', '于田', '81.66785', '36.85463', 3, 0, 1),
+(653227, 653200, '民丰县', '民丰', '82.69235', '37.06491', 3, 0, 1),
+(654000, 650000, '伊犁哈萨克自治州', '伊犁', '81.31795', '43.92186', 2, 0, 1),
+(654002, 654000, '伊宁市', '伊宁市', '81.316345', '43.92221', 3, 0, 1),
+(654003, 654000, '奎屯市', '奎屯', '84.9016', '44.423447', 3, 0, 1),
+(654004, 654000, '霍尔果斯市', '霍尔果斯', '80.41317', '44.19865', 3, 0, 1),
+(654021, 654000, '伊宁县', '伊宁县', '81.52467', '43.977875', 3, 0, 1),
+(654022, 654000, '察布查尔锡伯自治县', '察布查尔', '81.15087', '43.838882', 3, 0, 1),
+(654023, 654000, '霍城县', '霍城', '80.872505', '44.04991', 3, 0, 1),
+(654024, 654000, '巩留县', '巩留', '82.22704', '43.481617', 3, 0, 1),
+(654025, 654000, '新源县', '新源', '83.25849', '43.43425', 3, 0, 1),
+(654026, 654000, '昭苏县', '昭苏', '81.12603', '43.157764', 3, 0, 1),
+(654027, 654000, '特克斯县', '特克斯', '81.84006', '43.214863', 3, 0, 1),
+(654028, 654000, '尼勒克县', '尼勒克', '82.50412', '43.789738', 3, 0, 1),
+(654200, 650000, '塔城地区', '塔城', '82.98573', '46.7463', 2, 0, 1),
+(654201, 654200, '塔城市', '塔城', '82.983986', '46.74628', 3, 0, 1),
+(654202, 654200, '乌苏市', '乌苏', '84.67763', '44.430115', 3, 0, 1),
+(654221, 654200, '额敏县', '额敏', '83.622116', '46.522556', 3, 0, 1),
+(654223, 654200, '沙湾县', '沙湾', '85.622505', '44.329544', 3, 0, 1),
+(654224, 654200, '托里县', '托里', '83.60469', '45.935863', 3, 0, 1),
+(654225, 654200, '裕民县', '裕民', '82.982155', '46.20278', 3, 0, 1),
+(654226, 654200, '和布克赛尔蒙古自治县', '和布克赛尔', '85.73355', '46.793', 3, 0, 1),
+(654300, 650000, '阿勒泰地区', '阿勒泰', '88.13963', '47.848392', 2, 0, 1),
+(654301, 654300, '阿勒泰市', '阿勒泰', '88.13874', '47.84891', 3, 0, 1),
+(654321, 654300, '布尔津县', '布尔津', '86.86186', '47.70453', 3, 0, 1),
+(654322, 654300, '富蕴县', '富蕴', '89.524994', '46.993107', 3, 0, 1),
+(654323, 654300, '福海县', '福海', '87.49457', '47.11313', 3, 0, 1),
+(654324, 654300, '哈巴河县', '哈巴河', '86.41896', '48.059284', 3, 0, 1),
+(654325, 654300, '青河县', '青河', '90.38156', '46.672447', 3, 0, 1),
+(654326, 654300, '吉木乃县', '吉木乃', '85.87606', '47.43463', 3, 0, 1),
+(659000, 650000, '直辖县级行政区', '直辖县级行政区', '', '', 2, 0, 1),
+(659001, 659000, '石河子市', '石河子', '86.04108', '44.305885', 3, 0, 1),
+(659002, 659000, '阿拉尔市', '阿拉尔', '81.28588', '40.541916', 3, 0, 1),
+(659003, 659000, '图木舒克市', '图木舒克', '79.07798', '39.867317', 3, 0, 1),
+(659004, 659000, '五家渠市', '五家渠', '87.526886', '44.1674', 3, 0, 1),
+(659005, 659000, '北屯市', '北屯', '87.80014', '47.36327', 3, 0, 1),
+(659006, 659000, '铁门关市', '铁门关', '85.67583', '41.86868', 3, 0, 1),
+(659007, 659000, '双河市', '双河', '82.35501', '44.84418', 3, 0, 1),
+(659008, 659000, '可克达拉市', '可克达拉', '81.04476', '43.94799', 3, 0, 1),
+(659009, 659000, '昆玉市', '昆玉', '79.29133', '37.20948', 3, 0, 1),
+(659010, 659000, '胡杨河市', '胡杨河', '84.827387', '44.69295', 3, 0, 1),
+(714368, 0, '香港特别行政区', '香港', '114.173355', '22.320048', 1, 0, 1),
+(714390, 0, '澳门特别行政区', '澳门', '113.549090', '22.198951', 1, 0, 1),
+(714401, 0, '台湾省', '台湾', '121.509062', '25.044332', 1, 0, 1),
+(714402, 714401, '彰化县', '彰化县', '120.416000', '24.000000', 2, 0, 1),
+(714403, 714402, '芳苑乡', '芳苑乡', '120.416000', '24.000000', 3, 0, 1),
+(714632, 714402, '芬园乡', '芬园乡', '120.416000', '24.000000', 3, 0, 1),
+(714701, 714402, '福兴乡', '福兴乡', '120.416000', '24.000000', 3, 0, 1),
+(714777, 714402, '和美镇', '和美镇', '120.416000', '24.000000', 3, 0, 1),
+(715055, 714402, '花坛乡', '花坛乡', '120.416000', '24.000000', 3, 0, 1),
+(715172, 714402, '鹿港镇', '鹿港镇', '120.416000', '24.000000', 3, 0, 1),
+(715490, 714402, '埤头乡', '埤头乡', '120.464542', '23.890392', 3, 0, 1),
+(715602, 714402, '埔心乡', '埔心乡', '120.416000', '24.000000', 3, 0, 1),
+(715745, 714402, '埔盐乡', '埔盐乡', '120.416000', '24.000000', 3, 0, 1),
+(715795, 714402, '伸港乡', '伸港乡', '120.416000', '24.000000', 3, 0, 1),
+(715960, 714402, '社头乡', '社头乡', '120.416000', '24.000000', 3, 0, 1),
+(716105, 714402, '田尾乡', '田尾乡', '120.416000', '24.000000', 3, 0, 1),
+(716202, 714402, '田中镇', '田中镇', '120.416000', '24.000000', 3, 0, 1),
+(716341, 714402, '线西乡', '线西乡', '120.416000', '24.000000', 3, 0, 1),
+(716421, 714402, '溪湖镇', '溪湖镇', '120.416000', '24.000000', 3, 0, 1),
+(716750, 714402, '秀水乡', '秀水乡', '120.416000', '24.000000', 3, 0, 1),
+(716874, 714402, '溪州乡', '溪州乡', '120.492906', '23.853578', 3, 0, 1),
+(717107, 714402, '永靖乡', '永靖乡', '120.416000', '24.000000', 3, 0, 1),
+(717238, 714402, '员林市', '员林市', '120.416000', '24.000000', 3, 0, 1),
+(717447, 714402, '竹塘乡', '竹塘乡', '120.416000', '24.000000', 3, 0, 1),
+(717531, 714401, '新北市', '新北市', '121.465746', '25.012366', 2, 0, 1),
+(717532, 717531, '八里区', '八里区', '121.465746', '25.012366', 3, 0, 1),
+(717645, 717531, '板桥区', '板桥区', '121.465746', '25.012366', 3, 0, 1),
+(717902, 717531, '贡寮区', '贡寮区', '121.465746', '25.012366', 3, 0, 1),
+(717955, 717531, '金山区', '金山区', '121.465746', '25.012366', 3, 0, 1),
+(718036, 717531, '林口区', '林口区', '121.465746', '25.012366', 3, 0, 1),
+(718195, 717531, '芦洲区', '芦洲区', '121.465746', '25.012366', 3, 0, 1),
+(718266, 717531, '坪林区', '坪林区', '121.465746', '25.012366', 3, 0, 1),
+(718327, 717531, '平溪区', '平溪区', '121.465746', '25.012366', 3, 0, 1),
+(718375, 717531, '瑞芳区', '瑞芳区', '121.465746', '25.012366', 3, 0, 1),
+(718490, 717531, '三重区', '三重区', '121.465746', '25.012366', 3, 0, 1),
+(718786, 717531, '三峡区', '三峡区', '121.465746', '25.012366', 3, 0, 1),
+(718879, 717531, '三芝区', '三芝区', '121.465746', '25.012366', 3, 0, 1),
+(718980, 717531, '深坑区', '深坑区', '121.465746', '25.012366', 3, 0, 1),
+(719023, 717531, '石碇区', '石碇区', '121.465746', '25.012366', 3, 0, 1),
+(719115, 717531, '石门区', '石门区', '121.465746', '25.012366', 3, 0, 1),
+(719155, 717531, '双溪区', '双溪区', '121.465746', '25.012366', 3, 0, 1),
+(719243, 717531, '树林区', '树林区', '121.465746', '25.012366', 3, 0, 1),
+(719382, 717531, '泰山区', '泰山区', '121.465746', '25.012366', 3, 0, 1),
+(719498, 717531, '淡水区', '淡水区', '121.465746', '25.012366', 3, 0, 1),
+(719731, 717531, '土城区', '土城区', '121.465746', '25.012366', 3, 0, 1),
+(719868, 714401, '澎湖县', '澎湖县', '119.566417', '23.569733', 2, 0, 1),
+(719869, 719868, '白沙乡', '白沙乡', '119.566417', '23.569733', 3, 0, 1),
+(719890, 719868, '湖西乡', '湖西乡', '119.566417', '23.569733', 3, 0, 1),
+(719916, 719868, '马公市', '马公市', '119.566417', '23.569733', 3, 0, 1),
+(720065, 719868, '七美乡', '七美乡', '119.566417', '23.569733', 3, 0, 1),
+(720090, 719868, '望安乡', '望安乡', '119.566417', '23.569733', 3, 0, 1),
+(720102, 719868, '西屿乡', '西屿乡', '119.566417', '23.569733', 3, 0, 1),
+(720118, 714401, '屏东县', '屏东县', '120.487928', '22.682802', 2, 0, 1),
+(720119, 720118, '三地门乡', '三地门乡', '120.487928', '22.682802', 3, 0, 1),
+(720142, 720118, '狮子乡', '狮子乡', '120.487928', '22.682802', 3, 0, 1),
+(720163, 720118, '泰武乡', '泰武乡', '120.626012', '22.591307', 3, 0, 1),
+(720186, 720118, '万丹乡', '万丹乡', '120.486423', '22.588123', 3, 0, 1),
+(720415, 720118, '万峦乡', '万峦乡', '120.566478', '22.571966', 3, 0, 1),
+(720480, 720118, '雾臺乡', '雾臺乡', '120.727653', '22.743675', 3, 0, 1),
+(720502, 720118, '新埤乡', '新埤乡', '120.545190', '22.465998', 3, 0, 1),
+(720553, 720118, '新园乡', '新园乡', '120.459758', '22.544147', 3, 0, 1),
+(720649, 720118, '盐埔乡', '盐埔乡', '120.487928', '22.682802', 3, 0, 1),
+(720748, 720118, '竹田乡', '竹田乡', '120.487928', '22.682802', 3, 0, 1),
+(720835, 720118, '长治乡', '长治乡', '120.487928', '22.682802', 3, 0, 1),
+(720975, 720118, '潮州镇', '潮州镇', '120.487928', '22.682802', 3, 0, 1),
+(721293, 720118, '车城乡', '车城乡', '120.707694', '22.072115', 3, 0, 1),
+(721335, 720118, '春日乡', '春日乡', '120.622000', '22.368284', 3, 0, 1),
+(721344, 720118, '东港镇', '东港镇', '120.487928', '22.682802', 3, 0, 1),
+(721490, 720118, '枋寮乡', '枋寮乡', '120.487928', '22.682802', 3, 0, 1),
+(721617, 720118, '枋山乡', '枋山乡', '120.647762', '22.262550', 3, 0, 1),
+(721638, 720118, '高树乡', '高树乡', '120.595945', '22.825131', 3, 0, 1),
+(721805, 720118, '恆春镇', '恆春镇', '120.487928', '22.682802', 3, 0, 1),
+(721930, 720118, '佳冬乡', '佳冬乡', '120.545370', '22.417786', 3, 0, 1),
+(722024, 714401, '臺中市', '臺中市', '0.000000', '0.000000', 2, 0, 1),
+(722025, 722024, '梧栖区', '梧栖区', '0.000000', '0.000000', 3, 0, 1),
+(722212, 722024, '乌日区', '乌日区', '0.000000', '0.000000', 3, 0, 1),
+(722402, 722024, '新社区', '新社区', '0.000000', '0.000000', 3, 0, 1),
+(722474, 722024, '西屯区', '西屯区', '0.000000', '0.000000', 3, 0, 1),
+(722699, 722024, '北屯区', '北屯区', '0.000000', '0.000000', 3, 0, 1),
+(722879, 722024, '中区', '中区', '0.000000', '0.000000', 3, 0, 1),
+(722923, 722024, '大肚区', '大肚区', '0.000000', '0.000000', 3, 0, 1),
+(723021, 722024, '大甲区', '大甲区', '0.000000', '0.000000', 3, 0, 1),
+(723211, 722024, '大里区', '大里区', '0.000000', '0.000000', 3, 0, 1),
+(723592, 722024, '大雅区', '大雅区', '0.000000', '0.000000', 3, 0, 1),
+(723756, 722024, '大安区', '大安区', '0.000000', '0.000000', 3, 0, 1),
+(723802, 722024, '东势区', '东势区', '0.000000', '0.000000', 3, 0, 1),
+(723966, 722024, '东区', '东区', '0.000000', '0.000000', 3, 0, 1),
+(724148, 722024, '丰原区', '丰原区', '0.000000', '0.000000', 3, 0, 1),
+(724424, 722024, '和平区', '和平区', '0.000000', '0.000000', 3, 0, 1),
+(724504, 722024, '后里区', '后里区', '0.000000', '0.000000', 3, 0, 1),
+(724656, 722024, '龙井区', '龙井区', '0.000000', '0.000000', 3, 0, 1),
+(724797, 722024, '南屯区', '南屯区', '0.000000', '0.000000', 3, 0, 1),
+(724872, 722024, '北区', '北区', '0.000000', '0.000000', 3, 0, 1),
+(725199, 722024, '清水区', '清水区', '0.000000', '0.000000', 3, 0, 1),
+(725488, 714401, '臺南市', '臺南市', '0.000000', '0.000000', 2, 0, 1),
+(725489, 725488, '佳里区', '佳里区', '0.000000', '0.000000', 3, 0, 1),
+(725588, 725488, '将军区', '将军区', '0.000000', '0.000000', 3, 0, 1),
+(725620, 725488, '六甲区', '六甲区', '0.000000', '0.000000', 3, 0, 1),
+(725679, 725488, '柳营区', '柳营区', '0.000000', '0.000000', 3, 0, 1),
+(725795, 725488, '龙崎区', '龙崎区', '0.000000', '0.000000', 3, 0, 1),
+(725841, 725488, '麻豆区', '麻豆区', '0.000000', '0.000000', 3, 0, 1),
+(725927, 725488, '南化区', '南化区', '0.000000', '0.000000', 3, 0, 1),
+(725938, 725488, '楠西区', '楠西区', '0.000000', '0.000000', 3, 0, 1),
+(725973, 725488, '北区', '北区', '0.000000', '0.000000', 3, 0, 1),
+(726300, 725488, '七股区', '七股区', '0.000000', '0.000000', 3, 0, 1),
+(726338, 725488, '仁德区', '仁德区', '0.000000', '0.000000', 3, 0, 1),
+(726539, 725488, '善化区', '善化区', '0.000000', '0.000000', 3, 0, 1),
+(726675, 725488, '山上区', '山上区', '0.000000', '0.000000', 3, 0, 1),
+(726691, 725488, '南区', '南区', '120.679305', '24.133453', 3, 0, 1),
+(727041, 725488, '中西区', '中西区', '0.000000', '0.000000', 3, 0, 1),
+(727251, 725488, '下营区', '下营区', '0.000000', '0.000000', 3, 0, 1),
+(727339, 725488, '西港区', '西港区', '0.000000', '0.000000', 3, 0, 1),
+(727375, 725488, '新化区', '新化区', '0.000000', '0.000000', 3, 0, 1),
+(727425, 725488, '新市区', '新市区', '0.000000', '0.000000', 3, 0, 1),
+(727529, 725488, '新营区', '新营区', '0.000000', '0.000000', 3, 0, 1),
+(727730, 714401, '臺北市', '臺北市', '121.517057', '25.048074', 2, 0, 1),
+(727731, 727730, '北投区', '北投区', '121.517057', '25.048074', 3, 0, 1),
+(727897, 727730, '大同区', '大同区', '121.517057', '25.048074', 3, 0, 1),
+(728070, 727730, '大安区', '大安区', '121.517057', '25.048074', 3, 0, 1),
+(728116, 727730, '南港区', '南港区', '121.517057', '25.048074', 3, 0, 1),
+(728220, 727730, '内湖区', '内湖区', '121.517057', '25.048074', 3, 0, 1),
+(728340, 727730, '士林区', '士林区', '121.517057', '25.048074', 3, 0, 1),
+(728550, 727730, '松山区', '松山区', '121.517057', '25.048074', 3, 0, 1),
+(728713, 727730, '万华区', '万华区', '121.517057', '25.048074', 3, 0, 1),
+(728920, 727730, '文山区', '文山区', '121.517057', '25.048074', 3, 0, 1),
+(729073, 727730, '信义区', '信义区', '121.517057', '25.048074', 3, 0, 1),
+(729277, 727730, '中山区', '中山区', '121.517057', '25.048074', 3, 0, 1),
+(729583, 727730, '中正区', '中正区', '121.517057', '25.048074', 3, 0, 1),
+(729928, 714401, '臺东县', '臺东县', '0.000000', '0.000000', 2, 0, 1),
+(729929, 729928, '卑南乡', '卑南乡', '121.117213', '22.781744', 3, 0, 1),
+(729994, 729928, '长滨乡', '长滨乡', '0.000000', '0.000000', 3, 0, 1),
+(730033, 729928, '成功镇', '成功镇', '0.000000', '0.000000', 3, 0, 1),
+(730107, 729928, '池上乡', '池上乡', '121.212999', '23.123275', 3, 0, 1),
+(730196, 729928, '达仁乡', '达仁乡', '120.878316', '22.296142', 3, 0, 1),
+(730219, 729928, '大武乡', '大武乡', '0.000000', '0.000000', 3, 0, 1),
+(730268, 729928, '东河乡', '东河乡', '0.000000', '0.000000', 3, 0, 1),
+(730308, 729928, '关山镇', '关山镇', '121.158084', '23.047483', 3, 0, 1),
+(730384, 729928, '海端乡', '海端乡', '121.172009', '23.101079', 3, 0, 1),
+(730409, 729928, '金峰乡', '金峰乡', '0.000000', '0.000000', 3, 0, 1),
+(730416, 729928, '兰屿乡', '兰屿乡', '0.000000', '0.000000', 3, 0, 1),
+(730423, 729928, '绿岛乡', '绿岛乡', '0.000000', '0.000000', 3, 0, 1),
+(730438, 729928, '鹿野乡', '鹿野乡', '0.000000', '0.000000', 3, 0, 1),
+(730510, 729928, '太麻里乡', '太麻里乡', '120.999365', '22.610919', 3, 0, 1),
+(730565, 729928, '臺东市', '臺东市', '0.000000', '0.000000', 3, 0, 1),
+(730832, 729928, '延平乡', '延平乡', '0.000000', '0.000000', 3, 0, 1),
+(730843, 714401, '桃园市', '桃园市', '121.083000', '25.000000', 2, 0, 1),
+(730844, 730843, '八德区', '八德区', '121.083000', '25.000000', 3, 0, 1),
+(731212, 730843, '大溪区', '大溪区', '121.083000', '25.000000', 3, 0, 1),
+(731471, 730843, '大园区', '大园区', '121.083000', '25.000000', 3, 0, 1),
+(731767, 730843, '復兴区', '復兴区', '121.083000', '25.000000', 3, 0, 1),
+(731835, 730843, '观音区', '观音区', '121.083000', '25.000000', 3, 0, 1),
+(732079, 730843, '龟山区', '龟山区', '121.083000', '25.000000', 3, 0, 1),
+(732469, 730843, '龙潭区', '龙潭区', '121.083000', '25.000000', 3, 0, 1),
+(732800, 730843, '芦竹区', '芦竹区', '121.083000', '25.000000', 3, 0, 1),
+(733144, 730843, '平镇区', '平镇区', '121.083000', '25.000000', 3, 0, 1),
+(733179, 730843, '桃园区', '桃园区', '121.083000', '25.000000', 3, 0, 1),
+(733390, 730843, '新屋区', '新屋区', '121.083000', '25.000000', 3, 0, 1),
+(733537, 730843, '杨梅区', '杨梅区', '121.083000', '25.000000', 3, 0, 1),
+(733876, 730843, '中坜区', '中坜区', '121.083000', '25.000000', 3, 0, 1),
+(734179, 714401, '宜兰县', '宜兰县', '121.500000', '24.600000', 2, 0, 1),
+(734180, 734179, '大同乡', '大同乡', '121.500000', '24.600000', 3, 0, 1),
+(734246, 734179, '钓鱼臺', '钓鱼臺', '121.500000', '24.600000', 3, 0, 1),
+(734248, 734179, '冬山乡', '冬山乡', '121.500000', '24.600000', 3, 0, 1),
+(734579, 734179, '礁溪乡', '礁溪乡', '121.500000', '24.600000', 3, 0, 1),
+(734681, 734179, '罗东镇', '罗东镇', '121.500000', '24.600000', 3, 0, 1),
+(734842, 734179, '南澳乡', '南澳乡', '121.500000', '24.600000', 3, 0, 1),
+(734865, 734179, '三星乡', '三星乡', '121.500000', '24.600000', 3, 0, 1),
+(735104, 734179, '苏澳镇', '苏澳镇', '121.500000', '24.600000', 3, 0, 1),
+(735319, 734179, '头城镇', '头城镇', '121.500000', '24.600000', 3, 0, 1),
+(735419, 734179, '五结乡', '五结乡', '121.796468', '24.685615', 3, 0, 1),
+(735620, 734179, '宜兰市', '宜兰市', '121.500000', '24.600000', 3, 0, 1),
+(735851, 734179, '员山乡', '员山乡', '121.500000', '24.600000', 3, 0, 1),
+(735970, 734179, '壮围乡', '壮围乡', '121.500000', '24.600000', 3, 0, 1),
+(736051, 714401, '南投县', '南投县', '120.830000', '23.830000', 2, 0, 1),
+(736052, 736051, '草屯镇', '草屯镇', '120.830000', '23.830000', 3, 0, 1),
+(736305, 736051, '国姓乡', '国姓乡', '120.830000', '23.830000', 3, 0, 1),
+(736356, 736051, '集集镇', '集集镇', '120.830000', '23.830000', 3, 0, 1),
+(736449, 736051, '鹿谷乡', '鹿谷乡', '120.830000', '23.830000', 3, 0, 1),
+(736522, 736051, '名间乡', '名间乡', '120.830000', '23.830000', 3, 0, 1),
+(736622, 736051, '南投市', '南投市', '120.830000', '23.830000', 3, 0, 1),
+(736887, 736051, '埔里镇', '埔里镇', '120.830000', '23.830000', 3, 0, 1),
+(737266, 736051, '仁爱乡', '仁爱乡', '120.830000', '23.830000', 3, 0, 1),
+(737337, 736051, '水里乡', '水里乡', '120.830000', '23.830000', 3, 0, 1),
+(737496, 736051, '信义乡', '信义乡', '120.830000', '23.830000', 3, 0, 1),
+(737533, 736051, '鱼池乡', '鱼池乡', '120.830000', '23.830000', 3, 0, 1),
+(737591, 736051, '中寮乡', '中寮乡', '120.830000', '23.830000', 3, 0, 1),
+(737625, 736051, '竹山镇', '竹山镇', '120.830000', '23.830000', 3, 0, 1),
+(737856, 714401, '南海岛', '南海岛', '0.000000', '0.000000', 2, 0, 1),
+(737857, 737856, '东沙群岛', '东沙群岛', '0.000000', '0.000000', 3, 0, 1),
+(737859, 737856, '南沙群岛', '南沙群岛', '0.000000', '0.000000', 3, 0, 1),
+(737861, 714401, '苗栗县', '苗栗县', '120.818985', '24.561601', 2, 0, 1),
+(737862, 737861, '头屋乡', '头屋乡', '120.818985', '24.561601', 3, 0, 1),
+(737894, 737861, '西湖乡', '西湖乡', '120.743700', '24.556610', 3, 0, 1),
+(737948, 737861, '苑里镇', '苑里镇', '120.818985', '24.561601', 3, 0, 1),
+(738050, 737861, '造桥乡', '造桥乡', '120.818985', '24.561601', 3, 0, 1),
+(738158, 737861, '竹南镇', '竹南镇', '120.872636', '24.685510', 3, 0, 1),
+(738454, 737861, '卓兰镇', '卓兰镇', '120.823440', '24.309510', 3, 0, 1),
+(738528, 737861, '大湖乡', '大湖乡', '120.863640', '24.422548', 3, 0, 1),
+(738619, 737861, '公馆乡', '公馆乡', '120.818985', '24.561601', 3, 0, 1),
+(738695, 737861, '后龙镇', '后龙镇', '120.786474', '24.612613', 3, 0, 1),
+(738882, 737861, '苗栗市', '苗栗市', '120.819288', '24.561582', 3, 0, 1),
+(739250, 737861, '南庄乡', '南庄乡', '120.818985', '24.561601', 3, 0, 1),
+(739302, 737861, '三湾乡', '三湾乡', '120.818985', '24.561601', 3, 0, 1),
+(739369, 737861, '三义乡', '三义乡', '120.765515', '24.413037', 3, 0, 1),
+(739419, 737861, '狮潭乡', '狮潭乡', '120.918024', '24.540004', 3, 0, 1),
+(739465, 737861, '泰安乡', '泰安乡', '120.818985', '24.561601', 3, 0, 1),
+(739487, 737861, '铜锣乡', '铜锣乡', '120.786475', '24.489502', 3, 0, 1),
+(739564, 737861, '通霄镇', '通霄镇', '120.676696', '24.489084', 3, 0, 1),
+(739642, 737861, '头份市', '头份市', '120.818985', '24.561601', 3, 0, 1),
+(739957, 714401, '嘉义市', '嘉义市', '120.452538', '23.481568', 2, 0, 1),
+(739958, 739957, '东区', '东区', '120.452538', '23.481568', 3, 0, 1),
+(740140, 739957, '西区', '西区', '120.452538', '23.481568', 3, 0, 1),
+(740510, 714401, '嘉义县', '嘉义县', '120.452538', '23.481568', 2, 0, 1),
+(740511, 740510, '阿里山乡', '阿里山乡', '120.452538', '23.481568', 3, 0, 1),
+(740536, 740510, '布袋镇', '布袋镇', '120.452538', '23.481568', 3, 0, 1),
+(740625, 740510, '大林镇', '大林镇', '120.452538', '23.481568', 3, 0, 1),
+(740746, 740510, '大埔乡', '大埔乡', '120.452538', '23.481568', 3, 0, 1),
+(740792, 740510, '东石乡', '东石乡', '120.452538', '23.481568', 3, 0, 1),
+(740845, 740510, '番路乡', '番路乡', '120.452538', '23.481568', 3, 0, 1),
+(740943, 740510, '六脚乡', '六脚乡', '120.452538', '23.481568', 3, 0, 1),
+(740975, 740510, '鹿草乡', '鹿草乡', '120.452538', '23.481568', 3, 0, 1),
+(741010, 740510, '梅山乡', '梅山乡', '120.452538', '23.481568', 3, 0, 1),
+(741137, 740510, '民雄乡', '民雄乡', '120.452538', '23.481568', 3, 0, 1),
+(741312, 740510, '朴子市', '朴子市', '120.452538', '23.481568', 3, 0, 1),
+(741451, 740510, '水上乡', '水上乡', '120.452538', '23.481568', 3, 0, 1),
+(741550, 740510, '太保市', '太保市', '120.332737', '23.459115', 3, 0, 1),
+(741646, 740510, '溪口乡', '溪口乡', '120.452538', '23.481568', 3, 0, 1),
+(741688, 740510, '新港乡', '新港乡', '120.452538', '23.481568', 3, 0, 1),
+(741750, 740510, '义竹乡', '义竹乡', '120.452538', '23.481568', 3, 0, 1),
+(741785, 740510, '中埔乡', '中埔乡', '120.452538', '23.481568', 3, 0, 1),
+(741936, 740510, '竹崎乡', '竹崎乡', '120.452538', '23.481568', 3, 0, 1),
+(742126, 714401, '新竹市', '新竹市', '120.968798', '24.806738', 2, 0, 1),
+(742127, 742126, '东区', '东区', '120.973544', '24.805226', 3, 0, 1),
+(742309, 742126, '北区', '北区', '120.968798', '24.806738', 3, 0, 1),
+(742636, 714401, '新竹县', '新竹县', '120.968798', '24.806738', 2, 0, 1),
+(742637, 742636, '峨眉乡', '峨眉乡', '120.968798', '24.806738', 3, 0, 1),
+(742674, 742636, '关西镇', '关西镇', '120.968798', '24.806738', 3, 0, 1),
+(742797, 742636, '横山乡', '横山乡', '120.968798', '24.806738', 3, 0, 1),
+(742852, 742636, '湖口乡', '湖口乡', '120.968798', '24.806738', 3, 0, 1),
+(743201, 742636, '尖石乡', '尖石乡', '120.968798', '24.806738', 3, 0, 1),
+(743246, 742636, '芎林乡', '芎林乡', '120.968798', '24.806738', 3, 0, 1),
+(743298, 742636, '五峰乡', '五峰乡', '120.968798', '24.806738', 3, 0, 1),
+(743319, 742636, '新丰乡', '新丰乡', '120.968798', '24.806738', 3, 0, 1),
+(743414, 742636, '新埔镇', '新埔镇', '120.968798', '24.806738', 3, 0, 1),
+(743527, 742636, '竹北市', '竹北市', '120.968798', '24.806738', 3, 0, 1),
+(743565, 742636, '竹东镇', '竹东镇', '120.968798', '24.806738', 3, 0, 1),
+(743725, 742636, '宝山乡', '宝山乡', '120.968798', '24.806738', 3, 0, 1),
+(743888, 742636, '北埔乡', '北埔乡', '120.968798', '24.806738', 3, 0, 1),
+(743938, 714401, '花莲县', '花莲县', '121.300000', '23.830000', 2, 0, 1),
+(743939, 743938, '卓溪乡', '卓溪乡', '121.301890', '23.344908', 3, 0, 1),
+(743956, 743938, '丰滨乡', '丰滨乡', '121.300000', '23.830000', 3, 0, 1),
+(743993, 743938, '凤林镇', '凤林镇', '121.300000', '23.830000', 3, 0, 1),
+(744128, 743938, '富里乡', '富里乡', '121.244694', '23.175468', 3, 0, 1),
+(744185, 743938, '光復乡', '光復乡', '121.300000', '23.830000', 3, 0, 1),
+(744246, 743938, '花莲市', '花莲市', '121.606927', '23.981993', 3, 0, 1),
+(744625, 743938, '吉安乡', '吉安乡', '121.300000', '23.830000', 3, 0, 1),
+(745050, 743938, '瑞穗乡', '瑞穗乡', '121.373373', '23.496080', 3, 0, 1),
+(745196, 743938, '寿丰乡', '寿丰乡', '121.506030', '23.869774', 3, 0, 1),
+(745354, 743938, '万荣乡', '万荣乡', '121.300000', '23.830000', 3, 0, 1),
+(745363, 743938, '新城乡', '新城乡', '121.604120', '24.039243', 3, 0, 1),
+(745486, 743938, '秀林乡', '秀林乡', '121.300000', '23.830000', 3, 0, 1),
+(745532, 743938, '玉里镇', '玉里镇', '121.312109', '23.334236', 3, 0, 1),
+(745674, 714401, '高雄市', '高雄市', '120.311922', '22.620856', 2, 0, 1),
+(745675, 745674, '阿莲区', '阿莲区', '120.311922', '22.620856', 3, 0, 1),
+(745715, 745674, '大寮区', '大寮区', '120.311922', '22.620856', 3, 0, 1),
+(746083, 745674, '大社区', '大社区', '120.311922', '22.620856', 3, 0, 1),
+(746199, 745674, '大树区', '大树区', '120.311922', '22.620856', 3, 0, 1),
+(746294, 745674, '凤山区', '凤山区', '120.311922', '22.620856', 3, 0, 1),
+(746624, 745674, '冈山区', '冈山区', '120.311922', '22.620856', 3, 0, 1),
+(746906, 745674, '鼓山区', '鼓山区', '120.311922', '22.620856', 3, 0, 1),
+(747053, 745674, '湖内区', '湖内区', '120.311922', '22.620856', 3, 0, 1),
+(747108, 745674, '甲仙区', '甲仙区', '120.587980', '23.083957', 3, 0, 1),
+(747150, 745674, '苓雅区', '苓雅区', '120.311922', '22.620856', 3, 0, 1),
+(747342, 745674, '林园区', '林园区', '120.311922', '22.620856', 3, 0, 1),
+(747481, 745674, '六龟区', '六龟区', '120.311922', '22.620856', 3, 0, 1),
+(747536, 745674, '路竹区', '路竹区', '120.311922', '22.620856', 3, 0, 1),
+(747643, 745674, '茂林区', '茂林区', '120.311922', '22.620856', 3, 0, 1),
+(747647, 745674, '美浓区', '美浓区', '120.542419', '22.894882', 3, 0, 1),
+(747764, 745674, '弥陀区', '弥陀区', '120.250672', '22.781561', 3, 0, 1),
+(747894, 745674, '那玛夏区', '那玛夏区', '120.311922', '22.620856', 3, 0, 1),
+(747902, 745674, '楠梓区', '楠梓区', '120.311922', '22.620856', 3, 0, 1),
+(748258, 745674, '内门区', '内门区', '120.311922', '22.620856', 3, 0, 1),
+(748344, 745674, '鸟松区', '鸟松区', '120.311922', '22.620856', 3, 0, 1),
+(748553, 714401, '基隆市', '基隆市', '121.746248', '25.130741', 2, 0, 1),
+(748554, 748553, '安乐区', '安乐区', '121.746248', '25.130741', 3, 0, 1),
+(748581, 748553, '暖暖区', '暖暖区', '121.746248', '25.130741', 3, 0, 1),
+(748599, 748553, '七堵区', '七堵区', '121.746248', '25.130741', 3, 0, 1),
+(748670, 748553, '仁爱区', '仁爱区', '121.746248', '25.130741', 3, 0, 1),
+(748716, 748553, '信义区', '信义区', '121.746248', '25.130741', 3, 0, 1),
+(748920, 748553, '中山区', '中山区', '121.746248', '25.130741', 3, 0, 1),
+(749226, 748553, '中正区', '中正区', '121.768000', '25.151647', 3, 0, 1),
+(749571, 714401, '金门县', '金门县', '118.317089', '24.432706', 2, 0, 1),
+(749572, 749571, '金城镇', '金城镇', '118.317089', '24.432706', 3, 0, 1),
+(749647, 749571, '金湖镇', '金湖镇', '118.317089', '24.432706', 3, 0, 1),
+(749752, 749571, '金宁乡', '金宁乡', '118.317089', '24.432706', 3, 0, 1),
+(749810, 749571, '金沙镇', '金沙镇', '118.317089', '24.432706', 3, 0, 1),
+(749894, 749571, '烈屿乡', '烈屿乡', '118.317089', '24.432706', 3, 0, 1),
+(749928, 749571, '乌坵乡', '乌坵乡', '118.317089', '24.432706', 3, 0, 1),
+(749930, 714401, '连江县', '连江县', '119.539704', '26.197364', 2, 0, 1),
+(749931, 749930, '北竿乡', '北竿乡', '119.539704', '26.197364', 3, 0, 1),
+(749938, 749930, '东引乡', '东引乡', '119.539704', '26.197364', 3, 0, 1),
+(749941, 749930, '莒光乡', '莒光乡', '119.539704', '26.197364', 3, 0, 1),
+(749947, 749930, '南竿乡', '南竿乡', '119.539704', '26.197364', 3, 0, 1),
+(749957, 714401, '云林县', '云林县', '120.527173', '23.696887', 2, 0, 1),
+(749958, 749957, '褒忠乡', '褒忠乡', '120.309069', '23.695652', 3, 0, 1),
+(749991, 749957, '北港镇', '北港镇', '120.296759', '23.572428', 3, 0, 1),
+(750170, 749957, '莿桐乡', '莿桐乡', '120.497033', '23.757251', 3, 0, 1),
+(750218, 749957, '大埤乡', '大埤乡', '120.527173', '23.696887', 3, 0, 1),
+(750291, 749957, '东势乡', '东势乡', '120.527173', '23.696887', 3, 0, 1),
+(750363, 749957, '斗六市', '斗六市', '120.527173', '23.696887', 3, 0, 1),
+(750795, 749957, '斗南镇', '斗南镇', '120.527173', '23.696887', 3, 0, 1),
+(751009, 749957, '二崙乡', '二崙乡', '120.527173', '23.696887', 3, 0, 1),
+(751071, 749957, '古坑乡', '古坑乡', '120.558553', '23.644734', 3, 0, 1),
+(751147, 749957, '虎尾镇', '虎尾镇', '120.429231', '23.707796', 3, 0, 1),
+(751400, 749957, '口湖乡', '口湖乡', '120.178640', '23.585506', 3, 0, 1),
+(751493, 749957, '林内乡', '林内乡', '120.527173', '23.696887', 3, 0, 1),
+(751555, 749957, '崙背乡', '崙背乡', '120.527173', '23.696887', 3, 0, 1),
+(751674, 749957, '麦寮乡', '麦寮乡', '120.527173', '23.696887', 3, 0, 1),
+(751764, 749957, '水林乡', '水林乡', '120.241228', '23.571067', 3, 0, 1),
+(751832, 749957, '四湖乡', '四湖乡', '120.220781', '23.635426', 3, 0, 1),
+(751907, 749957, '臺西乡', '臺西乡', '120.196139', '23.702821', 3, 0, 1),
+(751956, 749957, '土库镇', '土库镇', '120.527173', '23.696887', 3, 0, 1),
+(752034, 749957, '西螺镇', '西螺镇', '120.457123', '23.797412', 3, 0, 1),
+(752149, 749957, '元长乡', '元长乡', '120.311052', '23.649577', 3, 0, 1),
+(752150, 714368, '香港特别行政区', '香港', '', '', 2, 0, 1),
+(752151, 752150, '中西区', '中西区', '', '', 3, 0, 1),
+(752152, 752150, '东区', '东区', '', '', 3, 0, 1),
+(752153, 752150, '九龙城区', '九龙城区', '', '', 3, 0, 1),
+(752154, 752150, '观塘区', '观塘区', '114.231268', '22.309430', 3, 0, 1),
+(752155, 752150, '南区', '南区', '114.174134', '22.246760', 3, 0, 1),
+(752156, 752150, '深水埗区', '深水埗区', '', '', 3, 0, 1),
+(752157, 752150, '湾仔区', '湾仔区', '', '', 3, 0, 1),
+(752158, 752150, '黄大仙区', '黄大仙区', '', '', 3, 0, 1),
+(752159, 752150, '油尖旺区', '油尖旺区', '', '', 3, 0, 1),
+(752160, 752150, '离岛区', '离岛区', '', '', 3, 0, 1),
+(752161, 752150, '葵青区', '葵青区', '', '', 3, 0, 1),
+(752162, 752150, '北区', '北区', '', '', 3, 0, 1),
+(752163, 752150, '西贡区', '西贡区', '', '', 3, 0, 1),
+(752164, 752150, '沙田区', '沙田区', '', '', 3, 0, 1),
+(752165, 752150, '屯门区', '屯门区', '', '', 3, 0, 1),
+(752166, 752150, '大埔区', '大埔区', '', '', 3, 0, 1),
+(752167, 752150, '荃湾区', '荃湾区', '', '', 3, 0, 1),
+(752168, 752150, '元朗区', '元朗区', '', '', 3, 0, 1),
+(752169, 714390, '澳门特别行政区', '澳门', '', '', 2, 0, 1),
+(752170, 752169, '澳门半岛', '澳门半岛', '', '', 3, 0, 1),
+(752171, 752169, '凼仔', '凼仔', '', '', 3, 0, 1),
+(752172, 752169, '路凼城', '路凼城', '', '', 3, 0, 1),
+(752173, 752169, '路环', '路环', '', '', 3, 0, 1),
+(752177, 440300, '龙华区', '龙华区', '', '', 3, 0, 1),
+(441900003, 441900, '东城街道办事处', '东城街道办事处', '113.754635', '23.002896', 3, 0, 1),
+(441900004, 441900, '南城街道办事处', '南城街道办事处', '113.753133', '22.987560', 3, 0, 1),
+(441900005, 441900, '万江街道办事处', '万江街道办事处', '113.740409', '23.052146', 3, 0, 1),
+(441900006, 441900, '莞城街道办事处', '莞城街道办事处', '113.751050', '23.053413', 3, 0, 1),
+(441900101, 441900, '石碣镇', '石碣镇', '113.802109', '23.094111', 3, 0, 1),
+(441900102, 441900, '石龙镇', '石龙镇', '113.751765', '23.020536', 3, 0, 1),
+(441900103, 441900, '茶山镇', '茶山镇', '113.751765', '23.020536', 3, 0, 1),
+(441900104, 441900, '石排镇', '石排镇', '113.751765', '23.020536', 3, 0, 1),
+(441900105, 441900, '企石镇', '企石镇', '113.751765', '23.020536', 3, 0, 1),
+(441900106, 441900, '横沥镇', '横沥镇', '113.751765', '23.020536', 3, 0, 1),
+(441900107, 441900, '桥头镇', '桥头镇', '113.751765', '23.020536', 3, 0, 1),
+(441900108, 441900, '谢岗镇', '谢岗镇', '114.141456', '22.972083', 3, 0, 1),
+(441900109, 441900, '东坑镇', '东坑镇', '113.948089', '22.989033', 3, 0, 1),
+(441900110, 441900, '常平镇', '常平镇', '113.992186', '22.975601', 3, 0, 1),
+(441900111, 441900, '寮步镇', '寮步镇', '113.818996', '23.025373', 3, 0, 1),
+(441900112, 441900, '樟木头镇', '樟木头镇', '114.083278', '22.914909', 3, 0, 1),
+(441900113, 441900, '大朗镇', '大朗镇', '113.915820', '22.915996', 3, 0, 1),
+(441900114, 441900, '黄江镇', '黄江镇', '113.996039', '22.877840', 3, 0, 1),
+(441900115, 441900, '清溪镇', '清溪镇', '114.164330', '22.844557', 3, 0, 1),
+(441900116, 441900, '塘厦镇', '塘厦镇', '113.774481', '22.791051', 3, 0, 1),
+(441900117, 441900, '凤岗镇', '凤岗镇', '113.751765', '23.020536', 3, 0, 1),
+(441900118, 441900, '大岭山镇', '大岭山镇', '113.842223', '22.899965', 3, 0, 1),
+(441900119, 441900, '长安镇', '长安镇', '113.794060', '22.803590', 3, 0, 1),
+(441900121, 441900, '虎门镇', '虎门镇', '113.672560', '22.814835', 3, 0, 1),
+(441900122, 441900, '厚街镇', '厚街镇', '113.751765', '23.020536', 3, 0, 1),
+(441900123, 441900, '沙田镇', '沙田镇', '113.751765', '23.020536', 3, 0, 1),
+(441900124, 441900, '道滘镇', '道滘镇', '113.751765', '23.020536', 3, 0, 1),
+(441900125, 441900, '洪梅镇', '洪梅镇', '113.608903', '22.994717', 3, 0, 1),
+(441900126, 441900, '麻涌镇', '麻涌镇', '113.751765', '23.020536', 3, 0, 1),
+(441900127, 441900, '望牛墩镇', '望牛墩镇', '113.656243', '23.055331', 3, 0, 1),
+(441900128, 441900, '中堂镇', '中堂镇', '113.751765', '23.020536', 3, 0, 1),
+(441900129, 441900, '高埗镇', '高埗镇', '113.722126', '23.078713', 3, 0, 1),
+(441900401, 441900, '松山湖管委会', '松山湖管委会', '113.909208', '22.960541', 3, 0, 1),
+(441900402, 441900, '虎门港管委会', '虎门港管委会', '113.583070', '22.864175', 3, 0, 1),
+(441900403, 441900, '东莞生态园', '东莞生态园', '113.927452', '23.063210', 3, 0, 1),
+(442000001, 442000, '石岐区街道办事处', '石岐区街道办事处', '113.384930', '22.532046', 3, 0, 1),
+(442000002, 442000, '东区街道办事处', '东区街道办事处', '113.392782', '22.517645', 3, 0, 1),
+(442000003, 442000, '火炬开发区街道办事处', '火炬开发区街道办事处', '113.480528', '22.566086', 3, 0, 1),
+(442000004, 442000, '西区街道办事处', '西区街道办事处', '113.392782', '22.517645', 3, 0, 1),
+(442000005, 442000, '南区街道办事处', '南区街道办事处', '113.358509', '22.472530', 3, 0, 1),
+(442000006, 442000, '五桂山街道办事处', '五桂山街道办事处', '113.463397', '22.421549', 3, 0, 1),
+(442000100, 442000, '小榄镇', '小榄镇', '113.250897', '22.672099', 3, 0, 1),
+(442000101, 442000, '黄圃镇', '黄圃镇', '113.335242', '22.709897', 3, 0, 1),
+(442000102, 442000, '民众镇', '民众镇', '113.392782', '22.517645', 3, 0, 1),
+(442000103, 442000, '东凤镇', '东凤镇', '113.392782', '22.517645', 3, 0, 1),
+(442000104, 442000, '东升镇', '东升镇', '113.294393', '22.616908', 3, 0, 1),
+(442000105, 442000, '古镇镇', '古镇镇', '113.190869', '22.613406', 3, 0, 1),
+(442000106, 442000, '沙溪镇', '沙溪镇', '113.392782', '22.517645', 3, 0, 1),
+(442000107, 442000, '坦洲镇', '坦洲镇', '113.460373', '22.265182', 3, 0, 1),
+(442000108, 442000, '港口镇', '港口镇', '113.247148', '22.683616', 3, 0, 1),
+(442000109, 442000, '三角镇', '三角镇', '113.422371', '22.684688', 3, 0, 1),
+(442000110, 442000, '横栏镇', '横栏镇', '113.265845', '22.523201', 3, 0, 1),
+(442000111, 442000, '南头镇', '南头镇', '113.392782', '22.517645', 3, 0, 1),
+(442000112, 442000, '阜沙镇', '阜沙镇', '113.392782', '22.517645', 3, 0, 1),
+(442000113, 442000, '南朗镇', '南朗镇', '113.392782', '22.517645', 3, 0, 1),
+(442000114, 442000, '三乡镇', '三乡镇', '113.441614', '22.357754', 3, 0, 1),
+(442000115, 442000, '板芙镇', '板芙镇', '113.392782', '22.517645', 3, 0, 1),
+(442000116, 442000, '大涌镇', '大涌镇', '113.392782', '22.517645', 3, 0, 1),
+(442000117, 442000, '神湾镇', '神湾镇', '113.392782', '22.517645', 3, 0, 1),
+(460400100, 460400, '那大镇', '那大镇', '110.349228', '20.017377', 3, 0, 1),
+(460400101, 460400, '和庆镇', '和庆镇', '109.640856', '19.525399', 3, 0, 1),
+(460400102, 460400, '南丰镇', '南丰镇', '110.349228', '20.017377', 3, 0, 1),
+(460400103, 460400, '大成镇', '大成镇', '110.349228', '20.017377', 3, 0, 1),
+(460400104, 460400, '雅星镇', '雅星镇', '110.349228', '20.017377', 3, 0, 1),
+(460400105, 460400, '兰洋镇', '兰洋镇', '110.349228', '20.017377', 3, 0, 1),
+(460400106, 460400, '光村镇', '光村镇', '110.349228', '20.017377', 3, 0, 1),
+(460400107, 460400, '木棠镇', '木棠镇', '110.349228', '20.017377', 3, 0, 1),
+(460400108, 460400, '海头镇', '海头镇', '110.349228', '20.017377', 3, 0, 1),
+(460400109, 460400, '峨蔓镇', '峨蔓镇', '110.349228', '20.017377', 3, 0, 1),
+(460400110, 460400, '三都镇', '三都镇', '110.349228', '20.017377', 3, 0, 1),
+(460400111, 460400, '王五镇', '王五镇', '110.349228', '20.017377', 3, 0, 1),
+(460400112, 460400, '白马井镇', '白马井镇', '109.218734', '19.696407', 3, 0, 1),
+(460400113, 460400, '中和镇', '中和镇', '110.349228', '20.017377', 3, 0, 1),
+(460400114, 460400, '排浦镇', '排浦镇', '110.349228', '20.017377', 3, 0, 1),
+(460400115, 460400, '东成镇', '东成镇', '110.349228', '20.017377', 3, 0, 1),
+(460400116, 460400, '新州镇', '新州镇', '110.349228', '20.017377', 3, 0, 1),
+(460400400, 460400, '国营西培农场', '国营西培农场', '109.455554', '19.476422', 3, 0, 1),
+(460400404, 460400, '国营西联农场', '国营西联农场', '109.539074', '19.673015', 3, 0, 1),
+(460400405, 460400, '国营蓝洋农场', '国营蓝洋农场', '109.670723', '19.458984', 3, 0, 1),
+(460400407, 460400, '国营八一农场', '国营八一农场', '109.364519', '19.413460', 3, 0, 1),
+(460400499, 460400, '洋浦经济开发区', '洋浦经济开发区', '109.202064', '19.736941', 3, 0, 1),
+(460400500, 460400, '华南热作学院', '华南热作学院', '109.494073', '19.505382', 3, 0, 1);
\ No newline at end of file
diff --git "a/public/static/home/file/\345\213\276\350\202\241OA\345\221\230\345\267\245\345\257\274\345\205\245\346\250\241\346\235\277.xlsx" "b/public/static/home/file/\345\213\276\350\202\241OA\345\221\230\345\267\245\345\257\274\345\205\245\346\250\241\346\235\277.xlsx"
new file mode 100644
index 0000000000000000000000000000000000000000..53cacf9875b2fbac4c0ca89f8b24ddaa724cdafb
Binary files /dev/null and "b/public/static/home/file/\345\213\276\350\202\241OA\345\221\230\345\267\245\345\257\274\345\205\245\346\250\241\346\235\277.xlsx" differ
diff --git "a/public/static/home/file/\345\213\276\350\202\241OA\345\256\242\346\210\267\345\257\274\345\205\245\346\250\241\346\235\277.xlsx" "b/public/static/home/file/\345\213\276\350\202\241OA\345\256\242\346\210\267\345\257\274\345\205\245\346\250\241\346\235\277.xlsx"
new file mode 100644
index 0000000000000000000000000000000000000000..217b1e862098b28469c796238cf1056df97d395a
Binary files /dev/null and "b/public/static/home/file/\345\213\276\350\202\241OA\345\256\242\346\210\267\345\257\274\345\205\245\346\250\241\346\235\277.xlsx" differ
diff --git a/public/static/home/images/404.gif b/public/static/home/images/404.gif
new file mode 100644
index 0000000000000000000000000000000000000000..dd9a44bcb713b2048334bd6353d2355b23b314c9
Binary files /dev/null and b/public/static/home/images/404.gif differ
diff --git a/public/static/home/images/bg.png b/public/static/home/images/bg.png
new file mode 100644
index 0000000000000000000000000000000000000000..1d5015e6c96b73b4786b6076b5f6fe0e702cb07b
Binary files /dev/null and b/public/static/home/images/bg.png differ
diff --git a/public/static/home/images/bg_pattern.png b/public/static/home/images/bg_pattern.png
new file mode 100644
index 0000000000000000000000000000000000000000..cfd79110639b72f96f028efdba77979408402368
Binary files /dev/null and b/public/static/home/images/bg_pattern.png differ
diff --git a/public/static/home/images/bgm.png b/public/static/home/images/bgm.png
new file mode 100644
index 0000000000000000000000000000000000000000..403e270552f22a057c0fa8641dc986535f7ddcbc
Binary files /dev/null and b/public/static/home/images/bgm.png differ
diff --git a/public/static/home/images/icon.png b/public/static/home/images/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..9a516e4f319d9ded822f7eee86928289c98cd4de
Binary files /dev/null and b/public/static/home/images/icon.png differ
diff --git a/public/static/home/images/icon/article.png b/public/static/home/images/icon/article.png
new file mode 100644
index 0000000000000000000000000000000000000000..deabb18995981f504277ad01c5680e1cbee473ed
Binary files /dev/null and b/public/static/home/images/icon/article.png differ
diff --git a/public/static/home/images/icon/audio.png b/public/static/home/images/icon/audio.png
new file mode 100644
index 0000000000000000000000000000000000000000..d71f256b1d044758a923e416af5b451ae4f3fb18
Binary files /dev/null and b/public/static/home/images/icon/audio.png differ
diff --git a/public/static/home/images/icon/doc.png b/public/static/home/images/icon/doc.png
new file mode 100644
index 0000000000000000000000000000000000000000..fa3e0a9737f211af0f6954d3ef9498a8374cdedf
Binary files /dev/null and b/public/static/home/images/icon/doc.png differ
diff --git a/public/static/home/images/icon/docx.png b/public/static/home/images/icon/docx.png
new file mode 100644
index 0000000000000000000000000000000000000000..fa3e0a9737f211af0f6954d3ef9498a8374cdedf
Binary files /dev/null and b/public/static/home/images/icon/docx.png differ
diff --git a/public/static/home/images/icon/file.png b/public/static/home/images/icon/file.png
new file mode 100644
index 0000000000000000000000000000000000000000..808f5e66b3b592b5031474869286fe6796d32801
Binary files /dev/null and b/public/static/home/images/icon/file.png differ
diff --git a/public/static/home/images/icon/folder.png b/public/static/home/images/icon/folder.png
new file mode 100644
index 0000000000000000000000000000000000000000..9653717dc2e1f822214278096475c15bbd8ae184
Binary files /dev/null and b/public/static/home/images/icon/folder.png differ
diff --git a/public/static/home/images/icon/img.png b/public/static/home/images/icon/img.png
new file mode 100644
index 0000000000000000000000000000000000000000..322f75e28494631be97be4865992f6e40ebecfab
Binary files /dev/null and b/public/static/home/images/icon/img.png differ
diff --git a/public/static/home/images/icon/pdf.png b/public/static/home/images/icon/pdf.png
new file mode 100644
index 0000000000000000000000000000000000000000..dfac208a22160429cddb3298205aaecb5ddd4a44
Binary files /dev/null and b/public/static/home/images/icon/pdf.png differ
diff --git a/public/static/home/images/icon/ppt.png b/public/static/home/images/icon/ppt.png
new file mode 100644
index 0000000000000000000000000000000000000000..2ea671f5e11946f837da0cc95f5977a06087b0d1
Binary files /dev/null and b/public/static/home/images/icon/ppt.png differ
diff --git a/public/static/home/images/icon/pptx.png b/public/static/home/images/icon/pptx.png
new file mode 100644
index 0000000000000000000000000000000000000000..2ea671f5e11946f837da0cc95f5977a06087b0d1
Binary files /dev/null and b/public/static/home/images/icon/pptx.png differ
diff --git a/public/static/home/images/icon/rar.png b/public/static/home/images/icon/rar.png
new file mode 100644
index 0000000000000000000000000000000000000000..6872c03047dbf51290d75c5ff7ab6a79209f6bea
Binary files /dev/null and b/public/static/home/images/icon/rar.png differ
diff --git a/public/static/home/images/icon/txt.png b/public/static/home/images/icon/txt.png
new file mode 100644
index 0000000000000000000000000000000000000000..25ae87a060b93a5ed47021b385d15786782438d6
Binary files /dev/null and b/public/static/home/images/icon/txt.png differ
diff --git a/public/static/home/images/icon/video.png b/public/static/home/images/icon/video.png
new file mode 100644
index 0000000000000000000000000000000000000000..32b6437bb01e0e28cca5770e432cc73bcbc957b5
Binary files /dev/null and b/public/static/home/images/icon/video.png differ
diff --git a/public/static/home/images/icon/xls.png b/public/static/home/images/icon/xls.png
new file mode 100644
index 0000000000000000000000000000000000000000..6517401cce40a6f3e8db6fccc36667226be8db65
Binary files /dev/null and b/public/static/home/images/icon/xls.png differ
diff --git a/public/static/home/images/icon/xlsx.png b/public/static/home/images/icon/xlsx.png
new file mode 100644
index 0000000000000000000000000000000000000000..6517401cce40a6f3e8db6fccc36667226be8db65
Binary files /dev/null and b/public/static/home/images/icon/xlsx.png differ
diff --git a/public/static/home/images/icon/zip.png b/public/static/home/images/icon/zip.png
new file mode 100644
index 0000000000000000000000000000000000000000..6872c03047dbf51290d75c5ff7ab6a79209f6bea
Binary files /dev/null and b/public/static/home/images/icon/zip.png differ
diff --git a/public/static/home/images/lock_bg.svg b/public/static/home/images/lock_bg.svg
new file mode 100644
index 0000000000000000000000000000000000000000..86d3800fb23d752398e7f373bf01205d679e63a5
--- /dev/null
+++ b/public/static/home/images/lock_bg.svg
@@ -0,0 +1,29 @@
+<svg xmlns="http://www.w3.org/2000/svg" version="1.1" baseProfile="full" width="100%" height="100%" viewBox="0 0 1400 800">
+
+  <rect x="1300" y="400" rx="40" ry="40" width="300" height="300" stroke="rgb(129, 201, 149)" fill="rgb(129, 201, 149)">
+    <animateTransform attributeType="XML" attributeName="transform" begin="0s" dur="35s" type="rotate" from="0 1450 550" to="360 1450 550" repeatCount="indefinite"/>
+  </rect>
+
+  <path d="M 100 350 A 150 150 0 1 1 400 350 Q400 370 380 370 L 250 370 L 120 370 Q100 370 100 350" stroke="rgb(253, 214, 99)" fill="rgb(253, 214, 99)">
+    <animateMotion path="M 800 -200 L 800 -300 L 800 -200" dur="20s" begin="0s" repeatCount="indefinite"/>
+    <animateTransform attributeType="XML" attributeName="transform" begin="0s" dur="30s" type="rotate" values="0 210 530 ; -30 210 530 ; 0 210 530" keyTimes="0 ; 0.5 ; 1" repeatCount="indefinite"/>
+  </path>
+
+  <circle cx="200" cy="150" r="30" stroke="#FBBC05" fill="#FBBC05">
+    <animateMotion path="M 0 0 L 40 20 Z" dur="5s" repeatCount="indefinite"/>
+  </circle>
+
+  <!-- 三角形 -->
+  <path d="M 165 580 L 270 580 Q275 578 270 570 L 223 483 Q220 480 217 483 L 165 570 Q160 578 165 580" stroke="rgb(238, 103, 92)" fill="rgb(238, 103, 92)">
+    <animateTransform attributeType="XML" attributeName="transform" begin="0s" dur="35s" type="rotate" from="0 210 530" to="360 210 530" repeatCount="indefinite"/>
+  </path>
+
+  <rect x="400" y="600" rx="40" ry="40" width="100" height="100" stroke="rgb(85, 179, 5)" fill="rgb(85, 179, 5)">
+    <animateTransform attributeType="XML" attributeName="transform" begin="0s" dur="35s" type="rotate" from="-320 500 600" to="320 500 600" repeatCount="indefinite"/>
+  </rect>
+  
+  
+  <path d="M135.461,9.654 L192.193,221.380 C195.055,232.063 189.027,237.482 178.708,233.504 L10.722,168.736 C0.402,164.758 -2.323,154.585 4.624,145.980 L117.721,5.897 C124.668,-2.708 132.598,-1.029 135.461,9.654 Z" stroke="rgb(24, 106, 242)" fill="rgb(24, 106, 242)">
+    <animateTransform attributeType="XML" attributeName="transform" begin="0s" dur="35s" type="rotate" from="-180 300 200" to="360 300 200" repeatCount="indefinite"/>
+  </path>
+</svg>
\ No newline at end of file
diff --git a/public/static/home/images/login.jpg b/public/static/home/images/login.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..6f37c5c4f7ee174eb6955135a078e0bd75cb322f
Binary files /dev/null and b/public/static/home/images/login.jpg differ
diff --git a/public/static/home/images/logo.png b/public/static/home/images/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..02e37e7f97c5ff19a4a85b28b6df4142c0503666
Binary files /dev/null and b/public/static/home/images/logo.png differ
diff --git a/public/static/home/images/nonepic360x360.jpg b/public/static/home/images/nonepic360x360.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..1bad1ba999330e9214872e4b262afeeea7fda927
Binary files /dev/null and b/public/static/home/images/nonepic360x360.jpg differ
diff --git a/public/static/home/images/nonepic600x360.jpg b/public/static/home/images/nonepic600x360.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..d15f7d1c346f0f2fa3c75af234307894543153c6
Binary files /dev/null and b/public/static/home/images/nonepic600x360.jpg differ
diff --git a/public/static/home/images/nonepic600x600.jpg b/public/static/home/images/nonepic600x600.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..da1f697535be2129c2f16ad240fc0c5a56a7c810
Binary files /dev/null and b/public/static/home/images/nonepic600x600.jpg differ
diff --git a/public/static/home/images/syslogo.png b/public/static/home/images/syslogo.png
new file mode 100644
index 0000000000000000000000000000000000000000..08cce71351960948ba885279203de5dc606ed407
Binary files /dev/null and b/public/static/home/images/syslogo.png differ
diff --git a/public/static/home/images/syslogo_small.png b/public/static/home/images/syslogo_small.png
new file mode 100644
index 0000000000000000000000000000000000000000..82e989345220f80e4d5a5a15eb68580d8e3b7990
Binary files /dev/null and b/public/static/home/images/syslogo_small.png differ
diff --git a/public/static/jquery.min.js b/public/static/jquery.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..798cc8bf740f0986ec5c642ba0d9a249be08a23f
--- /dev/null
+++ b/public/static/jquery.min.js
@@ -0,0 +1,2 @@
+/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */
+!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(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}function fe(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}ce.fn=ce.prototype={jquery:t,constructor:ce,length:0,toArray:function(){return ae.call(this)},get:function(e){return null==e?ae.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=ce.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return ce.each(this,e)},map:function(n){return this.pushStack(ce.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(ae.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(ce.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(ce.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:s,sort:oe.sort,splice:oe.splice},ce.extend=ce.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||v(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&&(ce.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||ce.isPlainObject(n)?n:{},i=!1,a[t]=ce.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},ce.extend({expando:"jQuery"+(t+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]"!==i.call(e))&&(!(t=r(e))||"function"==typeof(n=ue.call(t,"constructor")&&t.constructor)&&o.call(n)===a)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){m(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(c(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},text:function(e){var t,n="",r=0,i=e.nodeType;if(!i)while(t=e[r++])n+=ce.text(t);return 1===i||11===i?e.textContent:9===i?e.documentElement.textContent:3===i||4===i?e.nodeValue:n},makeArray:function(e,t){var n=t||[];return null!=e&&(c(Object(e))?ce.merge(n,"string"==typeof e?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:se.call(t,e,n)},isXMLDoc:function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!l.test(t||n&&n.nodeName||"HTML")},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(c(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:le}),"function"==typeof Symbol&&(ce.fn[Symbol.iterator]=oe[Symbol.iterator]),ce.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var pe=oe.pop,de=oe.sort,he=oe.splice,ge="[\\x20\\t\\r\\n\\f]",ve=new RegExp("^"+ge+"+|((?:^|[^\\\\])(?:\\\\.)*)"+ge+"+$","g");ce.contains=function(e,t){var n=t&&t.parentNode;return e===n||!(!n||1!==n.nodeType||!(e.contains?e.contains(n):e.compareDocumentPosition&&16&e.compareDocumentPosition(n)))};var f=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;function p(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e}ce.escapeSelector=function(e){return(e+"").replace(f,p)};var ye=C,me=s;!function(){var e,b,w,o,a,T,r,C,d,i,k=me,S=ce.expando,E=0,n=0,s=W(),c=W(),u=W(),h=W(),l=function(e,t){return e===t&&(a=!0),0},f="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",t="(?:\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",p="\\["+ge+"*("+t+")(?:"+ge+"*([*^$|!~]?=)"+ge+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+t+"))|)"+ge+"*\\]",g=":("+t+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+p+")*)|.*)\\)|)",v=new RegExp(ge+"+","g"),y=new RegExp("^"+ge+"*,"+ge+"*"),m=new RegExp("^"+ge+"*([>+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=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))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(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&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(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&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(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 U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);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&&C){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=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="<a id='"+S+"' href='' disabled='disabled'></a><select id='"+S+"-\r\\' disabled='disabled'><option selected=''></option></select>",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0<I(t,T,null,[e]).length},I.contains=function(e,t){return(e.ownerDocument||e)!=T&&V(e),ce.contains(e,t)},I.attr=function(e,t){(e.ownerDocument||e)!=T&&V(e);var n=b.attrHandle[t.toLowerCase()],r=n&&ue.call(b.attrHandle,t.toLowerCase())?n(e,t,!C):void 0;return void 0!==r?r:e.getAttribute(t)},I.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},ce.uniqueSort=function(e){var t,n=[],r=0,i=0;if(a=!le.sortStable,o=!le.sortStable&&ae.call(e,0),de.call(e,l),a){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)he.call(e,n[r],1)}return o=null,e},ce.fn.uniqueSort=function(){return this.pushStack(ce.uniqueSort(ae.apply(this)))},(b=ce.expr={cacheLength:50,createPseudo:F,match:D,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(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===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]||I.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]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(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(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(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=I.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(v," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(d,e,t,h,g){var v="nth"!==d.slice(0,3),y="last"!==d.slice(-4),m="of-type"===e;return 1===h&&0===g?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u=v!==y?"nextSibling":"previousSibling",l=e.parentNode,c=m&&e.nodeName.toLowerCase(),f=!n&&!m,p=!1;if(l){if(v){while(u){o=e;while(o=o[u])if(m?fe(o,c):1===o.nodeType)return!1;s=u="only"===d&&!s&&"nextSibling"}return!0}if(s=[y?l.firstChild:l.lastChild],y&&f){p=(a=(r=(i=l[S]||(l[S]={}))[d]||[])[0]===E&&r[1])&&r[2],o=a&&l.childNodes[a];while(o=++a&&o&&o[u]||(p=a=0)||s.pop())if(1===o.nodeType&&++p&&o===e){i[d]=[E,a,p];break}}else if(f&&(p=a=(r=(i=e[S]||(e[S]={}))[d]||[])[0]===E&&r[1]),!1===p)while(o=++a&&o&&o[u]||(p=a=0)||s.pop())if((m?fe(o,c):1===o.nodeType)&&++p&&(f&&((i=o[S]||(o[S]={}))[d]=[E,p]),o===e))break;return(p-=g)===h||p%h==0&&0<=p/h}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||I.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?F(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=se.call(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:F(function(e){var r=[],i=[],s=ne(e.replace(ve,"$1"));return s[S]?F(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:F(function(t){return function(e){return 0<I(t,e).length}}),contains:F(function(t){return t=t.replace(O,P),function(e){return-1<(e.textContent||ce.text(e)).indexOf(t)}}),lang:F(function(n){return A.test(n||"")||I.error("unsupported lang: "+n),n=n.replace(O,P).toLowerCase(),function(e){var t;do{if(t=C?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=ie.location&&ie.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===r},focus:function(e){return e===function(){try{return T.activeElement}catch(e){}}()&&T.hasFocus()&&!!(e.type||e.href||~e.tabIndex)},enabled:z(!1),disabled:z(!0),checked:function(e){return fe(e,"input")&&!!e.checked||fe(e,"option")&&!!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 q.test(e.nodeName)},input:function(e){return N.test(e.nodeName)},button:function(e){return fe(e,"input")&&"button"===e.type||fe(e,"button")},text:function(e){var t;return fe(e,"input")&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:X(function(){return[0]}),last:X(function(e,t){return[t-1]}),eq:X(function(e,t,n){return[n<0?n+t:n]}),even:X(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:X(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:X(function(e,t,n){var r;for(r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:X(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]=B(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=_(e);function G(){}function Y(e,t){var n,r,i,o,a,s,u,l=c[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=y.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=m.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace(ve," ")}),a=a.slice(n.length)),b.filter)!(r=D[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?I.error(e):c(e,s).slice(0)}function Q(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function J(a,e,t){var s=e.dir,u=e.next,l=u||s,c=t&&"parentNode"===l,f=n++;return e.first?function(e,t,n){while(e=e[s])if(1===e.nodeType||c)return a(e,t,n);return!1}:function(e,t,n){var r,i,o=[E,f];if(n){while(e=e[s])if((1===e.nodeType||c)&&a(e,t,n))return!0}else while(e=e[s])if(1===e.nodeType||c)if(i=e[S]||(e[S]={}),u&&fe(e,u))e=e[s]||e;else{if((r=i[l])&&r[0]===E&&r[1]===f)return o[2]=r[2];if((i[l]=o)[2]=a(e,t,n))return!0}return!1}}function K(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 Z(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 ee(d,h,g,v,y,e){return v&&!v[S]&&(v=ee(v)),y&&!y[S]&&(y=ee(y,e)),F(function(e,t,n,r){var i,o,a,s,u=[],l=[],c=t.length,f=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)I(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),p=!d||!e&&h?f:Z(f,u,d,n,r);if(g?g(p,s=y||(e?d:c||v)?[]:t,n,r):s=p,v){i=Z(s,l),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(s[l[o]]=!(p[l[o]]=a))}if(e){if(y||d){if(y){i=[],o=s.length;while(o--)(a=s[o])&&i.push(p[o]=a);y(null,s=[],i,r)}o=s.length;while(o--)(a=s[o])&&-1<(i=y?se.call(e,a):u[o])&&(e[i]=!(t[i]=a))}}else s=Z(s===t?s.splice(c,s.length):s),y?y(null,t,s,r):k.apply(t,s)})}function te(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=J(function(e){return e===i},a,!0),l=J(function(e){return-1<se.call(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=[J(K(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 ee(1<s&&K(c),1<s&&Q(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(ve,"$1"),t,s<n&&te(e.slice(s,n)),n<r&&te(e=e.slice(n)),n<r&&Q(e))}c.push(t)}return K(c)}function ne(e,t){var n,v,y,m,x,r,i=[],o=[],a=u[e+" "];if(!a){t||(t=Y(e)),n=t.length;while(n--)(a=te(t[n]))[S]?i.push(a):o.push(a);(a=u(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=E+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==T||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==T||(V(o),n=!C);while(s=v[a++])if(s(o,t||T,n)){k.call(r,o);break}i&&(E=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]=pe.call(r));f=Z(f)}k.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&ce.uniqueSort(r)}return i&&(E=h,w=p),c},m?F(r):r))).selector=e}return a}function re(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&Y(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&&C&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(O,P),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=D.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(O,P),H.test(o[0].type)&&U(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&Q(o)))return k.apply(n,r),n;break}}}return(l||ne(e,c))(r,t,!C,n,!t||H.test(e)&&U(t.parentNode)||t),n}G.prototype=b.filters=b.pseudos,b.setFilters=new G,le.sortStable=S.split("").sort(l).join("")===S,V(),le.sortDetached=$(function(e){return 1&e.compareDocumentPosition(T.createElement("fieldset"))}),ce.find=I,ce.expr[":"]=ce.expr.pseudos,ce.unique=ce.uniqueSort,I.compile=ne,I.select=re,I.setDocument=V,I.tokenize=Y,I.escape=ce.escapeSelector,I.getText=ce.text,I.isXML=ce.isXMLDoc,I.selectors=ce.expr,I.support=ce.support,I.uniqueSort=ce.uniqueSort}();var d=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&ce(e).is(n))break;r.push(e)}return r},h=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},b=ce.expr.match.needsContext,w=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1<se.call(n,e)!==r}):ce.filter(n,e,r)}ce.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?ce.find.matchesSelector(r,e)?[r]:[]:ce.find.matches(e,ce.grep(t,function(e){return 1===e.nodeType}))},ce.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(ce(e).filter(function(){for(t=0;t<r;t++)if(ce.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)ce.find(e,i[t],n);return 1<r?ce.uniqueSort(n):n},filter:function(e){return this.pushStack(T(this,e||[],!1))},not:function(e){return this.pushStack(T(this,e||[],!0))},is:function(e){return!!T(this,"string"==typeof e&&b.test(e)?ce(e):e||[],!1).length}});var k,S=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.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 ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(ce.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&ce(e);if(!b.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&&ce.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?ce.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?se.call(ce(e),this[0]):se.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(ce.uniqueSort(ce.merge(this.get(),ce(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),ce.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return d(e,"parentNode")},parentsUntil:function(e,t,n){return d(e,"parentNode",n)},next:function(e){return A(e,"nextSibling")},prev:function(e){return A(e,"previousSibling")},nextAll:function(e){return d(e,"nextSibling")},prevAll:function(e){return d(e,"previousSibling")},nextUntil:function(e,t,n){return d(e,"nextSibling",n)},prevUntil:function(e,t,n){return d(e,"previousSibling",n)},siblings:function(e){return h((e.parentNode||{}).firstChild,e)},children:function(e){return h(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(fe(e,"template")&&(e=e.content||e),ce.merge([],e.childNodes))}},function(r,i){ce.fn[r]=function(e,t){var n=ce.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=ce.filter(t,n)),1<this.length&&(j[r]||ce.uniqueSort(n),E.test(r)&&n.reverse()),this.pushStack(n)}});var D=/[^\x20\t\r\n\f]+/g;function N(e){return e}function q(e){throw e}function L(e,t,n,r){var i;try{e&&v(i=e.promise)?i.call(e).done(t).fail(n):e&&v(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}ce.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},ce.each(e.match(D)||[],function(e,t){n[t]=!0}),n):ce.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){ce.each(e,function(e,t){v(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==x(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return ce.each(arguments,function(e,t){var n;while(-1<(n=ce.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<ce.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},ce.extend({Deferred:function(e){var o=[["notify","progress",ce.Callbacks("memory"),ce.Callbacks("memory"),2],["resolve","done",ce.Callbacks("once memory"),ce.Callbacks("once memory"),0,"resolved"],["reject","fail",ce.Callbacks("once memory"),ce.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 ce.Deferred(function(r){ce.each(o,function(e,t){var n=v(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&v(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,v(t)?s?t.call(e,l(u,o,N,s),l(u,o,q,s)):(u++,t.call(e,l(u,o,N,s),l(u,o,q,s),l(u,o,N,o.notifyWith))):(a!==N&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){ce.Deferred.exceptionHook&&ce.Deferred.exceptionHook(e,t.error),u<=i+1&&(a!==q&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(ce.Deferred.getErrorHook?t.error=ce.Deferred.getErrorHook():ce.Deferred.getStackHook&&(t.error=ce.Deferred.getStackHook()),ie.setTimeout(t))}}return ce.Deferred(function(e){o[0][3].add(l(0,e,v(r)?r:N,e.notifyWith)),o[1][3].add(l(0,e,v(t)?t:N)),o[2][3].add(l(0,e,v(n)?n:q))}).promise()},promise:function(e){return null!=e?ce.extend(e,a):a}},s={};return ce.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=ae.call(arguments),o=ce.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?ae.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(L(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||v(i[t]&&i[t].then)))return o.then();while(t--)L(i[t],a(t),o.reject);return o.promise()}});var H=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;ce.Deferred.exceptionHook=function(e,t){ie.console&&ie.console.warn&&e&&H.test(e.name)&&ie.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},ce.readyException=function(e){ie.setTimeout(function(){throw e})};var O=ce.Deferred();function P(){C.removeEventListener("DOMContentLoaded",P),ie.removeEventListener("load",P),ce.ready()}ce.fn.ready=function(e){return O.then(e)["catch"](function(e){ce.readyException(e)}),this},ce.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--ce.readyWait:ce.isReady)||(ce.isReady=!0)!==e&&0<--ce.readyWait||O.resolveWith(C,[ce])}}),ce.ready.then=O.then,"complete"===C.readyState||"loading"!==C.readyState&&!C.documentElement.doScroll?ie.setTimeout(ce.ready):(C.addEventListener("DOMContentLoaded",P),ie.addEventListener("load",P));var M=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n))for(s in i=!0,n)M(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,v(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(ce(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},R=/^-ms-/,I=/-([a-z])/g;function W(e,t){return t.toUpperCase()}function F(e){return e.replace(R,"ms-").replace(I,W)}var $=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function B(){this.expando=ce.expando+B.uid++}B.uid=1,B.prototype={cache:function(e){var t=e[this.expando];return t||(t={},$(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[F(t)]=n;else for(r in t)i[F(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][F(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(F):(t=F(t))in r?[t]:t.match(D)||[]).length;while(n--)delete r[t[n]]}(void 0===t||ce.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&&!ce.isEmptyObject(t)}};var _=new B,z=new B,X=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,U=/[A-Z]/g;function V(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(U,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:X.test(i)?JSON.parse(i):i)}catch(e){}z.set(e,t,n)}else n=void 0;return n}ce.extend({hasData:function(e){return z.hasData(e)||_.hasData(e)},data:function(e,t,n){return z.access(e,t,n)},removeData:function(e,t){z.remove(e,t)},_data:function(e,t,n){return _.access(e,t,n)},_removeData:function(e,t){_.remove(e,t)}}),ce.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=z.get(o),1===o.nodeType&&!_.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=F(r.slice(5)),V(o,r,i[r]));_.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){z.set(this,n)}):M(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=z.get(o,n))?t:void 0!==(t=V(o,n))?t:void 0;this.each(function(){z.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){z.remove(this,e)})}}),ce.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=_.get(e,t),n&&(!r||Array.isArray(n)?r=_.access(e,t,ce.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=ce.queue(e,t),r=n.length,i=n.shift(),o=ce._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){ce.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return _.get(e,n)||_.access(e,n,{empty:ce.Callbacks("once memory").add(function(){_.remove(e,[t+"queue",n])})})}}),ce.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?ce.queue(this[0],t):void 0===n?this:this.each(function(){var e=ce.queue(this,t,n);ce._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&ce.dequeue(this,t)})},dequeue:function(e){return this.each(function(){ce.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=ce.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=_.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var G=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,Y=new RegExp("^(?:([+-])=|)("+G+")([a-z%]*)$","i"),Q=["Top","Right","Bottom","Left"],J=C.documentElement,K=function(e){return ce.contains(e.ownerDocument,e)},Z={composed:!0};J.getRootNode&&(K=function(e){return ce.contains(e.ownerDocument,e)||e.getRootNode(Z)===e.ownerDocument});var ee=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&K(e)&&"none"===ce.css(e,"display")};function te(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return ce.css(e,t,"")},u=s(),l=n&&n[3]||(ce.cssNumber[t]?"":"px"),c=e.nodeType&&(ce.cssNumber[t]||"px"!==l&&+u)&&Y.exec(ce.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)ce.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,ce.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 ne={};function re(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]=_.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ee(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ne[s])||(o=a.body.appendChild(a.createElement(s)),u=ce.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ne[s]=u)))):"none"!==n&&(l[c]="none",_.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}ce.fn.extend({show:function(){return re(this,!0)},hide:function(){return re(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ee(this)?ce(this).show():ce(this).hide()})}});var xe,be,we=/^(?:checkbox|radio)$/i,Te=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="<textarea>x</textarea>",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="<option></option>",le.option=!!xe.lastChild;var ke={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 Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n<r;n++)_.set(e[n],"globalEval",!t||_.get(t[n],"globalEval"))}ke.tbody=ke.tfoot=ke.colgroup=ke.caption=ke.thead,ke.th=ke.td,le.option||(ke.optgroup=ke.option=[1,"<select multiple='multiple'>","</select>"]);var je=/<|&#?\w+;/;function Ae(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"===x(o))ce.merge(p,o.nodeType?[o]:o);else if(je.test(o)){a=a||f.appendChild(t.createElement("div")),s=(Te.exec(o)||["",""])[1].toLowerCase(),u=ke[s]||ke._default,a.innerHTML=u[1]+ce.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;ce.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<ce.inArray(o,r))i&&i.push(o);else if(l=K(o),a=Se(f.appendChild(o),"script"),l&&Ee(a),n){c=0;while(o=a[c++])Ce.test(o.type||"")&&n.push(o)}return f}var De=/^([^.]*)(?:\.(.+)|)/;function Ne(){return!0}function qe(){return!1}function Le(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)Le(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=qe;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return ce().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=ce.guid++)),e.each(function(){ce.event.add(this,t,i,r,n)})}function He(e,r,t){t?(_.set(e,r,!1),ce.event.add(e,r,{namespace:!1,handler:function(e){var t,n=_.get(this,r);if(1&e.isTrigger&&this[r]){if(n)(ce.event.special[r]||{}).delegateType&&e.stopPropagation();else if(n=ae.call(arguments),_.set(this,r,n),this[r](),t=_.get(this,r),_.set(this,r,!1),n!==t)return e.stopImmediatePropagation(),e.preventDefault(),t}else n&&(_.set(this,r,ce.event.trigger(n[0],n.slice(1),this)),e.stopPropagation(),e.isImmediatePropagationStopped=Ne)}})):void 0===_.get(e,r)&&ce.event.add(e,r,Ne)}ce.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=_.get(t);if($(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&ce.find.matchesSelector(J,i),n.guid||(n.guid=ce.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof ce&&ce.event.triggered!==e.type?ce.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(D)||[""]).length;while(l--)d=g=(s=De.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=ce.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=ce.event.special[d]||{},c=ce.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&ce.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),ce.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=_.hasData(e)&&_.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(D)||[""]).length;while(l--)if(d=g=(s=De.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=ce.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)||ce.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)ce.event.remove(e,d+t[l],n,r,!0);ce.isEmptyObject(u)&&_.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=ce.event.fix(e),l=(_.get(this,"events")||Object.create(null))[u.type]||[],c=ce.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=ce.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=((ce.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<ce(i,this).index(l):ce.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(ce.Event.prototype,t,{enumerable:!0,configurable:!0,get:v(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[ce.expando]?e:new ce.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return we.test(t.type)&&t.click&&fe(t,"input")&&He(t,"click",!0),!1},trigger:function(e){var t=this||e;return we.test(t.type)&&t.click&&fe(t,"input")&&He(t,"click"),!0},_default:function(e){var t=e.target;return we.test(t.type)&&t.click&&fe(t,"input")&&_.get(t,"click")||fe(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},ce.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},ce.Event=function(e,t){if(!(this instanceof ce.Event))return new ce.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ne:qe,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&&ce.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[ce.expando]=!0},ce.Event.prototype={constructor:ce.Event,isDefaultPrevented:qe,isPropagationStopped:qe,isImmediatePropagationStopped:qe,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ne,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ne,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ne,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},ce.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},ce.event.addProp),ce.each({focus:"focusin",blur:"focusout"},function(r,i){function o(e){if(C.documentMode){var t=_.get(this,"handle"),n=ce.event.fix(e);n.type="focusin"===e.type?"focus":"blur",n.isSimulated=!0,t(e),n.target===n.currentTarget&&t(n)}else ce.event.simulate(i,e.target,ce.event.fix(e))}ce.event.special[r]={setup:function(){var e;if(He(this,r,!0),!C.documentMode)return!1;(e=_.get(this,i))||this.addEventListener(i,o),_.set(this,i,(e||0)+1)},trigger:function(){return He(this,r),!0},teardown:function(){var e;if(!C.documentMode)return!1;(e=_.get(this,i)-1)?_.set(this,i,e):(this.removeEventListener(i,o),_.remove(this,i))},_default:function(e){return _.get(e.target,r)},delegateType:i},ce.event.special[i]={setup:function(){var e=this.ownerDocument||this.document||this,t=C.documentMode?this:e,n=_.get(t,i);n||(C.documentMode?this.addEventListener(i,o):e.addEventListener(r,o,!0)),_.set(t,i,(n||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=C.documentMode?this:e,n=_.get(t,i)-1;n?_.set(t,i,n):(C.documentMode?this.removeEventListener(i,o):e.removeEventListener(r,o,!0),_.remove(t,i))}}}),ce.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){ce.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||ce.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),ce.fn.extend({on:function(e,t,n,r){return Le(this,e,t,n,r)},one:function(e,t,n,r){return Le(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,ce(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=qe),this.each(function(){ce.event.remove(this,e,n,t)})}});var Oe=/<script|<style|<link/i,Pe=/checked\s*(?:[^=]|=\s*.checked.)/i,Me=/^\s*<!\[CDATA\[|\]\]>\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)ce.event.add(t,i,s[i][n]);z.hasData(e)&&(o=z.access(e),a=ce.extend({},o),z.set(t,a))}}function $e(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=v(d);if(h||1<f&&"string"==typeof d&&!le.checkClone&&Pe.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),$e(t,r,i,o)});if(f&&(t=(e=Ae(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=ce.map(Se(e,"script"),Ie)).length;c<f;c++)u=e,c!==p&&(u=ce.clone(u,!0,!0),s&&ce.merge(a,Se(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,ce.map(a,We),c=0;c<s;c++)u=a[c],Ce.test(u.type||"")&&!_.access(u,"globalEval")&&ce.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?ce._evalUrl&&!u.noModule&&ce._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):m(u.textContent.replace(Me,""),u,l))}return n}function Be(e,t,n){for(var r,i=t?ce.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||ce.cleanData(Se(r)),r.parentNode&&(n&&K(r)&&Ee(Se(r,"script")),r.parentNode.removeChild(r));return e}ce.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=K(e);if(!(le.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||ce.isXMLDoc(e)))for(a=Se(c),r=0,i=(o=Se(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&we.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||Se(e),a=a||Se(c),r=0,i=o.length;r<i;r++)Fe(o[r],a[r]);else Fe(e,c);return 0<(a=Se(c,"script")).length&&Ee(a,!f&&Se(e,"script")),c},cleanData:function(e){for(var t,n,r,i=ce.event.special,o=0;void 0!==(n=e[o]);o++)if($(n)){if(t=n[_.expando]){if(t.events)for(r in t.events)i[r]?ce.event.remove(n,r):ce.removeEvent(n,r,t.handle);n[_.expando]=void 0}n[z.expando]&&(n[z.expando]=void 0)}}}),ce.fn.extend({detach:function(e){return Be(this,e,!0)},remove:function(e){return Be(this,e)},text:function(e){return M(this,function(e){return void 0===e?ce.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 $e(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Re(this,e).appendChild(e)})},prepend:function(){return $e(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Re(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return $e(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return $e(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&&(ce.cleanData(Se(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return ce.clone(this,e,t)})},html:function(e){return M(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&&!Oe.test(e)&&!ke[(Te.exec(e)||["",""])[1].toLowerCase()]){e=ce.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(ce.cleanData(Se(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return $e(this,arguments,function(e){var t=this.parentNode;ce.inArray(this,n)<0&&(ce.cleanData(Se(this)),t&&t.replaceChild(e,this))},n)}}),ce.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){ce.fn[e]=function(e){for(var t,n=[],r=ce(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),ce(r[o])[a](t),s.apply(n,t.get());return this.pushStack(n)}});var _e=new RegExp("^("+G+")(?!px)[a-z%]+$","i"),ze=/^--/,Xe=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=ie),t.getComputedStyle(e)},Ue=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},Ve=new RegExp(Q.join("|"),"i");function Ge(e,t,n){var r,i,o,a,s=ze.test(t),u=e.style;return(n=n||Xe(e))&&(a=n.getPropertyValue(t)||n[t],s&&a&&(a=a.replace(ve,"$1")||void 0),""!==a||K(e)||(a=ce.style(e,t)),!le.pixelBoxStyles()&&_e.test(a)&&Ve.test(t)&&(r=u.width,i=u.minWidth,o=u.maxWidth,u.minWidth=u.maxWidth=u.width=a,a=n.width,u.width=r,u.minWidth=i,u.maxWidth=o)),void 0!==a?a+"":a}function Ye(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%",J.appendChild(u).appendChild(l);var e=ie.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),J.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=C.createElement("div"),l=C.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",le.clearCloneStyle="content-box"===l.style.backgroundClip,ce.extend(le,{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=C.createElement("table"),t=C.createElement("tr"),n=C.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="box-sizing:content-box;border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",J.appendChild(e).appendChild(t).appendChild(n),r=ie.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,J.removeChild(e)),a}}))}();var Qe=["Webkit","Moz","ms"],Je=C.createElement("div").style,Ke={};function Ze(e){var t=ce.cssProps[e]||Ke[e];return t||(e in Je?e:Ke[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Qe.length;while(n--)if((e=Qe[n]+t)in Je)return e}(e)||e)}var et=/^(none|table(?!-c[ea]).+)/,tt={position:"absolute",visibility:"hidden",display:"block"},nt={letterSpacing:"0",fontWeight:"400"};function rt(e,t,n){var r=Y.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function it(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0,l=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(l+=ce.css(e,n+Q[a],!0,i)),r?("content"===n&&(u-=ce.css(e,"padding"+Q[a],!0,i)),"margin"!==n&&(u-=ce.css(e,"border"+Q[a]+"Width",!0,i))):(u+=ce.css(e,"padding"+Q[a],!0,i),"padding"!==n?u+=ce.css(e,"border"+Q[a]+"Width",!0,i):s+=ce.css(e,"border"+Q[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+l}function ot(e,t,n){var r=Xe(e),i=(!le.boxSizingReliable()||n)&&"border-box"===ce.css(e,"boxSizing",!1,r),o=i,a=Ge(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(_e.test(a)){if(!n)return a;a="auto"}return(!le.boxSizingReliable()&&i||!le.reliableTrDimensions()&&fe(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===ce.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===ce.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+it(e,t,n||(i?"border":"content"),o,r,a)+"px"}function at(e,t,n,r,i){return new at.prototype.init(e,t,n,r,i)}ce.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Ge(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!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,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=F(t),u=ze.test(t),l=e.style;if(u||(t=Ze(s)),a=ce.cssHooks[t]||ce.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=Y.exec(n))&&i[1]&&(n=te(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(ce.cssNumber[s]?"":"px")),le.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=F(t);return ze.test(t)||(t=Ze(s)),(a=ce.cssHooks[t]||ce.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Ge(e,t,r)),"normal"===i&&t in nt&&(i=nt[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),ce.each(["height","width"],function(e,u){ce.cssHooks[u]={get:function(e,t,n){if(t)return!et.test(ce.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?ot(e,u,n):Ue(e,tt,function(){return ot(e,u,n)})},set:function(e,t,n){var r,i=Xe(e),o=!le.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===ce.css(e,"boxSizing",!1,i),s=n?it(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-it(e,u,"border",!1,i)-.5)),s&&(r=Y.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=ce.css(e,u)),rt(0,t,s)}}}),ce.cssHooks.marginLeft=Ye(le.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Ge(e,"marginLeft"))||e.getBoundingClientRect().left-Ue(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),ce.each({margin:"",padding:"",border:"Width"},function(i,o){ce.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+Q[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(ce.cssHooks[i+o].set=rt)}),ce.fn.extend({css:function(e,t){return M(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Xe(e),i=t.length;a<i;a++)o[t[a]]=ce.css(e,t[a],!1,r);return o}return void 0!==n?ce.style(e,t,n):ce.css(e,t)},e,t,1<arguments.length)}}),((ce.Tween=at).prototype={constructor:at,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||ce.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(ce.cssNumber[n]?"":"px")},cur:function(){var e=at.propHooks[this.prop];return e&&e.get?e.get(this):at.propHooks._default.get(this)},run:function(e){var t,n=at.propHooks[this.prop];return this.options.duration?this.pos=t=ce.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):at.propHooks._default.set(this),this}}).init.prototype=at.prototype,(at.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=ce.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){ce.fx.step[e.prop]?ce.fx.step[e.prop](e):1!==e.elem.nodeType||!ce.cssHooks[e.prop]&&null==e.elem.style[Ze(e.prop)]?e.elem[e.prop]=e.now:ce.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=at.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},ce.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},ce.fx=at.prototype.init,ce.fx.step={};var st,ut,lt,ct,ft=/^(?:toggle|show|hide)$/,pt=/queueHooks$/;function dt(){ut&&(!1===C.hidden&&ie.requestAnimationFrame?ie.requestAnimationFrame(dt):ie.setTimeout(dt,ce.fx.interval),ce.fx.tick())}function ht(){return ie.setTimeout(function(){st=void 0}),st=Date.now()}function gt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=Q[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function vt(e,t,n){for(var r,i=(yt.tweeners[t]||[]).concat(yt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function yt(o,e,t){var n,a,r=0,i=yt.prefilters.length,s=ce.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=st||ht(),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:ce.extend({},e),opts:ce.extend(!0,{specialEasing:{},easing:ce.easing._default},t),originalProperties:e,originalOptions:t,startTime:st||ht(),duration:t.duration,tweens:[],createTween:function(e,t){var n=ce.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=F(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=ce.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=yt.prefilters[r].call(l,o,c,l.opts))return v(n.stop)&&(ce._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return ce.map(c,vt,l),v(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),ce.fx.timer(ce.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}ce.Animation=ce.extend(yt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return te(n.elem,e,Y.exec(t),n),n}]},tweener:function(e,t){v(e)?(t=e,e=["*"]):e=e.match(D);for(var n,r=0,i=e.length;r<i;r++)n=e[r],yt.tweeners[n]=yt.tweeners[n]||[],yt.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&&ee(e),v=_.get(e,"fxshow");for(r in n.queue||(null==(a=ce._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--,ce.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],ft.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]||ce.style(e,r)}if((u=!ce.isEmptyObject(t))||!ce.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=_.get(e,"display")),"none"===(c=ce.css(e,"display"))&&(l?c=l:(re([e],!0),l=e.style.display||l,c=ce.css(e,"display"),re([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===ce.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=_.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&re([e],!0),p.done(function(){for(r in g||re([e]),_.remove(e,"fxshow"),d)ce.style(e,r,d[r])})),u=vt(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?yt.prefilters.unshift(e):yt.prefilters.push(e)}}),ce.speed=function(e,t,n){var r=e&&"object"==typeof e?ce.extend({},e):{complete:n||!n&&t||v(e)&&e,duration:e,easing:n&&t||t&&!v(t)&&t};return ce.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in ce.fx.speeds?r.duration=ce.fx.speeds[r.duration]:r.duration=ce.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){v(r.old)&&r.old.call(this),r.queue&&ce.dequeue(this,r.queue)},r},ce.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ee).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=ce.isEmptyObject(t),o=ce.speed(e,n,r),a=function(){var e=yt(this,ce.extend({},t),o);(i||_.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=ce.timers,r=_.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&pt.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||ce.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=_.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=ce.timers,o=n?n.length:0;for(t.finish=!0,ce.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})}}),ce.each(["toggle","show","hide"],function(e,r){var i=ce.fn[r];ce.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(gt(r,!0),e,t,n)}}),ce.each({slideDown:gt("show"),slideUp:gt("hide"),slideToggle:gt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){ce.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),ce.timers=[],ce.fx.tick=function(){var e,t=0,n=ce.timers;for(st=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||ce.fx.stop(),st=void 0},ce.fx.timer=function(e){ce.timers.push(e),ce.fx.start()},ce.fx.interval=13,ce.fx.start=function(){ut||(ut=!0,dt())},ce.fx.stop=function(){ut=null},ce.fx.speeds={slow:600,fast:200,_default:400},ce.fn.delay=function(r,e){return r=ce.fx&&ce.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=ie.setTimeout(e,r);t.stop=function(){ie.clearTimeout(n)}})},lt=C.createElement("input"),ct=C.createElement("select").appendChild(C.createElement("option")),lt.type="checkbox",le.checkOn=""!==lt.value,le.optSelected=ct.selected,(lt=C.createElement("input")).value="t",lt.type="radio",le.radioValue="t"===lt.value;var mt,xt=ce.expr.attrHandle;ce.fn.extend({attr:function(e,t){return M(this,ce.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){ce.removeAttr(this,e)})}}),ce.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?ce.prop(e,t,n):(1===o&&ce.isXMLDoc(e)||(i=ce.attrHooks[t.toLowerCase()]||(ce.expr.match.bool.test(t)?mt:void 0)),void 0!==n?null===n?void ce.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=ce.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!le.radioValue&&"radio"===t&&fe(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(D);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),mt={set:function(e,t,n){return!1===t?ce.removeAttr(e,n):e.setAttribute(n,n),n}},ce.each(ce.expr.match.bool.source.match(/\w+/g),function(e,t){var a=xt[t]||ce.find.attr;xt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=xt[o],xt[o]=r,r=null!=a(e,t,n)?o:null,xt[o]=i),r}});var bt=/^(?:input|select|textarea|button)$/i,wt=/^(?:a|area)$/i;function Tt(e){return(e.match(D)||[]).join(" ")}function Ct(e){return e.getAttribute&&e.getAttribute("class")||""}function kt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(D)||[]}ce.fn.extend({prop:function(e,t){return M(this,ce.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[ce.propFix[e]||e]})}}),ce.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&ce.isXMLDoc(e)||(t=ce.propFix[t]||t,i=ce.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=ce.find.attr(e,"tabindex");return t?parseInt(t,10):bt.test(e.nodeName)||wt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),le.optSelected||(ce.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)}}),ce.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){ce.propFix[this.toLowerCase()]=this}),ce.fn.extend({addClass:function(t){var e,n,r,i,o,a;return v(t)?this.each(function(e){ce(this).addClass(t.call(this,e,Ct(this)))}):(e=kt(t)).length?this.each(function(){if(r=Ct(this),n=1===this.nodeType&&" "+Tt(r)+" "){for(o=0;o<e.length;o++)i=e[o],n.indexOf(" "+i+" ")<0&&(n+=i+" ");a=Tt(n),r!==a&&this.setAttribute("class",a)}}):this},removeClass:function(t){var e,n,r,i,o,a;return v(t)?this.each(function(e){ce(this).removeClass(t.call(this,e,Ct(this)))}):arguments.length?(e=kt(t)).length?this.each(function(){if(r=Ct(this),n=1===this.nodeType&&" "+Tt(r)+" "){for(o=0;o<e.length;o++){i=e[o];while(-1<n.indexOf(" "+i+" "))n=n.replace(" "+i+" "," ")}a=Tt(n),r!==a&&this.setAttribute("class",a)}}):this:this.attr("class","")},toggleClass:function(t,n){var e,r,i,o,a=typeof t,s="string"===a||Array.isArray(t);return v(t)?this.each(function(e){ce(this).toggleClass(t.call(this,e,Ct(this),n),n)}):"boolean"==typeof n&&s?n?this.addClass(t):this.removeClass(t):(e=kt(t),this.each(function(){if(s)for(o=ce(this),i=0;i<e.length;i++)r=e[i],o.hasClass(r)?o.removeClass(r):o.addClass(r);else void 0!==t&&"boolean"!==a||((r=Ct(this))&&_.set(this,"__className__",r),this.setAttribute&&this.setAttribute("class",r||!1===t?"":_.get(this,"__className__")||""))}))},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+Tt(Ct(n))+" ").indexOf(t))return!0;return!1}});var St=/\r/g;ce.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=v(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,ce(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=ce.map(t,function(e){return null==e?"":e+""})),(r=ce.valHooks[this.type]||ce.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=ce.valHooks[t.type]||ce.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(St,""):null==e?"":e:void 0}}),ce.extend({valHooks:{option:{get:function(e){var t=ce.find.attr(e,"value");return null!=t?t:Tt(ce.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||!fe(n.parentNode,"optgroup"))){if(t=ce(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=ce.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<ce.inArray(ce.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),ce.each(["radio","checkbox"],function(){ce.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<ce.inArray(ce(e).val(),t)}},le.checkOn||(ce.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Et=ie.location,jt={guid:Date.now()},At=/\?/;ce.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new ie.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||ce.error("Invalid XML: "+(n?ce.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Dt=/^(?:focusinfocus|focusoutblur)$/,Nt=function(e){e.stopPropagation()};ce.extend(ce.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||C],d=ue.call(e,"type")?e.type:e,h=ue.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||C,3!==n.nodeType&&8!==n.nodeType&&!Dt.test(d+ce.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[ce.expando]?e:new ce.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]:ce.makeArray(t,[e]),c=ce.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!y(n)){for(s=c.delegateType||d,Dt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||C)&&p.push(a.defaultView||a.parentWindow||ie)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(_.get(o,"events")||Object.create(null))[e.type]&&_.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&$(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)||!$(n)||u&&v(n[d])&&!y(n)&&((a=n[u])&&(n[u]=null),ce.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,Nt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,Nt),ce.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=ce.extend(new ce.Event,n,{type:e,isSimulated:!0});ce.event.trigger(r,null,t)}}),ce.fn.extend({trigger:function(e,t){return this.each(function(){ce.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return ce.event.trigger(e,t,n,!0)}});var qt=/\[\]$/,Lt=/\r?\n/g,Ht=/^(?:submit|button|image|reset|file)$/i,Ot=/^(?:input|select|textarea|keygen)/i;function Pt(n,e,r,i){var t;if(Array.isArray(e))ce.each(e,function(e,t){r||qt.test(n)?i(n,t):Pt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==x(e))i(n,e);else for(t in e)Pt(n+"["+t+"]",e[t],r,i)}ce.param=function(e,t){var n,r=[],i=function(e,t){var n=v(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!ce.isPlainObject(e))ce.each(e,function(){i(this.name,this.value)});else for(n in e)Pt(n,e[n],t,i);return r.join("&")},ce.fn.extend({serialize:function(){return ce.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=ce.prop(this,"elements");return e?ce.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!ce(this).is(":disabled")&&Ot.test(this.nodeName)&&!Ht.test(e)&&(this.checked||!we.test(e))}).map(function(e,t){var n=ce(this).val();return null==n?null:Array.isArray(n)?ce.map(n,function(e){return{name:t.name,value:e.replace(Lt,"\r\n")}}):{name:t.name,value:n.replace(Lt,"\r\n")}}).get()}});var Mt=/%20/g,Rt=/#.*$/,It=/([?&])_=[^&]*/,Wt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ft=/^(?:GET|HEAD)$/,$t=/^\/\//,Bt={},_t={},zt="*/".concat("*"),Xt=C.createElement("a");function Ut(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(D)||[];if(v(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Vt(t,i,o,a){var s={},u=t===_t;function l(e){var r;return s[e]=!0,ce.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 Gt(e,t){var n,r,i=ce.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&ce.extend(!0,e,r),e}Xt.href=Et.href,ce.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Et.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Et.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":zt,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":ce.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Gt(Gt(e,ce.ajaxSettings),t):Gt(ce.ajaxSettings,e)},ajaxPrefilter:Ut(Bt),ajaxTransport:Ut(_t),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=ce.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?ce(y):ce.event,x=ce.Deferred(),b=ce.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=Wt.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||Et.href)+"").replace($t,Et.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(D)||[""],null==v.crossDomain){r=C.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Xt.protocol+"//"+Xt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=ce.param(v.data,v.traditional)),Vt(Bt,v,t,T),h)return T;for(i in(g=ce.event&&v.global)&&0==ce.active++&&ce.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Ft.test(v.type),f=v.url.replace(Rt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Mt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(At.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(It,"$1"),o=(At.test(f)?"&":"?")+"_="+jt.guid+++o),v.url=f+o),v.ifModified&&(ce.lastModified[f]&&T.setRequestHeader("If-Modified-Since",ce.lastModified[f]),ce.etag[f]&&T.setRequestHeader("If-None-Match",ce.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]?", "+zt+"; 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=Vt(_t,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=ie.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&&ie.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<ce.inArray("script",v.dataTypes)&&ce.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"))&&(ce.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(ce.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]),--ce.active||ce.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return ce.get(e,t,n,"json")},getScript:function(e,t){return ce.get(e,void 0,t,"script")}}),ce.each(["get","post"],function(e,i){ce[i]=function(e,t,n,r){return v(t)&&(r=r||n,n=t,t=void 0),ce.ajax(ce.extend({url:e,type:i,dataType:r,data:t,success:n},ce.isPlainObject(e)&&e))}}),ce.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),ce._evalUrl=function(e,t,n){return ce.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){ce.globalEval(e,t,n)}})},ce.fn.extend({wrapAll:function(e){var t;return this[0]&&(v(e)&&(e=e.call(this[0])),t=ce(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 v(n)?this.each(function(e){ce(this).wrapInner(n.call(this,e))}):this.each(function(){var e=ce(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=v(t);return this.each(function(e){ce(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){ce(this).replaceWith(this.childNodes)}),this}}),ce.expr.pseudos.hidden=function(e){return!ce.expr.pseudos.visible(e)},ce.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},ce.ajaxSettings.xhr=function(){try{return new ie.XMLHttpRequest}catch(e){}};var Yt={0:200,1223:204},Qt=ce.ajaxSettings.xhr();le.cors=!!Qt&&"withCredentials"in Qt,le.ajax=Qt=!!Qt,ce.ajaxTransport(function(i){var o,a;if(le.cors||Qt&&!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(Yt[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&&ie.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()}}}),ce.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),ce.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 ce.globalEval(e),e}}}),ce.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),ce.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=ce("<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)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=Tt(e.slice(s)),e=e.slice(0,s)),v(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&ce.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?ce("<div>").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.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),v(t)&&(t=t.call(e,n,ce.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)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.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"===ce.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"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(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)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(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?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.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.on("mouseenter",e).on("mouseleave",t||e)}}),ce.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){ce.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var en=/^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g;ce.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),v(e))return r=ae.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(ae.call(arguments)))}).guid=e.guid=e.guid||ce.guid++,i},ce.holdReady=function(e){e?ce.readyWait++:ce.ready(!0)},ce.isArray=Array.isArray,ce.parseJSON=JSON.parse,ce.nodeName=fe,ce.isFunction=v,ce.isWindow=y,ce.camelCase=F,ce.type=x,ce.now=Date.now,ce.isNumeric=function(e){var t=ce.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},ce.trim=function(e){return null==e?"":(e+"").replace(en,"$1")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return ce});var tn=ie.jQuery,nn=ie.$;return ce.noConflict=function(e){return ie.$===ce&&(ie.$=nn),e&&ie.jQuery===ce&&(ie.jQuery=tn),ce},"undefined"==typeof e&&(ie.jQuery=ie.$=ce),ce});
\ No newline at end of file
diff --git a/public/storage/.gitignore b/public/storage/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..c96a04f008ee21e260b28f7701595ed59e2839e3
--- /dev/null
+++ b/public/storage/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
\ No newline at end of file
diff --git a/public/tpl/401.html b/public/tpl/401.html
new file mode 100644
index 0000000000000000000000000000000000000000..1f28e1331a732031afb47c078a49777ea2d2032c
--- /dev/null
+++ b/public/tpl/401.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+	<meta name="renderer" content="webkit" />
+	<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
+	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+	<title>登录失败</title>	
+	<style type="text/css">
+		html,body {width: 100%;height: 100%;background: #f7f7f7;margin: 0;padding: 0;border: 0;}
+		div,p {margin: 0;padding: 0;border: 0;}
+		.container {width: 100%;height: 100%;position: fixed;top: 0;left: 0;z-index: 999;overflow: hidden;}
+		.info {width: 360px;height: 360px;position: absolute;top: 50%;left: 50%;margin-top: -200px;margin-left: -180px;text-align:center;}
+		.info-status{width: 360px; display:none;justify-content: space-between;align-items: center;flex-wrap: nowrap;}
+		.info-status div{width:180px; height:180px; line-height:180px; font-size:160px; font-weight:200; color:#F35F37}
+		.info-status div.face{font-size:60px; border:9px solid #F35F37; width:120px; height:120px; line-height:118px; background-color:#fff; border-radius:50%;}
+		.info-tips{font-size:20px;color:#F35F37; padding-top:32px; font-weight:600; line-height:1.8}
+		.footer {position: absolute;font-size: 12px;bottom: 28px;text-align: center;width: 100%;color: #969696;}
+		.info-status{display: -webkit-flex;display: flex;flex-direction: row;}
+	</style>
+</head>
+
+<body>
+	<div class="container">
+		<div class="info">
+			<div class="info-status">
+				<div>4</div><div class="face">😔</div><div>1</div>
+			</div>
+			<div class="info-tips">哎呀！登录失败</div>
+		</div>
+		<div class="footer">
+			Copyright © 2022-2024 勾股OA ，Powered by GouguOPEN
+		</div>
+	</div>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/public/tpl/402.html b/public/tpl/402.html
new file mode 100644
index 0000000000000000000000000000000000000000..7bd8b4937a83ec45684bdc9582da4ed0b9123c40
--- /dev/null
+++ b/public/tpl/402.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+	<meta name="renderer" content="webkit" />
+	<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
+	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+	<title>出错啦</title>	
+	<style type="text/css">
+		html,body {width: 100%;height: 100%;background: #f7f7f7;margin: 0;padding: 0;border: 0;}
+		div,p {margin: 0;padding: 0;border: 0;}
+		.container {width: 100%;height: 100%;position: fixed;top: 0;left: 0;z-index: 999;overflow: hidden;}
+		.info {width: 360px;height: 360px;position: absolute;top: 50%;left: 50%;margin-top: -200px;margin-left: -180px;text-align:center;}
+		.info-status{width: 360px; display:none;justify-content: space-between;align-items: center;flex-wrap: nowrap;}
+		.info-status div{width:180px; height:180px; line-height:180px; font-size:160px; font-weight:200; color:#F35F37}
+		.info-status div.face{font-size:60px; border:9px solid #F35F37; width:120px; height:120px; line-height:118px; background-color:#fff; border-radius:50%;}
+		.info-tips{font-size:20px;color:#F35F37; padding-top:32px; font-weight:600; line-height:1.8}
+		.footer {position: absolute;font-size: 12px;bottom: 28px;text-align: center;width: 100%;color: #969696;}
+		.info-status{display: -webkit-flex;display: flex;flex-direction: row;}
+	</style>
+</head>
+
+<body>
+	<div class="container">
+		<div class="info">
+			<div class="info-status">
+				<div>4</div><div class="face">😔</div><div>2</div>
+			</div>
+			<div class="info-tips">哎呀！出错啦</div>
+		</div>
+		<div class="footer">
+			Copyright © 2022-2024 勾股OA ，Powered by GouguOPEN
+		</div>
+	</div>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/public/tpl/403.html b/public/tpl/403.html
new file mode 100644
index 0000000000000000000000000000000000000000..da71189ef462bc0b956de905a491f55f105e579b
--- /dev/null
+++ b/public/tpl/403.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+	<meta name="renderer" content="webkit" />
+	<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
+	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+	<title>禁止访问</title>	
+	<style type="text/css">
+		html,body {width: 100%;height: 100%;background: #f7f7f7;margin: 0;padding: 0;border: 0;}
+		div,p {margin: 0;padding: 0;border: 0;}
+		.container {width: 100%;height: 100%;position: fixed;top: 0;left: 0;z-index: 999;overflow: hidden;}
+		.info {width: 360px;height: 360px;position: absolute;top: 50%;left: 50%;margin-top: -200px;margin-left: -180px;text-align:center;}
+		.info-status{width: 360px; display:none;justify-content: space-between;align-items: center;flex-wrap: nowrap;}
+		.info-status div{width:180px; height:180px; line-height:180px; font-size:160px; font-weight:200; color:#F35F37}
+		.info-status div.face{font-size:60px; border:9px solid #F35F37; width:120px; height:120px; line-height:118px; background-color:#fff; border-radius:50%;}
+		.info-tips{font-size:20px;color:#F35F37; padding-top:32px; font-weight:600; line-height:1.8}
+		.footer {position: absolute;font-size: 12px;bottom: 28px;text-align: center;width: 100%;color: #969696;}
+		.info-status{display: -webkit-flex;display: flex;flex-direction: row;}
+	</style>
+</head>
+
+<body>
+	<div class="container">
+		<div class="info">
+			<div class="info-status">
+				<div>4</div><div class="face">😔</div><div>3</div>
+			</div>
+			<div class="info-tips">哎呀！禁止访问</div>
+		</div>
+		<div class="footer">
+			Copyright © 2022-2024 勾股OA ，Powered by GouguOPEN
+		</div>
+	</div>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/public/tpl/404.html b/public/tpl/404.html
new file mode 100644
index 0000000000000000000000000000000000000000..2b0c2ade78c480974dd17d88309fd03473b0bfff
--- /dev/null
+++ b/public/tpl/404.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+	<meta name="renderer" content="webkit" />
+	<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
+	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+	<title>找不到页面</title>	
+	<style type="text/css">
+		html,body {width: 100%;height: 100%;background: #f7f7f7;margin: 0;padding: 0;border: 0;}
+		div,p {margin: 0;padding: 0;border: 0;}
+		.container {width: 100%;height: 100%;position: fixed;top: 0;left: 0;z-index: 999;overflow: hidden;}
+		.info {width: 360px;height: 360px;position: absolute;top: 50%;left: 50%;margin-top: -200px;margin-left: -180px;text-align:center;}
+		.info-status{width: 360px; display:none;justify-content: space-between;align-items: center;flex-wrap: nowrap;}
+		.info-status div{width:180px; height:180px; line-height:180px; font-size:160px; font-weight:200; color:#F35F37}
+		.info-status div.face{font-size:60px; border:9px solid #F35F37; width:120px; height:120px; line-height:118px; background-color:#fff; border-radius:50%;}
+		.info-tips{font-size:20px;color:#F35F37; padding-top:32px; font-weight:600; line-height:1.8}
+		.footer {position: absolute;font-size: 12px;bottom: 28px;text-align: center;width: 100%;color: #969696;}
+		.info-status{display: -webkit-flex;display: flex;flex-direction: row;}
+	</style>
+</head>
+
+<body>
+	<div class="container">
+		<div class="info">
+			<div class="info-status">
+				<div>4</div><div class="face">😔</div><div>4</div>
+			</div>
+			<div class="info-tips">哎呀！找不到页面</div>
+		</div>
+		<div class="footer">
+			Copyright © 2022-2024 勾股OA ，Powered by GouguOPEN
+		</div>
+	</div>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/public/tpl/405.html b/public/tpl/405.html
new file mode 100644
index 0000000000000000000000000000000000000000..8d13b8f6a455bce2bb979f96a41c9ba5d33dcff0
--- /dev/null
+++ b/public/tpl/405.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+	<meta name="renderer" content="webkit" />
+	<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
+	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+	<title>无权限访问</title>	
+	<style type="text/css">
+		html,body {width: 100%;height: 100%;background: #f7f7f7;margin: 0;padding: 0;border: 0;}
+		div,p {margin: 0;padding: 0;border: 0;}
+		.container {width: 100%;height: 100%;position: fixed;top: 0;left: 0;z-index: 999;overflow: hidden;}
+		.info {width: 360px;height: 360px;position: absolute;top: 50%;left: 50%;margin-top: -200px;margin-left: -180px;text-align:center;}
+		.info-status{width: 360px; display:none;justify-content: space-between;align-items: center;flex-wrap: nowrap;}
+		.info-status div{width:180px; height:180px; line-height:180px; font-size:160px; font-weight:200; color:#F35F37}
+		.info-status div.face{font-size:60px; border:9px solid #F35F37; width:120px; height:120px; line-height:118px; background-color:#fff; border-radius:50%;}
+		.info-tips{font-size:20px;color:#F35F37; padding-top:32px; font-weight:600; line-height:1.8}
+		.footer {position: absolute;font-size: 12px;bottom: 28px;text-align: center;width: 100%;color: #969696;}
+		.info-status{display: -webkit-flex;display: flex;flex-direction: row;}
+	</style>
+</head>
+
+<body>
+	<div class="container">
+		<div class="info">
+			<div class="info-status">
+				<div>4</div><div class="face">😔</div><div>5</div>
+			</div>
+			<div class="info-tips">哎呀！无权限访问</div>
+		</div>
+		<div class="footer">
+			Copyright © 2022-2024 勾股OA ，Powered by GouguOPEN
+		</div>
+	</div>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/public/tpl/406.html b/public/tpl/406.html
new file mode 100644
index 0000000000000000000000000000000000000000..37bd99f4bfd9497e2685afd454119a71aa3f909e
--- /dev/null
+++ b/public/tpl/406.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+	<meta name="renderer" content="webkit" />
+	<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
+	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+	<title>找不到相关记录</title>	
+	<style type="text/css">
+		html,body {width: 100%;height: 100%;background: #f7f7f7;margin: 0;padding: 0;border: 0;}
+		div,p {margin: 0;padding: 0;border: 0;}
+		.container {width: 100%;height: 100%;position: fixed;top: 0;left: 0;z-index: 999;overflow: hidden;}
+		.info {width: 360px;height: 360px;position: absolute;top: 50%;left: 50%;margin-top: -200px;margin-left: -180px;text-align:center;}
+		.info-status{width: 360px; display:none;justify-content: space-between;align-items: center;flex-wrap: nowrap;}
+		.info-status div{width:180px; height:180px; line-height:180px; font-size:160px; font-weight:200; color:#F35F37}
+		.info-status div.face{font-size:60px; border:9px solid #F35F37; width:120px; height:120px; line-height:118px; background-color:#fff; border-radius:50%;}
+		.info-tips{font-size:20px;color:#F35F37; padding-top:32px; font-weight:600; line-height:1.8}
+		.footer {position: absolute;font-size: 12px;bottom: 28px;text-align: center;width: 100%;color: #969696;}
+		.info-status{display: -webkit-flex;display: flex;flex-direction: row;}
+	</style>
+</head>
+
+<body>
+	<div class="container">
+		<div class="info">
+			<div class="info-status">
+				<div>4</div><div class="face">😔</div><div>6</div>
+			</div>
+			<div class="info-tips">哎呀！找不到相关记录</div>
+		</div>
+		<div class="footer">
+			Copyright © 2022-2024 勾股OA ，Powered by GouguOPEN
+		</div>
+	</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/public/tpl/500.html b/public/tpl/500.html
new file mode 100644
index 0000000000000000000000000000000000000000..d3d94fd5801e9343081a4a6c33b466ad9b691ffd
--- /dev/null
+++ b/public/tpl/500.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+	<meta name="renderer" content="webkit" />
+	<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
+	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+	<title>页面错误</title>	
+	<style type="text/css">
+		html,body {width: 100%;height: 100%;background: #f7f7f7;margin: 0;padding: 0;border: 0;}
+		div,p {margin: 0;padding: 0;border: 0;}
+		.container {width: 100%;height: 100%;position: fixed;top: 0;left: 0;z-index: 999;overflow: hidden;}
+		.info {width: 360px;height: 360px;position: absolute;top: 50%;left: 50%;margin-top: -200px;margin-left: -180px;text-align:center;}
+		.info-status{width: 360px; display:none;justify-content: space-between;align-items: center;flex-wrap: nowrap;}
+		.info-status div{width:180px; height:180px; line-height:180px; font-size:160px; font-weight:200; color:#F35F37}
+		.info-status div.face{font-size:60px; border:9px solid #F35F37; width:120px; height:120px; line-height:118px; background-color:#fff; border-radius:50%;}
+		.info-tips{font-size:20px;color:#F35F37; padding-top:32px; font-weight:600; line-height:1.8}
+		.footer {position: absolute;font-size: 12px;bottom: 28px;text-align: center;width: 100%;color: #969696;}
+		.info-status{display: -webkit-flex;display: flex;flex-direction: row;}
+	</style>
+</head>
+
+<body>
+	<div class="container">
+		<div class="info">
+			<div class="info-status">
+				<div>5</div><div class="face">😔</div><div>0</div>
+			</div>
+			<div class="info-tips">哎呀！页面错误</div>
+		</div>
+		<div class="footer">
+			Copyright © 2022-2024 勾股OA ，Powered by GouguOPEN
+		</div>
+	</div>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/public/tpl/default_index.tpl b/public/tpl/default_index.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..39d8c13844edfb24de83b9f5c33086209e24f20f
--- /dev/null
+++ b/public/tpl/default_index.tpl
@@ -0,0 +1,42 @@
+<?php
+namespace {$app}\{$module}{layer};
+
+class Index{$suffix}
+{
+    public function index()
+    {
+        return '<!DOCTYPE html>
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+	<meta name="renderer" content="webkit" />
+	<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
+	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+	<title>系统提示</title>	
+	<style type="text/css">
+		html,body {width: 100%;height: 100%;background: #f7f7f7;margin: 0;padding: 0;border: 0;}
+		div,p {margin: 0;padding: 0;border: 0;}
+		.container {width: 100%;height: 100%;position: fixed;top: 0;left: 0;z-index: 999;overflow: hidden;}
+		.info {width: 480px;height: 360px;position: absolute;top: 50%;left: 50%;margin-top: -200px;margin-left: -240px;text-align:center;}
+		.info-status{width: 500px; display:none;justify-content: space-between;align-items: center;flex-wrap: nowrap;}
+		.info-status div{width:120px; height:180px; line-height:180px; font-size:160px; font-weight:200; color:#F35F37}
+		.info-status div.face{font-size:60px; border:9px solid #F35F37; width:120px; height:120px; line-height:118px; background-color:#fff; border-radius:50%;}
+		.info-tips{font-size:20px;color:#F35F37; padding-top:32px; font-weight:600;}
+		.footer {position: absolute;font-size: 12px;bottom: 28px;text-align: center;width: 100%;color: #969696;}
+		.info-status.code-500{display: -webkit-flex;display: flex;flex-direction: row;}
+	</style>
+</head>
+<body>
+	<div class="container">
+		<div class="info">
+			<div class="info-status code-500" title="出错啦"><div>5</div><div class="face">😔</div><div class="face">😔</div></div>
+			<div class="info-tips">哎呀！出错啦，请开启debug模式调试，<a href="https://blog.gougucms.com/home/book/detail/bid/3/id/77.html" target="_blank">开启debug</a></div>
+		</div>
+		<div class="footer">
+			Copyright © 2022-2024 勾股OA ，Powered by GouguOPEN
+		</div>
+	</div>
+</body>
+</html>';
+    }
+}
diff --git a/public/tpl/dispatch_jump.tpl b/public/tpl/dispatch_jump.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..f59fef2c8aae3232854811e941381e7e0d7b7531
--- /dev/null
+++ b/public/tpl/dispatch_jump.tpl
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+	<meta name="renderer" content="webkit"/>
+	<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
+	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <title>跳转提示</title>
+    <?php if(is_mobile()==true){?>
+    <style type="text/css">
+        body, h1, h2, p,dl,dd,dt{margin: 0;padding: 0;font: 15px/1.5 微软雅黑,tahoma,arial;}
+        body{background:#efefef;}
+        h1, h2, h3, h4, h5, h6 {font-size: 100%;cursor:default;}
+        ul, ol {list-style: none outside none;}
+        a {text-decoration: none;color:#447BC4}
+        a:hover {text-decoration: underline;}
+        .ip-attack{width:100%; margin:200px auto 0;}
+        .ip-attack dl{ background:#fff; padding:30px; border-radius:8px;border: 1px solid #ddd;-webkit-box-shadow: 0 0 8px #ddd;-moz-box-shadow: 0 0 8px #ddd;box-shadow: 0 0 8px #ddd;}
+        .ip-attack dt{text-align:center;}
+        .ip-attack dd{font-size:16px; color:#333; text-align:center;}
+        .tips{text-align:center; font-size:14px; line-height:50px; color:#999;}
+    </style>
+<?php }else{ ?>
+<style type="text/css">
+        body, h1, h2, p,dl,dd,dt{margin: 0;padding: 0;font: 15px/1.5 微软雅黑,tahoma,arial;}
+        body{background:#efefef;}
+        h1, h2, h3, h4, h5, h6 {font-size: 100%;cursor:default;}
+        ul, ol {list-style: none outside none;}
+        a {text-decoration: none;color:#447BC4}
+        a:hover {text-decoration: underline;}
+        .ip-attack{width:600px; margin:200px auto 0;}
+        .ip-attack dl{ background:#fff; padding:30px; border-radius:8px;border: 1px solid #ddd;-webkit-box-shadow: 0 0 8px #ddd;-moz-box-shadow: 0 0 8px #ddd;box-shadow: 0 0 8px #ddd;}
+        .ip-attack dt{text-align:center;}
+        .ip-attack dd{font-size:16px; color:#333; text-align:center;}
+        .tips{text-align:center; font-size:14px; line-height:50px; color:#999;}
+    </style>
+<?php }?>
+    
+</head>
+<body>
+    <div class="ip-attack"><dl>
+        <?php switch ($code) {?>
+            <?php case 1:?>
+            <dt style="color: green"><?php echo(strip_tags($msg));?></dt>
+            <?php break;?>
+            <?php case 0:?>
+            <dt style="color: red"><?php echo(strip_tags($msg));?></dt>
+            <?php break;?>
+        <?php } ?>
+        <br>
+        <dt>
+            页面自动 <a id="href" href="<?php echo($url);?>">跳转</a>，等待时间： <b id="wait"><?php echo($wait);?></b>
+        </dt></dl>
+    </div>
+    <script type="text/javascript">
+        (function(){
+            var wait = document.getElementById('wait'),
+                href = document.getElementById('href').href;
+            var interval = setInterval(function(){
+                var time = --wait.innerHTML;
+                if(time <= 0) {
+                    location.href = href;
+                    clearInterval(interval);
+                };
+            }, 1000);
+        })();
+    </script>
+</body>
+</html>
diff --git a/public/tpl/error.html b/public/tpl/error.html
new file mode 100644
index 0000000000000000000000000000000000000000..23af48d57775399531d169f9992cbbcce16d3151
--- /dev/null
+++ b/public/tpl/error.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+	<meta name="renderer" content="webkit" />
+	<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
+	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+	<title>系统提示</title>	
+	<style type="text/css">
+		html,body {width: 100%;height: 100%;background: #f7f7f7;margin: 0;padding: 0;border: 0;}
+		div,p {margin: 0;padding: 0;border: 0;}
+		.container {width: 100%;height: 100%;position: fixed;top: 0;left: 0;z-index: 999;overflow: hidden;}
+		.info {width: 360px;height: 360px;position: absolute;top: 50%;left: 50%;margin-top: -200px;margin-left: -180px;text-align:center;}
+		.info-status{width: 360px; display:none;justify-content: space-between;align-items: center;flex-wrap: nowrap;}
+		.info-status div{width:180px; height:180px; line-height:180px; font-size:160px; font-weight:200; color:#F35F37}
+		.info-status div.face{font-size:60px; border:9px solid #F35F37; width:120px; height:120px; line-height:118px; background-color:#fff; border-radius:50%;}
+		.info-tips{font-size:20px;color:#F35F37; padding-top:32px; font-weight:600; line-height:1.8}
+		.footer {position: absolute;font-size: 12px;bottom: 28px;text-align: center;width: 100%;color: #969696;}
+		.info-status.code-{$code|default='402'}{display: -webkit-flex;display: flex;flex-direction: row;}
+	</style>
+</head>
+
+<body>
+	<div class="container">
+		<div class="info">
+			<div class="info-status code-401" title="登录失败"><div>4</div><div class="face">😔</div><div>1</div></div>
+			<div class="info-status code-402" title="出错啦"><div>4</div><div class="face">😔</div><div>2</div></div>
+			<div class="info-status code-403" title="禁止访问"><div>4</div><div class="face">😔</div><div>3</div></div>
+			<div class="info-status code-404" title="找不到页面"><div>4</div><div class="face">😔</div><div>4</div></div>
+			<div class="info-status code-405" title="无权限访问"><div>4</div><div class="face">😔</div><div>5</div></div>
+			<div class="info-status code-406" title="找不到相关记录"><div>4</div><div class="face">😔</div><div>6</div></div>
+			<div class="info-status code-500" title="页面错误"><div>5</div><div class="face">😔</div><div class="face">😔</div></div>
+			<div class="info-tips">哎呀！{$warning|default="出错啦!"}</div>
+		</div>
+		<div class="footer">
+			Copyright © 2022-2024 勾股OA ，Powered by GouguOPEN
+		</div>
+	</div>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/public/tpl/page_trace.tpl b/public/tpl/page_trace.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..7c5df6fb5e78e7072726229a970a70b7738e94e4
--- /dev/null
+++ b/public/tpl/page_trace.tpl
@@ -0,0 +1,71 @@
+<div id="think_page_trace" style="position: fixed;bottom:0;right:0;font-size:14px;width:100%;z-index: 999999;color: #000;text-align:left;font-family:'微软雅黑';">
+    <div id="think_page_trace_tab" style="display: none;background:white;margin:0;height: 250px;">
+        <div id="think_page_trace_tab_tit" style="height:30px;padding: 6px 12px 0;border-bottom:1px solid #ececec;border-top:1px solid #ececec;font-size:16px">
+            <?php foreach ($trace as $key => $value) {?>
+            <span style="color:#000;padding-right:12px;height:30px;line-height:30px;display:inline-block;margin-right:3px;cursor:pointer;font-weight:700"><?php echo $key ?></span>
+            <?php }?>
+        </div>
+        <div id="think_page_trace_tab_cont" style="overflow:auto;height:212px;padding:0;line-height: 24px">
+            <?php foreach ($trace as $info) {?>
+            <div style="display:none;">
+                <ol style="padding: 0; margin:0">
+                    <?php
+                    if (is_array($info)) {
+                        foreach ($info as $k => $val) {
+                            echo '<li style="border-bottom:1px solid #EEE;font-size:14px;padding:0 12px">' . (is_numeric($k) ? '' : $k.' : ') . htmlentities(print_r($val,true), ENT_COMPAT, 'utf-8') . '</li>';
+                        }
+                    }
+                    ?>
+                </ol>
+            </div>
+            <?php }?>
+        </div>
+    </div>
+    <div id="think_page_trace_close" style="display:none;text-align:right;height:15px;position:absolute;top:10px;right:12px;cursor:pointer;"><img style="vertical-align:top;" src="data:image/gif;base64,R0lGODlhDwAPAJEAAAAAAAMDA////wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MUQxMjc1MUJCQUJDMTFFMTk0OUVGRjc3QzU4RURFNkEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MUQxMjc1MUNCQUJDMTFFMTk0OUVGRjc3QzU4RURFNkEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoxRDEyNzUxOUJBQkMxMUUxOTQ5RUZGNzdDNThFREU2QSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoxRDEyNzUxQUJBQkMxMUUxOTQ5RUZGNzdDNThFREU2QSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAAAAAAALAAAAAAPAA8AAAIdjI6JZqotoJPR1fnsgRR3C2jZl3Ai9aWZZooV+RQAOw==" /></div>
+</div>
+<div id="think_page_trace_open" style="height:30px;float:right;text-align:right;overflow:hidden;position:fixed;bottom:0;right:0;color:#000;line-height:30px;cursor:pointer;">
+    <div style="background:#232323;color:#FFF;padding:0 6px;float:right;line-height:30px;font-size:14px"><?php echo \think\Debug::getUseTime().'s ';?></div>
+    <img width="30" style="" title="ShowPageTrace" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjVERDVENkZGQjkyNDExRTE5REY3RDQ5RTQ2RTRDQUJCIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjVERDVENzAwQjkyNDExRTE5REY3RDQ5RTQ2RTRDQUJCIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NURENUQ2RkRCOTI0MTFFMTlERjdENDlFNDZFNENBQkIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NURENUQ2RkVCOTI0MTFFMTlERjdENDlFNDZFNENBQkIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5fx6IRAAAMCElEQVR42sxae3BU1Rk/9+69+8xuNtkHJAFCSIAkhMgjCCJQUi0GtEIVbP8Qq9LH2No6TmfaztjO2OnUdvqHFMfOVFTqIK0vUEEeqUBARCsEeYQkEPJoEvIiELLvvc9z+p27u2F3s5tsBB1OZiebu5dzf7/v/L7f952zMM8cWIwY+Mk2ulCp92Fnq3XvnzArr2NZnYNldDp0Gw+/OEQ4+obQn5D+4Ubb22+YOGsWi/Todh8AHglKEGkEsnHBQ162511GZFgW6ZCBM9/W4H3iNSQqIe09O196dLKX7d1O39OViP/wthtkND62if/wj/DbMpph8BY/m9xy8BoBmQk+mHqZQGNy4JYRwCoRbwa8l4JXw6M+orJxpU0U6ToKy/5bQsAiTeokGKkTx46RRxxEUgrwGgF4MWNNEJCGgYTvpgnY1IJWg5RzfqLgvcIgktX0i8dmMlFA8qCQ5L0Z/WObPLUxT1i4lWSYDISoEfBYGvM+LlMQQdkLHoWRRZ8zYQI62Thswe5WTORGwNXDcGjqeOA9AF7B8rhzsxMBEoJ8oJKaqPu4hblHMCMPwl9XeNWyb8xkB/DDGYKfMAE6aFL7xesZ389JlgG3XHEMI6UPDOP6JHHu67T2pwNPI69mCP4rEaBDUAJaKc/AOuXiwH07VCS3w5+UQMAuF/WqGI+yFIwVNBwemBD4r0wgQiKoFZa00sEYTwss32lA1tPwVxtc8jQ5/gWCwmGCyUD8vRT0sHBFW4GJDvZmrJFWRY1EkrGA6ZB8/10fOZSSj0E6F+BSP7xidiIzhBmKB09lEwHPkG+UQIyEN44EBiT5vrv2uJXyPQqSqO930fxvcvwbR/+JAkD9EfASgI9EHlp6YiHO4W+cAB20SnrFqxBbNljiXf1Pl1K2S0HCWfiog3YlAD5RGwwxK6oUjTweuVigLjyB0mX410mAFnMoVK1lvvUvgt8fUJH0JVyjuvcmg4dE5mUiFtD24AZ4qBVELxXKS+pMxN43kSdzNwudJ+bQbLlmnxvPOQoCugSap1GnSRoG8KOiKbH+rIA0lEeSAg3y6eeQ6XI2nrYnrPM89bUTgI0Pdqvl50vlNbtZxDUBcLBK0kPd5jPziyLdojJIN0pq5/mdzwL4UVvVInV5ncQEPNOUxa9d0TU+CW5l+FoI0GSDKHVVSOs+0KOsZoxwOzSZNFGv0mQ9avyLCh2Hpm+70Y0YJoJVgmQv822wnDC8Miq6VjJ5IFed0QD1YiAbT+nQE8v/RMZfmgmcCRHIIu7Bmcp39oM9fqEychcA747KxQ/AEyqQonl7hATtJmnhO2XYtgcia01aSbVMenAXrIomPcLgEBA4liGBzFZAT8zBYqW6brI67wg8sFVhxBhwLwBP2+tqBQqqK7VJKGh/BRrfTr6nWL7nYBaZdBJHqrX3kPEPap56xwE/GvjJTRMADeMCdcGpGXL1Xh4ZL8BDOlWkUpegfi0CeDzeA5YITzEnddv+IXL+UYCmqIvqC9UlUC/ki9FipwVjunL3yX7dOTLeXmVMAhbsGporPfyOBTm/BJ23gTVehsvXRnSewagUfpBXF3p5pygKS7OceqTjb7h2vjr/XKm0ZofKSI2Q/J102wHzatZkJPYQ5JoKsuK+EoHJakVzubzuLQDepCKllTZi9AG0DYg9ZLxhFaZsOu7bvlmVI5oPXJMQJcHxHClSln1apFTvAimeg48u0RWFeZW4lVcjbQWZuIQK1KozZfIDO6CSQmQQXdpBaiKZyEWThVK1uEc6v7V7uK0ysduExPZx4vysDR+4SelhBYm0R6LBuR4PXts8MYMcJPsINo4YZCDLj0sgB0/vLpPXvA2Tn42Cv5rsLulGubzW0sEd3d4W/mJt2Kck+DzDMijfPLOjyrDhXSh852B+OvflqAkoyXO1cYfujtc/i3jJSAwhgfFlp20laMLOku/bC7prgqW7lCn4auE5NhcXPd3M7x70+IceSgZvNljCd9k3fLjYsPElqLR14PXQZqD2ZNkkrAB79UeJUebFQmXpf8ZcAQt2XrMQdyNUVBqZoUzAFyp3V3xi/MubUA/mCT4Fhf038PC8XplhWnCmnK/ZzyC2BSTRSqKVOuY2kB8Jia0lvvRIVoP+vVWJbYarf6p655E2/nANBMCWkgD49DA0VAMyI1OLFMYCXiU9bmzi9/y5i/vsaTpHPHidTofzLbM65vMPva9HlovgXp0AvjtaqYMfDD0/4mAsYE92pxa+9k1QgCnRVObCpojpzsKTPvayPetTEgBdwnssjuc0kOBFX+q3HwRQxdrOLAqeYRjkMk/trTSu2Z9Lik7CfF0AvjtqAhS4NHobGXUnB5DQs8hG8p/wMX1r4+8xkmyvQ50JVq72TVeXbz3HvpWaQJi57hJYTw4kGbtS+C2TigQUtZUX+X27QQq2ePBZBru/0lxTm8fOOQ5yaZOZMAV+he4FqIMB+LQB0UgMSajANX29j+vbmly8ipRvHeSQoQOkM5iFXcPQCVwDMs5RBCQmaPOyvbNd6uwvQJ183BZQG3Zc+Eiv7vQOKu8YeDmMcJlt2ckyftVeMIGLBCmdMHl/tFILYwGPjXWO3zOfSq/+om+oa7Mlh2fpSsRGLp7RAW3FUVjNHgiMhyE6zBFjM2BdkdJGO7nP1kJXWAtBuBpPIAu7f+hhu7bFXIuC5xWrf0X2xreykOsUyKkF2gwadbrXDcXrfKxR43zGcSj4t/cCgr+a1iy6EjE5GYktUCl9fwfMeylyooGF48bN2IGLTw8x7StS7sj8TF9FmPGWQhm3rRR+o9lhvjJvSYAdfDUevI1M6bnX/OwWaDMOQ8RPgKRo0eulBTdT8AW2kl8e9L7UHghHwMfLiZPNoSpx0yugpQZaFqKWqxVSM3a2pN1SAhC2jf94I7ybBI7EL5A2Wvu5ht3xsoEt4+Ay/abXgCQAxyOeDsDlTCQzy75ohcGgv9Tra9uiymRUYTLrswOLlCdfAQf7HPDQQ4ErAH5EDXB9cMxWYpjtXApRncojS0sbV/cCgHTHwGNBJy+1PQE2x56FpaVR7wfQGZ37V+V+19EiHNvR6q1fRUjqvbjbMq1/qfHxbTrE10ePY2gPFk48D2CVMTf1AF4PXvyYR9dV6Wf7H413m3xTWQvYGhQ7mfYwA5mAX+18Vue05v/8jG/fZX/IW5MKPKtjSYlt0ellxh+/BOCPAwYaeVr0QofZFxJWVWC8znG70au6llVmktsF0bfHF6k8fvZ5esZJbwHwwnjg59tXz6sL/P0NUZDuSNu1mnJ8Vab17+cy005A9wtOpp3i0bZdpJLUil00semAwN45LgEViZYe3amNye0B6A9chviSlzXVsFtyN5/1H3gaNmMpn8Fz0GpYFp6Zw615H/LpUuRQQDMCL82n5DpBSawkvzIdN2ypiT8nSLth8Pk9jnjwdFzH3W4XW6KMBfwB569NdcGX93mC16tTflcArcYUc/mFuYbV+8zY0SAjAVoNErNgWjtwumJ3wbn/HlBFYdxHvSkJJEc+Ngal9opSwyo9YlITX2C/P/+gf8sxURSLR+mcZUmeqaS9wrh6vxW5zxFCOqFi90RbDWq/YwZmnu1+a6OvdpvRqkNxxe44lyl4OobEnpKA6Uox5EfH9xzPs/HRKrTPWdIQrK1VZDU7ETiD3Obpl+8wPPCRBbkbwNtpW9AbBe5L1SMlj3tdTxk/9W47JUmqS5HU+JzYymUKXjtWVmT9RenIhgXc+nroWLyxXJhmL112OdB8GCsk4f8oZJucnvmmtR85mBn10GZ0EKSCMUSAR3ukcXd5s7LvLD3me61WkuTCpJzYAyRurMB44EdEJzTfU271lUJC03YjXJXzYOGZwN4D8eB5jlfLrdWfzGRW7icMPfiSO6Oe7s20bmhdgLX4Z23B+s3JgQESzUDiMboSzDMHFpNMwccGePauhfwjzwnI2wu9zKGgEFg80jcZ7MHllk07s1H+5yojtUQTlH4nFdLKTGwDmPbIklOb1L1zO4T6N8NCuDLFLS/C63c0eNRimZ++s5BMBHxU11jHchI9oFVUxRh/eMDzHEzGYu0Lg8gJ7oS/tFCwoic44fyUtix0n/46vP4bf+//BRgAYwDDar4ncHIAAAAASUVORK5CYII=">
+</div>
+
+<script type="text/javascript">
+    (function(){
+        var tab_tit  = document.getElementById('think_page_trace_tab_tit').getElementsByTagName('span');
+        var tab_cont = document.getElementById('think_page_trace_tab_cont').getElementsByTagName('div');
+        var open     = document.getElementById('think_page_trace_open');
+        var close    = document.getElementById('think_page_trace_close').children[0];
+        var trace    = document.getElementById('think_page_trace_tab');
+        var cookie   = document.cookie.match(/thinkphp_show_page_trace=(\d\|\d)/);
+        var history  = (cookie && typeof cookie[1] != 'undefined' && cookie[1].split('|')) || [0,0];
+        open.onclick = function(){
+            trace.style.display = 'block';
+            this.style.display = 'none';
+            close.parentNode.style.display = 'block';
+            history[0] = 1;
+            document.cookie = 'thinkphp_show_page_trace='+history.join('|')
+        }
+        close.onclick = function(){
+            trace.style.display = 'none';
+            this.parentNode.style.display = 'none';
+            open.style.display = 'block';
+            history[0] = 0;
+            document.cookie = 'thinkphp_show_page_trace='+history.join('|')
+        }
+        for(var i = 0; i < tab_tit.length; i++){
+            tab_tit[i].onclick = (function(i){
+                return function(){
+                    for(var j = 0; j < tab_cont.length; j++){
+                        tab_cont[j].style.display = 'none';
+                        tab_tit[j].style.color = '#999';
+                    }
+                    tab_cont[i].style.display = 'block';
+                    tab_tit[i].style.color = '#000';
+                    history[1] = i;
+                    document.cookie = 'thinkphp_show_page_trace='+history.join('|')
+                }
+            })(i)
+        }
+        parseInt(history[0]) && open.click();
+        tab_tit[history[1]].click();
+    })();
+</script>
diff --git a/public/tpl/think_exception.tpl b/public/tpl/think_exception.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..bb5ca39e06f9864f9c2a99482021ee85113a223f
--- /dev/null
+++ b/public/tpl/think_exception.tpl
@@ -0,0 +1,500 @@
+<?php
+/** @var array $traces */
+if (!function_exists('parse_padding')) {
+    function parse_padding($source)
+    {
+        $length  = strlen(strval(count($source['source']) + $source['first']));
+        return 40 + ($length - 1) * 8;
+    }
+}
+
+if (!function_exists('parse_class')) {
+    function parse_class($name)
+    {
+        $names = explode('\\', $name);
+        return '<abbr title="'.$name.'">'.end($names).'</abbr>';
+    }
+}
+
+if (!function_exists('parse_file')) {
+    function parse_file($file, $line)
+    {
+        return '<a class="toggle" title="'."{$file} line {$line}".'">'.basename($file)." line {$line}".'</a>';
+    }
+}
+
+if (!function_exists('parse_args')) {
+    function parse_args($args)
+    {
+        $result = [];
+        foreach ($args as $key => $item) {
+            switch (true) {
+                case is_object($item):
+                    $value = sprintf('<em>object</em>(%s)', parse_class(get_class($item)));
+                    break;
+                case is_array($item):
+                    if (count($item) > 3) {
+                        $value = sprintf('[%s, ...]', parse_args(array_slice($item, 0, 3)));
+                    } else {
+                        $value = sprintf('[%s]', parse_args($item));
+                    }
+                    break;
+                case is_string($item):
+                    if (strlen($item) > 20) {
+                        $value = sprintf(
+                            '\'<a class="toggle" title="%s">%s...</a>\'',
+                            htmlentities($item),
+                            htmlentities(substr($item, 0, 20))
+                        );
+                    } else {
+                        $value = sprintf("'%s'", htmlentities($item));
+                    }
+                    break;
+                case is_int($item):
+                case is_float($item):
+                    $value = $item;
+                    break;
+                case is_null($item):
+                    $value = '<em>null</em>';
+                    break;
+                case is_bool($item):
+                    $value = '<em>' . ($item ? 'true' : 'false') . '</em>';
+                    break;
+                case is_resource($item):
+                    $value = '<em>resource</em>';
+                    break;
+                default:
+                    $value = htmlentities(str_replace("\n", '', var_export(strval($item), true)));
+                    break;
+            }
+
+            $result[] = is_int($key) ? $value : "'{$key}' => {$value}";
+        }
+
+        return implode(', ', $result);
+    }
+}
+if (!function_exists('echo_value')) {
+    function echo_value($val)
+    {
+        if (is_array($val) || is_object($val)) {
+            echo htmlentities(json_encode($val, JSON_PRETTY_PRINT));
+        } elseif (is_bool($val)) {
+            echo $val ? 'true' : 'false';
+        } elseif (is_scalar($val)) {
+            echo htmlentities($val);
+        } else {
+            echo 'Resource';
+        }
+    }
+}
+?>
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title>错误</title>
+    <meta name="robots" content="noindex,nofollow" />
+    <style>
+        /* Base */
+        body {
+            color: #333;
+            font: 16px Verdana, "Helvetica Neue", helvetica, Arial, 'Microsoft YaHei', sans-serif;
+            margin: 0;
+            padding: 0 20px 20px;
+        }
+        h1{
+            margin: 10px 0 0;
+            font-size: 28px;
+            font-weight: 500;
+            line-height: 32px;
+        }
+        h2{
+            color: #4288ce;
+            font-weight: 400;
+            padding: 6px 0;
+            margin: 6px 0 0;
+            font-size: 18px;
+            border-bottom: 1px solid #eee;
+        }
+        h3{
+            margin: 12px;
+            font-size: 16px;
+            font-weight: bold;
+        }
+        abbr{
+            cursor: help;
+            text-decoration: underline;
+            text-decoration-style: dotted;
+        }
+        a{
+            color: #868686;
+            cursor: pointer;
+        }
+        a:hover{
+            text-decoration: underline;
+        }
+        .line-error{
+            background: #f8cbcb;
+        }
+        .echo table {
+            width: 100%;
+        }
+        .echo pre {
+            padding: 16px;
+            overflow: auto;
+            font-size: 85%;
+            line-height: 1.45;
+            background-color: #f7f7f7;
+            border: 0;
+            border-radius: 3px;
+            font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
+        }
+        .echo pre > pre {
+            padding: 0;
+            margin: 0;
+        }
+        /* Exception Info */
+        .exception {
+            margin-top: 20px;
+        }
+        .exception .message{
+            padding: 12px;
+            border: 1px solid #ddd;
+            border-bottom: 0 none;
+            line-height: 18px;
+            font-size:16px;
+            border-top-left-radius: 4px;
+            border-top-right-radius: 4px;
+            font-family: Consolas,"Liberation Mono",Courier,Verdana,"微软雅黑",serif;
+        }
+        .exception .code{
+            float: left;
+            text-align: center;
+            color: #fff;
+            margin-right: 12px;
+            padding: 16px;
+            border-radius: 4px;
+            background: #999;
+        }
+        .exception .source-code{
+            padding: 6px;
+            border: 1px solid #ddd;
+
+            background: #f9f9f9;
+            overflow-x: auto;
+
+        }
+        .exception .source-code pre{
+            margin: 0;
+        }
+        .exception .source-code pre ol{
+            margin: 0;
+            color: #4288ce;
+            display: inline-block;
+            min-width: 100%;
+            box-sizing: border-box;
+            font-size:14px;
+            font-family: "Century Gothic",Consolas,"Liberation Mono",Courier,Verdana,serif;
+            padding-left: <?php echo (isset($source) && !empty($source)) ? parse_padding($source) : 40;  ?>px;
+        }
+        .exception .source-code pre li{
+            border-left: 1px solid #ddd;
+            height: 18px;
+            line-height: 18px;
+        }
+        .exception .source-code pre code{
+            color: #333;
+            height: 100%;
+            display: inline-block;
+            border-left: 1px solid #fff;
+            font-size:14px;
+            font-family: Consolas,"Liberation Mono",Courier,Verdana,"微软雅黑",serif;
+        }
+        .exception .trace{
+            padding: 6px;
+            border: 1px solid #ddd;
+            border-top: 0 none;
+            line-height: 16px;
+            font-size:14px;
+            font-family: Consolas,"Liberation Mono",Courier,Verdana,"微软雅黑",serif;
+        }
+        .exception .trace h2:hover {
+            text-decoration: underline;
+            cursor: pointer;
+        }
+        .exception .trace ol{
+            margin: 12px;
+        }
+        .exception .trace ol li{
+            padding: 2px 4px;
+        }
+        .exception div:last-child{
+            border-bottom-left-radius: 4px;
+            border-bottom-right-radius: 4px;
+        }
+
+        /* Exception Variables */
+        .exception-var table{
+            width: 100%;
+            margin: 12px 0;
+            box-sizing: border-box;
+            table-layout:fixed;
+            word-wrap:break-word;
+        }
+        .exception-var table caption{
+            text-align: left;
+            font-size: 16px;
+            font-weight: bold;
+            padding: 6px 0;
+        }
+        .exception-var table caption small{
+            font-weight: 300;
+            display: inline-block;
+            margin-left: 10px;
+            color: #ccc;
+        }
+        .exception-var table tbody{
+            font-size: 13px;
+            font-family: Consolas, "Liberation Mono", Courier, "微软雅黑",serif;
+        }
+        .exception-var table td{
+            padding: 0 6px;
+            vertical-align: top;
+            word-break: break-all;
+        }
+        .exception-var table td:first-child{
+            width: 28%;
+            font-weight: bold;
+            white-space: nowrap;
+        }
+        .exception-var table td pre{
+            margin: 0;
+        }
+
+        /* Copyright Info */
+        .copyright{
+            margin-top: 24px;
+            padding: 12px 0;
+            border-top: 1px solid #eee;
+        }
+
+        /* SPAN elements with the classes below are added by prettyprint. */
+        pre.prettyprint .pln { color: #000 }  /* plain text */
+        pre.prettyprint .str { color: #080 }  /* string content */
+        pre.prettyprint .kwd { color: #008 }  /* a keyword */
+        pre.prettyprint .com { color: #800 }  /* a comment */
+        pre.prettyprint .typ { color: #606 }  /* a type name */
+        pre.prettyprint .lit { color: #066 }  /* a literal value */
+        /* punctuation, lisp open bracket, lisp close bracket */
+        pre.prettyprint .pun, pre.prettyprint .opn, pre.prettyprint .clo { color: #660 }
+        pre.prettyprint .tag { color: #008 }  /* a markup tag name */
+        pre.prettyprint .atn { color: #606 }  /* a markup attribute name */
+        pre.prettyprint .atv { color: #080 }  /* a markup attribute value */
+        pre.prettyprint .dec, pre.prettyprint .var { color: #606 }  /* a declaration; a variable name */
+        pre.prettyprint .fun { color: red }  /* a function name */
+    </style>
+</head>
+<body>
+    <?php if (\think\facade\App::isDebug()) { ?>
+        <?php foreach ($traces as $index => $trace) { ?>
+    <div class="exception">
+        <div class="message">
+            <div class="info">
+                <div>
+                    <h2><?php echo "#{$index} [{$trace['code']}]" . sprintf('%s in %s', parse_class($trace['name']), parse_file($trace['file'], $trace['line'])); ?></h2>
+                </div>
+                <div><h1><?php echo nl2br(htmlentities($trace['message'])); ?></h1></div>
+            </div>
+        </div>
+            <?php if (!empty($trace['source'])) { ?>
+                <div class="source-code">
+                    <pre class="prettyprint lang-php"><ol start="<?php echo $trace['source']['first']; ?>"><?php foreach ((array) $trace['source']['source'] as $key => $value) { ?><li class="line-<?php echo "{$index}-"; echo $key + $trace['source']['first']; echo $trace['line'] === $key + $trace['source']['first'] ? ' line-error' : ''; ?>"><code><?php echo htmlentities($value); ?></code></li><?php } ?></ol></pre>
+                </div>
+            <?php }?>
+        <div class="trace">
+            <h2 data-expand="<?php echo 0 === $index ? '1' : '0'; ?>">Call Stack</h2>
+            <ol>
+                <li><?php echo sprintf('in %s', parse_file($trace['file'], $trace['line'])); ?></li>
+                <?php foreach ((array) $trace['trace'] as $value) { ?>
+                    <li>
+                        <?php
+                        // Show Function
+                        if ($value['function']) {
+                            echo sprintf(
+                                'at %s%s%s(%s)',
+                                isset($value['class']) ? parse_class($value['class']) : '',
+                                isset($value['type'])  ? $value['type'] : '',
+                                $value['function'],
+                                isset($value['args'])?parse_args($value['args']):''
+                            );
+                        }
+
+                        // Show line
+                        if (isset($value['file']) && isset($value['line'])) {
+                            echo sprintf(' in %s', parse_file($value['file'], $value['line']));
+                        }
+                        ?>
+                    </li>
+                <?php } ?>
+            </ol>
+        </div>
+    </div>
+        <?php } ?>
+    <?php } else { ?>
+    <div class="exception">
+        <div class="info"><h1><?php echo htmlentities($message); ?></h1></div>
+    </div>
+    <?php } ?>
+    
+    <?php if (!empty($datas)) { ?>
+    <div class="exception-var">
+        <h2>Exception Datas</h2>
+        <?php foreach ((array) $datas as $label => $value) { ?>
+        <table>
+            <?php if (empty($value)) { ?>
+            <caption><?php echo $label; ?><small>empty</small></caption>
+            <?php } else { ?>
+            <caption><?php echo $label; ?></caption>
+            <tbody>
+                <?php foreach ((array) $value as $key => $val) { ?>
+                <tr>
+                    <td><?php echo htmlentities($key); ?></td>
+                    <td><?php echo_value($val); ?></td>
+                </tr>
+                <?php } ?>
+            </tbody>
+            <?php } ?>
+        </table>
+        <?php } ?>
+    </div>
+    <?php } ?>
+
+    <?php if (!empty($tables)) { ?>
+    <div class="exception-var">
+        <h2>Environment Variables</h2>
+        <?php foreach ((array) $tables as $label => $value) { ?>
+        <table>
+            <?php if (empty($value)) { ?>
+            <caption><?php echo $label; ?><small>empty</small></caption>
+            <?php } else { ?>
+            <caption><?php echo $label; ?></caption>
+            <tbody>
+                <?php foreach ((array) $value as $key => $val) { ?>
+                <tr>
+                    <td><?php echo htmlentities($key); ?></td>
+                    <td><?php echo_value($val); ?></td>
+                </tr>
+                <?php } ?>
+            </tbody>
+            <?php } ?>
+        </table>
+        <?php } ?>
+    </div>
+    <?php } ?>
+
+    <div class="copyright">
+        <a title="勾股OA" href="http://www.gougucms.com">勾股OA</a>
+        <span>—— 信息化、数字化办公系统的优秀解决方案</span>
+    </div>
+    <?php if (\think\facade\App::isDebug()) { ?>
+    <script>
+        function $(selector, node){
+            var elements;
+
+            node = node || document;
+            if(document.querySelectorAll){
+                elements = node.querySelectorAll(selector);
+            } else {
+                switch(selector.substr(0, 1)){
+                    case '#':
+                        elements = [node.getElementById(selector.substr(1))];
+                        break;
+                    case '.':
+                        if(document.getElementsByClassName){
+                            elements = node.getElementsByClassName(selector.substr(1));
+                        } else {
+                            elements = get_elements_by_class(selector.substr(1), node);
+                        }
+                        break;
+                    default:
+                        elements = node.getElementsByTagName();
+                }
+            }
+            return elements;
+
+            function get_elements_by_class(search_class, node, tag) {
+                var elements = [], eles, 
+                    pattern  = new RegExp('(^|\\s)' + search_class + '(\\s|$)');
+
+                node = node || document;
+                tag  = tag  || '*';
+
+                eles = node.getElementsByTagName(tag);
+                for(var i = 0; i < eles.length; i++) {
+                    if(pattern.test(eles[i].className)) {
+                        elements.push(eles[i])
+                    }
+                }
+
+                return elements;
+            }
+        }
+
+        $.getScript = function(src, func){
+            var script = document.createElement('script');
+            
+            script.async  = 'async';
+            script.src    = src;
+            script.onload = func || function(){};
+            
+            $('head')[0].appendChild(script);
+        }
+
+        ;(function(){
+            var files = $('.toggle');
+            var ol    = $('ol', $('.prettyprint')[0]);
+            var li    = $('li', ol[0]);   
+
+            // 短路径和长路径变换
+            for(var i = 0; i < files.length; i++){
+                files[i].ondblclick = function(){
+                    var title = this.title;
+
+                    this.title = this.innerHTML;
+                    this.innerHTML = title;
+                }
+            }
+
+            (function () {
+                var expand = function (dom, expand) {
+                    var ol = $('ol', dom.parentNode)[0];
+                    expand = undefined === expand ? dom.attributes['data-expand'].value === '0' : undefined;
+                    if (expand) {
+                        dom.attributes['data-expand'].value = '1';
+                        ol.style.display = 'none';
+                        dom.innerText = 'Call Stack (展开)';
+                    } else {
+                        dom.attributes['data-expand'].value = '0';
+                        ol.style.display = 'block';
+                        dom.innerText = 'Call Stack (折叠)';
+                    }
+                };
+                var traces = $('.trace');
+                for (var i = 0; i < traces.length; i ++) {
+                    var h2 = $('h2', traces[i])[0];
+                    expand(h2);
+                    h2.onclick = function () {
+                        expand(this);
+                    };
+                }
+            })();
+
+            $.getScript('//cdn.bootcss.com/prettify/r298/prettify.min.js', function(){
+                prettyPrint();
+            });
+        })();
+    </script>
+    <?php } ?>
+</body>
+</html>
diff --git a/route/app.php b/route/app.php
new file mode 100644
index 0000000000000000000000000000000000000000..d8e09e382ddf3b67e3193d5ac5cc6b9226959a68
--- /dev/null
+++ b/route/app.php
@@ -0,0 +1,17 @@
+<?php
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st <liu21st@gmail.com>
+// +----------------------------------------------------------------------
+use think\facade\Route;
+
+Route::get('think', function () {
+    return 'hello,ThinkPHP6!';
+});
+
+Route::get('hello/:name', 'index/hello');
diff --git a/runtime/.gitignore b/runtime/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..c96a04f008ee21e260b28f7701595ed59e2839e3
--- /dev/null
+++ b/runtime/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
\ No newline at end of file
diff --git a/think b/think
new file mode 100644
index 0000000000000000000000000000000000000000..2429d223a2e44b29a52a721ae88d4085c0d274f3
--- /dev/null
+++ b/think
@@ -0,0 +1,10 @@
+#!/usr/bin/env php
+<?php
+namespace think;
+
+// 命令行入口文件
+// 加载基础文件
+require __DIR__ . '/vendor/autoload.php';
+
+// 应用初始化
+(new App())->console->run();
\ No newline at end of file
diff --git "a/update_sql/v5.0\345\215\207\347\272\247\345\210\260v5.5.sql" "b/update_sql/v5.0\345\215\207\347\272\247\345\210\260v5.5.sql"
new file mode 100644
index 0000000000000000000000000000000000000000..e562a3d3a0774a2838877de063389b018a16ceb5
--- /dev/null
+++ "b/update_sql/v5.0\345\215\207\347\272\247\345\210\260v5.5.sql"
@@ -0,0 +1,833 @@
+ALTER TABLE `oa_admin` 
+ADD COLUMN `auth_dids` varchar(500) NOT NULL DEFAULT '' COMMENT '可见部门数据' AFTER `auth_did`;
+
+ALTER TABLE `oa_admin` 
+ADD COLUMN `son_dids` varchar(500) NOT NULL DEFAULT '' COMMENT '可见子部门数据' AFTER `auth_dids`;
+
+ALTER TABLE `oa_admin_group` 
+ADD COLUMN `mobile_bar` mediumtext  NULL COMMENT '手机端Bar' AFTER `layouts`;
+
+ALTER TABLE `oa_admin_group` 
+ADD COLUMN `mobile_menu` mediumtext  NULL COMMENT '手机端工作台' AFTER `mobile_bar`;
+
+ALTER TABLE `oa_project` 
+ADD COLUMN `code` varchar(255) NOT NULL DEFAULT '' COMMENT '项目编号' AFTER `name`;
+
+ALTER TABLE `oa_project` 
+ADD COLUMN `amount` decimal(15, 2) NULL DEFAULT 0.00 COMMENT '项目金额' AFTER `code`;
+
+ALTER TABLE `oa_project_task` 
+ADD COLUMN `did` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '所属部门' AFTER `director_uid`;
+
+ALTER TABLE `oa_project_document` 
+ADD COLUMN `did` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '所属部门' AFTER `title`;
+
+-- ----------------------------
+-- Table structure for oa_comment
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_comment`;
+CREATE TABLE `oa_comment`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `module` varchar(100) NOT NULL DEFAULT '' COMMENT '模块',
+  `topic_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联主题id',
+  `pid` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '回复内容id',
+  `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人',
+  `to_uids` varchar(100) NOT NULL DEFAULT '' COMMENT '@用户id',
+  `content` mediumtext  NULL COMMENT '评论内容',
+  `md_content` mediumtext  NULL COMMENT 'markdown评论内容',
+  `create_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '添加时间',
+  `update_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '修改时间',
+  `delete_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '评论表';
+
+-- ----------------------------
+-- Table structure for oa_comment_read
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_comment_read`;
+CREATE TABLE `oa_comment_read`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `comment_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联评论id',
+  `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '已读人',
+  `create_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '添加时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '评论已读回执表';
+
+-- ----------------------------
+-- Table structure for oa_edit_log
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_edit_log`;
+CREATE TABLE `oa_edit_log`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `name` varchar(100) NOT NULL DEFAULT '' COMMENT '标识',
+  `field` varchar(100) NOT NULL DEFAULT '' COMMENT '字段',
+  `action_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联id',
+  `second_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '第二关联id',
+  `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '操作人',
+  `old_content` mediumtext  NULL COMMENT '修改前的内容',
+  `new_content` mediumtext  NULL COMMENT '修改后的内容',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '编辑数据记录表';
+
+-- ----------------------------
+-- Table structure for oa_mobile_bar
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_mobile_bar`;
+CREATE TABLE `oa_mobile_bar`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '名称',
+  `icon` varchar(255) NOT NULL DEFAULT '' COMMENT '图标',
+  `url` varchar(255) NOT NULL DEFAULT '' COMMENT '链接',
+  `sort` int(11) NOT NULL DEFAULT 0 COMMENT '排序：越大越靠前',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `create_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '手机端Bar表';
+
+-- ----------------------------
+-- Records of oa_mobile_bar
+-- ----------------------------
+INSERT INTO `oa_mobile_bar` VALUES (1, '工作台', 'icon-gongzuotai1', '/qiye/index/index', 0, 1, 1723277311, 1733147213);
+INSERT INTO `oa_mobile_bar` VALUES (2, '客户', 'icon-kehu', '/qiye/customer/index', 0, 1, 1723277311, 1733147238);
+INSERT INTO `oa_mobile_bar` VALUES (3, '合同', 'icon-hetong2', '/qiye/contract/index', 0, 1, 1723277351, 1733147266);
+INSERT INTO `oa_mobile_bar` VALUES (4, '项目', 'icon-xiangmu1', '/qiye/project/index', 0, 1, 1723277356, 1733147298);
+INSERT INTO `oa_mobile_bar` VALUES (5, '消息', 'icon-xiaoxi1', '/qiye/msg/index', 0, 1, 1723277368, 1733147331);
+
+-- ----------------------------
+-- Table structure for oa_mobile_types
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_mobile_types`;
+CREATE TABLE `oa_mobile_types`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '名称',
+  `icon` varchar(255) NOT NULL DEFAULT '' COMMENT '图标',
+  `bgcolor` varchar(255) NOT NULL DEFAULT '' COMMENT '背景颜色',
+  `sort` int(11) NOT NULL DEFAULT 0 COMMENT '排序：越大越靠前',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `create_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '手机端工作台菜单类型表';
+
+-- ----------------------------
+-- Records of oa_mobile_types
+-- ----------------------------
+INSERT INTO `oa_mobile_types` VALUES (1, '办公审批', '', 'blue', 0, 1, 1723277311, 0);
+INSERT INTO `oa_mobile_types` VALUES (2, '效率工具', '', 'green', 0, 1, 1723277311, 0);
+INSERT INTO `oa_mobile_types` VALUES (3, '内部管理', '', 'yellow', 0, 1, 1723277351, 0);
+INSERT INTO `oa_mobile_types` VALUES (4, '财务管理', '', 'purple', 0, 1, 1723277356, 0);
+
+-- ----------------------------
+-- Table structure for oa_mobile_menu
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_mobile_menu`;
+CREATE TABLE `oa_mobile_menu`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '名称',
+  `icon` varchar(255) NOT NULL DEFAULT '' COMMENT '图标',
+  `bgcolor` varchar(255) NOT NULL DEFAULT '' COMMENT '背景颜色',
+  `url` varchar(255) NOT NULL DEFAULT '' COMMENT '链接',
+  `types` int(11) NOT NULL DEFAULT 0 COMMENT '关联菜单类型',
+  `sort` int(11) NOT NULL DEFAULT 0 COMMENT '排序：越大越靠前',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `create_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '手机端菜单表';
+
+-- ----------------------------
+-- Records of oa_mobile_menu
+-- ----------------------------
+INSERT INTO `oa_mobile_menu` VALUES (1, '审批申请', 'icon-shenpi','blue', '/qiye/approve/apply', 1, 0, 1, 1733146294, 1733152760, 0);
+INSERT INTO `oa_mobile_menu` VALUES (2, '我申请的', 'icon-wodeshenpi1','blue', '/qiye/approve/mylist', 1, 0, 1, 1733152749, 0, 0);
+INSERT INTO `oa_mobile_menu` VALUES (3, '我处理的', 'icon-chulishenpi','blue', '/qiye/approve/checklist', 1, 0, 1, 1733152798, 0, 0);
+INSERT INTO `oa_mobile_menu` VALUES (4, '抄送给我', 'icon-chaosong','blue', '/qiye/approve/copylist', 1, 0, 1, 1733152823, 0, 0);
+INSERT INTO `oa_mobile_menu` VALUES (5, '日程安排', 'icon-richeng','green', '/qiye/index/calendar', 2, 0, 1, 1733152855, 0, 0);
+INSERT INTO `oa_mobile_menu` VALUES (6, '工作记录', 'icon-jilu','green', '/qiye/index/schedule', 2, 0, 1, 1733152878, 0, 0);
+INSERT INTO `oa_mobile_menu` VALUES (7, '工作汇报', 'icon-huibao','green', '/qiye/index/work', 2, 0, 1, 1733152906, 0, 0);
+INSERT INTO `oa_mobile_menu` VALUES (8, '公告通知', 'icon-gonggaotongzhi','yellow', '/qiye/index/note', 3, 0, 1, 1733152965, 0, 0);
+INSERT INTO `oa_mobile_menu` VALUES (9, '公司新闻', 'icon-gongsixinwen','yellow', '/qiye/index/news', 3, 0, 1, 1733152993, 0, 0);
+INSERT INTO `oa_mobile_menu` VALUES (10, '会议纪要', 'icon-huiyijiyao','yellow', '/qiye/index/meeting', 3, 0, 1, 1733152993, 0, 0);
+INSERT INTO `oa_mobile_menu` VALUES (11, '报销管理', 'icon-a-baoxiao3','purple', '/qiye/finance/expense', 4, 0, 1, 1733153019, 0, 0);
+INSERT INTO `oa_mobile_menu` VALUES (12, '开票管理', 'icon-kaipiao','purple', '/qiye/finance/invoice', 4, 0, 1, 1733153047, 0, 0);
+INSERT INTO `oa_mobile_menu` VALUES (13, '收票管理', 'icon-shoupiao','purple', '/qiye/finance/ticket', 4, 0, 1, 1733153077, 0, 0);
+INSERT INTO `oa_mobile_menu` VALUES (14, '回款管理', 'icon-huikuan','purple', '/qiye/finance/income', 4, 0, 1, 1733153106, 0, 0);
+INSERT INTO `oa_mobile_menu` VALUES (15, '付款管理', 'icon-fukuan','purple', '/qiye/finance/payment', 4, 0, 1, 1733153131, 0, 0);
+
+
+-- ----------------------------
+-- Table structure for oa_admin_rule
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_admin_rule`;
+CREATE TABLE `oa_admin_rule`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `pid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '父id',
+  `src` varchar(255) NOT NULL DEFAULT '' COMMENT 'url链接',
+  `title` varchar(255) NOT NULL DEFAULT '' COMMENT '名称',
+  `name` varchar(255) NOT NULL DEFAULT '' COMMENT '日志操作名称',
+  `module` varchar(255) NOT NULL DEFAULT '' COMMENT '所属模块',
+  `icon` varchar(255) NOT NULL DEFAULT '' COMMENT '图标',
+  `menu` int(1) NOT NULL DEFAULT 0 COMMENT '是否是菜单,1是,2不是',
+  `sort` int(11) NOT NULL DEFAULT 1 COMMENT '越小越靠前',
+  `status` int(1) NOT NULL DEFAULT 1 COMMENT '状态,0禁用,1正常',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '菜单及权限表';
+
+-- ----------------------------
+-- Records of oa_admin_rule
+-- ----------------------------
+INSERT INTO `oa_admin_rule` VALUES (1, 0, '', '系统管理', '系统管理', 'home', 'icon-jichupeizhi', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (2, 0, '', '基础数据', '基础数据', 'base', 'icon-hetongshezhi', 1, 2, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (3, 0, '', '人事管理', '人事管理', 'user', 'icon-renshishezhi', 1, 3, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (4, 0, '', '行政办公', '行政办公', 'adm', 'icon-banjiguanli', 1, 4, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (5, 0, '', '个人办公', '个人办公', 'office', 'icon-kaoshijihua', 1, 5, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (6, 0, '', '财务管理', '财务管理', 'finance', 'icon-yuangongtidian', 1, 6, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (7, 0, '', '客户管理', '客户管理', 'customer', 'icon-kehuguanli', 1, 7, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (8, 0, '', '合同管理', '合同管理', 'contract', 'icon-hetongyidong', 1, 8, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (9, 0, '', '项目管理', '项目管理', 'project', 'icon-xiangmuguanli', 1, 9, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (10, 0, '', '知识网盘', '知识网盘', 'disk', 'icon-tikuguanli', 1, 10, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (11, 1, 'home/conf/index', '系统配置', '系统配置', 'home', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (12, 11, 'home/conf/add', '新建/编辑', '配置项', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (13, 11, 'home/conf/delete', '删除', '配置项', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (14, 11, 'home/conf/edit', '编辑', '配置详情', 'home', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (15, 1, 'home/module/index', '功能模块', '功能模块', 'home', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (16, 15, 'home/module/add', '新建/编辑', '功能模块', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (17, 15, 'home/module/del', '删除', '功能模块', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (18, 15, 'home/module/recovery', '恢复', '功能模块', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (19, 15, 'home/module/install', '安装', '功能模块', 'home', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (20, 1, 'home/dataauth/index', '模块配置', '模块配置', 'home', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (21, 20, 'home/dataauth/edit', '编辑', '模块配置', 'home', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (22, 1, 'home/rule/index', '功能节点', '功能节点', 'home', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (23, 22, 'home/rule/add', '新建/编辑', '功能节点', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (24, 22, 'home/rule/delete', '删除', '功能节点', 'home', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (25, 1, 'mobile/bar/datalist', '移动端配置', '移动端配置', 'home', '', 1, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (26, 25, 'mobile/bar/datalist', 'BAR菜单', 'BAR菜单', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (27, 26, 'mobile/bar/add', '新建/编辑', 'BAR菜单', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (28, 26, 'mobile/bar/set', '设置', 'BAR菜单', 'home', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (29, 25, 'mobile/types/datalist', '工作台菜单类型', '工作台菜单类型', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (30, 29, 'mobile/types/add', '新建/编辑', '工作台菜单类型', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (31, 29, 'mobile/types/del', '删除', '工作台菜单类型', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (32, 29, 'mobile/types/set', '设置', '工作台菜单类型', 'home', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (33, 25, 'mobile/menu/datalist', '工作台菜单', '工作台菜单', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (34, 33, 'mobile/menu/add', '新建/编辑', '工作台菜单', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (35, 33, 'mobile/menu/del', '删除', '工作台菜单', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (36, 33, 'mobile/menu/set', '设置', '工作台菜单', 'home', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (37, 1, 'home/role/index', '角色权限', '角色权限', 'home', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (38, 37, 'home/role/add', '新建/编辑', '角色权限', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (39, 37, 'home/role/delete', '删除', '角色权限', 'home', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (40, 1, 'home/log/index', '操作日志', '操作日志', 'home', '', 1, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (41, 1, 'home/files/index', '附件管理','附件管理', 'home', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (42, 41, 'home/files/edit', '编辑附件','附件', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (43, 41, 'home/files/move', '移动附件','附件', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (44, 41, 'home/files/delete', '删除附件','附件', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (45, 41, 'home/files/get_group', '附件分组','附件分组', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (46, 41, 'home/files/add_group', '新建/编辑','附件分组', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (47, 41, 'home/files/del_group', '删除附件分组','附件分组', 'home', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (48, 1, 'home/database/database', '备份数据', '数据备份', 'home', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (49, 48, 'home/database/backup', '备份数据表', '数据', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (50, 48, 'home/database/optimize', '优化数据表', '数据表', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (51, 48, 'home/database/repair', '修复数据表', '数据表', 'home', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (52, 1, 'home/database/backuplist', '还原数据', '数据还原', 'home', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (53, 52, 'home/database/import', '还原数据表', '数据', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (54, 52, 'home/database/downfile', '下载备份数据', '备份数据', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (55, 52, 'home/database/del', '删除备份数据', '备份数据', 'home', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (56, 1, 'home/task/index', '定时任务', '定时任务', 'home', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (57, 56, 'home/task/add', '新建/编辑', '定时任务', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (58, 56, 'home/task/delete', '删除', '定时任务', 'home', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (59, 2, '', '公共模块', '公共模块', 'home', '', 1, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (60, 59, 'home/template/datalist', '消息模板', '消息模板', 'home', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (61, 60, 'home/template/add', '新建/编辑', '消息模板', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (62, 60, 'home/template/set', '设置', '消息模板', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (63, 60, 'home/template/view', '查看', '消息模板', 'home', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (64, 59, 'adm/flow/modulelist', '审批模块', '审批模块', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (65, 64, 'adm/flow/module_add', '新建/编辑', '审批模块', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (66, 64, 'adm/flow/module_check', '设置', '审批模块', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (67, 59, 'adm/flow/catelist', '审批类型', '审批类型', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (68, 67, 'adm/flow/cate_add', '新建/编辑', '审批类型', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (69, 67, 'adm/flow/cate_check', '设置', '审批类型', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (70, 59, 'adm/flow/datalist', '审批流程', '审批流程', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (71, 70, 'adm/flow/add', '新建/编辑', '审批流程', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (72, 70, 'adm/flow/del', '删除', '审批流程', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (73, 70, 'adm/flow/check', '设置', '审批流程', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (74, 59, 'home/cate/enterprise', '企业主体', '企业主体', 'home', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (75, 74, 'home/cate/enterprise_add', '新建/编辑', '企业主体', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (76, 74, 'home/cate/enterprise_set', '设置', '企业主体', 'home', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (77, 59, 'home/area/datalist', '全国省市', '全国省市', 'home', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (78, 77, 'home/area/add', '新建/编辑', '全国省市', 'home', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (79, 77, 'home/area/set', '设置', '全国省市', 'home', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (80, 2, '', '人事模块', '人事模块', 'user', '', 1, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (81, 80, 'user/rewardscate/datalist', '奖罚项目', '奖罚项目', 'user', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (82, 81, 'user/rewardscate/add', '新建/编辑', '奖罚项目', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (83, 81, 'user/rewardscate/set', '设置', '奖罚项目', 'user', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (84, 80, 'user/carecate/datalist', '关怀项目', '关怀项目', 'user', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (85, 84, 'user/carecate/add', '新建/编辑', '关怀项目', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (86, 84, 'user/carecate/set', '设置', '关怀项目', 'user', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (87, 80, 'user/basic/datalist', '常规数据', '常规数据', 'user', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (88, 87, 'user/basic/add', '新建/编辑', '常规数据', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (89, 87, 'user/basic/set', '设置', '常规数据', 'user', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (90, 3, 'user/department/index', '部门架构', '部门', 'user', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (91, 90, 'user/department/add', '新建/编辑', '部门', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (92, 90, 'user/department/delete', '删除', '部门', 'user', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (93, 3, 'user/position/index', '岗位职称', '岗位职称', 'user', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (94, 93, 'user/position/add', '新建/编辑', '岗位职称', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (95, 93, 'user/position/delete', '删除', '岗位职称', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (96, 93, 'user/position/view', '查看', '岗位职称', 'user', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (97, 3, 'user/user/index', '企业员工', '员工', 'user', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (98, 97, 'user/user/add', '新建/编辑', '员工', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (99, 97, 'user/user/view', '查看', '员工信息', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (100, 97, 'user/user/set', '设置', '员工状态', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (101, 97, 'user/user/reset_psw', '重设密码', '员工密码', 'user', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (102, 3, 'user/files/datalist', '员工档案', '员工档案', 'user', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (103, 102, 'user/files/add', '编辑', '员工档案', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (104, 102, 'user/files/view', '查看', '员工档案', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (105, 102, 'user/files/set', '设置', '员工档案', 'user', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (106, 3, 'user/personal/change', '人事调动', '人事调动', 'user', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (107, 106, 'user/personal/change_add', '新建/编辑', '人事调动', 'user', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (108, 3, 'user/personal/leave', '离职档案', '离职档案', 'user', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (109, 108, 'user/personal/leave_add', '新建/编辑', '离职档案', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (110, 108, 'user/personal/leave_delete', '删除', '离职档案', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (111, 108, 'user/personal/leave_check', '资料交接', '离职资料', 'user', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (112, 3, 'user/rewards/datalist', '奖罚管理', '奖罚管理', 'user', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (113, 112, 'user/rewards/add', '新建/编辑', '奖罚管理', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (114, 112, 'user/rewards/view', '查看', '奖罚管理', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (115, 112, 'user/rewards/del', '删除', '奖罚管理', 'user', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (116, 3, 'user/care/datalist', '员工关怀', '员工关怀', 'user', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (117, 116, 'user/care/add', '新建/编辑', '员工关怀', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (118, 116, 'user/care/view', '查看', '员工关怀', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (119, 116, 'user/care/del', '删除', '员工关怀', 'user', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (120, 3, 'user/laborcontract/datalist', '员工合同', '员工合同', 'user', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (121, 120, 'user/laborcontract/add', '新建/编辑', '员工合同', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (122, 120, 'user/laborcontract/add_renewal', '续签', '员工合同', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (123, 120, 'user/laborcontract/add_change', '变更', '员工合同', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (124, 120, 'user/laborcontract/view', '查看', '员工合同', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (125, 120, 'user/laborcontract/del', '删除', '员工合同', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (126, 120, 'user/laborcontract/set', '设置', '员工合同', 'user', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (127, 2, '', '行政模块', '行政模块', 'adm', '', 1, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (128, 127, 'adm/propertycate/datalist', '资产分类', '资产分类', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (129, 128, 'adm/propertycate/add', '新建/编辑', '资产分类', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (130, 128, 'adm/propertycate/del', '删除', '资产分类', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (131, 127, 'adm/propertybrand/datalist', '资产品牌', '资产品牌', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (132, 131, 'adm/propertybrand/add', '新建/编辑', '资产品牌', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (133, 131, 'adm/propertybrand/check', '设置', '资产品牌', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (134, 127, 'adm/propertyunit/datalist', '资产单位', '资产单位', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (135, 134, 'adm/propertyunit/add', '新建/编辑', '资产单位', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (136, 134, 'adm/propertyunit/check', '设置', '资产单位', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (137, 127, 'adm/sealcate/datalist', '印章管理', '印章', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (138, 137, 'adm/sealcate/add', '新建/编辑', '印章', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (139, 137, 'adm/sealcate/check', '设置', '印章', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (140, 127, 'adm/basic/datalist', '常规数据', '常规数据', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (141, 140, 'adm/basic/add', '新建/编辑', '常规数据', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (142, 140, 'adm/basic/set', '设置', '常规数据', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (143, 4, '', '固定资产', '固定资产', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (144, 143, 'adm/property/datalist', '资产信息', '固定资产', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (145, 144, 'adm/property/add', '新建/编辑', '固定资产', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (146, 144, 'adm/property/check', '设置', '固定资产', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (147, 144, 'adm/property/view', '查看', '固定资产', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (148, 143, 'adm/property/repair_list', '报修记录', '资产报修记录', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (149, 148, 'adm/property/repair_add', '新建/编辑', '资产报修记录', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (150, 148, 'adm/property/repair_view', '查看', '资产报修记录', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (151, 148, 'adm/property/repair_del', '删除', '资产报修记录', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (152, 4, '', '车辆管理', '车辆', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (153, 152, 'adm/car/datalist', '车辆信息', '车辆', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (154, 153, 'adm/car/add', '新建/编辑', '车辆', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (155, 153, 'adm/car/check', '设置', '车辆', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (156, 153, 'adm/car/view', '查看', '车辆', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (157, 152, 'adm/car/repair_list', '车辆维修', '车辆维修记录', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (158, 157, 'adm/car/repair_add', '新建/编辑', '车辆维修记录', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (159, 157, 'adm/car/repair_view', '查看', '车辆维修记录', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (160, 157, 'adm/car/repair_del', '删除', '车辆维修记录', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (161, 152, 'adm/car/protect_list', '车辆保养', '车辆保养记录', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (162, 161, 'adm/car/protect_add', '新建/编辑', '车辆保养记录', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (163, 161, 'adm/car/protect_view', '查看', '车辆保养记录', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (164, 161, 'adm/car/protect_del', '删除', '车辆保养记录', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (165, 152, 'adm/car/mileage_list', '车辆里程', '车辆里程记录', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (166, 165, 'adm/car/mileage_add', '新建/编辑', '车辆里程记录', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (167, 165, 'adm/car/mileage_del', '删除', '车辆里程记录', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (168, 152, 'adm/car/fee_list', '车辆费用', '车辆费用记录', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (169, 168, 'adm/car/fee_add', '新建/编辑', '车辆费用记录', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (170, 168, 'adm/car/fee_view', '查看', '车辆费用记录', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (171, 168, 'adm/car/fee_del', '删除', '车辆费用记录', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (172, 4, '', '会议管理', '会议管理', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (173, 172, 'adm/meeting/room', '会议室管理', '会议室', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (174, 173, 'adm/meeting/room_add', '新建/编辑', '会议室', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (175, 173, 'adm/meeting/room_view', '查看', '会议纪要', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (176, 173, 'adm/meeting/room_check', '设置', '会议室', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (177, 172, 'adm/meeting/records', '会议记录', '会议记录', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (178, 177, 'adm/meeting/records_add', '新建/编辑', '会议记录', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (179, 177, 'adm/meeting/records_view', '查看', '会议纪要', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (180, 177, 'adm/meeting/records_del', '删除', '会议纪要', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (181, 4, '', '公文管理', '公文管理', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (182, 181, 'adm/official/datalist', '公文列表', '公文管理', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (183, 182, 'adm/official/add', '新建/编辑', '公文管理', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (184, 182, 'adm/official/view', '查看', '公文管理', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (185, 182, 'adm/official/del', '删除', '公文管理', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (186, 181, 'adm/official/pending', '待审公文', '公文管理', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (187, 181, 'adm/official/reviewed', '已审公文', '公文管理', 'adm', '', 1, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (188, 4, '', '用章管理', '用章管理', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (189, 188, 'adm/seal/datalist', '用章申请', '用章申请', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (190, 189, 'adm/seal/add', '新建/编辑', '用章申请', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (191, 189, 'adm/seal/view', '查看', '用章申请', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (192, 189, 'adm/seal/del', '删除', '用章申请', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (193, 188, 'adm/seal/record', '用章记录', '用章记录', 'adm', '', 1, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (194, 127, 'adm/notecate/datalist', '公告类型', '公告类型', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (195, 194, 'adm/notecate/add', '新建/编辑', '公告类型', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (196, 194, 'adm/notecate/set', '设置', '公告类型', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (197, 4, 'adm/note/datalist', '公告列表', '公告', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (198, 197, 'adm/note/add', '新建/编辑', '公告', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (199, 197, 'adm/note/del', '删除', '公告', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (200, 197, 'adm/note/view', '查看', '公告', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (201, 4, 'adm/news/datalist', '公司新闻', '公司新闻', 'adm', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (202, 201, 'adm/news/add', '新建/编辑', '公司新闻', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (203, 201, 'adm/news/del', '删除', '公司新闻', 'adm', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (204, 201, 'adm/news/view', '查看', '公司新闻', 'adm', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (205, 5, 'oa/plan/datalist', '日程安排', '日程安排', 'oa', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (206, 205, 'oa/plan/add', '新建/编辑', '日程安排', 'oa', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (207, 205, 'oa/plan/view', '查看', '日程安排', 'oa', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (208, 205, 'oa/plan/del', '删除', '日程安排', 'oa', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (209, 5, 'oa/plan/calendar', '日程日历', '日程安排', 'oa', '', 1, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (210, 5, 'oa/schedule/datalist', '工作记录', '工作记录', 'oa', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (211, 210, 'oa/schedule/add', '新建/编辑', '工作记录', 'oa', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (212, 210, 'oa/schedule/view', '查看', '工作记录', 'oa', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (213, 210, 'oa/schedule/del', '删除', '工作记录', 'oa', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (214, 5, 'oa/schedule/calendar', '工作日历', '工作日历', 'oa', '', 1, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (215, 5, 'oa/work/datalist', '工作汇报', '工作汇报', 'oa', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (216, 215, 'oa/work/add', '新建/编辑', '工作汇报', 'oa', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (217, 215, 'oa/work/send', '发送', '工作汇报', 'oa', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (218, 215, 'oa/work/view', '查看', '工作汇报', 'oa', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (219, 215, 'oa/work/del', '删除', '工作汇报', 'oa', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (220, 5, 'oa/note/datalist', '公告通知', '公告通知', 'oa', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (221, 220, 'oa/note/view', '查看', '公告通知', 'oa', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (222, 5, 'oa/news/datalist', '公司新闻', '公司新闻', 'oa', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (223, 222, 'oa/news/view', '查看', '公司新闻', 'oa', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (224, 5, 'oa/meeting/datalist', '会议纪要', '会议纪要', 'oa', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (225, 224, 'oa/meeting/view', '查看', '会议纪要', 'oa', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (226, 2, '', '财务模块', '财务模块', 'finance', '', 1, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (227, 226, 'finance/expensecate/datalist', '报销类型', '报销类型', 'finance', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (228, 227, 'finance/expensecate/add', '新建/编辑', '报销类型', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (229, 227, 'finance/expensecate/set', '设置', '报销类型', 'finance', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (230, 226, 'finance/costcate/datalist', '费用类型', '费用类型', 'finance', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (231, 230, 'finance/costcate/add', '新建/编辑', '费用类型', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (233, 230, 'finance/costcate/set', '设置', '费用类型', 'finance', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (234, 6, 'finance/expense/datalist', '报销管理', '报销', 'finance', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (235, 234, 'finance/expense/add', '新建/编辑', '报销', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (236, 234, 'finance/expense/del', '删除', '报销', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (237, 234, 'finance/expense/view', '查看', '报销', 'finance', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (238, 6, 'finance/invoice/datalist', '开票管理', '发票', 'finance', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (239, 238, 'finance/invoice/add', '新建/编辑', '发票', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (240, 238, 'finance/invoice/del', '删除', '发票', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (241, 238, 'finance/invoice/view', '查看', '发票', 'finance', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (242, 6, 'finance/ticket/datalist', '收票管理', '发票', 'finance', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (243, 242, 'finance/ticket/add', '新建/编辑', '发票', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (244, 242, 'finance/ticket/delete', '删除', '发票', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (245, 242, 'finance/ticket/view', '查看', '发票', 'finance', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (246, 6, 'finance/income/datalist', '回款管理', '回款记录', 'finance', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (247, 246, 'finance/income/add', '新建/编辑', '回款记录', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (248, 246, 'finance/income/view', '查看', '回款记录', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (249, 246, 'finance/income/del', '删除', '回款记录', 'finance', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (250, 6, 'finance/invoice/datalist_a', '无发票回款', '无发票回款', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (251, 250, 'finance/invoice/add_a', '新建/编辑', '无发票回款', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (252, 250, 'finance/invoice/del_a', '删除', '无发票回款', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (253, 250, 'finance/invoice/view_a', '查看', '无发票回款', 'finance', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (254, 6, 'finance/payment/datalist', '付款管理', '付款记录', 'finance', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (255, 254, 'finance/payment/add', '新建/编辑', '付款记录', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (256, 254, 'finance/payment/view', '查看', '付款记录', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (257, 254, 'finance/payment/del', '删除', '付款记录', 'finance', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (258, 6, 'finance/ticket/datalist_a', '无发票付款', '无发票付款', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (259, 258, 'finance/ticket/add_a', '新建/编辑', '无发票付款', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (260, 258, 'finance/ticket/del_a', '删除', '无发票付款', 'finance', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (261, 258, 'finance/ticket/view_a', '查看', '无发票付款', 'finance', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (262, 6, '', '财务统计', '财务统计', 'finance', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (263, 262, 'finance/expense/record', '报销记录', '报销记录', 'finance', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (264, 262, 'finance/invoice/record', '开票记录', '开票记录', 'finance', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (265, 262, 'finance/ticket/record', '收票记录', '收票记录', 'finance', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (266, 262, 'finance/income/record', '回款记录', '回款记录', 'finance', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (267, 262, 'finance/payment/record', '付款记录', '付款记录', 'finance', '', 1, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (268, 2, '', '客户模块', '客户模块', 'customer', '', 1, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (269, 268, 'customer/industry/datalist', '行业类型', '行业类型', 'home', '', 1, 0, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (270, 269, 'customer/industry/add', '新建/编辑', '行业类型', 'home', '', 2, 0, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (271, 269, 'customer/industry/set', '设置', '行业类型', 'home', '', 2, 0, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (272, 268, 'customer/grade/datalist', '客户等级', '客户等级', 'customer', '', 1, 0, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (273, 272, 'customer/grade/add', '新建/编辑', '客户等级', 'customer', '', 2, 0, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (274, 272, 'customer/grade/set', '设置', '客户等级', 'customer', '', 2,0, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (275, 268, 'customer/source/datalist', '客户渠道', '客户渠道', 'customer', '', 1, 0, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (276, 275, 'customer/source/add', '新建/编辑', '客户渠道', 'customer', '', 2, 0, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (277, 275, 'customer/source/set', '设置', '客户渠道', 'customer', '', 2,0, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (278, 268, 'customer/basic/datalist', '常规数据', '常规数据', 'user', '', 1, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (279, 278, 'customer/basic/add', '新建/编辑', '常规数据', 'user', '', 2, 1, 1, 0, 0);
+INSERT INTO `oa_admin_rule` VALUES (280, 278, 'customer/basic/set', '设置', '常规数据', 'user', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (281, 7, 'customer/customer/datalist', '客户列表', '客户列表', 'customer', '', 1, 0, 1, 1556143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (282, 281, 'customer/customer/add', '新建/编辑', '客户', 'customer', '', 2, 0, 1, 1556143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (283, 281, 'customer/customer/view', '查看', '客户', 'customer', '', 2, 0, 1, 1556143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (284, 281, 'customer/customer/del', '删除', '客户', 'customer', '', 2, 0, 1, 1556143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (285, 7, 'customer/index/rush', '抢 客 宝', '抢客宝', 'customer', '', 1, 0, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (286, 7, 'customer/index/sea', '公海客户', '客户', 'customer', '', 1, 0, 1, 1556143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (287, 286, 'customer/index/to_get', '获取', '客户', 'customer', '', 2, 0, 1, 1556143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (288, 286, 'customer/index/to_divide', '分配客户', '客户', 'customer', '', 2, 0, 1, 1556143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (289, 286, 'customer/index/to_sea', '转入公海', '客户', 'customer', '', 2, 0, 1, 1556143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (290, 286, 'customer/index/to_trash', '转入废弃池', '客户', 'customer', '', 2, 0, 1, 1556143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (291, 286, 'customer/index/to_revert', '恢复客户', '客户', 'customer', '', 2, 0, 1, 1556143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (292, 7, 'customer/index/trash', '废弃客户', '客户', 'customer', '', 1, 0, 1, 1556143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (293, 7, 'customer/contact/datalist', '客户联系人', '联系人', 'customer', '', 1, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (294, 286, 'customer/contact/add', '新建/编辑', '联系人', 'customer', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (295, 286, 'customer/contact/del', '删除', '联系人', 'customer', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (296, 286, 'customer/contact/view', '查看', '客户联系人', 'customer', '', 2, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (297, 7, 'customer/chance/datalist', '机会线索', '机会线索', 'customer', '', 1, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (298, 297, 'customer/chance/add', '新建/编辑', '机会线索', 'customer', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (299, 297, 'customer/chance/view', '查看', '机会线索', 'customer', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (300, 297, 'customer/chance/del', '删除', '机会线索', 'customer', '', 2, 0, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (301, 7, 'customer/trace/datalist', '跟进记录', '跟进记录', 'customer', '', 1, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (302, 301, 'customer/trace/add', '新建/编辑', '跟进记录', 'customer', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (303, 301, 'customer/trace/view', '查看', '跟进记录', 'customer', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (304, 301, 'customer/trace/del', '删除', '跟进记录', 'customer', '', 2, 0, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (305, 2, '', '合同模块', '合同模块', 'contract', '', 1, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (306, 305, 'contract/cate/datalist', '合同分类', '合同分类', 'contract', '', 1, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (307, 306, 'contract/cate/add', '新建/编辑', '合同分类', 'contract', '', 2, 1, 1, 0, 1656143065);
+INSERT INTO `oa_admin_rule` VALUES (308, 306, 'contract/cate/set', '设置', '合同分类', 'contract', '', 2, 1, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (309, 305, 'contract/productcate/datalist', '产品分类', '产品分类', 'contract', '', 1, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (310, 309, 'contract/productcate/add', '新建/编辑', '产品分类', 'contract', '', 2, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (311, 309, 'contract/productcate/del', '删除', '产品分类', 'contract', '', 2, 1, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (312, 305, 'contract/product/datalist', '产品列表', '产品', 'contract', '', 1, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (313, 312, 'contract/product/add', '新建/编辑', '产品', 'contract', '', 2, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (314, 312, 'contract/product/view', '查看', '产品', 'contract', '', 2, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (315, 312, 'contract/product/del', '删除', '产品', 'contract', '', 2, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (316, 312, 'contract/product/set', '设置', '产品', 'contract', '', 2, 1, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (317, 305, 'contract/services/datalist', '服务内容', '服务内容', 'contract', '', 1, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (318, 317, 'contract/services/add', '新建/编辑', '服务内容', 'contract', '', 2, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (319, 317, 'contract/services/set', '设置', '服务内容', 'contract', '', 2, 1, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (320, 305, 'contract/supplier/datalist', '供应商列表', '供应商', 'contract', '', 1, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (321, 320, 'contract/supplier/add', '新建/编辑', '供应商', 'contract', '', 2, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (322, 320, 'contract/supplier/set', '设置', '供应商', 'contract', '', 2, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (323, 320, 'contract/supplier/view', '查看', '供应商', 'contract', '', 2, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (324, 320, 'contract/supplier/del', '删除', '供应商', 'contract', '', 2, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (325, 320, 'contract/supplier/contact_add', '新建/编辑', '供应商联系人', 'contract', '', 2, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (326, 320, 'contract/supplier/contact_del', '删除', '供应商联系人', 'contract', '', 2, 1, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (327, 305, 'contract/purchasedcate/datalist', '采购品分类', '采购品分类', 'contract', '', 1, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (328, 327, 'contract/purchasedcate/add', '新建/编辑', '采购品分类', 'contract', '', 2, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (329, 327, 'contract/purchasedcate/del', '删除', '采购品分类', 'contract', '', 2, 1, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (330, 305, 'contract/purchased/datalist', '采购品列表', '采购品', 'contract', '', 1, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (331, 330, 'contract/purchased/add', '新建/编辑', '采购品', 'contract', '', 2, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (332, 330, 'contract/purchased/view', '查看', '采购品', 'contract', '', 2, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (333, 330, 'contract/purchased/del', '删除', '采购品', 'contract', '', 2, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (334, 330, 'contract/purchased/set', '设置', '采购品', 'contract', '', 2, 1, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (335, 8, 'contract/contract/datalist', '销售合同', '销售合同', 'contract', '', 1, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (336, 335, 'contract/contract/add', '新建/编辑', '合同', 'contract', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (337, 335, 'contract/contract/view', '查看', '合同', 'contract', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (338, 335, 'contract/contract/del', '删除', '合同', 'contract', '', 2, 0, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (339, 8, 'contract/purchase/datalist', '采购合同', '采购合同', 'contract', '', 1, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (340, 339, 'contract/purchase/add', '新建/编辑', '合同', 'contract', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (341, 339, 'contract/purchase/view', '查看', '合同', 'contract', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (342, 339, 'contract/purchase/del', '删除', '合同', 'contract', '', 2, 0, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (343, 8, 'contract/contract/archivelist', '合同归档', '合同归档', 'contract', '', 1, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (344, 343, 'contract/purchase/archivelist', '采购合同归档', '采购合同归档', 'contract', '', 2, 0, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (345, 8, 'contract/contract/stoplist', '中止合同', '中止合同', 'contract', '', 1, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (346, 345, 'contract/purchase/stoplist', '中止采购合同', '中止采购合同', 'contract', '', 2, 0, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (347, 8, 'contract/contract/voidlist', '作废合同', '作废合同', 'contract', '', 1, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (348, 347, 'contract/purchase/voidlist', '作废合同归档', '作废采购合同', 'contract', '', 2, 0, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (349, 2, '', '项目模块', '项目模块', 'project', '', 1, 1, 1, 0, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (350, 349, 'project/step/datalist', '项目阶段', '项目阶段', 'project', '', 1, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (351, 350, 'project/step/add', '新建/编辑', '项目阶段', 'project', '', 2, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (352, 350, 'project/step/set', '设置', '项目阶段', 'project', '', 2, 1, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (353, 349, 'project/cate/datalist', '项目分类', '项目分类', 'project', '', 1, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (354, 353, 'project/cate/add', '新建/编辑', '项目分类', 'project', '', 2, 1, 1, 0, 1656143065);
+INSERT INTO `oa_admin_rule` VALUES (355, 353, 'project/cate/set', '设置', '项目分类', 'project', '', 2, 1, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (356, 349, 'project/work/datalist', '工作类别', '工作类别', 'project', '', 1, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (357, 356, 'project/work/add', '新建/编辑', '工作类别', 'project', '', 2, 1, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (358, 356, 'project/work/set', '设置', '工作类别', 'project', '', 2, 1, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (359, 9, 'project/index/datalist', '项目列表', '项目', 'project', '', 1, 0, 1, 1656142368, 0);
+INSERT INTO `oa_admin_rule` VALUES (360, 359, 'project/index/add', '新建', '项目', 'project', '', 2, 0, 1, 1656142368, 0);
+INSERT INTO `oa_admin_rule` VALUES (361, 359, 'project/index/edit', '编辑', '项目', 'project', '', 2, 0, 1, 1656142368, 0);
+INSERT INTO `oa_admin_rule` VALUES (362, 359, 'project/index/view', '查看', '项目', 'project', '', 2, 0, 1, 1656142368, 0);
+INSERT INTO `oa_admin_rule` VALUES (363, 359, 'project/index/del', '删除', '项目', 'project', '', 2, 0, 1, 1656142368, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (364, 9, 'project/task/datalist', '任务列表', '任务', 'project', '', 1, 0, 1, 1656142368, 0);
+INSERT INTO `oa_admin_rule` VALUES (365, 364, 'project/task/add', '新建', '任务', 'project', '', 2, 0, 1, 1656142368, 0);
+INSERT INTO `oa_admin_rule` VALUES (366, 364, 'project/task/edit', '编辑', '任务', 'project', '', 2, 0, 1, 1656142368, 0);
+INSERT INTO `oa_admin_rule` VALUES (367, 364, 'project/task/view', '查看', '任务', 'project', '', 2, 0, 1, 1656142368, 0);
+INSERT INTO `oa_admin_rule` VALUES (368, 364, 'project/task/del', '删除', '任务', 'project', '', 2, 0, 1, 1656142368, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (369, 9, 'project/task/hour', '任务工时', '工时', 'project', '', 1, 0, 1, 1656142368, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (370, 9, 'project/document/datalist', '文档列表', '文档', 'project', '', 1, 0, 1, 1656142368, 0);
+INSERT INTO `oa_admin_rule` VALUES (371, 370, 'project/document/add', '新建/编辑', '文档', 'project', '', 2, 0, 1, 1656142368, 0);
+INSERT INTO `oa_admin_rule` VALUES (372, 370, 'project/document/view', '查看', '文档', 'project', '', 2, 0, 1, 1656142368, 0);
+INSERT INTO `oa_admin_rule` VALUES (373, 370, 'project/document/delete', '删除', '文档', 'project', '', 2, 0, 1, 1656142368, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (374, 10, 'disk/index/datalist', '个人文件', '个人文件', 'disk', '', 1, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (375, 374, 'disk/index/add_upload', '新增', '文件', 'disk', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (376, 374, 'disk/index/add_folder', '新增', '文件夹', 'disk', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (377, 374, 'disk/index/add_article', '新增/编辑', '在线文档', 'disk', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (378, 374, 'disk/index/view_article', '查看', '在线文档', 'disk', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (379, 374, 'disk/index/del', '删除', '文件/文件夹/在线文档', 'disk', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (380, 374, 'disk/index/rename', '重命名', '文件', 'disk', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (381, 374, 'disk/index/move', '移动', '文件', 'disk', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (382, 374, 'disk/index/share', '分享', '文件', 'disk', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (383, 374, 'disk/index/unshare', '取消分享', '文件', 'disk', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (384, 374, 'disk/index/star', '标星', '文件', 'disk', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (385, 374, 'disk/index/unstar', '取消标星', '文件', 'disk', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (386, 374, 'disk/index/back', '还原', '文件', 'disk', '', 2, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (387, 374, 'disk/index/clear', '清除', '文件', 'disk', '', 2, 0, 1, 1656143065, 0);
+
+INSERT INTO `oa_admin_rule` VALUES (388, 10, 'disk/index/sharelist', '共享文件', '共享文件', 'disk', '', 1, 0, 1, 1656143065, 0);
+INSERT INTO `oa_admin_rule` VALUES (389, 10, 'disk/index/clearlist', '回 收 站', '回收站文件', 'disk', '', 1, 0, 1, 1656143065, 0);
+
+
+-- ----------------------------
+-- Table structure for oa_admin_group
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_admin_group`;
+CREATE TABLE `oa_admin_group`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(255) NOT NULL DEFAULT '',
+  `status` int(1) NOT NULL DEFAULT 1,
+  `rules` mediumtext  NULL COMMENT '用户组拥有的规则id',
+  `layouts` mediumtext  NULL COMMENT '首页展示模块',
+  `mobile_bar` mediumtext  NULL COMMENT '手机端Bar',
+  `mobile_menu` mediumtext  NULL COMMENT '手机端工作台',
+  `desc` mediumtext  NULL COMMENT '备注',
+  `create_time` bigint(11) NOT NULL DEFAULT 0,
+  `update_time` bigint(11) NOT NULL DEFAULT 0,
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `id`(`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '员工权限分组表';
+
+-- ----------------------------
+-- Records of oa_admin_group
+-- ----------------------------
+INSERT INTO `oa_admin_group` VALUES (1, '超级权限角色', 1, '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389', '1,2,3,4,5,6,7,8,9,10,11,12','1,2,3,4,5','1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16','超级权限角色，拥有系统的最高权限，主要用于系统初始化数据而设，不可修改，不可删除。', 0, 0);
+INSERT INTO `oa_admin_group` VALUES (2, '管理岗角色', 1, '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389','1,2,3,4,5,6,7,8,9,10,11,12','1,2,3,4,5','1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16', '管理岗角色权限，可根据公司的具体需求调整。', 0, 0);
+INSERT INTO `oa_admin_group` VALUES (3, '业务岗角色', 1, '4,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,197,198,199,200,201,202,203,204,5,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,6,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,7,281,282,283,284,285,286,287,288,289,290,291,294,295,296,292,293,297,298,299,300,301,302,303,304,8,335,336,337,338,339,340,341,342,343,344,345,346,347,348,9,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,10,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389','1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16','1,2,3,4,5','1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16', '业务岗角色权限，可根据公司的具体需求调整。', 0, 0);
+
+-- ----------------------------
+-- Table structure for oa_template
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_template`;
+CREATE TABLE `oa_template`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(255) NOT NULL DEFAULT '' COMMENT '消息模板名称',
+  `name` varchar(255) NOT NULL DEFAULT '' COMMENT '权限标识唯一，字母',
+  `types` tinyint(1) NOT NULL DEFAULT 1 COMMENT '类型:1普通消息,2审批消息',
+  `check_types` int(11) NOT NULL DEFAULT 0 COMMENT '审批类型:0',
+  `remark` varchar(500) NOT NULL DEFAULT '' COMMENT '备注描述，使用场景等',
+  `msg_link` varchar(255) NOT NULL DEFAULT '' COMMENT '消息模板链接(审批申请)',
+  `msg_title_0` varchar(255) NOT NULL DEFAULT '' COMMENT '消息模板标题(审批申请)',
+  `msg_content_0` varchar(500) NOT NULL DEFAULT '' COMMENT '消息模板内容(审批申请)',
+  `msg_title_1` varchar(255) NOT NULL DEFAULT '' COMMENT '消息模板标题(审批通过)',
+  `msg_content_1` varchar(500) NOT NULL DEFAULT '' COMMENT '消息模板内容(审批通过)',
+  `msg_title_2` varchar(255) NOT NULL DEFAULT '' COMMENT '消息模板标题(审批拒绝)',
+  `msg_content_2` varchar(500) NOT NULL DEFAULT '' COMMENT '消息模板内容(审批拒绝)',
+  `email_link` varchar(255) NOT NULL DEFAULT '' COMMENT '邮箱消息模板链接',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `admin_id` int(11) NOT NULL DEFAULT 0 COMMENT  '创建人',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '消息模板表';
+
+-- ----------------------------
+-- Records of oa_template
+-- ----------------------------
+INSERT INTO `oa_template` VALUES (1, '公告通知', 'note', 1, 0, '', '/adm/note/view/id/{action_id}', '{from_user}发了一个新『公告』，请及时查看', '您有一个新公告：{title}。', '', '', '', '', '', 1, 1, 1733312491, 1733314809, 0);
+INSERT INTO `oa_template` VALUES (2, '请假审批', 'leaves', 2, 0, '', '/home/leaves/view/id/{action_id}', '{from_user}提交了一个『请假申请』，请及时审批', '您有一个新的『请假申请』需要处理。', '您提交的『请假申请』已被审批通过。', '您在{create_time}提交的『请假申请』已于{date}被审批通过。', '您提交的『请假申请』已被驳回拒绝。', '您在{create_time}提交的『请假申请』已于{date}被驳回拒绝。', '', 1, 1, 1733312616, 1733314814, 0);
+INSERT INTO `oa_template` VALUES (3, '出差审批', 'trips', 2, 0, '', '/home/trips/view/id/{action_id}', '{from_user}提交了一个『出差申请』，请及时审批', '您有一个新的『出差申请』需要处理。', '您提交的『出差申请』已被审批通过。', '您在{create_time}提交的『出差申请』已于{date}被审批通过。', '您提交的『出差申请』已被驳回拒绝。', '您在{create_time}提交的『出差申请』已于{date}被驳回拒绝。', '', 1, 1, 1733312725, 1733314819, 0);
+INSERT INTO `oa_template` VALUES (4, '外出审批', 'outs', 2, 0, '', '/home/outs/view/id/{action_id}', '{from_user}提交了一个『外出申请』，请及时审批', '您有一个新的『外出申请』需要处理。', '您提交的『外出申请』已被审批通过。', '您在{create_time}提交的『外出申请』已于{date}被审批通过。', '您提交的『外出申请』已被驳回拒绝。', '您在{create_time}提交的『外出申请』已于{date}被驳回拒绝。', '', 1, 1, 1733312801, 1733314824, 0);
+INSERT INTO `oa_template` VALUES (5, '加班审批', 'overtimes', 2, 0, '', '/home/overtimes/view/id/{action_id}', '{from_user}提交了一个『加班申请』，请及时审批', '您有一个新的『加班申请』需要处理。', '您提交的『加班申请』已被审批通过。', '您在{create_time}提交的『加班申请』已于{date}被审批通过。', '您提交的『加班申请』已被驳回拒绝。', '您在{create_time}提交的『加班申请』已于{date}被驳回拒绝。', '', 1, 1, 1733312801, 1733314828, 0);
+INSERT INTO `oa_template` VALUES (6, '用章审批', 'seal', 2, 0, '', '/adm/seal/view/id/{action_id}', '{from_user}提交了一个『用章申请』，请及时审批', '您有一个新的『用章申请』需要处理。', '您提交的『公文申请』已被审批通过。', '您在{create_time}提交的『公文申请』已于{date}被审批通过。', '您提交的『用章申请』已被驳回拒绝。', '您在{create_time}提交的『用章申请』已于{date}被驳回拒绝。', '', 1, 1, 1733313018, 1733314834, 0);
+INSERT INTO `oa_template` VALUES (7, '公文审批', 'official', 2, 0, '', '/adm/official/view/id/{action_id}', '{from_user}提交了一个『公文申请』，请及时审批', '您有一个新的『公文申请』需要处理。', '您提交的『公文申请』已被审批通过', '您在{create_time}提交的『公文申请』已于{date}被审批通过。', '您提交的『公文申请』已被驳回拒绝', '您在{create_time}提交的『公文申请』已于{date}被驳回拒绝。', '', 1, 1, 1733313078, 1733313262, 0);
+INSERT INTO `oa_template` VALUES (8, '报销审批', 'expense', 2, 0, '', '/finance/expense/view/id/{action_id}', '{from_user}提交了一个『报销申请』，请及时审批', '您有一个新的『报销申请』需要处理。', '您提交的『报销申请』已被审批通过', '您在{create_time}提交的『报销申请』已于{date}被审批通过。', '您提交的『报销申请』已被驳回拒绝', '您在{create_time}提交的『报销申请』已于{date}被驳回拒绝。', '', 1, 1, 1733313169, 1733313253, 0);
+INSERT INTO `oa_template` VALUES (9, '发票审批', 'invoice', 2, 0, '', '/finance/invoice/view/id/{action_id}', '{from_user}提交了一个『发票申请』，请及时审批', '您有一个新的『发票申请』需要处理。', '您提交的『发票申请』已被审批通过', '您在{create_time}提交的『发票申请』已于{date}被审批通过。', '您提交的『发票申请』已被驳回拒绝', '您在{create_time}提交的『发票申请』已于{date}被驳回拒绝。', '', 1, 1, 1733313245, 0, 0);
+INSERT INTO `oa_template` VALUES (10, '收票审批', 'ticket', 2, 0, '', '/finance/ticket/view/id/{action_id}', '{from_user}提交了一个『收票申请』，请及时审批', '您有一个新的『收票申请』需要处理。', '您提交的『收票申请』已被审批通过', '您在{create_time}提交的『收票申请』已于{date}被审批通过。', '您提交的『收票申请』已被驳回拒绝', '您在{create_time}提交的『收票申请』已于{date}被驳回拒绝。', '', 1, 1, 1733313341, 0, 0);
+INSERT INTO `oa_template` VALUES (11, '无发票回款审批', 'invoicea', 2, 0, '', '/finance/invoice/view_a/id/{action_id}', '{from_user}提交了一个『无发票回款申请』，请及时审批', '您有一个新的『无发票回款申请』需要处理。', '您提交的『无发票回款申请』已被审批通过', '您在{create_time}提交的『无发票回款申请』已于{date}被审批通过。', '您提交的『无发票回款申请』已被驳回拒绝', '您在{create_time}提交的『无发票回款申请』已于{date}被驳回拒绝。', '', 1, 1, 1733314549, 0, 0);
+INSERT INTO `oa_template` VALUES (12, '无发票付款审批', 'ticketa', 2, 0, '', '/finance/ticket/view_a/id/{action_id}', '{from_user}提交了一个『无发票付款申请』，请及时审批', '您有一个新的『无发票付款申请』需要处理。', '您提交的『无发票付款申请』已被审批通过', '您在{create_time}提交的『无发票付款申请』已于{date}被审批通过。', '您提交的『无发票付款申请』已被驳回拒绝', '您在{create_time}提交的『无发票付款申请』已于{date}被驳回拒绝。', '', 1, 1, 1733314607, 0, 0);
+INSERT INTO `oa_template` VALUES (13, '销售合同审批', 'contract', 2, 0, '', '/contract/contract/view/id/{action_id}', '{from_user}提交了一个『销售合同审批』，请及时审批', '您有一个新的『销售合同审批』需要处理。', '您提交的『销售合同审批』已被审批通过', '您在{create_time}提交的『销售合同审批』已于{date}被审批通过。', '您提交的『销售合同审批』已被驳回拒绝', '您在{create_time}提交的『销售合同审批』已于{date}被驳回拒绝。', '', 1, 1, 1733314701, 0, 0);
+INSERT INTO `oa_template` VALUES (14, '采购合同审批', 'purchase', 2, 0, '', '/contract/purchase/view/id/{action_id}', '{from_user}提交了一个『采购合同审批』，请及时审批', '您有一个新的『采购合同审批』需要处理。', '您提交的『采购合同审批』已被审批通过', '您在{create_time}提交的『采购合同审批』已于{date}被审批通过。', '您提交的『采购合同审批』已被驳回拒绝', '您在{create_time}提交的『采购合同审批』已于{date}被驳回拒绝。', '', 1, 1, 1733314789, 0, 0);
+
+-- ----------------------------
+-- Table structure for oa_flow_cate
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_flow_cate`;
+CREATE TABLE `oa_flow_cate`  (
+  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `title` varchar(100) NOT NULL DEFAULT '' COMMENT '审批类型名称',
+  `name` varchar(100) NOT NULL COMMENT '审批类型标识,唯一',
+  `module_id` int(11) NOT NULL DEFAULT 0 COMMENT '关联审批模块id',
+  `check_table` varchar(100) NOT NULL DEFAULT '' COMMENT '关联数据库表名',
+  `icon` varchar(255) NOT NULL DEFAULT '' COMMENT '图标',
+  `department_ids` varchar(255) NOT NULL DEFAULT '' COMMENT '应用部门ID（空为全部）1,2,3',
+  `sort` int(11) NOT NULL DEFAULT 0 COMMENT '排序：越大越靠前',
+  `form` tinyint(1) NOT NULL DEFAULT 1 COMMENT '预设字段，表单模式：1固定表单,2自定义表单',
+  `add_url` varchar(255) NOT NULL DEFAULT '' COMMENT '新建链接：固定表单模式必填',
+  `view_url` varchar(255) NOT NULL DEFAULT '' COMMENT '查看链接：固定表单模式必填',
+  `form_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '表单id：自定义表单模式必填',
+  `is_list` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否列表页显示：0不显示 1显示',
+  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态：-1删除 0禁用 1启用',
+  `template_id` int(11) NOT NULL DEFAULT 0 COMMENT '审批消息模板id',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '审批类型';
+
+-- ----------------------------
+-- Records of oa_flow_cate
+-- ----------------------------
+INSERT INTO `oa_flow_cate` VALUES (1, '请假', 'leaves', 1, 'leaves', 'icon-kechengziyuanguanli', '', 0, 1, '/home/leaves/add', '/home/leaves/view', 0, 1, 1, 2, 1723604674, 0);
+INSERT INTO `oa_flow_cate` VALUES (2, '出差', 'trips', 1, 'trips', 'icon-jiaoshiguanli', '', 0, 1, '/home/trips/add', '/home/trips/view', 0, 1, 1, 3, 1723799422, 1724138037);
+INSERT INTO `oa_flow_cate` VALUES (3, '外出', 'outs', 1, 'outs', 'icon-tuiguangguanli', '', 0, 1, '/home/outs/add', '/home/outs/view', 0, 1, 1, 4,1723800336, 1724138021);
+INSERT INTO `oa_flow_cate` VALUES (4, '加班', 'overtimes', 1, 'overtimes', 'icon-xueshengchengji', '', 0, 1, '/home/overtimes/add', '/home/overtimes/view', 0, 1, 1, 5, 1723800393, 1724138004);
+INSERT INTO `oa_flow_cate` VALUES (5, '用章', 'seal', 2, 'seal', 'icon-shenpishezhi', '', 0, 1, '/adm/seal/add', '/adm/seal/view', 0, 1, 1, 6, 1723469451, 1724138203);
+INSERT INTO `oa_flow_cate` VALUES (6, '公文', 'official_docs', 2, 'official_docs', 'icon-lunwenguanli', '', 0, 1, '/adm/official/add', '/adm/official/view', 0, 1, 1, 7, 1723469614, 1724138182);
+INSERT INTO `oa_flow_cate` VALUES (7, '报销', 'expense', 4, 'expense', 'icon-jizhang', '', 0, 1, '/finance/expense/add', '/finance/expense/view', 0, 1, 1, 8, 1723469732, 1724138154);
+INSERT INTO `oa_flow_cate` VALUES (8, '发票', 'invoice', 4, 'invoice', 'icon-duizhangdan', '', 0, 1, '/finance/invoice/add', '/finance/invoice/view', 0, 1, 1, 9,1723469814, 1724138127);
+INSERT INTO `oa_flow_cate` VALUES (9, '收票', 'ticket', 4, 'ticket', 'icon-yingjiaoqingdan', '', 0, 1, '/finance/ticket/add', '/finance/ticket/view', 0, 1, 1, 10, 1724749856, 1724828690);
+INSERT INTO `oa_flow_cate` VALUES (10, '无发票回款', 'invoicea', 4, 'invoice', 'icon-shoufeipeizhi', '', 0, 1, '/finance/invoice/add_a', '/finance/invoice/view_a', 0, 1, 1, 11,1725856435, 1725935194);
+INSERT INTO `oa_flow_cate` VALUES (11, '无发票付款', 'ticketa', 4, 'ticket', 'icon-bulujiesuan', '', 0, 1, '/finance/ticket/add_a', '/finance/ticket/view_a', 0, 1, 1, 12,1725856613, 1725935703);
+INSERT INTO `oa_flow_cate` VALUES (12, '销售合同', 'contract', 3, 'contract', 'icon-hetongguanli', '', 0, 1, '/contract/contract/add', '/contract/contract/view', 0, 0, 1, 13,1723469917, 1724828537);
+INSERT INTO `oa_flow_cate` VALUES (13, '采购合同', 'purchase', 3, 'purchase', 'icon-dianshang', '', 0, 1, '/contract/purchase/add', '/contract/purchase/view', 0, 0, 1, 14,1723470017, 1724828575);
+
+-- ----------------------------
+-- Table structure for oa_flow
+-- ----------------------------
+DROP TABLE IF EXISTS `oa_flow`;
+CREATE TABLE `oa_flow`  (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `title` varchar(50) NOT NULL DEFAULT '' COMMENT '审批流程名称',
+  `cate_id` tinyint(11) NOT NULL DEFAULT 0 COMMENT '关联审批类型id',
+  `check_type` tinyint(4) NOT NULL COMMENT '1自由审批流,2固定审批流,3固定可回退的审批流,4固定条件审批流',
+  `department_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '应用部门ID（0为全部）1,2,3',
+  `copy_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '抄送人ID',
+  `flow_list` varchar(1000) NULL DEFAULT '' COMMENT '流程数据序列化',
+  `status` tinyint(4) NOT NULL DEFAULT 1 COMMENT '状态 1启用，0禁用',
+  `remark` varchar(500) NOT NULL DEFAULT '' COMMENT '流程说明',
+  `admin_id` int(11) NOT NULL COMMENT '创建人ID',
+  `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '审批流程表';
+
+-- ----------------------------
+-- Records of oa_flow_cate
+-- ----------------------------
+INSERT INTO `oa_flow` VALUES (1, '请假审批', 1, 1, '', '', '', 1, '', 1, 1723791655, 0, 0);
+INSERT INTO `oa_flow` VALUES (2, '出差审批', 2, 1, '', '', '', 1, '', 1, 1723799665, 0, 0);
+INSERT INTO `oa_flow` VALUES (3, '外出审批', 3, 1, '', '', '', 1, '', 1, 1723800434, 0, 0);
+INSERT INTO `oa_flow` VALUES (4, '加班审批', 4, 1, '', '', '', 1, '', 1, 1723800446, 0, 0);
+INSERT INTO `oa_flow` VALUES (5, '用章审批', 5, 1, '', '', '', 1, '', 1, 1723470400, 0, 0);
+INSERT INTO `oa_flow` VALUES (6, '公文审批', 6, 1, '', '', '', 1, '', 1, 1723470419, 0, 0);
+INSERT INTO `oa_flow` VALUES (7, '报销审批', 7, 1, '', '', '', 1, '', 1, 1723470468, 0, 0);
+INSERT INTO `oa_flow` VALUES (8, '发票审批', 8, 1, '', '', '', 1, '', 1, 1723470482, 0, 0);
+INSERT INTO `oa_flow` VALUES (9, '收票审批', 9, 1, '', '', '', 1, '', 1, 1723470482, 0, 0);
+INSERT INTO `oa_flow` VALUES (10, '无发票回款', 10, 1, '', '', '', 1, '', 1, 1725935073, 0, 0);
+INSERT INTO `oa_flow` VALUES (11, '无发票付款', 11, 1, '', '', '', 1, '', 1, 1725935159, 1725935232, 0);
+INSERT INTO `oa_flow` VALUES (12, '销售合同审批', 12, 1, '', '', '', 1, '', 1, 1723470490, 0, 0);
+INSERT INTO `oa_flow` VALUES (13, '采购合同审批', 13, 1, '', '', '', 1, '', 1, 1723470501, 0, 0);
\ No newline at end of file
diff --git "a/update_sql/v5.5\345\215\207\347\272\247\345\210\260v5.6.sql" "b/update_sql/v5.5\345\215\207\347\272\247\345\210\260v5.6.sql"
new file mode 100644
index 0000000000000000000000000000000000000000..5cbfebe683826bee4ab4059ef21badff388f91b4
--- /dev/null
+++ "b/update_sql/v5.5\345\215\207\347\272\247\345\210\260v5.6.sql"
@@ -0,0 +1,5 @@
+ALTER TABLE `oa_expense` 
+ADD COLUMN `subject_id` int(11)  NOT NULL DEFAULT 0 COMMENT '报销企业主体' AFTER `id`;
+
+ALTER TABLE `oa_ticket` 
+ADD COLUMN `cash_type` int(11) UNSIGNED NULL DEFAULT 1 COMMENT '付款类型：1银行,2支付宝,3微信,4现金,5汇票,6支票,7托收,8其他' AFTER `pay_amount`;
\ No newline at end of file
diff --git a/vendor/.gitignore b/vendor/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..c96a04f008ee21e260b28f7701595ed59e2839e3
--- /dev/null
+++ b/vendor/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
\ No newline at end of file
